@tldraw/editor 4.3.0-canary.e52fa5385f86 → 4.3.0-canary.ea88b223b83a

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 (155) hide show
  1. package/dist-cjs/index.d.ts +428 -120
  2. package/dist-cjs/index.js +5 -1
  3. package/dist-cjs/index.js.map +2 -2
  4. package/dist-cjs/lib/components/ErrorBoundary.js.map +1 -1
  5. package/dist-cjs/lib/components/GeometryDebuggingView.js +1 -17
  6. package/dist-cjs/lib/components/GeometryDebuggingView.js.map +2 -2
  7. package/dist-cjs/lib/components/default-components/DefaultCanvas.js +3 -3
  8. package/dist-cjs/lib/components/default-components/DefaultCanvas.js.map +2 -2
  9. package/dist-cjs/lib/constants.js +1 -3
  10. package/dist-cjs/lib/constants.js.map +2 -2
  11. package/dist-cjs/lib/editor/Editor.js +268 -274
  12. package/dist-cjs/lib/editor/Editor.js.map +2 -2
  13. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js +18 -17
  14. package/dist-cjs/lib/editor/derivations/notVisibleShapes.js.map +3 -3
  15. package/dist-cjs/lib/editor/derivations/parentsToChildren.js +12 -3
  16. package/dist-cjs/lib/editor/derivations/parentsToChildren.js.map +2 -2
  17. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js +1 -1
  18. package/dist-cjs/lib/editor/managers/ClickManager/ClickManager.js.map +2 -2
  19. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js +5 -6
  20. package/dist-cjs/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.js.map +2 -2
  21. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js +591 -0
  22. package/dist-cjs/lib/editor/managers/InputsManager/InputsManager.js.map +7 -0
  23. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js +1 -1
  24. package/dist-cjs/lib/editor/managers/SnapManager/SnapManager.js.map +2 -2
  25. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js +1 -22
  26. package/dist-cjs/lib/editor/managers/TickManager/TickManager.js.map +2 -2
  27. package/dist-cjs/lib/editor/shapes/ShapeUtil.js +31 -23
  28. package/dist-cjs/lib/editor/shapes/ShapeUtil.js.map +2 -2
  29. package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js +1 -1
  30. package/dist-cjs/lib/editor/shapes/group/DashedOutlineBox.js.map +2 -2
  31. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js +3 -3
  32. package/dist-cjs/lib/editor/tools/BaseBoxShapeTool/children/Pointing.js.map +2 -2
  33. package/dist-cjs/lib/exports/parseCss.js +1 -1
  34. package/dist-cjs/lib/exports/parseCss.js.map +2 -2
  35. package/dist-cjs/lib/hooks/useEvent.js +1 -1
  36. package/dist-cjs/lib/hooks/useEvent.js.map +2 -2
  37. package/dist-cjs/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.js.map +2 -2
  38. package/dist-cjs/lib/hooks/useGestureEvents.js +1 -1
  39. package/dist-cjs/lib/hooks/useGestureEvents.js.map +2 -2
  40. package/dist-cjs/lib/hooks/usePassThroughMouseOverEvents.js.map +2 -2
  41. package/dist-cjs/lib/hooks/usePassThroughWheelEvents.js.map +2 -2
  42. package/dist-cjs/lib/hooks/useScreenBounds.js.map +2 -2
  43. package/dist-cjs/lib/hooks/useStateAttribute.js +4 -1
  44. package/dist-cjs/lib/hooks/useStateAttribute.js.map +2 -2
  45. package/dist-cjs/lib/hooks/useTransform.js.map +1 -1
  46. package/dist-cjs/lib/hooks/useZoomCss.js +4 -8
  47. package/dist-cjs/lib/hooks/useZoomCss.js.map +2 -2
  48. package/dist-cjs/lib/options.js +6 -1
  49. package/dist-cjs/lib/options.js.map +2 -2
  50. package/dist-cjs/lib/primitives/Box.js +3 -0
  51. package/dist-cjs/lib/primitives/Box.js.map +2 -2
  52. package/dist-cjs/lib/primitives/geometry/Geometry2d.js +1 -0
  53. package/dist-cjs/lib/primitives/geometry/Geometry2d.js.map +2 -2
  54. package/dist-cjs/lib/utils/rotation.js +1 -1
  55. package/dist-cjs/lib/utils/rotation.js.map +2 -2
  56. package/dist-cjs/version.js +3 -3
  57. package/dist-cjs/version.js.map +1 -1
  58. package/dist-esm/index.d.mts +428 -120
  59. package/dist-esm/index.mjs +5 -1
  60. package/dist-esm/index.mjs.map +2 -2
  61. package/dist-esm/lib/components/ErrorBoundary.mjs.map +1 -1
  62. package/dist-esm/lib/components/GeometryDebuggingView.mjs +1 -17
  63. package/dist-esm/lib/components/GeometryDebuggingView.mjs.map +2 -2
  64. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs +3 -3
  65. package/dist-esm/lib/components/default-components/DefaultCanvas.mjs.map +2 -2
  66. package/dist-esm/lib/constants.mjs +1 -3
  67. package/dist-esm/lib/constants.mjs.map +2 -2
  68. package/dist-esm/lib/editor/Editor.mjs +269 -277
  69. package/dist-esm/lib/editor/Editor.mjs.map +2 -2
  70. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs +18 -17
  71. package/dist-esm/lib/editor/derivations/notVisibleShapes.mjs.map +3 -3
  72. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs +13 -4
  73. package/dist-esm/lib/editor/derivations/parentsToChildren.mjs.map +2 -2
  74. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs +1 -1
  75. package/dist-esm/lib/editor/managers/ClickManager/ClickManager.mjs.map +2 -2
  76. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs +5 -6
  77. package/dist-esm/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.mjs.map +2 -2
  78. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs +573 -0
  79. package/dist-esm/lib/editor/managers/InputsManager/InputsManager.mjs.map +7 -0
  80. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs +1 -1
  81. package/dist-esm/lib/editor/managers/SnapManager/SnapManager.mjs.map +2 -2
  82. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs +1 -22
  83. package/dist-esm/lib/editor/managers/TickManager/TickManager.mjs.map +2 -2
  84. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs +31 -23
  85. package/dist-esm/lib/editor/shapes/ShapeUtil.mjs.map +2 -2
  86. package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs +1 -1
  87. package/dist-esm/lib/editor/shapes/group/DashedOutlineBox.mjs.map +2 -2
  88. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs +3 -3
  89. package/dist-esm/lib/editor/tools/BaseBoxShapeTool/children/Pointing.mjs.map +2 -2
  90. package/dist-esm/lib/exports/parseCss.mjs +1 -1
  91. package/dist-esm/lib/exports/parseCss.mjs.map +2 -2
  92. package/dist-esm/lib/hooks/useEvent.mjs +1 -1
  93. package/dist-esm/lib/hooks/useEvent.mjs.map +2 -2
  94. package/dist-esm/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.mjs.map +2 -2
  95. package/dist-esm/lib/hooks/useGestureEvents.mjs +1 -1
  96. package/dist-esm/lib/hooks/useGestureEvents.mjs.map +2 -2
  97. package/dist-esm/lib/hooks/usePassThroughMouseOverEvents.mjs.map +2 -2
  98. package/dist-esm/lib/hooks/usePassThroughWheelEvents.mjs.map +2 -2
  99. package/dist-esm/lib/hooks/useScreenBounds.mjs.map +2 -2
  100. package/dist-esm/lib/hooks/useStateAttribute.mjs +4 -1
  101. package/dist-esm/lib/hooks/useStateAttribute.mjs.map +2 -2
  102. package/dist-esm/lib/hooks/useTransform.mjs.map +1 -1
  103. package/dist-esm/lib/hooks/useZoomCss.mjs +4 -8
  104. package/dist-esm/lib/hooks/useZoomCss.mjs.map +2 -2
  105. package/dist-esm/lib/options.mjs +6 -1
  106. package/dist-esm/lib/options.mjs.map +2 -2
  107. package/dist-esm/lib/primitives/Box.mjs +3 -0
  108. package/dist-esm/lib/primitives/Box.mjs.map +2 -2
  109. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs +1 -0
  110. package/dist-esm/lib/primitives/geometry/Geometry2d.mjs.map +2 -2
  111. package/dist-esm/lib/utils/rotation.mjs +1 -1
  112. package/dist-esm/lib/utils/rotation.mjs.map +2 -2
  113. package/dist-esm/version.mjs +3 -3
  114. package/dist-esm/version.mjs.map +1 -1
  115. package/editor.css +14 -12
  116. package/package.json +18 -16
  117. package/src/index.ts +3 -0
  118. package/src/lib/components/ErrorBoundary.tsx +1 -1
  119. package/src/lib/components/GeometryDebuggingView.tsx +1 -19
  120. package/src/lib/components/default-components/DefaultCanvas.tsx +3 -3
  121. package/src/lib/config/TLUserPreferences.test.ts +40 -0
  122. package/src/lib/constants.ts +0 -2
  123. package/src/lib/editor/Editor.test.ts +140 -0
  124. package/src/lib/editor/Editor.ts +349 -320
  125. package/src/lib/editor/derivations/notVisibleShapes.ts +37 -23
  126. package/src/lib/editor/derivations/parentsToChildren.ts +18 -7
  127. package/src/lib/editor/managers/ClickManager/ClickManager.test.ts +17 -31
  128. package/src/lib/editor/managers/ClickManager/ClickManager.ts +1 -1
  129. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.test.ts +129 -79
  130. package/src/lib/editor/managers/EdgeScrollManager/EdgeScrollManager.ts +10 -6
  131. package/src/lib/editor/managers/InputsManager/InputsManager.ts +566 -0
  132. package/src/lib/editor/managers/ScribbleManager/ScribbleManager.test.ts +0 -4
  133. package/src/lib/editor/managers/SnapManager/SnapManager.test.ts +12 -0
  134. package/src/lib/editor/managers/SnapManager/SnapManager.ts +1 -1
  135. package/src/lib/editor/managers/TickManager/TickManager.test.ts +40 -107
  136. package/src/lib/editor/managers/TickManager/TickManager.ts +2 -32
  137. package/src/lib/editor/shapes/ShapeUtil.ts +67 -24
  138. package/src/lib/editor/shapes/group/DashedOutlineBox.tsx +1 -1
  139. package/src/lib/editor/tools/BaseBoxShapeTool/children/Pointing.ts +3 -3
  140. package/src/lib/exports/parseCss.test.ts +1 -0
  141. package/src/lib/exports/parseCss.ts +1 -1
  142. package/src/lib/hooks/useEvent.tsx +1 -1
  143. package/src/lib/hooks/useFixSafariDoubleTapZoomPencilEvents.ts +1 -1
  144. package/src/lib/hooks/useGestureEvents.ts +2 -2
  145. package/src/lib/hooks/usePassThroughMouseOverEvents.ts +1 -1
  146. package/src/lib/hooks/usePassThroughWheelEvents.ts +1 -1
  147. package/src/lib/hooks/useScreenBounds.ts +1 -1
  148. package/src/lib/hooks/useStateAttribute.ts +4 -1
  149. package/src/lib/hooks/useTransform.ts +1 -1
  150. package/src/lib/hooks/useZoomCss.ts +3 -8
  151. package/src/lib/options.ts +32 -0
  152. package/src/lib/primitives/Box.ts +9 -0
  153. package/src/lib/primitives/geometry/Geometry2d.ts +1 -0
  154. package/src/lib/utils/rotation.ts +1 -1
  155. package/src/version.ts +3 -3
