@excalidraw/excalidraw 0.17.1-1d71f84 → 0.17.1-2f9526d

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 (443) hide show
  1. package/CHANGELOG.md +14 -2
  2. package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-ACFH36JV.js → blockDiagram-91b80b7a-H47FTXHA.js} +5 -5
  3. package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-QZ27YR47.js → c4Diagram-b2a90758-NNJK6GKC.js} +3 -3
  4. package/dist/browser/dev/excalidraw-assets-dev/{chunk-HO2HMSK7.js → chunk-4KQVEBHW.js} +3 -3
  5. package/dist/browser/dev/excalidraw-assets-dev/{chunk-USGV265L.js → chunk-53YI56GV.js} +4 -4
  6. package/dist/browser/dev/excalidraw-assets-dev/{chunk-EDFX3S7X.js → chunk-A2WCJI4I.js} +3 -3
  7. package/dist/browser/dev/excalidraw-assets-dev/{chunk-IX4V72YG.js → chunk-EFLPX7NE.js} +6 -6
  8. package/dist/browser/dev/excalidraw-assets-dev/{chunk-MXVETLVM.js → chunk-JYIQCNWV.js} +2 -2
  9. package/dist/browser/dev/excalidraw-assets-dev/{chunk-YZIOORVX.js → chunk-LVIQQW6F.js} +2 -2
  10. package/dist/browser/dev/excalidraw-assets-dev/{chunk-6U7GQNJT.js → chunk-PXLO3FOU.js} +2 -2
  11. package/dist/browser/dev/excalidraw-assets-dev/{chunk-AK7SWNLN.js → chunk-Q6A4M3MN.js} +9 -5
  12. package/dist/browser/dev/excalidraw-assets-dev/chunk-Q6A4M3MN.js.map +7 -0
  13. package/dist/browser/dev/excalidraw-assets-dev/{chunk-RWZVJAQU.js → chunk-Q6NFAEKN.js} +4597 -2668
  14. package/dist/browser/dev/excalidraw-assets-dev/chunk-Q6NFAEKN.js.map +7 -0
  15. package/dist/browser/dev/excalidraw-assets-dev/{chunk-7DACDEY3.js → chunk-TO2AW5PW.js} +2 -2
  16. package/dist/browser/dev/excalidraw-assets-dev/{chunk-NJ77ZFNJ.js → chunk-VURILHLY.js} +2 -2
  17. package/dist/browser/dev/excalidraw-assets-dev/{chunk-2T2GU7NF.js → chunk-ZAYGSUHF.js} +2 -2
  18. package/dist/browser/dev/excalidraw-assets-dev/{chunk-Z3PH3V2B.js → chunk-ZQR5ML6Y.js} +26 -26
  19. package/dist/browser/dev/excalidraw-assets-dev/chunk-ZQR5ML6Y.js.map +7 -0
  20. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-QSLMH4JW.js → classDiagram-30eddba6-CUYIJICN.js} +5 -5
  21. package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-DY4DYQ5P.js → classDiagram-v2-f2df5561-K6WW6K73.js} +8 -8
  22. package/dist/browser/dev/excalidraw-assets-dev/{dist-Z46EOVOL.js → dist-6QVAH5JA.js} +37 -15
  23. package/dist/browser/dev/excalidraw-assets-dev/dist-6QVAH5JA.js.map +7 -0
  24. package/dist/browser/dev/excalidraw-assets-dev/{en-5TCZHGGJ.js → en-Y27YPU72.js} +2 -2
  25. package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-SOOJRTCB.js → erDiagram-47591fe2-XGAD7EEP.js} +4 -4
  26. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-AHGL4KPK.js → flowDiagram-5540d9b9-B6EOVNNO.js} +9 -9
  27. package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-56LDZZWY.js → flowDiagram-v2-3b53844e-NUG24FJH.js} +9 -9
  28. package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-27LUKRI6.js → flowchart-elk-definition-5fe447d6-25Y7PCBL.js} +5 -5
  29. package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-EHGYGNG6.js → ganttDiagram-9a3bba1f-GNL6ZDTC.js} +2 -2
  30. package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-AJQNBDW5.js → gitGraphDiagram-96e6b4ee-HNW52NVO.js} +2 -2
  31. package/dist/browser/dev/excalidraw-assets-dev/{image-OFRRV5MB.css → image-O66MQ7WQ.css} +1 -1
  32. package/dist/browser/dev/excalidraw-assets-dev/image-O66MQ7WQ.css.map +7 -0
  33. package/dist/browser/dev/excalidraw-assets-dev/{image-EDKQZH7Z.js → image-Y5X7K6KW.js} +2 -2
  34. package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-SWLLQVES.js → infoDiagram-bcd20f53-FWEUVFLT.js} +2 -2
  35. package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-7UAVCWOZ.js → journeyDiagram-4fe6b3dc-RZIUI7UG.js} +3 -3
  36. package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-SROW5KGM.js → mindmap-definition-f354de21-GBVN45GU.js} +3 -3
  37. package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-QKCI6NCB.js → pieDiagram-79897490-ECENNII6.js} +2 -2
  38. package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-LNYJZFC5.js → quadrantDiagram-62f64e94-ZMEOFVNL.js} +2 -2
  39. package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-ZZD7ZHFA.js → requirementDiagram-05bf5f74-FHZSFHCR.js} +4 -4
  40. package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-L75ZZ4UM.js → sankeyDiagram-97764748-VDKIKTA6.js} +2 -2
  41. package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-6PCU7TDK.js → sequenceDiagram-acc0e65c-6JUSPVKX.js} +3 -3
  42. package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-WM76WOPR.js → stateDiagram-0ff1cf1a-L3AKWENF.js} +5 -5
  43. package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-N4HZW3O2.js → stateDiagram-v2-9a9d610d-NU3GGMCH.js} +8 -8
  44. package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-ZHGCAXGP.js → timeline-definition-fea2a41d-JGP7XCHW.js} +2 -2
  45. package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-2DLOVRAZ.js → xychartDiagram-ab372869-HLFHHF2I.js} +3 -3
  46. package/dist/browser/dev/index.css +72 -28
  47. package/dist/browser/dev/index.css.map +3 -3
  48. package/dist/browser/dev/index.js +2211 -1904
  49. package/dist/browser/dev/index.js.map +4 -4
  50. package/dist/browser/prod/excalidraw-assets/{blockDiagram-91b80b7a-ONPS22AM.js → blockDiagram-91b80b7a-FVCRVGN5.js} +1 -1
  51. package/dist/browser/prod/excalidraw-assets/{c4Diagram-b2a90758-XMIQY7ZT.js → c4Diagram-b2a90758-56CXO7GA.js} +1 -1
  52. package/dist/browser/prod/excalidraw-assets/{chunk-GCHQBOKV.js → chunk-635MQ3CK.js} +1 -1
  53. package/dist/browser/prod/excalidraw-assets/{chunk-P5M3G2RP.js → chunk-AIKXYJX3.js} +1 -1
  54. package/dist/browser/prod/excalidraw-assets/{chunk-E2YLWFZX.js → chunk-CR7VMNWC.js} +1 -1
  55. package/dist/browser/prod/excalidraw-assets/{chunk-WEYK4A2L.js → chunk-FFF2CSVG.js} +1 -1
  56. package/dist/browser/prod/excalidraw-assets/{chunk-R3HAIP6R.js → chunk-G4WDCSPE.js} +1 -1
  57. package/dist/browser/prod/excalidraw-assets/{chunk-HFOXJM22.js → chunk-HKZSHFLX.js} +1 -1
  58. package/dist/browser/prod/excalidraw-assets/{chunk-XIMFFJTE.js → chunk-IKCDYWMW.js} +1 -1
  59. package/dist/browser/prod/excalidraw-assets/{chunk-CTYINSWT.js → chunk-IZMZ6RPD.js} +2 -2
  60. package/dist/browser/prod/excalidraw-assets/{chunk-AHLLBBVJ.js → chunk-L5DS24G6.js} +1 -1
  61. package/dist/browser/prod/excalidraw-assets/chunk-MDMKPHYD.js +55 -0
  62. package/dist/browser/prod/excalidraw-assets/{chunk-CQJF3C6G.js → chunk-MUNOKHUD.js} +1 -1
  63. package/dist/browser/prod/excalidraw-assets/{chunk-NI6SYCUG.js → chunk-QOQYOOQ4.js} +1 -1
  64. package/dist/browser/prod/excalidraw-assets/{chunk-I2PZFXTK.js → chunk-ZTIWFPBM.js} +21 -21
  65. package/dist/browser/prod/excalidraw-assets/{classDiagram-30eddba6-IEJXXCVX.js → classDiagram-30eddba6-BCUTAUMD.js} +1 -1
  66. package/dist/browser/prod/excalidraw-assets/{classDiagram-v2-f2df5561-7LZDSWOS.js → classDiagram-v2-f2df5561-6SOXSGQ2.js} +1 -1
  67. package/dist/browser/prod/excalidraw-assets/dist-567JAXHK.js +7 -0
  68. package/dist/browser/prod/excalidraw-assets/{en-LROPV2RN.js → en-GSUSWMSH.js} +1 -1
  69. package/dist/browser/prod/excalidraw-assets/{erDiagram-47591fe2-E5V666CF.js → erDiagram-47591fe2-RE6HB7RM.js} +1 -1
  70. package/dist/browser/prod/excalidraw-assets/{flowDiagram-5540d9b9-GMBRCYVF.js → flowDiagram-5540d9b9-ZNJZBERW.js} +1 -1
  71. package/dist/browser/prod/excalidraw-assets/{flowDiagram-v2-3b53844e-Z4HUWP6B.js → flowDiagram-v2-3b53844e-LY44JLQJ.js} +1 -1
  72. package/dist/browser/prod/excalidraw-assets/{flowchart-elk-definition-5fe447d6-5ZCYTX5N.js → flowchart-elk-definition-5fe447d6-TMTJ6Z7O.js} +1 -1
  73. package/dist/browser/prod/excalidraw-assets/{ganttDiagram-9a3bba1f-WM32OMT5.js → ganttDiagram-9a3bba1f-5O6EA6LX.js} +1 -1
  74. package/dist/browser/prod/excalidraw-assets/{gitGraphDiagram-96e6b4ee-CAKZ2U6E.js → gitGraphDiagram-96e6b4ee-UHYNM5DI.js} +1 -1
  75. package/dist/browser/prod/excalidraw-assets/image-7MVXYJUE.js +1 -0
  76. package/dist/browser/prod/excalidraw-assets/{infoDiagram-bcd20f53-MUIKXGC4.js → infoDiagram-bcd20f53-BP77NQEH.js} +1 -1
  77. package/dist/browser/prod/excalidraw-assets/{journeyDiagram-4fe6b3dc-NYRV4HK2.js → journeyDiagram-4fe6b3dc-XMGKCMES.js} +1 -1
  78. package/dist/browser/prod/excalidraw-assets/{mindmap-definition-f354de21-MY55DRSM.js → mindmap-definition-f354de21-ZQRRBRWF.js} +1 -1
  79. package/dist/browser/prod/excalidraw-assets/{pieDiagram-79897490-47L6J6L2.js → pieDiagram-79897490-IGXEC2KX.js} +1 -1
  80. package/dist/browser/prod/excalidraw-assets/{quadrantDiagram-62f64e94-DF5C2GDT.js → quadrantDiagram-62f64e94-WTHHDYJL.js} +1 -1
  81. package/dist/browser/prod/excalidraw-assets/{requirementDiagram-05bf5f74-C4IMUBDN.js → requirementDiagram-05bf5f74-MV4OFRVW.js} +1 -1
  82. package/dist/browser/prod/excalidraw-assets/{sankeyDiagram-97764748-YHW7EUST.js → sankeyDiagram-97764748-ZGYUHEJT.js} +1 -1
  83. package/dist/browser/prod/excalidraw-assets/{sequenceDiagram-acc0e65c-H3XEHT32.js → sequenceDiagram-acc0e65c-IBSENK6W.js} +1 -1
  84. package/dist/browser/prod/excalidraw-assets/{stateDiagram-0ff1cf1a-Z5WB6Q3P.js → stateDiagram-0ff1cf1a-DB73XNZH.js} +1 -1
  85. package/dist/browser/prod/excalidraw-assets/{stateDiagram-v2-9a9d610d-T7OZETQC.js → stateDiagram-v2-9a9d610d-2OOBUPNR.js} +1 -1
  86. package/dist/browser/prod/excalidraw-assets/{timeline-definition-fea2a41d-VVC22BWF.js → timeline-definition-fea2a41d-P3NQQVDU.js} +1 -1
  87. package/dist/browser/prod/excalidraw-assets/{xychartDiagram-ab372869-JAXODQF7.js → xychartDiagram-ab372869-HI3XLK3Y.js} +1 -1
  88. package/dist/browser/prod/index.css +1 -1
  89. package/dist/browser/prod/index.js +24 -24
  90. package/dist/dev/{en-II4GK66F.json → en-OIPCBIOA.json} +8 -4
  91. package/dist/dev/index.css +72 -28
  92. package/dist/dev/index.css.map +3 -3
  93. package/dist/dev/index.js +5626 -3465
  94. package/dist/dev/index.js.map +4 -4
  95. package/dist/excalidraw/actions/actionAddToLibrary.d.ts +4 -4
  96. package/dist/excalidraw/actions/actionAddToLibrary.js +4 -3
  97. package/dist/excalidraw/actions/actionAlign.d.ts +22 -22
  98. package/dist/excalidraw/actions/actionAlign.js +7 -6
  99. package/dist/excalidraw/actions/actionBoundText.d.ts +10 -10
  100. package/dist/excalidraw/actions/actionBoundText.js +11 -5
  101. package/dist/excalidraw/actions/actionCanvas.d.ts +52 -52
  102. package/dist/excalidraw/actions/actionCanvas.js +19 -14
  103. package/dist/excalidraw/actions/actionClipboard.d.ts +24 -24
  104. package/dist/excalidraw/actions/actionClipboard.js +14 -13
  105. package/dist/excalidraw/actions/actionDeleteSelected.d.ts +10 -10
  106. package/dist/excalidraw/actions/actionDeleteSelected.js +6 -3
  107. package/dist/excalidraw/actions/actionDistribute.d.ts +10 -10
  108. package/dist/excalidraw/actions/actionDistribute.js +3 -2
  109. package/dist/excalidraw/actions/actionDuplicateSelection.d.ts +7 -8
  110. package/dist/excalidraw/actions/actionDuplicateSelection.js +7 -3
  111. package/dist/excalidraw/actions/actionElementLock.d.ts +9 -9
  112. package/dist/excalidraw/actions/actionElementLock.js +3 -2
  113. package/dist/excalidraw/actions/actionExport.d.ts +33 -33
  114. package/dist/excalidraw/actions/actionExport.js +15 -11
  115. package/dist/excalidraw/actions/actionFinalize.d.ts +9 -9
  116. package/dist/excalidraw/actions/actionFinalize.js +9 -5
  117. package/dist/excalidraw/actions/actionFlip.d.ts +10 -10
  118. package/dist/excalidraw/actions/actionFlip.js +12 -12
  119. package/dist/excalidraw/actions/actionFrame.d.ts +16 -171
  120. package/dist/excalidraw/actions/actionFrame.js +7 -6
  121. package/dist/excalidraw/actions/actionGroup.d.ts +12 -322
  122. package/dist/excalidraw/actions/actionGroup.js +9 -11
  123. package/dist/excalidraw/actions/actionHistory.d.ts +4 -3
  124. package/dist/excalidraw/actions/actionHistory.js +27 -28
  125. package/dist/excalidraw/actions/actionLinearEditor.d.ts +6 -4
  126. package/dist/excalidraw/actions/actionLinearEditor.js +21 -5
  127. package/dist/excalidraw/actions/actionLink.d.ts +5 -5
  128. package/dist/excalidraw/actions/actionLink.js +2 -1
  129. package/dist/excalidraw/actions/actionMenu.d.ts +8 -8
  130. package/dist/excalidraw/actions/actionMenu.js +4 -3
  131. package/dist/excalidraw/actions/actionNavigate.d.ts +4 -4
  132. package/dist/excalidraw/actions/actionNavigate.js +3 -2
  133. package/dist/excalidraw/actions/actionProperties.d.ts +34 -34
  134. package/dist/excalidraw/actions/actionProperties.js +19 -14
  135. package/dist/excalidraw/actions/actionSelectAll.d.ts +5 -5
  136. package/dist/excalidraw/actions/actionSelectAll.js +2 -1
  137. package/dist/excalidraw/actions/actionStyles.d.ts +9 -12
  138. package/dist/excalidraw/actions/actionStyles.js +4 -3
  139. package/dist/excalidraw/actions/actionTextAutoResize.d.ts +17 -0
  140. package/dist/excalidraw/actions/actionTextAutoResize.js +38 -0
  141. package/dist/excalidraw/actions/actionToggleGridMode.d.ts +7 -5
  142. package/dist/excalidraw/actions/actionToggleGridMode.js +6 -2
  143. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +4 -4
  144. package/dist/excalidraw/actions/actionToggleObjectsSnapMode.js +2 -1
  145. package/dist/excalidraw/actions/actionToggleStats.d.ts +4 -4
  146. package/dist/excalidraw/actions/actionToggleStats.js +2 -1
  147. package/dist/excalidraw/actions/actionToggleViewMode.d.ts +4 -4
  148. package/dist/excalidraw/actions/actionToggleViewMode.js +2 -1
  149. package/dist/excalidraw/actions/actionToggleZenMode.d.ts +4 -4
  150. package/dist/excalidraw/actions/actionToggleZenMode.js +2 -1
  151. package/dist/excalidraw/actions/actionZindex.d.ts +23 -19
  152. package/dist/excalidraw/actions/actionZindex.js +9 -4
  153. package/dist/excalidraw/actions/manager.d.ts +5 -5
  154. package/dist/excalidraw/actions/register.d.ts +1 -1
  155. package/dist/excalidraw/actions/shortcuts.d.ts +2 -2
  156. package/dist/excalidraw/actions/shortcuts.js +1 -1
  157. package/dist/excalidraw/actions/types.d.ts +8 -8
  158. package/dist/excalidraw/align.d.ts +1 -1
  159. package/dist/excalidraw/analytics.js +1 -1
  160. package/dist/excalidraw/animated-trail.d.ts +2 -2
  161. package/dist/excalidraw/appState.d.ts +5 -5
  162. package/dist/excalidraw/change.d.ts +191 -0
  163. package/dist/excalidraw/change.js +894 -0
  164. package/dist/excalidraw/charts.d.ts +1 -1
  165. package/dist/excalidraw/clients.d.ts +2 -2
  166. package/dist/excalidraw/clients.js +1 -1
  167. package/dist/excalidraw/clipboard.d.ts +3 -3
  168. package/dist/excalidraw/colors.d.ts +1 -1
  169. package/dist/excalidraw/components/Actions.d.ts +3 -3
  170. package/dist/excalidraw/components/Actions.js +9 -6
  171. package/dist/excalidraw/components/App.d.ts +28 -14
  172. package/dist/excalidraw/components/App.js +407 -187
  173. package/dist/excalidraw/components/ButtonIconSelect.js +1 -1
  174. package/dist/excalidraw/components/CheckboxItem.js +1 -1
  175. package/dist/excalidraw/components/ColorPicker/ColorInput.d.ts +1 -1
  176. package/dist/excalidraw/components/ColorPicker/ColorInput.js +1 -1
  177. package/dist/excalidraw/components/ColorPicker/ColorPicker.d.ts +4 -4
  178. package/dist/excalidraw/components/ColorPicker/ColorPicker.js +1 -1
  179. package/dist/excalidraw/components/ColorPicker/Picker.d.ts +3 -3
  180. package/dist/excalidraw/components/ColorPicker/PickerColorList.d.ts +1 -1
  181. package/dist/excalidraw/components/ColorPicker/PickerHeading.d.ts +1 -1
  182. package/dist/excalidraw/components/ColorPicker/ShadeList.d.ts +1 -1
  183. package/dist/excalidraw/components/ColorPicker/TopPicks.d.ts +1 -1
  184. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +2 -2
  185. package/dist/excalidraw/components/ColorPicker/colorPickerUtils.js +1 -1
  186. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -2
  187. package/dist/excalidraw/components/ColorPicker/keyboardNavHandlers.js +1 -1
  188. package/dist/excalidraw/components/CommandPalette/CommandPalette.d.ts +1 -1
  189. package/dist/excalidraw/components/CommandPalette/CommandPalette.js +30 -15
  190. package/dist/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -1
  191. package/dist/excalidraw/components/CommandPalette/types.d.ts +3 -3
  192. package/dist/excalidraw/components/ConfirmDialog.d.ts +1 -1
  193. package/dist/excalidraw/components/ContextMenu.d.ts +2 -2
  194. package/dist/excalidraw/components/ContextMenu.js +2 -2
  195. package/dist/excalidraw/components/DarkModeToggle.d.ts +1 -1
  196. package/dist/excalidraw/components/DarkModeToggle.js +3 -1
  197. package/dist/excalidraw/components/DefaultSidebar.d.ts +2 -2
  198. package/dist/excalidraw/components/Dialog.js +1 -1
  199. package/dist/excalidraw/components/DialogActionButton.d.ts +1 -1
  200. package/dist/excalidraw/components/EyeDropper.d.ts +2 -2
  201. package/dist/excalidraw/components/FollowMode/FollowMode.d.ts +1 -1
  202. package/dist/excalidraw/components/FollowMode/FollowMode.js +1 -1
  203. package/dist/excalidraw/components/HelpDialog.js +8 -6
  204. package/dist/excalidraw/components/HintViewer.d.ts +1 -1
  205. package/dist/excalidraw/components/IconPicker.js +2 -2
  206. package/dist/excalidraw/components/ImageExportDialog.d.ts +1 -1
  207. package/dist/excalidraw/components/InitializeApp.d.ts +2 -2
  208. package/dist/excalidraw/components/JSONExportDialog.d.ts +3 -3
  209. package/dist/excalidraw/components/LayerUI.d.ts +4 -4
  210. package/dist/excalidraw/components/LayerUI.js +2 -2
  211. package/dist/excalidraw/components/LibraryMenu.d.ts +2 -2
  212. package/dist/excalidraw/components/LibraryMenuBrowseButton.d.ts +1 -1
  213. package/dist/excalidraw/components/LibraryMenuControlButtons.d.ts +1 -1
  214. package/dist/excalidraw/components/LibraryMenuHeaderContent.d.ts +2 -2
  215. package/dist/excalidraw/components/LibraryMenuItems.d.ts +1 -1
  216. package/dist/excalidraw/components/LibraryMenuSection.d.ts +5 -4
  217. package/dist/excalidraw/components/LibraryUnit.d.ts +2 -2
  218. package/dist/excalidraw/components/LoadingMessage.d.ts +1 -1
  219. package/dist/excalidraw/components/MagicSettings.js +2 -2
  220. package/dist/excalidraw/components/MobileMenu.d.ts +3 -3
  221. package/dist/excalidraw/components/MobileMenu.js +1 -1
  222. package/dist/excalidraw/components/Modal.d.ts +1 -1
  223. package/dist/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  224. package/dist/excalidraw/components/PasteChartDialog.d.ts +1 -1
  225. package/dist/excalidraw/components/PasteChartDialog.js +1 -1
  226. package/dist/excalidraw/components/PublishLibrary.d.ts +1 -1
  227. package/dist/excalidraw/components/RadioGroup.d.ts +2 -1
  228. package/dist/excalidraw/components/RadioGroup.js +1 -1
  229. package/dist/excalidraw/components/SVGLayer.d.ts +1 -1
  230. package/dist/excalidraw/components/Sidebar/Sidebar.d.ts +2 -2
  231. package/dist/excalidraw/components/Sidebar/Sidebar.js +1 -1
  232. package/dist/excalidraw/components/Sidebar/SidebarTab.d.ts +1 -1
  233. package/dist/excalidraw/components/Sidebar/SidebarTabTrigger.d.ts +1 -1
  234. package/dist/excalidraw/components/Sidebar/SidebarTrigger.d.ts +1 -1
  235. package/dist/excalidraw/components/Sidebar/common.d.ts +1 -1
  236. package/dist/excalidraw/components/Stack.d.ts +2 -2
  237. package/dist/excalidraw/components/Stats.d.ts +2 -2
  238. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.d.ts +1 -1
  239. package/dist/excalidraw/components/TTDDialog/MermaidToExcalidraw.js +6 -2
  240. package/dist/excalidraw/components/TTDDialog/TTDDialog.js +2 -2
  241. package/dist/excalidraw/components/TTDDialog/TTDDialogInput.d.ts +1 -1
  242. package/dist/excalidraw/components/TTDDialog/TTDDialogPanel.d.ts +1 -1
  243. package/dist/excalidraw/components/TTDDialog/TTDDialogPanels.d.ts +1 -1
  244. package/dist/excalidraw/components/TTDDialog/TTDDialogTabs.d.ts +1 -1
  245. package/dist/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +1 -1
  246. package/dist/excalidraw/components/TTDDialog/common.d.ts +4 -4
  247. package/dist/excalidraw/components/TextField.d.ts +1 -1
  248. package/dist/excalidraw/components/Toast.d.ts +1 -1
  249. package/dist/excalidraw/components/ToolButton.d.ts +4 -2
  250. package/dist/excalidraw/components/ToolButton.js +1 -1
  251. package/dist/excalidraw/components/Trans.d.ts +1 -1
  252. package/dist/excalidraw/components/UserList.d.ts +1 -1
  253. package/dist/excalidraw/components/canvases/InteractiveCanvas.d.ts +3 -2
  254. package/dist/excalidraw/components/canvases/InteractiveCanvas.js +3 -2
  255. package/dist/excalidraw/components/canvases/StaticCanvas.d.ts +2 -2
  256. package/dist/excalidraw/components/canvases/StaticCanvas.js +2 -2
  257. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItem.js +2 -2
  258. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +18 -0
  259. package/dist/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.js +9 -0
  260. package/dist/excalidraw/components/footer/Footer.d.ts +2 -2
  261. package/dist/excalidraw/components/hyperlink/Hyperlink.d.ts +2 -2
  262. package/dist/excalidraw/components/hyperlink/Hyperlink.js +3 -3
  263. package/dist/excalidraw/components/hyperlink/helpers.d.ts +3 -3
  264. package/dist/excalidraw/components/hyperlink/helpers.js +2 -3
  265. package/dist/excalidraw/components/icons.d.ts +6 -1
  266. package/dist/excalidraw/components/icons.js +23 -5
  267. package/dist/excalidraw/components/main-menu/DefaultItems.d.ts +12 -2
  268. package/dist/excalidraw/components/main-menu/DefaultItems.js +38 -7
  269. package/dist/excalidraw/constants.d.ts +5 -5
  270. package/dist/excalidraw/constants.js +6 -3
  271. package/dist/excalidraw/context/ui-appState.d.ts +1 -1
  272. package/dist/excalidraw/cursor.d.ts +1 -1
  273. package/dist/excalidraw/data/EditorLocalStorage.d.ts +2 -2
  274. package/dist/excalidraw/data/blob.d.ts +5 -5
  275. package/dist/excalidraw/data/filesystem.d.ts +2 -1
  276. package/dist/excalidraw/data/index.d.ts +4 -4
  277. package/dist/excalidraw/data/json.d.ts +3 -3
  278. package/dist/excalidraw/data/library.d.ts +3 -3
  279. package/dist/excalidraw/data/magic.d.ts +3 -3
  280. package/dist/excalidraw/data/magic.js +2 -1
  281. package/dist/excalidraw/data/reconcile.d.ts +6 -0
  282. package/dist/excalidraw/data/reconcile.js +49 -0
  283. package/dist/excalidraw/data/resave.d.ts +2 -2
  284. package/dist/excalidraw/data/restore.d.ts +5 -5
  285. package/dist/excalidraw/data/restore.js +7 -7
  286. package/dist/excalidraw/data/transform.d.ts +4 -4
  287. package/dist/excalidraw/data/transform.js +12 -3
  288. package/dist/excalidraw/data/types.d.ts +3 -3
  289. package/dist/excalidraw/data/url.d.ts +1 -0
  290. package/dist/excalidraw/data/url.js +4 -1
  291. package/dist/excalidraw/element/ElementCanvasButtons.d.ts +1 -1
  292. package/dist/excalidraw/element/binding.d.ts +50 -9
  293. package/dist/excalidraw/element/binding.js +712 -155
  294. package/dist/excalidraw/element/bounds.d.ts +3 -4
  295. package/dist/excalidraw/element/bounds.js +0 -3
  296. package/dist/excalidraw/element/collision.d.ts +14 -19
  297. package/dist/excalidraw/element/collision.js +36 -713
  298. package/dist/excalidraw/element/containerCache.d.ts +1 -1
  299. package/dist/excalidraw/element/dragElements.d.ts +3 -3
  300. package/dist/excalidraw/element/embeddable.d.ts +9 -6
  301. package/dist/excalidraw/element/embeddable.js +98 -62
  302. package/dist/excalidraw/element/image.d.ts +2 -2
  303. package/dist/excalidraw/element/index.d.ts +2 -3
  304. package/dist/excalidraw/element/index.js +1 -2
  305. package/dist/excalidraw/element/linearElementEditor.d.ts +12 -12
  306. package/dist/excalidraw/element/linearElementEditor.js +7 -5
  307. package/dist/excalidraw/element/mutateElement.d.ts +4 -5
  308. package/dist/excalidraw/element/mutateElement.js +5 -3
  309. package/dist/excalidraw/element/newElement.d.ts +4 -9
  310. package/dist/excalidraw/element/newElement.js +17 -14
  311. package/dist/excalidraw/element/resizeElements.d.ts +4 -4
  312. package/dist/excalidraw/element/resizeElements.js +170 -97
  313. package/dist/excalidraw/element/resizeTest.d.ts +7 -7
  314. package/dist/excalidraw/element/resizeTest.js +53 -8
  315. package/dist/excalidraw/element/showSelectedShapeActions.d.ts +2 -2
  316. package/dist/excalidraw/element/sizeHelpers.d.ts +2 -2
  317. package/dist/excalidraw/element/sizeHelpers.js +3 -0
  318. package/dist/excalidraw/element/sortElements.d.ts +1 -1
  319. package/dist/excalidraw/element/textElement.d.ts +5 -6
  320. package/dist/excalidraw/element/textElement.js +13 -37
  321. package/dist/excalidraw/element/textWysiwyg.d.ts +10 -5
  322. package/dist/excalidraw/element/textWysiwyg.js +6 -8
  323. package/dist/excalidraw/element/transformHandles.d.ts +24 -6
  324. package/dist/excalidraw/element/transformHandles.js +22 -11
  325. package/dist/excalidraw/element/typeChecks.d.ts +4 -4
  326. package/dist/excalidraw/element/types.d.ts +33 -10
  327. package/dist/excalidraw/emitter.d.ts +1 -1
  328. package/dist/excalidraw/errors.d.ts +3 -0
  329. package/dist/excalidraw/errors.js +3 -0
  330. package/dist/excalidraw/fractionalIndex.d.ts +40 -0
  331. package/dist/excalidraw/fractionalIndex.js +241 -0
  332. package/dist/excalidraw/frame.d.ts +4 -4
  333. package/dist/excalidraw/gatransforms.d.ts +1 -1
  334. package/dist/excalidraw/gesture.d.ts +1 -1
  335. package/dist/excalidraw/groups.d.ts +5 -3
  336. package/dist/excalidraw/groups.js +17 -0
  337. package/dist/excalidraw/history.d.ts +35 -47
  338. package/dist/excalidraw/history.js +100 -167
  339. package/dist/excalidraw/hooks/useCreatePortalContainer.js +2 -1
  340. package/dist/excalidraw/hooks/useEmitter.d.ts +2 -0
  341. package/dist/excalidraw/hooks/useEmitter.js +13 -0
  342. package/dist/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  343. package/dist/excalidraw/i18n.d.ts +1 -1
  344. package/dist/excalidraw/index.d.ts +3 -1
  345. package/dist/excalidraw/index.js +2 -0
  346. package/dist/excalidraw/jotai.d.ts +1 -1
  347. package/dist/excalidraw/laser-trails.d.ts +3 -2
  348. package/dist/excalidraw/locales/en.json +8 -4
  349. package/dist/excalidraw/math.d.ts +2 -2
  350. package/dist/excalidraw/points.d.ts +1 -1
  351. package/dist/excalidraw/queue.d.ts +1 -1
  352. package/dist/excalidraw/renderer/helpers.d.ts +2 -2
  353. package/dist/excalidraw/renderer/helpers.js +2 -2
  354. package/dist/excalidraw/renderer/interactiveScene.d.ts +2 -2
  355. package/dist/excalidraw/renderer/interactiveScene.js +8 -7
  356. package/dist/excalidraw/renderer/renderElement.d.ts +3 -3
  357. package/dist/excalidraw/renderer/renderElement.js +5 -5
  358. package/dist/excalidraw/renderer/renderSnaps.d.ts +1 -1
  359. package/dist/excalidraw/renderer/renderSnaps.js +2 -1
  360. package/dist/excalidraw/renderer/staticScene.d.ts +1 -1
  361. package/dist/excalidraw/renderer/staticScene.js +14 -3
  362. package/dist/excalidraw/renderer/staticSvgScene.d.ts +4 -4
  363. package/dist/excalidraw/renderer/staticSvgScene.js +10 -0
  364. package/dist/excalidraw/scene/Fonts.d.ts +2 -4
  365. package/dist/excalidraw/scene/Fonts.js +6 -12
  366. package/dist/excalidraw/scene/Renderer.d.ts +4 -4
  367. package/dist/excalidraw/scene/Renderer.js +2 -3
  368. package/dist/excalidraw/scene/Scene.d.ts +19 -12
  369. package/dist/excalidraw/scene/Scene.js +44 -23
  370. package/dist/excalidraw/scene/Shape.d.ts +1 -1
  371. package/dist/excalidraw/scene/ShapeCache.d.ts +4 -4
  372. package/dist/excalidraw/scene/comparisons.d.ts +2 -2
  373. package/dist/excalidraw/scene/export.d.ts +2 -2
  374. package/dist/excalidraw/scene/export.js +6 -5
  375. package/dist/excalidraw/scene/scroll.d.ts +2 -2
  376. package/dist/excalidraw/scene/scrollbars.d.ts +3 -3
  377. package/dist/excalidraw/scene/selection.d.ts +2 -2
  378. package/dist/excalidraw/scene/types.d.ts +5 -4
  379. package/dist/excalidraw/scene/zoom.d.ts +1 -1
  380. package/dist/excalidraw/snapping.d.ts +4 -4
  381. package/dist/excalidraw/store.d.ts +99 -0
  382. package/dist/excalidraw/store.js +269 -0
  383. package/dist/excalidraw/types.d.ts +33 -19
  384. package/dist/excalidraw/utils.d.ts +11 -4
  385. package/dist/excalidraw/utils.js +8 -0
  386. package/dist/excalidraw/zindex.d.ts +4 -4
  387. package/dist/excalidraw/zindex.js +9 -13
  388. package/dist/prod/{en-II4GK66F.json → en-OIPCBIOA.json} +8 -4
  389. package/dist/prod/index.css +1 -1
  390. package/dist/prod/index.js +44 -44
  391. package/dist/utils/bbox.d.ts +2 -2
  392. package/dist/utils/collision.d.ts +4 -0
  393. package/dist/utils/collision.js +48 -0
  394. package/dist/utils/export.d.ts +2 -2
  395. package/dist/utils/geometry/geometry.d.ts +71 -0
  396. package/dist/utils/geometry/geometry.js +674 -0
  397. package/dist/utils/geometry/shape.d.ts +56 -0
  398. package/dist/utils/geometry/shape.js +168 -0
  399. package/dist/utils/withinBounds.d.ts +1 -1
  400. package/history.ts +163 -218
  401. package/package.json +3 -2
  402. package/dist/browser/dev/excalidraw-assets-dev/chunk-AK7SWNLN.js.map +0 -7
  403. package/dist/browser/dev/excalidraw-assets-dev/chunk-RWZVJAQU.js.map +0 -7
  404. package/dist/browser/dev/excalidraw-assets-dev/chunk-Z3PH3V2B.js.map +0 -7
  405. package/dist/browser/dev/excalidraw-assets-dev/dist-Z46EOVOL.js.map +0 -7
  406. package/dist/browser/dev/excalidraw-assets-dev/image-OFRRV5MB.css.map +0 -7
  407. package/dist/browser/prod/excalidraw-assets/chunk-LL4GORAM.js +0 -55
  408. package/dist/browser/prod/excalidraw-assets/dist-PIPZXALV.js +0 -6
  409. package/dist/browser/prod/excalidraw-assets/image-EFCJDJH3.js +0 -1
  410. /package/dist/browser/dev/excalidraw-assets-dev/{blockDiagram-91b80b7a-ACFH36JV.js.map → blockDiagram-91b80b7a-H47FTXHA.js.map} +0 -0
  411. /package/dist/browser/dev/excalidraw-assets-dev/{c4Diagram-b2a90758-QZ27YR47.js.map → c4Diagram-b2a90758-NNJK6GKC.js.map} +0 -0
  412. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-HO2HMSK7.js.map → chunk-4KQVEBHW.js.map} +0 -0
  413. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-USGV265L.js.map → chunk-53YI56GV.js.map} +0 -0
  414. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-EDFX3S7X.js.map → chunk-A2WCJI4I.js.map} +0 -0
  415. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-IX4V72YG.js.map → chunk-EFLPX7NE.js.map} +0 -0
  416. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-MXVETLVM.js.map → chunk-JYIQCNWV.js.map} +0 -0
  417. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-YZIOORVX.js.map → chunk-LVIQQW6F.js.map} +0 -0
  418. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-6U7GQNJT.js.map → chunk-PXLO3FOU.js.map} +0 -0
  419. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-7DACDEY3.js.map → chunk-TO2AW5PW.js.map} +0 -0
  420. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-NJ77ZFNJ.js.map → chunk-VURILHLY.js.map} +0 -0
  421. /package/dist/browser/dev/excalidraw-assets-dev/{chunk-2T2GU7NF.js.map → chunk-ZAYGSUHF.js.map} +0 -0
  422. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-30eddba6-QSLMH4JW.js.map → classDiagram-30eddba6-CUYIJICN.js.map} +0 -0
  423. /package/dist/browser/dev/excalidraw-assets-dev/{classDiagram-v2-f2df5561-DY4DYQ5P.js.map → classDiagram-v2-f2df5561-K6WW6K73.js.map} +0 -0
  424. /package/dist/browser/dev/excalidraw-assets-dev/{en-5TCZHGGJ.js.map → en-Y27YPU72.js.map} +0 -0
  425. /package/dist/browser/dev/excalidraw-assets-dev/{erDiagram-47591fe2-SOOJRTCB.js.map → erDiagram-47591fe2-XGAD7EEP.js.map} +0 -0
  426. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-5540d9b9-AHGL4KPK.js.map → flowDiagram-5540d9b9-B6EOVNNO.js.map} +0 -0
  427. /package/dist/browser/dev/excalidraw-assets-dev/{flowDiagram-v2-3b53844e-56LDZZWY.js.map → flowDiagram-v2-3b53844e-NUG24FJH.js.map} +0 -0
  428. /package/dist/browser/dev/excalidraw-assets-dev/{flowchart-elk-definition-5fe447d6-27LUKRI6.js.map → flowchart-elk-definition-5fe447d6-25Y7PCBL.js.map} +0 -0
  429. /package/dist/browser/dev/excalidraw-assets-dev/{ganttDiagram-9a3bba1f-EHGYGNG6.js.map → ganttDiagram-9a3bba1f-GNL6ZDTC.js.map} +0 -0
  430. /package/dist/browser/dev/excalidraw-assets-dev/{gitGraphDiagram-96e6b4ee-AJQNBDW5.js.map → gitGraphDiagram-96e6b4ee-HNW52NVO.js.map} +0 -0
  431. /package/dist/browser/dev/excalidraw-assets-dev/{image-EDKQZH7Z.js.map → image-Y5X7K6KW.js.map} +0 -0
  432. /package/dist/browser/dev/excalidraw-assets-dev/{infoDiagram-bcd20f53-SWLLQVES.js.map → infoDiagram-bcd20f53-FWEUVFLT.js.map} +0 -0
  433. /package/dist/browser/dev/excalidraw-assets-dev/{journeyDiagram-4fe6b3dc-7UAVCWOZ.js.map → journeyDiagram-4fe6b3dc-RZIUI7UG.js.map} +0 -0
  434. /package/dist/browser/dev/excalidraw-assets-dev/{mindmap-definition-f354de21-SROW5KGM.js.map → mindmap-definition-f354de21-GBVN45GU.js.map} +0 -0
  435. /package/dist/browser/dev/excalidraw-assets-dev/{pieDiagram-79897490-QKCI6NCB.js.map → pieDiagram-79897490-ECENNII6.js.map} +0 -0
  436. /package/dist/browser/dev/excalidraw-assets-dev/{quadrantDiagram-62f64e94-LNYJZFC5.js.map → quadrantDiagram-62f64e94-ZMEOFVNL.js.map} +0 -0
  437. /package/dist/browser/dev/excalidraw-assets-dev/{requirementDiagram-05bf5f74-ZZD7ZHFA.js.map → requirementDiagram-05bf5f74-FHZSFHCR.js.map} +0 -0
  438. /package/dist/browser/dev/excalidraw-assets-dev/{sankeyDiagram-97764748-L75ZZ4UM.js.map → sankeyDiagram-97764748-VDKIKTA6.js.map} +0 -0
  439. /package/dist/browser/dev/excalidraw-assets-dev/{sequenceDiagram-acc0e65c-6PCU7TDK.js.map → sequenceDiagram-acc0e65c-6JUSPVKX.js.map} +0 -0
  440. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-0ff1cf1a-WM76WOPR.js.map → stateDiagram-0ff1cf1a-L3AKWENF.js.map} +0 -0
  441. /package/dist/browser/dev/excalidraw-assets-dev/{stateDiagram-v2-9a9d610d-N4HZW3O2.js.map → stateDiagram-v2-9a9d610d-NU3GGMCH.js.map} +0 -0
  442. /package/dist/browser/dev/excalidraw-assets-dev/{timeline-definition-fea2a41d-ZHGCAXGP.js.map → timeline-definition-fea2a41d-JGP7XCHW.js.map} +0 -0
  443. /package/dist/browser/dev/excalidraw-assets-dev/{xychartDiagram-ab372869-2DLOVRAZ.js.map → xychartDiagram-ab372869-HLFHHF2I.js.map} +0 -0
