kritzel-stencil 0.3.27 → 0.3.28
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/kritzel-active-users_45.cjs.entry.js +7 -1
- package/dist/collection/classes/structures/object-map.structure.js +6 -0
- package/dist/collection/constants/version.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/kritzel-editor.js +1 -1
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/kritzel-settings.js +1 -1
- package/dist/components/{p-ioK7ttPL.js → p-BTQiMSqa.js} +1 -1
- package/dist/components/{p-G3xSPZ0x.js → p-DCULDfp3.js} +1 -1
- package/dist/esm/kritzel-active-users_45.entry.js +7 -1
- package/dist/stencil/p-f92b70ae.entry.js +9 -0
- package/dist/stencil/stencil.esm.js +1 -1
- package/dist/types/constants/version.d.ts +1 -1
- package/package.json +1 -1
- package/dist/stencil/p-9ca04088.entry.js +0 -9
|
@@ -6,4 +6,4 @@ import{p as t,H as e,c as n,h as i,d as r,t as s}from"./p-B43upypT.js";import{K
|
|
|
6
6
|
* Released under MIT license <https://lodash.com/license>
|
|
7
7
|
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|
8
8
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|
9
|
-
*/class ne{_core;_debounceUpdate;_debounceEndScaling;_animationFrameId=null;initialTouchDistance=0;startX=0;startY=0;static TOUCH_CURSOR_BROADCAST_THRESHOLD=5;_touchStartScreenX=0;_touchStartScreenY=0;_touchCursorBroadcastActive=!1;constructor(t,e){this._core=t,this._core.store.state.host=e,this._core.store.state.viewportWidth=e.clientWidth,this._core.store.state.viewportHeight=e.clientHeight,this._core.store.state.startX=0,this._core.store.state.startY=0,this._core.store.state.translateX=0,this._core.store.state.translateY=0,this._debounceUpdate=ee.debounce((()=>{this._core.updateWorkspaceViewport(this._core.store.state.translateX,this._core.store.state.translateY,this._core.store.state.scale)}),300),this._debounceEndScaling=ee.debounce((()=>{this._core.store.state.isScaling=!1,this._core.rerender()}),100)}cancelPendingUpdates(){this._debounceUpdate.cancel()}clampTranslate(t,e){const n=this._core.store.state,{scale:i,viewportWidth:r,viewportHeight:s}=n,{viewportBoundaryLeft:o,viewportBoundaryRight:a,viewportBoundaryTop:c,viewportBoundaryBottom:l}=n,h=-o*i,u=r-a*i,f=-c*i,d=s-l*i;let p=t,g=e;return Number.isFinite(u)&&Number.isFinite(h)?p=Math.max(u,Math.min(h,t)):Number.isFinite(u)?p=Math.max(u,t):Number.isFinite(h)&&(p=Math.min(h,t)),Number.isFinite(d)&&Number.isFinite(f)?g=Math.max(d,Math.min(f,e)):Number.isFinite(d)?g=Math.max(d,e):Number.isFinite(f)&&(g=Math.min(f,e)),{translateX:p,translateY:g}}getEffectiveMinScale(){const t=this._core.store.state,{viewportWidth:e,viewportHeight:n,scaleMin:i}=t,{viewportBoundaryLeft:r,viewportBoundaryRight:s,viewportBoundaryTop:o,viewportBoundaryBottom:a}=t,c=s-r,l=a-o;if(!Number.isFinite(c)||!Number.isFinite(l))return i;const h=Math.max(c>0?e/c:i,l>0?n/l:i);return Math.max(i,h)}handleResize(){this._core.store.state.viewportWidth=this._core.store.host.clientWidth,this._core.store.state.viewportHeight=this._core.store.host.clientHeight,this._core.store.state.hasViewportChanged=!0,this._core.rerender()}handlePointerDown(t){if(this.cancelViewportAnimation(),"mouse"===t.pointerType){const e=t.clientX-this._core.store.offsetX,n=t.clientY-this._core.store.offsetY;t.button===o.Right&&(this._core.store.state.isPanning=!0,this._core.store.state.startX=e,this._core.store.state.startY=n)}if("touch"===t.pointerType||"pen"===t.pointerType){const e=Array.from(this._core.store.state.pointers.values());if(1===e.length&&(this._touchStartScreenX=t.clientX,this._touchStartScreenY=t.clientY,this._touchCursorBroadcastActive=!1),2===e.length){this._core.store.objects?.clearCursorPosition();const t=this._core.store.currentPath;t&&this._core.store.objects.remove((e=>e.id===t.id)),this._core.store.state.isSelecting&&(this._core.store.state.isSelecting=!1,this._core.store.objects.remove((t=>t instanceof g)),this._core.store.setSelectionBox(null),this._core.store.selectedObjects.forEach((t=>{t.isSelected=!1}))),this._core.store.state.isScaling=!0;const n=e[0].clientX-this._core.store.offsetX,i=e[0].clientY-this._core.store.offsetY,r=e[1].clientX-this._core.store.offsetX,s=e[1].clientY-this._core.store.offsetY;this.initialTouchDistance=Math.sqrt(Math.pow(n-r,2)+Math.pow(i-s,2)),this.startX=(n+r)/2,this.startY=(i+s)/2,this._core.rerender()}}}handlePointerMove(t){if("mouse"===t.pointerType){const e=this._core.store.host.getBoundingClientRect(),n=t.clientX-e.left,i=t.clientY-e.top;if(this._core.store.state.pointerX=(n-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(i-this._core.store.state.translateY)/this._core.store.state.scale,this._core.store.objects?.updateCursorPosition(this._core.store.state.pointerX,this._core.store.state.pointerY),this._core.store.state.isPanning){const t=this.clampTranslate(this._core.store.state.translateX+(n-this._core.store.state.startX),this._core.store.state.translateY+(i-this._core.store.state.startY));this._core.store.state.translateX=t.translateX,this._core.store.state.translateY=t.translateY,this._core.store.state.startX=n,this._core.store.state.startY=i,this._core.store.state.hasViewportChanged=!0,this._core.store.state.skipContextMenu=!0,this._core.rerender(),this._debounceUpdate()}}if("touch"===t.pointerType||"pen"===t.pointerType){const e=this._core.store.host.getBoundingClientRect(),n=t.clientX-e.left,i=t.clientY-e.top,r=Array.from(this._core.store.state.pointers.values());if(this._core.store.state.isScaling||r.length>1)this._core.store.objects?.clearCursorPosition();else{if(this._core.store.state.pointerX=(n-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(i-this._core.store.state.translateY)/this._core.store.state.scale,!this._touchCursorBroadcastActive){const e=t.clientX-this._touchStartScreenX,n=t.clientY-this._touchStartScreenY;Math.sqrt(e*e+n*n)>=ne.TOUCH_CURSOR_BROADCAST_THRESHOLD&&(this._touchCursorBroadcastActive=!0)}this._touchCursorBroadcastActive&&this._core.store.objects?.updateCursorPosition(this._core.store.state.pointerX,this._core.store.state.pointerY)}if(2===r.length){const t=r[0].clientX-this._core.store.offsetX,e=r[0].clientY-this._core.store.offsetY,n=r[1].clientX-this._core.store.offsetX,i=r[1].clientY-this._core.store.offsetY,s=Math.sqrt(Math.pow(t-n,2)+Math.pow(e-i,2)),o=(t+n)/2,a=(e+i)/2,c=s/this.initialTouchDistance,l=this._core.store.state.scale*c,h=this.getEffectiveMinScale();if(l>this._core.store.state.scaleMax||l<h){const t=this.clampTranslate(this._core.store.state.translateX+o-this.startX,this._core.store.state.translateY+a-this.startY);this._core.store.state.translateX=t.translateX,this._core.store.state.translateY=t.translateY}else{const t=this._core.store.state.translateX+o-this.startX-(o-this._core.store.state.translateX)*(c-1),e=this._core.store.state.translateY+a-this.startY-(a-this._core.store.state.translateY)*(c-1);this._core.store.state.scale=l;const n=this.clampTranslate(t,e);this._core.store.state.translateX=n.translateX,this._core.store.state.translateY=n.translateY,this.initialTouchDistance=s}this.startX=o,this.startY=a,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate()}}}handlePointerUp(t){"mouse"===t.pointerType&&this._core.store.state.isPanning&&(this._core.store.state.isPanning=!1,this._core.rerender()),"touch"!==t.pointerType&&"pen"!==t.pointerType||(this._touchCursorBroadcastActive=!1,0===this._core.store.state.pointers.size&&this._debounceEndScaling())}handleWheel(t){this.cancelViewportAnimation(),t.ctrlKey?this.handleZoom(t):this.handlePan(t)}getViewport(){const t=this._core.store.state;return{translateX:t.translateX,translateY:t.translateY,scale:t.scale,width:t.viewportWidth,height:t.viewportHeight}}screenToWorld(t,e){const n=this._core.store.state;return{x:(t-n.translateX)/n.scale,y:(e-n.translateY)/n.scale}}worldToScreen(t,e){const n=this._core.store.state;return{x:t*n.scale+n.translateX,y:e*n.scale+n.translateY}}setViewport(t,e,n){const i=this._core.store.state,r=Math.min(i.scaleMax,Math.max(this.getEffectiveMinScale(),n));this.animateViewportTo(i.viewportWidth/2-t*r,i.viewportHeight/2-e*r,r)}panTo(t,e){this.setViewport(t,e,this._core.store.state.scale)}zoomTo(t,e,n){const i=this._core.store.state;void 0!==e&&void 0!==n?this.setViewport(e,n,t):this.setViewport((i.viewportWidth/2-i.translateX)/i.scale,(i.viewportHeight/2-i.translateY)/i.scale,t)}zoomIn(t,e){this.animateZoomAroundViewportCenter(t,e)}zoomOut(t,e){this.animateZoomAroundViewportCenter(1/t,e)}animateZoomAroundViewportCenter(t,e){this.cancelViewportAnimation();const n=this._core.store.state,i=n.scale,r=this.getEffectiveMinScale(),s=Math.min(n.scaleMax,Math.max(r,i*t)),o=n.viewportWidth/2,a=n.viewportHeight/2,c=(o-n.translateX)/i,l=(a-n.translateY)/i;if(s===i||e<=0)return this.applyZoomAroundCenter(s,o,a,c,l),n.isScaling=!0,this._core.rerender(),this._debounceUpdate(),void this._debounceEndScaling();const h=performance.now();n.isScaling=!0;const u=t=>{const r=Math.min((t-h)/e,1),f=r<.5?4*r*r*r:1-Math.pow(-2*r+2,3)/2;this.applyZoomAroundCenter(i+(s-i)*f,o,a,c,l),this._core.rerender(),r<1?this._animationFrameId=requestAnimationFrame(u):(this._animationFrameId=null,n.isScaling=!1,this._core.rerender(),this._debounceUpdate())};this._animationFrameId=requestAnimationFrame(u)}applyZoomAroundCenter(t,e,n,i,r){const s=this._core.store.state;s.scale=t;const o=this.clampTranslate(e-i*t,n-r*t);s.translateX=o.translateX,s.translateY=o.translateY,s.hasViewportChanged=!0}centerInViewport(t){const{scale:e,viewportWidth:n,viewportHeight:i}=this._core.store.state,{x:r,y:s,width:o,height:a}=t.rotatedBoundingBox,c=this.clampTranslate(n/2-(r+o/2)*e,i/2-(s+a/2)*e);this._core.store.state.translateX=c.translateX,this._core.store.state.translateY=c.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate()}centerFitInViewport(t){const e=Math.min(this._core.store.state.viewportWidth/(1.1*t.rotatedBoundingBox.width),this._core.store.state.viewportHeight/(1.1*t.rotatedBoundingBox.height),this._core.store.state.scaleMax),n=Math.max(e,this.getEffectiveMinScale());this._core.store.state.scale=n,this.centerInViewport(t)}centerFitInViewportIfNeeded(t){const e=Math.min(this._core.store.state.viewportWidth/(1.1*t.rotatedBoundingBox.width),this._core.store.state.viewportHeight/(1.1*t.rotatedBoundingBox.height),this._core.store.state.scaleMax),n=Math.max(e,this.getEffectiveMinScale());n<this._core.store.state.scale&&(this._core.store.state.scale=n),this.centerInViewport(t)}fitInViewportIfNeeded(t){const e=Math.min(this._core.store.state.viewportWidth/(1.1*t.rotatedBoundingBox.width),this._core.store.state.viewportHeight/(1.1*t.rotatedBoundingBox.height),this._core.store.state.scaleMax),n=Math.max(e,this.getEffectiveMinScale());n<this._core.store.state.scale&&(this._core.store.state.scale=n,this.centerInViewport(t))}bringIntoViewIfNeeded(t){const{scale:e,translateX:n,translateY:i,viewportWidth:r,viewportHeight:s}=this._core.store.state,o=t.rotatedBoundingBox;if(o.x*e+n>=0&&o.y*e+i>=0&&(o.x+o.width)*e+n<=r&&(o.y+o.height)*e+i<=s)return;const a=Math.min(r/(1.1*o.width),s/(1.1*o.height),this._core.store.state.scaleMax),c=Math.max(a,this.getEffectiveMinScale()),l=Math.min(c,e),h=this.clampTranslate(r/2-(o.x+o.width/2)*l,s/2-(o.y+o.height/2)*l);this.animateViewportTo(h.translateX,h.translateY,l)}handleZoom(t){this._core.store.state.isScaling=!0;const e=this._core.store.host.getBoundingClientRect(),n=t.clientX-e.left,i=t.clientY-e.top;this._core.store.state.pointerX=(n-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(i-this._core.store.state.translateY)/this._core.store.state.scale,this._core.store.objects?.updateCursorPosition(this._core.store.state.pointerX,this._core.store.state.pointerY);const r=Math.max(.8,Math.min(1.2,1+-.012*t.deltaY)),s=this.getEffectiveMinScale(),o=Math.min(this._core.store.state.scaleMax,Math.max(s,this._core.store.state.scale*r)),a=o/this._core.store.state.scale,c=(n-this._core.store.state.translateX)*(a-1),l=(i-this._core.store.state.translateY)*(a-1);this._core.store.state.scale=o;let h=this._core.store.state.translateX-c;0!==t.deltaX&&(h-=.8*t.deltaX);const u=this.clampTranslate(h,this._core.store.state.translateY-l);this._core.store.state.translateX=u.translateX,this._core.store.state.translateY=u.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate(),this._debounceEndScaling()}handlePan(t){const e=this.clampTranslate(this._core.store.state.translateX-.8*t.deltaX,this._core.store.state.translateY-.8*t.deltaY);this._core.store.state.translateX=e.translateX,this._core.store.state.translateY=e.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate()}cancelViewportAnimation(){null!==this._animationFrameId&&(cancelAnimationFrame(this._animationFrameId),this._animationFrameId=null)}animateViewportTo(t,e,n,i=150){this.cancelViewportAnimation();const r=this._core.store.state.translateX,s=this._core.store.state.translateY,o=this._core.store.state.scale,a=performance.now();this._core.store.state.isScaling=!0;const c=l=>{const h=Math.min((l-a)/i,1),u=1-Math.pow(1-h,3);this._core.store.state.scale=o+(n-o)*u;const f=this.clampTranslate(r+(t-r)*u,s+(e-s)*u);this._core.store.state.translateX=f.translateX,this._core.store.state.translateY=f.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),h<1?this._animationFrameId=requestAnimationFrame(c):(this._animationFrameId=null,this._core.store.state.isScaling=!1,this._core.rerender(),this._debounceUpdate())};this._animationFrameId=requestAnimationFrame(c)}centerFitNearestContent(t=20){const e=this._core.store.allNonSelectionObjects;if(0===e.length)return!1;const n=-this._core.store.state.translateX/this._core.store.state.scale+this._core.store.state.viewportWidth/2/this._core.store.state.scale,i=-this._core.store.state.translateY/this._core.store.state.scale+this._core.store.state.viewportHeight/2/this._core.store.state.scale,r=e.map((t=>{const e=t.rotatedBoundingBox,r=e.y+e.height/2;return{obj:t,distance:Math.sqrt(Math.pow(e.x+e.width/2-n,2)+Math.pow(r-i,2))}}));r.sort(((t,e)=>t.distance-e.distance));const s=r.slice(0,t).map((t=>t.obj));let o=1/0,a=1/0,c=-1/0,l=-1/0;for(const t of s){const e=t.rotatedBoundingBox;o=Math.min(o,e.x),a=Math.min(a,e.y),c=Math.max(c,e.x+e.width),l=Math.max(l,e.y+e.height)}const h=c-o,u=l-a,f=o+h/2,d=a+u/2,p=Math.min(this._core.store.state.viewportWidth/(1.1*h),this._core.store.state.viewportHeight/(1.1*u),this._core.store.state.scaleMax),g=Math.max(p,this.getEffectiveMinScale());return this.animateViewportTo(this._core.store.state.viewportWidth/2-f*g,this._core.store.state.viewportHeight/2-d*g,g),!0}centerFitObjects(t,e=!0){if(0===t.length)return!1;let n=1/0,i=1/0,r=-1/0,s=-1/0;for(const e of t){const t=e.rotatedBoundingBox;n=Math.min(n,t.x),i=Math.min(i,t.y),r=Math.max(r,t.x+t.width),s=Math.max(s,t.y+t.height)}const o=r-n,a=s-i,c=n+o/2,l=i+a/2,h=Math.min(this._core.store.state.viewportWidth/(1.1*o),this._core.store.state.viewportHeight/(1.1*a),this._core.store.state.scaleMax),u=Math.max(h,this.getEffectiveMinScale());return this.animateViewportTo(this._core.store.state.viewportWidth/2-c*u,this._core.store.state.viewportHeight/2-l*u,u,e?150:0),!0}centerFitAllObjects(t=!0){return this.centerFitObjects(this._core.store.allNonSelectionObjects,t)}}class ie extends v{shortcuts=[{key:"Escape",label:"Clear Selection",category:"General",condition:t=>!!t.store.activeText||!!t.store.activeShape||!!t.store.selectionGroup,action:t=>{t.store.activeText?t.store.activeText.handleEscape():t.store.activeShape?t.store.activeShape.handleEscape():t.clearSelection()}},{key:"Delete",label:"Delete Selected",category:"General",condition:t=>!!t.store.selectionGroup,action:t=>t.delete()},{key:"a",ctrl:!0,label:"Select All in Viewport",category:"General",action:t=>t.selectAllObjectsInViewport()},{key:"A",ctrl:!0,shift:!0,label:"Select All Objects",category:"General",action:t=>t.selectAllObjects()},{key:"z",ctrl:!0,label:"Undo",category:"Undo/Redo",action:t=>t.undo()},{key:"y",ctrl:!0,label:"Redo",category:"Undo/Redo",action:t=>t.redo()},{key:"1",ctrl:!0,label:"Tool 1",category:"Tool Selection",action:()=>this.switchToolByIndex(0)},{key:"2",ctrl:!0,label:"Tool 2",category:"Tool Selection",action:()=>this.switchToolByIndex(1)},{key:"3",ctrl:!0,label:"Tool 3",category:"Tool Selection",action:()=>this.switchToolByIndex(2)},{key:"4",ctrl:!0,label:"Tool 4",category:"Tool Selection",action:()=>this.switchToolByIndex(3)},{key:"5",ctrl:!0,label:"Tool 5",category:"Tool Selection",action:()=>this.switchToolByIndex(4)},{key:"6",ctrl:!0,label:"Tool 6",category:"Tool Selection",action:()=>this.switchToolByIndex(5)},{key:"7",ctrl:!0,label:"Tool 7",category:"Tool Selection",action:()=>this.switchToolByIndex(6)},{key:"8",ctrl:!0,label:"Tool 8",category:"Tool Selection",action:()=>this.switchToolByIndex(7)},{key:"9",ctrl:!0,label:"Tool 9",category:"Tool Selection",action:()=>this.switchToolByIndex(8)},{key:"+",ctrl:!0,label:"Bring Forward",category:"Object Layering",condition:t=>!!t.store.selectionGroup,action:t=>t.bringForward()},{key:"-",ctrl:!0,label:"Send Backward",category:"Object Layering",condition:t=>!!t.store.selectionGroup,action:t=>t.sendBackward()},{key:"*",shift:!0,label:"Bring to Front",category:"Object Layering",condition:t=>!!t.store.selectionGroup,action:t=>t.bringToFront()},{key:"_",shift:!0,label:"Send to Back",category:"Object Layering",condition:t=>!!t.store.selectionGroup,action:t=>t.sendToBack()},{key:"g",ctrl:!0,label:"Group",category:"Grouping",condition:t=>!!t.store.selectionGroup&&t.store.selectionGroup.objects.length>=2,action:t=>t.group()},{key:"G",ctrl:!0,shift:!0,label:"Ungroup",category:"Grouping",condition:t=>!!t.store.selectionGroup,action:t=>t.ungroup()},{key:"ArrowUp",label:"Move Object Up",category:"Movement",condition:t=>!!t.store.selectionGroup,action:t=>{t.store.selectionGroup.move(0,0,0,10),t.rerender()}},{key:"ArrowDown",label:"Move Object Down",category:"Movement",condition:t=>!!t.store.selectionGroup,action:t=>{t.store.selectionGroup.move(0,10,0,0),t.rerender()}},{key:"ArrowLeft",label:"Move Object Left",category:"Movement",condition:t=>!!t.store.selectionGroup,action:t=>{t.store.selectionGroup.move(0,0,10,0),t.rerender()}},{key:"ArrowRight",label:"Move Object Right",category:"Movement",condition:t=>!!t.store.selectionGroup,action:t=>{t.store.selectionGroup.move(10,0,0,0),t.rerender()}}];constructor(t){super(t)}switchToolByIndex(t){const e=this._core.toolRegistry.getToolByIndex(t);e&&(this._core.store.setState("activeTool",e),this._core.deselectAllObjects(),e.onActivate())}handleKeyDown(t){if(this._core.store.state.isCtrlKeyPressed=t.ctrlKey,(this._core.store.activeText||this._core.store.activeShape||this._core.store.activeInteractiveCustomElement)&&"Escape"!==t.key)return;const e=this.shortcuts.find((e=>e.key===t.key&&!!e.ctrl===t.ctrlKey&&!!e.shift===t.shiftKey&&(!e.condition||e.condition(this._core))));e&&(t.preventDefault(),e.action(this._core))}handleKeyUp(t){this._core.store.state.isCtrlKeyPressed=t.ctrlKey}getDisplayableShortcuts(){return this.shortcuts.map((({key:t,ctrl:e,shift:n,label:i,category:r})=>({key:t,ctrl:e,shift:n,label:i,category:r})))}}class re extends v{globalContextMenuItems=[];objectContextMenuItems=[];constructor(t,e,n){super(t),this.globalContextMenuItems=e,this.objectContextMenuItems=n}resolveLabels(t){return t.map((t=>({...t,label:this._core.localizationManager.translate(t.label),children:t.children?this.resolveLabels(t.children):void 0})))}getResolvedContextMenuItems(){return this.resolveLabels(this._core.store.selectionGroup?this.objectContextMenuItems:this.globalContextMenuItems)}handleContextMenu(t){if(!(this._core.store.state.activeTool instanceof w))return;if(this._core.store.state.skipContextMenu)return void(this._core.store.state.skipContextMenu=!1);const e=this._core.store.state.activeTool;e?.moveHandler?.cancelPendingDrag(),this._core.store.selectionBox&&(this._core.store.objects.remove((t=>t instanceof g)),this._core.store.setSelectionBox(null),this._core.store.state.isSelecting=!1);const n=this._core.getObjectFromPointerEvent(t,".object");if(n&&!(n instanceof h)&&!(n instanceof g)){const t=h.create(this._core);t.addOrRemove(n),t.isSelected=!0,t.rotation=n.rotation,this._core.store.state.isSelecting=!1,this._core.store.selectionGroup&&this._core.removeSelectionGroup(),this._core.addSelectionGroup(t),this._core.rerender()}this._core.store.state.contextMenuItems=this.getResolvedContextMenuItems();const i=t.clientX-this._core.store.offsetX,r=t.clientY-this._core.store.offsetY,{translateX:s,translateY:o,scale:a}=this._core.store.state;this._core.store.state.contextMenuWorldX=(i-s)/a,this._core.store.state.contextMenuWorldY=(r-o)/a;let c=i,l=r;c+150>this._core.store.state.viewportWidth-10&&(c=this._core.store.state.viewportWidth-150-10),c=Math.max(10,c),l=Math.max(10,l),this._core.store.state.contextMenuX=c,this._core.store.state.contextMenuY=l,this._core.store.state.isContextMenuVisible=!0,this._core.store.state.isEnabled=!1,this._core.rerender()}open(t){const{x:e,y:n,objectId:i}=t;if(this._core.store.state.activeTool instanceof w){const t=this._core.store.state.activeTool;t?.moveHandler?.cancelPendingDrag()}if(this._core.store.selectionBox&&(this._core.store.objects.remove((t=>t instanceof g)),this._core.store.setSelectionBox(null),this._core.store.state.isSelecting=!1),i){const t=this._core.store.allObjects.find((t=>t.id===i));if(t&&!(t instanceof h)&&!(t instanceof g)){const e=h.create(this._core);e.addOrRemove(t),e.isSelected=!0,e.rotation=t.rotation,this._core.store.state.isSelecting=!1,this._core.store.selectionGroup&&this._core.removeSelectionGroup(),this._core.addSelectionGroup(e)}}this._core.store.state.contextMenuItems=this.getResolvedContextMenuItems(),this._core.store.state.contextMenuWorldX=e,this._core.store.state.contextMenuWorldY=n;const{translateX:r,translateY:s,scale:o}=this._core.store.state;let a=e*o+r,c=n*o+s;a+150>this._core.store.state.viewportWidth-10&&(a=this._core.store.state.viewportWidth-150-10),a=Math.max(10,a),c=Math.max(10,c),this._core.store.state.contextMenuX=a,this._core.store.state.contextMenuY=c,this._core.store.state.isContextMenuVisible=!0,this._core.store.state.isEnabled=!1,this._core.rerender()}}class se{_core;constructor(t){this._core=t}revive(t){if(t&&"object"==typeof t){if(t.__class__){let e;switch(t.__class__){case"KritzelPath":e=_.create(this._core).deserialize(t);break;case"KritzelLine":e=L.create(this._core).deserialize(t);break;case"KritzelText":e=b.create(this._core,t.fontSize,t.fontFamily).deserialize(t);break;case"KritzelShape":e=d.create(this._core,{shapeType:t.shapeType,fillColor:t.fillColor,strokeColor:t.strokeColor,strokeWidth:t.strokeWidth,fontSize:t.fontSize,fontFamily:t.fontFamily,fontColor:t.fontColor}).deserialize(t);break;case"KritzelImage":e=u.create(this._core).deserialize(t);break;case"KritzelCustomElement":e=Z.create(this._core).deserialize(t);break;case"KritzelSelectionGroup":e=h.create(this._core).deserialize(t);break;case"KritzelGroup":e=y.create(this._core).deserialize(t);break;case"KritzelWorkspace":e=T.create(this._core,t).deserialize(t);break;case"KritzelBrushTool":e=new q(this._core);break;case"KritzelEraserTool":e=new tt(this._core);break;case"KritzelImageTool":e=new Lt(this._core);break;case"KritzelSelectionTool":e=new w(this._core);break;case"KritzelTextTool":e=new m(this._core);break;case"KritzelLineTool":e=new J(this._core);break;case"KritzelShapeTool":e=new Ot(this._core);break;default:e=t}return e}const e=Array.isArray(t)?[]:{};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=this.revive(t[n]));return e}return t}}const oe={activeWorkspace:void 0,activeTool:null,objects:null,snapCandidate:null,snapPreviewCandidate:null,resizeHandleType:null,lineHandleType:null,hasViewportChanged:!1,hasObjectsChanged:!1,isReady:!1,isEnabled:!0,isScaling:!1,isPanning:!1,isSelecting:!1,isResizing:!1,isResizeHandleHovered:!1,isResizeHandleSelected:!1,isRotating:!1,isRotationHandleHovered:!1,isRotationHandleSelected:!1,isLineHandleSelected:!1,isLineHandleDragging:!1,isDragging:!1,isDrawing:!1,isErasing:!1,isWriting:!1,isLoading:!1,isCtrlKeyPressed:!1,isContextMenuVisible:!1,contextMenuItems:[],contextMenuX:0,contextMenuY:0,contextMenuWorldX:0,contextMenuWorldY:0,skipContextMenu:!1,debugInfo:{showObjectInfo:!1,showViewportInfo:!1,showSyncProviderInfo:!1,showAssetResolverInfo:!1,showMigrationInfo:!1},host:null,pointerX:0,pointerY:0,scale:1,scaleMax:1,scaleMin:1,startX:0,startY:0,translateX:0,translateXMax:400,translateXMin:0,translateY:0,translateYMax:400,translateYMin:0,viewportWidth:0,viewportHeight:0,longTouchTimeout:null,longTouchDelay:300,pointers:new Map,workspaces:[],cursor:{icon:"default",iconActive:"default"},lockDrawingScale:!0,viewportBoundaryLeft:-1/0,viewportBoundaryRight:1/0,viewportBoundaryTop:-1/0,viewportBoundaryBottom:1/0};class ae{static calculateSelectionBounds(t){const e=t.map((t=>t.rotatedBoundingBox));return{minX:Math.min(...e.map((t=>t.x))),minY:Math.min(...e.map((t=>t.y))),maxX:Math.max(...e.map((t=>t.x+t.width))),maxY:Math.max(...e.map((t=>t.y+t.height)))}}static calculateAlignedPositions(t,e){const n=new Map;if(t.length<2)return n;const i=this.calculateSelectionBounds(t);for(const r of t){const t=r.rotatedBoundingBox;let s=r.translateX,o=r.translateY;const a=t.x-r.translateX,c=t.y-r.translateY;switch(e){case Gt.StartHorizontal:s=i.minX-a;break;case Gt.CenterHorizontal:s=r.translateX+((i.minX+i.maxX)/2-(t.x+t.width/2));break;case Gt.EndHorizontal:s=r.translateX+(i.maxX-(t.x+t.width));break;case Gt.StartVertical:o=i.minY-c;break;case Gt.CenterVertical:o=r.translateY+((i.minY+i.maxY)/2-(t.y+t.height/2));break;case Gt.EndVertical:o=r.translateY+(i.maxY-(t.y+t.height))}n.set(r.id,{translateX:s,translateY:o})}return n}}class ce{core;registry={};constructor(t){this.core=t}registerTool(t,e){const n=new e(this.core);return n.name=t,this.registry[t]=n,n}hasTool(t){return t in this.registry}getTool(t){return this.registry[t]||(console.warn(`Unknown tool: ${t}`),null)}getToolByIndex(t){return Object.values(this.registry)[t]??null}}class le{bounds;capacity;objects=[];children=null;_size=0;get size(){return this._size}constructor(t,e=16){this.bounds=t,this.capacity=e}reset(){this.objects=[],this.children=null,this._size=0}insert(t){if(!this.intersects(t.rotatedBoundingBox,this.bounds))return!1;if(this.objects.length<this.capacity&&null===this.children)return this.objects.push(t),this._size++,!0;null===this.children&&this.subdivide();for(const e of this.children)if(e.insert(t))return this._size++,!0;return!1}update(t){const e=this.objects.findIndex((e=>e.id===t.id));if(-1!==e)return this.objects[e]=t,!0;if(null!==this.children)for(const e of this.children)if(e.update(t))return!0;return!1}remove(t){let e=0;const n=this.objects.findIndex((e=>t(e)));if(-1!==n&&(this.objects.splice(n,1),e++),null!==this.children)for(const n of this.children)e+=n.remove(t);return this._size-=e,e}query(t){const e=[];return this._queryInto(t,e),e}_queryInto(t,e){if(this.intersects(t,this.bounds)){for(const n of this.objects)this.intersects(n.rotatedBoundingBox,t)&&e.push(n);if(null!==this.children)for(const n of this.children)n._queryInto(t,e)}}filter(t){const e=[];return this._filterInto(t,e),e}_filterInto(t,e){for(const n of this.objects)t(n)&&e.push(n);if(null!==this.children)for(const n of this.children)n._filterInto(t,e)}allObjects(){const t=[];return this._collectAllInto(t),t}_collectAllInto(t){for(const e of this.objects)t.push(e);if(null!==this.children)for(const e of this.children)e._collectAllInto(t)}subdivide(){const{x:t,y:e,z:n,width:i,height:r}=this.bounds,s=i/2,o=r/2;this.children=[new le({x:t,y:e,z:n,width:s,height:o},this.capacity),new le({x:t+s,y:e,z:n,width:s,height:o},this.capacity),new le({x:t,y:e+o,z:n,width:s,height:o},this.capacity),new le({x:t+s,y:e+o,z:n,width:s,height:o},this.capacity)]}intersects(t,e){return!(t.x>=e.x+e.width||t.x+t.width<=e.x||t.y>=e.y+e.height||t.y+t.height<=e.y)}}class he{quadtree;_ydoc=null;_objectsMap=null;_metadataMap=null;_providers=[];_undoManager=null;_reviver=null;_core=null;_workspaceId=null;_isReady=!1;_temporaryItemsCount=0;_idMap=new Map;_awareness=null;_objectsObserver=null;_stackItemAddedHandler=null;_stackItemPoppedHandler=null;_awarenessChangeHandler=null;_awarenessChangeCallbacks=[];_objectsChangeCallbacks=[];_lastAwarenessEmitTime=0;_awarenessEmitTimeout=null;AWARENESS_THROTTLE_INTERVAL=100;_localOnlyMode=!1;_inTransaction=!1;get isReady(){return this._isReady}get awareness(){return this._awareness}get hasAwareness(){return!!this._awareness}get localClientId(){return this._awareness?.clientID??null}setLocalUser(t){if(!this._awareness||!t)return;const e=t.displayName||t.firstName||"Anonymous";this._awareness.setLocalStateField("user",{id:t.id,displayName:e,color:t.color||this.generateColorFromName(e)})}generateColorFromName(t){let e=0;for(let n=0;n<t.length;n++)e=t.charCodeAt(n)+((e<<5)-e);return`hsl(${Math.abs(e%360)}, 45%, 55%)`}updateCursorPosition(t,e){this._awareness&&this._awareness.setLocalStateField("cursor",{x:t,y:e})}clearCursorPosition(){this._awareness&&this._awareness.setLocalStateField("cursor",null)}setActiveDrawingObject(t){this._awareness&&this._awareness.setLocalStateField("activeObjectId",t)}setLocalSelectionBox(t){this._awareness&&this._awareness.setLocalStateField("selectionBox",t)}clearLocalSelectionBox(){this._awareness&&this._awareness.setLocalStateField("selectionBox",null)}removeOrphanedSelectionGroups(){if(!this._awareness)return;const t=this._awareness.getStates(),e=new Set;t.forEach((t=>{const n=t.user?.id;n&&e.add(n)}));const n=this._core?.user?.id,i=this.quadtree.filter((t=>t instanceof h&&null!=t.userId&&t.userId!==n&&!e.has(t.userId)));for(const t of i)this.quadtree.remove((e=>e.id===t.id)),this._idMap.delete(t.id),this._objectsMap&&this._ydoc.transact((()=>{this._objectsMap.delete(t.id)}),"local");i.length>0&&(this._core?.store.invalidateSelectionCache(),this._core?.rerender())}onAwarenessChange(t){this._awarenessChangeCallbacks.push(t)}onObjectsChange(t){this._objectsChangeCallbacks.push(t)}get undoManager(){return this._undoManager}get workspaceId(){return this._workspaceId}get undoState(){return{canUndo:!!this._undoManager&&this._undoManager.canUndo(),canRedo:!!this._undoManager&&this._undoManager.canRedo(),undoStackSize:this._undoManager?this._undoManager.undoStack.length:0,redoStackSize:this._undoManager?this._undoManager.redoStack.length:0}}get totalCount(){return this.quadtree.size}findById(t){return this._idMap.get(t)}constructor(){this.quadtree=new le({x:-1/0,y:-1/0,z:0,width:1/0,height:1/0},8)}async initialize(t,e,n){this._core=t,this._workspaceId=e,this._reviver=new se(t),this._ydoc=new W.Doc,this._objectsMap=this._ydoc.getMap("objects"),this._metadataMap=this._ydoc.getMap("metadata");const i=t.editorId?`kritzel-workspace-${t.editorId}-${e}`:`kritzel-workspace-${e}`,r=n??Qt,s=!!t.store?.state?.debugInfo?.showSyncProviderInfo,o=!s;for(const t of r.providers){let e;e="function"==typeof t?new t(i,this._ydoc,{quiet:o}):t.create(i,this._ydoc,{quiet:o}),this._providers.push(e)}if(s){const t=this._providers.map((t=>`${t.constructor.name} (${t.type})`)).join(", ");console.info(`[Kritzel] Workspace sync providers initialized for ${i}: ${t||"none"}`)}this._undoManager=new W.UndoManager([this._objectsMap],{captureTimeout:Number.MAX_SAFE_INTEGER,trackedOrigins:new Set(["local","temporary"]),ignoreRemoteMapChanges:!0}),this._stackItemAddedHandler=t=>{"undo"===t.type&&"temporary"===t.origin&&this._temporaryItemsCount++},this._stackItemPoppedHandler=t=>{"undo"===t.type&&"temporary"===t.origin&&this._temporaryItemsCount>0&&this._temporaryItemsCount--},this._undoManager.on("stack-item-added",this._stackItemAddedHandler),this._undoManager.on("stack-item-popped",this._stackItemPoppedHandler),this._objectsObserver=t=>{this.handleObjectsChange(t)},this._objectsMap.observe(this._objectsObserver);const a=this._providers.filter((t=>"local"===t.type)),c=this._providers.filter((t=>"network"===t.type)),l=await Promise.allSettled(a.map((t=>t.connect())));if(s){const t=l.filter((t=>"fulfilled"===t.status)).length;console.info(`[Kritzel] Workspace local providers connected: ${t}/${a.length}`)}l.forEach(((t,e)=>{s&&"rejected"===t.status&&console.error(`[Kritzel] Sync provider "${a[e]?.constructor.name}" failed to connect:`,t.reason)})),s&&c.length>0&&console.info(`[Kritzel] Workspace network providers connecting in background: ${c.length}`);for(const t of c)t.connect().catch((e=>{s&&console.error(`[Kritzel] Network sync provider "${t.constructor.name}" failed to connect:`,e)}));this._isReady=!0;for(const t of c)if(t.awareness){this._awareness=t.awareness;break}this._awareness&&(this._awarenessChangeHandler=t=>{t.removed.length>0&&this.removeOrphanedSelectionGroups();const e=Date.now(),n=e-this._lastAwarenessEmitTime;if(null!==this._awarenessEmitTimeout&&(clearTimeout(this._awarenessEmitTimeout),this._awarenessEmitTimeout=null),n>=this.AWARENESS_THROTTLE_INTERVAL){this._lastAwarenessEmitTime=e;const t=this._awareness.getStates();for(const e of this._awarenessChangeCallbacks)e(t)}else this._awarenessEmitTimeout=setTimeout((()=>{this._lastAwarenessEmitTime=Date.now(),this._awarenessEmitTimeout=null;const t=this._awareness.getStates();for(const e of this._awarenessChangeCallbacks)e(t)}),this.AWARENESS_THROTTLE_INTERVAL-n)},this._awareness.on("change",this._awarenessChangeHandler)),this.initializeMetadata("workspace",e,t.store?.state?.activeWorkspace?.name??""),Ht(this._ydoc,this._metadataMap,{objects:this._objectsMap},Yt,U,{quiet:!t.store?.state?.debugInfo?.showMigrationInfo}),this.loadFromYjs()}handleObjectsChange(t){if("local"===t.transaction.origin||"temporary"===t.transaction.origin)return void this._core?.rerender();if("migration"===t.transaction.origin)return;const e=Array.from(t.keysChanged),n=[],i=[],r=[];e.forEach((e=>{const s=t.changes.keys.get(e);if(s&&"delete"===s.action)r.push(e);else{const t=this._objectsMap?.get(e);if(t){const e=this._reviver?.revive(t);e instanceof h?i.push(e):n.push(e)}}})),r.forEach((t=>{this.quadtree.remove((e=>e.id===t)),this._idMap.delete(t)}));const s=[],o=[];n.forEach((t=>{if(this._idMap.has(t.id)){const e=this._idMap.get(t.id);e&&"function"==typeof t.adoptTransientStateFrom&&t.adoptTransientStateFrom(e),this.quadtree.update(t),this._idMap.set(t.id,t),o.push(t)}else this.quadtree.insert(t),this._idMap.set(t.id,t),s.push(t)}));const a=new Set;if(i.forEach((t=>{if(this._idMap.has(t.id)){const e=this._idMap.get(t.id);e&&"function"==typeof t.adoptTransientStateFrom&&t.adoptTransientStateFrom(e),this.quadtree.update(t),this._idMap.set(t.id,t)}else this.quadtree.insert(t),this._idMap.set(t.id,t);a.add(t.id),t.invalidateObjectsCache(),t.refreshObjectDimensions(void 0,!0),t.captureUnchangedSnapshots(),this.quadtree.update(t)})),n.length>0||r.length>0){const t=new Set([...n.map((t=>t.id)),...r]),e=this.quadtree.filter((t=>t instanceof h&&!a.has(t.id)));for(const n of e)n.objectIds.some((e=>t.has(e)))&&(n.invalidateObjectsCache(),n.refreshObjectDimensions(void 0,!0),n.captureUnchangedSnapshots(),this.quadtree.update(n))}if(this._core?.store.invalidateSelectionCache(),this._core?.rerender(),s.length>0&&this._core?.engine.emitObjectsAdded(s),r.length>0){const t=r.map((t=>({id:t})));this._core?.engine.emitObjectsRemoved(t)}o.length>0&&this._core?.engine.emitObjectsUpdated(o.map((t=>({object:t,changedProperties:[]}))));for(const t of this._objectsChangeCallbacks)t()}initializeMetadata(t,e,n){this._metadataMap&&this._ydoc&&this._ydoc.transact((()=>{this._metadataMap?.get("type")||this._metadataMap?.set("type",t),void 0===this._metadataMap?.get("isPublic")&&this._metadataMap?.set("isPublic",!1),void 0===this._metadataMap?.get("schemaVersion")&&this._metadataMap?.set("schemaVersion",U),this._metadataMap?.set("workspaceId",e),this._metadataMap?.set("workspaceName",n)}),"metadata")}getIsPublic(){return this._metadataMap?.get("isPublic")??!1}setIsPublic(t){this._metadataMap&&this._ydoc&&this._ydoc?.transact((()=>{this._metadataMap?.set("isPublic",t)}),"metadata")}getDocumentType(){return this._metadataMap?.get("type")??"workspace"}getWorkspaceName(){return this._metadataMap?.get("workspaceName")??""}setWorkspaceName(t){this._metadataMap&&this._ydoc&&this._ydoc?.transact((()=>{this._metadataMap?.set("workspaceName",t)}),"metadata")}getMetadataWorkspaceId(){return this._metadataMap?.get("workspaceId")??""}transaction(t){if(this._ydoc){this._inTransaction=!0;try{this._ydoc.transact(t,"local")}finally{this._inTransaction=!1}}}stopUndoCapturing(){this.markUndoBoundary()}markUndoBoundary(){this._inTransaction||this._undoManager?.stopCapturing()}withLocalUpdatesOnly(t){this._localOnlyMode=!0;try{t()}finally{this._localOnlyMode=!1}}loadFromYjs(){if(!this._objectsMap||!this._reviver)return;this.quadtree.reset(),this._idMap.clear();const t=this._core?.user?.id,e=[];this._objectsMap.forEach(((n,i)=>{const r=this._reviver?.revive(n);r instanceof h&&null!=r.userId&&r.userId!==t?e.push(i):r&&(this.quadtree.insert(r),this._idMap.set(r.id,r))})),e.length>0&&this._ydoc.transact((()=>{for(const t of e)this._objectsMap.delete(t)}),"local")}reset(){this.quadtree.reset(),this._idMap.clear(),this.markUndoBoundary(),this._ydoc?.transact((()=>{this._objectsMap?.clear()}),"local")}insert(t){if(!t.id)return!1;if(this.quadtree.insert(t),this._idMap.set(t.id,t),this._objectsMap&&this.isPersistable(t)){const e=t.serialize();this.markUndoBoundary(),this._ydoc?.transact((()=>{this._objectsMap?.set(t.id,e)}),"local")}return!0}update(t,e={}){if(!t.id)return!1;if(!this._idMap.has(t.id))return!1;if(this.quadtree.update(t),this._idMap.set(t.id,t),!this._localOnlyMode&&this._objectsMap&&this.isPersistable(t)){const n=t.serialize(),i=e.temporary?"temporary":"local";this._ydoc?.transact((()=>{this._objectsMap?.set(t.id,n)}),i)}return!0}remove(t){const e=this.quadtree.filter(t);if(0!==e.length){this.markUndoBoundary();for(const t of e)this.quadtree.remove((e=>e.id===t.id)),this._idMap.delete(t.id),this._objectsMap&&this.isPersistable(t)&&this._ydoc?.transact((()=>{this._objectsMap?.delete(t.id)}),"local")}}filter(t){return this.quadtree.filter(t)}allObjects(){return this.quadtree.allObjects()}query(t){return this.quadtree.query(t)}isPersistable(t){return!(t instanceof g)}undo(){this._undoManager&&this._undoManager.canUndo()&&(this._undoManager.undo(),this._core?.engine.emitObjectsChange())}redo(){this._undoManager&&this._undoManager.canRedo()&&(this._undoManager.redo(),this._core?.engine.emitObjectsChange())}canUndo(){return!!this._undoManager&&this._undoManager.canUndo()}canRedo(){return!!this._undoManager&&this._undoManager.canRedo()}clearHistory(){this._undoManager&&(this._undoManager.clear(),this._temporaryItemsCount=0)}consolidateTemporaryItems(){if(!this._undoManager||0===this._temporaryItemsCount)return;const t=this._undoManager.undoStack.length;if(0===t)return void(this._temporaryItemsCount=0);this._undoManager.stopCapturing();const e=Math.min(this._temporaryItemsCount,t);if(e>1){for(let t=0;t<e;t++)this._undoManager.canUndo()&&this._undoManager.undo();this._ydoc?.transact((()=>{for(let t=e-1;t>=0;t--)this._undoManager?.canRedo()&&this._undoManager.redo()}),"local")}this._temporaryItemsCount=0}clearTemporaryItems(){if(!this._undoManager||0===this._temporaryItemsCount)return;const t=Math.min(this._temporaryItemsCount,this._undoManager.undoStack.length);for(let e=0;e<t;e++)this._undoManager.undoStack.length>0&&this._undoManager.undoStack.pop();this._temporaryItemsCount=0}destroy(){this._objectsMap&&this._objectsObserver&&(this._objectsMap.unobserve(this._objectsObserver),this._objectsObserver=null),this._undoManager&&(this._stackItemAddedHandler&&(this._undoManager.off("stack-item-added",this._stackItemAddedHandler),this._stackItemAddedHandler=null),this._stackItemPoppedHandler&&(this._undoManager.off("stack-item-popped",this._stackItemPoppedHandler),this._stackItemPoppedHandler=null),this._undoManager.destroy(),this._undoManager=null),this.quadtree.reset(),this._idMap.clear(),this._awareness&&this._awarenessChangeHandler&&(this._awareness.off("change",this._awarenessChangeHandler),this._awarenessChangeHandler=null),null!==this._awarenessEmitTimeout&&(clearTimeout(this._awarenessEmitTimeout),this._awarenessEmitTimeout=null),this._awareness=null,this._awarenessChangeCallbacks=[],this._providers.forEach((t=>{t.destroy()})),this._providers=[],this._objectsMap=null,this._metadataMap=null,this._ydoc&&(this._ydoc.destroy(),this._ydoc=null),this._core=null,this._reviver=null,this._workspaceId=null,this._isReady=!1,this._temporaryItemsCount=0}}class ue{_state;_listeners=new Map;_cachedSelectionBox=null;_cachedSelectionGroup=null;_selectionBoxCacheValid=!1;_selectionGroupCacheValid=!1;_localUserId=null;get state(){return this._state}get objects(){if(!this._state.objects)throw new Error("Objects map is not initialized.");return this._state.objects}get host(){if(!this._state.host)throw new Error("Host element is not set.");return this._state.host}get currentZIndex(){return Math.max(0,...this.objects.filter((t=>!(t instanceof h||t instanceof g))).map((t=>t.zIndex)))+1}get hasViewportBoundaries(){return Number.isFinite(this._state.viewportBoundaryLeft)||Number.isFinite(this._state.viewportBoundaryRight)||Number.isFinite(this._state.viewportBoundaryTop)||Number.isFinite(this._state.viewportBoundaryBottom)}get viewportBoundaryBounds(){const t=this._state.viewportBoundaryLeft,e=this._state.viewportBoundaryRight,n=this._state.viewportBoundaryTop,i=this._state.viewportBoundaryBottom;return{x:Number.isFinite(t)?t:-1/0,y:Number.isFinite(n)?n:-1/0,z:0,width:Number.isFinite(t)&&Number.isFinite(e)?e-t:1/0,height:Number.isFinite(n)&&Number.isFinite(i)?i-n:1/0}}get totalObjectCount(){return this.hasViewportBoundaries?this.allObjects.length:this.objects.totalCount}get allObjects(){return this.hasViewportBoundaries?this.objects.query(this.viewportBoundaryBounds):this.objects.allObjects()}get objectsInViewport(){return this.objects.query({x:-this._state.translateX/this._state.scale,y:-this._state.translateY/this._state.scale,z:this._state.scale,width:this._state.viewportWidth/this._state.scale,height:this._state.viewportHeight/this._state.scale,depth:100}).sort(((t,e)=>t.zIndex-e.zIndex))}get allNonSelectionObjects(){return this.allObjects.filter((t=>!(t instanceof h||t instanceof g)))}get selectedObjects(){return this.allObjects.filter((t=>!(t instanceof h))).filter((t=>t.isSelected))}get selectionBox(){if(this._selectionBoxCacheValid)return this._cachedSelectionBox;const t=this.objects.filter((t=>t instanceof g));return this._cachedSelectionBox=t.length>0?t[0]:null,this._selectionBoxCacheValid=!0,this._cachedSelectionBox}get selectionGroup(){if(this._selectionGroupCacheValid)return this._cachedSelectionGroup;const t=this.objects.filter((t=>t instanceof h));return this._cachedSelectionGroup=this._localUserId?t.find((t=>t.userId===this._localUserId))??null:t.length>0?t[0]:null,this._selectionGroupCacheValid=!0,this._cachedSelectionGroup}invalidateSelectionCache(){this._selectionBoxCacheValid=!1,this._selectionGroupCacheValid=!1}setSelectionBox(t){this._cachedSelectionBox=t,this._selectionBoxCacheValid=!0}setSelectionGroup(t){this._cachedSelectionGroup=t,this._selectionGroupCacheValid=!0}setLocalUserId(t){this._localUserId=t,this.invalidateSelectionCache()}get activeText(){const t=this.objects.filter((t=>t instanceof b&&t.isEditing));return t.length>0?t[0]:null}get activeShape(){const t=this.objects.filter((t=>t instanceof d&&t.isEditing));return t.length>0?t[0]:null}get activeInteractiveCustomElement(){return this.selectedObjects.find((t=>p.isInstanceOf(t,"KritzelCustomElement")&&t.hasFocusedInputElement()))??null}get currentPath(){const t=this.objects.filter((t=>t instanceof _&&!1===t.isCompleted));return t.length>0?t[0]:null}get currentLine(){const t=this.objects.filter((t=>t instanceof L&&!1===t.isCompleted));return t.length>0?t[0]:null}get offsetX(){return this.host.getBoundingClientRect().left}get offsetY(){return this.host.getBoundingClientRect().top}get isDisabled(){return!1===this._state.isEnabled||!1===this._state.isReady||null===this._state.activeWorkspace}get isPointerDown(){return this._state.pointers.size>0}constructor(t){this._state={...t,contextMenuItems:[...t.contextMenuItems],debugInfo:{...t.debugInfo},pointers:new Map(t.pointers),workspaces:[...t.workspaces],cursor:{...t.cursor}},this._state.objects=new he}onStateChange(t,e){this._listeners.has(t)||this._listeners.set(t,new Set);const n=this._listeners.get(t);if(!n)throw new Error(`Listeners set for property ${String(t)} was not initialized.`);n.add(e)}getState(t){return this._state[t]}setState(t,e){const n=this._state[t];if(n!==e){this._state[t]=e;const i=this._listeners.get(t);i&&i.forEach((i=>i(e,n,String(t))))}}}class fe{map;_ydoc=null;_workspacesMap=null;_metadataMap=null;_providers=[];_core=null;_isReady=!1;_onRemoteChangeCallback=null;_workspacesObserver=null;get isReady(){return this._isReady}get hasNetworkSyncProvider(){return this._providers.some((t=>"network"===t.type))}constructor(){this.map=new Map}onRemoteChange(t){this._onRemoteChangeCallback=t}async initialize(t,e){this._core=t,this._ydoc=new W.Doc,this._workspacesMap=this._ydoc.getMap("workspaces"),this._metadataMap=this._ydoc.getMap("metadata");const n=e?.appStateId??this.getOrCreateAppStateInstanceId(t),i=t.editorId?`kritzel-app-state-${t.editorId}-${n}`:`kritzel-app-state-${n}`,r=e??Qt,s=!!t.store.state.debugInfo.showSyncProviderInfo,o=!s;for(const t of r.providers){let e;e="function"==typeof t?new t(i,this._ydoc,{quiet:o}):t.create(i,this._ydoc,{quiet:o}),this._providers.push(e)}if(s){const t=this._providers.map((t=>`${t.constructor.name} (${t.type})`)).join(", ");console.info(`[Kritzel] App-state sync providers initialized for ${i}: ${t||"none"}`)}this._workspacesObserver=t=>{this.handleWorkspacesChange(t)},this._workspacesMap.observe(this._workspacesObserver);const a=this._providers.filter((t=>"local"===t.type)),c=this._providers.filter((t=>"network"===t.type)),l=await Promise.allSettled(a.map((t=>t.connect())));if(s){const t=l.filter((t=>"fulfilled"===t.status)).length;console.info(`[Kritzel] App-state local providers connected: ${t}/${a.length}`)}l.forEach(((t,e)=>{s&&"rejected"===t.status&&console.error(`[Kritzel] Sync provider "${a[e]?.constructor.name}" failed to connect:`,t.reason)})),s&&c.length>0&&console.info(`[Kritzel] App-state network providers connecting in background: ${c.length}`);for(const t of c)t.connect().catch((e=>{s&&console.error(`[Kritzel] Network sync provider "${t.constructor.name}" failed to connect:`,e)}));this._isReady=!0,Ht(this._ydoc,this._metadataMap,{workspaces:this._workspacesMap},Xt,F,{quiet:!t.store.state.debugInfo.showMigrationInfo}),this.initializeMetadata("state"),this.loadFromYjs()}getOrCreateAppStateInstanceId(t){const e=globalThis.localStorage;if(!e)throw new Error("[KritzelAppStateMap] localStorage is unavailable. Cannot persist app-state document identity.");const n=t.getStorageKey("kritzel-app-state-instance-id");let i;try{i=e.getItem(n)}catch{throw new Error("[KritzelAppStateMap] Failed to read app-state instance id from localStorage.")}if(i)return i;const r=R.generateUUID();try{e.setItem(n,r)}catch{throw new Error("[KritzelAppStateMap] Failed to persist app-state instance id to localStorage.")}return r}handleWorkspacesChange(t){if("local"===t.transaction.origin)return void this._core?.rerender();if("migration"===t.transaction.origin)return;const e=Array.from(t.keysChanged),n=[],i=[];e.forEach((e=>{const r=t.changes.keys.get(e);if(r&&"delete"===r.action)i.push(e);else{const t=this._workspacesMap.get(e);if(t){const e=this.reviveWorkspace(t);n.push(e)}}})),i.forEach((t=>{this.map.delete(t)})),n.forEach((t=>{this.map.set(t.id,t)})),this._core?.store&&(this._core.store.state.workspaces=this.allWorkspaces()),this._onRemoteChangeCallback&&this._onRemoteChangeCallback(),this._core?.rerender()}reviveWorkspace(t){let e=t.viewport;if(e&&"translateX"in e&&!("centerWorldX"in e)){const t=e.scale??1;e={centerWorldX:-(e.translateX??0)/t,centerWorldY:-(e.translateY??0)/t,scale:t}}const n=new T(t.id,t.name,e);return this._core&&(n._core=this._core),n.createdAt=new Date(t.createdAt),n.updatedAt=new Date(t.updatedAt),n.isPublic=t.isPublic??!1,n}initializeMetadata(t){this._metadataMap&&this._ydoc&&this._ydoc.transact((()=>{this._metadataMap?.get("type")||this._metadataMap?.set("type",t),void 0===this._metadataMap?.get("isPublic")&&this._metadataMap?.set("isPublic",!1),void 0===this._metadataMap?.get("schemaVersion")&&this._metadataMap?.set("schemaVersion",F)}),"metadata")}getIsPublic(){return this._metadataMap?.get("isPublic")??!1}setIsPublic(t){this._metadataMap&&this._ydoc&&this._ydoc.transact((()=>{this._metadataMap?.set("isPublic",t)}),"metadata")}getDocumentType(){return this._metadataMap?.get("type")??"state"}transaction(t){this._ydoc&&this._ydoc.transact(t,"local")}loadFromYjs(){this._workspacesMap&&(this.map.clear(),this._workspacesMap.forEach(((t,e)=>{const n=this.reviveWorkspace(t);this.map.set(e,n)})))}reset(){this.map.clear(),this._ydoc?.transact((()=>{this._workspacesMap?.clear()}),"local")}insert(t){if(!t.id)return!1;if(this.map.set(t.id,t),this._workspacesMap){const e=t.serialize();this._ydoc?.transact((()=>{this._workspacesMap?.set(t.id,e)}),"local")}return!0}update(t){if(!t.id||!this.map.has(t.id))return!1;if(this.map.set(t.id,t),this._workspacesMap){const e=t.serialize();this._ydoc?.transact((()=>{this._workspacesMap?.set(t.id,e)}),"local")}return!0}remove(t){const e=Array.from(this.map.values()).find(t);return!!e&&(this.map.delete(e.id),this._workspacesMap&&this._ydoc?.transact((()=>{this._workspacesMap?.delete(e.id)}),"local"),!0)}get(t){return this.map.get(t)}allWorkspaces(){return Array.from(this.map.values())}filter(t){return Array.from(this.map.values()).filter(t)}find(t){return Array.from(this.map.values()).find(t)}has(t){return this.map.has(t)}destroy(){this._workspacesMap&&this._workspacesObserver&&(this._workspacesMap.unobserve(this._workspacesObserver),this._workspacesObserver=null),this._providers.forEach((t=>{t.disconnect(),t.destroy()})),this._providers=[],this.map.clear(),this._workspacesMap=null,this._metadataMap=null,this._ydoc&&(this._ydoc.destroy(),this._ydoc=null),this._core=null,this._onRemoteChangeCallback=null,this._isReady=!1}}class de{_core;_targetElement=null;_shadowRoot=null;constructor(t){this._core=t}setTargetElement(t){this._targetElement&&(this._targetElement.style.cursor="",this._targetElement.style.removeProperty("--kritzel-global-pointer-cursor")),this._targetElement=t,this._targetElement&&this._targetElement.style.setProperty("--kritzel-global-pointer-cursor",Pt.getPointerCursor())}getTargetElement(){return this._targetElement}setShadowRoot(t){this._shadowRoot=t}resetToDefault(){this._core.store.state.cursor={icon:"default",iconActive:"default"}}updateHoverState(t){if(this._core.store.isPointerDown)return;if(!this._shadowRoot)return;const e=this._shadowRoot.elementsFromPoint(t.clientX,t.clientY);if(!e||0===e.length)return;const n=e.find((t=>t.classList.contains("resize-handle-overlay")));if(n){const t=this._core.store.selectionGroup,e=t?.rotationDegrees??0,i=n.classList.contains("top-left"),r=n.classList.contains("bottom-right");this._core.store.state.cursor={icon:"move-vertical",rotation:e+(i||r?-45:45)}}else this._core.store.state.cursor=e.find((t=>t.classList.contains("rotation-handle-overlay")))||e.find((t=>t.classList.contains("selection-line-handle-overlay")))?{icon:"hand",iconActive:"hand-grab"}:{icon:"default",iconActive:"default"}}applyCursor(){const t=this._core.store.state,e=this._core.store.isPointerDown,n=t.cursor?.icon,i=t.cursor?.iconActive??n,r=t.cursor?.rotation,s=Pt.getCursor({iconName:e?i:n,rotation:r});this._targetElement&&(this._targetElement.style.cursor=s)}cleanup(){this._targetElement&&(this._targetElement.style.cursor="",this._targetElement.style.removeProperty("--kritzel-pointer-cursor")),this._targetElement=null,this._shadowRoot=null}}class pe{_isFirefox=/firefox|fxios/i.test(navigator.userAgent);_isSafari=/safari/i.test(navigator.userAgent)&&!/chrome|chromium|crios|android|edg/i.test(navigator.userAgent);_requestHandlers=new Map;constructor(t){this.registerRequestPermissionHandler("clipboard-read",(async()=>{if(this._isFirefox||this._isSafari)return"granted";try{return await navigator.clipboard.readText(),"granted"}catch{return"denied"}}))}registerRequestPermissionHandler(t,e){this._requestHandlers.set(t,e)}async checkPermission(t){return(await navigator.permissions.query({name:t})).state}async requestPermission(t){const e=this._requestHandlers.get(t);return e?e():this.checkPermission(t)}}const ge="kritzel-clipboard/v1:";class ve{_core;_pasteOffset=0;constructor(t){this._core=t}serializeForClipboard(t){const e="function"==typeof t.serialize?t.serialize():t;return p.isInstanceOf(t,"KritzelGroup")&&(e.__children__=t.children.map((t=>this.serializeForClipboard(t)))),e}serializeClipboardPayload(t){return`${ge}${JSON.stringify(t)}`}parseClipboardPayload(t){if(!t||!t.startsWith(ge))return null;try{const e=JSON.parse(t.slice(21));return 1===e?.version&&Array.isArray(e.objects)?e:null}catch{return null}}determineTextPasteIntent(t){const e=this.parseClipboardPayload(t);return e?{type:"kritzel_objects",payload:e}:t&&t.trim().length>0?{type:"plain_text",text:t}:null}async writeBrowserClipboardPayload(t,e){const n=this.serializeClipboardPayload(t);if(e?.clipboardData)e.clipboardData.setData("text/plain",n);else if("undefined"!=typeof navigator&&navigator.clipboard?.writeText)try{await navigator.clipboard.writeText(n)}catch{}}reviveClipboardObject(t){const e=new se(this._core),{__children__:n,...i}=t,r=e.revive(i);if(!r)return null;if(n&&p.isInstanceOf(r,"KritzelGroup")){const t=n.map((t=>this.reviveClipboardObject(t))).filter((t=>null!=t));r._pendingChildren=t,r.childIds=t.map((t=>t.id))}return r}regenerateIdsAndRemapAnchors(t){const e=[],n=t.length>0&&t.every((t=>p.isInstanceOf(t,"KritzelLine"))),i=t=>{for(const n of t)e.push(n),p.isInstanceOf(n,"KritzelGroup")&&i(n._pendingChildren)};i(t);const r=new Map;for(const t of e){const e=t.generateId();r.set(t.id,e),t.id=e,t.isMounted=!1}for(const t of e)p.isInstanceOf(t,"KritzelGroup")&&(t.childIds=t.childIds.map((t=>r.get(t)??t))),p.isInstanceOf(t,"KritzelLine")&&(t.startAnchor&&r.has(t.startAnchor.objectId)?t.startAnchor={objectId:r.get(t.startAnchor.objectId)}:n&&(t.startAnchor=void 0),t.endAnchor&&r.has(t.endAnchor.objectId)?t.endAnchor={objectId:r.get(t.endAnchor.objectId)}:n&&(t.endAnchor=void 0))}async determinePasteIntent(t){if(t?.clipboardData){const e=t.clipboardData,n=Array.from(e.files??[]).filter((t=>t.type.startsWith("image/")));if(n.length>0)return{type:"image_files",files:n};if(e.types.includes("text/plain")){const t=this.determineTextPasteIntent(e.getData("text/plain"));if(t)return t}return{type:"unknown"}}if("undefined"==typeof navigator||!navigator.clipboard)return{type:"unknown"};const{clipboard:e}=navigator;if("granted"!==await this._core.permissionManager.checkPermission("clipboard-read")&&"granted"!==await this._core.permissionManager.requestPermission("clipboard-read"))return{type:"unknown"};if(e.read)try{const t=await e.read(),{imageFiles:n,text:i}=await this.processClipboardItems(t);if(n.length>0)return{type:"image_files",files:n};if(null!==i){const t=this.determineTextPasteIntent(i);if(t)return t}}catch{}if(e.readText){const t=this.determineTextPasteIntent(await e.readText());if(t)return t}return{type:"unknown"}}async processClipboardItems(t){const e=[];let n=null;return await Promise.all(t.map((async t=>{const i=t.types.find((t=>t.startsWith("image/")));if(i){const n=await t.getType(i);e.push(new File([n],"pasted-image",{type:i}))}else if(null===n&&t.types.includes("text/plain")){const e=await t.getType("text/plain");n=await e.text()}}))),{imageFiles:e,text:n}}copy(t){const e=this._core.store.selectionGroup;if(!e)return;const n={version:1,sourceWorkspaceId:this._core.store.state.activeWorkspace?.id,objects:e.objects.sort(((t,e)=>t.zIndex-e.zIndex)).map((t=>this.serializeForClipboard(t)))};this._pasteOffset=0,this.writeBrowserClipboardPayload(n,t)}cut(t){this._core.store.selectionGroup&&(this.copy(t),this._core.delete())}materializeKritzelObjects(t){const e=t.payload.objects.map((t=>this.reviveClipboardObject(t))).filter((t=>null!=t));return this.regenerateIdsAndRemapAnchors(e),e}async materializeImageFiles(t){try{const e=25/this._core.store.state.scale,n=t.files.map((async(t,n)=>{const i=await _t(t,{maxWidthOrHeight:1200});return u.fromBlob(this._core,i,{translateX:n*e,translateY:n*e})}));return await Promise.all(n)}catch(t){return console.error("Failed to import pasted image files:",t),null}}async materializePlainText(t){const e=b.create(this._core),n=t.text.split("\n").map((t=>0===t.length?{type:"paragraph"}:{type:"paragraph",content:[{type:"text",text:t}]}));return e.setContent({type:"doc",content:n}),[e]}async paste(t,e,n){const i=await this.determinePasteIntent(n);let r=null;"kritzel_objects"===i.type?r=this.materializeKritzelObjects(i):"image_files"===i.type?r=await this.materializeImageFiles(i):"plain_text"===i.type&&(r=await this.materializePlainText(i)),r&&0!==r.length&&await this.insertMaterializedObjects(r,i,t,e)}async insertMaterializedObjects(t,e,n,i){const r=this._core.store.state.activeWorkspace;if(!r)return;const s=t.some((t=>t.workspaceId!==r.id))||"kritzel_objects"!==e.type,o=void 0!==n&&void 0!==i,a=Math.min(...t.map((t=>t.translateX))),c=Math.min(...t.map((t=>t.translateY)));let l,u;const f=25/this._core.store.state.scale;void 0!==n&&void 0!==i?(l=n,u=i):s?(l=a,u=c):(l=a+f+this._pasteOffset,u=c+f+this._pasteOffset,this._pasteOffset+=f);const d=l-a,g=u-c;this._core.removeSelectionGroup(),this._core.removeSelectionBox();const v=h.create(this._core),w=this._core.store.currentZIndex;this._core.store.objects.transaction((()=>{const e=(t,n)=>{if(0===t._pendingChildren.length)return;const i=t._pendingChildren;t._pendingChildren=[],i.forEach(((t,i)=>{t.workspaceId!==r.id&&(t.workspaceId=r.id),t.updatePosition(t.translateX+d,t.translateY+g),t.zIndex=n+i+1,p.isInstanceOf(t,"KritzelGroup")&&e(t,t.zIndex),this._core.addObject(t)})),t.finalize()},n=[];t.forEach(((t,i)=>{t.workspaceId!==r.id&&(t.workspaceId=r.id),t.updatePosition(t.translateX+d,t.translateY+g),t.zIndex=w+i,p.isInstanceOf(t,"KritzelGroup")&&e(t,t.zIndex),this._core.addObject(t),n.push(t),v.addOrRemove(t)})),this._core.engine.emitObjectsAdded(n)})),this._core.anchorManager.rebuildIndex(),v.isSelected=!0,1===t.length&&(v.rotation=t[0].rotation),s&&!o&&v.centerInViewport(),this._core.addSelectionGroup(v),this._core.engine.viewport?.bringIntoViewIfNeeded(v),this._core.store.state.isSelecting=!1,await new Promise((t=>{requestAnimationFrame((()=>requestAnimationFrame((()=>t()))))})),v.refreshObjectDimensions(),s&&!o&&v.centerInViewport(),this._core.engine.emitObjectsChange(),this._core.rerender(),this._core.store.setState("activeTool",this._core.toolRegistry.getTool("selection")),this._core.engine.emitObjectsChange(),this._core.rerender()}}class we{_kritzelEngine;_store;_syncConfig;_assetStorageConfig;_assetResolver;_appStateMap;_anchorManager;_cursorManager;_themeManager;_localizationManager;_licenseManager;_permissionManager;_clipboardManager;_toolRegistry;_editorId;_user;get engine(){return this._kritzelEngine}get store(){return this._store}get appStateMap(){return this._appStateMap}get anchorManager(){return this._anchorManager}get cursorManager(){return this._cursorManager}get themeManager(){return this._themeManager}get localizationManager(){return this._localizationManager}get licenseManager(){return this._licenseManager}get permissionManager(){return this._permissionManager}get toolRegistry(){return this._toolRegistry}get clipboardManager(){return this._clipboardManager}get editorId(){return this._editorId}getStorageKey(t){return this._editorId?`${t}-${this._editorId}`:t}get user(){return this._user}setUser(t){this._user=t,this._store.setLocalUserId(t?.id??null),this._store.objects?.setLocalUser(t)}constructor(t,e){this._kritzelEngine=t,this._editorId=e,this._store=new ue(oe),this._appStateMap=new fe,this._anchorManager=new Bt(this),this._cursorManager=new de(this),this._themeManager=new S(this),this._localizationManager=new Vt(this),this._licenseManager=new Nt(this),this._permissionManager=new pe(this),this._clipboardManager=new ve(this),this._toolRegistry=new ce(this),this._assetResolver=new k,this._assetResolver.setShowInfo(this._store.state.debugInfo?.showAssetResolverInfo??!1)}get assetResolver(){return this._assetResolver}setSyncConfig(t){this._syncConfig=t}setAssetStorageConfig(t){this._assetStorageConfig=t}setEditorId(t){this._editorId=t,this._themeManager=new S(this),this._localizationManager=new Vt(this)}async initializeYjs(){await this._appStateMap.initialize(this,this._syncConfig)}async initializeAssetStorage(){await this._assetResolver.init(this._assetStorageConfig),this.warnIfAssetStorageMismatched()}warnIfAssetStorageMismatched(){this._appStateMap.hasNetworkSyncProvider&&(this._assetResolver.hasRemoteProvider||console.warn("[Kritzel] A network sync provider is configured, but no remote asset storage provider was found. Images added on this device will only be available locally and will appear broken on other devices. Configure a remote asset provider (e.g. HttpAssetProvider) via the `assetStorage` prop to enable cross-device image sync."))}loadWorkspacesFromAppState(){return this._appStateMap.allWorkspaces()}saveWorkspaceToAppState(t){this._appStateMap.has(t.id)?this._appStateMap.update(t):this._appStateMap.insert(t)}deleteWorkspaceFromAppState(t){this._appStateMap.remove((e=>e.id===t))}async initializeWorkspace(t,e){const n=this.loadWorkspacesFromAppState(),i=!t&&!!this._editorId,r=n.length>0?[...n].sort(((t,e)=>{const n=e.createdAt.getTime()-t.createdAt.getTime();return 0!==n?n:e.updatedAt.getTime()-t.updatedAt.getTime()}))[0]:null,s=localStorage.getItem(this.getStorageKey("kritzel-active-workspace-id")),o=s?n.find((t=>t.id===s)):null;let a;if(t)a=t,n.find((e=>e.id===t.id))||(a._core=this,this.saveWorkspaceToAppState(a));else if(o)a=o;else if(r&&!i)a=r;else{if(e?.skipFallbackCreation)return this._store.state.workspaces=n,this._store.state.activeWorkspace=null,void this.rerender();a=new T(R.generateUUID(),"New Workspace"),a._core=this,this.saveWorkspaceToAppState(a)}localStorage.setItem(this.getStorageKey("kritzel-active-workspace-id"),a.id),this._store.objects&&this._store.objects.isReady&&this._store.objects.destroy();const c=new he;this._store.state.objects=c,this._store.state.activeWorkspace=a,this._store.state.workspaces=this.loadWorkspacesFromAppState();const l=a.viewport??{centerWorldX:0,centerWorldY:0,scale:1},h=l.scale??1,u=this._store.state.viewportHeight;this._store.state.translateX=this._store.state.viewportWidth/2-(l.centerWorldX??0)*h,this._store.state.translateY=u/2-(l.centerWorldY??0)*h,this._store.state.scale=h,await c.initialize(this,a.id,this._syncConfig),this._user&&c.setLocalUser(this._user),c.onAwarenessChange((t=>{this.engine.emitAwarenessChange(t)})),this._anchorManager.rebuildIndex(),this.engine.emitObjectsChange(),this.rerender()}async loadSharedWorkspace(t){const e=t;let n=this.getWorkspaces().find((t=>t.id===e));n?n.isPublic=!0:(n=new T(e,"Shared Workspace"),n.isPublic=!0,this.createWorkspace(n)),await this.initializeWorkspace(n)}getObjectsInViewport(){return this._store.objects?this._store.objects.query({x:-this._store.state.translateX/this._store.state.scale,y:-this._store.state.translateY/this._store.state.scale,z:this._store.state.scale,width:this._store.state.viewportWidth/this._store.state.scale,height:this._store.state.viewportHeight/this._store.state.scale,depth:100}).filter((t=>!(t instanceof h||t instanceof g))).sort(((t,e)=>t.zIndex-e.zIndex)):[]}rerender(){this._kritzelEngine&&this._kritzelEngine.forceUpdate++}findObjectById(t){for(const e of this._store.allObjects)if(e.id===t)return e;return null}getWorkspaces(){return this.loadWorkspacesFromAppState()}createWorkspace(t){t._core=this,t.createdAt=new Date,t.updatedAt=new Date,this.saveWorkspaceToAppState(t),this._store.state.workspaces=this.loadWorkspacesFromAppState()}updateWorkspace(t){t.updatedAt=new Date,this.saveWorkspaceToAppState(t),this._store.state.activeWorkspace?.id===t.id&&this._store.objects?.setWorkspaceName(t.name);const e=this._store.state.workspaces,n=e.findIndex((e=>e.id===t.id));-1!==n&&(e[n]=t,this._store.state.workspaces=e)}deleteWorkspace(t){this._store.state.activeWorkspace?.id===t.id&&(this.engine.viewport?.cancelPendingUpdates(),this._store.objects?.destroy()),this.deleteWorkspaceFromAppState(t.id),this._store.state.workspaces=this.loadWorkspacesFromAppState(),window.indexedDB.deleteDatabase(this._editorId?`kritzel-workspace-${this._editorId}-${t.id}`:`kritzel-workspace-${t.id}`)}updateWorkspaceViewport(t,e,n){const i=this._store.state.activeWorkspace;i&&this._store.state.workspaces.some((t=>t.id===i.id))&&(i.viewport={centerWorldX:(this._store.state.viewportWidth/2-t)/n,centerWorldY:(this._store.state.viewportHeight/2-e)/n,scale:n},i.updatedAt=new Date,this.saveWorkspaceToAppState(i))}getIsPublic(){return this._store.state.activeWorkspace?.isPublic??!1}addObject(t){this._store.objects.insert(t)}removeObject(t,e=!1){p.isInstanceOf(t,"KritzelGroup")&&!e&&[...t.children].forEach((t=>{this.removeObject(t)})),p.isInstanceOf(t,"KritzelCustomElement")&&t.unmount(),p.isInstanceOf(t,"KritzelLine")?this._anchorManager.handleLineDeleted(t.id):this._anchorManager.handleObjectDeleted(t.id),t.isMounted=!1,this._store.objects.remove((e=>e.id===t.id))}updateObject(t,e){const n=[];for(const i in e)if(e.hasOwnProperty(i)){const r=e[i];void 0!==r&&(t[i]=r,n.push(i))}t.onAfterUpdate(n),this._store.objects.update(t)}addSelectionGroup(t){this.removeLocalSelectionGroups(),this.removeSelectionBox();for(const e of t.objects??[])if(p.isInstanceOf(e,"KritzelCustomElement")){const t=e;"function"==typeof t.setIsInteractive?t.setIsInteractive(!0):t.isInteractive=!0}this._store.objects.insert(t),this._store.setSelectionGroup(t),this._kritzelEngine.triggerSelectionChange()}isLocalSelectionGroup(t){const e=this._user?.id;return null==e||t.userId===e||null==t.userId}teardownSelectionGroup(t){t.deselectAllChildren?.();for(const e of t.objects??[])if(p.isInstanceOf(e,"KritzelCustomElement")){const t=e;"function"==typeof t.setIsInteractive?t.setIsInteractive(!1):t.isInteractive=!1}}removeLocalSelectionGroups(){const t=this._store.objects.allObjects().filter((t=>t instanceof h||p.isInstanceOf(t,"KritzelSelectionGroup"))).filter((t=>this.isLocalSelectionGroup(t))),e=this._store.selectionGroup;if(e&&this.isLocalSelectionGroup(e)&&!t.some((t=>t.id===e.id))&&t.push(e),0===t.length)return!1;for(const e of t)this.teardownSelectionGroup(e);const n=new Set(t.map((t=>t.id)));return this._store.objects.remove((t=>n.has(t.id))),this._store.setSelectionGroup(null),!0}removeSelectionGroup(){this.removeLocalSelectionGroups()&&this._kritzelEngine.triggerSelectionChange()}removeSelectionBox(){const t=this._store.selectionBox;t&&(this._store.objects.remove((e=>e.id===t.id)),this._store.setSelectionBox(null),this._store.objects.clearLocalSelectionBox())}deselectAllObjects(){this.removeSelectionGroup(),this.rerender()}delete(){const t=this._store.selectionGroup;t&&(this._store.objects.stopUndoCapturing(),this._store.objects.transaction((()=>{t.objects.forEach((t=>this.removeObject(t))),this.removeSelectionGroup()})),this._store.objects.stopUndoCapturing(),this.engine.emitObjectsInViewportChange(),this.rerender())}undo(){this._store.objects?.undo()}redo(){this._store.objects?.redo()}deleteObject(t){const e=this.findObjectById(t);e&&(this.removeObject(e),this.engine.emitObjectsInViewportChange(),this.rerender())}bringForward(t){const e=this._store.selectionGroup,n=t?[t]:e?.objects||[],i=this._store.allNonSelectionObjects.filter((t=>-1===n.findIndex((e=>e.id===t.id)))),r=i.length>0?Math.max(...i.map((t=>t.zIndex)))+1:0;n.forEach((t=>{t.zIndex!==r&&this.updateObject(t,{zIndex:t.zIndex+1})})),this.rerender()}sendBackward(t){const e=this._store.selectionGroup,n=t?[t]:e?.objects||[],i=this._store.allNonSelectionObjects.filter((t=>-1===n.findIndex((e=>e.id===t.id)))),r=i.length>0?Math.min(...i.map((t=>t.zIndex)))-1:0;n.forEach((t=>{t.zIndex!==r&&this.updateObject(t,{zIndex:t.zIndex-1})})),this.rerender()}bringToFront(t){const e=this._store.selectionGroup,n=t?[t]:e?.objects||[],i=this._store.allNonSelectionObjects.filter((t=>-1===n.findIndex((e=>e.id===t.id)))),r=Math.max(...i.map((t=>t.zIndex)))+1;n.forEach((t=>{this.updateObject(t,{zIndex:r})})),this.rerender()}sendToBack(t){const e=this._store.selectionGroup,n=t?[t]:e?.objects||[],i=this._store.allNonSelectionObjects.filter((t=>-1===n.findIndex((e=>e.id===t.id)))),r=Math.min(...i.map((t=>t.zIndex)))-1;n.forEach((t=>{this.updateObject(t,{zIndex:r})})),this.rerender()}alignObjects(t){const e=this._store.selectionGroup;if(!e||e.objects.length<2)return;const n=e.objects,i=ae.calculateAlignedPositions(n,t);this._store.objects.transaction((()=>{for(const t of n){const e=i.get(t.id);e&&this.updateObject(t,{translateX:e.translateX,translateY:e.translateY})}})),e.refreshObjectDimensions(),this.rerender()}group(){const t=this._store.selectionGroup;if(!t||t.objects.length<2)return;const e=y.createFromObjects(this,t.objects);this.addObject(e),this.removeSelectionGroup();const n=h.create(this);n.addOrRemove(e),n.isSelected=!0,n.rotation=e.rotation,this.addSelectionGroup(n),this.engine.emitObjectsChange(),this.rerender()}ungroup(){const t=this._store.selectionGroup;if(!t)return;const e=t.objects.filter((t=>p.isInstanceOf(t,"KritzelGroup")));if(0===e.length)return;const n=[],i=t.objects.filter((t=>!p.isInstanceOf(t,"KritzelGroup")));e.forEach((t=>{const e=t.ungroup();n.push(...e),this.removeObject(t,!0)})),this.removeSelectionGroup();const r=h.create(this);[...n,...i].forEach((t=>{r.addOrRemove(t)})),r.isSelected=!0,this.addSelectionGroup(r),this.engine.emitObjectsChange(),this.rerender()}selectObjects(t){if(0===t.length)return;const e=h.create(this);t.forEach((t=>{t.isSelected=!1,e.addOrRemove(t)})),e.isSelected=!0,1===t.length&&(e.rotation=e.objects[0].rotation),this.addSelectionGroup(e),this.rerender()}selectAllObjects(){const t=this._store.objects.allObjects().filter((t=>!(t instanceof h||t instanceof g||t instanceof B)));if(t.length>0){const e=h.create(this);t.forEach((t=>{t.isSelected=!1,e.addOrRemove(t)})),e.isSelected=!0,this._store.state.isSelecting=!1,1===t.length&&(e.rotation=e.objects[0].rotation),this.addSelectionGroup(e),this._store.setState("activeTool",this._toolRegistry.getTool("selection")),this.rerender()}}selectAllObjectsInViewport(){const t=this._store.objects.query({x:-this._store.state.translateX/this._store.state.scale,y:-this._store.state.translateY/this._store.state.scale,z:this._store.state.scale,width:this._store.state.viewportWidth/this._store.state.scale,height:this._store.state.viewportHeight/this._store.state.scale,depth:100}).filter((t=>t.isInViewport())).filter((t=>!(t instanceof h||t instanceof g||t instanceof B)));if(t.length>0){const e=h.create(this);t.forEach((t=>{t.isSelected=!1,e.addOrRemove(t)})),e.isSelected=!0,this._store.state.isSelecting=!1,1===t.length&&(e.rotation=e.objects[0].rotation),this.addSelectionGroup(e),this._store.setState("activeTool",this._toolRegistry.getTool("selection")),this.rerender()}}clearSelection(){this.removeSelectionGroup();const t=this._user?.id;this._store.objects.remove((e=>e instanceof g||e instanceof h&&(null==t||e.userId===t||null==e.userId))),this._store.setSelectionBox(null),this._store.setSelectionGroup(null);for(const t of this._store.allNonSelectionObjects)t.isSelected&&(t.isSelected=!1);this._store.state.isSelecting=!1,this._store.state.isResizeHandleSelected=!1,this._store.state.isRotationHandleSelected=!1,this._store.state.isLineHandleSelected=!1,this._store.state.isLineHandleDragging=!1,this._store.state.lineHandleType=void 0,this.rerender()}resetActiveText(){const t=this._store.activeText;t&&(t.isEmpty?this.deleteObject(t.id):t.save())}resetActiveShape(){const t=this._store.activeShape;t&&t.save()}getObjectFromPointerEvent(t,e=".object"){const n=this._store.state.host?.shadowRoot;if(!n)return null;const i=t.clientX,r=t.clientY,s=n.elementFromPoint(i,r);if(!s)return null;const o=s.closest(e);if(o){const t=this._store.allObjects.find((t=>o.id===t.id));return t&&t.hitTest(i,r)?t:null}return null}getObjectsFromPointerEvent(t,e=".object"){const n=this._store.state.host?.shadowRoot;if(!n)return[];const i=n.elementsFromPoint(t.clientX,t.clientY);if(!i||0===i.length)return[];const r=new Set;return i.forEach((t=>{const n=t.closest(e);n&&n.id&&r.add(n.id)})),r.size>0?this._store.allObjects.filter((t=>r.has(t.id))).sort(((t,e)=>e.zIndex-t.zIndex)):[]}getElementsAtPoint(t,e){const n=this._store.state.host?.shadowRoot;if(!n)return[];const i=n.elementsFromPoint(t.clientX,t.clientY);return i&&0!==i.length?i.filter((t=>t.matches(e))):[]}isPointerOverElement(t,e){return this.getElementsAtPoint(t,e).length>0}getCanvasPoint(t){if(!this._store.state.host)return{x:0,y:0};const e=this._store.state.host.getBoundingClientRect();return{x:(t.clientX-e.left-this._store.state.translateX)/this._store.state.scale,y:(t.clientY-e.top-this._store.state.translateY)/this._store.state.scale}}beforeWorkspaceChange(){this._kritzelEngine.viewport?.cancelPendingUpdates(),this._store.state.activeWorkspace&&this.updateWorkspaceViewport(this._store.state.translateX,this._store.state.translateY,this._store.state.scale),this.resetActiveText(),this.clearSelection(),this._store.setState("activeTool",this._toolRegistry.getTool("selection"))}displaySelectionGroupUI(t){if(!t.isSelected)return!1;if(t instanceof h&&null!=this._user?.id&&null!=t.userId&&t.userId!==this._user.id)return!0;const e=this._store.selectionGroup;return e?t instanceof h&&t.id===e.id&&(e.objects.length>1||(1!==e.objects.length||!(e.objects[0]instanceof L))):!(t instanceof L)}displaySelectionLineUI(t){if(!(t instanceof L))return!1;const e=this._store.selectionGroup;if(!e)return t.isSelected;if(!e.isSelected)return!1;if(1===e.objects.length){const n=e.objects[0];return n instanceof L&&n.id===t.id}return!1}}class me{static calculateCombinedBounds(t){if(!t||0===t.length)return null;let e=1/0,n=1/0,i=-1/0,r=-1/0;for(const s of t){const t=s.rotatedBoundingBox;e=Math.min(e,t.x),n=Math.min(n,t.y),i=Math.max(i,t.x+t.width),r=Math.max(r,t.y+t.height)}return{x:e,y:n,z:1,width:i-e,height:r-n}}static generateSvg(t,e={}){const{theme:n,padding:i=0,includeXmlDeclaration:r=!0,rasterSafeForCanvas:s=!1,imageDataUrls:o}=e;if(!t||0===t.length)return"";const a=this.flattenObjects(t),c=this.calculateCombinedBounds(a);if(!c)return"";const l=c.x-i,h=c.y-i,u=c.width+2*i,f=c.height+2*i,d=this.collectDefs(a,n),p=t.sort(((t,e)=>t.zIndex-e.zIndex)).map((t=>this.objectToSvgElement(t,n,o,s))).filter(Boolean).join("\n ");return`${r?'<?xml version="1.0" encoding="UTF-8"?>\n':""}<svg xmlns="http://www.w3.org/2000/svg" viewBox="${l} ${h} ${u} ${f}" width="${u}" height="${f}">${d.length>0?`\n <defs>\n ${d.join("\n ")}\n </defs>`:""}\n ${p}\n</svg>`}static flattenObjects(t){const e=[];for(const n of t)p.isInstanceOf(n,"KritzelGroup")?e.push(...this.flattenObjects(n.children)):e.push(n);return e}static async resolveImageDataUrls(t,e){const n=new Map;if(!t||0===t.length)return n;const i=this.flattenObjects(t).filter((t=>p.isInstanceOf(t,"KritzelImage")));return await Promise.all(i.map((async t=>{if(t.src?.startsWith("data:"))n.set(t.id,t.src);else if(t.resolvedSrc?.startsWith("data:"))n.set(t.id,t.resolvedSrc);else if(t.assetId&&e)try{const i=await e.fetchBlob(t.assetId);n.set(t.id,await this.blobToDataUrl(i))}catch(e){console.warn(`[KritzelSvgExportHelper] Failed to inline image asset ${t.assetId} for export:`,e)}}))),n}static async blobToDataUrl(t){if("undefined"!=typeof FileReader)try{return await new Promise(((e,n)=>{const i=new FileReader;i.onload=()=>{"string"!=typeof i.result?n(new Error("FileReader result is not a string")):e(i.result)},i.onerror=()=>n(i.error??new Error("Failed to read blob as data URL")),i.readAsDataURL(t)}))}catch{}const e=new Uint8Array(await t.arrayBuffer());return`data:${t.type||"application/octet-stream"};base64,${this.uint8ToBase64(e)}`}static uint8ToBase64(t){if("undefined"!=typeof Buffer)return Buffer.from(t).toString("base64");let e="";for(let n=0;n<t.length;n+=32768){const i=t.subarray(n,Math.min(n+32768,t.length));e+=String.fromCharCode(...i)}if("function"==typeof btoa)return btoa(e);throw new Error("No base64 encoder available in this runtime")}static collectDefs(t,e){const n=[];for(const i of t)p.isInstanceOf(i,"KritzelLine")&&(i.hasStartArrow&&n.push(this.generateArrowMarker(i,"start",e)),i.hasEndArrow&&n.push(this.generateArrowMarker(i,"end",e)));return n}static generateArrowMarker(t,e,n){const i="start"===e?t.startMarkerId:t.endMarkerId,r=t.getArrowSize(e),s=t.getArrowFill(e);return`<marker id="${i}" markerWidth="${r}" markerHeight="${r}" refX="0" refY="${r/2}" orient="${"start"===e?"auto-start-reverse":"auto"}" markerUnits="userSpaceOnUse">\n <path d="${t.getArrowPath("start"===e?t.arrows?.start?.style:t.arrows?.end?.style)}" fill="${s}" transform="scale(${r/10})"/>\n </marker>`}static objectToSvgElement(t,e,n,i=!1){return p.isInstanceOf(t,"KritzelPath")?this.pathToSvg(t,e):p.isInstanceOf(t,"KritzelLine")?this.lineToSvg(t,e):p.isInstanceOf(t,"KritzelShape")?this.shapeToSvg(t,e):p.isInstanceOf(t,"KritzelText")?this.textToSvg(t,e,i):p.isInstanceOf(t,"KritzelImage")?this.imageToSvg(t,n):p.isInstanceOf(t,"KritzelCustomElement")?this.customElementToSvg(t,i):p.isInstanceOf(t,"KritzelGroup")?this.groupToSvg(t,e,n,i):""}static pathToSvg(t,e){const n=this.buildTransform(t),i=M.resolveThemeColor(t.fill,e),r=M.resolveThemeColor(t.stroke,e),s=1!==t.opacity?` opacity="${t.opacity}"`:"",o=this.getObjectScale(t);return`<g transform="${n}"${s}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/o}" height="${t.totalHeight/o}" overflow="visible">\n <path d="${t.d}" fill="${i||"none"}" stroke="${r||"none"}"${t.strokeWidth?` stroke-width="${t.strokeWidth}"`:""}/>\n </svg>\n </g>`}static lineToSvg(t,e){const n=this.buildTransform(t),i=M.resolveThemeColor(t.stroke,e),r=1!==t.opacity?` opacity="${t.opacity}"`:"",s=this.getObjectScale(t);return`<g transform="${n}"${r}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/s}" height="${t.totalHeight/s}" overflow="visible">\n <path d="${t.d}" fill="none" stroke="${i}" stroke-width="${t.strokeWidth}" stroke-linecap="round"${t.hasStartArrow?` marker-start="url(#${t.startMarkerId})"`:""}${t.hasEndArrow?` marker-end="url(#${t.endMarkerId})"`:""}/>\n </svg>\n </g>`}static shapeToSvg(t,e){const n=this.buildTransform(t),i=M.resolveThemeColor(t.fillColor,e),r=M.resolveThemeColor(t.strokeColor,e),s=1!==t.opacity?` opacity="${t.opacity}"`:"",o=this.getObjectScale(t),a=t.getSvgPath();let c="";if(t.editor&&!t.editor.state.doc.textContent.trim());else if(t.content){const n=this.prosemirrorToHtml(t.content,t,e);if(n){const i=M.resolveThemeColor(t.fontColor,e);c=`\n <foreignObject x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}">\n <div xmlns="http://www.w3.org/1999/xhtml" style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; text-align: center; font-family: ${t.fontFamily}; font-size: ${t.fontSize}px; color: ${i}; overflow: hidden;">\n ${n}\n </div>\n </foreignObject>`}}return`<g transform="${n}"${s}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/o}" height="${t.totalHeight/o}" overflow="visible" preserveAspectRatio="none">\n <path d="${a}" fill="${i||"transparent"}" stroke="${r}" stroke-width="${t.strokeWidth}"/>${c}\n </svg>\n </g>`}static textToSvg(t,e,n=!1){if(n)return this.textToSvgRasterSafe(t,e);const i=this.buildTransform(t),r=1!==t.opacity?` opacity="${t.opacity}"`:"",s=M.resolveThemeColor(t.fontColor,e),o=M.resolveThemeColor(t.backgroundColor,e),a=this.getObjectScale(t),c=this.prosemirrorToHtml(t.content,t,e);return`<g transform="${i}"${r}>\n <foreignObject x="0" y="0" width="${t.totalWidth/a}" height="${t.totalHeight/a}">\n <div xmlns="http://www.w3.org/1999/xhtml" style="font-family: ${t.fontFamily}; font-size: ${t.fontSize}pt; color: ${s}; background-color: ${o||"transparent"}; transform: scale(${t.scaleFactor}); transform-origin: top left; white-space: pre-wrap; word-wrap: break-word;">\n ${c}\n </div>\n </foreignObject>\n </g>`}static textToSvgRasterSafe(t,e){const n=this.buildTransform(t),i=1!==t.opacity?` opacity="${t.opacity}"`:"",r=M.resolveThemeColor(t.fontColor,e),s=M.resolveThemeColor(t.backgroundColor,e),o=this.getObjectScale(t),a=t.totalWidth/o,c=t.totalHeight/o,l=this.prosemirrorToPlainTextLines(t.content),h=l.length>0?l:[""],u=Math.max(1,t.fontSize*(t.scaleFactor||1)),f=1.2*u,d=u,p=s&&"transparent"!==s?`<rect x="0" y="0" width="${a}" height="${c}" fill="${s}"/>`:"",g=h.map(((t,e)=>`<tspan x="0" y="${d+e*f}" xml:space="preserve">${this.escapeHtml(t)}</tspan>`)).join("");return`<g transform="${n}"${i}>\n ${p}\n <text font-family="${this.escapeHtml(t.fontFamily)}" font-size="${u}" fill="${r}">${g}</text>\n </g>`}static imageToSvg(t,e){const n=this.buildTransform(t),i=1!==t.opacity?` opacity="${t.opacity}"`:"",r=this.getObjectScale(t),s=t.totalWidth/r,o=t.totalHeight/r;return`<g transform="${n}"${i}>\n <image href="${e?.get(t.id)||t.resolvedSrc||t.src||""}" x="0" y="0" width="${s}" height="${o}" preserveAspectRatio="xMidYMid meet"/>\n </g>`}static customElementToSvg(t,e=!1){const n=this.buildTransform(t),i=1!==t.opacity?` opacity="${t.opacity}"`:"",r=this.getObjectScale(t),s=t.totalWidth/r,o=t.totalHeight/r;return e?(console.warn("[KritzelCustomElement SVG Export] Custom elements do not serialize well to PNG. Use SVG export or screenshot instead."),`<g transform="${n}"${i}>\n <rect x="0" y="0" width="${s}" height="${o}" fill="#f0f0f0" stroke="#999" stroke-width="1" />\n <text x="${s/2}" y="${o/2}" text-anchor="middle" dominant-baseline="middle" font-size="12" fill="#999">[Custom Element]</text>\n </g>`):`<g transform="${n}"${i}>\n <foreignObject x="0" y="0" width="${s}" height="${o}">\n <div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;overflow:hidden;">\n ${t.element?.outerHTML||'<div style="border:1px dashed #ccc">Empty</div>'}\n </div>\n </foreignObject>\n </g>`}static groupToSvg(t,e,n,i=!1){const r=t.children.sort(((t,e)=>t.zIndex-e.zIndex)).map((t=>this.objectToSvgElement(t,e,n,i))).filter(Boolean).join("\n ");return r?`<g${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n ${r}\n </g>`:""}static buildTransform(t){const e=[],n=this.getObjectScale(t);if(e.push(`translate(${t.translateX}, ${t.translateY})`),0!==t.rotation){const i=t.rotation*(180/Math.PI);e.push(`rotate(${i}, ${t.totalWidth/2/n}, ${t.totalHeight/2/n})`)}return e.join(" ")}static getObjectScale(t){const e=t.scale??1;return 0===e?1:e}static prosemirrorToHtml(t,e,n){return t&&t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):""}static nodeToHtml(t,e){if(!t)return"";switch(t.type){case"paragraph":return`<p style="margin: 0;">${(t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):"")||"<br/>"}</p>`;case"text":let n=this.escapeHtml(t.text||"");if(t.marks)for(const i of t.marks)n=this.applyMark(n,i,e);return n;case"hard_break":return"<br/>";case"bullet_list":return`<ul style="margin: 0; padding-left: 1.5em;">${t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}</ul>`;case"ordered_list":return`<ol style="margin: 0; padding-left: 1.5em;">${t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}</ol>`;case"list_item":return`<li>${t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}</li>`;default:return t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}}static prosemirrorToPlainTextLines(t){if(!t||!Array.isArray(t.content))return[];const e=t.content.map((t=>this.nodeToPlainText(t))).join("").replace(/\r\n/g,"\n").replace(/\n+$/,"");return e?e.split("\n"):[]}static nodeToPlainText(t){if(!t)return"";switch(t.type){case"text":return t.text||"";case"hard_break":return"\n";case"paragraph":return`${Array.isArray(t.content)?t.content.map((t=>this.nodeToPlainText(t))).join(""):""}\n`;case"list_item":return`- ${(Array.isArray(t.content)?t.content.map((t=>this.nodeToPlainText(t))).join(""):"").trim()}\n`;default:return Array.isArray(t.content)?t.content.map((t=>this.nodeToPlainText(t))).join(""):""}}static applyMark(t,e,n){switch(e.type){case"bold":case"strong":return`<strong>${t}</strong>`;case"italic":case"em":return`<em>${t}</em>`;case"underline":return`<u>${t}</u>`;case"strike":return`<s>${t}</s>`;case"code":return`<code>${t}</code>`;case"link":return`<a href="${this.escapeHtml(e.attrs?.href||"#")}">${t}</a>`;default:return t}}static escapeHtml(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}}const ye=(()=>{let t=0;return()=>(t+=1,`u${`0000${(Math.random()*36**4|0).toString(36)}`.slice(-4)}${t}`)})();function be(t){const e=[];for(let n=0,i=t.length;n<i;n++)e.push(t[n]);return e}let ke=null;function Ae(t={}){return ke||(t.includeStyleProperties?(ke=t.includeStyleProperties,ke):(ke=be(window.getComputedStyle(document.documentElement)),ke))}function xe(t,e){const n=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return n?parseFloat(n.replace("px","")):0}function Se(t,e={}){return{width:e.width||function(t){const e=xe(t,"border-left-width"),n=xe(t,"border-right-width");return t.clientWidth+e+n}(t),height:e.height||function(t){const e=xe(t,"border-top-width"),n=xe(t,"border-bottom-width");return t.clientHeight+e+n}(t)}}const Me=16384;function ze(t){return new Promise(((e,n)=>{const i=new Image;i.onload=()=>{i.decode().then((()=>{requestAnimationFrame((()=>e(i)))}))},i.onerror=n,i.crossOrigin="anonymous",i.decoding="async",i.src=t}))}const $e=(t,e)=>{if(t instanceof e)return!0;const n=Object.getPrototypeOf(t);return null!==n&&(n.constructor.name===e.name||$e(n,e))};function Ce(t,e,n,i){const r=window.getComputedStyle(t,n),s=r.getPropertyValue("content");if(""===s||"none"===s)return;const o=ye();try{e.className=`${e.className} ${o}`}catch(t){return}const a=document.createElement("style");a.appendChild(function(t,e,n,i){const r=`.${t}:${e}`,s=n.cssText?function(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}(n):function(t,e){return Ae(e).map((e=>`${e}: ${t.getPropertyValue(e)}${t.getPropertyPriority(e)?" !important":""};`)).join(" ")}(n,i);return document.createTextNode(`${r}{${s}}`)}(o,n,r,i)),e.appendChild(a)}const Te="application/font-woff",Ie="image/jpeg",je={woff:Te,woff2:Te,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:Ie,jpeg:Ie,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function Ee(t){const e=function(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}(t).toLowerCase();return je[e]||""}function _e(t){return-1!==t.search(/^(data:)/)}async function Le(t,e,n){const i=await fetch(t,e);if(404===i.status)throw new Error(`Resource "${i.url}" not found`);const r=await i.blob();return new Promise(((t,e)=>{const s=new FileReader;s.onerror=e,s.onloadend=()=>{try{t(n({res:i,result:s.result}))}catch(t){e(t)}},s.readAsDataURL(r)}))}const Oe={};async function Pe(t,e,n){const i=function(t,e,n){let i=t.replace(/\?.*/,"");return n&&(i=t),/ttf|otf|eot|woff2?/i.test(i)&&(i=i.replace(/.*\//,"")),e?`[${e}]${i}`:i}(t,e,n.includeQueryParams);if(null!=Oe[i])return Oe[i];let r;n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+(new Date).getTime());try{const i=await Le(t,n.fetchRequestInit,(({res:t,result:n})=>(e||(e=t.headers.get("Content-Type")||""),function(t){return t.split(/,/)[1]}(n))));r=function(t,e){return`data:${e};base64,${t}`}(i,e)}catch(e){r=n.imagePlaceholder||"";let i=`Failed to fetch resource: ${t}`;e&&(i="string"==typeof e?e:e.message),i&&console.warn(i)}return Oe[i]=r,r}const Be=t=>null!=t.tagName&&"SLOT"===t.tagName.toUpperCase(),De=t=>null!=t.tagName&&"SVG"===t.tagName.toUpperCase();async function Re(t,e,n){return n||!e.filter||e.filter(t)?Promise.resolve(t).then((t=>async function(t,e){return $e(t,HTMLCanvasElement)?async function(t){const e=t.toDataURL();return"data:,"===e?t.cloneNode(!1):ze(e)}(t):$e(t,HTMLVideoElement)?async function(t,e){if(t.currentSrc){const e=document.createElement("canvas"),n=e.getContext("2d");return e.width=t.clientWidth,e.height=t.clientHeight,null==n||n.drawImage(t,0,0,e.width,e.height),ze(e.toDataURL())}const n=t.poster,i=Ee(n);return ze(await Pe(n,i,e))}(t,e):$e(t,HTMLIFrameElement)?async function(t,e){var n;try{if(null===(n=null==t?void 0:t.contentDocument)||void 0===n?void 0:n.body)return await Re(t.contentDocument.body,e,!0)}catch(t){}return t.cloneNode(!1)}(t,e):t.cloneNode(De(t))}(t,e))).then((n=>async function(t,e,n){var i,r;if(De(e))return e;let s=[];return s=Be(t)&&t.assignedNodes?be(t.assignedNodes()):$e(t,HTMLIFrameElement)&&(null===(i=t.contentDocument)||void 0===i?void 0:i.body)?be(t.contentDocument.body.childNodes):be((null!==(r=t.shadowRoot)&&void 0!==r?r:t).childNodes),0===s.length||$e(t,HTMLVideoElement)||await s.reduce(((t,i)=>t.then((()=>Re(i,n))).then((t=>{t&&e.appendChild(t)}))),Promise.resolve()),e}(t,n,e))).then((n=>function(t,e,n){return $e(e,Element)&&(function(t,e,n){const i=e.style;if(!i)return;const r=window.getComputedStyle(t);r.cssText?(i.cssText=r.cssText,i.transformOrigin=r.transformOrigin):Ae(n).forEach((n=>{let s=r.getPropertyValue(n);if("font-size"===n&&s.endsWith("px")){const t=Math.floor(parseFloat(s.substring(0,s.length-2)))-.1;s=`${t}px`}$e(t,HTMLIFrameElement)&&"display"===n&&"inline"===s&&(s="block"),"d"===n&&e.getAttribute("d")&&(s=`path(${e.getAttribute("d")})`),i.setProperty(n,s,r.getPropertyPriority(n))}))}(t,e,n),function(t,e,n){Ce(t,e,":before",n),Ce(t,e,":after",n)}(t,e,n),function(t,e){$e(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),$e(t,HTMLInputElement)&&e.setAttribute("value",t.value)}(t,e),function(t,e){if($e(t,HTMLSelectElement)){const n=Array.from(e.children).find((e=>t.value===e.getAttribute("value")));n&&n.setAttribute("selected","")}}(t,e)),e}(t,n,e))).then((t=>async function(t,e){const n=t.querySelectorAll?t.querySelectorAll("use"):[];if(0===n.length)return t;const i={};for(let r=0;r<n.length;r++){const s=n[r].getAttribute("xlink:href");if(s){const n=t.querySelector(s),r=document.querySelector(s);n||!r||i[s]||(i[s]=await Re(r,e,!0))}}const r=Object.values(i);if(r.length){const e="http://www.w3.org/1999/xhtml",n=document.createElementNS(e,"svg");n.setAttribute("xmlns",e),n.style.position="absolute",n.style.width="0",n.style.height="0",n.style.overflow="hidden",n.style.display="none";const i=document.createElementNS(e,"defs");n.appendChild(i);for(let t=0;t<r.length;t++)i.appendChild(r[t]);t.appendChild(n)}return t}(t,e))):null}const We=/url\((['"]?)([^'"]+?)\1\)/g,Ue=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Fe=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function Ke(t){return-1!==t.search(We)}async function Ve(t,e,n){if(!Ke(t))return t;const i=function(t,{preferredFontFormat:e}){return e?t.replace(Fe,(t=>{for(;;){const[n,,i]=Ue.exec(t)||[];if(!i)return"";if(i===e)return`src: ${n};`}})):t}(t,n),r=function(t){const e=[];return t.replace(We,((t,n,i)=>(e.push(i),t))),e.filter((t=>!_e(t)))}(i);return r.reduce(((t,i)=>t.then((t=>async function(t,e,n,i){try{const r=n?function(t,e){if(t.match(/^[a-z]+:\/\//i))return t;if(t.match(/^\/\//))return window.location.protocol+t;if(t.match(/^[a-z]+:/i))return t;const n=document.implementation.createHTMLDocument(),i=n.createElement("base"),r=n.createElement("a");return n.head.appendChild(i),n.body.appendChild(r),e&&(i.href=e),r.href=t,r.href}(e,n):e,s=Ee(e);let o;return o=await Pe(r,s,i),t.replace(function(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}(e),`$1${o}$3`)}catch(t){}return t}(t,i,e,n)))),Promise.resolve(i))}async function Ne(t,e,n){var i;const r=null===(i=e.style)||void 0===i?void 0:i.getPropertyValue(t);if(r){const i=await Ve(r,null,n);return e.style.setProperty(t,i,e.style.getPropertyPriority(t)),!0}return!1}async function Ge(t,e){$e(t,Element)&&(await async function(t,e){await Ne("background",t,e)||await Ne("background-image",t,e),await Ne("mask",t,e)||await Ne("-webkit-mask",t,e)||await Ne("mask-image",t,e)||await Ne("-webkit-mask-image",t,e)}(t,e),await async function(t,e){const n=$e(t,HTMLImageElement);if((!n||_e(t.src))&&(!$e(t,SVGImageElement)||_e(t.href.baseVal)))return;const i=n?t.src:t.href.baseVal,r=await Pe(i,Ee(i),e);await new Promise(((i,s)=>{t.onload=i,t.onerror=e.onImageErrorHandler?(...t)=>{try{i(e.onImageErrorHandler(...t))}catch(t){s(t)}}:s;const o=t;o.decode&&(o.decode=i),"lazy"===o.loading&&(o.loading="eager"),n?(t.srcset="",t.src=r):t.href.baseVal=r}))}(t,e),await async function(t,e){const n=be(t.childNodes).map((t=>Ge(t,e)));await Promise.all(n).then((()=>t))}(t,e))}const He={};async function Xe(t){let e=He[t];if(null!=e)return e;const n=await fetch(t);return e={url:t,cssText:await n.text()},He[t]=e,e}async function Ye(t,e){let n=t.cssText;const i=/url\(["']?([^"')]+)["']?\)/g,r=(n.match(/url\([^)]+\)/g)||[]).map((async r=>{let s=r.replace(i,"$1");return s.startsWith("https://")||(s=new URL(s,t.url).href),Le(s,e.fetchRequestInit,(({result:t})=>(n=n.replace(r,`url(${t})`),[r,t])))}));return Promise.all(r).then((()=>n))}function Qe(t){if(null==t)return[];const e=[];let n=t.replace(/(\/\*[\s\S]*?\*\/)/gi,"");const i=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const t=i.exec(n);if(null===t)break;e.push(t[0])}n=n.replace(i,"");const r=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,s=new RegExp("((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})","gi");for(;;){let t=r.exec(n);if(null===t){if(t=s.exec(n),null===t)break;r.lastIndex=s.lastIndex}else s.lastIndex=r.lastIndex;e.push(t[0])}return e}function Ze(t){return t.trim().replace(/["']/g,"")}async function qe(t,e){const n=await async function(t,e){if(null==t.ownerDocument)throw new Error("Provided element is not within a Document");const n=be(t.ownerDocument.styleSheets),i=await async function(t,e){const n=[],i=[];return t.forEach((n=>{if("cssRules"in n)try{be(n.cssRules||[]).forEach(((t,r)=>{if(t.type===CSSRule.IMPORT_RULE){let s=r+1;const o=Xe(t.href).then((t=>Ye(t,e))).then((t=>Qe(t).forEach((t=>{try{n.insertRule(t,t.startsWith("@import")?s+=1:n.cssRules.length)}catch(e){console.error("Error inserting rule from remote css",{rule:t,error:e})}})))).catch((t=>{console.error("Error loading remote css",t.toString())}));i.push(o)}}))}catch(r){const s=t.find((t=>null==t.href))||document.styleSheets[0];null!=n.href&&i.push(Xe(n.href).then((t=>Ye(t,e))).then((t=>Qe(t).forEach((t=>{s.insertRule(t,s.cssRules.length)})))).catch((t=>{console.error("Error loading remote stylesheet",t)}))),console.error("Error inlining remote css file",r)}})),Promise.all(i).then((()=>(t.forEach((t=>{if("cssRules"in t)try{be(t.cssRules||[]).forEach((t=>{n.push(t)}))}catch(e){console.error(`Error while reading CSS rules from ${t.href}`,e)}})),n)))}(n,e);return function(t){return t.filter((t=>t.type===CSSRule.FONT_FACE_RULE)).filter((t=>Ke(t.style.getPropertyValue("src"))))}(i)}(t,e),i=function(t){const e=new Set;return function t(n){(n.style.fontFamily||getComputedStyle(n).fontFamily).split(",").forEach((t=>{e.add(Ze(t))})),Array.from(n.children).forEach((e=>{e instanceof HTMLElement&&t(e)}))}(t),e}(t);return(await Promise.all(n.filter((t=>i.has(Ze(t.style.fontFamily)))).map((t=>Ve(t.cssText,t.parentStyleSheet?t.parentStyleSheet.href:null,e))))).join("\n")}async function Je(t,e={}){const{width:n,height:i}=Se(t,e),r=await Re(t,e,!0);return await async function(t,e){const n=null!=e.fontEmbedCSS?e.fontEmbedCSS:e.skipFonts?null:await qe(t,e);if(n){const e=document.createElement("style"),i=document.createTextNode(n);e.appendChild(i),t.firstChild?t.insertBefore(e,t.firstChild):t.appendChild(e)}}(r,e),await Ge(r,e),function(t,e){const{style:n}=t;e.backgroundColor&&(n.backgroundColor=e.backgroundColor),e.width&&(n.width=`${e.width}px`),e.height&&(n.height=`${e.height}px`);const i=e.style;null!=i&&Object.keys(i).forEach((t=>{n[t]=i[t]}))}(r,e),await async function(t,e,n){const i="http://www.w3.org/2000/svg",r=document.createElementNS(i,"svg"),s=document.createElementNS(i,"foreignObject");return r.setAttribute("width",`${e}`),r.setAttribute("height",`${n}`),r.setAttribute("viewBox",`0 0 ${e} ${n}`),s.setAttribute("width","100%"),s.setAttribute("height","100%"),s.setAttribute("x","0"),s.setAttribute("y","0"),s.setAttribute("externalResourcesRequired","true"),r.appendChild(s),s.appendChild(t),async function(t){return Promise.resolve().then((()=>(new XMLSerializer).serializeToString(t))).then(encodeURIComponent).then((t=>`data:image/svg+xml;charset=utf-8,${t}`))}(r)}(r,n,i)}class tn{static shouldKeepWheelInCustomElement(t,e){if(t.ctrlKey||!0!==e.isSelected)return!1;const n="function"==typeof t.composedPath?t.composedPath():[],i=this.getScrollableContainerFromEventPath(n,e);return!!i&&this.canElementConsumeWheel(i,t.deltaX,t.deltaY)}static getScrollableContainerFromEventPath(t,e){const n=[];e.element instanceof HTMLElement&&n.push(e.element),e.elementRef instanceof HTMLElement&&n.push(e.elementRef);const i=e.elmeentRef;i instanceof HTMLElement&&n.push(i);for(const e of n){const n=t.findIndex((t=>t===e));if(-1!==n)for(const e of t.slice(0,n+1))if(e instanceof HTMLElement&&this.isScrollableElement(e))return e}for(const t of n){if(this.isScrollableElement(t))return t;const e=t.firstElementChild;if(e instanceof HTMLElement&&this.isScrollableElement(e))return e}return null}static isScrollableElement(t){const e=t.scrollHeight-t.clientHeight>0,n=t.scrollWidth-t.clientWidth>0;if(!e&&!n)return!1;const i=window.getComputedStyle(t),r=i.overflowX,s=i.overflowY;return e&&"visible"!==s&&"clip"!==s||n&&"visible"!==r&&"clip"!==r}static canElementConsumeWheel(t,e,n){const i=this.canElementConsumeVerticalWheel(t,n),r=this.canElementConsumeHorizontalWheel(t,e);return i||r}static canElementConsumeVerticalWheel(t,e){if(0===e)return!1;const n=Math.max(0,t.scrollHeight-t.clientHeight);return 0!==n&&(e>0?t.scrollTop<n-1:!!(e<0)&&t.scrollTop>1)}static canElementConsumeHorizontalWheel(t,e){if(0===e)return!1;const n=Math.max(0,t.scrollWidth-t.clientWidth);return 0!==n&&(e>0?t.scrollLeft<n-1:!!(e<0)&&t.scrollLeft>1)}}const en=t(class extends e{get host(){return this}workspace;async onWorkspaceChange(t){const e=t?.id;if(!e)return;await Promise.resolve();const n=this.core.store.state.activeWorkspace?.id;n!==e&&(this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(t),this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace))}editorId;activeWorkspaceId;async onActiveWorkspaceIdChange(t){t&&this._isYjsInitialized&&await this.switchToWorkspaceById(t)}syncConfig;async onSyncConfigChange(t){this._syncConfigRevision++,this.core.setSyncConfig(t),t&&!this._isYjsInitialized&&this._isViewportReady&&await this.initializeSyncAndWorkspace()}assetStorageConfig;async onAssetStorageConfigChange(t){this._assetStorageConfigRevision++,this.core.setAssetStorageConfig(t),t&&!this._isAssetStorageInitialized&&this._isViewportReady&&await this.initializeAssetStorage()}user;onUserChange(t){this.core.setUser(t)}globalContextMenuItems;onGlobalContextMenuItemsChange(t){this.contextMenuHandler&&(this.contextMenuHandler.globalContextMenuItems=t??[])}objectContextMenuItems;onObjectContextMenuItemsChange(t){this.contextMenuHandler&&(this.contextMenuHandler.objectContextMenuItems=t??[])}scaleMax=z;validateScaleMax(t){t>z?(console.warn(`scaleMax cannot be greater than ${z}.`),this.scaleMax=z,this.core.store.state.scaleMax=this.scaleMax):this.core.store.state.scaleMax=t}scaleMin=$;validateScaleMin(t){t<$?(console.warn(`scaleMin cannot be less than ${$}.`),this.scaleMin=$,this.core.store.state.scaleMin=this.scaleMin):this.core.store.state.scaleMin=t}cursorTarget;onCursorTargetChange(t){this.core.cursorManager.setTargetElement(t||document.body)}lockDrawingScale=!0;onLockDrawingScaleChange(t){this.core.store.state.lockDrawingScale=t}isObjectDistanceFadingActive=!1;onIsObjectDistanceFadingActiveChange(){this.core.rerender()}theme="light";onThemeChange(t){this.core.themeManager.setTheme(t)}licenseKey;onLicenseKeyChange(t){this.core.licenseManager.validate(t)}themes;onThemesChange(t){t&&t.length>0&&(this.core.themeManager.registerThemes(t),this.core.themeManager.applyTheme(this.core.themeManager.currentTheme))}locale="en";onLocaleChange(t){this.core.localizationManager.setLocale(t)}locales;onLocalesChange(t){t&&t.length>0&&(this.core.localizationManager.registerLocales(t),this.core.localizationManager.setLocale(this.locale))}fallbackLocale="en";onFallbackLocaleChange(t){this.core.localizationManager.setFallbackLocale(t),this.core.rerender()}viewportBoundaryLeft=-1/0;onViewportBoundaryLeftChange(t){this.core.store.state.viewportBoundaryLeft=t??-1/0}viewportBoundaryRight=1/0;onViewportBoundaryRightChange(t){this.core.store.state.viewportBoundaryRight=t??1/0}viewportBoundaryTop=-1/0;onViewportBoundaryTopChange(t){this.core.store.state.viewportBoundaryTop=t??-1/0}viewportBoundaryBottom=1/0;onViewportBoundaryBottomChange(t){this.core.store.state.viewportBoundaryBottom=t??1/0}debugInfo;onDebugInfoChange(t){t&&(this.core.store.state.debugInfo=t,this.core.assetResolver.setShowInfo(t.showAssetResolverInfo))}isPanningEnabled=!0;isZoomingEnabled=!0;isLoading=!1;onIsLoadingChange(){this.syncLoadingState()}isEngineReady;activeToolChange;objectsSelectionChange;workspacesChange;activeWorkspaceChange;longpress;objectsChange;objectsAdded;objectsRemoved;objectsUpdated;undoStateChange;objectsInViewportChange;viewportChange;awarenessChange;notificationsChange;forceUpdate=0;async triggerSelectionChange(){this.objectsSelectionChange.emit()}handleWheel(t){if(this.core.store.isDisabled)return;this.core.store.state.isContextMenuVisible&&this.hideContextMenu();const e=this.core.getObjectFromPointerEvent(t);e&&R.isClass(e,"KritzelCustomElement")&&tn.shouldKeepWheelInCustomElement(t,e)||(t.ctrlKey?this.isZoomingEnabled&&this.viewport.handleWheel(t):this.isPanningEnabled&&this.viewport.handleWheel(t),this.core.store.state?.activeTool?.handleWheel(t))}handlePointerDown(t){this.core.store.isDisabled||this.isEmbeddedCustomElementInteraction(t)||(N.isTouchDevice()&&l.onLongPress(t,(t=>this.longpress.emit(t))),this.host.setPointerCapture(t.pointerId),this.core.store.state.pointers.set(t.pointerId,t),this.viewport.handlePointerDown(t),this.core.store.state?.activeTool?.handlePointerDown(t))}throttledPointerMoveMulti=ee.throttle((t=>{this.viewport.handlePointerMove(t),this.core.store.state?.activeTool?.handlePointerMove(t)}),16);handlePointerMove(t){this.core.store.isDisabled||t.buttons>0&&!this.core.store.state.pointers.has(t.pointerId)||(this.core.store.state.pointers.has(t.pointerId)&&this.core.store.state.pointers.set(t.pointerId,t),this.core.store.state.pointers.size>1&&this.throttledPointerMoveMulti(t),this.core.cursorManager.updateHoverState(t),this.viewport.handlePointerMove(t),this.core.store.state?.activeTool?.handlePointerMove(t))}handlePointerUp(t){if(this.core.store.isDisabled)return;const e=this.core.store.state.pointers.has(t.pointerId);this.core.store.state.pointers.delete(t.pointerId),this.host.hasPointerCapture(t.pointerId)&&this.host.releasePointerCapture(t.pointerId),0===this.core.store.state.pointers.size&&this.core.cursorManager.resetToDefault(),e&&(this.viewport.handlePointerUp(t),this.core.store.state?.activeTool?.handlePointerUp(t))}handlePointerCancel(t){this.core.store.isDisabled||(this.host.hasPointerCapture(t.pointerId)&&this.host.releasePointerCapture(t.pointerId),this.core.store.state.pointers.delete(t.pointerId),0===this.core.store.state.pointers.size&&this.core.cursorManager.resetToDefault(),this.viewport.handlePointerUp(t),this.core.store.state?.activeTool?.handlePointerUp(t))}isEmbeddedCustomElementInteraction(t){const n=t.composedPath(),i=n.find((t=>t instanceof e&&t.classList.contains("object")));if(!i?.id)return!1;const r=this.core.store.objects.findById(i.id);if(!r||!p.isInstanceOf(r,"KritzelCustomElement"))return!1;if(!this.core.store.selectionGroup?.objects?.some((t=>t.id===r.id)))return!1;if(!0!==r.isInteractive)return!1;const s=[];return r.element instanceof e&&s.push(r.element),r.elementRef instanceof e&&s.push(r.elementRef),0!==s.length&&s.some((t=>this.isNativeInteractiveEmbeddedTarget(n,t)))}isNativeInteractiveEmbeddedTarget(t,n){const i=t.findIndex((t=>t===n));if(-1===i)return!1;for(const n of t.slice(0,i))if(n instanceof e&&n.matches('input, button, textarea, select, a[href], [contenteditable="true"], [contenteditable=""]'))return!0;return!1}handlePointerLeave(){this.core.store.objects?.clearCursorPosition()}handleLongPress(t){this.contextMenuHandler.handleContextMenu(t.detail)}handleContextMenu(t){t.cancelable&&t.preventDefault(),this.core.store.isDisabled||"touch"!==t.pointerType&&"pen"!==t.pointerType&&this.contextMenuHandler.handleContextMenu(t)}handleResize(){this.viewport.handleResize()}handleKeyDown(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&this.keyHandler.handleKeyDown(t)}handleKeyUp(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&this.keyHandler.handleKeyUp(t)}handleCopy(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&(!this.core.store.selectionGroup||this.core.store.activeText||this.core.store.activeShape||(t.cancelable&&t.preventDefault(),this.core.clipboardManager.copy(t),this.core.rerender()))}handleCut(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&(!this.core.store.selectionGroup||this.core.store.activeText||this.core.store.activeShape||(t.cancelable&&t.preventDefault(),this.core.clipboardManager.cut(t)))}handlePaste(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&(this.core.store.activeText||this.core.store.activeShape||(t.cancelable&&t.preventDefault(),this.core.clipboardManager.paste(void 0,void 0,t)))}shouldHandleGlobalShortcutEvent(t){const n=t.composedPath();if(n.includes(this.host))return!0;if(n.some((t=>t instanceof e&&("DIALOG"===t.tagName||"KRITZEL-DIALOG"===t.tagName||"dialog"===t.getAttribute?.("role")||"alertdialog"===t.getAttribute?.("role")))))return!1;const i=n[0];return!(i instanceof e&&i.matches?.('input, textarea, select, [contenteditable="true"], [contenteditable=""]'))}preventDoubleTapZoomOnTouchDevices(t){t.cancelable&&t.preventDefault()}async registerTool(t,e,n){if("function"!=typeof e)return console.error(`Failed to register tool "${t}": Tool class must be a constructor function`),null;if(this.core.toolRegistry.hasTool(t)){const e=this.core.toolRegistry.getTool(t);return n&&this.applyToolConfig(e,n),e}const i=this.core.toolRegistry.registerTool(t,e);return n&&this.applyToolConfig(i,n),Promise.resolve(i)}async changeActiveTool(t){this.core.store.state.activeTool!==t&&(this.core.store.state.activeTool?.onDeactivate(),this.core.store.setState("activeTool",t),this.core.deselectAllObjects(),t?.onActivate())}async changeActiveToolByName(t){const e=this.core.toolRegistry.getTool(t);e?await this.changeActiveTool(e):console.warn(`[KritzelEngine] No tool registered with name: ${t}`)}async disable(){this.core.store.state.isEnabled=!1,this.core.rerender()}async enable(){this.core.store.state.isEnabled=!0,this.core.rerender()}async delete(){this.core.delete()}async copy(){this.core.clipboardManager.copy()}async cut(){this.core.clipboardManager.cut()}async paste(t,e){"granted"===await this.core.permissionManager.requestPermission("clipboard-read")?this.core.clipboardManager.paste(t,e):this.notificationsChange.emit({type:"error",message:"Clipboard read permission is required to paste content. Please grant permission and try again.",id:R.generateUUID()})}async bringForward(t){this.core.bringForward(t)}async sendBackward(t){this.core.sendBackward(t)}async bringToFront(t){this.core.bringToFront(t)}async sendToBack(t){this.core.sendToBack(t)}async alignObjects(t){this.core.alignObjects(t)}async group(){this.core.group()}async ungroup(){this.core.ungroup()}async undo(){this.core.undo()}async redo(){this.core.redo()}async hideContextMenu(){this.core.store.state.pointers.clear(),this.core.store.state.isContextMenuVisible=!1,this.core.store.objects?.remove((t=>t instanceof g)),this.core.store.setSelectionBox(null),this.core.store.objects?.clearLocalSelectionBox(),this.core.store.state.isSelecting=!1,this.core.store.state.isEnabled=!0,this.core.rerender()}async openContextMenu(t){this.contextMenuHandler.open(t)}async getObjectById(t){return this.core.store.allObjects.find((e=>e.id===t))||null}async getAllObjects(){return this.core.store.allObjects}async findObjects(t){return this.core.store.allNonSelectionObjects.filter(t)}async getObjectsTotalCount(){return this.core.store.totalObjectCount}async addObject(t){if(this.core.deselectAllObjects(),t.id=t.generateId(),t._core=this.core,t.scale=t.scale??this.core.store.state.scale,t.zIndex=this.core.store.currentZIndex,t.workspaceId=this.core.store.state.activeWorkspace.id,p.isInstanceOf(t,"KritzelImage")&&await t.prepareForInsert(),p.isInstanceOf(t,"KritzelText")){const e=t.content;t.editor=t.createEditor(),e&&t.setContent(e)}if(p.isInstanceOf(t,"KritzelGroup")&&t._pendingChildren.length>0){const e=new Map,n=[],i=t=>{if(0===t._pendingChildren.length)return;const r=t._pendingChildren;t._pendingChildren=[],t.childIds=[],r.forEach((r=>{const s=r.id;r.id=r.generateId(),r._core=this.core,r.scale=r.scale??this.core.store.state.scale,r.zIndex=this.core.store.currentZIndex,r.workspaceId=this.core.store.state.activeWorkspace.id,e.set(s,r.id),t.childIds.push(r.id),n.push(r),p.isInstanceOf(r,"KritzelGroup")&&i(r)}))};i(t),n.forEach((t=>{p.isInstanceOf(t,"KritzelLine")&&(t.startAnchor&&e.has(t.startAnchor.objectId)&&(t.startAnchor={objectId:e.get(t.startAnchor.objectId)}),t.endAnchor&&e.has(t.endAnchor.objectId)&&(t.endAnchor={objectId:e.get(t.endAnchor.objectId)}))})),n.forEach((t=>{this.core.addObject(t)})),t.finalize(),this.core.anchorManager.rebuildIndex()}return this.core.addObject(t),this.core.rerender(),await new Promise((t=>{requestAnimationFrame((()=>requestAnimationFrame((()=>t()))))})),this.emitObjectsChange(),this.emitObjectsAdded([t]),t}async addObjects(t){if(0===t.length)return[];for(const e of t)e._core=this.core,p.isInstanceOf(e,"KritzelImage")&&await e.prepareForInsert();return this.core.store.objects.transaction((()=>{for(const e of t){if(e.id=e.generateId(),e._core=this.core,e.zIndex=this.core.store.currentZIndex,e.workspaceId=this.core.store.state.activeWorkspace.id,p.isInstanceOf(e,"KritzelText")){const t=e.content;e.editor=e.createEditor(),t&&e.setContent(t)}if(p.isInstanceOf(e,"KritzelGroup")&&e._pendingChildren.length>0){const t=new Map,n=[],i=e=>{if(0===e._pendingChildren.length)return;const r=e._pendingChildren;e._pendingChildren=[],e.childIds=[],r.forEach((r=>{const s=r.id;r.id=r.generateId(),r._core=this.core,r.zIndex=this.core.store.currentZIndex,r.workspaceId=this.core.store.state.activeWorkspace.id,t.set(s,r.id),e.childIds.push(r.id),n.push(r),p.isInstanceOf(r,"KritzelGroup")&&i(r)}))};i(e),n.forEach((e=>{p.isInstanceOf(e,"KritzelLine")&&(e.startAnchor&&t.has(e.startAnchor.objectId)&&(e.startAnchor={objectId:t.get(e.startAnchor.objectId)}),e.endAnchor&&t.has(e.endAnchor.objectId)&&(e.endAnchor={objectId:t.get(e.endAnchor.objectId)}))})),n.forEach((t=>{this.core.addObject(t)})),e.finalize(),this.core.anchorManager.rebuildIndex()}this.core.addObject(e)}})),this.core.rerender(),await new Promise((t=>{requestAnimationFrame((()=>requestAnimationFrame((()=>t()))))})),this.emitObjectsChange(),this.emitObjectsAdded(t),t}async updateObject(t,e){return this.core.deselectAllObjects(),this.core.updateObject(t,e),this.core.rerender(),this.emitObjectsChange(),this.emitObjectsUpdated([{object:t,changedProperties:Object.keys(e)}]),t}async removeObject(t){const e=this.core.store.objects;return e?(this.core.deselectAllObjects(),e.remove((e=>e.id===t.id)),this.core.rerender(),this.emitObjectsChange(),this.emitObjectsRemoved([t]),t):null}async removeObjects(t){const e=this.core.store.objects;return e&&0!==t.length?(e.transaction((()=>{for(const e of t)this.core.removeObject(e)})),this.core.rerender(),this.emitObjectsChange(),this.emitObjectsRemoved(t),t):[]}async getSelectedObjects(){const t=this.core.store.selectionGroup;return t?t.objects:[]}async getDisplayableShortcuts(){return this.keyHandler.getDisplayableShortcuts()}async selectObjects(t){const e=this.core.toolRegistry.getTool("selection");e&&(this.core.store.state.activeTool?.onDeactivate(),this.core.store.setState("activeTool",e),this.core.deselectAllObjects(),this.core.selectObjects(t))}async selectAllObjectsInViewport(){const t=this.core.toolRegistry.getTool("selection");t&&(this.core.store.state.activeTool?.onDeactivate(),this.core.store.setState("activeTool",t),this.core.deselectAllObjects(),this.core.selectAllObjectsInViewport())}async clearSelection(){this.core.clearSelection()}async centerObjectInViewport(t){return t.centerInViewport(),this.core.updateObject(t,t),this.core.rerender(),t}async panToObject(t){this.viewport.panTo(t.centerX,t.centerY)}async backToContent(){return this.viewport.centerFitNearestContent(20)}async centerAllObjects(t=!0){return this.viewport.centerFitAllObjects(t)}async centerObjects(t,e=!0){return this.viewport.centerFitObjects(t,e)}async setViewport(t,e,n){this.viewport.setViewport(t,e,n)}async panTo(t,e){this.viewport.panTo(t,e)}async zoomTo(t,e,n){this.viewport.zoomTo(t,e,n)}async zoomIn(t,e){this.viewport.zoomIn(t,e)}async zoomOut(t,e){this.viewport.zoomOut(t,e)}async getViewport(){return this.viewport.getViewport()}async screenToWorld(t,e){return this.viewport.screenToWorld(t,e)}async worldToScreen(t,e){return this.viewport.worldToScreen(t,e)}async getObjectsInViewport(){return this.core.getObjectsInViewport()}async getScreenshot(t="png",e){if(!this.host)return null;const n={objects:this.core.store.objects,activeWorkspace:this.core.store.state.activeWorkspace,workspaces:this.core.store.state.workspaces,activeTool:this.core.store.state.activeTool,isReady:this.core.store.state.isReady,translateX:this.core.store.state.translateX,translateY:this.core.store.state.translateY,scale:this.core.store.state.scale},i={filter:t=>!("KRITZEL-CONTEXT-MENU"===t.tagName||"KRITZEL-AWARENESS-CURSORS"===t.tagName||t.classList&&t.classList.contains("debug-panel"))};let r;(e?.includeBackground??1)||(i.backgroundColor="transparent");try{r="svg"===t?await Je(this.host,i):await async function(t,e={}){return(await async function(t,e={}){const{width:n,height:i}=Se(t,e),r=await Je(t,e),s=await ze(r),o=document.createElement("canvas"),a=o.getContext("2d"),c=e.pixelRatio||function(){let t,e;try{e=process}catch(t){}const n=e&&e.env?e.env.devicePixelRatio:null;return n&&(t=parseInt(n,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}(),l=e.canvasWidth||n,h=e.canvasHeight||i;return o.width=l*c,o.height=h*c,e.skipAutoScale||function(t){(t.width>Me||t.height>Me)&&(t.width>Me&&t.height>Me?t.width>t.height?(t.height*=Me/t.width,t.width=Me):(t.width*=Me/t.height,t.height=Me):t.width>Me?(t.height*=Me/t.width,t.width=Me):(t.width*=Me/t.height,t.height=Me))}(o),o.style.width=`${l}`,o.style.height=`${h}`,e.backgroundColor&&(a.fillStyle=e.backgroundColor,a.fillRect(0,0,o.width,o.height)),a.drawImage(s,0,0,o.width,o.height),o}(t,e)).toDataURL()}(this.host,i)}finally{this.core.store.state.objects=n.objects,this.core.store.state.activeWorkspace=n.activeWorkspace,this.core.store.state.workspaces=n.workspaces,this.core.store.state.activeTool=n.activeTool,this.core.store.state.isReady=n.isReady,this.core.store.state.translateX=n.translateX,this.core.store.state.translateY=n.translateY,this.core.store.state.scale=n.scale,this.core.rerender()}return r}async exportViewportAsPng(t){try{const e=`${this.core.store.state?.activeWorkspace?.name||"workspace"}-${(new Date).toISOString().replace(/[:.]/g,"-")}.png`,n=await this.getScreenshot("png",t);if(!n)return void console.error("Failed to export viewport as PNG: screenshot could not be generated");const i=document.createElement("a");i.download=e,i.href=n,i.click()}catch(t){console.error("Failed to export viewport as PNG:",t)}}async exportViewportAsSvg(t){try{const e=`${this.core.store.state?.activeWorkspace?.name||"workspace"}-${(new Date).toISOString().replace(/[:.]/g,"-")}.svg`,n=await this.getScreenshot("svg",t);if(!n)return void console.error("Failed to export viewport as SVG: screenshot could not be generated");const i=document.createElement("a");i.download=e,i.href=n,i.click()}catch(t){console.error("Failed to export viewport as SVG:",t)}}async getSelectedObjectsAsSvgString(t){const e=await this.getSelectedObjects();if(!e||0===e.length)return null;const n=t?.theme??this.core.themeManager.getStoredTheme(),i=await me.resolveImageDataUrls(e,this.core.assetResolver);return me.generateSvg(e,{theme:n,padding:t?.padding??0,includeXmlDeclaration:!0,rasterSafeForCanvas:t?.rasterSafeForCanvas??!1,imageDataUrls:i})}async exportSelectedObjectsAsSvg(t){try{const e=await this.getSelectedObjectsAsSvgString(t);if(!e)return void console.warn("No objects selected for SVG export");const n=`selection-${(new Date).toISOString().replace(/[:.]/g,"-")}.svg`,i=new Blob([e],{type:"image/svg+xml;charset=utf-8"}),r=URL.createObjectURL(i),s=document.createElement("a");s.download=n,s.href=r,s.click(),URL.revokeObjectURL(r)}catch(t){console.error("Failed to export selected objects as SVG:",t)}}async getSelectedObjectsAsPngDataUrl(t){const e=await this.getSelectedObjectsAsSvgString({theme:t?.theme,padding:t?.padding,rasterSafeForCanvas:!0});if(!e)return null;const n=t?.scale??2;return new Promise(((t,i)=>{const r=new Image,s=new Blob([e],{type:"image/svg+xml;charset=utf-8"}),o=URL.createObjectURL(s);r.onload=()=>{const e=document.createElement("canvas");e.width=r.width*n,e.height=r.height*n;const s=e.getContext("2d");if(!s)return URL.revokeObjectURL(o),void i(new Error("Failed to get canvas context"));s.scale(n,n),s.drawImage(r,0,0),URL.revokeObjectURL(o),t(e.toDataURL("image/png"))},r.onerror=()=>{URL.revokeObjectURL(o),i(new Error("Failed to load SVG for PNG conversion"))},r.src=o}))}async exportSelectedObjectsAsPng(t){try{const e=await this.getSelectedObjectsAsPngDataUrl(t);if(!e)return void console.warn("No objects selected for PNG export");const n=`selection-${(new Date).toISOString().replace(/[:.]/g,"-")}.png`,i=document.createElement("a");i.download=n,i.href=e,i.click()}catch(t){console.error("Failed to export selected objects as PNG:",t)}}async exportAsJson(){const t=this.core.store.state.activeWorkspace;if(!t)throw new Error("Cannot export workspace: no active workspace is loaded");const e=t.serialize({includeObjects:!0});return JSON.stringify(e,null,2)}async importFromJson(t){const e=JSON.parse(t);if(!e.__class__||"KritzelWorkspace"!==e.__class__)throw new Error("Invalid workspace data: missing or incorrect __class__ identifier");e.version&&e.version!==I&&console.warn(`Workspace version mismatch: expected ${I}, got ${e.version}`);const n=R.generateUUID();let i=e.viewport||{centerWorldX:0,centerWorldY:0,scale:1};if("translateX"in i&&!("centerWorldX"in i)){const t=i.scale??1;i={centerWorldX:-(i.translateX??0)/t,centerWorldY:-(i.translateY??0)/t,scale:t}}const r=new T(n,e.name||"Imported Workspace",i);if(this.core.createWorkspace(r),this.workspacesChange.emit(this.core.store.state.workspaces),this.core.beforeWorkspaceChange(),await this.core.initializeWorkspace(r),e.objects&&Array.isArray(e.objects)){const t=new se(this.core);for(const i of e.objects){const e=t.revive(i);e&&(e.workspaceId=n,this.core.addObject(e))}}this.core.rerender(),this.activeWorkspaceChange.emit(r)}async loadObjectsFromJson(t){const e=JSON.parse(t);if(!e.__class__||"KritzelWorkspace"!==e.__class__)throw new Error("Invalid workspace data: missing or incorrect __class__ identifier");e.version&&e.version!==I&&console.warn(`Workspace version mismatch: expected ${I}, got ${e.version}`);const n=this.core.store.state.activeWorkspace;if(!n)throw new Error("Cannot load objects: no active workspace is loaded");const i=n.id;let r=0;if(e.objects&&Array.isArray(e.objects)){const t=new se(this.core);for(const n of e.objects){const e=t.revive(n);e&&(e.workspaceId=i,this.core.addObject(e),r++)}}return this.core.rerender(),r}async downloadAsJson(t){try{const e=await this.exportAsJson(),n=this.core.store.state?.activeWorkspace?.name||"workspace",i=(new Date).toISOString().replace(/[:.]/g,"-"),r=t||`${n}-${i}`,s=new Blob([e],{type:"application/json;charset=utf-8"}),o=URL.createObjectURL(s),a=document.createElement("a");a.download=`${r}.json`,a.href=o,a.click(),URL.revokeObjectURL(o)}catch(t){console.error("Failed to download workspace as JSON:",t)}}async importFromFile(){return new Promise(((t,e)=>{const n=document.createElement("input");n.type="file",n.accept=".json,application/json",n.style.display="none";const i=()=>{n.removeEventListener("change",r),n.removeEventListener("cancel",s),document.body.removeChild(n)},r=async n=>{const r=n.target,s=r.files?.[0];if(!s)return i(),void t();try{const n=new FileReader;n.onload=async n=>{try{const e=n.target?.result;await this.importFromJson(e),i(),t()}catch(t){i(),console.error("Failed to import workspace from file:",t),e(t)}},n.onerror=()=>{i(),console.error("Failed to read file:",n.error),e(n.error)},n.readAsText(s)}catch(t){i(),console.error("Failed to process file:",t),e(t)}},s=()=>{i(),t()};n.addEventListener("change",r),n.addEventListener("cancel",s),document.body.appendChild(n),n.click()}))}async createWorkspace(t){return await this.core.createWorkspace(t),this.workspacesChange.emit(this.core.store.state.workspaces),t}async updateWorkspace(t){await this.core.updateWorkspace(t),this.workspacesChange.emit(this.core.store.state.workspaces)}async deleteWorkspace(t){await this.core.deleteWorkspace(t),this.workspacesChange.emit(this.core.store.state.workspaces)}async getWorkspaces(){return await this.core.getWorkspaces()}async getActiveWorkspace(){const t=this.core.store.state.activeWorkspace;if(!t)throw new Error("No active workspace is loaded");return t}async getIsPublic(){return this.core.getIsPublic()}async loadSharedWorkspace(t){const e=t;let n=this.core.getWorkspaces().find((t=>t.id===e));n?n.isPublic=!0:(n=new T(e,"Shared Workspace"),n.isPublic=!0,this.core.createWorkspace(n)),this.workspacesChange.emit(this.core.store.state.workspaces),this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(n),this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace)}async reinitSync(){this.core.setSyncConfig(this.syncConfig),this.core.setAssetStorageConfig(this.assetStorageConfig),this.core.store.objects?.clearCursorPosition(),this.core.store.objects?.destroy(),this.core.appStateMap.destroy(),this.core.assetResolver.destroy(),this._isYjsInitialized=!1,this._isAssetStorageInitialized=!1,await this.initializeSyncAndWorkspace()}async saveSettings(t){const e=this.core.getStorageKey("kritzel-settings");localStorage.setItem(e,JSON.stringify(t))}async loadSettings(){const t=this.core.getStorageKey("kritzel-settings"),e=localStorage.getItem(t);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async registerLocales(t){this.core.localizationManager.registerLocales(t),this.core.localizationManager.setLocale(this.core.localizationManager.currentLocale)}async setLocale(t){this.locale=t,this.core.localizationManager.setLocale(t)}async getLocale(){return this.core.localizationManager.currentLocale}async getAvailableLocales(){return this.core.localizationManager.getAvailableLocales()}async getAvailableLocaleOptions(){return this.core.localizationManager.getAvailableLocaleOptions()}async t(t,e){return this.core.localizationManager.translate(t,e)}async getResolvedTerms(){return this.core.localizationManager.getAllTerms()}core;viewport;contextMenuHandler;keyHandler;contextMenuElement=null;_lastHadSelectionGroup=!1;_isViewportReady=!1;_isYjsInitialized=!1;_isAssetStorageInitialized=!1;_isResolvingActiveWorkspaceId=!1;_stateChangeListenersRegistered=!1;_workspaceInitializationPromise=null;_workspaceInitializationTargetKey=null;_syncInitPromise=null;_syncConfigRevision=0;_assetStorageConfigRevision=0;_isWorkspaceLoading=!1;_hasLoggedUnlicensedWelcomeBanner=!1;_previousVisibleCustomElements=new Set;_defaultUndoState={canUndo:!1,canRedo:!1,undoStackSize:0,redoStackSize:0};_objectDistanceFadeNearScale=1;_objectDistanceFadeFarScale=.15;_objectDistanceFadeMinOpacity=0;_objectDistanceFadeCloseStartScale=2;_objectDistanceFadeCloseMaxScale=4;_objectDistanceFadeCloseMinOpacity=0;syncLoadingState(){this.core.store.state.isLoading=this._isWorkspaceLoading||this.isLoading}applyToolConfig(t,e){if(Object.entries(e).forEach((([e,n])=>{t[e]=n})),"palettes"in e&&"type"in e){const n=e.palettes[e.type];n&&(t.palette=n)}if("sizes"in e&&null!=e.sizes&&"type"in e){const n=e,i=n.sizes?.[n.type];i&&(t.sizes=i)}}get isSelecting(){return this.core.store.state.activeTool instanceof w&&this.core.store.state.isSelecting}get isSelectionActive(){return this.core.store.state.activeTool instanceof w&&null!==this.core.store.selectionGroup}constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.isEngineReady=n(this,"isEngineReady"),this.activeToolChange=n(this,"activeToolChange"),this.objectsSelectionChange=n(this,"objectsSelectionChange"),this.workspacesChange=n(this,"workspacesChange"),this.activeWorkspaceChange=n(this,"activeWorkspaceChange"),this.longpress=n(this,"longpress"),this.objectsChange=n(this,"objectsChange"),this.objectsAdded=n(this,"objectsAdded"),this.objectsRemoved=n(this,"objectsRemoved"),this.objectsUpdated=n(this,"objectsUpdated"),this.undoStateChange=n(this,"undoStateChange"),this.objectsInViewportChange=n(this,"objectsInViewportChange"),this.viewportChange=n(this,"viewportChange"),this.awarenessChange=n(this,"awarenessChange"),this.notificationsChange=n(this,"notificationsChange"),this.core=new we(this)}disconnectedCallback(){this.throttledPointerMoveMulti.cancel(),this.core.store.allObjects&&this.core.store.allObjects.forEach((t=>{p.isInstanceOf(t,"KritzelCustomElement")&&t.unmount()})),this.core.store.objects?.clearCursorPosition(),this.core.store.objects&&this.core.store.objects.destroy(),this.core.appStateMap.destroy(),this.core.cursorManager.cleanup(),this.core.themeManager.cleanup(),this.core.licenseManager.destroy()}componentWillLoad(){this.core.setEditorId(this.editorId),this.themes&&this.themes.length>0&&this.core.themeManager.registerThemes(this.themes);const t=this.host.closest("kritzel-editor");this.core.themeManager.injectThemeEarly(t||this.host),this.locales&&this.locales.length>0&&this.core.localizationManager.registerLocales(this.locales),this.core.localizationManager.setFallbackLocale(this.fallbackLocale),this.core.localizationManager.setLocale(this.locale),this.core.licenseManager.validate(this.licenseKey),this.core.licenseManager.startPeriodicValidation(),this.core.setUser(this.user),this.validateScaleMax(this.scaleMax),this.validateScaleMin(this.scaleMin),this.core.store.state.lockDrawingScale=this.lockDrawingScale,this.core.store.state.viewportBoundaryLeft=this.viewportBoundaryLeft,this.core.store.state.viewportBoundaryRight=this.viewportBoundaryRight,this.core.store.state.viewportBoundaryTop=this.viewportBoundaryTop,this.core.store.state.viewportBoundaryBottom=this.viewportBoundaryBottom,this._isWorkspaceLoading=!0,this.syncLoadingState()}async componentDidLoad(){setTimeout((async()=>{this.contextMenuHandler=new re(this.core,this.globalContextMenuItems??[],this.objectContextMenuItems??[]),this.keyHandler=new ie(this.core),this.viewport=new ne(this.core,this.host),this._isViewportReady=!0,this.core.cursorManager.setTargetElement(this.cursorTarget||document.body),this.host.shadowRoot&&this.core.cursorManager.setShadowRoot(this.host.shadowRoot);const t=this.host.closest("kritzel-editor");this.core.themeManager.setTargetElement(t||this.host),await this.initializeSyncAndWorkspace(),!1===this.core.store.state.isReady&&(this.core.store.state.isReady=!0,this.logUnlicensedWelcomeBanner(),this.isEngineReady.emit(this.core.store.state))}),50)}async initializeSyncAndWorkspace(){if(this._syncInitPromise)return this._syncInitPromise;this._syncInitPromise=this.doInitializeSyncAndWorkspace();try{await this._syncInitPromise}finally{this._syncInitPromise=null}}async initializeAssetStorage(){if(this._isAssetStorageInitialized)return;const t=this._assetStorageConfigRevision;this.core.setAssetStorageConfig(this.assetStorageConfig),await this.core.initializeAssetStorage(),t!==this._assetStorageConfigRevision&&(this.core.assetResolver.destroy(),this.core.setAssetStorageConfig(this.assetStorageConfig),await this.core.initializeAssetStorage()),this._isAssetStorageInitialized=!0}logUnlicensedWelcomeBanner(){this.core.licenseManager.isLicensed||this._hasLoggedUnlicensedWelcomeBanner||(this._hasLoggedUnlicensedWelcomeBanner=!0,console.info("%c👋 Welcome to Kritzel","color: #007AFF; font-weight: 700;"),console.info("This version of Kritzel is not licensed. Get a license at: https://kritzel.io"))}async doInitializeSyncAndWorkspace(){const t=this._syncConfigRevision;if(this.core.setSyncConfig(this.syncConfig),this.core.setAssetStorageConfig(this.assetStorageConfig),this._isYjsInitialized||(await this.core.initializeYjs(),t!==this._syncConfigRevision&&(this.core.appStateMap.destroy(),this.core.setSyncConfig(this.syncConfig),this.core.setAssetStorageConfig(this.assetStorageConfig),await this.core.initializeYjs()),this._isYjsInitialized=!0),!this._isAssetStorageInitialized&&this.assetStorageConfig&&await this.initializeAssetStorage(),this.activeWorkspaceId){const t=this.core.getWorkspaces().find((t=>t.id===this.activeWorkspaceId));t?await this.initializeWorkspaceIfNeeded(t):await this.initializeWorkspaceIfNeeded()}else{const t=this.resolveStartupWorkspace();await this.initializeWorkspaceIfNeeded(t)}const e=this.core.store.state.activeWorkspace;e&&this.activeWorkspaceChange.emit(e),this._stateChangeListenersRegistered||(this.core.appStateMap.onRemoteChange((()=>{this.workspacesChange.emit(this.core.store.state.workspaces),this.tryResolveActiveWorkspaceFromId()})),this._registerStateChangeListeners(),this._stateChangeListenersRegistered=!0),this.tryResolveActiveWorkspaceFromId()}resolveStartupWorkspace(){if(this.activeWorkspaceId){const t=this.core.getWorkspaces().find((t=>t.id===this.activeWorkspaceId));if(t)return t;console.warn(`[KritzelEngine] No workspace found with ID: ${this.activeWorkspaceId}`)}return this.workspace}tryResolveActiveWorkspaceFromId(){this.activeWorkspaceId&&!this._isResolvingActiveWorkspaceId&&this.core.store.state.activeWorkspace?.id!==this.activeWorkspaceId&&(this._isResolvingActiveWorkspaceId=!0,this.switchToWorkspaceById(this.activeWorkspaceId,!1).finally((()=>{this._isResolvingActiveWorkspaceId=!1})))}async switchToWorkspaceById(t,e=!0){const n=this.core.getWorkspaces().find((e=>e.id===t));n?this.core.store.state.activeWorkspace?.id!==n.id&&(this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(n),this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace)):e&&console.warn(`[KritzelEngine] No workspace found with ID: ${t}`)}async initializeWorkspaceIfNeeded(t,e){const n=t?.id??null,i=n??(e?.skipFallbackCreation?"__NO_FALLBACK__":"__AUTO__");if(n&&this.core.store.state.activeWorkspace?.id===n)return;if(this._workspaceInitializationPromise&&this._workspaceInitializationTargetKey===i)return void await this._workspaceInitializationPromise;this._isWorkspaceLoading=!0,this.syncLoadingState();const r=this.core.initializeWorkspace(t,e);this._workspaceInitializationPromise=r,this._workspaceInitializationTargetKey=i;try{await r}finally{this._workspaceInitializationPromise===r&&(this._workspaceInitializationPromise=null,this._workspaceInitializationTargetKey=null),this._isWorkspaceLoading=!1,this.syncLoadingState()}}emitObjectsChange(){const t=this.core.store.objects;if(!t)return this.objectsChange.emit([]),this.undoStateChange.emit(this._defaultUndoState),void(this._lastHadSelectionGroup&&(this._lastHadSelectionGroup=!1,this.objectsSelectionChange.emit()));const e=t.undoState,n=null!==this.core.store.selectionGroup;this.objectsChange.emit(this.core.store.allObjects),this.undoStateChange.emit(e),this._lastHadSelectionGroup!==n&&(this._lastHadSelectionGroup=n,this.objectsSelectionChange.emit())}emitObjectsAdded(t){this.objectsAdded.emit({objects:t})}emitObjectsRemoved(t){this.objectsRemoved.emit({objects:t})}emitObjectsUpdated(t){this.objectsUpdated.emit({objects:t})}emitAwarenessChange(t){this.awarenessChange.emit(t)}emitObjectsInViewportChange(){this.objectsInViewportChange.emit(this.core.store.objectsInViewport)}_registerStateChangeListeners(){this.core.store.onStateChange("activeTool",this._handleActiveToolChange.bind(this))}_handleActiveToolChange(t){t instanceof w||(this.core.clearSelection(),this.core.store.objects?.remove((t=>t instanceof g)),this.core.store.setSelectionBox(null),this.core.store.objects?.clearLocalSelectionBox(),this.core.store.state.isSelecting=!1,this.core.store.state.isResizeHandleSelected=!1,this.core.store.state.isRotationHandleSelected=!1),t instanceof m||this.core.resetActiveText(),t instanceof Ot||this.core.resetActiveShape(),this.core.store.state.skipContextMenu=!1,t&&this.activeToolChange.emit(t),A.forceHideKeyboard(),this.core.rerender()}getObjectDistanceFadeMultiplier(t,e){if(!this.isObjectDistanceFadingActive)return 1;const n=Math.max(Number.isFinite(e)?e:1,Number.EPSILON)/Math.max(Number.isFinite(t)?t:1,Number.EPSILON),i=this.getFarDistanceFadeMultiplier(n),r=this.getCloseDistanceFadeMultiplier(n);return Math.min(i,r)}getFarDistanceFadeMultiplier(t){if(t>=this._objectDistanceFadeNearScale)return 1;if(t<=this._objectDistanceFadeFarScale)return this._objectDistanceFadeMinOpacity;const e=(this._objectDistanceFadeNearScale-t)/(this._objectDistanceFadeNearScale-this._objectDistanceFadeFarScale);return 1-e*e*(3-2*e)*(1-this._objectDistanceFadeMinOpacity)}getCloseDistanceFadeMultiplier(t){if(t<=this._objectDistanceFadeCloseStartScale)return 1;if(t>=this._objectDistanceFadeCloseMaxScale)return this._objectDistanceFadeCloseMinOpacity;const e=(t-this._objectDistanceFadeCloseStartScale)/(this._objectDistanceFadeCloseMaxScale-this._objectDistanceFadeCloseStartScale);return 1-e*e*(3-2*e)*(1-this._objectDistanceFadeCloseMinOpacity)}shouldApplyDistanceFade(t){return!p.isInstanceOf(t,"KritzelSelectionGroup")&&!p.isInstanceOf(t,"KritzelSelectionBox")}getObjectEffectiveOpacity(t,e){const n=Number.isFinite(t.opacity)?t.opacity:1,i=this.shouldApplyDistanceFade(t)?this.getObjectDistanceFadeMultiplier(t.scale,e):1;return{multiplied:(t.markedForRemoval?.5:1)*n*i,overridden:((t.markedForRemoval?.5:n)*i).toString()}}getSelectionHandleCapabilities(t){const e=p.isInstanceOf(t,"KritzelSelectionGroup")?t.objects:[t];return{canRenderResizeHandles:e.every((t=>!1!==t.isResizable)),canRenderRotationHandle:e.every((t=>!1!==t.isRotatable))}}render(){if(!this.viewport)return i(r,null,this.core.store.state.isLoading&&i("div",{class:"workspace-loading-overlay"},i("span",{class:"workspace-loading-spinner"}),this.core.localizationManager.translate("engine.loading")));const t=this.core.themeManager.getStoredTheme(),e=window.getComputedStyle(this.host).getPropertyValue("--kritzel-selection-handle-size").trim()||"6px",n=parseFloat(e),s=2*n<14?14:n,o=this.core.store.state.scale,a=this.core.store.state.viewportWidth/2+this.core.store.state.translateX,c=this.core.store.state.viewportHeight/2+this.core.store.state.translateY,l=this.core.store.objectsInViewport,h=t=>this.core.store.state.isScaling||p.isInstanceOf(t,"KritzelSelectionGroup")?"none":"auto",u=t=>t.markedForRemoval||p.isInstanceOf(t,"KritzelSelectionGroup")&&1===t.objects.length&&p.isInstanceOf(t.objects[0],"KritzelCustomElement")?"none":"auto",f=new Set;return l.forEach((t=>{p.isInstanceOf(t,"KritzelCustomElement")&&f.add(t.id)})),this._previousVisibleCustomElements.forEach((t=>{if(!f.has(t)){const e=this.core.store.objects.findById(t);e&&p.isInstanceOf(e,"KritzelCustomElement")&&e.unmount()}})),this._previousVisibleCustomElements=f,this.core.cursorManager.applyCursor(),this.core.store.state.hasViewportChanged&&(this.viewportChange.emit(this.viewport.getViewport()),this.core.store.totalObjectCount>0&&this.emitObjectsInViewportChange()),i(r,null,this.core.store.state.isLoading&&i("div",{class:"workspace-loading-overlay"},i("span",{class:"workspace-loading-spinner"}),"Loading..."),this.core.store.state.debugInfo.showViewportInfo&&i("div",{class:"debug-panel"},i("div",null,"ActiveWorkspaceId: ",this.core.store.state?.activeWorkspace?.id),i("div",null,"ActiveWorkspaceName: ",this.core.store.state?.activeWorkspace?.name),i("div",null,"TranslateX: ",this.core.store.state?.translateX),i("div",null,"TranslateY: ",this.core.store.state?.translateY),i("div",null,"ViewportWidth: ",this.core.store.state?.viewportWidth),i("div",null,"ViewportHeight: ",this.core.store.state?.viewportHeight),i("div",null,"PointerCount: ",this.core.store.state.pointers.size),i("div",null,"Scale: ",this.core.store.state?.scale),i("div",null,"ActiveTool: ",this.core.store.state?.activeTool?.name),i("div",null,"HasViewportChanged: ",this.core.store.state?.hasViewportChanged?"true":"false"),i("div",null,"IsEnabled: ",this.core.store.state?.isEnabled?"true":"false"),i("div",null,"IsScaling: ",this.core.store.state?.isScaling?"true":"false"),i("div",null,"IsPanning: ",this.core.store.state?.isPanning?"true":"false"),i("div",null,"IsSelecting: ",this.isSelecting?"true":"false"),i("div",null,"IsSelectionActive: ",this.isSelectionActive?"true":"false"),i("div",null,"IsResizeHandleSelected: ",this.core.store.state.isResizeHandleSelected?"true":"false"),i("div",null,"IsRotationHandleSelected: ",this.core.store.state.isRotationHandleSelected?"true":"false"),i("div",null,"IsRotationHandleHovered: ",this.core.store.state.isRotationHandleHovered?"true":"false"),i("div",null,"IsDrawing: ",this.core.store.state.isDrawing?"true":"false"),i("div",null,"IsWriting: ",this.core.store.state.isWriting?"true":"false"),i("div",null,"IsPointerDown: ",this.core.store.isPointerDown?"true":"false"),i("div",null,"PointerX: ",this.core.store.state?.pointerX),i("div",null,"PointerY: ",this.core.store.state?.pointerY),i("div",null,"TotalObjects: ",this.core.store.totalObjectCount),i("div",null,"ObjectsInViewport: ",this.core.store.objectsInViewport.length),i("div",null,"SelectedObjects: ",this.core.store.selectionGroup?.objects.length||0),i("div",null,"ViewportCenter: (",a.toFixed(2),", ",c.toFixed(2),")")),i("div",{id:"origin",class:"origin",style:{transform:`matrix(${this.core.store.state?.scale}, 0, 0, ${this.core.store.state?.scale}, ${this.core.store.state?.translateX}, ${this.core.store.state?.translateY})`}},l?.map((e=>{const{multiplied:r,overridden:a}=this.getObjectEffectiveOpacity(e,o);return i("div",{key:e.id,id:e.id,class:"object",style:{transform:e?.transformationMatrix,transformOrigin:"top left",position:"absolute",zIndex:this.core.displaySelectionLineUI(e)?"10001":e.zIndex.toString(),pointerEvents:h(e)}},p.isInstanceOf(e,"KritzelPath")&&i("svg",{ref:t=>t&&e.mount(t),xmlns:"http://www.w3.org/2000/svg",style:{height:e?.totalHeight+"px",width:e?.totalWidth+"px",left:"0",top:"0",position:"absolute",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,pointerEvents:e.markedForRemoval?"none":"auto",overflow:"visible"},viewBox:e?.viewBox},i("path",{d:e?.d,fill:M.applyOpacity(e.fill,r,t),stroke:M.applyOpacity(e?.stroke,r,t),"shape-rendering":e.isLowRes()?"optimizeSpeed":"auto"})),p.isInstanceOf(e,"KritzelLine")&&i("svg",{ref:t=>t&&e.mount(t),xmlns:"http://www.w3.org/2000/svg",style:{height:e?.totalHeight+"px",width:e?.totalWidth+"px",left:"0",top:"0",position:"absolute",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,pointerEvents:e.markedForRemoval?"none":"auto",overflow:"visible"},viewBox:e?.viewBox},(e.hasStartArrow||e.hasEndArrow)&&i("defs",null,e.hasStartArrow&&i("marker",{id:e.startMarkerId,markerWidth:e.getArrowSize("start"),markerHeight:e.getArrowSize("start"),refX:0,refY:e.getArrowSize("start")/2,orient:"auto-start-reverse",markerUnits:"userSpaceOnUse"},i("path",{d:e.getArrowPath(e.arrows?.start?.style),fill:M.applyOpacity(e.getArrowFill("start"),r),transform:`scale(${e.getArrowSize("start")/10})`})),e.hasEndArrow&&i("marker",{id:e.endMarkerId,markerWidth:e.getArrowSize("end"),markerHeight:e.getArrowSize("end"),refX:0,refY:e.getArrowSize("end")/2,orient:"auto",markerUnits:"userSpaceOnUse"},i("path",{d:e.getArrowPath(e.arrows?.end?.style),fill:M.applyOpacity(e.getArrowFill("end"),r),transform:`scale(${e.getArrowSize("end")/10})`}))),i("path",{d:this.core.anchorManager.computeClippedLinePath(e),fill:"none",stroke:"transparent","stroke-width":Math.max(e?.strokeWidth||0,10),"stroke-linecap":"round"}),i("path",{d:this.core.anchorManager.computeClippedLinePath(e),fill:"none",stroke:M.applyOpacity(e?.stroke,r,t),"stroke-width":e?.strokeWidth,"stroke-linecap":"round","marker-start":e.hasStartArrow?`url(#${e.startMarkerId})`:void 0,"marker-end":e.hasEndArrow?`url(#${e.endMarkerId})`:void 0})),p.isInstanceOf(e,"KritzelImage")&&"ready"===e.loadState&&i("img",{ref:t=>t&&e.mount(t),src:e.resolvedSrc||e.src,style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:a,pointerEvents:e.markedForRemoval?"none":"auto",backgroundColor:M.resolveThemeColor(e.backgroundColor,t),borderColor:M.resolveThemeColor(e.borderColor,t),borderWidth:e.borderWidth+"px",borderStyle:"solid",padding:e.padding+"px",overflow:"visible",userSelect:"none",imageRendering:this.core.store.state.isScaling||this.core.store.state.isPanning?"pixelated":"auto"},draggable:!1,decoding:"async",loading:"eager",onDragStart:t=>t.preventDefault()}),p.isInstanceOf(e,"KritzelImage")&&"ready"!==e.loadState&&i("div",{ref:()=>e.ensureLoaded(),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:a,pointerEvents:e.markedForRemoval?"none":"auto",backgroundColor:M.resolveThemeColor({light:"#e5e7eb",dark:"#2a2a2a"},t),borderColor:M.resolveThemeColor("error"===e.loadState?{light:"#9ca3af",dark:"#6b7280"}:e.borderColor,t),borderWidth:"error"===e.loadState?"1px":e.borderWidth+"px",borderStyle:"solid",padding:e.padding+"px",overflow:"hidden",userSelect:"none",display:"flex",alignItems:"center",justifyContent:"center"}},i("kritzel-icon",{name:"error"===e.loadState?"image-off":"image",size:Math.max(16,.3*Math.min(e.totalWidth,e.totalHeight)),style:{color:M.resolveThemeColor({light:"#9ca3af",dark:"#6b7280"},t)}})),p.isInstanceOf(e,"KritzelCustomElement")&&i("div",{ref:t=>t&&e.mount(t),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:a,pointerEvents:e.markedForRemoval?"none":"auto",backgroundColor:M.resolveThemeColor(e.backgroundColor,t),borderColor:M.resolveThemeColor(e.borderColor,t),borderWidth:e.borderWidth+"px",borderStyle:"solid",padding:e.padding+"px",overflow:"hidden",display:"block"}}),p.isInstanceOf(e,"KritzelSelectionGroup")&&!this.core.displaySelectionLineUI(e)&&i("div",{ref:t=>t&&e.mount(t),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:e.markedForRemoval?"0.5":e.opacity.toString(),pointerEvents:u(e)}}),p.isInstanceOf(e,"KritzelSelectionBox")&&i("div",{ref:t=>t&&e.mount(t),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:e.markedForRemoval?"0.5":e.opacity.toString(),pointerEvents:e.markedForRemoval?"none":"auto",backgroundColor:M.resolveThemeColor(e.backgroundColor,t),borderColor:M.resolveThemeColor(e.borderColor,t),borderWidth:e.borderWidth+"px",borderStyle:"solid"}}),p.isInstanceOf(e,"KritzelText")&&i("div",{style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:a,pointerEvents:e.markedForRemoval?"none":"auto"}},i("div",{id:"text-object",ref:t=>t&&e.mount(t),onPointerDown:t=>e.handlePointerDown(t),onPointerMove:t=>e.handlePointerMove(t),onPointerUp:t=>e.handlePointerUp(t),style:{minWidth:e.initialWidth+"px",minHeight:e.initialHeight+"px",maxWidth:"500px",height:"auto",width:"max-content",transformOrigin:"top left",transform:`scale(${e.scaleFactor})`,backgroundColor:M.resolveThemeColor(e.backgroundColor,t),overflow:"visible"}})),p.isInstanceOf(e,"KritzelShape")&&(()=>{const n=M.resolveThemeColor(e.fillColor,t),s=M.resolveThemeColor(e.strokeColor,t),o=!!n&&"transparent"!==n&&s===n;return i("div",{ref:t=>t&&e.mount(t),onPointerDown:t=>e.handlePointerDown(t),onPointerMove:t=>e.handlePointerMove(t),onPointerUp:t=>e.handlePointerUp(t),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,pointerEvents:e.markedForRemoval?"none":"auto",overflow:"visible"}},i("svg",{xmlns:"http://www.w3.org/2000/svg",style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",overflow:"visible",pointerEvents:"none"},viewBox:e.viewBox,preserveAspectRatio:"none"},i("path",{d:e.getSvgPath(),fill:M.applyOpacity(e.fillColor,r,t),stroke:o?"none":M.applyOpacity(e.strokeColor,r,t),"stroke-width":o?0:e.strokeWidth})),i("div",{ref:t=>t&&e.mountTextEditor(t),style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center",textAlign:"center",overflow:"hidden",pointerEvents:e.isEditing?"auto":"none"}}))})(),this.core.store.state.debugInfo.showObjectInfo&&i("div",{style:{pointerEvents:"none",position:"absolute",left:`${e.totalWidth}px`,top:"0",zIndex:(e.zIndex+2).toString()}},i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"Id: ",e.id),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"userId: ",e.userId),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"width: ",e.width),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"height: ",e.height),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"translateX: ",e.translateX),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"translateY: ",e.translateY),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"scale: ",e.scale),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"rotationDegrees: ",e.rotationDegrees),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"zIndex: ",e.zIndex),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"isSelected: ",e.isSelected?"true":"false"),p.isInstanceOf(e,"KritzelCustomElement")&&i("div",null,i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"isInteractive: ",e.isInteractive?"true":"false")),p.isInstanceOf(e,"KritzelImage")&&i("div",null,i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"assetId: ",e.assetId),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"mimeType: ",e.mimeType))),(this.core.displaySelectionGroupUI(e)||this.core.displaySelectionLineUI(e))&&(()=>{const r=p.isInstanceOf(e,"KritzelSelectionGroup"),o=this.core.store.objects?.localClientId,a=this.core.store.objects?.awareness?.getStates(),c=r&&(null!=e.userId&&null!=this.core.user?.id&&e.userId!==this.core.user.id||null!=e.userId&&null!=this.core.user?.id&&e.userId===this.core.user.id&&null!=e.clientId&&null!=o&&e.clientId!==o&&!0===a?.has(e.clientId));let l;if(c&&a&&(r&&null!=e.clientId&&(l=a.get(e.clientId)?.user?.color),!l))for(const t of a.values())if(t.user?.id===e.userId){l=t.user.color;break}const h=l??(M.resolveThemeColor(e.borderColor,t)||"var(--kritzel-selection-border-color, #007AFF)"),u=l??"var(--kritzel-selection-handle-stroke-color, #007AFF)",f=null!=e.endAnchor,d=this.core.store.state.snapCandidate??this.core.store.state.snapPreviewCandidate,g=null!=e.startAnchor||"start"===d?.endpoint,v=f||"end"===d?.endpoint,w=this.core.displaySelectionLineUI(e)?"10000":(e.zIndex+1).toString(),m=e.scale??1,{canRenderResizeHandles:y,canRenderRotationHandle:b}=this.getSelectionHandleCapabilities(e);return i("svg",{xmlns:"http://www.w3.org/2000/svg",style:{zIndex:w,height:e?.totalHeight.toString(),width:e?.totalWidth.toString(),left:"0",top:"0",position:"absolute",transform:`rotate(${e.rotationDegrees}deg)`,transformOrigin:`${e.totalWidth/2}px ${e.totalHeight/2}px`,overflow:"visible",pointerEvents:"none"}},this.core.displaySelectionGroupUI(e)&&i("g",{class:"selection-group-ui",style:{pointerEvents:"none"}},(()=>{const t=c&&p.isInstanceOf(e,"KritzelSelectionGroup")&&1===e.objects.length&&p.isInstanceOf(e.objects[0],"KritzelLine")?e.objects[0]:null;return t?i("g",{class:"selection-line-borders"},i("path",{class:"selection-line-border",d:this.core.anchorManager.computeClippedLinePath(t,!0),style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"round",fill:"none"}})):i("g",{class:"selection-group-borders"},i("line",{x1:"0",y1:"0",x2:e.totalWidth,y2:"0",style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),i("line",{x1:"0",y1:"0",x2:"0",y2:e.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),i("line",{x1:"0",y1:e.totalHeight,x2:e.totalWidth,y2:e.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),i("line",{x1:e.totalWidth,y1:"0",x2:e.totalWidth,y2:e.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}))})(),!this.isSelecting&&!c&&i("g",{class:"selection-group-handles",style:{pointerEvents:"auto"}},y&&i("g",null,i("rect",{class:"resize-handle top-left",x:""+-(n-1)*m/this.core.store.state?.scale,y:""+-(n-1)*m/this.core.store.state?.scale,width:""+2*(n-1)*m/this.core.store.state?.scale,height:""+2*(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("rect",{class:"resize-handle-overlay top-left",x:""+-s*m/this.core.store.state?.scale,y:""+-s*m/this.core.store.state?.scale,width:""+2*s*m/this.core.store.state?.scale,height:""+2*s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("rect",{class:"resize-handle top-right",x:""+(e.totalWidth-(n-1)*m/this.core.store.state?.scale),y:""+-(n-1)*m/this.core.store.state?.scale,width:""+2*(n-1)*m/this.core.store.state?.scale,height:""+2*(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("rect",{class:"resize-handle-overlay top-right",x:""+(e.totalWidth-s*m/this.core.store.state?.scale),y:""+-s*m/this.core.store.state?.scale,width:""+2*s*m/this.core.store.state?.scale,height:""+2*s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("rect",{class:"resize-handle bottom-left",x:""+-(n-1)*m/this.core.store.state?.scale,y:""+(e.totalHeight-(n-1)*m/this.core.store.state?.scale),width:""+2*(n-1)*m/this.core.store.state?.scale,height:""+2*(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("rect",{class:"resize-handle-overlay bottom-left",x:""+-s*m/this.core.store.state?.scale,y:""+(e.totalHeight-s*m/this.core.store.state?.scale),width:""+2*s*m/this.core.store.state?.scale,height:""+2*s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("rect",{class:"resize-handle bottom-right",x:""+(e.totalWidth-(n-1)*m/this.core.store.state?.scale),y:""+(e.totalHeight-(n-1)*m/this.core.store.state?.scale),width:""+2*(n-1)*m/this.core.store.state?.scale,height:""+2*(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("rect",{class:"resize-handle-overlay bottom-right",x:""+(e.totalWidth-s*m/this.core.store.state?.scale),y:""+(e.totalHeight-s*m/this.core.store.state?.scale),width:""+2*s*m/this.core.store.state?.scale,height:""+2*s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}})),b&&i("g",null,i("line",{x1:e.totalWidth/2,y1:"0",x2:e.totalWidth/2,y2:-15*m/this.core.store.state?.scale,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${m} / ${this.core.store.state?.scale})`}}),i("circle",{class:"rotation-handle",cx:e.totalWidth/2,cy:-15*m/this.core.store.state?.scale,r:""+(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("circle",{class:"rotation-handle-overlay",cx:e.totalWidth/2,cy:-15*m/this.core.store.state?.scale,r:""+s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}})))),this.core.displaySelectionLineUI(e)&&p.isInstanceOf(e,"KritzelLine")&&i("g",{class:"selection-line-ui",style:{pointerEvents:"none"}},i("g",{class:"selection-line-borders"},i("path",{class:"selection-line-border",d:this.core.anchorManager.computeClippedLinePath(e,!0),style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"round",fill:"none"}})),!this.isSelecting&&!c&&i("g",{class:"selection-line-handles",style:{pointerEvents:"auto"}},i("circle",{class:"selection-line-handle start",cx:e.startX-e.x,cy:e.startY-e.y,r:""+(n-1)*e.scale/this.core.store.state?.scale,style:{fill:g?u:"var(--kritzel-selection-handle-color, #000000)",stroke:u,strokeWidth:`calc(2px * ${e.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("circle",{class:"selection-line-handle-overlay start","data-testid":"line-handle-start",cx:e.startX-e.x,cy:e.startY-e.y,r:""+s*e.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("circle",{class:"selection-line-handle center",cx:void 0!==e.controlX?(e.startX+2*e.controlX+e.endX)/4-e.x:(e.startX-e.x+e.endX-e.x)/2,cy:void 0!==e.controlY?(e.startY+2*e.controlY+e.endY)/4-e.y:(e.startY-e.y+e.endY-e.y)/2,r:""+(n-1)*e.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #000000)",stroke:u,strokeWidth:`calc(2px * ${e.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("circle",{class:"selection-line-handle-overlay center","data-testid":"line-handle-center",cx:void 0!==e.controlX?(e.startX+2*e.controlX+e.endX)/4-e.x:(e.startX-e.x+e.endX-e.x)/2,cy:void 0!==e.controlY?(e.startY+2*e.controlY+e.endY)/4-e.y:(e.startY-e.y+e.endY-e.y)/2,r:""+s*e.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("circle",{class:"selection-line-handle end",cx:e.endX-e.x,cy:e.endY-e.y,r:""+(n-1)*e.scale/this.core.store.state?.scale,style:{fill:v?u:"var(--kritzel-selection-handle-color, #000000)",stroke:u,strokeWidth:`calc(2px * ${e.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("circle",{class:"selection-line-handle-overlay end","data-testid":"line-handle-end",cx:e.endX-e.x,cy:e.endY-e.y,r:""+s*e.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}))))})())})),(()=>{const t=this.core.anchorManager.getSnapIndicatorRenderData()??this.core.anchorManager.getSnapPreviewRenderData();if(!t)return null;const e=null!=this.core.anchorManager.getSnapIndicatorRenderData();return i("svg",{xmlns:"http://www.w3.org/2000/svg",class:"snap-indicator",style:{position:"absolute",left:"0",top:"0",width:"1px",height:"1px",pointerEvents:"none",zIndex:"9999",overflow:"visible"}},i("g",null,t.snapLinePath?i("path",{d:t.snapLinePath,fill:"none",style:{stroke:e?"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))":"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.12))",strokeWidth:t.lineStrokeWidth,strokeDasharray:t.dashArray,strokeLinecap:"round"}}):void 0!==t.edgeX&&void 0!==t.edgeY&&i("line",{x1:t.edgeX,y1:t.edgeY,x2:t.centerX,y2:t.centerY,style:{stroke:e?"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))":"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.12))",strokeWidth:t.lineStrokeWidth,strokeDasharray:t.dashArray,strokeLinecap:"round"}}),i("circle",{cx:t.centerX,cy:t.centerY,r:t.indicatorRadius,style:{fill:e?"var(--kritzel-snap-indicator-fill, rgba(59, 130, 246, 0.3))":"rgba(59, 130, 246, 0.18)",stroke:e?"var(--kritzel-snap-indicator-stroke, #007bff)":"rgba(59, 130, 246, 0.5)",strokeWidth:t.indicatorStrokeWidth}})))})(),(()=>{const t=this.core.anchorManager.getAnchorLinesRenderData();return t?i("svg",{xmlns:"http://www.w3.org/2000/svg",class:"anchor-lines",style:{position:"absolute",left:"0",top:"0",width:"1px",height:"1px",pointerEvents:"none",zIndex:"9998",overflow:"visible"}},t.startAnchorViz&&i("g",{class:"anchor-line-start"},t.startAnchorViz.pathD?i("path",{d:t.startAnchorViz.pathD,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.3))",strokeWidth:`${t.lineStrokeWidth}`,strokeDasharray:t.dashArray,strokeLinecap:"round",fill:"none"}}):i("line",{x1:t.startAnchorViz.edgeX,y1:t.startAnchorViz.edgeY,x2:t.startAnchorViz.centerX,y2:t.startAnchorViz.centerY,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.3))",strokeWidth:`${t.lineStrokeWidth}`,strokeDasharray:t.dashArray,strokeLinecap:"round"}}),i("circle",{cx:t.startAnchorViz.centerX,cy:t.startAnchorViz.centerY,r:t.indicatorRadius,style:{fill:"var(--kritzel-snap-indicator-fill, rgba(59, 130, 246, 0.3))",stroke:"var(--kritzel-snap-indicator-stroke, #007bff)",strokeWidth:t.indicatorStrokeWidth}})),t.endAnchorViz&&i("g",{class:"anchor-line-end"},t.endAnchorViz.pathD?i("path",{d:t.endAnchorViz.pathD,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))",strokeWidth:`${t.lineStrokeWidth}`,strokeDasharray:t.dashArray,strokeLinecap:"round",fill:"none"}}):i("line",{x1:t.endAnchorViz.edgeX,y1:t.endAnchorViz.edgeY,x2:t.endAnchorViz.centerX,y2:t.endAnchorViz.centerY,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))",strokeWidth:`${t.lineStrokeWidth}`,strokeDasharray:t.dashArray,strokeLinecap:"round"}}),i("circle",{cx:t.endAnchorViz.centerX,cy:t.endAnchorViz.centerY,r:t.indicatorRadius,style:{fill:"var(--kritzel-snap-indicator-fill, rgba(59, 130, 246, 0.3))",stroke:"var(--kritzel-snap-indicator-stroke, #007bff)",strokeWidth:t.indicatorStrokeWidth}}))):null})()),this.core.store.state.isContextMenuVisible&&i("kritzel-context-menu",{class:"context-menu",ref:t=>this.contextMenuElement=t??null,items:this.core.store.state.contextMenuItems,objects:this.core.store.selectionGroup?.objects||[],style:{position:"absolute",left:`${this.core.store.state.contextMenuX}px`,top:`${this.core.store.state.contextMenuY}px`,zIndex:"10002"},onActionSelected:t=>{t.detail.action&&t.detail.action({x:this.core.store.state.contextMenuWorldX,y:this.core.store.state.contextMenuWorldY},this.core.store.selectionGroup?.objects||[]),this.hideContextMenu()},onClose:()=>this.hideContextMenu()}),this.core.store.objects?.hasAwareness&&i("kritzel-awareness-cursors",{core:this.core}),this.core.store.state?.activeTool instanceof tt&&!this.core.store.state.isScaling&&i("kritzel-cursor-trail",{core:this.core}),!this.core.licenseManager.isLicensed&&i("kritzel-watermark",{core:this.core,label:this.core.localizationManager.translate("watermark.poweredBy")}))}static get watchers(){return{workspace:[{onWorkspaceChange:0}],activeWorkspaceId:[{onActiveWorkspaceIdChange:0}],syncConfig:[{onSyncConfigChange:0}],assetStorageConfig:[{onAssetStorageConfigChange:0}],user:[{onUserChange:0}],globalContextMenuItems:[{onGlobalContextMenuItemsChange:0}],objectContextMenuItems:[{onObjectContextMenuItemsChange:0}],scaleMax:[{validateScaleMax:0}],scaleMin:[{validateScaleMin:0}],cursorTarget:[{onCursorTargetChange:0}],lockDrawingScale:[{onLockDrawingScaleChange:0}],isObjectDistanceFadingActive:[{onIsObjectDistanceFadingActiveChange:0}],theme:[{onThemeChange:0}],licenseKey:[{onLicenseKeyChange:0}],themes:[{onThemesChange:0}],locale:[{onLocaleChange:0}],locales:[{onLocalesChange:0}],fallbackLocale:[{onFallbackLocaleChange:0}],viewportBoundaryLeft:[{onViewportBoundaryLeftChange:0}],viewportBoundaryRight:[{onViewportBoundaryRightChange:0}],viewportBoundaryTop:[{onViewportBoundaryTopChange:0}],viewportBoundaryBottom:[{onViewportBoundaryBottomChange:0}],debugInfo:[{onDebugInfoChange:0}],isLoading:[{onIsLoadingChange:0}]}}static get style(){return":host{display:block;position:relative;height:100%;width:100%;overflow:hidden;background-color:var(--kritzel-engine-background-color, #ffffff)}:host,:host *{touch-action:none;user-select:none}.ProseMirror{outline:none}p,h1,h2,h3,h4,h5,h6,blockquote,pre{margin:0;padding:0}.workspace-loading-overlay{position:absolute;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;gap:10px;background-color:var(--kritzel-engine-loading-overlay-background, rgba(255, 255, 255, 0.6));color:var(--kritzel-engine-loading-overlay-color, #333);font-family:var(--kritzel-font-family, sans-serif);font-size:1.25rem;pointer-events:all;animation:workspace-loading-fade-in 200ms ease-out var(--kritzel-engine-loading-overlay-delay, 300ms) forwards;opacity:0}.workspace-loading-spinner{width:20px;height:20px;box-sizing:border-box;display:block;flex-shrink:0;border:2px solid var(--kritzel-engine-loading-overlay-spinner-color, #cccccc);border-top-color:var(--kritzel-engine-loading-overlay-spinner-active-color, #333333);border-radius:50%;animation:workspace-loading-spin 0.6s linear infinite}@keyframes workspace-loading-spin{to{transform:rotate(360deg)}}@keyframes workspace-loading-fade-in{to{opacity:1}}.debug-panel{position:absolute;pointer-events:none;top:0;right:0}.origin{position:relative;top:0;left:0;height:0;width:0;pointer-events:none;-webkit-transform-origin:top left;-moz-transform-origin:top left;transform-origin:top left;overflow:visible}.object{overflow:visible}.PlaygroundEditorTheme__quote{margin:0;margin-left:20px;margin-bottom:10px;font-size:15px;color:rgb(101, 103, 107);border-left-color:rgb(206, 208, 212);border-left-width:4px;border-left-style:solid;padding-left:16px}"}},[513,"kritzel-engine",{workspace:[16],editorId:[1,"editor-id"],activeWorkspaceId:[1,"active-workspace-id"],syncConfig:[16],assetStorageConfig:[16],user:[16],globalContextMenuItems:[16],objectContextMenuItems:[16],scaleMax:[1026,"scale-max"],scaleMin:[1026,"scale-min"],cursorTarget:[16],lockDrawingScale:[4,"lock-drawing-scale"],isObjectDistanceFadingActive:[4,"is-object-distance-fading-active"],theme:[1],licenseKey:[1,"license-key"],themes:[16],locale:[1],locales:[16],fallbackLocale:[1,"fallback-locale"],viewportBoundaryLeft:[2,"viewport-boundary-left"],viewportBoundaryRight:[2,"viewport-boundary-right"],viewportBoundaryTop:[2,"viewport-boundary-top"],viewportBoundaryBottom:[2,"viewport-boundary-bottom"],debugInfo:[16],isPanningEnabled:[4,"is-panning-enabled"],isZoomingEnabled:[4,"is-zooming-enabled"],isLoading:[4,"is-loading"],forceUpdate:[32],triggerSelectionChange:[64],registerTool:[64],changeActiveTool:[64],changeActiveToolByName:[64],disable:[64],enable:[64],delete:[64],copy:[64],cut:[64],paste:[64],bringForward:[64],sendBackward:[64],bringToFront:[64],sendToBack:[64],alignObjects:[64],group:[64],ungroup:[64],undo:[64],redo:[64],hideContextMenu:[64],openContextMenu:[64],getObjectById:[64],getAllObjects:[64],findObjects:[64],getObjectsTotalCount:[64],addObject:[64],addObjects:[64],updateObject:[64],removeObject:[64],removeObjects:[64],getSelectedObjects:[64],getDisplayableShortcuts:[64],selectObjects:[64],selectAllObjectsInViewport:[64],clearSelection:[64],centerObjectInViewport:[64],panToObject:[64],backToContent:[64],centerAllObjects:[64],centerObjects:[64],setViewport:[64],panTo:[64],zoomTo:[64],zoomIn:[64],zoomOut:[64],getViewport:[64],screenToWorld:[64],worldToScreen:[64],getObjectsInViewport:[64],getScreenshot:[64],exportViewportAsPng:[64],exportViewportAsSvg:[64],getSelectedObjectsAsSvgString:[64],exportSelectedObjectsAsSvg:[64],getSelectedObjectsAsPngDataUrl:[64],exportSelectedObjectsAsPng:[64],exportAsJson:[64],importFromJson:[64],loadObjectsFromJson:[64],downloadAsJson:[64],importFromFile:[64],createWorkspace:[64],updateWorkspace:[64],deleteWorkspace:[64],getWorkspaces:[64],getActiveWorkspace:[64],getIsPublic:[64],loadSharedWorkspace:[64],reinitSync:[64],saveSettings:[64],loadSettings:[64],registerLocales:[64],setLocale:[64],getLocale:[64],getAvailableLocales:[64],getAvailableLocaleOptions:[64],t:[64],getResolvedTerms:[64]},[[1,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[1,"pointerleave","handlePointerLeave"],[1,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[8,"copy","handleCopy"],[8,"cut","handleCut"],[8,"paste","handlePaste"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{workspace:[{onWorkspaceChange:0}],activeWorkspaceId:[{onActiveWorkspaceIdChange:0}],syncConfig:[{onSyncConfigChange:0}],assetStorageConfig:[{onAssetStorageConfigChange:0}],user:[{onUserChange:0}],globalContextMenuItems:[{onGlobalContextMenuItemsChange:0}],objectContextMenuItems:[{onObjectContextMenuItemsChange:0}],scaleMax:[{validateScaleMax:0}],scaleMin:[{validateScaleMin:0}],cursorTarget:[{onCursorTargetChange:0}],lockDrawingScale:[{onLockDrawingScaleChange:0}],isObjectDistanceFadingActive:[{onIsObjectDistanceFadingActiveChange:0}],theme:[{onThemeChange:0}],licenseKey:[{onLicenseKeyChange:0}],themes:[{onThemesChange:0}],locale:[{onLocaleChange:0}],locales:[{onLocalesChange:0}],fallbackLocale:[{onFallbackLocaleChange:0}],viewportBoundaryLeft:[{onViewportBoundaryLeftChange:0}],viewportBoundaryRight:[{onViewportBoundaryRightChange:0}],viewportBoundaryTop:[{onViewportBoundaryTopChange:0}],viewportBoundaryBottom:[{onViewportBoundaryBottomChange:0}],debugInfo:[{onDebugInfoChange:0}],isLoading:[{onIsLoadingChange:0}]}]);function nn(){"undefined"!=typeof customElements&&["kritzel-engine","kritzel-awareness-cursors","kritzel-context-menu","kritzel-cursor-trail","kritzel-icon","kritzel-watermark"].forEach((t=>{switch(t){case"kritzel-engine":customElements.get(s(t))||customElements.define(s(t),en);break;case"kritzel-awareness-cursors":customElements.get(s(t))||G();break;case"kritzel-context-menu":customElements.get(s(t))||D();break;case"kritzel-cursor-trail":customElements.get(s(t))||H();break;case"kritzel-icon":customElements.get(s(t))||V();break;case"kritzel-watermark":customElements.get(s(t))||C()}}))}export{Xt as A,Wt as D,Rt as E,Ut as F,Z as K,Yt as W,q as a,J as b,tt as c,Lt as d,Ot as e,Pt as f,Bt as g,Vt as h,Nt as i,Q as j,Gt as k,Qt as l,nn as m,en as n,Ht as r}
|
|
9
|
+
*/class ne{_core;_debounceUpdate;_debounceEndScaling;_animationFrameId=null;initialTouchDistance=0;startX=0;startY=0;static TOUCH_CURSOR_BROADCAST_THRESHOLD=5;_touchStartScreenX=0;_touchStartScreenY=0;_touchCursorBroadcastActive=!1;constructor(t,e){this._core=t,this._core.store.state.host=e,this._core.store.state.viewportWidth=e.clientWidth,this._core.store.state.viewportHeight=e.clientHeight,this._core.store.state.startX=0,this._core.store.state.startY=0,this._core.store.state.translateX=0,this._core.store.state.translateY=0,this._debounceUpdate=ee.debounce((()=>{this._core.updateWorkspaceViewport(this._core.store.state.translateX,this._core.store.state.translateY,this._core.store.state.scale)}),300),this._debounceEndScaling=ee.debounce((()=>{this._core.store.state.isScaling=!1,this._core.rerender()}),100)}cancelPendingUpdates(){this._debounceUpdate.cancel()}clampTranslate(t,e){const n=this._core.store.state,{scale:i,viewportWidth:r,viewportHeight:s}=n,{viewportBoundaryLeft:o,viewportBoundaryRight:a,viewportBoundaryTop:c,viewportBoundaryBottom:l}=n,h=-o*i,u=r-a*i,f=-c*i,d=s-l*i;let p=t,g=e;return Number.isFinite(u)&&Number.isFinite(h)?p=Math.max(u,Math.min(h,t)):Number.isFinite(u)?p=Math.max(u,t):Number.isFinite(h)&&(p=Math.min(h,t)),Number.isFinite(d)&&Number.isFinite(f)?g=Math.max(d,Math.min(f,e)):Number.isFinite(d)?g=Math.max(d,e):Number.isFinite(f)&&(g=Math.min(f,e)),{translateX:p,translateY:g}}getEffectiveMinScale(){const t=this._core.store.state,{viewportWidth:e,viewportHeight:n,scaleMin:i}=t,{viewportBoundaryLeft:r,viewportBoundaryRight:s,viewportBoundaryTop:o,viewportBoundaryBottom:a}=t,c=s-r,l=a-o;if(!Number.isFinite(c)||!Number.isFinite(l))return i;const h=Math.max(c>0?e/c:i,l>0?n/l:i);return Math.max(i,h)}handleResize(){this._core.store.state.viewportWidth=this._core.store.host.clientWidth,this._core.store.state.viewportHeight=this._core.store.host.clientHeight,this._core.store.state.hasViewportChanged=!0,this._core.rerender()}handlePointerDown(t){if(this.cancelViewportAnimation(),"mouse"===t.pointerType){const e=t.clientX-this._core.store.offsetX,n=t.clientY-this._core.store.offsetY;t.button===o.Right&&(this._core.store.state.isPanning=!0,this._core.store.state.startX=e,this._core.store.state.startY=n)}if("touch"===t.pointerType||"pen"===t.pointerType){const e=Array.from(this._core.store.state.pointers.values());if(1===e.length&&(this._touchStartScreenX=t.clientX,this._touchStartScreenY=t.clientY,this._touchCursorBroadcastActive=!1),2===e.length){this._core.store.objects?.clearCursorPosition();const t=this._core.store.currentPath;t&&this._core.store.objects.remove((e=>e.id===t.id)),this._core.store.state.isSelecting&&(this._core.store.state.isSelecting=!1,this._core.store.objects.remove((t=>t instanceof g)),this._core.store.setSelectionBox(null),this._core.store.selectedObjects.forEach((t=>{t.isSelected=!1}))),this._core.store.state.isScaling=!0;const n=e[0].clientX-this._core.store.offsetX,i=e[0].clientY-this._core.store.offsetY,r=e[1].clientX-this._core.store.offsetX,s=e[1].clientY-this._core.store.offsetY;this.initialTouchDistance=Math.sqrt(Math.pow(n-r,2)+Math.pow(i-s,2)),this.startX=(n+r)/2,this.startY=(i+s)/2,this._core.rerender()}}}handlePointerMove(t){if("mouse"===t.pointerType){const e=this._core.store.host.getBoundingClientRect(),n=t.clientX-e.left,i=t.clientY-e.top;if(this._core.store.state.pointerX=(n-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(i-this._core.store.state.translateY)/this._core.store.state.scale,this._core.store.objects?.updateCursorPosition(this._core.store.state.pointerX,this._core.store.state.pointerY),this._core.store.state.isPanning){const t=this.clampTranslate(this._core.store.state.translateX+(n-this._core.store.state.startX),this._core.store.state.translateY+(i-this._core.store.state.startY));this._core.store.state.translateX=t.translateX,this._core.store.state.translateY=t.translateY,this._core.store.state.startX=n,this._core.store.state.startY=i,this._core.store.state.hasViewportChanged=!0,this._core.store.state.skipContextMenu=!0,this._core.rerender(),this._debounceUpdate()}}if("touch"===t.pointerType||"pen"===t.pointerType){const e=this._core.store.host.getBoundingClientRect(),n=t.clientX-e.left,i=t.clientY-e.top,r=Array.from(this._core.store.state.pointers.values());if(this._core.store.state.isScaling||r.length>1)this._core.store.objects?.clearCursorPosition();else{if(this._core.store.state.pointerX=(n-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(i-this._core.store.state.translateY)/this._core.store.state.scale,!this._touchCursorBroadcastActive){const e=t.clientX-this._touchStartScreenX,n=t.clientY-this._touchStartScreenY;Math.sqrt(e*e+n*n)>=ne.TOUCH_CURSOR_BROADCAST_THRESHOLD&&(this._touchCursorBroadcastActive=!0)}this._touchCursorBroadcastActive&&this._core.store.objects?.updateCursorPosition(this._core.store.state.pointerX,this._core.store.state.pointerY)}if(2===r.length){const t=r[0].clientX-this._core.store.offsetX,e=r[0].clientY-this._core.store.offsetY,n=r[1].clientX-this._core.store.offsetX,i=r[1].clientY-this._core.store.offsetY,s=Math.sqrt(Math.pow(t-n,2)+Math.pow(e-i,2)),o=(t+n)/2,a=(e+i)/2,c=s/this.initialTouchDistance,l=this._core.store.state.scale*c,h=this.getEffectiveMinScale();if(l>this._core.store.state.scaleMax||l<h){const t=this.clampTranslate(this._core.store.state.translateX+o-this.startX,this._core.store.state.translateY+a-this.startY);this._core.store.state.translateX=t.translateX,this._core.store.state.translateY=t.translateY}else{const t=this._core.store.state.translateX+o-this.startX-(o-this._core.store.state.translateX)*(c-1),e=this._core.store.state.translateY+a-this.startY-(a-this._core.store.state.translateY)*(c-1);this._core.store.state.scale=l;const n=this.clampTranslate(t,e);this._core.store.state.translateX=n.translateX,this._core.store.state.translateY=n.translateY,this.initialTouchDistance=s}this.startX=o,this.startY=a,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate()}}}handlePointerUp(t){"mouse"===t.pointerType&&this._core.store.state.isPanning&&(this._core.store.state.isPanning=!1,this._core.rerender()),"touch"!==t.pointerType&&"pen"!==t.pointerType||(this._touchCursorBroadcastActive=!1,0===this._core.store.state.pointers.size&&this._debounceEndScaling())}handleWheel(t){this.cancelViewportAnimation(),t.ctrlKey?this.handleZoom(t):this.handlePan(t)}getViewport(){const t=this._core.store.state;return{translateX:t.translateX,translateY:t.translateY,scale:t.scale,width:t.viewportWidth,height:t.viewportHeight}}screenToWorld(t,e){const n=this._core.store.state;return{x:(t-n.translateX)/n.scale,y:(e-n.translateY)/n.scale}}worldToScreen(t,e){const n=this._core.store.state;return{x:t*n.scale+n.translateX,y:e*n.scale+n.translateY}}setViewport(t,e,n){const i=this._core.store.state,r=Math.min(i.scaleMax,Math.max(this.getEffectiveMinScale(),n));this.animateViewportTo(i.viewportWidth/2-t*r,i.viewportHeight/2-e*r,r)}panTo(t,e){this.setViewport(t,e,this._core.store.state.scale)}zoomTo(t,e,n){const i=this._core.store.state;void 0!==e&&void 0!==n?this.setViewport(e,n,t):this.setViewport((i.viewportWidth/2-i.translateX)/i.scale,(i.viewportHeight/2-i.translateY)/i.scale,t)}zoomIn(t,e){this.animateZoomAroundViewportCenter(t,e)}zoomOut(t,e){this.animateZoomAroundViewportCenter(1/t,e)}animateZoomAroundViewportCenter(t,e){this.cancelViewportAnimation();const n=this._core.store.state,i=n.scale,r=this.getEffectiveMinScale(),s=Math.min(n.scaleMax,Math.max(r,i*t)),o=n.viewportWidth/2,a=n.viewportHeight/2,c=(o-n.translateX)/i,l=(a-n.translateY)/i;if(s===i||e<=0)return this.applyZoomAroundCenter(s,o,a,c,l),n.isScaling=!0,this._core.rerender(),this._debounceUpdate(),void this._debounceEndScaling();const h=performance.now();n.isScaling=!0;const u=t=>{const r=Math.min((t-h)/e,1),f=r<.5?4*r*r*r:1-Math.pow(-2*r+2,3)/2;this.applyZoomAroundCenter(i+(s-i)*f,o,a,c,l),this._core.rerender(),r<1?this._animationFrameId=requestAnimationFrame(u):(this._animationFrameId=null,n.isScaling=!1,this._core.rerender(),this._debounceUpdate())};this._animationFrameId=requestAnimationFrame(u)}applyZoomAroundCenter(t,e,n,i,r){const s=this._core.store.state;s.scale=t;const o=this.clampTranslate(e-i*t,n-r*t);s.translateX=o.translateX,s.translateY=o.translateY,s.hasViewportChanged=!0}centerInViewport(t){const{scale:e,viewportWidth:n,viewportHeight:i}=this._core.store.state,{x:r,y:s,width:o,height:a}=t.rotatedBoundingBox,c=this.clampTranslate(n/2-(r+o/2)*e,i/2-(s+a/2)*e);this._core.store.state.translateX=c.translateX,this._core.store.state.translateY=c.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate()}centerFitInViewport(t){const e=Math.min(this._core.store.state.viewportWidth/(1.1*t.rotatedBoundingBox.width),this._core.store.state.viewportHeight/(1.1*t.rotatedBoundingBox.height),this._core.store.state.scaleMax),n=Math.max(e,this.getEffectiveMinScale());this._core.store.state.scale=n,this.centerInViewport(t)}centerFitInViewportIfNeeded(t){const e=Math.min(this._core.store.state.viewportWidth/(1.1*t.rotatedBoundingBox.width),this._core.store.state.viewportHeight/(1.1*t.rotatedBoundingBox.height),this._core.store.state.scaleMax),n=Math.max(e,this.getEffectiveMinScale());n<this._core.store.state.scale&&(this._core.store.state.scale=n),this.centerInViewport(t)}fitInViewportIfNeeded(t){const e=Math.min(this._core.store.state.viewportWidth/(1.1*t.rotatedBoundingBox.width),this._core.store.state.viewportHeight/(1.1*t.rotatedBoundingBox.height),this._core.store.state.scaleMax),n=Math.max(e,this.getEffectiveMinScale());n<this._core.store.state.scale&&(this._core.store.state.scale=n,this.centerInViewport(t))}bringIntoViewIfNeeded(t){const{scale:e,translateX:n,translateY:i,viewportWidth:r,viewportHeight:s}=this._core.store.state,o=t.rotatedBoundingBox;if(o.x*e+n>=0&&o.y*e+i>=0&&(o.x+o.width)*e+n<=r&&(o.y+o.height)*e+i<=s)return;const a=Math.min(r/(1.1*o.width),s/(1.1*o.height),this._core.store.state.scaleMax),c=Math.max(a,this.getEffectiveMinScale()),l=Math.min(c,e),h=this.clampTranslate(r/2-(o.x+o.width/2)*l,s/2-(o.y+o.height/2)*l);this.animateViewportTo(h.translateX,h.translateY,l)}handleZoom(t){this._core.store.state.isScaling=!0;const e=this._core.store.host.getBoundingClientRect(),n=t.clientX-e.left,i=t.clientY-e.top;this._core.store.state.pointerX=(n-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(i-this._core.store.state.translateY)/this._core.store.state.scale,this._core.store.objects?.updateCursorPosition(this._core.store.state.pointerX,this._core.store.state.pointerY);const r=Math.max(.8,Math.min(1.2,1+-.012*t.deltaY)),s=this.getEffectiveMinScale(),o=Math.min(this._core.store.state.scaleMax,Math.max(s,this._core.store.state.scale*r)),a=o/this._core.store.state.scale,c=(n-this._core.store.state.translateX)*(a-1),l=(i-this._core.store.state.translateY)*(a-1);this._core.store.state.scale=o;let h=this._core.store.state.translateX-c;0!==t.deltaX&&(h-=.8*t.deltaX);const u=this.clampTranslate(h,this._core.store.state.translateY-l);this._core.store.state.translateX=u.translateX,this._core.store.state.translateY=u.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate(),this._debounceEndScaling()}handlePan(t){const e=this.clampTranslate(this._core.store.state.translateX-.8*t.deltaX,this._core.store.state.translateY-.8*t.deltaY);this._core.store.state.translateX=e.translateX,this._core.store.state.translateY=e.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate()}cancelViewportAnimation(){null!==this._animationFrameId&&(cancelAnimationFrame(this._animationFrameId),this._animationFrameId=null)}animateViewportTo(t,e,n,i=150){this.cancelViewportAnimation();const r=this._core.store.state.translateX,s=this._core.store.state.translateY,o=this._core.store.state.scale,a=performance.now();this._core.store.state.isScaling=!0;const c=l=>{const h=Math.min((l-a)/i,1),u=1-Math.pow(1-h,3);this._core.store.state.scale=o+(n-o)*u;const f=this.clampTranslate(r+(t-r)*u,s+(e-s)*u);this._core.store.state.translateX=f.translateX,this._core.store.state.translateY=f.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),h<1?this._animationFrameId=requestAnimationFrame(c):(this._animationFrameId=null,this._core.store.state.isScaling=!1,this._core.rerender(),this._debounceUpdate())};this._animationFrameId=requestAnimationFrame(c)}centerFitNearestContent(t=20){const e=this._core.store.allNonSelectionObjects;if(0===e.length)return!1;const n=-this._core.store.state.translateX/this._core.store.state.scale+this._core.store.state.viewportWidth/2/this._core.store.state.scale,i=-this._core.store.state.translateY/this._core.store.state.scale+this._core.store.state.viewportHeight/2/this._core.store.state.scale,r=e.map((t=>{const e=t.rotatedBoundingBox,r=e.y+e.height/2;return{obj:t,distance:Math.sqrt(Math.pow(e.x+e.width/2-n,2)+Math.pow(r-i,2))}}));r.sort(((t,e)=>t.distance-e.distance));const s=r.slice(0,t).map((t=>t.obj));let o=1/0,a=1/0,c=-1/0,l=-1/0;for(const t of s){const e=t.rotatedBoundingBox;o=Math.min(o,e.x),a=Math.min(a,e.y),c=Math.max(c,e.x+e.width),l=Math.max(l,e.y+e.height)}const h=c-o,u=l-a,f=o+h/2,d=a+u/2,p=Math.min(this._core.store.state.viewportWidth/(1.1*h),this._core.store.state.viewportHeight/(1.1*u),this._core.store.state.scaleMax),g=Math.max(p,this.getEffectiveMinScale());return this.animateViewportTo(this._core.store.state.viewportWidth/2-f*g,this._core.store.state.viewportHeight/2-d*g,g),!0}centerFitObjects(t,e=!0){if(0===t.length)return!1;let n=1/0,i=1/0,r=-1/0,s=-1/0;for(const e of t){const t=e.rotatedBoundingBox;n=Math.min(n,t.x),i=Math.min(i,t.y),r=Math.max(r,t.x+t.width),s=Math.max(s,t.y+t.height)}const o=r-n,a=s-i,c=n+o/2,l=i+a/2,h=Math.min(this._core.store.state.viewportWidth/(1.1*o),this._core.store.state.viewportHeight/(1.1*a),this._core.store.state.scaleMax),u=Math.max(h,this.getEffectiveMinScale());return this.animateViewportTo(this._core.store.state.viewportWidth/2-c*u,this._core.store.state.viewportHeight/2-l*u,u,e?150:0),!0}centerFitAllObjects(t=!0){return this.centerFitObjects(this._core.store.allNonSelectionObjects,t)}}class ie extends v{shortcuts=[{key:"Escape",label:"Clear Selection",category:"General",condition:t=>!!t.store.activeText||!!t.store.activeShape||!!t.store.selectionGroup,action:t=>{t.store.activeText?t.store.activeText.handleEscape():t.store.activeShape?t.store.activeShape.handleEscape():t.clearSelection()}},{key:"Delete",label:"Delete Selected",category:"General",condition:t=>!!t.store.selectionGroup,action:t=>t.delete()},{key:"a",ctrl:!0,label:"Select All in Viewport",category:"General",action:t=>t.selectAllObjectsInViewport()},{key:"A",ctrl:!0,shift:!0,label:"Select All Objects",category:"General",action:t=>t.selectAllObjects()},{key:"z",ctrl:!0,label:"Undo",category:"Undo/Redo",action:t=>t.undo()},{key:"y",ctrl:!0,label:"Redo",category:"Undo/Redo",action:t=>t.redo()},{key:"1",ctrl:!0,label:"Tool 1",category:"Tool Selection",action:()=>this.switchToolByIndex(0)},{key:"2",ctrl:!0,label:"Tool 2",category:"Tool Selection",action:()=>this.switchToolByIndex(1)},{key:"3",ctrl:!0,label:"Tool 3",category:"Tool Selection",action:()=>this.switchToolByIndex(2)},{key:"4",ctrl:!0,label:"Tool 4",category:"Tool Selection",action:()=>this.switchToolByIndex(3)},{key:"5",ctrl:!0,label:"Tool 5",category:"Tool Selection",action:()=>this.switchToolByIndex(4)},{key:"6",ctrl:!0,label:"Tool 6",category:"Tool Selection",action:()=>this.switchToolByIndex(5)},{key:"7",ctrl:!0,label:"Tool 7",category:"Tool Selection",action:()=>this.switchToolByIndex(6)},{key:"8",ctrl:!0,label:"Tool 8",category:"Tool Selection",action:()=>this.switchToolByIndex(7)},{key:"9",ctrl:!0,label:"Tool 9",category:"Tool Selection",action:()=>this.switchToolByIndex(8)},{key:"+",ctrl:!0,label:"Bring Forward",category:"Object Layering",condition:t=>!!t.store.selectionGroup,action:t=>t.bringForward()},{key:"-",ctrl:!0,label:"Send Backward",category:"Object Layering",condition:t=>!!t.store.selectionGroup,action:t=>t.sendBackward()},{key:"*",shift:!0,label:"Bring to Front",category:"Object Layering",condition:t=>!!t.store.selectionGroup,action:t=>t.bringToFront()},{key:"_",shift:!0,label:"Send to Back",category:"Object Layering",condition:t=>!!t.store.selectionGroup,action:t=>t.sendToBack()},{key:"g",ctrl:!0,label:"Group",category:"Grouping",condition:t=>!!t.store.selectionGroup&&t.store.selectionGroup.objects.length>=2,action:t=>t.group()},{key:"G",ctrl:!0,shift:!0,label:"Ungroup",category:"Grouping",condition:t=>!!t.store.selectionGroup,action:t=>t.ungroup()},{key:"ArrowUp",label:"Move Object Up",category:"Movement",condition:t=>!!t.store.selectionGroup,action:t=>{t.store.selectionGroup.move(0,0,0,10),t.rerender()}},{key:"ArrowDown",label:"Move Object Down",category:"Movement",condition:t=>!!t.store.selectionGroup,action:t=>{t.store.selectionGroup.move(0,10,0,0),t.rerender()}},{key:"ArrowLeft",label:"Move Object Left",category:"Movement",condition:t=>!!t.store.selectionGroup,action:t=>{t.store.selectionGroup.move(0,0,10,0),t.rerender()}},{key:"ArrowRight",label:"Move Object Right",category:"Movement",condition:t=>!!t.store.selectionGroup,action:t=>{t.store.selectionGroup.move(10,0,0,0),t.rerender()}}];constructor(t){super(t)}switchToolByIndex(t){const e=this._core.toolRegistry.getToolByIndex(t);e&&(this._core.store.setState("activeTool",e),this._core.deselectAllObjects(),e.onActivate())}handleKeyDown(t){if(this._core.store.state.isCtrlKeyPressed=t.ctrlKey,(this._core.store.activeText||this._core.store.activeShape||this._core.store.activeInteractiveCustomElement)&&"Escape"!==t.key)return;const e=this.shortcuts.find((e=>e.key===t.key&&!!e.ctrl===t.ctrlKey&&!!e.shift===t.shiftKey&&(!e.condition||e.condition(this._core))));e&&(t.preventDefault(),e.action(this._core))}handleKeyUp(t){this._core.store.state.isCtrlKeyPressed=t.ctrlKey}getDisplayableShortcuts(){return this.shortcuts.map((({key:t,ctrl:e,shift:n,label:i,category:r})=>({key:t,ctrl:e,shift:n,label:i,category:r})))}}class re extends v{globalContextMenuItems=[];objectContextMenuItems=[];constructor(t,e,n){super(t),this.globalContextMenuItems=e,this.objectContextMenuItems=n}resolveLabels(t){return t.map((t=>({...t,label:this._core.localizationManager.translate(t.label),children:t.children?this.resolveLabels(t.children):void 0})))}getResolvedContextMenuItems(){return this.resolveLabels(this._core.store.selectionGroup?this.objectContextMenuItems:this.globalContextMenuItems)}handleContextMenu(t){if(!(this._core.store.state.activeTool instanceof w))return;if(this._core.store.state.skipContextMenu)return void(this._core.store.state.skipContextMenu=!1);const e=this._core.store.state.activeTool;e?.moveHandler?.cancelPendingDrag(),this._core.store.selectionBox&&(this._core.store.objects.remove((t=>t instanceof g)),this._core.store.setSelectionBox(null),this._core.store.state.isSelecting=!1);const n=this._core.getObjectFromPointerEvent(t,".object");if(n&&!(n instanceof h)&&!(n instanceof g)){const t=h.create(this._core);t.addOrRemove(n),t.isSelected=!0,t.rotation=n.rotation,this._core.store.state.isSelecting=!1,this._core.store.selectionGroup&&this._core.removeSelectionGroup(),this._core.addSelectionGroup(t),this._core.rerender()}this._core.store.state.contextMenuItems=this.getResolvedContextMenuItems();const i=t.clientX-this._core.store.offsetX,r=t.clientY-this._core.store.offsetY,{translateX:s,translateY:o,scale:a}=this._core.store.state;this._core.store.state.contextMenuWorldX=(i-s)/a,this._core.store.state.contextMenuWorldY=(r-o)/a;let c=i,l=r;c+150>this._core.store.state.viewportWidth-10&&(c=this._core.store.state.viewportWidth-150-10),c=Math.max(10,c),l=Math.max(10,l),this._core.store.state.contextMenuX=c,this._core.store.state.contextMenuY=l,this._core.store.state.isContextMenuVisible=!0,this._core.store.state.isEnabled=!1,this._core.rerender()}open(t){const{x:e,y:n,objectId:i}=t;if(this._core.store.state.activeTool instanceof w){const t=this._core.store.state.activeTool;t?.moveHandler?.cancelPendingDrag()}if(this._core.store.selectionBox&&(this._core.store.objects.remove((t=>t instanceof g)),this._core.store.setSelectionBox(null),this._core.store.state.isSelecting=!1),i){const t=this._core.store.allObjects.find((t=>t.id===i));if(t&&!(t instanceof h)&&!(t instanceof g)){const e=h.create(this._core);e.addOrRemove(t),e.isSelected=!0,e.rotation=t.rotation,this._core.store.state.isSelecting=!1,this._core.store.selectionGroup&&this._core.removeSelectionGroup(),this._core.addSelectionGroup(e)}}this._core.store.state.contextMenuItems=this.getResolvedContextMenuItems(),this._core.store.state.contextMenuWorldX=e,this._core.store.state.contextMenuWorldY=n;const{translateX:r,translateY:s,scale:o}=this._core.store.state;let a=e*o+r,c=n*o+s;a+150>this._core.store.state.viewportWidth-10&&(a=this._core.store.state.viewportWidth-150-10),a=Math.max(10,a),c=Math.max(10,c),this._core.store.state.contextMenuX=a,this._core.store.state.contextMenuY=c,this._core.store.state.isContextMenuVisible=!0,this._core.store.state.isEnabled=!1,this._core.rerender()}}class se{_core;constructor(t){this._core=t}revive(t){if(t&&"object"==typeof t){if(t.__class__){let e;switch(t.__class__){case"KritzelPath":e=_.create(this._core).deserialize(t);break;case"KritzelLine":e=L.create(this._core).deserialize(t);break;case"KritzelText":e=b.create(this._core,t.fontSize,t.fontFamily).deserialize(t);break;case"KritzelShape":e=d.create(this._core,{shapeType:t.shapeType,fillColor:t.fillColor,strokeColor:t.strokeColor,strokeWidth:t.strokeWidth,fontSize:t.fontSize,fontFamily:t.fontFamily,fontColor:t.fontColor}).deserialize(t);break;case"KritzelImage":e=u.create(this._core).deserialize(t);break;case"KritzelCustomElement":e=Z.create(this._core).deserialize(t);break;case"KritzelSelectionGroup":e=h.create(this._core).deserialize(t);break;case"KritzelGroup":e=y.create(this._core).deserialize(t);break;case"KritzelWorkspace":e=T.create(this._core,t).deserialize(t);break;case"KritzelBrushTool":e=new q(this._core);break;case"KritzelEraserTool":e=new tt(this._core);break;case"KritzelImageTool":e=new Lt(this._core);break;case"KritzelSelectionTool":e=new w(this._core);break;case"KritzelTextTool":e=new m(this._core);break;case"KritzelLineTool":e=new J(this._core);break;case"KritzelShapeTool":e=new Ot(this._core);break;default:e=t}return e}const e=Array.isArray(t)?[]:{};for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=this.revive(t[n]));return e}return t}}const oe={activeWorkspace:void 0,activeTool:null,objects:null,snapCandidate:null,snapPreviewCandidate:null,resizeHandleType:null,lineHandleType:null,hasViewportChanged:!1,hasObjectsChanged:!1,isReady:!1,isEnabled:!0,isScaling:!1,isPanning:!1,isSelecting:!1,isResizing:!1,isResizeHandleHovered:!1,isResizeHandleSelected:!1,isRotating:!1,isRotationHandleHovered:!1,isRotationHandleSelected:!1,isLineHandleSelected:!1,isLineHandleDragging:!1,isDragging:!1,isDrawing:!1,isErasing:!1,isWriting:!1,isLoading:!1,isCtrlKeyPressed:!1,isContextMenuVisible:!1,contextMenuItems:[],contextMenuX:0,contextMenuY:0,contextMenuWorldX:0,contextMenuWorldY:0,skipContextMenu:!1,debugInfo:{showObjectInfo:!1,showViewportInfo:!1,showSyncProviderInfo:!1,showAssetResolverInfo:!1,showMigrationInfo:!1},host:null,pointerX:0,pointerY:0,scale:1,scaleMax:1,scaleMin:1,startX:0,startY:0,translateX:0,translateXMax:400,translateXMin:0,translateY:0,translateYMax:400,translateYMin:0,viewportWidth:0,viewportHeight:0,longTouchTimeout:null,longTouchDelay:300,pointers:new Map,workspaces:[],cursor:{icon:"default",iconActive:"default"},lockDrawingScale:!0,viewportBoundaryLeft:-1/0,viewportBoundaryRight:1/0,viewportBoundaryTop:-1/0,viewportBoundaryBottom:1/0};class ae{static calculateSelectionBounds(t){const e=t.map((t=>t.rotatedBoundingBox));return{minX:Math.min(...e.map((t=>t.x))),minY:Math.min(...e.map((t=>t.y))),maxX:Math.max(...e.map((t=>t.x+t.width))),maxY:Math.max(...e.map((t=>t.y+t.height)))}}static calculateAlignedPositions(t,e){const n=new Map;if(t.length<2)return n;const i=this.calculateSelectionBounds(t);for(const r of t){const t=r.rotatedBoundingBox;let s=r.translateX,o=r.translateY;const a=t.x-r.translateX,c=t.y-r.translateY;switch(e){case Gt.StartHorizontal:s=i.minX-a;break;case Gt.CenterHorizontal:s=r.translateX+((i.minX+i.maxX)/2-(t.x+t.width/2));break;case Gt.EndHorizontal:s=r.translateX+(i.maxX-(t.x+t.width));break;case Gt.StartVertical:o=i.minY-c;break;case Gt.CenterVertical:o=r.translateY+((i.minY+i.maxY)/2-(t.y+t.height/2));break;case Gt.EndVertical:o=r.translateY+(i.maxY-(t.y+t.height))}n.set(r.id,{translateX:s,translateY:o})}return n}}class ce{core;registry={};constructor(t){this.core=t}registerTool(t,e){const n=new e(this.core);return n.name=t,this.registry[t]=n,n}hasTool(t){return t in this.registry}getTool(t){return this.registry[t]||(console.warn(`Unknown tool: ${t}`),null)}getToolByIndex(t){return Object.values(this.registry)[t]??null}}class le{bounds;capacity;objects=[];children=null;_size=0;get size(){return this._size}constructor(t,e=16){this.bounds=t,this.capacity=e}reset(){this.objects=[],this.children=null,this._size=0}insert(t){if(!this.intersects(t.rotatedBoundingBox,this.bounds))return!1;if(this.objects.length<this.capacity&&null===this.children)return this.objects.push(t),this._size++,!0;null===this.children&&this.subdivide();for(const e of this.children)if(e.insert(t))return this._size++,!0;return!1}update(t){const e=this.objects.findIndex((e=>e.id===t.id));if(-1!==e)return this.objects[e]=t,!0;if(null!==this.children)for(const e of this.children)if(e.update(t))return!0;return!1}remove(t){let e=0;const n=this.objects.findIndex((e=>t(e)));if(-1!==n&&(this.objects.splice(n,1),e++),null!==this.children)for(const n of this.children)e+=n.remove(t);return this._size-=e,e}query(t){const e=[];return this._queryInto(t,e),e}_queryInto(t,e){if(this.intersects(t,this.bounds)){for(const n of this.objects)this.intersects(n.rotatedBoundingBox,t)&&e.push(n);if(null!==this.children)for(const n of this.children)n._queryInto(t,e)}}filter(t){const e=[];return this._filterInto(t,e),e}_filterInto(t,e){for(const n of this.objects)t(n)&&e.push(n);if(null!==this.children)for(const n of this.children)n._filterInto(t,e)}allObjects(){const t=[];return this._collectAllInto(t),t}_collectAllInto(t){for(const e of this.objects)t.push(e);if(null!==this.children)for(const e of this.children)e._collectAllInto(t)}subdivide(){const{x:t,y:e,z:n,width:i,height:r}=this.bounds,s=i/2,o=r/2;this.children=[new le({x:t,y:e,z:n,width:s,height:o},this.capacity),new le({x:t+s,y:e,z:n,width:s,height:o},this.capacity),new le({x:t,y:e+o,z:n,width:s,height:o},this.capacity),new le({x:t+s,y:e+o,z:n,width:s,height:o},this.capacity)]}intersects(t,e){return!(t.x>=e.x+e.width||t.x+t.width<=e.x||t.y>=e.y+e.height||t.y+t.height<=e.y)}}class he{quadtree;_ydoc=null;_objectsMap=null;_metadataMap=null;_providers=[];_undoManager=null;_reviver=null;_core=null;_workspaceId=null;_isReady=!1;_temporaryItemsCount=0;_idMap=new Map;_awareness=null;_objectsObserver=null;_stackItemAddedHandler=null;_stackItemPoppedHandler=null;_awarenessChangeHandler=null;_awarenessChangeCallbacks=[];_objectsChangeCallbacks=[];_lastAwarenessEmitTime=0;_awarenessEmitTimeout=null;AWARENESS_THROTTLE_INTERVAL=100;_localOnlyMode=!1;_inTransaction=!1;get isReady(){return this._isReady}get awareness(){return this._awareness}get hasAwareness(){return!!this._awareness}get localClientId(){return this._awareness?.clientID??null}setLocalUser(t){if(!this._awareness||!t)return;const e=t.displayName||t.firstName||"Anonymous";this._awareness.setLocalStateField("user",{id:t.id,displayName:e,color:t.color||this.generateColorFromName(e)})}generateColorFromName(t){let e=0;for(let n=0;n<t.length;n++)e=t.charCodeAt(n)+((e<<5)-e);return`hsl(${Math.abs(e%360)}, 45%, 55%)`}updateCursorPosition(t,e){this._awareness&&this._awareness.setLocalStateField("cursor",{x:t,y:e})}clearCursorPosition(){this._awareness&&this._awareness.setLocalStateField("cursor",null)}setActiveDrawingObject(t){this._awareness&&this._awareness.setLocalStateField("activeObjectId",t)}setLocalSelectionBox(t){this._awareness&&this._awareness.setLocalStateField("selectionBox",t)}clearLocalSelectionBox(){this._awareness&&this._awareness.setLocalStateField("selectionBox",null)}removeOrphanedSelectionGroups(){if(!this._awareness)return;const t=this._awareness.getStates(),e=new Set;t.forEach((t=>{const n=t.user?.id;n&&e.add(n)}));const n=this._core?.user?.id,i=this.quadtree.filter((t=>t instanceof h&&null!=t.userId&&t.userId!==n&&!e.has(t.userId)));for(const t of i)this.quadtree.remove((e=>e.id===t.id)),this._idMap.delete(t.id),this._objectsMap&&this._ydoc.transact((()=>{this._objectsMap.delete(t.id)}),"local");i.length>0&&(this._core?.store.invalidateSelectionCache(),this._core?.rerender())}onAwarenessChange(t){this._awarenessChangeCallbacks.push(t)}onObjectsChange(t){this._objectsChangeCallbacks.push(t)}get undoManager(){return this._undoManager}get workspaceId(){return this._workspaceId}get undoState(){return{canUndo:!!this._undoManager&&this._undoManager.canUndo(),canRedo:!!this._undoManager&&this._undoManager.canRedo(),undoStackSize:this._undoManager?this._undoManager.undoStack.length:0,redoStackSize:this._undoManager?this._undoManager.redoStack.length:0}}get totalCount(){return this.quadtree.size}findById(t){return this._idMap.get(t)}constructor(){this.quadtree=new le({x:-1/0,y:-1/0,z:0,width:1/0,height:1/0},8)}async initialize(t,e,n){this._core=t,this._workspaceId=e,this._reviver=new se(t),this._ydoc=new W.Doc,this._objectsMap=this._ydoc.getMap("objects"),this._metadataMap=this._ydoc.getMap("metadata");const i=t.editorId?`kritzel-workspace-${t.editorId}-${e}`:`kritzel-workspace-${e}`,r=n??Qt,s=!!t.store?.state?.debugInfo?.showSyncProviderInfo,o=!s;for(const t of r.providers){let e;e="function"==typeof t?new t(i,this._ydoc,{quiet:o}):t.create(i,this._ydoc,{quiet:o}),this._providers.push(e)}if(s){const t=this._providers.map((t=>`${t.constructor.name} (${t.type})`)).join(", ");console.info(`[Kritzel] Workspace sync providers initialized for ${i}: ${t||"none"}`)}this._undoManager=new W.UndoManager([this._objectsMap],{captureTimeout:Number.MAX_SAFE_INTEGER,trackedOrigins:new Set(["local","temporary"]),ignoreRemoteMapChanges:!0}),this._stackItemAddedHandler=t=>{"undo"===t.type&&"temporary"===t.origin&&this._temporaryItemsCount++},this._stackItemPoppedHandler=t=>{"undo"===t.type&&"temporary"===t.origin&&this._temporaryItemsCount>0&&this._temporaryItemsCount--},this._undoManager.on("stack-item-added",this._stackItemAddedHandler),this._undoManager.on("stack-item-popped",this._stackItemPoppedHandler),this._objectsObserver=t=>{this.handleObjectsChange(t)},this._objectsMap.observe(this._objectsObserver);const a=this._providers.filter((t=>"local"===t.type)),c=this._providers.filter((t=>"network"===t.type)),l=await Promise.allSettled(a.map((t=>t.connect())));if(s){const t=l.filter((t=>"fulfilled"===t.status)).length;console.info(`[Kritzel] Workspace local providers connected: ${t}/${a.length}`)}l.forEach(((t,e)=>{s&&"rejected"===t.status&&console.error(`[Kritzel] Sync provider "${a[e]?.constructor.name}" failed to connect:`,t.reason)})),s&&c.length>0&&console.info(`[Kritzel] Workspace network providers connecting in background: ${c.length}`);for(const t of c)t.connect().catch((e=>{s&&console.error(`[Kritzel] Network sync provider "${t.constructor.name}" failed to connect:`,e)}));this._isReady=!0;for(const t of c)if(t.awareness){this._awareness=t.awareness;break}this._awareness&&(this._awarenessChangeHandler=t=>{t.removed.length>0&&this.removeOrphanedSelectionGroups();const e=Date.now(),n=e-this._lastAwarenessEmitTime;if(null!==this._awarenessEmitTimeout&&(clearTimeout(this._awarenessEmitTimeout),this._awarenessEmitTimeout=null),n>=this.AWARENESS_THROTTLE_INTERVAL){this._lastAwarenessEmitTime=e;const t=this._awareness.getStates();for(const e of this._awarenessChangeCallbacks)e(t)}else this._awarenessEmitTimeout=setTimeout((()=>{this._lastAwarenessEmitTime=Date.now(),this._awarenessEmitTimeout=null;const t=this._awareness.getStates();for(const e of this._awarenessChangeCallbacks)e(t)}),this.AWARENESS_THROTTLE_INTERVAL-n)},this._awareness.on("change",this._awarenessChangeHandler)),this.initializeMetadata("workspace",e,t.store?.state?.activeWorkspace?.name??""),Ht(this._ydoc,this._metadataMap,{objects:this._objectsMap},Yt,U,{quiet:!t.store?.state?.debugInfo?.showMigrationInfo}),this.loadFromYjs()}handleObjectsChange(t){if("local"===t.transaction.origin||"temporary"===t.transaction.origin)return void this._core?.rerender();if("migration"===t.transaction.origin)return;const e=Array.from(t.keysChanged),n=[],i=[],r=[];e.forEach((e=>{const s=t.changes.keys.get(e);if(s&&"delete"===s.action)r.push(e);else{const t=this._objectsMap?.get(e);if(t){const e=this._reviver?.revive(t);e instanceof h?i.push(e):n.push(e)}}})),r.forEach((t=>{const e=this._idMap.get(t);e instanceof h&&e.deselectAllChildren?.(),this.quadtree.remove((e=>e.id===t)),this._idMap.delete(t)}));const s=[],o=[];n.forEach((t=>{if(this._idMap.has(t.id)){const e=this._idMap.get(t.id);e&&"function"==typeof t.adoptTransientStateFrom&&t.adoptTransientStateFrom(e),this.quadtree.update(t),this._idMap.set(t.id,t),o.push(t)}else this.quadtree.insert(t),this._idMap.set(t.id,t),s.push(t)}));const a=new Set;if(i.forEach((t=>{if(this._idMap.has(t.id)){const e=this._idMap.get(t.id);e&&"function"==typeof t.adoptTransientStateFrom&&t.adoptTransientStateFrom(e),this.quadtree.update(t),this._idMap.set(t.id,t)}else this.quadtree.insert(t),this._idMap.set(t.id,t);a.add(t.id),t.invalidateObjectsCache(),t.refreshObjectDimensions(void 0,!0),t.captureUnchangedSnapshots(),this.quadtree.update(t)})),n.length>0||r.length>0){const t=new Set([...n.map((t=>t.id)),...r]),e=this.quadtree.filter((t=>t instanceof h&&!a.has(t.id)));for(const n of e)n.objectIds.some((e=>t.has(e)))&&(n.invalidateObjectsCache(),n.refreshObjectDimensions(void 0,!0),n.captureUnchangedSnapshots(),this.quadtree.update(n))}if(this._core?.store.invalidateSelectionCache(),this._core?.rerender(),s.length>0&&this._core?.engine.emitObjectsAdded(s),r.length>0){const t=r.map((t=>({id:t})));this._core?.engine.emitObjectsRemoved(t)}o.length>0&&this._core?.engine.emitObjectsUpdated(o.map((t=>({object:t,changedProperties:[]}))));for(const t of this._objectsChangeCallbacks)t()}initializeMetadata(t,e,n){this._metadataMap&&this._ydoc&&this._ydoc.transact((()=>{this._metadataMap?.get("type")||this._metadataMap?.set("type",t),void 0===this._metadataMap?.get("isPublic")&&this._metadataMap?.set("isPublic",!1),void 0===this._metadataMap?.get("schemaVersion")&&this._metadataMap?.set("schemaVersion",U),this._metadataMap?.set("workspaceId",e),this._metadataMap?.set("workspaceName",n)}),"metadata")}getIsPublic(){return this._metadataMap?.get("isPublic")??!1}setIsPublic(t){this._metadataMap&&this._ydoc&&this._ydoc?.transact((()=>{this._metadataMap?.set("isPublic",t)}),"metadata")}getDocumentType(){return this._metadataMap?.get("type")??"workspace"}getWorkspaceName(){return this._metadataMap?.get("workspaceName")??""}setWorkspaceName(t){this._metadataMap&&this._ydoc&&this._ydoc?.transact((()=>{this._metadataMap?.set("workspaceName",t)}),"metadata")}getMetadataWorkspaceId(){return this._metadataMap?.get("workspaceId")??""}transaction(t){if(this._ydoc){this._inTransaction=!0;try{this._ydoc.transact(t,"local")}finally{this._inTransaction=!1}}}stopUndoCapturing(){this.markUndoBoundary()}markUndoBoundary(){this._inTransaction||this._undoManager?.stopCapturing()}withLocalUpdatesOnly(t){this._localOnlyMode=!0;try{t()}finally{this._localOnlyMode=!1}}loadFromYjs(){if(!this._objectsMap||!this._reviver)return;this.quadtree.reset(),this._idMap.clear();const t=this._core?.user?.id,e=[];this._objectsMap.forEach(((n,i)=>{const r=this._reviver?.revive(n);r instanceof h&&null!=r.userId&&r.userId!==t?e.push(i):r&&(this.quadtree.insert(r),this._idMap.set(r.id,r))})),e.length>0&&this._ydoc.transact((()=>{for(const t of e)this._objectsMap.delete(t)}),"local")}reset(){this.quadtree.reset(),this._idMap.clear(),this.markUndoBoundary(),this._ydoc?.transact((()=>{this._objectsMap?.clear()}),"local")}insert(t){if(!t.id)return!1;if(this.quadtree.insert(t),this._idMap.set(t.id,t),this._objectsMap&&this.isPersistable(t)){const e=t.serialize();this.markUndoBoundary(),this._ydoc?.transact((()=>{this._objectsMap?.set(t.id,e)}),"local")}return!0}update(t,e={}){if(!t.id)return!1;if(!this._idMap.has(t.id))return!1;if(this.quadtree.update(t),this._idMap.set(t.id,t),!this._localOnlyMode&&this._objectsMap&&this.isPersistable(t)){const n=t.serialize(),i=e.temporary?"temporary":"local";this._ydoc?.transact((()=>{this._objectsMap?.set(t.id,n)}),i)}return!0}remove(t){const e=this.quadtree.filter(t);if(0!==e.length){this.markUndoBoundary();for(const t of e)this.quadtree.remove((e=>e.id===t.id)),this._idMap.delete(t.id),this._objectsMap&&this.isPersistable(t)&&this._ydoc?.transact((()=>{this._objectsMap?.delete(t.id)}),"local")}}filter(t){return this.quadtree.filter(t)}allObjects(){return this.quadtree.allObjects()}query(t){return this.quadtree.query(t)}isPersistable(t){return!(t instanceof g)}undo(){this._undoManager&&this._undoManager.canUndo()&&(this._undoManager.undo(),this._core?.engine.emitObjectsChange())}redo(){this._undoManager&&this._undoManager.canRedo()&&(this._undoManager.redo(),this._core?.engine.emitObjectsChange())}canUndo(){return!!this._undoManager&&this._undoManager.canUndo()}canRedo(){return!!this._undoManager&&this._undoManager.canRedo()}clearHistory(){this._undoManager&&(this._undoManager.clear(),this._temporaryItemsCount=0)}consolidateTemporaryItems(){if(!this._undoManager||0===this._temporaryItemsCount)return;const t=this._undoManager.undoStack.length;if(0===t)return void(this._temporaryItemsCount=0);this._undoManager.stopCapturing();const e=Math.min(this._temporaryItemsCount,t);if(e>1){for(let t=0;t<e;t++)this._undoManager.canUndo()&&this._undoManager.undo();this._ydoc?.transact((()=>{for(let t=e-1;t>=0;t--)this._undoManager?.canRedo()&&this._undoManager.redo()}),"local")}this._temporaryItemsCount=0}clearTemporaryItems(){if(!this._undoManager||0===this._temporaryItemsCount)return;const t=Math.min(this._temporaryItemsCount,this._undoManager.undoStack.length);for(let e=0;e<t;e++)this._undoManager.undoStack.length>0&&this._undoManager.undoStack.pop();this._temporaryItemsCount=0}destroy(){this._objectsMap&&this._objectsObserver&&(this._objectsMap.unobserve(this._objectsObserver),this._objectsObserver=null),this._undoManager&&(this._stackItemAddedHandler&&(this._undoManager.off("stack-item-added",this._stackItemAddedHandler),this._stackItemAddedHandler=null),this._stackItemPoppedHandler&&(this._undoManager.off("stack-item-popped",this._stackItemPoppedHandler),this._stackItemPoppedHandler=null),this._undoManager.destroy(),this._undoManager=null),this.quadtree.reset(),this._idMap.clear(),this._awareness&&this._awarenessChangeHandler&&(this._awareness.off("change",this._awarenessChangeHandler),this._awarenessChangeHandler=null),null!==this._awarenessEmitTimeout&&(clearTimeout(this._awarenessEmitTimeout),this._awarenessEmitTimeout=null),this._awareness=null,this._awarenessChangeCallbacks=[],this._providers.forEach((t=>{t.destroy()})),this._providers=[],this._objectsMap=null,this._metadataMap=null,this._ydoc&&(this._ydoc.destroy(),this._ydoc=null),this._core=null,this._reviver=null,this._workspaceId=null,this._isReady=!1,this._temporaryItemsCount=0}}class ue{_state;_listeners=new Map;_cachedSelectionBox=null;_cachedSelectionGroup=null;_selectionBoxCacheValid=!1;_selectionGroupCacheValid=!1;_localUserId=null;get state(){return this._state}get objects(){if(!this._state.objects)throw new Error("Objects map is not initialized.");return this._state.objects}get host(){if(!this._state.host)throw new Error("Host element is not set.");return this._state.host}get currentZIndex(){return Math.max(0,...this.objects.filter((t=>!(t instanceof h||t instanceof g))).map((t=>t.zIndex)))+1}get hasViewportBoundaries(){return Number.isFinite(this._state.viewportBoundaryLeft)||Number.isFinite(this._state.viewportBoundaryRight)||Number.isFinite(this._state.viewportBoundaryTop)||Number.isFinite(this._state.viewportBoundaryBottom)}get viewportBoundaryBounds(){const t=this._state.viewportBoundaryLeft,e=this._state.viewportBoundaryRight,n=this._state.viewportBoundaryTop,i=this._state.viewportBoundaryBottom;return{x:Number.isFinite(t)?t:-1/0,y:Number.isFinite(n)?n:-1/0,z:0,width:Number.isFinite(t)&&Number.isFinite(e)?e-t:1/0,height:Number.isFinite(n)&&Number.isFinite(i)?i-n:1/0}}get totalObjectCount(){return this.hasViewportBoundaries?this.allObjects.length:this.objects.totalCount}get allObjects(){return this.hasViewportBoundaries?this.objects.query(this.viewportBoundaryBounds):this.objects.allObjects()}get objectsInViewport(){return this.objects.query({x:-this._state.translateX/this._state.scale,y:-this._state.translateY/this._state.scale,z:this._state.scale,width:this._state.viewportWidth/this._state.scale,height:this._state.viewportHeight/this._state.scale,depth:100}).sort(((t,e)=>t.zIndex-e.zIndex))}get allNonSelectionObjects(){return this.allObjects.filter((t=>!(t instanceof h||t instanceof g)))}get selectedObjects(){return this.allObjects.filter((t=>!(t instanceof h))).filter((t=>t.isSelected))}get selectionBox(){if(this._selectionBoxCacheValid)return this._cachedSelectionBox;const t=this.objects.filter((t=>t instanceof g));return this._cachedSelectionBox=t.length>0?t[0]:null,this._selectionBoxCacheValid=!0,this._cachedSelectionBox}get selectionGroup(){if(this._selectionGroupCacheValid)return this._cachedSelectionGroup;const t=this.objects.filter((t=>t instanceof h));return this._cachedSelectionGroup=this._localUserId?t.find((t=>t.userId===this._localUserId))??null:t.length>0?t[0]:null,this._selectionGroupCacheValid=!0,this._cachedSelectionGroup}invalidateSelectionCache(){this._selectionBoxCacheValid=!1,this._selectionGroupCacheValid=!1}setSelectionBox(t){this._cachedSelectionBox=t,this._selectionBoxCacheValid=!0}setSelectionGroup(t){this._cachedSelectionGroup=t,this._selectionGroupCacheValid=!0}setLocalUserId(t){this._localUserId=t,this.invalidateSelectionCache()}get activeText(){const t=this.objects.filter((t=>t instanceof b&&t.isEditing));return t.length>0?t[0]:null}get activeShape(){const t=this.objects.filter((t=>t instanceof d&&t.isEditing));return t.length>0?t[0]:null}get activeInteractiveCustomElement(){return this.selectedObjects.find((t=>p.isInstanceOf(t,"KritzelCustomElement")&&t.hasFocusedInputElement()))??null}get currentPath(){const t=this.objects.filter((t=>t instanceof _&&!1===t.isCompleted));return t.length>0?t[0]:null}get currentLine(){const t=this.objects.filter((t=>t instanceof L&&!1===t.isCompleted));return t.length>0?t[0]:null}get offsetX(){return this.host.getBoundingClientRect().left}get offsetY(){return this.host.getBoundingClientRect().top}get isDisabled(){return!1===this._state.isEnabled||!1===this._state.isReady||null===this._state.activeWorkspace}get isPointerDown(){return this._state.pointers.size>0}constructor(t){this._state={...t,contextMenuItems:[...t.contextMenuItems],debugInfo:{...t.debugInfo},pointers:new Map(t.pointers),workspaces:[...t.workspaces],cursor:{...t.cursor}},this._state.objects=new he}onStateChange(t,e){this._listeners.has(t)||this._listeners.set(t,new Set);const n=this._listeners.get(t);if(!n)throw new Error(`Listeners set for property ${String(t)} was not initialized.`);n.add(e)}getState(t){return this._state[t]}setState(t,e){const n=this._state[t];if(n!==e){this._state[t]=e;const i=this._listeners.get(t);i&&i.forEach((i=>i(e,n,String(t))))}}}class fe{map;_ydoc=null;_workspacesMap=null;_metadataMap=null;_providers=[];_core=null;_isReady=!1;_onRemoteChangeCallback=null;_workspacesObserver=null;get isReady(){return this._isReady}get hasNetworkSyncProvider(){return this._providers.some((t=>"network"===t.type))}constructor(){this.map=new Map}onRemoteChange(t){this._onRemoteChangeCallback=t}async initialize(t,e){this._core=t,this._ydoc=new W.Doc,this._workspacesMap=this._ydoc.getMap("workspaces"),this._metadataMap=this._ydoc.getMap("metadata");const n=e?.appStateId??this.getOrCreateAppStateInstanceId(t),i=t.editorId?`kritzel-app-state-${t.editorId}-${n}`:`kritzel-app-state-${n}`,r=e??Qt,s=!!t.store.state.debugInfo.showSyncProviderInfo,o=!s;for(const t of r.providers){let e;e="function"==typeof t?new t(i,this._ydoc,{quiet:o}):t.create(i,this._ydoc,{quiet:o}),this._providers.push(e)}if(s){const t=this._providers.map((t=>`${t.constructor.name} (${t.type})`)).join(", ");console.info(`[Kritzel] App-state sync providers initialized for ${i}: ${t||"none"}`)}this._workspacesObserver=t=>{this.handleWorkspacesChange(t)},this._workspacesMap.observe(this._workspacesObserver);const a=this._providers.filter((t=>"local"===t.type)),c=this._providers.filter((t=>"network"===t.type)),l=await Promise.allSettled(a.map((t=>t.connect())));if(s){const t=l.filter((t=>"fulfilled"===t.status)).length;console.info(`[Kritzel] App-state local providers connected: ${t}/${a.length}`)}l.forEach(((t,e)=>{s&&"rejected"===t.status&&console.error(`[Kritzel] Sync provider "${a[e]?.constructor.name}" failed to connect:`,t.reason)})),s&&c.length>0&&console.info(`[Kritzel] App-state network providers connecting in background: ${c.length}`);for(const t of c)t.connect().catch((e=>{s&&console.error(`[Kritzel] Network sync provider "${t.constructor.name}" failed to connect:`,e)}));this._isReady=!0,Ht(this._ydoc,this._metadataMap,{workspaces:this._workspacesMap},Xt,F,{quiet:!t.store.state.debugInfo.showMigrationInfo}),this.initializeMetadata("state"),this.loadFromYjs()}getOrCreateAppStateInstanceId(t){const e=globalThis.localStorage;if(!e)throw new Error("[KritzelAppStateMap] localStorage is unavailable. Cannot persist app-state document identity.");const n=t.getStorageKey("kritzel-app-state-instance-id");let i;try{i=e.getItem(n)}catch{throw new Error("[KritzelAppStateMap] Failed to read app-state instance id from localStorage.")}if(i)return i;const r=R.generateUUID();try{e.setItem(n,r)}catch{throw new Error("[KritzelAppStateMap] Failed to persist app-state instance id to localStorage.")}return r}handleWorkspacesChange(t){if("local"===t.transaction.origin)return void this._core?.rerender();if("migration"===t.transaction.origin)return;const e=Array.from(t.keysChanged),n=[],i=[];e.forEach((e=>{const r=t.changes.keys.get(e);if(r&&"delete"===r.action)i.push(e);else{const t=this._workspacesMap.get(e);if(t){const e=this.reviveWorkspace(t);n.push(e)}}})),i.forEach((t=>{this.map.delete(t)})),n.forEach((t=>{this.map.set(t.id,t)})),this._core?.store&&(this._core.store.state.workspaces=this.allWorkspaces()),this._onRemoteChangeCallback&&this._onRemoteChangeCallback(),this._core?.rerender()}reviveWorkspace(t){let e=t.viewport;if(e&&"translateX"in e&&!("centerWorldX"in e)){const t=e.scale??1;e={centerWorldX:-(e.translateX??0)/t,centerWorldY:-(e.translateY??0)/t,scale:t}}const n=new T(t.id,t.name,e);return this._core&&(n._core=this._core),n.createdAt=new Date(t.createdAt),n.updatedAt=new Date(t.updatedAt),n.isPublic=t.isPublic??!1,n}initializeMetadata(t){this._metadataMap&&this._ydoc&&this._ydoc.transact((()=>{this._metadataMap?.get("type")||this._metadataMap?.set("type",t),void 0===this._metadataMap?.get("isPublic")&&this._metadataMap?.set("isPublic",!1),void 0===this._metadataMap?.get("schemaVersion")&&this._metadataMap?.set("schemaVersion",F)}),"metadata")}getIsPublic(){return this._metadataMap?.get("isPublic")??!1}setIsPublic(t){this._metadataMap&&this._ydoc&&this._ydoc.transact((()=>{this._metadataMap?.set("isPublic",t)}),"metadata")}getDocumentType(){return this._metadataMap?.get("type")??"state"}transaction(t){this._ydoc&&this._ydoc.transact(t,"local")}loadFromYjs(){this._workspacesMap&&(this.map.clear(),this._workspacesMap.forEach(((t,e)=>{const n=this.reviveWorkspace(t);this.map.set(e,n)})))}reset(){this.map.clear(),this._ydoc?.transact((()=>{this._workspacesMap?.clear()}),"local")}insert(t){if(!t.id)return!1;if(this.map.set(t.id,t),this._workspacesMap){const e=t.serialize();this._ydoc?.transact((()=>{this._workspacesMap?.set(t.id,e)}),"local")}return!0}update(t){if(!t.id||!this.map.has(t.id))return!1;if(this.map.set(t.id,t),this._workspacesMap){const e=t.serialize();this._ydoc?.transact((()=>{this._workspacesMap?.set(t.id,e)}),"local")}return!0}remove(t){const e=Array.from(this.map.values()).find(t);return!!e&&(this.map.delete(e.id),this._workspacesMap&&this._ydoc?.transact((()=>{this._workspacesMap?.delete(e.id)}),"local"),!0)}get(t){return this.map.get(t)}allWorkspaces(){return Array.from(this.map.values())}filter(t){return Array.from(this.map.values()).filter(t)}find(t){return Array.from(this.map.values()).find(t)}has(t){return this.map.has(t)}destroy(){this._workspacesMap&&this._workspacesObserver&&(this._workspacesMap.unobserve(this._workspacesObserver),this._workspacesObserver=null),this._providers.forEach((t=>{t.disconnect(),t.destroy()})),this._providers=[],this.map.clear(),this._workspacesMap=null,this._metadataMap=null,this._ydoc&&(this._ydoc.destroy(),this._ydoc=null),this._core=null,this._onRemoteChangeCallback=null,this._isReady=!1}}class de{_core;_targetElement=null;_shadowRoot=null;constructor(t){this._core=t}setTargetElement(t){this._targetElement&&(this._targetElement.style.cursor="",this._targetElement.style.removeProperty("--kritzel-global-pointer-cursor")),this._targetElement=t,this._targetElement&&this._targetElement.style.setProperty("--kritzel-global-pointer-cursor",Pt.getPointerCursor())}getTargetElement(){return this._targetElement}setShadowRoot(t){this._shadowRoot=t}resetToDefault(){this._core.store.state.cursor={icon:"default",iconActive:"default"}}updateHoverState(t){if(this._core.store.isPointerDown)return;if(!this._shadowRoot)return;const e=this._shadowRoot.elementsFromPoint(t.clientX,t.clientY);if(!e||0===e.length)return;const n=e.find((t=>t.classList.contains("resize-handle-overlay")));if(n){const t=this._core.store.selectionGroup,e=t?.rotationDegrees??0,i=n.classList.contains("top-left"),r=n.classList.contains("bottom-right");this._core.store.state.cursor={icon:"move-vertical",rotation:e+(i||r?-45:45)}}else this._core.store.state.cursor=e.find((t=>t.classList.contains("rotation-handle-overlay")))||e.find((t=>t.classList.contains("selection-line-handle-overlay")))?{icon:"hand",iconActive:"hand-grab"}:{icon:"default",iconActive:"default"}}applyCursor(){const t=this._core.store.state,e=this._core.store.isPointerDown,n=t.cursor?.icon,i=t.cursor?.iconActive??n,r=t.cursor?.rotation,s=Pt.getCursor({iconName:e?i:n,rotation:r});this._targetElement&&(this._targetElement.style.cursor=s)}cleanup(){this._targetElement&&(this._targetElement.style.cursor="",this._targetElement.style.removeProperty("--kritzel-pointer-cursor")),this._targetElement=null,this._shadowRoot=null}}class pe{_isFirefox=/firefox|fxios/i.test(navigator.userAgent);_isSafari=/safari/i.test(navigator.userAgent)&&!/chrome|chromium|crios|android|edg/i.test(navigator.userAgent);_requestHandlers=new Map;constructor(t){this.registerRequestPermissionHandler("clipboard-read",(async()=>{if(this._isFirefox||this._isSafari)return"granted";try{return await navigator.clipboard.readText(),"granted"}catch{return"denied"}}))}registerRequestPermissionHandler(t,e){this._requestHandlers.set(t,e)}async checkPermission(t){return(await navigator.permissions.query({name:t})).state}async requestPermission(t){const e=this._requestHandlers.get(t);return e?e():this.checkPermission(t)}}const ge="kritzel-clipboard/v1:";class ve{_core;_pasteOffset=0;constructor(t){this._core=t}serializeForClipboard(t){const e="function"==typeof t.serialize?t.serialize():t;return p.isInstanceOf(t,"KritzelGroup")&&(e.__children__=t.children.map((t=>this.serializeForClipboard(t)))),e}serializeClipboardPayload(t){return`${ge}${JSON.stringify(t)}`}parseClipboardPayload(t){if(!t||!t.startsWith(ge))return null;try{const e=JSON.parse(t.slice(21));return 1===e?.version&&Array.isArray(e.objects)?e:null}catch{return null}}determineTextPasteIntent(t){const e=this.parseClipboardPayload(t);return e?{type:"kritzel_objects",payload:e}:t&&t.trim().length>0?{type:"plain_text",text:t}:null}async writeBrowserClipboardPayload(t,e){const n=this.serializeClipboardPayload(t);if(e?.clipboardData)e.clipboardData.setData("text/plain",n);else if("undefined"!=typeof navigator&&navigator.clipboard?.writeText)try{await navigator.clipboard.writeText(n)}catch{}}reviveClipboardObject(t){const e=new se(this._core),{__children__:n,...i}=t,r=e.revive(i);if(!r)return null;if(n&&p.isInstanceOf(r,"KritzelGroup")){const t=n.map((t=>this.reviveClipboardObject(t))).filter((t=>null!=t));r._pendingChildren=t,r.childIds=t.map((t=>t.id))}return r}regenerateIdsAndRemapAnchors(t){const e=[],n=t.length>0&&t.every((t=>p.isInstanceOf(t,"KritzelLine"))),i=t=>{for(const n of t)e.push(n),p.isInstanceOf(n,"KritzelGroup")&&i(n._pendingChildren)};i(t);const r=new Map;for(const t of e){const e=t.generateId();r.set(t.id,e),t.id=e,t.isMounted=!1}for(const t of e)p.isInstanceOf(t,"KritzelGroup")&&(t.childIds=t.childIds.map((t=>r.get(t)??t))),p.isInstanceOf(t,"KritzelLine")&&(t.startAnchor&&r.has(t.startAnchor.objectId)?t.startAnchor={objectId:r.get(t.startAnchor.objectId)}:n&&(t.startAnchor=void 0),t.endAnchor&&r.has(t.endAnchor.objectId)?t.endAnchor={objectId:r.get(t.endAnchor.objectId)}:n&&(t.endAnchor=void 0))}async determinePasteIntent(t){if(t?.clipboardData){const e=t.clipboardData,n=Array.from(e.files??[]).filter((t=>t.type.startsWith("image/")));if(n.length>0)return{type:"image_files",files:n};if(e.types.includes("text/plain")){const t=this.determineTextPasteIntent(e.getData("text/plain"));if(t)return t}return{type:"unknown"}}if("undefined"==typeof navigator||!navigator.clipboard)return{type:"unknown"};const{clipboard:e}=navigator;if("granted"!==await this._core.permissionManager.checkPermission("clipboard-read")&&"granted"!==await this._core.permissionManager.requestPermission("clipboard-read"))return{type:"unknown"};if(e.read)try{const t=await e.read(),{imageFiles:n,text:i}=await this.processClipboardItems(t);if(n.length>0)return{type:"image_files",files:n};if(null!==i){const t=this.determineTextPasteIntent(i);if(t)return t}}catch{}if(e.readText){const t=this.determineTextPasteIntent(await e.readText());if(t)return t}return{type:"unknown"}}async processClipboardItems(t){const e=[];let n=null;return await Promise.all(t.map((async t=>{const i=t.types.find((t=>t.startsWith("image/")));if(i){const n=await t.getType(i);e.push(new File([n],"pasted-image",{type:i}))}else if(null===n&&t.types.includes("text/plain")){const e=await t.getType("text/plain");n=await e.text()}}))),{imageFiles:e,text:n}}copy(t){const e=this._core.store.selectionGroup;if(!e)return;const n={version:1,sourceWorkspaceId:this._core.store.state.activeWorkspace?.id,objects:e.objects.sort(((t,e)=>t.zIndex-e.zIndex)).map((t=>this.serializeForClipboard(t)))};this._pasteOffset=0,this.writeBrowserClipboardPayload(n,t)}cut(t){this._core.store.selectionGroup&&(this.copy(t),this._core.delete())}materializeKritzelObjects(t){const e=t.payload.objects.map((t=>this.reviveClipboardObject(t))).filter((t=>null!=t));return this.regenerateIdsAndRemapAnchors(e),e}async materializeImageFiles(t){try{const e=25/this._core.store.state.scale,n=t.files.map((async(t,n)=>{const i=await _t(t,{maxWidthOrHeight:1200});return u.fromBlob(this._core,i,{translateX:n*e,translateY:n*e})}));return await Promise.all(n)}catch(t){return console.error("Failed to import pasted image files:",t),null}}async materializePlainText(t){const e=b.create(this._core),n=t.text.split("\n").map((t=>0===t.length?{type:"paragraph"}:{type:"paragraph",content:[{type:"text",text:t}]}));return e.setContent({type:"doc",content:n}),[e]}async paste(t,e,n){const i=await this.determinePasteIntent(n);let r=null;"kritzel_objects"===i.type?r=this.materializeKritzelObjects(i):"image_files"===i.type?r=await this.materializeImageFiles(i):"plain_text"===i.type&&(r=await this.materializePlainText(i)),r&&0!==r.length&&await this.insertMaterializedObjects(r,i,t,e)}async insertMaterializedObjects(t,e,n,i){const r=this._core.store.state.activeWorkspace;if(!r)return;const s=t.some((t=>t.workspaceId!==r.id))||"kritzel_objects"!==e.type,o=void 0!==n&&void 0!==i,a=Math.min(...t.map((t=>t.translateX))),c=Math.min(...t.map((t=>t.translateY)));let l,u;const f=25/this._core.store.state.scale;void 0!==n&&void 0!==i?(l=n,u=i):s?(l=a,u=c):(l=a+f+this._pasteOffset,u=c+f+this._pasteOffset,this._pasteOffset+=f);const d=l-a,g=u-c;this._core.removeSelectionGroup(),this._core.removeSelectionBox();const v=h.create(this._core),w=this._core.store.currentZIndex;this._core.store.objects.transaction((()=>{const e=(t,n)=>{if(0===t._pendingChildren.length)return;const i=t._pendingChildren;t._pendingChildren=[],i.forEach(((t,i)=>{t.workspaceId!==r.id&&(t.workspaceId=r.id),t.updatePosition(t.translateX+d,t.translateY+g),t.zIndex=n+i+1,p.isInstanceOf(t,"KritzelGroup")&&e(t,t.zIndex),this._core.addObject(t)})),t.finalize()},n=[];t.forEach(((t,i)=>{t.workspaceId!==r.id&&(t.workspaceId=r.id),t.updatePosition(t.translateX+d,t.translateY+g),t.zIndex=w+i,p.isInstanceOf(t,"KritzelGroup")&&e(t,t.zIndex),this._core.addObject(t),n.push(t),v.addOrRemove(t)})),this._core.engine.emitObjectsAdded(n)})),this._core.anchorManager.rebuildIndex(),v.isSelected=!0,1===t.length&&(v.rotation=t[0].rotation),s&&!o&&v.centerInViewport(),this._core.addSelectionGroup(v),this._core.engine.viewport?.bringIntoViewIfNeeded(v),this._core.store.state.isSelecting=!1,await new Promise((t=>{requestAnimationFrame((()=>requestAnimationFrame((()=>t()))))})),v.refreshObjectDimensions(),s&&!o&&v.centerInViewport(),this._core.engine.emitObjectsChange(),this._core.rerender(),this._core.store.setState("activeTool",this._core.toolRegistry.getTool("selection")),this._core.engine.emitObjectsChange(),this._core.rerender()}}class we{_kritzelEngine;_store;_syncConfig;_assetStorageConfig;_assetResolver;_appStateMap;_anchorManager;_cursorManager;_themeManager;_localizationManager;_licenseManager;_permissionManager;_clipboardManager;_toolRegistry;_editorId;_user;get engine(){return this._kritzelEngine}get store(){return this._store}get appStateMap(){return this._appStateMap}get anchorManager(){return this._anchorManager}get cursorManager(){return this._cursorManager}get themeManager(){return this._themeManager}get localizationManager(){return this._localizationManager}get licenseManager(){return this._licenseManager}get permissionManager(){return this._permissionManager}get toolRegistry(){return this._toolRegistry}get clipboardManager(){return this._clipboardManager}get editorId(){return this._editorId}getStorageKey(t){return this._editorId?`${t}-${this._editorId}`:t}get user(){return this._user}setUser(t){this._user=t,this._store.setLocalUserId(t?.id??null),this._store.objects?.setLocalUser(t)}constructor(t,e){this._kritzelEngine=t,this._editorId=e,this._store=new ue(oe),this._appStateMap=new fe,this._anchorManager=new Bt(this),this._cursorManager=new de(this),this._themeManager=new S(this),this._localizationManager=new Vt(this),this._licenseManager=new Nt(this),this._permissionManager=new pe(this),this._clipboardManager=new ve(this),this._toolRegistry=new ce(this),this._assetResolver=new k,this._assetResolver.setShowInfo(this._store.state.debugInfo?.showAssetResolverInfo??!1)}get assetResolver(){return this._assetResolver}setSyncConfig(t){this._syncConfig=t}setAssetStorageConfig(t){this._assetStorageConfig=t}setEditorId(t){this._editorId=t,this._themeManager=new S(this),this._localizationManager=new Vt(this)}async initializeYjs(){await this._appStateMap.initialize(this,this._syncConfig)}async initializeAssetStorage(){await this._assetResolver.init(this._assetStorageConfig),this.warnIfAssetStorageMismatched()}warnIfAssetStorageMismatched(){this._appStateMap.hasNetworkSyncProvider&&(this._assetResolver.hasRemoteProvider||console.warn("[Kritzel] A network sync provider is configured, but no remote asset storage provider was found. Images added on this device will only be available locally and will appear broken on other devices. Configure a remote asset provider (e.g. HttpAssetProvider) via the `assetStorage` prop to enable cross-device image sync."))}loadWorkspacesFromAppState(){return this._appStateMap.allWorkspaces()}saveWorkspaceToAppState(t){this._appStateMap.has(t.id)?this._appStateMap.update(t):this._appStateMap.insert(t)}deleteWorkspaceFromAppState(t){this._appStateMap.remove((e=>e.id===t))}async initializeWorkspace(t,e){const n=this.loadWorkspacesFromAppState(),i=!t&&!!this._editorId,r=n.length>0?[...n].sort(((t,e)=>{const n=e.createdAt.getTime()-t.createdAt.getTime();return 0!==n?n:e.updatedAt.getTime()-t.updatedAt.getTime()}))[0]:null,s=localStorage.getItem(this.getStorageKey("kritzel-active-workspace-id")),o=s?n.find((t=>t.id===s)):null;let a;if(t)a=t,n.find((e=>e.id===t.id))||(a._core=this,this.saveWorkspaceToAppState(a));else if(o)a=o;else if(r&&!i)a=r;else{if(e?.skipFallbackCreation)return this._store.state.workspaces=n,this._store.state.activeWorkspace=null,void this.rerender();a=new T(R.generateUUID(),"New Workspace"),a._core=this,this.saveWorkspaceToAppState(a)}localStorage.setItem(this.getStorageKey("kritzel-active-workspace-id"),a.id),this._store.objects&&this._store.objects.isReady&&this._store.objects.destroy();const c=new he;this._store.state.objects=c,this._store.state.activeWorkspace=a,this._store.state.workspaces=this.loadWorkspacesFromAppState();const l=a.viewport??{centerWorldX:0,centerWorldY:0,scale:1},h=l.scale??1,u=this._store.state.viewportHeight;this._store.state.translateX=this._store.state.viewportWidth/2-(l.centerWorldX??0)*h,this._store.state.translateY=u/2-(l.centerWorldY??0)*h,this._store.state.scale=h,await c.initialize(this,a.id,this._syncConfig),this._user&&c.setLocalUser(this._user),c.onAwarenessChange((t=>{this.engine.emitAwarenessChange(t)})),this._anchorManager.rebuildIndex(),this.engine.emitObjectsChange(),this.rerender()}async loadSharedWorkspace(t){const e=t;let n=this.getWorkspaces().find((t=>t.id===e));n?n.isPublic=!0:(n=new T(e,"Shared Workspace"),n.isPublic=!0,this.createWorkspace(n)),await this.initializeWorkspace(n)}getObjectsInViewport(){return this._store.objects?this._store.objects.query({x:-this._store.state.translateX/this._store.state.scale,y:-this._store.state.translateY/this._store.state.scale,z:this._store.state.scale,width:this._store.state.viewportWidth/this._store.state.scale,height:this._store.state.viewportHeight/this._store.state.scale,depth:100}).filter((t=>!(t instanceof h||t instanceof g))).sort(((t,e)=>t.zIndex-e.zIndex)):[]}rerender(){this._kritzelEngine&&this._kritzelEngine.forceUpdate++}findObjectById(t){for(const e of this._store.allObjects)if(e.id===t)return e;return null}getWorkspaces(){return this.loadWorkspacesFromAppState()}createWorkspace(t){t._core=this,t.createdAt=new Date,t.updatedAt=new Date,this.saveWorkspaceToAppState(t),this._store.state.workspaces=this.loadWorkspacesFromAppState()}updateWorkspace(t){t.updatedAt=new Date,this.saveWorkspaceToAppState(t),this._store.state.activeWorkspace?.id===t.id&&this._store.objects?.setWorkspaceName(t.name);const e=this._store.state.workspaces,n=e.findIndex((e=>e.id===t.id));-1!==n&&(e[n]=t,this._store.state.workspaces=e)}deleteWorkspace(t){this._store.state.activeWorkspace?.id===t.id&&(this.engine.viewport?.cancelPendingUpdates(),this._store.objects?.destroy()),this.deleteWorkspaceFromAppState(t.id),this._store.state.workspaces=this.loadWorkspacesFromAppState(),window.indexedDB.deleteDatabase(this._editorId?`kritzel-workspace-${this._editorId}-${t.id}`:`kritzel-workspace-${t.id}`)}updateWorkspaceViewport(t,e,n){const i=this._store.state.activeWorkspace;i&&this._store.state.workspaces.some((t=>t.id===i.id))&&(i.viewport={centerWorldX:(this._store.state.viewportWidth/2-t)/n,centerWorldY:(this._store.state.viewportHeight/2-e)/n,scale:n},i.updatedAt=new Date,this.saveWorkspaceToAppState(i))}getIsPublic(){return this._store.state.activeWorkspace?.isPublic??!1}addObject(t){this._store.objects.insert(t)}removeObject(t,e=!1){p.isInstanceOf(t,"KritzelGroup")&&!e&&[...t.children].forEach((t=>{this.removeObject(t)})),p.isInstanceOf(t,"KritzelCustomElement")&&t.unmount(),p.isInstanceOf(t,"KritzelLine")?this._anchorManager.handleLineDeleted(t.id):this._anchorManager.handleObjectDeleted(t.id),t.isMounted=!1,this._store.objects.remove((e=>e.id===t.id))}updateObject(t,e){const n=[];for(const i in e)if(e.hasOwnProperty(i)){const r=e[i];void 0!==r&&(t[i]=r,n.push(i))}t.onAfterUpdate(n),this._store.objects.update(t)}addSelectionGroup(t){this.removeLocalSelectionGroups(),this.removeSelectionBox();for(const e of t.objects??[])if(p.isInstanceOf(e,"KritzelCustomElement")){const t=e;"function"==typeof t.setIsInteractive?t.setIsInteractive(!0):t.isInteractive=!0}this._store.objects.insert(t),this._store.setSelectionGroup(t),this._kritzelEngine.triggerSelectionChange()}isLocalSelectionGroup(t){const e=this._user?.id;return null==e||t.userId===e||null==t.userId}teardownSelectionGroup(t){t.deselectAllChildren?.();for(const e of t.objects??[])if(p.isInstanceOf(e,"KritzelCustomElement")){const t=e;"function"==typeof t.setIsInteractive?t.setIsInteractive(!1):t.isInteractive=!1}}removeLocalSelectionGroups(){const t=this._store.objects.allObjects().filter((t=>t instanceof h||p.isInstanceOf(t,"KritzelSelectionGroup"))).filter((t=>this.isLocalSelectionGroup(t))),e=this._store.selectionGroup;if(e&&this.isLocalSelectionGroup(e)&&!t.some((t=>t.id===e.id))&&t.push(e),0===t.length)return!1;for(const e of t)this.teardownSelectionGroup(e);const n=new Set(t.map((t=>t.id)));return this._store.objects.remove((t=>n.has(t.id))),this._store.setSelectionGroup(null),!0}removeSelectionGroup(){this.removeLocalSelectionGroups()&&this._kritzelEngine.triggerSelectionChange()}removeSelectionBox(){const t=this._store.selectionBox;t&&(this._store.objects.remove((e=>e.id===t.id)),this._store.setSelectionBox(null),this._store.objects.clearLocalSelectionBox())}deselectAllObjects(){this.removeSelectionGroup(),this.rerender()}delete(){const t=this._store.selectionGroup;t&&(this._store.objects.stopUndoCapturing(),this._store.objects.transaction((()=>{t.objects.forEach((t=>this.removeObject(t))),this.removeSelectionGroup()})),this._store.objects.stopUndoCapturing(),this.engine.emitObjectsInViewportChange(),this.rerender())}undo(){this._store.objects?.undo()}redo(){this._store.objects?.redo()}deleteObject(t){const e=this.findObjectById(t);e&&(this.removeObject(e),this.engine.emitObjectsInViewportChange(),this.rerender())}bringForward(t){const e=this._store.selectionGroup,n=t?[t]:e?.objects||[],i=this._store.allNonSelectionObjects.filter((t=>-1===n.findIndex((e=>e.id===t.id)))),r=i.length>0?Math.max(...i.map((t=>t.zIndex)))+1:0;n.forEach((t=>{t.zIndex!==r&&this.updateObject(t,{zIndex:t.zIndex+1})})),this.rerender()}sendBackward(t){const e=this._store.selectionGroup,n=t?[t]:e?.objects||[],i=this._store.allNonSelectionObjects.filter((t=>-1===n.findIndex((e=>e.id===t.id)))),r=i.length>0?Math.min(...i.map((t=>t.zIndex)))-1:0;n.forEach((t=>{t.zIndex!==r&&this.updateObject(t,{zIndex:t.zIndex-1})})),this.rerender()}bringToFront(t){const e=this._store.selectionGroup,n=t?[t]:e?.objects||[],i=this._store.allNonSelectionObjects.filter((t=>-1===n.findIndex((e=>e.id===t.id)))),r=Math.max(...i.map((t=>t.zIndex)))+1;n.forEach((t=>{this.updateObject(t,{zIndex:r})})),this.rerender()}sendToBack(t){const e=this._store.selectionGroup,n=t?[t]:e?.objects||[],i=this._store.allNonSelectionObjects.filter((t=>-1===n.findIndex((e=>e.id===t.id)))),r=Math.min(...i.map((t=>t.zIndex)))-1;n.forEach((t=>{this.updateObject(t,{zIndex:r})})),this.rerender()}alignObjects(t){const e=this._store.selectionGroup;if(!e||e.objects.length<2)return;const n=e.objects,i=ae.calculateAlignedPositions(n,t);this._store.objects.transaction((()=>{for(const t of n){const e=i.get(t.id);e&&this.updateObject(t,{translateX:e.translateX,translateY:e.translateY})}})),e.refreshObjectDimensions(),this.rerender()}group(){const t=this._store.selectionGroup;if(!t||t.objects.length<2)return;const e=y.createFromObjects(this,t.objects);this.addObject(e),this.removeSelectionGroup();const n=h.create(this);n.addOrRemove(e),n.isSelected=!0,n.rotation=e.rotation,this.addSelectionGroup(n),this.engine.emitObjectsChange(),this.rerender()}ungroup(){const t=this._store.selectionGroup;if(!t)return;const e=t.objects.filter((t=>p.isInstanceOf(t,"KritzelGroup")));if(0===e.length)return;const n=[],i=t.objects.filter((t=>!p.isInstanceOf(t,"KritzelGroup")));e.forEach((t=>{const e=t.ungroup();n.push(...e),this.removeObject(t,!0)})),this.removeSelectionGroup();const r=h.create(this);[...n,...i].forEach((t=>{r.addOrRemove(t)})),r.isSelected=!0,this.addSelectionGroup(r),this.engine.emitObjectsChange(),this.rerender()}selectObjects(t){if(0===t.length)return;const e=h.create(this);t.forEach((t=>{t.isSelected=!1,e.addOrRemove(t)})),e.isSelected=!0,1===t.length&&(e.rotation=e.objects[0].rotation),this.addSelectionGroup(e),this.rerender()}selectAllObjects(){const t=this._store.objects.allObjects().filter((t=>!(t instanceof h||t instanceof g||t instanceof B)));if(t.length>0){const e=h.create(this);t.forEach((t=>{t.isSelected=!1,e.addOrRemove(t)})),e.isSelected=!0,this._store.state.isSelecting=!1,1===t.length&&(e.rotation=e.objects[0].rotation),this.addSelectionGroup(e),this._store.setState("activeTool",this._toolRegistry.getTool("selection")),this.rerender()}}selectAllObjectsInViewport(){const t=this._store.objects.query({x:-this._store.state.translateX/this._store.state.scale,y:-this._store.state.translateY/this._store.state.scale,z:this._store.state.scale,width:this._store.state.viewportWidth/this._store.state.scale,height:this._store.state.viewportHeight/this._store.state.scale,depth:100}).filter((t=>t.isInViewport())).filter((t=>!(t instanceof h||t instanceof g||t instanceof B)));if(t.length>0){const e=h.create(this);t.forEach((t=>{t.isSelected=!1,e.addOrRemove(t)})),e.isSelected=!0,this._store.state.isSelecting=!1,1===t.length&&(e.rotation=e.objects[0].rotation),this.addSelectionGroup(e),this._store.setState("activeTool",this._toolRegistry.getTool("selection")),this.rerender()}}clearSelection(){this.removeSelectionGroup();const t=this._user?.id;this._store.objects.remove((e=>e instanceof g||e instanceof h&&(null==t||e.userId===t||null==e.userId))),this._store.setSelectionBox(null),this._store.setSelectionGroup(null);for(const t of this._store.allNonSelectionObjects)t.isSelected&&(t.isSelected=!1);this._store.state.isSelecting=!1,this._store.state.isResizeHandleSelected=!1,this._store.state.isRotationHandleSelected=!1,this._store.state.isLineHandleSelected=!1,this._store.state.isLineHandleDragging=!1,this._store.state.lineHandleType=void 0,this.rerender()}resetActiveText(){const t=this._store.activeText;t&&(t.isEmpty?this.deleteObject(t.id):t.save())}resetActiveShape(){const t=this._store.activeShape;t&&t.save()}getObjectFromPointerEvent(t,e=".object"){const n=this._store.state.host?.shadowRoot;if(!n)return null;const i=t.clientX,r=t.clientY,s=n.elementFromPoint(i,r);if(!s)return null;const o=s.closest(e);if(o){const t=this._store.allObjects.find((t=>o.id===t.id));return t&&t.hitTest(i,r)?t:null}return null}getObjectsFromPointerEvent(t,e=".object"){const n=this._store.state.host?.shadowRoot;if(!n)return[];const i=n.elementsFromPoint(t.clientX,t.clientY);if(!i||0===i.length)return[];const r=new Set;return i.forEach((t=>{const n=t.closest(e);n&&n.id&&r.add(n.id)})),r.size>0?this._store.allObjects.filter((t=>r.has(t.id))).sort(((t,e)=>e.zIndex-t.zIndex)):[]}getElementsAtPoint(t,e){const n=this._store.state.host?.shadowRoot;if(!n)return[];const i=n.elementsFromPoint(t.clientX,t.clientY);return i&&0!==i.length?i.filter((t=>t.matches(e))):[]}isPointerOverElement(t,e){return this.getElementsAtPoint(t,e).length>0}getCanvasPoint(t){if(!this._store.state.host)return{x:0,y:0};const e=this._store.state.host.getBoundingClientRect();return{x:(t.clientX-e.left-this._store.state.translateX)/this._store.state.scale,y:(t.clientY-e.top-this._store.state.translateY)/this._store.state.scale}}beforeWorkspaceChange(){this._kritzelEngine.viewport?.cancelPendingUpdates(),this._store.state.activeWorkspace&&this.updateWorkspaceViewport(this._store.state.translateX,this._store.state.translateY,this._store.state.scale),this.resetActiveText(),this.clearSelection(),this._store.setState("activeTool",this._toolRegistry.getTool("selection"))}displaySelectionGroupUI(t){if(!t.isSelected)return!1;if(t instanceof h&&null!=this._user?.id&&null!=t.userId&&t.userId!==this._user.id)return!0;const e=this._store.selectionGroup;return e?t instanceof h&&t.id===e.id&&(e.objects.length>1||(1!==e.objects.length||!(e.objects[0]instanceof L))):!(t instanceof L)}displaySelectionLineUI(t){if(!(t instanceof L))return!1;const e=this._store.selectionGroup;if(!e)return t.isSelected;if(!e.isSelected)return!1;if(1===e.objects.length){const n=e.objects[0];return n instanceof L&&n.id===t.id}return!1}}class me{static calculateCombinedBounds(t){if(!t||0===t.length)return null;let e=1/0,n=1/0,i=-1/0,r=-1/0;for(const s of t){const t=s.rotatedBoundingBox;e=Math.min(e,t.x),n=Math.min(n,t.y),i=Math.max(i,t.x+t.width),r=Math.max(r,t.y+t.height)}return{x:e,y:n,z:1,width:i-e,height:r-n}}static generateSvg(t,e={}){const{theme:n,padding:i=0,includeXmlDeclaration:r=!0,rasterSafeForCanvas:s=!1,imageDataUrls:o}=e;if(!t||0===t.length)return"";const a=this.flattenObjects(t),c=this.calculateCombinedBounds(a);if(!c)return"";const l=c.x-i,h=c.y-i,u=c.width+2*i,f=c.height+2*i,d=this.collectDefs(a,n),p=t.sort(((t,e)=>t.zIndex-e.zIndex)).map((t=>this.objectToSvgElement(t,n,o,s))).filter(Boolean).join("\n ");return`${r?'<?xml version="1.0" encoding="UTF-8"?>\n':""}<svg xmlns="http://www.w3.org/2000/svg" viewBox="${l} ${h} ${u} ${f}" width="${u}" height="${f}">${d.length>0?`\n <defs>\n ${d.join("\n ")}\n </defs>`:""}\n ${p}\n</svg>`}static flattenObjects(t){const e=[];for(const n of t)p.isInstanceOf(n,"KritzelGroup")?e.push(...this.flattenObjects(n.children)):e.push(n);return e}static async resolveImageDataUrls(t,e){const n=new Map;if(!t||0===t.length)return n;const i=this.flattenObjects(t).filter((t=>p.isInstanceOf(t,"KritzelImage")));return await Promise.all(i.map((async t=>{if(t.src?.startsWith("data:"))n.set(t.id,t.src);else if(t.resolvedSrc?.startsWith("data:"))n.set(t.id,t.resolvedSrc);else if(t.assetId&&e)try{const i=await e.fetchBlob(t.assetId);n.set(t.id,await this.blobToDataUrl(i))}catch(e){console.warn(`[KritzelSvgExportHelper] Failed to inline image asset ${t.assetId} for export:`,e)}}))),n}static async blobToDataUrl(t){if("undefined"!=typeof FileReader)try{return await new Promise(((e,n)=>{const i=new FileReader;i.onload=()=>{"string"!=typeof i.result?n(new Error("FileReader result is not a string")):e(i.result)},i.onerror=()=>n(i.error??new Error("Failed to read blob as data URL")),i.readAsDataURL(t)}))}catch{}const e=new Uint8Array(await t.arrayBuffer());return`data:${t.type||"application/octet-stream"};base64,${this.uint8ToBase64(e)}`}static uint8ToBase64(t){if("undefined"!=typeof Buffer)return Buffer.from(t).toString("base64");let e="";for(let n=0;n<t.length;n+=32768){const i=t.subarray(n,Math.min(n+32768,t.length));e+=String.fromCharCode(...i)}if("function"==typeof btoa)return btoa(e);throw new Error("No base64 encoder available in this runtime")}static collectDefs(t,e){const n=[];for(const i of t)p.isInstanceOf(i,"KritzelLine")&&(i.hasStartArrow&&n.push(this.generateArrowMarker(i,"start",e)),i.hasEndArrow&&n.push(this.generateArrowMarker(i,"end",e)));return n}static generateArrowMarker(t,e,n){const i="start"===e?t.startMarkerId:t.endMarkerId,r=t.getArrowSize(e),s=t.getArrowFill(e);return`<marker id="${i}" markerWidth="${r}" markerHeight="${r}" refX="0" refY="${r/2}" orient="${"start"===e?"auto-start-reverse":"auto"}" markerUnits="userSpaceOnUse">\n <path d="${t.getArrowPath("start"===e?t.arrows?.start?.style:t.arrows?.end?.style)}" fill="${s}" transform="scale(${r/10})"/>\n </marker>`}static objectToSvgElement(t,e,n,i=!1){return p.isInstanceOf(t,"KritzelPath")?this.pathToSvg(t,e):p.isInstanceOf(t,"KritzelLine")?this.lineToSvg(t,e):p.isInstanceOf(t,"KritzelShape")?this.shapeToSvg(t,e):p.isInstanceOf(t,"KritzelText")?this.textToSvg(t,e,i):p.isInstanceOf(t,"KritzelImage")?this.imageToSvg(t,n):p.isInstanceOf(t,"KritzelCustomElement")?this.customElementToSvg(t,i):p.isInstanceOf(t,"KritzelGroup")?this.groupToSvg(t,e,n,i):""}static pathToSvg(t,e){const n=this.buildTransform(t),i=M.resolveThemeColor(t.fill,e),r=M.resolveThemeColor(t.stroke,e),s=1!==t.opacity?` opacity="${t.opacity}"`:"",o=this.getObjectScale(t);return`<g transform="${n}"${s}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/o}" height="${t.totalHeight/o}" overflow="visible">\n <path d="${t.d}" fill="${i||"none"}" stroke="${r||"none"}"${t.strokeWidth?` stroke-width="${t.strokeWidth}"`:""}/>\n </svg>\n </g>`}static lineToSvg(t,e){const n=this.buildTransform(t),i=M.resolveThemeColor(t.stroke,e),r=1!==t.opacity?` opacity="${t.opacity}"`:"",s=this.getObjectScale(t);return`<g transform="${n}"${r}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/s}" height="${t.totalHeight/s}" overflow="visible">\n <path d="${t.d}" fill="none" stroke="${i}" stroke-width="${t.strokeWidth}" stroke-linecap="round"${t.hasStartArrow?` marker-start="url(#${t.startMarkerId})"`:""}${t.hasEndArrow?` marker-end="url(#${t.endMarkerId})"`:""}/>\n </svg>\n </g>`}static shapeToSvg(t,e){const n=this.buildTransform(t),i=M.resolveThemeColor(t.fillColor,e),r=M.resolveThemeColor(t.strokeColor,e),s=1!==t.opacity?` opacity="${t.opacity}"`:"",o=this.getObjectScale(t),a=t.getSvgPath();let c="";if(t.editor&&!t.editor.state.doc.textContent.trim());else if(t.content){const n=this.prosemirrorToHtml(t.content,t,e);if(n){const i=M.resolveThemeColor(t.fontColor,e);c=`\n <foreignObject x="${t.x}" y="${t.y}" width="${t.width}" height="${t.height}">\n <div xmlns="http://www.w3.org/1999/xhtml" style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; text-align: center; font-family: ${t.fontFamily}; font-size: ${t.fontSize}px; color: ${i}; overflow: hidden;">\n ${n}\n </div>\n </foreignObject>`}}return`<g transform="${n}"${s}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/o}" height="${t.totalHeight/o}" overflow="visible" preserveAspectRatio="none">\n <path d="${a}" fill="${i||"transparent"}" stroke="${r}" stroke-width="${t.strokeWidth}"/>${c}\n </svg>\n </g>`}static textToSvg(t,e,n=!1){if(n)return this.textToSvgRasterSafe(t,e);const i=this.buildTransform(t),r=1!==t.opacity?` opacity="${t.opacity}"`:"",s=M.resolveThemeColor(t.fontColor,e),o=M.resolveThemeColor(t.backgroundColor,e),a=this.getObjectScale(t),c=this.prosemirrorToHtml(t.content,t,e);return`<g transform="${i}"${r}>\n <foreignObject x="0" y="0" width="${t.totalWidth/a}" height="${t.totalHeight/a}">\n <div xmlns="http://www.w3.org/1999/xhtml" style="font-family: ${t.fontFamily}; font-size: ${t.fontSize}pt; color: ${s}; background-color: ${o||"transparent"}; transform: scale(${t.scaleFactor}); transform-origin: top left; white-space: pre-wrap; word-wrap: break-word;">\n ${c}\n </div>\n </foreignObject>\n </g>`}static textToSvgRasterSafe(t,e){const n=this.buildTransform(t),i=1!==t.opacity?` opacity="${t.opacity}"`:"",r=M.resolveThemeColor(t.fontColor,e),s=M.resolveThemeColor(t.backgroundColor,e),o=this.getObjectScale(t),a=t.totalWidth/o,c=t.totalHeight/o,l=this.prosemirrorToPlainTextLines(t.content),h=l.length>0?l:[""],u=Math.max(1,t.fontSize*(t.scaleFactor||1)),f=1.2*u,d=u,p=s&&"transparent"!==s?`<rect x="0" y="0" width="${a}" height="${c}" fill="${s}"/>`:"",g=h.map(((t,e)=>`<tspan x="0" y="${d+e*f}" xml:space="preserve">${this.escapeHtml(t)}</tspan>`)).join("");return`<g transform="${n}"${i}>\n ${p}\n <text font-family="${this.escapeHtml(t.fontFamily)}" font-size="${u}" fill="${r}">${g}</text>\n </g>`}static imageToSvg(t,e){const n=this.buildTransform(t),i=1!==t.opacity?` opacity="${t.opacity}"`:"",r=this.getObjectScale(t),s=t.totalWidth/r,o=t.totalHeight/r;return`<g transform="${n}"${i}>\n <image href="${e?.get(t.id)||t.resolvedSrc||t.src||""}" x="0" y="0" width="${s}" height="${o}" preserveAspectRatio="xMidYMid meet"/>\n </g>`}static customElementToSvg(t,e=!1){const n=this.buildTransform(t),i=1!==t.opacity?` opacity="${t.opacity}"`:"",r=this.getObjectScale(t),s=t.totalWidth/r,o=t.totalHeight/r;return e?(console.warn("[KritzelCustomElement SVG Export] Custom elements do not serialize well to PNG. Use SVG export or screenshot instead."),`<g transform="${n}"${i}>\n <rect x="0" y="0" width="${s}" height="${o}" fill="#f0f0f0" stroke="#999" stroke-width="1" />\n <text x="${s/2}" y="${o/2}" text-anchor="middle" dominant-baseline="middle" font-size="12" fill="#999">[Custom Element]</text>\n </g>`):`<g transform="${n}"${i}>\n <foreignObject x="0" y="0" width="${s}" height="${o}">\n <div xmlns="http://www.w3.org/1999/xhtml" style="width:100%;height:100%;overflow:hidden;">\n ${t.element?.outerHTML||'<div style="border:1px dashed #ccc">Empty</div>'}\n </div>\n </foreignObject>\n </g>`}static groupToSvg(t,e,n,i=!1){const r=t.children.sort(((t,e)=>t.zIndex-e.zIndex)).map((t=>this.objectToSvgElement(t,e,n,i))).filter(Boolean).join("\n ");return r?`<g${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n ${r}\n </g>`:""}static buildTransform(t){const e=[],n=this.getObjectScale(t);if(e.push(`translate(${t.translateX}, ${t.translateY})`),0!==t.rotation){const i=t.rotation*(180/Math.PI);e.push(`rotate(${i}, ${t.totalWidth/2/n}, ${t.totalHeight/2/n})`)}return e.join(" ")}static getObjectScale(t){const e=t.scale??1;return 0===e?1:e}static prosemirrorToHtml(t,e,n){return t&&t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):""}static nodeToHtml(t,e){if(!t)return"";switch(t.type){case"paragraph":return`<p style="margin: 0;">${(t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):"")||"<br/>"}</p>`;case"text":let n=this.escapeHtml(t.text||"");if(t.marks)for(const i of t.marks)n=this.applyMark(n,i,e);return n;case"hard_break":return"<br/>";case"bullet_list":return`<ul style="margin: 0; padding-left: 1.5em;">${t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}</ul>`;case"ordered_list":return`<ol style="margin: 0; padding-left: 1.5em;">${t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}</ol>`;case"list_item":return`<li>${t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}</li>`;default:return t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}}static prosemirrorToPlainTextLines(t){if(!t||!Array.isArray(t.content))return[];const e=t.content.map((t=>this.nodeToPlainText(t))).join("").replace(/\r\n/g,"\n").replace(/\n+$/,"");return e?e.split("\n"):[]}static nodeToPlainText(t){if(!t)return"";switch(t.type){case"text":return t.text||"";case"hard_break":return"\n";case"paragraph":return`${Array.isArray(t.content)?t.content.map((t=>this.nodeToPlainText(t))).join(""):""}\n`;case"list_item":return`- ${(Array.isArray(t.content)?t.content.map((t=>this.nodeToPlainText(t))).join(""):"").trim()}\n`;default:return Array.isArray(t.content)?t.content.map((t=>this.nodeToPlainText(t))).join(""):""}}static applyMark(t,e,n){switch(e.type){case"bold":case"strong":return`<strong>${t}</strong>`;case"italic":case"em":return`<em>${t}</em>`;case"underline":return`<u>${t}</u>`;case"strike":return`<s>${t}</s>`;case"code":return`<code>${t}</code>`;case"link":return`<a href="${this.escapeHtml(e.attrs?.href||"#")}">${t}</a>`;default:return t}}static escapeHtml(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}}const ye=(()=>{let t=0;return()=>(t+=1,`u${`0000${(Math.random()*36**4|0).toString(36)}`.slice(-4)}${t}`)})();function be(t){const e=[];for(let n=0,i=t.length;n<i;n++)e.push(t[n]);return e}let ke=null;function Ae(t={}){return ke||(t.includeStyleProperties?(ke=t.includeStyleProperties,ke):(ke=be(window.getComputedStyle(document.documentElement)),ke))}function xe(t,e){const n=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(e);return n?parseFloat(n.replace("px","")):0}function Se(t,e={}){return{width:e.width||function(t){const e=xe(t,"border-left-width"),n=xe(t,"border-right-width");return t.clientWidth+e+n}(t),height:e.height||function(t){const e=xe(t,"border-top-width"),n=xe(t,"border-bottom-width");return t.clientHeight+e+n}(t)}}const Me=16384;function ze(t){return new Promise(((e,n)=>{const i=new Image;i.onload=()=>{i.decode().then((()=>{requestAnimationFrame((()=>e(i)))}))},i.onerror=n,i.crossOrigin="anonymous",i.decoding="async",i.src=t}))}const $e=(t,e)=>{if(t instanceof e)return!0;const n=Object.getPrototypeOf(t);return null!==n&&(n.constructor.name===e.name||$e(n,e))};function Ce(t,e,n,i){const r=window.getComputedStyle(t,n),s=r.getPropertyValue("content");if(""===s||"none"===s)return;const o=ye();try{e.className=`${e.className} ${o}`}catch(t){return}const a=document.createElement("style");a.appendChild(function(t,e,n,i){const r=`.${t}:${e}`,s=n.cssText?function(t){const e=t.getPropertyValue("content");return`${t.cssText} content: '${e.replace(/'|"/g,"")}';`}(n):function(t,e){return Ae(e).map((e=>`${e}: ${t.getPropertyValue(e)}${t.getPropertyPriority(e)?" !important":""};`)).join(" ")}(n,i);return document.createTextNode(`${r}{${s}}`)}(o,n,r,i)),e.appendChild(a)}const Te="application/font-woff",Ie="image/jpeg",je={woff:Te,woff2:Te,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:Ie,jpeg:Ie,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function Ee(t){const e=function(t){const e=/\.([^./]*?)$/g.exec(t);return e?e[1]:""}(t).toLowerCase();return je[e]||""}function _e(t){return-1!==t.search(/^(data:)/)}async function Le(t,e,n){const i=await fetch(t,e);if(404===i.status)throw new Error(`Resource "${i.url}" not found`);const r=await i.blob();return new Promise(((t,e)=>{const s=new FileReader;s.onerror=e,s.onloadend=()=>{try{t(n({res:i,result:s.result}))}catch(t){e(t)}},s.readAsDataURL(r)}))}const Oe={};async function Pe(t,e,n){const i=function(t,e,n){let i=t.replace(/\?.*/,"");return n&&(i=t),/ttf|otf|eot|woff2?/i.test(i)&&(i=i.replace(/.*\//,"")),e?`[${e}]${i}`:i}(t,e,n.includeQueryParams);if(null!=Oe[i])return Oe[i];let r;n.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+(new Date).getTime());try{const i=await Le(t,n.fetchRequestInit,(({res:t,result:n})=>(e||(e=t.headers.get("Content-Type")||""),function(t){return t.split(/,/)[1]}(n))));r=function(t,e){return`data:${e};base64,${t}`}(i,e)}catch(e){r=n.imagePlaceholder||"";let i=`Failed to fetch resource: ${t}`;e&&(i="string"==typeof e?e:e.message),i&&console.warn(i)}return Oe[i]=r,r}const Be=t=>null!=t.tagName&&"SLOT"===t.tagName.toUpperCase(),De=t=>null!=t.tagName&&"SVG"===t.tagName.toUpperCase();async function Re(t,e,n){return n||!e.filter||e.filter(t)?Promise.resolve(t).then((t=>async function(t,e){return $e(t,HTMLCanvasElement)?async function(t){const e=t.toDataURL();return"data:,"===e?t.cloneNode(!1):ze(e)}(t):$e(t,HTMLVideoElement)?async function(t,e){if(t.currentSrc){const e=document.createElement("canvas"),n=e.getContext("2d");return e.width=t.clientWidth,e.height=t.clientHeight,null==n||n.drawImage(t,0,0,e.width,e.height),ze(e.toDataURL())}const n=t.poster,i=Ee(n);return ze(await Pe(n,i,e))}(t,e):$e(t,HTMLIFrameElement)?async function(t,e){var n;try{if(null===(n=null==t?void 0:t.contentDocument)||void 0===n?void 0:n.body)return await Re(t.contentDocument.body,e,!0)}catch(t){}return t.cloneNode(!1)}(t,e):t.cloneNode(De(t))}(t,e))).then((n=>async function(t,e,n){var i,r;if(De(e))return e;let s=[];return s=Be(t)&&t.assignedNodes?be(t.assignedNodes()):$e(t,HTMLIFrameElement)&&(null===(i=t.contentDocument)||void 0===i?void 0:i.body)?be(t.contentDocument.body.childNodes):be((null!==(r=t.shadowRoot)&&void 0!==r?r:t).childNodes),0===s.length||$e(t,HTMLVideoElement)||await s.reduce(((t,i)=>t.then((()=>Re(i,n))).then((t=>{t&&e.appendChild(t)}))),Promise.resolve()),e}(t,n,e))).then((n=>function(t,e,n){return $e(e,Element)&&(function(t,e,n){const i=e.style;if(!i)return;const r=window.getComputedStyle(t);r.cssText?(i.cssText=r.cssText,i.transformOrigin=r.transformOrigin):Ae(n).forEach((n=>{let s=r.getPropertyValue(n);if("font-size"===n&&s.endsWith("px")){const t=Math.floor(parseFloat(s.substring(0,s.length-2)))-.1;s=`${t}px`}$e(t,HTMLIFrameElement)&&"display"===n&&"inline"===s&&(s="block"),"d"===n&&e.getAttribute("d")&&(s=`path(${e.getAttribute("d")})`),i.setProperty(n,s,r.getPropertyPriority(n))}))}(t,e,n),function(t,e,n){Ce(t,e,":before",n),Ce(t,e,":after",n)}(t,e,n),function(t,e){$e(t,HTMLTextAreaElement)&&(e.innerHTML=t.value),$e(t,HTMLInputElement)&&e.setAttribute("value",t.value)}(t,e),function(t,e){if($e(t,HTMLSelectElement)){const n=Array.from(e.children).find((e=>t.value===e.getAttribute("value")));n&&n.setAttribute("selected","")}}(t,e)),e}(t,n,e))).then((t=>async function(t,e){const n=t.querySelectorAll?t.querySelectorAll("use"):[];if(0===n.length)return t;const i={};for(let r=0;r<n.length;r++){const s=n[r].getAttribute("xlink:href");if(s){const n=t.querySelector(s),r=document.querySelector(s);n||!r||i[s]||(i[s]=await Re(r,e,!0))}}const r=Object.values(i);if(r.length){const e="http://www.w3.org/1999/xhtml",n=document.createElementNS(e,"svg");n.setAttribute("xmlns",e),n.style.position="absolute",n.style.width="0",n.style.height="0",n.style.overflow="hidden",n.style.display="none";const i=document.createElementNS(e,"defs");n.appendChild(i);for(let t=0;t<r.length;t++)i.appendChild(r[t]);t.appendChild(n)}return t}(t,e))):null}const We=/url\((['"]?)([^'"]+?)\1\)/g,Ue=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Fe=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function Ke(t){return-1!==t.search(We)}async function Ve(t,e,n){if(!Ke(t))return t;const i=function(t,{preferredFontFormat:e}){return e?t.replace(Fe,(t=>{for(;;){const[n,,i]=Ue.exec(t)||[];if(!i)return"";if(i===e)return`src: ${n};`}})):t}(t,n),r=function(t){const e=[];return t.replace(We,((t,n,i)=>(e.push(i),t))),e.filter((t=>!_e(t)))}(i);return r.reduce(((t,i)=>t.then((t=>async function(t,e,n,i){try{const r=n?function(t,e){if(t.match(/^[a-z]+:\/\//i))return t;if(t.match(/^\/\//))return window.location.protocol+t;if(t.match(/^[a-z]+:/i))return t;const n=document.implementation.createHTMLDocument(),i=n.createElement("base"),r=n.createElement("a");return n.head.appendChild(i),n.body.appendChild(r),e&&(i.href=e),r.href=t,r.href}(e,n):e,s=Ee(e);let o;return o=await Pe(r,s,i),t.replace(function(t){const e=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${e})(['"]?\\))`,"g")}(e),`$1${o}$3`)}catch(t){}return t}(t,i,e,n)))),Promise.resolve(i))}async function Ne(t,e,n){var i;const r=null===(i=e.style)||void 0===i?void 0:i.getPropertyValue(t);if(r){const i=await Ve(r,null,n);return e.style.setProperty(t,i,e.style.getPropertyPriority(t)),!0}return!1}async function Ge(t,e){$e(t,Element)&&(await async function(t,e){await Ne("background",t,e)||await Ne("background-image",t,e),await Ne("mask",t,e)||await Ne("-webkit-mask",t,e)||await Ne("mask-image",t,e)||await Ne("-webkit-mask-image",t,e)}(t,e),await async function(t,e){const n=$e(t,HTMLImageElement);if((!n||_e(t.src))&&(!$e(t,SVGImageElement)||_e(t.href.baseVal)))return;const i=n?t.src:t.href.baseVal,r=await Pe(i,Ee(i),e);await new Promise(((i,s)=>{t.onload=i,t.onerror=e.onImageErrorHandler?(...t)=>{try{i(e.onImageErrorHandler(...t))}catch(t){s(t)}}:s;const o=t;o.decode&&(o.decode=i),"lazy"===o.loading&&(o.loading="eager"),n?(t.srcset="",t.src=r):t.href.baseVal=r}))}(t,e),await async function(t,e){const n=be(t.childNodes).map((t=>Ge(t,e)));await Promise.all(n).then((()=>t))}(t,e))}const He={};async function Xe(t){let e=He[t];if(null!=e)return e;const n=await fetch(t);return e={url:t,cssText:await n.text()},He[t]=e,e}async function Ye(t,e){let n=t.cssText;const i=/url\(["']?([^"')]+)["']?\)/g,r=(n.match(/url\([^)]+\)/g)||[]).map((async r=>{let s=r.replace(i,"$1");return s.startsWith("https://")||(s=new URL(s,t.url).href),Le(s,e.fetchRequestInit,(({result:t})=>(n=n.replace(r,`url(${t})`),[r,t])))}));return Promise.all(r).then((()=>n))}function Qe(t){if(null==t)return[];const e=[];let n=t.replace(/(\/\*[\s\S]*?\*\/)/gi,"");const i=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const t=i.exec(n);if(null===t)break;e.push(t[0])}n=n.replace(i,"");const r=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,s=new RegExp("((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})","gi");for(;;){let t=r.exec(n);if(null===t){if(t=s.exec(n),null===t)break;r.lastIndex=s.lastIndex}else s.lastIndex=r.lastIndex;e.push(t[0])}return e}function Ze(t){return t.trim().replace(/["']/g,"")}async function qe(t,e){const n=await async function(t,e){if(null==t.ownerDocument)throw new Error("Provided element is not within a Document");const n=be(t.ownerDocument.styleSheets),i=await async function(t,e){const n=[],i=[];return t.forEach((n=>{if("cssRules"in n)try{be(n.cssRules||[]).forEach(((t,r)=>{if(t.type===CSSRule.IMPORT_RULE){let s=r+1;const o=Xe(t.href).then((t=>Ye(t,e))).then((t=>Qe(t).forEach((t=>{try{n.insertRule(t,t.startsWith("@import")?s+=1:n.cssRules.length)}catch(e){console.error("Error inserting rule from remote css",{rule:t,error:e})}})))).catch((t=>{console.error("Error loading remote css",t.toString())}));i.push(o)}}))}catch(r){const s=t.find((t=>null==t.href))||document.styleSheets[0];null!=n.href&&i.push(Xe(n.href).then((t=>Ye(t,e))).then((t=>Qe(t).forEach((t=>{s.insertRule(t,s.cssRules.length)})))).catch((t=>{console.error("Error loading remote stylesheet",t)}))),console.error("Error inlining remote css file",r)}})),Promise.all(i).then((()=>(t.forEach((t=>{if("cssRules"in t)try{be(t.cssRules||[]).forEach((t=>{n.push(t)}))}catch(e){console.error(`Error while reading CSS rules from ${t.href}`,e)}})),n)))}(n,e);return function(t){return t.filter((t=>t.type===CSSRule.FONT_FACE_RULE)).filter((t=>Ke(t.style.getPropertyValue("src"))))}(i)}(t,e),i=function(t){const e=new Set;return function t(n){(n.style.fontFamily||getComputedStyle(n).fontFamily).split(",").forEach((t=>{e.add(Ze(t))})),Array.from(n.children).forEach((e=>{e instanceof HTMLElement&&t(e)}))}(t),e}(t);return(await Promise.all(n.filter((t=>i.has(Ze(t.style.fontFamily)))).map((t=>Ve(t.cssText,t.parentStyleSheet?t.parentStyleSheet.href:null,e))))).join("\n")}async function Je(t,e={}){const{width:n,height:i}=Se(t,e),r=await Re(t,e,!0);return await async function(t,e){const n=null!=e.fontEmbedCSS?e.fontEmbedCSS:e.skipFonts?null:await qe(t,e);if(n){const e=document.createElement("style"),i=document.createTextNode(n);e.appendChild(i),t.firstChild?t.insertBefore(e,t.firstChild):t.appendChild(e)}}(r,e),await Ge(r,e),function(t,e){const{style:n}=t;e.backgroundColor&&(n.backgroundColor=e.backgroundColor),e.width&&(n.width=`${e.width}px`),e.height&&(n.height=`${e.height}px`);const i=e.style;null!=i&&Object.keys(i).forEach((t=>{n[t]=i[t]}))}(r,e),await async function(t,e,n){const i="http://www.w3.org/2000/svg",r=document.createElementNS(i,"svg"),s=document.createElementNS(i,"foreignObject");return r.setAttribute("width",`${e}`),r.setAttribute("height",`${n}`),r.setAttribute("viewBox",`0 0 ${e} ${n}`),s.setAttribute("width","100%"),s.setAttribute("height","100%"),s.setAttribute("x","0"),s.setAttribute("y","0"),s.setAttribute("externalResourcesRequired","true"),r.appendChild(s),s.appendChild(t),async function(t){return Promise.resolve().then((()=>(new XMLSerializer).serializeToString(t))).then(encodeURIComponent).then((t=>`data:image/svg+xml;charset=utf-8,${t}`))}(r)}(r,n,i)}class tn{static shouldKeepWheelInCustomElement(t,e){if(t.ctrlKey||!0!==e.isSelected)return!1;const n="function"==typeof t.composedPath?t.composedPath():[],i=this.getScrollableContainerFromEventPath(n,e);return!!i&&this.canElementConsumeWheel(i,t.deltaX,t.deltaY)}static getScrollableContainerFromEventPath(t,e){const n=[];e.element instanceof HTMLElement&&n.push(e.element),e.elementRef instanceof HTMLElement&&n.push(e.elementRef);const i=e.elmeentRef;i instanceof HTMLElement&&n.push(i);for(const e of n){const n=t.findIndex((t=>t===e));if(-1!==n)for(const e of t.slice(0,n+1))if(e instanceof HTMLElement&&this.isScrollableElement(e))return e}for(const t of n){if(this.isScrollableElement(t))return t;const e=t.firstElementChild;if(e instanceof HTMLElement&&this.isScrollableElement(e))return e}return null}static isScrollableElement(t){const e=t.scrollHeight-t.clientHeight>0,n=t.scrollWidth-t.clientWidth>0;if(!e&&!n)return!1;const i=window.getComputedStyle(t),r=i.overflowX,s=i.overflowY;return e&&"visible"!==s&&"clip"!==s||n&&"visible"!==r&&"clip"!==r}static canElementConsumeWheel(t,e,n){const i=this.canElementConsumeVerticalWheel(t,n),r=this.canElementConsumeHorizontalWheel(t,e);return i||r}static canElementConsumeVerticalWheel(t,e){if(0===e)return!1;const n=Math.max(0,t.scrollHeight-t.clientHeight);return 0!==n&&(e>0?t.scrollTop<n-1:!!(e<0)&&t.scrollTop>1)}static canElementConsumeHorizontalWheel(t,e){if(0===e)return!1;const n=Math.max(0,t.scrollWidth-t.clientWidth);return 0!==n&&(e>0?t.scrollLeft<n-1:!!(e<0)&&t.scrollLeft>1)}}const en=t(class extends e{get host(){return this}workspace;async onWorkspaceChange(t){const e=t?.id;if(!e)return;await Promise.resolve();const n=this.core.store.state.activeWorkspace?.id;n!==e&&(this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(t),this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace))}editorId;activeWorkspaceId;async onActiveWorkspaceIdChange(t){t&&this._isYjsInitialized&&await this.switchToWorkspaceById(t)}syncConfig;async onSyncConfigChange(t){this._syncConfigRevision++,this.core.setSyncConfig(t),t&&!this._isYjsInitialized&&this._isViewportReady&&await this.initializeSyncAndWorkspace()}assetStorageConfig;async onAssetStorageConfigChange(t){this._assetStorageConfigRevision++,this.core.setAssetStorageConfig(t),t&&!this._isAssetStorageInitialized&&this._isViewportReady&&await this.initializeAssetStorage()}user;onUserChange(t){this.core.setUser(t)}globalContextMenuItems;onGlobalContextMenuItemsChange(t){this.contextMenuHandler&&(this.contextMenuHandler.globalContextMenuItems=t??[])}objectContextMenuItems;onObjectContextMenuItemsChange(t){this.contextMenuHandler&&(this.contextMenuHandler.objectContextMenuItems=t??[])}scaleMax=z;validateScaleMax(t){t>z?(console.warn(`scaleMax cannot be greater than ${z}.`),this.scaleMax=z,this.core.store.state.scaleMax=this.scaleMax):this.core.store.state.scaleMax=t}scaleMin=$;validateScaleMin(t){t<$?(console.warn(`scaleMin cannot be less than ${$}.`),this.scaleMin=$,this.core.store.state.scaleMin=this.scaleMin):this.core.store.state.scaleMin=t}cursorTarget;onCursorTargetChange(t){this.core.cursorManager.setTargetElement(t||document.body)}lockDrawingScale=!0;onLockDrawingScaleChange(t){this.core.store.state.lockDrawingScale=t}isObjectDistanceFadingActive=!1;onIsObjectDistanceFadingActiveChange(){this.core.rerender()}theme="light";onThemeChange(t){this.core.themeManager.setTheme(t)}licenseKey;onLicenseKeyChange(t){this.core.licenseManager.validate(t)}themes;onThemesChange(t){t&&t.length>0&&(this.core.themeManager.registerThemes(t),this.core.themeManager.applyTheme(this.core.themeManager.currentTheme))}locale="en";onLocaleChange(t){this.core.localizationManager.setLocale(t)}locales;onLocalesChange(t){t&&t.length>0&&(this.core.localizationManager.registerLocales(t),this.core.localizationManager.setLocale(this.locale))}fallbackLocale="en";onFallbackLocaleChange(t){this.core.localizationManager.setFallbackLocale(t),this.core.rerender()}viewportBoundaryLeft=-1/0;onViewportBoundaryLeftChange(t){this.core.store.state.viewportBoundaryLeft=t??-1/0}viewportBoundaryRight=1/0;onViewportBoundaryRightChange(t){this.core.store.state.viewportBoundaryRight=t??1/0}viewportBoundaryTop=-1/0;onViewportBoundaryTopChange(t){this.core.store.state.viewportBoundaryTop=t??-1/0}viewportBoundaryBottom=1/0;onViewportBoundaryBottomChange(t){this.core.store.state.viewportBoundaryBottom=t??1/0}debugInfo;onDebugInfoChange(t){t&&(this.core.store.state.debugInfo=t,this.core.assetResolver.setShowInfo(t.showAssetResolverInfo))}isPanningEnabled=!0;isZoomingEnabled=!0;isLoading=!1;onIsLoadingChange(){this.syncLoadingState()}isEngineReady;activeToolChange;objectsSelectionChange;workspacesChange;activeWorkspaceChange;longpress;objectsChange;objectsAdded;objectsRemoved;objectsUpdated;undoStateChange;objectsInViewportChange;viewportChange;awarenessChange;notificationsChange;forceUpdate=0;async triggerSelectionChange(){this.objectsSelectionChange.emit()}handleWheel(t){if(this.core.store.isDisabled)return;this.core.store.state.isContextMenuVisible&&this.hideContextMenu();const e=this.core.getObjectFromPointerEvent(t);e&&R.isClass(e,"KritzelCustomElement")&&tn.shouldKeepWheelInCustomElement(t,e)||(t.ctrlKey?this.isZoomingEnabled&&this.viewport.handleWheel(t):this.isPanningEnabled&&this.viewport.handleWheel(t),this.core.store.state?.activeTool?.handleWheel(t))}handlePointerDown(t){this.core.store.isDisabled||this.isEmbeddedCustomElementInteraction(t)||(N.isTouchDevice()&&l.onLongPress(t,(t=>this.longpress.emit(t))),this.host.setPointerCapture(t.pointerId),this.core.store.state.pointers.set(t.pointerId,t),this.viewport.handlePointerDown(t),this.core.store.state?.activeTool?.handlePointerDown(t))}throttledPointerMoveMulti=ee.throttle((t=>{this.viewport.handlePointerMove(t),this.core.store.state?.activeTool?.handlePointerMove(t)}),16);handlePointerMove(t){this.core.store.isDisabled||t.buttons>0&&!this.core.store.state.pointers.has(t.pointerId)||(this.core.store.state.pointers.has(t.pointerId)&&this.core.store.state.pointers.set(t.pointerId,t),this.core.store.state.pointers.size>1&&this.throttledPointerMoveMulti(t),this.core.cursorManager.updateHoverState(t),this.viewport.handlePointerMove(t),this.core.store.state?.activeTool?.handlePointerMove(t))}handlePointerUp(t){if(this.core.store.isDisabled)return;const e=this.core.store.state.pointers.has(t.pointerId);this.core.store.state.pointers.delete(t.pointerId),this.host.hasPointerCapture(t.pointerId)&&this.host.releasePointerCapture(t.pointerId),0===this.core.store.state.pointers.size&&this.core.cursorManager.resetToDefault(),e&&(this.viewport.handlePointerUp(t),this.core.store.state?.activeTool?.handlePointerUp(t))}handlePointerCancel(t){this.core.store.isDisabled||(this.host.hasPointerCapture(t.pointerId)&&this.host.releasePointerCapture(t.pointerId),this.core.store.state.pointers.delete(t.pointerId),0===this.core.store.state.pointers.size&&this.core.cursorManager.resetToDefault(),this.viewport.handlePointerUp(t),this.core.store.state?.activeTool?.handlePointerUp(t))}isEmbeddedCustomElementInteraction(t){const n=t.composedPath(),i=n.find((t=>t instanceof e&&t.classList.contains("object")));if(!i?.id)return!1;const r=this.core.store.objects.findById(i.id);if(!r||!p.isInstanceOf(r,"KritzelCustomElement"))return!1;if(!this.core.store.selectionGroup?.objects?.some((t=>t.id===r.id)))return!1;if(!0!==r.isInteractive)return!1;const s=[];return r.element instanceof e&&s.push(r.element),r.elementRef instanceof e&&s.push(r.elementRef),0!==s.length&&s.some((t=>this.isNativeInteractiveEmbeddedTarget(n,t)))}isNativeInteractiveEmbeddedTarget(t,n){const i=t.findIndex((t=>t===n));if(-1===i)return!1;for(const n of t.slice(0,i))if(n instanceof e&&n.matches('input, button, textarea, select, a[href], [contenteditable="true"], [contenteditable=""]'))return!0;return!1}handlePointerLeave(){this.core.store.objects?.clearCursorPosition()}handleLongPress(t){this.contextMenuHandler.handleContextMenu(t.detail)}handleContextMenu(t){t.cancelable&&t.preventDefault(),this.core.store.isDisabled||"touch"!==t.pointerType&&"pen"!==t.pointerType&&this.contextMenuHandler.handleContextMenu(t)}handleResize(){this.viewport.handleResize()}handleKeyDown(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&this.keyHandler.handleKeyDown(t)}handleKeyUp(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&this.keyHandler.handleKeyUp(t)}handleCopy(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&(!this.core.store.selectionGroup||this.core.store.activeText||this.core.store.activeShape||(t.cancelable&&t.preventDefault(),this.core.clipboardManager.copy(t),this.core.rerender()))}handleCut(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&(!this.core.store.selectionGroup||this.core.store.activeText||this.core.store.activeShape||(t.cancelable&&t.preventDefault(),this.core.clipboardManager.cut(t)))}handlePaste(t){!this.core.store.isDisabled&&this.shouldHandleGlobalShortcutEvent(t)&&(this.core.store.activeText||this.core.store.activeShape||(t.cancelable&&t.preventDefault(),this.core.clipboardManager.paste(void 0,void 0,t)))}shouldHandleGlobalShortcutEvent(t){const n=t.composedPath();if(n.includes(this.host))return!0;if(n.some((t=>t instanceof e&&("DIALOG"===t.tagName||"KRITZEL-DIALOG"===t.tagName||"dialog"===t.getAttribute?.("role")||"alertdialog"===t.getAttribute?.("role")))))return!1;const i=n[0];return!(i instanceof e&&i.matches?.('input, textarea, select, [contenteditable="true"], [contenteditable=""]'))}preventDoubleTapZoomOnTouchDevices(t){t.cancelable&&t.preventDefault()}async registerTool(t,e,n){if("function"!=typeof e)return console.error(`Failed to register tool "${t}": Tool class must be a constructor function`),null;if(this.core.toolRegistry.hasTool(t)){const e=this.core.toolRegistry.getTool(t);return n&&this.applyToolConfig(e,n),e}const i=this.core.toolRegistry.registerTool(t,e);return n&&this.applyToolConfig(i,n),Promise.resolve(i)}async changeActiveTool(t){this.core.store.state.activeTool!==t&&(this.core.store.state.activeTool?.onDeactivate(),this.core.store.setState("activeTool",t),this.core.deselectAllObjects(),t?.onActivate())}async changeActiveToolByName(t){const e=this.core.toolRegistry.getTool(t);e?await this.changeActiveTool(e):console.warn(`[KritzelEngine] No tool registered with name: ${t}`)}async disable(){this.core.store.state.isEnabled=!1,this.core.rerender()}async enable(){this.core.store.state.isEnabled=!0,this.core.rerender()}async delete(){this.core.delete()}async copy(){this.core.clipboardManager.copy()}async cut(){this.core.clipboardManager.cut()}async paste(t,e){"granted"===await this.core.permissionManager.requestPermission("clipboard-read")?this.core.clipboardManager.paste(t,e):this.notificationsChange.emit({type:"error",message:"Clipboard read permission is required to paste content. Please grant permission and try again.",id:R.generateUUID()})}async bringForward(t){this.core.bringForward(t)}async sendBackward(t){this.core.sendBackward(t)}async bringToFront(t){this.core.bringToFront(t)}async sendToBack(t){this.core.sendToBack(t)}async alignObjects(t){this.core.alignObjects(t)}async group(){this.core.group()}async ungroup(){this.core.ungroup()}async undo(){this.core.undo()}async redo(){this.core.redo()}async hideContextMenu(){this.core.store.state.pointers.clear(),this.core.store.state.isContextMenuVisible=!1,this.core.store.objects?.remove((t=>t instanceof g)),this.core.store.setSelectionBox(null),this.core.store.objects?.clearLocalSelectionBox(),this.core.store.state.isSelecting=!1,this.core.store.state.isEnabled=!0,this.core.rerender()}async openContextMenu(t){this.contextMenuHandler.open(t)}async getObjectById(t){return this.core.store.allObjects.find((e=>e.id===t))||null}async getAllObjects(){return this.core.store.allObjects}async findObjects(t){return this.core.store.allNonSelectionObjects.filter(t)}async getObjectsTotalCount(){return this.core.store.totalObjectCount}async addObject(t){if(this.core.deselectAllObjects(),t.id=t.generateId(),t._core=this.core,t.scale=t.scale??this.core.store.state.scale,t.zIndex=this.core.store.currentZIndex,t.workspaceId=this.core.store.state.activeWorkspace.id,p.isInstanceOf(t,"KritzelImage")&&await t.prepareForInsert(),p.isInstanceOf(t,"KritzelText")){const e=t.content;t.editor=t.createEditor(),e&&t.setContent(e)}if(p.isInstanceOf(t,"KritzelGroup")&&t._pendingChildren.length>0){const e=new Map,n=[],i=t=>{if(0===t._pendingChildren.length)return;const r=t._pendingChildren;t._pendingChildren=[],t.childIds=[],r.forEach((r=>{const s=r.id;r.id=r.generateId(),r._core=this.core,r.scale=r.scale??this.core.store.state.scale,r.zIndex=this.core.store.currentZIndex,r.workspaceId=this.core.store.state.activeWorkspace.id,e.set(s,r.id),t.childIds.push(r.id),n.push(r),p.isInstanceOf(r,"KritzelGroup")&&i(r)}))};i(t),n.forEach((t=>{p.isInstanceOf(t,"KritzelLine")&&(t.startAnchor&&e.has(t.startAnchor.objectId)&&(t.startAnchor={objectId:e.get(t.startAnchor.objectId)}),t.endAnchor&&e.has(t.endAnchor.objectId)&&(t.endAnchor={objectId:e.get(t.endAnchor.objectId)}))})),n.forEach((t=>{this.core.addObject(t)})),t.finalize(),this.core.anchorManager.rebuildIndex()}return this.core.addObject(t),this.core.rerender(),await new Promise((t=>{requestAnimationFrame((()=>requestAnimationFrame((()=>t()))))})),this.emitObjectsChange(),this.emitObjectsAdded([t]),t}async addObjects(t){if(0===t.length)return[];for(const e of t)e._core=this.core,p.isInstanceOf(e,"KritzelImage")&&await e.prepareForInsert();return this.core.store.objects.transaction((()=>{for(const e of t){if(e.id=e.generateId(),e._core=this.core,e.zIndex=this.core.store.currentZIndex,e.workspaceId=this.core.store.state.activeWorkspace.id,p.isInstanceOf(e,"KritzelText")){const t=e.content;e.editor=e.createEditor(),t&&e.setContent(t)}if(p.isInstanceOf(e,"KritzelGroup")&&e._pendingChildren.length>0){const t=new Map,n=[],i=e=>{if(0===e._pendingChildren.length)return;const r=e._pendingChildren;e._pendingChildren=[],e.childIds=[],r.forEach((r=>{const s=r.id;r.id=r.generateId(),r._core=this.core,r.zIndex=this.core.store.currentZIndex,r.workspaceId=this.core.store.state.activeWorkspace.id,t.set(s,r.id),e.childIds.push(r.id),n.push(r),p.isInstanceOf(r,"KritzelGroup")&&i(r)}))};i(e),n.forEach((e=>{p.isInstanceOf(e,"KritzelLine")&&(e.startAnchor&&t.has(e.startAnchor.objectId)&&(e.startAnchor={objectId:t.get(e.startAnchor.objectId)}),e.endAnchor&&t.has(e.endAnchor.objectId)&&(e.endAnchor={objectId:t.get(e.endAnchor.objectId)}))})),n.forEach((t=>{this.core.addObject(t)})),e.finalize(),this.core.anchorManager.rebuildIndex()}this.core.addObject(e)}})),this.core.rerender(),await new Promise((t=>{requestAnimationFrame((()=>requestAnimationFrame((()=>t()))))})),this.emitObjectsChange(),this.emitObjectsAdded(t),t}async updateObject(t,e){return this.core.deselectAllObjects(),this.core.updateObject(t,e),this.core.rerender(),this.emitObjectsChange(),this.emitObjectsUpdated([{object:t,changedProperties:Object.keys(e)}]),t}async removeObject(t){const e=this.core.store.objects;return e?(this.core.deselectAllObjects(),e.remove((e=>e.id===t.id)),this.core.rerender(),this.emitObjectsChange(),this.emitObjectsRemoved([t]),t):null}async removeObjects(t){const e=this.core.store.objects;return e&&0!==t.length?(e.transaction((()=>{for(const e of t)this.core.removeObject(e)})),this.core.rerender(),this.emitObjectsChange(),this.emitObjectsRemoved(t),t):[]}async getSelectedObjects(){const t=this.core.store.selectionGroup;return t?t.objects:[]}async getDisplayableShortcuts(){return this.keyHandler.getDisplayableShortcuts()}async selectObjects(t){const e=this.core.toolRegistry.getTool("selection");e&&(this.core.store.state.activeTool?.onDeactivate(),this.core.store.setState("activeTool",e),this.core.deselectAllObjects(),this.core.selectObjects(t))}async selectAllObjectsInViewport(){const t=this.core.toolRegistry.getTool("selection");t&&(this.core.store.state.activeTool?.onDeactivate(),this.core.store.setState("activeTool",t),this.core.deselectAllObjects(),this.core.selectAllObjectsInViewport())}async clearSelection(){this.core.clearSelection()}async centerObjectInViewport(t){return t.centerInViewport(),this.core.updateObject(t,t),this.core.rerender(),t}async panToObject(t){this.viewport.panTo(t.centerX,t.centerY)}async backToContent(){return this.viewport.centerFitNearestContent(20)}async centerAllObjects(t=!0){return this.viewport.centerFitAllObjects(t)}async centerObjects(t,e=!0){return this.viewport.centerFitObjects(t,e)}async setViewport(t,e,n){this.viewport.setViewport(t,e,n)}async panTo(t,e){this.viewport.panTo(t,e)}async zoomTo(t,e,n){this.viewport.zoomTo(t,e,n)}async zoomIn(t,e){this.viewport.zoomIn(t,e)}async zoomOut(t,e){this.viewport.zoomOut(t,e)}async getViewport(){return this.viewport.getViewport()}async screenToWorld(t,e){return this.viewport.screenToWorld(t,e)}async worldToScreen(t,e){return this.viewport.worldToScreen(t,e)}async getObjectsInViewport(){return this.core.getObjectsInViewport()}async getScreenshot(t="png",e){if(!this.host)return null;const n={objects:this.core.store.objects,activeWorkspace:this.core.store.state.activeWorkspace,workspaces:this.core.store.state.workspaces,activeTool:this.core.store.state.activeTool,isReady:this.core.store.state.isReady,translateX:this.core.store.state.translateX,translateY:this.core.store.state.translateY,scale:this.core.store.state.scale},i={filter:t=>!("KRITZEL-CONTEXT-MENU"===t.tagName||"KRITZEL-AWARENESS-CURSORS"===t.tagName||t.classList&&t.classList.contains("debug-panel"))};let r;(e?.includeBackground??1)||(i.backgroundColor="transparent");try{r="svg"===t?await Je(this.host,i):await async function(t,e={}){return(await async function(t,e={}){const{width:n,height:i}=Se(t,e),r=await Je(t,e),s=await ze(r),o=document.createElement("canvas"),a=o.getContext("2d"),c=e.pixelRatio||function(){let t,e;try{e=process}catch(t){}const n=e&&e.env?e.env.devicePixelRatio:null;return n&&(t=parseInt(n,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}(),l=e.canvasWidth||n,h=e.canvasHeight||i;return o.width=l*c,o.height=h*c,e.skipAutoScale||function(t){(t.width>Me||t.height>Me)&&(t.width>Me&&t.height>Me?t.width>t.height?(t.height*=Me/t.width,t.width=Me):(t.width*=Me/t.height,t.height=Me):t.width>Me?(t.height*=Me/t.width,t.width=Me):(t.width*=Me/t.height,t.height=Me))}(o),o.style.width=`${l}`,o.style.height=`${h}`,e.backgroundColor&&(a.fillStyle=e.backgroundColor,a.fillRect(0,0,o.width,o.height)),a.drawImage(s,0,0,o.width,o.height),o}(t,e)).toDataURL()}(this.host,i)}finally{this.core.store.state.objects=n.objects,this.core.store.state.activeWorkspace=n.activeWorkspace,this.core.store.state.workspaces=n.workspaces,this.core.store.state.activeTool=n.activeTool,this.core.store.state.isReady=n.isReady,this.core.store.state.translateX=n.translateX,this.core.store.state.translateY=n.translateY,this.core.store.state.scale=n.scale,this.core.rerender()}return r}async exportViewportAsPng(t){try{const e=`${this.core.store.state?.activeWorkspace?.name||"workspace"}-${(new Date).toISOString().replace(/[:.]/g,"-")}.png`,n=await this.getScreenshot("png",t);if(!n)return void console.error("Failed to export viewport as PNG: screenshot could not be generated");const i=document.createElement("a");i.download=e,i.href=n,i.click()}catch(t){console.error("Failed to export viewport as PNG:",t)}}async exportViewportAsSvg(t){try{const e=`${this.core.store.state?.activeWorkspace?.name||"workspace"}-${(new Date).toISOString().replace(/[:.]/g,"-")}.svg`,n=await this.getScreenshot("svg",t);if(!n)return void console.error("Failed to export viewport as SVG: screenshot could not be generated");const i=document.createElement("a");i.download=e,i.href=n,i.click()}catch(t){console.error("Failed to export viewport as SVG:",t)}}async getSelectedObjectsAsSvgString(t){const e=await this.getSelectedObjects();if(!e||0===e.length)return null;const n=t?.theme??this.core.themeManager.getStoredTheme(),i=await me.resolveImageDataUrls(e,this.core.assetResolver);return me.generateSvg(e,{theme:n,padding:t?.padding??0,includeXmlDeclaration:!0,rasterSafeForCanvas:t?.rasterSafeForCanvas??!1,imageDataUrls:i})}async exportSelectedObjectsAsSvg(t){try{const e=await this.getSelectedObjectsAsSvgString(t);if(!e)return void console.warn("No objects selected for SVG export");const n=`selection-${(new Date).toISOString().replace(/[:.]/g,"-")}.svg`,i=new Blob([e],{type:"image/svg+xml;charset=utf-8"}),r=URL.createObjectURL(i),s=document.createElement("a");s.download=n,s.href=r,s.click(),URL.revokeObjectURL(r)}catch(t){console.error("Failed to export selected objects as SVG:",t)}}async getSelectedObjectsAsPngDataUrl(t){const e=await this.getSelectedObjectsAsSvgString({theme:t?.theme,padding:t?.padding,rasterSafeForCanvas:!0});if(!e)return null;const n=t?.scale??2;return new Promise(((t,i)=>{const r=new Image,s=new Blob([e],{type:"image/svg+xml;charset=utf-8"}),o=URL.createObjectURL(s);r.onload=()=>{const e=document.createElement("canvas");e.width=r.width*n,e.height=r.height*n;const s=e.getContext("2d");if(!s)return URL.revokeObjectURL(o),void i(new Error("Failed to get canvas context"));s.scale(n,n),s.drawImage(r,0,0),URL.revokeObjectURL(o),t(e.toDataURL("image/png"))},r.onerror=()=>{URL.revokeObjectURL(o),i(new Error("Failed to load SVG for PNG conversion"))},r.src=o}))}async exportSelectedObjectsAsPng(t){try{const e=await this.getSelectedObjectsAsPngDataUrl(t);if(!e)return void console.warn("No objects selected for PNG export");const n=`selection-${(new Date).toISOString().replace(/[:.]/g,"-")}.png`,i=document.createElement("a");i.download=n,i.href=e,i.click()}catch(t){console.error("Failed to export selected objects as PNG:",t)}}async exportAsJson(){const t=this.core.store.state.activeWorkspace;if(!t)throw new Error("Cannot export workspace: no active workspace is loaded");const e=t.serialize({includeObjects:!0});return JSON.stringify(e,null,2)}async importFromJson(t){const e=JSON.parse(t);if(!e.__class__||"KritzelWorkspace"!==e.__class__)throw new Error("Invalid workspace data: missing or incorrect __class__ identifier");e.version&&e.version!==I&&console.warn(`Workspace version mismatch: expected ${I}, got ${e.version}`);const n=R.generateUUID();let i=e.viewport||{centerWorldX:0,centerWorldY:0,scale:1};if("translateX"in i&&!("centerWorldX"in i)){const t=i.scale??1;i={centerWorldX:-(i.translateX??0)/t,centerWorldY:-(i.translateY??0)/t,scale:t}}const r=new T(n,e.name||"Imported Workspace",i);if(this.core.createWorkspace(r),this.workspacesChange.emit(this.core.store.state.workspaces),this.core.beforeWorkspaceChange(),await this.core.initializeWorkspace(r),e.objects&&Array.isArray(e.objects)){const t=new se(this.core);for(const i of e.objects){const e=t.revive(i);e&&(e.workspaceId=n,this.core.addObject(e))}}this.core.rerender(),this.activeWorkspaceChange.emit(r)}async loadObjectsFromJson(t){const e=JSON.parse(t);if(!e.__class__||"KritzelWorkspace"!==e.__class__)throw new Error("Invalid workspace data: missing or incorrect __class__ identifier");e.version&&e.version!==I&&console.warn(`Workspace version mismatch: expected ${I}, got ${e.version}`);const n=this.core.store.state.activeWorkspace;if(!n)throw new Error("Cannot load objects: no active workspace is loaded");const i=n.id;let r=0;if(e.objects&&Array.isArray(e.objects)){const t=new se(this.core);for(const n of e.objects){const e=t.revive(n);e&&(e.workspaceId=i,this.core.addObject(e),r++)}}return this.core.rerender(),r}async downloadAsJson(t){try{const e=await this.exportAsJson(),n=this.core.store.state?.activeWorkspace?.name||"workspace",i=(new Date).toISOString().replace(/[:.]/g,"-"),r=t||`${n}-${i}`,s=new Blob([e],{type:"application/json;charset=utf-8"}),o=URL.createObjectURL(s),a=document.createElement("a");a.download=`${r}.json`,a.href=o,a.click(),URL.revokeObjectURL(o)}catch(t){console.error("Failed to download workspace as JSON:",t)}}async importFromFile(){return new Promise(((t,e)=>{const n=document.createElement("input");n.type="file",n.accept=".json,application/json",n.style.display="none";const i=()=>{n.removeEventListener("change",r),n.removeEventListener("cancel",s),document.body.removeChild(n)},r=async n=>{const r=n.target,s=r.files?.[0];if(!s)return i(),void t();try{const n=new FileReader;n.onload=async n=>{try{const e=n.target?.result;await this.importFromJson(e),i(),t()}catch(t){i(),console.error("Failed to import workspace from file:",t),e(t)}},n.onerror=()=>{i(),console.error("Failed to read file:",n.error),e(n.error)},n.readAsText(s)}catch(t){i(),console.error("Failed to process file:",t),e(t)}},s=()=>{i(),t()};n.addEventListener("change",r),n.addEventListener("cancel",s),document.body.appendChild(n),n.click()}))}async createWorkspace(t){return await this.core.createWorkspace(t),this.workspacesChange.emit(this.core.store.state.workspaces),t}async updateWorkspace(t){await this.core.updateWorkspace(t),this.workspacesChange.emit(this.core.store.state.workspaces)}async deleteWorkspace(t){await this.core.deleteWorkspace(t),this.workspacesChange.emit(this.core.store.state.workspaces)}async getWorkspaces(){return await this.core.getWorkspaces()}async getActiveWorkspace(){const t=this.core.store.state.activeWorkspace;if(!t)throw new Error("No active workspace is loaded");return t}async getIsPublic(){return this.core.getIsPublic()}async loadSharedWorkspace(t){const e=t;let n=this.core.getWorkspaces().find((t=>t.id===e));n?n.isPublic=!0:(n=new T(e,"Shared Workspace"),n.isPublic=!0,this.core.createWorkspace(n)),this.workspacesChange.emit(this.core.store.state.workspaces),this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(n),this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace)}async reinitSync(){this.core.setSyncConfig(this.syncConfig),this.core.setAssetStorageConfig(this.assetStorageConfig),this.core.store.objects?.clearCursorPosition(),this.core.store.objects?.destroy(),this.core.appStateMap.destroy(),this.core.assetResolver.destroy(),this._isYjsInitialized=!1,this._isAssetStorageInitialized=!1,await this.initializeSyncAndWorkspace()}async saveSettings(t){const e=this.core.getStorageKey("kritzel-settings");localStorage.setItem(e,JSON.stringify(t))}async loadSettings(){const t=this.core.getStorageKey("kritzel-settings"),e=localStorage.getItem(t);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async registerLocales(t){this.core.localizationManager.registerLocales(t),this.core.localizationManager.setLocale(this.core.localizationManager.currentLocale)}async setLocale(t){this.locale=t,this.core.localizationManager.setLocale(t)}async getLocale(){return this.core.localizationManager.currentLocale}async getAvailableLocales(){return this.core.localizationManager.getAvailableLocales()}async getAvailableLocaleOptions(){return this.core.localizationManager.getAvailableLocaleOptions()}async t(t,e){return this.core.localizationManager.translate(t,e)}async getResolvedTerms(){return this.core.localizationManager.getAllTerms()}core;viewport;contextMenuHandler;keyHandler;contextMenuElement=null;_lastHadSelectionGroup=!1;_isViewportReady=!1;_isYjsInitialized=!1;_isAssetStorageInitialized=!1;_isResolvingActiveWorkspaceId=!1;_stateChangeListenersRegistered=!1;_workspaceInitializationPromise=null;_workspaceInitializationTargetKey=null;_syncInitPromise=null;_syncConfigRevision=0;_assetStorageConfigRevision=0;_isWorkspaceLoading=!1;_hasLoggedUnlicensedWelcomeBanner=!1;_previousVisibleCustomElements=new Set;_defaultUndoState={canUndo:!1,canRedo:!1,undoStackSize:0,redoStackSize:0};_objectDistanceFadeNearScale=1;_objectDistanceFadeFarScale=.15;_objectDistanceFadeMinOpacity=0;_objectDistanceFadeCloseStartScale=2;_objectDistanceFadeCloseMaxScale=4;_objectDistanceFadeCloseMinOpacity=0;syncLoadingState(){this.core.store.state.isLoading=this._isWorkspaceLoading||this.isLoading}applyToolConfig(t,e){if(Object.entries(e).forEach((([e,n])=>{t[e]=n})),"palettes"in e&&"type"in e){const n=e.palettes[e.type];n&&(t.palette=n)}if("sizes"in e&&null!=e.sizes&&"type"in e){const n=e,i=n.sizes?.[n.type];i&&(t.sizes=i)}}get isSelecting(){return this.core.store.state.activeTool instanceof w&&this.core.store.state.isSelecting}get isSelectionActive(){return this.core.store.state.activeTool instanceof w&&null!==this.core.store.selectionGroup}constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.isEngineReady=n(this,"isEngineReady"),this.activeToolChange=n(this,"activeToolChange"),this.objectsSelectionChange=n(this,"objectsSelectionChange"),this.workspacesChange=n(this,"workspacesChange"),this.activeWorkspaceChange=n(this,"activeWorkspaceChange"),this.longpress=n(this,"longpress"),this.objectsChange=n(this,"objectsChange"),this.objectsAdded=n(this,"objectsAdded"),this.objectsRemoved=n(this,"objectsRemoved"),this.objectsUpdated=n(this,"objectsUpdated"),this.undoStateChange=n(this,"undoStateChange"),this.objectsInViewportChange=n(this,"objectsInViewportChange"),this.viewportChange=n(this,"viewportChange"),this.awarenessChange=n(this,"awarenessChange"),this.notificationsChange=n(this,"notificationsChange"),this.core=new we(this)}disconnectedCallback(){this.throttledPointerMoveMulti.cancel(),this.core.store.allObjects&&this.core.store.allObjects.forEach((t=>{p.isInstanceOf(t,"KritzelCustomElement")&&t.unmount()})),this.core.store.objects?.clearCursorPosition(),this.core.store.objects&&this.core.store.objects.destroy(),this.core.appStateMap.destroy(),this.core.cursorManager.cleanup(),this.core.themeManager.cleanup(),this.core.licenseManager.destroy()}componentWillLoad(){this.core.setEditorId(this.editorId),this.themes&&this.themes.length>0&&this.core.themeManager.registerThemes(this.themes);const t=this.host.closest("kritzel-editor");this.core.themeManager.injectThemeEarly(t||this.host),this.locales&&this.locales.length>0&&this.core.localizationManager.registerLocales(this.locales),this.core.localizationManager.setFallbackLocale(this.fallbackLocale),this.core.localizationManager.setLocale(this.locale),this.core.licenseManager.validate(this.licenseKey),this.core.licenseManager.startPeriodicValidation(),this.core.setUser(this.user),this.validateScaleMax(this.scaleMax),this.validateScaleMin(this.scaleMin),this.core.store.state.lockDrawingScale=this.lockDrawingScale,this.core.store.state.viewportBoundaryLeft=this.viewportBoundaryLeft,this.core.store.state.viewportBoundaryRight=this.viewportBoundaryRight,this.core.store.state.viewportBoundaryTop=this.viewportBoundaryTop,this.core.store.state.viewportBoundaryBottom=this.viewportBoundaryBottom,this._isWorkspaceLoading=!0,this.syncLoadingState()}async componentDidLoad(){setTimeout((async()=>{this.contextMenuHandler=new re(this.core,this.globalContextMenuItems??[],this.objectContextMenuItems??[]),this.keyHandler=new ie(this.core),this.viewport=new ne(this.core,this.host),this._isViewportReady=!0,this.core.cursorManager.setTargetElement(this.cursorTarget||document.body),this.host.shadowRoot&&this.core.cursorManager.setShadowRoot(this.host.shadowRoot);const t=this.host.closest("kritzel-editor");this.core.themeManager.setTargetElement(t||this.host),await this.initializeSyncAndWorkspace(),!1===this.core.store.state.isReady&&(this.core.store.state.isReady=!0,this.logUnlicensedWelcomeBanner(),this.isEngineReady.emit(this.core.store.state))}),50)}async initializeSyncAndWorkspace(){if(this._syncInitPromise)return this._syncInitPromise;this._syncInitPromise=this.doInitializeSyncAndWorkspace();try{await this._syncInitPromise}finally{this._syncInitPromise=null}}async initializeAssetStorage(){if(this._isAssetStorageInitialized)return;const t=this._assetStorageConfigRevision;this.core.setAssetStorageConfig(this.assetStorageConfig),await this.core.initializeAssetStorage(),t!==this._assetStorageConfigRevision&&(this.core.assetResolver.destroy(),this.core.setAssetStorageConfig(this.assetStorageConfig),await this.core.initializeAssetStorage()),this._isAssetStorageInitialized=!0}logUnlicensedWelcomeBanner(){this.core.licenseManager.isLicensed||this._hasLoggedUnlicensedWelcomeBanner||(this._hasLoggedUnlicensedWelcomeBanner=!0,console.info("%c👋 Welcome to Kritzel","color: #007AFF; font-weight: 700;"),console.info("This version of Kritzel is not licensed. Get a license at: https://kritzel.io"))}async doInitializeSyncAndWorkspace(){const t=this._syncConfigRevision;if(this.core.setSyncConfig(this.syncConfig),this.core.setAssetStorageConfig(this.assetStorageConfig),this._isYjsInitialized||(await this.core.initializeYjs(),t!==this._syncConfigRevision&&(this.core.appStateMap.destroy(),this.core.setSyncConfig(this.syncConfig),this.core.setAssetStorageConfig(this.assetStorageConfig),await this.core.initializeYjs()),this._isYjsInitialized=!0),!this._isAssetStorageInitialized&&this.assetStorageConfig&&await this.initializeAssetStorage(),this.activeWorkspaceId){const t=this.core.getWorkspaces().find((t=>t.id===this.activeWorkspaceId));t?await this.initializeWorkspaceIfNeeded(t):await this.initializeWorkspaceIfNeeded()}else{const t=this.resolveStartupWorkspace();await this.initializeWorkspaceIfNeeded(t)}const e=this.core.store.state.activeWorkspace;e&&this.activeWorkspaceChange.emit(e),this._stateChangeListenersRegistered||(this.core.appStateMap.onRemoteChange((()=>{this.workspacesChange.emit(this.core.store.state.workspaces),this.tryResolveActiveWorkspaceFromId()})),this._registerStateChangeListeners(),this._stateChangeListenersRegistered=!0),this.tryResolveActiveWorkspaceFromId()}resolveStartupWorkspace(){if(this.activeWorkspaceId){const t=this.core.getWorkspaces().find((t=>t.id===this.activeWorkspaceId));if(t)return t;console.warn(`[KritzelEngine] No workspace found with ID: ${this.activeWorkspaceId}`)}return this.workspace}tryResolveActiveWorkspaceFromId(){this.activeWorkspaceId&&!this._isResolvingActiveWorkspaceId&&this.core.store.state.activeWorkspace?.id!==this.activeWorkspaceId&&(this._isResolvingActiveWorkspaceId=!0,this.switchToWorkspaceById(this.activeWorkspaceId,!1).finally((()=>{this._isResolvingActiveWorkspaceId=!1})))}async switchToWorkspaceById(t,e=!0){const n=this.core.getWorkspaces().find((e=>e.id===t));n?this.core.store.state.activeWorkspace?.id!==n.id&&(this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(n),this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace)):e&&console.warn(`[KritzelEngine] No workspace found with ID: ${t}`)}async initializeWorkspaceIfNeeded(t,e){const n=t?.id??null,i=n??(e?.skipFallbackCreation?"__NO_FALLBACK__":"__AUTO__");if(n&&this.core.store.state.activeWorkspace?.id===n)return;if(this._workspaceInitializationPromise&&this._workspaceInitializationTargetKey===i)return void await this._workspaceInitializationPromise;this._isWorkspaceLoading=!0,this.syncLoadingState();const r=this.core.initializeWorkspace(t,e);this._workspaceInitializationPromise=r,this._workspaceInitializationTargetKey=i;try{await r}finally{this._workspaceInitializationPromise===r&&(this._workspaceInitializationPromise=null,this._workspaceInitializationTargetKey=null),this._isWorkspaceLoading=!1,this.syncLoadingState()}}emitObjectsChange(){const t=this.core.store.objects;if(!t)return this.objectsChange.emit([]),this.undoStateChange.emit(this._defaultUndoState),void(this._lastHadSelectionGroup&&(this._lastHadSelectionGroup=!1,this.objectsSelectionChange.emit()));const e=t.undoState,n=null!==this.core.store.selectionGroup;this.objectsChange.emit(this.core.store.allObjects),this.undoStateChange.emit(e),this._lastHadSelectionGroup!==n&&(this._lastHadSelectionGroup=n,this.objectsSelectionChange.emit())}emitObjectsAdded(t){this.objectsAdded.emit({objects:t})}emitObjectsRemoved(t){this.objectsRemoved.emit({objects:t})}emitObjectsUpdated(t){this.objectsUpdated.emit({objects:t})}emitAwarenessChange(t){this.awarenessChange.emit(t)}emitObjectsInViewportChange(){this.objectsInViewportChange.emit(this.core.store.objectsInViewport)}_registerStateChangeListeners(){this.core.store.onStateChange("activeTool",this._handleActiveToolChange.bind(this))}_handleActiveToolChange(t){t instanceof w||(this.core.clearSelection(),this.core.store.objects?.remove((t=>t instanceof g)),this.core.store.setSelectionBox(null),this.core.store.objects?.clearLocalSelectionBox(),this.core.store.state.isSelecting=!1,this.core.store.state.isResizeHandleSelected=!1,this.core.store.state.isRotationHandleSelected=!1),t instanceof m||this.core.resetActiveText(),t instanceof Ot||this.core.resetActiveShape(),this.core.store.state.skipContextMenu=!1,t&&this.activeToolChange.emit(t),A.forceHideKeyboard(),this.core.rerender()}getObjectDistanceFadeMultiplier(t,e){if(!this.isObjectDistanceFadingActive)return 1;const n=Math.max(Number.isFinite(e)?e:1,Number.EPSILON)/Math.max(Number.isFinite(t)?t:1,Number.EPSILON),i=this.getFarDistanceFadeMultiplier(n),r=this.getCloseDistanceFadeMultiplier(n);return Math.min(i,r)}getFarDistanceFadeMultiplier(t){if(t>=this._objectDistanceFadeNearScale)return 1;if(t<=this._objectDistanceFadeFarScale)return this._objectDistanceFadeMinOpacity;const e=(this._objectDistanceFadeNearScale-t)/(this._objectDistanceFadeNearScale-this._objectDistanceFadeFarScale);return 1-e*e*(3-2*e)*(1-this._objectDistanceFadeMinOpacity)}getCloseDistanceFadeMultiplier(t){if(t<=this._objectDistanceFadeCloseStartScale)return 1;if(t>=this._objectDistanceFadeCloseMaxScale)return this._objectDistanceFadeCloseMinOpacity;const e=(t-this._objectDistanceFadeCloseStartScale)/(this._objectDistanceFadeCloseMaxScale-this._objectDistanceFadeCloseStartScale);return 1-e*e*(3-2*e)*(1-this._objectDistanceFadeCloseMinOpacity)}shouldApplyDistanceFade(t){return!p.isInstanceOf(t,"KritzelSelectionGroup")&&!p.isInstanceOf(t,"KritzelSelectionBox")}getObjectEffectiveOpacity(t,e){const n=Number.isFinite(t.opacity)?t.opacity:1,i=this.shouldApplyDistanceFade(t)?this.getObjectDistanceFadeMultiplier(t.scale,e):1;return{multiplied:(t.markedForRemoval?.5:1)*n*i,overridden:((t.markedForRemoval?.5:n)*i).toString()}}getSelectionHandleCapabilities(t){const e=p.isInstanceOf(t,"KritzelSelectionGroup")?t.objects:[t];return{canRenderResizeHandles:e.every((t=>!1!==t.isResizable)),canRenderRotationHandle:e.every((t=>!1!==t.isRotatable))}}render(){if(!this.viewport)return i(r,null,this.core.store.state.isLoading&&i("div",{class:"workspace-loading-overlay"},i("span",{class:"workspace-loading-spinner"}),this.core.localizationManager.translate("engine.loading")));const t=this.core.themeManager.getStoredTheme(),e=window.getComputedStyle(this.host).getPropertyValue("--kritzel-selection-handle-size").trim()||"6px",n=parseFloat(e),s=2*n<14?14:n,o=this.core.store.state.scale,a=this.core.store.state.viewportWidth/2+this.core.store.state.translateX,c=this.core.store.state.viewportHeight/2+this.core.store.state.translateY,l=this.core.store.objectsInViewport,h=t=>this.core.store.state.isScaling||p.isInstanceOf(t,"KritzelSelectionGroup")?"none":"auto",u=t=>t.markedForRemoval||p.isInstanceOf(t,"KritzelSelectionGroup")&&1===t.objects.length&&p.isInstanceOf(t.objects[0],"KritzelCustomElement")?"none":"auto",f=new Set;return l.forEach((t=>{p.isInstanceOf(t,"KritzelCustomElement")&&f.add(t.id)})),this._previousVisibleCustomElements.forEach((t=>{if(!f.has(t)){const e=this.core.store.objects.findById(t);e&&p.isInstanceOf(e,"KritzelCustomElement")&&e.unmount()}})),this._previousVisibleCustomElements=f,this.core.cursorManager.applyCursor(),this.core.store.state.hasViewportChanged&&(this.viewportChange.emit(this.viewport.getViewport()),this.core.store.totalObjectCount>0&&this.emitObjectsInViewportChange()),i(r,null,this.core.store.state.isLoading&&i("div",{class:"workspace-loading-overlay"},i("span",{class:"workspace-loading-spinner"}),"Loading..."),this.core.store.state.debugInfo.showViewportInfo&&i("div",{class:"debug-panel"},i("div",null,"ActiveWorkspaceId: ",this.core.store.state?.activeWorkspace?.id),i("div",null,"ActiveWorkspaceName: ",this.core.store.state?.activeWorkspace?.name),i("div",null,"TranslateX: ",this.core.store.state?.translateX),i("div",null,"TranslateY: ",this.core.store.state?.translateY),i("div",null,"ViewportWidth: ",this.core.store.state?.viewportWidth),i("div",null,"ViewportHeight: ",this.core.store.state?.viewportHeight),i("div",null,"PointerCount: ",this.core.store.state.pointers.size),i("div",null,"Scale: ",this.core.store.state?.scale),i("div",null,"ActiveTool: ",this.core.store.state?.activeTool?.name),i("div",null,"HasViewportChanged: ",this.core.store.state?.hasViewportChanged?"true":"false"),i("div",null,"IsEnabled: ",this.core.store.state?.isEnabled?"true":"false"),i("div",null,"IsScaling: ",this.core.store.state?.isScaling?"true":"false"),i("div",null,"IsPanning: ",this.core.store.state?.isPanning?"true":"false"),i("div",null,"IsSelecting: ",this.isSelecting?"true":"false"),i("div",null,"IsSelectionActive: ",this.isSelectionActive?"true":"false"),i("div",null,"IsResizeHandleSelected: ",this.core.store.state.isResizeHandleSelected?"true":"false"),i("div",null,"IsRotationHandleSelected: ",this.core.store.state.isRotationHandleSelected?"true":"false"),i("div",null,"IsRotationHandleHovered: ",this.core.store.state.isRotationHandleHovered?"true":"false"),i("div",null,"IsDrawing: ",this.core.store.state.isDrawing?"true":"false"),i("div",null,"IsWriting: ",this.core.store.state.isWriting?"true":"false"),i("div",null,"IsPointerDown: ",this.core.store.isPointerDown?"true":"false"),i("div",null,"PointerX: ",this.core.store.state?.pointerX),i("div",null,"PointerY: ",this.core.store.state?.pointerY),i("div",null,"TotalObjects: ",this.core.store.totalObjectCount),i("div",null,"ObjectsInViewport: ",this.core.store.objectsInViewport.length),i("div",null,"SelectedObjects: ",this.core.store.selectionGroup?.objects.length||0),i("div",null,"ViewportCenter: (",a.toFixed(2),", ",c.toFixed(2),")")),i("div",{id:"origin",class:"origin",style:{transform:`matrix(${this.core.store.state?.scale}, 0, 0, ${this.core.store.state?.scale}, ${this.core.store.state?.translateX}, ${this.core.store.state?.translateY})`}},l?.map((e=>{const{multiplied:r,overridden:a}=this.getObjectEffectiveOpacity(e,o);return i("div",{key:e.id,id:e.id,class:"object",style:{transform:e?.transformationMatrix,transformOrigin:"top left",position:"absolute",zIndex:this.core.displaySelectionLineUI(e)?"10001":e.zIndex.toString(),pointerEvents:h(e)}},p.isInstanceOf(e,"KritzelPath")&&i("svg",{ref:t=>t&&e.mount(t),xmlns:"http://www.w3.org/2000/svg",style:{height:e?.totalHeight+"px",width:e?.totalWidth+"px",left:"0",top:"0",position:"absolute",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,pointerEvents:e.markedForRemoval?"none":"auto",overflow:"visible"},viewBox:e?.viewBox},i("path",{d:e?.d,fill:M.applyOpacity(e.fill,r,t),stroke:M.applyOpacity(e?.stroke,r,t),"shape-rendering":e.isLowRes()?"optimizeSpeed":"auto"})),p.isInstanceOf(e,"KritzelLine")&&i("svg",{ref:t=>t&&e.mount(t),xmlns:"http://www.w3.org/2000/svg",style:{height:e?.totalHeight+"px",width:e?.totalWidth+"px",left:"0",top:"0",position:"absolute",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,pointerEvents:e.markedForRemoval?"none":"auto",overflow:"visible"},viewBox:e?.viewBox},(e.hasStartArrow||e.hasEndArrow)&&i("defs",null,e.hasStartArrow&&i("marker",{id:e.startMarkerId,markerWidth:e.getArrowSize("start"),markerHeight:e.getArrowSize("start"),refX:0,refY:e.getArrowSize("start")/2,orient:"auto-start-reverse",markerUnits:"userSpaceOnUse"},i("path",{d:e.getArrowPath(e.arrows?.start?.style),fill:M.applyOpacity(e.getArrowFill("start"),r),transform:`scale(${e.getArrowSize("start")/10})`})),e.hasEndArrow&&i("marker",{id:e.endMarkerId,markerWidth:e.getArrowSize("end"),markerHeight:e.getArrowSize("end"),refX:0,refY:e.getArrowSize("end")/2,orient:"auto",markerUnits:"userSpaceOnUse"},i("path",{d:e.getArrowPath(e.arrows?.end?.style),fill:M.applyOpacity(e.getArrowFill("end"),r),transform:`scale(${e.getArrowSize("end")/10})`}))),i("path",{d:this.core.anchorManager.computeClippedLinePath(e),fill:"none",stroke:"transparent","stroke-width":Math.max(e?.strokeWidth||0,10),"stroke-linecap":"round"}),i("path",{d:this.core.anchorManager.computeClippedLinePath(e),fill:"none",stroke:M.applyOpacity(e?.stroke,r,t),"stroke-width":e?.strokeWidth,"stroke-linecap":"round","marker-start":e.hasStartArrow?`url(#${e.startMarkerId})`:void 0,"marker-end":e.hasEndArrow?`url(#${e.endMarkerId})`:void 0})),p.isInstanceOf(e,"KritzelImage")&&"ready"===e.loadState&&i("img",{ref:t=>t&&e.mount(t),src:e.resolvedSrc||e.src,style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:a,pointerEvents:e.markedForRemoval?"none":"auto",backgroundColor:M.resolveThemeColor(e.backgroundColor,t),borderColor:M.resolveThemeColor(e.borderColor,t),borderWidth:e.borderWidth+"px",borderStyle:"solid",padding:e.padding+"px",overflow:"visible",userSelect:"none",imageRendering:this.core.store.state.isScaling||this.core.store.state.isPanning?"pixelated":"auto"},draggable:!1,decoding:"async",loading:"eager",onDragStart:t=>t.preventDefault()}),p.isInstanceOf(e,"KritzelImage")&&"ready"!==e.loadState&&i("div",{ref:()=>e.ensureLoaded(),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:a,pointerEvents:e.markedForRemoval?"none":"auto",backgroundColor:M.resolveThemeColor({light:"#e5e7eb",dark:"#2a2a2a"},t),borderColor:M.resolveThemeColor("error"===e.loadState?{light:"#9ca3af",dark:"#6b7280"}:e.borderColor,t),borderWidth:"error"===e.loadState?"1px":e.borderWidth+"px",borderStyle:"solid",padding:e.padding+"px",overflow:"hidden",userSelect:"none",display:"flex",alignItems:"center",justifyContent:"center"}},i("kritzel-icon",{name:"error"===e.loadState?"image-off":"image",size:Math.max(16,.3*Math.min(e.totalWidth,e.totalHeight)),style:{color:M.resolveThemeColor({light:"#9ca3af",dark:"#6b7280"},t)}})),p.isInstanceOf(e,"KritzelCustomElement")&&i("div",{ref:t=>t&&e.mount(t),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:a,pointerEvents:e.markedForRemoval?"none":"auto",backgroundColor:M.resolveThemeColor(e.backgroundColor,t),borderColor:M.resolveThemeColor(e.borderColor,t),borderWidth:e.borderWidth+"px",borderStyle:"solid",padding:e.padding+"px",overflow:"hidden",display:"block"}}),p.isInstanceOf(e,"KritzelSelectionGroup")&&!this.core.displaySelectionLineUI(e)&&i("div",{ref:t=>t&&e.mount(t),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:e.markedForRemoval?"0.5":e.opacity.toString(),pointerEvents:u(e)}}),p.isInstanceOf(e,"KritzelSelectionBox")&&i("div",{ref:t=>t&&e.mount(t),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:e.markedForRemoval?"0.5":e.opacity.toString(),pointerEvents:e.markedForRemoval?"none":"auto",backgroundColor:M.resolveThemeColor(e.backgroundColor,t),borderColor:M.resolveThemeColor(e.borderColor,t),borderWidth:e.borderWidth+"px",borderStyle:"solid"}}),p.isInstanceOf(e,"KritzelText")&&i("div",{style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,opacity:a,pointerEvents:e.markedForRemoval?"none":"auto"}},i("div",{id:"text-object",ref:t=>t&&e.mount(t),onPointerDown:t=>e.handlePointerDown(t),onPointerMove:t=>e.handlePointerMove(t),onPointerUp:t=>e.handlePointerUp(t),style:{minWidth:e.initialWidth+"px",minHeight:e.initialHeight+"px",maxWidth:"500px",height:"auto",width:"max-content",transformOrigin:"top left",transform:`scale(${e.scaleFactor})`,backgroundColor:M.resolveThemeColor(e.backgroundColor,t),overflow:"visible"}})),p.isInstanceOf(e,"KritzelShape")&&(()=>{const n=M.resolveThemeColor(e.fillColor,t),s=M.resolveThemeColor(e.strokeColor,t),o=!!n&&"transparent"!==n&&s===n;return i("div",{ref:t=>t&&e.mount(t),onPointerDown:t=>e.handlePointerDown(t),onPointerMove:t=>e.handlePointerMove(t),onPointerUp:t=>e.handlePointerUp(t),style:{position:"absolute",left:"0",top:"0",width:e.totalWidth+"px",height:e.totalHeight+"px",transform:0!==e.rotationDegrees?`rotate(${e.rotationDegrees}deg)`:void 0,transformOrigin:0!==e.rotationDegrees?`${e.totalWidth/2}px ${e.totalHeight/2}px`:void 0,pointerEvents:e.markedForRemoval?"none":"auto",overflow:"visible"}},i("svg",{xmlns:"http://www.w3.org/2000/svg",style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",overflow:"visible",pointerEvents:"none"},viewBox:e.viewBox,preserveAspectRatio:"none"},i("path",{d:e.getSvgPath(),fill:M.applyOpacity(e.fillColor,r,t),stroke:o?"none":M.applyOpacity(e.strokeColor,r,t),"stroke-width":o?0:e.strokeWidth})),i("div",{ref:t=>t&&e.mountTextEditor(t),style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center",textAlign:"center",overflow:"hidden",pointerEvents:e.isEditing?"auto":"none"}}))})(),this.core.store.state.debugInfo.showObjectInfo&&i("div",{style:{pointerEvents:"none",position:"absolute",left:`${e.totalWidth}px`,top:"0",zIndex:(e.zIndex+2).toString()}},i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"Id: ",e.id),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"userId: ",e.userId),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"width: ",e.width),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"height: ",e.height),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"translateX: ",e.translateX),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"translateY: ",e.translateY),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"scale: ",e.scale),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"rotationDegrees: ",e.rotationDegrees),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"zIndex: ",e.zIndex),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"isSelected: ",e.isSelected?"true":"false"),p.isInstanceOf(e,"KritzelCustomElement")&&i("div",null,i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"isInteractive: ",e.isInteractive?"true":"false")),p.isInstanceOf(e,"KritzelImage")&&i("div",null,i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"assetId: ",e.assetId),i("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"mimeType: ",e.mimeType))),(this.core.displaySelectionGroupUI(e)||this.core.displaySelectionLineUI(e))&&(()=>{const r=p.isInstanceOf(e,"KritzelSelectionGroup"),o=this.core.store.objects?.localClientId,a=this.core.store.objects?.awareness?.getStates(),c=r&&(null!=e.userId&&null!=this.core.user?.id&&e.userId!==this.core.user.id||null!=e.userId&&null!=this.core.user?.id&&e.userId===this.core.user.id&&null!=e.clientId&&null!=o&&e.clientId!==o&&!0===a?.has(e.clientId));let l;if(c&&a&&(r&&null!=e.clientId&&(l=a.get(e.clientId)?.user?.color),!l))for(const t of a.values())if(t.user?.id===e.userId){l=t.user.color;break}const h=l??(M.resolveThemeColor(e.borderColor,t)||"var(--kritzel-selection-border-color, #007AFF)"),u=l??"var(--kritzel-selection-handle-stroke-color, #007AFF)",f=null!=e.endAnchor,d=this.core.store.state.snapCandidate??this.core.store.state.snapPreviewCandidate,g=null!=e.startAnchor||"start"===d?.endpoint,v=f||"end"===d?.endpoint,w=this.core.displaySelectionLineUI(e)?"10000":(e.zIndex+1).toString(),m=e.scale??1,{canRenderResizeHandles:y,canRenderRotationHandle:b}=this.getSelectionHandleCapabilities(e);return i("svg",{xmlns:"http://www.w3.org/2000/svg",style:{zIndex:w,height:e?.totalHeight.toString(),width:e?.totalWidth.toString(),left:"0",top:"0",position:"absolute",transform:`rotate(${e.rotationDegrees}deg)`,transformOrigin:`${e.totalWidth/2}px ${e.totalHeight/2}px`,overflow:"visible",pointerEvents:"none"}},this.core.displaySelectionGroupUI(e)&&i("g",{class:"selection-group-ui",style:{pointerEvents:"none"}},(()=>{const t=c&&p.isInstanceOf(e,"KritzelSelectionGroup")&&1===e.objects.length&&p.isInstanceOf(e.objects[0],"KritzelLine")?e.objects[0]:null;return t?i("g",{class:"selection-line-borders"},i("path",{class:"selection-line-border",d:this.core.anchorManager.computeClippedLinePath(t,!0),style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"round",fill:"none"}})):i("g",{class:"selection-group-borders"},i("line",{x1:"0",y1:"0",x2:e.totalWidth,y2:"0",style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),i("line",{x1:"0",y1:"0",x2:"0",y2:e.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),i("line",{x1:"0",y1:e.totalHeight,x2:e.totalWidth,y2:e.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),i("line",{x1:e.totalWidth,y1:"0",x2:e.totalWidth,y2:e.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}))})(),!this.isSelecting&&!c&&i("g",{class:"selection-group-handles",style:{pointerEvents:"auto"}},y&&i("g",null,i("rect",{class:"resize-handle top-left",x:""+-(n-1)*m/this.core.store.state?.scale,y:""+-(n-1)*m/this.core.store.state?.scale,width:""+2*(n-1)*m/this.core.store.state?.scale,height:""+2*(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("rect",{class:"resize-handle-overlay top-left",x:""+-s*m/this.core.store.state?.scale,y:""+-s*m/this.core.store.state?.scale,width:""+2*s*m/this.core.store.state?.scale,height:""+2*s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("rect",{class:"resize-handle top-right",x:""+(e.totalWidth-(n-1)*m/this.core.store.state?.scale),y:""+-(n-1)*m/this.core.store.state?.scale,width:""+2*(n-1)*m/this.core.store.state?.scale,height:""+2*(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("rect",{class:"resize-handle-overlay top-right",x:""+(e.totalWidth-s*m/this.core.store.state?.scale),y:""+-s*m/this.core.store.state?.scale,width:""+2*s*m/this.core.store.state?.scale,height:""+2*s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("rect",{class:"resize-handle bottom-left",x:""+-(n-1)*m/this.core.store.state?.scale,y:""+(e.totalHeight-(n-1)*m/this.core.store.state?.scale),width:""+2*(n-1)*m/this.core.store.state?.scale,height:""+2*(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("rect",{class:"resize-handle-overlay bottom-left",x:""+-s*m/this.core.store.state?.scale,y:""+(e.totalHeight-s*m/this.core.store.state?.scale),width:""+2*s*m/this.core.store.state?.scale,height:""+2*s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("rect",{class:"resize-handle bottom-right",x:""+(e.totalWidth-(n-1)*m/this.core.store.state?.scale),y:""+(e.totalHeight-(n-1)*m/this.core.store.state?.scale),width:""+2*(n-1)*m/this.core.store.state?.scale,height:""+2*(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("rect",{class:"resize-handle-overlay bottom-right",x:""+(e.totalWidth-s*m/this.core.store.state?.scale),y:""+(e.totalHeight-s*m/this.core.store.state?.scale),width:""+2*s*m/this.core.store.state?.scale,height:""+2*s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}})),b&&i("g",null,i("line",{x1:e.totalWidth/2,y1:"0",x2:e.totalWidth/2,y2:-15*m/this.core.store.state?.scale,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${m} / ${this.core.store.state?.scale})`}}),i("circle",{class:"rotation-handle",cx:e.totalWidth/2,cy:-15*m/this.core.store.state?.scale,r:""+(n-1)*m/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:u,strokeWidth:`calc(2px * ${m} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("circle",{class:"rotation-handle-overlay",cx:e.totalWidth/2,cy:-15*m/this.core.store.state?.scale,r:""+s*m/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}})))),this.core.displaySelectionLineUI(e)&&p.isInstanceOf(e,"KritzelLine")&&i("g",{class:"selection-line-ui",style:{pointerEvents:"none"}},i("g",{class:"selection-line-borders"},i("path",{class:"selection-line-border",d:this.core.anchorManager.computeClippedLinePath(e,!0),style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${e.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"round",fill:"none"}})),!this.isSelecting&&!c&&i("g",{class:"selection-line-handles",style:{pointerEvents:"auto"}},i("circle",{class:"selection-line-handle start",cx:e.startX-e.x,cy:e.startY-e.y,r:""+(n-1)*e.scale/this.core.store.state?.scale,style:{fill:g?u:"var(--kritzel-selection-handle-color, #000000)",stroke:u,strokeWidth:`calc(2px * ${e.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("circle",{class:"selection-line-handle-overlay start","data-testid":"line-handle-start",cx:e.startX-e.x,cy:e.startY-e.y,r:""+s*e.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("circle",{class:"selection-line-handle center",cx:void 0!==e.controlX?(e.startX+2*e.controlX+e.endX)/4-e.x:(e.startX-e.x+e.endX-e.x)/2,cy:void 0!==e.controlY?(e.startY+2*e.controlY+e.endY)/4-e.y:(e.startY-e.y+e.endY-e.y)/2,r:""+(n-1)*e.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #000000)",stroke:u,strokeWidth:`calc(2px * ${e.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("circle",{class:"selection-line-handle-overlay center","data-testid":"line-handle-center",cx:void 0!==e.controlX?(e.startX+2*e.controlX+e.endX)/4-e.x:(e.startX-e.x+e.endX-e.x)/2,cy:void 0!==e.controlY?(e.startY+2*e.controlY+e.endY)/4-e.y:(e.startY-e.y+e.endY-e.y)/2,r:""+s*e.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),i("circle",{class:"selection-line-handle end",cx:e.endX-e.x,cy:e.endY-e.y,r:""+(n-1)*e.scale/this.core.store.state?.scale,style:{fill:v?u:"var(--kritzel-selection-handle-color, #000000)",stroke:u,strokeWidth:`calc(2px * ${e.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),i("circle",{class:"selection-line-handle-overlay end","data-testid":"line-handle-end",cx:e.endX-e.x,cy:e.endY-e.y,r:""+s*e.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}))))})())})),(()=>{const t=this.core.anchorManager.getSnapIndicatorRenderData()??this.core.anchorManager.getSnapPreviewRenderData();if(!t)return null;const e=null!=this.core.anchorManager.getSnapIndicatorRenderData();return i("svg",{xmlns:"http://www.w3.org/2000/svg",class:"snap-indicator",style:{position:"absolute",left:"0",top:"0",width:"1px",height:"1px",pointerEvents:"none",zIndex:"9999",overflow:"visible"}},i("g",null,t.snapLinePath?i("path",{d:t.snapLinePath,fill:"none",style:{stroke:e?"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))":"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.12))",strokeWidth:t.lineStrokeWidth,strokeDasharray:t.dashArray,strokeLinecap:"round"}}):void 0!==t.edgeX&&void 0!==t.edgeY&&i("line",{x1:t.edgeX,y1:t.edgeY,x2:t.centerX,y2:t.centerY,style:{stroke:e?"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))":"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.12))",strokeWidth:t.lineStrokeWidth,strokeDasharray:t.dashArray,strokeLinecap:"round"}}),i("circle",{cx:t.centerX,cy:t.centerY,r:t.indicatorRadius,style:{fill:e?"var(--kritzel-snap-indicator-fill, rgba(59, 130, 246, 0.3))":"rgba(59, 130, 246, 0.18)",stroke:e?"var(--kritzel-snap-indicator-stroke, #007bff)":"rgba(59, 130, 246, 0.5)",strokeWidth:t.indicatorStrokeWidth}})))})(),(()=>{const t=this.core.anchorManager.getAnchorLinesRenderData();return t?i("svg",{xmlns:"http://www.w3.org/2000/svg",class:"anchor-lines",style:{position:"absolute",left:"0",top:"0",width:"1px",height:"1px",pointerEvents:"none",zIndex:"9998",overflow:"visible"}},t.startAnchorViz&&i("g",{class:"anchor-line-start"},t.startAnchorViz.pathD?i("path",{d:t.startAnchorViz.pathD,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.3))",strokeWidth:`${t.lineStrokeWidth}`,strokeDasharray:t.dashArray,strokeLinecap:"round",fill:"none"}}):i("line",{x1:t.startAnchorViz.edgeX,y1:t.startAnchorViz.edgeY,x2:t.startAnchorViz.centerX,y2:t.startAnchorViz.centerY,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.3))",strokeWidth:`${t.lineStrokeWidth}`,strokeDasharray:t.dashArray,strokeLinecap:"round"}}),i("circle",{cx:t.startAnchorViz.centerX,cy:t.startAnchorViz.centerY,r:t.indicatorRadius,style:{fill:"var(--kritzel-snap-indicator-fill, rgba(59, 130, 246, 0.3))",stroke:"var(--kritzel-snap-indicator-stroke, #007bff)",strokeWidth:t.indicatorStrokeWidth}})),t.endAnchorViz&&i("g",{class:"anchor-line-end"},t.endAnchorViz.pathD?i("path",{d:t.endAnchorViz.pathD,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))",strokeWidth:`${t.lineStrokeWidth}`,strokeDasharray:t.dashArray,strokeLinecap:"round",fill:"none"}}):i("line",{x1:t.endAnchorViz.edgeX,y1:t.endAnchorViz.edgeY,x2:t.endAnchorViz.centerX,y2:t.endAnchorViz.centerY,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))",strokeWidth:`${t.lineStrokeWidth}`,strokeDasharray:t.dashArray,strokeLinecap:"round"}}),i("circle",{cx:t.endAnchorViz.centerX,cy:t.endAnchorViz.centerY,r:t.indicatorRadius,style:{fill:"var(--kritzel-snap-indicator-fill, rgba(59, 130, 246, 0.3))",stroke:"var(--kritzel-snap-indicator-stroke, #007bff)",strokeWidth:t.indicatorStrokeWidth}}))):null})()),this.core.store.state.isContextMenuVisible&&i("kritzel-context-menu",{class:"context-menu",ref:t=>this.contextMenuElement=t??null,items:this.core.store.state.contextMenuItems,objects:this.core.store.selectionGroup?.objects||[],style:{position:"absolute",left:`${this.core.store.state.contextMenuX}px`,top:`${this.core.store.state.contextMenuY}px`,zIndex:"10002"},onActionSelected:t=>{t.detail.action&&t.detail.action({x:this.core.store.state.contextMenuWorldX,y:this.core.store.state.contextMenuWorldY},this.core.store.selectionGroup?.objects||[]),this.hideContextMenu()},onClose:()=>this.hideContextMenu()}),this.core.store.objects?.hasAwareness&&i("kritzel-awareness-cursors",{core:this.core}),this.core.store.state?.activeTool instanceof tt&&!this.core.store.state.isScaling&&i("kritzel-cursor-trail",{core:this.core}),!this.core.licenseManager.isLicensed&&i("kritzel-watermark",{core:this.core,label:this.core.localizationManager.translate("watermark.poweredBy")}))}static get watchers(){return{workspace:[{onWorkspaceChange:0}],activeWorkspaceId:[{onActiveWorkspaceIdChange:0}],syncConfig:[{onSyncConfigChange:0}],assetStorageConfig:[{onAssetStorageConfigChange:0}],user:[{onUserChange:0}],globalContextMenuItems:[{onGlobalContextMenuItemsChange:0}],objectContextMenuItems:[{onObjectContextMenuItemsChange:0}],scaleMax:[{validateScaleMax:0}],scaleMin:[{validateScaleMin:0}],cursorTarget:[{onCursorTargetChange:0}],lockDrawingScale:[{onLockDrawingScaleChange:0}],isObjectDistanceFadingActive:[{onIsObjectDistanceFadingActiveChange:0}],theme:[{onThemeChange:0}],licenseKey:[{onLicenseKeyChange:0}],themes:[{onThemesChange:0}],locale:[{onLocaleChange:0}],locales:[{onLocalesChange:0}],fallbackLocale:[{onFallbackLocaleChange:0}],viewportBoundaryLeft:[{onViewportBoundaryLeftChange:0}],viewportBoundaryRight:[{onViewportBoundaryRightChange:0}],viewportBoundaryTop:[{onViewportBoundaryTopChange:0}],viewportBoundaryBottom:[{onViewportBoundaryBottomChange:0}],debugInfo:[{onDebugInfoChange:0}],isLoading:[{onIsLoadingChange:0}]}}static get style(){return":host{display:block;position:relative;height:100%;width:100%;overflow:hidden;background-color:var(--kritzel-engine-background-color, #ffffff)}:host,:host *{touch-action:none;user-select:none}.ProseMirror{outline:none}p,h1,h2,h3,h4,h5,h6,blockquote,pre{margin:0;padding:0}.workspace-loading-overlay{position:absolute;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;gap:10px;background-color:var(--kritzel-engine-loading-overlay-background, rgba(255, 255, 255, 0.6));color:var(--kritzel-engine-loading-overlay-color, #333);font-family:var(--kritzel-font-family, sans-serif);font-size:1.25rem;pointer-events:all;animation:workspace-loading-fade-in 200ms ease-out var(--kritzel-engine-loading-overlay-delay, 300ms) forwards;opacity:0}.workspace-loading-spinner{width:20px;height:20px;box-sizing:border-box;display:block;flex-shrink:0;border:2px solid var(--kritzel-engine-loading-overlay-spinner-color, #cccccc);border-top-color:var(--kritzel-engine-loading-overlay-spinner-active-color, #333333);border-radius:50%;animation:workspace-loading-spin 0.6s linear infinite}@keyframes workspace-loading-spin{to{transform:rotate(360deg)}}@keyframes workspace-loading-fade-in{to{opacity:1}}.debug-panel{position:absolute;pointer-events:none;top:0;right:0}.origin{position:relative;top:0;left:0;height:0;width:0;pointer-events:none;-webkit-transform-origin:top left;-moz-transform-origin:top left;transform-origin:top left;overflow:visible}.object{overflow:visible}.PlaygroundEditorTheme__quote{margin:0;margin-left:20px;margin-bottom:10px;font-size:15px;color:rgb(101, 103, 107);border-left-color:rgb(206, 208, 212);border-left-width:4px;border-left-style:solid;padding-left:16px}"}},[513,"kritzel-engine",{workspace:[16],editorId:[1,"editor-id"],activeWorkspaceId:[1,"active-workspace-id"],syncConfig:[16],assetStorageConfig:[16],user:[16],globalContextMenuItems:[16],objectContextMenuItems:[16],scaleMax:[1026,"scale-max"],scaleMin:[1026,"scale-min"],cursorTarget:[16],lockDrawingScale:[4,"lock-drawing-scale"],isObjectDistanceFadingActive:[4,"is-object-distance-fading-active"],theme:[1],licenseKey:[1,"license-key"],themes:[16],locale:[1],locales:[16],fallbackLocale:[1,"fallback-locale"],viewportBoundaryLeft:[2,"viewport-boundary-left"],viewportBoundaryRight:[2,"viewport-boundary-right"],viewportBoundaryTop:[2,"viewport-boundary-top"],viewportBoundaryBottom:[2,"viewport-boundary-bottom"],debugInfo:[16],isPanningEnabled:[4,"is-panning-enabled"],isZoomingEnabled:[4,"is-zooming-enabled"],isLoading:[4,"is-loading"],forceUpdate:[32],triggerSelectionChange:[64],registerTool:[64],changeActiveTool:[64],changeActiveToolByName:[64],disable:[64],enable:[64],delete:[64],copy:[64],cut:[64],paste:[64],bringForward:[64],sendBackward:[64],bringToFront:[64],sendToBack:[64],alignObjects:[64],group:[64],ungroup:[64],undo:[64],redo:[64],hideContextMenu:[64],openContextMenu:[64],getObjectById:[64],getAllObjects:[64],findObjects:[64],getObjectsTotalCount:[64],addObject:[64],addObjects:[64],updateObject:[64],removeObject:[64],removeObjects:[64],getSelectedObjects:[64],getDisplayableShortcuts:[64],selectObjects:[64],selectAllObjectsInViewport:[64],clearSelection:[64],centerObjectInViewport:[64],panToObject:[64],backToContent:[64],centerAllObjects:[64],centerObjects:[64],setViewport:[64],panTo:[64],zoomTo:[64],zoomIn:[64],zoomOut:[64],getViewport:[64],screenToWorld:[64],worldToScreen:[64],getObjectsInViewport:[64],getScreenshot:[64],exportViewportAsPng:[64],exportViewportAsSvg:[64],getSelectedObjectsAsSvgString:[64],exportSelectedObjectsAsSvg:[64],getSelectedObjectsAsPngDataUrl:[64],exportSelectedObjectsAsPng:[64],exportAsJson:[64],importFromJson:[64],loadObjectsFromJson:[64],downloadAsJson:[64],importFromFile:[64],createWorkspace:[64],updateWorkspace:[64],deleteWorkspace:[64],getWorkspaces:[64],getActiveWorkspace:[64],getIsPublic:[64],loadSharedWorkspace:[64],reinitSync:[64],saveSettings:[64],loadSettings:[64],registerLocales:[64],setLocale:[64],getLocale:[64],getAvailableLocales:[64],getAvailableLocaleOptions:[64],t:[64],getResolvedTerms:[64]},[[1,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[1,"pointerleave","handlePointerLeave"],[1,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[8,"copy","handleCopy"],[8,"cut","handleCut"],[8,"paste","handlePaste"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{workspace:[{onWorkspaceChange:0}],activeWorkspaceId:[{onActiveWorkspaceIdChange:0}],syncConfig:[{onSyncConfigChange:0}],assetStorageConfig:[{onAssetStorageConfigChange:0}],user:[{onUserChange:0}],globalContextMenuItems:[{onGlobalContextMenuItemsChange:0}],objectContextMenuItems:[{onObjectContextMenuItemsChange:0}],scaleMax:[{validateScaleMax:0}],scaleMin:[{validateScaleMin:0}],cursorTarget:[{onCursorTargetChange:0}],lockDrawingScale:[{onLockDrawingScaleChange:0}],isObjectDistanceFadingActive:[{onIsObjectDistanceFadingActiveChange:0}],theme:[{onThemeChange:0}],licenseKey:[{onLicenseKeyChange:0}],themes:[{onThemesChange:0}],locale:[{onLocaleChange:0}],locales:[{onLocalesChange:0}],fallbackLocale:[{onFallbackLocaleChange:0}],viewportBoundaryLeft:[{onViewportBoundaryLeftChange:0}],viewportBoundaryRight:[{onViewportBoundaryRightChange:0}],viewportBoundaryTop:[{onViewportBoundaryTopChange:0}],viewportBoundaryBottom:[{onViewportBoundaryBottomChange:0}],debugInfo:[{onDebugInfoChange:0}],isLoading:[{onIsLoadingChange:0}]}]);function nn(){"undefined"!=typeof customElements&&["kritzel-engine","kritzel-awareness-cursors","kritzel-context-menu","kritzel-cursor-trail","kritzel-icon","kritzel-watermark"].forEach((t=>{switch(t){case"kritzel-engine":customElements.get(s(t))||customElements.define(s(t),en);break;case"kritzel-awareness-cursors":customElements.get(s(t))||G();break;case"kritzel-context-menu":customElements.get(s(t))||D();break;case"kritzel-cursor-trail":customElements.get(s(t))||H();break;case"kritzel-icon":customElements.get(s(t))||V();break;case"kritzel-watermark":customElements.get(s(t))||C()}}))}export{Xt as A,Wt as D,Rt as E,Ut as F,Z as K,Yt as W,q as a,J as b,tt as c,Lt as d,Ot as e,Pt as f,Bt as g,Vt as h,Nt as i,Q as j,Gt as k,Qt as l,nn as m,en as n,Ht as r}
|