@@ -104,7 +104,6 @@ var import_assets = require("../utils/assets");
104
104
  var import_debug_flags = require("../utils/debug-flags");
105
105
  var import_deepLinks = require("../utils/deepLinks");
106
106
  var import_getIncrementedName = require("../utils/getIncrementedName");
107
- var import_keyboard = require("../utils/keyboard");
108
107
  var import_reorderShapes = require("../utils/reorderShapes");
109
108
  var import_rotation = require("../utils/rotation");
110
109
  var import_bindingsIndex = require("./derivations/bindingsIndex");
@@ -116,14 +115,15 @@ var import_EdgeScrollManager = require("./managers/EdgeScrollManager/EdgeScrollM
116
115
  var import_FocusManager = require("./managers/FocusManager/FocusManager");
117
116
  var import_FontManager = require("./managers/FontManager/FontManager");
118
117
  var import_HistoryManager = require("./managers/HistoryManager/HistoryManager");
118
+ var import_InputsManager = require("./managers/InputsManager/InputsManager");
119
119
  var import_ScribbleManager = require("./managers/ScribbleManager/ScribbleManager");
120
120
  var import_SnapManager = require("./managers/SnapManager/SnapManager");
121
121
  var import_TextManager = require("./managers/TextManager/TextManager");
122
122
  var import_TickManager = require("./managers/TickManager/TickManager");
123
123
  var import_UserPreferencesManager = require("./managers/UserPreferencesManager/UserPreferencesManager");
124
124
  var import_RootState = require("./tools/RootState");
125
- var __setMetaKeyTimeout_dec, __setCtrlKeyTimeout_dec, __setAltKeyTimeout_dec, __setShiftKeyTimeout_dec, _getIsReadonly_dec, _getIsFocused_dec, _getSharedOpacity_dec, _getSharedStyles_dec, __getSelectionSharedStyles_dec, __getBindingsIndexCache_dec, _getCurrentPageRenderingShapesSorted_dec, _getCurrentPageShapesSorted_dec, _getCurrentPageShapes_dec, _getCurrentPageBounds_dec, _getCulledShapes_dec, _getNotVisibleShapes_dec, __getShapeMaskedPageBoundsCache_dec, __getShapeMaskCache_dec, __getShapeClipPathCache_dec, __getShapePageBoundsCache_dec, __getShapePageTransformCache_dec, __getShapeHandlesCache_dec, __getAllAssetsQuery_dec, _getCurrentPageShapeIdsSorted_dec, _getCurrentPageId_dec, _getPages_dec, __getAllPagesQuery_dec, _getRenderingShapes_dec, _getCollaboratorsOnCurrentPage_dec, _getCollaborators_dec, __getCollaboratorsQuery_dec, _getViewportPageBounds_dec, _getViewportScreenCenter_dec, _getViewportScreenBounds_dec, _getZoomLevel_dec, _getCameraForFollowing_dec, _getViewportPageBoundsForFollowing_dec, _getCamera_dec, __unsafe_getCameraId_dec, _getErasingShapes_dec, _getErasingShapeIds_dec, _getHintingShape_dec, _getHintingShapeIds_dec, _getHoveredShape_dec, _getHoveredShapeId_dec, _getRichTextEditor_dec, _getEditingShape_dec, _getEditingShapeId_dec, _getFocusedGroup_dec, _getFocusedGroupId_dec, _getSelectionRotatedScreenBounds_dec, _getSelectionRotatedPageBounds_dec, _getSelectionRotation_dec, _getSelectionPageBounds_dec, _getOnlySelectedShape_dec, _getOnlySelectedShapeId_dec, _getCurrentPageShapesInReadingOrder_dec, _getSelectedShapes_dec, _getSelectedShapeIds_dec, __getCurrentPageStateId_dec, _getCurrentPageState_dec, __getPageStatesQuery_dec, _getPageStates_dec, _getInstanceState_dec, _getDocumentSettings_dec, _getCurrentToolId_dec, _getCurrentTool_dec, _getPath_dec, _getCanRedo_dec, _getCanUndo_dec, _getIsShapeHiddenCache_dec, _a, _init;
126
- class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_dec = [import_state.computed], _getCanUndo_dec = [import_state.computed], _getCanRedo_dec = [import_state.computed], _getPath_dec = [import_state.computed], _getCurrentTool_dec = [import_state.computed], _getCurrentToolId_dec = [import_state.computed], _getDocumentSettings_dec = [import_state.computed], _getInstanceState_dec = [import_state.computed], _getPageStates_dec = [import_state.computed], __getPageStatesQuery_dec = [import_state.computed], _getCurrentPageState_dec = [import_state.computed], __getCurrentPageStateId_dec = [import_state.computed], _getSelectedShapeIds_dec = [import_state.computed], _getSelectedShapes_dec = [import_state.computed], _getCurrentPageShapesInReadingOrder_dec = [import_state.computed], _getOnlySelectedShapeId_dec = [import_state.computed], _getOnlySelectedShape_dec = [import_state.computed], _getSelectionPageBounds_dec = [import_state.computed], _getSelectionRotation_dec = [import_state.computed], _getSelectionRotatedPageBounds_dec = [import_state.computed], _getSelectionRotatedScreenBounds_dec = [import_state.computed], _getFocusedGroupId_dec = [import_state.computed], _getFocusedGroup_dec = [import_state.computed], _getEditingShapeId_dec = [import_state.computed], _getEditingShape_dec = [import_state.computed], _getRichTextEditor_dec = [import_state.computed], _getHoveredShapeId_dec = [import_state.computed], _getHoveredShape_dec = [import_state.computed], _getHintingShapeIds_dec = [import_state.computed], _getHintingShape_dec = [import_state.computed], _getErasingShapeIds_dec = [import_state.computed], _getErasingShapes_dec = [import_state.computed], __unsafe_getCameraId_dec = [import_state.computed], _getCamera_dec = [import_state.computed], _getViewportPageBoundsForFollowing_dec = [import_state.computed], _getCameraForFollowing_dec = [import_state.computed], _getZoomLevel_dec = [import_state.computed], _getViewportScreenBounds_dec = [import_state.computed], _getViewportScreenCenter_dec = [import_state.computed], _getViewportPageBounds_dec = [import_state.computed], __getCollaboratorsQuery_dec = [import_state.computed], _getCollaborators_dec = [import_state.computed], _getCollaboratorsOnCurrentPage_dec = [import_state.computed], _getRenderingShapes_dec = [import_state.computed], __getAllPagesQuery_dec = [import_state.computed], _getPages_dec = [import_state.computed], _getCurrentPageId_dec = [import_state.computed], _getCurrentPageShapeIdsSorted_dec = [import_state.computed], __getAllAssetsQuery_dec = [import_state.computed], __getShapeHandlesCache_dec = [import_state.computed], __getShapePageTransformCache_dec = [import_state.computed], __getShapePageBoundsCache_dec = [import_state.computed], __getShapeClipPathCache_dec = [import_state.computed], __getShapeMaskCache_dec = [import_state.computed], __getShapeMaskedPageBoundsCache_dec = [import_state.computed], _getNotVisibleShapes_dec = [import_state.computed], _getCulledShapes_dec = [import_state.computed], _getCurrentPageBounds_dec = [import_state.computed], _getCurrentPageShapes_dec = [import_state.computed], _getCurrentPageShapesSorted_dec = [import_state.computed], _getCurrentPageRenderingShapesSorted_dec = [import_state.computed], __getBindingsIndexCache_dec = [import_state.computed], __getSelectionSharedStyles_dec = [import_state.computed], _getSharedStyles_dec = [(0, import_state.computed)({ isEqual: (a, b) => a.equals(b) })], _getSharedOpacity_dec = [import_state.computed], _getIsFocused_dec = [import_state.computed], _getIsReadonly_dec = [import_state.computed], __setShiftKeyTimeout_dec = [import_utils.bind], __setAltKeyTimeout_dec = [import_utils.bind], __setCtrlKeyTimeout_dec = [import_utils.bind], __setMetaKeyTimeout_dec = [import_utils.bind], _a) {
125
+ var __setMetaKeyTimeout_dec, __setCtrlKeyTimeout_dec, __setAltKeyTimeout_dec, __setShiftKeyTimeout_dec, _getIsReadonly_dec, _getIsFocused_dec, _getSharedOpacity_dec, _getSharedStyles_dec, __getSelectionSharedStyles_dec, __getBindingsIndexCache_dec, _getCurrentPageRenderingShapesSorted_dec, _getCurrentPageShapesSorted_dec, _getCurrentPageShapes_dec, _getCurrentPageBounds_dec, _getCulledShapes_dec, _getNotVisibleShapes_dec, __getShapeMaskedPageBoundsCache_dec, __getShapeMaskCache_dec, __getShapeClipPathCache_dec, __getShapePageBoundsCache_dec, __getShapePageTransformCache_dec, __getShapeHandlesCache_dec, __getAllAssetsQuery_dec, _getCurrentPageShapeIdsSorted_dec, _getCurrentPageId_dec, _getPages_dec, __getAllPagesQuery_dec, _getRenderingShapes_dec, _getCollaboratorsOnCurrentPage_dec, _getCollaborators_dec, __getCollaboratorsQuery_dec, _getViewportPageBounds_dec, _getViewportScreenCenter_dec, _getViewportScreenBounds_dec, _getEfficientZoomLevel_dec, __getAboveDebouncedZoomThreshold_dec, _getDebouncedZoomLevel_dec, _getZoomLevel_dec, _getCameraForFollowing_dec, _getViewportPageBoundsForFollowing_dec, _getCamera_dec, __unsafe_getCameraId_dec, _getErasingShapes_dec, _getErasingShapeIds_dec, _getHintingShape_dec, _getHintingShapeIds_dec, _getHoveredShape_dec, _getHoveredShapeId_dec, _getRichTextEditor_dec, _getEditingShape_dec, _getEditingShapeId_dec, _getFocusedGroup_dec, _getFocusedGroupId_dec, _getSelectionRotatedScreenBounds_dec, _getSelectionRotatedPageBounds_dec, _getSelectionRotation_dec, _getSelectionPageBounds_dec, _getOnlySelectedShape_dec, _getOnlySelectedShapeId_dec, _getCurrentPageShapesInReadingOrder_dec, _getSelectedShapes_dec, _getSelectedShapeIds_dec, __getCurrentPageStateId_dec, _getCurrentPageState_dec, __getPageStatesQuery_dec, _getPageStates_dec, _getInstanceState_dec, _getDocumentSettings_dec, _getCurrentToolId_dec, _getCurrentTool_dec, _getPath_dec, _canRedo_dec, _canUndo_dec, _getIsShapeHiddenCache_dec, _a, _init;
126
+ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_dec = [import_state.computed], _canUndo_dec = [import_state.computed], _canRedo_dec = [import_state.computed], _getPath_dec = [import_state.computed], _getCurrentTool_dec = [import_state.computed], _getCurrentToolId_dec = [import_state.computed], _getDocumentSettings_dec = [import_state.computed], _getInstanceState_dec = [import_state.computed], _getPageStates_dec = [import_state.computed], __getPageStatesQuery_dec = [import_state.computed], _getCurrentPageState_dec = [import_state.computed], __getCurrentPageStateId_dec = [import_state.computed], _getSelectedShapeIds_dec = [import_state.computed], _getSelectedShapes_dec = [import_state.computed], _getCurrentPageShapesInReadingOrder_dec = [import_state.computed], _getOnlySelectedShapeId_dec = [import_state.computed], _getOnlySelectedShape_dec = [import_state.computed], _getSelectionPageBounds_dec = [import_state.computed], _getSelectionRotation_dec = [import_state.computed], _getSelectionRotatedPageBounds_dec = [import_state.computed], _getSelectionRotatedScreenBounds_dec = [import_state.computed], _getFocusedGroupId_dec = [import_state.computed], _getFocusedGroup_dec = [import_state.computed], _getEditingShapeId_dec = [import_state.computed], _getEditingShape_dec = [import_state.computed], _getRichTextEditor_dec = [import_state.computed], _getHoveredShapeId_dec = [import_state.computed], _getHoveredShape_dec = [import_state.computed], _getHintingShapeIds_dec = [import_state.computed], _getHintingShape_dec = [import_state.computed], _getErasingShapeIds_dec = [import_state.computed], _getErasingShapes_dec = [import_state.computed], __unsafe_getCameraId_dec = [import_state.computed], _getCamera_dec = [import_state.computed], _getViewportPageBoundsForFollowing_dec = [import_state.computed], _getCameraForFollowing_dec = [import_state.computed], _getZoomLevel_dec = [import_state.computed], _getDebouncedZoomLevel_dec = [import_state.computed], __getAboveDebouncedZoomThreshold_dec = [import_state.computed], _getEfficientZoomLevel_dec = [import_state.computed], _getViewportScreenBounds_dec = [import_state.computed], _getViewportScreenCenter_dec = [import_state.computed], _getViewportPageBounds_dec = [import_state.computed], __getCollaboratorsQuery_dec = [import_state.computed], _getCollaborators_dec = [import_state.computed], _getCollaboratorsOnCurrentPage_dec = [import_state.computed], _getRenderingShapes_dec = [import_state.computed], __getAllPagesQuery_dec = [import_state.computed], _getPages_dec = [import_state.computed], _getCurrentPageId_dec = [import_state.computed], _getCurrentPageShapeIdsSorted_dec = [import_state.computed], __getAllAssetsQuery_dec = [import_state.computed], __getShapeHandlesCache_dec = [import_state.computed], __getShapePageTransformCache_dec = [import_state.computed], __getShapePageBoundsCache_dec = [import_state.computed], __getShapeClipPathCache_dec = [import_state.computed], __getShapeMaskCache_dec = [import_state.computed], __getShapeMaskedPageBoundsCache_dec = [import_state.computed], _getNotVisibleShapes_dec = [import_state.computed], _getCulledShapes_dec = [import_state.computed], _getCurrentPageBounds_dec = [import_state.computed], _getCurrentPageShapes_dec = [import_state.computed], _getCurrentPageShapesSorted_dec = [import_state.computed], _getCurrentPageRenderingShapesSorted_dec = [import_state.computed], __getBindingsIndexCache_dec = [import_state.computed], __getSelectionSharedStyles_dec = [import_state.computed], _getSharedStyles_dec = [(0, import_state.computed)({ isEqual: (a, b) => a.equals(b) })], _getSharedOpacity_dec = [import_state.computed], _getIsFocused_dec = [import_state.computed], _getIsReadonly_dec = [import_state.computed], __setShiftKeyTimeout_dec = [import_utils.bind], __setAltKeyTimeout_dec = [import_utils.bind], __setCtrlKeyTimeout_dec = [import_utils.bind], __setMetaKeyTimeout_dec = [import_utils.bind], _a) {
127
127
  constructor({
128
128
  store,
129
129
  user,
@@ -159,7 +159,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
159
159
  */
160
160
  __publicField(this, "root");
161
161
  /**
162
- * A set of functions to call when the app is disposed.
162
+ * A set of functions to call when the editor is disposed.
163
163
  *
164
164
  * @public
165
165
  */
@@ -170,10 +170,19 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
170
170
  * @public
171
171
  */
172
172
  __publicField(this, "isDisposed", false);
173
- /** @internal */
173
+ /**
174
+ * A manager for the editor's tick events.
175
+ *
176
+ * @internal */
174
177
  __publicField(this, "_tickManager");
175
178
  /**
176
- * A manager for the app's snapping feature.
179
+ * A manager for the editor's input state.
180
+ *
181
+ * @public
182
+ */
183
+ __publicField(this, "inputs");
184
+ /**
185
+ * A manager for the editor's snapping feature.
177
186
  *
178
187
  * @public
179
188
  */
@@ -255,7 +264,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
255
264
  __publicField(this, "bindingUtils");
256
265
  /* --------------------- History -------------------- */
257
266
  /**
258
- * A manager for the app's history.
267
+ * A manager for the editor's history.
259
268
  *
260
269
  * @readonly
261
270
  */
@@ -270,6 +279,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
270
279
  // Rich text editor
271
280
  __publicField(this, "_currentRichTextEditor", (0, import_state.atom)("rich text editor", null));
272
281
  __publicField(this, "_textOptions");
282
+ __publicField(this, "_debouncedZoomLevel", (0, import_state.atom)("debounced zoom level", 1));
273
283
  __publicField(this, "_cameraOptions", (0, import_state.atom)("camera options", import_constants.DEFAULT_CAMERA_OPTIONS));
274
284
  /** @internal */
275
285
  __publicField(this, "_viewportAnimation", null);
@@ -320,54 +330,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
320
330
  tldraw: null,
321
331
  excalidraw: null
322
332
  });
323
- /* --------------------- Events --------------------- */
324
- /**
325
- * The app's current input state.
326
- *
327
- * @public
328
- */
329
- __publicField(this, "inputs", {
330
- /** The most recent pointer down's position in the current page space. */
331
- originPagePoint: new import_Vec.Vec(),
332
- /** The most recent pointer down's position in screen space. */
333
- originScreenPoint: new import_Vec.Vec(),
334
- /** The previous pointer position in the current page space. */
335
- previousPagePoint: new import_Vec.Vec(),
336
- /** The previous pointer position in screen space. */
337
- previousScreenPoint: new import_Vec.Vec(),
338
- /** The most recent pointer position in the current page space. */
339
- currentPagePoint: new import_Vec.Vec(),
340
- /** The most recent pointer position in screen space. */
341
- currentScreenPoint: new import_Vec.Vec(),
342
- /** A set containing the currently pressed keys. */
343
- keys: /* @__PURE__ */ new Set(),
344
- /** A set containing the currently pressed buttons. */
345
- buttons: /* @__PURE__ */ new Set(),
346
- /** Whether the input is from a pe. */
347
- isPen: false,
348
- /** Whether the shift key is currently pressed. */
349
- shiftKey: false,
350
- /** Whether the meta key is currently pressed. */
351
- metaKey: false,
352
- /** Whether the control or command key is currently pressed. */
353
- ctrlKey: false,
354
- /** Whether the alt or option key is currently pressed. */
355
- altKey: false,
356
- /** Whether the user is dragging. */
357
- isDragging: false,
358
- /** Whether the user is pointing. */
359
- isPointing: false,
360
- /** Whether the user is pinching. */
361
- isPinching: false,
362
- /** Whether the user is editing. */
363
- isEditing: false,
364
- /** Whether the user is panning. */
365
- isPanning: false,
366
- /** Whether the user is spacebar panning. */
367
- isSpacebarPanning: false,
368
- /** Velocity of mouse pointer, in pixels per millisecond */
369
- pointerVelocity: new import_Vec.Vec()
370
- });
371
333
  /**
372
334
  * A manager for recording multiple click events.
373
335
  *
@@ -391,8 +353,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
391
353
  /** @internal */
392
354
  __publicField(this, "_restoreToolId", "select");
393
355
  /** @internal */
394
- __publicField(this, "_pinchStart", 1);
395
- /** @internal */
396
356
  __publicField(this, "_didPinch", false);
397
357
  /** @internal */
398
358
  __publicField(this, "_selectedShapeIdsAtPointerDown", []);
@@ -428,6 +388,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
428
388
  this.disposables.add(() => this.textMeasure.dispose());
429
389
  this.fonts = new import_FontManager.FontManager(this, fontAssetUrls);
430
390
  this._tickManager = new import_TickManager.TickManager(this);
391
+ this.inputs = new import_InputsManager.InputsManager(this);
431
392
  class NewRoot extends import_RootState.RootState {
432
393
  static initial = initialState ?? "";
433
394
  }
@@ -894,9 +855,12 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
894
855
  this.history.undo();
895
856
  return this;
896
857
  }
