kritzel-stencil 0.1.21 → 0.1.23

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 (43) hide show
  1. package/dist/cjs/{default-line-tool.config-Bva9deYM.js → default-line-tool.config-Ba74O1gD.js} +31 -9
  2. package/dist/cjs/index.cjs.js +1 -1
  3. package/dist/cjs/kritzel-back-to-content_32.cjs.entry.js +127 -114
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/stencil.cjs.js +1 -1
  6. package/dist/collection/classes/objects/shape.class.js +9 -3
  7. package/dist/collection/classes/objects/text.class.js +19 -3
  8. package/dist/collection/classes/tools/text-tool.class.js +3 -3
  9. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +20 -34
  10. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +171 -15
  11. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +29 -72
  12. package/dist/collection/constants/version.js +1 -1
  13. package/dist/components/index.js +1 -1
  14. package/dist/components/kritzel-controls.js +1 -1
  15. package/dist/components/kritzel-editor.js +1 -1
  16. package/dist/components/kritzel-engine.js +1 -1
  17. package/dist/components/kritzel-settings.js +1 -1
  18. package/dist/components/kritzel-tool-config.js +1 -1
  19. package/dist/components/kritzel-tooltip.js +1 -1
  20. package/dist/components/p-0YNMEgri.js +1 -0
  21. package/dist/components/p-B1qfRBi0.js +1 -0
  22. package/dist/components/{p-Dmy0R-7y.js → p-DAPeFBqC.js} +1 -1
  23. package/dist/components/{p-CYX7RMRZ.js → p-DYAnRoi2.js} +1 -1
  24. package/dist/components/{p-BsvZ2juR.js → p-IGA64WxD.js} +1 -1
  25. package/dist/components/{p-BbHELXEC.js → p-mPdux0tA.js} +2 -2
  26. package/dist/esm/{default-line-tool.config-DDIFE6oX.js → default-line-tool.config-BW07ZETV.js} +31 -9
  27. package/dist/esm/index.js +2 -2
  28. package/dist/esm/kritzel-back-to-content_32.entry.js +127 -114
  29. package/dist/esm/loader.js +1 -1
  30. package/dist/esm/stencil.js +1 -1
  31. package/dist/stencil/index.esm.js +1 -1
  32. package/dist/stencil/p-55409078.entry.js +9 -0
  33. package/dist/stencil/p-BW07ZETV.js +1 -0
  34. package/dist/stencil/stencil.esm.js +1 -1
  35. package/dist/types/components/shared/kritzel-tooltip/kritzel-tooltip.d.ts +11 -1
  36. package/dist/types/components/ui/kritzel-controls/kritzel-controls.d.ts +3 -11
  37. package/dist/types/components.d.ts +7 -0
  38. package/dist/types/constants/version.d.ts +1 -1
  39. package/package.json +1 -1
  40. package/dist/components/p-BNT9uvII.js +0 -1
  41. package/dist/components/p-DqtvAhfs.js +0 -1
  42. package/dist/stencil/p-3fc743ee.entry.js +0 -9
  43. package/dist/stencil/p-DDIFE6oX.js +0 -1
