@excalidraw/common 0.18.0-a8acc82 → 0.18.0-ab0255f

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 (330) hide show
  1. package/dist/dev/index.js +1699 -366
  2. package/dist/dev/index.js.map +4 -4
  3. package/dist/prod/index.js +3 -3
  4. package/dist/types/common/debug.d.ts +21 -0
  5. package/dist/types/common/src/appEventBus.d.ts +27 -0
  6. package/dist/types/common/src/bounds.d.ts +10 -0
  7. package/dist/types/common/src/colors.d.ts +75 -39
  8. package/dist/types/common/src/constants.d.ts +36 -35
  9. package/dist/types/common/src/editorInterface.d.ts +34 -0
  10. package/dist/types/common/src/font-metadata.d.ts +1 -3
  11. package/dist/types/common/src/index.d.ts +5 -0
  12. package/dist/types/common/src/keys.d.ts +3 -1
  13. package/dist/types/common/src/points.d.ts +1 -1
  14. package/dist/types/common/src/utility-types.d.ts +0 -1
  15. package/dist/types/common/src/utils.d.ts +48 -79
  16. package/dist/types/common/src/versionedSnapshotStore.d.ts +17 -0
  17. package/dist/types/element/src/Scene.d.ts +12 -8
  18. package/dist/types/element/src/align.d.ts +2 -2
  19. package/dist/types/element/src/arrowEndpointText.d.ts +49 -0
  20. package/dist/types/element/src/arrowheads.d.ts +3 -0
  21. package/dist/types/element/src/arrows/focus.d.ts +30 -0
  22. package/dist/types/element/src/arrows/helpers.d.ts +5 -0
  23. package/dist/types/element/src/binding.d.ts +79 -51
  24. package/dist/types/element/src/bounds.d.ts +25 -18
  25. package/dist/types/element/src/bucketFill.d.ts +110 -0
  26. package/dist/types/element/src/collision.d.ts +7 -2
  27. package/dist/types/element/src/comparisons.d.ts +8 -7
  28. package/dist/types/element/src/convertToShape.d.ts +23 -0
  29. package/dist/types/element/src/distribute.d.ts +3 -2
  30. package/dist/types/element/src/dragElements.d.ts +30 -3
  31. package/dist/types/element/src/duplicate.d.ts +7 -6
  32. package/dist/types/element/src/elbowArrow.d.ts +2 -0
  33. package/dist/types/element/src/embeddable.d.ts +2 -2
  34. package/dist/types/element/src/flowchart.d.ts +7 -7
  35. package/dist/types/element/src/fractionalIndex.d.ts +4 -4
  36. package/dist/types/element/src/frame.d.ts +16 -11
  37. package/dist/types/element/src/groups.d.ts +9 -9
  38. package/dist/types/element/src/heading.d.ts +2 -1
  39. package/dist/types/element/src/image.d.ts +1 -11
  40. package/dist/types/element/src/index.d.ts +8 -4
  41. package/dist/types/element/src/linearElementEditor.d.ts +38 -30
  42. package/dist/types/element/src/mutateElement.d.ts +5 -1
  43. package/dist/types/element/src/newElement.d.ts +20 -6
  44. package/dist/types/element/src/renderElement.d.ts +1 -10
  45. package/dist/types/element/src/resizeElements.d.ts +12 -12
  46. package/dist/types/element/src/resizeTest.d.ts +6 -5
  47. package/dist/types/element/src/selection.d.ts +14 -14
  48. package/dist/types/element/src/shape.d.ts +21 -8
  49. package/dist/types/element/src/textElement.d.ts +13 -10
  50. package/dist/types/element/src/textMeasurements.d.ts +1 -3
  51. package/dist/types/element/src/textWrapping.d.ts +26 -0
  52. package/dist/types/{excalidraw/data → element/src}/transform.d.ts +3 -3
  53. package/dist/types/element/src/transformHandles.d.ts +8 -27
  54. package/dist/types/element/src/typeChecks.d.ts +29 -31
  55. package/dist/types/element/src/types.d.ts +20 -14
  56. package/dist/types/element/src/utils.d.ts +9 -4
  57. package/dist/types/element/src/zindex.d.ts +7 -1
  58. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +191 -216
  59. package/dist/types/excalidraw/actions/actionAlign.d.ts +12 -13
  60. package/dist/types/excalidraw/actions/actionBoundText.d.ts +112 -129
  61. package/dist/types/excalidraw/actions/actionCanvas.d.ts +447 -1599
  62. package/dist/types/excalidraw/actions/actionClipboard.d.ts +139 -901
  63. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +54 -63
  64. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +180 -208
  65. package/dist/types/excalidraw/actions/actionDeselect.d.ts +162 -0
  66. package/dist/types/excalidraw/actions/actionDistribute.d.ts +4 -6
  67. package/dist/types/excalidraw/actions/actionDuplicateSelection.d.ts +3 -4
  68. package/dist/types/excalidraw/actions/actionElementLink.d.ts +61 -76
  69. package/dist/types/excalidraw/actions/actionElementLock.d.ts +111 -128
  70. package/dist/types/excalidraw/actions/actionExport.d.ts +189 -1418
  71. package/dist/types/excalidraw/actions/actionFinalize.d.ts +10 -396
  72. package/dist/types/excalidraw/actions/actionFlip.d.ts +2 -3
  73. package/dist/types/excalidraw/actions/actionFrame.d.ts +292 -541
  74. package/dist/types/excalidraw/actions/actionGroup.d.ts +122 -147
  75. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +192 -237
  76. package/dist/types/excalidraw/actions/actionLink.d.ts +67 -76
  77. package/dist/types/excalidraw/actions/actionMenu.d.ts +56 -439
  78. package/dist/types/excalidraw/actions/actionNavigate.d.ts +18 -361
  79. package/dist/types/excalidraw/actions/actionProperties.d.ts +197 -2554
  80. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +61 -74
  81. package/dist/types/excalidraw/actions/actionStyles.d.ts +54 -62
  82. package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +4 -4
  83. package/dist/types/excalidraw/actions/actionToggleArrowBinding.d.ts +178 -0
  84. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +69 -79
  85. package/dist/types/excalidraw/actions/actionToggleMidpointSnapping.d.ts +178 -0
  86. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +68 -77
  87. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +57 -73
  88. package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +2 -2
  89. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +67 -76
  90. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +68 -77
  91. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +68 -77
  92. package/dist/types/excalidraw/actions/actionZindex.d.ts +8 -9
  93. package/dist/types/excalidraw/actions/index.d.ts +5 -3
  94. package/dist/types/excalidraw/actions/manager.d.ts +1 -0
  95. package/dist/types/excalidraw/actions/register.d.ts +2 -2
  96. package/dist/types/excalidraw/actions/shortcuts.d.ts +1 -1
  97. package/dist/types/excalidraw/actions/types.d.ts +11 -7
  98. package/dist/types/excalidraw/{animated-trail.d.ts → animatedTrail.d.ts} +4 -3
  99. package/dist/types/excalidraw/appState.d.ts +46 -38
  100. package/dist/types/excalidraw/charts/charts.bar.d.ts +2 -0
  101. package/dist/types/excalidraw/charts/charts.constants.d.ts +48 -0
  102. package/dist/types/excalidraw/charts/charts.helpers.d.ts +32 -0
  103. package/dist/types/excalidraw/charts/charts.line.d.ts +2 -0
  104. package/dist/types/excalidraw/charts/charts.parse.d.ts +10 -0
  105. package/dist/types/excalidraw/charts/charts.radar.d.ts +2 -0
  106. package/dist/types/excalidraw/charts/charts.types.d.ts +18 -0
  107. package/dist/types/excalidraw/charts/index.d.ts +7 -0
  108. package/dist/types/excalidraw/clipboard.d.ts +15 -40
  109. package/dist/types/excalidraw/components/Actions.d.ts +26 -11
  110. package/dist/types/excalidraw/components/ActiveConfirmDialog.d.ts +1 -1
  111. package/dist/types/excalidraw/components/App.arrowText.d.ts +72 -0
  112. package/dist/types/excalidraw/components/App.bucketFill.d.ts +34 -0
  113. package/dist/types/excalidraw/components/App.cursor.d.ts +31 -0
  114. package/dist/types/excalidraw/components/App.d.ts +447 -118
  115. package/dist/types/excalidraw/components/App.drawshape.d.ts +55 -0
  116. package/dist/types/excalidraw/components/App.flowchart.d.ts +21 -0
  117. package/dist/types/excalidraw/components/App.viewport.d.ts +73 -0
  118. package/dist/types/excalidraw/components/AppStateObserver.d.ts +37 -0
  119. package/dist/types/excalidraw/components/Card.d.ts +1 -3
  120. package/dist/types/excalidraw/components/ColorPicker/ColorInput.d.ts +2 -4
  121. package/dist/types/excalidraw/components/ColorPicker/ColorPicker.d.ts +5 -5
  122. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +3 -0
  123. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +7 -1
  124. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +2 -1
  125. package/dist/types/excalidraw/components/ColorPicker/colorPickerUtils.d.ts +1 -2
  126. package/dist/types/excalidraw/components/ColorPicker/keyboardNavHandlers.d.ts +2 -2
  127. package/dist/types/excalidraw/components/CommandPalette/CommandPalette.d.ts +1 -0
  128. package/dist/types/excalidraw/components/CommandPalette/defaultCommandPaletteItems.d.ts +1 -2
  129. package/dist/types/excalidraw/components/CommandPalette/types.d.ts +2 -4
  130. package/dist/types/excalidraw/components/ConvertElementTypePopup.d.ts +4 -4
  131. package/dist/types/excalidraw/components/CursorHint.d.ts +46 -0
  132. package/dist/types/excalidraw/components/DarkModeToggle.d.ts +1 -1
  133. package/dist/types/excalidraw/components/DefaultSidebar.d.ts +9 -13
  134. package/dist/types/excalidraw/components/ElementLinkDialog.d.ts +1 -1
  135. package/dist/types/excalidraw/components/Ellipsify.d.ts +1 -2
  136. package/dist/types/excalidraw/components/ErrorDialog.d.ts +1 -1
  137. package/dist/types/excalidraw/components/EyeDropper.d.ts +1 -2
  138. package/dist/types/excalidraw/components/FilledButton.d.ts +2 -1
  139. package/dist/types/excalidraw/components/FontPicker/FontPickerTrigger.d.ts +2 -1
  140. package/dist/types/excalidraw/components/FontPicker/keyboardNavHandlers.d.ts +0 -1
  141. package/dist/types/excalidraw/components/HelpDialog.d.ts +1 -1
  142. package/dist/types/excalidraw/components/HintViewer.d.ts +4 -3
  143. package/dist/types/excalidraw/components/{ToolButton.d.ts → IconButton.d.ts} +16 -19
  144. package/dist/types/excalidraw/components/IconPicker.d.ts +14 -9
  145. package/dist/types/excalidraw/components/InlineIcon.d.ts +3 -1
  146. package/dist/types/excalidraw/components/Island.d.ts +7 -0
  147. package/dist/types/excalidraw/components/LaserPointerButton.d.ts +2 -4
  148. package/dist/types/excalidraw/components/LayerUI.d.ts +5 -2
  149. package/dist/types/excalidraw/components/LibraryMenu.d.ts +1 -1
  150. package/dist/types/excalidraw/components/LibraryMenuControlButtons.d.ts +1 -1
  151. package/dist/types/excalidraw/components/LibraryMenuHeaderContent.d.ts +1 -2
  152. package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +1 -1
  153. package/dist/types/excalidraw/components/LibraryUnit.d.ts +2 -3
  154. package/dist/types/excalidraw/components/LoadingMessage.d.ts +0 -1
  155. package/dist/types/excalidraw/components/LockButton.d.ts +3 -4
  156. package/dist/types/excalidraw/components/MagicButton.d.ts +0 -2
  157. package/dist/types/excalidraw/components/MobileMenu.d.ts +5 -7
  158. package/dist/types/excalidraw/components/MobileToolbar.d.ts +9 -0
  159. package/dist/types/excalidraw/components/Modal.d.ts +0 -1
  160. package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirm.d.ts +1 -1
  161. package/dist/types/excalidraw/components/OverwriteConfirm/OverwriteConfirmState.d.ts +1 -1
  162. package/dist/types/excalidraw/components/PasteChartDialog.d.ts +4 -5
  163. package/dist/types/excalidraw/components/PenModeButton.d.ts +2 -5
  164. package/dist/types/excalidraw/components/Popover.d.ts +2 -3
  165. package/dist/types/excalidraw/components/PropertiesPopover.d.ts +1 -1
  166. package/dist/types/excalidraw/components/{ButtonIcon.d.ts → RadioButton.d.ts} +2 -5
  167. package/dist/types/excalidraw/components/RadioGroup.d.ts +0 -1
  168. package/dist/types/excalidraw/components/RadioSelection.d.ts +4 -4
  169. package/dist/types/excalidraw/components/Range.d.ts +10 -4
  170. package/dist/types/excalidraw/components/SVGLayer.d.ts +1 -1
  171. package/dist/types/excalidraw/components/ScrollableList.d.ts +0 -1
  172. package/dist/types/excalidraw/components/SearchMenu.d.ts +1 -1
  173. package/dist/types/excalidraw/components/Sidebar/Sidebar.d.ts +16 -22
  174. package/dist/types/excalidraw/components/Sidebar/SidebarHeader.d.ts +1 -1
  175. package/dist/types/excalidraw/components/Sidebar/SidebarTab.d.ts +1 -2
  176. package/dist/types/excalidraw/components/Sidebar/SidebarTabTrigger.d.ts +1 -2
  177. package/dist/types/excalidraw/components/Sidebar/SidebarTabTriggers.d.ts +1 -2
  178. package/dist/types/excalidraw/components/Sidebar/SidebarTabs.d.ts +1 -2
  179. package/dist/types/excalidraw/components/Spinner.d.ts +4 -4
  180. package/dist/types/excalidraw/components/Stats/Angle.d.ts +2 -2
  181. package/dist/types/excalidraw/components/Stats/CanvasGrid.d.ts +0 -1
  182. package/dist/types/excalidraw/components/Stats/Collapsible.d.ts +0 -1
  183. package/dist/types/excalidraw/components/Stats/Dimension.d.ts +2 -2
  184. package/dist/types/excalidraw/components/Stats/DragInput.d.ts +2 -3
  185. package/dist/types/excalidraw/components/Stats/MultiAngle.d.ts +2 -2
  186. package/dist/types/excalidraw/components/Stats/MultiDimension.d.ts +2 -2
  187. package/dist/types/excalidraw/components/Stats/MultiPosition.d.ts +2 -2
  188. package/dist/types/excalidraw/components/Stats/Position.d.ts +3 -3
  189. package/dist/types/excalidraw/components/Stats/index.d.ts +7 -8
  190. package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
  191. package/dist/types/excalidraw/components/TTDDialog/Chat/ChatHistoryMenu.d.ts +15 -0
  192. package/dist/types/excalidraw/components/TTDDialog/Chat/ChatInterface.d.ts +23 -0
  193. package/dist/types/excalidraw/components/TTDDialog/Chat/ChatMessage.d.ts +14 -0
  194. package/dist/types/excalidraw/components/TTDDialog/Chat/TTDChatPanel.d.ts +27 -0
  195. package/dist/types/excalidraw/components/TTDDialog/Chat/index.d.ts +3 -0
  196. package/dist/types/excalidraw/components/TTDDialog/Chat/useChatAgent.d.ts +8 -0
  197. package/dist/types/excalidraw/components/TTDDialog/CodeMirrorEditor.d.ts +11 -0
  198. package/dist/types/excalidraw/components/TTDDialog/MermaidToExcalidraw.d.ts +3 -2
  199. package/dist/types/excalidraw/components/TTDDialog/TTDContext.d.ts +13 -0
  200. package/dist/types/excalidraw/components/TTDDialog/TTDDialog.d.ts +12 -29
  201. package/dist/types/excalidraw/components/TTDDialog/TTDDialogInput.d.ts +3 -3
  202. package/dist/types/excalidraw/components/TTDDialog/TTDDialogOutput.d.ts +5 -2
  203. package/dist/types/excalidraw/components/TTDDialog/TTDDialogPanel.d.ts +13 -9
  204. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTab.d.ts +1 -2
  205. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTabTrigger.d.ts +1 -2
  206. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTabTriggers.d.ts +1 -2
  207. package/dist/types/excalidraw/components/TTDDialog/TTDPreviewPanel.d.ts +9 -0
  208. package/dist/types/excalidraw/components/TTDDialog/TTDWelcomeMessage.d.ts +1 -0
  209. package/dist/types/excalidraw/components/TTDDialog/TextToDiagram.d.ts +9 -0
  210. package/dist/types/excalidraw/components/TTDDialog/common.d.ts +16 -16
  211. package/dist/types/excalidraw/components/TTDDialog/hooks/useChatManagement.d.ts +13 -0
  212. package/dist/types/excalidraw/components/TTDDialog/hooks/useMermaidRenderer.d.ts +14 -0
  213. package/dist/types/excalidraw/components/TTDDialog/hooks/useTextGeneration.d.ts +7 -0
  214. package/dist/types/excalidraw/components/TTDDialog/mermaid-lang-lite.d.ts +2 -0
  215. package/dist/types/excalidraw/components/TTDDialog/types.d.ts +95 -0
  216. package/dist/types/excalidraw/components/TTDDialog/useTTDChatStorage.d.ts +22 -0
  217. package/dist/types/excalidraw/components/TTDDialog/utils/chat.d.ts +10 -0
  218. package/dist/types/excalidraw/components/TTDDialog/utils/mermaidAutoFix.d.ts +1 -0
  219. package/dist/types/excalidraw/components/TTDDialog/utils/mermaidError.d.ts +10 -0
  220. package/dist/types/excalidraw/components/TTDDialog/utils/mermaidValidation.d.ts +1 -0
  221. package/dist/types/excalidraw/components/TextField.d.ts +1 -0
  222. package/dist/types/excalidraw/components/Toast.d.ts +11 -7
  223. package/dist/types/excalidraw/components/ToolPopover.d.ts +22 -0
  224. package/dist/types/excalidraw/components/Toolbar.d.ts +11 -0
  225. package/dist/types/excalidraw/components/Tools.d.ts +146 -0
  226. package/dist/types/excalidraw/components/Trans.d.ts +2 -2
  227. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +10 -4
  228. package/dist/types/excalidraw/components/canvases/NewElementCanvas.d.ts +1 -0
  229. package/dist/types/excalidraw/components/canvases/StaticCanvas.d.ts +1 -1
  230. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenu.d.ts +47 -35
  231. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuContent.d.ts +7 -5
  232. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuGroup.d.ts +3 -3
  233. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItem.d.ts +13 -22
  234. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemCheckbox.d.ts +5 -0
  235. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContent.d.ts +5 -4
  236. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemContentRadio.d.ts +2 -2
  237. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemCustom.d.ts +2 -2
  238. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuItemLink.d.ts +6 -6
  239. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuSub.d.ts +23 -0
  240. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuSubContent.d.ts +8 -0
  241. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuSubTrigger.d.ts +12 -0
  242. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuTrigger.d.ts +3 -4
  243. package/dist/types/excalidraw/components/dropdownMenu/common.d.ts +2 -2
  244. package/dist/types/excalidraw/components/dropdownMenu/dropdownMenuUtils.d.ts +2 -0
  245. package/dist/types/excalidraw/components/footer/Footer.d.ts +3 -1
  246. package/dist/types/excalidraw/components/hoc/withInternalFallback.d.ts +1 -1
  247. package/dist/types/excalidraw/components/hyperlink/helpers.d.ts +3 -3
  248. package/dist/types/excalidraw/components/icons.d.ts +47 -23
  249. package/dist/types/excalidraw/components/main-menu/DefaultItems.d.ts +24 -3
  250. package/dist/types/excalidraw/components/main-menu/MainMenu.d.ts +39 -35
  251. package/dist/types/excalidraw/components/positionElementBesideCursor.d.ts +26 -0
  252. package/dist/types/excalidraw/components/shapeActionPredicates.d.ts +39 -0
  253. package/dist/types/excalidraw/data/blob.d.ts +338 -7
  254. package/dist/types/excalidraw/data/encode.d.ts +4 -4
  255. package/dist/types/excalidraw/data/encryption.d.ts +5 -5
  256. package/dist/types/excalidraw/data/filesystem.d.ts +5 -7
  257. package/dist/types/excalidraw/data/index.d.ts +8 -9
  258. package/dist/types/excalidraw/data/json.d.ts +175 -3
  259. package/dist/types/excalidraw/data/library.d.ts +25 -10
  260. package/dist/types/excalidraw/data/resave.d.ts +7 -2
  261. package/dist/types/excalidraw/data/restore.d.ts +25 -10
  262. package/dist/types/excalidraw/drawShapeTrail.d.ts +16 -0
  263. package/dist/types/excalidraw/editor-jotai.d.ts +11 -11
  264. package/dist/types/excalidraw/eraser/index.d.ts +2 -3
  265. package/dist/types/excalidraw/errors.d.ts +14 -0
  266. package/dist/types/excalidraw/hooks/useAppStateValue.d.ts +29 -0
  267. package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +2 -2
  268. package/dist/types/excalidraw/hooks/useOutsideClick.d.ts +4 -3
  269. package/dist/types/excalidraw/hooks/useScrollPosition.d.ts +1 -2
  270. package/dist/types/excalidraw/i18n.d.ts +2 -2
  271. package/dist/types/excalidraw/{laser-trails.d.ts → laserTrails.d.ts} +5 -7
  272. package/dist/types/excalidraw/lasso/index.d.ts +2 -3
  273. package/dist/types/excalidraw/renderer/animation.d.ts +16 -0
  274. package/dist/types/excalidraw/renderer/helpers.d.ts +6 -8
  275. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +7 -15
  276. package/dist/types/excalidraw/scene/Renderer.d.ts +428 -18
  277. package/dist/types/excalidraw/scene/export.d.ts +4 -4
  278. package/dist/types/excalidraw/scene/index.d.ts +2 -2
  279. package/dist/types/excalidraw/scene/types.d.ts +26 -8
  280. package/dist/types/excalidraw/shortcut.d.ts +1 -0
  281. package/dist/types/excalidraw/snapping.d.ts +12 -12
  282. package/dist/types/excalidraw/subset/harfbuzz/harfbuzz-bindings.d.ts +1 -1
  283. package/dist/types/excalidraw/subset/harfbuzz/harfbuzz-loader.d.ts +1 -1
  284. package/dist/types/excalidraw/subset/harfbuzz/harfbuzz-wasm.d.ts +1 -1
  285. package/dist/types/excalidraw/subset/woff2/woff2-loader.d.ts +2 -2
  286. package/dist/types/excalidraw/subset/woff2/woff2-wasm.d.ts +1 -1
  287. package/dist/types/excalidraw/textAutoResizeHandle.d.ts +15 -0
  288. package/dist/types/excalidraw/types.d.ts +485 -52
  289. package/dist/types/excalidraw/viewport.d.ts +272 -0
  290. package/dist/types/excalidraw/wysiwyg/textWysiwyg.d.ts +8 -5
  291. package/dist/types/fractional-indexing/src/index.d.ts +29 -0
  292. package/dist/types/laser-pointer/src/index.d.ts +2 -0
  293. package/dist/types/laser-pointer/src/math.d.ts +16 -0
  294. package/dist/types/laser-pointer/src/simplify.d.ts +2 -0
  295. package/dist/types/laser-pointer/src/state.d.ts +36 -0
  296. package/dist/types/math/src/constants.d.ts +0 -1
  297. package/dist/types/math/src/curve.d.ts +4 -1
  298. package/dist/types/math/src/index.d.ts +1 -0
  299. package/dist/types/math/src/pca.d.ts +79 -0
  300. package/dist/types/math/src/point.d.ts +8 -2
  301. package/dist/types/math/src/polygon.d.ts +26 -2
  302. package/dist/types/math/src/range.d.ts +1 -3
  303. package/dist/types/math/src/segment.d.ts +3 -3
  304. package/dist/types/math/src/types.d.ts +25 -1
  305. package/dist/types/utils/src/export.d.ts +8 -8
  306. package/dist/types/utils/src/index.d.ts +1 -2
  307. package/dist/types/utils/src/shape.d.ts +6 -6
  308. package/package.json +7 -1
  309. package/dist/types/excalidraw/actions/actionEmbeddable.d.ts +0 -186
  310. package/dist/types/excalidraw/animation-frame-handler.d.ts +0 -16
  311. package/dist/types/excalidraw/charts.d.ts +0 -27
  312. package/dist/types/excalidraw/components/DiagramToCodePlugin/DiagramToCodePlugin.d.ts +0 -4
  313. package/dist/types/excalidraw/components/ExcalidrawLogo.d.ts +0 -16
  314. package/dist/types/excalidraw/components/HandButton.d.ts +0 -10
  315. package/dist/types/excalidraw/components/InitializeApp.d.ts +0 -10
  316. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +0 -9
  317. package/dist/types/excalidraw/components/footer/FooterCenter.d.ts +0 -8
  318. package/dist/types/excalidraw/components/live-collaboration/LiveCollaborationTrigger.d.ts +0 -10
  319. package/dist/types/excalidraw/components/shapes.d.ts +0 -190
  320. package/dist/types/excalidraw/components/welcome-screen/WelcomeScreen.Center.d.ts +0 -58
  321. package/dist/types/excalidraw/components/welcome-screen/WelcomeScreen.Hints.d.ts +0 -19
  322. package/dist/types/excalidraw/components/welcome-screen/WelcomeScreen.d.ts +0 -85
  323. package/dist/types/excalidraw/cursor.d.ts +0 -5
  324. package/dist/types/excalidraw/data/reconcile.d.ts +0 -7
  325. package/dist/types/excalidraw/index.d.ts +0 -47
  326. package/dist/types/excalidraw/polyfill.d.ts +0 -2
  327. package/dist/types/excalidraw/scene/scroll.d.ts +0 -23
  328. package/dist/types/excalidraw/scene/zoom.d.ts +0 -12
  329. package/dist/types/utils/src/bbox.d.ts +0 -9
  330. package/dist/types/utils/src/withinBounds.d.ts +0 -19
