kritzel-stencil 0.1.0 → 0.1.2

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 (176) hide show
  1. package/dist/cjs/{default-line-tool.config-7eJND6Jb.js → default-line-tool.config-MA02HCrH.js} +703 -133
  2. package/dist/cjs/{index-BeKMS-Zt.js → index-Bj0n7fQQ.js} +84 -7
  3. package/dist/cjs/index.cjs.js +1 -1
  4. package/dist/cjs/kritzel-brush-style.cjs.entry.js +1 -1
  5. package/dist/cjs/{kritzel-color_22.cjs.entry.js → kritzel-color_24.cjs.entry.js} +1018 -897
  6. package/dist/cjs/loader.cjs.js +2 -2
  7. package/dist/cjs/stencil.cjs.js +3 -3
  8. package/dist/collection/classes/core/core.class.js +2 -0
  9. package/dist/collection/classes/core/viewport.class.js +43 -3
  10. package/dist/collection/classes/handlers/move.handler.js +6 -0
  11. package/dist/collection/classes/objects/line.class.js +63 -15
  12. package/dist/collection/classes/objects/path.class.js +1 -0
  13. package/dist/collection/classes/objects/shape.class.js +1 -0
  14. package/dist/collection/classes/objects/text.class.js +4 -3
  15. package/dist/collection/classes/providers/indexeddb-sync-provider.class.js +0 -1
  16. package/dist/collection/classes/tools/brush-tool.class.js +5 -0
  17. package/dist/collection/classes/tools/line-tool.class.js +31 -1
  18. package/dist/collection/classes/tools/selection-tool.class.js +193 -0
  19. package/dist/collection/classes/tools/shape-tool.class.js +2 -0
  20. package/dist/collection/classes/tools/text-tool.class.js +3 -0
  21. package/dist/collection/collection-manifest.json +5 -3
  22. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +3 -2
  23. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +37 -19
  24. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +108 -36
  25. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
  26. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +1 -1
  27. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +24 -2
  28. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
  29. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.css +1 -1
  30. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.css +1 -1
  31. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
  32. package/dist/collection/components/shared/kritzel-line-endings/kritzel-line-endings.css +60 -0
  33. package/dist/collection/components/shared/kritzel-line-endings/kritzel-line-endings.js +187 -0
  34. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +15 -8
  35. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +16 -9
  36. package/dist/collection/components/shared/kritzel-opacity-slider/kritzel-opacity-slider.css +85 -0
  37. package/dist/collection/components/shared/kritzel-opacity-slider/kritzel-opacity-slider.js +163 -0
  38. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
  39. package/dist/collection/components/shared/kritzel-shape-fill/kritzel-shape-fill.css +47 -0
  40. package/dist/collection/components/shared/kritzel-shape-fill/kritzel-shape-fill.js +93 -0
  41. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +13 -7
  42. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +11 -2
  43. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +2 -2
  44. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.css +1 -1
  45. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +6 -4
  46. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +6 -3
  47. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +66 -0
  48. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +153 -50
  49. package/dist/collection/components/ui/kritzel-tool-config/kritzel-tool-config.css +38 -0
  50. package/dist/collection/components/ui/kritzel-tool-config/kritzel-tool-config.js +321 -0
  51. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +3 -2
  52. package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js +6 -3
  53. package/dist/collection/configs/default-brush-tool.config.js +2 -52
  54. package/dist/collection/configs/default-line-tool.config.js +2 -26
  55. package/dist/collection/configs/default-shape-tool.config.js +2 -15
  56. package/dist/collection/configs/default-text-tool.config.js +2 -26
  57. package/dist/collection/constants/color-palette.constants.js +30 -0
  58. package/dist/collection/helpers/color.helper.js +31 -0
  59. package/dist/collection/helpers/tool-config.helper.js +65 -0
  60. package/dist/collection/interfaces/tool-config.interface.js +1 -0
  61. package/dist/components/index.d.ts +8 -4
  62. package/dist/components/index.js +1 -1
  63. package/dist/components/kritzel-brush-style.js +1 -1
  64. package/dist/components/kritzel-color-palette.js +1 -1
  65. package/dist/components/kritzel-color.js +1 -1
  66. package/dist/components/kritzel-context-menu.js +1 -1
  67. package/dist/components/kritzel-controls.js +1 -1
  68. package/dist/components/kritzel-cursor-trail.js +1 -1
  69. package/dist/components/kritzel-dropdown.js +1 -1
  70. package/dist/components/kritzel-editor.js +1 -1
  71. package/dist/components/kritzel-engine.js +1 -1
  72. package/dist/components/kritzel-font-family.js +1 -1
  73. package/dist/components/kritzel-font-size.js +1 -1
  74. package/dist/components/kritzel-font.js +1 -1
  75. package/dist/components/kritzel-icon.js +1 -1
  76. package/dist/components/kritzel-line-endings.d.ts +11 -0
  77. package/dist/components/kritzel-line-endings.js +1 -0
  78. package/dist/components/kritzel-menu-item.js +1 -1
  79. package/dist/components/kritzel-menu.js +1 -1
  80. package/dist/components/kritzel-opacity-slider.d.ts +11 -0
  81. package/dist/components/kritzel-opacity-slider.js +1 -0
  82. package/dist/components/kritzel-portal.js +1 -1
  83. package/dist/components/kritzel-shape-fill.d.ts +11 -0
  84. package/dist/components/kritzel-shape-fill.js +1 -0
  85. package/dist/components/kritzel-split-button.js +1 -1
  86. package/dist/components/kritzel-stroke-size.js +1 -1
  87. package/dist/components/kritzel-tool-config.d.ts +11 -0
  88. package/dist/components/kritzel-tool-config.js +1 -0
  89. package/dist/components/kritzel-tooltip.js +1 -1
  90. package/dist/components/kritzel-utility-panel.js +1 -1
  91. package/dist/components/kritzel-workspace-manager.js +1 -1
  92. package/dist/components/p-83YX0-FS.js +1 -0
  93. package/dist/components/p-8iEiCuEN.js +1 -0
  94. package/dist/components/p-9XZbc_qK.js +1 -0
  95. package/dist/components/p-B3P64-gH.js +9 -0
  96. package/dist/components/p-B8QjTqOY.js +1 -0
  97. package/dist/components/p-BF6MdW17.js +1 -0
  98. package/dist/components/p-BVIY50lR.js +1 -0
  99. package/dist/components/p-BbqT9o1F.js +1 -0
  100. package/dist/components/{p-CXzfYQ_u.js → p-BnidlyU0.js} +1 -1
  101. package/dist/components/{p-Bj_Og27M.js → p-BxS4Pdpz.js} +1 -1
  102. package/dist/components/{p-g0N9j_uT.js → p-CCj8nmQH.js} +1 -1
  103. package/dist/components/{p-1z-ds26_.js → p-CLOnpu42.js} +1 -1
  104. package/dist/components/{p-D1tfzpy8.js → p-CSGeDE4f.js} +1 -1
  105. package/dist/components/p-CbuHMNa9.js +1 -0
  106. package/dist/components/p-ClMFs3KI.js +1 -0
  107. package/dist/components/{p-IAqZFssU.js → p-Cnpk2hfo.js} +1 -1
  108. package/dist/components/{p-Cy77SpWt.js → p-Ctv4NAxk.js} +1 -1
  109. package/dist/components/p-CyHZWbkS.js +1 -0
  110. package/dist/components/{p-C4krHoUl.js → p-D8GeJNUv.js} +1 -1
  111. package/dist/components/{p-DB5s1NY4.js → p-DKgqzi2Y.js} +1 -1
  112. package/dist/components/p-DOF5fWDU.js +1 -0
  113. package/dist/components/{p-4FEa4ADy.js → p-DV_h5Jo2.js} +1 -1
  114. package/dist/components/{p-DTezr6w9.js → p-DgCGSL2Q.js} +1 -1
  115. package/dist/components/{p-D5ZsALCP.js → p-wRXL928z.js} +1 -1
  116. package/dist/esm/{default-line-tool.config-CD5sTKH-.js → default-line-tool.config-DLpNl6R9.js} +702 -125
  117. package/dist/esm/{index-BqhmuUH2.js → index-OLdaFN6W.js} +84 -7
  118. package/dist/esm/index.js +2 -2
  119. package/dist/esm/kritzel-brush-style.entry.js +1 -1
  120. package/dist/esm/{kritzel-color_22.entry.js → kritzel-color_24.entry.js} +1009 -890
  121. package/dist/esm/loader.js +3 -3
  122. package/dist/esm/stencil.js +4 -4
  123. package/dist/stencil/index.esm.js +1 -1
  124. package/dist/stencil/{p-09295079.entry.js → p-802bc7cf.entry.js} +1 -1
  125. package/dist/stencil/p-DLpNl6R9.js +1 -0
  126. package/dist/stencil/p-OLdaFN6W.js +2 -0
  127. package/dist/stencil/p-caf30edb.entry.js +9 -0
  128. package/dist/stencil/stencil.esm.js +1 -1
  129. package/dist/types/classes/core/viewport.class.d.ts +6 -0
  130. package/dist/types/classes/managers/anchor.manager.d.ts +1 -1
  131. package/dist/types/classes/objects/line.class.d.ts +2 -0
  132. package/dist/types/classes/objects/shape.class.d.ts +1 -0
  133. package/dist/types/classes/tools/brush-tool.class.d.ts +1 -0
  134. package/dist/types/classes/tools/line-tool.class.d.ts +2 -1
  135. package/dist/types/classes/tools/selection-tool.class.d.ts +22 -0
  136. package/dist/types/classes/tools/shape-tool.class.d.ts +1 -0
  137. package/dist/types/classes/tools/text-tool.class.d.ts +1 -0
  138. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +2 -0
  139. package/dist/types/components/shared/kritzel-color-palette/kritzel-color-palette.d.ts +1 -0
  140. package/dist/types/components/shared/kritzel-line-endings/kritzel-line-endings.d.ts +23 -0
  141. package/dist/types/components/shared/kritzel-opacity-slider/kritzel-opacity-slider.d.ts +17 -0
  142. package/dist/types/components/shared/kritzel-shape-fill/kritzel-shape-fill.d.ts +10 -0
  143. package/dist/types/components/ui/kritzel-controls/kritzel-controls.d.ts +15 -0
  144. package/dist/types/components/ui/kritzel-tool-config/kritzel-tool-config.d.ts +25 -0
  145. package/dist/types/components.d.ts +235 -82
  146. package/dist/types/constants/color-palette.constants.d.ts +5 -0
  147. package/dist/types/helpers/color.helper.d.ts +9 -0
  148. package/dist/types/helpers/tool-config.helper.d.ts +4 -0
  149. package/dist/types/interfaces/line-options.interface.d.ts +1 -0
  150. package/dist/types/interfaces/path-options.interface.d.ts +1 -0
  151. package/dist/types/interfaces/tool-config.interface.d.ts +26 -0
  152. package/dist/types/stencil-public-runtime.d.ts +29 -0
  153. package/package.json +5 -3
  154. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.css +0 -19
  155. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +0 -134
  156. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.css +0 -19
  157. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +0 -114
  158. package/dist/components/kritzel-control-brush-config.d.ts +0 -11
  159. package/dist/components/kritzel-control-brush-config.js +0 -1
  160. package/dist/components/kritzel-control-text-config.d.ts +0 -11
  161. package/dist/components/kritzel-control-text-config.js +0 -1
  162. package/dist/components/p-B7Fdo5QJ.js +0 -1
  163. package/dist/components/p-BXaWhpO2.js +0 -1
  164. package/dist/components/p-BtuXeItZ.js +0 -1
  165. package/dist/components/p-C-d2IH4v.js +0 -1
  166. package/dist/components/p-C3UriJh7.js +0 -1
  167. package/dist/components/p-CF5L2Gdl.js +0 -1
  168. package/dist/components/p-CeKT_dTd.js +0 -1
  169. package/dist/components/p-Cp15toXH.js +0 -1
  170. package/dist/components/p-D3LRBk2t.js +0 -9
  171. package/dist/components/p-Du1vxHy8.js +0 -1
  172. package/dist/stencil/p-381c0e9c.entry.js +0 -9
  173. package/dist/stencil/p-BqhmuUH2.js +0 -2
  174. package/dist/stencil/p-CD5sTKH-.js +0 -1
  175. package/dist/types/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.d.ts +0 -15
  176. package/dist/types/components/ui/kritzel-control-text-config/kritzel-control-text-config.d.ts +0 -12
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BeKMS-Zt.js');
3
+ var index = require('./index-Bj0n7fQQ.js');
4
4
  var appGlobals = require('./app-globals-V2Kpy_OQ.js');