@@ -1,730 +1,53 @@
1
- import * as GA from "../ga";
2
- import * as GAPoint from "../gapoints";
3
- import * as GADirection from "../gadirections";
4
- import * as GALine from "../galines";
5
- import * as GATransform from "../gatransforms";
6
- import { distance2d, rotatePoint, isPathALoop, isPointInPolygon, rotate, } from "../math";
7
- import { pointsOnBezierCurves } from "points-on-curve";
8
- import { getElementAbsoluteCoords, getCurvePathOps, getRectangleBoxAbsoluteCoords, } from "./bounds";
9
- import { hasBoundTextElement, isFrameLikeElement, isIframeLikeElement, isImageElement, } from "./typeChecks";
10
- import { isTextElement } from ".";
1
+ import { isPathALoop, isPointWithinBounds } from "../math";
2
+ import { getElementBounds } from "./bounds";
3
+ import { getPolygonShape } from "../../utils/geometry/shape";
4
+ import { isPointInShape, isPointOnShape } from "../../utils/collision";
11
5
  import { isTransparent } from "../utils";
12
- import { shouldShowBoundingBox } from "./transformHandles";
13
- import { getBoundTextElement } from "./textElement";
14
- import { ShapeCache } from "../scene/ShapeCache";
15
- const isElementDraggableFromInside = (element) => {
6
+ import { hasBoundTextElement, isIframeLikeElement, isImageElement, isTextElement, } from "./typeChecks";
7
+ export const shouldTestInside = (element) => {
16
8
  if (element.type === "arrow") {
17
9
  return false;
18
10
  }
19
- if (element.type === "freedraw") {
20
- return true;
21
- }
22
11
  const isDraggableFromInside = !isTransparent(element.backgroundColor) ||
23
12
  hasBoundTextElement(element) ||
24
- isIframeLikeElement(element);
13
+ isIframeLikeElement(element) ||
14
+ isTextElement(element);
25
15
  if (element.type === "line") {
26
16
  return isDraggableFromInside && isPathALoop(element.points);
27
17
  }
28
- return isDraggableFromInside || isImageElement(element);
29
- };
30
- export const hitTest = (element, appState, frameNameBoundsCache, x, y, elementsMap) => {
31
- // How many pixels off the shape boundary we still consider a hit
32
- const threshold = 10 / appState.zoom.value;
33
- const point = [x, y];
34
- if (isElementSelected(appState, element) &&
35
- shouldShowBoundingBox([element], appState)) {
36
- return isPointHittingElementBoundingBox(element, elementsMap, point, threshold, frameNameBoundsCache);
37
- }
38
- const boundTextElement = getBoundTextElement(element, elementsMap);
39
- if (boundTextElement) {
40
- const isHittingBoundTextElement = hitTest(boundTextElement, appState, frameNameBoundsCache, x, y, elementsMap);
41
- if (isHittingBoundTextElement) {
42
- return true;
43
- }
44
- }
45
- return isHittingElementNotConsideringBoundingBox(element, appState, frameNameBoundsCache, point, elementsMap);
46
- };
47
- export const isHittingElementBoundingBoxWithoutHittingElement = (element, appState, frameNameBoundsCache, x, y, elementsMap) => {
48
- const threshold = 10 / appState.zoom.value;
49
- // So that bound text element hit is considered within bounding box of container even if its outside actual bounding box of element
50
- // eg for linear elements text can be outside the element bounding box
51
- const boundTextElement = getBoundTextElement(element, elementsMap);
52
- if (boundTextElement &&
53
- hitTest(boundTextElement, appState, frameNameBoundsCache, x, y, elementsMap)) {
54
- return false;
18
+ if (element.type === "freedraw") {
19
+ return isDraggableFromInside && isPathALoop(element.points);
55
20
  }
56
- return (!isHittingElementNotConsideringBoundingBox(element, appState, frameNameBoundsCache, [x, y], elementsMap) &&
57
- isPointHittingElementBoundingBox(element, elementsMap, [x, y], threshold, frameNameBoundsCache));
58
- };
59
- export const isHittingElementNotConsideringBoundingBox = (element, appState, frameNameBoundsCache, point, elementsMap) => {
60
- const threshold = 10 / appState.zoom.value;
61
- const check = isTextElement(element)
62
- ? isStrictlyInside
63
- : isElementDraggableFromInside(element)
64
- ? isInsideCheck
65
- : isNearCheck;
66
- return hitTestPointAgainstElement({
67
- element,
68
- elementsMap,
69
- point,
70
- threshold,
71
- check,
72
- frameNameBoundsCache,
73
- });
21
+ return isDraggableFromInside || isImageElement(element);
74
22
  };
75
- const isElementSelected = (appState, element) => appState.selectedElementIds[element.id];
76
- export const isPointHittingElementBoundingBox = (element, elementsMap, [x, y], threshold, frameNameBoundsCache) => {
77
- // frames needs be checked differently so as to be able to drag it
78
- // by its frame, whether it has been selected or not
79
- // this logic here is not ideal
80
- // TODO: refactor it later...
81
- if (isFrameLikeElement(element)) {
82
- return hitTestPointAgainstElement({
83
- element,
84
- elementsMap,
85
- point: [x, y],
86
- threshold,
87
- check: isInsideCheck,
88
- frameNameBoundsCache,
23
+ export const hitElementItself = ({ x, y, element, shape, threshold = 10, frameNameBound = null, }) => {
24
+ let hit = shouldTestInside(element)
25
+ ? // Since `inShape` tests STRICTLY againt the insides of a shape
26
+ // we would need `onShape` as well to include the "borders"
27
+ isPointInShape([x, y], shape) || isPointOnShape([x, y], shape, threshold)
28
+ : isPointOnShape([x, y], shape, threshold);
29
+ // hit test against a frame's name
30
+ if (!hit && frameNameBound) {
31
+ hit = isPointInShape([x, y], {
32
+ type: "polygon",
33
+ data: getPolygonShape(frameNameBound)
34
+ .data,
89
35
  });
90
36
  }
91
- const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
92
- const elementCenterX = (x1 + x2) / 2;
93
- const elementCenterY = (y1 + y2) / 2;
94
- // reverse rotate to take element's angle into account.
95
- const [rotatedX, rotatedY] = rotate(x, y, elementCenterX, elementCenterY, -element.angle);
96
- return (rotatedX > x1 - threshold &&
97
- rotatedX < x2 + threshold &&
98
- rotatedY > y1 - threshold &&
99
- rotatedY < y2 + threshold);
100
- };
101
- export const bindingBorderTest = (element, { x, y }, elementsMap) => {
102
- const threshold = maxBindingGap(element, element.width, element.height);
103
- const check = isOutsideCheck;
104
- const point = [x, y];
105
- return hitTestPointAgainstElement({
106
- element,
107
- elementsMap,
108
- point,
109
- threshold,
110
- check,
111
- frameNameBoundsCache: null,
112
- });
113
- };
114
- export const maxBindingGap = (element, elementWidth, elementHeight) => {
115
- // Aligns diamonds with rectangles
116
- const shapeRatio = element.type === "diamond" ? 1 / Math.sqrt(2) : 1;
117
- const smallerDimension = shapeRatio * Math.min(elementWidth, elementHeight);
118
- // We make the bindable boundary bigger for bigger elements
119
- return Math.max(16, Math.min(0.25 * smallerDimension, 32));
120
- };
121
- const hitTestPointAgainstElement = (args) => {
122
- switch (args.element.type) {
123
- case "rectangle":
124
- case "iframe":
125
- case "embeddable":
126
- case "image":
127
- case "text":
128
- case "diamond":
129
- case "ellipse":
130
- const distance = distanceToBindableElement(args.element, args.point, args.elementsMap);
131
- return args.check(distance, args.threshold);
132
- case "freedraw": {
133
- if (!args.check(distanceToRectangle(args.element, args.point, args.elementsMap), args.threshold)) {
134
- return false;
135
- }
136
- return hitTestFreeDrawElement(args.element, args.point, args.threshold, args.elementsMap);
137
- }
138
- case "arrow":
139
- case "line":
140
- return hitTestLinear(args);
141
- case "selection":
142
- console.warn("This should not happen, we need to investigate why it does.");
143
- return false;
144
- case "frame":
145
- case "magicframe": {
146
- // check distance to frame element first
147
- if (args.check(distanceToBindableElement(args.element, args.point, args.elementsMap), args.threshold)) {
148
- return true;
149
- }
150
- const frameNameBounds = args.frameNameBoundsCache?.get(args.element);
151
- if (frameNameBounds) {
152
- return args.check(distanceToRectangleBox(frameNameBounds, args.point), args.threshold);
153
- }
154
- return false;
155
- }
156
- }
157
- };
158
- export const distanceToBindableElement = (element, point, elementsMap) => {
159
- switch (element.type) {
160
- case "rectangle":
161
- case "image":
162
- case "text":
163
- case "iframe":
164
- case "embeddable":
165
- case "frame":
166
- case "magicframe":
167
- return distanceToRectangle(element, point, elementsMap);
168
- case "diamond":
169
- return distanceToDiamond(element, point, elementsMap);
170
- case "ellipse":
171
- return distanceToEllipse(element, point, elementsMap);
172
- }
173
- };
174
- const isStrictlyInside = (distance, threshold) => {
175
- return distance < 0;
176
- };
177
- const isInsideCheck = (distance, threshold) => {
178
- return distance < threshold;
179
- };
180
- const isNearCheck = (distance, threshold) => {
181
- return Math.abs(distance) < threshold;
182
- };
183
- const isOutsideCheck = (distance, threshold) => {
184
- return 0 <= distance && distance < threshold;
185
- };
186
- const distanceToRectangle = (element, point, elementsMap) => {
187
- const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point, elementsMap);
188
- return Math.max(GAPoint.distanceToLine(pointRel, GALine.equation(0, 1, -hheight)), GAPoint.distanceToLine(pointRel, GALine.equation(1, 0, -hwidth)));
189
- };
190
- const distanceToRectangleBox = (box, point) => {
191
- const [, pointRel, hwidth, hheight] = pointRelativeToDivElement(point, box);
192
- return Math.max(GAPoint.distanceToLine(pointRel, GALine.equation(0, 1, -hheight)), GAPoint.distanceToLine(pointRel, GALine.equation(1, 0, -hwidth)));
193
- };
194
- const distanceToDiamond = (element, point, elementsMap) => {
195
- const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point, elementsMap);
196
- const side = GALine.equation(hheight, hwidth, -hheight * hwidth);
197
- return GAPoint.distanceToLine(pointRel, side);
198
- };
199
- const distanceToEllipse = (element, point, elementsMap) => {
200
- const [pointRel, tangent] = ellipseParamsForTest(element, point, elementsMap);
201
- return -GALine.sign(tangent) * GAPoint.distanceToLine(pointRel, tangent);
202
- };
203
- const ellipseParamsForTest = (element, point, elementsMap) => {
204
- const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point, elementsMap);
205
- const [px, py] = GAPoint.toTuple(pointRel);
206
- // We're working in positive quadrant, so start with `t = 45deg`, `tx=cos(t)`
207
- let tx = 0.707;
208
- let ty = 0.707;
209
- const a = hwidth;
210
- const b = hheight;
211
- // This is a numerical method to find the params tx, ty at which
212
- // the ellipse has the closest point to the given point
213
- [0, 1, 2, 3].forEach((_) => {
214
- const xx = a * tx;
215
- const yy = b * ty;
216
- const ex = ((a * a - b * b) * tx ** 3) / a;
217
- const ey = ((b * b - a * a) * ty ** 3) / b;
218
- const rx = xx - ex;
219
- const ry = yy - ey;
220
- const qx = px - ex;
221
- const qy = py - ey;
222
- const r = Math.hypot(ry, rx);
223
- const q = Math.hypot(qy, qx);
224
- tx = Math.min(1, Math.max(0, ((qx * r) / q + ex) / a));
225
- ty = Math.min(1, Math.max(0, ((qy * r) / q + ey) / b));
226
- const t = Math.hypot(ty, tx);
227
- tx /= t;
228
- ty /= t;
229
- });
230
- const closestPoint = GA.point(a * tx, b * ty);
231
- const tangent = GALine.orthogonalThrough(pointRel, closestPoint);
232
- return [pointRel, tangent];
233
- };
234
- const hitTestFreeDrawElement = (element, point, threshold, elementsMap) => {
235
- // Check point-distance-to-line-segment for every segment in the
236
- // element's points (its input points, not its outline points).
237
- // This is... okay? It's plenty fast, but the GA library may
238
- // have a faster option.
239
- let x;
240
- let y;
241
- if (element.angle === 0) {
242
- x = point[0] - element.x;
243
- y = point[1] - element.y;
244
- }
245
- else {
246
- // Counter-rotate the point around center before testing
247
- const [minX, minY, maxX, maxY] = getElementAbsoluteCoords(element, elementsMap);
248
- const rotatedPoint = rotatePoint(point, [minX + (maxX - minX) / 2, minY + (maxY - minY) / 2], -element.angle);
249
- x = rotatedPoint[0] - element.x;
250
- y = rotatedPoint[1] - element.y;
251
- }
252
- let [A, B] = element.points;
253
- let P;
254
- // For freedraw dots
255
- if (distance2d(A[0], A[1], x, y) < threshold ||
256
- distance2d(B[0], B[1], x, y) < threshold) {
257
- return true;
258
- }
259
- // For freedraw lines
260
- for (let i = 0; i < element.points.length; i++) {
261
- const delta = [B[0] - A[0], B[1] - A[1]];
262
- const length = Math.hypot(delta[1], delta[0]);
263
- const U = [delta[0] / length, delta[1] / length];
264
- const C = [x - A[0], y - A[1]];
265
- const d = (C[0] * U[0] + C[1] * U[1]) / Math.hypot(U[1], U[0]);
266
- P = [A[0] + U[0] * d, A[1] + U[1] * d];
267
- const da = distance2d(P[0], P[1], A[0], A[1]);
268
- const db = distance2d(P[0], P[1], B[0], B[1]);
269
- P = db < da && da > length ? B : da < db && db > length ? A : P;
270
- if (Math.hypot(y - P[1], x - P[0]) < threshold) {
271
- return true;
272
- }
273
- A = B;
274
- B = element.points[i + 1];
275
- }
276
- const shape = ShapeCache.get(element);
277
- // for filled freedraw shapes, support
278
- // selecting from inside
279
- if (shape && shape.sets.length) {
280
- return element.fillStyle === "solid"
281
- ? hitTestCurveInside(shape, x, y, "round")
282
- : hitTestRoughShape(shape, x, y, threshold);
283
- }
284
- return false;
285
- };
286
- const hitTestLinear = (args) => {
287
- const { element, threshold } = args;
288
- if (!ShapeCache.get(element)) {
289
- return false;
290
- }
291
- const [point, pointAbs, hwidth, hheight] = pointRelativeToElement(args.element, args.point, args.elementsMap);
292
- const side1 = GALine.equation(0, 1, -hheight);
293
- const side2 = GALine.equation(1, 0, -hwidth);
294
- if (!isInsideCheck(GAPoint.distanceToLine(pointAbs, side1), threshold) ||
295
- !isInsideCheck(GAPoint.distanceToLine(pointAbs, side2), threshold)) {
296
- return false;
297
- }
298
- const [relX, relY] = GAPoint.toTuple(point);
299
- const shape = ShapeCache.get(element);
300
- if (!shape) {
301
- return false;
302
- }
303
- if (args.check === isInsideCheck) {
304
- const hit = shape.some((subshape) => hitTestCurveInside(subshape, relX, relY, element.roundness ? "round" : "sharp"));
305
- if (hit) {
306
- return true;
307
- }
308
- }
309
- // hit test all "subshapes" of the linear element
310
- return shape.some((subshape) => hitTestRoughShape(subshape, relX, relY, threshold));
311
- };
312
- // Returns:
313
- // 1. the point relative to the elements (x, y) position
314
- // 2. the point relative to the element's center with positive (x, y)
315
- // 3. half element width
316
- // 4. half element height
317
- //
318
- // Note that for linear elements the (x, y) position is not at the
319
- // top right corner of their boundary.
320
- //
321
- // Rectangles, diamonds and ellipses are symmetrical over axes,
322
- // and other elements have a rectangular boundary,
323
- // so we only need to perform hit tests for the positive quadrant.
324
- const pointRelativeToElement = (element, pointTuple, elementsMap) => {
325
- const point = GAPoint.from(pointTuple);
326
- const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
327
- const center = coordsCenter(x1, y1, x2, y2);
328
- // GA has angle orientation opposite to `rotate`
329
- const rotate = GATransform.rotation(center, element.angle);
330
- const pointRotated = GATransform.apply(rotate, point);
331
- const pointRelToCenter = GA.sub(pointRotated, GADirection.from(center));
332
- const pointRelToCenterAbs = GAPoint.abs(pointRelToCenter);
333
- const elementPos = GA.offset(element.x, element.y);
334
- const pointRelToPos = GA.sub(pointRotated, elementPos);
335
- const halfWidth = (x2 - x1) / 2;
336
- const halfHeight = (y2 - y1) / 2;
337
- return [pointRelToPos, pointRelToCenterAbs, halfWidth, halfHeight];
338
- };
339
- const pointRelativeToDivElement = (pointTuple, rectangle) => {
340
- const point = GAPoint.from(pointTuple);
341
- const [x1, y1, x2, y2] = getRectangleBoxAbsoluteCoords(rectangle);
342
- const center = coordsCenter(x1, y1, x2, y2);
343
- const rotate = GATransform.rotation(center, rectangle.angle);
344
- const pointRotated = GATransform.apply(rotate, point);
345
- const pointRelToCenter = GA.sub(pointRotated, GADirection.from(center));
346
- const pointRelToCenterAbs = GAPoint.abs(pointRelToCenter);
347
- const elementPos = GA.offset(rectangle.x, rectangle.y);
348
- const pointRelToPos = GA.sub(pointRotated, elementPos);
349
- const halfWidth = (x2 - x1) / 2;
350
- const halfHeight = (y2 - y1) / 2;
351
- return [pointRelToPos, pointRelToCenterAbs, halfWidth, halfHeight];
352
- };
353
- // Returns point in absolute coordinates
354
- export const pointInAbsoluteCoords = (element, elementsMap,
355
- // Point relative to the element position
356
- point) => {
357
- const [x, y] = point;
358
- const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
359
- const cx = (x2 - x1) / 2;
360
- const cy = (y2 - y1) / 2;
361
- const [rotatedX, rotatedY] = rotate(x, y, cx, cy, element.angle);
362
- return [element.x + rotatedX, element.y + rotatedY];
363
- };
364
- const relativizationToElementCenter = (element, elementsMap) => {
365
- const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
366
- const center = coordsCenter(x1, y1, x2, y2);
367
- // GA has angle orientation opposite to `rotate`
368
- const rotate = GATransform.rotation(center, element.angle);
369
- const translate = GA.reverse(GATransform.translation(GADirection.from(center)));
370
- return GATransform.compose(rotate, translate);
371
- };
372
- const coordsCenter = (x1, y1, x2, y2) => {
373
- return GA.point((x1 + x2) / 2, (y1 + y2) / 2);
374
- };
375
- // The focus distance is the oriented ratio between the size of
376
- // the `element` and the "focus image" of the element on which
377
- // all focus points lie, so it's a number between -1 and 1.
378
- // The line going through `a` and `b` is a tangent to the "focus image"
379
- // of the element.
380
- export const determineFocusDistance = (element,
381
- // Point on the line, in absolute coordinates
382
- a,
383
- // Another point on the line, in absolute coordinates (closer to element)
384
- b, elementsMap) => {
385
- const relateToCenter = relativizationToElementCenter(element, elementsMap);
386
- const aRel = GATransform.apply(relateToCenter, GAPoint.from(a));
387
- const bRel = GATransform.apply(relateToCenter, GAPoint.from(b));
388
- const line = GALine.through(aRel, bRel);
389
- const q = element.height / element.width;
390
- const hwidth = element.width / 2;
391
- const hheight = element.height / 2;
392
- const n = line[2];
393
- const m = line[3];
394
- const c = line[1];
395
- const mabs = Math.abs(m);
396
- const nabs = Math.abs(n);
397
- let ret;
398
- switch (element.type) {
399
- case "rectangle":
400
- case "image":
401
- case "text":
402
- case "iframe":
403
- case "embeddable":
404
- case "frame":
405
- case "magicframe":
406
- ret = c / (hwidth * (nabs + q * mabs));
407
- break;
408
- case "diamond":
409
- ret = mabs < nabs ? c / (nabs * hwidth) : c / (mabs * hheight);
410
- break;
411
- case "ellipse":
412
- ret = c / (hwidth * Math.sqrt(n ** 2 + q ** 2 * m ** 2));
413
- break;
414
- }
415
- return ret || 0;
416
- };
417
- export const determineFocusPoint = (element,
418
- // The oriented, relative distance from the center of `element` of the
419
- // returned focusPoint
420
- focus, adjecentPoint, elementsMap) => {
421
- if (focus === 0) {
422
- const [x1, y1, x2, y2] = getElementAbsoluteCoords(element, elementsMap);
423
- const center = coordsCenter(x1, y1, x2, y2);
424
- return GAPoint.toTuple(center);
425
- }
426
- const relateToCenter = relativizationToElementCenter(element, elementsMap);
427
- const adjecentPointRel = GATransform.apply(relateToCenter, GAPoint.from(adjecentPoint));
428
- const reverseRelateToCenter = GA.reverse(relateToCenter);
429
- let point;
430
- switch (element.type) {
431
- case "rectangle":
432
- case "image":
433
- case "text":
434
- case "diamond":
435
- case "iframe":
436
- case "embeddable":
437
- case "frame":
438
- case "magicframe":
439
- point = findFocusPointForRectangulars(element, focus, adjecentPointRel);
440
- break;
441
- case "ellipse":
442
- point = findFocusPointForEllipse(element, focus, adjecentPointRel);
443
- break;
444
- }
445
- return GAPoint.toTuple(GATransform.apply(reverseRelateToCenter, point));
446
- };
447
- // Returns 2 or 0 intersection points between line going through `a` and `b`
448
- // and the `element`, in ascending order of distance from `a`.
449
- export const intersectElementWithLine = (element,
450
- // Point on the line, in absolute coordinates
451
- a,
452
- // Another point on the line, in absolute coordinates
453
- b,
454
- // If given, the element is inflated by this value
455
- gap = 0, elementsMap) => {
456
- const relateToCenter = relativizationToElementCenter(element, elementsMap);
457
- const aRel = GATransform.apply(relateToCenter, GAPoint.from(a));
458
- const bRel = GATransform.apply(relateToCenter, GAPoint.from(b));
459
- const line = GALine.through(aRel, bRel);
460
- const reverseRelateToCenter = GA.reverse(relateToCenter);
461
- const intersections = getSortedElementLineIntersections(element, line, aRel, gap);
462
- return intersections.map((point) => GAPoint.toTuple(GATransform.apply(reverseRelateToCenter, point)));
463
- };
464
- const getSortedElementLineIntersections = (element,
465
- // Relative to element center
466
- line,
467
- // Relative to element center
468
- nearPoint, gap = 0) => {
469
- let intersections;
470
- switch (element.type) {
471
- case "rectangle":
472
- case "image":
473
- case "text":
474
- case "diamond":
475
- case "iframe":
476
- case "embeddable":
477
- case "frame":
478
- case "magicframe":
479
- const corners = getCorners(element);
480
- intersections = corners
481
- .flatMap((point, i) => {
482
- const edge = [point, corners[(i + 1) % 4]];
483
- return intersectSegment(line, offsetSegment(edge, gap));
484
- })
485
- .concat(corners.flatMap((point) => getCircleIntersections(point, gap, line)));
486
- break;
487
- case "ellipse":
488
- intersections = getEllipseIntersections(element, gap, line);
489
- break;
490
- }
491
- if (intersections.length < 2) {
492
- // Ignore the "edge" case of only intersecting with a single corner
493
- return [];
494
- }
495
- const sortedIntersections = intersections.sort((i1, i2) => GAPoint.distance(i1, nearPoint) - GAPoint.distance(i2, nearPoint));
496
- return [
497
- sortedIntersections[0],
498
- sortedIntersections[sortedIntersections.length - 1],
499
- ];
500
- };
501
- const getCorners = (element, scale = 1) => {
502
- const hx = (scale * element.width) / 2;
503
- const hy = (scale * element.height) / 2;
504
- switch (element.type) {
505
- case "rectangle":
506
- case "image":
507
- case "text":
508
- case "iframe":
509
- case "embeddable":
510
- case "frame":
511
- case "magicframe":
512
- return [
513
- GA.point(hx, hy),
514
- GA.point(hx, -hy),
515
- GA.point(-hx, -hy),
516
- GA.point(-hx, hy),
517
- ];
518
- case "diamond":
519
- return [
520
- GA.point(0, hy),
521
- GA.point(hx, 0),
522
- GA.point(0, -hy),
523
- GA.point(-hx, 0),
524
- ];
525
- }
526
- };
527
- // Returns intersection of `line` with `segment`, with `segment` moved by
528
- // `gap` in its polar direction.
529
- // If intersection coincides with second segment point returns empty array.
530
- const intersectSegment = (line, segment) => {
531
- const [a, b] = segment;
532
- const aDist = GAPoint.distanceToLine(a, line);
533
- const bDist = GAPoint.distanceToLine(b, line);
534
- if (aDist * bDist >= 0) {
535
- // The intersection is outside segment `(a, b)`
536
- return [];
537
- }
538
- return [GAPoint.intersect(line, GALine.through(a, b))];
539
- };
540
- const offsetSegment = (segment, distance) => {
541
- const [a, b] = segment;
542
- const offset = GATransform.translationOrthogonal(GADirection.fromTo(a, b), distance);
543
- return [GATransform.apply(offset, a), GATransform.apply(offset, b)];
544
- };
545
- const getEllipseIntersections = (element, gap, line) => {
546
- const a = element.width / 2 + gap;
547
- const b = element.height / 2 + gap;
548
- const m = line[2];
549
- const n = line[3];
550
- const c = line[1];
551
- const squares = a * a * m * m + b * b * n * n;
552
- const discr = squares - c * c;
553
- if (squares === 0 || discr <= 0) {
554
- return [];
555
- }
556
- const discrRoot = Math.sqrt(discr);
557
- const xn = -a * a * m * c;
558
- const yn = -b * b * n * c;
559
- return [
560
- GA.point((xn + a * b * n * discrRoot) / squares, (yn - a * b * m * discrRoot) / squares),
561
- GA.point((xn - a * b * n * discrRoot) / squares, (yn + a * b * m * discrRoot) / squares),
562
- ];
563
- };
564
- export const getCircleIntersections = (center, radius, line) => {
565
- if (radius === 0) {
566
- return GAPoint.distanceToLine(line, center) === 0 ? [center] : [];
567
- }
568
- const m = line[2];
569
- const n = line[3];
570
- const c = line[1];
571
- const [a, b] = GAPoint.toTuple(center);
572
- const r = radius;
573
- const squares = m * m + n * n;
574
- const discr = r * r * squares - (m * a + n * b + c) ** 2;
575
- if (squares === 0 || discr <= 0) {
576
- return [];
577
- }
578
- const discrRoot = Math.sqrt(discr);
579
- const xn = a * n * n - b * m * n - m * c;
580
- const yn = b * m * m - a * m * n - n * c;
581
- return [
582
- GA.point((xn + n * discrRoot) / squares, (yn - m * discrRoot) / squares),
583
- GA.point((xn - n * discrRoot) / squares, (yn + m * discrRoot) / squares),
584
- ];
37
+ return hit;
585
38
  };
586
- // The focus point is the tangent point of the "focus image" of the
587
- // `element`, where the tangent goes through `point`.
588
- export const findFocusPointForEllipse = (ellipse,
589
- // Between -1 and 1 (not 0) the relative size of the "focus image" of
590
- // the element on which the focus point lies
591
- relativeDistance,
592
- // The point for which we're trying to find the focus point, relative
593
- // to the ellipse center.
594
- point) => {
595
- const relativeDistanceAbs = Math.abs(relativeDistance);
596
- const a = (ellipse.width * relativeDistanceAbs) / 2;
597
- const b = (ellipse.height * relativeDistanceAbs) / 2;
598
- const orientation = Math.sign(relativeDistance);
599
- const [px, pyo] = GAPoint.toTuple(point);
600
- // The calculation below can't handle py = 0
601
- const py = pyo === 0 ? 0.0001 : pyo;
602
- const squares = px ** 2 * b ** 2 + py ** 2 * a ** 2;
603
- // Tangent mx + ny + 1 = 0
604
- const m = (-px * b ** 2 +
605
- orientation * py * Math.sqrt(Math.max(0, squares - a ** 2 * b ** 2))) /
606
- squares;
607
- let n = (-m * px - 1) / py;
608
- if (n === 0) {
609
- // if zero {-0, 0}, fall back to a same-sign value in the similar range
610
- n = (Object.is(n, -0) ? -1 : 1) * 0.01;
611
- }
612
- const x = -(a ** 2 * m) / (n ** 2 * b ** 2 + m ** 2 * a ** 2);
613
- return GA.point(x, (-m * x - 1) / n);
39
+ export const hitElementBoundingBox = (x, y, element, elementsMap, tolerance = 0) => {
40
+ let [x1, y1, x2, y2] = getElementBounds(element, elementsMap);
41
+ x1 -= tolerance;
42
+ y1 -= tolerance;
43
+ x2 += tolerance;
44
+ y2 += tolerance;
45
+ return isPointWithinBounds([x1, y1], [x, y], [x2, y2]);
614
46
  };
615
- export const findFocusPointForRectangulars = (element,
616
- // Between -1 and 1 for how far away should the focus point be relative
617
- // to the size of the element. Sign determines orientation.
618
- relativeDistance,
619
- // The point for which we're trying to find the focus point, relative
620
- // to the element center.
621
- point) => {
622
- const relativeDistanceAbs = Math.abs(relativeDistance);
623
- const orientation = Math.sign(relativeDistance);
624
- const corners = getCorners(element, relativeDistanceAbs);
625
- let maxDistance = 0;
626
- let tangentPoint = null;
627
- corners.forEach((corner) => {
628
- const distance = orientation * GALine.through(point, corner)[1];
629
- if (distance > maxDistance) {
630
- maxDistance = distance;
631
- tangentPoint = corner;
632
- }
633
- });
634
- return tangentPoint;
635
- };
636
- const pointInBezierEquation = (p0, p1, p2, p3, [mx, my], lineThreshold) => {
637
- // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3
638
- const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +
639
- 3 * t * Math.pow(1 - t, 2) * p2[idx] +
640
- 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +
641
- p0[idx] * Math.pow(t, 3);
642
- // go through t in increments of 0.01
643
- let t = 0;
644
- while (t <= 1.0) {
645
- const tx = equation(t, 0);
646
- const ty = equation(t, 1);
647
- const diff = Math.sqrt(Math.pow(tx - mx, 2) + Math.pow(ty - my, 2));
648
- if (diff < lineThreshold) {
649
- return true;
650
- }
651
- t += 0.01;
652
- }
653
- return false;
47
+ export const hitElementBoundingBoxOnly = (hitArgs, elementsMap) => {
48
+ return (!hitElementItself(hitArgs) &&
49
+ hitElementBoundingBox(hitArgs.x, hitArgs.y, hitArgs.element, elementsMap));
654
50
  };
655
- const hitTestCurveInside = (drawable, x, y, roundness) => {
656
- const ops = getCurvePathOps(drawable);
657
- const points = [];
658
- let odd = false; // select one line out of double lines
659
- for (const operation of ops) {
660
- if (operation.op === "move") {
661
- odd = !odd;
662
- if (odd) {
663
- points.push([operation.data[0], operation.data[1]]);
664
- }
665
- }
666
- else if (operation.op === "bcurveTo") {
667
- if (odd) {
668
- points.push([operation.data[0], operation.data[1]]);
669
- points.push([operation.data[2], operation.data[3]]);
670
- points.push([operation.data[4], operation.data[5]]);
671
- }
672
- }
673
- else if (operation.op === "lineTo") {
674
- if (odd) {
675
- points.push([operation.data[0], operation.data[1]]);
676
- }
677
- }
678
- }
679
- if (points.length >= 4) {
680
- if (roundness === "sharp") {
681
- return isPointInPolygon(points, x, y);
682
- }
683
- const polygonPoints = pointsOnBezierCurves(points, 10, 5);
684
- return isPointInPolygon(polygonPoints, x, y);
685
- }
686
- return false;
687
- };
688
- const hitTestRoughShape = (drawable, x, y, lineThreshold) => {
689
- // read operations from first opSet
690
- const ops = getCurvePathOps(drawable);
691
- // set start position as (0,0) just in case
692
- // move operation does not exist (unlikely but it is worth safekeeping it)
693
- let currentP = [0, 0];
694
- return ops.some(({ op, data }, idx) => {
695
- // There are only four operation types:
696
- // move, bcurveTo, lineTo, and curveTo
697
- if (op === "move") {
698
- // change starting point
699
- currentP = data;
700
- // move operation does not draw anything; so, it always
701
- // returns false
702
- }
703
- else if (op === "bcurveTo") {
704
- // create points from bezier curve
705
- // bezier curve stores data as a flattened array of three positions
706
- // [x1, y1, x2, y2, x3, y3]
707
- const p1 = [data[0], data[1]];
708
- const p2 = [data[2], data[3]];
709
- const p3 = [data[4], data[5]];
710
- const p0 = currentP;
711
- currentP = p3;
712
- // check if points are on the curve
713
- // cubic bezier curves require four parameters
714
- // the first parameter is the last stored position (p0)
715
- const retVal = pointInBezierEquation(p0, p1, p2, p3, [x, y], lineThreshold);
716
- // set end point of bezier curve as the new starting point for
717
- // upcoming operations as each operation is based on the last drawn
718
- // position of the previous operation
719
- return retVal;
720
- }
721
- else if (op === "lineTo") {
722
- return hitTestCurveInside(drawable, x, y, "sharp");
723
- }
724
- else if (op === "qcurveTo") {
725
- // TODO: Implement this
726
- console.warn("qcurveTo is not implemented yet");
727
- }
728
- return false;
729
- });
51
+ export const hitElementBoundText = (x, y, textShape) => {
52
+ return textShape && isPointInShape([x, y], textShape);
730
53
  };