@excalidraw/excalidraw 0.18.0-2a82821 → 0.18.0-2b1c2a9

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 (472) hide show
  1. package/CHANGELOG.md +121 -8
  2. package/dist/dev/chunk-72CYJXY3.js +69 -0
  3. package/dist/dev/chunk-72CYJXY3.js.map +7 -0
  4. package/dist/dev/{chunk-T3GRJXT6.js → chunk-KKZSEXXE.js} +397 -125
  5. package/dist/dev/chunk-KKZSEXXE.js.map +7 -0
  6. package/dist/dev/{chunk-KY5OFS4H.js → chunk-ZQ2W3FVU.js} +19 -2
  7. package/dist/dev/chunk-ZQ2W3FVU.js.map +7 -0
  8. package/dist/dev/data/{image-7TCIBRTP.js → image-ORD6XJVB.js} +2 -2
  9. package/dist/dev/index.css +615 -630
  10. package/dist/dev/index.css.map +3 -3
  11. package/dist/dev/index.js +10557 -7110
  12. package/dist/dev/index.js.map +4 -4
  13. package/dist/dev/locales/{ar-SA-AGVJN2FU.js → ar-SA-EW44IW4V.js} +91 -46
  14. package/dist/dev/locales/ar-SA-EW44IW4V.js.map +7 -0
  15. package/dist/dev/locales/{az-AZ-62IXPX5D.js → az-AZ-AI7WAYA2.js} +49 -4
  16. package/dist/dev/locales/az-AZ-AI7WAYA2.js.map +7 -0
  17. package/dist/dev/locales/{bg-BG-UBDZF4KA.js → bg-BG-43ZNGDXF.js} +49 -4
  18. package/dist/dev/locales/bg-BG-43ZNGDXF.js.map +7 -0
  19. package/dist/dev/locales/{bn-BD-4TAUVZOD.js → bn-BD-PU4CN7NP.js} +49 -4
  20. package/dist/dev/locales/bn-BD-PU4CN7NP.js.map +7 -0
  21. package/dist/dev/locales/{bn-IN-PUGL2LDE.js → bn-IN-54CF43JL.js} +49 -4
  22. package/dist/dev/locales/bn-IN-54CF43JL.js.map +7 -0
  23. package/dist/dev/locales/{ca-ES-GEEW5L7T.js → ca-ES-RHJO3QDO.js} +50 -5
  24. package/dist/dev/locales/ca-ES-RHJO3QDO.js.map +7 -0
  25. package/dist/dev/locales/{cs-CZ-LNVE3QM5.js → cs-CZ-ZRSAO3BA.js} +49 -4
  26. package/dist/dev/locales/cs-CZ-ZRSAO3BA.js.map +7 -0
  27. package/dist/dev/locales/{da-DK-CAYJG7FJ.js → da-DK-OAB6DEJX.js} +49 -4
  28. package/dist/dev/locales/da-DK-OAB6DEJX.js.map +7 -0
  29. package/dist/dev/locales/{de-CH-GCXOD4LK.js → de-CH-QF7JLXTF.js} +157 -112
  30. package/dist/dev/locales/de-CH-QF7JLXTF.js.map +7 -0
  31. package/dist/dev/locales/{de-DE-CGDBECYD.js → de-DE-5ZO4KOPT.js} +157 -112
  32. package/dist/dev/locales/de-DE-5ZO4KOPT.js.map +7 -0
  33. package/dist/dev/locales/{el-GR-G5QZC24A.js → el-GR-F74ZSUEO.js} +50 -5
  34. package/dist/dev/locales/el-GR-F74ZSUEO.js.map +7 -0
  35. package/dist/dev/locales/{en-BYFCZL7X.js → en-DSRJ5DKP.js} +4 -2
  36. package/dist/dev/locales/{es-ES-UMEOH76W.js → es-ES-3B3IENPS.js} +144 -99
  37. package/dist/dev/locales/es-ES-3B3IENPS.js.map +7 -0
  38. package/dist/dev/locales/{eu-ES-IWRZXJC5.js → eu-ES-NH447TVU.js} +203 -158
  39. package/dist/dev/locales/eu-ES-NH447TVU.js.map +7 -0
  40. package/dist/dev/locales/{fa-IR-QOYVIIJA.js → fa-IR-GHKV6Q2J.js} +58 -13
  41. package/dist/dev/locales/fa-IR-GHKV6Q2J.js.map +7 -0
  42. package/dist/dev/locales/{fi-FI-BXRW65OA.js → fi-FI-ZXSYWCC4.js} +49 -4
  43. package/dist/dev/locales/fi-FI-ZXSYWCC4.js.map +7 -0
  44. package/dist/dev/locales/{fr-FR-R2QH5VCW.js → fr-FR-RJSOSEYS.js} +88 -43
  45. package/dist/dev/locales/fr-FR-RJSOSEYS.js.map +7 -0
  46. package/dist/dev/locales/{gl-ES-4ES3ZADP.js → gl-ES-NAUVMVFY.js} +49 -4
  47. package/dist/dev/locales/gl-ES-NAUVMVFY.js.map +7 -0
  48. package/dist/dev/locales/{he-IL-TRQRRYPH.js → he-IL-JBKWWR75.js} +145 -100
  49. package/dist/dev/locales/he-IL-JBKWWR75.js.map +7 -0
  50. package/dist/dev/locales/{hi-IN-U46BOJEC.js → hi-IN-SD773MVZ.js} +50 -5
  51. package/dist/dev/locales/hi-IN-SD773MVZ.js.map +7 -0
  52. package/dist/dev/locales/{hu-HU-JDULJ6XL.js → hu-HU-OTA7GOAV.js} +49 -4
  53. package/dist/dev/locales/hu-HU-OTA7GOAV.js.map +7 -0
  54. package/dist/dev/locales/{id-ID-BLIXNCUT.js → id-ID-2JAZWVTQ.js} +138 -93
  55. package/dist/dev/locales/id-ID-2JAZWVTQ.js.map +7 -0
  56. package/dist/dev/locales/{it-IT-6TBW7RUK.js → it-IT-GHWUAT77.js} +54 -9
  57. package/dist/dev/locales/it-IT-GHWUAT77.js.map +7 -0
  58. package/dist/dev/locales/{ja-JP-6HYAQFYX.js → ja-JP-YMGRGBPS.js} +189 -144
  59. package/dist/dev/locales/ja-JP-YMGRGBPS.js.map +7 -0
  60. package/dist/dev/locales/{kaa-Z5UP62XJ.js → kaa-RRE7XUCW.js} +49 -4
  61. package/dist/dev/locales/kaa-RRE7XUCW.js.map +7 -0
  62. package/dist/dev/locales/{kab-KAB-Z7STWQKS.js → kab-KAB-ZCYVOJU4.js} +49 -4
  63. package/dist/dev/locales/kab-KAB-ZCYVOJU4.js.map +7 -0
  64. package/dist/dev/locales/{kk-KZ-BWHY45DX.js → kk-KZ-TO6XEFJC.js} +49 -4
  65. package/dist/dev/locales/kk-KZ-TO6XEFJC.js.map +7 -0
  66. package/dist/dev/locales/{km-KH-HGLNWNRU.js → km-KH-3HTDL5HB.js} +49 -4
  67. package/dist/dev/locales/km-KH-3HTDL5HB.js.map +7 -0
  68. package/dist/dev/locales/{ko-KR-CO36WKPC.js → ko-KR-O4L4O7L6.js} +133 -88
  69. package/dist/dev/locales/ko-KR-O4L4O7L6.js.map +7 -0
  70. package/dist/dev/locales/{ku-TR-AACVIARC.js → ku-TR-AFJWDY67.js} +49 -4
  71. package/dist/dev/locales/ku-TR-AFJWDY67.js.map +7 -0
  72. package/dist/dev/locales/{lt-LT-CFYYFLDV.js → lt-LT-7QOT2VDQ.js} +49 -4
  73. package/dist/dev/locales/lt-LT-7QOT2VDQ.js.map +7 -0
  74. package/dist/dev/locales/{lv-LV-QCBBOFFU.js → lv-LV-WV6C4NYF.js} +49 -4
  75. package/dist/dev/locales/lv-LV-WV6C4NYF.js.map +7 -0
  76. package/dist/dev/locales/{mr-IN-B2CM5GK5.js → mr-IN-3TLYWOEI.js} +52 -7
  77. package/dist/dev/locales/mr-IN-3TLYWOEI.js.map +7 -0
  78. package/dist/dev/locales/{my-MM-756BNN36.js → my-MM-NNL2QJT3.js} +49 -4
  79. package/dist/dev/locales/my-MM-NNL2QJT3.js.map +7 -0
  80. package/dist/dev/locales/{nb-NO-5BLHQI4J.js → nb-NO-PG3XLMEV.js} +50 -5
  81. package/dist/dev/locales/nb-NO-PG3XLMEV.js.map +7 -0
  82. package/dist/dev/locales/{nl-NL-225BLGAH.js → nl-NL-MMOYEKKQ.js} +59 -14
  83. package/dist/dev/locales/nl-NL-MMOYEKKQ.js.map +7 -0
  84. package/dist/dev/locales/{nn-NO-4J7MR6GH.js → nn-NO-AAC2I2YX.js} +49 -4
  85. package/dist/dev/locales/nn-NO-AAC2I2YX.js.map +7 -0
  86. package/dist/dev/locales/{oc-FR-XCETH7KF.js → oc-FR-SR6MFB4N.js} +50 -5
  87. package/dist/dev/locales/oc-FR-SR6MFB4N.js.map +7 -0
  88. package/dist/dev/locales/{pa-IN-32NBAN5L.js → pa-IN-ADGMQLQI.js} +49 -4
  89. package/dist/dev/locales/pa-IN-ADGMQLQI.js.map +7 -0
  90. package/dist/dev/locales/{percentages-ZRLRVMSI.js → percentages-DKKGPYTW.js} +2 -2
  91. package/dist/dev/locales/{pl-PL-R6OJ54BT.js → pl-PL-FNIPTMVP.js} +50 -5
  92. package/dist/dev/locales/pl-PL-FNIPTMVP.js.map +7 -0
  93. package/dist/dev/locales/{pt-BR-7AFGAKGR.js → pt-BR-67FMCDNE.js} +136 -91
  94. package/dist/dev/locales/pt-BR-67FMCDNE.js.map +7 -0
  95. package/dist/dev/locales/{pt-PT-S6BMW6MY.js → pt-PT-4G3GI4SF.js} +135 -90
  96. package/dist/dev/locales/pt-PT-4G3GI4SF.js.map +7 -0
  97. package/dist/dev/locales/{ro-RO-4JVGQHS2.js → ro-RO-CUZFN555.js} +54 -9
  98. package/dist/dev/locales/ro-RO-CUZFN555.js.map +7 -0
  99. package/dist/dev/locales/{ru-RU-IESI752T.js → ru-RU-4GHINTII.js} +56 -11
  100. package/dist/dev/locales/ru-RU-4GHINTII.js.map +7 -0
  101. package/dist/dev/locales/{si-LK-H75E7PKD.js → si-LK-SSNT7T4A.js} +50 -5
  102. package/dist/dev/locales/si-LK-SSNT7T4A.js.map +7 -0
  103. package/dist/dev/locales/{sk-SK-EUK2NR2F.js → sk-SK-J7TKZQEH.js} +87 -42
  104. package/dist/dev/locales/sk-SK-J7TKZQEH.js.map +7 -0
  105. package/dist/dev/locales/{sl-SI-AKW7R5PW.js → sl-SI-SIBF67NE.js} +50 -5
  106. package/dist/dev/locales/sl-SI-SIBF67NE.js.map +7 -0
  107. package/dist/dev/locales/{sv-SE-QIBOOXLJ.js → sv-SE-YTR46NVM.js} +131 -86
  108. package/dist/dev/locales/sv-SE-YTR46NVM.js.map +7 -0
  109. package/dist/dev/locales/{ta-IN-LBK2NQ5K.js → ta-IN-7AW6CTGA.js} +49 -4
  110. package/dist/dev/locales/ta-IN-7AW6CTGA.js.map +7 -0
  111. package/dist/dev/locales/{th-TH-YJ2E6GVT.js → th-TH-DTLYJYKV.js} +94 -49
  112. package/dist/dev/locales/th-TH-DTLYJYKV.js.map +7 -0
  113. package/dist/dev/locales/{tr-TR-Y5GO2XJW.js → tr-TR-UDQGNXAG.js} +126 -81
  114. package/dist/dev/locales/tr-TR-UDQGNXAG.js.map +7 -0
  115. package/dist/dev/locales/{uk-UA-XYAFHHJW.js → uk-UA-25HL2NCU.js} +109 -64
  116. package/dist/dev/locales/uk-UA-25HL2NCU.js.map +7 -0
  117. package/dist/dev/locales/{uz-UZ-LF3CBRYE.js → uz-UZ-OPSBAY4H.js} +49 -4
  118. package/dist/dev/locales/uz-UZ-OPSBAY4H.js.map +7 -0
  119. package/dist/dev/locales/{vi-VN-WDPZEUOJ.js → vi-VN-DK367UGA.js} +49 -4
  120. package/dist/dev/locales/vi-VN-DK367UGA.js.map +7 -0
  121. package/dist/dev/locales/{zh-CN-SZ37453H.js → zh-CN-QCVKNWUH.js} +88 -43
  122. package/dist/dev/locales/zh-CN-QCVKNWUH.js.map +7 -0
  123. package/dist/dev/locales/{zh-HK-QDQ5QNBC.js → zh-HK-WFGYHWPG.js} +49 -4
  124. package/dist/dev/locales/zh-HK-WFGYHWPG.js.map +7 -0
  125. package/dist/dev/locales/{zh-TW-CYU6GFBV.js → zh-TW-WHQS4ZSD.js} +134 -89
  126. package/dist/dev/locales/zh-TW-WHQS4ZSD.js.map +7 -0
  127. package/dist/prod/chunk-5XKZK2GL.js +1 -0
  128. package/dist/prod/chunk-COKSSPJQ.js +4 -0
  129. package/dist/prod/chunk-ZPMXAHWN.js +12 -0
  130. package/dist/prod/data/{image-2UP6PNYP.js → image-52MW35OO.js} +1 -1
  131. package/dist/prod/index.css +1 -1
  132. package/dist/prod/index.js +68 -99
  133. package/dist/prod/locales/ar-SA-5WIASEJP.js +10 -0
  134. package/dist/prod/locales/az-AZ-V5EUQD6C.js +1 -0
  135. package/dist/prod/locales/bg-BG-EXASCMTR.js +5 -0
  136. package/dist/prod/locales/bn-BD-U4SYNFCO.js +3 -0
  137. package/dist/prod/locales/bn-IN-HKDJIITE.js +3 -0
  138. package/dist/prod/locales/ca-ES-2KGUU5XB.js +8 -0
  139. package/dist/prod/locales/cs-CZ-VUCGPRML.js +7 -0
  140. package/dist/prod/locales/da-DK-NNDP2IVP.js +2 -0
  141. package/dist/prod/locales/de-CH-I7RAVIZN.js +11 -0
  142. package/dist/prod/locales/de-DE-WBQ3DQLR.js +11 -0
  143. package/dist/prod/locales/el-GR-TYQHVGXW.js +7 -0
  144. package/dist/prod/locales/en-2RFA324Y.js +1 -0
  145. package/dist/prod/locales/es-ES-JEUOREKJ.js +12 -0
  146. package/dist/prod/locales/eu-ES-SO5DEEAN.js +8 -0
  147. package/dist/prod/locales/fa-IR-FIYUE2GQ.js +9 -0
  148. package/dist/prod/locales/fi-FI-REAEF6HQ.js +6 -0
  149. package/dist/prod/locales/fr-FR-SUCL7J6B.js +12 -0
  150. package/dist/prod/locales/gl-ES-KHCSOGVH.js +6 -0
  151. package/dist/prod/locales/he-IL-JYXVXV2Q.js +9 -0
  152. package/dist/prod/locales/hi-IN-BU52H3BO.js +3 -0
  153. package/dist/prod/locales/hu-HU-OWADXDQ3.js +3 -0
  154. package/dist/prod/locales/id-ID-EOMR5R3I.js +8 -0
  155. package/dist/prod/locales/it-IT-FC2VTM3L.js +12 -0
  156. package/dist/prod/locales/ja-JP-JBNTKYP4.js +12 -0
  157. package/dist/prod/locales/kaa-TC3VIB7V.js +1 -0
  158. package/dist/prod/locales/kab-KAB-UOUDSQKM.js +4 -0
  159. package/dist/prod/locales/kk-KZ-P5H2X7YS.js +1 -0
  160. package/dist/prod/locales/km-KH-IHMV2US7.js +7 -0
  161. package/dist/prod/locales/ko-KR-ZTMANIDF.js +5 -0
  162. package/dist/prod/locales/ku-TR-GPJTRB5G.js +6 -0
  163. package/dist/prod/locales/lt-LT-V3XDOK3P.js +3 -0
  164. package/dist/prod/locales/lv-LV-DVQ3FADO.js +4 -0
  165. package/dist/prod/locales/mr-IN-VZ6HH5FE.js +9 -0
  166. package/dist/prod/locales/my-MM-XYKWHRK6.js +1 -0
  167. package/dist/prod/locales/nb-NO-UNO2GGZJ.js +8 -0
  168. package/dist/prod/locales/nl-NL-76EFHT4P.js +13 -0
  169. package/dist/prod/locales/nn-NO-CFKD7ABE.js +4 -0
  170. package/dist/prod/locales/oc-FR-YBJTCJ3J.js +4 -0
  171. package/dist/prod/locales/pa-IN-SNOXSMRV.js +4 -0
  172. package/dist/prod/locales/percentages-Q7USCRWZ.js +1 -0
  173. package/dist/prod/locales/pl-PL-BSY6YFZ3.js +12 -0
  174. package/dist/prod/locales/pt-BR-CZDV62R3.js +10 -0
  175. package/dist/prod/locales/pt-PT-JO57XJJW.js +12 -0
  176. package/dist/prod/locales/ro-RO-UZ5ICYYN.js +12 -0
  177. package/dist/prod/locales/ru-RU-AN7JPREC.js +10 -0
  178. package/dist/prod/locales/si-LK-7CBLD6QQ.js +1 -0
  179. package/dist/prod/locales/sk-SK-SWR6DKBI.js +7 -0
  180. package/dist/prod/locales/sl-SI-JRML4FIH.js +6 -0
  181. package/dist/prod/locales/sv-SE-4ZPKFFXF.js +12 -0
  182. package/dist/prod/locales/ta-IN-V6NHHU6Z.js +6 -0
  183. package/dist/prod/locales/th-TH-P7CTMGDK.js +1 -0
  184. package/dist/prod/locales/tr-TR-GUFYG22B.js +4 -0
  185. package/dist/prod/locales/uk-UA-K6SV5NFQ.js +6 -0
  186. package/dist/prod/locales/uz-UZ-TVKTZO2G.js +1 -0
  187. package/dist/prod/locales/vi-VN-7FKFXJNO.js +7 -0
  188. package/dist/prod/locales/zh-CN-AOKVLNNK.js +11 -0
  189. package/dist/prod/locales/zh-HK-CDKPF5DC.js +1 -0
  190. package/dist/prod/locales/zh-TW-ZVGYESGW.js +13 -0
  191. package/dist/types/common/src/colors.d.ts +19 -0
  192. package/dist/types/common/src/constants.d.ts +3 -0
  193. package/dist/types/common/src/keys.d.ts +2 -0
  194. package/dist/types/common/src/points.d.ts +1 -1
  195. package/dist/types/common/src/utils.d.ts +1 -43
  196. package/dist/types/element/src/Scene.d.ts +1 -1
  197. package/dist/types/element/src/align.d.ts +2 -2
  198. package/dist/types/element/src/arrowEndpointText.d.ts +49 -0
  199. package/dist/types/element/src/arrows/focus.d.ts +5 -2
  200. package/dist/types/element/src/binding.d.ts +17 -8
  201. package/dist/types/element/src/bounds.d.ts +5 -9
  202. package/dist/types/element/src/bucketFill.d.ts +110 -0
  203. package/dist/types/element/src/collision.d.ts +1 -1
  204. package/dist/types/element/src/comparisons.d.ts +4 -4
  205. package/dist/types/element/src/convertToShape.d.ts +23 -0
  206. package/dist/types/element/src/distribute.d.ts +2 -2
  207. package/dist/types/element/src/dragElements.d.ts +27 -0
  208. package/dist/types/element/src/duplicate.d.ts +3 -3
  209. package/dist/types/element/src/embeddable.d.ts +2 -2
  210. package/dist/types/element/src/flowchart.d.ts +7 -7
  211. package/dist/types/element/src/fractionalIndex.d.ts +2 -2
  212. package/dist/types/element/src/frame.d.ts +4 -4
  213. package/dist/types/element/src/groups.d.ts +9 -9
  214. package/dist/types/element/src/index.d.ts +4 -1
  215. package/dist/types/element/src/linearElementEditor.d.ts +27 -10
  216. package/dist/types/element/src/newElement.d.ts +14 -0
  217. package/dist/types/element/src/renderElement.d.ts +0 -3
  218. package/dist/types/element/src/resizeElements.d.ts +2 -2
  219. package/dist/types/element/src/selection.d.ts +5 -5
  220. package/dist/types/element/src/shape.d.ts +12 -0
  221. package/dist/types/element/src/sortElements.d.ts +10 -0
  222. package/dist/types/element/src/textElement.d.ts +13 -9
  223. package/dist/types/element/src/transform.d.ts +2 -2
  224. package/dist/types/element/src/typeChecks.d.ts +25 -25
  225. package/dist/types/element/src/types.d.ts +9 -1
  226. package/dist/types/element/src/utils.d.ts +7 -3
  227. package/dist/types/element/src/zindex.d.ts +2 -2
  228. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +36 -12
  229. package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
  230. package/dist/types/excalidraw/actions/actionBoundText.d.ts +24 -8
  231. package/dist/types/excalidraw/actions/actionCanvas.d.ts +146 -931
  232. package/dist/types/excalidraw/actions/actionClipboard.d.ts +24 -8
  233. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +12 -4
  234. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +38 -13
  235. package/dist/types/excalidraw/actions/actionDeselect.d.ts +9 -4
  236. package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -3
  237. package/dist/types/excalidraw/actions/actionElementLink.d.ts +12 -4
  238. package/dist/types/excalidraw/actions/actionElementLock.d.ts +25 -9
  239. package/dist/types/excalidraw/actions/actionExport.d.ts +26 -10
  240. package/dist/types/excalidraw/actions/actionFinalize.d.ts +1 -0
  241. package/dist/types/excalidraw/actions/actionFrame.d.ts +48 -197
  242. package/dist/types/excalidraw/actions/actionGroup.d.ts +39 -23
  243. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +16 -6
  244. package/dist/types/excalidraw/actions/actionLink.d.ts +13 -5
  245. package/dist/types/excalidraw/actions/actionMenu.d.ts +12 -4
  246. package/dist/types/excalidraw/actions/actionProperties.d.ts +43 -24
  247. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +17 -9
  248. package/dist/types/excalidraw/actions/actionStyles.d.ts +12 -4
  249. package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +1 -1
  250. package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +13 -5
  251. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +16 -9
  252. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +13 -5
  253. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +13 -5
  254. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +16 -9
  255. package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +1 -1
  256. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +13 -5
  257. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +14 -6
  258. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +13 -5
  259. package/dist/types/excalidraw/actions/index.d.ts +1 -2
  260. package/dist/types/excalidraw/actions/manager.d.ts +1 -0
  261. package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
  262. package/dist/types/excalidraw/actions/types.d.ts +8 -4
  263. package/dist/types/excalidraw/appState.d.ts +9 -4
  264. package/dist/types/excalidraw/components/Actions.d.ts +17 -12
  265. package/dist/types/excalidraw/components/App.arrowText.d.ts +104 -0
  266. package/dist/types/excalidraw/components/App.bucketFill.d.ts +48 -0
  267. package/dist/types/excalidraw/components/App.cursor.d.ts +38 -0
  268. package/dist/types/excalidraw/components/App.d.ts +372 -67
  269. package/dist/types/excalidraw/components/App.drawshape.d.ts +55 -0
  270. package/dist/types/excalidraw/components/App.flowchart.d.ts +21 -0
  271. package/dist/types/excalidraw/components/App.viewport.d.ts +73 -0
  272. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +9 -3
  273. package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
  274. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +3 -1
  275. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +9 -2
  276. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +4 -2
  277. package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +8 -1
  278. package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -1
  279. package/dist/types/excalidraw/components/ColorPicker/topPicksDnD.d.ts +31 -0
  280. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +1 -1
  281. package/dist/types/excalidraw/components/CursorHint.d.ts +46 -0
  282. package/dist/types/excalidraw/components/{ToolButton.d.ts → IconButton.d.ts} +16 -19
  283. package/dist/types/excalidraw/components/Island.d.ts +7 -0
  284. package/dist/types/excalidraw/components/LaserPointerButton.d.ts +2 -4
  285. package/dist/types/excalidraw/components/LayerUI.d.ts +5 -2
  286. package/dist/types/excalidraw/components/LockButton.d.ts +3 -4
  287. package/dist/types/excalidraw/components/MagicButton.d.ts +0 -2
  288. package/dist/types/excalidraw/components/MobileMenu.d.ts +4 -4
  289. package/dist/types/excalidraw/components/MobileToolbar.d.ts +9 -0
  290. package/dist/types/excalidraw/components/PenModeButton.d.ts +2 -5
  291. package/dist/types/excalidraw/components/Popover.d.ts +1 -3
  292. package/dist/types/excalidraw/components/{ButtonIcon.d.ts → RadioButton.d.ts} +2 -5
  293. package/dist/types/excalidraw/components/Stats/Angle.d.ts +2 -2
  294. package/dist/types/excalidraw/components/Stats/Dimension.d.ts +2 -2
  295. package/dist/types/excalidraw/components/Stats/DragInput.d.ts +2 -2
  296. package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +2 -2
  297. package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +2 -2
  298. package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +2 -2
  299. package/dist/types/excalidraw/components/Stats/Position.d.ts +3 -3
  300. package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
  301. package/dist/types/excalidraw/components/TTDDialog/utils/TTDStreamFetch.d.ts +1 -0
  302. package/dist/types/excalidraw/components/ToolPopover.d.ts +3 -6
  303. package/dist/types/excalidraw/components/Toolbar.d.ts +11 -0
  304. package/dist/types/excalidraw/components/Tools.d.ts +146 -0
  305. package/dist/types/excalidraw/components/UserList.d.ts +3 -2
  306. package/dist/types/excalidraw/components/ViewportStatusFrame/ViewportStatusFrame.d.ts +11 -0
  307. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +2 -0
  308. package/dist/types/excalidraw/components/footer/Footer.d.ts +3 -1
  309. package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +2 -2
  310. package/dist/types/excalidraw/components/icons.d.ts +4 -1
  311. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +1 -1
  312. package/dist/types/excalidraw/components/positionElementBesideCursor.d.ts +26 -0
  313. package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +39 -0
  314. package/dist/types/excalidraw/data/blob.d.ts +28 -12
  315. package/dist/types/excalidraw/data/index.d.ts +4 -4
  316. package/dist/types/excalidraw/data/json.d.ts +20 -12
  317. package/dist/types/excalidraw/drawShapeTrail.d.ts +16 -0
  318. package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
  319. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +5 -5
  320. package/dist/types/excalidraw/index.d.ts +4 -2
  321. package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
  322. package/dist/types/excalidraw/renderer/animation.d.ts +1 -0
  323. package/dist/types/excalidraw/renderer/helpers.d.ts +7 -0
  324. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +1 -3
  325. package/dist/types/excalidraw/scene/Renderer.d.ts +12 -11
  326. package/dist/types/excalidraw/scene/export.d.ts +3 -3
  327. package/dist/types/excalidraw/scene/index.d.ts +1 -1
  328. package/dist/types/excalidraw/scene/types.d.ts +4 -3
  329. package/dist/types/excalidraw/snapping.d.ts +7 -7
  330. package/dist/types/excalidraw/types.d.ts +410 -20
  331. package/dist/types/excalidraw/viewport.d.ts +275 -0
  332. package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +2 -3
  333. package/dist/types/laser-pointer/src/state.d.ts +1 -0
  334. package/dist/types/math/src/curve.d.ts +19 -12
  335. package/dist/types/math/src/index.d.ts +1 -0
  336. package/dist/types/math/src/pca.d.ts +79 -0
  337. package/dist/types/math/src/polygon.d.ts +25 -1
  338. package/dist/types/math/src/segment.d.ts +6 -0
  339. package/dist/types/utils/src/export.d.ts +3 -3
  340. package/package.json +4 -4
  341. package/dist/dev/chunk-KY5OFS4H.js.map +0 -7
  342. package/dist/dev/chunk-T3GRJXT6.js.map +0 -7
  343. package/dist/dev/chunk-URPEKBQ3.js +0 -69
  344. package/dist/dev/chunk-URPEKBQ3.js.map +0 -7
  345. package/dist/dev/locales/ar-SA-AGVJN2FU.js.map +0 -7
  346. package/dist/dev/locales/az-AZ-62IXPX5D.js.map +0 -7
  347. package/dist/dev/locales/bg-BG-UBDZF4KA.js.map +0 -7
  348. package/dist/dev/locales/bn-BD-4TAUVZOD.js.map +0 -7
  349. package/dist/dev/locales/bn-IN-PUGL2LDE.js.map +0 -7
  350. package/dist/dev/locales/ca-ES-GEEW5L7T.js.map +0 -7
  351. package/dist/dev/locales/cs-CZ-LNVE3QM5.js.map +0 -7
  352. package/dist/dev/locales/da-DK-CAYJG7FJ.js.map +0 -7
  353. package/dist/dev/locales/de-CH-GCXOD4LK.js.map +0 -7
  354. package/dist/dev/locales/de-DE-CGDBECYD.js.map +0 -7
  355. package/dist/dev/locales/el-GR-G5QZC24A.js.map +0 -7
  356. package/dist/dev/locales/es-ES-UMEOH76W.js.map +0 -7
  357. package/dist/dev/locales/eu-ES-IWRZXJC5.js.map +0 -7
  358. package/dist/dev/locales/fa-IR-QOYVIIJA.js.map +0 -7
  359. package/dist/dev/locales/fi-FI-BXRW65OA.js.map +0 -7
  360. package/dist/dev/locales/fr-FR-R2QH5VCW.js.map +0 -7
  361. package/dist/dev/locales/gl-ES-4ES3ZADP.js.map +0 -7
  362. package/dist/dev/locales/he-IL-TRQRRYPH.js.map +0 -7
  363. package/dist/dev/locales/hi-IN-U46BOJEC.js.map +0 -7
  364. package/dist/dev/locales/hu-HU-JDULJ6XL.js.map +0 -7
  365. package/dist/dev/locales/id-ID-BLIXNCUT.js.map +0 -7
  366. package/dist/dev/locales/it-IT-6TBW7RUK.js.map +0 -7
  367. package/dist/dev/locales/ja-JP-6HYAQFYX.js.map +0 -7
  368. package/dist/dev/locales/kaa-Z5UP62XJ.js.map +0 -7
  369. package/dist/dev/locales/kab-KAB-Z7STWQKS.js.map +0 -7
  370. package/dist/dev/locales/kk-KZ-BWHY45DX.js.map +0 -7
  371. package/dist/dev/locales/km-KH-HGLNWNRU.js.map +0 -7
  372. package/dist/dev/locales/ko-KR-CO36WKPC.js.map +0 -7
  373. package/dist/dev/locales/ku-TR-AACVIARC.js.map +0 -7
  374. package/dist/dev/locales/lt-LT-CFYYFLDV.js.map +0 -7
  375. package/dist/dev/locales/lv-LV-QCBBOFFU.js.map +0 -7
  376. package/dist/dev/locales/mr-IN-B2CM5GK5.js.map +0 -7
  377. package/dist/dev/locales/my-MM-756BNN36.js.map +0 -7
  378. package/dist/dev/locales/nb-NO-5BLHQI4J.js.map +0 -7
  379. package/dist/dev/locales/nl-NL-225BLGAH.js.map +0 -7
  380. package/dist/dev/locales/nn-NO-4J7MR6GH.js.map +0 -7
  381. package/dist/dev/locales/oc-FR-XCETH7KF.js.map +0 -7
  382. package/dist/dev/locales/pa-IN-32NBAN5L.js.map +0 -7
  383. package/dist/dev/locales/pl-PL-R6OJ54BT.js.map +0 -7
  384. package/dist/dev/locales/pt-BR-7AFGAKGR.js.map +0 -7
  385. package/dist/dev/locales/pt-PT-S6BMW6MY.js.map +0 -7
  386. package/dist/dev/locales/ro-RO-4JVGQHS2.js.map +0 -7
  387. package/dist/dev/locales/ru-RU-IESI752T.js.map +0 -7
  388. package/dist/dev/locales/si-LK-H75E7PKD.js.map +0 -7
  389. package/dist/dev/locales/sk-SK-EUK2NR2F.js.map +0 -7
  390. package/dist/dev/locales/sl-SI-AKW7R5PW.js.map +0 -7
  391. package/dist/dev/locales/sv-SE-QIBOOXLJ.js.map +0 -7
  392. package/dist/dev/locales/ta-IN-LBK2NQ5K.js.map +0 -7
  393. package/dist/dev/locales/th-TH-YJ2E6GVT.js.map +0 -7
  394. package/dist/dev/locales/tr-TR-Y5GO2XJW.js.map +0 -7
  395. package/dist/dev/locales/uk-UA-XYAFHHJW.js.map +0 -7
  396. package/dist/dev/locales/uz-UZ-LF3CBRYE.js.map +0 -7
  397. package/dist/dev/locales/vi-VN-WDPZEUOJ.js.map +0 -7
  398. package/dist/dev/locales/zh-CN-SZ37453H.js.map +0 -7
  399. package/dist/dev/locales/zh-HK-QDQ5QNBC.js.map +0 -7
  400. package/dist/dev/locales/zh-TW-CYU6GFBV.js.map +0 -7
  401. package/dist/prod/chunk-2HD5NY2D.js +0 -4
  402. package/dist/prod/chunk-3PELD44J.js +0 -1
  403. package/dist/prod/chunk-RLJP2BVF.js +0 -12
  404. package/dist/prod/locales/ar-SA-NXDWD63E.js +0 -8
  405. package/dist/prod/locales/az-AZ-MXSORGZV.js +0 -1
  406. package/dist/prod/locales/bg-BG-O6MV2KSF.js +0 -5
  407. package/dist/prod/locales/bn-BD-T2VJNT7N.js +0 -3
  408. package/dist/prod/locales/bn-IN-MMW2ORAC.js +0 -3
  409. package/dist/prod/locales/ca-ES-MKBCGNOG.js +0 -8
  410. package/dist/prod/locales/cs-CZ-V77HGUP7.js +0 -7
  411. package/dist/prod/locales/da-DK-I5RFNTM4.js +0 -2
  412. package/dist/prod/locales/de-CH-WLRDEVBV.js +0 -7
  413. package/dist/prod/locales/de-DE-DTI4WUSC.js +0 -7
  414. package/dist/prod/locales/el-GR-ZXDJ2OS4.js +0 -7
  415. package/dist/prod/locales/en-W2XZHOH3.js +0 -1
  416. package/dist/prod/locales/es-ES-DYQHAD43.js +0 -7
  417. package/dist/prod/locales/eu-ES-QDSYU5Y3.js +0 -7
  418. package/dist/prod/locales/fa-IR-26LZG4PM.js +0 -9
  419. package/dist/prod/locales/fi-FI-6YS4KDE4.js +0 -6
  420. package/dist/prod/locales/fr-FR-BRLLPTZC.js +0 -12
  421. package/dist/prod/locales/gl-ES-OKUZTLYG.js +0 -6
  422. package/dist/prod/locales/he-IL-26MGYIU7.js +0 -8
  423. package/dist/prod/locales/hi-IN-Q4ZOGTP2.js +0 -3
  424. package/dist/prod/locales/hu-HU-P2OXPSN5.js +0 -3
  425. package/dist/prod/locales/id-ID-2EIKXYN6.js +0 -8
  426. package/dist/prod/locales/it-IT-4CFKVXI2.js +0 -12
  427. package/dist/prod/locales/ja-JP-MAND2Z4V.js +0 -7
  428. package/dist/prod/locales/kaa-HQRTCXTJ.js +0 -1
  429. package/dist/prod/locales/kab-KAB-JKIKKTGH.js +0 -4
  430. package/dist/prod/locales/kk-KZ-HXQ63ZFC.js +0 -1
  431. package/dist/prod/locales/km-KH-PKL3LSGX.js +0 -7
  432. package/dist/prod/locales/ko-KR-KXLREZX3.js +0 -5
  433. package/dist/prod/locales/ku-TR-MJ4IER3X.js +0 -6
  434. package/dist/prod/locales/lt-LT-H6WFQ6FJ.js +0 -3
  435. package/dist/prod/locales/lv-LV-GOCK6SJW.js +0 -4
  436. package/dist/prod/locales/mr-IN-IXVLDMEQ.js +0 -9
  437. package/dist/prod/locales/my-MM-YG6MYTTD.js +0 -1
  438. package/dist/prod/locales/nb-NO-XGWJISD2.js +0 -8
  439. package/dist/prod/locales/nl-NL-XVDVCPNC.js +0 -13
  440. package/dist/prod/locales/nn-NO-EMX5MJX5.js +0 -4
  441. package/dist/prod/locales/oc-FR-ROEINTVO.js +0 -4
  442. package/dist/prod/locales/pa-IN-ZYN6SUDY.js +0 -4
  443. package/dist/prod/locales/percentages-5DKR754L.js +0 -1
  444. package/dist/prod/locales/pl-PL-6VTG7PHC.js +0 -12
  445. package/dist/prod/locales/pt-BR-5YFKRR5G.js +0 -6
  446. package/dist/prod/locales/pt-PT-GEIXXZ67.js +0 -8
  447. package/dist/prod/locales/ro-RO-E2P6TFZI.js +0 -12
  448. package/dist/prod/locales/ru-RU-YBIIY43T.js +0 -10
  449. package/dist/prod/locales/si-LK-673C2CI2.js +0 -1
  450. package/dist/prod/locales/sk-SK-CKZHQ4AP.js +0 -7
  451. package/dist/prod/locales/sl-SI-557H2GWM.js +0 -6
  452. package/dist/prod/locales/sv-SE-XOPKKDWS.js +0 -8
  453. package/dist/prod/locales/ta-IN-XBH7DQI3.js +0 -6
  454. package/dist/prod/locales/th-TH-TOCWH3R4.js +0 -1
  455. package/dist/prod/locales/tr-TR-GXW6CYY5.js +0 -4
  456. package/dist/prod/locales/uk-UA-IJKTNUDG.js +0 -6
  457. package/dist/prod/locales/uz-UZ-TBZZEA4V.js +0 -1
  458. package/dist/prod/locales/vi-VN-MULSGNVB.js +0 -7
  459. package/dist/prod/locales/zh-CN-MVX3E32U.js +0 -11
  460. package/dist/prod/locales/zh-HK-JNU5RLIE.js +0 -1
  461. package/dist/prod/locales/zh-TW-LENVCA6T.js +0 -9
  462. package/dist/types/excalidraw/actions/actionEmbeddable.d.ts +0 -172
  463. package/dist/types/excalidraw/components/FollowMode/FollowMode.d.ts +0 -10
  464. package/dist/types/excalidraw/components/HandButton.d.ts +0 -10
  465. package/dist/types/excalidraw/components/MobileToolBar.d.ts +0 -10
  466. package/dist/types/excalidraw/components/shapes.d.ts +0 -270
  467. package/dist/types/excalidraw/cursor.d.ts +0 -5
  468. package/dist/types/excalidraw/scene/scroll.d.ts +0 -18
  469. package/dist/types/excalidraw/scene/zoom.d.ts +0 -12
  470. /package/dist/dev/data/{image-7TCIBRTP.js.map → image-ORD6XJVB.js.map} +0 -0
  471. /package/dist/dev/locales/{en-BYFCZL7X.js.map → en-DSRJ5DKP.js.map} +0 -0
  472. /package/dist/dev/locales/{percentages-ZRLRVMSI.js.map → percentages-DKKGPYTW.js.map} +0 -0
