@dwelle/excalidraw 0.5.0-da1c822 → 0.5.0-e56eec7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/CHANGELOG.md +13 -2
  2. package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-RHODGCTM.js → blockDiagram-91b80b7a-NRABZKZA.js} +6 -6
  3. package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-W7NCR7LR.js → c4Diagram-b2a90758-56M32CJD.js} +4 -4
  4. package/dist/browser/dev/excalidraw-assets-dev/{chunk-TKRIVTWP.js → chunk-5EDB2FTV.js} +3 -3
  5. package/dist/browser/dev/excalidraw-assets-dev/{chunk-52OGG53V.js → chunk-6VTJEXQH.js} +3 -3
  6. package/dist/browser/dev/excalidraw-assets-dev/{chunk-J5HRUYQR.js → chunk-AKQDHN2W.js} +2 -2
  7. package/dist/browser/dev/excalidraw-assets-dev/chunk-AKQDHN2W.js.map +7 -0
  8. package/dist/browser/dev/excalidraw-assets-dev/{chunk-GF7VCOUM.js → chunk-C4OL7SRI.js} +3 -3
  9. package/dist/browser/dev/excalidraw-assets-dev/{chunk-BESQLMCW.js → chunk-E47I6Q7O.js} +5 -5
  10. package/dist/browser/dev/excalidraw-assets-dev/{chunk-UETNA2WX.js → chunk-KDIPICHB.js} +6377 -4340
  11. package/dist/browser/dev/excalidraw-assets-dev/chunk-KDIPICHB.js.map +7 -0
  12. package/dist/browser/dev/excalidraw-assets-dev/{chunk-5747M6KP.js → chunk-OH2YDYHX.js} +3 -3
  13. package/dist/browser/dev/excalidraw-assets-dev/{chunk-GPOYIZPX.js → chunk-PXBR5CBM.js} +28 -28
  14. package/dist/browser/dev/excalidraw-assets-dev/chunk-PXBR5CBM.js.map +7 -0
  15. package/dist/browser/dev/excalidraw-assets-dev/{chunk-GCA4S2OA.js → chunk-RTA6DTUV.js} +3 -3
  16. package/dist/browser/dev/excalidraw-assets-dev/{chunk-DQOPSCYA.js → chunk-TTH3BTHQ.js} +3 -3
  17. package/dist/browser/dev/excalidraw-assets-dev/{chunk-B2MHJWXZ.js → chunk-U4N7TEPH.js} +2 -2
  18. package/dist/browser/dev/excalidraw-assets-dev/{chunk-QFS4M5OJ.js → chunk-V3PA4IDR.js} +3 -3
  19. package/dist/browser/dev/excalidraw-assets-dev/{chunk-SLLUETBM.js → chunk-WFT6ZJE6.js} +7 -7
  20. package/dist/browser/dev/excalidraw-assets-dev/{chunk-PPHFJLL7.js → chunk-XZKEYTKS.js} +4 -4
  21. package/dist/browser/dev/excalidraw-assets-dev/{chunk-USLWOHUZ.js → chunk-YC6VTXEO.js} +4 -4
  22. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-GJGBT4TV.js → classDiagram-30eddba6-EZJVINS6.js} +6 -6
  23. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-LYWTIPJA.js → classDiagram-v2-f2df5561-XSUIN44A.js} +9 -9
  24. package/dist/browser/dev/excalidraw-assets-dev/{directory-open-01563666-UREMLRIT.js → directory-open-01563666-KOK2HSB6.js} +2 -2
  25. package/dist/browser/dev/excalidraw-assets-dev/{directory-open-4ed118d0-UN3BUDZZ.js → directory-open-4ed118d0-P3Q3CLF3.js} +2 -2
  26. package/dist/browser/dev/excalidraw-assets-dev/dist-O6HOTHQF.js +10 -0
  27. package/dist/browser/dev/excalidraw-assets-dev/{en-UW5C5KGW.js → en-PSBMWL4S.js} +2 -2
  28. package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-Z7U2XW2Y.js → erDiagram-47591fe2-U7FLWOG3.js} +5 -5
  29. package/dist/browser/dev/excalidraw-assets-dev/{file-open-002ab408-4QG336MG.js → file-open-002ab408-EQEHGU2J.js} +2 -2
  30. package/dist/browser/dev/excalidraw-assets-dev/{file-open-7c801643-3QI4ICCL.js → file-open-7c801643-QQT6O7P5.js} +2 -2
  31. package/dist/browser/dev/excalidraw-assets-dev/{file-save-3189631c-TNNERCWV.js → file-save-3189631c-YXX2C7C6.js} +2 -2
  32. package/dist/browser/dev/excalidraw-assets-dev/{file-save-745eba88-JFMH565P.js → file-save-745eba88-7G554KTZ.js} +2 -2
  33. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-PARVG263.js → flowDiagram-5540d9b9-F2VP4JAA.js} +10 -10
  34. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-ZJOPVRMB.js → flowDiagram-v2-3b53844e-2WQZZRND.js} +10 -10
  35. package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-ULPNBSZX.js → flowchart-elk-definition-5fe447d6-IW6O2F6C.js} +6 -6
  36. package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-ESSYVTJ4.js → ganttDiagram-9a3bba1f-B5RH7ZAO.js} +3 -3
  37. package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-6V6VVNNP.js → gitGraphDiagram-96e6b4ee-INGQRNLZ.js} +3 -3
  38. package/dist/browser/dev/excalidraw-assets-dev/{image-ZNQQXS62.css → image-FDQLNM24.css} +39 -16
  39. package/dist/browser/dev/excalidraw-assets-dev/image-FDQLNM24.css.map +7 -0
  40. package/dist/browser/dev/excalidraw-assets-dev/{image-3LTGFHLF.js → image-GMAHLVER.js} +6 -6
  41. package/dist/browser/dev/excalidraw-assets-dev/{image-blob-reduce.esm-KTX27DAY.js → image-blob-reduce.esm-OX75MRP3.js} +2 -2
  42. package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-I22FLFX3.js → infoDiagram-bcd20f53-43FMAUOR.js} +3 -3
  43. package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-WAO6F52C.js → journeyDiagram-4fe6b3dc-KFVOUX4I.js} +4 -4
  44. package/dist/browser/dev/excalidraw-assets-dev/{katex-NWA2YFOP.js → katex-A3GRORPB.js} +2 -2
  45. package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-K74IKX4Y.js → mindmap-definition-f354de21-D7S3CRQ4.js} +4 -4
  46. package/dist/browser/dev/excalidraw-assets-dev/{pica-3TH2EGXR.js → pica-ZAD7MTGA.js} +2 -2
  47. package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-DOB2LVE5.js → pieDiagram-79897490-OON2CRZ5.js} +3 -3
  48. package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-MJV2X7WI.js → quadrantDiagram-62f64e94-5APTNVVS.js} +3 -3
  49. package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-H4YM3XN7.js → requirementDiagram-05bf5f74-FM7WZVKU.js} +5 -5
  50. package/dist/browser/dev/excalidraw-assets-dev/{roundRect-4S3QV2NZ.js → roundRect-AYYHVX5X.js} +2 -2
  51. package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-7X74ABAN.js → sankeyDiagram-97764748-5HLEFFGY.js} +3 -3
  52. package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-PPDIJFQP.js → sequenceDiagram-acc0e65c-4ZRSNGPV.js} +4 -4
  53. package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-JVBR7N35.js → stateDiagram-0ff1cf1a-OLTPYRPP.js} +6 -6
  54. package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-QYAJLQJH.js → stateDiagram-v2-9a9d610d-N3XOTAEE.js} +9 -9
  55. package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-GL7U3WDB.js → timeline-definition-fea2a41d-5PDFIYJQ.js} +3 -3
  56. package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-4U4JE4TW.js → xychartDiagram-ab372869-VIWBP45Y.js} +4 -4
  57. package/dist/browser/dev/index.css +38 -15
  58. package/dist/browser/dev/index.css.map +2 -2
  59. package/dist/browser/dev/index.js +9 -5
  60. package/dist/browser/prod/excalidraw-assets/ar-SA-JA6F2FMJ-MVAFRXH2.js +10 -0
  61. package/dist/browser/prod/excalidraw-assets/az-AZ-GVIENQVH-DULWV7IG.js +1 -0
  62. package/dist/browser/prod/excalidraw-assets/bg-BG-YFNNHCEP-TOMMDX7A.js +5 -0
  63. package/dist/browser/prod/excalidraw-assets/{blockDiagram-91b80b7a-BO7MW3VX.js → blockDiagram-91b80b7a-ZBW6LBXS.js} +1 -1
  64. package/dist/browser/prod/excalidraw-assets/bn-BD-LMEIWSRD-U6EPN6XJ.js +5 -0
  65. package/dist/browser/prod/excalidraw-assets/{c4Diagram-b2a90758-VCUPBVHR.js → c4Diagram-b2a90758-GET6IFET.js} +1 -1
  66. package/dist/browser/prod/excalidraw-assets/ca-ES-C2WGCLOT-4Q2376G3.js +8 -0
  67. package/dist/browser/prod/excalidraw-assets/{chunk-O77Z7CWL.js → chunk-2UGPV7X3.js} +1 -1
  68. package/dist/browser/prod/excalidraw-assets/{chunk-B7CDQVNY.js → chunk-364WSJPQ.js} +21 -21
  69. package/dist/browser/prod/excalidraw-assets/{chunk-NM5B2RBP.js → chunk-4FM7RPKW.js} +1 -1
  70. package/dist/browser/prod/excalidraw-assets/{chunk-CVEF66PS.js → chunk-4SHJFNCN.js} +1 -1
  71. package/dist/browser/prod/excalidraw-assets/{chunk-22FVL4I7.js → chunk-6TNDONBF.js} +1 -1
  72. package/dist/browser/prod/excalidraw-assets/{chunk-QLNFR4AJ.js → chunk-BJTCWAK5.js} +1 -1
  73. package/dist/browser/prod/excalidraw-assets/chunk-CKRG5LOX.js +335 -0
  74. package/dist/browser/prod/excalidraw-assets/{chunk-3HZHH3PT.js → chunk-IW42BK4V.js} +1 -1
  75. package/dist/browser/prod/excalidraw-assets/{chunk-4JYQ3563.js → chunk-MRQWXP64.js} +1 -1
  76. package/dist/browser/prod/excalidraw-assets/{chunk-VXFFPRP2.js → chunk-OG2UUKMT.js} +1 -1
  77. package/dist/browser/prod/excalidraw-assets/chunk-Q6QP4TRB.js +11 -0
  78. package/dist/browser/prod/excalidraw-assets/{chunk-V7HUISEN.js → chunk-QBYA3CCP.js} +1 -1
  79. package/dist/browser/prod/excalidraw-assets/{chunk-5PWM36DG.js → chunk-S3O7MXSU.js} +1 -1
  80. package/dist/browser/prod/excalidraw-assets/chunk-SJBOQTFA.js +1 -0
  81. package/dist/browser/prod/excalidraw-assets/{chunk-3VCRCP5J.js → chunk-T7MBBIYG.js} +1 -1
  82. package/dist/browser/prod/excalidraw-assets/{chunk-HPA5W5VE.js → chunk-X7R4RA7C.js} +1 -1
  83. package/dist/browser/prod/excalidraw-assets/{chunk-7UJZVYSR.js → chunk-Y3NNVSMP.js} +1 -1
  84. package/dist/browser/prod/excalidraw-assets/{classDiagram-30eddba6-VXGNM3LI.js → classDiagram-30eddba6-MJ5GZSCE.js} +1 -1
  85. package/dist/browser/prod/excalidraw-assets/{classDiagram-v2-f2df5561-YALTASVE.js → classDiagram-v2-f2df5561-FU5PRXDD.js} +1 -1
  86. package/dist/browser/prod/excalidraw-assets/cs-CZ-F2NDIQMB-4NMYRMO2.js +11 -0
  87. package/dist/browser/prod/excalidraw-assets/da-DK-WBEQB3CJ-6YAF4DNI.js +5 -0
  88. package/dist/browser/prod/excalidraw-assets/de-DE-VEIMCP7R-NSRLPHDI.js +8 -0
  89. package/dist/browser/prod/excalidraw-assets/{directory-open-01563666-JWXY2QSC.js → directory-open-01563666-UG2J4T6L.js} +1 -1
  90. package/dist/browser/prod/excalidraw-assets/{directory-open-4ed118d0-6AL5X37W.js → directory-open-4ed118d0-FGQD6TMW.js} +1 -1
  91. package/dist/browser/prod/excalidraw-assets/dist-LI3DBBWR.js +1 -0
  92. package/dist/browser/prod/excalidraw-assets/el-GR-TKRKG5GQ-6N4GY2DI.js +10 -0
  93. package/dist/browser/prod/excalidraw-assets/{en-CPU3UVKT.js → en-MPFDZHEH.js} +1 -1
  94. package/dist/browser/prod/excalidraw-assets/en-Q552WR7L-QAV42NF3.js +1 -0
  95. package/dist/browser/prod/excalidraw-assets/{erDiagram-47591fe2-GKYANCN7.js → erDiagram-47591fe2-YGAMNOK6.js} +1 -1
  96. package/dist/browser/prod/excalidraw-assets/es-ES-TOLWEZNW-ODY4LX7F.js +9 -0
  97. package/dist/browser/prod/excalidraw-assets/eu-ES-7CDRJQWJ-KF3KSB2X.js +11 -0
  98. package/dist/browser/prod/excalidraw-assets/fa-IR-527E2XGU-WLLGMWYR.js +8 -0
  99. package/dist/browser/prod/excalidraw-assets/fi-FI-NLQ7RQGZ-EZLGQEWF.js +6 -0
  100. package/dist/browser/prod/excalidraw-assets/{file-open-002ab408-3EPJOH45.js → file-open-002ab408-WLX7QPS6.js} +1 -1
  101. package/dist/browser/prod/excalidraw-assets/{file-open-7c801643-QIP6HK4D.js → file-open-7c801643-YB6IH3XI.js} +1 -1
  102. package/dist/browser/prod/excalidraw-assets/{file-save-3189631c-4TQJBQCS.js → file-save-3189631c-MRYCXU63.js} +1 -1
  103. package/dist/browser/prod/excalidraw-assets/{file-save-745eba88-C4L3ZGCC.js → file-save-745eba88-UZEDMFLR.js} +1 -1
  104. package/dist/browser/prod/excalidraw-assets/{flowDiagram-5540d9b9-QBRW5SLP.js → flowDiagram-5540d9b9-V23UQWYJ.js} +1 -1
  105. package/dist/browser/prod/excalidraw-assets/flowDiagram-v2-3b53844e-UDC2ZAFT.js +1 -0
  106. package/dist/browser/prod/excalidraw-assets/{flowchart-elk-definition-5fe447d6-YYO2EYKS.js → flowchart-elk-definition-5fe447d6-N3ISH6AG.js} +1 -1
  107. package/dist/browser/prod/excalidraw-assets/fr-FR-KUHO4FLU-2OW7FE5V.js +9 -0
  108. package/dist/browser/prod/excalidraw-assets/{ganttDiagram-9a3bba1f-3B2DUUUQ.js → ganttDiagram-9a3bba1f-7SAN2TXA.js} +1 -1
  109. package/dist/browser/prod/excalidraw-assets/{gitGraphDiagram-96e6b4ee-G6CKXXWQ.js → gitGraphDiagram-96e6b4ee-EXV6PWXL.js} +1 -1
  110. package/dist/browser/prod/excalidraw-assets/gl-ES-NEXX3VBB-TESFDR6O.js +10 -0
  111. package/dist/browser/prod/excalidraw-assets/he-IL-MED2VGBZ-N4VYRCHF.js +10 -0
  112. package/dist/browser/prod/excalidraw-assets/hi-IN-5V633W7V-4VXVQ6GE.js +4 -0
  113. package/dist/browser/prod/excalidraw-assets/hu-HU-2FOZGVGR-7CHHZRPD.js +7 -0
  114. package/dist/browser/prod/excalidraw-assets/id-ID-I6BOLXTF-ULJRGCTU.js +10 -0
  115. package/dist/browser/prod/excalidraw-assets/image-ZKACJTPS.js +1 -0
  116. package/dist/browser/prod/excalidraw-assets/{image-blob-reduce.esm-5DTGAOOI.js → image-blob-reduce.esm-GOFU5DPX.js} +1 -1
  117. package/dist/browser/prod/excalidraw-assets/{infoDiagram-bcd20f53-WJTZJERL.js → infoDiagram-bcd20f53-LJZ36XP5.js} +1 -1
  118. package/dist/browser/prod/excalidraw-assets/it-IT-WKPQOK4P-C3FTW2QG.js +11 -0
  119. package/dist/browser/prod/excalidraw-assets/ja-JP-VKA4ISRU-EBXFDMUP.js +8 -0
  120. package/dist/browser/prod/excalidraw-assets/{journeyDiagram-4fe6b3dc-JF22KXXQ.js → journeyDiagram-4fe6b3dc-TFRSU2KH.js} +1 -1
  121. package/dist/browser/prod/excalidraw-assets/kaa-IKPRSBNY-URJPWZZH.js +1 -0
  122. package/dist/browser/prod/excalidraw-assets/kab-KAB-IE4PHQTZ-OMISFOMM.js +8 -0
  123. package/dist/browser/prod/excalidraw-assets/{katex-N6R5DPQX.js → katex-HAQKNIIQ.js} +1 -1
  124. package/dist/browser/prod/excalidraw-assets/kk-KZ-MNJT6XSV-56OVE4EH.js +1 -0
  125. package/dist/browser/prod/excalidraw-assets/km-KH-LADGDFXV-KI7V2Z5A.js +11 -0
  126. package/dist/browser/prod/excalidraw-assets/ko-KR-XD7AVF2F-EFYGITKM.js +9 -0
  127. package/dist/browser/prod/excalidraw-assets/ku-TR-4XBHKDQA-U25XLPMW.js +9 -0
  128. package/dist/browser/prod/excalidraw-assets/lt-LT-QC35R4YH-6TDSRONI.js +3 -0
  129. package/dist/browser/prod/excalidraw-assets/lv-LV-GSD5D3BA-KMXM2FQ7.js +7 -0
  130. package/dist/browser/prod/excalidraw-assets/{mindmap-definition-f354de21-7SH5STU3.js → mindmap-definition-f354de21-J3C2WSJB.js} +1 -1
  131. package/dist/browser/prod/excalidraw-assets/mr-IN-KOLSWM7Y-NVYC6JCO.js +13 -0
  132. package/dist/browser/prod/excalidraw-assets/my-MM-M53KMUET-A2ORJJ2D.js +1 -0
  133. package/dist/browser/prod/excalidraw-assets/nb-NO-XXC6U37A-L4O4DGCC.js +10 -0
  134. package/dist/browser/prod/excalidraw-assets/nl-NL-HCCJQEUO-7Q2LV5NM.js +8 -0
  135. package/dist/browser/prod/excalidraw-assets/nn-NO-6P7Z2PI2-TUT2PFEE.js +8 -0
  136. package/dist/browser/prod/excalidraw-assets/oc-FR-JRJKPLNT-SBQHJH7X.js +8 -0
  137. package/dist/browser/prod/excalidraw-assets/pa-IN-LZWLEPIB-7NKOXI65.js +4 -0
  138. package/dist/browser/prod/excalidraw-assets/percentages-UCQDHIQF-Q4IM6ZEB.js +1 -0
  139. package/dist/browser/prod/excalidraw-assets/{pica-KWHN2PJ6.js → pica-ABPXE5C5.js} +1 -1
  140. package/dist/browser/prod/excalidraw-assets/{pieDiagram-79897490-5O5EBEQB.js → pieDiagram-79897490-FMJ3ZAF7.js} +1 -1
  141. package/dist/browser/prod/excalidraw-assets/pl-PL-3WBLCXI2-E2SMTIVM.js +9 -0
  142. package/dist/browser/prod/excalidraw-assets/pt-BR-O3ZPTUNW-RS7M7EKX.js +9 -0
  143. package/dist/browser/prod/excalidraw-assets/pt-PT-7AQTSAFO-AEANJ2UN.js +9 -0
  144. package/dist/browser/prod/excalidraw-assets/{quadrantDiagram-62f64e94-JTY6WOKB.js → quadrantDiagram-62f64e94-YI32TPUI.js} +1 -1
  145. package/dist/browser/prod/excalidraw-assets/{requirementDiagram-05bf5f74-TSFQFY5X.js → requirementDiagram-05bf5f74-UO2ATL3U.js} +1 -1
  146. package/dist/browser/prod/excalidraw-assets/ro-RO-HJ65JYWV-35XNZ4QJ.js +11 -0
  147. package/dist/browser/prod/excalidraw-assets/{roundRect-PUCZURYS.js → roundRect-UKQBLFKQ.js} +1 -1
  148. package/dist/browser/prod/excalidraw-assets/ru-RU-P7ROIYNC-ERPG3GJT.js +9 -0
  149. package/dist/browser/prod/excalidraw-assets/{sankeyDiagram-97764748-7G2R6W67.js → sankeyDiagram-97764748-3RR36435.js} +1 -1
  150. package/dist/browser/prod/excalidraw-assets/{sequenceDiagram-acc0e65c-CTANNZCO.js → sequenceDiagram-acc0e65c-G2Q6J4UN.js} +1 -1
  151. package/dist/browser/prod/excalidraw-assets/si-LK-7ZSWVION-YHKN25MU.js +1 -0
  152. package/dist/browser/prod/excalidraw-assets/sk-SK-NXVBGLYY-IKQZT26E.js +6 -0
  153. package/dist/browser/prod/excalidraw-assets/sl-SI-VFTWOYNP-UPLNMI3E.js +6 -0
  154. package/dist/browser/prod/excalidraw-assets/{stateDiagram-0ff1cf1a-I5COLKZ4.js → stateDiagram-0ff1cf1a-QEYVXCSB.js} +1 -1
  155. package/dist/browser/prod/excalidraw-assets/{stateDiagram-v2-9a9d610d-IIHI3AJN.js → stateDiagram-v2-9a9d610d-3VKD7UYK.js} +1 -1
  156. package/dist/browser/prod/excalidraw-assets/sv-SE-YONBLQNW-ZG4TE7PV.js +10 -0
  157. package/dist/browser/prod/excalidraw-assets/ta-IN-BSETPMLX-FC54FMQJ.js +9 -0
  158. package/dist/browser/prod/excalidraw-assets/th-TH-URTRDITB-K6QQ2PRO.js +2 -0
  159. package/dist/browser/prod/excalidraw-assets/{timeline-definition-fea2a41d-CXTGKWI4.js → timeline-definition-fea2a41d-H4D6IYVJ.js} +1 -1
  160. package/dist/browser/prod/excalidraw-assets/tr-TR-N5SCAVTB-HMUEG6DN.js +7 -0
  161. package/dist/browser/prod/excalidraw-assets/uk-UA-LBCYVSQZ-DEJZCNRZ.js +6 -0
  162. package/dist/browser/prod/excalidraw-assets/vi-VN-POZWLIUU-EY6QFLQV.js +5 -0
  163. package/dist/browser/prod/excalidraw-assets/{xychartDiagram-ab372869-QZGPPHJP.js → xychartDiagram-ab372869-SUXFHV53.js} +1 -1
  164. package/dist/browser/prod/excalidraw-assets/zh-CN-FUF5V3SC-5UIL2T3T.js +10 -0
  165. package/dist/browser/prod/excalidraw-assets/zh-HK-OB4VW42C-3ID2CCZJ.js +1 -0
  166. package/dist/browser/prod/excalidraw-assets/zh-TW-5JPVKOM7-VUPJBABS.js +9 -0
  167. package/dist/browser/prod/index.css +1 -1
  168. package/dist/browser/prod/index.js +128 -1
  169. package/dist/dev/{en-R7FEFJGC.json → en-Q552WR7L.json} +1 -1
  170. package/dist/dev/index.css +38 -15
  171. package/dist/dev/index.css.map +2 -2
  172. package/dist/dev/index.js +4575 -2598
  173. package/dist/dev/index.js.map +4 -4
  174. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +4 -4
  175. package/dist/excalidraw/actions/actionAddToLibrary.js +4 -3
  176. package/dist/excalidraw/actions/actionAlign.d.ts +20 -20
  177. package/dist/excalidraw/actions/actionAlign.js +7 -6
  178. package/dist/excalidraw/actions/actionBoundText.d.ts +7 -7
  179. package/dist/excalidraw/actions/actionBoundText.js +8 -4
  180. package/dist/excalidraw/actions/actionCanvas.d.ts +49 -49
  181. package/dist/excalidraw/actions/actionCanvas.js +16 -13
  182. package/dist/excalidraw/actions/actionClipboard.d.ts +24 -24
  183. package/dist/excalidraw/actions/actionClipboard.js +14 -13
  184. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +8 -8
  185. package/dist/excalidraw/actions/actionDeleteSelected.js +6 -3
  186. package/dist/excalidraw/actions/actionDistribute.d.ts +8 -8
  187. package/dist/excalidraw/actions/actionDistribute.js +3 -2
  188. package/dist/excalidraw/actions/actionDuplicateSelection.d.ts +5 -6
  189. package/dist/excalidraw/actions/actionDuplicateSelection.js +7 -3
  190. package/dist/excalidraw/actions/actionElementLock.d.ts +8 -8
  191. package/dist/excalidraw/actions/actionElementLock.js +3 -2
  192. package/dist/excalidraw/actions/actionExport.d.ts +36 -36
  193. package/dist/excalidraw/actions/actionExport.js +15 -11
  194. package/dist/excalidraw/actions/actionFinalize.d.ts +8 -8
  195. package/dist/excalidraw/actions/actionFinalize.js +9 -5
  196. package/dist/excalidraw/actions/actionFlip.d.ts +9 -9
  197. package/dist/excalidraw/actions/actionFlip.js +10 -9
  198. package/dist/excalidraw/actions/actionFrame.d.ts +14 -169
  199. package/dist/excalidraw/actions/actionFrame.js +7 -6
  200. package/dist/excalidraw/actions/actionGroup.d.ts +11 -321
  201. package/dist/excalidraw/actions/actionGroup.js +9 -11
  202. package/dist/excalidraw/actions/actionHistory.d.ts +3 -2
  203. package/dist/excalidraw/actions/actionHistory.js +27 -28
  204. package/dist/excalidraw/actions/actionLinearEditor.d.ts +2 -2
  205. package/dist/excalidraw/actions/actionLinearEditor.js +2 -1
  206. package/dist/excalidraw/actions/actionLink.d.ts +5 -5
  207. package/dist/excalidraw/actions/actionLink.js +2 -1
  208. package/dist/excalidraw/actions/actionMenu.d.ts +8 -8
  209. package/dist/excalidraw/actions/actionMenu.js +4 -3
  210. package/dist/excalidraw/actions/actionNavigate.d.ts +3 -3
  211. package/dist/excalidraw/actions/actionNavigate.js +3 -2
  212. package/dist/excalidraw/actions/actionProperties.d.ts +32 -32
  213. package/dist/excalidraw/actions/actionProperties.js +18 -13
  214. package/dist/excalidraw/actions/actionSelectAll.d.ts +4 -4
  215. package/dist/excalidraw/actions/actionSelectAll.js +2 -1
  216. package/dist/excalidraw/actions/actionStyles.d.ts +9 -12
  217. package/dist/excalidraw/actions/actionStyles.js +4 -3
  218. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +6 -4
  219. package/dist/excalidraw/actions/actionToggleGridMode.js +6 -2
  220. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +4 -4
  221. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.js +2 -1
  222. package/dist/excalidraw/actions/actionToggleStats.d.ts +4 -4
  223. package/dist/excalidraw/actions/actionToggleStats.js +2 -1
  224. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +4 -4
  225. package/dist/excalidraw/actions/actionToggleViewMode.js +2 -1
  226. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +4 -4
  227. package/dist/excalidraw/actions/actionToggleZenMode.js +2 -1
  228. package/dist/excalidraw/actions/actionZindex.d.ts +19 -19
  229. package/dist/excalidraw/actions/actionZindex.js +5 -4
  230. package/dist/excalidraw/actions/manager.d.ts +3 -3
  231. package/dist/excalidraw/actions/types.d.ts +4 -4
  232. package/dist/excalidraw/appState.d.ts +5 -5
  233. package/dist/excalidraw/change.d.ts +191 -0
  234. package/dist/excalidraw/change.js +894 -0
  235. package/dist/excalidraw/components/App.d.ts +22 -7
  236. package/dist/excalidraw/components/App.js +340 -130
  237. package/dist/excalidraw/components/CommandPalette/CommandPalette.js +1 -0
  238. package/dist/excalidraw/components/HelpDialog.js +1 -1
  239. package/dist/excalidraw/components/Sidebar/Sidebar.d.ts +2 -2
  240. package/dist/excalidraw/components/Stack.d.ts +2 -2
  241. package/dist/excalidraw/components/ToolButton.d.ts +1 -0
  242. package/dist/excalidraw/components/ToolButton.js +1 -1
  243. package/dist/excalidraw/components/canvases/InteractiveCanvas.d.ts +2 -1
  244. package/dist/excalidraw/components/canvases/InteractiveCanvas.js +1 -0
  245. package/dist/excalidraw/components/hyperlink/Hyperlink.js +3 -3
  246. package/dist/excalidraw/components/hyperlink/helpers.js +2 -3
  247. package/dist/excalidraw/components/icons.d.ts +1 -0
  248. package/dist/excalidraw/components/icons.js +1 -0
  249. package/dist/excalidraw/components/main-menu/DefaultItems.d.ts +1 -1
  250. package/dist/excalidraw/constants.d.ts +3 -3
  251. package/dist/excalidraw/constants.js +6 -3
  252. package/dist/excalidraw/data/reconcile.d.ts +6 -0
  253. package/dist/excalidraw/data/reconcile.js +49 -0
  254. package/dist/excalidraw/data/restore.d.ts +3 -3
  255. package/dist/excalidraw/data/restore.js +6 -7
  256. package/dist/excalidraw/data/transform.d.ts +1 -1
  257. package/dist/excalidraw/data/transform.js +4 -3
  258. package/dist/excalidraw/data/url.d.ts +1 -0
  259. package/dist/excalidraw/data/url.js +4 -1
  260. package/dist/excalidraw/element/binding.d.ts +64 -9
  261. package/dist/excalidraw/element/binding.js +634 -96
  262. package/dist/excalidraw/element/bounds.d.ts +0 -1
  263. package/dist/excalidraw/element/bounds.js +0 -3
  264. package/dist/excalidraw/element/collision.d.ts +14 -19
  265. package/dist/excalidraw/element/collision.js +36 -713
  266. package/dist/excalidraw/element/embeddable.d.ts +7 -4
  267. package/dist/excalidraw/element/embeddable.js +88 -27
  268. package/dist/excalidraw/element/index.d.ts +0 -1
  269. package/dist/excalidraw/element/index.js +0 -1
  270. package/dist/excalidraw/element/linearElementEditor.d.ts +11 -11
  271. package/dist/excalidraw/element/linearElementEditor.js +7 -5
  272. package/dist/excalidraw/element/mutateElement.d.ts +1 -2
  273. package/dist/excalidraw/element/newElement.d.ts +1 -1
  274. package/dist/excalidraw/element/newElement.js +2 -1
  275. package/dist/excalidraw/element/resizeElements.d.ts +1 -1
  276. package/dist/excalidraw/element/resizeElements.js +110 -86
  277. package/dist/excalidraw/element/resizeTest.d.ts +4 -4
  278. package/dist/excalidraw/element/resizeTest.js +55 -8
  279. package/dist/excalidraw/element/sizeHelpers.js +3 -0
  280. package/dist/excalidraw/element/textElement.d.ts +1 -2
  281. package/dist/excalidraw/element/textElement.js +5 -34
  282. package/dist/excalidraw/element/transformHandles.d.ts +22 -4
  283. package/dist/excalidraw/element/transformHandles.js +24 -3
  284. package/dist/excalidraw/element/typeChecks.d.ts +2 -2
  285. package/dist/excalidraw/element/types.d.ts +19 -6
  286. package/dist/excalidraw/errors.d.ts +3 -0
  287. package/dist/excalidraw/errors.js +3 -0
  288. package/dist/excalidraw/fractionalIndex.d.ts +40 -0
  289. package/dist/excalidraw/fractionalIndex.js +241 -0
  290. package/dist/excalidraw/frame.d.ts +1 -1
  291. package/dist/excalidraw/groups.d.ts +2 -0
  292. package/dist/excalidraw/groups.js +17 -0
  293. package/dist/excalidraw/history.d.ts +34 -46
  294. package/dist/excalidraw/history.js +100 -167
  295. package/dist/excalidraw/hooks/useEmitter.d.ts +2 -0
  296. package/dist/excalidraw/hooks/useEmitter.js +13 -0
  297. package/dist/excalidraw/index.d.ts +2 -0
  298. package/dist/excalidraw/index.js +2 -0
  299. package/dist/excalidraw/locales/en.json +1 -1
  300. package/dist/excalidraw/renderer/interactiveScene.d.ts +1 -1
  301. package/dist/excalidraw/renderer/interactiveScene.js +8 -7
  302. package/dist/excalidraw/renderer/staticScene.js +14 -3
  303. package/dist/excalidraw/renderer/staticSvgScene.js +10 -0
  304. package/dist/excalidraw/scene/Scene.d.ts +7 -6
  305. package/dist/excalidraw/scene/Scene.js +31 -16
  306. package/dist/excalidraw/scene/export.js +2 -1
  307. package/dist/excalidraw/scene/types.d.ts +2 -1
  308. package/dist/excalidraw/store.d.ts +99 -0
  309. package/dist/excalidraw/store.js +269 -0
  310. package/dist/excalidraw/types.d.ts +18 -4
  311. package/dist/excalidraw/utils.d.ts +6 -0
  312. package/dist/excalidraw/utils.js +7 -0
  313. package/dist/excalidraw/zindex.d.ts +2 -2
  314. package/dist/excalidraw/zindex.js +9 -13
  315. package/dist/prod/{en-R7FEFJGC.json → en-Q552WR7L.json} +1 -1
  316. package/dist/prod/index.css +1 -1
  317. package/dist/prod/index.js +44 -44
  318. package/dist/utils/collision.d.ts +4 -0
  319. package/dist/utils/collision.js +48 -0
  320. package/dist/utils/geometry/geometry.d.ts +71 -0
  321. package/dist/utils/geometry/geometry.js +674 -0
  322. package/dist/utils/geometry/shape.d.ts +56 -0
  323. package/dist/utils/geometry/shape.js +168 -0
  324. package/history.ts +161 -216
  325. package/package.json +2 -1
  326. package/dist/browser/dev/excalidraw-assets-dev/chunk-GPOYIZPX.js.map +0 -7
  327. package/dist/browser/dev/excalidraw-assets-dev/chunk-J5HRUYQR.js.map +0 -7
  328. package/dist/browser/dev/excalidraw-assets-dev/chunk-UETNA2WX.js.map +0 -7
  329. package/dist/browser/dev/excalidraw-assets-dev/dist-Y7S5GOTG.js +0 -10
  330. package/dist/browser/dev/excalidraw-assets-dev/image-ZNQQXS62.css.map +0 -7
  331. package/dist/browser/prod/excalidraw-assets/chunk-EEN6AFMH.js +0 -269
  332. package/dist/browser/prod/excalidraw-assets/dist-7FHVDAZ2.js +0 -1
  333. package/dist/browser/prod/excalidraw-assets/flowDiagram-v2-3b53844e-CRHRHP7H.js +0 -1
  334. package/dist/browser/prod/excalidraw-assets/image-VXYNPVOG.js +0 -1
  335. package/dist/browser/prod/excalidraw-assets/image-WE6NA2G6.css +0 -1
  336. /package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-RHODGCTM.js.map → blockDiagram-91b80b7a-NRABZKZA.js.map} +0 -0
  337. /package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-W7NCR7LR.js.map → c4Diagram-b2a90758-56M32CJD.js.map} +0 -0
  338. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-TKRIVTWP.js.map → chunk-5EDB2FTV.js.map} +0 -0
  339. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-52OGG53V.js.map → chunk-6VTJEXQH.js.map} +0 -0
  340. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-GF7VCOUM.js.map → chunk-C4OL7SRI.js.map} +0 -0
  341. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-BESQLMCW.js.map → chunk-E47I6Q7O.js.map} +0 -0
  342. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-5747M6KP.js.map → chunk-OH2YDYHX.js.map} +0 -0
  343. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-GCA4S2OA.js.map → chunk-RTA6DTUV.js.map} +0 -0
  344. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-DQOPSCYA.js.map → chunk-TTH3BTHQ.js.map} +0 -0
  345. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-B2MHJWXZ.js.map → chunk-U4N7TEPH.js.map} +0 -0
  346. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-QFS4M5OJ.js.map → chunk-V3PA4IDR.js.map} +0 -0
  347. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-SLLUETBM.js.map → chunk-WFT6ZJE6.js.map} +0 -0
  348. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-PPHFJLL7.js.map → chunk-XZKEYTKS.js.map} +0 -0
  349. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-USLWOHUZ.js.map → chunk-YC6VTXEO.js.map} +0 -0
  350. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-GJGBT4TV.js.map → classDiagram-30eddba6-EZJVINS6.js.map} +0 -0
  351. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-LYWTIPJA.js.map → classDiagram-v2-f2df5561-XSUIN44A.js.map} +0 -0
  352. /package/dist/browser/dev/excalidraw-assets-dev/{directory-open-01563666-UREMLRIT.js.map → directory-open-01563666-KOK2HSB6.js.map} +0 -0
  353. /package/dist/browser/dev/excalidraw-assets-dev/{directory-open-4ed118d0-UN3BUDZZ.js.map → directory-open-4ed118d0-P3Q3CLF3.js.map} +0 -0
  354. /package/dist/browser/dev/excalidraw-assets-dev/{dist-Y7S5GOTG.js.map → dist-O6HOTHQF.js.map} +0 -0
  355. /package/dist/browser/dev/excalidraw-assets-dev/{en-UW5C5KGW.js.map → en-PSBMWL4S.js.map} +0 -0
  356. /package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-Z7U2XW2Y.js.map → erDiagram-47591fe2-U7FLWOG3.js.map} +0 -0
  357. /package/dist/browser/dev/excalidraw-assets-dev/{file-open-002ab408-4QG336MG.js.map → file-open-002ab408-EQEHGU2J.js.map} +0 -0
  358. /package/dist/browser/dev/excalidraw-assets-dev/{file-open-7c801643-3QI4ICCL.js.map → file-open-7c801643-QQT6O7P5.js.map} +0 -0
  359. /package/dist/browser/dev/excalidraw-assets-dev/{file-save-3189631c-TNNERCWV.js.map → file-save-3189631c-YXX2C7C6.js.map} +0 -0
  360. /package/dist/browser/dev/excalidraw-assets-dev/{file-save-745eba88-JFMH565P.js.map → file-save-745eba88-7G554KTZ.js.map} +0 -0
  361. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-PARVG263.js.map → flowDiagram-5540d9b9-F2VP4JAA.js.map} +0 -0
  362. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-ZJOPVRMB.js.map → flowDiagram-v2-3b53844e-2WQZZRND.js.map} +0 -0
  363. /package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-ULPNBSZX.js.map → flowchart-elk-definition-5fe447d6-IW6O2F6C.js.map} +0 -0
  364. /package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-ESSYVTJ4.js.map → ganttDiagram-9a3bba1f-B5RH7ZAO.js.map} +0 -0
  365. /package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-6V6VVNNP.js.map → gitGraphDiagram-96e6b4ee-INGQRNLZ.js.map} +0 -0
  366. /package/dist/browser/dev/excalidraw-assets-dev/{image-3LTGFHLF.js.map → image-GMAHLVER.js.map} +0 -0
  367. /package/dist/browser/dev/excalidraw-assets-dev/{image-blob-reduce.esm-KTX27DAY.js.map → image-blob-reduce.esm-OX75MRP3.js.map} +0 -0
  368. /package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-I22FLFX3.js.map → infoDiagram-bcd20f53-43FMAUOR.js.map} +0 -0
  369. /package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-WAO6F52C.js.map → journeyDiagram-4fe6b3dc-KFVOUX4I.js.map} +0 -0
  370. /package/dist/browser/dev/excalidraw-assets-dev/{katex-NWA2YFOP.js.map → katex-A3GRORPB.js.map} +0 -0
  371. /package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-K74IKX4Y.js.map → mindmap-definition-f354de21-D7S3CRQ4.js.map} +0 -0
  372. /package/dist/browser/dev/excalidraw-assets-dev/{pica-3TH2EGXR.js.map → pica-ZAD7MTGA.js.map} +0 -0
  373. /package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-DOB2LVE5.js.map → pieDiagram-79897490-OON2CRZ5.js.map} +0 -0
  374. /package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-MJV2X7WI.js.map → quadrantDiagram-62f64e94-5APTNVVS.js.map} +0 -0
  375. /package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-H4YM3XN7.js.map → requirementDiagram-05bf5f74-FM7WZVKU.js.map} +0 -0
  376. /package/dist/browser/dev/excalidraw-assets-dev/{roundRect-4S3QV2NZ.js.map → roundRect-AYYHVX5X.js.map} +0 -0
  377. /package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-7X74ABAN.js.map → sankeyDiagram-97764748-5HLEFFGY.js.map} +0 -0
  378. /package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-PPDIJFQP.js.map → sequenceDiagram-acc0e65c-4ZRSNGPV.js.map} +0 -0
  379. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-JVBR7N35.js.map → stateDiagram-0ff1cf1a-OLTPYRPP.js.map} +0 -0
  380. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-QYAJLQJH.js.map → stateDiagram-v2-9a9d610d-N3XOTAEE.js.map} +0 -0
  381. /package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-GL7U3WDB.js.map → timeline-definition-fea2a41d-5PDFIYJQ.js.map} +0 -0
  382. /package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-4U4JE4TW.js.map → xychartDiagram-ab372869-VIWBP45Y.js.map} +0 -0
