collabmd 0.1.54 → 0.1.55
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/bin/collabmd.js +19 -38
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-cMeDxAEL.js +1 -0
- package/dist/client/assets/{abnfDiagram-VCTEODGH-DxNxad6-.js → abnfDiagram-VCTEODGH-D2UdmYvj.js} +1 -1
- package/dist/client/assets/{abnfDiagram-O67JEVCF-Dwt6a0Ds.js → abnfDiagram-YUKMZFIV-DbmU4Q-X.js} +1 -1
- package/dist/client/assets/api-client-utils-C5ESDKMG.js +1 -0
- package/dist/client/assets/architecture-7GRP2DOG-BBwRXFv3.js +1 -1
- package/dist/client/assets/architecture-WOLXFQ4H-C0NxYiG7.js +1 -0
- package/dist/client/assets/{architectureDiagram-NJMV4G6O-D5CGiX3G.js → architectureDiagram-47P4ROYG-C7OjXK9S.js} +3 -3
- package/dist/client/assets/{architectureDiagram-5GKGNRK7-C1uvg5id.js → architectureDiagram-5GKGNRK7-CSiUzzeN.js} +1 -1
- package/dist/client/assets/base-CaIEJUF9.css +1 -0
- package/dist/client/assets/{blockDiagram-BEXU5L5S-BgTM0var.js → blockDiagram-E7TT5TSB-DMG-YlZw.js} +3 -3
- package/dist/client/assets/{blockDiagram-I7D4REHJ-B2YonsoG.js → blockDiagram-I7D4REHJ-sXfAgK2w.js} +1 -1
- package/dist/client/assets/{browser-BKLM0ThC-BCLQGPD6-K2seJgRL.js → browser-BKLM0ThC-BCLQGPD6-CcMAHZXi.js} +1 -1
- package/dist/client/assets/{c4Diagram-7LVT6UL2-r4IwomZm.js → c4Diagram-7LVT6UL2-C88V_K-8.js} +1 -1
- package/dist/client/assets/{c4Diagram-YGBWAQC7-_xZPrNkB.js → c4Diagram-CRA5TL53-D3F9ElJv.js} +2 -2
- package/dist/client/assets/canvasEditor-BJkwGzO1.css +1 -0
- package/dist/client/assets/canvasEditor-sBK7KfrD.js +1 -0
- package/dist/client/assets/{chunk-6AZGARVD--pTGpDnx.js → chunk-24IY7LWP-flnn6SWX.js} +1 -1
- package/dist/client/assets/chunk-2BW5OAIV-CNFO1U_e.js +10 -0
- package/dist/client/assets/{chunk-2E4U76K2-CIQUuV9n.js → chunk-2E4U76K2-DEnS5IbF.js} +1 -1
- package/dist/client/assets/{chunk-5V3GS4D5-B5uC2oxu.js → chunk-3M4EKCLJ-D-sZGCtO.js} +1 -1
- package/dist/client/assets/chunk-3YJQHVM4-Ctp__8EK.js +2 -0
- package/dist/client/assets/{chunk-7PRAP22T-9uTvtc_-.js → chunk-4EA7E6EY-bU4wRJot.js} +1 -1
- package/dist/client/assets/{chunk-4HAMMTFA-q0ldNVvr.js → chunk-4HAMMTFA-CQy6Skzw.js} +1 -1
- package/dist/client/assets/{chunk-6K3QC6MW-JnuvEGV4.js → chunk-4S7OKTRW-BpUW13a3.js} +1 -1
- package/dist/client/assets/{chunk-ICYGCRZG-odvlDZyA.js → chunk-53FOQ5SW-5lPdGYP4.js} +1 -1
- package/dist/client/assets/{chunk-75Z2AOVW-DitkSoSG.js → chunk-75Z2AOVW-BRdhvVTZ.js} +1 -1
- package/dist/client/assets/{chunk-GWA4HPMP-CGmv2yIq.js → chunk-7TKQ45FW-rA2u-WUl.js} +1 -1
- package/dist/client/assets/{chunk-GTNCS2PH-ChgkzEIi.js → chunk-AW2ZBBNX-DL0KGAdi.js} +3 -3
- package/dist/client/assets/{chunk-747NJXEK-BjqqAsS9.js → chunk-BP2KR52E-DAQ1pzDV.js} +1 -1
- package/dist/client/assets/{chunk-CLGD4ZFX-BfYJtJm1.js → chunk-CLGD4ZFX-DJiSE0gD.js} +1 -1
- package/dist/client/assets/{chunk-5DYCD2WN-BKWCKnK-.js → chunk-DBDB3WZW-CXleNlok.js} +1 -1
- package/dist/client/assets/{chunk-DU6HZSFF-CWlP1Dk_.js → chunk-DU6HZSFF-C-18UZkS.js} +1 -1
- package/dist/client/assets/{chunk-MBY4JIJT-DTJ4UcAm.js → chunk-E2ZNV5FY-D_07zfWd.js} +3 -3
- package/dist/client/assets/chunk-EU5HNXII-CETVNUXF.js +213 -0
- package/dist/client/assets/{chunk-F27PBJKO-DPcsPcEs.js → chunk-F27PBJKO-_beIJos4.js} +1 -1
- package/dist/client/assets/{chunk-2ZTRR5NV-DcPRfelM.js → chunk-F6S3BTY2-DVWKCAHp.js} +1 -1
- package/dist/client/assets/{chunk-ISPTBLVO-BMsDq9Ha.js → chunk-FLFP27SU-CydzbSsY.js} +2 -2
- package/dist/client/assets/chunk-FVRAUYC3-C7b9SJ81.js +1 -0
- package/dist/client/assets/{chunk-GMAD6QVW-Bgk8qnty.js → chunk-GMAD6QVW-DnZH7DxV.js} +1 -1
- package/dist/client/assets/{chunk-GVQU2GXP-CQ8cl-Uu.js → chunk-GVQU2GXP-B0Vm415C.js} +1 -1
- package/dist/client/assets/chunk-H5A3YXKD-ChP7mNJq.js +41 -0
- package/dist/client/assets/{chunk-742MDFTN-D1nh6vNv.js → chunk-HJ2JQQFS-DQX7RePR.js} +1 -1
- package/dist/client/assets/{chunk-NETBCI7D-CmUwDWUZ.js → chunk-HTAEGDNF-C0PA_N-c.js} +1 -1
- package/dist/client/assets/{chunk-IMKFNOWR-CBqxfpcP.js → chunk-IMKFNOWR-DoO8IHzF.js} +1 -1
- package/dist/client/assets/{chunk-IH6LHLGP-BNevEHZK.js → chunk-KPI5JJXK-B2ld5-w4.js} +1 -1
- package/dist/client/assets/{chunk-WEXAMYUT-DDlVNp8J.js → chunk-KQW6MTUR-OQ4MyMr_.js} +1 -1
- package/dist/client/assets/{chunk-L3NEJ4N5-BflzkdTI.js → chunk-L3NEJ4N5-CvHossEU.js} +1 -1
- package/dist/client/assets/chunk-NGNAAXSQ-DqoPQk1a.js +136 -0
- package/dist/client/assets/{chunk-UA2S7LBM-DicYDjDM.js → chunk-NTY3LDVX-CVWLK_fh.js} +1 -1
- package/dist/client/assets/{chunk-UY3FDG6J-QT-rkt0y.js → chunk-OD3NTWWA-Dz9nCUGX.js} +1 -1
- package/dist/client/assets/{chunk-OSK3NFVY-DqeKV_pg.js → chunk-OSK3NFVY-C3JOcBao.js} +1 -1
- package/dist/client/assets/{chunk-P2QGCYS3-BA--DhpW.js → chunk-P2QGCYS3-Bfo8qS8r.js} +1 -1
- package/dist/client/assets/{chunk-POPQ4Y6H-V_NEc45n.js → chunk-POPQ4Y6H-sv6rCftH.js} +1 -1
- package/dist/client/assets/{chunk-PWAF6VOD-D_kLse-N.js → chunk-PWAF6VOD-B-AT-L2H.js} +1 -1
- package/dist/client/assets/{chunk-3Z5EZCMW-BAnA6eQ7.js → chunk-QNH66VMT-Cb9xxTwQ.js} +1 -1
- package/dist/client/assets/{chunk-SHT3W25Y-YM3S-A_M.js → chunk-SHT3W25Y-C1lu518T.js} +1 -1
- package/dist/client/assets/{chunk-GNY47TPC-CTrH5O5R.js → chunk-SVEVUXB4-BnM-LXop.js} +1 -1
- package/dist/client/assets/{chunk-SVP7TREG-DdNhDOmW.js → chunk-SVP7TREG-CKqt0syj.js} +1 -1
- package/dist/client/assets/{chunk-TICWLB2K-BGGgCr4x.js → chunk-TICWLB2K-D2ZnWAfF.js} +1 -1
- package/dist/client/assets/{chunk-TLUHSLCS-DCZhIDYA.js → chunk-TLUHSLCS-BMIhqv1X.js} +1 -1
- package/dist/client/assets/{chunk-6EIED4P4-DBVWq7Tz.js → chunk-TPMEZKFX-DIPHIqGb.js} +1 -1
- package/dist/client/assets/{chunk-6TQVIW2G-BSj0l_pu.js → chunk-VPELOWWC-DXayM28-.js} +1 -1
- package/dist/client/assets/chunk-VPRB5NB3-BqaJfj_v.js +127 -0
- package/dist/client/assets/{chunk-I5DQTOEV-aBZooNp1.js → chunk-VTWWFHGB-SZnJiyWY.js} +1 -1
- package/dist/client/assets/{chunk-KI3K4JFJ-FTtDwx3-.js → chunk-VZTHESGH-eHyXmK8W.js} +1 -1
- package/dist/client/assets/{chunk-7INBJB4K-CDmiHbaX.js → chunk-XC4XBNZT-D9oehSn8.js} +20 -20
- package/dist/client/assets/{chunk-XHIXRSVI-DN_fEwws.js → chunk-YK26KJH5-DVy3MGMd.js} +1 -1
- package/dist/client/assets/{chunk-6AEJRKK7-DTVZj5bY.js → chunk-Z6ETV63D-DOcrnz-P.js} +1 -1
- package/dist/client/assets/{chunk-OUJLGHUK-75UXlPjl.js → chunk-ZO67DCNQ-BAOMIkLF.js} +1 -1
- package/dist/client/assets/classDiagram-ZZMXUADV-BmETdFmC.js +1 -0
- package/dist/client/assets/{classDiagram-v2-NBCMYWYE-3TQORq33.js → classDiagram-v2-K4WV4PDN-eaadfJDB.js} +3 -3
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-BmETdFmC.js +1 -0
- package/dist/client/assets/{comment-markdown-renderer-Bxi_JRSR.js → comment-markdown-renderer-CpBKaj7H.js} +1 -1
- package/dist/client/assets/comment-thread-store-DUQsWtnu.js +1 -0
- package/dist/client/assets/comment-threads-DnfkLVJA.js +4 -0
- package/dist/client/assets/comment-ui-shared-D_pgPUti.js +7 -0
- package/dist/client/assets/cynefin-EF2NZ3EQ-DVkJeZ8i.js +1 -0
- package/dist/client/assets/cynefin-OW5HDTMX-CF3N9j1_.js +1 -1
- package/dist/client/assets/{cynefinDiagram-VND7K2PF-DwfMZ3vk.js → cynefinDiagram-3GCD6N5R-DjpAsBHC.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-DTnLZaO7.js → cynefinDiagram-5FMLGOSQ-D2rFQG67.js} +1 -1
- package/dist/client/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/client/assets/{dagre-GXQ25YYZ-Vtyx08Qh.js → dagre-GXQ25YYZ-Cku9eia9.js} +2 -2
- package/dist/client/assets/{dagre-6A5THRUB-DewyAGK6.js → dagre-W4DXFKR2-DOMOIsPd.js} +2 -2
- package/dist/client/assets/deferred-collab-C9aa9cvT.css +1 -0
- package/dist/client/assets/deferred-git-BPQ-UgrN.css +1 -0
- package/dist/client/assets/deferred-preview-B-RebLry.css +1 -0
- package/dist/client/assets/{diagram-22UHCM2B-DbZirFfl.js → diagram-2UJZ2QOL-D8WvnEyx.js} +6 -6
- package/dist/client/assets/{diagram-3UASUU5V-DmhdYv6_.js → diagram-OVF4WLC6-D8_escYE.js} +2 -2
- package/dist/client/assets/{diagram-CDSNMT55-D_qyS11R.js → diagram-PFPMY2P6-B1izZfrN.js} +3 -3
- package/dist/client/assets/{diagram-S7CK7UJ4-CGTzfo2f.js → diagram-S7CK7UJ4-BzicH2t-.js} +1 -1
- package/dist/client/assets/{diagram-MLGK6HIB-DIBG6Ivu.js → diagram-UMYRVEAY-Djf7WDjZ.js} +1 -1
- package/dist/client/assets/{diagram-UQ7AKVKN-CWZS8QtB.js → diagram-UQ7AKVKN-DqX4zTtr.js} +1 -1
- package/dist/client/assets/{diagram-VSXAHHWV-DaO1nOZF.js → diagram-VSXAHHWV-DnVbfI4Y.js} +1 -1
- package/dist/client/assets/{diagram-VX7I27RA-B54P6Cyf.js → diagram-VX7I27RA-D-Dj0TQC.js} +1 -1
- package/dist/client/assets/{diagram-MPIPVDR6-D9XsALDV.js → diagram-YEKJPTXX-B40bP3Yr.js} +2 -2
- package/dist/client/assets/{diagram-Z3DM3KII-Cl2EXiXp.js → diagram-Z3DM3KII-_iT7Uz5p.js} +1 -1
- package/dist/client/assets/diagram-ZIFT7M5P-BUUK0oNw.js +3 -0
- package/dist/client/assets/{direct-engine-DVLMOJWp-C-YL5NFb.js → direct-engine-DVLMOJWp-DWtWIifK.js} +1 -1
- package/dist/client/assets/dist-26Ce-5t4.js +1 -0
- package/dist/client/assets/dist-8MLNn-I6.js +1 -0
- package/dist/client/assets/dist-Amm5Pr1C.js +1 -0
- package/dist/client/assets/dist-BXXPaoUV.js +1 -0
- package/dist/client/assets/{dist-CoXN2D3R.js → dist-Bkb-_VdB.js} +1 -1
- package/dist/client/assets/dist-Bl4yuUS9.js +1 -0
- package/dist/client/assets/{dist-lw5TGjI6.js → dist-C2CGvCPd.js} +1 -1
- package/dist/client/assets/dist-C2niyEh0.js +1 -0
- package/dist/client/assets/{dist-DOHWxIty.js → dist-CFCSUmJk.js} +1 -1
- package/dist/client/assets/dist-CHUI56fT.js +6 -0
- package/dist/client/assets/dist-CJh3Qrid.js +13 -0
- package/dist/client/assets/{dist-Ch6Sr9KF.js → dist-CKxETpSC.js} +3 -3
- package/dist/client/assets/dist-CSHJthAI.js +2 -0
- package/dist/client/assets/dist-CbKnZGN4.js +1 -0
- package/dist/client/assets/{dist-KrdpB_GB.js → dist-Cik4RJXj.js} +1 -1
- package/dist/client/assets/{dist-uk11ih8u.js → dist-CqkAY6Ot.js} +2 -2
- package/dist/client/assets/dist-D2ql2LCd.js +1 -0
- package/dist/client/assets/{dist-BpAUe9sL.js → dist-D47MOYFN.js} +1 -1
- package/dist/client/assets/dist-DBhUaexM.js +1 -0
- package/dist/client/assets/dist-DJux6Vc5.js +1 -0
- package/dist/client/assets/{dist-9Eodxf4G.js → dist-DLNdMWPH.js} +1 -1
- package/dist/client/assets/dist-DPJj-Y3l.js +1 -0
- package/dist/client/assets/{dist-BSAZ-Hek.js → dist-DRYFMufe.js} +6 -6
- package/dist/client/assets/{dist-BrKhPlc9.js → dist-DTGcVSU8.js} +1 -1
- package/dist/client/assets/dist-DlOxjzWi.js +9 -0
- package/dist/client/assets/{dist-BT9gJXCb.js → dist-DogjjM_B.js} +1 -1
- package/dist/client/assets/dist-Dyv_RvyB.js +23 -0
- package/dist/client/assets/dist-FUFeH5Cx.js +1 -0
- package/dist/client/assets/dist-It70ktCU.js +1 -0
- package/dist/client/assets/dist-QMvcnJHf.js +1 -0
- package/dist/client/assets/dist-QN1K2czv.js +11 -0
- package/dist/client/assets/dist-W8ilOKl3.js +1 -0
- package/dist/client/assets/dist-_17-t9qP.js +1 -0
- package/dist/client/assets/{dist-DeCV9FU4.js → dist-uE774WWs.js} +1 -1
- package/dist/client/assets/document-formatter-DtXmKZcy.js +1 -0
- package/dist/client/assets/drawioEditor-DO6IOaJ1.js +9 -0
- package/dist/client/assets/{ebnfDiagram-PWID7BFC-PfC84FyI.js → ebnfDiagram-PWID7BFC-IemGPf9X.js} +1 -1
- package/dist/client/assets/{ebnfDiagram-ZINNZB2B-DYvm_QtE.js → ebnfDiagram-VR2GEFS7-9fXqy1DI.js} +1 -1
- package/dist/client/assets/editor-session-CPsqXY_A.js +13 -0
- package/dist/client/assets/elk-IJKZMXRS-DsbrbBYg.js +27 -0
- package/dist/client/assets/embedded-editor-base-C44ZcCZv.css +1 -0
- package/dist/client/assets/{embedpdf-TkbBYowM.js → embedpdf-BfUI-3pv.js} +1 -1
- package/dist/client/assets/{embedpdf-cl9qiF45-itpgqvGY.js → embedpdf-cl9qiF45-CLMxJTMP.js} +2 -2
- package/dist/client/assets/en-7ZVUCEYH-C_VXKxxb.js +1 -0
- package/dist/client/assets/{erDiagram-OPXOYQCR-o8GRv8A_.js → erDiagram-O2IAPWRE-Cdadm-HN.js} +2 -2
- package/dist/client/assets/{erDiagram-RLTQ6QDP-C9cJl5NB.js → erDiagram-RLTQ6QDP-CGGmjm8t.js} +1 -1
- package/dist/client/assets/eventmodeling-K75KTNOO-BWBlZ5cR.js +1 -0
- package/dist/client/assets/eventmodeling-NTZA5JFV-CDy1bN6j.js +1 -1
- package/dist/client/assets/excalidraw-element-link-NQnskRkm.js +1 -0
- package/dist/client/assets/excalidraw-scene-DLlw4jyc.js +1 -0
- package/dist/client/assets/excalidrawEditor-DiKOIudt.css +1 -0
- package/dist/client/assets/excalidrawEditor-W2lZ5Mej.js +9 -0
- package/dist/client/assets/export-page-Bomh9oEr.js +46 -0
- package/dist/client/assets/exportDocument-BFIOECJ3.js +2 -0
- package/dist/client/assets/exportDocument-D0mONgQ4.css +1 -0
- package/dist/client/assets/file-kind-BGxTVHan.js +1 -0
- package/dist/client/assets/{file-search-BA8o_gs0.js → file-search-Dk2O14Vw.js} +1 -1
- package/dist/client/assets/flowDiagram-HODETNUW-DcVVYJUZ.js +1 -0
- package/dist/client/assets/flowDiagram-OXPTDLAJ-Dy6y46oF.js +1 -0
- package/dist/client/assets/{ganttDiagram-EL5Y4UJY-x40PW0Ah.js → ganttDiagram-EL5Y4UJY-Duu4KnsU.js} +1 -1
- package/dist/client/assets/ganttDiagram-R7TSEDQI-BWy52pjn.js +292 -0
- package/dist/client/assets/gitGraph-4MIJSDKK-B-rpDYbz.js +1 -1
- package/dist/client/assets/gitGraph-VSP46ZUC-1499lQAI.js +1 -0
- package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-ahsNaZsp.js → gitGraphDiagram-WWUBYQGX-CaJ0vC1a.js} +1 -1
- package/dist/client/assets/gitGraphDiagram-XJZIOB7I-DJwp9ilx.js +106 -0
- package/dist/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/client/assets/image-6XY3GD3F-DCWbu6d4.js +1 -0
- package/dist/client/assets/image-lightbox-controller-DAcXEXxT.js +184 -0
- package/dist/client/assets/index-CglpXOg7.css +1 -0
- package/dist/client/assets/index-D3WGkxfI.js +960 -0
- package/dist/client/assets/info-A6RAGUB7-BlutK7BT.js +1 -1
- package/dist/client/assets/info-OHQRW6UA-BDFQOo4H.js +1 -0
- package/dist/client/assets/{infoDiagram-27XIBGKW-MrZyptIy.js → infoDiagram-27XIBGKW-DBJh7QOu.js} +1 -1
- package/dist/client/assets/{infoDiagram-VRGFBTTK-KkUjDRAQ.js → infoDiagram-5W2HQ5XZ-DmWsqJ0w.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-5VMMS53U-Bnt9yM0O.js → ishikawaDiagram-5VMMS53U-CeEbSJem.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-OU5B5YK6-Di9BcpOY.js → ishikawaDiagram-K3B6WC7H-DH1NI35G.js} +2 -2
- package/dist/client/assets/{journeyDiagram-3NMN7TZE-Bl0abK1r.js → journeyDiagram-3NMN7TZE-BoIEEr6U.js} +1 -1
- package/dist/client/assets/{journeyDiagram-ZHPQQLJL-J-sGrs9e.js → journeyDiagram-COXZFDF6-CnHV2f9V.js} +3 -3
- package/dist/client/assets/{kanban-definition-PNTS6WVX-5ZDV_yIa.js → kanban-definition-P3RFRI5V-Cxvn5ZAG.js} +4 -4
- package/dist/client/assets/{kanban-definition-UXKFOSKX-DMgUfNt0.js → kanban-definition-UXKFOSKX-BY16Tgbr.js} +1 -1
- package/dist/client/assets/keyboard-shortcuts-BWNCBJqw.js +1 -0
- package/dist/client/assets/lobby-presence-DNNXcuwR.js +1 -0
- package/dist/client/assets/{markdown-CZ1tYEW8.js → markdown-DU84620G.js} +1 -1
- package/dist/client/assets/markdown-headings-zYEUahfW.js +41 -0
- package/dist/client/assets/{markdown-math-CyyBVuDO.js → markdown-math-B96cnrz1.js} +11 -11
- package/dist/client/assets/{mermaid-parser.core-Bpogunsh.js → mermaid-parser.core-R-uwU5kf.js} +3 -3
- package/dist/client/assets/{mermaid-parser.core-DBy--Jc0.js → mermaid-parser.core-mE6t1qEO.js} +1 -1
- package/dist/client/assets/mermaid.core-D8Z6LN7O.js +10 -0
- package/dist/client/assets/{mindmap-definition-NLK3R4M7-ByVb-0vj.js → mindmap-definition-LZFPQGKD-DVfFenfJ.js} +3 -3
- package/dist/client/assets/{mindmap-definition-YA3MSWOX-DBZN5_GH.js → mindmap-definition-YA3MSWOX-DtiE80UJ.js} +1 -1
- package/dist/client/assets/packet-AYTQ26CC-DvbY8dI6.js +1 -1
- package/dist/client/assets/packet-JDAUHWVQ-DJ9K2MA4.js +1 -0
- package/dist/client/assets/{pegDiagram-GJSIUBJH-aost1sSO.js → pegDiagram-BGZESJAR-DxfvEcwv.js} +1 -1
- package/dist/client/assets/{pegDiagram-XKGWAZYB-DRo8CZu3.js → pegDiagram-XKGWAZYB-CyozY-Kt.js} +1 -1
- package/dist/client/assets/pie-WAS4IAKB-DWSm9SSD.js +1 -1
- package/dist/client/assets/pie-XZMESJXO-CQIQasY-.js +1 -0
- package/dist/client/assets/{pieDiagram-5QR66LMP-BICdpEuz.js → pieDiagram-CAPJLFHJ-CRlMcrv3.js} +2 -2
- package/dist/client/assets/{pieDiagram-E7YTZNPT-CZThaHsc.js → pieDiagram-E7YTZNPT-BRdmTkDq.js} +1 -1
- package/dist/client/assets/preload-helper-CYtfOYgs.js +1 -0
- package/dist/client/assets/preview-render-compiler-D_aJv7Ew.js +3 -0
- package/dist/client/assets/{preview-render-worker-BA4VK_GY.js → preview-render-worker-dFNyrVyB.js} +46 -42
- package/dist/client/assets/prod-ItolaHmf.js +145 -0
- package/dist/client/assets/prod-rdly4JJQ.js +1 -0
- package/dist/client/assets/{quadrantDiagram-AXDQQJYC-C5iowkl_.js → quadrantDiagram-AXDQQJYC-7QyPIXkF.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-O4NWA36T-Bgx5bF97.js → quadrantDiagram-GDMTTRAM-DE30uqTl.js} +3 -3
- package/dist/client/assets/quick-switcher-controller-DsK70I7K.js +1 -0
- package/dist/client/assets/radar-ABXABTNO-ByfpCXh9.js +1 -0
- package/dist/client/assets/radar-RG4KPBEZ-BfNQUEQy.js +1 -1
- package/dist/client/assets/railroad-74A4TZTK-BaQ6U6eJ.js +1 -1
- package/dist/client/assets/railroad-I3PHUGI6-CTUn9HhI.js +1 -0
- package/dist/client/assets/railroad-abnf-HS5TGJTU-BJ3KZw7J.js +1 -1
- package/dist/client/assets/railroad-abnf-LNEFI6M7-Ct-b-y0F.js +1 -0
- package/dist/client/assets/railroad-ebnf-DWYD2UWJ-BZMYMWOe.js +1 -0
- package/dist/client/assets/railroad-ebnf-LZEXJU2U-DA0sEq7w.js +1 -1
- package/dist/client/assets/railroad-peg-JR7BVNR7-Dj23PxYc.js +1 -0
- package/dist/client/assets/railroad-peg-WCYAUIDC-DCmlICzO.js +1 -1
- package/dist/client/assets/{railroadDiagram-O6MQD6OU-BTt_rKjT.js → railroadDiagram-O6MQD6OU-BPk3RS2D.js} +1 -1
- package/dist/client/assets/{railroadDiagram-XR7U4H2S-DbVoNgSz.js → railroadDiagram-SM67HX2B-CZRXJ647.js} +1 -1
- package/dist/client/assets/{requirementDiagram-BXWQKSXE-BkvazG7r.js → requirementDiagram-BXWQKSXE-BRwfym6z.js} +1 -1
- package/dist/client/assets/{requirementDiagram-PLB6GJNP-BT0j9C40.js → requirementDiagram-X7JNWC4A-BofCuLJA.js} +4 -4
- package/dist/client/assets/{sankeyDiagram-P5KCCOFB-C_IemB9h.js → sankeyDiagram-P5KCCOFB-D4LcrKpW.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-IPEJSGJF-X1BCUIrf.js → sankeyDiagram-UM26HJRW-CLKMDbej.js} +3 -3
- package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-CxFBgLGd.js → sequenceDiagram-WJ2MYXX4-DQjtv-Bs.js} +1 -1
- package/dist/client/assets/sequenceDiagram-ZO4K6R2Y-CDP_m6ma.js +169 -0
- package/dist/client/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist/client/assets/sizeCapture-INFHLROL-BMR1ovSU.js +1 -0
- package/dist/client/assets/src-D5mvpivG.js +2 -0
- package/dist/client/assets/{standalone-DbyFjvTU.js → standalone-D_lg5NC9.js} +1 -1
- package/dist/client/assets/{stateDiagram-D77RDMKH-BaSQ6Owj.js → stateDiagram-D77RDMKH-DSMvV-kF.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-ClmOOUsT.js +1 -0
- package/dist/client/assets/{stateDiagram-v2-GCMORJYK-CsVcfwVp.js → stateDiagram-v2-TBUQTH76-Dc5-FKzd.js} +2 -2
- package/dist/client/assets/{swimlanes-42K2YHIH-CALFEmiS.js → swimlanes-42K2YHIH-BUz31lO3.js} +1 -1
- package/dist/client/assets/{swimlanes-2SLR337P-CnYTVqRX.js → swimlanes-N4OXWK64-Dd3dFdPD.js} +1 -1
- package/dist/client/assets/swimlanesDiagram-K3J5GTZL-Bz9gFdls.js +8 -0
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DoDs3zod.js +8 -0
- package/dist/client/assets/{timeline-definition-24CTP7MA-zse-5Dbm.js → timeline-definition-24CTP7MA-BvqCvSjy.js} +1 -1
- package/dist/client/assets/{timeline-definition-EJHVYXUP-BhqPlKkN.js → timeline-definition-YOQAKGHF-D2XWPSLs.js} +3 -3
- package/dist/client/assets/treeView-D4JQ5SDB-DcX7Bx0H.js +1 -0
- package/dist/client/assets/treeView-Q6P3EWNA-BvHOzbu9.js +1 -1
- package/dist/client/assets/treemap-SAJKECNS-BcCHmcAX.js +1 -0
- package/dist/client/assets/treemap-WGGIJYW6-oety7paS.js +1 -1
- package/dist/client/assets/usecaseDiagram-VIAY4XPW-CDe-IMjS.js +328 -0
- package/dist/client/assets/vault-api-client-DrRW0QwO.js +7 -0
- package/dist/client/assets/{vennDiagram-4TSXK5OY-DgHr6cJD.js → vennDiagram-4TSXK5OY-BW6Qp12d.js} +1 -1
- package/dist/client/assets/{vennDiagram-UO4OBE2U-BRwLn2Q1.js → vennDiagram-BLWOH2XV-KxIPKpHi.js} +3 -3
- package/dist/client/assets/wardley-7MLQ67FV-DOahSwbZ.js +1 -0
- package/dist/client/assets/wardley-WFR3VGLG-BdwDpX_I.js +1 -1
- package/dist/client/assets/{wardleyDiagram-VM6X3IG4-9A60XZis.js → wardleyDiagram-VM6X3IG4-BoCETVsK.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-VNRHLVJA-B_tMcVFG.js → wardleyDiagram-YMQ3BMBF-BNYqEy7M.js} +4 -4
- package/dist/client/assets/{wiki-link-resolver-Dch88erO.js → wiki-link-resolver-BCdGUpdu.js} +1 -1
- package/dist/client/assets/{worker-engine-BCCrxWYm-CX0qJ_cG.js → worker-engine-BCCrxWYm-1fphds7O.js} +1 -1
- package/dist/client/assets/workspace-sync-client-C_P9wtjf.js +1 -0
- package/dist/client/assets/{xychartDiagram-S5SC5T6Z-D00iy-wB.js → xychartDiagram-S5SC5T6Z-eB5Fu9P7.js} +1 -1
- package/dist/client/assets/xychartDiagram-TAQBALBS-Sv6aaptV.js +7 -0
- package/dist/client/assets/yjs-Jd9fna_Y.js +4 -0
- package/dist/client/assets/yjs-provider-reset-guard-Cqu0Z6xH.js +1 -0
- package/dist/client/canvas-editor.html +16 -0
- package/dist/client/drawio-editor.html +7 -6
- package/dist/client/excalidraw-editor.html +31 -30
- package/dist/client/export-document.html +4 -3
- package/dist/client/index.html +2 -2
- package/package.json +27 -29
- package/scripts/local-compose.mjs +101 -0
- package/src/client/app/canvas-editor.html +13 -0
- package/src/client/application/app-shell/git-feature.js +3 -2
- package/src/client/application/app-shell/ui-feature-identity.js +1 -0
- package/src/client/application/app-shell/ui-feature-shell.js +2 -0
- package/src/client/application/app-shell/ui-feature-tab-activity.js +4 -0
- package/src/client/application/app-shell/workspace-feature.js +8 -34
- package/src/client/application/diagram-chrome.js +8 -11
- package/src/client/application/diagram-preview-hydrator.js +5 -5
- package/src/client/application/mermaid-preview-hydrator.js +3 -2
- package/src/client/application/plantuml-preview-hydrator.js +6 -0
- package/src/client/application/preview-render-compiler.js +34 -98
- package/src/client/application/preview-render-executor.js +3 -0
- package/src/client/application/preview-render-worker.js +2 -0
- package/src/client/application/preview-renderer.js +9 -5
- package/src/client/application/workspace-coordinator.js +18 -10
- package/src/client/application/workspace-preview-controller.js +105 -158
- package/src/client/application/workspace-route-controller.js +29 -54
- package/src/client/bootstrap/canvas-markdown-preview.js +87 -0
- package/src/client/bootstrap/collabmd-app-shell.js +28 -13
- package/src/client/canvas-editor.js +143 -0
- package/src/client/domain/canvas-view.js +50 -0
- package/src/client/domain/excalidraw-scene.js +4 -49
- package/src/client/domain/highlight-runtime.js +0 -4
- package/src/client/domain/markdown-formatting.js +12 -94
- package/src/client/domain/markdown-headings.js +98 -0
- package/src/client/domain/wiki-link-completions.js +42 -10
- package/src/client/infrastructure/browser-preferences-port.js +27 -33
- package/src/client/infrastructure/canvas-room-client.js +210 -0
- package/src/client/infrastructure/canvas-text-editor.js +36 -0
- package/src/client/infrastructure/comment-thread-store.js +19 -77
- package/src/client/infrastructure/editor-view-adapter.js +0 -30
- package/src/client/infrastructure/excalidraw-room-client.js +22 -10
- package/src/client/infrastructure/hosted-api-client.js +4 -2
- package/src/client/infrastructure/vault-api-client.js +4 -4
- package/src/client/presentation/canvas-editor-view.js +1028 -0
- package/src/client/presentation/canvas-embed-controller.js +116 -0
- package/src/client/presentation/canvas-picker.js +111 -0
- package/src/client/presentation/drawio-embed-controller.js +1 -3
- package/src/client/presentation/excalidraw-embed-controller.js +10 -3
- package/src/client/presentation/file-action-controller.js +37 -0
- package/src/client/presentation/file-explorer-controller.js +1 -2
- package/src/client/presentation/file-explorer-view.js +7 -1
- package/src/client/presentation/file-icon-svg.js +1 -1
- package/src/client/presentation/file-tree-state.js +4 -1
- package/src/client/presentation/image-lightbox-controller.js +1 -5
- package/src/client/presentation/team-settings-controller.js +44 -10
- package/src/client/styles/components/actions.css +4 -16
- package/src/client/styles/components/surfaces.css +0 -7
- package/src/client/styles/features/comment-card.css +1 -2
- package/src/client/styles/features/comment-markdown.css +0 -18
- package/src/client/styles/features/diagram-preview.css +0 -18
- package/src/client/styles/features/git-branch.css +0 -4
- package/src/client/styles/foundation/themes.css +6 -0
- package/src/client/styles/foundation/utilities.css +1 -2
- package/src/client/styles/layout/editor-page.css +0 -13
- package/src/client/styles/layout/responsive.css +2 -7
- package/src/client/styles/layout/shell.css +13 -1
- package/src/client/styles/layout/view-modes.css +1 -0
- package/src/client/styles/surfaces/canvas-editor.css +239 -0
- package/src/domain/canvas-room-codec.js +359 -0
- package/src/domain/collabmd-content-capabilities.js +10 -1
- package/src/domain/comment-threads.js +49 -5
- package/src/domain/excalidraw-room-codec.js +23 -73
- package/src/domain/excalidraw-scene.js +48 -0
- package/src/domain/file-kind.js +13 -1
- package/src/server/application/workspace-reconciliation.js +0 -14
- package/src/server/domain/backlink-index.js +1 -36
- package/src/server/domain/bases/base-index-snapshot-store.js +41 -24
- package/src/server/domain/bases/base-query-service.js +1 -47
- package/src/server/domain/collaboration/collaboration-room.js +149 -15
- package/src/server/domain/collaboration/room-registry.js +7 -7
- package/src/server/domain/hosted-workspace.js +29 -2
- package/src/server/domain/plantuml-encoder.js +7 -43
- package/src/server/infrastructure/git/diff-service.js +1 -5
- package/src/server/infrastructure/git/history-service.js +18 -2
- package/src/server/infrastructure/git/untracked-files.js +1 -1
- package/src/server/infrastructure/http/create-git-api-command-handler.js +60 -149
- package/src/server/infrastructure/http/create-hosted-api-handler.js +5 -2
- package/src/server/infrastructure/http/create-vault-api-query-handler.js +2 -2
- package/src/server/infrastructure/http/http-response.js +2 -36
- package/src/server/infrastructure/http/request-body.js +14 -49
- package/src/server/infrastructure/persistence/hosted-metadata-store.js +12 -3
- package/src/server/infrastructure/persistence/path-utils.js +8 -2
- package/src/server/infrastructure/persistence/vault-file-store.js +26 -60
- package/src/server/{infrastructure/git → shared}/image-mime.js +2 -2
- package/dist/client/assets/CodeMirrorEditor-UCMRAMCV-kJfwukbn.js +0 -1
- package/dist/client/assets/_basePickBy-QJXUw_pr.js +0 -1
- package/dist/client/assets/_baseUniq-DR4vVjyC.js +0 -1
- package/dist/client/assets/architecture-7GRP2DOG-DJVtYNt-.js +0 -1
- package/dist/client/assets/browser-utils-S4QYY31r.js +0 -1
- package/dist/client/assets/chunk-3FUC2YCW-8tZlhTGX.js +0 -1
- package/dist/client/assets/chunk-7M6MHVWA-BDakkknV.js +0 -213
- package/dist/client/assets/chunk-FOHPRMQF-Dmmo5Kak.js +0 -161
- package/dist/client/assets/chunk-O7XYJQB3-D0_ZY2za.js +0 -126
- package/dist/client/assets/chunk-T5WUORNS-DD7KlyY6.js +0 -40
- package/dist/client/assets/chunk-Z7XXMR3K-P4Vaq8hD.js +0 -10
- package/dist/client/assets/chunk-ZIGJFQKS-b8OUHKK5.js +0 -2
- package/dist/client/assets/classDiagram-ZZMXUADV-QLbh_Nkf.js +0 -1
- package/dist/client/assets/classDiagram-v2-VYDZK3BY-QLbh_Nkf.js +0 -1
- package/dist/client/assets/comment-thread-store-CHvy8GF8.js +0 -1
- package/dist/client/assets/comment-threads-nJhK1yfc.js +0 -4
- package/dist/client/assets/cynefin-OW5HDTMX-e-Quc9Yl.js +0 -1
- package/dist/client/assets/dagre-D7FiCLLP.js +0 -1
- package/dist/client/assets/deferred-collab-D4cxEdad.css +0 -1
- package/dist/client/assets/deferred-git-BHKtkFYi.css +0 -1
- package/dist/client/assets/deferred-preview-BAXYgf4T.css +0 -1
- package/dist/client/assets/diagram-ATOU4E4O-B5uX-jVO.js +0 -3
- package/dist/client/assets/dist-B2ZNQifU.js +0 -1
- package/dist/client/assets/dist-B6QCMNze.js +0 -1
- package/dist/client/assets/dist-BIAv19LO.js +0 -1
- package/dist/client/assets/dist-BKYp1-dl.js +0 -13
- package/dist/client/assets/dist-BSTbcioM.js +0 -11
- package/dist/client/assets/dist-BTVg1m-V.js +0 -1
- package/dist/client/assets/dist-Bi9ZIYXq.js +0 -9
- package/dist/client/assets/dist-Bqo-XRVG.js +0 -1
- package/dist/client/assets/dist-CBsvKPcT.js +0 -1
- package/dist/client/assets/dist-CJBYh9Wy.js +0 -23
- package/dist/client/assets/dist-CRwfjtwz.js +0 -2
- package/dist/client/assets/dist-CX7Kc61C.js +0 -1
- package/dist/client/assets/dist-CYfPeupF.js +0 -1
- package/dist/client/assets/dist-CucpLxUY.js +0 -1
- package/dist/client/assets/dist-DHBMeCxC.js +0 -6
- package/dist/client/assets/dist-DLEg9d4u.js +0 -1
- package/dist/client/assets/dist-DYFBD-wW.js +0 -1
- package/dist/client/assets/dist-DugWGOjQ.js +0 -1
- package/dist/client/assets/dist-NNrRnB-f.js +0 -1
- package/dist/client/assets/dist-PUxZqhFe.js +0 -1
- package/dist/client/assets/dist-cYiJMWHJ.js +0 -1
- package/dist/client/assets/dist-iKC7go4m.js +0 -1
- package/dist/client/assets/document-formatter-6I63vstk.js +0 -1
- package/dist/client/assets/drawioEditor-DNTjsjzJ.js +0 -9
- package/dist/client/assets/editor-session-D8GGkJak.js +0 -14
- package/dist/client/assets/elk-276RUBZZ-B8LB3Pac.js +0 -27
- package/dist/client/assets/embedded-editor-base-elU0Avik.css +0 -1
- package/dist/client/assets/en-JTHJ2SIP-DBz9bRq4.js +0 -1
- package/dist/client/assets/eventmodeling-NTZA5JFV-Dxtv5D-P.js +0 -1
- package/dist/client/assets/excalidraw-element-link-BRZOTIeI.js +0 -7
- package/dist/client/assets/excalidraw-scene-6uROebca.js +0 -1
- package/dist/client/assets/excalidrawEditor-BCTFp_CV.css +0 -1
- package/dist/client/assets/excalidrawEditor-D0orhhku.js +0 -9
- package/dist/client/assets/export-page-CVJNMERq.js +0 -46
- package/dist/client/assets/exportDocument-Ba-n1X4U.css +0 -1
- package/dist/client/assets/exportDocument-DSshnmnZ.js +0 -2
- package/dist/client/assets/file-kind-BwMIcZbi.js +0 -1
- package/dist/client/assets/flowDiagram-HODETNUW-Bq4470NR.js +0 -1
- package/dist/client/assets/flowDiagram-KWPJA3E3-DQG9qGiU.js +0 -1
- package/dist/client/assets/ganttDiagram-FUAMR5RP-BQpsI7gQ.js +0 -292
- package/dist/client/assets/gitGraph-4MIJSDKK-ZaBIE4Lb.js +0 -1
- package/dist/client/assets/gitGraphDiagram-X574FWY7-wbs_2m9f.js +0 -106
- package/dist/client/assets/graphlib-C9Tl7QrK.js +0 -1
- package/dist/client/assets/image-I42VHMUI-B2-c_ifV.js +0 -1
- package/dist/client/assets/index-BCgNcVNs.css +0 -1
- package/dist/client/assets/index-BpmR5Qqk.js +0 -1140
- package/dist/client/assets/info-A6RAGUB7-BcGxhjED.js +0 -1
- package/dist/client/assets/lobby-presence-KJrYhMdN.js +0 -1
- package/dist/client/assets/mermaid.core-BeOUPE3Q.js +0 -10
- package/dist/client/assets/packet-AYTQ26CC-CqpSjTWl.js +0 -1
- package/dist/client/assets/pie-WAS4IAKB-Bg2eCNl5.js +0 -1
- package/dist/client/assets/preload-helper-BAlEavIC.js +0 -1
- package/dist/client/assets/preview-render-compiler-BmWQStaL.js +0 -43
- package/dist/client/assets/prod-CA0ie9yD.js +0 -145
- package/dist/client/assets/prod-yKJZ3E4s.js +0 -1
- package/dist/client/assets/quick-switcher-controller-B5vT9Vj5.js +0 -1
- package/dist/client/assets/radar-RG4KPBEZ-DxExotg6.js +0 -1
- package/dist/client/assets/railroad-74A4TZTK-FfHmeIQk.js +0 -1
- package/dist/client/assets/railroad-abnf-HS5TGJTU-CLkdDRsJ.js +0 -1
- package/dist/client/assets/railroad-ebnf-LZEXJU2U-B162zvcG.js +0 -1
- package/dist/client/assets/railroad-peg-WCYAUIDC-CGs5GeJ5.js +0 -1
- package/dist/client/assets/sequenceDiagram-PO4LG4MO-B-2QfXhV.js +0 -169
- package/dist/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -1
- package/dist/client/assets/sizeCapture-INFHLROL-DrzwYt5z.js +0 -1
- package/dist/client/assets/stateDiagram-v2-MP3YSRHH-CLlwrdvU.js +0 -1
- package/dist/client/assets/swimlanesDiagram-TC7HE7FX-Bh4tmz27.js +0 -8
- package/dist/client/assets/swimlanesDiagram-VR7AAH4N-xhehUG9e.js +0 -8
- package/dist/client/assets/treeView-Q6P3EWNA-Cccy0ngL.js +0 -1
- package/dist/client/assets/treemap-WGGIJYW6-sMRCjCtX.js +0 -1
- package/dist/client/assets/usecaseDiagram-POWQR4AR-DR2LHQYs.js +0 -328
- package/dist/client/assets/vault-api-client-NS_EVHJ3.js +0 -7
- package/dist/client/assets/wardley-WFR3VGLG-Y7xty_3m.js +0 -1
- package/dist/client/assets/workspace-sync-client-BrMtf6zN.js +0 -1
- package/dist/client/assets/xychartDiagram-PMCCYNJV-fRpZ1MA5.js +0 -7
- package/dist/client/assets/yjs-B41tM6Sz.js +0 -4
- package/dist/client/assets/yjs-provider-reset-guard-DpntzUDR.js +0 -1
- package/scripts/local-plantuml-compose.mjs +0 -92
- package/scripts/local-structurizr-compose.mjs +0 -101
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getActiveVaultId,
|
|
3
|
+
resolveAppUrl,
|
|
4
|
+
resolveWsServerOverride,
|
|
5
|
+
} from '../domain/runtime-paths.js';
|
|
6
|
+
|
|
7
|
+
export class CanvasEmbedController {
|
|
8
|
+
constructor({ getLocalUser, getTheme, onAwarenessChange, onConnectionChange, onOpenFile, toastController }) {
|
|
9
|
+
this.getLocalUser = getLocalUser;
|
|
10
|
+
this.getTheme = getTheme;
|
|
11
|
+
this.onAwarenessChange = onAwarenessChange;
|
|
12
|
+
this.onConnectionChange = onConnectionChange;
|
|
13
|
+
this.onOpenFile = onOpenFile;
|
|
14
|
+
this.toastController = toastController;
|
|
15
|
+
this.iframe = null;
|
|
16
|
+
this.filePath = null;
|
|
17
|
+
this.ready = false;
|
|
18
|
+
this.pendingDisconnects = new Map();
|
|
19
|
+
this.handleMessage = (event) => this.onMessage(event);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
mount(filePath, renderHost) {
|
|
23
|
+
if (!renderHost || (this.filePath === filePath && this.iframe?.isConnected)) return;
|
|
24
|
+
this.unmount();
|
|
25
|
+
const url = new URL(resolveAppUrl('/canvas-editor.html'));
|
|
26
|
+
url.searchParams.set('file', filePath);
|
|
27
|
+
url.searchParams.set('theme', this.getTheme?.() ?? 'dark');
|
|
28
|
+
const vaultId = getActiveVaultId();
|
|
29
|
+
if (vaultId) url.searchParams.set('vaultId', vaultId);
|
|
30
|
+
const server = resolveWsServerOverride();
|
|
31
|
+
if (server) url.searchParams.set('server', server);
|
|
32
|
+
const user = this.getLocalUser?.();
|
|
33
|
+
for (const [key, value] of Object.entries({
|
|
34
|
+
userName: user?.name,
|
|
35
|
+
userColor: user?.color,
|
|
36
|
+
userColorLight: user?.colorLight,
|
|
37
|
+
userPeerId: user?.peerId,
|
|
38
|
+
})) {
|
|
39
|
+
if (value) url.searchParams.set(key, value);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const iframe = document.createElement('iframe');
|
|
43
|
+
iframe.className = 'canvas-file-preview-frame';
|
|
44
|
+
iframe.title = `Canvas: ${filePath}`;
|
|
45
|
+
iframe.src = url.toString();
|
|
46
|
+
this.filePath = filePath;
|
|
47
|
+
this.iframe = iframe;
|
|
48
|
+
window.addEventListener('message', this.handleMessage);
|
|
49
|
+
renderHost.replaceChildren(iframe);
|
|
50
|
+
this.onConnectionChange?.({ status: 'connecting', unreachable: false });
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
unmount() {
|
|
54
|
+
window.removeEventListener('message', this.handleMessage);
|
|
55
|
+
this.pendingDisconnects.forEach((finish) => finish(false));
|
|
56
|
+
this.iframe?.remove();
|
|
57
|
+
this.iframe = null;
|
|
58
|
+
this.filePath = null;
|
|
59
|
+
this.ready = false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
postMessage(message) {
|
|
63
|
+
this.iframe?.contentWindow?.postMessage(message, window.location.origin);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
updateTheme(theme) {
|
|
67
|
+
this.postMessage({ type: 'canvas-theme', theme });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
updateLocalUser(user = this.getLocalUser?.()) {
|
|
71
|
+
if (user) this.postMessage({ type: 'canvas-user', user });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
prepareFileDisconnect(filePath, { timeoutMs = 10000 } = {}) {
|
|
75
|
+
if (filePath !== this.filePath || !this.iframe || !this.ready) return Promise.resolve(true);
|
|
76
|
+
const requestId = crypto.randomUUID();
|
|
77
|
+
return new Promise((resolve) => {
|
|
78
|
+
const timeout = setTimeout(() => finish(false), timeoutMs);
|
|
79
|
+
const finish = (canLeave) => {
|
|
80
|
+
clearTimeout(timeout);
|
|
81
|
+
this.pendingDisconnects.delete(requestId);
|
|
82
|
+
if (!canLeave) this.toastController?.show('Waiting for the canvas to reconnect before leaving');
|
|
83
|
+
resolve(canLeave);
|
|
84
|
+
};
|
|
85
|
+
this.pendingDisconnects.set(requestId, finish);
|
|
86
|
+
this.postMessage({ type: 'canvas-prepare-disconnect', filePath, requestId });
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
onMessage(event) {
|
|
91
|
+
if (event.origin !== window.location.origin || !this.iframe || event.source !== this.iframe.contentWindow) return;
|
|
92
|
+
const message = event.data;
|
|
93
|
+
if (!message || typeof message !== 'object') return;
|
|
94
|
+
if (message.type === 'canvas-open-file') {
|
|
95
|
+
if (typeof message.filePath === 'string' && message.filePath) {
|
|
96
|
+
const anchor = typeof message.subpath === 'string' && message.subpath.startsWith('#')
|
|
97
|
+
? message.subpath.slice(1)
|
|
98
|
+
: null;
|
|
99
|
+
this.onOpenFile?.(message.filePath, anchor ? { anchor } : {});
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (message.filePath !== this.filePath) return;
|
|
104
|
+
if (message.type === 'canvas-ready') {
|
|
105
|
+
this.ready = true;
|
|
106
|
+
this.updateTheme(this.getTheme?.() ?? 'dark');
|
|
107
|
+
this.updateLocalUser();
|
|
108
|
+
} else if (message.type === 'canvas-awareness' && Array.isArray(message.users)) {
|
|
109
|
+
this.onAwarenessChange?.(message.users);
|
|
110
|
+
} else if (message.type === 'canvas-connection' && ['connected', 'connecting', 'disconnected'].includes(message.state?.status)) {
|
|
111
|
+
this.onConnectionChange?.(message.state);
|
|
112
|
+
} else if (message.type === 'canvas-disconnect-ready' || message.type === 'canvas-disconnect-blocked') {
|
|
113
|
+
this.pendingDisconnects.get(message.requestId)?.(message.type === 'canvas-disconnect-ready');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createFileSearchEntry, findFileSearchMatch } from '../domain/file-search.js';
|
|
2
|
+
|
|
3
|
+
export function openCanvasPicker({ root, title, loadChoices, onChoose, canChoose }) {
|
|
4
|
+
const previousFocus = document.activeElement;
|
|
5
|
+
const dialog = document.createElement('dialog');
|
|
6
|
+
dialog.className = 'canvas-picker';
|
|
7
|
+
const heading = document.createElement('h2');
|
|
8
|
+
heading.id = `canvas-picker-${crypto.randomUUID()}`;
|
|
9
|
+
heading.textContent = title;
|
|
10
|
+
dialog.setAttribute('aria-labelledby', heading.id);
|
|
11
|
+
const closeButton = document.createElement('button');
|
|
12
|
+
closeButton.type = 'button';
|
|
13
|
+
closeButton.className = 'canvas-button';
|
|
14
|
+
closeButton.textContent = 'Close';
|
|
15
|
+
const header = document.createElement('header');
|
|
16
|
+
header.append(heading, closeButton);
|
|
17
|
+
const input = document.createElement('input');
|
|
18
|
+
input.type = 'search';
|
|
19
|
+
input.placeholder = title;
|
|
20
|
+
input.setAttribute('aria-label', title);
|
|
21
|
+
input.setAttribute('role', 'combobox');
|
|
22
|
+
input.setAttribute('aria-autocomplete', 'list');
|
|
23
|
+
input.setAttribute('aria-expanded', 'true');
|
|
24
|
+
input.autocomplete = 'off';
|
|
25
|
+
const list = document.createElement('div');
|
|
26
|
+
list.id = `${heading.id}-results`;
|
|
27
|
+
list.className = 'canvas-picker-results';
|
|
28
|
+
list.setAttribute('role', 'listbox');
|
|
29
|
+
list.setAttribute('aria-label', 'Suggestions');
|
|
30
|
+
input.setAttribute('aria-controls', list.id);
|
|
31
|
+
const status = document.createElement('p');
|
|
32
|
+
status.className = 'canvas-picker-status';
|
|
33
|
+
status.setAttribute('role', 'status');
|
|
34
|
+
status.textContent = 'Loading…';
|
|
35
|
+
dialog.append(header, input, list, status);
|
|
36
|
+
root.append(dialog);
|
|
37
|
+
let choices = [];
|
|
38
|
+
let filtered = [];
|
|
39
|
+
let index = 0;
|
|
40
|
+
let closed = false;
|
|
41
|
+
const close = () => {
|
|
42
|
+
if (closed) return;
|
|
43
|
+
closed = true;
|
|
44
|
+
dialog.close();
|
|
45
|
+
dialog.remove();
|
|
46
|
+
if (previousFocus?.isConnected) previousFocus.focus({ preventScroll: true });
|
|
47
|
+
};
|
|
48
|
+
const choose = (choice) => {
|
|
49
|
+
if (!choice) return;
|
|
50
|
+
if (!canChoose()) { status.textContent = 'This selection is no longer available. Close and try again.'; return; }
|
|
51
|
+
close();
|
|
52
|
+
onChoose(choice.value);
|
|
53
|
+
};
|
|
54
|
+
const select = (next) => {
|
|
55
|
+
index = Math.max(0, Math.min(filtered.length - 1, next));
|
|
56
|
+
[...list.children].forEach((option, position) => option.setAttribute('aria-selected', String(position === index)));
|
|
57
|
+
const active = list.children[index];
|
|
58
|
+
if (active) {
|
|
59
|
+
input.setAttribute('aria-activedescendant', active.id);
|
|
60
|
+
active.scrollIntoView({ block: 'nearest' });
|
|
61
|
+
} else input.removeAttribute('aria-activedescendant');
|
|
62
|
+
};
|
|
63
|
+
const render = () => {
|
|
64
|
+
const query = input.value.trim().toLowerCase();
|
|
65
|
+
const matches = choices.map((choice) => ({ choice, score: query ? findFileSearchMatch(choice.search, query)?.score : 1 }))
|
|
66
|
+
.filter(({ score }) => score !== undefined).sort((a, b) => b.score - a.score);
|
|
67
|
+
filtered = matches.slice(0, 100).map(({ choice }) => choice);
|
|
68
|
+
list.replaceChildren(...filtered.map((choice, position) => {
|
|
69
|
+
const option = document.createElement('button');
|
|
70
|
+
option.type = 'button';
|
|
71
|
+
option.tabIndex = -1;
|
|
72
|
+
option.id = `${list.id}-${position}`;
|
|
73
|
+
option.setAttribute('role', 'option');
|
|
74
|
+
const label = document.createElement('span');
|
|
75
|
+
label.textContent = choice.label;
|
|
76
|
+
const detail = document.createElement('small');
|
|
77
|
+
detail.textContent = choice.detail || '';
|
|
78
|
+
option.append(label, detail);
|
|
79
|
+
option.addEventListener('click', () => choose(choice));
|
|
80
|
+
return option;
|
|
81
|
+
}));
|
|
82
|
+
status.textContent = matches.length > 100 ? 'Showing the first 100 matches. Type to narrow the list.'
|
|
83
|
+
: (matches.length ? '↑ ↓ to navigate · Enter to choose · Esc to close' : 'No matches.');
|
|
84
|
+
select(0);
|
|
85
|
+
};
|
|
86
|
+
closeButton.addEventListener('click', close);
|
|
87
|
+
dialog.addEventListener('cancel', (event) => { event.preventDefault(); close(); });
|
|
88
|
+
dialog.addEventListener('click', (event) => {
|
|
89
|
+
const bounds = dialog.getBoundingClientRect();
|
|
90
|
+
if (event.target === dialog && (event.clientX < bounds.left || event.clientX > bounds.right
|
|
91
|
+
|| event.clientY < bounds.top || event.clientY > bounds.bottom)) close();
|
|
92
|
+
});
|
|
93
|
+
dialog.addEventListener('keydown', (event) => {
|
|
94
|
+
event.stopPropagation();
|
|
95
|
+
if (event.key === 'Escape') { event.preventDefault(); close(); return; }
|
|
96
|
+
if (event.target !== input) return;
|
|
97
|
+
if (['ArrowDown', 'ArrowUp', 'Enter'].includes(event.key)) event.preventDefault();
|
|
98
|
+
if (event.key === 'ArrowDown') select(index + 1);
|
|
99
|
+
if (event.key === 'ArrowUp') select(index - 1);
|
|
100
|
+
if (event.key === 'Enter') choose(filtered[index]);
|
|
101
|
+
});
|
|
102
|
+
input.addEventListener('input', render);
|
|
103
|
+
dialog.showModal();
|
|
104
|
+
input.focus();
|
|
105
|
+
Promise.resolve().then(loadChoices).then((loaded) => {
|
|
106
|
+
if (closed) return;
|
|
107
|
+
choices = loaded.map((choice) => ({ ...choice, search: createFileSearchEntry(choice.searchText || `${choice.label} ${choice.detail || ''}`) }));
|
|
108
|
+
render();
|
|
109
|
+
}).catch(() => { if (!closed) status.textContent = 'Suggestions unavailable. Close and try again.'; });
|
|
110
|
+
return { close };
|
|
111
|
+
}
|
|
@@ -59,7 +59,6 @@ export class DrawioEmbedController {
|
|
|
59
59
|
this.hydrationIdleId = null;
|
|
60
60
|
this.hydrationQueue = [];
|
|
61
61
|
this._exitMaximizedEntry();
|
|
62
|
-
document.body.classList.remove('drawio-maximized-open');
|
|
63
62
|
this.embedEntries.forEach((entry) => entry.wrapper?.remove());
|
|
64
63
|
this.embedEntries.clear();
|
|
65
64
|
this.overlayRoot?.remove();
|
|
@@ -637,7 +636,6 @@ export class DrawioEmbedController {
|
|
|
637
636
|
const entry = this.maximizedEntry;
|
|
638
637
|
if (!entry?.wrapper) {
|
|
639
638
|
this.maximizedEntry = null;
|
|
640
|
-
document.body.classList.remove('drawio-maximized-open');
|
|
641
639
|
return;
|
|
642
640
|
}
|
|
643
641
|
|
|
@@ -656,7 +654,7 @@ export class DrawioEmbedController {
|
|
|
656
654
|
entry.restoreParent = null;
|
|
657
655
|
entry.restoreNextSibling = null;
|
|
658
656
|
this.maximizedEntry = null;
|
|
659
|
-
document.body.classList.
|
|
657
|
+
document.body.classList.toggle('drawio-maximized-open', Boolean(document.body.querySelector('.drawio-embed.is-maximized')));
|
|
660
658
|
this.overlayRoot?.classList.remove('has-maximized-entry');
|
|
661
659
|
this.syncEntryLayout(entry);
|
|
662
660
|
}
|
|
@@ -80,7 +80,6 @@ export class ExcalidrawEmbedController {
|
|
|
80
80
|
this.hydrationIdleId = null;
|
|
81
81
|
this.hydrationQueue = [];
|
|
82
82
|
this._exitMaximizedEmbed();
|
|
83
|
-
document.body.classList.remove('excalidraw-maximized-open');
|
|
84
83
|
|
|
85
84
|
this.embedEntries.forEach((entry) => {
|
|
86
85
|
this._clearEntryBootTimeout(entry);
|
|
@@ -880,7 +879,7 @@ export class ExcalidrawEmbedController {
|
|
|
880
879
|
isMaximized = false;
|
|
881
880
|
wrapper.classList.remove('is-maximized');
|
|
882
881
|
syncMaximizeButtonState();
|
|
883
|
-
document.body.classList.
|
|
882
|
+
document.body.classList.toggle('excalidraw-maximized-open', Boolean(document.body.querySelector('.excalidraw-embed.is-maximized')));
|
|
884
883
|
this._restoreMaximizedEntryLayout(entry);
|
|
885
884
|
iframe.style.height = restoreHeight;
|
|
886
885
|
if (this.maximizedEmbed?.wrapper === wrapper) {
|
|
@@ -1346,6 +1345,15 @@ export class ExcalidrawEmbedController {
|
|
|
1346
1345
|
this._syncEntryFollowState(entry);
|
|
1347
1346
|
this._postPendingCommentThread?.(entry);
|
|
1348
1347
|
this._postPendingElement?.(entry);
|
|
1348
|
+
this.pendingDisconnectRequests?.forEach((request, requestId) => {
|
|
1349
|
+
if (request.entry === entry) {
|
|
1350
|
+
this._postMessageToEntry(entry, {
|
|
1351
|
+
source: 'collabmd-host',
|
|
1352
|
+
type: 'prepare-disconnect',
|
|
1353
|
+
requestId,
|
|
1354
|
+
});
|
|
1355
|
+
}
|
|
1356
|
+
});
|
|
1349
1357
|
if (this._entryNeedsHardReload(entry)) {
|
|
1350
1358
|
void this._hydrateEntry(entry);
|
|
1351
1359
|
}
|
|
@@ -1436,7 +1444,6 @@ export class ExcalidrawEmbedController {
|
|
|
1436
1444
|
this.maximizedEmbed.exit();
|
|
1437
1445
|
}
|
|
1438
1446
|
this.maximizedEmbed = null;
|
|
1439
|
-
document.body.classList.remove('excalidraw-maximized-open');
|
|
1440
1447
|
}
|
|
1441
1448
|
|
|
1442
1449
|
_postMessageToEntry(entry, payload) {
|
|
@@ -158,6 +158,16 @@ export class FileActionController {
|
|
|
158
158
|
meta: '.base',
|
|
159
159
|
onSelect: () => this.handleNewBase({ parentDir }),
|
|
160
160
|
},
|
|
161
|
+
{
|
|
162
|
+
contextLabel: 'New canvas',
|
|
163
|
+
group: 'Diagram',
|
|
164
|
+
hint: 'JSON Canvas',
|
|
165
|
+
icon: this.getCreateActionIcon('canvas'),
|
|
166
|
+
id: 'canvas',
|
|
167
|
+
label: 'Canvas',
|
|
168
|
+
meta: '.canvas',
|
|
169
|
+
onSelect: () => this.handleNewCanvas({ parentDir }),
|
|
170
|
+
},
|
|
161
171
|
{
|
|
162
172
|
contextLabel: 'New Excalidraw drawing',
|
|
163
173
|
group: 'Diagram',
|
|
@@ -306,6 +316,7 @@ export class FileActionController {
|
|
|
306
316
|
return '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 16V4"/><path d="m7 9 5-5 5 5"/><path d="M5 20h14"/></svg>';
|
|
307
317
|
case 'base':
|
|
308
318
|
return '<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7 4h7l5 5v11a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z"/><path d="M14 4v5h5"/><path d="M8 13h8"/><path d="M8 17h6"/><path d="M8 9h3"/></svg>';
|
|
319
|
+
case 'canvas':
|
|
309
320
|
case 'drawio':
|
|
310
321
|
case 'plantuml':
|
|
311
322
|
case 'structurizr':
|
|
@@ -938,6 +949,32 @@ export class FileActionController {
|
|
|
938
949
|
});
|
|
939
950
|
}
|
|
940
951
|
|
|
952
|
+
handleNewCanvas({ parentDir = '' } = {}) {
|
|
953
|
+
const context = this.getCreateContext(parentDir);
|
|
954
|
+
this.openActionDialog({
|
|
955
|
+
title: 'Create canvas',
|
|
956
|
+
copy: 'Create a canvas for connected notes, files, links, and groups.',
|
|
957
|
+
label: `Canvas ${context.inputLabelSuffix}`,
|
|
958
|
+
hint: `${context.hintPrefix} ".canvas" is added automatically.`,
|
|
959
|
+
note: context.note,
|
|
960
|
+
placeholder: context.normalizedParentDir ? 'ideas' : 'diagrams/ideas',
|
|
961
|
+
submitLabel: 'Create canvas',
|
|
962
|
+
emptyMessage: 'Canvas path is required',
|
|
963
|
+
onSubmit: (value) => {
|
|
964
|
+
const normalizedPath = normalizeVaultPathInput(value);
|
|
965
|
+
if (!normalizedPath) {
|
|
966
|
+
this.showToast('Canvas path is required');
|
|
967
|
+
return false;
|
|
968
|
+
}
|
|
969
|
+
const filePath = ensureVaultExtension(composeVaultChildPath(context.normalizedParentDir, normalizedPath), '.canvas');
|
|
970
|
+
return this.createVaultFile(filePath, '{"nodes":[],"edges":[]}\n', {
|
|
971
|
+
errorMessage: 'Failed to create canvas',
|
|
972
|
+
openAfterCreate: true,
|
|
973
|
+
});
|
|
974
|
+
},
|
|
975
|
+
});
|
|
976
|
+
}
|
|
977
|
+
|
|
941
978
|
handleNewDrawing({ parentDir = '' } = {}) {
|
|
942
979
|
const context = this.getCreateContext(parentDir);
|
|
943
980
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isImageAttachmentFilePath } from '../../domain/file-kind.js';
|
|
2
1
|
import { FileActionController } from './file-action-controller.js';
|
|
3
2
|
import { FileTreeState } from './file-tree-state.js';
|
|
4
3
|
import { FileExplorerView } from './file-explorer-view.js';
|
|
@@ -143,7 +142,7 @@ export class FileExplorerController {
|
|
|
143
142
|
}
|
|
144
143
|
|
|
145
144
|
get flatDocumentFiles() {
|
|
146
|
-
return this.state.
|
|
145
|
+
return this.state.flatDocumentFiles;
|
|
147
146
|
}
|
|
148
147
|
|
|
149
148
|
renderTree({
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
} from '../../domain/file-kind.js';
|
|
6
6
|
import { escapeHtml } from '../domain/vault-utils.js';
|
|
7
7
|
import { findFuzzyMatch } from '../domain/file-search.js';
|
|
8
|
+
import { getActiveVaultId } from '../domain/runtime-paths.js';
|
|
8
9
|
import { getVaultPathLeaf, getVaultPathParent } from '../domain/vault-paths.js';
|
|
9
10
|
import { buttonClassNames } from './components/ui/button.js';
|
|
10
11
|
|
|
@@ -296,8 +297,13 @@ export class FileExplorerView {
|
|
|
296
297
|
}
|
|
297
298
|
item.classList.add('is-dragging');
|
|
298
299
|
if (event.dataTransfer) {
|
|
299
|
-
event.dataTransfer.effectAllowed = 'move';
|
|
300
|
+
event.dataTransfer.effectAllowed = this.dragSource.type === 'file' ? 'copyMove' : 'move';
|
|
300
301
|
event.dataTransfer.setData('text/plain', item.dataset.path);
|
|
302
|
+
if (this.dragSource.type === 'file') {
|
|
303
|
+
event.dataTransfer.setData('application/x-collabmd-vault-file', JSON.stringify({
|
|
304
|
+
path: item.dataset.path, vaultId: getActiveVaultId() || '',
|
|
305
|
+
}));
|
|
306
|
+
}
|
|
301
307
|
}
|
|
302
308
|
}
|
|
303
309
|
|
|
@@ -16,7 +16,7 @@ export function getVaultFileIconSvg(filePath, {
|
|
|
16
16
|
return createIcon(iconClass, '<path d="M7 4h7l5 5v11a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z"/><path d="M14 4v5h5"/><path d="M8 13h8"/><path d="M8 17h6"/><path d="M8 9h3"/>');
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
if (kind === 'drawio' || kind === 'plantuml' || kind === 'structurizr') {
|
|
19
|
+
if (kind === 'canvas' || kind === 'drawio' || kind === 'plantuml' || kind === 'structurizr') {
|
|
20
20
|
return createIcon(iconClass, '<rect x="3" y="4" width="7" height="6" rx="1"/><rect x="14" y="4" width="7" height="6" rx="1"/><rect x="8.5" y="14" width="7" height="6" rx="1"/><path d="M10 7h4"/><path d="M17.5 10v2.5"/><path d="M6.5 10v2.5"/><path d="M6.5 12.5h11"/>');
|
|
21
21
|
}
|
|
22
22
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { isImageAttachmentFilePath } from '../../domain/file-kind.js';
|
|
1
2
|
import { normalizeVaultPathInput } from '../domain/vault-paths.js';
|
|
2
3
|
|
|
3
|
-
function flattenTree(nodes, files = [], searchEntries = [], fileEntries = []) {
|
|
4
|
+
export function flattenTree(nodes, files = [], searchEntries = [], fileEntries = []) {
|
|
4
5
|
for (const node of nodes) {
|
|
5
6
|
if (!node?.path || !node?.type) {
|
|
6
7
|
continue;
|
|
@@ -78,6 +79,7 @@ export class FileTreeState {
|
|
|
78
79
|
constructor() {
|
|
79
80
|
this.tree = [];
|
|
80
81
|
this.flatFiles = [];
|
|
82
|
+
this.flatDocumentFiles = [];
|
|
81
83
|
this.flatFileEntries = [];
|
|
82
84
|
this.flatSearchEntries = [];
|
|
83
85
|
this.activeFilePath = null;
|
|
@@ -89,6 +91,7 @@ export class FileTreeState {
|
|
|
89
91
|
this.tree = Array.isArray(tree) ? tree : [];
|
|
90
92
|
const flattened = flattenTree(this.tree, [], [], []);
|
|
91
93
|
this.flatFiles = flattened.files;
|
|
94
|
+
this.flatDocumentFiles = flattened.files.filter((path) => !isImageAttachmentFilePath(path));
|
|
92
95
|
this.flatFileEntries = flattened.fileEntries;
|
|
93
96
|
this.flatSearchEntries = flattened.searchEntries;
|
|
94
97
|
}
|
|
@@ -40,10 +40,6 @@ export function clampImageLightboxOffset(offset, {
|
|
|
40
40
|
return Math.min(Math.max(numericOffset, -overflow), overflow);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
export function isImageLightboxWheelZoomGesture(event) {
|
|
44
|
-
return Boolean(event?.ctrlKey);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
43
|
export class ImageLightboxController {
|
|
48
44
|
constructor({
|
|
49
45
|
previewElement,
|
|
@@ -508,7 +504,7 @@ export class ImageLightboxController {
|
|
|
508
504
|
return;
|
|
509
505
|
}
|
|
510
506
|
|
|
511
|
-
if (
|
|
507
|
+
if (event.ctrlKey) {
|
|
512
508
|
event.preventDefault();
|
|
513
509
|
this.zoomBy(event.deltaY < 0 ? ZOOM_STEP : -ZOOM_STEP);
|
|
514
510
|
return;
|
|
@@ -10,6 +10,17 @@ function roleOptions(currentRole) {
|
|
|
10
10
|
)).join('');
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
function auditEventsMarkup(events) {
|
|
14
|
+
return events.map((event) => `
|
|
15
|
+
<li class="team-settings-row team-settings-row--audit">
|
|
16
|
+
<div class="team-settings-row-main">
|
|
17
|
+
<strong>${escapeHtml(event.type)}</strong>
|
|
18
|
+
<span>${escapeHtml(event.targetEmail || '')}${event.targetRole ? ` · ${escapeHtml(event.targetRole)}` : ''}</span>
|
|
19
|
+
<small>By ${escapeHtml(event.actorName || event.actorEmail)} · ${formatDate(event.createdAt)}</small>
|
|
20
|
+
</div>
|
|
21
|
+
</li>`).join('');
|
|
22
|
+
}
|
|
23
|
+
|
|
13
24
|
export class TeamSettingsController {
|
|
14
25
|
constructor({ apiClient, closeToolbarMenu, content, dialog, toastController, trigger }) {
|
|
15
26
|
this.apiClient = apiClient;
|
|
@@ -50,6 +61,7 @@ export class TeamSettingsController {
|
|
|
50
61
|
auditEvents: auditResult.events ?? [],
|
|
51
62
|
invitations: invitationsResult.invitations ?? [],
|
|
52
63
|
memberships: membershipsResult.memberships ?? [],
|
|
64
|
+
nextAuditCursor: auditResult.nextCursor ?? null,
|
|
53
65
|
});
|
|
54
66
|
}
|
|
55
67
|
|
|
@@ -58,7 +70,7 @@ export class TeamSettingsController {
|
|
|
58
70
|
this.content.replaceChildren(createFragment(`<p class="team-settings-status${error ? ' is-error' : ''}" role="status">${escapeHtml(message)}</p>`));
|
|
59
71
|
}
|
|
60
72
|
|
|
61
|
-
renderOverview({ auditEvents = [], invitations = [], memberships = [] }) {
|
|
73
|
+
renderOverview({ auditEvents = [], invitations = [], memberships = [], nextAuditCursor = null }) {
|
|
62
74
|
if (!this.content) return;
|
|
63
75
|
const memberMarkup = memberships.length > 0
|
|
64
76
|
? memberships.map((membership) => `
|
|
@@ -93,14 +105,7 @@ export class TeamSettingsController {
|
|
|
93
105
|
</li>`).join('')
|
|
94
106
|
: '<p class="team-settings-empty">No pending invitations.</p>';
|
|
95
107
|
const auditMarkup = auditEvents.length > 0
|
|
96
|
-
? auditEvents
|
|
97
|
-
<li class="team-settings-row team-settings-row--audit">
|
|
98
|
-
<div class="team-settings-row-main">
|
|
99
|
-
<strong>${escapeHtml(event.type)}</strong>
|
|
100
|
-
<span>${escapeHtml(event.targetEmail || '')}${event.targetRole ? ` · ${escapeHtml(event.targetRole)}` : ''}</span>
|
|
101
|
-
<small>By ${escapeHtml(event.actorName || event.actorEmail)} · ${formatDate(event.createdAt)}</small>
|
|
102
|
-
</div>
|
|
103
|
-
</li>`).join('')
|
|
108
|
+
? auditEventsMarkup(auditEvents)
|
|
104
109
|
: '<p class="team-settings-empty">No access history yet.</p>';
|
|
105
110
|
this.content.replaceChildren(createFragment(`
|
|
106
111
|
<section class="team-settings-section">
|
|
@@ -128,7 +133,8 @@ export class TeamSettingsController {
|
|
|
128
133
|
</section>
|
|
129
134
|
<section class="team-settings-section">
|
|
130
135
|
<h3>Access history</h3>
|
|
131
|
-
<ul class="team-settings-list team-settings-list--audit">${auditMarkup}</ul>
|
|
136
|
+
<ul class="team-settings-list team-settings-list--audit" tabindex="-1" aria-label="Access history">${auditMarkup}</ul>
|
|
137
|
+
${nextAuditCursor ? `<button class="ui-button ui-button--secondary ui-button--compact" type="button" data-audit-more="${escapeHtml(nextAuditCursor)}">Load more history</button>` : ''}
|
|
132
138
|
</section>
|
|
133
139
|
<div class="team-settings-actions">
|
|
134
140
|
<button class="ui-button ui-button--ghost" type="button" data-team-close>Close</button>
|
|
@@ -150,6 +156,30 @@ export class TeamSettingsController {
|
|
|
150
156
|
}
|
|
151
157
|
}
|
|
152
158
|
|
|
159
|
+
async loadMoreAuditEvents(button) {
|
|
160
|
+
if (button.disabled) return;
|
|
161
|
+
button.disabled = true;
|
|
162
|
+
try {
|
|
163
|
+
const page = await this.apiClient.listAuditEvents({ cursor: button.dataset.auditMore });
|
|
164
|
+
if (!this.content?.contains(button)) return;
|
|
165
|
+
const list = this.content.querySelector('.team-settings-list--audit');
|
|
166
|
+
list.append(createFragment(auditEventsMarkup(page.events ?? [])));
|
|
167
|
+
if (page.nextCursor) {
|
|
168
|
+
button.dataset.auditMore = page.nextCursor;
|
|
169
|
+
} else {
|
|
170
|
+
if (document.activeElement === button) list.focus();
|
|
171
|
+
button.remove();
|
|
172
|
+
}
|
|
173
|
+
this.setLiveMessage('More access history loaded');
|
|
174
|
+
} catch (error) {
|
|
175
|
+
if (this.content?.contains(button)) {
|
|
176
|
+
this.setLiveMessage(error.message || 'Failed to load access history');
|
|
177
|
+
}
|
|
178
|
+
} finally {
|
|
179
|
+
button.disabled = false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
153
183
|
async handleClick(event) {
|
|
154
184
|
const target = event.target.closest('button');
|
|
155
185
|
if (!target) return;
|
|
@@ -157,6 +187,10 @@ export class TeamSettingsController {
|
|
|
157
187
|
this.dialog.close();
|
|
158
188
|
return;
|
|
159
189
|
}
|
|
190
|
+
if (target.dataset.auditMore != null) {
|
|
191
|
+
await this.loadMoreAuditEvents(target);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
160
194
|
if (target.dataset.membershipRemove) {
|
|
161
195
|
if (!window.confirm(`Remove ${target.dataset.membershipEmail} from the team? They lose workspace access immediately.`)) return;
|
|
162
196
|
try {
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
flex-shrink: 0;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
.ui-button--action
|
|
9
|
-
.ui-action-button {
|
|
8
|
+
.ui-button--action {
|
|
10
9
|
min-height: var(--control-h-md);
|
|
11
10
|
padding: 0 14px;
|
|
12
11
|
border-radius: var(--radius-lg-plus);
|
|
@@ -15,18 +14,15 @@
|
|
|
15
14
|
white-space: nowrap;
|
|
16
15
|
}
|
|
17
16
|
|
|
18
|
-
.ui-button--wide
|
|
19
|
-
.ui-action-button--wide {
|
|
17
|
+
.ui-button--wide {
|
|
20
18
|
min-width: 92px;
|
|
21
19
|
}
|
|
22
20
|
|
|
23
|
-
.ui-button--surface
|
|
24
|
-
.ui-action-button--surface {
|
|
21
|
+
.ui-button--surface {
|
|
25
22
|
background: var(--color-surface-offset);
|
|
26
23
|
}
|
|
27
24
|
|
|
28
|
-
.ui-button--surface:hover:not(:disabled)
|
|
29
|
-
.ui-action-button--surface:hover:not(:disabled) {
|
|
25
|
+
.ui-button--surface:hover:not(:disabled) {
|
|
30
26
|
background: var(--color-surface-dynamic);
|
|
31
27
|
}
|
|
32
28
|
|
|
@@ -36,14 +32,6 @@
|
|
|
36
32
|
min-width: 0;
|
|
37
33
|
}
|
|
38
34
|
|
|
39
|
-
.ui-action-pill--surface {
|
|
40
|
-
background: var(--color-surface-offset);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
.ui-action-pill--surface:hover:not(:disabled) {
|
|
44
|
-
background: var(--color-surface-dynamic);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
35
|
.ui-action-icon {
|
|
48
36
|
flex-shrink: 0;
|
|
49
37
|
}
|
|
@@ -107,21 +107,3 @@
|
|
|
107
107
|
.comment-markdown th {
|
|
108
108
|
background: var(--surface-comment-offset);
|
|
109
109
|
}
|
|
110
|
-
|
|
111
|
-
.comment-markdown-preview > :not(pre):not(blockquote):not(.comment-markdown-table) {
|
|
112
|
-
display: -webkit-box;
|
|
113
|
-
-webkit-box-orient: vertical;
|
|
114
|
-
-webkit-line-clamp: 4;
|
|
115
|
-
overflow: hidden;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.comment-markdown-preview pre code {
|
|
119
|
-
width: 100%;
|
|
120
|
-
min-width: 0;
|
|
121
|
-
max-height: 6.6rem;
|
|
122
|
-
overflow: hidden;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.comment-markdown-preview .comment-markdown-table {
|
|
126
|
-
display: none;
|
|
127
|
-
}
|
|
@@ -239,24 +239,6 @@
|
|
|
239
239
|
background: transparent;
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
-
.drawio-embed-image-shell {
|
|
243
|
-
display: flex;
|
|
244
|
-
align-items: stretch;
|
|
245
|
-
justify-content: center;
|
|
246
|
-
width: 100%;
|
|
247
|
-
padding: 0;
|
|
248
|
-
border: 0;
|
|
249
|
-
background: var(--surface-embed-canvas);
|
|
250
|
-
cursor: pointer;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
.drawio-embed-image {
|
|
254
|
-
display: block;
|
|
255
|
-
width: 100%;
|
|
256
|
-
height: auto;
|
|
257
|
-
background: transparent;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
242
|
.drawio-export-iframe {
|
|
261
243
|
position: absolute;
|
|
262
244
|
width: 0;
|