@@ -105,6 +105,7 @@ var getDefaultAppState = () => {
105
105
  scrolledOutside: false,
106
106
  scrollX: 0,
107
107
  scrollY: 0,
108
+ scrollConstraints: null,
108
109
  selectedElementIds: {},
109
110
  hoveredElementIds: {},
110
111
  selectedGroupIds: {},
@@ -116,6 +117,7 @@ var getDefaultAppState = () => {
116
117
  panels: STATS_PANELS.generalStats | STATS_PANELS.elementProperties
117
118
  },
118
119
  suggestedBinding: null,
120
+ hoveredArrowTextAnchor: null,
119
121
  frameRendering: { enabled: true, clip: true, name: true, outline: true },
120
122
  frameToHighlight: null,
121
123
  editingFrame: null,
@@ -135,15 +137,18 @@ var getDefaultAppState = () => {
135
137
  y: 0
136
138
  },
137
139
  objectsSnapModeEnabled: false,
138
- userToFollow: null,
139
- followedBy: /* @__PURE__ */ new Set(),
140
140
  isCropping: false,
141
141
  croppingElementId: null,
142
142
  searchMatches: null,
143
143
  lockedMultiSelections: {},
144
144
  activeLockedId: null,
145
145
  bindMode: "orbit",
146
- boxSelectionMode: "contain"
146
+ boxSelectionMode: "contain",
147
+ colorTopPicks: {
148
+ elementStroke: null,
149
+ elementBackground: null,
150
+ bucketFill: null
151
+ }
147
152
  };