package/dist/dev/index.js CHANGED
@@ -281,49 +281,48 @@ var BinaryHeap = class {
281
281
  content = [];
282
282
  sinkDown(idx) {
283
283
  const node = this.content[idx];
284
+ const nodeScore = this.scoreFunction(node);
284
285
  while (idx > 0) {
285
286
  const parentN = (idx + 1 >> 1) - 1;
286
287
  const parent = this.content[parentN];
287
- if (this.scoreFunction(node) < this.scoreFunction(parent)) {
288
- this.content[parentN] = node;
288
+ if (nodeScore < this.scoreFunction(parent)) {
289
289
  this.content[idx] = parent;
290
290
  idx = parentN;
291
291
  } else {
292
292
  break;
293
293
  }
294
294
  }
295
+ this.content[idx] = node;
295
296
  }
296
297
  bubbleUp(idx) {
297
298
  const length = this.content.length;
298
299
  const node = this.content[idx];
299
300
  const score = this.scoreFunction(node);
300
301
  while (true) {
301
- const child2N = idx + 1 << 1;
302
- const child1N = child2N - 1;
303
- let swap = null;
304
- let child1Score = 0;
302
+ const child1N = (idx + 1 << 1) - 1;
303
+ const child2N = child1N + 1;
304
+ let smallestIdx = idx;
305
+ let smallestScore = score;
305
306
  if (child1N < length) {
306
- const child1 = this.content[child1N];
307
- child1Score = this.scoreFunction(child1);
308
- if (child1Score < score) {
309
- swap = child1N;
307
+ const child1Score = this.scoreFunction(this.content[child1N]);
308
+ if (child1Score < smallestScore) {
309
+ smallestIdx = child1N;
310
+ smallestScore = child1Score;
310
311
  }
311
312
  }
312
313
  if (child2N < length) {
313
- const child2 = this.content[child2N];
314
- const child2Score = this.scoreFunction(child2);
315
- if (child2Score < (swap === null ? score : child1Score)) {
316
- swap = child2N;
314
+ const child2Score = this.scoreFunction(this.content[child2N]);
315
+ if (child2Score < smallestScore) {
316
+ smallestIdx = child2N;
317
317
  }
318
318
  }
319
- if (swap !== null) {
320
- this.content[idx] = this.content[swap];
321
- this.content[swap] = node;
322
- idx = swap;
323
- } else {
319
+ if (smallestIdx === idx) {
324
320
  break;
325
321
  }
322
+ this.content[idx] = this.content[smallestIdx];
323
+ idx = smallestIdx;
326
324
  }
325
+ this.content[idx] = node;
327
326
  }
328
327
  push(node) {
329
328
  this.content.push(node);
@@ -364,173 +363,1061 @@ var BinaryHeap = class {
364
363
  }
365
364
  };
366
365
 
366
+ // src/bounds.ts
367
+ init_define_import_meta_env();
368
+ var isBounds = (box) => Array.isArray(box) && box.length === 4 && typeof box[0] === "number" && typeof box[1] === "number" && typeof box[2] === "number" && typeof box[3] === "number";
369
+
367
370
  // src/colors.ts
368
371
  init_define_import_meta_env();
369
372
 
370
- // ../../node_modules/open-color/open-color.json
371
- var open_color_default = {
372
- white: "#ffffff",
373
- black: "#000000",
374
- gray: [
375
- "#f8f9fa",
376
- "#f1f3f5",
377
- "#e9ecef",
378
- "#dee2e6",
379
- "#ced4da",
380
- "#adb5bd",
381
- "#868e96",
382
- "#495057",
383
- "#343a40",
384
- "#212529"
385
- ],
386
- red: [
387
- "#fff5f5",
388
- "#ffe3e3",
389
- "#ffc9c9",
390
- "#ffa8a8",
391
- "#ff8787",
392
- "#ff6b6b",
393
- "#fa5252",
394
- "#f03e3e",
395
- "#e03131",
396
- "#c92a2a"
397
- ],
398
- pink: [
399
- "#fff0f6",
400
- "#ffdeeb",
401
- "#fcc2d7",
402
- "#faa2c1",
403
- "#f783ac",
404
- "#f06595",
405
- "#e64980",
406
- "#d6336c",
407
- "#c2255c",
408
- "#a61e4d"
409
- ],
410
- grape: [
411
- "#f8f0fc",
412
- "#f3d9fa",
413
- "#eebefa",
414
- "#e599f7",
415
- "#da77f2",
416
- "#cc5de8",
417
- "#be4bdb",
418
- "#ae3ec9",
419
- "#9c36b5",
420
- "#862e9c"
421
- ],
422
- violet: [
423
- "#f3f0ff",
424
- "#e5dbff",
425
- "#d0bfff",
426
- "#b197fc",
427
- "#9775fa",
428
- "#845ef7",
429
- "#7950f2",
430
- "#7048e8",
431
- "#6741d9",
432
- "#5f3dc4"
433
- ],
434
- indigo: [
435
- "#edf2ff",
436
- "#dbe4ff",
437
- "#bac8ff",
438
- "#91a7ff",
439
- "#748ffc",
440
- "#5c7cfa",
441
- "#4c6ef5",
442
- "#4263eb",
443
- "#3b5bdb",
444
- "#364fc7"
445
- ],
446
- blue: [
447
- "#e7f5ff",
448
- "#d0ebff",
449
- "#a5d8ff",
450
- "#74c0fc",
451
- "#4dabf7",
452
- "#339af0",
453
- "#228be6",
454
- "#1c7ed6",
455
- "#1971c2",
456
- "#1864ab"
457
- ],
458
- cyan: [
459
- "#e3fafc",
460
- "#c5f6fa",
461
- "#99e9f2",
462
- "#66d9e8",
463
- "#3bc9db",
464
- "#22b8cf",
465
- "#15aabf",
466
- "#1098ad",
467
- "#0c8599",
468
- "#0b7285"
469
- ],
470
- teal: [
471
- "#e6fcf5",
472
- "#c3fae8",
473
- "#96f2d7",
474
- "#63e6be",
475
- "#38d9a9",
476
- "#20c997",
477
- "#12b886",
478
- "#0ca678",
479
- "#099268",
480
- "#087f5b"
481
- ],
482
- green: [
483
- "#ebfbee",
484
- "#d3f9d8",
485
- "#b2f2bb",
486
- "#8ce99a",
487
- "#69db7c",
488
- "#51cf66",
489
- "#40c057",
490
- "#37b24d",
491
- "#2f9e44",
492
- "#2b8a3e"
493
- ],
494
- lime: [
495
- "#f4fce3",
496
- "#e9fac8",
497
- "#d8f5a2",
498
- "#c0eb75",
499
- "#a9e34b",
500
- "#94d82d",
501
- "#82c91e",
502
- "#74b816",
503
- "#66a80f",
504
- "#5c940d"
505
- ],
506
- yellow: [
507
- "#fff9db",
508
- "#fff3bf",
509
- "#ffec99",
510
- "#ffe066",
511
- "#ffd43b",
512
- "#fcc419",
513
- "#fab005",
514
- "#f59f00",
515
- "#f08c00",
516
- "#e67700"
517
- ],
518
- orange: [
519
- "#fff4e6",
520
- "#ffe8cc",
521
- "#ffd8a8",
522
- "#ffc078",
523
- "#ffa94d",
524
- "#ff922b",
525
- "#fd7e14",
526
- "#f76707",
527
- "#e8590c",
528
- "#d9480f"
529
- ]
373
+ // ../../node_modules/tinycolor2/esm/tinycolor.js
374
+ init_define_import_meta_env();
375
+ function _typeof(obj) {
376
+ "@babel/helpers - typeof";
377
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) {
378
+ return typeof obj2;
379
+ } : function(obj2) {
380
+ return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
381
+ }, _typeof(obj);
382
+ }
383
+ var trimLeft = /^\s+/;
384
+ var trimRight = /\s+$/;
385
+ function tinycolor(color, opts) {
386
+ color = color ? color : "";
387
+ opts = opts || {};
388
+ if (color instanceof tinycolor) {
389
+ return color;
390
+ }
391
+ if (!(this instanceof tinycolor)) {
392
+ return new tinycolor(color, opts);
393
+ }
394
+ var rgb = inputToRGB(color);
395
+ this._originalInput = color, this._r = rgb.r, this._g = rgb.g, this._b = rgb.b, this._a = rgb.a, this._roundA = Math.round(100 * this._a) / 100, this._format = opts.format || rgb.format;
396
+ this._gradientType = opts.gradientType;
397
+ if (this._r < 1)
398
+ this._r = Math.round(this._r);
399
+ if (this._g < 1)
400
+ this._g = Math.round(this._g);
401
+ if (this._b < 1)
402
+ this._b = Math.round(this._b);
403
+ this._ok = rgb.ok;
404
+ }
405
+ tinycolor.prototype = {
406
+ isDark: function isDark() {
407
+ return this.getBrightness() < 128;
408
+ },
409
+ isLight: function isLight() {
410
+ return !this.isDark();
411
+ },
412
+ isValid: function isValid() {
413
+ return this._ok;
414
+ },
415
+ getOriginalInput: function getOriginalInput() {
416
+ return this._originalInput;
417
+ },
418
+ getFormat: function getFormat() {
419
+ return this._format;
420
+ },
421
+ getAlpha: function getAlpha() {
422
+ return this._a;
423
+ },
424
+ getBrightness: function getBrightness() {
425
+ var rgb = this.toRgb();
426
+ return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3;
427
+ },
428
+ getLuminance: function getLuminance() {
429
+ var rgb = this.toRgb();
430
+ var RsRGB, GsRGB, BsRGB, R, G, B;
431
+ RsRGB = rgb.r / 255;
432
+ GsRGB = rgb.g / 255;
433
+ BsRGB = rgb.b / 255;
434
+ if (RsRGB <= 0.03928)
435
+ R = RsRGB / 12.92;
436
+ else
437
+ R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);
438
+ if (GsRGB <= 0.03928)
439
+ G = GsRGB / 12.92;
440
+ else
441
+ G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);
442
+ if (BsRGB <= 0.03928)
443
+ B = BsRGB / 12.92;
444
+ else
445
+ B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);
446
+ return 0.2126 * R + 0.7152 * G + 0.0722 * B;
447
+ },
448
+ setAlpha: function setAlpha(value) {
449
+ this._a = boundAlpha(value);
450
+ this._roundA = Math.round(100 * this._a) / 100;
451
+ return this;
452
+ },
453
+ toHsv: function toHsv() {
454
+ var hsv = rgbToHsv(this._r, this._g, this._b);
455
+ return {
456
+ h: hsv.h * 360,
457
+ s: hsv.s,
458
+ v: hsv.v,
459
+ a: this._a
460
+ };
461
+ },
462
+ toHsvString: function toHsvString() {
463
+ var hsv = rgbToHsv(this._r, this._g, this._b);
464
+ var h = Math.round(hsv.h * 360), s = Math.round(hsv.s * 100), v = Math.round(hsv.v * 100);
465
+ return this._a == 1 ? "hsv(" + h + ", " + s + "%, " + v + "%)" : "hsva(" + h + ", " + s + "%, " + v + "%, " + this._roundA + ")";
466
+ },
467
+ toHsl: function toHsl() {
468
+ var hsl = rgbToHsl(this._r, this._g, this._b);
469
+ return {
470
+ h: hsl.h * 360,
471
+ s: hsl.s,
472
+ l: hsl.l,
473
+ a: this._a
474
+ };
475
+ },
476
+ toHslString: function toHslString() {
477
+ var hsl = rgbToHsl(this._r, this._g, this._b);
478
+ var h = Math.round(hsl.h * 360), s = Math.round(hsl.s * 100), l = Math.round(hsl.l * 100);
479
+ return this._a == 1 ? "hsl(" + h + ", " + s + "%, " + l + "%)" : "hsla(" + h + ", " + s + "%, " + l + "%, " + this._roundA + ")";
480
+ },
481
+ toHex: function toHex(allow3Char) {
482
+ return rgbToHex(this._r, this._g, this._b, allow3Char);
483
+ },
484
+ toHexString: function toHexString(allow3Char) {
485
+ return "#" + this.toHex(allow3Char);
486
+ },
487
+ toHex8: function toHex8(allow4Char) {
488
+ return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);
489
+ },
490
+ toHex8String: function toHex8String(allow4Char) {
491
+ return "#" + this.toHex8(allow4Char);
492
+ },
493
+ toRgb: function toRgb() {
494
+ return {
495
+ r: Math.round(this._r),
496
+ g: Math.round(this._g),
497
+ b: Math.round(this._b),
498
+ a: this._a
499
+ };
500
+ },
501
+ toRgbString: function toRgbString() {
502
+ return this._a == 1 ? "rgb(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ")" : "rgba(" + Math.round(this._r) + ", " + Math.round(this._g) + ", " + Math.round(this._b) + ", " + this._roundA + ")";
503
+ },
504
+ toPercentageRgb: function toPercentageRgb() {
505
+ return {
506
+ r: Math.round(bound01(this._r, 255) * 100) + "%",
507
+ g: Math.round(bound01(this._g, 255) * 100) + "%",
508
+ b: Math.round(bound01(this._b, 255) * 100) + "%",
509
+ a: this._a
510
+ };
511
+ },
512
+ toPercentageRgbString: function toPercentageRgbString() {
513
+ return this._a == 1 ? "rgb(" + Math.round(bound01(this._r, 255) * 100) + "%, " + Math.round(bound01(this._g, 255) * 100) + "%, " + Math.round(bound01(this._b, 255) * 100) + "%)" : "rgba(" + Math.round(bound01(this._r, 255) * 100) + "%, " + Math.round(bound01(this._g, 255) * 100) + "%, " + Math.round(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
514
+ },
515
+ toName: function toName() {
516
+ if (this._a === 0) {
517
+ return "transparent";
518
+ }
519
+ if (this._a < 1) {
520
+ return false;
521
+ }
522
+ return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
523
+ },
524
+ toFilter: function toFilter(secondColor) {
525
+ var hex8String = "#" + rgbaToArgbHex(this._r, this._g, this._b, this._a);
526
+ var secondHex8String = hex8String;
527
+ var gradientType = this._gradientType ? "GradientType = 1, " : "";
528
+ if (secondColor) {
529
+ var s = tinycolor(secondColor);
530
+ secondHex8String = "#" + rgbaToArgbHex(s._r, s._g, s._b, s._a);
531
+ }
532
+ return "progid:DXImageTransform.Microsoft.gradient(" + gradientType + "startColorstr=" + hex8String + ",endColorstr=" + secondHex8String + ")";
533
+ },
534
+ toString: function toString(format) {
535
+ var formatSet = !!format;
536
+ format = format || this._format;
537
+ var formattedString = false;
538
+ var hasAlpha = this._a < 1 && this._a >= 0;
539
+ var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");
540
+ if (needsAlphaFormat) {
541
+ if (format === "name" && this._a === 0) {
542
+ return this.toName();
543
+ }
544
+ return this.toRgbString();
545
+ }
546
+ if (format === "rgb") {
547
+ formattedString = this.toRgbString();
548
+ }
549
+ if (format === "prgb") {
550
+ formattedString = this.toPercentageRgbString();
551
+ }
552
+ if (format === "hex" || format === "hex6") {
553
+ formattedString = this.toHexString();
554
+ }
555
+ if (format === "hex3") {
556
+ formattedString = this.toHexString(true);
557
+ }
558
+ if (format === "hex4") {
559
+ formattedString = this.toHex8String(true);
560
+ }
561
+ if (format === "hex8") {
562
+ formattedString = this.toHex8String();
563
+ }
564
+ if (format === "name") {
565
+ formattedString = this.toName();
566
+ }
567
+ if (format === "hsl") {
568
+ formattedString = this.toHslString();
569
+ }
570
+ if (format === "hsv") {
571
+ formattedString = this.toHsvString();
572
+ }
573
+ return formattedString || this.toHexString();
574
+ },
575
+ clone: function clone() {
576
+ return tinycolor(this.toString());
577
+ },
578
+ _applyModification: function _applyModification(fn, args) {
579
+ var color = fn.apply(null, [this].concat([].slice.call(args)));
580
+ this._r = color._r;
581
+ this._g = color._g;
582
+ this._b = color._b;
583
+ this.setAlpha(color._a);
584
+ return this;
585
+ },
586
+ lighten: function lighten() {
587
+ return this._applyModification(_lighten, arguments);
588
+ },
589
+ brighten: function brighten() {
590
+ return this._applyModification(_brighten, arguments);
591
+ },
592
+ darken: function darken() {
593
+ return this._applyModification(_darken, arguments);
594
+ },
595
+ desaturate: function desaturate() {
596
+ return this._applyModification(_desaturate, arguments);
597
+ },
598
+ saturate: function saturate() {
599
+ return this._applyModification(_saturate, arguments);
600
+ },
601
+ greyscale: function greyscale() {
602
+ return this._applyModification(_greyscale, arguments);
603
+ },
604
+ spin: function spin() {
605
+ return this._applyModification(_spin, arguments);
606
+ },
607
+ _applyCombination: function _applyCombination(fn, args) {
608
+ return fn.apply(null, [this].concat([].slice.call(args)));
609
+ },
610
+ analogous: function analogous() {
611
+ return this._applyCombination(_analogous, arguments);
612
+ },
613
+ complement: function complement() {
614
+ return this._applyCombination(_complement, arguments);
615
+ },
616
+ monochromatic: function monochromatic() {
617
+ return this._applyCombination(_monochromatic, arguments);
618
+ },
619
+ splitcomplement: function splitcomplement() {
620
+ return this._applyCombination(_splitcomplement, arguments);
621
+ },
622
+ // Disabled until https://github.com/bgrins/TinyColor/issues/254
623
+ // polyad: function (number) {
624
+ // return this._applyCombination(polyad, [number]);
625
+ // },
626
+ triad: function triad() {
627
+ return this._applyCombination(polyad, [3]);
628
+ },
629
+ tetrad: function tetrad() {
630
+ return this._applyCombination(polyad, [4]);
631
+ }
632
+ };
633
+ tinycolor.fromRatio = function(color, opts) {
634
+ if (_typeof(color) == "object") {
635
+ var newColor = {};
636
+ for (var i in color) {
637
+ if (color.hasOwnProperty(i)) {
638
+ if (i === "a") {
639
+ newColor[i] = color[i];
640
+ } else {
641
+ newColor[i] = convertToPercentage(color[i]);
642
+ }
643
+ }
644
+ }
645
+ color = newColor;
646
+ }
647
+ return tinycolor(color, opts);
530
648
  };
649
+ function inputToRGB(color) {
650
+ var rgb = {
651
+ r: 0,
652
+ g: 0,
653
+ b: 0
654
+ };
655
+ var a = 1;
656
+ var s = null;
657
+ var v = null;
658
+ var l = null;
659
+ var ok = false;
660
+ var format = false;
661
+ if (typeof color == "string") {
662
+ color = stringInputToObject(color);
663
+ }
664
+ if (_typeof(color) == "object") {
665
+ if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
666
+ rgb = rgbToRgb(color.r, color.g, color.b);
667
+ ok = true;
668
+ format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
669
+ } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
670
+ s = convertToPercentage(color.s);
671
+ v = convertToPercentage(color.v);
672
+ rgb = hsvToRgb(color.h, s, v);
673
+ ok = true;
674
+ format = "hsv";
675
+ } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
676
+ s = convertToPercentage(color.s);
677
+ l = convertToPercentage(color.l);
678
+ rgb = hslToRgb(color.h, s, l);
679
+ ok = true;
680
+ format = "hsl";
681
+ }
682
+ if (color.hasOwnProperty("a")) {
683
+ a = color.a;
684
+ }
685
+ }
686
+ a = boundAlpha(a);
687
+ return {
688
+ ok,
689
+ format: color.format || format,
690
+ r: Math.min(255, Math.max(rgb.r, 0)),
691
+ g: Math.min(255, Math.max(rgb.g, 0)),
692
+ b: Math.min(255, Math.max(rgb.b, 0)),
693
+ a
694
+ };
695
+ }
696
+ function rgbToRgb(r, g, b) {
697
+ return {
698
+ r: bound01(r, 255) * 255,
699
+ g: bound01(g, 255) * 255,
700
+ b: bound01(b, 255) * 255
701
+ };
702
+ }
703
+ function rgbToHsl(r, g, b) {
704
+ r = bound01(r, 255);
705
+ g = bound01(g, 255);
706
+ b = bound01(b, 255);
707
+ var max = Math.max(r, g, b), min = Math.min(r, g, b);
708
+ var h, s, l = (max + min) / 2;
709
+ if (max == min) {
710
+ h = s = 0;
711
+ } else {
712
+ var d = max - min;
713
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
714
+ switch (max) {
715
+ case r:
716
+ h = (g - b) / d + (g < b ? 6 : 0);
717
+ break;
718
+ case g:
719
+ h = (b - r) / d + 2;
720
+ break;
721
+ case b:
722
+ h = (r - g) / d + 4;
723
+ break;
724
+ }
725
+ h /= 6;
726
+ }
727
+ return {
728
+ h,
729
+ s,
730
+ l
731
+ };
732
+ }
733
+ function hslToRgb(h, s, l) {
734
+ var r, g, b;
735
+ h = bound01(h, 360);
736
+ s = bound01(s, 100);
737
+ l = bound01(l, 100);
738
+ function hue2rgb(p2, q2, t) {
739
+ if (t < 0)
740
+ t += 1;
741
+ if (t > 1)
742
+ t -= 1;
743
+ if (t < 1 / 6)
744
+ return p2 + (q2 - p2) * 6 * t;
745
+ if (t < 1 / 2)
746
+ return q2;
747
+ if (t < 2 / 3)
748
+ return p2 + (q2 - p2) * (2 / 3 - t) * 6;
749
+ return p2;
750
+ }
751
+ if (s === 0) {
752
+ r = g = b = l;
753
+ } else {
754
+ var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
755
+ var p = 2 * l - q;
756
+ r = hue2rgb(p, q, h + 1 / 3);
757
+ g = hue2rgb(p, q, h);
758
+ b = hue2rgb(p, q, h - 1 / 3);
759
+ }
760
+ return {
761
+ r: r * 255,
762
+ g: g * 255,
763
+ b: b * 255
764
+ };
765
+ }
766
+ function rgbToHsv(r, g, b) {
767
+ r = bound01(r, 255);
768
+ g = bound01(g, 255);
769
+ b = bound01(b, 255);
770
+ var max = Math.max(r, g, b), min = Math.min(r, g, b);
771
+ var h, s, v = max;
772
+ var d = max - min;
773
+ s = max === 0 ? 0 : d / max;
774
+ if (max == min) {
775
+ h = 0;
776
+ } else {
777
+ switch (max) {
778
+ case r:
779
+ h = (g - b) / d + (g < b ? 6 : 0);
780
+ break;
781
+ case g:
782
+ h = (b - r) / d + 2;
783
+ break;
784
+ case b:
785
+ h = (r - g) / d + 4;
786
+ break;
787
+ }
788
+ h /= 6;
789
+ }
790
+ return {
791
+ h,
792
+ s,
793
+ v
794
+ };
795
+ }
796
+ function hsvToRgb(h, s, v) {
797
+ h = bound01(h, 360) * 6;
798
+ s = bound01(s, 100);
799
+ v = bound01(v, 100);
800
+ var i = Math.floor(h), f = h - i, p = v * (1 - s), q = v * (1 - f * s), t = v * (1 - (1 - f) * s), mod = i % 6, r = [v, q, p, p, t, v][mod], g = [t, v, v, q, p, p][mod], b = [p, p, t, v, v, q][mod];
801
+ return {
802
+ r: r * 255,
803
+ g: g * 255,
804
+ b: b * 255
805
+ };
806
+ }
807
+ function rgbToHex(r, g, b, allow3Char) {
808
+ var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];
809
+ if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
810
+ return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
811
+ }
812
+ return hex.join("");
813
+ }
814
+ function rgbaToHex(r, g, b, a, allow4Char) {
815
+ var hex = [pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16)), pad2(convertDecimalToHex(a))];
816
+ if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
817
+ return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
818
+ }
819
+ return hex.join("");
820
+ }
821
+ function rgbaToArgbHex(r, g, b, a) {
822
+ var hex = [pad2(convertDecimalToHex(a)), pad2(Math.round(r).toString(16)), pad2(Math.round(g).toString(16)), pad2(Math.round(b).toString(16))];
823
+ return hex.join("");
824
+ }
825
+ tinycolor.equals = function(color1, color2) {
826
+ if (!color1 || !color2)
827
+ return false;
828
+ return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
829
+ };
830
+ tinycolor.random = function() {
831
+ return tinycolor.fromRatio({
832
+ r: Math.random(),
833
+ g: Math.random(),
834
+ b: Math.random()
835
+ });
836
+ };
837
+ function _desaturate(color, amount) {
838
+ amount = amount === 0 ? 0 : amount || 10;
839
+ var hsl = tinycolor(color).toHsl();
840
+ hsl.s -= amount / 100;
841
+ hsl.s = clamp01(hsl.s);
842
+ return tinycolor(hsl);
843
+ }
844
+ function _saturate(color, amount) {
845
+ amount = amount === 0 ? 0 : amount || 10;
846
+ var hsl = tinycolor(color).toHsl();
847
+ hsl.s += amount / 100;
848
+ hsl.s = clamp01(hsl.s);
849
+ return tinycolor(hsl);
850
+ }
851
+ function _greyscale(color) {
852
+ return tinycolor(color).desaturate(100);
853
+ }
854
+ function _lighten(color, amount) {
855
+ amount = amount === 0 ? 0 : amount || 10;
856
+ var hsl = tinycolor(color).toHsl();
857
+ hsl.l += amount / 100;
858
+ hsl.l = clamp01(hsl.l);
859
+ return tinycolor(hsl);
860
+ }
861
+ function _brighten(color, amount) {
862
+ amount = amount === 0 ? 0 : amount || 10;
863
+ var rgb = tinycolor(color).toRgb();
864
+ rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));
865
+ rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));
866
+ rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));
867
+ return tinycolor(rgb);
868
+ }
869
+ function _darken(color, amount) {
870
+ amount = amount === 0 ? 0 : amount || 10;
871
+ var hsl = tinycolor(color).toHsl();
872
+ hsl.l -= amount / 100;
873
+ hsl.l = clamp01(hsl.l);
874
+ return tinycolor(hsl);
875
+ }
876
+ function _spin(color, amount) {
877
+ var hsl = tinycolor(color).toHsl();
878
+ var hue = (hsl.h + amount) % 360;
879
+ hsl.h = hue < 0 ? 360 + hue : hue;
880
+ return tinycolor(hsl);
881
+ }
882
+ function _complement(color) {
883
+ var hsl = tinycolor(color).toHsl();
884
+ hsl.h = (hsl.h + 180) % 360;
885
+ return tinycolor(hsl);
886
+ }
887
+ function polyad(color, number) {
888
+ if (isNaN(number) || number <= 0) {
889
+ throw new Error("Argument to polyad must be a positive number");
890
+ }
891
+ var hsl = tinycolor(color).toHsl();
892
+ var result = [tinycolor(color)];
893
+ var step = 360 / number;
894
+ for (var i = 1; i < number; i++) {
895
+ result.push(tinycolor({
896
+ h: (hsl.h + i * step) % 360,
897
+ s: hsl.s,
898
+ l: hsl.l
899
+ }));
900
+ }
901
+ return result;
902
+ }
903
+ function _splitcomplement(color) {
904
+ var hsl = tinycolor(color).toHsl();
905
+ var h = hsl.h;
906
+ return [tinycolor(color), tinycolor({
907
+ h: (h + 72) % 360,
908
+ s: hsl.s,
909
+ l: hsl.l
910
+ }), tinycolor({
911
+ h: (h + 216) % 360,
912
+ s: hsl.s,
913
+ l: hsl.l
914
+ })];
915
+ }
916
+ function _analogous(color, results, slices) {
917
+ results = results || 6;
918
+ slices = slices || 30;
919
+ var hsl = tinycolor(color).toHsl();
920
+ var part = 360 / slices;
921
+ var ret = [tinycolor(color)];
922
+ for (hsl.h = (hsl.h - (part * results >> 1) + 720) % 360; --results; ) {
923
+ hsl.h = (hsl.h + part) % 360;
924
+ ret.push(tinycolor(hsl));
925
+ }
926
+ return ret;
927
+ }
928
+ function _monochromatic(color, results) {
929
+ results = results || 6;
930
+ var hsv = tinycolor(color).toHsv();
931
+ var h = hsv.h, s = hsv.s, v = hsv.v;
932
+ var ret = [];
933
+ var modification = 1 / results;
934
+ while (results--) {
935
+ ret.push(tinycolor({
936
+ h,
937
+ s,
938
+ v
939
+ }));
940
+ v = (v + modification) % 1;
941
+ }
942
+ return ret;
943
+ }
944
+ tinycolor.mix = function(color1, color2, amount) {
945
+ amount = amount === 0 ? 0 : amount || 50;
946
+ var rgb1 = tinycolor(color1).toRgb();
947
+ var rgb2 = tinycolor(color2).toRgb();
948
+ var p = amount / 100;
949
+ var rgba = {
950
+ r: (rgb2.r - rgb1.r) * p + rgb1.r,
951
+ g: (rgb2.g - rgb1.g) * p + rgb1.g,
952
+ b: (rgb2.b - rgb1.b) * p + rgb1.b,
953
+ a: (rgb2.a - rgb1.a) * p + rgb1.a
954
+ };
955
+ return tinycolor(rgba);
956
+ };
957
+ tinycolor.readability = function(color1, color2) {
958
+ var c1 = tinycolor(color1);
959
+ var c2 = tinycolor(color2);
960
+ return (Math.max(c1.getLuminance(), c2.getLuminance()) + 0.05) / (Math.min(c1.getLuminance(), c2.getLuminance()) + 0.05);
961
+ };
962
+ tinycolor.isReadable = function(color1, color2, wcag2) {
963
+ var readability = tinycolor.readability(color1, color2);
964
+ var wcag2Parms, out;
965
+ out = false;
966
+ wcag2Parms = validateWCAG2Parms(wcag2);
967
+ switch (wcag2Parms.level + wcag2Parms.size) {
968
+ case "AAsmall":
969
+ case "AAAlarge":
970
+ out = readability >= 4.5;
971
+ break;
972
+ case "AAlarge":
973
+ out = readability >= 3;
974
+ break;
975
+ case "AAAsmall":
976
+ out = readability >= 7;
977
+ break;
978
+ }
979
+ return out;
980
+ };
981
+ tinycolor.mostReadable = function(baseColor, colorList, args) {
982
+ var bestColor = null;
983
+ var bestScore = 0;
984
+ var readability;
985
+ var includeFallbackColors, level, size;
986
+ args = args || {};
987
+ includeFallbackColors = args.includeFallbackColors;
988
+ level = args.level;
989
+ size = args.size;
990
+ for (var i = 0; i < colorList.length; i++) {
991
+ readability = tinycolor.readability(baseColor, colorList[i]);
992
+ if (readability > bestScore) {
993
+ bestScore = readability;
994
+ bestColor = tinycolor(colorList[i]);
995
+ }
996
+ }
997
+ if (tinycolor.isReadable(baseColor, bestColor, {
998
+ level,
999
+ size
1000
+ }) || !includeFallbackColors) {
1001
+ return bestColor;
1002
+ } else {
1003
+ args.includeFallbackColors = false;
1004
+ return tinycolor.mostReadable(baseColor, ["#fff", "#000"], args);
1005
+ }
1006
+ };
1007
+ var names = tinycolor.names = {
1008
+ aliceblue: "f0f8ff",
1009
+ antiquewhite: "faebd7",
1010
+ aqua: "0ff",
1011
+ aquamarine: "7fffd4",
1012
+ azure: "f0ffff",
1013
+ beige: "f5f5dc",
1014
+ bisque: "ffe4c4",
1015
+ black: "000",
1016
+ blanchedalmond: "ffebcd",
1017
+ blue: "00f",
1018
+ blueviolet: "8a2be2",
1019
+ brown: "a52a2a",
1020
+ burlywood: "deb887",
1021
+ burntsienna: "ea7e5d",
1022
+ cadetblue: "5f9ea0",
1023
+ chartreuse: "7fff00",
1024
+ chocolate: "d2691e",
1025
+ coral: "ff7f50",
1026
+ cornflowerblue: "6495ed",
1027
+ cornsilk: "fff8dc",
1028
+ crimson: "dc143c",
1029
+ cyan: "0ff",
1030
+ darkblue: "00008b",
1031
+ darkcyan: "008b8b",
1032
+ darkgoldenrod: "b8860b",
1033
+ darkgray: "a9a9a9",
1034
+ darkgreen: "006400",
1035
+ darkgrey: "a9a9a9",
1036
+ darkkhaki: "bdb76b",
1037
+ darkmagenta: "8b008b",
1038
+ darkolivegreen: "556b2f",
1039
+ darkorange: "ff8c00",
1040
+ darkorchid: "9932cc",
1041
+ darkred: "8b0000",
1042
+ darksalmon: "e9967a",
1043
+ darkseagreen: "8fbc8f",
1044
+ darkslateblue: "483d8b",
1045
+ darkslategray: "2f4f4f",
1046
+ darkslategrey: "2f4f4f",
1047
+ darkturquoise: "00ced1",
1048
+ darkviolet: "9400d3",
1049
+ deeppink: "ff1493",
1050
+ deepskyblue: "00bfff",
1051
+ dimgray: "696969",
1052
+ dimgrey: "696969",
1053
+ dodgerblue: "1e90ff",
1054
+ firebrick: "b22222",
1055
+ floralwhite: "fffaf0",
1056
+ forestgreen: "228b22",
1057
+ fuchsia: "f0f",
1058
+ gainsboro: "dcdcdc",
1059
+ ghostwhite: "f8f8ff",
1060
+ gold: "ffd700",
1061
+ goldenrod: "daa520",
1062
+ gray: "808080",
1063
+ green: "008000",
1064
+ greenyellow: "adff2f",
1065
+ grey: "808080",
1066
+ honeydew: "f0fff0",
1067
+ hotpink: "ff69b4",
1068
+ indianred: "cd5c5c",
1069
+ indigo: "4b0082",
1070
+ ivory: "fffff0",
1071
+ khaki: "f0e68c",
1072
+ lavender: "e6e6fa",
1073
+ lavenderblush: "fff0f5",
1074
+ lawngreen: "7cfc00",
1075
+ lemonchiffon: "fffacd",
1076
+ lightblue: "add8e6",
1077
+ lightcoral: "f08080",
1078
+ lightcyan: "e0ffff",
1079
+ lightgoldenrodyellow: "fafad2",
1080
+ lightgray: "d3d3d3",
1081
+ lightgreen: "90ee90",
1082
+ lightgrey: "d3d3d3",
1083
+ lightpink: "ffb6c1",
1084
+ lightsalmon: "ffa07a",
1085
+ lightseagreen: "20b2aa",
1086
+ lightskyblue: "87cefa",
1087
+ lightslategray: "789",
1088
+ lightslategrey: "789",
1089
+ lightsteelblue: "b0c4de",
1090
+ lightyellow: "ffffe0",
1091
+ lime: "0f0",
1092
+ limegreen: "32cd32",
1093
+ linen: "faf0e6",
1094
+ magenta: "f0f",
1095
+ maroon: "800000",
1096
+ mediumaquamarine: "66cdaa",
1097
+ mediumblue: "0000cd",
1098
+ mediumorchid: "ba55d3",
1099
+ mediumpurple: "9370db",
1100
+ mediumseagreen: "3cb371",
1101
+ mediumslateblue: "7b68ee",
1102
+ mediumspringgreen: "00fa9a",
1103
+ mediumturquoise: "48d1cc",
1104
+ mediumvioletred: "c71585",
1105
+ midnightblue: "191970",
1106
+ mintcream: "f5fffa",
1107
+ mistyrose: "ffe4e1",
1108
+ moccasin: "ffe4b5",
1109
+ navajowhite: "ffdead",
1110
+ navy: "000080",
1111
+ oldlace: "fdf5e6",
1112
+ olive: "808000",
1113
+ olivedrab: "6b8e23",
1114
+ orange: "ffa500",
1115
+ orangered: "ff4500",
1116
+ orchid: "da70d6",
1117
+ palegoldenrod: "eee8aa",
1118
+ palegreen: "98fb98",
1119
+ paleturquoise: "afeeee",
1120
+ palevioletred: "db7093",
1121
+ papayawhip: "ffefd5",
1122
+ peachpuff: "ffdab9",
1123
+ peru: "cd853f",
1124
+ pink: "ffc0cb",
1125
+ plum: "dda0dd",
1126
+ powderblue: "b0e0e6",
1127
+ purple: "800080",
1128
+ rebeccapurple: "663399",
1129
+ red: "f00",
1130
+ rosybrown: "bc8f8f",
1131
+ royalblue: "4169e1",
1132
+ saddlebrown: "8b4513",
1133
+ salmon: "fa8072",
1134
+ sandybrown: "f4a460",
1135
+ seagreen: "2e8b57",
1136
+ seashell: "fff5ee",
1137
+ sienna: "a0522d",
1138
+ silver: "c0c0c0",
1139
+ skyblue: "87ceeb",
1140
+ slateblue: "6a5acd",
1141
+ slategray: "708090",
1142
+ slategrey: "708090",
1143
+ snow: "fffafa",
1144
+ springgreen: "00ff7f",
1145
+ steelblue: "4682b4",
1146
+ tan: "d2b48c",
1147
+ teal: "008080",
1148
+ thistle: "d8bfd8",
1149
+ tomato: "ff6347",
1150
+ turquoise: "40e0d0",
1151
+ violet: "ee82ee",
1152
+ wheat: "f5deb3",
1153
+ white: "fff",
1154
+ whitesmoke: "f5f5f5",
1155
+ yellow: "ff0",
1156
+ yellowgreen: "9acd32"
1157
+ };
1158
+ var hexNames = tinycolor.hexNames = flip(names);
1159
+ function flip(o) {
1160
+ var flipped = {};
1161
+ for (var i in o) {
1162
+ if (o.hasOwnProperty(i)) {
1163
+ flipped[o[i]] = i;
1164
+ }
1165
+ }
1166
+ return flipped;
1167
+ }
1168
+ function boundAlpha(a) {
1169
+ a = parseFloat(a);
1170
+ if (isNaN(a) || a < 0 || a > 1) {
1171
+ a = 1;
1172
+ }
1173
+ return a;
1174
+ }
1175
+ function bound01(n, max) {
1176
+ if (isOnePointZero(n))
1177
+ n = "100%";
1178
+ var processPercent = isPercentage(n);
1179
+ n = Math.min(max, Math.max(0, parseFloat(n)));
1180
+ if (processPercent) {
1181
+ n = parseInt(n * max, 10) / 100;
1182
+ }
1183
+ if (Math.abs(n - max) < 1e-6) {
1184
+ return 1;
1185
+ }
1186
+ return n % max / parseFloat(max);
1187
+ }
1188
+ function clamp01(val) {
1189
+ return Math.min(1, Math.max(0, val));
1190
+ }
1191
+ function parseIntFromHex(val) {
1192
+ return parseInt(val, 16);
1193
+ }
1194
+ function isOnePointZero(n) {
1195
+ return typeof n == "string" && n.indexOf(".") != -1 && parseFloat(n) === 1;
1196
+ }
1197
+ function isPercentage(n) {
1198
+ return typeof n === "string" && n.indexOf("%") != -1;
1199
+ }
1200
+ function pad2(c) {
1201
+ return c.length == 1 ? "0" + c : "" + c;
1202
+ }
1203
+ function convertToPercentage(n) {
1204
+ if (n <= 1) {
1205
+ n = n * 100 + "%";
1206
+ }
1207
+ return n;
1208
+ }
1209
+ function convertDecimalToHex(d) {
1210
+ return Math.round(parseFloat(d) * 255).toString(16);
1211
+ }
1212
+ function convertHexToDecimal(h) {
1213
+ return parseIntFromHex(h) / 255;
1214
+ }
1215
+ var matchers = function() {
1216
+ var CSS_INTEGER = "[-\\+]?\\d+%?";
1217
+ var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
1218
+ var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
1219
+ var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
1220
+ var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
1221
+ return {
1222
+ CSS_UNIT: new RegExp(CSS_UNIT),
1223
+ rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
1224
+ rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
1225
+ hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
1226
+ hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
1227
+ hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
1228
+ hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
1229
+ hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
1230
+ hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
1231
+ hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
1232
+ hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
1233
+ };
1234
+ }();
1235
+ function isValidCSSUnit(color) {
1236
+ return !!matchers.CSS_UNIT.exec(color);
1237
+ }
1238
+ function stringInputToObject(color) {
1239
+ color = color.replace(trimLeft, "").replace(trimRight, "").toLowerCase();
1240
+ var named = false;
1241
+ if (names[color]) {
1242
+ color = names[color];
1243
+ named = true;
1244
+ } else if (color == "transparent") {
1245
+ return {
1246
+ r: 0,
1247
+ g: 0,
1248
+ b: 0,
1249
+ a: 0,
1250
+ format: "name"
1251
+ };
1252
+ }
1253
+ var match;
1254
+ if (match = matchers.rgb.exec(color)) {
1255
+ return {
1256
+ r: match[1],
1257
+ g: match[2],
1258
+ b: match[3]
1259
+ };
1260
+ }
1261
+ if (match = matchers.rgba.exec(color)) {
1262
+ return {
1263
+ r: match[1],
1264
+ g: match[2],
1265
+ b: match[3],
1266
+ a: match[4]
1267
+ };
1268
+ }
1269
+ if (match = matchers.hsl.exec(color)) {
1270
+ return {
1271
+ h: match[1],
1272
+ s: match[2],
1273
+ l: match[3]
1274
+ };
1275
+ }
1276
+ if (match = matchers.hsla.exec(color)) {
1277
+ return {
1278
+ h: match[1],
1279
+ s: match[2],
1280
+ l: match[3],
1281
+ a: match[4]
1282
+ };
1283
+ }
1284
+ if (match = matchers.hsv.exec(color)) {
1285
+ return {
1286
+ h: match[1],
1287
+ s: match[2],
1288
+ v: match[3]
1289
+ };
1290
+ }
1291
+ if (match = matchers.hsva.exec(color)) {
1292
+ return {
1293
+ h: match[1],
1294
+ s: match[2],
1295
+ v: match[3],
1296
+ a: match[4]
1297
+ };
1298
+ }
1299
+ if (match = matchers.hex8.exec(color)) {
1300
+ return {
1301
+ r: parseIntFromHex(match[1]),
1302
+ g: parseIntFromHex(match[2]),
1303
+ b: parseIntFromHex(match[3]),
1304
+ a: convertHexToDecimal(match[4]),
1305
+ format: named ? "name" : "hex8"
1306
+ };
1307
+ }
1308
+ if (match = matchers.hex6.exec(color)) {
1309
+ return {
1310
+ r: parseIntFromHex(match[1]),
1311
+ g: parseIntFromHex(match[2]),
1312
+ b: parseIntFromHex(match[3]),
1313
+ format: named ? "name" : "hex"
1314
+ };
1315
+ }
1316
+ if (match = matchers.hex4.exec(color)) {
1317
+ return {
1318
+ r: parseIntFromHex(match[1] + "" + match[1]),
1319
+ g: parseIntFromHex(match[2] + "" + match[2]),
1320
+ b: parseIntFromHex(match[3] + "" + match[3]),
1321
+ a: convertHexToDecimal(match[4] + "" + match[4]),
1322
+ format: named ? "name" : "hex8"
1323
+ };
1324
+ }
1325
+ if (match = matchers.hex3.exec(color)) {
1326
+ return {
1327
+ r: parseIntFromHex(match[1] + "" + match[1]),
1328
+ g: parseIntFromHex(match[2] + "" + match[2]),
1329
+ b: parseIntFromHex(match[3] + "" + match[3]),
1330
+ format: named ? "name" : "hex"
1331
+ };
1332
+ }
1333
+ return false;
1334
+ }
1335
+ function validateWCAG2Parms(parms) {
1336
+ var level, size;
1337
+ parms = parms || {
1338
+ level: "AA",
1339
+ size: "small"
1340
+ };
1341
+ level = (parms.level || "AA").toUpperCase();
1342
+ size = (parms.size || "small").toLowerCase();
1343
+ if (level !== "AA" && level !== "AAA") {
1344
+ level = "AA";
1345
+ }
1346
+ if (size !== "small" && size !== "large") {
1347
+ size = "small";
1348
+ }
1349
+ return {
1350
+ level,
1351
+ size
1352
+ };
1353
+ }
531
1354
 
