kritzel-stencil 0.0.120 → 0.0.122
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.
- package/dist/cjs/{index-BjLSiQIM.js → index-CFCyVs0_.js} +185 -69
- package/dist/cjs/index-CFCyVs0_.js.map +1 -0
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/kritzel-brush-style_18.cjs.entry.js +129 -72
- package/dist/cjs/kritzel-brush-style_18.cjs.entry.js.map +1 -1
- package/dist/collection/classes/commands/remove-object.command.js +3 -0
- package/dist/collection/classes/commands/remove-object.command.js.map +1 -1
- package/dist/collection/classes/handlers/context-menu.handler.js +1 -1
- package/dist/collection/classes/handlers/context-menu.handler.js.map +1 -1
- package/dist/collection/classes/handlers/move.handler.js +2 -2
- package/dist/collection/classes/handlers/move.handler.js.map +1 -1
- package/dist/collection/classes/handlers/selection.handler.js +5 -5
- package/dist/collection/classes/handlers/selection.handler.js.map +1 -1
- package/dist/collection/classes/history.class.js +16 -13
- package/dist/collection/classes/history.class.js.map +1 -1
- package/dist/collection/classes/objects/base-object.class.js +28 -32
- package/dist/collection/classes/objects/base-object.class.js.map +1 -1
- package/dist/collection/classes/objects/custom-element.class.js +52 -0
- package/dist/collection/classes/objects/custom-element.class.js.map +1 -0
- package/dist/collection/classes/objects/image.class.js +1 -1
- package/dist/collection/classes/objects/image.class.js.map +1 -1
- package/dist/collection/classes/objects/path.class.js +62 -2
- package/dist/collection/classes/objects/path.class.js.map +1 -1
- package/dist/collection/classes/objects/selection-group.class.js +1 -1
- package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
- package/dist/collection/classes/objects/text.class.js +1 -1
- package/dist/collection/classes/objects/text.class.js.map +1 -1
- package/dist/collection/classes/reviver.class.js +4 -0
- package/dist/collection/classes/reviver.class.js.map +1 -1
- package/dist/collection/classes/store.class.js +45 -6
- package/dist/collection/classes/store.class.js.map +1 -1
- package/dist/collection/classes/tools/eraser-tool.class.js +18 -14
- package/dist/collection/classes/tools/eraser-tool.class.js.map +1 -1
- package/dist/collection/classes/tools/image-tool.class.js +1 -1
- package/dist/collection/classes/tools/image-tool.class.js.map +1 -1
- package/dist/collection/classes/tools/selection-tool.class.js +2 -6
- package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
- package/dist/collection/classes/viewport.class.js +20 -12
- package/dist/collection/classes/viewport.class.js.map +1 -1
- package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +6 -6
- package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +40 -33
- package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
- package/dist/collection/configs/default-engine-state.js +2 -2
- package/dist/collection/configs/default-engine-state.js.map +1 -1
- package/dist/collection/helpers/html.helper.js +7 -0
- package/dist/collection/helpers/html.helper.js.map +1 -0
- package/dist/collection/helpers/object.helper.js +6 -2
- package/dist/collection/helpers/object.helper.js.map +1 -1
- package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
- package/dist/collection/interfaces/object.interface.js.map +1 -1
- package/dist/components/index.js +2 -2
- package/dist/components/kritzel-controls.js +1 -1
- package/dist/components/kritzel-editor.js +7 -7
- package/dist/components/kritzel-editor.js.map +1 -1
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/{p-eS30Bqrc.js → p-COPOzWCn.js} +213 -100
- package/dist/components/p-COPOzWCn.js.map +1 -0
- package/dist/components/{p-DC3j4P1n.js → p-Ch8eM2R8.js} +99 -39
- package/dist/components/p-Ch8eM2R8.js.map +1 -0
- package/dist/components/{p-BAMl2Ww6.js → p-DIu9OTyP.js} +3 -3
- package/dist/components/{p-BAMl2Ww6.js.map → p-DIu9OTyP.js.map} +1 -1
- package/dist/esm/{index-DsUDklEm.js → index-DYLW4hYm.js} +185 -69
- package/dist/esm/index-DYLW4hYm.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/kritzel-brush-style_18.entry.js +129 -72
- package/dist/esm/kritzel-brush-style_18.entry.js.map +1 -1
- package/dist/stencil/index.esm.js +1 -1
- package/dist/stencil/p-DYLW4hYm.js +2 -0
- package/dist/stencil/p-DYLW4hYm.js.map +1 -0
- package/dist/stencil/p-fa584641.entry.js +2 -0
- package/dist/stencil/p-fa584641.entry.js.map +1 -0
- package/dist/stencil/stencil.esm.js +1 -1
- package/dist/types/classes/history.class.d.ts +1 -0
- package/dist/types/classes/objects/base-object.class.d.ts +10 -6
- package/dist/types/classes/objects/custom-element.class.d.ts +26 -0
- package/dist/types/classes/objects/image.class.d.ts +1 -1
- package/dist/types/classes/objects/path.class.d.ts +5 -2
- package/dist/types/classes/objects/text.class.d.ts +1 -1
- package/dist/types/classes/store.class.d.ts +5 -0
- package/dist/types/components.d.ts +4 -4
- package/dist/types/helpers/html.helper.d.ts +3 -0
- package/dist/types/interfaces/engine-state.interface.d.ts +2 -2
- package/dist/types/interfaces/object.interface.d.ts +9 -4
- package/package.json +1 -1
- package/dist/cjs/index-BjLSiQIM.js.map +0 -1
- package/dist/components/p-DC3j4P1n.js.map +0 -1
- package/dist/components/p-eS30Bqrc.js.map +0 -1
- package/dist/esm/index-DsUDklEm.js.map +0 -1
- package/dist/stencil/p-0ae72b0d.entry.js +0 -2
- package/dist/stencil/p-0ae72b0d.entry.js.map +0 -1
- package/dist/stencil/p-DsUDklEm.js +0 -2
- package/dist/stencil/p-DsUDklEm.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["kritzelBrushStyleCss","KritzelBrushStyle","constructor","hostRef","this","type","brushOptions","value","label","handleDropdownValueChange","event","typeChange","emit","detail","render","dropdownOptions","map","option","h","Host","key","options","onValueChanged","class","slot","name","size","kritzelColorCss","KritzelColor","isLightColor","hexColor","r","g","b","sanitizedHex","startsWith","slice","length","parseInt","substring","isNaN","luminance","isColorVeryLight","style","width","height","borderRadius","display","position","white","backgroundColor","top","left","kritzelColorPaletteCss","KritzelColorPalette","colors","selectedColor","isExpanded","isOpaque","handleColorClick","color","colorChange","calculateHeight","colorsPerRow","rowHeight","gap","rowCount","Math","ceil","displayedColors","expandedHeight","expanded","selected","onClick","kritzelContextMenuCss","KritzelContextMenu","disabledStates","Map","visibleItems","componentWillLoad","resolveVisibleItems","resolveDisabledStates","onItemsChanged","handleItemClick","item","index","get","actionSelected","visibilityPromises","items","async","isVisible","visible","undefined","result","objects","Promise","visibilityResults","all","forEach","push","newStates","disabledPromises","isDisabled","disabled","set","_a","onTouchStart","icon","kritzelControlBrushConfigCss","KritzelControlBrushConfig","palette","handleToolChange","newTool","palettes","tool","handleToggleExpand","handleTypeChange","toolChange","handleColorChange","handleSizeChange","flexDirection","alignItems","justifyContent","onTypeChange","title","visibillity","visibility","onColorChange","selectedSize","onSizeChange","kritzelControlTextConfigCss","KritzelControlTextConfig","handleFamilyChange","fontFamily","fontColor","fontSize","selectedFontFamily","onFontFamilyChange","KritzelDevicesHelper","isTouchDevice","window","matchMedia","matches","kritzelControlsCss","KritzelControls","controls","activeControl","isUtilityPanelVisible","firstConfig","isTooltipVisible","kritzelEngine","handleActiveToolChange","find","control","setFocus","handleClick","element","target","closest","enable","closeTooltip","activeToolAsTextTool","activeToolAsBrushTool","initializeEngine","initializeTools","isControlsReady","customElements","whenDefined","host","parentElement","querySelector","Error","c","registerTool","config","isDefault","changeActiveTool","console","warn","handleControlClick","handleConfigClick","stopPropagation","disable","Object","assign","hasNoConfig","_b","mobile","bottom","onUndo","undo","onRedo","redo","onDelete","delete","_event","call","anchorElement","_c","shadowRoot","onToolChange","cursor","pointerEvents","KritzelBrushTool","_d","_e","border","KritzelTextTool","_f","_g","_h","kritzelCursorTrailCss","KritzelCursorTrail","cursorTrailPoints","isLeftButtonDown","TRAIL_DURATION_MS","MAX_TRAIL_POINTS","componentDidLoad","trailCleanupIntervalId","setInterval","now","Date","newTrailPoints","filter","p","timestamp","disconnectedCallback","clearInterval","handleMouseDown","ev","pointerType","button","KritzelMouseButton","Left","store","state","pointers","handlePointerMove","newPoint","x","clientX","y","clientY","updatedTrail","handlePointerUp","xmlns","opacity","zIndex","point","prevPoint","age","progress","max","min","baseStrokeWidth","x1","toString","y1","x2","y2","stroke","kritzelDropdownCss","KritzelDropdown","selectStyles","hasSuffixContent","hasPrefixContent","handleSelectChange","newValue","internalValue","valueChanged","evaluateSuffixContent","suffixSlotElement","newHasContent","assignedNodes","flatten","evaluatePrefixContent","prefixSlotElement","updateInternalValue","externalValueChanged","optionsChanged","proposedValue","emitChange","finalValue","isValidValue","some","opt","selectClasses","ref","el","onSlotchange","onInput","KritzelIconRegistry","register","svgContent","registry","has","registerIcons","icons","prototype","hasOwnProperty","pen","highlighter","eraser","image","copy","paste","cut","download","ABSOLUTE_SCALE_MAX","ABSOLUTE_SCALE_MIN","kritzelEditorCss","KritzelEditor","scaleMax","scaleMin","KritzelSelectionTool","DEFAULT_BRUSH_CONFIG","KritzelEraserTool","DEFAULT_TEXT_CONFIG","KritzelImageTool","globalContextMenuItems","engineRef","getCopiedObjects","action","menu","selectAllObjectsInViewport","objectContextMenuItems","_","isEditable","object","edit","moveToTop","moveToBottom","customSvgIcons","isControlsVisible","isEngineReady","onIsEngineReady","checkIsReady","onIsControlsReady","getObjectById","id","addObject","updateObject","updatedProperties","removeObject","getSelectedObjects","selectObjects","clearSelection","centerObjectInViewport","handleTouchStart","cancelable","preventDefault","handleKeyDown","controlsRef","registerCustomSvgIcons","isReady","svg","entries","KritzelViewport","initialTouchDistance","startX","startY","_store","viewportWidth","clientWidth","viewportHeight","clientHeight","translateX","translateY","handleResize","hasViewportChanged","rerender","handlePointerDown","adjustedClientX","offsetX","adjustedClientY","offsetY","Right","isPanning","activePointers","Array","from","values","currentPath","isScaling","firstTouchX","firstTouchY","secondTouchX","secondTouchY","sqrt","pow","cursorX","cursorY","skipContextMenu","currentTouchDistance","midpointX","midpointY","scaleRatio","newScale","scale","translateXAdjustment","translateYAdjustment","handleWheel","ctrlKey","KritzelEventHelper","isMainMouseWheel","handleZoom","handlePan","rect","getBoundingClientRect","delta","deltaY","scaleStep","panSpeed","deltaX","UpdateViewportCommand","KritzelBaseCommand","initiator","previousViewport","super","currentViewport","execute","KritzelCircularBuffer","capacity","head","tail","buffer","fill","add","pop","peek","lastIndex","isEmpty","clear","KritzelHistory","undoStack","historyBufferSize","redoStack","executeCommand","command","debugInfo","logCommands","info","KritzelOctree","bounds","children","insert","intersects","rotatedBoundingBox","subdivide","child","update","findIndex","o","remove","predicate","splice","query","range","results","allObjects","z","depth","halfWidth","halfHeight","halfDepth","a","UpdateObjectCommand","previousProperties","DEFAULT_ENGINE_STATE","activeTool","activeText","copiedObjects","objectsOctree","selectionBox","selectionGroup","resizeHandleType","isEnabled","isFocused","isSelecting","isResizing","isResizeHandleSelected","isRotating","isRotationHandleSelected","isDragging","isDrawing","isErasing","isWriting","isCtrlKeyPressed","isContextMenuVisible","contextMenuItems","contextMenuX","contextMenuY","showObjectInfo","showViewportInfo","translateXMax","translateXMin","translateYMax","translateYMin","longTouchTimeout","longTouchDelay","KritzelStore","history","_history","_state","currentZIndex","KritzelSelectionGroup","KrtizelSelectionBox","selectedObjects","_listeners","_kritzelEngine","Infinity","viewportBounds","forceUpdate","findObjectById","deselectAllObjects","RemoveSelectionGroupCommand","onStateChange","property","listener","Set","setState","oldValue","String","deleteSelectedObjectsCommand","obj","RemoveObjectCommand","removeSelectionGroupCommand","commands","BatchCommand","deleteObject","isHistoryUpdated","removeObjectCommand","adjustedX","adjustedY","updatePosition","addCopiedObjectsCommands","AddObjectCommand","addCopiedObjectsAsSelectionGroupCommand","AddSelectionGroupCommand","KritzelToolRegistry","getTool","bringForward","increaseZIndexCommands","sendBackward","decreaseZIndexCommands","bringToFront","sendToBack","create","addOrRemove","rotation","objectsInViewport","resetActiveText","getObjectFromPointerEvent","selector","elementAtPoint","elementFromPoint","selectedObject","KritzelKeyHandler","KritzelBaseHandler","shiftKey","selectAll","insertFromClipboard","handleKeyUp","KritzelContextMenuHandler","handleContextMenu","menuWidthEstimate","menuHeightEstimate","margin","innerWidth","innerHeight","KritzelClassHelper","isInstanceOf","className","__class__","kritzelEngineCss","KritzelEngine","validateScaleMax","validateScaleMin","isSelectionActive","contextMenuElement","contextMenuHandler","keyHandler","viewport","_registerStateChangeListeners","hideContextMenu","isPointerEventOnContextMenu","onLongTouchPress","setPointerCapture","pointerId","releasePointerCapture","handlePointerCancel","updateFocus","isInside","right","path","composedPath","kritzelEngineElement","isInKritzelEngine","includes","toolName","toolClass","toolConfig","KritzelBaseTool","error","registeredTool","resolve","onDeactivate","onActivate","focus","generateId","log","centerInViewport","_handleActiveToolChange","bind","_handleIsFocusedChange","activeToolChange","KritzelKeyboardHelper","forceHideKeyboard","computedStyle","getComputedStyle","baseHandleSizePx","getPropertyValue","trim","baseHandleSize","parseFloat","baseHandleTouchSize","_j","_k","_l","_m","_o","transform","_p","_q","_r","_s","_t","transformationMatrix","transformOrigin","totalHeight","totalWidth","rotationDegrees","markedForRemoval","minHeight","minWidth","borderColor","borderWidth","borderStyle","padding","overflow","mount","viewBox","d","src","userSelect","draggable","onDragStart","e","onKeyDown","handleInput","rows","outline","resize","whiteSpace","isReadonly","caretColor","strokeWidth","strokeLinecap","cx","cy","_u","debugInfoVisible","_v","_w","_x","_y","_z","_0","_1","_2","onActionSelected","_3","kritzelFontCss","KritzelFont","kritzelFontFamilyCss","KritzelFontFamily","fontOptions","fontFamilyChange","isValidCurrentFont","kritzelFontSizeCss","KritzelFontSize","sizes","handleSizeClick","sizeChange","kritzelIconCss","KritzelIcon","styles","role","innerHTML","kritzelStrokeSizeCss","KritzelStrokeSize","kritzelTooltipCss","MOBILE_BREAKPOINT","KritzelTooltip","arrowSize","positionX","arrowOffset","isMobileView","handleWindowResize","calculateAdjustedPosition","componentWillUpdate","anchorRect","tooltipContent","tooltipRect","transition","marginBottom","borderLeft","borderRight","borderTop","kritzelUtilityPanelCss","KritzelUtilityPanel","handleUndo","handleRedo"],"sources":["src/components/shared/kritzel-brush-style/kritzel-brush-style.css?tag=kritzel-brush-style&encapsulation=shadow","src/components/shared/kritzel-brush-style/kritzel-brush-style.tsx","src/components/shared/kritzel-color/kritzel-color.css?tag=kritzel-color&encapsulation=shadow","src/components/shared/kritzel-color/kritzel-color.tsx","src/components/shared/kritzel-color-palette/kritzel-color-palette.css?tag=kritzel-color-palette&encapsulation=shadow","src/components/shared/kritzel-color-palette/kritzel-color-palette.tsx","src/components/ui/kritzel-context-menu/kritzel-context-menu.css?tag=kritzel-context-menu&encapsulation=shadow","src/components/ui/kritzel-context-menu/kritzel-context-menu.tsx","src/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.css?tag=kritzel-control-brush-config&encapsulation=shadow","src/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.tsx","src/components/ui/kritzel-control-text-config/kritzel-control-text-config.css?tag=kritzel-control-text-config&encapsulation=shadow","src/components/ui/kritzel-control-text-config/kritzel-control-text-config.tsx","src/helpers/devices.helper.ts","src/components/ui/kritzel-controls/kritzel-controls.css?tag=kritzel-controls&encapsulation=shadow","src/components/ui/kritzel-controls/kritzel-controls.tsx","src/components/core/kritzel-cursor-trail/kritzel-cursor-trail.css?tag=kritzel-cursor-trail&encapsulation=shadow","src/components/core/kritzel-cursor-trail/kritzel-cursor-trail.tsx","src/components/shared/kritzel-dropdown/kritzel-dropdown.css?tag=kritzel-dropdown&encapsulation=shadow","src/components/shared/kritzel-dropdown/kritzel-dropdown.tsx","src/classes/registries/icon-registry.class.ts","src/constants/engine.constants.ts","src/components/core/kritzel-editor/kritzel-editor.css?tag=kritzel-editor","src/components/core/kritzel-editor/kritzel-editor.tsx","src/classes/viewport.class.ts","src/classes/commands/update-viewport.command.ts","src/classes/structures/circular-buffer.structure.ts","src/classes/history.class.ts","src/classes/structures/octree.structure.ts","src/classes/commands/update-object.command.ts","src/configs/default-engine-state.ts","src/classes/store.class.ts","src/classes/handlers/key.handler.ts","src/classes/handlers/context-menu.handler.ts","src/helpers/class.helper.ts","src/components/core/kritzel-engine/kritzel-engine.css?tag=kritzel-engine&encapsulation=shadow","src/components/core/kritzel-engine/kritzel-engine.tsx","src/components/shared/kritzel-font/kritzel-font.css?tag=kritzel-font&encapsulation=shadow","src/components/shared/kritzel-font/kritzel-font.tsx","src/components/shared/kritzel-font-family/kritzel-font-family.css?tag=kritzel-font-family&encapsulation=shadow","src/components/shared/kritzel-font-family/kritzel-font-family.tsx","src/components/shared/kritzel-font-size/kritzel-font-size.css?tag=kritzel-font-size&encapsulation=shadow","src/components/shared/kritzel-font-size/kritzel-font-size.tsx","src/components/shared/kritzel-icon/kritzel-icon.css?tag=kritzel-icon&encapsulation=shadow","src/components/shared/kritzel-icon/kritzel-icon.tsx","src/components/shared/kritzel-stroke-size/kritzel-stroke-size.css?tag=kritzel-stroke-size&encapsulation=shadow","src/components/shared/kritzel-stroke-size/kritzel-stroke-size.tsx","src/components/shared/kritzel-tooltip/kritzel-tooltip.css?tag=kritzel-tooltip&encapsulation=shadow","src/components/shared/kritzel-tooltip/kritzel-tooltip.tsx","src/components/ui/kritzel-utility-panel/kritzel-utility-panel.css?tag=kritzel-utility-panel&encapsulation=shadow","src/components/ui/kritzel-utility-panel/kritzel-utility-panel.tsx"],"sourcesContent":[":host {\r\n display: flex; \r\n align-items: flex-start; \r\n gap: 8px; \r\n padding: 8px; \r\n box-sizing: border-box; \r\n width: 100%;\r\n}\r\n\r\n.brush-style-button {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 42px;\r\n height: 32px;\r\n padding: 0;\r\n border: none;\r\n outline: none;\r\n background: none;\r\n cursor: default;\r\n border-radius: 0; \r\n color: var(--control-text-color);\r\n font-weight: bold;\r\n -webkit-tap-highlight-color: transparent;\r\n}\r\n\r\n.font-style-button:not(:last-child) {\r\n border-right: 1px solid #333333; \r\n}\r\n\r\n.font-style-button:hover {\r\n background-color: var(--control-hover-bg);\r\n}\r\n\r\n.font-style-button:active {\r\n background-color: var(--control-active-bg);\r\n}\r\n\r\n.font-style-button.selected,\r\n.font-style-button.selected:hover,\r\n.font-style-button.selected:active {\r\n background-color: var(--control-selected-bg);\r\n color: var(--control-selected-color);\r\n}","import { Component, Host, h, Prop, EventEmitter, Event } from '@stencil/core';\r\nimport { DropdownOption } from '../kritzel-dropdown/kritzel-dropdown'; // Import DropdownOption\r\n\r\nexport interface BrushStyleOption extends DropdownOption {}\r\n\r\n@Component({\r\n tag: 'kritzel-brush-style',\r\n styleUrl: 'kritzel-brush-style.css',\r\n shadow: true,\r\n})\r\nexport class KritzelBrushStyle {\r\n @Prop()\r\n type: 'pen' | 'highlighter' = 'pen';\r\n\r\n @Prop() brushOptions: BrushStyleOption[] = [\r\n { value: 'pen', label: 'Pen' },\r\n { value: 'highlighter', label: 'Highlighter' },\r\n ];\r\n\r\n @Event()\r\n typeChange: EventEmitter<'pen' | 'highlighter'>;\r\n\r\n handleDropdownValueChange(event: CustomEvent<string>) {\r\n this.typeChange.emit(event.detail as 'pen' | 'highlighter');\r\n }\r\n\r\n render() {\r\n const dropdownOptions: DropdownOption[] = this.brushOptions.map(option => ({\r\n value: option.value,\r\n label: option.label,\r\n }));\r\n\r\n return (\r\n <Host>\r\n <kritzel-dropdown options={dropdownOptions} value={this.type} onValueChanged={event => this.handleDropdownValueChange(event)}>\r\n <button class=\"brush-style-button\" slot=\"prefix\">\r\n <kritzel-icon name={this.type} size={16}></kritzel-icon>\r\n </button>\r\n </kritzel-dropdown>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: flex;\r\n}\r\n\r\n.checkerboard-bg {\r\n background: repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 50% / 8px 8px;\r\n position: relative;\r\n overflow: hidden;\r\n}\r\n\r\n.color-circle {\r\n width: 24px;\r\n height: 24px;\r\n border-radius: 50%;\r\n box-sizing: border-box;\r\n display: block;\r\n}\r\n\r\n.color-circle.white {\r\n border: 1px solid var(--kritzel-color-palette-circle-border-color, #dddcdc);\r\n}","import { Component, Host, Prop, h } from '@stencil/core';\r\n\r\n@Component({\r\n tag: 'kritzel-color',\r\n styleUrl: 'kritzel-color.css',\r\n shadow: true,\r\n})\r\nexport class KritzelColor {\r\n @Prop()\r\n value: string;\r\n\r\n @Prop()\r\n size: number = 24;\r\n\r\n private isLightColor(hexColor: string): boolean {\r\n if (!hexColor) return false;\r\n\r\n let r = 0,\r\n g = 0,\r\n b = 0;\r\n\r\n let sanitizedHex = hexColor.startsWith('#') ? hexColor.slice(1) : hexColor;\r\n\r\n if (sanitizedHex.length === 3) {\r\n r = parseInt(sanitizedHex[0] + sanitizedHex[0], 16);\r\n g = parseInt(sanitizedHex[1] + sanitizedHex[1], 16);\r\n b = parseInt(sanitizedHex[2] + sanitizedHex[2], 16);\r\n } else if (sanitizedHex.length === 6) {\r\n r = parseInt(sanitizedHex.substring(0, 2), 16);\r\n g = parseInt(sanitizedHex.substring(2, 4), 16);\r\n b = parseInt(sanitizedHex.substring(4, 6), 16);\r\n } else {\r\n return false;\r\n }\r\n\r\n if (isNaN(r) || isNaN(g) || isNaN(b)) {\r\n return false;\r\n }\r\n\r\n const luminance = 0.299 * r + 0.587 * g + 0.114 * b;\r\n\r\n return luminance > 220;\r\n }\r\n\r\n render() {\r\n const isColorVeryLight = this.isLightColor(this.value);\r\n return (\r\n <Host>\r\n <div\r\n class=\"checkerboard-bg\"\r\n style={{\r\n width: `${this.size}px`,\r\n height: `${this.size}px`,\r\n borderRadius: '50%',\r\n display: 'inline-block',\r\n position: 'relative',\r\n }}\r\n >\r\n <div\r\n class={{\r\n 'color-circle': true,\r\n 'white': isColorVeryLight,\r\n }}\r\n style={{\r\n backgroundColor: this.value,\r\n width: `${this.size}px`,\r\n height: `${this.size}px`,\r\n borderRadius: '50%',\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n display: 'inline-block',\r\n }}\r\n ></div>\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 8px;\r\n padding: 8px;\r\n width: 100%;\r\n box-sizing: border-box;\r\n}\r\n\r\n.color-grid {\r\n width: 100%;\r\n display: grid;\r\n grid-template-columns: repeat(6, 32px);\r\n gap: 8px;\r\n justify-items: center;\r\n overflow: hidden;\r\n height: 40px;\r\n transition: height 0.1s ease-in-out;\r\n}\r\n\r\n.color-grid.expanded {\r\n height: 500px;\r\n}\r\n\r\n.color-container {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n border: 2px solid transparent;\r\n box-sizing: border-box;\r\n}\r\n\r\n.color-container:hover {\r\n background-color: var(--kritzel-color-palette-hover-background-color, #f0f0f0);\r\n}\r\n\r\n.color-container.selected {\r\n border-color: var(--kritzel-selection-border-color, #0E1111);\r\n background-color: var(--kritzel-color-palette-selected-background-color);\r\n}\r\n\r\n\r\n","import { Component, Host, h, Prop, EventEmitter, Event } from '@stencil/core';\r\n\r\n@Component({\r\n tag: 'kritzel-color-palette',\r\n styleUrl: 'kritzel-color-palette.css',\r\n shadow: true,\r\n})\r\nexport class KritzelColorPalette {\r\n @Prop()\r\n colors: string[] = [];\r\n\r\n @Prop({ mutable: true })\r\n selectedColor: string | null = null;\r\n\r\n @Prop()\r\n isExpanded: boolean = false;\r\n\r\n @Prop()\r\n isOpaque: boolean = false;\r\n\r\n @Event()\r\n colorChange: EventEmitter<string>;\r\n\r\n private handleColorClick(color: string) {\r\n this.selectedColor = color;\r\n this.colorChange.emit(color);\r\n }\r\n\r\n private calculateHeight(): string {\r\n const colorsPerRow = 6;\r\n const rowHeight = 32;\r\n const gap = 8;\r\n const rowCount = Math.ceil(this.colors.length / colorsPerRow);\r\n return `${rowCount * rowHeight + (rowCount - 1) * gap}px`;\r\n }\r\n\r\n render() {\r\n const displayedColors = this.isExpanded ? this.colors : this.colors.slice(0, 6);\r\n const expandedHeight = this.isExpanded ? this.calculateHeight() : '32px';\r\n\r\n return (\r\n <Host>\r\n <div\r\n class={{\r\n 'color-grid': true,\r\n 'expanded': this.isExpanded,\r\n }}\r\n style={{\r\n height: expandedHeight\r\n }}\r\n >\r\n {displayedColors.map(color => (\r\n <div\r\n class={{\r\n 'color-container': true,\r\n 'selected': this.selectedColor === color,\r\n }}\r\n onClick={() => this.handleColorClick(color)}\r\n >\r\n <kritzel-color value={color}></kritzel-color>\r\n </div>\r\n ))}\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: block; \r\n}\r\n\r\n.menu-container {\r\n display: flex;\r\n flex-direction: column;\r\n background-color: var(--kritzel-context-menu-background-color, #ffffff);\r\n border-radius: var(--kritzel-context-menu-border-radius, 12px);\r\n box-shadow: var(--kritzel-context-menu-box-shadow, 0 1px 6px rgba(0, 0, 0, 0.12));\r\n border: var(--kritzel-context-menu-border, 1px solid #f0f0f0);\r\n padding: var(--kritzel-context-menu-padding,4px);\r\n}\r\n\r\n.menu-item {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--kritzel-context-menu-item-gap, 8px);\r\n background: none;\r\n border: none;\r\n text-align: left;\r\n padding: var(--kritzel-context-menu-item-padding, 8px);\r\n border-radius: var(--kritzel-context-menu-item-border-radius, 12px);\r\n cursor: pointer;\r\n font-size: var(--kritzel-context-menu-item-font-size, 14px);\r\n color: var(--kritzel-context-menu-item-color, #333333);\r\n white-space: nowrap;\r\n -webkit-tap-highlight-color: transparent;\r\n}\r\n\r\n.menu-item:not(.disabled):hover {\r\n background-color: var(--kritzel-context-menu-item-hover-background-color, hsl(0, 0%, 0%, 4.3%));\r\n}\r\n\r\n.menu-item:not(.disabled):active {\r\n background-color: var(--kritzel-context-menu-item-active-background-color, hsl(0, 0%, 0%, 8.6%));\r\n}\r\n\r\n.menu-item.disabled {\r\n color: var(--kritzel-context-menu-item-disabled-color, #aaaaaa);\r\n cursor: default;\r\n}\r\n\r\n.menu-item kritzel-icon {\r\n opacity: 0.8;\r\n flex-shrink: 0;\r\n}\r\n\r\n.menu-item.disabled kritzel-icon {\r\n opacity: 0.4;\r\n}\r\n\r\n.label {\r\n flex-grow: 1;\r\n}\r\n","import { Component, Host, h, Prop, Event, EventEmitter, Element, State, Watch } from '@stencil/core';\r\nimport { ContextMenuItem } from '../../../interfaces/context-menu-item.interface';\r\nimport { KritzelBaseObject } from '../../../classes/objects/base-object.class';\r\n\r\n@Component({\r\n tag: 'kritzel-context-menu',\r\n styleUrl: 'kritzel-context-menu.css',\r\n shadow: true,\r\n})\r\nexport class KritzelContextMenu {\r\n @Prop()\r\n items: ContextMenuItem[];\r\n\r\n @Prop()\r\n objects: KritzelBaseObject[];\r\n\r\n @Event()\r\n actionSelected: EventEmitter<ContextMenuItem>;\r\n\r\n @Element()\r\n hostElement: HTMLElement;\r\n\r\n @State()\r\n private disabledStates: Map<number, boolean> = new Map();\r\n\r\n @State()\r\n private visibleItems: ContextMenuItem[] = [];\r\n\r\n componentWillLoad() {\r\n this.resolveVisibleItems();\r\n this.resolveDisabledStates();\r\n }\r\n\r\n\r\n @Watch('items')\r\n onItemsChanged() {\r\n this.resolveVisibleItems();\r\n this.resolveDisabledStates();\r\n }\r\n\r\n private handleItemClick(item: ContextMenuItem, index: number) {\r\n if (!this.disabledStates.get(index)) {\r\n this.actionSelected.emit(item);\r\n }\r\n }\r\n\r\n private async resolveVisibleItems() {\r\n const visibleItems: ContextMenuItem[] = [];\r\n const visibilityPromises = this.items.map(async (item, index) => {\r\n let isVisible = true;\r\n if (item.visible !== undefined) {\r\n if (typeof item.visible === 'boolean') {\r\n isVisible = item.visible;\r\n } else if (typeof item.visible === 'function') {\r\n const result = item.visible(null, this.objects);\r\n if (result instanceof Promise) {\r\n isVisible = await result;\r\n } else {\r\n isVisible = result;\r\n }\r\n }\r\n }\r\n return { item, index, isVisible };\r\n });\r\n\r\n const visibilityResults = await Promise.all(visibilityPromises);\r\n visibilityResults.forEach(({ item, isVisible }) => {\r\n if (isVisible) {\r\n visibleItems.push(item);\r\n }\r\n });\r\n\r\n this.visibleItems = visibleItems;\r\n }\r\n\r\n private async resolveDisabledStates() {\r\n const newStates = new Map<number, boolean>();\r\n const disabledPromises = this.visibleItems.map(async (item, index) => {\r\n let isDisabled = false;\r\n if (typeof item.disabled === 'boolean') {\r\n isDisabled = item.disabled;\r\n } else if (typeof item.disabled === 'function') {\r\n const result = item.disabled(null, this.objects);\r\n if (result instanceof Promise) {\r\n isDisabled = await result;\r\n } else {\r\n isDisabled = result;\r\n }\r\n }\r\n newStates.set(index, isDisabled);\r\n });\r\n\r\n await Promise.all(disabledPromises);\r\n this.disabledStates = new Map(newStates);\r\n }\r\n\r\n render() {\r\n return (\r\n <Host>\r\n <div class=\"menu-container\">\r\n {this.visibleItems.map((item, index) => {\r\n const isDisabled = this.disabledStates.get(index) ?? false;\r\n return (\r\n <button\r\n key={`${item.label}-${index}`}\r\n class={{ 'menu-item': true, 'disabled': isDisabled }}\r\n onClick={() => this.handleItemClick(item, index)}\r\n onTouchStart={() => this.handleItemClick(item, index)}\r\n disabled={isDisabled}\r\n >\r\n {item.icon && <kritzel-icon name={item.icon} size={16}></kritzel-icon>}\r\n <span class=\"label\">{item.label}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: flex;\r\n flex-direction: column;\r\n width: 100%;\r\n}\r\n\r\n.expand-toggle {\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n font-size: 14px;\r\n line-height: 1;\r\n padding: 8px;\r\n color: var(--kritzel-color-palette-expand-toggle-color, #666666);\r\n}\r\n\r\n.expand-toggle:hover {\r\n color: var(--kritzel-color-palette-expand-toggle-hover-color, #333333);\r\n}","import { Component, Host, Prop, h, Event, EventEmitter, Watch, State } from '@stencil/core';\r\nimport { KritzelBrushTool } from '../../../classes/tools/brush-tool.class';\r\n\r\n@Component({\r\n tag: 'kritzel-control-brush-config',\r\n styleUrl: 'kritzel-control-brush-config.css',\r\n shadow: true,\r\n})\r\nexport class KritzelControlBrushConfig {\r\n @Prop({ mutable: true })\r\n tool: KritzelBrushTool;\r\n\r\n @Prop({ mutable: true })\r\n isExpanded: boolean = false;\r\n\r\n @Event()\r\n toolChange: EventEmitter<KritzelBrushTool>;\r\n\r\n @State()\r\n palette: string[] = [];\r\n\r\n @Watch('tool')\r\n handleToolChange(newTool: KritzelBrushTool) {\r\n this.palette = newTool.palettes[newTool.type];\r\n }\r\n\r\n componentWillLoad() {\r\n this.palette = this.tool.palettes[this.tool.type];\r\n }\r\n\r\n handleToggleExpand() {\r\n this.isExpanded = !this.isExpanded;\r\n }\r\n\r\n handleTypeChange(event: CustomEvent<'pen' | 'highlighter'>) {\r\n this.palette = this.tool.palettes[event.detail];\r\n this.tool.type = event.detail;\r\n this.tool.color = this.palette[0];\r\n this.toolChange.emit(this.tool);\r\n }\r\n\r\n handleColorChange(event: CustomEvent<string>) {\r\n this.tool.color = event.detail;\r\n this.toolChange.emit(this.tool);\r\n }\r\n\r\n handleSizeChange(event: CustomEvent<number>) {\r\n this.tool.size = event.detail;\r\n this.toolChange.emit(this.tool);\r\n }\r\n\r\n render() {\r\n return (\r\n <Host>\r\n <div\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n width: '100%',\r\n gap: '8px',\r\n }}\r\n >\r\n <kritzel-brush-style type={this.tool.type} onTypeChange={event => this.handleTypeChange(event)}></kritzel-brush-style>\r\n\r\n <button class=\"expand-toggle\" onClick={() => this.handleToggleExpand()} title={this.isExpanded ? 'Collapse' : 'Expand'} style={this.palette.length > 6 ? { visibillity: 'visible' } : { visibility: 'hidden' }}>\r\n <kritzel-icon name={this.isExpanded ? 'chevron-up' : 'chevron-down'}></kritzel-icon>\r\n </button>\r\n </div>\r\n\r\n <kritzel-color-palette\r\n colors={this.palette}\r\n selectedColor={this.tool.color}\r\n isExpanded={this.isExpanded}\r\n isOpaque={true}\r\n onColorChange={color => this.handleColorChange(color)}\r\n ></kritzel-color-palette>\r\n\r\n <kritzel-stroke-size selectedSize={this.tool.size} onSizeChange={event => this.handleSizeChange(event)}></kritzel-stroke-size>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: block;\r\n flex-direction: column;\r\n width: 100%;\r\n}\r\n\r\n.expand-toggle {\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n font-size: 14px;\r\n line-height: 1;\r\n padding: 8px;\r\n color: var(--kritzel-color-palette-expand-toggle-color, #666666);\r\n}\r\n\r\n.expand-toggle:hover {\r\n color: var(--kritzel-color-palette-expand-toggle-hover-color, #333333);\r\n}\r\n","import { Component, Host, Prop, h, Event, EventEmitter } from '@stencil/core';\r\nimport { KritzelTextTool } from '../../../classes/tools/text-tool.class';\r\n\r\n@Component({\r\n tag: 'kritzel-control-text-config',\r\n styleUrl: 'kritzel-control-text-config.css',\r\n shadow: true,\r\n})\r\nexport class KritzelControlTextConfig {\r\n @Prop({ mutable: true })\r\n tool: KritzelTextTool;\r\n\r\n @Prop({ mutable: true })\r\n isExpanded: boolean = false;\r\n\r\n @Event()\r\n toolChange: EventEmitter<KritzelTextTool>;\r\n\r\n handleToggleExpand() {\r\n this.isExpanded = !this.isExpanded;\r\n }\r\n\r\n handleFamilyChange(event: CustomEvent<string>) {\r\n this.tool.fontFamily = event.detail;\r\n this.toolChange.emit(this.tool);\r\n }\r\n\r\n handleColorChange(event: CustomEvent<string>) {\r\n this.tool.fontColor = event.detail;\r\n this.toolChange.emit(this.tool);\r\n }\r\n\r\n handleSizeChange(event: CustomEvent<number>) {\r\n this.tool.fontSize = event.detail;\r\n this.toolChange.emit(this.tool);\r\n }\r\n\r\n render() {\r\n return (\r\n <Host>\r\n <div\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'flex-start',\r\n width: '100%',\r\n gap: '8px',\r\n }}\r\n >\r\n <kritzel-font-family selectedFontFamily={this.tool.fontFamily} onFontFamilyChange={event => this.handleFamilyChange(event)}></kritzel-font-family>\r\n\r\n <button class=\"expand-toggle\" onClick={() => this.handleToggleExpand()} title={this.isExpanded ? 'Collapse' : 'Expand'}>\r\n <kritzel-icon name={this.isExpanded ? 'chevron-up' : 'chevron-down'}></kritzel-icon>\r\n </button>\r\n </div>\r\n\r\n <kritzel-color-palette\r\n colors={this.tool.palette}\r\n selectedColor={this.tool.fontColor}\r\n isExpanded={this.isExpanded}\r\n onColorChange={event => this.handleColorChange(event)}\r\n ></kritzel-color-palette>\r\n\r\n <kritzel-font-size selectedSize={this.tool.fontSize} fontFamily={this.tool.fontFamily} onSizeChange={event => this.handleSizeChange(event)}></kritzel-font-size>\r\n </Host>\r\n );\r\n }\r\n}\r\n","export class KritzelDevicesHelper {\r\n static isTouchDevice(): boolean {\r\n return window.matchMedia('(any-pointer: coarse)').matches;\r\n }\r\n}",":host {\r\n display: flex;\r\n flex-direction: column;\r\n user-select: none;\r\n}\r\n\r\n.kritzel-controls {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: flex-start;\r\n gap: var(--kritzel-controls-gap, 8px);\r\n height: 100%;\r\n padding: var(--kritzel-controls-padding, 8px);\r\n background-color: var(--kritzel-controls-background-color, #ffffff);\r\n border-radius: var(--kritzel-controls-border-radius, 16px);\r\n box-shadow: var(--kritzel-controls-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));\r\n border: var(--kritzel-controls-border, 1px solid #f0f0f0);\r\n z-index: 10000;\r\n position: relative;\r\n}\r\n\r\n.kritzel-control {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n color: var(--kritzel-controls-control-color, #000000);\r\n border-radius: var(--kritzel-controls-control-border-radius, 12px);\r\n padding: var(--kritzel-controls-control-padding, 8px);\r\n border: none;\r\n outline: none;\r\n background: none;\r\n cursor: pointer;\r\n -webkit-tap-highlight-color: transparent;\r\n font-weight: bold;\r\n}\r\n\r\n.kritzel-control:hover {\r\n background-color: var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%));\r\n}\r\n\r\n:host(.mobile) .kritzel-control:hover {\r\n background-color: unset;\r\n}\r\n\r\n.kritzel-control:active {\r\n background-color: var(--kritzel-controls-control-active-background-color, hsl(0, 0%, 0%, 8.6%));\r\n}\r\n\r\n:host(.mobile) .kritzel-control:active {\r\n background-color: unset;\r\n}\r\n\r\n.kritzel-control.selected,\r\n.kritzel-control.selected:hover,\r\n.kritzel-control.selected:active {\r\n background-color: var(--kritzel-controls-control-selected-background-color, #0E1111) !important;\r\n color: var(--kritzel-controls-control-selected-color, #ffffff) !important;\r\n}\r\n\r\n.kritzel-divider {\r\n width: var(--kritzel-controls-divider-width, 1px);\r\n height: var(--kritzel-controls-divider-height, 24px);\r\n background-color: var(--kritzel-controls-divider-background-color, hsl(0, 0%, 0%, 4.3%));\r\n}\r\n\r\n.kritzel-config-container {\r\n position: relative;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 40px;\r\n height: 40px;\r\n box-sizing: border-box;\r\n -webkit-tap-highlight-color: transparent;\r\n}\r\n\r\n.kritzel-config {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n cursor: pointer;\r\n}\r\n\r\n.color-container {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n border: 2px solid transparent;\r\n box-sizing: border-box;\r\n background-color: var(--kritzel-color-palette-hover-background-color, #f0f0f0);\r\n}\r\n\r\n.font-container {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n border: 2px solid transparent;\r\n box-sizing: border-box;\r\n background-color: var(--kritzel-color-palette-hover-background-color, #f0f0f0);\r\n}\r\n\r\n.no-config {\r\n height: 24px;\r\n width: 24px;\r\n border-radius: 50%;\r\n border: 1px dashed gray;\r\n}\r\n\r\nkritzel-tooltip {\r\n position: fixed;\r\n bottom: 66px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n z-index: 10001;\r\n}\r\n","import { Component, h, Prop, State, Element, Host, Listen, Event, EventEmitter, Method } from '@stencil/core';\r\nimport { KritzelBrushTool } from '../../../classes/tools/brush-tool.class';\r\nimport { KritzelTextTool } from '../../../classes/tools/text-tool.class';\r\nimport { KritzelToolbarControl } from '../../../interfaces/toolbar-control.interface';\r\nimport { KritzelBaseTool } from '../../../classes/tools/base-tool.class';\r\nimport { KritzelDevicesHelper } from '../../../helpers/devices.helper';\r\n\r\ntype ToolConfig = Record<string, any>;\r\n\r\n@Component({\r\n tag: 'kritzel-controls',\r\n styleUrl: 'kritzel-controls.css',\r\n shadow: true,\r\n assetsDirs: ['../assets'],\r\n})\r\nexport class KritzelControls {\r\n @Prop()\r\n controls: KritzelToolbarControl[] = [];\r\n\r\n @Prop({ mutable: true })\r\n activeControl: KritzelToolbarControl | null = null;\r\n\r\n @Prop()\r\n isUtilityPanelVisible: boolean = true;\r\n\r\n @Event()\r\n isControlsReady: EventEmitter<void>;\r\n\r\n @State()\r\n firstConfig: ToolConfig | null = null;\r\n\r\n @State()\r\n isTooltipVisible: boolean = false;\r\n\r\n @State()\r\n isTouchDevice: boolean = KritzelDevicesHelper.isTouchDevice();\r\n\r\n @Element()\r\n host!: HTMLElement;\r\n\r\n @Listen('activeToolChange', { target: 'document' })\r\n async handleActiveToolChange(event: CustomEvent) {\r\n this.activeControl = this.controls.find(control => control.tool === event.detail) || null;\r\n await this.kritzelEngine?.setFocus();\r\n }\r\n\r\n @Listen('click', { target: 'document' })\r\n handleClick(event: MouseEvent) {\r\n const element = event.target as HTMLElement;\r\n\r\n if (!this.kritzelEngine || element.closest('.kritzel-tooltip')) {\r\n return;\r\n }\r\n\r\n this.isTooltipVisible = false;\r\n this.kritzelEngine.enable();\r\n }\r\n\r\n @Method()\r\n async closeTooltip() {\r\n this.isTooltipVisible = false;\r\n this.kritzelEngine?.enable();\r\n }\r\n\r\n kritzelEngine: HTMLKritzelEngineElement | null = null;\r\n\r\n get activeToolAsTextTool() {\r\n return this.activeControl?.tool as KritzelTextTool;\r\n }\r\n\r\n get activeToolAsBrushTool() {\r\n return this.activeControl?.tool as KritzelBrushTool;\r\n }\r\n\r\n async componentWillLoad() {\r\n await this.initializeEngine();\r\n await this.initializeTools();\r\n this.isControlsReady.emit();\r\n }\r\n\r\n private async initializeEngine() {\r\n await customElements.whenDefined('kritzel-engine');\r\n this.kritzelEngine = this.host.parentElement.querySelector('kritzel-engine');\r\n\r\n if (!this.kritzelEngine) {\r\n throw new Error('kritzel-engine not found in parent element.');\r\n }\r\n }\r\n\r\n private async initializeTools() {\r\n for (const c of this.controls) {\r\n if (c.type === 'tool' && c.tool) {\r\n c.tool = await this.kritzelEngine.registerTool(c.name, c.tool, c.config);\r\n }\r\n\r\n if (c.type === 'tool' && c.isDefault && c.tool) {\r\n await this.kritzelEngine.changeActiveTool(c.tool as KritzelBaseTool);\r\n this.activeControl = c;\r\n }\r\n\r\n if (c.type === 'config') {\r\n if (this.firstConfig === null) {\r\n this.firstConfig = c;\r\n } else {\r\n console.warn('Only one config control is allowed. The first one will be used.');\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async handleControlClick(control: KritzelToolbarControl) {\r\n this.activeControl = control;\r\n\r\n if (this.activeControl.type === 'tool') {\r\n await this.kritzelEngine.changeActiveTool(this.activeControl.tool as KritzelBaseTool);\r\n }\r\n }\r\n\r\n private handleConfigClick(event: MouseEvent) {\r\n event.stopPropagation();\r\n this.isTooltipVisible = !this.isTooltipVisible;\r\n this.kritzelEngine.disable();\r\n }\r\n\r\n private async handleToolChange(event: CustomEvent) {\r\n this.activeControl = { ...this.activeControl, tool: event.detail };\r\n await this.kritzelEngine.changeActiveTool((this.activeControl as any).tool);\r\n }\r\n\r\n render() {\r\n const hasNoConfig = this.activeControl?.config === undefined || this.activeControl?.config === null;\r\n\r\n return (\r\n <Host\r\n class={{\r\n mobile: this.isTouchDevice,\r\n }}\r\n >\r\n {this.isUtilityPanelVisible && (\r\n <kritzel-utility-panel\r\n style={{\r\n position: 'absolute',\r\n bottom: '56px',\r\n left: '12px',\r\n }}\r\n onUndo={() => this.kritzelEngine?.undo()}\r\n onRedo={() => this.kritzelEngine?.redo()}\r\n onDelete={() => this.kritzelEngine?.delete()}\r\n ></kritzel-utility-panel>\r\n )}\r\n\r\n <div class=\"kritzel-controls\">\r\n {this.controls.map(control => {\r\n if (control.type === 'tool') {\r\n return (\r\n <button\r\n class={{\r\n 'kritzel-control': true,\r\n 'selected': this.activeControl?.name === control?.name,\r\n }}\r\n key={control.name}\r\n onClick={_event => this.handleControlClick?.(control)}\r\n >\r\n <kritzel-icon name={control.icon}></kritzel-icon>\r\n </button>\r\n );\r\n }\r\n\r\n if (control.type === 'divider') {\r\n return <div class=\"kritzel-divider\" key={control.name}></div>;\r\n }\r\n\r\n if (control.type === 'config' && control.name === this.firstConfig?.name && this.activeControl) {\r\n return (\r\n <div class=\"kritzel-config-container\" key={control.name}>\r\n <kritzel-tooltip isVisible={this.isTooltipVisible} anchorElement={this.host.shadowRoot?.querySelector('.kritzel-config-container') as HTMLElement}>\r\n <div style={{ width: '294px', height: '100%' }}>\r\n {this.activeControl.name === 'brush' && (\r\n <kritzel-control-brush-config tool={this.activeToolAsBrushTool} onToolChange={event => this.handleToolChange?.(event)}></kritzel-control-brush-config>\r\n )}\r\n\r\n {this.activeControl.name === 'text' && (\r\n <kritzel-control-text-config tool={this.activeToolAsTextTool} onToolChange={event => this.handleToolChange?.(event)}></kritzel-control-text-config>\r\n )}\r\n </div>\r\n </kritzel-tooltip>\r\n\r\n <div\r\n class=\"kritzel-config\"\r\n onClick={event => this.handleConfigClick?.(event)}\r\n style={{\r\n cursor: this.activeControl.config ? 'pointer' : 'default',\r\n pointerEvents: hasNoConfig ? 'none' : 'auto',\r\n }}\r\n >\r\n {this.activeControl.tool instanceof KritzelBrushTool && (\r\n <div class=\"color-container\">\r\n <kritzel-color\r\n value={this.activeToolAsBrushTool?.color}\r\n size={this.activeToolAsBrushTool?.size}\r\n style={{\r\n borderRadius: '50%',\r\n border: 'none',\r\n }}\r\n ></kritzel-color>\r\n </div>\r\n )}\r\n\r\n {this.activeControl.tool instanceof KritzelTextTool && (\r\n <div class=\"font-container\">\r\n <kritzel-font\r\n fontFamily={this.activeToolAsTextTool?.fontFamily}\r\n size={this.activeToolAsTextTool?.fontSize}\r\n color={this.activeToolAsTextTool?.fontColor}\r\n ></kritzel-font>\r\n </div>\r\n )}\r\n\r\n {hasNoConfig && <div class=\"no-config\"></div>}\r\n </div>\r\n </div>\r\n );\r\n }\r\n })}\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: block;\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100vw;\r\n height: 100vh;\r\n pointer-events: none;\r\n z-index: 9000;\r\n}\r\n","import { Component, Host, Listen, Prop, State, h } from '@stencil/core';\r\nimport { KritzelMouseButton } from '../../../enums/event-button.enum';\r\nimport { KritzelStore } from '../../../classes/store.class';\r\n\r\n@Component({\r\n tag: 'kritzel-cursor-trail',\r\n styleUrl: 'kritzel-cursor-trail.css',\r\n shadow: true,\r\n})\r\nexport class KritzelCursorTrail {\r\n @Prop()\r\n store: KritzelStore;\r\n\r\n @State()\r\n cursorTrailPoints: Array<{ x: number; y: number; timestamp: number }> = [];\r\n\r\n @State()\r\n isLeftButtonDown: boolean = false;\r\n\r\n private trailCleanupIntervalId: number;\r\n\r\n private readonly TRAIL_DURATION_MS = 100;\r\n\r\n private readonly MAX_TRAIL_POINTS = 50;\r\n\r\n componentDidLoad() {\r\n this.trailCleanupIntervalId = window.setInterval(() => {\r\n const now = Date.now();\r\n const newTrailPoints = this.cursorTrailPoints.filter(p => now - p.timestamp < this.TRAIL_DURATION_MS);\r\n if (newTrailPoints.length !== this.cursorTrailPoints.length) {\r\n this.cursorTrailPoints = newTrailPoints;\r\n }\r\n }, 50);\r\n }\r\n\r\n disconnectedCallback() {\r\n if (this.trailCleanupIntervalId) {\r\n window.clearInterval(this.trailCleanupIntervalId);\r\n }\r\n }\r\n\r\n @Listen('pointerdown', { target: 'window', passive: true })\r\n handleMouseDown(ev: PointerEvent) {\r\n if (ev.pointerType === 'mouse') {\r\n if (ev.button === KritzelMouseButton.Left) {\r\n this.isLeftButtonDown = true;\r\n this.cursorTrailPoints = [];\r\n }\r\n }\r\n\r\n if (ev.pointerType === 'touch') {\r\n if (this.store.state.pointers.size === 1) {\r\n this.isLeftButtonDown = true;\r\n this.cursorTrailPoints = [];\r\n }\r\n }\r\n }\r\n\r\n @Listen('pointermove', { target: 'window', passive: true })\r\n handlePointerMove(ev: PointerEvent) {\r\n if (!this.isLeftButtonDown) {\r\n return;\r\n }\r\n const newPoint = { x: ev.clientX, y: ev.clientY, timestamp: Date.now() };\r\n const updatedTrail = [newPoint, ...this.cursorTrailPoints];\r\n if (updatedTrail.length > this.MAX_TRAIL_POINTS) {\r\n this.cursorTrailPoints = updatedTrail.slice(0, this.MAX_TRAIL_POINTS);\r\n } else {\r\n this.cursorTrailPoints = updatedTrail;\r\n }\r\n }\r\n\r\n @Listen('pointerup', { target: 'window', passive: true })\r\n handlePointerUp(ev: PointerEvent) {\r\n if (ev.pointerType === 'mouse') {\r\n if(ev.button === KritzelMouseButton.Left){\r\n this.isLeftButtonDown = false;\r\n this.cursorTrailPoints = [];\r\n }\r\n }\r\n\r\n if (ev.pointerType === 'touch') {\r\n if(this.store.state.pointers.size === 0){\r\n this.isLeftButtonDown = false;\r\n this.cursorTrailPoints = [];\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <Host>\r\n {this.cursorTrailPoints.length > 1 && (\r\n <svg\r\n class=\"cursor-trail-svg\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n style={{\r\n position: 'absolute',\r\n left: '0',\r\n top: '0',\r\n width: '100%',\r\n height: '100%',\r\n pointerEvents: 'none',\r\n opacity: 'var(--kritzel-cursor-trail-opacity, 0.6)',\r\n zIndex: '9000',\r\n }}\r\n >\r\n {this.cursorTrailPoints.slice(1).map((point, index) => {\r\n const prevPoint = this.cursorTrailPoints[index];\r\n const now = Date.now();\r\n const age = now - point.timestamp;\r\n const progress = Math.max(0, Math.min(1, age / this.TRAIL_DURATION_MS));\r\n\r\n if (progress >= 1) return null;\r\n\r\n const baseStrokeWidth = Math.max(2, 15 * (1 - progress));\r\n\r\n return (\r\n <line\r\n key={`trail-segment-${point.timestamp}`}\r\n x1={prevPoint.x.toString()}\r\n y1={prevPoint.y.toString()}\r\n x2={point.x.toString()}\r\n y2={point.y.toString()}\r\n stroke=\"var(--kritzel-cursor-trail-color, rgb(228, 228, 228))\"\r\n stroke-width={baseStrokeWidth.toString()}\r\n stroke-linecap=\"round\"\r\n />\r\n );\r\n })}\r\n </svg>\r\n )}\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: inline-flex; /* Ensures the host shrinks/grows with the wrapper */\r\n vertical-align: middle; /* Aligns with other inline-block or inline-flex elements */\r\n width: 100%; /* Ensures the host takes full width of the parent */\r\n}\r\n\r\n.dropdown-wrapper {\r\n display: flex;\r\n align-items: center;\r\n border: 1px solid #333333;\r\n border-radius: var(--kritzel-controls-control-border-radius, 12px);\r\n overflow: hidden;\r\n height: 32px;\r\n width: 100%;\r\n}\r\n\r\n.custom-select {\r\n padding: 0 8px;\r\n padding-right: 30px; \r\n height: 100%;\r\n width: 100%;\r\n box-sizing: border-box;\r\n border-radius: 0; \r\n border: none; \r\n background-color: #fff;\r\n cursor: pointer;\r\n outline: none;\r\n font-size: inherit;\r\n color: var(--kritzel-controls-text-color, #333333); /* Use CSS var with fallback */\r\n -webkit-tap-highlight-color: transparent;\r\n\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n appearance: none;\r\n\r\n background-image: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"%23333333\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"/></svg>');\r\n background-size: 16px 16px;\r\n background-repeat: no-repeat;\r\n background-position: right 8px center; \r\n}\r\n\r\n.custom-select.has-suffix-border {\r\n border-right: 1px solid #333333; \r\n}\r\n\r\n.custom-select.has-prefix-border {\r\n border-left: 1px solid #333333; \r\n}\r\n\r\n::slotted(*) {\r\n height: 100%; \r\n box-sizing: border-box;\r\n}\r\n","import { Component, Host, h, Prop, State, Event, EventEmitter, Watch } from '@stencil/core';\r\n\r\nexport interface DropdownOption {\r\n value: string;\r\n label: string;\r\n style?: any; // For individual option styling, e.g., font family\r\n}\r\n\r\n@Component({\r\n tag: 'kritzel-dropdown',\r\n styleUrl: 'kritzel-dropdown.css',\r\n shadow: true,\r\n})\r\nexport class KritzelDropdown {\r\n @Prop() \r\n options: DropdownOption[] = [];\r\n \r\n @Prop() \r\n value: string;\r\n \r\n @Prop() \r\n width?: string;\r\n \r\n @Prop() \r\n selectStyles?: any = {}; \r\n\r\n @State() \r\n internalValue: string;\r\n\r\n @State() \r\n hasSuffixContent: boolean = false;\r\n\r\n @State()\r\n hasPrefixContent: boolean = false;\r\n\r\n @Event() \r\n valueChanged: EventEmitter<string>;\r\n\r\n private suffixSlotElement?: HTMLSlotElement;\r\n private prefixSlotElement?: HTMLSlotElement;\r\n\r\n componentWillLoad() {\r\n this.updateInternalValue(this.value, false);\r\n this.evaluateSuffixContent();\r\n this.evaluatePrefixContent();\r\n }\r\n\r\n @Watch('value')\r\n externalValueChanged(newValue: string) {\r\n if (newValue !== this.internalValue) {\r\n this.updateInternalValue(newValue, false);\r\n }\r\n }\r\n \r\n @Watch('options')\r\n optionsChanged() {\r\n this.updateInternalValue(this.internalValue, true);\r\n }\r\n\r\n private updateInternalValue(proposedValue: string, emitChange: boolean) {\r\n let finalValue = proposedValue;\r\n if (this.options && this.options.length > 0) {\r\n const isValidValue = this.options.some(opt => opt.value === finalValue);\r\n if (!finalValue || !isValidValue) {\r\n finalValue = this.options[0].value;\r\n }\r\n } else {\r\n finalValue = undefined;\r\n }\r\n\r\n if (this.internalValue !== finalValue) {\r\n this.internalValue = finalValue;\r\n if (emitChange || (proposedValue !== finalValue && proposedValue !== undefined)) {\r\n this.valueChanged.emit(this.internalValue);\r\n }\r\n }\r\n }\r\n\r\n private handleSelectChange = (event: Event) => {\r\n const newValue = (event.target as HTMLSelectElement).value;\r\n if (this.internalValue !== newValue) {\r\n this.internalValue = newValue;\r\n this.valueChanged.emit(this.internalValue);\r\n }\r\n };\r\n\r\n private evaluateSuffixContent = () => {\r\n if (this.suffixSlotElement) {\r\n const newHasContent = this.suffixSlotElement.assignedNodes({ flatten: true }).length > 0;\r\n if (this.hasSuffixContent !== newHasContent) {\r\n this.hasSuffixContent = newHasContent;\r\n }\r\n } else {\r\n if (this.hasSuffixContent !== false) {\r\n this.hasSuffixContent = false;\r\n }\r\n }\r\n }\r\n\r\n private evaluatePrefixContent = () => {\r\n if (this.prefixSlotElement) {\r\n const newHasContent = this.prefixSlotElement.assignedNodes({ flatten: true }).length > 0;\r\n if (this.hasPrefixContent !== newHasContent) {\r\n this.hasPrefixContent = newHasContent;\r\n }\r\n } else {\r\n if (this.hasPrefixContent !== false) {\r\n this.hasPrefixContent = false;\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const selectClasses = {\r\n 'custom-select': true,\r\n 'has-suffix-border': this.hasSuffixContent,\r\n 'has-prefix-border': this.hasPrefixContent,\r\n };\r\n\r\n return (\r\n <Host>\r\n <div class=\"dropdown-wrapper\">\r\n <slot\r\n name=\"prefix\"\r\n ref={el => this.prefixSlotElement = el as HTMLSlotElement}\r\n onSlotchange={this.evaluatePrefixContent}\r\n ></slot>\r\n <select\r\n class={selectClasses}\r\n style={{ ...this.selectStyles, width: this.width }}\r\n onInput={this.handleSelectChange}\r\n >\r\n {this.options.map(option => (\r\n <option\r\n value={option.value}\r\n style={option.style}\r\n selected={option.value === this.internalValue}\r\n >\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n <slot \r\n name=\"suffix\"\r\n ref={el => this.suffixSlotElement = el as HTMLSlotElement}\r\n onSlotchange={this.evaluateSuffixContent}\r\n ></slot>\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n","export class KritzelIconRegistry {\r\n private static registry = new Map<string, string>();\r\n\r\n public static register(name: string, svgContent: string): void {\r\n if (this.registry.has(name)) {\r\n console.warn(`[IconRegistry] Icon \"${name}\" is already registered. It will be overwritten.`);\r\n }\r\n this.registry.set(name, svgContent);\r\n }\r\n\r\n public static get(name: string): string | undefined {\r\n return this.registry.get(name);\r\n }\r\n\r\n public static registerIcons(icons: { [key: string]: string }): void {\r\n for (const name in icons) {\r\n if (Object.prototype.hasOwnProperty.call(icons, name)) {\r\n this.register(name, icons[name]);\r\n }\r\n }\r\n }\r\n\r\n public static has(name: string): boolean {\r\n return this.registry.has(name);\r\n }\r\n}\r\n\r\nKritzelIconRegistry.registerIcons({\r\n 'cursor': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z\"/></svg>',\r\n 'pen': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\"/></svg>',\r\n 'highlighter': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-highlighter-icon lucide-highlighter\"><path d=\"m9 11-6 6v3h9l3-3\"/><path d=\"m22 12-4.6 4.6a2 2 0 0 1-2.8 0l-5.2-5.2a2 2 0 0 1 0-2.8L14 4\"/></svg>',\r\n 'eraser': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 21-4.3-4.3c-1-1-1-2.5 0-3.4l9.6-9.6c1-1 2.5-1 3.4 0l5.6 5.6c1 1 1 2.5 0 3.4L13 21\"/><path d=\"M22 21H7\"/><path d=\"m5 11 9 9\"/></svg>',\r\n 'type': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 7 4 4 20 4 20 7\"/><line x1=\"9\" x2=\"15\" y1=\"20\" y2=\"20\"/><line x1=\"12\" x2=\"12\" y1=\"4\" y2=\"20\"/></svg>',\r\n 'image': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>',\r\n 'chevron-down': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>',\r\n 'chevron-up': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m18 15-6-6-6 6\"/></svg>',\r\n 'copy': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-copy-icon lucide-copy\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>',\r\n 'paste': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-clipboard-paste-icon lucide-clipboard-paste\"><path d=\"M11 14h10\"/><path d=\"M16 4h2a2 2 0 0 1 2 2v1.344\"/><path d=\"m17 18 4-4-4-4\"/><path d=\"M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 1.793-1.113\"/><rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\"/></svg>',\r\n 'cut': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-scissors-icon lucide-scissors\"><circle cx=\"6\" cy=\"6\" r=\"3\"/><path d=\"M8.12 8.12 12 12\"/><path d=\"M20 4 8.12 15.88\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><path d=\"M14.8 14.8 20 20\"/></svg>',\r\n 'delete': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-trash2-icon lucide-trash-2\"><path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/><line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\"/><line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\"/></svg>',\r\n 'bring-to-front': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-arrow-up-to-line-icon lucide-arrow-up-to-line\"><path d=\"M5 3h14\"/><path d=\"m18 13-6-6-6 6\"/><path d=\"M12 7v14\"/></svg>',\r\n 'send-to-back': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-arrow-down-to-line-icon lucide-arrow-down-to-line\"><path d=\"M12 17V3\"/><path d=\"m6 11 6 6 6-6\"/><path d=\"M19 21H5\"/></svg>',\r\n 'select-all': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-square-mouse-pointer-icon lucide-square-mouse-pointer\"><path d=\"M12.034 12.681a.498.498 0 0 1 .647-.647l9 3.5a.5.5 0 0 1-.033.943l-3.444 1.068a1 1 0 0 0-.66.66l-1.067 3.443a.5.5 0 0 1-.943.033z\"/><path d=\"M21 11V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h6\"/></svg>',\r\n 'download': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-download-icon lucide-download\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\"/></svg>',\r\n 'undo': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-undo-icon lucide-undo\"><path d=\"M3 7v6h6\"/><path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\"/></svg>',\r\n 'redo': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-redo-icon lucide-redo\"><path d=\"M21 7v6h-6\"/><path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3l3 2.7\"/></svg>'\r\n});","export const ABSOLUTE_SCALE_MAX = 1000;\r\nexport const ABSOLUTE_SCALE_MIN = 0.0001;","kritzel-editor{\r\n display: flex;\r\n margin: 0;\r\n position: relative;\r\n overflow: hidden;\r\n width: 100%;\r\n height: 100%;\r\n align-items: center;\r\n justify-content: center;\r\n touch-action: manipulation;\r\n user-select: none;\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n -khtml-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none; \r\n}\r\n\r\n\r\nkritzel-controls {\r\n position: absolute;\r\n bottom: 28px;\r\n}","import { Component, Host, Listen, Prop, Element, h, Method, Event, State, EventEmitter, Watch } from '@stencil/core';\r\nimport { KritzelIconRegistry } from '../../../classes/registries/icon-registry.class';\r\nimport { KritzelToolbarControl } from '../../../interfaces/toolbar-control.interface';\r\nimport { KritzelBaseObject } from '../../../classes/objects/base-object.class';\r\nimport { KritzelSelectionTool } from '../../../classes/tools/selection-tool.class';\r\nimport { KritzelEraserTool } from '../../../classes/tools/eraser-tool.class';\r\nimport { KritzelImageTool } from '../../../classes/tools/image-tool.class';\r\nimport { KritzelBrushTool } from '../../../classes/tools/brush-tool.class';\r\nimport { KritzelTextTool } from '../../../classes/tools/text-tool.class';\r\nimport { ContextMenuItem } from '../../../interfaces/context-menu-item.interface';\r\nimport { DEFAULT_BRUSH_CONFIG } from '../../../configs/default-brush-tool.config';\r\nimport { DEFAULT_TEXT_CONFIG } from '../../../configs/default-text-tool.config';\r\nimport { ABSOLUTE_SCALE_MAX, ABSOLUTE_SCALE_MIN } from '../../../constants/engine.constants';\r\n\r\n@Component({\r\n tag: 'kritzel-editor',\r\n styleUrl: 'kritzel-editor.css',\r\n shadow: false,\r\n})\r\nexport class KritzelEditor {\r\n @Prop()\r\n scaleMax: number = ABSOLUTE_SCALE_MAX;\r\n\r\n @Prop()\r\n scaleMin: number = ABSOLUTE_SCALE_MIN;\r\n\r\n @Prop()\r\n controls: KritzelToolbarControl[] = [\r\n {\r\n name: 'selection',\r\n type: 'tool',\r\n tool: KritzelSelectionTool,\r\n icon: 'cursor',\r\n },\r\n {\r\n name: 'brush',\r\n type: 'tool',\r\n tool: KritzelBrushTool,\r\n isDefault: true,\r\n icon: 'pen',\r\n config: DEFAULT_BRUSH_CONFIG,\r\n },\r\n {\r\n name: 'eraser',\r\n type: 'tool',\r\n tool: KritzelEraserTool,\r\n icon: 'eraser',\r\n },\r\n {\r\n name: 'text',\r\n type: 'tool',\r\n tool: KritzelTextTool,\r\n icon: 'type',\r\n config: DEFAULT_TEXT_CONFIG,\r\n },\r\n {\r\n name: 'image',\r\n type: 'tool',\r\n tool: KritzelImageTool,\r\n icon: 'image',\r\n },\r\n {\r\n name: 'divider',\r\n type: 'divider',\r\n },\r\n {\r\n name: 'config',\r\n type: 'config',\r\n },\r\n ];\r\n\r\n @Prop()\r\n globalContextMenuItems: ContextMenuItem[] = [\r\n {\r\n label: 'Paste',\r\n icon: 'paste',\r\n disabled: async () => (await this.engineRef.getCopiedObjects()).length === 0,\r\n action: menu => this.engineRef.paste(menu.x, menu.y),\r\n },\r\n { label: 'Select All', icon: 'select-all', action: () => this.selectAllObjectsInViewport() },\r\n ];\r\n\r\n @Prop()\r\n objectContextMenuItems: ContextMenuItem[] = [\r\n {\r\n label: 'Edit',\r\n icon: 'pen',\r\n visible: (_, objects) => objects.length === 1 && objects[0].isEditable,\r\n action: (_, objects) => {\r\n if (objects.length === 1) {\r\n const object = objects[0];\r\n if (object.isEditable) {\r\n object.edit();\r\n }\r\n }\r\n }\r\n },\r\n { label: 'Copy', icon: 'copy', action: () => this.engineRef.copy() },\r\n {\r\n label: 'Paste',\r\n icon: 'paste',\r\n disabled: async () => (await this.engineRef.getCopiedObjects()).length === 0,\r\n action: menu => this.engineRef.paste(menu.x, menu.y),\r\n },\r\n { label: 'Delete', icon: 'delete', action: () => this.engineRef.delete() },\r\n { label: 'Bring to Front', icon: 'bring-to-front', action: () => this.engineRef.moveToTop() },\r\n { label: 'Send to Back', icon: 'send-to-back', action: () => this.engineRef.moveToBottom() },\r\n ];\r\n\r\n @Prop()\r\n customSvgIcons: Record<string, string> = {};\r\n\r\n @Prop()\r\n isControlsVisible: boolean = true;\r\n\r\n @Prop()\r\n isUtilityPanelVisible: boolean = true;\r\n\r\n @Event()\r\n isReady: EventEmitter<HTMLElement>;\r\n\r\n @Element()\r\n host!: HTMLElement;\r\n\r\n @State()\r\n isEngineReady: boolean = false;\r\n\r\n @State()\r\n isControlsReady: boolean = false;\r\n\r\n @Watch('isEngineReady')\r\n onIsEngineReady(newValue: boolean) {\r\n if (newValue && this.isControlsReady) {\r\n this.checkIsReady();\r\n }\r\n }\r\n\r\n @Watch('isControlsReady')\r\n onIsControlsReady(newValue: boolean) {\r\n if (newValue && this.isEngineReady) {\r\n this.checkIsReady();\r\n }\r\n }\r\n\r\n @Method()\r\n async getObjectById<T extends KritzelBaseObject>(id: string): Promise<T | null> {\r\n return this.engineRef.getObjectById(id);\r\n }\r\n\r\n @Method()\r\n async addObject<T extends KritzelBaseObject>(object: T): Promise<T | null> {\r\n return this.engineRef.addObject(object);\r\n }\r\n\r\n @Method()\r\n async updateObject<T extends KritzelBaseObject>(object: T, updatedProperties: Partial<T>): Promise<T | null> {\r\n return this.engineRef.updateObject(object, updatedProperties);\r\n }\r\n\r\n @Method()\r\n async removeObject<T extends KritzelBaseObject>(object: T): Promise<T | null> {\r\n return this.engineRef.removeObject(object);\r\n }\r\n\r\n @Method()\r\n async getSelectedObjects(): Promise<KritzelBaseObject[]> {\r\n return this.engineRef.getSelectedObjects();\r\n }\r\n\r\n @Method()\r\n async selectObjects(objects: KritzelBaseObject[]) {\r\n return this.engineRef.selectObjects(objects);\r\n }\r\n\r\n @Method()\r\n async selectAllObjectsInViewport() {\r\n return this.engineRef.selectAllObjectsInViewport();\r\n }\r\n\r\n @Method()\r\n async clearSelection() {\r\n this.engineRef.clearSelection();\r\n }\r\n\r\n @Method()\r\n async centerObjectInViewport(object: KritzelBaseObject) {\r\n return this.engineRef.centerObjectInViewport(object);\r\n }\r\n\r\n @Listen('dblclick', { passive: false })\r\n handleTouchStart(event: MouseEvent) {\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n @Listen('keydown', { target: 'window' })\r\n handleKeyDown(event) {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.controlsRef?.closeTooltip();\r\n }\r\n }\r\n\r\n engineRef!: HTMLKritzelEngineElement;\r\n\r\n controlsRef!: HTMLKritzelControlsElement;\r\n\r\n componentDidLoad() {\r\n this.registerCustomSvgIcons();\r\n }\r\n\r\n async checkIsReady() {\r\n await customElements.whenDefined('kritzel-editor');\r\n await customElements.whenDefined('kritzel-controls');\r\n await customElements.whenDefined('kritzel-engine');\r\n\r\n if (!this.isEngineReady || !this.isControlsReady) {\r\n return;\r\n }\r\n\r\n this.isReady.emit(this.host);\r\n }\r\n\r\n private registerCustomSvgIcons() {\r\n for (const [name, svg] of Object.entries(this.customSvgIcons)) {\r\n KritzelIconRegistry.register(name, svg);\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <Host>\r\n <kritzel-engine\r\n ref={el => (this.engineRef = el)}\r\n onIsEngineReady={() => (this.isEngineReady = true)}\r\n scaleMax={this.scaleMax}\r\n scaleMin={this.scaleMin}\r\n globalContextMenuItems={this.globalContextMenuItems}\r\n objectContextMenuItems={this.objectContextMenuItems}\r\n ></kritzel-engine>\r\n\r\n <kritzel-controls\r\n ref={el => (this.controlsRef = el)}\r\n controls={this.controls}\r\n isUtilityPanelVisible={this.isUtilityPanelVisible}\r\n style={this.isControlsVisible ? { display: 'flex' } : { display: 'none' }}\r\n onIsControlsReady={() => (this.isControlsReady = true)}\r\n ></kritzel-controls>\r\n </Host>\r\n );\r\n }\r\n}\r\n","import { KritzelMouseButton } from '../enums/event-button.enum';\r\nimport { KritzelEventHelper } from '../helpers/event.helper';\r\nimport { KritzelStore } from './store.class';\r\n\r\nexport class KritzelViewport {\r\n private readonly _store: KritzelStore;\r\n\r\n initialTouchDistance: number = 0;\r\n startX: number = 0;\r\n startY: number = 0;\r\n\r\n constructor(store: KritzelStore, host: HTMLElement) {\r\n this._store = store;\r\n this._store.state.host = host;\r\n this._store.state.viewportWidth = host.clientWidth;\r\n this._store.state.viewportHeight = host.clientHeight;\r\n this._store.state.startX = 0;\r\n this._store.state.startY = 0;\r\n this._store.state.translateX = 0;\r\n this._store.state.translateY = 0;\r\n }\r\n\r\n handleResize(): void {\r\n this._store.state.viewportWidth = this._store.state.host.clientWidth;\r\n this._store.state.viewportHeight = this._store.state.host.clientHeight;\r\n this._store.state.hasViewportChanged = true;\r\n this._store.rerender();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const adjustedClientX = event.clientX - this._store.offsetX;\r\n const adjustedClientY = event.clientY - this._store.offsetY;\r\n\r\n if (event.button === KritzelMouseButton.Right) {\r\n this._store.state.isPanning = true;\r\n this._store.state.startX = adjustedClientX;\r\n this._store.state.startY = adjustedClientY;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n this._store.state.currentPath = null;\r\n this._store.state.isScaling = true;\r\n\r\n const firstTouchX = activePointers[0].clientX - this._store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._store.offsetY;\r\n\r\n this.initialTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n this.startX = (firstTouchX + secondTouchX) / 2;\r\n this.startY = (firstTouchY + secondTouchY) / 2;\r\n this._store.rerender();\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const adjustedClientX = event.clientX - this._store.offsetX;\r\n const adjustedClientY = event.clientY - this._store.offsetY;\r\n\r\n this._store.state.cursorX = adjustedClientX;\r\n this._store.state.cursorY = adjustedClientY;\r\n\r\n if (this._store.state.isPanning) {\r\n this._store.state.translateX -= this._store.state.startX - adjustedClientX;\r\n this._store.state.translateY -= this._store.state.startY - adjustedClientY;\r\n this._store.state.startX = adjustedClientX;\r\n this._store.state.startY = adjustedClientY;\r\n this._store.state.hasViewportChanged = true;\r\n this._store.state.skipContextMenu = true;\r\n this._store.rerender();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n const firstTouchX = activePointers[0].clientX - this._store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._store.offsetY;\r\n\r\n const currentTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n const midpointX = (firstTouchX + secondTouchX) / 2;\r\n const midpointY = (firstTouchY + secondTouchY) / 2;\r\n\r\n const scaleRatio = currentTouchDistance / this.initialTouchDistance!;\r\n const newScale = this._store.state.scale * scaleRatio;\r\n\r\n if (newScale > this._store.state.scaleMax || newScale < this._store.state.scaleMin) {\r\n this._store.state.translateX += midpointX - this.startX;\r\n this._store.state.translateY += midpointY - this.startY;\r\n } else {\r\n const translateXAdjustment = (midpointX - this._store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (midpointY - this._store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._store.state.translateX += midpointX - this.startX - translateXAdjustment;\r\n this._store.state.translateY += midpointY - this.startY - translateYAdjustment;\r\n this._store.state.scale = newScale;\r\n\r\n this.initialTouchDistance = currentTouchDistance;\r\n }\r\n\r\n this.startX = midpointX;\r\n this.startY = midpointY;\r\n\r\n this._store.state.hasViewportChanged = true;\r\n\r\n this._store.rerender();\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (this._store.state.isPanning) {\r\n this._store.state.isPanning = false;\r\n this._store.rerender();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n this._store.state.isScaling = false;\r\n this._store.rerender();\r\n }\r\n }\r\n\r\n handleWheel(event: WheelEvent): void {\r\n event.preventDefault();\r\n\r\n if (event.ctrlKey === true && KritzelEventHelper.isMainMouseWheel(event)) {\r\n this.handleZoom(event);\r\n }\r\n\r\n if (!event.ctrlKey) {\r\n this.handlePan(event);\r\n }\r\n }\r\n\r\n private handleZoom(event: WheelEvent): void {\r\n const rect = this._store.state.host.getBoundingClientRect();\r\n this._store.state.cursorX = event.clientX - rect.left;\r\n this._store.state.cursorY = event.clientY - rect.top;\r\n\r\n const delta = event.deltaY > 0 ? -this._store.state.scaleStep * this._store.state.scale : this._store.state.scaleStep * this._store.state.scale;\r\n const newScale = Math.min(this._store.state.scaleMax, Math.max(this._store.state.scaleMin, this._store.state.scale + delta));\r\n\r\n const scaleRatio = newScale / this._store.state.scale;\r\n const translateXAdjustment = (this._store.state.cursorX - this._store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (this._store.state.cursorY - this._store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._store.state.scale = newScale;\r\n\r\n this._store.state.translateX -= translateXAdjustment;\r\n this._store.state.translateY -= translateYAdjustment;\r\n\r\n this._store.state.hasViewportChanged = true;\r\n this._store.rerender();\r\n }\r\n\r\n private handlePan(event: WheelEvent): void {\r\n const panSpeed = 0.8;\r\n\r\n this._store.state.translateX -= event.deltaX * panSpeed;\r\n this._store.state.translateY -= event.deltaY * panSpeed;\r\n\r\n this._store.state.hasViewportChanged = true;\r\n this._store.rerender();\r\n }\r\n}","import { KritzelBaseCommand } from './base.command';\r\n\r\nexport class UpdateViewportCommand extends KritzelBaseCommand {\r\n\r\n currentViewport: {\r\n scale: number;\r\n translateX: number;\r\n translateY: number;\r\n };\r\n\r\n previousViewport: {\r\n scale: number;\r\n translateX: number;\r\n translateY: number;\r\n };\r\n\r\n constructor(store, initiator: any, previousViewport: {\r\n scale: number;\r\n translateX: number;\r\n translateY: number;\r\n }) {\r\n super(store, initiator);\r\n this.previousViewport = previousViewport\r\n this.currentViewport = {\r\n scale: this._store.state.scale,\r\n translateX: this._store.state.translateX,\r\n translateY: this._store.state.translateY,\r\n };\r\n }\r\n\r\n execute(): void {\r\n this._store.state.scale = this.currentViewport.scale;\r\n this._store.state.translateX = this.currentViewport.translateX;\r\n this._store.state.translateY = this.currentViewport.translateY; \r\n }\r\n\r\n undo(): void {\r\n this._store.state.scale = this.previousViewport.scale;\r\n this._store.state.translateX = this.previousViewport.translateX;\r\n this._store.state.translateY = this.previousViewport.translateY;\r\n }\r\n}\r\n","export class KritzelCircularBuffer<T> {\r\n private buffer: (T | null)[];\r\n private capacity: number;\r\n private head: number = 0;\r\n private tail: number = 0;\r\n private size: number = 0;\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity;\r\n this.buffer = new Array(capacity).fill(null);\r\n }\r\n\r\n add(item: T): void {\r\n this.buffer[this.head] = item;\r\n this.head = (this.head + 1) % this.capacity;\r\n\r\n if (this.size < this.capacity) {\r\n this.size++;\r\n } else {\r\n this.tail = (this.tail + 1) % this.capacity;\r\n }\r\n }\r\n\r\n pop(): T | null {\r\n if (this.size === 0) {\r\n return null;\r\n }\r\n\r\n this.head = (this.head - 1 + this.capacity) % this.capacity;\r\n const item = this.buffer[this.head];\r\n this.buffer[this.head] = null;\r\n this.size--;\r\n return item;\r\n }\r\n\r\n peek(): T | null {\r\n if (this.size === 0) {\r\n return null;\r\n }\r\n\r\n const lastIndex = (this.head - 1 + this.capacity) % this.capacity;\r\n return this.buffer[lastIndex];\r\n }\r\n\r\n isEmpty(): boolean {\r\n return this.size === 0;\r\n }\r\n\r\n clear(): void {\r\n this.buffer.fill(null);\r\n this.head = 0;\r\n this.tail = 0;\r\n this.size = 0;\r\n }\r\n}\r\n","import { KritzelBaseCommand } from './commands/base.command';\r\nimport { UpdateViewportCommand } from './commands/update-viewport.command';\r\nimport { KritzelStore } from './store.class';\r\nimport { KritzelCircularBuffer } from './structures/circular-buffer.structure';\r\n\r\nexport class KritzelHistory {\r\n private readonly _store: KritzelStore;\r\n\r\n undoStack: KritzelCircularBuffer<KritzelBaseCommand>;\r\n redoStack: KritzelCircularBuffer<KritzelBaseCommand>;\r\n\r\n previousViewport: {\r\n scale: number;\r\n scaleStep: number;\r\n translateX: number;\r\n translateY: number;\r\n };\r\n\r\n constructor(store: KritzelStore) {\r\n this._store = store;\r\n this.undoStack = new KritzelCircularBuffer<KritzelBaseCommand>(this._store.state.historyBufferSize);\r\n this.redoStack = new KritzelCircularBuffer<KritzelBaseCommand>(this._store.state.historyBufferSize);\r\n this.previousViewport = {\r\n scale: this._store.state.scale,\r\n scaleStep: this._store.state.scaleStep,\r\n translateX: this._store.state.translateX,\r\n translateY: this._store.state.translateY,\r\n };\r\n }\r\n\r\n executeCommand(command: KritzelBaseCommand) {\r\n if (this._store.state.hasViewportChanged) {\r\n const command = new UpdateViewportCommand(this._store, this, this.previousViewport);\r\n command.execute();\r\n this.undoStack.add(command);\r\n\r\n if (this.redoStack.isEmpty() === false) {\r\n this.redoStack.clear();\r\n }\r\n\r\n this._store.state.hasViewportChanged = false;\r\n this.previousViewport = {\r\n scale: this._store.state.scale,\r\n scaleStep: this._store.state.scaleStep,\r\n translateX: this._store.state.translateX,\r\n translateY: this._store.state.translateY,\r\n };\r\n }\r\n\r\n command.execute();\r\n if (this._store.state.debugInfo.logCommands) console.info('add', command);\r\n this.undoStack.add(command);\r\n\r\n if (this.redoStack.isEmpty() === false) {\r\n this.redoStack.clear();\r\n }\r\n\r\n this._store.rerender();\r\n }\r\n\r\n undo() {\r\n if (this._store.state.hasViewportChanged) {\r\n const command = new UpdateViewportCommand(this._store, this, this.previousViewport);\r\n command.undo();\r\n this._store.state.hasViewportChanged = false;\r\n this._store.rerender();\r\n return;\r\n }\r\n\r\n const command = this.undoStack.pop();\r\n if (command) {\r\n command.undo();\r\n if (this._store.state.debugInfo.logCommands) console.info('undo', command);\r\n this.redoStack.add(command);\r\n }\r\n\r\n this._store.rerender();\r\n }\r\n\r\n redo() {\r\n const command = this.redoStack.pop();\r\n if (command) {\r\n command.execute();\r\n if (this._store.state.debugInfo.logCommands) console.info('redo', command);\r\n this.undoStack.add(command);\r\n }\r\n\r\n this._store.rerender();\r\n }\r\n}\r\n","import { KritzelBoundingBox } from '../../interfaces/bounding-box.interface';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\n\r\nexport class KritzelOctree<T extends KritzelBaseObject<any>> {\r\n private bounds: KritzelBoundingBox;\r\n private capacity: number;\r\n private objects: T[] = [];\r\n private children: KritzelOctree<T>[] | null = null;\r\n\r\n constructor(bounds: KritzelBoundingBox, capacity: number = 8) {\r\n this.bounds = bounds;\r\n this.capacity = capacity;\r\n }\r\n\r\n insert(object: T): boolean {\r\n if (!this.intersects(object.rotatedBoundingBox, this.bounds)) {\r\n return false;\r\n }\r\n\r\n if (this.objects.length < this.capacity && this.children === null) {\r\n this.objects.push(object);\r\n return true;\r\n }\r\n\r\n if (this.children === null) {\r\n this.subdivide();\r\n }\r\n\r\n for (const child of this.children!) {\r\n if (child.insert(object)) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n update(object: T): boolean {\r\n const index = this.objects.findIndex(o => o.id === object.id);\r\n\r\n if (index !== -1) {\r\n this.objects[index] = object;\r\n return true;\r\n }\r\n if (this.children !== null) {\r\n for (const child of this.children) {\r\n if (child.update(object)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n remove(predicate: (object: T) => boolean): void {\r\n const index = this.objects.findIndex(o => predicate(o));\r\n if (index !== -1) {\r\n this.objects.splice(index, 1);\r\n }\r\n\r\n if (this.children !== null) {\r\n for (const child of this.children) {\r\n child.remove(predicate);\r\n }\r\n }\r\n }\r\n\r\n query(range: KritzelBoundingBox): T[] {\r\n const results: T[] = [];\r\n\r\n if (!this.intersects(range, this.bounds)) {\r\n return results;\r\n }\r\n\r\n for (const object of this.objects) {\r\n if (this.intersects(object.rotatedBoundingBox, range)) {\r\n results.push(object);\r\n }\r\n }\r\n\r\n if (this.children !== null) {\r\n for (const child of this.children) {\r\n results.push(...child.query(range));\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n filter(predicate: (object: T) => boolean): T[] {\r\n const results: T[] = this.objects.filter(o => predicate(o));\r\n if (this.children !== null) {\r\n for (const child of this.children) {\r\n results.push(...child.filter(predicate));\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n allObjects(): T[] {\r\n const results: T[] = [...this.objects];\r\n if (this.children !== null) {\r\n for (const child of this.children) {\r\n results.push(...child.allObjects());\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n private subdivide(): void {\r\n const { x, y, z, width, height, depth } = this.bounds;\r\n const halfWidth = width / 2;\r\n const halfHeight = height / 2;\r\n const halfDepth = depth / 2;\r\n\r\n this.children = [\r\n new KritzelOctree<T>({ x, y, z, width: halfWidth, height: halfHeight, depth: halfDepth }, this.capacity),\r\n new KritzelOctree<T>({ x: x + halfWidth, y, z, width: halfWidth, height: halfHeight, depth: halfDepth }, this.capacity),\r\n new KritzelOctree<T>({ x, y: y + halfHeight, z, width: halfWidth, height: halfHeight, depth: halfDepth }, this.capacity),\r\n new KritzelOctree<T>({ x: x + halfWidth, y: y + halfHeight, z, width: halfWidth, height: halfHeight, depth: halfDepth }, this.capacity),\r\n new KritzelOctree<T>({ x, y, z: z + halfDepth, width: halfWidth, height: halfHeight, depth: halfDepth }, this.capacity),\r\n new KritzelOctree<T>({ x: x + halfWidth, y, z: z + halfDepth, width: halfWidth, height: halfHeight, depth: halfDepth }, this.capacity),\r\n new KritzelOctree<T>({ x, y: y + halfHeight, z: z + halfDepth, width: halfWidth, height: halfHeight, depth: halfDepth }, this.capacity),\r\n new KritzelOctree<T>({ x: x + halfWidth, y: y + halfHeight, z: z + halfDepth, width: halfWidth, height: halfHeight, depth: halfDepth }, this.capacity),\r\n ];\r\n }\r\n\r\n private intersects(a: KritzelBoundingBox, b: KritzelBoundingBox): boolean {\r\n return !(\r\n a.x >= b.x + b.width || // a is completely to the right of b\r\n a.x + a.width <= b.x || // a is completely to the left of b\r\n a.y >= b.y + b.height || // a is completely below b\r\n a.y + a.height <= b.y // a is completely above b\r\n );\r\n }\r\n}\r\n","import { KritzelStore } from '../store.class';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\nimport { KritzelBaseCommand } from './base.command';\r\n\r\nexport class UpdateObjectCommand extends KritzelBaseCommand {\r\n private object: KritzelBaseObject<any>;\r\n private updatedProperties: Partial<KritzelBaseObject<any>>;\r\n private previousProperties: Partial<KritzelBaseObject<any>>;\r\n\r\n constructor(\r\n store: KritzelStore,\r\n initiator: any,\r\n object: KritzelBaseObject<any>,\r\n updatedProperties: Partial<KritzelBaseObject<any>>\r\n ) {\r\n super(store, initiator);\r\n this.object = object;\r\n this.updatedProperties = updatedProperties;\r\n\r\n this.previousProperties = {};\r\n for (const key in updatedProperties) {\r\n if (updatedProperties.hasOwnProperty(key)) {\r\n this.previousProperties[key] = this.object[key];\r\n }\r\n }\r\n }\r\n\r\n execute(): void {\r\n for (const key in this.updatedProperties) {\r\n if (this.updatedProperties.hasOwnProperty(key)) {\r\n this.object[key] = this.updatedProperties[key];\r\n }\r\n }\r\n }\r\n\r\n undo(): void {\r\n for (const key in this.previousProperties) {\r\n if (this.previousProperties.hasOwnProperty(key)) {\r\n this.object[key] = this.previousProperties[key];\r\n }\r\n }\r\n }\r\n}","import { KritzelEngineState } from \"../interfaces/engine-state.interface\";\r\n\r\nexport const DEFAULT_ENGINE_STATE: KritzelEngineState = {\r\n activeTool: null,\r\n activeText: null,\r\n currentPath: null,\r\n copiedObjects: null,\r\n objectsOctree: null,\r\n selectionBox: null,\r\n selectionGroup: null,\r\n resizeHandleType: null,\r\n hasViewportChanged: false,\r\n isReady: false,\r\n isEnabled: true,\r\n isScaling: false,\r\n isPanning: false,\r\n isFocused: false,\r\n isSelecting: false,\r\n isResizing: false,\r\n isResizeHandleSelected: false,\r\n isRotating: false,\r\n isRotationHandleSelected: false,\r\n isDragging: false,\r\n isDrawing: false,\r\n isErasing: false,\r\n isWriting: false,\r\n isCtrlKeyPressed: false,\r\n isContextMenuVisible: false,\r\n contextMenuItems: [],\r\n contextMenuX: 0,\r\n contextMenuY: 0,\r\n skipContextMenu: false,\r\n debugInfo: {\r\n showObjectInfo: false,\r\n showViewportInfo: false,\r\n logCommands: false,\r\n },\r\n host: null,\r\n cursorX: 0,\r\n cursorY: 0,\r\n scale: 1,\r\n scaleMax: 1,\r\n scaleMin: 1,\r\n scaleStep: 0.05,\r\n startX: 0,\r\n startY: 0,\r\n translateX: 0,\r\n translateXMax: 400,\r\n translateXMin: 0,\r\n translateY: 0,\r\n translateYMax: 400,\r\n translateYMin: 0,\r\n viewportWidth: 0,\r\n viewportHeight: 0,\r\n historyBufferSize: 1000,\r\n longTouchTimeout: null,\r\n longTouchDelay: 300,\r\n pointers: new Map<number, PointerEvent>()\r\n};","import { KritzelBaseObject } from './objects/base-object.class';\r\nimport { KritzelSelectionGroup } from './objects/selection-group.class';\r\nimport { RemoveSelectionGroupCommand } from './commands/remove-selection-group.command';\r\nimport { KritzelHistory } from './history.class';\r\nimport { KritzelEngineState } from '../interfaces/engine-state.interface';\r\nimport { KritzelOctree } from './structures/octree.structure';\r\nimport { KritzelBoundingBox } from '../interfaces/bounding-box.interface';\r\nimport { KrtizelSelectionBox } from './objects/selection-box.class';\r\nimport { StateChangeListener, StatePropertyKey } from '../types/state.types';\r\nimport { RemoveObjectCommand } from './commands/remove-object.command';\r\nimport { BatchCommand } from './commands/batch.command';\r\nimport { AddObjectCommand } from './commands/add-object.command';\r\nimport { AddSelectionGroupCommand } from './commands/add-selection-group.command';\r\nimport { UpdateObjectCommand } from './commands/update-object.command';\r\nimport { KritzelEngine } from '../components/core/kritzel-engine/kritzel-engine';\r\nimport { KritzelContextMenu } from '../components/ui/kritzel-context-menu/kritzel-context-menu';\r\nimport { KritzelToolRegistry } from './registries/tool.registry';\r\nimport { DEFAULT_ENGINE_STATE } from '../configs/default-engine-state';\r\n\r\nexport class KritzelStore {\r\n private readonly _kritzelEngine: KritzelEngine;\r\n\r\n private readonly _state: KritzelEngineState;\r\n\r\n private readonly _history: KritzelHistory;\r\n\r\n private readonly _listeners: Map<StatePropertyKey, Set<StateChangeListener<any>>> = new Map();\r\n\r\n objects: KritzelBaseObject<any>[] = [];\r\n\r\n get history(): KritzelHistory {\r\n return this._history;\r\n }\r\n\r\n get state(): KritzelEngineState {\r\n return this._state;\r\n }\r\n\r\n get currentZIndex() {\r\n return this._state.objectsOctree.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KrtizelSelectionBox)).length;\r\n }\r\n\r\n get allObjects() {\r\n return this._state.objectsOctree.allObjects();\r\n }\r\n\r\n get selectedObjects() {\r\n return this.allObjects.filter(o => !(o instanceof KritzelSelectionGroup)).filter(o => o.selected);\r\n }\r\n\r\n get offsetX() {\r\n return this._state.host.getBoundingClientRect().left;\r\n }\r\n\r\n get offsetY() {\r\n return this._state.host.getBoundingClientRect().top;\r\n }\r\n\r\n constructor(kritzelEngine: KritzelEngine) {\r\n this._state = DEFAULT_ENGINE_STATE;\r\n this._kritzelEngine = kritzelEngine;\r\n this._history = new KritzelHistory(this);\r\n this._state.objectsOctree = new KritzelOctree<KritzelBaseObject<any>>({\r\n x: -Infinity,\r\n y: -Infinity,\r\n z: -Infinity,\r\n width: Infinity,\r\n height: Infinity,\r\n depth: Infinity,\r\n });\r\n }\r\n\r\n rerender() {\r\n const viewportBounds: KritzelBoundingBox = {\r\n x: -this._state.translateX / this._state.scale,\r\n y: -this._state.translateY / this._state.scale,\r\n z: this._state.scale,\r\n width: this._state.viewportWidth / this._state.scale,\r\n height: this._state.viewportHeight / this._state.scale,\r\n depth: 100,\r\n };\r\n\r\n this.objects = this._state.objectsOctree.query(viewportBounds);\r\n\r\n if (this._kritzelEngine) {\r\n this._kritzelEngine.forceUpdate++;\r\n }\r\n }\r\n\r\n findObjectById(id: string): KritzelBaseObject<any> | null {\r\n for (const object of this.allObjects) {\r\n if (object.id === id) {\r\n return object;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n deselectAllObjects(): void {\r\n if (this._state.selectionGroup) {\r\n this._history.executeCommand(new RemoveSelectionGroupCommand(this, this));\r\n }\r\n }\r\n\r\n onStateChange<K extends StatePropertyKey>(property: K, listener: StateChangeListener<KritzelEngineState[K]>): void {\r\n if (!this._listeners.has(property)) {\r\n this._listeners.set(property, new Set());\r\n }\r\n this._listeners.get(property).add(listener);\r\n }\r\n\r\n setState<K extends StatePropertyKey>(property: K, value: KritzelEngineState[K]): void {\r\n const oldValue = this._state[property];\r\n\r\n if (oldValue !== value) {\r\n this._state[property] = value;\r\n\r\n if (this._listeners.has(property)) {\r\n this._listeners.get(property).forEach(listener => listener(value, oldValue, String(property)));\r\n }\r\n }\r\n }\r\n\r\n delete() {\r\n if (!this.state.selectionGroup) {\r\n return;\r\n }\r\n\r\n const deleteSelectedObjectsCommand = this.state.selectionGroup.objects.map(obj => new RemoveObjectCommand(this, this.state.selectionGroup, obj));\r\n const removeSelectionGroupCommand = new RemoveSelectionGroupCommand(this, this.state.selectionGroup);\r\n const commands = [...deleteSelectedObjectsCommand, removeSelectionGroupCommand];\r\n\r\n this.history.executeCommand(new BatchCommand(this, this.state.selectionGroup, commands));\r\n }\r\n\r\n deleteObject(id: string, isHistoryUpdated: boolean = true) {\r\n const object = this.findObjectById(id);\r\n if (object) {\r\n if (isHistoryUpdated) {\r\n const removeObjectCommand = new RemoveObjectCommand(this, this, object);\r\n this.history.executeCommand(removeObjectCommand);\r\n } else {\r\n this._state.objectsOctree.remove(obj => obj.id === id);\r\n this.rerender();\r\n }\r\n }\r\n }\r\n\r\n copy() {\r\n this.state.copiedObjects = this.state.selectionGroup.copy() as KritzelSelectionGroup;\r\n }\r\n\r\n paste(x?: number, y?: number) {\r\n this.state.copiedObjects.selected = true;\r\n\r\n const adjustedX = x !== undefined ? x : this.state.copiedObjects.translateX + 25;\r\n const adjustedY = y !== undefined ? y : this.state.copiedObjects.translateY + 25;\r\n\r\n this.state.copiedObjects.updatePosition(adjustedX, adjustedY);\r\n\r\n const commands = [];\r\n if (this.state.selectionGroup !== null) {\r\n commands.push(new RemoveSelectionGroupCommand(this, this.state.selectionGroup));\r\n }\r\n\r\n const addCopiedObjectsCommands = this.state.copiedObjects.objects.map(obj => new AddObjectCommand(this, this, obj));\r\n const addCopiedObjectsAsSelectionGroupCommand = new AddSelectionGroupCommand(this, this, this.state.copiedObjects);\r\n\r\n commands.push(...addCopiedObjectsCommands, addCopiedObjectsAsSelectionGroupCommand);\r\n\r\n this.history.executeCommand(new BatchCommand(this, this, commands));\r\n\r\n this.state.isSelecting = false;\r\n this.state.copiedObjects = this.state.selectionGroup.copy() as KritzelSelectionGroup;\r\n this.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n }\r\n\r\n bringForward(object?: KritzelBaseObject<any>) {\r\n const max = this.allObjects.length + 1;\r\n const objects = object ? [object] : this.state.selectionGroup.objects;\r\n const increaseZIndexCommands = objects.map(obj => {\r\n if (obj.zIndex === max) {\r\n return;\r\n }\r\n return new UpdateObjectCommand(this, this, obj, { zIndex: obj.zIndex + 1 });\r\n });\r\n\r\n this.history.executeCommand(new BatchCommand(this, this, increaseZIndexCommands));\r\n }\r\n\r\n sendBackward(object?: KritzelBaseObject<any>) {\r\n const min = 0;\r\n const objects = object ? [object] : this.state.selectionGroup.objects;\r\n const decreaseZIndexCommands = objects.map(obj => {\r\n if (obj.zIndex === min) {\r\n return;\r\n }\r\n return new UpdateObjectCommand(this, this, obj, { zIndex: obj.zIndex - 1 });\r\n });\r\n\r\n this.history.executeCommand(new BatchCommand(this, this, decreaseZIndexCommands));\r\n }\r\n\r\n bringToFront(object?: KritzelBaseObject<any>) {\r\n const max = this.allObjects.length + 1;\r\n const objects = object ? [object] : this.state.selectionGroup.objects;\r\n const increaseZIndexCommands = objects.map(obj => {\r\n return new UpdateObjectCommand(this, this, obj, { zIndex: max });\r\n });\r\n\r\n this.history.executeCommand(new BatchCommand(this, this, increaseZIndexCommands));\r\n }\r\n\r\n sendToBack(object?: KritzelBaseObject<any>) {\r\n const min = -1;\r\n const objects = object ? [object] : this.state.selectionGroup.objects;\r\n const decreaseZIndexCommands = objects.map(obj => {\r\n return new UpdateObjectCommand(this, this, obj, { zIndex: min });\r\n });\r\n\r\n this.history.executeCommand(new BatchCommand(this, this, decreaseZIndexCommands));\r\n }\r\n\r\n selectObjects(objects: KritzelBaseObject<any>[]) {\r\n if (objects.length === 0) {\r\n return;\r\n }\r\n\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n objects.forEach(obj => {\r\n obj.selected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.selected = true;\r\n\r\n this.state.selectionGroup = selectionGroup;\r\n\r\n if (objects.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.history.executeCommand(new AddSelectionGroupCommand(this, this, selectionGroup));\r\n }\r\n\r\n selectAllObjectsInViewport() {\r\n const objectsInViewport = this._state.objectsOctree\r\n .query({\r\n x: -this._state.translateX / this._state.scale,\r\n y: -this._state.translateY / this._state.scale,\r\n z: this._state.scale,\r\n width: this._state.viewportWidth / this._state.scale,\r\n height: this._state.viewportHeight / this._state.scale,\r\n depth: 100,\r\n })\r\n .filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KrtizelSelectionBox) && !(o instanceof KritzelContextMenu));\r\n\r\n if (objectsInViewport.length > 0) {\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n\r\n objectsInViewport.forEach(obj => {\r\n obj.selected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.selected = true;\r\n\r\n this.state.isSelecting = false;\r\n\r\n if (objectsInViewport.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.history.executeCommand(new AddSelectionGroupCommand(this, this, selectionGroup));\r\n this.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n }\r\n }\r\n\r\n clearSelection() {\r\n const command = new RemoveSelectionGroupCommand(this, this.state.selectionGroup);\r\n this.history.executeCommand(command);\r\n\r\n this.state.selectionGroup = null;\r\n this.state.selectionBox = null;\r\n this.state.isSelecting = false;\r\n this.state.isResizeHandleSelected = false;\r\n this.state.isRotationHandleSelected = false;\r\n }\r\n\r\n resetActiveText() {\r\n if (this.state.activeText && this.state.activeText.value === ' ') {\r\n this.deleteObject(this.state.activeText.id, false);\r\n this.history.undoStack.pop();\r\n }\r\n\r\n this.state.activeText = null;\r\n }\r\n\r\n getObjectFromPointerEvent(event: PointerEvent, selector = '.object'): KritzelBaseObject<any> | null {\r\n const shadowRoot = this.state.host?.shadowRoot;\r\n if (!shadowRoot) return null;\r\n\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const elementAtPoint = shadowRoot.elementFromPoint(clientX, clientY);\r\n if (!elementAtPoint) return null;\r\n\r\n const selectedObject = elementAtPoint.closest(selector) as HTMLElement | null;\r\n\r\n if (selectedObject) {\r\n return this.allObjects.find(object => selectedObject.id === object.id);\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { KritzelToolRegistry } from '../registries/tool.registry';\r\nimport { KritzelStore } from '../store.class';\r\nimport { KritzelBaseHandler } from './base.handler';\r\n\r\nexport class KritzelKeyHandler extends KritzelBaseHandler {\r\n constructor(store: KritzelStore) {\r\n super(store);\r\n }\r\n\r\n handleKeyDown(event: KeyboardEvent): void {\r\n if(this._store.state.isFocused === false) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n this._store.state.isCtrlKeyPressed = event.ctrlKey;\r\n\r\n if(this._store.state.isCtrlKeyPressed) {\r\n event.preventDefault();\r\n }\r\n\r\n if (event.key === 'Escape' && this._store.state.selectionGroup) {\r\n this._store.clearSelection();\r\n }\r\n\r\n if (event.key === 'Delete' && this._store.state.selectionGroup) {\r\n this._store.delete();\r\n }\r\n\r\n if (event.key === 'z' && event.ctrlKey) {\r\n this._store.history.undo();\r\n }\r\n\r\n if (event.key === 'y' && event.ctrlKey) {\r\n this._store.history.redo();\r\n }\r\n\r\n if (event.key === 's' && event.ctrlKey) {\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n this._store.deselectAllObjects();\r\n }\r\n\r\n if (event.key === 'b' && event.ctrlKey) {\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('brush'));\r\n this._store.deselectAllObjects();\r\n }\r\n\r\n if (event.key === 'e' && event.ctrlKey) {\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('eraser'));\r\n this._store.deselectAllObjects();\r\n }\r\n\r\n if (event.key === 'i' && event.ctrlKey) {\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('image'));\r\n this._store.deselectAllObjects();\r\n }\r\n\r\n if (event.key === 'x' && event.ctrlKey) {\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('text'));\r\n this._store.deselectAllObjects();\r\n }\r\n\r\n if (event.key === 'c' && event.ctrlKey && this._store.state.selectionGroup) {\r\n this._store.copy();\r\n this._store.rerender();\r\n }\r\n\r\n if (event.key === 'v' && event.ctrlKey && this._store.state.copiedObjects) {\r\n this._store.paste();\r\n }\r\n\r\n if (event.key === '+' && event.ctrlKey && this._store.state.selectionGroup) {\r\n this._store.bringForward();\r\n }\r\n\r\n if (event.key === '-' && event.ctrlKey && this._store.state.selectionGroup) {\r\n this._store.sendBackward();\r\n }\r\n\r\n if (event.key === '*' && event.shiftKey && this._store.state.selectionGroup) {\r\n this._store.bringToFront();\r\n }\r\n\r\n if (event.key === '_' && event.shiftKey && this._store.state.selectionGroup) {\r\n this._store.sendToBack();\r\n }\r\n\r\n if(event.key === 'a' && event.ctrlKey && this._store.state.activeText) {\r\n this._store.state.activeText.selectAll();\r\n }\r\n\r\n if(event.key === 'v' && event.ctrlKey && this._store.state.activeText) {\r\n this._store.state.activeText.insertFromClipboard();\r\n }\r\n }\r\n\r\n handleKeyUp(event: KeyboardEvent): void {\r\n if(this._store.state.isFocused === false) {\r\n return;\r\n }\r\n \r\n this._store.state.isCtrlKeyPressed = event.ctrlKey;\r\n }\r\n \r\n}\r\n","import { AddSelectionGroupCommand } from '../commands/add-selection-group.command';\r\nimport { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelStore } from '../store.class';\r\nimport { KritzelBaseHandler } from './base.handler';\r\n\r\nexport class KritzelContextMenuHandler extends KritzelBaseHandler {\r\n globalContextMenuItems = [];\r\n\r\n objectContextMenuItems = [];\r\n\r\n constructor(store: KritzelStore, globalContextMenuItems: any[], objectContextMenuItems: any[]) {\r\n super(store);\r\n this.globalContextMenuItems = globalContextMenuItems;\r\n this.objectContextMenuItems = objectContextMenuItems;\r\n }\r\n\r\n handleContextMenu(event: PointerEvent): void {\r\n if(this._store.state.skipContextMenu) {\r\n this._store.state.skipContextMenu = false;\r\n return;\r\n }\r\n\r\n const selectedObject = this._store.getObjectFromPointerEvent(event, '.object');\r\n\r\n if (selectedObject && !(selectedObject instanceof KritzelSelectionGroup)) {\r\n this._store.state.selectionGroup = KritzelSelectionGroup.create(this._store);\r\n this._store.state.selectionGroup.addOrRemove(selectedObject);\r\n this._store.state.selectionGroup.selected = true;\r\n this._store.state.selectionGroup.rotation = selectedObject.rotation;\r\n this._store.state.isSelecting = false;\r\n\r\n this._store.history.executeCommand(new AddSelectionGroupCommand(this._store, this, this._store.state.selectionGroup));\r\n }\r\n\r\n this._store.state.contextMenuItems = this._store.state.selectionGroup ? this.objectContextMenuItems : this.globalContextMenuItems;\r\n\r\n let x: number = event.clientX - this._store.offsetX;\r\n let y: number = event.clientY - this._store.offsetY;\r\n\r\n const menuWidthEstimate = 150;\r\n const menuHeightEstimate = 200;\r\n const margin = 10;\r\n\r\n if (x + menuWidthEstimate > window.innerWidth - margin) {\r\n x = window.innerWidth - menuWidthEstimate - margin;\r\n }\r\n\r\n if (y + menuHeightEstimate > window.innerHeight - margin) {\r\n y = window.innerHeight - menuHeightEstimate - margin;\r\n }\r\n\r\n x = Math.max(margin, x);\r\n y = Math.max(margin, y);\r\n\r\n this._store.state.contextMenuX = x;\r\n this._store.state.contextMenuY = y;\r\n this._store.state.isContextMenuVisible = true;\r\n\r\n this._store.state.isEnabled = false;\r\n\r\n this._store.rerender();\r\n }\r\n}\r\n","export class KritzelClassHelper {\r\n static isInstanceOf<T>(object: any, className: string): object is T {\r\n return object.__class__ === className;\r\n }\r\n}",":host {\r\n display: block;\r\n position: relative;\r\n height: 100%;\r\n width: 100%;\r\n overflow: hidden;\r\n background-color: var(--kritzel-engine-background-color, #ffffff);\r\n}\r\n\r\n:host,\r\n:host * {\r\n touch-action: none;\r\n user-select: none;\r\n}\r\n\r\n.debug-panel {\r\n position: absolute;\r\n pointer-events: none;\r\n top: 0;\r\n right: 0;\r\n}\r\n\r\n.origin {\r\n position: relative;\r\n top: 0;\r\n left: 0;\r\n height: 0;\r\n width: 0;\r\n pointer-events: none;\r\n -webkit-transform-origin: top left;\r\n -moz-transform-origin: top left;\r\n transform-origin: top left;\r\n overflow: visible;\r\n}\r\n\r\n.object {\r\n overflow: visible;\r\n}\r\n\r\ntextarea {\r\n all: unset;\r\n box-sizing: border-box;\r\n outline: none !important;\r\n border: none !important;\r\n overflow: visible;\r\n}\r\n\r\n.resize-handle-overlay.top-left,\r\n.resize-handle-overlay.bottom-right {\r\n cursor: nwse-resize;\r\n}\r\n\r\n.resize-handle-overlay.top-right,\r\n.resize-handle-overlay.bottom-left {\r\n cursor: nesw-resize;\r\n}\r\n\r\n.rotation-handle-overlay {\r\n cursor: grab;\r\n}\r\n","import { Component, Host, h, Listen, Element, Prop, Method, State, Event, EventEmitter, Watch } from '@stencil/core';\r\nimport { KritzelTool } from '../../../interfaces/tool.interface';\r\nimport { KritzelViewport } from '../../../classes/viewport.class';\r\nimport { KritzelPath } from '../../../classes/objects/path.class';\r\nimport { KritzelSelectionTool } from '../../../classes/tools/selection-tool.class';\r\nimport { KritzelImage } from '../../../classes/objects/image.class';\r\nimport { KritzelText } from '../../../classes/objects/text.class';\r\nimport { KritzelSelectionGroup } from '../../../classes/objects/selection-group.class';\r\nimport { KrtizelSelectionBox } from '../../../classes/objects/selection-box.class';\r\nimport { KritzelStore } from '../../../classes/store.class';\r\nimport { KritzelKeyHandler } from '../../../classes/handlers/key.handler';\r\nimport { KritzelBaseTool } from '../../../classes/tools/base-tool.class';\r\nimport { ContextMenuItem } from '../../../interfaces/context-menu-item.interface';\r\nimport { KritzelEraserTool } from '../../../classes/tools/eraser-tool.class';\r\nimport { KritzelBrushToolConfig, KritzelTextToolConfig } from '../../../interfaces/toolbar-control.interface';\r\nimport { KritzelKeyboardHelper } from '../../../helpers/keyboard.helper';\r\nimport { KritzelContextMenuHandler } from '../../../classes/handlers/context-menu.handler';\r\nimport { AddObjectCommand } from '../../../classes/commands/add-object.command';\r\nimport { KritzelBaseObject } from '../../../classes/objects/base-object.class';\r\nimport { UpdateObjectCommand } from '../../../classes/commands/update-object.command';\r\nimport { RemoveObjectCommand } from '../../../classes/commands/remove-object.command';\r\nimport { KritzelToolRegistry } from '../../../classes/registries/tool.registry';\r\nimport { KritzelEventHelper } from '../../../helpers/event.helper';\r\nimport { KritzelClassHelper } from '../../../helpers/class.helper';\r\nimport { ABSOLUTE_SCALE_MAX, ABSOLUTE_SCALE_MIN } from '../../../constants/engine.constants';\r\n\r\n@Component({\r\n tag: 'kritzel-engine',\r\n styleUrl: 'kritzel-engine.css',\r\n shadow: true,\r\n})\r\nexport class KritzelEngine {\r\n @Prop()\r\n activeTool: KritzelTool;\r\n\r\n @Prop()\r\n globalContextMenuItems: ContextMenuItem[];\r\n\r\n @Prop()\r\n objectContextMenuItems: ContextMenuItem[];\r\n\r\n @Prop({ mutable: true })\r\n scaleMax: number = ABSOLUTE_SCALE_MAX;\r\n\r\n @Prop({ mutable: true })\r\n scaleMin: number = ABSOLUTE_SCALE_MIN;\r\n\r\n @Event()\r\n isEngineReady: EventEmitter<void>;\r\n\r\n @Event()\r\n activeToolChange: EventEmitter<KritzelBaseTool>;\r\n\r\n @Element()\r\n host: HTMLElement;\r\n\r\n @State()\r\n forceUpdate: number = 0;\r\n\r\n @Watch('scaleMax')\r\n validateScaleMax(newValue: number) {\r\n if (newValue > ABSOLUTE_SCALE_MAX) {\r\n console.warn(`scaleMax cannot be greater than ${ABSOLUTE_SCALE_MAX}.`);\r\n this.scaleMax = ABSOLUTE_SCALE_MAX;\r\n this.store.state.scaleMax = this.scaleMax;\r\n } else {\r\n this.store.state.scaleMax = newValue;\r\n }\r\n }\r\n\r\n @Watch('scaleMin')\r\n validateScaleMin(newValue: number) {\r\n if (newValue < ABSOLUTE_SCALE_MIN) {\r\n console.warn(`scaleMin cannot be less than ${ABSOLUTE_SCALE_MIN}.`);\r\n this.scaleMin = ABSOLUTE_SCALE_MIN;\r\n this.store.state.scaleMin = this.scaleMin;\r\n } else {\r\n this.store.state.scaleMin = newValue;\r\n }\r\n }\r\n\r\n store: KritzelStore;\r\n\r\n viewport: KritzelViewport;\r\n\r\n contextMenuHandler: KritzelContextMenuHandler;\r\n\r\n keyHandler: KritzelKeyHandler;\r\n\r\n contextMenuElement: HTMLKritzelContextMenuElement | null = null;\r\n\r\n get isSelecting() {\r\n return this.store.state.activeTool instanceof KritzelSelectionTool && this.store.state.isSelecting;\r\n }\r\n\r\n get isSelectionActive() {\r\n return this.store.state.activeTool instanceof KritzelSelectionTool && this.store.state.selectionGroup !== null;\r\n }\r\n\r\n constructor() {\r\n this.store = new KritzelStore(this);\r\n }\r\n\r\n componentWillLoad() {\r\n this.validateScaleMax(this.scaleMax);\r\n this.validateScaleMin(this.scaleMin);\r\n }\r\n\r\n componentDidLoad() {\r\n this.contextMenuHandler = new KritzelContextMenuHandler(this.store, this.globalContextMenuItems, this.objectContextMenuItems);\r\n this.keyHandler = new KritzelKeyHandler(this.store);\r\n this.viewport = new KritzelViewport(this.store, this.host);\r\n\r\n this._registerStateChangeListeners();\r\n\r\n if (this.store.state.isReady === false) {\r\n this.store.state.isReady = true;\r\n this.isEngineReady.emit();\r\n }\r\n }\r\n\r\n @Listen('wheel', { passive: false })\r\n handleWheel(ev) {\r\n if (this.store.state.isContextMenuVisible) {\r\n this.hideContextMenu();\r\n }\r\n\r\n this.viewport.handleWheel(ev);\r\n this.store.state?.activeTool?.handleWheel(ev);\r\n }\r\n\r\n @Listen('pointerdown', { passive: false })\r\n handlePointerDown(ev: PointerEvent) {\r\n if (KritzelEventHelper.isPointerEventOnContextMenu(ev) === false && this.store.state.isContextMenuVisible) {\r\n this.hideContextMenu();\r\n return;\r\n }\r\n\r\n if (this.store.state.isEnabled === false) {\r\n return;\r\n }\r\n\r\n KritzelEventHelper.onLongTouchPress(ev, (event: PointerEvent) => {\r\n if (!(this.store.state.activeTool instanceof KritzelSelectionTool)) {\r\n return;\r\n }\r\n this.contextMenuHandler.handleContextMenu(event);\r\n });\r\n\r\n this.host.setPointerCapture(ev.pointerId);\r\n this.store.state.pointers.set(ev.pointerId, ev);\r\n\r\n this.viewport.handlePointerDown(ev);\r\n this.store.state?.activeTool?.handlePointerDown(ev);\r\n }\r\n\r\n @Listen('pointermove', { passive: false })\r\n handlePointerMove(ev: PointerEvent) {\r\n if (this.store.state.isEnabled === false) {\r\n return;\r\n }\r\n\r\n this.store.state.pointers.set(ev.pointerId, ev);\r\n\r\n this.viewport.handlePointerMove(ev);\r\n this.store.state?.activeTool?.handlePointerMove(ev);\r\n }\r\n\r\n @Listen('pointerup', { passive: false })\r\n handlePointerUp(ev: PointerEvent) {\r\n if (this.store.state.isEnabled === false) {\r\n return;\r\n }\r\n\r\n this.store.state.pointers.delete(ev.pointerId);\r\n this.host.releasePointerCapture(ev.pointerId);\r\n\r\n this.viewport.handlePointerUp(ev);\r\n this.store.state?.activeTool?.handlePointerUp(ev);\r\n }\r\n\r\n @Listen('pointercancel', { passive: false })\r\n handlePointerCancel(ev: PointerEvent) {\r\n if (this.store.state.isEnabled === false) {\r\n return;\r\n }\r\n\r\n this.host.releasePointerCapture(ev.pointerId);\r\n this.store.state.pointers.delete(ev.pointerId);\r\n\r\n this.viewport.handlePointerUp(ev);\r\n this.store.state?.activeTool?.handlePointerUp(ev);\r\n }\r\n\r\n @Listen('contextmenu', { capture: false })\r\n handleContextMenu(ev: PointerEvent) {\r\n ev.preventDefault();\r\n\r\n if (this.store.state.isEnabled === false) {\r\n return;\r\n }\r\n\r\n if (ev.pointerType === 'touch') {\r\n return;\r\n }\r\n\r\n this.contextMenuHandler.handleContextMenu(ev);\r\n }\r\n\r\n @Listen('resize', { target: 'window' })\r\n handleResize() {\r\n this.viewport.handleResize();\r\n }\r\n\r\n @Listen('keydown', { target: 'window' })\r\n handleKeyDown(ev) {\r\n this.keyHandler.handleKeyDown(ev);\r\n }\r\n\r\n @Listen('keyup', { target: 'window' })\r\n handleKeyUp(ev) {\r\n this.keyHandler.handleKeyUp(ev);\r\n }\r\n\r\n @Listen('mousedown', { target: 'window', passive: true })\r\n updateFocus(ev) {\r\n const rect = this.store.state.host.getBoundingClientRect();\r\n const isInside = ev.clientX >= rect.left && ev.clientX <= rect.right && ev.clientY >= rect.top && ev.clientY <= rect.bottom;\r\n\r\n const path = ev.composedPath();\r\n const kritzelEngineElement = this.host.closest('kritzel-engine');\r\n const isInKritzelEngine = path.includes(kritzelEngineElement || this.host);\r\n\r\n this.store.setState('isFocused', isInside && isInKritzelEngine);\r\n }\r\n\r\n @Method()\r\n async registerTool(toolName: string, toolClass: any, toolConfig?: KritzelTextToolConfig | KritzelBrushToolConfig): Promise<KritzelBaseTool> {\r\n if (typeof toolClass !== 'function' || !(toolClass.prototype instanceof KritzelBaseTool)) {\r\n console.error(`Failed to register tool \"${toolName}\": Tool class must be a constructor function`);\r\n return null;\r\n }\r\n\r\n const registeredTool = KritzelToolRegistry.registerTool(toolName, toolClass, this.store);\r\n\r\n if (toolConfig) {\r\n Object.entries(toolConfig).forEach(([key, value]) => {\r\n registeredTool[key] = value;\r\n });\r\n }\r\n\r\n return Promise.resolve(registeredTool);\r\n }\r\n\r\n @Method()\r\n async changeActiveTool(tool: KritzelBaseTool) {\r\n this.store.state.activeTool?.onDeactivate();\r\n this.store.setState('activeTool', tool);\r\n this.store.deselectAllObjects();\r\n tool?.onActivate();\r\n }\r\n\r\n @Method()\r\n async setFocus() {\r\n this.host.focus();\r\n this.store.state.isFocused = true;\r\n }\r\n\r\n @Method()\r\n async disable() {\r\n this.store.state.isEnabled = false;\r\n this.forceUpdate++;\r\n }\r\n\r\n @Method()\r\n async enable() {\r\n this.store.state.isEnabled = true;\r\n this.forceUpdate++;\r\n }\r\n\r\n @Method()\r\n async delete() {\r\n this.store.delete();\r\n }\r\n\r\n @Method()\r\n async copy() {\r\n this.store.copy();\r\n }\r\n\r\n @Method()\r\n async paste(x: number, y: number) {\r\n this.store.paste(x, y);\r\n }\r\n\r\n @Method()\r\n async bringForward(object?: KritzelBaseObject<any>) {\r\n this.store.bringForward(object);\r\n }\r\n\r\n @Method()\r\n async sendBackward(object?: KritzelBaseObject<any>) {\r\n this.store.sendBackward(object);\r\n }\r\n\r\n @Method()\r\n async moveToTop(object?: KritzelBaseObject<any>) {\r\n this.store.bringToFront(object);\r\n }\r\n\r\n @Method()\r\n async moveToBottom(object?: KritzelBaseObject<any>) {\r\n this.store.sendToBack(object);\r\n }\r\n\r\n @Method()\r\n async undo() {\r\n this.store.history.undo();\r\n }\r\n\r\n @Method()\r\n async redo() {\r\n this.store.history.redo();\r\n }\r\n\r\n @Method()\r\n async hideContextMenu() {\r\n this.store.state.pointers.clear();\r\n this.store.state.isContextMenuVisible = false;\r\n this.store.state.selectionBox = null;\r\n this.store.state.isSelecting = false;\r\n }\r\n\r\n @Method()\r\n async getObjectById<T extends KritzelBaseObject>(id: string): Promise<T | null> {\r\n const object = this.store.objects.find(obj => obj.id === id) as T | undefined;\r\n return object || null;\r\n }\r\n\r\n @Method()\r\n async addObject<T extends KritzelBaseObject>(object: T): Promise<T | null> {\r\n this.store.deselectAllObjects();\r\n\r\n object.id = object.generateId();\r\n object._store = this.store;\r\n object.scale = object.scale ? object.scale : this.store.state.scale;\r\n object.zIndex = this.store.currentZIndex;\r\n\r\n const command = new AddObjectCommand(this.store, this, object);\r\n this.store.history.executeCommand(command);\r\n\r\n return object;\r\n }\r\n\r\n @Method()\r\n async updateObject<T extends KritzelBaseObject>(object: T, updatedProperties: Partial<T>): Promise<T | null> {\r\n this.store.deselectAllObjects();\r\n\r\n const command = new UpdateObjectCommand(this.store, this, object, updatedProperties);\r\n this.store.history.executeCommand(command);\r\n\r\n return object;\r\n }\r\n\r\n @Method()\r\n async removeObject<T extends KritzelBaseObject>(object: T): Promise<T | null> {\r\n this.store.deselectAllObjects();\r\n\r\n const command = new RemoveObjectCommand(this.store, this, object);\r\n this.store.history.executeCommand(command);\r\n\r\n return object;\r\n }\r\n\r\n @Method()\r\n async getSelectedObjects(): Promise<KritzelBaseObject<any>[]> {\r\n return this.store.state.selectionGroup ? this.store.state.selectionGroup.objects : [];\r\n }\r\n\r\n @Method()\r\n async selectObjects(objects: KritzelBaseObject[]) {\r\n this.store.state.activeTool?.onDeactivate();\r\n this.store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n this.store.deselectAllObjects();\r\n this.store.selectObjects(objects);\r\n console.log('Selected objects:', objects);\r\n }\r\n\r\n @Method()\r\n async selectAllObjectsInViewport() {\r\n this.store.state.activeTool?.onDeactivate();\r\n this.store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n this.store.deselectAllObjects();\r\n this.store.selectAllObjectsInViewport();\r\n }\r\n\r\n @Method()\r\n async clearSelection() {\r\n this.store.clearSelection();\r\n }\r\n\r\n @Method()\r\n async centerObjectInViewport(object: KritzelBaseObject) {\r\n object.centerInViewport();\r\n\r\n const command = new UpdateObjectCommand(this.store, this, object, object);\r\n this.store.history.executeCommand(command);\r\n\r\n return object;\r\n }\r\n\r\n @Method()\r\n async getCopiedObjects(): Promise<KritzelBaseObject[]> {\r\n return this.store.state.copiedObjects?.objects || [];\r\n }\r\n\r\n private _registerStateChangeListeners() {\r\n this.store.onStateChange('activeTool', this._handleActiveToolChange.bind(this));\r\n this.store.onStateChange('isFocused', this._handleIsFocusedChange.bind(this));\r\n }\r\n\r\n private _handleActiveToolChange(activeTool: KritzelBaseTool) {\r\n if (!(activeTool instanceof KritzelSelectionTool)) {\r\n this.store.clearSelection();\r\n }\r\n\r\n this.store.state.skipContextMenu = false;\r\n this.activeToolChange.emit(activeTool);\r\n KritzelKeyboardHelper.forceHideKeyboard();\r\n }\r\n\r\n private _handleIsFocusedChange(isFocused: boolean) {\r\n if (!isFocused) {\r\n this.store.resetActiveText();\r\n }\r\n }\r\n\r\n render() {\r\n const computedStyle = window.getComputedStyle(this.host);\r\n const baseHandleSizePx = computedStyle.getPropertyValue('--kritzel-selection-handle-size').trim() || '6px';\r\n const baseHandleSize = parseFloat(baseHandleSizePx);\r\n const baseHandleTouchSize = baseHandleSize * 2 < 14 ? 14 : baseHandleSize;\r\n\r\n return (\r\n <Host>\r\n <div class=\"debug-panel\" style={{ display: this.store.state.debugInfo.showViewportInfo ? 'block' : 'none' }}>\r\n <div>TranslateX: {this.store.state?.translateX}</div>\r\n <div>TranslateY: {this.store.state?.translateY}</div>\r\n <div>ViewportWidth: {this.store.state?.viewportWidth}</div>\r\n <div>ViewportHeight: {this.store.state?.viewportHeight}</div>\r\n <div>ObjectsInViewport. {this.store.objects.length}</div>\r\n <div>Scale: {this.store.state?.scale}</div>\r\n <div>ActiveTool: {this.store.state?.activeTool?.name}</div>\r\n <div>HasViewportChanged: {this.store.state?.hasViewportChanged ? 'true' : 'false'}</div>\r\n <div>IsEnabled: {this.store.state?.isEnabled ? 'true' : 'false'}</div>\r\n <div>IsScaling: {this.store.state?.isScaling ? 'true' : 'false'}</div>\r\n <div>IsPanning: {this.store.state?.isPanning ? 'true' : 'false'}</div>\r\n <div>IsFocused: {this.store.state.isFocused ? 'true' : 'false'}</div>\r\n <div>IsSelecting: {this.isSelecting ? 'true' : 'false'}</div>\r\n <div>IsSelectionActive: {this.isSelectionActive ? 'true' : 'false'}</div>\r\n <div>IsResizeHandleSelected: {this.store.state.isResizeHandleSelected ? 'true' : 'false'}</div>\r\n <div>IsRotationHandleSelected: {this.store.state.isRotationHandleSelected ? 'true' : 'false'}</div>\r\n <div>IsDrawing: {this.store.state.isDrawing ? 'true' : 'false'}</div>\r\n <div>IsWriting: {this.store.state.isWriting ? 'true' : 'false'}</div>\r\n <div>CursorX: {this.store.state?.cursorX}</div>\r\n <div>CursorY: {this.store.state?.cursorY}</div>\r\n </div>\r\n\r\n <div\r\n class=\"origin\"\r\n style={{\r\n transform: `matrix(${this.store.state?.scale}, 0, 0, ${this.store.state?.scale}, ${this.store.state?.translateX}, ${this.store.state?.translateY})`,\r\n }}\r\n >\r\n {this.store.objects?.map(object => {\r\n return (\r\n <div style={{ transform: object?.transformationMatrix, transformOrigin: 'top left', zIndex: object.zIndex.toString(), position: 'absolute' }}>\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n key={object.id}\r\n id={object.id}\r\n class=\"object\"\r\n style={{\r\n height: object?.totalHeight.toString(),\r\n width: object?.totalWidth.toString(),\r\n left: '0',\r\n top: '0',\r\n position: 'absolute',\r\n transform: `rotate(${object.rotationDegrees}deg)`,\r\n transformOrigin: 'center',\r\n opacity: object.markedForRemoval ? '0.5' : object.opacity.toString(),\r\n pointerEvents: object.markedForRemoval ? 'none' : 'auto',\r\n }}\r\n >\r\n <foreignObject\r\n x=\"0\"\r\n y=\"0\"\r\n width={object.totalWidth.toString()}\r\n height={object.totalHeight.toString()}\r\n style={{\r\n minHeight: '0',\r\n minWidth: '0',\r\n backgroundColor: object.backgroundColor,\r\n borderColor: object.borderColor,\r\n borderWidth: object.borderWidth + 'px',\r\n borderStyle: 'solid',\r\n padding: object.padding + 'px',\r\n overflow: 'visible',\r\n }}\r\n >\r\n {KritzelClassHelper.isInstanceOf<KritzelPath>(object, 'KritzelPath') && (\r\n <svg\r\n ref={el => object.mount(el)}\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n style={{\r\n height: object?.height.toString(),\r\n width: object?.width.toString(),\r\n position: 'absolute',\r\n overflow: 'visible',\r\n }}\r\n viewBox={object?.viewBox}\r\n >\r\n <path d={object?.d} fill={object.fill} stroke={object?.stroke} />\r\n </svg>\r\n )}\r\n\r\n {KritzelClassHelper.isInstanceOf<KritzelImage>(object, 'KritzelImage') && (\r\n <img\r\n ref={el => object.mount(el)}\r\n src={object.src}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n userSelect: 'none',\r\n pointerEvents: 'none',\r\n }}\r\n draggable={false}\r\n onDragStart={e => e.preventDefault()}\r\n />\r\n )}\r\n\r\n {KritzelClassHelper.isInstanceOf<KritzelText>(object, 'KritzelText') && (\r\n <textarea\r\n ref={el => object.mount(el)}\r\n value={object.value}\r\n onKeyDown={event => object.handleKeyDown(event)}\r\n onInput={event => object.handleInput(event)}\r\n rows={object.rows}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n color: object.fontColor,\r\n fontSize: object.fontSize?.toString() + 'px',\r\n fontFamily: object.fontFamily,\r\n border: 'none',\r\n outline: 'none',\r\n resize: 'none',\r\n overflow: 'hidden',\r\n display: 'block',\r\n padding: '1px',\r\n whiteSpace: 'nowrap',\r\n pointerEvents: object.isReadonly ? 'none' : 'auto',\r\n cursor: object.isReadonly ? 'default' : 'text',\r\n caretColor: object.isReadonly ? 'transparent' : 'auto',\r\n }}\r\n ></textarea>\r\n )}\r\n\r\n {KritzelClassHelper.isInstanceOf<KritzelSelectionGroup>(object, 'KritzelSelectionGroup') && (\r\n <div\r\n ref={el => object.mount(el)}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n }}\r\n ></div>\r\n )}\r\n\r\n {KritzelClassHelper.isInstanceOf<KrtizelSelectionBox>(object, 'KrtizelSelectionBox') && (\r\n <div\r\n ref={el => object.mount(el)}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n }}\r\n ></div>\r\n )}\r\n </foreignObject>\r\n\r\n <line\r\n x1=\"0\"\r\n y1=\"0\"\r\n x2={object.totalWidth}\r\n y2=\"0\"\r\n style={{\r\n stroke: 'var(--kritzel-selection-border-color, #0e1111)',\r\n strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.store.state?.scale})`,\r\n strokeLinecap: 'square',\r\n }}\r\n visibility={object.selected ? 'visible' : 'hidden'}\r\n />\r\n <line\r\n x1=\"0\"\r\n y1=\"0\"\r\n x2=\"0\"\r\n y2={object.totalHeight}\r\n style={{\r\n stroke: 'var(--kritzel-selection-border-color, #0e1111)',\r\n strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.store.state?.scale})`,\r\n strokeLinecap: 'square',\r\n }}\r\n visibility={object.selected ? 'visible' : 'hidden'}\r\n />\r\n <line\r\n x1=\"0\"\r\n y1={object.totalHeight}\r\n x2={object.totalWidth}\r\n y2={object.totalHeight}\r\n style={{\r\n stroke: 'var(--kritzel-selection-border-color, #0e1111)',\r\n strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.store.state?.scale})`,\r\n strokeLinecap: 'square',\r\n }}\r\n visibility={object.selected ? 'visible' : 'hidden'}\r\n />\r\n <line\r\n x1={object.totalWidth}\r\n y1=\"0\"\r\n x2={object.totalWidth}\r\n y2={object.totalHeight}\r\n style={{\r\n stroke: 'var(--kritzel-selection-border-color, #0e1111)',\r\n strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.store.state?.scale})`,\r\n strokeLinecap: 'square',\r\n }}\r\n visibility={object.selected ? 'visible' : 'hidden'}\r\n />\r\n\r\n <circle\r\n class=\"resize-handle top-left\"\r\n cx=\"0\"\r\n cy=\"0\"\r\n r={`${(baseHandleSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'var(--kritzel-selection-handle-color, #000000)',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n <circle\r\n class=\"resize-handle-overlay top-left\"\r\n cx=\"0\"\r\n cy=\"0\"\r\n r={`${(baseHandleTouchSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'transparent',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n\r\n <circle\r\n class=\"resize-handle top-right\"\r\n cx={object.totalWidth}\r\n cy=\"0\"\r\n r={`${(baseHandleSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'var(--kritzel-selection-handle-color, #000000)',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n <circle\r\n class=\"resize-handle-overlay top-right\"\r\n cx={object.totalWidth}\r\n cy=\"0\"\r\n r={`${(baseHandleTouchSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'transparent',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n\r\n <circle\r\n class=\"resize-handle bottom-left\"\r\n cx=\"0\"\r\n cy={object.totalHeight}\r\n r={`${(baseHandleSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'var(--kritzel-selection-handle-color, #000000)',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n <circle\r\n class=\"resize-handle-overlay bottom-left\"\r\n cx=\"0\"\r\n cy={object.totalHeight}\r\n r={`${(baseHandleTouchSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'transparent',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n\r\n <circle\r\n class=\"resize-handle bottom-right\"\r\n cx={object.totalWidth}\r\n cy={object.totalHeight}\r\n r={`${(baseHandleSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'var(--kritzel-selection-handle-color, #000000)',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n <circle\r\n class=\"resize-handle-overlay bottom-right\"\r\n cx={object.totalWidth}\r\n cy={object.totalHeight}\r\n r={`${(baseHandleTouchSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'transparent',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n\r\n <line\r\n x1={object.totalWidth / 2}\r\n y1=\"0\"\r\n x2={object.totalWidth / 2}\r\n y2={-((15 * object.scale) / this.store.state?.scale)}\r\n style={{\r\n stroke: 'var(--kritzel-selection-border-color, #0e1111)',\r\n strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.store.state?.scale})`,\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n <circle\r\n class=\"rotation-handle\"\r\n cx={object.totalWidth / 2}\r\n cy={-((15 * object.scale) / this.store.state?.scale)}\r\n r={`${(baseHandleSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'var(--kritzel-selection-handle-color, #000000)',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n <circle\r\n class=\"rotation-handle-overlay\"\r\n cx={object.totalWidth / 2}\r\n cy={-((15 * object.scale) / this.store.state?.scale)}\r\n r={`${(baseHandleTouchSize * object.scale) / this.store.state?.scale}`}\r\n style={{\r\n fill: 'transparent',\r\n cursor: 'grab',\r\n }}\r\n visibility={object.selected && !this.isSelecting ? 'visible' : 'hidden'}\r\n />\r\n\r\n <g style={{ display: this.store.state.debugInfo.showObjectInfo ? 'block' : 'none', pointerEvents: 'none' }}>\r\n <foreignObject\r\n x={object.totalWidth.toString()}\r\n y=\"0\"\r\n width=\"400px\"\r\n height=\"160px\"\r\n style={{ minHeight: '0', minWidth: '0', display: object.debugInfoVisible ? 'block' : 'none' }}\r\n >\r\n <div style={{ width: '100%', height: '100%' }}>\r\n <div style={{ whiteSpace: 'nowrap' }}>zIndex: {object.zIndex}</div>\r\n <div style={{ whiteSpace: 'nowrap' }}>translateX: {object.translateX}</div>\r\n <div style={{ whiteSpace: 'nowrap' }}>translateY: {object.translateY}</div>\r\n <div style={{ whiteSpace: 'nowrap' }}>width: {object.width}</div>\r\n <div style={{ whiteSpace: 'nowrap' }}>height: {object.height}</div>\r\n <div style={{ whiteSpace: 'nowrap' }}>scale: {object.scale}</div>\r\n <div style={{ whiteSpace: 'nowrap' }}>rotation: {object.rotation}</div>\r\n </div>\r\n </foreignObject>\r\n </g>\r\n </svg>\r\n </div>\r\n );\r\n })}\r\n\r\n <svg\r\n class=\"object\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n style={{\r\n height: this.store.state.currentPath?.height.toString(),\r\n width: this.store.state.currentPath?.width.toString(),\r\n left: '0',\r\n top: '0',\r\n zIndex: this.store.state.currentPath?.zIndex.toString(),\r\n position: 'absolute',\r\n transform: this.store.state.currentPath?.transformationMatrix,\r\n transformOrigin: 'top left',\r\n overflow: 'visible',\r\n }}\r\n viewBox={this.store.state.currentPath?.viewBox}\r\n >\r\n <path d={this.store.state.currentPath?.d} fill={this.store.state.currentPath?.fill} stroke={this.store.state.currentPath?.stroke} />\r\n </svg>\r\n </div>\r\n\r\n {this.store.state.isContextMenuVisible && (\r\n <kritzel-context-menu\r\n class=\"context-menu\"\r\n ref={el => (this.contextMenuElement = el)}\r\n items={this.store.state.contextMenuItems}\r\n objects={this.store.state.selectionGroup?.objects || []}\r\n style={{\r\n position: 'fixed',\r\n left: `${this.store.state.contextMenuX}px`,\r\n top: `${this.store.state.contextMenuY}px`,\r\n zIndex: '10000',\r\n }}\r\n onActionSelected={event => {\r\n event.detail.action(\r\n {\r\n x: (-this.store.state.translateX + this.store.state.contextMenuX) / this.store.state.scale,\r\n y: (-this.store.state.translateY + this.store.state.contextMenuY) / this.store.state.scale,\r\n },\r\n this.store.state.selectionGroup.objects,\r\n );\r\n this.hideContextMenu();\r\n }}\r\n ></kritzel-context-menu>\r\n )}\r\n\r\n {this.store.state?.activeTool instanceof KritzelEraserTool && !this.store.state.isScaling && <kritzel-cursor-trail store={this.store}></kritzel-cursor-trail>}\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: block;\r\n}\r\n\r\n.font-preview {\r\n color: var(--kritzel-font-size-text-color, #333333);\r\n line-height: 1;\r\n text-align: center;\r\n font-weight: bold;\r\n}\r\n","import { Component, Host, Prop, h } from '@stencil/core';\r\n\r\n@Component({\r\n tag: 'kritzel-font',\r\n styleUrl: 'kritzel-font.css',\r\n shadow: true,\r\n})\r\nexport class KritzelFont {\r\n @Prop()\r\n fontFamily: string = 'Arial, sans-serif';\r\n\r\n @Prop()\r\n size: number = 24;\r\n\r\n @Prop()\r\n color: string = '#000000';\r\n\r\n render() {\r\n return (\r\n <Host>\r\n <div\r\n class=\"font-preview\"\r\n style={{\r\n fontFamily: this.fontFamily,\r\n fontSize: `${this.size}px`,\r\n color: this.color\r\n }}\r\n >\r\n A\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: flex; \r\n align-items: flex-start; \r\n gap: 8px; \r\n padding: 8px; \r\n box-sizing: border-box; \r\n width: 100%;\r\n}\r\n\r\n.font-style-button {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 42px;\r\n height: 32px;\r\n padding: 0;\r\n border: none;\r\n outline: none;\r\n background: none;\r\n cursor: pointer;\r\n border-radius: 0; \r\n color: var(--control-text-color);\r\n font-weight: bold;\r\n -webkit-tap-highlight-color: transparent;\r\n}\r\n\r\n.font-style-button:not(:last-child) {\r\n border-right: 1px solid #333333; \r\n}\r\n\r\n.font-style-button:hover {\r\n background-color: var(--control-hover-bg);\r\n}\r\n\r\n.font-style-button:active {\r\n background-color: var(--control-active-bg);\r\n}\r\n\r\n.font-style-button.selected,\r\n.font-style-button.selected:hover,\r\n.font-style-button.selected:active {\r\n background-color: var(--control-selected-bg);\r\n color: var(--control-selected-color);\r\n}\r\n\r\n.font-style-button.italic-text {\r\n font-style: italic;\r\n}\r\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\r\n\r\nexport interface FontOption {\r\n value: string;\r\n label: string;\r\n}\r\n\r\n@Component({\r\n tag: 'kritzel-font-family',\r\n styleUrl: 'kritzel-font-family.css',\r\n shadow: true,\r\n})\r\nexport class KritzelFontFamily {\r\n @Prop() \r\n fontOptions: FontOption[] = [\r\n { value: 'arial', label: 'Arial' },\r\n { value: 'verdana', label: 'Verdana' },\r\n { value: 'helvetica', label: 'Helvetica' },\r\n { value: 'tahoma', label: 'Tahoma' },\r\n { value: 'trebuchet ms', label: 'Trebuchet MS' },\r\n { value: 'times new roman', label: 'Times New Roman' },\r\n { value: 'georgia', label: 'Georgia' },\r\n { value: 'garamond', label: 'Garamond' },\r\n { value: 'courier new', label: 'Courier New' },\r\n { value: 'brush script mt', label: 'Brush Script MT' },\r\n ];\r\n\r\n @Prop({ mutable: true }) \r\n selectedFontFamily: string;\r\n\r\n @Event()\r\n fontFamilyChange: EventEmitter<string>;\r\n\r\n componentWillLoad() {\r\n if (this.fontOptions && this.fontOptions.length > 0) {\r\n const isValidCurrentFont = this.fontOptions.some(opt => opt.value === this.selectedFontFamily);\r\n if (!this.selectedFontFamily || !isValidCurrentFont) {\r\n this.selectedFontFamily = this.fontOptions[0].value;\r\n }\r\n }\r\n }\r\n\r\n private handleDropdownValueChange = (event: CustomEvent<string>) => {\r\n this.fontFamilyChange.emit(event.detail);\r\n };\r\n\r\n render() {\r\n const dropdownOptions = this.fontOptions.map(option => ({\r\n value: option.value,\r\n label: option.label,\r\n style: { fontFamily: option.value },\r\n }));\r\n\r\n return (\r\n <Host>\r\n <kritzel-dropdown\r\n options={dropdownOptions}\r\n value={this.selectedFontFamily}\r\n onValueChanged={this.handleDropdownValueChange}\r\n selectStyles={{ fontFamily: this.selectedFontFamily }}\r\n >\r\n <button class=\"font-style-button\" slot=\"suffix\">B</button>\r\n <button class=\"font-style-button italic-text\" slot=\"suffix\">I</button>\r\n </kritzel-dropdown>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 8px;\r\n padding: 8px;\r\n box-sizing: border-box;\r\n}\r\n\r\n.size-container {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n border: 2px solid transparent;\r\n box-sizing: border-box;\r\n border-radius: 50%;\r\n}\r\n\r\n.size-container:hover {\r\n background-color: var(--kritzel-font-size-hover-background-color, #f0f0f0);\r\n}\r\n\r\n.size-container.selected {\r\n border-color: var(--kritzel-selection-border-color, #0E1111);\r\n background-color: var(--kritzel-font-size-selected-background-color, #e0e0e0);\r\n}\r\n\r\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\r\n\r\n@Component({\r\n tag: 'kritzel-font-size',\r\n styleUrl: 'kritzel-font-size.css',\r\n shadow: true,\r\n})\r\nexport class KritzelFontSize {\r\n @Prop()\r\n sizes: number[] = [8, 10, 12, 16, 20, 24];\r\n\r\n @Prop({ mutable: true })\r\n selectedSize: number | null = null;\r\n\r\n @Prop()\r\n fontFamily: string = 'Arial';\r\n\r\n @Event()\r\n sizeChange: EventEmitter<number>;\r\n\r\n private handleSizeClick(size: number) {\r\n this.selectedSize = size;\r\n this.sizeChange.emit(size);\r\n }\r\n\r\n render() {\r\n return (\r\n <Host>\r\n {this.sizes.map(size => (\r\n <div\r\n class={{\r\n 'size-container': true,\r\n 'selected': this.selectedSize === size,\r\n }}\r\n onClick={() => this.handleSizeClick(size)}\r\n >\r\n <kritzel-font fontFamily={this.fontFamily} size={size}></kritzel-font>\r\n </div>\r\n ))}\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: inline-flex; /* Changed from block to inline-flex for better alignment */\r\n justify-content: center; /* Center content horizontally */\r\n align-items: center; /* Center content vertically */\r\n}\r\n\r\nspan {\r\n display: flex;\r\n align-items: center;\r\n width: 100%; /* Make span fill host width */\r\n height: 100%; /* Make span fill host height */\r\n}\r\n\r\nspan > svg { /* Ensure SVG scales within the span */\r\n width: 100%;\r\n height: 100%;\r\n}\r\n","import { Component, h, Prop, Host } from '@stencil/core';\r\nimport { KritzelIconRegistry } from '../../../classes/registries/icon-registry.class';\r\n\r\n@Component({\r\n tag: 'kritzel-icon',\r\n styleUrl: 'kritzel-icon.css',\r\n shadow: true,\r\n})\r\nexport class KritzelIcon {\r\n @Prop()\r\n name: string;\r\n\r\n @Prop()\r\n label?: string;\r\n\r\n @Prop()\r\n size: number = 24;\r\n\r\n render() {\r\n const svgContent = KritzelIconRegistry.get(this.name);\r\n\r\n if (!svgContent) {\r\n console.error(`[kritzel-icon] Icon \"${this.name}\" not found in registry.`);\r\n return <span class=\"error-icon\" aria-label={`Error: Icon ${this.name} not found`}>?</span>;\r\n }\r\n\r\n const styles = {\r\n width: `${this.size}px`,\r\n height: `${this.size}px`,\r\n };\r\n\r\n return (\r\n <Host style={styles}>\r\n <span\r\n aria-hidden={!this.label}\r\n role={this.label ? 'img' : undefined}\r\n aria-label={this.label}\r\n innerHTML={svgContent}\r\n ></span>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 8px;\r\n padding: 8px;\r\n box-sizing: border-box;\r\n}\r\n\r\n.size-container {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n border: 2px solid transparent;\r\n box-sizing: border-box;\r\n}\r\n\r\n.size-container:hover {\r\n background-color: var(--kritzel-stroke-size-hover-background-color, #f0f0f0);\r\n}\r\n\r\n.size-container.selected {\r\n border-color: var(--kritzel-selection-border-color, #0E1111);\r\n background-color: var(--kritzel-stroke-size-selected-background-color, #f0f0f0);\r\n}\r\n","import { Component, Host, h, Prop, Event, EventEmitter } from '@stencil/core';\r\n\r\n@Component({\r\n tag: 'kritzel-stroke-size',\r\n styleUrl: 'kritzel-stroke-size.css',\r\n shadow: true,\r\n})\r\nexport class KritzelStrokeSize {\r\n @Prop() \r\n sizes: number[] = [4, 6, 8, 12, 16, 24];\r\n\r\n @Prop({ mutable: true }) \r\n selectedSize: number | null = null;\r\n\r\n @Event() \r\n sizeChange: EventEmitter<number>;\r\n\r\n private handleSizeClick(size: number) {\r\n this.selectedSize = size;\r\n this.sizeChange.emit(size);\r\n }\r\n\r\n render() {\r\n return (\r\n <Host>\r\n {this.sizes.map(size => (\r\n <div\r\n class={{\r\n 'size-container': true,\r\n 'selected': this.selectedSize === size,\r\n }}\r\n onClick={() => this.handleSizeClick(size)}\r\n >\r\n <kritzel-color value='#000000' size={size}></kritzel-color>\r\n </div>\r\n ))}\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n width: auto;\r\n}\r\n\r\n.tooltip-content {\r\n position: relative;\r\n padding: 8px 12px;\r\n border-radius: 4px;\r\n width: fit-content;\r\n background-color: var(--kritzel-controls-tooltip-background-color, #ffffff);\r\n color: var(--kritzel-controls-tooltip-color, #000000);\r\n padding: var(--kritzel-controls-tooltip-padding, 8px);\r\n border-radius: var(--kritzel-controls-tooltip-border-radius, 16px);\r\n white-space: nowrap;\r\n box-shadow: var(--kritzel-controls-tooltip-box-shadow, 0 1px 6px rgba(0, 0, 0, 0.12));\r\n}\r\n\r\n","import { Component, Host, Prop, h, Element, State, Listen } from '@stencil/core';\r\n\r\nconst MOBILE_BREAKPOINT = 768;\r\n\r\n@Component({\r\n tag: 'kritzel-tooltip',\r\n styleUrl: 'kritzel-tooltip.css',\r\n shadow: true,\r\n})\r\nexport class KritzelTooltip {\r\n @Prop()\r\n isVisible: boolean = false;\r\n\r\n @Prop()\r\n anchorElement: HTMLElement;\r\n\r\n @Prop()\r\n arrowSize: number = 8;\r\n\r\n @Prop()\r\n offsetY: number = 24;\r\n\r\n @Element()\r\n el: HTMLElement;\r\n\r\n @State()\r\n positionX: number = 0;\r\n\r\n @State()\r\n arrowOffset: string = '0px';\r\n\r\n @State()\r\n private isMobileView: boolean = window.innerWidth < MOBILE_BREAKPOINT;\r\n\r\n @Listen('resize', { target: 'window' })\r\n handleWindowResize() {\r\n this.isMobileView = window.innerWidth < MOBILE_BREAKPOINT;\r\n this.calculateAdjustedPosition();\r\n }\r\n\r\n componentWillLoad() {\r\n this.isMobileView = window.innerWidth < MOBILE_BREAKPOINT;\r\n this.calculateAdjustedPosition();\r\n }\r\n\r\n componentWillUpdate() {\r\n this.calculateAdjustedPosition();\r\n }\r\n\r\n private calculateAdjustedPosition() {\r\n if (this.isVisible && this.anchorElement) {\r\n const anchorRect = this.anchorElement.getBoundingClientRect();\r\n const tooltipContent = this.el.shadowRoot?.querySelector('.tooltip-content') as HTMLElement;\r\n\r\n if (!this.isMobileView) {\r\n this.positionX = anchorRect.left + anchorRect.width / 2;\r\n this.arrowOffset = `calc(${50}% - ${this.arrowSize}px)`; \r\n } else {\r\n const tooltipRect = tooltipContent.getBoundingClientRect();\r\n this.positionX = anchorRect.left + anchorRect.width / 2 - tooltipRect.width / 2;\r\n this.arrowOffset = `${anchorRect.left + anchorRect.width / 2 - tooltipRect.left - this.arrowSize}px`;\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n <Host\r\n style={{\r\n position: 'fixed',\r\n zIndex: '9999',\r\n transition: 'opacity 0.3s ease-in-out, transform 0.3s ease-in-out',\r\n visibility: this.isVisible ? 'visible' : 'hidden',\r\n left: !this.isMobileView ? `${this.positionX}px` : '50%',\r\n marginBottom: `${this.offsetY + this.arrowSize}px`,\r\n }}\r\n >\r\n <div class=\"tooltip-content\" onClick={event => event.stopPropagation()}>\r\n <slot></slot>\r\n <div\r\n class=\"tooltip-arrow-wrapper\"\r\n style={{\r\n position: 'fixed',\r\n left: this.arrowOffset,\r\n bottom: `-${this.arrowSize * 2}px`,\r\n }}\r\n >\r\n <div\r\n class=\"tooltip-arrow\"\r\n style={{\r\n borderLeft: `${this.arrowSize}px solid transparent`,\r\n borderRight: `${this.arrowSize}px solid transparent`,\r\n borderTop: `${this.arrowSize}px solid var(--kritzel-controls-tooltip-background-color, #ffffff)`,\r\n filter: 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2))',\r\n }}\r\n ></div>\r\n <div\r\n class=\"tooltip-arrow-rect\"\r\n style={{\r\n position: 'relative',\r\n width: `${this.arrowSize * 2}px`,\r\n height: `${this.arrowSize}px`,\r\n backgroundColor: 'var(--kritzel-controls-tooltip-background-color, #ffffff)',\r\n bottom: `${this.arrowSize * 2}px`,\r\n }}\r\n ></div>\r\n </div>\r\n </div>\r\n </Host>\r\n );\r\n }\r\n}\r\n",":host {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n padding: 4px;\r\n gap: 8px;\r\n border-top-left-radius: 12px;\r\n border-top-right-radius: 12px;\r\n background-color: rgb(226, 226, 226);\r\n width: fit-content;\r\n user-select: none;\r\n}\r\n\r\n.utility-button {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 8px 4px;\r\n border: none;\r\n outline: none;\r\n background: none;\r\n cursor: pointer;\r\n color: #333333;\r\n -webkit-tap-highlight-color: transparent;\r\n}\r\n\r\n.utility-separator {\r\n width: 1px;\r\n height: 16px;\r\n background-color: hsl(0, 0%, 0%, 4.3%);\r\n}","import { Component, Host, h, Event, EventEmitter } from '@stencil/core';\r\n\r\n@Component({\r\n tag: 'kritzel-utility-panel',\r\n styleUrl: 'kritzel-utility-panel.css',\r\n shadow: true,\r\n})\r\nexport class KritzelUtilityPanel {\r\n @Event()\r\n undo: EventEmitter<void>;\r\n\r\n @Event()\r\n redo: EventEmitter<void>;\r\n\r\n @Event()\r\n delete: EventEmitter<void>;\r\n\r\n handleUndo(event: Event) {\r\n if (event.cancelable) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.undo.emit();\r\n }\r\n }\r\n\r\n handleRedo(event: Event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.redo.emit();\r\n }\r\n\r\n render() {\r\n return (\r\n <Host>\r\n <button class=\"utility-button\" onClick={event => this.handleUndo(event)}>\r\n <kritzel-icon name=\"undo\"></kritzel-icon>\r\n </button>\r\n <button class=\"utility-button\" onClick={event => this.handleRedo(event)}>\r\n <kritzel-icon name=\"redo\"></kritzel-icon>\r\n </button>\r\n\r\n <div class=\"utility-separator\"></div>\r\n\r\n <button class=\"utility-button\">\r\n <kritzel-icon name=\"delete\" onClick={() => this.delete.emit()}></kritzel-icon>\r\n </button>\r\n </Host>\r\n );\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|