148
153
  };
149
154
  var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
@@ -224,6 +229,7 @@ var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
224
229
  scrolledOutside: { browser: true, export: false, server: false },
225
230
  scrollX: { browser: true, export: false, server: false },
226
231
  scrollY: { browser: true, export: false, server: false },
232
+ scrollConstraints: { browser: false, export: false, server: false },
227
233
  selectedElementIds: { browser: true, export: false, server: false },
228
234
  hoveredElementIds: { browser: false, export: false, server: false },
229
235
  selectedGroupIds: { browser: true, export: false, server: false },
@@ -236,6 +242,7 @@ var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
236
242
  shouldCacheIgnoreZoom: { browser: true, export: false, server: false },
237
243
  stats: { browser: true, export: false, server: false },
238
244
  suggestedBinding: { browser: false, export: false, server: false },
245
+ hoveredArrowTextAnchor: { browser: false, export: false, server: false },
239
246
  frameRendering: { browser: false, export: false, server: false },
240
247
  frameToHighlight: { browser: false, export: false, server: false },
241
248
  editingFrame: { browser: false, export: false, server: false },
@@ -251,14 +258,13 @@ var APP_STATE_STORAGE_CONF = /* @__PURE__ */ ((config) => config)({
251
258
  snapLines: { browser: false, export: false, server: false },
252
259
  originSnapOffset: { browser: false, export: false, server: false },
253
260
  objectsSnapModeEnabled: { browser: true, export: false, server: false },
254
- userToFollow: { browser: false, export: false, server: false },
255
- followedBy: { browser: false, export: false, server: false },
256
261
  isCropping: { browser: false, export: false, server: false },
257
262
  croppingElementId: { browser: false, export: false, server: false },
258
263
  searchMatches: { browser: false, export: false, server: false },
259
264
  lockedMultiSelections: { browser: true, export: true, server: true },
260
265
  activeLockedId: { browser: false, export: false, server: false },
261
- bindMode: { browser: true, export: false, server: false }
266
+ bindMode: { browser: true, export: false, server: false },
267
+ colorTopPicks: { browser: true, export: false, server: false }
262
268
  });