532
1355
  // src/colors.ts
533
- var COLOR_OUTLINE_CONTRAST_THRESHOLD = 240;
1356
+ import { clamp } from "@excalidraw/math";
1357
+ import { degreesToRadians } from "@excalidraw/math";
1358
+ var DARK_MODE_COLORS_CACHE = typeof window !== "undefined" ? /* @__PURE__ */ new Map() : null;
1359
+ function cssHueRotate(red, green, blue, degrees) {
1360
+ const r = red / 255;
1361
+ const g = green / 255;
1362
+ const b = blue / 255;
1363
+ const a = degreesToRadians(degrees);
1364
+ const c = Math.cos(a);
1365
+ const s = Math.sin(a);
1366
+ const matrix = [
1367
+ 0.213 + c * 0.787 - s * 0.213,
1368
+ 0.715 - c * 0.715 - s * 0.715,
1369
+ 0.072 - c * 0.072 + s * 0.928,
1370
+ 0.213 - c * 0.213 + s * 0.143,
1371
+ 0.715 + c * 0.285 + s * 0.14,
1372
+ 0.072 - c * 0.072 - s * 0.283,
1373
+ 0.213 - c * 0.213 - s * 0.787,
1374
+ 0.715 - c * 0.715 + s * 0.715,
1375
+ 0.072 + c * 0.928 + s * 0.072
1376
+ ];
1377
+ const newR = r * matrix[0] + g * matrix[1] + b * matrix[2];
1378
+ const newG = r * matrix[3] + g * matrix[4] + b * matrix[5];
1379
+ const newB = r * matrix[6] + g * matrix[7] + b * matrix[8];
1380
+ return {
1381
+ r: Math.round(Math.max(0, Math.min(1, newR)) * 255),
1382
+ g: Math.round(Math.max(0, Math.min(1, newG)) * 255),
1383
+ b: Math.round(Math.max(0, Math.min(1, newB)) * 255)
1384
+ };
1385
+ }
1386
+ var cssInvert = (r, g, b, percent) => {
1387
+ const p = clamp(percent, 0, 100) / 100;
1388
+ const invertComponent = (color) => {
1389
+ const inverted = color * (1 - p) + (255 - color) * p;
1390
+ return Math.round(clamp(inverted, 0, 255));
1391
+ };
1392
+ const invertedR = invertComponent(r);
1393
+ const invertedG = invertComponent(g);
1394
+ const invertedB = invertComponent(b);
1395
+ return { r: invertedR, g: invertedG, b: invertedB };
1396
+ };
1397
+ var applyDarkModeFilter = (color, enable = true) => {
1398
+ if (!enable) {
1399
+ return color;
1400
+ }
1401
+ const cached = DARK_MODE_COLORS_CACHE?.get(color);
1402
+ if (cached) {
1403
+ return cached;
1404
+ }
1405
+ const tc = tinycolor(color);
1406
+ const alpha = tc.getAlpha();
1407
+ const rgb = tc.toRgb();
1408
+ const inverted = cssInvert(rgb.r, rgb.g, rgb.b, 93);
1409
+ const rotated = cssHueRotate(
1410
+ inverted.r,
1411
+ inverted.g,
1412
+ inverted.b,
1413
+ 180
1414
+ );
1415
+ const result = rgbToHex2(rotated.r, rotated.g, rotated.b, alpha);
1416
+ if (DARK_MODE_COLORS_CACHE) {
1417
+ DARK_MODE_COLORS_CACHE.set(color, result);
1418
+ }
1419
+ return result;
1420
+ };
534
1421
  var pick = (source, keys) => {
535
1422
  return keys.reduce((acc, key) => {
536
1423
  if (key in source) {
@@ -544,28 +1431,24 @@ var COLORS_PER_ROW = 5;
544
1431
  var DEFAULT_CHART_COLOR_INDEX = 4;
545
1432
  var DEFAULT_ELEMENT_STROKE_COLOR_INDEX = 4;
546
1433
  var DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX = 1;
547
- var ELEMENTS_PALETTE_SHADE_INDEXES = [0, 2, 4, 6, 8];
548
- var CANVAS_PALETTE_SHADE_INDEXES = [0, 1, 2, 3, 4];
549
- var getSpecificColorShades = (color, indexArr) => {
550
- return indexArr.map((index) => open_color_default[color][index]);
551
- };
552
1434
  var COLOR_PALETTE = {
553
1435
  transparent: "transparent",
554
1436
  black: "#1e1e1e",
555
1437
  white: "#ffffff",
556
- // open-colors
557
- gray: getSpecificColorShades("gray", ELEMENTS_PALETTE_SHADE_INDEXES),
558
- red: getSpecificColorShades("red", ELEMENTS_PALETTE_SHADE_INDEXES),
559
- pink: getSpecificColorShades("pink", ELEMENTS_PALETTE_SHADE_INDEXES),
560
- grape: getSpecificColorShades("grape", ELEMENTS_PALETTE_SHADE_INDEXES),
561
- violet: getSpecificColorShades("violet", ELEMENTS_PALETTE_SHADE_INDEXES),
562
- blue: getSpecificColorShades("blue", ELEMENTS_PALETTE_SHADE_INDEXES),
563
- cyan: getSpecificColorShades("cyan", ELEMENTS_PALETTE_SHADE_INDEXES),
564
- teal: getSpecificColorShades("teal", ELEMENTS_PALETTE_SHADE_INDEXES),
565
- green: getSpecificColorShades("green", ELEMENTS_PALETTE_SHADE_INDEXES),
566
- yellow: getSpecificColorShades("yellow", ELEMENTS_PALETTE_SHADE_INDEXES),
567
- orange: getSpecificColorShades("orange", ELEMENTS_PALETTE_SHADE_INDEXES),
568
- // radix bronze shades 3,5,7,9,11
1438
+ // open-color from https://github.com/yeun/open-color/blob/master/open-color.js
1439
+ // corresponds to indexes [0,2,4,6,8] (weights: 50, 200, 400, 600, 800)
1440
+ gray: ["#f8f9fa", "#e9ecef", "#ced4da", "#868e96", "#343a40"],
1441
+ red: ["#fff5f5", "#ffc9c9", "#ff8787", "#fa5252", "#e03131"],
1442
+ pink: ["#fff0f6", "#fcc2d7", "#f783ac", "#e64980", "#c2255c"],
1443
+ grape: ["#f8f0fc", "#eebefa", "#da77f2", "#be4bdb", "#9c36b5"],
1444
+ violet: ["#f3f0ff", "#d0bfff", "#9775fa", "#7950f2", "#6741d9"],
1445
+ blue: ["#e7f5ff", "#a5d8ff", "#4dabf7", "#228be6", "#1971c2"],
1446
+ cyan: ["#e3fafc", "#99e9f2", "#3bc9db", "#15aabf", "#0c8599"],
1447
+ teal: ["#e6fcf5", "#96f2d7", "#38d9a9", "#12b886", "#099268"],
1448
+ green: ["#ebfbee", "#b2f2bb", "#69db7c", "#40c057", "#2f9e44"],
1449
+ yellow: ["#fff9db", "#ffec99", "#ffd43b", "#fab005", "#f08c00"],
1450
+ orange: ["#fff4e6", "#ffd8a8", "#ffa94d", "#fd7e14", "#e8590c"],
1451
+ // radix bronze shades [3,5,7,9,11]
569
1452
  bronze: ["#f8f1ee", "#eaddd7", "#d2bab0", "#a18072", "#846358"]
570
1453
  };
571
1454
  var COMMON_ELEMENT_SHADES = pick(COLOR_PALETTE, [
@@ -594,6 +1477,13 @@ var DEFAULT_ELEMENT_BACKGROUND_PICKS = [
594
1477
  COLOR_PALETTE.blue[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX],
595
1478
  COLOR_PALETTE.yellow[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX]
596
1479
  ];
1480
+ var BUCKET_FILL_BACKGROUND_PICKS = [
1481
+ COLOR_PALETTE.white,
1482
+ COLOR_PALETTE.red[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX],
1483
+ COLOR_PALETTE.green[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX],
1484
+ COLOR_PALETTE.blue[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX],
1485
+ COLOR_PALETTE.yellow[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX]
1486
+ ];
597
1487
  var DEFAULT_CANVAS_BACKGROUND_PICKS = [
598
1488
  COLOR_PALETTE.white,
599
1489
  // radix slate2
@@ -623,6 +1513,7 @@ var DEFAULT_ELEMENT_BACKGROUND_COLOR_PALETTE = {
623
1513
  bronze: COLOR_PALETTE.bronze,
624
1514
  ...COMMON_ELEMENT_SHADES
625
1515
  };
1516
+ var getBucketFillBackgroundColor = (backgroundColor) => isTransparent(backgroundColor) ? COLOR_PALETTE.green[DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX] : backgroundColor;
626
1517
  var getAllColorsSpecificShade = (index) => [
627
1518
  // 2nd row
628
1519
  COLOR_PALETTE.cyan[index],
@@ -637,22 +1528,64 @@ var getAllColorsSpecificShade = (index) => [
637
1528
  COLOR_PALETTE.orange[index],
638
1529
  COLOR_PALETTE.red[index]
639
1530
  ];
640
- var rgbToHex = (r, g, b) => `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
1531
+ var rgbToHex2 = (r, g, b, a) => {
1532
+ const hex6 = `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
1533
+ if (a !== void 0 && a < 1) {
1534
+ const alphaHex = Math.round(a * 255).toString(16).padStart(2, "0");
1535
+ return `${hex6}${alphaHex}`;
1536
+ }
1537
+ return hex6;
1538
+ };
1539
+ var colorToHex = (color) => {
1540
+ const tc = tinycolor(color);
1541
+ if (!tc.isValid()) {
1542
+ return null;
1543
+ }
1544
+ const { r, g, b, a } = tc.toRgb();
1545
+ return rgbToHex2(r, g, b, a);
1546
+ };
1547
+ var isTransparent = (color) => {
1548
+ return tinycolor(color).getAlpha() === 0;
1549
+ };
1550
+ var isOpaqueColor = (color) => {
1551
+ return tinycolor(color).getAlpha() === 1;
1552
+ };
1553
+ var COLOR_OUTLINE_CONTRAST_THRESHOLD = 240;
1554
+ var calculateContrast = (r, g, b) => {
1555
+ const yiq = (r * 299 + g * 587 + b * 114) / 1e3;
1556
+ return yiq;
1557
+ };
1558
+ var isColorDark = (color, threshold = 160) => {
1559
+ if (!color) {
1560
+ return true;
1561
+ }
1562
+ if (isTransparent(color)) {
1563
+ return false;
1564
+ }
1565
+ const tc = tinycolor(color);
1566
+ if (!tc.isValid()) {
1567
+ return true;
1568
+ }
1569
+ const { r, g, b } = tc.toRgb();
1570
+ return calculateContrast(r, g, b) < threshold;
1571
+ };
1572
+ var normalizeInputColor = (color) => {
1573
+ color = color.trim();
1574
+ if (isTransparent(color)) {
1575
+ return color;
1576
+ }
1577
+ const tc = tinycolor(color);
1578
+ if (tc.isValid()) {
1579
+ if (["hex", "hex8"].includes(tc.getFormat()) && !color.startsWith("#")) {
1580
+ return `#${color}`;
1581
+ }
1582
+ return color;
1583
+ }
1584
+ return null;
1585
+ };
641
1586
 
642
1587
  // src/constants.ts
643
1588
  init_define_import_meta_env();
644
- var isDarwin = /Mac|iPod|iPhone|iPad/.test(navigator.platform);
645
- var isWindows = /^Win/.test(navigator.platform);
646
- var isAndroid = /\b(android)\b/i.test(navigator.userAgent);
647
- var isFirefox = typeof window !== "undefined" && "netscape" in window && navigator.userAgent.indexOf("rv:") > 1 && navigator.userAgent.indexOf("Gecko") > 1;
648
- var isChrome = navigator.userAgent.indexOf("Chrome") !== -1;
649
- var isSafari = !isChrome && navigator.userAgent.indexOf("Safari") !== -1;
650
- var isIOS = /iPad|iPhone/i.test(navigator.platform) || // iPadOS 13+
651
- navigator.userAgent.includes("Mac") && "ontouchend" in document;
652
- var isBrave = () => navigator.brave?.isBrave?.name === "isBrave";
653
- var isMobile = isIOS || /android|webos|ipod|blackberry|iemobile|opera mini/i.test(
654
- navigator.userAgent
655
- ) || /android|ios|ipod|blackberry|windows phone/i.test(navigator.platform);
656
1589
  var supportsResizeObserver = typeof window !== "undefined" && "ResizeObserver" in window;
657
1590
  var APP_NAME = "Excalidraw";
658
1591
  var TEXT_AUTOWRAP_THRESHOLD = 36;
@@ -734,11 +1667,20 @@ var ENV = {
734
1667
  PRODUCTION: "production"
735
1668
  };
736
1669
  var CLASSES = {
1670
+ SIDEBAR: "sidebar",
737
1671
  SHAPE_ACTIONS_MENU: "App-menu__left",
738
1672
  ZOOM_ACTIONS: "zoom-actions",
739
1673
  SEARCH_MENU_INPUT_WRAPPER: "layer-ui__search-inputWrapper",
740
1674
  CONVERT_ELEMENT_TYPE_POPUP: "ConvertElementTypePopup",
741
- SHAPE_ACTIONS_THEME_SCOPE: "shape-actions-theme-scope"
1675
+ SHAPE_ACTIONS_THEME_SCOPE: "shape-actions-theme-scope",
1676
+ FRAME_NAME: "frame-name",
1677
+ DROPDOWN_MENU_EVENT_WRAPPER: "dropdown-menu-event-wrapper"
1678
+ };
1679
+ var FONT_SIZES = {
1680
+ sm: 16,
1681
+ md: 20,
1682
+ lg: 28,
1683
+ xl: 36
742
1684
  };
743
1685
  var CJK_HAND_DRAWN_FALLBACK_FONT = "Xiaolai";
744
1686
  var WINDOWS_EMOJI_FALLBACK_FONT = "Segoe UI Emoji";
@@ -791,6 +1733,7 @@ var THEME = {
791
1733
  LIGHT: "light",
792
1734
  DARK: "dark"
793
1735
  };
1736
+ var DARK_THEME_FILTER = "invert(93%) hue-rotate(180deg)";
794
1737
  var FRAME_STYLE = {
795
1738
  strokeColor: "#bbb",
796
1739
  strokeWidth: 2,
@@ -839,6 +1782,7 @@ var STRING_MIME_TYPES = {
839
1782
  json: "application/json",
840
1783
  // excalidraw data
841
1784
  excalidraw: "application/vnd.excalidraw+json",
1785
+ excalidrawClipboard: "application/vnd.excalidraw.clipboard+json",
842
1786
  // LEGACY: fully-qualified library JSON data
843
1787
  excalidrawlib: "application/vnd.excalidrawlib+json",
844
1788
  // list of excalidraw library item ids
@@ -883,7 +1827,6 @@ var MAX_ZOOM = 30;
883
1827
  var HYPERLINK_TOOLTIP_DELAY = 300;
884
1828
  var IDLE_THRESHOLD = 6e4;
885
1829
  var ACTIVE_THRESHOLD = 3e3;
886
- var THEME_FILTER = "invert(93%) hue-rotate(180deg)";
887
1830
  var URL_QUERY_KEYS = {
888
1831
  addLibrary: "addLibrary"
889
1832
  };
@@ -904,18 +1847,13 @@ var DEFAULT_UI_OPTIONS = {
904
1847
  image: true
905
1848
  }
906
1849
  };
907
- var MQ_MAX_MOBILE = 599;
908
- var MQ_MAX_WIDTH_LANDSCAPE = 1e3;
909
- var MQ_MAX_HEIGHT_LANDSCAPE = 500;
910
- var MQ_MIN_TABLET = MQ_MAX_MOBILE + 1;
911
- var MQ_MAX_TABLET = 1400;
912
- var MQ_MIN_WIDTH_DESKTOP = 1440;
913
- var MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;
914
1850
  var MAX_DECIMALS_FOR_SVG_EXPORT = 2;
915
1851
  var EXPORT_SCALES = [1, 2, 3];
916
1852
  var DEFAULT_EXPORT_PADDING = 10;
917
- var DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT = 1440;
918
- var MAX_ALLOWED_FILE_BYTES = 4 * 1024 * 1024;
1853
+ var DEFAULT_IMAGE_OPTIONS = {
1854
+ maxWidthOrHeight: 1440,
1855
+ maxFileSizeBytes: 4 * 1024 * 1024
1856
+ };
919
1857
  var SVG_NS = "http://www.w3.org/2000/svg";
920
1858
  var SVG_DOCUMENT_PREAMBLE = `<?xml version="1.0" standalone="no"?>
921
1859
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
@@ -939,6 +1877,7 @@ var TEXT_ALIGN = {
939
1877
  RIGHT: "right"
940
1878
  };
941
1879
  var ELEMENT_READY_TO_ERASE_OPACITY = 20;
1880
+ var ELEMENT_PENDING_DRAW_SHAPE_OPACITY = 70;
942
1881
  var DEFAULT_PROPORTIONAL_RADIUS = 0.25;
943
1882
  var DEFAULT_ADAPTIVE_RADIUS = 32;
944
1883
  var ROUNDNESS = {
@@ -962,16 +1901,34 @@ var ROUGHNESS = {
962
1901
  artist: 1,
963
1902
  cartoonist: 2
964
1903
  };
1904
+ var STROKE_WIDTH_KEYS = [
1905
+ "thin",
1906
+ "medium",
1907
+ "bold"
1908
+ ];
965
1909
  var STROKE_WIDTH = {
966
1910
  thin: 1,
1911
+ medium: 2,
1912
+ bold: 4,
1913
+ extraBold: 8
1914
+ // unused (may be introduced in the future)
1915
+ };
1916
+ var FREEDRAW_STROKE_WIDTH = {
1917
+ thin: 0.5,
1918
+ medium: 1,
967
1919
  bold: 2,
968
1920
  extraBold: 4
1921
+ // legacy (may be used again in the future)
1922
+ };
1923
+ var getStrokeWidthByKey = (elementType, strokeWidthKey) => {
1924
+ return elementType === "freedraw" ? FREEDRAW_STROKE_WIDTH[strokeWidthKey] : STROKE_WIDTH[strokeWidthKey];
969
1925
  };
1926
+ var DEFAULT_ELEMENT_STROKE_WIDTH_KEY = "medium";
970
1927
  var DEFAULT_ELEMENT_PROPS = {
971
1928
  strokeColor: COLOR_PALETTE.black,
972
1929
  backgroundColor: COLOR_PALETTE.transparent,
973
1930
  fillStyle: "solid",
974
- strokeWidth: 2,
1931
+ strokeWidth: STROKE_WIDTH[DEFAULT_ELEMENT_STROKE_WIDTH_KEY],
975
1932
  strokeStyle: "solid",
976
1933
  roughness: ROUGHNESS.artist,
977
1934
  opacity: 100,
@@ -1004,7 +1961,9 @@ var TOOL_TYPE = {
1004
1961
  frame: "frame",
1005
1962
  magicframe: "magicframe",
1006
1963
  embeddable: "embeddable",
1007
- laser: "laser"
1964
+ laser: "laser",
1965
+ autoshape: "autoshape",
1966
+ bucketfill: "bucketfill"
1008
1967
  };
1009
1968
  var EDITOR_LS_KEYS = {
1010
1969
  OAI_API_KEY: "excalidraw-oai-api-key",
@@ -1031,6 +1990,12 @@ var UserIdleState = /* @__PURE__ */ ((UserIdleState2) => {
1031
1990
  })(UserIdleState || {});
1032
1991
  var LINE_POLYGON_POINT_MERGE_DISTANCE = 20;
1033
1992
  var DOUBLE_TAP_POSITION_THRESHOLD = 35;
1993
+ var BIND_MODE_TIMEOUT = 700;
1994
+ var MOBILE_ACTION_BUTTON_BG = {
1995
+ background: "var(--mobile-action-button-bg)"
1996
+ };
1997
+ var DEFAULT_STROKE_STREAMLINE = 0.5;
1998
+ var DEFAULT_STROKE_STREAMLINE_PRECISE = 0.2;
1034
1999
 
1035
2000
  // src/font-metadata.ts
1036
2001
  init_define_import_meta_env();
@@ -1186,6 +2151,133 @@ var Queue = class {
1186
2151
 
1187
2152
  // src/keys.ts
1188
2153
  init_define_import_meta_env();
2154
+
2155
+ // src/editorInterface.ts
2156
+ init_define_import_meta_env();
2157
+ var DESKTOP_UI_MODE_STORAGE_KEY = "excalidraw.desktopUIMode";
2158
+ var MQ_MAX_MOBILE = 599;
2159
+ var MQ_MAX_WIDTH_LANDSCAPE = 1e3;
2160
+ var MQ_MAX_HEIGHT_LANDSCAPE = 500;
2161
+ var MQ_MIN_TABLET = MQ_MAX_MOBILE + 1;
2162
+ var MQ_MAX_TABLET = 1180;
2163
+ var MQ_MIN_WIDTH_DESKTOP = 1440;
2164
+ var MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;
2165
+ var isDarwin = /Mac|iPod|iPhone|iPad/.test(navigator.platform);
2166
+ var isWindows = /^Win/.test(navigator.platform);
2167
+ var isAndroid = /\b(android)\b/i.test(navigator.userAgent);
2168
+ var isFirefox = typeof window !== "undefined" && "netscape" in window && navigator.userAgent.indexOf("rv:") > 1 && navigator.userAgent.indexOf("Gecko") > 1;
2169
+ var isChrome = navigator.userAgent.indexOf("Chrome") !== -1;
2170
+ var isSafari = !isChrome && navigator.userAgent.indexOf("Safari") !== -1;
2171
+ var isIOS = /iPad|iPhone/i.test(navigator.platform) || // iPadOS 13+
2172
+ navigator.userAgent.includes("Mac") && "ontouchend" in document;
2173
+ var isBrave = () => navigator.brave?.isBrave?.name === "isBrave";
2174
+ var isMobileBreakpoint = (width, height) => {
2175
+ return width <= MQ_MAX_MOBILE || height < MQ_MAX_HEIGHT_LANDSCAPE && width < MQ_MAX_WIDTH_LANDSCAPE;
2176
+ };
2177
+ var isTabletBreakpoint = (editorWidth, editorHeight) => {
2178
+ const minSide = Math.min(editorWidth, editorHeight);
2179
+ const maxSide = Math.max(editorWidth, editorHeight);
2180
+ return minSide >= MQ_MIN_TABLET && maxSide <= MQ_MAX_TABLET;
2181
+ };
2182
+ var isMobileOrTablet = () => {
2183
+ const ua = navigator.userAgent || "";
2184
+ const platform = navigator.platform || "";
2185
+ const uaData = navigator.userAgentData;
2186
+ if (uaData) {
2187
+ const plat = (uaData.platform || "").toLowerCase();
2188
+ const isDesktopOS = plat === "windows" || plat === "macos" || plat === "linux" || plat === "chrome os";
2189
+ if (uaData.mobile === true) {
2190
+ return true;
2191
+ }
2192
+ if (uaData.mobile === false && plat === "android") {
2193
+ const looksTouchTablet = matchMedia?.("(hover: none)").matches && matchMedia?.("(pointer: coarse)").matches;
2194
+ return looksTouchTablet;
2195
+ }
2196
+ if (isDesktopOS) {
2197
+ return false;
2198
+ }
2199
+ }
2200
+ if (isIOS) {
2201
+ return true;
2202
+ }
2203
+ if (isAndroid) {
2204
+ const isAndroidPhone = /Mobile/i.test(ua);
2205
+ const isAndroidTablet = !isAndroidPhone;
2206
+ if (isAndroidPhone || isAndroidTablet) {
2207
+ const looksTouchTablet = matchMedia?.("(hover: none)").matches && matchMedia?.("(pointer: coarse)").matches;
2208
+ return looksTouchTablet;
2209
+ }
2210
+ }
2211
+ const looksDesktopPlatform = /Win|Linux|CrOS|Mac/.test(platform) || /Windows NT|X11|CrOS|Macintosh/.test(ua);
2212
+ if (looksDesktopPlatform) {
2213
+ return false;
2214
+ }
2215
+ return false;
2216
+ };
2217
+ var getFormFactor = (editorWidth, editorHeight) => {
2218
+ if (isMobileBreakpoint(editorWidth, editorHeight)) {
2219
+ return "phone";
2220
+ }
2221
+ if (isTabletBreakpoint(editorWidth, editorHeight)) {
2222
+ return "tablet";
2223
+ }
2224
+ return "desktop";
2225
+ };
2226
+ var deriveStylesPanelMode = (editorInterface) => {
2227
+ if (editorInterface.formFactor === "phone") {
2228
+ return "mobile";
2229
+ }
2230
+ if (editorInterface.formFactor === "tablet") {
2231
+ return "compact";
2232
+ }
2233
+ return editorInterface.desktopUIMode;
2234
+ };
2235
+ var createUserAgentDescriptor = (userAgentString) => {
2236
+ const normalizedUA = userAgentString ?? "";
2237
+ let platform = "unknown";
2238
+ if (isIOS) {
2239
+ platform = "ios";
2240
+ } else if (isAndroid) {
2241
+ platform = "android";
2242
+ } else if (normalizedUA) {
2243
+ platform = "other";
2244
+ }
2245
+ return {
2246
+ isMobileDevice: isMobileOrTablet(),
2247
+ platform
2248
+ };
2249
+ };
2250
+ var loadDesktopUIModePreference = () => {
2251
+ if (typeof window === "undefined") {
2252
+ return null;
2253
+ }
2254
+ try {
2255
+ const stored = window.localStorage.getItem(DESKTOP_UI_MODE_STORAGE_KEY);
2256
+ if (stored === "compact" || stored === "full") {
2257
+ return stored;
2258
+ }
2259
+ } catch (error) {
2260
+ }
2261
+ return null;
2262
+ };
2263
+ var persistDesktopUIMode = (mode) => {
2264
+ if (typeof window === "undefined") {
2265
+ return;
2266
+ }
2267
+ try {
2268
+ window.localStorage.setItem(DESKTOP_UI_MODE_STORAGE_KEY, mode);
2269
+ } catch (error) {
2270
+ }
2271
+ };
2272
+ var setDesktopUIMode = (mode) => {
2273
+ if (mode !== "compact" && mode !== "full") {
2274
+ return;
2275
+ }
2276
+ persistDesktopUIMode(mode);
2277
+ return mode;
2278
+ };
2279
+
2280
+ // src/keys.ts
1189
2281
  var CODES = {
1190
2282
  EQUAL: "Equal",
1191
2283
  MINUS: "Minus",
@@ -1233,6 +2325,7 @@ var KEYS = {
1233
2325
  SUBTRACT: "-",
1234
2326
  SLASH: "/",
1235
2327
  A: "a",
2328
+ B: "b",
1236
2329
  C: "c",
1237
2330
  D: "d",
1238
2331
  E: "e",
@@ -1284,6 +2377,7 @@ var shouldRotateWithDiscreteAngle = (event) => event.shiftKey;
1284
2377
  // src/points.ts
1285
2378
  init_define_import_meta_env();
1286
2379
  import {
2380
+ pointFrom,
1287
2381
  pointFromPair
1288
2382
  } from "@excalidraw/math";
1289
2383
  var getSizeFromPoints = (points) => {
@@ -1328,12 +2422,12 @@ var rescalePoints = (dimension, newSize, points, normalize) => {
1328
2422
  };
1329
2423
  var getGridPoint = (x, y, gridSize) => {
1330
2424
  if (gridSize) {
1331
- return [
2425
+ return pointFrom(
1332
2426
  Math.round(x / gridSize) * gridSize,
1333
2427
  Math.round(y / gridSize) * gridSize
1334
- ];
2428
+ );
1335
2429
  }
1336
- return [x, y];
2430
+ return pointFrom(x, y);
1337
2431
  };
1338
2432
 
1339
2433
  // src/promise-pool.ts
@@ -1431,7 +2525,7 @@ var isInteractive = (target) => {
1431
2525
  return isInputLike(target) || target instanceof Element && !!target.closest("label, button");
1432
2526
  };
1433
2527
  var isWritableElement = (target) => target instanceof HTMLElement && target.dataset.type === "wysiwyg" || target instanceof HTMLBRElement || // newline in wysiwyg
1434
- target instanceof HTMLTextAreaElement || target instanceof HTMLInputElement && (target.type === "text" || target.type === "number" || target.type === "password");
2528
+ target instanceof HTMLTextAreaElement || target instanceof HTMLInputElement && (target.type === "text" || target.type === "number" || target.type === "password" || target.type === "search") || target instanceof HTMLElement && target.closest(".cm-editor") !== null;
1435
2529
  var getFontFamilyString = ({
1436
2530
  fontFamily
1437
2531
  }) => {
@@ -1448,6 +2542,9 @@ var getFontString = ({
1448
2542
  }) => {
1449
2543
  return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;
1450
2544
  };
2545
+ var nextAnimationFrame = async (cb) => {
2546
+ requestAnimationFrame(() => requestAnimationFrame(cb));
2547
+ };
1451
2548
  var debounce = (fn, timeout) => {
1452
2549
  let handle = 0;
1453
2550
  let lastArgs = null;
@@ -1473,32 +2570,23 @@ var debounce = (fn, timeout) => {
1473
2570
  };
1474
2571
  return ret;
1475
2572
  };
1476
- var throttleRAF = (fn, opts) => {
2573
+ var throttleRAF = (fn) => {
1477
2574
  let timerId = null;
1478
2575
  let lastArgs = null;
1479
- let lastArgsTrailing = null;
1480
- const scheduleFunc = (args) => {
2576
+ const scheduleFunc = () => {
1481
2577
  timerId = window.requestAnimationFrame(() => {
1482
2578
  timerId = null;
1483
- fn(...args);
2579
+ const args = lastArgs;
1484
2580
  lastArgs = null;
1485
- if (lastArgsTrailing) {
1486
- lastArgs = lastArgsTrailing;
1487
- lastArgsTrailing = null;
1488
- scheduleFunc(lastArgs);
2581
+ if (args) {
2582
+ fn(...args);
1489
2583
  }
1490
2584
  });
1491
2585
  };
1492
2586
  const ret = (...args) => {
1493
- if (isTestEnv()) {
1494
- fn(...args);
1495
- return;
1496
- }
1497
2587
  lastArgs = args;
1498
2588
  if (timerId === null) {
1499
- scheduleFunc(lastArgs);
1500
- } else if (opts?.trailing) {
1501
- lastArgsTrailing = args;
2589
+ scheduleFunc();
1502
2590
  }
1503
2591
  };
1504
2592
  ret.flush = () => {
@@ -1507,12 +2595,12 @@ var throttleRAF = (fn, opts) => {
1507
2595
  timerId = null;
1508
2596
  }
1509
2597
  if (lastArgs) {
1510
- fn(...lastArgsTrailing || lastArgs);
1511
- lastArgs = lastArgsTrailing = null;
2598
+ fn(...lastArgs);
2599
+ lastArgs = null;
1512
2600
  }
1513
2601
  };
1514
2602
  ret.cancel = () => {
1515
- lastArgs = lastArgsTrailing = null;
2603
+ lastArgs = null;
1516
2604
  if (timerId !== null) {
1517
2605
  cancelAnimationFrame(timerId);
1518
2606
  timerId = null;
@@ -1523,67 +2611,6 @@ var throttleRAF = (fn, opts) => {
1523
2611
  var easeOut = (k) => {
1524
2612
  return 1 - Math.pow(1 - k, 4);
1525
2613
  };
1526
- var easeOutInterpolate = (from, to, progress) => {
1527
- return (to - from) * easeOut(progress) + from;
1528
- };
1529
- var easeToValuesRAF = ({
1530
- fromValues,
1531
- toValues,
1532
- onStep,
1533
- duration = 250,
1534
- interpolateValue,
1535
- onStart,
1536
- onEnd,
1537
- onCancel
1538
- }) => {
1539
- let canceled = false;
1540
- let frameId = 0;
1541
- let startTime;
1542
- function step(timestamp) {
1543
- if (canceled) {
1544
- return;
1545
- }
1546
- if (startTime === void 0) {
1547
- startTime = timestamp;
1548
- onStart?.();
1549
- }
1550
- const elapsed = Math.min(timestamp - startTime, duration);
1551
- const factor = easeOut(elapsed / duration);
1552
- const newValues = {};
1553
- Object.keys(fromValues).forEach((key) => {
1554
- const _key = key;
1555
- const result = (toValues[_key] - fromValues[_key]) * factor + fromValues[_key];
1556
- newValues[_key] = result;
1557
- });
1558
- onStep(newValues);
1559
- if (elapsed < duration) {
1560
- const progress = elapsed / duration;
1561
- const newValues2 = {};
1562
- Object.keys(fromValues).forEach((key) => {
1563
- const _key = key;
1564
- const startValue = fromValues[_key];
1565
- const endValue = toValues[_key];
1566
- let result;
1567
- result = interpolateValue ? interpolateValue(startValue, endValue, progress, _key) : easeOutInterpolate(startValue, endValue, progress);
1568
- if (result == null) {
1569
- result = easeOutInterpolate(startValue, endValue, progress);
1570
- }
1571
- newValues2[_key] = result;
1572
- });
1573
- onStep(newValues2);
1574
- frameId = window.requestAnimationFrame(step);
1575
- } else {
1576
- onStep(toValues);
1577
- onEnd?.();
1578
- }
1579
- }
1580
- frameId = window.requestAnimationFrame(step);
1581
- return () => {
1582
- onCancel?.();
1583
- canceled = true;
1584
- window.cancelAnimationFrame(frameId);
1585
- };
1586
- };
1587
2614
  var chunk = (array, size) => {
1588
2615
  if (!array.length || size < 1) {
1589
2616
  return [];
@@ -1612,6 +2639,9 @@ var removeSelection = () => {
1612
2639
  }
1613
2640
  };
1614
2641
  var distance = (x, y) => Math.abs(x - y);
2642
+ var isSelectionLikeTool = (type) => {
2643
+ return type === "selection" || type === "lasso";
2644
+ };
1615
2645
  var updateActiveTool = (appState, data) => {
1616
2646
  if (data.type === "custom") {
1617
2647
  return {
@@ -1623,7 +2653,7 @@ var updateActiveTool = (appState, data) => {
1623
2653
  }
1624
2654
  return {
1625
2655
  ...appState.activeTool,
1626
- lastActiveTool: data.lastActiveToolBeforeEraser === void 0 ? appState.activeTool.lastActiveTool : data.lastActiveToolBeforeEraser,
2656
+ lastActiveTool: data.lastActiveTool === void 0 ? appState.activeTool.lastActiveTool : data.lastActiveTool,
1627
2657
  type: data.type,
1628
2658
  customType: null,
1629
2659
  locked: data.locked ?? appState.activeTool.locked,
@@ -1633,13 +2663,6 @@ var updateActiveTool = (appState, data) => {
1633
2663
  var isFullScreen = () => document.fullscreenElement?.nodeName === "HTML";
1634
2664
  var allowFullScreen = () => document.documentElement.requestFullscreen();
1635
2665
  var exitFullScreen = () => document.exitFullscreen();
1636
- var getShortcutKey = (shortcut) => {
1637
- shortcut = shortcut.replace(/\bAlt\b/i, "Alt").replace(/\bShift\b/i, "Shift").replace(/\b(Enter|Return)\b/i, "Enter");
1638
- if (isDarwin) {
1639
- return shortcut.replace(/\bCtrlOrCmd\b/gi, "Cmd").replace(/\bAlt\b/i, "Option");
1640
- }
1641
- return shortcut.replace(/\bCtrlOrCmd\b/gi, "Ctrl");
1642
- };
1643
2666
  var viewportCoordsToSceneCoords = ({ clientX, clientY }, {
1644
2667
  zoom,
1645
2668
  offsetLeft,
@@ -1713,12 +2736,6 @@ var mapFind = (collection, iteratee) => {
1713
2736
  }
1714
2737
  return void 0;
1715
2738
  };
1716
- var isTransparent = (color) => {
1717
- const isRGBTransparent = color.length === 5 && color.substr(4, 1) === "0";
1718
- const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === "00";
1719
- return isRGBTransparent || isRRGGBBTransparent || color === COLOR_PALETTE.transparent;
1720
- };
1721
- var isBindingFallthroughEnabled = (el) => el.fillStyle !== "solid" || isTransparent(el.backgroundColor);
1722
2739
  var resolvablePromise = () => {
1723
2740
  let resolve;
1724
2741
  let reject;
@@ -2039,9 +3056,9 @@ function getSvgPathFromStroke(points, closed = true) {
2039
3056
  var normalizeEOL = (str) => {
2040
3057
  return str.replace(/\r?\n|\r/g, "\n");
2041
3058
  };
2042
- var toBrandedType = (value) => {
3059
+ function toBrandedType(value) {
2043
3060
  return value;
2044
- };
3061
+ }
2045
3062
  var promiseTry = async (fn, ...args) => {
2046
3063
  return new Promise((resolve) => {
2047
3064
  resolve(fn(...args));
@@ -2081,40 +3098,40 @@ var reduceToCommonValue = (collection, getValue) => {
2081
3098
  }
2082
3099
  return commonValue;
2083
3100
  };
2084
- var isMobileOrTablet = () => {
2085
- const ua = navigator.userAgent || "";
2086
- const platform = navigator.platform || "";
2087
- const uaData = navigator.userAgentData;
2088
- if (uaData) {
2089
- const plat = (uaData.platform || "").toLowerCase();
2090
- const isDesktopOS = plat === "windows" || plat === "macos" || plat === "linux" || plat === "chrome os";
2091
- if (uaData.mobile === true) {
2092
- return true;
2093
- }
2094
- if (uaData.mobile === false && plat === "android") {
2095
- const looksTouchTablet = matchMedia?.("(hover: none)").matches && matchMedia?.("(pointer: coarse)").matches;
2096
- return looksTouchTablet;
2097
- }
2098
- if (isDesktopOS) {
2099
- return false;
2100
- }
2101
- }
2102
- if (isIOS) {
2103
- return true;
2104
- }
2105
- if (isAndroid) {
2106
- const isAndroidPhone = /Mobile/i.test(ua);
2107
- const isAndroidTablet = !isAndroidPhone;
2108
- if (isAndroidPhone || isAndroidTablet) {
2109
- const looksTouchTablet = matchMedia?.("(hover: none)").matches && matchMedia?.("(pointer: coarse)").matches;
2110
- return looksTouchTablet;
3101
+ var FEATURE_FLAGS_STORAGE_KEY = "excalidraw-feature-flags";
3102
+ var DEFAULT_FEATURE_FLAGS = {
3103
+ COMPLEX_BINDINGS: false
3104
+ };
3105
+ var featureFlags = null;
3106
+ var getFeatureFlag = (flag) => {
3107
+ if (!featureFlags) {
3108
+ try {
3109
+ const serializedFlags = localStorage.getItem(FEATURE_FLAGS_STORAGE_KEY);
3110
+ if (serializedFlags) {
3111
+ const flags = JSON.parse(serializedFlags);
3112
+ featureFlags = flags ?? DEFAULT_FEATURE_FLAGS;
3113
+ }
3114
+ } catch {
2111
3115
  }
2112
3116
  }
2113
- const looksDesktopPlatform = /Win|Linux|CrOS|Mac/.test(platform) || /Windows NT|X11|CrOS|Macintosh/.test(ua);
2114
- if (looksDesktopPlatform) {
2115
- return false;
3117
+ return (featureFlags || DEFAULT_FEATURE_FLAGS)[flag];
3118
+ };
3119
+ var setFeatureFlag = (flag, value) => {
3120
+ try {
3121
+ featureFlags = {
3122
+ ...featureFlags || DEFAULT_FEATURE_FLAGS,
3123
+ [flag]: value
3124
+ };
3125
+ localStorage.setItem(
3126
+ FEATURE_FLAGS_STORAGE_KEY,
3127
+ JSON.stringify(featureFlags)
3128
+ );
3129
+ } catch (e) {
3130
+ console.error("unable to set feature flag", e);
2116
3131
  }
2117
- return false;
3132
+ };
3133
+ var oneOf = (needle, haystack) => {
3134
+ return haystack.includes(needle);
2118
3135
  };
2119
3136
 
2120
3137
  // src/random.ts
@@ -2189,6 +3206,298 @@ var Emitter = class {
2189
3206
  this.subscribers = [];
2190
3207
  }
2191
3208
  };
3209
+
3210
+ // src/appEventBus.ts
3211
+ init_define_import_meta_env();
3212
+ var AppEventBus = class {
3213
+ constructor(behavior) {
3214
+ this.behavior = behavior;
3215
+ }
3216
+ emitters = /* @__PURE__ */ new Map();
3217
+ lastPayload = /* @__PURE__ */ new Map();
3218
+ emittedOnce = /* @__PURE__ */ new Set();
3219
+ getEmitter(name) {
3220
+ let emitter = this.emitters.get(name);
3221
+ if (!emitter) {
3222
+ emitter = new Emitter();
3223
+ this.emitters.set(name, emitter);
3224
+ }
3225
+ return emitter;
3226
+ }
3227
+ toPromiseValue(args) {
3228
+ return args.length === 1 ? args[0] : args;
3229
+ }
3230
+ on(name, callback) {
3231
+ const eventBehavior = this.behavior[name];
3232
+ const cachedPayload = this.lastPayload.get(name);
3233
+ if (callback) {
3234
+ if (eventBehavior.replay === "last" && cachedPayload) {
3235
+ queueMicrotask(() => callback(...cachedPayload));
3236
+ if (eventBehavior.cardinality === "once") {
3237
+ return () => {
3238
+ };
3239
+ }
3240
+ }
3241
+ return this.getEmitter(name).on(callback);
3242
+ }
3243
+ if (eventBehavior.cardinality !== "once" || eventBehavior.replay !== "last") {
3244
+ throw new Error(`Event "${String(name)}" requires a callback`);
3245
+ }
3246
+ if (cachedPayload) {
3247
+ return Promise.resolve(this.toPromiseValue(cachedPayload));
3248
+ }
3249
+ return new Promise((resolve) => {
3250
+ this.getEmitter(name).once((...args) => {
3251
+ resolve(this.toPromiseValue(args));
3252
+ });
3253
+ });
3254
+ }
3255
+ emit(name, ...args) {
3256
+ const eventBehavior = this.behavior[name];
3257
+ if (!isProdEnv()) {
3258
+ if (eventBehavior.cardinality === "once") {
3259
+ if (this.emittedOnce.has(name)) {
3260
+ throw new Error(`Event "${String(name)}" can only be emitted once`);
3261
+ }
3262
+ this.emittedOnce.add(name);
3263
+ }
3264
+ }
3265
+ if (eventBehavior.replay === "last") {
3266
+ this.lastPayload.set(name, args);
3267
+ }
3268
+ try {
3269
+ this.getEmitter(name).trigger(...args);
3270
+ } finally {
3271
+ if (eventBehavior.cardinality === "once") {
3272
+ this.getEmitter(name).clear();
3273
+ }
3274
+ }
3275
+ }
3276
+ clear() {
3277
+ this.lastPayload.clear();
3278
+ this.emittedOnce.clear();
3279
+ for (const emitter of this.emitters.values()) {
3280
+ emitter.clear();
3281
+ }
3282
+ this.emitters.clear();
3283
+ }
3284
+ };
3285
+
3286
+ // src/versionedSnapshotStore.ts
3287
+ init_define_import_meta_env();
3288
+ var VersionedSnapshotStore = class {
3289
+ constructor(initialValue, isEqual = Object.is) {
3290
+ this.isEqual = isEqual;
3291
+ this.value = initialValue;
3292
+ }
3293
+ version = 0;
3294
+ value;
3295
+ waiters = /* @__PURE__ */ new Set();
3296
+ subscribers = /* @__PURE__ */ new Set();
3297
+ getSnapshot() {
3298
+ return { version: this.version, value: this.value };
3299
+ }
3300
+ set(nextValue) {
3301
+ if (this.isEqual(this.value, nextValue)) {
3302
+ return false;
3303
+ }
3304
+ this.value = nextValue;
3305
+ this.version += 1;
3306
+ const snapshot = this.getSnapshot();
3307
+ for (const subscriber of this.subscribers) {
3308
+ subscriber(snapshot);
3309
+ }
3310
+ for (const waiter of this.waiters) {
3311
+ waiter(snapshot);
3312
+ }
3313
+ this.waiters.clear();
3314
+ return true;
3315
+ }
3316
+ update(updater) {
3317
+ return this.set(updater(this.value));
3318
+ }
3319
+ subscribe(subscriber) {
3320
+ this.subscribers.add(subscriber);
3321
+ return () => {
3322
+ this.subscribers.delete(subscriber);
3323
+ };
3324
+ }
3325
+ pull(sinceVersion = -1) {
3326
+ if (this.version !== sinceVersion) {
3327
+ return Promise.resolve(this.getSnapshot());
3328
+ }
3329
+ return new Promise((resolve) => {
3330
+ this.waiters.add(resolve);
3331
+ });
3332
+ }
3333
+ };
3334
+
3335
+ // debug.ts
3336
+ init_define_import_meta_env();
3337
+ var lessPrecise = (num, precision = 5) => parseFloat(num.toPrecision(precision));
3338
+ var getAvgFrameTime = (times) => lessPrecise(times.reduce((a, b) => a + b) / times.length);
3339
+ var Debug = class _Debug {
3340
+ static DEBUG_LOG_TIMES = true;
3341
+ static TIMES_AGGR = {};
3342
+ static TIMES_AVG = {};
3343
+ static LAST_DEBUG_LOG_CALL = 0;
3344
+ static DEBUG_LOG_INTERVAL_ID = null;
3345
+ static LAST_FRAME_TIMESTAMP = 0;
3346
+ static FRAME_COUNT = 0;
3347
+ static ANIMATION_FRAME_ID = null;
3348
+ static scheduleAnimationFrame = () => {
3349
+ if (_Debug.DEBUG_LOG_INTERVAL_ID !== null) {
3350
+ _Debug.ANIMATION_FRAME_ID = requestAnimationFrame((timestamp) => {
3351
+ if (_Debug.LAST_FRAME_TIMESTAMP !== timestamp) {
3352
+ _Debug.LAST_FRAME_TIMESTAMP = timestamp;
3353
+ _Debug.FRAME_COUNT++;
3354
+ }
3355
+ if (_Debug.DEBUG_LOG_INTERVAL_ID !== null) {
3356
+ _Debug.scheduleAnimationFrame();
3357
+ }
3358
+ });
3359
+ }
3360
+ };
3361
+ static setupInterval = () => {
3362
+ if (_Debug.DEBUG_LOG_INTERVAL_ID === null) {
3363
+ console.info("%c(starting perf recording)", "color: lime");
3364
+ _Debug.DEBUG_LOG_INTERVAL_ID = window.setInterval(_Debug.debugLogger, 1e3);
3365
+ _Debug.scheduleAnimationFrame();
3366
+ }
3367
+ _Debug.LAST_DEBUG_LOG_CALL = Date.now();
3368
+ };
3369
+ static debugLogger = () => {
3370
+ if (_Debug.DEBUG_LOG_TIMES) {
3371
+ for (const [name, { t, times }] of Object.entries(_Debug.TIMES_AGGR)) {
3372
+ if (times.length) {
3373
+ console.info(
3374
+ name,
3375
+ lessPrecise(times.reduce((a, b) => a + b)),
3376
+ times.sort((a, b) => a - b).map((x) => lessPrecise(x))
3377
+ );
3378
+ _Debug.TIMES_AGGR[name] = { t, times: [] };
3379
+ }
3380
+ }
3381
+ for (const [name, { t, times, avg }] of Object.entries(_Debug.TIMES_AVG)) {
3382
+ if (times.length) {
3383
+ const totalTime = times.reduce((a, b) => a + b);
3384
+ const avgFrameTime = lessPrecise(totalTime / _Debug.FRAME_COUNT);
3385
+ console.info(
3386
+ name,
3387
+ `- ${times.length} calls - ${avgFrameTime}ms/frame across ${_Debug.FRAME_COUNT} frames (${lessPrecise(
3388
+ avgFrameTime / 16.67 * 100,
3389
+ 1
3390
+ )}% of frame budget)`
3391
+ );
3392
+ _Debug.TIMES_AVG[name] = {
3393
+ t,
3394
+ times: [],
3395
+ avg: avg != null ? getAvgFrameTime([avg, avgFrameTime]) : avgFrameTime
3396
+ };
3397
+ }
3398
+ }
3399
+ }
3400
+ _Debug.FRAME_COUNT = 0;
3401
+ if (Date.now() - _Debug.LAST_DEBUG_LOG_CALL > 600 && _Debug.DEBUG_LOG_INTERVAL_ID !== null) {
3402
+ console.info("%c(stopping perf recording)", "color: red");
3403
+ window.clearInterval(_Debug.DEBUG_LOG_INTERVAL_ID);
3404
+ window.cancelAnimationFrame(_Debug.ANIMATION_FRAME_ID);
3405
+ _Debug.ANIMATION_FRAME_ID = null;
3406
+ _Debug.FRAME_COUNT = 0;
3407
+ _Debug.LAST_FRAME_TIMESTAMP = 0;
3408
+ _Debug.DEBUG_LOG_INTERVAL_ID = null;
3409
+ _Debug.TIMES_AGGR = {};
3410
+ _Debug.TIMES_AVG = {};
3411
+ }
3412
+ };
3413
+ static logTime = (time, name = "default") => {
3414
+ _Debug.setupInterval();
3415
+ const now = performance.now();
3416
+ const { t, times } = _Debug.TIMES_AGGR[name] = _Debug.TIMES_AGGR[name] || {
3417
+ t: 0,
3418
+ times: []
3419
+ };
3420
+ if (t) {
3421
+ times.push(time != null ? time : now - t);
3422
+ }
3423
+ _Debug.TIMES_AGGR[name].t = now;
3424
+ };
3425
+ static logTimeAverage = (time, name = "default") => {
3426
+ _Debug.setupInterval();
3427
+ const now = performance.now();
3428
+ const { t, times } = _Debug.TIMES_AVG[name] = _Debug.TIMES_AVG[name] || {
3429
+ t: 0,
3430
+ times: []
3431
+ };
3432
+ if (t) {
3433
+ times.push(time != null ? time : now - t);
3434
+ }
3435
+ _Debug.TIMES_AVG[name].t = now;
3436
+ };
3437
+ static logWrapper = (type) => (fn, name = "default") => {
3438
+ return (...args) => {
3439
+ const t0 = performance.now();
3440
+ const ret = fn(...args);
3441
+ _Debug[type](performance.now() - t0, name);
3442
+ return ret;
3443
+ };
3444
+ };
3445
+ static logTimeWrap = _Debug.logWrapper("logTime");
3446
+ static logTimeAverageWrap = _Debug.logWrapper("logTimeAverage");
3447
+ static perfWrap = (fn, name = "default") => {
3448
+ return (...args) => {
3449
+ console.time(name);
3450
+ const ret = fn(...args);
3451
+ console.timeEnd(name);
3452
+ return ret;
3453
+ };
3454
+ };
3455
+ static CHANGED_CACHE = {};
3456
+ static logChanged(name, obj) {
3457
+ const prev = _Debug.CHANGED_CACHE[name];
3458
+ _Debug.CHANGED_CACHE[name] = obj;
3459
+ if (!prev) {
3460
+ return;
3461
+ }
3462
+ const allKeys = /* @__PURE__ */ new Set([...Object.keys(prev), ...Object.keys(obj)]);
3463
+ const changed = {};
3464
+ for (const key of allKeys) {
3465
+ const prevVal = prev[key];
3466
+ const nextVal = obj[key];
3467
+ if (!deepEqual(prevVal, nextVal)) {
3468
+ changed[key] = { prev: prevVal, next: nextVal };
3469
+ }
3470
+ }
3471
+ if (Object.keys(changed).length > 0) {
3472
+ console.info(`[${name}] changed:`, changed);
3473
+ }
3474
+ }
3475
+ };
3476
+ function deepEqual(a, b) {
3477
+ if (Object.is(a, b)) {
3478
+ return true;
3479
+ }
3480
+ if (a === null || b === null || typeof a !== "object" || typeof b !== "object") {
3481
+ return false;
3482
+ }
3483
+ if (Array.isArray(a) !== Array.isArray(b)) {
3484
+ return false;
3485
+ }
3486
+ const keysA = Object.keys(a);
3487
+ const keysB = Object.keys(b);
3488
+ if (keysA.length !== keysB.length) {
3489
+ return false;
3490
+ }
3491
+ for (const key of keysA) {
3492
+ if (!deepEqual(
3493
+ a[key],
3494
+ b[key]
3495
+ )) {
3496
+ return false;
3497
+ }
3498
+ }
3499
+ return true;
3500
+ }
2192
3501
  export {
2193
3502
  ACTIVE_THRESHOLD,
2194
3503
  ALLOWED_PASTE_MIME_TYPES,
@@ -2196,10 +3505,12 @@ export {
2196
3505
  ARROW_LABEL_FONT_SIZE_TO_MIN_WIDTH_RATIO,
2197
3506
  ARROW_LABEL_WIDTH_FRACTION,
2198
3507
  ARROW_TYPE,
3508
+ AppEventBus,
3509
+ BIND_MODE_TIMEOUT,
2199
3510
  BOUND_TEXT_PADDING,
3511
+ BUCKET_FILL_BACKGROUND_PICKS,
2200
3512
  BinaryHeap,
2201
3513
  CANVAS_ONLY_ACTIONS,
2202
- CANVAS_PALETTE_SHADE_INDEXES,
2203
3514
  CANVAS_SEARCH_TAB,
2204
3515
  CJK_HAND_DRAWN_FALLBACK_FONT,
2205
3516
  CLASSES,
@@ -2211,6 +3522,7 @@ export {
2211
3522
  COLOR_VOICE_CALL,
2212
3523
  COLOR_WHITE,
2213
3524
  CURSOR_TYPE,
3525
+ DARK_THEME_FILTER,
2214
3526
  DEFAULT_ADAPTIVE_RADIUS,
2215
3527
  DEFAULT_CANVAS_BACKGROUND_PICKS,
2216
3528
  DEFAULT_CHART_COLOR_INDEX,
@@ -2222,17 +3534,20 @@ export {
2222
3534
  DEFAULT_ELEMENT_STROKE_COLOR_INDEX,
2223
3535
  DEFAULT_ELEMENT_STROKE_COLOR_PALETTE,
2224
3536
  DEFAULT_ELEMENT_STROKE_PICKS,
3537
+ DEFAULT_ELEMENT_STROKE_WIDTH_KEY,
2225
3538
  DEFAULT_EXPORT_PADDING,
2226
3539
  DEFAULT_FILENAME,
2227
3540
  DEFAULT_FONT_FAMILY,
2228
3541
  DEFAULT_FONT_SIZE,
2229
3542
  DEFAULT_GRID_SIZE,
2230
3543
  DEFAULT_GRID_STEP,
3544
+ DEFAULT_IMAGE_OPTIONS,
2231
3545
  DEFAULT_LASER_COLOR,
2232
- DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,
2233
3546
  DEFAULT_PROPORTIONAL_RADIUS,
2234
3547
  DEFAULT_REDUCED_GLOBAL_ALPHA,
2235
3548
  DEFAULT_SIDEBAR,
3549
+ DEFAULT_STROKE_STREAMLINE,
3550
+ DEFAULT_STROKE_STREAMLINE_PRECISE,
2236
3551
  DEFAULT_TEXT_ALIGN,
2237
3552
  DEFAULT_TRANSFORM_HANDLE_SPACING,
2238
3553
  DEFAULT_UI_OPTIONS,
@@ -2240,9 +3555,10 @@ export {
2240
3555
  DEFAULT_VERTICAL_ALIGN,
2241
3556
  DOUBLE_TAP_POSITION_THRESHOLD,
2242
3557
  DRAGGING_THRESHOLD,
3558
+ Debug,
2243
3559
  EDITOR_LS_KEYS,
2244
- ELEMENTS_PALETTE_SHADE_INDEXES,
2245
3560
  ELEMENT_LINK_KEY,
3561
+ ELEMENT_PENDING_DRAW_SHAPE_OPACITY,
2246
3562
  ELEMENT_READY_TO_ERASE_OPACITY,
2247
3563
  ELEMENT_SHIFT_TRANSLATE_AMOUNT,
2248
3564
  ELEMENT_TRANSLATE_AMOUNT,
@@ -2258,7 +3574,9 @@ export {
2258
3574
  FONT_FAMILY_FALLBACKS,
2259
3575
  FONT_FAMILY_GENERIC_FALLBACKS,
2260
3576
  FONT_METADATA,
3577
+ FONT_SIZES,
2261
3578
  FRAME_STYLE,
3579
+ FREEDRAW_STROKE_WIDTH,
2262
3580
  GOOGLE_FONTS_RANGES,
2263
3581
  HYPERLINK_TOOLTIP_DELAY,
2264
3582
  IDLE_THRESHOLD,
@@ -2271,7 +3589,6 @@ export {
2271
3589
  LINE_CONFIRM_THRESHOLD,
2272
3590
  LINE_POLYGON_POINT_MERGE_DISTANCE,
2273
3591
  LOCAL_FONT_PROTOCOL,
2274
- MAX_ALLOWED_FILE_BYTES,
2275
3592
  MAX_CUSTOM_COLORS_USED_IN_CANVAS,
2276
3593
  MAX_DECIMALS_FOR_SVG_EXPORT,
2277
3594
  MAX_ZOOM,
@@ -2280,6 +3597,7 @@ export {
2280
3597
  MIN_FONT_SIZE,
2281
3598
  MIN_WIDTH_OR_HEIGHT,
2282
3599
  MIN_ZOOM,
3600
+ MOBILE_ACTION_BUTTON_BG,
2283
3601
  MONOSPACE_GENERIC_FONT,
2284
3602
  MQ_MAX_HEIGHT_LANDSCAPE,
2285
3603
  MQ_MAX_MOBILE,
@@ -2302,6 +3620,7 @@ export {
2302
3620
  STATS_PANELS,
2303
3621
  STRING_MIME_TYPES,
2304
3622
  STROKE_WIDTH,
3623
+ STROKE_WIDTH_KEYS,
2305
3624
  SVG_DOCUMENT_PREAMBLE,
2306
3625
  SVG_NS,
2307
3626
  TAP_TWICE_TIMEOUT,
@@ -2309,7 +3628,6 @@ export {
2309
3628
  TEXT_AUTOWRAP_THRESHOLD,
2310
3629
  TEXT_TO_CENTER_SNAP_THRESHOLD,
2311
3630
  THEME,
2312
- THEME_FILTER,
2313
3631
  TITLE_TIMEOUT,
2314
3632
  TOOL_TYPE,
2315
3633
  TOUCH_CTX_MENU_TIMEOUT,
@@ -2319,11 +3637,13 @@ export {
2319
3637
  VERSIONS,
2320
3638
  VERSION_TIMEOUT,
2321
3639
  VERTICAL_ALIGN,
3640
+ VersionedSnapshotStore,
2322
3641
  WINDOWS_EMOJI_FALLBACK_FONT,
2323
3642
  YOUTUBE_STATES,
2324
3643
  ZOOM_STEP,
2325
3644
  addEventListener,
2326
3645
  allowFullScreen,
3646
+ applyDarkModeFilter,
2327
3647
  arrayToList,
2328
3648
  arrayToMap,
2329
3649
  arrayToMapWithIndex,
@@ -2334,31 +3654,35 @@ export {
2334
3654
  castArray,
2335
3655
  chunk,
2336
3656
  cloneJSON,
3657
+ colorToHex,
2337
3658
  composeEventHandlers,
3659
+ createUserAgentDescriptor,
2338
3660
  debounce,
3661
+ deriveStylesPanelMode,
2339
3662
  distance,
2340
3663
  easeOut,
2341
- easeToValuesRAF,
2342
3664
  escapeDoubleQuotes,
2343
3665
  exitFullScreen,
2344
3666
  findIndex,
2345
3667
  findLastIndex,
2346
3668
  focusNearestParent,
2347
3669
  getAllColorsSpecificShade,
3670
+ getBucketFillBackgroundColor,
2348
3671
  getDateTime,
2349
3672
  getExportSource,
3673
+ getFeatureFlag,
2350
3674
  getFontFamilyFallbacks,
2351
3675
  getFontFamilyString,
2352
3676
  getFontString,
3677
+ getFormFactor,
2353
3678
  getFrame,
2354
3679
  getGenericFontFamilyFallback,
2355
3680
  getGlobalCSSVariable,
2356
3681
  getGridPoint,
2357
3682
  getLineHeight,
2358
3683
  getNearestScrollableContainer,
2359
- getShortcutKey,
2360
3684
  getSizeFromPoints,
2361
- getSpecificColorShades,
3685
+ getStrokeWidthByKey,
2362
3686
  getSvgPathFromStroke,
2363
3687
  getUpdatedTimestamp,
2364
3688
  getVersion,
@@ -2367,9 +3691,10 @@ export {
2367
3691
  isAndroid,
2368
3692
  isAnyTrue,
2369
3693
  isArrowKey,
2370
- isBindingFallthroughEnabled,
3694
+ isBounds,
2371
3695
  isBrave,
2372
3696
  isChrome,
3697
+ isColorDark,
2373
3698
  isDarwin,
2374
3699
  isDevEnv,
2375
3700
  isFirefox,
@@ -2380,8 +3705,8 @@ export {
2380
3705
  isLatinChar,
2381
3706
  isLocalLink,
2382
3707
  isMemberOf,
2383
- isMobile,
2384
- isMobileOrTablet,
3708
+ isMobileBreakpoint,
3709
+ isOpaqueColor,
2385
3710
  isPrimitive,
2386
3711
  isProdEnv,
2387
3712
  isPromiseLike,
@@ -2389,20 +3714,26 @@ export {
2389
3714
  isReadonlyArray,
2390
3715
  isRunningInIframe,
2391
3716
  isSafari,
3717
+ isSelectionLikeTool,
2392
3718
  isServerEnv,
2393
3719
  isShallowEqual,
3720
+ isTabletBreakpoint,
2394
3721
  isTestEnv,
2395
3722
  isToolIcon,
2396
3723
  isTransparent,
2397
3724
  isWindows,
2398
3725
  isWritableElement,
3726
+ loadDesktopUIModePreference,
2399
3727
  mapFind,
2400
3728
  matchKey,
2401
3729
  memoize,
2402
3730
  muteFSAbortError,
2403
3731
  nFormatter,
3732
+ nextAnimationFrame,
2404
3733
  normalizeEOL,
3734
+ normalizeInputColor,
2405
3735
  normalizeLink,
3736
+ oneOf,
2406
3737
  preventUnload,
2407
3738
  promiseTry,
2408
3739
  queryFocusableElements,
@@ -2413,11 +3744,13 @@ export {
2413
3744
  rescalePoints,
2414
3745
  reseed,
2415
3746
  resolvablePromise,
2416
- rgbToHex,
3747
+ rgbToHex2 as rgbToHex,
2417
3748
  safelyParseJSON,
2418
3749
  sceneCoordsToViewportCoords,
2419
3750
  selectNode,
2420
3751
  setDateTimeForTests,
3752
+ setDesktopUIMode,
3753
+ setFeatureFlag,
2421
3754
  shouldMaintainAspectRatio,
2422
3755
  shouldResizeFromCenter,
2423
3756
  shouldRotateWithDiscreteAngle,