897
- getCanUndo() {
858
+ canUndo() {
898
859
  return this.history.getNumUndos() > 0;
899
860
  }
861
+ getCanUndo() {
862
+ return this.canUndo();
863
+ }
900
864
  /**
901
865
  * Redo to the next mark.
902
866
  *
@@ -913,13 +877,16 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
913
877
  this.history.redo();
914
878
  return this;
915
879
  }
880
+ canRedo() {
881
+ return this.history.getNumRedos() > 0;
882
+ }
883
+ getCanRedo() {
884
+ return this.canRedo();
885
+ }
916
886
  clearHistory() {
917
887
  this.history.clear();
918
888
  return this;
919
889
  }
920
- getCanRedo() {
921
- return this.history.getNumRedos() > 0;
922
- }
923
890
  /**
924
891
  * Create a new "mark", or stopping point, in the undo redo history. Creating a mark will clear
925
892
  * any redos. You typically want to do this just before a user interaction begins or is handled.
@@ -1074,7 +1041,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1074
1041
  }),
1075
1042
  selectionCount: this.getSelectedShapes().length,
1076
1043
  editingShape: editingShapeId ? this.getShape(editingShapeId) : void 0,
1077
- inputs: this.inputs,
1044
+ inputs: this.inputs.toJson(),
1078
1045
  pageState: this.getCurrentPageState(),
1079
1046
  instanceState: this.getInstanceState(),
1080
1047
  collaboratorCount: this.getCollaboratorsOnCurrentPage().length
@@ -1095,7 +1062,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1095
1062
  * we're in a transaction that's about to be rolled back due to the same error we're currently
1096
1063
  * reporting.
1097
1064
  *
1098
- * Instead, to listen to changes to this value, you need to listen to app's `crash` event.
1065
+ * Instead, to listen to changes to this value, you need to listen to editor's `crash` event.
1099
1066
  *
1100
1067
  * @internal
1101
1068
  */
@@ -1746,6 +1713,28 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1746
1713
  const editingShapeId = this.getEditingShapeId();
1747
1714
  return editingShapeId ? this.getShape(editingShapeId) : void 0;
1748
1715
  }
