@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
@@ -0,0 +1,674 @@
1
+ import { distance2d } from "../../excalidraw/math";
2
+ const DEFAULT_THRESHOLD = 10e-5;
3
+ /**
4
+ * utils
5
+ */
6
+ // the two vectors are ao and bo
7
+ export const cross = (a, b, o) => {
8
+ return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
9
+ };
10
+ export const isClosed = (polygon) => {
11
+ const first = polygon[0];
12
+ const last = polygon[polygon.length - 1];
13
+ return first[0] === last[0] && first[1] === last[1];
14
+ };
15
+ export const close = (polygon) => {
16
+ return isClosed(polygon) ? polygon : [...polygon, polygon[0]];
17
+ };
18
+ /**
19
+ * angles
20
+ */
21
+ // convert radians to degress
22
+ export const angleToDegrees = (angle) => {
23
+ return (angle * 180) / Math.PI;
24
+ };
25
+ // convert degrees to radians
26
+ export const angleToRadians = (angle) => {
27
+ return (angle / 180) * Math.PI;
28
+ };
29
+ // return the angle of reflection given an angle of incidence and a surface angle in degrees
30
+ export const angleReflect = (incidenceAngle, surfaceAngle) => {
31
+ const a = surfaceAngle * 2 - incidenceAngle;
32
+ return a >= 360 ? a - 360 : a < 0 ? a + 360 : a;
33
+ };
34
+ /**
35
+ * points
36
+ */
37
+ const rotate = (point, angle) => {
38
+ return [
39
+ point[0] * Math.cos(angle) - point[1] * Math.sin(angle),
40
+ point[0] * Math.sin(angle) + point[1] * Math.cos(angle),
41
+ ];
42
+ };
43
+ const isOrigin = (point) => {
44
+ return point[0] === 0 && point[1] === 0;
45
+ };
46
+ // rotate a given point about a given origin at the given angle
47
+ export const pointRotate = (point, angle, origin) => {
48
+ const r = angleToRadians(angle);
49
+ if (!origin || isOrigin(origin)) {
50
+ return rotate(point, r);
51
+ }
52
+ return rotate(point.map((c, i) => c - origin[i]), r).map((c, i) => c + origin[i]);
53
+ };
54
+ // translate a point by an angle (in degrees) and distance
55
+ export const pointTranslate = (point, angle = 0, distance = 0) => {
56
+ const r = angleToRadians(angle);
57
+ return [
58
+ point[0] + distance * Math.cos(r),
59
+ point[1] + distance * Math.sin(r),
60
+ ];
61
+ };
62
+ export const pointInverse = (point) => {
63
+ return [-point[0], -point[1]];
64
+ };
65
+ export const pointAdd = (pointA, pointB) => {
66
+ return [pointA[0] + pointB[0], pointA[1] + pointB[1]];
67
+ };
68
+ export const distanceToPoint = (p1, p2) => {
69
+ return distance2d(...p1, ...p2);
70
+ };
71
+ /**
72
+ * lines
73
+ */
74
+ // return the angle of a line, in degrees
75
+ export const lineAngle = (line) => {
76
+ return angleToDegrees(Math.atan2(line[1][1] - line[0][1], line[1][0] - line[0][0]));
77
+ };
78
+ // get the distance between the endpoints of a line segment
79
+ export const lineLength = (line) => {
80
+ return Math.sqrt(Math.pow(line[1][0] - line[0][0], 2) + Math.pow(line[1][1] - line[0][1], 2));
81
+ };
82
+ // get the midpoint of a line segment
83
+ export const lineMidpoint = (line) => {
84
+ return [
85
+ (line[0][0] + line[1][0]) / 2,
86
+ (line[0][1] + line[1][1]) / 2,
87
+ ];
88
+ };
89
+ // return the coordinates resulting from rotating the given line about an origin by an angle in degrees
90
+ // note that when the origin is not given, the midpoint of the given line is used as the origin
91
+ export const lineRotate = (line, angle, origin) => {
92
+ return line.map((point) => pointRotate(point, angle, origin || lineMidpoint(line)));
93
+ };
94
+ // returns the coordinates resulting from translating a line by an angle in degrees and a distance.
95
+ export const lineTranslate = (line, angle, distance) => {
96
+ return line.map((point) => pointTranslate(point, angle, distance));
97
+ };
98
+ export const lineInterpolate = (line, clamp = false) => {
99
+ const [[x1, y1], [x2, y2]] = line;
100
+ return (t) => {
101
+ const t0 = clamp ? (t < 0 ? 0 : t > 1 ? 1 : t) : t;
102
+ return [(x2 - x1) * t0 + x1, (y2 - y1) * t0 + y1];
103
+ };
104
+ };
105
+ /**
106
+ * curves
107
+ */
108
+ function clone(p) {
109
+ return [...p];
110
+ }
111
+ export const curveToBezier = (pointsIn, curveTightness = 0) => {
112
+ const len = pointsIn.length;
113
+ if (len < 3) {
114
+ throw new Error("A curve must have at least three points.");
115
+ }
116
+ const out = [];
117
+ if (len === 3) {
118
+ out.push(clone(pointsIn[0]), clone(pointsIn[1]), clone(pointsIn[2]), clone(pointsIn[2]));
119
+ }
120
+ else {
121
+ const points = [];
122
+ points.push(pointsIn[0], pointsIn[0]);
123
+ for (let i = 1; i < pointsIn.length; i++) {
124
+ points.push(pointsIn[i]);
125
+ if (i === pointsIn.length - 1) {
126
+ points.push(pointsIn[i]);
127
+ }
128
+ }
129
+ const b = [];
130
+ const s = 1 - curveTightness;
131
+ out.push(clone(points[0]));
132
+ for (let i = 1; i + 2 < points.length; i++) {
133
+ const cachedVertArray = points[i];
134
+ b[0] = [cachedVertArray[0], cachedVertArray[1]];
135
+ b[1] = [
136
+ cachedVertArray[0] + (s * points[i + 1][0] - s * points[i - 1][0]) / 6,
137
+ cachedVertArray[1] + (s * points[i + 1][1] - s * points[i - 1][1]) / 6,
138
+ ];
139
+ b[2] = [
140
+ points[i + 1][0] + (s * points[i][0] - s * points[i + 2][0]) / 6,
141
+ points[i + 1][1] + (s * points[i][1] - s * points[i + 2][1]) / 6,
142
+ ];
143
+ b[3] = [points[i + 1][0], points[i + 1][1]];
144
+ out.push(b[1], b[2], b[3]);
145
+ }
146
+ }
147
+ return out;
148
+ };
149
+ export const curveRotate = (curve, angle, origin) => {
150
+ return curve.map((p) => pointRotate(p, angle, origin));
151
+ };
152
+ export const cubicBezierPoint = (t, controlPoints) => {
153
+ const [p0, p1, p2, p3] = controlPoints;
154
+ const x = Math.pow(1 - t, 3) * p0[0] +
155
+ 3 * Math.pow(1 - t, 2) * t * p1[0] +
156
+ 3 * (1 - t) * Math.pow(t, 2) * p2[0] +
157
+ Math.pow(t, 3) * p3[0];
158
+ const y = Math.pow(1 - t, 3) * p0[1] +
159
+ 3 * Math.pow(1 - t, 2) * t * p1[1] +
160
+ 3 * (1 - t) * Math.pow(t, 2) * p2[1] +
161
+ Math.pow(t, 3) * p3[1];
162
+ return [x, y];
163
+ };
164
+ const solveCubicEquation = (a, b, c, d) => {
165
+ // This function solves the cubic equation ax^3 + bx^2 + cx + d = 0
166
+ const roots = [];
167
+ const discriminant = 18 * a * b * c * d -
168
+ 4 * Math.pow(b, 3) * d +
169
+ Math.pow(b, 2) * Math.pow(c, 2) -
170
+ 4 * a * Math.pow(c, 3) -
171
+ 27 * Math.pow(a, 2) * Math.pow(d, 2);
172
+ if (discriminant >= 0) {
173
+ const C = Math.cbrt((discriminant + Math.sqrt(discriminant)) / 2);
174
+ const D = Math.cbrt((discriminant - Math.sqrt(discriminant)) / 2);
175
+ const root1 = (-b - C - D) / (3 * a);
176
+ const root2 = (-b + (C + D) / 2) / (3 * a);
177
+ const root3 = (-b + (C + D) / 2) / (3 * a);
178
+ roots.push(root1, root2, root3);
179
+ }
180
+ else {
181
+ const realPart = -b / (3 * a);
182
+ const root1 = 2 * Math.sqrt(-b / (3 * a)) * Math.cos(Math.acos(realPart) / 3);
183
+ const root2 = 2 *
184
+ Math.sqrt(-b / (3 * a)) *
185
+ Math.cos((Math.acos(realPart) + 2 * Math.PI) / 3);
186
+ const root3 = 2 *
187
+ Math.sqrt(-b / (3 * a)) *
188
+ Math.cos((Math.acos(realPart) + 4 * Math.PI) / 3);
189
+ roots.push(root1, root2, root3);
190
+ }
191
+ return roots;
192
+ };
193
+ const findClosestParameter = (point, controlPoints) => {
194
+ // This function finds the parameter t that minimizes the distance between the point
195
+ // and any point on the cubic Bezier curve.
196
+ const [p0, p1, p2, p3] = controlPoints;
197
+ // Use the direct formula to find the parameter t
198
+ const a = p3[0] - 3 * p2[0] + 3 * p1[0] - p0[0];
199
+ const b = 3 * p2[0] - 6 * p1[0] + 3 * p0[0];
200
+ const c = 3 * p1[0] - 3 * p0[0];
201
+ const d = p0[0] - point[0];
202
+ const rootsX = solveCubicEquation(a, b, c, d);
203
+ // Do the same for the y-coordinate
204
+ const e = p3[1] - 3 * p2[1] + 3 * p1[1] - p0[1];
205
+ const f = 3 * p2[1] - 6 * p1[1] + 3 * p0[1];
206
+ const g = 3 * p1[1] - 3 * p0[1];
207
+ const h = p0[1] - point[1];
208
+ const rootsY = solveCubicEquation(e, f, g, h);
209
+ // Select the real root that is between 0 and 1 (inclusive)
210
+ const validRootsX = rootsX.filter((root) => root >= 0 && root <= 1);
211
+ const validRootsY = rootsY.filter((root) => root >= 0 && root <= 1);
212
+ if (validRootsX.length === 0 || validRootsY.length === 0) {
213
+ // No valid roots found, use the midpoint as a fallback
214
+ return 0.5;
215
+ }
216
+ // Choose the parameter t that minimizes the distance
217
+ let minDistance = Infinity;
218
+ let closestT = 0;
219
+ for (const rootX of validRootsX) {
220
+ for (const rootY of validRootsY) {
221
+ const distance = Math.sqrt((rootX - point[0]) ** 2 + (rootY - point[1]) ** 2);
222
+ if (distance < minDistance) {
223
+ minDistance = distance;
224
+ closestT = (rootX + rootY) / 2; // Use the average for a smoother result
225
+ }
226
+ }
227
+ }
228
+ return closestT;
229
+ };
230
+ export const cubicBezierDistance = (point, controlPoints) => {
231
+ // Calculate the closest point on the Bezier curve to the given point
232
+ const t = findClosestParameter(point, controlPoints);
233
+ // Calculate the coordinates of the closest point on the curve
234
+ const [closestX, closestY] = cubicBezierPoint(t, controlPoints);
235
+ // Calculate the distance between the given point and the closest point on the curve
236
+ const distance = Math.sqrt((point[0] - closestX) ** 2 + (point[1] - closestY) ** 2);
237
+ return distance;
238
+ };
239
+ /**
240
+ * polygons
241
+ */
242
+ export const polygonRotate = (polygon, angle, origin) => {
243
+ return polygon.map((p) => pointRotate(p, angle, origin));
244
+ };
245
+ export const polygonBounds = (polygon) => {
246
+ let xMin = Infinity;
247
+ let xMax = -Infinity;
248
+ let yMin = Infinity;
249
+ let yMax = -Infinity;
250
+ for (let i = 0, l = polygon.length; i < l; i++) {
251
+ const p = polygon[i];
252
+ const x = p[0];
253
+ const y = p[1];
254
+ if (x != null && isFinite(x) && y != null && isFinite(y)) {
255
+ if (x < xMin) {
256
+ xMin = x;
257
+ }
258
+ if (x > xMax) {
259
+ xMax = x;
260
+ }
261
+ if (y < yMin) {
262
+ yMin = y;
263
+ }
264
+ if (y > yMax) {
265
+ yMax = y;
266
+ }
267
+ }
268
+ }
269
+ return [
270
+ [xMin, yMin],
271
+ [xMax, yMax],
272
+ ];
273
+ };
274
+ export const polygonCentroid = (vertices) => {
275
+ let a = 0;
276
+ let x = 0;
277
+ let y = 0;
278
+ const l = vertices.length;
279
+ for (let i = 0; i < l; i++) {
280
+ const s = i === l - 1 ? 0 : i + 1;
281
+ const v0 = vertices[i];
282
+ const v1 = vertices[s];
283
+ const f = v0[0] * v1[1] - v1[0] * v0[1];
284
+ a += f;
285
+ x += (v0[0] + v1[0]) * f;
286
+ y += (v0[1] + v1[1]) * f;
287
+ }
288
+ const d = a * 3;
289
+ return [x / d, y / d];
290
+ };
291
+ export const polygonScale = (polygon, scale, origin) => {
292
+ if (!origin) {
293
+ origin = polygonCentroid(polygon);
294
+ }
295
+ const p = [];
296
+ for (let i = 0, l = polygon.length; i < l; i++) {
297
+ const v = polygon[i];
298
+ const d = lineLength([origin, v]);
299
+ const a = lineAngle([origin, v]);
300
+ p[i] = pointTranslate(origin, a, d * scale);
301
+ }
302
+ return p;
303
+ };
304
+ export const polygonScaleX = (polygon, scale, origin) => {
305
+ if (!origin) {
306
+ origin = polygonCentroid(polygon);
307
+ }
308
+ const p = [];
309
+ for (let i = 0, l = polygon.length; i < l; i++) {
310
+ const v = polygon[i];
311
+ const d = lineLength([origin, v]);
312
+ const a = lineAngle([origin, v]);
313
+ const t = pointTranslate(origin, a, d * scale);
314
+ p[i] = [t[0], v[1]];
315
+ }
316
+ return p;
317
+ };
318
+ export const polygonScaleY = (polygon, scale, origin) => {
319
+ if (!origin) {
320
+ origin = polygonCentroid(polygon);
321
+ }
322
+ const p = [];
323
+ for (let i = 0, l = polygon.length; i < l; i++) {
324
+ const v = polygon[i];
325
+ const d = lineLength([origin, v]);
326
+ const a = lineAngle([origin, v]);
327
+ const t = pointTranslate(origin, a, d * scale);
328
+ p[i] = [v[0], t[1]];
329
+ }
330
+ return p;
331
+ };
332
+ export const polygonReflectX = (polygon, reflectFactor = 1) => {
333
+ const [[min], [max]] = polygonBounds(polygon);
334
+ const p = [];
335
+ for (let i = 0, l = polygon.length; i < l; i++) {
336
+ const [x, y] = polygon[i];
337
+ const r = [min + max - x, y];
338
+ if (reflectFactor === 0) {
339
+ p[i] = [x, y];
340
+ }
341
+ else if (reflectFactor === 1) {
342
+ p[i] = r;
343
+ }
344
+ else {
345
+ const t = lineInterpolate([[x, y], r]);
346
+ p[i] = t(Math.max(Math.min(reflectFactor, 1), 0));
347
+ }
348
+ }
349
+ return p;
350
+ };
351
+ export const polygonReflectY = (polygon, reflectFactor = 1) => {
352
+ const [[, min], [, max]] = polygonBounds(polygon);
353
+ const p = [];
354
+ for (let i = 0, l = polygon.length; i < l; i++) {
355
+ const [x, y] = polygon[i];
356
+ const r = [x, min + max - y];
357
+ if (reflectFactor === 0) {
358
+ p[i] = [x, y];
359
+ }
360
+ else if (reflectFactor === 1) {
361
+ p[i] = r;
362
+ }
363
+ else {
364
+ const t = lineInterpolate([[x, y], r]);
365
+ p[i] = t(Math.max(Math.min(reflectFactor, 1), 0));
366
+ }
367
+ }
368
+ return p;
369
+ };
370
+ export const polygonTranslate = (polygon, angle, distance) => {
371
+ return polygon.map((p) => pointTranslate(p, angle, distance));
372
+ };
373
+ /**
374
+ * ellipses
375
+ */
376
+ export const ellipseAxes = (ellipse) => {
377
+ const widthGreaterThanHeight = ellipse.halfWidth > ellipse.halfHeight;
378
+ const majorAxis = widthGreaterThanHeight
379
+ ? ellipse.halfWidth * 2
380
+ : ellipse.halfHeight * 2;
381
+ const minorAxis = widthGreaterThanHeight
382
+ ? ellipse.halfHeight * 2
383
+ : ellipse.halfWidth * 2;
384
+ return {
385
+ majorAxis,
386
+ minorAxis,
387
+ };
388
+ };
389
+ export const ellipseFocusToCenter = (ellipse) => {
390
+ const { majorAxis, minorAxis } = ellipseAxes(ellipse);
391
+ return Math.sqrt(majorAxis ** 2 - minorAxis ** 2);
392
+ };
393
+ export const ellipseExtremes = (ellipse) => {
394
+ const { center, angle } = ellipse;
395
+ const { majorAxis, minorAxis } = ellipseAxes(ellipse);
396
+ const cos = Math.cos(angle);
397
+ const sin = Math.sin(angle);
398
+ const sqSum = majorAxis ** 2 + minorAxis ** 2;
399
+ const sqDiff = (majorAxis ** 2 - minorAxis ** 2) * Math.cos(2 * angle);
400
+ const yMax = Math.sqrt((sqSum - sqDiff) / 2);
401
+ const xAtYMax = (yMax * sqSum * sin * cos) /
402
+ (majorAxis ** 2 * sin ** 2 + minorAxis ** 2 * cos ** 2);
403
+ const xMax = Math.sqrt((sqSum + sqDiff) / 2);
404
+ const yAtXMax = (xMax * sqSum * sin * cos) /
405
+ (majorAxis ** 2 * cos ** 2 + minorAxis ** 2 * sin ** 2);
406
+ return [
407
+ pointAdd([xAtYMax, yMax], center),
408
+ pointAdd(pointInverse([xAtYMax, yMax]), center),
409
+ pointAdd([xMax, yAtXMax], center),
410
+ pointAdd([xMax, yAtXMax], center),
411
+ ];
412
+ };
413
+ export const pointRelativeToCenter = (point, center, angle) => {
414
+ const translated = pointAdd(point, pointInverse(center));
415
+ const rotated = pointRotate(translated, -angleToDegrees(angle));
416
+ return rotated;
417
+ };
418
+ /**
419
+ * relationships
420
+ */
421
+ const topPointFirst = (line) => {
422
+ return line[1][1] > line[0][1] ? line : [line[1], line[0]];
423
+ };
424
+ export const pointLeftofLine = (point, line) => {
425
+ const t = topPointFirst(line);
426
+ return cross(point, t[1], t[0]) < 0;
427
+ };
428
+ export const pointRightofLine = (point, line) => {
429
+ const t = topPointFirst(line);
430
+ return cross(point, t[1], t[0]) > 0;
431
+ };
432
+ export const distanceToSegment = (point, line) => {
433
+ const [x, y] = point;
434
+ const [[x1, y1], [x2, y2]] = line;
435
+ const A = x - x1;
436
+ const B = y - y1;
437
+ const C = x2 - x1;
438
+ const D = y2 - y1;
439
+ const dot = A * C + B * D;
440
+ const len_sq = C * C + D * D;
441
+ let param = -1;
442
+ if (len_sq !== 0) {
443
+ param = dot / len_sq;
444
+ }
445
+ let xx;
446
+ let yy;
447
+ if (param < 0) {
448
+ xx = x1;
449
+ yy = y1;
450
+ }
451
+ else if (param > 1) {
452
+ xx = x2;
453
+ yy = y2;
454
+ }
455
+ else {
456
+ xx = x1 + param * C;
457
+ yy = y1 + param * D;
458
+ }
459
+ const dx = x - xx;
460
+ const dy = y - yy;
461
+ return Math.sqrt(dx * dx + dy * dy);
462
+ };
463
+ export const pointOnLine = (point, line, threshold = DEFAULT_THRESHOLD) => {
464
+ const distance = distanceToSegment(point, line);
465
+ if (distance === 0) {
466
+ return true;
467
+ }
468
+ return distance < threshold;
469
+ };
470
+ export const pointOnPolyline = (point, polyline, threshold = DEFAULT_THRESHOLD) => {
471
+ return polyline.some((line) => pointOnLine(point, line, threshold));
472
+ };
473
+ export const lineIntersectsLine = (lineA, lineB) => {
474
+ const [[a0x, a0y], [a1x, a1y]] = lineA;
475
+ const [[b0x, b0y], [b1x, b1y]] = lineB;
476
+ // shared points
477
+ if (a0x === b0x && a0y === b0y) {
478
+ return true;
479
+ }
480
+ if (a1x === b1x && a1y === b1y) {
481
+ return true;
482
+ }
483
+ // point on line
484
+ if (pointOnLine(lineA[0], lineB) || pointOnLine(lineA[1], lineB)) {
485
+ return true;
486
+ }
487
+ if (pointOnLine(lineB[0], lineA) || pointOnLine(lineB[1], lineA)) {
488
+ return true;
489
+ }
490
+ const denom = (b1y - b0y) * (a1x - a0x) - (b1x - b0x) * (a1y - a0y);
491
+ if (denom === 0) {
492
+ return false;
493
+ }
494
+ const deltaY = a0y - b0y;
495
+ const deltaX = a0x - b0x;
496
+ const numer0 = (b1x - b0x) * deltaY - (b1y - b0y) * deltaX;
497
+ const numer1 = (a1x - a0x) * deltaY - (a1y - a0y) * deltaX;
498
+ const quotA = numer0 / denom;
499
+ const quotB = numer1 / denom;
500
+ return quotA > 0 && quotA < 1 && quotB > 0 && quotB < 1;
501
+ };
502
+ export const lineIntersectsPolygon = (line, polygon) => {
503
+ let intersects = false;
504
+ const closed = close(polygon);
505
+ for (let i = 0, l = closed.length - 1; i < l; i++) {
506
+ const v0 = closed[i];
507
+ const v1 = closed[i + 1];
508
+ if (lineIntersectsLine(line, [v0, v1]) ||
509
+ (pointOnLine(v0, line) && pointOnLine(v1, line))) {
510
+ intersects = true;
511
+ break;
512
+ }
513
+ }
514
+ return intersects;
515
+ };
516
+ export const pointInBezierEquation = (p0, p1, p2, p3, [mx, my], lineThreshold) => {
517
+ // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3
518
+ const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +
519
+ 3 * t * Math.pow(1 - t, 2) * p2[idx] +
520
+ 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +
521
+ p0[idx] * Math.pow(t, 3);
522
+ const lineSegmentPoints = [];
523
+ let t = 0;
524
+ while (t <= 1.0) {
525
+ const tx = equation(t, 0);
526
+ const ty = equation(t, 1);
527
+ const diff = Math.sqrt(Math.pow(tx - mx, 2) + Math.pow(ty - my, 2));
528
+ if (diff < lineThreshold) {
529
+ return true;
530
+ }
531
+ lineSegmentPoints.push([tx, ty]);
532
+ t += 0.1;
533
+ }
534
+ // check the distance from line segments to the given point
535
+ return false;
536
+ };
537
+ export const cubicBezierEquation = (curve) => {
538
+ const [p0, p1, p2, p3] = curve;
539
+ // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3
540
+ return (t, idx) => Math.pow(1 - t, 3) * p3[idx] +
541
+ 3 * t * Math.pow(1 - t, 2) * p2[idx] +
542
+ 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +
543
+ p0[idx] * Math.pow(t, 3);
544
+ };
545
+ export const polyLineFromCurve = (curve, segments = 10) => {
546
+ const equation = cubicBezierEquation(curve);
547
+ let startingPoint = [equation(0, 0), equation(0, 1)];
548
+ const lineSegments = [];
549
+ let t = 0;
550
+ const increment = 1 / segments;
551
+ for (let i = 0; i < segments; i++) {
552
+ t += increment;
553
+ if (t <= 1) {
554
+ const nextPoint = [equation(t, 0), equation(t, 1)];
555
+ lineSegments.push([startingPoint, nextPoint]);
556
+ startingPoint = nextPoint;
557
+ }
558
+ }
559
+ return lineSegments;
560
+ };
561
+ export const pointOnCurve = (point, curve, threshold = DEFAULT_THRESHOLD) => {
562
+ return pointOnPolyline(point, polyLineFromCurve(curve), threshold);
563
+ };
564
+ export const pointOnPolycurve = (point, polycurve, threshold = DEFAULT_THRESHOLD) => {
565
+ return polycurve.some((curve) => pointOnCurve(point, curve, threshold));
566
+ };
567
+ export const pointInPolygon = (point, polygon) => {
568
+ const x = point[0];
569
+ const y = point[1];
570
+ let inside = false;
571
+ for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
572
+ const xi = polygon[i][0];
573
+ const yi = polygon[i][1];
574
+ const xj = polygon[j][0];
575
+ const yj = polygon[j][1];
576
+ if (((yi > y && yj <= y) || (yi <= y && yj > y)) &&
577
+ x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {
578
+ inside = !inside;
579
+ }
580
+ }
581
+ return inside;
582
+ };
583
+ export const pointOnPolygon = (point, polygon, threshold = DEFAULT_THRESHOLD) => {
584
+ let on = false;
585
+ const closed = close(polygon);
586
+ for (let i = 0, l = closed.length - 1; i < l; i++) {
587
+ if (pointOnLine(point, [closed[i], closed[i + 1]], threshold)) {
588
+ on = true;
589
+ break;
590
+ }
591
+ }
592
+ return on;
593
+ };
594
+ export const polygonInPolygon = (polygonA, polygonB) => {
595
+ let inside = true;
596
+ const closed = close(polygonA);
597
+ for (let i = 0, l = closed.length - 1; i < l; i++) {
598
+ const v0 = closed[i];
599
+ // Points test
600
+ if (!pointInPolygon(v0, polygonB)) {
601
+ inside = false;
602
+ break;
603
+ }
604
+ // Lines test
605
+ if (lineIntersectsPolygon([v0, closed[i + 1]], polygonB)) {
606
+ inside = false;
607
+ break;
608
+ }
609
+ }
610
+ return inside;
611
+ };
612
+ export const polygonIntersectPolygon = (polygonA, polygonB) => {
613
+ let intersects = false;
614
+ let onCount = 0;
615
+ const closed = close(polygonA);
616
+ for (let i = 0, l = closed.length - 1; i < l; i++) {
617
+ const v0 = closed[i];
618
+ const v1 = closed[i + 1];
619
+ if (lineIntersectsPolygon([v0, v1], polygonB)) {
620
+ intersects = true;
621
+ break;
622
+ }
623
+ if (pointOnPolygon(v0, polygonB)) {
624
+ ++onCount;
625
+ }
626
+ if (onCount === 2) {
627
+ intersects = true;
628
+ break;
629
+ }
630
+ }
631
+ return intersects;
632
+ };
633
+ const distanceToEllipse = (point, ellipse) => {
634
+ const { angle, halfWidth, halfHeight, center } = ellipse;
635
+ const a = halfWidth;
636
+ const b = halfHeight;
637
+ const [rotatedPointX, rotatedPointY] = pointRelativeToCenter(point, center, angle);
638
+ const px = Math.abs(rotatedPointX);
639
+ const py = Math.abs(rotatedPointY);
640
+ let tx = 0.707;
641
+ let ty = 0.707;
642
+ for (let i = 0; i < 3; i++) {
643
+ const x = a * tx;
644
+ const y = b * ty;
645
+ const ex = ((a * a - b * b) * tx ** 3) / a;
646
+ const ey = ((b * b - a * a) * ty ** 3) / b;
647
+ const rx = x - ex;
648
+ const ry = y - ey;
649
+ const qx = px - ex;
650
+ const qy = py - ey;
651
+ const r = Math.hypot(ry, rx);
652
+ const q = Math.hypot(qy, qx);
653
+ tx = Math.min(1, Math.max(0, ((qx * r) / q + ex) / a));
654
+ ty = Math.min(1, Math.max(0, ((qy * r) / q + ey) / b));
655
+ const t = Math.hypot(ty, tx);
656
+ tx /= t;
657
+ ty /= t;
658
+ }
659
+ const [minX, minY] = [
660
+ a * tx * Math.sign(rotatedPointX),
661
+ b * ty * Math.sign(rotatedPointY),
662
+ ];
663
+ return distanceToPoint([rotatedPointX, rotatedPointY], [minX, minY]);
664
+ };
665
+ export const pointOnEllipse = (point, ellipse, threshold = DEFAULT_THRESHOLD) => {
666
+ return distanceToEllipse(point, ellipse) <= threshold;
667
+ };
668
+ export const pointInEllipse = (point, ellipse) => {
669
+ const { center, angle, halfWidth, halfHeight } = ellipse;
670
+ const [rotatedPointX, rotatedPointY] = pointRelativeToCenter(point, center, angle);
671
+ return ((rotatedPointX / halfWidth) * (rotatedPointX / halfWidth) +
672
+ (rotatedPointY / halfHeight) * (rotatedPointY / halfHeight) <=
673
+ 1);
674
+ };