collabmd 0.1.39 → 0.1.40

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 (324) hide show
  1. package/README.md +7 -1
  2. package/dist/client/assets/{CodeMirrorEditor-UCMRAMCV-75Zi8U_A.js → CodeMirrorEditor-UCMRAMCV-CjJV4GGp.js} +1 -1
  3. package/dist/client/assets/{ar-SA-NXDWD63E-CTf_wpt3.js → ar-SA-NXDWD63E-BfWwfLiP.js} +1 -1
  4. package/dist/client/assets/{arc-DD8jaAGl.js → arc-B59iLcOr.js} +1 -1
  5. package/dist/client/assets/architecture-7EHR7CIX-M1SFnuBJ.js +1 -0
  6. package/dist/client/assets/{architectureDiagram-Q4EWVU46-BftXiJA8.js → architectureDiagram-3BPJPVTR-Cs4u0ty-.js} +3 -3
  7. package/dist/client/assets/{az-AZ-MXSORGZV-C_C9i9u3.js → az-AZ-MXSORGZV-D3w9H6nC.js} +1 -1
  8. package/dist/client/assets/{bg-BG-O6MV2KSF-YmfvQf63.js → bg-BG-O6MV2KSF-CqITeIE6.js} +1 -1
  9. package/dist/client/assets/blockDiagram-GPEHLZMM-C4RLg7wo.js +132 -0
  10. package/dist/client/assets/{bn-IN-MMW2ORAC-BTEFR4Ed.js → bn-BD-T2VJNT7N-DRxwOMG_.js} +1 -1
  11. package/dist/client/assets/{bn-BD-T2VJNT7N-BD0ob0JE.js → bn-IN-MMW2ORAC-BZcsVFhS.js} +1 -1
  12. package/dist/client/assets/{c4Diagram-AHTNJAMY-Gz7ZAK0d.js → c4Diagram-AAUBKEIU-DMK9WIWS.js} +2 -2
  13. package/dist/client/assets/{ca-ES-MKBCGNOG-aLX_cjA0.js → ca-ES-MKBCGNOG-D2cujUJ7.js} +1 -1
  14. package/dist/client/assets/channel-E9SBQ9z6.js +1 -0
  15. package/dist/client/assets/{chunk-EDXVE4YY-M4QxyGNt.js → chunk-2J33WTMH-Beqll06X.js} +1 -1
  16. package/dist/client/assets/chunk-3OPIFGDE-Kf30X6bZ.js +62 -0
  17. package/dist/client/assets/{chunk-4BX2VUAB-D5YiFdu1.js → chunk-4BX2VUAB-BVNkn9EH.js} +1 -1
  18. package/dist/client/assets/chunk-4EGX6M5U-6L36_8q8.js +1 -0
  19. package/dist/client/assets/{chunk-55IACEB6-VHgZjidg.js → chunk-55IACEB6-CaPPZbdp.js} +1 -1
  20. package/dist/client/assets/chunk-5DO6E6H7-BpgUf0HE.js +1 -0
  21. package/dist/client/assets/chunk-5ZQYHXKU-BJyABJSy.js +2 -0
  22. package/dist/client/assets/chunk-727SXJPM-DNANnyAn.js +206 -0
  23. package/dist/client/assets/chunk-AQP2D5EJ-D-ou9vaq.js +231 -0
  24. package/dist/client/assets/{chunk-LIHQZDEY-DtYrHuCi.js → chunk-BR22UD5L-CHoFxkAQ.js} +1 -1
  25. package/dist/client/assets/{chunk-BSJP7CBP-D2KkrA_B.js → chunk-BSJP7CBP-AmT6zI00.js} +1 -1
  26. package/dist/client/assets/chunk-CSCIHK7Q-BIoF4mTy.js +123 -0
  27. package/dist/client/assets/chunk-FHYWG6QK-qLbgayZT.js +1 -0
  28. package/dist/client/assets/{chunk-FMBD7UC4-qQT7MtX2.js → chunk-FMBD7UC4-DD6CIukb.js} +1 -1
  29. package/dist/client/assets/chunk-KSCS5N6A-DSHzBB4H.js +10 -0
  30. package/dist/client/assets/{chunk-ZZ45TVLE-DGIhE_ST.js → chunk-L5ZTLDWV-Ca0loQr2.js} +1 -1
  31. package/dist/client/assets/chunk-LZXEDZCA-D4QboL2E.js +2 -0
  32. package/dist/client/assets/chunk-MPE355IW-BGGMthoR.js +1 -0
  33. package/dist/client/assets/chunk-MZUSXYTE-CXyCvcyW.js +1 -0
  34. package/dist/client/assets/chunk-N66VUXT2-CZ58QOjk.js +1 -0
  35. package/dist/client/assets/{chunk-YZCP3GAM-D1jf1WUI.js → chunk-ND2GUHAM-3Xs0Awks.js} +1 -1
  36. package/dist/client/assets/chunk-NNHCCRGN--8l6bbR-.js +159 -0
  37. package/dist/client/assets/{chunk-X2U36JSP-D3OEPG7k.js → chunk-NZK2D7GU-w2jXiKa6.js} +1 -1
  38. package/dist/client/assets/{chunk-U2HBQHQK-BBXgsocS.js → chunk-O5CBEL6O-BFgstMja.js} +4 -4
  39. package/dist/client/assets/chunk-PUPMXCY4-JvkUXyIj.js +1 -0
  40. package/dist/client/assets/chunk-QZHKN3VN-9NMPSwDX.js +1 -0
  41. package/dist/client/assets/{chunk-SRAX5OIU-yDw8XRsi.js → chunk-SRAX5OIU-C_UPA-vt.js} +1 -1
  42. package/dist/client/assets/chunk-UIBZB4QT-B4OybPy_.js +1 -0
  43. package/dist/client/assets/chunk-WCWK7LTN-BOL8a2ua.js +1 -0
  44. package/dist/client/assets/chunk-WMDFGAFD-EzVSth95.js +35 -0
  45. package/dist/client/assets/chunk-WU5MYG2G-Bl8VQmZH.js +1 -0
  46. package/dist/client/assets/{chunk-XPW4576I-BUfyrOtN.js → chunk-XPW4576I-D5FnFhOk.js} +1 -1
  47. package/dist/client/assets/{chunk-Z5NKEFVG-Vu8zBV4H.js → chunk-Z5NKEFVG-GcpeeLo6.js} +1 -1
  48. package/dist/client/assets/chunk-tBc3Ke6Z.js +1 -0
  49. package/dist/client/assets/classDiagram-4FO5ZUOK-D7YhYDLZ.js +1 -0
  50. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-COI4atGv.js +1 -0
  51. package/dist/client/assets/{cose-bilkent-S5V4N54A-A8ssRFyt.js → cose-bilkent-S5V4N54A-Cx3Qt7pR.js} +1 -1
  52. package/dist/client/assets/{cs-CZ-V77HGUP7-Du3y53BB.js → cs-CZ-V77HGUP7-BXqhmWZb.js} +1 -1
  53. package/dist/client/assets/{da-DK-I5RFNTM4-CDJtjf5s.js → da-DK-I5RFNTM4-raD_lQnT.js} +1 -1
  54. package/dist/client/assets/dagre-BM42HDAG-BpURvxT4.js +4 -0
  55. package/dist/client/assets/dagre-BcZLxzJJ.js +1 -0
  56. package/dist/client/assets/{de-CH-WLRDEVBV-CLV2tVw6.js → de-CH-WLRDEVBV-CyNG_YAO.js} +1 -1
  57. package/dist/client/assets/{de-DE-DTI4WUSC-B53J0BQ8.js → de-DE-DTI4WUSC-BAnqlByT.js} +1 -1
  58. package/dist/client/assets/diagram-2AECGRRQ-DJH0JVlq.js +43 -0
  59. package/dist/client/assets/{diagram-5BDNPKRD-BuK-UBuN.js → diagram-5GNKFQAL-DQG4Q1eS.js} +2 -2
  60. package/dist/client/assets/diagram-KO2AKTUF-hx21Lv-5.js +3 -0
  61. package/dist/client/assets/{diagram-TYMM5635-CT8BdT4s.js → diagram-LMA3HP47--QODJMa9.js} +1 -1
  62. package/dist/client/assets/diagram-OG6HWLK6-CB30hX1a.js +24 -0
  63. package/dist/client/assets/{dist-Bz-8_JmE.js → dist-6oqNX0NJ.js} +1 -1
  64. package/dist/client/assets/dist-B0U2pnHE.js +1 -0
  65. package/dist/client/assets/{dist-tRNsnttY.js → dist-B1BRR2vO.js} +1 -1
  66. package/dist/client/assets/{dist-BEk5kTf_.js → dist-B48_21rM.js} +1 -1
  67. package/dist/client/assets/{dist-CRyP6okk.js → dist-BBsYBvEp.js} +1 -1
  68. package/dist/client/assets/{dist-ZuMKSK7c.js → dist-BNDWUlMx.js} +1 -1
  69. package/dist/client/assets/{dist-CQZDuOJ9.js → dist-BOA6xeuH.js} +1 -1
  70. package/dist/client/assets/{dist-wkd-N1L5.js → dist-BQuic6-d.js} +1 -1
  71. package/dist/client/assets/{dist-NcJIpTJ8.js → dist-Bhn_Fiol.js} +1 -1
  72. package/dist/client/assets/dist-BoCYrsTA.js +1 -0
  73. package/dist/client/assets/{dist-_THc9HiJ.js → dist-BsTc7qjG.js} +1 -1
  74. package/dist/client/assets/dist-C-W89K9S.js +1 -0
  75. package/dist/client/assets/{dist-QktK6LIH.js → dist-CAlqrzaF.js} +1 -1
  76. package/dist/client/assets/dist-CBTadfRi2.js +1 -0
  77. package/dist/client/assets/{dist-8EAyH6_p.js → dist-CDsAhnoa.js} +1 -1
  78. package/dist/client/assets/{dist-fpFkgu34.js → dist-CJMPm6rd.js} +1 -1
  79. package/dist/client/assets/{dist-bkoMCmF7.js → dist-CtHMYO6t.js} +1 -1
  80. package/dist/client/assets/dist-D4DGyOvV.js +1 -0
  81. package/dist/client/assets/{dist-Das5WX49.js → dist-D5BVeoD4.js} +1 -1
  82. package/dist/client/assets/{dist-D8d0IGSI.js → dist-D5hPoFa5.js} +1 -1
  83. package/dist/client/assets/{dist-BXiFOexW.js → dist-DCqHC6ts.js} +1 -1
  84. package/dist/client/assets/{dist-yy8SO13g.js → dist-DFzJ8okV.js} +1 -1
  85. package/dist/client/assets/{dist-Bp_j2hKC.js → dist-DSehUDUA.js} +1 -1
  86. package/dist/client/assets/{dist-eAgBpkKv.js → dist-Dv_PLWtE.js} +1 -1
  87. package/dist/client/assets/{dist-B7XQNod9.js → dist-Dx8yU-RA.js} +1 -1
  88. package/dist/client/assets/{dist-CH3l6nVf.js → dist-U35xPXYU.js} +1 -1
  89. package/dist/client/assets/{dist-DplP0BiK.js → dist-UnjH15yg.js} +2 -2
  90. package/dist/client/assets/{dist-DwgKARew.js → dist-ihRjPW1T.js} +1 -1
  91. package/dist/client/assets/{dist-CIt_ogHO.js → dist-q3smPWAL.js} +1 -1
  92. package/dist/client/assets/{dist-uyVGTnZh.js → dist-wA96SVn6.js} +1 -1
  93. package/dist/client/assets/{dist-1SMeCZhf.js → dist-x4M0Qd0y.js} +1 -1
  94. package/dist/client/assets/drawio-editor-BHYoSlR7.js +9 -0
  95. package/dist/client/assets/{drawioEditor-DBSyP3_d.js → drawioEditor-B-Ssnq_p.js} +2 -2
  96. package/dist/client/assets/{editor-session-C1scHGLl.js → editor-session-BTPe8PEu.js} +3 -3
  97. package/dist/client/assets/{el-GR-ZXDJ2OS4-DFmRQv0o.js → el-GR-ZXDJ2OS4-De6xlnXD.js} +1 -1
  98. package/dist/client/assets/{en-CMP6EMR6-D9x8hVSu.js → en-CMP6EMR6-Bfz_MnNa.js} +1 -1
  99. package/dist/client/assets/{erDiagram-SMLLAGMA-6VFZA3Qb.js → erDiagram-TEJ5UH35-BvMeaml9.js} +2 -2
  100. package/dist/client/assets/{es-ES-DYQHAD43-BiGWIrBG.js → es-ES-DYQHAD43-EVQAeFTZ.js} +1 -1
  101. package/dist/client/assets/{eu-ES-QDSYU5Y3-BjwS0kZi.js → eu-ES-QDSYU5Y3-O5XEQp0x.js} +1 -1
  102. package/dist/client/assets/eventmodeling-FCH6USID-DKkN-EFL.js +1 -0
  103. package/dist/client/assets/excalidraw-editor-DzL1T9D9.js +9 -0
  104. package/dist/client/assets/{excalidraw-editor-BZCE9ydu.css → excalidraw-editor-mKBCIvNR.css} +1 -1
  105. package/dist/client/assets/{excalidraw-mermaid-stub-Df0Q2qkW.js → excalidraw-mermaid-stub-B5sWezsO.js} +1 -1
  106. package/dist/client/assets/excalidraw-scene-i7oBzgH8.js +176 -0
  107. package/dist/client/assets/excalidrawEditor-DRxzpbJ-.js +2 -0
  108. package/dist/client/assets/{export-page-Bnk-YQp-.js → export-page-BkCqT_2s.js} +2 -2
  109. package/dist/client/assets/exportDocument-Dj7w1hDJ.js +2 -0
  110. package/dist/client/assets/{fa-IR-26LZG4PM-BgANg2TD.js → fa-IR-26LZG4PM-BlqI3v_N.js} +1 -1
  111. package/dist/client/assets/{fi-FI-6YS4KDE4-CBL5f3oN.js → fi-FI-6YS4KDE4-af5Lkv-j.js} +1 -1
  112. package/dist/client/assets/{flowDiagram-DWJPFMVM-DO9RH8YQ.js → flowDiagram-I6XJVG4X-DgXXcK8y.js} +6 -6
  113. package/dist/client/assets/{fr-FR-BRLLPTZC-CRibNSLG.js → fr-FR-BRLLPTZC-CwQyur9E.js} +1 -1
  114. package/dist/client/assets/ganttDiagram-6RSMTGT7-BMpbo3vT.js +292 -0
  115. package/dist/client/assets/gitGraph-WXDBUCRP-BIQYiPEj.js +1 -0
  116. package/dist/client/assets/gitGraphDiagram-PVQCEYII-CCdpTNJZ.js +106 -0
  117. package/dist/client/assets/{gl-ES-OKUZTLYG-DEDwa_xt.js → gl-ES-OKUZTLYG-BNEoLCI4.js} +1 -1
  118. package/dist/client/assets/graphlib-Dduz6oB8.js +1 -0
  119. package/dist/client/assets/{he-IL-26MGYIU7-47wxy70N.js → he-IL-26MGYIU7-WnVF9HP3.js} +1 -1
  120. package/dist/client/assets/{hi-IN-Q4ZOGTP2-bhV7c3dK.js → hi-IN-Q4ZOGTP2-DcU7ec07.js} +1 -1
  121. package/dist/client/assets/{hu-HU-P2OXPSN5-xG-gBMzE.js → hu-HU-P2OXPSN5-wmJyK1Wq.js} +1 -1
  122. package/dist/client/assets/{id-ID-2EIKXYN6-MQuYaNHo.js → id-ID-2EIKXYN6-BTvn0aFf.js} +1 -1
  123. package/dist/client/assets/image-KGGK4BDN-BtStV6c9.js +1 -0
  124. package/dist/client/assets/index-Cnyy977t.css +1 -0
  125. package/dist/client/assets/{index-BoKmcqkH.js → index-DxQmPZ_f.js} +2 -2
  126. package/dist/client/assets/info-J43DQDTF-CO2Z2J7J.js +1 -0
  127. package/dist/client/assets/{infoDiagram-42DDH7IO-C77Pt7T1.js → infoDiagram-5YYISTIA-oYw2qnNY.js} +1 -1
  128. package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-Cy1fwvvg.js → ishikawaDiagram-YF4QCWOH-BPqURwBR.js} +2 -2
  129. package/dist/client/assets/{it-IT-4CFKVXI2-v2kj-y7j.js → it-IT-4CFKVXI2-CC_iQxXu.js} +1 -1
  130. package/dist/client/assets/{ja-JP-MAND2Z4V-BahXSQz-.js → ja-JP-MAND2Z4V-ConJI8GA.js} +1 -1
  131. package/dist/client/assets/{journeyDiagram-VCZTEJTY-CYWaI6re.js → journeyDiagram-JHISSGLW-CvxY2Fte.js} +3 -3
  132. package/dist/client/assets/{jsx-runtime-1KUJVfx8.js → jsx-runtime-IB1e1gmy.js} +1 -1
  133. package/dist/client/assets/{kaa-HQRTCXTJ-BF26ydFa.js → kaa-HQRTCXTJ-Caqwh_Qr.js} +1 -1
  134. package/dist/client/assets/{kab-KAB-JKIKKTGH-CEIH0F80.js → kab-KAB-JKIKKTGH-DQBmYNc9.js} +1 -1
  135. package/dist/client/assets/{kanban-definition-6JOO6SKY-DY1xE7tm.js → kanban-definition-UN3LZRKU-Ex7702dO.js} +6 -6
  136. package/dist/client/assets/{kk-KZ-HXQ63ZFC-CxWjc9Sf.js → kk-KZ-HXQ63ZFC-O5qp74q-.js} +1 -1
  137. package/dist/client/assets/{km-KH-PKL3LSGX-DJlCteEp.js → km-KH-PKL3LSGX-2wUYTyyo.js} +1 -1
  138. package/dist/client/assets/{ko-KR-KXLREZX3-B1gtI_ci.js → ko-KR-KXLREZX3-CYtUnW5t.js} +1 -1
  139. package/dist/client/assets/{ku-TR-MJ4IER3X-Bf41y2v2.js → ku-TR-MJ4IER3X-DtEKOAU3.js} +1 -1
  140. package/dist/client/assets/line-DRJILpPI.js +1 -0
  141. package/dist/client/assets/{linear-dsIQT_iU.js → linear-rFRiXd2u.js} +1 -1
  142. package/dist/client/assets/{lt-LT-H6WFQ6FJ-DA1or-Eo.js → lt-LT-H6WFQ6FJ-Cs17Ppdf.js} +1 -1
  143. package/dist/client/assets/{lv-LV-GOCK6SJW-qa0BoYMm.js → lv-LV-GOCK6SJW-DYuTyosz.js} +1 -1
  144. package/dist/client/assets/{main-BKumyd95.js → main-iuYcGt-A.js} +11 -7
  145. package/dist/client/assets/mermaid-parser.core-BD_OCbyj.js +4 -0
  146. package/dist/client/assets/mermaid-runtime-CEgpdpwB.js +9 -0
  147. package/dist/client/assets/{mindmap-definition-QFDTVHPH-DB_M5r-j.js → mindmap-definition-RKZ34NQL-D4pwLdMH.js} +23 -23
  148. package/dist/client/assets/{mr-IN-IXVLDMEQ-DXFRgvgb.js → mr-IN-IXVLDMEQ-CIJFnklt.js} +1 -1
  149. package/dist/client/assets/{my-MM-YG6MYTTD-BKDIfalJ.js → my-MM-YG6MYTTD-em_7TGWX.js} +1 -1
  150. package/dist/client/assets/{nb-NO-XGWJISD2-DbwbopH8.js → nb-NO-XGWJISD2-BLNgPVDj.js} +1 -1
  151. package/dist/client/assets/{nl-NL-XVDVCPNC-ChSneTSU.js → nl-NL-XVDVCPNC-CComxzvg.js} +1 -1
  152. package/dist/client/assets/{nn-NO-EMX5MJX5-Cf7ZWKWZ.js → nn-NO-EMX5MJX5-Cekj8s_-.js} +1 -1
  153. package/dist/client/assets/{oc-FR-ROEINTVO-lM7Nl7hD.js → oc-FR-ROEINTVO-DW-kHJ81.js} +1 -1
  154. package/dist/client/assets/{ordinal-Dz3y_j0K.js → ordinal-De-qfORd.js} +1 -1
  155. package/dist/client/assets/{pa-IN-ZYN6SUDY-C9WNUTeR.js → pa-IN-ZYN6SUDY-CnhULOGp.js} +1 -1
  156. package/dist/client/assets/packet-YPE3B663-VxGcYggl.js +1 -0
  157. package/dist/client/assets/percentages-5DKR754L-Ug3UfchV.js +1 -0
  158. package/dist/client/assets/{pica-CgGaIJly.js → pica-DcQ1xKp1.js} +1 -1
  159. package/dist/client/assets/pie-LRSECV5Y-7RrvmmEk.js +1 -0
  160. package/dist/client/assets/pieDiagram-4H26LBE5-C6MCExtR.js +30 -0
  161. package/dist/client/assets/{pl-PL-6VTG7PHC-DqRVepnC.js → pl-PL-6VTG7PHC-C9rBsz9v.js} +1 -1
  162. package/dist/client/assets/{preview-render-compiler-IUtgIlOM.js → preview-render-compiler-CSggyCbw.js} +1 -1
  163. package/dist/client/assets/preview-render-compiler-TPMesM_L.js +1 -0
  164. package/dist/client/assets/{preview-render-profile-Bf6R7v4w.js → preview-render-profile-CQR0o67h.js} +5 -5
  165. package/dist/client/assets/{preview-render-worker-BwQ5sPy9.js → preview-render-worker-CifbXdlx.js} +2 -2
  166. package/dist/client/assets/{pt-BR-5YFKRR5G-CopLYEA6.js → pt-BR-5YFKRR5G-BVyxOCjg.js} +1 -1
  167. package/dist/client/assets/{pt-PT-GEIXXZ67-BjZ_Lphg.js → pt-PT-GEIXXZ67-5CbVaVay.js} +1 -1
  168. package/dist/client/assets/quadrantDiagram-W4KKPZXB-CD77Rny0.js +7 -0
  169. package/dist/client/assets/quick-switcher-controller-CVJBt6V9.js +12 -0
  170. package/dist/client/assets/radar-GUYGQ44K-2SBnfFng.js +1 -0
  171. package/dist/client/assets/{requirementDiagram-MS252O5E-CtUIQnWa.js → requirementDiagram-4Y6WPE33-DdKM6ZWI.js} +4 -4
  172. package/dist/client/assets/{ro-RO-E2P6TFZI-DakDz5Xu.js → ro-RO-E2P6TFZI-DANwkfep.js} +1 -1
  173. package/dist/client/assets/{room-z2w9b96b.js → room-Cha55fQg.js} +1 -1
  174. package/dist/client/assets/{ru-RU-YBIIY43T-BMvCT-XT.js → ru-RU-YBIIY43T-BWZSxhA5.js} +1 -1
  175. package/dist/client/assets/runtime-config-CM_2pVYD.js +1 -0
  176. package/dist/client/assets/{sankeyDiagram-XADWPNL6-tcSeuifE.js → sankeyDiagram-5OEKKPKP-BH3_LNkI.js} +36 -6
  177. package/dist/client/assets/sequenceDiagram-3UESZ5HK-CCGL7FMW.js +162 -0
  178. package/dist/client/assets/{si-LK-673C2CI2-hGdH1S9E.js → si-LK-673C2CI2-Bqr808AJ.js} +1 -1
  179. package/dist/client/assets/{sk-SK-CKZHQ4AP-DiRA-fj8.js → sk-SK-CKZHQ4AP-B2PvXXeU.js} +1 -1
  180. package/dist/client/assets/{sl-SI-557H2GWM-DN94n_1-.js → sl-SI-557H2GWM-IPVDhzgb.js} +1 -1
  181. package/dist/client/assets/{src-BuiVcSz-.js → src-BshjqEL2.js} +1 -1
  182. package/dist/client/assets/stateDiagram-AJRCARHV-ljJcYRX4.js +1 -0
  183. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-DXm0ynOB.js +1 -0
  184. package/dist/client/assets/subset-shared.chunk-C9mEHUfV.js +1 -0
  185. package/dist/client/assets/{subset-worker.chunk-kj1e3wjW.js → subset-worker.chunk-BW_EF59g.js} +1 -1
  186. package/dist/client/assets/{sv-SE-XOPKKDWS-CkHUNABj.js → sv-SE-XOPKKDWS-CQipq9Nf.js} +1 -1
  187. package/dist/client/assets/{ta-IN-XBH7DQI3-W-157oVK.js → ta-IN-XBH7DQI3-Cj2o89vS.js} +1 -1
  188. package/dist/client/assets/{th-TH-TOCWH3R4-BsU-Pydr.js → th-TH-TOCWH3R4-IOX-l13w.js} +1 -1
  189. package/dist/client/assets/{timeline-definition-GMOUNBTQ-Bs6U53Mo.js → timeline-definition-PNZ67QCA-CUVPem2o.js} +5 -5
  190. package/dist/client/assets/{tr-TR-GXW6CYY5-CTddyq89.js → tr-TR-GXW6CYY5-DBVLEsZg.js} +1 -1
  191. package/dist/client/assets/treeView-BLDUP644-DItqHrxu.js +1 -0
  192. package/dist/client/assets/treemap-LRROVOQU-DD1ESKp7.js +1 -0
  193. package/dist/client/assets/{uk-UA-IJKTNUDG-1LzXkII3.js → uk-UA-IJKTNUDG-C5kaymku.js} +1 -1
  194. package/dist/client/assets/{uz-UZ-TBZZEA4V-kqm-qcUj.js → uz-UZ-TBZZEA4V-lMna4tx1.js} +1 -1
  195. package/dist/client/assets/{vault-api-client-BDKKvtOF.js → vault-api-client-Fa51l2lE.js} +1 -1
  196. package/dist/client/assets/{vault-utils-CRpy8MQz.js → vault-utils-BbJUHPCf.js} +1 -1
  197. package/dist/client/assets/vennDiagram-CIIHVFJN-Bb1KSPKA.js +34 -0
  198. package/dist/client/assets/{vi-VN-MULSGNVB-C3H2AUhm.js → vi-VN-MULSGNVB-BAcoCjsz.js} +1 -1
  199. package/dist/client/assets/wardley-L42UT6IY-BoSI-SvR.js +1 -0
  200. package/dist/client/assets/{wardleyDiagram-NUSXRM2D-C-scJfPY.js → wardleyDiagram-YWT4CUSO-EdTzLQiR.js} +61 -3
  201. package/dist/client/assets/{xychartDiagram-5P7HB3ND-D3nQoxhz.js → xychartDiagram-2RQKCTM6-BoQFrGlt.js} +3 -3
  202. package/dist/client/assets/{zh-CN-MVX3E32U-BULPbsyl.js → zh-CN-MVX3E32U-sW-DCFHP.js} +1 -1
  203. package/dist/client/assets/{zh-HK-JNU5RLIE-bNGmeSaW.js → zh-HK-JNU5RLIE-Duqu8EG_.js} +1 -1
  204. package/dist/client/assets/{zh-TW-LENVCA6T-CQDp064P.js → zh-TW-LENVCA6T-BHC0OLnd.js} +1 -1
  205. package/dist/client/drawio-editor.html +1 -1
  206. package/dist/client/excalidraw-editor.html +1 -1
  207. package/dist/client/export-document.html +1 -1
  208. package/dist/client/index.html +2 -2
  209. package/package.json +14 -14
  210. package/src/client/application/mermaid-preview-hydrator.js +26 -8
  211. package/src/client/application/preview-renderer.js +6 -1
  212. package/src/client/application/quick-switcher-loader.js +14 -0
  213. package/src/client/application/workspace-route-controller.js +14 -0
  214. package/src/client/domain/drawio-frame-load.js +28 -0
  215. package/src/client/domain/hash-routes.js +16 -1
  216. package/src/client/domain/runtime-paths.js +7 -0
  217. package/src/client/drawio-editor.js +23 -10
  218. package/src/client/excalidraw-editor.js +66 -13
  219. package/src/client/infrastructure/editor-session.js +4 -0
  220. package/src/client/infrastructure/editor-view-adapter.js +30 -0
  221. package/src/client/infrastructure/runtime-config.js +17 -2
  222. package/src/client/infrastructure/vault-api-client.js +11 -0
  223. package/src/client/presentation/app-shell-template.js +4 -0
  224. package/src/client/presentation/drawio-embed-controller.js +230 -64
  225. package/src/client/presentation/excalidraw-embed-controller.js +51 -60
  226. package/src/client/presentation/quick-switcher-controller.js +217 -21
  227. package/src/client/presentation/quick-switcher-text-search.js +125 -0
  228. package/src/client/styles/features/diagram-preview.css +43 -23
  229. package/src/client/styles/features/quick-switcher.css +153 -15
  230. package/src/client/styles/layout/shell.css +6 -3
  231. package/src/client/styles/surfaces/excalidraw-editor.css +4 -0
  232. package/src/server/config/env.js +1 -0
  233. package/src/server/create-app-server.js +29 -6
  234. package/src/server/domain/ripgrep-search-service.js +365 -0
  235. package/src/server/infrastructure/http/create-request-handler.js +3 -1
  236. package/src/server/infrastructure/http/create-static-handler.js +10 -1
  237. package/src/server/infrastructure/http/create-vault-api-handler.js +2 -0
  238. package/src/server/infrastructure/http/create-vault-api-query-handler.js +38 -2
  239. package/src/server/infrastructure/workspace/file-system-sync-service.js +4 -0
  240. package/dist/client/assets/_baseFor-BSErPbF2.js +0 -1
  241. package/dist/client/assets/architecture-YZFGNWBL-DWWrde02.js +0 -1
  242. package/dist/client/assets/blockDiagram-DXYQGD6D-6UN-nR8-.js +0 -132
  243. package/dist/client/assets/channel-XGCkuPi6.js +0 -1
  244. package/dist/client/assets/chunk-2KRD3SAO-CFcF2aNP.js +0 -1
  245. package/dist/client/assets/chunk-336JU56O-DvrrHsJT.js +0 -2
  246. package/dist/client/assets/chunk-426QAEUC-CEbmCgux.js +0 -1
  247. package/dist/client/assets/chunk-4TB4RGXK-CoouNThi.js +0 -206
  248. package/dist/client/assets/chunk-5FUZZQ4R-CxIIxXPy.js +0 -62
  249. package/dist/client/assets/chunk-5PVQY5BW-ciE7eHID.js +0 -2
  250. package/dist/client/assets/chunk-67CJDMHE-CW-fbgQB.js +0 -1
  251. package/dist/client/assets/chunk-7N4EOEYR-DbAW6XnF.js +0 -1
  252. package/dist/client/assets/chunk-AA7GKIK3-ClDHDAza.js +0 -1
  253. package/dist/client/assets/chunk-CIAEETIT-BnB8a6HR.js +0 -1
  254. package/dist/client/assets/chunk-ENJZ2VHE-BQj_1YA_.js +0 -10
  255. package/dist/client/assets/chunk-FOC6F5B3-Bw6XfKDP.js +0 -1
  256. package/dist/client/assets/chunk-ICPOFSXX-DqJi89rc.js +0 -122
  257. package/dist/client/assets/chunk-K5T4RW27-CQtjKF2g.js +0 -94
  258. package/dist/client/assets/chunk-KGLVRYIC-BWSPiKjp.js +0 -1
  259. package/dist/client/assets/chunk-ORNJ4GCN-Csga44e5.js +0 -1
  260. package/dist/client/assets/chunk-OYMX7WX6-DvtmCasj.js +0 -231
  261. package/dist/client/assets/chunk-QZHKN3VN-CHVH9_3S.js +0 -1
  262. package/dist/client/assets/chunk-YHkbxXgt.js +0 -1
  263. package/dist/client/assets/chunk-YKPWT25G-GISHuloq.js +0 -35
  264. package/dist/client/assets/classDiagram-6PBFFD2Q-D1KhAUL3.js +0 -1
  265. package/dist/client/assets/classDiagram-v2-HSJHXN6E-BSyyJpnR.js +0 -1
  266. package/dist/client/assets/clone-DI0bYZ1L.js +0 -1
  267. package/dist/client/assets/dagre-Dn6rkrte.js +0 -1
  268. package/dist/client/assets/dagre-KV5264BT-COzej2en.js +0 -4
  269. package/dist/client/assets/diagram-G4DWMVQ6-CbswIU9X.js +0 -24
  270. package/dist/client/assets/diagram-MMDJMWI5-BE-yOVGX.js +0 -43
  271. package/dist/client/assets/dist-BCzW2jDH.js +0 -1
  272. package/dist/client/assets/dist-BOn786F3.js +0 -1
  273. package/dist/client/assets/dist-BwUX6zpo.js +0 -1
  274. package/dist/client/assets/dist-D-ixVAsS2.js +0 -1
  275. package/dist/client/assets/dist-GgGgSSbl.js +0 -1
  276. package/dist/client/assets/drawio-editor-B_Sr8Z_Z.js +0 -9
  277. package/dist/client/assets/excalidraw-editor-B0XXVLHd.js +0 -9
  278. package/dist/client/assets/excalidraw-scene-wAbVSY1L.js +0 -176
  279. package/dist/client/assets/excalidrawEditor-37sk03H8.js +0 -2
  280. package/dist/client/assets/exportDocument-WQNApAbg.js +0 -2
  281. package/dist/client/assets/flatten-DjXjUsvv.js +0 -1
  282. package/dist/client/assets/ganttDiagram-T4ZO3ILL-B-NMvHWN.js +0 -292
  283. package/dist/client/assets/gitGraph-7Q5UKJZL-DWNinXu4.js +0 -1
  284. package/dist/client/assets/gitGraphDiagram-UUTBAWPF-B95qkCUx.js +0 -106
  285. package/dist/client/assets/graphlib-CAwOVCJc.js +0 -1
  286. package/dist/client/assets/image-J2CAS7OM-DD4DaQTs.js +0 -1
  287. package/dist/client/assets/index-maPm_Kvk.css +0 -1
  288. package/dist/client/assets/info-OMHHGYJF-DtYG_rX0.js +0 -1
  289. package/dist/client/assets/isEmpty-CpfhGGBo.js +0 -1
  290. package/dist/client/assets/line-BCItEgq3.js +0 -1
  291. package/dist/client/assets/mermaid-parser.core-CsTVsPcD.js +0 -4
  292. package/dist/client/assets/mermaid-runtime-BGlnoUXY.js +0 -11
  293. package/dist/client/assets/packet-4T2RLAQJ-CUVefhAv.js +0 -1
  294. package/dist/client/assets/percentages-5DKR754L-DuhOjTM2.js +0 -1
  295. package/dist/client/assets/pie-ZZUOXDRM-BHBJ1dLX.js +0 -1
  296. package/dist/client/assets/pieDiagram-DEJITSTG-BOo-WzjZ.js +0 -30
  297. package/dist/client/assets/preview-render-compiler-9SmLUP5V.js +0 -1
  298. package/dist/client/assets/quadrantDiagram-34T5L4WZ-2vfo0l5S.js +0 -7
  299. package/dist/client/assets/quick-switcher-controller-B1erSgJ1.js +0 -5
  300. package/dist/client/assets/radar-PYXPWWZC-2jR4qZNU.js +0 -1
  301. package/dist/client/assets/reduce-ChpYjEUB.js +0 -1
  302. package/dist/client/assets/runtime-config-BcUbZKho.js +0 -1
  303. package/dist/client/assets/sequenceDiagram-FGHM5R23-DtF-1Kt2.js +0 -157
  304. package/dist/client/assets/stateDiagram-FHFEXIEX-DKk7Sb0f.js +0 -1
  305. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-DJUaiADr.js +0 -1
  306. package/dist/client/assets/subset-shared.chunk-CWNYNLru.js +0 -1
  307. package/dist/client/assets/treeView-SZITEDCU-DN5dP2ol.js +0 -1
  308. package/dist/client/assets/treemap-W4RFUUIX-Dva7DBJR.js +0 -1
  309. package/dist/client/assets/vennDiagram-DHZGUBPP-DNnIjRae.js +0 -34
  310. package/dist/client/assets/wardley-RL74JXVD-CDZW5uzY.js +0 -1
  311. /package/dist/client/assets/{array-B3agRrCs.js → array-7rJMcyYQ.js} +0 -0
  312. /package/dist/client/assets/{cytoscape.esm-BurByw8X.js → cytoscape.esm-B_ygTtvl.js} +0 -0
  313. /package/dist/client/assets/{defaultLocale-B_FbTTbl.js → defaultLocale-DKHHE2Ij.js} +0 -0
  314. /package/dist/client/assets/{drawio-room-1i6Nn0_Z.js → drawio-room-DrZ-gy4N.js} +0 -0
  315. /package/dist/client/assets/{excalidraw-mermaid-stub-DzxtBcQW.js → excalidraw-mermaid-stub-Co4Okjfg.js} +0 -0
  316. /package/dist/client/assets/{file-kind-DmKq2MvD.js → file-kind-DLz-bCzA.js} +0 -0
  317. /package/dist/client/assets/{image-blob-reduce.esm-D8JQdTFk.js → image-blob-reduce.esm-CRyv8pnU.js} +0 -0
  318. /package/dist/client/assets/{init-DtLQcSuO.js → init-EmgYNkpL.js} +0 -0
  319. /package/dist/client/assets/{katex-CXYULLWy.js → katex-Beiidjxi.js} +0 -0
  320. /package/dist/client/assets/{path-DIlZIGue.js → path-vqW-z8T-.js} +0 -0
  321. /package/dist/client/assets/{preview-diagram-utils-Nqpp4FNV.js → preview-diagram-utils-D94KrSQH.js} +0 -0
  322. /package/dist/client/assets/{rough.esm-BU2knLt9.js → rough.esm-DE_lJ5Ge.js} +0 -0
  323. /package/dist/client/assets/{roundRect-BzEouiv_.js → roundRect-BMsJLtvm.js} +0 -0
  324. /package/dist/client/assets/{yjs-provider-reset-guard-DSPzcvAO.js → yjs-provider-reset-guard-CNmMf4Qd.js} +0 -0