5
5
 
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",[[512,"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":0}],"isControlsReady":[{"onIsControlsReady":0}],"workspaces":[{"onWorkspacesChange":0}]}],[513,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"firstConfig":[32],"isTooltipVisible":[32],"isTouchDevice":[32],"selectedSubOptions":[32],"openSubMenuControl":[32],"closeTooltip":[64]},[[4,"click","handleDocumentClick"],[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"]]],[513,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[513,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"cursorTarget":[16],"forceUpdate":[32],"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],"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":0}],"scaleMax":[{"validateScaleMax":0}],"scaleMin":[{"validateScaleMin":0}],"cursorTarget":[{"onCursorTargetChange":0}]}],[513,"kritzel-control-text-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"]}],[513,"kritzel-control-brush-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"palette":[32]},null,{"tool":[{"handleToolChange":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}]}],[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"]]],[769,"kritzel-tooltip",{"isVisible":[4,"is-visible"],"anchorElement":[16],"offsetY":[2,"offset-y"],"positionX":[32],"positionY":[32],"focusContent":[64]},[[4,"click","handleOutsideClick"],[9,"resize","handleWindowResize"]]],[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"]}],[513,"kritzel-color-palette",{"colors":[16],"selectedColor":[1025,"selected-color"],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"]}],[513,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[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-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}]}],[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-color",{"value":[1],"size":[2]}],[513,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}]]],["kritzel-brush-style.cjs",[[513,"kritzel-brush-style",{"type":[1],"brushOptions":[16]}]]]], options);
9
+ return index.bootstrapLazy([["kritzel-color_24.cjs",[[512,"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":0}],"isControlsReady":[{"onIsControlsReady":0}],"workspaces":[{"onWorkspacesChange":0}]}],[513,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"firstConfig":[32],"isTooltipVisible":[32],"isTouchDevice":[32],"selectedSubOptions":[32],"openSubMenuControl":[32],"canScrollLeft":[32],"canScrollRight":[32],"displayValues":[32],"closeTooltip":[64]},[[4,"click","handleDocumentClick"],[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"],[4,"objectsSelectionChange","handleSelectionChange"]]],[513,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[513,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"cursorTarget":[16],"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],"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":0}],"scaleMax":[{"validateScaleMax":0}],"scaleMin":[{"validateScaleMin":0}],"cursorTarget":[{"onCursorTargetChange":0}]}],[513,"kritzel-tool-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"config":[32],"palette":[32],"currentOpacity":[32],"updateTrigger":[32]},[[4,"objectsSelectionChange","handleSelectionChange"]],{"tool":[{"handleToolChange":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}]}],[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"]]],[769,"kritzel-tooltip",{"isVisible":[4,"is-visible"],"anchorElement":[16],"offsetY":[2,"offset-y"],"positionX":[32],"positionY":[32],"focusContent":[64]},[[4,"click","handleOutsideClick"],[9,"resize","handleWindowResize"]]],[513,"kritzel-color-palette",{"colors":[16],"selectedColor":[1025,"selected-color"],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"],"opacity":[2]}],[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"]}],[513,"kritzel-line-endings",{"styles":[16],"value":[1040],"strokeColor":[1,"stroke-color"]}],[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-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}]}],[513,"kritzel-color",{"value":[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}]}],[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);
10
10
  };