263
269
  var _clearAppStateForStorage = (appState, exportType) => {
264
270
  const stateForExport = {};
@@ -356,25 +362,202 @@ import {
356
362
  getTargetElements
357
363
  } from "@excalidraw/element";
358
364
 
359
- // scene/scroll.ts
360
- import { getVisibleElements } from "@excalidraw/element";
365
+ // viewport.ts
361
366
  import {
362
- sceneCoordsToViewportCoords,
363
- viewportCoordsToSceneCoords
367
+ arrayToMap,
368
+ MAX_ZOOM,
369
+ MIN_ZOOM,
370
+ viewportCoordsToSceneCoords,
371
+ ZOOM_STEP
364
372
  } from "@excalidraw/common";
365
- import { getClosestElementBounds } from "@excalidraw/element";
366
- import { getCommonBounds } from "@excalidraw/element";
367
- var isOutsideViewPort = (appState, cords) => {
368
- const [x1, y1, x2, y2] = cords;
369
- const { x: viewportX1, y: viewportY1 } = sceneCoordsToViewportCoords(
370
- { sceneX: x1, sceneY: y1 },
371
- appState
373
+ import { clamp, pointDistance, pointFrom, roundToStep } from "@excalidraw/math";
374
+ import {
375
+ CaptureUpdateAction,
376
+ getCommonBounds,
377
+ getElementBounds,
378
+ getVisibleElements
379
+ } from "@excalidraw/element";
380
+ var DEFAULT_OVERSCROLL = 150;
381
+ var constrainScrollAxis = (scroll, boxStart, boxSize, visibleSize, offsetStart, offsetEnd, overscroll) => {
382
+ const max = -boxStart + offsetStart;
383
+ const min = visibleSize - (boxStart + boxSize) - offsetEnd;
384
+ if (min > max) {
385
+ const center = (min + max) / 2;
386
+ return clamp(scroll, center - overscroll, center + overscroll);
387
+ }
388
+ return clamp(scroll, min - overscroll, max + overscroll);
389
+ };
390
+ var constrainScrollState = (state, overscroll = 0) => {
391
+ const { scrollConstraints, width, height } = state;
392
+ if (!scrollConstraints) {
393
+ return { scrollX: state.scrollX, scrollY: state.scrollY, zoom: state.zoom };
394
+ }
395
+ const minZoom = scrollConstraints.lockZoom ? scrollConstraints.zoom : MIN_ZOOM;
396
+ const zoomValue = getNormalizedZoom(
397
+ clamp(state.zoom.value, minZoom, MAX_ZOOM)
372
398
  );
373
- const { x: viewportX2, y: viewportY2 } = sceneCoordsToViewportCoords(
374
- { sceneX: x2, sceneY: y2 },
375
- appState
399
+ if (!scrollConstraints.lockScroll) {
400
+ return {
401
+ scrollX: state.scrollX,
402
+ scrollY: state.scrollY,
403
+ zoom: { value: zoomValue }
404
+ };
405
+ }
406
+ const give = Math.max(overscroll, 0) / zoomValue;
407
+ const offsets = scrollConstraints.offsets;
408
+ const offsetTop = (offsets?.top ?? 0) / zoomValue;
409
+ const offsetRight = (offsets?.right ?? 0) / zoomValue;
410
+ const offsetBottom = (offsets?.bottom ?? 0) / zoomValue;
411
+ const offsetLeft = (offsets?.left ?? 0) / zoomValue;
412
+ return {
413
+ scrollX: constrainScrollAxis(
414
+ state.scrollX,
415
+ scrollConstraints.x,
416
+ scrollConstraints.width,
417
+ width / zoomValue,
418
+ offsetLeft,
419
+ offsetRight,
420
+ give
421
+ ),
422
+ scrollY: constrainScrollAxis(
423
+ state.scrollY,
424
+ scrollConstraints.y,
425
+ scrollConstraints.height,
426
+ height / zoomValue,
427
+ offsetTop,
428
+ offsetBottom,
429
+ give
430
+ ),
431
+ zoom: { value: zoomValue }
432
+ };
433
+ };
434
+ var getViewportForZoom = ({ viewportX, viewportY, nextZoom }, appState) => {
435
+ const appLayerX = viewportX - appState.offsetLeft;
436
+ const appLayerY = viewportY - appState.offsetTop;
437
+ const currentZoom = appState.zoom.value;
438
+ const baseScrollX = appState.scrollX + (appLayerX - appLayerX / currentZoom);
439
+ const baseScrollY = appState.scrollY + (appLayerY - appLayerY / currentZoom);
440
+ const zoomOffsetScrollX = -(appLayerX - appLayerX / nextZoom);
441
+ const zoomOffsetScrollY = -(appLayerY - appLayerY / nextZoom);
442
+ return {
443
+ scrollX: baseScrollX + zoomOffsetScrollX,
444
+ scrollY: baseScrollY + zoomOffsetScrollY,
445
+ zoom: {
446
+ value: nextZoom
447
+ }
448
+ };
449
+ };
450
+ var getViewportForZoomWithScrollConstraints = (opts, state) => {
451
+ const restingViewport = constrainScrollState(state);
452
+ const overscrollX = (state.scrollX - restingViewport.scrollX) * state.zoom.value;
453
+ const overscrollY = (state.scrollY - restingViewport.scrollY) * state.zoom.value;
454
+ const zoomedViewport = constrainScrollState({
455
+ ...state,
456
+ ...getViewportForZoom(opts, state)
457
+ });
458
+ if (!state.scrollConstraints?.lockScroll || !overscrollX && !overscrollY) {
459
+ return zoomedViewport;
460
+ }
461
+ const zoom = zoomedViewport.zoom.value;
462
+ return constrainScrollState(
463
+ {
464
+ ...state,
465
+ ...zoomedViewport,
466
+ scrollX: zoomedViewport.scrollX + overscrollX / zoom,
467
+ scrollY: zoomedViewport.scrollY + overscrollY / zoom
468
+ },
469
+ state.scrollConstraints.overscroll
470
+ );
471
+ };
472
+ var zoomValueToFitBoundsOnViewport = (bounds, viewportDimensions) => {
473
+ const [x1, y1, x2, y2] = bounds;
474
+ const commonBoundsWidth = x2 - x1;
475
+ const zoomValueForWidth = viewportDimensions.width / commonBoundsWidth;
476
+ const commonBoundsHeight = y2 - y1;
477
+ const zoomValueForHeight = viewportDimensions.height / commonBoundsHeight;
478
+ const smallestZoomValue = Math.min(zoomValueForWidth, zoomValueForHeight);
479
+ return Math.min(smallestZoomValue, 1);
480
+ };
481
+ var zoomToFitBounds = ({
482
+ bounds,
483
+ appState,
484
+ canvasOffsets,
485
+ fit = "scale-down",
486
+ minZoom = -Infinity,
487
+ maxZoom = Infinity,
488
+ steppedZoom = false
489
+ }) => {
490
+ const [x1, y1, x2, y2] = bounds;
491
+ const centerX = (x1 + x2) / 2;
492
+ const centerY = (y1 + y2) / 2;
493
+ const canvasOffsetLeft = canvasOffsets?.left ?? 0;
494
+ const canvasOffsetTop = canvasOffsets?.top ?? 0;
495
+ const canvasOffsetRight = canvasOffsets?.right ?? 0;
496
+ const canvasOffsetBottom = canvasOffsets?.bottom ?? 0;
497
+ const effectiveCanvasWidth = appState.width - canvasOffsetLeft - canvasOffsetRight;
498
+ const effectiveCanvasHeight = appState.height - canvasOffsetTop - canvasOffsetBottom;
499
+ let adjustedZoomValue;
500
+ if (fit === "none") {
501
+ adjustedZoomValue = appState.zoom.value;
502
+ } else if (fit === "contain") {
503
+ const commonBoundsWidth = x2 - x1;
504
+ const commonBoundsHeight = y2 - y1;
505
+ adjustedZoomValue = Math.min(
506
+ effectiveCanvasWidth / commonBoundsWidth,
507
+ effectiveCanvasHeight / commonBoundsHeight
508
+ );
509
+ } else {
510
+ adjustedZoomValue = zoomValueToFitBoundsOnViewport(bounds, {
511
+ width: effectiveCanvasWidth,
512
+ height: effectiveCanvasHeight
513
+ });
514
+ }
515
+ const targetZoomValue = steppedZoom && fit !== "none" ? roundToStep(adjustedZoomValue, ZOOM_STEP, "floor") : adjustedZoomValue;
516
+ const newZoomValue = getNormalizedZoom(
517
+ clamp(targetZoomValue, minZoom, maxZoom)
376
518
  );
377
- return viewportX2 - viewportX1 > appState.width || viewportY2 - viewportY1 > appState.height;
519
+ const centerScroll = centerScrollOn({
520
+ scenePoint: { x: centerX, y: centerY },
521
+ viewportDimensions: {
522
+ width: appState.width,
523
+ height: appState.height
524
+ },
525
+ offsets: canvasOffsets,
526
+ zoom: { value: newZoomValue }
527
+ });
528
+ return {
529
+ appState: {
530
+ ...appState,
531
+ scrollX: centerScroll.scrollX,
532
+ scrollY: centerScroll.scrollY,
533
+ zoom: { value: newZoomValue }
534
+ },
535
+ captureUpdate: CaptureUpdateAction.EVENTUALLY
536
+ };
537
+ };
538
+ var doBoundsExceedViewport = (appState, bounds) => {
539
+ const [x1, y1, x2, y2] = bounds;
540
+ return (x2 - x1) * appState.zoom.value > appState.width || (y2 - y1) * appState.zoom.value > appState.height;
541
+ };
542
+ var getClosestElementBounds = (elements, from) => {
543
+ if (!elements.length) {
544
+ return [0, 0, 0, 0];
545
+ }
546
+ let minDistance = Infinity;
547
+ let closestElement = elements[0];
548
+ const elementsMap = arrayToMap(elements);
549
+ elements.forEach((element) => {
550
+ const [x1, y1, x2, y2] = getElementBounds(element, elementsMap);
551
+ const distance2 = pointDistance(
552
+ pointFrom((x1 + x2) / 2, (y1 + y2) / 2),
553
+ pointFrom(from.x, from.y)
554
+ );
555
+ if (distance2 < minDistance) {
556
+ minDistance = distance2;
557
+ closestElement = element;
558
+ }
559
+ });
560
+ return getElementBounds(closestElement, elementsMap);
378
561
  };
379
562
  var centerScrollOn = ({
380
563
  scenePoint,
@@ -391,7 +574,7 @@ var centerScrollOn = ({
391
574
  scrollY
392
575
  };
393
576
  };
394
- var calculateScrollCenter = (elements, appState) => {
577
+ var getScrollToContentState = (elements, appState) => {
395
578
  elements = getVisibleElements(elements);
396
579
  if (!elements.length) {
397
580
  return {
@@ -400,11 +583,14 @@ var calculateScrollCenter = (elements, appState) => {
400
583
  };
401
584
  }
402
585
  let [x1, y1, x2, y2] = getCommonBounds(elements);
403
- if (isOutsideViewPort(appState, [x1, y1, x2, y2])) {
586
+ if (doBoundsExceedViewport(appState, [x1, y1, x2, y2])) {
404
587
  [x1, y1, x2, y2] = getClosestElementBounds(
405
588
  elements,
406
589
  viewportCoordsToSceneCoords(
407
- { clientX: appState.scrollX, clientY: appState.scrollY },
590
+ {
591
+ clientX: appState.offsetLeft + appState.width / 2,
592
+ clientY: appState.offsetTop + appState.height / 2
593
+ },
408
594
  appState
409
595
  )
410
596
  );
@@ -429,16 +615,16 @@ import {
429
615
  } from "@excalidraw/element";
430
616
 
431
617
  // scene/normalize.ts
432
- import { MAX_ZOOM, MIN_ZOOM } from "@excalidraw/common";
433
- import { clamp, round } from "@excalidraw/math";
618
+ import { MAX_ZOOM as MAX_ZOOM2, MIN_ZOOM as MIN_ZOOM2 } from "@excalidraw/common";
619
+ import { clamp as clamp2, round } from "@excalidraw/math";
434
620
  var getNormalizedZoom = (zoom) => {
435
- return clamp(round(zoom, 6), MIN_ZOOM, MAX_ZOOM);
621
+ return clamp2(round(zoom, 6), MIN_ZOOM2, MAX_ZOOM2);
436
622
  };
437
623
  var getNormalizedGridSize = (gridStep) => {
438
- return clamp(Math.round(gridStep), 1, 100);
624
+ return clamp2(Math.round(gridStep), 1, 100);
439
625
  };
440
626
  var getNormalizedGridStep = (gridStep) => {
441
- return clamp(Math.round(gridStep), 1, 100);
627
+ return clamp2(Math.round(gridStep), 1, 100);
442
628
  };
443
629
 
444
630
  // scene/export.ts
@@ -451,7 +637,7 @@ import {
451
637
  THEME as THEME5,
452
638
  MIME_TYPES as MIME_TYPES5,
453
639
  EXPORT_DATA_TYPES as EXPORT_DATA_TYPES2,
454
- arrayToMap,
640
+ arrayToMap as arrayToMap2,
455
641
  distance,
456
642
  getFontString as getFontString2,
457
643
  toBrandedType,
@@ -2798,8 +2984,9 @@ var XiaolaiFontFaces = [
2798
2984
 
2799
2985
  // fonts/Fonts.ts
2800
2986
  var _Fonts = class _Fonts {
2801
- constructor(scene) {
2987
+ constructor(scene, ownerDocument = document) {
2802
2988
  __publicField(this, "scene");
2989
+ __publicField(this, "ownerDocument");
2803
2990
  /**
2804
2991
  * Get all the font families for the given scene.
2805
2992
  */
@@ -2851,9 +3038,14 @@ var _Fonts = class _Fonts {
2851
3038
  const charsPerFamily = _Fonts.getCharsPerFamily(
2852
3039
  this.scene.getNonDeletedElements()
2853
3040
  );
2854
- return _Fonts.loadFontFaces(sceneFamilies, charsPerFamily);
3041
+ return _Fonts.loadFontFaces(
3042
+ sceneFamilies,
3043
+ charsPerFamily,
3044
+ this.ownerDocument
3045
+ );
2855
3046
  });
2856
3047
  this.scene = scene;
3048
+ this.ownerDocument = ownerDocument;
2857
3049
  }
2858
3050
  static get registered() {
2859
3051
  if (!_Fonts._registered) {
@@ -2891,33 +3083,37 @@ var _Fonts = class _Fonts {
2891
3083
  const fontFaces = await new PromisePool(iterator, concurrency).all();
2892
3084
  return Array.from(new Set(fontFaces));
2893
3085
  }
2894
- static async loadFontFaces(fontFamilies, charsPerFamily) {
3086
+ static async loadFontFaces(fontFamilies, charsPerFamily, ownerDocument) {
2895
3087
  for (const { fontFaces: fontFaces2, metadata } of _Fonts.registered.values()) {
2896
3088
  if (metadata.local) {
2897
3089
  continue;
2898
3090
  }
2899
3091
  for (const { fontFace } of fontFaces2) {
2900
- if (!window.document.fonts.has(fontFace)) {
2901
- window.document.fonts.add(fontFace);
3092
+ if (!ownerDocument.fonts.has(fontFace)) {
3093
+ ownerDocument.fonts.add(fontFace);
2902
3094
  }
2903
3095
  }
2904
3096
  }
2905
- const iterator = _Fonts.fontFacesLoader(fontFamilies, charsPerFamily);
3097
+ const iterator = _Fonts.fontFacesLoader(
3098
+ fontFamilies,
3099
+ charsPerFamily,
3100
+ ownerDocument
3101
+ );
2906
3102
  const concurrency = 10;
2907
3103
  const fontFaces = await new PromisePool(iterator, concurrency).all();
2908
3104
  return fontFaces.flat().filter(Boolean);
2909
3105
  }
2910
- static *fontFacesLoader(fontFamilies, charsPerFamily) {
3106
+ static *fontFacesLoader(fontFamilies, charsPerFamily, ownerDocument) {
2911
3107
  for (const [index, fontFamily] of fontFamilies.entries()) {
2912
3108
  const font = getFontString({
2913
3109
  fontFamily,
2914
3110
  fontSize: FONT_SIZES.sm
2915
3111
  });
2916
3112
  const text = _Fonts.getCharacters(charsPerFamily, fontFamily);
2917
- if (!window.document.fonts.check(font, text)) {
3113
+ if (!ownerDocument.fonts.check(font, text)) {
2918
3114
  yield promiseTry3(async () => {
2919
3115
  try {
2920
- const fontFaces = await window.document.fonts.load(font, text);
3116
+ const fontFaces = await ownerDocument.fonts.load(font, text);
2921
3117
  return [index, fontFaces];
2922
3118
  } catch (e) {
2923
3119
  console.error(
@@ -3060,16 +3256,17 @@ __publicField(_Fonts, "_initialized", false);
3060
3256
  /**
3061
3257
  * Load font faces for passed elements - use when the scene is unavailable (i.e. export).
3062
3258
  */
3063
- __publicField(_Fonts, "loadElementsFonts", async (elements) => {
3259
+ __publicField(_Fonts, "loadElementsFonts", async (elements, ownerDocument = document) => {
3064
3260
  const fontFamilies = _Fonts.getUniqueFamilies(elements);
3065
3261
  const charsPerFamily = _Fonts.getCharsPerFamily(elements);
3066
- return _Fonts.loadFontFaces(fontFamilies, charsPerFamily);
3262
+ return _Fonts.loadFontFaces(fontFamilies, charsPerFamily, ownerDocument);
3067
3263
  });
3068
3264
  var Fonts = _Fonts;
3069
3265
 
3070
3266
  // renderer/staticScene.ts
3071
3267
  import {
3072
3268
  applyDarkModeFilter as applyDarkModeFilter2,
3269
+ COLOR_WHITE as COLOR_WHITE2,
3073
3270
  FRAME_STYLE,
3074
3271
  THEME as THEME3,
3075
3272
  throttleRAF
@@ -3091,7 +3288,7 @@ import { renderElement } from "@excalidraw/element";
3091
3288
  import { getElementAbsoluteCoords as getElementAbsoluteCoords2 } from "@excalidraw/element";
3092
3289
 
3093
3290
  // components/hyperlink/helpers.ts
3094
- import { pointFrom, pointRotateRads } from "@excalidraw/math";
3291
+ import { pointFrom as pointFrom2, pointRotateRads } from "@excalidraw/math";
3095
3292
  import { MIME_TYPES as MIME_TYPES3 } from "@excalidraw/common";
3096
3293
  import { getElementAbsoluteCoords } from "@excalidraw/element";
3097
3294
  import { hitElementBoundingBox } from "@excalidraw/element";
@@ -3117,8 +3314,8 @@ var getLinkHandleFromCoords = ([x1, y1, x2, y2], angle, appState) => {
3117
3314
  const x = x2 + dashedLineMargin - centeringOffset;
3118
3315
  const y = y1 - dashedLineMargin - linkMarginY + centeringOffset;
3119
3316
  const [rotatedX, rotatedY] = pointRotateRads(
3120
- pointFrom(x + linkWidth / 2, y + linkHeight / 2),
3121
- pointFrom(centerX, centerY),
3317
+ pointFrom2(x + linkWidth / 2, y + linkHeight / 2),
3318
+ pointFrom2(centerX, centerY),
3122
3319
  angle
3123
3320
  );
3124
3321
  return [
@@ -3143,19 +3340,21 @@ var isPointHittingLink = (element, elementsMap, appState, [x, y], isMobile) => {
3143
3340
  if (!element.link || appState.selectedElementIds[element.id]) {
3144
3341
  return false;
3145
3342
  }
3146
- if (!isMobile && appState.viewModeEnabled && hitElementBoundingBox(pointFrom(x, y), element, elementsMap)) {
3343
+ if (!isMobile && appState.viewModeEnabled && hitElementBoundingBox(pointFrom2(x, y), element, elementsMap)) {
3147
3344
  return true;
3148
3345
  }
3149
3346
  return isPointHittingLinkIcon(
3150
3347
  element,
3151
3348
  elementsMap,
3152
3349
  appState,
3153
- pointFrom(x, y)
3350
+ pointFrom2(x, y)
3154
3351
  );
3155
3352
  };
3156
3353
 
3157
3354
  // renderer/helpers.ts
3158
- import { THEME as THEME2, applyDarkModeFilter } from "@excalidraw/common";
3355
+ import { COLOR_WHITE, THEME as THEME2, applyDarkModeFilter } from "@excalidraw/common";
3356
+ var DEFAULT_SELECTION_COLOR = "#6965db";
3357
+ var getSelectionColor = (element) => element && getComputedStyle(element).getPropertyValue("--color-selection").trim() || DEFAULT_SELECTION_COLOR;
3159
3358
  var fillCircle = (context, cx, cy, radius, stroke, fill = true) => {
3160
3359
  context.beginPath();
3161
3360
  context.arc(cx, cy, radius, 0, Math.PI * 2);
@@ -3182,19 +3381,20 @@ var bootstrapCanvas = ({
3182
3381
  context.setTransform(1, 0, 0, 1, 0, 0);
3183
3382
  context.scale(scale, scale);
3184
3383
  if (typeof viewBackgroundColor === "string") {
3185
- const hasTransparence = viewBackgroundColor === "transparent" || viewBackgroundColor.length === 5 || // #RGBA
3186
- viewBackgroundColor.length === 9 || // #RRGGBBA
3187
- /(hsla|rgba)\(/.test(viewBackgroundColor);
3188
- if (hasTransparence) {
3384
+ const isOpaque = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(viewBackgroundColor);
3385
+ if (!isOpaque) {
3189
3386
  context.clearRect(0, 0, normalizedWidth, normalizedHeight);
3190
3387
  }
3191
- context.save();
3192
- context.fillStyle = applyDarkModeFilter(
3193
- viewBackgroundColor,
3194
- theme === THEME2.DARK
3195
- );
3196
- context.fillRect(0, 0, normalizedWidth, normalizedHeight);
3197
- context.restore();
3388
+ if (viewBackgroundColor !== "transparent") {
3389
+ context.save();
3390
+ context.fillStyle = COLOR_WHITE;
3391
+ context.fillStyle = applyDarkModeFilter(
3392
+ viewBackgroundColor,
3393
+ theme === THEME2.DARK
3394
+ );
3395
+ context.fillRect(0, 0, normalizedWidth, normalizedHeight);
3396
+ context.restore();
3397
+ }
3198
3398
  } else {
3199
3399
  context.clearRect(0, 0, normalizedWidth, normalizedHeight);
3200
3400
  }
@@ -3321,7 +3521,8 @@ var renderLinkIcon = (element, context, appState, elementsMap) => {
3321
3521
  window.devicePixelRatio * appState.zoom.value,
3322
3522
  window.devicePixelRatio * appState.zoom.value
3323
3523
  );
3324
- linkCanvasCacheContext.fillStyle = appState.viewBackgroundColor || "#fff";
3524
+ linkCanvasCacheContext.fillStyle = COLOR_WHITE2;
3525
+ linkCanvasCacheContext.fillStyle = appState.viewBackgroundColor || COLOR_WHITE2;
3325
3526
  linkCanvasCacheContext.fillRect(0, 0, width, height);
3326
3527
  if (canvasKey === "elementLink") {
3327
3528
  linkCanvasCacheContext.drawImage(ELEMENT_LINK_IMG, 0, 0, width, height);
@@ -3446,7 +3647,7 @@ var _renderStaticScene = ({
3446
3647
  );
3447
3648
  }
3448
3649
  context.restore();
3449
- if (!isExporting) {
3650
+ if (!isExporting && renderConfig.renderLinks !== false) {
3450
3651
  renderLinkIcon(element, context, appState, elementsMap);
3451
3652
  }
3452
3653
  } catch (error) {
@@ -3484,7 +3685,7 @@ var _renderStaticScene = ({
3484
3685
  appState
3485
3686
  );
3486
3687
  }
3487
- if (!isExporting) {
3688
+ if (!isExporting && renderConfig.renderLinks !== false) {
3488
3689
  renderLinkIcon(element, context, appState, elementsMap);
3489
3690
  }
3490
3691
  };
@@ -3541,6 +3742,7 @@ var renderStaticScene = (renderConfig, throttle) => {
3541
3742
 
3542
3743
  // renderer/staticSvgScene.ts
3543
3744
  import {
3745
+ BOUND_TEXT_PADDING,
3544
3746
  FRAME_STYLE as FRAME_STYLE2,
3545
3747
  MAX_DECIMALS_FOR_SVG_EXPORT,
3546
3748
  SVG_NS,
@@ -3785,13 +3987,19 @@ var renderElementToSvg = (element, elementsMap, rsvg, svgRoot, files, offsetX, o
3785
3987
  boundText,
3786
3988
  elementsMap
3787
3989
  );
3788
- const maskX = offsetX + boundTextCoords.x - element.x;
3789
- const maskY = offsetY + boundTextCoords.y - element.y;
3990
+ const maskX = offsetX + boundTextCoords.x - element.x - BOUND_TEXT_PADDING;
3991
+ const maskY = offsetY + boundTextCoords.y - element.y - BOUND_TEXT_PADDING;
3790
3992
  maskRectInvisible.setAttribute("x", maskX.toString());
3791
3993
  maskRectInvisible.setAttribute("y", maskY.toString());
3792
3994
  maskRectInvisible.setAttribute("fill", "#000");
3793
- maskRectInvisible.setAttribute("width", `${boundText.width}`);
3794
- maskRectInvisible.setAttribute("height", `${boundText.height}`);
3995
+ maskRectInvisible.setAttribute(
3996
+ "width",
3997
+ `${boundText.width + BOUND_TEXT_PADDING * 2}`
3998
+ );
3999
+ maskRectInvisible.setAttribute(
4000
+ "height",
4001
+ `${boundText.height + BOUND_TEXT_PADDING * 2}`
4002
+ );
3795
4003
  maskRectInvisible.setAttribute("opacity", "1");
3796
4004
  maskPath.appendChild(maskRectInvisible);
3797
4005
  }
@@ -4107,7 +4315,7 @@ var renderSceneToSvg = (elements, elementsMap, rsvg, svgRoot, files, renderConfi
4107
4315
  renderConfig
4108
4316
  );
4109
4317
  const boundTextElement = getBoundTextElement2(element, elementsMap);
4110
- if (boundTextElement) {
4318
+ if (boundTextElement?.isDeleted === false) {
4111
4319
  renderElementToSvg(
4112
4320
  boundTextElement,
4113
4321
  elementsMap,
@@ -4118,6 +4326,10 @@ var renderSceneToSvg = (elements, elementsMap, rsvg, svgRoot, files, renderConfi
4118
4326
  boundTextElement.y + renderConfig.offsetY,
4119
4327
  renderConfig
4120
4328
  );
4329
+ } else if (boundTextElement) {
4330
+ console.error(
4331
+ "[NONDELETED][INVARIANT] Skipped rendering deleted bound text element"
4332
+ );
4121
4333
  }
4122
4334
  } catch (error) {
4123
4335
  console.error(error);
@@ -4209,7 +4421,7 @@ var prepareElementsForRender = ({
4209
4421
  nextElements = getElementsOverlappingFrame(
4210
4422
  elements,
4211
4423
  exportingFrame,
4212
- arrayToMap(elements)
4424
+ arrayToMap2(elements)
4213
4425
  );
4214
4426
  } else if (frameRendering.enabled && frameRendering.name) {
4215
4427
  nextElements = addFrameLabelsAsTextElements(elements, {
@@ -4267,10 +4479,10 @@ var exportToCanvas = async (elements, appState, files, {
4267
4479
  canvas,
4268
4480
  rc: rough.canvas(canvas),
4269
4481
  elementsMap: toBrandedType(
4270
- arrayToMap(elementsForRender)
4482
+ arrayToMap2(elementsForRender)
4271
4483
  ),
4272
4484
  allElementsMap: toBrandedType(
4273
- arrayToMap(syncInvalidIndices(elements))
4485
+ arrayToMap2(syncInvalidIndices(elements))
4274
4486
  ),
4275
4487
  visibleElements: elementsForRender,
4276
4488
  scale,
@@ -4359,7 +4571,7 @@ var exportToSvg = async (elements, appState, files, opts) => {
4359
4571
  }
4360
4572
  const frameElements = getFrameLikeElements(elements);
4361
4573
  if (frameElements.length) {
4362
- const elementsMap = arrayToMap(elements);
4574
+ const elementsMap = arrayToMap2(elements);
4363
4575
  for (const frame of frameElements) {
4364
4576
  const clipPath = svgRoot.ownerDocument.createElementNS(
4365
4577
  SVG_NS2,
@@ -4408,7 +4620,7 @@ var exportToSvg = async (elements, appState, files, opts) => {
4408
4620
  const renderEmbeddables = opts?.renderEmbeddables ?? false;
4409
4621
  renderSceneToSvg(
4410
4622
  elementsForRender,
4411
- toBrandedType(arrayToMap(elementsForRender)),
4623
+ toBrandedType(arrayToMap2(elementsForRender)),
4412
4624
  rsvg,
4413
4625
  svgRoot,
4414
4626
  files || {},
@@ -4479,16 +4691,17 @@ var getCanvasSize = (elements, exportPadding) => {
4479
4691
  const height = distance(minY, maxY) + exportPadding * 2;
4480
4692
  return [minX, minY, width, height];
4481
4693
  };
4482
- var getExportSize = (elements, exportPadding, scale) => {
4483
- const [, , width, height] = getCanvasSize(elements, exportPadding).map(
4484
- (dimension) => Math.trunc(dimension * scale)
4485
- );
4486
- return [width, height];
4487
- };
4488
4694
 
4489
4695
  // data/restore.ts
4490
- import { isFiniteNumber, isValidPoint, pointFrom as pointFrom2 } from "@excalidraw/math";
4491
4696
  import {
4697
+ clamp as clamp3,
4698
+ isFiniteNumber,
4699
+ isValidPoint,
4700
+ pointFrom as pointFrom3
4701
+ } from "@excalidraw/math";
4702
+ import {
4703
+ colorToHex,
4704
+ COLOR_TOP_PICKS_SLOTS,
4492
4705
  DEFAULT_FONT_FAMILY as DEFAULT_FONT_FAMILY2,
4493
4706
  DEFAULT_STROKE_STREAMLINE,
4494
4707
  DEFAULT_TEXT_ALIGN as DEFAULT_TEXT_ALIGN2,
@@ -4502,7 +4715,7 @@ import {
4502
4715
  randomId,
4503
4716
  getUpdatedTimestamp,
4504
4717
  updateActiveTool,
4505
- arrayToMap as arrayToMap2,
4718
+ arrayToMap as arrayToMap3,
4506
4719
  getSizeFromPoints,
4507
4720
  normalizeLink as normalizeLink2,
4508
4721
  getLineHeight,
@@ -4515,7 +4728,8 @@ import {
4515
4728
  normalizeArrowhead,
4516
4729
  isPointInElement,
4517
4730
  isValidPolygon,
4518
- projectFixedPointOntoDiagonal
4731
+ projectFixedPointOntoDiagonal,
4732
+ isNonDeletedElement
4519
4733
  } from "@excalidraw/element";
4520
4734
  import { normalizeFixedPoint } from "@excalidraw/element";
4521
4735
  import {
@@ -4535,21 +4749,43 @@ import {
4535
4749
  isTextElement as isTextElement4,
4536
4750
  isUsingAdaptiveRadius
4537
4751
  } from "@excalidraw/element";
4538
- import { syncInvalidIndices as syncInvalidIndices2 } from "@excalidraw/element";
4752
+ import {
4753
+ normalizeBoundElementsOrder,
4754
+ syncInvalidIndices as syncInvalidIndices2,
4755
+ syncMovedIndices
4756
+ } from "@excalidraw/element";
4539
4757
  import { refreshTextDimensions } from "@excalidraw/element";
4540
4758
  import { getNormalizedDimensions } from "@excalidraw/element";
4541
4759
  import { isInvisiblySmallElement } from "@excalidraw/element";
4542
- var MAX_ARROW_PX = 75e3;
4760
+ var MAX_LINEAR_PX = 75e3;
4761
+ var handleOversizedLinearElements = (element) => {
4762
+ if (element.width <= MAX_LINEAR_PX && element.height <= MAX_LINEAR_PX) {
4763
+ return element;
4764
+ }
4765
+ const label = element.type === "arrow" ? `${isElbowArrow(element) ? "elbow" : "simple"} arrow` : element.type;
4766
+ console.error(
4767
+ `Removing extremely large ${label} ${element.id} (width: ${element.width}, height: ${element.height}, x: ${element.x}, y: ${element.y})`
4768
+ );
4769
+ return {
4770
+ ...element,
4771
+ x: 0,
4772
+ y: 0,
4773
+ width: 100,
4774
+ height: 100,
4775
+ points: [pointFrom3(0, 0), pointFrom3(100, 100)],
4776
+ isDeleted: true
4777
+ };
4778
+ };
4543
4779
  var restoreLinearElementPoints = (points, width, height) => {
4544
4780
  const restoredPoints = Array.isArray(points) ? points.reduce((acc, point) => {
4545
4781
  if (isValidPoint(point)) {
4546
- acc.push(pointFrom2(point[0], point[1]));
4782
+ acc.push(pointFrom3(point[0], point[1]));
4547
4783
  }
4548
4784
  return acc;
4549
4785
  }, []) : [];
4550
4786
  return restoredPoints.length < 2 ? [
4551
- pointFrom2(0, 0),
4552
- pointFrom2(
4787
+ pointFrom3(0, 0),
4788
+ pointFrom3(
4553
4789
  isFiniteNumber(width) ? width : 0,
4554
4790
  isFiniteNumber(height) ? height : 0
4555
4791
  )
@@ -4567,7 +4803,7 @@ var restoreFreedrawPoints = (points, pressures) => {
4567
4803
  const restoredPressures = [];
4568
4804
  points.forEach((point, index) => {
4569
4805
  if (isValidPoint(point)) {
4570
- restoredPoints.push(pointFrom2(point[0], point[1]));
4806
+ restoredPoints.push(pointFrom3(point[0], point[1]));
4571
4807
  if (index in pressureValues) {
4572
4808
  const pressure = pressureValues[index];
4573
4809
  restoredPressures.push(isFiniteNumber(pressure) ? pressure : 0.5);
@@ -4596,7 +4832,9 @@ var AllowedExcalidrawActiveTools = {
4596
4832
  embeddable: true,
4597
4833
  hand: true,
4598
4834
  laser: false,
4599
- magicframe: false
4835
+ autoshape: false,
4836
+ magicframe: false,
4837
+ bucketfill: true
4600
4838
  };
4601
4839
  var ALLOWED_STROKE_VARIABILITIES = /* @__PURE__ */ new Set([
4602
4840
  "constant",
@@ -4654,6 +4892,9 @@ var repairBinding = (element, binding, targetElementsMap, existingElementsMap, s
4654
4892
  elementsMap
4655
4893
  );
4656
4894
  const mode = isPointInElement(p, boundElement, elementsMap) ? "inside" : "orbit";
4895
+ if (!isNonDeletedElement(element)) {
4896
+ console.error("[NONDELETED][INVARIANT] Restoring a deleted element");
4897
+ }
4657
4898
  const safeElement = {
4658
4899
  ...element,
4659
4900
  startBinding: element.startBinding?.elementId ? {
@@ -4777,7 +5018,8 @@ var restoreElement = (element, targetElementsMap, existingElementsMap, opts) =>
4777
5018
  containerId: element.containerId ?? null,
4778
5019
  originalText: element.originalText || text,
4779
5020
  autoResize: element.autoResize ?? true,
4780
- lineHeight
5021
+ lineHeight,
5022
+ labelPosition: isFiniteNumber(element.labelPosition) ? clamp3(element.labelPosition, 0, 1) : null
4781
5023
  });
4782
5024
  if (opts?.deleteInvisibleElements && !text && !element.isDeleted) {
4783
5025
  element = { ...element, originalText: text, isDeleted: true };
@@ -4822,7 +5064,7 @@ var restoreElement = (element, targetElementsMap, existingElementsMap, opts) =>
4822
5064
  y: y ?? 0
4823
5065
  }));
4824
5066
  }
4825
- return restoreElementWithProperties(element, {
5067
+ const restoredLine = restoreElementWithProperties(element, {
4826
5068
  type: "line",
4827
5069
  startBinding: null,
4828
5070
  endBinding: null,
@@ -4836,6 +5078,7 @@ var restoreElement = (element, targetElementsMap, existingElementsMap, opts) =>
4836
5078
  } : {},
4837
5079
  ...getSizeFromPoints(points)
4838
5080
  });
5081
+ return handleOversizedLinearElements(restoredLine);
4839
5082
  case "arrow": {
4840
5083
  const startArrowhead2 = normalizeArrowhead(element.startArrowhead);
4841
5084
  const endArrowhead2 = element.endArrowhead === void 0 ? "arrow" : normalizeArrowhead(element.endArrowhead);
@@ -4889,24 +5132,7 @@ var restoreElement = (element, targetElementsMap, existingElementsMap, opts) =>
4889
5132
  restoredElement
4890
5133
  )
4891
5134
  };
4892
- if (normalizedRestoredElement.width > MAX_ARROW_PX || normalizedRestoredElement.height > MAX_ARROW_PX) {
4893
- console.error(
4894
- `Removing extremely large arrow ${normalizedRestoredElement.id} (type: ${isElbowArrow(normalizedRestoredElement) ? "elbow" : "simple"}, width: ${normalizedRestoredElement.width}, height: ${normalizedRestoredElement.height}, x: ${normalizedRestoredElement.x}, y: ${normalizedRestoredElement.y})`
4895
- );
4896
- return {
4897
- ...normalizedRestoredElement,
4898
- x: 0,
4899
- y: 0,
4900
- width: 100,
4901
- height: 100,
4902
- points: [
4903
- pointFrom2(0, 0),
4904
- pointFrom2(100, 100)
4905
- ],
4906
- isDeleted: true
4907
- };
4908
- }
4909
- return normalizedRestoredElement;
5135
+ return handleOversizedLinearElements(normalizedRestoredElement);
4910
5136
  }
4911
5137
  case "ellipse":
4912
5138
  case "rectangle":
@@ -4963,6 +5189,19 @@ var repairBoundElement = (boundElement, elementsMap) => {
4963
5189
  container.boundElements = boundElements;
4964
5190
  }
4965
5191
  };
5192
+ var repairBoundTextElementOrder = (elements) => {
5193
+ const originalPositions = new Map(
5194
+ elements.map((element, index) => [element.id, index])
5195
+ );
5196
+ const normalizedElements = normalizeBoundElementsOrder(elements);
5197
+ const reorderedBoundTextElements = normalizedElements.filter(
5198
+ (element, index) => isTextElement4(element) && element.containerId && originalPositions.get(element.id) !== index
5199
+ );
5200
+ return reorderedBoundTextElements.length ? syncMovedIndices(
5201
+ normalizedElements,
5202
+ arrayToMap3(reorderedBoundTextElements)
5203
+ ) : normalizedElements;
5204
+ };
4966
5205
  var repairFrameMembership = (element, elementsMap) => {
4967
5206
  if (element.frameId) {
4968
5207
  const containingFrame = elementsMap.get(element.frameId);
@@ -4973,8 +5212,8 @@ var repairFrameMembership = (element, elementsMap) => {
4973
5212
  };
4974
5213
  var restoreElements = (targetElements, existingElements, opts) => {
4975
5214
  const existingIds = /* @__PURE__ */ new Set();
4976
- const targetElementsMap = arrayToMap2(targetElements || []);
4977
- const existingElementsMap = existingElements ? arrayToMap2(existingElements) : null;
5215
+ const targetElementsMap = arrayToMap3(targetElements || []);
5216
+ const existingElementsMap = existingElements ? arrayToMap3(existingElements) : null;
4978
5217
  const restoredElements = syncInvalidIndices2(
4979
5218
  (targetElements || []).reduce((elements, element) => {
4980
5219
  if (element.type === "selection") {
@@ -5015,7 +5254,7 @@ var restoreElements = (targetElements, existingElements, opts) => {
5015
5254
  if (!opts?.repairBindings) {
5016
5255
  return restoredElements;
5017
5256
  }
5018
- const restoredElementsMap = arrayToMap2(restoredElements);
5257
+ const restoredElementsMap = arrayToMap3(restoredElements);
5019
5258
  for (const element of restoredElements) {
5020
5259
  if (element.frameId) {
5021
5260
  repairFrameMembership(element, restoredElementsMap);
@@ -5044,7 +5283,8 @@ var restoreElements = (targetElements, existingElements, opts) => {
5044
5283
  }
5045
5284
  }
5046
5285
  }
5047
- return restoredElements.map((element) => {
5286
+ const repairedElements = repairBoundTextElementOrder(restoredElements);
5287
+ return repairedElements.map((element) => {
5048
5288
  if (isElbowArrow(element) && !isArrowBoundToElement(element) && !validateElbowPoints(element.points)) {
5049
5289
  return {
5050
5290
  ...element,
@@ -5053,7 +5293,7 @@ var restoreElements = (targetElements, existingElements, opts) => {
5053
5293
  restoredElementsMap,
5054
5294
  {
5055
5295
  points: [
5056
- pointFrom2(0, 0),
5296
+ pointFrom3(0, 0),
5057
5297
  element.points[element.points.length - 1]
5058
5298
  ]
5059
5299
  }
@@ -5082,10 +5322,10 @@ var restoreElements = (targetElements, existingElements, opts) => {
5082
5322
  width: boundElement.width,
5083
5323
  height: boundElement.height,
5084
5324
  points: [
5085
- pointFrom2(0, 0),
5086
- pointFrom2(0, -10),
5087
- pointFrom2(boundElement.width / 2 + 5, -10),
5088
- pointFrom2(
5325
+ pointFrom3(0, 0),
5326
+ pointFrom3(0, -10),
5327
+ pointFrom3(boundElement.width / 2 + 5, -10),
5328
+ pointFrom3(
5089
5329
  boundElement.width / 2 + 5,
5090
5330
  boundElement.height / 2 + 5
5091
5331
  )
@@ -5111,6 +5351,25 @@ var LegacyAppStateMigrations = {
5111
5351
  ];
5112
5352
  }
5113
5353
  };
5354
+ var restoreColorTopPicksList = (value) => {
5355
+ if (!Array.isArray(value)) {
5356
+ return null;
5357
+ }
5358
+ const colors = /* @__PURE__ */ new Map();
5359
+ for (const color of value) {
5360
+ if (typeof color !== "string") {
5361
+ continue;
5362
+ }
5363
+ const normalized = colorToHex(color) ?? color.toLowerCase();
5364
+ if (!colors.has(normalized)) {
5365
+ colors.set(normalized, color);
5366
+ }
5367
+ if (colors.size >= COLOR_TOP_PICKS_SLOTS) {
5368
+ break;
5369
+ }
5370
+ }
5371
+ return colors.size ? [...colors.values()] : null;
5372
+ };
5114
5373
  var restoreAppState = (appState, localAppState) => {
5115
5374
  appState = appState || {};
5116
5375
  const defaultAppState = getDefaultAppState();
@@ -5135,6 +5394,17 @@ var restoreAppState = (appState, localAppState) => {
5135
5394
  if (boxSelectionMode !== void 0) {
5136
5395
  nextAppState.boxSelectionMode = boxSelectionMode;
5137
5396
  }
5397
+ nextAppState.colorTopPicks = {
5398
+ elementStroke: restoreColorTopPicksList(
5399
+ nextAppState.colorTopPicks?.elementStroke
5400
+ ),
5401
+ elementBackground: restoreColorTopPicksList(
5402
+ nextAppState.colorTopPicks?.elementBackground
5403
+ ),
5404
+ bucketFill: restoreColorTopPicksList(
5405
+ nextAppState.colorTopPicks?.bucketFill
5406
+ )
5407
+ };
5138
5408
  if (appState.currentItemStrokeWidth !== void 0) {
5139
5409
  nextAppState.currentItemStrokeWidthKey = getStrokeWidthKey(appState.currentItemStrokeWidth) ?? defaultAppState.currentItemStrokeWidthKey;
5140
5410
  }
@@ -5171,9 +5441,8 @@ var restoreAppState = (appState, localAppState) => {
5171
5441
  };
5172
5442
  };
5173
5443
  var restoreLibraryItem = (libraryItem) => {
5174
- const elements = restoreElements(
5175
- getNonDeletedElements(libraryItem.elements),
5176
- null
5444
+ const elements = getNonDeletedElements(
5445
+ restoreElements(libraryItem.elements, null)
5177
5446
  );
5178
5447
  return elements.length ? { ...libraryItem, elements } : null;
5179
5448
  };
@@ -5211,7 +5480,7 @@ var parseFileContents = async (blob) => {
5211
5480
  let contents;
5212
5481
  if (blob.type === MIME_TYPES6.png) {
5213
5482
  try {
5214
- return await (await import("./data/image-7TCIBRTP.js")).decodePngMetadata(blob);
5483
+ return await (await import("./data/image-ORD6XJVB.js")).decodePngMetadata(blob);
5215
5484
  } catch (error) {
5216
5485
  if (error.message === "INVALID") {
5217
5486
  throw new ImageSceneDataError(
@@ -5303,7 +5572,7 @@ var loadSceneOrLibraryFromBlob = async (blob, localAppState, localElements, file
5303
5572
  theme: localAppState?.theme,
5304
5573
  fileHandle: fileHandle || blob.handle || null,
5305
5574
  ...cleanAppStateForExport(data.appState || {}),
5306
- ...localAppState ? calculateScrollCenter(data.elements || [], localAppState) : {}
5575
+ ...localAppState ? getScrollToContentState(data.elements || [], localAppState) : {}
5307
5576
  },
5308
5577
  localAppState
5309
5578
  ),
@@ -5615,8 +5884,11 @@ var decodePngMetadata = async (blob) => {
5615
5884
  };
5616
5885
 
5617
5886
  export {
5618
- centerScrollOn,
5619
- calculateScrollCenter,
5887
+ DEFAULT_OVERSCROLL,
5888
+ constrainScrollState,
5889
+ getViewportForZoomWithScrollConstraints,
5890
+ zoomToFitBounds,
5891
+ getScrollToContentState,
5620
5892
  getNormalizedZoom,
5621
5893
  getNormalizedGridStep,
5622
5894
  isSomeElementSelected,
@@ -5647,6 +5919,7 @@ export {
5647
5919
  saveLibraryAsJSON,
5648
5920
  getLinkHandleFromCoords,
5649
5921
  isPointHittingLink,
5922
+ getSelectionColor,
5650
5923
  fillCircle,
5651
5924
  getNormalizedCanvasDimensions,
5652
5925
  bootstrapCanvas,
@@ -5656,7 +5929,6 @@ export {
5656
5929
  renderStaticScene,
5657
5930
  exportToCanvas,
5658
5931
  exportToSvg,
5659
- getExportSize,
5660
5932
  restoreElement,
5661
5933
  restoreElements,
5662
5934
  restoreAppState,
@@ -5685,4 +5957,4 @@ export {
5685
5957
  createFile,
5686
5958
  normalizeFile
5687
5959
  };
5688
- //# sourceMappingURL=chunk-T3GRJXT6.js.map
5960
+ //# sourceMappingURL=chunk-KKZSEXXE.js.map