@@ -19,7 +19,7 @@ var patchBrowser = () => {
19
19
 
20
20
  patchBrowser().then(async (options) => {
21
21
  await appGlobals.globalScripts();
22
- return index.bootstrapLazy([["kritzel-back-to-content_32.cjs",[[512,"kritzel-editor",{"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"lockDrawingScale":[1028,"lock-drawing-scale"],"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],"isBackToContentButtonVisible":[32],"currentTheme":[32],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"backToContent":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"dblclick","onTouchStart"]],{"isEngineReady":[{"onIsEngineReady":0}],"isControlsReady":[{"onIsControlsReady":0}],"workspaces":[{"onWorkspacesChange":0}],"currentTheme":[{"onCurrentThemeChange":0}]}],[513,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"theme":[1],"firstConfig":[32],"isTooltipVisible":[32],"isTouchDevice":[32],"selectedSubOptions":[32],"openSubMenuControl":[32],"canScrollLeft":[32],"canScrollRight":[32],"needsScrolling":[32],"displayValues":[32],"closeTooltip":[64]},[[4,"click","handleDocumentClick"],[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"],[4,"objectsSelectionChange","handleSelectionChange"]],{"theme":[{"onThemeChange":0}]}],[513,"kritzel-settings",{"isDialogOpen":[32],"selectedCategoryId":[32],"scaleMin":[32],"scaleMax":[32],"lockDrawingScale":[32],"currentTheme":[32],"open":[64]}],[513,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[513,"kritzel-more-menu",{"items":[16],"icon":[1],"iconSize":[2,"icon-size"],"offsetY":[2,"offset-y"],"menuAnchor":[32]}],[513,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"cursorTarget":[16],"lockDrawingScale":[4,"lock-drawing-scale"],"theme":[1],"forceUpdate":[32],"triggerSelectionChange":[64],"registerTool":[64],"changeActiveTool":[64],"disable":[64],"enable":[64],"delete":[64],"copy":[64],"paste":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"group":[64],"ungroup":[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],"backToContent":[64],"getCopiedObjects":[64],"getScreenshot":[64],"exportViewportAsPng":[64],"exportViewportAsSvg":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[1,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[1,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{"workspace":[{"onWorkspaceChange":0}],"scaleMax":[{"validateScaleMax":0}],"scaleMin":[{"validateScaleMin":0}],"cursorTarget":[{"onCursorTargetChange":0}],"lockDrawingScale":[{"onLockDrawingScaleChange":0}],"theme":[{"onThemeChange":0}]}],[513,"kritzel-export",{"isDialogOpen":[32],"previewUrl":[32],"isLoading":[32],"open":[64]}],[513,"kritzel-back-to-content",{"visible":[4],"text":[1]}],[513,"kritzel-tool-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"theme":[1],"config":[32],"palette":[32],"currentOpacity":[32],"updateTrigger":[32]},[[4,"objectsSelectionChange","handleSelectionChange"]],{"tool":[{"handleToolChange":0}],"theme":[{"onThemeChange":0}]}],[513,"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]}],[513,"kritzel-context-menu",{"items":[16],"objects":[16],"processedItems":[32]},[[9,"pointerdown","handleOutsideClick"]],{"items":[{"onItemsChanged":0}]}],[769,"kritzel-master-detail",{"items":[16],"selectedItemId":[1,"selected-item-id"],"focusedIndex":[32],"showMobileDetail":[32]},null,{"selectedItemId":[{"watchSelectedItemId":0}]}],[513,"kritzel-utility-panel",{"undoState":[16]}],[513,"kritzel-cursor-trail",{"core":[16],"cursorTrailPoints":[32],"isLeftButtonDown":[32]},[[9,"pointerdown","handleMouseDown"],[9,"pointermove","handlePointerMove"],[9,"pointerup","handlePointerUp"]]],[513,"kritzel-numeric-input",{"value":[1026],"min":[2],"max":[2],"step":[2],"label":[1],"inputValue":[32]},null,{"value":[{"onValueChange":0}]}],[513,"kritzel-slide-toggle",{"checked":[1028],"disabled":[4],"label":[1]}],[769,"kritzel-tooltip",{"isVisible":[4,"is-visible"],"anchorElement":[16],"offsetY":[2,"offset-y"],"positionX":[32],"positionY":[32],"focusContent":[64]},[[4,"click","handleOutsideClick"],[7,"pointerdown","handleOutsidePointerDown"],[9,"resize","handleWindowResize"]]],[513,"kritzel-color-palette",{"colors":[16],"selectedColor":[1040],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"],"opacity":[2],"theme":[1]}],[513,"kritzel-font-family",{"fontOptions":[16],"selectedFontFamily":[1025,"selected-font-family"]}],[513,"kritzel-font-size",{"sizes":[16],"selectedSize":[1026,"selected-size"],"fontFamily":[1,"font-family"]}],[513,"kritzel-stroke-size",{"sizes":[16],"selectedSize":[1026,"selected-size"]}],[769,"kritzel-dialog",{"isOpen":[516,"is-open"],"dialogTitle":[1,"dialog-title"],"closable":[4],"closeOnBackdrop":[4,"close-on-backdrop"],"closeOnEscape":[4,"close-on-escape"],"autoFocus":[4,"auto-focus"],"trapFocus":[4,"trap-focus"],"size":[1],"fullscreenOnMobile":[4,"fullscreen-on-mobile"],"isAnimating":[32],"open":[64],"close":[64],"focusFirstElement":[64]},[[8,"keydown","handleKeyDown"]],{"isOpen":[{"handleIsOpenChange":0}]}],[513,"kritzel-line-endings",{"styles":[16],"value":[1040]}],[513,"kritzel-opacity-slider",{"value":[1026],"min":[2],"max":[2],"step":[2],"previewColor":[1,"preview-color"]}],[513,"kritzel-shape-fill",{"value":[1025]}],[513,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[513,"kritzel-color",{"value":[1],"theme":[1],"size":[2]}],[769,"kritzel-dropdown",{"options":[16],"value":[1],"width":[1],"selectStyles":[16],"internalValue":[32],"hasSuffixContent":[32],"hasPrefixContent":[32],"isOpen":[32],"focusedIndex":[32],"openDirection":[32]},[[4,"click","handleDocumentClick"],[4,"keydown","handleDocumentKeydown"]],{"options":[{"optionsChanged":0}],"value":[{"externalValueChanged":0}]}],[513,"kritzel-menu",{"items":[16],"parent":[16],"selectedIndex":[32],"setScrollTop":[64],"setFocus":[64]}],[513,"kritzel-menu-item",{"item":[16],"parent":[16],"isDirty":[32]},null,{"item":[{"onItemChange":0}]}],[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":0}]}],[513,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}]]],["kritzel-brush-style.cjs",[[513,"kritzel-brush-style",{"type":[1],"brushOptions":[16]}]]]], options);
22
+ return index.bootstrapLazy([["kritzel-back-to-content_32.cjs",[[512,"kritzel-editor",{"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"lockDrawingScale":[1028,"lock-drawing-scale"],"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],"isBackToContentButtonVisible":[32],"currentTheme":[32],"getObjectById":[64],"addObject":[64],"updateObject":[64],"removeObject":[64],"getSelectedObjects":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"backToContent":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[0,"dblclick","onTouchStart"]],{"isEngineReady":[{"onIsEngineReady":0}],"isControlsReady":[{"onIsControlsReady":0}],"workspaces":[{"onWorkspacesChange":0}],"currentTheme":[{"onCurrentThemeChange":0}]}],[513,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"theme":[1],"firstConfig":[32],"isTouchDevice":[32],"selectedSubOptions":[32],"canScrollLeft":[32],"canScrollRight":[32],"needsScrolling":[32],"displayValues":[32],"closeTooltip":[64]},[[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"],[4,"objectsSelectionChange","handleSelectionChange"]],{"theme":[{"onThemeChange":0}]}],[513,"kritzel-settings",{"isDialogOpen":[32],"selectedCategoryId":[32],"scaleMin":[32],"scaleMax":[32],"lockDrawingScale":[32],"currentTheme":[32],"open":[64]}],[513,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[513,"kritzel-more-menu",{"items":[16],"icon":[1],"iconSize":[2,"icon-size"],"offsetY":[2,"offset-y"],"menuAnchor":[32]}],[513,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"cursorTarget":[16],"lockDrawingScale":[4,"lock-drawing-scale"],"theme":[1],"forceUpdate":[32],"triggerSelectionChange":[64],"registerTool":[64],"changeActiveTool":[64],"disable":[64],"enable":[64],"delete":[64],"copy":[64],"paste":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"group":[64],"ungroup":[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],"backToContent":[64],"getCopiedObjects":[64],"getScreenshot":[64],"exportViewportAsPng":[64],"exportViewportAsSvg":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64]},[[1,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[1,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{"workspace":[{"onWorkspaceChange":0}],"scaleMax":[{"validateScaleMax":0}],"scaleMin":[{"validateScaleMin":0}],"cursorTarget":[{"onCursorTargetChange":0}],"lockDrawingScale":[{"onLockDrawingScaleChange":0}],"theme":[{"onThemeChange":0}]}],[513,"kritzel-export",{"isDialogOpen":[32],"previewUrl":[32],"isLoading":[32],"open":[64]}],[513,"kritzel-back-to-content",{"visible":[4],"text":[1]}],[513,"kritzel-tool-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"theme":[1],"config":[32],"palette":[32],"currentOpacity":[32],"updateTrigger":[32]},[[4,"objectsSelectionChange","handleSelectionChange"]],{"tool":[{"handleToolChange":0}],"theme":[{"onThemeChange":0}]}],[513,"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]}],[513,"kritzel-context-menu",{"items":[16],"objects":[16],"processedItems":[32]},[[9,"pointerdown","handleOutsideClick"]],{"items":[{"onItemsChanged":0}]}],[769,"kritzel-master-detail",{"items":[16],"selectedItemId":[1,"selected-item-id"],"focusedIndex":[32],"showMobileDetail":[32]},null,{"selectedItemId":[{"watchSelectedItemId":0}]}],[513,"kritzel-utility-panel",{"undoState":[16]}],[513,"kritzel-cursor-trail",{"core":[16],"cursorTrailPoints":[32],"isLeftButtonDown":[32]},[[9,"pointerdown","handleMouseDown"],[9,"pointermove","handlePointerMove"],[9,"pointerup","handlePointerUp"]]],[513,"kritzel-numeric-input",{"value":[1026],"min":[2],"max":[2],"step":[2],"label":[1],"inputValue":[32]},null,{"value":[{"onValueChange":0}]}],[513,"kritzel-slide-toggle",{"checked":[1028],"disabled":[4],"label":[1]}],[769,"kritzel-tooltip",{"isVisible":[1028,"is-visible"],"anchorElement":[16],"triggerElement":[16],"offsetY":[2,"offset-y"],"positionX":[32],"positionY":[32],"open":[64],"close":[64],"toggle":[64],"focusContent":[64]},[[4,"click","handleOutsideClick"],[7,"pointerdown","handleOutsidePointerDown"],[4,"kritzelTooltipCloseAll","handleCloseAll"],[9,"resize","handleWindowResize"]],{"triggerElement":[{"handleTriggerElementChange":0}],"isVisible":[{"handleVisibilityChange":0}]}],[513,"kritzel-color-palette",{"colors":[16],"selectedColor":[1040],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"],"opacity":[2],"theme":[1]}],[513,"kritzel-font-family",{"fontOptions":[16],"selectedFontFamily":[1025,"selected-font-family"]}],[513,"kritzel-font-size",{"sizes":[16],"selectedSize":[1026,"selected-size"],"fontFamily":[1,"font-family"]}],[513,"kritzel-stroke-size",{"sizes":[16],"selectedSize":[1026,"selected-size"]}],[769,"kritzel-dialog",{"isOpen":[516,"is-open"],"dialogTitle":[1,"dialog-title"],"closable":[4],"closeOnBackdrop":[4,"close-on-backdrop"],"closeOnEscape":[4,"close-on-escape"],"autoFocus":[4,"auto-focus"],"trapFocus":[4,"trap-focus"],"size":[1],"fullscreenOnMobile":[4,"fullscreen-on-mobile"],"isAnimating":[32],"open":[64],"close":[64],"focusFirstElement":[64]},[[8,"keydown","handleKeyDown"]],{"isOpen":[{"handleIsOpenChange":0}]}],[513,"kritzel-line-endings",{"styles":[16],"value":[1040]}],[513,"kritzel-opacity-slider",{"value":[1026],"min":[2],"max":[2],"step":[2],"previewColor":[1,"preview-color"]}],[513,"kritzel-shape-fill",{"value":[1025]}],[513,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[513,"kritzel-color",{"value":[1],"theme":[1],"size":[2]}],[769,"kritzel-dropdown",{"options":[16],"value":[1],"width":[1],"selectStyles":[16],"internalValue":[32],"hasSuffixContent":[32],"hasPrefixContent":[32],"isOpen":[32],"focusedIndex":[32],"openDirection":[32]},[[4,"click","handleDocumentClick"],[4,"keydown","handleDocumentKeydown"]],{"options":[{"optionsChanged":0}],"value":[{"externalValueChanged":0}]}],[513,"kritzel-menu",{"items":[16],"parent":[16],"selectedIndex":[32],"setScrollTop":[64],"setFocus":[64]}],[513,"kritzel-menu-item",{"item":[16],"parent":[16],"isDirty":[32]},null,{"item":[{"onItemChange":0}]}],[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":0}]}],[513,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}]]],["kritzel-brush-style.cjs",[[513,"kritzel-brush-style",{"type":[1],"brushOptions":[16]}]]]], options);
23
23
  });
24
24
 
25
25
  exports.setNonce = index.setNonce;
@@ -234,19 +234,25 @@ export class KritzelShape extends KritzelBaseObject {
234
234
  if (!this.isEditing) {
235
235
  return;
236
236
  }
237
- event.stopPropagation();
237
+ if (!this._core.store.state.pointers.has(event.pointerId)) {
238
+ event.stopPropagation();
239
+ }
238
240
  }
239
241
  handlePointerMove(event) {
240
242
  if (!this.isEditing) {
241
243
  return;
242
244
  }
243
- event.stopPropagation();
245
+ if (!this._core.store.state.pointers.has(event.pointerId)) {
246
+ event.stopPropagation();
247
+ }
244
248
  }
245
249
  handlePointerUp(event) {
246
250
  if (!this.isEditing) {
247
251
  return;
248
252
  }
249
- event.stopPropagation();
253
+ if (!this._core.store.state.pointers.has(event.pointerId)) {
254
+ event.stopPropagation();
255
+ }
250
256
  }
251
257
  copy() {
252
258
  const copiedObject = super.copy();
@@ -169,7 +169,7 @@ export class KritzelText extends KritzelBaseObject {
169
169
  focus(coords) {
170
170
  if (this.editor) {
171
171
  const doc = this.editor.state.doc;
172
- if (coords.x && coords.y) {
172
+ if (coords.x && coords.y && !this.isEmpty) {
173
173
  const pos = this.editor.posAtCoords({ left: coords.x, top: coords.y });
174
174
  if (pos) {
175
175
  this.editor.dispatch(this.editor.state.tr.setSelection(TextSelection.create(doc, pos.pos)));
@@ -230,13 +230,29 @@ export class KritzelText extends KritzelBaseObject {
230
230
  if (!this.isEditing) {
231
231
  return;
232
232
  }
233
- event.stopPropagation();
233
+ // Only stop propagation if the engine is not tracking this pointer.
234
+ // During text creation, the engine adds the pointer before the text element
235
+ // is in the DOM. We must let move events propagate so the engine can
236
+ // update its pointer state.
237
+ if (!this._core.store.state.pointers.has(event.pointerId)) {
238
+ event.stopPropagation();
239
+ }
234
240
  }
235
241
  handlePointerUp(event) {
236
242
  if (!this.isEditing) {
237
243
  return;
238
244
  }
239
- event.stopPropagation();
245
+ // Only stop propagation if the engine is not tracking this pointer.
246
+ // When a text is created during pointerdown, the engine adds the pointer
247
+ // to its map before the text element exists in the DOM. By the time
248
+ // pointerup fires, the text element may intercept the event (especially
249
+ // on iOS where pointer capture may not redirect events in shadow DOM).
250
+ // We must let the event propagate so the engine can clean up the pointer.
251
+ // Without this, stale pointers accumulate and single-finger touches
252
+ // get misinterpreted as two-finger zoom gestures.
253
+ if (!this._core.store.state.pointers.has(event.pointerId)) {
254
+ event.stopPropagation();
255
+ }
240
256
  }
241
257
  copy() {
242
258
  const copiedObject = super.copy();
@@ -91,9 +91,9 @@ export class KritzelTextTool extends KritzelBaseTool {
91
91
  }
92
92
  }
93
93
  handlePointerUp(event) {
94
- if (event.cancelable) {
95
- event.preventDefault();
94
+ const activeText = this._core.store.activeText;
95
+ if (activeText && activeText.isMounted && !activeText.editor?.hasFocus()) {
96
+ activeText.focus({ x: event.clientX, y: event.clientY });
96
97
  }
97
- this._core.store.activeText?.edit(event);
98
98
  }
99
99
  }
@@ -126,7 +126,9 @@ export class KritzelEngine {
126
126
  return;
127
127
  }
128
128
  this.core.store.state.pointers.delete(ev.pointerId);
129
- this.host.releasePointerCapture(ev.pointerId);
129
+ if (this.host.hasPointerCapture(ev.pointerId)) {
130
+ this.host.releasePointerCapture(ev.pointerId);
131
+ }
130
132
  // Reset cursor to default when all pointers are released
131
133
  if (this.core.store.state.pointers.size === 0) {
132
134
  this.core.cursorManager.resetToDefault();
@@ -138,7 +140,9 @@ export class KritzelEngine {
138
140
  if (this.core.store.isDisabled) {
139
141
  return;
140
142
  }
141
- this.host.releasePointerCapture(ev.pointerId);
143
+ if (this.host.hasPointerCapture(ev.pointerId)) {
144
+ this.host.releasePointerCapture(ev.pointerId);
145
+ }
142
146
  this.core.store.state.pointers.delete(ev.pointerId);
143
147
  // Reset cursor to default when all pointers are released
144
148
  if (this.core.store.state.pointers.size === 0) {
@@ -507,7 +511,7 @@ export class KritzelEngine {
507
511
  if (this.core.store.totalObjectCount > 0) {
508
512
  this.objectsInViewportChange.emit(visibleObjects);
509
513
  }
510
- return (h(Host, { key: '26d2ef50f28fb809d046b60dff6e977dec53fc8c' }, this.core.store.state.debugInfo.showViewportInfo && (h("div", { key: 'bbacc63967672c6934d1c90913139f1f96e532cb', class: "debug-panel" }, h("div", { key: '59d46ef1a1a8dffe7b1bd97b0df3c77fdd095d97' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: 'd6bc9b3c6076540ccfec4fd2ef3b3e2edf08d524' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '12e229d893933a01bbfdd038e1bd14eee198b34e' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: '9caf69c342d545a478bb4945aa7b2c37ea77561f' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '123f6b17777475f4de32872b940abd3b7ffe6d78' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '463c70e208dad8572317bbde0df0f4b149674a7d' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: '82deb6d97ae66c86431b32582114f81bcd83e5ae' }, "PointerCount: ", this.core.store.state.pointers.size), h("div", { key: 'be32ffe65da2fc92f556ac037afa5b50c27cedd2' }, "Scale: ", this.core.store.state?.scale), h("div", { key: '53029e75a8972f670ef0fa427549415fd8be7986' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: '27517882d278f0df7df59858a9219d356e5bbd8d' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: '616611f9ad570741c9be3eabd0c78dc978c16c4f' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: '318a17d0b0d7eb2a58233c76063cc72e87782f1b' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '45c92f5cc524338b5c0cab5f5123faf0296e7484' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '4b295ddaf8eb9e49547430c839a9ba50daacd42e' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: 'eef9039260d0f1ffa23102aee0f18ebd90111738' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '1a22a4a93ddab249532fe40640f1fa7bbb485d76' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: '094daef63fffab66051e1c65392baac58d8f3eca' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: 'dae17ba3dec0ededdfb873eda4081fb51cea0c52' }, "IsRotationHandleHovered: ", this.core.store.state.isRotationHandleHovered ? 'true' : 'false'), h("div", { key: '11b4c3fb7fef201e6a98a58f586e1c717f255af4' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: 'ac7b98f441747b90f047069b9e7eac2ac5194eec' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: 'eb2285428d88835319c68ff26cb99e1e631cba82' }, "IsPointerDown: ", this.core.store.isPointerDown ? 'true' : 'false'), h("div", { key: 'd32cb23e569a84b16a50b98d2e3d778c6462c88c' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '0b4fafde05bb83d4046b103015a4f008c5b268d8' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '0083eb1e81cd1d0552e0fa2d6cca147e14e0bd86' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: '232f452fd89d22db9e4aaf8e6d3b672f934422a5' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")"))), h("div", { key: '66a0d3a6ac62153acf6ed1b7c57b3ae77daa3c5e', id: "origin", class: "origin", style: {
514
+ return (h(Host, { key: '6cc974d4e3fdcfe1b185a014fa9eb6b1243dde91' }, this.core.store.state.debugInfo.showViewportInfo && (h("div", { key: '8f8ac08f2d643b664e2b39fbaf50e0c474c5255d', class: "debug-panel" }, h("div", { key: '79ad4f3db958d8b17b2efdb3a1a6ab24d81bb436' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: '0cdaa6abeebc865eec1c3026d5fd38e00bd388a7' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '125ca4bb69ca2fcc647bd55e9cb8c4072fbaa600' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: '02aee9b8359b9cdefa2f54afc26d328dab984ea3' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '8398e28a5c70318dace386182633088e5e3267d5' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '0e17a7fbf96acbe1cbf2769b0fa853eaf7fb6f3b' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: 'd214e66618d2c38ca94154e7b06f681d815ffadc' }, "PointerCount: ", this.core.store.state.pointers.size), h("div", { key: '35695f7f82605bf6ba0fd512f814a7da723f623c' }, "Scale: ", this.core.store.state?.scale), h("div", { key: '6935c9e5cedb8f7bd6d81a5d02b383fbb0e4d3a2' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: '6a7490a07ca3019157d6a4b10b9164d3a504c4c0' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: 'ba70d5d01cad9e0fb6e80a4955e3361723af3531' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: 'be3a408762c8bada64224c4da92baf987ae62f6d' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '9cf44848dbcb7e8b1a40618db1ee6cf019e01720' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: 'b53633b5c099b338089294c897cfbc32973d360d' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: '0cab012a88532c69ba0aeb1daa7646e91c4f029d' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '1c47bfd56352b70a8eafb771470d9912240e9885' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: '1147a866a58f3d50c8751fc02f6614e899b13bc0' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: 'a308df3601fd5ba49741f2efbc3d262059daed2d' }, "IsRotationHandleHovered: ", this.core.store.state.isRotationHandleHovered ? 'true' : 'false'), h("div", { key: 'af5ceafa9bb39c2e2085815c691198f7a0b48017' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: '8abffd4f1e3e7b174ee5e5e9070fc0ca0703d1aa' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: 'e127318f52e25d65b323d3325b02a0125864c3be' }, "IsPointerDown: ", this.core.store.isPointerDown ? 'true' : 'false'), h("div", { key: 'b8f21b1a1bd674f7403e3096e7cb52e629b2df89' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '892abdc68df061495f88ceea2037766b537f82ab' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '04f08e11cb67cedf31900d01803960caaa0a5a0b' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: '6a6efb9f05cb70eaff83cea1a22e1151a08e2ec9' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")"))), h("div", { key: 'c9e2392f43cf54b57f0fb49a361d47a2c4156ca3', id: "origin", class: "origin", style: {
511
515
  transform: `matrix(${this.core.store.state?.scale}, 0, 0, ${this.core.store.state?.scale}, ${this.core.store.state?.translateX}, ${this.core.store.state?.translateY})`,
512
516
  } }, visibleObjects?.map(object => {
513
517
  return (h("div", { key: object.id, id: object.id, class: "object", style: {
@@ -516,7 +520,7 @@ export class KritzelEngine {
516
520
  position: 'absolute',
517
521
  zIndex: object.zIndex.toString(),
518
522
  pointerEvents: this.core.store.state.isScaling ? 'none' : 'auto',
519
- } }, KritzelClassHelper.isInstanceOf(object, 'KritzelPath') && (h("svg", { xmlns: "http://www.w3.org/2000/svg", style: {
523
+ } }, KritzelClassHelper.isInstanceOf(object, 'KritzelPath') && (h("svg", { ref: el => object.mount(el), xmlns: "http://www.w3.org/2000/svg", style: {
520
524
  height: object?.totalHeight + 'px',
521
525
  width: object?.totalWidth + 'px',
522
526
  left: '0',
@@ -526,7 +530,8 @@ export class KritzelEngine {
526
530
  transformOrigin: object.rotationDegrees !== 0 ? `${object.totalWidth / 2}px ${object.totalHeight / 2}px` : undefined,
527
531
  opacity: object.markedForRemoval ? '0.5' : object.opacity.toString(),
528
532
  pointerEvents: object.markedForRemoval ? 'none' : 'auto',
529
- } }, h("svg", { ref: el => object.mount(el), xmlns: "http://www.w3.org/2000/svg", style: { overflow: 'visible' }, viewBox: object?.viewBox }, h("path", { d: object?.d, fill: KritzelColorHelper.resolveThemeColor(object.fill, currentTheme), stroke: KritzelColorHelper.resolveThemeColor(object?.stroke, currentTheme), "shape-rendering": object.isLowRes() ? 'optimizeSpeed' : 'auto' })))), KritzelClassHelper.isInstanceOf(object, 'KritzelLine') && (h("svg", { xmlns: "http://www.w3.org/2000/svg", style: {
533
+ overflow: 'visible',
534
+ }, viewBox: object?.viewBox }, h("path", { d: object?.d, fill: KritzelColorHelper.resolveThemeColor(object.fill, currentTheme), stroke: KritzelColorHelper.resolveThemeColor(object?.stroke, currentTheme), "shape-rendering": object.isLowRes() ? 'optimizeSpeed' : 'auto' }))), KritzelClassHelper.isInstanceOf(object, 'KritzelLine') && (h("svg", { ref: el => object.mount(el), xmlns: "http://www.w3.org/2000/svg", style: {
530
535
  height: object?.totalHeight + 'px',
531
536
  width: object?.totalWidth + 'px',
532
537
  left: '0',
@@ -536,7 +541,8 @@ export class KritzelEngine {
536
541
  transformOrigin: object.rotationDegrees !== 0 ? `${object.totalWidth / 2}px ${object.totalHeight / 2}px` : undefined,
537
542
  opacity: object.markedForRemoval ? '0.5' : object.opacity.toString(),
538
543
  pointerEvents: object.markedForRemoval ? 'none' : 'auto',
539
- } }, h("svg", { ref: el => object.mount(el), xmlns: "http://www.w3.org/2000/svg", style: { overflow: 'visible' }, viewBox: object?.viewBox }, (object.hasStartArrow || object.hasEndArrow) && (h("defs", null, object.hasStartArrow && (h("marker", { id: object.startMarkerId, markerWidth: object.getArrowSize('start'), markerHeight: object.getArrowSize('start'), refX: 0, refY: object.getArrowSize('start') / 2, orient: "auto-start-reverse", markerUnits: "userSpaceOnUse" }, h("path", { d: object.getArrowPath(object.arrows?.start?.style), fill: object.getArrowFill('start'), transform: `scale(${object.getArrowSize('start') / 10})` }))), object.hasEndArrow && (h("marker", { id: object.endMarkerId, markerWidth: object.getArrowSize('end'), markerHeight: object.getArrowSize('end'), refX: 0, refY: object.getArrowSize('end') / 2, orient: "auto", markerUnits: "userSpaceOnUse" }, h("path", { d: object.getArrowPath(object.arrows?.end?.style), fill: object.getArrowFill('end'), transform: `scale(${object.getArrowSize('end') / 10})` }))))), h("path", { d: this.core.anchorManager.computeClippedLinePath(object), fill: "none", stroke: "transparent", "stroke-width": Math.max(object?.strokeWidth || 0, 10), "stroke-linecap": "round" }), h("path", { d: this.core.anchorManager.computeClippedLinePath(object), fill: "none", stroke: KritzelColorHelper.resolveThemeColor(object?.stroke, currentTheme), "stroke-width": object?.strokeWidth, "stroke-linecap": "round", "marker-start": object.hasStartArrow ? `url(#${object.startMarkerId})` : undefined, "marker-end": object.hasEndArrow ? `url(#${object.endMarkerId})` : undefined })))), KritzelClassHelper.isInstanceOf(object, 'KritzelImage') && (h("div", { style: {
544
+ overflow: 'visible',
545
+ }, viewBox: object?.viewBox }, (object.hasStartArrow || object.hasEndArrow) && (h("defs", null, object.hasStartArrow && (h("marker", { id: object.startMarkerId, markerWidth: object.getArrowSize('start'), markerHeight: object.getArrowSize('start'), refX: 0, refY: object.getArrowSize('start') / 2, orient: "auto-start-reverse", markerUnits: "userSpaceOnUse" }, h("path", { d: object.getArrowPath(object.arrows?.start?.style), fill: object.getArrowFill('start'), transform: `scale(${object.getArrowSize('start') / 10})` }))), object.hasEndArrow && (h("marker", { id: object.endMarkerId, markerWidth: object.getArrowSize('end'), markerHeight: object.getArrowSize('end'), refX: 0, refY: object.getArrowSize('end') / 2, orient: "auto", markerUnits: "userSpaceOnUse" }, h("path", { d: object.getArrowPath(object.arrows?.end?.style), fill: object.getArrowFill('end'), transform: `scale(${object.getArrowSize('end') / 10})` }))))), h("path", { d: this.core.anchorManager.computeClippedLinePath(object), fill: "none", stroke: "transparent", "stroke-width": Math.max(object?.strokeWidth || 0, 10), "stroke-linecap": "round" }), h("path", { d: this.core.anchorManager.computeClippedLinePath(object), fill: "none", stroke: KritzelColorHelper.resolveThemeColor(object?.stroke, currentTheme), "stroke-width": object?.strokeWidth, "stroke-linecap": "round", "marker-start": object.hasStartArrow ? `url(#${object.startMarkerId})` : undefined, "marker-end": object.hasEndArrow ? `url(#${object.endMarkerId})` : undefined }))), KritzelClassHelper.isInstanceOf(object, 'KritzelImage') && (h("img", { ref: el => object.mount(el), src: object.src, style: {
540
546
  position: 'absolute',
541
547
  left: '0',
542
548
  top: '0',
@@ -552,13 +558,9 @@ export class KritzelEngine {
552
558
  borderStyle: 'solid',
553
559
  padding: object.padding + 'px',
554
560
  overflow: 'visible',
555
- } }, h("img", { ref: el => object.mount(el), src: object.src, style: {
556
- width: '100%',
557
- height: '100%',
558
561
  userSelect: 'none',
559
- pointerEvents: 'none',
560
562
  imageRendering: this.core.store.state.isScaling || this.core.store.state.isPanning ? 'pixelated' : 'auto',
561
- }, draggable: false, onDragStart: e => e.preventDefault() }))), KritzelClassHelper.isInstanceOf(object, 'KritzelCustomElement') && (h("div", { style: {
563
+ }, draggable: false, onDragStart: e => e.preventDefault() })), KritzelClassHelper.isInstanceOf(object, 'KritzelCustomElement') && (h("div", { ref: el => object.mount(el), style: {
562
564
  position: 'absolute',
563
565
  left: '0',
564
566
  top: '0',
@@ -573,14 +575,9 @@ export class KritzelEngine {
573
575
  borderWidth: object.borderWidth + 'px',
574
576
  borderStyle: 'solid',
575
577
  padding: object.padding + 'px',
576
- overflow: 'visible',
577
- } }, h("div", { ref: el => object.mount(el), style: {
578
- width: '100%',
579
- height: '100%',
580
- pointerEvents: 'auto',
581
578
  overflow: 'hidden',
582
579
  display: 'block',
583
- } }))), KritzelClassHelper.isInstanceOf(object, 'KritzelSelectionGroup') && !this.core.displaySelectionLineUI(object) && (h("div", { style: {
580
+ } })), KritzelClassHelper.isInstanceOf(object, 'KritzelSelectionGroup') && !this.core.displaySelectionLineUI(object) && (h("div", { ref: el => object.mount(el), style: {
584
581
  position: 'absolute',
585
582
  left: '0',
586
583
  top: '0',
@@ -590,10 +587,7 @@ export class KritzelEngine {
590
587
  transformOrigin: object.rotationDegrees !== 0 ? `${object.totalWidth / 2}px ${object.totalHeight / 2}px` : undefined,
591
588
  opacity: object.markedForRemoval ? '0.5' : object.opacity.toString(),
592
589
  pointerEvents: object.markedForRemoval ? 'none' : 'auto',
593
- } }, h("div", { ref: el => object.mount(el), style: {
594
- width: '100%',
595
- height: '100%',
596
- } }))), KritzelClassHelper.isInstanceOf(object, 'KritzelSelectionBox') && (h("div", { style: {
590
+ } })), KritzelClassHelper.isInstanceOf(object, 'KritzelSelectionBox') && (h("div", { ref: el => object.mount(el), style: {
597
591
  position: 'absolute',
598
592
  left: '0',
599
593
  top: '0',
@@ -607,10 +601,7 @@ export class KritzelEngine {
607
601
  borderColor: KritzelColorHelper.resolveThemeColor(object.borderColor, currentTheme),
608
602
  borderWidth: object.borderWidth + 'px',
609
603
  borderStyle: 'solid',
610
- } }, h("div", { ref: el => object.mount(el), style: {
611
- width: '100%',
612
- height: '100%',
613
- } }))), KritzelClassHelper.isInstanceOf(object, 'KritzelText') && (h("div", { style: {
604
+ } })), KritzelClassHelper.isInstanceOf(object, 'KritzelText') && (h("div", { style: {
614
605
  position: 'absolute',
615
606
  left: '0',
616
607
  top: '0',
@@ -630,8 +621,7 @@ export class KritzelEngine {
630
621
  transform: `scale(${object.scaleFactor})`,
631
622
  backgroundColor: KritzelColorHelper.resolveThemeColor(object.backgroundColor, currentTheme),
632
623
  overflow: 'visible',
633
- textRendering: this.core.store.state.isScaling || this.core.store.state.isPanning ? 'optimizeSpeed' : 'auto',
634
- } }))), KritzelClassHelper.isInstanceOf(object, 'KritzelShape') && (h("div", { style: {
624
+ } }))), KritzelClassHelper.isInstanceOf(object, 'KritzelShape') && (h("div", { ref: el => object.mount(el), onPointerDown: e => object.handlePointerDown(e), onPointerMove: e => object.handlePointerMove(e), onPointerUp: e => object.handlePointerUp(e), style: {
635
625
  position: 'absolute',
636
626
  left: '0',
637
627
  top: '0',
@@ -641,10 +631,6 @@ export class KritzelEngine {
641
631
  transformOrigin: object.rotationDegrees !== 0 ? `${object.totalWidth / 2}px ${object.totalHeight / 2}px` : undefined,
642
632
  opacity: object.markedForRemoval ? '0.5' : object.opacity.toString(),
643
633
  pointerEvents: object.markedForRemoval ? 'none' : 'auto',
644
- } }, h("div", { ref: el => object.mount(el), onPointerDown: e => object.handlePointerDown(e), onPointerMove: e => object.handlePointerMove(e), onPointerUp: e => object.handlePointerUp(e), style: {
645
- width: '100%',
646
- height: '100%',
647
- position: 'relative',
648
634
  overflow: 'visible',
649
635
  } }, h("svg", { xmlns: "http://www.w3.org/2000/svg", style: {
650
636
  position: 'absolute',
@@ -666,7 +652,7 @@ export class KritzelEngine {
666
652
  textAlign: 'center',
667
653
  overflow: 'hidden',
668
654
  pointerEvents: object.isEditing ? 'auto' : 'none',
669
- } })))), this.core.store.state.debugInfo.showObjectInfo && object.isDebugInfoVisible && (h("div", { style: {
655
+ } }))), this.core.store.state.debugInfo.showObjectInfo && object.isDebugInfoVisible && (h("div", { style: {
670
656
  pointerEvents: 'none',
671
657
  position: 'absolute',
672
658
  left: `${object.totalWidth}px`,
@@ -853,7 +839,7 @@ export class KritzelEngine {
853
839
  stroke: 'var(--kritzel-snap-indicator-stroke, #007bff)',
854
840
  strokeWidth: data.indicatorStrokeWidth,
855
841
  } }))));
856
- })()), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: 'b9171dfffeb4a88bc4ad9a7b0196a18f5427183f', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
842
+ })()), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: '307012661cd1021e7e3c3db48f1671700f5de91b', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
857
843
  position: 'fixed',
858
844
  left: `${this.core.store.state.contextMenuX}px`,
859
845
  top: `${this.core.store.state.contextMenuY}px`,
@@ -864,7 +850,7 @@ export class KritzelEngine {
864
850
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
865
851
  }, this.core.store.selectionGroup?.objects);
866
852
  this.hideContextMenu();
867
- }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: 'd3ce01397575891a78449128020a212345332d06', core: this.core })));
853
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: 'bd48d2a8e7c83e2c5d80c92548b00720650391ab', core: this.core })));
868
854
  }
869
855
  static get is() { return "kritzel-engine"; }
870
856
  static get encapsulation() { return "shadow"; }
@@ -4,18 +4,20 @@ export class KritzelTooltip {
4
4
  host;
5
5
  isVisible = false;
6
6
  anchorElement;
7
+ triggerElement;
7
8
  offsetY = 24;
8
9
  tooltipClosed;
10
+ tooltipOpened;
9
11
  positionX = 0;
10
12
  positionY = 0;
11
13
  handleOutsideClick(event) {
12
14
  if (!this.isVisible)
13
15
  return;
14
- // Check if click is inside the tooltip host or any of its shadow DOM content
15
16
  const path = event.composedPath();
16
17
  const isInsideTooltip = path.some(el => el === this.host);
17
- if (!isInsideTooltip) {
18
- this.tooltipClosed.emit();
18
+ const isOnTrigger = this.triggerElement && path.some(el => el === this.triggerElement);
19
+ if (!isInsideTooltip && !isOnTrigger) {
20
+ this.close();
19
21
  }
20
22
  }
21
23
  handleOutsidePointerDown(event) {
@@ -23,23 +25,73 @@ export class KritzelTooltip {
23
25
  return;
24
26
  const path = event.composedPath();
25
27
  const isInsideTooltip = path.some(el => el === this.host);
26
- if (!isInsideTooltip) {
28
+ const isOnTrigger = this.triggerElement && path.some(el => el === this.triggerElement);
29
+ if (!isInsideTooltip && !isOnTrigger) {
27
30
  event.stopPropagation();
28
31
  event.preventDefault();
29
- this.tooltipClosed.emit();
32
+ this.close();
33
+ }
34
+ }
35
+ handleCloseAll(event) {
36
+ if (event.detail !== this.host) {
37
+ this.close();
30
38
  }
31
39
  }
32
40
  handleWindowResize() {
33
41
  this.calculateAdjustedPosition();
34
42
  }
43
+ handleTriggerElementChange(newTrigger, oldTrigger) {
44
+ if (oldTrigger) {
45
+ oldTrigger.removeEventListener('click', this.handleTriggerClick);
46
+ }
47
+ if (newTrigger) {
48
+ newTrigger.addEventListener('click', this.handleTriggerClick);
49
+ }
50
+ }
51
+ handleVisibilityChange(newValue) {
52
+ if (newValue) {
53
+ this.calculateAdjustedPosition();
54
+ requestAnimationFrame(() => {
55
+ this.focusContent();
56
+ });
57
+ }
58
+ }
59
+ async open() {
60
+ if (this.isVisible)
61
+ return;
62
+ document.dispatchEvent(new CustomEvent('kritzelTooltipCloseAll', { detail: this.host }));
63
+ this.isVisible = true;
64
+ this.tooltipOpened.emit();
65
+ }
66
+ async close() {
67
+ if (!this.isVisible)
68
+ return;
69
+ this.isVisible = false;
70
+ this.tooltipClosed.emit();
71
+ }
72
+ async toggle() {
73
+ if (this.isVisible) {
74
+ this.close();
75
+ }
76
+ else {
77
+ this.open();
78
+ }
79
+ }
35
80
  async focusContent() {
36
81
  const focusableElements = KritzelHTMLHelper.getFocusableElements(this.host);
37
82
  if (focusableElements.length > 0) {
38
83
  focusableElements[0].focus();
39
84
  }
40
85
  }
86
+ connectedCallback() {
87
+ if (this.triggerElement) {
88
+ this.triggerElement.addEventListener('click', this.handleTriggerClick);
89
+ }
90
+ }
41
91
  componentDidLoad() {
42
- this.focusSlottedContent();
92
+ if (this.triggerElement) {
93
+ this.triggerElement.addEventListener('click', this.handleTriggerClick);
94
+ }
43
95
  }
44
96
  componentWillLoad() {
45
97
  this.calculateAdjustedPosition();
@@ -47,14 +99,15 @@ export class KritzelTooltip {
47
99
  componentWillUpdate() {
48
100
  this.calculateAdjustedPosition();
49
101
  }
50
- focusSlottedContent() {
51
- const slot = this.host.shadowRoot?.querySelector('slot');
52
- const assignedElements = slot?.assignedElements() || [];
53
- if (assignedElements.length > 0) {
54
- const firstElement = assignedElements[0];
55
- firstElement.focus();
102
+ disconnectedCallback() {
103
+ if (this.triggerElement) {
104
+ this.triggerElement.removeEventListener('click', this.handleTriggerClick);
56
105
  }
57
106
  }
107
+ handleTriggerClick = (event) => {
108
+ event.stopPropagation();
109
+ this.toggle();
110
+ };
58
111
  calculateAdjustedPosition() {
59
112
  if (this.isVisible && this.anchorElement) {
60
113
  const anchorRect = this.anchorElement.getBoundingClientRect();
@@ -75,14 +128,14 @@ export class KritzelTooltip {
75
128
  }
76
129
  }
77
130
  render() {
78
- return (h(Host, { key: 'd23199ba12acd84fe7fb7a3e133a6605b175bcec', style: {
131
+ return (h(Host, { key: '4145c722bdd124506bf988e5c2d4886bb10c5516', style: {
79
132
  position: 'fixed',
80
133
  zIndex: '9999',
81
134
  transition: 'opacity 0.3s ease-in-out, transform 0.3s ease-in-out',
82
135
  visibility: this.isVisible ? 'visible' : 'hidden',
83
136
  left: `${this.positionX}px`,
84
137
  bottom: `${this.positionY}px`,
85
- } }, h("div", { key: '030ca8a36358b78ba726f7406e76cea16a4e75e9', class: "tooltip-content", onClick: event => event.stopPropagation(), onPointerDown: event => event.stopPropagation(), onMouseDown: event => event.stopPropagation() }, h("slot", { key: '148ed867ee7962487d38f82e6d37b8599a7158af' }))));
138
+ } }, h("div", { key: '7b8b74d2a9027b23bd6ebb0cb1f628820320dfe2', class: "tooltip-content", onClick: event => event.stopPropagation(), onPointerDown: event => event.stopPropagation(), onMouseDown: event => event.stopPropagation() }, h("slot", { key: '52b93a5847696ddd740fce6d69ac48f20a215bd3' }))));
86
139
  }
87
140
  static get is() { return "kritzel-tooltip"; }
88
141
  static get encapsulation() { return "shadow"; }
@@ -100,7 +153,7 @@ export class KritzelTooltip {
100
153
  return {
101
154
  "isVisible": {
102
155
  "type": "boolean",
103
- "mutable": false,
156
+ "mutable": true,
104
157
  "complexType": {
105
158
  "original": "boolean",
106
159
  "resolved": "boolean",
@@ -140,6 +193,28 @@ export class KritzelTooltip {
140
193
  "getter": false,
141
194
  "setter": false
142
195
  },
196
+ "triggerElement": {
197
+ "type": "unknown",
198
+ "mutable": false,
199
+ "complexType": {
200
+ "original": "HTMLElement",
201
+ "resolved": "HTMLElement",
202
+ "references": {
203
+ "HTMLElement": {
204
+ "location": "global",
205
+ "id": "global::HTMLElement"
206
+ }
207
+ }
208
+ },
209
+ "required": false,
210
+ "optional": false,
211
+ "docs": {
212
+ "tags": [],
213
+ "text": ""
214
+ },
215
+ "getter": false,
216
+ "setter": false
217
+ },
143
218
  "offsetY": {
144
219
  "type": "number",
145
220
  "mutable": false,
@@ -184,10 +259,76 @@ export class KritzelTooltip {
184
259
  "resolved": "void",
185
260
  "references": {}
186
261
  }
262
+ }, {
263
+ "method": "tooltipOpened",
264
+ "name": "tooltipOpened",
265
+ "bubbles": true,
266
+ "cancelable": true,
267
+ "composed": true,
268
+ "docs": {
269
+ "tags": [],
270
+ "text": ""
271
+ },
272
+ "complexType": {
273
+ "original": "void",
274
+ "resolved": "void",
275
+ "references": {}
276
+ }
187
277
  }];
188
278
  }
189
279
  static get methods() {
190
280
  return {
281
+ "open": {
282
+ "complexType": {
283
+ "signature": "() => Promise<void>",
284
+ "parameters": [],
285
+ "references": {
286
+ "Promise": {
287
+ "location": "global",
288
+ "id": "global::Promise"
289
+ }
290
+ },
291
+ "return": "Promise<void>"
292
+ },
293
+ "docs": {
294
+ "text": "",
295
+ "tags": []
296
+ }
297
+ },
298
+ "close": {
299
+ "complexType": {
300
+ "signature": "() => Promise<void>",
301
+ "parameters": [],
302
+ "references": {
303
+ "Promise": {
304
+ "location": "global",
305
+ "id": "global::Promise"
306
+ }
307
+ },
308
+ "return": "Promise<void>"
309
+ },
310
+ "docs": {
311
+ "text": "",
312
+ "tags": []
313
+ }
314
+ },
315
+ "toggle": {
316
+ "complexType": {
317
+ "signature": "() => Promise<void>",
318
+ "parameters": [],
319
+ "references": {
320
+ "Promise": {
321
+ "location": "global",
322
+ "id": "global::Promise"
323
+ }
324
+ },
325
+ "return": "Promise<void>"
326
+ },
327
+ "docs": {
328
+ "text": "",
329
+ "tags": []
330
+ }
331
+ },
191
332
  "focusContent": {
192
333
  "complexType": {
193
334
  "signature": "() => Promise<void>",
@@ -208,6 +349,15 @@ export class KritzelTooltip {
208
349
  };
209
350
  }
210
351
  static get elementRef() { return "host"; }
352
+ static get watchers() {
353
+ return [{
354
+ "propName": "triggerElement",
355
+ "methodName": "handleTriggerElementChange"
356
+ }, {
357
+ "propName": "isVisible",
358
+ "methodName": "handleVisibilityChange"
359
+ }];
360
+ }
211
361
  static get listeners() {
212
362
  return [{
213
363
  "name": "click",
@@ -221,6 +371,12 @@ export class KritzelTooltip {
221
371
  "target": "document",
222
372
  "capture": true,
223
373
  "passive": true
374
+ }, {
375
+ "name": "kritzelTooltipCloseAll",
376
+ "method": "handleCloseAll",
377
+ "target": "document",
378
+ "capture": false,
379
+ "passive": false
224
380
  }, {
225
381
  "name": "resize",
226
382
  "method": "handleWindowResize",