kritzel-stencil 0.0.153 → 0.0.154

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 (138) hide show
  1. package/dist/cjs/{default-text-tool.config-Cds94FE8.js → default-text-tool.config-BySzvIox.js} +53 -39
  2. package/dist/cjs/default-text-tool.config-BySzvIox.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +1 -1
  4. package/dist/cjs/kritzel-color_22.cjs.entry.js +110 -64
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/stencil.cjs.js +1 -1
  7. package/dist/collection/classes/core/core.class.js +16 -14
  8. package/dist/collection/classes/core/core.class.js.map +1 -1
  9. package/dist/collection/classes/core/store.class.js +8 -8
  10. package/dist/collection/classes/core/store.class.js.map +1 -1
  11. package/dist/collection/classes/core/viewport.class.js +1 -1
  12. package/dist/collection/classes/core/viewport.class.js.map +1 -1
  13. package/dist/collection/classes/handlers/context-menu.handler.js +1 -1
  14. package/dist/collection/classes/handlers/context-menu.handler.js.map +1 -1
  15. package/dist/collection/classes/handlers/move.handler.js +2 -0
  16. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  17. package/dist/collection/classes/handlers/resize.handler.js +2 -0
  18. package/dist/collection/classes/handlers/resize.handler.js.map +1 -1
  19. package/dist/collection/classes/handlers/rotation.handler.js +2 -0
  20. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
  21. package/dist/collection/classes/handlers/selection.handler.js +7 -5
  22. package/dist/collection/classes/handlers/selection.handler.js.map +1 -1
  23. package/dist/collection/classes/objects/base-object.class.js +5 -5
  24. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  25. package/dist/collection/classes/objects/custom-element.class.js +1 -1
  26. package/dist/collection/classes/objects/custom-element.class.js.map +1 -1
  27. package/dist/collection/classes/objects/image.class.js +1 -1
  28. package/dist/collection/classes/objects/image.class.js.map +1 -1
  29. package/dist/collection/classes/objects/path.class.js +4 -4
  30. package/dist/collection/classes/objects/path.class.js.map +1 -1
  31. package/dist/collection/classes/objects/selection-group.class.js +10 -10
  32. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  33. package/dist/collection/classes/objects/text.class.js +5 -4
  34. package/dist/collection/classes/objects/text.class.js.map +1 -1
  35. package/dist/collection/classes/structures/object-map.structure.js +10 -0
  36. package/dist/collection/classes/structures/object-map.structure.js.map +1 -1
  37. package/dist/collection/classes/tools/brush-tool.class.js +8 -6
  38. package/dist/collection/classes/tools/brush-tool.class.js.map +1 -1
  39. package/dist/collection/classes/tools/eraser-tool.class.js +2 -0
  40. package/dist/collection/classes/tools/eraser-tool.class.js.map +1 -1
  41. package/dist/collection/classes/tools/image-tool.class.js +1 -0
  42. package/dist/collection/classes/tools/image-tool.class.js.map +1 -1
  43. package/dist/collection/classes/tools/text-tool.class.js +2 -2
  44. package/dist/collection/classes/tools/text-tool.class.js.map +1 -1
  45. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +60 -4
  46. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
  47. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +80 -23
  48. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  49. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +0 -5
  50. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.css +0 -3
  51. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.css +0 -2
  52. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.css +0 -1
  53. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +0 -4
  54. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.css +0 -4
  55. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +0 -5
  56. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +28 -3
  57. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js.map +1 -1
  58. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.css +8 -2
  59. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +30 -1
  60. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js.map +1 -1
  61. package/dist/collection/configs/default-engine-config.js +1 -1
  62. package/dist/collection/configs/default-engine-config.js.map +1 -1
  63. package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
  64. package/dist/collection/interfaces/undo-state.interface.js +2 -0
  65. package/dist/collection/interfaces/undo-state.interface.js.map +1 -0
  66. package/dist/components/index.js +3 -3
  67. package/dist/components/kritzel-color-palette.js +1 -1
  68. package/dist/components/kritzel-control-brush-config.js +1 -1
  69. package/dist/components/kritzel-control-text-config.js +1 -1
  70. package/dist/components/kritzel-controls.js +1 -1
  71. package/dist/components/kritzel-editor.js +30 -14
  72. package/dist/components/kritzel-editor.js.map +1 -1
  73. package/dist/components/kritzel-engine.js +1 -1
  74. package/dist/components/kritzel-menu-item.js +1 -1
  75. package/dist/components/kritzel-menu.js +1 -1
  76. package/dist/components/kritzel-split-button.js +1 -1
  77. package/dist/components/kritzel-stroke-size.js +1 -1
  78. package/dist/components/kritzel-utility-panel.js +1 -1
  79. package/dist/components/kritzel-workspace-manager.js +1 -1
  80. package/dist/components/{p-CcqEzr-v.js → p-1lIHoOlH.js} +14 -12
  81. package/dist/components/p-1lIHoOlH.js.map +1 -0
  82. package/dist/components/{p-BDHz9TkP.js → p-B4kxkVe-.js} +3 -3
  83. package/dist/components/p-B4kxkVe-.js.map +1 -0
  84. package/dist/components/{p-G8Xyn7XV.js → p-BQg4YML7.js} +3 -3
  85. package/dist/components/{p-G8Xyn7XV.js.map → p-BQg4YML7.js.map} +1 -1
  86. package/dist/components/{p-BDvBsqPy.js → p-BfaEHdtM.js} +108 -68
  87. package/dist/components/p-BfaEHdtM.js.map +1 -0
  88. package/dist/components/{p-BJ-T4laL.js → p-CBYBurdY.js} +26 -23
  89. package/dist/components/p-CBYBurdY.js.map +1 -0
  90. package/dist/components/{p-DnOeM6VQ.js → p-CK6no3mi.js} +4 -4
  91. package/dist/components/{p-DnOeM6VQ.js.map → p-CK6no3mi.js.map} +1 -1
  92. package/dist/components/{p-DKVBZiTy.js → p-CsA9M6me.js} +4 -4
  93. package/dist/components/p-CsA9M6me.js.map +1 -0
  94. package/dist/components/{p-CJzBIV7n.js → p-D1uj4A4F.js} +3 -3
  95. package/dist/components/p-D1uj4A4F.js.map +1 -0
  96. package/dist/components/{p-Cqpp9wKT.js → p-DAfkuR8U.js} +8 -5
  97. package/dist/components/p-DAfkuR8U.js.map +1 -0
  98. package/dist/components/{p-CRB1YGoc.js → p-Ddh40W3x.js} +5 -5
  99. package/dist/components/p-Ddh40W3x.js.map +1 -0
  100. package/dist/components/{p-DhDRFCsP.js → p-TdCTkEu0.js} +4 -4
  101. package/dist/components/p-TdCTkEu0.js.map +1 -0
  102. package/dist/esm/{default-text-tool.config-ClW1W-X4.js → default-text-tool.config-2YFQA3SF.js} +53 -39
  103. package/dist/esm/default-text-tool.config-2YFQA3SF.js.map +1 -0
  104. package/dist/esm/index.js +2 -2
  105. package/dist/esm/kritzel-color_22.entry.js +110 -64
  106. package/dist/esm/loader.js +1 -1
  107. package/dist/esm/stencil.js +1 -1
  108. package/dist/stencil/index.esm.js +1 -1
  109. package/dist/stencil/p-2YFQA3SF.js +2 -0
  110. package/dist/stencil/p-2YFQA3SF.js.map +1 -0
  111. package/dist/stencil/p-bb5b2f78.entry.js +10 -0
  112. package/dist/stencil/p-bb5b2f78.entry.js.map +1 -0
  113. package/dist/stencil/stencil.esm.js +1 -1
  114. package/dist/types/classes/core/store.class.d.ts +4 -3
  115. package/dist/types/classes/structures/object-map.structure.d.ts +2 -0
  116. package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +8 -1
  117. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +4 -0
  118. package/dist/types/components/ui/kritzel-controls/kritzel-controls.d.ts +2 -0
  119. package/dist/types/components/ui/kritzel-utility-panel/kritzel-utility-panel.d.ts +2 -0
  120. package/dist/types/components.d.ts +28 -0
  121. package/dist/types/interfaces/engine-state.interface.d.ts +1 -1
  122. package/dist/types/interfaces/undo-state.interface.d.ts +6 -0
  123. package/package.json +1 -1
  124. package/dist/cjs/default-text-tool.config-Cds94FE8.js.map +0 -1
  125. package/dist/components/p-BDHz9TkP.js.map +0 -1
  126. package/dist/components/p-BDvBsqPy.js.map +0 -1
  127. package/dist/components/p-BJ-T4laL.js.map +0 -1
  128. package/dist/components/p-CJzBIV7n.js.map +0 -1
  129. package/dist/components/p-CRB1YGoc.js.map +0 -1
  130. package/dist/components/p-CcqEzr-v.js.map +0 -1
  131. package/dist/components/p-Cqpp9wKT.js.map +0 -1
  132. package/dist/components/p-DKVBZiTy.js.map +0 -1
  133. package/dist/components/p-DhDRFCsP.js.map +0 -1
  134. package/dist/esm/default-text-tool.config-ClW1W-X4.js.map +0 -1
  135. package/dist/stencil/p-843d013b.entry.js +0 -10
  136. package/dist/stencil/p-843d013b.entry.js.map +0 -1
  137. package/dist/stencil/p-ClW1W-X4.js +0 -2
  138. package/dist/stencil/p-ClW1W-X4.js.map +0 -1