11
11
 
12
12
  exports.setNonce = index.setNonce;
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BeKMS-Zt.js');
3
+ var index = require('./index-Bj0n7fQQ.js');
4
4
  var appGlobals = require('./app-globals-V2Kpy_OQ.js');
5
5
 
6
6
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
7
7
  /*
8
- Stencil Client Patch Browser v4.40.1 | MIT Licensed | https://stenciljs.com
8
+ Stencil Client Patch Browser v4.41.0 | MIT Licensed | https://stenciljs.com
9
9
  */
10
10
 
11
11
  var patchBrowser = () => {
@@ -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",[[512,"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":0}],"isControlsReady":[{"onIsControlsReady":0}],"workspaces":[{"onWorkspacesChange":0}]}],[513,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"firstConfig":[32],"isTooltipVisible":[32],"isTouchDevice":[32],"selectedSubOptions":[32],"openSubMenuControl":[32],"closeTooltip":[64]},[[4,"click","handleDocumentClick"],[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"]]],[513,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[513,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"cursorTarget":[16],"forceUpdate":[32],"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],"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":0}],"scaleMax":[{"validateScaleMax":0}],"scaleMin":[{"validateScaleMin":0}],"cursorTarget":[{"onCursorTargetChange":0}]}],[513,"kritzel-control-text-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"]}],[513,"kritzel-control-brush-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"palette":[32]},null,{"tool":[{"handleToolChange":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}]}],[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"]]],[769,"kritzel-tooltip",{"isVisible":[4,"is-visible"],"anchorElement":[16],"offsetY":[2,"offset-y"],"positionX":[32],"positionY":[32],"focusContent":[64]},[[4,"click","handleOutsideClick"],[9,"resize","handleWindowResize"]]],[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"]}],[513,"kritzel-color-palette",{"colors":[16],"selectedColor":[1025,"selected-color"],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"]}],[513,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[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-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}]}],[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-color",{"value":[1],"size":[2]}],[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-color_24.cjs",[[512,"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":0}],"isControlsReady":[{"onIsControlsReady":0}],"workspaces":[{"onWorkspacesChange":0}]}],[513,"kritzel-controls",{"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"firstConfig":[32],"isTooltipVisible":[32],"isTouchDevice":[32],"selectedSubOptions":[32],"openSubMenuControl":[32],"canScrollLeft":[32],"canScrollRight":[32],"displayValues":[32],"closeTooltip":[64]},[[4,"click","handleDocumentClick"],[8,"keydown","handleKeyDown"],[4,"activeToolChange","handleActiveToolChange"],[4,"objectsSelectionChange","handleSelectionChange"]]],[513,"kritzel-workspace-manager",{"activeWorkspace":[1040],"workspaces":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[513,"kritzel-engine",{"workspace":[16],"syncConfig":[16],"activeTool":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"cursorTarget":[16],"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],"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":0}],"scaleMax":[{"validateScaleMax":0}],"scaleMin":[{"validateScaleMin":0}],"cursorTarget":[{"onCursorTargetChange":0}]}],[513,"kritzel-tool-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"config":[32],"palette":[32],"currentOpacity":[32],"updateTrigger":[32]},[[4,"objectsSelectionChange","handleSelectionChange"]],{"tool":[{"handleToolChange":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}]}],[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"]]],[769,"kritzel-tooltip",{"isVisible":[4,"is-visible"],"anchorElement":[16],"offsetY":[2,"offset-y"],"positionX":[32],"positionY":[32],"focusContent":[64]},[[4,"click","handleOutsideClick"],[9,"resize","handleWindowResize"]]],[513,"kritzel-color-palette",{"colors":[16],"selectedColor":[1025,"selected-color"],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"],"opacity":[2]}],[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"]}],[513,"kritzel-line-endings",{"styles":[16],"value":[1040],"strokeColor":[1,"stroke-color"]}],[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-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}]}],[513,"kritzel-color",{"value":[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}]}],[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;
@@ -217,11 +217,13 @@ export class KritzelCore {
217
217
  this.removeSelectionGroup();
218
218
  this.removeSelectionBox();
219
219
  this._store.state.objects.insert(selectionGroup);
220
+ this._kritzelEngine.triggerSelectionChange();
220
221
  }
221
222
  removeSelectionGroup() {
222
223
  const selectionGroup = this._store.selectionGroup;
223
224
  if (selectionGroup) {
224
225
  this._store.state.objects.remove(object => object.id === selectionGroup.id);
226
+ this._kritzelEngine.triggerSelectionChange();
225
227
  }
226
228
  }
227
229
  removeSelectionBox() {
@@ -4,6 +4,11 @@ export class KritzelViewport {
4
4
  _core;
5
5
  _debounceUpdate;
6
6
  _debounceEndScaling;
7
+ _velocityX = 0;
8
+ _velocityY = 0;
9
+ _panRafId = null;
10
+ _friction = 0.92;
11
+ _minVelocity = 0.5;
7
12
  initialTouchDistance = 0;
8
13
  startX = 0;
9
14
  startY = 0;
@@ -187,11 +192,46 @@ export class KritzelViewport {
187
192
  this._debounceEndScaling();
188
193
  }
189
194
  handlePan(event) {
195
+ // Normalize delta for trackpad vs mouse wheel
196
+ // WheelEvent.deltaMode: 0=pixels, 1=lines, 2=pages
197
+ let deltaX = event.deltaX;
198
+ let deltaY = event.deltaY;
199
+ if (event.deltaMode === 1) {
200
+ deltaX *= 16;
201
+ deltaY *= 16;
202
+ }
203
+ else if (event.deltaMode === 2) {
204
+ deltaX *= window.innerWidth;
205
+ deltaY *= window.innerHeight;
206
+ }
190
207
  const panSpeed = 0.8;
191
- this._core.store.state.translateX = this._core.store.state.translateX - event.deltaX * panSpeed;
192
- this._core.store.state.translateY = this._core.store.state.translateY - event.deltaY * panSpeed;
208
+ // Add to velocity for momentum effect
209
+ this._velocityX = -deltaX * panSpeed;
210
+ this._velocityY = -deltaY * panSpeed;
211
+ // Start animation loop if not already running
212
+ if (this._panRafId === null) {
213
+ this._animatePan();
214
+ }
215
+ }
216
+ _animatePan() {
217
+ // Apply current velocity
218
+ this._core.store.state.translateX += this._velocityX;
219
+ this._core.store.state.translateY += this._velocityY;
193
220
  this._core.store.state.hasViewportChanged = true;
194
221
  this._core.rerender();
195
- this._debounceUpdate();
222
+ // Apply friction to slow down
223
+ this._velocityX *= this._friction;
224
+ this._velocityY *= this._friction;
225
+ // Continue animation if velocity is still significant
226
+ if (Math.abs(this._velocityX) > this._minVelocity || Math.abs(this._velocityY) > this._minVelocity) {
227
+ this._panRafId = requestAnimationFrame(() => this._animatePan());
228
+ }
229
+ else {
230
+ // Stop animation and finalize
231
+ this._velocityX = 0;
232
+ this._velocityY = 0;
233
+ this._panRafId = null;
234
+ this._debounceUpdate();
235
+ }
196
236
  }
197
237
  }
@@ -182,6 +182,12 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
182
182
  if (!selectionGroup) {
183
183
  return;
184
184
  }
185
+ // Only disconnect lines if the selection group contains ONLY lines.
186
+ // If moving lines with other objects (e.g. shapes they might be anchored to), prevent auto-disconnect.
187
+ const onlyLines = selectionGroup.objects.every(obj => obj instanceof KritzelLine);
188
+ if (!onlyLines) {
189
+ return;
190
+ }
185
191
  // Find and disconnect anchors from all anchored lines in the selection
186
192
  for (const obj of selectionGroup.objects) {
187
193
  // Skip if already disconnected in this drag session
@@ -22,6 +22,7 @@ export class KritzelLine extends KritzelBaseObject {
22
22
  isDebugInfoVisible = true;
23
23
  isCompleted = false;
24
24
  _adjustedPoints = null;
25
+ _clipInfo = null;
25
26
  get d() {
26
27
  if (this.controlX !== undefined && this.controlY !== undefined) {
27
28
  return `M ${this.startX} ${this.startY} Q ${this.controlX} ${this.controlY} ${this.endX} ${this.endY}`;
@@ -67,6 +68,7 @@ export class KritzelLine extends KritzelBaseObject {
67
68
  object.scale = options?.scale ?? 1;
68
69
  object.strokeWidth = options?.strokeWidth ?? 4;
69
70
  object.stroke = options?.stroke ?? '#000000';
71
+ object.opacity = options?.opacity ?? 1;
70
72
  object.startAnchor = options?.startAnchor;
71
73
  object.endAnchor = options?.endAnchor;
72
74
  object.arrows = options?.arrows;
@@ -99,6 +101,7 @@ export class KritzelLine extends KritzelBaseObject {
99
101
  this.translateX = x;
100
102
  this.translateY = y;
101
103
  this._adjustedPoints = null;
104
+ this._clipInfo = null;
102
105
  this._core.store.state.objects.update(this);
103
106
  // Update anchors after the line is updated
104
107
  this._core.anchorManager.updateAnchorsForObject(this.id);
@@ -112,6 +115,7 @@ export class KritzelLine extends KritzelBaseObject {
112
115
  rotate(value) {
113
116
  this.rotation = value;
114
117
  this._adjustedPoints = null;
118
+ this._clipInfo = null;
115
119
  this._core.store.state.objects.update(this);
116
120
  }
117
121
  move(startX, startY, endX, endY) {
@@ -127,6 +131,7 @@ export class KritzelLine extends KritzelBaseObject {
127
131
  this._core.anchorManager.updateAnchorsForObject(this.endAnchor.objectId);
128
132
  }
129
133
  this._adjustedPoints = null;
134
+ this._clipInfo = null;
130
135
  this._core.store.state.objects.update(this);
131
136
  }
132
137
  hitTest(x, y) {
@@ -138,12 +143,16 @@ export class KritzelLine extends KritzelBaseObject {
138
143
  }
139
144
  // For curved lines, use distance to the Bezier curve
140
145
  if (this.controlX !== undefined && this.controlY !== undefined) {
141
- const distance = this.pointToBezierDistance(x, y);
146
+ const clip = this.getClipInfo();
147
+ const startT = clip.start?.t ?? 0;
148
+ const endT = clip.end?.t ?? 1;
149
+ const distance = this.pointToBezierDistance(x, y, startT, endT);
142
150
  return distance <= halfStroke;
143
151
  }
144
152
  // For straight lines, use distance to line segment
145
- const p1 = this._adjustedPoints[0];
146
- const p2 = this._adjustedPoints[1];
153
+ const clip = this.getClipInfo();
154
+ const p1 = clip.start ? [clip.start.x, clip.start.y] : this._adjustedPoints[0];
155
+ const p2 = clip.end ? [clip.end.x, clip.end.y] : this._adjustedPoints[1];
147
156
  const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);
148
157
  return distance <= halfStroke;
149
158
  }
@@ -152,6 +161,7 @@ export class KritzelLine extends KritzelBaseObject {
152
161
  if (this._adjustedPoints === null) {
153
162
  this._adjustedPoints = this.computeAdjustedPoints();
154
163
  }
164
+ const clip = this.getClipInfo();
155
165
  const polyPoints = [
156
166
  { x: polygon.bottomLeft.x, y: polygon.bottomLeft.y },
157
167
  { x: polygon.bottomRight.x, y: polygon.bottomRight.y },
@@ -159,7 +169,11 @@ export class KritzelLine extends KritzelBaseObject {
159
169
  { x: polygon.topLeft.x, y: polygon.topLeft.y },
160
170
  ];
161
171
  // Check if any endpoint is inside the polygon
162
- for (const [px, py] of this._adjustedPoints) {
172
+ // Use clipped endpoints
173
+ const p1 = clip.start ? [clip.start.x, clip.start.y] : this._adjustedPoints[0];
174
+ const p2 = clip.end ? [clip.end.x, clip.end.y] : this._adjustedPoints[1];
175
+ const endpoints = [p1, p2];
176
+ for (const [px, py] of endpoints) {
163
177
  if (KritzelGeometryHelper.isPointInPolygon({ x: px, y: py }, polyPoints)) {
164
178
  return true;
165
179
  }
@@ -175,9 +189,12 @@ export class KritzelLine extends KritzelBaseObject {
175
189
  const p0 = this._adjustedPoints[0];
176
190
  const p2 = this._adjustedPoints[1];
177
191
  const controlAdjusted = this.computeAdjustedControlPoint();
192
+ const startT = clip.start?.t ?? 0;
193
+ const endT = clip.end?.t ?? 1;
178
194
  const samples = 20;
179
- for (let i = 1; i < samples; i++) {
180
- const t = i / samples;
195
+ for (let i = 0; i <= samples; i++) {
196
+ const fraction = i / samples;
197
+ const t = startT + fraction * (endT - startT);
181
198
  const oneMinusT = 1 - t;
182
199
  const bx = oneMinusT * oneMinusT * p0[0] + 2 * oneMinusT * t * controlAdjusted[0] + t * t * p2[0];
183
200
  const by = oneMinusT * oneMinusT * p0[1] + 2 * oneMinusT * t * controlAdjusted[1] + t * t * p2[1];
@@ -197,19 +214,19 @@ export class KritzelLine extends KritzelBaseObject {
197
214
  return false;
198
215
  }
199
216
  // For straight lines, check if line intersects any polygon edge
200
- const p1 = { x: this._adjustedPoints[0][0], y: this._adjustedPoints[0][1] };
201
- const p2 = { x: this._adjustedPoints[1][0], y: this._adjustedPoints[1][1] };
217
+ const checkP1 = { x: p1[0], y: p1[1] };
218
+ const checkP2 = { x: p2[0], y: p2[1] };
202
219
  for (let j = 0; j < polyPoints.length; j++) {
203
220
  const q1 = polyPoints[j];
204
221
  const q2 = polyPoints[(j + 1) % polyPoints.length];
205
- if (KritzelGeometryHelper.intersectLines(p1, p2, q1, q2)) {
222
+ if (KritzelGeometryHelper.intersectLines(checkP1, checkP2, q1, q2)) {
206
223
  return true;
207
224
  }
208
225
  // Check distance from polygon edges to line segment
209
- const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, p1.x, p1.y, p2.x, p2.y);
210
- const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, p1.x, p1.y, p2.x, p2.y);
211
- const d3 = this.pointToLineSegmentDistance(p1.x, p1.y, q1.x, q1.y, q2.x, q2.y);
212
- const d4 = this.pointToLineSegmentDistance(p2.x, p2.y, q1.x, q1.y, q2.x, q2.y);
226
+ const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, checkP1.x, checkP1.y, checkP2.x, checkP2.y);
227
+ const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, checkP1.x, checkP1.y, checkP2.x, checkP2.y);
228
+ const d3 = this.pointToLineSegmentDistance(checkP1.x, checkP1.y, q1.x, q1.y, q2.x, q2.y);
229
+ const d4 = this.pointToLineSegmentDistance(checkP2.x, checkP2.y, q1.x, q1.y, q2.x, q2.y);
213
230
  const minD = Math.min(d1, d2, d3, d4);
214
231
  if (minD <= halfStroke) {
215
232
  return true;
@@ -221,6 +238,7 @@ export class KritzelLine extends KritzelBaseObject {
221
238
  this.translateX = x;
222
239
  this.translateY = y;
223
240
  this._adjustedPoints = null;
241
+ this._clipInfo = null;
224
242
  this._core.store.state.objects.update(this);
225
243
  }
226
244
  /**
@@ -279,6 +297,7 @@ export class KritzelLine extends KritzelBaseObject {
279
297
  this.translateY += correctionY / this.scale;
280
298
  // Clear cached adjusted points
281
299
  this._adjustedPoints = null;
300
+ this._clipInfo = null;
282
301
  this._core.store.state.objects.update(this);
283
302
  }
284
303
  updateControlPoint(newX, newY) {
@@ -321,6 +340,7 @@ export class KritzelLine extends KritzelBaseObject {
321
340
  this.translateY += correctionY / this.scale;
322
341
  // Clear cached adjusted points
323
342
  this._adjustedPoints = null;
343
+ this._clipInfo = null;
324
344
  this._core.store.state.objects.update(this);
325
345
  }
326
346
  computeAdjustedPoints() {
@@ -377,7 +397,7 @@ export class KritzelLine extends KritzelBaseObject {
377
397
  * Calculates the minimum distance from a point to a quadratic Bezier curve.
378
398
  * Uses sampling along the curve to find the closest point.
379
399
  */
380
- pointToBezierDistance(x, y) {
400
+ pointToBezierDistance(x, y, startT = 0, endT = 1) {
381
401
  if (this._adjustedPoints === null) {
382
402
  this._adjustedPoints = this.computeAdjustedPoints();
383
403
  }
@@ -388,7 +408,8 @@ export class KritzelLine extends KritzelBaseObject {
388
408
  let minDistance = Infinity;
389
409
  const samples = 20; // Number of samples along the curve
390
410
  for (let i = 0; i <= samples; i++) {
391
- const t = i / samples;
411
+ const fraction = i / samples;
412
+ const t = startT + fraction * (endT - startT);
392
413
  const oneMinusT = 1 - t;
393
414
  // Quadratic Bezier: B(t) = (1-t)²P₀ + 2(1-t)tP₁ + t²P₂
394
415
  const bx = oneMinusT * oneMinusT * p0[0] + 2 * oneMinusT * t * controlAdjusted[0] + t * t * p2[0];
@@ -402,6 +423,33 @@ export class KritzelLine extends KritzelBaseObject {
402
423
  }
403
424
  return minDistance;
404
425
  }
426
+ getClipInfo() {
427
+ if (this._clipInfo)
428
+ return this._clipInfo;
429
+ const startAnchor = this.startAnchor;
430
+ const endAnchor = this.endAnchor;
431
+ const result = {};
432
+ if (startAnchor) {
433
+ const target = this._core.anchorManager.findAnchorTarget(this, 'start');
434
+ if (target) {
435
+ const clip = this._core.anchorManager.computeAnchorClipInfo(this, 'start', target);
436
+ if (clip) {
437
+ result.start = { x: clip.worldX, y: clip.worldY, t: clip.t };
438
+ }
439
+ }
440
+ }
441
+ if (endAnchor) {
442
+ const target = this._core.anchorManager.findAnchorTarget(this, 'end');
443
+ if (target) {
444
+ const clip = this._core.anchorManager.computeAnchorClipInfo(this, 'end', target);
445
+ if (clip) {
446
+ result.end = { x: clip.worldX, y: clip.worldY, t: clip.t };
447
+ }
448
+ }
449
+ }
450
+ this._clipInfo = result;
451
+ return result;
452
+ }
405
453
  /**
406
454
  * Computes the adjusted control point in world coordinates, accounting for rotation and translation.
407
455
  */
@@ -47,6 +47,7 @@ export class KritzelPath extends KritzelBaseObject {
47
47
  object.scale = options?.scale ?? 1;
48
48
  object.strokeWidth = options?.strokeWidth ?? 8;
49
49
  object.fill = options?.fill ?? '#000000';
50
+ object.opacity = options?.opacity ?? 1;
50
51
  object.zIndex = core.store.currentZIndex;
51
52
  object.d = object.generateSvgPath();
52
53
  object.updateDimensions();
@@ -86,6 +86,7 @@ export class KritzelShape extends KritzelBaseObject {
86
86
  object.fillColor = config?.fillColor ?? 'transparent';
87
87
  object.strokeColor = config?.strokeColor ?? '#000000';
88
88
  object.strokeWidth = config?.strokeWidth ?? 4;
89
+ object.opacity = config?.opacity ?? 1;
89
90
  object.fontSize = config?.fontSize ?? 16;
90
91
  object.fontFamily = config?.fontFamily ?? 'Arial';
91
92
  object.fontColor = config?.fontColor ?? '#000000';
@@ -78,13 +78,14 @@ export class KritzelText extends KritzelBaseObject {
78
78
  if (element === null || this.isInViewport() === false) {
79
79
  return;
80
80
  }
81
+ element.style.fontFamily = this.fontFamily;
82
+ element.style.fontSize = `${this.fontSize}pt`;
83
+ element.style.color = this.fontColor;
81
84
  if (this.isMounted && this.elementRef === element && this.editor.dom.parentElement === element) {
85
+ requestAnimationFrame(() => this.adjustSizeOnInput());
82
86
  return;
83
87
  }
84
88
  this.elementRef = element;
85
- this.elementRef.style.fontFamily = this.fontFamily;
86
- this.elementRef.style.fontSize = `${this.fontSize}pt`;
87
- this.elementRef.style.color = this.fontColor;
88
89
  this.elementRef.style.whiteSpace = 'pre-wrap';
89
90
  this.elementRef.style.wordWrap = 'break-word';
90
91
  this.elementRef.innerHTML = '';
@@ -8,7 +8,6 @@ export class IndexedDBSyncProvider {
8
8
  constructor(docName, doc, options) {
9
9
  const dbName = options?.name || docName;
10
10
  this.provider = new IndexeddbPersistence(dbName, doc);
11
- console.info(`IndexedDB Persistence initialized: ${dbName}`);
12
11
  }
13
12
  async connect() {
14
13
  if (this.isConnected) {
@@ -5,6 +5,7 @@ export class KritzelBrushTool extends KritzelBaseTool {
5
5
  type = 'pen';
6
6
  color = '#000000';
7
7
  size = 6;
8
+ opacity = 1;
8
9
  palettes = {
9
10
  pen: ['#000000', '#FFFFFF', '#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF', '#00FFFF', '#808080', '#C0C0C0', '#800000', '#008000', '#000080', '#800080'],
10
11
  highlighter: ['#ffff00', '#ffb347', '#b4ffb4'],
@@ -29,6 +30,7 @@ export class KritzelBrushTool extends KritzelBaseTool {
29
30
  scale: this._core.store.state.scale,
30
31
  fill: this.color,
31
32
  strokeWidth: this.size,
33
+ opacity: this.opacity,
32
34
  });
33
35
  path.isCompleted = false;
34
36
  this._currentPathId = path.id;
@@ -48,6 +50,7 @@ export class KritzelBrushTool extends KritzelBaseTool {
48
50
  scale: this._core.store.state.scale,
49
51
  fill: this.color,
50
52
  strokeWidth: this.size,
53
+ opacity: this.opacity,
51
54
  });
52
55
  path.isCompleted = false;
53
56
  this._currentPathId = path.id;
@@ -73,6 +76,7 @@ export class KritzelBrushTool extends KritzelBaseTool {
73
76
  scale: this._core.store.state.scale,
74
77
  fill: this.color,
75
78
  strokeWidth: this.size,
79
+ opacity: this.opacity,
76
80
  });
77
81
  updatedPath.id = currentPath.id;
78
82
  updatedPath.workspaceId = currentPath.workspaceId;
@@ -98,6 +102,7 @@ export class KritzelBrushTool extends KritzelBaseTool {
98
102
  scale: this._core.store.state.scale,
99
103
  fill: this.color,
100
104
  strokeWidth: this.size,
105
+ opacity: this.opacity,
101
106
  });
102
107
  updatedPath.id = currentPath.id;
103
108
  updatedPath.workspaceId = currentPath.workspaceId;
@@ -6,7 +6,33 @@ import { KritzelSelectionGroup } from "../objects/selection-group.class";
6
6
  export class KritzelLineTool extends KritzelBaseTool {
7
7
  color = '#000000';
8
8
  size = 4;
9
- palettes = ['#000000', '#FFFFFF', '#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF', '#00FFFF', '#808080', '#C0C0C0', '#800000', '#008000', '#000080', '#808000', '#800080'];
9
+ opacity = 1;
10
+ palette = [
11
+ '#000000',
12
+ '#ff5252',
13
+ '#ffbc00',
14
+ '#00c853',
15
+ '#0000FF',
16
+ '#d500f9',
17
+ '#fafafa',
18
+ '#a52714',
19
+ '#ee8100',
20
+ '#558b2f',
21
+ '#01579b',
22
+ '#8e24aa',
23
+ '#90a4ae',
24
+ '#ff4081',
25
+ '#ff6e40',
26
+ '#aeea00',
27
+ '#304ffe',
28
+ '#7c4dff',
29
+ '#cfd8dc',
30
+ '#f8bbd0',
31
+ '#ffccbc',
32
+ '#f0f4c3',
33
+ '#9fa8da',
34
+ '#d1c4e9',
35
+ ];
10
36
  /** Arrow head configuration for lines created with this tool */
11
37
  arrows;
12
38
  _startX = 0;
@@ -35,6 +61,7 @@ export class KritzelLineTool extends KritzelBaseTool {
35
61
  scale: this._core.store.state.scale,
36
62
  stroke: this.color,
37
63
  strokeWidth: this.size,
64
+ opacity: this.opacity,
38
65
  arrows: this.arrows,
39
66
  });
40
67
  line.isCompleted = false;
@@ -59,6 +86,7 @@ export class KritzelLineTool extends KritzelBaseTool {
59
86
  scale: this._core.store.state.scale,
60
87
  stroke: this.color,
61
88
  strokeWidth: this.size,
89
+ opacity: this.opacity,
62
90
  arrows: this.arrows,
63
91
  });
64
92
  line.isCompleted = false;
@@ -86,6 +114,7 @@ export class KritzelLineTool extends KritzelBaseTool {
86
114
  scale: this._core.store.state.scale,
87
115
  stroke: this.color,
88
116
  strokeWidth: this.size,
117
+ opacity: this.opacity,
89
118
  arrows: this.arrows,
90
119
  });
91
120
  updatedLine.id = currentLine.id;
@@ -113,6 +142,7 @@ export class KritzelLineTool extends KritzelBaseTool {
113
142
  scale: this._core.store.state.scale,
114
143
  stroke: this.color,
115
144
  strokeWidth: this.size,
145
+ opacity: this.opacity,
116
146
  arrows: this.arrows,
117
147
  });
118
148
  updatedLine.id = currentLine.id;