@dwelle/excalidraw 0.5.0-2dbdd6f → 0.5.0-2e5786f

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 (553) hide show
  1. package/CHANGELOG.md +229 -0
  2. package/README.md +111 -14
  3. package/dist/dev/{chunk-EWKWI3K7.js → chunk-IUKF2BNN.js} +59 -5
  4. package/dist/dev/chunk-IUKF2BNN.js.map +7 -0
  5. package/dist/dev/chunk-Q67DF2PJ.js +69 -0
  6. package/dist/dev/chunk-Q67DF2PJ.js.map +7 -0
  7. package/dist/dev/{chunk-JBODKHIT.js → chunk-XFZZLSOF.js} +16745 -11631
  8. package/dist/dev/chunk-XFZZLSOF.js.map +7 -0
  9. package/dist/dev/{chunk-NYLL7DNJ.js → chunk-XRXU5XOA.js} +2 -2
  10. package/dist/dev/components/TTDDialog/{CodeMirrorEditor-PY5ZVWKQ.js → CodeMirrorEditor-GYLDZZSD.js} +2 -2
  11. package/dist/dev/data/{image-WSL7K3G4.js → image-KVOR7M3R.js} +3 -3
  12. package/dist/dev/index.css +1065 -724
  13. package/dist/dev/index.css.map +3 -3
  14. package/dist/dev/index.js +16584 -10255
  15. package/dist/dev/index.js.map +4 -4
  16. package/dist/dev/locales/{ar-SA-AGVJN2FU.js → ar-SA-EW44IW4V.js} +91 -46
  17. package/dist/dev/locales/ar-SA-EW44IW4V.js.map +7 -0
  18. package/dist/dev/locales/{az-AZ-62IXPX5D.js → az-AZ-AI7WAYA2.js} +49 -4
  19. package/dist/dev/locales/az-AZ-AI7WAYA2.js.map +7 -0
  20. package/dist/dev/locales/{bg-BG-UBDZF4KA.js → bg-BG-43ZNGDXF.js} +49 -4
  21. package/dist/dev/locales/bg-BG-43ZNGDXF.js.map +7 -0
  22. package/dist/dev/locales/{bn-BD-4TAUVZOD.js → bn-BD-PU4CN7NP.js} +49 -4
  23. package/dist/dev/locales/bn-BD-PU4CN7NP.js.map +7 -0
  24. package/dist/dev/locales/{bn-IN-PUGL2LDE.js → bn-IN-54CF43JL.js} +49 -4
  25. package/dist/dev/locales/bn-IN-54CF43JL.js.map +7 -0
  26. package/dist/dev/locales/{ca-ES-GEEW5L7T.js → ca-ES-RHJO3QDO.js} +50 -5
  27. package/dist/dev/locales/ca-ES-RHJO3QDO.js.map +7 -0
  28. package/dist/dev/locales/{cs-CZ-LNVE3QM5.js → cs-CZ-ZRSAO3BA.js} +49 -4
  29. package/dist/dev/locales/cs-CZ-ZRSAO3BA.js.map +7 -0
  30. package/dist/dev/locales/{da-DK-CAYJG7FJ.js → da-DK-OAB6DEJX.js} +49 -4
  31. package/dist/dev/locales/da-DK-OAB6DEJX.js.map +7 -0
  32. package/dist/dev/locales/{de-CH-GCXOD4LK.js → de-CH-QF7JLXTF.js} +157 -112
  33. package/dist/dev/locales/de-CH-QF7JLXTF.js.map +7 -0
  34. package/dist/dev/locales/{de-DE-CGDBECYD.js → de-DE-5ZO4KOPT.js} +157 -112
  35. package/dist/dev/locales/de-DE-5ZO4KOPT.js.map +7 -0
  36. package/dist/dev/locales/{el-GR-G5QZC24A.js → el-GR-F74ZSUEO.js} +50 -5
  37. package/dist/dev/locales/el-GR-F74ZSUEO.js.map +7 -0
  38. package/dist/dev/locales/{en-A3UOWEYW.js → en-BC4BNQRX.js} +8 -2
  39. package/dist/dev/locales/{es-ES-UMEOH76W.js → es-ES-3B3IENPS.js} +144 -99
  40. package/dist/dev/locales/es-ES-3B3IENPS.js.map +7 -0
  41. package/dist/dev/locales/{eu-ES-IWRZXJC5.js → eu-ES-NH447TVU.js} +203 -158
  42. package/dist/dev/locales/eu-ES-NH447TVU.js.map +7 -0
  43. package/dist/dev/locales/{fa-IR-QOYVIIJA.js → fa-IR-V44PNTTK.js} +68 -23
  44. package/dist/dev/locales/fa-IR-V44PNTTK.js.map +7 -0
  45. package/dist/dev/locales/{fi-FI-BXRW65OA.js → fi-FI-ZXSYWCC4.js} +49 -4
  46. package/dist/dev/locales/fi-FI-ZXSYWCC4.js.map +7 -0
  47. package/dist/dev/locales/{fr-FR-R2QH5VCW.js → fr-FR-RJSOSEYS.js} +88 -43
  48. package/dist/dev/locales/fr-FR-RJSOSEYS.js.map +7 -0
  49. package/dist/dev/locales/{gl-ES-4ES3ZADP.js → gl-ES-NAUVMVFY.js} +49 -4
  50. package/dist/dev/locales/gl-ES-NAUVMVFY.js.map +7 -0
  51. package/dist/dev/locales/{he-IL-TRQRRYPH.js → he-IL-JBKWWR75.js} +145 -100
  52. package/dist/dev/locales/he-IL-JBKWWR75.js.map +7 -0
  53. package/dist/dev/locales/{hi-IN-U46BOJEC.js → hi-IN-SD773MVZ.js} +50 -5
  54. package/dist/dev/locales/hi-IN-SD773MVZ.js.map +7 -0
  55. package/dist/dev/locales/{hu-HU-JDULJ6XL.js → hu-HU-OTA7GOAV.js} +49 -4
  56. package/dist/dev/locales/hu-HU-OTA7GOAV.js.map +7 -0
  57. package/dist/dev/locales/{id-ID-BLIXNCUT.js → id-ID-KGCGQFTT.js} +139 -94
  58. package/dist/dev/locales/id-ID-KGCGQFTT.js.map +7 -0
  59. package/dist/dev/locales/{it-IT-6TBW7RUK.js → it-IT-EWGEXMVK.js} +54 -9
  60. package/dist/dev/locales/it-IT-EWGEXMVK.js.map +7 -0
  61. package/dist/dev/locales/{ja-JP-6HYAQFYX.js → ja-JP-YMGRGBPS.js} +189 -144
  62. package/dist/dev/locales/ja-JP-YMGRGBPS.js.map +7 -0
  63. package/dist/dev/locales/{kaa-Z5UP62XJ.js → kaa-RRE7XUCW.js} +49 -4
  64. package/dist/dev/locales/kaa-RRE7XUCW.js.map +7 -0
  65. package/dist/dev/locales/{kab-KAB-Z7STWQKS.js → kab-KAB-ZCYVOJU4.js} +49 -4
  66. package/dist/dev/locales/kab-KAB-ZCYVOJU4.js.map +7 -0
  67. package/dist/dev/locales/{kk-KZ-BWHY45DX.js → kk-KZ-TO6XEFJC.js} +49 -4
  68. package/dist/dev/locales/kk-KZ-TO6XEFJC.js.map +7 -0
  69. package/dist/dev/locales/{km-KH-HGLNWNRU.js → km-KH-3HTDL5HB.js} +49 -4
  70. package/dist/dev/locales/km-KH-3HTDL5HB.js.map +7 -0
  71. package/dist/dev/locales/{ko-KR-CO36WKPC.js → ko-KR-O4L4O7L6.js} +133 -88
  72. package/dist/dev/locales/ko-KR-O4L4O7L6.js.map +7 -0
  73. package/dist/dev/locales/{ku-TR-AACVIARC.js → ku-TR-AFJWDY67.js} +49 -4
  74. package/dist/dev/locales/ku-TR-AFJWDY67.js.map +7 -0
  75. package/dist/dev/locales/{lt-LT-CFYYFLDV.js → lt-LT-7QOT2VDQ.js} +49 -4
  76. package/dist/dev/locales/lt-LT-7QOT2VDQ.js.map +7 -0
  77. package/dist/dev/locales/{lv-LV-QCBBOFFU.js → lv-LV-WV6C4NYF.js} +49 -4
  78. package/dist/dev/locales/lv-LV-WV6C4NYF.js.map +7 -0
  79. package/dist/dev/locales/{mr-IN-B2CM5GK5.js → mr-IN-3TLYWOEI.js} +52 -7
  80. package/dist/dev/locales/mr-IN-3TLYWOEI.js.map +7 -0
  81. package/dist/dev/locales/{my-MM-756BNN36.js → my-MM-NNL2QJT3.js} +49 -4
  82. package/dist/dev/locales/my-MM-NNL2QJT3.js.map +7 -0
  83. package/dist/dev/locales/{nb-NO-5BLHQI4J.js → nb-NO-PG3XLMEV.js} +50 -5
  84. package/dist/dev/locales/nb-NO-PG3XLMEV.js.map +7 -0
  85. package/dist/dev/locales/{nl-NL-225BLGAH.js → nl-NL-MMOYEKKQ.js} +59 -14
  86. package/dist/dev/locales/nl-NL-MMOYEKKQ.js.map +7 -0
  87. package/dist/dev/locales/{nn-NO-4J7MR6GH.js → nn-NO-AAC2I2YX.js} +49 -4
  88. package/dist/dev/locales/nn-NO-AAC2I2YX.js.map +7 -0
  89. package/dist/dev/locales/{oc-FR-XCETH7KF.js → oc-FR-SR6MFB4N.js} +50 -5
  90. package/dist/dev/locales/oc-FR-SR6MFB4N.js.map +7 -0
  91. package/dist/dev/locales/{pa-IN-32NBAN5L.js → pa-IN-ADGMQLQI.js} +49 -4
  92. package/dist/dev/locales/pa-IN-ADGMQLQI.js.map +7 -0
  93. package/dist/dev/locales/{percentages-ZRLRVMSI.js → percentages-X2QIQ6XJ.js} +2 -2
  94. package/dist/dev/locales/{pl-PL-R6OJ54BT.js → pl-PL-FNIPTMVP.js} +50 -5
  95. package/dist/dev/locales/pl-PL-FNIPTMVP.js.map +7 -0
  96. package/dist/dev/locales/{pt-BR-7AFGAKGR.js → pt-BR-67FMCDNE.js} +136 -91
  97. package/dist/dev/locales/pt-BR-67FMCDNE.js.map +7 -0
  98. package/dist/dev/locales/{pt-PT-S6BMW6MY.js → pt-PT-4G3GI4SF.js} +135 -90
  99. package/dist/dev/locales/pt-PT-4G3GI4SF.js.map +7 -0
  100. package/dist/dev/locales/{ro-RO-4JVGQHS2.js → ro-RO-CUZFN555.js} +54 -9
  101. package/dist/dev/locales/ro-RO-CUZFN555.js.map +7 -0
  102. package/dist/dev/locales/{ru-RU-IESI752T.js → ru-RU-4GHINTII.js} +56 -11
  103. package/dist/dev/locales/ru-RU-4GHINTII.js.map +7 -0
  104. package/dist/dev/locales/{si-LK-H75E7PKD.js → si-LK-SSNT7T4A.js} +50 -5
  105. package/dist/dev/locales/si-LK-SSNT7T4A.js.map +7 -0
  106. package/dist/dev/locales/{sk-SK-EUK2NR2F.js → sk-SK-J7TKZQEH.js} +87 -42
  107. package/dist/dev/locales/sk-SK-J7TKZQEH.js.map +7 -0
  108. package/dist/dev/locales/{sl-SI-AKW7R5PW.js → sl-SI-SIBMLDYY.js} +135 -90
  109. package/dist/dev/locales/sl-SI-SIBMLDYY.js.map +7 -0
  110. package/dist/dev/locales/{sv-SE-QIBOOXLJ.js → sv-SE-6GYGFZNL.js} +132 -87
  111. package/dist/dev/locales/sv-SE-6GYGFZNL.js.map +7 -0
  112. package/dist/dev/locales/{ta-IN-LBK2NQ5K.js → ta-IN-7AW6CTGA.js} +49 -4
  113. package/dist/dev/locales/ta-IN-7AW6CTGA.js.map +7 -0
  114. package/dist/dev/locales/{th-TH-YJ2E6GVT.js → th-TH-FP7ULYYM.js} +98 -53
  115. package/dist/dev/locales/th-TH-FP7ULYYM.js.map +7 -0
  116. package/dist/dev/locales/{tr-TR-Y5GO2XJW.js → tr-TR-UDQGNXAG.js} +126 -81
  117. package/dist/dev/locales/tr-TR-UDQGNXAG.js.map +7 -0
  118. package/dist/dev/locales/{uk-UA-XYAFHHJW.js → uk-UA-25HL2NCU.js} +109 -64
  119. package/dist/dev/locales/uk-UA-25HL2NCU.js.map +7 -0
  120. package/dist/dev/locales/{uz-UZ-LF3CBRYE.js → uz-UZ-OPSBAY4H.js} +49 -4
  121. package/dist/dev/locales/uz-UZ-OPSBAY4H.js.map +7 -0
  122. package/dist/dev/locales/{vi-VN-WDPZEUOJ.js → vi-VN-DK367UGA.js} +49 -4
  123. package/dist/dev/locales/vi-VN-DK367UGA.js.map +7 -0
  124. package/dist/dev/locales/{zh-CN-SZ37453H.js → zh-CN-QCVKNWUH.js} +88 -43
  125. package/dist/dev/locales/zh-CN-QCVKNWUH.js.map +7 -0
  126. package/dist/dev/locales/{zh-HK-QDQ5QNBC.js → zh-HK-WFGYHWPG.js} +49 -4
  127. package/dist/dev/locales/zh-HK-WFGYHWPG.js.map +7 -0
  128. package/dist/dev/locales/{zh-TW-CYU6GFBV.js → zh-TW-WHQS4ZSD.js} +134 -89
  129. package/dist/dev/locales/zh-TW-WHQS4ZSD.js.map +7 -0
  130. package/dist/dev/subset-shared.chunk.js +1 -1
  131. package/dist/dev/subset-worker.chunk.js +1 -1
  132. package/dist/prod/chunk-DYU5D34O.js +1 -0
  133. package/dist/prod/chunk-FZAZBDSE.js +12 -0
  134. package/dist/prod/chunk-OKMKEMDC.js +35 -0
  135. package/dist/prod/{chunk-ZV7TQH6J.js → chunk-RX4U73MO.js} +1 -1
  136. package/dist/prod/components/TTDDialog/{CodeMirrorEditor-M5ZUJBXD.js → CodeMirrorEditor-TTO5E5XX.js} +1 -1
  137. package/dist/prod/data/image-QH2OFXIG.js +1 -0
  138. package/dist/prod/index.css +1 -1
  139. package/dist/prod/index.js +67 -98
  140. package/dist/prod/locales/ar-SA-5WIASEJP.js +10 -0
  141. package/dist/prod/locales/az-AZ-V5EUQD6C.js +1 -0
  142. package/dist/prod/locales/bg-BG-EXASCMTR.js +5 -0
  143. package/dist/prod/locales/bn-BD-U4SYNFCO.js +3 -0
  144. package/dist/prod/locales/bn-IN-HKDJIITE.js +3 -0
  145. package/dist/prod/locales/ca-ES-2KGUU5XB.js +8 -0
  146. package/dist/prod/locales/cs-CZ-VUCGPRML.js +7 -0
  147. package/dist/prod/locales/da-DK-NNDP2IVP.js +2 -0
  148. package/dist/prod/locales/de-CH-I7RAVIZN.js +11 -0
  149. package/dist/prod/locales/de-DE-WBQ3DQLR.js +11 -0
  150. package/dist/prod/locales/el-GR-TYQHVGXW.js +7 -0
  151. package/dist/prod/locales/en-R7FWCZ5G.js +1 -0
  152. package/dist/prod/locales/es-ES-JEUOREKJ.js +12 -0
  153. package/dist/prod/locales/eu-ES-SO5DEEAN.js +8 -0
  154. package/dist/prod/locales/fa-IR-I4JNTJHK.js +9 -0
  155. package/dist/prod/locales/fi-FI-REAEF6HQ.js +6 -0
  156. package/dist/prod/locales/fr-FR-SUCL7J6B.js +12 -0
  157. package/dist/prod/locales/gl-ES-KHCSOGVH.js +6 -0
  158. package/dist/prod/locales/he-IL-JYXVXV2Q.js +9 -0
  159. package/dist/prod/locales/hi-IN-BU52H3BO.js +3 -0
  160. package/dist/prod/locales/hu-HU-OWADXDQ3.js +3 -0
  161. package/dist/prod/locales/id-ID-2WY7E4VX.js +8 -0
  162. package/dist/prod/locales/it-IT-INVHSAJF.js +12 -0
  163. package/dist/prod/locales/ja-JP-JBNTKYP4.js +12 -0
  164. package/dist/prod/locales/kaa-TC3VIB7V.js +1 -0
  165. package/dist/prod/locales/kab-KAB-UOUDSQKM.js +4 -0
  166. package/dist/prod/locales/kk-KZ-P5H2X7YS.js +1 -0
  167. package/dist/prod/locales/km-KH-IHMV2US7.js +7 -0
  168. package/dist/prod/locales/ko-KR-ZTMANIDF.js +5 -0
  169. package/dist/prod/locales/ku-TR-GPJTRB5G.js +6 -0
  170. package/dist/prod/locales/lt-LT-V3XDOK3P.js +3 -0
  171. package/dist/prod/locales/lv-LV-DVQ3FADO.js +4 -0
  172. package/dist/prod/locales/mr-IN-VZ6HH5FE.js +9 -0
  173. package/dist/prod/locales/my-MM-XYKWHRK6.js +1 -0
  174. package/dist/prod/locales/nb-NO-UNO2GGZJ.js +8 -0
  175. package/dist/prod/locales/nl-NL-76EFHT4P.js +13 -0
  176. package/dist/prod/locales/nn-NO-CFKD7ABE.js +4 -0
  177. package/dist/prod/locales/oc-FR-YBJTCJ3J.js +4 -0
  178. package/dist/prod/locales/pa-IN-SNOXSMRV.js +4 -0
  179. package/dist/prod/locales/percentages-LWOC67ZH.js +1 -0
  180. package/dist/prod/locales/pl-PL-BSY6YFZ3.js +12 -0
  181. package/dist/prod/locales/pt-BR-CZDV62R3.js +10 -0
  182. package/dist/prod/locales/pt-PT-JO57XJJW.js +12 -0
  183. package/dist/prod/locales/ro-RO-UZ5ICYYN.js +12 -0
  184. package/dist/prod/locales/ru-RU-AN7JPREC.js +10 -0
  185. package/dist/prod/locales/si-LK-7CBLD6QQ.js +1 -0
  186. package/dist/prod/locales/sk-SK-SWR6DKBI.js +7 -0
  187. package/dist/prod/locales/sl-SI-QY5KCFGA.js +8 -0
  188. package/dist/prod/locales/sv-SE-O3OFCY3J.js +12 -0
  189. package/dist/prod/locales/ta-IN-V6NHHU6Z.js +6 -0
  190. package/dist/prod/locales/th-TH-WLSZUSBX.js +1 -0
  191. package/dist/prod/locales/tr-TR-GUFYG22B.js +4 -0
  192. package/dist/prod/locales/uk-UA-K6SV5NFQ.js +6 -0
  193. package/dist/prod/locales/uz-UZ-TVKTZO2G.js +1 -0
  194. package/dist/prod/locales/vi-VN-7FKFXJNO.js +7 -0
  195. package/dist/prod/locales/zh-CN-AOKVLNNK.js +11 -0
  196. package/dist/prod/locales/zh-HK-CDKPF5DC.js +1 -0
  197. package/dist/prod/locales/zh-TW-ZVGYESGW.js +13 -0
  198. package/dist/prod/subset-shared.chunk.js +1 -1
  199. package/dist/prod/subset-worker.chunk.js +1 -1
  200. package/dist/types/common/src/appEventBus.d.ts +27 -0
  201. package/dist/types/common/src/colors.d.ts +23 -1
  202. package/dist/types/common/src/constants.d.ts +66 -7
  203. package/dist/types/common/src/index.d.ts +2 -0
  204. package/dist/types/common/src/keys.d.ts +4 -0
  205. package/dist/types/common/src/points.d.ts +1 -1
  206. package/dist/types/common/src/random.d.ts +7 -0
  207. package/dist/types/common/src/utils.d.ts +7 -46
  208. package/dist/types/common/src/versionedSnapshotStore.d.ts +17 -0
  209. package/dist/types/element/src/Scene.d.ts +7 -5
  210. package/dist/types/element/src/align.d.ts +2 -2
  211. package/dist/types/element/src/arrowEndpointText.d.ts +49 -0
  212. package/dist/types/element/src/arrows/focus.d.ts +5 -2
  213. package/dist/types/element/src/binding.d.ts +28 -13
  214. package/dist/types/element/src/bounds.d.ts +22 -7
  215. package/dist/types/element/src/bucketFill.d.ts +110 -0
  216. package/dist/types/element/src/collision.d.ts +14 -5
  217. package/dist/types/element/src/comparisons.d.ts +8 -5
  218. package/dist/types/element/src/convertToShape.d.ts +23 -0
  219. package/dist/types/element/src/delta.d.ts +23 -1
  220. package/dist/types/element/src/distribute.d.ts +2 -2
  221. package/dist/types/element/src/dragElements.d.ts +27 -0
  222. package/dist/types/element/src/duplicate.d.ts +64 -3
  223. package/dist/types/element/src/embeddable.d.ts +2 -2
  224. package/dist/types/element/src/flowchart.d.ts +11 -7
  225. package/dist/types/element/src/fractionalIndex.d.ts +2 -2
  226. package/dist/types/element/src/frame.d.ts +11 -10
  227. package/dist/types/element/src/groups.d.ts +9 -9
  228. package/dist/types/element/src/index.d.ts +6 -1
  229. package/dist/types/element/src/linearElementEditor.d.ts +27 -10
  230. package/dist/types/element/src/listMarker.d.ts +34 -0
  231. package/dist/types/element/src/mutateElement.d.ts +1 -1
  232. package/dist/types/element/src/newElement.d.ts +53 -3
  233. package/dist/types/element/src/renderElement.d.ts +21 -7
  234. package/dist/types/element/src/resizeElements.d.ts +2 -2
  235. package/dist/types/element/src/selection.d.ts +7 -7
  236. package/dist/types/element/src/shape.d.ts +27 -1
  237. package/dist/types/element/src/sizeHelpers.d.ts +6 -0
  238. package/dist/types/element/src/sortElements.d.ts +10 -0
  239. package/dist/types/element/src/stickyNote.d.ts +183 -0
  240. package/dist/types/element/src/textElement.d.ts +20 -9
  241. package/dist/types/element/src/transform.d.ts +26 -7
  242. package/dist/types/element/src/typeChecks.d.ts +29 -27
  243. package/dist/types/element/src/types.d.ts +43 -7
  244. package/dist/types/element/src/utils.d.ts +15 -4
  245. package/dist/types/element/src/zindex.d.ts +2 -2
  246. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +92 -26
  247. package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
  248. package/dist/types/excalidraw/actions/actionBoundText.d.ts +62 -18
  249. package/dist/types/excalidraw/actions/actionCanvas.d.ts +385 -753
  250. package/dist/types/excalidraw/actions/actionClipboard.d.ts +62 -18
  251. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +31 -9
  252. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +96 -29
  253. package/dist/types/excalidraw/actions/actionDeselect.d.ts +182 -0
  254. package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -3
  255. package/dist/types/excalidraw/actions/actionElementLink.d.ts +31 -9
  256. package/dist/types/excalidraw/actions/actionElementLock.d.ts +63 -19
  257. package/dist/types/excalidraw/actions/actionExport.d.ts +165 -395
  258. package/dist/types/excalidraw/actions/actionFinalize.d.ts +1 -0
  259. package/dist/types/excalidraw/actions/actionFrame.d.ts +156 -213
  260. package/dist/types/excalidraw/actions/actionGroup.d.ts +77 -33
  261. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +86 -12
  262. package/dist/types/excalidraw/actions/actionLink.d.ts +32 -10
  263. package/dist/types/excalidraw/actions/actionMenu.d.ts +31 -9
  264. package/dist/types/excalidraw/actions/actionProperties.d.ts +100 -40
  265. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +37 -15
  266. package/dist/types/excalidraw/actions/actionStyles.d.ts +31 -9
  267. package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +1 -1
  268. package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +32 -10
  269. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +35 -14
  270. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +32 -10
  271. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +32 -10
  272. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +35 -14
  273. package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +1 -1
  274. package/dist/types/excalidraw/actions/{actionEmbeddable.d.ts → actionToggleShowHints.d.ts} +47 -22
  275. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +32 -10
  276. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +33 -11
  277. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +32 -10
  278. package/dist/types/excalidraw/actions/colorTargets.d.ts +39 -0
  279. package/dist/types/excalidraw/actions/index.d.ts +3 -2
  280. package/dist/types/excalidraw/actions/manager.d.ts +1 -0
  281. package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
  282. package/dist/types/excalidraw/actions/types.d.ts +8 -4
  283. package/dist/types/excalidraw/{animated-trail.d.ts → animatedTrail.d.ts} +4 -3
  284. package/dist/types/excalidraw/appState.d.ts +51 -27
  285. package/dist/types/excalidraw/clipboard.d.ts +2 -3
  286. package/dist/types/excalidraw/components/Actions.d.ts +17 -12
  287. package/dist/types/excalidraw/components/ActiveConfirmDialog.d.ts +1 -1
  288. package/dist/types/excalidraw/components/App.arrowText.d.ts +70 -0
  289. package/dist/types/excalidraw/components/App.bucketFill.d.ts +48 -0
  290. package/dist/types/excalidraw/components/App.clipboard.d.ts +31 -0
  291. package/dist/types/excalidraw/components/App.cursor.d.ts +38 -0
  292. package/dist/types/excalidraw/components/App.d.ts +342 -123
  293. package/dist/types/excalidraw/components/App.drawshape.d.ts +55 -0
  294. package/dist/types/excalidraw/components/App.duplicate.d.ts +101 -0
  295. package/dist/types/excalidraw/components/App.flowchart.d.ts +21 -0
  296. package/dist/types/excalidraw/components/App.modifiers.d.ts +38 -0
  297. package/dist/types/excalidraw/components/App.pan.d.ts +62 -0
  298. package/dist/types/excalidraw/components/App.selectionTool.d.ts +57 -0
  299. package/dist/types/excalidraw/components/App.text.d.ts +146 -0
  300. package/dist/types/excalidraw/components/App.textTool.d.ts +140 -0
  301. package/dist/types/excalidraw/components/App.toolDrag.d.ts +63 -0
  302. package/dist/types/excalidraw/components/App.viewport.d.ts +113 -0
  303. package/dist/types/excalidraw/components/App.wheel.d.ts +26 -0
  304. package/dist/types/excalidraw/components/AppStateObserver.d.ts +37 -0
  305. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +9 -3
  306. package/dist/types/excalidraw/components/ColorPicker/CustomColorList.d.ts +3 -1
  307. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +5 -1
  308. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +9 -2
  309. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +4 -2
  310. package/dist/types/excalidraw/components/ColorPicker/TopPicks.d.ts +8 -1
  311. package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -1
  312. package/dist/types/excalidraw/components/ColorPicker/colorTopPicksDnD.d.ts +11 -0
  313. package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -1
  314. package/dist/types/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -2
  315. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +2 -2
  316. package/dist/types/excalidraw/components/CursorHint.d.ts +46 -0
  317. package/dist/types/excalidraw/components/EyeDropper.d.ts +1 -1
  318. package/dist/types/excalidraw/components/FileDropOverlay.d.ts +2 -0
  319. package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +4 -1
  320. package/dist/types/excalidraw/components/FontPicker/FontPickerList.d.ts +6 -1
  321. package/dist/types/excalidraw/components/FontPicker/fontTopPicksDnD.d.ts +12 -0
  322. package/dist/types/excalidraw/components/IconButton.d.ts +48 -0
  323. package/dist/types/excalidraw/components/Island.d.ts +7 -0
  324. package/dist/types/excalidraw/components/LaserPointerButton.d.ts +2 -4
  325. package/dist/types/excalidraw/components/LayerUI.d.ts +5 -3
  326. package/dist/types/excalidraw/components/LibraryMenu.d.ts +1 -1
  327. package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +6 -2
  328. package/dist/types/excalidraw/components/LibraryUnit.d.ts +7 -2
  329. package/dist/types/excalidraw/components/LockButton.d.ts +3 -4
  330. package/dist/types/excalidraw/components/MagicButton.d.ts +0 -2
  331. package/dist/types/excalidraw/components/MobileMenu.d.ts +4 -4
  332. package/dist/types/excalidraw/components/MobileToolbar.d.ts +9 -0
  333. package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  334. package/dist/types/excalidraw/components/PenModeButton.d.ts +2 -5
  335. package/dist/types/excalidraw/components/Popover.d.ts +1 -3
  336. package/dist/types/excalidraw/components/{ButtonIcon.d.ts → RadioButton.d.ts} +2 -5
  337. package/dist/types/excalidraw/components/SVGLayer.d.ts +1 -1
  338. package/dist/types/excalidraw/components/SearchMenu.d.ts +1 -1
  339. package/dist/types/excalidraw/components/Sidebar/Sidebar.d.ts +1 -1
  340. package/dist/types/excalidraw/components/Stats/Angle.d.ts +2 -2
  341. package/dist/types/excalidraw/components/Stats/Dimension.d.ts +2 -2
  342. package/dist/types/excalidraw/components/Stats/DragInput.d.ts +2 -2
  343. package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +2 -2
  344. package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +2 -2
  345. package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +2 -2
  346. package/dist/types/excalidraw/components/Stats/Position.d.ts +3 -3
  347. package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
  348. package/dist/types/excalidraw/components/TTDDialog/TTDContext.d.ts +4 -4
  349. package/dist/types/excalidraw/components/TTDDialog/useTTDChatStorage.d.ts +3 -3
  350. package/dist/types/excalidraw/components/TTDDialog/utils/TTDStreamFetch.d.ts +2 -1
  351. package/dist/types/excalidraw/components/Toast.d.ts +8 -4
  352. package/dist/types/excalidraw/components/ToolPopover.d.ts +3 -6
  353. package/dist/types/excalidraw/components/Toolbar.d.ts +11 -0
  354. package/dist/types/excalidraw/components/Tools.d.ts +151 -0
  355. package/dist/types/excalidraw/components/Tooltip.d.ts +15 -1
  356. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksContextMenu.d.ts +14 -0
  357. package/dist/types/excalidraw/components/TopPicksDnD/TopPicksTip.d.ts +11 -0
  358. package/dist/types/excalidraw/components/TopPicksDnD/topPicksDnD.d.ts +58 -0
  359. package/dist/types/excalidraw/components/UserList.d.ts +3 -2
  360. package/dist/types/excalidraw/components/ViewportStatusFrame/ViewportStatusFrame.d.ts +11 -0
  361. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +3 -1
  362. package/dist/types/excalidraw/components/canvases/NewElementCanvas.d.ts +3 -0
  363. package/dist/types/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
  364. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +2 -1
  365. package/dist/types/excalidraw/components/footer/Footer.d.ts +3 -1
  366. package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +2 -2
  367. package/dist/types/excalidraw/components/icons.d.ts +7 -1
  368. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +10 -4
  369. package/dist/types/excalidraw/components/positionElementBesideCursor.d.ts +26 -0
  370. package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +39 -0
  371. package/dist/types/excalidraw/data/blob.d.ts +201 -156
  372. package/dist/types/excalidraw/data/filesystem.d.ts +3 -5
  373. package/dist/types/excalidraw/data/index.d.ts +6 -7
  374. package/dist/types/excalidraw/data/json.d.ts +109 -78
  375. package/dist/types/excalidraw/data/library.d.ts +1 -1
  376. package/dist/types/excalidraw/data/resave.d.ts +7 -2
  377. package/dist/types/excalidraw/data/restore.d.ts +1 -1
  378. package/dist/types/excalidraw/drawShapeTrail.d.ts +16 -0
  379. package/dist/types/excalidraw/eraser/index.d.ts +2 -3
  380. package/dist/types/excalidraw/fonts/Fonts.d.ts +3 -2
  381. package/dist/types/excalidraw/hooks/useAppStateValue.d.ts +29 -0
  382. package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  383. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +5 -5
  384. package/dist/types/excalidraw/index.d.ts +33 -8
  385. package/dist/types/excalidraw/{laser-trails.d.ts → laserTrails.d.ts} +5 -7
  386. package/dist/types/excalidraw/lasso/index.d.ts +2 -3
  387. package/dist/types/excalidraw/lasso/utils.d.ts +2 -0
  388. package/dist/types/excalidraw/renderOverrides.d.ts +9 -0
  389. package/dist/types/excalidraw/renderer/animation.d.ts +5 -1
  390. package/dist/types/excalidraw/renderer/helpers.d.ts +25 -0
  391. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +2 -4
  392. package/dist/types/excalidraw/scene/Renderer.d.ts +489 -20
  393. package/dist/types/excalidraw/scene/export.d.ts +3 -3
  394. package/dist/types/excalidraw/scene/index.d.ts +2 -2
  395. package/dist/types/excalidraw/scene/types.d.ts +7 -5
  396. package/dist/types/excalidraw/snapping.d.ts +7 -7
  397. package/dist/types/excalidraw/types.d.ts +601 -72
  398. package/dist/types/excalidraw/viewport.d.ts +302 -0
  399. package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +13 -3
  400. package/dist/types/fractional-indexing/src/index.d.ts +29 -0
  401. package/dist/types/laser-pointer/src/index.d.ts +2 -0
  402. package/dist/types/laser-pointer/src/math.d.ts +16 -0
  403. package/dist/types/laser-pointer/src/simplify.d.ts +2 -0
  404. package/dist/types/laser-pointer/src/state.d.ts +36 -0
  405. package/dist/types/math/src/constants.d.ts +0 -1
  406. package/dist/types/math/src/curve.d.ts +23 -13
  407. package/dist/types/math/src/index.d.ts +1 -0
  408. package/dist/types/math/src/pca.d.ts +79 -0
  409. package/dist/types/math/src/point.d.ts +1 -0
  410. package/dist/types/math/src/polygon.d.ts +25 -1
  411. package/dist/types/math/src/segment.d.ts +6 -0
  412. package/dist/types/utils/src/shape.d.ts +2 -2
  413. package/package.json +4 -5
  414. package/dist/dev/chunk-EWKWI3K7.js.map +0 -7
  415. package/dist/dev/chunk-JBODKHIT.js.map +0 -7
  416. package/dist/dev/chunk-URPEKBQ3.js +0 -69
  417. package/dist/dev/chunk-URPEKBQ3.js.map +0 -7
  418. package/dist/dev/locales/ar-SA-AGVJN2FU.js.map +0 -7
  419. package/dist/dev/locales/az-AZ-62IXPX5D.js.map +0 -7
  420. package/dist/dev/locales/bg-BG-UBDZF4KA.js.map +0 -7
  421. package/dist/dev/locales/bn-BD-4TAUVZOD.js.map +0 -7
  422. package/dist/dev/locales/bn-IN-PUGL2LDE.js.map +0 -7
  423. package/dist/dev/locales/ca-ES-GEEW5L7T.js.map +0 -7
  424. package/dist/dev/locales/cs-CZ-LNVE3QM5.js.map +0 -7
  425. package/dist/dev/locales/da-DK-CAYJG7FJ.js.map +0 -7
  426. package/dist/dev/locales/de-CH-GCXOD4LK.js.map +0 -7
  427. package/dist/dev/locales/de-DE-CGDBECYD.js.map +0 -7
  428. package/dist/dev/locales/el-GR-G5QZC24A.js.map +0 -7
  429. package/dist/dev/locales/es-ES-UMEOH76W.js.map +0 -7
  430. package/dist/dev/locales/eu-ES-IWRZXJC5.js.map +0 -7
  431. package/dist/dev/locales/fa-IR-QOYVIIJA.js.map +0 -7
  432. package/dist/dev/locales/fi-FI-BXRW65OA.js.map +0 -7
  433. package/dist/dev/locales/fr-FR-R2QH5VCW.js.map +0 -7
  434. package/dist/dev/locales/gl-ES-4ES3ZADP.js.map +0 -7
  435. package/dist/dev/locales/he-IL-TRQRRYPH.js.map +0 -7
  436. package/dist/dev/locales/hi-IN-U46BOJEC.js.map +0 -7
  437. package/dist/dev/locales/hu-HU-JDULJ6XL.js.map +0 -7
  438. package/dist/dev/locales/id-ID-BLIXNCUT.js.map +0 -7
  439. package/dist/dev/locales/it-IT-6TBW7RUK.js.map +0 -7
  440. package/dist/dev/locales/ja-JP-6HYAQFYX.js.map +0 -7
  441. package/dist/dev/locales/kaa-Z5UP62XJ.js.map +0 -7
  442. package/dist/dev/locales/kab-KAB-Z7STWQKS.js.map +0 -7
  443. package/dist/dev/locales/kk-KZ-BWHY45DX.js.map +0 -7
  444. package/dist/dev/locales/km-KH-HGLNWNRU.js.map +0 -7
  445. package/dist/dev/locales/ko-KR-CO36WKPC.js.map +0 -7
  446. package/dist/dev/locales/ku-TR-AACVIARC.js.map +0 -7
  447. package/dist/dev/locales/lt-LT-CFYYFLDV.js.map +0 -7
  448. package/dist/dev/locales/lv-LV-QCBBOFFU.js.map +0 -7
  449. package/dist/dev/locales/mr-IN-B2CM5GK5.js.map +0 -7
  450. package/dist/dev/locales/my-MM-756BNN36.js.map +0 -7
  451. package/dist/dev/locales/nb-NO-5BLHQI4J.js.map +0 -7
  452. package/dist/dev/locales/nl-NL-225BLGAH.js.map +0 -7
  453. package/dist/dev/locales/nn-NO-4J7MR6GH.js.map +0 -7
  454. package/dist/dev/locales/oc-FR-XCETH7KF.js.map +0 -7
  455. package/dist/dev/locales/pa-IN-32NBAN5L.js.map +0 -7
  456. package/dist/dev/locales/pl-PL-R6OJ54BT.js.map +0 -7
  457. package/dist/dev/locales/pt-BR-7AFGAKGR.js.map +0 -7
  458. package/dist/dev/locales/pt-PT-S6BMW6MY.js.map +0 -7
  459. package/dist/dev/locales/ro-RO-4JVGQHS2.js.map +0 -7
  460. package/dist/dev/locales/ru-RU-IESI752T.js.map +0 -7
  461. package/dist/dev/locales/si-LK-H75E7PKD.js.map +0 -7
  462. package/dist/dev/locales/sk-SK-EUK2NR2F.js.map +0 -7
  463. package/dist/dev/locales/sl-SI-AKW7R5PW.js.map +0 -7
  464. package/dist/dev/locales/sv-SE-QIBOOXLJ.js.map +0 -7
  465. package/dist/dev/locales/ta-IN-LBK2NQ5K.js.map +0 -7
  466. package/dist/dev/locales/th-TH-YJ2E6GVT.js.map +0 -7
  467. package/dist/dev/locales/tr-TR-Y5GO2XJW.js.map +0 -7
  468. package/dist/dev/locales/uk-UA-XYAFHHJW.js.map +0 -7
  469. package/dist/dev/locales/uz-UZ-LF3CBRYE.js.map +0 -7
  470. package/dist/dev/locales/vi-VN-WDPZEUOJ.js.map +0 -7
  471. package/dist/dev/locales/zh-CN-SZ37453H.js.map +0 -7
  472. package/dist/dev/locales/zh-HK-QDQ5QNBC.js.map +0 -7
  473. package/dist/dev/locales/zh-TW-CYU6GFBV.js.map +0 -7
  474. package/dist/prod/chunk-33L4EPXN.js +0 -34
  475. package/dist/prod/chunk-3PELD44J.js +0 -1
  476. package/dist/prod/chunk-DF5Y7EC7.js +0 -12
  477. package/dist/prod/data/image-57VVPCM3.js +0 -1
  478. package/dist/prod/locales/ar-SA-NXDWD63E.js +0 -8
  479. package/dist/prod/locales/az-AZ-MXSORGZV.js +0 -1
  480. package/dist/prod/locales/bg-BG-O6MV2KSF.js +0 -5
  481. package/dist/prod/locales/bn-BD-T2VJNT7N.js +0 -3
  482. package/dist/prod/locales/bn-IN-MMW2ORAC.js +0 -3
  483. package/dist/prod/locales/ca-ES-MKBCGNOG.js +0 -8
  484. package/dist/prod/locales/cs-CZ-V77HGUP7.js +0 -7
  485. package/dist/prod/locales/da-DK-I5RFNTM4.js +0 -2
  486. package/dist/prod/locales/de-CH-WLRDEVBV.js +0 -7
  487. package/dist/prod/locales/de-DE-DTI4WUSC.js +0 -7
  488. package/dist/prod/locales/el-GR-ZXDJ2OS4.js +0 -7
  489. package/dist/prod/locales/en-QI57FMQH.js +0 -1
  490. package/dist/prod/locales/es-ES-DYQHAD43.js +0 -7
  491. package/dist/prod/locales/eu-ES-QDSYU5Y3.js +0 -7
  492. package/dist/prod/locales/fa-IR-26LZG4PM.js +0 -9
  493. package/dist/prod/locales/fi-FI-6YS4KDE4.js +0 -6
  494. package/dist/prod/locales/fr-FR-BRLLPTZC.js +0 -12
  495. package/dist/prod/locales/gl-ES-OKUZTLYG.js +0 -6
  496. package/dist/prod/locales/he-IL-26MGYIU7.js +0 -8
  497. package/dist/prod/locales/hi-IN-Q4ZOGTP2.js +0 -3
  498. package/dist/prod/locales/hu-HU-P2OXPSN5.js +0 -3
  499. package/dist/prod/locales/id-ID-2EIKXYN6.js +0 -8
  500. package/dist/prod/locales/it-IT-4CFKVXI2.js +0 -12
  501. package/dist/prod/locales/ja-JP-MAND2Z4V.js +0 -7
  502. package/dist/prod/locales/kaa-HQRTCXTJ.js +0 -1
  503. package/dist/prod/locales/kab-KAB-JKIKKTGH.js +0 -4
  504. package/dist/prod/locales/kk-KZ-HXQ63ZFC.js +0 -1
  505. package/dist/prod/locales/km-KH-PKL3LSGX.js +0 -7
  506. package/dist/prod/locales/ko-KR-KXLREZX3.js +0 -5
  507. package/dist/prod/locales/ku-TR-MJ4IER3X.js +0 -6
  508. package/dist/prod/locales/lt-LT-H6WFQ6FJ.js +0 -3
  509. package/dist/prod/locales/lv-LV-GOCK6SJW.js +0 -4
  510. package/dist/prod/locales/mr-IN-IXVLDMEQ.js +0 -9
  511. package/dist/prod/locales/my-MM-YG6MYTTD.js +0 -1
  512. package/dist/prod/locales/nb-NO-XGWJISD2.js +0 -8
  513. package/dist/prod/locales/nl-NL-XVDVCPNC.js +0 -13
  514. package/dist/prod/locales/nn-NO-EMX5MJX5.js +0 -4
  515. package/dist/prod/locales/oc-FR-ROEINTVO.js +0 -4
  516. package/dist/prod/locales/pa-IN-ZYN6SUDY.js +0 -4
  517. package/dist/prod/locales/percentages-5DKR754L.js +0 -1
  518. package/dist/prod/locales/pl-PL-6VTG7PHC.js +0 -12
  519. package/dist/prod/locales/pt-BR-5YFKRR5G.js +0 -6
  520. package/dist/prod/locales/pt-PT-GEIXXZ67.js +0 -8
  521. package/dist/prod/locales/ro-RO-E2P6TFZI.js +0 -12
  522. package/dist/prod/locales/ru-RU-YBIIY43T.js +0 -10
  523. package/dist/prod/locales/si-LK-673C2CI2.js +0 -1
  524. package/dist/prod/locales/sk-SK-CKZHQ4AP.js +0 -7
  525. package/dist/prod/locales/sl-SI-557H2GWM.js +0 -6
  526. package/dist/prod/locales/sv-SE-XOPKKDWS.js +0 -8
  527. package/dist/prod/locales/ta-IN-XBH7DQI3.js +0 -6
  528. package/dist/prod/locales/th-TH-TOCWH3R4.js +0 -1
  529. package/dist/prod/locales/tr-TR-GXW6CYY5.js +0 -4
  530. package/dist/prod/locales/uk-UA-IJKTNUDG.js +0 -6
  531. package/dist/prod/locales/uz-UZ-TBZZEA4V.js +0 -1
  532. package/dist/prod/locales/vi-VN-MULSGNVB.js +0 -7
  533. package/dist/prod/locales/zh-CN-MVX3E32U.js +0 -11
  534. package/dist/prod/locales/zh-HK-JNU5RLIE.js +0 -1
  535. package/dist/prod/locales/zh-TW-LENVCA6T.js +0 -9
  536. package/dist/types/excalidraw/animation-frame-handler.d.ts +0 -16
  537. package/dist/types/excalidraw/components/FollowMode/FollowMode.d.ts +0 -10
  538. package/dist/types/excalidraw/components/HandButton.d.ts +0 -10
  539. package/dist/types/excalidraw/components/MobileToolBar.d.ts +0 -10
  540. package/dist/types/excalidraw/components/ToolButton.d.ts +0 -49
  541. package/dist/types/excalidraw/components/shapes.d.ts +0 -263
  542. package/dist/types/excalidraw/cursor.d.ts +0 -5
  543. package/dist/types/excalidraw/scene/scroll.d.ts +0 -18
  544. package/dist/types/excalidraw/scene/scrollConstraints.d.ts +0 -46
  545. package/dist/types/excalidraw/scene/zoom.d.ts +0 -12
  546. package/dist/types/utils/src/bbox.d.ts +0 -9
  547. package/dist/types/utils/src/index.d.ts +0 -4
  548. package/dist/types/utils/src/withinBounds.d.ts +0 -19
  549. /package/dist/dev/{chunk-NYLL7DNJ.js.map → chunk-XRXU5XOA.js.map} +0 -0
  550. /package/dist/dev/components/TTDDialog/{CodeMirrorEditor-PY5ZVWKQ.js.map → CodeMirrorEditor-GYLDZZSD.js.map} +0 -0
  551. /package/dist/dev/data/{image-WSL7K3G4.js.map → image-KVOR7M3R.js.map} +0 -0
  552. /package/dist/dev/locales/{en-A3UOWEYW.js.map → en-BC4BNQRX.js.map} +0 -0
  553. /package/dist/dev/locales/{percentages-ZRLRVMSI.js.map → percentages-X2QIQ6XJ.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -11,8 +11,237 @@ The change should be grouped under one of the below section and must contain PR
11
11
  Please add the latest change on the top under the correct section.
12
12
  -->
13
13
 
14
+ ## Unreleased
15
+
16
+ ### Wheel navigation (2026-09-13) [#XXXX](https://github.com/excalidraw/excalidraw/pull/XXXX)
17
+
18
+ - Scrolling while holding the wheel (middle) mouse button zooms the canvas around the pointer, the same as ctrl/cmd+wheel — a wheel-button pan can be zoomed one-handed, without reaching for a modifier.
19
+ - New `appState.inputDevice` preference (`"auto" | "mouse" | "trackpad"`, default `"auto"`, persisted in browser storage) selecting the wheel mappings. With `"trackpad"` a plain wheel pans; with `"mouse"` a plain wheel zooms. Ctrl/cmd+wheel (how a pinch is delivered) zooms with either device. Shift+wheel pans horizontally, and ctrl/cmd+shift+wheel pans vertically. The wheel-button zoom above is unaffected. `"auto"` is reserved for detecting the device from the wheel events and resolves to `"trackpad"` until that is implemented (`resolveInputDevice()`). Set it from the new "Input device" radio in the main menu's preferences submenu, also exposed as `MainMenu.DefaultItems.Preferences.InputDevice`.
20
+
21
+ ### Sticky notes (2026-09-06) [#XXXX](https://github.com/excalidraw/excalidraw/pull/XXXX)
22
+
23
+ - New `stickynote` element type and toolbar tool (`N`): an always-filled, flat-rendered note whose label auto-fits — the font shrinks from the user's size down to a minimum, and only then does the note grow in height (it never shrinks below the height the user gave it). Click to place a 250×250 note, drag to size it (previewed at the dragged size, snapped to a font-aware minimum on release); text editing starts right away.
24
+ - Element model: the note carries `baseHeight` (the user's height; `height ≥ baseHeight`), its label carries `baseFontSize` (the user's font ceiling, `null`/absent on any other text) while `fontSize` holds the fitted size. Read a text element's user-facing size through `getBaseFontSize(text, elementsMap)`.
25
+ - Sticky notes are their own color domain: new `appState.currentItemStickynoteStrokeColor` (the note's text color) and `appState.currentItemStickynoteBackgroundColor` defaults, and new customizable top-pick slots `appState.colorTopPicks.stickyNoteStroke` / `stickyNoteBackground`. The stroke and background pickers, both eyedroppers and paste-styles resolve their target (regular / sticky / mixed) at execution time. A note and its label share one ink (the stroke picker reads "Text color" for notes): coloring the label while editing colors the note too, binding a colored text gives the note its color, and the creation-date footer always paints in that ink.
26
+ - Skeleton API: `convertToExcalidrawElements([{ type: "stickynote", x, y, label?: { text, fontSize? } }])` creates a note (and fitted label); see the element-skeleton docs.
27
+ - Tools can be dragged out of the toolbar: drag the sticky note button onto the canvas to drop a default-sized note where you release it, previewed translucently while dragging (nothing reaches the scene, history or collaborators until the drop; Escape cancels). The mechanism is generic — other tools can opt in.
28
+ - Toolbar: on desktop and tablet the image tool moved into the "More tools" menu (still `9`; `UIOptions.tools.image` keeps hiding it; the mobile toolbar keeps its image slot), and tool badges now show the letter shortcuts (`R`, `T`, `N`, …) instead of the numbers, which are no longer contiguous. The number keys keep working.
29
+ - Each note shows its creation date (`element.created`) in a footer band — "7 Sep", or "7 Sep 2025" once the year differs — on canvas and in SVG/PNG exports. The band is reserved in the note's layout, so the label never overlaps it; notes without a timestamp keep the band empty.
30
+ - Resize semantics: a note's corners resize proportionally by default and scale the label's font ceiling with the note (Shift frees them); its edges resize freely by default (Shift constrains them). Drag-creation is proportional by default too (Shift frees it) and never touches the font ceiling. Width-only gestures keep the base height, height gestures set it, aspect-locked multi-select and Stats group edits scale the ceiling; flips preserve everything. Arrows bound to a note follow it as it grows.
31
+
32
+ ## Excalidraw API
33
+
34
+ ### `setViewport` stops following a collaborator (2026-09-26) [#XXXX](https://github.com/excalidraw/excalidraw/pull/XXXX)
35
+
36
+ - `setViewport` now asks to stop following a collaborator whenever it navigates (`onUserFollow` with `action: "UNFOLLOW"`, if `userToFollow` is set), as a user's pan or zoom does. `setViewport(null)` (clearing a lock) and a target that doesn't resolve don't navigate, and leave following alone.
37
+
38
+ ### `onDuplicate` can replace and veto duplicates (2026-09-18) [#XXXX](https://github.com/excalidraw/excalidraw/pull/XXXX)
39
+
40
+ - `props.onDuplicate` may now return new objects for the duplicated elements in every duplication path. Previously the editor kept using the objects it created, so on paste (and library insert) the frame assignment and bound text redraw went to objects that were no longer in the scene, and alt-drag dragged an element that wasn't in the scene. The returned changes are now merged into the editor's duplicates, so they're part of the duplication's own undo entry and durable increment (no follow-up `updateScene` needed).
41
+ - When pasting or inserting onto a frame, the duplicates passed to `onDuplicate` already have their `frameId` set (and are ordered under the frame).
42
+ - Omitting a duplicate from the returned array (or returning it as deleted) now reliably prevents that element from being duplicated — previously pasting over a frame brought it back, and alt-drag broke. References to it from the remaining duplicates (bindings, `boundElements`, `frameId`) are cleared, and a bound text isn't duplicated without its container. If no duplicate remains, the duplication is cancelled and the returned elements are ignored: paste and the duplicate action do nothing, and alt-drag moves the original elements instead. When only some duplicates are vetoed during alt-drag, their originals stay where they were.
43
+ - `onDuplicate` may return `false` to prevent the duplication as a whole (same as omitting every duplicate, without having to find them).
44
+ - `onDuplicate` receives a third argument with lookups covering just the elements taking part in the duplication, so you don't have to derive them by scanning the scene: `{ duplicateElements, originalElements, origIdToDuplicateId, duplicateIdToOrigId }` — the duplicates by id, the elements they were made from by id, and their ids mapped in both directions (`duplicateIdToOrigId` to look up a duplicate's original while modifying it, `origIdToDuplicateId` e.g. for remapping element ids you keep in `customData`). On paste and library insert the originals are the inserted elements, which aren't part of the scene. The maps are read-only.
45
+
46
+ ### Host-controlled active tool (2026-07-14) [#11665](https://github.com/excalidraw/excalidraw/pull/11665)
47
+
48
+ - Added `activeTool` prop (`{ type: ToolType } | { type: "custom"; customType: string }`) for forcing the active editor tool (controlled). While set, user- and API-driven tool switching is ignored — `setActiveTool` refuses non-matching activations with a console warning, non-forced toolbar buttons render disabled, and the tool-lock toggle (`Q`) is inert — and the editor snaps back if internal flows reset the tool (e.g. `restore()` on scene load). The forced tool behaves as if locked — it doesn't revert to selection after use and drawn elements aren't auto-selected — without mutating `appState.activeTool.locked`, so the user's persisted padlock preference stays untouched. Unset the prop to return tool control to the editor (the current tool stays active). The forced tool must be activatable to take effect — not disabled via `UIOptions.tools`, and (while non-interactive) allowed via `interaction.enabled.tools`; otherwise the editor stays on the `selection` tool and applies the forced tool once it becomes activatable. `image` cannot be forced (its activation opens the file picker). Composes with `interaction.enabled.tools` for presentation-style hosts: force `laser` for the presenter, `selection` + `interaction={false}` for viewers.
49
+
50
+ ### User-driven tools while non-interactive (2026-07-14) [#11665](https://github.com/excalidraw/excalidraw/pull/11665)
51
+
52
+ - Added `interaction.enabled.tools` (`{ laser?: boolean; custom?: boolean }`) — the listed tools stay user-driven while the editor is otherwise non-interactive: pointer input keeps driving the tool when it's the active tool. With `laser` enabled, pointer strokes draw laser trails and pointer positions keep broadcasting through `onPointerUpdate`, so e.g. collaborators see a presenter's laser & cursor while the presenter's editor is otherwise inert. With `custom` enabled, custom tools (`activeTool.type === "custom"`) keep receiving `onPointerDown` / `onPointerUp` — activate them with `locked: true` or they revert to the selection tool (and go inert) after the first pointer interaction. Enabling a tool does not enable user-driven tool _switching_ — the keyboard stays disabled and tool selection remains host-driven (`ExcalidrawAPI.setActiveTool`). Composes with `enabled.navigation`: the enabled tool wins the primary-pointer drag, while wheel input (and wheel-button drag) still pans/zooms. The editor consumes touch input over the canvas while the active tool is enabled (strokes don't scroll the page).
53
+
54
+ - While the editor is non-interactive, `ExcalidrawAPI.setActiveTool` only activates tools allowed via `interaction.enabled.tools` — activating any other tool is refused with a console warning (previously the switch went through even though the tool couldn't be used, e.g. updating the canvas cursor). The same invariant is maintained for the tool state itself: when the active tool loses its exception (e.g. `enabled.tools` changes, or the editor becomes fully non-interactive mid-session), it resets to the default `selection` tool, so stale tool state — e.g. a presenter's laser after handing off — doesn't leak through `onChange` / collab pointer payloads.
55
+
56
+ ### Interaction and UI control (2026-07-05) [#11605](https://github.com/excalidraw/excalidraw/pull/11605)
57
+
58
+ - Added `interaction` prop (`boolean | { enabled?: { navigation?: boolean; links?: boolean; embeds?: boolean; interactiveContent?: boolean; browserZoom?: boolean } }`). When set to `false`, the editor becomes fully inert for the user — no panning, zooming, selecting, editing, keyboard shortcuts, clipboard, or drag&drop. It implies view mode (`appState.viewModeEnabled` reports `true` and cannot be unset while non-interactive), and the page scrolls naturally over the component since wheel/touch input is no longer captured (the browser's own zoom is still prevented over the editor by default). Interactions under `enabled` are opt-in exceptions: with `navigation` allowed, the user can pan (pointer drag, wheel, PageUp/PageDown — shift for horizontal) and zoom (ctrl/cmd + wheel, pinch, and the canvas zoom & zoom-to-fit shortcuts — ctrl/cmd +/-/0, shift+1/2/3) the canvas view-mode style — respecting `appState.scrollConstraints`, so it composes with viewport locking for constrained viewers, while the rest of the keyboard stays disabled and the editor consumes wheel & touch input again (the page no longer scrolls over the editor); with `links` allowed, link icons render and linked elements stay clickable (view-mode behavior: clicking anywhere on a linked element opens its link) while the editor stays otherwise non-interactive — when links are not allowed, link icons are not rendered at all; with `embeds` allowed, embeddable & iframe elements stay interactive (hover & click activates them, view-mode style); `interactiveContent` is an additive shorthand enabling `links` & `embeds` (and future interactive content kinds) together; with `browserZoom` allowed, the browser's own zoom gestures (ctrl/cmd + wheel, pinch, keyboard) stay available over the editor (moot when `navigation` is allowed, since the editor consumes the zoom input instead). The scene still renders and remains fully controllable through the imperative API (`updateScene`, `setViewport`, ...), making it suitable for live previews, thumbnails, and annotation overlays.
59
+
60
+ - Added `ui` prop (`boolean | { enabled: { zoom?: boolean; scrollBackToContent?: boolean } }`). When set to `false`, Excalidraw's default UI is not rendered — toolbar, default menu and footer controls, sidebars, canvas popups, and context menu. The object form likewise hides the default UI but opts the zoom controls and/or scroll-back-to-content button back in. Canvas content (elements, text editing, frame names, embeds) still renders, and the editor remains interactive unless `interaction={false}` is set as well. Host children continue to mount (they may be functional, e.g. a collaboration component), and host-supplied UI — including Excalidraw-exported components such as `<MainMenu>` and `<Footer>` — continues to render together with any supporting dialogs it opens. You're responsible for hiding your own presentational components.
61
+
62
+ ### Tool system & toolbar rework [#11649](https://github.com/excalidraw/excalidraw/pull/11649)
63
+
64
+ The toolbar UI was rewritten from hidden radio/checkbox inputs to real `<button>` elements composed from a central tool registry, and all tool activation now goes through a single `setActiveTool` code path.
65
+
66
+ #### Breaking changes
67
+
68
+ - `ExcalidrawAPI.setActiveTool(tool, keepSelection?)` — the second parameter changed from a boolean to an options object: `setActiveTool(tool, { keepSelection?: boolean; toggle?: boolean = false })`. The hand and eraser tools are now _toggle tools_: activating one records the previously active tool, and if `toggle=true`, activating it again switches back — including via `setActiveTool` itself, so repeated `setActiveTool({ type: "hand" }, { toggle: true })` calls alternate rather than no-op. By default `false` for idempotent activation.
69
+
70
+ - Tool buttons render as semantic `<button>` elements with `aria-pressed` instead of `<label>`-wrapped hidden `<input type="radio">` / `<input type="checkbox">`. If you style or query the editor DOM:
71
+
72
+ - The `.ToolIcon_type_radio`, `.ToolIcon_type_checkbox`, and `.ToolIcon--selected` class names no longer exist — the pressed state is exposed through the `.ToolIcon--checked` class and the `aria-pressed` attribute.
73
+ - `<Sidebar.Trigger>` (including the default Library trigger) renders a `<button>` instead of a `<label>` + checkbox.
74
+
75
+ - Removed internal actions superseded by the `setActiveTool` funnel and the tool registry: `toggleHandTool`, `toggleEraserTool`, `toggleLassoTool`, `setFrameAsActiveTool`, `setEmbeddableAsActiveTool` (these `ActionName`s no longer exist).
76
+
77
+ #### Behavior changes
78
+
79
+ - Hand (`H`) and eraser (`E`) shortcuts now reliably toggle back to the previously active tool (previously inconsistent across platforms and input paths, and unavailable for hand in view mode). Pressing `Escape` while hand or eraser is active likewise returns to the previous tool. Re-clicking their toolbar buttons is a no-op.
80
+ - Clicking the active selection tool switches to lasso on all platforms (previously this only worked on iOS due to a controlled-radio quirk).
81
+ - Tool letter shortcuts are CapsLock-insensitive, `Shift+letter` never switches tools, and `Ctrl+E` no longer toggles the eraser.
82
+ - Switching tools no longer creates undo-history entries.
83
+ - Command palette tool commands are derived from the tool registry: the duplicate "Hand" entry is gone, "Web Embed" was added, and "Lasso" is always listed.
84
+ - Pen mode now activates on the first pen tap on any tool button (previously deferred and occasionally dropped).
85
+
86
+ #### Fixes
87
+
88
+ - Mobile toolbar popovers: the active option stays highlighted after tapping it (the highlight was being suppressed by sticky touch-hover).
89
+ - The active-tool highlight can no longer desync from the actually active tool (controlled-radio DOM desync).
90
+
91
+ ### Viewport control & scroll/zoom locking (2026-07-03) [#11554](https://github.com/excalidraw/excalidraw/pull/11554)
92
+
93
+ `ExcalidrawAPI.scrollToContent` was rebuilt into `ExcalidrawAPI.setViewport()` — a single API for navigating the viewport (`fit: "scale-down" | "contain" | "none"`), locking scroll/zoom to a target (with rubberband overscroll), fitting around the rendered editor UI, and initializing the viewport on scene load.
94
+
95
+ #### Breaking changes
96
+
97
+ - `ExcalidrawAPI.scrollToContent(target?, opts?)` was replaced with `ExcalidrawAPI.setViewport(opts | null)`.
98
+
99
+ ```tsx
100
+ // before
101
+ excalidrawAPI.scrollToContent(element, {
102
+ fitToViewport: true,
103
+ animate: true,
104
+ });
105
+ // after
106
+ excalidrawAPI.setViewport({ target: element, fit: "contain" });
107
+ ```
108
+
109
+ - `target` is required and no longer defaults to the whole scene — pass `target: excalidrawAPI.getSceneElements()` for the old default. Besides element(s) or an element id / element-link URL, it now also accepts `Bounds` and `{ x, y, width?, height? }` rects (missing dimensions default to the viewport size). Deleted and non-scene elements in the target are filtered out with a console warning.
110
+ - `fitToContent` / `fitToViewport` were replaced by `fit: "scale-down" | "contain"` respectively, defaulting to `"scale-down"` (zoomed so the target fits, at most 100%). Previously the default depended on the target: element-id / element-link (string) targets defaulted to fit-to-content — matching the new default — while element(s) or omitted targets defaulted to recentering at the current zoom without changing it; pass `fit: "none"` for that behavior.
111
+ - `animate` / `duration` were replaced by `animation: boolean | { duration?: number }`. Navigation now always animates by default; previously only string targets did, while element(s) targets jumped unless `animate: true` — pass `animation: false` to jump instantly.
112
+ - `canvasOffsets` was replaced by `offsets`, which also accepts UI-derived offsets (see Features below).
113
+ - `viewportZoomFactor`, `minZoom`, and `maxZoom` are no longer supported.
114
+
115
+ - `zoomToFitBounds` takes `fit: "scale-down" | "contain" | "none"` instead of `fitToViewport` / `viewportZoomFactor`, and no longer rounds the resulting zoom down to the nearest 10% step by default — pass `steppedZoom: true` to keep the old rounding.
116
+
117
+ #### Features
118
+
119
+ - `setViewport({ ..., lock })` locks the viewport to the resolved target: `lock.scroll` constrains panning to the target box and `lock.zoom` makes the resolved zoom the minimum zoom (zooming in stays allowed). During an animated navigation into a locked viewport, user pan, zoom, fit, and page-navigation input is consumed without mutating or cancelling the transition; the destination lock is installed together with the final viewport once the animation settles. A newer `setViewport(...)` supersedes the transition and starts from the currently rendered viewport. `setViewport(null)` cancels a pending transition and clears any pending or active lock without navigating; a navigation without `lock` likewise supersedes any lock.
120
+
121
+ - `lock.overscroll` adds a rubberband to the lock: panning can overshoot the constraint by the given amount (viewport px, zoom-independent) and snaps back once wheel input settles or the active pointer or multi-finger gesture is released. Defaults to `true` = `DEFAULT_OVERSCROLL` (150px, exported from the package root); pass a number to customize, or `false` / `0` for a rigid lock. Zooming itself remains hard-clamped against the lock, gliding along its edge instead of overscrolling, and stays available during snap-back without cancelling the rubberband animation or discarding its existing screen-space overscroll.
122
+
123
+ - While a lock is active, the zoom-to-fit shortcuts (shift+1/2/3) target the locked box instead of the scene elements (with no selection), so they return the viewport to the lock's resting state; reset-zoom (ctrl/cmd+0) resets to the lock's minimum zoom instead of 100%. Fit results are always re-clamped against the lock. [#11605](https://github.com/excalidraw/excalidraw/pull/11605)
124
+
125
+ - Added `<Excalidraw initialState={{ viewport }} />` for initializing the viewport (and optionally installing a lock) once on scene load. Accepts the same options as `setViewport` except `animation`, and takes precedence over `initialData.scrollToContent`.
126
+
127
+ - The `offsets` option (on `setViewport` and `initialState.viewport`) insets the usable viewport per side so targets aren't fitted underneath overlaid UI. It combines static pixel sides with `ui: true | ViewportOffsetsOptions`, which measures the currently rendered editor UI (toolbar, styles panel, sidebar…) — with configurable padding, per-side overrides, and reserving space for currently-hidden surfaces (`reserve: { stylesPanel?: boolean; sidebar?: boolean }`). The same measurement is exposed through the new `ExcalidrawAPI.getViewportOffsets(opts?)`, and custom UI rendered inside the editor container can opt into being measured via the `data-viewport-ui="top" | "bottom" | "side"` attribute.
128
+
129
+ ### Other Breaking changes
130
+
131
+ - `UIAppState` no longer includes `zoom`, `shouldCacheIgnoreZoom`, and the canvas-interaction transients `snapLines`, `originSnapOffset`, `suggestedBinding`, `frameToHighlight`, and `elementsToHighlight`. These update per pointermove or per animation frame and no longer re-render the editor UI, so UI render props receiving `UIAppState` (`renderCustomStats`, custom `<Footer/>` content, etc.) don't receive them anymore and would render stale values if they read them off the full `AppState`. Subscribe through `useExcalidrawStateValue` instead — the component re-renders only when the selected value changes:
132
+
133
+ ```tsx
134
+ import { useExcalidrawStateValue } from "@excalidraw/excalidraw";
135
+
136
+ const ZoomReadout = () => {
137
+ // `undefined` on initial render, before the editor API initializes
138
+ const zoomValue = useExcalidrawStateValue(
139
+ (appState) => appState.zoom.value,
140
+ );
141
+
142
+ if (zoomValue == null) {
143
+ return null;
144
+ }
145
+
146
+ return <div>{(zoomValue * 100).toFixed(0)}%</div>;
147
+ };
148
+ ```
149
+
150
+ Outside of React components, you can also subscribe via `ExcalidrawAPI.onStateChange((appState) => appState.zoom.value, (zoomValue) => {...})`, or keep using the existing `onScrollChange(scrollX, scrollY, zoom)` prop.
151
+
152
+ - Theme changes initiated by the default UI are now delegated to `<Excalidraw onThemeChange={(theme) => ...} />` when supplied. If `onThemeChange` is not supplied, light/dark theme toggling still falls back to updating the internal editor state.
153
+
154
+ - `MainMenu.DefaultItems.ToggleTheme` no longer accepts the item-level `onSelect` callback. Host apps that need to control light/dark/system theme should pass `onThemeChange` to `<Excalidraw />` instead.
155
+ - `MainMenu.DefaultItems.ToggleTheme` with system theme support now uses `allowSystemTheme` together with `theme={Theme | "system"}` only to render the selected value. For the regular light/dark item, pass `allowSystemTheme={false}`.
156
+ - `CommandPalette.defaultItems.toggleTheme` was removed. The default theme command is now rendered by the command palette itself when `UIOptions.canvasActions.toggleTheme` enables the action (see below).
157
+ - `UIOptions.canvasActions.toggleTheme` still controls default theme UI availability. When it is `null`, it defaults to `true` if `props.theme` is omitted or `props.onThemeChange` is supplied, and otherwise defaults to disabled.
158
+
159
+ - Renamed the `excalidrawAPI` prop to `onExcalidrawAPI`.
160
+ - `onExcalidrawAPI` is now called on mount (instead of during constructor), and later on unmount (with `null` value). The API may be removed altogether in the future (you can use `onMount` & `onUnmount` to manage the `ExcalidrawAPI` object (e.g. to cache it to a global state), already).
161
+
162
+ ### Other Features
163
+
164
+ - Added `ExcalidrawAPI.isDestroyed` flag. Set to `true` once the editor unmounts. Calling any `get*` method, `onStateChange`, or `onEvent` on a destroyed API instance will throw in development and `console.error` in production. The `ExcalidrawAPI` will be reset to `null` on unmount, but to be extra safe, you should check `ExcalidrawAPI.isDestroyed` before calling these methods to guard against subtle race conditions in your code.
165
+
166
+ - Added `onMount`, `onInitialize`, and `onUnmount` props. `onMount` receives `{ excalidrawAPI, container }` once the editor root is mounted. `onInitialize` fires once the initial scene has loaded. `onUnmount` fires just before unmounting.
167
+
168
+ - Same events are also accessible imperatively through `api.onEvent(...)`.
169
+
170
+ ```tsx
171
+ <Excalidraw
172
+ onExcalidrawAPI={(api) => {
173
+ api.onEvent("editor:mount", ({ excalidrawAPI, container }) => {
174
+ console.log(container);
175
+ });
176
+
177
+ api.onEvent("editor:initialize").then((readyApi) => {
178
+ readyApi.setViewport({
179
+ target: readyApi.getSceneElements(),
180
+ animation: false,
181
+ });
182
+ });
183
+ }}
184
+ />
185
+ ```
186
+
187
+ Note that in future releases, most, if not all, `excalidrawAPI.on*` subscriptions will be removed in favor of `excalidrawAPI.onEvent(name)`.
188
+
189
+ - Also added `"editor:unmount"` lifecycle event, only accessible via `api.onEvent("editor:unmount")`.
190
+
191
+ - Exported `<ExcalidrawAPIProvider/>`, `useExcalidrawAPI()`, `useExcalidrawStateValue(prop | props | selectorFunction)`, and `useOnExcalidrawStateChange(prop | props | selectorFunction, callback)` from the package. The imperative API also now exposes `onStateChange(prop | props | selectorFunction, callback?)`, and `onEvent(name, callback)`.
192
+
193
+ ```tsx
194
+ <ExcalidrawAPIProvider>
195
+ <Excalidraw />
196
+ <Logger />
197
+ </ExcalidrawAPIProvider>;
198
+
199
+ function Logger() {
200
+ // initially null before the ExcalidrawAPIProvider initializes after
201
+ // <Excalidraw/> renders
202
+ // When <Excalidraw/> unmounts, is reset back to null
203
+ const api = useExcalidrawAPI();
204
+
205
+ useExcalidrawStateValue("viewModeEnabled", (viewModeEnabled) => {
206
+ console.log("view mode changed:", viewModeEnabled);
207
+ });
208
+
209
+ React.useEffect(() => {
210
+ if (api) {
211
+ console.log("editor instance id:", api.id);
212
+ }
213
+ }, [api]);
214
+
215
+ return null;
216
+ }
217
+ ```
218
+
219
+ - Added `onExport` so host apps can delay JSON export until async work completes. The handler receives the export data plus an `AbortSignal`, and may return a `Promise` or an async generator that yields progress updates for the built-in toast UI.
220
+
221
+ ```tsx
222
+ <Excalidraw
223
+ onExport={async function* (_type, { files }, { signal }) {
224
+ yield { type: "progress", message: "Waiting for images..." };
225
+
226
+ await waitForImagesToLoad(files, signal);
227
+
228
+ if (signal.aborted) {
229
+ return;
230
+ }
231
+
232
+ yield { type: "progress", message: "Export ready", progress: 1 };
233
+ }}
234
+ />
235
+ ```
236
+
14
237
  ## Excalidraw Library
15
238
 
239
+ ### Breaking changes
240
+
241
+ - `updateActiveTool` (from `@excalidraw/common`): the `lastActiveToolBeforeEraser` property of the `data` parameter was renamed to `lastActiveTool` (it was already stored under that name on `appState.activeTool`, and is no longer eraser-specific).
242
+
243
+ - `getClosestElementBounds` is no longer exported from `@excalidraw/element`. Use `getCommonBounds` / `getElementBounds` from `@excalidraw/element`, or reimplement the closest-target distance check with `getElementBounds` if you need the same behavior [#11554](https://github.com/excalidraw/excalidraw/pull/11554).
244
+
16
245
  ## 0.18.0 (2025-03-11)
17
246
 
18
247
  ### Highlights
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Excalidraw
2
2
 
3
- **Excalidraw** is exported as a component to be directly embedded in your project.
3
+ **Excalidraw** is exported as a React component that you can embed directly in your app.
4
4
 
5
5
  ## Installation
6
6
 
7
- Use `npm` or `yarn` to install the package.
7
+ Install the package together with its React peer dependencies.
8
8
 
9
9
  ```bash
10
10
  npm install react react-dom @excalidraw/excalidraw
@@ -12,34 +12,131 @@ npm install react react-dom @excalidraw/excalidraw
12
12
  yarn add react react-dom @excalidraw/excalidraw
13
13
  ```
14
14
 
15
- > **Note**: If you don't want to wait for the next stable release and try out the unreleased changes, use `@excalidraw/excalidraw@next`.
15
+ > **Note**: If you want to try unreleased changes, use `@excalidraw/excalidraw@next`.
16
16
 
17
- #### Self-hosting fonts
17
+ ## Quick start
18
18
 
19
- By default, Excalidraw will try to download all the used fonts from the [CDN](https://esm.run/@excalidraw/excalidraw/dist/prod).
19
+ The minimum working setup has two easy-to-miss requirements:
20
20
 
21
- For self-hosting purposes, you'll have to copy the content of the folder `node_modules/@excalidraw/excalidraw/dist/prod/fonts` to the path where your assets should be served from (i.e. `public/` directory in your project). In that case, you should also set `window.EXCALIDRAW_ASSET_PATH` to the very same path, i.e. `/` in case it's in the root:
21
+ 1. Import the package CSS:
22
22
 
23
- ```js
24
- <script>window.EXCALIDRAW_ASSET_PATH = "/";</script>
23
+ ```ts
24
+ import "@excalidraw/excalidraw/index.css";
25
25
  ```
26
26
 
27
- ### Dimensions of Excalidraw
27
+ 2. Render Excalidraw inside a container with a non-zero height.
28
28
 
29
- Excalidraw takes _100%_ of `width` and `height` of the containing block so make sure the container in which you render Excalidraw has non zero dimensions.
29
+ ```tsx
30
+ import { Excalidraw } from "@excalidraw/excalidraw";
31
+ import "@excalidraw/excalidraw/index.css";
32
+
33
+ export default function App() {
34
+ return (
35
+ <div style={{ height: "100vh" }}>
36
+ <Excalidraw />
37
+ </div>
38
+ );
39
+ }
40
+ ```
41
+
42
+ Excalidraw fills `100%` of the width and height of its parent. If the parent has no height, the canvas will not be visible.
43
+
44
+ ## Next.js / SSR frameworks
45
+
46
+ Excalidraw should be rendered on the client. In SSR frameworks such as Next.js, use a client component and load it dynamically with SSR disabled.
47
+
48
+ ```tsx
49
+ // app/components/ExcalidrawClient.tsx
50
+ "use client";
51
+
52
+ import { Excalidraw } from "@excalidraw/excalidraw";
53
+ import "@excalidraw/excalidraw/index.css";
54
+
55
+ export default function ExcalidrawClient() {
56
+ return (
57
+ <div style={{ height: "100vh" }}>
58
+ <Excalidraw />
59
+ </div>
60
+ );
61
+ }
62
+ ```
63
+
64
+ ```tsx
65
+ // app/page.tsx
66
+ import dynamic from "next/dynamic";
67
+
68
+ const ExcalidrawClient = dynamic(
69
+ () => import("./components/ExcalidrawClient"),
70
+ { ssr: false },
71
+ );
72
+
73
+ export default function Page() {
74
+ return <ExcalidrawClient />;
75
+ }
76
+ ```
77
+
78
+ See the local examples for complete setups:
79
+
80
+ - [examples/with-nextjs](https://github.com/excalidraw/excalidraw/tree/master/examples/with-nextjs)
81
+ - [examples/with-script-in-browser](https://github.com/excalidraw/excalidraw/tree/master/examples/with-script-in-browser)
82
+
83
+ ## LLM / agent tips
84
+
85
+ If an LLM or coding agent is setting up Excalidraw, these shortcuts usually save more time than re-prompting:
86
+
87
+ - Start with a plain `<Excalidraw />` in a `100vh` container. Add refs, `initialData`, persistence, or custom UI only after the base embed works.
88
+ - If the canvas is blank, check the CSS import and parent height first. Those are the two most common integration failures.
89
+ - In Next.js or other SSR frameworks, assume client-only rendering first. Use `"use client"` and `dynamic(..., { ssr: false })` before debugging hydration or `window is not defined` errors.
90
+ - If imports or entrypoints are unclear, inspect `node_modules/@excalidraw/excalidraw/package.json`. The installed package exports are the source of truth.
91
+ - Do not set `window.EXCALIDRAW_ASSET_PATH` unless you are intentionally self-hosting fonts/assets.
92
+ - When docs and generated code drift, copy the nearest working example from this repo, especially `examples/with-nextjs` or `examples/with-script-in-browser`.
93
+
94
+ ## Migrating to `@excalidraw/excalidraw@0.18.x`
95
+
96
+ Version `0.18.x` removes the old `types/`-prefixed deep import paths. If you were importing types from `@excalidraw/excalidraw/types/...`, switch to the new type-only subpaths below.
97
+
98
+ | Old path | New path |
99
+ | --- | --- |
100
+ | `@excalidraw/excalidraw/types/data/transform.js` | `@excalidraw/excalidraw/element/transform` |
101
+ | `@excalidraw/excalidraw/types/data/types.js` | `@excalidraw/excalidraw/data/types` |
102
+ | `@excalidraw/excalidraw/types/element/types.js` | `@excalidraw/excalidraw/element/types` |
103
+ | `@excalidraw/excalidraw/types/utility-types.js` | `@excalidraw/excalidraw/common/utility-types` |
104
+ | `@excalidraw/excalidraw/types/types.js` | `@excalidraw/excalidraw/types` |
105
+
106
+ Drop the `.js` extension. The new package `exports` map resolves these paths without it.
107
+
108
+ These deep subpaths are for `import type` only. Runtime imports should come from the package root, plus `@excalidraw/excalidraw/index.css` for styles.
109
+
110
+ For example:
111
+
112
+ ```ts
113
+ import { exportToSvg } from "@excalidraw/excalidraw";
114
+ ```
115
+
116
+ ## Self-hosting fonts
117
+
118
+ By default, Excalidraw downloads the fonts it needs from the [CDN](https://esm.run/@excalidraw/excalidraw/dist/prod).
119
+
120
+ For self-hosting, copy the contents of `node_modules/@excalidraw/excalidraw/dist/prod/fonts` into the path where your app serves static assets, for example `public/`. Then set `window.EXCALIDRAW_ASSET_PATH` to that same path:
121
+
122
+ ```html
123
+ <script>
124
+ window.EXCALIDRAW_ASSET_PATH = "/";
125
+ </script>
126
+ ```
30
127
 
31
128
  ## Demo
32
129
 
33
- Go to [CodeSandbox](https://codesandbox.io/p/sandbox/github/excalidraw/excalidraw/tree/master/examples/with-script-in-browser) example.
130
+ Try the [CodeSandbox example](https://codesandbox.io/p/sandbox/github/excalidraw/excalidraw/tree/master/examples/with-script-in-browser).
34
131
 
35
132
  ## Integration
36
133
 
37
- Head over to the [docs](https://docs.excalidraw.com/docs/@excalidraw/excalidraw/integration).
134
+ Read the [integration docs](https://docs.excalidraw.com/docs/@excalidraw/excalidraw/integration).
38
135
 
39
136
  ## API
40
137
 
41
- Head over to the [docs](https://docs.excalidraw.com/docs/@excalidraw/excalidraw/api).
138
+ Read the [API docs](https://docs.excalidraw.com/docs/@excalidraw/excalidraw/api).
42
139
 
43
140
  ## Contributing
44
141
 
45
- Head over to the [docs](https://docs.excalidraw.com/docs/@excalidraw/excalidraw/contributing).
142
+ Read the [contributing docs](https://docs.excalidraw.com/docs/@excalidraw/excalidraw/contributing).
@@ -1,5 +1,8 @@
1
1
  // locales/en.json
2
2
  var labels = {
3
+ signUp: "Sign up",
4
+ signIn: "Sign in",
5
+ upgrade: "Upgrade",
3
6
  paste: "Paste",
4
7
  pasteAsPlaintext: "Paste as plaintext",
5
8
  pasteCharts: "Paste charts",
@@ -25,6 +28,7 @@ var labels = {
25
28
  copyStyles: "Copy styles",
26
29
  pasteStyles: "Paste styles",
27
30
  stroke: "Stroke",
31
+ textColor: "Text color",
28
32
  changeStroke: "Change stroke color",
29
33
  background: "Background",
30
34
  changeBackground: "Change background color",
@@ -35,6 +39,9 @@ var labels = {
35
39
  strokeStyle_dashed: "Dashed",
36
40
  strokeStyle_dotted: "Dotted",
37
41
  sloppiness: "Sloppiness",
42
+ pressure: "Pressure",
43
+ pressure_constant: "Constant",
44
+ pressure_variable: "Variable",
38
45
  opacity: "Opacity",
39
46
  textAlign: "Text align",
40
47
  edges: "Edges",
@@ -106,6 +113,7 @@ var labels = {
106
113
  group: "Group selection",
107
114
  ungroup: "Ungroup selection",
108
115
  collaborators: "Collaborators",
116
+ you: "You",
109
117
  toggleGrid: "Toggle grid",
110
118
  addToLibrary: "Add to library",
111
119
  removeFromLibrary: "Remove from library",
@@ -185,8 +193,15 @@ var labels = {
185
193
  shapeSwitch: "Switch shape",
186
194
  preferences: "Preferences",
187
195
  preferences_toolLock: "Tool lock",
196
+ boxSelectionMode: "Select on",
197
+ boxSelectionContain: "Wrap",
198
+ boxSelectionOverlap: "Overlap",
188
199
  arrowBinding: "Arrow binding",
189
- midpointSnapping: "Snap to midpoints"
200
+ midpointSnapping: "Snap to midpoints",
201
+ showHints: "Show hints",
202
+ inputDevice: "Input",
203
+ inputDeviceTrackpad: "Trackpad",
204
+ inputDeviceMouse: "Mouse"
190
205
  };
191
206
  var elementLink = {
192
207
  title: "Link to object",
@@ -238,6 +253,7 @@ var buttons = {
238
253
  undo: "Undo",
239
254
  redo: "Redo",
240
255
  resetLibrary: "Reset library",
256
+ reset: "Reset",
241
257
  createNewRoom: "Create new room",
242
258
  fullScreen: "Full screen",
243
259
  darkMode: "Dark mode",
@@ -325,13 +341,20 @@ var toolBar = {
325
341
  eraser: "Eraser",
326
342
  frame: "Frame tool",
327
343
  magicframe: "Wireframe to code",
344
+ stickynote: "Sticky note",
328
345
  embeddable: "Web Embed",
329
346
  laser: "Laser pointer",
347
+ autoshape: "Draw to shape",
348
+ bucketfill: "Bucket fill",
330
349
  hand: "Hand (panning tool)",
331
350
  extraTools: "More tools",
332
351
  mermaidToExcalidraw: "Mermaid to Excalidraw",
333
352
  convertElementType: "Toggle shape type"
334
353
  };
354
+ var bucketfill = {
355
+ noRegion: "Couldn't find an enclosed region to fill here.",
356
+ tooComplex: "This region is too complex to fill."
357
+ };
335
358
  var element = {
336
359
  rectangle: "Rectangle",
337
360
  diamond: "Diamond",
@@ -344,6 +367,7 @@ var element = {
344
367
  group: "Group",
345
368
  frame: "Frame",
346
369
  magicframe: "Wireframe to code",
370
+ stickynote: "Sticky note",
347
371
  embeddable: "Web Embed",
348
372
  selection: "Selection",
349
373
  iframe: "IFrame"
@@ -362,13 +386,17 @@ var hints = {
362
386
  freeDraw: "Click and drag, release when you're finished",
363
387
  text: "Tip: you can also add text by double-clicking anywhere with the selection tool",
364
388
  embeddable: "Click-drag to create a website embed",
389
+ stickynote: "Click to place a note, or drag to size it",
390
+ autoshape: "Draw rectangles, circles, diamonds, lines and arrows",
365
391
  text_selected: "Double-click or press {{shortcut}} to edit text",
366
392
  text_editing: "Press {{shortcut_1}} or {{shortcut_2}} to finish editing",
367
393
  linearElementMulti: "Click on last point or press {{shortcut_1}} or {{shortcut_2}} to finish",
368
394
  lockAngle: "You can constrain angle by holding {{shortcut}}",
369
395
  resize: "You can constrain proportions by holding {{shortcut_1}} while resizing,\nhold {{shortcut_2}} to resize from the center",
370
396
  resizeImage: "You can resize freely by holding {{shortcut_1}},\nhold {{shortcut_2}} to resize from the center",
397
+ resizeStickyNote: "hold {{shortcut_1}} to resize freely, {{shortcut_2}} to resize from the center",
371
398
  rotate: "You can constrain angles by holding {{shortcut}} while rotating",
399
+ toggleArrowhead: "Double-click to toggle the arrowhead",
372
400
  lineEditor_info: "Hold {{shortcut_1}} and Double-click or press {{shortcut_2}} to edit points",
373
401
  lineEditor_line_info: "Double-click or press {{shortcut}} to edit points",
374
402
  lineEditor_pointSelected: "Press {{shortcut_1}} to remove point(s),\n{{shortcut_2}} to duplicate, or drag to move",
@@ -377,6 +405,7 @@ var hints = {
377
405
  bindTextToElement: "{{shortcut}} to add text",
378
406
  createFlowchart: "{{shortcut}} to create a flowchart",
379
407
  deepBoxSelect: "Hold {{shortcut}} to deep select, and to prevent dragging",
408
+ cycleSelection: "{{shortcut}}-click to cycle selection, or drag to duplicate",
380
409
  eraserRevert: "Hold {{shortcut}} to revert the elements marked for deletion",
381
410
  firefox_clipboard_write: 'This feature can likely be enabled by setting the "dom.events.asyncClipboard.clipboardItem" flag to "true". To change the browser flags in Firefox, visit the "about:config" page.',
382
411
  disableSnapping: "Hold {{shortcut}} to disable snapping",
@@ -412,6 +441,10 @@ var roomDialog = {
412
441
  var errorDialog = {
413
442
  title: "Error"
414
443
  };
444
+ var progressDialog = {
445
+ title: "Saving",
446
+ defaultMessage: "Preparing to save..."
447
+ };
415
448
  var exportDialog = {
416
449
  disk_title: "Save to disk",
417
450
  disk_details: "Export the scene data to a file from which you can import later.",
@@ -593,7 +626,11 @@ var colorPicker = {
593
626
  colors: "Colors",
594
627
  shades: "Shades",
595
628
  hexCode: "Hex code",
596
- noShades: "No shades available for this color"
629
+ noShades: "No shades available for this color",
630
+ invalidColor: "Not a valid color",
631
+ invalidHexLength: "Hex code must be 3, 4, 6, or 8 characters",
632
+ topPicksTip: "Tip: drag any color onto your top picks to pin it",
633
+ resetTopPicks: "Reset to default top picks"
597
634
  };
598
635
  var overwriteConfirm = {
599
636
  action: {
@@ -626,6 +663,15 @@ var overwriteConfirm = {
626
663
  }
627
664
  }
628
665
  };
666
+ var fileDrop = {
667
+ replace: "Drop to replace content",
668
+ add: "Drop to add to canvas",
669
+ importLibrary: "Drop to import library",
670
+ replaceHint: "Hold <shift>Shift</shift> to keep existing content",
671
+ keepHint: "Your existing content will be kept",
672
+ libraryHint: "Library files will append",
673
+ replacedToast: "Content replaced. {{shortcut}} to undo"
674
+ };
629
675
  var mermaid = {
630
676
  title: "Mermaid to Excalidraw",
631
677
  button: "Insert",
@@ -633,7 +679,7 @@ var mermaid = {
633
679
  syntax: "Mermaid Syntax",
634
680
  preview: "Preview",
635
681
  label: "Mermaid",
636
- inputPlaceholder: "Write Mermaid diagram defintion here...",
682
+ inputPlaceholder: "Write Mermaid diagram definition here...",
637
683
  autoFixAvailable: "Auto-fix is available"
638
684
  };
639
685
  var ttd = {
@@ -691,7 +737,9 @@ var fontList = {
691
737
  },
692
738
  sceneFonts: "In this scene",
693
739
  availableFonts: "Available fonts",
694
- empty: "No fonts found"
740
+ empty: "No fonts found",
741
+ topPicksTip: "Tip: drag any font onto your top picks to pin it",
742
+ resetTopPicks: "Reset to default top picks"
695
743
  };
696
744
  var userList = {
697
745
  empty: "No users found",
@@ -739,6 +787,7 @@ var en_default = {
739
787
  alerts,
740
788
  errors,
741
789
  toolBar,
790
+ bucketfill,
742
791
  element,
743
792
  headings,
744
793
  hints,
@@ -747,6 +796,7 @@ var en_default = {
747
796
  shareDialog,
748
797
  roomDialog,
749
798
  errorDialog,
799
+ progressDialog,
750
800
  exportDialog,
751
801
  helpDialog,
752
802
  clearCanvasDialog,
@@ -761,6 +811,7 @@ var en_default = {
761
811
  welcomeScreen,
762
812
  colorPicker,
763
813
  overwriteConfirm,
814
+ fileDrop,
764
815
  mermaid,
765
816
  ttd,
766
817
  chat,
@@ -780,6 +831,7 @@ export {
780
831
  alerts,
781
832
  errors,
782
833
  toolBar,
834
+ bucketfill,
783
835
  element,
784
836
  headings,
785
837
  hints,
@@ -788,6 +840,7 @@ export {
788
840
  shareDialog,
789
841
  roomDialog,
790
842
  errorDialog,
843
+ progressDialog,
791
844
  exportDialog,
792
845
  helpDialog,
793
846
  clearCanvasDialog,
@@ -802,6 +855,7 @@ export {
802
855
  welcomeScreen,
803
856
  colorPicker,
804
857
  overwriteConfirm,
858
+ fileDrop,
805
859
  mermaid,
806
860
  ttd,
807
861
  chat,
@@ -812,4 +866,4 @@ export {
812
866
  keys,
813
867
  en_default
814
868
  };
815
- //# sourceMappingURL=chunk-EWKWI3K7.js.map
869
+ //# sourceMappingURL=chunk-IUKF2BNN.js.map