@@ -6,7 +6,7 @@ var appGlobals = require('./app-globals-V2Kpy_OQ.js');
6
6
  const defineCustomElements = async (win, options) => {
7
7
  if (typeof window === 'undefined') return undefined;
8
8
  await appGlobals.globalScripts();
9
- return index.bootstrapLazy([["kritzel-color_22.cjs",[[768,"kritzel-editor",{"scaleMax":[2,"scale-max"],"scaleMin":[2,"scale-min"],"controls":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"customSvgIcons":[16],"isControlsVisible":[4,"is-controls-visible"],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"syncConfig":[16],"isEngineReady":[32],"isControlsReady":[32],"isWorkspaceManagerReady":[32],"workspaces":[32],"activeWorkspace":[32],"isVirtualKeyboardOpen":[32],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"dblclick","handleTouchStart"]],{"isEngineReady":["onIsEngineReady"],"isControlsReady":["onIsControlsReady"],"workspaces":["onWorkspacesChange"]}],[769,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"firstConfig":[32],"isTooltipVisible":[32],"isTouchDevice":[32],"closeTooltip":[64]},[[4,"click","handleDocumentClick"],[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"]]],[769,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[769,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"forceUpdate":[32],"registerTool":[64],"changeActiveTool":[64],"disable":[64],"enable":[64],"delete":[64],"copy":[64],"paste":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"undo":[64],"redo":[64],"hideContextMenu":[64],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"getCopiedObjects":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[0,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{"workspace":["onWorkspaceChange"],"scaleMax":["validateScaleMax"],"scaleMin":["validateScaleMin"]}],[769,"kritzel-control-text-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"]}],[769,"kritzel-control-brush-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"palette":[32]},null,{"tool":["handleToolChange"]}],[769,"kritzel-split-button",{"buttonIcon":[1,"button-icon"],"dropdownIcon":[1,"dropdown-icon"],"items":[16],"mainButtonDisabled":[4,"main-button-disabled"],"menuButtonDisabled":[4,"menu-button-disabled"],"isMenuOpen":[32],"isTouchDevice":[32],"anchorElement":[32],"menuScrollTop":[32],"open":[64],"focusMenu":[64]}],[769,"kritzel-context-menu",{"items":[16],"objects":[16],"processedItems":[32]},[[9,"pointerdown","handleOutsideClick"]],{"items":["onItemsChanged"]}],[257,"kritzel-utility-panel"],[769,"kritzel-cursor-trail",{"core":[16],"cursorTrailPoints":[32],"isLeftButtonDown":[32]},[[9,"pointerdown","handleMouseDown"],[9,"pointermove","handlePointerMove"],[9,"pointerup","handlePointerUp"]]],[769,"kritzel-tooltip",{"isVisible":[4,"is-visible"],"anchorElement":[16],"arrowSize":[2,"arrow-size"],"offsetY":[2,"offset-y"],"positionX":[32],"arrowOffset":[32],"isMobileView":[32],"focusContent":[64]},[[4,"click","handleOutsideClick"],[9,"resize","handleWindowResize"]]],[769,"kritzel-font-family",{"fontOptions":[16],"selectedFontFamily":[1025,"selected-font-family"]}],[769,"kritzel-font-size",{"sizes":[16],"selectedSize":[1026,"selected-size"],"fontFamily":[1,"font-family"]}],[769,"kritzel-stroke-size",{"sizes":[16],"selectedSize":[1026,"selected-size"]}],[769,"kritzel-color-palette",{"colors":[16],"selectedColor":[1025,"selected-color"],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"]}],[769,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[769,"kritzel-menu",{"items":[16],"parent":[16],"selectedIndex":[32],"setScrollTop":[64],"setFocus":[64]}],[769,"kritzel-menu-item",{"item":[16],"parent":[16],"isDirty":[32]},null,{"item":["onItemChange"]}],[769,"kritzel-dropdown",{"options":[16],"value":[1],"width":[1],"selectStyles":[8,"select-styles"],"internalValue":[32],"hasSuffixContent":[32],"hasPrefixContent":[32]},null,{"options":["optionsChanged"],"value":["externalValueChanged"]}],[769,"kritzel-portal",{"anchor":[16],"offsetX":[2,"offset-x"],"offsetY":[2,"offset-y"],"autoFocus":[4,"auto-focus"]},[[8,"click","handleOutsideClick"],[8,"keydown","handleKeyDown"],[11,"resize","handleResize"],[11,"scroll","handleWindowScroll"]],{"anchor":["anchorChanged"]}],[769,"kritzel-color",{"value":[1],"size":[2]}],[769,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}]]],["kritzel-brush-style.cjs",[[769,"kritzel-brush-style",{"type":[1],"brushOptions":[16]}]]]], options);
9
+ return index.bootstrapLazy([["kritzel-color_22.cjs",[[768,"kritzel-editor",{"scaleMax":[2,"scale-max"],"scaleMin":[2,"scale-min"],"controls":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"customSvgIcons":[16],"isControlsVisible":[4,"is-controls-visible"],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"syncConfig":[16],"isEngineReady":[32],"isControlsReady":[32],"isWorkspaceManagerReady":[32],"workspaces":[32],"activeWorkspace":[32],"isVirtualKeyboardOpen":[32],"undoState":[32],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"dblclick","onTouchStart"]],{"isEngineReady":["onIsEngineReady"],"isControlsReady":["onIsControlsReady"],"workspaces":["onWorkspacesChange"]}],[769,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"firstConfig":[32],"isTooltipVisible":[32],"isTouchDevice":[32],"closeTooltip":[64]},[[4,"click","handleDocumentClick"],[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"]]],[769,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[769,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"forceUpdate":[32],"registerTool":[64],"changeActiveTool":[64],"disable":[64],"enable":[64],"delete":[64],"copy":[64],"paste":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"undo":[64],"redo":[64],"hideContextMenu":[64],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"getCopiedObjects":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[0,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{"workspace":["onWorkspaceChange"],"scaleMax":["validateScaleMax"],"scaleMin":["validateScaleMin"]}],[769,"kritzel-control-text-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"]}],[769,"kritzel-control-brush-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"palette":[32]},null,{"tool":["handleToolChange"]}],[769,"kritzel-split-button",{"buttonIcon":[1,"button-icon"],"dropdownIcon":[1,"dropdown-icon"],"items":[16],"mainButtonDisabled":[4,"main-button-disabled"],"menuButtonDisabled":[4,"menu-button-disabled"],"isMenuOpen":[32],"isTouchDevice":[32],"anchorElement":[32],"menuScrollTop":[32],"open":[64],"focusMenu":[64]}],[769,"kritzel-context-menu",{"items":[16],"objects":[16],"processedItems":[32]},[[9,"pointerdown","handleOutsideClick"]],{"items":["onItemsChanged"]}],[769,"kritzel-utility-panel",{"undoState":[16]}],[769,"kritzel-cursor-trail",{"core":[16],"cursorTrailPoints":[32],"isLeftButtonDown":[32]},[[9,"pointerdown","handleMouseDown"],[9,"pointermove","handlePointerMove"],[9,"pointerup","handlePointerUp"]]],[769,"kritzel-tooltip",{"isVisible":[4,"is-visible"],"anchorElement":[16],"arrowSize":[2,"arrow-size"],"offsetY":[2,"offset-y"],"positionX":[32],"arrowOffset":[32],"isMobileView":[32],"focusContent":[64]},[[4,"click","handleOutsideClick"],[9,"resize","handleWindowResize"]]],[769,"kritzel-font-family",{"fontOptions":[16],"selectedFontFamily":[1025,"selected-font-family"]}],[769,"kritzel-font-size",{"sizes":[16],"selectedSize":[1026,"selected-size"],"fontFamily":[1,"font-family"]}],[769,"kritzel-stroke-size",{"sizes":[16],"selectedSize":[1026,"selected-size"]}],[769,"kritzel-color-palette",{"colors":[16],"selectedColor":[1025,"selected-color"],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"]}],[769,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[769,"kritzel-menu",{"items":[16],"parent":[16],"selectedIndex":[32],"setScrollTop":[64],"setFocus":[64]}],[769,"kritzel-menu-item",{"item":[16],"parent":[16],"isDirty":[32]},null,{"item":["onItemChange"]}],[769,"kritzel-dropdown",{"options":[16],"value":[1],"width":[1],"selectStyles":[8,"select-styles"],"internalValue":[32],"hasSuffixContent":[32],"hasPrefixContent":[32]},null,{"options":["optionsChanged"],"value":["externalValueChanged"]}],[769,"kritzel-portal",{"anchor":[16],"offsetX":[2,"offset-x"],"offsetY":[2,"offset-y"],"autoFocus":[4,"auto-focus"]},[[8,"click","handleOutsideClick"],[8,"keydown","handleKeyDown"],[11,"resize","handleResize"],[11,"scroll","handleWindowScroll"]],{"anchor":["anchorChanged"]}],[769,"kritzel-color",{"value":[1],"size":[2]}],[769,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}]]],["kritzel-brush-style.cjs",[[769,"kritzel-brush-style",{"type":[1],"brushOptions":[16]}]]]], options);
10
10
  };
11
11
 
12
12
  exports.setNonce = index.setNonce;
@@ -19,7 +19,7 @@ var patchBrowser = () => {
19
19
 
20
20
  patchBrowser().then(async (options) => {
21
21
  await appGlobals.globalScripts();
22
- return index.bootstrapLazy([["kritzel-color_22.cjs",[[768,"kritzel-editor",{"scaleMax":[2,"scale-max"],"scaleMin":[2,"scale-min"],"controls":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"customSvgIcons":[16],"isControlsVisible":[4,"is-controls-visible"],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"syncConfig":[16],"isEngineReady":[32],"isControlsReady":[32],"isWorkspaceManagerReady":[32],"workspaces":[32],"activeWorkspace":[32],"isVirtualKeyboardOpen":[32],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"dblclick","handleTouchStart"]],{"isEngineReady":["onIsEngineReady"],"isControlsReady":["onIsControlsReady"],"workspaces":["onWorkspacesChange"]}],[769,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"firstConfig":[32],"isTooltipVisible":[32],"isTouchDevice":[32],"closeTooltip":[64]},[[4,"click","handleDocumentClick"],[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"]]],[769,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[769,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"forceUpdate":[32],"registerTool":[64],"changeActiveTool":[64],"disable":[64],"enable":[64],"delete":[64],"copy":[64],"paste":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"undo":[64],"redo":[64],"hideContextMenu":[64],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"getCopiedObjects":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[0,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{"workspace":["onWorkspaceChange"],"scaleMax":["validateScaleMax"],"scaleMin":["validateScaleMin"]}],[769,"kritzel-control-text-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"]}],[769,"kritzel-control-brush-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"palette":[32]},null,{"tool":["handleToolChange"]}],[769,"kritzel-split-button",{"buttonIcon":[1,"button-icon"],"dropdownIcon":[1,"dropdown-icon"],"items":[16],"mainButtonDisabled":[4,"main-button-disabled"],"menuButtonDisabled":[4,"menu-button-disabled"],"isMenuOpen":[32],"isTouchDevice":[32],"anchorElement":[32],"menuScrollTop":[32],"open":[64],"focusMenu":[64]}],[769,"kritzel-context-menu",{"items":[16],"objects":[16],"processedItems":[32]},[[9,"pointerdown","handleOutsideClick"]],{"items":["onItemsChanged"]}],[257,"kritzel-utility-panel"],[769,"kritzel-cursor-trail",{"core":[16],"cursorTrailPoints":[32],"isLeftButtonDown":[32]},[[9,"pointerdown","handleMouseDown"],[9,"pointermove","handlePointerMove"],[9,"pointerup","handlePointerUp"]]],[769,"kritzel-tooltip",{"isVisible":[4,"is-visible"],"anchorElement":[16],"arrowSize":[2,"arrow-size"],"offsetY":[2,"offset-y"],"positionX":[32],"arrowOffset":[32],"isMobileView":[32],"focusContent":[64]},[[4,"click","handleOutsideClick"],[9,"resize","handleWindowResize"]]],[769,"kritzel-font-family",{"fontOptions":[16],"selectedFontFamily":[1025,"selected-font-family"]}],[769,"kritzel-font-size",{"sizes":[16],"selectedSize":[1026,"selected-size"],"fontFamily":[1,"font-family"]}],[769,"kritzel-stroke-size",{"sizes":[16],"selectedSize":[1026,"selected-size"]}],[769,"kritzel-color-palette",{"colors":[16],"selectedColor":[1025,"selected-color"],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"]}],[769,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[769,"kritzel-menu",{"items":[16],"parent":[16],"selectedIndex":[32],"setScrollTop":[64],"setFocus":[64]}],[769,"kritzel-menu-item",{"item":[16],"parent":[16],"isDirty":[32]},null,{"item":["onItemChange"]}],[769,"kritzel-dropdown",{"options":[16],"value":[1],"width":[1],"selectStyles":[8,"select-styles"],"internalValue":[32],"hasSuffixContent":[32],"hasPrefixContent":[32]},null,{"options":["optionsChanged"],"value":["externalValueChanged"]}],[769,"kritzel-portal",{"anchor":[16],"offsetX":[2,"offset-x"],"offsetY":[2,"offset-y"],"autoFocus":[4,"auto-focus"]},[[8,"click","handleOutsideClick"],[8,"keydown","handleKeyDown"],[11,"resize","handleResize"],[11,"scroll","handleWindowScroll"]],{"anchor":["anchorChanged"]}],[769,"kritzel-color",{"value":[1],"size":[2]}],[769,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}]]],["kritzel-brush-style.cjs",[[769,"kritzel-brush-style",{"type":[1],"brushOptions":[16]}]]]], options);
22
+ return index.bootstrapLazy([["kritzel-color_22.cjs",[[768,"kritzel-editor",{"scaleMax":[2,"scale-max"],"scaleMin":[2,"scale-min"],"controls":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"customSvgIcons":[16],"isControlsVisible":[4,"is-controls-visible"],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"syncConfig":[16],"isEngineReady":[32],"isControlsReady":[32],"isWorkspaceManagerReady":[32],"workspaces":[32],"activeWorkspace":[32],"isVirtualKeyboardOpen":[32],"undoState":[32],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"dblclick","onTouchStart"]],{"isEngineReady":["onIsEngineReady"],"isControlsReady":["onIsControlsReady"],"workspaces":["onWorkspacesChange"]}],[769,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"firstConfig":[32],"isTooltipVisible":[32],"isTouchDevice":[32],"closeTooltip":[64]},[[4,"click","handleDocumentClick"],[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"]]],[769,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[769,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"forceUpdate":[32],"registerTool":[64],"changeActiveTool":[64],"disable":[64],"enable":[64],"delete":[64],"copy":[64],"paste":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"undo":[64],"redo":[64],"hideContextMenu":[64],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"getCopiedObjects":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[0,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{"workspace":["onWorkspaceChange"],"scaleMax":["validateScaleMax"],"scaleMin":["validateScaleMin"]}],[769,"kritzel-control-text-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"]}],[769,"kritzel-control-brush-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"palette":[32]},null,{"tool":["handleToolChange"]}],[769,"kritzel-split-button",{"buttonIcon":[1,"button-icon"],"dropdownIcon":[1,"dropdown-icon"],"items":[16],"mainButtonDisabled":[4,"main-button-disabled"],"menuButtonDisabled":[4,"menu-button-disabled"],"isMenuOpen":[32],"isTouchDevice":[32],"anchorElement":[32],"menuScrollTop":[32],"open":[64],"focusMenu":[64]}],[769,"kritzel-context-menu",{"items":[16],"objects":[16],"processedItems":[32]},[[9,"pointerdown","handleOutsideClick"]],{"items":["onItemsChanged"]}],[769,"kritzel-utility-panel",{"undoState":[16]}],[769,"kritzel-cursor-trail",{"core":[16],"cursorTrailPoints":[32],"isLeftButtonDown":[32]},[[9,"pointerdown","handleMouseDown"],[9,"pointermove","handlePointerMove"],[9,"pointerup","handlePointerUp"]]],[769,"kritzel-tooltip",{"isVisible":[4,"is-visible"],"anchorElement":[16],"arrowSize":[2,"arrow-size"],"offsetY":[2,"offset-y"],"positionX":[32],"arrowOffset":[32],"isMobileView":[32],"focusContent":[64]},[[4,"click","handleOutsideClick"],[9,"resize","handleWindowResize"]]],[769,"kritzel-font-family",{"fontOptions":[16],"selectedFontFamily":[1025,"selected-font-family"]}],[769,"kritzel-font-size",{"sizes":[16],"selectedSize":[1026,"selected-size"],"fontFamily":[1,"font-family"]}],[769,"kritzel-stroke-size",{"sizes":[16],"selectedSize":[1026,"selected-size"]}],[769,"kritzel-color-palette",{"colors":[16],"selectedColor":[1025,"selected-color"],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"]}],[769,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[769,"kritzel-menu",{"items":[16],"parent":[16],"selectedIndex":[32],"setScrollTop":[64],"setFocus":[64]}],[769,"kritzel-menu-item",{"item":[16],"parent":[16],"isDirty":[32]},null,{"item":["onItemChange"]}],[769,"kritzel-dropdown",{"options":[16],"value":[1],"width":[1],"selectStyles":[8,"select-styles"],"internalValue":[32],"hasSuffixContent":[32],"hasPrefixContent":[32]},null,{"options":["optionsChanged"],"value":["externalValueChanged"]}],[769,"kritzel-portal",{"anchor":[16],"offsetX":[2,"offset-x"],"offsetY":[2,"offset-y"],"autoFocus":[4,"auto-focus"]},[[8,"click","handleOutsideClick"],[8,"keydown","handleKeyDown"],[11,"resize","handleResize"],[11,"scroll","handleWindowScroll"]],{"anchor":["anchorChanged"]}],[769,"kritzel-color",{"value":[1],"size":[2]}],[769,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}]]],["kritzel-brush-style.cjs",[[769,"kritzel-brush-style",{"type":[1],"brushOptions":[16]}]]]], options);
23
23
  });
24
24
 
25
25
  exports.setNonce = index.setNonce;
@@ -83,8 +83,8 @@ export class KritzelCore {
83
83
  this.saveWorkspaceToAppState(activeWorkspace);
84
84
  }
85
85
  // Destroy old ObjectMap if switching workspaces
86
- if (this._store.state.objectsMap && this._store.state.objectsMap.isReady) {
87
- this._store.state.objectsMap.destroy();
86
+ if (this._store.state.objects && this._store.state.objects.isReady) {
87
+ this._store.state.objects.destroy();
88
88
  }
89
89
  // Set active workspace
90
90
  this._store.state.activeWorkspace = activeWorkspace;
@@ -97,7 +97,8 @@ export class KritzelCore {
97
97
  // Create new ObjectMap with its own Y.Doc for this workspace
98
98
  const objectsMap = new KritzelObjectMap();
99
99
  await objectsMap.initialize(this, activeWorkspace.id, this._syncConfig);
100
- this._store.state.objectsMap = objectsMap;
100
+ this._store.state.objects = objectsMap;
101
+ this.engine.emitObjectsChange();
101
102
  this.rerender();
102
103
  }
103
104
  rerender() {
@@ -136,7 +137,7 @@ export class KritzelCore {
136
137
  deleteWorkspace(workspace) {
137
138
  // If deleting the active workspace, need to handle ObjectMap cleanup
138
139
  if (this._store.state.activeWorkspace?.id === workspace.id) {
139
- this._store.state.objectsMap?.destroy();
140
+ this._store.state.objects?.destroy();
140
141
  }
141
142
  this.deleteWorkspaceFromAppState(workspace.id);
142
143
  this._store.state.workspaces = this.loadWorkspacesFromAppState();
@@ -154,11 +155,11 @@ export class KritzelCore {
154
155
  this.saveWorkspaceToAppState(activeWorkspace);
155
156
  }
156
157
  addObject(object) {
157
- this._store.state.objectsMap.insert(object);
158
+ this._store.state.objects.insert(object);
158
159
  }
159
160
  removeObject(object) {
160
161
  object.isMounted = false;
161
- this._store.state.objectsMap.remove(o => o.id === object.id);
162
+ this._store.state.objects.remove(o => o.id === object.id);
162
163
  }
163
164
  updateObject(object, updatedProperties) {
164
165
  for (const key in updatedProperties) {
@@ -166,23 +167,23 @@ export class KritzelCore {
166
167
  object[key] = updatedProperties[key];
167
168
  }
168
169
  }
169
- this._store.state.objectsMap.update(object);
170
+ this._store.state.objects.update(object);
170
171
  }
171
172
  addSelectionGroup(selectionGroup) {
172
173
  this.removeSelectionGroup();
173
174
  this.removeSelectionBox();
174
- this._store.state.objectsMap.insert(selectionGroup);
175
+ this._store.state.objects.insert(selectionGroup);
175
176
  }
176
177
  removeSelectionGroup() {
177
178
  const selectionGroup = this._store.selectionGroup;
178
179
  if (selectionGroup) {
179
- this._store.state.objectsMap.remove(object => object.id === selectionGroup.id);
180
+ this._store.state.objects.remove(object => object.id === selectionGroup.id);
180
181
  }
181
182
  }
182
183
  removeSelectionBox() {
183
184
  const selectionBox = this._store.selectionBox;
184
185
  if (selectionBox) {
185
- this._store.state.objectsMap.remove(object => object.id === selectionBox.id);
186
+ this._store.state.objects.remove(object => object.id === selectionBox.id);
186
187
  }
187
188
  }
188
189
  deselectAllObjects() {
@@ -199,10 +200,10 @@ export class KritzelCore {
199
200
  this.rerender();
200
201
  }
201
202
  undo() {
202
- this._store.state.objectsMap?.undo();
203
+ this._store.state.objects?.undo();
203
204
  }
204
205
  redo() {
205
- this._store.state.objectsMap?.redo();
206
+ this._store.state.objects?.redo();
206
207
  }
207
208
  deleteObject(id) {
208
209
  const object = this.findObjectById(id);
@@ -298,6 +299,7 @@ export class KritzelCore {
298
299
  this._store.state.copiedObjects = newSelectionGroup.objects.sort((a, b) => a.zIndex - b.zIndex).map(obj => obj.copy());
299
300
  }
300
301
  this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
302
+ this.engine.emitObjectsChange();
301
303
  this.rerender();
302
304
  }
303
305
  bringForward(object) {
@@ -361,7 +363,7 @@ export class KritzelCore {
361
363
  this.rerender();
362
364
  }
363
365
  selectAllObjectsInViewport() {
364
- const objectsInViewport = this._store.state.objectsMap
366
+ const objectsInViewport = this._store.state.objects
365
367
  .filter(o => o.isInViewport())
366
368
  .filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox) && !(o instanceof KritzelContextMenu));
367
369
  if (objectsInViewport.length > 0) {
@@ -382,7 +384,7 @@ export class KritzelCore {
382
384
  }
383
385
  clearSelection() {
384
386
  this.removeSelectionGroup();
385
- this._store.state.objectsMap.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);
387
+ this._store.state.objects.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);
386
388
  this._store.state.isSelecting = false;
387
389
  this._store.state.isResizeHandleSelected = false;
388
390
  this._store.state.isRotationHandleSelected = false;
@@ -1 +1 @@
1
- {"version":3,"file":"core.class.js","sourceRoot":"","sources":["../../../src/classes/core/core.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEngine } from '../../components/core/kritzel-engine/kritzel-engine';\r\nimport { KritzelContextMenu } from '../../components/ui/kritzel-context-menu/kritzel-context-menu';\r\nimport { DEFAULT_ENGINE_CONFIG } from '../../configs/default-engine-config';\r\nimport { ObjectHelper } from '../../helpers/object.helper';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelToolRegistry } from '../registries/tool.registry';\r\nimport { KritzelStore } from './store.class';\r\nimport { KritzelWorkspace } from './workspace.class';\r\nimport { KritzelObjectMap } from '../structures/object-map.structure';\r\nimport { KritzelSyncConfig } from '../../interfaces/sync-config.interface';\r\nimport { KritzelAppStateMap } from '../structures/app-state-map.structure';\r\n\r\nexport class KritzelCore {\r\n private readonly _kritzelEngine: KritzelEngine;\r\n private readonly _store: KritzelStore;\r\n private _syncConfig?: KritzelSyncConfig;\r\n private readonly _appStateMap: KritzelAppStateMap;\r\n\r\n get engine(): KritzelEngine {\r\n return this._kritzelEngine;\r\n }\r\n\r\n get store(): KritzelStore {\r\n return this._store;\r\n }\r\n\r\n get appStateMap(): KritzelAppStateMap {\r\n return this._appStateMap;\r\n }\r\n\r\n constructor(kritzelEngine: KritzelEngine) {\r\n this._kritzelEngine = kritzelEngine;\r\n this._store = new KritzelStore(DEFAULT_ENGINE_CONFIG);\r\n this._appStateMap = new KritzelAppStateMap();\r\n }\r\n\r\n setSyncConfig(config?: KritzelSyncConfig): void {\r\n this._syncConfig = config;\r\n }\r\n\r\n async initializeYjs(): Promise<void> {\r\n await this._appStateMap.initialize(this, this._syncConfig);\r\n }\r\n\r\n /**\r\n * Load all workspaces from app state map\r\n */\r\n private loadWorkspacesFromAppState(): KritzelWorkspace[] {\r\n return this._appStateMap.allWorkspaces();\r\n }\r\n\r\n /**\r\n * Save a workspace to app state map\r\n */\r\n private saveWorkspaceToAppState(workspace: KritzelWorkspace): void {\r\n if (this._appStateMap.has(workspace.id)) {\r\n this._appStateMap.update(workspace);\r\n } else {\r\n this._appStateMap.insert(workspace);\r\n }\r\n }\r\n\r\n /**\r\n * Delete a workspace from app state map\r\n */\r\n private deleteWorkspaceFromAppState(workspaceId: string): void {\r\n this._appStateMap.remove(w => w.id === workspaceId);\r\n }\r\n\r\n async initializeWorkspace(workspace?: KritzelWorkspace): Promise<void> {\r\n // Load all workspaces from app state map\r\n const workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Find most recently updated workspace or use provided/fallback\r\n const mostRecentWorkspace = workspaces.length > 0 ? [...workspaces].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0] : null;\r\n\r\n let activeWorkspace: KritzelWorkspace;\r\n\r\n if (workspace) {\r\n // Use provided workspace\r\n activeWorkspace = workspace;\r\n const existing = workspaces.find(w => w.id === workspace.id);\r\n if (!existing) {\r\n // New workspace, save it\r\n activeWorkspace._core = this;\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n } else if (mostRecentWorkspace) {\r\n // Use most recent workspace\r\n activeWorkspace = mostRecentWorkspace;\r\n } else {\r\n // Create fallback workspace\r\n activeWorkspace = new KritzelWorkspace(ObjectHelper.generateUUID(), 'New Workspace');\r\n activeWorkspace._core = this;\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n\r\n // Destroy old ObjectMap if switching workspaces\r\n if (this._store.state.objectsMap && this._store.state.objectsMap.isReady) {\r\n this._store.state.objectsMap.destroy();\r\n }\r\n\r\n // Set active workspace\r\n this._store.state.activeWorkspace = activeWorkspace;\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Set viewport from workspace\r\n const viewport = activeWorkspace.viewport ?? { translateX: 0, translateY: 0, scale: 1 };\r\n this._store.state.translateX = viewport.translateX ?? 0;\r\n this._store.state.translateY = viewport.translateY ?? 0;\r\n this._store.state.scale = viewport.scale ?? 1;\r\n\r\n // Create new ObjectMap with its own Y.Doc for this workspace\r\n const objectsMap = new KritzelObjectMap();\r\n await objectsMap.initialize(this, activeWorkspace.id, this._syncConfig);\r\n this._store.state.objectsMap = objectsMap;\r\n\r\n this.rerender();\r\n }\r\n\r\n rerender() {\r\n if (this._kritzelEngine) {\r\n this._kritzelEngine.forceUpdate++;\r\n }\r\n }\r\n\r\n findObjectById(id: string): KritzelBaseObject<any> | null {\r\n for (const object of this._store.allObjects) {\r\n if (object.id === id) {\r\n return object;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n getWorkspaces(): KritzelWorkspace[] {\r\n return this.loadWorkspacesFromAppState();\r\n }\r\n\r\n createWorkspace(workspace: KritzelWorkspace): void {\r\n workspace._core = this;\r\n workspace.createdAt = new Date();\r\n workspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(workspace);\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n }\r\n\r\n updateWorkspace(workspace: KritzelWorkspace): void {\r\n workspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(workspace);\r\n\r\n const workspaces = this._store.state.workspaces;\r\n const index = workspaces.findIndex(w => w.id === workspace.id);\r\n\r\n if (index !== -1) {\r\n workspaces[index] = workspace;\r\n this._store.state.workspaces = workspaces;\r\n }\r\n }\r\n\r\n deleteWorkspace(workspace: KritzelWorkspace): void {\r\n // If deleting the active workspace, need to handle ObjectMap cleanup\r\n if (this._store.state.activeWorkspace?.id === workspace.id) {\r\n this._store.state.objectsMap?.destroy();\r\n }\r\n\r\n this.deleteWorkspaceFromAppState(workspace.id);\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Also delete the workspace's IndexedDB database\r\n const dbName = `kritzel-workspace-${workspace.id}`;\r\n window.indexedDB.deleteDatabase(dbName);\r\n }\r\n\r\n updateWorkspaceViewport(translateX: number, translateY: number, scale: number): void {\r\n const activeWorkspace = this._store.state.activeWorkspace;\r\n if (!activeWorkspace) {\r\n return;\r\n }\r\n\r\n activeWorkspace.viewport = { translateX, translateY, scale };\r\n activeWorkspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n\r\n addObject(object: KritzelBaseObject<any>): void {\r\n this._store.state.objectsMap.insert(object);\r\n }\r\n\r\n removeObject(object: KritzelBaseObject<any>): void {\r\n object.isMounted = false;\r\n this._store.state.objectsMap.remove(o => o.id === object.id);\r\n }\r\n\r\n updateObject<T extends KritzelBaseObject<any>>(object: T, updatedProperties: Partial<T>): void {\r\n for (const key in updatedProperties) {\r\n if (updatedProperties.hasOwnProperty(key)) {\r\n object[key] = updatedProperties[key];\r\n }\r\n }\r\n\r\n this._store.state.objectsMap.update(object);\r\n }\r\n\r\n addSelectionGroup(selectionGroup: KritzelSelectionGroup): void {\r\n this.removeSelectionGroup();\r\n this.removeSelectionBox();\r\n this._store.state.objectsMap.insert(selectionGroup);\r\n }\r\n\r\n removeSelectionGroup(): void {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (selectionGroup) {\r\n this._store.state.objectsMap.remove(object => object.id === selectionGroup.id);\r\n }\r\n }\r\n\r\n removeSelectionBox(): void {\r\n const selectionBox = this._store.selectionBox;\r\n if (selectionBox) {\r\n this._store.state.objectsMap.remove(object => object.id === selectionBox.id);\r\n }\r\n }\r\n\r\n deselectAllObjects(): void {\r\n this.removeSelectionGroup();\r\n this.rerender();\r\n }\r\n\r\n delete() {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup) {\r\n return;\r\n }\r\n\r\n selectionGroup.objects.forEach(obj => this.removeObject(obj));\r\n\r\n this.removeSelectionGroup();\r\n this.rerender();\r\n }\r\n\r\n undo(): void {\r\n this._store.state.objectsMap?.undo();\r\n }\r\n\r\n redo(): void {\r\n this._store.state.objectsMap?.redo();\r\n }\r\n\r\n deleteObject(id: string) {\r\n const object = this.findObjectById(id);\r\n if (object) {\r\n this.removeObject(object);\r\n this.rerender();\r\n }\r\n }\r\n\r\n copy() {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (selectionGroup) {\r\n // Copy each object and store them in an array\r\n this._store.state.copiedObjects = selectionGroup.objects.sort((a, b) => a.zIndex - b.zIndex).map(obj => obj.copy() as KritzelBaseObject<any>);\r\n }\r\n }\r\n\r\n paste(x?: number, y?: number) {\r\n const copiedObjects = this._store.state.copiedObjects;\r\n if (!copiedObjects || copiedObjects.length === 0) {\r\n return;\r\n }\r\n\r\n const activeWorkspace = this._store.state.activeWorkspace;\r\n\r\n // Check if we're pasting from a different workspace\r\n const isDifferentWorkspace = copiedObjects.some(obj => obj.workspaceId !== activeWorkspace.id);\r\n\r\n // Calculate the bounding box of all copied objects\r\n const minX = Math.min(...copiedObjects.map(obj => obj.translateX));\r\n const minY = Math.min(...copiedObjects.map(obj => obj.translateY));\r\n\r\n // Determine the paste position\r\n let pasteX: number;\r\n let pasteY: number;\r\n\r\n if (x !== undefined && y !== undefined) {\r\n // Explicit position provided (e.g., right-click paste)\r\n pasteX = x;\r\n pasteY = y;\r\n } else if (isDifferentWorkspace) {\r\n // Pasting to different workspace without explicit position\r\n // Keep original position; will be centered by centerInViewport() later\r\n pasteX = minX;\r\n pasteY = minY;\r\n } else {\r\n // Same workspace paste: offset by 25 pixels from original position\r\n pasteX = minX + 25 / this._store.state.scale;\r\n pasteY = minY + 25 / this._store.state.scale;\r\n }\r\n\r\n // Calculate the offset to apply to all objects\r\n const offsetX = pasteX - minX;\r\n const offsetY = pasteY - minY;\r\n\r\n this.removeSelectionGroup();\r\n this.removeSelectionBox();\r\n\r\n // Create a new selection group for the pasted objects\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n\r\n // First add all copied objects to the objectsMap with updated positions\r\n copiedObjects.forEach((obj, i) => {\r\n // Update workspace if pasting to a different workspace\r\n if (obj.workspaceId !== activeWorkspace.id) {\r\n obj.workspaceId = activeWorkspace.id;\r\n }\r\n\r\n // Update position\r\n obj.updatePosition(obj.translateX + offsetX, obj.translateY + offsetY);\r\n\r\n // Update z-index\r\n obj.zIndex = this._store.currentZIndex + i;\r\n\r\n // Add to objectsMap\r\n this.addObject(obj);\r\n\r\n // Add to selection group\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n // Mark selection group as selected\r\n selectionGroup.isSelected = true;\r\n\r\n // Set rotation for single object\r\n if (copiedObjects.length === 1) {\r\n selectionGroup.rotation = copiedObjects[0].rotation;\r\n }\r\n\r\n // Add the selection group\r\n this.addSelectionGroup(selectionGroup);\r\n\r\n // Handle cross-workspace paste: center objects in viewport\r\n if (isDifferentWorkspace) {\r\n if (x !== undefined && y !== undefined) {\r\n // Position was explicitly provided, use it\r\n selectionGroup.updatePosition(x, y);\r\n } else {\r\n // Center the selection group in the viewport\r\n selectionGroup.centerInViewport();\r\n }\r\n // Fit the viewport to show the pasted objects\r\n this.engine.viewport.centerFitInViewport(selectionGroup);\r\n }\r\n\r\n this._store.state.isSelecting = false;\r\n\r\n // Update copiedObjects to the newly created objects for potential future pastes\r\n const newSelectionGroup = this._store.selectionGroup;\r\n if (newSelectionGroup) {\r\n this._store.state.copiedObjects = newSelectionGroup.objects.sort((a, b) => a.zIndex - b.zIndex).map(obj => obj.copy() as KritzelBaseObject<any>);\r\n }\r\n\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n this.rerender();\r\n }\r\n\r\n bringForward(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const max = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1 : 0;\r\n\r\n objects.forEach(obj => {\r\n if (obj.zIndex !== max) {\r\n this.updateObject(obj, { zIndex: obj.zIndex + 1 });\r\n }\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n sendBackward(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const min = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1 : 0;\r\n\r\n objects.forEach(obj => {\r\n if (obj.zIndex !== min) {\r\n this.updateObject(obj, { zIndex: obj.zIndex - 1 });\r\n }\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n bringToFront(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const max = Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1;\r\n\r\n objects.forEach(obj => {\r\n this.updateObject(obj, { zIndex: max });\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n sendToBack(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const min = Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1;\r\n\r\n objects.forEach(obj => {\r\n this.updateObject(obj, { zIndex: min });\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n selectObjects(objects: KritzelBaseObject<any>[]) {\r\n if (objects.length === 0) {\r\n return;\r\n }\r\n\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n objects.forEach(obj => {\r\n obj.isSelected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.isSelected = true;\r\n\r\n if (objects.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.addSelectionGroup(selectionGroup);\r\n this.rerender();\r\n }\r\n\r\n selectAllObjectsInViewport() {\r\n const objectsInViewport = this._store.state.objectsMap\r\n .filter(o => o.isInViewport())\r\n .filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox) && !(o instanceof KritzelContextMenu));\r\n\r\n if (objectsInViewport.length > 0) {\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n\r\n objectsInViewport.forEach(obj => {\r\n obj.isSelected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.isSelected = true;\r\n\r\n this._store.state.isSelecting = false;\r\n\r\n if (objectsInViewport.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.addSelectionGroup(selectionGroup);\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n this.rerender();\r\n }\r\n }\r\n\r\n clearSelection() {\r\n this.removeSelectionGroup();\r\n\r\n this._store.state.objectsMap.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);\r\n this._store.state.isSelecting = false;\r\n this._store.state.isResizeHandleSelected = false;\r\n this._store.state.isRotationHandleSelected = false;\r\n\r\n this.rerender();\r\n }\r\n\r\n resetActiveText() {\r\n const activeText = this._store.activeText;\r\n if (activeText) {\r\n if (activeText.isEmpty) {\r\n this.deleteObject(activeText.id);\r\n } else {\r\n activeText.save();\r\n }\r\n }\r\n }\r\n\r\n getObjectFromPointerEvent(event: PointerEvent, selector = '.object'): KritzelBaseObject<any> | null {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return null;\r\n\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const elementAtPoint = shadowRoot.elementFromPoint(clientX, clientY);\r\n if (!elementAtPoint) return null;\r\n\r\n const selectedObject = elementAtPoint.closest(selector) as HTMLElement | null;\r\n\r\n if (selectedObject) {\r\n const foundObject = this._store.allObjects.find(object => selectedObject.id === object.id);\r\n const isHit = foundObject?.hitTest(clientX, clientY);\r\n return isHit ? foundObject : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getObjectsFromPointerEvent(event: PointerEvent, selector = '.object'): KritzelBaseObject<any>[] {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return [];\r\n\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const elementsAtPoint = shadowRoot.elementsFromPoint(clientX, clientY);\r\n if (!elementsAtPoint || elementsAtPoint.length === 0) return [];\r\n\r\n const objectIds = new Set<string>();\r\n\r\n elementsAtPoint.forEach(element => {\r\n const selectedObject = element.closest(selector) as HTMLElement | null;\r\n if (selectedObject && selectedObject.id) {\r\n objectIds.add(selectedObject.id);\r\n }\r\n });\r\n\r\n if (objectIds.size > 0) {\r\n return this._store.allObjects.filter(object => objectIds.has(object.id)).sort((a, b) => b.zIndex - a.zIndex);\r\n }\r\n\r\n return [];\r\n }\r\n\r\n getCanvasPoint(event: PointerEvent): { x: number; y: number } {\r\n if (!this._store.state.host) {\r\n return { x: 0, y: 0 };\r\n }\r\n\r\n const hostRect = this._store.state.host.getBoundingClientRect();\r\n\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n const xWithoutTranslate = xRelativeToHost - this._store.state.translateX;\r\n const yWithoutTranslate = yRelativeToHost - this._store.state.translateY;\r\n\r\n const worldX = xWithoutTranslate / this._store.state.scale;\r\n const worldY = yWithoutTranslate / this._store.state.scale;\r\n\r\n return { x: worldX, y: worldY };\r\n }\r\n\r\n beforeWorkspaceChange() {\r\n this.resetActiveText();\r\n this.clearSelection();\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"core.class.js","sourceRoot":"","sources":["../../../src/classes/core/core.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEngine } from '../../components/core/kritzel-engine/kritzel-engine';\r\nimport { KritzelContextMenu } from '../../components/ui/kritzel-context-menu/kritzel-context-menu';\r\nimport { DEFAULT_ENGINE_CONFIG } from '../../configs/default-engine-config';\r\nimport { ObjectHelper } from '../../helpers/object.helper';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelToolRegistry } from '../registries/tool.registry';\r\nimport { KritzelStore } from './store.class';\r\nimport { KritzelWorkspace } from './workspace.class';\r\nimport { KritzelObjectMap } from '../structures/object-map.structure';\r\nimport { KritzelSyncConfig } from '../../interfaces/sync-config.interface';\r\nimport { KritzelAppStateMap } from '../structures/app-state-map.structure';\r\n\r\nexport class KritzelCore {\r\n private readonly _kritzelEngine: KritzelEngine;\r\n private readonly _store: KritzelStore;\r\n private _syncConfig?: KritzelSyncConfig;\r\n private readonly _appStateMap: KritzelAppStateMap;\r\n\r\n get engine(): KritzelEngine {\r\n return this._kritzelEngine;\r\n }\r\n\r\n get store(): KritzelStore {\r\n return this._store;\r\n }\r\n\r\n get appStateMap(): KritzelAppStateMap {\r\n return this._appStateMap;\r\n }\r\n\r\n constructor(kritzelEngine: KritzelEngine) {\r\n this._kritzelEngine = kritzelEngine;\r\n this._store = new KritzelStore(DEFAULT_ENGINE_CONFIG);\r\n this._appStateMap = new KritzelAppStateMap();\r\n }\r\n\r\n setSyncConfig(config?: KritzelSyncConfig): void {\r\n this._syncConfig = config;\r\n }\r\n\r\n async initializeYjs(): Promise<void> {\r\n await this._appStateMap.initialize(this, this._syncConfig);\r\n }\r\n\r\n /**\r\n * Load all workspaces from app state map\r\n */\r\n private loadWorkspacesFromAppState(): KritzelWorkspace[] {\r\n return this._appStateMap.allWorkspaces();\r\n }\r\n\r\n /**\r\n * Save a workspace to app state map\r\n */\r\n private saveWorkspaceToAppState(workspace: KritzelWorkspace): void {\r\n if (this._appStateMap.has(workspace.id)) {\r\n this._appStateMap.update(workspace);\r\n } else {\r\n this._appStateMap.insert(workspace);\r\n }\r\n }\r\n\r\n /**\r\n * Delete a workspace from app state map\r\n */\r\n private deleteWorkspaceFromAppState(workspaceId: string): void {\r\n this._appStateMap.remove(w => w.id === workspaceId);\r\n }\r\n\r\n async initializeWorkspace(workspace?: KritzelWorkspace): Promise<void> {\r\n // Load all workspaces from app state map\r\n const workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Find most recently updated workspace or use provided/fallback\r\n const mostRecentWorkspace = workspaces.length > 0 ? [...workspaces].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0] : null;\r\n\r\n let activeWorkspace: KritzelWorkspace;\r\n\r\n if (workspace) {\r\n // Use provided workspace\r\n activeWorkspace = workspace;\r\n const existing = workspaces.find(w => w.id === workspace.id);\r\n if (!existing) {\r\n // New workspace, save it\r\n activeWorkspace._core = this;\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n } else if (mostRecentWorkspace) {\r\n // Use most recent workspace\r\n activeWorkspace = mostRecentWorkspace;\r\n } else {\r\n // Create fallback workspace\r\n activeWorkspace = new KritzelWorkspace(ObjectHelper.generateUUID(), 'New Workspace');\r\n activeWorkspace._core = this;\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n\r\n // Destroy old ObjectMap if switching workspaces\r\n if (this._store.state.objects && this._store.state.objects.isReady) {\r\n this._store.state.objects.destroy();\r\n }\r\n\r\n // Set active workspace\r\n this._store.state.activeWorkspace = activeWorkspace;\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Set viewport from workspace\r\n const viewport = activeWorkspace.viewport ?? { translateX: 0, translateY: 0, scale: 1 };\r\n this._store.state.translateX = viewport.translateX ?? 0;\r\n this._store.state.translateY = viewport.translateY ?? 0;\r\n this._store.state.scale = viewport.scale ?? 1;\r\n\r\n // Create new ObjectMap with its own Y.Doc for this workspace\r\n const objectsMap = new KritzelObjectMap();\r\n await objectsMap.initialize(this, activeWorkspace.id, this._syncConfig);\r\n this._store.state.objects = objectsMap;\r\n\r\n this.engine.emitObjectsChange();\r\n\r\n this.rerender();\r\n }\r\n\r\n rerender() {\r\n if (this._kritzelEngine) {\r\n this._kritzelEngine.forceUpdate++;\r\n }\r\n }\r\n\r\n findObjectById(id: string): KritzelBaseObject<any> | null {\r\n for (const object of this._store.allObjects) {\r\n if (object.id === id) {\r\n return object;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n getWorkspaces(): KritzelWorkspace[] {\r\n return this.loadWorkspacesFromAppState();\r\n }\r\n\r\n createWorkspace(workspace: KritzelWorkspace): void {\r\n workspace._core = this;\r\n workspace.createdAt = new Date();\r\n workspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(workspace);\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n }\r\n\r\n updateWorkspace(workspace: KritzelWorkspace): void {\r\n workspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(workspace);\r\n\r\n const workspaces = this._store.state.workspaces;\r\n const index = workspaces.findIndex(w => w.id === workspace.id);\r\n\r\n if (index !== -1) {\r\n workspaces[index] = workspace;\r\n this._store.state.workspaces = workspaces;\r\n }\r\n }\r\n\r\n deleteWorkspace(workspace: KritzelWorkspace): void {\r\n // If deleting the active workspace, need to handle ObjectMap cleanup\r\n if (this._store.state.activeWorkspace?.id === workspace.id) {\r\n this._store.state.objects?.destroy();\r\n }\r\n\r\n this.deleteWorkspaceFromAppState(workspace.id);\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Also delete the workspace's IndexedDB database\r\n const dbName = `kritzel-workspace-${workspace.id}`;\r\n window.indexedDB.deleteDatabase(dbName);\r\n }\r\n\r\n updateWorkspaceViewport(translateX: number, translateY: number, scale: number): void {\r\n const activeWorkspace = this._store.state.activeWorkspace;\r\n if (!activeWorkspace) {\r\n return;\r\n }\r\n\r\n activeWorkspace.viewport = { translateX, translateY, scale };\r\n activeWorkspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n\r\n addObject(object: KritzelBaseObject<any>): void {\r\n this._store.state.objects.insert(object);\r\n }\r\n\r\n removeObject(object: KritzelBaseObject<any>): void {\r\n object.isMounted = false;\r\n this._store.state.objects.remove(o => o.id === object.id);\r\n }\r\n\r\n updateObject<T extends KritzelBaseObject<any>>(object: T, updatedProperties: Partial<T>): void {\r\n for (const key in updatedProperties) {\r\n if (updatedProperties.hasOwnProperty(key)) {\r\n object[key] = updatedProperties[key];\r\n }\r\n }\r\n\r\n this._store.state.objects.update(object);\r\n }\r\n\r\n addSelectionGroup(selectionGroup: KritzelSelectionGroup): void {\r\n this.removeSelectionGroup();\r\n this.removeSelectionBox();\r\n this._store.state.objects.insert(selectionGroup);\r\n }\r\n\r\n removeSelectionGroup(): void {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (selectionGroup) {\r\n this._store.state.objects.remove(object => object.id === selectionGroup.id);\r\n }\r\n }\r\n\r\n removeSelectionBox(): void {\r\n const selectionBox = this._store.selectionBox;\r\n if (selectionBox) {\r\n this._store.state.objects.remove(object => object.id === selectionBox.id);\r\n }\r\n }\r\n\r\n deselectAllObjects(): void {\r\n this.removeSelectionGroup();\r\n this.rerender();\r\n }\r\n\r\n delete() {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup) {\r\n return;\r\n }\r\n\r\n selectionGroup.objects.forEach(obj => this.removeObject(obj));\r\n\r\n this.removeSelectionGroup();\r\n this.rerender();\r\n }\r\n\r\n undo(): void {\r\n this._store.state.objects?.undo();\r\n }\r\n\r\n redo(): void {\r\n this._store.state.objects?.redo();\r\n }\r\n\r\n deleteObject(id: string) {\r\n const object = this.findObjectById(id);\r\n if (object) {\r\n this.removeObject(object);\r\n this.rerender();\r\n }\r\n }\r\n\r\n copy() {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (selectionGroup) {\r\n // Copy each object and store them in an array\r\n this._store.state.copiedObjects = selectionGroup.objects.sort((a, b) => a.zIndex - b.zIndex).map(obj => obj.copy() as KritzelBaseObject<any>);\r\n }\r\n }\r\n\r\n paste(x?: number, y?: number) {\r\n const copiedObjects = this._store.state.copiedObjects;\r\n if (!copiedObjects || copiedObjects.length === 0) {\r\n return;\r\n }\r\n\r\n const activeWorkspace = this._store.state.activeWorkspace;\r\n\r\n // Check if we're pasting from a different workspace\r\n const isDifferentWorkspace = copiedObjects.some(obj => obj.workspaceId !== activeWorkspace.id);\r\n\r\n // Calculate the bounding box of all copied objects\r\n const minX = Math.min(...copiedObjects.map(obj => obj.translateX));\r\n const minY = Math.min(...copiedObjects.map(obj => obj.translateY));\r\n\r\n // Determine the paste position\r\n let pasteX: number;\r\n let pasteY: number;\r\n\r\n if (x !== undefined && y !== undefined) {\r\n // Explicit position provided (e.g., right-click paste)\r\n pasteX = x;\r\n pasteY = y;\r\n } else if (isDifferentWorkspace) {\r\n // Pasting to different workspace without explicit position\r\n // Keep original position; will be centered by centerInViewport() later\r\n pasteX = minX;\r\n pasteY = minY;\r\n } else {\r\n // Same workspace paste: offset by 25 pixels from original position\r\n pasteX = minX + 25 / this._store.state.scale;\r\n pasteY = minY + 25 / this._store.state.scale;\r\n }\r\n\r\n // Calculate the offset to apply to all objects\r\n const offsetX = pasteX - minX;\r\n const offsetY = pasteY - minY;\r\n\r\n this.removeSelectionGroup();\r\n this.removeSelectionBox();\r\n\r\n // Create a new selection group for the pasted objects\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n\r\n // First add all copied objects to the objectsMap with updated positions\r\n copiedObjects.forEach((obj, i) => {\r\n // Update workspace if pasting to a different workspace\r\n if (obj.workspaceId !== activeWorkspace.id) {\r\n obj.workspaceId = activeWorkspace.id;\r\n }\r\n\r\n // Update position\r\n obj.updatePosition(obj.translateX + offsetX, obj.translateY + offsetY);\r\n\r\n // Update z-index\r\n obj.zIndex = this._store.currentZIndex + i;\r\n\r\n // Add to objectsMap\r\n this.addObject(obj);\r\n\r\n // Add to selection group\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n // Mark selection group as selected\r\n selectionGroup.isSelected = true;\r\n\r\n // Set rotation for single object\r\n if (copiedObjects.length === 1) {\r\n selectionGroup.rotation = copiedObjects[0].rotation;\r\n }\r\n\r\n // Add the selection group\r\n this.addSelectionGroup(selectionGroup);\r\n\r\n // Handle cross-workspace paste: center objects in viewport\r\n if (isDifferentWorkspace) {\r\n if (x !== undefined && y !== undefined) {\r\n // Position was explicitly provided, use it\r\n selectionGroup.updatePosition(x, y);\r\n } else {\r\n // Center the selection group in the viewport\r\n selectionGroup.centerInViewport();\r\n }\r\n // Fit the viewport to show the pasted objects\r\n this.engine.viewport.centerFitInViewport(selectionGroup);\r\n }\r\n\r\n this._store.state.isSelecting = false;\r\n\r\n // Update copiedObjects to the newly created objects for potential future pastes\r\n const newSelectionGroup = this._store.selectionGroup;\r\n if (newSelectionGroup) {\r\n this._store.state.copiedObjects = newSelectionGroup.objects.sort((a, b) => a.zIndex - b.zIndex).map(obj => obj.copy() as KritzelBaseObject<any>);\r\n }\r\n\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n\r\n this.engine.emitObjectsChange();\r\n \r\n this.rerender();\r\n }\r\n\r\n bringForward(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const max = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1 : 0;\r\n\r\n objects.forEach(obj => {\r\n if (obj.zIndex !== max) {\r\n this.updateObject(obj, { zIndex: obj.zIndex + 1 });\r\n }\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n sendBackward(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const min = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1 : 0;\r\n\r\n objects.forEach(obj => {\r\n if (obj.zIndex !== min) {\r\n this.updateObject(obj, { zIndex: obj.zIndex - 1 });\r\n }\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n bringToFront(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const max = Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1;\r\n\r\n objects.forEach(obj => {\r\n this.updateObject(obj, { zIndex: max });\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n sendToBack(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const min = Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1;\r\n\r\n objects.forEach(obj => {\r\n this.updateObject(obj, { zIndex: min });\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n selectObjects(objects: KritzelBaseObject<any>[]) {\r\n if (objects.length === 0) {\r\n return;\r\n }\r\n\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n objects.forEach(obj => {\r\n obj.isSelected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.isSelected = true;\r\n\r\n if (objects.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.addSelectionGroup(selectionGroup);\r\n this.rerender();\r\n }\r\n\r\n selectAllObjectsInViewport() {\r\n const objectsInViewport = this._store.state.objects\r\n .filter(o => o.isInViewport())\r\n .filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox) && !(o instanceof KritzelContextMenu));\r\n\r\n if (objectsInViewport.length > 0) {\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n\r\n objectsInViewport.forEach(obj => {\r\n obj.isSelected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.isSelected = true;\r\n\r\n this._store.state.isSelecting = false;\r\n\r\n if (objectsInViewport.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.addSelectionGroup(selectionGroup);\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n this.rerender();\r\n }\r\n }\r\n\r\n clearSelection() {\r\n this.removeSelectionGroup();\r\n\r\n this._store.state.objects.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);\r\n this._store.state.isSelecting = false;\r\n this._store.state.isResizeHandleSelected = false;\r\n this._store.state.isRotationHandleSelected = false;\r\n\r\n this.rerender();\r\n }\r\n\r\n resetActiveText() {\r\n const activeText = this._store.activeText;\r\n if (activeText) {\r\n if (activeText.isEmpty) {\r\n this.deleteObject(activeText.id);\r\n } else {\r\n activeText.save();\r\n }\r\n }\r\n }\r\n\r\n getObjectFromPointerEvent(event: PointerEvent, selector = '.object'): KritzelBaseObject<any> | null {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return null;\r\n\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const elementAtPoint = shadowRoot.elementFromPoint(clientX, clientY);\r\n if (!elementAtPoint) return null;\r\n\r\n const selectedObject = elementAtPoint.closest(selector) as HTMLElement | null;\r\n\r\n if (selectedObject) {\r\n const foundObject = this._store.allObjects.find(object => selectedObject.id === object.id);\r\n const isHit = foundObject?.hitTest(clientX, clientY);\r\n return isHit ? foundObject : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getObjectsFromPointerEvent(event: PointerEvent, selector = '.object'): KritzelBaseObject<any>[] {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return [];\r\n\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const elementsAtPoint = shadowRoot.elementsFromPoint(clientX, clientY);\r\n if (!elementsAtPoint || elementsAtPoint.length === 0) return [];\r\n\r\n const objectIds = new Set<string>();\r\n\r\n elementsAtPoint.forEach(element => {\r\n const selectedObject = element.closest(selector) as HTMLElement | null;\r\n if (selectedObject && selectedObject.id) {\r\n objectIds.add(selectedObject.id);\r\n }\r\n });\r\n\r\n if (objectIds.size > 0) {\r\n return this._store.allObjects.filter(object => objectIds.has(object.id)).sort((a, b) => b.zIndex - a.zIndex);\r\n }\r\n\r\n return [];\r\n }\r\n\r\n getCanvasPoint(event: PointerEvent): { x: number; y: number } {\r\n if (!this._store.state.host) {\r\n return { x: 0, y: 0 };\r\n }\r\n\r\n const hostRect = this._store.state.host.getBoundingClientRect();\r\n\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n const xWithoutTranslate = xRelativeToHost - this._store.state.translateX;\r\n const yWithoutTranslate = yRelativeToHost - this._store.state.translateY;\r\n\r\n const worldX = xWithoutTranslate / this._store.state.scale;\r\n const worldY = yWithoutTranslate / this._store.state.scale;\r\n\r\n return { x: worldX, y: worldY };\r\n }\r\n\r\n beforeWorkspaceChange() {\r\n this.resetActiveText();\r\n this.clearSelection();\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n }\r\n}\r\n"]}
@@ -10,31 +10,31 @@ export class KritzelStore {
10
10
  return this._state;
11
11
  }
12
12
  get currentZIndex() {
13
- return Math.max(0, ...this._state.objectsMap.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox)).map(o => o.zIndex)) + 1;
13
+ return Math.max(0, ...this._state.objects.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox)).map(o => o.zIndex)) + 1;
14
14
  }
15
15
  get allObjects() {
16
- return this._state.objectsMap.allObjects();
16
+ return this._state.objects.allObjects();
17
17
  }
18
18
  get allNonSelectionObjects() {
19
- return this._state.objectsMap.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox));
19
+ return this._state.objects.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox));
20
20
  }
21
21
  get selectedObjects() {
22
22
  return this.allObjects.filter(o => !(o instanceof KritzelSelectionGroup)).filter(o => o.isSelected);
23
23
  }
24
24
  get selectionBox() {
25
- const selectionBoxes = this._state.objectsMap.filter(o => o instanceof KritzelSelectionBox);
25
+ const selectionBoxes = this._state.objects.filter(o => o instanceof KritzelSelectionBox);
26
26
  return selectionBoxes.length > 0 ? selectionBoxes[0] : null;
27
27
  }
28
28
  get selectionGroup() {
29
- const selectionGroups = this._state.objectsMap.filter(o => o instanceof KritzelSelectionGroup);
29
+ const selectionGroups = this._state.objects.filter(o => o instanceof KritzelSelectionGroup);
30
30
  return selectionGroups.length > 0 ? selectionGroups[0] : null;
31
31
  }
32
32
  get activeText() {
33
- const activeTexts = this._state.objectsMap.filter(o => o instanceof KritzelText && o.isEditing);
33
+ const activeTexts = this._state.objects.filter(o => o instanceof KritzelText && o.isEditing);
34
34
  return activeTexts.length > 0 ? activeTexts[0] : null;
35
35
  }
36
36
  get currentPath() {
37
- const drawingPaths = this._state.objectsMap.filter(o => o instanceof KritzelPath && o.isCompleted === false);
37
+ const drawingPaths = this._state.objects.filter(o => o instanceof KritzelPath && o.isCompleted === false);
38
38
  return drawingPaths.length > 0 ? drawingPaths[0] : null;
39
39
  }
40
40
  get offsetX() {
@@ -48,7 +48,7 @@ export class KritzelStore {
48
48
  }
49
49
  constructor(state) {
50
50
  this._state = state;
51
- this._state.objectsMap = new KritzelObjectMap();
51
+ this._state.objects = new KritzelObjectMap();
52
52
  }
53
53
  onStateChange(property, listener) {
54
54
  if (!this._listeners.has(property)) {
@@ -1 +1 @@
1
- {"version":3,"file":"store.class.js","sourceRoot":"","sources":["../../../src/classes/core/store.class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,MAAM,OAAO,YAAY;IACN,MAAM,CAAqB;IAC3B,UAAU,GAAyD,IAAI,GAAG,EAAE,CAAC;IAE9F,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IACjK,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,mBAAmB,CAAC,CAAC,CAAC;IACvI,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,YAAY;QACd,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,mBAAmB,CAAC,CAAC;QAC5F,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,cAAc,CAAC,CAAC,CAAyB,CAAC,CAAC,CAAC,IAAI,CAAC;IACvF,CAAC;IAED,IAAI,cAAc;QAChB,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,qBAAqB,CAAC,CAAC;QAC/F,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,eAAe,CAAC,CAAC,CAA2B,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,CAAC;IAED,IAAI,UAAU;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,WAAW,IAAK,CAAiB,CAAC,SAAS,CAAC,CAAC;QACjH,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,WAAW,CAAC,CAAC,CAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,CAAC;IAED,IAAI,WAAW;QACb,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,WAAW,IAAK,CAAiB,CAAC,WAAW,KAAK,KAAK,CAAC,CAAC;QAC9H,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,YAAY,CAAC,CAAC,CAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC;IACvD,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC;IACtD,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC;IAClH,CAAC;IAED,YAAY,KAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAClD,CAAC;IAED,aAAa,CAA6B,QAAW,EAAE,QAAoD;QACzG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,QAAQ,CAA6B,QAAW;QAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,QAAQ,CAA6B,QAAW,EAAE,KAA4B;QAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEvC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;YAE9B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;IACH,CAAC;CACF","sourcesContent":["import { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelEngineState } from '../../interfaces/engine-state.interface';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelText } from '../objects/text.class';\r\nimport { KritzelPath } from '../objects/path.class';\r\nimport { StateChangeListener, StatePropertyKey } from '../../types/state.types';\r\nimport { KritzelObjectMap } from '../structures/object-map.structure';\r\n\r\nexport class KritzelStore {\r\n private readonly _state: KritzelEngineState;\r\n private readonly _listeners: Map<StatePropertyKey, Set<StateChangeListener<any>>> = new Map();\r\n\r\n get state(): KritzelEngineState {\r\n return this._state;\r\n }\r\n\r\n get currentZIndex() {\r\n return Math.max(0, ...this._state.objectsMap.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox)).map(o => o.zIndex)) + 1;\r\n }\r\n\r\n get allObjects() {\r\n return this._state.objectsMap.allObjects();\r\n }\r\n\r\n get allNonSelectionObjects() {\r\n return this._state.objectsMap.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox));\r\n }\r\n\r\n get selectedObjects() {\r\n return this.allObjects.filter(o => !(o instanceof KritzelSelectionGroup)).filter(o => o.isSelected);\r\n }\r\n\r\n get selectionBox(): KritzelSelectionBox | null {\r\n const selectionBoxes = this._state.objectsMap.filter(o => o instanceof KritzelSelectionBox);\r\n return selectionBoxes.length > 0 ? (selectionBoxes[0] as KritzelSelectionBox) : null;\r\n }\r\n\r\n get selectionGroup(): KritzelSelectionGroup | null {\r\n const selectionGroups = this._state.objectsMap.filter(o => o instanceof KritzelSelectionGroup);\r\n return selectionGroups.length > 0 ? (selectionGroups[0] as KritzelSelectionGroup) : null;\r\n }\r\n\r\n get activeText(): KritzelText | null {\r\n const activeTexts = this._state.objectsMap.filter(o => o instanceof KritzelText && (o as KritzelText).isEditing);\r\n return activeTexts.length > 0 ? (activeTexts[0] as KritzelText) : null;\r\n }\r\n\r\n get currentPath(): KritzelPath | null {\r\n const drawingPaths = this._state.objectsMap.filter(o => o instanceof KritzelPath && (o as KritzelPath).isCompleted === false);\r\n return drawingPaths.length > 0 ? (drawingPaths[0] as KritzelPath) : null;\r\n }\r\n\r\n get offsetX() {\r\n return this._state.host.getBoundingClientRect().left;\r\n }\r\n\r\n get offsetY() {\r\n return this._state.host.getBoundingClientRect().top;\r\n }\r\n\r\n get isDisabled() {\r\n return this._state.isEnabled === false || this._state.isReady === false || this._state.activeWorkspace === null;\r\n }\r\n\r\n constructor(state: KritzelEngineState) {\r\n this._state = state;\r\n this._state.objectsMap = new KritzelObjectMap();\r\n }\r\n\r\n onStateChange<K extends StatePropertyKey>(property: K, listener: StateChangeListener<KritzelEngineState[K]>): void {\r\n if (!this._listeners.has(property)) {\r\n this._listeners.set(property, new Set());\r\n }\r\n this._listeners.get(property).add(listener);\r\n }\r\n\r\n getState<K extends StatePropertyKey>(property: K): Readonly<KritzelEngineState[K]> {\r\n return this._state[property];\r\n }\r\n\r\n setState<K extends StatePropertyKey>(property: K, value: KritzelEngineState[K]): void {\r\n const oldValue = this._state[property];\r\n\r\n if (oldValue !== value) {\r\n this._state[property] = value;\r\n\r\n if (this._listeners.has(property)) {\r\n this._listeners.get(property).forEach(listener => listener(value, oldValue, String(property)));\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"store.class.js","sourceRoot":"","sources":["../../../src/classes/core/store.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelEngineState } from '../../interfaces/engine-state.interface';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelText } from '../objects/text.class';\r\nimport { KritzelPath } from '../objects/path.class';\r\nimport { StateChangeListener, StatePropertyKey } from '../../types/state.types';\r\nimport { KritzelObjectMap } from '../structures/object-map.structure';\r\nimport { KritzelBaseObject } from '../..';\r\n\r\nexport class KritzelStore {\r\n private readonly _state: KritzelEngineState;\r\n private readonly _listeners: Map<StatePropertyKey, Set<StateChangeListener<any>>> = new Map();\r\n\r\n get state(): KritzelEngineState {\r\n return this._state;\r\n }\r\n\r\n get currentZIndex() {\r\n return Math.max(0, ...this._state.objects.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox)).map(o => o.zIndex)) + 1;\r\n }\r\n\r\n get allObjects(): KritzelBaseObject<Element>[] {\r\n return this._state.objects.allObjects();\r\n }\r\n\r\n get allNonSelectionObjects(): KritzelBaseObject<Element>[] {\r\n return this._state.objects.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox));\r\n }\r\n\r\n get selectedObjects(): KritzelBaseObject<Element>[] {\r\n return this.allObjects.filter(o => !(o instanceof KritzelSelectionGroup)).filter(o => o.isSelected);\r\n }\r\n\r\n get selectionBox(): KritzelSelectionBox | null {\r\n const selectionBoxes = this._state.objects.filter(o => o instanceof KritzelSelectionBox);\r\n return selectionBoxes.length > 0 ? (selectionBoxes[0] as KritzelSelectionBox) : null;\r\n }\r\n\r\n get selectionGroup(): KritzelSelectionGroup | null {\r\n const selectionGroups = this._state.objects.filter(o => o instanceof KritzelSelectionGroup);\r\n return selectionGroups.length > 0 ? (selectionGroups[0] as KritzelSelectionGroup) : null;\r\n }\r\n\r\n get activeText(): KritzelText | null {\r\n const activeTexts = this._state.objects.filter(o => o instanceof KritzelText && (o as KritzelText).isEditing);\r\n return activeTexts.length > 0 ? (activeTexts[0] as KritzelText) : null;\r\n }\r\n\r\n get currentPath(): KritzelPath | null {\r\n const drawingPaths = this._state.objects.filter(o => o instanceof KritzelPath && (o as KritzelPath).isCompleted === false);\r\n return drawingPaths.length > 0 ? (drawingPaths[0] as KritzelPath) : null;\r\n }\r\n\r\n get offsetX() {\r\n return this._state.host.getBoundingClientRect().left;\r\n }\r\n\r\n get offsetY() {\r\n return this._state.host.getBoundingClientRect().top;\r\n }\r\n\r\n get isDisabled() {\r\n return this._state.isEnabled === false || this._state.isReady === false || this._state.activeWorkspace === null;\r\n }\r\n\r\n constructor(state: KritzelEngineState) {\r\n this._state = state;\r\n this._state.objects = new KritzelObjectMap();\r\n }\r\n\r\n onStateChange<K extends StatePropertyKey>(property: K, listener: StateChangeListener<KritzelEngineState[K]>): void {\r\n if (!this._listeners.has(property)) {\r\n this._listeners.set(property, new Set());\r\n }\r\n this._listeners.get(property).add(listener);\r\n }\r\n\r\n getState<K extends StatePropertyKey>(property: K): Readonly<KritzelEngineState[K]> {\r\n return this._state[property];\r\n }\r\n\r\n setState<K extends StatePropertyKey>(property: K, value: KritzelEngineState[K]): void {\r\n const oldValue = this._state[property];\r\n\r\n if (oldValue !== value) {\r\n this._state[property] = value;\r\n\r\n if (this._listeners.has(property)) {\r\n this._listeners.get(property).forEach(listener => listener(value, oldValue, String(property)));\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -45,7 +45,7 @@ export class KritzelViewport {
45
45
  if (activePointers.length === 2) {
46
46
  const currentPath = this._core.store.currentPath;
47
47
  if (currentPath) {
48
- this._core.store.state.objectsMap.remove(obj => obj.id === currentPath.id);
48
+ this._core.store.state.objects.remove(obj => obj.id === currentPath.id);
49
49
  }
50
50
  this._core.store.state.isScaling = true;
51
51
  const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.class.js","sourceRoot":"","sources":["../../../src/classes/core/viewport.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelBaseObject } from '../..';\r\nimport { KritzelMouseButton } from '../../enums/event-button.enum';\r\nimport { KritzelCore } from './core.class';\r\nimport { debounce } from 'lodash';\r\n\r\nexport class KritzelViewport {\r\n private readonly _core: KritzelCore;\r\n private readonly _debounceUpdate: () => void;\r\n private readonly _debounceEndScaling: () => void;\r\n\r\n initialTouchDistance: number = 0;\r\n startX: number = 0;\r\n startY: number = 0;\r\n\r\n constructor(core: KritzelCore, host: HTMLElement) {\r\n this._core = core;\r\n this._core.store.state.host = host;\r\n this._core.store.state.viewportWidth = host.clientWidth;\r\n this._core.store.state.viewportHeight = host.clientHeight;\r\n this._core.store.state.startX = 0;\r\n this._core.store.state.startY = 0;\r\n this._core.store.state.translateX = 0;\r\n this._core.store.state.translateY = 0;\r\n\r\n this._debounceUpdate = debounce(() => {\r\n this._core.updateWorkspaceViewport(\r\n this._core.store.state.translateX, \r\n this._core.store.state.translateY, \r\n this._core.store.state.scale\r\n );\r\n }, 300);\r\n\r\n this._debounceEndScaling = debounce(() => {\r\n this._core.store.state.isScaling = false;\r\n this._core.rerender();\r\n }, 100);\r\n }\r\n\r\n handleResize(): void {\r\n this._core.store.state.viewportWidth = this._core.store.state.host.clientWidth;\r\n this._core.store.state.viewportHeight = this._core.store.state.host.clientHeight;\r\n this._core.store.state.hasViewportChanged = true;\r\n this._core.rerender();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const adjustedClientX = event.clientX - this._core.store.offsetX;\r\n const adjustedClientY = event.clientY - this._core.store.offsetY;\r\n\r\n if (event.button === KritzelMouseButton.Right) {\r\n this._core.store.state.isPanning = true;\r\n this._core.store.state.startX = adjustedClientX;\r\n this._core.store.state.startY = adjustedClientY;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n const currentPath = this._core.store.currentPath;\r\n if (currentPath) {\r\n this._core.store.state.objectsMap.remove(obj => obj.id === currentPath.id);\r\n }\r\n this._core.store.state.isScaling = true;\r\n\r\n const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._core.store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._core.store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._core.store.offsetY;\r\n\r\n this.initialTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n this.startX = (firstTouchX + secondTouchX) / 2;\r\n this.startY = (firstTouchY + secondTouchY) / 2;\r\n this._core.rerender();\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const hostRect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n if (this._core.store.state.isPanning) {\r\n const dx = xRelativeToHost - this._core.store.state.startX;\r\n const dy = yRelativeToHost - this._core.store.state.startY;\r\n\r\n this._core.store.state.translateX += dx;\r\n this._core.store.state.translateY += dy;\r\n this._core.store.state.startX = xRelativeToHost;\r\n this._core.store.state.startY = yRelativeToHost;\r\n this._core.store.state.hasViewportChanged = true;\r\n this._core.store.state.skipContextMenu = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const hostRect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._core.store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._core.store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._core.store.offsetY;\r\n\r\n const currentTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n const midpointX = (firstTouchX + secondTouchX) / 2;\r\n const midpointY = (firstTouchY + secondTouchY) / 2;\r\n\r\n const scaleRatio = currentTouchDistance / this.initialTouchDistance!;\r\n const newScale = this._core.store.state.scale * scaleRatio;\r\n\r\n if (newScale > this._core.store.state.scaleMax || newScale < this._core.store.state.scaleMin) {\r\n this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX;\r\n this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY;\r\n } else {\r\n const translateXAdjustment = (midpointX - this._core.store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (midpointY - this._core.store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX - translateXAdjustment;\r\n this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY - translateYAdjustment;\r\n this._core.store.state.scale = newScale;\r\n\r\n this.initialTouchDistance = currentTouchDistance;\r\n }\r\n\r\n this.startX = midpointX;\r\n this.startY = midpointY;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isPanning) {\r\n this._core.store.state.isPanning = false;\r\n this._core.rerender();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n \r\n if (this._core.store.state.pointers.size === 0) {\r\n this._debounceEndScaling();\r\n }\r\n }\r\n }\r\n\r\n handleWheel(event: WheelEvent): void {\r\n event.preventDefault();\r\n\r\n if (event.ctrlKey === true && Math.abs(event.deltaY) > 0 && Math.abs(event.deltaX) === 0) {\r\n this.handleZoom(event);\r\n }\r\n\r\n if (!event.ctrlKey) {\r\n this.handlePan(event);\r\n }\r\n }\r\n\r\n centerInViewport(object: KritzelBaseObject): void {\r\n const { scale, viewportWidth, viewportHeight } = this._core.store.state;\r\n const { x, y, width, height } = object.rotatedBoundingBox;\r\n\r\n const objectCenterX = x + width / 2;\r\n const objectCenterY = y + height / 2;\r\n\r\n this._core.store.state.translateX = viewportWidth / 2 - objectCenterX * scale;\r\n this._core.store.state.translateY = viewportHeight / 2 - objectCenterY * scale;\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n\r\n centerFitInViewport(object: KritzelBaseObject): void {\r\n const scaleX = this._core.store.state.viewportWidth / (object.rotatedBoundingBox.width * 1.1);\r\n const scaleY = this._core.store.state.viewportHeight / (object.rotatedBoundingBox.height * 1.1);\r\n const newScale = Math.min(scaleX, scaleY, this._core.store.state.scaleMax);\r\n const clampedScale = Math.max(newScale, this._core.store.state.scaleMin);\r\n\r\n this._core.store.state.scale = clampedScale;\r\n this.centerInViewport(object);\r\n }\r\n\r\n private handleZoom(event: WheelEvent): void {\r\n this._core.store.state.isScaling = true;\r\n const rect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - rect.left;\r\n const yRelativeToHost = event.clientY - rect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n const rawScaleFactor = 1 + (event.deltaY * -0.012);\r\n const scaleFactor = Math.max(0.8, Math.min(1.2, rawScaleFactor));\r\n const newScale = Math.min(this._core.store.state.scaleMax, Math.max(this._core.store.state.scaleMin, this._core.store.state.scale * scaleFactor));\r\n\r\n const scaleRatio = newScale / this._core.store.state.scale;\r\n const translateXAdjustment = (xRelativeToHost - this._core.store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (yRelativeToHost - this._core.store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._core.store.state.scale = newScale;\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX - translateXAdjustment;\r\n this._core.store.state.translateY = this._core.store.state.translateY - translateYAdjustment;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n this._debounceEndScaling();\r\n }\r\n\r\n private handlePan(event: WheelEvent): void {\r\n const panSpeed = 0.8;\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX - event.deltaX * panSpeed;\r\n this._core.store.state.translateY = this._core.store.state.translateY - event.deltaY * panSpeed;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"viewport.class.js","sourceRoot":"","sources":["../../../src/classes/core/viewport.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelBaseObject } from '../..';\r\nimport { KritzelMouseButton } from '../../enums/event-button.enum';\r\nimport { KritzelCore } from './core.class';\r\nimport { debounce } from 'lodash';\r\n\r\nexport class KritzelViewport {\r\n private readonly _core: KritzelCore;\r\n private readonly _debounceUpdate: () => void;\r\n private readonly _debounceEndScaling: () => void;\r\n\r\n initialTouchDistance: number = 0;\r\n startX: number = 0;\r\n startY: number = 0;\r\n\r\n constructor(core: KritzelCore, host: HTMLElement) {\r\n this._core = core;\r\n this._core.store.state.host = host;\r\n this._core.store.state.viewportWidth = host.clientWidth;\r\n this._core.store.state.viewportHeight = host.clientHeight;\r\n this._core.store.state.startX = 0;\r\n this._core.store.state.startY = 0;\r\n this._core.store.state.translateX = 0;\r\n this._core.store.state.translateY = 0;\r\n\r\n this._debounceUpdate = debounce(() => {\r\n this._core.updateWorkspaceViewport(\r\n this._core.store.state.translateX, \r\n this._core.store.state.translateY, \r\n this._core.store.state.scale\r\n );\r\n }, 300);\r\n\r\n this._debounceEndScaling = debounce(() => {\r\n this._core.store.state.isScaling = false;\r\n this._core.rerender();\r\n }, 100);\r\n }\r\n\r\n handleResize(): void {\r\n this._core.store.state.viewportWidth = this._core.store.state.host.clientWidth;\r\n this._core.store.state.viewportHeight = this._core.store.state.host.clientHeight;\r\n this._core.store.state.hasViewportChanged = true;\r\n this._core.rerender();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const adjustedClientX = event.clientX - this._core.store.offsetX;\r\n const adjustedClientY = event.clientY - this._core.store.offsetY;\r\n\r\n if (event.button === KritzelMouseButton.Right) {\r\n this._core.store.state.isPanning = true;\r\n this._core.store.state.startX = adjustedClientX;\r\n this._core.store.state.startY = adjustedClientY;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n const currentPath = this._core.store.currentPath;\r\n if (currentPath) {\r\n this._core.store.state.objects.remove(obj => obj.id === currentPath.id);\r\n }\r\n this._core.store.state.isScaling = true;\r\n\r\n const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._core.store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._core.store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._core.store.offsetY;\r\n\r\n this.initialTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n this.startX = (firstTouchX + secondTouchX) / 2;\r\n this.startY = (firstTouchY + secondTouchY) / 2;\r\n this._core.rerender();\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const hostRect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n if (this._core.store.state.isPanning) {\r\n const dx = xRelativeToHost - this._core.store.state.startX;\r\n const dy = yRelativeToHost - this._core.store.state.startY;\r\n\r\n this._core.store.state.translateX += dx;\r\n this._core.store.state.translateY += dy;\r\n this._core.store.state.startX = xRelativeToHost;\r\n this._core.store.state.startY = yRelativeToHost;\r\n this._core.store.state.hasViewportChanged = true;\r\n this._core.store.state.skipContextMenu = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const hostRect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._core.store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._core.store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._core.store.offsetY;\r\n\r\n const currentTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n const midpointX = (firstTouchX + secondTouchX) / 2;\r\n const midpointY = (firstTouchY + secondTouchY) / 2;\r\n\r\n const scaleRatio = currentTouchDistance / this.initialTouchDistance!;\r\n const newScale = this._core.store.state.scale * scaleRatio;\r\n\r\n if (newScale > this._core.store.state.scaleMax || newScale < this._core.store.state.scaleMin) {\r\n this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX;\r\n this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY;\r\n } else {\r\n const translateXAdjustment = (midpointX - this._core.store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (midpointY - this._core.store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX - translateXAdjustment;\r\n this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY - translateYAdjustment;\r\n this._core.store.state.scale = newScale;\r\n\r\n this.initialTouchDistance = currentTouchDistance;\r\n }\r\n\r\n this.startX = midpointX;\r\n this.startY = midpointY;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isPanning) {\r\n this._core.store.state.isPanning = false;\r\n this._core.rerender();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n \r\n if (this._core.store.state.pointers.size === 0) {\r\n this._debounceEndScaling();\r\n }\r\n }\r\n }\r\n\r\n handleWheel(event: WheelEvent): void {\r\n event.preventDefault();\r\n\r\n if (event.ctrlKey === true && Math.abs(event.deltaY) > 0 && Math.abs(event.deltaX) === 0) {\r\n this.handleZoom(event);\r\n }\r\n\r\n if (!event.ctrlKey) {\r\n this.handlePan(event);\r\n }\r\n }\r\n\r\n centerInViewport(object: KritzelBaseObject): void {\r\n const { scale, viewportWidth, viewportHeight } = this._core.store.state;\r\n const { x, y, width, height } = object.rotatedBoundingBox;\r\n\r\n const objectCenterX = x + width / 2;\r\n const objectCenterY = y + height / 2;\r\n\r\n this._core.store.state.translateX = viewportWidth / 2 - objectCenterX * scale;\r\n this._core.store.state.translateY = viewportHeight / 2 - objectCenterY * scale;\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n\r\n centerFitInViewport(object: KritzelBaseObject): void {\r\n const scaleX = this._core.store.state.viewportWidth / (object.rotatedBoundingBox.width * 1.1);\r\n const scaleY = this._core.store.state.viewportHeight / (object.rotatedBoundingBox.height * 1.1);\r\n const newScale = Math.min(scaleX, scaleY, this._core.store.state.scaleMax);\r\n const clampedScale = Math.max(newScale, this._core.store.state.scaleMin);\r\n\r\n this._core.store.state.scale = clampedScale;\r\n this.centerInViewport(object);\r\n }\r\n\r\n private handleZoom(event: WheelEvent): void {\r\n this._core.store.state.isScaling = true;\r\n const rect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - rect.left;\r\n const yRelativeToHost = event.clientY - rect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n const rawScaleFactor = 1 + (event.deltaY * -0.012);\r\n const scaleFactor = Math.max(0.8, Math.min(1.2, rawScaleFactor));\r\n const newScale = Math.min(this._core.store.state.scaleMax, Math.max(this._core.store.state.scaleMin, this._core.store.state.scale * scaleFactor));\r\n\r\n const scaleRatio = newScale / this._core.store.state.scale;\r\n const translateXAdjustment = (xRelativeToHost - this._core.store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (yRelativeToHost - this._core.store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._core.store.state.scale = newScale;\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX - translateXAdjustment;\r\n this._core.store.state.translateY = this._core.store.state.translateY - translateYAdjustment;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n this._debounceEndScaling();\r\n }\r\n\r\n private handlePan(event: WheelEvent): void {\r\n const panSpeed = 0.8;\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX - event.deltaX * panSpeed;\r\n this._core.store.state.translateY = this._core.store.state.translateY - event.deltaY * panSpeed;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n}\r\n"]}
@@ -21,7 +21,7 @@ export class KritzelContextMenuHandler extends KritzelBaseHandler {
21
21
  const selectionTool = this._core.store.state.activeTool;
22
22
  selectionTool?.moveHandler?.cancelPendingDrag();
23
23
  if (this._core.store.selectionBox) {
24
- this._core.store.state.objectsMap.remove(object => object instanceof KritzelSelectionBox);
24
+ this._core.store.state.objects.remove(object => object instanceof KritzelSelectionBox);
25
25
  this._core.store.state.isSelecting = false;
26
26
  }
27
27
  const selectedObject = this._core.getObjectFromPointerEvent(event, '.object');