collabmd 0.1.34 → 0.1.36
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.
- package/dist/client/assets/{CodeMirrorEditor-UCMRAMCV-Bg0dawOb.js → CodeMirrorEditor-UCMRAMCV-DnBV8gCm.js} +1 -1
- package/dist/client/assets/_baseFor-BSErPbF2.js +1 -0
- package/dist/client/assets/{ar-SA-NXDWD63E-WivLHHDW.js → ar-SA-NXDWD63E-CTf_wpt3.js} +1 -1
- package/dist/client/assets/arc-DD8jaAGl.js +1 -0
- package/dist/client/assets/architecture-YZFGNWBL-DWWrde02.js +1 -0
- package/dist/client/assets/{architectureDiagram-2XIMDMQ5-kYbOThe4.js → architectureDiagram-Q4EWVU46-BftXiJA8.js} +4 -4
- package/dist/client/assets/{az-AZ-MXSORGZV-DOdq1TKC.js → az-AZ-MXSORGZV-C_C9i9u3.js} +1 -1
- package/dist/client/assets/{bg-BG-O6MV2KSF-CYucKuDS.js → bg-BG-O6MV2KSF-YmfvQf63.js} +1 -1
- package/dist/client/assets/blockDiagram-DXYQGD6D-6UN-nR8-.js +132 -0
- package/dist/client/assets/{bn-IN-MMW2ORAC-DYr8kqNL.js → bn-BD-T2VJNT7N-BD0ob0JE.js} +1 -1
- package/dist/client/assets/{bn-BD-T2VJNT7N-2OKWLCYa.js → bn-IN-MMW2ORAC-BTEFR4Ed.js} +1 -1
- package/dist/client/assets/c4Diagram-AHTNJAMY-Gz7ZAK0d.js +10 -0
- package/dist/client/assets/{ca-ES-MKBCGNOG-B9Aeb43I.js → ca-ES-MKBCGNOG-aLX_cjA0.js} +1 -1
- package/dist/client/assets/channel-XGCkuPi6.js +1 -0
- package/dist/client/assets/chunk-2KRD3SAO-CFcF2aNP.js +1 -0
- package/dist/client/assets/chunk-336JU56O-DvrrHsJT.js +2 -0
- package/dist/client/assets/chunk-426QAEUC-CEbmCgux.js +1 -0
- package/dist/client/assets/{chunk-4BX2VUAB-2e7V-uuE.js → chunk-4BX2VUAB-D5YiFdu1.js} +1 -1
- package/dist/client/assets/chunk-4TB4RGXK-CoouNThi.js +206 -0
- package/dist/client/assets/{chunk-55IACEB6-CpncB3ru.js → chunk-55IACEB6-VHgZjidg.js} +1 -1
- package/dist/client/assets/chunk-5FUZZQ4R-CxIIxXPy.js +62 -0
- package/dist/client/assets/chunk-5PVQY5BW-ciE7eHID.js +2 -0
- package/dist/client/assets/chunk-67CJDMHE-CW-fbgQB.js +1 -0
- package/dist/client/assets/chunk-7N4EOEYR-DbAW6XnF.js +1 -0
- package/dist/client/assets/chunk-AA7GKIK3-ClDHDAza.js +1 -0
- package/dist/client/assets/chunk-BSJP7CBP-D2KkrA_B.js +1 -0
- package/dist/client/assets/chunk-CIAEETIT-BnB8a6HR.js +1 -0
- package/dist/client/assets/{chunk-KX2RTZJC-BTiOJb7N.js → chunk-EDXVE4YY-M4QxyGNt.js} +1 -1
- package/dist/client/assets/chunk-ENJZ2VHE-BQj_1YA_.js +10 -0
- package/dist/client/assets/{chunk-FMBD7UC4-CMahlBa_.js → chunk-FMBD7UC4-qQT7MtX2.js} +1 -1
- package/dist/client/assets/chunk-FOC6F5B3-Bw6XfKDP.js +1 -0
- package/dist/client/assets/chunk-ICPOFSXX-DqJi89rc.js +122 -0
- package/dist/client/assets/chunk-K5T4RW27-CQtjKF2g.js +94 -0
- package/dist/client/assets/chunk-KGLVRYIC-BWSPiKjp.js +1 -0
- package/dist/client/assets/chunk-LIHQZDEY-DtYrHuCi.js +1 -0
- package/dist/client/assets/{chunk-AXZTUZBK-DuMiJYO9.js → chunk-LOOWOR4L-C5BUwXgZ.js} +2 -2
- package/dist/client/assets/chunk-ORNJ4GCN-Csga44e5.js +1 -0
- package/dist/client/assets/{chunk-NQ4KR5QH-CMJKI6Oj.js → chunk-OYMX7WX6-DvtmCasj.js} +25 -14
- package/dist/client/assets/chunk-QZHKN3VN-CHVH9_3S.js +1 -0
- package/dist/client/assets/{chunk-SRAX5OIU-CLVBQRWC.js → chunk-SRAX5OIU-yDw8XRsi.js} +1 -1
- package/dist/client/assets/{chunk-PU5JKC2W-D_6N6t8f.js → chunk-U2HBQHQK-BBXgsocS.js} +6 -6
- package/dist/client/assets/{chunk-PQ6SQG4A-D1AbThjy.js → chunk-X2U36JSP-D3OEPG7k.js} +1 -1
- package/dist/client/assets/{chunk-XPW4576I-DJr4_4Yy.js → chunk-XPW4576I-BUfyrOtN.js} +2 -2
- package/dist/client/assets/chunk-YHkbxXgt.js +1 -0
- package/dist/client/assets/chunk-YKPWT25G-GISHuloq.js +35 -0
- package/dist/client/assets/{chunk-JSJVCQXG-DPQ9cPJt.js → chunk-YZCP3GAM-D1jf1WUI.js} +1 -1
- package/dist/client/assets/{chunk-Z5NKEFVG-HOkYqaKa.js → chunk-Z5NKEFVG-Vu8zBV4H.js} +1 -1
- package/dist/client/assets/chunk-ZZ45TVLE-DGIhE_ST.js +1 -0
- package/dist/client/assets/classDiagram-6PBFFD2Q-D1KhAUL3.js +1 -0
- package/dist/client/assets/classDiagram-v2-HSJHXN6E-BSyyJpnR.js +1 -0
- package/dist/client/assets/clike-BFTLRaGS.js +1 -0
- package/dist/client/assets/clone-DI0bYZ1L.js +1 -0
- package/dist/client/assets/{coffeescript-B_7eyHAa.js → coffeescript-B7GZajzV.js} +1 -1
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DASO2hrk.js → cose-bilkent-S5V4N54A-A8ssRFyt.js} +1 -1
- package/dist/client/assets/{cs-CZ-V77HGUP7-BDg-F0CJ.js → cs-CZ-V77HGUP7-Du3y53BB.js} +1 -1
- package/dist/client/assets/{cypher-DE6I2lIA.js → cypher-DEGl2llJ.js} +1 -1
- package/dist/client/assets/cytoscape.esm-BurByw8X.js +321 -0
- package/dist/client/assets/{d-BNkKjn0o.js → d-BspB0dox.js} +1 -1
- package/dist/client/assets/{da-DK-I5RFNTM4-wtSQ0Jxa.js → da-DK-I5RFNTM4-CDJtjf5s.js} +1 -1
- package/dist/client/assets/dagre-Dn6rkrte.js +1 -0
- package/dist/client/assets/dagre-KV5264BT-COzej2en.js +4 -0
- package/dist/client/assets/{de-CH-WLRDEVBV-C1swvmZy.js → de-CH-WLRDEVBV-CLV2tVw6.js} +1 -1
- package/dist/client/assets/{de-DE-DTI4WUSC-C0L6Nz8X.js → de-DE-DTI4WUSC-B53J0BQ8.js} +1 -1
- package/dist/client/assets/diagram-5BDNPKRD-BuK-UBuN.js +10 -0
- package/dist/client/assets/diagram-G4DWMVQ6-CbswIU9X.js +24 -0
- package/dist/client/assets/diagram-MMDJMWI5-BE-yOVGX.js +43 -0
- package/dist/client/assets/diagram-TYMM5635-CT8BdT4s.js +24 -0
- package/dist/client/assets/{dist-3uAMa5w5.js → dist-B98fHn5m.js} +1 -1
- package/dist/client/assets/{dist-BtnXjRx0.js → dist-BE8C_ouo.js} +1 -1
- package/dist/client/assets/{dist-rMhng5DK.js → dist-BEKQo64E.js} +1 -1
- package/dist/client/assets/{dist-DsL7sqZR.js → dist-BOP-dC-R.js} +1 -1
- package/dist/client/assets/{dist-DUvaQ-Bj.js → dist-BPEi1dEF.js} +1 -1
- package/dist/client/assets/{dist-B4uQVR_X.js → dist-BScEL4VP.js} +1 -1
- package/dist/client/assets/dist-BfVljg0L2.js +1 -0
- package/dist/client/assets/{dist-CGV1S_as.js → dist-BiCgLddE.js} +1 -1
- package/dist/client/assets/{dist-CxfohGIV.js → dist-Bn8WRPs1.js} +1 -1
- package/dist/client/assets/dist-Brrlevif.js +6 -0
- package/dist/client/assets/{dist-BLAlZer_.js → dist-CBEw2W2P.js} +1 -1
- package/dist/client/assets/{dist-B-02vKOA.js → dist-CJWCCWEW.js} +1 -1
- package/dist/client/assets/{dist-Dyt7n5Ui.js → dist-CQVTTk81.js} +1 -1
- package/dist/client/assets/dist-CaMl1R6P.js +13 -0
- package/dist/client/assets/dist-CcG3Y7Wp.js +1 -0
- package/dist/client/assets/dist-CghBwrO3.js +1 -0
- package/dist/client/assets/dist-Csbx9lQ-.js +1 -0
- package/dist/client/assets/dist-D34Xzrah.js +1 -0
- package/dist/client/assets/dist-DLyohOXi.js +1 -0
- package/dist/client/assets/{dist-Bc2ND6i3.js → dist-DPCUH5MO.js} +1 -1
- package/dist/client/assets/{dist-BzpfHRaE.js → dist-DQiph4qx.js} +1 -1
- package/dist/client/assets/{dist-CL-jjdvG.js → dist-DWRyOl2w.js} +1 -1
- package/dist/client/assets/{dist-CXpKYW9s.js → dist-DZ2t5lUX.js} +1 -1
- package/dist/client/assets/{dist-BzbYwa8m.js → dist-Dbg8P4C5.js} +1 -1
- package/dist/client/assets/{dist-k47-Io7D.js → dist-DdAqzGFU.js} +1 -1
- package/dist/client/assets/dist-DwvSvkOE.js +1 -0
- package/dist/client/assets/dist-WXLmfDGg.js +1 -0
- package/dist/client/assets/{dist-lDhnP-K1.js → dist-aE0_04fl.js} +1 -1
- package/dist/client/assets/{dist-E_jPb93e.js → dist-mPPUaHhq.js} +1 -1
- package/dist/client/assets/{dist-CjII8VDS.js → dist-v3i1ifes.js} +1 -1
- package/dist/client/assets/dist-wkd-N1L5.js +1 -0
- package/dist/client/assets/drawio-editor-D4Qoluwz.js +9 -0
- package/dist/client/assets/{drawioEditor-D6clB5OH.js → drawioEditor-B65FWq-b.js} +2 -2
- package/dist/client/assets/{ecl-M7Iek4lq.js → ecl-D9rhJ9-u.js} +1 -1
- package/dist/client/assets/editor-session-DV80PhYL.js +16 -0
- package/dist/client/assets/{el-GR-ZXDJ2OS4-BH0saXds.js → el-GR-ZXDJ2OS4-DFmRQv0o.js} +1 -1
- package/dist/client/assets/{en-IQZW2TQM-CzlcEpq3.js → en-CMP6EMR6-D9x8hVSu.js} +1 -1
- package/dist/client/assets/{erDiagram-INFDFZHY-DlIf-fb7.js → erDiagram-SMLLAGMA-6VFZA3Qb.js} +33 -18
- package/dist/client/assets/{es-ES-DYQHAD43-CyzL9Mni.js → es-ES-DYQHAD43-BiGWIrBG.js} +1 -1
- package/dist/client/assets/{eu-ES-QDSYU5Y3-D2-x316S.js → eu-ES-QDSYU5Y3-BjwS0kZi.js} +1 -1
- package/dist/client/assets/excalidraw-editor-BZCE9ydu.css +1 -0
- package/dist/client/assets/excalidraw-editor-hiJQt1cX.js +9 -0
- package/dist/client/assets/{excalidraw-mermaid-stub-Bwe-bKcT.js → excalidraw-mermaid-stub-Df0Q2qkW.js} +1 -1
- package/dist/client/assets/excalidraw-scene-MyNAJi2A.js +176 -0
- package/dist/client/assets/excalidrawEditor-BnbblxK4.js +2 -0
- package/dist/client/assets/{export-page-PeexH2QK.js → export-page-BKDarp9x.js} +3 -3
- package/dist/client/assets/exportDocument-CULEGKmb.js +2 -0
- package/dist/client/assets/{fa-IR-26LZG4PM-D8-trU2x.js → fa-IR-26LZG4PM-BgANg2TD.js} +1 -1
- package/dist/client/assets/{fcl-BWKK0S4-.js → fcl-CUXJFJn1.js} +1 -1
- package/dist/client/assets/{fi-FI-6YS4KDE4-CCdRVFDQ.js → fi-FI-6YS4KDE4-CBL5f3oN.js} +1 -1
- package/dist/client/assets/flatten-DjXjUsvv.js +1 -0
- package/dist/client/assets/flowDiagram-DWJPFMVM-DO9RH8YQ.js +162 -0
- package/dist/client/assets/{fr-FR-BRLLPTZC-Dqq-O5T_.js → fr-FR-BRLLPTZC-CRibNSLG.js} +1 -1
- package/dist/client/assets/ganttDiagram-T4ZO3ILL-B-NMvHWN.js +292 -0
- package/dist/client/assets/gitGraph-7Q5UKJZL-DWNinXu4.js +1 -0
- package/dist/client/assets/gitGraphDiagram-UUTBAWPF-B95qkCUx.js +106 -0
- package/dist/client/assets/{gl-ES-OKUZTLYG-BK7pbLbm.js → gl-ES-OKUZTLYG-DEDwa_xt.js} +1 -1
- package/dist/client/assets/graphlib-CAwOVCJc.js +1 -0
- package/dist/client/assets/{groovy-BEKazBrO.js → groovy-Di--Vb9Z.js} +1 -1
- package/dist/client/assets/{haxe-BY9d_5nB.js → haxe-CcPA1xnA.js} +1 -1
- package/dist/client/assets/{he-IL-26MGYIU7-C3BuYKyY.js → he-IL-26MGYIU7-47wxy70N.js} +1 -1
- package/dist/client/assets/{hi-IN-Q4ZOGTP2-BEvXWXnH.js → hi-IN-Q4ZOGTP2-bhV7c3dK.js} +1 -1
- package/dist/client/assets/{hu-HU-P2OXPSN5-BWWZeJNp.js → hu-HU-P2OXPSN5-xG-gBMzE.js} +1 -1
- package/dist/client/assets/{id-ID-2EIKXYN6-DxSKi_aJ.js → id-ID-2EIKXYN6-MQuYaNHo.js} +1 -1
- package/dist/client/assets/image-J2CAS7OM-DD4DaQTs.js +1 -0
- package/dist/client/assets/image-blob-reduce.esm-D8JQdTFk.js +2 -0
- package/dist/client/assets/{index-BLrtj9YM.js → index-BjdYZiBM.js} +2 -2
- package/dist/client/assets/{index-BIt5EZXz.css → index-BryqP9QY.css} +1 -1
- package/dist/client/assets/info-OMHHGYJF-DtYG_rX0.js +1 -0
- package/dist/client/assets/{infoDiagram-LFFYTUFH-DFTI0nfs.js → infoDiagram-42DDH7IO-C77Pt7T1.js} +1 -1
- package/dist/client/assets/isEmpty-CpfhGGBo.js +1 -0
- package/dist/client/assets/ishikawaDiagram-UXIWVN3A-Cy1fwvvg.js +70 -0
- package/dist/client/assets/{it-IT-4CFKVXI2-BmA8wW6q.js → it-IT-4CFKVXI2-v2kj-y7j.js} +1 -1
- package/dist/client/assets/{ja-JP-MAND2Z4V-CLS1jI9o.js → ja-JP-MAND2Z4V-BahXSQz-.js} +1 -1
- package/dist/client/assets/{javascript-CdiVhQeA.js → javascript-gTK9fxz6.js} +1 -1
- package/dist/client/assets/javascript-qUBHINSy.js +1 -0
- package/dist/client/assets/{journeyDiagram-4ABVD52K-DDur6iHm.js → journeyDiagram-VCZTEJTY-CYWaI6re.js} +2 -2
- package/dist/client/assets/{jsx-runtime-C2p7wRmT.js → jsx-runtime-1KUJVfx8.js} +1 -1
- package/dist/client/assets/{kaa-HQRTCXTJ-W15DEDPz.js → kaa-HQRTCXTJ-BF26ydFa.js} +1 -1
- package/dist/client/assets/{kab-KAB-JKIKKTGH-MLh1inqS.js → kab-KAB-JKIKKTGH-CEIH0F80.js} +1 -1
- package/dist/client/assets/{kanban-definition-K7BYSVSG-dA6NPLsg.js → kanban-definition-6JOO6SKY-DY1xE7tm.js} +2 -2
- package/dist/client/assets/{kk-KZ-HXQ63ZFC-BtFrPeLs.js → kk-KZ-HXQ63ZFC-CxWjc9Sf.js} +1 -1
- package/dist/client/assets/{km-KH-PKL3LSGX-xO5FyM9T.js → km-KH-PKL3LSGX-DJlCteEp.js} +1 -1
- package/dist/client/assets/{ko-KR-KXLREZX3-NZFoRybS.js → ko-KR-KXLREZX3-B1gtI_ci.js} +1 -1
- package/dist/client/assets/{ku-TR-MJ4IER3X-B5eVPIpK.js → ku-TR-MJ4IER3X-Bf41y2v2.js} +1 -1
- package/dist/client/assets/line-BCItEgq3.js +1 -0
- package/dist/client/assets/{linear-B2dOdA24.js → linear-dsIQT_iU.js} +1 -1
- package/dist/client/assets/{lt-LT-H6WFQ6FJ-D_7_OeJD.js → lt-LT-H6WFQ6FJ-DA1or-Eo.js} +1 -1
- package/dist/client/assets/{lua-kutgyRGY.js → lua-Cg0FqIlO.js} +1 -1
- package/dist/client/assets/{lv-LV-GOCK6SJW-CnpKr0oQ.js → lv-LV-GOCK6SJW-qa0BoYMm.js} +1 -1
- package/dist/client/assets/main-QJcxyvDa.js +1404 -0
- package/dist/client/assets/mermaid-parser.core-CsTVsPcD.js +4 -0
- package/dist/client/assets/mermaid-runtime-BGlnoUXY.js +11 -0
- package/dist/client/assets/{mindmap-definition-YRQLILUH-DjQcsPoe.js → mindmap-definition-QFDTVHPH-DB_M5r-j.js} +39 -11
- package/dist/client/assets/{mr-IN-IXVLDMEQ-Pht2X_GK.js → mr-IN-IXVLDMEQ-DXFRgvgb.js} +1 -1
- package/dist/client/assets/{my-MM-YG6MYTTD-Cgq4HhPO.js → my-MM-YG6MYTTD-BKDIfalJ.js} +1 -1
- package/dist/client/assets/{nb-NO-XGWJISD2-Bn_Bk2un.js → nb-NO-XGWJISD2-DbwbopH8.js} +1 -1
- package/dist/client/assets/{nl-NL-XVDVCPNC-YkWSJS94.js → nl-NL-XVDVCPNC-ChSneTSU.js} +1 -1
- package/dist/client/assets/{nn-NO-EMX5MJX5-DhP5eZJ7.js → nn-NO-EMX5MJX5-Cf7ZWKWZ.js} +1 -1
- package/dist/client/assets/{oc-FR-ROEINTVO-D3udMPnr.js → oc-FR-ROEINTVO-lM7Nl7hD.js} +1 -1
- package/dist/client/assets/{pa-IN-ZYN6SUDY-CR5YzFig.js → pa-IN-ZYN6SUDY-C9WNUTeR.js} +1 -1
- package/dist/client/assets/packet-4T2RLAQJ-CUVefhAv.js +1 -0
- package/dist/client/assets/percentages-5DKR754L-DuhOjTM2.js +1 -0
- package/dist/client/assets/pica-CgGaIJly.js +2 -0
- package/dist/client/assets/pie-ZZUOXDRM-BHBJ1dLX.js +1 -0
- package/dist/client/assets/pieDiagram-DEJITSTG-BOo-WzjZ.js +30 -0
- package/dist/client/assets/{pl-PL-6VTG7PHC-_wZuoIDM.js → pl-PL-6VTG7PHC-DqRVepnC.js} +1 -1
- package/dist/client/assets/{preview-diagram-utils-COt-IYMD.js → preview-diagram-utils-Nqpp4FNV.js} +1 -1
- package/dist/client/assets/preview-render-compiler-BCB8u6iM.js +1 -0
- package/dist/client/assets/{preview-render-compiler-BjLlHmiQ.js → preview-render-compiler-Tkc6JX1O.js} +2 -2
- package/dist/client/assets/{preview-render-profile-CR4dJZrp.js → preview-render-profile-Bf6R7v4w.js} +6 -6
- package/dist/client/assets/{preview-render-worker-B4dH2yxj.js → preview-render-worker-1LBLqgKu.js} +7 -7
- package/dist/client/assets/{pt-BR-5YFKRR5G-M7gIm2Hi.js → pt-BR-5YFKRR5G-CopLYEA6.js} +1 -1
- package/dist/client/assets/{pt-PT-GEIXXZ67-CcxWpkGj.js → pt-PT-GEIXXZ67-BjZ_Lphg.js} +1 -1
- package/dist/client/assets/{pug-DkUcLYWt.js → pug-lkTEco3G.js} +1 -1
- package/dist/client/assets/{python-CZtTmYkS.js → python-BUyhM0Ew.js} +1 -1
- package/dist/client/assets/{q-I27iQntV.js → q-Dls1OX0D.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-337W2JSQ-CYKgdx7K.js → quadrantDiagram-34T5L4WZ-2vfo0l5S.js} +1 -1
- package/dist/client/assets/{quick-switcher-controller-DcyllYpm.js → quick-switcher-controller-B1erSgJ1.js} +1 -1
- package/dist/client/assets/{r-DN_EydfL.js → r-DeZ8Mdev.js} +1 -1
- package/dist/client/assets/radar-PYXPWWZC-2jR4qZNU.js +1 -0
- package/dist/client/assets/reduce-ChpYjEUB.js +1 -0
- package/dist/client/assets/requirementDiagram-MS252O5E-CtUIQnWa.js +84 -0
- package/dist/client/assets/{ro-RO-E2P6TFZI-qR9noVzP.js → ro-RO-E2P6TFZI-DakDz5Xu.js} +1 -1
- package/dist/client/assets/{room-yJaBAoEU.js → room-z2w9b96b.js} +1 -1
- package/dist/client/assets/{ru-RU-YBIIY43T-CE4S_RX8.js → ru-RU-YBIIY43T-BMvCT-XT.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-WA2Y5GQK-CfHe3D6R.js → sankeyDiagram-XADWPNL6-tcSeuifE.js} +1 -1
- package/dist/client/assets/sequenceDiagram-FGHM5R23-DtF-1Kt2.js +157 -0
- package/dist/client/assets/{si-LK-673C2CI2-Bv6Avh3z.js → si-LK-673C2CI2-hGdH1S9E.js} +1 -1
- package/dist/client/assets/{sk-SK-CKZHQ4AP-Cnlpp55z.js → sk-SK-CKZHQ4AP-DiRA-fj8.js} +1 -1
- package/dist/client/assets/{sl-SI-557H2GWM-BfGq7AQF.js → sl-SI-557H2GWM-DN94n_1-.js} +1 -1
- package/dist/client/assets/{sparql-BOvq0dv7.js → sparql-vm8qNO8J.js} +1 -1
- package/dist/client/assets/sql-GL7dVWcd.js +1 -0
- package/dist/client/assets/src-BuiVcSz-.js +1 -0
- package/dist/client/assets/stateDiagram-FHFEXIEX-DKk7Sb0f.js +1 -0
- package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-DJUaiADr.js +1 -0
- package/dist/client/assets/subset-shared.chunk-CWNYNLru.js +1 -0
- package/dist/client/assets/{subset-worker.chunk-BSCP6IiC.js → subset-worker.chunk-kj1e3wjW.js} +1 -1
- package/dist/client/assets/{sv-SE-XOPKKDWS-B2_Vk-sp.js → sv-SE-XOPKKDWS-CkHUNABj.js} +1 -1
- package/dist/client/assets/{swift-BCxe4-cw.js → swift-CKcKnWv9.js} +1 -1
- package/dist/client/assets/{ta-IN-XBH7DQI3-BXQMZZIx.js → ta-IN-XBH7DQI3-W-157oVK.js} +1 -1
- package/dist/client/assets/{th-TH-TOCWH3R4-C-ZIYMfH.js → th-TH-TOCWH3R4-BsU-Pydr.js} +1 -1
- package/dist/client/assets/timeline-definition-GMOUNBTQ-Bs6U53Mo.js +120 -0
- package/dist/client/assets/{tr-TR-GXW6CYY5-dl702PMA.js → tr-TR-GXW6CYY5-CTddyq89.js} +1 -1
- package/dist/client/assets/treeView-SZITEDCU-DN5dP2ol.js +1 -0
- package/dist/client/assets/treemap-W4RFUUIX-Dva7DBJR.js +1 -0
- package/dist/client/assets/{turtle-GBz_E4RG.js → turtle-BkP3ExOG.js} +1 -1
- package/dist/client/assets/{uk-UA-IJKTNUDG-CUYQvSSF.js → uk-UA-IJKTNUDG-1LzXkII3.js} +1 -1
- package/dist/client/assets/{uz-UZ-TBZZEA4V-B9qw0PXX.js → uz-UZ-TBZZEA4V-kqm-qcUj.js} +1 -1
- package/dist/client/assets/{vault-api-client-p7h7cXKM.js → vault-api-client-DSx3mWkH.js} +1 -1
- package/dist/client/assets/{vault-utils-5Xr0MXCb.js → vault-utils-CRpy8MQz.js} +1 -1
- package/dist/client/assets/vennDiagram-DHZGUBPP-DNnIjRae.js +34 -0
- package/dist/client/assets/{verilog-C4wTycyo.js → verilog-DSARZZPc.js} +1 -1
- package/dist/client/assets/{vhdl-Bwndeg44.js → vhdl-CnYyYTpa.js} +1 -1
- package/dist/client/assets/{vi-VN-MULSGNVB-DqxZ_sVc.js → vi-VN-MULSGNVB-C3H2AUhm.js} +1 -1
- package/dist/client/assets/wardley-RL74JXVD-CDZW5uzY.js +1 -0
- package/dist/client/assets/wardleyDiagram-NUSXRM2D-C-scJfPY.js +20 -0
- package/dist/client/assets/{xychartDiagram-JWTSCODW-C3vA70iJ.js → xychartDiagram-5P7HB3ND-D3nQoxhz.js} +6 -6
- package/dist/client/assets/yjs-provider-reset-guard-DSPzcvAO.js +4 -0
- package/dist/client/assets/{zh-CN-MVX3E32U-BM0aLuGc.js → zh-CN-MVX3E32U-BULPbsyl.js} +1 -1
- package/dist/client/assets/{zh-HK-JNU5RLIE-dmG_YD0d.js → zh-HK-JNU5RLIE-bNGmeSaW.js} +1 -1
- package/dist/client/assets/{zh-TW-LENVCA6T-LFgbiOi3.js → zh-TW-LENVCA6T-CQDp064P.js} +1 -1
- package/dist/client/drawio-editor.html +1 -1
- package/dist/client/excalidraw-editor.html +1 -1
- package/dist/client/export-document.html +1 -1
- package/dist/client/index.html +2 -2
- package/package.json +15 -15
- package/src/client/application/app-shell/presence-feature.js +265 -34
- package/src/client/application/app-shell/ui-feature-shell.js +31 -5
- package/src/client/application/app-shell/ui-feature-tab-activity.js +1 -0
- package/src/client/application/app-shell/workspace-feature.js +5 -2
- package/src/client/application/app-shell-elements.js +3 -0
- package/src/client/application/diagram-preview-export.js +304 -0
- package/src/client/application/mermaid-preview-hydrator.js +153 -23
- package/src/client/application/plantuml-preview-hydrator.js +155 -20
- package/src/client/application/preview-diagram-utils.js +48 -8
- package/src/client/application/preview-renderer.js +2 -0
- package/src/client/application/quick-switcher-loader.js +42 -0
- package/src/client/application/workspace-route-controller.js +35 -2
- package/src/client/application/workspace-state-store.js +1 -0
- package/src/client/bootstrap/collabmd-app-shell.js +25 -20
- package/src/client/domain/diagram-action-icons.js +21 -0
- package/src/client/domain/excalidraw-api-scene-sync.js +70 -0
- package/src/client/domain/keyboard-shortcuts.js +8 -0
- package/src/client/drawio-editor.js +13 -0
- package/src/client/excalidraw-editor.js +119 -18
- package/src/client/infrastructure/excalidraw-room-client.js +42 -5
- package/src/client/infrastructure/workspace-sync-client.js +26 -3
- package/src/client/presentation/app-shell-template.js +18 -1
- package/src/client/presentation/comment-ui/comment-ui-card.js +83 -3
- package/src/client/presentation/comment-ui/comment-ui-state.js +25 -2
- package/src/client/presentation/drawio-embed-controller.js +18 -0
- package/src/client/presentation/excalidraw-embed-controller.js +7 -0
- package/src/client/presentation/file-explorer-controller.js +10 -0
- package/src/client/presentation/file-explorer-view.js +6 -0
- package/src/client/presentation/git-panel-controller.js +2 -0
- package/src/client/presentation/image-lightbox-controller.js +290 -29
- package/src/client/styles/features/collaboration-presence.css +212 -0
- package/src/client/styles/features/diagram-preview.css +71 -4
- package/src/client/styles/features/embedded-preview.css +4 -6
- package/src/client/styles/features/media-lightbox.css +2 -0
- package/src/server/config/env.js +4 -0
- package/src/server/create-app-server.js +2 -0
- package/src/server/domain/backlink-index.js +33 -72
- package/src/server/domain/bases/base-index-snapshot-store.js +46 -62
- package/src/server/domain/bases/base-query-service.js +89 -7
- package/src/server/domain/collaboration/collaboration-room.js +10 -1
- package/src/server/domain/markdown-reference-extractor.js +233 -0
- package/src/server/infrastructure/http/create-request-handler.js +1 -0
- package/src/server/infrastructure/http/create-vault-api-handler.js +2 -0
- package/src/server/infrastructure/http/create-vault-api-query-handler.js +100 -26
- package/src/server/infrastructure/persistence/vault-file-store.js +175 -4
- package/src/server/infrastructure/workspace/file-system-sync-service.js +45 -21
- package/dist/client/assets/_basePickBy-Dv0sK1l7.js +0 -1
- package/dist/client/assets/_baseUniq-DKYX57ji.js +0 -1
- package/dist/client/assets/arc-DrfYGhWk.js +0 -1
- package/dist/client/assets/architecture-PBZL5I3N-DiglIZi9.js +0 -1
- package/dist/client/assets/blockDiagram-WCTKOSBZ-GIgTqnhk.js +0 -132
- package/dist/client/assets/c4Diagram-IC4MRINW-CkHO1i_L.js +0 -10
- package/dist/client/assets/channel-CgsU9TSN.js +0 -1
- package/dist/client/assets/chunk-7E7YKBS2-TdU92i9i.js +0 -1
- package/dist/client/assets/chunk-7R4GIKGN-mqd2GwMg.js +0 -80
- package/dist/client/assets/chunk-C72U2L5F-CJKQWBtz.js +0 -1
- package/dist/client/assets/chunk-DpHwWhuW.js +0 -1
- package/dist/client/assets/chunk-EGIJ26TM-C4nq20om.js +0 -1
- package/dist/client/assets/chunk-GEFDOKGD-Bs7FmFox.js +0 -2
- package/dist/client/assets/chunk-GLR3WWYH-qQe2O5VQ.js +0 -2
- package/dist/client/assets/chunk-HHEYEP7N-DlevL8bq.js +0 -1
- package/dist/client/assets/chunk-KYZI473N-CTSCuqRb.js +0 -53
- package/dist/client/assets/chunk-L3YUKLVL-CJZMBtKF.js +0 -1
- package/dist/client/assets/chunk-MX3YWQON-DQpSwRf6.js +0 -1
- package/dist/client/assets/chunk-NU2UP6EN-DlUENSHU.js +0 -35
- package/dist/client/assets/chunk-O4XLMI2P-CcVxZh41.js +0 -7
- package/dist/client/assets/chunk-OZEHJAEY-DjBZbgu0.js +0 -1
- package/dist/client/assets/chunk-QZHKN3VN-CgLPFSk5.js +0 -1
- package/dist/client/assets/chunk-R5LLSJPH-CkjKXM73.js +0 -1
- package/dist/client/assets/chunk-WL4C6EOR-axcuKSup.js +0 -189
- package/dist/client/assets/chunk-XIRO2GV7-4wqVHjs_.js +0 -1
- package/dist/client/assets/chunk-XZSTWKYB-C8Y_hIKZ.js +0 -94
- package/dist/client/assets/chunk-YBOYWFTD-CKg4ymFF.js +0 -1
- package/dist/client/assets/classDiagram-VBA2DB6C-BHZpvOxK.js +0 -1
- package/dist/client/assets/classDiagram-v2-RAHNMMFH-DA7HMUUs.js +0 -1
- package/dist/client/assets/clike-1_ZsiVV8.js +0 -1
- package/dist/client/assets/clone-Dgi8Z4IL.js +0 -1
- package/dist/client/assets/cytoscape.esm-Czjc507F.js +0 -321
- package/dist/client/assets/dagre-CfB3Fw33.js +0 -1
- package/dist/client/assets/dagre-KLK3FWXG-CC7tq2Ky.js +0 -4
- package/dist/client/assets/diagram-E7M64L7V-CMt7BN5M.js +0 -24
- package/dist/client/assets/diagram-IFDJBPK2-BFMBUGpd.js +0 -43
- package/dist/client/assets/diagram-P4PSJMXO-CviA1xXr.js +0 -24
- package/dist/client/assets/dist-3bQB_we3.js +0 -1
- package/dist/client/assets/dist-8Igu3Ee_2.js +0 -1
- package/dist/client/assets/dist-BU8uusJX.js +0 -1
- package/dist/client/assets/dist-BVB8rn7o.js +0 -1
- package/dist/client/assets/dist-D5QOYy7y.js +0 -6
- package/dist/client/assets/dist-DIi0uqLJ.js +0 -1
- package/dist/client/assets/dist-DJ16N7ol.js +0 -1
- package/dist/client/assets/dist-DWJL3_bF.js +0 -13
- package/dist/client/assets/dist-O1z0Ayg0.js +0 -1
- package/dist/client/assets/dist-OQE68wIX.js +0 -1
- package/dist/client/assets/dist-x7PIEmJu.js +0 -1
- package/dist/client/assets/drawio-editor-BMTwP5mD.js +0 -9
- package/dist/client/assets/editor-session-Dzy_85Wp.js +0 -16
- package/dist/client/assets/excalidraw-editor-CAP9F8CB.js +0 -9
- package/dist/client/assets/excalidraw-editor-Dj3i59LW.css +0 -1
- package/dist/client/assets/excalidraw-scene-BF_bT1OL.js +0 -176
- package/dist/client/assets/excalidrawEditor-DD4AvzYP.js +0 -2
- package/dist/client/assets/exportDocument-Zfwq1XVx.js +0 -2
- package/dist/client/assets/flowDiagram-PKNHOUZH-C_t-mkwb.js +0 -162
- package/dist/client/assets/ganttDiagram-A5KZAMGK-BtK9Tb--.js +0 -292
- package/dist/client/assets/gitGraph-HDMCJU4V-CT7YfbD3.js +0 -1
- package/dist/client/assets/gitGraphDiagram-K3NZZRJ6-DULDLGiJ.js +0 -65
- package/dist/client/assets/graphlib-BgRST-Qg.js +0 -1
- package/dist/client/assets/image-XLNPCCAD-CFiKwiWK.js +0 -1
- package/dist/client/assets/image-blob-reduce.esm-DriR2zT9.js +0 -2
- package/dist/client/assets/info-3K5VOQVL-DUpNyDC-.js +0 -1
- package/dist/client/assets/isArrayLikeObject-BId_dPHM.js +0 -1
- package/dist/client/assets/isEmpty-CVvRj8fj.js +0 -1
- package/dist/client/assets/ishikawaDiagram-PHBUUO56-DpBuDpC6.js +0 -70
- package/dist/client/assets/javascript-UJe68_xi.js +0 -1
- package/dist/client/assets/line-B2GMovaI.js +0 -1
- package/dist/client/assets/main-CfSHaGes.js +0 -1368
- package/dist/client/assets/math-B-LMBwub.js +0 -1
- package/dist/client/assets/mermaid-parser.core-B1ogGcR8.js +0 -4
- package/dist/client/assets/mermaid-runtime-Bn8A6DGx.js +0 -11
- package/dist/client/assets/packet-RMMSAZCW-DEwNbIrA.js +0 -1
- package/dist/client/assets/percentages-5DKR754L-D7n4T776.js +0 -1
- package/dist/client/assets/pica-C1TdTz-C.js +0 -2
- package/dist/client/assets/pie-UPGHQEXC-D5M_lSjo.js +0 -1
- package/dist/client/assets/pieDiagram-SKSYHLDU-jhHouFpk.js +0 -30
- package/dist/client/assets/preview-render-compiler-Duy_3IcP.js +0 -1
- package/dist/client/assets/radar-KQ55EAFF-AU1qh3Bw.js +0 -1
- package/dist/client/assets/requirementDiagram-Z7DCOOCP-D9SHxoW7.js +0 -73
- package/dist/client/assets/sequenceDiagram-2WXFIKYE-CZsMMqAJ.js +0 -145
- package/dist/client/assets/sql-DDFeQNTK.js +0 -1
- package/dist/client/assets/src-Pgt9Gp65.js +0 -1
- package/dist/client/assets/stateDiagram-RAJIS63D-CoNZjTYV.js +0 -1
- package/dist/client/assets/stateDiagram-v2-FVOUBMTO-1zOw6NmQ.js +0 -1
- package/dist/client/assets/subset-shared.chunk-C9HjwTXy.js +0 -1
- package/dist/client/assets/timeline-definition-YZTLITO2-DSe2mrG8.js +0 -61
- package/dist/client/assets/treemap-KZPCXAKY-C9UI2fwP.js +0 -1
- package/dist/client/assets/vennDiagram-LZ73GAT5-xSzaIpy1.js +0 -34
- package/dist/client/assets/yjs-provider-reset-guard-CtERLBID.js +0 -4
- /package/dist/client/assets/{drawio-room-DEivFyNV.js → drawio-room-1i6Nn0_Z.js} +0 -0
- /package/dist/client/assets/{excalidraw-mermaid-stub-BZPU4ZhU.js → excalidraw-mermaid-stub-DzxtBcQW.js} +0 -0
- /package/dist/client/assets/{file-kind-DBptLlF_.js → file-kind-DmKq2MvD.js} +0 -0
- /package/dist/client/assets/{rough.esm-DE_lJ5Ge.js → rough.esm-BU2knLt9.js} +0 -0
- /package/dist/client/assets/{runtime-config-CqhchMC4.js → runtime-config-DWTejofP.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./chunk-SRAX5OIU-
|
|
1
|
+
import"./chunk-SRAX5OIU-yDw8XRsi.js";var e={paste:`貼上`,pasteAsPlaintext:`以純文字貼上`,pasteCharts:`貼上圖表`,selectAll:`全選`,multiSelect:`將物件加入選取範圍`,moveCanvas:`移動畫布`,cut:`剪下`,copy:`複製`,copyAsPng:`以 PNG 格式儲存到剪貼簿`,copyAsSvg:`以 SVG 格式複製到剪貼簿`,copyText:`以文字格式複製至剪貼簿`,copySource:`複製來源至剪貼簿`,convertToCode:`轉換為程式碼`,bringForward:`上移一層`,sendToBack:`移到最底層`,bringToFront:`置於最頂層`,sendBackward:`往後移一層`,delete:`刪除`,copyStyles:`複製樣式`,pasteStyles:`貼上樣式`,stroke:`筆畫`,changeStroke:`變更筆畫顏色`,background:`背景`,changeBackground:`變更背景顏色`,fill:`填滿`,strokeWidth:`筆跡寬度`,strokeStyle:`筆畫樣式`,strokeStyle_solid:`實線`,strokeStyle_dashed:`虛線`,strokeStyle_dotted:`點線`,sloppiness:`線條風格`,opacity:`透明度`,textAlign:`文字對齊`,edges:`邊緣`,sharp:`尖銳`,round:`平滑`,arrowheads:`箭頭`,arrowhead_none:`無`,arrowhead_arrow:`箭頭`,arrowhead_bar:`條狀箭頭`,arrowhead_circle:`圓形`,arrowhead_circle_outline:`圓形(外框)`,arrowhead_triangle:`三角形`,arrowhead_triangle_outline:`三角形(外框)`,arrowhead_diamond:`菱形`,arrowhead_diamond_outline:`菱形(外框)`,arrowhead_crowfoot_many:`雞爪符號(多)`,arrowhead_crowfoot_one:`雞爪符號(一)`,arrowhead_crowfoot_one_or_many:`雞爪符號(一或多)`,more_options:`更多選項`,arrowtypes:`箭頭類型`,arrowtype_sharp:`尖銳箭頭`,arrowtype_round:`彎角箭頭`,arrowtype_elbowed:`直角箭頭`,fontSize:`字型大小`,fontFamily:`字型系列`,addWatermark:`加上「以 Excalidraw 製作」浮水印`,handDrawn:`手寫`,normal:`一般`,code:`代碼`,small:`小`,medium:`中`,large:`大`,veryLarge:`特大`,solid:`實心`,hachure:`斜線筆觸`,zigzag:`Z字形`,crossHatch:`交叉筆觸`,thin:`細`,bold:`粗`,left:`左側`,center:`置中`,right:`右側`,extraBold:`極粗`,architect:`精確`,artist:`藝術`,cartoonist:`卡通`,fileTitle:`檔案名稱`,colorPicker:`色彩選擇工具`,canvasColors:`使用於畫布`,canvasBackground:`Canvas 背景`,drawingCanvas:`繪圖 canvas`,clearCanvas:`清除畫布`,layers:`圖層`,actions:`動作`,language:`語言`,liveCollaboration:`即時協作...`,duplicateSelection:`複製`,untitled:`無標題`,name:`名稱`,yourName:`你的名稱`,madeWithExcalidraw:`以 Excalidraw 製作`,group:`建立群組`,ungroup:`取消群組`,collaborators:`協作者`,toggleGrid:`切換網格`,addToLibrary:`加入資料庫`,removeFromLibrary:`從資料庫中移除`,libraryLoadingMessage:`資料庫讀取中…`,libraries:`瀏覽資料庫`,loadingScene:`場景讀取中…`,loadScene:`從檔案載入場景`,align:`對齊`,alignTop:`對齊頂部`,alignBottom:`對齊底部`,alignLeft:`對齊左側`,alignRight:`對齊右側`,centerVertically:`垂直置中`,centerHorizontally:`水平置中`,distributeHorizontally:`水平分布`,distributeVertically:`垂直分布`,flipHorizontal:`水平翻轉`,flipVertical:`垂直翻轉`,viewMode:`檢視模式`,share:`分享`,showStroke:`顯示線條檢色器`,showBackground:`顯示背景檢色器`,showFonts:`顯示字型選單`,toggleTheme:`切換淺色/深色主題`,theme:`主題`,personalLib:`個人資料庫`,excalidrawLib:`Excalidraw 資料庫`,decreaseFontSize:`縮小文字`,increaseFontSize:`放大文字`,unbindText:`取消綁定文字`,bindText:`結合文字至容器`,createContainerFromText:`將文字包於容器中`,link:{edit:`編輯連結`,editEmbed:`編輯可嵌入連結`,create:`新增連結`,label:`連結`,labelEmbed:`連結與嵌入`,empty:`未設定連結`,hint:`在此輸入或貼上連結`,goToElement:`移至目標元素`},lineEditor:{edit:`編輯線條`,editArrow:`編輯箭頭`},polygon:{breakPolygon:``,convertToPolygon:``},elementLock:{lock:`鎖定`,unlock:`解鎖`,lockAll:`全部鎖定`,unlockAll:`全部解鎖`},statusPublished:`已發布`,sidebarLock:`側欄維持開啟`,selectAllElementsInFrame:`選取框架內的所有元素`,removeAllElementsFromFrame:`從框架內移除所有元素`,eyeDropper:`從畫布中選取顏色`,textToDiagram:`文字轉圖表`,prompt:`提示詞`,followUs:`追蹤我們`,discordChat:`Discord 聊天室`,zoomToFitViewport:`縮放至符合 viewport`,zoomToFitSelection:`縮放至符合選取區`,zoomToFit:`縮放至顯示所有元素`,installPWA:`於本機安裝 Excalidraw (PWA)`,autoResize:`啟用文字自動縮放`,imageCropping:`圖片剪裁`,unCroppedDimension:`未剪裁尺寸`,copyElementLink:`複製此物件的連結`,linkToElement:`連結至物件`,wrapSelectionInFrame:`將選取內容放入框架`,tab:``,shapeSwitch:``},t={title:`連結至物件`,desc:`點擊畫布上的形狀或貼上連結`,notFound:`無法在畫布上找到連結的物件`},n={noItems:`尚未加入任何物件...`,hint_emptyLibrary:`選取畫布上的物件以加入,或從下方的公開儲存庫中安裝資料庫。`,hint_emptyPrivateLibrary:`選擇畫布上的物件以在此加入。`,search:{inputPlaceholder:``,heading:``,noResults:``,clearSearch:``}},r={title:`在畫布上尋找`,noMatch:`未找到符合項目…`,singleResult:`結果`,multipleResults:`結果`,placeholder:`在畫布上尋找文字…`,frames:``,texts:``},i={clearReset:`重設畫布`,exportJSON:`匯出至檔案`,exportImage:`匯出圖片`,export:`儲存至...`,copyToClipboard:`複製至剪貼簿`,copyLink:`複製連結`,save:`儲存目前檔案`,saveAs:`儲存為`,load:`開啟`,getShareableLink:`取得共享連結`,close:`關閉`,selectLanguage:`選擇語言`,scrollBackToContent:`捲動回到內容`,zoomIn:`放大`,zoomOut:`縮小`,resetZoom:`重設縮放`,menu:`選單`,done:`完成`,edit:`編輯`,undo:`復原`,redo:`重做`,resetLibrary:`重設資料庫`,createNewRoom:`建立新協作會議室`,fullScreen:`全螢幕`,darkMode:`深色模式`,lightMode:`淺色模式`,systemMode:`系統模式`,zenMode:`專注模式`,objectsSnapMode:`吸附至物件`,exitZenMode:`離開專注模式`,cancel:`取消`,saveLibNames:``,clear:`清除`,remove:`刪除`,embed:`切換嵌入`,publishLibrary:``,submit:`送出`,confirm:`確認`,embeddableInteractionButton:`點擊以互動`},a={clearReset:`這將會清除整個 canvas。你確定嗎?`,couldNotCreateShareableLink:`無法建立共享連結。`,couldNotCreateShareableLinkTooBig:`無法建立共享連結:場景太大`,couldNotLoadInvalidFile:`無法讀取失效的檔案。`,importBackendFailed:`後端讀取失敗。`,cannotExportEmptyCanvas:`無法輸出空白的 canvas。`,couldNotCopyToClipboard:`無法複製到剪貼簿`,decryptFailed:`無法解密資料。`,uploadedSecurly:`上傳已通過 end-to-end 加密,Excalidraw 伺服器和第三方無法皆讀取其內容。`,loadSceneOverridePrompt:`讀取外部圖樣將取代目前的內容。是否要繼續?`,collabStopOverridePrompt:`停止連線將覆蓋您先前於本機儲存的繪圖進度,是否確認?
|
|
2
2
|
|
|
3
3
|
(如要保留原有的本機繪圖進度,直接關閉瀏覽器分頁即可。)`,errorAddingToLibrary:`無法於此資料庫加入項目`,errorRemovingFromLibrary:`無法由此資料庫移除項目`,confirmAddLibrary:`這將會將 {{numShapes}} 個圖形加入你的資料庫,你確定嗎?`,imageDoesNotContainScene:`此圖檔中未包含場景資料。輸出檔案時是否有包含場景資料?`,cannotRestoreFromImage:`無法由此檔案回復場景。`,invalidSceneUrl:`無法由提供的 URL 匯入場景。可能是發生異常,或未包含有效的 Excalidraw JSON 資料。`,resetLibrary:`這會清除您的資料庫,是否確定?`,removeItemsFromsLibrary:`從資料庫刪除 {{count}} 項?`,invalidEncryptionKey:`加密鍵必須為22字元。即時協作已停用。`,collabOfflineWarning:`沒有可用的網路連線。
|
|
4
4
|
變更無法儲存!`,localStorageQuotaExceeded:``},o={unsupportedFileType:`不支援的檔案類型。`,imageInsertError:`無法插入圖片。請稍後再試…`,fileTooBig:`檔案過大。可接受的最大尺寸為 {{maxSize}} 。`,svgImageInsertError:`無法插入 SVG 圖片。此 SVG 檔案有問題。`,failedToFetchImage:`無法獲取圖片。`,cannotResolveCollabServer:`無法連結至 collab 伺服器。請重新整理後再試一次。`,importLibraryError:`無法載入資料庫`,saveLibraryError:`無法將資料庫存至儲存區。請將資料庫存至本機檔案以確保不會失去已變更的部分。`,collabSaveFailed:`無法儲存至後端資料庫。若此問題持續發生,請將檔案儲存於本機以確保資料不會遺失。`,collabSaveFailed_sizeExceeded:`無法儲存至後端資料庫,可能的原因為畫布尺寸過大。請將檔案儲存於本機以確保資料不會遺失。`,imageToolNotSupported:`圖片已停用`,brave_measure_text_error:{line1:`看起來您開啟了 Brave 瀏覽器的 <bold>Aggressively Block Fingerprinting</bold> 設定。`,line2:`這可能造成您畫布中 <bold>文字元素</bold> 的異常。`,line3:`我們強烈建議您關閉此設定。您可以依照 <link>這些步驟</link> 來進行。`,line4:`若關閉此設定並未修復文字元素的顯示問題,請回報於我們 GitHub 上的 <issueLink>issue</issueLink>,或在 <discordLink>Discord</discordLink> 上告訴我們。`},libraryElementTypeError:{embeddable:`可嵌入元素無法加入資料庫`,iframe:`IFrame 元素無法加入資料庫`,image:`即將支援加入圖片至資料庫!`},asyncPasteFailedOnRead:`無法貼上(無法由系統剪貼簿讀入)`,asyncPasteFailedOnParse:`無法貼上`,copyToSystemClipboardFailed:`無法複製至剪貼簿`},s={selection:`選取`,lasso:``,image:`插入圖片`,rectangle:`長方形`,diamond:`菱形`,ellipse:`橢圓`,arrow:`箭頭`,line:`線條`,freedraw:`繪圖`,text:`文字`,library:`資料庫`,lock:`可連續使用選取的工具`,penMode:`筆模式 - 避免觸摸`,link:`為所選的形狀增加\b/更新連結`,eraser:`橡皮擦`,frame:`框架工具`,magicframe:`線框稿轉為程式碼`,embeddable:`嵌入網站`,laser:`雷射筆`,hand:`手形(平移工具)`,extraTools:`更多工具`,mermaidToExcalidraw:`Mermaid 至 Excalidraw`,convertElementType:``},c={rectangle:`矩形`,diamond:`菱形`,ellipse:`橢圓形`,arrow:`箭頭`,line:`線條`,freedraw:`自由繪圖`,text:`文字`,image:`圖片`,group:`群組`,frame:`框架`,magicframe:`線框稿轉為程式碼`,embeddable:`嵌入網站`,selection:`已選項目`,iframe:`IFrame框架`},l={canvasActions:`canvas 動作`,selectedShapeActions:`選取圖形動作`,shapes:`形狀`},u={dismissSearch:``,canvasPanning:``,linearElement:`點擊以繪製多點曲線;或拖曳以繪製直線`,arrowTool:``,arrowBindModifiers:``,freeDraw:`點擊並拖曳來繪圖,放開即結束`,text:`提示:亦可使用選取工具在任何地方雙擊來加入文字`,embeddable:`點擊並拖移以建立嵌入網站`,text_selected:``,text_editing:``,linearElementMulti:``,lockAngle:``,resize:``,resizeImage:``,rotate:``,lineEditor_info:``,lineEditor_line_info:``,lineEditor_pointSelected:``,lineEditor_nothingSelected:``,publishLibrary:`發布個人資料庫`,bindTextToElement:``,createFlowchart:``,deepBoxSelect:``,eraserRevert:``,firefox_clipboard_write:`此功能有機會透過將 "dom.events.asyncClipboard.clipboardItem" 設定為 "true" 來開啟。
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>draw.io — CollabMD</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/drawioEditor-
|
|
7
|
+
<script type="module" crossorigin src="./assets/drawioEditor-B65FWq-b.js"></script>
|
|
8
8
|
<link rel="modulepreload" crossorigin href="./assets/runtime-config-loader-_D2KZKn-.js">
|
|
9
9
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-Bo9GmnuQ.js">
|
|
10
10
|
</head>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Excalidraw — CollabMD</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/excalidrawEditor-
|
|
7
|
+
<script type="module" crossorigin src="./assets/excalidrawEditor-BnbblxK4.js"></script>
|
|
8
8
|
<link rel="modulepreload" crossorigin href="./assets/runtime-config-loader-_D2KZKn-.js">
|
|
9
9
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-Bo9GmnuQ.js">
|
|
10
10
|
</head>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>CollabMD Export</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/exportDocument-
|
|
7
|
+
<script type="module" crossorigin src="./assets/exportDocument-CULEGKmb.js"></script>
|
|
8
8
|
<link rel="modulepreload" crossorigin href="./assets/runtime-config-loader-_D2KZKn-.js">
|
|
9
9
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-Bo9GmnuQ.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="./assets/base-h1uscjTi.js">
|
package/dist/client/index.html
CHANGED
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
document.documentElement.setAttribute('data-initial-file-requested', 'true');
|
|
16
16
|
}
|
|
17
17
|
</script>
|
|
18
|
-
<script type="module" crossorigin src="./assets/index-
|
|
18
|
+
<script type="module" crossorigin src="./assets/index-BjdYZiBM.js"></script>
|
|
19
19
|
<link rel="modulepreload" crossorigin href="./assets/runtime-config-loader-_D2KZKn-.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="./assets/preload-helper-Bo9GmnuQ.js">
|
|
21
21
|
<link rel="modulepreload" crossorigin href="./assets/base-h1uscjTi.js">
|
|
22
22
|
<link rel="stylesheet" crossorigin href="./assets/base-CaIEJUF9.css">
|
|
23
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
23
|
+
<link rel="stylesheet" crossorigin href="./assets/index-BryqP9QY.css">
|
|
24
24
|
</head>
|
|
25
25
|
<body>
|
|
26
26
|
<div id="appRoot"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "collabmd",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.36",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Collaborative markdown vault — like Obsidian, but online. Serve any directory of markdown files for realtime collaborative editing.",
|
|
6
6
|
"repository": {
|
|
@@ -66,11 +66,11 @@
|
|
|
66
66
|
"@codemirror/lang-yaml": "^6.1.3",
|
|
67
67
|
"@codemirror/language": "^6.12.3",
|
|
68
68
|
"@codemirror/language-data": "^6.5.2",
|
|
69
|
-
"@codemirror/search": "^6.
|
|
69
|
+
"@codemirror/search": "^6.7.0",
|
|
70
70
|
"@codemirror/state": "^6.6.0",
|
|
71
71
|
"@codemirror/theme-one-dark": "^6.1.3",
|
|
72
|
-
"@codemirror/view": "^6.
|
|
73
|
-
"@excalidraw/excalidraw": "0.18.0-
|
|
72
|
+
"@codemirror/view": "^6.41.1",
|
|
73
|
+
"@excalidraw/excalidraw": "0.18.0-b1c6bfc",
|
|
74
74
|
"@fontsource-variable/inter": "^5.2.8",
|
|
75
75
|
"@fontsource/jetbrains-mono": "^5.2.8",
|
|
76
76
|
"@turbodocx/html-to-docx": "^1.20.1",
|
|
@@ -80,10 +80,10 @@
|
|
|
80
80
|
"lib0": "^0.2.117",
|
|
81
81
|
"lit-html": "^3.3.2",
|
|
82
82
|
"markdown-it": "^14.1.1",
|
|
83
|
-
"mermaid": "^11.
|
|
84
|
-
"openid-client": "^6.8.
|
|
85
|
-
"react": "^19.2.
|
|
86
|
-
"react-dom": "^19.2.
|
|
83
|
+
"mermaid": "^11.14.0",
|
|
84
|
+
"openid-client": "^6.8.3",
|
|
85
|
+
"react": "^19.2.5",
|
|
86
|
+
"react-dom": "^19.2.5",
|
|
87
87
|
"sharp": "^0.34.5",
|
|
88
88
|
"ws": "^8.20.0",
|
|
89
89
|
"y-codemirror.next": "^0.3.5",
|
|
@@ -98,12 +98,12 @@
|
|
|
98
98
|
},
|
|
99
99
|
"devDependencies": {
|
|
100
100
|
"@eslint/js": "^10.0.1",
|
|
101
|
-
"@playwright/test": "^1.
|
|
102
|
-
"@vitest/browser": "^4.1.
|
|
103
|
-
"@vitest/browser-playwright": "^4.1.
|
|
104
|
-
"eslint": "^10.1
|
|
105
|
-
"globals": "^17.
|
|
106
|
-
"vite": "^8.0.
|
|
107
|
-
"vitest": "^4.1.
|
|
101
|
+
"@playwright/test": "^1.59.1",
|
|
102
|
+
"@vitest/browser": "^4.1.5",
|
|
103
|
+
"@vitest/browser-playwright": "^4.1.5",
|
|
104
|
+
"eslint": "^10.2.1",
|
|
105
|
+
"globals": "^17.5.0",
|
|
106
|
+
"vite": "^8.0.10",
|
|
107
|
+
"vitest": "^4.1.5"
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -1,3 +1,65 @@
|
|
|
1
|
+
const MAX_INLINE_AVATARS = 5;
|
|
2
|
+
|
|
3
|
+
function compareUserNames(left, right) {
|
|
4
|
+
return String(left?.name ?? '').localeCompare(String(right?.name ?? ''), undefined, {
|
|
5
|
+
sensitivity: 'base',
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function getConnectedPresenceState(context) {
|
|
10
|
+
const hasEditorSession = Boolean(context.session);
|
|
11
|
+
const isDrawioRoute = Boolean(context.currentFilePath && context.isDrawioFile?.(context.currentFilePath));
|
|
12
|
+
const isExcalidrawRoute = Boolean(context.currentFilePath && context.isExcalidrawFile?.(context.currentFilePath));
|
|
13
|
+
const isImageRoute = Boolean(context.currentFilePath && context.isImageFile?.(context.currentFilePath));
|
|
14
|
+
const shouldUseLobbyState = !hasEditorSession
|
|
15
|
+
&& (!context.currentFilePath || isDrawioRoute || isExcalidrawRoute || isImageRoute);
|
|
16
|
+
return shouldUseLobbyState
|
|
17
|
+
? context.lobby?.getConnectionState?.() ?? context.connectionState
|
|
18
|
+
: context.connectionState;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function getInlineUsers(users, followedUserClientId) {
|
|
22
|
+
const visibleUsers = [...users];
|
|
23
|
+
const localIndex = visibleUsers.findIndex((user) => user.isLocal);
|
|
24
|
+
if (localIndex > 0) {
|
|
25
|
+
const [localUser] = visibleUsers.splice(localIndex, 1);
|
|
26
|
+
visibleUsers.unshift(localUser);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const followedIndex = visibleUsers.findIndex((user) => !user.isLocal && user.clientId === followedUserClientId);
|
|
30
|
+
const followedInsertIndex = visibleUsers[0]?.isLocal ? 1 : 0;
|
|
31
|
+
if (followedIndex > followedInsertIndex) {
|
|
32
|
+
const [followed] = visibleUsers.splice(followedIndex, 1);
|
|
33
|
+
visibleUsers.splice(followedInsertIndex, 0, followed);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return visibleUsers;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function getPanelUsers(users, followedUserClientId) {
|
|
40
|
+
const localUsers = users.filter((user) => user.isLocal).sort(compareUserNames);
|
|
41
|
+
const remoteUsers = users.filter((user) => !user.isLocal);
|
|
42
|
+
const followedUsers = remoteUsers
|
|
43
|
+
.filter((user) => user.clientId === followedUserClientId)
|
|
44
|
+
.sort(compareUserNames);
|
|
45
|
+
const remainingUsers = remoteUsers
|
|
46
|
+
.filter((user) => user.clientId !== followedUserClientId)
|
|
47
|
+
.sort(compareUserNames);
|
|
48
|
+
return [...localUsers, ...followedUsers, ...remainingUsers];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function getUserFileLabel(context, user) {
|
|
52
|
+
if (user.currentFile && user.currentFile === context.currentFilePath) {
|
|
53
|
+
return 'Here';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (user.currentFile) {
|
|
57
|
+
return context.getDisplayName(user.currentFile);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return 'No file';
|
|
61
|
+
}
|
|
62
|
+
|
|
1
63
|
export const presenceFeature = {
|
|
2
64
|
updateGlobalUsers(users) {
|
|
3
65
|
this.globalUsers = users;
|
|
@@ -16,52 +78,50 @@ export const presenceFeature = {
|
|
|
16
78
|
const badge = this.elements.userCount;
|
|
17
79
|
if (!badge) return;
|
|
18
80
|
|
|
19
|
-
const
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
81
|
+
const effectiveConnectionState = getConnectedPresenceState(this);
|
|
82
|
+
const hasUsers = this.globalUsers.length > 0;
|
|
83
|
+
if (effectiveConnectionState.status !== 'connected') {
|
|
84
|
+
this.presencePanelOpen = false;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
badge.type = 'button';
|
|
88
|
+
badge.setAttribute('aria-controls', 'presencePanel');
|
|
89
|
+
badge.setAttribute('aria-expanded', String(this.presencePanelOpen));
|
|
90
|
+
badge.classList.toggle('is-active', this.presencePanelOpen);
|
|
28
91
|
|
|
29
92
|
if (effectiveConnectionState.status === 'connected') {
|
|
30
93
|
badge.textContent = `${this.globalUsers.length} online`;
|
|
31
94
|
badge.style.opacity = '1';
|
|
95
|
+
badge.disabled = !hasUsers;
|
|
96
|
+
badge.setAttribute('aria-label', `Show ${this.globalUsers.length} online users`);
|
|
97
|
+
this.renderPresencePanel();
|
|
32
98
|
return;
|
|
33
99
|
}
|
|
34
100
|
|
|
35
101
|
if (effectiveConnectionState.status === 'connecting') {
|
|
36
102
|
badge.textContent = effectiveConnectionState.unreachable ? 'Unreachable' : 'Connecting...';
|
|
37
103
|
badge.style.opacity = '0.6';
|
|
104
|
+
badge.disabled = true;
|
|
105
|
+
badge.setAttribute('aria-label', badge.textContent);
|
|
106
|
+
this.renderPresencePanel();
|
|
38
107
|
return;
|
|
39
108
|
}
|
|
40
109
|
|
|
41
110
|
badge.textContent = 'Offline';
|
|
42
111
|
badge.style.opacity = '0.6';
|
|
112
|
+
badge.disabled = true;
|
|
113
|
+
badge.setAttribute('aria-label', 'Offline');
|
|
114
|
+
this.renderPresencePanel();
|
|
43
115
|
},
|
|
44
116
|
|
|
45
117
|
renderAvatars() {
|
|
46
118
|
const avatars = this.elements.userAvatars;
|
|
47
119
|
if (!avatars) return;
|
|
48
120
|
|
|
49
|
-
avatars.
|
|
50
|
-
const visibleUsers =
|
|
51
|
-
const localIndex = visibleUsers.findIndex((u) => u.isLocal);
|
|
52
|
-
if (localIndex > 0) {
|
|
53
|
-
const [localUser] = visibleUsers.splice(localIndex, 1);
|
|
54
|
-
visibleUsers.unshift(localUser);
|
|
55
|
-
}
|
|
121
|
+
avatars.replaceChildren();
|
|
122
|
+
const visibleUsers = getInlineUsers(this.globalUsers, this.followedUserClientId);
|
|
56
123
|
|
|
57
|
-
|
|
58
|
-
const followedInsertIndex = visibleUsers[0]?.isLocal ? 1 : 0;
|
|
59
|
-
if (followedIndex > followedInsertIndex) {
|
|
60
|
-
const [followed] = visibleUsers.splice(followedIndex, 1);
|
|
61
|
-
visibleUsers.splice(followedInsertIndex, 0, followed);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
visibleUsers.slice(0, 5).forEach((user) => {
|
|
124
|
+
visibleUsers.slice(0, MAX_INLINE_AVATARS).forEach((user) => {
|
|
65
125
|
const avatar = document.createElement(user.isLocal ? 'div' : 'button');
|
|
66
126
|
avatar.className = 'user-avatar';
|
|
67
127
|
avatar.classList.toggle('is-local', user.isLocal);
|
|
@@ -103,34 +163,192 @@ export const presenceFeature = {
|
|
|
103
163
|
avatars.appendChild(avatar);
|
|
104
164
|
});
|
|
105
165
|
|
|
106
|
-
if (visibleUsers.length >
|
|
107
|
-
const overflow = document.createElement('
|
|
108
|
-
overflow.
|
|
166
|
+
if (visibleUsers.length > MAX_INLINE_AVATARS) {
|
|
167
|
+
const overflow = document.createElement('button');
|
|
168
|
+
overflow.type = 'button';
|
|
169
|
+
overflow.className = 'user-avatar user-avatar-button user-avatar-overflow-trigger';
|
|
109
170
|
overflow.style.backgroundColor = 'var(--color-surface-dynamic)';
|
|
110
171
|
overflow.style.color = 'var(--color-text-muted)';
|
|
172
|
+
overflow.setAttribute('aria-controls', 'presencePanel');
|
|
173
|
+
overflow.setAttribute('aria-expanded', String(this.presencePanelOpen));
|
|
174
|
+
overflow.setAttribute('aria-label', `Show ${visibleUsers.length} online users`);
|
|
175
|
+
overflow.setAttribute('data-presence-panel-trigger', 'true');
|
|
176
|
+
overflow.title = `Show ${visibleUsers.length} online users`;
|
|
177
|
+
overflow.addEventListener('click', () => this.openPresencePanel());
|
|
111
178
|
const overflowLabel = document.createElement('span');
|
|
112
179
|
overflowLabel.className = 'user-avatar-initial';
|
|
113
|
-
overflowLabel.textContent = `+${visibleUsers.length -
|
|
180
|
+
overflowLabel.textContent = `+${visibleUsers.length - MAX_INLINE_AVATARS}`;
|
|
114
181
|
overflow.appendChild(overflowLabel);
|
|
115
182
|
avatars.appendChild(overflow);
|
|
116
183
|
}
|
|
184
|
+
|
|
185
|
+
this.renderPresencePanel();
|
|
117
186
|
},
|
|
118
187
|
|
|
119
|
-
|
|
120
|
-
|
|
188
|
+
openPresencePanel() {
|
|
189
|
+
const effectiveConnectionState = getConnectedPresenceState(this);
|
|
190
|
+
if (effectiveConnectionState.status !== 'connected' || this.globalUsers.length === 0) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
121
193
|
|
|
122
|
-
|
|
123
|
-
|
|
194
|
+
this.presencePanelOpen = true;
|
|
195
|
+
this.closeChatPanel?.();
|
|
196
|
+
this.closeToolbarOverflowMenu?.();
|
|
197
|
+
this.renderAvatars();
|
|
198
|
+
this.renderPresence();
|
|
199
|
+
this.renderPresencePanel();
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
closePresencePanel() {
|
|
203
|
+
if (!this.presencePanelOpen) {
|
|
124
204
|
return;
|
|
125
205
|
}
|
|
126
206
|
|
|
127
|
-
|
|
207
|
+
this.presencePanelOpen = false;
|
|
208
|
+
this.renderAvatars();
|
|
209
|
+
this.renderPresence();
|
|
210
|
+
this.renderPresencePanel();
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
togglePresencePanel() {
|
|
214
|
+
if (this.presencePanelOpen) {
|
|
215
|
+
this.closePresencePanel();
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
this.openPresencePanel();
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
renderPresencePanel() {
|
|
223
|
+
const panel = this.elements.presencePanel;
|
|
224
|
+
const list = this.elements.presencePanelList;
|
|
225
|
+
const status = this.elements.presencePanelStatus;
|
|
226
|
+
if (!panel || !list) return;
|
|
227
|
+
|
|
228
|
+
panel.classList.toggle('hidden', !this.presencePanelOpen);
|
|
229
|
+
panel.setAttribute('aria-hidden', String(!this.presencePanelOpen));
|
|
230
|
+
|
|
231
|
+
const orderedUsers = getPanelUsers(this.globalUsers, this.followedUserClientId);
|
|
232
|
+
const effectiveConnectionState = getConnectedPresenceState(this);
|
|
233
|
+
if (status) {
|
|
234
|
+
if (effectiveConnectionState.status === 'connected') {
|
|
235
|
+
status.textContent = `${this.globalUsers.length} online. Click someone to follow.`;
|
|
236
|
+
} else if (effectiveConnectionState.status === 'connecting') {
|
|
237
|
+
status.textContent = effectiveConnectionState.unreachable ? 'Server unreachable.' : 'Connecting presence...';
|
|
238
|
+
} else {
|
|
239
|
+
status.textContent = 'Presence is offline.';
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
list.replaceChildren();
|
|
244
|
+
|
|
245
|
+
if (orderedUsers.length === 0) {
|
|
246
|
+
const emptyState = document.createElement('div');
|
|
247
|
+
emptyState.className = 'presence-panel-empty-state';
|
|
248
|
+
emptyState.textContent = effectiveConnectionState.status === 'connected'
|
|
249
|
+
? 'Nobody else is here yet.'
|
|
250
|
+
: 'Presence will appear here when the connection is active.';
|
|
251
|
+
list.appendChild(emptyState);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const fragment = document.createDocumentFragment();
|
|
256
|
+
orderedUsers.forEach((user) => {
|
|
257
|
+
const row = document.createElement('article');
|
|
258
|
+
row.className = 'presence-panel-user';
|
|
259
|
+
row.classList.toggle('is-local', user.isLocal);
|
|
260
|
+
row.classList.toggle('is-following', user.clientId === this.followedUserClientId);
|
|
261
|
+
|
|
262
|
+
const primaryAction = document.createElement(user.isLocal ? 'div' : 'button');
|
|
263
|
+
primaryAction.className = 'presence-panel-user-button';
|
|
264
|
+
|
|
265
|
+
const avatar = document.createElement('span');
|
|
266
|
+
avatar.className = 'presence-panel-user-avatar';
|
|
267
|
+
avatar.style.backgroundColor = user.color;
|
|
268
|
+
avatar.textContent = user.name.charAt(0).toUpperCase();
|
|
269
|
+
avatar.setAttribute('aria-hidden', 'true');
|
|
270
|
+
|
|
271
|
+
const body = document.createElement('span');
|
|
272
|
+
body.className = 'presence-panel-user-body';
|
|
273
|
+
|
|
274
|
+
const topLine = document.createElement('span');
|
|
275
|
+
topLine.className = 'presence-panel-user-topline';
|
|
276
|
+
|
|
277
|
+
const name = document.createElement('span');
|
|
278
|
+
name.className = 'presence-panel-user-name';
|
|
279
|
+
name.textContent = user.name;
|
|
280
|
+
topLine.appendChild(name);
|
|
281
|
+
|
|
282
|
+
if (user.isLocal) {
|
|
283
|
+
const youBadge = document.createElement('span');
|
|
284
|
+
youBadge.className = 'presence-panel-user-badge';
|
|
285
|
+
youBadge.textContent = 'You';
|
|
286
|
+
topLine.appendChild(youBadge);
|
|
287
|
+
} else if (user.clientId === this.followedUserClientId) {
|
|
288
|
+
const followingBadge = document.createElement('span');
|
|
289
|
+
followingBadge.className = 'presence-panel-user-badge';
|
|
290
|
+
followingBadge.textContent = 'Following';
|
|
291
|
+
topLine.appendChild(followingBadge);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
const file = document.createElement('span');
|
|
295
|
+
file.className = 'presence-panel-user-file';
|
|
296
|
+
file.textContent = getUserFileLabel(this, user);
|
|
297
|
+
|
|
298
|
+
body.append(topLine, file);
|
|
299
|
+
primaryAction.append(avatar, body);
|
|
300
|
+
|
|
301
|
+
if (user.isLocal) {
|
|
302
|
+
primaryAction.setAttribute('role', 'group');
|
|
303
|
+
primaryAction.setAttribute('aria-label', `${user.name} (you) — ${file.textContent}`);
|
|
304
|
+
} else {
|
|
305
|
+
const isFollowing = user.clientId === this.followedUserClientId;
|
|
306
|
+
primaryAction.type = 'button';
|
|
307
|
+
primaryAction.setAttribute(
|
|
308
|
+
'aria-label',
|
|
309
|
+
isFollowing
|
|
310
|
+
? `Keep following ${user.name}`
|
|
311
|
+
: `Follow ${user.name} — ${file.textContent}`,
|
|
312
|
+
);
|
|
313
|
+
primaryAction.addEventListener('click', () => {
|
|
314
|
+
this.startFollowingUser(user.clientId, { closePanel: true });
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
row.appendChild(primaryAction);
|
|
319
|
+
|
|
320
|
+
if (!user.isLocal && user.clientId === this.followedUserClientId) {
|
|
321
|
+
const stopButton = document.createElement('button');
|
|
322
|
+
stopButton.type = 'button';
|
|
323
|
+
stopButton.className = 'presence-panel-user-stop';
|
|
324
|
+
stopButton.textContent = 'Stop';
|
|
325
|
+
stopButton.setAttribute('aria-label', `Stop following ${user.name}`);
|
|
326
|
+
stopButton.addEventListener('click', (event) => {
|
|
327
|
+
event.stopPropagation();
|
|
328
|
+
this.stopFollowingUser({ closePanel: true });
|
|
329
|
+
});
|
|
330
|
+
row.appendChild(stopButton);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
fragment.appendChild(row);
|
|
334
|
+
});
|
|
335
|
+
list.appendChild(fragment);
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
startFollowingUser(clientId, { closePanel = false } = {}) {
|
|
339
|
+
if (!clientId) return;
|
|
340
|
+
|
|
341
|
+
const user = this.globalUsers.find((entry) => entry.clientId === clientId && !entry.isLocal);
|
|
128
342
|
if (!user) return;
|
|
129
343
|
|
|
130
344
|
this.followedUserClientId = clientId;
|
|
131
345
|
this.followedCursorSignature = '';
|
|
132
346
|
this.renderAvatars();
|
|
133
347
|
|
|
348
|
+
if (closePanel) {
|
|
349
|
+
this.closePresencePanel();
|
|
350
|
+
}
|
|
351
|
+
|
|
134
352
|
if (user.currentFile && user.currentFile !== this.currentFilePath) {
|
|
135
353
|
this.navigation.navigateToFile(user.currentFile);
|
|
136
354
|
return;
|
|
@@ -141,10 +359,20 @@ export const presenceFeature = {
|
|
|
141
359
|
this.followUserCursor(user, { force: true });
|
|
142
360
|
}
|
|
143
361
|
});
|
|
362
|
+
},
|
|
144
363
|
|
|
364
|
+
toggleFollowUser(clientId) {
|
|
365
|
+
if (!clientId) return;
|
|
366
|
+
|
|
367
|
+
if (this.followedUserClientId === clientId) {
|
|
368
|
+
this.stopFollowingUser();
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
this.startFollowingUser(clientId);
|
|
145
373
|
},
|
|
146
374
|
|
|
147
|
-
stopFollowingUser() {
|
|
375
|
+
stopFollowingUser({ closePanel = false } = {}) {
|
|
148
376
|
if (!this.followedUserClientId) return;
|
|
149
377
|
if (this.currentFilePath && this.isExcalidrawFile?.(this.currentFilePath)) {
|
|
150
378
|
void this.excalidrawEmbed?.setFollowedUser(this.currentFilePath, null);
|
|
@@ -152,6 +380,9 @@ export const presenceFeature = {
|
|
|
152
380
|
this.followedUserClientId = null;
|
|
153
381
|
this.followedCursorSignature = '';
|
|
154
382
|
this.renderAvatars();
|
|
383
|
+
if (closePanel) {
|
|
384
|
+
this.closePresencePanel();
|
|
385
|
+
}
|
|
155
386
|
},
|
|
156
387
|
|
|
157
388
|
syncFollowedUser() {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { supportsBacklinksForFilePath } from '../../../domain/file-kind.js';
|
|
2
|
+
import { isPlainQuickSwitcherShortcut } from '../../domain/keyboard-shortcuts.js';
|
|
2
3
|
|
|
3
4
|
const VERSION_RELOAD_TOAST_DURATION_MS = 0;
|
|
4
5
|
|
|
@@ -7,6 +8,7 @@ const VERSION_RELOAD_TOAST_DURATION_MS = 0;
|
|
|
7
8
|
* @property {boolean} chatIsOpen
|
|
8
9
|
* @property {boolean} gitRepoAvailable
|
|
9
10
|
* @property {boolean} isTabActive
|
|
11
|
+
* @property {boolean} presencePanelOpen
|
|
10
12
|
* @property {string | null} currentFilePath
|
|
11
13
|
* @property {number} lobbyChatMessageMaxLength
|
|
12
14
|
* @property {any} runtimeConfig
|
|
@@ -236,6 +238,7 @@ function bindEvents() {
|
|
|
236
238
|
});
|
|
237
239
|
|
|
238
240
|
this.elements.chatToggleButton?.addEventListener('click', () => {
|
|
241
|
+
this.closePresencePanel?.();
|
|
239
242
|
this.toggleChatPanel();
|
|
240
243
|
this.closeToolbarOverflowMenu?.();
|
|
241
244
|
});
|
|
@@ -268,12 +271,18 @@ function bindEvents() {
|
|
|
268
271
|
this.toggleLineWrapping();
|
|
269
272
|
});
|
|
270
273
|
|
|
274
|
+
this.elements.userCount?.addEventListener('click', (event) => {
|
|
275
|
+
event.preventDefault();
|
|
276
|
+
this.togglePresencePanel?.();
|
|
277
|
+
});
|
|
278
|
+
|
|
271
279
|
this.elements.editorFindButton?.addEventListener('click', () => {
|
|
272
280
|
this.runEditorCommand?.('openSearch');
|
|
273
281
|
});
|
|
274
282
|
|
|
275
283
|
this.elements.toolbarOverflowToggle?.addEventListener('click', (event) => {
|
|
276
284
|
event.preventDefault();
|
|
285
|
+
this.closePresencePanel?.();
|
|
277
286
|
this.toggleToolbarOverflowMenu();
|
|
278
287
|
});
|
|
279
288
|
|
|
@@ -313,26 +322,36 @@ function bindEvents() {
|
|
|
313
322
|
|
|
314
323
|
document.addEventListener('keydown', (event) => {
|
|
315
324
|
this.handleDocumentKeydown(event);
|
|
316
|
-
});
|
|
325
|
+
}, { capture: true });
|
|
317
326
|
}
|
|
318
327
|
|
|
319
328
|
/** @this {UiShellContext} */
|
|
320
329
|
function handleDocumentPointerDown(event) {
|
|
321
330
|
this.handleMarkdownToolbarDocumentPointerDown?.(event);
|
|
322
331
|
|
|
332
|
+
const target = event.target instanceof Element ? event.target : null;
|
|
333
|
+
|
|
323
334
|
if (
|
|
324
335
|
this.toolbarOverflowOpen
|
|
325
|
-
&& !this.elements.toolbarOverflowMenu?.contains(
|
|
326
|
-
&& !this.elements.toolbarOverflowToggle?.contains(
|
|
336
|
+
&& !this.elements.toolbarOverflowMenu?.contains(target)
|
|
337
|
+
&& !this.elements.toolbarOverflowToggle?.contains(target)
|
|
327
338
|
) {
|
|
328
339
|
this.closeToolbarOverflowMenu();
|
|
329
340
|
}
|
|
330
341
|
|
|
342
|
+
if (
|
|
343
|
+
this.presencePanelOpen
|
|
344
|
+
&& !this.elements.presencePanel?.contains(target)
|
|
345
|
+
&& !target?.closest?.('[data-presence-panel-trigger="true"]')
|
|
346
|
+
) {
|
|
347
|
+
this.closePresencePanel?.();
|
|
348
|
+
}
|
|
349
|
+
|
|
331
350
|
if (!this.chatIsOpen) {
|
|
332
351
|
return;
|
|
333
352
|
}
|
|
334
353
|
|
|
335
|
-
if (this.elements.chatContainer?.contains(
|
|
354
|
+
if (this.elements.chatContainer?.contains(target)) {
|
|
336
355
|
return;
|
|
337
356
|
}
|
|
338
357
|
|
|
@@ -346,13 +365,19 @@ function handleDocumentKeydown(event) {
|
|
|
346
365
|
return;
|
|
347
366
|
}
|
|
348
367
|
|
|
368
|
+
if (event.key === 'Escape' && this.presencePanelOpen) {
|
|
369
|
+
this.closePresencePanel?.();
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
|
|
349
373
|
if (event.key === 'Escape' && this.chatIsOpen) {
|
|
350
374
|
this.closeChatPanel();
|
|
351
375
|
return;
|
|
352
376
|
}
|
|
353
377
|
|
|
354
|
-
if ((event
|
|
378
|
+
if (isPlainQuickSwitcherShortcut(event)) {
|
|
355
379
|
event.preventDefault();
|
|
380
|
+
event.stopPropagation();
|
|
356
381
|
void this.toggleQuickSwitcher();
|
|
357
382
|
}
|
|
358
383
|
}
|
|
@@ -548,6 +573,7 @@ export const uiFeatureShellMethods = {
|
|
|
548
573
|
initialize,
|
|
549
574
|
initializeVisualViewportBinding,
|
|
550
575
|
initializeVersionMonitoring,
|
|
576
|
+
isPlainQuickSwitcherShortcut,
|
|
551
577
|
promptForVersionReload,
|
|
552
578
|
scheduleBacklinkRefresh,
|
|
553
579
|
setToolbarOverflowOpen,
|
|
@@ -75,6 +75,7 @@ async function handleTabBlocked({ reason } = {}) {
|
|
|
75
75
|
this.chatMessageIds.clear();
|
|
76
76
|
this.chatUnreadCount = 0;
|
|
77
77
|
this.chatInitialSyncComplete = false;
|
|
78
|
+
this.presencePanelOpen = false;
|
|
78
79
|
this.followedUserClientId = null;
|
|
79
80
|
this.followedCursorSignature = '';
|
|
80
81
|
this.connectionState = { status: 'disconnected', unreachable: false };
|
|
@@ -227,7 +227,10 @@ export const workspaceFeature = {
|
|
|
227
227
|
await this.wikiLinkFileController.createAndOpenFile(filePath, displayName);
|
|
228
228
|
},
|
|
229
229
|
|
|
230
|
-
handleFileSelection(filePath, { closeSidebarOnMobile = false } = {}) {
|
|
231
|
-
this.workspaceRouteController.handleFileSelection(filePath, {
|
|
230
|
+
handleFileSelection(filePath, { closeSidebarOnMobile = false, revealInTree = false } = {}) {
|
|
231
|
+
this.workspaceRouteController.handleFileSelection(filePath, {
|
|
232
|
+
closeSidebarOnMobile,
|
|
233
|
+
revealInTree,
|
|
234
|
+
});
|
|
232
235
|
},
|
|
233
236
|
};
|
|
@@ -53,6 +53,9 @@ export function bindAppShellElements(doc = document) {
|
|
|
53
53
|
mobileViewToggle: doc.getElementById('mobileViewToggle'),
|
|
54
54
|
previewContent: doc.getElementById('previewContent'),
|
|
55
55
|
previewContainer: doc.getElementById('previewContainer'),
|
|
56
|
+
presencePanel: doc.getElementById('presencePanel'),
|
|
57
|
+
presencePanelList: doc.getElementById('presencePanelList'),
|
|
58
|
+
presencePanelStatus: doc.getElementById('presencePanelStatus'),
|
|
56
59
|
searchFilesButton: doc.getElementById('searchFilesBtn'),
|
|
57
60
|
shareButton: doc.getElementById('shareBtn'),
|
|
58
61
|
toastContainer: doc.getElementById('toastContainer'),
|