@@ -1,190 +1,123 @@
1
- import { isLinearElement } from "./element/typeChecks";
2
- import { deepCopyElement } from "./element/newElement";
3
- const clearAppStatePropertiesForHistory = (appState) => {
4
- return {
5
- selectedElementIds: appState.selectedElementIds,
6
- selectedGroupIds: appState.selectedGroupIds,
7
- viewBackgroundColor: appState.viewBackgroundColor,
8
- editingLinearElement: appState.editingLinearElement,
9
- editingGroupId: appState.editingGroupId,
10
- name: appState.name,
11
- };
12
- };
13
- class History {
14
- elementCache = new Map();
15
- recording = true;
16
- stateHistory = [];
1
+ import { Emitter } from "./emitter";
2
+ export class HistoryChangedEvent {
3
+ isUndoStackEmpty;
4
+ isRedoStackEmpty;
5
+ constructor(isUndoStackEmpty = true, isRedoStackEmpty = true) {
6
+ this.isUndoStackEmpty = isUndoStackEmpty;
7
+ this.isRedoStackEmpty = isRedoStackEmpty;
8
+ }
9
+ }
10
+ export class History {
11
+ onHistoryChangedEmitter = new Emitter();
12
+ undoStack = [];
17
13
  redoStack = [];
18
- lastEntry = null;
19
- hydrateHistoryEntry({ appState, elements, }) {
20
- return {
21
- appState: JSON.parse(appState),
22
- elements: elements.map((dehydratedExcalidrawElement) => {
23
- const element = this.elementCache
24
- .get(dehydratedExcalidrawElement.id)
25
- ?.get(dehydratedExcalidrawElement.versionNonce);
26
- if (!element) {
27
- throw new Error(`Element not found: ${dehydratedExcalidrawElement.id}:${dehydratedExcalidrawElement.versionNonce}`);
28
- }
29
- return element;
30
- }),
31
- };
32
- }
33
- dehydrateHistoryEntry({ appState, elements, }) {
34
- return {
35
- appState: JSON.stringify(appState),
36
- elements: elements.map((element) => {
37
- if (!this.elementCache.has(element.id)) {
38
- this.elementCache.set(element.id, new Map());
39
- }
40
- const versions = this.elementCache.get(element.id);
41
- if (!versions.has(element.versionNonce)) {
42
- versions.set(element.versionNonce, deepCopyElement(element));
43
- }
44
- return {
45
- id: element.id,
46
- versionNonce: element.versionNonce,
47
- };
48
- }),
49
- };
50
- }
51
- getSnapshotForTest() {
52
- return {
53
- recording: this.recording,
54
- stateHistory: this.stateHistory.map((dehydratedHistoryEntry) => this.hydrateHistoryEntry(dehydratedHistoryEntry)),
55
- redoStack: this.redoStack.map((dehydratedHistoryEntry) => this.hydrateHistoryEntry(dehydratedHistoryEntry)),
56
- };
14
+ get isUndoStackEmpty() {
15
+ return this.undoStack.length === 0;
16
+ }
17
+ get isRedoStackEmpty() {
18
+ return this.redoStack.length === 0;
57
19
  }
58
20
  clear() {
59
- this.stateHistory.length = 0;
21
+ this.undoStack.length = 0;
60
22
  this.redoStack.length = 0;
61
- this.lastEntry = null;
62
- this.elementCache.clear();
63
- }
64
- generateEntry = (appState, elements) => this.dehydrateHistoryEntry({
65
- appState: clearAppStatePropertiesForHistory(appState),
66
- elements: elements.reduce((elements, element) => {
67
- if (isLinearElement(element) &&
68
- appState.multiElement &&
69
- appState.multiElement.id === element.id) {
70
- // don't store multi-point arrow if still has only one point
71
- if (appState.multiElement &&
72
- appState.multiElement.id === element.id &&
73
- element.points.length < 2) {
74
- return elements;
75
- }
76
- elements.push({
77
- ...element,
78
- // don't store last point if not committed
79
- points: element.lastCommittedPoint !==
80
- element.points[element.points.length - 1]
81
- ? element.points.slice(0, -1)
82
- : element.points,
83
- });
84
- }
85
- else {
86
- elements.push(element);
23
+ }
24
+ /**
25
+ * Record a local change which will go into the history
26
+ */
27
+ record(elementsChange, appStateChange) {
28
+ const entry = HistoryEntry.create(appStateChange, elementsChange);
29
+ if (!entry.isEmpty()) {
30
+ // we have the latest changes, no need to `applyLatest`, which is done within `History.push`
31
+ this.undoStack.push(entry.inverse());
32
+ if (!entry.elementsChange.isEmpty()) {
33
+ // don't reset redo stack on local appState changes,
34
+ // as a simple click (unselect) could lead to losing all the redo entries
35
+ // only reset on non empty elements changes!
36
+ this.redoStack.length = 0;
87
37
  }
88
- return elements;
89
- }, []),
90
- });
91
- shouldCreateEntry(nextEntry) {
92
- const { lastEntry } = this;
93
- if (!lastEntry) {
94
- return true;
95
- }
96
- if (nextEntry.elements.length !== lastEntry.elements.length) {
97
- return true;
38
+ this.onHistoryChangedEmitter.trigger(new HistoryChangedEvent(this.isUndoStackEmpty, this.isRedoStackEmpty));
98
39
  }
99
- // loop from right to left as changes are likelier to happen on new elements
100
- for (let i = nextEntry.elements.length - 1; i > -1; i--) {
101
- const prev = nextEntry.elements[i];
102
- const next = lastEntry.elements[i];
103
- if (!prev ||
104
- !next ||
105
- prev.id !== next.id ||
106
- prev.versionNonce !== next.versionNonce) {
107
- return true;
40
+ }
41
+ undo(elements, appState, snapshot) {
42
+ return this.perform(elements, appState, snapshot, () => History.pop(this.undoStack), (entry) => History.push(this.redoStack, entry, elements));
43
+ }
44
+ redo(elements, appState, snapshot) {
45
+ return this.perform(elements, appState, snapshot, () => History.pop(this.redoStack), (entry) => History.push(this.undoStack, entry, elements));
46
+ }
47
+ perform(elements, appState, snapshot, pop, push) {
48
+ try {
49
+ let historyEntry = pop();
50
+ if (historyEntry === null) {
51
+ return;
108
52
  }
109
- }
110
- // note: this is safe because entry's appState is guaranteed no excess props
111
- let key;
112
- for (key in nextEntry.appState) {
113
- if (key === "editingLinearElement") {
114
- if (nextEntry.appState[key]?.elementId ===
115
- lastEntry.appState[key]?.elementId) {
116
- continue;
53
+ let nextElements = elements;
54
+ let nextAppState = appState;
55
+ let containsVisibleChange = false;
56
+ // iterate through the history entries in case they result in no visible changes
57
+ while (historyEntry) {
58
+ try {
59
+ [nextElements, nextAppState, containsVisibleChange] =
60
+ historyEntry.applyTo(nextElements, nextAppState, snapshot);
117
61
  }
62
+ finally {
63
+ // make sure to always push / pop, even if the increment is corrupted
64
+ push(historyEntry);
65
+ }
66
+ if (containsVisibleChange) {
67
+ break;
68
+ }
69
+ historyEntry = pop();
118
70
  }
119
- if (key === "selectedElementIds" || key === "selectedGroupIds") {
120
- continue;
121
- }
122
- if (nextEntry.appState[key] !== lastEntry.appState[key]) {
123
- return true;
124
- }
71
+ return [nextElements, nextAppState];
125
72
  }
126
- return false;
127
- }
128
- pushEntry(appState, elements) {
129
- const newEntryDehydrated = this.generateEntry(appState, elements);
130
- const newEntry = this.hydrateHistoryEntry(newEntryDehydrated);
131
- if (newEntry) {
132
- if (!this.shouldCreateEntry(newEntry)) {
133
- return;
134
- }
135
- this.stateHistory.push(newEntryDehydrated);
136
- this.lastEntry = newEntry;
137
- // As a new entry was pushed, we invalidate the redo stack
138
- this.clearRedoStack();
73
+ finally {
74
+ // trigger the history change event before returning completely
75
+ // also trigger it just once, no need doing so on each entry
76
+ this.onHistoryChangedEmitter.trigger(new HistoryChangedEvent(this.isUndoStackEmpty, this.isRedoStackEmpty));
139
77
  }
140
78
  }
141
- clearRedoStack() {
142
- this.redoStack.splice(0, this.redoStack.length);
143
- }
144
- redoOnce() {
145
- if (this.redoStack.length === 0) {
79
+ static pop(stack) {
80
+ if (!stack.length) {
146
81
  return null;
147
82
  }
148
- const entryToRestore = this.redoStack.pop();
149
- if (entryToRestore !== undefined) {
150
- this.stateHistory.push(entryToRestore);
151
- return this.hydrateHistoryEntry(entryToRestore);
83
+ const entry = stack.pop();
84
+ if (entry !== undefined) {
85
+ return entry;
152
86
  }
153
87
  return null;
154
88
  }
155
- undoOnce() {
156
- if (this.stateHistory.length === 1) {
157
- return null;
158
- }
159
- const currentEntry = this.stateHistory.pop();
160
- const entryToRestore = this.stateHistory[this.stateHistory.length - 1];
161
- if (currentEntry !== undefined) {
162
- this.redoStack.push(currentEntry);
163
- return this.hydrateHistoryEntry(entryToRestore);
164
- }
165
- return null;
89
+ static push(stack, entry, prevElements) {
90
+ const updatedEntry = entry.inverse().applyLatestChanges(prevElements);
91
+ return stack.push(updatedEntry);
92
+ }
93
+ }
94
+ export class HistoryEntry {
95
+ appStateChange;
96
+ elementsChange;
97
+ constructor(appStateChange, elementsChange) {
98
+ this.appStateChange = appStateChange;
99
+ this.elementsChange = elementsChange;
100
+ }
101
+ static create(appStateChange, elementsChange) {
102
+ return new HistoryEntry(appStateChange, elementsChange);
103
+ }
104
+ inverse() {
105
+ return new HistoryEntry(this.appStateChange.inverse(), this.elementsChange.inverse());
106
+ }
107
+ applyTo(elements, appState, snapshot) {
108
+ const [nextElements, elementsContainVisibleChange] = this.elementsChange.applyTo(elements, snapshot.elements);
109
+ const [nextAppState, appStateContainsVisibleChange] = this.appStateChange.applyTo(appState, nextElements);
110
+ const appliedVisibleChanges = elementsContainVisibleChange || appStateContainsVisibleChange;
111
+ return [nextElements, nextAppState, appliedVisibleChanges];
166
112
  }
167
113
  /**
168
- * Updates history's `lastEntry` to latest app state. This is necessary
169
- * when doing undo/redo which itself doesn't commit to history, but updates
170
- * app state in a way that would break `shouldCreateEntry` which relies on
171
- * `lastEntry` to reflect last comittable history state.
172
- * We can't update `lastEntry` from within history when calling undo/redo
173
- * because the action potentially mutates appState/elements before storing
174
- * it.
114
+ * Apply latest (remote) changes to the history entry, creates new instance of `HistoryEntry`.
175
115
  */
176
- setCurrentState(appState, elements) {
177
- this.lastEntry = this.hydrateHistoryEntry(this.generateEntry(appState, elements));
116
+ applyLatestChanges(elements) {
117
+ const updatedElementsChange = this.elementsChange.applyLatestChanges(elements);
118
+ return HistoryEntry.create(this.appStateChange, updatedElementsChange);
178
119
  }
179
- // Suspicious that this is called so many places. Seems error-prone.
180
- resumeRecording() {
181
- this.recording = true;
182
- }
183
- record(state, elements) {
184
- if (this.recording) {
185
- this.pushEntry(state, elements);
186
- this.recording = false;
187
- }
120
+ isEmpty() {
121
+ return this.appStateChange.isEmpty() && this.elementsChange.isEmpty();
188
122
  }
189
123
  }
190
- export default History;
@@ -0,0 +1,2 @@
1
+ import { Emitter } from "../emitter";
2
+ export declare const useEmitter: <TEvent extends unknown>(emitter: Emitter<[TEvent]>, initialState: TEvent) => TEvent;
@@ -0,0 +1,13 @@
1
+ import { useEffect, useState } from "react";
2
+ export const useEmitter = (emitter, initialState) => {
3
+ const [event, setEvent] = useState(initialState);
4
+ useEffect(() => {
5
+ const unsubscribe = emitter.on((event) => {
6
+ setEvent(event);
7
+ });
8
+ return () => {
9
+ unsubscribe();
10
+ };
11
+ }, [emitter]);
12
+ return event;
13
+ };
@@ -11,6 +11,7 @@ export declare const Excalidraw: React.MemoExoticComponent<(props: ExcalidrawPro
11
11
  export { getSceneVersion, hashElementsVersion, hashString, isInvisiblySmallElement, getNonDeletedElements, } from "./element";
12
12
  export { defaultLang, useI18n, languages } from "./i18n";
13
13
  export { restore, restoreAppState, restoreElements, restoreLibraryItems, } from "./data/restore";
14
+ export { reconcileElements } from "./data/reconcile";
14
15
  export { exportToBlob, exportToSvg, exportToClipboard } from "../utils/export";
15
16
  export { serializeAsJSON, serializeLibraryAsJSON } from "./data/json";
16
17
  export { loadFromBlob, loadSceneOrLibraryFromBlob, loadLibraryFromBlob, } from "./data/blob";
@@ -19,6 +20,7 @@ export { mergeLibraryItems, getLibraryItemsHash } from "./data/library";
19
20
  export { isLinearElement } from "./element/typeChecks";
20
21
  export { FONT_FAMILY, THEME, MIME_TYPES, ROUNDNESS, DEFAULT_LASER_COLOR, } from "./constants";
21
22
  export { mutateElement, newElementWith, bumpVersion, } from "./element/mutateElement";
23
+ export { StoreAction } from "./store";
22
24
  export { parseLibraryTokensFromUrl, useHandleLibrary } from "./data/library";
23
25
  export { sceneCoordsToViewportCoords, viewportCoordsToSceneCoords, } from "./utils";
24
26
  export { Sidebar } from "./components/Sidebar/Sidebar";
@@ -98,6 +98,7 @@ Excalidraw.displayName = "Excalidraw";
98
98
  export { getSceneVersion, hashElementsVersion, hashString, isInvisiblySmallElement, getNonDeletedElements, } from "./element";
99
99
  export { defaultLang, useI18n, languages } from "./i18n";
100
100
  export { restore, restoreAppState, restoreElements, restoreLibraryItems, } from "./data/restore";
101
+ export { reconcileElements } from "./data/reconcile";
101
102
  export { exportToBlob, exportToSvg, exportToClipboard } from "../utils/export";
102
103
  export { serializeAsJSON, serializeLibraryAsJSON } from "./data/json";
103
104
  export { loadFromBlob, loadSceneOrLibraryFromBlob, loadLibraryFromBlob, } from "./data/blob";
@@ -106,6 +107,7 @@ export { mergeLibraryItems, getLibraryItemsHash } from "./data/library";
106
107
  export { isLinearElement } from "./element/typeChecks";
107
108
  export { FONT_FAMILY, THEME, MIME_TYPES, ROUNDNESS, DEFAULT_LASER_COLOR, } from "./constants";
108
109
  export { mutateElement, newElementWith, bumpVersion, } from "./element/mutateElement";
110
+ export { StoreAction } from "./store";
109
111
  export { parseLibraryTokensFromUrl, useHandleLibrary } from "./data/library";
110
112
  export { sceneCoordsToViewportCoords, viewportCoordsToSceneCoords, } from "./utils";
111
113
  export { Sidebar } from "./components/Sidebar/Sidebar";
@@ -87,7 +87,7 @@
87
87
  "group": "Group selection",
88
88
  "ungroup": "Ungroup selection",
89
89
  "collaborators": "Collaborators",
90
- "showGrid": "Show grid",
90
+ "toggleGrid": "Toggle grid",
91
91
  "addToLibrary": "Add to library",
92
92
  "removeFromLibrary": "Remove from library",
93
93
  "libraryLoadingMessage": "Loading library…",
@@ -9,7 +9,7 @@ export declare const renderInteractiveSceneThrottled: {
9
9
  * Interactive scene is the ui-canvas where we render bounding boxes, selections
10
10
  * and other ui stuff.
11
11
  */
12
- export declare const renderInteractiveScene: <U extends ({ canvas, elementsMap, visibleElements, selectedElements, scale, appState, renderConfig, }: InteractiveSceneRenderConfig) => {
12
+ export declare const renderInteractiveScene: <U extends ({ canvas, elementsMap, visibleElements, selectedElements, scale, appState, renderConfig, device, }: InteractiveSceneRenderConfig) => {
13
13
  atLeastOneVisibleElement: boolean;
14
14
  elementsMap: RenderableElementsMap;
15
15
  scrollBars?: undefined;
@@ -1,14 +1,14 @@
1
- import { getElementAbsoluteCoords, OMIT_SIDES_FOR_MULTIPLE_ELEMENTS, getTransformHandlesFromCoords, getTransformHandles, getCommonBounds, } from "../element";
1
+ import { getElementAbsoluteCoords, getTransformHandlesFromCoords, getTransformHandles, getCommonBounds, } from "../element";
2
2
  import { roundRect } from "../renderer/roundRect";
3
3
  import { getScrollBars, SCROLLBAR_COLOR, SCROLLBAR_WIDTH, } from "../scene/scrollbars";
4
4
  import { renderSelectionElement } from "../renderer/renderElement";
5
5
  import { getClientColor, renderRemoteCursors } from "../clients";
6
6
  import { isSelectedViaGroup, getSelectedGroupIds, getElementsInGroup, selectGroupsFromGivenElements, } from "../groups";
7
- import { OMIT_SIDES_FOR_FRAME, shouldShowBoundingBox, } from "../element/transformHandles";
7
+ import { getOmitSidesForDevice, shouldShowBoundingBox, } from "../element/transformHandles";
8
8
  import { arrayToMap, throttleRAF } from "../utils";
9
9
  import { DEFAULT_TRANSFORM_HANDLE_SPACING, FRAME_STYLE } from "../constants";
10
10
  import { renderSnaps } from "../renderer/renderSnaps";
11
- import { maxBindingGap } from "../element/collision";
11
+ import { maxBindingGap, } from "../element/binding";
12
12
  import { LinearElementEditor } from "../element/linearElementEditor";
13
13
  import { bootstrapCanvas, fillCircle, getNormalizedCanvasDimensions, } from "./helpers";
14
14
  import oc from "open-color";
@@ -264,7 +264,7 @@ const renderTransformHandles = (context, renderConfig, appState, transformHandle
264
264
  }
265
265
  });
266
266
  };
267
- const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selectedElements, scale, appState, renderConfig, }) => {
267
+ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selectedElements, scale, appState, renderConfig, device, }) => {
268
268
  if (canvas === null) {
269
269
  return { atLeastOneVisibleElement: false, elementsMap };
270
270
  }
@@ -403,7 +403,8 @@ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selecte
403
403
  context.translate(appState.scrollX, appState.scrollY);
404
404
  if (selectedElements.length === 1) {
405
405
  context.fillStyle = oc.white;
406
- const transformHandles = getTransformHandles(selectedElements[0], appState.zoom, elementsMap, "mouse");
406
+ const transformHandles = getTransformHandles(selectedElements[0], appState.zoom, elementsMap, "mouse", // when we render we don't know which pointer type so use mouse,
407
+ getOmitSidesForDevice(device));
407
408
  if (!appState.viewModeEnabled && showBoundingBox) {
408
409
  renderTransformHandles(context, renderConfig, appState, transformHandles, selectedElements[0].angle);
409
410
  }
@@ -421,8 +422,8 @@ const _renderInteractiveScene = ({ canvas, elementsMap, visibleElements, selecte
421
422
  context.lineWidth = lineWidth;
422
423
  context.setLineDash(initialLineDash);
423
424
  const transformHandles = getTransformHandlesFromCoords([x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2], 0, appState.zoom, "mouse", isFrameSelected
424
- ? OMIT_SIDES_FOR_FRAME
425
- : OMIT_SIDES_FOR_MULTIPLE_ELEMENTS);
425
+ ? { ...getOmitSidesForDevice(device), rotation: true }
426
+ : getOmitSidesForDevice(device));
426
427
  if (selectedElements.some((element) => !element.locked)) {
427
428
  renderTransformHandles(context, renderConfig, appState, transformHandles, 0);
428
429
  }
@@ -1,12 +1,13 @@
1
1
  import { FRAME_STYLE } from "../constants";
2
2
  import { getElementAbsoluteCoords } from "../element";
3
3
  import { elementOverlapsWithFrame, getTargetFrame, isElementInFrame, } from "../frame";
4
- import { isEmbeddableElement, isIframeLikeElement, } from "../element/typeChecks";
4
+ import { isEmbeddableElement, isIframeLikeElement, isTextElement, } from "../element/typeChecks";
5
5
  import { renderElement } from "../renderer/renderElement";
6
6
  import { createPlaceholderEmbeddableLabel } from "../element/embeddable";
7
7
  import { EXTERNAL_LINK_IMG, getLinkHandleFromCoords, } from "../components/hyperlink/helpers";
8
8
  import { bootstrapCanvas, getNormalizedCanvasDimensions } from "./helpers";
9
9
  import { throttleRAF } from "../utils";
10
+ import { getBoundTextElement } from "../element/textElement";
10
11
  const strokeGrid = (context, gridSize, scrollX, scrollY, zoom, width, height) => {
11
12
  const BOLD_LINE_FREQUENCY = 5;
12
13
  const GridLineColor = {
@@ -120,21 +121,31 @@ const _renderStaticScene = ({ canvas, rc, elementsMap, allElementsMap, visibleEl
120
121
  .forEach((element) => {
121
122
  try {
122
123
  const frameId = element.frameId || appState.frameToHighlight?.id;
124
+ if (isTextElement(element) &&
125
+ element.containerId &&
126
+ elementsMap.has(element.containerId)) {
127
+ // will be rendered with the container
128
+ return;
129
+ }
130
+ context.save();
123
131
  if (frameId &&
124
132
  appState.frameRendering.enabled &&
125
133
  appState.frameRendering.clip) {
126
- context.save();
127
134
  const frame = getTargetFrame(element, elementsMap, appState);
128
135
  // TODO do we need to check isElementInFrame here?
129
136
  if (frame && isElementInFrame(element, elementsMap, appState)) {
130
137
  frameClip(frame, context, renderConfig, appState);
131
138
  }
132
139
  renderElement(element, elementsMap, allElementsMap, rc, context, renderConfig, appState);
133
- context.restore();
134
140
  }
135
141
  else {
136
142
  renderElement(element, elementsMap, allElementsMap, rc, context, renderConfig, appState);
137
143
  }
144
+ const boundTextElement = getBoundTextElement(element, elementsMap);
145
+ if (boundTextElement) {
146
+ renderElement(boundTextElement, elementsMap, allElementsMap, rc, context, renderConfig, appState);
147
+ }
148
+ context.restore();
138
149
  if (!isExporting) {
139
150
  renderLinkIcon(element, context, appState, elementsMap);
140
151
  }
@@ -361,8 +361,18 @@ export const renderSceneToSvg = (elements, elementsMap, rsvg, svgRoot, files, re
361
361
  .filter((el) => !isIframeLikeElement(el))
362
362
  .forEach((element) => {
363
363
  if (!element.isDeleted) {
364
+ if (isTextElement(element) &&
365
+ element.containerId &&
366
+ elementsMap.has(element.containerId)) {
367
+ // will be rendered with the container
368
+ return;
369
+ }
364
370
  try {
365
371
  renderElementToSvg(element, elementsMap, rsvg, svgRoot, files, element.x + renderConfig.offsetX, element.y + renderConfig.offsetY, renderConfig);
372
+ const boundTextElement = getBoundTextElement(element, elementsMap);
373
+ if (boundTextElement) {
374
+ renderElementToSvg(boundTextElement, elementsMap, rsvg, svgRoot, files, boundTextElement.x + renderConfig.offsetX, boundTextElement.y + renderConfig.offsetY, renderConfig);
375
+ }
366
376
  }
367
377
  catch (error) {
368
378
  console.error(error);
@@ -1,4 +1,4 @@
1
- import { ExcalidrawElement, NonDeletedExcalidrawElement, NonDeleted, ExcalidrawFrameLikeElement, ElementsMapOrArray } from "../element/types";
1
+ import { ExcalidrawElement, NonDeletedExcalidrawElement, NonDeleted, ExcalidrawFrameLikeElement, ElementsMapOrArray, OrderedExcalidrawElement, Ordered } from "../element/types";
2
2
  import { LinearElementEditor } from "../element/linearElementEditor";
3
3
  import { AppState } from "../types";
4
4
  type ElementIdKey = InstanceType<typeof LinearElementEditor>["elementId"];
@@ -20,10 +20,10 @@ declare class Scene {
20
20
  private elementsMap;
21
21
  private selectedElementsCache;
22
22
  private versionNonce;
23
- getElementsMapIncludingDeleted(): Map<string, ExcalidrawElement> & import("../utility-types").MakeBrand<"SceneElementsMap">;
24
- getNonDeletedElementsMap(): Map<string, NonDeletedExcalidrawElement> & import("../utility-types").MakeBrand<"NonDeletedSceneElementsMap">;
25
- getElementsIncludingDeleted(): readonly ExcalidrawElement[];
26
- getNonDeletedElements(): readonly NonDeletedExcalidrawElement[];
23
+ getNonDeletedElementsMap(): Map<string, Ordered<NonDeletedExcalidrawElement>> & import("../utility-types").MakeBrand<"NonDeletedSceneElementsMap">;
24
+ getElementsIncludingDeleted(): readonly OrderedExcalidrawElement[];
25
+ getElementsMapIncludingDeleted(): Map<string, Ordered<ExcalidrawElement>> & import("../utility-types").MakeBrand<"SceneElementsMap">;
26
+ getNonDeletedElements(): readonly Ordered<NonDeletedExcalidrawElement>[];
27
27
  getFramesIncludingDeleted(): readonly ExcalidrawFrameLikeElement[];
28
28
  getSelectedElements(opts: {
29
29
  selectedElementIds: AppState["selectedElementIds"];
@@ -59,7 +59,8 @@ declare class Scene {
59
59
  destroy(): void;
60
60
  insertElementAtIndex(element: ExcalidrawElement, index: number): void;
61
61
  insertElementsAtIndex(elements: ExcalidrawElement[], index: number): void;
62
- addNewElement: (element: ExcalidrawElement) => void;
62
+ insertElement: (element: ExcalidrawElement) => void;
63
+ insertElements: (elements: ExcalidrawElement[]) => void;
63
64
  getElementIndex(elementId: string): number;
64
65
  getContainerElement: (element: (ExcalidrawElement & {
65
66
  containerId: ExcalidrawElement["id"] | null;
@@ -2,7 +2,10 @@ import { isNonDeletedElement } from "../element";
2
2
  import { isFrameLikeElement } from "../element/typeChecks";
3
3
  import { getSelectedElements } from "./selection";
4
4
  import { randomInteger } from "../random";
5
+ import { syncInvalidIndices, syncMovedIndices, validateFractionalIndices, } from "../fractionalIndex";
6
+ import { arrayToMap } from "../utils";
5
7
  import { toBrandedType } from "../utils";
8
+ import { ENV } from "../constants";
6
9
  const getNonDeletedElements = (allElements) => {
7
10
  const elementsMap = new Map();
8
11
  const elements = [];
@@ -59,6 +62,7 @@ class Scene {
59
62
  callbacks = new Set();
60
63
  nonDeletedElements = [];
61
64
  nonDeletedElementsMap = toBrandedType(new Map());
65
+ // ideally all elements within the scene should be wrapped around with `Ordered` type, but right now there is no real benefit doing so
62
66
  elements = [];
63
67
  nonDeletedFramesLikes = [];
64
68
  frames = [];
@@ -69,15 +73,15 @@ class Scene {
69
73
  cache: new Map(),
70
74
  };
71
75
  versionNonce;
72
- getElementsMapIncludingDeleted() {
73
- return this.elementsMap;
74
- }
75
76
  getNonDeletedElementsMap() {
76
77
  return this.nonDeletedElementsMap;
77
78
  }
78
79
  getElementsIncludingDeleted() {
79
80
  return this.elements;
80
81
  }
82
+ getElementsMapIncludingDeleted() {
83
+ return this.elementsMap;
84
+ }
81
85
  getNonDeletedElements() {
82
86
  return this.nonDeletedElements;
83
87
  }
@@ -151,12 +155,17 @@ class Scene {
151
155
  return didChange;
152
156
  }
153
157
  replaceAllElements(nextElements) {
154
- this.elements =
155
- // ts doesn't like `Array.isArray` of `instanceof Map`
156
- nextElements instanceof Array
157
- ? nextElements
158
- : Array.from(nextElements.values());
158
+ const _nextElements =
159
+ // ts doesn't like `Array.isArray` of `instanceof Map`
160
+ nextElements instanceof Array
161
+ ? nextElements
162
+ : Array.from(nextElements.values());
159
163
  const nextFrameLikes = [];
164
+ if (import.meta.env.DEV || import.meta.env.MODE === ENV.TEST) {
165
+ // throw on invalid indices in test / dev to potentially detect cases were we forgot to sync moved elements
166
+ validateFractionalIndices(_nextElements.map((x) => x.index));
167
+ }
168
+ this.elements = syncInvalidIndices(_nextElements);
160
169
  this.elementsMap.clear();
161
170
  this.elements.forEach((element) => {
162
171
  if (isFrameLikeElement(element)) {
@@ -191,8 +200,8 @@ class Scene {
191
200
  };
192
201
  }
193
202
  destroy() {
194
- this.nonDeletedElements = [];
195
203
  this.elements = [];
204
+ this.nonDeletedElements = [];
196
205
  this.nonDeletedFramesLikes = [];
197
206
  this.frames = [];
198
207
  this.elementsMap.clear();
@@ -217,6 +226,7 @@ class Scene {
217
226
  element,
218
227
  ...this.elements.slice(index),
219
228
  ];
229
+ syncMovedIndices(nextElements, arrayToMap([element]));
220
230
  this.replaceAllElements(nextElements);
221
231
  }
222
232
  insertElementsAtIndex(elements, index) {
@@ -228,15 +238,20 @@ class Scene {
228
238
  ...elements,
229
239
  ...this.elements.slice(index),
230
240
  ];
241
+ syncMovedIndices(nextElements, arrayToMap(elements));
231
242
  this.replaceAllElements(nextElements);
232
243
  }
233
- addNewElement = (element) => {
234
- if (element.frameId) {
235
- this.insertElementAtIndex(element, this.getElementIndex(element.frameId));
236
- }
237
- else {
238
- this.replaceAllElements([...this.elements, element]);
239
- }
244
+ insertElement = (element) => {
245
+ const index = element.frameId
246
+ ? this.getElementIndex(element.frameId)
247
+ : this.elements.length;
248
+ this.insertElementAtIndex(element, index);
249
+ };
250
+ insertElements = (elements) => {
251
+ const index = elements[0].frameId
252
+ ? this.getElementIndex(elements[0].frameId)
253
+ : this.elements.length;
254
+ this.insertElementsAtIndex(elements, index);
240
255
  };
241
256
  getElementIndex(elementId) {
242
257
  return this.elements.findIndex((element) => element.id === elementId);
@@ -11,6 +11,7 @@ import { getElementsOverlappingFrame, getFrameLikeElements, getFrameLikeTitle, g
11
11
  import { newTextElement } from "../element";
12
12
  import { newElementWith } from "../element/mutateElement";
13
13
  import { isFrameElement, isFrameLikeElement } from "../element/typeChecks";
14
+ import { syncInvalidIndices } from "../fractionalIndex";
14
15
  import { renderStaticScene } from "../renderer/staticScene";
15
16
  const SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;
16
17
  const truncateText = (element, maxWidth) => {
@@ -300,7 +301,7 @@ export const exportToCanvas = async ({ data, config, }) => {
300
301
  canvas,
301
302
  rc: rough.canvas(canvas),
302
303
  elementsMap: toBrandedType(arrayToMap(elementsForRender)),
303
- allElementsMap: toBrandedType(arrayToMap(elements)),
304
+ allElementsMap: toBrandedType(arrayToMap(syncInvalidIndices(elements))),
304
305
  visibleElements: elementsForRender,
305
306
  appState: {
306
307
  ...appState,