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,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./mermaid-runtime-C4a7TrTS.js","./preload-helper-Bo9GmnuQ.js","./chunk-PU5JKC2W-t0zUh6E3.js","./src-E3c2cohN.js","./chunk-DpHwWhuW.js","./chunk-GEFDOKGD-DYHmaq-c.js","./dist-CsYRf4AV.js","./math-BaavbII8.js","./chunk-7R4GIKGN-BMrp52Pk.js","./isArrayLikeObject-Cmt1CYnI.js","./isEmpty-C7iPDOO3.js","./chunk-GLR3WWYH-CQ1LryrI.js","./chunk-KYZI473N-D4r5eMJZ.js","./chunk-PQ6SQG4A-BY9_Srs_.js","./chunk-YBOYWFTD-CzyyfGQX.js","./rough.esm-jZQkcmER.js","./chunk-O4XLMI2P-DaS3COAu.js","./line-D57TbKb7.js","./path-BUmMWM1-.js","./array-DwdVlTkF.js","./chunk-MX3YWQON-DqN0TF5Q.js","./chunk-HHEYEP7N-DOQ0PCdH.js","./chunk-XPW4576I-C0GpOUHf.js","./preview-render-compiler-TmHpBDlh.js","./preview-render-compiler-aYpnXmNm.js","./preview-render-profile-DPzmho7I.js","./vault-utils-BW53lKl1.js","./editor-session-C9l9XwVg.js","./dist-DIi0uqLJ.js","./dist-DWJL3_bF.js","./dist-xO1ImhKz.js","./dist-D5QOYy7y.js","./dist-CxfohGIV.js","./dist-B-02vKOA.js","./dist-O1z0Ayg0.js","./dist-E_jPb93e.js","./yjs-provider-reset-guard-DWGhQClh.js","./room-COWSP--i.js","./runtime-config-CqX_f_Q4.js","./quick-switcher-controller-DplOTsT3.js"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r as i}from"./preview-render-profile-DPzmho7I.js";import{_ as a,a as o,c as s,d as c,f as l,g as u,h as d,i as f,l as p,m,n as h,o as g,p as _,s as v,t as y,u as b}from"./vault-utils-BW53lKl1.js";import{n as x,t as S}from"./vault-api-client-DIaCC56H.js";import{a as C,c as w,d as T,f as E,i as ee,l as D,n as O,o as k,r as A,s as j,t as M,u as te}from"./runtime-config-CqX_f_Q4.js";import{n as N,r as P,t as ne}from"./yjs-provider-reset-guard-DWGhQClh.js";import{r as re}from"./drawio-room-C592VDk7.js";import{a as ie,c as F,d as ae,f as oe,h as I,i as se,l as ce,m as le,n as L,o as ue,p as de,r as fe,s as pe,t as R,u as me}from"./preview-diagram-utils-Dc83ucbv.js";import{l as he,n as ge,r as _e,t as ve}from"./room-COWSP--i.js";var ye={edit:`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./mermaid-runtime-Bn8A6DGx.js","./preload-helper-Bo9GmnuQ.js","./chunk-PU5JKC2W-D_6N6t8f.js","./src-Pgt9Gp65.js","./chunk-DpHwWhuW.js","./chunk-GEFDOKGD-Bs7FmFox.js","./dist-x7PIEmJu.js","./math-B-LMBwub.js","./chunk-7R4GIKGN-mqd2GwMg.js","./isArrayLikeObject-BId_dPHM.js","./isEmpty-CVvRj8fj.js","./chunk-GLR3WWYH-qQe2O5VQ.js","./chunk-KYZI473N-CTSCuqRb.js","./chunk-PQ6SQG4A-D1AbThjy.js","./chunk-YBOYWFTD-CKg4ymFF.js","./rough.esm-DE_lJ5Ge.js","./chunk-O4XLMI2P-CcVxZh41.js","./line-B2GMovaI.js","./path-DIlZIGue.js","./array-B3agRrCs.js","./chunk-MX3YWQON-DQpSwRf6.js","./chunk-HHEYEP7N-DlevL8bq.js","./chunk-XPW4576I-DJr4_4Yy.js","./preview-render-compiler-Duy_3IcP.js","./preview-render-compiler-BjLlHmiQ.js","./preview-render-profile-CR4dJZrp.js","./vault-utils-5Xr0MXCb.js","./file-kind-DBptLlF_.js","./editor-session-BKHEYkbY.js","./dist-DIi0uqLJ.js","./dist-DWJL3_bF.js","./dist-BU8uusJX.js","./dist-D5QOYy7y.js","./dist-CxfohGIV.js","./dist-B-02vKOA.js","./dist-O1z0Ayg0.js","./dist-E_jPb93e.js","./dist-B4uQVR_X.js","./yjs-provider-reset-guard-CtERLBID.js","./room-yJaBAoEU.js","./runtime-config-CqhchMC4.js","./quick-switcher-controller-DcyllYpm.js"])))=>i.map(i=>d[i]);
2
+ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r as i}from"./preview-render-profile-CR4dJZrp.js";import{a,c as o,d as s,f as c,i as l,l as u,m as d,n as f,o as p,p as m,r as h,s as g,t as _,u as v}from"./file-kind-DBptLlF_.js";import{i as y,n as b,t as x}from"./vault-utils-5Xr0MXCb.js";import{n as ee,t as S}from"./vault-api-client-BzHQseMN.js";import{a as C,c as w,d as T,f as E,i as D,l as O,n as k,o as A,r as j,s as M,t as te,u as N}from"./runtime-config-CqhchMC4.js";import{n as P,r as ne,t as re}from"./yjs-provider-reset-guard-CtERLBID.js";import{r as ie}from"./drawio-room-DEivFyNV.js";import{a as ae,c as F,d as oe,f as se,h as I,i as ce,l as le,m as ue,n as L,o as de,p as fe,r as pe,s as me,t as R,u as he}from"./preview-diagram-utils-COt-IYMD.js";import{l as ge,n as _e,r as ve,t as ye}from"./room-yJaBAoEU.js";var be={edit:`
3
3
  <svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">
4
4
  <path d="M11.8 1.8a1.5 1.5 0 0 1 2.1 2.1l-7.2 7.2-3.2.9.9-3.2z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
5
5
  <path d="M10.7 2.9l2.4 2.4" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
@@ -18,19 +18,20 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
18
18
  <path d="M6 5V2H2M10 5V2h4M10 11v3h4M6 11v3H2" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
19
19
  <path d="M4.5 4.5h7v7h-7z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.4"/>
20
20
  </svg>
21
- `};function z(e,t){if(!(e instanceof HTMLElement))return;let n=ye[t];if(!n){e.classList.remove(`is-icon-only`);return}e.classList.add(`is-icon-only`),e.dataset.icon=t,e.innerHTML=n.trim()}function be(e){return`data-${e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}`}var xe=class{constructor(e,{batchSize:t,datasetKeys:n,fetchFn:r=(...e)=>fetch(...e),filePathLabel:i,requestIdleRenderFn:a=oe,cancelIdleRenderFn:o=fe,intersectionObserverFactory:s=(e,t)=>new IntersectionObserver(e,t),isNearViewportFn:c=me,requestAnimationFrameFn:l=e=>requestAnimationFrame(e),shellClassName:u,sourceClassName:d}){this.renderer=e,this.batchSize=t,this.datasetKeys=n,this.fetchFn=r,this.filePathLabel=i,this.requestIdleRenderFn=a,this.cancelIdleRenderFn=o,this.intersectionObserverFactory=s,this.isNearViewportFn=c,this.requestAnimationFrameFn=l,this.shellClassName=u,this.sourceClassName=d,this.shellSelector=`.${u}`,this.sourceSelector=`.${d}`,this.attributeNames=Object.fromEntries(Object.entries(n).map(([e,t])=>[e,be(t)])),this.observer=null,this.idleId=null,this.pendingShells=[],this.hydrationInProgress=!1,this.instanceCounter=0,this.preservedShells=new Map,this.fileInflightRequests=new Map}destroy(){this.cancelHydration(),this.preservedShells.clear()}cancelHydration(){this.observer&&=(this.observer.disconnect(),null),this.cancelIdleRenderFn(this.idleId),this.idleId=null,this.pendingShells=[],this.hydrationInProgress=!1}cancelPendingIdleWork(){this.cancelIdleRenderFn(this.idleId),this.idleId=null}clearPreservedShells(){this.preservedShells.clear()}hasPendingWork(){return this.hydrationInProgress||this.pendingShells.length>0}preserveHydratedShellsForCommit(){this.preservedShells.clear();let e=this.renderer.previewElement;e&&Array.from(e.querySelectorAll(`${this.shellSelector}[${this.attributeNames.hydrated}="true"][${this.attributeNames.key}]`)).forEach(e=>{let t=e.dataset[this.datasetKeys.key],n=e.querySelector(this.sourceSelector)?.textContent??``,r=e.dataset[this.datasetKeys.target]??``;!t||!n&&!r||(e.isConnected&&e.remove(),this.preservedShells.set(t,{key:t,shell:e,source:n,target:r}))})}reconcileHydratedShells(){let e=this.renderer.previewElement;if(!e||this.preservedShells.size===0){this.preservedShells.clear();return}let t=!1;Array.from(e.querySelectorAll(`${this.shellSelector}[${this.attributeNames.key}]`)).forEach(e=>{let n=e.dataset[this.datasetKeys.key],r=n?this.preservedShells.get(n):null;r&&le({nextSource:e.querySelector(this.sourceSelector)?.textContent??``,nextTarget:e.dataset[this.datasetKeys.target]??``,preservedSource:r.source,preservedTarget:r.target})&&(this.syncPreservedShell(r.shell,e),e.replaceWith(r.shell),t||=r.shell.classList.contains(`is-maximized`),this.preservedShells.delete(n))}),this.preservedShells.clear(),this.handleReconcile({restoredMaximizedShell:t})}handleReconcile(){}syncPreservedShell(e,t){I(e,t,this.attributeNames.sourceLine),I(e,t,this.attributeNames.sourceLineEnd),I(e,t,this.attributeNames.key),I(e,t,this.attributeNames.target),I(e,t,this.attributeNames.label),I(e,t,this.attributeNames.sourceHash),e.classList.add(this.shellClassName),e.dataset[this.datasetKeys.hydrated]=`true`,this.removeDatasetValue(e,`queued`);let n=t.querySelector(this.sourceSelector),r=e.querySelector(this.sourceSelector);if(!r&&n&&(r=n.cloneNode(!0),e.prepend(r)),r&&n){let e=n.textContent??``;(e||!t.dataset[this.datasetKeys.target])&&(r.textContent=e),r.hidden=!0}}setupHydration(e){let t=this.renderer.previewElement,n=this.renderer.previewContainer;if(!t||!n)return 0;let r=Array.from(t.querySelectorAll(this.shellSelector));return r.length===0?0:(this.observer=this.intersectionObserverFactory(e=>{e.forEach(e=>{e.isIntersecting&&this.enqueueShell(e.target)})},{root:n,rootMargin:this.renderer.isLargeDocument?`180px 0px`:`420px 0px`}),r.forEach(e=>this.observer.observe(e)),this.requestAnimationFrameFn(()=>{e===this.renderer.activeRenderVersion&&(this.hydrateVisibleShells(),this.renderer.updateHydrationPhase())}),r.length)}hydrateVisibleShells(){let e=this.renderer.previewElement,t=this.renderer.previewContainer;if(this.renderer.hydrationPaused||!e||!t)return;let n=this.renderer.isLargeDocument?180:420;Array.from(e.querySelectorAll(this.shellSelector)).forEach(e=>{this.isNearViewportFn(e,t,n)&&this.enqueueShell(e,{prioritize:!0})})}enqueueShell(e,{prioritize:t=!1}={}){!e?.isConnected||this.isShellHydrated(e)||this.isShellQueued(e)||(e.dataset[this.datasetKeys.queued]=`true`,t?this.pendingShells.unshift(e):this.pendingShells.push(e),!this.renderer.hydrationPaused&&(this.renderer.updateHydrationPhase(),this.scheduleHydration()))}scheduleHydration(){this.renderer.hydrationPaused||this.hydrationInProgress||this.idleId!==null||(this.idleId=this.requestIdleRenderFn(()=>{this.idleId=null,this.flushHydrationQueue()},500))}async flushHydrationQueue(){if(this.renderer.hydrationPaused||this.hydrationInProgress)return;let e=[];for(;this.pendingShells.length>0&&e.length<this.batchSize;){let t=this.pendingShells.shift();!t?.isConnected||this.isShellHydrated(t)||(this.removeDatasetValue(t,`queued`),e.push(t))}if(e.length===0){this.renderer.updateHydrationPhase();return}this.hydrationInProgress=!0,this.renderer.setPhase(`hydrating`);let t;try{t=await this.prepareHydrationBatch(e)}catch(t){this.handlePrepareHydrationBatchError(e,t),this.hydrationInProgress=!1,this.renderer.updateHydrationPhase();return}for(let n of e)await this.hydrateShell(n,t);this.hydrationInProgress=!1,this.pendingShells.length>0&&this.scheduleHydration(),this.renderer.updateHydrationPhase()}async prepareHydrationBatch(){return null}handlePrepareHydrationBatchError(e,t){}async hydrateShell(){throw Error(`hydrateShell must be implemented by subclasses`)}markShellHydrated(e){e.dataset[this.datasetKeys.hydrated]=`true`,e.dataset[this.datasetKeys.instanceId]=String(++this.instanceCounter)}isShellHydrated(e){return e?.dataset?.[this.datasetKeys.hydrated]===`true`}removeDatasetValue(e,t){let n=this.datasetKeys[t];!n||!e||(e.removeAttribute?.(this.attributeNames[t]),e.dataset&&delete e.dataset[n])}isShellQueued(e){return e?.dataset?.[this.datasetKeys.queued]===`true`}async fetchSource(e){let t=String(e??``).trim();if(!t)throw Error(`Missing ${this.filePathLabel} file path`);if(this.fileInflightRequests.has(t))return this.fileInflightRequests.get(t);let n=this.fetchFn(D(`/file?path=${encodeURIComponent(t)}`),{headers:{Accept:`application/json`}}).then(async e=>{let n=await e.json().catch(()=>null);if(!e.ok||typeof n?.content!=`string`)throw Error(n?.error||`Failed to load ${t}`);return n.content}).finally(()=>{this.fileInflightRequests.delete(t)});return this.fileInflightRequests.set(t,n),n}},Se=class extends xe{constructor(e){super(e,{batchSize:2,datasetKeys:{hydrated:`mermaidHydrated`,instanceId:`mermaidInstanceId`,key:`mermaidKey`,label:`mermaidLabel`,queued:`mermaidQueued`,sourceHash:`mermaidSourceHash`,sourceLine:`sourceLine`,sourceLineEnd:`sourceLineEnd`,target:`mermaidTarget`},filePathLabel:`Mermaid`,shellClassName:`mermaid-shell`,sourceClassName:`mermaid-source`}),this.renderer=e,this.currentTheme=document.documentElement?.dataset.theme===`light`?`light`:`dark`,this.loader=null,this.runtime=null,this.shellRefits=new WeakMap}applyTheme(e){this.currentTheme=e;let t=this.runtime;t&&(this.configureMermaid(t),this.resetHydratedShells())}configureMermaid(e){e.initialize({startOnLoad:!1,flowchart:{defaultRenderer:`dagre-wrapper`,useMaxWidth:!0},class:{defaultRenderer:`dagre-wrapper`,useMaxWidth:!0},theme:this.currentTheme===`dark`?`dark`:`default`,themeVariables:this.currentTheme===`dark`?{background:`#161822`,clusterBkg:`#1a1c28`,edgeLabelBackground:`#161822`,lineColor:`#8b8ba0`,mainBkg:`#1c1e2c`,nodeBorder:`#383a50`,primaryBorderColor:`#383a50`,primaryColor:`#818cf8`,primaryTextColor:`#e2e2ea`,secondaryColor:`#1c1e2c`,tertiaryColor:`#161822`,titleColor:`#e2e2ea`}:{}})}ensureMermaid(){return this.runtime?(this.configureMermaid(this.runtime),Promise.resolve(this.runtime)):(this.loader||=e(()=>import(`./mermaid-runtime-C4a7TrTS.js`).then(e=>{let t=e?.default;if(!t)throw Error(`Mermaid runtime failed to initialize`);return this.runtime=t,this.configureMermaid(t),t}),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]),import.meta.url).catch(e=>{throw this.loader=null,this.runtime=null,Error(e instanceof Error?e.message:`Failed to load Mermaid runtime`)}),this.loader)}handleReconcile({restoredMaximizedShell:e}){e&&document.body.classList.add(`mermaid-maximized-open`)}async prepareHydrationBatch(){return this.ensureMermaid()}handlePrepareHydrationBatchError(e,t){console.warn(`[preview] Mermaid runtime failed to load:`,t)}async hydrateShell(e,t){if(!t||!e?.isConnected||this.isShellHydrated(e))return;let n=e.querySelector(`.mermaid-source`);n||(n=document.createElement(`span`),n.className=`mermaid-source`,n.hidden=!0,e.appendChild(n));let r=n.textContent??``;try{if(!r.trim()&&e.dataset.mermaidTarget){if(r=await this.fetchSource(e.dataset.mermaidTarget),!e.isConnected)return;n.textContent=r}if(!r.trim())throw Error(e.dataset.mermaidTarget?`Mermaid file is empty`:`Mermaid source is empty`);r=this.prepareSource(r),e.querySelector(`.mermaid-placeholder-card`)?.remove();let i=document.createElement(`div`);i.className=`mermaid mermaid-render-node`,i.id=e.dataset.mermaidKey||`mermaid-${Date.now()}`;let a=e.getAttribute(`data-source-line`),o=e.getAttribute(`data-source-line-end`);if(a&&i.setAttribute(`data-source-line`,a),o&&i.setAttribute(`data-source-line-end`,o),i.textContent=r,e.appendChild(i),await t.run({nodes:[i]}),!i.isConnected||e!==i.parentElement)return;this.enhanceDiagram(e,i),this.markShellHydrated(e)}catch(t){console.warn(`[preview] Mermaid render failed:`,t),e.querySelector(`:scope > .mermaid-toolbar`)?.remove(),e.querySelector(`:scope > .mermaid-frame`)?.remove(),e.querySelector(`:scope > .mermaid-render-node`)?.remove(),e.querySelector(`.mermaid-placeholder-card`)||n?.after(ie(e.dataset.mermaidKey||`mermaid`,{label:e.dataset.mermaidLabel||`Mermaid diagram`,message:t instanceof Error?t.message:`Render failed`}))}}prepareSource(e){let t=String(e??``);if(!/%%\{[\s\S]*?\binit\s*:/m.test(t)){let e=this.getPreviewInitConfig(t);e&&(t=`%%{init: ${JSON.stringify(e)}}%%\n${t}`)}if(!/^\s*gantt\b/m.test(t)||/\btodayMarker\b/.test(t))return t;let n=t.split(`
21
+ `};function z(e,t){if(!(e instanceof HTMLElement))return;let n=be[t];if(!n){e.classList.remove(`is-icon-only`);return}e.classList.add(`is-icon-only`),e.dataset.icon=t,e.innerHTML=n.trim()}function xe(e){return`data-${e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}`}var Se=class{constructor(e,{batchSize:t,datasetKeys:n,fetchFn:r=(...e)=>fetch(...e),filePathLabel:i,requestIdleRenderFn:a=se,cancelIdleRenderFn:o=pe,intersectionObserverFactory:s=(e,t)=>new IntersectionObserver(e,t),isNearViewportFn:c=he,requestAnimationFrameFn:l=e=>requestAnimationFrame(e),shellClassName:u,sourceClassName:d}){this.renderer=e,this.batchSize=t,this.datasetKeys=n,this.fetchFn=r,this.filePathLabel=i,this.requestIdleRenderFn=a,this.cancelIdleRenderFn=o,this.intersectionObserverFactory=s,this.isNearViewportFn=c,this.requestAnimationFrameFn=l,this.shellClassName=u,this.sourceClassName=d,this.shellSelector=`.${u}`,this.sourceSelector=`.${d}`,this.attributeNames=Object.fromEntries(Object.entries(n).map(([e,t])=>[e,xe(t)])),this.observer=null,this.idleId=null,this.pendingShells=[],this.hydrationInProgress=!1,this.instanceCounter=0,this.preservedShells=new Map,this.fileInflightRequests=new Map}destroy(){this.cancelHydration(),this.preservedShells.clear()}cancelHydration(){this.observer&&=(this.observer.disconnect(),null),this.cancelIdleRenderFn(this.idleId),this.idleId=null,this.pendingShells=[],this.hydrationInProgress=!1}cancelPendingIdleWork(){this.cancelIdleRenderFn(this.idleId),this.idleId=null}clearPreservedShells(){this.preservedShells.clear()}hasPendingWork(){return this.hydrationInProgress||this.pendingShells.length>0}preserveHydratedShellsForCommit(){this.preservedShells.clear();let e=this.renderer.previewElement;e&&Array.from(e.querySelectorAll(`${this.shellSelector}[${this.attributeNames.hydrated}="true"][${this.attributeNames.key}]`)).forEach(e=>{let t=e.dataset[this.datasetKeys.key],n=e.querySelector(this.sourceSelector)?.textContent??``,r=e.dataset[this.datasetKeys.target]??``;!t||!n&&!r||(e.isConnected&&e.remove(),this.preservedShells.set(t,{key:t,shell:e,source:n,target:r}))})}reconcileHydratedShells(){let e=this.renderer.previewElement;if(!e||this.preservedShells.size===0){this.preservedShells.clear();return}let t=!1;Array.from(e.querySelectorAll(`${this.shellSelector}[${this.attributeNames.key}]`)).forEach(e=>{let n=e.dataset[this.datasetKeys.key],r=n?this.preservedShells.get(n):null;r&&ue({nextSource:e.querySelector(this.sourceSelector)?.textContent??``,nextTarget:e.dataset[this.datasetKeys.target]??``,preservedSource:r.source,preservedTarget:r.target})&&(this.syncPreservedShell(r.shell,e),e.replaceWith(r.shell),t||=r.shell.classList.contains(`is-maximized`),this.preservedShells.delete(n))}),this.preservedShells.clear(),this.handleReconcile({restoredMaximizedShell:t})}handleReconcile(){}syncPreservedShell(e,t){I(e,t,this.attributeNames.sourceLine),I(e,t,this.attributeNames.sourceLineEnd),I(e,t,this.attributeNames.key),I(e,t,this.attributeNames.target),I(e,t,this.attributeNames.label),I(e,t,this.attributeNames.sourceHash),e.classList.add(this.shellClassName),e.dataset[this.datasetKeys.hydrated]=`true`,this.removeDatasetValue(e,`queued`);let n=t.querySelector(this.sourceSelector),r=e.querySelector(this.sourceSelector);if(!r&&n&&(r=n.cloneNode(!0),e.prepend(r)),r&&n){let e=n.textContent??``;(e||!t.dataset[this.datasetKeys.target])&&(r.textContent=e),r.hidden=!0}}setupHydration(e){let t=this.renderer.previewElement,n=this.renderer.previewContainer;if(!t||!n)return 0;let r=Array.from(t.querySelectorAll(this.shellSelector));return r.length===0?0:(this.observer=this.intersectionObserverFactory(e=>{e.forEach(e=>{e.isIntersecting&&this.enqueueShell(e.target)})},{root:n,rootMargin:this.renderer.isLargeDocument?`180px 0px`:`420px 0px`}),r.forEach(e=>this.observer.observe(e)),this.requestAnimationFrameFn(()=>{e===this.renderer.activeRenderVersion&&(this.hydrateVisibleShells(),this.renderer.updateHydrationPhase())}),r.length)}hydrateVisibleShells(){let e=this.renderer.previewElement,t=this.renderer.previewContainer;if(this.renderer.hydrationPaused||!e||!t)return;let n=this.renderer.isLargeDocument?180:420;Array.from(e.querySelectorAll(this.shellSelector)).forEach(e=>{this.isNearViewportFn(e,t,n)&&this.enqueueShell(e,{prioritize:!0})})}enqueueShell(e,{prioritize:t=!1}={}){!e?.isConnected||this.isShellHydrated(e)||this.isShellQueued(e)||(e.dataset[this.datasetKeys.queued]=`true`,t?this.pendingShells.unshift(e):this.pendingShells.push(e),!this.renderer.hydrationPaused&&(this.renderer.updateHydrationPhase(),this.scheduleHydration()))}scheduleHydration(){this.renderer.hydrationPaused||this.hydrationInProgress||this.idleId!==null||(this.idleId=this.requestIdleRenderFn(()=>{this.idleId=null,this.flushHydrationQueue()},500))}async flushHydrationQueue(){if(this.renderer.hydrationPaused||this.hydrationInProgress)return;let e=[];for(;this.pendingShells.length>0&&e.length<this.batchSize;){let t=this.pendingShells.shift();!t?.isConnected||this.isShellHydrated(t)||(this.removeDatasetValue(t,`queued`),e.push(t))}if(e.length===0){this.renderer.updateHydrationPhase();return}this.hydrationInProgress=!0,this.renderer.setPhase(`hydrating`);let t;try{t=await this.prepareHydrationBatch(e)}catch(t){this.handlePrepareHydrationBatchError(e,t),this.hydrationInProgress=!1,this.renderer.updateHydrationPhase();return}for(let n of e)await this.hydrateShell(n,t);this.hydrationInProgress=!1,this.pendingShells.length>0&&this.scheduleHydration(),this.renderer.updateHydrationPhase()}async prepareHydrationBatch(){return null}handlePrepareHydrationBatchError(e,t){}async hydrateShell(){throw Error(`hydrateShell must be implemented by subclasses`)}markShellHydrated(e){e.dataset[this.datasetKeys.hydrated]=`true`,e.dataset[this.datasetKeys.instanceId]=String(++this.instanceCounter)}isShellHydrated(e){return e?.dataset?.[this.datasetKeys.hydrated]===`true`}removeDatasetValue(e,t){let n=this.datasetKeys[t];!n||!e||(e.removeAttribute?.(this.attributeNames[t]),e.dataset&&delete e.dataset[n])}isShellQueued(e){return e?.dataset?.[this.datasetKeys.queued]===`true`}async fetchSource(e){let t=String(e??``).trim();if(!t)throw Error(`Missing ${this.filePathLabel} file path`);if(this.fileInflightRequests.has(t))return this.fileInflightRequests.get(t);let n=this.fetchFn(O(`/file?path=${encodeURIComponent(t)}`),{headers:{Accept:`application/json`}}).then(async e=>{let n=await e.json().catch(()=>null);if(!e.ok||typeof n?.content!=`string`)throw Error(n?.error||`Failed to load ${t}`);return n.content}).finally(()=>{this.fileInflightRequests.delete(t)});return this.fileInflightRequests.set(t,n),n}},Ce=class extends Se{constructor(e){super(e,{batchSize:2,datasetKeys:{hydrated:`mermaidHydrated`,instanceId:`mermaidInstanceId`,key:`mermaidKey`,label:`mermaidLabel`,queued:`mermaidQueued`,sourceHash:`mermaidSourceHash`,sourceLine:`sourceLine`,sourceLineEnd:`sourceLineEnd`,target:`mermaidTarget`},filePathLabel:`Mermaid`,shellClassName:`mermaid-shell`,sourceClassName:`mermaid-source`}),this.renderer=e,this.currentTheme=document.documentElement?.dataset.theme===`light`?`light`:`dark`,this.loader=null,this.runtime=null,this.shellRefits=new WeakMap}applyTheme(e){this.currentTheme=e;let t=this.runtime;t&&(this.configureMermaid(t),this.resetHydratedShells())}configureMermaid(e){e.initialize({startOnLoad:!1,flowchart:{defaultRenderer:`dagre-wrapper`,useMaxWidth:!0},class:{defaultRenderer:`dagre-wrapper`,useMaxWidth:!0},theme:this.currentTheme===`dark`?`dark`:`default`,themeVariables:this.currentTheme===`dark`?{background:`#161822`,clusterBkg:`#1a1c28`,edgeLabelBackground:`#161822`,lineColor:`#8b8ba0`,mainBkg:`#1c1e2c`,nodeBorder:`#383a50`,primaryBorderColor:`#383a50`,primaryColor:`#818cf8`,primaryTextColor:`#e2e2ea`,secondaryColor:`#1c1e2c`,tertiaryColor:`#161822`,titleColor:`#e2e2ea`}:{}})}ensureMermaid(){return this.runtime?(this.configureMermaid(this.runtime),Promise.resolve(this.runtime)):(this.loader||=e(()=>import(`./mermaid-runtime-Bn8A6DGx.js`).then(e=>{let t=e?.default;if(!t)throw Error(`Mermaid runtime failed to initialize`);return this.runtime=t,this.configureMermaid(t),t}),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]),import.meta.url).catch(e=>{throw this.loader=null,this.runtime=null,Error(e instanceof Error?e.message:`Failed to load Mermaid runtime`)}),this.loader)}handleReconcile({restoredMaximizedShell:e}){e&&document.body.classList.add(`mermaid-maximized-open`)}async prepareHydrationBatch(){return this.ensureMermaid()}handlePrepareHydrationBatchError(e,t){console.warn(`[preview] Mermaid runtime failed to load:`,t)}async hydrateShell(e,t){if(!t||!e?.isConnected||this.isShellHydrated(e))return;let n=e.querySelector(`.mermaid-source`);n||(n=document.createElement(`span`),n.className=`mermaid-source`,n.hidden=!0,e.appendChild(n));let r=n.textContent??``;try{if(!r.trim()&&e.dataset.mermaidTarget){if(r=await this.fetchSource(e.dataset.mermaidTarget),!e.isConnected)return;n.textContent=r}if(!r.trim())throw Error(e.dataset.mermaidTarget?`Mermaid file is empty`:`Mermaid source is empty`);r=this.prepareSource(r),e.querySelector(`.mermaid-placeholder-card`)?.remove();let i=document.createElement(`div`);i.className=`mermaid mermaid-render-node`,i.id=e.dataset.mermaidKey||`mermaid-${Date.now()}`;let a=e.getAttribute(`data-source-line`),o=e.getAttribute(`data-source-line-end`);if(a&&i.setAttribute(`data-source-line`,a),o&&i.setAttribute(`data-source-line-end`,o),i.textContent=r,e.appendChild(i),await t.run({nodes:[i]}),!i.isConnected||e!==i.parentElement)return;this.enhanceDiagram(e,i),this.markShellHydrated(e)}catch(t){console.warn(`[preview] Mermaid render failed:`,t),e.querySelector(`:scope > .mermaid-toolbar`)?.remove(),e.querySelector(`:scope > .mermaid-frame`)?.remove(),e.querySelector(`:scope > .mermaid-render-node`)?.remove(),e.querySelector(`.mermaid-placeholder-card`)||n?.after(ae(e.dataset.mermaidKey||`mermaid`,{label:e.dataset.mermaidLabel||`Mermaid diagram`,message:t instanceof Error?t.message:`Render failed`}))}}prepareSource(e){let t=String(e??``);if(!/%%\{[\s\S]*?\binit\s*:/m.test(t)){let e=this.getPreviewInitConfig(t);e&&(t=`%%{init: ${JSON.stringify(e)}}%%\n${t}`)}if(!/^\s*gantt\b/m.test(t)||/\btodayMarker\b/.test(t))return t;let n=t.split(`
22
22
  `),r=n.findIndex(e=>/^\s*gantt\b/.test(e));return r===-1?t:(n.splice(r+1,0,` todayMarker off`),n.join(`
23
- `))}getPreviewInitConfig(e){return/^\s*stateDiagram(?:-v2)?\b/m.test(e)||/^\s*classDiagram\b/m.test(e)||/^\s*gantt\b/m.test(e)?{htmlLabels:!1}:null}resetHydratedShells(){let e=this.renderer.previewElement;if(!e)return;let t=Array.from(e.querySelectorAll(`.mermaid-shell[data-mermaid-hydrated="true"]`));t.length!==0&&t.forEach(e=>{this.shellRefits.delete(e),e.removeAttribute(`data-mermaid-hydrated`),e.querySelector(`:scope > .mermaid-toolbar`)?.remove(),e.querySelector(`:scope > .mermaid-frame`)?.remove(),e.querySelector(`:scope > .mermaid-render-node`)?.remove(),e.querySelector(`.mermaid-placeholder-card`)||e.querySelector(`.mermaid-source`)?.after(se(e.dataset.mermaidKey||`mermaid`)),this.enqueueShell(e,{prioritize:!0})})}enhanceDiagram(e,t){let n=t.querySelector(`svg`);if(!n){t.remove();return}let r=document.createElement(`div`);r.className=`mermaid-toolbar diagram-preview-toolbar`;let i=this.createZoomButton(`−`,`Zoom out`),a=this.createZoomButton(`+`,`Zoom in`),o=this.createZoomButton(`Reset`,`Reset zoom`),s=this.createZoomButton(`Max`,`Maximize diagram`);s.classList.add(`mermaid-maximize-btn`),z(s,`maximize`);let c=document.createElement(`span`);c.className=`mermaid-zoom-label diagram-preview-zoom-label`,c.setAttribute(`aria-live`,`polite`),r.append(i,c,o,a,s);let l=document.createElement(`div`);l.className=`mermaid-frame diagram-preview-frame`;let{width:u,height:d}=ae(n),f=R.default,p=1,m=null,h=null,g=!1,_=0,v=!1,b=null,x=0,S=0,C=0,w=0;n.style.display=`block`,n.style.margin=`0 auto`,n.style.maxWidth=`none`;let T=()=>{let e=F(l);if(!Number.isFinite(u)||u<=0||e.width<=0)return R.default;let t=e.width/u;return!Number.isFinite(t)||t<=0?R.default:y(t,R.min,R.max)},E=e=>{f=y(e,R.min,R.max),n.style.width=`${u*f}px`,n.style.height=`${d*f}px`,c.textContent=`${Math.round(f*100)}%`,i.disabled=f<=R.min,a.disabled=f>=R.max;let t=F(l),r=u*f>t.width||d*f>t.height;l.classList.toggle(`is-pannable`,r),n.style.margin=r?`0`:`0 auto`},ee=()=>({x:l.scrollLeft+l.clientWidth/2,y:l.scrollTop+l.clientHeight/2}),D=(e,t,n)=>{if(e===0)return;let r=t/e;l.scrollLeft=n.x*r-l.clientWidth/2,l.scrollTop=n.y*r-l.clientHeight/2},O=e=>{let t=y(e,R.min,R.max),n=f;if(t===n)return;let r=ee(),i=performance.now();m&&cancelAnimationFrame(m);let a=e=>{let o=y((e-i)/R.animationDurationMs,0,1),s=pe(o),c=n+(t-n)*s;if(E(c),D(n,c,r),o<1){m=requestAnimationFrame(a);return}m=null,E(t),D(n,t,r)};m=requestAnimationFrame(a)},k=e=>{g=!0,O(f+e)},A=({animate:e=!1}={})=>{if(p=T(),g=!1,_=F(l).width,e&&Math.abs(p-f)>.001){O(p);return}m&&=(cancelAnimationFrame(m),null),E(p),l.scrollLeft=0,l.scrollTop=0},j=({force:t=!1}={})=>{h&&cancelAnimationFrame(h),h=requestAnimationFrame(()=>{if(h=null,!e.isConnected)return;let n=F(l).width,r=Math.abs(n-_)>1;!t&&g||!t&&_>0&&!r||A()})};this.shellRefits.set(e,j),i.addEventListener(`click`,()=>k(-R.step)),a.addEventListener(`click`,()=>k(R.step)),o.addEventListener(`click`,()=>{A({animate:!0})});let M=()=>{let t=e.classList.contains(`is-maximized`);z(s,t?`restore`:`maximize`);let n=t?`Restore diagram size`:`Maximize diagram`;s.setAttribute(`aria-label`,n),s.title=n},te=t=>{let n=this.renderer.previewElement;if(t){let t=n.querySelector(`.mermaid-shell.is-maximized`);if(t&&t!==e){t.classList.remove(`is-maximized`),this.shellRefits.get(t)?.();let e=t.querySelector(`.mermaid-maximize-btn`);e&&(z(e,`maximize`),e.setAttribute(`aria-label`,`Maximize diagram`),e.title=`Maximize diagram`)}e.classList.add(`is-maximized`),document.body.classList.add(`mermaid-maximized-open`),M(),j({force:!0});return}e.classList.remove(`is-maximized`),n.querySelector(`.mermaid-shell.is-maximized`)||document.body.classList.remove(`mermaid-maximized-open`),M(),j({force:!0})};M(),s.addEventListener(`click`,()=>{te(!e.classList.contains(`is-maximized`))});let N=()=>{if(v){if(v=!1,l.classList.remove(`is-dragging`),b!==null&&typeof l.releasePointerCapture==`function`)try{l.releasePointerCapture(b)}catch{}b=null}};l.addEventListener(`pointerdown`,e=>{e.button!==0||!l.classList.contains(`is-pannable`)||(m&&=(cancelAnimationFrame(m),null),v=!0,b=e.pointerId,x=e.clientX,S=e.clientY,C=l.scrollLeft,w=l.scrollTop,l.classList.add(`is-dragging`),l.setPointerCapture?.(e.pointerId),e.preventDefault())}),l.addEventListener(`pointermove`,e=>{v&&(l.scrollLeft=C-(e.clientX-x),l.scrollTop=w-(e.clientY-S))}),l.addEventListener(`pointerup`,N),l.addEventListener(`pointercancel`,N),l.addEventListener(`lostpointercapture`,N),l.appendChild(n);let P=e.querySelector(`.mermaid-source`);t.remove(),e.replaceChildren(),P&&(P.hidden=!0,e.appendChild(P)),e.append(r,l),j({force:!0})}scheduleActiveRefit(){let e=this.renderer.previewElement;e&&Array.from(e.querySelectorAll(`.mermaid-shell[data-mermaid-hydrated="true"]`)).forEach(e=>{this.shellRefits.get(e)?.()})}createZoomButton(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`mermaid-zoom-btn ui-preview-action`,n.setAttribute(`aria-label`,t),n.title=t,n.textContent=e,n}},Ce=class extends xe{constructor(e){super(e,{batchSize:2,datasetKeys:{hydrated:`plantumlHydrated`,instanceId:`plantumlInstanceId`,key:`plantumlKey`,label:`plantumlLabel`,queued:`plantumlQueued`,sourceHash:`plantumlSourceHash`,sourceLine:`sourceLine`,sourceLineEnd:`sourceLineEnd`,target:`plantumlTarget`},filePathLabel:`PlantUML`,shellClassName:`plantuml-shell`,sourceClassName:`plantuml-source`}),this.renderer=e,this.svgCache=new Map,this.svgInflightRequests=new Map,this.shellRefits=new WeakMap,this.activeMaximizedShell=null,this.maximizedRoot=null,this.resizeFrameId=null}destroy(){this.cancelHydration(),this.preservedShells.clear(),this.clearActiveShell(),this.resizeFrameId&&=(cancelAnimationFrame(this.resizeFrameId),null),this.maximizedRoot?.remove(),this.maximizedRoot=null}clearActiveShell(){this.activeMaximizedShell=null,this.maximizedRoot&&this.maximizedRoot.childElementCount===0&&(this.maximizedRoot.hidden=!0)}syncActiveShell(){return this.activeMaximizedShell?.isConnected&&this.activeMaximizedShell.classList.contains(`is-maximized`)?this.activeMaximizedShell:(this.clearActiveShell(),null)}scheduleActiveRefit(){this.resizeFrameId&&cancelAnimationFrame(this.resizeFrameId),this.resizeFrameId=requestAnimationFrame(()=>{this.resizeFrameId=null;let e=this.syncActiveShell();e&&this.shellRefits.get(e)?.()})}handleReconcile({restoredMaximizedShell:e}){e&&document.body.classList.add(`plantuml-maximized-open`),this.syncActiveShell()}ensureMaximizedRoot(){if(this.maximizedRoot?.isConnected&&this.maximizedRoot.parentElement===document.body)return this.maximizedRoot;let e=document.body.querySelector(`[data-plantuml-maximized-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.plantumlMaximizedRoot=`true`,e.className=`plantuml-maximized-root`,document.body.appendChild(e)),this.maximizedRoot=e,e}mountShellInMaximizedRoot(e){if(!e)return;let t=this.ensureMaximizedRoot();t.hidden=!1,e._plantumlRestoreParent=e.parentElement||null,e._plantumlRestoreNextSibling=e.nextSibling||null,t.appendChild(e)}restoreShellMount(e){if(!e)return;let t=e._plantumlRestoreParent,n=e._plantumlRestoreNextSibling;t?.isConnected&&(n?.parentElement===t?t.insertBefore(e,n):t.appendChild(e)),e._plantumlRestoreParent=null,e._plantumlRestoreNextSibling=null,this.maximizedRoot&&this.maximizedRoot.childElementCount===0&&(this.maximizedRoot.hidden=!0)}async hydrateShell(e){if(!e?.isConnected||this.isShellHydrated(e))return;let t=e.querySelector(`.plantuml-source`);t||(t=document.createElement(`span`),t.className=`plantuml-source`,t.hidden=!0,e.appendChild(t)),e.querySelector(`.plantuml-placeholder-card`)?.remove();try{let n=t.textContent??``;if(!n.trim()&&e.dataset.plantumlTarget){if(n=await this.fetchSource(e.dataset.plantumlTarget),!e.isConnected)return;t.textContent=n}if(!n.trim())throw Error(e.dataset.plantumlTarget?`PlantUML file is empty`:`PlantUML source is empty`);let r=await this.fetchSvg(n);if(!e.isConnected)return;this.enhanceDiagram(e,r),this.markShellHydrated(e)}catch(n){console.warn(`[preview] PlantUML render failed:`,n),e.querySelector(`:scope > .plantuml-toolbar`)?.remove(),e.querySelector(`:scope > .plantuml-frame`)?.remove(),e.querySelector(`.plantuml-placeholder-card`)||t?.after(ue(e.dataset.plantumlKey||`plantuml`,n instanceof Error?n.message:`Render failed`))}}async fetchSvg(e){let t=e;if(this.svgCache.has(t))return this.svgCache.get(t);if(this.svgInflightRequests.has(t))return this.svgInflightRequests.get(t);let n=fetch(D(`/plantuml/render`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({source:e})}).then(async e=>{let n=await e.json().catch(()=>null);if(!e.ok||!n?.ok||typeof n.svg!=`string`)throw Error(n?.error||`Failed to render PlantUML`);let r=de(n.svg);return this.svgCache.set(t,r),r}).finally(()=>{this.svgInflightRequests.delete(t)});return this.svgInflightRequests.set(t,n),n}resetShell(e,{clearCache:t=!1,message:n=`Renders server-side when visible`}={}){let r=e.querySelector(`.plantuml-source`)?.textContent??``;t&&r&&(this.svgCache.delete(r),this.svgInflightRequests.delete(r)),this.shellRefits.delete(e),this.activeMaximizedShell===e&&(this.restoreShellMount(e),this.clearActiveShell()),e.removeAttribute(`data-plantuml-hydrated`),e.removeAttribute(`data-plantuml-instance-id`),e.removeAttribute(`data-plantuml-queued`),e.classList.remove(`is-maximized`),this.syncActiveShell()||document.body.classList.remove(`plantuml-maximized-open`),e.querySelector(`:scope > .plantuml-toolbar`)?.remove(),e.querySelector(`:scope > .plantuml-frame`)?.remove(),e.querySelector(`.plantuml-placeholder-card`)||e.querySelector(`.plantuml-source`)?.after(ue(e.dataset.plantumlKey||`plantuml`,n))}enhanceDiagram(e,t){let n=document.createElement(`div`);n.innerHTML=t;let r=n.querySelector(`svg`);if(!r)throw Error(`Renderer returned invalid SVG`);let i=document.createElement(`div`);i.className=`plantuml-toolbar diagram-preview-toolbar`;let a=document.createElement(`div`);a.className=`plantuml-frame diagram-preview-frame`;let o=this.createToolButton(`−`,`Zoom out`),s=this.createToolButton(`+`,`Zoom in`),c=this.createToolButton(`Reset`,`Reset zoom`),l=this.createToolButton(`Reload`,`Reload diagram`),u=this.createToolButton(`Max`,`Maximize diagram`);u.classList.add(`plantuml-maximize-btn`),z(l,`refresh`),z(u,`maximize`);let d=document.createElement(`span`);d.className=`plantuml-zoom-label diagram-preview-zoom-label`,d.setAttribute(`aria-live`,`polite`),i.append(o,d,c,s,l,u);let{width:f,height:p}=ce(r),m=L.default,h=1,g=null,_=!1,v=null,b=0,x=0,S=0,C=0;r.style.display=`block`,r.style.margin=`0 auto`,r.style.maxWidth=`none`;let w=()=>{let e=F(a);return!Number.isFinite(f)||f<=0||e.width<=0?L.default:y(Math.min(L.default,e.width/f),L.min,L.max)},T=e=>{m=y(e,L.min,L.max),r.style.width=`${f*m}px`,r.style.height=`${p*m}px`,d.textContent=`${Math.round(m*100)}%`,o.disabled=m<=L.min,s.disabled=m>=L.max;let t=F(a),n=f*m>t.width||p*m>t.height;a.classList.toggle(`is-pannable`,n)},E=()=>({x:a.scrollLeft+a.clientWidth/2,y:a.scrollTop+a.clientHeight/2}),ee=(e,t,n)=>{if(e===0)return;let r=t/e;a.scrollLeft=n.x*r-a.clientWidth/2,a.scrollTop=n.y*r-a.clientHeight/2},D=e=>{let t=y(e,L.min,L.max),n=m;if(t===n)return;let r=E(),i=performance.now();g&&cancelAnimationFrame(g);let a=e=>{let o=y((e-i)/L.animationDurationMs,0,1),s=pe(o),c=n+(t-n)*s;if(T(c),ee(n,c,r),o<1){g=requestAnimationFrame(a);return}g=null,T(t),ee(n,t,r)};g=requestAnimationFrame(a)},O=e=>{D(m+e)},k=({animate:e=!1}={})=>{if(h=w(),e&&Math.abs(h-m)>.001){D(h);return}g&&=(cancelAnimationFrame(g),null),T(h),a.scrollLeft=0,a.scrollTop=0},A=null,j=()=>{A&&cancelAnimationFrame(A),A=requestAnimationFrame(()=>{A=null,e.isConnected&&k()})};this.shellRefits.set(e,j),o.addEventListener(`click`,()=>O(-L.step)),s.addEventListener(`click`,()=>O(L.step)),c.addEventListener(`click`,()=>{k({animate:!0})});let M=()=>{let t=e.classList.contains(`is-maximized`);z(u,t?`restore`:`maximize`);let n=t?`Restore diagram size`:`Maximize diagram`;u.setAttribute(`aria-label`,n),u.title=n},te=t=>{if(t){let t=this.syncActiveShell();if(t&&t!==e){this.restoreShellMount(t),t.classList.remove(`is-maximized`),this.activeMaximizedShell===t&&this.clearActiveShell(),this.shellRefits.get(t)?.();let e=t.querySelector(`.plantuml-maximize-btn`);e&&(z(e,`maximize`),e.setAttribute(`aria-label`,`Maximize diagram`),e.title=`Maximize diagram`)}this.mountShellInMaximizedRoot(e),e.classList.add(`is-maximized`),this.activeMaximizedShell=e,document.body.classList.add(`plantuml-maximized-open`),M(),j();return}this.restoreShellMount(e),e.classList.remove(`is-maximized`),this.activeMaximizedShell===e&&this.clearActiveShell(),this.syncActiveShell()||document.body.classList.remove(`plantuml-maximized-open`),M(),j()};l.addEventListener(`click`,()=>{this.resetShell(e,{clearCache:!0,message:`Refreshing…`}),this.enqueueShell(e,{prioritize:!0})}),M(),u.addEventListener(`click`,()=>{te(!e.classList.contains(`is-maximized`))});let N=()=>{if(_){if(_=!1,a.classList.remove(`is-dragging`),v!==null&&typeof a.releasePointerCapture==`function`)try{a.releasePointerCapture(v)}catch{}v=null}};a.addEventListener(`pointerdown`,e=>{e.button!==0||!a.classList.contains(`is-pannable`)||(g&&=(cancelAnimationFrame(g),null),_=!0,v=e.pointerId,b=e.clientX,x=e.clientY,S=a.scrollLeft,C=a.scrollTop,a.classList.add(`is-dragging`),a.setPointerCapture?.(e.pointerId),e.preventDefault())}),a.addEventListener(`pointermove`,e=>{_&&(a.scrollLeft=S-(e.clientX-b),a.scrollTop=C-(e.clientY-x))}),a.addEventListener(`pointerup`,N),a.addEventListener(`pointercancel`,N),a.addEventListener(`lostpointercapture`,N),a.appendChild(r);let P=e.querySelector(`.plantuml-source`);e.replaceChildren(),P&&(P.hidden=!0,e.appendChild(P)),e.append(i,a),h=w(),T(h)}createToolButton(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`plantuml-tool-btn ui-preview-action`,n.setAttribute(`aria-label`,t),n.title=t,n.textContent=e,n}};function we(){return new Worker(new URL(``+new URL(`preview-render-worker-BVbVXXPS.js`,import.meta.url).href,``+import.meta.url),{type:`module`})}var Te=class{constructor({attachmentApiPath:t=`/api/attachment`,cancelIdleRenderFn:n=fe,compilePreviewDocumentLoader:r=()=>e(()=>import(`./preview-render-compiler-TmHpBDlh.js`),__vite__mapDeps([23,24,25,4,26]),import.meta.url),createWorkerFn:i=we,getFileList:a,getSourceFilePath:o=null,idleTimeoutMs:s=500,requestIdleRenderFn:c=oe}={}){this.attachmentApiPath=t,this.cancelIdleRenderFn=n,this.compilePreviewDocumentLoader=r,this.createWorkerFn=i,this.getFileList=a,this.getSourceFilePath=o,this.idleTimeoutMs=s,this.requestIdleRenderFn=c,this.worker=null,this.workerDisabled=!1,this.workerJob=null,this.workerPrewarmId=null,this.handleWorkerMessage=e=>{if(!this.workerJob||e.data?.renderVersion!==this.workerJob.renderVersion)return;let t=this.workerJob;if(this.workerJob=null,e.data?.error){t.reject(Error(e.data.error));return}t.resolve({html:e.data.html,stats:e.data.stats})},this.handleWorkerError=e=>{let t=Error(e.message||`Preview worker failed`);this.workerJob&&=(this.workerJob.reject(t),null),this.reset(`Preview worker failed`,{disable:!0})}}hasPendingJob(){return this.workerJob!==null}schedulePrewarm({timeout:e=this.idleTimeoutMs}={}){this.workerDisabled||this.worker||this.workerPrewarmId!==null||(this.workerPrewarmId=this.requestIdleRenderFn(()=>{this.workerPrewarmId=null,this.ensureWorker()},e))}ensureWorker(){if(this.workerDisabled)return null;if(this.worker)return this.worker;try{return this.worker=this.createWorkerFn(),this.worker.addEventListener(`message`,this.handleWorkerMessage),this.worker.addEventListener(`error`,this.handleWorkerError),this.worker}catch{return this.workerDisabled=!0,null}}async compile(e,t,{frontmatterCollapsed:n=!1,frontmatterInteractive:r=!1}={}){if(this.ensureWorker()){this.workerJob&&this.reset(`Superseded preview render`);let i=this.ensureWorker();return new Promise((a,o)=>{this.workerJob={reject:o,renderVersion:t,resolve:a},i.postMessage({attachmentApiPath:this.attachmentApiPath,fileList:this.getFileList?.()??[],frontmatterCollapsed:n,frontmatterInteractive:r,markdownText:e,renderVersion:t,sourceFilePath:this.getSourceFilePath?.()??``})})}let{compilePreviewDocument:i}=await this.compilePreviewDocumentLoader();return i({attachmentApiPath:this.attachmentApiPath,fileList:this.getFileList?.()??[],frontmatterCollapsed:n,frontmatterInteractive:r,markdownText:e,sourceFilePath:this.getSourceFilePath?.()??``})}cancelWorkerJob(e){this.workerJob&&=(this.workerJob.reject(Error(e)),null)}reset(e,{disable:t=!1}={}){this.cancelWorkerJob(e),this.worker&&=(this.worker.removeEventListener(`message`,this.handleWorkerMessage),this.worker.removeEventListener(`error`,this.handleWorkerError),this.worker.terminate(),null),t&&(this.workerDisabled=!0)}destroy(e=`Preview renderer destroyed`){this.workerPrewarmId!==null&&this.cancelIdleRenderFn(this.workerPrewarmId),this.workerPrewarmId=null,this.reset(e)}},Ee=class{constructor({cancelAnimationFrameFn:e=e=>cancelAnimationFrame(e),cancelIdleRenderFn:t=fe,clearTimeoutFn:n=e=>clearTimeout(e),getRenderProfileFn:i=r,idleTimeoutMs:a=500,requestAnimationFrameFn:o=e=>requestAnimationFrame(e),requestIdleRenderFn:s=oe,setTimeoutFn:c=(e,t)=>setTimeout(e,t)}={}){this.cancelAnimationFrameFn=e,this.cancelIdleRenderFn=t,this.clearTimeoutFn=n,this.getRenderProfileFn=i,this.idleTimeoutMs=a,this.requestAnimationFrameFn=o,this.requestIdleRenderFn=s,this.setTimeoutFn=c,this.frameId=null,this.idleId=null,this.timeoutId=null}queue({markdownText:e,onRenderRequested:t,renderVersion:n}){let r=this.getRenderProfileFn(e);this.cancel();let i=()=>{this.frameId=this.requestAnimationFrameFn(()=>{this.frameId=null,this.timeoutId=null,t?.(e,n)})};this.timeoutId=this.setTimeoutFn(()=>{if(r.deferUntilIdle){this.idleId=this.requestIdleRenderFn(()=>{this.idleId=null,i()},this.idleTimeoutMs);return}i()},r.debounceMs)}cancel(){this.clearTimeoutFn(this.timeoutId),this.frameId&&this.cancelAnimationFrameFn(this.frameId),this.cancelIdleRenderFn(this.idleId),this.frameId=null,this.idleId=null,this.timeoutId=null}destroy(){this.cancel()}},De=class{constructor({getContent:e,getFileList:t,getSourceFilePath:n,onAfterRenderCommit:i,onBeforeRenderCommit:a,onPreviewLayoutChange:o,onRenderComplete:s,outlineController:c,previewContainer:l,previewElement:u}){this.getContent=e,this.getFileList=t,this.getSourceFilePath=n,this.onAfterRenderCommit=i,this.onBeforeRenderCommit=a,this.onPreviewLayoutChange=o,this.onRenderComplete=s,this.outlineController=c,this.previewContainer=l,this.previewElement=u,this.renderHost=null,this.pendingRenderVersion=0,this.activeRenderVersion=0,this.readyRenderVersion=0,this.currentStats=null,this.isLargeDocument=!1,this.hydrationPaused=!1,this.frontmatterCollapsed=!1,this.handlePreviewClick=e=>{if(e.target.closest(`.frontmatter-toggle`)){e.preventDefault(),this.frontmatterCollapsed=!this.frontmatterCollapsed,this.applyFrontmatterState(),this.handleFrontmatterLayoutChange();return}let t=e.target.closest(`.mermaid-placeholder-btn`);if(t){let n=t.closest(`.mermaid-shell`);if(!n)return;e.preventDefault(),this.enqueueMermaidShell(n,{prioritize:!0});return}let n=e.target.closest(`.plantuml-placeholder-btn`);if(n){let t=n.closest(`.plantuml-shell`);if(!t)return;e.preventDefault(),this.enqueuePlantUmlShell(t,{prioritize:!0})}},this.handleWindowResize=()=>{this.mermaidHydrator.scheduleActiveRefit(),this.plantUmlHydrator.scheduleActiveRefit()},this.mermaidHydrator=new Se(this),this.plantUmlHydrator=new Ce(this),this.renderScheduler=new Ee({getRenderProfileFn:r}),this.renderExecutor=new Te({attachmentApiPath:D(`/attachment`),getFileList:()=>this.getFileList?.()??[],getSourceFilePath:()=>this.getSourceFilePath?.()??``,idleTimeoutMs:500}),this.previewElement?.addEventListener(`click`,this.handlePreviewClick),window.addEventListener(`resize`,this.handleWindowResize),this.setPhase(`ready`)}ensureRenderHost(){if(!this.previewElement)return null;if(this.renderHost?.isConnected&&this.renderHost.parentElement===this.previewElement)return this.renderHost;let e=this.previewElement.querySelector(`[data-preview-render-host="true"]`);return e||(e=document.createElement(`div`),e.dataset.previewRenderHost=`true`,this.previewElement.appendChild(e)),this.renderHost=e,this.renderHost}normalizePreviewChildren(e=this.renderHost){this.previewElement&&Array.from(this.previewElement.children).forEach(t=>{t===e||t.dataset.excalidrawOverlayRoot===`true`||t.dataset.videoOverlayRoot===`true`||t.remove()})}getReservedPreviewHeight(){let e=this.renderHost?.getBoundingClientRect?.().height??0,t=this.previewContainer?.clientHeight??0;return Math.max(Math.round(e),Math.round(t),320)}beginDocumentLoad(){this.cancelScheduledRender(),this.cancelMermaidHydration(),this.cancelPlantUmlHydration(),this.mermaidHydrator.clearPreservedShells(),this.plantUmlHydrator.clearPreservedShells(),this.clearActivePlantUmlShell(),this.onBeforeRenderCommit?.(this.previewElement),this.pendingRenderVersion+=1,this.activeRenderVersion=this.pendingRenderVersion,this.readyRenderVersion=0,this.currentStats=null,this.isLargeDocument=!1,this.frontmatterCollapsed=!1,this.renderExecutor.hasPendingJob()&&this.resetWorker(`Document changed`);let e=this.ensureRenderHost();this.normalizePreviewChildren(e);let t=this.getReservedPreviewHeight();e&&(e.replaceChildren(),e.style.minHeight=`${t}px`);let n=document.createElement(`div`);n.className=`preview-shell`,n.style.minHeight=`${t}px`,n.textContent=`Rendering preview…`,e?.append(n),this.setPhase(`shell`)}applyTheme(e){let t=document.getElementById(`hljs-theme`);if(t){let{darkHref:n,lightHref:r}=t.dataset;t.href=e===`dark`?n:r}this.mermaidHydrator.applyTheme(e)}configureMermaid(e){this.mermaidHydrator.configureMermaid(e)}ensureMermaid(){return this.mermaidHydrator.ensureMermaid()}queueRender(){let e=this.getContent();this.cancelScheduledRender(),this.pendingRenderVersion+=1;let t=this.pendingRenderVersion;this.renderScheduler.queue({markdownText:e,onRenderRequested:(e,t)=>{this.render(e,t)},renderVersion:t})}async render(e=this.getContent(),t=this.pendingRenderVersion){if(this.previewElement)try{let n=await this.compilePreview(e,t);if(t!==this.pendingRenderVersion)return;this.commitBaseRender(n,t)}catch(e){if(t!==this.pendingRenderVersion)return;console.warn(`[preview] Failed to render preview:`,e)}}destroy(){this.renderScheduler.destroy(),this.mermaidHydrator.destroy(),this.plantUmlHydrator.destroy(),this.renderExecutor.destroy(),this.previewElement?.removeEventListener(`click`,this.handlePreviewClick),window.removeEventListener(`resize`,this.handleWindowResize)}setPhase(e){this.previewElement&&(this.previewElement.dataset.renderPhase=e)}cancelScheduledRender(){this.renderScheduler.cancel()}cancelMermaidHydration(){this.mermaidHydrator.cancelHydration()}cancelPlantUmlHydration(){this.plantUmlHydrator.cancelHydration()}clearActivePlantUmlShell(){this.plantUmlHydrator.clearActiveShell()}scheduleActiveMermaidRefit(){this.mermaidHydrator.scheduleActiveRefit()}syncActivePlantUmlShell(){return this.plantUmlHydrator.syncActiveShell()}scheduleActivePlantUmlRefit(){this.plantUmlHydrator.scheduleActiveRefit()}setHydrationPaused(e){if(this.hydrationPaused=!!e,this.hydrationPaused){this.mermaidHydrator.cancelPendingIdleWork(),this.plantUmlHydrator.cancelPendingIdleWork();return}this.mermaidHydrator.hydrateVisibleShells(),this.mermaidHydrator.scheduleHydration(),this.plantUmlHydrator.hydrateVisibleShells(),this.plantUmlHydrator.scheduleHydration(),this.updateHydrationPhase()}resetWorker(e,{disable:t=!1}={}){this.renderExecutor.reset(e,{disable:t})}scheduleWorkerPrewarm({timeout:e=500}={}){this.renderExecutor.schedulePrewarm({timeout:e})}async compilePreview(e,t){return this.renderExecutor.compile(e,t,{frontmatterCollapsed:this.frontmatterCollapsed,frontmatterInteractive:!0})}commitBaseRender({html:e,stats:t},n){this.activeRenderVersion=n,this.readyRenderVersion=0,this.currentStats=t,this.isLargeDocument=i(t),this.cancelMermaidHydration(),this.cancelPlantUmlHydration(),document.body.classList.remove(`mermaid-maximized-open`),document.body.classList.remove(`plantuml-maximized-open`),this.preserveHydratedMermaidsForCommit(),this.preserveHydratedPlantUmlsForCommit(),this.onBeforeRenderCommit?.(this.previewElement);let r=this.ensureRenderHost();this.normalizePreviewChildren(r),r&&(r.innerHTML=e),this.applyFrontmatterState(),this.reconcileHydratedMermaids(),this.reconcileHydratedPlantUmls(),this.setPhase(`base`),this.outlineController.refresh(),this.onAfterRenderCommit?.(this.previewElement,{...t,isLargeDocument:this.isLargeDocument,renderVersion:n});let a=this.setupMermaidHydration(n),o=this.setupPlantUmlHydration(n);a===0&&o===0&&this.notifyReady()}applyFrontmatterState(){let e=this.renderHost?.querySelector?.(`.frontmatter-block`);if(!(e instanceof HTMLElement))return;let t=this.frontmatterCollapsed,n=e.querySelector(`.frontmatter-toggle`),r=e.querySelector(`.frontmatter-summary`),i=e.querySelector(`.frontmatter-content`);e.dataset.collapsed=t?`true`:`false`,n instanceof HTMLButtonElement&&(n.setAttribute(`aria-expanded`,t?`false`:`true`),n.textContent=t?`Show`:`Hide`),r instanceof HTMLElement&&(r.hidden=!t),i instanceof HTMLElement&&(i.hidden=t)}handleFrontmatterLayoutChange(){this.outlineController.refresh(),this.onPreviewLayoutChange?.({isLargeDocument:this.isLargeDocument,renderVersion:this.activeRenderVersion,stats:this.currentStats})}preserveHydratedMermaidsForCommit(){this.mermaidHydrator.preserveHydratedShellsForCommit()}preserveHydratedPlantUmlsForCommit(){this.plantUmlHydrator.preserveHydratedShellsForCommit()}reconcileHydratedMermaids(){this.mermaidHydrator.reconcileHydratedShells()}reconcileHydratedPlantUmls(){this.plantUmlHydrator.reconcileHydratedShells()}syncPreservedMermaidShell(e,t){this.mermaidHydrator.syncPreservedShell(e,t)}syncPreservedPlantUmlShell(e,t){this.plantUmlHydrator.syncPreservedShell(e,t)}setupMermaidHydration(e){return this.mermaidHydrator.setupHydration(e)}hydrateVisibleMermaids(){this.mermaidHydrator.hydrateVisibleShells()}enqueueMermaidShell(e,{prioritize:t=!1}={}){this.mermaidHydrator.enqueueShell(e,{prioritize:t})}scheduleMermaidHydration(){this.mermaidHydrator.scheduleHydration()}async flushMermaidHydrationQueue(){await this.mermaidHydrator.flushHydrationQueue()}async hydrateMermaidShell(e,t){await this.mermaidHydrator.hydrateShell(e,t)}resetHydratedMermaids(){this.mermaidHydrator.resetHydratedShells()}setupPlantUmlHydration(e){return this.plantUmlHydrator.setupHydration(e)}hydrateVisiblePlantUmls(){this.plantUmlHydrator.hydrateVisibleShells()}enqueuePlantUmlShell(e,{prioritize:t=!1}={}){this.plantUmlHydrator.enqueueShell(e,{prioritize:t})}schedulePlantUmlHydration(){this.plantUmlHydrator.scheduleHydration()}async flushPlantUmlHydrationQueue(){await this.plantUmlHydrator.flushHydrationQueue()}async hydratePlantUmlShell(e){await this.plantUmlHydrator.hydrateShell(e)}updateHydrationPhase(){if(this.hydrationPaused&&(this.mermaidHydrator.hasPendingWork()||this.plantUmlHydrator.hasPendingWork())){this.setPhase(`base`);return}if(this.mermaidHydrator.hasPendingWork()||this.plantUmlHydrator.hasPendingWork()){this.setPhase(`hydrating`);return}this.notifyReady()}notifyReady(){this.renderHost&&(this.renderHost.style.minHeight=``),this.setPhase(`ready`),this.readyRenderVersion!==this.activeRenderVersion&&(this.readyRenderVersion=this.activeRenderVersion,this.onRenderComplete?.({isLargeDocument:this.isLargeDocument,stats:this.currentStats}))}async fetchPlantUmlSvg(e){return this.plantUmlHydrator.fetchSvg(e)}async fetchPlantUmlSource(e){return this.plantUmlHydrator.fetchSource(e)}async fetchMermaidSource(e){return this.mermaidHydrator.fetchSource(e)}resetPlantUmlShell(e,{clearCache:t=!1,message:n=`Renders server-side when visible`}={}){this.plantUmlHydrator.resetShell(e,{clearCache:t,message:n})}enhancePlantUmlDiagram(e,t){this.plantUmlHydrator.enhanceDiagram(e,t)}enhanceMermaidDiagram(e,t){this.mermaidHydrator.enhanceDiagram(e,t)}createMermaidZoomButton(e,t){return this.mermaidHydrator.createZoomButton(e,t)}createPlantUmlToolButton(e,t){return this.plantUmlHydrator.createToolButton(e,t)}},Oe=class{constructor({backlinksPanel:e,clearInitialFileBootstrap:t,clearStaticPreviewDocument:n=null,closeSidebarOnMobile:r,drawioEmbed:i,elements:a,excalidrawEmbed:o,fileHistoryView:s=null,fileExplorer:c,getIsTabActive:l,getSessionLoadToken:u,gitDiffView:d,gitPanel:f,imageLightbox:p=null,lobby:m,navigation:h,previewRenderer:g,renderAvatars:_,renderPresence:v,resetPreviewMode:y,scrollSyncController:b,setSession:x,setSessionLoadToken:S,setSidebarTab:C,setCurrentFilePath:w,showGitCommit:T,showGitDiff:E,showGitFileHistory:ee,showGitFilePreview:D,showGitHistory:O,syncMainChrome:k,videoEmbed:A,workspaceCoordinator:j,layoutController:M}){this.backlinksPanel=e,this.clearInitialFileBootstrap=t,this.clearStaticPreviewDocument=n,this.closeSidebarOnMobile=r,this.drawioEmbed=i??{setHydrationPaused(){}},this.elements=a,this.excalidrawEmbed=o,this.fileHistoryView=s,this.fileExplorer=c,this.getIsTabActive=l,this.getSessionLoadToken=u,this.gitDiffView=d,this.gitPanel=f,this.imageLightbox=p,this.lobby=m,this.navigation=h,this.previewRenderer=g,this.renderAvatars=_,this.renderPresence=v,this.resetPreviewMode=y,this.scrollSyncController=b,this.setSession=x,this.setSessionLoadToken=S,this.setSidebarTab=C,this.setCurrentFilePath=w,this.showGitCommit=T,this.showGitDiff=E,this.showGitFileHistory=ee,this.showGitFilePreview=D,this.showGitHistory=O,this.syncMainChrome=k,this.videoEmbed=A,this.workspaceCoordinator=j,this.layoutController=M}async handleHashChange(){if(!this.getIsTabActive())return;let e=this.navigation.getHashRoute();if(e.type===`empty`){this.gitPanel.setSelection(),this.showEmptyState(),this.syncMainChrome({mode:`empty`,title:`CollabMD`});return}if(e.type===`git-diff`){this.setSidebarTab(`git`),await this.showGitDiff(e);return}if(e.type===`git-file-history`){this.setSidebarTab(`files`),await this.showGitFileHistory(e);return}if(e.type===`git-file-preview`){this.setSidebarTab(`files`),await this.showGitFilePreview(e);return}if(e.type===`git-history`){this.setSidebarTab(`git`),await this.showGitHistory();return}if(e.type===`git-commit`){this.setSidebarTab(`git`),await this.showGitCommit(e);return}this.setSidebarTab(`files`),await this.openFile(e.filePath,{drawioMode:e.drawioMode||null})}showEmptyState(){this.gitDiffView.hide(),this.fileHistoryView?.hide?.(),this.workspaceCoordinator.cleanupSession(),this.clearStaticPreviewDocument?.(),this.setSession(null),this.setSessionLoadToken(this.getSessionLoadToken()+1),this.clearInitialFileBootstrap(),this.resetPreviewMode(),this.elements.outlineToggle?.classList.remove(`hidden`),this.elements.markdownToolbar?.classList.add(`hidden`),this.setCurrentFilePath(null),this.lobby.setCurrentFile(null),this.fileExplorer.setActiveFile(null),this.elements.emptyState?.classList.remove(`hidden`),this.elements.editorPage?.classList.add(`hidden`),this.elements.diffPage?.classList.add(`hidden`),this.elements.previewContent&&(this.elements.previewContent.innerHTML=``,this.elements.previewContent.dataset.renderPhase=`ready`),this.videoEmbed?.reconcileEmbeds(this.elements.previewContent),this.resetPreviewSurface(),this.renderAvatars(),this.renderPresence(),this.backlinksPanel.clear(),this.elements.activeFileName&&(this.elements.activeFileName.textContent=`CollabMD`)}showDiffState(){this.fileHistoryView?.hide?.(),this.setSessionLoadToken(this.getSessionLoadToken()+1),this.clearInitialFileBootstrap(),this.clearStaticPreviewDocument?.(),this.workspaceCoordinator.cleanupSession(),this.setSession(null),this.resetPreviewMode(),this.layoutController.reset(),this.setCurrentFilePath(null),this.lobby.setCurrentFile(null),this.fileExplorer.setActiveFile(null),this.elements.emptyState?.classList.add(`hidden`),this.elements.editorPage?.classList.add(`hidden`),this.elements.diffPage?.classList.remove(`hidden`),this.elements.previewContent&&(this.elements.previewContent.innerHTML=``,this.elements.previewContent.dataset.renderPhase=`ready`),this.videoEmbed?.reconcileEmbeds(this.elements.previewContent),this.resetPreviewSurface(),this.elements.outlineToggle?.classList.add(`hidden`),this.elements.markdownToolbar?.classList.add(`hidden`),this.renderAvatars(),this.renderPresence(),this.backlinksPanel.clear()}showFileHistoryState(e){this.gitDiffView.hide(),this.setSessionLoadToken(this.getSessionLoadToken()+1),this.clearInitialFileBootstrap(),this.clearStaticPreviewDocument?.(),this.workspaceCoordinator.cleanupSession(),this.setSession(null),this.resetPreviewMode(),this.layoutController.reset(),this.setCurrentFilePath(e),this.lobby.setCurrentFile(null),this.fileExplorer.setActiveFile(e),this.elements.emptyState?.classList.add(`hidden`),this.elements.editorPage?.classList.add(`hidden`),this.elements.diffPage?.classList.remove(`hidden`),this.elements.previewContent&&(this.elements.previewContent.innerHTML=``,this.elements.previewContent.dataset.renderPhase=`ready`),this.videoEmbed?.reconcileEmbeds(this.elements.previewContent),this.resetPreviewSurface(),this.elements.outlineToggle?.classList.add(`hidden`),this.elements.markdownToolbar?.classList.add(`hidden`),this.renderAvatars(),this.renderPresence(),this.backlinksPanel.clear()}showPreviewOnlyState(e){this.gitDiffView.hide(),this.fileHistoryView?.hide?.(),this.setSessionLoadToken(this.getSessionLoadToken()+1),this.clearInitialFileBootstrap(),this.clearStaticPreviewDocument?.(),this.workspaceCoordinator.cleanupSession(),this.setSession(null),this.resetPreviewMode(),this.layoutController.reset(),this.setCurrentFilePath(e),this.lobby.setCurrentFile(null),this.fileExplorer.setActiveFile(e),this.elements.emptyState?.classList.add(`hidden`),this.elements.editorPage?.classList.remove(`hidden`),this.elements.diffPage?.classList.add(`hidden`),this.elements.previewContent&&(this.elements.previewContent.innerHTML=``,this.elements.previewContent.dataset.renderPhase=`ready`),this.videoEmbed?.reconcileEmbeds(this.elements.previewContent),this.resetPreviewSurface(),this.elements.markdownToolbar?.classList.add(`hidden`),this.renderAvatars(),this.renderPresence(),this.backlinksPanel.clear()}async openFile(e,t={}){this.imageLightbox?.close?.(),this.gitPanel.setSelection(),this.gitDiffView.hide(),this.fileHistoryView?.hide?.(),this.clearStaticPreviewDocument?.(),this.syncMainChrome({mode:`editor`}),await this.workspaceCoordinator.openFile(e,t),this.setSession(this.workspaceCoordinator.getSession())}cleanupSession(){this.workspaceCoordinator.cleanupSession(),this.setSession(this.workspaceCoordinator.getSession())}handleFileSelection(e,{closeSidebarOnMobile:t=!1}={}){t&&this.closeSidebarOnMobile(),this.navigation.navigateToFile(e)}resetPreviewSurface(){this.imageLightbox?.close?.(),this.previewRenderer.setHydrationPaused(!1),this.drawioEmbed.setHydrationPaused(!1),this.excalidrawEmbed.setHydrationPaused(!1),this.videoEmbed?.detachForCommit(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks()}};function B(e){let t=String(e??``).trim().replace(/\\/g,`/`).replace(/^\/+/u,``).split(`/`).map(e=>e.trim()).filter(Boolean);return t.some(e=>e===`.`||e===`..`)?``:t.join(`/`)}function ke(e,t){let n=B(e),r=B(t);return n?r?`${n}/${r}`:n:r}function Ae(e,t){return e.toLowerCase().endsWith(t.toLowerCase())?e:`${e}${t}`}function je(e){return`# ${d(String(e??``).split(`/`).pop()||``)||`Untitled`}\n\n`}function Me(e){let t=B(e),n=_(t)?t:`${t}.mmd`;return{content:[`flowchart TD`,` A[Start] --> B{Decide}`,` B -->|Yes| C[Ship it]`,` B -->|No| D[Revise]`,``].join(`
24
- `),path:n}}function Ne(e){let t=B(e),n=p(t)?t:`${t}.drawio`;return{content:[`<mxfile host="app.diagrams.net" modified="2026-01-01T00:00:00.000Z" agent="CollabMD" version="24.7.17">`,` <diagram id="page-1" name="Page-1">`,` <mxGraphModel dx="1200" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">`,` <root>`,` <mxCell id="0" />`,` <mxCell id="1" parent="0" />`,` </root>`,` </mxGraphModel>`,` </diagram>`,`</mxfile>`,``].join(`
25
- `),path:n}}function Pe(e){let t=B(e),n=m(t)?t:`${t}.puml`;return{content:[`@startuml`,`Alice -> Bob: Hello`,`@enduml`,``].join(`
26
- `),path:n}}var Fe=class{constructor({getFileList:e,navigation:t,refreshExplorer:n,toastController:r,vaultApiClient:i}){this.getFileList=e,this.navigation=t,this.refreshExplorer=n,this.toastController=r,this.vaultApiClient=i}handleWikiLinkClick(e){let t=f(e,this.getFileList());if(t){this.navigation.navigateToFile(t);return}let n=this.normalizeNewWikiFilePath(e);if(!n){this.toastController.show(`Cannot create an empty wiki-link target`);return}this.createAndOpenFile(n,e)}normalizeNewWikiFilePath(e){let t=B(e);return t?t.endsWith(`.md`)?t:`${t}.md`:null}async createAndOpenFile(e,t){try{await this.vaultApiClient.createFile({content:je(t||e),path:e}),await this.refreshExplorer(),this.navigation.navigateToFile(e)}catch(e){this.toastController.show(`Failed to create file: ${e.message}`)}}},Ie=class{constructor({backlinksPanel:e,drawioEmbed:t,elements:n,excalidrawEmbed:r,getDisplayName:i,getSession:a,isDrawioFile:o,isExcalidrawFile:s,isImageFile:c,isMermaidFile:l,isPlantUmlFile:u,layoutController:d,outlineController:f,previewRenderer:p,schedulePreviewLayoutSync:m,scrollSyncController:h,videoEmbed:g}){this.backlinksPanel=e,this.drawioEmbed=t??{detachForCommit(){},hydrateVisibleEmbeds(){},reconcileEmbeds(){},setHydrationPaused(){},syncLayout(){},updateLocalUser(){},updateTheme(){}},this.elements=n,this.excalidrawEmbed=r,this.getDisplayName=i,this.getSession=a,this.isDrawioFile=o??(()=>!1),this.isExcalidrawFile=s??(()=>!1),this.isImageFile=c??(()=>!1),this.isMermaidFile=l??(()=>!1),this.isPlantUmlFile=u??(()=>!1),this.layoutController=d,this.outlineController=f,this.previewRenderer=p,this.schedulePreviewLayoutSyncCallback=m,this.scrollSyncController=h,this.videoEmbed=g}createDiagramPreviewDocument(e,t=``){let n=String(t??``),r=Math.max(...n.match(/`+/g)?.map(e=>e.length)??[0]),i="`".repeat(Math.max(3,r+1));return`${i}${e}\n${n}\n${i}`}getPreviewSource(e,{drawioMode:t=null}={}){let n=this.getSession()?.getText()??``;return this.isMermaidFile(e)?this.createDiagramPreviewDocument(`mermaid`,n):this.isPlantUmlFile(e)?this.createDiagramPreviewDocument(`plantuml`,n):this.isDrawioFile(e)&&t===`text`?this.createDiagramPreviewDocument(`xml`,n):n}resetPreviewMode(){this.elements.previewContent?.classList.remove(`is-drawio-file-preview`),this.elements.previewContent?.classList.remove(`is-excalidraw-file-preview`),this.elements.previewContent?.classList.remove(`is-image-file-preview`),this.elements.previewContent?.classList.remove(`is-mermaid-file-preview`),this.elements.previewContent?.classList.remove(`is-plantuml-file-preview`)}syncFileChrome(e,{drawioMode:t=null}={}){let n=this.isDrawioFile(e),r=this.isExcalidrawFile(e),i=this.isImageFile(e),a=l(e),o=this.isMermaidFile(e),c=this.isPlantUmlFile(e),u=s(e);if(this.elements.editorFindButton?.classList.toggle(`hidden`,!a),this.elements.markdownToolbar?.classList.toggle(`hidden`,!a),this.elements.exportMenuGroup?.classList.toggle(`hidden`,!a),this.elements.outlineToggle?.classList.toggle(`hidden`,u||i),this.elements.previewContent?.classList.toggle(`is-mermaid-file-preview`,o),this.elements.previewContent?.classList.toggle(`is-plantuml-file-preview`,c),n&&t!==`text`||r||i){this.layoutController.setView(`preview`,{persist:!1}),this.outlineController.close(),this.backlinksPanel.clear();return}(o||c)&&(this.outlineController.close(),this.backlinksPanel.clear())}renderExcalidrawFilePreview(e){let t=this.elements.previewContent;if(!t)return;this.videoEmbed?.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit(),this.resetPreviewMode(),t.classList.add(`is-excalidraw-file-preview`);let n=this.previewRenderer.ensureRenderHost();this.previewRenderer.normalizePreviewChildren(n);let r=document.createElement(`div`);r.className=`excalidraw-embed-placeholder`,r.dataset.embedKey=`${e}#file-preview`,r.dataset.embedLabel=this.getDisplayName(e),r.dataset.embedTarget=e;let i=document.createElement(`div`);i.className=`preview-shell`,i.textContent=`Loading Excalidraw preview…`,r.appendChild(i),n&&(n.replaceChildren(r),n.style.minHeight=``),t.dataset.renderPhase=`ready`,this.outlineController.refresh(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.videoEmbed?.reconcileEmbeds(t),this.drawioEmbed.reconcileEmbeds(t),this.excalidrawEmbed.reconcileEmbeds(t,{isLargeDocument:!1}),this.drawioEmbed.hydrateVisibleEmbeds(),this.excalidrawEmbed.hydrateVisibleEmbeds(),this.schedulePreviewLayoutSyncCallback({delayMs:0})}renderDrawioFilePreview(e){let t=this.elements.previewContent;if(!t)return;this.videoEmbed?.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit(),this.resetPreviewMode(),t.classList.add(`is-drawio-file-preview`);let n=this.previewRenderer.ensureRenderHost();this.previewRenderer.normalizePreviewChildren(n);let r=document.createElement(`div`);r.className=`drawio-embed-placeholder`,r.dataset.drawioKey=`${e}#file-preview`,r.dataset.drawioLabel=this.getDisplayName(e),r.dataset.drawioMode=`edit`,r.dataset.drawioTarget=e;let i=document.createElement(`div`);i.className=`preview-shell`,i.textContent=`Loading draw.io preview…`,r.appendChild(i),n&&(n.replaceChildren(r),n.style.minHeight=``),t.dataset.renderPhase=`ready`,this.outlineController.refresh(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.videoEmbed?.reconcileEmbeds(t),this.drawioEmbed.reconcileEmbeds(t),this.drawioEmbed.hydrateVisibleEmbeds(),this.schedulePreviewLayoutSyncCallback({delayMs:0})}renderImageFilePreview(e){let t=this.elements.previewContent;if(!t)return;this.videoEmbed?.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit(),this.resetPreviewMode(),t.classList.add(`is-image-file-preview`);let n=this.previewRenderer.ensureRenderHost();this.previewRenderer.normalizePreviewChildren(n);let r=document.createElement(`figure`);r.className=`image-file-preview-shell`;let i=document.createElement(`img`);i.className=`image-file-preview-image`,i.alt=this.getDisplayName(e),i.src=D(`/attachment?path=${encodeURIComponent(e)}`),r.appendChild(i),n&&(n.replaceChildren(r),n.style.minHeight=``),t.dataset.renderPhase=`ready`,this.outlineController.refresh(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.videoEmbed?.reconcileEmbeds(t),this.schedulePreviewLayoutSyncCallback({delayMs:0})}renderTextFilePreview({content:e=``}={}){let t=this.elements.previewContent;if(!t)return;this.videoEmbed?.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit(),this.resetPreviewMode();let n=this.previewRenderer.ensureRenderHost();this.previewRenderer.normalizePreviewChildren(n);let r=document.createElement(`div`);r.className=`preview-shell`;let i=document.createElement(`pre`),a=document.createElement(`code`);a.textContent=String(e??``),i.appendChild(a),r.appendChild(i),n&&(n.replaceChildren(r),n.style.minHeight=``),t.dataset.renderPhase=`ready`,this.outlineController.close(),this.backlinksPanel.clear(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.videoEmbed?.reconcileEmbeds(t),this.schedulePreviewLayoutSyncCallback({delayMs:0})}createResizeHandler(e){let t=null;return()=>{clearTimeout(t),t=setTimeout(()=>{e?.(),this.schedulePreviewLayoutSyncCallback({delayMs:0})},100)}}initializePreviewLayoutObserver(e=()=>{}){if(typeof ResizeObserver!=`function`||!this.elements.previewContent)return null;let t=new ResizeObserver(()=>{e()});return t.observe(this.elements.previewContent),t}schedulePreviewLayoutSync({hydrationPaused:e,previewLayoutSyncTimer:t,setPendingPreviewLayoutSync:n,setPreviewLayoutSyncTimer:r,delayMs:i=120}){if(e){n(!0);return}clearTimeout(t),r(setTimeout(()=>{r(null);let t=!!this.getSession(),i=this.elements.previewContent?.classList?.contains?.(`is-drawio-file-preview`)??!1,a=this.elements.previewContent?.classList?.contains?.(`is-excalidraw-file-preview`)??!1;if(!(!t&&!i&&!a||!this.elements.previewContent)&&this.elements.previewContent.dataset.renderPhase!==`shell`){if(e){n(!0);return}this.previewRenderer.scheduleActiveMermaidRefit(),this.previewRenderer.scheduleActivePlantUmlRefit(),this.videoEmbed?.syncLayout(),this.drawioEmbed.syncLayout(),this.excalidrawEmbed.syncLayout(),!((i||a)&&!t)&&(this.scrollSyncController.invalidatePreviewBlocks(),this.scrollSyncController.warmPreviewBlocks({onReady:()=>{this.getSession()&&(this.scrollSyncController.realignAfterLayoutChange(),this.outlineController.scheduleActiveHeadingUpdate())}}))}},i))}handleEditorScrollActivityChange({isActive:e,pendingPreviewLayoutSync:t,previewLayoutSyncTimer:n,setHydrationPaused:r,setPendingPreviewLayoutSync:i,setPreviewLayoutSyncTimer:a}){let o=!!e;if(r(o),this.previewRenderer.setHydrationPaused(o),this.drawioEmbed.setHydrationPaused(o),this.excalidrawEmbed.setHydrationPaused(o),o){clearTimeout(n),a(null),i(!0);return}t&&(i(!1),this.schedulePreviewLayoutSync({delayMs:0,hydrationPaused:!1,previewLayoutSyncTimer:null,setPendingPreviewLayoutSync:i,setPreviewLayoutSyncTimer:a}))}},Le=class{constructor({attachEditorScroller:e,createEditorSession:t,loadEditorSessionClass:n,scrollContainerForSession:r}){this.attachEditorScroller=e,this.createEditorSession=t,this.loadEditorSessionClass=n,this.scrollContainerForSession=r}async createSession(e){let t=await this.loadEditorSessionClass();return this.createEditorSession(t,e)}attachSessionScroller(e){this.attachEditorScroller(this.scrollContainerForSession(e))}clearSessionScroller(){this.attachEditorScroller(null)}},Re=class{constructor({beginDocumentLoad:e,getDisplayName:t,loadBacklinks:n,onBeforeFileOpen:r,onRenderDrawioPreview:i,onFileOpenError:a,onFileOpenReady:o,onRenderExcalidrawPreview:s,onRenderImagePreview:c,onSyncWrapToggle:l,onUpdateActiveFile:u,onUpdateCurrentFile:d,onUpdateLobbyCurrentFile:f,onUpdateVisibleChrome:p,onViewModeReset:m,renderPresence:h,showEditorLoading:g,stateStore:_}){this.beginDocumentLoad=e,this.getDisplayName=t,this.loadBacklinks=n,this.onBeforeFileOpen=r,this.onRenderDrawioPreview=i,this.onFileOpenError=a,this.onFileOpenReady=o,this.onRenderExcalidrawPreview=s,this.onRenderImagePreview=c,this.onSyncWrapToggle=l,this.onUpdateActiveFile=u,this.onUpdateCurrentFile=d,this.onUpdateLobbyCurrentFile=f,this.onUpdateVisibleChrome=p,this.onViewModeReset=m,this.renderPresence=h,this.showEditorLoading=g,this.stateStore=_}prepareForFileOpen(e,{drawioMode:t=null,resetConnectionState:n=!0}={}){return this.onViewModeReset(),this.onBeforeFileOpen(),this.stateStore.set(`connectionHelpShown`,!1),n&&this.stateStore.set(`connectionState`,{status:`connecting`,unreachable:!1}),this.stateStore.set(`currentDrawioMode`,t??null),this.stateStore.set(`currentFilePath`,e),this.onUpdateCurrentFile(e),this.onUpdateLobbyCurrentFile(e),this.onUpdateActiveFile(e),this.onUpdateVisibleChrome(e,{displayName:this.getDisplayName(e),drawioMode:t,isMarkdown:l(e)}),this.showEditorLoading(),this.beginDocumentLoad(),this.renderPresence(),{supportsBacklinks:u(e)}}markFileOpenReady(e){this.onFileOpenReady(e)}finalizeFileOpen({isDrawio:e=!1,filePath:t,isExcalidraw:n=!1,isImage:r=!1,session:i=null,supportsBacklinks:a}){n&&this.onRenderExcalidrawPreview(t),e&&this.onRenderDrawioPreview(t),r&&this.onRenderImagePreview(t),this.onSyncWrapToggle(),a&&i&&this.loadBacklinks(t)}handleFileOpenError(){this.onFileOpenError()}},ze=150;function Be(e){return new Promise(t=>{setTimeout(t,e)})}var Ve=class{constructor({attachEditorScroller:e,beginDocumentLoad:t,cleanupAfterSessionDestroy:n,createEditorSession:r,getDisplayName:i,getFileList:a,getLineWrappingEnabled:o,getLocalUser:s,getStoredUserName:c,getTheme:l,isDrawioFile:u,isExcalidrawFile:d,isImageFile:f,isMermaidFile:p,isPlantUmlFile:m,isTabActive:h,loadBootstrapContent:g=null,loadEditorSessionClass:_,loadBacklinks:v,onBeforeFileOpen:y,onConnectionChange:b,onContentChange:x,onCommentsChange:S,onFileAwarenessChange:C,onFileOpenError:w,onFileOpenReady:T,onImagePaste:E,onSelectionChange:ee,onSessionAssigned:D=null,onFileOpenMetric:O=null,onRenderExcalidrawPreview:k,onRenderDrawioPreview:A,onRenderImagePreview:j,onSyncWrapToggle:M,onUpdateActiveFile:te,onUpdateCurrentFile:N,onUpdateLobbyCurrentFile:P,onUpdateVisibleChrome:ne,onViewModeReset:re,renderPresence:ie,scrollContainerForSession:F,shouldUseDrawioPreview:ae=null,showEditorLoading:oe,stateStore:I}){this.attachEditorScroller=e,this.beginDocumentLoad=t,this.cleanupAfterSessionDestroy=n,this.createEditorSession=r,this.getDisplayName=i,this.getFileList=a,this.getLineWrappingEnabled=o,this.getLocalUser=s,this.getStoredUserName=c,this.getTheme=l,this.isDrawioFile=u??(()=>!1),this.isExcalidrawFile=d??(()=>!1),this.isImageFile=f??(()=>!1),this.isMermaidFile=p??(()=>!1),this.isPlantUmlFile=m??(()=>!1),this.isTabActive=h,this.loadBootstrapContent=g,this.loadEditorSessionClassPort=_,this.loadBacklinks=v,this.onBeforeFileOpen=y,this.onConnectionChange=b,this.onContentChange=x,this.onCommentsChange=S,this.onFileAwarenessChange=C,this.onFileOpenError=w,this.onFileOpenReady=T,this.onImagePaste=E,this.onSelectionChange=ee,this.onSessionAssigned=D,this.onFileOpenMetric=O,this.onRenderExcalidrawPreview=k,this.onSyncWrapToggle=M,this.onUpdateActiveFile=te,this.onUpdateCurrentFile=N,this.onUpdateLobbyCurrentFile=P,this.onUpdateVisibleChrome=ne,this.renderPresence=ie,this.shouldUseDrawioPreview=ae??(()=>!0),this.stateStore=I,this.session=null,this.lifecycle=new Le({attachEditorScroller:e,createEditorSession:r,loadEditorSessionClass:()=>this.loadEditorSessionClassPort(),scrollContainerForSession:F}),this.chromeController=new Re({beginDocumentLoad:t,getDisplayName:i,loadBacklinks:v,onBeforeFileOpen:y,onRenderDrawioPreview:A,onFileOpenError:w,onFileOpenReady:T,onRenderExcalidrawPreview:k,onRenderImagePreview:j,onSyncWrapToggle:M,onUpdateActiveFile:te,onUpdateCurrentFile:N,onUpdateLobbyCurrentFile:P,onUpdateVisibleChrome:ne,onViewModeReset:re,renderPresence:ie,showEditorLoading:oe,stateStore:I})}getSession(){return this.session}loadEditorSessionClass(){return this.loadEditorSessionClassPort()}waitForNextPaint(){return new Promise(e=>{requestAnimationFrame(()=>{requestAnimationFrame(e)})})}reportFileOpenMetric(e,t,n={}){this.onFileOpenMetric?.(e,{filePath:this.stateStore.get(`currentFilePath`),loadToken:t,...n})}cleanupSession(){this.session?.destroy(),this.session=null,this.lifecycle.clearSessionScroller(),this.cleanupAfterSessionDestroy()}async openFile(e,{drawioMode:t=null}={}){if(!this.isTabActive())return;let n=t??null,r=this.stateStore.get(`currentDrawioMode`)??null,i=this.isDrawioFile(e)&&t!==`text`&&this.shouldUseDrawioPreview(e),a=this.isExcalidrawFile(e),o=this.isImageFile(e),s=this.isMermaidFile(e),c=this.isPlantUmlFile(e);if(e===this.stateStore.get(`currentFilePath`)&&n===r&&(this.session||i||a||o)){this.onUpdateActiveFile(e),this.onUpdateLobbyCurrentFile(e);return}let l=this.stateStore.nextSessionLoadToken(),u=performance.now();this.cleanupSession();let d=this.chromeController.prepareForFileOpen(e,{drawioMode:n,resetConnectionState:!i&&!a&&!o});if(this.reportFileOpenMetric(`open_started`,l,{filePath:e}),i||a||o){if(this.onSessionAssigned?.(null),l!==this.stateStore.get(`sessionLoadToken`))return;this.chromeController.markFileOpenReady(null),this.chromeController.finalizeFileOpen({filePath:e,isDrawio:i,isExcalidraw:a,isImage:o,session:null,supportsBacklinks:d.supportsBacklinks});return}let f=await this.lifecycle.createSession({filePath:e,getFileList:this.getFileList,lineWrappingEnabled:this.getLineWrappingEnabled(),localUser:this.getLocalUser(),onAwarenessChange:e=>this.onFileAwarenessChange(e),onConnectionChange:e=>this.onConnectionChange(e),onCommentsChange:e=>this.onCommentsChange?.(e),onContentChange:()=>{a||this.onContentChange({isMermaid:s,isPlantUml:c})},onImagePaste:e=>this.onImagePaste?.(e),preferredUserName:this.getStoredUserName(),onSelectionChange:e=>this.onSelectionChange?.(e),theme:this.getTheme()});this.session=f,this.onSessionAssigned?.(f);try{let t=!1,n=!1,r=!1,i=async r=>{t||l!==this.stateStore.get(`sessionLoadToken`)||(t=!0,this.lifecycle.attachSessionScroller(f),f.applyTheme(this.getTheme()),this.chromeController.markFileOpenReady(f),this.reportFileOpenMetric(`editor_ready`,l,{reason:r}),f.requestMeasure(),await this.waitForNextPaint(),!(n||l!==this.stateStore.get(`sessionLoadToken`))&&(n=!0,this.chromeController.finalizeFileOpen({filePath:e,isExcalidraw:a,session:f,supportsBacklinks:d.supportsBacklinks})))},o=this.loadBootstrapContent?(async()=>{this.reportFileOpenMetric(`bootstrap_fetch_started`,l);try{let t=await this.loadBootstrapContent(e);return this.reportFileOpenMetric(`bootstrap_fetch_completed`,l,{found:t!==null}),t}catch(e){return this.reportFileOpenMetric(`bootstrap_fetch_completed`,l,{error:e.message,found:!1}),null}})():Promise.resolve(null),s=f.initialize(e),c=(async()=>(await s,l!==this.stateStore.get(`sessionLoadToken`)||(await f.waitForInitialSync(null),l!==this.stateStore.get(`sessionLoadToken`))?!1:(r=!0,f.activateCollaborativeView?.(),this.lifecycle.attachSessionScroller(f),f.applyTheme(this.getTheme()),this.reportFileOpenMetric(`initial_sync_complete`,l),f.ensureInitialContent?.(),t?f.requestMeasure():await i(`live-sync`),!0)))(),p=(async()=>{let n=await o;if(n===null||r||t||l!==this.stateStore.get(`sessionLoadToken`))return!1;let a=performance.now()-u,s=Math.max(0,ze-a);return s>0&&await Promise.race([c.then(e=>e?`live-sync`:`stale`),Be(s).then(()=>`timeout`)])===`live-sync`||r||t||l!==this.stateStore.get(`sessionLoadToken`)||!f.showBootstrapContent({content:n,filePath:e})&&!f.hasBootstrapContent?.()?!1:(this.reportFileOpenMetric(`bootstrap_shown`,l),await i(`bootstrap`),!0)})();if(await s,l!==this.stateStore.get(`sessionLoadToken`)){f.destroy();return}if(await Promise.all([c,p]),l!==this.stateStore.get(`sessionLoadToken`)){f.destroy();return}t||(f.ensureInitialContent?.(),await i(`post-initialize`))}catch(e){if(console.error(`[app] Failed to initialize editor:`,e),f.destroy(),this.lifecycle.clearSessionScroller(),this.session===f&&(this.session=null),l!==this.stateStore.get(`sessionLoadToken`))return;this.chromeController.handleFileOpenError()}}},He=class{constructor(e={}){this.state={activeSidebarTab:`files`,chatInitialSyncComplete:!1,chatIsOpen:!1,chatMessageIds:new Set,chatMessages:[],chatUnreadCount:0,connectionHelpShown:!1,connectionState:{status:`disconnected`,unreachable:!1},currentDrawioMode:null,currentFilePath:null,fileExplorerReady:!1,followedCursorSignature:``,followedUserClientId:null,gitRepoAvailable:!1,globalUsers:[],isTabActive:!1,sessionLoadToken:0,...e}}get(e){return this.state[e]}set(e,t){return this.state[e]=t,t}nextSessionLoadToken(){let e=Number(this.state.sessionLoadToken||0)+1;return this.state.sessionLoadToken=e,e}replaceChatState({initialSyncComplete:e,isOpen:t,messageIds:n,messages:r,unreadCount:i}){this.state.chatMessages=Array.isArray(r)?r:[],this.state.chatMessageIds=n instanceof Set?n:new Set,this.state.chatUnreadCount=Number.isFinite(i)?i:0,this.state.chatIsOpen=!!t,this.state.chatInitialSyncComplete=!!e}};function Ue(e=document){return{currentUserName:e.getElementById(`currentUserName`),chatContainer:e.getElementById(`chatContainer`),chatEmptyState:e.getElementById(`chatEmptyState`),chatForm:e.getElementById(`chatForm`),chatInput:e.getElementById(`chatInput`),chatMessages:e.getElementById(`chatMessages`),chatNotificationButton:e.getElementById(`chatNotificationBtn`),chatPanel:e.getElementById(`chatPanel`),chatStatus:e.getElementById(`chatStatus`),chatToastContainer:e.getElementById(`chatToastContainer`),chatToggleBadge:e.getElementById(`chatToggleBadge`),chatToggleButton:e.getElementById(`chatToggleBtn`),gitCommitCancel:e.getElementById(`gitCommitCancel`),gitCommitCopy:e.getElementById(`gitCommitCopy`),gitCommitDialog:e.getElementById(`gitCommitDialog`),gitCommitForm:e.getElementById(`gitCommitForm`),gitCommitInput:e.getElementById(`gitCommitInput`),gitCommitSubmit:e.getElementById(`gitCommitSubmit`),gitCommitTitle:e.getElementById(`gitCommitTitle`),gitResetCancel:e.getElementById(`gitResetCancel`),gitResetCopy:e.getElementById(`gitResetCopy`),gitResetDialog:e.getElementById(`gitResetDialog`),gitResetFileName:e.getElementById(`gitResetFileName`),gitResetSubmit:e.getElementById(`gitResetSubmit`),gitResetTitle:e.getElementById(`gitResetTitle`),displayNameCancel:e.getElementById(`displayNameCancel`),displayNameCopy:e.getElementById(`displayNameCopy`),displayNameDialog:e.getElementById(`displayNameDialog`),displayNameForm:e.getElementById(`displayNameForm`),displayNameInput:e.getElementById(`displayNameInput`),displayNameSubmit:e.getElementById(`displayNameSubmit`),displayNameTitle:e.getElementById(`displayNameTitle`),editNameButton:e.getElementById(`editNameBtn`),editorFindButton:e.getElementById(`editorFindBtn`),editorContainer:e.getElementById(`editorContainer`),exportDocxButton:e.getElementById(`exportDocxBtn`),exportMenuGroup:e.getElementById(`exportMenuGroup`),exportPdfButton:e.getElementById(`exportPdfBtn`),markdownToolbar:e.getElementById(`markdownToolbar`),editorPage:e.getElementById(`editor-page`),diffPage:e.getElementById(`diff-page`),fileSearch:e.getElementById(`fileSearch`),fileHistoryButton:e.getElementById(`fileHistoryBtn`),fileHistoryButtonLabel:e.getElementById(`fileHistoryBtnLabel`),filesSidebarTab:e.getElementById(`filesSidebarTab`),gitSearch:e.getElementById(`gitSearch`),gitSearchInput:e.getElementById(`gitSearchInput`),gitSidebarTab:e.getElementById(`gitSidebarTab`),gitOperationStatus:e.getElementById(`gitOperationStatus`),lineInfo:e.getElementById(`lineInfo`),mobileViewToggle:e.getElementById(`mobileViewToggle`),previewContent:e.getElementById(`previewContent`),previewContainer:e.getElementById(`previewContainer`),searchFilesButton:e.getElementById(`searchFilesBtn`),shareButton:e.getElementById(`shareBtn`),toastContainer:e.getElementById(`toastContainer`),toggleWrapButton:e.getElementById(`toggleWrapBtn`),userAvatars:e.getElementById(`userAvatars`),userCount:e.getElementById(`userCount`),wrapToggleLabel:e.getElementById(`wrapToggleLabel`),activeFileName:e.getElementById(`activeFileName`),sidebarToggle:e.getElementById(`sidebarToggle`),sidebarClose:e.getElementById(`sidebarClose`),sidebar:e.getElementById(`sidebar`),emptyState:e.getElementById(`emptyState`),emptyStateNewFileBtn:e.getElementById(`emptyStateNewFileBtn`),emptyStateSearchBtn:e.getElementById(`emptyStateSearchBtn`),backlinksPanel:e.getElementById(`backlinksPanel`),backlinksInlinePanel:e.getElementById(`backlinksInlinePanel`),commentSelectionButton:e.getElementById(`commentSelectionBtn`),commentsDrawer:e.getElementById(`commentsDrawer`),commentsDrawerEmpty:e.getElementById(`commentsDrawerEmpty`),commentsDrawerList:e.getElementById(`commentsDrawerList`),commentsToggleButton:e.getElementById(`commentsToggle`),outlineToggle:e.getElementById(`outlineToggle`),tabLockCopy:e.getElementById(`tabLockCopy`),tabLockOverlay:e.getElementById(`tabLockOverlay`),tabLockTakeoverButton:e.getElementById(`tabLockTakeoverBtn`),tabLockTitle:e.getElementById(`tabLockTitle`),toolbarCenter:e.getElementById(`toolbarCenter`),toolbarDiffBadge:e.getElementById(`toolbarDiffBadge`),toolbarOverflowMenu:e.getElementById(`toolbarOverflowMenu`),toolbarOverflowToggle:e.getElementById(`toolbarOverflowToggle`),sidebarTabs:e.getElementById(`sidebarTabs`)}}var We={updateChatMessages(e,{initial:t=!1}={}){let n=new Set(this.chatMessageIds),r=this.lobby.getLocalUser()?.peerId??null;if(this.chatMessages=e,this.chatMessageIds=new Set(e.map(e=>e.id)),!this.chatInitialSyncComplete){t&&(this.chatInitialSyncComplete=!0),this.renderChat();return}let i=e.filter(e=>!n.has(e.id)&&e.peerId&&e.peerId!==r);this.chatIsOpen?this.chatUnreadCount=0:i.length>0&&(this.chatUnreadCount+=i.length);for(let e of i)this.maybeNotifyChatMessage(e);this.renderChat()},toggleChatPanel(){if(this.chatIsOpen){this.closeChatPanel();return}this.openChatPanel()},openChatPanel(){this.chatIsOpen=!0,this.chatUnreadCount=0,this.renderChat(),requestAnimationFrame(()=>{this.elements.chatInput?.focus(),this.scrollChatToBottom()})},closeChatPanel(){this.chatIsOpen&&(this.chatIsOpen=!1,this.renderChat())},handleChatSubmit(){if(!this.isTabActive)return;let e=this.elements.chatInput;if(e){if(!this.lobby.sendChatMessage(e.value)){e.focus();return}if(e.value=``,!this.chatIsOpen){this.openChatPanel();return}this.renderChat()}},renderChat(){this.elements.chatContainer?.classList.toggle(`is-open`,this.chatIsOpen),this.elements.chatPanel?.classList.toggle(`hidden`,!this.chatIsOpen),this.syncChatToggleButton(),this.syncChatNotificationButton();let e=this.elements.chatMessages,t=this.elements.chatEmptyState;if(this.elements.chatStatus&&(this.elements.chatStatus.textContent=this.chatInitialSyncComplete?`${this.globalUsers.length} online`:`Syncing...`),!e)return;if(e.replaceChildren(),this.chatMessages.length===0){t?.classList.remove(`hidden`),e.classList.add(`hidden`);return}t?.classList.add(`hidden`),e.classList.remove(`hidden`);let n=document.createDocumentFragment();this.chatMessages.forEach(e=>{n.appendChild(this.createChatMessageElement(e))}),e.appendChild(n),this.chatIsOpen&&this.scrollChatToBottom()},createChatMessageElement(e){let t=document.createElement(`article`),n=e.peerId===this.lobby.getLocalUser()?.peerId;t.className=`chat-message`,t.classList.toggle(`is-local`,n);let r=document.createElement(`div`);r.className=`chat-message-avatar`,r.style.backgroundColor=e.userColor||`var(--color-primary)`,r.textContent=(e.userName||`?`).charAt(0).toUpperCase(),r.setAttribute(`aria-hidden`,`true`);let i=document.createElement(`div`);i.className=`chat-message-body`;let a=document.createElement(`div`);a.className=`chat-message-meta`;let o=document.createElement(`span`);o.className=`chat-message-author`,o.textContent=n?`${e.userName} (you)`:e.userName;let s=document.createElement(`span`);s.className=`chat-message-time`,s.textContent=this.formatChatTimestamp(e.createdAt),a.append(o,s);let c=this.getChatMessageFileLabel(e.filePath);if(c){let e=document.createElement(`span`);e.className=`chat-message-file`,e.textContent=c,a.append(e)}let l=document.createElement(`p`);return l.className=`chat-message-text`,l.textContent=e.text,i.append(a,l),t.append(r,i),t},scrollChatToBottom(){let e=this.elements.chatMessages;e&&requestAnimationFrame(()=>{e.scrollTop=e.scrollHeight})},formatChatTimestamp(e){if(!Number.isFinite(e))return``;try{return this.chatTimeFormatter.format(new Date(e))}catch{return``}},getChatMessageFileLabel(e){return e?this.getDisplayName(e):``},formatChatToastMessage(e){let t=e?.userName||`Someone`,n=String(e?.text??``).replace(/\s+/g,` `).trim();return`${t}: ${n.length>88?`${n.slice(0,85).trimEnd()}...`:n}`},syncChatToggleButton(){let e=this.elements.chatToggleButton,t=this.elements.chatToggleBadge;if(!e)return;let n=this.chatUnreadCount>0,r=n&&!this.chatIsOpen;e.classList.toggle(`is-active`,this.chatIsOpen),e.classList.toggle(`is-unread`,r),e.setAttribute(`aria-expanded`,String(this.chatIsOpen)),e.setAttribute(`aria-label`,n?`Open team chat, ${this.chatUnreadCount} unread`:`Open team chat`),e.title=this.chatUnreadCount>0?`Team chat (${this.chatUnreadCount} unread)`:`Team chat`,t&&(t.classList.toggle(`hidden`,!n),t.textContent=this.chatUnreadCount>9?`9+`:String(this.chatUnreadCount))},syncChatNotificationButton(){let e=this.elements.chatNotificationButton;if(!e)return;let t=this.notifications.getPermission();this.chatNotificationPermission=t;let n=`Enable alerts`,r=`Enable browser notifications for new chat messages`,i=!1;t===`unsupported`?(n=`No alerts`,r=`Browser notifications are unavailable here`):t===`denied`?(n=`Alerts blocked`,r=`Browser notifications are blocked for this site`):t===`granted`&&(i=this.chatNotificationsEnabled,n=i?`Alerts on`:`Alerts off`,r=i?`Disable browser notifications for chat`:`Enable browser notifications for chat`),e.textContent=n,e.title=r,e.setAttribute(`aria-pressed`,String(i)),e.classList.toggle(`is-enabled`,i),e.classList.toggle(`is-blocked`,t===`denied`)},async handleChatNotificationToggle(){let e=this.notifications.getPermission();if(this.chatNotificationPermission=e,e===`unsupported`){this.toastController.show(`Browser notifications are unavailable here`),this.syncChatNotificationButton();return}if(e===`denied`){this.chatNotificationsEnabled=!1,this.preferences.setChatNotificationsEnabled(!1),this.toastController.show(`Browser notifications are blocked for this site`),this.syncChatNotificationButton();return}if(e===`default`){let e=await this.notifications.requestPermission();if(this.chatNotificationPermission=e,e!==`granted`){this.chatNotificationsEnabled=!1,this.preferences.setChatNotificationsEnabled(!1),e===`denied`&&this.toastController.show(`Browser notifications were blocked`),this.syncChatNotificationButton();return}this.chatNotificationsEnabled=!0,this.preferences.setChatNotificationsEnabled(!0),this.syncChatNotificationButton();return}this.chatNotificationsEnabled=!this.chatNotificationsEnabled,this.preferences.setChatNotificationsEnabled(this.chatNotificationsEnabled),this.syncChatNotificationButton()},maybeNotifyChatMessage(e){if(this.chatInitialSyncComplete){if(document.hidden){this.maybeShowBrowserChatNotification(e);return}!this.isTabActive||this.chatIsOpen||(this.chatToastController??this.toastController).show(this.formatChatToastMessage(e),4e3)}},maybeShowBrowserChatNotification(e){if(!this.chatNotificationsEnabled||this.notifications.getPermission()!==`granted`)return;let t=`CollabMD chat • ${e.userName}`,n=this.getChatMessageFileLabel(e.filePath),r=n?`${n}: ${e.text}`:e.text,i=this.notifications.createNotification({body:r,onClick:()=>{e.filePath&&this.navigation.navigateToFile(e.filePath)},tag:`collabmd-chat-${e.id}`,title:t});i&&setTimeout(()=>{i.close?.()},6e3)}},Ge={getCommentFileKind(e=this.currentFilePath){return g(e)||`markdown`},syncCommentChrome(e=this.currentFilePath){let t=a(e)&&!this.isExcalidrawFile(e);this.commentUi.setCurrentFile(e,{fileKind:this.getCommentFileKind(e),supported:t}),this.handleCommentThreadsChange(this.session?.getCommentThreads?.()??[]),this.handleCommentSelectionChange(this.session?.getCurrentSelectionCommentAnchor?.()??null)},handleCommentSelectionChange(e){this.commentUi.setSelectionAnchor(e)},handleCommentThreadsChange(e=[]){this.commentUi.setThreads(e)},handleCommentEditorContentChange(){this.commentUi.handleEditorContentChange()},refreshCommentUiLayout(){this.commentUi.refreshLayout()}},Ke=`collabmd-export-page`,qe=`collabmd-export-host`,Je=500,Ye=6e4,Xe=new Map,Ze=null;function Qe(){return`export-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function $e(e){return e===`pdf`?`pdf`:`docx`}function et({filePath:e,format:t,jobId:n}){let r=new URL(T(`/export-document.html`),window.location.origin);return r.searchParams.set(`action`,$e(t)),r.searchParams.set(`job`,n),e&&r.searchParams.set(`file`,e),r.toString()}function tt({fileList:e=[],filePath:t,format:n,jobId:r,markdownText:i=``,title:a=``}){return{action:$e(n),fileList:Array.isArray(e)?e.slice():[],filePath:String(t??``),jobId:r,markdownText:String(i??``),source:qe,title:String(a??``),type:`bootstrap`}}function nt(e){e&&(e.closePollId&&window.clearInterval(e.closePollId),e.timeoutId&&window.clearTimeout(e.timeoutId))}function rt(e,{notifyError:t=!1,message:n=``}={}){let r=Xe.get(e);r&&(nt(r),Xe.delete(e),t&&n&&Ze?.(n))}function it({onError:e=null}={}){Ze=typeof e==`function`?e:null,!window.__collabmdExportBridgeInitialized&&(window.addEventListener(`message`,e=>{if(e.origin!==window.location.origin)return;let t=e.data;if(!t||t.source!==Ke)return;let n=String(t.jobId??``).trim();if(!n)return;let r=Xe.get(n);if(r){if(t.type===`ready`){if(r.window?.closed){rt(n,{message:`Export window was closed before the export completed`,notifyError:!0});return}try{r.window?.postMessage(r.payload,window.location.origin)}catch(e){rt(n,{message:e instanceof Error?e.message:`Failed to send export data`,notifyError:!0})}return}(t.type===`complete`||t.type===`error`)&&rt(n,{message:t.type===`error`&&t.message?String(t.message):``,notifyError:t.type===`error`&&!!t.message})}}),window.__collabmdExportBridgeInitialized=!0)}async function at({fileList:e=[],filePath:t,format:n,markdownText:r=``,title:i=``}={}){let a=String(t??``).trim();if(!a)throw Error(`No markdown note is open`);let o=Qe(),s=et({filePath:a,format:n,jobId:o}),c=window.open(s,`_blank`);if(!c)throw Error(`Export popup was blocked`);return Xe.set(o,{closePollId:window.setInterval(()=>{c.closed&&rt(o,{message:`Export window was closed before the export completed`,notifyError:!0})},Je),payload:tt({fileList:e,filePath:a,format:n,jobId:o,markdownText:r,title:i}),timeoutId:window.setTimeout(()=>{rt(o,{message:`Export timed out before it completed`,notifyError:!0})},Ye),window:c}),c.focus?.(),o}var ot={initializeExportBridge(){this._exportBridgeInitialized||=(it({onError:e=>{this.toastController?.show(e)}}),!0)},async handleExportRequest(e){let t=String(this.currentFilePath??``).trim();if(!l(t))return this.toastController?.show(`Export is available for markdown notes only`),!1;try{return await at({fileList:this.fileExplorer?.flatDocumentFiles??[],filePath:t,format:e,markdownText:this.session?.getText?.()??``,title:this.getDisplayName(t)}),!0}catch(e){return this.toastController?.show(e instanceof Error?e.message:`Failed to start export`),!1}}};function st(e=[]){return Array.from(new Set((e??[]).filter(Boolean)))}function ct(e=[]){return Array.from(new Map((e??[]).filter(e=>e?.oldPath&&e?.newPath&&e.oldPath!==e.newPath).map(e=>[`${e.oldPath}:${e.newPath}`,{newPath:e.newPath,oldPath:e.oldPath}])).values())}function lt(e=[]){return(e??[]).filter(e=>e?.path&&Number.isFinite(e?.from)&&Number.isFinite(e?.to)).map(e=>({from:Math.max(0,Math.round(e.from)),path:e.path,to:Math.max(0,Math.round(e.to))}))}function ut({changedPaths:e=[],deletedPaths:t=[],refreshExplorer:n=!0,renamedPaths:r=[]}={}){return{changedPaths:st(e),deletedPaths:st(t),refreshExplorer:n!==!1,renamedPaths:ct(r)}}function dt(e){return!e||typeof e!=`object`||typeof e.id!=`string`?null:{action:typeof e.action==`string`?e.action:`workspace`,createdAt:Number.isFinite(e.createdAt)?e.createdAt:Date.now(),highlightRanges:lt(e.highlightRanges),id:e.id,origin:typeof e.origin==`string`?e.origin:`api`,reloadRequiredPaths:st(e.reloadRequiredPaths),requestId:typeof e.requestId==`string`?e.requestId:null,sourceRef:typeof e.sourceRef==`string`?e.sourceRef:null,workspaceChange:ut(e.workspaceChange)}}function ft(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`workspace-${Date.now()}-${Math.random().toString(16).slice(2,10)}`}function pt(e={}){return ut(e)}var mt={formatPullBackupToast(e=null){let t=Number(e?.fileCount||0);return t===1?`Pulled latest changes. 1 overlapping local file was backed up.`:t>1?`Pulled latest changes. ${t} overlapping local files were backed up.`:`Pulled latest changes. Overlapping local changes were recorded in a pull backup.`},setGitOperationStatus(e=``){let t=this.elements.gitOperationStatus;if(!t)return;let n=String(e??``).trim();t.textContent=n,t.classList.toggle(`hidden`,!n)},async runGitActionWithStatus(e,t){this.setGitOperationStatus(e);try{return await t()}finally{this.setGitOperationStatus(``)}},handleGitDiffSelection(e,{closeSidebarOnMobile:t=!1,scope:n=`working-tree`}={}){t&&this.closeSidebarOnMobile(),this.navigation.navigateToGitDiff({filePath:e,scope:n})},handleGitCommitSelection(e,{closeSidebarOnMobile:t=!1,historyFilePath:n=null,path:r=null}={}){t&&this.closeSidebarOnMobile(),this.navigation.navigateToGitCommit({hash:e,historyFilePath:n,path:r})},handleGitHistorySelection({closeSidebarOnMobile:e=!1}={}){e&&this.closeSidebarOnMobile(),this.navigation.navigateToGitHistory()},handleGitFileHistorySelection(e=this.currentFilePath,{closeSidebarOnMobile:t=!1}={}){t&&this.closeSidebarOnMobile(),e&&this.navigation.navigateToGitFileHistory({filePath:e})},handleGitFilePreviewSelection({hash:e,path:t,currentFilePath:n=null,closeSidebarOnMobile:r=!1}={}){r&&this.closeSidebarOnMobile(),!(!e||!t)&&this.navigation.navigateToGitFilePreview({hash:e,path:t,currentFilePath:n})},handleGitRepoChange(e,t=null){this.gitRepoAvailable=!!e,this.elements.sidebarTabs?.classList.toggle(`hidden`,!this.gitRepoAvailable),this.elements.gitSidebarTab?.classList.toggle(`hidden`,!this.gitRepoAvailable);let n=e&&t?.summary?.changedFiles>0;if(this.elements.gitSidebarTab?.classList.toggle(`has-changes`,n),this.gitDiffView.setRepoStatus(this.gitRepoAvailable?t:null),!this.gitRepoAvailable&&this.activeSidebarTab===`git`){this.syncFileHistoryButton({mode:this.navigation.getHashRoute().type===`git-file-preview`?`history-preview`:`editor`}),this.setSidebarTab(`files`);return}let r=this.navigation.getHashRoute().type;this.gitRepoAvailable&&(r===`git-diff`||r===`git-commit`||r===`git-history`)&&this.activeSidebarTab!==`git`&&this.setSidebarTab(`git`),this.syncFileHistoryButton({filePath:this.currentFilePath,mode:r===`git-file-preview`?`history-preview`:r===`file`?`editor`:`empty`})},syncFileHistoryButton({filePath:e=this.currentFilePath,mode:t=`editor`}={}){let n=this.elements.fileHistoryButton,r=this.elements.fileHistoryButtonLabel;if(!(!n||!r)){if(!(this.gitRepoAvailable&&this.supportsFileHistory?.(e))){n.classList.add(`hidden`);return}if(n.classList.remove(`hidden`),t===`history-preview`){r.textContent=`Back to History`,n.setAttribute(`aria-label`,`Back to file history`),n.title=`Back to file history`;return}if(t!==`editor`){n.classList.add(`hidden`);return}r.textContent=`History`,n.setAttribute(`aria-label`,`Open file history`),n.title=`View file history`}},syncMainChrome({badgeLabel:e=``,mode:t,title:n=null}={}){let r=t===`diff`||t===`history`||t===`history-preview`;this.elements.toolbarCenter?.classList.toggle(`hidden`,r),this.elements.mobileViewToggle?.classList.toggle(`hidden`,r),this.elements.userCount?.classList.toggle(`hidden`,r),this.elements.toolbarDiffBadge?.classList.toggle(`hidden`,!e),this.elements.toolbarDiffBadge&&(this.elements.toolbarDiffBadge.textContent=e),n&&this.elements.activeFileName&&(this.elements.activeFileName.textContent=n),this.syncFileHistoryButton({filePath:this.currentFilePath,mode:t})},async showGitDiff({filePath:e=null,scope:t=`all`}={}){this.clearStaticPreviewDocument?.(),this.gitPanel.setSelection(e?{path:e,scope:t,source:`workspace`}:{}),this.gitPanel.setMode(`changes`),this.showDiffState(),this.syncMainChrome({badgeLabel:`Diff`,mode:`diff`,title:this.gitDiffView.getToolbarTitle({filePath:e,scope:t})}),this.syncFileHistoryButton({filePath:e,mode:`diff`}),await this.gitDiffView.openWorkspaceDiff({filePath:e,scope:t})},async showGitCommit({hash:e,path:t=null,historyFilePath:n=null}={}){this.clearStaticPreviewDocument?.(),this.gitPanel.setMode(`history`),this.gitPanel.setSelection(e?{commitHash:e,path:t,source:`commit`}:{source:`commit`}),this.showDiffState(),this.syncMainChrome({badgeLabel:`Diff`,mode:`diff`,title:this.gitDiffView.getToolbarTitle({commitHash:e,path:t,source:`commit`})}),this.syncFileHistoryButton({filePath:t,mode:`diff`}),await this.gitDiffView.openCommitDiff({hash:e,historyFilePath:n,path:t})},async showGitHistory(){this.clearStaticPreviewDocument?.(),this.gitPanel.setMode(`history`),this.gitPanel.setSelection({source:`commit`}),this.workspaceRouteController?.showEmptyState?.(),this.syncMainChrome({mode:`empty`,title:`Git History`}),this.syncFileHistoryButton({mode:`empty`})},async showGitFileHistory({filePath:e=null}={}){if(!e){this.workspaceRouteController?.showEmptyState?.();return}this.clearStaticPreviewDocument?.(),this.commentUi?.attachSession?.(null),this.commentUi?.setCurrentFile?.(e,{fileKind:this.getCommentFileKind(e),supported:!1}),this.handleCommentThreadsChange?.([]),this.handleCommentSelectionChange?.(null),this.workspaceRouteController?.showFileHistoryState?.(e),this.syncMainChrome({badgeLabel:`History`,mode:`history`,title:this.getDisplayName(e)}),this.syncFileHistoryButton({filePath:e,mode:`history`}),await this.fileHistoryView.openFileHistory({filePath:e})},async showGitFilePreview({hash:e,filePath:t=null,currentFilePath:n=null}={}){let r=String(n??``).trim()||t;if(!e||!t||!r){this.workspaceRouteController?.showEmptyState?.();return}this.commentUi?.attachSession?.(null),this.commentUi?.setCurrentFile?.(r,{fileKind:this.getCommentFileKind(r),supported:!1}),this.handleCommentThreadsChange?.([]),this.handleCommentSelectionChange?.(null),this.workspaceRouteController?.showPreviewOnlyState?.(r),this.layoutController.setView(`preview`,{persist:!1}),this.syncMainChrome({badgeLabel:`History Preview`,mode:`history-preview`,title:this.getDisplayName(r)}),this.syncFileHistoryButton({filePath:r,mode:`history-preview`});try{let n=new URLSearchParams;n.set(`hash`,e),n.set(`path`,t);let i=await fetch(D(`/git/file-snapshot?${n.toString()}`)),a=await i.json();if(!i.ok)throw Error(a.error||`Failed to load historical file preview`);if(this.setStaticPreviewDocument?.({...a,currentFilePath:r}),this.resetPreviewMode(),this.elements.markdownToolbar?.classList.add(`hidden`),this.elements.outlineToggle?.classList.toggle(`hidden`,a.fileKind!==`markdown`),a.fileKind===`markdown`||a.fileKind===`mermaid`||a.fileKind===`plantuml`){a.fileKind===`mermaid`?this.elements.previewContent?.classList.add(`is-mermaid-file-preview`):a.fileKind===`plantuml`&&this.elements.previewContent?.classList.add(`is-plantuml-file-preview`),this.previewRenderer.beginDocumentLoad(),this.previewRenderer.queueRender();return}this.elements.outlineToggle?.classList.add(`hidden`),this.renderTextFilePreview({content:a.content,filePath:r})}catch(e){console.error(`[git-preview] Failed to load file snapshot:`,e),this.clearStaticPreviewDocument?.(),this.toastController.show(`Failed to load historical file preview`),this.renderTextFilePreview({content:`Failed to load historical file preview.`,filePath:r}),this.elements.outlineToggle?.classList.add(`hidden`)}},async postGitAction(e,t){let n=ft();this.pendingWorkspaceRequestIds?.add(n);try{let r=await fetch(e,{body:JSON.stringify(t),headers:{"Content-Type":`application/json`,"X-CollabMD-Request-Id":n},method:`POST`}),i=await r.json();if(!r.ok){this.pendingWorkspaceRequestIds?.delete(n);let e=Error(i.error||`Git action failed`);throw typeof i?.code==`string`&&(e.code=i.code),e}return i}catch(e){throw this.pendingWorkspaceRequestIds?.delete(n),e}},async refreshWorkspaceAfterGitAction({filePath:e=null,preferredScope:t=null}={}){await this.fileExplorer.refresh(),await this.refreshGitAfterAction({filePath:e,preferredScope:t})},async refreshGitAfterAction({filePath:e=null,preferredScope:t=null}={}){await this.gitPanel.refresh({force:!0});let n=this.navigation.getHashRoute();if(n.type===`git-history`){await this.showGitHistory();return}if(n.type===`git-file-history`){await this.showGitFileHistory({filePath:n.filePath});return}if(n.type===`git-file-preview`){await this.showGitFilePreview({hash:n.hash,filePath:n.filePath,currentFilePath:n.currentFilePath});return}if(n.type===`git-commit`){await this.showGitCommit({hash:n.hash,path:n.path,historyFilePath:n.historyFilePath});return}if(n.type!==`git-diff`)return;let r=e??n.filePath,i=t??n.scope;if(i!==n.scope||r!==n.filePath){this.navigation.navigateToGitDiff({filePath:r,scope:i});return}await this.showGitDiff({filePath:n.filePath,scope:n.scope})},async finalizeGitAction({action:e,filePath:t=null,preferredScope:n=null,result:r={},showLocalFileToast:i=!1}={}){let a=pt(r.workspaceChange);return await this.refreshWorkspaceAfterGitAction({filePath:t,preferredScope:n}),this.handleWorkspaceChangeForCurrentFile(a,{action:e,local:!0,showToast:i}),a},handleWorkspaceChangeForCurrentFile(e,{action:t=`git`,local:n=!1,showToast:r=!0}={}){let i=this.currentFilePath;if(!i)return!1;let a=e.deletedPaths.includes(i),o=e.renamedPaths.find(e=>e.oldPath===i);if(!a&&!o)return!1;if(!r)return o?this.navigation.navigateToFile(o.newPath):this.navigation.navigateToFile(null),!0;let s=this.getDisplayName(i);return o?(this.navigation.navigateToFile(o.newPath),this.toastController.show(n?`${s} moved to ${this.getDisplayName(o.newPath)}`:`${s} moved on disk`),!0):(this.navigation.navigateToFile(null),this.toastController.show(n?`${s} was removed by ${t}`:`${s} was removed after a ${t} operation`),!0)},async handleIncomingWorkspaceEvent(e){if(!this.isTabActive||!e)return;if(e.requestId&&this.pendingWorkspaceRequestIds?.has(e.requestId)){this.pendingWorkspaceRequestIds.delete(e.requestId);return}let t=pt(e.workspaceChange);if(e.origin===`git`&&await this.refreshGitAfterAction(),this.handleWorkspaceChangeForCurrentFile(t,{action:e.action||e.origin||`workspace`,local:!1,showToast:!0}),e.origin===`filesystem`&&this.currentFilePath&&t.changedPaths.includes(this.currentFilePath)){let n=t.changedPaths.length===1&&Array.isArray(e.highlightRanges)?e.highlightRanges.find(e=>e.path===this.currentFilePath):null;n&&this.session?.flashExternalUpdate?.(n)||this.toastController.show(`${this.getDisplayName(this.currentFilePath)} updated from disk`)}this.currentFilePath&&Array.isArray(e.reloadRequiredPaths)&&e.reloadRequiredPaths.includes(this.currentFilePath)&&this.toastController.show(`${this.getDisplayName(this.currentFilePath)} needs a manual reload`)},async stageGitFile(e,{scope:t=`working-tree`}={}){e&&await this.runGitActionWithStatus(`Staging changes...`,async()=>{let n=await this.postGitAction(D(`/git/stage`),{path:e});await this.finalizeGitAction({action:`stage`,filePath:e,preferredScope:t===`all`?`all`:`staged`,result:n})})},async unstageGitFile(e,{scope:t=`staged`}={}){e&&await this.runGitActionWithStatus(`Unstaging changes...`,async()=>{let n=await this.postGitAction(D(`/git/unstage`),{path:e});await this.finalizeGitAction({action:`unstage`,filePath:e,preferredScope:t===`all`?`all`:`working-tree`,result:n})})},async pushGitBranch(){await this.runGitActionWithStatus(`Pushing branch...`,async()=>{try{let e=await this.postGitAction(D(`/git/push`),{});await this.finalizeGitAction({action:`push`,result:e})}catch(e){this.toastController.show(e.message||`Failed to push branch`)}})},async pullGitBranch(){await this.runGitActionWithStatus(`Pulling branch...`,async()=>{try{let e=await this.postGitAction(D(`/git/pull`),{});await this.finalizeGitAction({action:`pull`,result:e,showLocalFileToast:!0}),e.pullBackup&&this.toastController.show(this.formatPullBackupToast(e.pullBackup),5e3)}catch(e){if(e?.code===`pull_diverged_ff_only`){this.toastController.show(`Cannot pull because local and remote commits have diverged. Fast-forward only pull is not possible.`,5e3);return}if(e?.code===`pull_conflicted_after_autostash`){this.toastController.show(`Pull updated the branch, but reapplying local changes caused conflicts. Review the conflicted files and the pull backup summary.`,6e3);return}this.toastController.show(e.message||`Failed to pull branch`)}})},openGitResetDialog(e){if(!this.isTabActive||!e)return;let t=this.elements.gitResetDialog;!t||!this.elements.gitResetFileName||(this.pendingGitResetPath=e,this.elements.gitResetTitle&&(this.elements.gitResetTitle.textContent=`Reset file to current branch`),this.elements.gitResetCopy&&(this.elements.gitResetCopy.textContent=`Restore this file from the current checked-out branch. If this branch does not contain the file, the file will be deleted locally.`),this.elements.gitResetFileName.value=e,this.elements.gitResetSubmit&&(this.elements.gitResetSubmit.textContent=`Reset File`),this.elements.gitResetSubmit?.toggleAttribute(`disabled`,!1),!t.open&&(typeof t.showModal==`function`?t.showModal():t.setAttribute(`open`,`true`)))},async handleGitResetSubmit(){let e=this.pendingGitResetPath,t=this.elements.gitResetDialog,n=this.elements.gitResetSubmit;if(!(!e||!t)){n?.toggleAttribute(`disabled`,!0),n&&(n.textContent=`Resetting...`);try{await this.runGitActionWithStatus(`Resetting file...`,async()=>{let t=await this.postGitAction(D(`/git/reset-file`),{path:e});await this.finalizeGitAction({action:`reset`,filePath:e,result:t,showLocalFileToast:!0})}),t.close()}catch(e){this.toastController.show(e.message||`Failed to reset file`)}finally{n&&(n.textContent=`Reset File`),n?.toggleAttribute(`disabled`,!1)}}},openGitCommitDialog(){if(!this.isTabActive)return;let e=this.elements.gitCommitDialog,t=this.elements.gitCommitInput;if(!(!e||!t)){if(this.elements.gitCommitTitle&&(this.elements.gitCommitTitle.textContent=`Commit staged changes`),this.elements.gitCommitCopy){let e=Number(this.gitPanel.status?.summary?.staged||0);this.elements.gitCommitCopy.textContent=e>0?`${e} staged file${e===1?``:`s`} will be included.`:`All staged changes will be included.`}this.elements.gitCommitSubmit&&(this.elements.gitCommitSubmit.textContent=`Commit staged changes`),t.value=``,!e.open&&(typeof e.showModal==`function`?e.showModal():e.setAttribute(`open`,`true`),requestAnimationFrame(()=>{t.focus(),t.select()}))}},async handleGitCommitSubmit(){let e=this.elements.gitCommitDialog,t=this.elements.gitCommitInput,n=this.elements.gitCommitSubmit,r=String(t?.value??``).trim();if(!(!e||!t)){if(!r){t.focus(),this.toastController.show(`Commit message cannot be empty`);return}n?.toggleAttribute(`disabled`,!0),n&&(n.textContent=`Committing...`);try{await this.runGitActionWithStatus(`Committing changes...`,async()=>{let e=await this.postGitAction(D(`/git/commit`),{message:r});await this.finalizeGitAction({action:`commit`,result:e})}),e.close()}catch(e){this.toastController.show(e.message||`Failed to commit staged changes`)}finally{n&&(n.textContent=`Commit staged changes`),n?.toggleAttribute(`disabled`,!1)}}}},ht={updateGlobalUsers(e){this.globalUsers=e,this.syncFollowedUser(),this.renderAvatars(),this.renderChat(),this.renderPresence(),this.syncCurrentUserName()},updateFileAwareness(e){this.syncFollowedUser()},renderPresence(){let e=this.elements.userCount;if(!e)return;let t=!!this.session,n=!!(this.currentFilePath&&this.isExcalidrawFile?.(this.currentFilePath)),r=!!(this.currentFilePath&&this.isImageFile?.(this.currentFilePath)),i=!t&&(!this.currentFilePath||n||r)?this.lobby?.getConnectionState?.()??this.connectionState:this.connectionState;if(i.status===`connected`){e.textContent=`${this.globalUsers.length} online`,e.style.opacity=`1`;return}if(i.status===`connecting`){e.textContent=i.unreachable?`Unreachable`:`Connecting...`,e.style.opacity=`0.6`;return}e.textContent=`Offline`,e.style.opacity=`0.6`},renderAvatars(){let e=this.elements.userAvatars;if(!e)return;e.innerHTML=``;let t=[...this.globalUsers],n=t.findIndex(e=>e.isLocal);if(n>0){let[e]=t.splice(n,1);t.unshift(e)}let r=t.findIndex(e=>!e.isLocal&&e.clientId===this.followedUserClientId),i=t[0]?.isLocal?1:0;if(r>i){let[e]=t.splice(r,1);t.splice(i,0,e)}if(t.slice(0,5).forEach(t=>{let n=document.createElement(t.isLocal?`div`:`button`);n.className=`user-avatar`,n.classList.toggle(`is-local`,t.isLocal),n.style.backgroundColor=t.color,n.classList.toggle(`is-following`,t.clientId===this.followedUserClientId);let r=document.createElement(`span`);r.className=`user-avatar-initial`,r.textContent=t.name.charAt(0).toUpperCase(),n.appendChild(r);let i=t.currentFile&&t.currentFile===this.currentFilePath,a=t.currentFile?this.getDisplayName(t.currentFile):`No file`;if(t.isLocal){let e=document.createElement(`span`);e.className=`user-avatar-self-label`,e.textContent=`You`,n.appendChild(e),n.title=`${t.name} (you) — ${a}`,n.setAttribute(`role`,`img`),n.setAttribute(`aria-label`,`${t.name} (you) — ${a}`)}else{n.type=`button`,n.classList.add(`user-avatar-button`),i||n.classList.add(`different-file`);let e=t.clientId===this.followedUserClientId?`Stop following ${t.name}`:i?`Follow ${t.name}`:`Follow ${t.name} — ${a}`;n.title=e,n.setAttribute(`aria-label`,e),n.addEventListener(`click`,()=>this.toggleFollowUser(t.clientId))}e.appendChild(n)}),t.length>5){let n=document.createElement(`div`);n.className=`user-avatar`,n.style.backgroundColor=`var(--color-surface-dynamic)`,n.style.color=`var(--color-text-muted)`;let r=document.createElement(`span`);r.className=`user-avatar-initial`,r.textContent=`+${t.length-5}`,n.appendChild(r),e.appendChild(n)}},toggleFollowUser(e){if(!e)return;if(this.followedUserClientId===e){this.stopFollowingUser();return}let t=this.globalUsers.find(t=>t.clientId===e&&!t.isLocal);if(t){if(this.followedUserClientId=e,this.followedCursorSignature=``,this.renderAvatars(),t.currentFile&&t.currentFile!==this.currentFilePath){this.navigation.navigateToFile(t.currentFile);return}requestAnimationFrame(()=>{this.followedUserClientId===e&&this.followUserCursor(t,{force:!0})})}},stopFollowingUser(){this.followedUserClientId&&(this.currentFilePath&&this.isExcalidrawFile?.(this.currentFilePath)&&this.excalidrawEmbed?.setFollowedUser(this.currentFilePath,null),this.followedUserClientId=null,this.followedCursorSignature=``,this.renderAvatars())},syncFollowedUser(){if(!this.followedUserClientId)return;let e=this.globalUsers.find(e=>e.clientId===this.followedUserClientId);if(!e||e.isLocal){this.stopFollowingUser();return}if(e.currentFile&&e.currentFile!==this.currentFilePath){this.navigation.navigateToFile(e.currentFile);return}this.followUserCursor(e)},followUserCursor(e,{force:t=!1}={}){if(this.currentFilePath&&this.isExcalidrawFile?.(this.currentFilePath)){this.followExcalidrawUser(e,{force:t});return}let n=this.resolveFileClientId(e.peerId),r=n==null?null:this.session?.getUserViewport(n),i=n==null?null:this.session?.getUserCursor(n),a=i?.cursorHead??null,o=i?.cursorLine??null,s=i?.cursorAnchor??null,c=r?.topLine??null,l=r?.viewportRatio??.35;if(!e||c==null&&(a==null||o==null)){this.followedCursorSignature=``;return}let u=`${e.clientId}:${c??`no-viewport`}:${s??`no-anchor`}:${a??`no-head`}`;!t&&u===this.followedCursorSignature||(n!=null&&this.session?.scrollToUserViewport(n)||n!=null&&this.session?.scrollToUserCursor(n,`center`)||a!=null&&this.session?.scrollToPosition(a,`center`)||o!=null&&this.session?.scrollToLine(o,l))&&(this.followedCursorSignature=u)},followExcalidrawUser(e,{force:t=!1}={}){if(!e?.peerId||!this.currentFilePath){this.followedCursorSignature=``;return}let n=`excalidraw:${this.currentFilePath}:${e.peerId}`;!t&&n===this.followedCursorSignature||Promise.resolve(this.excalidrawEmbed?.setFollowedUser(this.currentFilePath,e.peerId)).then(t=>{t===!1||this.followedUserClientId!==e.clientId||(this.followedCursorSignature=n)}).catch(()=>{})},resolveFileClientId(e){if(!e||!this.session?.awareness)return null;for(let[t,n]of this.session.awareness.getStates())if(n.user?.peerId===e)return t;return null}};function gt(){return this.runtimeConfig?.auth?.strategy===`oidc`&&this.runtimeConfig?.auth?.provider===`google`}function _t({mode:e=`edit`}={}){if(this.isIdentityManagedByAuth()||!this.isTabActive)return;let t=this.elements.displayNameDialog,n=this.elements.displayNameInput,r=this.elements.displayNameTitle,i=this.elements.displayNameCopy,a=this.elements.displayNameCancel,o=this.elements.displayNameSubmit;if(!t||!n)return;let s=e===`onboarding`;r&&(r.textContent=s?`Choose your display name`:`Update display name`),i&&(i.textContent=s?`Pick a name collaborators will see. You can skip for now and continue as a guest.`:`Your name will be visible to everyone editing this vault.`),a&&(a.textContent=s?`Skip for now`:`Cancel`),o&&(o.textContent=s?`Continue`:`Save name`),n.value=s?``:this.getCurrentUserName(),!t.open&&(typeof t.showModal==`function`?t.showModal():t.setAttribute(`open`,`true`),requestAnimationFrame(()=>{n.focus(),n.select()}))}function vt(){!this.isTabActive||this._hasPromptedForDisplayName||this.getStoredUserName()||this.isIdentityManagedByAuth()||(this._hasPromptedForDisplayName=!0,requestAnimationFrame(()=>{this.openDisplayNameDialog({mode:`onboarding`})}))}function yt(){if(this.isIdentityManagedByAuth())return;let e=this.elements.displayNameInput,t=this.elements.displayNameDialog;if(!e||!t)return;let n=this.session?this.session.setUserName(e.value):ge(e.value);if(!n){e.focus(),this.toastController.show(`Name must be 1-24 characters`);return}this.preferences.setUserName(n),this.lobby.setUserName(n);let r=this.lobby.getLocalUser();this.drawioEmbed?.updateLocalUser(r),this.excalidrawEmbed?.updateLocalUser(r),this.syncCurrentUserName(),this.renderChat(),t.close()}function bt(){return this.globalUsers.find(e=>e.isLocal)??this.session?.getLocalUser()??this.lobby?.getLocalUser()??null}function xt(){return this.getCurrentUser()?.name??this.getStoredUserName()??``}function St(){return this.preferences.getUserName()}function Ct(){let e=this.elements.currentUserName;if(!e)return;let t=this.getCurrentUserName();e.textContent=t||`Set name`,e.classList.toggle(`has-name`,!!t),this.isIdentityManagedByAuth()||this.elements.editNameButton?.setAttribute(`aria-label`,`${t||`Set name`}. Change display name`)}function wt(){let e=this.isIdentityManagedByAuth();this.elements.editNameButton?.classList.toggle(`hidden`,e),this.elements.editNameButton?.toggleAttribute(`disabled`,e),e&&this.elements.displayNameDialog?.open&&this.elements.displayNameDialog.close()}var Tt={getCurrentUser:bt,getCurrentUserName:xt,getStoredUserName:St,handleDisplayNameSubmit:yt,isIdentityManagedByAuth:gt,openDisplayNameDialog:_t,promptForDisplayNameIfNeeded:vt,syncCurrentUserName:Ct,syncIdentityManagementUi:wt},Et=0;function Dt(){this.initializeExportBridge?.(),this.renderMarkdownToolbar?.(),this.initializeVisualViewportBinding?.(),this.themeController.initialize(),this.previewRenderer.applyTheme(this.themeController.getTheme()),this.previewRenderer.scheduleWorkerPrewarm(),this.scheduleEditorSessionPrewarm?.(),this.outlineController.initialize(),this.layoutController.initialize(),this.scrollSyncController.initialize(),this.fileExplorer.initialize(),this.gitPanel.initialize(),this.gitDiffView.initialize(),this.fileHistoryView.initialize(),this.initializePreviewLayoutObserver(),this.syncIdentityManagementUi(),this.syncCurrentUserName(),this.syncWrapToggle(),this.syncToolbarOverflowVisibility?.(),this.syncChatNotificationButton(),this.syncFileHistoryButton({mode:`empty`}),this.renderChat(),this.gitPanel.refresh({force:!0}),this.elements.chatInput?.setAttribute(`maxlength`,String(this.lobbyChatMessageMaxLength)),this.bindEvents(),this.restoreSidebarState(),this.initializeVersionMonitoring(),this.tabActivityLock.initialize(),this.tabActivityLock.tryActivate(),window.addEventListener(`hashchange`,()=>this.handleHashChange());let e=this.createResizeHandler();window.addEventListener(`resize`,()=>{e(),this.syncToolbarOverflowVisibility?.()}),this.fileExplorerReadyPromise=this.fileExplorer.refresh().then(()=>{if(this.fileExplorerReady=!0,this.isTabActive)return this.handleHashChange()})}function Ot(){this.versionMonitor?.start()}function kt(){let e=document.documentElement,t=window.visualViewport;if(e){if(!t){e.style.setProperty(`--app-viewport-height`,`100dvh`),e.style.setProperty(`--app-viewport-offset-top`,`0px`);return}e.style.setProperty(`--app-viewport-height`,`${Math.round(t.height)}px`),e.style.setProperty(`--app-viewport-offset-top`,`${Math.round(t.offsetTop)}px`)}}function At(){this.syncVisualViewportBounds?.();let e=window.visualViewport;if(!e)return;let t=()=>this.syncVisualViewportBounds?.();e.addEventListener(`resize`,t,{passive:!0}),e.addEventListener(`scroll`,t,{passive:!0}),window.addEventListener(`orientationchange`,t)}function jt(e=null){if(this._reloadPromptShown)return;this._reloadPromptShown=!0;let t=String(e?.build?.packageVersion??this.runtimeConfig?.build?.packageVersion??``).trim(),n=t?`Version ${t} is available. Reload to update.`:`A new version is available. Reload to update.`;this.toastController.show(n,{actionLabel:`Reload`,dismissible:!0,duration:Et,onAction:()=>window.location.reload()})}function Mt(){this.elements.emptyStateNewFileBtn?.addEventListener(`click`,()=>{this.fileExplorer.actionController.openRootCreateMenu({anchor:this.elements.emptyStateNewFileBtn})}),this.elements.emptyStateSearchBtn?.addEventListener(`click`,()=>{this.toggleQuickSwitcher()}),this.elements.chatToggleButton?.addEventListener(`click`,()=>{this.toggleChatPanel(),this.closeToolbarOverflowMenu?.()}),this.elements.chatForm?.addEventListener(`submit`,e=>{e.preventDefault(),this.handleChatSubmit()}),this.elements.chatNotificationButton?.addEventListener(`click`,()=>{this.handleChatNotificationToggle()}),this.elements.shareButton?.addEventListener(`click`,()=>{this.copyCurrentLink(),this.closeToolbarOverflowMenu?.()}),this.elements.searchFilesButton?.addEventListener(`click`,()=>{this.toggleQuickSwitcher(),this.closeToolbarOverflowMenu?.()}),this.elements.exportDocxButton?.addEventListener(`click`,()=>{this.handleExportRequest?.(`docx`),this.closeToolbarOverflowMenu?.()}),this.elements.exportPdfButton?.addEventListener(`click`,()=>{this.handleExportRequest?.(`pdf`),this.closeToolbarOverflowMenu?.()}),this.elements.fileHistoryButton?.addEventListener(`click`,()=>{let e=this.navigation.getHashRoute();if(e.type===`git-file-preview`){this.handleGitFileHistorySelection(e.currentFilePath??e.filePath,{closeSidebarOnMobile:!0}),this.closeToolbarOverflowMenu?.();return}this.handleGitFileHistorySelection(this.currentFilePath,{closeSidebarOnMobile:!0}),this.closeToolbarOverflowMenu?.()}),this.elements.editNameButton?.addEventListener(`click`,()=>{this.openDisplayNameDialog(),this.closeToolbarOverflowMenu?.()}),this.elements.displayNameCancel?.addEventListener(`click`,()=>{this.elements.displayNameDialog?.close()}),this.elements.gitCommitCancel?.addEventListener(`click`,()=>{this.elements.gitCommitDialog?.close()}),this.elements.gitResetCancel?.addEventListener(`click`,()=>{this.elements.gitResetDialog?.close()}),this.elements.gitResetSubmit?.addEventListener(`click`,()=>{this.handleGitResetSubmit()}),this.elements.gitCommitDialog?.addEventListener(`close`,()=>{this.elements.gitCommitInput&&(this.elements.gitCommitInput.value=``),this.elements.gitCommitSubmit&&(this.elements.gitCommitSubmit.textContent=`Commit staged changes`)}),this.elements.gitResetDialog?.addEventListener(`close`,()=>{this.pendingGitResetPath=null,this.elements.gitResetFileName&&(this.elements.gitResetFileName.value=``),this.elements.gitResetSubmit&&(this.elements.gitResetSubmit.textContent=`Reset File`)}),this.elements.markdownToolbar?.addEventListener(`click`,e=>{this.handleMarkdownToolbarClick?.(e)}),this.elements.markdownToolbar?.addEventListener(`keydown`,e=>{this.handleMarkdownToolbarKeydown?.(e)}),this.elements.displayNameForm?.addEventListener(`submit`,e=>{e.preventDefault(),this.handleDisplayNameSubmit()}),this.elements.gitCommitForm?.addEventListener(`submit`,e=>{e.preventDefault(),this.handleGitCommitSubmit()}),this.elements.tabLockTakeoverButton?.addEventListener(`click`,()=>{this.handleTabTakeover()}),this.elements.toggleWrapButton?.addEventListener(`click`,()=>{this.toggleLineWrapping()}),this.elements.editorFindButton?.addEventListener(`click`,()=>{this.runEditorCommand?.(`openSearch`)}),this.elements.toolbarOverflowToggle?.addEventListener(`click`,e=>{e.preventDefault(),this.toggleToolbarOverflowMenu()}),this.elements.toolbarOverflowMenu?.addEventListener(`click`,e=>{e.target instanceof Element&&e.target.closest(`button`)&&this.closeToolbarOverflowMenu()}),this.elements.previewContent?.addEventListener(`click`,e=>{this.handlePreviewContentClick?.(e)}),this.elements.sidebarToggle?.addEventListener(`click`,()=>{this.closeToolbarOverflowMenu(),this.toggleSidebar()}),this.elements.sidebarClose?.addEventListener(`click`,()=>{this.closeSidebarOnMobile()}),this.elements.filesSidebarTab?.addEventListener(`click`,()=>{this.setSidebarTab(`files`)}),this.elements.gitSidebarTab?.addEventListener(`click`,()=>{this.gitRepoAvailable&&this.setSidebarTab(`git`)}),document.addEventListener(`pointerdown`,e=>{this.handleMarkdownToolbarDocumentPointerDown?.(e),this.toolbarOverflowOpen&&!this.elements.toolbarOverflowMenu?.contains(e.target)&&!this.elements.toolbarOverflowToggle?.contains(e.target)&&this.closeToolbarOverflowMenu(),this.chatIsOpen&&(this.elements.chatContainer?.contains(e.target)||this.closeChatPanel())}),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`&&this.toolbarOverflowOpen){this.closeToolbarOverflowMenu();return}if(e.key===`Escape`&&this.chatIsOpen){this.closeChatPanel();return}(e.metaKey||e.ctrlKey)&&e.key===`k`&&(e.preventDefault(),this.toggleQuickSwitcher())})}function Nt(e,t){let n=e.closest(`ul, ol`);return n instanceof Element&&n.parentElement===t}function Pt(e){return e.closest(`input[data-task-checkbox="true"]`)?!1:!!e.closest(`a, button, input, select, textarea, summary, [contenteditable="true"], [role="button"], [role="link"]`)}function Ft(e){if(!(e.target instanceof Element))return;let t=e.target.closest(`a.wiki-link[data-wiki-target]`);if(t){e.preventDefault(),this.handleWikiLinkClick(t.dataset.wikiTarget);return}let n=e.target.closest(`.task-list-item[data-source-line]`);if(!n||Nt(e.target,n)||Pt(e.target))return;e.preventDefault();let r=Number.parseInt(n.getAttribute(`data-source-line`)||``,10);Number.isFinite(r)&&this.session?.toggleTaskListItem?.(r)}function It(e){this.toolbarOverflowOpen=!!e,this.elements.toolbarOverflowToggle?.setAttribute(`aria-expanded`,String(this.toolbarOverflowOpen)),this.elements.toolbarOverflowToggle?.classList.toggle(`active`,this.toolbarOverflowOpen),this.elements.toolbarOverflowToggle?.closest(`.toolbar-right`)?.classList.toggle(`is-overflow-open`,this.toolbarOverflowOpen),this.toolbarOverflowOpen||this.elements.toolbarOverflowMenu?.querySelectorAll(`details[open]`).forEach(e=>{e.removeAttribute(`open`)})}function Lt(){let e=this.elements.toolbarOverflowToggle;e&&(e.classList.remove(`hidden`),e.hidden=!1,e.setAttribute(`aria-hidden`,`false`))}function Rt(){this.setToolbarOverflowOpen(!1)}function zt(){this.setToolbarOverflowOpen(!this.toolbarOverflowOpen)}function Bt(e){this.previewRenderer.applyTheme(e),!this.isExcalidrawFile(this.currentFilePath)&&!this.isImageFile?.(this.currentFilePath)&&this.previewRenderer.queueRender(),this.session?.applyTheme(e),this.excalidrawEmbed.updateTheme(e),this.drawioEmbed.updateTheme(e)}function Vt(e){this.connectionState=e,e?.firstConnection&&this.recordFileOpenMetric?.(`ws_connected`,{status:e.status}),this.renderPresence(),e.unreachable&&!this.connectionHelpShown&&(this.connectionHelpShown=!0,this.toastController.show(`Cannot reach server at ${e.wsBaseUrl}`,6e3))}function Ht(){let e=!(this.session?.isLineWrappingEnabled()??this.getStoredLineWrapping());this.session?.setLineWrapping(e),this.preferences.setLineWrappingEnabled(e),this.syncWrapToggle(e),this.session?.requestMeasure(),this.scrollSyncController.syncPreviewToEditor()}function Ut(){return this.preferences.getLineWrappingEnabled()}function Wt(e){let t=e??this.session?.isLineWrappingEnabled()??this.getStoredLineWrapping(),n=this.elements.wrapToggleLabel,r=this.elements.toggleWrapButton,i=t?`Wrap on`:`Wrap off`;n&&(n.textContent=i),r&&r.setAttribute(`aria-label`,`${i}. ${t?`Disable line wrap`:`Enable line wrap`}`)}function Gt(){clearTimeout(this._backlinkRefreshTimer),this._backlinkRefreshTimer=setTimeout(()=>{u(this.currentFilePath)&&this.backlinksPanel.load(this.currentFilePath)},2e3)}function Kt(){this.elements.editorContainer&&(this.elements.editorContainer.classList.add(`is-loading-editor`),this.elements.editorContainer.innerHTML=`
23
+ `))}getPreviewInitConfig(e){return/^\s*stateDiagram(?:-v2)?\b/m.test(e)||/^\s*classDiagram\b/m.test(e)||/^\s*gantt\b/m.test(e)?{htmlLabels:!1}:null}resetHydratedShells(){let e=this.renderer.previewElement;if(!e)return;let t=Array.from(e.querySelectorAll(`.mermaid-shell[data-mermaid-hydrated="true"]`));t.length!==0&&t.forEach(e=>{this.shellRefits.delete(e),e.removeAttribute(`data-mermaid-hydrated`),e.querySelector(`:scope > .mermaid-toolbar`)?.remove(),e.querySelector(`:scope > .mermaid-frame`)?.remove(),e.querySelector(`:scope > .mermaid-render-node`)?.remove(),e.querySelector(`.mermaid-placeholder-card`)||e.querySelector(`.mermaid-source`)?.after(ce(e.dataset.mermaidKey||`mermaid`)),this.enqueueShell(e,{prioritize:!0})})}enhanceDiagram(e,t){let n=t.querySelector(`svg`);if(!n){t.remove();return}let r=document.createElement(`div`);r.className=`mermaid-toolbar diagram-preview-toolbar`;let i=this.createZoomButton(`−`,`Zoom out`),a=this.createZoomButton(`+`,`Zoom in`),o=this.createZoomButton(`Reset`,`Reset zoom`),s=this.createZoomButton(`Max`,`Maximize diagram`);s.classList.add(`mermaid-maximize-btn`),z(s,`maximize`);let c=document.createElement(`span`);c.className=`mermaid-zoom-label diagram-preview-zoom-label`,c.setAttribute(`aria-live`,`polite`),r.append(i,c,o,a,s);let l=document.createElement(`div`);l.className=`mermaid-frame diagram-preview-frame`;let{width:u,height:d}=oe(n),f=R.default,p=1,m=null,h=null,g=!1,_=0,v=!1,y=null,b=0,ee=0,S=0,C=0;n.style.display=`block`,n.style.margin=`0 auto`,n.style.maxWidth=`none`;let w=()=>{let e=F(l);if(!Number.isFinite(u)||u<=0||e.width<=0)return R.default;let t=e.width/u;return!Number.isFinite(t)||t<=0?R.default:x(t,R.min,R.max)},T=e=>{f=x(e,R.min,R.max),n.style.width=`${u*f}px`,n.style.height=`${d*f}px`,c.textContent=`${Math.round(f*100)}%`,i.disabled=f<=R.min,a.disabled=f>=R.max;let t=F(l),r=u*f>t.width||d*f>t.height;l.classList.toggle(`is-pannable`,r),n.style.margin=r?`0`:`0 auto`},E=()=>({x:l.scrollLeft+l.clientWidth/2,y:l.scrollTop+l.clientHeight/2}),D=(e,t,n)=>{if(e===0)return;let r=t/e;l.scrollLeft=n.x*r-l.clientWidth/2,l.scrollTop=n.y*r-l.clientHeight/2},O=e=>{let t=x(e,R.min,R.max),n=f;if(t===n)return;let r=E(),i=performance.now();m&&cancelAnimationFrame(m);let a=e=>{let o=x((e-i)/R.animationDurationMs,0,1),s=me(o),c=n+(t-n)*s;if(T(c),D(n,c,r),o<1){m=requestAnimationFrame(a);return}m=null,T(t),D(n,t,r)};m=requestAnimationFrame(a)},k=e=>{g=!0,O(f+e)},A=({animate:e=!1}={})=>{if(p=w(),g=!1,_=F(l).width,e&&Math.abs(p-f)>.001){O(p);return}m&&=(cancelAnimationFrame(m),null),T(p),l.scrollLeft=0,l.scrollTop=0},j=({force:t=!1}={})=>{h&&cancelAnimationFrame(h),h=requestAnimationFrame(()=>{if(h=null,!e.isConnected)return;let n=F(l).width,r=Math.abs(n-_)>1;!t&&g||!t&&_>0&&!r||A()})};this.shellRefits.set(e,j),i.addEventListener(`click`,()=>k(-R.step)),a.addEventListener(`click`,()=>k(R.step)),o.addEventListener(`click`,()=>{A({animate:!0})});let M=()=>{let t=e.classList.contains(`is-maximized`);z(s,t?`restore`:`maximize`);let n=t?`Restore diagram size`:`Maximize diagram`;s.setAttribute(`aria-label`,n),s.title=n},te=t=>{let n=this.renderer.previewElement;if(t){let t=n.querySelector(`.mermaid-shell.is-maximized`);if(t&&t!==e){t.classList.remove(`is-maximized`),this.shellRefits.get(t)?.();let e=t.querySelector(`.mermaid-maximize-btn`);e&&(z(e,`maximize`),e.setAttribute(`aria-label`,`Maximize diagram`),e.title=`Maximize diagram`)}e.classList.add(`is-maximized`),document.body.classList.add(`mermaid-maximized-open`),M(),j({force:!0});return}e.classList.remove(`is-maximized`),n.querySelector(`.mermaid-shell.is-maximized`)||document.body.classList.remove(`mermaid-maximized-open`),M(),j({force:!0})};M(),s.addEventListener(`click`,()=>{te(!e.classList.contains(`is-maximized`))});let N=()=>{if(v){if(v=!1,l.classList.remove(`is-dragging`),y!==null&&typeof l.releasePointerCapture==`function`)try{l.releasePointerCapture(y)}catch{}y=null}};l.addEventListener(`pointerdown`,e=>{e.button!==0||!l.classList.contains(`is-pannable`)||(m&&=(cancelAnimationFrame(m),null),v=!0,y=e.pointerId,b=e.clientX,ee=e.clientY,S=l.scrollLeft,C=l.scrollTop,l.classList.add(`is-dragging`),l.setPointerCapture?.(e.pointerId),e.preventDefault())}),l.addEventListener(`pointermove`,e=>{v&&(l.scrollLeft=S-(e.clientX-b),l.scrollTop=C-(e.clientY-ee))}),l.addEventListener(`pointerup`,N),l.addEventListener(`pointercancel`,N),l.addEventListener(`lostpointercapture`,N),l.appendChild(n);let P=e.querySelector(`.mermaid-source`);t.remove(),e.replaceChildren(),P&&(P.hidden=!0,e.appendChild(P)),e.append(r,l),j({force:!0})}scheduleActiveRefit(){let e=this.renderer.previewElement;e&&Array.from(e.querySelectorAll(`.mermaid-shell[data-mermaid-hydrated="true"]`)).forEach(e=>{this.shellRefits.get(e)?.()})}createZoomButton(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`mermaid-zoom-btn ui-preview-action`,n.setAttribute(`aria-label`,t),n.title=t,n.textContent=e,n}},we=class extends Se{constructor(e){super(e,{batchSize:2,datasetKeys:{hydrated:`plantumlHydrated`,instanceId:`plantumlInstanceId`,key:`plantumlKey`,label:`plantumlLabel`,queued:`plantumlQueued`,sourceHash:`plantumlSourceHash`,sourceLine:`sourceLine`,sourceLineEnd:`sourceLineEnd`,target:`plantumlTarget`},filePathLabel:`PlantUML`,shellClassName:`plantuml-shell`,sourceClassName:`plantuml-source`}),this.renderer=e,this.svgCache=new Map,this.svgInflightRequests=new Map,this.shellRefits=new WeakMap,this.activeMaximizedShell=null,this.maximizedRoot=null,this.resizeFrameId=null}destroy(){this.cancelHydration(),this.preservedShells.clear(),this.clearActiveShell(),this.resizeFrameId&&=(cancelAnimationFrame(this.resizeFrameId),null),this.maximizedRoot?.remove(),this.maximizedRoot=null}clearActiveShell(){this.activeMaximizedShell=null,this.maximizedRoot&&this.maximizedRoot.childElementCount===0&&(this.maximizedRoot.hidden=!0)}syncActiveShell(){return this.activeMaximizedShell?.isConnected&&this.activeMaximizedShell.classList.contains(`is-maximized`)?this.activeMaximizedShell:(this.clearActiveShell(),null)}scheduleActiveRefit(){this.resizeFrameId&&cancelAnimationFrame(this.resizeFrameId),this.resizeFrameId=requestAnimationFrame(()=>{this.resizeFrameId=null;let e=this.syncActiveShell();e&&this.shellRefits.get(e)?.()})}handleReconcile({restoredMaximizedShell:e}){e&&document.body.classList.add(`plantuml-maximized-open`),this.syncActiveShell()}ensureMaximizedRoot(){if(this.maximizedRoot?.isConnected&&this.maximizedRoot.parentElement===document.body)return this.maximizedRoot;let e=document.body.querySelector(`[data-plantuml-maximized-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.plantumlMaximizedRoot=`true`,e.className=`plantuml-maximized-root`,document.body.appendChild(e)),this.maximizedRoot=e,e}mountShellInMaximizedRoot(e){if(!e)return;let t=this.ensureMaximizedRoot();t.hidden=!1,e._plantumlRestoreParent=e.parentElement||null,e._plantumlRestoreNextSibling=e.nextSibling||null,t.appendChild(e)}restoreShellMount(e){if(!e)return;let t=e._plantumlRestoreParent,n=e._plantumlRestoreNextSibling;t?.isConnected&&(n?.parentElement===t?t.insertBefore(e,n):t.appendChild(e)),e._plantumlRestoreParent=null,e._plantumlRestoreNextSibling=null,this.maximizedRoot&&this.maximizedRoot.childElementCount===0&&(this.maximizedRoot.hidden=!0)}async hydrateShell(e){if(!e?.isConnected||this.isShellHydrated(e))return;let t=e.querySelector(`.plantuml-source`);t||(t=document.createElement(`span`),t.className=`plantuml-source`,t.hidden=!0,e.appendChild(t)),e.querySelector(`.plantuml-placeholder-card`)?.remove();try{let n=t.textContent??``;if(!n.trim()&&e.dataset.plantumlTarget){if(n=await this.fetchSource(e.dataset.plantumlTarget),!e.isConnected)return;t.textContent=n}if(!n.trim())throw Error(e.dataset.plantumlTarget?`PlantUML file is empty`:`PlantUML source is empty`);let r=await this.fetchSvg(n);if(!e.isConnected)return;this.enhanceDiagram(e,r),this.markShellHydrated(e)}catch(n){console.warn(`[preview] PlantUML render failed:`,n),e.querySelector(`:scope > .plantuml-toolbar`)?.remove(),e.querySelector(`:scope > .plantuml-frame`)?.remove(),e.querySelector(`.plantuml-placeholder-card`)||t?.after(de(e.dataset.plantumlKey||`plantuml`,n instanceof Error?n.message:`Render failed`))}}async fetchSvg(e){let t=e;if(this.svgCache.has(t))return this.svgCache.get(t);if(this.svgInflightRequests.has(t))return this.svgInflightRequests.get(t);let n=fetch(O(`/plantuml/render`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({source:e})}).then(async e=>{let n=await e.json().catch(()=>null);if(!e.ok||!n?.ok||typeof n.svg!=`string`)throw Error(n?.error||`Failed to render PlantUML`);let r=fe(n.svg);return this.svgCache.set(t,r),r}).finally(()=>{this.svgInflightRequests.delete(t)});return this.svgInflightRequests.set(t,n),n}resetShell(e,{clearCache:t=!1,message:n=`Renders server-side when visible`}={}){let r=e.querySelector(`.plantuml-source`)?.textContent??``;t&&r&&(this.svgCache.delete(r),this.svgInflightRequests.delete(r)),this.shellRefits.delete(e),this.activeMaximizedShell===e&&(this.restoreShellMount(e),this.clearActiveShell()),e.removeAttribute(`data-plantuml-hydrated`),e.removeAttribute(`data-plantuml-instance-id`),e.removeAttribute(`data-plantuml-queued`),e.classList.remove(`is-maximized`),this.syncActiveShell()||document.body.classList.remove(`plantuml-maximized-open`),e.querySelector(`:scope > .plantuml-toolbar`)?.remove(),e.querySelector(`:scope > .plantuml-frame`)?.remove(),e.querySelector(`.plantuml-placeholder-card`)||e.querySelector(`.plantuml-source`)?.after(de(e.dataset.plantumlKey||`plantuml`,n))}enhanceDiagram(e,t){let n=document.createElement(`div`);n.innerHTML=t;let r=n.querySelector(`svg`);if(!r)throw Error(`Renderer returned invalid SVG`);let i=document.createElement(`div`);i.className=`plantuml-toolbar diagram-preview-toolbar`;let a=document.createElement(`div`);a.className=`plantuml-frame diagram-preview-frame`;let o=this.createToolButton(`−`,`Zoom out`),s=this.createToolButton(`+`,`Zoom in`),c=this.createToolButton(`Reset`,`Reset zoom`),l=this.createToolButton(`Reload`,`Reload diagram`),u=this.createToolButton(`Max`,`Maximize diagram`);u.classList.add(`plantuml-maximize-btn`),z(l,`refresh`),z(u,`maximize`);let d=document.createElement(`span`);d.className=`plantuml-zoom-label diagram-preview-zoom-label`,d.setAttribute(`aria-live`,`polite`),i.append(o,d,c,s,l,u);let{width:f,height:p}=le(r),m=L.default,h=1,g=null,_=!1,v=null,y=0,b=0,ee=0,S=0;r.style.display=`block`,r.style.margin=`0 auto`,r.style.maxWidth=`none`;let C=()=>{let e=F(a);return!Number.isFinite(f)||f<=0||e.width<=0?L.default:x(Math.min(L.default,e.width/f),L.min,L.max)},w=e=>{m=x(e,L.min,L.max),r.style.width=`${f*m}px`,r.style.height=`${p*m}px`,d.textContent=`${Math.round(m*100)}%`,o.disabled=m<=L.min,s.disabled=m>=L.max;let t=F(a),n=f*m>t.width||p*m>t.height;a.classList.toggle(`is-pannable`,n)},T=()=>({x:a.scrollLeft+a.clientWidth/2,y:a.scrollTop+a.clientHeight/2}),E=(e,t,n)=>{if(e===0)return;let r=t/e;a.scrollLeft=n.x*r-a.clientWidth/2,a.scrollTop=n.y*r-a.clientHeight/2},D=e=>{let t=x(e,L.min,L.max),n=m;if(t===n)return;let r=T(),i=performance.now();g&&cancelAnimationFrame(g);let a=e=>{let o=x((e-i)/L.animationDurationMs,0,1),s=me(o),c=n+(t-n)*s;if(w(c),E(n,c,r),o<1){g=requestAnimationFrame(a);return}g=null,w(t),E(n,t,r)};g=requestAnimationFrame(a)},O=e=>{D(m+e)},k=({animate:e=!1}={})=>{if(h=C(),e&&Math.abs(h-m)>.001){D(h);return}g&&=(cancelAnimationFrame(g),null),w(h),a.scrollLeft=0,a.scrollTop=0},A=null,j=()=>{A&&cancelAnimationFrame(A),A=requestAnimationFrame(()=>{A=null,e.isConnected&&k()})};this.shellRefits.set(e,j),o.addEventListener(`click`,()=>O(-L.step)),s.addEventListener(`click`,()=>O(L.step)),c.addEventListener(`click`,()=>{k({animate:!0})});let M=()=>{let t=e.classList.contains(`is-maximized`);z(u,t?`restore`:`maximize`);let n=t?`Restore diagram size`:`Maximize diagram`;u.setAttribute(`aria-label`,n),u.title=n},te=t=>{if(t){let t=this.syncActiveShell();if(t&&t!==e){this.restoreShellMount(t),t.classList.remove(`is-maximized`),this.activeMaximizedShell===t&&this.clearActiveShell(),this.shellRefits.get(t)?.();let e=t.querySelector(`.plantuml-maximize-btn`);e&&(z(e,`maximize`),e.setAttribute(`aria-label`,`Maximize diagram`),e.title=`Maximize diagram`)}this.mountShellInMaximizedRoot(e),e.classList.add(`is-maximized`),this.activeMaximizedShell=e,document.body.classList.add(`plantuml-maximized-open`),M(),j();return}this.restoreShellMount(e),e.classList.remove(`is-maximized`),this.activeMaximizedShell===e&&this.clearActiveShell(),this.syncActiveShell()||document.body.classList.remove(`plantuml-maximized-open`),M(),j()};l.addEventListener(`click`,()=>{this.resetShell(e,{clearCache:!0,message:`Refreshing…`}),this.enqueueShell(e,{prioritize:!0})}),M(),u.addEventListener(`click`,()=>{te(!e.classList.contains(`is-maximized`))});let N=()=>{if(_){if(_=!1,a.classList.remove(`is-dragging`),v!==null&&typeof a.releasePointerCapture==`function`)try{a.releasePointerCapture(v)}catch{}v=null}};a.addEventListener(`pointerdown`,e=>{e.button!==0||!a.classList.contains(`is-pannable`)||(g&&=(cancelAnimationFrame(g),null),_=!0,v=e.pointerId,y=e.clientX,b=e.clientY,ee=a.scrollLeft,S=a.scrollTop,a.classList.add(`is-dragging`),a.setPointerCapture?.(e.pointerId),e.preventDefault())}),a.addEventListener(`pointermove`,e=>{_&&(a.scrollLeft=ee-(e.clientX-y),a.scrollTop=S-(e.clientY-b))}),a.addEventListener(`pointerup`,N),a.addEventListener(`pointercancel`,N),a.addEventListener(`lostpointercapture`,N),a.appendChild(r);let P=e.querySelector(`.plantuml-source`);e.replaceChildren(),P&&(P.hidden=!0,e.appendChild(P)),e.append(i,a),h=C(),w(h)}createToolButton(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`plantuml-tool-btn ui-preview-action`,n.setAttribute(`aria-label`,t),n.title=t,n.textContent=e,n}};function Te(){return new Worker(new URL(``+new URL(`preview-render-worker-B4dH2yxj.js`,import.meta.url).href,``+import.meta.url),{type:`module`})}var Ee=class{constructor({attachmentApiPath:t=`/api/attachment`,cancelIdleRenderFn:n=pe,compilePreviewDocumentLoader:r=()=>e(()=>import(`./preview-render-compiler-Duy_3IcP.js`),__vite__mapDeps([23,24,25,4,26,27]),import.meta.url),createWorkerFn:i=Te,getFileList:a,getSourceFilePath:o=null,idleTimeoutMs:s=500,requestIdleRenderFn:c=se}={}){this.attachmentApiPath=t,this.cancelIdleRenderFn=n,this.compilePreviewDocumentLoader=r,this.createWorkerFn=i,this.getFileList=a,this.getSourceFilePath=o,this.idleTimeoutMs=s,this.requestIdleRenderFn=c,this.worker=null,this.workerDisabled=!1,this.workerJob=null,this.workerPrewarmId=null,this.handleWorkerMessage=e=>{if(!this.workerJob||e.data?.renderVersion!==this.workerJob.renderVersion)return;let t=this.workerJob;if(this.workerJob=null,e.data?.error){t.reject(Error(e.data.error));return}t.resolve({html:e.data.html,stats:e.data.stats})},this.handleWorkerError=e=>{let t=Error(e.message||`Preview worker failed`);this.workerJob&&=(this.workerJob.reject(t),null),this.reset(`Preview worker failed`,{disable:!0})}}hasPendingJob(){return this.workerJob!==null}schedulePrewarm({timeout:e=this.idleTimeoutMs}={}){this.workerDisabled||this.worker||this.workerPrewarmId!==null||(this.workerPrewarmId=this.requestIdleRenderFn(()=>{this.workerPrewarmId=null,this.ensureWorker()},e))}ensureWorker(){if(this.workerDisabled)return null;if(this.worker)return this.worker;try{return this.worker=this.createWorkerFn(),this.worker.addEventListener(`message`,this.handleWorkerMessage),this.worker.addEventListener(`error`,this.handleWorkerError),this.worker}catch{return this.workerDisabled=!0,null}}async compile(e,t,{frontmatterCollapsed:n=!1,frontmatterInteractive:r=!1}={}){if(this.ensureWorker()){this.workerJob&&this.reset(`Superseded preview render`);let i=this.ensureWorker();return new Promise((a,o)=>{this.workerJob={reject:o,renderVersion:t,resolve:a},i.postMessage({attachmentApiPath:this.attachmentApiPath,fileList:this.getFileList?.()??[],frontmatterCollapsed:n,frontmatterInteractive:r,markdownText:e,renderVersion:t,sourceFilePath:this.getSourceFilePath?.()??``})})}let{compilePreviewDocument:i}=await this.compilePreviewDocumentLoader();return i({attachmentApiPath:this.attachmentApiPath,fileList:this.getFileList?.()??[],frontmatterCollapsed:n,frontmatterInteractive:r,markdownText:e,sourceFilePath:this.getSourceFilePath?.()??``})}cancelWorkerJob(e){this.workerJob&&=(this.workerJob.reject(Error(e)),null)}reset(e,{disable:t=!1}={}){this.cancelWorkerJob(e),this.worker&&=(this.worker.removeEventListener(`message`,this.handleWorkerMessage),this.worker.removeEventListener(`error`,this.handleWorkerError),this.worker.terminate(),null),t&&(this.workerDisabled=!0)}destroy(e=`Preview renderer destroyed`){this.workerPrewarmId!==null&&this.cancelIdleRenderFn(this.workerPrewarmId),this.workerPrewarmId=null,this.reset(e)}},De=class{constructor({cancelAnimationFrameFn:e=e=>cancelAnimationFrame(e),cancelIdleRenderFn:t=pe,clearTimeoutFn:n=e=>clearTimeout(e),getRenderProfileFn:i=r,idleTimeoutMs:a=500,requestAnimationFrameFn:o=e=>requestAnimationFrame(e),requestIdleRenderFn:s=se,setTimeoutFn:c=(e,t)=>setTimeout(e,t)}={}){this.cancelAnimationFrameFn=e,this.cancelIdleRenderFn=t,this.clearTimeoutFn=n,this.getRenderProfileFn=i,this.idleTimeoutMs=a,this.requestAnimationFrameFn=o,this.requestIdleRenderFn=s,this.setTimeoutFn=c,this.frameId=null,this.idleId=null,this.timeoutId=null}queue({markdownText:e,onRenderRequested:t,renderVersion:n}){let r=this.getRenderProfileFn(e);this.cancel();let i=()=>{this.frameId=this.requestAnimationFrameFn(()=>{this.frameId=null,this.timeoutId=null,t?.(e,n)})};this.timeoutId=this.setTimeoutFn(()=>{if(r.deferUntilIdle){this.idleId=this.requestIdleRenderFn(()=>{this.idleId=null,i()},this.idleTimeoutMs);return}i()},r.debounceMs)}cancel(){this.clearTimeoutFn(this.timeoutId),this.frameId&&this.cancelAnimationFrameFn(this.frameId),this.cancelIdleRenderFn(this.idleId),this.frameId=null,this.idleId=null,this.timeoutId=null}destroy(){this.cancel()}},Oe=class{constructor({getContent:e,getFileList:t,getSourceFilePath:n,onAfterRenderCommit:i,onBeforeRenderCommit:a,onPreviewLayoutChange:o,onRenderComplete:s,outlineController:c,previewContainer:l,previewElement:u}){this.getContent=e,this.getFileList=t,this.getSourceFilePath=n,this.onAfterRenderCommit=i,this.onBeforeRenderCommit=a,this.onPreviewLayoutChange=o,this.onRenderComplete=s,this.outlineController=c,this.previewContainer=l,this.previewElement=u,this.renderHost=null,this.pendingRenderVersion=0,this.activeRenderVersion=0,this.readyRenderVersion=0,this.currentStats=null,this.isLargeDocument=!1,this.hydrationPaused=!1,this.frontmatterCollapsed=!1,this.handlePreviewClick=e=>{if(e.target.closest(`.frontmatter-toggle`)){e.preventDefault(),this.frontmatterCollapsed=!this.frontmatterCollapsed,this.applyFrontmatterState(),this.handleFrontmatterLayoutChange();return}let t=e.target.closest(`.mermaid-placeholder-btn`);if(t){let n=t.closest(`.mermaid-shell`);if(!n)return;e.preventDefault(),this.enqueueMermaidShell(n,{prioritize:!0});return}let n=e.target.closest(`.plantuml-placeholder-btn`);if(n){let t=n.closest(`.plantuml-shell`);if(!t)return;e.preventDefault(),this.enqueuePlantUmlShell(t,{prioritize:!0})}},this.handleWindowResize=()=>{this.mermaidHydrator.scheduleActiveRefit(),this.plantUmlHydrator.scheduleActiveRefit()},this.mermaidHydrator=new Ce(this),this.plantUmlHydrator=new we(this),this.renderScheduler=new De({getRenderProfileFn:r}),this.renderExecutor=new Ee({attachmentApiPath:O(`/attachment`),getFileList:()=>this.getFileList?.()??[],getSourceFilePath:()=>this.getSourceFilePath?.()??``,idleTimeoutMs:500}),this.previewElement?.addEventListener(`click`,this.handlePreviewClick),window.addEventListener(`resize`,this.handleWindowResize),this.setPhase(`ready`)}ensureRenderHost(){if(!this.previewElement)return null;if(this.renderHost?.isConnected&&this.renderHost.parentElement===this.previewElement)return this.renderHost;let e=this.previewElement.querySelector(`[data-preview-render-host="true"]`);return e||(e=document.createElement(`div`),e.dataset.previewRenderHost=`true`,this.previewElement.appendChild(e)),this.renderHost=e,this.renderHost}normalizePreviewChildren(e=this.renderHost){this.previewElement&&Array.from(this.previewElement.children).forEach(t=>{t===e||t.dataset.excalidrawOverlayRoot===`true`||t.dataset.videoOverlayRoot===`true`||t.remove()})}getReservedPreviewHeight(){let e=this.renderHost?.getBoundingClientRect?.().height??0,t=this.previewContainer?.clientHeight??0;return Math.max(Math.round(e),Math.round(t),320)}beginDocumentLoad(){this.cancelScheduledRender(),this.cancelMermaidHydration(),this.cancelPlantUmlHydration(),this.mermaidHydrator.clearPreservedShells(),this.plantUmlHydrator.clearPreservedShells(),this.clearActivePlantUmlShell(),this.onBeforeRenderCommit?.(this.previewElement),this.pendingRenderVersion+=1,this.activeRenderVersion=this.pendingRenderVersion,this.readyRenderVersion=0,this.currentStats=null,this.isLargeDocument=!1,this.frontmatterCollapsed=!1,this.renderExecutor.hasPendingJob()&&this.resetWorker(`Document changed`);let e=this.ensureRenderHost();this.normalizePreviewChildren(e);let t=this.getReservedPreviewHeight();e&&(e.replaceChildren(),e.style.minHeight=`${t}px`);let n=document.createElement(`div`);n.className=`preview-shell`,n.style.minHeight=`${t}px`,n.textContent=`Rendering preview…`,e?.append(n),this.setPhase(`shell`)}applyTheme(e){let t=document.getElementById(`hljs-theme`);if(t){let{darkHref:n,lightHref:r}=t.dataset;t.href=e===`dark`?n:r}this.mermaidHydrator.applyTheme(e)}configureMermaid(e){this.mermaidHydrator.configureMermaid(e)}ensureMermaid(){return this.mermaidHydrator.ensureMermaid()}queueRender(){let e=this.getContent();this.cancelScheduledRender(),this.pendingRenderVersion+=1;let t=this.pendingRenderVersion;this.renderScheduler.queue({markdownText:e,onRenderRequested:(e,t)=>{this.render(e,t)},renderVersion:t})}async render(e=this.getContent(),t=this.pendingRenderVersion){if(this.previewElement)try{let n=await this.compilePreview(e,t);if(t!==this.pendingRenderVersion)return;this.commitBaseRender(n,t)}catch(e){if(t!==this.pendingRenderVersion)return;console.warn(`[preview] Failed to render preview:`,e)}}destroy(){this.renderScheduler.destroy(),this.mermaidHydrator.destroy(),this.plantUmlHydrator.destroy(),this.renderExecutor.destroy(),this.previewElement?.removeEventListener(`click`,this.handlePreviewClick),window.removeEventListener(`resize`,this.handleWindowResize)}setPhase(e){this.previewElement&&(this.previewElement.dataset.renderPhase=e)}cancelScheduledRender(){this.renderScheduler.cancel()}cancelMermaidHydration(){this.mermaidHydrator.cancelHydration()}cancelPlantUmlHydration(){this.plantUmlHydrator.cancelHydration()}clearActivePlantUmlShell(){this.plantUmlHydrator.clearActiveShell()}scheduleActiveMermaidRefit(){this.mermaidHydrator.scheduleActiveRefit()}syncActivePlantUmlShell(){return this.plantUmlHydrator.syncActiveShell()}scheduleActivePlantUmlRefit(){this.plantUmlHydrator.scheduleActiveRefit()}setHydrationPaused(e){if(this.hydrationPaused=!!e,this.hydrationPaused){this.mermaidHydrator.cancelPendingIdleWork(),this.plantUmlHydrator.cancelPendingIdleWork();return}this.mermaidHydrator.hydrateVisibleShells(),this.mermaidHydrator.scheduleHydration(),this.plantUmlHydrator.hydrateVisibleShells(),this.plantUmlHydrator.scheduleHydration(),this.updateHydrationPhase()}resetWorker(e,{disable:t=!1}={}){this.renderExecutor.reset(e,{disable:t})}scheduleWorkerPrewarm({timeout:e=500}={}){this.renderExecutor.schedulePrewarm({timeout:e})}async compilePreview(e,t){return this.renderExecutor.compile(e,t,{frontmatterCollapsed:this.frontmatterCollapsed,frontmatterInteractive:!0})}commitBaseRender({html:e,stats:t},n){this.activeRenderVersion=n,this.readyRenderVersion=0,this.currentStats=t,this.isLargeDocument=i(t),this.cancelMermaidHydration(),this.cancelPlantUmlHydration(),document.body.classList.remove(`mermaid-maximized-open`),document.body.classList.remove(`plantuml-maximized-open`),this.preserveHydratedMermaidsForCommit(),this.preserveHydratedPlantUmlsForCommit(),this.onBeforeRenderCommit?.(this.previewElement);let r=this.ensureRenderHost();this.normalizePreviewChildren(r),r&&(r.innerHTML=e),this.applyFrontmatterState(),this.reconcileHydratedMermaids(),this.reconcileHydratedPlantUmls(),this.setPhase(`base`),this.outlineController.refresh(),this.onAfterRenderCommit?.(this.previewElement,{...t,isLargeDocument:this.isLargeDocument,renderVersion:n});let a=this.setupMermaidHydration(n),o=this.setupPlantUmlHydration(n);a===0&&o===0&&this.notifyReady()}applyFrontmatterState(){let e=this.renderHost?.querySelector?.(`.frontmatter-block`);if(!(e instanceof HTMLElement))return;let t=this.frontmatterCollapsed,n=e.querySelector(`.frontmatter-toggle`),r=e.querySelector(`.frontmatter-summary`),i=e.querySelector(`.frontmatter-content`);e.dataset.collapsed=t?`true`:`false`,n instanceof HTMLButtonElement&&(n.setAttribute(`aria-expanded`,t?`false`:`true`),n.textContent=t?`Show`:`Hide`),r instanceof HTMLElement&&(r.hidden=!t),i instanceof HTMLElement&&(i.hidden=t)}handleFrontmatterLayoutChange(){this.outlineController.refresh(),this.onPreviewLayoutChange?.({isLargeDocument:this.isLargeDocument,renderVersion:this.activeRenderVersion,stats:this.currentStats})}preserveHydratedMermaidsForCommit(){this.mermaidHydrator.preserveHydratedShellsForCommit()}preserveHydratedPlantUmlsForCommit(){this.plantUmlHydrator.preserveHydratedShellsForCommit()}reconcileHydratedMermaids(){this.mermaidHydrator.reconcileHydratedShells()}reconcileHydratedPlantUmls(){this.plantUmlHydrator.reconcileHydratedShells()}syncPreservedMermaidShell(e,t){this.mermaidHydrator.syncPreservedShell(e,t)}syncPreservedPlantUmlShell(e,t){this.plantUmlHydrator.syncPreservedShell(e,t)}setupMermaidHydration(e){return this.mermaidHydrator.setupHydration(e)}hydrateVisibleMermaids(){this.mermaidHydrator.hydrateVisibleShells()}enqueueMermaidShell(e,{prioritize:t=!1}={}){this.mermaidHydrator.enqueueShell(e,{prioritize:t})}scheduleMermaidHydration(){this.mermaidHydrator.scheduleHydration()}async flushMermaidHydrationQueue(){await this.mermaidHydrator.flushHydrationQueue()}async hydrateMermaidShell(e,t){await this.mermaidHydrator.hydrateShell(e,t)}resetHydratedMermaids(){this.mermaidHydrator.resetHydratedShells()}setupPlantUmlHydration(e){return this.plantUmlHydrator.setupHydration(e)}hydrateVisiblePlantUmls(){this.plantUmlHydrator.hydrateVisibleShells()}enqueuePlantUmlShell(e,{prioritize:t=!1}={}){this.plantUmlHydrator.enqueueShell(e,{prioritize:t})}schedulePlantUmlHydration(){this.plantUmlHydrator.scheduleHydration()}async flushPlantUmlHydrationQueue(){await this.plantUmlHydrator.flushHydrationQueue()}async hydratePlantUmlShell(e){await this.plantUmlHydrator.hydrateShell(e)}updateHydrationPhase(){if(this.hydrationPaused&&(this.mermaidHydrator.hasPendingWork()||this.plantUmlHydrator.hasPendingWork())){this.setPhase(`base`);return}if(this.mermaidHydrator.hasPendingWork()||this.plantUmlHydrator.hasPendingWork()){this.setPhase(`hydrating`);return}this.notifyReady()}notifyReady(){this.renderHost&&(this.renderHost.style.minHeight=``),this.setPhase(`ready`),this.readyRenderVersion!==this.activeRenderVersion&&(this.readyRenderVersion=this.activeRenderVersion,this.onRenderComplete?.({isLargeDocument:this.isLargeDocument,stats:this.currentStats}))}async fetchPlantUmlSvg(e){return this.plantUmlHydrator.fetchSvg(e)}async fetchPlantUmlSource(e){return this.plantUmlHydrator.fetchSource(e)}async fetchMermaidSource(e){return this.mermaidHydrator.fetchSource(e)}resetPlantUmlShell(e,{clearCache:t=!1,message:n=`Renders server-side when visible`}={}){this.plantUmlHydrator.resetShell(e,{clearCache:t,message:n})}enhancePlantUmlDiagram(e,t){this.plantUmlHydrator.enhanceDiagram(e,t)}enhanceMermaidDiagram(e,t){this.mermaidHydrator.enhanceDiagram(e,t)}createMermaidZoomButton(e,t){return this.mermaidHydrator.createZoomButton(e,t)}createPlantUmlToolButton(e,t){return this.plantUmlHydrator.createToolButton(e,t)}},ke=class{constructor({backlinksPanel:e,clearInitialFileBootstrap:t,clearStaticPreviewDocument:n=null,closeSidebarOnMobile:r,drawioEmbed:i,elements:a,excalidrawEmbed:o,fileHistoryView:s=null,fileExplorer:c,getIsTabActive:l,getSessionLoadToken:u,gitDiffView:d,gitPanel:f,imageLightbox:p=null,lobby:m,navigation:h,previewRenderer:g,renderAvatars:_,renderPresence:v,resetPreviewMode:y,scrollSyncController:b,setSession:x,setSessionLoadToken:ee,setSidebarTab:S,setCurrentFilePath:C,showGitCommit:w,showGitDiff:T,showGitFileHistory:E,showGitFilePreview:D,showGitHistory:O,syncMainChrome:k,videoEmbed:A,workspaceCoordinator:j,layoutController:M}){this.backlinksPanel=e,this.clearInitialFileBootstrap=t,this.clearStaticPreviewDocument=n,this.closeSidebarOnMobile=r,this.drawioEmbed=i??{setHydrationPaused(){}},this.elements=a,this.excalidrawEmbed=o,this.fileHistoryView=s,this.fileExplorer=c,this.getIsTabActive=l,this.getSessionLoadToken=u,this.gitDiffView=d,this.gitPanel=f,this.imageLightbox=p,this.lobby=m,this.navigation=h,this.previewRenderer=g,this.renderAvatars=_,this.renderPresence=v,this.resetPreviewMode=y,this.scrollSyncController=b,this.setSession=x,this.setSessionLoadToken=ee,this.setSidebarTab=S,this.setCurrentFilePath=C,this.showGitCommit=w,this.showGitDiff=T,this.showGitFileHistory=E,this.showGitFilePreview=D,this.showGitHistory=O,this.syncMainChrome=k,this.videoEmbed=A,this.workspaceCoordinator=j,this.layoutController=M}async handleHashChange(){if(!this.getIsTabActive())return;let e=this.navigation.getHashRoute();if(e.type===`empty`){this.gitPanel.setSelection(),this.showEmptyState(),this.syncMainChrome({mode:`empty`,title:`CollabMD`});return}if(e.type===`git-diff`){this.setSidebarTab(`git`),await this.showGitDiff(e);return}if(e.type===`git-file-history`){this.setSidebarTab(`files`),await this.showGitFileHistory(e);return}if(e.type===`git-file-preview`){this.setSidebarTab(`files`),await this.showGitFilePreview(e);return}if(e.type===`git-history`){this.setSidebarTab(`git`),await this.showGitHistory();return}if(e.type===`git-commit`){this.setSidebarTab(`git`),await this.showGitCommit(e);return}this.setSidebarTab(`files`),await this.openFile(e.filePath,{drawioMode:e.drawioMode||null})}showEmptyState(){this.gitDiffView.hide(),this.fileHistoryView?.hide?.(),this.workspaceCoordinator.cleanupSession(),this.clearStaticPreviewDocument?.(),this.setSession(null),this.setSessionLoadToken(this.getSessionLoadToken()+1),this.clearInitialFileBootstrap(),this.resetPreviewMode(),this.elements.outlineToggle?.classList.remove(`hidden`),this.elements.markdownToolbar?.classList.add(`hidden`),this.setCurrentFilePath(null),this.lobby.setCurrentFile(null),this.fileExplorer.setActiveFile(null),this.elements.emptyState?.classList.remove(`hidden`),this.elements.editorPage?.classList.add(`hidden`),this.elements.diffPage?.classList.add(`hidden`),this.elements.previewContent&&(this.elements.previewContent.innerHTML=``,this.elements.previewContent.dataset.renderPhase=`ready`),this.videoEmbed?.reconcileEmbeds(this.elements.previewContent),this.resetPreviewSurface(),this.renderAvatars(),this.renderPresence(),this.backlinksPanel.clear(),this.elements.activeFileName&&(this.elements.activeFileName.textContent=`CollabMD`)}showDiffState(){this.fileHistoryView?.hide?.(),this.setSessionLoadToken(this.getSessionLoadToken()+1),this.clearInitialFileBootstrap(),this.clearStaticPreviewDocument?.(),this.workspaceCoordinator.cleanupSession(),this.setSession(null),this.resetPreviewMode(),this.layoutController.reset(),this.setCurrentFilePath(null),this.lobby.setCurrentFile(null),this.fileExplorer.setActiveFile(null),this.elements.emptyState?.classList.add(`hidden`),this.elements.editorPage?.classList.add(`hidden`),this.elements.diffPage?.classList.remove(`hidden`),this.elements.previewContent&&(this.elements.previewContent.innerHTML=``,this.elements.previewContent.dataset.renderPhase=`ready`),this.videoEmbed?.reconcileEmbeds(this.elements.previewContent),this.resetPreviewSurface(),this.elements.outlineToggle?.classList.add(`hidden`),this.elements.markdownToolbar?.classList.add(`hidden`),this.renderAvatars(),this.renderPresence(),this.backlinksPanel.clear()}showFileHistoryState(e){this.gitDiffView.hide(),this.setSessionLoadToken(this.getSessionLoadToken()+1),this.clearInitialFileBootstrap(),this.clearStaticPreviewDocument?.(),this.workspaceCoordinator.cleanupSession(),this.setSession(null),this.resetPreviewMode(),this.layoutController.reset(),this.setCurrentFilePath(e),this.lobby.setCurrentFile(null),this.fileExplorer.setActiveFile(e),this.elements.emptyState?.classList.add(`hidden`),this.elements.editorPage?.classList.add(`hidden`),this.elements.diffPage?.classList.remove(`hidden`),this.elements.previewContent&&(this.elements.previewContent.innerHTML=``,this.elements.previewContent.dataset.renderPhase=`ready`),this.videoEmbed?.reconcileEmbeds(this.elements.previewContent),this.resetPreviewSurface(),this.elements.outlineToggle?.classList.add(`hidden`),this.elements.markdownToolbar?.classList.add(`hidden`),this.renderAvatars(),this.renderPresence(),this.backlinksPanel.clear()}showPreviewOnlyState(e){this.gitDiffView.hide(),this.fileHistoryView?.hide?.(),this.setSessionLoadToken(this.getSessionLoadToken()+1),this.clearInitialFileBootstrap(),this.clearStaticPreviewDocument?.(),this.workspaceCoordinator.cleanupSession(),this.setSession(null),this.resetPreviewMode(),this.layoutController.reset(),this.setCurrentFilePath(e),this.lobby.setCurrentFile(null),this.fileExplorer.setActiveFile(e),this.elements.emptyState?.classList.add(`hidden`),this.elements.editorPage?.classList.remove(`hidden`),this.elements.diffPage?.classList.add(`hidden`),this.elements.previewContent&&(this.elements.previewContent.innerHTML=``,this.elements.previewContent.dataset.renderPhase=`ready`),this.videoEmbed?.reconcileEmbeds(this.elements.previewContent),this.resetPreviewSurface(),this.elements.markdownToolbar?.classList.add(`hidden`),this.renderAvatars(),this.renderPresence(),this.backlinksPanel.clear()}async openFile(e,t={}){this.imageLightbox?.close?.(),this.gitPanel.setSelection(),this.gitDiffView.hide(),this.fileHistoryView?.hide?.(),this.clearStaticPreviewDocument?.(),this.syncMainChrome({mode:`editor`}),await this.workspaceCoordinator.openFile(e,t),this.setSession(this.workspaceCoordinator.getSession())}cleanupSession(){this.workspaceCoordinator.cleanupSession(),this.setSession(this.workspaceCoordinator.getSession())}handleFileSelection(e,{closeSidebarOnMobile:t=!1}={}){t&&this.closeSidebarOnMobile(),this.navigation.navigateToFile(e)}resetPreviewSurface(){this.imageLightbox?.close?.(),this.previewRenderer.setHydrationPaused(!1),this.drawioEmbed.setHydrationPaused(!1),this.excalidrawEmbed.setHydrationPaused(!1),this.videoEmbed?.detachForCommit(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks()}};function B(e){let t=String(e??``).trim().replace(/\\/g,`/`).replace(/^\/+/u,``).split(`/`).map(e=>e.trim()).filter(Boolean);return t.some(e=>e===`.`||e===`..`)?``:t.join(`/`)}function V(e,t){let n=B(e),r=B(t);return n?r?`${n}/${r}`:n:r}function Ae(e,t){return e.toLowerCase().endsWith(t.toLowerCase())?e:`${e}${t}`}function je(e){return`# ${c(String(e??``).split(`/`).pop()||``)||`Untitled`}\n\n`}function Me(e){let t=B(e),n=l(t)?t:`${t}.base`;return{content:[`views:`,` - type: table`,` name: Table`,` order:`,` - file.name`,``].join(`
24
+ `),path:n}}function Ne(e){let t=B(e),n=v(t)?t:`${t}.mmd`;return{content:[`flowchart TD`,` A[Start] --> B{Decide}`,` B -->|Yes| C[Ship it]`,` B -->|No| D[Revise]`,``].join(`
25
+ `),path:n}}function Pe(e){let t=B(e),n=p(t)?t:`${t}.drawio`;return{content:[`<mxfile host="app.diagrams.net" modified="2026-01-01T00:00:00.000Z" agent="CollabMD" version="24.7.17">`,` <diagram id="page-1" name="Page-1">`,` <mxGraphModel dx="1200" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">`,` <root>`,` <mxCell id="0" />`,` <mxCell id="1" parent="0" />`,` </root>`,` </mxGraphModel>`,` </diagram>`,`</mxfile>`,``].join(`
26
+ `),path:n}}function Fe(e){let t=B(e),n=s(t)?t:`${t}.puml`;return{content:[`@startuml`,`Alice -> Bob: Hello`,`@enduml`,``].join(`
27
+ `),path:n}}var Ie=class{constructor({getFileList:e,navigation:t,refreshExplorer:n,toastController:r,vaultApiClient:i}){this.getFileList=e,this.navigation=t,this.refreshExplorer=n,this.toastController=r,this.vaultApiClient=i}handleWikiLinkClick(e){let t=y(e,this.getFileList());if(t){this.navigation.navigateToFile(t);return}let n=this.normalizeNewWikiFilePath(e);if(!n){this.toastController.show(`Cannot create an empty wiki-link target`);return}this.createAndOpenFile(n,e)}normalizeNewWikiFilePath(e){let t=B(e);return t?t.endsWith(`.md`)?t:`${t}.md`:null}async createAndOpenFile(e,t){try{await this.vaultApiClient.createFile({content:je(t||e),path:e}),await this.refreshExplorer(),this.navigation.navigateToFile(e)}catch(e){this.toastController.show(`Failed to create file: ${e.message}`)}}},Le=class{constructor({backlinksPanel:e,basesPreview:t=null,drawioEmbed:n,elements:r,excalidrawEmbed:i,getDisplayName:a,getSession:o,isDrawioFile:s,isExcalidrawFile:c,isBaseFile:u,isImageFile:d,isMermaidFile:f,isPlantUmlFile:p,layoutController:m,outlineController:h,previewRenderer:g,schedulePreviewLayoutSync:_,scrollSyncController:v,videoEmbed:y}){this.backlinksPanel=e,this.basesPreview=t??{reconcileEmbeds(){},renderStandalone(){}},this.drawioEmbed=n??{detachForCommit(){},hydrateVisibleEmbeds(){},reconcileEmbeds(){},setHydrationPaused(){},syncLayout(){},updateLocalUser(){},updateTheme(){}},this.elements=r,this.excalidrawEmbed=i,this.getDisplayName=a,this.getSession=o,this.isDrawioFile=s??(()=>!1),this.isExcalidrawFile=c??(()=>!1),this.isBaseFile=u??l,this.isImageFile=d??(()=>!1),this.isMermaidFile=f??(()=>!1),this.isPlantUmlFile=p??(()=>!1),this.layoutController=m,this.outlineController=h,this.previewRenderer=g,this.schedulePreviewLayoutSyncCallback=_,this.scrollSyncController=v,this.videoEmbed=y}createDiagramPreviewDocument(e,t=``){let n=String(t??``),r=Math.max(...n.match(/`+/g)?.map(e=>e.length)??[0]),i="`".repeat(Math.max(3,r+1));return`${i}${e}\n${n}\n${i}`}getPreviewSource(e,{drawioMode:t=null}={}){let n=this.getSession()?.getText()??``;return this.isMermaidFile(e)?this.createDiagramPreviewDocument(`mermaid`,n):this.isPlantUmlFile(e)?this.createDiagramPreviewDocument(`plantuml`,n):this.isDrawioFile(e)&&t===`text`?this.createDiagramPreviewDocument(`xml`,n):n}resetPreviewMode(){this.elements.previewContent?.classList.remove(`is-drawio-file-preview`),this.elements.previewContent?.classList.remove(`is-excalidraw-file-preview`),this.elements.previewContent?.classList.remove(`is-base-file-preview`),this.elements.previewContent?.classList.remove(`is-image-file-preview`),this.elements.previewContent?.classList.remove(`is-mermaid-file-preview`),this.elements.previewContent?.classList.remove(`is-plantuml-file-preview`)}syncFileChrome(e,{drawioMode:t=null,preferPreviewForBase:n=!1}={}){let r=this.isDrawioFile(e),i=this.isExcalidrawFile(e),o=this.isBaseFile(e),s=this.isImageFile(e),c=u(e),l=this.isMermaidFile(e),d=this.isPlantUmlFile(e),f=a(e),p=i||r&&t!==`text`;if(this.backlinksPanel.setDisplayMode?.(p?`header`:`dock`),this.elements.editorFindButton?.classList.toggle(`hidden`,!c),this.elements.markdownToolbar?.classList.toggle(`hidden`,!c),this.elements.exportMenuGroup?.classList.toggle(`hidden`,!c),this.elements.outlineToggle?.classList.toggle(`hidden`,f||s||o),this.elements.previewContent?.classList.toggle(`is-mermaid-file-preview`,l),this.elements.previewContent?.classList.toggle(`is-plantuml-file-preview`,d),r&&t!==`text`||i||s||o&&n){this.layoutController.setView(`preview`,{persist:!1}),this.outlineController.close(),this.backlinksPanel.clear();return}(l||d)&&(this.outlineController.close(),this.backlinksPanel.clear())}renderExcalidrawFilePreview(e){let t=this.elements.previewContent;if(!t)return;this.videoEmbed?.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit(),this.resetPreviewMode(),t.classList.add(`is-excalidraw-file-preview`);let n=this.previewRenderer.ensureRenderHost();this.previewRenderer.normalizePreviewChildren(n);let r=document.createElement(`div`);r.className=`excalidraw-embed-placeholder`,r.dataset.embedKey=`${e}#file-preview`,r.dataset.embedLabel=this.getDisplayName(e),r.dataset.embedTarget=e;let i=document.createElement(`div`);i.className=`preview-shell`,i.textContent=`Loading Excalidraw preview…`,r.appendChild(i),n&&(n.replaceChildren(r),n.style.minHeight=``),t.dataset.renderPhase=`ready`,this.outlineController.refresh(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.videoEmbed?.reconcileEmbeds(t),this.drawioEmbed.reconcileEmbeds(t),this.excalidrawEmbed.reconcileEmbeds(t,{isLargeDocument:!1}),this.drawioEmbed.hydrateVisibleEmbeds(),this.excalidrawEmbed.hydrateVisibleEmbeds(),this.schedulePreviewLayoutSyncCallback({delayMs:0})}renderDrawioFilePreview(e){let t=this.elements.previewContent;if(!t)return;this.videoEmbed?.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit(),this.resetPreviewMode(),t.classList.add(`is-drawio-file-preview`);let n=this.previewRenderer.ensureRenderHost();this.previewRenderer.normalizePreviewChildren(n);let r=document.createElement(`div`);r.className=`drawio-embed-placeholder`,r.dataset.drawioKey=`${e}#file-preview`,r.dataset.drawioLabel=this.getDisplayName(e),r.dataset.drawioMode=`edit`,r.dataset.drawioTarget=e;let i=document.createElement(`div`);i.className=`preview-shell`,i.textContent=`Loading draw.io preview…`,r.appendChild(i),n&&(n.replaceChildren(r),n.style.minHeight=``),t.dataset.renderPhase=`ready`,this.outlineController.refresh(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.videoEmbed?.reconcileEmbeds(t),this.drawioEmbed.reconcileEmbeds(t),this.drawioEmbed.hydrateVisibleEmbeds(),this.schedulePreviewLayoutSyncCallback({delayMs:0})}renderImageFilePreview(e){let t=this.elements.previewContent;if(!t)return;this.videoEmbed?.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit(),this.resetPreviewMode(),t.classList.add(`is-image-file-preview`);let n=this.previewRenderer.ensureRenderHost();this.previewRenderer.normalizePreviewChildren(n);let r=document.createElement(`figure`);r.className=`image-file-preview-shell`;let i=document.createElement(`img`);i.className=`image-file-preview-image`,i.alt=this.getDisplayName(e),i.src=O(`/attachment?path=${encodeURIComponent(e)}`),r.appendChild(i),n&&(n.replaceChildren(r),n.style.minHeight=``),t.dataset.renderPhase=`ready`,this.outlineController.refresh(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.videoEmbed?.reconcileEmbeds(t),this.schedulePreviewLayoutSyncCallback({delayMs:0})}async renderBaseFilePreview(e,{source:t=null}={}){let n=this.elements.previewContent;if(!n)return;this.videoEmbed?.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit(),this.resetPreviewMode(),n.classList.add(`is-base-file-preview`);let r=this.previewRenderer.ensureRenderHost();this.previewRenderer.normalizePreviewChildren(r),r&&(r.replaceChildren(),r.style.minHeight=``),await this.basesPreview.renderStandalone({filePath:e,renderHost:r,source:typeof t==`string`?t:this.getSession()?.getText?.()??null}),n.dataset.renderPhase=`ready`,this.outlineController.close(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.videoEmbed?.reconcileEmbeds(n),this.schedulePreviewLayoutSyncCallback({delayMs:0})}renderTextFilePreview({content:e=``}={}){let t=this.elements.previewContent;if(!t)return;this.videoEmbed?.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit(),this.resetPreviewMode();let n=this.previewRenderer.ensureRenderHost();this.previewRenderer.normalizePreviewChildren(n);let r=document.createElement(`div`);r.className=`preview-shell`;let i=document.createElement(`pre`),a=document.createElement(`code`);a.textContent=String(e??``),i.appendChild(a),r.appendChild(i),n&&(n.replaceChildren(r),n.style.minHeight=``),t.dataset.renderPhase=`ready`,this.outlineController.close(),this.backlinksPanel.clear(),this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.videoEmbed?.reconcileEmbeds(t),this.schedulePreviewLayoutSyncCallback({delayMs:0})}createResizeHandler(e){let t=null;return()=>{clearTimeout(t),t=setTimeout(()=>{e?.(),this.schedulePreviewLayoutSyncCallback({delayMs:0})},100)}}initializePreviewLayoutObserver(e=()=>{}){if(typeof ResizeObserver!=`function`||!this.elements.previewContent)return null;let t=new ResizeObserver(()=>{e()});return t.observe(this.elements.previewContent),t}schedulePreviewLayoutSync({hydrationPaused:e,previewLayoutSyncTimer:t,setPendingPreviewLayoutSync:n,setPreviewLayoutSyncTimer:r,delayMs:i=120}){if(e){n(!0);return}clearTimeout(t),r(setTimeout(()=>{r(null);let t=!!this.getSession(),i=this.elements.previewContent?.classList?.contains?.(`is-drawio-file-preview`)??!1,a=this.elements.previewContent?.classList?.contains?.(`is-excalidraw-file-preview`)??!1;if(!(!t&&!i&&!a||!this.elements.previewContent)&&this.elements.previewContent.dataset.renderPhase!==`shell`){if(e){n(!0);return}this.previewRenderer.scheduleActiveMermaidRefit(),this.previewRenderer.scheduleActivePlantUmlRefit(),this.videoEmbed?.syncLayout(),this.drawioEmbed.syncLayout(),this.excalidrawEmbed.syncLayout(),!((i||a)&&!t)&&(this.scrollSyncController.invalidatePreviewBlocks(),this.scrollSyncController.warmPreviewBlocks({onReady:()=>{this.getSession()&&(this.scrollSyncController.realignAfterLayoutChange(),this.outlineController.scheduleActiveHeadingUpdate())}}))}},i))}handleEditorScrollActivityChange({isActive:e,pendingPreviewLayoutSync:t,previewLayoutSyncTimer:n,setHydrationPaused:r,setPendingPreviewLayoutSync:i,setPreviewLayoutSyncTimer:a}){let o=!!e;if(r(o),this.previewRenderer.setHydrationPaused(o),this.drawioEmbed.setHydrationPaused(o),this.excalidrawEmbed.setHydrationPaused(o),o){clearTimeout(n),a(null),i(!0);return}t&&(i(!1),this.schedulePreviewLayoutSync({delayMs:0,hydrationPaused:!1,previewLayoutSyncTimer:null,setPendingPreviewLayoutSync:i,setPreviewLayoutSyncTimer:a}))}},Re=class{constructor({attachEditorScroller:e,createEditorSession:t,loadEditorSessionClass:n,scrollContainerForSession:r}){this.attachEditorScroller=e,this.createEditorSession=t,this.loadEditorSessionClass=n,this.scrollContainerForSession=r}async createSession(e){let t=await this.loadEditorSessionClass();return this.createEditorSession(t,e)}attachSessionScroller(e){this.attachEditorScroller(this.scrollContainerForSession(e))}clearSessionScroller(){this.attachEditorScroller(null)}},ze=class{constructor({beginDocumentLoad:e,getDisplayName:t,loadBacklinks:n,onBeforeFileOpen:r,onRenderDrawioPreview:i,onFileOpenError:a,onFileOpenReady:o,onRenderBasePreview:s,onRenderExcalidrawPreview:c,onRenderImagePreview:l,onSyncWrapToggle:u,onUpdateActiveFile:d,onUpdateCurrentFile:f,onUpdateLobbyCurrentFile:p,onUpdateVisibleChrome:m,onViewModeReset:h,renderPresence:g,showEditorLoading:_,stateStore:v}){this.beginDocumentLoad=e??(()=>{}),this.getDisplayName=t??(e=>e),this.loadBacklinks=n??(()=>{}),this.onBeforeFileOpen=r??(()=>{}),this.onRenderDrawioPreview=i??(()=>{}),this.onFileOpenError=a??(()=>{}),this.onFileOpenReady=o??(()=>{}),this.onRenderBasePreview=s??(()=>{}),this.onRenderExcalidrawPreview=c??(()=>{}),this.onRenderImagePreview=l??(()=>{}),this.onSyncWrapToggle=u??(()=>{}),this.onUpdateActiveFile=d??(()=>{}),this.onUpdateCurrentFile=f??(()=>{}),this.onUpdateLobbyCurrentFile=p??(()=>{}),this.onUpdateVisibleChrome=m??(()=>{}),this.onViewModeReset=h??(()=>{}),this.renderPresence=g??(()=>{}),this.showEditorLoading=_??(()=>{}),this.stateStore=v}prepareForFileOpen(e,{drawioMode:t=null,resetConnectionState:n=!0}={}){return this.onViewModeReset(),this.onBeforeFileOpen(),this.stateStore.set(`connectionHelpShown`,!1),n&&this.stateStore.set(`connectionState`,{status:`connecting`,unreachable:!1}),this.stateStore.set(`currentDrawioMode`,t??null),this.stateStore.set(`currentFilePath`,e),this.onUpdateCurrentFile(e),this.onUpdateLobbyCurrentFile(e),this.onUpdateActiveFile(e),this.onUpdateVisibleChrome(e,{displayName:this.getDisplayName(e),drawioMode:t,isMarkdown:u(e)}),this.showEditorLoading(),this.beginDocumentLoad(),this.renderPresence(),{supportsBacklinks:m(e)}}markFileOpenReady(e){this.onFileOpenReady(e)}finalizeFileOpen({isBase:e=!1,isDrawio:t=!1,filePath:n,isExcalidraw:r=!1,isImage:i=!1,supportsBacklinks:a}){r&&this.onRenderExcalidrawPreview(n),(e||l(n))&&this.onRenderBasePreview(n),t&&this.onRenderDrawioPreview(n),i&&this.onRenderImagePreview(n),this.onSyncWrapToggle(),a&&this.loadBacklinks(n)}handleFileOpenError(){this.onFileOpenError()}},Be=150;function Ve(e){return new Promise(t=>{setTimeout(t,e)})}var He=class{constructor({attachEditorScroller:e,beginDocumentLoad:t,cleanupAfterSessionDestroy:n,createEditorSession:r,getDisplayName:i,getFileList:a,getLineWrappingEnabled:o,getLocalUser:s,getStoredUserName:c,getTheme:l,isBaseFile:u,isDrawioFile:d,isExcalidrawFile:f,isImageFile:p,isMermaidFile:m,isPlantUmlFile:h,isTabActive:g,loadBootstrapContent:_=null,loadEditorSessionClass:v,loadBacklinks:y,onBeforeFileOpen:b,onConnectionChange:x,onContentChange:ee,onCommentsChange:S,onFileAwarenessChange:C,onFileOpenError:w,onFileOpenReady:T,onImagePaste:E,onSelectionChange:D,onSessionAssigned:O=null,onFileOpenMetric:k=null,onRenderBasePreview:A,onRenderExcalidrawPreview:j,onRenderDrawioPreview:M,onRenderImagePreview:te,onSyncWrapToggle:N,onUpdateActiveFile:P,onUpdateCurrentFile:ne,onUpdateLobbyCurrentFile:re,onUpdateVisibleChrome:ie,onViewModeReset:ae,renderPresence:F,scrollContainerForSession:oe,shouldUseDrawioPreview:se=null,showEditorLoading:I,stateStore:ce}){this.attachEditorScroller=e,this.beginDocumentLoad=t,this.cleanupAfterSessionDestroy=n,this.createEditorSession=r,this.getDisplayName=i,this.getFileList=a,this.getLineWrappingEnabled=o,this.getLocalUser=s,this.getStoredUserName=c,this.getTheme=l,this.isBaseFile=u??(()=>!1),this.isDrawioFile=d??(()=>!1),this.isExcalidrawFile=f??(()=>!1),this.isImageFile=p??(()=>!1),this.isMermaidFile=m??(()=>!1),this.isPlantUmlFile=h??(()=>!1),this.isTabActive=g,this.loadBootstrapContent=_,this.loadEditorSessionClassPort=v,this.loadBacklinks=y,this.onBeforeFileOpen=b,this.onConnectionChange=x,this.onContentChange=ee,this.onCommentsChange=S,this.onFileAwarenessChange=C,this.onFileOpenError=w,this.onFileOpenReady=T,this.onImagePaste=E,this.onSelectionChange=D,this.onSessionAssigned=O,this.onFileOpenMetric=k,this.onRenderBasePreview=A,this.onRenderExcalidrawPreview=j,this.onSyncWrapToggle=N,this.onUpdateActiveFile=P,this.onUpdateCurrentFile=ne,this.onUpdateLobbyCurrentFile=re,this.onUpdateVisibleChrome=ie,this.renderPresence=F,this.shouldUseDrawioPreview=se??(()=>!0),this.stateStore=ce,this.session=null,this.lifecycle=new Re({attachEditorScroller:e,createEditorSession:r,loadEditorSessionClass:()=>this.loadEditorSessionClassPort(),scrollContainerForSession:oe}),this.chromeController=new ze({beginDocumentLoad:t,getDisplayName:i,loadBacklinks:y,onBeforeFileOpen:b,onRenderDrawioPreview:M,onFileOpenError:w,onFileOpenReady:T,onRenderBasePreview:A,onRenderExcalidrawPreview:j,onRenderImagePreview:te,onSyncWrapToggle:N,onUpdateActiveFile:P,onUpdateCurrentFile:ne,onUpdateLobbyCurrentFile:re,onUpdateVisibleChrome:ie,onViewModeReset:ae,renderPresence:F,showEditorLoading:I,stateStore:ce})}getSession(){return this.session}loadEditorSessionClass(){return this.loadEditorSessionClassPort()}waitForNextPaint(){return new Promise(e=>{requestAnimationFrame(()=>{requestAnimationFrame(e)})})}reportFileOpenMetric(e,t,n={}){this.onFileOpenMetric?.(e,{filePath:this.stateStore.get(`currentFilePath`),loadToken:t,...n})}cleanupSession(){this.session?.destroy(),this.session=null,this.lifecycle.clearSessionScroller(),this.cleanupAfterSessionDestroy()}async openFile(e,{drawioMode:t=null}={}){if(!this.isTabActive())return;let n=t??null,r=this.stateStore.get(`currentDrawioMode`)??null,i=this.isDrawioFile(e)&&t!==`text`&&this.shouldUseDrawioPreview(e),a=this.isExcalidrawFile(e),o=this.isBaseFile(e),s=this.isImageFile(e),c=this.isMermaidFile(e),l=this.isPlantUmlFile(e);if(e===this.stateStore.get(`currentFilePath`)&&n===r&&(this.session||i||a||s)){this.onUpdateActiveFile(e),this.onUpdateLobbyCurrentFile(e);return}let u=this.stateStore.nextSessionLoadToken(),d=performance.now();this.cleanupSession();let f=this.chromeController.prepareForFileOpen(e,{drawioMode:n,resetConnectionState:!i&&!a&&!s});if(this.reportFileOpenMetric(`open_started`,u,{filePath:e}),i||a||s){if(this.onSessionAssigned?.(null),u!==this.stateStore.get(`sessionLoadToken`))return;this.chromeController.markFileOpenReady(null),this.chromeController.finalizeFileOpen({filePath:e,isBase:o,isDrawio:i,isExcalidraw:a,isImage:s,session:null,supportsBacklinks:f.supportsBacklinks});return}let p=await this.lifecycle.createSession({filePath:e,getFileList:this.getFileList,lineWrappingEnabled:this.getLineWrappingEnabled(),localUser:this.getLocalUser(),onAwarenessChange:e=>this.onFileAwarenessChange(e),onConnectionChange:e=>this.onConnectionChange(e),onCommentsChange:e=>this.onCommentsChange?.(e),onContentChange:()=>{a||this.onContentChange({isBase:o,isMermaid:c,isPlantUml:l})},onImagePaste:e=>this.onImagePaste?.(e),preferredUserName:this.getStoredUserName(),onSelectionChange:e=>this.onSelectionChange?.(e),theme:this.getTheme()});this.session=p,this.onSessionAssigned?.(p);try{let t=!1,n=!1,r=!1,i=async r=>{t||u!==this.stateStore.get(`sessionLoadToken`)||(t=!0,this.lifecycle.attachSessionScroller(p),p.applyTheme(this.getTheme()),this.chromeController.markFileOpenReady(p),this.reportFileOpenMetric(`editor_ready`,u,{reason:r}),p.requestMeasure(),await this.waitForNextPaint(),!(n||u!==this.stateStore.get(`sessionLoadToken`))&&(n=!0,this.chromeController.finalizeFileOpen({filePath:e,isBase:o,isExcalidraw:a,session:p,supportsBacklinks:f.supportsBacklinks})))},s=this.loadBootstrapContent?(async()=>{this.reportFileOpenMetric(`bootstrap_fetch_started`,u);try{let t=await this.loadBootstrapContent(e);return this.reportFileOpenMetric(`bootstrap_fetch_completed`,u,{found:t!==null}),t}catch(e){return this.reportFileOpenMetric(`bootstrap_fetch_completed`,u,{error:e.message,found:!1}),null}})():Promise.resolve(null),c=p.initialize(e),l=(async()=>(await c,u!==this.stateStore.get(`sessionLoadToken`)||(await p.waitForInitialSync(null),u!==this.stateStore.get(`sessionLoadToken`))?!1:(r=!0,p.activateCollaborativeView?.(),this.lifecycle.attachSessionScroller(p),p.applyTheme(this.getTheme()),this.reportFileOpenMetric(`initial_sync_complete`,u),p.ensureInitialContent?.(),t?p.requestMeasure():await i(`live-sync`),!0)))(),m=(async()=>{let n=await s;if(n===null||r||t||u!==this.stateStore.get(`sessionLoadToken`))return!1;let a=performance.now()-d,o=Math.max(0,Be-a);return o>0&&await Promise.race([l.then(e=>e?`live-sync`:`stale`),Ve(o).then(()=>`timeout`)])===`live-sync`||r||t||u!==this.stateStore.get(`sessionLoadToken`)||!p.showBootstrapContent({content:n,filePath:e})&&!p.hasBootstrapContent?.()?!1:(this.reportFileOpenMetric(`bootstrap_shown`,u),await i(`bootstrap`),!0)})();if(await c,u!==this.stateStore.get(`sessionLoadToken`)){p.destroy();return}if(await Promise.all([l,m]),u!==this.stateStore.get(`sessionLoadToken`)){p.destroy();return}t||(p.ensureInitialContent?.(),await i(`post-initialize`))}catch(e){if(console.error(`[app] Failed to initialize editor:`,e),p.destroy(),this.lifecycle.clearSessionScroller(),this.session===p&&(this.session=null),u!==this.stateStore.get(`sessionLoadToken`))return;this.chromeController.handleFileOpenError()}}},Ue=class{constructor(e={}){this.state={activeSidebarTab:`files`,chatInitialSyncComplete:!1,chatIsOpen:!1,chatMessageIds:new Set,chatMessages:[],chatUnreadCount:0,connectionHelpShown:!1,connectionState:{status:`disconnected`,unreachable:!1},currentDrawioMode:null,currentFilePath:null,fileExplorerReady:!1,followedCursorSignature:``,followedUserClientId:null,gitRepoAvailable:!1,globalUsers:[],isTabActive:!1,sessionLoadToken:0,...e}}get(e){return this.state[e]}set(e,t){return this.state[e]=t,t}nextSessionLoadToken(){let e=Number(this.state.sessionLoadToken||0)+1;return this.state.sessionLoadToken=e,e}replaceChatState({initialSyncComplete:e,isOpen:t,messageIds:n,messages:r,unreadCount:i}){this.state.chatMessages=Array.isArray(r)?r:[],this.state.chatMessageIds=n instanceof Set?n:new Set,this.state.chatUnreadCount=Number.isFinite(i)?i:0,this.state.chatIsOpen=!!t,this.state.chatInitialSyncComplete=!!e}};function We(e=document){return{currentUserName:e.getElementById(`currentUserName`),chatContainer:e.getElementById(`chatContainer`),chatEmptyState:e.getElementById(`chatEmptyState`),chatForm:e.getElementById(`chatForm`),chatInput:e.getElementById(`chatInput`),chatMessages:e.getElementById(`chatMessages`),chatNotificationButton:e.getElementById(`chatNotificationBtn`),chatPanel:e.getElementById(`chatPanel`),chatStatus:e.getElementById(`chatStatus`),chatToastContainer:e.getElementById(`chatToastContainer`),chatToggleBadge:e.getElementById(`chatToggleBadge`),chatToggleButton:e.getElementById(`chatToggleBtn`),gitCommitCancel:e.getElementById(`gitCommitCancel`),gitCommitCopy:e.getElementById(`gitCommitCopy`),gitCommitDialog:e.getElementById(`gitCommitDialog`),gitCommitForm:e.getElementById(`gitCommitForm`),gitCommitInput:e.getElementById(`gitCommitInput`),gitCommitSubmit:e.getElementById(`gitCommitSubmit`),gitCommitTitle:e.getElementById(`gitCommitTitle`),gitResetCancel:e.getElementById(`gitResetCancel`),gitResetCopy:e.getElementById(`gitResetCopy`),gitResetDialog:e.getElementById(`gitResetDialog`),gitResetFileName:e.getElementById(`gitResetFileName`),gitResetSubmit:e.getElementById(`gitResetSubmit`),gitResetTitle:e.getElementById(`gitResetTitle`),displayNameCancel:e.getElementById(`displayNameCancel`),displayNameCopy:e.getElementById(`displayNameCopy`),displayNameDialog:e.getElementById(`displayNameDialog`),displayNameForm:e.getElementById(`displayNameForm`),displayNameInput:e.getElementById(`displayNameInput`),displayNameSubmit:e.getElementById(`displayNameSubmit`),displayNameTitle:e.getElementById(`displayNameTitle`),editNameButton:e.getElementById(`editNameBtn`),editorFindButton:e.getElementById(`editorFindBtn`),editorContainer:e.getElementById(`editorContainer`),exportDocxButton:e.getElementById(`exportDocxBtn`),exportMenuGroup:e.getElementById(`exportMenuGroup`),exportPdfButton:e.getElementById(`exportPdfBtn`),markdownToolbar:e.getElementById(`markdownToolbar`),editorPage:e.getElementById(`editor-page`),diffPage:e.getElementById(`diff-page`),fileSearch:e.getElementById(`fileSearch`),fileHistoryButton:e.getElementById(`fileHistoryBtn`),fileHistoryButtonLabel:e.getElementById(`fileHistoryBtnLabel`),filesSidebarTab:e.getElementById(`filesSidebarTab`),gitSearch:e.getElementById(`gitSearch`),gitSearchInput:e.getElementById(`gitSearchInput`),gitSidebarTab:e.getElementById(`gitSidebarTab`),gitOperationStatus:e.getElementById(`gitOperationStatus`),lineInfo:e.getElementById(`lineInfo`),mobileViewToggle:e.getElementById(`mobileViewToggle`),previewContent:e.getElementById(`previewContent`),previewContainer:e.getElementById(`previewContainer`),searchFilesButton:e.getElementById(`searchFilesBtn`),shareButton:e.getElementById(`shareBtn`),toastContainer:e.getElementById(`toastContainer`),toggleWrapButton:e.getElementById(`toggleWrapBtn`),userAvatars:e.getElementById(`userAvatars`),userCount:e.getElementById(`userCount`),wrapToggleLabel:e.getElementById(`wrapToggleLabel`),activeFileName:e.getElementById(`activeFileName`),sidebarToggle:e.getElementById(`sidebarToggle`),sidebarClose:e.getElementById(`sidebarClose`),sidebar:e.getElementById(`sidebar`),emptyState:e.getElementById(`emptyState`),emptyStateNewFileBtn:e.getElementById(`emptyStateNewFileBtn`),emptyStateSearchBtn:e.getElementById(`emptyStateSearchBtn`),backlinksPanel:e.getElementById(`backlinksPanel`),backlinksHeaderPanel:e.getElementById(`backlinksHeaderPanel`),backlinksInlinePanel:e.getElementById(`backlinksInlinePanel`),commentSelectionButton:e.getElementById(`commentSelectionBtn`),commentsDrawer:e.getElementById(`commentsDrawer`),commentsDrawerEmpty:e.getElementById(`commentsDrawerEmpty`),commentsDrawerList:e.getElementById(`commentsDrawerList`),commentsToggleButton:e.getElementById(`commentsToggle`),outlineToggle:e.getElementById(`outlineToggle`),tabLockCopy:e.getElementById(`tabLockCopy`),tabLockOverlay:e.getElementById(`tabLockOverlay`),tabLockTakeoverButton:e.getElementById(`tabLockTakeoverBtn`),tabLockTitle:e.getElementById(`tabLockTitle`),toolbarCenter:e.getElementById(`toolbarCenter`),toolbarDiffBadge:e.getElementById(`toolbarDiffBadge`),toolbarOverflowMenu:e.getElementById(`toolbarOverflowMenu`),toolbarOverflowToggle:e.getElementById(`toolbarOverflowToggle`),sidebarTabs:e.getElementById(`sidebarTabs`)}}var Ge={updateChatMessages(e,{initial:t=!1}={}){let n=new Set(this.chatMessageIds),r=this.lobby.getLocalUser()?.peerId??null;if(this.chatMessages=e,this.chatMessageIds=new Set(e.map(e=>e.id)),!this.chatInitialSyncComplete){t&&(this.chatInitialSyncComplete=!0),this.renderChat();return}let i=e.filter(e=>!n.has(e.id)&&e.peerId&&e.peerId!==r);this.chatIsOpen?this.chatUnreadCount=0:i.length>0&&(this.chatUnreadCount+=i.length);for(let e of i)this.maybeNotifyChatMessage(e);this.renderChat()},toggleChatPanel(){if(this.chatIsOpen){this.closeChatPanel();return}this.openChatPanel()},openChatPanel(){this.chatIsOpen=!0,this.chatUnreadCount=0,this.renderChat(),requestAnimationFrame(()=>{this.elements.chatInput?.focus(),this.scrollChatToBottom()})},closeChatPanel(){this.chatIsOpen&&(this.chatIsOpen=!1,this.renderChat())},handleChatSubmit(){if(!this.isTabActive)return;let e=this.elements.chatInput;if(e){if(!this.lobby.sendChatMessage(e.value)){e.focus();return}if(e.value=``,!this.chatIsOpen){this.openChatPanel();return}this.renderChat()}},renderChat(){this.elements.chatContainer?.classList.toggle(`is-open`,this.chatIsOpen),this.elements.chatPanel?.classList.toggle(`hidden`,!this.chatIsOpen),this.syncChatToggleButton(),this.syncChatNotificationButton();let e=this.elements.chatMessages,t=this.elements.chatEmptyState;if(this.elements.chatStatus&&(this.elements.chatStatus.textContent=this.chatInitialSyncComplete?`${this.globalUsers.length} online`:`Syncing...`),!e)return;if(e.replaceChildren(),this.chatMessages.length===0){t?.classList.remove(`hidden`),e.classList.add(`hidden`);return}t?.classList.add(`hidden`),e.classList.remove(`hidden`);let n=document.createDocumentFragment();this.chatMessages.forEach(e=>{n.appendChild(this.createChatMessageElement(e))}),e.appendChild(n),this.chatIsOpen&&this.scrollChatToBottom()},createChatMessageElement(e){let t=document.createElement(`article`),n=e.peerId===this.lobby.getLocalUser()?.peerId;t.className=`chat-message`,t.classList.toggle(`is-local`,n);let r=document.createElement(`div`);r.className=`chat-message-avatar`,r.style.backgroundColor=e.userColor||`var(--color-primary)`,r.textContent=(e.userName||`?`).charAt(0).toUpperCase(),r.setAttribute(`aria-hidden`,`true`);let i=document.createElement(`div`);i.className=`chat-message-body`;let a=document.createElement(`div`);a.className=`chat-message-meta`;let o=document.createElement(`span`);o.className=`chat-message-author`,o.textContent=n?`${e.userName} (you)`:e.userName;let s=document.createElement(`span`);s.className=`chat-message-time`,s.textContent=this.formatChatTimestamp(e.createdAt),a.append(o,s);let c=this.getChatMessageFileLabel(e.filePath);if(c){let e=document.createElement(`span`);e.className=`chat-message-file`,e.textContent=c,a.append(e)}let l=document.createElement(`p`);return l.className=`chat-message-text`,l.textContent=e.text,i.append(a,l),t.append(r,i),t},scrollChatToBottom(){let e=this.elements.chatMessages;e&&requestAnimationFrame(()=>{e.scrollTop=e.scrollHeight})},formatChatTimestamp(e){if(!Number.isFinite(e))return``;try{return this.chatTimeFormatter.format(new Date(e))}catch{return``}},getChatMessageFileLabel(e){return e?this.getDisplayName(e):``},formatChatToastMessage(e){let t=e?.userName||`Someone`,n=String(e?.text??``).replace(/\s+/g,` `).trim();return`${t}: ${n.length>88?`${n.slice(0,85).trimEnd()}...`:n}`},syncChatToggleButton(){let e=this.elements.chatToggleButton,t=this.elements.chatToggleBadge;if(!e)return;let n=this.chatUnreadCount>0,r=n&&!this.chatIsOpen;e.classList.toggle(`is-active`,this.chatIsOpen),e.classList.toggle(`is-unread`,r),e.setAttribute(`aria-expanded`,String(this.chatIsOpen)),e.setAttribute(`aria-label`,n?`Open team chat, ${this.chatUnreadCount} unread`:`Open team chat`),e.title=this.chatUnreadCount>0?`Team chat (${this.chatUnreadCount} unread)`:`Team chat`,t&&(t.classList.toggle(`hidden`,!n),t.textContent=this.chatUnreadCount>9?`9+`:String(this.chatUnreadCount))},syncChatNotificationButton(){let e=this.elements.chatNotificationButton;if(!e)return;let t=this.notifications.getPermission();this.chatNotificationPermission=t;let n=`Enable alerts`,r=`Enable browser notifications for new chat messages`,i=!1;t===`unsupported`?(n=`No alerts`,r=`Browser notifications are unavailable here`):t===`denied`?(n=`Alerts blocked`,r=`Browser notifications are blocked for this site`):t===`granted`&&(i=this.chatNotificationsEnabled,n=i?`Alerts on`:`Alerts off`,r=i?`Disable browser notifications for chat`:`Enable browser notifications for chat`),e.textContent=n,e.title=r,e.setAttribute(`aria-pressed`,String(i)),e.classList.toggle(`is-enabled`,i),e.classList.toggle(`is-blocked`,t===`denied`)},async handleChatNotificationToggle(){let e=this.notifications.getPermission();if(this.chatNotificationPermission=e,e===`unsupported`){this.toastController.show(`Browser notifications are unavailable here`),this.syncChatNotificationButton();return}if(e===`denied`){this.chatNotificationsEnabled=!1,this.preferences.setChatNotificationsEnabled(!1),this.toastController.show(`Browser notifications are blocked for this site`),this.syncChatNotificationButton();return}if(e===`default`){let e=await this.notifications.requestPermission();if(this.chatNotificationPermission=e,e!==`granted`){this.chatNotificationsEnabled=!1,this.preferences.setChatNotificationsEnabled(!1),e===`denied`&&this.toastController.show(`Browser notifications were blocked`),this.syncChatNotificationButton();return}this.chatNotificationsEnabled=!0,this.preferences.setChatNotificationsEnabled(!0),this.syncChatNotificationButton();return}this.chatNotificationsEnabled=!this.chatNotificationsEnabled,this.preferences.setChatNotificationsEnabled(this.chatNotificationsEnabled),this.syncChatNotificationButton()},maybeNotifyChatMessage(e){if(this.chatInitialSyncComplete){if(document.hidden){this.maybeShowBrowserChatNotification(e);return}!this.isTabActive||this.chatIsOpen||(this.chatToastController??this.toastController).show(this.formatChatToastMessage(e),4e3)}},maybeShowBrowserChatNotification(e){if(!this.chatNotificationsEnabled||this.notifications.getPermission()!==`granted`)return;let t=`CollabMD chat • ${e.userName}`,n=this.getChatMessageFileLabel(e.filePath),r=n?`${n}: ${e.text}`:e.text,i=this.notifications.createNotification({body:r,onClick:()=>{e.filePath&&this.navigation.navigateToFile(e.filePath)},tag:`collabmd-chat-${e.id}`,title:t});i&&setTimeout(()=>{i.close?.()},6e3)}},Ke={getCommentFileKind(e=this.currentFilePath){return f(e)||`markdown`},syncCommentChrome(e=this.currentFilePath){let t=d(e)&&!this.isExcalidrawFile(e);this.commentUi.setCurrentFile(e,{fileKind:this.getCommentFileKind(e),supported:t}),this.handleCommentThreadsChange(this.session?.getCommentThreads?.()??[]),this.handleCommentSelectionChange(this.session?.getCurrentSelectionCommentAnchor?.()??null)},handleCommentSelectionChange(e){this.commentUi.setSelectionAnchor(e)},handleCommentThreadsChange(e=[]){this.commentUi.setThreads(e)},handleCommentEditorContentChange(){this.commentUi.handleEditorContentChange()},refreshCommentUiLayout(){this.commentUi.refreshLayout()}},qe=`collabmd-export-page`,Je=`collabmd-export-host`,Ye=500,Xe=6e4,Ze=new Map,Qe=null;function $e(){return`export-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function et(e){return e===`pdf`?`pdf`:`docx`}function tt({filePath:e,format:t,jobId:n}){let r=new URL(T(`/export-document.html`),window.location.origin);return r.searchParams.set(`action`,et(t)),r.searchParams.set(`job`,n),e&&r.searchParams.set(`file`,e),r.toString()}function nt({fileList:e=[],filePath:t,format:n,jobId:r,markdownText:i=``,title:a=``}){return{action:et(n),fileList:Array.isArray(e)?e.slice():[],filePath:String(t??``),jobId:r,markdownText:String(i??``),source:Je,title:String(a??``),type:`bootstrap`}}function rt(e){e&&(e.closePollId&&window.clearInterval(e.closePollId),e.timeoutId&&window.clearTimeout(e.timeoutId))}function it(e,{notifyError:t=!1,message:n=``}={}){let r=Ze.get(e);r&&(rt(r),Ze.delete(e),t&&n&&Qe?.(n))}function at({onError:e=null}={}){Qe=typeof e==`function`?e:null,!window.__collabmdExportBridgeInitialized&&(window.addEventListener(`message`,e=>{if(e.origin!==window.location.origin)return;let t=e.data;if(!t||t.source!==qe)return;let n=String(t.jobId??``).trim();if(!n)return;let r=Ze.get(n);if(r){if(t.type===`ready`){if(r.window?.closed){it(n,{message:`Export window was closed before the export completed`,notifyError:!0});return}try{r.window?.postMessage(r.payload,window.location.origin)}catch(e){it(n,{message:e instanceof Error?e.message:`Failed to send export data`,notifyError:!0})}return}(t.type===`complete`||t.type===`error`)&&it(n,{message:t.type===`error`&&t.message?String(t.message):``,notifyError:t.type===`error`&&!!t.message})}}),window.__collabmdExportBridgeInitialized=!0)}async function ot({fileList:e=[],filePath:t,format:n,markdownText:r=``,title:i=``}={}){let a=String(t??``).trim();if(!a)throw Error(`No markdown note is open`);let o=$e(),s=tt({filePath:a,format:n,jobId:o}),c=window.open(s,`_blank`);if(!c)throw Error(`Export popup was blocked`);return Ze.set(o,{closePollId:window.setInterval(()=>{c.closed&&it(o,{message:`Export window was closed before the export completed`,notifyError:!0})},Ye),payload:nt({fileList:e,filePath:a,format:n,jobId:o,markdownText:r,title:i}),timeoutId:window.setTimeout(()=>{it(o,{message:`Export timed out before it completed`,notifyError:!0})},Xe),window:c}),c.focus?.(),o}var st={initializeExportBridge(){this._exportBridgeInitialized||=(at({onError:e=>{this.toastController?.show(e)}}),!0)},async handleExportRequest(e){let t=String(this.currentFilePath??``).trim();if(!u(t))return this.toastController?.show(`Export is available for markdown notes only`),!1;try{return await ot({fileList:this.fileExplorer?.flatDocumentFiles??[],filePath:t,format:e,markdownText:this.session?.getText?.()??``,title:this.getDisplayName(t)}),!0}catch(e){return this.toastController?.show(e instanceof Error?e.message:`Failed to start export`),!1}}};function ct(e=[]){return Array.from(new Set((e??[]).filter(Boolean)))}function lt(e=[]){return Array.from(new Map((e??[]).filter(e=>e?.oldPath&&e?.newPath&&e.oldPath!==e.newPath).map(e=>[`${e.oldPath}:${e.newPath}`,{newPath:e.newPath,oldPath:e.oldPath}])).values())}function ut(e=[]){return(e??[]).filter(e=>e?.path&&Number.isFinite(e?.from)&&Number.isFinite(e?.to)).map(e=>({from:Math.max(0,Math.round(e.from)),path:e.path,to:Math.max(0,Math.round(e.to))}))}function dt({changedPaths:e=[],deletedPaths:t=[],refreshExplorer:n=!0,renamedPaths:r=[]}={}){return{changedPaths:ct(e),deletedPaths:ct(t),refreshExplorer:n!==!1,renamedPaths:lt(r)}}function ft(e){return!e||typeof e!=`object`||typeof e.id!=`string`?null:{action:typeof e.action==`string`?e.action:`workspace`,createdAt:Number.isFinite(e.createdAt)?e.createdAt:Date.now(),highlightRanges:ut(e.highlightRanges),id:e.id,origin:typeof e.origin==`string`?e.origin:`api`,reloadRequiredPaths:ct(e.reloadRequiredPaths),requestId:typeof e.requestId==`string`?e.requestId:null,sourceRef:typeof e.sourceRef==`string`?e.sourceRef:null,workspaceChange:dt(e.workspaceChange)}}function pt(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`workspace-${Date.now()}-${Math.random().toString(16).slice(2,10)}`}function mt(e={}){return dt(e)}var ht={formatPullBackupToast(e=null){let t=Number(e?.fileCount||0);return t===1?`Pulled latest changes. 1 overlapping local file was backed up.`:t>1?`Pulled latest changes. ${t} overlapping local files were backed up.`:`Pulled latest changes. Overlapping local changes were recorded in a pull backup.`},setGitOperationStatus(e=``){let t=this.elements.gitOperationStatus;if(!t)return;let n=String(e??``).trim();t.textContent=n,t.classList.toggle(`hidden`,!n)},async runGitActionWithStatus(e,t){this.setGitOperationStatus(e);try{return await t()}finally{this.setGitOperationStatus(``)}},handleGitDiffSelection(e,{closeSidebarOnMobile:t=!1,scope:n=`working-tree`}={}){t&&this.closeSidebarOnMobile(),this.navigation.navigateToGitDiff({filePath:e,scope:n})},handleGitCommitSelection(e,{closeSidebarOnMobile:t=!1,historyFilePath:n=null,path:r=null}={}){t&&this.closeSidebarOnMobile(),this.navigation.navigateToGitCommit({hash:e,historyFilePath:n,path:r})},handleGitHistorySelection({closeSidebarOnMobile:e=!1}={}){e&&this.closeSidebarOnMobile(),this.navigation.navigateToGitHistory()},handleGitFileHistorySelection(e=this.currentFilePath,{closeSidebarOnMobile:t=!1}={}){t&&this.closeSidebarOnMobile(),e&&this.navigation.navigateToGitFileHistory({filePath:e})},handleGitFilePreviewSelection({hash:e,path:t,currentFilePath:n=null,closeSidebarOnMobile:r=!1}={}){r&&this.closeSidebarOnMobile(),!(!e||!t)&&this.navigation.navigateToGitFilePreview({hash:e,path:t,currentFilePath:n})},handleGitRepoChange(e,t=null){this.gitRepoAvailable=!!e,this.elements.sidebarTabs?.classList.toggle(`hidden`,!this.gitRepoAvailable),this.elements.gitSidebarTab?.classList.toggle(`hidden`,!this.gitRepoAvailable);let n=e&&t?.summary?.changedFiles>0;if(this.elements.gitSidebarTab?.classList.toggle(`has-changes`,n),this.gitDiffView.setRepoStatus(this.gitRepoAvailable?t:null),!this.gitRepoAvailable&&this.activeSidebarTab===`git`){this.syncFileHistoryButton({mode:this.navigation.getHashRoute().type===`git-file-preview`?`history-preview`:`editor`}),this.setSidebarTab(`files`);return}let r=this.navigation.getHashRoute().type;this.gitRepoAvailable&&(r===`git-diff`||r===`git-commit`||r===`git-history`)&&this.activeSidebarTab!==`git`&&this.setSidebarTab(`git`),this.syncFileHistoryButton({filePath:this.currentFilePath,mode:r===`git-file-preview`?`history-preview`:r===`file`?`editor`:`empty`})},syncFileHistoryButton({filePath:e=this.currentFilePath,mode:t=`editor`}={}){let n=this.elements.fileHistoryButton,r=this.elements.fileHistoryButtonLabel;if(!(!n||!r)){if(!(this.gitRepoAvailable&&this.supportsFileHistory?.(e))){n.classList.add(`hidden`);return}if(n.classList.remove(`hidden`),t===`history-preview`){r.textContent=`Back to History`,n.setAttribute(`aria-label`,`Back to file history`),n.title=`Back to file history`;return}if(t!==`editor`){n.classList.add(`hidden`);return}r.textContent=`History`,n.setAttribute(`aria-label`,`Open file history`),n.title=`View file history`}},syncMainChrome({badgeLabel:e=``,mode:t,title:n=null}={}){let r=t===`diff`||t===`history`||t===`history-preview`;this.elements.toolbarCenter?.classList.toggle(`hidden`,r),this.elements.mobileViewToggle?.classList.toggle(`hidden`,r),this.elements.userCount?.classList.toggle(`hidden`,r),this.elements.toolbarDiffBadge?.classList.toggle(`hidden`,!e),this.elements.toolbarDiffBadge&&(this.elements.toolbarDiffBadge.textContent=e),n&&this.elements.activeFileName&&(this.elements.activeFileName.textContent=n),this.syncFileHistoryButton({filePath:this.currentFilePath,mode:t})},async showGitDiff({filePath:e=null,scope:t=`all`}={}){this.clearStaticPreviewDocument?.(),this.gitPanel.setSelection(e?{path:e,scope:t,source:`workspace`}:{}),this.gitPanel.setMode(`changes`),this.showDiffState(),this.syncMainChrome({badgeLabel:`Diff`,mode:`diff`,title:this.gitDiffView.getToolbarTitle({filePath:e,scope:t})}),this.syncFileHistoryButton({filePath:e,mode:`diff`}),await this.gitDiffView.openWorkspaceDiff({filePath:e,scope:t})},async showGitCommit({hash:e,path:t=null,historyFilePath:n=null}={}){this.clearStaticPreviewDocument?.(),this.gitPanel.setMode(`history`),this.gitPanel.setSelection(e?{commitHash:e,path:t,source:`commit`}:{source:`commit`}),this.showDiffState(),this.syncMainChrome({badgeLabel:`Diff`,mode:`diff`,title:this.gitDiffView.getToolbarTitle({commitHash:e,path:t,source:`commit`})}),this.syncFileHistoryButton({filePath:t,mode:`diff`}),await this.gitDiffView.openCommitDiff({hash:e,historyFilePath:n,path:t})},async showGitHistory(){this.clearStaticPreviewDocument?.(),this.gitPanel.setMode(`history`),this.gitPanel.setSelection({source:`commit`}),this.workspaceRouteController?.showEmptyState?.(),this.syncMainChrome({mode:`empty`,title:`Git History`}),this.syncFileHistoryButton({mode:`empty`})},async showGitFileHistory({filePath:e=null}={}){if(!e){this.workspaceRouteController?.showEmptyState?.();return}this.clearStaticPreviewDocument?.(),this.commentUi?.attachSession?.(null),this.commentUi?.setCurrentFile?.(e,{fileKind:this.getCommentFileKind(e),supported:!1}),this.handleCommentThreadsChange?.([]),this.handleCommentSelectionChange?.(null),this.workspaceRouteController?.showFileHistoryState?.(e),this.syncMainChrome({badgeLabel:`History`,mode:`history`,title:this.getDisplayName(e)}),this.syncFileHistoryButton({filePath:e,mode:`history`}),await this.fileHistoryView.openFileHistory({filePath:e})},async showGitFilePreview({hash:e,filePath:t=null,currentFilePath:n=null}={}){let r=String(n??``).trim()||t;if(!e||!t||!r){this.workspaceRouteController?.showEmptyState?.();return}this.commentUi?.attachSession?.(null),this.commentUi?.setCurrentFile?.(r,{fileKind:this.getCommentFileKind(r),supported:!1}),this.handleCommentThreadsChange?.([]),this.handleCommentSelectionChange?.(null),this.workspaceRouteController?.showPreviewOnlyState?.(r),this.layoutController.setView(`preview`,{persist:!1}),this.syncMainChrome({badgeLabel:`History Preview`,mode:`history-preview`,title:this.getDisplayName(r)}),this.syncFileHistoryButton({filePath:r,mode:`history-preview`});try{let n=new URLSearchParams;n.set(`hash`,e),n.set(`path`,t);let i=await fetch(O(`/git/file-snapshot?${n.toString()}`)),a=await i.json();if(!i.ok)throw Error(a.error||`Failed to load historical file preview`);if(this.setStaticPreviewDocument?.({...a,currentFilePath:r}),this.resetPreviewMode(),this.elements.markdownToolbar?.classList.add(`hidden`),this.elements.outlineToggle?.classList.toggle(`hidden`,a.fileKind!==`markdown`),a.fileKind===`markdown`||a.fileKind===`mermaid`||a.fileKind===`plantuml`){a.fileKind===`mermaid`?this.elements.previewContent?.classList.add(`is-mermaid-file-preview`):a.fileKind===`plantuml`&&this.elements.previewContent?.classList.add(`is-plantuml-file-preview`),this.previewRenderer.beginDocumentLoad(),this.previewRenderer.queueRender();return}this.elements.outlineToggle?.classList.add(`hidden`),this.renderTextFilePreview({content:a.content,filePath:r})}catch(e){console.error(`[git-preview] Failed to load file snapshot:`,e),this.clearStaticPreviewDocument?.(),this.toastController.show(`Failed to load historical file preview`),this.renderTextFilePreview({content:`Failed to load historical file preview.`,filePath:r}),this.elements.outlineToggle?.classList.add(`hidden`)}},async postGitAction(e,t){let n=pt();this.pendingWorkspaceRequestIds?.add(n);try{let r=await fetch(e,{body:JSON.stringify(t),headers:{"Content-Type":`application/json`,"X-CollabMD-Request-Id":n},method:`POST`}),i=await r.json();if(!r.ok){this.pendingWorkspaceRequestIds?.delete(n);let e=Error(i.error||`Git action failed`);throw typeof i?.code==`string`&&(e.code=i.code),e}return i}catch(e){throw this.pendingWorkspaceRequestIds?.delete(n),e}},async refreshWorkspaceAfterGitAction({filePath:e=null,preferredScope:t=null}={}){await this.fileExplorer.refresh(),await this.refreshGitAfterAction({filePath:e,preferredScope:t})},async refreshGitAfterAction({filePath:e=null,preferredScope:t=null}={}){await this.gitPanel.refresh({force:!0});let n=this.navigation.getHashRoute();if(n.type===`git-history`){await this.showGitHistory();return}if(n.type===`git-file-history`){await this.showGitFileHistory({filePath:n.filePath});return}if(n.type===`git-file-preview`){await this.showGitFilePreview({hash:n.hash,filePath:n.filePath,currentFilePath:n.currentFilePath});return}if(n.type===`git-commit`){await this.showGitCommit({hash:n.hash,path:n.path,historyFilePath:n.historyFilePath});return}if(n.type!==`git-diff`)return;let r=e??n.filePath,i=t??n.scope;if(i!==n.scope||r!==n.filePath){this.navigation.navigateToGitDiff({filePath:r,scope:i});return}await this.showGitDiff({filePath:n.filePath,scope:n.scope})},async finalizeGitAction({action:e,filePath:t=null,preferredScope:n=null,result:r={},showLocalFileToast:i=!1}={}){let a=mt(r.workspaceChange);return await this.refreshWorkspaceAfterGitAction({filePath:t,preferredScope:n}),this.handleWorkspaceChangeForCurrentFile(a,{action:e,local:!0,showToast:i}),a},handleWorkspaceChangeForCurrentFile(e,{action:t=`git`,local:n=!1,showToast:r=!0}={}){let i=this.currentFilePath;if(!i)return!1;let a=e.deletedPaths.includes(i),o=e.renamedPaths.find(e=>e.oldPath===i);if(!a&&!o)return!1;if(!r)return o?this.navigation.navigateToFile(o.newPath):this.navigation.navigateToFile(null),!0;let s=this.getDisplayName(i);return o?(this.navigation.navigateToFile(o.newPath),this.toastController.show(n?`${s} moved to ${this.getDisplayName(o.newPath)}`:`${s} moved on disk`),!0):(this.navigation.navigateToFile(null),this.toastController.show(n?`${s} was removed by ${t}`:`${s} was removed after a ${t} operation`),!0)},async handleIncomingWorkspaceEvent(e){if(!this.isTabActive||!e)return;if(e.requestId&&this.pendingWorkspaceRequestIds?.has(e.requestId)){this.pendingWorkspaceRequestIds.delete(e.requestId);return}let t=mt(e.workspaceChange);if(e.origin===`git`&&await this.refreshGitAfterAction(),this.handleWorkspaceChangeForCurrentFile(t,{action:e.action||e.origin||`workspace`,local:!1,showToast:!0}),e.origin===`filesystem`&&this.currentFilePath&&t.changedPaths.includes(this.currentFilePath)){let n=t.changedPaths.length===1&&Array.isArray(e.highlightRanges)?e.highlightRanges.find(e=>e.path===this.currentFilePath):null;n&&this.session?.flashExternalUpdate?.(n)||this.toastController.show(`${this.getDisplayName(this.currentFilePath)} updated from disk`)}this.currentFilePath&&Array.isArray(e.reloadRequiredPaths)&&e.reloadRequiredPaths.includes(this.currentFilePath)&&this.toastController.show(`${this.getDisplayName(this.currentFilePath)} needs a manual reload`)},async stageGitFile(e,{scope:t=`working-tree`}={}){e&&await this.runGitActionWithStatus(`Staging changes...`,async()=>{let n=await this.postGitAction(O(`/git/stage`),{path:e});await this.finalizeGitAction({action:`stage`,filePath:e,preferredScope:t===`all`?`all`:`staged`,result:n})})},async unstageGitFile(e,{scope:t=`staged`}={}){e&&await this.runGitActionWithStatus(`Unstaging changes...`,async()=>{let n=await this.postGitAction(O(`/git/unstage`),{path:e});await this.finalizeGitAction({action:`unstage`,filePath:e,preferredScope:t===`all`?`all`:`working-tree`,result:n})})},async pushGitBranch(){await this.runGitActionWithStatus(`Pushing branch...`,async()=>{try{let e=await this.postGitAction(O(`/git/push`),{});await this.finalizeGitAction({action:`push`,result:e})}catch(e){this.toastController.show(e.message||`Failed to push branch`)}})},async pullGitBranch(){await this.runGitActionWithStatus(`Pulling branch...`,async()=>{try{let e=await this.postGitAction(O(`/git/pull`),{});await this.finalizeGitAction({action:`pull`,result:e,showLocalFileToast:!0}),e.pullBackup&&this.toastController.show(this.formatPullBackupToast(e.pullBackup),5e3)}catch(e){if(e?.code===`pull_diverged_ff_only`){this.toastController.show(`Cannot pull because local and remote commits have diverged. Fast-forward only pull is not possible.`,5e3);return}if(e?.code===`pull_conflicted_after_autostash`){this.toastController.show(`Pull updated the branch, but reapplying local changes caused conflicts. Review the conflicted files and the pull backup summary.`,6e3);return}this.toastController.show(e.message||`Failed to pull branch`)}})},openGitResetDialog(e){if(!this.isTabActive||!e)return;let t=this.elements.gitResetDialog;!t||!this.elements.gitResetFileName||(this.pendingGitResetPath=e,this.elements.gitResetTitle&&(this.elements.gitResetTitle.textContent=`Reset file to current branch`),this.elements.gitResetCopy&&(this.elements.gitResetCopy.textContent=`Restore this file from the current checked-out branch. If this branch does not contain the file, the file will be deleted locally.`),this.elements.gitResetFileName.value=e,this.elements.gitResetSubmit&&(this.elements.gitResetSubmit.textContent=`Reset File`),this.elements.gitResetSubmit?.toggleAttribute(`disabled`,!1),!t.open&&(typeof t.showModal==`function`?t.showModal():t.setAttribute(`open`,`true`)))},async handleGitResetSubmit(){let e=this.pendingGitResetPath,t=this.elements.gitResetDialog,n=this.elements.gitResetSubmit;if(!(!e||!t)){n?.toggleAttribute(`disabled`,!0),n&&(n.textContent=`Resetting...`);try{await this.runGitActionWithStatus(`Resetting file...`,async()=>{let t=await this.postGitAction(O(`/git/reset-file`),{path:e});await this.finalizeGitAction({action:`reset`,filePath:e,result:t,showLocalFileToast:!0})}),t.close()}catch(e){this.toastController.show(e.message||`Failed to reset file`)}finally{n&&(n.textContent=`Reset File`),n?.toggleAttribute(`disabled`,!1)}}},openGitCommitDialog(){if(!this.isTabActive)return;let e=this.elements.gitCommitDialog,t=this.elements.gitCommitInput;if(!(!e||!t)){if(this.elements.gitCommitTitle&&(this.elements.gitCommitTitle.textContent=`Commit staged changes`),this.elements.gitCommitCopy){let e=Number(this.gitPanel.status?.summary?.staged||0);this.elements.gitCommitCopy.textContent=e>0?`${e} staged file${e===1?``:`s`} will be included.`:`All staged changes will be included.`}this.elements.gitCommitSubmit&&(this.elements.gitCommitSubmit.textContent=`Commit staged changes`),t.value=``,!e.open&&(typeof e.showModal==`function`?e.showModal():e.setAttribute(`open`,`true`),requestAnimationFrame(()=>{t.focus(),t.select()}))}},async handleGitCommitSubmit(){let e=this.elements.gitCommitDialog,t=this.elements.gitCommitInput,n=this.elements.gitCommitSubmit,r=String(t?.value??``).trim();if(!(!e||!t)){if(!r){t.focus(),this.toastController.show(`Commit message cannot be empty`);return}n?.toggleAttribute(`disabled`,!0),n&&(n.textContent=`Committing...`);try{await this.runGitActionWithStatus(`Committing changes...`,async()=>{let e=await this.postGitAction(O(`/git/commit`),{message:r});await this.finalizeGitAction({action:`commit`,result:e})}),e.close()}catch(e){this.toastController.show(e.message||`Failed to commit staged changes`)}finally{n&&(n.textContent=`Commit staged changes`),n?.toggleAttribute(`disabled`,!1)}}}},gt={updateGlobalUsers(e){this.globalUsers=e,this.syncFollowedUser(),this.renderAvatars(),this.renderChat(),this.renderPresence(),this.syncCurrentUserName()},updateFileAwareness(e){this.syncFollowedUser()},renderPresence(){let e=this.elements.userCount;if(!e)return;let t=!!this.session,n=!!(this.currentFilePath&&this.isExcalidrawFile?.(this.currentFilePath)),r=!!(this.currentFilePath&&this.isImageFile?.(this.currentFilePath)),i=!t&&(!this.currentFilePath||n||r)?this.lobby?.getConnectionState?.()??this.connectionState:this.connectionState;if(i.status===`connected`){e.textContent=`${this.globalUsers.length} online`,e.style.opacity=`1`;return}if(i.status===`connecting`){e.textContent=i.unreachable?`Unreachable`:`Connecting...`,e.style.opacity=`0.6`;return}e.textContent=`Offline`,e.style.opacity=`0.6`},renderAvatars(){let e=this.elements.userAvatars;if(!e)return;e.innerHTML=``;let t=[...this.globalUsers],n=t.findIndex(e=>e.isLocal);if(n>0){let[e]=t.splice(n,1);t.unshift(e)}let r=t.findIndex(e=>!e.isLocal&&e.clientId===this.followedUserClientId),i=t[0]?.isLocal?1:0;if(r>i){let[e]=t.splice(r,1);t.splice(i,0,e)}if(t.slice(0,5).forEach(t=>{let n=document.createElement(t.isLocal?`div`:`button`);n.className=`user-avatar`,n.classList.toggle(`is-local`,t.isLocal),n.style.backgroundColor=t.color,n.classList.toggle(`is-following`,t.clientId===this.followedUserClientId);let r=document.createElement(`span`);r.className=`user-avatar-initial`,r.textContent=t.name.charAt(0).toUpperCase(),n.appendChild(r);let i=t.currentFile&&t.currentFile===this.currentFilePath,a=t.currentFile?this.getDisplayName(t.currentFile):`No file`;if(t.isLocal){let e=document.createElement(`span`);e.className=`user-avatar-self-label`,e.textContent=`You`,n.appendChild(e),n.title=`${t.name} (you) — ${a}`,n.setAttribute(`role`,`img`),n.setAttribute(`aria-label`,`${t.name} (you) — ${a}`)}else{n.type=`button`,n.classList.add(`user-avatar-button`),i||n.classList.add(`different-file`);let e=t.clientId===this.followedUserClientId?`Stop following ${t.name}`:i?`Follow ${t.name}`:`Follow ${t.name} — ${a}`;n.title=e,n.setAttribute(`aria-label`,e),n.addEventListener(`click`,()=>this.toggleFollowUser(t.clientId))}e.appendChild(n)}),t.length>5){let n=document.createElement(`div`);n.className=`user-avatar`,n.style.backgroundColor=`var(--color-surface-dynamic)`,n.style.color=`var(--color-text-muted)`;let r=document.createElement(`span`);r.className=`user-avatar-initial`,r.textContent=`+${t.length-5}`,n.appendChild(r),e.appendChild(n)}},toggleFollowUser(e){if(!e)return;if(this.followedUserClientId===e){this.stopFollowingUser();return}let t=this.globalUsers.find(t=>t.clientId===e&&!t.isLocal);if(t){if(this.followedUserClientId=e,this.followedCursorSignature=``,this.renderAvatars(),t.currentFile&&t.currentFile!==this.currentFilePath){this.navigation.navigateToFile(t.currentFile);return}requestAnimationFrame(()=>{this.followedUserClientId===e&&this.followUserCursor(t,{force:!0})})}},stopFollowingUser(){this.followedUserClientId&&(this.currentFilePath&&this.isExcalidrawFile?.(this.currentFilePath)&&this.excalidrawEmbed?.setFollowedUser(this.currentFilePath,null),this.followedUserClientId=null,this.followedCursorSignature=``,this.renderAvatars())},syncFollowedUser(){if(!this.followedUserClientId)return;let e=this.globalUsers.find(e=>e.clientId===this.followedUserClientId);if(!e||e.isLocal){this.stopFollowingUser();return}if(e.currentFile&&e.currentFile!==this.currentFilePath){this.navigation.navigateToFile(e.currentFile);return}this.followUserCursor(e)},followUserCursor(e,{force:t=!1}={}){if(this.currentFilePath&&this.isExcalidrawFile?.(this.currentFilePath)){this.followExcalidrawUser(e,{force:t});return}let n=this.resolveFileClientId(e.peerId),r=n==null?null:this.session?.getUserViewport(n),i=n==null?null:this.session?.getUserCursor(n),a=i?.cursorHead??null,o=i?.cursorLine??null,s=i?.cursorAnchor??null,c=r?.topLine??null,l=r?.viewportRatio??.35;if(!e||c==null&&(a==null||o==null)){this.followedCursorSignature=``;return}let u=`${e.clientId}:${c??`no-viewport`}:${s??`no-anchor`}:${a??`no-head`}`;!t&&u===this.followedCursorSignature||(n!=null&&this.session?.scrollToUserViewport(n)||n!=null&&this.session?.scrollToUserCursor(n,`center`)||a!=null&&this.session?.scrollToPosition(a,`center`)||o!=null&&this.session?.scrollToLine(o,l))&&(this.followedCursorSignature=u)},followExcalidrawUser(e,{force:t=!1}={}){if(!e?.peerId||!this.currentFilePath){this.followedCursorSignature=``;return}let n=`excalidraw:${this.currentFilePath}:${e.peerId}`;!t&&n===this.followedCursorSignature||Promise.resolve(this.excalidrawEmbed?.setFollowedUser(this.currentFilePath,e.peerId)).then(t=>{t===!1||this.followedUserClientId!==e.clientId||(this.followedCursorSignature=n)}).catch(()=>{})},resolveFileClientId(e){if(!e||!this.session?.awareness)return null;for(let[t,n]of this.session.awareness.getStates())if(n.user?.peerId===e)return t;return null}};function _t(){return this.runtimeConfig?.auth?.strategy===`oidc`&&this.runtimeConfig?.auth?.provider===`google`}function vt({mode:e=`edit`}={}){if(this.isIdentityManagedByAuth()||!this.isTabActive)return;let t=this.elements.displayNameDialog,n=this.elements.displayNameInput,r=this.elements.displayNameTitle,i=this.elements.displayNameCopy,a=this.elements.displayNameCancel,o=this.elements.displayNameSubmit;if(!t||!n)return;let s=e===`onboarding`;r&&(r.textContent=s?`Choose your display name`:`Update display name`),i&&(i.textContent=s?`Pick a name collaborators will see. You can skip for now and continue as a guest.`:`Your name will be visible to everyone editing this vault.`),a&&(a.textContent=s?`Skip for now`:`Cancel`),o&&(o.textContent=s?`Continue`:`Save name`),n.value=s?``:this.getCurrentUserName(),!t.open&&(typeof t.showModal==`function`?t.showModal():t.setAttribute(`open`,`true`),requestAnimationFrame(()=>{n.focus(),n.select()}))}function yt(){!this.isTabActive||this._hasPromptedForDisplayName||this.getStoredUserName()||this.isIdentityManagedByAuth()||(this._hasPromptedForDisplayName=!0,requestAnimationFrame(()=>{this.openDisplayNameDialog({mode:`onboarding`})}))}function bt(){if(this.isIdentityManagedByAuth())return;let e=this.elements.displayNameInput,t=this.elements.displayNameDialog;if(!e||!t)return;let n=this.session?this.session.setUserName(e.value):_e(e.value);if(!n){e.focus(),this.toastController.show(`Name must be 1-24 characters`);return}this.preferences.setUserName(n),this.lobby.setUserName(n);let r=this.lobby.getLocalUser();this.drawioEmbed?.updateLocalUser(r),this.excalidrawEmbed?.updateLocalUser(r),this.syncCurrentUserName(),this.renderChat(),t.close()}function xt(){return this.globalUsers.find(e=>e.isLocal)??this.session?.getLocalUser()??this.lobby?.getLocalUser()??null}function St(){return this.getCurrentUser()?.name??this.getStoredUserName()??``}function Ct(){return this.preferences.getUserName()}function wt(){let e=this.elements.currentUserName;if(!e)return;let t=this.getCurrentUserName();e.textContent=t||`Set name`,e.classList.toggle(`has-name`,!!t),this.isIdentityManagedByAuth()||this.elements.editNameButton?.setAttribute(`aria-label`,`${t||`Set name`}. Change display name`)}function Tt(){let e=this.isIdentityManagedByAuth();this.elements.editNameButton?.classList.toggle(`hidden`,e),this.elements.editNameButton?.toggleAttribute(`disabled`,e),e&&this.elements.displayNameDialog?.open&&this.elements.displayNameDialog.close()}var Et={getCurrentUser:xt,getCurrentUserName:St,getStoredUserName:Ct,handleDisplayNameSubmit:bt,isIdentityManagedByAuth:_t,openDisplayNameDialog:vt,promptForDisplayNameIfNeeded:yt,syncCurrentUserName:wt,syncIdentityManagementUi:Tt},Dt=0;function Ot(){this.initializeExportBridge?.(),this.renderMarkdownToolbar?.(),this.initializeVisualViewportBinding?.(),this.themeController.initialize(),this.previewRenderer.applyTheme(this.themeController.getTheme()),this.previewRenderer.scheduleWorkerPrewarm(),this.scheduleEditorSessionPrewarm?.(),this.outlineController.initialize(),this.layoutController.initialize(),this.scrollSyncController.initialize(),this.fileExplorer.initialize(),this.gitPanel.initialize(),this.gitDiffView.initialize(),this.fileHistoryView.initialize(),this.initializePreviewLayoutObserver(),this.syncIdentityManagementUi(),this.syncCurrentUserName(),this.syncWrapToggle(),this.syncToolbarOverflowVisibility?.(),this.syncChatNotificationButton(),this.syncFileHistoryButton({mode:`empty`}),this.renderChat(),this.gitPanel.refresh({force:!0}),this.elements.chatInput?.setAttribute(`maxlength`,String(this.lobbyChatMessageMaxLength)),this.bindEvents(),this.restoreSidebarState(),this.initializeVersionMonitoring(),this.tabActivityLock.initialize(),this.tabActivityLock.tryActivate(),window.addEventListener(`hashchange`,()=>this.handleHashChange());let e=this.createResizeHandler();window.addEventListener(`resize`,()=>{e(),this.syncToolbarOverflowVisibility?.()}),this.fileExplorerReadyPromise=this.fileExplorer.refresh().then(()=>{if(this.fileExplorerReady=!0,this.isTabActive)return this.handleHashChange()})}function kt(){this.versionMonitor?.start()}function At(){let e=document.documentElement,t=window.visualViewport;if(e){if(!t){e.style.setProperty(`--app-viewport-height`,`100dvh`),e.style.setProperty(`--app-viewport-offset-top`,`0px`);return}e.style.setProperty(`--app-viewport-height`,`${Math.round(t.height)}px`),e.style.setProperty(`--app-viewport-offset-top`,`${Math.round(t.offsetTop)}px`)}}function jt(){this.syncVisualViewportBounds?.();let e=window.visualViewport;if(!e)return;let t=()=>this.syncVisualViewportBounds?.();e.addEventListener(`resize`,t,{passive:!0}),e.addEventListener(`scroll`,t,{passive:!0}),window.addEventListener(`orientationchange`,t)}function Mt(e=null){if(this._reloadPromptShown)return;this._reloadPromptShown=!0;let t=String(e?.build?.packageVersion??this.runtimeConfig?.build?.packageVersion??``).trim(),n=t?`Version ${t} is available. Reload to update.`:`A new version is available. Reload to update.`;this.toastController.show(n,{actionLabel:`Reload`,dismissible:!0,duration:Dt,onAction:()=>window.location.reload()})}function Nt(){this.elements.emptyStateNewFileBtn?.addEventListener(`click`,()=>{this.fileExplorer.actionController.openRootCreateMenu({anchor:this.elements.emptyStateNewFileBtn})}),this.elements.emptyStateSearchBtn?.addEventListener(`click`,()=>{this.toggleQuickSwitcher()}),this.elements.chatToggleButton?.addEventListener(`click`,()=>{this.toggleChatPanel(),this.closeToolbarOverflowMenu?.()}),this.elements.chatForm?.addEventListener(`submit`,e=>{e.preventDefault(),this.handleChatSubmit()}),this.elements.chatNotificationButton?.addEventListener(`click`,()=>{this.handleChatNotificationToggle()}),this.elements.shareButton?.addEventListener(`click`,()=>{this.copyCurrentLink(),this.closeToolbarOverflowMenu?.()}),this.elements.searchFilesButton?.addEventListener(`click`,()=>{this.toggleQuickSwitcher(),this.closeToolbarOverflowMenu?.()}),this.elements.exportDocxButton?.addEventListener(`click`,()=>{this.handleExportRequest?.(`docx`),this.closeToolbarOverflowMenu?.()}),this.elements.exportPdfButton?.addEventListener(`click`,()=>{this.handleExportRequest?.(`pdf`),this.closeToolbarOverflowMenu?.()}),this.elements.fileHistoryButton?.addEventListener(`click`,()=>{let e=this.navigation.getHashRoute();if(e.type===`git-file-preview`){this.handleGitFileHistorySelection(e.currentFilePath??e.filePath,{closeSidebarOnMobile:!0}),this.closeToolbarOverflowMenu?.();return}this.handleGitFileHistorySelection(this.currentFilePath,{closeSidebarOnMobile:!0}),this.closeToolbarOverflowMenu?.()}),this.elements.editNameButton?.addEventListener(`click`,()=>{this.openDisplayNameDialog(),this.closeToolbarOverflowMenu?.()}),this.elements.displayNameCancel?.addEventListener(`click`,()=>{this.elements.displayNameDialog?.close()}),this.elements.gitCommitCancel?.addEventListener(`click`,()=>{this.elements.gitCommitDialog?.close()}),this.elements.gitResetCancel?.addEventListener(`click`,()=>{this.elements.gitResetDialog?.close()}),this.elements.gitResetSubmit?.addEventListener(`click`,()=>{this.handleGitResetSubmit()}),this.elements.gitCommitDialog?.addEventListener(`close`,()=>{this.elements.gitCommitInput&&(this.elements.gitCommitInput.value=``),this.elements.gitCommitSubmit&&(this.elements.gitCommitSubmit.textContent=`Commit staged changes`)}),this.elements.gitResetDialog?.addEventListener(`close`,()=>{this.pendingGitResetPath=null,this.elements.gitResetFileName&&(this.elements.gitResetFileName.value=``),this.elements.gitResetSubmit&&(this.elements.gitResetSubmit.textContent=`Reset File`)}),this.elements.markdownToolbar?.addEventListener(`click`,e=>{this.handleMarkdownToolbarClick?.(e)}),this.elements.markdownToolbar?.addEventListener(`keydown`,e=>{this.handleMarkdownToolbarKeydown?.(e)}),this.elements.displayNameForm?.addEventListener(`submit`,e=>{e.preventDefault(),this.handleDisplayNameSubmit()}),this.elements.gitCommitForm?.addEventListener(`submit`,e=>{e.preventDefault(),this.handleGitCommitSubmit()}),this.elements.tabLockTakeoverButton?.addEventListener(`click`,()=>{this.handleTabTakeover()}),this.elements.toggleWrapButton?.addEventListener(`click`,()=>{this.toggleLineWrapping()}),this.elements.editorFindButton?.addEventListener(`click`,()=>{this.runEditorCommand?.(`openSearch`)}),this.elements.toolbarOverflowToggle?.addEventListener(`click`,e=>{e.preventDefault(),this.toggleToolbarOverflowMenu()}),this.elements.toolbarOverflowMenu?.addEventListener(`click`,e=>{e.target instanceof Element&&e.target.closest(`button`)&&this.closeToolbarOverflowMenu()}),this.elements.previewContent?.addEventListener(`click`,e=>{this.handlePreviewContentClick?.(e)}),this.elements.sidebarToggle?.addEventListener(`click`,()=>{this.closeToolbarOverflowMenu(),this.toggleSidebar()}),this.elements.sidebarClose?.addEventListener(`click`,()=>{this.closeSidebarOnMobile()}),this.elements.filesSidebarTab?.addEventListener(`click`,()=>{this.setSidebarTab(`files`)}),this.elements.gitSidebarTab?.addEventListener(`click`,()=>{this.gitRepoAvailable&&this.setSidebarTab(`git`)}),document.addEventListener(`pointerdown`,e=>{this.handleMarkdownToolbarDocumentPointerDown?.(e),this.toolbarOverflowOpen&&!this.elements.toolbarOverflowMenu?.contains(e.target)&&!this.elements.toolbarOverflowToggle?.contains(e.target)&&this.closeToolbarOverflowMenu(),this.chatIsOpen&&(this.elements.chatContainer?.contains(e.target)||this.closeChatPanel())}),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`&&this.toolbarOverflowOpen){this.closeToolbarOverflowMenu();return}if(e.key===`Escape`&&this.chatIsOpen){this.closeChatPanel();return}(e.metaKey||e.ctrlKey)&&e.key===`k`&&(e.preventDefault(),this.toggleQuickSwitcher())})}function Pt(e,t){let n=e.closest(`ul, ol`);return n instanceof Element&&n.parentElement===t}function Ft(e){return e.closest(`input[data-task-checkbox="true"]`)?!1:!!e.closest(`a, button, input, select, textarea, summary, [contenteditable="true"], [role="button"], [role="link"]`)}function It(e){if(!(e.target instanceof Element))return;let t=e.target.closest(`a.wiki-link[data-wiki-target]`);if(t){e.preventDefault(),this.handleWikiLinkClick(t.dataset.wikiTarget);return}let n=e.target.closest(`.task-list-item[data-source-line]`);if(!n||Pt(e.target,n)||Ft(e.target))return;e.preventDefault();let r=Number.parseInt(n.getAttribute(`data-source-line`)||``,10);Number.isFinite(r)&&this.session?.toggleTaskListItem?.(r)}function Lt(e){this.toolbarOverflowOpen=!!e,this.elements.toolbarOverflowToggle?.setAttribute(`aria-expanded`,String(this.toolbarOverflowOpen)),this.elements.toolbarOverflowToggle?.classList.toggle(`active`,this.toolbarOverflowOpen),this.elements.toolbarOverflowToggle?.closest(`.toolbar-right`)?.classList.toggle(`is-overflow-open`,this.toolbarOverflowOpen),this.toolbarOverflowOpen||this.elements.toolbarOverflowMenu?.querySelectorAll(`details[open]`).forEach(e=>{e.removeAttribute(`open`)})}function Rt(){let e=this.elements.toolbarOverflowToggle;e&&(e.classList.remove(`hidden`),e.hidden=!1,e.setAttribute(`aria-hidden`,`false`))}function zt(){this.setToolbarOverflowOpen(!1)}function Bt(){this.setToolbarOverflowOpen(!this.toolbarOverflowOpen)}function Vt(e){this.previewRenderer.applyTheme(e),!this.isExcalidrawFile(this.currentFilePath)&&!this.isImageFile?.(this.currentFilePath)&&this.previewRenderer.queueRender(),this.session?.applyTheme(e),this.excalidrawEmbed.updateTheme(e),this.drawioEmbed.updateTheme(e)}function Ht(e){this.connectionState=e,e?.firstConnection&&this.recordFileOpenMetric?.(`ws_connected`,{status:e.status}),this.renderPresence(),e.unreachable&&!this.connectionHelpShown&&(this.connectionHelpShown=!0,this.toastController.show(`Cannot reach server at ${e.wsBaseUrl}`,6e3))}function Ut(){let e=!(this.session?.isLineWrappingEnabled()??this.getStoredLineWrapping());this.session?.setLineWrapping(e),this.preferences.setLineWrappingEnabled(e),this.syncWrapToggle(e),this.session?.requestMeasure(),this.scrollSyncController.syncPreviewToEditor()}function Wt(){return this.preferences.getLineWrappingEnabled()}function Gt(e){let t=e??this.session?.isLineWrappingEnabled()??this.getStoredLineWrapping(),n=this.elements.wrapToggleLabel,r=this.elements.toggleWrapButton,i=t?`Wrap on`:`Wrap off`;n&&(n.textContent=i),r&&r.setAttribute(`aria-label`,`${i}. ${t?`Disable line wrap`:`Enable line wrap`}`)}function Kt(){clearTimeout(this._backlinkRefreshTimer),this._backlinkRefreshTimer=setTimeout(()=>{m(this.currentFilePath)&&this.backlinksPanel.load(this.currentFilePath)},2e3)}function qt(){this.elements.editorContainer&&(this.elements.editorContainer.classList.add(`is-loading-editor`),this.elements.editorContainer.innerHTML=`
27
28
  <div class="editor-loading" id="editorLoading">
28
29
  <div class="loading-spinner"></div>
29
30
  <span class="loading-text">Loading file...</span>
30
- </div>`)}function qt(){this.elements.editorContainer&&(this.elements.editorContainer.classList.remove(`is-loading-editor`),this.elements.editorContainer.querySelector(`#editorLoading`)?.remove())}function Jt(){this.elements.editorContainer&&(this.elements.editorContainer.classList.remove(`is-loading-editor`),this.elements.editorContainer.innerHTML=`
31
+ </div>`)}function Jt(){this.elements.editorContainer&&(this.elements.editorContainer.classList.remove(`is-loading-editor`),this.elements.editorContainer.querySelector(`#editorLoading`)?.remove())}function Yt(){this.elements.editorContainer&&(this.elements.editorContainer.classList.remove(`is-loading-editor`),this.elements.editorContainer.innerHTML=`
31
32
  <div class="editor-loading" id="editorLoading">
32
33
  <span class="loading-text">Failed to load file</span>
33
- </div>`)}function Yt(){document.documentElement.removeAttribute(`data-initial-file-requested`)}var Xt={bindEvents:Mt,clearInitialFileBootstrap:Yt,closeToolbarOverflowMenu:Rt,getStoredLineWrapping:Ut,handleConnectionChange:Vt,handlePreviewContentClick:Ft,handleThemeChange:Bt,hideEditorLoading:qt,initialize:Dt,initializeVisualViewportBinding:At,initializeVersionMonitoring:Ot,promptForVersionReload:jt,scheduleBacklinkRefresh:Gt,setToolbarOverflowOpen:It,showEditorLoadError:Jt,showEditorLoading:Kt,syncVisualViewportBounds:kt,syncToolbarOverflowVisibility:Lt,syncWrapToggle:Wt,toggleToolbarOverflowMenu:zt,toggleLineWrapping:Ht};function Zt(){return this.mobileBreakpointQuery.matches}function Qt(){let e=this.elements.sidebar;!e||!this.isMobileViewport()||e.classList.contains(`collapsed`)||this.setSidebarVisibility(!1)}function $t(){let e=this.elements.sidebar;if(!e)return;let t=e.classList.contains(`collapsed`);this.setSidebarVisibility(t)}function en(){if(!this.elements.sidebar)return;let e=this.isMobileViewport(),t=this.preferences.getSidebarVisible(),n=!0;t===`true`?n=!0:(t===`false`||e)&&(n=!1),this.applySidebarVisibility(n)}function tn(e){this.applySidebarVisibility(e),this.preferences.setSidebarVisible(e)}function nn(e){let t=this.elements.sidebar;if(!t)return;let n=!e,r=n&&this.isMobileViewport();t.classList.toggle(`collapsed`,n),t.toggleAttribute(`hidden`,r),t.setAttribute(`aria-hidden`,r?`true`:`false`),t.inert=n}function rn(e){let t=e===`git`&&this.gitRepoAvailable?`git`:`files`;this.activeSidebarTab=t,this.elements.filesSidebarTab?.classList.toggle(`active`,t===`files`),this.elements.gitSidebarTab?.classList.toggle(`active`,t===`git`),document.getElementById(`fileTree`)?.classList.toggle(`hidden`,t!==`files`),this.elements.fileSearch?.classList.toggle(`hidden`,t!==`files`),this.elements.gitSearch?.classList.toggle(`hidden`,t!==`git`),document.getElementById(`gitPanel`)?.classList.toggle(`active`,t===`git`),document.getElementById(`gitPanel`)?.classList.toggle(`hidden`,t!==`git`),this.gitPanel.setActive(t===`git`)}var an={applySidebarVisibility:nn,closeSidebarOnMobile:Qt,isMobileViewport:Zt,restoreSidebarState:en,setSidebarTab:rn,setSidebarVisibility:tn,toggleSidebar:$t};function on(){this.tabActivityLock.tryActivate({takeover:!0})}function sn({takeover:e=!1}={}){let t=!this.isTabActive;this.isTabActive=!0,this.hideTabLockOverlay(),this.lobby.provider||this.lobby.connect(),this.workspaceSync.provider||this.workspaceSync.connect(),t&&(this.fileExplorerReady&&this.handleHashChange(),this.promptForDisplayNameIfNeeded()),e&&this.toastController.show(`This tab is now active`)}async function cn({reason:e}={}){let t=this.isTabActive,n=this.currentFilePath,r=!!(n&&this.isExcalidrawFile?.(n));this.isTabActive=!1,this.elements.displayNameDialog?.open&&this.elements.displayNameDialog.close(),this.lobby.disconnect(),this.workspaceSync.disconnect(),this.globalUsers=[],this.chatMessages=[],this.chatMessageIds.clear(),this.chatUnreadCount=0,this.chatInitialSyncComplete=!1,this.followedUserClientId=null,this.followedCursorSignature=``,this.connectionState={status:`disconnected`,unreachable:!1},this.showTabLockOverlay({reason:e}),r&&await this.excalidrawEmbed.prepareFileDisconnect(n),this.showEmptyState(),this.renderChat(),t&&e===`taken-over`&&this.toastController.show(`Another tab took over this session`)}function ln({reason:e}={}){let t=this.elements.tabLockOverlay,n=this.elements.tabLockTitle,r=this.elements.tabLockCopy;t&&(n&&(n.textContent=e===`taken-over`?`This tab is no longer active`:`This vault is active in another tab`),r&&(r.textContent=e===`taken-over`?`Another tab took over the live session. This tab is now disconnected until you explicitly take over here again.`:`To avoid duplicate presence and chat, only one tab can stay connected at a time. Use the other tab, or take over the session here.`),t.classList.remove(`hidden`))}function un(){this.elements.tabLockOverlay?.classList.add(`hidden`)}var dn={handleTabActivated:sn,handleTabBlocked:cn,handleTabTakeover:on,hideTabLockOverlay:un,showTabLockOverlay:ln},V=Object.freeze({bold:`
34
+ </div>`)}function Xt(){document.documentElement.removeAttribute(`data-initial-file-requested`)}var Zt={bindEvents:Nt,clearInitialFileBootstrap:Xt,closeToolbarOverflowMenu:zt,getStoredLineWrapping:Wt,handleConnectionChange:Ht,handlePreviewContentClick:It,handleThemeChange:Vt,hideEditorLoading:Jt,initialize:Ot,initializeVisualViewportBinding:jt,initializeVersionMonitoring:kt,promptForVersionReload:Mt,scheduleBacklinkRefresh:Kt,setToolbarOverflowOpen:Lt,showEditorLoadError:Yt,showEditorLoading:qt,syncVisualViewportBounds:At,syncToolbarOverflowVisibility:Rt,syncWrapToggle:Gt,toggleToolbarOverflowMenu:Bt,toggleLineWrapping:Ut};function Qt(){return this.mobileBreakpointQuery.matches}function $t(){let e=this.elements.sidebar;!e||!this.isMobileViewport()||e.classList.contains(`collapsed`)||this.setSidebarVisibility(!1)}function en(){let e=this.elements.sidebar;if(!e)return;let t=e.classList.contains(`collapsed`);this.setSidebarVisibility(t)}function tn(){if(!this.elements.sidebar)return;let e=this.isMobileViewport(),t=this.preferences.getSidebarVisible(),n=!0;t===`true`?n=!0:(t===`false`||e)&&(n=!1),this.applySidebarVisibility(n)}function nn(e){this.applySidebarVisibility(e),this.preferences.setSidebarVisible(e)}function rn(e){let t=this.elements.sidebar;if(!t)return;let n=!e,r=n&&this.isMobileViewport();t.classList.toggle(`collapsed`,n),t.toggleAttribute(`hidden`,r),t.setAttribute(`aria-hidden`,r?`true`:`false`),t.inert=n}function an(e){let t=e===`git`&&this.gitRepoAvailable?`git`:`files`;this.activeSidebarTab=t,this.elements.filesSidebarTab?.classList.toggle(`active`,t===`files`),this.elements.gitSidebarTab?.classList.toggle(`active`,t===`git`),document.getElementById(`fileTree`)?.classList.toggle(`hidden`,t!==`files`),this.elements.fileSearch?.classList.toggle(`hidden`,t!==`files`),this.elements.gitSearch?.classList.toggle(`hidden`,t!==`git`),document.getElementById(`gitPanel`)?.classList.toggle(`active`,t===`git`),document.getElementById(`gitPanel`)?.classList.toggle(`hidden`,t!==`git`),this.gitPanel.setActive(t===`git`)}var on={applySidebarVisibility:rn,closeSidebarOnMobile:$t,isMobileViewport:Qt,restoreSidebarState:tn,setSidebarTab:an,setSidebarVisibility:nn,toggleSidebar:en};function sn(){this.tabActivityLock.tryActivate({takeover:!0})}function cn({takeover:e=!1}={}){let t=!this.isTabActive;this.isTabActive=!0,this.hideTabLockOverlay(),this.lobby.provider||this.lobby.connect(),this.workspaceSync.provider||this.workspaceSync.connect(),t&&(this.fileExplorerReady&&this.handleHashChange(),this.promptForDisplayNameIfNeeded()),e&&this.toastController.show(`This tab is now active`)}async function ln({reason:e}={}){let t=this.isTabActive,n=this.currentFilePath,r=!!(n&&this.isExcalidrawFile?.(n));this.isTabActive=!1,this.elements.displayNameDialog?.open&&this.elements.displayNameDialog.close(),this.lobby.disconnect(),this.workspaceSync.disconnect(),this.globalUsers=[],this.chatMessages=[],this.chatMessageIds.clear(),this.chatUnreadCount=0,this.chatInitialSyncComplete=!1,this.followedUserClientId=null,this.followedCursorSignature=``,this.connectionState={status:`disconnected`,unreachable:!1},this.showTabLockOverlay({reason:e}),r&&await this.excalidrawEmbed.prepareFileDisconnect(n),this.showEmptyState(),this.renderChat(),t&&e===`taken-over`&&this.toastController.show(`Another tab took over this session`)}function un({reason:e}={}){let t=this.elements.tabLockOverlay,n=this.elements.tabLockTitle,r=this.elements.tabLockCopy;t&&(n&&(n.textContent=e===`taken-over`?`This tab is no longer active`:`This vault is active in another tab`),r&&(r.textContent=e===`taken-over`?`Another tab took over the live session. This tab is now disconnected until you explicitly take over here again.`:`To avoid duplicate presence and chat, only one tab can stay connected at a time. Use the other tab, or take over the session here.`),t.classList.remove(`hidden`))}function dn(){this.elements.tabLockOverlay?.classList.add(`hidden`)}var fn={handleTabActivated:cn,handleTabBlocked:ln,handleTabTakeover:sn,hideTabLockOverlay:dn,showTabLockOverlay:un},H=Object.freeze({bold:`
34
35
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
35
36
  <path d="M7 5h6a4 4 0 0 1 0 8H7z"/>
36
37
  <path d="M7 13h7a4 4 0 0 1 0 8H7z"/>
@@ -109,7 +110,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
109
110
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
110
111
  <path d="m6 9 6 6 6-6"/>
111
112
  </svg>
112
- `}),fn=Object.freeze([{action:`paragraph`,label:`Paragraph`,shortLabel:`P`,title:`Paragraph`},{action:`heading-1`,label:`Heading 1`,shortLabel:`H1`,title:`Heading 1`},{action:`heading-2`,label:`Heading 2`,shortLabel:`H2`,title:`Heading 2`},{action:`heading-3`,label:`Heading 3`,shortLabel:`H3`,title:`Heading 3`},{action:`heading-4`,label:`Heading 4`,shortLabel:`H4`,title:`Heading 4`},{action:`heading-5`,label:`Heading 5`,shortLabel:`H5`,title:`Heading 5`},{action:`heading-6`,label:`Heading 6`,shortLabel:`H6`,title:`Heading 6`},{action:`quote`,label:`Quote`,shortLabel:`Quote`,title:`Block quote`},{action:`bullet-list`,label:`Bullet list`,shortLabel:`List`,title:`Bullet list`},{action:`numbered-list`,label:`Numbered list`,shortLabel:`1.`,title:`Numbered list`},{action:`task-list`,label:`Task list`,shortLabel:`Task`,title:`Task list`},{action:`code-block`,label:`Code block`,shortLabel:`Code`,title:`Code block`}]),pn=Object.freeze([{action:`bold`,label:`Bold`,title:`Bold`,icon:V.bold},{action:`italic`,label:`Italic`,title:`Italic`,icon:V.italic},{action:`strikethrough`,label:`Strikethrough`,title:`Strikethrough`,icon:V.strikethrough},{action:`code`,label:`Inline code`,title:`Inline code`,icon:V.code}]),mn=Object.freeze([{commandId:`undo`,label:`Undo`,title:`Undo`,icon:V.undo},{commandId:`redo`,label:`Redo`,title:`Redo`,icon:V.redo},{commandId:`indentMore`,label:`Indent`,title:`Indent`,icon:V.indent},{commandId:`indentLess`,label:`Outdent`,title:`Outdent`,icon:V.outdent}]),hn=Object.freeze([{action:`link`,label:`Insert link`,title:`Insert link`,icon:V.link},{action:`image`,label:`Insert image`,title:`Insert image`,icon:V.image},{action:`video`,label:`Insert video`,title:`Insert video`,icon:V.video}]),gn=Object.freeze([{action:`table`,label:`Insert table`,title:`Insert table`,icon:V.table},{action:`horizontal-rule`,label:`Insert horizontal rule`,title:`Insert horizontal rule`,icon:V.horizontalRule}]),_n=Object.freeze([{kind:`buttons`,groupLabel:`Edit`,actions:mn,mobileOnly:!0},{kind:`block-menu`,actions:fn},{kind:`buttons`,groupLabel:`Inline formatting`,actions:pn},{kind:`buttons`,groupLabel:`Media and links`,actions:hn},{kind:`buttons`,groupLabel:`Insert`,actions:gn}]),vn=[...fn,...pn,...hn,...gn],yn=new Map(vn.map(e=>[e.action,e]));function bn(e){return yn.get(e)??null}function xn(){return fn}function Sn(e){return fn.some(t=>t.action===e)}function Cn(e){return bn(e)?.shortLabel??`P`}function wn(){return V}var Tn=`image/png,image/jpeg,image/webp,image/gif,image/svg+xml`,En=`paragraph`;function H(e){return String(e??``).replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`)}function Dn(e){return e===`heading`?`heading-2`:String(e??``).trim()}function On(e){return e.map(e=>`<button type="button" class="ui-icon-button ui-icon-button--toolbar ui-toolbar-action" ${e.commandId?`data-editor-command="${H(e.commandId)}"`:`data-markdown-action="${H(e.action)}"`} aria-label="${H(e.label)}" title="${H(e.title)}">${e.icon}</button>`).join(``)}function kn(e){return`
113
+ `}),pn=Object.freeze([{action:`paragraph`,label:`Paragraph`,shortLabel:`P`,title:`Paragraph`},{action:`heading-1`,label:`Heading 1`,shortLabel:`H1`,title:`Heading 1`},{action:`heading-2`,label:`Heading 2`,shortLabel:`H2`,title:`Heading 2`},{action:`heading-3`,label:`Heading 3`,shortLabel:`H3`,title:`Heading 3`},{action:`heading-4`,label:`Heading 4`,shortLabel:`H4`,title:`Heading 4`},{action:`heading-5`,label:`Heading 5`,shortLabel:`H5`,title:`Heading 5`},{action:`heading-6`,label:`Heading 6`,shortLabel:`H6`,title:`Heading 6`},{action:`quote`,label:`Quote`,shortLabel:`Quote`,title:`Block quote`},{action:`bullet-list`,label:`Bullet list`,shortLabel:`List`,title:`Bullet list`},{action:`numbered-list`,label:`Numbered list`,shortLabel:`1.`,title:`Numbered list`},{action:`task-list`,label:`Task list`,shortLabel:`Task`,title:`Task list`},{action:`code-block`,label:`Code block`,shortLabel:`Code`,title:`Code block`}]),mn=Object.freeze([{action:`bold`,label:`Bold`,title:`Bold`,icon:H.bold},{action:`italic`,label:`Italic`,title:`Italic`,icon:H.italic},{action:`strikethrough`,label:`Strikethrough`,title:`Strikethrough`,icon:H.strikethrough},{action:`code`,label:`Inline code`,title:`Inline code`,icon:H.code}]),hn=Object.freeze([{commandId:`undo`,label:`Undo`,title:`Undo`,icon:H.undo},{commandId:`redo`,label:`Redo`,title:`Redo`,icon:H.redo},{commandId:`indentMore`,label:`Indent`,title:`Indent`,icon:H.indent},{commandId:`indentLess`,label:`Outdent`,title:`Outdent`,icon:H.outdent}]),gn=Object.freeze([{action:`link`,label:`Insert link`,title:`Insert link`,icon:H.link},{action:`image`,label:`Insert image`,title:`Insert image`,icon:H.image},{action:`video`,label:`Insert video`,title:`Insert video`,icon:H.video}]),_n=Object.freeze([{action:`table`,label:`Insert table`,title:`Insert table`,icon:H.table},{action:`horizontal-rule`,label:`Insert horizontal rule`,title:`Insert horizontal rule`,icon:H.horizontalRule}]),vn=Object.freeze([{kind:`buttons`,groupLabel:`Edit`,actions:hn,mobileOnly:!0},{kind:`block-menu`,actions:pn},{kind:`buttons`,groupLabel:`Inline formatting`,actions:mn},{kind:`buttons`,groupLabel:`Media and links`,actions:gn},{kind:`buttons`,groupLabel:`Insert`,actions:_n}]),yn=[...pn,...mn,...gn,..._n],bn=new Map(yn.map(e=>[e.action,e]));function xn(e){return bn.get(e)??null}function Sn(){return pn}function Cn(e){return pn.some(t=>t.action===e)}function wn(e){return xn(e)?.shortLabel??`P`}function Tn(){return H}var En=`image/png,image/jpeg,image/webp,image/gif,image/svg+xml`,Dn=`paragraph`;function U(e){return String(e??``).replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`)}function On(e){return e===`heading`?`heading-2`:String(e??``).trim()}function kn(e){return e.map(e=>`<button type="button" class="ui-icon-button ui-icon-button--toolbar ui-toolbar-action" ${e.commandId?`data-editor-command="${U(e.commandId)}"`:`data-markdown-action="${U(e.action)}"`} aria-label="${U(e.label)}" title="${U(e.title)}">${e.icon}</button>`).join(``)}function An(e){return`
113
114
  <div class="markdown-toolbar-block-menu-shell">
114
115
  <button
115
116
  type="button"
@@ -119,53 +120,70 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
119
120
  aria-expanded="false"
120
121
  title="Block formatting"
121
122
  >
122
- <span class="markdown-toolbar-block-trigger-label" data-markdown-block-trigger-label>${H(Cn(e))}</span>
123
- <span class="markdown-toolbar-block-trigger-icon" aria-hidden="true">${wn().chevronDown}</span>
123
+ <span class="markdown-toolbar-block-trigger-label" data-markdown-block-trigger-label>${U(wn(e))}</span>
124
+ <span class="markdown-toolbar-block-trigger-icon" aria-hidden="true">${Tn().chevronDown}</span>
124
125
  </button>
125
126
  </div>
126
- `}function An(e){return xn().map(t=>{let n=t.action===e;return`
127
+ `}function jn(e){return Sn().map(t=>{let n=t.action===e;return`
127
128
  <button
128
129
  type="button"
129
130
  class="markdown-toolbar-menu-item${n?` is-active`:``}"
130
- data-markdown-block-action="${H(t.action)}"
131
+ data-markdown-block-action="${U(t.action)}"
131
132
  role="menuitemradio"
132
133
  aria-checked="${n?`true`:`false`}"
133
- title="${H(t.title)}"
134
+ title="${U(t.title)}"
134
135
  >
135
- <span class="markdown-toolbar-menu-item-label">${H(t.label)}</span>
136
- <span class="markdown-toolbar-menu-item-shortcut">${H(t.shortLabel)}</span>
136
+ <span class="markdown-toolbar-menu-item-label">${U(t.label)}</span>
137
+ <span class="markdown-toolbar-menu-item-shortcut">${U(t.shortLabel)}</span>
137
138
  </button>
138
- `}).join(``)}function jn(e){return _n.map(t=>t.kind===`block-menu`?kn(e):`
139
- <div class="markdown-toolbar-group${t.mobileOnly?` markdown-toolbar-group--mobile-only`:``}" role="group" aria-label="${H(t.groupLabel)}">
140
- ${On(t.actions)}
139
+ `}).join(``)}function Mn(e){return vn.map(t=>t.kind===`block-menu`?An(e):`
140
+ <div class="markdown-toolbar-group${t.mobileOnly?` markdown-toolbar-group--mobile-only`:``}" role="group" aria-label="${U(t.groupLabel)}">
141
+ ${kn(t.actions)}
141
142
  </div>
142
- `).join(``)}function Mn(){let e=Dn(this._activeMarkdownBlockAction||En);return Sn(e)?e:En}function Nn(){let e=this.elements?.markdownToolbar;e&&(e.innerHTML=jn(this.getActiveMarkdownBlockAction()),this.renderMarkdownBlockMenuPopover(),this.syncMarkdownToolbarBlockUi())}function Pn(){return this._markdownBlockMenuPopover??null}function Fn(){let e=this.elements?.editorContainer??document.body,t=this.getMarkdownBlockMenuPopover();t?t.parentElement!==e&&e?.appendChild(t):(t=document.createElement(`div`),t.className=`markdown-toolbar-popover hidden`,t.innerHTML=`<div class="markdown-toolbar-menu" data-markdown-block-menu role="menu" aria-label="Block formatting"></div>`,t.addEventListener(`click`,e=>{this.handleMarkdownToolbarClick?.(e)}),t.addEventListener(`keydown`,e=>{this.handleMarkdownToolbarKeydown?.(e)}),e?.appendChild(t),this._markdownBlockMenuPopover=t);let n=t.querySelector(`[data-markdown-block-menu]`);n&&(n.innerHTML=An(this.getActiveMarkdownBlockAction()))}function In(){let e=this.elements?.markdownToolbar;if(!e)return;let t=this.getActiveMarkdownBlockAction(),n=bn(t),r=e.querySelector(`[data-markdown-block-trigger-label]`);r&&(r.textContent=Cn(t));let i=e.querySelector(`[data-markdown-block-menu-toggle]`);i&&n&&(i.setAttribute(`aria-label`,`${n.label}. Block formatting`),i.setAttribute(`title`,`${n.label}. Block formatting`));let a=Array.from(this.getMarkdownBlockMenuPopover()?.querySelectorAll(`[data-markdown-block-action]`)??[]);[...e.querySelectorAll(`[data-markdown-block-action]`),...a].forEach(e=>{let n=e.getAttribute(`data-markdown-block-action`)===t;e.classList.toggle(`is-active`,n),e.setAttribute(`aria-checked`,n?`true`:`false`)})}function Ln(e){let t=Dn(e);Sn(t)&&(this._activeMarkdownBlockAction=t,this.syncMarkdownToolbarBlockUi())}function Rn(){return!!this.elements?.markdownToolbar?.classList.contains(`is-menu-open`)}function zn(){let e=this.getMarkdownBlockMenuPopover(),t=this.elements?.markdownToolbar?.querySelector(`[data-markdown-block-menu-toggle]`),n=e?.parentElement;if(!e||!t||!(n instanceof HTMLElement))return;let r=t.getBoundingClientRect(),i=n.getBoundingClientRect(),a=e.getBoundingClientRect(),o=a.width||176,s=a.height||240,c=r.left-i.left,l=Math.max(8,i.width-o-8),u=r.bottom-i.top+6,d=u+s<=i.height-8;e.style.left=`${Math.max(8,Math.min(c,l))}px`,e.style.top=`${d?u:Math.max(8,r.top-i.top-s-6)}px`}function Bn(){let e=this.elements?.markdownToolbar;e&&(this.renderMarkdownBlockMenuPopover(),e.classList.add(`is-menu-open`),this.getMarkdownBlockMenuPopover()?.classList.remove(`hidden`),e.querySelector(`[data-markdown-block-menu-toggle]`)?.setAttribute(`aria-expanded`,`true`),this.positionMarkdownBlockMenu())}function Vn(){let e=this.elements?.markdownToolbar;e&&(e.classList.remove(`is-menu-open`),this.getMarkdownBlockMenuPopover()?.classList.add(`hidden`),e.querySelector(`[data-markdown-block-menu-toggle]`)?.setAttribute(`aria-expanded`,`false`))}function Hn(){if(this.isMarkdownBlockMenuOpen()){this.closeMarkdownBlockMenu();return}this.openMarkdownBlockMenu()}function Un(e){let t=e.target instanceof Element?e.target:null;if(!t)return;let n=t.closest(`[data-editor-command]`)?.getAttribute(`data-editor-command`);if(n){e.preventDefault(),this.runEditorCommand(n);return}if(t.closest(`[data-markdown-block-menu-toggle]`)){e.preventDefault(),this.toggleMarkdownBlockMenu();return}let r=t.closest(`[data-markdown-block-action]`);if(r){e.preventDefault();let t=r.getAttribute(`data-markdown-block-action`);this.closeMarkdownBlockMenu(),t&&this.applyMarkdownToolbarAction(t);return}let i=t.closest(`[data-markdown-action]`)?.getAttribute(`data-markdown-action`);i&&this.applyMarkdownToolbarAction(i)}function Wn(e){if(!this.isMarkdownBlockMenuOpen()){e.target instanceof Element&&e.target.closest(`[data-markdown-block-menu-toggle]`)&&[`ArrowDown`,`Enter`,` `].includes(e.key)&&(e.preventDefault(),this.openMarkdownBlockMenu(),this.getMarkdownBlockMenuPopover()?.querySelector(`[data-markdown-block-action]`)?.focus());return}if(e.key===`Escape`){e.preventDefault(),this.closeMarkdownBlockMenu(),this.elements?.markdownToolbar?.querySelector(`[data-markdown-block-menu-toggle]`)?.focus();return}let t=Array.from(this.getMarkdownBlockMenuPopover()?.querySelectorAll(`[data-markdown-block-action]`)??[]);if(t.length===0)return;let n=t.findIndex(t=>t===e.target);n<0||(e.key===`ArrowDown`?(e.preventDefault(),t[(n+1)%t.length]?.focus()):e.key===`ArrowUp`&&(e.preventDefault(),t[(n-1+t.length)%t.length]?.focus()))}function Gn(e){this.isMarkdownBlockMenuOpen()&&(this.elements?.markdownToolbar?.contains(e.target)||this.getMarkdownBlockMenuPopover()?.contains(e.target)||this.closeMarkdownBlockMenu())}function Kn(e){if(!this.session||!l(this.currentFilePath))return;if(e===`image`){this.handleToolbarImageInsert();return}let t=Dn(e);if(!this.session.applyMarkdownToolbarAction(t)){this.toastController.show(`Formatting action is unavailable`);return}Sn(t)&&this.setActiveMarkdownBlockAction(t)}function qn(e){return this.session?.runEditorCommand?.(e)?!0:(this.toastController.show(`Editor action is unavailable`),!1)}async function Jn(){let e=await this.pickImageFile();e&&await this.handleEditorImageInsert(e)}function Yn(){return new Promise(e=>{let t=document.createElement(`input`);t.type=`file`,t.accept=Tn,t.style.position=`fixed`,t.style.left=`-9999px`,document.body.appendChild(t);let n=!1,r=null,i=i=>{n||(n=!0,r&&window.clearTimeout(r),window.removeEventListener(`focus`,a),t.remove(),e(i))},a=()=>{r=window.setTimeout(()=>{n||t.files?.length||i(null)},250)};t.addEventListener(`change`,()=>{i(t.files?.[0]??null)},{once:!0}),t.addEventListener(`cancel`,()=>{i(null)},{once:!0}),window.addEventListener(`focus`,a,{once:!0}),t.click()})}async function Xn(e){if(!this.session||!l(this.currentFilePath))return console.warn(`[ui] Ignoring image insert because there is no active markdown session.`,{currentFilePath:this.currentFilePath,hasSession:!!this.session}),!1;let t=this.currentFilePath,n=this.session;try{console.debug(`[ui] Uploading image attachment.`,{fileName:e?.name||``,size:e?.size??null,sourcePath:t,type:e?.type||``});let r=await this.vaultApiClient.uploadImageAttachment({file:e,fileName:e?.name||``,sourcePath:t});return await this.fileExplorer.refresh(),this.currentFilePath===t&&this.session&&this.session===n&&typeof r?.markdown==`string`&&(console.debug(`[ui] Inserting uploaded image markdown into the editor.`,{sourcePath:t,storedPath:r.path??``}),this.session.insertText(r.markdown)),!0}catch(e){return console.error(`[ui] Failed to insert image attachment:`,e),this.toastController.show(e.message||`Failed to upload image`),!1}}async function Zn(){try{await navigator.clipboard.writeText(window.location.href),this.toastController.show(`Link copied`)}catch{this.toastController.show(`Failed to copy link`)}}var Qn={applyMarkdownToolbarAction:Kn,copyCurrentLink:Zn,closeMarkdownBlockMenu:Vn,getActiveMarkdownBlockAction:Mn,getMarkdownBlockMenuPopover:Pn,handleEditorImageInsert:Xn,handleMarkdownToolbarClick:Un,handleMarkdownToolbarDocumentPointerDown:Gn,handleMarkdownToolbarKeydown:Wn,handleToolbarImageInsert:Jn,isMarkdownBlockMenuOpen:Rn,openMarkdownBlockMenu:Bn,positionMarkdownBlockMenu:zn,renderMarkdownBlockMenuPopover:Fn,pickImageFile:Yn,renderMarkdownToolbar:Nn,runEditorCommand:qn,setActiveMarkdownBlockAction:Ln,syncMarkdownToolbarBlockUi:In,toggleMarkdownBlockMenu:Hn},$n={...Xt,...an,...Tt,...Qn,...dn},er={isExcalidrawFile(e){return b(e)},isDrawioFile(e){return p(e)},isImageFile(e){return c(e)},isMermaidFile(e){return _(e)},isPlantUmlFile(e){return m(e)},createDiagramPreviewDocument(e,t=``){return this.workspacePreviewController.createDiagramPreviewDocument(e,t)},getPreviewSource(){let e=this.getStaticPreviewDocument?.(),t=e?.currentFilePath??e?.filePath??null;return e&&t&&t===this.currentFilePath?this.isMermaidFile(this.currentFilePath)?this.createDiagramPreviewDocument(`mermaid`,e.content):this.isPlantUmlFile(this.currentFilePath)?this.createDiagramPreviewDocument(`plantuml`,e.content):String(e.content??``):this.workspacePreviewController.getPreviewSource(this.currentFilePath,{drawioMode:this.currentDrawioMode??null})},getStaticPreviewDocument(){return this._staticPreviewDocument??null},setStaticPreviewDocument(e){let t=e?.filePath??e?.path??null,n=e?.currentFilePath??t;this._staticPreviewDocument=e?{content:String(e.content??``),currentFilePath:n,fileKind:e.fileKind??g(t),filePath:t,hash:e.hash??null}:null},clearStaticPreviewDocument(){this._staticPreviewDocument=null},supportsFileHistory(e){let t=g(e);return t!==null&&t!==`image`},getDisplayName(e){return d(String(e??``).split(`/`).pop())},resetPreviewMode(){this.workspacePreviewController.resetPreviewMode()},syncFileChrome(e,t={}){this.workspacePreviewController.syncFileChrome(e,t)},handleLayoutViewRequest(e){return!this.currentFilePath||!this.isDrawioFile(this.currentFilePath)?!0:this.currentDrawioMode===`text`?e===`preview`?(this.layoutController.isMobileViewport?.()&&this.layoutController.primeView(e),this.navigation.navigateToFile(this.currentFilePath),!1):!0:e===`preview`?!0:(this.layoutController.primeView(e),this.navigation.navigateToFile(this.currentFilePath,{drawioMode:`text`}),!1)},renderExcalidrawFilePreview(e){this.workspacePreviewController.renderExcalidrawFilePreview(e)},renderDrawioFilePreview(e){this.workspacePreviewController.renderDrawioFilePreview(e)},renderImageFilePreview(e){this.workspacePreviewController.renderImageFilePreview(e)},renderTextFilePreview(e){this.workspacePreviewController.renderTextFilePreview(e)},createResizeHandler(){return this.workspacePreviewController.createResizeHandler(()=>this.restoreSidebarState())},initializePreviewLayoutObserver(){this._previewLayoutResizeObserver?.disconnect(),this._previewLayoutResizeObserver=this.workspacePreviewController.initializePreviewLayoutObserver(()=>this.schedulePreviewLayoutSync())},schedulePreviewLayoutSync({delayMs:e=120}={}){this.workspacePreviewController.schedulePreviewLayoutSync({delayMs:e,hydrationPaused:this._previewHydrationPaused,previewLayoutSyncTimer:this._previewLayoutSyncTimer,setPendingPreviewLayoutSync:e=>{this._pendingPreviewLayoutSync=e},setPreviewLayoutSyncTimer:e=>{this._previewLayoutSyncTimer=e}})},handleEditorScrollActivityChange(e){this.workspacePreviewController.handleEditorScrollActivityChange({isActive:e,pendingPreviewLayoutSync:this._pendingPreviewLayoutSync,previewLayoutSyncTimer:this._previewLayoutSyncTimer,setHydrationPaused:e=>{this._previewHydrationPaused=e},setPendingPreviewLayoutSync:e=>{this._pendingPreviewLayoutSync=e},setPreviewLayoutSyncTimer:e=>{this._previewLayoutSyncTimer=e}})},async handleHashChange(){await this.workspaceRouteController.handleHashChange()},showEmptyState(){clearTimeout(this._previewLayoutSyncTimer),this._previewLayoutSyncTimer=null,this._pendingPreviewLayoutSync=!1,this._previewHydrationPaused=!1,this.workspaceRouteController.showEmptyState()},showDiffState(){clearTimeout(this._previewLayoutSyncTimer),this._previewLayoutSyncTimer=null,this._pendingPreviewLayoutSync=!1,this._previewHydrationPaused=!1,this.workspaceRouteController.showDiffState()},async openFile(e){await this.workspaceRouteController.openFile(e)},cleanupSession(){this.workspaceRouteController.cleanupSession()},handleWikiLinkClick(e){this.wikiLinkFileController.handleWikiLinkClick(e)},normalizeNewWikiFilePath(e){return this.wikiLinkFileController.normalizeNewWikiFilePath(e)},async createAndOpenFile(e,t){await this.wikiLinkFileController.createAndOpenFile(e,t)},handleFileSelection(e,{closeSidebarOnMobile:t=!1}={}){this.workspaceRouteController.handleFileSelection(e,{closeSidebarOnMobile:t})}},tr=`__lobby__`;function nr(e){return String(e??``).replace(/\s+/g,` `).trim().slice(0,280)||null}function rr(e){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${e||`user`}-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function ir(e){if(!e||typeof e!=`object`||typeof e.id!=`string`)return null;let t=e.workspaceChange&&typeof e.workspaceChange==`object`?e.workspaceChange:{};return{action:typeof e.action==`string`?e.action:`git`,createdAt:Number.isFinite(e.createdAt)?e.createdAt:Date.now(),id:e.id,peerId:typeof e.peerId==`string`?e.peerId:null,sourceRef:typeof e.sourceRef==`string`?e.sourceRef:null,workspaceChange:{changedPaths:Array.isArray(t.changedPaths)?t.changedPaths.filter(Boolean):[],deletedPaths:Array.isArray(t.deletedPaths)?t.deletedPaths.filter(Boolean):[],refreshExplorer:t.refreshExplorer!==!1,renamedPaths:Array.isArray(t.renamedPaths)?t.renamedPaths.filter(e=>e?.oldPath&&e?.newPath):[]}}}var ar=class{constructor({preferredUserName:e,onChange:t,onChatChange:n,onWorkspaceEvent:r}){this.onChange=t,this.onChatChange=n,this.onWorkspaceEvent=r,this.wsBaseUrl=E(),this.ydoc=new P,this.chatMessages=this.ydoc.getArray(`chat-messages`),this.workspaceEvents=this.ydoc.getArray(`workspace-events`),this.provider=null,this.awareness=null,this.localUser=ve(e),this.currentFile=null,this._connected=!1,this._didInitialSync=!1,this.seenWorkspaceEventIds=new Set,this.handleAwarenessChange=()=>{this._emitChange()},this.handleChatMessagesChange=()=>{this._emitChatChange()},this.handleWorkspaceEventsChange=()=>{this._emitWorkspaceEvents()}}connect(){this.provider||(this._didInitialSync=!1,this.provider=new N(this.wsBaseUrl,tr,this.ydoc,{disableBc:!0,maxBackoffTime:5e3}),ne(this.provider),this.awareness=this.provider.awareness,this.awareness.setLocalStateField(`user`,this.localUser),this.awareness.setLocalStateField(`currentFile`,this.currentFile),this.awareness.on(`change`,this.handleAwarenessChange),this.chatMessages.observe(this.handleChatMessagesChange),this.workspaceEvents.observe(this.handleWorkspaceEventsChange),this.provider.on(`status`,({status:e})=>{this._connected=e===`connected`}),this.provider.on(`sync`,e=>{!e||this._didInitialSync||(this._didInitialSync=!0,this._primeWorkspaceEventCache(),this._emitChange(),this._emitChatChange({initial:!0}))}))}setCurrentFile(e){this.currentFile=e,this.awareness&&this.awareness.setLocalStateField(`currentFile`,e)}setUserName(e){e&&(this.localUser={...this.localUser,name:e},this.awareness&&this.awareness.setLocalStateField(`user`,this.localUser))}getLocalUser(){return this.localUser}sendChatMessage(e){let t=nr(e);if(!t)return null;let n={createdAt:Date.now(),filePath:this.currentFile??null,id:rr(this.localUser.peerId),peerId:this.localUser.peerId,text:t,userColor:this.localUser.color,userName:this.localUser.name};return this.ydoc.transact(()=>{this.chatMessages.push([n]);let e=this.chatMessages.length-40;e>0&&this.chatMessages.delete(0,e)},`lobby-chat-message`),n}sendWorkspaceEvent({action:e=`git`,sourceRef:t=null,workspaceChange:n={}}={}){let r=ir({action:e,createdAt:Date.now(),id:rr(this.localUser.peerId),peerId:this.localUser.peerId,sourceRef:t,workspaceChange:n});return r?(this.ydoc.transact(()=>{this.workspaceEvents.push([r]);let e=this.workspaceEvents.length-40;e>0&&this.workspaceEvents.delete(0,e)},`lobby-workspace-event`),this.seenWorkspaceEventIds.add(r.id),r):null}getMessages(){return this.chatMessages.toArray().filter(e=>e&&typeof e.id==`string`&&typeof e.peerId==`string`&&typeof e.text==`string`&&typeof e.userName==`string`)}getUsers(){if(!this.awareness)return[];let e=[];return this.awareness.getStates().forEach((t,n)=>{t.user&&e.push({...t.user,clientId:n,currentFile:t.currentFile??null,isLocal:n===this.awareness.clientID})}),e}getConnectionState(){return this._connected?{status:`connected`,unreachable:!1}:this.provider?{status:`connecting`,unreachable:!1}:{status:`disconnected`,unreachable:!1}}disconnect(){this.provider&&(this.awareness?.off(`change`,this.handleAwarenessChange),this.chatMessages?.unobserve(this.handleChatMessagesChange),this.workspaceEvents?.unobserve(this.handleWorkspaceEventsChange)),this.provider?.disconnect(),this.provider?.destroy(),this.provider=null,this.awareness=null,this._connected=!1,this._didInitialSync=!1,this.seenWorkspaceEventIds.clear()}destroy(){this.disconnect(),this.ydoc?.destroy(),this.ydoc=null}_emitChange(){this.onChange?.(this.getUsers())}_emitChatChange(e={}){this.onChatChange?.(this.getMessages(),e)}_primeWorkspaceEventCache(){this.workspaceEvents.toArray().forEach(e=>{let t=ir(e);t&&this.seenWorkspaceEventIds.add(t.id)})}_emitWorkspaceEvents(){if(!this._didInitialSync){this._primeWorkspaceEventCache();return}this.workspaceEvents.toArray().forEach(e=>{let t=ir(e);!t||this.seenWorkspaceEventIds.has(t.id)||(this.seenWorkspaceEventIds.add(t.id),t.peerId!==this.localUser.peerId&&this.onWorkspaceEvent?.(t))})}},or=class{getHashRoute(){return M()}navigateToFile(e,t){A(e,t)}navigateToGitDiff(e){C(e)}navigateToGitCommit(e){ee(e)}navigateToGitHistory(){w()}navigateToGitFileHistory(e){k(e)}navigateToGitFilePreview(e){j(e)}},sr=class{constructor({NotificationImpl:e=globalThis.Notification,focusWindow:t=()=>globalThis.window?.focus?.()}={}){this.NotificationImpl=e,this.focusWindow=t}getPermission(){return typeof this.NotificationImpl==`function`?this.NotificationImpl.permission:`unsupported`}async requestPermission(){return typeof this.NotificationImpl==`function`?this.NotificationImpl.requestPermission():`unsupported`}createNotification({body:e,onClick:t,tag:n,title:r}){if(typeof this.NotificationImpl!=`function`)return null;let i=new this.NotificationImpl(r,{body:e,tag:n});return typeof t==`function`&&i.addEventListener(`click`,()=>{this.focusWindow(),t()}),i}},cr=class{constructor({chatNotificationsKey:e,lineWrappingKey:t,sidebarVisibleKey:n,userNameKey:r,storage:i=globalThis.localStorage}){this.chatNotificationsKey=e,this.lineWrappingKey=t,this.sidebarVisibleKey=n,this.storage=i,this.userNameKey=r}getUserName(){try{return this.storage.getItem(this.userNameKey)||``}catch{return``}}setUserName(e){try{this.storage.setItem(this.userNameKey,e)}catch{}}getLineWrappingEnabled(){try{return this.storage.getItem(this.lineWrappingKey)!==`false`}catch{return!0}}setLineWrappingEnabled(e){try{this.storage.setItem(this.lineWrappingKey,String(e))}catch{}}getSidebarVisible(){try{return this.storage.getItem(this.sidebarVisibleKey)}catch{return null}}setSidebarVisible(e){try{this.storage.setItem(this.sidebarVisibleKey,e?`true`:`false`)}catch{}}getChatNotificationsEnabled(){try{return this.storage.getItem(this.chatNotificationsKey)===`true`}catch{return!1}}setChatNotificationsEnabled(e){try{this.storage.setItem(this.chatNotificationsKey,String(e))}catch{}}},lr=6e4;function ur(e){return String(e?.build?.id??e?.buildId??``).trim()}var dr=class{constructor({currentBuildId:e=``,documentRef:t=globalThis.document??null,fetchImpl:n=globalThis.fetch?.bind(globalThis),intervalMs:r=lr,onUpdateAvailable:i=null,runtimeConfig:a={basePath:``},versionUrl:o=null,windowRef:s=globalThis.window??globalThis}={}){this.currentBuildId=String(e??``).trim(),this.documentRef=t,this.fetchImpl=n,this.intervalHandle=null,this.intervalMs=Math.max(5e3,Number(r)||lr),this.isChecking=!1,this.onUpdateAvailable=typeof i==`function`?i:null,this.runtimeConfig=a,this.updateDetected=!1,this.versionUrl=o||te(`/version.json`,a),this.windowRef=s,this.handleFocus=()=>{this.checkNow({force:!0})},this.handleVisibilityChange=()=>{this.documentRef?.hidden||this.checkNow({force:!0})}}start(){!this.fetchImpl||this.intervalHandle||(this.documentRef?.addEventListener?.(`visibilitychange`,this.handleVisibilityChange),this.windowRef?.addEventListener?.(`focus`,this.handleFocus),this.intervalHandle=this.windowRef?.setInterval?.(()=>{this.checkNow()},this.intervalMs)??null,this.checkNow({force:!0}))}stop(){this.intervalHandle&&=(this.windowRef?.clearInterval?.(this.intervalHandle),null),this.documentRef?.removeEventListener?.(`visibilitychange`,this.handleVisibilityChange),this.windowRef?.removeEventListener?.(`focus`,this.handleFocus)}async checkNow({force:e=!1}={}){if(!this.fetchImpl||this.isChecking||this.updateDetected||!e&&this.documentRef?.hidden)return!1;this.isChecking=!0;try{let e=await this.fetchImpl(this.versionUrl,{cache:`no-store`,headers:{Accept:`application/json`}});if(!e?.ok)return!1;let t=await e.json().catch(()=>null),n=ur(t);return n?this.currentBuildId?n===this.currentBuildId?!1:(this.updateDetected=!0,this.onUpdateAvailable?.(t),!0):(this.currentBuildId=n,!1):!1}catch{return!1}finally{this.isChecking=!1}}},fr=`collabmd-active-tab-lock`,pr=`collabmd-tab-id`,mr=`collabmd-tab-lock`,hr=4e3;function gr(){return Date.now()}function _r(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`tab-${gr()}-${Math.random().toString(36).slice(2,10)}`}function vr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}var yr=class{constructor({heartbeatIntervalMs:e=hr,onBlocked:t,onActivated:n,onStolen:r}={}){this.heartbeatIntervalMs=e,this.staleAfterMs=e*3,this.onBlocked=t,this.onActivated=n,this.onStolen=r,this.tabId=this.getOrCreateTabId(),this.channel=null,this.heartbeatTimer=null,this.isOwner=!1,this.handleStorageEvent=this.handleStorageEvent.bind(this),this.handlePageHide=this.handlePageHide.bind(this)}initialize(){window.addEventListener(`storage`,this.handleStorageEvent),window.addEventListener(`pagehide`,this.handlePageHide),`BroadcastChannel`in globalThis&&(this.channel=new BroadcastChannel(mr),this.channel.addEventListener(`message`,e=>{this.handleChannelMessage(e.data)}))}destroy(){this.release(),window.removeEventListener(`storage`,this.handleStorageEvent),window.removeEventListener(`pagehide`,this.handlePageHide),this.channel?.close(),this.channel=null}tryActivate({takeover:e=!1}={}){let t=this.readLock();return this.isFreshLock(t)&&t.tabId!==this.tabId&&!e?(this.isOwner=!1,this.stopHeartbeat(),this.onBlocked?.({reason:`active-elsewhere`,ownerTabId:t.tabId}),!1):(this.writeLock(),this.startHeartbeat(),this.isOwner=!0,this.channel?.postMessage({type:`claimed`,takeover:e,tabId:this.tabId}),this.onActivated?.({takeover:e}),!0)}release(){this.readLock()?.tabId===this.tabId&&(localStorage.removeItem(fr),this.channel?.postMessage({type:`released`,tabId:this.tabId})),this.isOwner=!1,this.stopHeartbeat()}getOrCreateTabId(){try{let e=window.sessionStorage.getItem(pr);if(e)return e;let t=_r();return window.sessionStorage.setItem(pr,t),t}catch{return _r()}}readLock(){try{return vr(window.localStorage.getItem(fr))}catch{return null}}isFreshLock(e){return!!(e&&typeof e.tabId==`string`&&Number.isFinite(e.updatedAt)&&gr()-e.updatedAt<this.staleAfterMs)}writeLock(){try{window.localStorage.setItem(fr,JSON.stringify({tabId:this.tabId,updatedAt:gr()}))}catch{}}startHeartbeat(){this.stopHeartbeat(),this.writeLock(),this.heartbeatTimer=window.setInterval(()=>{if(!this.isOwner){this.stopHeartbeat();return}this.writeLock()},this.heartbeatIntervalMs)}stopHeartbeat(){this.heartbeatTimer&&=(window.clearInterval(this.heartbeatTimer),null)}handleStorageEvent(e){if(e.key!==fr)return;let t=vr(e.newValue);this.handleExternalLockChange(t)}handleChannelMessage(e){!e||typeof e!=`object`||e.tabId===this.tabId||e.type===`claimed`&&this.handleExternalLockChange(this.readLock())}handleExternalLockChange(e){this.isOwner&&this.isFreshLock(e)&&e.tabId!==this.tabId&&(this.isOwner=!1,this.stopHeartbeat(),this.onStolen?.({ownerTabId:e.tabId}))}handlePageHide(){this.release()}},br=`__workspace__`;function xr(e){return!e?.path||!e?.type?null:e.nodeType===`directory`||e.type===`directory`?{children:[],name:e.name,path:e.path,type:`directory`}:{name:e.name,path:e.path,type:e.type}}function Sr(e=[]){return e.sort((e,t)=>e.type===`directory`&&t.type!==`directory`?-1:e.type!==`directory`&&t.type===`directory`?1:e.name.localeCompare(t.name,void 0,{sensitivity:`base`})),e.forEach(e=>{Array.isArray(e.children)&&Sr(e.children)}),e}function Cr(e){return e instanceof Map?e:new Map(Object.entries(e??{}))}function wr(e=[],t=`asc`){let n=t===`desc`?-1:1;return[...e].sort((e,t)=>{let r=e.split(`/`).length-t.split(`/`).length;return r===0?e.localeCompare(t,void 0,{sensitivity:`base`})*n:r*n})}var Tr=class{constructor(){this.entriesByPath=new Map,this.nodesByPath=new Map,this.nodeParentPathByPath=new Map,this.roots=[]}reset(e){return this.entriesByPath=Cr(e),this.nodesByPath=new Map,this.nodeParentPathByPath=new Map,this.roots=[],this.entriesByPath.forEach(e=>{let t=xr(e);t&&this.nodesByPath.set(e.path,t)}),wr(Array.from(this.nodesByPath.keys())).forEach(e=>{let t=this.nodesByPath.get(e);t&&this.attachNode(e,t,this.entriesByPath.get(e)?.parentPath||``)}),Sr(this.roots),this.roots}getTree(){return this.roots}applyMapChanges(e,t){let n=[],r=[];return e.forEach((e,t)=>{e.action===`delete`?n.push(t):r.push(t)}),wr(n,`desc`).forEach(e=>{this.removeEntry(e)}),wr(r).forEach(e=>{this.upsertEntry(e,t.get(e))}),Sr(this.roots),this.roots}removeEntry(e){let t=this.nodesByPath.get(e);if(!t){this.entriesByPath.delete(e),this.nodeParentPathByPath.delete(e);return}this.detachNode(e,t),this.nodesByPath.delete(e),this.entriesByPath.delete(e),this.nodeParentPathByPath.delete(e)}upsertEntry(e,t){if(!t?.path||!t?.type){this.removeEntry(e);return}let n=xr(t);if(!n){this.removeEntry(e);return}let r=this.nodesByPath.get(e);!r||r.type===`directory`!=(n.type===`directory`)?(r&&this.detachNode(e,r),r=n,this.nodesByPath.set(e,r)):(r.name=n.name,r.path=n.path,r.type=n.type,r.type===`directory`&&!Array.isArray(r.children)&&(r.children=[]),r.type!==`directory`&&Array.isArray(r.children)&&delete r.children),this.entriesByPath.set(e,t),this.attachNode(e,r,t.parentPath||``),r.type===`directory`&&this.rehomeChildren(e)}detachNode(e,t){let n=this.nodeParentPathByPath.get(e)||``,r=n?this.nodesByPath.get(n)?.children:this.roots,i=r?.indexOf?.(t)??-1;i>=0&&r.splice(i,1),this.nodeParentPathByPath.delete(e)}attachNode(e,t,n=``){let r=this.nodesByPath.get(n)?.type===`directory`?n:``,i=this.nodeParentPathByPath.get(e);if(i===r)return;i!==void 0&&this.detachNode(e,t);let a=r?this.nodesByPath.get(r)?.children:this.roots;a.includes(t)||a.push(t),this.nodeParentPathByPath.set(e,r)}rehomeChildren(e){this.entriesByPath.forEach((t,n)=>{if(t?.parentPath!==e)return;let r=this.nodesByPath.get(n);r&&this.attachNode(n,r,e)})}},Er=class{constructor({onTreeChange:e=()=>{},onWorkspaceEvent:t=()=>{}}={}){this.onTreeChange=e,this.onWorkspaceEvent=t,this.ydoc=new P,this.entries=this.ydoc.getMap(`entries`),this.events=this.ydoc.getArray(`events`),this.provider=null,this._didInitialSync=!1,this.seenEventIds=new Set,this.treeModel=new Tr,this.handleEntriesChange=e=>{!this._didInitialSync||!e||this.onTreeChange(this.treeModel.applyMapChanges(e.changes.keys,this.entries),{changedPaths:Array.from(e.changes.keys.keys()),reset:!1})},this.handleEventsChange=()=>{if(!this._didInitialSync){this.primeEventCache();return}this.events.toArray().forEach(e=>{let t=dt(e);!t||this.seenEventIds.has(t.id)||(this.seenEventIds.add(t.id),this.onWorkspaceEvent(t))})}}connect(){this.provider||(this._didInitialSync=!1,this.provider=new N(E(),br,this.ydoc,{disableBc:!0,maxBackoffTime:5e3}),ne(this.provider),this.entries.observe(this.handleEntriesChange),this.events.observe(this.handleEventsChange),this.provider.on(`sync`,e=>{!e||this._didInitialSync||(this._didInitialSync=!0,this.primeEventCache(),this.onTreeChange(this.treeModel.reset(this.entries.toJSON()),{changedPaths:[],reset:!0}))}))}primeEventCache(){this.events.toArray().forEach(e=>{let t=dt(e);t&&this.seenEventIds.add(t.id)})}disconnect(){this.entries.unobserve(this.handleEntriesChange),this.events.unobserve(this.handleEventsChange),this.provider?.disconnect(),this.provider?.destroy(),this.provider=null,this._didInitialSync=!1,this.seenEventIds.clear(),this.treeModel.reset(new Map)}destroy(){this.disconnect(),this.ydoc.destroy()}},Dr=class{constructor({documentRef:e=document,inlinePanelElement:t=null,onFileSelect:n,panelElement:r}){this.documentRef=e,this.panelRoot=r,this.inlinePanel=t,this.onFileSelect=n,this._expanded=!1,this._currentFile=null,this._fetchController=null,this._backlinks=[],this._pendingOutsidePointer=null;let i=this.panelRoot?.querySelector(`[data-backlinks-variant="dock"]`)??this.panelRoot;this.panels=[this._createPanelRef(i),this._createPanelRef(this.inlinePanel)].filter(Boolean),this.handleDocumentPointerDown=e=>{if(!this._expanded)return;let t=e?.target;if(t&&this.panels.some(({panel:e})=>e?.contains?.(t))){this._pendingOutsidePointer=null;return}e?.pointerType===`mouse`&&e?.button!==0||(this._pendingOutsidePointer={pointerId:e?.pointerId??`mouse`,startX:Number(e?.clientX??0),startY:Number(e?.clientY??0)})},this.handleDocumentPointerMove=e=>{if(!this._pendingOutsidePointer)return;let t=Math.abs(Number(e?.clientX??0)-this._pendingOutsidePointer.startX),n=Math.abs(Number(e?.clientY??0)-this._pendingOutsidePointer.startY);(t>10||n>10)&&(this._pendingOutsidePointer=null)},this.handleDocumentPointerEnd=e=>{if(!this._expanded||!this._pendingOutsidePointer)return;let t=e?.target;if(t&&this.panels.some(({panel:e})=>e?.contains?.(t))){this._pendingOutsidePointer=null;return}this._pendingOutsidePointer=null,this.close()},this.handleDocumentKeyDown=e=>{!this._expanded||e?.key!==`Escape`||(e.preventDefault?.(),this.close())},this.bindEvents()}bindEvents(){this.panels.forEach(e=>{e.header?.addEventListener(`click`,()=>{this._backlinks.length!==0&&(this._expanded=!this._expanded,this._pendingOutsidePointer=null,this._applyExpandState())})}),this.documentRef?.addEventListener?.(`pointerdown`,this.handleDocumentPointerDown),this.documentRef?.addEventListener?.(`pointermove`,this.handleDocumentPointerMove,{passive:!0}),this.documentRef?.addEventListener?.(`pointerup`,this.handleDocumentPointerEnd),this.documentRef?.addEventListener?.(`pointercancel`,this.handleDocumentPointerEnd),this.documentRef?.addEventListener?.(`keydown`,this.handleDocumentKeyDown)}async load(e){let t=e!==this._currentFile;if(this._currentFile=e,t&&(this._expanded=!1),!e){this._backlinks=[],this._render();return}this._fetchController?.abort(),this._fetchController=new AbortController;try{let t=await(await fetch(D(`/backlinks?file=${encodeURIComponent(e)}`),{signal:this._fetchController.signal})).json();if(this._currentFile!==e)return;this._backlinks=t.backlinks??[]}catch(e){if(e.name===`AbortError`)return;console.warn(`[backlinks] Failed to load:`,e.message),this._backlinks=[]}this._render()}clear(){this._currentFile=null,this._backlinks=[],this._expanded=!1,this._render()}close(){this._expanded&&(this._expanded=!1,this._pendingOutsidePointer=null,this._applyExpandState())}_createPanelRef(e){return e?{panel:e,header:e.querySelector(`.backlinks-header`),toggle:e.querySelector(`.backlinks-toggle`),countBadge:e.querySelector(`.backlinks-count`),body:e.querySelector(`.backlinks-body`),list:e.querySelector(`.backlinks-list`)}:null}_render(){let e=this._backlinks.length,t=e===1?`Linked Mention`:`Linked Mentions`,n=!!this._currentFile&&e>0;this.panelRoot?.classList?.toggle(`hidden`,!n),this.inlinePanel?.classList?.toggle(`hidden`,!n),n||(this._expanded=!1),this.panels.forEach(r=>{r.countBadge.textContent=n?String(e):``,r.toggle.textContent=t,r.header?.classList.toggle(`backlinks-header-empty`,!n),n?this._renderList(r.list):r.list.innerHTML=``}),this._applyExpandState()}_renderList(e){if(!e)return;e.innerHTML=``;let t=this.documentRef?.createDocumentFragment?.(),n=t??e;this._backlinks.forEach(e=>{n.appendChild(this._createBacklinkItem(e))}),t&&e.appendChild(t)}_createBacklinkItem(e){let t=e.file.replace(/\.md$/i,``).split(`/`).pop(),n=e.file.includes(`/`)?e.file.substring(0,e.file.lastIndexOf(`/`)):``,r=this.documentRef.createElement(`button`);r.type=`button`,r.className=`backlink-item`,r.addEventListener(`click`,()=>{this.close(),this.onFileSelect?.(e.file)});let i=this.documentRef.createElement(`div`);if(i.className=`backlink-file-name`,i.innerHTML=`
143
+ `).join(``)}function Nn(){let e=On(this._activeMarkdownBlockAction||Dn);return Cn(e)?e:Dn}function Pn(){let e=this.elements?.markdownToolbar;e&&(e.innerHTML=Mn(this.getActiveMarkdownBlockAction()),this.renderMarkdownBlockMenuPopover(),this.syncMarkdownToolbarBlockUi())}function Fn(){return this._markdownBlockMenuPopover??null}function In(){let e=this.elements?.editorContainer??document.body,t=this.getMarkdownBlockMenuPopover();t?t.parentElement!==e&&e?.appendChild(t):(t=document.createElement(`div`),t.className=`markdown-toolbar-popover hidden`,t.innerHTML=`<div class="markdown-toolbar-menu" data-markdown-block-menu role="menu" aria-label="Block formatting"></div>`,t.addEventListener(`click`,e=>{this.handleMarkdownToolbarClick?.(e)}),t.addEventListener(`keydown`,e=>{this.handleMarkdownToolbarKeydown?.(e)}),e?.appendChild(t),this._markdownBlockMenuPopover=t);let n=t.querySelector(`[data-markdown-block-menu]`);n&&(n.innerHTML=jn(this.getActiveMarkdownBlockAction()))}function Ln(){let e=this.elements?.markdownToolbar;if(!e)return;let t=this.getActiveMarkdownBlockAction(),n=xn(t),r=e.querySelector(`[data-markdown-block-trigger-label]`);r&&(r.textContent=wn(t));let i=e.querySelector(`[data-markdown-block-menu-toggle]`);i&&n&&(i.setAttribute(`aria-label`,`${n.label}. Block formatting`),i.setAttribute(`title`,`${n.label}. Block formatting`));let a=Array.from(this.getMarkdownBlockMenuPopover()?.querySelectorAll(`[data-markdown-block-action]`)??[]);[...e.querySelectorAll(`[data-markdown-block-action]`),...a].forEach(e=>{let n=e.getAttribute(`data-markdown-block-action`)===t;e.classList.toggle(`is-active`,n),e.setAttribute(`aria-checked`,n?`true`:`false`)})}function Rn(e){let t=On(e);Cn(t)&&(this._activeMarkdownBlockAction=t,this.syncMarkdownToolbarBlockUi())}function zn(){return!!this.elements?.markdownToolbar?.classList.contains(`is-menu-open`)}function Bn(){let e=this.getMarkdownBlockMenuPopover(),t=this.elements?.markdownToolbar?.querySelector(`[data-markdown-block-menu-toggle]`),n=e?.parentElement;if(!e||!t||!(n instanceof HTMLElement))return;let r=t.getBoundingClientRect(),i=n.getBoundingClientRect(),a=e.getBoundingClientRect(),o=a.width||176,s=a.height||240,c=r.left-i.left,l=Math.max(8,i.width-o-8),u=r.bottom-i.top+6,d=u+s<=i.height-8;e.style.left=`${Math.max(8,Math.min(c,l))}px`,e.style.top=`${d?u:Math.max(8,r.top-i.top-s-6)}px`}function Vn(){let e=this.elements?.markdownToolbar;e&&(this.renderMarkdownBlockMenuPopover(),e.classList.add(`is-menu-open`),this.getMarkdownBlockMenuPopover()?.classList.remove(`hidden`),e.querySelector(`[data-markdown-block-menu-toggle]`)?.setAttribute(`aria-expanded`,`true`),this.positionMarkdownBlockMenu())}function Hn(){let e=this.elements?.markdownToolbar;e&&(e.classList.remove(`is-menu-open`),this.getMarkdownBlockMenuPopover()?.classList.add(`hidden`),e.querySelector(`[data-markdown-block-menu-toggle]`)?.setAttribute(`aria-expanded`,`false`))}function Un(){if(this.isMarkdownBlockMenuOpen()){this.closeMarkdownBlockMenu();return}this.openMarkdownBlockMenu()}function Wn(e){let t=e.target instanceof Element?e.target:null;if(!t)return;let n=t.closest(`[data-editor-command]`)?.getAttribute(`data-editor-command`);if(n){e.preventDefault(),this.runEditorCommand(n);return}if(t.closest(`[data-markdown-block-menu-toggle]`)){e.preventDefault(),this.toggleMarkdownBlockMenu();return}let r=t.closest(`[data-markdown-block-action]`);if(r){e.preventDefault();let t=r.getAttribute(`data-markdown-block-action`);this.closeMarkdownBlockMenu(),t&&this.applyMarkdownToolbarAction(t);return}let i=t.closest(`[data-markdown-action]`)?.getAttribute(`data-markdown-action`);i&&this.applyMarkdownToolbarAction(i)}function Gn(e){if(!this.isMarkdownBlockMenuOpen()){e.target instanceof Element&&e.target.closest(`[data-markdown-block-menu-toggle]`)&&[`ArrowDown`,`Enter`,` `].includes(e.key)&&(e.preventDefault(),this.openMarkdownBlockMenu(),this.getMarkdownBlockMenuPopover()?.querySelector(`[data-markdown-block-action]`)?.focus());return}if(e.key===`Escape`){e.preventDefault(),this.closeMarkdownBlockMenu(),this.elements?.markdownToolbar?.querySelector(`[data-markdown-block-menu-toggle]`)?.focus();return}let t=Array.from(this.getMarkdownBlockMenuPopover()?.querySelectorAll(`[data-markdown-block-action]`)??[]);if(t.length===0)return;let n=t.findIndex(t=>t===e.target);n<0||(e.key===`ArrowDown`?(e.preventDefault(),t[(n+1)%t.length]?.focus()):e.key===`ArrowUp`&&(e.preventDefault(),t[(n-1+t.length)%t.length]?.focus()))}function Kn(e){this.isMarkdownBlockMenuOpen()&&(this.elements?.markdownToolbar?.contains(e.target)||this.getMarkdownBlockMenuPopover()?.contains(e.target)||this.closeMarkdownBlockMenu())}function qn(e){if(!this.session||!u(this.currentFilePath))return;if(e===`image`){this.handleToolbarImageInsert();return}let t=On(e);if(!this.session.applyMarkdownToolbarAction(t)){this.toastController.show(`Formatting action is unavailable`);return}Cn(t)&&this.setActiveMarkdownBlockAction(t)}function Jn(e){return this.session?.runEditorCommand?.(e)?!0:(this.toastController.show(`Editor action is unavailable`),!1)}async function Yn(){let e=await this.pickImageFile();e&&await this.handleEditorImageInsert(e)}function Xn(){return new Promise(e=>{let t=document.createElement(`input`);t.type=`file`,t.accept=En,t.style.position=`fixed`,t.style.left=`-9999px`,document.body.appendChild(t);let n=!1,r=null,i=i=>{n||(n=!0,r&&window.clearTimeout(r),window.removeEventListener(`focus`,a),t.remove(),e(i))},a=()=>{r=window.setTimeout(()=>{n||t.files?.length||i(null)},250)};t.addEventListener(`change`,()=>{i(t.files?.[0]??null)},{once:!0}),t.addEventListener(`cancel`,()=>{i(null)},{once:!0}),window.addEventListener(`focus`,a,{once:!0}),t.click()})}async function Zn(e){if(!this.session||!u(this.currentFilePath))return console.warn(`[ui] Ignoring image insert because there is no active markdown session.`,{currentFilePath:this.currentFilePath,hasSession:!!this.session}),!1;let t=this.currentFilePath,n=this.session;try{console.debug(`[ui] Uploading image attachment.`,{fileName:e?.name||``,size:e?.size??null,sourcePath:t,type:e?.type||``});let r=await this.vaultApiClient.uploadImageAttachment({file:e,fileName:e?.name||``,sourcePath:t});return await this.fileExplorer.refresh(),this.currentFilePath===t&&this.session&&this.session===n&&typeof r?.markdown==`string`&&(console.debug(`[ui] Inserting uploaded image markdown into the editor.`,{sourcePath:t,storedPath:r.path??``}),this.session.insertText(r.markdown)),!0}catch(e){return console.error(`[ui] Failed to insert image attachment:`,e),this.toastController.show(e.message||`Failed to upload image`),!1}}async function Qn(){try{await navigator.clipboard.writeText(window.location.href),this.toastController.show(`Link copied`)}catch{this.toastController.show(`Failed to copy link`)}}var $n={applyMarkdownToolbarAction:qn,copyCurrentLink:Qn,closeMarkdownBlockMenu:Hn,getActiveMarkdownBlockAction:Nn,getMarkdownBlockMenuPopover:Fn,handleEditorImageInsert:Zn,handleMarkdownToolbarClick:Wn,handleMarkdownToolbarDocumentPointerDown:Kn,handleMarkdownToolbarKeydown:Gn,handleToolbarImageInsert:Yn,isMarkdownBlockMenuOpen:zn,openMarkdownBlockMenu:Vn,positionMarkdownBlockMenu:Bn,renderMarkdownBlockMenuPopover:In,pickImageFile:Xn,renderMarkdownToolbar:Pn,runEditorCommand:Jn,setActiveMarkdownBlockAction:Rn,syncMarkdownToolbarBlockUi:Ln,toggleMarkdownBlockMenu:Un},er={...Zt,...on,...Et,...$n,...fn},tr={isExcalidrawFile(e){return g(e)},isBaseFile(e){return l(e)},isDrawioFile(e){return p(e)},isImageFile(e){return o(e)},isMermaidFile(e){return v(e)},isPlantUmlFile(e){return s(e)},createDiagramPreviewDocument(e,t=``){return this.workspacePreviewController.createDiagramPreviewDocument(e,t)},getPreviewSource(){let e=this.getStaticPreviewDocument?.(),t=e?.currentFilePath??e?.filePath??null;return e&&t&&t===this.currentFilePath?this.isMermaidFile(this.currentFilePath)?this.createDiagramPreviewDocument(`mermaid`,e.content):this.isPlantUmlFile(this.currentFilePath)?this.createDiagramPreviewDocument(`plantuml`,e.content):String(e.content??``):this.workspacePreviewController.getPreviewSource(this.currentFilePath,{drawioMode:this.currentDrawioMode??null})},getStaticPreviewDocument(){return this._staticPreviewDocument??null},setStaticPreviewDocument(e){let t=e?.filePath??e?.path??null,n=e?.currentFilePath??t;this._staticPreviewDocument=e?{content:String(e.content??``),currentFilePath:n,fileKind:e.fileKind??f(t),filePath:t,hash:e.hash??null}:null},clearStaticPreviewDocument(){this._staticPreviewDocument=null},supportsFileHistory(e){let t=f(e);return t!==null&&t!==`image`},getDisplayName(e){return c(String(e??``).split(`/`).pop())},resetPreviewMode(){this.workspacePreviewController.resetPreviewMode()},syncFileChrome(e,t={}){this.workspacePreviewController.syncFileChrome(e,t)},handleLayoutViewRequest(e){return!this.currentFilePath||!this.isDrawioFile(this.currentFilePath)?!0:this.currentDrawioMode===`text`?e===`preview`?(this.layoutController.isMobileViewport?.()&&this.layoutController.primeView(e),this.navigation.navigateToFile(this.currentFilePath),!1):!0:e===`preview`?!0:(this.layoutController.primeView(e),this.navigation.navigateToFile(this.currentFilePath,{drawioMode:`text`}),!1)},renderExcalidrawFilePreview(e){this.workspacePreviewController.renderExcalidrawFilePreview(e)},renderDrawioFilePreview(e){this.workspacePreviewController.renderDrawioFilePreview(e)},renderImageFilePreview(e){this.workspacePreviewController.renderImageFilePreview(e)},renderBaseFilePreview(e){return this.workspacePreviewController.renderBaseFilePreview(e)},renderTextFilePreview(e){this.workspacePreviewController.renderTextFilePreview(e)},createResizeHandler(){return this.workspacePreviewController.createResizeHandler(()=>this.restoreSidebarState())},initializePreviewLayoutObserver(){this._previewLayoutResizeObserver?.disconnect(),this._previewLayoutResizeObserver=this.workspacePreviewController.initializePreviewLayoutObserver(()=>this.schedulePreviewLayoutSync())},schedulePreviewLayoutSync({delayMs:e=120}={}){this.workspacePreviewController.schedulePreviewLayoutSync({delayMs:e,hydrationPaused:this._previewHydrationPaused,previewLayoutSyncTimer:this._previewLayoutSyncTimer,setPendingPreviewLayoutSync:e=>{this._pendingPreviewLayoutSync=e},setPreviewLayoutSyncTimer:e=>{this._previewLayoutSyncTimer=e}})},handleEditorScrollActivityChange(e){this.workspacePreviewController.handleEditorScrollActivityChange({isActive:e,pendingPreviewLayoutSync:this._pendingPreviewLayoutSync,previewLayoutSyncTimer:this._previewLayoutSyncTimer,setHydrationPaused:e=>{this._previewHydrationPaused=e},setPendingPreviewLayoutSync:e=>{this._pendingPreviewLayoutSync=e},setPreviewLayoutSyncTimer:e=>{this._previewLayoutSyncTimer=e}})},async handleHashChange(){await this.workspaceRouteController.handleHashChange()},showEmptyState(){clearTimeout(this._previewLayoutSyncTimer),this._previewLayoutSyncTimer=null,this._pendingPreviewLayoutSync=!1,this._previewHydrationPaused=!1,this.workspaceRouteController.showEmptyState()},showDiffState(){clearTimeout(this._previewLayoutSyncTimer),this._previewLayoutSyncTimer=null,this._pendingPreviewLayoutSync=!1,this._previewHydrationPaused=!1,this.workspaceRouteController.showDiffState()},async openFile(e){await this.workspaceRouteController.openFile(e)},cleanupSession(){this.workspaceRouteController.cleanupSession()},handleWikiLinkClick(e){this.wikiLinkFileController.handleWikiLinkClick(e)},normalizeNewWikiFilePath(e){return this.wikiLinkFileController.normalizeNewWikiFilePath(e)},async createAndOpenFile(e,t){await this.wikiLinkFileController.createAndOpenFile(e,t)},handleFileSelection(e,{closeSidebarOnMobile:t=!1}={}){this.workspaceRouteController.handleFileSelection(e,{closeSidebarOnMobile:t})}},nr=`__lobby__`;function rr(e){return String(e??``).replace(/\s+/g,` `).trim().slice(0,280)||null}function ir(e){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${e||`user`}-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function ar(e){if(!e||typeof e!=`object`||typeof e.id!=`string`)return null;let t=e.workspaceChange&&typeof e.workspaceChange==`object`?e.workspaceChange:{};return{action:typeof e.action==`string`?e.action:`git`,createdAt:Number.isFinite(e.createdAt)?e.createdAt:Date.now(),id:e.id,peerId:typeof e.peerId==`string`?e.peerId:null,sourceRef:typeof e.sourceRef==`string`?e.sourceRef:null,workspaceChange:{changedPaths:Array.isArray(t.changedPaths)?t.changedPaths.filter(Boolean):[],deletedPaths:Array.isArray(t.deletedPaths)?t.deletedPaths.filter(Boolean):[],refreshExplorer:t.refreshExplorer!==!1,renamedPaths:Array.isArray(t.renamedPaths)?t.renamedPaths.filter(e=>e?.oldPath&&e?.newPath):[]}}}var or=class{constructor({preferredUserName:e,onChange:t,onChatChange:n,onWorkspaceEvent:r}){this.onChange=t,this.onChatChange=n,this.onWorkspaceEvent=r,this.wsBaseUrl=E(),this.ydoc=new ne,this.chatMessages=this.ydoc.getArray(`chat-messages`),this.workspaceEvents=this.ydoc.getArray(`workspace-events`),this.provider=null,this.awareness=null,this.localUser=ye(e),this.currentFile=null,this._connected=!1,this._didInitialSync=!1,this.seenWorkspaceEventIds=new Set,this.handleAwarenessChange=()=>{this._emitChange()},this.handleChatMessagesChange=()=>{this._emitChatChange()},this.handleWorkspaceEventsChange=()=>{this._emitWorkspaceEvents()}}connect(){this.provider||(this._didInitialSync=!1,this.provider=new P(this.wsBaseUrl,nr,this.ydoc,{disableBc:!0,maxBackoffTime:5e3}),re(this.provider),this.awareness=this.provider.awareness,this.awareness.setLocalStateField(`user`,this.localUser),this.awareness.setLocalStateField(`currentFile`,this.currentFile),this.awareness.on(`change`,this.handleAwarenessChange),this.chatMessages.observe(this.handleChatMessagesChange),this.workspaceEvents.observe(this.handleWorkspaceEventsChange),this.provider.on(`status`,({status:e})=>{this._connected=e===`connected`}),this.provider.on(`sync`,e=>{!e||this._didInitialSync||(this._didInitialSync=!0,this._primeWorkspaceEventCache(),this._emitChange(),this._emitChatChange({initial:!0}))}))}setCurrentFile(e){this.currentFile=e,this.awareness&&this.awareness.setLocalStateField(`currentFile`,e)}setUserName(e){e&&(this.localUser={...this.localUser,name:e},this.awareness&&this.awareness.setLocalStateField(`user`,this.localUser))}getLocalUser(){return this.localUser}sendChatMessage(e){let t=rr(e);if(!t)return null;let n={createdAt:Date.now(),filePath:this.currentFile??null,id:ir(this.localUser.peerId),peerId:this.localUser.peerId,text:t,userColor:this.localUser.color,userName:this.localUser.name};return this.ydoc.transact(()=>{this.chatMessages.push([n]);let e=this.chatMessages.length-40;e>0&&this.chatMessages.delete(0,e)},`lobby-chat-message`),n}sendWorkspaceEvent({action:e=`git`,sourceRef:t=null,workspaceChange:n={}}={}){let r=ar({action:e,createdAt:Date.now(),id:ir(this.localUser.peerId),peerId:this.localUser.peerId,sourceRef:t,workspaceChange:n});return r?(this.ydoc.transact(()=>{this.workspaceEvents.push([r]);let e=this.workspaceEvents.length-40;e>0&&this.workspaceEvents.delete(0,e)},`lobby-workspace-event`),this.seenWorkspaceEventIds.add(r.id),r):null}getMessages(){return this.chatMessages.toArray().filter(e=>e&&typeof e.id==`string`&&typeof e.peerId==`string`&&typeof e.text==`string`&&typeof e.userName==`string`)}getUsers(){if(!this.awareness)return[];let e=[];return this.awareness.getStates().forEach((t,n)=>{t.user&&e.push({...t.user,clientId:n,currentFile:t.currentFile??null,isLocal:n===this.awareness.clientID})}),e}getConnectionState(){return this._connected?{status:`connected`,unreachable:!1}:this.provider?{status:`connecting`,unreachable:!1}:{status:`disconnected`,unreachable:!1}}disconnect(){this.provider&&(this.awareness?.off(`change`,this.handleAwarenessChange),this.chatMessages?.unobserve(this.handleChatMessagesChange),this.workspaceEvents?.unobserve(this.handleWorkspaceEventsChange)),this.provider?.disconnect(),this.provider?.destroy(),this.provider=null,this.awareness=null,this._connected=!1,this._didInitialSync=!1,this.seenWorkspaceEventIds.clear()}destroy(){this.disconnect(),this.ydoc?.destroy(),this.ydoc=null}_emitChange(){this.onChange?.(this.getUsers())}_emitChatChange(e={}){this.onChatChange?.(this.getMessages(),e)}_primeWorkspaceEventCache(){this.workspaceEvents.toArray().forEach(e=>{let t=ar(e);t&&this.seenWorkspaceEventIds.add(t.id)})}_emitWorkspaceEvents(){if(!this._didInitialSync){this._primeWorkspaceEventCache();return}this.workspaceEvents.toArray().forEach(e=>{let t=ar(e);!t||this.seenWorkspaceEventIds.has(t.id)||(this.seenWorkspaceEventIds.add(t.id),t.peerId!==this.localUser.peerId&&this.onWorkspaceEvent?.(t))})}},sr=class{getHashRoute(){return te()}navigateToFile(e,t){j(e,t)}navigateToGitDiff(e){C(e)}navigateToGitCommit(e){D(e)}navigateToGitHistory(){w()}navigateToGitFileHistory(e){A(e)}navigateToGitFilePreview(e){M(e)}},cr=class{constructor({NotificationImpl:e=globalThis.Notification,focusWindow:t=()=>globalThis.window?.focus?.()}={}){this.NotificationImpl=e,this.focusWindow=t}getPermission(){return typeof this.NotificationImpl==`function`?this.NotificationImpl.permission:`unsupported`}async requestPermission(){return typeof this.NotificationImpl==`function`?this.NotificationImpl.requestPermission():`unsupported`}createNotification({body:e,onClick:t,tag:n,title:r}){if(typeof this.NotificationImpl!=`function`)return null;let i=new this.NotificationImpl(r,{body:e,tag:n});return typeof t==`function`&&i.addEventListener(`click`,()=>{this.focusWindow(),t()}),i}},lr=class{constructor({chatNotificationsKey:e,lineWrappingKey:t,sidebarVisibleKey:n,userNameKey:r,storage:i=globalThis.localStorage}){this.chatNotificationsKey=e,this.lineWrappingKey=t,this.sidebarVisibleKey=n,this.storage=i,this.userNameKey=r}getUserName(){try{return this.storage.getItem(this.userNameKey)||``}catch{return``}}setUserName(e){try{this.storage.setItem(this.userNameKey,e)}catch{}}getLineWrappingEnabled(){try{return this.storage.getItem(this.lineWrappingKey)!==`false`}catch{return!0}}setLineWrappingEnabled(e){try{this.storage.setItem(this.lineWrappingKey,String(e))}catch{}}getSidebarVisible(){try{return this.storage.getItem(this.sidebarVisibleKey)}catch{return null}}setSidebarVisible(e){try{this.storage.setItem(this.sidebarVisibleKey,e?`true`:`false`)}catch{}}getChatNotificationsEnabled(){try{return this.storage.getItem(this.chatNotificationsKey)===`true`}catch{return!1}}setChatNotificationsEnabled(e){try{this.storage.setItem(this.chatNotificationsKey,String(e))}catch{}}},ur=6e4;function dr(e){return String(e?.build?.id??e?.buildId??``).trim()}var fr=class{constructor({currentBuildId:e=``,documentRef:t=globalThis.document??null,fetchImpl:n=globalThis.fetch?.bind(globalThis),intervalMs:r=ur,onUpdateAvailable:i=null,runtimeConfig:a={basePath:``},versionUrl:o=null,windowRef:s=globalThis.window??globalThis}={}){this.currentBuildId=String(e??``).trim(),this.documentRef=t,this.fetchImpl=n,this.intervalHandle=null,this.intervalMs=Math.max(5e3,Number(r)||ur),this.isChecking=!1,this.onUpdateAvailable=typeof i==`function`?i:null,this.runtimeConfig=a,this.updateDetected=!1,this.versionUrl=o||N(`/version.json`,a),this.windowRef=s,this.handleFocus=()=>{this.checkNow({force:!0})},this.handleVisibilityChange=()=>{this.documentRef?.hidden||this.checkNow({force:!0})}}start(){!this.fetchImpl||this.intervalHandle||(this.documentRef?.addEventListener?.(`visibilitychange`,this.handleVisibilityChange),this.windowRef?.addEventListener?.(`focus`,this.handleFocus),this.intervalHandle=this.windowRef?.setInterval?.(()=>{this.checkNow()},this.intervalMs)??null,this.checkNow({force:!0}))}stop(){this.intervalHandle&&=(this.windowRef?.clearInterval?.(this.intervalHandle),null),this.documentRef?.removeEventListener?.(`visibilitychange`,this.handleVisibilityChange),this.windowRef?.removeEventListener?.(`focus`,this.handleFocus)}async checkNow({force:e=!1}={}){if(!this.fetchImpl||this.isChecking||this.updateDetected||!e&&this.documentRef?.hidden)return!1;this.isChecking=!0;try{let e=await this.fetchImpl(this.versionUrl,{cache:`no-store`,headers:{Accept:`application/json`}});if(!e?.ok)return!1;let t=await e.json().catch(()=>null),n=dr(t);return n?this.currentBuildId?n===this.currentBuildId?!1:(this.updateDetected=!0,this.onUpdateAvailable?.(t),!0):(this.currentBuildId=n,!1):!1}catch{return!1}finally{this.isChecking=!1}}},pr=`collabmd-active-tab-lock`,mr=`collabmd-tab-id`,hr=`collabmd-tab-lock`,gr=4e3;function _r(){return Date.now()}function vr(){return globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`tab-${_r()}-${Math.random().toString(36).slice(2,10)}`}function yr(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}var br=class{constructor({heartbeatIntervalMs:e=gr,onBlocked:t,onActivated:n,onStolen:r}={}){this.heartbeatIntervalMs=e,this.staleAfterMs=e*3,this.onBlocked=t,this.onActivated=n,this.onStolen=r,this.tabId=this.getOrCreateTabId(),this.channel=null,this.heartbeatTimer=null,this.isOwner=!1,this.handleStorageEvent=this.handleStorageEvent.bind(this),this.handlePageHide=this.handlePageHide.bind(this)}initialize(){window.addEventListener(`storage`,this.handleStorageEvent),window.addEventListener(`pagehide`,this.handlePageHide),`BroadcastChannel`in globalThis&&(this.channel=new BroadcastChannel(hr),this.channel.addEventListener(`message`,e=>{this.handleChannelMessage(e.data)}))}destroy(){this.release(),window.removeEventListener(`storage`,this.handleStorageEvent),window.removeEventListener(`pagehide`,this.handlePageHide),this.channel?.close(),this.channel=null}tryActivate({takeover:e=!1}={}){let t=this.readLock();return this.isFreshLock(t)&&t.tabId!==this.tabId&&!e?(this.isOwner=!1,this.stopHeartbeat(),this.onBlocked?.({reason:`active-elsewhere`,ownerTabId:t.tabId}),!1):(this.writeLock(),this.startHeartbeat(),this.isOwner=!0,this.channel?.postMessage({type:`claimed`,takeover:e,tabId:this.tabId}),this.onActivated?.({takeover:e}),!0)}release(){this.readLock()?.tabId===this.tabId&&(localStorage.removeItem(pr),this.channel?.postMessage({type:`released`,tabId:this.tabId})),this.isOwner=!1,this.stopHeartbeat()}getOrCreateTabId(){try{let e=window.sessionStorage.getItem(mr);if(e)return e;let t=vr();return window.sessionStorage.setItem(mr,t),t}catch{return vr()}}readLock(){try{return yr(window.localStorage.getItem(pr))}catch{return null}}isFreshLock(e){return!!(e&&typeof e.tabId==`string`&&Number.isFinite(e.updatedAt)&&_r()-e.updatedAt<this.staleAfterMs)}writeLock(){try{window.localStorage.setItem(pr,JSON.stringify({tabId:this.tabId,updatedAt:_r()}))}catch{}}startHeartbeat(){this.stopHeartbeat(),this.writeLock(),this.heartbeatTimer=window.setInterval(()=>{if(!this.isOwner){this.stopHeartbeat();return}this.writeLock()},this.heartbeatIntervalMs)}stopHeartbeat(){this.heartbeatTimer&&=(window.clearInterval(this.heartbeatTimer),null)}handleStorageEvent(e){if(e.key!==pr)return;let t=yr(e.newValue);this.handleExternalLockChange(t)}handleChannelMessage(e){!e||typeof e!=`object`||e.tabId===this.tabId||e.type===`claimed`&&this.handleExternalLockChange(this.readLock())}handleExternalLockChange(e){this.isOwner&&this.isFreshLock(e)&&e.tabId!==this.tabId&&(this.isOwner=!1,this.stopHeartbeat(),this.onStolen?.({ownerTabId:e.tabId}))}handlePageHide(){this.release()}},xr=`__workspace__`;function Sr(e){return!e?.path||!e?.type?null:e.nodeType===`directory`||e.type===`directory`?{children:[],name:e.name,path:e.path,type:`directory`}:{name:e.name,path:e.path,type:e.type}}function Cr(e=[]){return e.sort((e,t)=>e.type===`directory`&&t.type!==`directory`?-1:e.type!==`directory`&&t.type===`directory`?1:e.name.localeCompare(t.name,void 0,{sensitivity:`base`})),e.forEach(e=>{Array.isArray(e.children)&&Cr(e.children)}),e}function wr(e){return e instanceof Map?e:new Map(Object.entries(e??{}))}function Tr(e=[],t=`asc`){let n=t===`desc`?-1:1;return[...e].sort((e,t)=>{let r=e.split(`/`).length-t.split(`/`).length;return r===0?e.localeCompare(t,void 0,{sensitivity:`base`})*n:r*n})}var Er=class{constructor(){this.entriesByPath=new Map,this.nodesByPath=new Map,this.nodeParentPathByPath=new Map,this.roots=[]}reset(e){return this.entriesByPath=wr(e),this.nodesByPath=new Map,this.nodeParentPathByPath=new Map,this.roots=[],this.entriesByPath.forEach(e=>{let t=Sr(e);t&&this.nodesByPath.set(e.path,t)}),Tr(Array.from(this.nodesByPath.keys())).forEach(e=>{let t=this.nodesByPath.get(e);t&&this.attachNode(e,t,this.entriesByPath.get(e)?.parentPath||``)}),Cr(this.roots),this.roots}getTree(){return this.roots}applyMapChanges(e,t){let n=[],r=[];return e.forEach((e,t)=>{e.action===`delete`?n.push(t):r.push(t)}),Tr(n,`desc`).forEach(e=>{this.removeEntry(e)}),Tr(r).forEach(e=>{this.upsertEntry(e,t.get(e))}),Cr(this.roots),this.roots}removeEntry(e){let t=this.nodesByPath.get(e);if(!t){this.entriesByPath.delete(e),this.nodeParentPathByPath.delete(e);return}this.detachNode(e,t),this.nodesByPath.delete(e),this.entriesByPath.delete(e),this.nodeParentPathByPath.delete(e)}upsertEntry(e,t){if(!t?.path||!t?.type){this.removeEntry(e);return}let n=Sr(t);if(!n){this.removeEntry(e);return}let r=this.nodesByPath.get(e);!r||r.type===`directory`!=(n.type===`directory`)?(r&&this.detachNode(e,r),r=n,this.nodesByPath.set(e,r)):(r.name=n.name,r.path=n.path,r.type=n.type,r.type===`directory`&&!Array.isArray(r.children)&&(r.children=[]),r.type!==`directory`&&Array.isArray(r.children)&&delete r.children),this.entriesByPath.set(e,t),this.attachNode(e,r,t.parentPath||``),r.type===`directory`&&this.rehomeChildren(e)}detachNode(e,t){let n=this.nodeParentPathByPath.get(e)||``,r=n?this.nodesByPath.get(n)?.children:this.roots,i=r?.indexOf?.(t)??-1;i>=0&&r.splice(i,1),this.nodeParentPathByPath.delete(e)}attachNode(e,t,n=``){let r=this.nodesByPath.get(n)?.type===`directory`?n:``,i=this.nodeParentPathByPath.get(e);if(i===r)return;i!==void 0&&this.detachNode(e,t);let a=r?this.nodesByPath.get(r)?.children:this.roots;a.includes(t)||a.push(t),this.nodeParentPathByPath.set(e,r)}rehomeChildren(e){this.entriesByPath.forEach((t,n)=>{if(t?.parentPath!==e)return;let r=this.nodesByPath.get(n);r&&this.attachNode(n,r,e)})}},Dr=class{constructor({onTreeChange:e=()=>{},onWorkspaceEvent:t=()=>{}}={}){this.onTreeChange=e,this.onWorkspaceEvent=t,this.ydoc=new ne,this.entries=this.ydoc.getMap(`entries`),this.events=this.ydoc.getArray(`events`),this.provider=null,this._didInitialSync=!1,this.seenEventIds=new Set,this.treeModel=new Er,this.handleEntriesChange=e=>{!this._didInitialSync||!e||this.onTreeChange(this.treeModel.applyMapChanges(e.changes.keys,this.entries),{changedPaths:Array.from(e.changes.keys.keys()),reset:!1})},this.handleEventsChange=()=>{if(!this._didInitialSync){this.primeEventCache();return}this.events.toArray().forEach(e=>{let t=ft(e);!t||this.seenEventIds.has(t.id)||(this.seenEventIds.add(t.id),this.onWorkspaceEvent(t))})}}connect(){this.provider||(this._didInitialSync=!1,this.provider=new P(E(),xr,this.ydoc,{disableBc:!0,maxBackoffTime:5e3}),re(this.provider),this.entries.observe(this.handleEntriesChange),this.events.observe(this.handleEventsChange),this.provider.on(`sync`,e=>{!e||this._didInitialSync||(this._didInitialSync=!0,this.primeEventCache(),this.onTreeChange(this.treeModel.reset(this.entries.toJSON()),{changedPaths:[],reset:!0}))}))}primeEventCache(){this.events.toArray().forEach(e=>{let t=ft(e);t&&this.seenEventIds.add(t.id)})}disconnect(){this.entries.unobserve(this.handleEntriesChange),this.events.unobserve(this.handleEventsChange),this.provider?.disconnect(),this.provider?.destroy(),this.provider=null,this._didInitialSync=!1,this.seenEventIds.clear(),this.treeModel.reset(new Map)}destroy(){this.disconnect(),this.ydoc.destroy()}},Or=class{constructor({documentRef:e=document,headerPanelElement:t=null,inlinePanelElement:n=null,onFileSelect:r,panelElement:i}){this.documentRef=e,this.headerPanel=t,this.panelRoot=i,this.inlinePanel=n,this.onFileSelect=r,this._expanded=!1,this._currentFile=null,this._displayMode=`dock`,this._fetchController=null,this._backlinks=[],this._pendingOutsidePointer=null;let a=this.panelRoot?.querySelector(`[data-backlinks-variant="dock"]`)??this.panelRoot;this.panels=[this._createPanelRef(a,this.panelRoot),this._createPanelRef(this.headerPanel,this.headerPanel),this._createPanelRef(this.inlinePanel,this.inlinePanel)].filter(Boolean),this.handleDocumentPointerDown=e=>{if(!this._expanded)return;let t=e?.target;if(t&&this.panels.some(({panel:e})=>e?.contains?.(t))){this._pendingOutsidePointer=null;return}e?.pointerType===`mouse`&&e?.button!==0||(this._pendingOutsidePointer={pointerId:e?.pointerId??`mouse`,startX:Number(e?.clientX??0),startY:Number(e?.clientY??0)})},this.handleDocumentPointerMove=e=>{if(!this._pendingOutsidePointer)return;let t=Math.abs(Number(e?.clientX??0)-this._pendingOutsidePointer.startX),n=Math.abs(Number(e?.clientY??0)-this._pendingOutsidePointer.startY);(t>10||n>10)&&(this._pendingOutsidePointer=null)},this.handleDocumentPointerEnd=e=>{if(!this._expanded||!this._pendingOutsidePointer)return;let t=e?.target;if(t&&this.panels.some(({panel:e})=>e?.contains?.(t))){this._pendingOutsidePointer=null;return}this._pendingOutsidePointer=null,this.close()},this.handleDocumentKeyDown=e=>{!this._expanded||e?.key!==`Escape`||(e.preventDefault?.(),this.close())},this.bindEvents()}bindEvents(){this.panels.forEach(e=>{e.header?.addEventListener(`click`,()=>{this._backlinks.length!==0&&(this._expanded=!this._expanded,this._pendingOutsidePointer=null,this._applyExpandState())})}),this.documentRef?.addEventListener?.(`pointerdown`,this.handleDocumentPointerDown),this.documentRef?.addEventListener?.(`pointermove`,this.handleDocumentPointerMove,{passive:!0}),this.documentRef?.addEventListener?.(`pointerup`,this.handleDocumentPointerEnd),this.documentRef?.addEventListener?.(`pointercancel`,this.handleDocumentPointerEnd),this.documentRef?.addEventListener?.(`keydown`,this.handleDocumentKeyDown)}async load(e){let t=e!==this._currentFile;if(this._currentFile=e,t&&(this._expanded=!1),!e){this._backlinks=[],this._render();return}this._fetchController?.abort(),this._fetchController=new AbortController;try{let t=await(await fetch(O(`/backlinks?file=${encodeURIComponent(e)}`),{signal:this._fetchController.signal})).json();if(this._currentFile!==e)return;this._backlinks=t.backlinks??[]}catch(e){if(e.name===`AbortError`)return;console.warn(`[backlinks] Failed to load:`,e.message),this._backlinks=[]}this._render()}setDisplayMode(e=`dock`){let t=e===`header`?`header`:`dock`;this._displayMode!==t&&(this._displayMode=t,this._expanded=!1,this._pendingOutsidePointer=null,this._render())}clear(){this._currentFile=null,this._backlinks=[],this._expanded=!1,this._render()}close(){this._expanded&&(this._expanded=!1,this._pendingOutsidePointer=null,this._applyExpandState())}_createPanelRef(e,t=e){return e?{panel:e,header:e.querySelector(`.backlinks-header`),toggle:e.querySelector(`.backlinks-toggle`),countBadge:e.querySelector(`.backlinks-count`),body:e.querySelector(`.backlinks-body`),list:e.querySelector(`.backlinks-list`),root:t}:null}_render(){let e=this._backlinks.length,t=e===1?`Linked Mention`:`Linked Mentions`,n=!!this._currentFile&&e>0;n||(this._expanded=!1),this.panels.forEach(r=>{let i=n&&this._shouldShowPanel(r);r.root?.classList?.toggle?.(`hidden`,!i),r.countBadge.textContent=n?String(e):``,r.toggle.textContent=t,r.header?.classList.toggle(`backlinks-header-empty`,!i),i?this._renderList(r.list):r.list.innerHTML=``}),this._applyExpandState()}_shouldShowPanel(e){let t=e.panel?.getAttribute?.(`data-backlinks-variant`)??``;return t===`header`?this._displayMode===`header`:t===`dock`?this._displayMode===`dock`:!0}_renderList(e){if(!e)return;e.innerHTML=``;let t=this.documentRef?.createDocumentFragment?.(),n=t??e;this._backlinks.forEach(e=>{n.appendChild(this._createBacklinkItem(e))}),t&&e.appendChild(t)}_createBacklinkItem(e){let t=c(e.file.split(`/`).pop()),n=e.file.includes(`/`)?e.file.substring(0,e.file.lastIndexOf(`/`)):``,r=this.documentRef.createElement(`button`);r.type=`button`,r.className=`backlink-item`,r.addEventListener(`click`,()=>{this.close(),this.onFileSelect?.(e.file)});let i=this.documentRef.createElement(`div`);if(i.className=`backlink-file-name`,i.innerHTML=`
143
144
  <svg class="backlink-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
144
145
  <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/>
145
146
  <polyline points="14 2 14 8 20 8"/>
146
147
  </svg>
147
- <span>${h(t)}</span>
148
- ${n?`<span class="backlink-dir">${h(n)}</span>`:``}
149
- `,r.appendChild(i),e.contexts.slice(0,3).forEach(e=>{let t=this.documentRef.createElement(`div`);t.className=`backlink-context`,t.textContent=e,r.appendChild(t)}),e.contexts.length>3){let t=this.documentRef.createElement(`div`);t.className=`backlink-context backlink-more`,t.textContent=`+${e.contexts.length-3} more`,r.appendChild(t)}return r}_applyExpandState(){let e=this._expanded&&this._backlinks.length>0;this.panels.forEach(t=>{t.panel.classList.toggle(`expanded`,e),t.header?.setAttribute(`aria-expanded`,String(e)),t.header?.setAttribute(`aria-disabled`,String(this._backlinks.length===0)),t.body?.setAttribute(`aria-hidden`,String(!e)),t.body?.toggleAttribute(`inert`,!e)})}};function Or(e,t,n,r,i,a){return e?.(t,n,r,i,a)??a.renderToken(t,n,r)}function kr(e=``){return`<p>${h(String(e??``)).replace(/\n/g,`<br>`)}</p>`}function Ar(){let e=t({breaks:!0,highlight(e,t){try{return t&&n.getLanguage(t)?n.highlight(e,{ignoreIllegals:!0,language:t}).value:n.highlightAuto(e).value}catch{return h(e)}},html:!1,linkify:!0,typographer:!0}),r=e.renderer.rules.link_open,i=e.renderer.rules.table_open,a=e.renderer.rules.table_close;return e.renderer.rules.link_open=(e,t,n,i,a)=>(e[t].attrSet(`target`,`_blank`),e[t].attrSet(`rel`,`noopener noreferrer`),Or(r,e,t,n,i,a)),e.renderer.rules.table_open=(e,t,n,r,a)=>`<div class="comment-markdown-table">${Or(i,e,t,n,r,a)}`,e.renderer.rules.table_close=(e,t,n,r,i)=>`${Or(a,e,t,n,r,i)}</div>`,e}var jr=Ar();function Mr(e=``){let t=String(e??``);try{return jr.render(t)}catch{return kr(t)}}var Nr=Object.freeze([`👍`,`❤️`,`🎉`,`👀`,`🚀`]),Pr=Object.freeze([`😂`,`🔥`,`✅`,`🙏`,`💡`,`🤔`,`👏`,`😄`,`🎯`,`🙌`]);function U(e,t,n){return Math.min(Math.max(e,t),n)}function Fr(e=[]){return[...e].sort((e,t)=>(e.anchor?.startLine??0)-(t.anchor?.startLine??0)||e.createdAt-t.createdAt)}function Ir(e){return e?.anchorKind||e?.kind||`line`}function Lr(e){return Ir(e)===`text`&&Number.isFinite(e?.startIndex)&&Number.isFinite(e?.endIndex)&&e.endIndex>e.startIndex}function Rr(e,t){return e===t?!0:!e||!t?!1:Ir(e)===Ir(t)&&(e.startIndex??null)===(t.startIndex??null)&&(e.endIndex??null)===(t.endIndex??null)&&(e.startLine??null)===(t.startLine??null)&&(e.endLine??null)===(t.endLine??null)&&(e.anchorQuote??e.quote??``)===(t.anchorQuote??t.quote??``)}function zr(e){return e?((e.kind||e.anchorKind)===`text`&&e.quote,e.startLine===e.endLine?`Line ${e.startLine}`:`Lines ${e.startLine}-${e.endLine}`):`No source anchor`}function Br(e={}){return[e.kind||e.anchorKind||`line`,e.startLine??0,e.endLine??0,e.quote||``].join(`::`)}function Vr(e){return e&&!e.querySelector(`[data-source-line]`)}function Hr(e){let t=Number.parseInt(e||``,10);return Number.isFinite(t)?t:null}function Ur(e=[]){return e.reduce((e,t)=>e?(t?.createdAt??0)>=(e?.createdAt??0)?t:e:t,null)}function Wr(e){return e?.threads?.reduce((e,t)=>{let n=Ur(t?.messages??[]);return n&&(n.createdAt??0)>=(e?.createdAt??0)?n:e},null)}function Gr(e,t=`comment-markdown`){let n=document.createElement(`div`);return n.className=t,n.innerHTML=Mr(e),n}function Kr(e,t){return!!(t&&e?.users?.some(e=>e?.userId===t))}function qr(e){return String(Array.isArray(e?.users)?e.users.length:0)}function Jr(e,t,n){return e?.threadId===t&&e?.messageId===n}function Yr(e){let t=e?.querySelector?.(`.comment-reaction-picker`),n=t?.closest?.(`.comment-reaction-picker-wrap`),r=e?.querySelector?.(`.comment-card-scroll`);return!(t instanceof HTMLElement)||!(n instanceof HTMLElement)||!(r instanceof HTMLElement)?null:{picker:t,scroll:r,wrap:n}}function Xr(e,t){let n=Hr(e?.getAttribute?.(`data-source-line`)),r=Hr(e?.getAttribute?.(`data-source-line-end`))??n;return!n||!r||!t?!1:t.startLine<=r&&t.endLine>=n}function Zr(e){let t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),n=``,r=[],i=!0;for(;t.nextNode();){let e=t.currentNode,a=e.textContent||``;for(let t=0;t<a.length;t+=1){let o=a[t];if(/\s/.test(o)){if(i)continue;n+=` `,r.push({node:e,offset:t}),i=!0;continue}n+=o,r.push({node:e,offset:t}),i=!1}}for(;n.endsWith(` `);)n=n.slice(0,-1),r.pop();return{map:r,normalized:n}}function Qr(e,t){let n=he(t);if(!e||!n)return null;let r=Zr(e);if(!r.normalized)return null;let i=r.normalized.indexOf(n);if(i<0||r.normalized.indexOf(n,i+1)>=0)return null;let a=r.map[i],o=r.map[i+n.length-1];if(!a||!o)return null;let s=document.createRange();return s.setStart(a.node,a.offset),s.setEnd(o.node,o.offset+1),s}function $r(e,t){return{bottom:e.bottom-t.top,height:e.height,left:e.left-t.left,right:e.right-t.left,top:e.top-t.top,width:e.width}}function ei(e=[]){if(!Array.isArray(e)||e.length===0)return null;let t=Math.min(...e.map(e=>e.left)),n=Math.min(...e.map(e=>e.top)),r=Math.max(...e.map(e=>e.right)),i=Math.max(...e.map(e=>e.bottom));return{bottom:i,height:i-n,left:t,right:r,top:n,width:r-t}}function ti(e,t,n){return n?e>=n.left&&e<=n.right&&t>=n.top&&t<=n.bottom:!1}function ni(e=[]){return[...new Set(e.filter(Boolean))].sort()}function ri(e=[]){return ni(e).join(` `)}function ii(e){let t=document.createDocumentFragment(),n=document.createElement(`span`);if(n.className=`comment-marker-icon`,n.setAttribute(`aria-hidden`,`true`),n.innerHTML=`
148
+ <span>${b(t)}</span>
149
+ ${n?`<span class="backlink-dir">${b(n)}</span>`:``}
150
+ `,r.appendChild(i),e.contexts.slice(0,3).forEach(e=>{let t=this.documentRef.createElement(`div`);t.className=`backlink-context`,t.textContent=e,r.appendChild(t)}),e.contexts.length>3){let t=this.documentRef.createElement(`div`);t.className=`backlink-context backlink-more`,t.textContent=`+${e.contexts.length-3} more`,r.appendChild(t)}return r}_applyExpandState(){this.panels.forEach(e=>{let t=this._expanded&&this._backlinks.length>0&&this._shouldShowPanel(e);e.panel.classList.toggle(`expanded`,t),e.header?.setAttribute(`aria-expanded`,String(t)),e.header?.setAttribute(`aria-disabled`,String(this._backlinks.length===0)),e.body?.setAttribute(`aria-hidden`,String(!t)),e.body?.toggleAttribute(`inert`,!t)})}};function kr(){return`base-${Math.random().toString(36).slice(2,10)}`}function Ar(e=``){return/^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/iu.test(String(e??``).trim())}function jr(e=``){return/^https?:\/\/.+\.(?:png|jpe?g|webp|gif|svg)(?:[?#].*)?$/iu.test(String(e??``).trim())}function Mr(e,t,n){let r=e.image||t.find(e=>[`cover`,`image`].includes(String(e.id??``).toLowerCase()))?.id||null;return r?n.cells[r]??null:null}function W(e){return String(e?.text??``)}function Nr(e=``){return O(`/attachment?path=${encodeURIComponent(e)}`)}function Pr(e={}){if(e?.type===`image`&&e.path)return Nr(e.path);if(e?.type===`link`){if(e.external&&jr(e.url))return e.url;if(e.path&&o(e.path))return Nr(e.path)}let t=W(e);return jr(t)?t:o(t)?Nr(t):``}function Fr(e={}){let t=e?.type||`string`;if(t===`empty`)return`<span class="bases-value bases-value-empty">—</span>`;if(t===`boolean`)return`<span class="bases-value bases-value-boolean">${e.value?`True`:`False`}</span>`;if(t===`image`&&e.path)return`<img class="bases-inline-image" src="${b(Nr(e.path))}" alt="${b(W(e))}">`;if(t===`list`)return`<span class="bases-value-list">${(e.items??[]).map(e=>`<span class="bases-value-pill">${Fr(e)}</span>`).join(``)}</span>`;if(t===`link`){if(e.external&&e.url)return`<a class="bases-link" href="${b(e.url)}" target="_blank" rel="noopener noreferrer">${b(W(e))}</a>`;if(e.path)return`<button type="button" class="bases-link bases-link-button" data-base-open-file="${b(e.path)}">${b(W(e))}</button>`}return t===`file`&&e.path?`<button type="button" class="bases-link bases-link-button" data-base-open-file="${b(e.path)}">${b(W(e))}</button>`:`<span class="bases-value">${b(W(e))}</span>`}function Ir(e,t){let n=t?.cells?.[e.id]??null;return t?.path&&n&&n.type!==`empty`&&(e.id===`file.name`||e.id===`file.basename`)?`<button type="button" class="bases-link bases-link-button" data-base-open-file="${b(t.path)}">${b(W(n))}</button>`:Fr(n)}function Lr(e=[]){return!Array.isArray(e)||e.length===0?``:`<div class="bases-summaries">${e.map(e=>`<div class="bases-summary"><span class="bases-summary-label">${b(e.label)}</span><span class="bases-summary-value">${b(W(e.value))}</span></div>`).join(``)}</div>`}function Rr(e,t){return t.map(t=>`<section class="bases-group"><header class="bases-group-header"><h3>${b(t.label)}</h3>${Lr(t.summaries)}</header><div class="bases-table-shell"><table class="bases-table"><thead><tr>${e.map(e=>`<th>${b(e.label)}</th>`).join(``)}</tr></thead><tbody>${(t.rows??[]).map(t=>`<tr>${e.map(e=>`<td>${Ir(e,t)}</td>`).join(``)}</tr>`).join(``)}</tbody></table></div></section>`).join(``)}function zr(e,t){return t.map(t=>`<section class="bases-group"><header class="bases-group-header"><h3>${b(t.label)}</h3>${Lr(t.summaries)}</header><ul class="bases-list">${(t.rows??[]).map(t=>`<li class="bases-list-item">${e.map(e=>{let n=t.cells[e.id];return!n||n.type===`empty`?``:`<span class="bases-list-field"><strong>${b(e.label)}:</strong> ${Ir(e,t)}</span>`}).join(``)}</li>`).join(``)}</ul></section>`).join(``)}function Br(e,t,n){return t.map(t=>`<section class="bases-group"><header class="bases-group-header"><h3>${b(t.label)}</h3>${Lr(t.summaries)}</header><div class="bases-cards">${(t.rows??[]).map(t=>{let r=Mr(n,e,t),i=W(r),a=``;if(Ar(i))a=`<div class="bases-card-media bases-card-media-color" style="--bases-card-swatch:${b(i)}"></div>`;else{let e=Pr(r);e&&(a=`<img class="bases-card-media" src="${b(e)}" alt="${b(i)}">`)}return`<article class="bases-card">${a}<div class="bases-card-body">${e.map(e=>{let n=t.cells[e.id];return!n||n.type===`empty`?``:`<div class="bases-card-field"><div class="bases-card-label">${b(e.label)}</div><div class="bases-card-value">${Ir(e,t)}</div></div>`}).join(``)}</div></article>`}).join(``)}</div></section>`).join(``)}function Vr(e){if(!e.view.supported)return`<div class="bases-unsupported">CollabMD parsed this view but does not render the <code>${b(e.view.type)}</code> layout yet.</div>`;switch(e.view.type){case`cards`:return Br(e.columns,e.groups,e.view);case`list`:return zr(e.columns,e.groups);default:return Rr(e.columns,e.groups)}}function Hr(e){return(e.views??[]).map(t=>`<button type="button" class="bases-view-tab${t.id===e.view.id?` is-active`:``}" data-base-view="${b(t.id)}">${b(t.name)}</button>`).join(``)}function Ur(e,t){return`
151
+ <section class="bases-shell" data-base-shell-key="${b(t.key)}">
152
+ <header class="bases-toolbar">
153
+ <div class="bases-toolbar-main">
154
+ <div class="bases-tabs" data-base-tabs>
155
+ ${Hr(e)}
156
+ </div>
157
+ <div class="bases-meta" data-base-meta>${b(String(e.totalRows??0))} results</div>
158
+ </div>
159
+ <div class="bases-toolbar-actions">
160
+ <input class="bases-search-input" type="search" value="${b(t.search)}" placeholder="Search this base">
161
+ <button type="button" class="bases-export-btn">Export CSV</button>
162
+ </div>
163
+ </header>
164
+ <div data-base-summary-slot>${Lr(e.summaries)}</div>
165
+ <div class="bases-content" data-base-content>${Vr(e)}</div>
166
+ </section>
167
+ `}function Wr(e){return e?.placeholder?.querySelector?e.placeholder.querySelector(`[data-base-shell-key="${e.key}"]`)??e.placeholder.querySelector(`.bases-shell`):null}function Gr(e,t){let n=Wr(e);if(!n?.querySelector){e.placeholder.innerHTML=Ur(t,e);return}let r=n.querySelector(`[data-base-tabs]`);r&&(r.innerHTML=Hr(t));let i=n.querySelector(`[data-base-meta]`);i&&(i.textContent=`${String(t.totalRows??0)} results`);let a=n.querySelector(`[data-base-summary-slot]`);a&&(a.innerHTML=Lr(t.summaries));let o=n.querySelector(`[data-base-content]`);o&&(o.innerHTML=Vr(t));let s=n.querySelector(`.bases-search-input`);s&&s.value!==e.search&&(s.value=e.search)}function Kr(e,t=`base.csv`){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(n),0)}function qr(e=``){let t=e.match(/filename\*=UTF-8''([^;]+)/iu);return t?decodeURIComponent(t[1]):e.match(/filename="([^"]+)"/iu)?.[1]||`base.csv`}var Jr=class{constructor({getActiveFilePath:e=()=>``,onOpenFile:t,previewElement:n,toastController:r,vaultApiClient:i}){this.getActiveFilePath=e,this.onOpenFile=t,this.previewElement=n,this.toastController=r,this.vaultApiClient=i,this.entries=new Map,this.searchTimers=new Map,this.handleClick=e=>{let t=e.target.closest(`[data-base-open-file]`);if(t){e.preventDefault(),this.onOpenFile?.(t.dataset.baseOpenFile||``);return}let n=e.target.closest(`.bases-view-tab`);if(n){let e=n.closest(`[data-base-shell-key]`),t=e?this.entries.get(e.dataset.baseShellKey||``):null;if(!t)return;t.payload.view=n.dataset.baseView||``,this.renderEntry(t);return}let r=e.target.closest(`.bases-export-btn`);if(r){let e=r.closest(`[data-base-shell-key]`),t=e?this.entries.get(e.dataset.baseShellKey||``):null;if(!t)return;this.exportEntry(t)}},this.handleInput=e=>{let t=e.target.closest(`.bases-search-input`);if(!t)return;let n=t.closest(`[data-base-shell-key]`),r=n?this.entries.get(n.dataset.baseShellKey||``):null;r&&(r.search=t.value||``,clearTimeout(this.searchTimers.get(r.key)),this.searchTimers.set(r.key,setTimeout(()=>{r.payload.search=r.search,this.renderEntry(r)},180)))},this.previewElement?.addEventListener(`click`,this.handleClick),this.previewElement?.addEventListener(`input`,this.handleInput)}destroy(){this.previewElement?.removeEventListener(`click`,this.handleClick),this.previewElement?.removeEventListener(`input`,this.handleInput),this.searchTimers.forEach(e=>clearTimeout(e)),this.searchTimers.clear(),this.entries.clear()}reconcileEmbeds(e=this.previewElement){e&&Array.from(e.querySelectorAll(`.bases-embed-placeholder[data-base-key]`)).forEach(e=>{let t=e.dataset.baseKey||kr(),n=this.entries.get(t),r={path:e.dataset.basePath||``,search:``,source:e.dataset.baseSource||null,sourcePath:e.dataset.baseSourcePath||``,view:e.dataset.baseView||``},i=n??{key:t,payload:r,placeholder:e,requestVersion:0,result:null,search:``};i.payload=r,i.placeholder=e,this.entries.set(t,i),this.renderEntry(i)})}async renderStandalone({filePath:e,renderHost:t,source:n=null}){let r=`standalone:${e}`,i=this.entries.get(r)??{key:r,payload:{path:e,search:``,source:n,sourcePath:e,view:``},placeholder:t,requestVersion:0,result:null,search:``};i.placeholder=t,i.payload.path=e,i.payload.source=typeof n==`string`?n:null,i.payload.sourcePath=e,this.entries.set(r,i),await this.renderEntry(i)}async renderEntry(e){if(!e?.placeholder?.isConnected)return;let t=(e.requestVersion??0)+1;e.requestVersion=t;let n=!!Wr(e);n||(e.placeholder.innerHTML=`<div class="preview-shell">Loading base…</div>`);try{let n=await this.vaultApiClient.queryBase({activeFilePath:this.getActiveFilePath?.()??``,...e.payload});if(t!==e.requestVersion||!e?.placeholder?.isConnected)return;e.result=n.result,Gr(e,e.result)}catch(r){if(t!==e.requestVersion||!e?.placeholder?.isConnected)return;if(n){let t=Wr(e)?.querySelector?.(`[data-base-content]`)??null;if(t){t.innerHTML=`<div class="preview-shell">Failed to load base: ${b(r.message||`Unknown error`)}</div>`;return}}e.placeholder.innerHTML=`<div class="preview-shell">Failed to load base: ${b(r.message||`Unknown error`)}</div>`}}async exportEntry(e){try{let t=await this.vaultApiClient.exportBaseCsv({activeFilePath:this.getActiveFilePath?.()??``,...e.payload});Kr(t.blob,qr(t.contentDisposition))}catch(e){this.toastController?.show?.(e.message||`Failed to export base CSV`)}}};function Yr(e,t,n,r,i,a){return e?.(t,n,r,i,a)??a.renderToken(t,n,r)}function Xr(e=``){return`<p>${b(String(e??``)).replace(/\n/g,`<br>`)}</p>`}function Zr(){let e=t({breaks:!0,highlight(e,t){try{return t&&n.getLanguage(t)?n.highlight(e,{ignoreIllegals:!0,language:t}).value:n.highlightAuto(e).value}catch{return b(e)}},html:!1,linkify:!0,typographer:!0}),r=e.renderer.rules.link_open,i=e.renderer.rules.table_open,a=e.renderer.rules.table_close;return e.renderer.rules.link_open=(e,t,n,i,a)=>(e[t].attrSet(`target`,`_blank`),e[t].attrSet(`rel`,`noopener noreferrer`),Yr(r,e,t,n,i,a)),e.renderer.rules.table_open=(e,t,n,r,a)=>`<div class="comment-markdown-table">${Yr(i,e,t,n,r,a)}`,e.renderer.rules.table_close=(e,t,n,r,i)=>`${Yr(a,e,t,n,r,i)}</div>`,e}var Qr=Zr();function $r(e=``){let t=String(e??``);try{return Qr.render(t)}catch{return Xr(t)}}var ei=Object.freeze([`👍`,`❤️`,`🎉`,`👀`,`🚀`]),ti=Object.freeze([`😂`,`🔥`,`✅`,`🙏`,`💡`,`🤔`,`👏`,`😄`,`🎯`,`🙌`]);function G(e,t,n){return Math.min(Math.max(e,t),n)}function ni(e=[]){return[...e].sort((e,t)=>(e.anchor?.startLine??0)-(t.anchor?.startLine??0)||e.createdAt-t.createdAt)}function ri(e){return e?.anchorKind||e?.kind||`line`}function ii(e){return ri(e)===`text`&&Number.isFinite(e?.startIndex)&&Number.isFinite(e?.endIndex)&&e.endIndex>e.startIndex}function ai(e,t){return e===t?!0:!e||!t?!1:ri(e)===ri(t)&&(e.startIndex??null)===(t.startIndex??null)&&(e.endIndex??null)===(t.endIndex??null)&&(e.startLine??null)===(t.startLine??null)&&(e.endLine??null)===(t.endLine??null)&&(e.anchorQuote??e.quote??``)===(t.anchorQuote??t.quote??``)}function oi(e){return e?((e.kind||e.anchorKind)===`text`&&e.quote,e.startLine===e.endLine?`Line ${e.startLine}`:`Lines ${e.startLine}-${e.endLine}`):`No source anchor`}function si(e={}){return[e.kind||e.anchorKind||`line`,e.startLine??0,e.endLine??0,e.quote||``].join(`::`)}function ci(e){return e&&!e.querySelector(`[data-source-line]`)}function li(e){let t=Number.parseInt(e||``,10);return Number.isFinite(t)?t:null}function ui(e=[]){return e.reduce((e,t)=>e?(t?.createdAt??0)>=(e?.createdAt??0)?t:e:t,null)}function di(e){return e?.threads?.reduce((e,t)=>{let n=ui(t?.messages??[]);return n&&(n.createdAt??0)>=(e?.createdAt??0)?n:e},null)}function fi(e,t=`comment-markdown`){let n=document.createElement(`div`);return n.className=t,n.innerHTML=$r(e),n}function pi(e,t){return!!(t&&e?.users?.some(e=>e?.userId===t))}function mi(e){return String(Array.isArray(e?.users)?e.users.length:0)}function hi(e,t,n){return e?.threadId===t&&e?.messageId===n}function gi(e){let t=e?.querySelector?.(`.comment-reaction-picker`),n=t?.closest?.(`.comment-reaction-picker-wrap`),r=e?.querySelector?.(`.comment-card-scroll`);return!(t instanceof HTMLElement)||!(n instanceof HTMLElement)||!(r instanceof HTMLElement)?null:{picker:t,scroll:r,wrap:n}}function _i(e,t){let n=li(e?.getAttribute?.(`data-source-line`)),r=li(e?.getAttribute?.(`data-source-line-end`))??n;return!n||!r||!t?!1:t.startLine<=r&&t.endLine>=n}function vi(e){let t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),n=``,r=[],i=!0;for(;t.nextNode();){let e=t.currentNode,a=e.textContent||``;for(let t=0;t<a.length;t+=1){let o=a[t];if(/\s/.test(o)){if(i)continue;n+=` `,r.push({node:e,offset:t}),i=!0;continue}n+=o,r.push({node:e,offset:t}),i=!1}}for(;n.endsWith(` `);)n=n.slice(0,-1),r.pop();return{map:r,normalized:n}}function yi(e,t){let n=ge(t);if(!e||!n)return null;let r=vi(e);if(!r.normalized)return null;let i=r.normalized.indexOf(n);if(i<0||r.normalized.indexOf(n,i+1)>=0)return null;let a=r.map[i],o=r.map[i+n.length-1];if(!a||!o)return null;let s=document.createRange();return s.setStart(a.node,a.offset),s.setEnd(o.node,o.offset+1),s}function bi(e,t){return{bottom:e.bottom-t.top,height:e.height,left:e.left-t.left,right:e.right-t.left,top:e.top-t.top,width:e.width}}function xi(e=[]){if(!Array.isArray(e)||e.length===0)return null;let t=Math.min(...e.map(e=>e.left)),n=Math.min(...e.map(e=>e.top)),r=Math.max(...e.map(e=>e.right)),i=Math.max(...e.map(e=>e.bottom));return{bottom:i,height:i-n,left:t,right:r,top:n,width:r-t}}function Si(e,t,n){return n?e>=n.left&&e<=n.right&&t>=n.top&&t<=n.bottom:!1}function Ci(e=[]){return[...new Set(e.filter(Boolean))].sort()}function wi(e=[]){return Ci(e).join(` `)}function Ti(e){let t=document.createDocumentFragment(),n=document.createElement(`span`);if(n.className=`comment-marker-icon`,n.setAttribute(`aria-hidden`,`true`),n.innerHTML=`
150
168
  <svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
151
169
  <path d="M3 4.75A1.75 1.75 0 0 1 4.75 3h6.5A1.75 1.75 0 0 1 13 4.75v4.5A1.75 1.75 0 0 1 11.25 11H8.9L6.5 13v-2H4.75A1.75 1.75 0 0 1 3 9.25v-4.5Z" stroke="currentColor" stroke-width="1.35" stroke-linejoin="round"/>
152
170
  </svg>
153
- `,t.appendChild(n),e>1){let n=document.createElement(`span`);n.className=`comment-marker-count`,n.textContent=String(e),t.appendChild(n)}return t}function W(...e){let t=[];for(let n of e)if(n){if(Array.isArray(n)){let e=W(...n);e&&t.push(e);continue}if(typeof n==`object`){Object.entries(n).forEach(([e,n])=>{n&&t.push(e)});continue}t.push(String(n))}return t.join(` `)}function G(e={}){let{variant:t=`secondary`,size:n=`md`,toggle:r=!1,toolbar:i=!1,action:a=!1,wide:o=!1,surface:s=!1,pill:c=!1,hidden:l=!1,active:u=!1,extra:d=[]}=e;return W(`ui-button`,t&&`ui-button--${t}`,n!==`md`&&`ui-button--${n}`,{"ui-button--toggle":r,"ui-button--toolbar":i,"ui-button--action":a,"ui-button--wide":o,"ui-button--surface":s,"ui-button--pill":c,active:u,hidden:l},d)}function ai(e={}){let{toolbar:t=!1,action:n=!1,surface:r=!1,hidden:i=!1,extra:a=[]}=e;return W(`ui-icon-button`,{"ui-icon-button--toolbar":t,"ui-icon-button--action":n,"ui-icon-button--surface":r,hidden:i},a)}function K(e={}){return W(`ui-input`,e.extra??[])}function oi(){if(this.cardRoot?.isConnected&&this.cardRoot.parentElement===document.body)return this.cardRoot;let e=document.createElement(`div`);return e.className=`comment-card-root hidden`,document.body.appendChild(e),this.cardRoot=e,e}function si(e=`editor`,t=null){let n=this.session?.getCurrentSelectionCommentAnchor?.();n&&(this.selectionAnchor=n,this.reactionPicker=null,this.activeCard={anchor:n,mode:`create`,origin:e===`editor`&&t?`editor-chip`:e,replyThreadId:null,sourceRect:t??(e===`toolbar`?this.commentSelectionButton?.getBoundingClientRect?.():this.session?.getCommentAnchorClientRect?.(n))},this.render())}function ci(e,{anchor:t,origin:n,sourceRect:r}){this.reactionPicker=null,this.activeCard={anchor:t,groupKey:e.key,mode:`group`,origin:n,replyThreadId:null,sourceRect:r},this.renderDrawer(),this.renderCard()}function li(){this.activeCard=null,this.pendingCardFocusElement=null,this.reactionPicker=null,this.renderCard(),this.scheduleLayoutRefresh()}function ui(){return this.activeCard?this.activeCard.origin===`editor`?this.session?.getCommentAnchorClientRect?.(this.activeCard.anchor)??this.activeCard.sourceRect:this.activeCard.origin===`editor-chip`?this.activeCard.sourceRect:this.activeCard.origin===`preview`?this.resolvePreviewTarget(this.activeCard.anchor)?.bubbleRect??this.activeCard.sourceRect:this.activeCard.origin===`toolbar`?this.commentSelectionButton?.getBoundingClientRect?.()??this.activeCard.sourceRect:this.activeCard.sourceRect:null}function di(){let e=this.ensureCardRoot();if(e.replaceChildren(),e.classList.toggle(`hidden`,!this.activeCard),!this.activeCard){this.pendingCardFocusElement=null,e.style.visibility=``;return}this.pendingCardFocusElement=null;let t=document.createElement(`section`);t.className=`comment-card`,t.addEventListener(`click`,e=>{!this.reactionPicker||e.target?.closest?.(`.comment-reaction-picker-wrap`)||(this.reactionPicker=null,requestAnimationFrame(()=>{this.activeCard&&this.renderCard()}))});let n=document.createElement(`div`);n.className=`ui-record-header comment-card-header`;let r=document.createElement(`div`);r.className=`comment-card-title-wrap`;let i=document.createElement(`h3`);i.className=`comment-card-title`,i.textContent=this.activeCard.mode===`create`?`New comment`:`Comment threads`;let a=document.createElement(`p`);a.className=`comment-card-meta`,a.textContent=zr(this.activeCard.anchor),r.append(i,a);let o=document.createElement(`button`);o.type=`button`,o.className=G({variant:`ghost`,size:`compact`,pill:!0,extra:[`ui-action-pill`,`comment-card-close`]}),o.setAttribute(`aria-label`,`Close comments`),o.textContent=`Close`,o.addEventListener(`click`,()=>this.closeCard()),n.append(r,o),t.appendChild(n);let s=document.createElement(`div`);if(s.className=`comment-card-scroll`,this.activeCard.anchor?.quote){let e=document.createElement(`p`);e.className=`comment-card-quote`,e.textContent=this.activeCard.anchor.quote,s.appendChild(e)}if(this.activeCard.mode===`create`)s.appendChild(this.createComposer());else{let e=this.getThreadGroups().find(e=>e.key===this.activeCard.groupKey);if(!e){this.closeCard();return}e.threads.forEach(e=>{s.appendChild(this.createThreadElement(e))})}e.style.visibility=`hidden`,t.appendChild(s),e.appendChild(t),this.updateReactionPickerPosition(t),this.positionCard(t),e.style.visibility=``,this.flushPendingCardFocus(),this.scheduleLayoutRefresh()}function fi(e){let t=Yr(e);if(!t)return;let{picker:n,scroll:r,wrap:i}=t;n.classList.remove(`is-upward`),n.style.maxHeight=``;let a=i.getBoundingClientRect(),o=r.getBoundingClientRect(),s=n.getBoundingClientRect(),c=window.innerHeight-12,l=Math.min(o.bottom,c),u=Math.max(o.top,12),d=Math.max(l-a.bottom-8,0),f=Math.max(a.top-u-8,0),p=s.height>d&&f>d,m=Math.max(p?f:d,120);n.classList.toggle(`is-upward`,p),n.style.maxHeight=`${m}px`}function pi(){let e=this.cardRoot?.firstElementChild;if(!e||!this.activeCard){this.cardRoot&&(this.cardRoot.style.visibility=``);return}this.positionCard(e),this.cardRoot.style.visibility=``,this.flushPendingCardFocus()}function mi(){let e=document.createElement(`form`);e.className=`comment-card-form`;let t=document.createElement(`textarea`);t.className=K({extra:`comment-card-input`}),t.rows=4,t.maxLength=_e,t.placeholder=`Add context, feedback, or a question...`;let n=document.createElement(`div`);n.className=`ui-record-actions comment-card-actions`;let r=document.createElement(`button`);r.type=`button`,r.className=G({variant:`secondary`}),r.textContent=`Cancel`,r.addEventListener(`click`,()=>this.closeCard());let i=document.createElement(`button`);return i.type=`submit`,i.className=G({variant:`primary`}),i.textContent=`Post comment`,n.append(r,i),e.append(t,n),e.addEventListener(`submit`,async e=>{if(e.preventDefault(),!await this.onCreateThread?.({anchor:this.activeCard?.anchor,body:t.value})){t.focus();return}this.closeCard()}),this.pendingCardFocusElement=t,e}function hi(e){let t=document.createElement(`article`);t.className=`comment-thread-card`;let n=document.createElement(`div`);n.className=`ui-record-header comment-thread-card-header`;let r=document.createElement(`div`);r.className=`comment-thread-card-heading`;let i=document.createElement(`span`);i.className=`comment-thread-card-author`,i.textContent=e.createdByName;let a=document.createElement(`span`);a.className=`comment-thread-card-time`,a.textContent=this.formatTimestamp(e.createdAt);let o=document.createElement(`div`);o.className=`ui-record-actions comment-thread-card-actions`;let s=document.createElement(`button`);s.type=`button`,s.className=G({variant:`ghost`,size:`compact`,pill:!0,extra:[`ui-action-pill`,`comment-thread-card-action`]}),s.textContent=`Jump`,s.addEventListener(`click`,()=>this.onNavigateToLine?.(e.anchor?.startLine??1));let c=document.createElement(`button`);c.type=`button`,c.className=G({variant:`ghost`,size:`compact`,pill:!0,extra:[`ui-action-pill`,`comment-thread-card-action`]});let l=this.activeCard?.replyThreadId===e.id;c.classList.toggle(`is-active`,l),c.textContent=`Reply`,c.setAttribute(`aria-pressed`,String(l)),c.setAttribute(`aria-label`,l?`Cancel reply`:`Reply to thread`),c.title=l?`Cancel reply`:`Reply to thread`,c.addEventListener(`click`,()=>{this.activeCard={...this.activeCard,replyThreadId:l?null:e.id},this.renderCard()});let u=document.createElement(`button`);return u.type=`button`,u.className=G({variant:`ghost`,size:`compact`,pill:!0,extra:[`ui-action-pill`,`comment-thread-card-action`,`is-danger`]}),u.textContent=`Resolve`,u.addEventListener(`click`,async()=>{await this.onResolveThread?.(e.id)}),o.append(s,c,u),r.append(i,a),n.append(r,o),t.append(n),e.messages.forEach(n=>{t.appendChild(this.createMessageElement(e,n))}),this.activeCard?.replyThreadId===e.id&&t.appendChild(this.createReplyComposer(e)),t}function gi(e,t){let n=document.createElement(`div`);n.className=`comment-message-card`;let r=document.createElement(`div`);r.className=`ui-record-meta comment-message-card-meta`;let i=document.createElement(`span`);i.className=`comment-message-card-author`,i.textContent=t.userName;let a=document.createElement(`span`);a.className=`comment-message-card-time`,a.textContent=this.formatTimestamp(t.createdAt);let o=Gr(t.body,`comment-message-card-body comment-markdown`);return r.append(i,a),n.append(r,o),n.appendChild(this.createReactionBar(e,t)),n}function _i(e,t){let n=this.session?.getLocalUser?.()?.userId??``,r=document.createElement(`div`);r.className=`comment-reaction-bar`;let i=new Set((t.reactions??[]).map(e=>e.emoji)),a=document.createElement(`div`);a.className=`comment-reaction-chips`,(t.reactions??[]).forEach(r=>{let i=document.createElement(`button`);i.type=`button`,i.className=`ui-chip-button ui-chip-button--comment comment-reaction-chip`,i.classList.toggle(`is-active`,Kr(r,n)),i.setAttribute(`aria-pressed`,String(Kr(r,n))),i.title=r.users?.map(e=>e.userName).join(`, `)||r.emoji;let o=document.createElement(`span`);o.className=`comment-reaction-chip-emoji`,o.textContent=r.emoji;let s=document.createElement(`span`);s.className=`comment-reaction-chip-count`,s.textContent=qr(r),i.append(o,s),i.addEventListener(`click`,async()=>{await this.onToggleReaction?.(e.id,t.id,r.emoji)}),a.appendChild(i)});let o=document.createElement(`div`);o.className=`comment-reaction-actions`,Nr.filter(e=>!i.has(e)).forEach(n=>{o.appendChild(this.createQuickReactionButton(e,t,n))});let s=document.createElement(`div`);s.className=`comment-reaction-picker-wrap`;let c=document.createElement(`button`);return c.type=`button`,c.className=`ui-chip-button ui-chip-button--comment comment-reaction-more-trigger`,c.dataset.reactionPickerToggle=`true`,c.setAttribute(`aria-expanded`,String(Jr(this.reactionPicker,e.id,t.id))),c.textContent=`More`,c.addEventListener(`click`,()=>{this.reactionPicker=Jr(this.reactionPicker,e.id,t.id)?null:{messageId:t.id,threadId:e.id},this.renderCard()}),s.appendChild(c),Jr(this.reactionPicker,e.id,t.id)&&s.appendChild(this.createReactionPicker(e,t)),o.appendChild(s),r.append(a,o),r}function vi(e,t,n){let r=document.createElement(`button`);return r.type=`button`,r.className=`ui-icon-chip ui-icon-chip--comment comment-reaction-quick-add`,r.textContent=n,r.title=`React with ${n}`,r.addEventListener(`click`,async()=>{await this.onToggleReaction?.(e.id,t.id,n)}),r}function yi(e,t){let n=document.createElement(`div`);n.className=`comment-reaction-picker`;let r=document.createElement(`div`);return r.className=`comment-reaction-picker-grid`,Pr.forEach(n=>{r.appendChild(this.createReactionPickerButton(e,t,n))}),n.appendChild(r),n}function bi(e,t,n){let r=document.createElement(`button`);return r.type=`button`,r.className=`ui-icon-chip ui-icon-chip--comment comment-reaction-picker-btn`,r.textContent=n,r.title=`React with ${n}`,r.addEventListener(`click`,async()=>{await this.onToggleReaction?.(e.id,t.id,n)&&(this.reactionPicker=null,this.renderCard())}),r}function xi(e){let t=document.createElement(`form`);t.className=`comment-reply-form`;let n=document.createElement(`textarea`);n.className=K({extra:`comment-card-input`}),n.rows=3,n.maxLength=_e,n.placeholder=`Reply to thread...`;let r=document.createElement(`div`);r.className=`ui-record-actions comment-card-actions`;let i=document.createElement(`button`);i.type=`button`,i.className=G({variant:`secondary`}),i.textContent=`Cancel`,i.addEventListener(`click`,()=>{this.activeCard={...this.activeCard,replyThreadId:null},this.renderCard()});let a=document.createElement(`button`);return a.type=`submit`,a.className=G({variant:`primary`}),a.textContent=`Reply`,r.append(i,a),t.append(n,r),this.pendingCardFocusElement=n,t.addEventListener(`submit`,async t=>{if(t.preventDefault(),!await this.onReplyToThread?.(e.id,n.value)){n.focus();return}this.activeCard={...this.activeCard,replyThreadId:null},this.renderCard()}),t}function Si(e){let t=this.updateCardSourceRect(),n=window.innerWidth,r=window.innerHeight,i=e.getBoundingClientRect(),a=U((n-i.width)/2,16,n-i.width-16),o=U((r-i.height)/4,16,r-i.height-16),s=a,c=o;t&&(s=U(t.left,16,n-Math.min(i.width,520)-16),c=t.bottom+14,c+i.height>r-16&&(c=Math.max(t.top-i.height-14,16))),this.cardRoot.style.left=`${s}px`,this.cardRoot.style.top=`${c}px`,this.cardRoot.style.width=`${Math.min(Math.max(i.width,520),n-32)}px`}function Ci(){let e=this.pendingCardFocusElement;if(!(e instanceof HTMLElement)||!e.isConnected){this.pendingCardFocusElement=null;return}this.pendingCardFocusElement=null;let t=()=>{if(!e.isConnected)return;let t=document.activeElement;t instanceof HTMLElement&&this.editorContainer?.contains(t)&&t.blur(),e.focus({preventScroll:!0})};t(),document.activeElement!==e&&requestAnimationFrame(()=>{t(),document.activeElement!==e&&setTimeout(()=>{t()},50)})}var wi={closeCard:li,createComposer:mi,createMessageElement:gi,createQuickReactionButton:vi,createReactionBar:_i,createReactionPicker:yi,createReactionPickerButton:bi,createReplyComposer:xi,createThreadElement:hi,ensureCardRoot:oi,flushPendingCardFocus:Ci,openComposerForSelection:si,openThreadGroup:ci,positionCard:Si,renderCard:di,repositionActiveCard:pi,updateCardSourceRect:ui,updateReactionPickerPosition:fi};function Ti(){this.renderEditorLayer(),this.renderPreviewLayer(),this.repositionActiveCard()}function Ei(e=0){if(!this.previewElement)return!1;let t=this.supported&&e>0,n=0,r=0;if(t){let t=getComputedStyle(this.previewElement),i=Number.parseFloat(t.getPropertyValue(`--preview-comment-rail-reserved`))||0,a=Number.parseFloat(t.paddingRight)||0,o=Number.parseFloat(t.getPropertyValue(`--preview-comment-rail-inset`))||0,s=Math.max(a-i,0),c=Math.max(e+o-s,0),l=this.previewContainer?.getBoundingClientRect(),u=this.previewElement.getBoundingClientRect(),d=l?Math.max(l.right-u.right,0):0;r=Math.min(d,c),n=Math.max(c-r,0)}let i=`${Math.ceil(n)}px`,a=`${Math.floor(r)}px`,o=this.previewElement.style.getPropertyValue(`--preview-comment-rail-reserved`)!==i||this.previewElement.style.getPropertyValue(`--preview-comment-rail-offset`)!==a;return o&&(this.previewElement.style.setProperty(`--preview-comment-rail-reserved`,i),this.previewElement.style.setProperty(`--preview-comment-rail-offset`,a)),o}function Di(){this.layoutFrame||=requestAnimationFrame(()=>{this.layoutFrame=0,this.refreshLayout()})}function Oi(){if(this.editorLayer?.isConnected&&this.editorLayer.parentElement===this.editorContainer)return this.editorLayer;let e=document.createElement(`div`);return e.className=`comment-editor-layer`,this.editorContainer?.appendChild(e),this.editorLayer=e,e}function ki(){let e=this.ensureEditorLayer();if(e.replaceChildren(),!this.supported||!this.session)return;let t=this.editorContainer?.getBoundingClientRect?.();if(!t)return;let n=this.getThreadGroups(),r=[];if(n.forEach(n=>{let i=this.session.getCommentAnchorClientRect?.(n.anchor);if(!i)return;let a=$r(i,t);if(a.bottom<0||a.top>t.height)return;let o=document.createElement(`button`);o.type=`button`,o.className=`ui-state-marker ui-state-marker--comment comment-editor-badge`,o.dataset.count=String(n.threads.length);let s=this.activeCard?.groupKey===n.key,c=this.hoveredEditorGroupKeys.includes(n.key);o.classList.toggle(`is-active`,s),o.classList.toggle(`is-hovered`,c),o.classList.toggle(`is-passive`,!s&&!c),o.setAttribute(`aria-label`,`${n.threads.length} comment thread${n.threads.length===1?``:`s`}`),o.appendChild(ii(n.threads.length));let l=Math.max(a.top,8);o.style.top=`${l}px`,o.style.left=`${Math.max(t.width-36,8)}px`,o.title=`${n.threads.length} comment${n.threads.length===1?``:`s`}`,o.addEventListener(`pointerdown`,e=>{e.preventDefault()}),o.addEventListener(`pointerenter`,()=>{this.updateHoveredEditorGroups([n.key])}),o.addEventListener(`pointerleave`,()=>{this.updateHoveredEditorGroups([])}),o.addEventListener(`focusin`,()=>{this.updateHoveredEditorGroups([n.key])}),o.addEventListener(`focusout`,()=>{this.updateHoveredEditorGroups([])}),o.addEventListener(`click`,()=>{this.openThreadGroup(n,{anchor:n.anchor,origin:`editor`,sourceRect:i})}),e.appendChild(o),r.push(l)}),!this.committedSelectionAnchor||this.activeCard?.mode===`create`)return;let i=this.session.getCommentAnchorClientRect?.(this.committedSelectionAnchor),a=this.session.getSelectionChipClientRect?.(this.committedSelectionAnchor)??i;if(!a)return;let o=$r(a,t);if(o.bottom<0||o.top>t.height)return;let s=U(o.top,8,Math.max(t.height-36,8));for(;r.some(e=>Math.abs(e-s)<32);)s=U(s+36,8,Math.max(t.height-36,8));let c=document.createElement(`button`);c.type=`button`,c.className=`ui-selection-pill ui-selection-pill--comment comment-selection-chip`,c.textContent=`Comment`,c.style.top=`${s}px`,c.style.right=`12px`,c.addEventListener(`pointerdown`,e=>{e.preventDefault(),e.stopPropagation(),this.openComposerForSelection(`editor`,c.getBoundingClientRect())}),e.appendChild(c)}function Ai(){if(this.previewLayer?.isConnected&&this.previewLayer.parentElement===this.previewElement)return this.previewLayer;let e=document.createElement(`div`);e.className=`comment-preview-highlights`;let t=document.createElement(`div`);return t.className=`comment-preview-layer`,this.previewElement?.append(e,t),this.previewHighlightLayer=e,this.previewLayer=t,t}function ji(){if(this.ensurePreviewLayer(),this.previewLayer?.replaceChildren(),this.previewHighlightLayer?.replaceChildren(),!this.supported||!this.previewElement){this.previewHoverRegions=[],this.syncPreviewRailLayout(0);return}let e=this.previewElement.getBoundingClientRect(),t=this.getThreadGroups(),n=[],r=[],i=this.shouldRenderPassivePreviewMarkers(),a=[];t.forEach(t=>{let o=this.resolvePreviewTarget(t.anchor);if(!o?.bubbleRect)return;r.push({key:t.key,rects:o.hoverRects?.length>0?o.hoverRects:[o.bubbleRect]});let s=this.activeCard?.groupKey===t.key,c=this.hoveredPreviewGroupKeys.includes(t.key),l=s||c;if(o.highlightRects?.forEach(t=>{let n=document.createElement(`div`);n.className=`comment-preview-highlight`,n.classList.toggle(`is-active`,s),n.classList.toggle(`is-hovered`,c),n.classList.toggle(`is-passive`,!l),n.style.left=`${t.left-e.left}px`,n.style.top=`${t.top-e.top}px`,n.style.width=`${t.width}px`,n.style.height=`${t.height}px`,this.previewHighlightLayer?.appendChild(n)}),!i&&!l)return;let u=document.createElement(`button`);u.type=`button`,u.className=`ui-state-marker ui-state-marker--comment comment-preview-badge`,u.dataset.commentPreviewGroupKeys=t.key,u.classList.toggle(`is-active`,s),u.classList.toggle(`is-hovered`,c),u.classList.toggle(`is-passive`,!l),u.setAttribute(`aria-label`,`${t.threads.length} comment thread${t.threads.length===1?``:`s`}`),u.appendChild(ii(t.threads.length));let d=U(o.bubbleRect.top-e.top,6,Math.max(this.previewElement.clientHeight-30,6));for(;n.some(e=>Math.abs(e-d)<26);)d=U(d+30,6,Math.max(this.previewElement.clientHeight-30,6));u.style.top=`${d}px`,u.title=`${t.threads.length} comment${t.threads.length===1?``:`s`}`,u.addEventListener(`pointerdown`,e=>{e.preventDefault()}),u.addEventListener(`click`,()=>{this.openThreadGroup(t,{anchor:t.anchor,origin:`preview`,sourceRect:u.getBoundingClientRect()})}),this.previewLayer?.appendChild(u),n.push(d),a.push(u)}),this.previewHoverRegions=r;let o=a.reduce((e,t)=>Math.max(e,t.offsetWidth||28),0);this.syncPreviewRailLayout(o)&&this.scheduleLayoutRefresh(),this.lastPreviewPointerPosition&&this.updateHoveredPreviewGroups(this.getPreviewGroupKeysAtPoint(this.lastPreviewPointerPosition.x,this.lastPreviewPointerPosition.y))}function Mi(e){if(!this.previewElement||!e)return null;let t=Array.from(this.previewElement.querySelectorAll(`.mermaid-shell, .plantuml-shell`)).find(t=>Xr(t,e));if(t)return{bubbleRect:t.getBoundingClientRect(),highlightRects:[],hoverRects:[t.getBoundingClientRect()]};let n=Array.from(this.previewElement.querySelectorAll(`[data-source-line]`)).filter(t=>Vr(t)&&Xr(t,e));if(e.kind===`text`&&e.quote){let t=n.map(t=>({element:t,range:Qr(t,e.quote)})).filter(e=>e.range);if(t.length===1){let e=Array.from(t[0].range.getClientRects());return{bubbleRect:ei(e)||t[0].element.getBoundingClientRect(),highlightRects:e,hoverRects:e}}}let r=n[0];return r?{bubbleRect:r.getBoundingClientRect(),highlightRects:[],hoverRects:[r.getBoundingClientRect()]}:null}function Ni(e){if(!(e instanceof Node))return[];let t=e.closest?.(`[data-comment-preview-group-keys]`);return ri(String(t?.dataset?.commentPreviewGroupKeys??``).split(/\s+/).filter(Boolean)).split(` `).filter(Boolean)}function Pi(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))return[];let n=document.elementFromPoint(e,t),r=this.getPreviewGroupKeysForTarget(n);return r.length>0?r:ni(this.previewHoverRegions.filter(n=>n.rects.some(n=>ti(e,t,n))).map(e=>e.key))}function Fi(e=[]){let t=ni(e),n=t.join(` `);n!==this.hoveredPreviewGroupKeysSignature&&(this.hoveredPreviewGroupKeys=t,this.hoveredPreviewGroupKeysSignature=n,this.scheduleLayoutRefresh())}function Ii(e=[]){let t=ni(e),n=t.join(` `);n!==this.hoveredEditorGroupKeysSignature&&(this.hoveredEditorGroupKeys=t,this.hoveredEditorGroupKeysSignature=n,this.scheduleLayoutRefresh())}function Li(e){this.updateHoveredPreviewGroups(this.getPreviewGroupKeysForTarget(e))}function Ri(){let e=this.previewContainer?.clientWidth??this.previewElement?.clientWidth??0;return window.innerWidth>=769&&e>=400}var zi={ensureEditorLayer:Oi,ensurePreviewLayer:Ai,getPreviewGroupKeysAtPoint:Pi,getPreviewGroupKeysForTarget:Ni,refreshLayout:Ti,renderEditorLayer:ki,renderPreviewLayer:ji,resolvePreviewTarget:Mi,scheduleLayoutRefresh:Di,shouldRenderPassivePreviewMarkers:Ri,syncHoveredPreviewGroupsFromTarget:Li,syncPreviewRailLayout:Ei,updateHoveredEditorGroups:Ii,updateHoveredPreviewGroups:Fi};function Bi(){this.renderToolbar(),this.renderDrawer(),this.renderCard(),this.scheduleLayoutRefresh()}function Vi(){let e=this.threads.length,t=this.supported&&!!this.session;if(this.commentSelectionButton?.classList.toggle(`hidden`,!t),this.commentsToggleButton?.classList.toggle(`hidden`,!this.supported),this.commentSelectionButton&&(this.commentSelectionButton.disabled=!this.selectionAnchor),this.commentsToggleButton){this.commentsToggleButton.classList.toggle(`active`,this.drawerOpen),this.commentsToggleButton.setAttribute(`aria-expanded`,String(this.drawerOpen));let t=e>0?`Comments ${e}`:`Comments`,n=this.commentsToggleButton.querySelector(`.ui-action-label`);n?n.textContent=t:this.commentsToggleButton.textContent=t}}function Hi(){if(!this.commentsDrawer||!this.commentsDrawerList)return;this.commentsDrawer.classList.toggle(`hidden`,!this.supported||!this.drawerOpen),this.commentsDrawerList.replaceChildren();let e=this.getThreadGroups();if(this.commentsDrawerEmpty?.classList.toggle(`hidden`,e.length>0),!this.supported||e.length===0)return;let t=document.createDocumentFragment();e.forEach(e=>{let n=document.createElement(`button`);n.type=`button`,n.className=`ui-record-surface comments-drawer-item`,n.classList.toggle(`is-active`,this.activeCard?.groupKey===e.key),n.addEventListener(`pointerdown`,e=>{e.preventDefault()}),n.addEventListener(`click`,()=>{this.openThreadGroup(e,{anchor:e.anchor,origin:`drawer`,sourceRect:n.getBoundingClientRect()})});let r=document.createElement(`div`);r.className=`ui-record-header comments-drawer-item-header`;let i=document.createElement(`span`);i.className=`comments-drawer-item-title`,i.textContent=zr(e.anchor);let a=document.createElement(`span`);a.className=`ui-pill-badge ui-pill-badge--count ui-pill-badge--accent comments-drawer-item-count`,a.textContent=String(e.threads.length),r.append(i,a);let o=document.createElement(`p`);o.className=`comments-drawer-item-quote`,o.textContent=e.anchor.quote||e.anchor.excerpt||`Source anchored comment`;let s=Wr(e),c=Gr(s?.body||``,`comment-markdown comments-drawer-item-preview`),l=document.createElement(`div`);l.className=`ui-record-meta comments-drawer-item-footer`;let u=document.createElement(`span`);u.textContent=`${e.threads.length} thread${e.threads.length===1?``:`s`}`;let d=document.createElement(`span`);d.className=`comments-drawer-item-updated`,d.textContent=s?`${s.userName} • ${this.formatTimestamp(s.createdAt)}`:``,l.append(u,d),n.append(r,o,c,l),t.appendChild(n)}),this.commentsDrawerList.appendChild(t)}function Ui(e){if(!Number.isFinite(e))return``;try{return this.timeFormatter.format(new Date(e))}catch{return``}}var Wi={formatTimestamp:Ui,render:Bi,renderDrawer:Hi,renderToolbar:Vi};function Gi(e){this.session?.getScrollContainer?.()?.removeEventListener(`scroll`,this.handleEditorScroll),this.session=e,this.selectionAnchor=e?.getCurrentSelectionCommentAnchor?.()??null,this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.reactionPicker=null,this.clearSelectionRevealTimer(),this.pointerSelecting=!1,e?.getScrollContainer?.()?.addEventListener(`scroll`,this.handleEditorScroll,{passive:!0}),this.render()}function Ki(e,{fileKind:t=`markdown`,supported:n=!1}={}){let r=this.currentFile!==e;this.currentFile=e,this.fileKind=t,this.supported=!!(e&&n),r&&(this.drawerOpen=!1,this.threads=[],this.selectionAnchor=null,this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.clearSelectionRevealTimer(),this.pointerSelecting=!1,this.activeCard=null,this.updateHoveredEditorGroups([]),this.updateHoveredPreviewGroups([]),this.previewHoverRegions=[],this.lastPreviewPointerPosition=null,this.reactionPicker=null),this.supported||(this.drawerOpen=!1,this.activeCard=null,this.threads=[],this.selectionAnchor=null,this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.clearSelectionRevealTimer(),this.pointerSelecting=!1,this.updateHoveredEditorGroups([]),this.updateHoveredPreviewGroups([]),this.previewHoverRegions=[],this.lastPreviewPointerPosition=null,this.reactionPicker=null),this.render()}function qi(e){if(this.selectionAnchor=this.supported?e:null,!this.supported||!this.selectionAnchor){this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.clearSelectionRevealTimer(),this.renderToolbar(),this.scheduleLayoutRefresh();return}if(!Lr(this.selectionAnchor)){this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.clearSelectionRevealTimer(),this.renderToolbar(),this.scheduleLayoutRefresh();return}if(this.pendingSelectionAnchor=this.selectionAnchor,this.activeCard?.mode===`create`){this.clearSelectionRevealTimer(),this.renderToolbar(),this.scheduleLayoutRefresh();return}if(this.pointerSelecting){this.clearSelectionRevealTimer(),this.committedSelectionAnchor=null,this.renderToolbar(),this.scheduleLayoutRefresh();return}if(Rr(this.committedSelectionAnchor,this.selectionAnchor)){this.renderToolbar(),this.scheduleLayoutRefresh();return}this.scheduleSelectionReveal(this.selectionAnchor),this.renderToolbar(),this.scheduleLayoutRefresh()}function Ji(){this.activeCard?.mode!==`create`&&(this.clearSelectionRevealTimer(),this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.scheduleLayoutRefresh())}function Yi(e=[]){this.threads=Fr(e),this.activeCard?.mode===`group`&&!this.getThreadGroups().some(e=>e.key===this.activeCard.groupKey)&&(this.activeCard=null),this.reactionPicker&&!this.threads.some(e=>e.id===this.reactionPicker.threadId&&e.messages?.some(e=>e.id===this.reactionPicker.messageId))&&(this.reactionPicker=null),this.render()}function Xi(e){let t=!!e;t!==this.drawerOpen&&(t&&this.onWillOpenDrawer?.(),this.drawerOpen=t,this.render())}function Zi(){this.setDrawerOpen(!1)}function Qi(){let e=new Map;return this.threads.forEach(t=>{let n=Br(t.anchor),r=e.get(n);if(r){r.threads.push(t);return}e.set(n,{anchor:t.anchor,key:n,threads:[t]})}),Array.from(e.values()).sort((e,t)=>(e.anchor?.startLine??0)-(t.anchor?.startLine??0))}function $i(){this.selectionRevealTimer&&=(clearTimeout(this.selectionRevealTimer),0)}function ea(e){this.clearSelectionRevealTimer(),this.selectionRevealTimer=window.setTimeout(()=>{this.selectionRevealTimer=0,!(this.pointerSelecting||this.activeCard?.mode===`create`||!Rr(this.pendingSelectionAnchor,e))&&(this.committedSelectionAnchor=e,this.scheduleLayoutRefresh())},150)}var ta={attachSession:Gi,clearSelectionRevealTimer:$i,closeDrawer:Zi,getThreadGroups:Qi,handleEditorContentChange:Ji,scheduleSelectionReveal:ea,setCurrentFile:Ki,setDrawerOpen:Xi,setSelectionAnchor:qi,setThreads:Yi},na=class{constructor({commentSelectionButton:e,commentsDrawer:t,commentsDrawerEmpty:n,commentsDrawerList:r,commentsToggleButton:i,editorContainer:a,onWillOpenDrawer:o,onCreateThread:s,onNavigateToLine:c,onReplyToThread:l,onToggleReaction:u,onResolveThread:d,previewContainer:f,previewElement:p}){this.commentSelectionButton=e,this.commentsDrawer=t,this.commentsDrawerEmpty=n,this.commentsDrawerList=r,this.commentsToggleButton=i,this.editorContainer=a,this.onWillOpenDrawer=o,this.onCreateThread=s,this.onNavigateToLine=c,this.onReplyToThread=l,this.onToggleReaction=u,this.onResolveThread=d,this.previewContainer=f,this.previewElement=p,this.currentFile=null,this.fileKind=`markdown`,this.supported=!1,this.drawerOpen=!1,this.threads=[],this.selectionAnchor=null,this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.selectionRevealTimer=0,this.pointerSelecting=!1,this.session=null,this.activeCard=null,this.hoveredEditorGroupKeys=[],this.hoveredEditorGroupKeysSignature=``,this.hoveredPreviewGroupKeys=[],this.hoveredPreviewGroupKeysSignature=``,this.previewHoverRegions=[],this.lastPreviewPointerPosition=null,this.editorLayer=null,this.previewLayer=null,this.previewHighlightLayer=null,this.cardRoot=null,this.pendingCardFocusElement=null,this.reactionPicker=null,this.layoutFrame=0,this.timeFormatter=new Intl.DateTimeFormat(void 0,{day:`numeric`,hour:`numeric`,minute:`2-digit`,month:`short`}),this.handleEditorScroll=()=>this.scheduleLayoutRefresh(),this.handlePreviewScroll=()=>this.scheduleLayoutRefresh(),this.handleWindowResize=()=>this.scheduleLayoutRefresh(),this.handlePreviewPointerMove=e=>{this.lastPreviewPointerPosition={x:e.clientX,y:e.clientY},this.updateHoveredPreviewGroups(this.getPreviewGroupKeysAtPoint(e.clientX,e.clientY))},this.handlePreviewPointerLeave=()=>{this.lastPreviewPointerPosition=null,this.updateHoveredPreviewGroups([])},this.handlePreviewFocusIn=e=>{this.updateHoveredPreviewGroups(this.getPreviewGroupKeysForTarget(e.target))},this.handlePreviewFocusOut=e=>{this.updateHoveredPreviewGroups(this.getPreviewGroupKeysForTarget(e.relatedTarget))},this.handleCommentSelectionButtonPointerDown=e=>{e.preventDefault()},this.handleEditorPointerDown=e=>{e.button!==0||!this.supported||!this.session||!e.target?.closest?.(`.cm-editor`)||e.target?.closest?.(`.comment-editor-layer`)||(this.pointerSelecting=!0,this.clearSelectionRevealTimer(),this.committedSelectionAnchor&&(this.committedSelectionAnchor=null,this.scheduleLayoutRefresh()))},this.handleDocumentPointerUp=()=>{this.pointerSelecting&&requestAnimationFrame(()=>{let e=this.supported?this.session?.getCurrentSelectionCommentAnchor?.()??null:null;this.pointerSelecting=!1,this.selectionAnchor=e,this.renderToolbar(),this.pendingSelectionAnchor=Lr(e)?e:null,this.clearSelectionRevealTimer(),this.committedSelectionAnchor=Lr(e)&&this.activeCard?.mode!==`create`?e:null,this.scheduleLayoutRefresh()})},this.handleEditorFocusOut=e=>{let t=e.relatedTarget;t instanceof Node&&(this.editorContainer?.contains(t)||this.cardRoot?.contains(t)||this.commentSelectionButton?.contains(t))||(this.clearSelectionRevealTimer(),this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.scheduleLayoutRefresh())},this.handleDocumentPointerDown=e=>{let t=e.target;if(this.activeCard&&this.cardRoot){if(this.cardRoot.contains(t))return;this.closeCard()}this.drawerOpen&&(t instanceof Node&&(this.commentsDrawer?.contains(t)||this.commentsToggleButton?.contains(t))||this.closeDrawer())},this.handleDocumentKeyDown=e=>{if(e.key===`Escape`&&this.reactionPicker){this.reactionPicker=null,this.renderCard();return}e.key===`Escape`&&this.activeCard&&this.closeCard(),e.key===`Escape`&&this.committedSelectionAnchor&&(this.clearSelectionRevealTimer(),this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.scheduleLayoutRefresh())},this.commentSelectionButton?.addEventListener(`pointerdown`,this.handleCommentSelectionButtonPointerDown),this.commentSelectionButton?.addEventListener(`click`,()=>{this.openComposerForSelection(`toolbar`)}),this.commentsToggleButton?.addEventListener(`click`,()=>{this.setDrawerOpen(!this.drawerOpen)}),this.previewContainer?.addEventListener(`scroll`,this.handlePreviewScroll,{passive:!0}),this.previewElement?.addEventListener(`pointermove`,this.handlePreviewPointerMove,{passive:!0}),this.previewElement?.addEventListener(`pointerleave`,this.handlePreviewPointerLeave),this.previewElement?.addEventListener(`focusin`,this.handlePreviewFocusIn),this.previewElement?.addEventListener(`focusout`,this.handlePreviewFocusOut),this.editorContainer?.addEventListener(`pointerdown`,this.handleEditorPointerDown),this.editorContainer?.addEventListener(`focusout`,this.handleEditorFocusOut),window.addEventListener(`resize`,this.handleWindowResize),document.addEventListener(`pointerup`,this.handleDocumentPointerUp),document.addEventListener(`pointercancel`,this.handleDocumentPointerUp),document.addEventListener(`pointerdown`,this.handleDocumentPointerDown),document.addEventListener(`keydown`,this.handleDocumentKeyDown)}destroy(){this.layoutFrame&&=(cancelAnimationFrame(this.layoutFrame),0),this.attachSession(null),this.previewContainer?.removeEventListener(`scroll`,this.handlePreviewScroll),this.previewElement?.removeEventListener(`pointermove`,this.handlePreviewPointerMove),this.previewElement?.removeEventListener(`pointerleave`,this.handlePreviewPointerLeave),this.previewElement?.removeEventListener(`focusin`,this.handlePreviewFocusIn),this.previewElement?.removeEventListener(`focusout`,this.handlePreviewFocusOut),this.commentSelectionButton?.removeEventListener(`pointerdown`,this.handleCommentSelectionButtonPointerDown),this.editorContainer?.removeEventListener(`pointerdown`,this.handleEditorPointerDown),this.editorContainer?.removeEventListener(`focusout`,this.handleEditorFocusOut),window.removeEventListener(`resize`,this.handleWindowResize),document.removeEventListener(`pointerup`,this.handleDocumentPointerUp),document.removeEventListener(`pointercancel`,this.handleDocumentPointerUp),document.removeEventListener(`pointerdown`,this.handleDocumentPointerDown),document.removeEventListener(`keydown`,this.handleDocumentKeyDown),this.previewHoverRegions=[],this.cardRoot?.remove(),this.editorLayer?.remove(),this.previewLayer?.remove(),this.pendingCardFocusElement=null}};Object.assign(na.prototype,ta,Wi,zi,wi);var ra=360,ia=`https://viewer.diagrams.net/js/viewer-static.min.js`,aa=null;function oa(e,t){return typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e,{timeout:t}):window.setTimeout(()=>e({didTimeout:!1,timeRemaining:()=>0}),1)}function sa(e){if(e!==null){if(typeof window.cancelIdleCallback==`function`){window.cancelIdleCallback(e);return}window.clearTimeout(e)}}function ca(e,t,n){if(!e||!t)return!1;let r=t.getBoundingClientRect(),i=e.getBoundingClientRect();return i.bottom>=r.top-n&&i.top<=r.bottom+n}function la(){return window.GraphViewer?.processElements?Promise.resolve(window.GraphViewer):aa||(aa=new Promise((e,t)=>{let n=document.querySelector(`script[data-collabmd-drawio-viewer]`),r=n instanceof HTMLScriptElement?n:document.createElement(`script`),i=()=>{r.removeEventListener(`error`,a),r.removeEventListener(`load`,o)},a=()=>{i(),aa=null,t(Error(`Failed to load draw.io viewer`))},o=()=>{if(i(),!window.GraphViewer?.processElements){aa=null,t(Error(`draw.io viewer did not initialize`));return}e(window.GraphViewer)};r.addEventListener(`error`,a,{once:!0}),r.addEventListener(`load`,o,{once:!0}),n?window.GraphViewer?.processElements&&o():(r.src=ia,r.async=!0,r.dataset.collabmdDrawioViewer=`true`,document.head.append(r))}),aa)}var ua=class{constructor({getLocalUser:e,getTheme:t,onOpenFile:n=null,onOpenTextFile:r=null,previewContainer:i,previewElement:a,toastController:o}){this.getLocalUser=e,this.getTheme=t,this.onOpenFile=n,this.onOpenTextFile=r,this.previewContainer=i,this.previewElement=a,this.toastController=o,this.embedEntries=new Map,this.hydrationQueue=[],this.hydrationIdleId=null,this.hydrationPaused=!1,this.instanceCounter=0,this.maximizedEntry=null,this.maximizedRoot=null,this._onMessage=this._onMessage.bind(this),this._onKeyDown=this._onKeyDown.bind(this),this._onPreviewClick=this._onPreviewClick.bind(this),window.addEventListener(`message`,this._onMessage),window.addEventListener(`keydown`,this._onKeyDown),this.previewElement?.addEventListener(`click`,this._onPreviewClick)}destroy(){window.removeEventListener(`message`,this._onMessage),window.removeEventListener(`keydown`,this._onKeyDown),this.previewElement?.removeEventListener(`click`,this._onPreviewClick),sa(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this._exitMaximizedEntry(),document.body.classList.remove(`drawio-maximized-open`),this.embedEntries.forEach(e=>e.wrapper?.remove()),this.embedEntries.clear(),this.maximizedRoot?.remove(),this.maximizedRoot=null}detachForCommit(){sa(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this.embedEntries.forEach(e=>{e.placeholder=null})}setHydrationPaused(e){this.hydrationPaused=!!e,this.hydrationPaused||this.hydrateVisibleEmbeds()}reconcileEmbeds(e){this._exitMaximizedEntry();let t=Array.from(e.querySelectorAll(`.drawio-embed-placeholder[data-drawio-key]`)).map(e=>({filePath:e.dataset.drawioTarget||``,key:e.dataset.drawioKey||``,label:e.dataset.drawioLabel||e.dataset.drawioTarget||``,mode:e.dataset.drawioMode===`edit`?`edit`:`view`,placeholder:e})),n=new Map;t.forEach(e=>{let t=this.embedEntries.get(e.key)||null,r=t?{...t,...e}:{...e,iframe:null,imageElement:null,instanceId:``,queued:!1,viewerElement:null,wrapper:null};n.set(e.key,r)}),this.embedEntries.forEach((e,t)=>{n.has(t)||e.wrapper?.remove()}),this.embedEntries=n,this.embedEntries.forEach(e=>{e.wrapper?e.placeholder?.replaceWith(e.wrapper):e.queued=!1}),this.hydrationPaused||this.hydrateVisibleEmbeds()}hydrateVisibleEmbeds(){this.embedEntries.forEach(e=>{e.wrapper||!e.placeholder?.isConnected||(e.mode===`edit`||ca(e.placeholder,this.previewContainer,ra))&&this.enqueueHydration(e)})}enqueueHydration(e){e.queued||(e.queued=!0,this.hydrationQueue.push(e),this.hydrationIdleId===null&&(this.hydrationIdleId=oa(()=>{this.hydrationIdleId=null,this.hydrationQueue.splice(0).forEach(e=>{e.queued=!1,this.hydrateEntry(e)})},200)))}hydrateEntry(e){if(!(!e.placeholder?.isConnected||e.wrapper)){if(e.mode===`view`){this.hydrateViewerEntry(e);return}this.hydrateIframeEntry(e)}}hydrateIframeEntry(e){if(!e.placeholder?.isConnected||e.wrapper)return;let t=document.createElement(`div`);t.className=`drawio-embed diagram-preview-shell${e.mode===`edit`?` is-direct-file`:``}`,t.dataset.file=e.filePath,t.dataset.drawioKey=e.key;let n=document.createElement(`div`);n.className=`drawio-embed-header diagram-preview-toolbar`;let r=document.createElement(`span`);r.className=`drawio-embed-icon`,r.innerHTML=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`;let i=document.createElement(`span`);i.className=`drawio-embed-label`,i.textContent=e.label.replace(/\.drawio$/i,``),n.append(r,i),e.mode!==`edit`&&n.appendChild(this.createOpenButton(e)),n.appendChild(this.createMaximizeButton(e,t));let a=document.createElement(`iframe`);a.className=`drawio-embed-iframe`,a.loading=`lazy`,a.referrerPolicy=`strict-origin-when-cross-origin`,e.instanceId=`drawio-${++this.instanceCounter}`,a.dataset.instanceId=e.instanceId,a.src=this.buildIframeUrl(e),t.append(n,a),e.iframe=a,e.wrapper=t,e.placeholder.replaceWith(t)}async hydrateViewerEntry(e){if(!e.placeholder?.isConnected||e.wrapper)return;let t=document.createElement(`div`);t.className=`drawio-embed diagram-preview-shell is-static-preview`,t.dataset.file=e.filePath,t.dataset.drawioKey=e.key;let n=document.createElement(`div`);n.className=`drawio-embed-header diagram-preview-toolbar`;let r=document.createElement(`span`);r.className=`drawio-embed-icon`,r.innerHTML=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`;let i=document.createElement(`span`);i.className=`drawio-embed-label`,i.textContent=e.label.replace(/\.drawio$/i,``),n.append(r,i),n.append(this.createOpenButton(e),this.createMaximizeButton(e,t));let a=document.createElement(`div`);a.className=`drawio-viewer-shell`,a.dataset.filePath=e.filePath;let o=document.createElement(`div`);o.className=`preview-shell`,o.textContent=`Rendering draw.io preview…`,a.appendChild(o),t.append(n,a),e.iframe=null,e.wrapper=t,e.viewerElement=a,e.placeholder.replaceWith(t);try{await this.renderViewerEntry(e)}catch(t){this.renderViewerFallback(e,t instanceof Error?t.message:`Failed to render draw.io preview`)}}async renderViewerEntry(e){let[{content:t},n]=await Promise.all([S.readFile(e.filePath),la()]);if(!e.wrapper?.isConnected||!e.viewerElement?.isConnected)return;let r=this.getTheme?.()===`light`?`light`:`dark`,i=document.createElement(`div`);i.className=`mxgraph drawio-viewer-frame`,i.dataset.action=`open-file`,i.dataset.filePath=e.filePath,i.setAttribute(`role`,`button`),i.setAttribute(`tabindex`,`0`),i.setAttribute(`aria-label`,`Open ${e.label.replace(/\.drawio$/i,``)}`),i.addEventListener(`click`,t=>{t.preventDefault(),this.onOpenFile?.(e.filePath)}),i.addEventListener(`keydown`,t=>{t.key!==`Enter`&&t.key!==` `||(t.preventDefault(),this.onOpenFile?.(e.filePath))}),i.dataset.mxgraph=JSON.stringify({"check-visible-state":!1,center:!0,border:0,"dark-mode":r,editable:!1,fit:1,lightbox:!1,nav:!1,resize:!1,toolbar:``,tooltips:!1,xml:String(t??``)}),e.viewerElement.replaceChildren(i),e.viewerElement=i,n.processElements()}buildIframeUrl(e){let t=new URL(T(`/drawio-editor.html`)),n=this.getLocalUser?.()??{};return t.searchParams.set(`file`,e.filePath),t.searchParams.set(`hostMode`,e.mode===`edit`?`file-preview`:`embed`),t.searchParams.set(`instanceId`,e.instanceId),t.searchParams.set(`mode`,e.mode===`edit`?`edit`:`view`),t.searchParams.set(`theme`,this.getTheme?.()===`light`?`light`:`dark`),n.name&&t.searchParams.set(`userName`,n.name),n.peerId&&t.searchParams.set(`peerId`,n.peerId),e.mode===`edit`&&t.searchParams.set(`leaseRoom`,re(e.filePath)),t.toString()}updateTheme(e){this.embedEntries.forEach(t=>{t.iframe?.contentWindow&&t.iframe.contentWindow.postMessage({source:`collabmd-host`,theme:e,type:`set-theme`},window.location.origin),t.mode===`view`&&t.wrapper?.isConnected&&t.viewerElement?.isConnected&&this.renderViewerEntry(t).catch(e=>{this.renderViewerFallback(t,e instanceof Error?e.message:`Failed to render draw.io preview`)})})}updateLocalUser(){}syncLayout(){}createOpenButton(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`drawio-embed-btn ui-preview-action ui-preview-action--icon-only`,t.dataset.action=`open-file`,t.dataset.filePath=e.filePath,t.title=`Edit in draw.io`,t.setAttribute(`aria-label`,`Edit in draw.io`),z(t,`edit`),t.addEventListener(`click`,t=>{t.preventDefault(),this.onOpenFile?.(e.filePath)}),t}createMaximizeButton(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`drawio-embed-btn ui-preview-action ui-preview-action--icon-only`,n.dataset.action=`toggle-maximize`,n.dataset.filePath=e.filePath,n.dataset.drawioKey=e.key,n.addEventListener(`click`,n=>{n.preventDefault(),this.maximizedEntry?.key===e.key?this._exitMaximizedEntry():this._enterMaximizedEntry(e,t),this._syncMaximizeButtons()}),(()=>{let t=this.maximizedEntry?.key===e.key;z(n,t?`restore`:`maximize`),n.title=t?`Restore diagram size`:`Maximize diagram`,n.setAttribute(`aria-label`,t?`Restore diagram size`:`Maximize diagram`)})(),n}_ensureMaximizedRoot(){if(this.maximizedRoot?.isConnected&&this.maximizedRoot.parentElement===document.body)return this.maximizedRoot;let e=document.body.querySelector(`[data-drawio-maximized-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.drawioMaximizedRoot=`true`,e.className=`drawio-maximized-root`,document.body.appendChild(e)),this.maximizedRoot=e,e}_enterMaximizedEntry(e,t=e?.wrapper){if(!e?.wrapper||e.wrapper!==t||this.maximizedEntry?.key===e.key)return;this._exitMaximizedEntry();let n=this._ensureMaximizedRoot(),r=e.wrapper.parentElement;if(!r)return;let i=document.createElement(`div`);i.className=`drawio-maximize-spacer`,i.style.height=`${Math.ceil(e.wrapper.getBoundingClientRect().height)}px`,e.maximizeSpacer=i,e.restoreParent=r,e.restoreNextSibling=e.wrapper.nextSibling||null,r.insertBefore(i,e.wrapper),n.hidden=!1,n.appendChild(e.wrapper),e.wrapper.classList.add(`is-maximized`),document.body.classList.add(`drawio-maximized-open`),this.maximizedEntry=e}_exitMaximizedEntry(){let e=this.maximizedEntry;if(!e?.wrapper){this.maximizedEntry=null,document.body.classList.remove(`drawio-maximized-open`);return}let{maximizeSpacer:t,restoreNextSibling:n,restoreParent:r}=e;e.wrapper.classList.remove(`is-maximized`),t?.parentElement?t.replaceWith(e.wrapper):r?.isConnected&&(n?.parentElement===r?r.insertBefore(e.wrapper,n):r.appendChild(e.wrapper)),e.maximizeSpacer=null,e.restoreParent=null,e.restoreNextSibling=null,this.maximizedEntry=null,document.body.classList.remove(`drawio-maximized-open`),this.maximizedRoot&&this.maximizedRoot.childElementCount===0&&(this.maximizedRoot.hidden=!0)}_syncMaximizeButtons(){this.embedEntries.forEach(e=>{let t=e.wrapper?.querySelector(`.drawio-embed-btn[data-action="toggle-maximize"]`);if(!(t instanceof HTMLElement))return;let n=this.maximizedEntry?.key===e.key;z(t,n?`restore`:`maximize`),t.title=n?`Restore diagram size`:`Maximize diagram`,t.setAttribute(`aria-label`,n?`Restore diagram size`:`Maximize diagram`)})}_findEntryByInstanceId(e){for(let t of this.embedEntries.values())if(t.instanceId===e)return t;return null}_onMessage(e){let t=e.data;if(!t||t.source!==`drawio-editor`)return;let n=this._findEntryByInstanceId(t.instanceId);if(n){if(t.type===`fallback-text`){if(n.mode===`view`){this.renderViewerFallback(n,`Failed to render draw.io preview`);return}this.onOpenTextFile?.(n.filePath);return}if(t.type===`error`){if(n.mode===`view`){this.renderViewerFallback(n,t.message||`Failed to load draw.io preview`);return}this.toastController?.show?.(t.message||`Failed to load draw.io`);return}t.type===`request-open-file`&&this.onOpenFile?.(n.filePath)}}_onPreviewClick(e){let t=e.target.closest(`.drawio-embed-placeholder-btn`);if(t){let n=t.closest(`.drawio-embed-placeholder`)?.dataset.drawioKey||``,r=this.embedEntries.get(n);r&&(e.preventDefault(),this.hydrateEntry(r));return}}_onKeyDown(e){e.key===`Escape`&&(this._exitMaximizedEntry(),this._syncMaximizeButtons())}renderViewerFallback(e,t){if(!e.wrapper)return;let n=e.wrapper.querySelector(`.drawio-viewer-shell, .drawio-viewer-frame`);if(!n)return;let r=document.createElement(`div`);r.className=`preview-shell`,r.textContent=t,n.replaceChildren(r),e.viewerElement=r}};function da(e,t){let n=new Map;t.forEach(t=>{let r=e.get(t.key)??{filePath:t.filePath,iframe:null,instanceId:null,key:t.key,label:t.label,placeholder:t.placeholder,queued:!1,reusedFromEmbed:!1,wrapper:null};r.filePath=t.filePath,r.key=t.key,r.label=t.label,r.placeholder=t.placeholder,n.set(t.key,r)});let r=[];return e.forEach((e,t)=>{n.has(t)||r.push(e)}),{nextEntries:n,removedEntries:r}}var fa=420,pa=500,ma=15e3,ha=800,ga=3,_a=200,va=`/excalidraw-editor.html`;function ya(e,t){return typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e,{timeout:t}):window.setTimeout(()=>{e({didTimeout:!1,timeRemaining:()=>0})},1)}function ba(e){if(e!==null){if(typeof window.cancelIdleCallback==`function`){window.cancelIdleCallback(e);return}window.clearTimeout(e)}}function xa(e,t,n){if(!e||!t)return!1;let r=t.getBoundingClientRect(),i=e.getBoundingClientRect();return i.bottom>=r.top-n&&i.top<=r.bottom+n}var Sa=class{constructor({getTheme:e,getLocalUser:t,onOpenFile:n=null,previewContainer:r,previewElement:i,toastController:a}){this.getTheme=e,this.getLocalUser=t,this.onOpenFile=n,this.previewContainer=r,this.previewElement=i,this.toastController=a,this.embedEntries=new Map,this.hydrationQueue=[],this.hydrationIdleId=null,this.hydrationPaused=!1,this.hydrationInProgress=!1,this.instanceCounter=0,this.isLargeDocument=!1,this.maximizedEmbed=null,this.overlayRoot=null,this.maximizedRoot=null,this.placeholderObserver=null,this.followedPeerIdsByFilePath=new Map,this.pendingDisconnectRequests=new Map,this.disconnectRequestCounter=0,this._onMessage=this._onMessage.bind(this),this._onKeyDown=this._onKeyDown.bind(this),this._onPreviewClick=this._onPreviewClick.bind(this),window.addEventListener(`message`,this._onMessage),window.addEventListener(`keydown`,this._onKeyDown),this.previewElement?.addEventListener(`click`,this._onPreviewClick)}destroy(){window.removeEventListener(`message`,this._onMessage),window.removeEventListener(`keydown`,this._onKeyDown),this.previewElement?.removeEventListener(`click`,this._onPreviewClick),this._disconnectPlaceholderObserver(),ba(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this._exitMaximizedEmbed(),document.body.classList.remove(`excalidraw-maximized-open`),this.embedEntries.forEach(e=>{this._clearEntryBootTimeout(e),e.wrapper?.remove(),e.placeholder=null}),this.embedEntries.clear(),this.pendingDisconnectRequests.forEach(e=>{e.resolve(!1)}),this.pendingDisconnectRequests.clear(),this.followedPeerIdsByFilePath.clear(),this.overlayRoot?.remove(),this.overlayRoot=null,this.maximizedRoot?.remove(),this.maximizedRoot=null}async setFollowedUser(e,t=null){if(!e)return!1;this.followedPeerIdsByFilePath.set(e,t||null);let n=this._findEntryByFilePath(e);return n?(n.wrapper||await this._hydrateEntry(n),n.followedPeerId=this.followedPeerIdsByFilePath.get(e)??null,this._syncEntryFollowState(n),!0):!0}detachForCommit(){this._disconnectPlaceholderObserver(),ba(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this.hydrationInProgress=!1,this.overlayRoot&&(this.overlayRoot.hidden=!0),this.maximizedRoot&&(this.maximizedRoot.hidden=!0),this.embedEntries.forEach(e=>{e.queued=!1,e.placeholder=null})}setHydrationPaused(e){if(this.hydrationPaused=!!e,this.hydrationPaused){ba(this.hydrationIdleId),this.hydrationIdleId=null;return}this.hydrateVisibleEmbeds(),this._scheduleHydration()}reconcileEmbeds(e,{isLargeDocument:t=!1}={}){this.isLargeDocument=!!t,this._disconnectPlaceholderObserver(),ba(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this.hydrationInProgress=!1;let n=Array.from(e.querySelectorAll(`.excalidraw-embed-placeholder[data-embed-key]`)).map(e=>({filePath:e.dataset.embedTarget,key:e.dataset.embedKey,label:e.dataset.embedLabel||e.dataset.embedTarget,placeholder:e})),{nextEntries:r,removedEntries:i}=da(this.embedEntries,n);this._adoptReusableEntries(r,i),i.forEach(e=>this._destroyEntry(e)),this.embedEntries=r,this._ensurePlaceholderObserver(),this.embedEntries.forEach(e=>{if(e.queued=!1,e.followedPeerId=this.followedPeerIdsByFilePath.get(e.filePath),e.wrapper){this._updateEmbedLabel(e),this._attachWrapper(e);return}e.placeholder&&this.placeholderObserver?.observe(e.placeholder)}),this.hydrationPaused||this.hydrateVisibleEmbeds(),this.syncLayout()}hydrateVisibleEmbeds(){if(this.hydrationPaused)return;let e=this.isLargeDocument?180:420;this.embedEntries.forEach(t=>{t.wrapper||!t.placeholder?.isConnected||xa(t.placeholder,this.previewContainer,e)&&this._enqueueHydration(t,{prioritize:!0})})}updateTheme(e){this.embedEntries.forEach(t=>{this._postMessageToEntry(t,{source:`collabmd-host`,type:`set-theme`,theme:e})})}updateLocalUser(e){this.embedEntries.forEach(t=>{this._syncEntryUser(t,e)})}prepareFileDisconnect(e,{timeoutMs:t=250}={}){let n=this._findEntryByFilePath(e);if(!n?.iframe?.contentWindow)return Promise.resolve(!1);let r=`disconnect-${++this.disconnectRequestCounter}`;return new Promise(e=>{let i=t=>{if(!this.pendingDisconnectRequests.has(r))return;let n=this.pendingDisconnectRequests.get(r);window.clearTimeout(n.timeoutId),this.pendingDisconnectRequests.delete(r),e(t)},a=window.setTimeout(()=>{i(!1)},t);this.pendingDisconnectRequests.set(r,{entry:n,resolve:i,timeoutId:a}),this._postMessageToEntry(n,{source:`collabmd-host`,type:`prepare-disconnect`,requestId:r})})}_ensurePlaceholderObserver(){this.previewContainer&&(this.placeholderObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(!e.isIntersecting)return;let t=this.embedEntries.get(e.target.dataset.embedKey);t&&this._enqueueHydration(t)})},{root:this.previewContainer,rootMargin:this.isLargeDocument?`180px 0px`:`420px 0px`}))}_disconnectPlaceholderObserver(){this.placeholderObserver&&=(this.placeholderObserver.disconnect(),null)}_enqueueHydration(e,{prioritize:t=!1}={}){if(!(!e||e.wrapper||e.queued)&&(e.queued=!0,t?this.hydrationQueue.unshift(e.key):this.hydrationQueue.push(e.key),!this.hydrationPaused)){if(t&&!this.hydrationInProgress&&this.hydrationIdleId===null){this._flushHydrationQueue();return}this._scheduleHydration()}}_scheduleHydration(){this.hydrationPaused||this.hydrationInProgress||this.hydrationIdleId!==null||(this.hydrationIdleId=ya(()=>{this.hydrationIdleId=null,this._flushHydrationQueue()},pa))}async _flushHydrationQueue(){if(this.hydrationPaused||this.hydrationInProgress)return;let e=null;for(;this.hydrationQueue.length>0&&!e;){let t=this.hydrationQueue.shift(),n=this.embedEntries.get(t);if(!n||n.wrapper||!n.placeholder?.isConnected){n&&(n.queued=!1);continue}e=n}e&&(this.hydrationInProgress=!0,e.queued=!1,await this._hydrateEntry(e),this.hydrationInProgress=!1,this.hydrationQueue.length>0&&this._scheduleHydration())}async _hydrateEntry(e){if(!(!e.placeholder?.isConnected&&!e.wrapper)){if(!e.wrapper){let t=this._createEmbedContainer(e);e.wrapper=t.wrapper,e.iframe=t.iframe,e.labelElement=t.labelElement,e.instanceId=t.instanceId,e.isReady=!1,e.bootAttempts=(e.bootAttempts??0)+1,this._armEntryBootTimeout(e)}e.followedPeerId=this.followedPeerIdsByFilePath.get(e.filePath),this._updateEmbedLabel(e),this._attachWrapper(e)}}_attachWrapper(e){let t=e.placeholder?.isConnected?e.placeholder:this.previewElement?.querySelector(`.excalidraw-embed-placeholder[data-embed-key="${e.key}"]`);if(!t)return;if(e.placeholder=t,this._syncMountedEntryMetadata(e),this._shouldInlineFilePreview(e)){e.wrapper.style.position=``,e.wrapper.style.top=``,e.wrapper.style.left=``,e.wrapper.style.width=``,e.wrapper.style.margin=``,e.wrapper.style.pointerEvents=`auto`,t.replaceWith(e.wrapper),e.placeholder=null;return}let n=this._ensureOverlayRoot();n.hidden=!1,e.wrapper?.parentElement!==n&&n.appendChild(e.wrapper),this._syncEntryLayout(e)}_adoptReusableEntries(e,t){e.forEach((n,r)=>{if(n.wrapper||n.iframe)return;let i=t.findIndex(e=>e.filePath===n.filePath&&this._getEntryMode(e)===this._getEntryMode(n)&&(e.wrapper||e.iframe));if(i<0)return;let[a]=t.splice(i,1);a.filePath=n.filePath,a.key=n.key,a.label=n.label,a.placeholder=n.placeholder,a.queued=!1,a.reusedFromEmbed=this._isFilePreviewEntry(n),e.set(r,a)})}_destroyEntry(e){this.pendingDisconnectRequests.forEach((t,n)=>{t.entry===e&&(t.resolve(!1),this.pendingDisconnectRequests.delete(n))}),this.maximizedEmbed?.wrapper===e.wrapper&&this._exitMaximizedEmbed(),this._clearEntryBootTimeout(e),this._resetPlaceholderLayout(e),e.wrapper?.remove(),e.placeholder=null}_armEntryBootTimeout(e){this._clearEntryBootTimeout(e),e.bootTimerId=window.setTimeout(()=>{this._handleEntryBootTimeout(e)},ma)}_clearEntryBootTimeout(e){e?.bootTimerId&&(window.clearTimeout(e.bootTimerId),e.bootTimerId=null)}async _handleEntryBootTimeout(e){if(e?.iframe?.isConnected){if((e.bootAttempts??0)>=ga){this._clearEntryBootTimeout(e),this.toastController?.show(`Excalidraw embed timed out: ${e.label}`);return}await this._retryEntryBootstrap(e)}}async _retryEntryBootstrap(e){e&&(this._clearEntryBootTimeout(e),this._resetPlaceholderLayout(e),this.maximizedEmbed?.wrapper===e.wrapper&&this._exitMaximizedEmbed(),e.wrapper?.remove(),e.wrapper=null,e.iframe=null,e.labelElement=null,e.instanceId=null,e.isReady=!1,await this._hydrateEntry(e))}_findEntryByContentWindow(e){if(!e)return null;for(let t of this.embedEntries.values())if(t.iframe?.contentWindow===e)return t;return null}_findEntryByFilePath(e){if(!e)return null;for(let t of this.embedEntries.values())if(t.filePath===e)return t;return null}_updateEmbedLabel(e){e.labelElement&&(e.labelElement.textContent=e.label.replace(/\.excalidraw$/i,``))}_syncMountedEntryMetadata(e){e.wrapper&&(e.wrapper.dataset.embedKey=e.key,e.wrapper.dataset.file=e.filePath),e.iframe&&(e.iframe.title=`Excalidraw: ${e.filePath}`)}_buildIframeUrl(e){let t=new URL(T(va)),n=this.getTheme?.()||`dark`;t.searchParams.set(`file`,e.filePath),t.searchParams.set(`theme`,n),t.searchParams.set(`boot`,e.instanceId||``),this._isFilePreviewEntry(e)||t.searchParams.set(`mode`,`preview`);let r=this.getLocalUser?.();r?.name&&t.searchParams.set(`userName`,r.name),r?.color&&t.searchParams.set(`userColor`,r.color),r?.colorLight&&t.searchParams.set(`userColorLight`,r.colorLight),r?.peerId&&t.searchParams.set(`userPeerId`,r.peerId);let i=new URLSearchParams(window.location.search),a=i.get(`server`);return a&&t.searchParams.set(`server`,a),i.get(`test`)===`1`&&t.searchParams.set(`test`,`1`),i.has(`syncTimeoutMs`)&&t.searchParams.set(`syncTimeoutMs`,i.get(`syncTimeoutMs`)),t}_createEmbedContainer(e){let t=document.createElement(`div`);t.className=`excalidraw-embed diagram-preview-shell`,t.dataset.embedKey=e.key,t.dataset.file=e.filePath;let n=document.createElement(`div`);n.className=`excalidraw-embed-header diagram-preview-toolbar`;let r=document.createElement(`span`);r.className=`excalidraw-embed-icon`,r.innerHTML=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>`;let i=document.createElement(`span`);i.className=`excalidraw-embed-label`,i.textContent=e.label.replace(/\.excalidraw$/i,``);let a=document.createElement(`button`);a.type=`button`,a.className=`excalidraw-embed-btn ui-preview-action ui-preview-action--icon-only`,a.title=`Edit in Excalidraw`,a.setAttribute(`aria-label`,`Edit in Excalidraw`),z(a,`edit`);let o=document.createElement(`button`);o.type=`button`,o.className=`excalidraw-embed-btn ui-preview-action ui-preview-action--icon-only`,o.title=`Maximize diagram`,o.setAttribute(`aria-label`,`Maximize diagram`),z(o,`maximize`),n.append(r,i),this._isFilePreviewEntry(e)||n.append(a),n.append(o);let s=document.createElement(`iframe`);s.className=`excalidraw-embed-iframe`,s.dataset.instanceId=String(++this.instanceCounter),e.instanceId=s.dataset.instanceId,s.src=this._buildIframeUrl(e).toString(),s.setAttribute(`loading`,`eager`),s.title=`Excalidraw: ${e.filePath}`,s.style.height=`${fa}px`;let c=document.createElement(`div`);c.className=`excalidraw-embed-resizer`,c.title=`Drag to resize`,this._setupResizer(c,s,()=>this._syncEntryLayout(e)),t.append(n,s,c);let l=!1,u=`${fa}px`,d=()=>{z(o,l?`restore`:`maximize`),o.title=l?`Restore diagram size`:`Maximize diagram`,o.setAttribute(`aria-label`,l?`Restore diagram size`:`Maximize diagram`)},f=()=>{l&&(l=!1,t.classList.remove(`is-maximized`),d(),document.body.classList.remove(`excalidraw-maximized-open`),this._restoreWrapperMount(e),s.style.height=u,this.maximizedEmbed?.wrapper===t&&(this.maximizedEmbed=null),this._syncEntryLayout(e))},p=()=>{l||(this._exitMaximizedEmbed(),l=!0,u=s.style.height||`${fa}px`,this._mountWrapperInMaximizedRoot(e),t.classList.add(`is-maximized`),d(),document.body.classList.add(`excalidraw-maximized-open`),this.maximizedEmbed={wrapper:t,exit:f},this._syncEntryLayout(e))};return o.addEventListener(`click`,()=>{l?f():p()}),a.addEventListener(`click`,()=>{this.onOpenFile?.(e.filePath)}),d(),{iframe:s,instanceId:s.dataset.instanceId,labelElement:i,wrapper:t}}_setupResizer(e,t,n=null){let r=0,i=0,a=e=>{let n=e.clientY-r,a=Math.min(Math.max(i+n,_a),ha);t.style.height=`${a}px`,t.style.pointerEvents=`none`},o=()=>{t.style.pointerEvents=``,document.removeEventListener(`pointermove`,a),document.removeEventListener(`pointerup`,o),n?.()};e.addEventListener(`pointerdown`,e=>{e.preventDefault(),r=e.clientY,i=t.offsetHeight,document.addEventListener(`pointermove`,a),document.addEventListener(`pointerup`,o)})}_ensureOverlayRoot(){if(this.overlayRoot?.isConnected&&this.overlayRoot.parentElement===this.previewElement)return this.overlayRoot;let e=this.previewElement?.querySelector(`[data-excalidraw-overlay-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.excalidrawOverlayRoot=`true`,e.className=`excalidraw-embed-overlay-root`,this.previewElement?.appendChild(e)),this.overlayRoot=e,e}_ensureMaximizedRoot(){if(this.maximizedRoot?.isConnected&&this.maximizedRoot.parentElement===document.body)return this.maximizedRoot;let e=document.body.querySelector(`[data-excalidraw-maximized-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.excalidrawMaximizedRoot=`true`,e.className=`excalidraw-maximized-root`,document.body.appendChild(e)),this.maximizedRoot=e,e}_isFilePreviewEntry(e){return e?.key===`${e?.filePath}#file-preview`}_getEntryMode(e){return this._isFilePreviewEntry(e)?`edit`:`preview`}_shouldInlineFilePreview(e){return this._isFilePreviewEntry(e)&&!e?.reusedFromEmbed}_resetPlaceholderLayout(e){!e?.placeholder?.isConnected||this._shouldInlineFilePreview(e)||(e.placeholder.classList.remove(`is-hydrated`),e.placeholder.removeAttribute(`data-embed-hydrated`),e.placeholder.style.height=``,e.placeholder.style.pointerEvents=``)}_mountWrapperInMaximizedRoot(e){if(!e?.wrapper)return;let t=this._ensureMaximizedRoot();t.hidden=!1,e.restoreParent=e.wrapper.parentElement||null,e.restoreNextSibling=e.wrapper.nextSibling||null,e.wrapper.style.position=``,e.wrapper.style.top=``,e.wrapper.style.left=``,e.wrapper.style.width=``,e.wrapper.style.margin=``,e.wrapper.parentElement!==t&&t.appendChild(e.wrapper)}_restoreWrapperMount(e){if(e?.wrapper){if(this._shouldInlineFilePreview(e)){let{restoreParent:t,restoreNextSibling:n}=e;t?.isConnected&&(n?.parentElement===t?t.insertBefore(e.wrapper,n):t.appendChild(e.wrapper))}else{let t=this._ensureOverlayRoot();t.hidden=!1,e.wrapper.parentElement!==t&&t.appendChild(e.wrapper)}e.restoreParent=null,e.restoreNextSibling=null,this.maximizedRoot&&this.maximizedRoot.childElementCount===0&&(this.maximizedRoot.hidden=!0)}}_syncEntryLayout(e){if(!e?.wrapper||this._shouldInlineFilePreview(e))return;let t=e.placeholder?.isConnected?e.placeholder:this.previewElement?.querySelector(`.excalidraw-embed-placeholder[data-embed-key="${e.key}"]`);if(!t)return;e.placeholder=t,t.classList.add(`is-hydrated`),t.dataset.embedHydrated=`true`,t.style.pointerEvents=`none`,this._isFilePreviewEntry(e)&&t.childElementCount>0&&t.replaceChildren();let n=e.wrapper.classList.contains(`is-maximized`),r=e.wrapper.querySelector(`.excalidraw-embed-header`)?.offsetHeight||0,i=e.iframe?.offsetHeight||Number.parseFloat(e.iframe?.style.height||``)||fa,a=n?0:e.wrapper.querySelector(`.excalidraw-embed-resizer`)?.offsetHeight||0,o=Math.ceil(r+i+a);if(n||(e.inlineHeightPx=o),t.style.height=`${Math.ceil(e.inlineHeightPx||o||fa)}px`,e.wrapper.style.pointerEvents=`auto`,n){e.wrapper.style.position=``,e.wrapper.style.top=``,e.wrapper.style.left=``,e.wrapper.style.width=``,e.wrapper.style.margin=``;return}e.wrapper.style.position=`absolute`,e.wrapper.style.top=`${t.offsetTop}px`,e.wrapper.style.left=`${t.offsetLeft}px`,e.wrapper.style.width=`${t.offsetWidth}px`,e.wrapper.style.margin=`0`}syncLayout(){this.embedEntries.forEach(e=>{e.wrapper&&!this._shouldInlineFilePreview(e)&&this._syncEntryLayout(e)})}_onPreviewClick(e){let t=e.target.closest(`.excalidraw-embed-placeholder-btn`);if(!t)return;e.preventDefault();let n=this.embedEntries.get(t.dataset.embedKey);n&&this._hydrateEntry(n)}_onMessage(e){if(e.origin!==window.location.origin)return;let t=e.data;if(!t||t.source!==`excalidraw-editor`)return;let n=this._findEntryByContentWindow(e.source);if(n){if(t.type===`ready`){n.isReady=!0,this._clearEntryBootTimeout(n),this._syncEntryUser(n),this._postMessageToEntry(n,{source:`collabmd-host`,type:`set-theme`,theme:this.getTheme?.()||`dark`}),this._syncEntryFollowState(n);return}if(t.type===`error`){n.isReady=!1,this._handleEntryBootTimeout(n);return}if(t.type===`disconnect-ready`){let e=this.pendingDisconnectRequests.get(t.requestId);e?.entry===n&&e.resolve(!0)}}}_onKeyDown(e){e.key===`Escape`&&this._exitMaximizedEmbed()}_exitMaximizedEmbed(){this.maximizedEmbed?.exit&&this.maximizedEmbed.exit(),this.maximizedEmbed=null,document.body.classList.remove(`excalidraw-maximized-open`)}_postMessageToEntry(e,t){e?.iframe?.contentWindow?.postMessage(t,window.location.origin)}_syncEntryUser(e,t=null){let n=t||this.getLocalUser?.();n&&this._postMessageToEntry(e,{source:`collabmd-host`,type:`set-user`,user:{color:n.color||``,colorLight:n.colorLight||``,name:n.name||``,peerId:n.peerId||``}})}_syncEntryFollowState(e){!e?.isReady||e.followedPeerId===void 0||this._postMessageToEntry(e,{source:`collabmd-host`,type:`follow-user`,peerId:e.followedPeerId})}};function Ca(){return typeof window>`u`||typeof window.matchMedia!=`function`?{matches:!1}:window.matchMedia(`(max-width: 768px)`)}function wa(e){return typeof HTMLElement>`u`||!(e instanceof HTMLElement)?[]:Array.from(e.querySelectorAll(`.create-menu-item`))}var Ta=class{constructor({mobileBreakpointQuery:e=Ca()}={}){this.mobileBreakpointQuery=e,this.activeAnchor=null,this.desktopMenu=null,this.mobileBackdrop=null,this.mobileSheet=null,this.documentPointerDownHandler=null,this.windowResizeHandler=null,this.boundClose=()=>this.close()}isMobileViewport(){return!!this.mobileBreakpointQuery?.matches}isOpen(){return!!(this.desktopMenu||this.mobileSheet)}toggle(e={}){if(this.isOpen()){this.close();return}this.open(e)}open({anchor:e=null,items:t=[],title:n=`Create`}={}){if(this.close({restoreFocus:!1}),!(!Array.isArray(t)||t.length===0)){if(this.activeAnchor=typeof HTMLElement<`u`&&e instanceof HTMLElement?e:null,this.activeAnchor?.setAttribute(`aria-expanded`,`true`),this.isMobileViewport()){this.openMobileSheet({items:t,title:n});return}this.openDesktopMenu({anchor:this.activeAnchor,items:t,title:n})}}close({restoreFocus:e=!0}={}){this.desktopMenu&&=(this.desktopMenu.remove(),null),this.mobileBackdrop&&=(this.mobileBackdrop.remove(),null),this.mobileSheet&&=(this.mobileSheet.remove(),null),this.documentPointerDownHandler&&=(document.removeEventListener(`pointerdown`,this.documentPointerDownHandler),null),this.windowResizeHandler&&typeof window<`u`&&window.removeEventListener(`resize`,this.windowResizeHandler),this.windowResizeHandler=null;let t=this.activeAnchor;this.activeAnchor?.setAttribute(`aria-expanded`,`false`),this.activeAnchor=null,e&&t?.focus?.()}openDesktopMenu({anchor:e,items:t,title:n}){let r=document.createElement(`div`);r.className=`create-menu`,r.setAttribute(`role`,`menu`),r.setAttribute(`aria-label`,n),this.renderMenuItems(r,t),document.body.appendChild(r),this.positionDesktopMenu(r,e),r.addEventListener(`keydown`,e=>{this.handleDesktopMenuKeyDown(e,r)}),this.documentPointerDownHandler=t=>{r.contains(t.target)||e?.contains?.(t.target)||this.close()},this.windowResizeHandler=this.boundClose,setTimeout(()=>{document.addEventListener(`pointerdown`,this.documentPointerDownHandler)},0),typeof window<`u`&&window.addEventListener(`resize`,this.windowResizeHandler),this.desktopMenu=r,wa(r)[0]?.focus()}openMobileSheet({items:e,title:t}){let n=document.createElement(`button`);n.type=`button`,n.className=`file-action-sheet-backdrop`,n.setAttribute(`aria-label`,`Close ${t.toLowerCase()} menu`);let r=document.createElement(`div`);r.className=`file-action-sheet create-action-sheet`;let i=document.createElement(`div`);i.className=`create-action-sheet-header`,i.textContent=t,r.appendChild(i),this.renderMenuItems(r,e,{mobile:!0});let a=document.createElement(`button`);a.type=`button`,a.className=G({variant:`ghost`,extra:[`file-action-sheet-item`,`create-action-sheet-cancel`]}),a.textContent=`Cancel`,a.addEventListener(`click`,()=>{this.close()}),r.appendChild(a),n.addEventListener(`click`,()=>{this.close()}),document.body.append(n,r),this.mobileBackdrop=n,this.mobileSheet=r}renderMenuItems(e,t,{mobile:n=!1}={}){let r=null;t.forEach(t=>{if(t.group&&t.group!==r){let i=document.createElement(`div`);i.className=n?`create-action-sheet-group`:`create-menu-group`,i.textContent=t.group,e.appendChild(i),r=t.group}let i=document.createElement(`button`);i.type=`button`,i.className=n?G({variant:`ghost`,extra:[`file-action-sheet-item`,`create-action-sheet-item`,`create-action-sheet-option`]}):`create-menu-item`,i.setAttribute(`role`,n?`button`:`menuitem`),i.dataset.actionId=t.id;let a=document.createElement(`span`);a.className=`create-menu-item-icon`,a.setAttribute(`aria-hidden`,`true`),a.innerHTML=t.icon||``,i.appendChild(a);let o=document.createElement(`span`);o.className=`create-menu-item-copy`;let s=document.createElement(`span`);s.className=`create-menu-item-label`,s.textContent=t.label,o.appendChild(s);let c=t.meta||t.hint;if(c){let e=document.createElement(`span`);e.className=`create-menu-item-meta`,e.textContent=c,o.appendChild(e)}i.appendChild(o),i.addEventListener(`click`,()=>{this.close({restoreFocus:!1}),t.onSelect?.()}),e.appendChild(i)})}positionDesktopMenu(e,t){let n=e.getBoundingClientRect(),r=t?.getBoundingClientRect?.(),i=r?.left??8,a=Math.max(8,window.innerWidth-n.width-8),o=Math.max(8,Math.min(i,a)),s=(r?.bottom??8)+8,c=window.innerHeight-n.height-8;s>c&&r&&(s=Math.max(8,r.top-n.height-8)),e.style.left=`${o}px`,e.style.top=`${Math.max(8,s)}px`}handleDesktopMenuKeyDown(e,t){let n=wa(t);if(n.length===0)return;let r=Math.max(0,n.indexOf(document.activeElement));switch(e.key){case`ArrowDown`:e.preventDefault(),n[(r+1)%n.length]?.focus();break;case`ArrowUp`:e.preventDefault(),n[(r-1+n.length)%n.length]?.focus();break;case`Home`:e.preventDefault(),n[0]?.focus();break;case`End`:e.preventDefault(),n[n.length-1]?.focus();break;case`Escape`:e.preventDefault(),this.close();break;case`Tab`:this.close({restoreFocus:!1});break}}};function Ea(e){return String(e??``).replace(/\/+$/u,``).split(`/`).filter(Boolean).pop()||``}function Da(e,t,n){return e===t?n:`${n}${e.slice(t.length)}`}function Oa(e,t,n){return`${e} ${e===1?t:n}`}function ka(){return JSON.stringify({type:`excalidraw`,version:2,source:`collabmd`,elements:[],appState:{viewBackgroundColor:`#ffffff`,gridSize:null},files:{}})}function Aa(e,t){return t?{...e,requestId:t}:e}var ja=class{constructor({mobileBreakpointQuery:e=typeof window<`u`&&typeof window.matchMedia==`function`?window.matchMedia(`(max-width: 768px)`):{matches:!1},onFileDelete:t,onFileSelect:n,pendingWorkspaceRequestIds:r=null,state:i,toastController:a,vaultClient:o,view:s,refresh:c}){this.onFileDelete=t,this.onFileSelect=n,this.pendingWorkspaceRequestIds=r,this.state=i,this.toastController=a,this.vaultClient=o,this.view=s,this.refresh=c,this.createButton=document.getElementById(`sidebarCreateBtn`),this.refreshButton=document.getElementById(`refreshFilesBtn`),this.actionDialog=document.getElementById(`fileActionDialog`),this.actionForm=document.getElementById(`fileActionForm`),this.actionTitle=document.getElementById(`fileActionTitle`),this.actionCopy=document.getElementById(`fileActionCopy`),this.actionField=document.getElementById(`fileActionField`),this.actionLabel=document.getElementById(`fileActionLabel`),this.actionInput=document.getElementById(`fileActionInput`),this.actionHint=document.getElementById(`fileActionHint`),this.actionNote=document.getElementById(`fileActionNote`),this.actionCancelButton=document.getElementById(`fileActionCancel`),this.actionSubmitButton=document.getElementById(`fileActionSubmit`),this.createMenu=new Ta({mobileBreakpointQuery:e}),this.pendingAction=null,this.actionBusy=!1}initialize(){this.createButton?.addEventListener(`click`,()=>{this.openRootCreateMenu({anchor:this.createButton})}),this.refreshButton?.addEventListener(`click`,()=>this.refresh()),this.actionCancelButton?.addEventListener(`click`,()=>this.closeActionDialog()),this.actionForm?.addEventListener(`submit`,e=>{e.preventDefault(),this.handleActionSubmit()}),this.actionDialog?.addEventListener(`close`,()=>this.resetActionDialog())}getCreateActions({parentDir:e=``}={}){return[{contextLabel:`New markdown file`,group:`Note`,hint:`Markdown`,icon:this.getCreateActionIcon(`markdown`),id:`markdown`,label:`Markdown note`,meta:`.md`,onSelect:()=>this.handleNewFile({parentDir:e})},{contextLabel:`New Excalidraw drawing`,group:`Diagram`,hint:`Excalidraw`,icon:this.getCreateActionIcon(`excalidraw`),id:`excalidraw`,label:`Excalidraw drawing`,meta:`.excalidraw`,onSelect:()=>this.handleNewDrawing({parentDir:e})},{contextLabel:`New draw.io diagram`,group:`Diagram`,hint:`draw.io`,icon:this.getCreateActionIcon(`drawio`),id:`drawio`,label:`draw.io diagram`,meta:`.drawio`,onSelect:()=>this.handleNewDrawio({parentDir:e})},{contextLabel:`New Mermaid diagram`,group:`Diagram`,hint:`Mermaid`,icon:this.getCreateActionIcon(`mermaid`),id:`mermaid`,label:`Mermaid diagram`,meta:`.mmd`,onSelect:()=>this.handleNewMermaid({parentDir:e})},{contextLabel:`New PlantUML diagram`,group:`Diagram`,hint:`PlantUML`,icon:this.getCreateActionIcon(`plantuml`),id:`plantuml`,label:`PlantUML diagram`,meta:`.puml`,onSelect:()=>this.handleNewPlantUml({parentDir:e})},{contextLabel:`New folder`,group:`Structure`,hint:`Folder`,icon:this.getCreateActionIcon(`folder`),id:`folder`,label:`Folder`,meta:`folder`,onSelect:()=>this.handleNewFolder({parentDir:e})}]}createContextMenuItems(e=``){return this.getCreateActions({parentDir:e}).map(e=>({label:e.contextLabel,onSelect:e.onSelect}))}getDirectoryContextMenuItems(e){return[...this.createContextMenuItems(e),{label:`Rename / move`,onSelect:()=>this.handleRenameDirectory(e)},{label:`Delete`,danger:!0,onSelect:()=>this.handleDeleteDirectory(e)}]}getFileContextMenuItems(e){return[{label:`Rename / move`,onSelect:()=>this.handleRenameFile(e)},{label:`Delete`,danger:!0,onSelect:()=>this.handleDelete(e)}]}showToast(e){e&&this.toastController?.show(String(e))}getCreateActionIcon(e){switch(e){case`drawio`:case`plantuml`:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`;case`excalidraw`:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>`;case`folder`:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>`;case`mermaid`:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 7.5c0-1.38 1.12-2.5 2.5-2.5 1.04 0 1.93.64 2.3 1.56A2.5 2.5 0 0 1 14 8.5v1"/><path d="M19 16.5c0 1.38-1.12 2.5-2.5 2.5-1.04 0-1.93-.64-2.3-1.56A2.5 2.5 0 0 1 10 15.5v-1"/><path d="M8 10.5h8"/><path d="M8 13.5h8"/><path d="M10 8.5v7"/><path d="M14 8.5v7"/></svg>`;default:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>`}}showError(e,t){this.showToast(t?.message?`${e}: ${t.message}`:e)}ensureExtension(e,t){return Ae(e,t)}createPendingWorkspaceRequestId(){if(!this.pendingWorkspaceRequestIds)return null;let e=ft();return this.pendingWorkspaceRequestIds.add(e),e}clearPendingWorkspaceRequestId(e){e&&this.pendingWorkspaceRequestIds?.delete(e)}async runWorkspaceMutation(e){let t=this.createPendingWorkspaceRequestId();try{return await e(t)}catch(e){throw this.clearPendingWorkspaceRequestId(t),e}}openActionDialog({title:e,copy:t,label:n=`Path`,hint:r=``,note:i=``,placeholder:a=``,value:o=``,submitLabel:s=`Save`,destructive:c=!1,requiresInput:l=!0,emptyMessage:u=`A value is required`,onSubmit:d}){!this.actionDialog||!this.actionTitle||!this.actionCopy||!this.actionSubmitButton||!this.actionCancelButton||l&&!this.actionInput||(this.actionDialog.open&&(typeof this.actionDialog.close==`function`?this.actionDialog.close():(this.actionDialog.removeAttribute(`open`),this.resetActionDialog())),this.pendingAction={requiresInput:l,emptyMessage:u,onSubmit:d},this.createMenu.close({restoreFocus:!1}),this.view?.removeContextMenu?.(),this.actionTitle.textContent=e,this.actionCopy.textContent=t,this.actionField&&(this.actionField.hidden=!l),this.actionLabel&&(this.actionLabel.textContent=n),this.actionInput&&(this.actionInput.value=o,this.actionInput.placeholder=a,this.actionInput.required=l,this.actionInput.disabled=!1),this.actionHint&&(this.actionHint.textContent=r,this.actionHint.hidden=!l||!r),this.actionNote&&(this.actionNote.textContent=i,this.actionNote.hidden=!i,this.actionNote.classList.toggle(`is-danger`,c)),this.actionSubmitButton.textContent=s,this.actionSubmitButton.disabled=!1,this.actionSubmitButton.classList.toggle(`ui-button--primary`,!c),this.actionSubmitButton.classList.toggle(`ui-button--danger`,c),this.actionCancelButton.disabled=!1,typeof this.actionDialog.showModal==`function`?this.actionDialog.showModal():this.actionDialog.setAttribute(`open`,`true`),requestAnimationFrame(()=>{if(!l||!this.actionInput){this.actionSubmitButton.focus();return}this.actionInput.focus(),o&&this.actionInput.select()}))}resetActionDialog(){this.pendingAction=null,this.actionBusy=!1,this.actionField&&(this.actionField.hidden=!1),this.actionLabel&&(this.actionLabel.textContent=`Path`),this.actionInput&&(this.actionInput.value=``,this.actionInput.placeholder=``,this.actionInput.required=!0,this.actionInput.disabled=!1),this.actionHint&&(this.actionHint.textContent=``,this.actionHint.hidden=!0),this.actionNote&&(this.actionNote.textContent=``,this.actionNote.hidden=!0,this.actionNote.classList.remove(`is-danger`)),this.actionSubmitButton&&(this.actionSubmitButton.textContent=`Save`,this.actionSubmitButton.disabled=!1,this.actionSubmitButton.className=G({variant:`primary`})),this.actionCancelButton&&(this.actionCancelButton.disabled=!1)}closeActionDialog(){if(this.actionDialog){if(this.actionDialog.open&&typeof this.actionDialog.close==`function`){this.actionDialog.close();return}this.actionDialog.removeAttribute(`open`),this.resetActionDialog()}}setActionDialogBusy(e){this.actionBusy=e,this.actionInput&&(this.actionInput.disabled=e||!(this.pendingAction?.requiresInput??!0)),this.actionCancelButton&&(this.actionCancelButton.disabled=e),this.actionSubmitButton&&(this.actionSubmitButton.disabled=e)}async handleActionSubmit(){if(!this.pendingAction?.onSubmit||this.actionBusy)return;let e=this.pendingAction.requiresInput,t=e?this.actionInput?.value.trim()??``:void 0;if(e&&!t){this.showToast(this.pendingAction.emptyMessage),this.actionInput?.focus();return}this.setActionDialogBusy(!0);let n;try{n=await this.pendingAction.onSubmit(t)}catch(e){this.showError(`Failed to complete action`,e)}if(this.setActionDialogBusy(!1),n!==!1){this.closeActionDialog();return}e&&this.actionInput&&(this.actionInput.focus(),this.actionInput.select())}async createVaultFile(e,t,{openAfterCreate:n=!1,errorMessage:r=`Failed to create file`}={}){try{return await this.runWorkspaceMutation(n=>this.vaultClient.createFile(Aa({content:t,path:e},n))),this.state.expandDirectoryPath(e,{includeLeaf:!1}),await this.refresh(),n&&this.onFileSelect?.(e),!0}catch(e){return this.showToast(e?.message||r),!1}}async createDirectory(e){let t=B(e);if(!t)return this.showToast(`Folder path is required`),!1;try{return await this.runWorkspaceMutation(e=>this.vaultClient.createDirectory(t,Aa({},e))),this.state.expandDirectoryPath(t),await this.refresh(),!0}catch(e){return this.showToast(e?.message||`Failed to create folder`),!1}}async renameVaultFile(e,t,n){let r=B(t);if(!r)return this.showToast(`File path is required`),!1;let i=o(r);if(i&&i.toLowerCase()!==String(n??``).toLowerCase())return this.showToast(`File type changes are not supported during rename. Keep the ${n} extension.`),!1;let a=i?r:`${r}${n}`;if(!Ea(a))return this.showToast(`File path is required`),!1;if(a===e)return!0;try{return await this.runWorkspaceMutation(t=>this.vaultClient.renameFile(Aa({newPath:a,oldPath:e},t))),this.state.expandDirectoryPath(a,{includeLeaf:!1}),await this.refresh(),this.state.activeFilePath===e&&(this.state.activeFilePath=a,this.onFileSelect?.(a)),!0}catch(e){return this.showToast(e?.message||`Failed to rename`),!1}}async renameDirectory(e,t){let n=B(t);if(!n)return this.showToast(`Folder path is required`),!1;if(n===e)return!0;try{if(await this.runWorkspaceMutation(t=>this.vaultClient.renameDirectory(Aa({newPath:n,oldPath:e},t))),this.state.replaceExpandedDirectoryPrefix(e,n),this.state.expandDirectoryPath(n),await this.refresh(),this.state.activeFilePath&&this.state.activeFilePath.startsWith(`${e}/`)){let t=Da(this.state.activeFilePath,e,n);this.state.activeFilePath=t,this.onFileSelect?.(t)}return!0}catch(e){return this.showToast(e?.message||`Failed to rename folder`),!1}}async deleteVaultFile(e){try{return await this.runWorkspaceMutation(t=>this.vaultClient.deleteFile(e,Aa({},t))),await this.refresh(),this.state.activeFilePath===e&&(this.state.activeFilePath=null,this.onFileDelete?.(e)),!0}catch(e){return this.showToast(e?.message||`Failed to delete`),!1}}async deleteDirectory(e,{recursive:t=!1}={}){try{await this.runWorkspaceMutation(n=>this.vaultClient.deleteDirectory(e,Aa({recursive:t},n)));let n=this.state.activeFilePath;return await this.refresh(),this.state.removeExpandedDirectoryPrefix(e),n&&n.startsWith(`${e}/`)&&(this.state.activeFilePath=null,this.onFileDelete?.(n)),!0}catch(e){return this.showToast(e?.message||`Failed to delete folder`),!1}}getCreateContext(e=``){let t=B(e);return{hintPrefix:t?`Use "/" to create nested items under this folder.`:`Use "/" to place it inside a folder.`,inputLabelSuffix:t?`name or path`:`path`,note:t?`Parent folder: ${t}`:``,normalizedParentDir:t}}openRootCreateMenu({anchor:e=this.createButton}={}){this.openCreateMenu({anchor:e,parentDir:``})}openCreateMenu({anchor:e=this.createButton,parentDir:t=``}={}){this.view?.removeContextMenu?.(),this.createMenu.toggle({anchor:e,items:this.getCreateActions({parentDir:t}),title:`Create`})}handleNewFile({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create markdown file`,copy:t.normalizedParentDir?`Add a new note inside the selected folder. It opens immediately after creation.`:`Add a new note to the vault. It opens immediately after creation.`,label:`File ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".md" is added automatically.`,note:t.note,placeholder:t.normalizedParentDir?`my-note`:`notes/my-note`,submitLabel:`Create file`,emptyMessage:`File path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`File path is required`),!1;let r=this.ensureExtension(ke(t.normalizedParentDir,n),`.md`);return this.createVaultFile(r,je(r),{errorMessage:`Failed to create file`,openAfterCreate:!0})}})}handleNewFolder({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create folder`,copy:t.normalizedParentDir?`Add a new folder inside the selected folder.`:`Add a new folder to organize notes and diagrams.`,label:`Folder ${t.inputLabelSuffix}`,hint:t.hintPrefix,note:t.note,placeholder:t.normalizedParentDir?`archive`:`notes/archive`,submitLabel:`Create folder`,emptyMessage:`Folder path is required`,onSubmit:e=>this.createDirectory(ke(t.normalizedParentDir,e))})}handleNewDrawing({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create Excalidraw drawing`,copy:t.normalizedParentDir?`Start a new drawing inside the selected folder.`:`Start a new drawing file in the vault.`,label:`Drawing ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".excalidraw" is added automatically.`,note:t.note,placeholder:t.normalizedParentDir?`architecture`:`diagrams/architecture`,submitLabel:`Create drawing`,emptyMessage:`Drawing path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`Drawing path is required`),!1;let r=this.ensureExtension(ke(t.normalizedParentDir,n),`.excalidraw`);return this.createVaultFile(r,ka(),{errorMessage:`Failed to create drawing`,openAfterCreate:!0})}})}handleNewMermaid({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create Mermaid diagram`,copy:t.normalizedParentDir?"Create a new `.mmd` or `.mermaid` file inside the selected folder.":"Create a new `.mmd` or `.mermaid` file with starter diagram content.",label:`Diagram ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".mmd" is added automatically unless you enter ".mermaid".`,note:t.note,placeholder:t.normalizedParentDir?`flow`:`diagrams/flow`,submitLabel:`Create diagram`,emptyMessage:`Diagram path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`Diagram path is required`),!1;let r=Me(ke(t.normalizedParentDir,n));return this.createVaultFile(r.path,r.content,{errorMessage:`Failed to create Mermaid diagram`,openAfterCreate:!0})}})}handleNewDrawio({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create draw.io diagram`,copy:t.normalizedParentDir?"Create a new `.drawio` diagram inside the selected folder.":"Create a new `.drawio` diagram with a native starter document.",label:`Diagram ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".drawio" is added automatically.`,note:t.note,placeholder:t.normalizedParentDir?`architecture`:`diagrams/architecture`,submitLabel:`Create diagram`,emptyMessage:`Diagram path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`Diagram path is required`),!1;let r=Ne(ke(t.normalizedParentDir,n));return this.createVaultFile(r.path,r.content,{errorMessage:`Failed to create draw.io diagram`,openAfterCreate:!0})}})}handleNewPlantUml({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create PlantUML diagram`,copy:t.normalizedParentDir?"Create a new `.puml` or `.plantuml` file inside the selected folder.":"Create a new `.puml` or `.plantuml` file with starter diagram content.",label:`Diagram ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".puml" is added automatically unless you enter ".plantuml".`,note:t.note,placeholder:t.normalizedParentDir?`sequence-flow`:`diagrams/sequence-flow`,submitLabel:`Create diagram`,emptyMessage:`Diagram path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`Diagram path is required`),!1;let r=Pe(ke(t.normalizedParentDir,n));return this.createVaultFile(r.path,r.content,{errorMessage:`Failed to create PlantUML diagram`,openAfterCreate:!0})}})}handleRenameFile(e){let t=o(e)||`.md`;this.openActionDialog({title:`Rename or move file`,copy:`Update the relative path without changing the file type.`,label:`Path`,hint:`Use "/" to move the file into another folder. ${t} is kept automatically.`,value:e,submitLabel:`Save file path`,emptyMessage:`File path is required`,onSubmit:n=>this.renameVaultFile(e,n,t)})}handleRenameDirectory(e){this.openActionDialog({title:`Rename or move folder`,copy:`Update the relative path for this folder and everything inside it.`,label:`Path`,hint:`Use "/" to move the folder into another location in the vault.`,value:e,submitLabel:`Save folder path`,emptyMessage:`Folder path is required`,onSubmit:t=>this.renameDirectory(e,t)})}handleDelete(e){this.openActionDialog({title:`Delete file`,copy:`This permanently removes the file from the vault.`,note:e,submitLabel:`Delete file`,destructive:!0,requiresInput:!1,onSubmit:()=>this.deleteVaultFile(e)})}handleDeleteDirectory(e){let{directoryCount:t,fileCount:n}=this.state.getDirectoryDescendantSummary(e),r=t>0||n>0,i=r?`This will permanently remove ${Oa(n,`file`,`files`)} and ${Oa(t,`nested folder`,`nested folders`)} inside this folder.`:`This permanently removes the empty folder from the vault.`;this.openActionDialog({title:r?`Delete folder and contents`:`Delete folder`,copy:i,note:e,submitLabel:r?`Delete folder and contents`:`Delete folder`,destructive:!0,requiresInput:!1,onSubmit:()=>this.deleteDirectory(e,{recursive:r})})}};function Ma(e,t=[],n=[]){for(let r of e)if(!(!r?.path||!r?.type)){if(n.push({name:r.name,path:r.path,type:r.type}),r.type===`file`||r.type===`excalidraw`||r.type===`drawio`||r.type===`mermaid`||r.type===`plantuml`||r.type===`image`){t.push(r.path);continue}r.type===`directory`&&Array.isArray(r.children)&&Ma(r.children,t,n)}return{files:t,searchEntries:n}}function Na(e,t){for(let n of e??[]){if(n?.path===t)return n;if(n?.type===`directory`&&Array.isArray(n.children)){let e=Na(n.children,t);if(e)return e}}return null}function Pa(e){let t=0,n=0;for(let r of e?.children??[]){if(r?.type===`directory`){t+=1;let e=Pa(r);t+=e.directoryCount,n+=e.fileCount;continue}n+=1}return{directoryCount:t,fileCount:n}}function Fa(e,t,n){return e===t?n:`${n}${e.slice(t.length)}`}var Ia=class{constructor(){this.tree=[],this.flatFiles=[],this.flatSearchEntries=[],this.activeFilePath=null,this.expandedDirs=new Set,this.searchQuery=``}setTree(e){this.tree=Array.isArray(e)?e:[];let t=Ma(this.tree,[],[]);this.flatFiles=t.files,this.flatSearchEntries=t.searchEntries}setSearchQuery(e){this.searchQuery=String(e??``).trim().toLowerCase()}getSearchMatches(){return this.searchQuery?this.flatSearchEntries.filter(e=>e.path.toLowerCase().includes(this.searchQuery)):[]}getNode(e){return Na(this.tree,e)}getDirectoryDescendantSummary(e){let t=this.getNode(e);return!t||t.type!==`directory`?{directoryCount:0,fileCount:0}:Pa(t)}setActiveFile(e){this.activeFilePath=e||null,e&&this.expandDirectoryPath(e,{includeLeaf:!1})}toggleDirectory(e){return this.expandedDirs.has(e)?(this.expandedDirs.delete(e),!1):(this.expandedDirs.add(e),!0)}expandDirectoryPath(e,{includeLeaf:t=!0}={}){let n=B(e);if(!n)return;let r=n.split(`/`),i=t?r.length:Math.max(r.length-1,0),a=``;for(let e=0;e<i;e+=1)a=a?`${a}/${r[e]}`:r[e],this.expandedDirs.add(a)}replaceExpandedDirectoryPrefix(e,t){let n=new Set;this.expandedDirs.forEach(r=>{if(r===e||r.startsWith(`${e}/`)){n.add(Fa(r,e,t));return}n.add(r)}),this.expandedDirs=n}removeExpandedDirectoryPrefix(e){let t=new Set;this.expandedDirs.forEach(n=>{n===e||n.startsWith(`${e}/`)||t.add(n)}),this.expandedDirs=t}};function La(e){return String(e??``).replace(/\/+$/u,``).split(`/`).filter(Boolean).pop()||``}function Ra(e){let t=String(e??``).replace(/\/+$/u,``),n=t.lastIndexOf(`/`);return n>=0?t.slice(0,n):``}function za(e=[],t=``){for(let n of e){if(n.path===t)return n;if(n.type===`directory`&&Array.isArray(n.children)){let e=za(n.children,t);if(e)return e}}return null}var Ba=420,Va=10,Ha=class{constructor({mobileBreakpointQuery:e=window.matchMedia(`(max-width: 768px)`),onDirectorySelect:t,onDirectoryToggle:n,onFileContextMenu:r,onFileSelect:i,onSearchChange:a,onTreeContextMenu:o}){this.onDirectorySelect=t,this.onDirectoryToggle=n,this.onFileContextMenu=r,this.onFileSelect=i,this.onSearchChange=a,this.onTreeContextMenu=o,this.mobileBreakpointQuery=e,this.treeContainer=document.getElementById(`fileTree`),this.searchInput=document.getElementById(`fileSearchInput`),this.renderedDirectoryWrappers=new Map,this.renderedChildContainers=new Map,this.lastRenderMode=`tree`,this.longPressTimer=0,this.longPressContext=null,this.suppressedActivationTarget=null,this.contextMenuCloseHandler=null,this.actionSheetCloseHandler=null}initialize(){this.searchInput?.addEventListener(`input`,e=>{this.onSearchChange?.(e.target.value)}),this.treeContainer?.addEventListener(`contextmenu`,e=>{e.target.closest(`.file-tree-item`)||(e.preventDefault(),this.onTreeContextMenu?.(e))}),this.treeContainer?.addEventListener(`pointerdown`,e=>{e.target.closest(`.file-tree-item`)||this.startLongPress(e,()=>{this.onTreeContextMenu?.({clientX:Number(e.clientX||0),clientY:Number(e.clientY||0),preventDefault(){},target:this.treeContainer})},this.treeContainer)}),this.treeContainer?.addEventListener(`pointermove`,e=>{this.handleLongPressPointerMove(e)},{passive:!0}),this.treeContainer?.addEventListener(`pointerup`,()=>{this.cancelLongPress()}),this.treeContainer?.addEventListener(`pointercancel`,()=>{this.cancelLongPress()}),this.treeContainer?.addEventListener(`scroll`,()=>{this.cancelLongPress()},{passive:!0})}render({activeFilePath:e,changedPaths:t=null,expandedDirs:n,reset:r=!1,searchMatches:i,searchQuery:a,tree:o}){if(!this.treeContainer)return;if(this.searchInput&&this.searchInput.value!==a&&(this.searchInput.value=a),a){this.lastRenderMode=`search`,this.renderSearchResults(i,e);return}if(r||this.lastRenderMode!==`tree`||!Array.isArray(t)||t.length===0){this.renderFullTree(o,{activeFilePath:e,expandedDirs:n}),this.lastRenderMode=`tree`;return}let s=Array.from(new Set(t.map(e=>Ra(e)))).sort((e,t)=>e.split(`/`).length-t.split(`/`).length).filter((e,t,n)=>!n.slice(0,t).some(t=>t&&e.startsWith(`${t}/`)));if(s.includes(``)){this.renderFullTree(o,{activeFilePath:e,expandedDirs:n}),this.lastRenderMode=`tree`;return}for(let t of s)if(!this.rerenderDirectoryBranch(t,o,{activeFilePath:e,expandedDirs:n})){this.renderFullTree(o,{activeFilePath:e,expandedDirs:n}),this.lastRenderMode=`tree`;return}this.lastRenderMode=`tree`}renderSearchResults(e,t){if(!this.treeContainer)return;if(this.resetTreeIndexes(),this.treeContainer.innerHTML=``,e.length===0){this.treeContainer.innerHTML=`<div class="file-tree-empty">No matches</div>`;return}let n=document.createDocumentFragment();for(let r of e){if(r.type===`directory`){n.appendChild(this.createSearchDirectoryItem(r));continue}n.appendChild(this.createFileItem({activeFilePath:t,depth:0,filePath:r.path,fileType:r.type||(v(r.path)??`file`),name:r.name||La(r.path)}))}this.treeContainer.appendChild(n)}renderFullTree(e,{activeFilePath:t,expandedDirs:n}){if(this.resetTreeIndexes(),this.treeContainer.innerHTML=``,e.length===0){this.treeContainer.innerHTML=`<div class="file-tree-empty">No vault files found</div>`;return}let r=document.createDocumentFragment();this.renderNodes(e,r,{activeFilePath:t,depth:0,expandedDirs:n}),this.treeContainer.appendChild(r)}resetTreeIndexes(){this.renderedDirectoryWrappers.clear(),this.renderedChildContainers.clear()}renderNodes(e,t,{activeFilePath:n,depth:r,expandedDirs:i}){for(let a of e){if(a.type===`directory`){t.appendChild(this.createDirectoryItem(a,{activeFilePath:n,depth:r,expandedDirs:i}));continue}t.appendChild(this.createFileItem({activeFilePath:n,depth:r,filePath:a.path,fileType:a.type,name:a.name}))}}createDirectoryItem(e,{activeFilePath:t,depth:n,expandedDirs:r}){let i=document.createElement(`div`);i.className=`file-tree-group`;let a=document.createElement(`button`);a.className=`file-tree-item file-tree-dir`,a.style.setProperty(`--depth`,n),a.dataset.depth=n;let o=r.has(e.path);if(a.setAttribute(`aria-expanded`,String(o)),a.innerHTML=`
171
+ `,t.appendChild(n),e>1){let n=document.createElement(`span`);n.className=`comment-marker-count`,n.textContent=String(e),t.appendChild(n)}return t}function K(...e){let t=[];for(let n of e)if(n){if(Array.isArray(n)){let e=K(...n);e&&t.push(e);continue}if(typeof n==`object`){Object.entries(n).forEach(([e,n])=>{n&&t.push(e)});continue}t.push(String(n))}return t.join(` `)}function q(e={}){let{variant:t=`secondary`,size:n=`md`,toggle:r=!1,toolbar:i=!1,action:a=!1,wide:o=!1,surface:s=!1,pill:c=!1,hidden:l=!1,active:u=!1,extra:d=[]}=e;return K(`ui-button`,t&&`ui-button--${t}`,n!==`md`&&`ui-button--${n}`,{"ui-button--toggle":r,"ui-button--toolbar":i,"ui-button--action":a,"ui-button--wide":o,"ui-button--surface":s,"ui-button--pill":c,active:u,hidden:l},d)}function Ei(e={}){let{toolbar:t=!1,action:n=!1,surface:r=!1,hidden:i=!1,extra:a=[]}=e;return K(`ui-icon-button`,{"ui-icon-button--toolbar":t,"ui-icon-button--action":n,"ui-icon-button--surface":r,hidden:i},a)}function J(e={}){return K(`ui-input`,e.extra??[])}function Di(){if(this.cardRoot?.isConnected&&this.cardRoot.parentElement===document.body)return this.cardRoot;let e=document.createElement(`div`);return e.className=`comment-card-root hidden`,document.body.appendChild(e),this.cardRoot=e,e}function Oi(e=`editor`,t=null){let n=this.session?.getCurrentSelectionCommentAnchor?.();n&&(this.selectionAnchor=n,this.reactionPicker=null,this.activeCard={anchor:n,mode:`create`,origin:e===`editor`&&t?`editor-chip`:e,replyThreadId:null,sourceRect:t??(e===`toolbar`?this.commentSelectionButton?.getBoundingClientRect?.():this.session?.getCommentAnchorClientRect?.(n))},this.render())}function ki(e,{anchor:t,origin:n,sourceRect:r}){this.reactionPicker=null,this.activeCard={anchor:t,groupKey:e.key,mode:`group`,origin:n,replyThreadId:null,sourceRect:r},this.renderDrawer(),this.renderCard()}function Ai(){this.activeCard=null,this.pendingCardFocusElement=null,this.reactionPicker=null,this.renderCard(),this.scheduleLayoutRefresh()}function ji(){return this.activeCard?this.activeCard.origin===`editor`?this.session?.getCommentAnchorClientRect?.(this.activeCard.anchor)??this.activeCard.sourceRect:this.activeCard.origin===`editor-chip`?this.activeCard.sourceRect:this.activeCard.origin===`preview`?this.resolvePreviewTarget(this.activeCard.anchor)?.bubbleRect??this.activeCard.sourceRect:this.activeCard.origin===`toolbar`?this.commentSelectionButton?.getBoundingClientRect?.()??this.activeCard.sourceRect:this.activeCard.sourceRect:null}function Mi(){let e=this.ensureCardRoot();if(e.replaceChildren(),e.classList.toggle(`hidden`,!this.activeCard),!this.activeCard){this.pendingCardFocusElement=null,e.style.visibility=``;return}this.pendingCardFocusElement=null;let t=document.createElement(`section`);t.className=`comment-card`,t.addEventListener(`click`,e=>{!this.reactionPicker||e.target?.closest?.(`.comment-reaction-picker-wrap`)||(this.reactionPicker=null,requestAnimationFrame(()=>{this.activeCard&&this.renderCard()}))});let n=document.createElement(`div`);n.className=`ui-record-header comment-card-header`;let r=document.createElement(`div`);r.className=`comment-card-title-wrap`;let i=document.createElement(`h3`);i.className=`comment-card-title`,i.textContent=this.activeCard.mode===`create`?`New comment`:`Comment threads`;let a=document.createElement(`p`);a.className=`comment-card-meta`,a.textContent=oi(this.activeCard.anchor),r.append(i,a);let o=document.createElement(`button`);o.type=`button`,o.className=q({variant:`ghost`,size:`compact`,pill:!0,extra:[`ui-action-pill`,`comment-card-close`]}),o.setAttribute(`aria-label`,`Close comments`),o.textContent=`Close`,o.addEventListener(`click`,()=>this.closeCard()),n.append(r,o),t.appendChild(n);let s=document.createElement(`div`);if(s.className=`comment-card-scroll`,this.activeCard.anchor?.quote){let e=document.createElement(`p`);e.className=`comment-card-quote`,e.textContent=this.activeCard.anchor.quote,s.appendChild(e)}if(this.activeCard.mode===`create`)s.appendChild(this.createComposer());else{let e=this.getThreadGroups().find(e=>e.key===this.activeCard.groupKey);if(!e){this.closeCard();return}e.threads.forEach(e=>{s.appendChild(this.createThreadElement(e))})}e.style.visibility=`hidden`,t.appendChild(s),e.appendChild(t),this.updateReactionPickerPosition(t),this.positionCard(t),e.style.visibility=``,this.flushPendingCardFocus(),this.scheduleLayoutRefresh()}function Ni(e){let t=gi(e);if(!t)return;let{picker:n,scroll:r,wrap:i}=t;n.classList.remove(`is-upward`),n.style.maxHeight=``;let a=i.getBoundingClientRect(),o=r.getBoundingClientRect(),s=n.getBoundingClientRect(),c=window.innerHeight-12,l=Math.min(o.bottom,c),u=Math.max(o.top,12),d=Math.max(l-a.bottom-8,0),f=Math.max(a.top-u-8,0),p=s.height>d&&f>d,m=Math.max(p?f:d,120);n.classList.toggle(`is-upward`,p),n.style.maxHeight=`${m}px`}function Pi(){let e=this.cardRoot?.firstElementChild;if(!e||!this.activeCard){this.cardRoot&&(this.cardRoot.style.visibility=``);return}this.positionCard(e),this.cardRoot.style.visibility=``,this.flushPendingCardFocus()}function Fi(){let e=document.createElement(`form`);e.className=`comment-card-form`;let t=document.createElement(`textarea`);t.className=J({extra:`comment-card-input`}),t.rows=4,t.maxLength=ve,t.placeholder=`Add context, feedback, or a question...`;let n=document.createElement(`div`);n.className=`ui-record-actions comment-card-actions`;let r=document.createElement(`button`);r.type=`button`,r.className=q({variant:`secondary`}),r.textContent=`Cancel`,r.addEventListener(`click`,()=>this.closeCard());let i=document.createElement(`button`);return i.type=`submit`,i.className=q({variant:`primary`}),i.textContent=`Post comment`,n.append(r,i),e.append(t,n),e.addEventListener(`submit`,async e=>{if(e.preventDefault(),!await this.onCreateThread?.({anchor:this.activeCard?.anchor,body:t.value})){t.focus();return}this.closeCard()}),this.pendingCardFocusElement=t,e}function Ii(e){let t=document.createElement(`article`);t.className=`comment-thread-card`;let n=document.createElement(`div`);n.className=`ui-record-header comment-thread-card-header`;let r=document.createElement(`div`);r.className=`comment-thread-card-heading`;let i=document.createElement(`span`);i.className=`comment-thread-card-author`,i.textContent=e.createdByName;let a=document.createElement(`span`);a.className=`comment-thread-card-time`,a.textContent=this.formatTimestamp(e.createdAt);let o=document.createElement(`div`);o.className=`ui-record-actions comment-thread-card-actions`;let s=document.createElement(`button`);s.type=`button`,s.className=q({variant:`ghost`,size:`compact`,pill:!0,extra:[`ui-action-pill`,`comment-thread-card-action`]}),s.textContent=`Jump`,s.addEventListener(`click`,()=>this.onNavigateToLine?.(e.anchor?.startLine??1));let c=document.createElement(`button`);c.type=`button`,c.className=q({variant:`ghost`,size:`compact`,pill:!0,extra:[`ui-action-pill`,`comment-thread-card-action`]});let l=this.activeCard?.replyThreadId===e.id;c.classList.toggle(`is-active`,l),c.textContent=`Reply`,c.setAttribute(`aria-pressed`,String(l)),c.setAttribute(`aria-label`,l?`Cancel reply`:`Reply to thread`),c.title=l?`Cancel reply`:`Reply to thread`,c.addEventListener(`click`,()=>{this.activeCard={...this.activeCard,replyThreadId:l?null:e.id},this.renderCard()});let u=document.createElement(`button`);return u.type=`button`,u.className=q({variant:`ghost`,size:`compact`,pill:!0,extra:[`ui-action-pill`,`comment-thread-card-action`,`is-danger`]}),u.textContent=`Resolve`,u.addEventListener(`click`,async()=>{await this.onResolveThread?.(e.id)}),o.append(s,c,u),r.append(i,a),n.append(r,o),t.append(n),e.messages.forEach(n=>{t.appendChild(this.createMessageElement(e,n))}),this.activeCard?.replyThreadId===e.id&&t.appendChild(this.createReplyComposer(e)),t}function Li(e,t){let n=document.createElement(`div`);n.className=`comment-message-card`;let r=document.createElement(`div`);r.className=`ui-record-meta comment-message-card-meta`;let i=document.createElement(`span`);i.className=`comment-message-card-author`,i.textContent=t.userName;let a=document.createElement(`span`);a.className=`comment-message-card-time`,a.textContent=this.formatTimestamp(t.createdAt);let o=fi(t.body,`comment-message-card-body comment-markdown`);return r.append(i,a),n.append(r,o),n.appendChild(this.createReactionBar(e,t)),n}function Ri(e,t){let n=this.session?.getLocalUser?.()?.userId??``,r=document.createElement(`div`);r.className=`comment-reaction-bar`;let i=new Set((t.reactions??[]).map(e=>e.emoji)),a=document.createElement(`div`);a.className=`comment-reaction-chips`,(t.reactions??[]).forEach(r=>{let i=document.createElement(`button`);i.type=`button`,i.className=`ui-chip-button ui-chip-button--comment comment-reaction-chip`,i.classList.toggle(`is-active`,pi(r,n)),i.setAttribute(`aria-pressed`,String(pi(r,n))),i.title=r.users?.map(e=>e.userName).join(`, `)||r.emoji;let o=document.createElement(`span`);o.className=`comment-reaction-chip-emoji`,o.textContent=r.emoji;let s=document.createElement(`span`);s.className=`comment-reaction-chip-count`,s.textContent=mi(r),i.append(o,s),i.addEventListener(`click`,async()=>{await this.onToggleReaction?.(e.id,t.id,r.emoji)}),a.appendChild(i)});let o=document.createElement(`div`);o.className=`comment-reaction-actions`,ei.filter(e=>!i.has(e)).forEach(n=>{o.appendChild(this.createQuickReactionButton(e,t,n))});let s=document.createElement(`div`);s.className=`comment-reaction-picker-wrap`;let c=document.createElement(`button`);return c.type=`button`,c.className=`ui-chip-button ui-chip-button--comment comment-reaction-more-trigger`,c.dataset.reactionPickerToggle=`true`,c.setAttribute(`aria-expanded`,String(hi(this.reactionPicker,e.id,t.id))),c.textContent=`More`,c.addEventListener(`click`,()=>{this.reactionPicker=hi(this.reactionPicker,e.id,t.id)?null:{messageId:t.id,threadId:e.id},this.renderCard()}),s.appendChild(c),hi(this.reactionPicker,e.id,t.id)&&s.appendChild(this.createReactionPicker(e,t)),o.appendChild(s),r.append(a,o),r}function zi(e,t,n){let r=document.createElement(`button`);return r.type=`button`,r.className=`ui-icon-chip ui-icon-chip--comment comment-reaction-quick-add`,r.textContent=n,r.title=`React with ${n}`,r.addEventListener(`click`,async()=>{await this.onToggleReaction?.(e.id,t.id,n)}),r}function Bi(e,t){let n=document.createElement(`div`);n.className=`comment-reaction-picker`;let r=document.createElement(`div`);return r.className=`comment-reaction-picker-grid`,ti.forEach(n=>{r.appendChild(this.createReactionPickerButton(e,t,n))}),n.appendChild(r),n}function Vi(e,t,n){let r=document.createElement(`button`);return r.type=`button`,r.className=`ui-icon-chip ui-icon-chip--comment comment-reaction-picker-btn`,r.textContent=n,r.title=`React with ${n}`,r.addEventListener(`click`,async()=>{await this.onToggleReaction?.(e.id,t.id,n)&&(this.reactionPicker=null,this.renderCard())}),r}function Hi(e){let t=document.createElement(`form`);t.className=`comment-reply-form`;let n=document.createElement(`textarea`);n.className=J({extra:`comment-card-input`}),n.rows=3,n.maxLength=ve,n.placeholder=`Reply to thread...`;let r=document.createElement(`div`);r.className=`ui-record-actions comment-card-actions`;let i=document.createElement(`button`);i.type=`button`,i.className=q({variant:`secondary`}),i.textContent=`Cancel`,i.addEventListener(`click`,()=>{this.activeCard={...this.activeCard,replyThreadId:null},this.renderCard()});let a=document.createElement(`button`);return a.type=`submit`,a.className=q({variant:`primary`}),a.textContent=`Reply`,r.append(i,a),t.append(n,r),this.pendingCardFocusElement=n,t.addEventListener(`submit`,async t=>{if(t.preventDefault(),!await this.onReplyToThread?.(e.id,n.value)){n.focus();return}this.activeCard={...this.activeCard,replyThreadId:null},this.renderCard()}),t}function Ui(e){let t=this.updateCardSourceRect(),n=window.innerWidth,r=window.innerHeight,i=e.getBoundingClientRect(),a=G((n-i.width)/2,16,n-i.width-16),o=G((r-i.height)/4,16,r-i.height-16),s=a,c=o;t&&(s=G(t.left,16,n-Math.min(i.width,520)-16),c=t.bottom+14,c+i.height>r-16&&(c=Math.max(t.top-i.height-14,16))),this.cardRoot.style.left=`${s}px`,this.cardRoot.style.top=`${c}px`,this.cardRoot.style.width=`${Math.min(Math.max(i.width,520),n-32)}px`}function Wi(){let e=this.pendingCardFocusElement;if(!(e instanceof HTMLElement)||!e.isConnected){this.pendingCardFocusElement=null;return}this.pendingCardFocusElement=null;let t=()=>{if(!e.isConnected)return;let t=document.activeElement;t instanceof HTMLElement&&this.editorContainer?.contains(t)&&t.blur(),e.focus({preventScroll:!0})};t(),document.activeElement!==e&&requestAnimationFrame(()=>{t(),document.activeElement!==e&&setTimeout(()=>{t()},50)})}var Gi={closeCard:Ai,createComposer:Fi,createMessageElement:Li,createQuickReactionButton:zi,createReactionBar:Ri,createReactionPicker:Bi,createReactionPickerButton:Vi,createReplyComposer:Hi,createThreadElement:Ii,ensureCardRoot:Di,flushPendingCardFocus:Wi,openComposerForSelection:Oi,openThreadGroup:ki,positionCard:Ui,renderCard:Mi,repositionActiveCard:Pi,updateCardSourceRect:ji,updateReactionPickerPosition:Ni};function Ki(){this.renderEditorLayer(),this.renderPreviewLayer(),this.repositionActiveCard()}function qi(e=0){if(!this.previewElement)return!1;let t=this.supported&&e>0,n=0,r=0;if(t){let t=getComputedStyle(this.previewElement),i=Number.parseFloat(t.getPropertyValue(`--preview-comment-rail-reserved`))||0,a=Number.parseFloat(t.paddingRight)||0,o=Number.parseFloat(t.getPropertyValue(`--preview-comment-rail-inset`))||0,s=Math.max(a-i,0),c=Math.max(e+o-s,0),l=this.previewContainer?.getBoundingClientRect(),u=this.previewElement.getBoundingClientRect(),d=l?Math.max(l.right-u.right,0):0;r=Math.min(d,c),n=Math.max(c-r,0)}let i=`${Math.ceil(n)}px`,a=`${Math.floor(r)}px`,o=this.previewElement.style.getPropertyValue(`--preview-comment-rail-reserved`)!==i||this.previewElement.style.getPropertyValue(`--preview-comment-rail-offset`)!==a;return o&&(this.previewElement.style.setProperty(`--preview-comment-rail-reserved`,i),this.previewElement.style.setProperty(`--preview-comment-rail-offset`,a)),o}function Ji(){this.layoutFrame||=requestAnimationFrame(()=>{this.layoutFrame=0,this.refreshLayout()})}function Yi(){if(this.editorLayer?.isConnected&&this.editorLayer.parentElement===this.editorContainer)return this.editorLayer;let e=document.createElement(`div`);return e.className=`comment-editor-layer`,this.editorContainer?.appendChild(e),this.editorLayer=e,e}function Xi(){let e=this.ensureEditorLayer();if(e.replaceChildren(),!this.supported||!this.session)return;let t=this.editorContainer?.getBoundingClientRect?.();if(!t)return;let n=this.getThreadGroups(),r=[];if(n.forEach(n=>{let i=this.session.getCommentAnchorClientRect?.(n.anchor);if(!i)return;let a=bi(i,t);if(a.bottom<0||a.top>t.height)return;let o=document.createElement(`button`);o.type=`button`,o.className=`ui-state-marker ui-state-marker--comment comment-editor-badge`,o.dataset.count=String(n.threads.length);let s=this.activeCard?.groupKey===n.key,c=this.hoveredEditorGroupKeys.includes(n.key);o.classList.toggle(`is-active`,s),o.classList.toggle(`is-hovered`,c),o.classList.toggle(`is-passive`,!s&&!c),o.setAttribute(`aria-label`,`${n.threads.length} comment thread${n.threads.length===1?``:`s`}`),o.appendChild(Ti(n.threads.length));let l=Math.max(a.top,8);o.style.top=`${l}px`,o.style.left=`${Math.max(t.width-36,8)}px`,o.title=`${n.threads.length} comment${n.threads.length===1?``:`s`}`,o.addEventListener(`pointerdown`,e=>{e.preventDefault()}),o.addEventListener(`pointerenter`,()=>{this.updateHoveredEditorGroups([n.key])}),o.addEventListener(`pointerleave`,()=>{this.updateHoveredEditorGroups([])}),o.addEventListener(`focusin`,()=>{this.updateHoveredEditorGroups([n.key])}),o.addEventListener(`focusout`,()=>{this.updateHoveredEditorGroups([])}),o.addEventListener(`click`,()=>{this.openThreadGroup(n,{anchor:n.anchor,origin:`editor`,sourceRect:i})}),e.appendChild(o),r.push(l)}),!this.committedSelectionAnchor||this.activeCard?.mode===`create`)return;let i=this.session.getCommentAnchorClientRect?.(this.committedSelectionAnchor),a=this.session.getSelectionChipClientRect?.(this.committedSelectionAnchor)??i;if(!a)return;let o=bi(a,t);if(o.bottom<0||o.top>t.height)return;let s=G(o.top,8,Math.max(t.height-36,8));for(;r.some(e=>Math.abs(e-s)<32);)s=G(s+36,8,Math.max(t.height-36,8));let c=document.createElement(`button`);c.type=`button`,c.className=`ui-selection-pill ui-selection-pill--comment comment-selection-chip`,c.textContent=`Comment`,c.style.top=`${s}px`,c.style.right=`12px`,c.addEventListener(`pointerdown`,e=>{e.preventDefault(),e.stopPropagation(),this.openComposerForSelection(`editor`,c.getBoundingClientRect())}),e.appendChild(c)}function Zi(){if(this.previewLayer?.isConnected&&this.previewLayer.parentElement===this.previewElement)return this.previewLayer;let e=document.createElement(`div`);e.className=`comment-preview-highlights`;let t=document.createElement(`div`);return t.className=`comment-preview-layer`,this.previewElement?.append(e,t),this.previewHighlightLayer=e,this.previewLayer=t,t}function Qi(){if(this.ensurePreviewLayer(),this.previewLayer?.replaceChildren(),this.previewHighlightLayer?.replaceChildren(),!this.supported||!this.previewElement){this.previewHoverRegions=[],this.syncPreviewRailLayout(0);return}let e=this.previewElement.getBoundingClientRect(),t=this.getThreadGroups(),n=[],r=[],i=this.shouldRenderPassivePreviewMarkers(),a=[];t.forEach(t=>{let o=this.resolvePreviewTarget(t.anchor);if(!o?.bubbleRect)return;r.push({key:t.key,rects:o.hoverRects?.length>0?o.hoverRects:[o.bubbleRect]});let s=this.activeCard?.groupKey===t.key,c=this.hoveredPreviewGroupKeys.includes(t.key),l=s||c;if(o.highlightRects?.forEach(t=>{let n=document.createElement(`div`);n.className=`comment-preview-highlight`,n.classList.toggle(`is-active`,s),n.classList.toggle(`is-hovered`,c),n.classList.toggle(`is-passive`,!l),n.style.left=`${t.left-e.left}px`,n.style.top=`${t.top-e.top}px`,n.style.width=`${t.width}px`,n.style.height=`${t.height}px`,this.previewHighlightLayer?.appendChild(n)}),!i&&!l)return;let u=document.createElement(`button`);u.type=`button`,u.className=`ui-state-marker ui-state-marker--comment comment-preview-badge`,u.dataset.commentPreviewGroupKeys=t.key,u.classList.toggle(`is-active`,s),u.classList.toggle(`is-hovered`,c),u.classList.toggle(`is-passive`,!l),u.setAttribute(`aria-label`,`${t.threads.length} comment thread${t.threads.length===1?``:`s`}`),u.appendChild(Ti(t.threads.length));let d=G(o.bubbleRect.top-e.top,6,Math.max(this.previewElement.clientHeight-30,6));for(;n.some(e=>Math.abs(e-d)<26);)d=G(d+30,6,Math.max(this.previewElement.clientHeight-30,6));u.style.top=`${d}px`,u.title=`${t.threads.length} comment${t.threads.length===1?``:`s`}`,u.addEventListener(`pointerdown`,e=>{e.preventDefault()}),u.addEventListener(`click`,()=>{this.openThreadGroup(t,{anchor:t.anchor,origin:`preview`,sourceRect:u.getBoundingClientRect()})}),this.previewLayer?.appendChild(u),n.push(d),a.push(u)}),this.previewHoverRegions=r;let o=a.reduce((e,t)=>Math.max(e,t.offsetWidth||28),0);this.syncPreviewRailLayout(o)&&this.scheduleLayoutRefresh(),this.lastPreviewPointerPosition&&this.updateHoveredPreviewGroups(this.getPreviewGroupKeysAtPoint(this.lastPreviewPointerPosition.x,this.lastPreviewPointerPosition.y))}function $i(e){if(!this.previewElement||!e)return null;let t=Array.from(this.previewElement.querySelectorAll(`.mermaid-shell, .plantuml-shell`)).find(t=>_i(t,e));if(t)return{bubbleRect:t.getBoundingClientRect(),highlightRects:[],hoverRects:[t.getBoundingClientRect()]};let n=Array.from(this.previewElement.querySelectorAll(`[data-source-line]`)).filter(t=>ci(t)&&_i(t,e));if(e.kind===`text`&&e.quote){let t=n.map(t=>({element:t,range:yi(t,e.quote)})).filter(e=>e.range);if(t.length===1){let e=Array.from(t[0].range.getClientRects());return{bubbleRect:xi(e)||t[0].element.getBoundingClientRect(),highlightRects:e,hoverRects:e}}}let r=n[0];return r?{bubbleRect:r.getBoundingClientRect(),highlightRects:[],hoverRects:[r.getBoundingClientRect()]}:null}function ea(e){if(!(e instanceof Node))return[];let t=e.closest?.(`[data-comment-preview-group-keys]`);return wi(String(t?.dataset?.commentPreviewGroupKeys??``).split(/\s+/).filter(Boolean)).split(` `).filter(Boolean)}function ta(e,t){if(!Number.isFinite(e)||!Number.isFinite(t))return[];let n=document.elementFromPoint(e,t),r=this.getPreviewGroupKeysForTarget(n);return r.length>0?r:Ci(this.previewHoverRegions.filter(n=>n.rects.some(n=>Si(e,t,n))).map(e=>e.key))}function na(e=[]){let t=Ci(e),n=t.join(` `);n!==this.hoveredPreviewGroupKeysSignature&&(this.hoveredPreviewGroupKeys=t,this.hoveredPreviewGroupKeysSignature=n,this.scheduleLayoutRefresh())}function ra(e=[]){let t=Ci(e),n=t.join(` `);n!==this.hoveredEditorGroupKeysSignature&&(this.hoveredEditorGroupKeys=t,this.hoveredEditorGroupKeysSignature=n,this.scheduleLayoutRefresh())}function ia(e){this.updateHoveredPreviewGroups(this.getPreviewGroupKeysForTarget(e))}function aa(){let e=this.previewContainer?.clientWidth??this.previewElement?.clientWidth??0;return window.innerWidth>=769&&e>=400}var oa={ensureEditorLayer:Yi,ensurePreviewLayer:Zi,getPreviewGroupKeysAtPoint:ta,getPreviewGroupKeysForTarget:ea,refreshLayout:Ki,renderEditorLayer:Xi,renderPreviewLayer:Qi,resolvePreviewTarget:$i,scheduleLayoutRefresh:Ji,shouldRenderPassivePreviewMarkers:aa,syncHoveredPreviewGroupsFromTarget:ia,syncPreviewRailLayout:qi,updateHoveredEditorGroups:ra,updateHoveredPreviewGroups:na};function sa(){this.renderToolbar(),this.renderDrawer(),this.renderCard(),this.scheduleLayoutRefresh()}function ca(){let e=this.threads.length,t=this.supported&&!!this.session;if(this.commentSelectionButton?.classList.toggle(`hidden`,!t),this.commentsToggleButton?.classList.toggle(`hidden`,!this.supported),this.commentSelectionButton&&(this.commentSelectionButton.disabled=!this.selectionAnchor),this.commentsToggleButton){this.commentsToggleButton.classList.toggle(`active`,this.drawerOpen),this.commentsToggleButton.setAttribute(`aria-expanded`,String(this.drawerOpen));let t=e>0?`Comments ${e}`:`Comments`,n=this.commentsToggleButton.querySelector(`.ui-action-label`);n?n.textContent=t:this.commentsToggleButton.textContent=t}}function la(){if(!this.commentsDrawer||!this.commentsDrawerList)return;this.commentsDrawer.classList.toggle(`hidden`,!this.supported||!this.drawerOpen),this.commentsDrawerList.replaceChildren();let e=this.getThreadGroups();if(this.commentsDrawerEmpty?.classList.toggle(`hidden`,e.length>0),!this.supported||e.length===0)return;let t=document.createDocumentFragment();e.forEach(e=>{let n=document.createElement(`button`);n.type=`button`,n.className=`ui-record-surface comments-drawer-item`,n.classList.toggle(`is-active`,this.activeCard?.groupKey===e.key),n.addEventListener(`pointerdown`,e=>{e.preventDefault()}),n.addEventListener(`click`,()=>{this.openThreadGroup(e,{anchor:e.anchor,origin:`drawer`,sourceRect:n.getBoundingClientRect()})});let r=document.createElement(`div`);r.className=`ui-record-header comments-drawer-item-header`;let i=document.createElement(`span`);i.className=`comments-drawer-item-title`,i.textContent=oi(e.anchor);let a=document.createElement(`span`);a.className=`ui-pill-badge ui-pill-badge--count ui-pill-badge--accent comments-drawer-item-count`,a.textContent=String(e.threads.length),r.append(i,a);let o=document.createElement(`p`);o.className=`comments-drawer-item-quote`,o.textContent=e.anchor.quote||e.anchor.excerpt||`Source anchored comment`;let s=di(e),c=fi(s?.body||``,`comment-markdown comments-drawer-item-preview`),l=document.createElement(`div`);l.className=`ui-record-meta comments-drawer-item-footer`;let u=document.createElement(`span`);u.textContent=`${e.threads.length} thread${e.threads.length===1?``:`s`}`;let d=document.createElement(`span`);d.className=`comments-drawer-item-updated`,d.textContent=s?`${s.userName} • ${this.formatTimestamp(s.createdAt)}`:``,l.append(u,d),n.append(r,o,c,l),t.appendChild(n)}),this.commentsDrawerList.appendChild(t)}function ua(e){if(!Number.isFinite(e))return``;try{return this.timeFormatter.format(new Date(e))}catch{return``}}var da={formatTimestamp:ua,render:sa,renderDrawer:la,renderToolbar:ca};function fa(e){this.session?.getScrollContainer?.()?.removeEventListener(`scroll`,this.handleEditorScroll),this.session=e,this.selectionAnchor=e?.getCurrentSelectionCommentAnchor?.()??null,this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.reactionPicker=null,this.clearSelectionRevealTimer(),this.pointerSelecting=!1,e?.getScrollContainer?.()?.addEventListener(`scroll`,this.handleEditorScroll,{passive:!0}),this.render()}function pa(e,{fileKind:t=`markdown`,supported:n=!1}={}){let r=this.currentFile!==e;this.currentFile=e,this.fileKind=t,this.supported=!!(e&&n),r&&(this.drawerOpen=!1,this.threads=[],this.selectionAnchor=null,this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.clearSelectionRevealTimer(),this.pointerSelecting=!1,this.activeCard=null,this.updateHoveredEditorGroups([]),this.updateHoveredPreviewGroups([]),this.previewHoverRegions=[],this.lastPreviewPointerPosition=null,this.reactionPicker=null),this.supported||(this.drawerOpen=!1,this.activeCard=null,this.threads=[],this.selectionAnchor=null,this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.clearSelectionRevealTimer(),this.pointerSelecting=!1,this.updateHoveredEditorGroups([]),this.updateHoveredPreviewGroups([]),this.previewHoverRegions=[],this.lastPreviewPointerPosition=null,this.reactionPicker=null),this.render()}function ma(e){if(this.selectionAnchor=this.supported?e:null,!this.supported||!this.selectionAnchor){this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.clearSelectionRevealTimer(),this.renderToolbar(),this.scheduleLayoutRefresh();return}if(!ii(this.selectionAnchor)){this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.clearSelectionRevealTimer(),this.renderToolbar(),this.scheduleLayoutRefresh();return}if(this.pendingSelectionAnchor=this.selectionAnchor,this.activeCard?.mode===`create`){this.clearSelectionRevealTimer(),this.renderToolbar(),this.scheduleLayoutRefresh();return}if(this.pointerSelecting){this.clearSelectionRevealTimer(),this.committedSelectionAnchor=null,this.renderToolbar(),this.scheduleLayoutRefresh();return}if(ai(this.committedSelectionAnchor,this.selectionAnchor)){this.renderToolbar(),this.scheduleLayoutRefresh();return}this.scheduleSelectionReveal(this.selectionAnchor),this.renderToolbar(),this.scheduleLayoutRefresh()}function ha(){this.activeCard?.mode!==`create`&&(this.clearSelectionRevealTimer(),this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.scheduleLayoutRefresh())}function ga(e=[]){this.threads=ni(e),this.activeCard?.mode===`group`&&!this.getThreadGroups().some(e=>e.key===this.activeCard.groupKey)&&(this.activeCard=null),this.reactionPicker&&!this.threads.some(e=>e.id===this.reactionPicker.threadId&&e.messages?.some(e=>e.id===this.reactionPicker.messageId))&&(this.reactionPicker=null),this.render()}function _a(e){let t=!!e;t!==this.drawerOpen&&(t&&this.onWillOpenDrawer?.(),this.drawerOpen=t,this.render())}function va(){this.setDrawerOpen(!1)}function ya(){let e=new Map;return this.threads.forEach(t=>{let n=si(t.anchor),r=e.get(n);if(r){r.threads.push(t);return}e.set(n,{anchor:t.anchor,key:n,threads:[t]})}),Array.from(e.values()).sort((e,t)=>(e.anchor?.startLine??0)-(t.anchor?.startLine??0))}function ba(){this.selectionRevealTimer&&=(clearTimeout(this.selectionRevealTimer),0)}function xa(e){this.clearSelectionRevealTimer(),this.selectionRevealTimer=window.setTimeout(()=>{this.selectionRevealTimer=0,!(this.pointerSelecting||this.activeCard?.mode===`create`||!ai(this.pendingSelectionAnchor,e))&&(this.committedSelectionAnchor=e,this.scheduleLayoutRefresh())},150)}var Sa={attachSession:fa,clearSelectionRevealTimer:ba,closeDrawer:va,getThreadGroups:ya,handleEditorContentChange:ha,scheduleSelectionReveal:xa,setCurrentFile:pa,setDrawerOpen:_a,setSelectionAnchor:ma,setThreads:ga},Ca=class{constructor({commentSelectionButton:e,commentsDrawer:t,commentsDrawerEmpty:n,commentsDrawerList:r,commentsToggleButton:i,editorContainer:a,onWillOpenDrawer:o,onCreateThread:s,onNavigateToLine:c,onReplyToThread:l,onToggleReaction:u,onResolveThread:d,previewContainer:f,previewElement:p}){this.commentSelectionButton=e,this.commentsDrawer=t,this.commentsDrawerEmpty=n,this.commentsDrawerList=r,this.commentsToggleButton=i,this.editorContainer=a,this.onWillOpenDrawer=o,this.onCreateThread=s,this.onNavigateToLine=c,this.onReplyToThread=l,this.onToggleReaction=u,this.onResolveThread=d,this.previewContainer=f,this.previewElement=p,this.currentFile=null,this.fileKind=`markdown`,this.supported=!1,this.drawerOpen=!1,this.threads=[],this.selectionAnchor=null,this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.selectionRevealTimer=0,this.pointerSelecting=!1,this.session=null,this.activeCard=null,this.hoveredEditorGroupKeys=[],this.hoveredEditorGroupKeysSignature=``,this.hoveredPreviewGroupKeys=[],this.hoveredPreviewGroupKeysSignature=``,this.previewHoverRegions=[],this.lastPreviewPointerPosition=null,this.editorLayer=null,this.previewLayer=null,this.previewHighlightLayer=null,this.cardRoot=null,this.pendingCardFocusElement=null,this.reactionPicker=null,this.layoutFrame=0,this.timeFormatter=new Intl.DateTimeFormat(void 0,{day:`numeric`,hour:`numeric`,minute:`2-digit`,month:`short`}),this.handleEditorScroll=()=>this.scheduleLayoutRefresh(),this.handlePreviewScroll=()=>this.scheduleLayoutRefresh(),this.handleWindowResize=()=>this.scheduleLayoutRefresh(),this.handlePreviewPointerMove=e=>{this.lastPreviewPointerPosition={x:e.clientX,y:e.clientY},this.updateHoveredPreviewGroups(this.getPreviewGroupKeysAtPoint(e.clientX,e.clientY))},this.handlePreviewPointerLeave=()=>{this.lastPreviewPointerPosition=null,this.updateHoveredPreviewGroups([])},this.handlePreviewFocusIn=e=>{this.updateHoveredPreviewGroups(this.getPreviewGroupKeysForTarget(e.target))},this.handlePreviewFocusOut=e=>{this.updateHoveredPreviewGroups(this.getPreviewGroupKeysForTarget(e.relatedTarget))},this.handleCommentSelectionButtonPointerDown=e=>{e.preventDefault()},this.handleEditorPointerDown=e=>{e.button!==0||!this.supported||!this.session||!e.target?.closest?.(`.cm-editor`)||e.target?.closest?.(`.comment-editor-layer`)||(this.pointerSelecting=!0,this.clearSelectionRevealTimer(),this.committedSelectionAnchor&&(this.committedSelectionAnchor=null,this.scheduleLayoutRefresh()))},this.handleDocumentPointerUp=()=>{this.pointerSelecting&&requestAnimationFrame(()=>{let e=this.supported?this.session?.getCurrentSelectionCommentAnchor?.()??null:null;this.pointerSelecting=!1,this.selectionAnchor=e,this.renderToolbar(),this.pendingSelectionAnchor=ii(e)?e:null,this.clearSelectionRevealTimer(),this.committedSelectionAnchor=ii(e)&&this.activeCard?.mode!==`create`?e:null,this.scheduleLayoutRefresh()})},this.handleEditorFocusOut=e=>{let t=e.relatedTarget;t instanceof Node&&(this.editorContainer?.contains(t)||this.cardRoot?.contains(t)||this.commentSelectionButton?.contains(t))||(this.clearSelectionRevealTimer(),this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.scheduleLayoutRefresh())},this.handleDocumentPointerDown=e=>{let t=e.target;if(this.activeCard&&this.cardRoot){if(this.cardRoot.contains(t))return;this.closeCard()}this.drawerOpen&&(t instanceof Node&&(this.commentsDrawer?.contains(t)||this.commentsToggleButton?.contains(t))||this.closeDrawer())},this.handleDocumentKeyDown=e=>{if(e.key===`Escape`&&this.reactionPicker){this.reactionPicker=null,this.renderCard();return}e.key===`Escape`&&this.activeCard&&this.closeCard(),e.key===`Escape`&&this.committedSelectionAnchor&&(this.clearSelectionRevealTimer(),this.pendingSelectionAnchor=null,this.committedSelectionAnchor=null,this.scheduleLayoutRefresh())},this.commentSelectionButton?.addEventListener(`pointerdown`,this.handleCommentSelectionButtonPointerDown),this.commentSelectionButton?.addEventListener(`click`,()=>{this.openComposerForSelection(`toolbar`)}),this.commentsToggleButton?.addEventListener(`click`,()=>{this.setDrawerOpen(!this.drawerOpen)}),this.previewContainer?.addEventListener(`scroll`,this.handlePreviewScroll,{passive:!0}),this.previewElement?.addEventListener(`pointermove`,this.handlePreviewPointerMove,{passive:!0}),this.previewElement?.addEventListener(`pointerleave`,this.handlePreviewPointerLeave),this.previewElement?.addEventListener(`focusin`,this.handlePreviewFocusIn),this.previewElement?.addEventListener(`focusout`,this.handlePreviewFocusOut),this.editorContainer?.addEventListener(`pointerdown`,this.handleEditorPointerDown),this.editorContainer?.addEventListener(`focusout`,this.handleEditorFocusOut),window.addEventListener(`resize`,this.handleWindowResize),document.addEventListener(`pointerup`,this.handleDocumentPointerUp),document.addEventListener(`pointercancel`,this.handleDocumentPointerUp),document.addEventListener(`pointerdown`,this.handleDocumentPointerDown),document.addEventListener(`keydown`,this.handleDocumentKeyDown)}destroy(){this.layoutFrame&&=(cancelAnimationFrame(this.layoutFrame),0),this.attachSession(null),this.previewContainer?.removeEventListener(`scroll`,this.handlePreviewScroll),this.previewElement?.removeEventListener(`pointermove`,this.handlePreviewPointerMove),this.previewElement?.removeEventListener(`pointerleave`,this.handlePreviewPointerLeave),this.previewElement?.removeEventListener(`focusin`,this.handlePreviewFocusIn),this.previewElement?.removeEventListener(`focusout`,this.handlePreviewFocusOut),this.commentSelectionButton?.removeEventListener(`pointerdown`,this.handleCommentSelectionButtonPointerDown),this.editorContainer?.removeEventListener(`pointerdown`,this.handleEditorPointerDown),this.editorContainer?.removeEventListener(`focusout`,this.handleEditorFocusOut),window.removeEventListener(`resize`,this.handleWindowResize),document.removeEventListener(`pointerup`,this.handleDocumentPointerUp),document.removeEventListener(`pointercancel`,this.handleDocumentPointerUp),document.removeEventListener(`pointerdown`,this.handleDocumentPointerDown),document.removeEventListener(`keydown`,this.handleDocumentKeyDown),this.previewHoverRegions=[],this.cardRoot?.remove(),this.editorLayer?.remove(),this.previewLayer?.remove(),this.pendingCardFocusElement=null}};Object.assign(Ca.prototype,Sa,da,oa,Gi);var wa=360,Ta=`https://viewer.diagrams.net/js/viewer-static.min.js`,Ea=null;function Da(e,t){return typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e,{timeout:t}):window.setTimeout(()=>e({didTimeout:!1,timeRemaining:()=>0}),1)}function Oa(e){if(e!==null){if(typeof window.cancelIdleCallback==`function`){window.cancelIdleCallback(e);return}window.clearTimeout(e)}}function ka(e,t,n){if(!e||!t)return!1;let r=t.getBoundingClientRect(),i=e.getBoundingClientRect();return i.bottom>=r.top-n&&i.top<=r.bottom+n}function Aa(){return window.GraphViewer?.processElements?Promise.resolve(window.GraphViewer):Ea||(Ea=new Promise((e,t)=>{let n=document.querySelector(`script[data-collabmd-drawio-viewer]`),r=n instanceof HTMLScriptElement?n:document.createElement(`script`),i=()=>{r.removeEventListener(`error`,a),r.removeEventListener(`load`,o)},a=()=>{i(),Ea=null,t(Error(`Failed to load draw.io viewer`))},o=()=>{if(i(),!window.GraphViewer?.processElements){Ea=null,t(Error(`draw.io viewer did not initialize`));return}e(window.GraphViewer)};r.addEventListener(`error`,a,{once:!0}),r.addEventListener(`load`,o,{once:!0}),n?window.GraphViewer?.processElements&&o():(r.src=Ta,r.async=!0,r.dataset.collabmdDrawioViewer=`true`,document.head.append(r))}),Ea)}var ja=class{constructor({getLocalUser:e,getTheme:t,onOpenFile:n=null,onOpenTextFile:r=null,previewContainer:i,previewElement:a,toastController:o}){this.getLocalUser=e,this.getTheme=t,this.onOpenFile=n,this.onOpenTextFile=r,this.previewContainer=i,this.previewElement=a,this.toastController=o,this.embedEntries=new Map,this.hydrationQueue=[],this.hydrationIdleId=null,this.hydrationPaused=!1,this.instanceCounter=0,this.maximizedEntry=null,this.maximizedRoot=null,this._onMessage=this._onMessage.bind(this),this._onKeyDown=this._onKeyDown.bind(this),this._onPreviewClick=this._onPreviewClick.bind(this),window.addEventListener(`message`,this._onMessage),window.addEventListener(`keydown`,this._onKeyDown),this.previewElement?.addEventListener(`click`,this._onPreviewClick)}destroy(){window.removeEventListener(`message`,this._onMessage),window.removeEventListener(`keydown`,this._onKeyDown),this.previewElement?.removeEventListener(`click`,this._onPreviewClick),Oa(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this._exitMaximizedEntry(),document.body.classList.remove(`drawio-maximized-open`),this.embedEntries.forEach(e=>e.wrapper?.remove()),this.embedEntries.clear(),this.maximizedRoot?.remove(),this.maximizedRoot=null}detachForCommit(){Oa(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this.embedEntries.forEach(e=>{e.placeholder=null})}setHydrationPaused(e){this.hydrationPaused=!!e,this.hydrationPaused||this.hydrateVisibleEmbeds()}reconcileEmbeds(e){this._exitMaximizedEntry();let t=Array.from(e.querySelectorAll(`.drawio-embed-placeholder[data-drawio-key]`)).map(e=>({filePath:e.dataset.drawioTarget||``,key:e.dataset.drawioKey||``,label:e.dataset.drawioLabel||e.dataset.drawioTarget||``,mode:e.dataset.drawioMode===`edit`?`edit`:`view`,placeholder:e})),n=new Map;t.forEach(e=>{let t=this.embedEntries.get(e.key)||null,r=t?{...t,...e}:{...e,iframe:null,imageElement:null,instanceId:``,queued:!1,viewerElement:null,wrapper:null};n.set(e.key,r)}),this.embedEntries.forEach((e,t)=>{n.has(t)||e.wrapper?.remove()}),this.embedEntries=n,this.embedEntries.forEach(e=>{e.wrapper?e.placeholder?.replaceWith(e.wrapper):e.queued=!1}),this.hydrationPaused||this.hydrateVisibleEmbeds()}hydrateVisibleEmbeds(){this.embedEntries.forEach(e=>{e.wrapper||!e.placeholder?.isConnected||(e.mode===`edit`||ka(e.placeholder,this.previewContainer,wa))&&this.enqueueHydration(e)})}enqueueHydration(e){e.queued||(e.queued=!0,this.hydrationQueue.push(e),this.hydrationIdleId===null&&(this.hydrationIdleId=Da(()=>{this.hydrationIdleId=null,this.hydrationQueue.splice(0).forEach(e=>{e.queued=!1,this.hydrateEntry(e)})},200)))}hydrateEntry(e){if(!(!e.placeholder?.isConnected||e.wrapper)){if(e.mode===`view`){this.hydrateViewerEntry(e);return}this.hydrateIframeEntry(e)}}hydrateIframeEntry(e){if(!e.placeholder?.isConnected||e.wrapper)return;let t=document.createElement(`div`);t.className=`drawio-embed diagram-preview-shell${e.mode===`edit`?` is-direct-file`:``}`,t.dataset.file=e.filePath,t.dataset.drawioKey=e.key;let n=document.createElement(`div`);n.className=`drawio-embed-header diagram-preview-toolbar`;let r=document.createElement(`span`);r.className=`drawio-embed-icon`,r.innerHTML=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`;let i=document.createElement(`span`);i.className=`drawio-embed-label`,i.textContent=e.label.replace(/\.drawio$/i,``),n.append(r,i),e.mode!==`edit`&&n.appendChild(this.createOpenButton(e)),n.appendChild(this.createMaximizeButton(e,t));let a=document.createElement(`iframe`);a.className=`drawio-embed-iframe`,a.loading=`lazy`,a.referrerPolicy=`strict-origin-when-cross-origin`,e.instanceId=`drawio-${++this.instanceCounter}`,a.dataset.instanceId=e.instanceId,a.src=this.buildIframeUrl(e),t.append(n,a),e.iframe=a,e.wrapper=t,e.placeholder.replaceWith(t)}async hydrateViewerEntry(e){if(!e.placeholder?.isConnected||e.wrapper)return;let t=document.createElement(`div`);t.className=`drawio-embed diagram-preview-shell is-static-preview`,t.dataset.file=e.filePath,t.dataset.drawioKey=e.key;let n=document.createElement(`div`);n.className=`drawio-embed-header diagram-preview-toolbar`;let r=document.createElement(`span`);r.className=`drawio-embed-icon`,r.innerHTML=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`;let i=document.createElement(`span`);i.className=`drawio-embed-label`,i.textContent=e.label.replace(/\.drawio$/i,``),n.append(r,i),n.append(this.createOpenButton(e),this.createMaximizeButton(e,t));let a=document.createElement(`div`);a.className=`drawio-viewer-shell`,a.dataset.filePath=e.filePath;let o=document.createElement(`div`);o.className=`preview-shell`,o.textContent=`Rendering draw.io preview…`,a.appendChild(o),t.append(n,a),e.iframe=null,e.wrapper=t,e.viewerElement=a,e.placeholder.replaceWith(t);try{await this.renderViewerEntry(e)}catch(t){this.renderViewerFallback(e,t instanceof Error?t.message:`Failed to render draw.io preview`)}}async renderViewerEntry(e){let[{content:t},n]=await Promise.all([S.readFile(e.filePath),Aa()]);if(!e.wrapper?.isConnected||!e.viewerElement?.isConnected)return;let r=this.getTheme?.()===`light`?`light`:`dark`,i=document.createElement(`div`);i.className=`mxgraph drawio-viewer-frame`,i.dataset.action=`open-file`,i.dataset.filePath=e.filePath,i.setAttribute(`role`,`button`),i.setAttribute(`tabindex`,`0`),i.setAttribute(`aria-label`,`Open ${e.label.replace(/\.drawio$/i,``)}`),i.addEventListener(`click`,t=>{t.preventDefault(),this.onOpenFile?.(e.filePath)}),i.addEventListener(`keydown`,t=>{t.key!==`Enter`&&t.key!==` `||(t.preventDefault(),this.onOpenFile?.(e.filePath))}),i.dataset.mxgraph=JSON.stringify({"check-visible-state":!1,center:!0,border:0,"dark-mode":r,editable:!1,fit:1,lightbox:!1,nav:!1,resize:!1,toolbar:``,tooltips:!1,xml:String(t??``)}),e.viewerElement.replaceChildren(i),e.viewerElement=i,n.processElements()}buildIframeUrl(e){let t=new URL(T(`/drawio-editor.html`)),n=this.getLocalUser?.()??{};return t.searchParams.set(`file`,e.filePath),t.searchParams.set(`hostMode`,e.mode===`edit`?`file-preview`:`embed`),t.searchParams.set(`instanceId`,e.instanceId),t.searchParams.set(`mode`,e.mode===`edit`?`edit`:`view`),t.searchParams.set(`theme`,this.getTheme?.()===`light`?`light`:`dark`),n.name&&t.searchParams.set(`userName`,n.name),n.peerId&&t.searchParams.set(`peerId`,n.peerId),e.mode===`edit`&&t.searchParams.set(`leaseRoom`,ie(e.filePath)),t.toString()}updateTheme(e){this.embedEntries.forEach(t=>{t.iframe?.contentWindow&&t.iframe.contentWindow.postMessage({source:`collabmd-host`,theme:e,type:`set-theme`},window.location.origin),t.mode===`view`&&t.wrapper?.isConnected&&t.viewerElement?.isConnected&&this.renderViewerEntry(t).catch(e=>{this.renderViewerFallback(t,e instanceof Error?e.message:`Failed to render draw.io preview`)})})}updateLocalUser(){}syncLayout(){}createOpenButton(e){let t=document.createElement(`button`);return t.type=`button`,t.className=`drawio-embed-btn ui-preview-action ui-preview-action--icon-only`,t.dataset.action=`open-file`,t.dataset.filePath=e.filePath,t.title=`Edit in draw.io`,t.setAttribute(`aria-label`,`Edit in draw.io`),z(t,`edit`),t.addEventListener(`click`,t=>{t.preventDefault(),this.onOpenFile?.(e.filePath)}),t}createMaximizeButton(e,t){let n=document.createElement(`button`);return n.type=`button`,n.className=`drawio-embed-btn ui-preview-action ui-preview-action--icon-only`,n.dataset.action=`toggle-maximize`,n.dataset.filePath=e.filePath,n.dataset.drawioKey=e.key,n.addEventListener(`click`,n=>{n.preventDefault(),this.maximizedEntry?.key===e.key?this._exitMaximizedEntry():this._enterMaximizedEntry(e,t),this._syncMaximizeButtons()}),(()=>{let t=this.maximizedEntry?.key===e.key;z(n,t?`restore`:`maximize`),n.title=t?`Restore diagram size`:`Maximize diagram`,n.setAttribute(`aria-label`,t?`Restore diagram size`:`Maximize diagram`)})(),n}_ensureMaximizedRoot(){if(this.maximizedRoot?.isConnected&&this.maximizedRoot.parentElement===document.body)return this.maximizedRoot;let e=document.body.querySelector(`[data-drawio-maximized-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.drawioMaximizedRoot=`true`,e.className=`drawio-maximized-root`,document.body.appendChild(e)),this.maximizedRoot=e,e}_enterMaximizedEntry(e,t=e?.wrapper){if(!e?.wrapper||e.wrapper!==t||this.maximizedEntry?.key===e.key)return;this._exitMaximizedEntry();let n=this._ensureMaximizedRoot(),r=e.wrapper.parentElement;if(!r)return;let i=document.createElement(`div`);i.className=`drawio-maximize-spacer`,i.style.height=`${Math.ceil(e.wrapper.getBoundingClientRect().height)}px`,e.maximizeSpacer=i,e.restoreParent=r,e.restoreNextSibling=e.wrapper.nextSibling||null,r.insertBefore(i,e.wrapper),n.hidden=!1,n.appendChild(e.wrapper),e.wrapper.classList.add(`is-maximized`),document.body.classList.add(`drawio-maximized-open`),this.maximizedEntry=e}_exitMaximizedEntry(){let e=this.maximizedEntry;if(!e?.wrapper){this.maximizedEntry=null,document.body.classList.remove(`drawio-maximized-open`);return}let{maximizeSpacer:t,restoreNextSibling:n,restoreParent:r}=e;e.wrapper.classList.remove(`is-maximized`),t?.parentElement?t.replaceWith(e.wrapper):r?.isConnected&&(n?.parentElement===r?r.insertBefore(e.wrapper,n):r.appendChild(e.wrapper)),e.maximizeSpacer=null,e.restoreParent=null,e.restoreNextSibling=null,this.maximizedEntry=null,document.body.classList.remove(`drawio-maximized-open`),this.maximizedRoot&&this.maximizedRoot.childElementCount===0&&(this.maximizedRoot.hidden=!0)}_syncMaximizeButtons(){this.embedEntries.forEach(e=>{let t=e.wrapper?.querySelector(`.drawio-embed-btn[data-action="toggle-maximize"]`);if(!(t instanceof HTMLElement))return;let n=this.maximizedEntry?.key===e.key;z(t,n?`restore`:`maximize`),t.title=n?`Restore diagram size`:`Maximize diagram`,t.setAttribute(`aria-label`,n?`Restore diagram size`:`Maximize diagram`)})}_findEntryByInstanceId(e){for(let t of this.embedEntries.values())if(t.instanceId===e)return t;return null}_onMessage(e){let t=e.data;if(!t||t.source!==`drawio-editor`)return;let n=this._findEntryByInstanceId(t.instanceId);if(n){if(t.type===`fallback-text`){if(n.mode===`view`){this.renderViewerFallback(n,`Failed to render draw.io preview`);return}this.onOpenTextFile?.(n.filePath);return}if(t.type===`error`){if(n.mode===`view`){this.renderViewerFallback(n,t.message||`Failed to load draw.io preview`);return}this.toastController?.show?.(t.message||`Failed to load draw.io`);return}t.type===`request-open-file`&&this.onOpenFile?.(n.filePath)}}_onPreviewClick(e){let t=e.target.closest(`.drawio-embed-placeholder-btn`);if(t){let n=t.closest(`.drawio-embed-placeholder`)?.dataset.drawioKey||``,r=this.embedEntries.get(n);r&&(e.preventDefault(),this.hydrateEntry(r));return}}_onKeyDown(e){e.key===`Escape`&&(this._exitMaximizedEntry(),this._syncMaximizeButtons())}renderViewerFallback(e,t){if(!e.wrapper)return;let n=e.wrapper.querySelector(`.drawio-viewer-shell, .drawio-viewer-frame`);if(!n)return;let r=document.createElement(`div`);r.className=`preview-shell`,r.textContent=t,n.replaceChildren(r),e.viewerElement=r}};function Ma(e,t){let n=new Map;t.forEach(t=>{let r=e.get(t.key)??{filePath:t.filePath,iframe:null,instanceId:null,key:t.key,label:t.label,placeholder:t.placeholder,queued:!1,reusedFromEmbed:!1,wrapper:null};r.filePath=t.filePath,r.key=t.key,r.label=t.label,r.placeholder=t.placeholder,n.set(t.key,r)});let r=[];return e.forEach((e,t)=>{n.has(t)||r.push(e)}),{nextEntries:n,removedEntries:r}}var Na=420,Pa=500,Fa=15e3,Ia=800,La=3,Ra=200,za=`/excalidraw-editor.html`;function Ba(e,t){return typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e,{timeout:t}):window.setTimeout(()=>{e({didTimeout:!1,timeRemaining:()=>0})},1)}function Va(e){if(e!==null){if(typeof window.cancelIdleCallback==`function`){window.cancelIdleCallback(e);return}window.clearTimeout(e)}}function Ha(e,t,n){if(!e||!t)return!1;let r=t.getBoundingClientRect(),i=e.getBoundingClientRect();return i.bottom>=r.top-n&&i.top<=r.bottom+n}var Ua=class{constructor({getTheme:e,getLocalUser:t,onOpenFile:n=null,previewContainer:r,previewElement:i,toastController:a}){this.getTheme=e,this.getLocalUser=t,this.onOpenFile=n,this.previewContainer=r,this.previewElement=i,this.toastController=a,this.embedEntries=new Map,this.hydrationQueue=[],this.hydrationIdleId=null,this.hydrationPaused=!1,this.hydrationInProgress=!1,this.instanceCounter=0,this.isLargeDocument=!1,this.maximizedEmbed=null,this.overlayRoot=null,this.maximizedRoot=null,this.placeholderObserver=null,this.followedPeerIdsByFilePath=new Map,this.pendingDisconnectRequests=new Map,this.disconnectRequestCounter=0,this._onMessage=this._onMessage.bind(this),this._onKeyDown=this._onKeyDown.bind(this),this._onPreviewClick=this._onPreviewClick.bind(this),window.addEventListener(`message`,this._onMessage),window.addEventListener(`keydown`,this._onKeyDown),this.previewElement?.addEventListener(`click`,this._onPreviewClick)}destroy(){window.removeEventListener(`message`,this._onMessage),window.removeEventListener(`keydown`,this._onKeyDown),this.previewElement?.removeEventListener(`click`,this._onPreviewClick),this._disconnectPlaceholderObserver(),Va(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this._exitMaximizedEmbed(),document.body.classList.remove(`excalidraw-maximized-open`),this.embedEntries.forEach(e=>{this._clearEntryBootTimeout(e),e.wrapper?.remove(),e.placeholder=null}),this.embedEntries.clear(),this.pendingDisconnectRequests.forEach(e=>{e.resolve(!1)}),this.pendingDisconnectRequests.clear(),this.followedPeerIdsByFilePath.clear(),this.overlayRoot?.remove(),this.overlayRoot=null,this.maximizedRoot?.remove(),this.maximizedRoot=null}async setFollowedUser(e,t=null){if(!e)return!1;this.followedPeerIdsByFilePath.set(e,t||null);let n=this._findEntryByFilePath(e);return n?(n.wrapper||await this._hydrateEntry(n),n.followedPeerId=this.followedPeerIdsByFilePath.get(e)??null,this._syncEntryFollowState(n),!0):!0}detachForCommit(){this._disconnectPlaceholderObserver(),Va(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this.hydrationInProgress=!1,this.overlayRoot&&(this.overlayRoot.hidden=!0),this.maximizedRoot&&(this.maximizedRoot.hidden=!0),this.embedEntries.forEach(e=>{e.queued=!1,e.placeholder=null})}setHydrationPaused(e){if(this.hydrationPaused=!!e,this.hydrationPaused){Va(this.hydrationIdleId),this.hydrationIdleId=null;return}this.hydrateVisibleEmbeds(),this._scheduleHydration()}reconcileEmbeds(e,{isLargeDocument:t=!1}={}){this.isLargeDocument=!!t,this._disconnectPlaceholderObserver(),Va(this.hydrationIdleId),this.hydrationIdleId=null,this.hydrationQueue=[],this.hydrationInProgress=!1;let n=Array.from(e.querySelectorAll(`.excalidraw-embed-placeholder[data-embed-key]`)).map(e=>({filePath:e.dataset.embedTarget,key:e.dataset.embedKey,label:e.dataset.embedLabel||e.dataset.embedTarget,placeholder:e})),{nextEntries:r,removedEntries:i}=Ma(this.embedEntries,n);this._adoptReusableEntries(r,i),i.forEach(e=>this._destroyEntry(e)),this.embedEntries=r,this._ensurePlaceholderObserver(),this.embedEntries.forEach(e=>{if(e.queued=!1,e.followedPeerId=this.followedPeerIdsByFilePath.get(e.filePath),e.wrapper){this._updateEmbedLabel(e),this._attachWrapper(e);return}e.placeholder&&this.placeholderObserver?.observe(e.placeholder)}),this.hydrationPaused||this.hydrateVisibleEmbeds(),this.syncLayout()}hydrateVisibleEmbeds(){if(this.hydrationPaused)return;let e=this.isLargeDocument?180:420;this.embedEntries.forEach(t=>{t.wrapper||!t.placeholder?.isConnected||Ha(t.placeholder,this.previewContainer,e)&&this._enqueueHydration(t,{prioritize:!0})})}updateTheme(e){this.embedEntries.forEach(t=>{this._postMessageToEntry(t,{source:`collabmd-host`,type:`set-theme`,theme:e})})}updateLocalUser(e){this.embedEntries.forEach(t=>{this._syncEntryUser(t,e)})}prepareFileDisconnect(e,{timeoutMs:t=250}={}){let n=this._findEntryByFilePath(e);if(!n?.iframe?.contentWindow)return Promise.resolve(!1);let r=`disconnect-${++this.disconnectRequestCounter}`;return new Promise(e=>{let i=t=>{if(!this.pendingDisconnectRequests.has(r))return;let n=this.pendingDisconnectRequests.get(r);window.clearTimeout(n.timeoutId),this.pendingDisconnectRequests.delete(r),e(t)},a=window.setTimeout(()=>{i(!1)},t);this.pendingDisconnectRequests.set(r,{entry:n,resolve:i,timeoutId:a}),this._postMessageToEntry(n,{source:`collabmd-host`,type:`prepare-disconnect`,requestId:r})})}_ensurePlaceholderObserver(){this.previewContainer&&(this.placeholderObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(!e.isIntersecting)return;let t=this.embedEntries.get(e.target.dataset.embedKey);t&&this._enqueueHydration(t)})},{root:this.previewContainer,rootMargin:this.isLargeDocument?`180px 0px`:`420px 0px`}))}_disconnectPlaceholderObserver(){this.placeholderObserver&&=(this.placeholderObserver.disconnect(),null)}_enqueueHydration(e,{prioritize:t=!1}={}){if(!(!e||e.wrapper||e.queued)&&(e.queued=!0,t?this.hydrationQueue.unshift(e.key):this.hydrationQueue.push(e.key),!this.hydrationPaused)){if(t&&!this.hydrationInProgress&&this.hydrationIdleId===null){this._flushHydrationQueue();return}this._scheduleHydration()}}_scheduleHydration(){this.hydrationPaused||this.hydrationInProgress||this.hydrationIdleId!==null||(this.hydrationIdleId=Ba(()=>{this.hydrationIdleId=null,this._flushHydrationQueue()},Pa))}async _flushHydrationQueue(){if(this.hydrationPaused||this.hydrationInProgress)return;let e=null;for(;this.hydrationQueue.length>0&&!e;){let t=this.hydrationQueue.shift(),n=this.embedEntries.get(t);if(!n||n.wrapper||!n.placeholder?.isConnected){n&&(n.queued=!1);continue}e=n}e&&(this.hydrationInProgress=!0,e.queued=!1,await this._hydrateEntry(e),this.hydrationInProgress=!1,this.hydrationQueue.length>0&&this._scheduleHydration())}async _hydrateEntry(e){if(!(!e.placeholder?.isConnected&&!e.wrapper)){if(!e.wrapper){let t=this._createEmbedContainer(e);e.wrapper=t.wrapper,e.iframe=t.iframe,e.labelElement=t.labelElement,e.instanceId=t.instanceId,e.isReady=!1,e.bootAttempts=(e.bootAttempts??0)+1,this._armEntryBootTimeout(e)}e.followedPeerId=this.followedPeerIdsByFilePath.get(e.filePath),this._updateEmbedLabel(e),this._attachWrapper(e)}}_attachWrapper(e){let t=e.placeholder?.isConnected?e.placeholder:this.previewElement?.querySelector(`.excalidraw-embed-placeholder[data-embed-key="${e.key}"]`);if(!t)return;if(e.placeholder=t,this._syncMountedEntryMetadata(e),this._shouldInlineFilePreview(e)){e.wrapper.style.position=``,e.wrapper.style.top=``,e.wrapper.style.left=``,e.wrapper.style.width=``,e.wrapper.style.margin=``,e.wrapper.style.pointerEvents=`auto`,t.replaceWith(e.wrapper),e.placeholder=null;return}let n=this._ensureOverlayRoot();n.hidden=!1,e.wrapper?.parentElement!==n&&n.appendChild(e.wrapper),this._syncEntryLayout(e)}_adoptReusableEntries(e,t){e.forEach((n,r)=>{if(n.wrapper||n.iframe)return;let i=t.findIndex(e=>e.filePath===n.filePath&&this._getEntryMode(e)===this._getEntryMode(n)&&(e.wrapper||e.iframe));if(i<0)return;let[a]=t.splice(i,1);a.filePath=n.filePath,a.key=n.key,a.label=n.label,a.placeholder=n.placeholder,a.queued=!1,a.reusedFromEmbed=this._isFilePreviewEntry(n),e.set(r,a)})}_destroyEntry(e){this.pendingDisconnectRequests.forEach((t,n)=>{t.entry===e&&(t.resolve(!1),this.pendingDisconnectRequests.delete(n))}),this.maximizedEmbed?.wrapper===e.wrapper&&this._exitMaximizedEmbed(),this._clearEntryBootTimeout(e),this._resetPlaceholderLayout(e),e.wrapper?.remove(),e.placeholder=null}_armEntryBootTimeout(e){this._clearEntryBootTimeout(e),e.bootTimerId=window.setTimeout(()=>{this._handleEntryBootTimeout(e)},Fa)}_clearEntryBootTimeout(e){e?.bootTimerId&&(window.clearTimeout(e.bootTimerId),e.bootTimerId=null)}async _handleEntryBootTimeout(e){if(e?.iframe?.isConnected){if((e.bootAttempts??0)>=La){this._clearEntryBootTimeout(e),this.toastController?.show(`Excalidraw embed timed out: ${e.label}`);return}await this._retryEntryBootstrap(e)}}async _retryEntryBootstrap(e){e&&(this._clearEntryBootTimeout(e),this._resetPlaceholderLayout(e),this.maximizedEmbed?.wrapper===e.wrapper&&this._exitMaximizedEmbed(),e.wrapper?.remove(),e.wrapper=null,e.iframe=null,e.labelElement=null,e.instanceId=null,e.isReady=!1,await this._hydrateEntry(e))}_findEntryByContentWindow(e){if(!e)return null;for(let t of this.embedEntries.values())if(t.iframe?.contentWindow===e)return t;return null}_findEntryByFilePath(e){if(!e)return null;for(let t of this.embedEntries.values())if(t.filePath===e)return t;return null}_updateEmbedLabel(e){e.labelElement&&(e.labelElement.textContent=e.label.replace(/\.excalidraw$/i,``))}_syncMountedEntryMetadata(e){e.wrapper&&(e.wrapper.dataset.embedKey=e.key,e.wrapper.dataset.file=e.filePath),e.iframe&&(e.iframe.title=`Excalidraw: ${e.filePath}`)}_buildIframeUrl(e){let t=new URL(T(za)),n=this.getTheme?.()||`dark`;t.searchParams.set(`file`,e.filePath),t.searchParams.set(`theme`,n),t.searchParams.set(`boot`,e.instanceId||``),this._isFilePreviewEntry(e)||t.searchParams.set(`mode`,`preview`);let r=this.getLocalUser?.();r?.name&&t.searchParams.set(`userName`,r.name),r?.color&&t.searchParams.set(`userColor`,r.color),r?.colorLight&&t.searchParams.set(`userColorLight`,r.colorLight),r?.peerId&&t.searchParams.set(`userPeerId`,r.peerId);let i=new URLSearchParams(window.location.search),a=i.get(`server`);return a&&t.searchParams.set(`server`,a),i.get(`test`)===`1`&&t.searchParams.set(`test`,`1`),i.has(`syncTimeoutMs`)&&t.searchParams.set(`syncTimeoutMs`,i.get(`syncTimeoutMs`)),t}_createEmbedContainer(e){let t=document.createElement(`div`);t.className=`excalidraw-embed diagram-preview-shell`,t.dataset.embedKey=e.key,t.dataset.file=e.filePath;let n=document.createElement(`div`);n.className=`excalidraw-embed-header diagram-preview-toolbar`;let r=document.createElement(`span`);r.className=`excalidraw-embed-icon`,r.innerHTML=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>`;let i=document.createElement(`span`);i.className=`excalidraw-embed-label`,i.textContent=e.label.replace(/\.excalidraw$/i,``);let a=document.createElement(`button`);a.type=`button`,a.className=`excalidraw-embed-btn ui-preview-action ui-preview-action--icon-only`,a.title=`Edit in Excalidraw`,a.setAttribute(`aria-label`,`Edit in Excalidraw`),z(a,`edit`);let o=document.createElement(`button`);o.type=`button`,o.className=`excalidraw-embed-btn ui-preview-action ui-preview-action--icon-only`,o.title=`Maximize diagram`,o.setAttribute(`aria-label`,`Maximize diagram`),z(o,`maximize`),n.append(r,i),this._isFilePreviewEntry(e)||n.append(a),n.append(o);let s=document.createElement(`iframe`);s.className=`excalidraw-embed-iframe`,s.dataset.instanceId=String(++this.instanceCounter),e.instanceId=s.dataset.instanceId,s.src=this._buildIframeUrl(e).toString(),s.setAttribute(`loading`,`eager`),s.title=`Excalidraw: ${e.filePath}`,s.style.height=`${Na}px`;let c=document.createElement(`div`);c.className=`excalidraw-embed-resizer`,c.title=`Drag to resize`,this._setupResizer(c,s,()=>this._syncEntryLayout(e)),t.append(n,s,c);let l=!1,u=`${Na}px`,d=()=>{z(o,l?`restore`:`maximize`),o.title=l?`Restore diagram size`:`Maximize diagram`,o.setAttribute(`aria-label`,l?`Restore diagram size`:`Maximize diagram`)},f=()=>{l&&(l=!1,t.classList.remove(`is-maximized`),d(),document.body.classList.remove(`excalidraw-maximized-open`),this._restoreWrapperMount(e),s.style.height=u,this.maximizedEmbed?.wrapper===t&&(this.maximizedEmbed=null),this._syncEntryLayout(e))},p=()=>{l||(this._exitMaximizedEmbed(),l=!0,u=s.style.height||`${Na}px`,this._mountWrapperInMaximizedRoot(e),t.classList.add(`is-maximized`),d(),document.body.classList.add(`excalidraw-maximized-open`),this.maximizedEmbed={wrapper:t,exit:f},this._syncEntryLayout(e))};return o.addEventListener(`click`,()=>{l?f():p()}),a.addEventListener(`click`,()=>{this.onOpenFile?.(e.filePath)}),d(),{iframe:s,instanceId:s.dataset.instanceId,labelElement:i,wrapper:t}}_setupResizer(e,t,n=null){let r=0,i=0,a=e=>{let n=e.clientY-r,a=Math.min(Math.max(i+n,Ra),Ia);t.style.height=`${a}px`,t.style.pointerEvents=`none`},o=()=>{t.style.pointerEvents=``,document.removeEventListener(`pointermove`,a),document.removeEventListener(`pointerup`,o),n?.()};e.addEventListener(`pointerdown`,e=>{e.preventDefault(),r=e.clientY,i=t.offsetHeight,document.addEventListener(`pointermove`,a),document.addEventListener(`pointerup`,o)})}_ensureOverlayRoot(){if(this.overlayRoot?.isConnected&&this.overlayRoot.parentElement===this.previewElement)return this.overlayRoot;let e=this.previewElement?.querySelector(`[data-excalidraw-overlay-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.excalidrawOverlayRoot=`true`,e.className=`excalidraw-embed-overlay-root`,this.previewElement?.appendChild(e)),this.overlayRoot=e,e}_ensureMaximizedRoot(){if(this.maximizedRoot?.isConnected&&this.maximizedRoot.parentElement===document.body)return this.maximizedRoot;let e=document.body.querySelector(`[data-excalidraw-maximized-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.excalidrawMaximizedRoot=`true`,e.className=`excalidraw-maximized-root`,document.body.appendChild(e)),this.maximizedRoot=e,e}_isFilePreviewEntry(e){return e?.key===`${e?.filePath}#file-preview`}_getEntryMode(e){return this._isFilePreviewEntry(e)?`edit`:`preview`}_shouldInlineFilePreview(e){return this._isFilePreviewEntry(e)&&!e?.reusedFromEmbed}_resetPlaceholderLayout(e){!e?.placeholder?.isConnected||this._shouldInlineFilePreview(e)||(e.placeholder.classList.remove(`is-hydrated`),e.placeholder.removeAttribute(`data-embed-hydrated`),e.placeholder.style.height=``,e.placeholder.style.pointerEvents=``)}_mountWrapperInMaximizedRoot(e){if(!e?.wrapper)return;let t=this._ensureMaximizedRoot();t.hidden=!1,e.restoreParent=e.wrapper.parentElement||null,e.restoreNextSibling=e.wrapper.nextSibling||null,e.wrapper.style.position=``,e.wrapper.style.top=``,e.wrapper.style.left=``,e.wrapper.style.width=``,e.wrapper.style.margin=``,e.wrapper.parentElement!==t&&t.appendChild(e.wrapper)}_restoreWrapperMount(e){if(e?.wrapper){if(this._shouldInlineFilePreview(e)){let{restoreParent:t,restoreNextSibling:n}=e;t?.isConnected&&(n?.parentElement===t?t.insertBefore(e.wrapper,n):t.appendChild(e.wrapper))}else{let t=this._ensureOverlayRoot();t.hidden=!1,e.wrapper.parentElement!==t&&t.appendChild(e.wrapper)}e.restoreParent=null,e.restoreNextSibling=null,this.maximizedRoot&&this.maximizedRoot.childElementCount===0&&(this.maximizedRoot.hidden=!0)}}_syncEntryLayout(e){if(!e?.wrapper||this._shouldInlineFilePreview(e))return;let t=e.placeholder?.isConnected?e.placeholder:this.previewElement?.querySelector(`.excalidraw-embed-placeholder[data-embed-key="${e.key}"]`);if(!t)return;e.placeholder=t,t.classList.add(`is-hydrated`),t.dataset.embedHydrated=`true`,t.style.pointerEvents=`none`,this._isFilePreviewEntry(e)&&t.childElementCount>0&&t.replaceChildren();let n=e.wrapper.classList.contains(`is-maximized`),r=e.wrapper.querySelector(`.excalidraw-embed-header`)?.offsetHeight||0,i=e.iframe?.offsetHeight||Number.parseFloat(e.iframe?.style.height||``)||Na,a=n?0:e.wrapper.querySelector(`.excalidraw-embed-resizer`)?.offsetHeight||0,o=Math.ceil(r+i+a);if(n||(e.inlineHeightPx=o),t.style.height=`${Math.ceil(e.inlineHeightPx||o||Na)}px`,e.wrapper.style.pointerEvents=`auto`,n){e.wrapper.style.position=``,e.wrapper.style.top=``,e.wrapper.style.left=``,e.wrapper.style.width=``,e.wrapper.style.margin=``;return}e.wrapper.style.position=`absolute`,e.wrapper.style.top=`${t.offsetTop}px`,e.wrapper.style.left=`${t.offsetLeft}px`,e.wrapper.style.width=`${t.offsetWidth}px`,e.wrapper.style.margin=`0`}syncLayout(){this.embedEntries.forEach(e=>{e.wrapper&&!this._shouldInlineFilePreview(e)&&this._syncEntryLayout(e)})}_onPreviewClick(e){let t=e.target.closest(`.excalidraw-embed-placeholder-btn`);if(!t)return;e.preventDefault();let n=this.embedEntries.get(t.dataset.embedKey);n&&this._hydrateEntry(n)}_onMessage(e){if(e.origin!==window.location.origin)return;let t=e.data;if(!t||t.source!==`excalidraw-editor`)return;let n=this._findEntryByContentWindow(e.source);if(n){if(t.type===`ready`){n.isReady=!0,this._clearEntryBootTimeout(n),this._syncEntryUser(n),this._postMessageToEntry(n,{source:`collabmd-host`,type:`set-theme`,theme:this.getTheme?.()||`dark`}),this._syncEntryFollowState(n);return}if(t.type===`error`){n.isReady=!1,this._handleEntryBootTimeout(n);return}if(t.type===`disconnect-ready`){let e=this.pendingDisconnectRequests.get(t.requestId);e?.entry===n&&e.resolve(!0)}}}_onKeyDown(e){e.key===`Escape`&&this._exitMaximizedEmbed()}_exitMaximizedEmbed(){this.maximizedEmbed?.exit&&this.maximizedEmbed.exit(),this.maximizedEmbed=null,document.body.classList.remove(`excalidraw-maximized-open`)}_postMessageToEntry(e,t){e?.iframe?.contentWindow?.postMessage(t,window.location.origin)}_syncEntryUser(e,t=null){let n=t||this.getLocalUser?.();n&&this._postMessageToEntry(e,{source:`collabmd-host`,type:`set-user`,user:{color:n.color||``,colorLight:n.colorLight||``,name:n.name||``,peerId:n.peerId||``}})}_syncEntryFollowState(e){!e?.isReady||e.followedPeerId===void 0||this._postMessageToEntry(e,{source:`collabmd-host`,type:`follow-user`,peerId:e.followedPeerId})}};function Wa(){return typeof window>`u`||typeof window.matchMedia!=`function`?{matches:!1}:window.matchMedia(`(max-width: 768px)`)}function Ga(e){return typeof HTMLElement>`u`||!(e instanceof HTMLElement)?[]:Array.from(e.querySelectorAll(`.create-menu-item`))}var Ka=class{constructor({mobileBreakpointQuery:e=Wa()}={}){this.mobileBreakpointQuery=e,this.activeAnchor=null,this.desktopMenu=null,this.mobileBackdrop=null,this.mobileSheet=null,this.documentPointerDownHandler=null,this.windowResizeHandler=null,this.boundClose=()=>this.close()}isMobileViewport(){return!!this.mobileBreakpointQuery?.matches}isOpen(){return!!(this.desktopMenu||this.mobileSheet)}toggle(e={}){if(this.isOpen()){this.close();return}this.open(e)}open({anchor:e=null,items:t=[],title:n=`Create`}={}){if(this.close({restoreFocus:!1}),!(!Array.isArray(t)||t.length===0)){if(this.activeAnchor=typeof HTMLElement<`u`&&e instanceof HTMLElement?e:null,this.activeAnchor?.setAttribute(`aria-expanded`,`true`),this.isMobileViewport()){this.openMobileSheet({items:t,title:n});return}this.openDesktopMenu({anchor:this.activeAnchor,items:t,title:n})}}close({restoreFocus:e=!0}={}){this.desktopMenu&&=(this.desktopMenu.remove(),null),this.mobileBackdrop&&=(this.mobileBackdrop.remove(),null),this.mobileSheet&&=(this.mobileSheet.remove(),null),this.documentPointerDownHandler&&=(document.removeEventListener(`pointerdown`,this.documentPointerDownHandler),null),this.windowResizeHandler&&typeof window<`u`&&window.removeEventListener(`resize`,this.windowResizeHandler),this.windowResizeHandler=null;let t=this.activeAnchor;this.activeAnchor?.setAttribute(`aria-expanded`,`false`),this.activeAnchor=null,e&&t?.focus?.()}openDesktopMenu({anchor:e,items:t,title:n}){let r=document.createElement(`div`);r.className=`create-menu`,r.setAttribute(`role`,`menu`),r.setAttribute(`aria-label`,n),this.renderMenuItems(r,t),document.body.appendChild(r),this.positionDesktopMenu(r,e),r.addEventListener(`keydown`,e=>{this.handleDesktopMenuKeyDown(e,r)}),this.documentPointerDownHandler=t=>{r.contains(t.target)||e?.contains?.(t.target)||this.close()},this.windowResizeHandler=this.boundClose,setTimeout(()=>{document.addEventListener(`pointerdown`,this.documentPointerDownHandler)},0),typeof window<`u`&&window.addEventListener(`resize`,this.windowResizeHandler),this.desktopMenu=r,Ga(r)[0]?.focus()}openMobileSheet({items:e,title:t}){let n=document.createElement(`button`);n.type=`button`,n.className=`file-action-sheet-backdrop`,n.setAttribute(`aria-label`,`Close ${t.toLowerCase()} menu`);let r=document.createElement(`div`);r.className=`file-action-sheet create-action-sheet`;let i=document.createElement(`div`);i.className=`create-action-sheet-header`,i.textContent=t,r.appendChild(i),this.renderMenuItems(r,e,{mobile:!0});let a=document.createElement(`button`);a.type=`button`,a.className=q({variant:`ghost`,extra:[`file-action-sheet-item`,`create-action-sheet-cancel`]}),a.textContent=`Cancel`,a.addEventListener(`click`,()=>{this.close()}),r.appendChild(a),n.addEventListener(`click`,()=>{this.close()}),document.body.append(n,r),this.mobileBackdrop=n,this.mobileSheet=r}renderMenuItems(e,t,{mobile:n=!1}={}){let r=null;t.forEach(t=>{if(t.group&&t.group!==r){let i=document.createElement(`div`);i.className=n?`create-action-sheet-group`:`create-menu-group`,i.textContent=t.group,e.appendChild(i),r=t.group}let i=document.createElement(`button`);i.type=`button`,i.className=n?q({variant:`ghost`,extra:[`file-action-sheet-item`,`create-action-sheet-item`,`create-action-sheet-option`]}):`create-menu-item`,i.setAttribute(`role`,n?`button`:`menuitem`),i.dataset.actionId=t.id;let a=document.createElement(`span`);a.className=`create-menu-item-icon`,a.setAttribute(`aria-hidden`,`true`),a.innerHTML=t.icon||``,i.appendChild(a);let o=document.createElement(`span`);o.className=`create-menu-item-copy`;let s=document.createElement(`span`);s.className=`create-menu-item-label`,s.textContent=t.label,o.appendChild(s);let c=t.meta||t.hint;if(c){let e=document.createElement(`span`);e.className=`create-menu-item-meta`,e.textContent=c,o.appendChild(e)}i.appendChild(o),i.addEventListener(`click`,()=>{this.close({restoreFocus:!1}),t.onSelect?.()}),e.appendChild(i)})}positionDesktopMenu(e,t){let n=e.getBoundingClientRect(),r=t?.getBoundingClientRect?.(),i=r?.left??8,a=Math.max(8,window.innerWidth-n.width-8),o=Math.max(8,Math.min(i,a)),s=(r?.bottom??8)+8,c=window.innerHeight-n.height-8;s>c&&r&&(s=Math.max(8,r.top-n.height-8)),e.style.left=`${o}px`,e.style.top=`${Math.max(8,s)}px`}handleDesktopMenuKeyDown(e,t){let n=Ga(t);if(n.length===0)return;let r=Math.max(0,n.indexOf(document.activeElement));switch(e.key){case`ArrowDown`:e.preventDefault(),n[(r+1)%n.length]?.focus();break;case`ArrowUp`:e.preventDefault(),n[(r-1+n.length)%n.length]?.focus();break;case`Home`:e.preventDefault(),n[0]?.focus();break;case`End`:e.preventDefault(),n[n.length-1]?.focus();break;case`Escape`:e.preventDefault(),this.close();break;case`Tab`:this.close({restoreFocus:!1});break}}};function qa(e){return String(e??``).replace(/\/+$/u,``).split(`/`).filter(Boolean).pop()||``}function Ja(e,t,n){return e===t?n:`${n}${e.slice(t.length)}`}function Ya(e,t,n){return`${e} ${e===1?t:n}`}function Xa(){return JSON.stringify({type:`excalidraw`,version:2,source:`collabmd`,elements:[],appState:{viewBackgroundColor:`#ffffff`,gridSize:null},files:{}})}function Za(e,t){return t?{...e,requestId:t}:e}var Qa=class{constructor({mobileBreakpointQuery:e=typeof window<`u`&&typeof window.matchMedia==`function`?window.matchMedia(`(max-width: 768px)`):{matches:!1},onFileDelete:t,onFileSelect:n,pendingWorkspaceRequestIds:r=null,state:i,toastController:a,vaultClient:o,view:s,refresh:c}){this.onFileDelete=t,this.onFileSelect=n,this.pendingWorkspaceRequestIds=r,this.state=i,this.toastController=a,this.vaultClient=o,this.view=s,this.refresh=c,this.createButton=document.getElementById(`sidebarCreateBtn`),this.refreshButton=document.getElementById(`refreshFilesBtn`),this.actionDialog=document.getElementById(`fileActionDialog`),this.actionForm=document.getElementById(`fileActionForm`),this.actionTitle=document.getElementById(`fileActionTitle`),this.actionCopy=document.getElementById(`fileActionCopy`),this.actionField=document.getElementById(`fileActionField`),this.actionLabel=document.getElementById(`fileActionLabel`),this.actionInput=document.getElementById(`fileActionInput`),this.actionHint=document.getElementById(`fileActionHint`),this.actionNote=document.getElementById(`fileActionNote`),this.actionCancelButton=document.getElementById(`fileActionCancel`),this.actionSubmitButton=document.getElementById(`fileActionSubmit`),this.createMenu=new Ka({mobileBreakpointQuery:e}),this.pendingAction=null,this.actionBusy=!1}initialize(){this.createButton?.addEventListener(`click`,()=>{this.openRootCreateMenu({anchor:this.createButton})}),this.refreshButton?.addEventListener(`click`,()=>this.refresh()),this.actionCancelButton?.addEventListener(`click`,()=>this.closeActionDialog()),this.actionForm?.addEventListener(`submit`,e=>{e.preventDefault(),this.handleActionSubmit()}),this.actionDialog?.addEventListener(`close`,()=>this.resetActionDialog())}getCreateActions({parentDir:e=``}={}){return[{contextLabel:`New markdown file`,group:`Note`,hint:`Markdown`,icon:this.getCreateActionIcon(`markdown`),id:`markdown`,label:`Markdown note`,meta:`.md`,onSelect:()=>this.handleNewFile({parentDir:e})},{contextLabel:`New base file`,group:`Note`,hint:`Base`,icon:this.getCreateActionIcon(`base`),id:`base`,label:`Base file`,meta:`.base`,onSelect:()=>this.handleNewBase({parentDir:e})},{contextLabel:`New Excalidraw drawing`,group:`Diagram`,hint:`Excalidraw`,icon:this.getCreateActionIcon(`excalidraw`),id:`excalidraw`,label:`Excalidraw drawing`,meta:`.excalidraw`,onSelect:()=>this.handleNewDrawing({parentDir:e})},{contextLabel:`New draw.io diagram`,group:`Diagram`,hint:`draw.io`,icon:this.getCreateActionIcon(`drawio`),id:`drawio`,label:`draw.io diagram`,meta:`.drawio`,onSelect:()=>this.handleNewDrawio({parentDir:e})},{contextLabel:`New Mermaid diagram`,group:`Diagram`,hint:`Mermaid`,icon:this.getCreateActionIcon(`mermaid`),id:`mermaid`,label:`Mermaid diagram`,meta:`.mmd`,onSelect:()=>this.handleNewMermaid({parentDir:e})},{contextLabel:`New PlantUML diagram`,group:`Diagram`,hint:`PlantUML`,icon:this.getCreateActionIcon(`plantuml`),id:`plantuml`,label:`PlantUML diagram`,meta:`.puml`,onSelect:()=>this.handleNewPlantUml({parentDir:e})},{contextLabel:`New folder`,group:`Structure`,hint:`Folder`,icon:this.getCreateActionIcon(`folder`),id:`folder`,label:`Folder`,meta:`folder`,onSelect:()=>this.handleNewFolder({parentDir:e})}]}createContextMenuItems(e=``){return this.getCreateActions({parentDir:e}).map(e=>({label:e.contextLabel,onSelect:e.onSelect}))}getDirectoryContextMenuItems(e){return[...this.createContextMenuItems(e),{label:`Rename / move`,onSelect:()=>this.handleRenameDirectory(e)},{label:`Delete`,danger:!0,onSelect:()=>this.handleDeleteDirectory(e)}]}getFileContextMenuItems(e){return[{label:`Rename / move`,onSelect:()=>this.handleRenameFile(e)},{label:`Delete`,danger:!0,onSelect:()=>this.handleDelete(e)}]}showToast(e){e&&this.toastController?.show(String(e))}getCreateActionIcon(e){switch(e){case`base`:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 4h7l5 5v11a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z"/><path d="M14 4v5h5"/><path d="M8 13h8"/><path d="M8 17h6"/><path d="M8 9h3"/></svg>`;case`drawio`:case`plantuml`:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`;case`excalidraw`:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>`;case`folder`:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>`;case`mermaid`:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 7.5c0-1.38 1.12-2.5 2.5-2.5 1.04 0 1.93.64 2.3 1.56A2.5 2.5 0 0 1 14 8.5v1"/><path d="M19 16.5c0 1.38-1.12 2.5-2.5 2.5-1.04 0-1.93-.64-2.3-1.56A2.5 2.5 0 0 1 10 15.5v-1"/><path d="M8 10.5h8"/><path d="M8 13.5h8"/><path d="M10 8.5v7"/><path d="M14 8.5v7"/></svg>`;default:return`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>`}}showError(e,t){this.showToast(t?.message?`${e}: ${t.message}`:e)}ensureExtension(e,t){return Ae(e,t)}createPendingWorkspaceRequestId(){if(!this.pendingWorkspaceRequestIds)return null;let e=pt();return this.pendingWorkspaceRequestIds.add(e),e}clearPendingWorkspaceRequestId(e){e&&this.pendingWorkspaceRequestIds?.delete(e)}async runWorkspaceMutation(e){let t=this.createPendingWorkspaceRequestId();try{return await e(t)}catch(e){throw this.clearPendingWorkspaceRequestId(t),e}}openActionDialog({title:e,copy:t,label:n=`Path`,hint:r=``,note:i=``,placeholder:a=``,value:o=``,submitLabel:s=`Save`,destructive:c=!1,requiresInput:l=!0,emptyMessage:u=`A value is required`,onSubmit:d}){!this.actionDialog||!this.actionTitle||!this.actionCopy||!this.actionSubmitButton||!this.actionCancelButton||l&&!this.actionInput||(this.actionDialog.open&&(typeof this.actionDialog.close==`function`?this.actionDialog.close():(this.actionDialog.removeAttribute(`open`),this.resetActionDialog())),this.pendingAction={requiresInput:l,emptyMessage:u,onSubmit:d},this.createMenu.close({restoreFocus:!1}),this.view?.removeContextMenu?.(),this.actionTitle.textContent=e,this.actionCopy.textContent=t,this.actionField&&(this.actionField.hidden=!l),this.actionLabel&&(this.actionLabel.textContent=n),this.actionInput&&(this.actionInput.value=o,this.actionInput.placeholder=a,this.actionInput.required=l,this.actionInput.disabled=!1),this.actionHint&&(this.actionHint.textContent=r,this.actionHint.hidden=!l||!r),this.actionNote&&(this.actionNote.textContent=i,this.actionNote.hidden=!i,this.actionNote.classList.toggle(`is-danger`,c)),this.actionSubmitButton.textContent=s,this.actionSubmitButton.disabled=!1,this.actionSubmitButton.classList.toggle(`ui-button--primary`,!c),this.actionSubmitButton.classList.toggle(`ui-button--danger`,c),this.actionCancelButton.disabled=!1,typeof this.actionDialog.showModal==`function`?this.actionDialog.showModal():this.actionDialog.setAttribute(`open`,`true`),requestAnimationFrame(()=>{if(!l||!this.actionInput){this.actionSubmitButton.focus();return}this.actionInput.focus(),o&&this.actionInput.select()}))}resetActionDialog(){this.pendingAction=null,this.actionBusy=!1,this.actionField&&(this.actionField.hidden=!1),this.actionLabel&&(this.actionLabel.textContent=`Path`),this.actionInput&&(this.actionInput.value=``,this.actionInput.placeholder=``,this.actionInput.required=!0,this.actionInput.disabled=!1),this.actionHint&&(this.actionHint.textContent=``,this.actionHint.hidden=!0),this.actionNote&&(this.actionNote.textContent=``,this.actionNote.hidden=!0,this.actionNote.classList.remove(`is-danger`)),this.actionSubmitButton&&(this.actionSubmitButton.textContent=`Save`,this.actionSubmitButton.disabled=!1,this.actionSubmitButton.className=q({variant:`primary`})),this.actionCancelButton&&(this.actionCancelButton.disabled=!1)}closeActionDialog(){if(this.actionDialog){if(this.actionDialog.open&&typeof this.actionDialog.close==`function`){this.actionDialog.close();return}this.actionDialog.removeAttribute(`open`),this.resetActionDialog()}}setActionDialogBusy(e){this.actionBusy=e,this.actionInput&&(this.actionInput.disabled=e||!(this.pendingAction?.requiresInput??!0)),this.actionCancelButton&&(this.actionCancelButton.disabled=e),this.actionSubmitButton&&(this.actionSubmitButton.disabled=e)}async handleActionSubmit(){if(!this.pendingAction?.onSubmit||this.actionBusy)return;let e=this.pendingAction.requiresInput,t=e?this.actionInput?.value.trim()??``:void 0;if(e&&!t){this.showToast(this.pendingAction.emptyMessage),this.actionInput?.focus();return}this.setActionDialogBusy(!0);let n;try{n=await this.pendingAction.onSubmit(t)}catch(e){this.showError(`Failed to complete action`,e)}if(this.setActionDialogBusy(!1),n!==!1){this.closeActionDialog();return}e&&this.actionInput&&(this.actionInput.focus(),this.actionInput.select())}async createVaultFile(e,t,{openAfterCreate:n=!1,errorMessage:r=`Failed to create file`}={}){try{return await this.runWorkspaceMutation(n=>this.vaultClient.createFile(Za({content:t,path:e},n))),this.state.expandDirectoryPath(e,{includeLeaf:!1}),await this.refresh(),n&&this.onFileSelect?.(e),!0}catch(e){return this.showToast(e?.message||r),!1}}async createDirectory(e){let t=B(e);if(!t)return this.showToast(`Folder path is required`),!1;try{return await this.runWorkspaceMutation(e=>this.vaultClient.createDirectory(t,Za({},e))),this.state.expandDirectoryPath(t),await this.refresh(),!0}catch(e){return this.showToast(e?.message||`Failed to create folder`),!1}}async renameVaultFile(e,t,n){let r=B(t);if(!r)return this.showToast(`File path is required`),!1;let i=_(r);if(i&&i.toLowerCase()!==String(n??``).toLowerCase())return this.showToast(`File type changes are not supported during rename. Keep the ${n} extension.`),!1;let a=i?r:`${r}${n}`;if(!qa(a))return this.showToast(`File path is required`),!1;if(a===e)return!0;try{return await this.runWorkspaceMutation(t=>this.vaultClient.renameFile(Za({newPath:a,oldPath:e},t))),this.state.expandDirectoryPath(a,{includeLeaf:!1}),await this.refresh(),this.state.activeFilePath===e&&(this.state.activeFilePath=a,this.onFileSelect?.(a)),!0}catch(e){return this.showToast(e?.message||`Failed to rename`),!1}}async renameDirectory(e,t){let n=B(t);if(!n)return this.showToast(`Folder path is required`),!1;if(n===e)return!0;try{if(await this.runWorkspaceMutation(t=>this.vaultClient.renameDirectory(Za({newPath:n,oldPath:e},t))),this.state.replaceExpandedDirectoryPrefix(e,n),this.state.expandDirectoryPath(n),await this.refresh(),this.state.activeFilePath&&this.state.activeFilePath.startsWith(`${e}/`)){let t=Ja(this.state.activeFilePath,e,n);this.state.activeFilePath=t,this.onFileSelect?.(t)}return!0}catch(e){return this.showToast(e?.message||`Failed to rename folder`),!1}}async deleteVaultFile(e){try{return await this.runWorkspaceMutation(t=>this.vaultClient.deleteFile(e,Za({},t))),await this.refresh(),this.state.activeFilePath===e&&(this.state.activeFilePath=null,this.onFileDelete?.(e)),!0}catch(e){return this.showToast(e?.message||`Failed to delete`),!1}}async deleteDirectory(e,{recursive:t=!1}={}){try{await this.runWorkspaceMutation(n=>this.vaultClient.deleteDirectory(e,Za({recursive:t},n)));let n=this.state.activeFilePath;return await this.refresh(),this.state.removeExpandedDirectoryPrefix(e),n&&n.startsWith(`${e}/`)&&(this.state.activeFilePath=null,this.onFileDelete?.(n)),!0}catch(e){return this.showToast(e?.message||`Failed to delete folder`),!1}}getCreateContext(e=``){let t=B(e);return{hintPrefix:t?`Use "/" to create nested items under this folder.`:`Use "/" to place it inside a folder.`,inputLabelSuffix:t?`name or path`:`path`,note:t?`Parent folder: ${t}`:``,normalizedParentDir:t}}openRootCreateMenu({anchor:e=this.createButton}={}){this.openCreateMenu({anchor:e,parentDir:``})}openCreateMenu({anchor:e=this.createButton,parentDir:t=``}={}){this.view?.removeContextMenu?.(),this.createMenu.toggle({anchor:e,items:this.getCreateActions({parentDir:t}),title:`Create`})}handleNewFile({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create markdown file`,copy:t.normalizedParentDir?`Add a new note inside the selected folder. It opens immediately after creation.`:`Add a new note to the vault. It opens immediately after creation.`,label:`File ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".md" is added automatically.`,note:t.note,placeholder:t.normalizedParentDir?`my-note`:`notes/my-note`,submitLabel:`Create file`,emptyMessage:`File path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`File path is required`),!1;let r=this.ensureExtension(V(t.normalizedParentDir,n),`.md`);return this.createVaultFile(r,je(r),{errorMessage:`Failed to create file`,openAfterCreate:!0})}})}handleNewBase({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create base file`,copy:t.normalizedParentDir?"Add a new `.base` file inside the selected folder. It opens immediately after creation.":"Add a new `.base` file to the vault. It opens immediately after creation.",label:`Base ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".base" is added automatically.`,note:t.note,placeholder:t.normalizedParentDir?`table-view`:`views/table-view`,submitLabel:`Create base`,emptyMessage:`Base path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`Base path is required`),!1;let r=Me(V(t.normalizedParentDir,n));return this.createVaultFile(r.path,r.content,{errorMessage:`Failed to create base file`,openAfterCreate:!0})}})}handleNewFolder({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create folder`,copy:t.normalizedParentDir?`Add a new folder inside the selected folder.`:`Add a new folder to organize notes and diagrams.`,label:`Folder ${t.inputLabelSuffix}`,hint:t.hintPrefix,note:t.note,placeholder:t.normalizedParentDir?`archive`:`notes/archive`,submitLabel:`Create folder`,emptyMessage:`Folder path is required`,onSubmit:e=>this.createDirectory(V(t.normalizedParentDir,e))})}handleNewDrawing({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create Excalidraw drawing`,copy:t.normalizedParentDir?`Start a new drawing inside the selected folder.`:`Start a new drawing file in the vault.`,label:`Drawing ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".excalidraw" is added automatically.`,note:t.note,placeholder:t.normalizedParentDir?`architecture`:`diagrams/architecture`,submitLabel:`Create drawing`,emptyMessage:`Drawing path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`Drawing path is required`),!1;let r=this.ensureExtension(V(t.normalizedParentDir,n),`.excalidraw`);return this.createVaultFile(r,Xa(),{errorMessage:`Failed to create drawing`,openAfterCreate:!0})}})}handleNewMermaid({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create Mermaid diagram`,copy:t.normalizedParentDir?"Create a new `.mmd` or `.mermaid` file inside the selected folder.":"Create a new `.mmd` or `.mermaid` file with starter diagram content.",label:`Diagram ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".mmd" is added automatically unless you enter ".mermaid".`,note:t.note,placeholder:t.normalizedParentDir?`flow`:`diagrams/flow`,submitLabel:`Create diagram`,emptyMessage:`Diagram path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`Diagram path is required`),!1;let r=Ne(V(t.normalizedParentDir,n));return this.createVaultFile(r.path,r.content,{errorMessage:`Failed to create Mermaid diagram`,openAfterCreate:!0})}})}handleNewDrawio({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create draw.io diagram`,copy:t.normalizedParentDir?"Create a new `.drawio` diagram inside the selected folder.":"Create a new `.drawio` diagram with a native starter document.",label:`Diagram ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".drawio" is added automatically.`,note:t.note,placeholder:t.normalizedParentDir?`architecture`:`diagrams/architecture`,submitLabel:`Create diagram`,emptyMessage:`Diagram path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`Diagram path is required`),!1;let r=Pe(V(t.normalizedParentDir,n));return this.createVaultFile(r.path,r.content,{errorMessage:`Failed to create draw.io diagram`,openAfterCreate:!0})}})}handleNewPlantUml({parentDir:e=``}={}){let t=this.getCreateContext(e);this.openActionDialog({title:`Create PlantUML diagram`,copy:t.normalizedParentDir?"Create a new `.puml` or `.plantuml` file inside the selected folder.":"Create a new `.puml` or `.plantuml` file with starter diagram content.",label:`Diagram ${t.inputLabelSuffix}`,hint:`${t.hintPrefix} ".puml" is added automatically unless you enter ".plantuml".`,note:t.note,placeholder:t.normalizedParentDir?`sequence-flow`:`diagrams/sequence-flow`,submitLabel:`Create diagram`,emptyMessage:`Diagram path is required`,onSubmit:e=>{let n=B(e);if(!n)return this.showToast(`Diagram path is required`),!1;let r=Fe(V(t.normalizedParentDir,n));return this.createVaultFile(r.path,r.content,{errorMessage:`Failed to create PlantUML diagram`,openAfterCreate:!0})}})}handleRenameFile(e){let t=_(e)||`.md`;this.openActionDialog({title:`Rename or move file`,copy:`Update the relative path without changing the file type.`,label:`Path`,hint:`Use "/" to move the file into another folder. ${t} is kept automatically.`,value:e,submitLabel:`Save file path`,emptyMessage:`File path is required`,onSubmit:n=>this.renameVaultFile(e,n,t)})}handleRenameDirectory(e){this.openActionDialog({title:`Rename or move folder`,copy:`Update the relative path for this folder and everything inside it.`,label:`Path`,hint:`Use "/" to move the folder into another location in the vault.`,value:e,submitLabel:`Save folder path`,emptyMessage:`Folder path is required`,onSubmit:t=>this.renameDirectory(e,t)})}handleDelete(e){this.openActionDialog({title:`Delete file`,copy:`This permanently removes the file from the vault.`,note:e,submitLabel:`Delete file`,destructive:!0,requiresInput:!1,onSubmit:()=>this.deleteVaultFile(e)})}handleDeleteDirectory(e){let{directoryCount:t,fileCount:n}=this.state.getDirectoryDescendantSummary(e),r=t>0||n>0,i=r?`This will permanently remove ${Ya(n,`file`,`files`)} and ${Ya(t,`nested folder`,`nested folders`)} inside this folder.`:`This permanently removes the empty folder from the vault.`;this.openActionDialog({title:r?`Delete folder and contents`:`Delete folder`,copy:i,note:e,submitLabel:r?`Delete folder and contents`:`Delete folder`,destructive:!0,requiresInput:!1,onSubmit:()=>this.deleteDirectory(e,{recursive:r})})}};function $a(e,t=[],n=[]){for(let r of e)if(!(!r?.path||!r?.type)){if(n.push({lowerPath:String(r.path).toLowerCase(),name:r.name,path:r.path,type:r.type}),r.type===`file`||r.type===`base`||r.type===`excalidraw`||r.type===`drawio`||r.type===`mermaid`||r.type===`plantuml`||r.type===`image`){t.push(r.path);continue}r.type===`directory`&&Array.isArray(r.children)&&$a(r.children,t,n)}return{files:t,searchEntries:n}}function eo(e,t){for(let n of e??[]){if(n?.path===t)return n;if(n?.type===`directory`&&Array.isArray(n.children)){let e=eo(n.children,t);if(e)return e}}return null}function to(e){let t=0,n=0;for(let r of e?.children??[]){if(r?.type===`directory`){t+=1;let e=to(r);t+=e.directoryCount,n+=e.fileCount;continue}n+=1}return{directoryCount:t,fileCount:n}}function no(e,t,n){return e===t?n:`${n}${e.slice(t.length)}`}var ro=class{constructor(){this.tree=[],this.flatFiles=[],this.flatSearchEntries=[],this.activeFilePath=null,this.expandedDirs=new Set,this.searchQuery=``}setTree(e){this.tree=Array.isArray(e)?e:[];let t=$a(this.tree,[],[]);this.flatFiles=t.files,this.flatSearchEntries=t.searchEntries}setSearchQuery(e){this.searchQuery=String(e??``).trim().toLowerCase()}getSearchMatches(){return this.searchQuery?this.flatSearchEntries.filter(e=>e.lowerPath.includes(this.searchQuery)).map(e=>({name:e.name,path:e.path,type:e.type})):[]}getNode(e){return eo(this.tree,e)}getDirectoryDescendantSummary(e){let t=this.getNode(e);return!t||t.type!==`directory`?{directoryCount:0,fileCount:0}:to(t)}setActiveFile(e){this.activeFilePath=e||null,e&&this.expandDirectoryPath(e,{includeLeaf:!1})}toggleDirectory(e){return this.expandedDirs.has(e)?(this.expandedDirs.delete(e),!1):(this.expandedDirs.add(e),!0)}expandDirectoryPath(e,{includeLeaf:t=!0}={}){let n=B(e);if(!n)return;let r=n.split(`/`),i=t?r.length:Math.max(r.length-1,0),a=``;for(let e=0;e<i;e+=1)a=a?`${a}/${r[e]}`:r[e],this.expandedDirs.add(a)}replaceExpandedDirectoryPrefix(e,t){let n=new Set;this.expandedDirs.forEach(r=>{if(r===e||r.startsWith(`${e}/`)){n.add(no(r,e,t));return}n.add(r)}),this.expandedDirs=n}removeExpandedDirectoryPrefix(e){let t=new Set;this.expandedDirs.forEach(n=>{n===e||n.startsWith(`${e}/`)||t.add(n)}),this.expandedDirs=t}};function io(e){return String(e??``).replace(/\/+$/u,``).split(`/`).filter(Boolean).pop()||``}function ao(e){let t=String(e??``).replace(/\/+$/u,``),n=t.lastIndexOf(`/`);return n>=0?t.slice(0,n):``}function oo(e=[],t=``){for(let n of e){if(n.path===t)return n;if(n.type===`directory`&&Array.isArray(n.children)){let e=oo(n.children,t);if(e)return e}}return null}var so=420,co=10,lo=class{constructor({mobileBreakpointQuery:e=window.matchMedia(`(max-width: 768px)`),onDirectorySelect:t,onDirectoryToggle:n,onFileContextMenu:r,onFileSelect:i,onSearchChange:a,onTreeContextMenu:o}){this.onDirectorySelect=t,this.onDirectoryToggle=n,this.onFileContextMenu=r,this.onFileSelect=i,this.onSearchChange=a,this.onTreeContextMenu=o,this.mobileBreakpointQuery=e,this.treeContainer=document.getElementById(`fileTree`),this.searchInput=document.getElementById(`fileSearchInput`),this.renderedDirectoryWrappers=new Map,this.renderedChildContainers=new Map,this.lastRenderMode=`tree`,this.longPressTimer=0,this.longPressContext=null,this.suppressedActivationTarget=null,this.contextMenuCloseHandler=null,this.actionSheetCloseHandler=null}initialize(){this.searchInput?.addEventListener(`input`,e=>{this.onSearchChange?.(e.target.value)}),this.treeContainer?.addEventListener(`contextmenu`,e=>{e.target.closest(`.file-tree-item`)||(e.preventDefault(),this.onTreeContextMenu?.(e))}),this.treeContainer?.addEventListener(`pointerdown`,e=>{e.target.closest(`.file-tree-item`)||this.startLongPress(e,()=>{this.onTreeContextMenu?.({clientX:Number(e.clientX||0),clientY:Number(e.clientY||0),preventDefault(){},target:this.treeContainer})},this.treeContainer)}),this.treeContainer?.addEventListener(`pointermove`,e=>{this.handleLongPressPointerMove(e)},{passive:!0}),this.treeContainer?.addEventListener(`pointerup`,()=>{this.cancelLongPress()}),this.treeContainer?.addEventListener(`pointercancel`,()=>{this.cancelLongPress()}),this.treeContainer?.addEventListener(`scroll`,()=>{this.cancelLongPress()},{passive:!0})}render({activeFilePath:e,changedPaths:t=null,expandedDirs:n,reset:r=!1,searchMatches:i,searchQuery:a,tree:o}){if(!this.treeContainer)return;if(this.searchInput&&this.searchInput.value!==a&&(this.searchInput.value=a),a){this.lastRenderMode=`search`,this.renderSearchResults(i,e);return}if(r||this.lastRenderMode!==`tree`||!Array.isArray(t)||t.length===0){this.renderFullTree(o,{activeFilePath:e,expandedDirs:n}),this.lastRenderMode=`tree`;return}let s=Array.from(new Set(t.map(e=>ao(e)))).sort((e,t)=>e.split(`/`).length-t.split(`/`).length).filter((e,t,n)=>!n.slice(0,t).some(t=>t&&e.startsWith(`${t}/`)));if(s.includes(``)){this.renderFullTree(o,{activeFilePath:e,expandedDirs:n}),this.lastRenderMode=`tree`;return}for(let t of s)if(!this.rerenderDirectoryBranch(t,o,{activeFilePath:e,expandedDirs:n})){this.renderFullTree(o,{activeFilePath:e,expandedDirs:n}),this.lastRenderMode=`tree`;return}this.lastRenderMode=`tree`}renderSearchResults(e,t){if(!this.treeContainer)return;if(this.resetTreeIndexes(),this.treeContainer.innerHTML=``,e.length===0){this.treeContainer.innerHTML=`<div class="file-tree-empty">No matches</div>`;return}let n=document.createDocumentFragment();for(let r of e){if(r.type===`directory`){n.appendChild(this.createSearchDirectoryItem(r));continue}n.appendChild(this.createFileItem({activeFilePath:t,depth:0,filePath:r.path,fileType:r.type||(h(r.path)??`file`),name:r.name||io(r.path)}))}this.treeContainer.appendChild(n)}renderFullTree(e,{activeFilePath:t,expandedDirs:n}){if(this.resetTreeIndexes(),this.treeContainer.innerHTML=``,e.length===0){this.treeContainer.innerHTML=`<div class="file-tree-empty">No vault files found</div>`;return}let r=document.createDocumentFragment();this.renderNodes(e,r,{activeFilePath:t,depth:0,expandedDirs:n}),this.treeContainer.appendChild(r)}resetTreeIndexes(){this.renderedDirectoryWrappers.clear(),this.renderedChildContainers.clear()}renderNodes(e,t,{activeFilePath:n,depth:r,expandedDirs:i}){for(let a of e){if(a.type===`directory`){t.appendChild(this.createDirectoryItem(a,{activeFilePath:n,depth:r,expandedDirs:i}));continue}t.appendChild(this.createFileItem({activeFilePath:n,depth:r,filePath:a.path,fileType:a.type,name:a.name}))}}createDirectoryItem(e,{activeFilePath:t,depth:n,expandedDirs:r}){let i=document.createElement(`div`);i.className=`file-tree-group`;let a=document.createElement(`button`);a.className=`file-tree-item file-tree-dir`,a.style.setProperty(`--depth`,n),a.dataset.depth=n;let o=r.has(e.path);if(a.setAttribute(`aria-expanded`,String(o)),a.innerHTML=`
154
172
  <svg class="file-tree-chevron${o?` expanded`:``}" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="9 18 15 12 9 6"/></svg>
155
173
  <svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
156
- <span class="file-tree-name">${h(e.name)}</span>
174
+ <span class="file-tree-name">${b(e.name)}</span>
157
175
  `,a.addEventListener(`click`,t=>{this.consumeSuppressedActivation(a,t)||this.onDirectoryToggle?.(e.path)}),a.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.onFileContextMenu?.(t,{directoryPath:e.path,type:`directory`})}),this.bindLongPress(a,()=>{this.onFileContextMenu?.(this.createLongPressEvent(a),{directoryPath:e.path,type:`directory`})}),i.appendChild(a),this.renderedDirectoryWrappers.set(e.path,i),o&&Array.isArray(e.children)){let a=document.createElement(`div`);a.className=`file-tree-children`,this.renderedChildContainers.set(e.path,a),this.renderNodes(e.children,a,{activeFilePath:t,depth:n+1,expandedDirs:r}),i.appendChild(a)}else this.renderedChildContainers.delete(e.path);return i}createSearchDirectoryItem(e){let t=document.createElement(`button`);return t.className=`file-tree-item file-tree-dir`,t.style.setProperty(`--depth`,0),t.dataset.depth=0,t.innerHTML=`
158
176
  <svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg>
159
- <span class="file-tree-name">${h(e.name||La(e.path))}</span>
160
- `,t.addEventListener(`click`,n=>{this.consumeSuppressedActivation(t,n)||this.onDirectorySelect?.(e.path)}),t.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.onFileContextMenu?.(t,{directoryPath:e.path,type:`directory`})}),this.bindLongPress(t,()=>{this.onFileContextMenu?.(this.createLongPressEvent(t),{directoryPath:e.path,type:`directory`})}),t}rerenderDirectoryBranch(e,t,{activeFilePath:n,expandedDirs:r}){let i=this.renderedDirectoryWrappers.get(e),a=za(t,e);if(!i||a?.type!==`directory`)return!1;let o=i.querySelector(`.file-tree-dir`),s=r.has(e);o?.setAttribute(`aria-expanded`,String(s)),o?.querySelector(`.file-tree-chevron`)?.classList.toggle(`expanded`,s);let c=Number(o?.dataset.depth??0),l=this.renderedChildContainers.get(e)??i.querySelector(`.file-tree-children`);return this.clearRenderedDescendants(e),s?(l?l.innerHTML=``:(l=document.createElement(`div`),l.className=`file-tree-children`,i.appendChild(l)),this.renderedChildContainers.set(e,l),this.renderNodes(a.children??[],l,{activeFilePath:n,depth:c+1,expandedDirs:r}),!0):(l?.remove(),this.renderedChildContainers.delete(e),!0)}clearRenderedDescendants(e){let t=`${e}/`;Array.from(this.renderedDirectoryWrappers.keys()).forEach(e=>{e.startsWith(t)&&this.renderedDirectoryWrappers.delete(e)}),Array.from(this.renderedChildContainers.keys()).forEach(e=>{e.startsWith(t)&&this.renderedChildContainers.delete(e)})}createFileItem({activeFilePath:e,depth:t,filePath:n,fileType:r=`file`,name:i}){let a=document.createElement(`button`);a.className=`file-tree-item file-tree-file`;let o=r===`drawio`,s=r===`excalidraw`,c=r===`image`,l=r===`mermaid`,u=r===`plantuml`;return o&&a.classList.add(`is-drawio`),s&&a.classList.add(`is-excalidraw`),c&&a.classList.add(`is-image`),l&&a.classList.add(`is-mermaid`),u&&a.classList.add(`is-plantuml`),n===e&&a.classList.add(`active`),a.style.setProperty(`--depth`,t),a.dataset.depth=t,a.dataset.path=n,a.innerHTML=`
161
- ${this.getFileIconSvg({isDrawio:o,isExcalidraw:s,isImage:c,isMermaid:l,isPlantUml:u})}
162
- <span class="file-tree-name">${h(d(i))}</span>
163
- `,a.addEventListener(`click`,e=>{this.consumeSuppressedActivation(a,e)||this.onFileSelect?.(n)}),a.addEventListener(`contextmenu`,e=>{e.preventDefault(),this.onFileContextMenu?.(e,{filePath:n,type:`file`})}),this.bindLongPress(a,()=>{this.onFileContextMenu?.(this.createLongPressEvent(a),{filePath:n,type:`file`})}),a}isMobileViewport(){return!!this.mobileBreakpointQuery?.matches}bindLongPress(e,t){!(e instanceof HTMLElement)||typeof t!=`function`||(e.addEventListener(`pointerdown`,n=>{this.startLongPress(n,t,e)}),e.addEventListener(`pointermove`,e=>{this.handleLongPressPointerMove(e)},{passive:!0}),e.addEventListener(`pointerup`,()=>{this.cancelLongPress()}),e.addEventListener(`pointercancel`,()=>{this.cancelLongPress()}),e.addEventListener(`pointerleave`,()=>{this.cancelLongPress()}))}startLongPress(e,t,n=null){this.isMobileViewport()&&[`touch`,`pen`].includes(String(e.pointerType||``))&&Number(e.button??0)===0&&(this.cancelLongPress(),this.longPressContext={callback:t,pointerId:e.pointerId,startX:Number(e.clientX||0),startY:Number(e.clientY||0),target:n??e.currentTarget??e.target??null},this.longPressTimer=window.setTimeout(()=>{let e=this.longPressContext;this.longPressTimer=0,e&&(this.suppressedActivationTarget=e.target,e.callback(),this.longPressContext=null)},Ba))}handleLongPressPointerMove(e){if(!this.longPressContext||e.pointerId!==this.longPressContext.pointerId)return;let t=Math.abs(Number(e.clientX||0)-this.longPressContext.startX),n=Math.abs(Number(e.clientY||0)-this.longPressContext.startY);(t>Va||n>Va)&&this.cancelLongPress()}cancelLongPress(){this.longPressTimer&&=(window.clearTimeout(this.longPressTimer),0),this.longPressContext=null}createLongPressEvent(e){return{clientX:this.longPressContext?.startX??0,clientY:this.longPressContext?.startY??0,preventDefault(){},stopPropagation(){},target:e}}consumeSuppressedActivation(e,t){return this.suppressedActivationTarget===e?(this.suppressedActivationTarget=null,t?.preventDefault?.(),t?.stopPropagation?.(),!0):!1}getFileIconSvg({isDrawio:e,isExcalidraw:t,isImage:n,isMermaid:r,isPlantUml:i}){return e?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`:t?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>`:n?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.5"/><path d="m21 16-5-5L7 20"/><path d="m14 14 2 2"/></svg>`:r?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 7.5c0-1.38 1.12-2.5 2.5-2.5 1.04 0 1.93.64 2.3 1.56A2.5 2.5 0 0 1 14 8.5v1"/><path d="M19 16.5c0 1.38-1.12 2.5-2.5 2.5-1.04 0-1.93-.64-2.3-1.56A2.5 2.5 0 0 1 10 15.5v-1"/><path d="M8 10.5h8"/><path d="M8 13.5h8"/><path d="M10 8.5v7"/><path d="M14 8.5v7"/></svg>`:i?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`:`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>`}showContextMenu(e,t){if(this.removeContextMenu(),!Array.isArray(t)||t.length===0)return;if(this.isMobileViewport()){this.showActionSheet(t);return}let n=document.createElement(`div`);n.className=`file-context-menu`;for(let e of t){let t=document.createElement(`button`);t.className=`file-context-item${e.danger?` file-context-danger`:``}`,t.textContent=e.label,t.addEventListener(`click`,()=>{this.removeContextMenu(),e.onSelect?.()}),n.appendChild(t)}document.body.appendChild(n);let r=n.getBoundingClientRect(),i=Math.max(8,window.innerWidth-r.width-8),a=Math.max(8,window.innerHeight-r.height-8);n.style.left=`${Math.max(8,Math.min(e.clientX,i))}px`,n.style.top=`${Math.max(8,Math.min(e.clientY,a))}px`;let o=e=>{n.contains(e.target)||this.removeContextMenu()};this.contextMenuCloseHandler=o,setTimeout(()=>document.addEventListener(`click`,o),0)}showActionSheet(e){let t=document.createElement(`button`);t.type=`button`,t.className=`file-action-sheet-backdrop`,t.setAttribute(`aria-label`,`Close file actions`);let n=document.createElement(`div`);n.className=`file-action-sheet`,e.forEach(e=>{let t=document.createElement(`button`);t.type=`button`,t.className=G({variant:`secondary`,extra:[`file-action-sheet-item`,e.danger?`file-context-danger`:``]}),t.textContent=e.label,t.addEventListener(`click`,()=>{this.removeContextMenu(),e.onSelect?.()}),n.appendChild(t)});let r=document.createElement(`button`);r.type=`button`,r.className=G({variant:`ghost`,extra:`file-action-sheet-item`}),r.textContent=`Cancel`,r.addEventListener(`click`,()=>{this.removeContextMenu()}),n.appendChild(r),t.addEventListener(`click`,()=>{this.removeContextMenu()}),document.body.append(t,n),this.actionSheetCloseHandler=()=>{t.remove(),n.remove(),this.actionSheetCloseHandler=null}}removeContextMenu(){this.cancelLongPress(),document.querySelectorAll(`.file-context-menu`).forEach(e=>e.remove()),this.contextMenuCloseHandler&&=(document.removeEventListener(`click`,this.contextMenuCloseHandler),null),this.actionSheetCloseHandler?.()}},Ua=class{constructor({mobileBreakpointQuery:e=window.matchMedia(`(max-width: 768px)`),onFileSelect:t,onFileDelete:n,pendingWorkspaceRequestIds:r=null,toastController:i,vaultClient:a=S}){this.onFileSelect=t,this.onFileDelete=n,this.toastController=i,this.vaultClient=a,this.state=new Ia,this.view=new Ha({mobileBreakpointQuery:e,onDirectorySelect:e=>{this.state.expandDirectoryPath(e),this.state.setSearchQuery(``),this.renderTree({reset:!0})},onDirectoryToggle:e=>{this.state.toggleDirectory(e),this.renderTree()},onFileContextMenu:(e,t)=>{if(t.type===`directory`){this.view.showContextMenu(e,this.actionController.getDirectoryContextMenuItems(t.directoryPath));return}this.view.showContextMenu(e,this.actionController.getFileContextMenuItems(t.filePath))},onFileSelect:e=>{this.onFileSelect?.(e)},onSearchChange:e=>{this.state.setSearchQuery(e),this.renderTree()},onTreeContextMenu:e=>{this.view.showContextMenu(e,this.actionController.createContextMenuItems())}}),this.actionController=new ja({mobileBreakpointQuery:e,onFileDelete:this.onFileDelete,onFileSelect:this.onFileSelect,pendingWorkspaceRequestIds:r,refresh:()=>this.refresh(),state:this.state,toastController:this.toastController,vaultClient:this.vaultClient,view:this.view})}initialize(){this.view.initialize(),this.actionController.initialize()}async refresh(){try{let e=await this.vaultClient.readTree();this.setTree(e.tree||[])}catch(e){console.error(`[explorer] Failed to load file tree:`,e.message)}}setTree(e,{changedPaths:t=null,reset:n=!1}={}){this.state.setTree(e),this.renderTree({changedPaths:t,reset:n})}setActiveFile(e){this.state.setActiveFile(e),this.renderTree()}get flatFiles(){return this.state.flatFiles}get flatDocumentFiles(){return this.state.flatFiles.filter(e=>!c(e))}renderTree({changedPaths:e=null,reset:t=!1}={}){this.view.render({activeFilePath:this.state.activeFilePath,changedPaths:e,expandedDirs:this.state.expandedDirs,reset:t,searchMatches:this.state.getSearchMatches(),searchQuery:this.state.searchQuery,tree:this.state.tree})}},Wa=30;function Ga(e){return String(e??``).split(`/`).pop()||``}function Ka(e){let t=String(e??``).split(`/`);return t.pop(),t.join(`/`)}function qa(e=``){let t=Ga(e),n=Ka(e);return n?`
164
- <span class="file-history-path">${h(t)}</span>
165
- <span class="file-history-dir">${h(n)}</span>
166
- `:`<span class="file-history-path">${h(t)}</span>`}function Ja(e={}){let t=[String(e.authorName||`Unknown`),String(e.relativeDateLabel||``)];return e.status===`renamed`&&e.oldPath&&t.push(`Renamed from ${e.oldPath}`),t.filter(Boolean).map(e=>h(e)).join(` · `)}function Ya(e={}){return e.type===`local`?`local`:`commit:${String(e.hash||``).trim()}:${String(e.pathAtCommit||``).trim()}`}function Xa(){return{commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0}}var Za=class{constructor({diffRenderer:e=null,onOpenCommitDiff:t=()=>{},onOpenFile:n=()=>{},onOpenPreview:r=()=>{},onOpenWorkspaceDiff:i=()=>{},toastController:a=null}={}){this.diffRenderer=e,this.onOpenCommitDiff=t,this.onOpenFile=n,this.onOpenPreview=r,this.onOpenWorkspaceDiff=i,this.toastController=a,this.page=document.getElementById(`diff-page`),this.content=document.getElementById(`diffContent`),this.fileIndicator=document.getElementById(`diffFileIndicator`),this.openEditorButton=document.getElementById(`diffOpenEditorBtn`),this.primaryActionButton=document.getElementById(`diffPrimaryActionBtn`),this.commitButton=document.getElementById(`diffCommitBtn`),this.backToHistoryButton=document.getElementById(`diffBackToHistoryBtn`),this.gitActionsGroup=document.getElementById(`diffGitActionsGroup`),this.editorActionsGroup=document.getElementById(`diffEditorActionsGroup`),this.actionsDivider=document.getElementById(`diffToolbarDivider`),this.stats=document.getElementById(`diffStats`),this.prevButton=document.getElementById(`diffPrevBtn`),this.nextButton=document.getElementById(`diffNextBtn`),this.layoutToggle=document.getElementById(`diffLayoutToggle`),this.modeButtons=Array.from(document.querySelectorAll(`[data-diff-mode]`)),this.currentFilePath=null,this.localChanges=null,this.history=Xa(),this.diffMode=`unified`,this.selectedEntryKey=null,this.detailCache=new Map,this.detailErrors=new Map,this.historyListElement=null,this.historyListScrollTop=0,this.loadingEntryKey=null,this.selectionRequestToken=0}initialize(){this.openEditorButton?.addEventListener(`click`,()=>{this.currentFilePath&&this.onOpenFile?.(this.currentFilePath)}),this.modeButtons.forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-diff-mode`);!t||t===this.diffMode||(this.diffMode=t,this.render())})}),this.content?.addEventListener(`click`,e=>{let t=e.target instanceof Element?e.target.closest(`[data-file-history-select]`):null;if(t){let e=this.findEntryByKey(t.getAttribute(`data-file-history-select`));e&&this.selectEntry(e);return}if(e.target instanceof Element&&e.target.closest(`[data-file-history-open-selected-diff]`)){this.openSelectedDiff();return}if(e.target instanceof Element&&e.target.closest(`[data-file-history-open-selected-preview]`)){this.openSelectedPreview();return}e.target instanceof Element&&e.target.closest(`[data-file-history-load-more]`)&&this.loadMore()})}hide(){this.page?.classList.add(`hidden`),this.content?.classList.remove(`diff-content--history`),this.content&&(this.content.innerHTML=``),this.currentFilePath=null,this.localChanges=null,this.history=Xa(),this.selectedEntryKey=null,this.loadingEntryKey=null,this.detailCache.clear(),this.detailErrors.clear(),this.historyListElement=null,this.historyListScrollTop=0,this.selectionRequestToken=0,this.syncToolbar()}getEntries(){let e=[];this.localChanges&&e.push({...this.localChanges,key:`local`,label:`Local changes`,pathAtCommit:this.currentFilePath,type:`local`});for(let t of this.history.commits??[])e.push({...t,key:Ya({...t,type:`commit`}),type:`commit`});return e}findEntryByKey(e){return this.getEntries().find(t=>t.key===e)??null}getSelectedEntry(){return this.findEntryByKey(this.selectedEntryKey)}getDefaultEntry(){return this.getEntries()[0]??null}getSelectedDetailState(){let e=this.getSelectedEntry();return e?{detail:this.detailCache.get(e.key)??null,entry:e,error:this.detailErrors.get(e.key)??``,loading:this.loadingEntryKey===e.key}:null}async openFileHistory({filePath:e}){this.currentFilePath=String(e??``).trim()||null,this.localChanges=null,this.history={...Xa(),loading:!0},this.selectedEntryKey=null,this.loadingEntryKey=null,this.detailCache.clear(),this.detailErrors.clear(),this.historyListElement=null,this.historyListScrollTop=0,this.selectionRequestToken=0,this.renderLoading();try{let[e,t]=await Promise.all([this.loadLocalChanges().catch(()=>null),this.fetchHistoryPage({offset:0})]);this.localChanges=e,this.history=t;let n=this.getDefaultEntry();return n?(await this.selectEntry(n),{history:t,localChanges:e}):(this.render(),{history:t,localChanges:e})}catch(e){return console.error(`[file-history] Failed to load file history:`,e),this.toastController?.show(`Failed to load file history`),this.localChanges=null,this.history={...Xa(),error:`Failed to load file history`,loaded:!0},this.render(),{history:this.history,localChanges:null}}}async loadLocalChanges(){if(!this.currentFilePath)return null;let e=new URLSearchParams;e.set(`metaOnly`,`true`),e.set(`path`,this.currentFilePath),e.set(`scope`,`all`);let t=await fetch(D(`/git/diff?${e.toString()}`)),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to load local file changes`);let r=n.files?.[0];return r?{...r,summary:n.summary??{additions:Number(r.stats?.additions||0),deletions:Number(r.stats?.deletions||0),filesChanged:1}}:null}async fetchHistoryPage({offset:e=0}={}){if(!this.currentFilePath)return{...Xa(),loaded:!0};let t=new URLSearchParams;t.set(`path`,this.currentFilePath),t.set(`limit`,String(Wa)),t.set(`offset`,String(e));let n=await fetch(D(`/git/file-history?${t.toString()}`)),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to load file history`);let i=Array.isArray(r.commits)?r.commits:[];return{commits:i,error:``,hasMore:!!r.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:e+i.length}}async loadSelectedDetail(e){if(!e)return null;if(e.type===`local`){let t=new URLSearchParams;t.set(`path`,this.currentFilePath||``),t.set(`scope`,`all`);let n=await fetch(D(`/git/diff?${t.toString()}`)),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to load local diff`);return{detail:r.files?.[0]??null,summary:r.summary??e.summary??null}}let t=new URLSearchParams;t.set(`hash`,e.hash||``),t.set(`path`,e.pathAtCommit||``);let n=await fetch(D(`/git/commit?${t.toString()}`)),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to load commit diff`);return{commit:r.commit??null,detail:r.files?.[0]??null,summary:r.summary??null}}async selectEntry(e){if(!e)return null;let t=e.key||Ya(e);this.selectedEntryKey=t,this.detailErrors.delete(t);let n=this.detailCache.get(t);if(n)return this.loadingEntryKey=null,this.render(),n;this.loadingEntryKey=t,this.render();let r=++this.selectionRequestToken;try{let n=await this.loadSelectedDetail(e);return this.detailCache.set(t,n),this.detailErrors.delete(t),r===this.selectionRequestToken&&this.selectedEntryKey===t&&(this.loadingEntryKey=null,this.render()),n}catch(n){return console.error(`[file-history] Failed to load selected diff:`,n),this.toastController?.show(e.type===`local`?`Failed to load local diff`:`Failed to load commit diff`),this.detailErrors.set(t,e.type===`local`?`Failed to load local diff`:`Failed to load commit diff`),r===this.selectionRequestToken&&this.selectedEntryKey===t&&(this.loadingEntryKey=null,this.render()),null}}async loadMore(){if(!(!this.currentFilePath||this.history.loading||this.history.loadingMore||!this.history.hasMore)){this.history={...this.history,error:``,loadingMore:!0},this.render();try{let e=await this.fetchHistoryPage({offset:this.history.offset});this.history={commits:[...this.history.commits,...e.commits],error:``,hasMore:e.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:e.offset},this.render()}catch(e){console.error(`[file-history] Failed to load more history:`,e),this.toastController?.show(`Failed to load file history`),this.history={...this.history,error:`Failed to load file history`,loadingMore:!1},this.render()}}}openSelectedDiff(){let e=this.getSelectedEntry();if(e){if(e.type===`local`){this.onOpenWorkspaceDiff?.(this.currentFilePath);return}this.onOpenCommitDiff?.(e.hash,{historyFilePath:this.currentFilePath,path:e.pathAtCommit})}}openSelectedPreview(){let e=this.getSelectedEntry();!e||e.type!==`commit`||this.onOpenPreview?.({currentFilePath:this.currentFilePath,hash:e.hash,path:e.pathAtCommit})}renderDiffFileHeader(e={}){return typeof this.diffRenderer?.renderFileHeader==`function`?this.diffRenderer.renderFileHeader(e):`
177
+ <span class="file-tree-name">${b(e.name||io(e.path))}</span>
178
+ `,t.addEventListener(`click`,n=>{this.consumeSuppressedActivation(t,n)||this.onDirectorySelect?.(e.path)}),t.addEventListener(`contextmenu`,t=>{t.preventDefault(),this.onFileContextMenu?.(t,{directoryPath:e.path,type:`directory`})}),this.bindLongPress(t,()=>{this.onFileContextMenu?.(this.createLongPressEvent(t),{directoryPath:e.path,type:`directory`})}),t}rerenderDirectoryBranch(e,t,{activeFilePath:n,expandedDirs:r}){let i=this.renderedDirectoryWrappers.get(e),a=oo(t,e);if(!i||a?.type!==`directory`)return!1;let o=i.querySelector(`.file-tree-dir`),s=r.has(e);o?.setAttribute(`aria-expanded`,String(s)),o?.querySelector(`.file-tree-chevron`)?.classList.toggle(`expanded`,s);let c=Number(o?.dataset.depth??0),l=this.renderedChildContainers.get(e)??i.querySelector(`.file-tree-children`);return this.clearRenderedDescendants(e),s?(l?l.innerHTML=``:(l=document.createElement(`div`),l.className=`file-tree-children`,i.appendChild(l)),this.renderedChildContainers.set(e,l),this.renderNodes(a.children??[],l,{activeFilePath:n,depth:c+1,expandedDirs:r}),!0):(l?.remove(),this.renderedChildContainers.delete(e),!0)}clearRenderedDescendants(e){let t=`${e}/`;Array.from(this.renderedDirectoryWrappers.keys()).forEach(e=>{e.startsWith(t)&&this.renderedDirectoryWrappers.delete(e)}),Array.from(this.renderedChildContainers.keys()).forEach(e=>{e.startsWith(t)&&this.renderedChildContainers.delete(e)})}createFileItem({activeFilePath:e,depth:t,filePath:n,fileType:r=`file`,name:i}){let a=document.createElement(`button`);a.className=`file-tree-item file-tree-file`;let o=r===`drawio`,s=r===`excalidraw`,l=r===`base`,u=r===`image`,d=r===`mermaid`,f=r===`plantuml`;return l&&a.classList.add(`is-base`),o&&a.classList.add(`is-drawio`),s&&a.classList.add(`is-excalidraw`),u&&a.classList.add(`is-image`),d&&a.classList.add(`is-mermaid`),f&&a.classList.add(`is-plantuml`),n===e&&a.classList.add(`active`),a.style.setProperty(`--depth`,t),a.dataset.depth=t,a.dataset.path=n,a.innerHTML=`
179
+ ${this.getFileIconSvg({isBase:l,isDrawio:o,isExcalidraw:s,isImage:u,isMermaid:d,isPlantUml:f})}
180
+ <span class="file-tree-name">${b(c(i))}</span>
181
+ `,a.addEventListener(`click`,e=>{this.consumeSuppressedActivation(a,e)||this.onFileSelect?.(n)}),a.addEventListener(`contextmenu`,e=>{e.preventDefault(),this.onFileContextMenu?.(e,{filePath:n,type:`file`})}),this.bindLongPress(a,()=>{this.onFileContextMenu?.(this.createLongPressEvent(a),{filePath:n,type:`file`})}),a}isMobileViewport(){return!!this.mobileBreakpointQuery?.matches}bindLongPress(e,t){!(e instanceof HTMLElement)||typeof t!=`function`||(e.addEventListener(`pointerdown`,n=>{this.startLongPress(n,t,e)}),e.addEventListener(`pointermove`,e=>{this.handleLongPressPointerMove(e)},{passive:!0}),e.addEventListener(`pointerup`,()=>{this.cancelLongPress()}),e.addEventListener(`pointercancel`,()=>{this.cancelLongPress()}),e.addEventListener(`pointerleave`,()=>{this.cancelLongPress()}))}startLongPress(e,t,n=null){this.isMobileViewport()&&[`touch`,`pen`].includes(String(e.pointerType||``))&&Number(e.button??0)===0&&(this.cancelLongPress(),this.longPressContext={callback:t,pointerId:e.pointerId,startX:Number(e.clientX||0),startY:Number(e.clientY||0),target:n??e.currentTarget??e.target??null},this.longPressTimer=window.setTimeout(()=>{let e=this.longPressContext;this.longPressTimer=0,e&&(this.suppressedActivationTarget=e.target,e.callback(),this.longPressContext=null)},so))}handleLongPressPointerMove(e){if(!this.longPressContext||e.pointerId!==this.longPressContext.pointerId)return;let t=Math.abs(Number(e.clientX||0)-this.longPressContext.startX),n=Math.abs(Number(e.clientY||0)-this.longPressContext.startY);(t>co||n>co)&&this.cancelLongPress()}cancelLongPress(){this.longPressTimer&&=(window.clearTimeout(this.longPressTimer),0),this.longPressContext=null}createLongPressEvent(e){return{clientX:this.longPressContext?.startX??0,clientY:this.longPressContext?.startY??0,preventDefault(){},stopPropagation(){},target:e}}consumeSuppressedActivation(e,t){return this.suppressedActivationTarget===e?(this.suppressedActivationTarget=null,t?.preventDefault?.(),t?.stopPropagation?.(),!0):!1}getFileIconSvg({isBase:e,isDrawio:t,isExcalidraw:n,isImage:r,isMermaid:i,isPlantUml:a}){return e?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 4h7l5 5v11a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z"/><path d="M14 4v5h5"/><path d="M8 13h8"/><path d="M8 17h6"/><path d="M8 9h3"/></svg>`:t?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`:n?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 19l7-7 3 3-7 7-3-3z"/><path d="M18 13l-1.5-7.5L2 2l3.5 14.5L13 18l5-5z"/><path d="M2 2l7.586 7.586"/><circle cx="11" cy="11" r="2"/></svg>`:r?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.5"/><path d="m21 16-5-5L7 20"/><path d="m14 14 2 2"/></svg>`:i?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 7.5c0-1.38 1.12-2.5 2.5-2.5 1.04 0 1.93.64 2.3 1.56A2.5 2.5 0 0 1 14 8.5v1"/><path d="M19 16.5c0 1.38-1.12 2.5-2.5 2.5-1.04 0-1.93-.64-2.3-1.56A2.5 2.5 0 0 1 10 15.5v-1"/><path d="M8 10.5h8"/><path d="M8 13.5h8"/><path d="M10 8.5v7"/><path d="M14 8.5v7"/></svg>`:a?`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/></svg>`:`<svg class="file-tree-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>`}showContextMenu(e,t){if(this.removeContextMenu(),!Array.isArray(t)||t.length===0)return;if(this.isMobileViewport()){this.showActionSheet(t);return}let n=document.createElement(`div`);n.className=`file-context-menu`;for(let e of t){let t=document.createElement(`button`);t.className=`file-context-item${e.danger?` file-context-danger`:``}`,t.textContent=e.label,t.addEventListener(`click`,()=>{this.removeContextMenu(),e.onSelect?.()}),n.appendChild(t)}document.body.appendChild(n);let r=n.getBoundingClientRect(),i=Math.max(8,window.innerWidth-r.width-8),a=Math.max(8,window.innerHeight-r.height-8);n.style.left=`${Math.max(8,Math.min(e.clientX,i))}px`,n.style.top=`${Math.max(8,Math.min(e.clientY,a))}px`;let o=e=>{n.contains(e.target)||this.removeContextMenu()};this.contextMenuCloseHandler=o,setTimeout(()=>document.addEventListener(`click`,o),0)}showActionSheet(e){let t=document.createElement(`button`);t.type=`button`,t.className=`file-action-sheet-backdrop`,t.setAttribute(`aria-label`,`Close file actions`);let n=document.createElement(`div`);n.className=`file-action-sheet`,e.forEach(e=>{let t=document.createElement(`button`);t.type=`button`,t.className=q({variant:`secondary`,extra:[`file-action-sheet-item`,e.danger?`file-context-danger`:``]}),t.textContent=e.label,t.addEventListener(`click`,()=>{this.removeContextMenu(),e.onSelect?.()}),n.appendChild(t)});let r=document.createElement(`button`);r.type=`button`,r.className=q({variant:`ghost`,extra:`file-action-sheet-item`}),r.textContent=`Cancel`,r.addEventListener(`click`,()=>{this.removeContextMenu()}),n.appendChild(r),t.addEventListener(`click`,()=>{this.removeContextMenu()}),document.body.append(t,n),this.actionSheetCloseHandler=()=>{t.remove(),n.remove(),this.actionSheetCloseHandler=null}}removeContextMenu(){this.cancelLongPress(),document.querySelectorAll(`.file-context-menu`).forEach(e=>e.remove()),this.contextMenuCloseHandler&&=(document.removeEventListener(`click`,this.contextMenuCloseHandler),null),this.actionSheetCloseHandler?.()}},uo=class{constructor({mobileBreakpointQuery:e=window.matchMedia(`(max-width: 768px)`),onFileSelect:t,onFileDelete:n,pendingWorkspaceRequestIds:r=null,toastController:i,vaultClient:a=S}){this.onFileSelect=t,this.onFileDelete=n,this.toastController=i,this.vaultClient=a,this.state=new ro,this.view=new lo({mobileBreakpointQuery:e,onDirectorySelect:e=>{this.state.expandDirectoryPath(e),this.state.setSearchQuery(``),this.renderTree({reset:!0})},onDirectoryToggle:e=>{this.state.toggleDirectory(e),this.renderTree()},onFileContextMenu:(e,t)=>{if(t.type===`directory`){this.view.showContextMenu(e,this.actionController.getDirectoryContextMenuItems(t.directoryPath));return}this.view.showContextMenu(e,this.actionController.getFileContextMenuItems(t.filePath))},onFileSelect:e=>{this.onFileSelect?.(e)},onSearchChange:e=>{this.state.setSearchQuery(e),this.renderTree()},onTreeContextMenu:e=>{this.view.showContextMenu(e,this.actionController.createContextMenuItems())}}),this.actionController=new Qa({mobileBreakpointQuery:e,onFileDelete:this.onFileDelete,onFileSelect:this.onFileSelect,pendingWorkspaceRequestIds:r,refresh:()=>this.refresh(),state:this.state,toastController:this.toastController,vaultClient:this.vaultClient,view:this.view})}initialize(){this.view.initialize(),this.actionController.initialize()}async refresh(){try{let e=await this.vaultClient.readTree();this.setTree(e.tree||[])}catch(e){console.error(`[explorer] Failed to load file tree:`,e.message)}}setTree(e,{changedPaths:t=null,reset:n=!1}={}){this.state.setTree(e),this.renderTree({changedPaths:t,reset:n})}setActiveFile(e){this.state.setActiveFile(e),this.renderTree()}get flatFiles(){return this.state.flatFiles}get flatDocumentFiles(){return this.state.flatFiles.filter(e=>!o(e))}renderTree({changedPaths:e=null,reset:t=!1}={}){this.view.render({activeFilePath:this.state.activeFilePath,changedPaths:e,expandedDirs:this.state.expandedDirs,reset:t,searchMatches:this.state.getSearchMatches(),searchQuery:this.state.searchQuery,tree:this.state.tree})}},fo=30;function po(e){return String(e??``).split(`/`).pop()||``}function mo(e){let t=String(e??``).split(`/`);return t.pop(),t.join(`/`)}function ho(e=``){let t=po(e),n=mo(e);return n?`
182
+ <span class="file-history-path">${b(t)}</span>
183
+ <span class="file-history-dir">${b(n)}</span>
184
+ `:`<span class="file-history-path">${b(t)}</span>`}function go(e={}){let t=[String(e.authorName||`Unknown`),String(e.relativeDateLabel||``)];return e.status===`renamed`&&e.oldPath&&t.push(`Renamed from ${e.oldPath}`),t.filter(Boolean).map(e=>b(e)).join(` · `)}function _o(e={}){return e.type===`local`?`local`:`commit:${String(e.hash||``).trim()}:${String(e.pathAtCommit||``).trim()}`}function vo(){return{commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0}}var yo=class{constructor({diffRenderer:e=null,onOpenCommitDiff:t=()=>{},onOpenFile:n=()=>{},onOpenPreview:r=()=>{},onOpenWorkspaceDiff:i=()=>{},toastController:a=null}={}){this.diffRenderer=e,this.onOpenCommitDiff=t,this.onOpenFile=n,this.onOpenPreview=r,this.onOpenWorkspaceDiff=i,this.toastController=a,this.page=document.getElementById(`diff-page`),this.content=document.getElementById(`diffContent`),this.fileIndicator=document.getElementById(`diffFileIndicator`),this.openEditorButton=document.getElementById(`diffOpenEditorBtn`),this.primaryActionButton=document.getElementById(`diffPrimaryActionBtn`),this.commitButton=document.getElementById(`diffCommitBtn`),this.backToHistoryButton=document.getElementById(`diffBackToHistoryBtn`),this.gitActionsGroup=document.getElementById(`diffGitActionsGroup`),this.editorActionsGroup=document.getElementById(`diffEditorActionsGroup`),this.actionsDivider=document.getElementById(`diffToolbarDivider`),this.stats=document.getElementById(`diffStats`),this.prevButton=document.getElementById(`diffPrevBtn`),this.nextButton=document.getElementById(`diffNextBtn`),this.layoutToggle=document.getElementById(`diffLayoutToggle`),this.modeButtons=Array.from(document.querySelectorAll(`[data-diff-mode]`)),this.currentFilePath=null,this.localChanges=null,this.history=vo(),this.diffMode=`unified`,this.selectedEntryKey=null,this.detailCache=new Map,this.detailErrors=new Map,this.historyListElement=null,this.historyListScrollTop=0,this.loadingEntryKey=null,this.selectionRequestToken=0}initialize(){this.openEditorButton?.addEventListener(`click`,()=>{this.currentFilePath&&this.onOpenFile?.(this.currentFilePath)}),this.modeButtons.forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-diff-mode`);!t||t===this.diffMode||(this.diffMode=t,this.render())})}),this.content?.addEventListener(`click`,e=>{let t=e.target instanceof Element?e.target.closest(`[data-file-history-select]`):null;if(t){let e=this.findEntryByKey(t.getAttribute(`data-file-history-select`));e&&this.selectEntry(e);return}if(e.target instanceof Element&&e.target.closest(`[data-file-history-open-selected-diff]`)){this.openSelectedDiff();return}if(e.target instanceof Element&&e.target.closest(`[data-file-history-open-selected-preview]`)){this.openSelectedPreview();return}e.target instanceof Element&&e.target.closest(`[data-file-history-load-more]`)&&this.loadMore()})}hide(){this.page?.classList.add(`hidden`),this.content?.classList.remove(`diff-content--history`),this.content&&(this.content.innerHTML=``),this.currentFilePath=null,this.localChanges=null,this.history=vo(),this.selectedEntryKey=null,this.loadingEntryKey=null,this.detailCache.clear(),this.detailErrors.clear(),this.historyListElement=null,this.historyListScrollTop=0,this.selectionRequestToken=0,this.syncToolbar()}getEntries(){let e=[];this.localChanges&&e.push({...this.localChanges,key:`local`,label:`Local changes`,pathAtCommit:this.currentFilePath,type:`local`});for(let t of this.history.commits??[])e.push({...t,key:_o({...t,type:`commit`}),type:`commit`});return e}findEntryByKey(e){return this.getEntries().find(t=>t.key===e)??null}getSelectedEntry(){return this.findEntryByKey(this.selectedEntryKey)}getDefaultEntry(){return this.getEntries()[0]??null}getSelectedDetailState(){let e=this.getSelectedEntry();return e?{detail:this.detailCache.get(e.key)??null,entry:e,error:this.detailErrors.get(e.key)??``,loading:this.loadingEntryKey===e.key}:null}async openFileHistory({filePath:e}){this.currentFilePath=String(e??``).trim()||null,this.localChanges=null,this.history={...vo(),loading:!0},this.selectedEntryKey=null,this.loadingEntryKey=null,this.detailCache.clear(),this.detailErrors.clear(),this.historyListElement=null,this.historyListScrollTop=0,this.selectionRequestToken=0,this.renderLoading();try{let[e,t]=await Promise.all([this.loadLocalChanges().catch(()=>null),this.fetchHistoryPage({offset:0})]);this.localChanges=e,this.history=t;let n=this.getDefaultEntry();return n?(await this.selectEntry(n),{history:t,localChanges:e}):(this.render(),{history:t,localChanges:e})}catch(e){return console.error(`[file-history] Failed to load file history:`,e),this.toastController?.show(`Failed to load file history`),this.localChanges=null,this.history={...vo(),error:`Failed to load file history`,loaded:!0},this.render(),{history:this.history,localChanges:null}}}async loadLocalChanges(){if(!this.currentFilePath)return null;let e=new URLSearchParams;e.set(`metaOnly`,`true`),e.set(`path`,this.currentFilePath),e.set(`scope`,`all`);let t=await fetch(O(`/git/diff?${e.toString()}`)),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to load local file changes`);let r=n.files?.[0];return r?{...r,summary:n.summary??{additions:Number(r.stats?.additions||0),deletions:Number(r.stats?.deletions||0),filesChanged:1}}:null}async fetchHistoryPage({offset:e=0}={}){if(!this.currentFilePath)return{...vo(),loaded:!0};let t=new URLSearchParams;t.set(`path`,this.currentFilePath),t.set(`limit`,String(fo)),t.set(`offset`,String(e));let n=await fetch(O(`/git/file-history?${t.toString()}`)),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to load file history`);let i=Array.isArray(r.commits)?r.commits:[];return{commits:i,error:``,hasMore:!!r.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:e+i.length}}async loadSelectedDetail(e){if(!e)return null;if(e.type===`local`){let t=new URLSearchParams;t.set(`path`,this.currentFilePath||``),t.set(`scope`,`all`);let n=await fetch(O(`/git/diff?${t.toString()}`)),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to load local diff`);return{detail:r.files?.[0]??null,summary:r.summary??e.summary??null}}let t=new URLSearchParams;t.set(`hash`,e.hash||``),t.set(`path`,e.pathAtCommit||``);let n=await fetch(O(`/git/commit?${t.toString()}`)),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to load commit diff`);return{commit:r.commit??null,detail:r.files?.[0]??null,summary:r.summary??null}}async selectEntry(e){if(!e)return null;let t=e.key||_o(e);this.selectedEntryKey=t,this.detailErrors.delete(t);let n=this.detailCache.get(t);if(n)return this.loadingEntryKey=null,this.render(),n;this.loadingEntryKey=t,this.render();let r=++this.selectionRequestToken;try{let n=await this.loadSelectedDetail(e);return this.detailCache.set(t,n),this.detailErrors.delete(t),r===this.selectionRequestToken&&this.selectedEntryKey===t&&(this.loadingEntryKey=null,this.render()),n}catch(n){return console.error(`[file-history] Failed to load selected diff:`,n),this.toastController?.show(e.type===`local`?`Failed to load local diff`:`Failed to load commit diff`),this.detailErrors.set(t,e.type===`local`?`Failed to load local diff`:`Failed to load commit diff`),r===this.selectionRequestToken&&this.selectedEntryKey===t&&(this.loadingEntryKey=null,this.render()),null}}async loadMore(){if(!(!this.currentFilePath||this.history.loading||this.history.loadingMore||!this.history.hasMore)){this.history={...this.history,error:``,loadingMore:!0},this.render();try{let e=await this.fetchHistoryPage({offset:this.history.offset});this.history={commits:[...this.history.commits,...e.commits],error:``,hasMore:e.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:e.offset},this.render()}catch(e){console.error(`[file-history] Failed to load more history:`,e),this.toastController?.show(`Failed to load file history`),this.history={...this.history,error:`Failed to load file history`,loadingMore:!1},this.render()}}}openSelectedDiff(){let e=this.getSelectedEntry();if(e){if(e.type===`local`){this.onOpenWorkspaceDiff?.(this.currentFilePath);return}this.onOpenCommitDiff?.(e.hash,{historyFilePath:this.currentFilePath,path:e.pathAtCommit})}}openSelectedPreview(){let e=this.getSelectedEntry();!e||e.type!==`commit`||this.onOpenPreview?.({currentFilePath:this.currentFilePath,hash:e.hash,path:e.pathAtCommit})}renderDiffFileHeader(e={}){return typeof this.diffRenderer?.renderFileHeader==`function`?this.diffRenderer.renderFileHeader(e):`
167
185
  <div class="diff-file-header">
168
- <span class="diff-file-path">${h(e.path||this.currentFilePath||``)}</span>
186
+ <span class="diff-file-path">${b(e.path||this.currentFilePath||``)}</span>
169
187
  </div>
170
188
  `}renderDiffMarkup(e={}){if(typeof this.diffRenderer?.renderDiffDetail==`function`){let t=this.diffRenderer.mode;this.diffRenderer.mode=this.diffMode;let n=this.diffRenderer.renderDiffDetail(e,0,{includeHeader:!0});return this.diffRenderer.mode=t,n}return`
171
189
  ${this.renderDiffFileHeader(e)}
@@ -173,17 +191,17 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
173
191
  `}syncToolbar(){let e=this.getSelectedDetailState(),t=e?.entry??null,n=e?.detail?.summary??t?.summary??(t?{additions:Number(t.additions||0),deletions:Number(t.deletions||0)}:null),r=Number(n?.additions||0),i=Number(n?.deletions||0),a=!!t;this.fileIndicator&&(this.fileIndicator.textContent=t?.type===`commit`?t.shortHash||`Commit`:t?.type===`local`?`Local changes`:`History`),this.stats&&(this.stats.innerHTML=`
174
192
  <span class="ui-stat-token ui-stat-token--add diff-stats-add">+${r}</span>
175
193
  <span class="ui-stat-token ui-stat-token--del diff-stats-del">-${i}</span>
176
- `,this.stats.classList.toggle(`hidden`,!a)),this.backToHistoryButton?.classList.add(`hidden`),this.gitActionsGroup?.classList.add(`hidden`),this.layoutToggle?.classList.add(`hidden`),this.prevButton?.classList.add(`hidden`),this.nextButton?.classList.add(`hidden`),this.actionsDivider?.classList.add(`hidden`),this.editorActionsGroup?.classList.remove(`hidden`),this.modeButtons.forEach(e=>{e.classList.toggle(`hidden`,!a),e.classList.toggle(`active`,e.getAttribute(`data-diff-mode`)===this.diffMode)}),this.openEditorButton?.toggleAttribute(`disabled`,!this.currentFilePath),this.openEditorButton&&(this.openEditorButton.textContent=`Open File`),this.primaryActionButton?.toggleAttribute(`disabled`,!0),this.commitButton?.toggleAttribute(`disabled`,!0)}renderLoading(){this.page?.classList.remove(`hidden`),this.content&&(this.content.classList.add(`diff-content--history`),this.content.innerHTML=`<div class="git-panel-empty">Loading file history...</div>`),this.historyListElement=null,this.syncToolbar()}renderEmpty(e){this.page?.classList.remove(`hidden`),this.content&&(this.content.classList.add(`diff-content--history`),this.content.innerHTML=`<div class="git-panel-empty">${h(e)}</div>`),this.historyListElement=null,this.syncToolbar()}captureListScroll(){this.historyListElement&&(this.historyListScrollTop=Number(this.historyListElement.scrollTop||0))}restoreListScroll(){if(!this.content?.querySelector){this.historyListElement=null;return}let e=this.content.querySelector(`[data-file-history-list]`);this.historyListElement=e??null,e&&(e.scrollTop=this.historyListScrollTop,e.addEventListener(`scroll`,()=>{this.historyListScrollTop=Number(e.scrollTop||0)},{passive:!0}))}renderScopeLabels(e={}){let t=[];return e.hasStagedChanges&&t.push(`staged`),e.hasWorkingTreeChanges&&t.push(`working tree`),e.hasUntrackedChanges&&t.push(`untracked`),t.length>0?t.join(` · `):`working tree`}renderHistoryItem(e={}){let t=e.key===this.selectedEntryKey,n=Number(e.additions??e.summary?.additions??0),r=Number(e.deletions??e.summary?.deletions??0),i=e.type===`local`?`Live workspace`:Ja(e),a=e.type===`local`?`Local changes`:e.subject||e.shortHash||`Commit`,o=e.type===`local`?`<span class="ui-pill-badge ui-pill-badge--accent file-history-item-badge">Live</span>`:`<span class="ui-pill-badge ui-pill-badge--code file-history-item-badge">${h(e.shortHash||``)}</span>`;return`
194
+ `,this.stats.classList.toggle(`hidden`,!a)),this.backToHistoryButton?.classList.add(`hidden`),this.gitActionsGroup?.classList.add(`hidden`),this.layoutToggle?.classList.add(`hidden`),this.prevButton?.classList.add(`hidden`),this.nextButton?.classList.add(`hidden`),this.actionsDivider?.classList.add(`hidden`),this.editorActionsGroup?.classList.remove(`hidden`),this.modeButtons.forEach(e=>{e.classList.toggle(`hidden`,!a),e.classList.toggle(`active`,e.getAttribute(`data-diff-mode`)===this.diffMode)}),this.openEditorButton?.toggleAttribute(`disabled`,!this.currentFilePath),this.openEditorButton&&(this.openEditorButton.textContent=`Open File`),this.primaryActionButton?.toggleAttribute(`disabled`,!0),this.commitButton?.toggleAttribute(`disabled`,!0)}renderLoading(){this.page?.classList.remove(`hidden`),this.content&&(this.content.classList.add(`diff-content--history`),this.content.innerHTML=`<div class="git-panel-empty">Loading file history...</div>`),this.historyListElement=null,this.syncToolbar()}renderEmpty(e){this.page?.classList.remove(`hidden`),this.content&&(this.content.classList.add(`diff-content--history`),this.content.innerHTML=`<div class="git-panel-empty">${b(e)}</div>`),this.historyListElement=null,this.syncToolbar()}captureListScroll(){this.historyListElement&&(this.historyListScrollTop=Number(this.historyListElement.scrollTop||0))}restoreListScroll(){if(!this.content?.querySelector){this.historyListElement=null;return}let e=this.content.querySelector(`[data-file-history-list]`);this.historyListElement=e??null,e&&(e.scrollTop=this.historyListScrollTop,e.addEventListener(`scroll`,()=>{this.historyListScrollTop=Number(e.scrollTop||0)},{passive:!0}))}renderScopeLabels(e={}){let t=[];return e.hasStagedChanges&&t.push(`staged`),e.hasWorkingTreeChanges&&t.push(`working tree`),e.hasUntrackedChanges&&t.push(`untracked`),t.length>0?t.join(` · `):`working tree`}renderHistoryItem(e={}){let t=e.key===this.selectedEntryKey,n=Number(e.additions??e.summary?.additions??0),r=Number(e.deletions??e.summary?.deletions??0),i=e.type===`local`?`Live workspace`:go(e),a=e.type===`local`?`Local changes`:e.subject||e.shortHash||`Commit`,o=e.type===`local`?`<span class="ui-pill-badge ui-pill-badge--accent file-history-item-badge">Live</span>`:`<span class="ui-pill-badge ui-pill-badge--code file-history-item-badge">${b(e.shortHash||``)}</span>`;return`
177
195
  <button
178
196
  class="ui-record-surface file-history-item${t?` active`:``}${e.type===`local`?` file-history-item-local`:``}"
179
197
  type="button"
180
- data-file-history-select="${h(e.key)}"
198
+ data-file-history-select="${b(e.key)}"
181
199
  aria-current="${t?`true`:`false`}"
182
200
  >
183
201
  <span class="file-history-item-top">
184
202
  <span class="file-history-item-copy">
185
- <span class="file-history-item-title">${h(a)}</span>
186
- <span class="file-history-item-meta">${e.type===`local`?h(this.renderScopeLabels(e)):i}</span>
203
+ <span class="file-history-item-title">${b(a)}</span>
204
+ <span class="file-history-item-meta">${e.type===`local`?b(this.renderScopeLabels(e)):i}</span>
187
205
  </span>
188
206
  ${o}
189
207
  </span>
@@ -195,13 +213,13 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
195
213
  `}renderSelectedHeader(e){let t=e?.entry;return t?`
196
214
  <div class="file-history-detail-header">
197
215
  <div class="file-history-detail-copy">
198
- <span class="file-history-detail-kicker">${t.type===`local`?`Live workspace`:`Commit ${h(t.shortHash||``)}`}</span>
199
- <h2 class="file-history-detail-title">${t.type===`local`?`Local changes`:h(t.subject||t.shortHash||`Commit`)}</h2>
200
- <p class="file-history-detail-meta">${t.type===`local`?h(this.renderScopeLabels(t)):Ja(t)}</p>
216
+ <span class="file-history-detail-kicker">${t.type===`local`?`Live workspace`:`Commit ${b(t.shortHash||``)}`}</span>
217
+ <h2 class="file-history-detail-title">${t.type===`local`?`Local changes`:b(t.subject||t.shortHash||`Commit`)}</h2>
218
+ <p class="file-history-detail-meta">${t.type===`local`?b(this.renderScopeLabels(t)):go(t)}</p>
201
219
  </div>
202
220
  <div class="file-history-detail-actions">
203
221
  <button
204
- class="${G({variant:`secondary`,action:!0,surface:!0})}"
222
+ class="${q({variant:`secondary`,action:!0,surface:!0})}"
205
223
  type="button"
206
224
  data-file-history-open-selected-diff
207
225
  >
@@ -209,7 +227,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
209
227
  </button>
210
228
  ${t.type===`commit`?`
211
229
  <button
212
- class="${G({variant:`primary`,action:!0})}"
230
+ class="${q({variant:`primary`,action:!0})}"
213
231
  type="button"
214
232
  data-file-history-open-selected-preview
215
233
  >
@@ -234,7 +252,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
234
252
  `:e.error?`
235
253
  <section class="diff-file-block file-history-diff-block">
236
254
  ${this.renderDiffFileHeader({path:t.pathAtCommit||this.currentFilePath||``})}
237
- <div class="diff-empty-state">${h(e.error)}</div>
255
+ <div class="diff-empty-state">${b(e.error)}</div>
238
256
  </section>
239
257
  `:e.detail?.detail?`
240
258
  <section class="diff-file-block file-history-diff-block">
@@ -245,7 +263,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
245
263
  <aside class="file-history-sidebar" aria-label="File history entries">
246
264
  <header class="file-history-sidebar-header">
247
265
  <span class="file-history-kicker">File history</span>
248
- <div class="file-history-title">${qa(this.currentFilePath)}</div>
266
+ <div class="file-history-title">${ho(this.currentFilePath)}</div>
249
267
  <p class="file-history-sidebar-copy">Select an entry to inspect the exact changes for this file.</p>
250
268
  </header>
251
269
  <div class="file-history-list" data-file-history-list>
@@ -254,7 +272,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
254
272
  ${this.history.hasMore?`
255
273
  <div class="git-history-footer file-history-footer">
256
274
  <button
257
- class="${G({variant:`secondary`,size:`compact`,action:!0,surface:!0,extra:`git-history-load-more`})}"
275
+ class="${q({variant:`secondary`,size:`compact`,action:!0,surface:!0,extra:`git-history-load-more`})}"
258
276
  type="button"
259
277
  data-file-history-load-more
260
278
  ${this.history.loadingMore?`disabled`:``}
@@ -271,16 +289,16 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
271
289
  </div>
272
290
  </section>
273
291
  </section>
274
- `,this.restoreListScroll()}};function Qa(e){return String(e??``).split(`/`).pop()||``}function $a(e){let t=String(e??``).split(`/`);return t.pop(),t.join(`/`)}function eo(e){return`diff-section-${encodeURIComponent(String(e??``)).replace(/%/g,`_`)}`}function to(e){switch(e){case`added`:case`untracked`:return`ui-status-badge--success`;case`deleted`:return`ui-status-badge--danger`;case`renamed`:return`ui-status-badge--accent`;default:return`ui-status-badge--warning`}}function no(e=!1){return`<svg class="diff-section-chevron${e?` collapsed`:``}" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>`}function ro(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;return n}function io(e,t,n){let r=0,i=Math.min(e.length,t.length)-n;for(;r<i;){let n=e.length-1-r,i=t.length-1-r;if(e[n]!==t[i])break;r+=1}return r}function ao(e,t){let n=ro(e,t),r=io(e,t,n),i=Math.max(n,e.length-r),a=Math.max(n,t.length-r);return{leftHtml:`${h(e.slice(0,n))}${i>n?`<span class="diff-highlight-del">${h(e.slice(n,i))}</span>`:``}${h(e.slice(i))}`,rightHtml:`${h(t.slice(0,n))}${a>n?`<span class="diff-highlight-add">${h(t.slice(n,a))}</span>`:``}${h(t.slice(a))}`}}function oo(e=[]){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r.type===`context`||r.type===`note`){t.push({additions:[],context:[r],deletions:[]});continue}if(r.type!==`deletion`&&r.type!==`addition`)continue;let i=[],a=[];for(;n<e.length&&e[n].type===`deletion`;)i.push(e[n]),n+=1;for(;n<e.length&&e[n].type===`addition`;)a.push(e[n]),n+=1;--n,t.push({additions:a,context:[],deletions:i})}return t}function so(e,t,n){let r=Number.isInteger(e.oldLine)?e.oldLine:``,i=Number.isInteger(e.newLine)?e.newLine:``;return`
292
+ `,this.restoreListScroll()}};function bo(e){return String(e??``).split(`/`).pop()||``}function xo(e){let t=String(e??``).split(`/`);return t.pop(),t.join(`/`)}function So(e){return`diff-section-${encodeURIComponent(String(e??``)).replace(/%/g,`_`)}`}function Co(e){switch(e){case`added`:case`untracked`:return`ui-status-badge--success`;case`deleted`:return`ui-status-badge--danger`;case`renamed`:return`ui-status-badge--accent`;default:return`ui-status-badge--warning`}}function wo(e=!1){return`<svg class="diff-section-chevron${e?` collapsed`:``}" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>`}function To(e,t){let n=0;for(;n<e.length&&n<t.length&&e[n]===t[n];)n+=1;return n}function Eo(e,t,n){let r=0,i=Math.min(e.length,t.length)-n;for(;r<i;){let n=e.length-1-r,i=t.length-1-r;if(e[n]!==t[i])break;r+=1}return r}function Do(e,t){let n=To(e,t),r=Eo(e,t,n),i=Math.max(n,e.length-r),a=Math.max(n,t.length-r);return{leftHtml:`${b(e.slice(0,n))}${i>n?`<span class="diff-highlight-del">${b(e.slice(n,i))}</span>`:``}${b(e.slice(i))}`,rightHtml:`${b(t.slice(0,n))}${a>n?`<span class="diff-highlight-add">${b(t.slice(n,a))}</span>`:``}${b(t.slice(a))}`}}function Oo(e=[]){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r.type===`context`||r.type===`note`){t.push({additions:[],context:[r],deletions:[]});continue}if(r.type!==`deletion`&&r.type!==`addition`)continue;let i=[],a=[];for(;n<e.length&&e[n].type===`deletion`;)i.push(e[n]),n+=1;for(;n<e.length&&e[n].type===`addition`;)a.push(e[n]),n+=1;--n,t.push({additions:a,context:[],deletions:i})}return t}function ko(e,t,n){let r=Number.isInteger(e.oldLine)?e.oldLine:``,i=Number.isInteger(e.newLine)?e.newLine:``;return`
275
293
  <div class="diff-line ${e.type===`note`?`note`:e.type}">
276
294
  <div class="diff-line-numbers">
277
295
  <span class="diff-line-num">${r}</span>
278
296
  <span class="diff-line-num">${i}</span>
279
297
  </div>
280
- <div class="diff-line-prefix">${h(e.type===`context`||e.type===`note`?` `:t)}</div>
298
+ <div class="diff-line-prefix">${b(e.type===`context`||e.type===`note`?` `:t)}</div>
281
299
  <div class="diff-line-content">${n}</div>
282
300
  </div>
283
- `}function co(e,t){let n=e?h(e.content):``,r=t?h(t.content):``;if(e&&t&&e.type===`deletion`&&t.type===`addition`){let i=ao(e.content,t.content);n=i.leftHtml,r=i.rightHtml}return`
301
+ `}function Ao(e,t){let n=e?b(e.content):``,r=t?b(t.content):``;if(e&&t&&e.type===`deletion`&&t.type===`addition`){let i=Do(e.content,t.content);n=i.leftHtml,r=i.rightHtml}return`
284
302
  <div class="diff-split-row">
285
303
  <div class="diff-split-line ${e?.type||`empty`}">
286
304
  <span class="diff-split-num">${Number.isInteger(e?.oldLine)?e.oldLine:``}</span>
@@ -291,24 +309,24 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
291
309
  <span class="diff-split-content">${r}</span>
292
310
  </div>
293
311
  </div>
294
- `}var lo=class{constructor({onBackToHistory:e=null,onCommitStaged:t=null,onOpenFile:n=null,onStageFile:r=null,onUnstageFile:i=null,toastController:a=null}={}){this.onBackToHistory=e,this.onCommitStaged=t,this.onOpenFile=n,this.onStageFile=r,this.onUnstageFile=i,this.toastController=a,this.page=document.getElementById(`diff-page`),this.content=document.getElementById(`diffContent`),this.scrollContainer=document.getElementById(`diffScroll`),this.fileIndicator=document.getElementById(`diffFileIndicator`),this.openEditorButton=document.getElementById(`diffOpenEditorBtn`),this.primaryActionButton=document.getElementById(`diffPrimaryActionBtn`),this.commitButton=document.getElementById(`diffCommitBtn`),this.backToHistoryButton=document.getElementById(`diffBackToHistoryBtn`),this.gitActionsGroup=document.getElementById(`diffGitActionsGroup`),this.editorActionsGroup=document.getElementById(`diffEditorActionsGroup`),this.actionsDivider=document.getElementById(`diffToolbarDivider`),this.stats=document.getElementById(`diffStats`),this.prevButton=document.getElementById(`diffPrevBtn`),this.nextButton=document.getElementById(`diffNextBtn`),this.layoutToggle=document.getElementById(`diffLayoutToggle`),this.modeButtons=Array.from(document.querySelectorAll(`[data-diff-mode]`)),this.layoutButtons=Array.from(document.querySelectorAll(`[data-diff-layout]`)),this.mode=`unified`,this.layoutMode=`focused`,this.source=`workspace`,this.data=null,this.currentIndex=0,this.activeFilePath=null,this.fileCache=new Map,this.fileErrors=new Map,this.loadingFiles=new Set,this.collapsedFiles=new Set,this.fileLoadPromises=new Map,this.requestScope=`all`,this.commitHash=null,this.commitMeta=null,this.historyFilePath=null,this.pendingAction=null,this.repoStatus=null}initialize(){this.prevButton?.addEventListener(`click`,()=>this.navigateFile(-1)),this.nextButton?.addEventListener(`click`,()=>this.navigateFile(1)),this.backToHistoryButton?.addEventListener(`click`,()=>{this.commitMeta?.hash&&this.onBackToHistory?.({hash:this.commitMeta.hash,historyFilePath:this.historyFilePath})}),this.openEditorButton?.addEventListener(`click`,()=>{if(this.source!==`workspace`)return;let e=this.getCurrentFile();e?.path&&this.onOpenFile?.(e.path)}),this.primaryActionButton?.addEventListener(`click`,()=>{let e=this.getPrimaryAction();e&&this.handleFileAction(e)}),this.commitButton?.addEventListener(`click`,()=>{this.handleFileAction(`commit`)}),this.content?.addEventListener(`click`,e=>{let t=e.target instanceof Element?e.target.closest(`[data-load-full-diff]`):null;if(t){let e=t.getAttribute(`data-diff-file-path`)||this.activeFilePath;e&&this.loadFileForPath(e,{forceFullPatch:!0});return}let n=e.target instanceof Element?e.target.closest(`[data-diff-section-toggle]`):null;if(n){let e=n.getAttribute(`data-diff-section-toggle`);e&&this.toggleFileSection(e);return}let r=e.target instanceof Element?e.target.closest(`[data-diff-index-path]`):null;if(r){let e=r.getAttribute(`data-diff-index-path`);e&&this.handleIndexSelection(e)}}),this.modeButtons.forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-diff-mode`);!t||t===this.mode||(this.mode=t,this.render())})}),this.layoutButtons.forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-diff-layout`);!t||t===this.layoutMode||this.setLayoutMode(t)})}),this.scrollContainer?.addEventListener(`scroll`,()=>{this.handleScrollSelection()})}hide(){this.page?.classList.add(`hidden`),this.content&&(this.content.innerHTML=``),this.data=null,this.source=`workspace`,this.layoutMode=`focused`,this.currentIndex=0,this.activeFilePath=null,this.fileCache.clear(),this.fileErrors.clear(),this.loadingFiles.clear(),this.collapsedFiles.clear(),this.fileLoadPromises.clear(),this.requestScope=`all`,this.commitHash=null,this.commitMeta=null,this.historyFilePath=null,this.pendingAction=null,this.repoStatus=null,this.syncToolbar()}async openWorkspaceDiff({filePath:e=null,scope:t=`all`}={}){this.source=`workspace`,this.layoutMode=`focused`,this.commitHash=null,this.commitMeta=null,this.historyFilePath=null,this.activeFilePath=e,this.fileCache.clear(),this.fileErrors.clear(),this.loadingFiles.clear(),this.collapsedFiles.clear(),this.fileLoadPromises.clear(),this.requestScope=t,this.renderLoading(`Loading diff summary...`);try{let n=new URLSearchParams;n.set(`scope`,t),e&&n.set(`path`,e),n.set(`metaOnly`,`true`);let r=await fetch(D(`/git/diff?${n.toString()}`)),i=await r.json();if(!r.ok)throw Error(i.error||`Failed to load git diff`);this.data=i;let a=e?Math.max(0,i.files.findIndex(t=>t.path===e)):0;return this.currentIndex=a,this.activeFilePath=i.files?.[a]?.path??null,(i.files?.length??0)===0?(this.render(),i):(await this.loadCurrentFile(),i)}catch(e){return console.error(`[git-diff] Failed to load diff:`,e),this.toastController?.show(`Failed to load git diff`),this.data={files:[],metaOnly:!1,source:`workspace`,summary:{additions:0,deletions:0,filesChanged:0}},this.renderEmpty(`Failed to load git diff`),this.data}}async openCommitDiff({hash:e,path:t=null,historyFilePath:n=null}={}){this.source=`commit`,this.layoutMode=`stacked`,this.commitHash=String(e??``).trim()||null,this.commitMeta=null,this.historyFilePath=String(n??``).trim()||null,this.activeFilePath=t||null,this.fileCache.clear(),this.fileErrors.clear(),this.loadingFiles.clear(),this.collapsedFiles.clear(),this.fileLoadPromises.clear(),this.requestScope=`all`,this.renderLoading(`Loading commit summary...`);try{let e=new URLSearchParams;e.set(`hash`,this.commitHash||``),e.set(`metaOnly`,`true`);let n=await fetch(D(`/git/commit?${e.toString()}`)),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to load git commit`);this.data=r,this.commitMeta=r.commit??null;let i=t?Math.max(0,r.files.findIndex(e=>e.path===t)):0;return this.currentIndex=i,this.activeFilePath=r.files?.[i]?.path??null,this.collapsedFiles=new Set((r.files??[]).map(e=>e.path).filter(e=>e&&e!==this.activeFilePath)),(r.files?.length??0)===0?(this.render(),r):(this.activeFilePath&&await this.loadFileForPath(this.activeFilePath,{render:!1}),this.render(),r)}catch(e){return console.error(`[git-diff] Failed to load commit:`,e),this.toastController?.show(`Failed to load git commit`),this.data={commit:null,files:[],metaOnly:!1,source:`commit`,summary:{additions:0,deletions:0,filesChanged:0}},this.commitMeta=null,this.renderEmpty(`Failed to load git commit`),this.data}}async open(e={}){return this.openWorkspaceDiff(e)}async setLayoutMode(e){let t=e===`stacked`?`stacked`:`focused`;if(this.source!==`commit`){this.layoutMode=`focused`,this.render();return}if(this.layoutMode=t,this.activeFilePath&&this.setActiveFilePath(this.activeFilePath),this.layoutMode===`focused`){await this.loadCurrentFile();return}this.activeFilePath&&(this.collapsedFiles.delete(this.activeFilePath),await this.loadFileForPath(this.activeFilePath,{render:!1})),this.render()}navigateFile(e){if(!this.data?.files?.length||this.source===`commit`&&this.layoutMode===`stacked`)return;let t=Math.max(0,Math.min(this.currentIndex+e,this.data.files.length-1));t!==this.currentIndex&&(this.currentIndex=t,this.activeFilePath=this.data.files[t]?.path??null,this.scrollContainer?.scrollTo({top:0,behavior:`auto`}),this.loadCurrentFile())}renderLoading(e=`Loading git diff...`){this.page?.classList.remove(`hidden`),this.content&&(this.content.innerHTML=`<div class="diff-empty-state">${h(e)}</div>`),this.data=null,this.syncToolbar()}renderEmpty(e){this.page?.classList.remove(`hidden`),this.content&&(this.content.innerHTML=`<div class="diff-empty-state">${h(e)}</div>`),this.syncToolbar()}renderUnifiedHunk(e){let t=[];for(let n of oo(e.lines)){if(n.context.length>0){for(let e of n.context)t.push(so(e,` `,h(e.content)));continue}let e=Math.max(n.deletions.length,n.additions.length);for(let r=0;r<e;r+=1){let e=n.deletions[r]??null,i=n.additions[r]??null,a=e&&i?ao(e.content,i.content):null;e&&t.push(so(e,`-`,a?.leftHtml??h(e.content))),i&&t.push(so(i,`+`,a?.rightHtml??h(i.content)))}}return`
295
- <div class="diff-hunk-header">${h(e.header)}</div>
312
+ `}var jo=class{constructor({onBackToHistory:e=null,onCommitStaged:t=null,onOpenFile:n=null,onStageFile:r=null,onUnstageFile:i=null,toastController:a=null}={}){this.onBackToHistory=e,this.onCommitStaged=t,this.onOpenFile=n,this.onStageFile=r,this.onUnstageFile=i,this.toastController=a,this.page=document.getElementById(`diff-page`),this.content=document.getElementById(`diffContent`),this.scrollContainer=document.getElementById(`diffScroll`),this.fileIndicator=document.getElementById(`diffFileIndicator`),this.openEditorButton=document.getElementById(`diffOpenEditorBtn`),this.primaryActionButton=document.getElementById(`diffPrimaryActionBtn`),this.commitButton=document.getElementById(`diffCommitBtn`),this.backToHistoryButton=document.getElementById(`diffBackToHistoryBtn`),this.gitActionsGroup=document.getElementById(`diffGitActionsGroup`),this.editorActionsGroup=document.getElementById(`diffEditorActionsGroup`),this.actionsDivider=document.getElementById(`diffToolbarDivider`),this.stats=document.getElementById(`diffStats`),this.prevButton=document.getElementById(`diffPrevBtn`),this.nextButton=document.getElementById(`diffNextBtn`),this.layoutToggle=document.getElementById(`diffLayoutToggle`),this.modeButtons=Array.from(document.querySelectorAll(`[data-diff-mode]`)),this.layoutButtons=Array.from(document.querySelectorAll(`[data-diff-layout]`)),this.mode=`unified`,this.layoutMode=`focused`,this.source=`workspace`,this.data=null,this.currentIndex=0,this.activeFilePath=null,this.fileCache=new Map,this.fileErrors=new Map,this.loadingFiles=new Set,this.collapsedFiles=new Set,this.fileLoadPromises=new Map,this.requestScope=`all`,this.commitHash=null,this.commitMeta=null,this.historyFilePath=null,this.pendingAction=null,this.repoStatus=null}initialize(){this.prevButton?.addEventListener(`click`,()=>this.navigateFile(-1)),this.nextButton?.addEventListener(`click`,()=>this.navigateFile(1)),this.backToHistoryButton?.addEventListener(`click`,()=>{this.commitMeta?.hash&&this.onBackToHistory?.({hash:this.commitMeta.hash,historyFilePath:this.historyFilePath})}),this.openEditorButton?.addEventListener(`click`,()=>{if(this.source!==`workspace`)return;let e=this.getCurrentFile();e?.path&&this.onOpenFile?.(e.path)}),this.primaryActionButton?.addEventListener(`click`,()=>{let e=this.getPrimaryAction();e&&this.handleFileAction(e)}),this.commitButton?.addEventListener(`click`,()=>{this.handleFileAction(`commit`)}),this.content?.addEventListener(`click`,e=>{let t=e.target instanceof Element?e.target.closest(`[data-load-full-diff]`):null;if(t){let e=t.getAttribute(`data-diff-file-path`)||this.activeFilePath;e&&this.loadFileForPath(e,{forceFullPatch:!0});return}let n=e.target instanceof Element?e.target.closest(`[data-diff-section-toggle]`):null;if(n){let e=n.getAttribute(`data-diff-section-toggle`);e&&this.toggleFileSection(e);return}let r=e.target instanceof Element?e.target.closest(`[data-diff-index-path]`):null;if(r){let e=r.getAttribute(`data-diff-index-path`);e&&this.handleIndexSelection(e)}}),this.modeButtons.forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-diff-mode`);!t||t===this.mode||(this.mode=t,this.render())})}),this.layoutButtons.forEach(e=>{e.addEventListener(`click`,()=>{let t=e.getAttribute(`data-diff-layout`);!t||t===this.layoutMode||this.setLayoutMode(t)})}),this.scrollContainer?.addEventListener(`scroll`,()=>{this.handleScrollSelection()})}hide(){this.page?.classList.add(`hidden`),this.content&&(this.content.innerHTML=``),this.data=null,this.source=`workspace`,this.layoutMode=`focused`,this.currentIndex=0,this.activeFilePath=null,this.fileCache.clear(),this.fileErrors.clear(),this.loadingFiles.clear(),this.collapsedFiles.clear(),this.fileLoadPromises.clear(),this.requestScope=`all`,this.commitHash=null,this.commitMeta=null,this.historyFilePath=null,this.pendingAction=null,this.repoStatus=null,this.syncToolbar()}async openWorkspaceDiff({filePath:e=null,scope:t=`all`}={}){this.source=`workspace`,this.layoutMode=`focused`,this.commitHash=null,this.commitMeta=null,this.historyFilePath=null,this.activeFilePath=e,this.fileCache.clear(),this.fileErrors.clear(),this.loadingFiles.clear(),this.collapsedFiles.clear(),this.fileLoadPromises.clear(),this.requestScope=t,this.renderLoading(`Loading diff summary...`);try{let n=new URLSearchParams;n.set(`scope`,t),e&&n.set(`path`,e),n.set(`metaOnly`,`true`);let r=await fetch(O(`/git/diff?${n.toString()}`)),i=await r.json();if(!r.ok)throw Error(i.error||`Failed to load git diff`);this.data=i;let a=e?Math.max(0,i.files.findIndex(t=>t.path===e)):0;return this.currentIndex=a,this.activeFilePath=i.files?.[a]?.path??null,(i.files?.length??0)===0?(this.render(),i):(await this.loadCurrentFile(),i)}catch(e){return console.error(`[git-diff] Failed to load diff:`,e),this.toastController?.show(`Failed to load git diff`),this.data={files:[],metaOnly:!1,source:`workspace`,summary:{additions:0,deletions:0,filesChanged:0}},this.renderEmpty(`Failed to load git diff`),this.data}}async openCommitDiff({hash:e,path:t=null,historyFilePath:n=null}={}){this.source=`commit`,this.layoutMode=`stacked`,this.commitHash=String(e??``).trim()||null,this.commitMeta=null,this.historyFilePath=String(n??``).trim()||null,this.activeFilePath=t||null,this.fileCache.clear(),this.fileErrors.clear(),this.loadingFiles.clear(),this.collapsedFiles.clear(),this.fileLoadPromises.clear(),this.requestScope=`all`,this.renderLoading(`Loading commit summary...`);try{let e=new URLSearchParams;e.set(`hash`,this.commitHash||``),e.set(`metaOnly`,`true`);let n=await fetch(O(`/git/commit?${e.toString()}`)),r=await n.json();if(!n.ok)throw Error(r.error||`Failed to load git commit`);this.data=r,this.commitMeta=r.commit??null;let i=t?Math.max(0,r.files.findIndex(e=>e.path===t)):0;return this.currentIndex=i,this.activeFilePath=r.files?.[i]?.path??null,this.collapsedFiles=new Set((r.files??[]).map(e=>e.path).filter(e=>e&&e!==this.activeFilePath)),(r.files?.length??0)===0?(this.render(),r):(this.activeFilePath&&await this.loadFileForPath(this.activeFilePath,{render:!1}),this.render(),r)}catch(e){return console.error(`[git-diff] Failed to load commit:`,e),this.toastController?.show(`Failed to load git commit`),this.data={commit:null,files:[],metaOnly:!1,source:`commit`,summary:{additions:0,deletions:0,filesChanged:0}},this.commitMeta=null,this.renderEmpty(`Failed to load git commit`),this.data}}async open(e={}){return this.openWorkspaceDiff(e)}async setLayoutMode(e){let t=e===`stacked`?`stacked`:`focused`;if(this.source!==`commit`){this.layoutMode=`focused`,this.render();return}if(this.layoutMode=t,this.activeFilePath&&this.setActiveFilePath(this.activeFilePath),this.layoutMode===`focused`){await this.loadCurrentFile();return}this.activeFilePath&&(this.collapsedFiles.delete(this.activeFilePath),await this.loadFileForPath(this.activeFilePath,{render:!1})),this.render()}navigateFile(e){if(!this.data?.files?.length||this.source===`commit`&&this.layoutMode===`stacked`)return;let t=Math.max(0,Math.min(this.currentIndex+e,this.data.files.length-1));t!==this.currentIndex&&(this.currentIndex=t,this.activeFilePath=this.data.files[t]?.path??null,this.scrollContainer?.scrollTo({top:0,behavior:`auto`}),this.loadCurrentFile())}renderLoading(e=`Loading git diff...`){this.page?.classList.remove(`hidden`),this.content&&(this.content.innerHTML=`<div class="diff-empty-state">${b(e)}</div>`),this.data=null,this.syncToolbar()}renderEmpty(e){this.page?.classList.remove(`hidden`),this.content&&(this.content.innerHTML=`<div class="diff-empty-state">${b(e)}</div>`),this.syncToolbar()}renderUnifiedHunk(e){let t=[];for(let n of Oo(e.lines)){if(n.context.length>0){for(let e of n.context)t.push(ko(e,` `,b(e.content)));continue}let e=Math.max(n.deletions.length,n.additions.length);for(let r=0;r<e;r+=1){let e=n.deletions[r]??null,i=n.additions[r]??null,a=e&&i?Do(e.content,i.content):null;e&&t.push(ko(e,`-`,a?.leftHtml??b(e.content))),i&&t.push(ko(i,`+`,a?.rightHtml??b(i.content)))}}return`
313
+ <div class="diff-hunk-header">${b(e.header)}</div>
296
314
  ${t.join(``)}
297
315
  `}renderFileHeader(e){return`
298
316
  <div class="diff-file-header">
299
- <span class="diff-file-path">${h(e.path)}</span>
300
- <span class="ui-status-badge ${to(e.status)}">${h(e.status)}</span>
317
+ <span class="diff-file-path">${b(e.path)}</span>
318
+ <span class="ui-status-badge ${Co(e.status)}">${b(e.status)}</span>
301
319
  <span class="diff-file-header-stats"><span class="ui-stat-token ui-stat-token--add diff-stats-add">+${e.stats?.additions??0}</span><span class="ui-stat-token ui-stat-token--del diff-stats-del">-${e.stats?.deletions??0}</span></span>
302
320
  </div>
303
321
  `}renderUnifiedFileBody(e){return`
304
- ${e.isBinary?`<div class="diff-binary-message">${h(e.binaryMessage||`Binary file changed`)}</div>`:``}
322
+ ${e.isBinary?`<div class="diff-binary-message">${b(e.binaryMessage||`Binary file changed`)}</div>`:``}
305
323
  ${e.hunks.map(e=>this.renderUnifiedHunk(e)).join(``)}
306
324
  `}renderSplitFileBody(e){return`
307
325
  <div class="diff-split">
308
326
  <div class="diff-split-pane">
309
327
  <div class="diff-split-pane-header">Before</div>
310
- ${e.hunks.map(e=>{let t=[];for(let n of oo(e.lines)){if(n.context.length>0){for(let e of n.context)t.push(co(e,e));continue}let e=Math.max(n.deletions.length,n.additions.length);for(let r=0;r<e;r+=1)t.push(co(n.deletions[r]??null,n.additions[r]??null))}return`
311
- <div class="diff-split-hunk">${h(e.header)}</div>
328
+ ${e.hunks.map(e=>{let t=[];for(let n of Oo(e.lines)){if(n.context.length>0){for(let e of n.context)t.push(Ao(e,e));continue}let e=Math.max(n.deletions.length,n.additions.length);for(let r=0;r<e;r+=1)t.push(Ao(n.deletions[r]??null,n.additions[r]??null))}return`
329
+ <div class="diff-split-hunk">${b(e.header)}</div>
312
330
  ${t.join(``)}
313
331
  `}).join(``)}
314
332
  </div>
@@ -318,7 +336,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
318
336
  <div class="diff-limit-card">
319
337
  <strong>Large diff withheld</strong>
320
338
  <span>This file diff is large enough to impact rendering performance.</span>
321
- <button class="${G({variant:`secondary`,extra:`diff-load-full-btn`})}" type="button" data-load-full-diff data-diff-file-path="${h(e.path)}">Load full diff</button>
339
+ <button class="${q({variant:`secondary`,extra:`diff-load-full-btn`})}" type="button" data-load-full-diff data-diff-file-path="${b(e.path)}">Load full diff</button>
322
340
  </div>
323
341
  `;let r=this.mode===`split`?this.renderSplitFileBody(e,t):this.renderUnifiedFileBody(e,t);return`${n?this.renderFileHeader(e):``}${r}`}renderFocusedFileBody(){let e=this.getCurrentFile();if(!e)return`<div class="diff-empty-state">No changes to display.</div>`;if(this.isFileLoading(e.path))return`
324
342
  <section class="diff-file-block">
@@ -328,7 +346,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
328
346
  `;let t=this.fileErrors.get(e.path);return t?`
329
347
  <section class="diff-file-block">
330
348
  ${this.renderFileHeader(e)}
331
- <div class="diff-empty-state">${h(t)}</div>
349
+ <div class="diff-empty-state">${b(t)}</div>
332
350
  </section>
333
351
  `:`
334
352
  <section class="diff-file-block" data-diff-file-index="${this.currentIndex}">
@@ -336,15 +354,15 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
336
354
  </section>
337
355
  `}renderCommitHeader(){return this.source!==`commit`||!this.commitMeta?``:`
338
356
  <section class="diff-commit-header">
339
- <div class="diff-commit-subject">${h(this.commitMeta.subject||this.commitMeta.shortHash||`Commit`)}</div>
357
+ <div class="diff-commit-subject">${b(this.commitMeta.subject||this.commitMeta.shortHash||`Commit`)}</div>
340
358
  <div class="diff-commit-meta">
341
- <span>${h(this.commitMeta.shortHash||``)}</span>
342
- <span>${h(this.commitMeta.authorName||`Unknown`)}</span>
343
- <span title="${h(this.commitMeta.authoredAt||``)}">${h(this.commitMeta.relativeDateLabel||``)}</span>
359
+ <span>${b(this.commitMeta.shortHash||``)}</span>
360
+ <span>${b(this.commitMeta.authorName||`Unknown`)}</span>
361
+ <span title="${b(this.commitMeta.authoredAt||``)}">${b(this.commitMeta.relativeDateLabel||``)}</span>
344
362
  ${this.commitMeta.isMergeCommit?`<span>Merge commit</span>`:``}
345
363
  </div>
346
364
  <div class="diff-commit-meta diff-commit-meta-secondary">
347
- <span>${h(this.commitMeta.hash||``)}</span>
365
+ <span>${b(this.commitMeta.hash||``)}</span>
348
366
  <span>${Number(this.data?.summary?.filesChanged||0)} file${Number(this.data?.summary?.filesChanged||0)===1?``:`s`}</span>
349
367
  </div>
350
368
  </section>
@@ -352,18 +370,18 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
352
370
  <aside class="diff-commit-index" aria-label="Changed files in commit">
353
371
  <div class="diff-commit-index-header">Changed Files</div>
354
372
  <div class="diff-commit-index-list">
355
- ${(this.data?.files??[]).map((e,t)=>{let n=this.activeFilePath===e.path,r=$a(e.path);return`
373
+ ${(this.data?.files??[]).map((e,t)=>{let n=this.activeFilePath===e.path,r=xo(e.path);return`
356
374
  <button
357
375
  class="ui-record-surface diff-index-item${n?` active`:``}"
358
376
  type="button"
359
- data-diff-index-path="${h(e.path)}"
377
+ data-diff-index-path="${b(e.path)}"
360
378
  aria-current="${n?`true`:`false`}"
361
379
  >
362
380
  <span class="ui-record-header diff-index-item-top">
363
- <span class="ui-record-title diff-index-item-name">${h(Qa(e.path))}</span>
364
- <span class="ui-status-badge ${to(e.status)}">${h(e.status)}</span>
381
+ <span class="ui-record-title diff-index-item-name">${b(bo(e.path))}</span>
382
+ <span class="ui-status-badge ${Co(e.status)}">${b(e.status)}</span>
365
383
  </span>
366
- ${r?`<span class="ui-record-subtitle diff-index-item-path">${h(r)}</span>`:``}
384
+ ${r?`<span class="ui-record-subtitle diff-index-item-path">${b(r)}</span>`:``}
367
385
  <span class="ui-record-meta diff-index-item-meta">
368
386
  <span>${t+1}</span>
369
387
  <span class="ui-stat-token ui-stat-token--add diff-stats-add">+${e.stats?.additions??0}</span>
@@ -373,26 +391,26 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
373
391
  `}).join(``)}
374
392
  </div>
375
393
  </aside>
376
- `}renderStackedSection(e,t){let n=this.isFileCollapsed(e.path),r=this.activeFilePath===e.path,i=this.isFileLoading(e.path),a=this.fileErrors.get(e.path),o=this.getFileDetail(e.path)??e,s=n?``:i?`<div class="diff-empty-state">Loading file diff...</div>`:a?`<div class="diff-empty-state">${h(a)}</div>`:this.renderDiffDetail(o,t,{includeHeader:!1});return`
394
+ `}renderStackedSection(e,t){let n=this.isFileCollapsed(e.path),r=this.activeFilePath===e.path,i=this.isFileLoading(e.path),a=this.fileErrors.get(e.path),o=this.getFileDetail(e.path)??e,s=n?``:i?`<div class="diff-empty-state">Loading file diff...</div>`:a?`<div class="diff-empty-state">${b(a)}</div>`:this.renderDiffDetail(o,t,{includeHeader:!1});return`
377
395
  <section
378
396
  class="diff-commit-section${r?` active`:``}${n?` collapsed`:``}"
379
- id="${eo(e.path)}"
380
- data-diff-section-path="${h(e.path)}"
397
+ id="${So(e.path)}"
398
+ data-diff-section-path="${b(e.path)}"
381
399
  >
382
400
  <button
383
401
  class="diff-commit-section-header"
384
402
  type="button"
385
- data-diff-section-toggle="${h(e.path)}"
403
+ data-diff-section-toggle="${b(e.path)}"
386
404
  >
387
405
  <span class="diff-commit-section-main">
388
- ${no(n)}
406
+ ${wo(n)}
389
407
  <span class="diff-commit-section-copy">
390
- <span class="diff-commit-section-name">${h(Qa(e.path))}</span>
391
- ${$a(e.path)?`<span class="diff-commit-section-path">${h($a(e.path))}</span>`:``}
408
+ <span class="diff-commit-section-name">${b(bo(e.path))}</span>
409
+ ${xo(e.path)?`<span class="diff-commit-section-path">${b(xo(e.path))}</span>`:``}
392
410
  </span>
393
411
  </span>
394
412
  <span class="diff-commit-section-meta">
395
- <span class="ui-status-badge ${to(e.status)}">${h(e.status)}</span>
413
+ <span class="ui-status-badge ${Co(e.status)}">${b(e.status)}</span>
396
414
  <span class="ui-stat-token ui-stat-token--add diff-stats-add">+${e.stats?.additions??0}</span>
397
415
  <span class="ui-stat-token ui-stat-token--del diff-stats-del">-${e.stats?.deletions??0}</span>
398
416
  </span>
@@ -417,10 +435,10 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
417
435
  </div>
418
436
  </div>
419
437
  </div>
420
- `}getCurrentFile(){let e=this.data?.files??[];return e.length===0?null:e[this.currentIndex]??e[0]??null}getFileByPath(e){return(this.data?.files??[]).find(t=>t.path===e)??null}setActiveFilePath(e,{syncIndex:t=!0}={}){if(this.activeFilePath=e,!t)return;let n=Math.max(0,(this.data?.files??[]).findIndex(t=>t.path===e));n>=0&&(this.currentIndex=n)}getCacheKeyForPath(e){return e?this.source===`commit`?`commit:${this.commitHash}:${e}`:`workspace:${this.requestScope}:${e}`:null}getCurrentCacheKey(){return this.getCacheKeyForPath(this.getCurrentFile()?.path??null)}getCurrentFileDetail(){let e=this.getCurrentCacheKey();return e?this.fileCache.get(e):null}getFileDetail(e){let t=this.getCacheKeyForPath(e);return t?this.fileCache.get(t):null}isFileCollapsed(e){return this.collapsedFiles.has(e)}isFileLoading(e){return this.loadingFiles.has(e)}getCurrentActionState(){if(this.source===`commit`)return{canCommit:!1,canStage:!1,canUnstage:!1};let e=this.getCurrentFile(),t=this.getCurrentFileDetail()??e,n=Number(this.repoStatus?.summary?.staged||0);return t?.path?{canCommit:n>0,canStage:!!(t.hasWorkingTreeChanges||t.hasUntrackedChanges),canUnstage:!!t.hasStagedChanges}:{canCommit:n>0,canStage:!1,canUnstage:!1}}getPrimaryAction(){if(this.source===`commit`)return null;let e=this.getCurrentActionState();return e.canStage&&!e.canUnstage?`stage`:e.canUnstage&&!e.canStage||this.requestScope===`staged`&&e.canUnstage?`unstage`:e.canStage?`stage`:e.canUnstage?`unstage`:null}async handleFileAction(e){if(this.source===`commit`)return;let t=this.getCurrentFile();if(!(!t?.path||this.pendingAction)){this.pendingAction=e,this.syncToolbar();try{e===`stage`?await this.onStageFile?.(t.path,{scope:this.requestScope}):e===`unstage`?await this.onUnstageFile?.(t.path,{scope:this.requestScope}):e===`commit`&&await this.onCommitStaged?.()}finally{this.pendingAction=null,this.syncToolbar()}}}setRepoStatus(e){this.repoStatus=e,this.syncToolbar()}async handleIndexSelection(e){if(this.getFileByPath(e)){if(this.setActiveFilePath(e),this.source===`commit`&&this.layoutMode===`stacked`){this.collapsedFiles.delete(e),await this.loadFileForPath(e,{render:!1}),this.render(),this.scrollToFileSection(e);return}await this.loadFileForPath(e)}}async toggleFileSection(e){if(!(this.source!==`commit`||this.layoutMode!==`stacked`)){if(this.setActiveFilePath(e),this.collapsedFiles.has(e)){this.collapsedFiles.delete(e),await this.loadFileForPath(e,{render:!1}),this.render(),this.scrollToFileSection(e);return}this.collapsedFiles.add(e),this.render()}}scrollToFileSection(e){if(!this.content)return;let t=eo(e),n=()=>{let e=document.getElementById?.(t)??null;if(e){if(this.scrollContainer?.scrollTo&&this.scrollContainer.getBoundingClientRect&&e.getBoundingClientRect){let t=this.scrollContainer.getBoundingClientRect(),n=e.getBoundingClientRect(),r=Number(this.scrollContainer.scrollTop)||0,i=Math.max(0,r+(n.top-t.top)-8);this.scrollContainer.scrollTo({top:i,behavior:`smooth`});return}e.scrollIntoView?.({behavior:`smooth`,block:`start`})}};if(typeof requestAnimationFrame==`function`){requestAnimationFrame(n);return}setTimeout(n,0)}handleScrollSelection(){if(this.source!==`commit`||this.layoutMode!==`stacked`||!this.scrollContainer||!this.content)return;let e=Array.from(this.content.querySelectorAll?.(`[data-diff-section-path]`)??[]);if(e.length===0)return;let t=this.scrollContainer.getBoundingClientRect?.();if(!t)return;let n=t.top+120,r=null;for(let t of e){let e=t.getBoundingClientRect?.();if(!e)continue;let i=t.getAttribute?.(`data-diff-section-path`);if(i)if(e.top<=n)r=i;else if(r)break;else{r=i;break}}r&&r!==this.activeFilePath&&(this.setActiveFilePath(r),this.render())}async loadCurrentFile({forceFullPatch:e=!1}={}){let t=this.getCurrentFile();return t?.path?this.loadFileForPath(t.path,{forceFullPatch:e}):(this.render(),null)}async loadFileForPath(e,{forceFullPatch:t=!1,render:n=!0}={}){let r=this.getFileByPath(e);if(!r?.path)return n&&this.render(),null;this.setActiveFilePath(e);let i=this.getCacheKeyForPath(e),a=i?this.fileCache.get(i):null;if(a&&(!a.tooLarge||!t))return n&&this.render(),a;let o=`${e}:${t?`full`:`partial`}`;if(this.fileLoadPromises.has(o))return this.fileLoadPromises.get(o);this.loadingFiles.add(e),this.fileErrors.delete(e),n&&this.render();let s=(async()=>{try{let n;if(this.source===`commit`){let i=new URLSearchParams;i.set(`hash`,this.commitHash||``),i.set(`path`,e),t&&i.set(`allowLargePatch`,`true`);let a=await fetch(D(`/git/commit?${i.toString()}`)),o=await a.json();if(!a.ok)throw Error(o.error||`Failed to load commit file diff`);n={...r,...o.files?.[0]??{}}}else{let i=new URLSearchParams;i.set(`scope`,this.requestScope),i.set(`path`,e),t&&i.set(`allowLargePatch`,`true`);let a=await fetch(D(`/git/diff?${i.toString()}`)),o=await a.json();if(!a.ok)throw Error(o.error||`Failed to load file diff`);n={...r,...o.files?.[0]??{}}}return i&&this.fileCache.set(i,n),this.fileErrors.delete(e),n}catch(t){console.error(`[git-diff] Failed to load file diff:`,t);let n=this.source===`commit`?`Failed to load commit file diff`:`Failed to load file diff`;return this.fileErrors.set(e,n),this.toastController?.show(n),null}finally{this.loadingFiles.delete(e),this.fileLoadPromises.delete(o),this.render()}})();return this.fileLoadPromises.set(o,s),s}syncToolbar(){let e=this.data?.files?.length??0,t=e===0?0:this.currentIndex+1,n=this.source===`commit`,r=n&&this.layoutMode===`stacked`;if(this.fileIndicator&&(r?this.fileIndicator.textContent=`${e} file${e===1?``:`s`}`:this.fileIndicator.textContent=e>0?`${t} / ${e} files`:`0 / 0 files`),this.stats){let e=this.data?.summary?.additions??0,t=this.data?.summary?.deletions??0;this.stats.innerHTML=`
438
+ `}getCurrentFile(){let e=this.data?.files??[];return e.length===0?null:e[this.currentIndex]??e[0]??null}getFileByPath(e){return(this.data?.files??[]).find(t=>t.path===e)??null}setActiveFilePath(e,{syncIndex:t=!0}={}){if(this.activeFilePath=e,!t)return;let n=Math.max(0,(this.data?.files??[]).findIndex(t=>t.path===e));n>=0&&(this.currentIndex=n)}getCacheKeyForPath(e){return e?this.source===`commit`?`commit:${this.commitHash}:${e}`:`workspace:${this.requestScope}:${e}`:null}getCurrentCacheKey(){return this.getCacheKeyForPath(this.getCurrentFile()?.path??null)}getCurrentFileDetail(){let e=this.getCurrentCacheKey();return e?this.fileCache.get(e):null}getFileDetail(e){let t=this.getCacheKeyForPath(e);return t?this.fileCache.get(t):null}isFileCollapsed(e){return this.collapsedFiles.has(e)}isFileLoading(e){return this.loadingFiles.has(e)}getCurrentActionState(){if(this.source===`commit`)return{canCommit:!1,canStage:!1,canUnstage:!1};let e=this.getCurrentFile(),t=this.getCurrentFileDetail()??e,n=Number(this.repoStatus?.summary?.staged||0);return t?.path?{canCommit:n>0,canStage:!!(t.hasWorkingTreeChanges||t.hasUntrackedChanges),canUnstage:!!t.hasStagedChanges}:{canCommit:n>0,canStage:!1,canUnstage:!1}}getPrimaryAction(){if(this.source===`commit`)return null;let e=this.getCurrentActionState();return e.canStage&&!e.canUnstage?`stage`:e.canUnstage&&!e.canStage||this.requestScope===`staged`&&e.canUnstage?`unstage`:e.canStage?`stage`:e.canUnstage?`unstage`:null}async handleFileAction(e){if(this.source===`commit`)return;let t=this.getCurrentFile();if(!(!t?.path||this.pendingAction)){this.pendingAction=e,this.syncToolbar();try{e===`stage`?await this.onStageFile?.(t.path,{scope:this.requestScope}):e===`unstage`?await this.onUnstageFile?.(t.path,{scope:this.requestScope}):e===`commit`&&await this.onCommitStaged?.()}finally{this.pendingAction=null,this.syncToolbar()}}}setRepoStatus(e){this.repoStatus=e,this.syncToolbar()}async handleIndexSelection(e){if(this.getFileByPath(e)){if(this.setActiveFilePath(e),this.source===`commit`&&this.layoutMode===`stacked`){this.collapsedFiles.delete(e),await this.loadFileForPath(e,{render:!1}),this.render(),this.scrollToFileSection(e);return}await this.loadFileForPath(e)}}async toggleFileSection(e){if(!(this.source!==`commit`||this.layoutMode!==`stacked`)){if(this.setActiveFilePath(e),this.collapsedFiles.has(e)){this.collapsedFiles.delete(e),await this.loadFileForPath(e,{render:!1}),this.render(),this.scrollToFileSection(e);return}this.collapsedFiles.add(e),this.render()}}scrollToFileSection(e){if(!this.content)return;let t=So(e),n=()=>{let e=document.getElementById?.(t)??null;if(e){if(this.scrollContainer?.scrollTo&&this.scrollContainer.getBoundingClientRect&&e.getBoundingClientRect){let t=this.scrollContainer.getBoundingClientRect(),n=e.getBoundingClientRect(),r=Number(this.scrollContainer.scrollTop)||0,i=Math.max(0,r+(n.top-t.top)-8);this.scrollContainer.scrollTo({top:i,behavior:`smooth`});return}e.scrollIntoView?.({behavior:`smooth`,block:`start`})}};if(typeof requestAnimationFrame==`function`){requestAnimationFrame(n);return}setTimeout(n,0)}handleScrollSelection(){if(this.source!==`commit`||this.layoutMode!==`stacked`||!this.scrollContainer||!this.content)return;let e=Array.from(this.content.querySelectorAll?.(`[data-diff-section-path]`)??[]);if(e.length===0)return;let t=this.scrollContainer.getBoundingClientRect?.();if(!t)return;let n=t.top+120,r=null;for(let t of e){let e=t.getBoundingClientRect?.();if(!e)continue;let i=t.getAttribute?.(`data-diff-section-path`);if(i)if(e.top<=n)r=i;else if(r)break;else{r=i;break}}r&&r!==this.activeFilePath&&(this.setActiveFilePath(r),this.render())}async loadCurrentFile({forceFullPatch:e=!1}={}){let t=this.getCurrentFile();return t?.path?this.loadFileForPath(t.path,{forceFullPatch:e}):(this.render(),null)}async loadFileForPath(e,{forceFullPatch:t=!1,render:n=!0}={}){let r=this.getFileByPath(e);if(!r?.path)return n&&this.render(),null;this.setActiveFilePath(e);let i=this.getCacheKeyForPath(e),a=i?this.fileCache.get(i):null;if(a&&(!a.tooLarge||!t))return n&&this.render(),a;let o=`${e}:${t?`full`:`partial`}`;if(this.fileLoadPromises.has(o))return this.fileLoadPromises.get(o);this.loadingFiles.add(e),this.fileErrors.delete(e),n&&this.render();let s=(async()=>{try{let n;if(this.source===`commit`){let i=new URLSearchParams;i.set(`hash`,this.commitHash||``),i.set(`path`,e),t&&i.set(`allowLargePatch`,`true`);let a=await fetch(O(`/git/commit?${i.toString()}`)),o=await a.json();if(!a.ok)throw Error(o.error||`Failed to load commit file diff`);n={...r,...o.files?.[0]??{}}}else{let i=new URLSearchParams;i.set(`scope`,this.requestScope),i.set(`path`,e),t&&i.set(`allowLargePatch`,`true`);let a=await fetch(O(`/git/diff?${i.toString()}`)),o=await a.json();if(!a.ok)throw Error(o.error||`Failed to load file diff`);n={...r,...o.files?.[0]??{}}}return i&&this.fileCache.set(i,n),this.fileErrors.delete(e),n}catch(t){console.error(`[git-diff] Failed to load file diff:`,t);let n=this.source===`commit`?`Failed to load commit file diff`:`Failed to load file diff`;return this.fileErrors.set(e,n),this.toastController?.show(n),null}finally{this.loadingFiles.delete(e),this.fileLoadPromises.delete(o),this.render()}})();return this.fileLoadPromises.set(o,s),s}syncToolbar(){let e=this.data?.files?.length??0,t=e===0?0:this.currentIndex+1,n=this.source===`commit`,r=n&&this.layoutMode===`stacked`;if(this.fileIndicator&&(r?this.fileIndicator.textContent=`${e} file${e===1?``:`s`}`:this.fileIndicator.textContent=e>0?`${t} / ${e} files`:`0 / 0 files`),this.stats){let e=this.data?.summary?.additions??0,t=this.data?.summary?.deletions??0;this.stats.innerHTML=`
421
439
  <span class="ui-stat-token ui-stat-token--add diff-stats-add">+${e}</span>
422
440
  <span class="ui-stat-token ui-stat-token--del diff-stats-del">-${t}</span>
423
- `}this.modeButtons.forEach(e=>{e.classList.remove(`hidden`),e.classList.toggle(`active`,e.getAttribute(`data-diff-mode`)===this.mode)}),this.layoutButtons.forEach(e=>{e.classList.toggle(`active`,e.getAttribute(`data-diff-layout`)===this.layoutMode)});let i=!!this.getCurrentFile()?.path,a=this.getCurrentActionState(),o=this.getPrimaryAction();this.backToHistoryButton?.classList.toggle(`hidden`,!n),this.gitActionsGroup?.classList.toggle(`hidden`,n),this.editorActionsGroup?.classList.toggle(`hidden`,n),this.actionsDivider?.classList.toggle(`hidden`,n),this.layoutToggle?.classList.toggle(`hidden`,!n),this.stats?.classList.remove(`hidden`),this.openEditorButton&&(this.openEditorButton.textContent=`Open in Editor`),this.openEditorButton?.toggleAttribute(`disabled`,!i||n),this.primaryActionButton&&(this.primaryActionButton.textContent=this.pendingAction===o?`Working...`:o===`unstage`?`Unstage`:`Stage`,this.primaryActionButton.toggleAttribute(`disabled`,n||!i||!o||!!this.pendingAction)),this.commitButton&&(this.commitButton.textContent=this.pendingAction===`commit`?`Working...`:`Commit Staged`),this.commitButton?.toggleAttribute(`disabled`,n||!a.canCommit||!!this.pendingAction),this.prevButton?.classList.remove(`hidden`),this.nextButton?.classList.remove(`hidden`),this.prevButton?.classList.toggle(`hidden`,r),this.nextButton?.classList.toggle(`hidden`,r),this.prevButton?.toggleAttribute(`disabled`,r||this.currentIndex<=0),this.nextButton?.toggleAttribute(`disabled`,r||e===0||this.currentIndex>=e-1)}render(){if(this.page?.classList.remove(`hidden`),(this.data?.files??[]).length===0){this.renderEmpty(this.source===`commit`?`No commit changes to display.`:`No changes to display.`);return}this.content&&(this.source===`commit`?this.content.innerHTML=`${this.renderCommitHeader()}${this.renderCommitBody()}`:this.content.innerHTML=this.renderFocusedFileBody(),this.syncToolbar())}getToolbarTitle({commitHash:e=null,filePath:t=null,path:n=null,scope:r=`all`,source:i=`workspace`}={}){return i===`commit`||this.source===`commit`?this.layoutMode===`stacked`?this.commitMeta?.shortHash?`Commit ${this.commitMeta.shortHash}`:e?`Commit ${String(e).slice(0,7)}`:`Commit Diff`:n?Qa(n):this.activeFilePath?Qa(this.activeFilePath):this.commitMeta?.shortHash?`Commit ${this.commitMeta.shortHash}`:e?`Commit ${String(e).slice(0,7)}`:`Commit Diff`:t?Qa(t):r===`staged`?`Staged Changes`:r===`working-tree`?`Working Tree Changes`:`All Changes`}};function uo(e={}){return W(`ui-segmented-control`,{"ui-segmented-control--pill":e.pill,hidden:e.hidden},e.extra??[])}function q(e={}){return W(`ui-segmented-btn`,{active:e.active,hidden:e.hidden},e.extra??[])}var fo=30,po=1e4;function mo(e){let t=String(e??``).split(`/`);return t.pop(),t.join(`/`)}function ho(e){return String(e??``).split(`/`).pop()||``}function go(){return`<svg class="git-file-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>`}function _o(){return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="18" cy="18" r="3"/><circle cx="6" cy="6" r="3"/><path d="M13 6h3a2 2 0 0 1 2 2v7"/><path d="M6 9v12"/></svg>`}function vo(e){return`<svg class="git-section-chevron${e?` collapsed`:``}" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>`}function yo(e){switch(e){case`commit`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>`;case`pull`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14"/><path d="m18 13-6 6-6-6"/></svg>`;case`push`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 19V5"/><path d="m6 11 6-6 6 6"/></svg>`;case`unstage`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H8"/><path d="m12 16-4-4 4-4"/></svg>`;case`reset`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12a9 9 0 1 0 3-6.7"/><path d="M3 4v5h5"/></svg>`;default:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14"/><path d="M5 12h14"/></svg>`}}function bo(e){switch(e){case`added`:return`ui-status-badge--success`;case`deleted`:return`ui-status-badge--danger`;case`renamed`:return`ui-status-badge--accent`;case`untracked`:return`ui-status-badge--muted`;default:return`ui-status-badge--warning`}}function xo(e={},t={}){let n=Number(e.additions||0),r=Number(e.deletions||0);return Number(e.changedFiles||0)>0||n>0||r>0?`
441
+ `}this.modeButtons.forEach(e=>{e.classList.remove(`hidden`),e.classList.toggle(`active`,e.getAttribute(`data-diff-mode`)===this.mode)}),this.layoutButtons.forEach(e=>{e.classList.toggle(`active`,e.getAttribute(`data-diff-layout`)===this.layoutMode)});let i=!!this.getCurrentFile()?.path,a=this.getCurrentActionState(),o=this.getPrimaryAction();this.backToHistoryButton?.classList.toggle(`hidden`,!n),this.gitActionsGroup?.classList.toggle(`hidden`,n),this.editorActionsGroup?.classList.toggle(`hidden`,n),this.actionsDivider?.classList.toggle(`hidden`,n),this.layoutToggle?.classList.toggle(`hidden`,!n),this.stats?.classList.remove(`hidden`),this.openEditorButton&&(this.openEditorButton.textContent=`Open in Editor`),this.openEditorButton?.toggleAttribute(`disabled`,!i||n),this.primaryActionButton&&(this.primaryActionButton.textContent=this.pendingAction===o?`Working...`:o===`unstage`?`Unstage`:`Stage`,this.primaryActionButton.toggleAttribute(`disabled`,n||!i||!o||!!this.pendingAction)),this.commitButton&&(this.commitButton.textContent=this.pendingAction===`commit`?`Working...`:`Commit Staged`),this.commitButton?.toggleAttribute(`disabled`,n||!a.canCommit||!!this.pendingAction),this.prevButton?.classList.remove(`hidden`),this.nextButton?.classList.remove(`hidden`),this.prevButton?.classList.toggle(`hidden`,r),this.nextButton?.classList.toggle(`hidden`,r),this.prevButton?.toggleAttribute(`disabled`,r||this.currentIndex<=0),this.nextButton?.toggleAttribute(`disabled`,r||e===0||this.currentIndex>=e-1)}render(){if(this.page?.classList.remove(`hidden`),(this.data?.files??[]).length===0){this.renderEmpty(this.source===`commit`?`No commit changes to display.`:`No changes to display.`);return}this.content&&(this.source===`commit`?this.content.innerHTML=`${this.renderCommitHeader()}${this.renderCommitBody()}`:this.content.innerHTML=this.renderFocusedFileBody(),this.syncToolbar())}getToolbarTitle({commitHash:e=null,filePath:t=null,path:n=null,scope:r=`all`,source:i=`workspace`}={}){return i===`commit`||this.source===`commit`?this.layoutMode===`stacked`?this.commitMeta?.shortHash?`Commit ${this.commitMeta.shortHash}`:e?`Commit ${String(e).slice(0,7)}`:`Commit Diff`:n?bo(n):this.activeFilePath?bo(this.activeFilePath):this.commitMeta?.shortHash?`Commit ${this.commitMeta.shortHash}`:e?`Commit ${String(e).slice(0,7)}`:`Commit Diff`:t?bo(t):r===`staged`?`Staged Changes`:r===`working-tree`?`Working Tree Changes`:`All Changes`}};function Mo(e={}){return K(`ui-segmented-control`,{"ui-segmented-control--pill":e.pill,hidden:e.hidden},e.extra??[])}function Y(e={}){return K(`ui-segmented-btn`,{active:e.active,hidden:e.hidden},e.extra??[])}var No=30,Po=1e4;function Fo(e){let t=String(e??``).split(`/`);return t.pop(),t.join(`/`)}function Io(e){return String(e??``).split(`/`).pop()||``}function Lo(){return`<svg class="git-file-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>`}function Ro(){return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="18" cy="18" r="3"/><circle cx="6" cy="6" r="3"/><path d="M13 6h3a2 2 0 0 1 2 2v7"/><path d="M6 9v12"/></svg>`}function zo(e){return`<svg class="git-section-chevron${e?` collapsed`:``}" width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>`}function Bo(e){switch(e){case`commit`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5"/></svg>`;case`pull`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14"/><path d="m18 13-6 6-6-6"/></svg>`;case`push`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 19V5"/><path d="m6 11 6-6 6 6"/></svg>`;case`unstage`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12H8"/><path d="m12 16-4-4 4-4"/></svg>`;case`reset`:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12a9 9 0 1 0 3-6.7"/><path d="M3 4v5h5"/></svg>`;default:return`<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14"/><path d="M5 12h14"/></svg>`}}function Vo(e){switch(e){case`added`:return`ui-status-badge--success`;case`deleted`:return`ui-status-badge--danger`;case`renamed`:return`ui-status-badge--accent`;case`untracked`:return`ui-status-badge--muted`;default:return`ui-status-badge--warning`}}function Ho(e={},t={}){let n=Number(e.additions||0),r=Number(e.deletions||0);return Number(e.changedFiles||0)>0||n>0||r>0?`
424
442
  <span class="git-change-stats" aria-label="Local diff summary">
425
443
  <span class="git-change-add">+${n}</span>
426
444
  <span class="git-change-del">-${r}</span>
@@ -430,11 +448,11 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
430
448
  <span class="git-sync-metric git-sync-metric--ahead">&#8593;${Number(t.ahead||0)}</span>
431
449
  <span class="git-sync-metric git-sync-metric--behind">&#8595;${Number(t.behind||0)}</span>
432
450
  </span>
433
- `:`<span class="git-sync-info git-sync-info-muted">Clean</span>`}function So(e={}){return h(String(e.subject||``).trim()||e.shortHash||`Commit`)}var Co=class{constructor({enabled:e=!0,onCommitStaged:t=()=>{},onOpenPullBackup:n=()=>{},onPullBranch:r=()=>{},onPushBranch:i=()=>{},onRepoChange:a=()=>{},onResetFile:o=()=>{},onSelectCommit:s=()=>{},onSelectDiff:c=()=>{},onStageFile:l=()=>{},onUnstageFile:u=()=>{},onViewAllDiff:d=()=>{},searchInput:f=null,toastController:p=null}={}){this.enabled=e,this.onCommitStaged=t,this.onOpenPullBackup=n,this.onPullBranch=r,this.onPushBranch=i,this.onRepoChange=a,this.onResetFile=o,this.onSelectCommit=s,this.onSelectDiff=c,this.onStageFile=l,this.onUnstageFile=u,this.onViewAllDiff=d,this.searchInput=f,this.toastController=p,this.panel=document.getElementById(`gitPanel`),this.pullBackups=[],this.status=null,this.active=!1,this.refreshTimer=null,this.searchQuery=``,this.panelMode=`changes`,this.collapsedSections=new Set,this.selection={commitHash:null,path:null,scope:null,source:`workspace`},this.pendingActionKey=null,this.history={commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0}}initialize(){this.panel?.addEventListener(`click`,e=>{let t=e.target instanceof Element?e.target.closest(`[data-git-panel-mode]`):null;if(t){let e=t.getAttribute(`data-git-panel-mode`);(e===`changes`||e===`history`)&&this.setMode(e);return}let n=e.target instanceof Element?e.target.closest(`[data-git-section-toggle]`):null;if(n){let e=n.getAttribute(`data-git-section-toggle`);this.toggleSection(e);return}let r=e.target instanceof Element?e.target.closest(`[data-git-commit-hash]`):null;if(r&&!e.target.closest(`[data-git-history-load-more]`)){let e=r.getAttribute(`data-git-commit-hash`);if(!e)return;this.onSelectCommit(e,{path:this.selection.commitHash===e?this.selection.path:null});return}if(e.target instanceof Element&&e.target.closest(`[data-git-history-load-more]`)){this.loadMoreHistory();return}let i=e.target instanceof Element?e.target.closest(`[data-git-path]`):null;if(i&&!e.target.closest(`[data-git-file-action]`)){let e=i.getAttribute(`data-git-path`),t=i.getAttribute(`data-git-scope`)||`working-tree`;if(!e)return;this.onSelectDiff(e,{scope:t});return}let a=e.target instanceof Element?e.target.closest(`[data-git-pull-backup-path]`):null;if(a){let e=a.getAttribute(`data-git-pull-backup-path`);if(!e)return;this.onOpenPullBackup(e);return}let o=e.target instanceof Element?e.target.closest(`[data-git-file-action]`):null;if(o){let t=o.getAttribute(`data-git-file-action`),n=o.getAttribute(`data-git-path`),r=o.getAttribute(`data-git-scope`)||`working-tree`;if(!t||!n)return;e.preventDefault(),e.stopPropagation(),this.handleFileAction(t,n,r);return}if(e.target instanceof Element&&e.target.closest(`[data-git-view-all]`)){this.onViewAllDiff();return}if(e.target instanceof Element&&e.target.closest(`[data-git-commit-staged]`)){this.handleCommitStaged();return}let s=e.target instanceof Element?e.target.closest(`[data-git-sync-action]`):null;if(s){let e=s.getAttribute(`data-git-sync-action`);(e===`pull`||e===`push`)&&this.handleSyncAction(e)}}),this.searchInput?.addEventListener(`input`,e=>{this.searchQuery=String(e.target?.value??``).trim().toLowerCase(),this.render()}),this.syncSearchUi()}setActive(e){let t=!!e;if(!(this.active===t&&(!t||this.refreshTimer||this.panelMode===`history`))){if(this.active=t,!this.active){this.stopStatusPolling();return}this.syncSearchUi(),this.refresh({force:!1,includeHistory:this.panelMode===`history`}),this.panelMode===`changes`?this.ensureStatusPolling():this.stopStatusPolling()}}async setMode(e,{forceHistoryRefresh:t=!1}={}){let n=e===`history`?`history`:`changes`,r=this.panelMode!==n;if(this.panelMode=n,this.syncSearchUi(),this.render(),this.active){if(this.panelMode===`changes`){this.ensureStatusPolling(),r&&await this.refresh({force:!1,includeHistory:!1});return}this.stopStatusPolling(),(t||r||!this.history.loaded)&&await this.refreshHistory({force:t||r})}}setSelection({commitHash:e=null,path:t=null,scope:n=null,source:r=`workspace`}={}){this.selection={commitHash:e,path:t,scope:n,source:r},(r===`commit`||e)&&(this.panelMode=`history`,this.syncSearchUi()),this.render()}toggleSection(e){e&&(this.collapsedSections.has(e)?this.collapsedSections.delete(e):this.collapsedSections.add(e),this.render())}ensureStatusPolling(){this.refreshTimer||!this.active||this.panelMode!==`changes`||(this.refreshTimer=setInterval(()=>{this.refresh({force:!1,includeHistory:!1})},po))}stopStatusPolling(){clearInterval(this.refreshTimer),this.refreshTimer=null}syncSearchUi(){this.searchInput&&(this.searchInput.setAttribute(`placeholder`,this.panelMode===`history`?`Filter loaded commits...`:`Search changes...`),this.searchInput.setAttribute(`aria-label`,this.panelMode===`history`?`Filter loaded commits`:`Search changed files`))}async refresh({force:e=!1,includeHistory:t=this.panelMode===`history`}={}){let n=await this.refreshStatus({force:e});return t&&n.isGitRepo&&await this.refreshHistory({force:e}),n}async refreshStatus({force:e=!1}={}){if(!this.enabled)return this.status={isGitRepo:!1,sections:[],summary:{changedFiles:0}},this.pullBackups=[],this.history={...this.history,commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0},this.onRepoChange(!1,this.status),this.render(),this.status;try{let t=await fetch(D(`/git/status${e?`?force=true`:``}`)),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to load git status`);if(this.status=n,this.pullBackups=[],n.isGitRepo)try{let e=await fetch(D(`/git/pull-backups`)),t=await e.json();if(!e.ok)throw Error(t.error||`Failed to load pull backups`);this.pullBackups=Array.isArray(t.backups)?t.backups:[]}catch(e){console.error(`[git-panel] Failed to load pull backups:`,e)}else this.history={...this.history,commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0};return this.onRepoChange(!!n.isGitRepo,n),this.render(),n}catch(e){return console.error(`[git-panel] Failed to load git status:`,e),this.toastController?.show(`Failed to load git status`),this.status={isGitRepo:!1,sections:[],summary:{changedFiles:0}},this.pullBackups=[],this.history={...this.history,commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0},this.onRepoChange(!1,this.status),this.render(),this.status}}async refreshHistory({force:e=!1}={}){if(!this.status?.isGitRepo)return this.history={...this.history,commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0},this.render(),this.history;if(this.history.loading&&!e)return this.history;this.history={...this.history,error:``,loading:!0,loadingMore:!1},e&&(this.history={...this.history,commits:[],hasMore:!1,loaded:!1,offset:0}),this.render();try{let e=new URLSearchParams;e.set(`limit`,String(fo)),e.set(`offset`,`0`);let t=await fetch(D(`/git/history?${e.toString()}`)),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to load git history`);return this.history={commits:Array.isArray(n.commits)?n.commits:[],error:``,hasMore:!!n.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:Array.isArray(n.commits)?n.commits.length:0},this.render(),this.history}catch(e){return console.error(`[git-panel] Failed to load git history:`,e),this.toastController?.show(`Failed to load git history`),this.history={...this.history,error:`Failed to load git history`,loading:!1,loadingMore:!1},this.render(),this.history}}async loadMoreHistory(){if(!(!this.status?.isGitRepo||this.history.loading||this.history.loadingMore||!this.history.hasMore)){this.history={...this.history,error:``,loadingMore:!0},this.render();try{let e=new URLSearchParams;e.set(`limit`,String(fo)),e.set(`offset`,String(this.history.offset));let t=await fetch(D(`/git/history?${e.toString()}`)),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to load git history`);let r=Array.isArray(n.commits)?n.commits:[];this.history={commits:[...this.history.commits,...r],error:``,hasMore:!!n.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:this.history.offset+r.length},this.render()}catch(e){console.error(`[git-panel] Failed to load more git history:`,e),this.toastController?.show(`Failed to load git history`),this.history={...this.history,error:`Failed to load git history`,loadingMore:!1},this.render()}}}filterFiles(e=[]){return this.searchQuery?e.filter(e=>e.path.toLowerCase().includes(this.searchQuery)||String(e.oldPath||``).toLowerCase().includes(this.searchQuery)):e}filterCommits(e=[]){return this.searchQuery?e.filter(e=>String(e.subject||``).toLowerCase().includes(this.searchQuery)||String(e.shortHash||``).toLowerCase().includes(this.searchQuery)||String(e.authorName||``).toLowerCase().includes(this.searchQuery)):e}async handleFileAction(e,t,n){let r=`${e}:${n}:${t}`;if(this.pendingActionKey!==r){this.pendingActionKey=r,this.render();try{e===`stage`?await this.onStageFile(t,{scope:n}):e===`unstage`?await this.onUnstageFile(t,{scope:n}):e===`reset`&&await this.onResetFile(t,{scope:n})}finally{this.pendingActionKey=null,this.render()}}}async handleCommitStaged(){let e=`commit-staged`;if(this.pendingActionKey!==e){this.pendingActionKey=e,this.render();try{await this.onCommitStaged()}finally{this.pendingActionKey=null,this.render()}}}async handleSyncAction(e){let t=`sync:${e}`;if(this.pendingActionKey!==t){this.pendingActionKey=t,this.render();try{e===`pull`?await this.onPullBranch():e===`push`&&await this.onPushBranch()}finally{this.pendingActionKey=null,this.render()}}}renderSection(e){let t=this.filterFiles(e.files);if(t.length===0)return``;let n=this.collapsedSections.has(e.key);return`
451
+ `:`<span class="git-sync-info git-sync-info-muted">Clean</span>`}function Uo(e={}){return b(String(e.subject||``).trim()||e.shortHash||`Commit`)}var Wo=class{constructor({enabled:e=!0,onCommitStaged:t=()=>{},onOpenPullBackup:n=()=>{},onPullBranch:r=()=>{},onPushBranch:i=()=>{},onRepoChange:a=()=>{},onResetFile:o=()=>{},onSelectCommit:s=()=>{},onSelectDiff:c=()=>{},onStageFile:l=()=>{},onUnstageFile:u=()=>{},onViewAllDiff:d=()=>{},searchInput:f=null,toastController:p=null}={}){this.enabled=e,this.onCommitStaged=t,this.onOpenPullBackup=n,this.onPullBranch=r,this.onPushBranch=i,this.onRepoChange=a,this.onResetFile=o,this.onSelectCommit=s,this.onSelectDiff=c,this.onStageFile=l,this.onUnstageFile=u,this.onViewAllDiff=d,this.searchInput=f,this.toastController=p,this.panel=document.getElementById(`gitPanel`),this.pullBackups=[],this.status=null,this.active=!1,this.refreshTimer=null,this.searchQuery=``,this.panelMode=`changes`,this.collapsedSections=new Set,this.selection={commitHash:null,path:null,scope:null,source:`workspace`},this.pendingActionKey=null,this.history={commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0}}initialize(){this.panel?.addEventListener(`click`,e=>{let t=e.target instanceof Element?e.target.closest(`[data-git-panel-mode]`):null;if(t){let e=t.getAttribute(`data-git-panel-mode`);(e===`changes`||e===`history`)&&this.setMode(e);return}let n=e.target instanceof Element?e.target.closest(`[data-git-section-toggle]`):null;if(n){let e=n.getAttribute(`data-git-section-toggle`);this.toggleSection(e);return}let r=e.target instanceof Element?e.target.closest(`[data-git-commit-hash]`):null;if(r&&!e.target.closest(`[data-git-history-load-more]`)){let e=r.getAttribute(`data-git-commit-hash`);if(!e)return;this.onSelectCommit(e,{path:this.selection.commitHash===e?this.selection.path:null});return}if(e.target instanceof Element&&e.target.closest(`[data-git-history-load-more]`)){this.loadMoreHistory();return}let i=e.target instanceof Element?e.target.closest(`[data-git-path]`):null;if(i&&!e.target.closest(`[data-git-file-action]`)){let e=i.getAttribute(`data-git-path`),t=i.getAttribute(`data-git-scope`)||`working-tree`;if(!e)return;this.onSelectDiff(e,{scope:t});return}let a=e.target instanceof Element?e.target.closest(`[data-git-pull-backup-path]`):null;if(a){let e=a.getAttribute(`data-git-pull-backup-path`);if(!e)return;this.onOpenPullBackup(e);return}let o=e.target instanceof Element?e.target.closest(`[data-git-file-action]`):null;if(o){let t=o.getAttribute(`data-git-file-action`),n=o.getAttribute(`data-git-path`),r=o.getAttribute(`data-git-scope`)||`working-tree`;if(!t||!n)return;e.preventDefault(),e.stopPropagation(),this.handleFileAction(t,n,r);return}if(e.target instanceof Element&&e.target.closest(`[data-git-view-all]`)){this.onViewAllDiff();return}if(e.target instanceof Element&&e.target.closest(`[data-git-commit-staged]`)){this.handleCommitStaged();return}let s=e.target instanceof Element?e.target.closest(`[data-git-sync-action]`):null;if(s){let e=s.getAttribute(`data-git-sync-action`);(e===`pull`||e===`push`)&&this.handleSyncAction(e)}}),this.searchInput?.addEventListener(`input`,e=>{this.searchQuery=String(e.target?.value??``).trim().toLowerCase(),this.render()}),this.syncSearchUi()}setActive(e){let t=!!e;if(!(this.active===t&&(!t||this.refreshTimer||this.panelMode===`history`))){if(this.active=t,!this.active){this.stopStatusPolling();return}this.syncSearchUi(),this.refresh({force:!1,includeHistory:this.panelMode===`history`}),this.panelMode===`changes`?this.ensureStatusPolling():this.stopStatusPolling()}}async setMode(e,{forceHistoryRefresh:t=!1}={}){let n=e===`history`?`history`:`changes`,r=this.panelMode!==n;if(this.panelMode=n,this.syncSearchUi(),this.render(),this.active){if(this.panelMode===`changes`){this.ensureStatusPolling(),r&&await this.refresh({force:!1,includeHistory:!1});return}this.stopStatusPolling(),(t||r||!this.history.loaded)&&await this.refreshHistory({force:t||r})}}setSelection({commitHash:e=null,path:t=null,scope:n=null,source:r=`workspace`}={}){this.selection={commitHash:e,path:t,scope:n,source:r},(r===`commit`||e)&&(this.panelMode=`history`,this.syncSearchUi()),this.render()}toggleSection(e){e&&(this.collapsedSections.has(e)?this.collapsedSections.delete(e):this.collapsedSections.add(e),this.render())}ensureStatusPolling(){this.refreshTimer||!this.active||this.panelMode!==`changes`||(this.refreshTimer=setInterval(()=>{this.refresh({force:!1,includeHistory:!1})},Po))}stopStatusPolling(){clearInterval(this.refreshTimer),this.refreshTimer=null}syncSearchUi(){this.searchInput&&(this.searchInput.setAttribute(`placeholder`,this.panelMode===`history`?`Filter loaded commits...`:`Search changes...`),this.searchInput.setAttribute(`aria-label`,this.panelMode===`history`?`Filter loaded commits`:`Search changed files`))}async refresh({force:e=!1,includeHistory:t=this.panelMode===`history`}={}){let n=await this.refreshStatus({force:e});return t&&n.isGitRepo&&await this.refreshHistory({force:e}),n}async refreshStatus({force:e=!1}={}){if(!this.enabled)return this.status={isGitRepo:!1,sections:[],summary:{changedFiles:0}},this.pullBackups=[],this.history={...this.history,commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0},this.onRepoChange(!1,this.status),this.render(),this.status;try{let t=await fetch(O(`/git/status${e?`?force=true`:``}`)),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to load git status`);if(this.status=n,this.pullBackups=[],n.isGitRepo)try{let e=await fetch(O(`/git/pull-backups`)),t=await e.json();if(!e.ok)throw Error(t.error||`Failed to load pull backups`);this.pullBackups=Array.isArray(t.backups)?t.backups:[]}catch(e){console.error(`[git-panel] Failed to load pull backups:`,e)}else this.history={...this.history,commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0};return this.onRepoChange(!!n.isGitRepo,n),this.render(),n}catch(e){return console.error(`[git-panel] Failed to load git status:`,e),this.toastController?.show(`Failed to load git status`),this.status={isGitRepo:!1,sections:[],summary:{changedFiles:0}},this.pullBackups=[],this.history={...this.history,commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0},this.onRepoChange(!1,this.status),this.render(),this.status}}async refreshHistory({force:e=!1}={}){if(!this.status?.isGitRepo)return this.history={...this.history,commits:[],error:``,hasMore:!1,loaded:!1,loading:!1,loadingMore:!1,offset:0},this.render(),this.history;if(this.history.loading&&!e)return this.history;this.history={...this.history,error:``,loading:!0,loadingMore:!1},e&&(this.history={...this.history,commits:[],hasMore:!1,loaded:!1,offset:0}),this.render();try{let e=new URLSearchParams;e.set(`limit`,String(No)),e.set(`offset`,`0`);let t=await fetch(O(`/git/history?${e.toString()}`)),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to load git history`);return this.history={commits:Array.isArray(n.commits)?n.commits:[],error:``,hasMore:!!n.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:Array.isArray(n.commits)?n.commits.length:0},this.render(),this.history}catch(e){return console.error(`[git-panel] Failed to load git history:`,e),this.toastController?.show(`Failed to load git history`),this.history={...this.history,error:`Failed to load git history`,loading:!1,loadingMore:!1},this.render(),this.history}}async loadMoreHistory(){if(!(!this.status?.isGitRepo||this.history.loading||this.history.loadingMore||!this.history.hasMore)){this.history={...this.history,error:``,loadingMore:!0},this.render();try{let e=new URLSearchParams;e.set(`limit`,String(No)),e.set(`offset`,String(this.history.offset));let t=await fetch(O(`/git/history?${e.toString()}`)),n=await t.json();if(!t.ok)throw Error(n.error||`Failed to load git history`);let r=Array.isArray(n.commits)?n.commits:[];this.history={commits:[...this.history.commits,...r],error:``,hasMore:!!n.hasMore,loaded:!0,loading:!1,loadingMore:!1,offset:this.history.offset+r.length},this.render()}catch(e){console.error(`[git-panel] Failed to load more git history:`,e),this.toastController?.show(`Failed to load git history`),this.history={...this.history,error:`Failed to load git history`,loadingMore:!1},this.render()}}}filterFiles(e=[]){return this.searchQuery?e.filter(e=>e.path.toLowerCase().includes(this.searchQuery)||String(e.oldPath||``).toLowerCase().includes(this.searchQuery)):e}filterCommits(e=[]){return this.searchQuery?e.filter(e=>String(e.subject||``).toLowerCase().includes(this.searchQuery)||String(e.shortHash||``).toLowerCase().includes(this.searchQuery)||String(e.authorName||``).toLowerCase().includes(this.searchQuery)):e}async handleFileAction(e,t,n){let r=`${e}:${n}:${t}`;if(this.pendingActionKey!==r){this.pendingActionKey=r,this.render();try{e===`stage`?await this.onStageFile(t,{scope:n}):e===`unstage`?await this.onUnstageFile(t,{scope:n}):e===`reset`&&await this.onResetFile(t,{scope:n})}finally{this.pendingActionKey=null,this.render()}}}async handleCommitStaged(){let e=`commit-staged`;if(this.pendingActionKey!==e){this.pendingActionKey=e,this.render();try{await this.onCommitStaged()}finally{this.pendingActionKey=null,this.render()}}}async handleSyncAction(e){let t=`sync:${e}`;if(this.pendingActionKey!==t){this.pendingActionKey=t,this.render();try{e===`pull`?await this.onPullBranch():e===`push`&&await this.onPushBranch()}finally{this.pendingActionKey=null,this.render()}}}renderSection(e){let t=this.filterFiles(e.files);if(t.length===0)return``;let n=this.collapsedSections.has(e.key);return`
434
452
  <section class="git-section">
435
- <button class="git-section-header" type="button" data-git-section-toggle="${h(e.key)}">
436
- ${vo(n)}
437
- ${h(e.label)}
453
+ <button class="git-section-header" type="button" data-git-section-toggle="${b(e.key)}">
454
+ ${zo(n)}
455
+ ${b(e.label)}
438
456
  <span class="ui-pill-badge ui-pill-badge--count ui-pill-badge--muted git-section-count">${t.length}</span>
439
457
  </button>
440
458
  <div class="git-file-list${n?` hidden`:``}">
@@ -444,7 +462,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
444
462
  `}renderPullBackupsSection(){return!Array.isArray(this.pullBackups)||this.pullBackups.length===0?``:`
445
463
  <section class="git-section">
446
464
  <button class="git-section-header" type="button" data-git-section-toggle="pull-backups">
447
- ${vo(this.collapsedSections.has(`pull-backups`))}
465
+ ${zo(this.collapsedSections.has(`pull-backups`))}
448
466
  Pull Backups
449
467
  <span class="ui-pill-badge ui-pill-badge--count ui-pill-badge--muted git-section-count">${this.pullBackups.length}</span>
450
468
  </button>
@@ -457,62 +475,62 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
457
475
  <button
458
476
  class="ui-item-main git-file-item"
459
477
  type="button"
460
- data-git-pull-backup-path="${h(e.summaryPath||``)}"
478
+ data-git-pull-backup-path="${b(e.summaryPath||``)}"
461
479
  >
462
- ${go()}
480
+ ${Lo()}
463
481
  <span class="ui-item-copy git-file-copy">
464
- <span class="ui-item-title git-file-name">Pull backup ${h(e.id||``)}</span>
465
- <span class="ui-item-subtitle git-file-path">${h(`${t} · ${e.branch||`HEAD`} · ${n} file${n===1?``:`s`}`)}</span>
482
+ <span class="ui-item-title git-file-name">Pull backup ${b(e.id||``)}</span>
483
+ <span class="ui-item-subtitle git-file-path">${b(`${t} · ${e.branch||`HEAD`} · ${n} file${n===1?``:`s`}`)}</span>
466
484
  </span>
467
485
  <span class="ui-status-badge ui-status-badge--warning">BK</span>
468
486
  </button>
469
487
  </div>
470
- `}renderFile(e){let t=this.selection.source===`workspace`&&this.selection.path===e.path&&this.selection.scope===e.scope,n=mo(e.path),r=ho(e.path),i=bo(e.status),a=e.scope===`staged`?{label:`Unstage`,value:`unstage`}:{label:`Stage`,value:`stage`},o=`${a.value}:${e.scope}:${e.path}`,s=this.pendingActionKey===o,c=`reset:${e.scope}:${e.path}`,l=this.pendingActionKey===c;return`
488
+ `}renderFile(e){let t=this.selection.source===`workspace`&&this.selection.path===e.path&&this.selection.scope===e.scope,n=Fo(e.path),r=Io(e.path),i=Vo(e.status),a=e.scope===`staged`?{label:`Unstage`,value:`unstage`}:{label:`Stage`,value:`stage`},o=`${a.value}:${e.scope}:${e.path}`,s=this.pendingActionKey===o,c=`reset:${e.scope}:${e.path}`,l=this.pendingActionKey===c;return`
471
489
  <div class="ui-item-row git-file-row${t?` active`:``}">
472
490
  <button
473
491
  class="ui-item-main git-file-item${t?` active`:``}"
474
492
  type="button"
475
- data-git-path="${h(e.path)}"
476
- data-git-scope="${h(e.scope)}"
493
+ data-git-path="${b(e.path)}"
494
+ data-git-scope="${b(e.scope)}"
477
495
  >
478
- ${go()}
496
+ ${Lo()}
479
497
  <span class="ui-item-copy git-file-copy">
480
- <span class="ui-item-title git-file-name">${h(r)}</span>
481
- ${n?`<span class="ui-item-subtitle git-file-path">${h(n)}</span>`:``}
498
+ <span class="ui-item-title git-file-name">${b(r)}</span>
499
+ ${n?`<span class="ui-item-subtitle git-file-path">${b(n)}</span>`:``}
482
500
  </span>
483
- <span class="ui-status-badge ${i}">${h(e.code)}</span>
501
+ <span class="ui-status-badge ${i}">${b(e.code)}</span>
484
502
  </button>
485
503
  <div class="ui-item-actions git-file-actions">
486
504
  <button
487
505
  class="ui-icon-button ui-action-icon ui-action-icon--surface"
488
506
  type="button"
489
507
  data-git-file-action="reset"
490
- data-git-path="${h(e.path)}"
491
- data-git-scope="${h(e.scope)}"
492
- aria-label="Reset ${h(r)}"
508
+ data-git-path="${b(e.path)}"
509
+ data-git-scope="${b(e.scope)}"
510
+ aria-label="Reset ${b(r)}"
493
511
  title="Reset to current branch"
494
512
  ${l?`disabled`:``}
495
513
  >
496
- ${l?`...`:yo(`reset`)}
514
+ ${l?`...`:Bo(`reset`)}
497
515
  </button>
498
516
  <button
499
517
  class="ui-icon-button ui-action-icon ui-action-icon--surface"
500
518
  type="button"
501
519
  data-git-file-action="${a.value}"
502
- data-git-path="${h(e.path)}"
503
- data-git-scope="${h(e.scope)}"
504
- aria-label="${h(a.label)} ${h(r)}"
505
- title="${h(a.label)}"
520
+ data-git-path="${b(e.path)}"
521
+ data-git-scope="${b(e.scope)}"
522
+ aria-label="${b(a.label)} ${b(r)}"
523
+ title="${b(a.label)}"
506
524
  ${s?`disabled`:``}
507
525
  >
508
- ${s?`...`:yo(a.value)}
526
+ ${s?`...`:Bo(a.value)}
509
527
  </button>
510
528
  </div>
511
529
  </div>
512
530
  `}renderPanelModes(){return`
513
- <div class="${uo({pill:!0,extra:`git-panel-mode-switch`})}" role="tablist" aria-label="Git panel modes">
531
+ <div class="${Mo({pill:!0,extra:`git-panel-mode-switch`})}" role="tablist" aria-label="Git panel modes">
514
532
  <button
515
- class="${q({active:this.panelMode===`changes`,extra:`git-panel-mode-btn`})}"
533
+ class="${Y({active:this.panelMode===`changes`,extra:`git-panel-mode-btn`})}"
516
534
  type="button"
517
535
  data-git-panel-mode="changes"
518
536
  aria-selected="${this.panelMode===`changes`}"
@@ -520,7 +538,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
520
538
  Changes
521
539
  </button>
522
540
  <button
523
- class="${q({active:this.panelMode===`history`,extra:`git-panel-mode-btn`})}"
541
+ class="${Y({active:this.panelMode===`history`,extra:`git-panel-mode-btn`})}"
524
542
  type="button"
525
543
  data-git-panel-mode="history"
526
544
  aria-selected="${this.panelMode===`history`}"
@@ -532,16 +550,16 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
532
550
  <button
533
551
  class="ui-record-surface git-history-row${t?` active`:``}"
534
552
  type="button"
535
- data-git-commit-hash="${h(e.hash||``)}"
536
- title="${h(e.authoredAt||``)}"
553
+ data-git-commit-hash="${b(e.hash||``)}"
554
+ title="${b(e.authoredAt||``)}"
537
555
  >
538
556
  <span class="ui-record-header git-history-row-top">
539
- <span class="ui-record-title git-history-subject">${So(e)}</span>
540
- <span class="ui-pill-badge ui-pill-badge--code git-history-hash">${h(e.shortHash||``)}</span>
557
+ <span class="ui-record-title git-history-subject">${Uo(e)}</span>
558
+ <span class="ui-pill-badge ui-pill-badge--code git-history-hash">${b(e.shortHash||``)}</span>
541
559
  </span>
542
560
  <span class="ui-record-meta git-history-row-meta">
543
- <span>${h(e.authorName||`Unknown`)}</span>
544
- <span>${h(e.relativeDateLabel||``)}</span>
561
+ <span>${b(e.authorName||`Unknown`)}</span>
562
+ <span>${b(e.relativeDateLabel||``)}</span>
545
563
  <span>${n} file${n===1?``:`s`}</span>
546
564
  ${e.isMergeCommit?`<span>Merge</span>`:``}
547
565
  </span>
@@ -550,14 +568,14 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
550
568
  <span class="git-change-del">-${Number(e.deletions||0)}</span>
551
569
  </span>
552
570
  </button>
553
- `}renderHistoryPanel(){let e=this.filterCommits(this.history.commits);return this.history.loading&&!this.history.loaded?`<div class="git-panel-empty">Loading git history...</div>`:this.history.error&&!this.history.loaded?`<div class="git-panel-empty">${h(this.history.error)}</div>`:this.history.loaded&&e.length===0&&this.history.commits.length===0?`<div class="git-panel-empty">No commits yet on this branch.</div>`:this.history.loaded&&e.length===0?`<div class="git-panel-empty">No loaded commits match your filter.</div>`:`
571
+ `}renderHistoryPanel(){let e=this.filterCommits(this.history.commits);return this.history.loading&&!this.history.loaded?`<div class="git-panel-empty">Loading git history...</div>`:this.history.error&&!this.history.loaded?`<div class="git-panel-empty">${b(this.history.error)}</div>`:this.history.loaded&&e.length===0&&this.history.commits.length===0?`<div class="git-panel-empty">No commits yet on this branch.</div>`:this.history.loaded&&e.length===0?`<div class="git-panel-empty">No loaded commits match your filter.</div>`:`
554
572
  <div class="git-history-list">
555
573
  ${e.map(e=>this.renderHistoryRow(e)).join(``)}
556
574
  </div>
557
575
  ${this.history.hasMore?`
558
576
  <div class="git-history-footer">
559
577
  <button
560
- class="${G({variant:`secondary`,size:`compact`,action:!0,surface:!0,extra:`git-history-load-more`})}"
578
+ class="${q({variant:`secondary`,size:`compact`,action:!0,surface:!0,extra:`git-history-load-more`})}"
561
579
  type="button"
562
580
  data-git-history-load-more
563
581
  ${this.history.loadingMore?`disabled`:``}
@@ -572,12 +590,12 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
572
590
  ${n?`
573
591
  <div class="git-panel-footer">
574
592
  <div class="git-panel-footer-actions">
575
- <button class="${G({variant:`secondary`,size:`compact`,action:!0,surface:!0})}" type="button" data-git-view-all>
593
+ <button class="${q({variant:`secondary`,size:`compact`,action:!0,surface:!0})}" type="button" data-git-view-all>
576
594
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M2 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>
577
595
  View Full Diff
578
596
  </button>
579
597
  <button
580
- class="${G({variant:`primary`,action:!0,wide:!0,extra:`git-footer-commit-btn`})}"
598
+ class="${q({variant:`primary`,action:!0,wide:!0,extra:`git-footer-commit-btn`})}"
581
599
  type="button"
582
600
  data-git-commit-staged
583
601
  ${!r||i?`disabled`:``}
@@ -587,42 +605,42 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
587
605
  </div>
588
606
  </div>
589
607
  `:``}
590
- `}renderEmpty(e){this.panel&&(this.panel.innerHTML=`<div class="git-panel-empty">${h(e)}</div>`)}render(){if(!this.panel)return;if(!this.status){this.renderEmpty(`Loading git status...`);return}if(!this.status.isGitRepo){this.renderEmpty(`Git is unavailable for this vault.`);return}let e=this.status.branch??{},t=!!e.upstream,n=this.pendingActionKey===`sync:pull`,r=this.pendingActionKey===`sync:push`;this.panel.innerHTML=`
608
+ `}renderEmpty(e){this.panel&&(this.panel.innerHTML=`<div class="git-panel-empty">${b(e)}</div>`)}render(){if(!this.panel)return;if(!this.status){this.renderEmpty(`Loading git status...`);return}if(!this.status.isGitRepo){this.renderEmpty(`Git is unavailable for this vault.`);return}let e=this.status.branch??{},t=!!e.upstream,n=this.pendingActionKey===`sync:pull`,r=this.pendingActionKey===`sync:push`;this.panel.innerHTML=`
591
609
  <div class="git-branch-bar">
592
610
  <div class="git-branch-meta">
593
611
  <span class="git-branch-name">
594
- ${_o()}
595
- ${h(e.name||`HEAD`)}
612
+ ${Ro()}
613
+ ${b(e.name||`HEAD`)}
596
614
  </span>
597
- ${xo(this.status.summary,e)}
615
+ ${Ho(this.status.summary,e)}
598
616
  </div>
599
617
  <div class="git-branch-actions" role="group" aria-label="Remote sync actions">
600
618
  <button
601
- class="${G({variant:`secondary`,size:`compact`,pill:!0,surface:!0,extra:`ui-action-pill`})}"
619
+ class="${q({variant:`secondary`,size:`compact`,pill:!0,surface:!0,extra:`ui-action-pill`})}"
602
620
  type="button"
603
621
  data-git-sync-action="pull"
604
622
  title="${t?`Pull remote changes (fast-forward only)`:`No upstream branch configured`}"
605
623
  aria-label="Pull branch"
606
624
  ${!t||n?`disabled`:``}
607
625
  >
608
- ${n?`...`:`${yo(`pull`)}<span>Pull</span>`}
626
+ ${n?`...`:`${Bo(`pull`)}<span>Pull</span>`}
609
627
  </button>
610
628
  <button
611
- class="${G({variant:`secondary`,size:`compact`,pill:!0,surface:!0,extra:`ui-action-pill`})}"
629
+ class="${q({variant:`secondary`,size:`compact`,pill:!0,surface:!0,extra:`ui-action-pill`})}"
612
630
  type="button"
613
631
  data-git-sync-action="push"
614
632
  title="${t?`Push local commits`:`No upstream branch configured`}"
615
633
  aria-label="Push branch"
616
634
  ${!t||r?`disabled`:``}
617
635
  >
618
- ${r?`...`:`${yo(`push`)}<span>Push</span>`}
636
+ ${r?`...`:`${Bo(`push`)}<span>Push</span>`}
619
637
  </button>
620
638
  </div>
621
639
  ${this.renderPanelModes()}
622
640
  </div>
623
641
  ${this.panelMode===`history`?this.renderHistoryPanel():this.renderChangesPanel()}
624
- `}},wo=class{constructor({mobileBreakpointQuery:e=window.matchMedia(`(max-width: 768px)`),onMeasureEditor:t,onViewRequest:n=null}){this.mobileBreakpointQuery=e,this.onMeasureEditor=t,this.onViewRequest=n,this.preferredView=`split`,this.mobileShowsEditor=!this.isMobileViewport(),this.currentView=this.mobileShowsEditor?this.preferredView:`preview`,this.editorLayout=document.getElementById(`editorLayout`),this.editorPane=document.getElementById(`editorPane`),this.previewPane=document.getElementById(`previewPane`),this.mobileToggleButton=document.getElementById(`mobileViewToggle`),this.resizer=document.getElementById(`resizer`),this.viewButtons=Array.from(document.querySelectorAll(`.view-btn`))}isMobileViewport(){return this.mobileBreakpointQuery.matches}initialize(){this.viewButtons.forEach(e=>{e.addEventListener(`click`,()=>{this.onViewRequest?.(e.dataset.view)!==!1&&this.setView(e.dataset.view)})}),this.mobileToggleButton?.addEventListener(`click`,()=>this.toggleMobileView()),this.initializeResizer(),this.restorePreferredView()}primeView(e){if(e){if(this.isMobileViewport()){this.mobileShowsEditor=e!==`preview`;return}this.preferredView=e}}reset(){this.restorePreferredView(),this.editorPane&&(this.editorPane.style.flex=``),this.previewPane&&(this.previewPane.style.flex=``),this.updateResizerValue()}restorePreferredView(){let e=this.isMobileViewport()?this.mobileShowsEditor?`split`:`preview`:this.preferredView;this.applyView(e),this.updateMobileToggleButton(this.mobileShowsEditor?`Preview`:`Editor`)}applyView(e){this.currentView=e,this.editorLayout?.setAttribute(`data-view`,e),this.syncViewButtons()}setView(e,{persist:t=!0}={}){e&&(t&&(this.preferredView=e),this.applyView(e),(e===`split`||e===`editor`)&&this.scheduleEditorMeasure())}toggleMobileView(){let e=!this.mobileShowsEditor,t=e?`split`:`preview`;this.onViewRequest?.(t)!==!1&&(this.mobileShowsEditor=e,this.applyView(t),this.updateMobileToggleButton(this.mobileShowsEditor?`Preview`:`Editor`),this.mobileShowsEditor&&this.scheduleEditorMeasure())}scheduleEditorMeasure(){this.onMeasureEditor&&setTimeout(()=>this.onMeasureEditor(),50)}updateMobileToggleButton(e){this.mobileToggleButton&&(this.mobileToggleButton.innerHTML=`${e===`Editor`?`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><line x1="8" y1="8" x2="16" y2="8"/><line x1="8" y1="12" x2="14" y2="12"/><line x1="8" y1="16" x2="12" y2="16"/></svg>`:`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>`}<span class="ui-toolbar-button-label">${e}</span>`)}syncViewButtons(){this.viewButtons.forEach(e=>{let t=e.dataset.view===this.currentView;e.classList.toggle(`active`,t),e.setAttribute(`aria-pressed`,String(t))})}updateResizerValue(){if(!this.resizer||!this.editorLayout||!this.editorPane)return;let e=this.editorLayout.offsetWidth;if(!Number.isFinite(e)||e<=0)return;let t=Math.round(this.editorPane.offsetWidth/e*100);this.resizer.setAttribute(`aria-valuenow`,String(Math.max(20,Math.min(80,t))))}applyEditorPaneWidth(e){if(!this.editorLayout||!this.editorPane||!this.previewPane)return;let t=this.editorLayout.offsetWidth;if(!Number.isFinite(t)||t<=0)return;let n=Math.max(200,Math.min(t-200,e))/t*100;this.editorPane.style.flex=`0 0 ${n}%`,this.previewPane.style.flex=`1`,this.updateResizerValue()}initializeResizer(){if(!this.resizer||!this.editorLayout||!this.editorPane||!this.previewPane)return;let e=!1,t=0,n=0;this.resizer.addEventListener(`mousedown`,r=>{e=!0,t=r.clientX,n=this.editorPane.offsetWidth,this.resizer.classList.add(`dragging`),document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,r.preventDefault()}),document.addEventListener(`mousemove`,r=>{if(!e)return;let i=r.clientX-t;this.applyEditorPaneWidth(n+i)}),document.addEventListener(`mouseup`,()=>{e&&(e=!1,this.resizer.classList.remove(`dragging`),document.body.style.cursor=``,document.body.style.userSelect=``,this.scheduleEditorMeasure())}),this.resizer.addEventListener(`keydown`,e=>{let t=this.editorLayout.offsetWidth;if(!Number.isFinite(t)||t<=0)return;let n=Math.max(24,Math.round(t*.05));if(e.key===`ArrowLeft`){e.preventDefault(),this.applyEditorPaneWidth(this.editorPane.offsetWidth-n),this.scheduleEditorMeasure();return}if(e.key===`ArrowRight`){e.preventDefault(),this.applyEditorPaneWidth(this.editorPane.offsetWidth+n),this.scheduleEditorMeasure();return}if(e.key===`Home`){e.preventDefault(),this.applyEditorPaneWidth(t*.2),this.scheduleEditorMeasure();return}e.key===`End`&&(e.preventDefault(),this.applyEditorPaneWidth(t*.8),this.scheduleEditorMeasure())}),this.updateResizerValue()}},To=class{constructor({mobileBreakpointQuery:e=window.matchMedia(`(max-width: 768px)`),onNavigateToHeading:t,onWillOpen:n}={}){this.outlineOpen=!1,this.activeHeadingFrame=null,this.activeHeadingId=null,this.headings=[],this.pinnedHeadingId=null,this.onNavigateToHeading=t,this.onWillOpen=n,this.panel=document.getElementById(`outlinePanel`),this.navigation=document.getElementById(`outlineNav`),this.previewContainer=document.getElementById(`previewContainer`),this.toggleButton=document.getElementById(`outlineToggle`),this.mobileBreakpointQuery=e,this.handlePreviewScroll=()=>this.scheduleActiveHeadingUpdate(),this.handleDocumentPointerDown=e=>{if(!this.outlineOpen)return;let t=e.target;t instanceof Node&&(this.panel?.contains(t)||this.toggleButton?.contains(t))||this.close()}}initialize(){this.toggleButton?.addEventListener(`click`,()=>this.toggle()),document.addEventListener(`pointerdown`,this.handleDocumentPointerDown)}toggle(){this.setOpenState(!this.outlineOpen)}close(){this.setOpenState(!1)}setOpenState(e){if(e&&!this.outlineOpen&&this.onWillOpen?.(),this.outlineOpen=e,this.panel?.classList.toggle(`hidden`,!this.outlineOpen),this.toggleButton?.classList.toggle(`active`,this.outlineOpen),this.outlineOpen){this.refresh();return}this.cleanup()}refresh(){if(!this.navigation)return;if(!this.outlineOpen){this.cleanup();return}let e=document.getElementById(`previewContent`)?.querySelectorAll(`h1, h2, h3, h4, h5, h6`)??[];if(e.length===0){this.navigation.innerHTML=`<div class="outline-empty">No headings found</div>`,this.cleanup();return}let t=Array.from(e).map((e,t)=>(e.id||=`heading-${t}-${e.textContent.trim().toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,40)}`,{id:e.id,level:Number.parseInt(e.tagName[1],10),sourceLine:Number.parseInt(e.getAttribute(`data-source-line`)||``,10),text:e.textContent.trim()}));this.navigation.innerHTML=t.map(e=>`<button class="outline-item" data-level="${e.level}" data-target="${e.id}"${Number.isFinite(e.sourceLine)?` data-source-line="${e.sourceLine}"`:``} title="${e.text.replace(/"/g,`&quot;`)}">${e.text}</button>`).join(``),this.navigation.querySelectorAll(`.outline-item`).forEach(e=>{e.addEventListener(`click`,()=>{let t=document.getElementById(e.dataset.target);this.pinnedHeadingId=e.dataset.target,this.notifyHeadingNavigation(t,e.dataset.target),this.scrollHeadingIntoView(t,{behavior:`auto`}),this.setActiveItem(e.dataset.target,{behavior:`auto`}),this.mobileBreakpointQuery.matches&&this.close()})}),this.observeHeadings(Array.from(e))}cleanup(){this.activeHeadingFrame&&=(cancelAnimationFrame(this.activeHeadingFrame),null),this.previewContainer?.removeEventListener(`scroll`,this.handlePreviewScroll),this.headings=[],this.pinnedHeadingId=null}setActiveItem(e,{scrollIntoView:t=!0,behavior:n=`smooth`}={}){this.activeHeadingId=e,this.navigation?.querySelectorAll(`.outline-item`).forEach(t=>{t.classList.toggle(`active`,t.dataset.target===e)}),t&&this.navigation?.querySelector(`.outline-item.active`)?.scrollIntoView({behavior:n,block:`nearest`})}observeHeadings(e){this.cleanup(),!(!this.previewContainer||e.length===0)&&(this.headings=e,this.previewContainer.addEventListener(`scroll`,this.handlePreviewScroll,{passive:!0}),this.updateActiveHeading())}scheduleActiveHeadingUpdate(){this.activeHeadingFrame||=requestAnimationFrame(()=>{this.activeHeadingFrame=null,this.updateActiveHeading()})}updateActiveHeading(){if(!this.previewContainer||this.headings.length===0)return;let e=this.getPinnedHeading();if(e&&this.shouldKeepPinnedHeadingActive(e)){this.setActiveItem(e.id,{behavior:`auto`,scrollIntoView:!0});return}this.pinnedHeadingId=null;let t=this.previewContainer.scrollTop,n=this.headings[0];for(let e of this.headings){if(this.getHeadingScrollTop(e)>t)break;n=e}this.setActiveItem(n.id,{behavior:`auto`,scrollIntoView:!0})}getHeadingScrollTop(e){if(!this.previewContainer)return 0;let t=this.previewContainer.getBoundingClientRect(),n=e.getBoundingClientRect();return this.previewContainer.scrollTop+(n.top-t.top)}getPinnedHeading(){return this.pinnedHeadingId?this.headings.find(e=>e.id===this.pinnedHeadingId)??null:null}shouldKeepPinnedHeadingActive(e){if(!this.previewContainer||!e?.isConnected)return!1;let t=this.getHeadingScrollTop(e)-this.previewContainer.scrollTop,n=t+e.getBoundingClientRect().height,r=this.previewContainer.clientHeight*.45;return n>-48&&t<r}notifyHeadingNavigation(e,t){if(!e)return;let n=Number.parseInt(e.getAttribute(`data-source-line`)||``,10);this.onNavigateToHeading?.({headingId:t,sourceLine:Number.isFinite(n)?n:null})}scrollHeadingIntoView(e,{behavior:t=`smooth`}={}){if(!e||!this.previewContainer)return;let n=this.previewContainer.getBoundingClientRect(),r=e.getBoundingClientRect(),i=this.previewContainer.scrollTop+(r.top-n.top);this.previewContainer.scrollTo({behavior:t,top:Math.max(i,0)})}},Eo=.35,Do=120,Oo=12,ko=2;function Ao(e){return Math.max(e.scrollHeight-e.clientHeight,0)}function jo(e){return Math.max(e,0)}function Mo(e){return Math.max(e.clientHeight*Eo,Oo)}function No(e){return(e?.scrollTop??0)<=ko}function Po(e,t){let n=e.getBoundingClientRect();return t.getBoundingClientRect().top-n.top+e.scrollTop}function Fo(e){return!e.querySelector(`[data-source-line]`)}function Io(e){return typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e,{timeout:500}):window.setTimeout(()=>{e({didTimeout:!1,timeRemaining:()=>0})},1)}function Lo(e){if(e!==null){if(typeof window.cancelIdleCallback==`function`){window.cancelIdleCallback(e);return}window.clearTimeout(e)}}var Ro=class{constructor({getEditorLineNumber:e,onEditorScrollActivityChange:t,previewContainer:n,previewElement:r,scrollEditorToLine:i}){this.getEditorLineNumber=e,this.onEditorScrollActivityChange=t,this.previewContainer=n,this.previewElement=r,this.scrollEditorToLine=i,this.editorScroller=null,this.editorScrollActive=!1,this.editorScrollIdleTimer=null,this.lockedElements=new Set,this.pendingSync=null,this.frameId=null,this.previewBlocks=null,this.previewBlocksWarmId=null,this.previewBlocksReadyCallbacks=[],this.largeDocumentMode=!1,this.lastInteractionSource=`editor`,this.suspendedUntil=0,this.handleEditorScroll=()=>{if(!(!this.editorScroller||this.lockedElements.has(this.editorScroller)||this.isSuspended())){if(this.lastInteractionSource=`editor`,this.largeDocumentMode){this.setEditorScrollActive(!0),this.scheduleEditorScrollIdle(),this.scheduleSync(this.editorScroller,this.previewContainer,{preferApproximateMapping:!0});return}this.scheduleSync(this.editorScroller,this.previewContainer)}},this.handlePreviewScroll=()=>{!this.previewContainer||this.lockedElements.has(this.previewContainer)||this.isSuspended()||(this.lastInteractionSource=`preview`,this.scheduleSync(this.previewContainer,this.editorScroller))}}initialize(){this.previewContainer?.addEventListener(`scroll`,this.handlePreviewScroll,{passive:!0})}attachEditorScroller(e){this.editorScroller!==e&&(this.editorScroller?.removeEventListener(`scroll`,this.handleEditorScroll),this.editorScroller=e,this.editorScroller?.addEventListener(`scroll`,this.handleEditorScroll,{passive:!0}))}syncPreviewToEditor(){this.lastInteractionSource=`editor`,this.sync(this.editorScroller,this.previewContainer)}syncEditorToPreview(){this.lastInteractionSource=`preview`,this.sync(this.previewContainer,this.editorScroller)}destroy(){this.previewContainer?.removeEventListener(`scroll`,this.handlePreviewScroll),this.editorScroller?.removeEventListener(`scroll`,this.handleEditorScroll),this.editorScroller=null,clearTimeout(this.editorScrollIdleTimer),this.editorScrollIdleTimer=null,this.pendingSync=null,this.previewBlocks=null,Lo(this.previewBlocksWarmId),this.previewBlocksWarmId=null,this.previewBlocksReadyCallbacks=[],this.lockedElements.clear(),this.editorScrollActive=!1,this.lastInteractionSource=`editor`,this.suspendedUntil=0,this.frameId&&=(cancelAnimationFrame(this.frameId),null)}scheduleSync(e,t,{preferApproximateMapping:n=!1}={}){!e||!t||this.lockedElements.has(e)||this.isSuspended()||(this.pendingSync={preferApproximateMapping:n,source:e,target:t},!this.frameId&&(this.frameId=requestAnimationFrame(()=>{if(this.frameId=null,!this.pendingSync)return;let{preferApproximateMapping:e,source:t,target:n}=this.pendingSync;this.pendingSync=null,this.sync(t,n,{preferApproximateMapping:e})})))}invalidatePreviewBlocks(){this.previewBlocks=null,Lo(this.previewBlocksWarmId),this.previewBlocksWarmId=null,this.previewBlocksReadyCallbacks=[]}setLargeDocumentMode(e){this.largeDocumentMode=!!e,this.largeDocumentMode||(clearTimeout(this.editorScrollIdleTimer),this.editorScrollIdleTimer=null,this.setEditorScrollActive(!1))}warmPreviewBlocks({onReady:e}={}){if(typeof e==`function`&&(this.previewBlocks?e(this.previewBlocks):this.previewBlocksReadyCallbacks.push(e)),!this.largeDocumentMode){this.previewBlocks||=this.buildPreviewBlocks(),this.flushPreviewBlocksReadyCallbacks();return}this.previewBlocks||this.previewBlocksWarmId!==null||(this.previewBlocksWarmId=Io(()=>{this.previewBlocksWarmId=null,this.previewBlocks=this.buildPreviewBlocks(),this.flushPreviewBlocksReadyCallbacks()}))}realignAfterLayoutChange(){let e=()=>{if(this.lastInteractionSource===`preview`){this.syncEditorToPreview();return}this.syncPreviewToEditor()};if(this.largeDocumentMode&&!this.previewBlocks){this.warmPreviewBlocks({onReady:()=>e()});return}e()}suspendSync(e=250){this.suspendedUntil=performance.now()+e}isSuspended(){return performance.now()<this.suspendedUntil}flushPreviewBlocksReadyCallbacks(){this.previewBlocksReadyCallbacks.length!==0&&this.previewBlocksReadyCallbacks.splice(0).forEach(e=>{try{e(this.previewBlocks??[])}catch(e){console.warn(`[scroll-sync] Preview block callback failed:`,e)}})}setEditorScrollActive(e){this.editorScrollActive!==e&&(this.editorScrollActive=e,this.onEditorScrollActivityChange?.(e))}scheduleEditorScrollIdle(){clearTimeout(this.editorScrollIdleTimer),this.editorScrollIdleTimer=setTimeout(()=>{this.editorScrollIdleTimer=null,this.setEditorScrollActive(!1),this.syncPreviewToEditor()},Do)}sync(e,t,{preferApproximateMapping:n=!1}={}){if(!e||!t||this.lockedElements.has(e)||this.isSuspended())return;if(!n&&e===this.editorScroller&&t===this.previewContainer){let e=this.getPreviewScrollTopForEditorLine();if(e!==null){this.setScrollTop(t,e);return}}if(e===this.previewContainer&&t===this.editorScroller){let e=this.getEditorLineNumberForPreviewScroll();if(e!==null){this.lockedElements.add(t),this.scrollEditorToLine?.(e,Eo),requestAnimationFrame(()=>{this.lockedElements.delete(t)});return}}let r=Ao(e),i=Ao(t),a=r>0?e.scrollTop/r:0,o=i>0?i*a:0;this.setScrollTop(t,o)}setScrollTop(e,t){this.lockedElements.add(e),e.scrollTop=jo(t),requestAnimationFrame(()=>{this.lockedElements.delete(e)})}getPreviewScrollTopForEditorLine(){if(No(this.editorScroller))return 0;let e=this.getEditorLineNumber?.();if(!Number.isFinite(e))return null;let t=this.getPreviewBlocks();if(t.length===0||!this.previewContainer)return null;let{block:n,index:r}=this.findBlockForLine(t,e),i=this.getPreviewSpan(t,r),a=Math.max(n.end-n.start,1),o=y((e-n.start)/a,0,1),s=Ao(this.previewContainer),c=Mo(this.previewContainer);return y(n.top+i*o-c,0,s)}getEditorLineNumberForPreviewScroll(){if(!this.previewContainer)return null;let e=this.getPreviewBlocks();if(e.length===0)return null;let t=this.previewContainer.scrollTop+Mo(this.previewContainer),{block:n,index:r}=this.findBlockForScrollTop(e,t),i=this.getPreviewSpan(e,r),a=Math.max(n.end-n.start,1),o=i>0?y((t-n.top)/i,0,1):0;return Math.round(n.start+a*o)}getPreviewBlocks(){return this.previewBlocks?this.previewBlocks:!this.previewContainer||!this.previewElement||this.largeDocumentMode?[]:(this.previewBlocks=this.buildPreviewBlocks(),this.previewBlocks)}buildPreviewBlocks(){let e=Array.from(this.previewElement.querySelectorAll(`[data-source-line]`)).map(e=>{let t=Number.parseInt(e.getAttribute(`data-source-line`)||``,10),n=Number.parseInt(e.getAttribute(`data-source-line-end`)||``,10);return Number.isFinite(t)?{element:e,end:Number.isFinite(n)?Math.max(n,t+1):t+1,start:t,top:Po(this.previewContainer,e)}:null}).filter(Boolean).sort((e,t)=>e.top-t.top||e.start-t.start||e.end-t.end),t=e.filter(e=>Fo(e.element)),n=t.length>0?t:e;return n.filter((e,t)=>{let r=n[t-1];return!r||Math.abs(r.top-e.top)>1||r.start!==e.start||r.end!==e.end})}findBlockForLine(e,t){let n=null,r=-1;for(let i=0;i<e.length;i+=1){let a=e[i];if(t>=a.start&&t<a.end){if(!n){n=a,r=i;continue}let e=n.end-n.start,t=a.end-a.start;(t<e||t===e&&a.start>=n.start)&&(n=a,r=i)}}if(n)return{block:n,index:r};let i=0;for(let n=0;n<e.length&&!(e[n].start>t);n+=1)i=n;return{block:e[i],index:i}}findBlockForScrollTop(e,t){for(let n=0;n<e.length;n+=1)if(t<this.getPreviewSpan(e,n)+e[n].top)return{block:e[n],index:n};let n=e.length-1;return{block:e[n],index:n}}getPreviewSpan(e,t){if(!this.previewContainer)return 1;let n=e[t],r=e[t+1],i=n.element.getBoundingClientRect().height;if(!r){let e=Ao(this.previewContainer);return Math.max(e-n.top+this.previewContainer.clientHeight,i,1)}return Math.max(r.top-n.top,i,1)}},zo=`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>`,Bo=`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>`,Vo=class{constructor({storageKey:e=`collabmd-theme`,onChange:t}){this.storageKey=e,this.onChange=t,this.currentTheme=`dark`}initialize(){this.currentTheme=this.readPreferredTheme(),this.applyTheme(),document.querySelectorAll(`[data-theme-toggle]`).forEach(e=>{e.addEventListener(`click`,()=>this.toggle())})}getTheme(){return this.currentTheme}toggle(){this.currentTheme=this.currentTheme===`dark`?`light`:`dark`,this.persistTheme(),this.applyTheme()}readPreferredTheme(){try{let e=window.localStorage.getItem(this.storageKey);if(e===`light`||e===`dark`)return e}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}persistTheme(){try{window.localStorage.setItem(this.storageKey,this.currentTheme)}catch{}}applyTheme(){document.documentElement.setAttribute(`data-theme`,this.currentTheme),this.updateToggleIcons(),this.onChange?.(this.currentTheme)}updateToggleIcons(){let e=this.currentTheme===`dark`?`Dark`:`Light`,t=this.currentTheme===`dark`?`light`:`dark`,n=this.currentTheme===`dark`?Bo:zo;document.querySelectorAll(`[data-theme-toggle]`).forEach(r=>{let i=r.querySelector(`[data-theme-toggle-icon]`),a=r.querySelector(`[data-theme-toggle-state]`);i?i.innerHTML=n:r.innerHTML=n,a&&(a.textContent=e,a.dataset.theme=this.currentTheme),r.setAttribute(`aria-label`,`Theme: ${e}. Switch to ${t} mode`),r.setAttribute(`title`,`Theme: ${e}. Switch to ${t} mode`)})}},Ho=class{constructor(e){this.container=e}show(e,t=3e3){if(!this.container)return null;let n=typeof t==`number`?{duration:t}:{...t??{}},r=Number(n.duration)>0?Number(n.duration):0,i=document.createElement(`div`);i.className=`toast`;let a=document.createElement(`span`);a.className=`toast__message`,a.textContent=e,i.appendChild(a);let o=()=>{!i.isConnected||i.classList.contains(`leaving`)||(i.classList.add(`leaving`),i.addEventListener(`animationend`,()=>i.remove(),{once:!0}))};if(n.actionLabel&&typeof n.onAction==`function`){let e=document.createElement(`button`);e.className=`toast__action`,e.type=`button`,e.textContent=n.actionLabel,e.addEventListener(`click`,()=>{n.onAction(),n.closeOnAction!==!1&&o()}),i.appendChild(e)}if(n.dismissible){let e=document.createElement(`button`);e.className=`toast__dismiss`,e.type=`button`,e.setAttribute(`aria-label`,`Dismiss notification`),e.textContent=`Close`,e.addEventListener(`click`,o),i.appendChild(e)}return this.container.appendChild(i),r>0&&setTimeout(o,r),i}},Uo=16/9,Wo=240,Go=720,Ko=180;function qo(e){return Math.max(Ko,Math.min(Go,Math.ceil(e||Wo)))}var Jo=class{constructor({previewElement:e}){this.previewElement=e,this.embedEntries=new Map,this.overlayRoot=null}destroy(){this.embedEntries.forEach(e=>{e.hydrateFrameId&&=(cancelAnimationFrame(e.hydrateFrameId),null),e.wrapper?.remove(),e.placeholder=null}),this.embedEntries.clear(),this.overlayRoot?.remove(),this.overlayRoot=null}detachForCommit(){this.embedEntries.forEach(e=>{e.placeholder=null})}reconcileEmbeds(e=this.previewElement){if(this.previewElement=e,!e)return;let t=Array.from(e.querySelectorAll(`.video-embed-placeholder[data-video-embed-key]`)).map(e=>({filePath:e.dataset.videoEmbedSource,key:e.dataset.videoEmbedKey,label:e.dataset.videoEmbedLabel||`Embedded video`,placeholder:e,source:e.dataset.videoEmbedSource||``,kind:e.dataset.videoEmbedKind||``,url:e.dataset.videoEmbedUrl||``,mimeType:e.dataset.videoEmbedMimeType||``})),{nextEntries:n,removedEntries:r}=da(this.embedEntries,t);r.forEach(e=>this._destroyEntry(e)),this.embedEntries=n,this.embedEntries.forEach(e=>{e.aspectRatio=e.aspectRatio||Uo,e.kind=e.placeholder?.dataset.videoEmbedKind||e.kind,e.label=e.placeholder?.dataset.videoEmbedLabel||e.label,e.mimeType=e.placeholder?.dataset.videoEmbedMimeType||e.mimeType,e.source=e.placeholder?.dataset.videoEmbedSource||e.source,e.url=e.placeholder?.dataset.videoEmbedUrl||e.url,e.wrapper||this._createEmbed(e),this._attachWrapper(e)}),this.syncLayout(),this.embedEntries.size===0&&(this.overlayRoot?.remove(),this.overlayRoot=null)}syncLayout(){this.embedEntries.forEach(e=>{e.wrapper&&this._syncEntryLayout(e)})}_destroyEntry(e){e.hydrateFrameId&&=(cancelAnimationFrame(e.hydrateFrameId),null),e.wrapper?.remove(),e.placeholder=null}_createEmbed(e){let t=document.createElement(`div`);if(t.className=`video-embed video-embed-shell diagram-preview-shell is-${e.kind}`,e.kind===`youtube`){let n=document.createElement(`div`);n.className=`video-embed-frame video-embed-frame-youtube`;let r=document.createElement(`iframe`);r.className=`video-embed-iframe`,r.title=e.label||`Embedded YouTube video`,r.referrerPolicy=`strict-origin-when-cross-origin`,r.allow=`accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share`,r.allowFullscreen=!0,n.appendChild(r),t.appendChild(n),e.mediaElement=r}else{let n=document.createElement(`video`);n.className=`video-embed-player`,n.controls=!0,n.preload=`metadata`,n.playsInline=!0,e.label&&(n.title=e.label,n.setAttribute(`aria-label`,e.label));let r=document.createElement(`source`);r.src=e.url,e.mimeType&&(r.type=e.mimeType),n.appendChild(r),n.addEventListener(`loadedmetadata`,()=>{Number.isFinite(n.videoWidth)&&Number.isFinite(n.videoHeight)&&n.videoWidth>0&&n.videoHeight>0&&(e.aspectRatio=n.videoWidth/n.videoHeight,this._syncEntryLayout(e))}),t.appendChild(n),e.mediaElement=n}e.wrapper=t}_attachWrapper(e){let t=e.placeholder?.isConnected?e.placeholder:this.previewElement?.querySelector(`.video-embed-placeholder[data-video-embed-key="${e.key}"]`);if(!t)return;e.placeholder=t,t.classList.add(`is-hydrated`),t.dataset.videoEmbedHydrated=`true`,t.style.pointerEvents=`none`;let n=this._ensureOverlayRoot();e.wrapper?.parentElement!==n&&n.appendChild(e.wrapper)}_syncEntryLayout(e){let t=e.placeholder?.isConnected?e.placeholder:this.previewElement?.querySelector(`.video-embed-placeholder[data-video-embed-key="${e.key}"]`);if(!t||!e.wrapper)return;e.placeholder=t;let n=t.offsetWidth||t.clientWidth||0;if(n<=0&&e.inlineHeightPx)return;let r=qo(n>0?n/(e.aspectRatio||Uo):e.inlineHeightPx);e.inlineHeightPx=r,J(t,`height`,`${r}px`),J(e.wrapper,`position`,`absolute`),J(e.wrapper,`top`,`${t.offsetTop}px`),J(e.wrapper,`left`,`${t.offsetLeft}px`),J(e.wrapper,`width`,`${t.offsetWidth}px`),J(e.wrapper,`height`,`${r}px`),J(e.wrapper,`margin`,`0`),J(e.wrapper,`pointerEvents`,`auto`),this._hydrateEntryMedia(e)}_ensureOverlayRoot(){let e=this.previewElement?.querySelector(`[data-video-overlay-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.videoOverlayRoot=`true`,e.className=`video-embed-overlay-root`,this.previewElement?.appendChild(e)),this.overlayRoot=e,e}_hydrateEntryMedia(e){if(e.kind!==`youtube`)return;let t=e.mediaElement;t instanceof HTMLIFrameElement&&(!e.url||t.getAttribute(`src`)===e.url||e.wrapper?.offsetWidth<=0||e.wrapper?.offsetHeight<=0||(e.hydrateFrameId||=requestAnimationFrame(()=>{if(e.hydrateFrameId=null,!e.url||t.getAttribute(`src`)===e.url)return;let n=Math.round(e.wrapper?.offsetWidth||0),r=Math.round(e.wrapper?.offsetHeight||0);n<=0||r<=0||(t.width=String(n),t.height=String(r),t.src=e.url)})))}};function J(e,t,n){!e||e.style[t]===n||(e.style[t]=n)}var Y=1,Yo=6,Xo=.25,Zo=2,Qo=6;function $o(e){let t=Number(e);return Number.isFinite(t)?Math.min(Yo,Math.max(Y,Math.round(t*100)/100)):Y}function es(e,{contentSize:t=0,scale:n=1,viewportSize:r=0}={}){let i=Number(e),a=Number(t),o=Number(n),s=Number(r);if(!Number.isFinite(i)||!Number.isFinite(a)||!Number.isFinite(o)||!Number.isFinite(s))return 0;let c=(a*o-s)/2;return c<=0?0:Math.min(Math.max(i,-c),c)}var ts=class{constructor({previewElement:e,documentRef:t=document,windowRef:n=window}){this.previewElement=e,this.document=t,this.window=n,this.overlayRoot=null,this.viewport=null,this.imageElement=null,this.zoomLabel=null,this.titleElement=null,this.isOpen=!1,this.scale=Y,this.offsetX=0,this.offsetY=0,this.activePointerId=null,this.dragStartX=0,this.dragStartY=0,this.dragOriginX=0,this.dragOriginY=0,this.didDrag=!1,this.resetButton=null,this.handlePreviewClick=e=>{let t=e.target;if(!(t instanceof this.window.Element))return;let n=t.closest(`img`);!n||!this.previewElement?.contains(n)||n.closest(`[data-video-overlay-root="true"], [data-excalidraw-overlay-root="true"]`)||(e.preventDefault(),e.stopImmediatePropagation?.(),this.openFromImage(n))},this.handleKeyDown=e=>{if(this.isOpen){if(e.key===`Escape`){e.preventDefault(),this.close();return}if(e.key===`+`||e.key===`=`){e.preventDefault(),this.zoomBy(Xo);return}if(e.key===`-`){e.preventDefault(),this.zoomBy(-Xo);return}e.key===`0`&&(e.preventDefault(),this.resetView())}},this.handleWindowResize=()=>{this.isOpen&&(this.clampOffsets(),this.syncTransform())},this.previewElement?.addEventListener(`click`,this.handlePreviewClick),this.document.addEventListener(`keydown`,this.handleKeyDown),this.window.addEventListener(`resize`,this.handleWindowResize)}destroy(){this.previewElement?.removeEventListener(`click`,this.handlePreviewClick),this.document.removeEventListener(`keydown`,this.handleKeyDown),this.window.removeEventListener(`resize`,this.handleWindowResize),this.close(),this.overlayRoot?.remove(),this.overlayRoot=null,this.viewport=null,this.imageElement=null,this.zoomLabel=null,this.titleElement=null,this.resetButton=null}openFromImage(e){let t=e?.currentSrc||e?.getAttribute?.(`src`)||``;return t?(this.ensureOverlayRoot(),this.resetView(),this.titleElement.textContent=e.getAttribute(`alt`)||`Image preview`,this.imageElement.src=t,this.imageElement.alt=e.getAttribute(`alt`)||``,this.overlayRoot.hidden=!1,this.isOpen=!0,this.document.body.classList.add(`image-lightbox-open`),this.syncTransform(),this.overlayRoot.focus?.(),!0):!1}close(){!this.isOpen&&!this.overlayRoot||(this.activePointerId=null,this.didDrag=!1,this.viewport?.classList?.remove(`is-dragging`),this.overlayRoot&&(this.overlayRoot.hidden=!0),this.isOpen=!1,this.document.body.classList.remove(`image-lightbox-open`))}resetView(){this.scale=Y,this.offsetX=0,this.offsetY=0,this.syncTransform()}zoomBy(e){this.setScale(this.scale+e)}setScale(e){this.scale=$o(e),this.clampOffsets(),this.syncTransform()}clampOffsets(){if(!this.viewport||!this.imageElement){this.offsetX=0,this.offsetY=0;return}this.offsetX=es(this.offsetX,{contentSize:this.imageElement.offsetWidth||0,scale:this.scale,viewportSize:this.viewport.clientWidth||0}),this.offsetY=es(this.offsetY,{contentSize:this.imageElement.offsetHeight||0,scale:this.scale,viewportSize:this.viewport.clientHeight||0})}syncTransform(){this.imageElement&&(this.imageElement.style.transform=`translate3d(${this.offsetX}px, ${this.offsetY}px, 0) scale(${this.scale})`,this.imageElement.style.cursor=this.scale>Y?`grab`:`zoom-in`,this.zoomLabel&&(this.zoomLabel.textContent=`${Math.round(this.scale*100)}%`),this.resetButton&&(this.resetButton.disabled=this.scale<=Y&&this.offsetX===0&&this.offsetY===0))}ensureOverlayRoot(){if(this.overlayRoot?.isConnected&&this.overlayRoot.parentElement===this.document.body)return this.overlayRoot;let e=this.document.createElement(`div`);e.className=`image-lightbox-root`,e.dataset.imageLightboxRoot=`true`,e.hidden=!0,e.tabIndex=-1;let t=this.document.createElement(`button`);t.className=`image-lightbox-backdrop`,t.type=`button`,t.setAttribute(`aria-label`,`Close image preview`),t.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),this.close()});let n=this.document.createElement(`div`);n.className=`image-lightbox-shell`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-label`,`Image preview`),n.addEventListener(`click`,e=>e.stopPropagation()),n.addEventListener(`pointerdown`,e=>e.stopPropagation());let r=this.document.createElement(`div`);r.className=`image-lightbox-toolbar`;let i=this.document.createElement(`div`);i.className=`image-lightbox-title`,i.textContent=`Image preview`;let a=this.document.createElement(`div`);a.className=`image-lightbox-controls`;let o=this.document.createElement(`span`);o.className=`image-lightbox-zoom-label`,o.textContent=`100%`;let s=this.createControlButton(`Reset`,`Reset zoom and position`,()=>this.resetView()),c=this.createControlButton(`Close`,`Close image preview`,()=>this.close());a.append(o,s,c),r.append(i,a);let l=this.document.createElement(`div`);l.className=`image-lightbox-viewport`;let u=this.document.createElement(`img`);u.className=`image-lightbox-image`,u.alt=``,u.addEventListener(`load`,()=>{this.clampOffsets(),this.syncTransform()}),l.addEventListener(`wheel`,e=>{this.isOpen&&(e.preventDefault(),this.zoomBy(e.deltaY<0?Xo:-Xo))},{passive:!1}),l.addEventListener(`pointerdown`,e=>{!this.isOpen||this.scale<=Y||e.button!==0||(this.activePointerId=e.pointerId,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.dragOriginX=this.offsetX,this.dragOriginY=this.offsetY,this.didDrag=!1,l.classList.add(`is-dragging`),l.setPointerCapture?.(e.pointerId),e.preventDefault())}),l.addEventListener(`pointermove`,e=>{!this.isOpen||this.activePointerId!==e.pointerId||(!this.didDrag&&(Math.abs(e.clientX-this.dragStartX)>=Qo||Math.abs(e.clientY-this.dragStartY)>=Qo)&&(this.didDrag=!0),this.offsetX=this.dragOriginX+(e.clientX-this.dragStartX),this.offsetY=this.dragOriginY+(e.clientY-this.dragStartY),this.clampOffsets(),this.syncTransform())});let d=e=>{this.activePointerId===e.pointerId&&(this.activePointerId=null,l.classList.remove(`is-dragging`),l.releasePointerCapture?.(e.pointerId),this.imageElement.style.cursor=this.scale>Y?`grab`:`zoom-in`)};return l.addEventListener(`pointerup`,d),l.addEventListener(`pointercancel`,d),u.addEventListener(`click`,e=>{if(this.isOpen){if(e.preventDefault(),e.stopPropagation(),this.didDrag){this.didDrag=!1;return}this.scale<=Y&&this.setScale(Zo)}}),l.appendChild(u),n.append(r,l),e.append(t,n),this.document.body.appendChild(e),this.overlayRoot=e,this.viewport=l,this.imageElement=u,this.zoomLabel=o,this.titleElement=i,this.resetButton=s,this.syncTransform(),e}createControlButton(e,t,n,{className:r=``}={}){let i=this.document.createElement(`button`);return i.className=`image-lightbox-btn ${r}`.trim(),i.type=`button`,i.setAttribute(`aria-label`,t),i.textContent=e,i.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),n(e)}),i}},ns=globalThis,rs=e=>e,is=ns.trustedTypes,as=is?is.createPolicy(`lit-html`,{createHTML:e=>e}):void 0,os=`$lit$`,X=`lit$${Math.random().toFixed(9).slice(2)}$`,ss=`?`+X,cs=`<${ss}>`,Z=document,ls=()=>Z.createComment(``),us=e=>e===null||typeof e!=`object`&&typeof e!=`function`,ds=Array.isArray,fs=e=>ds(e)||typeof e?.[Symbol.iterator]==`function`,ps=`[
625
- \f\r]`,ms=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,hs=/-->/g,gs=/>/g,Q=RegExp(`>|${ps}(?:([^\\s"'>=/]+)(${ps}*=${ps}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,`g`),_s=/'/g,vs=/"/g,ys=/^(?:script|style|textarea|title)$/i,bs=(e=>(t,...n)=>({_$litType$:e,strings:t,values:n}))(1),xs=Symbol.for(`lit-noChange`),$=Symbol.for(`lit-nothing`),Ss=new WeakMap,Cs=Z.createTreeWalker(Z,129);function ws(e,t){if(!ds(e)||!e.hasOwnProperty(`raw`))throw Error(`invalid template strings array`);return as===void 0?t:as.createHTML(t)}var Ts=(e,t)=>{let n=e.length-1,r=[],i,a=t===2?`<svg>`:t===3?`<math>`:``,o=ms;for(let t=0;t<n;t++){let n=e[t],s,c,l=-1,u=0;for(;u<n.length&&(o.lastIndex=u,c=o.exec(n),c!==null);)u=o.lastIndex,o===ms?c[1]===`!--`?o=hs:c[1]===void 0?c[2]===void 0?c[3]!==void 0&&(o=Q):(ys.test(c[2])&&(i=RegExp(`</`+c[2],`g`)),o=Q):o=gs:o===Q?c[0]===`>`?(o=i??ms,l=-1):c[1]===void 0?l=-2:(l=o.lastIndex-c[2].length,s=c[1],o=c[3]===void 0?Q:c[3]===`"`?vs:_s):o===vs||o===_s?o=Q:o===hs||o===gs?o=ms:(o=Q,i=void 0);let d=o===Q&&e[t+1].startsWith(`/>`)?` `:``;a+=o===ms?n+cs:l>=0?(r.push(s),n.slice(0,l)+os+n.slice(l)+X+d):n+X+(l===-2?t:d)}return[ws(e,a+(e[n]||`<?>`)+(t===2?`</svg>`:t===3?`</math>`:``)),r]},Es=class e{constructor({strings:t,_$litType$:n},r){let i;this.parts=[];let a=0,o=0,s=t.length-1,c=this.parts,[l,u]=Ts(t,n);if(this.el=e.createElement(l,r),Cs.currentNode=this.el.content,n===2||n===3){let e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;(i=Cs.nextNode())!==null&&c.length<s;){if(i.nodeType===1){if(i.hasAttributes())for(let e of i.getAttributeNames())if(e.endsWith(os)){let t=u[o++],n=i.getAttribute(e).split(X),r=/([.?@])?(.*)/.exec(t);c.push({type:1,index:a,name:r[2],strings:n,ctor:r[1]===`.`?js:r[1]===`?`?Ms:r[1]===`@`?Ns:As}),i.removeAttribute(e)}else e.startsWith(X)&&(c.push({type:6,index:a}),i.removeAttribute(e));if(ys.test(i.tagName)){let e=i.textContent.split(X),t=e.length-1;if(t>0){i.textContent=is?is.emptyScript:``;for(let n=0;n<t;n++)i.append(e[n],ls()),Cs.nextNode(),c.push({type:2,index:++a});i.append(e[t],ls())}}}else if(i.nodeType===8)if(i.data===ss)c.push({type:2,index:a});else{let e=-1;for(;(e=i.data.indexOf(X,e+1))!==-1;)c.push({type:7,index:a}),e+=X.length-1}a++}}static createElement(e,t){let n=Z.createElement(`template`);return n.innerHTML=e,n}};function Ds(e,t,n=e,r){if(t===xs)return t;let i=r===void 0?n._$Cl:n._$Co?.[r],a=us(t)?void 0:t._$litDirective$;return i?.constructor!==a&&(i?._$AO?.(!1),a===void 0?i=void 0:(i=new a(e),i._$AT(e,n,r)),r===void 0?n._$Cl=i:(n._$Co??=[])[r]=i),i!==void 0&&(t=Ds(e,i._$AS(e,t.values),i,r)),t}var Os=class{constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this._$AM=t}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(e){let{el:{content:t},parts:n}=this._$AD,r=(e?.creationScope??Z).importNode(t,!0);Cs.currentNode=r;let i=Cs.nextNode(),a=0,o=0,s=n[0];for(;s!==void 0;){if(a===s.index){let t;s.type===2?t=new ks(i,i.nextSibling,this,e):s.type===1?t=new s.ctor(i,s.name,s.strings,this,e):s.type===6&&(t=new Ps(i,this,e)),this._$AV.push(t),s=n[++o]}a!==s?.index&&(i=Cs.nextNode(),a++)}return Cs.currentNode=Z,r}p(e){let t=0;for(let n of this._$AV)n!==void 0&&(n.strings===void 0?n._$AI(e[t]):(n._$AI(e,n,t),t+=n.strings.length-2)),t++}},ks=class e{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(e,t,n,r){this.type=2,this._$AH=$,this._$AN=void 0,this._$AA=e,this._$AB=t,this._$AM=n,this.options=r,this._$Cv=r?.isConnected??!0}get parentNode(){let e=this._$AA.parentNode,t=this._$AM;return t!==void 0&&e?.nodeType===11&&(e=t.parentNode),e}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(e,t=this){e=Ds(this,e,t),us(e)?e===$||e==null||e===``?(this._$AH!==$&&this._$AR(),this._$AH=$):e!==this._$AH&&e!==xs&&this._(e):e._$litType$===void 0?e.nodeType===void 0?fs(e)?this.k(e):this._(e):this.T(e):this.$(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==$&&us(this._$AH)?this._$AA.nextSibling.data=e:this.T(Z.createTextNode(e)),this._$AH=e}$(e){let{values:t,_$litType$:n}=e,r=typeof n==`number`?this._$AC(e):(n.el===void 0&&(n.el=Es.createElement(ws(n.h,n.h[0]),this.options)),n);if(this._$AH?._$AD===r)this._$AH.p(t);else{let e=new Os(r,this),n=e.u(this.options);e.p(t),this.T(n),this._$AH=e}}_$AC(e){let t=Ss.get(e.strings);return t===void 0&&Ss.set(e.strings,t=new Es(e)),t}k(t){ds(this._$AH)||(this._$AH=[],this._$AR());let n=this._$AH,r,i=0;for(let a of t)i===n.length?n.push(r=new e(this.O(ls()),this.O(ls()),this,this.options)):r=n[i],r._$AI(a),i++;i<n.length&&(this._$AR(r&&r._$AB.nextSibling,i),n.length=i)}_$AR(e=this._$AA.nextSibling,t){for(this._$AP?.(!1,!0,t);e!==this._$AB;){let t=rs(e).nextSibling;rs(e).remove(),e=t}}setConnected(e){this._$AM===void 0&&(this._$Cv=e,this._$AP?.(e))}},As=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(e,t,n,r,i){this.type=1,this._$AH=$,this._$AN=void 0,this.element=e,this.name=t,this._$AM=r,this.options=i,n.length>2||n[0]!==``||n[1]!==``?(this._$AH=Array(n.length-1).fill(new String),this.strings=n):this._$AH=$}_$AI(e,t=this,n,r){let i=this.strings,a=!1;if(i===void 0)e=Ds(this,e,t,0),a=!us(e)||e!==this._$AH&&e!==xs,a&&(this._$AH=e);else{let r=e,o,s;for(e=i[0],o=0;o<i.length-1;o++)s=Ds(this,r[n+o],t,o),s===xs&&(s=this._$AH[o]),a||=!us(s)||s!==this._$AH[o],s===$?e=$:e!==$&&(e+=(s??``)+i[o+1]),this._$AH[o]=s}a&&!r&&this.j(e)}j(e){e===$?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,e??``)}},js=class extends As{constructor(){super(...arguments),this.type=3}j(e){this.element[this.name]=e===$?void 0:e}},Ms=class extends As{constructor(){super(...arguments),this.type=4}j(e){this.element.toggleAttribute(this.name,!!e&&e!==$)}},Ns=class extends As{constructor(e,t,n,r,i){super(e,t,n,r,i),this.type=5}_$AI(e,t=this){if((e=Ds(this,e,t,0)??$)===xs)return;let n=this._$AH,r=e===$&&n!==$||e.capture!==n.capture||e.once!==n.once||e.passive!==n.passive,i=e!==$&&(n===$||r);r&&this.element.removeEventListener(this.name,this,n),i&&this.element.addEventListener(this.name,this,e),this._$AH=e}handleEvent(e){typeof this._$AH==`function`?this._$AH.call(this.options?.host??this.element,e):this._$AH.handleEvent(e)}},Ps=class{constructor(e,t,n){this.element=e,this.type=6,this._$AN=void 0,this._$AM=t,this.options=n}get _$AU(){return this._$AM._$AU}_$AI(e){Ds(this,e)}},Fs=ns.litHtmlPolyfillSupport;Fs?.(Es,ks),(ns.litHtmlVersions??=[]).push(`3.3.2`);var Is=(e,t,n)=>{let r=n?.renderBefore??t,i=r._$litPart$;if(i===void 0){let e=n?.renderBefore??null;r._$litPart$=i=new ks(t.insertBefore(ls(),e),e,void 0,n??{})}return i._$AI(e),i};function Ls(e={}){let{tone:t=`accent`,count:n=!1,hidden:r=!1,extra:i=[]}=e;return W(`ui-pill-badge`,t&&`ui-pill-badge--${t}`,{"ui-pill-badge--count":n,hidden:r},i)}function Rs(){return bs`
642
+ `}},Go=class{constructor({mobileBreakpointQuery:e=window.matchMedia(`(max-width: 768px)`),onMeasureEditor:t,onViewRequest:n=null}){this.mobileBreakpointQuery=e,this.onMeasureEditor=t,this.onViewRequest=n,this.preferredView=`split`,this.mobileShowsEditor=!this.isMobileViewport(),this.currentView=this.mobileShowsEditor?this.preferredView:`preview`,this.editorLayout=document.getElementById(`editorLayout`),this.editorPane=document.getElementById(`editorPane`),this.previewPane=document.getElementById(`previewPane`),this.mobileToggleButton=document.getElementById(`mobileViewToggle`),this.resizer=document.getElementById(`resizer`),this.viewButtons=Array.from(document.querySelectorAll(`.view-btn`))}isMobileViewport(){return this.mobileBreakpointQuery.matches}initialize(){this.viewButtons.forEach(e=>{e.addEventListener(`click`,()=>{this.onViewRequest?.(e.dataset.view)!==!1&&this.setView(e.dataset.view)})}),this.mobileToggleButton?.addEventListener(`click`,()=>this.toggleMobileView()),this.initializeResizer(),this.restorePreferredView()}primeView(e){if(e){if(this.isMobileViewport()){this.mobileShowsEditor=e!==`preview`;return}this.preferredView=e}}reset(){this.restorePreferredView(),this.editorPane&&(this.editorPane.style.flex=``),this.previewPane&&(this.previewPane.style.flex=``),this.updateResizerValue()}restorePreferredView(){let e=this.isMobileViewport()?this.mobileShowsEditor?`split`:`preview`:this.preferredView;this.applyView(e),this.updateMobileToggleButton(this.mobileShowsEditor?`Preview`:`Editor`)}applyView(e){this.currentView=e,this.editorLayout?.setAttribute(`data-view`,e),this.syncViewButtons()}setView(e,{persist:t=!0}={}){e&&(t&&(this.preferredView=e),this.applyView(e),(e===`split`||e===`editor`)&&this.scheduleEditorMeasure())}toggleMobileView(){let e=!this.mobileShowsEditor,t=e?`split`:`preview`;this.onViewRequest?.(t)!==!1&&(this.mobileShowsEditor=e,this.applyView(t),this.updateMobileToggleButton(this.mobileShowsEditor?`Preview`:`Editor`),this.mobileShowsEditor&&this.scheduleEditorMeasure())}scheduleEditorMeasure(){this.onMeasureEditor&&setTimeout(()=>this.onMeasureEditor(),50)}updateMobileToggleButton(e){this.mobileToggleButton&&(this.mobileToggleButton.innerHTML=`${e===`Editor`?`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><line x1="8" y1="8" x2="16" y2="8"/><line x1="8" y1="12" x2="14" y2="12"/><line x1="8" y1="16" x2="12" y2="16"/></svg>`:`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>`}<span class="ui-toolbar-button-label">${e}</span>`)}syncViewButtons(){this.viewButtons.forEach(e=>{let t=e.dataset.view===this.currentView;e.classList.toggle(`active`,t),e.setAttribute(`aria-pressed`,String(t))})}updateResizerValue(){if(!this.resizer||!this.editorLayout||!this.editorPane)return;let e=this.editorLayout.offsetWidth;if(!Number.isFinite(e)||e<=0)return;let t=Math.round(this.editorPane.offsetWidth/e*100);this.resizer.setAttribute(`aria-valuenow`,String(Math.max(20,Math.min(80,t))))}applyEditorPaneWidth(e){if(!this.editorLayout||!this.editorPane||!this.previewPane)return;let t=this.editorLayout.offsetWidth;if(!Number.isFinite(t)||t<=0)return;let n=Math.max(200,Math.min(t-200,e))/t*100;this.editorPane.style.flex=`0 0 ${n}%`,this.previewPane.style.flex=`1`,this.updateResizerValue()}initializeResizer(){if(!this.resizer||!this.editorLayout||!this.editorPane||!this.previewPane)return;let e=!1,t=0,n=0;this.resizer.addEventListener(`mousedown`,r=>{e=!0,t=r.clientX,n=this.editorPane.offsetWidth,this.resizer.classList.add(`dragging`),document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`,r.preventDefault()}),document.addEventListener(`mousemove`,r=>{if(!e)return;let i=r.clientX-t;this.applyEditorPaneWidth(n+i)}),document.addEventListener(`mouseup`,()=>{e&&(e=!1,this.resizer.classList.remove(`dragging`),document.body.style.cursor=``,document.body.style.userSelect=``,this.scheduleEditorMeasure())}),this.resizer.addEventListener(`keydown`,e=>{let t=this.editorLayout.offsetWidth;if(!Number.isFinite(t)||t<=0)return;let n=Math.max(24,Math.round(t*.05));if(e.key===`ArrowLeft`){e.preventDefault(),this.applyEditorPaneWidth(this.editorPane.offsetWidth-n),this.scheduleEditorMeasure();return}if(e.key===`ArrowRight`){e.preventDefault(),this.applyEditorPaneWidth(this.editorPane.offsetWidth+n),this.scheduleEditorMeasure();return}if(e.key===`Home`){e.preventDefault(),this.applyEditorPaneWidth(t*.2),this.scheduleEditorMeasure();return}e.key===`End`&&(e.preventDefault(),this.applyEditorPaneWidth(t*.8),this.scheduleEditorMeasure())}),this.updateResizerValue()}},Ko=class{constructor({mobileBreakpointQuery:e=window.matchMedia(`(max-width: 768px)`),onNavigateToHeading:t,onWillOpen:n}={}){this.outlineOpen=!1,this.activeHeadingFrame=null,this.activeHeadingId=null,this.headings=[],this.pinnedHeadingId=null,this.onNavigateToHeading=t,this.onWillOpen=n,this.panel=document.getElementById(`outlinePanel`),this.navigation=document.getElementById(`outlineNav`),this.previewContainer=document.getElementById(`previewContainer`),this.toggleButton=document.getElementById(`outlineToggle`),this.mobileBreakpointQuery=e,this.handlePreviewScroll=()=>this.scheduleActiveHeadingUpdate(),this.handleDocumentPointerDown=e=>{if(!this.outlineOpen)return;let t=e.target;t instanceof Node&&(this.panel?.contains(t)||this.toggleButton?.contains(t))||this.close()}}initialize(){this.toggleButton?.addEventListener(`click`,()=>this.toggle()),document.addEventListener(`pointerdown`,this.handleDocumentPointerDown)}toggle(){this.setOpenState(!this.outlineOpen)}close(){this.setOpenState(!1)}setOpenState(e){if(e&&!this.outlineOpen&&this.onWillOpen?.(),this.outlineOpen=e,this.panel?.classList.toggle(`hidden`,!this.outlineOpen),this.toggleButton?.classList.toggle(`active`,this.outlineOpen),this.outlineOpen){this.refresh();return}this.cleanup()}refresh(){if(!this.navigation)return;if(!this.outlineOpen){this.cleanup();return}let e=document.getElementById(`previewContent`)?.querySelectorAll(`h1, h2, h3, h4, h5, h6`)??[];if(e.length===0){this.navigation.innerHTML=`<div class="outline-empty">No headings found</div>`,this.cleanup();return}let t=Array.from(e).map((e,t)=>(e.id||=`heading-${t}-${e.textContent.trim().toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-|-$/g,``).slice(0,40)}`,{id:e.id,level:Number.parseInt(e.tagName[1],10),sourceLine:Number.parseInt(e.getAttribute(`data-source-line`)||``,10),text:e.textContent.trim()}));this.navigation.innerHTML=t.map(e=>`<button class="outline-item" data-level="${e.level}" data-target="${e.id}"${Number.isFinite(e.sourceLine)?` data-source-line="${e.sourceLine}"`:``} title="${e.text.replace(/"/g,`&quot;`)}">${e.text}</button>`).join(``),this.navigation.querySelectorAll(`.outline-item`).forEach(e=>{e.addEventListener(`click`,()=>{let t=document.getElementById(e.dataset.target);this.pinnedHeadingId=e.dataset.target,this.notifyHeadingNavigation(t,e.dataset.target),this.scrollHeadingIntoView(t,{behavior:`auto`}),this.setActiveItem(e.dataset.target,{behavior:`auto`}),this.mobileBreakpointQuery.matches&&this.close()})}),this.observeHeadings(Array.from(e))}cleanup(){this.activeHeadingFrame&&=(cancelAnimationFrame(this.activeHeadingFrame),null),this.previewContainer?.removeEventListener(`scroll`,this.handlePreviewScroll),this.headings=[],this.pinnedHeadingId=null}setActiveItem(e,{scrollIntoView:t=!0,behavior:n=`smooth`}={}){this.activeHeadingId=e,this.navigation?.querySelectorAll(`.outline-item`).forEach(t=>{t.classList.toggle(`active`,t.dataset.target===e)}),t&&this.navigation?.querySelector(`.outline-item.active`)?.scrollIntoView({behavior:n,block:`nearest`})}observeHeadings(e){this.cleanup(),!(!this.previewContainer||e.length===0)&&(this.headings=e,this.previewContainer.addEventListener(`scroll`,this.handlePreviewScroll,{passive:!0}),this.updateActiveHeading())}scheduleActiveHeadingUpdate(){this.activeHeadingFrame||=requestAnimationFrame(()=>{this.activeHeadingFrame=null,this.updateActiveHeading()})}updateActiveHeading(){if(!this.previewContainer||this.headings.length===0)return;let e=this.getPinnedHeading();if(e&&this.shouldKeepPinnedHeadingActive(e)){this.setActiveItem(e.id,{behavior:`auto`,scrollIntoView:!0});return}this.pinnedHeadingId=null;let t=this.previewContainer.scrollTop,n=this.headings[0];for(let e of this.headings){if(this.getHeadingScrollTop(e)>t)break;n=e}this.setActiveItem(n.id,{behavior:`auto`,scrollIntoView:!0})}getHeadingScrollTop(e){if(!this.previewContainer)return 0;let t=this.previewContainer.getBoundingClientRect(),n=e.getBoundingClientRect();return this.previewContainer.scrollTop+(n.top-t.top)}getPinnedHeading(){return this.pinnedHeadingId?this.headings.find(e=>e.id===this.pinnedHeadingId)??null:null}shouldKeepPinnedHeadingActive(e){if(!this.previewContainer||!e?.isConnected)return!1;let t=this.getHeadingScrollTop(e)-this.previewContainer.scrollTop,n=t+e.getBoundingClientRect().height,r=this.previewContainer.clientHeight*.45;return n>-48&&t<r}notifyHeadingNavigation(e,t){if(!e)return;let n=Number.parseInt(e.getAttribute(`data-source-line`)||``,10);this.onNavigateToHeading?.({headingId:t,sourceLine:Number.isFinite(n)?n:null})}scrollHeadingIntoView(e,{behavior:t=`smooth`}={}){if(!e||!this.previewContainer)return;let n=this.previewContainer.getBoundingClientRect(),r=e.getBoundingClientRect(),i=this.previewContainer.scrollTop+(r.top-n.top);this.previewContainer.scrollTo({behavior:t,top:Math.max(i,0)})}},qo=.35,Jo=120,Yo=12,Xo=2;function Zo(e){return Math.max(e.scrollHeight-e.clientHeight,0)}function Qo(e){return Math.max(e,0)}function $o(e){return Math.max(e.clientHeight*qo,Yo)}function es(e){return(e?.scrollTop??0)<=Xo}function ts(e,t){let n=e.getBoundingClientRect();return t.getBoundingClientRect().top-n.top+e.scrollTop}function ns(e){return!e.querySelector(`[data-source-line]`)}function rs(e){return typeof window.requestIdleCallback==`function`?window.requestIdleCallback(e,{timeout:500}):window.setTimeout(()=>{e({didTimeout:!1,timeRemaining:()=>0})},1)}function is(e){if(e!==null){if(typeof window.cancelIdleCallback==`function`){window.cancelIdleCallback(e);return}window.clearTimeout(e)}}var as=class{constructor({getEditorLineNumber:e,onEditorScrollActivityChange:t,previewContainer:n,previewElement:r,scrollEditorToLine:i}){this.getEditorLineNumber=e,this.onEditorScrollActivityChange=t,this.previewContainer=n,this.previewElement=r,this.scrollEditorToLine=i,this.editorScroller=null,this.editorScrollActive=!1,this.editorScrollIdleTimer=null,this.lockedElements=new Set,this.pendingSync=null,this.frameId=null,this.previewBlocks=null,this.previewBlocksWarmId=null,this.previewBlocksReadyCallbacks=[],this.largeDocumentMode=!1,this.lastInteractionSource=`editor`,this.suspendedUntil=0,this.handleEditorScroll=()=>{if(!(!this.editorScroller||this.lockedElements.has(this.editorScroller)||this.isSuspended())){if(this.lastInteractionSource=`editor`,this.largeDocumentMode){this.setEditorScrollActive(!0),this.scheduleEditorScrollIdle(),this.scheduleSync(this.editorScroller,this.previewContainer,{preferApproximateMapping:!0});return}this.scheduleSync(this.editorScroller,this.previewContainer)}},this.handlePreviewScroll=()=>{!this.previewContainer||this.lockedElements.has(this.previewContainer)||this.isSuspended()||(this.lastInteractionSource=`preview`,this.scheduleSync(this.previewContainer,this.editorScroller))}}initialize(){this.previewContainer?.addEventListener(`scroll`,this.handlePreviewScroll,{passive:!0})}attachEditorScroller(e){this.editorScroller!==e&&(this.editorScroller?.removeEventListener(`scroll`,this.handleEditorScroll),this.editorScroller=e,this.editorScroller?.addEventListener(`scroll`,this.handleEditorScroll,{passive:!0}))}syncPreviewToEditor(){this.lastInteractionSource=`editor`,this.sync(this.editorScroller,this.previewContainer)}syncEditorToPreview(){this.lastInteractionSource=`preview`,this.sync(this.previewContainer,this.editorScroller)}destroy(){this.previewContainer?.removeEventListener(`scroll`,this.handlePreviewScroll),this.editorScroller?.removeEventListener(`scroll`,this.handleEditorScroll),this.editorScroller=null,clearTimeout(this.editorScrollIdleTimer),this.editorScrollIdleTimer=null,this.pendingSync=null,this.previewBlocks=null,is(this.previewBlocksWarmId),this.previewBlocksWarmId=null,this.previewBlocksReadyCallbacks=[],this.lockedElements.clear(),this.editorScrollActive=!1,this.lastInteractionSource=`editor`,this.suspendedUntil=0,this.frameId&&=(cancelAnimationFrame(this.frameId),null)}scheduleSync(e,t,{preferApproximateMapping:n=!1}={}){!e||!t||this.lockedElements.has(e)||this.isSuspended()||(this.pendingSync={preferApproximateMapping:n,source:e,target:t},!this.frameId&&(this.frameId=requestAnimationFrame(()=>{if(this.frameId=null,!this.pendingSync)return;let{preferApproximateMapping:e,source:t,target:n}=this.pendingSync;this.pendingSync=null,this.sync(t,n,{preferApproximateMapping:e})})))}invalidatePreviewBlocks(){this.previewBlocks=null,is(this.previewBlocksWarmId),this.previewBlocksWarmId=null,this.previewBlocksReadyCallbacks=[]}setLargeDocumentMode(e){this.largeDocumentMode=!!e,this.largeDocumentMode||(clearTimeout(this.editorScrollIdleTimer),this.editorScrollIdleTimer=null,this.setEditorScrollActive(!1))}warmPreviewBlocks({onReady:e}={}){if(typeof e==`function`&&(this.previewBlocks?e(this.previewBlocks):this.previewBlocksReadyCallbacks.push(e)),!this.largeDocumentMode){this.previewBlocks||=this.buildPreviewBlocks(),this.flushPreviewBlocksReadyCallbacks();return}this.previewBlocks||this.previewBlocksWarmId!==null||(this.previewBlocksWarmId=rs(()=>{this.previewBlocksWarmId=null,this.previewBlocks=this.buildPreviewBlocks(),this.flushPreviewBlocksReadyCallbacks()}))}realignAfterLayoutChange(){let e=()=>{if(this.lastInteractionSource===`preview`){this.syncEditorToPreview();return}this.syncPreviewToEditor()};if(this.largeDocumentMode&&!this.previewBlocks){this.warmPreviewBlocks({onReady:()=>e()});return}e()}suspendSync(e=250){this.suspendedUntil=performance.now()+e}isSuspended(){return performance.now()<this.suspendedUntil}flushPreviewBlocksReadyCallbacks(){this.previewBlocksReadyCallbacks.length!==0&&this.previewBlocksReadyCallbacks.splice(0).forEach(e=>{try{e(this.previewBlocks??[])}catch(e){console.warn(`[scroll-sync] Preview block callback failed:`,e)}})}setEditorScrollActive(e){this.editorScrollActive!==e&&(this.editorScrollActive=e,this.onEditorScrollActivityChange?.(e))}scheduleEditorScrollIdle(){clearTimeout(this.editorScrollIdleTimer),this.editorScrollIdleTimer=setTimeout(()=>{this.editorScrollIdleTimer=null,this.setEditorScrollActive(!1),this.syncPreviewToEditor()},Jo)}sync(e,t,{preferApproximateMapping:n=!1}={}){if(!e||!t||this.lockedElements.has(e)||this.isSuspended())return;if(!n&&e===this.editorScroller&&t===this.previewContainer){let e=this.getPreviewScrollTopForEditorLine();if(e!==null){this.setScrollTop(t,e);return}}if(e===this.previewContainer&&t===this.editorScroller){let e=this.getEditorLineNumberForPreviewScroll();if(e!==null){this.lockedElements.add(t),this.scrollEditorToLine?.(e,qo),requestAnimationFrame(()=>{this.lockedElements.delete(t)});return}}let r=Zo(e),i=Zo(t),a=r>0?e.scrollTop/r:0,o=i>0?i*a:0;this.setScrollTop(t,o)}setScrollTop(e,t){this.lockedElements.add(e),e.scrollTop=Qo(t),requestAnimationFrame(()=>{this.lockedElements.delete(e)})}getPreviewScrollTopForEditorLine(){if(es(this.editorScroller))return 0;let e=this.getEditorLineNumber?.();if(!Number.isFinite(e))return null;let t=this.getPreviewBlocks();if(t.length===0||!this.previewContainer)return null;let{block:n,index:r}=this.findBlockForLine(t,e),i=this.getPreviewSpan(t,r),a=Math.max(n.end-n.start,1),o=x((e-n.start)/a,0,1),s=Zo(this.previewContainer),c=$o(this.previewContainer);return x(n.top+i*o-c,0,s)}getEditorLineNumberForPreviewScroll(){if(!this.previewContainer)return null;let e=this.getPreviewBlocks();if(e.length===0)return null;let t=this.previewContainer.scrollTop+$o(this.previewContainer),{block:n,index:r}=this.findBlockForScrollTop(e,t),i=this.getPreviewSpan(e,r),a=Math.max(n.end-n.start,1),o=i>0?x((t-n.top)/i,0,1):0;return Math.round(n.start+a*o)}getPreviewBlocks(){return this.previewBlocks?this.previewBlocks:!this.previewContainer||!this.previewElement||this.largeDocumentMode?[]:(this.previewBlocks=this.buildPreviewBlocks(),this.previewBlocks)}buildPreviewBlocks(){let e=Array.from(this.previewElement.querySelectorAll(`[data-source-line]`)).map(e=>{let t=Number.parseInt(e.getAttribute(`data-source-line`)||``,10),n=Number.parseInt(e.getAttribute(`data-source-line-end`)||``,10);return Number.isFinite(t)?{element:e,end:Number.isFinite(n)?Math.max(n,t+1):t+1,start:t,top:ts(this.previewContainer,e)}:null}).filter(Boolean).sort((e,t)=>e.top-t.top||e.start-t.start||e.end-t.end),t=e.filter(e=>ns(e.element)),n=t.length>0?t:e;return n.filter((e,t)=>{let r=n[t-1];return!r||Math.abs(r.top-e.top)>1||r.start!==e.start||r.end!==e.end})}findBlockForLine(e,t){let n=null,r=-1;for(let i=0;i<e.length;i+=1){let a=e[i];if(t>=a.start&&t<a.end){if(!n){n=a,r=i;continue}let e=n.end-n.start,t=a.end-a.start;(t<e||t===e&&a.start>=n.start)&&(n=a,r=i)}}if(n)return{block:n,index:r};let i=0;for(let n=0;n<e.length&&!(e[n].start>t);n+=1)i=n;return{block:e[i],index:i}}findBlockForScrollTop(e,t){for(let n=0;n<e.length;n+=1)if(t<this.getPreviewSpan(e,n)+e[n].top)return{block:e[n],index:n};let n=e.length-1;return{block:e[n],index:n}}getPreviewSpan(e,t){if(!this.previewContainer)return 1;let n=e[t],r=e[t+1],i=n.element.getBoundingClientRect().height;if(!r){let e=Zo(this.previewContainer);return Math.max(e-n.top+this.previewContainer.clientHeight,i,1)}return Math.max(r.top-n.top,i,1)}},os=`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>`,ss=`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>`,cs=class{constructor({storageKey:e=`collabmd-theme`,onChange:t}){this.storageKey=e,this.onChange=t,this.currentTheme=`dark`}initialize(){this.currentTheme=this.readPreferredTheme(),this.applyTheme(),document.querySelectorAll(`[data-theme-toggle]`).forEach(e=>{e.addEventListener(`click`,()=>this.toggle())})}getTheme(){return this.currentTheme}toggle(){this.currentTheme=this.currentTheme===`dark`?`light`:`dark`,this.persistTheme(),this.applyTheme()}readPreferredTheme(){try{let e=window.localStorage.getItem(this.storageKey);if(e===`light`||e===`dark`)return e}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`}persistTheme(){try{window.localStorage.setItem(this.storageKey,this.currentTheme)}catch{}}applyTheme(){document.documentElement.setAttribute(`data-theme`,this.currentTheme),this.updateToggleIcons(),this.onChange?.(this.currentTheme)}updateToggleIcons(){let e=this.currentTheme===`dark`?`Dark`:`Light`,t=this.currentTheme===`dark`?`light`:`dark`,n=this.currentTheme===`dark`?ss:os;document.querySelectorAll(`[data-theme-toggle]`).forEach(r=>{let i=r.querySelector(`[data-theme-toggle-icon]`),a=r.querySelector(`[data-theme-toggle-state]`);i?i.innerHTML=n:r.innerHTML=n,a&&(a.textContent=e,a.dataset.theme=this.currentTheme),r.setAttribute(`aria-label`,`Theme: ${e}. Switch to ${t} mode`),r.setAttribute(`title`,`Theme: ${e}. Switch to ${t} mode`)})}},ls=class{constructor(e){this.container=e}show(e,t=3e3){if(!this.container)return null;let n=typeof t==`number`?{duration:t}:{...t??{}},r=Number(n.duration)>0?Number(n.duration):0,i=document.createElement(`div`);i.className=`toast`;let a=document.createElement(`span`);a.className=`toast__message`,a.textContent=e,i.appendChild(a);let o=()=>{!i.isConnected||i.classList.contains(`leaving`)||(i.classList.add(`leaving`),i.addEventListener(`animationend`,()=>i.remove(),{once:!0}))};if(n.actionLabel&&typeof n.onAction==`function`){let e=document.createElement(`button`);e.className=`toast__action`,e.type=`button`,e.textContent=n.actionLabel,e.addEventListener(`click`,()=>{n.onAction(),n.closeOnAction!==!1&&o()}),i.appendChild(e)}if(n.dismissible){let e=document.createElement(`button`);e.className=`toast__dismiss`,e.type=`button`,e.setAttribute(`aria-label`,`Dismiss notification`),e.textContent=`Close`,e.addEventListener(`click`,o),i.appendChild(e)}return this.container.appendChild(i),r>0&&setTimeout(o,r),i}},us=16/9,ds=240,fs=720,ps=180;function ms(e){return Math.max(ps,Math.min(fs,Math.ceil(e||ds)))}var hs=class{constructor({previewElement:e}){this.previewElement=e,this.embedEntries=new Map,this.overlayRoot=null}destroy(){this.embedEntries.forEach(e=>{e.hydrateFrameId&&=(cancelAnimationFrame(e.hydrateFrameId),null),e.wrapper?.remove(),e.placeholder=null}),this.embedEntries.clear(),this.overlayRoot?.remove(),this.overlayRoot=null}detachForCommit(){this.embedEntries.forEach(e=>{e.placeholder=null})}reconcileEmbeds(e=this.previewElement){if(this.previewElement=e,!e)return;let t=Array.from(e.querySelectorAll(`.video-embed-placeholder[data-video-embed-key]`)).map(e=>({filePath:e.dataset.videoEmbedSource,key:e.dataset.videoEmbedKey,label:e.dataset.videoEmbedLabel||`Embedded video`,placeholder:e,source:e.dataset.videoEmbedSource||``,kind:e.dataset.videoEmbedKind||``,url:e.dataset.videoEmbedUrl||``,mimeType:e.dataset.videoEmbedMimeType||``})),{nextEntries:n,removedEntries:r}=Ma(this.embedEntries,t);r.forEach(e=>this._destroyEntry(e)),this.embedEntries=n,this.embedEntries.forEach(e=>{e.aspectRatio=e.aspectRatio||us,e.kind=e.placeholder?.dataset.videoEmbedKind||e.kind,e.label=e.placeholder?.dataset.videoEmbedLabel||e.label,e.mimeType=e.placeholder?.dataset.videoEmbedMimeType||e.mimeType,e.source=e.placeholder?.dataset.videoEmbedSource||e.source,e.url=e.placeholder?.dataset.videoEmbedUrl||e.url,e.wrapper||this._createEmbed(e),this._attachWrapper(e)}),this.syncLayout(),this.embedEntries.size===0&&(this.overlayRoot?.remove(),this.overlayRoot=null)}syncLayout(){this.embedEntries.forEach(e=>{e.wrapper&&this._syncEntryLayout(e)})}_destroyEntry(e){e.hydrateFrameId&&=(cancelAnimationFrame(e.hydrateFrameId),null),e.wrapper?.remove(),e.placeholder=null}_createEmbed(e){let t=document.createElement(`div`);if(t.className=`video-embed video-embed-shell diagram-preview-shell is-${e.kind}`,e.kind===`youtube`){let n=document.createElement(`div`);n.className=`video-embed-frame video-embed-frame-youtube`;let r=document.createElement(`iframe`);r.className=`video-embed-iframe`,r.title=e.label||`Embedded YouTube video`,r.referrerPolicy=`strict-origin-when-cross-origin`,r.allow=`accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share`,r.allowFullscreen=!0,n.appendChild(r),t.appendChild(n),e.mediaElement=r}else{let n=document.createElement(`video`);n.className=`video-embed-player`,n.controls=!0,n.preload=`metadata`,n.playsInline=!0,e.label&&(n.title=e.label,n.setAttribute(`aria-label`,e.label));let r=document.createElement(`source`);r.src=e.url,e.mimeType&&(r.type=e.mimeType),n.appendChild(r),n.addEventListener(`loadedmetadata`,()=>{Number.isFinite(n.videoWidth)&&Number.isFinite(n.videoHeight)&&n.videoWidth>0&&n.videoHeight>0&&(e.aspectRatio=n.videoWidth/n.videoHeight,this._syncEntryLayout(e))}),t.appendChild(n),e.mediaElement=n}e.wrapper=t}_attachWrapper(e){let t=e.placeholder?.isConnected?e.placeholder:this.previewElement?.querySelector(`.video-embed-placeholder[data-video-embed-key="${e.key}"]`);if(!t)return;e.placeholder=t,t.classList.add(`is-hydrated`),t.dataset.videoEmbedHydrated=`true`,t.style.pointerEvents=`none`;let n=this._ensureOverlayRoot();e.wrapper?.parentElement!==n&&n.appendChild(e.wrapper)}_syncEntryLayout(e){let t=e.placeholder?.isConnected?e.placeholder:this.previewElement?.querySelector(`.video-embed-placeholder[data-video-embed-key="${e.key}"]`);if(!t||!e.wrapper)return;e.placeholder=t;let n=t.offsetWidth||t.clientWidth||0;if(n<=0&&e.inlineHeightPx)return;let r=ms(n>0?n/(e.aspectRatio||us):e.inlineHeightPx);e.inlineHeightPx=r,X(t,`height`,`${r}px`),X(e.wrapper,`position`,`absolute`),X(e.wrapper,`top`,`${t.offsetTop}px`),X(e.wrapper,`left`,`${t.offsetLeft}px`),X(e.wrapper,`width`,`${t.offsetWidth}px`),X(e.wrapper,`height`,`${r}px`),X(e.wrapper,`margin`,`0`),X(e.wrapper,`pointerEvents`,`auto`),this._hydrateEntryMedia(e)}_ensureOverlayRoot(){let e=this.previewElement?.querySelector(`[data-video-overlay-root="true"]`);return e||(e=document.createElement(`div`),e.dataset.videoOverlayRoot=`true`,e.className=`video-embed-overlay-root`,this.previewElement?.appendChild(e)),this.overlayRoot=e,e}_hydrateEntryMedia(e){if(e.kind!==`youtube`)return;let t=e.mediaElement;t instanceof HTMLIFrameElement&&(!e.url||t.getAttribute(`src`)===e.url||e.wrapper?.offsetWidth<=0||e.wrapper?.offsetHeight<=0||(e.hydrateFrameId||=requestAnimationFrame(()=>{if(e.hydrateFrameId=null,!e.url||t.getAttribute(`src`)===e.url)return;let n=Math.round(e.wrapper?.offsetWidth||0),r=Math.round(e.wrapper?.offsetHeight||0);n<=0||r<=0||(t.width=String(n),t.height=String(r),t.src=e.url)})))}};function X(e,t,n){!e||e.style[t]===n||(e.style[t]=n)}var Z=1,gs=6,_s=.25,vs=2,ys=6;function bs(e){let t=Number(e);return Number.isFinite(t)?Math.min(gs,Math.max(Z,Math.round(t*100)/100)):Z}function xs(e,{contentSize:t=0,scale:n=1,viewportSize:r=0}={}){let i=Number(e),a=Number(t),o=Number(n),s=Number(r);if(!Number.isFinite(i)||!Number.isFinite(a)||!Number.isFinite(o)||!Number.isFinite(s))return 0;let c=(a*o-s)/2;return c<=0?0:Math.min(Math.max(i,-c),c)}var Ss=class{constructor({previewElement:e,documentRef:t=document,windowRef:n=window}){this.previewElement=e,this.document=t,this.window=n,this.overlayRoot=null,this.viewport=null,this.imageElement=null,this.zoomLabel=null,this.titleElement=null,this.isOpen=!1,this.scale=Z,this.offsetX=0,this.offsetY=0,this.activePointerId=null,this.dragStartX=0,this.dragStartY=0,this.dragOriginX=0,this.dragOriginY=0,this.didDrag=!1,this.resetButton=null,this.handlePreviewClick=e=>{let t=e.target;if(!(t instanceof this.window.Element))return;let n=t.closest(`img`);!n||!this.previewElement?.contains(n)||n.closest(`[data-video-overlay-root="true"], [data-excalidraw-overlay-root="true"]`)||(e.preventDefault(),e.stopImmediatePropagation?.(),this.openFromImage(n))},this.handleKeyDown=e=>{if(this.isOpen){if(e.key===`Escape`){e.preventDefault(),this.close();return}if(e.key===`+`||e.key===`=`){e.preventDefault(),this.zoomBy(_s);return}if(e.key===`-`){e.preventDefault(),this.zoomBy(-_s);return}e.key===`0`&&(e.preventDefault(),this.resetView())}},this.handleWindowResize=()=>{this.isOpen&&(this.clampOffsets(),this.syncTransform())},this.previewElement?.addEventListener(`click`,this.handlePreviewClick),this.document.addEventListener(`keydown`,this.handleKeyDown),this.window.addEventListener(`resize`,this.handleWindowResize)}destroy(){this.previewElement?.removeEventListener(`click`,this.handlePreviewClick),this.document.removeEventListener(`keydown`,this.handleKeyDown),this.window.removeEventListener(`resize`,this.handleWindowResize),this.close(),this.overlayRoot?.remove(),this.overlayRoot=null,this.viewport=null,this.imageElement=null,this.zoomLabel=null,this.titleElement=null,this.resetButton=null}openFromImage(e){let t=e?.currentSrc||e?.getAttribute?.(`src`)||``;return t?(this.ensureOverlayRoot(),this.resetView(),this.titleElement.textContent=e.getAttribute(`alt`)||`Image preview`,this.imageElement.src=t,this.imageElement.alt=e.getAttribute(`alt`)||``,this.overlayRoot.hidden=!1,this.isOpen=!0,this.document.body.classList.add(`image-lightbox-open`),this.syncTransform(),this.overlayRoot.focus?.(),!0):!1}close(){!this.isOpen&&!this.overlayRoot||(this.activePointerId=null,this.didDrag=!1,this.viewport?.classList?.remove(`is-dragging`),this.overlayRoot&&(this.overlayRoot.hidden=!0),this.isOpen=!1,this.document.body.classList.remove(`image-lightbox-open`))}resetView(){this.scale=Z,this.offsetX=0,this.offsetY=0,this.syncTransform()}zoomBy(e){this.setScale(this.scale+e)}setScale(e){this.scale=bs(e),this.clampOffsets(),this.syncTransform()}clampOffsets(){if(!this.viewport||!this.imageElement){this.offsetX=0,this.offsetY=0;return}this.offsetX=xs(this.offsetX,{contentSize:this.imageElement.offsetWidth||0,scale:this.scale,viewportSize:this.viewport.clientWidth||0}),this.offsetY=xs(this.offsetY,{contentSize:this.imageElement.offsetHeight||0,scale:this.scale,viewportSize:this.viewport.clientHeight||0})}syncTransform(){this.imageElement&&(this.imageElement.style.transform=`translate3d(${this.offsetX}px, ${this.offsetY}px, 0) scale(${this.scale})`,this.imageElement.style.cursor=this.scale>Z?`grab`:`zoom-in`,this.zoomLabel&&(this.zoomLabel.textContent=`${Math.round(this.scale*100)}%`),this.resetButton&&(this.resetButton.disabled=this.scale<=Z&&this.offsetX===0&&this.offsetY===0))}ensureOverlayRoot(){if(this.overlayRoot?.isConnected&&this.overlayRoot.parentElement===this.document.body)return this.overlayRoot;let e=this.document.createElement(`div`);e.className=`image-lightbox-root`,e.dataset.imageLightboxRoot=`true`,e.hidden=!0,e.tabIndex=-1;let t=this.document.createElement(`button`);t.className=`image-lightbox-backdrop`,t.type=`button`,t.setAttribute(`aria-label`,`Close image preview`),t.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),this.close()});let n=this.document.createElement(`div`);n.className=`image-lightbox-shell`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-label`,`Image preview`),n.addEventListener(`click`,e=>e.stopPropagation()),n.addEventListener(`pointerdown`,e=>e.stopPropagation());let r=this.document.createElement(`div`);r.className=`image-lightbox-toolbar`;let i=this.document.createElement(`div`);i.className=`image-lightbox-title`,i.textContent=`Image preview`;let a=this.document.createElement(`div`);a.className=`image-lightbox-controls`;let o=this.document.createElement(`span`);o.className=`image-lightbox-zoom-label`,o.textContent=`100%`;let s=this.createControlButton(`Reset`,`Reset zoom and position`,()=>this.resetView()),c=this.createControlButton(`Close`,`Close image preview`,()=>this.close());a.append(o,s,c),r.append(i,a);let l=this.document.createElement(`div`);l.className=`image-lightbox-viewport`;let u=this.document.createElement(`img`);u.className=`image-lightbox-image`,u.alt=``,u.addEventListener(`load`,()=>{this.clampOffsets(),this.syncTransform()}),l.addEventListener(`wheel`,e=>{this.isOpen&&(e.preventDefault(),this.zoomBy(e.deltaY<0?_s:-_s))},{passive:!1}),l.addEventListener(`pointerdown`,e=>{!this.isOpen||this.scale<=Z||e.button!==0||(this.activePointerId=e.pointerId,this.dragStartX=e.clientX,this.dragStartY=e.clientY,this.dragOriginX=this.offsetX,this.dragOriginY=this.offsetY,this.didDrag=!1,l.classList.add(`is-dragging`),l.setPointerCapture?.(e.pointerId),e.preventDefault())}),l.addEventListener(`pointermove`,e=>{!this.isOpen||this.activePointerId!==e.pointerId||(!this.didDrag&&(Math.abs(e.clientX-this.dragStartX)>=ys||Math.abs(e.clientY-this.dragStartY)>=ys)&&(this.didDrag=!0),this.offsetX=this.dragOriginX+(e.clientX-this.dragStartX),this.offsetY=this.dragOriginY+(e.clientY-this.dragStartY),this.clampOffsets(),this.syncTransform())});let d=e=>{this.activePointerId===e.pointerId&&(this.activePointerId=null,l.classList.remove(`is-dragging`),l.releasePointerCapture?.(e.pointerId),this.imageElement.style.cursor=this.scale>Z?`grab`:`zoom-in`)};return l.addEventListener(`pointerup`,d),l.addEventListener(`pointercancel`,d),u.addEventListener(`click`,e=>{if(this.isOpen){if(e.preventDefault(),e.stopPropagation(),this.didDrag){this.didDrag=!1;return}this.scale<=Z&&this.setScale(vs)}}),l.appendChild(u),n.append(r,l),e.append(t,n),this.document.body.appendChild(e),this.overlayRoot=e,this.viewport=l,this.imageElement=u,this.zoomLabel=o,this.titleElement=i,this.resetButton=s,this.syncTransform(),e}createControlButton(e,t,n,{className:r=``}={}){let i=this.document.createElement(`button`);return i.className=`image-lightbox-btn ${r}`.trim(),i.type=`button`,i.setAttribute(`aria-label`,t),i.textContent=e,i.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation(),n(e)}),i}},Cs=globalThis,ws=e=>e,Ts=Cs.trustedTypes,Es=Ts?Ts.createPolicy(`lit-html`,{createHTML:e=>e}):void 0,Ds=`$lit$`,Q=`lit$${Math.random().toFixed(9).slice(2)}$`,Os=`?`+Q,ks=`<${Os}>`,As=document,js=()=>As.createComment(``),Ms=e=>e===null||typeof e!=`object`&&typeof e!=`function`,Ns=Array.isArray,Ps=e=>Ns(e)||typeof e?.[Symbol.iterator]==`function`,Fs=`[
643
+ \f\r]`,Is=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Ls=/-->/g,Rs=/>/g,zs=RegExp(`>|${Fs}(?:([^\\s"'>=/]+)(${Fs}*=${Fs}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,`g`),Bs=/'/g,Vs=/"/g,Hs=/^(?:script|style|textarea|title)$/i,Us=(e=>(t,...n)=>({_$litType$:e,strings:t,values:n}))(1),Ws=Symbol.for(`lit-noChange`),$=Symbol.for(`lit-nothing`),Gs=new WeakMap,Ks=As.createTreeWalker(As,129);function qs(e,t){if(!Ns(e)||!e.hasOwnProperty(`raw`))throw Error(`invalid template strings array`);return Es===void 0?t:Es.createHTML(t)}var Js=(e,t)=>{let n=e.length-1,r=[],i,a=t===2?`<svg>`:t===3?`<math>`:``,o=Is;for(let t=0;t<n;t++){let n=e[t],s,c,l=-1,u=0;for(;u<n.length&&(o.lastIndex=u,c=o.exec(n),c!==null);)u=o.lastIndex,o===Is?c[1]===`!--`?o=Ls:c[1]===void 0?c[2]===void 0?c[3]!==void 0&&(o=zs):(Hs.test(c[2])&&(i=RegExp(`</`+c[2],`g`)),o=zs):o=Rs:o===zs?c[0]===`>`?(o=i??Is,l=-1):c[1]===void 0?l=-2:(l=o.lastIndex-c[2].length,s=c[1],o=c[3]===void 0?zs:c[3]===`"`?Vs:Bs):o===Vs||o===Bs?o=zs:o===Ls||o===Rs?o=Is:(o=zs,i=void 0);let d=o===zs&&e[t+1].startsWith(`/>`)?` `:``;a+=o===Is?n+ks:l>=0?(r.push(s),n.slice(0,l)+Ds+n.slice(l)+Q+d):n+Q+(l===-2?t:d)}return[qs(e,a+(e[n]||`<?>`)+(t===2?`</svg>`:t===3?`</math>`:``)),r]},Ys=class e{constructor({strings:t,_$litType$:n},r){let i;this.parts=[];let a=0,o=0,s=t.length-1,c=this.parts,[l,u]=Js(t,n);if(this.el=e.createElement(l,r),Ks.currentNode=this.el.content,n===2||n===3){let e=this.el.content.firstChild;e.replaceWith(...e.childNodes)}for(;(i=Ks.nextNode())!==null&&c.length<s;){if(i.nodeType===1){if(i.hasAttributes())for(let e of i.getAttributeNames())if(e.endsWith(Ds)){let t=u[o++],n=i.getAttribute(e).split(Q),r=/([.?@])?(.*)/.exec(t);c.push({type:1,index:a,name:r[2],strings:n,ctor:r[1]===`.`?ec:r[1]===`?`?tc:r[1]===`@`?nc:$s}),i.removeAttribute(e)}else e.startsWith(Q)&&(c.push({type:6,index:a}),i.removeAttribute(e));if(Hs.test(i.tagName)){let e=i.textContent.split(Q),t=e.length-1;if(t>0){i.textContent=Ts?Ts.emptyScript:``;for(let n=0;n<t;n++)i.append(e[n],js()),Ks.nextNode(),c.push({type:2,index:++a});i.append(e[t],js())}}}else if(i.nodeType===8)if(i.data===Os)c.push({type:2,index:a});else{let e=-1;for(;(e=i.data.indexOf(Q,e+1))!==-1;)c.push({type:7,index:a}),e+=Q.length-1}a++}}static createElement(e,t){let n=As.createElement(`template`);return n.innerHTML=e,n}};function Xs(e,t,n=e,r){if(t===Ws)return t;let i=r===void 0?n._$Cl:n._$Co?.[r],a=Ms(t)?void 0:t._$litDirective$;return i?.constructor!==a&&(i?._$AO?.(!1),a===void 0?i=void 0:(i=new a(e),i._$AT(e,n,r)),r===void 0?n._$Cl=i:(n._$Co??=[])[r]=i),i!==void 0&&(t=Xs(e,i._$AS(e,t.values),i,r)),t}var Zs=class{constructor(e,t){this._$AV=[],this._$AN=void 0,this._$AD=e,this._$AM=t}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(e){let{el:{content:t},parts:n}=this._$AD,r=(e?.creationScope??As).importNode(t,!0);Ks.currentNode=r;let i=Ks.nextNode(),a=0,o=0,s=n[0];for(;s!==void 0;){if(a===s.index){let t;s.type===2?t=new Qs(i,i.nextSibling,this,e):s.type===1?t=new s.ctor(i,s.name,s.strings,this,e):s.type===6&&(t=new rc(i,this,e)),this._$AV.push(t),s=n[++o]}a!==s?.index&&(i=Ks.nextNode(),a++)}return Ks.currentNode=As,r}p(e){let t=0;for(let n of this._$AV)n!==void 0&&(n.strings===void 0?n._$AI(e[t]):(n._$AI(e,n,t),t+=n.strings.length-2)),t++}},Qs=class e{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(e,t,n,r){this.type=2,this._$AH=$,this._$AN=void 0,this._$AA=e,this._$AB=t,this._$AM=n,this.options=r,this._$Cv=r?.isConnected??!0}get parentNode(){let e=this._$AA.parentNode,t=this._$AM;return t!==void 0&&e?.nodeType===11&&(e=t.parentNode),e}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(e,t=this){e=Xs(this,e,t),Ms(e)?e===$||e==null||e===``?(this._$AH!==$&&this._$AR(),this._$AH=$):e!==this._$AH&&e!==Ws&&this._(e):e._$litType$===void 0?e.nodeType===void 0?Ps(e)?this.k(e):this._(e):this.T(e):this.$(e)}O(e){return this._$AA.parentNode.insertBefore(e,this._$AB)}T(e){this._$AH!==e&&(this._$AR(),this._$AH=this.O(e))}_(e){this._$AH!==$&&Ms(this._$AH)?this._$AA.nextSibling.data=e:this.T(As.createTextNode(e)),this._$AH=e}$(e){let{values:t,_$litType$:n}=e,r=typeof n==`number`?this._$AC(e):(n.el===void 0&&(n.el=Ys.createElement(qs(n.h,n.h[0]),this.options)),n);if(this._$AH?._$AD===r)this._$AH.p(t);else{let e=new Zs(r,this),n=e.u(this.options);e.p(t),this.T(n),this._$AH=e}}_$AC(e){let t=Gs.get(e.strings);return t===void 0&&Gs.set(e.strings,t=new Ys(e)),t}k(t){Ns(this._$AH)||(this._$AH=[],this._$AR());let n=this._$AH,r,i=0;for(let a of t)i===n.length?n.push(r=new e(this.O(js()),this.O(js()),this,this.options)):r=n[i],r._$AI(a),i++;i<n.length&&(this._$AR(r&&r._$AB.nextSibling,i),n.length=i)}_$AR(e=this._$AA.nextSibling,t){for(this._$AP?.(!1,!0,t);e!==this._$AB;){let t=ws(e).nextSibling;ws(e).remove(),e=t}}setConnected(e){this._$AM===void 0&&(this._$Cv=e,this._$AP?.(e))}},$s=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(e,t,n,r,i){this.type=1,this._$AH=$,this._$AN=void 0,this.element=e,this.name=t,this._$AM=r,this.options=i,n.length>2||n[0]!==``||n[1]!==``?(this._$AH=Array(n.length-1).fill(new String),this.strings=n):this._$AH=$}_$AI(e,t=this,n,r){let i=this.strings,a=!1;if(i===void 0)e=Xs(this,e,t,0),a=!Ms(e)||e!==this._$AH&&e!==Ws,a&&(this._$AH=e);else{let r=e,o,s;for(e=i[0],o=0;o<i.length-1;o++)s=Xs(this,r[n+o],t,o),s===Ws&&(s=this._$AH[o]),a||=!Ms(s)||s!==this._$AH[o],s===$?e=$:e!==$&&(e+=(s??``)+i[o+1]),this._$AH[o]=s}a&&!r&&this.j(e)}j(e){e===$?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,e??``)}},ec=class extends $s{constructor(){super(...arguments),this.type=3}j(e){this.element[this.name]=e===$?void 0:e}},tc=class extends $s{constructor(){super(...arguments),this.type=4}j(e){this.element.toggleAttribute(this.name,!!e&&e!==$)}},nc=class extends $s{constructor(e,t,n,r,i){super(e,t,n,r,i),this.type=5}_$AI(e,t=this){if((e=Xs(this,e,t,0)??$)===Ws)return;let n=this._$AH,r=e===$&&n!==$||e.capture!==n.capture||e.once!==n.once||e.passive!==n.passive,i=e!==$&&(n===$||r);r&&this.element.removeEventListener(this.name,this,n),i&&this.element.addEventListener(this.name,this,e),this._$AH=e}handleEvent(e){typeof this._$AH==`function`?this._$AH.call(this.options?.host??this.element,e):this._$AH.handleEvent(e)}},rc=class{constructor(e,t,n){this.element=e,this.type=6,this._$AN=void 0,this._$AM=t,this.options=n}get _$AU(){return this._$AM._$AU}_$AI(e){Xs(this,e)}},ic=Cs.litHtmlPolyfillSupport;ic?.(Ys,Qs),(Cs.litHtmlVersions??=[]).push(`3.3.2`);var ac=(e,t,n)=>{let r=n?.renderBefore??t,i=r._$litPart$;if(i===void 0){let e=n?.renderBefore??null;r._$litPart$=i=new Qs(t.insertBefore(js(),e),e,void 0,n??{})}return i._$AI(e),i};function oc(e={}){let{tone:t=`accent`,count:n=!1,hidden:r=!1,extra:i=[]}=e;return K(`ui-pill-badge`,t&&`ui-pill-badge--${t}`,{"ui-pill-badge--count":n,hidden:r},i)}function sc(){return Us`
626
644
  <a href="#editorContainer" class="sr-only skip-link">Skip to editor</a>
627
645
 
628
646
  <div class="app-shell">
@@ -638,7 +656,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
638
656
  <span class="sidebar-title">CollabMD</span>
639
657
  </div>
640
658
  <div class="sidebar-actions">
641
- <button class=${ai({extra:`sidebar-close-btn`})} id="sidebarClose" aria-label="Close sidebar" title="Close sidebar">
659
+ <button class=${Ei({extra:`sidebar-close-btn`})} id="sidebarClose" aria-label="Close sidebar" title="Close sidebar">
642
660
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
643
661
  <line x1="18" y1="6" x2="6" y2="18"></line>
644
662
  <line x1="6" y1="6" x2="18" y2="18"></line>
@@ -646,7 +664,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
646
664
  </button>
647
665
  <div class="sidebar-create-shell">
648
666
  <button
649
- class=${G({variant:`secondary`,size:`compact`,pill:!0,extra:`sidebar-create-btn`})}
667
+ class=${q({variant:`secondary`,size:`compact`,pill:!0,extra:`sidebar-create-btn`})}
650
668
  id="sidebarCreateBtn"
651
669
  aria-label="Create"
652
670
  aria-expanded="false"
@@ -660,7 +678,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
660
678
  <span class="sidebar-create-btn-label">Create</span>
661
679
  </button>
662
680
  </div>
663
- <button class=${ai()} id="refreshFilesBtn" aria-label="Refresh" title="Refresh file list">
681
+ <button class=${Ei()} id="refreshFilesBtn" aria-label="Refresh" title="Refresh file list">
664
682
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
665
683
  <polyline points="23 4 23 10 17 10"></polyline>
666
684
  <path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"></path>
@@ -688,7 +706,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
688
706
  <div class="sidebar-search" id="fileSearch">
689
707
  <input
690
708
  type="text"
691
- class=${K({extra:`sidebar-search-input`})}
709
+ class=${J({extra:`sidebar-search-input`})}
692
710
  id="fileSearchInput"
693
711
  placeholder="Search files..."
694
712
  autocomplete="off"
@@ -699,7 +717,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
699
717
  <div class="sidebar-search hidden" id="gitSearch">
700
718
  <input
701
719
  type="text"
702
- class=${K({extra:`sidebar-search-input`})}
720
+ class=${J({extra:`sidebar-search-input`})}
703
721
  id="gitSearchInput"
704
722
  placeholder="Search changes..."
705
723
  autocomplete="off"
@@ -714,7 +732,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
714
732
  <main class="main-area" id="mainContent">
715
733
  <header class="toolbar" role="banner">
716
734
  <div class="toolbar-left">
717
- <button class=${G({variant:`ghost`,toolbar:!0})} id="sidebarToggle" aria-label="Toggle sidebar" title="Toggle sidebar">
735
+ <button class=${q({variant:`ghost`,toolbar:!0})} id="sidebarToggle" aria-label="Toggle sidebar" title="Toggle sidebar">
718
736
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
719
737
  <line x1="3" y1="6" x2="21" y2="6"></line>
720
738
  <line x1="3" y1="12" x2="21" y2="12"></line>
@@ -723,21 +741,21 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
723
741
  </button>
724
742
  <div class="toolbar-room-info">
725
743
  <span class="toolbar-room-name" id="activeFileName">CollabMD</span>
726
- <span class=${Ls({tone:`accent`,extra:`toolbar-badge`})} id="userCount"></span>
727
- <span class=${Ls({tone:`accent`,hidden:!0,extra:`toolbar-badge`})} id="toolbarDiffBadge">Diff</span>
728
- <span class=${Ls({tone:`accent`,hidden:!0,extra:`toolbar-badge`})} id="gitOperationStatus" aria-live="polite" aria-atomic="true"></span>
744
+ <span class=${oc({tone:`accent`,extra:`toolbar-badge`})} id="userCount"></span>
745
+ <span class=${oc({tone:`accent`,hidden:!0,extra:`toolbar-badge`})} id="toolbarDiffBadge">Diff</span>
746
+ <span class=${oc({tone:`accent`,hidden:!0,extra:`toolbar-badge`})} id="gitOperationStatus" aria-live="polite" aria-atomic="true"></span>
729
747
  </div>
730
748
  </div>
731
749
 
732
750
  <div class="toolbar-center" id="toolbarCenter">
733
- <div class=${uo({extra:`view-toggle`})} role="group" aria-label="View mode">
734
- <button class=${q({active:!0,extra:`view-btn`})} data-view="split" aria-label="Split view" aria-pressed="true" title="Split view">
751
+ <div class=${Mo({extra:`view-toggle`})} role="group" aria-label="View mode">
752
+ <button class=${Y({active:!0,extra:`view-btn`})} data-view="split" aria-label="Split view" aria-pressed="true" title="Split view">
735
753
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
736
754
  <rect x="3" y="3" width="18" height="18" rx="2"></rect>
737
755
  <line x1="12" y1="3" x2="12" y2="21"></line>
738
756
  </svg>
739
757
  </button>
740
- <button class=${q({extra:`view-btn`})} data-view="editor" aria-label="Editor only" aria-pressed="false" title="Editor only">
758
+ <button class=${Y({extra:`view-btn`})} data-view="editor" aria-label="Editor only" aria-pressed="false" title="Editor only">
741
759
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
742
760
  <rect x="3" y="3" width="18" height="18" rx="2"></rect>
743
761
  <line x1="8" y1="8" x2="16" y2="8"></line>
@@ -745,7 +763,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
745
763
  <line x1="8" y1="16" x2="12" y2="16"></line>
746
764
  </svg>
747
765
  </button>
748
- <button class=${q({extra:`view-btn`})} data-view="preview" aria-label="Preview only" aria-pressed="false" title="Preview only">
766
+ <button class=${Y({extra:`view-btn`})} data-view="preview" aria-label="Preview only" aria-pressed="false" title="Preview only">
749
767
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
750
768
  <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
751
769
  <circle cx="12" cy="12" r="3"></circle>
@@ -755,7 +773,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
755
773
  </div>
756
774
 
757
775
  <div class="toolbar-right">
758
- <button class=${G({variant:`ghost`,toolbar:!0,extra:`mobile-view-toggle`})} id="mobileViewToggle" aria-label="Toggle editor/preview" title="Toggle view">
776
+ <button class=${q({variant:`ghost`,toolbar:!0,extra:`mobile-view-toggle`})} id="mobileViewToggle" aria-label="Toggle editor/preview" title="Toggle view">
759
777
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
760
778
  <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
761
779
  <circle cx="12" cy="12" r="3"></circle>
@@ -766,12 +784,12 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
766
784
  <div class="user-avatars toolbar-presence-cluster" id="userAvatars"></div>
767
785
 
768
786
  <div class="chat-container" id="chatContainer">
769
- <button class=${G({variant:`ghost`,toolbar:!0,extra:`chat-toggle-btn`})} id="chatToggleBtn" aria-label="Open team chat" aria-expanded="false" title="Team chat">
787
+ <button class=${q({variant:`ghost`,toolbar:!0,extra:`chat-toggle-btn`})} id="chatToggleBtn" aria-label="Open team chat" aria-expanded="false" title="Team chat">
770
788
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
771
789
  <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>
772
790
  </svg>
773
791
  <span class="ui-toolbar-button-label">Chat</span>
774
- <span class=${Ls({tone:`solid`,count:!0,hidden:!0,extra:`chat-toggle-badge`})} id="chatToggleBadge">0</span>
792
+ <span class=${oc({tone:`solid`,count:!0,hidden:!0,extra:`chat-toggle-badge`})} id="chatToggleBadge">0</span>
775
793
  </button>
776
794
  <div class="toast-container chat-toast-container" id="chatToastContainer" aria-live="polite" aria-atomic="true"></div>
777
795
 
@@ -782,7 +800,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
782
800
  <p class="chat-panel-status" id="chatStatus">Syncing...</p>
783
801
  </div>
784
802
  <button
785
- class=${G({variant:`secondary`,size:`compact`,pill:!0,surface:!0,action:!0,extra:`chat-notification-action`})}
803
+ class=${q({variant:`secondary`,size:`compact`,pill:!0,surface:!0,action:!0,extra:`chat-notification-action`})}
786
804
  id="chatNotificationBtn"
787
805
  type="button"
788
806
  >
@@ -798,7 +816,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
798
816
  <form class="chat-form" id="chatForm">
799
817
  <input
800
818
  type="text"
801
- class=${K({extra:`chat-input`})}
819
+ class=${J({extra:`chat-input`})}
802
820
  id="chatInput"
803
821
  placeholder="Send a quick update..."
804
822
  autocomplete="off"
@@ -806,13 +824,13 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
806
824
  maxlength="280"
807
825
  aria-label="Team chat message"
808
826
  >
809
- <button type="submit" class=${G({variant:`primary`,extra:`chat-send-btn`})}>Send</button>
827
+ <button type="submit" class=${q({variant:`primary`,extra:`chat-send-btn`})}>Send</button>
810
828
  </form>
811
829
  </section>
812
830
  </div>
813
831
 
814
832
  <button
815
- class=${G({variant:`ghost`,toolbar:!0,extra:`toolbar-overflow-toggle`})}
833
+ class=${q({variant:`ghost`,toolbar:!0,extra:`toolbar-overflow-toggle`})}
816
834
  id="toolbarOverflowToggle"
817
835
  aria-label="Open more actions"
818
836
  aria-expanded="false"
@@ -826,7 +844,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
826
844
  </button>
827
845
 
828
846
  <div class="toolbar-overflow-menu" id="toolbarOverflowMenu">
829
- <button class=${G({variant:`ghost`,toolbar:!0,extra:`hidden`})} id="fileHistoryBtn" aria-label="Open file history" title="View file history">
847
+ <button class=${q({variant:`ghost`,toolbar:!0,extra:`hidden`})} id="fileHistoryBtn" aria-label="Open file history" title="View file history">
830
848
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
831
849
  <path d="M3 12a9 9 0 1 0 3-6.7"></path>
832
850
  <path d="M3 4v5h5"></path>
@@ -835,7 +853,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
835
853
  <span class="ui-toolbar-button-label" id="fileHistoryBtnLabel">History</span>
836
854
  </button>
837
855
 
838
- <button class=${G({variant:`ghost`,toolbar:!0,extra:`ui-toolbar-button--name`})} id="editNameBtn" aria-label="Set name. Change display name" title="Change display name">
856
+ <button class=${q({variant:`ghost`,toolbar:!0,extra:`ui-toolbar-button--name`})} id="editNameBtn" aria-label="Set name. Change display name" title="Change display name">
839
857
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
840
858
  <path d="M12 20h9"></path>
841
859
  <path d="M16.5 3.5a2.12 2.12 0 1 1 3 3L7 19l-4 1 1-4Z"></path>
@@ -843,7 +861,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
843
861
  <span class="ui-toolbar-button-label ui-toolbar-button-text" id="currentUserName">Set name</span>
844
862
  </button>
845
863
 
846
- <button class=${G({variant:`ghost`,toolbar:!0})} id="shareBtn" aria-label="Share. Copy link" title="Share link">
864
+ <button class=${q({variant:`ghost`,toolbar:!0})} id="shareBtn" aria-label="Share. Copy link" title="Share link">
847
865
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
848
866
  <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path>
849
867
  <path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
@@ -851,7 +869,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
851
869
  <span class="ui-toolbar-button-label">Share</span>
852
870
  </button>
853
871
 
854
- <button class=${G({variant:`ghost`,toolbar:!0,extra:`toolbar-search-files-btn`})} id="searchFilesBtn" aria-label="Search files" title="Search files">
872
+ <button class=${q({variant:`ghost`,toolbar:!0,extra:`toolbar-search-files-btn`})} id="searchFilesBtn" aria-label="Search files" title="Search files">
855
873
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
856
874
  <circle cx="11" cy="11" r="7"></circle>
857
875
  <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
@@ -860,7 +878,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
860
878
  </button>
861
879
 
862
880
  <details class="toolbar-overflow-group hidden" id="exportMenuGroup">
863
- <summary class=${G({variant:`ghost`,toolbar:!0,extra:`toolbar-overflow-group-toggle`})} aria-label="Export options" title="Export">
881
+ <summary class=${q({variant:`ghost`,toolbar:!0,extra:`toolbar-overflow-group-toggle`})} aria-label="Export options" title="Export">
864
882
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
865
883
  <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
866
884
  <polyline points="14 2 14 8 20 8"></polyline>
@@ -870,7 +888,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
870
888
  <span class="ui-toolbar-button-label">Export</span>
871
889
  </summary>
872
890
  <div class="toolbar-overflow-submenu">
873
- <button class=${G({variant:`ghost`,toolbar:!0})} id="exportDocxBtn" aria-label="Export DOCX" title="Export DOCX">
891
+ <button class=${q({variant:`ghost`,toolbar:!0})} id="exportDocxBtn" aria-label="Export DOCX" title="Export DOCX">
874
892
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
875
893
  <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
876
894
  <polyline points="14 2 14 8 20 8"></polyline>
@@ -878,7 +896,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
878
896
  </svg>
879
897
  <span class="ui-toolbar-button-label">Export DOCX</span>
880
898
  </button>
881
- <button class=${G({variant:`ghost`,toolbar:!0})} id="exportPdfBtn" aria-label="Print or save PDF" title="Print / Save PDF">
899
+ <button class=${q({variant:`ghost`,toolbar:!0})} id="exportPdfBtn" aria-label="Print or save PDF" title="Print / Save PDF">
882
900
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
883
901
  <path d="M6 9V2h12v7"></path>
884
902
  <path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"></path>
@@ -889,7 +907,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
889
907
  </div>
890
908
  </details>
891
909
 
892
- <button class=${G({variant:`ghost`,toolbar:!0,extra:`toolbar-theme-button`})} id="themeToggleBtn" data-theme-toggle aria-label="Toggle theme" title="Toggle theme">
910
+ <button class=${q({variant:`ghost`,toolbar:!0,extra:`toolbar-theme-button`})} id="themeToggleBtn" data-theme-toggle aria-label="Toggle theme" title="Toggle theme">
893
911
  <span class="toolbar-theme-icon" data-theme-toggle-icon aria-hidden="true">
894
912
  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
895
913
  <circle cx="12" cy="12" r="5"></circle>
@@ -897,7 +915,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
897
915
  </svg>
898
916
  </span>
899
917
  <span class="ui-toolbar-button-label">Theme</span>
900
- <span class=${Ls({tone:`muted`,extra:`toolbar-theme-state`})} data-theme-toggle-state>Dark</span>
918
+ <span class=${oc({tone:`muted`,extra:`toolbar-theme-state`})} data-theme-toggle-state>Dark</span>
901
919
  </button>
902
920
  </div>
903
921
  </div>
@@ -916,14 +934,14 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
916
934
  <h2 class="empty-state-title">Welcome to CollabMD</h2>
917
935
  <p class="empty-state-desc">Open a file from the sidebar, or get started quickly:</p>
918
936
  <div class="empty-state-actions">
919
- <button class=${G({variant:`secondary`,extra:`empty-state-btn`})} id="emptyStateNewFileBtn">
937
+ <button class=${q({variant:`secondary`,extra:`empty-state-btn`})} id="emptyStateNewFileBtn">
920
938
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
921
939
  <line x1="12" y1="5" x2="12" y2="19"></line>
922
940
  <line x1="5" y1="12" x2="19" y2="12"></line>
923
941
  </svg>
924
942
  Create
925
943
  </button>
926
- <button class=${G({variant:`secondary`,extra:`empty-state-btn`})} id="emptyStateSearchBtn">
944
+ <button class=${q({variant:`secondary`,extra:`empty-state-btn`})} id="emptyStateSearchBtn">
927
945
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
928
946
  <circle cx="11" cy="11" r="8"></circle>
929
947
  <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
@@ -944,20 +962,20 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
944
962
  <span class="pane-label-meta" id="lineInfo">Ln 1, Col 1</span>
945
963
  </div>
946
964
  <div class="pane-header-actions">
947
- <button class=${G({variant:`ghost`,size:`compact`,toggle:!0,extra:`mobile-editor-find-btn`})} id="editorFindBtn" aria-label="Find in file" title="Find in file">
965
+ <button class=${q({variant:`ghost`,size:`compact`,toggle:!0,extra:`mobile-editor-find-btn`})} id="editorFindBtn" aria-label="Find in file" title="Find in file">
948
966
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
949
967
  <circle cx="11" cy="11" r="7"></circle>
950
968
  <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
951
969
  </svg>
952
970
  <span class="ui-action-label">Find</span>
953
971
  </button>
954
- <button class=${G({variant:`ghost`,size:`compact`,toggle:!0,extra:`hidden`})} id="commentSelectionBtn" aria-label="Comment current line or selection" title="Comment current line or selection">
972
+ <button class=${q({variant:`ghost`,size:`compact`,toggle:!0,extra:`hidden`})} id="commentSelectionBtn" aria-label="Comment current line or selection" title="Comment current line or selection">
955
973
  <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">
956
974
  <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>
957
975
  </svg>
958
976
  <span class="ui-action-label">Comment</span>
959
977
  </button>
960
- <button class=${G({variant:`ghost`,size:`compact`,toggle:!0})} id="toggleWrapBtn" aria-label="Disable line wrap" title="Disable line wrap">
978
+ <button class=${q({variant:`ghost`,size:`compact`,toggle:!0})} id="toggleWrapBtn" aria-label="Disable line wrap" title="Disable line wrap">
961
979
  <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">
962
980
  <path d="M3 6h14a4 4 0 1 1 0 8H9"></path>
963
981
  <path d="m9 10-4 4 4 4"></path>
@@ -987,13 +1005,25 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
987
1005
  <div class="pane-header">
988
1006
  <span class="pane-label">Preview</span>
989
1007
  <div class="pane-header-actions">
990
- <button class=${G({variant:`ghost`,size:`compact`,toggle:!0,extra:`hidden`})} id="commentsToggle" aria-label="Toggle comments" title="Toggle comments">
1008
+ <div id="backlinksHeaderPanel" class="backlinks-panel backlinks-panel-header hidden" data-backlinks-variant="header">
1009
+ <button type="button" class="backlinks-header" aria-expanded="false">
1010
+ <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">
1011
+ <polyline points="9 18 15 12 9 6"></polyline>
1012
+ </svg>
1013
+ <span class="backlinks-toggle">0 Linked Mentions</span>
1014
+ <span class="backlinks-count"></span>
1015
+ </button>
1016
+ <div class="backlinks-body" aria-hidden="true" inert>
1017
+ <div class="backlinks-list"></div>
1018
+ </div>
1019
+ </div>
1020
+ <button class=${q({variant:`ghost`,size:`compact`,toggle:!0,extra:`hidden`})} id="commentsToggle" aria-label="Toggle comments" title="Toggle comments">
991
1021
  <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">
992
1022
  <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>
993
1023
  </svg>
994
1024
  <span class="ui-action-label">Comments</span>
995
1025
  </button>
996
- <button class=${G({variant:`ghost`,size:`compact`,toggle:!0})} id="outlineToggle" aria-label="Toggle outline" title="Toggle outline">
1026
+ <button class=${q({variant:`ghost`,size:`compact`,toggle:!0})} id="outlineToggle" aria-label="Toggle outline" title="Toggle outline">
997
1027
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
998
1028
  <line x1="3" y1="6" x2="21" y2="6"></line>
999
1029
  <line x1="3" y1="12" x2="15" y2="12"></line>
@@ -1056,33 +1086,33 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
1056
1086
  <div class="diff-toolbar">
1057
1087
  <div class="diff-toolbar-left">
1058
1088
  <div class="diff-file-nav">
1059
- <button class=${ai({action:!0})} id="diffPrevBtn" type="button" disabled aria-label="Previous changed file">
1089
+ <button class=${Ei({action:!0})} id="diffPrevBtn" type="button" disabled aria-label="Previous changed file">
1060
1090
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
1061
1091
  <polyline points="15 18 9 12 15 6"></polyline>
1062
1092
  </svg>
1063
1093
  </button>
1064
1094
  <span class="diff-file-indicator" id="diffFileIndicator">0 / 0 files</span>
1065
- <button class=${ai({action:!0})} id="diffNextBtn" type="button" disabled aria-label="Next changed file">
1095
+ <button class=${Ei({action:!0})} id="diffNextBtn" type="button" disabled aria-label="Next changed file">
1066
1096
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
1067
1097
  <polyline points="9 18 15 12 9 6"></polyline>
1068
1098
  </svg>
1069
1099
  </button>
1070
1100
  </div>
1071
1101
  <div class="diff-toolbar-actions">
1072
- <button class=${G({variant:`secondary`,action:!0,surface:!0,wide:!0,hidden:!0,extra:`diff-back-btn`})} id="diffBackToHistoryBtn" type="button">
1102
+ <button class=${q({variant:`secondary`,action:!0,surface:!0,wide:!0,hidden:!0,extra:`diff-back-btn`})} id="diffBackToHistoryBtn" type="button">
1073
1103
  Back to History
1074
1104
  </button>
1075
1105
  <div class="diff-toolbar-actions-group diff-toolbar-actions-group-git" id="diffGitActionsGroup" role="group" aria-label="Git file actions">
1076
- <button class=${G({variant:`secondary`,action:!0,surface:!0,wide:!0})} id="diffPrimaryActionBtn" type="button" disabled>
1106
+ <button class=${q({variant:`secondary`,action:!0,surface:!0,wide:!0})} id="diffPrimaryActionBtn" type="button" disabled>
1077
1107
  Stage
1078
1108
  </button>
1079
- <button class=${G({variant:`primary`,action:!0,wide:!0})} id="diffCommitBtn" type="button" disabled>
1109
+ <button class=${q({variant:`primary`,action:!0,wide:!0})} id="diffCommitBtn" type="button" disabled>
1080
1110
  Commit Staged
1081
1111
  </button>
1082
1112
  </div>
1083
1113
  <span class="diff-toolbar-actions-divider" id="diffToolbarDivider" aria-hidden="true"></span>
1084
1114
  <div class="diff-toolbar-actions-group" id="diffEditorActionsGroup" role="group" aria-label="Navigation actions">
1085
- <button class=${G({variant:`secondary`,action:!0,surface:!0,wide:!0,extra:`diff-open-editor-btn`})} id="diffOpenEditorBtn" type="button" disabled>
1115
+ <button class=${q({variant:`secondary`,action:!0,surface:!0,wide:!0,extra:`diff-open-editor-btn`})} id="diffOpenEditorBtn" type="button" disabled>
1086
1116
  Open in Editor
1087
1117
  </button>
1088
1118
  </div>
@@ -1093,13 +1123,13 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
1093
1123
  <span class="ui-stat-token ui-stat-token--add diff-stats-add">+0</span>
1094
1124
  <span class="ui-stat-token ui-stat-token--del diff-stats-del">-0</span>
1095
1125
  </div>
1096
- <div class=${uo({hidden:!0,extra:`diff-layout-toggle`})} id="diffLayoutToggle" role="group" aria-label="Commit diff layout">
1097
- <button class=${q({extra:`view-btn diff-layout-btn`})} data-diff-layout="stacked" type="button">Stacked</button>
1098
- <button class=${q({active:!0,extra:`view-btn diff-layout-btn`})} data-diff-layout="focused" type="button">Focused</button>
1126
+ <div class=${Mo({hidden:!0,extra:`diff-layout-toggle`})} id="diffLayoutToggle" role="group" aria-label="Commit diff layout">
1127
+ <button class=${Y({extra:`view-btn diff-layout-btn`})} data-diff-layout="stacked" type="button">Stacked</button>
1128
+ <button class=${Y({active:!0,extra:`view-btn diff-layout-btn`})} data-diff-layout="focused" type="button">Focused</button>
1099
1129
  </div>
1100
- <div class=${uo({extra:`diff-mode-toggle`})} role="group" aria-label="Diff view mode">
1101
- <button class=${q({active:!0,extra:`view-btn diff-mode-btn`})} data-diff-mode="unified" type="button">Unified</button>
1102
- <button class=${q({extra:`view-btn diff-mode-btn`})} data-diff-mode="split" type="button">Split</button>
1130
+ <div class=${Mo({extra:`diff-mode-toggle`})} role="group" aria-label="Diff view mode">
1131
+ <button class=${Y({active:!0,extra:`view-btn diff-mode-btn`})} data-diff-mode="unified" type="button">Unified</button>
1132
+ <button class=${Y({extra:`view-btn diff-mode-btn`})} data-diff-mode="split" type="button">Split</button>
1103
1133
  </div>
1104
1134
  </div>
1105
1135
  </div>
@@ -1118,11 +1148,11 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
1118
1148
  </div>
1119
1149
  <label class="app-dialog-field" for="displayNameInput">
1120
1150
  <span class="app-dialog-label">Name</span>
1121
- <input type="text" class=${K()} id="displayNameInput" name="displayName" maxlength="24" autocomplete="nickname" spellcheck="false" required>
1151
+ <input type="text" class=${J()} id="displayNameInput" name="displayName" maxlength="24" autocomplete="nickname" spellcheck="false" required>
1122
1152
  </label>
1123
1153
  <div class="app-dialog-actions">
1124
- <button type="button" class=${G({variant:`secondary`})} id="displayNameCancel">Cancel</button>
1125
- <button type="submit" class=${G({variant:`primary`})} id="displayNameSubmit">Save name</button>
1154
+ <button type="button" class=${q({variant:`secondary`})} id="displayNameCancel">Cancel</button>
1155
+ <button type="submit" class=${q({variant:`primary`})} id="displayNameSubmit">Save name</button>
1126
1156
  </div>
1127
1157
  </form>
1128
1158
  </dialog>
@@ -1135,13 +1165,13 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
1135
1165
  </div>
1136
1166
  <label class="app-dialog-field" id="fileActionField" for="fileActionInput">
1137
1167
  <span class="app-dialog-label" id="fileActionLabel">Path</span>
1138
- <input type="text" class=${K()} id="fileActionInput" name="fileActionValue" autocomplete="off" spellcheck="false" required>
1168
+ <input type="text" class=${J()} id="fileActionInput" name="fileActionValue" autocomplete="off" spellcheck="false" required>
1139
1169
  <span class="app-dialog-hint" id="fileActionHint" hidden></span>
1140
1170
  </label>
1141
1171
  <p class="app-dialog-note" id="fileActionNote" hidden></p>
1142
1172
  <div class="app-dialog-actions">
1143
- <button type="button" class=${G({variant:`secondary`})} id="fileActionCancel">Cancel</button>
1144
- <button type="submit" class=${G({variant:`primary`})} id="fileActionSubmit">Create</button>
1173
+ <button type="button" class=${q({variant:`secondary`})} id="fileActionCancel">Cancel</button>
1174
+ <button type="submit" class=${q({variant:`primary`})} id="fileActionSubmit">Create</button>
1145
1175
  </div>
1146
1176
  </form>
1147
1177
  </dialog>
@@ -1154,11 +1184,11 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
1154
1184
  </div>
1155
1185
  <label class="app-dialog-field" for="gitCommitInput">
1156
1186
  <span class="app-dialog-label">Commit message</span>
1157
- <input type="text" class=${K()} id="gitCommitInput" name="gitCommitMessage" autocomplete="off" spellcheck="true" required>
1187
+ <input type="text" class=${J()} id="gitCommitInput" name="gitCommitMessage" autocomplete="off" spellcheck="true" required>
1158
1188
  </label>
1159
1189
  <div class="app-dialog-actions">
1160
- <button type="button" class=${G({variant:`secondary`})} id="gitCommitCancel">Cancel</button>
1161
- <button type="submit" class=${G({variant:`primary`})} id="gitCommitSubmit">Commit staged changes</button>
1190
+ <button type="button" class=${q({variant:`secondary`})} id="gitCommitCancel">Cancel</button>
1191
+ <button type="submit" class=${q({variant:`primary`})} id="gitCommitSubmit">Commit staged changes</button>
1162
1192
  </div>
1163
1193
  </form>
1164
1194
  </dialog>
@@ -1171,14 +1201,14 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
1171
1201
  </div>
1172
1202
  <div class="app-dialog-field">
1173
1203
  <label class="app-dialog-label" for="gitResetFileName">File</label>
1174
- <input class=${K({extra:`app-dialog-input`})} id="gitResetFileName" type="text" readonly>
1204
+ <input class=${J({extra:`app-dialog-input`})} id="gitResetFileName" type="text" readonly>
1175
1205
  </div>
1176
1206
  <div class="app-dialog-note is-danger">
1177
1207
  Local file content and staged changes for this path will be discarded.
1178
1208
  </div>
1179
1209
  <div class="app-dialog-actions">
1180
- <button class=${G({variant:`secondary`})} id="gitResetCancel" type="button">Cancel</button>
1181
- <button class=${G({variant:`danger`})} id="gitResetSubmit" type="button">Reset File</button>
1210
+ <button class=${q({variant:`secondary`})} id="gitResetCancel" type="button">Cancel</button>
1211
+ <button class=${q({variant:`danger`})} id="gitResetSubmit" type="button">Reset File</button>
1182
1212
  </div>
1183
1213
  </form>
1184
1214
  </dialog>
@@ -1189,7 +1219,7 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
1189
1219
  <h2 class="tab-lock-title" id="tabLockTitle">This vault is active in another tab</h2>
1190
1220
  <p class="tab-lock-copy" id="tabLockCopy">To avoid duplicate presence and chat, only one tab can stay connected at a time. Use the other tab, or take over the session here.</p>
1191
1221
  <div class="tab-lock-actions">
1192
- <button type="button" class=${G({variant:`primary`,size:`lg`})} id="tabLockTakeoverBtn">Take over here</button>
1222
+ <button type="button" class=${q({variant:`primary`,size:`lg`})} id="tabLockTakeoverBtn">Take over here</button>
1193
1223
  </div>
1194
1224
  </div>
1195
1225
  </div>
@@ -1210,4 +1240,4 @@ import{t as e}from"./preload-helper-Bo9GmnuQ.js";import{a as t,i as n,n as r,r a
1210
1240
  <div class="qs-hint" id="quickSwitcherHint">Type to search files</div>
1211
1241
  </div>
1212
1242
  </div>
1213
- `}function zs(e=document){let t=e.getElementById(`appRoot`);if(!t)throw Error(`App shell root element #appRoot is missing.`);return Is(Rs(),t),t}var Bs=Object.freeze({chat:We,comments:Ge,export:ot,git:mt,presence:ht,ui:$n,workspace:er});function Vs(e){let t={};Object.entries(Bs).forEach(([n,r])=>{Object.entries(r).forEach(([r,i])=>{if(typeof i==`function`){if(Object.hasOwn(t,r))throw Error(`CollabMdAppShell feature method "${r}" is declared by both "${t[r]}" and "${n}".`);if(r in e)throw Error(`CollabMdAppShell feature method "${r}" conflicts with an existing app shell member.`);Object.defineProperty(e,r,{configurable:!0,enumerable:!1,value:i.bind(e),writable:!1}),t[r]=n}})}),Object.defineProperty(e,`featureMethodOwners`,{configurable:!1,enumerable:!1,value:Object.freeze(t),writable:!1})}var Hs=class{constructor(){Vs(this),zs(document),this.elements=Ue(document),this.runtimeConfig=O(),this.stateStore=new He,this.navigation=new or,this.preferences=new cr({chatNotificationsKey:`collabmd-chat-notifications-enabled`,lineWrappingKey:`collabmd-editor-line-wrap`,sidebarVisibleKey:`collabmd-sidebar-visible`,userNameKey:`collabmd-user-name`}),this.notifications=new sr,this.vaultApiClient=S,this._session=null,this._hasPromptedForDisplayName=!1,this._backlinkRefreshTimer=null,this._pendingPreviewLayoutSync=!1,this._previewHydrationPaused=!1,this._previewLayoutResizeObserver=null,this._previewLayoutSyncTimer=null,this._reloadPromptShown=!1,this._staticPreviewDocument=null,this.pendingGitResetPath=null,this.chatTimeFormatter=new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}),this.chatNotificationsEnabled=this.preferences.getChatNotificationsEnabled(),this.chatNotificationPermission=this.notifications.getPermission(),this.lobbyChatMessageMaxLength=280,this.quickSwitcher=null,this.quickSwitcherModulePromise=null,this.fileExplorerReadyPromise=Promise.resolve(),this.mobileBreakpointQuery=window.matchMedia(`(max-width: 768px)`),this.pendingWorkspaceRequestIds=new Set,this._fileOpenPerf=null,this.versionMonitor=new dr({currentBuildId:this.runtimeConfig.build?.id,onUpdateAvailable:e=>this.promptForVersionReload(e),runtimeConfig:this.runtimeConfig}),this.lobby=new ar({preferredUserName:this.getStoredUserName(),onChange:e=>this.updateGlobalUsers(e),onChatChange:(e,t)=>this.updateChatMessages(e,t)}),this.workspaceSync=new Er({onTreeChange:(e,t={})=>{let n=this.fileExplorerReady;this.fileExplorer.setTree(e,t),this.fileExplorerReady=!0,!n&&this.isTabActive&&this.handleHashChange()},onWorkspaceEvent:e=>{this.handleIncomingWorkspaceEvent(e)}}),this.toastController=new Ho(this.elements.toastContainer),this.chatToastController=new Ho(this.elements.chatToastContainer),this.fileExplorer=new Ua({mobileBreakpointQuery:this.mobileBreakpointQuery,onFileDelete:()=>this.navigation.navigateToFile(null),onFileSelect:e=>this.handleFileSelection(e,{closeSidebarOnMobile:!0}),pendingWorkspaceRequestIds:this.pendingWorkspaceRequestIds,toastController:this.toastController}),this.gitPanel=new Co({enabled:this.runtimeConfig.gitEnabled!==!1,onCommitStaged:()=>this.openGitCommitDialog(),onOpenPullBackup:e=>e&&this.navigation.navigateToFile(e),onPullBranch:()=>this.pullGitBranch(),onPushBranch:()=>this.pushGitBranch(),onRepoChange:(e,t)=>this.handleGitRepoChange(e,t),onResetFile:(e,{scope:t})=>this.openGitResetDialog(e,{scope:t}),onSelectCommit:(e,{path:t})=>this.handleGitCommitSelection(e,{closeSidebarOnMobile:!0,path:t}),onSelectDiff:(e,{scope:t})=>this.handleGitDiffSelection(e,{closeSidebarOnMobile:!0,scope:t}),onStageFile:(e,{scope:t})=>this.stageGitFile(e,{scope:t}),onUnstageFile:(e,{scope:t})=>this.unstageGitFile(e,{scope:t}),onViewAllDiff:()=>this.handleGitDiffSelection(null,{closeSidebarOnMobile:!0,scope:`all`}),searchInput:this.elements.gitSearchInput,toastController:this.toastController}),this.outlineController=new To({mobileBreakpointQuery:this.mobileBreakpointQuery,onNavigateToHeading:({sourceLine:e})=>{Number.isFinite(e)&&(this.scrollSyncController.suspendSync(250),this.session?.scrollToLine(e,0))},onWillOpen:()=>this.commentUi?.closeDrawer()}),this.videoEmbed=new Jo({previewElement:this.elements.previewContent}),this.imageLightbox=new ts({previewElement:this.elements.previewContent}),this.previewRenderer=new De({getContent:()=>this.getPreviewSource(),getFileList:()=>this.fileExplorer.flatDocumentFiles,getSourceFilePath:()=>this.currentFilePath,onAfterRenderCommit:(e,t)=>{this.recordFileOpenMetric(`preview_committed`,{chars:t?.chars??0,renderVersion:t?.renderVersion??0}),this.videoEmbed.reconcileEmbeds(this.elements.previewContent),this.videoEmbed.syncLayout(),this.drawioEmbed.reconcileEmbeds(this.elements.previewContent),this.drawioEmbed.syncLayout(),this.excalidrawEmbed.reconcileEmbeds(this.elements.previewContent,{isLargeDocument:t.isLargeDocument}),this.excalidrawEmbed.syncLayout(),this.scrollSyncController.setLargeDocumentMode(t.isLargeDocument),this.schedulePreviewLayoutSync({delayMs:0}),this.refreshCommentUiLayout()},onBeforeRenderCommit:()=>{this.videoEmbed.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit()},onPreviewLayoutChange:()=>{this.scrollSyncController.invalidatePreviewBlocks(),this.schedulePreviewLayoutSync({delayMs:0}),this.refreshCommentUiLayout()},onRenderComplete:()=>{this.videoEmbed.syncLayout(),this.drawioEmbed.syncLayout(),this.excalidrawEmbed.syncLayout(),this.schedulePreviewLayoutSync({delayMs:0}),this.refreshCommentUiLayout()},outlineController:this.outlineController,previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent}),this.themeController=new Vo({onChange:e=>this.handleThemeChange(e)}),this.layoutController=new wo({mobileBreakpointQuery:this.mobileBreakpointQuery,onMeasureEditor:()=>this.session?.requestMeasure(),onViewRequest:e=>this.handleLayoutViewRequest(e)}),this.scrollSyncController=new Ro({getEditorLineNumber:()=>this.session?.getTopVisibleLineNumber(.35)??1,onEditorScrollActivityChange:e=>this.handleEditorScrollActivityChange(e),previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent,scrollEditorToLine:(e,t)=>this.session?.scrollToLine(e,t)}),this.backlinksPanel=new Dr({inlinePanelElement:this.elements.backlinksInlinePanel,onFileSelect:e=>this.handleFileSelection(e,{closeSidebarOnMobile:!0}),panelElement:this.elements.backlinksPanel}),this.excalidrawEmbed=new Sa({getLocalUser:()=>this.lobby.getLocalUser(),getTheme:()=>this.themeController.getTheme(),onOpenFile:e=>e&&this.navigation.navigateToFile(e),previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent,toastController:this.toastController}),this.drawioEmbed=new ua({getLocalUser:()=>this.lobby.getLocalUser(),getTheme:()=>this.themeController.getTheme(),onOpenFile:e=>e&&this.navigation.navigateToFile(e),onOpenTextFile:e=>e&&this.navigation.navigateToFile(e,{drawioMode:`text`}),previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent,toastController:this.toastController}),this.commentUi=new na({commentSelectionButton:this.elements.commentSelectionButton,commentsDrawer:this.elements.commentsDrawer,commentsDrawerEmpty:this.elements.commentsDrawerEmpty,commentsDrawerList:this.elements.commentsDrawerList,commentsToggleButton:this.elements.commentsToggleButton,editorContainer:this.elements.editorContainer,onWillOpenDrawer:()=>this.outlineController.close(),previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent,onCreateThread:({anchor:e,body:t})=>this.session?.createCommentThread({anchor:e,body:t}),onNavigateToLine:e=>{this.scrollSyncController.suspendSync(250),this.session?.scrollToLine(e,.2)},onReplyToThread:(e,t)=>this.session?.replyToCommentThread(e,t),onToggleReaction:(e,t,n)=>this.session?.toggleCommentReaction(e,t,n),onResolveThread:e=>this.session?.deleteCommentThread(e)}),this.workspacePreviewController=new Ie({backlinksPanel:this.backlinksPanel,drawioEmbed:this.drawioEmbed,elements:this.elements,excalidrawEmbed:this.excalidrawEmbed,getDisplayName:e=>this.getDisplayName(e),getSession:()=>this.session,isDrawioFile:e=>this.isDrawioFile(e),isExcalidrawFile:e=>this.isExcalidrawFile(e),isImageFile:e=>this.isImageFile(e),isMermaidFile:e=>this.isMermaidFile(e),isPlantUmlFile:e=>this.isPlantUmlFile(e),layoutController:this.layoutController,outlineController:this.outlineController,previewRenderer:this.previewRenderer,schedulePreviewLayoutSync:e=>this.schedulePreviewLayoutSync(e),scrollSyncController:this.scrollSyncController,videoEmbed:this.videoEmbed}),this.wikiLinkFileController=new Fe({getFileList:()=>this.fileExplorer.flatDocumentFiles,navigation:this.navigation,refreshExplorer:()=>this.fileExplorer.refresh(),toastController:this.toastController,vaultApiClient:this.vaultApiClient}),this.gitDiffView=new lo({onBackToHistory:({historyFilePath:e}={})=>{if(e){this.navigation.navigateToGitFileHistory({filePath:e});return}this.navigation.navigateToGitHistory()},onCommitStaged:()=>this.openGitCommitDialog(),onOpenFile:e=>e&&this.navigation.navigateToFile(e),onStageFile:(e,{scope:t})=>this.stageGitFile(e,{scope:t}),onUnstageFile:(e,{scope:t})=>this.unstageGitFile(e,{scope:t}),toastController:this.toastController}),this.fileHistoryView=new Za({diffRenderer:this.gitDiffView,onOpenCommitDiff:(e,{historyFilePath:t,path:n})=>this.handleGitCommitSelection(e,{closeSidebarOnMobile:!1,historyFilePath:t,path:n}),onOpenFile:e=>e&&this.navigation.navigateToFile(e),onOpenPreview:({hash:e,path:t,currentFilePath:n})=>this.handleGitFilePreviewSelection({hash:e,path:t,currentFilePath:n}),onOpenWorkspaceDiff:e=>this.handleGitDiffSelection(e,{closeSidebarOnMobile:!1,scope:`all`}),toastController:this.toastController}),this.tabActivityLock=new yr({onActivated:({takeover:e})=>this.handleTabActivated({takeover:e}),onBlocked:()=>this.handleTabBlocked({reason:`active-elsewhere`}),onStolen:()=>this.handleTabBlocked({reason:`taken-over`})}),this.workspaceCoordinator=new Ve({attachEditorScroller:e=>this.scrollSyncController.attachEditorScroller(e),beginDocumentLoad:()=>this.previewRenderer.beginDocumentLoad(),cleanupAfterSessionDestroy:()=>{this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.outlineController.cleanup(),this.followedCursorSignature=``,clearTimeout(this._backlinkRefreshTimer)},createEditorSession:(e,t)=>new e({editorContainer:this.elements.editorContainer,getFileList:t.getFileList,initialTheme:t.theme,lineInfoElement:this.elements.lineInfo,lineWrappingEnabled:t.lineWrappingEnabled,localUser:t.localUser,onImagePaste:t.onImagePaste,onAwarenessChange:t.onAwarenessChange,onCommentsChange:t.onCommentsChange,onConnectionChange:t.onConnectionChange,onContentChange:t.onContentChange,onSelectionChange:t.onSelectionChange,preferredUserName:t.preferredUserName}),getDisplayName:e=>this.getDisplayName(e),getFileList:()=>this.fileExplorer.flatDocumentFiles,getLineWrappingEnabled:()=>this.getStoredLineWrapping(),getLocalUser:()=>this.lobby.getLocalUser(),getStoredUserName:()=>this.getStoredUserName(),getTheme:()=>this.themeController.getTheme(),isDrawioFile:e=>this.isDrawioFile(e),isExcalidrawFile:e=>this.isExcalidrawFile(e),isImageFile:e=>this.isImageFile(e),isMermaidFile:e=>this.isMermaidFile(e),isPlantUmlFile:e=>this.isPlantUmlFile(e),isTabActive:()=>this.isTabActive,loadBootstrapContent:async e=>{let t=await this.vaultApiClient.readFile(e);return typeof t?.content==`string`?t.content:null},loadEditorSessionClass:()=>this.loadEditorSessionClass(),loadBacklinks:e=>this.backlinksPanel.load(e),onBeforeFileOpen:()=>{this.session=null,this.commentUi.attachSession(null),this.layoutController.reset(),this.resetPreviewMode(),this.elements.emptyState?.classList.add(`hidden`),this.elements.editorPage?.classList.remove(`hidden`),this.elements.diffPage?.classList.add(`hidden`),this.clearInitialFileBootstrap()},onConnectionChange:e=>this.handleConnectionChange(e),onContentChange:({isMermaid:e,isPlantUml:t})=>{this.handleCommentEditorContentChange(),this.previewRenderer.queueRender(),!e&&!t&&this.scheduleBacklinkRefresh()},onCommentsChange:e=>this.handleCommentThreadsChange(e),onFileAwarenessChange:e=>this.updateFileAwareness(e),onFileOpenError:()=>{this.showEditorLoadError(),this.syncWrapToggle(),this.toastController.show(`Failed to initialize editor`)},onFileOpenReady:()=>{this.hideEditorLoading()},onSelectionChange:e=>this.handleCommentSelectionChange(e),onImagePaste:e=>this.handleEditorImageInsert(e),onFileOpenMetric:(e,t)=>this.recordFileOpenMetric(e,t),onSessionAssigned:e=>{this.session=e,this.commentUi.attachSession(e)},onRenderDrawioPreview:e=>this.renderDrawioFilePreview(e),onRenderExcalidrawPreview:e=>this.renderExcalidrawFilePreview(e),onRenderImagePreview:e=>this.renderImageFilePreview(e),onSyncWrapToggle:()=>this.syncWrapToggle(),onUpdateActiveFile:e=>this.fileExplorer.setActiveFile(e),onUpdateCurrentFile:e=>{this.currentFilePath=e},onUpdateLobbyCurrentFile:e=>this.lobby.setCurrentFile(e),onUpdateVisibleChrome:(e,{displayName:t})=>{this.syncFileChrome(e,{drawioMode:this.currentDrawioMode}),this.syncCommentChrome(e),this.syncFileHistoryButton({filePath:e,mode:`editor`}),this.elements.activeFileName&&(this.elements.activeFileName.textContent=t)},onViewModeReset:()=>this.resetPreviewMode(),renderPresence:()=>this.renderPresence(),scrollContainerForSession:e=>e.getScrollContainer(),shouldUseDrawioPreview:()=>!!this.runtimeConfig.drawioBaseUrl,showEditorLoading:()=>this.showEditorLoading(),stateStore:this.stateStore}),this.workspaceRouteController=new Oe({backlinksPanel:this.backlinksPanel,clearInitialFileBootstrap:()=>this.clearInitialFileBootstrap(),clearStaticPreviewDocument:()=>this.clearStaticPreviewDocument(),closeSidebarOnMobile:()=>this.closeSidebarOnMobile(),drawioEmbed:this.drawioEmbed,elements:this.elements,excalidrawEmbed:this.excalidrawEmbed,fileHistoryView:this.fileHistoryView,fileExplorer:this.fileExplorer,getIsTabActive:()=>this.isTabActive,getSessionLoadToken:()=>this.sessionLoadToken,gitDiffView:this.gitDiffView,gitPanel:this.gitPanel,imageLightbox:this.imageLightbox,layoutController:this.layoutController,lobby:this.lobby,navigation:this.navigation,previewRenderer:this.previewRenderer,renderAvatars:()=>this.renderAvatars(),renderPresence:()=>this.renderPresence(),resetPreviewMode:()=>this.resetPreviewMode(),scrollSyncController:this.scrollSyncController,setCurrentFilePath:e=>{this.currentFilePath=e,e||(this.commentUi.setCurrentFile(null,{supported:!1}),this.handleCommentThreadsChange([]),this.handleCommentSelectionChange(null))},setSession:e=>{this.session=e,this.commentUi.attachSession(e)},setSessionLoadToken:e=>{this.sessionLoadToken=e},setSidebarTab:e=>this.setSidebarTab(e),showGitCommit:e=>this.showGitCommit(e),showGitDiff:e=>this.showGitDiff(e),showGitFileHistory:e=>this.showGitFileHistory(e),showGitFilePreview:e=>this.showGitFilePreview(e),showGitHistory:()=>this.showGitHistory(),syncMainChrome:e=>this.syncMainChrome(e),videoEmbed:this.videoEmbed,workspaceCoordinator:this.workspaceCoordinator}),this.chatNotificationPermission!==`granted`&&(this.chatNotificationsEnabled=!1)}get session(){return this._session}set session(e){this._session=e}get currentFilePath(){return this.stateStore.get(`currentFilePath`)}set currentFilePath(e){this.stateStore.set(`currentFilePath`,e)}get currentDrawioMode(){return this.stateStore.get(`currentDrawioMode`)}set currentDrawioMode(e){this.stateStore.set(`currentDrawioMode`,e??null)}get globalUsers(){return this.stateStore.get(`globalUsers`)}set globalUsers(e){this.stateStore.set(`globalUsers`,e)}get connectionState(){return this.stateStore.get(`connectionState`)}set connectionState(e){this.stateStore.set(`connectionState`,e)}get sessionLoadToken(){return this.stateStore.get(`sessionLoadToken`)}set sessionLoadToken(e){this.stateStore.set(`sessionLoadToken`,e)}get connectionHelpShown(){return this.stateStore.get(`connectionHelpShown`)}set connectionHelpShown(e){this.stateStore.set(`connectionHelpShown`,e)}get chatMessages(){return this.stateStore.get(`chatMessages`)}set chatMessages(e){this.stateStore.set(`chatMessages`,e)}get chatMessageIds(){return this.stateStore.get(`chatMessageIds`)}set chatMessageIds(e){this.stateStore.set(`chatMessageIds`,e)}get chatUnreadCount(){return this.stateStore.get(`chatUnreadCount`)}set chatUnreadCount(e){this.stateStore.set(`chatUnreadCount`,e)}get chatIsOpen(){return this.stateStore.get(`chatIsOpen`)}set chatIsOpen(e){this.stateStore.set(`chatIsOpen`,e)}get chatInitialSyncComplete(){return this.stateStore.get(`chatInitialSyncComplete`)}set chatInitialSyncComplete(e){this.stateStore.set(`chatInitialSyncComplete`,e)}get isTabActive(){return this.stateStore.get(`isTabActive`)}set isTabActive(e){this.stateStore.set(`isTabActive`,e)}get fileExplorerReady(){return this.stateStore.get(`fileExplorerReady`)}set fileExplorerReady(e){this.stateStore.set(`fileExplorerReady`,e)}get gitRepoAvailable(){return this.stateStore.get(`gitRepoAvailable`)}set gitRepoAvailable(e){this.stateStore.set(`gitRepoAvailable`,e)}get activeSidebarTab(){return this.stateStore.get(`activeSidebarTab`)}set activeSidebarTab(e){this.stateStore.set(`activeSidebarTab`,e)}get followedUserClientId(){return this.stateStore.get(`followedUserClientId`)}set followedUserClientId(e){this.stateStore.set(`followedUserClientId`,e)}get followedCursorSignature(){return this.stateStore.get(`followedCursorSignature`)}set followedCursorSignature(e){this.stateStore.set(`followedCursorSignature`,e)}publishFileOpenPerf(){typeof window>`u`||(window.__COLLABMD_PERF__??={},window.__COLLABMD_PERF__.fileOpen=this._fileOpenPerf?{...this._fileOpenPerf,details:{...this._fileOpenPerf.details},marks:{...this._fileOpenPerf.marks}}:null)}recordFileOpenMetric(e,t={}){if(e===`open_started`){this._fileOpenPerf={details:{filePath:t.filePath||this.currentFilePath||``,loadToken:t.loadToken??0},marks:{open_started:performance.now()}},this.publishFileOpenPerf();return}this._fileOpenPerf&&(t.loadToken??this._fileOpenPerf.details.loadToken)===this._fileOpenPerf.details.loadToken&&(this._fileOpenPerf.marks[e]=performance.now(),t.filePath&&(this._fileOpenPerf.details.filePath=t.filePath),Object.entries(t).forEach(([e,t])=>{e===`filePath`||e===`loadToken`||(this._fileOpenPerf.details[e]=t)}),this.publishFileOpenPerf())}loadEditorSessionClass(){return this._editorSessionModulePromise||=e(()=>import(`./editor-session-C9l9XwVg.js`).then(e=>e.EditorSession),__vite__mapDeps([27,1,28,29,30,31,32,33,34,35,36,37,38]),import.meta.url),this._editorSessionModulePromise}scheduleEditorSessionPrewarm({timeout:e=1500}={}){if(this._editorSessionModulePromise||this._editorSessionPrewarmHandle)return;let t=()=>{this._editorSessionPrewarmHandle=null,this.loadEditorSessionClass()};if(typeof window.requestIdleCallback==`function`){this._editorSessionPrewarmHandle=window.requestIdleCallback(t,{timeout:e});return}this._editorSessionPrewarmHandle=window.setTimeout(t,0)}async ensureQuickSwitcher(){if(this.quickSwitcher)return this.quickSwitcher;this.quickSwitcherModulePromise||=e(()=>import(`./quick-switcher-controller-DplOTsT3.js`).then(e=>e.QuickSwitcherController),__vite__mapDeps([39,26]),import.meta.url);let t=await this.quickSwitcherModulePromise;return this.quickSwitcher||=new t({getFileList:()=>this.fileExplorer.flatFiles,onFileSelect:e=>this.handleFileSelection(e,{closeSidebarOnMobile:!0})}),this.quickSwitcher}async toggleQuickSwitcher(){(await this.ensureQuickSwitcher()).toggle()}};async function Us(){await x(),new Hs().initialize()}document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,()=>{Us()},{once:!0}):Us();
1243
+ `}function cc(e=document){let t=e.getElementById(`appRoot`);if(!t)throw Error(`App shell root element #appRoot is missing.`);return ac(sc(),t),t}var lc=Object.freeze({chat:Ge,comments:Ke,export:st,git:ht,presence:gt,ui:er,workspace:tr});function uc(e){let t={};Object.entries(lc).forEach(([n,r])=>{Object.entries(r).forEach(([r,i])=>{if(typeof i==`function`){if(Object.hasOwn(t,r))throw Error(`CollabMdAppShell feature method "${r}" is declared by both "${t[r]}" and "${n}".`);if(r in e)throw Error(`CollabMdAppShell feature method "${r}" conflicts with an existing app shell member.`);Object.defineProperty(e,r,{configurable:!0,enumerable:!1,value:i.bind(e),writable:!1}),t[r]=n}})}),Object.defineProperty(e,`featureMethodOwners`,{configurable:!1,enumerable:!1,value:Object.freeze(t),writable:!1})}var dc=class{constructor(){uc(this),cc(document),this.elements=We(document),this.runtimeConfig=k(),this.stateStore=new Ue,this.navigation=new sr,this.preferences=new lr({chatNotificationsKey:`collabmd-chat-notifications-enabled`,lineWrappingKey:`collabmd-editor-line-wrap`,sidebarVisibleKey:`collabmd-sidebar-visible`,userNameKey:`collabmd-user-name`}),this.notifications=new cr,this.vaultApiClient=S,this._session=null,this._hasPromptedForDisplayName=!1,this._backlinkRefreshTimer=null,this._pendingPreviewLayoutSync=!1,this._previewHydrationPaused=!1,this._previewLayoutResizeObserver=null,this._previewLayoutSyncTimer=null,this._reloadPromptShown=!1,this._staticPreviewDocument=null,this.pendingGitResetPath=null,this.chatTimeFormatter=new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}),this.chatNotificationsEnabled=this.preferences.getChatNotificationsEnabled(),this.chatNotificationPermission=this.notifications.getPermission(),this.lobbyChatMessageMaxLength=280,this.quickSwitcher=null,this.quickSwitcherModulePromise=null,this.fileExplorerReadyPromise=Promise.resolve(),this.mobileBreakpointQuery=window.matchMedia(`(max-width: 768px)`),this.pendingWorkspaceRequestIds=new Set,this._fileOpenPerf=null,this.versionMonitor=new fr({currentBuildId:this.runtimeConfig.build?.id,onUpdateAvailable:e=>this.promptForVersionReload(e),runtimeConfig:this.runtimeConfig}),this.lobby=new or({preferredUserName:this.getStoredUserName(),onChange:e=>this.updateGlobalUsers(e),onChatChange:(e,t)=>this.updateChatMessages(e,t)}),this.workspaceSync=new Dr({onTreeChange:(e,t={})=>{let n=this.fileExplorerReady;this.fileExplorer.setTree(e,t),this.fileExplorerReady=!0,!n&&this.isTabActive&&this.handleHashChange()},onWorkspaceEvent:e=>{this.handleIncomingWorkspaceEvent(e)}}),this.toastController=new ls(this.elements.toastContainer),this.chatToastController=new ls(this.elements.chatToastContainer),this.fileExplorer=new uo({mobileBreakpointQuery:this.mobileBreakpointQuery,onFileDelete:()=>this.navigation.navigateToFile(null),onFileSelect:e=>this.handleFileSelection(e,{closeSidebarOnMobile:!0}),pendingWorkspaceRequestIds:this.pendingWorkspaceRequestIds,toastController:this.toastController}),this.gitPanel=new Wo({enabled:this.runtimeConfig.gitEnabled!==!1,onCommitStaged:()=>this.openGitCommitDialog(),onOpenPullBackup:e=>e&&this.navigation.navigateToFile(e),onPullBranch:()=>this.pullGitBranch(),onPushBranch:()=>this.pushGitBranch(),onRepoChange:(e,t)=>this.handleGitRepoChange(e,t),onResetFile:(e,{scope:t})=>this.openGitResetDialog(e,{scope:t}),onSelectCommit:(e,{path:t})=>this.handleGitCommitSelection(e,{closeSidebarOnMobile:!0,path:t}),onSelectDiff:(e,{scope:t})=>this.handleGitDiffSelection(e,{closeSidebarOnMobile:!0,scope:t}),onStageFile:(e,{scope:t})=>this.stageGitFile(e,{scope:t}),onUnstageFile:(e,{scope:t})=>this.unstageGitFile(e,{scope:t}),onViewAllDiff:()=>this.handleGitDiffSelection(null,{closeSidebarOnMobile:!0,scope:`all`}),searchInput:this.elements.gitSearchInput,toastController:this.toastController}),this.outlineController=new Ko({mobileBreakpointQuery:this.mobileBreakpointQuery,onNavigateToHeading:({sourceLine:e})=>{Number.isFinite(e)&&(this.scrollSyncController.suspendSync(250),this.session?.scrollToLine(e,0))},onWillOpen:()=>this.commentUi?.closeDrawer()}),this.videoEmbed=new hs({previewElement:this.elements.previewContent}),this.basesPreview=new Jr({getActiveFilePath:()=>this.currentFilePath,onOpenFile:e=>e&&this.navigation.navigateToFile(e),previewElement:this.elements.previewContent,toastController:this.toastController,vaultApiClient:this.vaultApiClient}),this.imageLightbox=new Ss({previewElement:this.elements.previewContent}),this.previewRenderer=new Oe({getContent:()=>this.getPreviewSource(),getFileList:()=>this.fileExplorer.flatDocumentFiles,getSourceFilePath:()=>this.currentFilePath,onAfterRenderCommit:(e,t)=>{this.recordFileOpenMetric(`preview_committed`,{chars:t?.chars??0,renderVersion:t?.renderVersion??0}),this.videoEmbed.reconcileEmbeds(this.elements.previewContent),this.videoEmbed.syncLayout(),this.basesPreview.reconcileEmbeds(this.elements.previewContent),this.drawioEmbed.reconcileEmbeds(this.elements.previewContent),this.drawioEmbed.syncLayout(),this.excalidrawEmbed.reconcileEmbeds(this.elements.previewContent,{isLargeDocument:t.isLargeDocument}),this.excalidrawEmbed.syncLayout(),this.scrollSyncController.setLargeDocumentMode(t.isLargeDocument),this.schedulePreviewLayoutSync({delayMs:0}),this.refreshCommentUiLayout()},onBeforeRenderCommit:()=>{this.videoEmbed.detachForCommit(),this.drawioEmbed.detachForCommit(),this.excalidrawEmbed.detachForCommit()},onPreviewLayoutChange:()=>{this.scrollSyncController.invalidatePreviewBlocks(),this.schedulePreviewLayoutSync({delayMs:0}),this.refreshCommentUiLayout()},onRenderComplete:()=>{this.videoEmbed.syncLayout(),this.drawioEmbed.syncLayout(),this.excalidrawEmbed.syncLayout(),this.schedulePreviewLayoutSync({delayMs:0}),this.refreshCommentUiLayout()},outlineController:this.outlineController,previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent}),this.themeController=new cs({onChange:e=>this.handleThemeChange(e)}),this.layoutController=new Go({mobileBreakpointQuery:this.mobileBreakpointQuery,onMeasureEditor:()=>this.session?.requestMeasure(),onViewRequest:e=>this.handleLayoutViewRequest(e)}),this.scrollSyncController=new as({getEditorLineNumber:()=>this.session?.getTopVisibleLineNumber(.35)??1,onEditorScrollActivityChange:e=>this.handleEditorScrollActivityChange(e),previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent,scrollEditorToLine:(e,t)=>this.session?.scrollToLine(e,t)}),this.backlinksPanel=new Or({headerPanelElement:this.elements.backlinksHeaderPanel,inlinePanelElement:this.elements.backlinksInlinePanel,onFileSelect:e=>this.handleFileSelection(e,{closeSidebarOnMobile:!0}),panelElement:this.elements.backlinksPanel}),this.excalidrawEmbed=new Ua({getLocalUser:()=>this.lobby.getLocalUser(),getTheme:()=>this.themeController.getTheme(),onOpenFile:e=>e&&this.navigation.navigateToFile(e),previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent,toastController:this.toastController}),this.drawioEmbed=new ja({getLocalUser:()=>this.lobby.getLocalUser(),getTheme:()=>this.themeController.getTheme(),onOpenFile:e=>e&&this.navigation.navigateToFile(e),onOpenTextFile:e=>e&&this.navigation.navigateToFile(e,{drawioMode:`text`}),previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent,toastController:this.toastController}),this.commentUi=new Ca({commentSelectionButton:this.elements.commentSelectionButton,commentsDrawer:this.elements.commentsDrawer,commentsDrawerEmpty:this.elements.commentsDrawerEmpty,commentsDrawerList:this.elements.commentsDrawerList,commentsToggleButton:this.elements.commentsToggleButton,editorContainer:this.elements.editorContainer,onWillOpenDrawer:()=>this.outlineController.close(),previewContainer:this.elements.previewContainer,previewElement:this.elements.previewContent,onCreateThread:({anchor:e,body:t})=>this.session?.createCommentThread({anchor:e,body:t}),onNavigateToLine:e=>{this.scrollSyncController.suspendSync(250),this.session?.scrollToLine(e,.2)},onReplyToThread:(e,t)=>this.session?.replyToCommentThread(e,t),onToggleReaction:(e,t,n)=>this.session?.toggleCommentReaction(e,t,n),onResolveThread:e=>this.session?.deleteCommentThread(e)}),this.workspacePreviewController=new Le({backlinksPanel:this.backlinksPanel,basesPreview:this.basesPreview,drawioEmbed:this.drawioEmbed,elements:this.elements,excalidrawEmbed:this.excalidrawEmbed,getDisplayName:e=>this.getDisplayName(e),getSession:()=>this.session,isBaseFile:e=>this.isBaseFile(e),isDrawioFile:e=>this.isDrawioFile(e),isExcalidrawFile:e=>this.isExcalidrawFile(e),isImageFile:e=>this.isImageFile(e),isMermaidFile:e=>this.isMermaidFile(e),isPlantUmlFile:e=>this.isPlantUmlFile(e),layoutController:this.layoutController,outlineController:this.outlineController,previewRenderer:this.previewRenderer,schedulePreviewLayoutSync:e=>this.schedulePreviewLayoutSync(e),scrollSyncController:this.scrollSyncController,videoEmbed:this.videoEmbed}),this.wikiLinkFileController=new Ie({getFileList:()=>this.fileExplorer.flatDocumentFiles,navigation:this.navigation,refreshExplorer:()=>this.fileExplorer.refresh(),toastController:this.toastController,vaultApiClient:this.vaultApiClient}),this.gitDiffView=new jo({onBackToHistory:({historyFilePath:e}={})=>{if(e){this.navigation.navigateToGitFileHistory({filePath:e});return}this.navigation.navigateToGitHistory()},onCommitStaged:()=>this.openGitCommitDialog(),onOpenFile:e=>e&&this.navigation.navigateToFile(e),onStageFile:(e,{scope:t})=>this.stageGitFile(e,{scope:t}),onUnstageFile:(e,{scope:t})=>this.unstageGitFile(e,{scope:t}),toastController:this.toastController}),this.fileHistoryView=new yo({diffRenderer:this.gitDiffView,onOpenCommitDiff:(e,{historyFilePath:t,path:n})=>this.handleGitCommitSelection(e,{closeSidebarOnMobile:!1,historyFilePath:t,path:n}),onOpenFile:e=>e&&this.navigation.navigateToFile(e),onOpenPreview:({hash:e,path:t,currentFilePath:n})=>this.handleGitFilePreviewSelection({hash:e,path:t,currentFilePath:n}),onOpenWorkspaceDiff:e=>this.handleGitDiffSelection(e,{closeSidebarOnMobile:!1,scope:`all`}),toastController:this.toastController}),this.tabActivityLock=new br({onActivated:({takeover:e})=>this.handleTabActivated({takeover:e}),onBlocked:()=>this.handleTabBlocked({reason:`active-elsewhere`}),onStolen:()=>this.handleTabBlocked({reason:`taken-over`})}),this.workspaceCoordinator=new He({attachEditorScroller:e=>this.scrollSyncController.attachEditorScroller(e),beginDocumentLoad:()=>this.previewRenderer.beginDocumentLoad(),cleanupAfterSessionDestroy:()=>{this.scrollSyncController.setLargeDocumentMode(!1),this.scrollSyncController.invalidatePreviewBlocks(),this.outlineController.cleanup(),this.followedCursorSignature=``,clearTimeout(this._backlinkRefreshTimer)},createEditorSession:(e,t)=>new e({editorContainer:this.elements.editorContainer,getFileList:t.getFileList,initialTheme:t.theme,lineInfoElement:this.elements.lineInfo,lineWrappingEnabled:t.lineWrappingEnabled,localUser:t.localUser,onImagePaste:t.onImagePaste,onAwarenessChange:t.onAwarenessChange,onCommentsChange:t.onCommentsChange,onConnectionChange:t.onConnectionChange,onContentChange:t.onContentChange,onSelectionChange:t.onSelectionChange,preferredUserName:t.preferredUserName}),getDisplayName:e=>this.getDisplayName(e),getFileList:()=>this.fileExplorer.flatDocumentFiles,getLineWrappingEnabled:()=>this.getStoredLineWrapping(),getLocalUser:()=>this.lobby.getLocalUser(),getStoredUserName:()=>this.getStoredUserName(),getTheme:()=>this.themeController.getTheme(),isBaseFile:e=>this.isBaseFile(e),isDrawioFile:e=>this.isDrawioFile(e),isExcalidrawFile:e=>this.isExcalidrawFile(e),isImageFile:e=>this.isImageFile(e),isMermaidFile:e=>this.isMermaidFile(e),isPlantUmlFile:e=>this.isPlantUmlFile(e),isTabActive:()=>this.isTabActive,loadBootstrapContent:async e=>{let t=await this.vaultApiClient.readFile(e);return typeof t?.content==`string`?t.content:null},loadEditorSessionClass:()=>this.loadEditorSessionClass(),loadBacklinks:e=>this.backlinksPanel.load(e),onBeforeFileOpen:()=>{this.session=null,this.commentUi.attachSession(null),this.layoutController.reset(),this.resetPreviewMode(),this.elements.emptyState?.classList.add(`hidden`),this.elements.editorPage?.classList.remove(`hidden`),this.elements.diffPage?.classList.add(`hidden`),this.clearInitialFileBootstrap()},onConnectionChange:e=>this.handleConnectionChange(e),onContentChange:({isBase:e,isMermaid:t,isPlantUml:n})=>{if(this.handleCommentEditorContentChange(),e){this.renderBaseFilePreview(this.currentFilePath,{source:this.session?.getText?.()??``});return}this.previewRenderer.queueRender(),!t&&!n&&this.scheduleBacklinkRefresh()},onCommentsChange:e=>this.handleCommentThreadsChange(e),onFileAwarenessChange:e=>this.updateFileAwareness(e),onFileOpenError:()=>{this.showEditorLoadError(),this.syncWrapToggle(),this.toastController.show(`Failed to initialize editor`)},onFileOpenReady:()=>{this.hideEditorLoading()},onSelectionChange:e=>this.handleCommentSelectionChange(e),onImagePaste:e=>this.handleEditorImageInsert(e),onFileOpenMetric:(e,t)=>this.recordFileOpenMetric(e,t),onSessionAssigned:e=>{this.session=e,this.commentUi.attachSession(e)},onRenderDrawioPreview:e=>this.renderDrawioFilePreview(e),onRenderBasePreview:e=>this.renderBaseFilePreview(e),onRenderExcalidrawPreview:e=>this.renderExcalidrawFilePreview(e),onRenderImagePreview:e=>this.renderImageFilePreview(e),onSyncWrapToggle:()=>this.syncWrapToggle(),onUpdateActiveFile:e=>this.fileExplorer.setActiveFile(e),onUpdateCurrentFile:e=>{this.currentFilePath=e},onUpdateLobbyCurrentFile:e=>this.lobby.setCurrentFile(e),onUpdateVisibleChrome:(e,{displayName:t})=>{this.syncFileChrome(e,{drawioMode:this.currentDrawioMode,preferPreviewForBase:this.isBaseFile(e)}),this.syncCommentChrome(e),this.syncFileHistoryButton({filePath:e,mode:`editor`}),this.elements.activeFileName&&(this.elements.activeFileName.textContent=t)},onViewModeReset:()=>this.resetPreviewMode(),renderPresence:()=>this.renderPresence(),scrollContainerForSession:e=>e.getScrollContainer(),shouldUseDrawioPreview:()=>!!this.runtimeConfig.drawioBaseUrl,showEditorLoading:()=>this.showEditorLoading(),stateStore:this.stateStore}),this.workspaceRouteController=new ke({backlinksPanel:this.backlinksPanel,clearInitialFileBootstrap:()=>this.clearInitialFileBootstrap(),clearStaticPreviewDocument:()=>this.clearStaticPreviewDocument(),closeSidebarOnMobile:()=>this.closeSidebarOnMobile(),drawioEmbed:this.drawioEmbed,elements:this.elements,excalidrawEmbed:this.excalidrawEmbed,fileHistoryView:this.fileHistoryView,fileExplorer:this.fileExplorer,getIsTabActive:()=>this.isTabActive,getSessionLoadToken:()=>this.sessionLoadToken,gitDiffView:this.gitDiffView,gitPanel:this.gitPanel,imageLightbox:this.imageLightbox,layoutController:this.layoutController,lobby:this.lobby,navigation:this.navigation,previewRenderer:this.previewRenderer,renderAvatars:()=>this.renderAvatars(),renderPresence:()=>this.renderPresence(),resetPreviewMode:()=>this.resetPreviewMode(),scrollSyncController:this.scrollSyncController,setCurrentFilePath:e=>{this.currentFilePath=e,e||(this.commentUi.setCurrentFile(null,{supported:!1}),this.handleCommentThreadsChange([]),this.handleCommentSelectionChange(null))},setSession:e=>{this.session=e,this.commentUi.attachSession(e)},setSessionLoadToken:e=>{this.sessionLoadToken=e},setSidebarTab:e=>this.setSidebarTab(e),showGitCommit:e=>this.showGitCommit(e),showGitDiff:e=>this.showGitDiff(e),showGitFileHistory:e=>this.showGitFileHistory(e),showGitFilePreview:e=>this.showGitFilePreview(e),showGitHistory:()=>this.showGitHistory(),syncMainChrome:e=>this.syncMainChrome(e),videoEmbed:this.videoEmbed,workspaceCoordinator:this.workspaceCoordinator}),this.chatNotificationPermission!==`granted`&&(this.chatNotificationsEnabled=!1)}get session(){return this._session}set session(e){this._session=e}get currentFilePath(){return this.stateStore.get(`currentFilePath`)}set currentFilePath(e){this.stateStore.set(`currentFilePath`,e)}get currentDrawioMode(){return this.stateStore.get(`currentDrawioMode`)}set currentDrawioMode(e){this.stateStore.set(`currentDrawioMode`,e??null)}get globalUsers(){return this.stateStore.get(`globalUsers`)}set globalUsers(e){this.stateStore.set(`globalUsers`,e)}get connectionState(){return this.stateStore.get(`connectionState`)}set connectionState(e){this.stateStore.set(`connectionState`,e)}get sessionLoadToken(){return this.stateStore.get(`sessionLoadToken`)}set sessionLoadToken(e){this.stateStore.set(`sessionLoadToken`,e)}get connectionHelpShown(){return this.stateStore.get(`connectionHelpShown`)}set connectionHelpShown(e){this.stateStore.set(`connectionHelpShown`,e)}get chatMessages(){return this.stateStore.get(`chatMessages`)}set chatMessages(e){this.stateStore.set(`chatMessages`,e)}get chatMessageIds(){return this.stateStore.get(`chatMessageIds`)}set chatMessageIds(e){this.stateStore.set(`chatMessageIds`,e)}get chatUnreadCount(){return this.stateStore.get(`chatUnreadCount`)}set chatUnreadCount(e){this.stateStore.set(`chatUnreadCount`,e)}get chatIsOpen(){return this.stateStore.get(`chatIsOpen`)}set chatIsOpen(e){this.stateStore.set(`chatIsOpen`,e)}get chatInitialSyncComplete(){return this.stateStore.get(`chatInitialSyncComplete`)}set chatInitialSyncComplete(e){this.stateStore.set(`chatInitialSyncComplete`,e)}get isTabActive(){return this.stateStore.get(`isTabActive`)}set isTabActive(e){this.stateStore.set(`isTabActive`,e)}get fileExplorerReady(){return this.stateStore.get(`fileExplorerReady`)}set fileExplorerReady(e){this.stateStore.set(`fileExplorerReady`,e)}get gitRepoAvailable(){return this.stateStore.get(`gitRepoAvailable`)}set gitRepoAvailable(e){this.stateStore.set(`gitRepoAvailable`,e)}get activeSidebarTab(){return this.stateStore.get(`activeSidebarTab`)}set activeSidebarTab(e){this.stateStore.set(`activeSidebarTab`,e)}get followedUserClientId(){return this.stateStore.get(`followedUserClientId`)}set followedUserClientId(e){this.stateStore.set(`followedUserClientId`,e)}get followedCursorSignature(){return this.stateStore.get(`followedCursorSignature`)}set followedCursorSignature(e){this.stateStore.set(`followedCursorSignature`,e)}publishFileOpenPerf(){typeof window>`u`||(window.__COLLABMD_PERF__??={},window.__COLLABMD_PERF__.fileOpen=this._fileOpenPerf?{...this._fileOpenPerf,details:{...this._fileOpenPerf.details},marks:{...this._fileOpenPerf.marks}}:null)}recordFileOpenMetric(e,t={}){if(e===`open_started`){this._fileOpenPerf={details:{filePath:t.filePath||this.currentFilePath||``,loadToken:t.loadToken??0},marks:{open_started:performance.now()}},this.publishFileOpenPerf();return}this._fileOpenPerf&&(t.loadToken??this._fileOpenPerf.details.loadToken)===this._fileOpenPerf.details.loadToken&&(this._fileOpenPerf.marks[e]=performance.now(),t.filePath&&(this._fileOpenPerf.details.filePath=t.filePath),Object.entries(t).forEach(([e,t])=>{e===`filePath`||e===`loadToken`||(this._fileOpenPerf.details[e]=t)}),this.publishFileOpenPerf())}loadEditorSessionClass(){return this._editorSessionModulePromise||=e(()=>import(`./editor-session-BKHEYkbY.js`).then(e=>e.EditorSession),__vite__mapDeps([28,1,29,30,31,32,33,34,35,36,37,38,39,40,27]),import.meta.url),this._editorSessionModulePromise}scheduleEditorSessionPrewarm({timeout:e=1500}={}){if(this._editorSessionModulePromise||this._editorSessionPrewarmHandle)return;let t=()=>{this._editorSessionPrewarmHandle=null,this.loadEditorSessionClass()};if(typeof window.requestIdleCallback==`function`){this._editorSessionPrewarmHandle=window.requestIdleCallback(t,{timeout:e});return}this._editorSessionPrewarmHandle=window.setTimeout(t,0)}async ensureQuickSwitcher(){if(this.quickSwitcher)return this.quickSwitcher;this.quickSwitcherModulePromise||=e(()=>import(`./quick-switcher-controller-DcyllYpm.js`).then(e=>e.QuickSwitcherController),__vite__mapDeps([41,26,27]),import.meta.url);let t=await this.quickSwitcherModulePromise;return this.quickSwitcher||=new t({getFileList:()=>this.fileExplorer.flatFiles,onFileSelect:e=>this.handleFileSelection(e,{closeSidebarOnMobile:!0})}),this.quickSwitcher}async toggleQuickSwitcher(){(await this.ensureQuickSwitcher()).toggle()}};async function fc(){await ee(),new dc().initialize()}document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,()=>{fc()},{once:!0}):fc();