@dwelle/excalidraw 0.5.0-bb58eff → 0.5.0-bcfbd91
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/browser/dev/excalidraw-assets-dev/{c4Diagram-9cddb37f-5K5MMBTZ.js → c4Diagram-9cddb37f-Z2BVR4KG.js} +4 -4
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-YLFK45LY.js → chunk-2R746FJ3.js} +21 -21
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-HPE2QM6Z.js → chunk-4YGSGIMJ.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-FG5PX37Z.js → chunk-7ZK24NYG.js} +398 -930
- package/dist/browser/dev/excalidraw-assets-dev/chunk-7ZK24NYG.js.map +7 -0
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-VJWYXZRD.js → chunk-A4L3DQO2.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-LARCHXKL.js → chunk-CWUUGB6C.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-PTRCE3YZ.js → chunk-DLCKQH3C.js} +4 -4
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-ABU3Y4P6.js → chunk-IVZGHBP3.js} +5 -5
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-VVJS3CBB.js → chunk-J3RT3AEL.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-AQ5OI7FF.js → chunk-KN673SBB.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-OBKV4VWD.js → chunk-OGN4DE2Q.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-JRHEG4KR.js → chunk-P3NJMBHG.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-UN4RKPVH.js → chunk-QP4L67PY.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-AU5UG6FO.js → chunk-U7QYLFAH.js} +6 -6
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-FSI24XHB.js → chunk-ULL4JVA4.js} +7 -7
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-2WPXONHI.js → chunk-WFIY45QO.js} +2 -5
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-2WPXONHI.js.map → chunk-WFIY45QO.js.map} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{chunk-RMILGNZX.js → chunk-WWRYLVJC.js} +4 -4
- package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-bc733c3b-NWRL2CDH.js → classDiagram-bc733c3b-K5SPPM5G.js} +7 -7
- package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-8931bdaf-Y5FPX4CT.js → classDiagram-v2-8931bdaf-LMQ4MBCJ.js} +10 -10
- package/dist/browser/dev/excalidraw-assets-dev/{directory-open-01563666-VWSBJ543.js → directory-open-01563666-HET5VGVW.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{directory-open-4ed118d0-FYNYOZXP.js → directory-open-4ed118d0-EEZTUAOR.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/dist-MMLCHBGE.js +10 -0
- package/dist/browser/dev/excalidraw-assets-dev/{en-OFPNSLTO.js → en-CJBKYSM5.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-f6946109-URHWBVQF.js → erDiagram-f6946109-T5ZYWW62.js} +5 -5
- package/dist/browser/dev/excalidraw-assets-dev/{file-open-002ab408-K7UWK3UX.js → file-open-002ab408-2OQEKDVS.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{file-open-7c801643-PUS6AQBV.js → file-open-7c801643-7IDWBVQC.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{file-save-3189631c-AVBJT4K7.js → file-save-3189631c-D66DZOSK.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{file-save-745eba88-FCWOWXVA.js → file-save-745eba88-3NARDH2Z.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-93327f21-ARY24FIN.js → flowDiagram-93327f21-OFTBRZYD.js} +11 -11
- package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-476db779-Y3LYCDLM.js → flowDiagram-v2-476db779-VVUICW5U.js} +11 -11
- package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5082a990-DTGYPOS7.js → flowchart-elk-definition-5082a990-KDDK5LFE.js} +8 -8
- package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-7ce12d6b-GWKDCJYX.js → ganttDiagram-7ce12d6b-XW6BLNYB.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-1e960c50-A4SIEE63.js → gitGraphDiagram-1e960c50-WAVVX7YE.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{image-ZQHNSB7P.css → image-BMBZMPAN.css} +20 -99
- package/dist/browser/dev/excalidraw-assets-dev/image-BMBZMPAN.css.map +7 -0
- package/dist/browser/dev/excalidraw-assets-dev/{image-J27XZPQC.js → image-DG6G3CCZ.js} +6 -6
- package/dist/browser/dev/excalidraw-assets-dev/{image-blob-reduce.esm-BDWVJKFQ.js → image-blob-reduce.esm-OJYOZNL4.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-264bed3e-AUF35UHX.js → infoDiagram-264bed3e-SMYVWNAJ.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-31be0096-ADAT3O42.js → journeyDiagram-31be0096-IXIWAKJV.js} +4 -4
- package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-4fc2557c-YC2LM75P.js → mindmap-definition-4fc2557c-H5WTPEBY.js} +4 -4
- package/dist/browser/dev/excalidraw-assets-dev/{pica-GXUQBC7B.js → pica-RRHXYZO2.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-157505fe-4XR6DLIZ.js → pieDiagram-157505fe-3LXENDEP.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-fd70f2d0-LIR55Z6M.js → quadrantDiagram-fd70f2d0-CBA7LD4X.js} +3 -3
- package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-19c99588-NKRCRRBM.js → requirementDiagram-19c99588-53JLZTYM.js} +5 -5
- package/dist/browser/dev/excalidraw-assets-dev/{roundRect-ZNZYUVWJ.js → roundRect-5HI6M3OA.js} +2 -2
- package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-5dfd0049-VUKNRO5G.js → sequenceDiagram-5dfd0049-XJRLBGS7.js} +4 -4
- package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-133e3642-3NYPG4IW.js → stateDiagram-133e3642-ZVPN2MPZ.js} +6 -6
- package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-6371a76b-YINZI7AG.js → stateDiagram-v2-6371a76b-QIW3VCSC.js} +10 -10
- package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-5ed366f4-KWC42LPI.js → timeline-definition-5ed366f4-LGCWVNZT.js} +3 -3
- package/dist/browser/dev/index.css +19 -98
- package/dist/browser/dev/index.css.map +2 -2
- package/dist/browser/dev/index.js +5 -5
- package/dist/browser/prod/excalidraw-assets/{c4Diagram-9cddb37f-UIUBGLLC.js → c4Diagram-9cddb37f-CSAXQUMT.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-I32TF3FD.js → chunk-56HIV6N6.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-X3V4W6Y3.js → chunk-5PG4MN6E.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-XXT5RS66.js → chunk-5PXNTGLF.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-EQDCUI7P.js → chunk-6LDES2GZ.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-4C6GEPVI.js → chunk-BWJEY7EX.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-LOWTGNCV.js → chunk-CP5W5ACF.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/chunk-DBUEOZT5.js +269 -0
- package/dist/browser/prod/excalidraw-assets/{chunk-MJ2YKZ3B.js → chunk-DF24HG3F.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-FVDUD6XA.js → chunk-DVVGVVYL.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-7CLKPETF.js → chunk-GTO2REC5.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-YGSQT3TE.js → chunk-KQZZ435A.js} +2 -2
- package/dist/browser/prod/excalidraw-assets/{chunk-RVQN2TTU.js → chunk-ONH2E3HD.js} +3 -3
- package/dist/browser/prod/excalidraw-assets/{chunk-FGOIQKRL.js → chunk-QK2I4STK.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-VZ5ZGWAN.js → chunk-TGFMJVS6.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-5EY4KGYU.js → chunk-V6GEKVIM.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{chunk-VI6ARPX6.js → chunk-W7OUYNQP.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{classDiagram-bc733c3b-6BX33ZTH.js → classDiagram-bc733c3b-FZUH7HPQ.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{classDiagram-v2-8931bdaf-ACBVEHQO.js → classDiagram-v2-8931bdaf-LRVGH5BD.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{directory-open-01563666-C2PFQBKL.js → directory-open-01563666-WBDEPWFN.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{directory-open-4ed118d0-E55HNHTS.js → directory-open-4ed118d0-SHTOCZXQ.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/dist-JMLVFQ4W.js +1 -0
- package/dist/browser/prod/excalidraw-assets/{en-46OXMRU6.js → en-6EOGX47W.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{erDiagram-f6946109-TYWREFGK.js → erDiagram-f6946109-IIBR3HHT.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{file-open-002ab408-FQU3HANB.js → file-open-002ab408-7YMAGCE3.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{file-open-7c801643-BCD55L36.js → file-open-7c801643-2UIR6WEW.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{file-save-3189631c-TAXV2OAM.js → file-save-3189631c-UAJTEO5I.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{file-save-745eba88-DPWZ3VE6.js → file-save-745eba88-TOUSYUTX.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{flowDiagram-93327f21-4VGGLTSV.js → flowDiagram-93327f21-XIY3FFTU.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/flowDiagram-v2-476db779-EQMWJJEV.js +1 -0
- package/dist/browser/prod/excalidraw-assets/{flowchart-elk-definition-5082a990-DWI3JPDY.js → flowchart-elk-definition-5082a990-LJBHN7JH.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{ganttDiagram-7ce12d6b-FGLMWLXT.js → ganttDiagram-7ce12d6b-CBM3PKRU.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{gitGraphDiagram-1e960c50-6PYRBTDK.js → gitGraphDiagram-1e960c50-TZDQTV4Y.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/image-NFLQBKBU.js +1 -0
- package/dist/browser/prod/excalidraw-assets/image-TGGHFJHC.css +1 -0
- package/dist/browser/prod/excalidraw-assets/{image-blob-reduce.esm-7C326NDW.js → image-blob-reduce.esm-NOK55Z4R.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{infoDiagram-264bed3e-B3RQYU4J.js → infoDiagram-264bed3e-VTVTW2PT.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{journeyDiagram-31be0096-SPHJ2Z6S.js → journeyDiagram-31be0096-3RXCXFNL.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{mindmap-definition-4fc2557c-EKE5IPT5.js → mindmap-definition-4fc2557c-U2MTITUZ.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{pica-WBNTBMON.js → pica-FN4U5BBA.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{pieDiagram-157505fe-R3GPKUOS.js → pieDiagram-157505fe-UPOKDCDE.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{quadrantDiagram-fd70f2d0-E6DDN2FC.js → quadrantDiagram-fd70f2d0-G6SC76BN.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{requirementDiagram-19c99588-EDK37RW4.js → requirementDiagram-19c99588-OPA5Q2CG.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{roundRect-P4IDSYXR.js → roundRect-YDYZGRTK.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{sequenceDiagram-5dfd0049-SDPAZI6N.js → sequenceDiagram-5dfd0049-RLLGIVI3.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{stateDiagram-133e3642-2GOIU2WH.js → stateDiagram-133e3642-POU4VV6D.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{stateDiagram-v2-6371a76b-HIFSCSY4.js → stateDiagram-v2-6371a76b-TI5DGF27.js} +1 -1
- package/dist/browser/prod/excalidraw-assets/{timeline-definition-5ed366f4-KTXR6TKT.js → timeline-definition-5ed366f4-RRRA7YP4.js} +1 -1
- package/dist/browser/prod/index.css +1 -1
- package/dist/browser/prod/index.js +1 -1
- package/dist/{prod/en-54AU74IP.json → dev/en-JBWHKG2R.json} +1 -4
- package/dist/dev/index.css +19 -98
- package/dist/dev/index.css.map +2 -2
- package/dist/dev/index.js +524 -863
- package/dist/dev/index.js.map +4 -4
- package/dist/excalidraw/actions/actionAddToLibrary.d.ts +0 -9
- package/dist/excalidraw/actions/actionBoundText.d.ts +0 -6
- package/dist/excalidraw/actions/actionBoundText.js +1 -4
- package/dist/excalidraw/actions/actionCanvas.d.ts +0 -36
- package/dist/excalidraw/actions/actionClipboard.d.ts +0 -21
- package/dist/excalidraw/actions/actionDeleteSelected.d.ts +0 -9
- package/dist/excalidraw/actions/actionDuplicateSelection.js +0 -4
- package/dist/excalidraw/actions/actionElementLock.d.ts +0 -6
- package/dist/excalidraw/actions/actionExport.d.ts +1 -28
- package/dist/excalidraw/actions/actionFinalize.d.ts +0 -6
- package/dist/excalidraw/actions/actionFrame.d.ts +0 -9
- package/dist/excalidraw/actions/actionGroup.d.ts +0 -6
- package/dist/excalidraw/actions/actionGroup.js +2 -4
- package/dist/excalidraw/actions/actionHistory.js +0 -3
- package/dist/excalidraw/actions/actionLinearEditor.d.ts +0 -3
- package/dist/excalidraw/actions/actionLink.d.ts +0 -3
- package/dist/excalidraw/actions/actionMenu.d.ts +0 -9
- package/dist/excalidraw/actions/actionNavigate.d.ts +0 -6
- package/dist/excalidraw/actions/actionNavigate.js +6 -15
- package/dist/excalidraw/actions/actionProperties.d.ts +0 -39
- package/dist/excalidraw/actions/actionSelectAll.d.ts +0 -3
- package/dist/excalidraw/actions/actionStyles.d.ts +0 -3
- package/dist/excalidraw/actions/actionToggleGridMode.d.ts +0 -3
- package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +0 -3
- package/dist/excalidraw/actions/actionToggleStats.d.ts +0 -3
- package/dist/excalidraw/actions/actionToggleViewMode.d.ts +0 -3
- package/dist/excalidraw/actions/actionToggleZenMode.d.ts +0 -3
- package/dist/excalidraw/actions/actionZindex.d.ts +11 -11
- package/dist/excalidraw/clients.d.ts +1 -10
- package/dist/excalidraw/clients.js +6 -153
- package/dist/excalidraw/components/App.d.ts +3 -3
- package/dist/excalidraw/components/App.js +38 -20
- package/dist/excalidraw/components/Avatar.d.ts +3 -2
- package/dist/excalidraw/components/Avatar.js +5 -2
- package/dist/excalidraw/components/UserList.d.ts +7 -3
- package/dist/excalidraw/components/UserList.js +34 -63
- package/dist/excalidraw/components/canvases/InteractiveCanvas.js +22 -19
- package/dist/excalidraw/components/icons.d.ts +0 -2
- package/dist/excalidraw/components/icons.js +1 -3
- package/dist/excalidraw/constants.d.ts +3 -2
- package/dist/excalidraw/constants.js +3 -3
- package/dist/excalidraw/data/restore.d.ts +3 -3
- package/dist/excalidraw/data/restore.js +6 -5
- package/dist/excalidraw/data/transform.d.ts +1 -1
- package/dist/excalidraw/data/transform.js +3 -4
- package/dist/excalidraw/element/embeddable.d.ts +0 -3
- package/dist/excalidraw/element/linearElementEditor.d.ts +1 -5
- package/dist/excalidraw/element/newElement.d.ts +1 -1
- package/dist/excalidraw/element/newElement.js +1 -2
- package/dist/excalidraw/element/types.d.ts +2 -14
- package/dist/excalidraw/errors.d.ts +0 -3
- package/dist/excalidraw/errors.js +0 -3
- package/dist/excalidraw/frame.d.ts +1 -1
- package/dist/excalidraw/laser-trails.js +1 -1
- package/dist/excalidraw/locales/en.json +1 -4
- package/dist/excalidraw/renderer/interactiveScene.js +119 -13
- package/dist/excalidraw/renderer/staticScene.js +4 -5
- package/dist/excalidraw/scene/Scene.d.ts +6 -7
- package/dist/excalidraw/scene/Scene.js +13 -28
- package/dist/excalidraw/scene/export.js +1 -2
- package/dist/excalidraw/scene/types.d.ts +21 -10
- package/dist/excalidraw/types.d.ts +4 -7
- package/dist/excalidraw/utils.js +0 -3
- package/dist/excalidraw/zindex.d.ts +2 -2
- package/dist/excalidraw/zindex.js +13 -9
- package/dist/{dev/en-54AU74IP.json → prod/en-JBWHKG2R.json} +1 -4
- package/dist/prod/index.css +1 -1
- package/dist/prod/index.js +39 -39
- package/package.json +3 -4
- package/dist/browser/dev/excalidraw-assets-dev/chunk-FG5PX37Z.js.map +0 -7
- package/dist/browser/dev/excalidraw-assets-dev/dist-HOOQ44NM.js +0 -10
- package/dist/browser/dev/excalidraw-assets-dev/image-ZQHNSB7P.css.map +0 -7
- package/dist/browser/prod/excalidraw-assets/chunk-D2I3QE7U.js +0 -269
- package/dist/browser/prod/excalidraw-assets/dist-XTBKPFET.js +0 -1
- package/dist/browser/prod/excalidraw-assets/flowDiagram-v2-476db779-KLWICWG3.js +0 -1
- package/dist/browser/prod/excalidraw-assets/image-M662KTMJ.css +0 -1
- package/dist/browser/prod/excalidraw-assets/image-XP52XYUU.js +0 -1
- package/dist/excalidraw/data/reconcile.d.ts +0 -6
- package/dist/excalidraw/data/reconcile.js +0 -49
- package/dist/excalidraw/fractionalIndex.d.ts +0 -40
- package/dist/excalidraw/fractionalIndex.js +0 -241
- /package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-9cddb37f-5K5MMBTZ.js.map → c4Diagram-9cddb37f-Z2BVR4KG.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-YLFK45LY.js.map → chunk-2R746FJ3.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-HPE2QM6Z.js.map → chunk-4YGSGIMJ.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-VJWYXZRD.js.map → chunk-A4L3DQO2.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-LARCHXKL.js.map → chunk-CWUUGB6C.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-PTRCE3YZ.js.map → chunk-DLCKQH3C.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-ABU3Y4P6.js.map → chunk-IVZGHBP3.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-VVJS3CBB.js.map → chunk-J3RT3AEL.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-AQ5OI7FF.js.map → chunk-KN673SBB.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-OBKV4VWD.js.map → chunk-OGN4DE2Q.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-JRHEG4KR.js.map → chunk-P3NJMBHG.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-UN4RKPVH.js.map → chunk-QP4L67PY.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-AU5UG6FO.js.map → chunk-U7QYLFAH.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-FSI24XHB.js.map → chunk-ULL4JVA4.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{chunk-RMILGNZX.js.map → chunk-WWRYLVJC.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-bc733c3b-NWRL2CDH.js.map → classDiagram-bc733c3b-K5SPPM5G.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-8931bdaf-Y5FPX4CT.js.map → classDiagram-v2-8931bdaf-LMQ4MBCJ.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{directory-open-01563666-VWSBJ543.js.map → directory-open-01563666-HET5VGVW.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{directory-open-4ed118d0-FYNYOZXP.js.map → directory-open-4ed118d0-EEZTUAOR.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{dist-HOOQ44NM.js.map → dist-MMLCHBGE.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{en-OFPNSLTO.js.map → en-CJBKYSM5.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-f6946109-URHWBVQF.js.map → erDiagram-f6946109-T5ZYWW62.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{file-open-002ab408-K7UWK3UX.js.map → file-open-002ab408-2OQEKDVS.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{file-open-7c801643-PUS6AQBV.js.map → file-open-7c801643-7IDWBVQC.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{file-save-3189631c-AVBJT4K7.js.map → file-save-3189631c-D66DZOSK.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{file-save-745eba88-FCWOWXVA.js.map → file-save-745eba88-3NARDH2Z.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-93327f21-ARY24FIN.js.map → flowDiagram-93327f21-OFTBRZYD.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-476db779-Y3LYCDLM.js.map → flowDiagram-v2-476db779-VVUICW5U.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5082a990-DTGYPOS7.js.map → flowchart-elk-definition-5082a990-KDDK5LFE.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-7ce12d6b-GWKDCJYX.js.map → ganttDiagram-7ce12d6b-XW6BLNYB.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-1e960c50-A4SIEE63.js.map → gitGraphDiagram-1e960c50-WAVVX7YE.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{image-J27XZPQC.js.map → image-DG6G3CCZ.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{image-blob-reduce.esm-BDWVJKFQ.js.map → image-blob-reduce.esm-OJYOZNL4.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-264bed3e-AUF35UHX.js.map → infoDiagram-264bed3e-SMYVWNAJ.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-31be0096-ADAT3O42.js.map → journeyDiagram-31be0096-IXIWAKJV.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-4fc2557c-YC2LM75P.js.map → mindmap-definition-4fc2557c-H5WTPEBY.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{pica-GXUQBC7B.js.map → pica-RRHXYZO2.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-157505fe-4XR6DLIZ.js.map → pieDiagram-157505fe-3LXENDEP.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-fd70f2d0-LIR55Z6M.js.map → quadrantDiagram-fd70f2d0-CBA7LD4X.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-19c99588-NKRCRRBM.js.map → requirementDiagram-19c99588-53JLZTYM.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{roundRect-ZNZYUVWJ.js.map → roundRect-5HI6M3OA.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-5dfd0049-VUKNRO5G.js.map → sequenceDiagram-5dfd0049-XJRLBGS7.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-133e3642-3NYPG4IW.js.map → stateDiagram-133e3642-ZVPN2MPZ.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-6371a76b-YINZI7AG.js.map → stateDiagram-v2-6371a76b-QIW3VCSC.js.map} +0 -0
- /package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-5ed366f4-KWC42LPI.js.map → timeline-definition-5ed366f4-LGCWVNZT.js.map} +0 -0
|
@@ -11,7 +11,7 @@ import { actions } from "../actions/register";
|
|
|
11
11
|
import { trackEvent } from "../analytics";
|
|
12
12
|
import { getDefaultAppState, isEraserActive, isHandToolActive, } from "../appState";
|
|
13
13
|
import { copyTextToSystemClipboard, parseClipboard, } from "../clipboard";
|
|
14
|
-
import { APP_NAME, CURSOR_TYPE, DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT, DEFAULT_VERTICAL_ALIGN, DRAGGING_THRESHOLD, ELEMENT_SHIFT_TRANSLATE_AMOUNT, ELEMENT_TRANSLATE_AMOUNT, ENV, EVENT, FRAME_STYLE, GRID_SIZE, IMAGE_MIME_TYPES, IMAGE_RENDER_TIMEOUT, isBrave, LINE_CONFIRM_THRESHOLD, MAX_ALLOWED_FILE_BYTES, MIME_TYPES, MQ_MAX_HEIGHT_LANDSCAPE, MQ_MAX_WIDTH_LANDSCAPE, MQ_MAX_WIDTH_PORTRAIT, MQ_RIGHT_SIDEBAR_MIN_WIDTH, POINTER_BUTTON, ROUNDNESS, SCROLL_TIMEOUT, TAP_TWICE_TIMEOUT, TEXT_TO_CENTER_SNAP_THRESHOLD, THEME, THEME_FILTER, TOUCH_CTX_MENU_TIMEOUT, VERTICAL_ALIGN, YOUTUBE_STATES, ZOOM_STEP, POINTER_EVENTS, TOOL_TYPE, EDITOR_LS_KEYS, isIOS,
|
|
14
|
+
import { APP_NAME, CURSOR_TYPE, DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT, DEFAULT_VERTICAL_ALIGN, DRAGGING_THRESHOLD, ELEMENT_SHIFT_TRANSLATE_AMOUNT, ELEMENT_TRANSLATE_AMOUNT, ENV, EVENT, FRAME_STYLE, GRID_SIZE, IMAGE_MIME_TYPES, IMAGE_RENDER_TIMEOUT, isBrave, LINE_CONFIRM_THRESHOLD, MAX_ALLOWED_FILE_BYTES, MIME_TYPES, MQ_MAX_HEIGHT_LANDSCAPE, MQ_MAX_WIDTH_LANDSCAPE, MQ_MAX_WIDTH_PORTRAIT, MQ_RIGHT_SIDEBAR_MIN_WIDTH, POINTER_BUTTON, ROUNDNESS, SCROLL_TIMEOUT, TAP_TWICE_TIMEOUT, TEXT_TO_CENTER_SNAP_THRESHOLD, THEME, THEME_FILTER, TOUCH_CTX_MENU_TIMEOUT, VERTICAL_ALIGN, YOUTUBE_STATES, ZOOM_STEP, POINTER_EVENTS, TOOL_TYPE, EDITOR_LS_KEYS, isIOS, } from "../constants";
|
|
15
15
|
import { exportAsImage, loadFromBlob } from "../data";
|
|
16
16
|
import Library, { distributeLibraryItemsOnSquareGrid } from "../data/library";
|
|
17
17
|
import { restore, restoreElements } from "../data/restore";
|
|
@@ -33,7 +33,7 @@ import { calculateScrollCenter, getElementsAtPosition, getElementsWithinSelectio
|
|
|
33
33
|
import Scene from "../scene/Scene";
|
|
34
34
|
import { getStateForZoom } from "../scene/zoom";
|
|
35
35
|
import { findShapeByKey } from "../shapes";
|
|
36
|
-
import { debounce, distance, getFontString, getNearestScrollableContainer, isInputLike, isToolIcon, isWritableElement, sceneCoordsToViewportCoords, tupleToCoors, viewportCoordsToSceneCoords, wrapEvent, updateObject, updateActiveTool, getShortcutKey, isTransparent, easeToValuesRAF, muteFSAbortError, isTestEnv, easeOut,
|
|
36
|
+
import { debounce, distance, getFontString, getNearestScrollableContainer, isInputLike, isToolIcon, isWritableElement, sceneCoordsToViewportCoords, tupleToCoors, viewportCoordsToSceneCoords, wrapEvent, updateObject, updateActiveTool, getShortcutKey, isTransparent, easeToValuesRAF, muteFSAbortError, isTestEnv, easeOut, updateStable, addEventListener, normalizeEOL, getDateTime, } from "../utils";
|
|
37
37
|
import { createSrcDoc, embeddableURLValidator, maybeParseEmbedSrc, getEmbedLink, } from "../element/embeddable";
|
|
38
38
|
import { ContextMenu, CONTEXT_MENU_SEPARATOR, } from "./ContextMenu";
|
|
39
39
|
import LayerUI from "./LayerUI";
|
|
@@ -85,7 +85,6 @@ import { withBatchedUpdates, withBatchedUpdatesThrottled } from "../reactUtils";
|
|
|
85
85
|
import { getRenderOpacity } from "../renderer/renderElement";
|
|
86
86
|
import { textWysiwyg } from "../element/textWysiwyg";
|
|
87
87
|
import { isOverScrollBars } from "../scene/scrollbars";
|
|
88
|
-
import { syncInvalidIndices, syncMovedIndices } from "../fractionalIndex";
|
|
89
88
|
import { isPointHittingLink, isPointHittingLinkIcon, } from "./hyperlink/helpers";
|
|
90
89
|
const AppContext = React.createContext(null);
|
|
91
90
|
const AppPropsContext = React.createContext(null);
|
|
@@ -128,6 +127,7 @@ export const useExcalidrawElements = () => useContext(ExcalidrawElementsContext)
|
|
|
128
127
|
export const useExcalidrawAppState = () => useContext(ExcalidrawAppStateContext);
|
|
129
128
|
export const useExcalidrawSetAppState = () => useContext(ExcalidrawSetAppStateContext);
|
|
130
129
|
export const useExcalidrawActionManager = () => useContext(ExcalidrawActionManagerContext);
|
|
130
|
+
const supportsResizeObserver = typeof window !== "undefined" && "ResizeObserver" in window;
|
|
131
131
|
let didTapTwice = false;
|
|
132
132
|
let tappedTwiceTimer = 0;
|
|
133
133
|
let isHoldingSpace = false;
|
|
@@ -1139,7 +1139,7 @@ class App extends React.Component {
|
|
|
1139
1139
|
opacity: 100,
|
|
1140
1140
|
locked: false,
|
|
1141
1141
|
});
|
|
1142
|
-
this.scene.
|
|
1142
|
+
this.scene.addNewElement(frame);
|
|
1143
1143
|
for (const child of selectedElements) {
|
|
1144
1144
|
mutateElement(child, { frameId: frame.id });
|
|
1145
1145
|
}
|
|
@@ -1952,15 +1952,16 @@ class App extends React.Component {
|
|
|
1952
1952
|
}), {
|
|
1953
1953
|
randomizeSeed: !opts.retainSeed,
|
|
1954
1954
|
});
|
|
1955
|
-
const
|
|
1956
|
-
|
|
1957
|
-
|
|
1955
|
+
const allElements = [
|
|
1956
|
+
...this.scene.getElementsIncludingDeleted(),
|
|
1957
|
+
...newElements,
|
|
1958
|
+
];
|
|
1958
1959
|
const topLayerFrame = this.getTopLayerFrameAtSceneCoords({ x, y });
|
|
1959
1960
|
if (topLayerFrame) {
|
|
1960
1961
|
const eligibleElements = filterElementsEligibleAsFrameChildren(newElements, topLayerFrame);
|
|
1961
|
-
addElementsToFrame(
|
|
1962
|
+
addElementsToFrame(allElements, eligibleElements, topLayerFrame);
|
|
1962
1963
|
}
|
|
1963
|
-
this.scene.replaceAllElements(
|
|
1964
|
+
this.scene.replaceAllElements(allElements);
|
|
1964
1965
|
newElements.forEach((newElement) => {
|
|
1965
1966
|
if (isTextElement(newElement) && isBoundToContainer(newElement)) {
|
|
1966
1967
|
const container = getContainerElement(newElement, this.scene.getElementsMapIncludingDeleted());
|
|
@@ -2128,7 +2129,16 @@ class App extends React.Component {
|
|
|
2128
2129
|
if (textElements.length === 0) {
|
|
2129
2130
|
return;
|
|
2130
2131
|
}
|
|
2131
|
-
|
|
2132
|
+
const frameId = textElements[0].frameId;
|
|
2133
|
+
if (frameId) {
|
|
2134
|
+
this.scene.insertElementsAtIndex(textElements, this.scene.getElementIndex(frameId));
|
|
2135
|
+
}
|
|
2136
|
+
else {
|
|
2137
|
+
this.scene.replaceAllElements([
|
|
2138
|
+
...this.scene.getElementsIncludingDeleted(),
|
|
2139
|
+
...textElements,
|
|
2140
|
+
]);
|
|
2141
|
+
}
|
|
2132
2142
|
this.setState({
|
|
2133
2143
|
selectedElementIds: makeNextSelectedElementIds(Object.fromEntries(textElements.map((el) => [el.id, true])), this.state),
|
|
2134
2144
|
});
|
|
@@ -3012,7 +3022,7 @@ class App extends React.Component {
|
|
|
3012
3022
|
this.scene.insertElementAtIndex(element, containerIndex + 1);
|
|
3013
3023
|
}
|
|
3014
3024
|
else {
|
|
3015
|
-
this.scene.
|
|
3025
|
+
this.scene.addNewElement(element);
|
|
3016
3026
|
}
|
|
3017
3027
|
}
|
|
3018
3028
|
this.setState({
|
|
@@ -4308,7 +4318,7 @@ class App extends React.Component {
|
|
|
4308
4318
|
pressures,
|
|
4309
4319
|
});
|
|
4310
4320
|
const boundElement = getHoveredElementForBinding(pointerDownState.origin, this.scene.getNonDeletedElements(), this.scene.getNonDeletedElementsMap());
|
|
4311
|
-
this.scene.
|
|
4321
|
+
this.scene.addNewElement(element);
|
|
4312
4322
|
this.setState({
|
|
4313
4323
|
draggingElement: element,
|
|
4314
4324
|
editingElement: element,
|
|
@@ -4336,7 +4346,10 @@ class App extends React.Component {
|
|
|
4336
4346
|
width,
|
|
4337
4347
|
height,
|
|
4338
4348
|
});
|
|
4339
|
-
this.scene.
|
|
4349
|
+
this.scene.replaceAllElements([
|
|
4350
|
+
...this.scene.getElementsIncludingDeleted(),
|
|
4351
|
+
element,
|
|
4352
|
+
]);
|
|
4340
4353
|
return element;
|
|
4341
4354
|
};
|
|
4342
4355
|
//create rectangle element with youtube top left on nearest grid point width / hight 640/360
|
|
@@ -4371,7 +4384,10 @@ class App extends React.Component {
|
|
|
4371
4384
|
height: embedLink.intrinsicSize.h,
|
|
4372
4385
|
link,
|
|
4373
4386
|
});
|
|
4374
|
-
this.scene.
|
|
4387
|
+
this.scene.replaceAllElements([
|
|
4388
|
+
...this.scene.getElementsIncludingDeleted(),
|
|
4389
|
+
element,
|
|
4390
|
+
]);
|
|
4375
4391
|
return element;
|
|
4376
4392
|
};
|
|
4377
4393
|
createImageElement = ({ sceneX, sceneY, addToFrameUnderCursor = true, }) => {
|
|
@@ -4480,7 +4496,7 @@ class App extends React.Component {
|
|
|
4480
4496
|
points: [...element.points, [0, 0]],
|
|
4481
4497
|
});
|
|
4482
4498
|
const boundElement = getHoveredElementForBinding(pointerDownState.origin, this.scene.getNonDeletedElements(), this.scene.getNonDeletedElementsMap());
|
|
4483
|
-
this.scene.
|
|
4499
|
+
this.scene.addNewElement(element);
|
|
4484
4500
|
this.setState({
|
|
4485
4501
|
draggingElement: element,
|
|
4486
4502
|
editingElement: element,
|
|
@@ -4540,7 +4556,7 @@ class App extends React.Component {
|
|
|
4540
4556
|
});
|
|
4541
4557
|
}
|
|
4542
4558
|
else {
|
|
4543
|
-
this.scene.
|
|
4559
|
+
this.scene.addNewElement(element);
|
|
4544
4560
|
this.setState({
|
|
4545
4561
|
multiElement: null,
|
|
4546
4562
|
draggingElement: element,
|
|
@@ -4562,7 +4578,10 @@ class App extends React.Component {
|
|
|
4562
4578
|
const frame = type === TOOL_TYPE.magicframe
|
|
4563
4579
|
? newMagicFrameElement(constructorOpts)
|
|
4564
4580
|
: newFrameElement(constructorOpts);
|
|
4565
|
-
this.scene.
|
|
4581
|
+
this.scene.replaceAllElements([
|
|
4582
|
+
...this.scene.getElementsIncludingDeleted(),
|
|
4583
|
+
frame,
|
|
4584
|
+
]);
|
|
4566
4585
|
this.setState({
|
|
4567
4586
|
multiElement: null,
|
|
4568
4587
|
draggingElement: frame,
|
|
@@ -4820,7 +4839,6 @@ class App extends React.Component {
|
|
|
4820
4839
|
}
|
|
4821
4840
|
}
|
|
4822
4841
|
const nextSceneElements = [...nextElements, ...elementsToAppend];
|
|
4823
|
-
syncMovedIndices(nextSceneElements, arrayToMap(elementsToAppend));
|
|
4824
4842
|
bindTextToShapeAfterDuplication(nextElements, elementsToAppend, oldIdToDuplicatedId);
|
|
4825
4843
|
fixBindingsAfterDuplication(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, "duplicatesServeAsOld");
|
|
4826
4844
|
bindElementsToFramesAfterDuplication(nextSceneElements, elementsToAppend, oldIdToDuplicatedId);
|
|
@@ -5593,7 +5611,7 @@ class App extends React.Component {
|
|
|
5593
5611
|
this.setState({ errorMessage: t("errors.imageToolNotSupported") });
|
|
5594
5612
|
return;
|
|
5595
5613
|
}
|
|
5596
|
-
this.scene.
|
|
5614
|
+
this.scene.addNewElement(imageElement);
|
|
5597
5615
|
try {
|
|
5598
5616
|
return await this.initializeImage({
|
|
5599
5617
|
imageFile,
|
|
@@ -6365,7 +6383,7 @@ export const createTestHook = () => {
|
|
|
6365
6383
|
return this.app?.scene.getElementsIncludingDeleted();
|
|
6366
6384
|
},
|
|
6367
6385
|
set(elements) {
|
|
6368
|
-
return this.app?.scene.replaceAllElements(
|
|
6386
|
+
return this.app?.scene.replaceAllElements(elements);
|
|
6369
6387
|
},
|
|
6370
6388
|
},
|
|
6371
6389
|
});
|
|
@@ -5,7 +5,8 @@ type AvatarProps = {
|
|
|
5
5
|
color: string;
|
|
6
6
|
name: string;
|
|
7
7
|
src?: string;
|
|
8
|
-
|
|
8
|
+
isBeingFollowed?: boolean;
|
|
9
|
+
isCurrentUser: boolean;
|
|
9
10
|
};
|
|
10
|
-
export declare const Avatar: ({ color, onClick, name, src,
|
|
11
|
+
export declare const Avatar: ({ color, onClick, name, src, isBeingFollowed, isCurrentUser, }: AvatarProps) => JSX.Element;
|
|
11
12
|
export {};
|
|
@@ -3,10 +3,13 @@ import "./Avatar.scss";
|
|
|
3
3
|
import { useState } from "react";
|
|
4
4
|
import { getNameInitial } from "../clients";
|
|
5
5
|
import clsx from "clsx";
|
|
6
|
-
export const Avatar = ({ color, onClick, name, src,
|
|
6
|
+
export const Avatar = ({ color, onClick, name, src, isBeingFollowed, isCurrentUser, }) => {
|
|
7
7
|
const shortName = getNameInitial(name);
|
|
8
8
|
const [error, setError] = useState(false);
|
|
9
9
|
const loadImg = !error && src;
|
|
10
10
|
const style = loadImg ? undefined : { background: color };
|
|
11
|
-
return (_jsx("div", { className: clsx("Avatar",
|
|
11
|
+
return (_jsx("div", { className: clsx("Avatar", {
|
|
12
|
+
"Avatar--is-followed": isBeingFollowed,
|
|
13
|
+
"Avatar--is-current-user": isCurrentUser,
|
|
14
|
+
}), style: style, onClick: onClick, children: loadImg ? (_jsx("img", { className: "Avatar-img", src: src, alt: shortName, referrerPolicy: "no-referrer", onError: () => setError(true) })) : (shortName) }));
|
|
12
15
|
};
|
|
@@ -2,17 +2,21 @@ import "./UserList.scss";
|
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { Collaborator, SocketId } from "../types";
|
|
4
4
|
export type GoToCollaboratorComponentProps = {
|
|
5
|
-
|
|
5
|
+
clientId: ClientId;
|
|
6
6
|
collaborator: Collaborator;
|
|
7
7
|
withName: boolean;
|
|
8
8
|
isBeingFollowed: boolean;
|
|
9
9
|
};
|
|
10
|
-
|
|
10
|
+
/** collaborator user id or socket id (fallback) */
|
|
11
|
+
type ClientId = string & {
|
|
12
|
+
_brand: "UserId";
|
|
13
|
+
};
|
|
14
|
+
type UserListUserObject = Pick<Collaborator, "avatarUrl" | "id" | "socketId" | "username">;
|
|
11
15
|
type UserListProps = {
|
|
12
16
|
className?: string;
|
|
13
17
|
mobile?: boolean;
|
|
14
18
|
collaborators: Map<SocketId, UserListUserObject>;
|
|
15
19
|
userToFollow: SocketId | null;
|
|
16
20
|
};
|
|
17
|
-
export declare const UserList: React.MemoExoticComponent<({ className, mobile, collaborators, userToFollow }: UserListProps) => JSX.Element>;
|
|
21
|
+
export declare const UserList: React.MemoExoticComponent<({ className, mobile, collaborators, userToFollow }: UserListProps) => JSX.Element | null>;
|
|
18
22
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import "./UserList.scss";
|
|
3
|
-
import React
|
|
3
|
+
import React from "react";
|
|
4
4
|
import clsx from "clsx";
|
|
5
5
|
import { Tooltip } from "./Tooltip";
|
|
6
6
|
import { useExcalidrawActionManager } from "./App";
|
|
@@ -9,28 +9,24 @@ import { Island } from "./Island";
|
|
|
9
9
|
import { searchIcon } from "./icons";
|
|
10
10
|
import { t } from "../i18n";
|
|
11
11
|
import { isShallowEqual } from "../utils";
|
|
12
|
-
|
|
13
|
-
const DEFAULT_MAX_AVATARS = 4;
|
|
12
|
+
const FIRST_N_AVATARS = 3;
|
|
14
13
|
const SHOW_COLLABORATORS_FILTER_AT = 8;
|
|
15
|
-
const ConditionalTooltipWrapper = ({ shouldWrap, children, username, }) => shouldWrap ? (_jsx(Tooltip, { label: username || "Unknown user", children: children })) : (_jsx(React.Fragment, { children: children }));
|
|
16
|
-
const renderCollaborator = ({ actionManager, collaborator,
|
|
14
|
+
const ConditionalTooltipWrapper = ({ shouldWrap, children, clientId, username, }) => shouldWrap ? (_jsx(Tooltip, { label: username || "Unknown user", children: children }, clientId)) : (_jsx(React.Fragment, { children: children }, clientId));
|
|
15
|
+
const renderCollaborator = ({ actionManager, collaborator, clientId, withName = false, shouldWrapWithTooltip = false, isBeingFollowed, }) => {
|
|
17
16
|
const data = {
|
|
18
|
-
|
|
17
|
+
clientId,
|
|
19
18
|
collaborator,
|
|
20
19
|
withName,
|
|
21
20
|
isBeingFollowed,
|
|
22
21
|
};
|
|
23
22
|
const avatarJSX = actionManager.renderAction("goToCollaborator", data);
|
|
24
|
-
return (_jsx(ConditionalTooltipWrapper, { username: collaborator.username, shouldWrap: shouldWrapWithTooltip, children: avatarJSX },
|
|
23
|
+
return (_jsx(ConditionalTooltipWrapper, { clientId: clientId, username: collaborator.username, shouldWrap: shouldWrapWithTooltip, children: avatarJSX }, clientId));
|
|
25
24
|
};
|
|
26
25
|
const collaboratorComparatorKeys = [
|
|
27
26
|
"avatarUrl",
|
|
28
27
|
"id",
|
|
29
28
|
"socketId",
|
|
30
29
|
"username",
|
|
31
|
-
"isInCall",
|
|
32
|
-
"isSpeaking",
|
|
33
|
-
"isMuted",
|
|
34
30
|
];
|
|
35
31
|
export const UserList = React.memo(({ className, mobile, collaborators, userToFollow }) => {
|
|
36
32
|
const actionManager = useExcalidrawActionManager();
|
|
@@ -41,68 +37,47 @@ export const UserList = React.memo(({ className, mobile, collaborators, userToFo
|
|
|
41
37
|
// filter on user id, else fall back on unique socketId
|
|
42
38
|
userId, { ...collaborator, socketId });
|
|
43
39
|
});
|
|
44
|
-
const uniqueCollaboratorsArray = Array.from(uniqueCollaboratorsMap
|
|
40
|
+
const uniqueCollaboratorsArray = Array.from(uniqueCollaboratorsMap).filter(([_, collaborator]) => collaborator.username?.trim());
|
|
45
41
|
const [searchTerm, setSearchTerm] = React.useState("");
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
const updateMaxAvatars = (width) => {
|
|
50
|
-
const maxAvatars = Math.max(1, Math.min(8, Math.floor(width / 38)));
|
|
51
|
-
setMaxAvatars(maxAvatars);
|
|
52
|
-
};
|
|
53
|
-
updateMaxAvatars(userListWrapper.current.clientWidth);
|
|
54
|
-
if (!supportsResizeObserver) {
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const resizeObserver = new ResizeObserver((entries) => {
|
|
58
|
-
for (const entry of entries) {
|
|
59
|
-
const { width } = entry.contentRect;
|
|
60
|
-
updateMaxAvatars(width);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
resizeObserver.observe(userListWrapper.current);
|
|
64
|
-
return () => {
|
|
65
|
-
resizeObserver.disconnect();
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
}, []);
|
|
69
|
-
const [maxAvatars, setMaxAvatars] = React.useState(DEFAULT_MAX_AVATARS);
|
|
42
|
+
if (uniqueCollaboratorsArray.length === 0) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
70
45
|
const searchTermNormalized = searchTerm.trim().toLowerCase();
|
|
71
46
|
const filteredCollaborators = searchTermNormalized
|
|
72
|
-
? uniqueCollaboratorsArray.filter((collaborator) => collaborator.username?.toLowerCase().includes(searchTerm))
|
|
47
|
+
? uniqueCollaboratorsArray.filter(([, collaborator]) => collaborator.username?.toLowerCase().includes(searchTerm))
|
|
73
48
|
: uniqueCollaboratorsArray;
|
|
74
|
-
const firstNCollaborators = uniqueCollaboratorsArray.slice(0,
|
|
75
|
-
const firstNAvatarsJSX = firstNCollaborators.map((collaborator) => renderCollaborator({
|
|
49
|
+
const firstNCollaborators = uniqueCollaboratorsArray.slice(0, FIRST_N_AVATARS);
|
|
50
|
+
const firstNAvatarsJSX = firstNCollaborators.map(([clientId, collaborator]) => renderCollaborator({
|
|
76
51
|
actionManager,
|
|
77
52
|
collaborator,
|
|
78
|
-
|
|
53
|
+
clientId,
|
|
79
54
|
shouldWrapWithTooltip: true,
|
|
80
55
|
isBeingFollowed: collaborator.socketId === userToFollow,
|
|
81
56
|
}));
|
|
82
|
-
return mobile ? (_jsx("div", { className: clsx("UserList UserList_mobile", className), children: uniqueCollaboratorsArray.map((collaborator) => renderCollaborator({
|
|
57
|
+
return mobile ? (_jsx("div", { className: clsx("UserList UserList_mobile", className), children: uniqueCollaboratorsArray.map(([clientId, collaborator]) => renderCollaborator({
|
|
83
58
|
actionManager,
|
|
84
59
|
collaborator,
|
|
85
|
-
|
|
60
|
+
clientId,
|
|
86
61
|
shouldWrapWithTooltip: true,
|
|
87
62
|
isBeingFollowed: collaborator.socketId === userToFollow,
|
|
88
|
-
})) })) : (
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
63
|
+
})) })) : (_jsxs("div", { className: clsx("UserList", className), children: [firstNAvatarsJSX, uniqueCollaboratorsArray.length > FIRST_N_AVATARS && (_jsxs(Popover.Root, { onOpenChange: (isOpen) => {
|
|
64
|
+
if (!isOpen) {
|
|
65
|
+
setSearchTerm("");
|
|
66
|
+
}
|
|
67
|
+
}, children: [_jsxs(Popover.Trigger, { className: "UserList__more", children: ["+", uniqueCollaboratorsArray.length - FIRST_N_AVATARS] }), _jsx(Popover.Content, { style: {
|
|
68
|
+
zIndex: 2,
|
|
69
|
+
width: "13rem",
|
|
70
|
+
textAlign: "left",
|
|
71
|
+
}, align: "end", sideOffset: 10, children: _jsxs(Island, { style: { overflow: "hidden" }, children: [uniqueCollaboratorsArray.length >=
|
|
72
|
+
SHOW_COLLABORATORS_FILTER_AT && (_jsxs("div", { className: "UserList__search-wrapper", children: [searchIcon, _jsx("input", { className: "UserList__search", type: "text", placeholder: t("userList.search.placeholder"), value: searchTerm, onChange: (e) => {
|
|
73
|
+
setSearchTerm(e.target.value);
|
|
74
|
+
} })] })), _jsxs("div", { className: "dropdown-menu UserList__collaborators", children: [filteredCollaborators.length === 0 && (_jsx("div", { className: "UserList__collaborators__empty", children: t("userList.search.empty") })), _jsx("div", { className: "UserList__hint", children: t("userList.hint.text") }), filteredCollaborators.map(([clientId, collaborator]) => renderCollaborator({
|
|
75
|
+
actionManager,
|
|
76
|
+
collaborator,
|
|
77
|
+
clientId,
|
|
78
|
+
withName: true,
|
|
79
|
+
isBeingFollowed: collaborator.socketId === userToFollow,
|
|
80
|
+
}))] })] }) })] }))] }));
|
|
106
81
|
}, (prev, next) => {
|
|
107
82
|
if (prev.collaborators.size !== next.collaborators.size ||
|
|
108
83
|
prev.mobile !== next.mobile ||
|
|
@@ -110,13 +85,9 @@ export const UserList = React.memo(({ className, mobile, collaborators, userToFo
|
|
|
110
85
|
prev.userToFollow !== next.userToFollow) {
|
|
111
86
|
return false;
|
|
112
87
|
}
|
|
113
|
-
const nextCollaboratorSocketIds = next.collaborators.keys();
|
|
114
88
|
for (const [socketId, collaborator] of prev.collaborators) {
|
|
115
89
|
const nextCollaborator = next.collaborators.get(socketId);
|
|
116
90
|
if (!nextCollaborator ||
|
|
117
|
-
// this checks order of collaborators in the map is the same
|
|
118
|
-
// as previous render
|
|
119
|
-
socketId !== nextCollaboratorSocketIds.next().value ||
|
|
120
91
|
!isShallowEqual(collaborator, nextCollaborator, collaboratorComparatorKeys)) {
|
|
121
92
|
return false;
|
|
122
93
|
}
|
|
@@ -12,34 +12,37 @@ const InteractiveCanvas = (props) => {
|
|
|
12
12
|
isComponentMounted.current = true;
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const remoteSelectedElementIds =
|
|
18
|
-
const
|
|
19
|
-
const
|
|
15
|
+
const cursorButton = {};
|
|
16
|
+
const pointerViewportCoords = {};
|
|
17
|
+
const remoteSelectedElementIds = {};
|
|
18
|
+
const pointerUsernames = {};
|
|
19
|
+
const pointerUserStates = {};
|
|
20
20
|
props.appState.collaborators.forEach((user, socketId) => {
|
|
21
21
|
if (user.selectedElementIds) {
|
|
22
22
|
for (const id of Object.keys(user.selectedElementIds)) {
|
|
23
|
-
if (!
|
|
24
|
-
remoteSelectedElementIds
|
|
23
|
+
if (!(id in remoteSelectedElementIds)) {
|
|
24
|
+
remoteSelectedElementIds[id] = [];
|
|
25
25
|
}
|
|
26
|
-
remoteSelectedElementIds
|
|
26
|
+
remoteSelectedElementIds[id].push(socketId);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
if (!user.pointer || user.pointer.renderCursor === false) {
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
32
|
if (user.username) {
|
|
33
|
-
|
|
33
|
+
pointerUsernames[socketId] = user.username;
|
|
34
34
|
}
|
|
35
35
|
if (user.userState) {
|
|
36
|
-
|
|
36
|
+
pointerUserStates[socketId] = user.userState;
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
pointerViewportCoords[socketId] = {
|
|
39
|
+
...sceneCoordsToViewportCoords({
|
|
40
|
+
sceneX: user.pointer.x,
|
|
41
|
+
sceneY: user.pointer.y,
|
|
42
|
+
}, props.appState),
|
|
43
|
+
id: user.id || socketId,
|
|
44
|
+
};
|
|
45
|
+
cursorButton[socketId] = user.button;
|
|
43
46
|
});
|
|
44
47
|
const selectionColor = (props.containerRef?.current &&
|
|
45
48
|
getComputedStyle(props.containerRef.current).getPropertyValue("--color-selection")) ||
|
|
@@ -52,11 +55,11 @@ const InteractiveCanvas = (props) => {
|
|
|
52
55
|
scale: window.devicePixelRatio,
|
|
53
56
|
appState: props.appState,
|
|
54
57
|
renderConfig: {
|
|
55
|
-
remotePointerViewportCoords,
|
|
56
|
-
remotePointerButton,
|
|
58
|
+
remotePointerViewportCoords: pointerViewportCoords,
|
|
59
|
+
remotePointerButton: cursorButton,
|
|
57
60
|
remoteSelectedElementIds,
|
|
58
|
-
remotePointerUsernames,
|
|
59
|
-
remotePointerUserStates,
|
|
61
|
+
remotePointerUsernames: pointerUsernames,
|
|
62
|
+
remotePointerUserStates: pointerUserStates,
|
|
60
63
|
selectionColor,
|
|
61
64
|
renderScrollbars: false,
|
|
62
65
|
},
|
|
@@ -173,6 +173,4 @@ export declare const eyeIcon: JSX.Element;
|
|
|
173
173
|
export declare const eyeClosedIcon: JSX.Element;
|
|
174
174
|
export declare const brainIcon: JSX.Element;
|
|
175
175
|
export declare const searchIcon: JSX.Element;
|
|
176
|
-
export declare const microphoneIcon: JSX.Element;
|
|
177
|
-
export declare const microphoneMutedIcon: JSX.Element;
|
|
178
176
|
export {};
|
|
@@ -215,9 +215,7 @@ export const laserPointerToolIcon = createIcon(_jsxs("g", { fill: "none", stroke
|
|
|
215
215
|
export const MagicIcon = createIcon(_jsxs("g", { stroke: "currentColor", fill: "none", children: [_jsx("path", { stroke: "none", d: "M0 0h24v24H0z" }), _jsx("path", { d: "M6 21l15 -15l-3 -3l-15 15l3 3" }), _jsx("path", { d: "M15 6l3 3" }), _jsx("path", { d: "M9 3a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" }), _jsx("path", { d: "M19 13a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" })] }), tablerIconProps);
|
|
216
216
|
export const OpenAIIcon = createIcon(_jsxs("g", { stroke: "currentColor", fill: "none", children: [_jsx("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }), _jsx("path", { d: "M11.217 19.384a3.501 3.501 0 0 0 6.783 -1.217v-5.167l-6 -3.35" }), _jsx("path", { d: "M5.214 15.014a3.501 3.501 0 0 0 4.446 5.266l4.34 -2.534v-6.946" }), _jsx("path", { d: "M6 7.63c-1.391 -.236 -2.787 .395 -3.534 1.689a3.474 3.474 0 0 0 1.271 4.745l4.263 2.514l6 -3.348" }), _jsx("path", { d: "M12.783 4.616a3.501 3.501 0 0 0 -6.783 1.217v5.067l6 3.45" }), _jsx("path", { d: "M18.786 8.986a3.501 3.501 0 0 0 -4.446 -5.266l-4.34 2.534v6.946" }), _jsx("path", { d: "M18 16.302c1.391 .236 2.787 -.395 3.534 -1.689a3.474 3.474 0 0 0 -1.271 -4.745l-4.308 -2.514l-5.955 3.42" })] }), tablerIconProps);
|
|
217
217
|
export const fullscreenIcon = createIcon(_jsxs("g", { stroke: "currentColor", fill: "none", children: [_jsx("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }), _jsx("path", { d: "M4 8v-2a2 2 0 0 1 2 -2h2" }), _jsx("path", { d: "M4 16v2a2 2 0 0 0 2 2h2" }), _jsx("path", { d: "M16 4h2a2 2 0 0 1 2 2v2" }), _jsx("path", { d: "M16 20h2a2 2 0 0 0 2 -2v-2" })] }), tablerIconProps);
|
|
218
|
-
export const eyeIcon = createIcon(_jsxs("g", { stroke: "currentColor", fill: "none",
|
|
218
|
+
export const eyeIcon = createIcon(_jsxs("g", { stroke: "currentColor", fill: "none", children: [_jsx("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }), _jsx("path", { d: "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" }), _jsx("path", { d: "M21 12c-2.4 4 -5.4 6 -9 6c-3.6 0 -6.6 -2 -9 -6c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6" })] }), tablerIconProps);
|
|
219
219
|
export const eyeClosedIcon = createIcon(_jsxs("g", { stroke: "currentColor", fill: "none", children: [_jsx("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }), _jsx("path", { d: "M10.585 10.587a2 2 0 0 0 2.829 2.828" }), _jsx("path", { d: "M16.681 16.673a8.717 8.717 0 0 1 -4.681 1.327c-3.6 0 -6.6 -2 -9 -6c1.272 -2.12 2.712 -3.678 4.32 -4.674m2.86 -1.146a9.055 9.055 0 0 1 1.82 -.18c3.6 0 6.6 2 9 6c-.666 1.11 -1.379 2.067 -2.138 2.87" }), _jsx("path", { d: "M3 3l18 18" })] }), tablerIconProps);
|
|
220
220
|
export const brainIcon = createIcon(_jsxs("g", { stroke: "currentColor", fill: "none", children: [_jsx("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }), _jsx("path", { d: "M15.5 13a3.5 3.5 0 0 0 -3.5 3.5v1a3.5 3.5 0 0 0 7 0v-1.8" }), _jsx("path", { d: "M8.5 13a3.5 3.5 0 0 1 3.5 3.5v1a3.5 3.5 0 0 1 -7 0v-1.8" }), _jsx("path", { d: "M17.5 16a3.5 3.5 0 0 0 0 -7h-.5" }), _jsx("path", { d: "M19 9.3v-2.8a3.5 3.5 0 0 0 -7 0" }), _jsx("path", { d: "M6.5 16a3.5 3.5 0 0 1 0 -7h.5" }), _jsx("path", { d: "M5 9.3v-2.8a3.5 3.5 0 0 1 7 0v10" })] }), tablerIconProps);
|
|
221
221
|
export const searchIcon = createIcon(_jsxs("g", { strokeWidth: 1.5, children: [_jsx("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }), _jsx("path", { d: "M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0" }), _jsx("path", { d: "M21 21l-6 -6" })] }), tablerIconProps);
|
|
222
|
-
export const microphoneIcon = createIcon(_jsxs("g", { strokeWidth: 1.5, children: [_jsx("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }), _jsx("path", { d: "M9 2m0 3a3 3 0 0 1 3 -3h0a3 3 0 0 1 3 3v5a3 3 0 0 1 -3 3h0a3 3 0 0 1 -3 -3z" }), _jsx("path", { d: "M5 10a7 7 0 0 0 14 0" }), _jsx("path", { d: "M8 21l8 0" }), _jsx("path", { d: "M12 17l0 4" })] }), tablerIconProps);
|
|
223
|
-
export const microphoneMutedIcon = createIcon(_jsxs("g", { strokeWidth: 1.5, children: [_jsx("path", { stroke: "none", d: "M0 0h24v24H0z", fill: "none" }), _jsx("path", { d: "M3 3l18 18" }), _jsx("path", { d: "M9 5a3 3 0 0 1 6 0v5a3 3 0 0 1 -.13 .874m-2 2a3 3 0 0 1 -3.87 -2.872v-1" }), _jsx("path", { d: "M5 10a7 7 0 0 0 10.846 5.85m2 -2a6.967 6.967 0 0 0 1.152 -3.85" }), _jsx("path", { d: "M8 21l8 0" }), _jsx("path", { d: "M12 17l0 4" })] }), tablerIconProps);
|
|
@@ -8,7 +8,6 @@ export declare const isChrome: boolean;
|
|
|
8
8
|
export declare const isSafari: boolean;
|
|
9
9
|
export declare const isIOS: boolean;
|
|
10
10
|
export declare const isBrave: () => boolean;
|
|
11
|
-
export declare const supportsResizeObserver: boolean;
|
|
12
11
|
export declare const APP_NAME = "Excalidraw";
|
|
13
12
|
export declare const DRAGGING_THRESHOLD = 10;
|
|
14
13
|
export declare const LINE_CONFIRM_THRESHOLD = 8;
|
|
@@ -124,7 +123,6 @@ export declare const DEFAULT_ZOOM_VALUE: NormalizedZoomValue;
|
|
|
124
123
|
export declare const COLOR_WHITE = "#ffffff";
|
|
125
124
|
export declare const COLOR_CHARCOAL_BLACK = "#1e1e1e";
|
|
126
125
|
export declare const COLOR_TRANSPARENT = "transparent";
|
|
127
|
-
export declare const COLOR_VOICE_CALL = "#a2f1a6";
|
|
128
126
|
export declare const CANVAS_ONLY_ACTIONS: string[];
|
|
129
127
|
export declare const GRID_SIZE = 20;
|
|
130
128
|
export declare const IMAGE_MIME_TYPES: {
|
|
@@ -224,6 +222,9 @@ export declare const ROUNDNESS: {
|
|
|
224
222
|
readonly PROPORTIONAL_RADIUS: 2;
|
|
225
223
|
readonly ADAPTIVE_RADIUS: 3;
|
|
226
224
|
};
|
|
225
|
+
/** key containt id of precedeing elemnt id we use in reconciliation during
|
|
226
|
+
* collaboration */
|
|
227
|
+
export declare const PRECEDING_ELEMENT_KEY = "__precedingElement__";
|
|
227
228
|
export declare const ROUGHNESS: {
|
|
228
229
|
readonly architect: 0;
|
|
229
230
|
readonly artist: 1;
|
|
@@ -11,7 +11,6 @@ export const isIOS = /iPad|iPhone/.test(navigator.platform) ||
|
|
|
11
11
|
(navigator.userAgent.includes("Mac") && "ontouchend" in document);
|
|
12
12
|
// keeping function so it can be mocked in test
|
|
13
13
|
export const isBrave = () => navigator.brave?.isBrave?.name === "isBrave";
|
|
14
|
-
export const supportsResizeObserver = typeof window !== "undefined" && "ResizeObserver" in window;
|
|
15
14
|
export const APP_NAME = "Excalidraw";
|
|
16
15
|
export const DRAGGING_THRESHOLD = 10; // px
|
|
17
16
|
export const LINE_CONFIRM_THRESHOLD = 8; // px
|
|
@@ -132,8 +131,6 @@ export const COLOR_WHITE = "#ffffff";
|
|
|
132
131
|
export const COLOR_CHARCOAL_BLACK = "#1e1e1e";
|
|
133
132
|
export const COLOR_TRANSPARENT = "transparent";
|
|
134
133
|
// -----------------------------------------------
|
|
135
|
-
// keep this in sync with CSS
|
|
136
|
-
export const COLOR_VOICE_CALL = "#a2f1a6";
|
|
137
134
|
export const CANVAS_ONLY_ACTIONS = ["selectAll"];
|
|
138
135
|
export const GRID_SIZE = 20; // TODO make it configurable?
|
|
139
136
|
export const IMAGE_MIME_TYPES = {
|
|
@@ -266,6 +263,9 @@ export const ROUNDNESS = {
|
|
|
266
263
|
// (see DEFAULT_ADAPTIVE_RADIUS constant)
|
|
267
264
|
ADAPTIVE_RADIUS: 3,
|
|
268
265
|
};
|
|
266
|
+
/** key containt id of precedeing elemnt id we use in reconciliation during
|
|
267
|
+
* collaboration */
|
|
268
|
+
export const PRECEDING_ELEMENT_KEY = "__precedingElement__";
|
|
269
269
|
export const ROUGHNESS = {
|
|
270
270
|
architect: 0,
|
|
271
271
|
artist: 1,
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { ExcalidrawElement
|
|
1
|
+
import { ExcalidrawElement } from "../element/types";
|
|
2
2
|
import { AppState, BinaryFiles, LibraryItem } from "../types";
|
|
3
3
|
import { ImportedDataState } from "./types";
|
|
4
4
|
type RestoredAppState = Omit<AppState, "offsetTop" | "offsetLeft" | "width" | "height">;
|
|
5
5
|
export declare const AllowedExcalidrawActiveTools: Record<AppState["activeTool"]["type"], boolean>;
|
|
6
6
|
export type RestoredDataState = {
|
|
7
|
-
elements:
|
|
7
|
+
elements: ExcalidrawElement[];
|
|
8
8
|
appState: RestoredAppState;
|
|
9
9
|
files: BinaryFiles;
|
|
10
10
|
};
|
|
11
11
|
export declare const restoreElements: (elements: ImportedDataState["elements"], localElements: readonly ExcalidrawElement[] | null | undefined, opts?: {
|
|
12
12
|
refreshDimensions?: boolean;
|
|
13
13
|
repairBindings?: boolean;
|
|
14
|
-
} | undefined) =>
|
|
14
|
+
} | undefined) => ExcalidrawElement[];
|
|
15
15
|
export declare const restoreAppState: (appState: ImportedDataState["appState"], localAppState: Partial<AppState> | null | undefined) => RestoredAppState;
|
|
16
16
|
export declare const restore: (data: Pick<ImportedDataState, "appState" | "elements" | "files"> | null, localAppState: Partial<AppState> | null | undefined, localElements: readonly ExcalidrawElement[] | null | undefined, elementsConfig?: {
|
|
17
17
|
refreshDimensions?: boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getNonDeletedElements, getNormalizedDimensions, isInvisiblySmallElement, refreshTextDimensions, } from "../element";
|
|
2
2
|
import { isTextElement, isUsingAdaptiveRadius } from "../element/typeChecks";
|
|
3
3
|
import { randomId } from "../random";
|
|
4
|
-
import { DEFAULT_FONT_FAMILY, DEFAULT_TEXT_ALIGN, DEFAULT_VERTICAL_ALIGN, FONT_FAMILY, ROUNDNESS, DEFAULT_SIDEBAR, DEFAULT_ELEMENT_PROPS, } from "../constants";
|
|
4
|
+
import { DEFAULT_FONT_FAMILY, DEFAULT_TEXT_ALIGN, DEFAULT_VERTICAL_ALIGN, PRECEDING_ELEMENT_KEY, FONT_FAMILY, ROUNDNESS, DEFAULT_SIDEBAR, DEFAULT_ELEMENT_PROPS, } from "../constants";
|
|
5
5
|
import { getDefaultAppState } from "../appState";
|
|
6
6
|
import { LinearElementEditor } from "../element/linearElementEditor";
|
|
7
7
|
import { bumpVersion } from "../element/mutateElement";
|
|
@@ -9,7 +9,6 @@ import { getUpdatedTimestamp, updateActiveTool } from "../utils";
|
|
|
9
9
|
import { arrayToMap } from "../utils";
|
|
10
10
|
import { detectLineHeight, getContainerElement, getDefaultLineHeight, } from "../element/textElement";
|
|
11
11
|
import { normalizeLink } from "./url";
|
|
12
|
-
import { syncInvalidIndices } from "../fractionalIndex";
|
|
13
12
|
export const AllowedExcalidrawActiveTools = {
|
|
14
13
|
selection: true,
|
|
15
14
|
text: true,
|
|
@@ -47,7 +46,6 @@ const restoreElementWithProperties = (element, extra) => {
|
|
|
47
46
|
// newly added elements
|
|
48
47
|
version: element.version || 1,
|
|
49
48
|
versionNonce: element.versionNonce ?? 0,
|
|
50
|
-
index: element.index ?? null,
|
|
51
49
|
isDeleted: element.isDeleted ?? false,
|
|
52
50
|
id: element.id || randomId(),
|
|
53
51
|
fillStyle: element.fillStyle || DEFAULT_ELEMENT_PROPS.fillStyle,
|
|
@@ -87,6 +85,9 @@ const restoreElementWithProperties = (element, extra) => {
|
|
|
87
85
|
base.customData =
|
|
88
86
|
"customData" in extra ? extra.customData : element.customData;
|
|
89
87
|
}
|
|
88
|
+
if (PRECEDING_ELEMENT_KEY in element) {
|
|
89
|
+
base[PRECEDING_ELEMENT_KEY] = element[PRECEDING_ELEMENT_KEY];
|
|
90
|
+
}
|
|
90
91
|
return {
|
|
91
92
|
...base,
|
|
92
93
|
...getNormalizedDimensions(base),
|
|
@@ -274,7 +275,7 @@ localElements, opts) => {
|
|
|
274
275
|
// used to detect duplicate top-level element ids
|
|
275
276
|
const existingIds = new Set();
|
|
276
277
|
const localElementsMap = localElements ? arrayToMap(localElements) : null;
|
|
277
|
-
const restoredElements =
|
|
278
|
+
const restoredElements = (elements || []).reduce((elements, element) => {
|
|
278
279
|
// filtering out selection, which is legacy, no longer kept in elements,
|
|
279
280
|
// and causing issues if retained
|
|
280
281
|
if (element.type !== "selection" && !isInvisiblySmallElement(element)) {
|
|
@@ -292,7 +293,7 @@ localElements, opts) => {
|
|
|
292
293
|
}
|
|
293
294
|
}
|
|
294
295
|
return elements;
|
|
295
|
-
}, [])
|
|
296
|
+
}, []);
|
|
296
297
|
if (!opts?.repairBindings) {
|
|
297
298
|
return restoredElements;
|
|
298
299
|
}
|
|
@@ -78,4 +78,4 @@ export type ExcalidrawElementSkeleton = Extract<Exclude<ExcalidrawElement, Excal
|
|
|
78
78
|
} & Partial<ExcalidrawMagicFrameElement>);
|
|
79
79
|
export declare const convertToExcalidrawElements: (elementsSkeleton: ExcalidrawElementSkeleton[] | null, opts?: {
|
|
80
80
|
regenerateIds: boolean;
|
|
81
|
-
}) =>
|
|
81
|
+
}) => ExcalidrawElement[];
|