1716
+ /**
1717
+ * Whether the shape can be edited.
1718
+ *
1719
+ * @param shape - The shape (or shape id) to check if it can be edited.
1720
+ * @param info - The info about the edit start.
1721
+ *
1722
+ * @public
1723
+ * @returns true if the shape can be edited, false otherwise.
1724
+ */
1725
+ canEditShape(shape, info) {
1726
+ const id = typeof shape === "string" ? shape : shape?.id ?? null;
1727
+ if (!id) return false;
1728
+ if (id === this.getEditingShapeId()) return false;
1729
+ const _shape = this.getShape(id);
1730
+ if (!_shape) return false;
1731
+ const util = this.getShapeUtil(_shape);
1732
+ const _info = info ?? { type: "unknown" };
1733
+ if (!util.canEdit(_shape, _info)) return false;
1734
+ if (this.getIsReadonly() && !util.canEditInReadonly(_shape)) return false;
1735
+ if (this.isShapeOrAncestorLocked(_shape) && !util.canEditWhileLocked(_shape)) return false;
1736
+ return true;
1737
+ }
1749
1738
  /**
1750
1739
  * Set the current editing shape.
1751
1740
  *
@@ -1761,42 +1750,42 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1761
1750
  */
1762
1751
  setEditingShape(shape) {
1763
1752
  const id = typeof shape === "string" ? shape : shape?.id ?? null;
1764
- this.setRichTextEditor(null);
1765
- const prevEditingShapeId = this.getEditingShapeId();
1766
- if (id !== prevEditingShapeId) {
1767
- if (id) {
1768
- const shape2 = this.getShape(id);
1769
- if (shape2 && this.getShapeUtil(shape2).canEdit(shape2)) {
1770
- this.run(
1771
- () => {
1772
- this._updateCurrentPageState({ editingShapeId: id });
1773
- if (prevEditingShapeId) {
1774
- const prevEditingShape = this.getShape(prevEditingShapeId);
1775
- if (prevEditingShape) {
1776
- this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
1777
- }
1778
- }
1779
- this.getShapeUtil(shape2).onEditStart?.(shape2);
1780
- },
1781
- { history: "ignore" }
1782
- );
1783
- return this;
1784
- }
1785
- }
1753
+ if (!id) {
1786
1754
  this.run(
1787
1755
  () => {
1788
- this._updateCurrentPageState({ editingShapeId: null });
1789
- this._currentRichTextEditor.set(null);
1756
+ const prevEditingShapeId = this.getEditingShapeId();
1790
1757
  if (prevEditingShapeId) {
1791
1758
  const prevEditingShape = this.getShape(prevEditingShapeId);
1792
1759
  if (prevEditingShape) {
1793
1760
  this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
1794
1761
  }
1795
1762
  }
1763
+ this._updateCurrentPageState({ editingShapeId: null });
1764
+ this._currentRichTextEditor.set(null);
1796
1765
  },
1797
1766
  { history: "ignore" }
1798
1767
  );
1768
+ return this;
1799
1769
  }
1770
+ if (!this.canEditShape(id)) return this;
1771
+ this.run(
1772
+ () => {
1773
+ const prevEditingShapeId = this.getEditingShapeId();
1774
+ if (prevEditingShapeId) {
1775
+ const prevEditingShape = this.getShape(prevEditingShapeId);
1776
+ if (prevEditingShape) {
1777
+ this.getShapeUtil(prevEditingShape).onEditEnd?.(prevEditingShape);
1778
+ }
1779
+ }
1780
+ this._updateCurrentPageState({ editingShapeId: null });
1781
+ this._currentRichTextEditor.set(null);
1782
+ this.select(id);
1783
+ this._updateCurrentPageState({ editingShapeId: id });
1784
+ const nextEditingShape = this.getShape(id);
1785
+ this.getShapeUtil(nextEditingShape).onEditStart?.(nextEditingShape);
1786
+ },
1787
+ { history: "ignore" }
1788
+ );
1800
1789
  return this;
1801
1790
  }
1802
1791
  getRichTextEditor() {
@@ -1929,6 +1918,25 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1929
1918
  getCroppingShapeId() {
1930
1919
  return this.getCurrentPageState().croppingShapeId;
1931
1920
  }
1921
+ /**
1922
+ * Whether the shape can be cropped.
1923
+ *
1924
+ * @param shape - The shape (or shape id) to check if it can be cropped.
1925
+ *
1926
+ * @public
1927
+ * @returns true if the shape can be cropped, false otherwise.
1928
+ */
1929
+ canCropShape(shape) {
1930
+ if (!shape) return false;
1931
+ const id = typeof shape === "string" ? shape : shape?.id ?? null;
1932
+ if (!id) return false;
1933
+ const _shape = this.getShape(id);
1934
+ if (!_shape) return false;
1935
+ const util = this.getShapeUtil(_shape);
1936
+ if (!util.canCrop(_shape)) return false;
1937
+ if (this.isShapeOrAncestorLocked(_shape)) return false;
1938
+ return true;
1939
+ }
1932
1940
  /**
1933
1941
  * Set the current cropping shape.
1934
1942
  *
@@ -1950,12 +1958,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
1950
1958
  () => {
1951
1959
  if (!id) {
1952
1960
  this.updateCurrentPageState({ croppingShapeId: null });
1953
- } else {
1954
- const shape2 = this.getShape(id);
1955
- const util = this.getShapeUtil(shape2);
1956
- if (shape2 && util.canCrop(shape2)) {
1957
- this.updateCurrentPageState({ croppingShapeId: id });
1958
- }
1961
+ } else if (this.canCropShape(id)) {
1962
+ this.updateCurrentPageState({ croppingShapeId: id });
1959
1963
  }
1960
1964
  },
1961
1965
  { history: "ignore" }
@@ -2030,6 +2034,22 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2030
2034
  getZoomLevel() {
2031
2035
  return this.getCamera().z;
2032
2036
  }
2037
+ getDebouncedZoomLevel() {
2038
+ if (this.options.debouncedZoom) {
2039
+ if (this.getCameraState() === "idle") {
2040
+ return this.getZoomLevel();
2041
+ } else {
2042
+ return this._debouncedZoomLevel.get();
2043
+ }
2044
+ }
2045
+ return this.getZoomLevel();
2046
+ }
2047
+ _getAboveDebouncedZoomThreshold() {
2048
+ return this.getCurrentPageShapeIds().size > this.options.debouncedZoomThreshold;
2049
+ }
2050
+ getEfficientZoomLevel() {
2051
+ return this._getAboveDebouncedZoomThreshold() ? this.getDebouncedZoomLevel() : this.getZoomLevel();
2052
+ }
2033
2053
  /**
2034
2054
  * Get the camera's initial or reset zoom level.
2035
2055
  *
@@ -2275,7 +2295,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2275
2295
  },
2276
2296
  { history: "ignore" }
2277
2297
  );
2278
- const { currentScreenPoint, currentPagePoint } = this.inputs;
2298
+ const currentScreenPoint = this.inputs.getCurrentScreenPoint();
2299
+ const currentPagePoint = this.inputs.getCurrentPagePoint();
2279
2300
  if (currentScreenPoint.x / z - x !== currentPagePoint.x || currentScreenPoint.y / z - y !== currentPagePoint.y) {
2280
2301
  this.updatePointer({
2281
2302
  immediate: opts?.immediate,
@@ -2410,7 +2431,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2410
2431
  * ```ts
2411
2432
  * editor.zoomIn()
2412
2433
  * editor.zoomIn(editor.getViewportScreenCenter(), { animation: { duration: 200 } })
2413
- * editor.zoomIn(editor.inputs.currentScreenPoint, { animation: { duration: 200 } })
2434
+ * editor.zoomIn(editor.inputs.getCurrentScreenPoint(), { animation: { duration: 200 } })
2414
2435
  * ```
2415
2436
  *
2416
2437
  * @param point - The screen point to zoom in on. Defaults to the screen center
@@ -2451,7 +2472,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2451
2472
  * ```ts
2452
2473
  * editor.zoomOut()
2453
2474
  * editor.zoomOut(editor.getViewportScreenCenter(), { animation: { duration: 120 } })
2454
- * editor.zoomOut(editor.inputs.currentScreenPoint, { animation: { duration: 120 } })
2475
+ * editor.zoomOut(editor.inputs.getCurrentScreenPoint(), { animation: { duration: 120 } })
2455
2476
  * ```
2456
2477
  *
2457
2478
  * @param point - The point to zoom out on. Defaults to the viewport screen center.
@@ -2503,10 +2524,15 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2503
2524
  if (isLocked && !opts?.force) return this;
2504
2525
  const selectionPageBounds = this.getSelectionPageBounds();
2505
2526
  if (selectionPageBounds) {
2506
- this.zoomToBounds(selectionPageBounds, {
2507
- targetZoom: Math.max(1, this.getZoomLevel()),
2508
- ...opts
2509
- });
2527
+ const currentZoom = this.getZoomLevel();
2528
+ if (Math.abs(currentZoom - 1) < 0.01) {
2529
+ this.zoomToBounds(selectionPageBounds, opts);
2530
+ } else {
2531
+ this.zoomToBounds(selectionPageBounds, {
2532
+ targetZoom: 1,
2533
+ ...opts
2534
+ });
2535
+ }
2510
2536
  }
2511
2537
  return this;
2512
2538
  }
@@ -2546,7 +2572,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2546
2572
  const cameraOptions = this._cameraOptions.__unsafe__getWithoutCapture();
2547
2573
  if (cameraOptions.isLocked && !opts?.force) return this;
2548
2574
  const viewportScreenBounds = this.getViewportScreenBounds();
2549
- const inset = opts?.inset ?? Math.min(import_constants.ZOOM_TO_FIT_PADDING, viewportScreenBounds.width * 0.28);
2575
+ const inset = opts?.inset ?? Math.min(this.options.zoomToFitPadding, viewportScreenBounds.width * 0.28);
2550
2576
  const baseZoom = this.getBaseZoom();
2551
2577
  const zoomMin = cameraOptions.zoomSteps[0];
2552
2578
  const zoomMax = (0, import_utils.last)(cameraOptions.zoomSteps);
@@ -2784,7 +2810,6 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
2784
2810
  this._setCamera(import_Vec.Vec.From({ ...this.getCamera() }));
2785
2811
  }
2786
2812
  }
2787
- this._tickCameraState();
2788
2813
  return this;
2789
2814
  }
2790
2815
  getViewportScreenBounds() {
@@ -3064,6 +3089,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
3064
3089
  this._cameraStateTimeoutRemaining = this.options.cameraMovingTimeoutMs;
3065
3090
  if (this._cameraState.__unsafe__getWithoutCapture() !== "idle") return;
3066
3091
  this._cameraState.set("moving");
3092
+ this._debouncedZoomLevel.set((0, import_state.unsafe__withoutCapture)(() => this.getCamera().z));
3067
3093
  this.on("tick", this._decayCameraStateTimeout);
3068
3094
  }
3069
3095
  /**
@@ -5663,8 +5689,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
5663
5689
  isAspectRatioLocked: options.isAspectRatioLocked
5664
5690
  });
5665
5691
  if (Math.sign(scale.x) * Math.sign(scale.y) < 0) {
5666
- let { rotation } = import_Mat.Mat.Decompose(options.initialPageTransform);
5667
- rotation -= 2 * rotation;
5692
+ const parentRotation = this.getShapeParentTransform(id).rotation();
5693
+ const rotation = -options.initialShape.rotation - 2 * parentRotation;
5668
5694
  this.updateShapes([{ id, type, rotation }]);
5669
5695
  }
5670
5696
  const preScaleShapePageCenter = import_Mat.Mat.applyToPoint(
@@ -5677,9 +5703,9 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
5677
5703
  scale,
5678
5704
  options.scaleAxisRotation
5679
5705
  );
5680
- const pageBounds = this.getShapePageBounds(id);
5681
5706
  const pageTransform = this.getShapePageTransform(id);
5682
- const currentPageCenter = pageBounds.center;
5707
+ const currentLocalBounds = this.getShapeGeometry(id).bounds;
5708
+ const currentPageCenter = import_Mat.Mat.applyToPoint(pageTransform, currentLocalBounds.center);
5683
5709
  const shapePageTransformOrigin = pageTransform.point();
5684
5710
  if (!currentPageCenter || !shapePageTransformOrigin) return this;
5685
5711
  const pageDelta = import_Vec.Vec.Sub(postScaleShapePageCenter, currentPageCenter);
@@ -5965,7 +5991,11 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
5965
5991
  )
5966
5992
  );
5967
5993
  const sortedShapeIds = shapesToGroup.sort(import_utils.sortByIndex).map((s) => s.id);
5968
- const pageBounds = import_Box.Box.Common((0, import_utils.compact)(shapesToGroup.map((id) => this.getShapePageBounds(id))));
5994
+ const childBounds = (0, import_utils.compact)(shapesToGroup.map((shape) => this.getShapePageBounds(shape)));
5995
+ const pageBounds = import_Box.Box.Common(childBounds);
5996
+ if (!pageBounds.isValid()) {
5997
+ throw Error(`Editor.groupShapes: group bounds are invalid (NaN).`);
5998
+ }
5969
5999
  const { x, y } = pageBounds.point;
5970
6000
  const parentId = this.findCommonAncestor(shapesToGroup) ?? this.getCurrentPageId();
5971
6001
  if (this.getCurrentToolId() !== "select") return this;
@@ -6918,60 +6948,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
6918
6948
  height
6919
6949
  };
6920
6950
  }
6921
- /**
6922
- * Update the input points from a pointer, pinch, or wheel event.
6923
- *
6924
- * @param info - The event info.
6925
- */
6926
- _updateInputsFromEvent(info) {
6927
- const {
6928
- pointerVelocity,
6929
- previousScreenPoint,
6930
- previousPagePoint,
6931
- currentScreenPoint,
6932
- currentPagePoint,
6933
- originScreenPoint,
6934
- originPagePoint
6935
- } = this.inputs;
6936
- const { screenBounds } = this.store.unsafeGetWithoutCapture(import_tlschema.TLINSTANCE_ID);
6937
- const { x: cx, y: cy, z: cz } = (0, import_state.unsafe__withoutCapture)(() => this.getCamera());
6938
- const sx = info.point.x - screenBounds.x;
6939
- const sy = info.point.y - screenBounds.y;
6940
- const sz = info.point.z ?? 0.5;
6941
- previousScreenPoint.setTo(currentScreenPoint);
6942
- previousPagePoint.setTo(currentPagePoint);
6943
- currentScreenPoint.set(sx, sy);
6944
- const nx = sx / cz - cx;
6945
- const ny = sy / cz - cy;
6946
- if (isFinite(nx) && isFinite(ny)) {
6947
- currentPagePoint.set(nx, ny, sz);
6948
- }
6949
- this.inputs.isPen = info.type === "pointer" && info.isPen;
6950
- if (info.name === "pointer_down" || this.inputs.isPinching) {
6951
- pointerVelocity.set(0, 0);
6952
- originScreenPoint.setTo(currentScreenPoint);
6953
- originPagePoint.setTo(currentPagePoint);
6954
- }
6955
- this.run(
6956
- () => {
6957
- this.store.put([
6958
- {
6959
- id: import_tlschema.TLPOINTER_ID,
6960
- typeName: "pointer",
6961
- x: currentPagePoint.x,
6962
- y: currentPagePoint.y,
6963
- lastActivityTimestamp: (
6964
- // If our pointer moved only because we're following some other user, then don't
6965
- // update our last activity timestamp; otherwise, update it to the current timestamp.
6966
- info.type === "pointer" && info.pointerId === import_constants.INTERNAL_POINTER_IDS.CAMERA_MOVE ? this.store.unsafeGetWithoutCapture(import_tlschema.TLPOINTER_ID)?.lastActivityTimestamp ?? this._tickManager.now : this._tickManager.now
6967
- ),
6968
- meta: {}
6969
- }
6970
- ]);
6971
- },
6972
- { history: "ignore" }
6973
- );
6974
- }
6951
+ /* --------------------- Events --------------------- */
6975
6952
  /**
6976
6953
  * Dispatch a cancel event.
6977
6954
  *
@@ -7036,18 +7013,19 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7036
7013
  point: options?.point ?? // weird but true: what `inputs` calls screen-space is actually viewport space. so
7037
7014
  // we need to convert back into true screen space first. we should fix this...
7038
7015
  import_Vec.Vec.Add(
7039
- this.inputs.currentScreenPoint,
7016
+ this.inputs.getCurrentScreenPoint(),
7040
7017
  this.store.unsafeGetWithoutCapture(import_tlschema.TLINSTANCE_ID).screenBounds
7041
7018
  ),
7042
7019
  pointerId: options?.pointerId ?? 0,
7043
7020
  button: options?.button ?? 0,
7044
- isPen: options?.isPen ?? this.inputs.isPen,
7045
- shiftKey: options?.shiftKey ?? this.inputs.shiftKey,
7046
- altKey: options?.altKey ?? this.inputs.altKey,
7047
- ctrlKey: options?.ctrlKey ?? this.inputs.ctrlKey,
7048
- metaKey: options?.metaKey ?? this.inputs.metaKey,
7049
- accelKey: options?.accelKey ?? (0, import_keyboard.isAccelKey)(this.inputs)
7021
+ isPen: options?.isPen ?? this.inputs.getIsPen(),
7022
+ shiftKey: options?.shiftKey ?? this.inputs.getShiftKey(),
7023
+ altKey: options?.altKey ?? this.inputs.getAltKey(),
7024
+ ctrlKey: options?.ctrlKey ?? this.inputs.getCtrlKey(),
7025
+ metaKey: options?.metaKey ?? this.inputs.getMetaKey(),
7026
+ accelKey: false
7050
7027
  };
7028
+ event.accelKey = options?.accelKey ?? this.inputs.getAccelKey();
7051
7029
  if (options?.immediate) {
7052
7030
  this._flushEventForTick(event);
7053
7031
  } else {
@@ -7363,58 +7341,58 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7363
7341
  this._clickManager.cancelDoubleClickTimeout();
7364
7342
  }
7365
7343
  _setShiftKeyTimeout() {
7366
- this.inputs.shiftKey = false;
7344
+ this.inputs.setShiftKey(false);
7367
7345
  this.dispatch({
7368
7346
  type: "keyboard",
7369
7347
  name: "key_up",
7370
7348
  key: "Shift",
7371
- shiftKey: this.inputs.shiftKey,
7372
- ctrlKey: this.inputs.ctrlKey,
7373
- altKey: this.inputs.altKey,
7374
- metaKey: this.inputs.metaKey,
7375
- accelKey: (0, import_keyboard.isAccelKey)(this.inputs),
7349
+ shiftKey: this.inputs.getShiftKey(),
7350
+ ctrlKey: this.inputs.getCtrlKey(),
7351
+ altKey: this.inputs.getAltKey(),
7352
+ metaKey: this.inputs.getMetaKey(),
7353
+ accelKey: this.inputs.getAccelKey(),
7376
7354
  code: "ShiftLeft"
7377
7355
  });
7378
7356
  }
7379
7357
  _setAltKeyTimeout() {
7380
- this.inputs.altKey = false;
7358
+ this.inputs.setAltKey(false);
7381
7359
  this.dispatch({
7382
7360
  type: "keyboard",
7383
7361
  name: "key_up",
7384
7362
  key: "Alt",
7385
- shiftKey: this.inputs.shiftKey,
7386
- ctrlKey: this.inputs.ctrlKey,
7387
- altKey: this.inputs.altKey,
7388
- metaKey: this.inputs.metaKey,
7389
- accelKey: (0, import_keyboard.isAccelKey)(this.inputs),
7363
+ shiftKey: this.inputs.getShiftKey(),
7364
+ ctrlKey: this.inputs.getCtrlKey(),
7365
+ altKey: this.inputs.getAltKey(),
7366
+ metaKey: this.inputs.getMetaKey(),
7367
+ accelKey: this.inputs.getAccelKey(),
7390
7368
  code: "AltLeft"
7391
7369
  });
7392
7370
  }
7393
7371
  _setCtrlKeyTimeout() {
7394
- this.inputs.ctrlKey = false;
7372
+ this.inputs.setCtrlKey(false);
7395
7373
  this.dispatch({
7396
7374
  type: "keyboard",
7397
7375
  name: "key_up",
7398
7376
  key: "Ctrl",
7399
- shiftKey: this.inputs.shiftKey,
7400
- ctrlKey: this.inputs.ctrlKey,
7401
- altKey: this.inputs.altKey,
7402
- metaKey: this.inputs.metaKey,
7403
- accelKey: (0, import_keyboard.isAccelKey)(this.inputs),
7377
+ shiftKey: this.inputs.getShiftKey(),
7378
+ ctrlKey: this.inputs.getCtrlKey(),
7379
+ altKey: this.inputs.getAltKey(),
7380
+ metaKey: this.inputs.getMetaKey(),
7381
+ accelKey: this.inputs.getAccelKey(),
7404
7382
  code: "ControlLeft"
7405
7383
  });
7406
7384
  }
7407
7385
  _setMetaKeyTimeout() {
7408
- this.inputs.metaKey = false;
7386
+ this.inputs.setMetaKey(false);
7409
7387
  this.dispatch({
7410
7388
  type: "keyboard",
7411
7389
  name: "key_up",
7412
7390
  key: "Meta",
7413
- shiftKey: this.inputs.shiftKey,
7414
- ctrlKey: this.inputs.ctrlKey,
7415
- altKey: this.inputs.altKey,
7416
- metaKey: this.inputs.metaKey,
7417
- accelKey: (0, import_keyboard.isAccelKey)(this.inputs),
7391
+ shiftKey: this.inputs.getShiftKey(),
7392
+ ctrlKey: this.inputs.getCtrlKey(),
7393
+ altKey: this.inputs.getAltKey(),
7394
+ metaKey: this.inputs.getMetaKey(),
7395
+ accelKey: this.inputs.getAccelKey(),
7418
7396
  code: "MetaLeft"
7419
7397
  });
7420
7398
  }
@@ -7485,10 +7463,10 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7485
7463
  const { type } = info;
7486
7464
  if (info.type === "misc") {
7487
7465
  if (info.name === "cancel" || info.name === "complete") {
7488
- this.inputs.isDragging = false;
7489
- if (this.inputs.isPanning) {
7490
- this.inputs.isPanning = false;
7491
- this.inputs.isSpacebarPanning = false;
7466
+ this.inputs.setIsDragging(false);
7467
+ if (this.inputs.getIsPanning()) {
7468
+ this.inputs.setIsPanning(false);
7469
+ this.inputs.setIsSpacebarPanning(false);
7492
7470
  this.setCursor({ type: this._prevCursor, rotation: 0 });
7493
7471
  }
7494
7472
  }
@@ -7499,34 +7477,33 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7499
7477
  if (info.shiftKey) {
7500
7478
  clearTimeout(this._shiftKeyTimeout);
7501
7479
  this._shiftKeyTimeout = -1;
7502
- inputs.shiftKey = true;
7503
- } else if (!info.shiftKey && inputs.shiftKey && this._shiftKeyTimeout === -1) {
7480
+ inputs.setShiftKey(true);
7481
+ } else if (!info.shiftKey && inputs.getShiftKey() && this._shiftKeyTimeout === -1) {
7504
7482
  this._shiftKeyTimeout = this.timers.setTimeout(this._setShiftKeyTimeout, 150);
7505
7483
  }
7506
7484
  if (info.altKey) {
7507
7485
  clearTimeout(this._altKeyTimeout);
7508
7486
  this._altKeyTimeout = -1;
7509
- inputs.altKey = true;
7510
- } else if (!info.altKey && inputs.altKey && this._altKeyTimeout === -1) {
7487
+ inputs.setAltKey(true);
7488
+ } else if (!info.altKey && inputs.getAltKey() && this._altKeyTimeout === -1) {
7511
7489
  this._altKeyTimeout = this.timers.setTimeout(this._setAltKeyTimeout, 150);
7512
7490
  }
7513
7491
  if (info.ctrlKey) {
7514
7492
  clearTimeout(this._ctrlKeyTimeout);
7515
7493
  this._ctrlKeyTimeout = -1;
7516
- inputs.ctrlKey = true;
7517
- } else if (!info.ctrlKey && inputs.ctrlKey && this._ctrlKeyTimeout === -1) {
7494
+ inputs.setCtrlKey(true);
7495
+ } else if (!info.ctrlKey && inputs.getCtrlKey() && this._ctrlKeyTimeout === -1) {
7518
7496
  this._ctrlKeyTimeout = this.timers.setTimeout(this._setCtrlKeyTimeout, 150);
7519
7497
  }
7520
7498
  if (info.metaKey) {
7521
7499
  clearTimeout(this._metaKeyTimeout);
7522
7500
  this._metaKeyTimeout = -1;
7523
- inputs.metaKey = true;
7524
- } else if (!info.metaKey && inputs.metaKey && this._metaKeyTimeout === -1) {
7501
+ inputs.setMetaKey(true);
7502
+ } else if (!info.metaKey && inputs.getMetaKey() && this._metaKeyTimeout === -1) {
7525
7503
  this._metaKeyTimeout = this.timers.setTimeout(this._setMetaKeyTimeout, 150);
7526
7504
  }
7527
- const { originPagePoint, currentPagePoint } = inputs;
7528
- if (!inputs.isPointing) {
7529
- inputs.isDragging = false;
7505
+ if (!inputs.getIsPointing()) {
7506
+ inputs.setIsDragging(false);
7530
7507
  }
7531
7508
  const instanceState = this.store.unsafeGetWithoutCapture(import_tlschema.TLINSTANCE_ID);
7532
7509
  const pageState = this.store.get(this._getCurrentPageStateId());
@@ -7535,23 +7512,23 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7535
7512
  case "pinch": {
7536
7513
  if (cameraOptions.isLocked) return;
7537
7514
  clearTimeout(this._longPressTimeout);
7538
- this._updateInputsFromEvent(info);
7515
+ this.inputs.updateFromEvent(info);
7539
7516
  switch (info.name) {
7540
7517
  case "pinch_start": {
7541
- if (inputs.isPinching) return;
7542
- if (!inputs.isEditing) {
7543
- this._pinchStart = this.getCamera().z;
7518
+ if (inputs.getIsPinching()) return;
7519
+ if (!inputs.getIsEditing()) {
7544
7520
  if (!this._selectedShapeIdsAtPointerDown.length) {
7545
7521
  this._selectedShapeIdsAtPointerDown = [...pageState.selectedShapeIds];
7546
7522
  }
7547
7523
  this._didPinch = true;
7548
- inputs.isPinching = true;
7524
+ inputs.setIsPinching(true);
7549
7525
  this.interrupt();
7550
7526
  }
7527
+ this.emit("event", info);
7551
7528
  return;
7552
7529
  }
7553
7530
  case "pinch": {
7554
- if (!inputs.isPinching) return;
7531
+ if (!inputs.getIsPinching()) return;
7555
7532
  const {
7556
7533
  point: { z = 1 },
7557
7534
  delta: { x: dx, y: dy }
@@ -7575,11 +7552,12 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7575
7552
  ),
7576
7553
  { immediate: true }
7577
7554
  );
7555
+ this.emit("event", info);
7578
7556
  return;
7579
7557
  }
7580
7558
  case "pinch_end": {
7581
- if (!inputs.isPinching) return this;
7582
- inputs.isPinching = false;
7559
+ if (!inputs.getIsPinching()) return this;
7560
+ inputs.setIsPinching(false);
7583
7561
  const { _selectedShapeIdsAtPointerDown: shapesToReselect } = this;
7584
7562
  this.setSelectedShapes(this._selectedShapeIdsAtPointerDown);
7585
7563
  this._selectedShapeIdsAtPointerDown = [];
@@ -7593,13 +7571,14 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7593
7571
  });
7594
7572
  }
7595
7573
  }
7574
+ this.emit("event", info);
7596
7575
  return;
7597
7576
  }
7598
7577
  }
7599
7578
  }
7600
7579
  case "wheel": {
7601
7580
  if (cameraOptions.isLocked) return;
7602
- this._updateInputsFromEvent(info);
7581
+ this.inputs.updateFromEvent(info);
7603
7582
  const { panSpeed, zoomSpeed } = cameraOptions;
7604
7583
  let wheelBehavior = cameraOptions.wheelBehavior;
7605
7584
  const inputMode = this.user.getUserPreferences().inputMode;
@@ -7617,7 +7596,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7617
7596
  if (info.ctrlKey) behavior = wheelBehavior === "pan" ? "zoom" : "pan";
7618
7597
  switch (behavior) {
7619
7598
  case "zoom": {
7620
- const { x, y } = this.inputs.currentScreenPoint;
7599
+ const { x, y } = this.inputs.getCurrentScreenPoint();
7621
7600
  let delta = dz;
7622
7601
  if (wheelBehavior === "zoom") {
7623
7602
  if (Math.abs(dy) > 10) {
@@ -7631,6 +7610,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7631
7610
  immediate: true
7632
7611
  });
7633
7612
  this.maybeTrackPerformance("Zooming");
7613
+ this.root.handleEvent(info);
7614
+ this.emit("event", info);
7634
7615
  return;
7635
7616
  }
7636
7617
  case "pan": {
@@ -7638,6 +7619,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7638
7619
  immediate: true
7639
7620
  });
7640
7621
  this.maybeTrackPerformance("Panning");
7622
+ this.root.handleEvent(info);
7623
+ this.emit("event", info);
7641
7624
  return;
7642
7625
  }
7643
7626
  }
@@ -7645,14 +7628,14 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7645
7628
  break;
7646
7629
  }
7647
7630
  case "pointer": {
7648
- if (inputs.isPinching) return;
7649
- this._updateInputsFromEvent(info);
7631
+ if (inputs.getIsPinching()) return;
7632
+ this.inputs.updateFromEvent(info);
7650
7633
  const { isPen } = info;
7651
7634
  const { isPenMode } = instanceState;
7652
7635
  switch (info.name) {
7653
7636
  case "pointer_down": {
7654
7637
  if (isPenMode && !isPen) return;
7655
- if (!this.inputs.isPanning) {
7638
+ if (!this.inputs.getIsPanning()) {
7656
7639
  this._longPressTimeout = this.timers.setTimeout(() => {
7657
7640
  const vsb = this.getViewportScreenBounds();
7658
7641
  this.dispatch({
@@ -7661,7 +7644,7 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7661
7644
  // viewport bounds, and will be again when this event is handled...
7662
7645
  // so we need to counter-adjust from the stored value so that the
7663
7646
  // new value is set correctly.
7664
- point: this.inputs.originScreenPoint.clone().addXY(vsb.x, vsb.y),
7647
+ point: this.inputs.getOriginScreenPoint().clone().addXY(vsb.x, vsb.y),
7665
7648
  name: "long_press"
7666
7649
  });
7667
7650
  }, this.options.longPressDurationMs);
@@ -7669,21 +7652,21 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7669
7652
  this._selectedShapeIdsAtPointerDown = this.getSelectedShapeIds();
7670
7653
  if (info.button === import_constants.LEFT_MOUSE_BUTTON) this.capturedPointerId = info.pointerId;
7671
7654
  inputs.buttons.add(info.button);
7672
- inputs.isPointing = true;
7673
- inputs.isDragging = false;
7655
+ inputs.setIsPointing(true);
7656
+ inputs.setIsDragging(false);
7674
7657
  if (!isPenMode && isPen) this.updateInstanceState({ isPenMode: true });
7675
7658
  if (info.button === import_constants.STYLUS_ERASER_BUTTON) {
7676
7659
  this._restoreToolId = this.getCurrentToolId();
7677
7660
  this.complete();
7678
7661
  this.setCurrentTool("eraser");
7679
7662
  } else if (info.button === import_constants.MIDDLE_MOUSE_BUTTON) {
7680
- if (!this.inputs.isPanning) {
7663
+ if (!this.inputs.getIsPanning()) {
7681
7664
  this._prevCursor = this.getInstanceState().cursor.type;
7682
7665
  }
7683
- this.inputs.isPanning = true;
7666
+ this.inputs.setIsPanning(true);
7684
7667
  clearTimeout(this._longPressTimeout);
7685
7668
  }
7686
- if (this.inputs.isPanning) {
7669
+ if (this.inputs.getIsPanning()) {
7687
7670
  this.stopCameraAnimation();
7688
7671
  this.setCursor({ type: "grabbing", rotation: 0 });
7689
7672
  return this;
@@ -7693,8 +7676,9 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7693
7676
  case "pointer_move": {
7694
7677
  if (!isPen && isPenMode) return;
7695
7678
  const { x: cx, y: cy, z: cz } = (0, import_state.unsafe__withoutCapture)(() => this.getCamera());
7696
- if (this.inputs.isPanning && this.inputs.isPointing) {
7697
- const { currentScreenPoint, previousScreenPoint } = this.inputs;
7679
+ if (this.inputs.getIsPanning() && this.inputs.getIsPointing()) {
7680
+ const currentScreenPoint = this.inputs.getCurrentScreenPoint();
7681
+ const previousScreenPoint = this.inputs.getPreviousScreenPoint();
7698
7682
  const offset = import_Vec.Vec.Sub(currentScreenPoint, previousScreenPoint);
7699
7683
  this.setCamera(new import_Vec.Vec(cx + offset.x / cz, cy + offset.y / cz, cz), {
7700
7684
  immediate: true
@@ -7702,15 +7686,15 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7702
7686
  this.maybeTrackPerformance("Panning");
7703
7687
  return;
7704
7688
  }
7705
- if (inputs.isPointing && !inputs.isDragging && import_Vec.Vec.Dist2(originPagePoint, currentPagePoint) * this.getZoomLevel() > (instanceState.isCoarsePointer ? this.options.coarseDragDistanceSquared : this.options.dragDistanceSquared) / cz) {
7706
- inputs.isDragging = true;
7689
+ if (inputs.getIsPointing() && !inputs.getIsDragging() && import_Vec.Vec.Dist2(inputs.getOriginPagePoint(), inputs.getCurrentPagePoint()) * this.getZoomLevel() > (instanceState.isCoarsePointer ? this.options.coarseDragDistanceSquared : this.options.dragDistanceSquared) / cz) {
7690
+ inputs.setIsDragging(true);
7707
7691
  clearTimeout(this._longPressTimeout);
7708
7692
  }
7709
7693
  break;
7710
7694
  }
7711
7695
  case "pointer_up": {
7712
- inputs.isDragging = false;
7713
- inputs.isPointing = false;
7696
+ inputs.setIsDragging(false);
7697
+ inputs.setIsPointing(false);
7714
7698
  clearTimeout(this._longPressTimeout);
7715
7699
  inputs.buttons.delete(info.button);
7716
7700
  if (instanceState.isPenMode && !isPen) return;
@@ -7718,12 +7702,12 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7718
7702
  this.capturedPointerId = null;
7719
7703
  info.button = 0;
7720
7704
  }
7721
- if (inputs.isPanning) {
7705
+ if (inputs.getIsPanning()) {
7722
7706
  if (!inputs.keys.has("Space")) {
7723
- inputs.isPanning = false;
7724
- inputs.isSpacebarPanning = false;
7707
+ inputs.setIsPanning(false);
7708
+ inputs.setIsSpacebarPanning(false);
7725
7709
  }
7726
- const slideDirection = this.inputs.pointerVelocity;
7710
+ const slideDirection = this.inputs.getPointerVelocity();
7727
7711
  const slideSpeed = Math.min(2, slideDirection.len());
7728
7712
  switch (info.button) {
7729
7713
  case import_constants.LEFT_MOUSE_BUTTON: {
@@ -7760,51 +7744,58 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7760
7744
  switch (info.name) {
7761
7745
  case "key_down": {
7762
7746
  inputs.keys.add(info.code);
7763
- if (info.code === "Space" && !info.ctrlKey) {
7764
- if (!this.inputs.isPanning) {
7765
- this._prevCursor = instanceState.cursor.type;
7766
- }
7767
- this.inputs.isPanning = true;
7768
- this.inputs.isSpacebarPanning = true;
7769
- clearTimeout(this._longPressTimeout);
7770
- this.setCursor({ type: this.inputs.isPointing ? "grabbing" : "grab", rotation: 0 });
7771
- }
7772
- if (this.inputs.isSpacebarPanning) {
7773
- let offset;
7774
- switch (info.code) {
7775
- case "ArrowUp": {
7776
- offset = new import_Vec.Vec(0, -1);
7777
- break;
7747
+ if (this.options.spacebarPanning) {
7748
+ if (info.code === "Space" && !info.ctrlKey) {
7749
+ if (!this.inputs.getIsPanning()) {
7750
+ this._prevCursor = instanceState.cursor.type;
7778
7751
  }
7779
- case "ArrowRight": {
7780
- offset = new import_Vec.Vec(1, 0);
7781
- break;
7782
- }
7783
- case "ArrowDown": {
7784
- offset = new import_Vec.Vec(0, 1);
7785
- break;
7752
+ this.inputs.setIsPanning(true);
7753
+ this.inputs.setIsSpacebarPanning(true);
7754
+ clearTimeout(this._longPressTimeout);
7755
+ this.setCursor({
7756
+ type: this.inputs.getIsPointing() ? "grabbing" : "grab",
7757
+ rotation: 0
7758
+ });
7759
+ }
7760
+ if (this.inputs.getIsSpacebarPanning()) {
7761
+ let offset;
7762
+ switch (info.code) {
7763
+ case "ArrowUp": {
7764
+ offset = new import_Vec.Vec(0, -1);
7765
+ break;
7766
+ }
7767
+ case "ArrowRight": {
7768
+ offset = new import_Vec.Vec(1, 0);
7769
+ break;
7770
+ }
7771
+ case "ArrowDown": {
7772
+ offset = new import_Vec.Vec(0, 1);
7773
+ break;
7774
+ }
7775
+ case "ArrowLeft": {
7776
+ offset = new import_Vec.Vec(-1, 0);
7777
+ break;
7778
+ }
7786
7779
  }
7787
- case "ArrowLeft": {
7788
- offset = new import_Vec.Vec(-1, 0);
7789
- break;
7780
+ if (offset) {
7781
+ const bounds = this.getViewportPageBounds();
7782
+ const next = bounds.clone().translate(offset.mulV({ x: bounds.w, y: bounds.h }));
7783
+ this._animateToViewport(next, { animation: { duration: 320 } });
7790
7784
  }
7791
7785
  }
7792
- if (offset) {
7793
- const bounds = this.getViewportPageBounds();
7794
- const next = bounds.clone().translate(offset.mulV({ x: bounds.w, y: bounds.h }));
7795
- this._animateToViewport(next, { animation: { duration: 320 } });
7796
- }
7797
7786
  }
7798
7787
  break;
7799
7788
  }
7800
7789
  case "key_up": {
7801
7790
  inputs.keys.delete(info.code);
7802
- if (info.code === "Space") {
7803
- if (this.inputs.buttons.has(import_constants.MIDDLE_MOUSE_BUTTON)) {
7804
- } else {
7805
- this.inputs.isPanning = false;
7806
- this.inputs.isSpacebarPanning = false;
7807
- this.setCursor({ type: this._prevCursor, rotation: 0 });
7791
+ if (this.options.spacebarPanning) {
7792
+ if (info.code === "Space") {
7793
+ if (this.inputs.buttons.has(import_constants.MIDDLE_MOUSE_BUTTON)) {
7794
+ } else {
7795
+ this.inputs.setIsPanning(false);
7796
+ this.inputs.setIsSpacebarPanning(false);
7797
+ this.setCursor({ type: this._prevCursor, rotation: 0 });
7798
+ }
7808
7799
  }
7809
7800
  }
7810
7801
  break;
@@ -7857,8 +7848,8 @@ class Editor extends (_a = import_eventemitter3.default, _getIsShapeHiddenCache_
7857
7848
  }
7858
7849
  _init = __decoratorStart(_a);
7859
7850
  __decorateElement(_init, 1, "getIsShapeHiddenCache", _getIsShapeHiddenCache_dec, Editor);
7860
- __decorateElement(_init, 1, "getCanUndo", _getCanUndo_dec, Editor);
7861
- __decorateElement(_init, 1, "getCanRedo", _getCanRedo_dec, Editor);
7851
+ __decorateElement(_init, 1, "canUndo", _canUndo_dec, Editor);
7852
+ __decorateElement(_init, 1, "canRedo", _canRedo_dec, Editor);
7862
7853
  __decorateElement(_init, 1, "getPath", _getPath_dec, Editor);
7863
7854
  __decorateElement(_init, 1, "getCurrentTool", _getCurrentTool_dec, Editor);
7864
7855
  __decorateElement(_init, 1, "getCurrentToolId", _getCurrentToolId_dec, Editor);
@@ -7893,6 +7884,9 @@ __decorateElement(_init, 1, "getCamera", _getCamera_dec, Editor);
7893
7884
  __decorateElement(_init, 1, "getViewportPageBoundsForFollowing", _getViewportPageBoundsForFollowing_dec, Editor);
7894
7885
  __decorateElement(_init, 1, "getCameraForFollowing", _getCameraForFollowing_dec, Editor);
7895
7886
  __decorateElement(_init, 1, "getZoomLevel", _getZoomLevel_dec, Editor);
7887
+ __decorateElement(_init, 1, "getDebouncedZoomLevel", _getDebouncedZoomLevel_dec, Editor);
7888
+ __decorateElement(_init, 1, "_getAboveDebouncedZoomThreshold", __getAboveDebouncedZoomThreshold_dec, Editor);
7889
+ __decorateElement(_init, 1, "getEfficientZoomLevel", _getEfficientZoomLevel_dec, Editor);
7896
7890
  __decorateElement(_init, 1, "getViewportScreenBounds", _getViewportScreenBounds_dec, Editor);
7897
7891
  __decorateElement(_init, 1, "getViewportScreenCenter", _getViewportScreenCenter_dec, Editor);
7898
7892
  __decorateElement(_init, 1, "getViewportPageBounds", _getViewportPageBounds_dec, Editor);