@@ -1,5 +1,11 @@
1
1
  import { stripVaultFileExtension } from '../../domain/file-kind.js';
2
2
  import { escapeHtml } from '../domain/vault-utils.js';
3
+ import {
4
+ DEFAULT_SEARCH_DEBOUNCE_MS,
5
+ QuickSwitcherTextSearchRunner,
6
+ flattenTextResults,
7
+ formatMatchCount,
8
+ } from './quick-switcher-text-search.js';
3
9
 
4
10
  const MAX_VISIBLE_RESULTS = 12;
5
11
 
@@ -21,21 +27,49 @@ function createCorpusEntry(filePath) {
21
27
  };
22
28
  }
23
29
 
30
+ function getFileName(filePath) {
31
+ return stripDisplayExtension(filePath).split('/').pop() || stripDisplayExtension(filePath);
32
+ }
33
+
34
+ function getDirPath(filePath) {
35
+ const displayName = stripDisplayExtension(filePath);
36
+ return displayName.includes('/') ? displayName.substring(0, displayName.lastIndexOf('/')) : '';
37
+ }
38
+
24
39
  export class QuickSwitcherController {
25
- constructor({ getFileList, onFileSelect }) {
40
+ constructor({
41
+ getFileList,
42
+ getSearchConfig = () => ({}),
43
+ onFileSelect,
44
+ onTextMatchSelect = null,
45
+ searchDebounceMs = DEFAULT_SEARCH_DEBOUNCE_MS,
46
+ searchText = null,
47
+ }) {
26
48
  this.getFileList = getFileList;
49
+ this.getSearchConfig = getSearchConfig;
27
50
  this.onFileSelect = onFileSelect;
51
+ this.onTextMatchSelect = onTextMatchSelect;
52
+ this.searchDebounceMs = searchDebounceMs;
53
+ this.searchText = searchText;
28
54
 
29
55
  this.overlay = document.getElementById('quickSwitcher');
30
56
  this.input = document.getElementById('quickSwitcherInput');
31
57
  this.resultsList = document.getElementById('quickSwitcherResults');
32
58
  this.hint = document.getElementById('quickSwitcherHint');
59
+ this.modeTabs = Array.from(document.querySelectorAll?.('[data-qs-mode]') ?? []);
33
60
 
34
61
  this.filteredFiles = [];
35
62
  this.fileCorpus = [];
36
63
  this.lastFileListRef = null;
37
64
  this.selectedIndex = 0;
65
+ this.selectedTextIndex = 0;
38
66
  this.isOpen = false;
67
+ this.mode = 'files';
68
+ this.textResults = null;
69
+ this.textResultItems = [];
70
+ this.textSearchRunner = new QuickSwitcherTextSearchRunner({
71
+ debounceMs: this.searchDebounceMs,
72
+ });
39
73
 
40
74
  this.bindEvents();
41
75
  }
@@ -45,8 +79,14 @@ export class QuickSwitcherController {
45
79
  if (e.target === this.overlay) this.close();
46
80
  });
47
81
 
82
+ this.modeTabs.forEach((tab) => {
83
+ tab.addEventListener('click', () => {
84
+ this.setMode(tab.dataset.qsMode === 'text' ? 'text' : 'files', { preserveInput: true });
85
+ });
86
+ });
87
+
48
88
  this.input?.addEventListener('input', () => {
49
- this.filterFiles();
89
+ this.handleInput();
50
90
  });
51
91
 
52
92
  this.input?.addEventListener('keydown', (e) => {
@@ -69,7 +109,11 @@ export class QuickSwitcherController {
69
109
  break;
70
110
  case 'Tab':
71
111
  e.preventDefault();
72
- this.moveSelection(e.shiftKey ? -1 : 1);
112
+ if (this.modeTabs.length > 1 && !e.shiftKey) {
113
+ this.setMode(this.mode === 'files' ? 'text' : 'files', { preserveInput: true });
114
+ } else {
115
+ this.moveSelection(e.shiftKey ? -1 : 1);
116
+ }
73
117
  break;
74
118
  }
75
119
  });
@@ -81,8 +125,9 @@ export class QuickSwitcherController {
81
125
  this.isOpen = true;
82
126
  this.input.value = '';
83
127
  this.selectedIndex = 0;
128
+ this.selectedTextIndex = 0;
84
129
  this.overlay.classList.add('visible');
85
- this.filterFiles();
130
+ this.setMode('files', { preserveInput: true });
86
131
 
87
132
  // The overlay transitions visibility hidden→visible over 120ms.
88
133
  // Browsers ignore .focus() while the element is still visibility:hidden,
@@ -92,19 +137,16 @@ export class QuickSwitcherController {
92
137
 
93
138
  /** Focus the input once the overlay visibility transition finishes. */
94
139
  _focusAfterTransition() {
95
- // Clean up any previous pending focus attempt
96
140
  this._cancelPendingFocus();
97
141
 
98
142
  const tryFocus = () => {
99
143
  this._focusCleanup = null;
100
144
  this.input?.focus();
101
- // Verify focus actually landed — if not, try once more
102
145
  if (this.isOpen && this.input && document.activeElement !== this.input) {
103
146
  setTimeout(() => this.input?.focus(), 50);
104
147
  }
105
148
  };
106
149
 
107
- // Primary: listen for transitionend on the overlay
108
150
  const onEnd = (e) => {
109
151
  if (e.propertyName === 'visibility' || e.propertyName === 'opacity') {
110
152
  this.overlay.removeEventListener('transitionend', onEnd);
@@ -114,8 +156,6 @@ export class QuickSwitcherController {
114
156
  };
115
157
  this.overlay.addEventListener('transitionend', onEnd);
116
158
 
117
- // Fallback: if transitionend never fires (e.g. transition skipped),
118
- // focus after a delay that exceeds the 120ms CSS transition.
119
159
  const fallbackTimer = setTimeout(() => {
120
160
  this.overlay.removeEventListener('transitionend', onEnd);
121
161
  tryFocus();
@@ -138,6 +178,7 @@ export class QuickSwitcherController {
138
178
  if (!this.overlay) return;
139
179
 
140
180
  this._cancelPendingFocus();
181
+ this.abortTextSearch();
141
182
  this.isOpen = false;
142
183
  this.overlay.classList.remove('visible');
143
184
  this.input.value = '';
@@ -152,6 +193,41 @@ export class QuickSwitcherController {
152
193
  }
153
194
  }
154
195
 
196
+ setMode(mode = 'files', { preserveInput = false } = {}) {
197
+ const normalizedMode = mode === 'text' ? 'text' : 'files';
198
+ this.mode = normalizedMode;
199
+ this.selectedIndex = 0;
200
+ this.selectedTextIndex = 0;
201
+
202
+ if (!preserveInput && this.input) {
203
+ this.input.value = '';
204
+ }
205
+
206
+ this.modeTabs.forEach((tab) => {
207
+ const isActive = tab.dataset.qsMode === normalizedMode;
208
+ tab.classList.toggle('active', isActive);
209
+ tab.setAttribute('aria-selected', isActive ? 'true' : 'false');
210
+ });
211
+
212
+ if (this.input) {
213
+ this.input.placeholder = normalizedMode === 'text'
214
+ ? 'Search text in files...'
215
+ : 'Search files...';
216
+ }
217
+
218
+ this.handleInput();
219
+ }
220
+
221
+ handleInput() {
222
+ if (this.mode === 'text') {
223
+ this.scheduleTextSearch();
224
+ return;
225
+ }
226
+
227
+ this.abortTextSearch();
228
+ this.filterFiles();
229
+ }
230
+
155
231
  filterFiles() {
156
232
  const query = this.input?.value.trim().toLowerCase() ?? '';
157
233
  const allFiles = this.getFileList?.() ?? [];
@@ -203,13 +279,9 @@ export class QuickSwitcherController {
203
279
  const name = entry.lowerDisplayName;
204
280
  const nameOnly = entry.lowerFileName;
205
281
 
206
- // Exact substring match in filename gets highest score
207
282
  if (nameOnly.includes(query)) return 100 + (1 / nameOnly.length);
208
-
209
- // Exact substring in full path
210
283
  if (name.includes(query)) return 50 + (1 / name.length);
211
284
 
212
- // Fuzzy character-by-character match
213
285
  let queryIndex = 0;
214
286
  let score = 0;
215
287
  let consecutiveBonus = 0;
@@ -220,7 +292,6 @@ export class QuickSwitcherController {
220
292
  consecutiveBonus += 1;
221
293
  score += consecutiveBonus;
222
294
 
223
- // Bonus for matching at word boundaries
224
295
  if (i === 0 || name[i - 1] === '/' || name[i - 1] === '-' || name[i - 1] === '_' || name[i - 1] === ' ') {
225
296
  score += 5;
226
297
  }
@@ -259,9 +330,8 @@ export class QuickSwitcherController {
259
330
  }
260
331
  item.dataset.index = String(index);
261
332
 
262
- const displayName = stripDisplayExtension(filePath);
263
- const fileName = displayName.split('/').pop();
264
- const dirPath = displayName.includes('/') ? displayName.substring(0, displayName.lastIndexOf('/')) : '';
333
+ const fileName = getFileName(filePath);
334
+ const dirPath = getDirPath(filePath);
265
335
 
266
336
  item.innerHTML = `
267
337
  <svg class="qs-result-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>
@@ -298,7 +368,6 @@ export class QuickSwitcherController {
298
368
  return `${escapeHtml(before)}<mark>${escapeHtml(match)}</mark>${escapeHtml(after)}`;
299
369
  }
300
370
 
301
- // Fuzzy highlight
302
371
  let result = '';
303
372
  let queryIdx = 0;
304
373
  for (let i = 0; i < text.length; i++) {
@@ -312,7 +381,118 @@ export class QuickSwitcherController {
312
381
  return result;
313
382
  }
314
383
 
384
+ abortTextSearch({ invalidate = true } = {}) {
385
+ this.textSearchRunner.abort({ invalidate });
386
+ }
387
+
388
+ scheduleTextSearch() {
389
+ const query = this.input?.value.trim() ?? '';
390
+ const searchConfig = this.getSearchConfig?.() ?? {};
391
+
392
+ this.textResults = null;
393
+ this.textResultItems = [];
394
+ this.textSearchRunner.schedule({
395
+ isActive: () => this.isOpen && this.mode === 'text',
396
+ onResults: (result, searchedQuery) => {
397
+ this.textResults = result;
398
+ this.textResultItems = flattenTextResults(result);
399
+ this.selectedTextIndex = 0;
400
+ this.renderTextResults(searchedQuery);
401
+ },
402
+ onState: (message) => this.renderTextState(message),
403
+ query,
404
+ searchConfig,
405
+ searchText: this.searchText,
406
+ });
407
+ }
408
+
409
+ renderTextState(message) {
410
+ if (!this.resultsList) return;
411
+ this.resultsList.innerHTML = '';
412
+ if (this.hint) {
413
+ this.hint.textContent = message;
414
+ this.hint.classList.remove('hidden');
415
+ }
416
+ }
417
+
418
+ renderTextResults(query = '') {
419
+ if (!this.resultsList) return;
420
+ this.resultsList.innerHTML = '';
421
+
422
+ if (!this.textResults?.files?.length || this.textResultItems.length === 0) {
423
+ this.renderTextState(query ? 'No text matches found' : 'Type to search file text');
424
+ return;
425
+ }
426
+
427
+ if (this.hint) {
428
+ this.hint.classList.toggle('hidden', !this.textResults.truncated);
429
+ this.hint.textContent = this.textResults.truncated
430
+ ? 'Showing the first matches. Refine the query to narrow results.'
431
+ : '';
432
+ }
433
+
434
+ const fragment = document.createDocumentFragment();
435
+ let flatIndex = 0;
436
+
437
+ this.textResults.files.forEach((fileGroup) => {
438
+ const group = document.createElement('section');
439
+ group.className = 'qs-text-group';
440
+
441
+ const header = document.createElement('div');
442
+ header.className = 'qs-text-group-header';
443
+ header.innerHTML = `
444
+ <span class="qs-text-file-name">${escapeHtml(getFileName(fileGroup.file))}</span>
445
+ <span class="qs-text-file-meta">${escapeHtml(getDirPath(fileGroup.file))}</span>
446
+ <span class="qs-text-count">${escapeHtml(formatMatchCount(fileGroup.matchCount))}</span>
447
+ `;
448
+ group.appendChild(header);
449
+
450
+ (fileGroup.snippets ?? []).forEach((snippet) => {
451
+ const itemIndex = flatIndex;
452
+ const item = document.createElement('button');
453
+ item.type = 'button';
454
+ item.className = 'qs-text-item';
455
+ if (itemIndex === this.selectedTextIndex) {
456
+ item.classList.add('selected');
457
+ }
458
+ item.dataset.textIndex = String(itemIndex);
459
+ item.innerHTML = `
460
+ <span class="qs-text-line">L${escapeHtml(String(snippet.line ?? 1))}</span>
461
+ <span class="qs-text-snippet">${this.highlightSnippet(snippet)}</span>
462
+ `;
463
+ item.addEventListener('click', () => {
464
+ this.selectedTextIndex = itemIndex;
465
+ this.confirmSelection();
466
+ });
467
+ item.addEventListener('mouseenter', () => {
468
+ this.selectedTextIndex = itemIndex;
469
+ this.updateSelection();
470
+ });
471
+ group.appendChild(item);
472
+ flatIndex += 1;
473
+ });
474
+
475
+ fragment.appendChild(group);
476
+ });
477
+
478
+ this.resultsList.appendChild(fragment);
479
+ }
480
+
481
+ highlightSnippet(snippet = {}) {
482
+ const text = String(snippet.text ?? '');
483
+ const start = Math.min(Math.max(Number(snippet.matchStart) || 0, 0), text.length);
484
+ const end = Math.min(Math.max(Number(snippet.matchEnd) || start, start), text.length);
485
+ return `${escapeHtml(text.slice(0, start))}<mark>${escapeHtml(text.slice(start, end))}</mark>${escapeHtml(text.slice(end))}`;
486
+ }
487
+
315
488
  moveSelection(delta) {
489
+ if (this.mode === 'text') {
490
+ if (this.textResultItems.length === 0) return;
491
+ this.selectedTextIndex = (this.selectedTextIndex + delta + this.textResultItems.length) % this.textResultItems.length;
492
+ this.updateSelection();
493
+ return;
494
+ }
495
+
316
496
  if (this.filteredFiles.length === 0) return;
317
497
  this.selectedIndex = (this.selectedIndex + delta + this.filteredFiles.length) % this.filteredFiles.length;
318
498
  this.updateSelection();
@@ -321,17 +501,33 @@ export class QuickSwitcherController {
321
501
  updateSelection() {
322
502
  if (!this.resultsList) return;
323
503
 
504
+ if (this.mode === 'text') {
505
+ const items = this.resultsList.querySelectorAll('.qs-text-item');
506
+ items.forEach((item, i) => {
507
+ item.classList.toggle('selected', i === this.selectedTextIndex);
508
+ });
509
+ items[this.selectedTextIndex]?.scrollIntoView({ block: 'nearest' });
510
+ return;
511
+ }
512
+
324
513
  const items = this.resultsList.querySelectorAll('.qs-result-item');
325
514
  items.forEach((item, i) => {
326
515
  item.classList.toggle('selected', i === this.selectedIndex);
327
516
  });
328
517
 
329
- // Scroll selected item into view
330
- const selectedItem = items[this.selectedIndex];
331
- selectedItem?.scrollIntoView({ block: 'nearest' });
518
+ items[this.selectedIndex]?.scrollIntoView({ block: 'nearest' });
332
519
  }
333
520
 
334
521
  confirmSelection() {
522
+ if (this.mode === 'text') {
523
+ const match = this.textResultItems[this.selectedTextIndex];
524
+ if (match) {
525
+ this.close();
526
+ this.onTextMatchSelect?.(match);
527
+ }
528
+ return;
529
+ }
530
+
335
531
  const filePath = this.filteredFiles[this.selectedIndex];
336
532
  if (filePath) {
337
533
  this.close();
@@ -0,0 +1,125 @@
1
+ export const DEFAULT_SEARCH_DEBOUNCE_MS = 220;
2
+ const TEXT_RESULT_LIMIT = 50;
3
+
4
+ export function formatMatchCount(count = 0) {
5
+ const normalized = Number(count) || 0;
6
+ return `${normalized} ${normalized === 1 ? 'match' : 'matches'}`;
7
+ }
8
+
9
+ export function flattenTextResults(payload = {}) {
10
+ const flattened = [];
11
+ (payload.files ?? []).forEach((fileGroup) => {
12
+ (fileGroup.snippets ?? []).forEach((snippet) => {
13
+ flattened.push({
14
+ column: snippet.column,
15
+ file: fileGroup.file,
16
+ kind: fileGroup.kind,
17
+ line: snippet.line,
18
+ matchLength: Math.max((snippet.matchEnd ?? 0) - (snippet.matchStart ?? 0), 0),
19
+ snippet,
20
+ });
21
+ });
22
+ });
23
+ return flattened;
24
+ }
25
+
26
+ export class QuickSwitcherTextSearchRunner {
27
+ constructor({
28
+ debounceMs = DEFAULT_SEARCH_DEBOUNCE_MS,
29
+ resultLimit = TEXT_RESULT_LIMIT,
30
+ } = {}) {
31
+ this.debounceMs = debounceMs;
32
+ this.resultLimit = resultLimit;
33
+ this.controller = null;
34
+ this.timer = null;
35
+ this.token = 0;
36
+ }
37
+
38
+ abort({ invalidate = true } = {}) {
39
+ clearTimeout(this.timer);
40
+ this.timer = null;
41
+ if (invalidate) {
42
+ this.token += 1;
43
+ }
44
+ this.controller?.abort();
45
+ this.controller = null;
46
+ }
47
+
48
+ schedule({
49
+ isActive = () => true,
50
+ onResults,
51
+ onState,
52
+ query = '',
53
+ searchConfig = {},
54
+ searchText = null,
55
+ } = {}) {
56
+ const minQueryLength = Math.max(Number(searchConfig.minQueryLength) || 2, 1);
57
+
58
+ this.abort();
59
+
60
+ if (!searchConfig.available) {
61
+ onState?.('Global text search requires ripgrep on the server.');
62
+ return;
63
+ }
64
+
65
+ if (!searchText) {
66
+ onState?.('Global text search is unavailable.');
67
+ return;
68
+ }
69
+
70
+ if (query.length < minQueryLength) {
71
+ onState?.(`Type at least ${minQueryLength} characters to search file text.`);
72
+ return;
73
+ }
74
+
75
+ onState?.('Searching...');
76
+ this.timer = setTimeout(() => {
77
+ void this.run({
78
+ isActive,
79
+ onResults,
80
+ onState,
81
+ query,
82
+ searchText,
83
+ });
84
+ }, this.debounceMs);
85
+ }
86
+
87
+ async run({
88
+ isActive = () => true,
89
+ onResults,
90
+ onState,
91
+ query = '',
92
+ searchText,
93
+ } = {}) {
94
+ const token = this.token + 1;
95
+ this.token = token;
96
+ const controller = new AbortController();
97
+ this.controller = controller;
98
+ const isCurrent = () => (
99
+ isActive()
100
+ && token === this.token
101
+ && this.controller === controller
102
+ );
103
+
104
+ try {
105
+ const result = await searchText({
106
+ limit: this.resultLimit,
107
+ query,
108
+ signal: controller.signal,
109
+ });
110
+ if (isCurrent()) {
111
+ onResults?.(result, query);
112
+ }
113
+ } catch (error) {
114
+ if (error?.name === 'AbortError' || !isCurrent()) {
115
+ return;
116
+ }
117
+
118
+ onState?.(error?.body?.error || error?.message || 'Failed to search file text.');
119
+ } finally {
120
+ if (this.controller === controller) {
121
+ this.controller = null;
122
+ }
123
+ }
124
+ }
125
+ }
@@ -276,11 +276,21 @@
276
276
  margin-right: auto;
277
277
  }
278
278
 
279
- .drawio-maximized-root {
279
+ .drawio-embed-overlay-root {
280
+ position: absolute;
281
+ inset: 0;
282
+ z-index: 1;
283
+ pointer-events: none;
284
+ }
285
+
286
+ .drawio-embed-placeholder.is-hydrated {
287
+ visibility: hidden;
288
+ }
289
+
290
+ .drawio-embed-overlay-root.has-maximized-entry {
280
291
  position: fixed;
281
292
  inset: 0;
282
293
  z-index: 171;
283
- pointer-events: none;
284
294
  }
285
295
 
286
296
  body.drawio-maximized-open {
@@ -288,15 +298,10 @@ body.drawio-maximized-open {
288
298
  }
289
299
 
290
300
  body.drawio-maximized-open::before {
291
- content: '';
292
- position: fixed;
293
- inset: 0;
294
- z-index: 170;
295
- background: var(--surface-scrim);
296
- backdrop-filter: blur(2px);
301
+ content: none;
297
302
  }
298
303
 
299
- .drawio-maximized-root .drawio-embed.is-maximized {
304
+ body.drawio-maximized-open .drawio-embed.is-maximized {
300
305
  pointer-events: auto;
301
306
  }
302
307
 
@@ -311,7 +316,13 @@ body.drawio-maximized-open::before {
311
316
  margin: 0;
312
317
  box-sizing: border-box;
313
318
  border-radius: var(--radius-lg-plus);
314
- box-shadow: var(--shadow-media-modal);
319
+ box-shadow: 0 0 0 9999px var(--surface-scrim), var(--shadow-media-modal);
320
+ }
321
+
322
+ .preview-content.is-drawio-file-preview .drawio-embed.is-maximized {
323
+ width: auto !important;
324
+ height: auto !important;
325
+ min-height: 0;
315
326
  }
316
327
 
317
328
  .drawio-embed.is-maximized .drawio-embed-header {
@@ -330,6 +341,20 @@ body.drawio-maximized-open::before {
330
341
  align-items: stretch;
331
342
  }
332
343
 
344
+ .drawio-embed.is-maximized.is-static-preview .drawio-viewer-shell {
345
+ align-items: center;
346
+ justify-content: center;
347
+ }
348
+
349
+ .drawio-embed.is-maximized.is-static-preview .drawio-viewer-frame {
350
+ flex: 0 0 auto !important;
351
+ width: auto;
352
+ height: auto;
353
+ margin: auto !important;
354
+ max-width: 100%;
355
+ max-height: 100%;
356
+ }
357
+
333
358
  .excalidraw-embed-overlay-root {
334
359
  position: absolute;
335
360
  inset: 0;
@@ -337,11 +362,10 @@ body.drawio-maximized-open::before {
337
362
  pointer-events: none;
338
363
  }
339
364
 
340
- .excalidraw-maximized-root {
365
+ .excalidraw-embed-overlay-root.has-maximized-entry {
341
366
  position: fixed;
342
367
  inset: 0;
343
368
  z-index: 171;
344
- pointer-events: none;
345
369
  }
346
370
 
347
371
  .excalidraw-warm-cache-root {
@@ -359,16 +383,7 @@ body.excalidraw-maximized-open {
359
383
  }
360
384
 
361
385
  body.excalidraw-maximized-open::before {
362
- content: '';
363
- position: fixed;
364
- inset: 0;
365
- z-index: 170;
366
- background: var(--surface-scrim);
367
- backdrop-filter: blur(2px);
368
- }
369
-
370
- body.excalidraw-maximized-open .excalidraw-maximized-root {
371
- z-index: 171;
386
+ content: none;
372
387
  }
373
388
 
374
389
  body.excalidraw-maximized-open .resizer {
@@ -446,7 +461,12 @@ body.excalidraw-maximized-open .resizer {
446
461
  margin: 0;
447
462
  box-sizing: border-box;
448
463
  border-radius: var(--radius-lg-plus);
449
- box-shadow: var(--shadow-media-modal);
464
+ box-shadow: 0 0 0 9999px var(--surface-scrim), var(--shadow-media-modal);
465
+ }
466
+
467
+ .excalidraw-maximize-spacer {
468
+ pointer-events: none;
469
+ visibility: hidden;
450
470
  }
451
471
 
452
472
  .excalidraw-embed.is-maximized .excalidraw-embed-header {