kritzel-stencil 0.2.5 → 0.2.6

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.
@@ -6,4 +6,4 @@ import{p as t,H as n,c as e,h as r,d as i,t as o}from"./p-BWj1eE2b.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 Ft{_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,n){this._core=t,this._core.store.state.host=n,this._core.store.state.viewportWidth=n.clientWidth,this._core.store.state.viewportHeight=n.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=Dt.debounce((()=>{this._core.updateWorkspaceViewport(this._core.store.state.translateX,this._core.store.state.translateY,this._core.store.state.scale)}),300),this._debounceEndScaling=Dt.debounce((()=>{this._core.store.state.isScaling=!1,this._core.rerender()}),100)}cancelPendingUpdates(){this._debounceUpdate.cancel()}clampTranslate(t,n){const e=this._core.store.state,{scale:r,viewportWidth:i,viewportHeight:o}=e,{viewportBoundaryLeft:s,viewportBoundaryRight:a,viewportBoundaryTop:c,viewportBoundaryBottom:u}=e,h=-s*r,l=i-a*r,f=-c*r,d=o-u*r;let p=t,v=n;return Number.isFinite(l)&&Number.isFinite(h)?p=Math.max(l,Math.min(h,t)):Number.isFinite(l)?p=Math.max(l,t):Number.isFinite(h)&&(p=Math.min(h,t)),Number.isFinite(d)&&Number.isFinite(f)?v=Math.max(d,Math.min(f,n)):Number.isFinite(d)?v=Math.max(d,n):Number.isFinite(f)&&(v=Math.min(f,n)),{translateX:p,translateY:v}}getEffectiveMinScale(){const t=this._core.store.state,{viewportWidth:n,viewportHeight:e,scaleMin:r}=t,{viewportBoundaryLeft:i,viewportBoundaryRight:o,viewportBoundaryTop:s,viewportBoundaryBottom:a}=t,c=o-i,u=a-s;if(!Number.isFinite(c)||!Number.isFinite(u))return r;const h=Math.max(c>0?n/c:r,u>0?e/u:r);return Math.max(r,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 n=t.clientX-this._core.store.offsetX,e=t.clientY-this._core.store.offsetY;t.button===s.Right&&(this._core.store.state.isPanning=!0,this._core.store.state.startX=n,this._core.store.state.startY=e)}if("touch"===t.pointerType||"pen"===t.pointerType){const n=Array.from(this._core.store.state.pointers.values());if(1===n.length&&(this._touchStartScreenX=t.clientX,this._touchStartScreenY=t.clientY,this._touchCursorBroadcastActive=!1),2===n.length){this._core.store.objects?.clearCursorPosition();const t=this._core.store.currentPath;t&&this._core.store.objects.remove((n=>n.id===t.id)),this._core.store.state.isSelecting&&(this._core.store.state.isSelecting=!1,this._core.store.objects.remove((t=>t instanceof f)),this._core.store.setSelectionBox(null),this._core.store.selectedObjects.forEach((t=>{t.isSelected=!1}))),this._core.store.state.isScaling=!0;const e=n[0].clientX-this._core.store.offsetX,r=n[0].clientY-this._core.store.offsetY,i=n[1].clientX-this._core.store.offsetX,o=n[1].clientY-this._core.store.offsetY;this.initialTouchDistance=Math.sqrt(Math.pow(e-i,2)+Math.pow(r-o,2)),this.startX=(e+i)/2,this.startY=(r+o)/2,this._core.rerender()}}}handlePointerMove(t){if("mouse"===t.pointerType){const n=this._core.store.host.getBoundingClientRect(),e=t.clientX-n.left,r=t.clientY-n.top;if(this._core.store.state.pointerX=(e-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(r-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+(e-this._core.store.state.startX),this._core.store.state.translateY+(r-this._core.store.state.startY));this._core.store.state.translateX=t.translateX,this._core.store.state.translateY=t.translateY,this._core.store.state.startX=e,this._core.store.state.startY=r,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 n=this._core.store.host.getBoundingClientRect(),e=t.clientX-n.left,r=t.clientY-n.top,i=Array.from(this._core.store.state.pointers.values());if(this._core.store.state.isScaling||i.length>1)this._core.store.objects?.clearCursorPosition();else{if(this._core.store.state.pointerX=(e-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(r-this._core.store.state.translateY)/this._core.store.state.scale,!this._touchCursorBroadcastActive){const n=t.clientX-this._touchStartScreenX,e=t.clientY-this._touchStartScreenY;Math.sqrt(n*n+e*e)>=Ft.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===i.length){const t=i[0].clientX-this._core.store.offsetX,n=i[0].clientY-this._core.store.offsetY,e=i[1].clientX-this._core.store.offsetX,r=i[1].clientY-this._core.store.offsetY,o=Math.sqrt(Math.pow(t-e,2)+Math.pow(n-r,2)),s=(t+e)/2,a=(n+r)/2,c=o/this.initialTouchDistance,u=this._core.store.state.scale*c,h=this.getEffectiveMinScale();if(u>this._core.store.state.scaleMax||u<h){const t=this.clampTranslate(this._core.store.state.translateX+s-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+s-this.startX-(s-this._core.store.state.translateX)*(c-1),n=this._core.store.state.translateY+a-this.startY-(a-this._core.store.state.translateY)*(c-1);this._core.store.state.scale=u;const e=this.clampTranslate(t,n);this._core.store.state.translateX=e.translateX,this._core.store.state.translateY=e.translateY,this.initialTouchDistance=o}this.startX=s,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,n){const e=this._core.store.state;return{x:(t-e.translateX)/e.scale,y:(n-e.translateY)/e.scale}}worldToScreen(t,n){const e=this._core.store.state;return{x:t*e.scale+e.translateX,y:n*e.scale+e.translateY}}setViewport(t,n,e){const r=this._core.store.state,i=Math.min(r.scaleMax,Math.max(this.getEffectiveMinScale(),e));this.animateViewportTo(r.viewportWidth/2-t*i,r.viewportHeight/2-n*i,i)}panTo(t,n){this.setViewport(t,n,this._core.store.state.scale)}zoomTo(t,n,e){const r=this._core.store.state;void 0!==n&&void 0!==e?this.setViewport(n,e,t):this.setViewport((r.viewportWidth/2-r.translateX)/r.scale,(r.viewportHeight/2-r.translateY)/r.scale,t)}centerInViewport(t){const{scale:n,viewportWidth:e,viewportHeight:r}=this._core.store.state,{x:i,y:o,width:s,height:a}=t.rotatedBoundingBox,c=this.clampTranslate(e/2-(i+s/2)*n,r/2-(o+a/2)*n);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 n=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),e=Math.max(n,this.getEffectiveMinScale());this._core.store.state.scale=e,this.centerInViewport(t)}handleZoom(t){this._core.store.state.isScaling=!0;const n=this._core.store.host.getBoundingClientRect(),e=t.clientX-n.left,r=t.clientY-n.top;this._core.store.state.pointerX=(e-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(r-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 i=Math.max(.8,Math.min(1.2,1+-.012*t.deltaY)),o=this.getEffectiveMinScale(),s=Math.min(this._core.store.state.scaleMax,Math.max(o,this._core.store.state.scale*i)),a=s/this._core.store.state.scale,c=(e-this._core.store.state.translateX)*(a-1),u=(r-this._core.store.state.translateY)*(a-1);this._core.store.state.scale=s;let h=this._core.store.state.translateX-c;0!==t.deltaX&&(h-=.8*t.deltaX);const l=this.clampTranslate(h,this._core.store.state.translateY-u);this._core.store.state.translateX=l.translateX,this._core.store.state.translateY=l.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate(),this._debounceEndScaling()}handlePan(t){const n=this.clampTranslate(this._core.store.state.translateX-.8*t.deltaX,this._core.store.state.translateY-.8*t.deltaY);this._core.store.state.translateX=n.translateX,this._core.store.state.translateY=n.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate()}cancelViewportAnimation(){null!==this._animationFrameId&&(cancelAnimationFrame(this._animationFrameId),this._animationFrameId=null)}animateViewportTo(t,n,e,r=150){this.cancelViewportAnimation();const i=this._core.store.state.translateX,o=this._core.store.state.translateY,s=this._core.store.state.scale,a=performance.now();this._core.store.state.isScaling=!0;const c=u=>{const h=Math.min((u-a)/r,1),l=1-Math.pow(1-h,3);this._core.store.state.scale=s+(e-s)*l;const f=this.clampTranslate(i+(t-i)*l,o+(n-o)*l);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 n=this._core.store.allNonSelectionObjects;if(0===n.length)return!1;const e=-this._core.store.state.translateX/this._core.store.state.scale+this._core.store.state.viewportWidth/2/this._core.store.state.scale,r=-this._core.store.state.translateY/this._core.store.state.scale+this._core.store.state.viewportHeight/2/this._core.store.state.scale,i=n.map((t=>{const n=t.rotatedBoundingBox,i=n.y+n.height/2;return{obj:t,distance:Math.sqrt(Math.pow(n.x+n.width/2-e,2)+Math.pow(i-r,2))}}));i.sort(((t,n)=>t.distance-n.distance));const o=i.slice(0,t).map((t=>t.obj));let s=1/0,a=1/0,c=-1/0,u=-1/0;for(const t of o){const n=t.rotatedBoundingBox;s=Math.min(s,n.x),a=Math.min(a,n.y),c=Math.max(c,n.x+n.width),u=Math.max(u,n.y+n.height)}const h=c-s,l=u-a,f=s+h/2,d=a+l/2,p=Math.min(this._core.store.state.viewportWidth/(1.1*h),this._core.store.state.viewportHeight/(1.1*l),this._core.store.state.scaleMax),v=Math.max(p,this.getEffectiveMinScale());return this.animateViewportTo(this._core.store.state.viewportWidth/2-f*v,this._core.store.state.viewportHeight/2-d*v,v),!0}centerFitAllObjects(t=!0){const n=this._core.store.allNonSelectionObjects;if(0===n.length)return!1;let e=1/0,r=1/0,i=-1/0,o=-1/0;for(const t of n){const n=t.rotatedBoundingBox;e=Math.min(e,n.x),r=Math.min(r,n.y),i=Math.max(i,n.x+n.width),o=Math.max(o,n.y+n.height)}const s=i-e,a=o-r,c=e+s/2,u=r+a/2,h=Math.min(this._core.store.state.viewportWidth/(1.1*s),this._core.store.state.viewportHeight/(1.1*a),this._core.store.state.scaleMax),l=Math.max(h,this.getEffectiveMinScale());return this.animateViewportTo(this._core.store.state.viewportWidth/2-c*l,this._core.store.state.viewportHeight/2-u*l,l,t?150:0),!0}}class Kt extends p{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:"c",ctrl:!0,label:"Copy",category:"Clipboard",condition:t=>!!t.store.selectionGroup,action:t=>{t.copy(),t.rerender()}},{key:"x",ctrl:!0,label:"Cut",category:"Clipboard",condition:t=>!!t.store.selectionGroup,action:t=>t.cut()},{key:"v",ctrl:!0,label:"Paste",category:"Clipboard",condition:t=>!!t.store.state.copiedObjects&&!t.store.activeText&&!t.store.activeShape,action:t=>t.paste()},{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 n=h.getToolByIndex(t);n&&(this._core.store.setState("activeTool",n),this._core.deselectAllObjects(),n.onActivate())}handleKeyDown(t){if(this._core.store.state.isCtrlKeyPressed=t.ctrlKey,(this._core.store.activeText||this._core.store.activeShape)&&"Escape"!==t.key)return;const n=this.shortcuts.find((n=>n.key===t.key&&!!n.ctrl===t.ctrlKey&&!!n.shift===t.shiftKey&&(!n.condition||n.condition(this._core))));n&&(t.preventDefault(),n.action(this._core))}handleKeyUp(t){this._core.store.state.isCtrlKeyPressed=t.ctrlKey}getDisplayableShortcuts(){return this.shortcuts.map((({key:t,ctrl:n,shift:e,label:r,category:i})=>({key:t,ctrl:n,shift:e,label:r,category:i})))}}class Vt extends p{globalContextMenuItems=[];objectContextMenuItems=[];constructor(t,n,e){super(t),this.globalContextMenuItems=n,this.objectContextMenuItems=e}handleContextMenu(t){if(!(this._core.store.state.activeTool instanceof v))return;if(this._core.store.state.skipContextMenu)return void(this._core.store.state.skipContextMenu=!1);const n=this._core.store.state.activeTool;n?.moveHandler?.cancelPendingDrag(),this._core.store.selectionBox&&(this._core.store.objects.remove((t=>t instanceof f)),this._core.store.setSelectionBox(null),this._core.store.state.isSelecting=!1);const e=this._core.getObjectFromPointerEvent(t,".object");if(e&&!(e instanceof d)&&!(e instanceof f)){const t=d.create(this._core);t.addOrRemove(e),t.isSelected=!0,t.rotation=e.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._core.store.selectionGroup?this.objectContextMenuItems:this.globalContextMenuItems;let r=t.clientX-this._core.store.offsetX,i=t.clientY-this._core.store.offsetY;const o=10;r+150>window.innerWidth-o&&(r=window.innerWidth-150-o),i+200>window.innerHeight-o&&(i=window.innerHeight-200-o),r=Math.max(o,r),i=Math.max(o,i),this._core.store.state.contextMenuX=r,this._core.store.state.contextMenuY=i,this._core.store.state.isContextMenuVisible=!0,this._core.store.state.isEnabled=!1,this._core.rerender()}}class Nt extends z{__class__="KritzelCustomElement";element;isInteractive=!0;constructor(t){super(),t&&(this.translateX=t.translateX||0,this.translateY=t.translateY||0,this.scale=t.scale||1,this.element=t.element,this.height=t.height||0,this.width=t.width||0)}static create(t,n){const e=new Nt(n);return e._core=t,e.id=e.generateId(),e.workspaceId=t.store.state.activeWorkspace.id,e.userId=t.user?.id,e}mount(t){null!==t&&(this.isMounted&&this.elementRef===t&&this.element.parentElement===t||(this.elementRef=t,this.isMounted=!0,this.elementRef.innerHTML="",this.elementRef.appendChild(this.element)))}resize(t,n,e,r){e<=1||r<=1||(this.width=e,this.height=r,this.translateX=t,this.translateY=n,this.element&&(this.element.style.width=`${e}px`,this.element.style.height=`${r}px`),this._core.store.objects.update(this))}copy(){const t=Object.create(Object.getPrototypeOf(this));return Object.assign(t,this),t.id=this.generateId(),t.isMounted=!1,t.element=this.element.cloneNode(!0),t}}class Ht{_core;constructor(t){this._core=t}revive(t){if(t&&"object"==typeof t){if(t.__class__){let n;switch(t.__class__){case"KritzelPath":n=I.create(this._core).deserialize(t);break;case"KritzelLine":n=j.create(this._core).deserialize(t);break;case"KritzelText":n=A.create(this._core,t.fontSize,t.fontFamily).deserialize(t);break;case"KritzelShape":n=k.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":n=u.create(this._core).deserialize(t);break;case"KritzelCustomElement":n=Nt.create(this._core).deserialize(t);break;case"KritzelSelectionGroup":n=d.create(this._core).deserialize(t);break;case"KritzelGroup":n=b.create(this._core).deserialize(t);break;case"KritzelWorkspace":n=S.create(this._core,t).deserialize(t);break;case"KritzelBrushTool":n=new m(this._core);break;case"KritzelEraserTool":n=new H(this._core);break;case"KritzelImageTool":n=new Mt(this._core);break;case"KritzelSelectionTool":n=new v(this._core);break;case"KritzelTextTool":n=new y(this._core);break;case"KritzelLineTool":n=new w(this._core);break;case"KritzelShapeTool":n=new g(this._core);break;default:n=t}return n}const n=Array.isArray(t)?[]:{};for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[e]=this.revive(t[e]));return n}return t}}const Xt={activeWorkspace:void 0,activeTool:null,copiedObjects:null,objects:null,snapCandidate: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,skipContextMenu:!1,debugInfo:{showObjectInfo:!1,showViewportInfo:!1,showSyncProviderInfo:!0,showMigrationInfo:!0},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 Gt{static calculateSelectionBounds(t){const n=t.map((t=>t.rotatedBoundingBox));return{minX:Math.min(...n.map((t=>t.x))),minY:Math.min(...n.map((t=>t.y))),maxX:Math.max(...n.map((t=>t.x+t.width))),maxY:Math.max(...n.map((t=>t.y+t.height)))}}static calculateAlignedPositions(t,n){const e=new Map;if(t.length<2)return e;const r=this.calculateSelectionBounds(t);for(const i of t){const t=i.rotatedBoundingBox;let o=i.translateX,s=i.translateY;const a=t.x-i.translateX,c=t.y-i.translateY;switch(n){case It.StartHorizontal:o=r.minX-a;break;case It.CenterHorizontal:o=i.translateX+((r.minX+r.maxX)/2-(t.x+t.width/2));break;case It.EndHorizontal:o=i.translateX+(r.maxX-(t.x+t.width));break;case It.StartVertical:s=r.minY-c;break;case It.CenterVertical:s=i.translateY+((r.minY+r.maxY)/2-(t.y+t.height/2));break;case It.EndVertical:s=i.translateY+(r.maxY-(t.y+t.height))}e.set(i.id,{translateX:o,translateY:s})}return e}}class Yt{bounds;capacity;objects=[];children=null;_size=0;get size(){return this._size}constructor(t,n=16){this.bounds=t,this.capacity=n}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 n of this.children)if(n.insert(t))return this._size++,!0;return!1}update(t){const n=this.objects.findIndex((n=>n.id===t.id));if(-1!==n)return this.objects[n]=t,!0;if(null!==this.children)for(const n of this.children)if(n.update(t))return!0;return!1}remove(t){let n=0;const e=this.objects.findIndex((n=>t(n)));if(-1!==e&&(this.objects.splice(e,1),n++),null!==this.children)for(const e of this.children)n+=e.remove(t);return this._size-=n,n}query(t){const n=[];return this._queryInto(t,n),n}_queryInto(t,n){if(this.intersects(t,this.bounds)){for(const e of this.objects)this.intersects(e.rotatedBoundingBox,t)&&n.push(e);if(null!==this.children)for(const e of this.children)e._queryInto(t,n)}}filter(t){const n=[];return this._filterInto(t,n),n}_filterInto(t,n){for(const e of this.objects)t(e)&&n.push(e);if(null!==this.children)for(const e of this.children)e._filterInto(t,n)}allObjects(){const t=[];return this._collectAllInto(t),t}_collectAllInto(t){for(const n of this.objects)t.push(n);if(null!==this.children)for(const n of this.children)n._collectAllInto(t)}subdivide(){const{x:t,y:n,z:e,width:r,height:i}=this.bounds,o=r/2,s=i/2;this.children=[new Yt({x:t,y:n,z:e,width:o,height:s},this.capacity),new Yt({x:t+o,y:n,z:e,width:o,height:s},this.capacity),new Yt({x:t,y:n+s,z:e,width:o,height:s},this.capacity),new Yt({x:t+o,y:n+s,z:e,width:o,height:s},this.capacity)]}intersects(t,n){return!(t.x>=n.x+n.width||t.x+t.width<=n.x||t.y>=n.y+n.height||t.y+t.height<=n.y)}}class Qt{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 n=t.displayName||t.firstName||"Anonymous";this._awareness.setLocalStateField("user",{id:t.id,displayName:n,color:t.color||this.generateColorFromName(n)})}generateColorFromName(t){let n=0;for(let e=0;e<t.length;e++)n=t.charCodeAt(e)+((n<<5)-n);return`hsl(${Math.abs(n%360)}, 45%, 55%)`}updateCursorPosition(t,n){this._awareness&&this._awareness.setLocalStateField("cursor",{x:t,y:n})}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(),n=new Set;t.forEach((t=>{const e=t.user?.id;e&&n.add(e)}));const e=this._core?.user?.id,r=this.quadtree.filter((t=>t instanceof d&&null!=t.userId&&t.userId!==e&&!n.has(t.userId)));for(const t of r)this.quadtree.remove((n=>n.id===t.id)),this._idMap.delete(t.id),this._objectsMap&&this._ydoc.transact((()=>{this._objectsMap.delete(t.id)}),"local");r.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 Yt({x:-1/0,y:-1/0,z:0,width:1/0,height:1/0},8)}async initialize(t,n,e){this._core=t,this._workspaceId=n,this._reviver=new Ht(t),this._ydoc=new O.Doc,this._objectsMap=this._ydoc.getMap("objects"),this._metadataMap=this._ydoc.getMap("metadata");const r=t.editorId?`kritzel-workspace-${t.editorId}-${n}`:`kritzel-workspace-${n}`,i=e??Bt,o=!t.store?.state?.debugInfo?.showSyncProviderInfo;for(const t of i.providers){let n;n="function"==typeof t?new t(r,this._ydoc,{quiet:o}):t.create(r,this._ydoc,{quiet:o}),this._providers.push(n)}this._undoManager=new O.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 s=this._providers.filter((t=>"local"===t.type)),a=this._providers.filter((t=>"network"===t.type));(await Promise.allSettled(s.map((t=>t.connect())))).forEach(((t,n)=>{"rejected"===t.status&&console.error(`[Kritzel] Sync provider "${s[n]?.constructor.name}" failed to connect:`,t.reason)}));for(const t of a)t.connect().catch((n=>{console.error(`[Kritzel] Network sync provider "${t.constructor.name}" failed to connect:`,n)}));this._isReady=!0;for(const t of a)if(t.awareness){this._awareness=t.awareness;break}this._awareness&&(this._awarenessChangeHandler=t=>{t.removed.length>0&&this.removeOrphanedSelectionGroups();const n=Date.now(),e=n-this._lastAwarenessEmitTime;if(null!==this._awarenessEmitTimeout&&(clearTimeout(this._awarenessEmitTimeout),this._awarenessEmitTimeout=null),e>=this.AWARENESS_THROTTLE_INTERVAL){this._lastAwarenessEmitTime=n;const t=this._awareness.getStates();for(const n of this._awarenessChangeCallbacks)n(t)}else this._awarenessEmitTimeout=setTimeout((()=>{this._lastAwarenessEmitTime=Date.now(),this._awarenessEmitTimeout=null;const t=this._awareness.getStates();for(const n of this._awarenessChangeCallbacks)n(t)}),this.AWARENESS_THROTTLE_INTERVAL-e)},this._awareness.on("change",this._awarenessChangeHandler)),this.initializeMetadata("workspace",n,t.store?.state?.activeWorkspace?.name??""),Tt(this._ydoc,this._metadataMap,{objects:this._objectsMap},_t,B,{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 n=Array.from(t.keysChanged),e=[],r=[],i=[];n.forEach((n=>{const o=t.changes.keys.get(n);if(o&&"delete"===o.action)i.push(n);else{const t=this._objectsMap?.get(n);if(t){const n=this._reviver?.revive(t);n instanceof d?r.push(n):e.push(n)}}})),i.forEach((t=>{this.quadtree.remove((n=>n.id===t)),this._idMap.delete(t)}));const o=[],s=[];e.forEach((t=>{if(this._idMap.has(t.id)){const n=this._idMap.get(t.id);n&&"function"==typeof t.adoptTransientStateFrom&&t.adoptTransientStateFrom(n),this.quadtree.update(t),this._idMap.set(t.id,t),s.push(t)}else this.quadtree.insert(t),this._idMap.set(t.id,t),o.push(t)}));const a=new Set;if(r.forEach((t=>{if(this._idMap.has(t.id)){const n=this._idMap.get(t.id);n&&"function"==typeof t.adoptTransientStateFrom&&t.adoptTransientStateFrom(n),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)})),e.length>0||i.length>0){const t=new Set([...e.map((t=>t.id)),...i]),n=this.quadtree.filter((t=>t instanceof d&&!a.has(t.id)));for(const e of n)e.objectIds.some((n=>t.has(n)))&&(e.invalidateObjectsCache(),e.refreshObjectDimensions(void 0,!0),e.captureUnchangedSnapshots(),this.quadtree.update(e))}if(this._core?.store.invalidateSelectionCache(),this._core?.rerender(),o.length>0&&this._core?.engine.emitObjectsAdded(o),i.length>0){const t=i.map((t=>({id:t})));this._core?.engine.emitObjectsRemoved(t)}s.length>0&&this._core?.engine.emitObjectsUpdated(s.map((t=>({object:t,changedProperties:[]}))));for(const t of this._objectsChangeCallbacks)t()}initializeMetadata(t,n,e){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",B),this._metadataMap?.set("workspaceId",n),this._metadataMap?.set("workspaceName",e)}),"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,n=[];this._objectsMap.forEach(((e,r)=>{const i=this._reviver?.revive(e);i instanceof d&&null!=i.userId&&i.userId!==t?n.push(r):i&&(this.quadtree.insert(i),this._idMap.set(i.id,i))})),n.length>0&&this._ydoc.transact((()=>{for(const t of n)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 n=t.serialize();this.markUndoBoundary(),this._ydoc?.transact((()=>{this._objectsMap?.set(t.id,n)}),"local")}return!0}update(t,n={}){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 e=t.serialize(),r=n.temporary?"temporary":"local";this._ydoc?.transact((()=>{this._objectsMap?.set(t.id,e)}),r)}return!0}remove(t){const n=this.quadtree.filter(t);if(0!==n.length){this.markUndoBoundary();for(const t of n)this.quadtree.remove((n=>n.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 f)}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 n=Math.min(this._temporaryItemsCount,t);if(n>1){for(let t=0;t<n;t++)this._undoManager.canUndo()&&this._undoManager.undo();this._ydoc?.transact((()=>{for(let t=n-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 n=0;n<t;n++)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 qt{_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 d||t instanceof f))).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,n=this._state.viewportBoundaryRight,e=this._state.viewportBoundaryTop,r=this._state.viewportBoundaryBottom;return{x:Number.isFinite(t)?t:-1/0,y:Number.isFinite(e)?e:-1/0,z:0,width:Number.isFinite(t)&&Number.isFinite(n)?n-t:1/0,height:Number.isFinite(e)&&Number.isFinite(r)?r-e: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,n)=>t.zIndex-n.zIndex))}get allNonSelectionObjects(){return this.allObjects.filter((t=>!(t instanceof d||t instanceof f)))}get selectedObjects(){return this.allObjects.filter((t=>!(t instanceof d))).filter((t=>t.isSelected))}get selectionBox(){if(this._selectionBoxCacheValid)return this._cachedSelectionBox;const t=this.objects.filter((t=>t instanceof f));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 d));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 A&&t.isEditing));return t.length>0?t[0]:null}get activeShape(){const t=this.objects.filter((t=>t instanceof k&&t.isEditing));return t.length>0?t[0]:null}get currentPath(){const t=this.objects.filter((t=>t instanceof I&&!1===t.isCompleted));return t.length>0?t[0]:null}get currentLine(){const t=this.objects.filter((t=>t instanceof j&&!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,this._state.objects=new Qt}onStateChange(t,n){this._listeners.has(t)||this._listeners.set(t,new Set);const e=this._listeners.get(t);if(!e)throw new Error(`Listeners set for property ${String(t)} was not initialized.`);e.add(n)}getState(t){return this._state[t]}setState(t,n){const e=this._state[t];if(e!==n){this._state[t]=n;const r=this._listeners.get(t);r&&r.forEach((r=>r(n,e,String(t))))}}}class Zt{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,n){this._core=t,this._ydoc=new O.Doc,this._workspacesMap=this._ydoc.getMap("workspaces"),this._metadataMap=this._ydoc.getMap("metadata");const e=n?.appStateId??this.getOrCreateAppStateInstanceId(t),r=t.editorId?`kritzel-app-state-${t.editorId}-${e}`:`kritzel-app-state-${e}`,i=n??Bt,o=!t.store.state.debugInfo.showSyncProviderInfo;for(const t of i.providers){let n;n="function"==typeof t?new t(r,this._ydoc,{quiet:o}):t.create(r,this._ydoc,{quiet:o}),this._providers.push(n)}this._workspacesObserver=t=>{this.handleWorkspacesChange(t)},this._workspacesMap.observe(this._workspacesObserver);const s=this._providers.filter((t=>"local"===t.type)),a=this._providers.filter((t=>"network"===t.type));(await Promise.allSettled(s.map((t=>t.connect())))).forEach(((t,n)=>{"rejected"===t.status&&console.error(`[Kritzel] Sync provider "${s[n]?.constructor.name}" failed to connect:`,t.reason)}));for(const t of a)t.connect().catch((n=>{console.error(`[Kritzel] Network sync provider "${t.constructor.name}" failed to connect:`,n)}));this._isReady=!0,Tt(this._ydoc,this._metadataMap,{workspaces:this._workspacesMap},Et,U,{quiet:!t.store.state.debugInfo.showMigrationInfo}),this.initializeMetadata("state"),this.loadFromYjs()}getOrCreateAppStateInstanceId(t){const n=globalThis.localStorage;if(!n)throw new Error("[KritzelAppStateMap] localStorage is unavailable. Cannot persist app-state document identity.");const e=t.getStorageKey("kritzel-app-state-instance-id");let r;try{r=n.getItem(e)}catch{throw new Error("[KritzelAppStateMap] Failed to read app-state instance id from localStorage.")}if(r)return r;const i=_.generateUUID();try{n.setItem(e,i)}catch{throw new Error("[KritzelAppStateMap] Failed to persist app-state instance id to localStorage.")}return i}handleWorkspacesChange(t){if("local"===t.transaction.origin)return void this._core?.rerender();if("migration"===t.transaction.origin)return;const n=Array.from(t.keysChanged),e=[],r=[];n.forEach((n=>{const i=t.changes.keys.get(n);if(i&&"delete"===i.action)r.push(n);else{const t=this._workspacesMap.get(n);if(t){const n=this.reviveWorkspace(t);e.push(n)}}})),r.forEach((t=>{this.map.delete(t)})),e.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 n=t.viewport;if(n&&"translateX"in n&&!("centerWorldX"in n)){const t=n.scale??1;n={centerWorldX:-(n.translateX??0)/t,centerWorldY:-(n.translateY??0)/t,scale:t}}const e=new S(t.id,t.name,n);return this._core&&(e._core=this._core),e.createdAt=new Date(t.createdAt),e.updatedAt=new Date(t.updatedAt),e.isPublic=t.isPublic??!1,e}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",U)}),"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,n)=>{const e=this.reviveWorkspace(t);this.map.set(n,e)})))}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 n=t.serialize();this._ydoc?.transact((()=>{this._workspacesMap?.set(t.id,n)}),"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 n=t.serialize();this._ydoc?.transact((()=>{this._workspacesMap?.set(t.id,n)}),"local")}return!0}remove(t){const n=Array.from(this.map.values()).find(t);return!!n&&(this.map.delete(n.id),this._workspacesMap&&this._ydoc?.transact((()=>{this._workspacesMap?.delete(n.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 Jt{_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",jt.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 n=this._shadowRoot.elementsFromPoint(t.clientX,t.clientY);if(!n||0===n.length)return;const e=n.find((t=>t.classList.contains("resize-handle-overlay")));if(e){const t=this._core.store.selectionGroup,n=t?.rotationDegrees??0,r=e.classList.contains("top-left"),i=e.classList.contains("bottom-right");this._core.store.state.cursor={icon:"move-vertical",rotation:n+(r||i?-45:45)}}else this._core.store.state.cursor=n.find((t=>t.classList.contains("rotation-handle-overlay")))||n.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,n=this._core.store.isPointerDown,e=t.cursor?.icon,r=t.cursor?.iconActive??e,i=t.cursor?.rotation,o=jt.getCursor({iconName:n?r:e,rotation:i});this._targetElement&&(this._targetElement.style.cursor=o)}cleanup(){this._targetElement&&(this._targetElement.style.cursor="",this._targetElement.style.removeProperty("--kritzel-pointer-cursor")),this._targetElement=null,this._shadowRoot=null}}class tn{_kritzelEngine;_store;_syncConfig;_assetStorageConfig;_assetResolver;_appStateMap;_anchorManager;_cursorManager;_themeManager;_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 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,n){this._kritzelEngine=t,this._editorId=n,this._store=new qt(Xt),this._appStateMap=new Zt,this._anchorManager=new zt(this),this._cursorManager=new Jt(this),this._themeManager=new L(this),this._assetResolver=new x}get assetResolver(){return this._assetResolver}setSyncConfig(t){this._syncConfig=t}setAssetStorageConfig(t){this._assetStorageConfig=t}setEditorId(t){this._editorId=t,this._themeManager=new L(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((n=>n.id===t))}async initializeWorkspace(t,n){const e=this.loadWorkspacesFromAppState(),r=e.length>0?[...e].sort(((t,n)=>{const e=n.createdAt.getTime()-t.createdAt.getTime();return 0!==e?e:n.updatedAt.getTime()-t.updatedAt.getTime()}))[0]:null,i=localStorage.getItem(this.getStorageKey("kritzel-active-workspace-id")),o=i?e.find((t=>t.id===i)):null;let s;if(t)s=t,e.find((n=>n.id===t.id))||(s._core=this,this.saveWorkspaceToAppState(s));else if(o)s=o;else if(r)s=r;else{if(n?.skipFallbackCreation)return this._store.state.workspaces=e,this._store.state.activeWorkspace=null,void this.rerender();s=new S(_.generateUUID(),"New Workspace"),s._core=this,this.saveWorkspaceToAppState(s)}localStorage.setItem(this.getStorageKey("kritzel-active-workspace-id"),s.id),this._store.objects&&this._store.objects.isReady&&this._store.objects.destroy();const a=new Qt;this._store.state.objects=a,this._store.state.activeWorkspace=s,this._store.state.workspaces=this.loadWorkspacesFromAppState();const c=s.viewport??{centerWorldX:0,centerWorldY:0,scale:1},u=c.scale??1,h=this._store.state.viewportHeight;this._store.state.translateX=this._store.state.viewportWidth/2-(c.centerWorldX??0)*u,this._store.state.translateY=h/2-(c.centerWorldY??0)*u,this._store.state.scale=u,await a.initialize(this,s.id,this._syncConfig),this._user&&a.setLocalUser(this._user),a.onAwarenessChange((t=>{this.engine.emitAwarenessChange(t)})),this._anchorManager.rebuildIndex(),this.engine.emitObjectsChange(),this.rerender()}async loadSharedWorkspace(t){const n=t;let e=this.getWorkspaces().find((t=>t.id===n));e?e.isPublic=!0:(e=new S(n,"Shared Workspace"),e.isPublic=!0,this.createWorkspace(e)),await this.initializeWorkspace(e)}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 d||t instanceof f))).sort(((t,n)=>t.zIndex-n.zIndex)):[]}rerender(){this._kritzelEngine&&this._kritzelEngine.forceUpdate++}findObjectById(t){for(const n of this._store.allObjects)if(n.id===t)return n;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 n=this._store.state.workspaces,e=n.findIndex((n=>n.id===t.id));-1!==e&&(n[e]=t,this._store.state.workspaces=n)}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,n,e){const r=this._store.state.activeWorkspace;r&&this._store.state.workspaces.some((t=>t.id===r.id))&&(r.viewport={centerWorldX:(this._store.state.viewportWidth/2-t)/e,centerWorldY:(this._store.state.viewportHeight/2-n)/e,scale:e},r.updatedAt=new Date,this.saveWorkspaceToAppState(r))}getIsPublic(){return this._store.state.activeWorkspace?.isPublic??!1}addObject(t){this._store.objects.insert(t)}removeObject(t,n=!1){l.isInstanceOf(t,"KritzelGroup")&&!n&&[...t.children].forEach((t=>{this.removeObject(t)})),l.isInstanceOf(t,"KritzelLine")?this._anchorManager.handleLineDeleted(t.id):this._anchorManager.handleObjectDeleted(t.id),t.isMounted=!1,this._store.objects.remove((n=>n.id===t.id))}updateObject(t,n){const e=[];for(const r in n)if(n.hasOwnProperty(r)){const i=n[r];void 0!==i&&(t[r]=i,e.push(r))}t.onAfterUpdate(e),this._store.objects.update(t)}addSelectionGroup(t){this.removeSelectionGroup(),this.removeSelectionBox(),this._store.objects.insert(t),this._store.setSelectionGroup(t),this._kritzelEngine.triggerSelectionChange()}removeSelectionGroup(){const t=this._store.selectionGroup;t&&(this._store.objects.remove((n=>n.id===t.id)),this._store.setSelectionGroup(null),this._kritzelEngine.triggerSelectionChange())}removeSelectionBox(){const t=this._store.selectionBox;t&&(this._store.objects.remove((n=>n.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 n=this.findObjectById(t);n&&(this.removeObject(n),this.engine.emitObjectsInViewportChange(),this.rerender())}copy(){const t=this._store.selectionGroup;if(t){const n=new Map,e=t.objects.sort(((t,n)=>t.zIndex-n.zIndex)).map((t=>{const e=t.copy();return n.set(e.id,t.id),e}));this._store.state.copiedObjects=e,this._store.state.copiedObjectIdMapping=n}}cut(){this._store.selectionGroup&&(this.copy(),this.delete())}paste(t,n){const e=this._store.state.copiedObjects;if(!e||0===e.length)return;const r=this._store.state.activeWorkspace,i=this._store.state.copiedObjectIdMapping,o=e.some((t=>t.workspaceId!==r.id)),s=Math.min(...e.map((t=>t.translateX))),a=Math.min(...e.map((t=>t.translateY)));let c,u;void 0!==t&&void 0!==n?(c=t,u=n):o?(c=s,u=a):(c=s+25/this._store.state.scale,u=a+25/this._store.state.scale);const f=c-s,p=u-a;this.removeSelectionGroup(),this.removeSelectionBox();const v=d.create(this),g=new Map;i&&i.forEach(((t,n)=>{g.set(t,n)}));const w=this._store.currentZIndex;this._store.objects.transaction((()=>{const t=(n,e)=>{if(0===n._pendingChildren.length)return;const i=n._pendingChildren;n._pendingChildren=[],i.forEach(((n,i)=>{n.workspaceId!==r.id&&(n.workspaceId=r.id),n.updatePosition(n.translateX+f,n.translateY+p),n.zIndex=e+i+1,l.isInstanceOf(n,"KritzelGroup")&&t(n,n.zIndex),this.addObject(n)})),n.finalize()};e.forEach(((n,e)=>{n.workspaceId!==r.id&&(n.workspaceId=r.id),n.updatePosition(n.translateX+f,n.translateY+p),n.zIndex=w+e,l.isInstanceOf(n,"KritzelGroup")&&t(n,n.zIndex),this.addObject(n),v.addOrRemove(n)})),e.forEach((t=>{if(l.isInstanceOf(t,"KritzelLine")){let n=!1;t.startAnchor&&g.has(t.startAnchor.objectId)&&(t.startAnchor={objectId:g.get(t.startAnchor.objectId)},n=!0),t.endAnchor&&g.has(t.endAnchor.objectId)&&(t.endAnchor={objectId:g.get(t.endAnchor.objectId)},n=!0),n&&this._store.objects.update(t)}}))})),this._anchorManager.rebuildIndex(),v.isSelected=!0,1===e.length&&(v.rotation=e[0].rotation),this.addSelectionGroup(v),o&&(void 0!==t&&void 0!==n?v.updatePosition(t,n):v.centerInViewport(),this.engine.viewport.centerFitInViewport(v)),this._store.state.isSelecting=!1,requestAnimationFrame((()=>{const t=this._store.selectionGroup;if(t){const n=new Map,e=t.objects.sort(((t,n)=>t.zIndex-n.zIndex)).map((t=>{const e=t.copy();return n.set(e.id,t.id),e}));this._store.state.copiedObjects=e,this._store.state.copiedObjectIdMapping=n}})),this._store.setState("activeTool",h.getTool("selection")),this.engine.emitObjectsChange(),this.rerender()}bringForward(t){const n=this._store.selectionGroup,e=t?[t]:n?.objects||[],r=this._store.allNonSelectionObjects.filter((t=>-1===e.findIndex((n=>n.id===t.id)))),i=r.length>0?Math.max(...r.map((t=>t.zIndex)))+1:0;e.forEach((t=>{t.zIndex!==i&&this.updateObject(t,{zIndex:t.zIndex+1})})),this.rerender()}sendBackward(t){const n=this._store.selectionGroup,e=t?[t]:n?.objects||[],r=this._store.allNonSelectionObjects.filter((t=>-1===e.findIndex((n=>n.id===t.id)))),i=r.length>0?Math.min(...r.map((t=>t.zIndex)))-1:0;e.forEach((t=>{t.zIndex!==i&&this.updateObject(t,{zIndex:t.zIndex-1})})),this.rerender()}bringToFront(t){const n=this._store.selectionGroup,e=t?[t]:n?.objects||[],r=this._store.allNonSelectionObjects.filter((t=>-1===e.findIndex((n=>n.id===t.id)))),i=Math.max(...r.map((t=>t.zIndex)))+1;e.forEach((t=>{this.updateObject(t,{zIndex:i})})),this.rerender()}sendToBack(t){const n=this._store.selectionGroup,e=t?[t]:n?.objects||[],r=this._store.allNonSelectionObjects.filter((t=>-1===e.findIndex((n=>n.id===t.id)))),i=Math.min(...r.map((t=>t.zIndex)))-1;e.forEach((t=>{this.updateObject(t,{zIndex:i})})),this.rerender()}alignObjects(t){const n=this._store.selectionGroup;if(!n||n.objects.length<2)return;const e=n.objects,r=Gt.calculateAlignedPositions(e,t);this._store.objects.transaction((()=>{for(const t of e){const n=r.get(t.id);n&&this.updateObject(t,{translateX:n.translateX,translateY:n.translateY})}})),n.refreshObjectDimensions(),this.rerender()}group(){const t=this._store.selectionGroup;if(!t||t.objects.length<2)return;const n=b.createFromObjects(this,t.objects);this.addObject(n),this.removeSelectionGroup();const e=d.create(this);e.addOrRemove(n),e.isSelected=!0,e.rotation=n.rotation,this.addSelectionGroup(e),this.engine.emitObjectsChange(),this.rerender()}ungroup(){const t=this._store.selectionGroup;if(!t)return;const n=t.objects.filter((t=>l.isInstanceOf(t,"KritzelGroup")));if(0===n.length)return;const e=[],r=t.objects.filter((t=>!l.isInstanceOf(t,"KritzelGroup")));n.forEach((t=>{const n=t.ungroup();e.push(...n),this.removeObject(t,!0)})),this.removeSelectionGroup();const i=d.create(this);[...e,...r].forEach((t=>{i.addOrRemove(t)})),i.isSelected=!0,this.addSelectionGroup(i),this.engine.emitObjectsChange(),this.rerender()}selectObjects(t){if(0===t.length)return;const n=d.create(this);t.forEach((t=>{t.isSelected=!1,n.addOrRemove(t)})),n.isSelected=!0,1===t.length&&(n.rotation=n.objects[0].rotation),this.addSelectionGroup(n),this.rerender()}selectAllObjects(){const t=this._store.objects.allObjects().filter((t=>!(t instanceof d||t instanceof f||t instanceof T)));if(t.length>0){const n=d.create(this);t.forEach((t=>{t.isSelected=!1,n.addOrRemove(t)})),n.isSelected=!0,this._store.state.isSelecting=!1,1===t.length&&(n.rotation=n.objects[0].rotation),this.addSelectionGroup(n),this._store.setState("activeTool",h.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 d||t instanceof f||t instanceof T)));if(t.length>0){const n=d.create(this);t.forEach((t=>{t.isSelected=!1,n.addOrRemove(t)})),n.isSelected=!0,this._store.state.isSelecting=!1,1===t.length&&(n.rotation=n.objects[0].rotation),this.addSelectionGroup(n),this._store.setState("activeTool",h.getTool("selection")),this.rerender()}}clearSelection(){this.removeSelectionGroup();const t=this._user?.id;this._store.objects.remove((n=>n instanceof f||n instanceof d&&(null==t||n.userId===t||null==n.userId))),this._store.setSelectionBox(null),this._store.setSelectionGroup(null),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,n=".object"){const e=this._store.state.host?.shadowRoot;if(!e)return null;const r=t.clientX,i=t.clientY,o=e.elementFromPoint(r,i);if(!o)return null;const s=o.closest(n);if(s){const t=this._store.allObjects.find((t=>s.id===t.id));return t&&t.hitTest(r,i)?t:null}return null}getObjectsFromPointerEvent(t,n=".object"){const e=this._store.state.host?.shadowRoot;if(!e)return[];const r=e.elementsFromPoint(t.clientX,t.clientY);if(!r||0===r.length)return[];const i=new Set;return r.forEach((t=>{const e=t.closest(n);e&&e.id&&i.add(e.id)})),i.size>0?this._store.allObjects.filter((t=>i.has(t.id))).sort(((t,n)=>n.zIndex-t.zIndex)):[]}getElementsAtPoint(t,n){const e=this._store.state.host?.shadowRoot;if(!e)return[];const r=e.elementsFromPoint(t.clientX,t.clientY);return r&&0!==r.length?r.filter((t=>t.matches(n))):[]}isPointerOverElement(t,n){return this.getElementsAtPoint(t,n).length>0}getCanvasPoint(t){if(!this._store.state.host)return{x:0,y:0};const n=this._store.state.host.getBoundingClientRect();return{x:(t.clientX-n.left-this._store.state.translateX)/this._store.state.scale,y:(t.clientY-n.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",h.getTool("selection"))}displaySelectionGroupUI(t){if(!t.isSelected)return!1;if(t instanceof d&&null!=this._user?.id&&null!=t.userId&&t.userId!==this._user.id)return!0;const n=this._store.selectionGroup;return n?n.objects.length>1||(1!==n.objects.length||!(n.objects[0]instanceof j)):!(t instanceof j)}displaySelectionLineUI(t){if(!(t instanceof j))return!1;const n=this._store.selectionGroup;if(!n)return t.isSelected;if(!n.isSelected)return!1;if(1===n.objects.length){const e=n.objects[0];return e instanceof j&&e.id===t.id}return!1}}class nn{static calculateCombinedBounds(t){if(!t||0===t.length)return null;let n=1/0,e=1/0,r=-1/0,i=-1/0;for(const o of t){const t=o.rotatedBoundingBox;n=Math.min(n,t.x),e=Math.min(e,t.y),r=Math.max(r,t.x+t.width),i=Math.max(i,t.y+t.height)}return{x:n,y:e,z:1,width:r-n,height:i-e}}static generateSvg(t,n={}){const{theme:e,padding:r=0,includeXmlDeclaration:i=!0}=n;if(!t||0===t.length)return"";const o=this.flattenObjects(t),s=this.calculateCombinedBounds(o);if(!s)return"";const a=s.x-r,c=s.y-r,u=s.width+2*r,h=s.height+2*r,l=this.collectDefs(o,e),f=t.sort(((t,n)=>t.zIndex-n.zIndex)).map((t=>this.objectToSvgElement(t,e))).filter(Boolean).join("\n ");return`${i?'<?xml version="1.0" encoding="UTF-8"?>\n':""}<svg xmlns="http://www.w3.org/2000/svg" viewBox="${a} ${c} ${u} ${h}" width="${u}" height="${h}">${l.length>0?`\n <defs>\n ${l.join("\n ")}\n </defs>`:""}\n ${f}\n</svg>`}static flattenObjects(t){const n=[];for(const e of t)l.isInstanceOf(e,"KritzelGroup")?n.push(...this.flattenObjects(e.children)):n.push(e);return n}static collectDefs(t,n){const e=[];for(const r of t)l.isInstanceOf(r,"KritzelLine")&&(r.hasStartArrow&&e.push(this.generateArrowMarker(r,"start",n)),r.hasEndArrow&&e.push(this.generateArrowMarker(r,"end",n)));return e}static generateArrowMarker(t,n,e){const r="start"===n?t.startMarkerId:t.endMarkerId,i=t.getArrowSize(n),o=t.getArrowFill(n);return`<marker id="${r}" markerWidth="${i}" markerHeight="${i}" refX="0" refY="${i/2}" orient="${"start"===n?"auto-start-reverse":"auto"}" markerUnits="userSpaceOnUse">\n <path d="${t.getArrowPath("start"===n?t.arrows?.start?.style:t.arrows?.end?.style)}" fill="${o}" transform="scale(${i/10})"/>\n </marker>`}static objectToSvgElement(t,n){return l.isInstanceOf(t,"KritzelPath")?this.pathToSvg(t,n):l.isInstanceOf(t,"KritzelLine")?this.lineToSvg(t,n):l.isInstanceOf(t,"KritzelShape")?this.shapeToSvg(t,n):l.isInstanceOf(t,"KritzelText")?this.textToSvg(t,n):l.isInstanceOf(t,"KritzelImage")?this.imageToSvg(t):l.isInstanceOf(t,"KritzelGroup")?this.groupToSvg(t,n):""}static pathToSvg(t,n){const e=this.buildTransform(t),r=D.resolveThemeColor(t.fill,n),i=D.resolveThemeColor(t.stroke,n);return`<g transform="${e}"${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}" overflow="visible">\n <path d="${t.d}" fill="${r||"none"}" stroke="${i||"none"}"${t.strokeWidth?` stroke-width="${t.strokeWidth}"`:""}/>\n </svg>\n </g>`}static lineToSvg(t,n){const e=this.buildTransform(t),r=D.resolveThemeColor(t.stroke,n);return`<g transform="${e}"${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}" overflow="visible">\n <path d="${t.d}" fill="none" stroke="${r}" 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,n){const e=this.buildTransform(t),r=D.resolveThemeColor(t.fillColor,n),i=D.resolveThemeColor(t.strokeColor,n),o=1!==t.opacity?` opacity="${t.opacity}"`:"",s=t.getSvgPath();let a="";if(t.editor&&!t.editor.state.doc.textContent.trim());else if(t.content){const e=this.prosemirrorToHtml(t.content,t,n);if(e){const r=D.resolveThemeColor(t.fontColor,n);a=`\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: ${r}; overflow: hidden;">\n ${e}\n </div>\n </foreignObject>`}}return`<g transform="${e}"${o}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}" overflow="visible" preserveAspectRatio="none">\n <path d="${s}" fill="${r||"transparent"}" stroke="${i}" stroke-width="${t.strokeWidth}"/>${a}\n </svg>\n </g>`}static textToSvg(t,n){const e=this.buildTransform(t),r=1!==t.opacity?` opacity="${t.opacity}"`:"",i=D.resolveThemeColor(t.fontColor,n),o=D.resolveThemeColor(t.backgroundColor,n),s=this.prosemirrorToHtml(t.content,t,n);return`<g transform="${e}"${r}>\n <foreignObject x="0" y="0" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}">\n <div xmlns="http://www.w3.org/1999/xhtml" style="font-family: ${t.fontFamily}; font-size: ${t.fontSize}pt; color: ${i}; background-color: ${o||"transparent"}; transform: scale(${t.scaleFactor}); transform-origin: top left; white-space: pre-wrap; word-wrap: break-word;">\n ${s}\n </div>\n </foreignObject>\n </g>`}static imageToSvg(t){return`<g transform="${this.buildTransform(t)}"${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n <image href="${t.resolvedSrc||t.src||""}" x="0" y="0" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}" preserveAspectRatio="xMidYMid meet"/>\n </g>`}static groupToSvg(t,n){const e=t.children.sort(((t,n)=>t.zIndex-n.zIndex)).map((t=>this.objectToSvgElement(t,n))).filter(Boolean).join("\n ");return e?`<g${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n ${e}\n </g>`:""}static buildTransform(t){const n=[];if(n.push(`translate(${t.translateX}, ${t.translateY})`),0!==t.rotation){const e=t.rotation*(180/Math.PI);n.push(`rotate(${e}, ${t.totalWidth/2/t.scale}, ${t.totalHeight/2/t.scale})`)}return n.join(" ")}static prosemirrorToHtml(t,n,e){return t&&t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}static nodeToHtml(t,n){if(!t)return"";switch(t.type){case"paragraph":return`<p style="margin: 0;">${(t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):"")||"<br/>"}</p>`;case"text":let e=this.escapeHtml(t.text||"");if(t.marks)for(const r of t.marks)e=this.applyMark(e,r,n);return e;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,n))).join(""):""}</ul>`;case"ordered_list":return`<ol style="margin: 0; padding-left: 1.5em;">${t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):""}</ol>`;case"list_item":return`<li>${t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):""}</li>`;default:return t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):""}}static applyMark(t,n,e){switch(n.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(n.attrs?.href||"#")}">${t}</a>`;default:return t}}static escapeHtml(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}}const en=(()=>{let t=0;return()=>(t+=1,`u${`0000${(Math.random()*36**4|0).toString(36)}`.slice(-4)}${t}`)})();function rn(t){const n=[];for(let e=0,r=t.length;e<r;e++)n.push(t[e]);return n}let on=null;function sn(t={}){return on||(t.includeStyleProperties?(on=t.includeStyleProperties,on):(on=rn(window.getComputedStyle(document.documentElement)),on))}function an(t,n){const e=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(n);return e?parseFloat(e.replace("px","")):0}function cn(t,n={}){return{width:n.width||function(t){const n=an(t,"border-left-width"),e=an(t,"border-right-width");return t.clientWidth+n+e}(t),height:n.height||function(t){const n=an(t,"border-top-width"),e=an(t,"border-bottom-width");return t.clientHeight+n+e}(t)}}const un=16384;function hn(t){return new Promise(((n,e)=>{const r=new Image;r.onload=()=>{r.decode().then((()=>{requestAnimationFrame((()=>n(r)))}))},r.onerror=e,r.crossOrigin="anonymous",r.decoding="async",r.src=t}))}const ln=(t,n)=>{if(t instanceof n)return!0;const e=Object.getPrototypeOf(t);return null!==e&&(e.constructor.name===n.name||ln(e,n))};function fn(t,n,e,r){const i=window.getComputedStyle(t,e),o=i.getPropertyValue("content");if(""===o||"none"===o)return;const s=en();try{n.className=`${n.className} ${s}`}catch(t){return}const a=document.createElement("style");a.appendChild(function(t,n,e,r){const i=`.${t}:${n}`,o=e.cssText?function(t){const n=t.getPropertyValue("content");return`${t.cssText} content: '${n.replace(/'|"/g,"")}';`}(e):function(t,n){return sn(n).map((n=>`${n}: ${t.getPropertyValue(n)}${t.getPropertyPriority(n)?" !important":""};`)).join(" ")}(e,r);return document.createTextNode(`${i}{${o}}`)}(s,e,i,r)),n.appendChild(a)}const dn="application/font-woff",pn="image/jpeg",vn={woff:dn,woff2:dn,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:pn,jpeg:pn,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function gn(t){const n=function(t){const n=/\.([^./]*?)$/g.exec(t);return n?n[1]:""}(t).toLowerCase();return vn[n]||""}function wn(t){return-1!==t.search(/^(data:)/)}async function yn(t,n,e){const r=await fetch(t,n);if(404===r.status)throw new Error(`Resource "${r.url}" not found`);const i=await r.blob();return new Promise(((t,n)=>{const o=new FileReader;o.onerror=n,o.onloadend=()=>{try{t(e({res:r,result:o.result}))}catch(t){n(t)}},o.readAsDataURL(i)}))}const mn={};async function bn(t,n,e){const r=function(t,n,e){let r=t.replace(/\?.*/,"");return e&&(r=t),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,"")),n?`[${n}]${r}`:r}(t,n,e.includeQueryParams);if(null!=mn[r])return mn[r];let i;e.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+(new Date).getTime());try{const r=await yn(t,e.fetchRequestInit,(({res:t,result:e})=>(n||(n=t.headers.get("Content-Type")||""),function(t){return t.split(/,/)[1]}(e))));i=function(t,n){return`data:${n};base64,${t}`}(r,n)}catch(n){i=e.imagePlaceholder||"";let r=`Failed to fetch resource: ${t}`;n&&(r="string"==typeof n?n:n.message),r&&console.warn(r)}return mn[r]=i,i}const kn=t=>null!=t.tagName&&"SLOT"===t.tagName.toUpperCase(),An=t=>null!=t.tagName&&"SVG"===t.tagName.toUpperCase();async function xn(t,n,e){return e||!n.filter||n.filter(t)?Promise.resolve(t).then((t=>async function(t,n){return ln(t,HTMLCanvasElement)?async function(t){const n=t.toDataURL();return"data:,"===n?t.cloneNode(!1):hn(n)}(t):ln(t,HTMLVideoElement)?async function(t,n){if(t.currentSrc){const n=document.createElement("canvas"),e=n.getContext("2d");return n.width=t.clientWidth,n.height=t.clientHeight,null==e||e.drawImage(t,0,0,n.width,n.height),hn(n.toDataURL())}const e=t.poster,r=gn(e);return hn(await bn(e,r,n))}(t,n):ln(t,HTMLIFrameElement)?async function(t,n){var e;try{if(null===(e=null==t?void 0:t.contentDocument)||void 0===e?void 0:e.body)return await xn(t.contentDocument.body,n,!0)}catch(t){}return t.cloneNode(!1)}(t,n):t.cloneNode(An(t))}(t,n))).then((e=>async function(t,n,e){var r,i;if(An(n))return n;let o=[];return o=kn(t)&&t.assignedNodes?rn(t.assignedNodes()):ln(t,HTMLIFrameElement)&&(null===(r=t.contentDocument)||void 0===r?void 0:r.body)?rn(t.contentDocument.body.childNodes):rn((null!==(i=t.shadowRoot)&&void 0!==i?i:t).childNodes),0===o.length||ln(t,HTMLVideoElement)||await o.reduce(((t,r)=>t.then((()=>xn(r,e))).then((t=>{t&&n.appendChild(t)}))),Promise.resolve()),n}(t,e,n))).then((e=>function(t,n,e){return ln(n,Element)&&(function(t,n,e){const r=n.style;if(!r)return;const i=window.getComputedStyle(t);i.cssText?(r.cssText=i.cssText,r.transformOrigin=i.transformOrigin):sn(e).forEach((e=>{let o=i.getPropertyValue(e);if("font-size"===e&&o.endsWith("px")){const t=Math.floor(parseFloat(o.substring(0,o.length-2)))-.1;o=`${t}px`}ln(t,HTMLIFrameElement)&&"display"===e&&"inline"===o&&(o="block"),"d"===e&&n.getAttribute("d")&&(o=`path(${n.getAttribute("d")})`),r.setProperty(e,o,i.getPropertyPriority(e))}))}(t,n,e),function(t,n,e){fn(t,n,":before",e),fn(t,n,":after",e)}(t,n,e),function(t,n){ln(t,HTMLTextAreaElement)&&(n.innerHTML=t.value),ln(t,HTMLInputElement)&&n.setAttribute("value",t.value)}(t,n),function(t,n){if(ln(t,HTMLSelectElement)){const e=Array.from(n.children).find((n=>t.value===n.getAttribute("value")));e&&e.setAttribute("selected","")}}(t,n)),n}(t,e,n))).then((t=>async function(t,n){const e=t.querySelectorAll?t.querySelectorAll("use"):[];if(0===e.length)return t;const r={};for(let i=0;i<e.length;i++){const o=e[i].getAttribute("xlink:href");if(o){const e=t.querySelector(o),i=document.querySelector(o);e||!i||r[o]||(r[o]=await xn(i,n,!0))}}const i=Object.values(r);if(i.length){const n="http://www.w3.org/1999/xhtml",e=document.createElementNS(n,"svg");e.setAttribute("xmlns",n),e.style.position="absolute",e.style.width="0",e.style.height="0",e.style.overflow="hidden",e.style.display="none";const r=document.createElementNS(n,"defs");e.appendChild(r);for(let t=0;t<i.length;t++)r.appendChild(i[t]);t.appendChild(e)}return t}(t,n))):null}const $n=/url\((['"]?)([^'"]+?)\1\)/g,Sn=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Mn=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function jn(t){return-1!==t.search($n)}async function Cn(t,n,e){if(!jn(t))return t;const r=function(t,{preferredFontFormat:n}){return n?t.replace(Mn,(t=>{for(;;){const[e,,r]=Sn.exec(t)||[];if(!r)return"";if(r===n)return`src: ${e};`}})):t}(t,e),i=function(t){const n=[];return t.replace($n,((t,e,r)=>(n.push(r),t))),n.filter((t=>!wn(t)))}(r);return i.reduce(((t,r)=>t.then((t=>async function(t,n,e,r){try{const i=e?function(t,n){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 e=document.implementation.createHTMLDocument(),r=e.createElement("base"),i=e.createElement("a");return e.head.appendChild(r),e.body.appendChild(i),n&&(r.href=n),i.href=t,i.href}(n,e):n,o=gn(n);let s;return s=await bn(i,o,r),t.replace(function(t){const n=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${n})(['"]?\\))`,"g")}(n),`$1${s}$3`)}catch(t){}return t}(t,r,n,e)))),Promise.resolve(r))}async function zn(t,n,e){var r;const i=null===(r=n.style)||void 0===r?void 0:r.getPropertyValue(t);if(i){const r=await Cn(i,null,e);return n.style.setProperty(t,r,n.style.getPropertyPriority(t)),!0}return!1}async function In(t,n){ln(t,Element)&&(await async function(t,n){await zn("background",t,n)||await zn("background-image",t,n),await zn("mask",t,n)||await zn("-webkit-mask",t,n)||await zn("mask-image",t,n)||await zn("-webkit-mask-image",t,n)}(t,n),await async function(t,n){const e=ln(t,HTMLImageElement);if((!e||wn(t.src))&&(!ln(t,SVGImageElement)||wn(t.href.baseVal)))return;const r=e?t.src:t.href.baseVal,i=await bn(r,gn(r),n);await new Promise(((r,o)=>{t.onload=r,t.onerror=n.onImageErrorHandler?(...t)=>{try{r(n.onImageErrorHandler(...t))}catch(t){o(t)}}:o;const s=t;s.decode&&(s.decode=r),"lazy"===s.loading&&(s.loading="eager"),e?(t.srcset="",t.src=i):t.href.baseVal=i}))}(t,n),await async function(t,n){const e=rn(t.childNodes).map((t=>In(t,n)));await Promise.all(e).then((()=>t))}(t,n))}const Tn={};async function En(t){let n=Tn[t];if(null!=n)return n;const e=await fetch(t);return n={url:t,cssText:await e.text()},Tn[t]=n,n}async function _n(t,n){let e=t.cssText;const r=/url\(["']?([^"')]+)["']?\)/g,i=(e.match(/url\([^)]+\)/g)||[]).map((async i=>{let o=i.replace(r,"$1");return o.startsWith("https://")||(o=new URL(o,t.url).href),yn(o,n.fetchRequestInit,(({result:t})=>(e=e.replace(i,`url(${t})`),[i,t])))}));return Promise.all(i).then((()=>e))}function On(t){if(null==t)return[];const n=[];let e=t.replace(/(\/\*[\s\S]*?\*\/)/gi,"");const r=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const t=r.exec(e);if(null===t)break;n.push(t[0])}e=e.replace(r,"");const i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,o=new RegExp("((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})","gi");for(;;){let t=i.exec(e);if(null===t){if(t=o.exec(e),null===t)break;i.lastIndex=o.lastIndex}else o.lastIndex=i.lastIndex;n.push(t[0])}return n}function Pn(t){return t.trim().replace(/["']/g,"")}async function Bn(t,n){const e=await async function(t,n){if(null==t.ownerDocument)throw new Error("Provided element is not within a Document");const e=rn(t.ownerDocument.styleSheets),r=await async function(t,n){const e=[],r=[];return t.forEach((e=>{if("cssRules"in e)try{rn(e.cssRules||[]).forEach(((t,i)=>{if(t.type===CSSRule.IMPORT_RULE){let o=i+1;const s=En(t.href).then((t=>_n(t,n))).then((t=>On(t).forEach((t=>{try{e.insertRule(t,t.startsWith("@import")?o+=1:e.cssRules.length)}catch(n){console.error("Error inserting rule from remote css",{rule:t,error:n})}})))).catch((t=>{console.error("Error loading remote css",t.toString())}));r.push(s)}}))}catch(i){const o=t.find((t=>null==t.href))||document.styleSheets[0];null!=e.href&&r.push(En(e.href).then((t=>_n(t,n))).then((t=>On(t).forEach((t=>{o.insertRule(t,o.cssRules.length)})))).catch((t=>{console.error("Error loading remote stylesheet",t)}))),console.error("Error inlining remote css file",i)}})),Promise.all(r).then((()=>(t.forEach((t=>{if("cssRules"in t)try{rn(t.cssRules||[]).forEach((t=>{e.push(t)}))}catch(n){console.error(`Error while reading CSS rules from ${t.href}`,n)}})),e)))}(e,n);return function(t){return t.filter((t=>t.type===CSSRule.FONT_FACE_RULE)).filter((t=>jn(t.style.getPropertyValue("src"))))}(r)}(t,n),r=function(t){const n=new Set;return function t(e){(e.style.fontFamily||getComputedStyle(e).fontFamily).split(",").forEach((t=>{n.add(Pn(t))})),Array.from(e.children).forEach((n=>{n instanceof HTMLElement&&t(n)}))}(t),n}(t);return(await Promise.all(e.filter((t=>r.has(Pn(t.style.fontFamily)))).map((t=>Cn(t.cssText,t.parentStyleSheet?t.parentStyleSheet.href:null,n))))).join("\n")}async function Un(t,n={}){const{width:e,height:r}=cn(t,n),i=await xn(t,n,!0);return await async function(t,n){const e=null!=n.fontEmbedCSS?n.fontEmbedCSS:n.skipFonts?null:await Bn(t,n);if(e){const n=document.createElement("style"),r=document.createTextNode(e);n.appendChild(r),t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n)}}(i,n),await In(i,n),function(t,n){const{style:e}=t;n.backgroundColor&&(e.backgroundColor=n.backgroundColor),n.width&&(e.width=`${n.width}px`),n.height&&(e.height=`${n.height}px`);const r=n.style;null!=r&&Object.keys(r).forEach((t=>{e[t]=r[t]}))}(i,n),await async function(t,n,e){const r="http://www.w3.org/2000/svg",i=document.createElementNS(r,"svg"),o=document.createElementNS(r,"foreignObject");return i.setAttribute("width",`${n}`),i.setAttribute("height",`${e}`),i.setAttribute("viewBox",`0 0 ${n} ${e}`),o.setAttribute("width","100%"),o.setAttribute("height","100%"),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("externalResourcesRequired","true"),i.appendChild(o),o.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}`))}(i)}(i,e,r)}const Wn=t(class extends n{get host(){return this}workspace;async onWorkspaceChange(t){const n=t?.id;if(!n)return;await Promise.resolve();const e=this.core.store.state.activeWorkspace?.id;e!==n&&(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;objectContextMenuItems;scaleMax=Ot;validateScaleMax(t){t>Ot?(console.warn("scaleMax cannot be greater than 1000."),this.scaleMax=Ot,this.core.store.state.scaleMax=this.scaleMax):this.core.store.state.scaleMax=t}scaleMin=Pt;validateScaleMin(t){t<Pt?(console.warn("scaleMin cannot be less than 0.0001."),this.scaleMin=Pt,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}theme="light";onThemeChange(t){this.core.themeManager.setTheme(t)}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)}wheelEnabled=!0;isLoading=!1;onIsLoadingChange(){this.syncLoadingState()}isEngineReady;activeToolChange;objectsSelectionChange;workspacesChange;activeWorkspaceChange;longpress;objectsChange;objectsAdded;objectsRemoved;objectsUpdated;undoStateChange;objectsInViewportChange;viewportChange;awarenessChange;forceUpdate=0;async triggerSelectionChange(){this.objectsSelectionChange.emit()}handleWheel(t){this.core.store.isDisabled||this.wheelEnabled&&(this.core.store.state.isContextMenuVisible&&this.hideContextMenu(),this.viewport.handleWheel(t),this.core.store.state?.activeTool?.handleWheel(t))}handlePointerDown(t){this.core.store.isDisabled||(F.isTouchDevice()&&c.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=Dt.throttle((t=>{this.viewport.handlePointerMove(t),this.core.store.state?.activeTool?.handlePointerMove(t)}),16);handlePointerMove(t){this.core.store.isDisabled||(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 n=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(),n&&(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))}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.shouldHandleKeyboardEvent(t)&&this.keyHandler.handleKeyDown(t)}handleKeyUp(t){!this.core.store.isDisabled&&this.shouldHandleKeyboardEvent(t)&&this.keyHandler.handleKeyUp(t)}shouldHandleKeyboardEvent(t){const e=t.composedPath();if(e.includes(this.host))return!0;if(e.some((t=>t instanceof n&&("DIALOG"===t.tagName||"KRITZEL-DIALOG"===t.tagName||"dialog"===t.getAttribute?.("role")||"alertdialog"===t.getAttribute?.("role")))))return!1;const r=t.target;return!r.matches?.('input, textarea, select, [contenteditable="true"], [contenteditable=""]')}preventDoubleTapZoomOnTouchDevices(t){t.cancelable&&t.preventDefault()}async registerTool(t,n,e){if("function"!=typeof n||!(n.prototype instanceof a))return console.error(`Failed to register tool "${t}": Tool class must be a constructor function`),null;const r=h.registerTool(t,n,this.core);return e&&Object.entries(e).forEach((([t,n])=>{r[t]=n})),Promise.resolve(r)}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 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.copy()}async cut(){this.core.cut()}async paste(t,n){this.core.paste(t,n)}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 f)),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 getObjectById(t){return this.core.store.allObjects.find((n=>n.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=this.core.store.state.scale,t.zIndex=this.core.store.currentZIndex,t.workspaceId=this.core.store.state.activeWorkspace.id,l.isInstanceOf(t,"KritzelText")){const n=t.content;t.editor=t.createEditor(),n&&t.setContent(n)}if(l.isInstanceOf(t,"KritzelGroup")&&t._pendingChildren.length>0){const n=new Map,e=[],r=t=>{if(0===t._pendingChildren.length)return;const i=t._pendingChildren;t._pendingChildren=[],t.childIds=[],i.forEach((i=>{const o=i.id;i.id=i.generateId(),i._core=this.core,i.scale=this.core.store.state.scale,i.zIndex=this.core.store.currentZIndex,i.workspaceId=this.core.store.state.activeWorkspace.id,n.set(o,i.id),t.childIds.push(i.id),e.push(i),l.isInstanceOf(i,"KritzelGroup")&&r(i)}))};r(t),e.forEach((t=>{l.isInstanceOf(t,"KritzelLine")&&(t.startAnchor&&n.has(t.startAnchor.objectId)&&(t.startAnchor={objectId:n.get(t.startAnchor.objectId)}),t.endAnchor&&n.has(t.endAnchor.objectId)&&(t.endAnchor={objectId:n.get(t.endAnchor.objectId)}))})),e.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.emitObjectsAdded([t]),t}async updateObject(t,n){return this.core.deselectAllObjects(),this.core.updateObject(t,n),this.core.rerender(),this.emitObjectsUpdated([{object:t,changedProperties:Object.keys(n)}]),t}async removeObject(t){const n=this.core.store.objects;return n?(this.core.deselectAllObjects(),n.remove((n=>n.id===t.id)),this.core.rerender(),this.emitObjectsRemoved([t]),t):null}async getSelectedObjects(){const t=this.core.store.selectionGroup;return t?t.objects:[]}async getDisplayableShortcuts(){return this.keyHandler.getDisplayableShortcuts()}async selectObjects(t){const n=h.getTool("selection");n&&(this.core.store.state.activeTool?.onDeactivate(),this.core.store.setState("activeTool",n),this.core.deselectAllObjects(),this.core.selectObjects(t))}async selectAllObjectsInViewport(){const t=h.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 backToContent(){return this.viewport.centerFitNearestContent(20)}async centerAllObjects(t=!0){return this.viewport.centerFitAllObjects(t)}async setViewport(t,n,e){this.viewport.setViewport(t,n,e)}async panTo(t,n){this.viewport.panTo(t,n)}async zoomTo(t,n,e){this.viewport.zoomTo(t,n,e)}async getViewport(){return this.viewport.getViewport()}async screenToWorld(t,n){return this.viewport.screenToWorld(t,n)}async worldToScreen(t,n){return this.viewport.worldToScreen(t,n)}async getCopiedObjects(){return this.core.store.state.copiedObjects||[]}async getObjectsInViewport(){return this.core.getObjectsInViewport()}async getScreenshot(t="png"){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},e={filter:t=>!("KRITZEL-CONTEXT-MENU"===t.tagName||t.classList&&t.classList.contains("debug-panel"))};let r;try{r="svg"===t?await Un(this.host,e):await async function(t,n={}){return(await async function(t,n={}){const{width:e,height:r}=cn(t,n),i=await Un(t,n),o=await hn(i),s=document.createElement("canvas"),a=s.getContext("2d"),c=n.pixelRatio||function(){let t,n;try{n=process}catch(t){}const e=n&&n.env?n.env.devicePixelRatio:null;return e&&(t=parseInt(e,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}(),u=n.canvasWidth||e,h=n.canvasHeight||r;return s.width=u*c,s.height=h*c,n.skipAutoScale||function(t){(t.width>un||t.height>un)&&(t.width>un&&t.height>un?t.width>t.height?(t.height*=un/t.width,t.width=un):(t.width*=un/t.height,t.height=un):t.width>un?(t.height*=un/t.width,t.width=un):(t.width*=un/t.height,t.height=un))}(s),s.style.width=`${u}`,s.style.height=`${h}`,n.backgroundColor&&(a.fillStyle=n.backgroundColor,a.fillRect(0,0,s.width,s.height)),a.drawImage(o,0,0,s.width,s.height),s}(t,n)).toDataURL()}(this.host,e)}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(){try{const t=`${this.core.store.state?.activeWorkspace?.name||"workspace"}-${(new Date).toISOString().replace(/[:.]/g,"-")}.png`,n=await this.getScreenshot("png");if(!n)return void console.error("Failed to export viewport as PNG: screenshot could not be generated");const e=document.createElement("a");e.download=t,e.href=n,e.click()}catch(t){console.error("Failed to export viewport as PNG:",t)}}async exportViewportAsSvg(){try{const t=`${this.core.store.state?.activeWorkspace?.name||"workspace"}-${(new Date).toISOString().replace(/[:.]/g,"-")}.svg`,n=await this.getScreenshot("svg");if(!n)return void console.error("Failed to export viewport as SVG: screenshot could not be generated");const e=document.createElement("a");e.download=t,e.href=n,e.click()}catch(t){console.error("Failed to export viewport as SVG:",t)}}async getSelectedObjectsAsSvgString(t){const n=await this.getSelectedObjects();if(!n||0===n.length)return null;const e=t?.theme??this.core.themeManager.getStoredTheme();return nn.generateSvg(n,{theme:e,padding:t?.padding??0,includeXmlDeclaration:!0})}async exportSelectedObjectsAsSvg(t){try{const n=await this.getSelectedObjectsAsSvgString(t);if(!n)return void console.warn("No objects selected for SVG export");const e=`selection-${(new Date).toISOString().replace(/[:.]/g,"-")}.svg`,r=new Blob([n],{type:"image/svg+xml;charset=utf-8"}),i=URL.createObjectURL(r),o=document.createElement("a");o.download=e,o.href=i,o.click(),URL.revokeObjectURL(i)}catch(t){console.error("Failed to export selected objects as SVG:",t)}}async getSelectedObjectsAsPngDataUrl(t){const n=await this.getSelectedObjectsAsSvgString({theme:t?.theme,padding:t?.padding});if(!n)return null;const e=t?.scale??2;return new Promise(((t,r)=>{const i=new Image,o=new Blob([n],{type:"image/svg+xml;charset=utf-8"}),s=URL.createObjectURL(o);i.onload=()=>{const n=document.createElement("canvas");n.width=i.width*e,n.height=i.height*e;const o=n.getContext("2d");if(!o)return URL.revokeObjectURL(s),void r(new Error("Failed to get canvas context"));o.scale(e,e),o.drawImage(i,0,0),URL.revokeObjectURL(s),t(n.toDataURL("image/png"))},i.onerror=()=>{URL.revokeObjectURL(s),r(new Error("Failed to load SVG for PNG conversion"))},i.src=s}))}async exportSelectedObjectsAsPng(t){try{const n=await this.getSelectedObjectsAsPngDataUrl(t);if(!n)return void console.warn("No objects selected for PNG export");const e=`selection-${(new Date).toISOString().replace(/[:.]/g,"-")}.png`,r=document.createElement("a");r.download=e,r.href=n,r.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 n=t.serialize({includeObjects:!0});return JSON.stringify(n,null,2)}async importFromJson(t){const n=JSON.parse(t);if(!n.__class__||"KritzelWorkspace"!==n.__class__)throw new Error("Invalid workspace data: missing or incorrect __class__ identifier");n.version&&n.version!==M&&console.warn(`Workspace version mismatch: expected ${M}, got ${n.version}`);const e=_.generateUUID();let r=n.viewport||{centerWorldX:0,centerWorldY:0,scale:1};if("translateX"in r&&!("centerWorldX"in r)){const t=r.scale??1;r={centerWorldX:-(r.translateX??0)/t,centerWorldY:-(r.translateY??0)/t,scale:t}}const i=new S(e,n.name||"Imported Workspace",r);if(this.core.createWorkspace(i),this.workspacesChange.emit(this.core.store.state.workspaces),this.core.beforeWorkspaceChange(),await this.core.initializeWorkspace(i),n.objects&&Array.isArray(n.objects)){const t=new Ht(this.core);for(const r of n.objects){const n=t.revive(r);n&&(n.workspaceId=e,this.core.addObject(n))}}this.core.rerender(),this.activeWorkspaceChange.emit(i)}async loadObjectsFromJson(t){const n=JSON.parse(t);if(!n.__class__||"KritzelWorkspace"!==n.__class__)throw new Error("Invalid workspace data: missing or incorrect __class__ identifier");n.version&&n.version!==M&&console.warn(`Workspace version mismatch: expected ${M}, got ${n.version}`);const e=this.core.store.state.activeWorkspace;if(!e)throw new Error("Cannot load objects: no active workspace is loaded");const r=e.id;let i=0;if(n.objects&&Array.isArray(n.objects)){const t=new Ht(this.core);for(const e of n.objects){const n=t.revive(e);n&&(n.workspaceId=r,this.core.addObject(n),i++)}}return this.core.rerender(),i}async downloadAsJson(t){try{const n=await this.exportAsJson(),e=this.core.store.state?.activeWorkspace?.name||"workspace",r=(new Date).toISOString().replace(/[:.]/g,"-"),i=t||`${e}-${r}`,o=new Blob([n],{type:"application/json;charset=utf-8"}),s=URL.createObjectURL(o),a=document.createElement("a");a.download=`${i}.json`,a.href=s,a.click(),URL.revokeObjectURL(s)}catch(t){console.error("Failed to download workspace as JSON:",t)}}async importFromFile(){return new Promise(((t,n)=>{const e=document.createElement("input");e.type="file",e.accept=".json,application/json",e.style.display="none";const r=()=>{e.removeEventListener("change",i),e.removeEventListener("cancel",o),document.body.removeChild(e)},i=async e=>{const i=e.target,o=i.files?.[0];if(!o)return r(),void t();try{const e=new FileReader;e.onload=async e=>{try{const n=e.target?.result;await this.importFromJson(n),r(),t()}catch(t){r(),console.error("Failed to import workspace from file:",t),n(t)}},e.onerror=()=>{r(),console.error("Failed to read file:",e.error),n(e.error)},e.readAsText(o)}catch(t){r(),console.error("Failed to process file:",t),n(t)}},o=()=>{r(),t()};e.addEventListener("change",i),e.addEventListener("cancel",o),document.body.appendChild(e),e.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 n=t;let e=this.core.getWorkspaces().find((t=>t.id===n));e?e.isPublic=!0:(e=new S(n,"Shared Workspace"),e.isPublic=!0,this.core.createWorkspace(e)),this.workspacesChange.emit(this.core.store.state.workspaces),this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(e),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()}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;_defaultUndoState={canUndo:!1,canRedo:!1,undoStackSize:0,redoStackSize:0};syncLoadingState(){this.core.store.state.isLoading=this._isWorkspaceLoading||this.isLoading}get isSelecting(){return this.core.store.state.activeTool instanceof v&&this.core.store.state.isSelecting}get isSelectionActive(){return this.core.store.state.activeTool instanceof v&&null!==this.core.store.selectionGroup}constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.isEngineReady=e(this,"isEngineReady"),this.activeToolChange=e(this,"activeToolChange"),this.objectsSelectionChange=e(this,"objectsSelectionChange"),this.workspacesChange=e(this,"workspacesChange"),this.activeWorkspaceChange=e(this,"activeWorkspaceChange"),this.longpress=e(this,"longpress"),this.objectsChange=e(this,"objectsChange"),this.objectsAdded=e(this,"objectsAdded"),this.objectsRemoved=e(this,"objectsRemoved"),this.objectsUpdated=e(this,"objectsUpdated"),this.undoStateChange=e(this,"undoStateChange"),this.objectsInViewportChange=e(this,"objectsInViewportChange"),this.viewportChange=e(this,"viewportChange"),this.awarenessChange=e(this,"awarenessChange"),this.core=new tn(this)}disconnectedCallback(){this.throttledPointerMoveMulti.cancel(),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()}componentWillLoad(){this.core.setEditorId(this.editorId),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 Vt(this.core,this.globalContextMenuItems,this.objectContextMenuItems),this.keyHandler=new Kt(this.core),this.viewport=new Ft(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.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}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 n=this.core.store.state.activeWorkspace;n&&this.activeWorkspaceChange.emit(n),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,n=!0){const e=this.core.getWorkspaces().find((n=>n.id===t));e?this.core.store.state.activeWorkspace?.id!==e.id&&(this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(e),this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace)):n&&console.warn(`[KritzelEngine] No workspace found with ID: ${t}`)}async initializeWorkspaceIfNeeded(t,n){const e=t?.id??null,r=e??(n?.skipFallbackCreation?"__NO_FALLBACK__":"__AUTO__");if(e&&this.core.store.state.activeWorkspace?.id===e)return;if(this._workspaceInitializationPromise&&this._workspaceInitializationTargetKey===r)return void await this._workspaceInitializationPromise;this._isWorkspaceLoading=!0,this.syncLoadingState();const i=this.core.initializeWorkspace(t,n);this._workspaceInitializationPromise=i,this._workspaceInitializationTargetKey=r;try{await i}finally{this._workspaceInitializationPromise===i&&(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 n=t.undoState,e=null!==this.core.store.selectionGroup;this.objectsChange.emit(this.core.store.allObjects),this.undoStateChange.emit(n),this._lastHadSelectionGroup!==e&&(this._lastHadSelectionGroup=e,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 v||(this.core.clearSelection(),this.core.store.objects?.remove((t=>t instanceof f)),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 y||this.core.resetActiveText(),t instanceof g||this.core.resetActiveShape(),this.core.store.state.skipContextMenu=!1,this.core.store.state.copiedObjects=void 0,t&&this.activeToolChange.emit(t),$.forceHideKeyboard(),this.core.rerender()}render(){if(!this.viewport)return r(i,null,this.core.store.state.isLoading&&r("div",{class:"workspace-loading-overlay"},r("span",{class:"workspace-loading-spinner"}),"Loading..."));const t=this.core.themeManager.getStoredTheme(),n=window.getComputedStyle(this.host).getPropertyValue("--kritzel-selection-handle-size").trim()||"6px",e=parseFloat(n),o=2*e<14?14:e,s=this.core.store.state.viewportWidth/2+this.core.store.state.translateX,a=this.core.store.state.viewportHeight/2+this.core.store.state.translateY,c=this.core.store.objectsInViewport;return this.core.cursorManager.applyCursor(),this.core.store.state.hasViewportChanged&&(this.viewportChange.emit(this.viewport.getViewport()),this.core.store.totalObjectCount>0&&this.emitObjectsInViewportChange()),r(i,null,this.core.store.state.isLoading&&r("div",{class:"workspace-loading-overlay"},r("span",{class:"workspace-loading-spinner"}),"Loading..."),this.core.store.state.debugInfo.showViewportInfo&&r("div",{class:"debug-panel"},r("div",null,"ActiveWorkspaceId: ",this.core.store.state?.activeWorkspace?.id),r("div",null,"ActiveWorkspaceName: ",this.core.store.state?.activeWorkspace?.name),r("div",null,"TranslateX: ",this.core.store.state?.translateX),r("div",null,"TranslateY: ",this.core.store.state?.translateY),r("div",null,"ViewportWidth: ",this.core.store.state?.viewportWidth),r("div",null,"ViewportHeight: ",this.core.store.state?.viewportHeight),r("div",null,"PointerCount: ",this.core.store.state.pointers.size),r("div",null,"Scale: ",this.core.store.state?.scale),r("div",null,"ActiveTool: ",this.core.store.state?.activeTool?.name),r("div",null,"HasViewportChanged: ",this.core.store.state?.hasViewportChanged?"true":"false"),r("div",null,"IsEnabled: ",this.core.store.state?.isEnabled?"true":"false"),r("div",null,"IsScaling: ",this.core.store.state?.isScaling?"true":"false"),r("div",null,"IsPanning: ",this.core.store.state?.isPanning?"true":"false"),r("div",null,"IsSelecting: ",this.isSelecting?"true":"false"),r("div",null,"IsSelectionActive: ",this.isSelectionActive?"true":"false"),r("div",null,"IsResizeHandleSelected: ",this.core.store.state.isResizeHandleSelected?"true":"false"),r("div",null,"IsRotationHandleSelected: ",this.core.store.state.isRotationHandleSelected?"true":"false"),r("div",null,"IsRotationHandleHovered: ",this.core.store.state.isRotationHandleHovered?"true":"false"),r("div",null,"IsDrawing: ",this.core.store.state.isDrawing?"true":"false"),r("div",null,"IsWriting: ",this.core.store.state.isWriting?"true":"false"),r("div",null,"IsPointerDown: ",this.core.store.isPointerDown?"true":"false"),r("div",null,"PointerX: ",this.core.store.state?.pointerX),r("div",null,"PointerY: ",this.core.store.state?.pointerY),r("div",null,"TotalObjects: ",this.core.store.totalObjectCount),r("div",null,"ObjectsInViewport: ",this.core.store.objectsInViewport.length),r("div",null,"SelectedObjects: ",this.core.store.selectionGroup?.objects.length||0),r("div",null,"ViewportCenter: (",s.toFixed(2),", ",a.toFixed(2),")")),r("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})`}},c?.map((n=>r("div",{key:n.id,id:n.id,class:"object",style:{transform:n?.transformationMatrix,transformOrigin:"top left",position:"absolute",zIndex:n.zIndex.toString(),pointerEvents:this.core.store.state.isScaling?"none":"auto"}},l.isInstanceOf(n,"KritzelPath")&&(()=>{const e=(n.markedForRemoval?.5:1)*n.opacity;return r("svg",{ref:t=>t&&n.mount(t),xmlns:"http://www.w3.org/2000/svg",style:{height:n?.totalHeight+"px",width:n?.totalWidth+"px",left:"0",top:"0",position:"absolute",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,pointerEvents:n.markedForRemoval?"none":"auto",overflow:"visible"},viewBox:n?.viewBox},r("path",{d:n?.d,fill:D.applyOpacity(n.fill,e,t),stroke:D.applyOpacity(n?.stroke,e,t),"shape-rendering":n.isLowRes()?"optimizeSpeed":"auto"}))})(),l.isInstanceOf(n,"KritzelLine")&&(()=>{const e=(n.markedForRemoval?.5:1)*n.opacity;return r("svg",{ref:t=>t&&n.mount(t),xmlns:"http://www.w3.org/2000/svg",style:{height:n?.totalHeight+"px",width:n?.totalWidth+"px",left:"0",top:"0",position:"absolute",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,pointerEvents:n.markedForRemoval?"none":"auto",overflow:"visible"},viewBox:n?.viewBox},(n.hasStartArrow||n.hasEndArrow)&&r("defs",null,n.hasStartArrow&&r("marker",{id:n.startMarkerId,markerWidth:n.getArrowSize("start"),markerHeight:n.getArrowSize("start"),refX:0,refY:n.getArrowSize("start")/2,orient:"auto-start-reverse",markerUnits:"userSpaceOnUse"},r("path",{d:n.getArrowPath(n.arrows?.start?.style),fill:D.applyOpacity(n.getArrowFill("start"),e),transform:`scale(${n.getArrowSize("start")/10})`})),n.hasEndArrow&&r("marker",{id:n.endMarkerId,markerWidth:n.getArrowSize("end"),markerHeight:n.getArrowSize("end"),refX:0,refY:n.getArrowSize("end")/2,orient:"auto",markerUnits:"userSpaceOnUse"},r("path",{d:n.getArrowPath(n.arrows?.end?.style),fill:D.applyOpacity(n.getArrowFill("end"),e),transform:`scale(${n.getArrowSize("end")/10})`}))),r("path",{d:this.core.anchorManager.computeClippedLinePath(n),fill:"none",stroke:"transparent","stroke-width":Math.max(n?.strokeWidth||0,10),"stroke-linecap":"round"}),r("path",{d:this.core.anchorManager.computeClippedLinePath(n),fill:"none",stroke:D.applyOpacity(n?.stroke,e,t),"stroke-width":n?.strokeWidth,"stroke-linecap":"round","marker-start":n.hasStartArrow?`url(#${n.startMarkerId})`:void 0,"marker-end":n.hasEndArrow?`url(#${n.endMarkerId})`:void 0}))})(),l.isInstanceOf(n,"KritzelImage")&&"ready"===n.loadState&&r("img",{ref:t=>t&&n.mount(t),src:n.resolvedSrc||n.src,style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto",backgroundColor:D.resolveThemeColor(n.backgroundColor,t),borderColor:D.resolveThemeColor(n.borderColor,t),borderWidth:n.borderWidth+"px",borderStyle:"solid",padding:n.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()}),l.isInstanceOf(n,"KritzelImage")&&"ready"!==n.loadState&&r("div",{ref:()=>n.ensureLoaded(),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto",backgroundColor:D.resolveThemeColor({light:"#e5e7eb",dark:"#2a2a2a"},t),borderColor:D.resolveThemeColor("error"===n.loadState?{light:"#9ca3af",dark:"#6b7280"}:n.borderColor,t),borderWidth:"error"===n.loadState?"1px":n.borderWidth+"px",borderStyle:"solid",padding:n.padding+"px",overflow:"hidden",userSelect:"none",display:"flex",alignItems:"center",justifyContent:"center"}},r("kritzel-icon",{name:"error"===n.loadState?"image-off":"image",size:Math.max(16,.3*Math.min(n.totalWidth,n.totalHeight)),style:{color:D.resolveThemeColor({light:"#9ca3af",dark:"#6b7280"},t)}})),l.isInstanceOf(n,"KritzelCustomElement")&&r("div",{ref:t=>t&&n.mount(t),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto",backgroundColor:D.resolveThemeColor(n.backgroundColor,t),borderColor:D.resolveThemeColor(n.borderColor,t),borderWidth:n.borderWidth+"px",borderStyle:"solid",padding:n.padding+"px",overflow:"hidden",display:"block"}}),l.isInstanceOf(n,"KritzelSelectionGroup")&&!this.core.displaySelectionLineUI(n)&&r("div",{ref:t=>t&&n.mount(t),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto"}}),l.isInstanceOf(n,"KritzelSelectionBox")&&r("div",{ref:t=>t&&n.mount(t),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto",backgroundColor:D.resolveThemeColor(n.backgroundColor,t),borderColor:D.resolveThemeColor(n.borderColor,t),borderWidth:n.borderWidth+"px",borderStyle:"solid"}}),l.isInstanceOf(n,"KritzelText")&&r("div",{style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto"}},r("div",{id:"text-object",ref:t=>t&&n.mount(t),onPointerDown:t=>n.handlePointerDown(t),onPointerMove:t=>n.handlePointerMove(t),onPointerUp:t=>n.handlePointerUp(t),style:{minWidth:n.initialWidth+"px",minHeight:n.initialHeight+"px",maxWidth:"500px",height:"auto",width:"max-content",transformOrigin:"top left",transform:`scale(${n.scaleFactor})`,backgroundColor:D.resolveThemeColor(n.backgroundColor,t),overflow:"visible"}})),l.isInstanceOf(n,"KritzelShape")&&(()=>{const e=(n.markedForRemoval?.5:1)*n.opacity;return r("div",{ref:t=>t&&n.mount(t),onPointerDown:t=>n.handlePointerDown(t),onPointerMove:t=>n.handlePointerMove(t),onPointerUp:t=>n.handlePointerUp(t),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,pointerEvents:n.markedForRemoval?"none":"auto",overflow:"visible"}},r("svg",{xmlns:"http://www.w3.org/2000/svg",style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",overflow:"visible",pointerEvents:"none"},viewBox:n.viewBox,preserveAspectRatio:"none"},r("path",{d:n.getSvgPath(),fill:D.applyOpacity(n.fillColor,e,t),stroke:D.applyOpacity(n.strokeColor,e,t),"stroke-width":n.strokeWidth})),r("div",{ref:t=>t&&n.mountTextEditor(t),style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center",textAlign:"center",overflow:"hidden",pointerEvents:n.isEditing?"auto":"none"}}))})(),this.core.store.state.debugInfo.showObjectInfo&&n.isDebugInfoVisible&&r("div",{style:{pointerEvents:"none",position:"absolute",left:`${n.totalWidth}px`,top:"0",zIndex:(n.zIndex+2).toString()}},r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"Id: ",n.id),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"userId: ",n.userId),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"width: ",n.width),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"height: ",n.height),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"translateX: ",n.translateX),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"translateY: ",n.translateY),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"rotationDegrees: ",n.rotationDegrees),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"zIndex: ",n.zIndex),l.isInstanceOf(n,"KritzelImage")&&r("div",null,r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"assetId: ",n.assetId),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"mimeType: ",n.mimeType))),(this.core.displaySelectionGroupUI(n)||this.core.displaySelectionLineUI(n))&&(()=>{const i=l.isInstanceOf(n,"KritzelSelectionGroup"),s=this.core.store.objects?.localClientId,a=this.core.store.objects?.awareness?.getStates(),c=i&&(null!=n.userId&&null!=this.core.user?.id&&n.userId!==this.core.user.id||null!=n.userId&&null!=this.core.user?.id&&n.userId===this.core.user.id&&null!=n.clientId&&null!=s&&n.clientId!==s&&!0===a?.has(n.clientId));let u;if(c&&a&&(i&&null!=n.clientId&&(u=a.get(n.clientId)?.user?.color),!u))for(const t of a.values())if(t.user?.id===n.userId){u=t.user.color;break}const h=u??(D.resolveThemeColor(n.borderColor,t)||"var(--kritzel-selection-border-color, #007AFF)"),f=u??"var(--kritzel-selection-handle-stroke-color, #007AFF)";return r("svg",{xmlns:"http://www.w3.org/2000/svg",style:{zIndex:(n.zIndex+1).toString(),height:n?.totalHeight.toString(),width:n?.totalWidth.toString(),left:"0",top:"0",position:"absolute",transform:`rotate(${n.rotationDegrees}deg)`,transformOrigin:`${n.totalWidth/2}px ${n.totalHeight/2}px`,overflow:"visible",pointerEvents:"none"}},this.core.displaySelectionGroupUI(n)&&r("g",{class:"selection-group-ui",style:{pointerEvents:"none"}},(()=>{const t=c&&l.isInstanceOf(n,"KritzelSelectionGroup")&&1===n.objects.length&&l.isInstanceOf(n.objects[0],"KritzelLine")?n.objects[0]:null;return t?r("g",{class:"selection-line-borders"},r("path",{class:"selection-line-border",d:this.core.anchorManager.computeClippedLinePath(t,!0),style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"round",fill:"none"}})):r("g",{class:"selection-group-borders"},r("line",{x1:"0",y1:"0",x2:n.totalWidth,y2:"0",style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),r("line",{x1:"0",y1:"0",x2:"0",y2:n.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),r("line",{x1:"0",y1:n.totalHeight,x2:n.totalWidth,y2:n.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),r("line",{x1:n.totalWidth,y1:"0",x2:n.totalWidth,y2:n.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}))})(),!this.isSelecting&&!c&&r("g",{class:"selection-group-handles",style:{pointerEvents:"auto"}},r("rect",{class:"resize-handle top-left",x:""+-(e-1)*n.scale/this.core.store.state?.scale,y:""+-(e-1)*n.scale/this.core.store.state?.scale,width:""+2*(e-1)*n.scale/this.core.store.state?.scale,height:""+2*(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("rect",{class:"resize-handle-overlay top-left",x:""+-o*n.scale/this.core.store.state?.scale,y:""+-o*n.scale/this.core.store.state?.scale,width:""+2*o*n.scale/this.core.store.state?.scale,height:""+2*o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("rect",{class:"resize-handle top-right",x:""+(n.totalWidth-(e-1)*n.scale/this.core.store.state?.scale),y:""+-(e-1)*n.scale/this.core.store.state?.scale,width:""+2*(e-1)*n.scale/this.core.store.state?.scale,height:""+2*(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("rect",{class:"resize-handle-overlay top-right",x:""+(n.totalWidth-o*n.scale/this.core.store.state?.scale),y:""+-o*n.scale/this.core.store.state?.scale,width:""+2*o*n.scale/this.core.store.state?.scale,height:""+2*o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("rect",{class:"resize-handle bottom-left",x:""+-(e-1)*n.scale/this.core.store.state?.scale,y:""+(n.totalHeight-(e-1)*n.scale/this.core.store.state?.scale),width:""+2*(e-1)*n.scale/this.core.store.state?.scale,height:""+2*(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("rect",{class:"resize-handle-overlay bottom-left",x:""+-o*n.scale/this.core.store.state?.scale,y:""+(n.totalHeight-o*n.scale/this.core.store.state?.scale),width:""+2*o*n.scale/this.core.store.state?.scale,height:""+2*o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("rect",{class:"resize-handle bottom-right",x:""+(n.totalWidth-(e-1)*n.scale/this.core.store.state?.scale),y:""+(n.totalHeight-(e-1)*n.scale/this.core.store.state?.scale),width:""+2*(e-1)*n.scale/this.core.store.state?.scale,height:""+2*(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("rect",{class:"resize-handle-overlay bottom-right",x:""+(n.totalWidth-o*n.scale/this.core.store.state?.scale),y:""+(n.totalHeight-o*n.scale/this.core.store.state?.scale),width:""+2*o*n.scale/this.core.store.state?.scale,height:""+2*o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("line",{x1:n.totalWidth/2,y1:"0",x2:n.totalWidth/2,y2:-15*n.scale/this.core.store.state?.scale,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`}}),r("circle",{class:"rotation-handle",cx:n.totalWidth/2,cy:-15*n.scale/this.core.store.state?.scale,r:""+(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("circle",{class:"rotation-handle-overlay",cx:n.totalWidth/2,cy:-15*n.scale/this.core.store.state?.scale,r:""+o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}))),this.core.displaySelectionLineUI(n)&&l.isInstanceOf(n,"KritzelLine")&&r("g",{class:"selection-line-ui",style:{pointerEvents:"none"}},r("g",{class:"selection-line-borders"},r("path",{class:"selection-line-border",d:this.core.anchorManager.computeClippedLinePath(n,!0),style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"round",fill:"none"}})),!this.isSelecting&&!c&&r("g",{class:"selection-line-handles",style:{pointerEvents:"auto"}},r("circle",{class:"selection-line-handle start",cx:n.startX-n.x,cy:n.startY-n.y,r:""+(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #000000)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("circle",{class:"selection-line-handle-overlay start","data-testid":"line-handle-start",cx:n.startX-n.x,cy:n.startY-n.y,r:""+o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("circle",{class:"selection-line-handle center",cx:void 0!==n.controlX?(n.startX+2*n.controlX+n.endX)/4-n.x:(n.startX-n.x+n.endX-n.x)/2,cy:void 0!==n.controlY?(n.startY+2*n.controlY+n.endY)/4-n.y:(n.startY-n.y+n.endY-n.y)/2,r:""+(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #000000)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("circle",{class:"selection-line-handle-overlay center","data-testid":"line-handle-center",cx:void 0!==n.controlX?(n.startX+2*n.controlX+n.endX)/4-n.x:(n.startX-n.x+n.endX-n.x)/2,cy:void 0!==n.controlY?(n.startY+2*n.controlY+n.endY)/4-n.y:(n.startY-n.y+n.endY-n.y)/2,r:""+o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("circle",{class:"selection-line-handle end",cx:n.endX-n.x,cy:n.endY-n.y,r:""+(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #000000)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("circle",{class:"selection-line-handle-overlay end","data-testid":"line-handle-end",cx:n.endX-n.x,cy:n.endY-n.y,r:""+o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}))))})()))),(()=>{const t=this.core.anchorManager.getAnchorLinesRenderData();return t?r("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&&r("g",{class:"anchor-line-start"},t.startAnchorViz.pathD?r("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"}}):r("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"}}),r("circle",{cx:t.startAnchorViz.centerX,cy:t.startAnchorViz.centerY,r:t.indicatorRadius,style:{fill:"var(--kritzel-snap-indicator-fill, rgba(0, 0, 0))",stroke:"var(--kritzel-snap-indicator-stroke, #007bff)",strokeWidth:t.indicatorStrokeWidth}})),t.endAnchorViz&&r("g",{class:"anchor-line-end"},t.endAnchorViz.pathD?r("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"}}):r("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"}}),r("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})(),(()=>{const t=this.core.anchorManager.getSnapIndicatorRenderData();return t?r("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"}},r("g",null,t.snapLinePath?r("path",{d:t.snapLinePath,fill:"none",style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))",strokeWidth:t.lineStrokeWidth,strokeDasharray:t.dashArray,strokeLinecap:"round"}}):void 0!==t.edgeX&&void 0!==t.edgeY&&r("line",{x1:t.edgeX,y1:t.edgeY,x2:t.centerX,y2:t.centerY,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))",strokeWidth:t.lineStrokeWidth,strokeDasharray:t.dashArray,strokeLinecap:"round"}}),r("circle",{cx:t.centerX,cy:t.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&&r("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:"fixed",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.translateX+this.core.store.state.contextMenuX)/this.core.store.state.scale,y:(-this.core.store.state.translateY+this.core.store.state.contextMenuY)/this.core.store.state.scale},this.core.store.selectionGroup?.objects||[]),this.hideContextMenu()},onClose:()=>this.hideContextMenu()}),this.core.store.objects?.hasAwareness&&r("kritzel-awareness-cursors",{core:this.core}),this.core.store.state?.activeTool instanceof H&&!this.core.store.state.isScaling&&r("kritzel-cursor-trail",{core:this.core}))}static get watchers(){return{workspace:[{onWorkspaceChange:0}],activeWorkspaceId:[{onActiveWorkspaceIdChange:0}],syncConfig:[{onSyncConfigChange:0}],assetStorageConfig:[{onAssetStorageConfigChange:0}],user:[{onUserChange:0}],scaleMax:[{validateScaleMax:0}],scaleMin:[{validateScaleMin:0}],cursorTarget:[{onCursorTargetChange:0}],lockDrawingScale:[{onLockDrawingScaleChange:0}],theme:[{onThemeChange: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"],theme:[1],viewportBoundaryLeft:[2,"viewport-boundary-left"],viewportBoundaryRight:[2,"viewport-boundary-right"],viewportBoundaryTop:[2,"viewport-boundary-top"],viewportBoundaryBottom:[2,"viewport-boundary-bottom"],debugInfo:[16],wheelEnabled:[4,"wheel-enabled"],isLoading:[4,"is-loading"],forceUpdate:[32],triggerSelectionChange:[64],registerTool:[64],changeActiveTool:[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],getObjectById:[64],getAllObjects:[64],findObjects:[64],getObjectsTotalCount:[64],addObject:[64],updateObject:[64],removeObject:[64],getSelectedObjects:[64],getDisplayableShortcuts:[64],selectObjects:[64],selectAllObjectsInViewport:[64],clearSelection:[64],centerObjectInViewport:[64],backToContent:[64],centerAllObjects:[64],setViewport:[64],panTo:[64],zoomTo:[64],getViewport:[64],screenToWorld:[64],worldToScreen:[64],getCopiedObjects:[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]},[[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"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{workspace:[{onWorkspaceChange:0}],activeWorkspaceId:[{onActiveWorkspaceIdChange:0}],syncConfig:[{onSyncConfigChange:0}],assetStorageConfig:[{onAssetStorageConfigChange:0}],user:[{onUserChange:0}],scaleMax:[{validateScaleMax:0}],scaleMin:[{validateScaleMin:0}],cursorTarget:[{onCursorTargetChange:0}],lockDrawingScale:[{onLockDrawingScaleChange:0}],theme:[{onThemeChange:0}],viewportBoundaryLeft:[{onViewportBoundaryLeftChange:0}],viewportBoundaryRight:[{onViewportBoundaryRightChange:0}],viewportBoundaryTop:[{onViewportBoundaryTopChange:0}],viewportBoundaryBottom:[{onViewportBoundaryBottomChange:0}],debugInfo:[{onDebugInfoChange:0}],isLoading:[{onIsLoadingChange:0}]}]);function Rn(){"undefined"!=typeof customElements&&["kritzel-engine","kritzel-awareness-cursors","kritzel-context-menu","kritzel-cursor-trail","kritzel-icon"].forEach((t=>{switch(t){case"kritzel-engine":customElements.get(o(t))||customElements.define(o(t),Wn);break;case"kritzel-awareness-cursors":customElements.get(o(t))||K();break;case"kritzel-context-menu":customElements.get(o(t))||E();break;case"kritzel-cursor-trail":customElements.get(o(t))||V();break;case"kritzel-icon":customElements.get(o(t))||R()}}))}export{Et as A,Bt as D,Ct as I,H as K,_t as W,Mt as a,jt as b,zt as c,It as d,Ot as e,Pt as f,Rn as g,Wn as h,Tt as r}
9
+ */class Ft{_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,n){this._core=t,this._core.store.state.host=n,this._core.store.state.viewportWidth=n.clientWidth,this._core.store.state.viewportHeight=n.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=Dt.debounce((()=>{this._core.updateWorkspaceViewport(this._core.store.state.translateX,this._core.store.state.translateY,this._core.store.state.scale)}),300),this._debounceEndScaling=Dt.debounce((()=>{this._core.store.state.isScaling=!1,this._core.rerender()}),100)}cancelPendingUpdates(){this._debounceUpdate.cancel()}clampTranslate(t,n){const e=this._core.store.state,{scale:r,viewportWidth:i,viewportHeight:o}=e,{viewportBoundaryLeft:s,viewportBoundaryRight:a,viewportBoundaryTop:c,viewportBoundaryBottom:u}=e,h=-s*r,l=i-a*r,f=-c*r,d=o-u*r;let p=t,v=n;return Number.isFinite(l)&&Number.isFinite(h)?p=Math.max(l,Math.min(h,t)):Number.isFinite(l)?p=Math.max(l,t):Number.isFinite(h)&&(p=Math.min(h,t)),Number.isFinite(d)&&Number.isFinite(f)?v=Math.max(d,Math.min(f,n)):Number.isFinite(d)?v=Math.max(d,n):Number.isFinite(f)&&(v=Math.min(f,n)),{translateX:p,translateY:v}}getEffectiveMinScale(){const t=this._core.store.state,{viewportWidth:n,viewportHeight:e,scaleMin:r}=t,{viewportBoundaryLeft:i,viewportBoundaryRight:o,viewportBoundaryTop:s,viewportBoundaryBottom:a}=t,c=o-i,u=a-s;if(!Number.isFinite(c)||!Number.isFinite(u))return r;const h=Math.max(c>0?n/c:r,u>0?e/u:r);return Math.max(r,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 n=t.clientX-this._core.store.offsetX,e=t.clientY-this._core.store.offsetY;t.button===s.Right&&(this._core.store.state.isPanning=!0,this._core.store.state.startX=n,this._core.store.state.startY=e)}if("touch"===t.pointerType||"pen"===t.pointerType){const n=Array.from(this._core.store.state.pointers.values());if(1===n.length&&(this._touchStartScreenX=t.clientX,this._touchStartScreenY=t.clientY,this._touchCursorBroadcastActive=!1),2===n.length){this._core.store.objects?.clearCursorPosition();const t=this._core.store.currentPath;t&&this._core.store.objects.remove((n=>n.id===t.id)),this._core.store.state.isSelecting&&(this._core.store.state.isSelecting=!1,this._core.store.objects.remove((t=>t instanceof f)),this._core.store.setSelectionBox(null),this._core.store.selectedObjects.forEach((t=>{t.isSelected=!1}))),this._core.store.state.isScaling=!0;const e=n[0].clientX-this._core.store.offsetX,r=n[0].clientY-this._core.store.offsetY,i=n[1].clientX-this._core.store.offsetX,o=n[1].clientY-this._core.store.offsetY;this.initialTouchDistance=Math.sqrt(Math.pow(e-i,2)+Math.pow(r-o,2)),this.startX=(e+i)/2,this.startY=(r+o)/2,this._core.rerender()}}}handlePointerMove(t){if("mouse"===t.pointerType){const n=this._core.store.host.getBoundingClientRect(),e=t.clientX-n.left,r=t.clientY-n.top;if(this._core.store.state.pointerX=(e-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(r-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+(e-this._core.store.state.startX),this._core.store.state.translateY+(r-this._core.store.state.startY));this._core.store.state.translateX=t.translateX,this._core.store.state.translateY=t.translateY,this._core.store.state.startX=e,this._core.store.state.startY=r,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 n=this._core.store.host.getBoundingClientRect(),e=t.clientX-n.left,r=t.clientY-n.top,i=Array.from(this._core.store.state.pointers.values());if(this._core.store.state.isScaling||i.length>1)this._core.store.objects?.clearCursorPosition();else{if(this._core.store.state.pointerX=(e-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(r-this._core.store.state.translateY)/this._core.store.state.scale,!this._touchCursorBroadcastActive){const n=t.clientX-this._touchStartScreenX,e=t.clientY-this._touchStartScreenY;Math.sqrt(n*n+e*e)>=Ft.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===i.length){const t=i[0].clientX-this._core.store.offsetX,n=i[0].clientY-this._core.store.offsetY,e=i[1].clientX-this._core.store.offsetX,r=i[1].clientY-this._core.store.offsetY,o=Math.sqrt(Math.pow(t-e,2)+Math.pow(n-r,2)),s=(t+e)/2,a=(n+r)/2,c=o/this.initialTouchDistance,u=this._core.store.state.scale*c,h=this.getEffectiveMinScale();if(u>this._core.store.state.scaleMax||u<h){const t=this.clampTranslate(this._core.store.state.translateX+s-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+s-this.startX-(s-this._core.store.state.translateX)*(c-1),n=this._core.store.state.translateY+a-this.startY-(a-this._core.store.state.translateY)*(c-1);this._core.store.state.scale=u;const e=this.clampTranslate(t,n);this._core.store.state.translateX=e.translateX,this._core.store.state.translateY=e.translateY,this.initialTouchDistance=o}this.startX=s,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,n){const e=this._core.store.state;return{x:(t-e.translateX)/e.scale,y:(n-e.translateY)/e.scale}}worldToScreen(t,n){const e=this._core.store.state;return{x:t*e.scale+e.translateX,y:n*e.scale+e.translateY}}setViewport(t,n,e){const r=this._core.store.state,i=Math.min(r.scaleMax,Math.max(this.getEffectiveMinScale(),e));this.animateViewportTo(r.viewportWidth/2-t*i,r.viewportHeight/2-n*i,i)}panTo(t,n){this.setViewport(t,n,this._core.store.state.scale)}zoomTo(t,n,e){const r=this._core.store.state;void 0!==n&&void 0!==e?this.setViewport(n,e,t):this.setViewport((r.viewportWidth/2-r.translateX)/r.scale,(r.viewportHeight/2-r.translateY)/r.scale,t)}centerInViewport(t){const{scale:n,viewportWidth:e,viewportHeight:r}=this._core.store.state,{x:i,y:o,width:s,height:a}=t.rotatedBoundingBox,c=this.clampTranslate(e/2-(i+s/2)*n,r/2-(o+a/2)*n);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 n=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),e=Math.max(n,this.getEffectiveMinScale());this._core.store.state.scale=e,this.centerInViewport(t)}handleZoom(t){this._core.store.state.isScaling=!0;const n=this._core.store.host.getBoundingClientRect(),e=t.clientX-n.left,r=t.clientY-n.top;this._core.store.state.pointerX=(e-this._core.store.state.translateX)/this._core.store.state.scale,this._core.store.state.pointerY=(r-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 i=Math.max(.8,Math.min(1.2,1+-.012*t.deltaY)),o=this.getEffectiveMinScale(),s=Math.min(this._core.store.state.scaleMax,Math.max(o,this._core.store.state.scale*i)),a=s/this._core.store.state.scale,c=(e-this._core.store.state.translateX)*(a-1),u=(r-this._core.store.state.translateY)*(a-1);this._core.store.state.scale=s;let h=this._core.store.state.translateX-c;0!==t.deltaX&&(h-=.8*t.deltaX);const l=this.clampTranslate(h,this._core.store.state.translateY-u);this._core.store.state.translateX=l.translateX,this._core.store.state.translateY=l.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate(),this._debounceEndScaling()}handlePan(t){const n=this.clampTranslate(this._core.store.state.translateX-.8*t.deltaX,this._core.store.state.translateY-.8*t.deltaY);this._core.store.state.translateX=n.translateX,this._core.store.state.translateY=n.translateY,this._core.store.state.hasViewportChanged=!0,this._core.rerender(),this._debounceUpdate()}cancelViewportAnimation(){null!==this._animationFrameId&&(cancelAnimationFrame(this._animationFrameId),this._animationFrameId=null)}animateViewportTo(t,n,e,r=150){this.cancelViewportAnimation();const i=this._core.store.state.translateX,o=this._core.store.state.translateY,s=this._core.store.state.scale,a=performance.now();this._core.store.state.isScaling=!0;const c=u=>{const h=Math.min((u-a)/r,1),l=1-Math.pow(1-h,3);this._core.store.state.scale=s+(e-s)*l;const f=this.clampTranslate(i+(t-i)*l,o+(n-o)*l);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 n=this._core.store.allNonSelectionObjects;if(0===n.length)return!1;const e=-this._core.store.state.translateX/this._core.store.state.scale+this._core.store.state.viewportWidth/2/this._core.store.state.scale,r=-this._core.store.state.translateY/this._core.store.state.scale+this._core.store.state.viewportHeight/2/this._core.store.state.scale,i=n.map((t=>{const n=t.rotatedBoundingBox,i=n.y+n.height/2;return{obj:t,distance:Math.sqrt(Math.pow(n.x+n.width/2-e,2)+Math.pow(i-r,2))}}));i.sort(((t,n)=>t.distance-n.distance));const o=i.slice(0,t).map((t=>t.obj));let s=1/0,a=1/0,c=-1/0,u=-1/0;for(const t of o){const n=t.rotatedBoundingBox;s=Math.min(s,n.x),a=Math.min(a,n.y),c=Math.max(c,n.x+n.width),u=Math.max(u,n.y+n.height)}const h=c-s,l=u-a,f=s+h/2,d=a+l/2,p=Math.min(this._core.store.state.viewportWidth/(1.1*h),this._core.store.state.viewportHeight/(1.1*l),this._core.store.state.scaleMax),v=Math.max(p,this.getEffectiveMinScale());return this.animateViewportTo(this._core.store.state.viewportWidth/2-f*v,this._core.store.state.viewportHeight/2-d*v,v),!0}centerFitAllObjects(t=!0){const n=this._core.store.allNonSelectionObjects;if(0===n.length)return!1;let e=1/0,r=1/0,i=-1/0,o=-1/0;for(const t of n){const n=t.rotatedBoundingBox;e=Math.min(e,n.x),r=Math.min(r,n.y),i=Math.max(i,n.x+n.width),o=Math.max(o,n.y+n.height)}const s=i-e,a=o-r,c=e+s/2,u=r+a/2,h=Math.min(this._core.store.state.viewportWidth/(1.1*s),this._core.store.state.viewportHeight/(1.1*a),this._core.store.state.scaleMax),l=Math.max(h,this.getEffectiveMinScale());return this.animateViewportTo(this._core.store.state.viewportWidth/2-c*l,this._core.store.state.viewportHeight/2-u*l,l,t?150:0),!0}}class Kt extends p{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:"c",ctrl:!0,label:"Copy",category:"Clipboard",condition:t=>!!t.store.selectionGroup,action:t=>{t.copy(),t.rerender()}},{key:"x",ctrl:!0,label:"Cut",category:"Clipboard",condition:t=>!!t.store.selectionGroup,action:t=>t.cut()},{key:"v",ctrl:!0,label:"Paste",category:"Clipboard",condition:t=>!!t.store.state.copiedObjects&&!t.store.activeText&&!t.store.activeShape,action:t=>t.paste()},{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 n=h.getToolByIndex(t);n&&(this._core.store.setState("activeTool",n),this._core.deselectAllObjects(),n.onActivate())}handleKeyDown(t){if(this._core.store.state.isCtrlKeyPressed=t.ctrlKey,(this._core.store.activeText||this._core.store.activeShape)&&"Escape"!==t.key)return;const n=this.shortcuts.find((n=>n.key===t.key&&!!n.ctrl===t.ctrlKey&&!!n.shift===t.shiftKey&&(!n.condition||n.condition(this._core))));n&&(t.preventDefault(),n.action(this._core))}handleKeyUp(t){this._core.store.state.isCtrlKeyPressed=t.ctrlKey}getDisplayableShortcuts(){return this.shortcuts.map((({key:t,ctrl:n,shift:e,label:r,category:i})=>({key:t,ctrl:n,shift:e,label:r,category:i})))}}class Vt extends p{globalContextMenuItems=[];objectContextMenuItems=[];constructor(t,n,e){super(t),this.globalContextMenuItems=n,this.objectContextMenuItems=e}handleContextMenu(t){if(!(this._core.store.state.activeTool instanceof v))return;if(this._core.store.state.skipContextMenu)return void(this._core.store.state.skipContextMenu=!1);const n=this._core.store.state.activeTool;n?.moveHandler?.cancelPendingDrag(),this._core.store.selectionBox&&(this._core.store.objects.remove((t=>t instanceof f)),this._core.store.setSelectionBox(null),this._core.store.state.isSelecting=!1);const e=this._core.getObjectFromPointerEvent(t,".object");if(e&&!(e instanceof d)&&!(e instanceof f)){const t=d.create(this._core);t.addOrRemove(e),t.isSelected=!0,t.rotation=e.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._core.store.selectionGroup?this.objectContextMenuItems:this.globalContextMenuItems;let r=t.clientX-this._core.store.offsetX,i=t.clientY-this._core.store.offsetY;const o=10;r+150>window.innerWidth-o&&(r=window.innerWidth-150-o),i+200>window.innerHeight-o&&(i=window.innerHeight-200-o),r=Math.max(o,r),i=Math.max(o,i),this._core.store.state.contextMenuX=r,this._core.store.state.contextMenuY=i,this._core.store.state.isContextMenuVisible=!0,this._core.store.state.isEnabled=!1,this._core.rerender()}}class Nt extends z{__class__="KritzelCustomElement";element;isInteractive=!0;constructor(t){super(),t&&(this.translateX=t.translateX||0,this.translateY=t.translateY||0,this.scale=t.scale||1,this.element=t.element,this.height=t.height||0,this.width=t.width||0)}static create(t,n){const e=new Nt(n);return e._core=t,e.id=e.generateId(),e.workspaceId=t.store.state.activeWorkspace.id,e.userId=t.user?.id,e}mount(t){null!==t&&(this.isMounted&&this.elementRef===t&&this.element.parentElement===t||(this.elementRef=t,this.isMounted=!0,this.elementRef.innerHTML="",this.elementRef.appendChild(this.element)))}resize(t,n,e,r){e<=1||r<=1||(this.width=e,this.height=r,this.translateX=t,this.translateY=n,this.element&&(this.element.style.width=`${e}px`,this.element.style.height=`${r}px`),this._core.store.objects.update(this))}copy(){const t=Object.create(Object.getPrototypeOf(this));return Object.assign(t,this),t.id=this.generateId(),t.isMounted=!1,t.element=this.element.cloneNode(!0),t}}class Ht{_core;constructor(t){this._core=t}revive(t){if(t&&"object"==typeof t){if(t.__class__){let n;switch(t.__class__){case"KritzelPath":n=I.create(this._core).deserialize(t);break;case"KritzelLine":n=j.create(this._core).deserialize(t);break;case"KritzelText":n=A.create(this._core,t.fontSize,t.fontFamily).deserialize(t);break;case"KritzelShape":n=k.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":n=u.create(this._core).deserialize(t);break;case"KritzelCustomElement":n=Nt.create(this._core).deserialize(t);break;case"KritzelSelectionGroup":n=d.create(this._core).deserialize(t);break;case"KritzelGroup":n=b.create(this._core).deserialize(t);break;case"KritzelWorkspace":n=S.create(this._core,t).deserialize(t);break;case"KritzelBrushTool":n=new m(this._core);break;case"KritzelEraserTool":n=new H(this._core);break;case"KritzelImageTool":n=new Mt(this._core);break;case"KritzelSelectionTool":n=new v(this._core);break;case"KritzelTextTool":n=new y(this._core);break;case"KritzelLineTool":n=new w(this._core);break;case"KritzelShapeTool":n=new g(this._core);break;default:n=t}return n}const n=Array.isArray(t)?[]:{};for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(n[e]=this.revive(t[e]));return n}return t}}const Xt={activeWorkspace:void 0,activeTool:null,copiedObjects:null,objects:null,snapCandidate: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,skipContextMenu:!1,debugInfo:{showObjectInfo:!1,showViewportInfo:!1,showSyncProviderInfo:!0,showMigrationInfo:!0},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 Gt{static calculateSelectionBounds(t){const n=t.map((t=>t.rotatedBoundingBox));return{minX:Math.min(...n.map((t=>t.x))),minY:Math.min(...n.map((t=>t.y))),maxX:Math.max(...n.map((t=>t.x+t.width))),maxY:Math.max(...n.map((t=>t.y+t.height)))}}static calculateAlignedPositions(t,n){const e=new Map;if(t.length<2)return e;const r=this.calculateSelectionBounds(t);for(const i of t){const t=i.rotatedBoundingBox;let o=i.translateX,s=i.translateY;const a=t.x-i.translateX,c=t.y-i.translateY;switch(n){case It.StartHorizontal:o=r.minX-a;break;case It.CenterHorizontal:o=i.translateX+((r.minX+r.maxX)/2-(t.x+t.width/2));break;case It.EndHorizontal:o=i.translateX+(r.maxX-(t.x+t.width));break;case It.StartVertical:s=r.minY-c;break;case It.CenterVertical:s=i.translateY+((r.minY+r.maxY)/2-(t.y+t.height/2));break;case It.EndVertical:s=i.translateY+(r.maxY-(t.y+t.height))}e.set(i.id,{translateX:o,translateY:s})}return e}}class Yt{bounds;capacity;objects=[];children=null;_size=0;get size(){return this._size}constructor(t,n=16){this.bounds=t,this.capacity=n}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 n of this.children)if(n.insert(t))return this._size++,!0;return!1}update(t){const n=this.objects.findIndex((n=>n.id===t.id));if(-1!==n)return this.objects[n]=t,!0;if(null!==this.children)for(const n of this.children)if(n.update(t))return!0;return!1}remove(t){let n=0;const e=this.objects.findIndex((n=>t(n)));if(-1!==e&&(this.objects.splice(e,1),n++),null!==this.children)for(const e of this.children)n+=e.remove(t);return this._size-=n,n}query(t){const n=[];return this._queryInto(t,n),n}_queryInto(t,n){if(this.intersects(t,this.bounds)){for(const e of this.objects)this.intersects(e.rotatedBoundingBox,t)&&n.push(e);if(null!==this.children)for(const e of this.children)e._queryInto(t,n)}}filter(t){const n=[];return this._filterInto(t,n),n}_filterInto(t,n){for(const e of this.objects)t(e)&&n.push(e);if(null!==this.children)for(const e of this.children)e._filterInto(t,n)}allObjects(){const t=[];return this._collectAllInto(t),t}_collectAllInto(t){for(const n of this.objects)t.push(n);if(null!==this.children)for(const n of this.children)n._collectAllInto(t)}subdivide(){const{x:t,y:n,z:e,width:r,height:i}=this.bounds,o=r/2,s=i/2;this.children=[new Yt({x:t,y:n,z:e,width:o,height:s},this.capacity),new Yt({x:t+o,y:n,z:e,width:o,height:s},this.capacity),new Yt({x:t,y:n+s,z:e,width:o,height:s},this.capacity),new Yt({x:t+o,y:n+s,z:e,width:o,height:s},this.capacity)]}intersects(t,n){return!(t.x>=n.x+n.width||t.x+t.width<=n.x||t.y>=n.y+n.height||t.y+t.height<=n.y)}}class Qt{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 n=t.displayName||t.firstName||"Anonymous";this._awareness.setLocalStateField("user",{id:t.id,displayName:n,color:t.color||this.generateColorFromName(n)})}generateColorFromName(t){let n=0;for(let e=0;e<t.length;e++)n=t.charCodeAt(e)+((n<<5)-n);return`hsl(${Math.abs(n%360)}, 45%, 55%)`}updateCursorPosition(t,n){this._awareness&&this._awareness.setLocalStateField("cursor",{x:t,y:n})}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(),n=new Set;t.forEach((t=>{const e=t.user?.id;e&&n.add(e)}));const e=this._core?.user?.id,r=this.quadtree.filter((t=>t instanceof d&&null!=t.userId&&t.userId!==e&&!n.has(t.userId)));for(const t of r)this.quadtree.remove((n=>n.id===t.id)),this._idMap.delete(t.id),this._objectsMap&&this._ydoc.transact((()=>{this._objectsMap.delete(t.id)}),"local");r.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 Yt({x:-1/0,y:-1/0,z:0,width:1/0,height:1/0},8)}async initialize(t,n,e){this._core=t,this._workspaceId=n,this._reviver=new Ht(t),this._ydoc=new O.Doc,this._objectsMap=this._ydoc.getMap("objects"),this._metadataMap=this._ydoc.getMap("metadata");const r=t.editorId?`kritzel-workspace-${t.editorId}-${n}`:`kritzel-workspace-${n}`,i=e??Bt,o=!t.store?.state?.debugInfo?.showSyncProviderInfo;for(const t of i.providers){let n;n="function"==typeof t?new t(r,this._ydoc,{quiet:o}):t.create(r,this._ydoc,{quiet:o}),this._providers.push(n)}this._undoManager=new O.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 s=this._providers.filter((t=>"local"===t.type)),a=this._providers.filter((t=>"network"===t.type));(await Promise.allSettled(s.map((t=>t.connect())))).forEach(((t,n)=>{"rejected"===t.status&&console.error(`[Kritzel] Sync provider "${s[n]?.constructor.name}" failed to connect:`,t.reason)}));for(const t of a)t.connect().catch((n=>{console.error(`[Kritzel] Network sync provider "${t.constructor.name}" failed to connect:`,n)}));this._isReady=!0;for(const t of a)if(t.awareness){this._awareness=t.awareness;break}this._awareness&&(this._awarenessChangeHandler=t=>{t.removed.length>0&&this.removeOrphanedSelectionGroups();const n=Date.now(),e=n-this._lastAwarenessEmitTime;if(null!==this._awarenessEmitTimeout&&(clearTimeout(this._awarenessEmitTimeout),this._awarenessEmitTimeout=null),e>=this.AWARENESS_THROTTLE_INTERVAL){this._lastAwarenessEmitTime=n;const t=this._awareness.getStates();for(const n of this._awarenessChangeCallbacks)n(t)}else this._awarenessEmitTimeout=setTimeout((()=>{this._lastAwarenessEmitTime=Date.now(),this._awarenessEmitTimeout=null;const t=this._awareness.getStates();for(const n of this._awarenessChangeCallbacks)n(t)}),this.AWARENESS_THROTTLE_INTERVAL-e)},this._awareness.on("change",this._awarenessChangeHandler)),this.initializeMetadata("workspace",n,t.store?.state?.activeWorkspace?.name??""),Tt(this._ydoc,this._metadataMap,{objects:this._objectsMap},_t,B,{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 n=Array.from(t.keysChanged),e=[],r=[],i=[];n.forEach((n=>{const o=t.changes.keys.get(n);if(o&&"delete"===o.action)i.push(n);else{const t=this._objectsMap?.get(n);if(t){const n=this._reviver?.revive(t);n instanceof d?r.push(n):e.push(n)}}})),i.forEach((t=>{this.quadtree.remove((n=>n.id===t)),this._idMap.delete(t)}));const o=[],s=[];e.forEach((t=>{if(this._idMap.has(t.id)){const n=this._idMap.get(t.id);n&&"function"==typeof t.adoptTransientStateFrom&&t.adoptTransientStateFrom(n),this.quadtree.update(t),this._idMap.set(t.id,t),s.push(t)}else this.quadtree.insert(t),this._idMap.set(t.id,t),o.push(t)}));const a=new Set;if(r.forEach((t=>{if(this._idMap.has(t.id)){const n=this._idMap.get(t.id);n&&"function"==typeof t.adoptTransientStateFrom&&t.adoptTransientStateFrom(n),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)})),e.length>0||i.length>0){const t=new Set([...e.map((t=>t.id)),...i]),n=this.quadtree.filter((t=>t instanceof d&&!a.has(t.id)));for(const e of n)e.objectIds.some((n=>t.has(n)))&&(e.invalidateObjectsCache(),e.refreshObjectDimensions(void 0,!0),e.captureUnchangedSnapshots(),this.quadtree.update(e))}if(this._core?.store.invalidateSelectionCache(),this._core?.rerender(),o.length>0&&this._core?.engine.emitObjectsAdded(o),i.length>0){const t=i.map((t=>({id:t})));this._core?.engine.emitObjectsRemoved(t)}s.length>0&&this._core?.engine.emitObjectsUpdated(s.map((t=>({object:t,changedProperties:[]}))));for(const t of this._objectsChangeCallbacks)t()}initializeMetadata(t,n,e){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",B),this._metadataMap?.set("workspaceId",n),this._metadataMap?.set("workspaceName",e)}),"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,n=[];this._objectsMap.forEach(((e,r)=>{const i=this._reviver?.revive(e);i instanceof d&&null!=i.userId&&i.userId!==t?n.push(r):i&&(this.quadtree.insert(i),this._idMap.set(i.id,i))})),n.length>0&&this._ydoc.transact((()=>{for(const t of n)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 n=t.serialize();this.markUndoBoundary(),this._ydoc?.transact((()=>{this._objectsMap?.set(t.id,n)}),"local")}return!0}update(t,n={}){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 e=t.serialize(),r=n.temporary?"temporary":"local";this._ydoc?.transact((()=>{this._objectsMap?.set(t.id,e)}),r)}return!0}remove(t){const n=this.quadtree.filter(t);if(0!==n.length){this.markUndoBoundary();for(const t of n)this.quadtree.remove((n=>n.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 f)}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 n=Math.min(this._temporaryItemsCount,t);if(n>1){for(let t=0;t<n;t++)this._undoManager.canUndo()&&this._undoManager.undo();this._ydoc?.transact((()=>{for(let t=n-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 n=0;n<t;n++)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 qt{_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 d||t instanceof f))).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,n=this._state.viewportBoundaryRight,e=this._state.viewportBoundaryTop,r=this._state.viewportBoundaryBottom;return{x:Number.isFinite(t)?t:-1/0,y:Number.isFinite(e)?e:-1/0,z:0,width:Number.isFinite(t)&&Number.isFinite(n)?n-t:1/0,height:Number.isFinite(e)&&Number.isFinite(r)?r-e: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,n)=>t.zIndex-n.zIndex))}get allNonSelectionObjects(){return this.allObjects.filter((t=>!(t instanceof d||t instanceof f)))}get selectedObjects(){return this.allObjects.filter((t=>!(t instanceof d))).filter((t=>t.isSelected))}get selectionBox(){if(this._selectionBoxCacheValid)return this._cachedSelectionBox;const t=this.objects.filter((t=>t instanceof f));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 d));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 A&&t.isEditing));return t.length>0?t[0]:null}get activeShape(){const t=this.objects.filter((t=>t instanceof k&&t.isEditing));return t.length>0?t[0]:null}get currentPath(){const t=this.objects.filter((t=>t instanceof I&&!1===t.isCompleted));return t.length>0?t[0]:null}get currentLine(){const t=this.objects.filter((t=>t instanceof j&&!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,this._state.objects=new Qt}onStateChange(t,n){this._listeners.has(t)||this._listeners.set(t,new Set);const e=this._listeners.get(t);if(!e)throw new Error(`Listeners set for property ${String(t)} was not initialized.`);e.add(n)}getState(t){return this._state[t]}setState(t,n){const e=this._state[t];if(e!==n){this._state[t]=n;const r=this._listeners.get(t);r&&r.forEach((r=>r(n,e,String(t))))}}}class Zt{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,n){this._core=t,this._ydoc=new O.Doc,this._workspacesMap=this._ydoc.getMap("workspaces"),this._metadataMap=this._ydoc.getMap("metadata");const e=n?.appStateId??this.getOrCreateAppStateInstanceId(t),r=t.editorId?`kritzel-app-state-${t.editorId}-${e}`:`kritzel-app-state-${e}`,i=n??Bt,o=!t.store.state.debugInfo.showSyncProviderInfo;for(const t of i.providers){let n;n="function"==typeof t?new t(r,this._ydoc,{quiet:o}):t.create(r,this._ydoc,{quiet:o}),this._providers.push(n)}this._workspacesObserver=t=>{this.handleWorkspacesChange(t)},this._workspacesMap.observe(this._workspacesObserver);const s=this._providers.filter((t=>"local"===t.type)),a=this._providers.filter((t=>"network"===t.type));(await Promise.allSettled(s.map((t=>t.connect())))).forEach(((t,n)=>{"rejected"===t.status&&console.error(`[Kritzel] Sync provider "${s[n]?.constructor.name}" failed to connect:`,t.reason)}));for(const t of a)t.connect().catch((n=>{console.error(`[Kritzel] Network sync provider "${t.constructor.name}" failed to connect:`,n)}));this._isReady=!0,Tt(this._ydoc,this._metadataMap,{workspaces:this._workspacesMap},Et,U,{quiet:!t.store.state.debugInfo.showMigrationInfo}),this.initializeMetadata("state"),this.loadFromYjs()}getOrCreateAppStateInstanceId(t){const n=globalThis.localStorage;if(!n)throw new Error("[KritzelAppStateMap] localStorage is unavailable. Cannot persist app-state document identity.");const e=t.getStorageKey("kritzel-app-state-instance-id");let r;try{r=n.getItem(e)}catch{throw new Error("[KritzelAppStateMap] Failed to read app-state instance id from localStorage.")}if(r)return r;const i=_.generateUUID();try{n.setItem(e,i)}catch{throw new Error("[KritzelAppStateMap] Failed to persist app-state instance id to localStorage.")}return i}handleWorkspacesChange(t){if("local"===t.transaction.origin)return void this._core?.rerender();if("migration"===t.transaction.origin)return;const n=Array.from(t.keysChanged),e=[],r=[];n.forEach((n=>{const i=t.changes.keys.get(n);if(i&&"delete"===i.action)r.push(n);else{const t=this._workspacesMap.get(n);if(t){const n=this.reviveWorkspace(t);e.push(n)}}})),r.forEach((t=>{this.map.delete(t)})),e.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 n=t.viewport;if(n&&"translateX"in n&&!("centerWorldX"in n)){const t=n.scale??1;n={centerWorldX:-(n.translateX??0)/t,centerWorldY:-(n.translateY??0)/t,scale:t}}const e=new S(t.id,t.name,n);return this._core&&(e._core=this._core),e.createdAt=new Date(t.createdAt),e.updatedAt=new Date(t.updatedAt),e.isPublic=t.isPublic??!1,e}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",U)}),"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,n)=>{const e=this.reviveWorkspace(t);this.map.set(n,e)})))}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 n=t.serialize();this._ydoc?.transact((()=>{this._workspacesMap?.set(t.id,n)}),"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 n=t.serialize();this._ydoc?.transact((()=>{this._workspacesMap?.set(t.id,n)}),"local")}return!0}remove(t){const n=Array.from(this.map.values()).find(t);return!!n&&(this.map.delete(n.id),this._workspacesMap&&this._ydoc?.transact((()=>{this._workspacesMap?.delete(n.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 Jt{_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",jt.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 n=this._shadowRoot.elementsFromPoint(t.clientX,t.clientY);if(!n||0===n.length)return;const e=n.find((t=>t.classList.contains("resize-handle-overlay")));if(e){const t=this._core.store.selectionGroup,n=t?.rotationDegrees??0,r=e.classList.contains("top-left"),i=e.classList.contains("bottom-right");this._core.store.state.cursor={icon:"move-vertical",rotation:n+(r||i?-45:45)}}else this._core.store.state.cursor=n.find((t=>t.classList.contains("rotation-handle-overlay")))||n.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,n=this._core.store.isPointerDown,e=t.cursor?.icon,r=t.cursor?.iconActive??e,i=t.cursor?.rotation,o=jt.getCursor({iconName:n?r:e,rotation:i});this._targetElement&&(this._targetElement.style.cursor=o)}cleanup(){this._targetElement&&(this._targetElement.style.cursor="",this._targetElement.style.removeProperty("--kritzel-pointer-cursor")),this._targetElement=null,this._shadowRoot=null}}class tn{_kritzelEngine;_store;_syncConfig;_assetStorageConfig;_assetResolver;_appStateMap;_anchorManager;_cursorManager;_themeManager;_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 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,n){this._kritzelEngine=t,this._editorId=n,this._store=new qt(Xt),this._appStateMap=new Zt,this._anchorManager=new zt(this),this._cursorManager=new Jt(this),this._themeManager=new L(this),this._assetResolver=new x}get assetResolver(){return this._assetResolver}setSyncConfig(t){this._syncConfig=t}setAssetStorageConfig(t){this._assetStorageConfig=t}setEditorId(t){this._editorId=t,this._themeManager=new L(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((n=>n.id===t))}async initializeWorkspace(t,n){const e=this.loadWorkspacesFromAppState(),r=e.length>0?[...e].sort(((t,n)=>{const e=n.createdAt.getTime()-t.createdAt.getTime();return 0!==e?e:n.updatedAt.getTime()-t.updatedAt.getTime()}))[0]:null,i=localStorage.getItem(this.getStorageKey("kritzel-active-workspace-id")),o=i?e.find((t=>t.id===i)):null;let s;if(t)s=t,e.find((n=>n.id===t.id))||(s._core=this,this.saveWorkspaceToAppState(s));else if(o)s=o;else if(r)s=r;else{if(n?.skipFallbackCreation)return this._store.state.workspaces=e,this._store.state.activeWorkspace=null,void this.rerender();s=new S(_.generateUUID(),"New Workspace"),s._core=this,this.saveWorkspaceToAppState(s)}localStorage.setItem(this.getStorageKey("kritzel-active-workspace-id"),s.id),this._store.objects&&this._store.objects.isReady&&this._store.objects.destroy();const a=new Qt;this._store.state.objects=a,this._store.state.activeWorkspace=s,this._store.state.workspaces=this.loadWorkspacesFromAppState();const c=s.viewport??{centerWorldX:0,centerWorldY:0,scale:1},u=c.scale??1,h=this._store.state.viewportHeight;this._store.state.translateX=this._store.state.viewportWidth/2-(c.centerWorldX??0)*u,this._store.state.translateY=h/2-(c.centerWorldY??0)*u,this._store.state.scale=u,await a.initialize(this,s.id,this._syncConfig),this._user&&a.setLocalUser(this._user),a.onAwarenessChange((t=>{this.engine.emitAwarenessChange(t)})),this._anchorManager.rebuildIndex(),this.engine.emitObjectsChange(),this.rerender()}async loadSharedWorkspace(t){const n=t;let e=this.getWorkspaces().find((t=>t.id===n));e?e.isPublic=!0:(e=new S(n,"Shared Workspace"),e.isPublic=!0,this.createWorkspace(e)),await this.initializeWorkspace(e)}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 d||t instanceof f))).sort(((t,n)=>t.zIndex-n.zIndex)):[]}rerender(){this._kritzelEngine&&this._kritzelEngine.forceUpdate++}findObjectById(t){for(const n of this._store.allObjects)if(n.id===t)return n;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 n=this._store.state.workspaces,e=n.findIndex((n=>n.id===t.id));-1!==e&&(n[e]=t,this._store.state.workspaces=n)}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,n,e){const r=this._store.state.activeWorkspace;r&&this._store.state.workspaces.some((t=>t.id===r.id))&&(r.viewport={centerWorldX:(this._store.state.viewportWidth/2-t)/e,centerWorldY:(this._store.state.viewportHeight/2-n)/e,scale:e},r.updatedAt=new Date,this.saveWorkspaceToAppState(r))}getIsPublic(){return this._store.state.activeWorkspace?.isPublic??!1}addObject(t){this._store.objects.insert(t)}removeObject(t,n=!1){l.isInstanceOf(t,"KritzelGroup")&&!n&&[...t.children].forEach((t=>{this.removeObject(t)})),l.isInstanceOf(t,"KritzelLine")?this._anchorManager.handleLineDeleted(t.id):this._anchorManager.handleObjectDeleted(t.id),t.isMounted=!1,this._store.objects.remove((n=>n.id===t.id))}updateObject(t,n){const e=[];for(const r in n)if(n.hasOwnProperty(r)){const i=n[r];void 0!==i&&(t[r]=i,e.push(r))}t.onAfterUpdate(e),this._store.objects.update(t)}addSelectionGroup(t){this.removeSelectionGroup(),this.removeSelectionBox(),this._store.objects.insert(t),this._store.setSelectionGroup(t),this._kritzelEngine.triggerSelectionChange()}removeSelectionGroup(){const t=this._store.selectionGroup;t&&(this._store.objects.remove((n=>n.id===t.id)),this._store.setSelectionGroup(null),this._kritzelEngine.triggerSelectionChange())}removeSelectionBox(){const t=this._store.selectionBox;t&&(this._store.objects.remove((n=>n.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 n=this.findObjectById(t);n&&(this.removeObject(n),this.engine.emitObjectsInViewportChange(),this.rerender())}copy(){const t=this._store.selectionGroup;if(t){const n=new Map,e=t.objects.sort(((t,n)=>t.zIndex-n.zIndex)).map((t=>{const e=t.copy();return n.set(e.id,t.id),e}));this._store.state.copiedObjects=e,this._store.state.copiedObjectIdMapping=n}}cut(){this._store.selectionGroup&&(this.copy(),this.delete())}paste(t,n){const e=this._store.state.copiedObjects;if(!e||0===e.length)return;const r=this._store.state.activeWorkspace,i=this._store.state.copiedObjectIdMapping,o=e.some((t=>t.workspaceId!==r.id)),s=Math.min(...e.map((t=>t.translateX))),a=Math.min(...e.map((t=>t.translateY)));let c,u;void 0!==t&&void 0!==n?(c=t,u=n):o?(c=s,u=a):(c=s+25/this._store.state.scale,u=a+25/this._store.state.scale);const f=c-s,p=u-a;this.removeSelectionGroup(),this.removeSelectionBox();const v=d.create(this),g=new Map;i&&i.forEach(((t,n)=>{g.set(t,n)}));const w=this._store.currentZIndex;this._store.objects.transaction((()=>{const t=(n,e)=>{if(0===n._pendingChildren.length)return;const i=n._pendingChildren;n._pendingChildren=[],i.forEach(((n,i)=>{n.workspaceId!==r.id&&(n.workspaceId=r.id),n.updatePosition(n.translateX+f,n.translateY+p),n.zIndex=e+i+1,l.isInstanceOf(n,"KritzelGroup")&&t(n,n.zIndex),this.addObject(n)})),n.finalize()};e.forEach(((n,e)=>{n.workspaceId!==r.id&&(n.workspaceId=r.id),n.updatePosition(n.translateX+f,n.translateY+p),n.zIndex=w+e,l.isInstanceOf(n,"KritzelGroup")&&t(n,n.zIndex),this.addObject(n),v.addOrRemove(n)})),e.forEach((t=>{if(l.isInstanceOf(t,"KritzelLine")){let n=!1;t.startAnchor&&g.has(t.startAnchor.objectId)&&(t.startAnchor={objectId:g.get(t.startAnchor.objectId)},n=!0),t.endAnchor&&g.has(t.endAnchor.objectId)&&(t.endAnchor={objectId:g.get(t.endAnchor.objectId)},n=!0),n&&this._store.objects.update(t)}}))})),this._anchorManager.rebuildIndex(),v.isSelected=!0,1===e.length&&(v.rotation=e[0].rotation),this.addSelectionGroup(v),o&&(void 0!==t&&void 0!==n?v.updatePosition(t,n):v.centerInViewport(),this.engine.viewport.centerFitInViewport(v)),this._store.state.isSelecting=!1,requestAnimationFrame((()=>{const t=this._store.selectionGroup;if(t){const n=new Map,e=t.objects.sort(((t,n)=>t.zIndex-n.zIndex)).map((t=>{const e=t.copy();return n.set(e.id,t.id),e}));this._store.state.copiedObjects=e,this._store.state.copiedObjectIdMapping=n}})),this._store.setState("activeTool",h.getTool("selection")),this.engine.emitObjectsChange(),this.rerender()}bringForward(t){const n=this._store.selectionGroup,e=t?[t]:n?.objects||[],r=this._store.allNonSelectionObjects.filter((t=>-1===e.findIndex((n=>n.id===t.id)))),i=r.length>0?Math.max(...r.map((t=>t.zIndex)))+1:0;e.forEach((t=>{t.zIndex!==i&&this.updateObject(t,{zIndex:t.zIndex+1})})),this.rerender()}sendBackward(t){const n=this._store.selectionGroup,e=t?[t]:n?.objects||[],r=this._store.allNonSelectionObjects.filter((t=>-1===e.findIndex((n=>n.id===t.id)))),i=r.length>0?Math.min(...r.map((t=>t.zIndex)))-1:0;e.forEach((t=>{t.zIndex!==i&&this.updateObject(t,{zIndex:t.zIndex-1})})),this.rerender()}bringToFront(t){const n=this._store.selectionGroup,e=t?[t]:n?.objects||[],r=this._store.allNonSelectionObjects.filter((t=>-1===e.findIndex((n=>n.id===t.id)))),i=Math.max(...r.map((t=>t.zIndex)))+1;e.forEach((t=>{this.updateObject(t,{zIndex:i})})),this.rerender()}sendToBack(t){const n=this._store.selectionGroup,e=t?[t]:n?.objects||[],r=this._store.allNonSelectionObjects.filter((t=>-1===e.findIndex((n=>n.id===t.id)))),i=Math.min(...r.map((t=>t.zIndex)))-1;e.forEach((t=>{this.updateObject(t,{zIndex:i})})),this.rerender()}alignObjects(t){const n=this._store.selectionGroup;if(!n||n.objects.length<2)return;const e=n.objects,r=Gt.calculateAlignedPositions(e,t);this._store.objects.transaction((()=>{for(const t of e){const n=r.get(t.id);n&&this.updateObject(t,{translateX:n.translateX,translateY:n.translateY})}})),n.refreshObjectDimensions(),this.rerender()}group(){const t=this._store.selectionGroup;if(!t||t.objects.length<2)return;const n=b.createFromObjects(this,t.objects);this.addObject(n),this.removeSelectionGroup();const e=d.create(this);e.addOrRemove(n),e.isSelected=!0,e.rotation=n.rotation,this.addSelectionGroup(e),this.engine.emitObjectsChange(),this.rerender()}ungroup(){const t=this._store.selectionGroup;if(!t)return;const n=t.objects.filter((t=>l.isInstanceOf(t,"KritzelGroup")));if(0===n.length)return;const e=[],r=t.objects.filter((t=>!l.isInstanceOf(t,"KritzelGroup")));n.forEach((t=>{const n=t.ungroup();e.push(...n),this.removeObject(t,!0)})),this.removeSelectionGroup();const i=d.create(this);[...e,...r].forEach((t=>{i.addOrRemove(t)})),i.isSelected=!0,this.addSelectionGroup(i),this.engine.emitObjectsChange(),this.rerender()}selectObjects(t){if(0===t.length)return;const n=d.create(this);t.forEach((t=>{t.isSelected=!1,n.addOrRemove(t)})),n.isSelected=!0,1===t.length&&(n.rotation=n.objects[0].rotation),this.addSelectionGroup(n),this.rerender()}selectAllObjects(){const t=this._store.objects.allObjects().filter((t=>!(t instanceof d||t instanceof f||t instanceof T)));if(t.length>0){const n=d.create(this);t.forEach((t=>{t.isSelected=!1,n.addOrRemove(t)})),n.isSelected=!0,this._store.state.isSelecting=!1,1===t.length&&(n.rotation=n.objects[0].rotation),this.addSelectionGroup(n),this._store.setState("activeTool",h.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 d||t instanceof f||t instanceof T)));if(t.length>0){const n=d.create(this);t.forEach((t=>{t.isSelected=!1,n.addOrRemove(t)})),n.isSelected=!0,this._store.state.isSelecting=!1,1===t.length&&(n.rotation=n.objects[0].rotation),this.addSelectionGroup(n),this._store.setState("activeTool",h.getTool("selection")),this.rerender()}}clearSelection(){this.removeSelectionGroup();const t=this._user?.id;this._store.objects.remove((n=>n instanceof f||n instanceof d&&(null==t||n.userId===t||null==n.userId))),this._store.setSelectionBox(null),this._store.setSelectionGroup(null),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,n=".object"){const e=this._store.state.host?.shadowRoot;if(!e)return null;const r=t.clientX,i=t.clientY,o=e.elementFromPoint(r,i);if(!o)return null;const s=o.closest(n);if(s){const t=this._store.allObjects.find((t=>s.id===t.id));return t&&t.hitTest(r,i)?t:null}return null}getObjectsFromPointerEvent(t,n=".object"){const e=this._store.state.host?.shadowRoot;if(!e)return[];const r=e.elementsFromPoint(t.clientX,t.clientY);if(!r||0===r.length)return[];const i=new Set;return r.forEach((t=>{const e=t.closest(n);e&&e.id&&i.add(e.id)})),i.size>0?this._store.allObjects.filter((t=>i.has(t.id))).sort(((t,n)=>n.zIndex-t.zIndex)):[]}getElementsAtPoint(t,n){const e=this._store.state.host?.shadowRoot;if(!e)return[];const r=e.elementsFromPoint(t.clientX,t.clientY);return r&&0!==r.length?r.filter((t=>t.matches(n))):[]}isPointerOverElement(t,n){return this.getElementsAtPoint(t,n).length>0}getCanvasPoint(t){if(!this._store.state.host)return{x:0,y:0};const n=this._store.state.host.getBoundingClientRect();return{x:(t.clientX-n.left-this._store.state.translateX)/this._store.state.scale,y:(t.clientY-n.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",h.getTool("selection"))}displaySelectionGroupUI(t){if(!t.isSelected)return!1;if(t instanceof d&&null!=this._user?.id&&null!=t.userId&&t.userId!==this._user.id)return!0;const n=this._store.selectionGroup;return n?n.objects.length>1||(1!==n.objects.length||!(n.objects[0]instanceof j)):!(t instanceof j)}displaySelectionLineUI(t){if(!(t instanceof j))return!1;const n=this._store.selectionGroup;if(!n)return t.isSelected;if(!n.isSelected)return!1;if(1===n.objects.length){const e=n.objects[0];return e instanceof j&&e.id===t.id}return!1}}class nn{static calculateCombinedBounds(t){if(!t||0===t.length)return null;let n=1/0,e=1/0,r=-1/0,i=-1/0;for(const o of t){const t=o.rotatedBoundingBox;n=Math.min(n,t.x),e=Math.min(e,t.y),r=Math.max(r,t.x+t.width),i=Math.max(i,t.y+t.height)}return{x:n,y:e,z:1,width:r-n,height:i-e}}static generateSvg(t,n={}){const{theme:e,padding:r=0,includeXmlDeclaration:i=!0}=n;if(!t||0===t.length)return"";const o=this.flattenObjects(t),s=this.calculateCombinedBounds(o);if(!s)return"";const a=s.x-r,c=s.y-r,u=s.width+2*r,h=s.height+2*r,l=this.collectDefs(o,e),f=t.sort(((t,n)=>t.zIndex-n.zIndex)).map((t=>this.objectToSvgElement(t,e))).filter(Boolean).join("\n ");return`${i?'<?xml version="1.0" encoding="UTF-8"?>\n':""}<svg xmlns="http://www.w3.org/2000/svg" viewBox="${a} ${c} ${u} ${h}" width="${u}" height="${h}">${l.length>0?`\n <defs>\n ${l.join("\n ")}\n </defs>`:""}\n ${f}\n</svg>`}static flattenObjects(t){const n=[];for(const e of t)l.isInstanceOf(e,"KritzelGroup")?n.push(...this.flattenObjects(e.children)):n.push(e);return n}static collectDefs(t,n){const e=[];for(const r of t)l.isInstanceOf(r,"KritzelLine")&&(r.hasStartArrow&&e.push(this.generateArrowMarker(r,"start",n)),r.hasEndArrow&&e.push(this.generateArrowMarker(r,"end",n)));return e}static generateArrowMarker(t,n,e){const r="start"===n?t.startMarkerId:t.endMarkerId,i=t.getArrowSize(n),o=t.getArrowFill(n);return`<marker id="${r}" markerWidth="${i}" markerHeight="${i}" refX="0" refY="${i/2}" orient="${"start"===n?"auto-start-reverse":"auto"}" markerUnits="userSpaceOnUse">\n <path d="${t.getArrowPath("start"===n?t.arrows?.start?.style:t.arrows?.end?.style)}" fill="${o}" transform="scale(${i/10})"/>\n </marker>`}static objectToSvgElement(t,n){return l.isInstanceOf(t,"KritzelPath")?this.pathToSvg(t,n):l.isInstanceOf(t,"KritzelLine")?this.lineToSvg(t,n):l.isInstanceOf(t,"KritzelShape")?this.shapeToSvg(t,n):l.isInstanceOf(t,"KritzelText")?this.textToSvg(t,n):l.isInstanceOf(t,"KritzelImage")?this.imageToSvg(t):l.isInstanceOf(t,"KritzelGroup")?this.groupToSvg(t,n):""}static pathToSvg(t,n){const e=this.buildTransform(t),r=D.resolveThemeColor(t.fill,n),i=D.resolveThemeColor(t.stroke,n);return`<g transform="${e}"${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}" overflow="visible">\n <path d="${t.d}" fill="${r||"none"}" stroke="${i||"none"}"${t.strokeWidth?` stroke-width="${t.strokeWidth}"`:""}/>\n </svg>\n </g>`}static lineToSvg(t,n){const e=this.buildTransform(t),r=D.resolveThemeColor(t.stroke,n);return`<g transform="${e}"${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}" overflow="visible">\n <path d="${t.d}" fill="none" stroke="${r}" 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,n){const e=this.buildTransform(t),r=D.resolveThemeColor(t.fillColor,n),i=D.resolveThemeColor(t.strokeColor,n),o=1!==t.opacity?` opacity="${t.opacity}"`:"",s=t.getSvgPath();let a="";if(t.editor&&!t.editor.state.doc.textContent.trim());else if(t.content){const e=this.prosemirrorToHtml(t.content,t,n);if(e){const r=D.resolveThemeColor(t.fontColor,n);a=`\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: ${r}; overflow: hidden;">\n ${e}\n </div>\n </foreignObject>`}}return`<g transform="${e}"${o}>\n <svg viewBox="${t.viewBox}" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}" overflow="visible" preserveAspectRatio="none">\n <path d="${s}" fill="${r||"transparent"}" stroke="${i}" stroke-width="${t.strokeWidth}"/>${a}\n </svg>\n </g>`}static textToSvg(t,n){const e=this.buildTransform(t),r=1!==t.opacity?` opacity="${t.opacity}"`:"",i=D.resolveThemeColor(t.fontColor,n),o=D.resolveThemeColor(t.backgroundColor,n),s=this.prosemirrorToHtml(t.content,t,n);return`<g transform="${e}"${r}>\n <foreignObject x="0" y="0" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}">\n <div xmlns="http://www.w3.org/1999/xhtml" style="font-family: ${t.fontFamily}; font-size: ${t.fontSize}pt; color: ${i}; background-color: ${o||"transparent"}; transform: scale(${t.scaleFactor}); transform-origin: top left; white-space: pre-wrap; word-wrap: break-word;">\n ${s}\n </div>\n </foreignObject>\n </g>`}static imageToSvg(t){return`<g transform="${this.buildTransform(t)}"${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n <image href="${t.resolvedSrc||t.src||""}" x="0" y="0" width="${t.totalWidth/t.scale}" height="${t.totalHeight/t.scale}" preserveAspectRatio="xMidYMid meet"/>\n </g>`}static groupToSvg(t,n){const e=t.children.sort(((t,n)=>t.zIndex-n.zIndex)).map((t=>this.objectToSvgElement(t,n))).filter(Boolean).join("\n ");return e?`<g${1!==t.opacity?` opacity="${t.opacity}"`:""}>\n ${e}\n </g>`:""}static buildTransform(t){const n=[];if(n.push(`translate(${t.translateX}, ${t.translateY})`),0!==t.rotation){const e=t.rotation*(180/Math.PI);n.push(`rotate(${e}, ${t.totalWidth/2/t.scale}, ${t.totalHeight/2/t.scale})`)}return n.join(" ")}static prosemirrorToHtml(t,n,e){return t&&t.content?t.content.map((t=>this.nodeToHtml(t,e))).join(""):""}static nodeToHtml(t,n){if(!t)return"";switch(t.type){case"paragraph":return`<p style="margin: 0;">${(t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):"")||"<br/>"}</p>`;case"text":let e=this.escapeHtml(t.text||"");if(t.marks)for(const r of t.marks)e=this.applyMark(e,r,n);return e;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,n))).join(""):""}</ul>`;case"ordered_list":return`<ol style="margin: 0; padding-left: 1.5em;">${t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):""}</ol>`;case"list_item":return`<li>${t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):""}</li>`;default:return t.content?t.content.map((t=>this.nodeToHtml(t,n))).join(""):""}}static applyMark(t,n,e){switch(n.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(n.attrs?.href||"#")}">${t}</a>`;default:return t}}static escapeHtml(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}}const en=(()=>{let t=0;return()=>(t+=1,`u${`0000${(Math.random()*36**4|0).toString(36)}`.slice(-4)}${t}`)})();function rn(t){const n=[];for(let e=0,r=t.length;e<r;e++)n.push(t[e]);return n}let on=null;function sn(t={}){return on||(t.includeStyleProperties?(on=t.includeStyleProperties,on):(on=rn(window.getComputedStyle(document.documentElement)),on))}function an(t,n){const e=(t.ownerDocument.defaultView||window).getComputedStyle(t).getPropertyValue(n);return e?parseFloat(e.replace("px","")):0}function cn(t,n={}){return{width:n.width||function(t){const n=an(t,"border-left-width"),e=an(t,"border-right-width");return t.clientWidth+n+e}(t),height:n.height||function(t){const n=an(t,"border-top-width"),e=an(t,"border-bottom-width");return t.clientHeight+n+e}(t)}}const un=16384;function hn(t){return new Promise(((n,e)=>{const r=new Image;r.onload=()=>{r.decode().then((()=>{requestAnimationFrame((()=>n(r)))}))},r.onerror=e,r.crossOrigin="anonymous",r.decoding="async",r.src=t}))}const ln=(t,n)=>{if(t instanceof n)return!0;const e=Object.getPrototypeOf(t);return null!==e&&(e.constructor.name===n.name||ln(e,n))};function fn(t,n,e,r){const i=window.getComputedStyle(t,e),o=i.getPropertyValue("content");if(""===o||"none"===o)return;const s=en();try{n.className=`${n.className} ${s}`}catch(t){return}const a=document.createElement("style");a.appendChild(function(t,n,e,r){const i=`.${t}:${n}`,o=e.cssText?function(t){const n=t.getPropertyValue("content");return`${t.cssText} content: '${n.replace(/'|"/g,"")}';`}(e):function(t,n){return sn(n).map((n=>`${n}: ${t.getPropertyValue(n)}${t.getPropertyPriority(n)?" !important":""};`)).join(" ")}(e,r);return document.createTextNode(`${i}{${o}}`)}(s,e,i,r)),n.appendChild(a)}const dn="application/font-woff",pn="image/jpeg",vn={woff:dn,woff2:dn,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:pn,jpeg:pn,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function gn(t){const n=function(t){const n=/\.([^./]*?)$/g.exec(t);return n?n[1]:""}(t).toLowerCase();return vn[n]||""}function wn(t){return-1!==t.search(/^(data:)/)}async function yn(t,n,e){const r=await fetch(t,n);if(404===r.status)throw new Error(`Resource "${r.url}" not found`);const i=await r.blob();return new Promise(((t,n)=>{const o=new FileReader;o.onerror=n,o.onloadend=()=>{try{t(e({res:r,result:o.result}))}catch(t){n(t)}},o.readAsDataURL(i)}))}const mn={};async function bn(t,n,e){const r=function(t,n,e){let r=t.replace(/\?.*/,"");return e&&(r=t),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,"")),n?`[${n}]${r}`:r}(t,n,e.includeQueryParams);if(null!=mn[r])return mn[r];let i;e.cacheBust&&(t+=(/\?/.test(t)?"&":"?")+(new Date).getTime());try{const r=await yn(t,e.fetchRequestInit,(({res:t,result:e})=>(n||(n=t.headers.get("Content-Type")||""),function(t){return t.split(/,/)[1]}(e))));i=function(t,n){return`data:${n};base64,${t}`}(r,n)}catch(n){i=e.imagePlaceholder||"";let r=`Failed to fetch resource: ${t}`;n&&(r="string"==typeof n?n:n.message),r&&console.warn(r)}return mn[r]=i,i}const kn=t=>null!=t.tagName&&"SLOT"===t.tagName.toUpperCase(),An=t=>null!=t.tagName&&"SVG"===t.tagName.toUpperCase();async function xn(t,n,e){return e||!n.filter||n.filter(t)?Promise.resolve(t).then((t=>async function(t,n){return ln(t,HTMLCanvasElement)?async function(t){const n=t.toDataURL();return"data:,"===n?t.cloneNode(!1):hn(n)}(t):ln(t,HTMLVideoElement)?async function(t,n){if(t.currentSrc){const n=document.createElement("canvas"),e=n.getContext("2d");return n.width=t.clientWidth,n.height=t.clientHeight,null==e||e.drawImage(t,0,0,n.width,n.height),hn(n.toDataURL())}const e=t.poster,r=gn(e);return hn(await bn(e,r,n))}(t,n):ln(t,HTMLIFrameElement)?async function(t,n){var e;try{if(null===(e=null==t?void 0:t.contentDocument)||void 0===e?void 0:e.body)return await xn(t.contentDocument.body,n,!0)}catch(t){}return t.cloneNode(!1)}(t,n):t.cloneNode(An(t))}(t,n))).then((e=>async function(t,n,e){var r,i;if(An(n))return n;let o=[];return o=kn(t)&&t.assignedNodes?rn(t.assignedNodes()):ln(t,HTMLIFrameElement)&&(null===(r=t.contentDocument)||void 0===r?void 0:r.body)?rn(t.contentDocument.body.childNodes):rn((null!==(i=t.shadowRoot)&&void 0!==i?i:t).childNodes),0===o.length||ln(t,HTMLVideoElement)||await o.reduce(((t,r)=>t.then((()=>xn(r,e))).then((t=>{t&&n.appendChild(t)}))),Promise.resolve()),n}(t,e,n))).then((e=>function(t,n,e){return ln(n,Element)&&(function(t,n,e){const r=n.style;if(!r)return;const i=window.getComputedStyle(t);i.cssText?(r.cssText=i.cssText,r.transformOrigin=i.transformOrigin):sn(e).forEach((e=>{let o=i.getPropertyValue(e);if("font-size"===e&&o.endsWith("px")){const t=Math.floor(parseFloat(o.substring(0,o.length-2)))-.1;o=`${t}px`}ln(t,HTMLIFrameElement)&&"display"===e&&"inline"===o&&(o="block"),"d"===e&&n.getAttribute("d")&&(o=`path(${n.getAttribute("d")})`),r.setProperty(e,o,i.getPropertyPriority(e))}))}(t,n,e),function(t,n,e){fn(t,n,":before",e),fn(t,n,":after",e)}(t,n,e),function(t,n){ln(t,HTMLTextAreaElement)&&(n.innerHTML=t.value),ln(t,HTMLInputElement)&&n.setAttribute("value",t.value)}(t,n),function(t,n){if(ln(t,HTMLSelectElement)){const e=Array.from(n.children).find((n=>t.value===n.getAttribute("value")));e&&e.setAttribute("selected","")}}(t,n)),n}(t,e,n))).then((t=>async function(t,n){const e=t.querySelectorAll?t.querySelectorAll("use"):[];if(0===e.length)return t;const r={};for(let i=0;i<e.length;i++){const o=e[i].getAttribute("xlink:href");if(o){const e=t.querySelector(o),i=document.querySelector(o);e||!i||r[o]||(r[o]=await xn(i,n,!0))}}const i=Object.values(r);if(i.length){const n="http://www.w3.org/1999/xhtml",e=document.createElementNS(n,"svg");e.setAttribute("xmlns",n),e.style.position="absolute",e.style.width="0",e.style.height="0",e.style.overflow="hidden",e.style.display="none";const r=document.createElementNS(n,"defs");e.appendChild(r);for(let t=0;t<i.length;t++)r.appendChild(i[t]);t.appendChild(e)}return t}(t,n))):null}const $n=/url\((['"]?)([^'"]+?)\1\)/g,Sn=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Mn=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function jn(t){return-1!==t.search($n)}async function Cn(t,n,e){if(!jn(t))return t;const r=function(t,{preferredFontFormat:n}){return n?t.replace(Mn,(t=>{for(;;){const[e,,r]=Sn.exec(t)||[];if(!r)return"";if(r===n)return`src: ${e};`}})):t}(t,e),i=function(t){const n=[];return t.replace($n,((t,e,r)=>(n.push(r),t))),n.filter((t=>!wn(t)))}(r);return i.reduce(((t,r)=>t.then((t=>async function(t,n,e,r){try{const i=e?function(t,n){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 e=document.implementation.createHTMLDocument(),r=e.createElement("base"),i=e.createElement("a");return e.head.appendChild(r),e.body.appendChild(i),n&&(r.href=n),i.href=t,i.href}(n,e):n,o=gn(n);let s;return s=await bn(i,o,r),t.replace(function(t){const n=t.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${n})(['"]?\\))`,"g")}(n),`$1${s}$3`)}catch(t){}return t}(t,r,n,e)))),Promise.resolve(r))}async function zn(t,n,e){var r;const i=null===(r=n.style)||void 0===r?void 0:r.getPropertyValue(t);if(i){const r=await Cn(i,null,e);return n.style.setProperty(t,r,n.style.getPropertyPriority(t)),!0}return!1}async function In(t,n){ln(t,Element)&&(await async function(t,n){await zn("background",t,n)||await zn("background-image",t,n),await zn("mask",t,n)||await zn("-webkit-mask",t,n)||await zn("mask-image",t,n)||await zn("-webkit-mask-image",t,n)}(t,n),await async function(t,n){const e=ln(t,HTMLImageElement);if((!e||wn(t.src))&&(!ln(t,SVGImageElement)||wn(t.href.baseVal)))return;const r=e?t.src:t.href.baseVal,i=await bn(r,gn(r),n);await new Promise(((r,o)=>{t.onload=r,t.onerror=n.onImageErrorHandler?(...t)=>{try{r(n.onImageErrorHandler(...t))}catch(t){o(t)}}:o;const s=t;s.decode&&(s.decode=r),"lazy"===s.loading&&(s.loading="eager"),e?(t.srcset="",t.src=i):t.href.baseVal=i}))}(t,n),await async function(t,n){const e=rn(t.childNodes).map((t=>In(t,n)));await Promise.all(e).then((()=>t))}(t,n))}const Tn={};async function En(t){let n=Tn[t];if(null!=n)return n;const e=await fetch(t);return n={url:t,cssText:await e.text()},Tn[t]=n,n}async function _n(t,n){let e=t.cssText;const r=/url\(["']?([^"')]+)["']?\)/g,i=(e.match(/url\([^)]+\)/g)||[]).map((async i=>{let o=i.replace(r,"$1");return o.startsWith("https://")||(o=new URL(o,t.url).href),yn(o,n.fetchRequestInit,(({result:t})=>(e=e.replace(i,`url(${t})`),[i,t])))}));return Promise.all(i).then((()=>e))}function On(t){if(null==t)return[];const n=[];let e=t.replace(/(\/\*[\s\S]*?\*\/)/gi,"");const r=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const t=r.exec(e);if(null===t)break;n.push(t[0])}e=e.replace(r,"");const i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,o=new RegExp("((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})","gi");for(;;){let t=i.exec(e);if(null===t){if(t=o.exec(e),null===t)break;i.lastIndex=o.lastIndex}else o.lastIndex=i.lastIndex;n.push(t[0])}return n}function Pn(t){return t.trim().replace(/["']/g,"")}async function Bn(t,n){const e=await async function(t,n){if(null==t.ownerDocument)throw new Error("Provided element is not within a Document");const e=rn(t.ownerDocument.styleSheets),r=await async function(t,n){const e=[],r=[];return t.forEach((e=>{if("cssRules"in e)try{rn(e.cssRules||[]).forEach(((t,i)=>{if(t.type===CSSRule.IMPORT_RULE){let o=i+1;const s=En(t.href).then((t=>_n(t,n))).then((t=>On(t).forEach((t=>{try{e.insertRule(t,t.startsWith("@import")?o+=1:e.cssRules.length)}catch(n){console.error("Error inserting rule from remote css",{rule:t,error:n})}})))).catch((t=>{console.error("Error loading remote css",t.toString())}));r.push(s)}}))}catch(i){const o=t.find((t=>null==t.href))||document.styleSheets[0];null!=e.href&&r.push(En(e.href).then((t=>_n(t,n))).then((t=>On(t).forEach((t=>{o.insertRule(t,o.cssRules.length)})))).catch((t=>{console.error("Error loading remote stylesheet",t)}))),console.error("Error inlining remote css file",i)}})),Promise.all(r).then((()=>(t.forEach((t=>{if("cssRules"in t)try{rn(t.cssRules||[]).forEach((t=>{e.push(t)}))}catch(n){console.error(`Error while reading CSS rules from ${t.href}`,n)}})),e)))}(e,n);return function(t){return t.filter((t=>t.type===CSSRule.FONT_FACE_RULE)).filter((t=>jn(t.style.getPropertyValue("src"))))}(r)}(t,n),r=function(t){const n=new Set;return function t(e){(e.style.fontFamily||getComputedStyle(e).fontFamily).split(",").forEach((t=>{n.add(Pn(t))})),Array.from(e.children).forEach((n=>{n instanceof HTMLElement&&t(n)}))}(t),n}(t);return(await Promise.all(e.filter((t=>r.has(Pn(t.style.fontFamily)))).map((t=>Cn(t.cssText,t.parentStyleSheet?t.parentStyleSheet.href:null,n))))).join("\n")}async function Un(t,n={}){const{width:e,height:r}=cn(t,n),i=await xn(t,n,!0);return await async function(t,n){const e=null!=n.fontEmbedCSS?n.fontEmbedCSS:n.skipFonts?null:await Bn(t,n);if(e){const n=document.createElement("style"),r=document.createTextNode(e);n.appendChild(r),t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n)}}(i,n),await In(i,n),function(t,n){const{style:e}=t;n.backgroundColor&&(e.backgroundColor=n.backgroundColor),n.width&&(e.width=`${n.width}px`),n.height&&(e.height=`${n.height}px`);const r=n.style;null!=r&&Object.keys(r).forEach((t=>{e[t]=r[t]}))}(i,n),await async function(t,n,e){const r="http://www.w3.org/2000/svg",i=document.createElementNS(r,"svg"),o=document.createElementNS(r,"foreignObject");return i.setAttribute("width",`${n}`),i.setAttribute("height",`${e}`),i.setAttribute("viewBox",`0 0 ${n} ${e}`),o.setAttribute("width","100%"),o.setAttribute("height","100%"),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("externalResourcesRequired","true"),i.appendChild(o),o.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}`))}(i)}(i,e,r)}const Wn=t(class extends n{get host(){return this}workspace;async onWorkspaceChange(t){const n=t?.id;if(!n)return;await Promise.resolve();const e=this.core.store.state.activeWorkspace?.id;e!==n&&(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;objectContextMenuItems;scaleMax=Ot;validateScaleMax(t){t>Ot?(console.warn("scaleMax cannot be greater than 1000."),this.scaleMax=Ot,this.core.store.state.scaleMax=this.scaleMax):this.core.store.state.scaleMax=t}scaleMin=Pt;validateScaleMin(t){t<Pt?(console.warn("scaleMin cannot be less than 0.0001."),this.scaleMin=Pt,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}theme="light";onThemeChange(t){this.core.themeManager.setTheme(t)}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)}wheelEnabled=!0;isLoading=!1;onIsLoadingChange(){this.syncLoadingState()}isEngineReady;activeToolChange;objectsSelectionChange;workspacesChange;activeWorkspaceChange;longpress;objectsChange;objectsAdded;objectsRemoved;objectsUpdated;undoStateChange;objectsInViewportChange;viewportChange;awarenessChange;forceUpdate=0;async triggerSelectionChange(){this.objectsSelectionChange.emit()}handleWheel(t){this.core.store.isDisabled||this.wheelEnabled&&(this.core.store.state.isContextMenuVisible&&this.hideContextMenu(),this.viewport.handleWheel(t),this.core.store.state?.activeTool?.handleWheel(t))}handlePointerDown(t){this.core.store.isDisabled||(F.isTouchDevice()&&c.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=Dt.throttle((t=>{this.viewport.handlePointerMove(t),this.core.store.state?.activeTool?.handlePointerMove(t)}),16);handlePointerMove(t){this.core.store.isDisabled||(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 n=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(),n&&(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))}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.shouldHandleKeyboardEvent(t)&&this.keyHandler.handleKeyDown(t)}handleKeyUp(t){!this.core.store.isDisabled&&this.shouldHandleKeyboardEvent(t)&&this.keyHandler.handleKeyUp(t)}shouldHandleKeyboardEvent(t){const e=t.composedPath();if(e.includes(this.host))return!0;if(e.some((t=>t instanceof n&&("DIALOG"===t.tagName||"KRITZEL-DIALOG"===t.tagName||"dialog"===t.getAttribute?.("role")||"alertdialog"===t.getAttribute?.("role")))))return!1;const r=t.target;return!r.matches?.('input, textarea, select, [contenteditable="true"], [contenteditable=""]')}preventDoubleTapZoomOnTouchDevices(t){t.cancelable&&t.preventDefault()}async registerTool(t,n,e){if("function"!=typeof n||!(n.prototype instanceof a))return console.error(`Failed to register tool "${t}": Tool class must be a constructor function`),null;const r=h.registerTool(t,n,this.core);return e&&Object.entries(e).forEach((([t,n])=>{r[t]=n})),Promise.resolve(r)}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 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.copy()}async cut(){this.core.cut()}async paste(t,n){this.core.paste(t,n)}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 f)),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 getObjectById(t){return this.core.store.allObjects.find((n=>n.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=this.core.store.state.scale,t.zIndex=this.core.store.currentZIndex,t.workspaceId=this.core.store.state.activeWorkspace.id,l.isInstanceOf(t,"KritzelText")){const n=t.content;t.editor=t.createEditor(),n&&t.setContent(n)}if(l.isInstanceOf(t,"KritzelGroup")&&t._pendingChildren.length>0){const n=new Map,e=[],r=t=>{if(0===t._pendingChildren.length)return;const i=t._pendingChildren;t._pendingChildren=[],t.childIds=[],i.forEach((i=>{const o=i.id;i.id=i.generateId(),i._core=this.core,i.scale=this.core.store.state.scale,i.zIndex=this.core.store.currentZIndex,i.workspaceId=this.core.store.state.activeWorkspace.id,n.set(o,i.id),t.childIds.push(i.id),e.push(i),l.isInstanceOf(i,"KritzelGroup")&&r(i)}))};r(t),e.forEach((t=>{l.isInstanceOf(t,"KritzelLine")&&(t.startAnchor&&n.has(t.startAnchor.objectId)&&(t.startAnchor={objectId:n.get(t.startAnchor.objectId)}),t.endAnchor&&n.has(t.endAnchor.objectId)&&(t.endAnchor={objectId:n.get(t.endAnchor.objectId)}))})),e.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.emitObjectsAdded([t]),t}async updateObject(t,n){return this.core.deselectAllObjects(),this.core.updateObject(t,n),this.core.rerender(),this.emitObjectsUpdated([{object:t,changedProperties:Object.keys(n)}]),t}async removeObject(t){const n=this.core.store.objects;return n?(this.core.deselectAllObjects(),n.remove((n=>n.id===t.id)),this.core.rerender(),this.emitObjectsRemoved([t]),t):null}async getSelectedObjects(){const t=this.core.store.selectionGroup;return t?t.objects:[]}async getDisplayableShortcuts(){return this.keyHandler.getDisplayableShortcuts()}async selectObjects(t){const n=h.getTool("selection");n&&(this.core.store.state.activeTool?.onDeactivate(),this.core.store.setState("activeTool",n),this.core.deselectAllObjects(),this.core.selectObjects(t))}async selectAllObjectsInViewport(){const t=h.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 backToContent(){return this.viewport.centerFitNearestContent(20)}async centerAllObjects(t=!0){return this.viewport.centerFitAllObjects(t)}async setViewport(t,n,e){this.viewport.setViewport(t,n,e)}async panTo(t,n){this.viewport.panTo(t,n)}async zoomTo(t,n,e){this.viewport.zoomTo(t,n,e)}async getViewport(){return this.viewport.getViewport()}async screenToWorld(t,n){return this.viewport.screenToWorld(t,n)}async worldToScreen(t,n){return this.viewport.worldToScreen(t,n)}async getCopiedObjects(){return this.core.store.state.copiedObjects||[]}async getObjectsInViewport(){return this.core.getObjectsInViewport()}async getScreenshot(t="png"){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},e={filter:t=>!("KRITZEL-CONTEXT-MENU"===t.tagName||t.classList&&t.classList.contains("debug-panel"))};let r;try{r="svg"===t?await Un(this.host,e):await async function(t,n={}){return(await async function(t,n={}){const{width:e,height:r}=cn(t,n),i=await Un(t,n),o=await hn(i),s=document.createElement("canvas"),a=s.getContext("2d"),c=n.pixelRatio||function(){let t,n;try{n=process}catch(t){}const e=n&&n.env?n.env.devicePixelRatio:null;return e&&(t=parseInt(e,10),Number.isNaN(t)&&(t=1)),t||window.devicePixelRatio||1}(),u=n.canvasWidth||e,h=n.canvasHeight||r;return s.width=u*c,s.height=h*c,n.skipAutoScale||function(t){(t.width>un||t.height>un)&&(t.width>un&&t.height>un?t.width>t.height?(t.height*=un/t.width,t.width=un):(t.width*=un/t.height,t.height=un):t.width>un?(t.height*=un/t.width,t.width=un):(t.width*=un/t.height,t.height=un))}(s),s.style.width=`${u}`,s.style.height=`${h}`,n.backgroundColor&&(a.fillStyle=n.backgroundColor,a.fillRect(0,0,s.width,s.height)),a.drawImage(o,0,0,s.width,s.height),s}(t,n)).toDataURL()}(this.host,e)}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(){try{const t=`${this.core.store.state?.activeWorkspace?.name||"workspace"}-${(new Date).toISOString().replace(/[:.]/g,"-")}.png`,n=await this.getScreenshot("png");if(!n)return void console.error("Failed to export viewport as PNG: screenshot could not be generated");const e=document.createElement("a");e.download=t,e.href=n,e.click()}catch(t){console.error("Failed to export viewport as PNG:",t)}}async exportViewportAsSvg(){try{const t=`${this.core.store.state?.activeWorkspace?.name||"workspace"}-${(new Date).toISOString().replace(/[:.]/g,"-")}.svg`,n=await this.getScreenshot("svg");if(!n)return void console.error("Failed to export viewport as SVG: screenshot could not be generated");const e=document.createElement("a");e.download=t,e.href=n,e.click()}catch(t){console.error("Failed to export viewport as SVG:",t)}}async getSelectedObjectsAsSvgString(t){const n=await this.getSelectedObjects();if(!n||0===n.length)return null;const e=t?.theme??this.core.themeManager.getStoredTheme();return nn.generateSvg(n,{theme:e,padding:t?.padding??0,includeXmlDeclaration:!0})}async exportSelectedObjectsAsSvg(t){try{const n=await this.getSelectedObjectsAsSvgString(t);if(!n)return void console.warn("No objects selected for SVG export");const e=`selection-${(new Date).toISOString().replace(/[:.]/g,"-")}.svg`,r=new Blob([n],{type:"image/svg+xml;charset=utf-8"}),i=URL.createObjectURL(r),o=document.createElement("a");o.download=e,o.href=i,o.click(),URL.revokeObjectURL(i)}catch(t){console.error("Failed to export selected objects as SVG:",t)}}async getSelectedObjectsAsPngDataUrl(t){const n=await this.getSelectedObjectsAsSvgString({theme:t?.theme,padding:t?.padding});if(!n)return null;const e=t?.scale??2;return new Promise(((t,r)=>{const i=new Image,o=new Blob([n],{type:"image/svg+xml;charset=utf-8"}),s=URL.createObjectURL(o);i.onload=()=>{const n=document.createElement("canvas");n.width=i.width*e,n.height=i.height*e;const o=n.getContext("2d");if(!o)return URL.revokeObjectURL(s),void r(new Error("Failed to get canvas context"));o.scale(e,e),o.drawImage(i,0,0),URL.revokeObjectURL(s),t(n.toDataURL("image/png"))},i.onerror=()=>{URL.revokeObjectURL(s),r(new Error("Failed to load SVG for PNG conversion"))},i.src=s}))}async exportSelectedObjectsAsPng(t){try{const n=await this.getSelectedObjectsAsPngDataUrl(t);if(!n)return void console.warn("No objects selected for PNG export");const e=`selection-${(new Date).toISOString().replace(/[:.]/g,"-")}.png`,r=document.createElement("a");r.download=e,r.href=n,r.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 n=t.serialize({includeObjects:!0});return JSON.stringify(n,null,2)}async importFromJson(t){const n=JSON.parse(t);if(!n.__class__||"KritzelWorkspace"!==n.__class__)throw new Error("Invalid workspace data: missing or incorrect __class__ identifier");n.version&&n.version!==M&&console.warn(`Workspace version mismatch: expected ${M}, got ${n.version}`);const e=_.generateUUID();let r=n.viewport||{centerWorldX:0,centerWorldY:0,scale:1};if("translateX"in r&&!("centerWorldX"in r)){const t=r.scale??1;r={centerWorldX:-(r.translateX??0)/t,centerWorldY:-(r.translateY??0)/t,scale:t}}const i=new S(e,n.name||"Imported Workspace",r);if(this.core.createWorkspace(i),this.workspacesChange.emit(this.core.store.state.workspaces),this.core.beforeWorkspaceChange(),await this.core.initializeWorkspace(i),n.objects&&Array.isArray(n.objects)){const t=new Ht(this.core);for(const r of n.objects){const n=t.revive(r);n&&(n.workspaceId=e,this.core.addObject(n))}}this.core.rerender(),this.activeWorkspaceChange.emit(i)}async loadObjectsFromJson(t){const n=JSON.parse(t);if(!n.__class__||"KritzelWorkspace"!==n.__class__)throw new Error("Invalid workspace data: missing or incorrect __class__ identifier");n.version&&n.version!==M&&console.warn(`Workspace version mismatch: expected ${M}, got ${n.version}`);const e=this.core.store.state.activeWorkspace;if(!e)throw new Error("Cannot load objects: no active workspace is loaded");const r=e.id;let i=0;if(n.objects&&Array.isArray(n.objects)){const t=new Ht(this.core);for(const e of n.objects){const n=t.revive(e);n&&(n.workspaceId=r,this.core.addObject(n),i++)}}return this.core.rerender(),i}async downloadAsJson(t){try{const n=await this.exportAsJson(),e=this.core.store.state?.activeWorkspace?.name||"workspace",r=(new Date).toISOString().replace(/[:.]/g,"-"),i=t||`${e}-${r}`,o=new Blob([n],{type:"application/json;charset=utf-8"}),s=URL.createObjectURL(o),a=document.createElement("a");a.download=`${i}.json`,a.href=s,a.click(),URL.revokeObjectURL(s)}catch(t){console.error("Failed to download workspace as JSON:",t)}}async importFromFile(){return new Promise(((t,n)=>{const e=document.createElement("input");e.type="file",e.accept=".json,application/json",e.style.display="none";const r=()=>{e.removeEventListener("change",i),e.removeEventListener("cancel",o),document.body.removeChild(e)},i=async e=>{const i=e.target,o=i.files?.[0];if(!o)return r(),void t();try{const e=new FileReader;e.onload=async e=>{try{const n=e.target?.result;await this.importFromJson(n),r(),t()}catch(t){r(),console.error("Failed to import workspace from file:",t),n(t)}},e.onerror=()=>{r(),console.error("Failed to read file:",e.error),n(e.error)},e.readAsText(o)}catch(t){r(),console.error("Failed to process file:",t),n(t)}},o=()=>{r(),t()};e.addEventListener("change",i),e.addEventListener("cancel",o),document.body.appendChild(e),e.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 n=t;let e=this.core.getWorkspaces().find((t=>t.id===n));e?e.isPublic=!0:(e=new S(n,"Shared Workspace"),e.isPublic=!0,this.core.createWorkspace(e)),this.workspacesChange.emit(this.core.store.state.workspaces),this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(e),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()}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;_defaultUndoState={canUndo:!1,canRedo:!1,undoStackSize:0,redoStackSize:0};syncLoadingState(){this.core.store.state.isLoading=this._isWorkspaceLoading||this.isLoading}get isSelecting(){return this.core.store.state.activeTool instanceof v&&this.core.store.state.isSelecting}get isSelectionActive(){return this.core.store.state.activeTool instanceof v&&null!==this.core.store.selectionGroup}constructor(t){super(),!1!==t&&this.__registerHost(),this.__attachShadow(),this.isEngineReady=e(this,"isEngineReady"),this.activeToolChange=e(this,"activeToolChange"),this.objectsSelectionChange=e(this,"objectsSelectionChange"),this.workspacesChange=e(this,"workspacesChange"),this.activeWorkspaceChange=e(this,"activeWorkspaceChange"),this.longpress=e(this,"longpress"),this.objectsChange=e(this,"objectsChange"),this.objectsAdded=e(this,"objectsAdded"),this.objectsRemoved=e(this,"objectsRemoved"),this.objectsUpdated=e(this,"objectsUpdated"),this.undoStateChange=e(this,"undoStateChange"),this.objectsInViewportChange=e(this,"objectsInViewportChange"),this.viewportChange=e(this,"viewportChange"),this.awarenessChange=e(this,"awarenessChange"),this.core=new tn(this)}disconnectedCallback(){this.throttledPointerMoveMulti.cancel(),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()}componentWillLoad(){this.core.setEditorId(this.editorId),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 Vt(this.core,this.globalContextMenuItems,this.objectContextMenuItems),this.keyHandler=new Kt(this.core),this.viewport=new Ft(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.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}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 n=this.core.store.state.activeWorkspace;n&&this.activeWorkspaceChange.emit(n),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,n=!0){const e=this.core.getWorkspaces().find((n=>n.id===t));e?this.core.store.state.activeWorkspace?.id!==e.id&&(this.core.beforeWorkspaceChange(),await this.initializeWorkspaceIfNeeded(e),this.activeWorkspaceChange.emit(this.core.store.state.activeWorkspace)):n&&console.warn(`[KritzelEngine] No workspace found with ID: ${t}`)}async initializeWorkspaceIfNeeded(t,n){const e=t?.id??null,r=e??(n?.skipFallbackCreation?"__NO_FALLBACK__":"__AUTO__");if(e&&this.core.store.state.activeWorkspace?.id===e)return;if(this._workspaceInitializationPromise&&this._workspaceInitializationTargetKey===r)return void await this._workspaceInitializationPromise;this._isWorkspaceLoading=!0,this.syncLoadingState();const i=this.core.initializeWorkspace(t,n);this._workspaceInitializationPromise=i,this._workspaceInitializationTargetKey=r;try{await i}finally{this._workspaceInitializationPromise===i&&(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 n=t.undoState,e=null!==this.core.store.selectionGroup;this.objectsChange.emit(this.core.store.allObjects),this.undoStateChange.emit(n),this._lastHadSelectionGroup!==e&&(this._lastHadSelectionGroup=e,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 v||(this.core.clearSelection(),this.core.store.objects?.remove((t=>t instanceof f)),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 y||this.core.resetActiveText(),t instanceof g||this.core.resetActiveShape(),this.core.store.state.skipContextMenu=!1,this.core.store.state.copiedObjects=void 0,t&&this.activeToolChange.emit(t),$.forceHideKeyboard(),this.core.rerender()}render(){if(!this.viewport)return r(i,null,this.core.store.state.isLoading&&r("div",{class:"workspace-loading-overlay"},r("span",{class:"workspace-loading-spinner"}),"Loading..."));const t=this.core.themeManager.getStoredTheme(),n=window.getComputedStyle(this.host).getPropertyValue("--kritzel-selection-handle-size").trim()||"6px",e=parseFloat(n),o=2*e<14?14:e,s=this.core.store.state.viewportWidth/2+this.core.store.state.translateX,a=this.core.store.state.viewportHeight/2+this.core.store.state.translateY,c=this.core.store.objectsInViewport;return this.core.cursorManager.applyCursor(),this.core.store.state.hasViewportChanged&&(this.viewportChange.emit(this.viewport.getViewport()),this.core.store.totalObjectCount>0&&this.emitObjectsInViewportChange()),r(i,null,this.core.store.state.isLoading&&r("div",{class:"workspace-loading-overlay"},r("span",{class:"workspace-loading-spinner"}),"Loading..."),this.core.store.state.debugInfo.showViewportInfo&&r("div",{class:"debug-panel"},r("div",null,"ActiveWorkspaceId: ",this.core.store.state?.activeWorkspace?.id),r("div",null,"ActiveWorkspaceName: ",this.core.store.state?.activeWorkspace?.name),r("div",null,"TranslateX: ",this.core.store.state?.translateX),r("div",null,"TranslateY: ",this.core.store.state?.translateY),r("div",null,"ViewportWidth: ",this.core.store.state?.viewportWidth),r("div",null,"ViewportHeight: ",this.core.store.state?.viewportHeight),r("div",null,"PointerCount: ",this.core.store.state.pointers.size),r("div",null,"Scale: ",this.core.store.state?.scale),r("div",null,"ActiveTool: ",this.core.store.state?.activeTool?.name),r("div",null,"HasViewportChanged: ",this.core.store.state?.hasViewportChanged?"true":"false"),r("div",null,"IsEnabled: ",this.core.store.state?.isEnabled?"true":"false"),r("div",null,"IsScaling: ",this.core.store.state?.isScaling?"true":"false"),r("div",null,"IsPanning: ",this.core.store.state?.isPanning?"true":"false"),r("div",null,"IsSelecting: ",this.isSelecting?"true":"false"),r("div",null,"IsSelectionActive: ",this.isSelectionActive?"true":"false"),r("div",null,"IsResizeHandleSelected: ",this.core.store.state.isResizeHandleSelected?"true":"false"),r("div",null,"IsRotationHandleSelected: ",this.core.store.state.isRotationHandleSelected?"true":"false"),r("div",null,"IsRotationHandleHovered: ",this.core.store.state.isRotationHandleHovered?"true":"false"),r("div",null,"IsDrawing: ",this.core.store.state.isDrawing?"true":"false"),r("div",null,"IsWriting: ",this.core.store.state.isWriting?"true":"false"),r("div",null,"IsPointerDown: ",this.core.store.isPointerDown?"true":"false"),r("div",null,"PointerX: ",this.core.store.state?.pointerX),r("div",null,"PointerY: ",this.core.store.state?.pointerY),r("div",null,"TotalObjects: ",this.core.store.totalObjectCount),r("div",null,"ObjectsInViewport: ",this.core.store.objectsInViewport.length),r("div",null,"SelectedObjects: ",this.core.store.selectionGroup?.objects.length||0),r("div",null,"ViewportCenter: (",s.toFixed(2),", ",a.toFixed(2),")")),r("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})`}},c?.map((n=>r("div",{key:n.id,id:n.id,class:"object",style:{transform:n?.transformationMatrix,transformOrigin:"top left",position:"absolute",zIndex:n.zIndex.toString(),pointerEvents:this.core.store.state.isScaling?"none":"auto"}},l.isInstanceOf(n,"KritzelPath")&&(()=>{const e=(n.markedForRemoval?.5:1)*n.opacity;return r("svg",{ref:t=>t&&n.mount(t),xmlns:"http://www.w3.org/2000/svg",style:{height:n?.totalHeight+"px",width:n?.totalWidth+"px",left:"0",top:"0",position:"absolute",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,pointerEvents:n.markedForRemoval?"none":"auto",overflow:"visible"},viewBox:n?.viewBox},r("path",{d:n?.d,fill:D.applyOpacity(n.fill,e,t),stroke:D.applyOpacity(n?.stroke,e,t),"shape-rendering":n.isLowRes()?"optimizeSpeed":"auto"}))})(),l.isInstanceOf(n,"KritzelLine")&&(()=>{const e=(n.markedForRemoval?.5:1)*n.opacity;return r("svg",{ref:t=>t&&n.mount(t),xmlns:"http://www.w3.org/2000/svg",style:{height:n?.totalHeight+"px",width:n?.totalWidth+"px",left:"0",top:"0",position:"absolute",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,pointerEvents:n.markedForRemoval?"none":"auto",overflow:"visible"},viewBox:n?.viewBox},(n.hasStartArrow||n.hasEndArrow)&&r("defs",null,n.hasStartArrow&&r("marker",{id:n.startMarkerId,markerWidth:n.getArrowSize("start"),markerHeight:n.getArrowSize("start"),refX:0,refY:n.getArrowSize("start")/2,orient:"auto-start-reverse",markerUnits:"userSpaceOnUse"},r("path",{d:n.getArrowPath(n.arrows?.start?.style),fill:D.applyOpacity(n.getArrowFill("start"),e),transform:`scale(${n.getArrowSize("start")/10})`})),n.hasEndArrow&&r("marker",{id:n.endMarkerId,markerWidth:n.getArrowSize("end"),markerHeight:n.getArrowSize("end"),refX:0,refY:n.getArrowSize("end")/2,orient:"auto",markerUnits:"userSpaceOnUse"},r("path",{d:n.getArrowPath(n.arrows?.end?.style),fill:D.applyOpacity(n.getArrowFill("end"),e),transform:`scale(${n.getArrowSize("end")/10})`}))),r("path",{d:this.core.anchorManager.computeClippedLinePath(n),fill:"none",stroke:"transparent","stroke-width":Math.max(n?.strokeWidth||0,10),"stroke-linecap":"round"}),r("path",{d:this.core.anchorManager.computeClippedLinePath(n),fill:"none",stroke:D.applyOpacity(n?.stroke,e,t),"stroke-width":n?.strokeWidth,"stroke-linecap":"round","marker-start":n.hasStartArrow?`url(#${n.startMarkerId})`:void 0,"marker-end":n.hasEndArrow?`url(#${n.endMarkerId})`:void 0}))})(),l.isInstanceOf(n,"KritzelImage")&&"ready"===n.loadState&&r("img",{ref:t=>t&&n.mount(t),src:n.resolvedSrc||n.src,style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto",backgroundColor:D.resolveThemeColor(n.backgroundColor,t),borderColor:D.resolveThemeColor(n.borderColor,t),borderWidth:n.borderWidth+"px",borderStyle:"solid",padding:n.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()}),l.isInstanceOf(n,"KritzelImage")&&"ready"!==n.loadState&&r("div",{ref:()=>n.ensureLoaded(),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto",backgroundColor:D.resolveThemeColor({light:"#e5e7eb",dark:"#2a2a2a"},t),borderColor:D.resolveThemeColor("error"===n.loadState?{light:"#9ca3af",dark:"#6b7280"}:n.borderColor,t),borderWidth:"error"===n.loadState?"1px":n.borderWidth+"px",borderStyle:"solid",padding:n.padding+"px",overflow:"hidden",userSelect:"none",display:"flex",alignItems:"center",justifyContent:"center"}},r("kritzel-icon",{name:"error"===n.loadState?"image-off":"image",size:Math.max(16,.3*Math.min(n.totalWidth,n.totalHeight)),style:{color:D.resolveThemeColor({light:"#9ca3af",dark:"#6b7280"},t)}})),l.isInstanceOf(n,"KritzelCustomElement")&&r("div",{ref:t=>t&&n.mount(t),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto",backgroundColor:D.resolveThemeColor(n.backgroundColor,t),borderColor:D.resolveThemeColor(n.borderColor,t),borderWidth:n.borderWidth+"px",borderStyle:"solid",padding:n.padding+"px",overflow:"hidden",display:"block"}}),l.isInstanceOf(n,"KritzelSelectionGroup")&&!this.core.displaySelectionLineUI(n)&&r("div",{ref:t=>t&&n.mount(t),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto"}}),l.isInstanceOf(n,"KritzelSelectionBox")&&r("div",{ref:t=>t&&n.mount(t),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto",backgroundColor:D.resolveThemeColor(n.backgroundColor,t),borderColor:D.resolveThemeColor(n.borderColor,t),borderWidth:n.borderWidth+"px",borderStyle:"solid"}}),l.isInstanceOf(n,"KritzelText")&&r("div",{style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,opacity:n.markedForRemoval?"0.5":n.opacity.toString(),pointerEvents:n.markedForRemoval?"none":"auto"}},r("div",{id:"text-object",ref:t=>t&&n.mount(t),onPointerDown:t=>n.handlePointerDown(t),onPointerMove:t=>n.handlePointerMove(t),onPointerUp:t=>n.handlePointerUp(t),style:{minWidth:n.initialWidth+"px",minHeight:n.initialHeight+"px",maxWidth:"500px",height:"auto",width:"max-content",transformOrigin:"top left",transform:`scale(${n.scaleFactor})`,backgroundColor:D.resolveThemeColor(n.backgroundColor,t),overflow:"visible"}})),l.isInstanceOf(n,"KritzelShape")&&(()=>{const e=(n.markedForRemoval?.5:1)*n.opacity,i=D.resolveThemeColor(n.fillColor,t),o=D.resolveThemeColor(n.strokeColor,t),s=!!i&&"transparent"!==i&&o===i;return r("div",{ref:t=>t&&n.mount(t),onPointerDown:t=>n.handlePointerDown(t),onPointerMove:t=>n.handlePointerMove(t),onPointerUp:t=>n.handlePointerUp(t),style:{position:"absolute",left:"0",top:"0",width:n.totalWidth+"px",height:n.totalHeight+"px",transform:0!==n.rotationDegrees?`rotate(${n.rotationDegrees}deg)`:void 0,transformOrigin:0!==n.rotationDegrees?`${n.totalWidth/2}px ${n.totalHeight/2}px`:void 0,pointerEvents:n.markedForRemoval?"none":"auto",overflow:"visible"}},r("svg",{xmlns:"http://www.w3.org/2000/svg",style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",overflow:"visible",pointerEvents:"none"},viewBox:n.viewBox,preserveAspectRatio:"none"},r("path",{d:n.getSvgPath(),fill:D.applyOpacity(n.fillColor,e,t),stroke:s?"none":D.applyOpacity(n.strokeColor,e,t),"stroke-width":s?0:n.strokeWidth})),r("div",{ref:t=>t&&n.mountTextEditor(t),style:{position:"absolute",top:"0",left:"0",width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center",textAlign:"center",overflow:"hidden",pointerEvents:n.isEditing?"auto":"none"}}))})(),this.core.store.state.debugInfo.showObjectInfo&&n.isDebugInfoVisible&&r("div",{style:{pointerEvents:"none",position:"absolute",left:`${n.totalWidth}px`,top:"0",zIndex:(n.zIndex+2).toString()}},r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"Id: ",n.id),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"userId: ",n.userId),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"width: ",n.width),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"height: ",n.height),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"translateX: ",n.translateX),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"translateY: ",n.translateY),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"rotationDegrees: ",n.rotationDegrees),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"zIndex: ",n.zIndex),l.isInstanceOf(n,"KritzelImage")&&r("div",null,r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"assetId: ",n.assetId),r("div",{style:{whiteSpace:"nowrap",fontSize:"10px"}},"mimeType: ",n.mimeType))),(this.core.displaySelectionGroupUI(n)||this.core.displaySelectionLineUI(n))&&(()=>{const i=l.isInstanceOf(n,"KritzelSelectionGroup"),s=this.core.store.objects?.localClientId,a=this.core.store.objects?.awareness?.getStates(),c=i&&(null!=n.userId&&null!=this.core.user?.id&&n.userId!==this.core.user.id||null!=n.userId&&null!=this.core.user?.id&&n.userId===this.core.user.id&&null!=n.clientId&&null!=s&&n.clientId!==s&&!0===a?.has(n.clientId));let u;if(c&&a&&(i&&null!=n.clientId&&(u=a.get(n.clientId)?.user?.color),!u))for(const t of a.values())if(t.user?.id===n.userId){u=t.user.color;break}const h=u??(D.resolveThemeColor(n.borderColor,t)||"var(--kritzel-selection-border-color, #007AFF)"),f=u??"var(--kritzel-selection-handle-stroke-color, #007AFF)";return r("svg",{xmlns:"http://www.w3.org/2000/svg",style:{zIndex:(n.zIndex+1).toString(),height:n?.totalHeight.toString(),width:n?.totalWidth.toString(),left:"0",top:"0",position:"absolute",transform:`rotate(${n.rotationDegrees}deg)`,transformOrigin:`${n.totalWidth/2}px ${n.totalHeight/2}px`,overflow:"visible",pointerEvents:"none"}},this.core.displaySelectionGroupUI(n)&&r("g",{class:"selection-group-ui",style:{pointerEvents:"none"}},(()=>{const t=c&&l.isInstanceOf(n,"KritzelSelectionGroup")&&1===n.objects.length&&l.isInstanceOf(n.objects[0],"KritzelLine")?n.objects[0]:null;return t?r("g",{class:"selection-line-borders"},r("path",{class:"selection-line-border",d:this.core.anchorManager.computeClippedLinePath(t,!0),style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"round",fill:"none"}})):r("g",{class:"selection-group-borders"},r("line",{x1:"0",y1:"0",x2:n.totalWidth,y2:"0",style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),r("line",{x1:"0",y1:"0",x2:"0",y2:n.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),r("line",{x1:"0",y1:n.totalHeight,x2:n.totalWidth,y2:n.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}),r("line",{x1:n.totalWidth,y1:"0",x2:n.totalWidth,y2:n.totalHeight,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"square"}}))})(),!this.isSelecting&&!c&&r("g",{class:"selection-group-handles",style:{pointerEvents:"auto"}},r("rect",{class:"resize-handle top-left",x:""+-(e-1)*n.scale/this.core.store.state?.scale,y:""+-(e-1)*n.scale/this.core.store.state?.scale,width:""+2*(e-1)*n.scale/this.core.store.state?.scale,height:""+2*(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("rect",{class:"resize-handle-overlay top-left",x:""+-o*n.scale/this.core.store.state?.scale,y:""+-o*n.scale/this.core.store.state?.scale,width:""+2*o*n.scale/this.core.store.state?.scale,height:""+2*o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("rect",{class:"resize-handle top-right",x:""+(n.totalWidth-(e-1)*n.scale/this.core.store.state?.scale),y:""+-(e-1)*n.scale/this.core.store.state?.scale,width:""+2*(e-1)*n.scale/this.core.store.state?.scale,height:""+2*(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("rect",{class:"resize-handle-overlay top-right",x:""+(n.totalWidth-o*n.scale/this.core.store.state?.scale),y:""+-o*n.scale/this.core.store.state?.scale,width:""+2*o*n.scale/this.core.store.state?.scale,height:""+2*o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("rect",{class:"resize-handle bottom-left",x:""+-(e-1)*n.scale/this.core.store.state?.scale,y:""+(n.totalHeight-(e-1)*n.scale/this.core.store.state?.scale),width:""+2*(e-1)*n.scale/this.core.store.state?.scale,height:""+2*(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("rect",{class:"resize-handle-overlay bottom-left",x:""+-o*n.scale/this.core.store.state?.scale,y:""+(n.totalHeight-o*n.scale/this.core.store.state?.scale),width:""+2*o*n.scale/this.core.store.state?.scale,height:""+2*o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("rect",{class:"resize-handle bottom-right",x:""+(n.totalWidth-(e-1)*n.scale/this.core.store.state?.scale),y:""+(n.totalHeight-(e-1)*n.scale/this.core.store.state?.scale),width:""+2*(e-1)*n.scale/this.core.store.state?.scale,height:""+2*(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("rect",{class:"resize-handle-overlay bottom-right",x:""+(n.totalWidth-o*n.scale/this.core.store.state?.scale),y:""+(n.totalHeight-o*n.scale/this.core.store.state?.scale),width:""+2*o*n.scale/this.core.store.state?.scale,height:""+2*o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("line",{x1:n.totalWidth/2,y1:"0",x2:n.totalWidth/2,y2:-15*n.scale/this.core.store.state?.scale,style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`}}),r("circle",{class:"rotation-handle",cx:n.totalWidth/2,cy:-15*n.scale/this.core.store.state?.scale,r:""+(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #ffffff)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("circle",{class:"rotation-handle-overlay",cx:n.totalWidth/2,cy:-15*n.scale/this.core.store.state?.scale,r:""+o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}))),this.core.displaySelectionLineUI(n)&&l.isInstanceOf(n,"KritzelLine")&&r("g",{class:"selection-line-ui",style:{pointerEvents:"none"}},r("g",{class:"selection-line-borders"},r("path",{class:"selection-line-border",d:this.core.anchorManager.computeClippedLinePath(n,!0),style:{stroke:h,strokeWidth:`calc(var(--kritzel-selection-border-width, 2px) * ${n.scale} / ${this.core.store.state?.scale})`,strokeLinecap:"round",fill:"none"}})),!this.isSelecting&&!c&&r("g",{class:"selection-line-handles",style:{pointerEvents:"auto"}},r("circle",{class:"selection-line-handle start",cx:n.startX-n.x,cy:n.startY-n.y,r:""+(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #000000)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("circle",{class:"selection-line-handle-overlay start","data-testid":"line-handle-start",cx:n.startX-n.x,cy:n.startY-n.y,r:""+o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("circle",{class:"selection-line-handle center",cx:void 0!==n.controlX?(n.startX+2*n.controlX+n.endX)/4-n.x:(n.startX-n.x+n.endX-n.x)/2,cy:void 0!==n.controlY?(n.startY+2*n.controlY+n.endY)/4-n.y:(n.startY-n.y+n.endY-n.y)/2,r:""+(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #000000)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("circle",{class:"selection-line-handle-overlay center","data-testid":"line-handle-center",cx:void 0!==n.controlX?(n.startX+2*n.controlX+n.endX)/4-n.x:(n.startX-n.x+n.endX-n.x)/2,cy:void 0!==n.controlY?(n.startY+2*n.controlY+n.endY)/4-n.y:(n.startY-n.y+n.endY-n.y)/2,r:""+o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}),r("circle",{class:"selection-line-handle end",cx:n.endX-n.x,cy:n.endY-n.y,r:""+(e-1)*n.scale/this.core.store.state?.scale,style:{fill:"var(--kritzel-selection-handle-color, #000000)",stroke:f,strokeWidth:`calc(2px * ${n.scale} / ${this.core.store.state?.scale})`,paintOrder:"fill"}}),r("circle",{class:"selection-line-handle-overlay end","data-testid":"line-handle-end",cx:n.endX-n.x,cy:n.endY-n.y,r:""+o*n.scale/this.core.store.state?.scale,style:{fill:"transparent",paintOrder:"fill"}}))))})()))),(()=>{const t=this.core.anchorManager.getAnchorLinesRenderData();return t?r("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&&r("g",{class:"anchor-line-start"},t.startAnchorViz.pathD?r("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"}}):r("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"}}),r("circle",{cx:t.startAnchorViz.centerX,cy:t.startAnchorViz.centerY,r:t.indicatorRadius,style:{fill:"var(--kritzel-snap-indicator-fill, rgba(0, 0, 0))",stroke:"var(--kritzel-snap-indicator-stroke, #007bff)",strokeWidth:t.indicatorStrokeWidth}})),t.endAnchorViz&&r("g",{class:"anchor-line-end"},t.endAnchorViz.pathD?r("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"}}):r("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"}}),r("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})(),(()=>{const t=this.core.anchorManager.getSnapIndicatorRenderData();return t?r("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"}},r("g",null,t.snapLinePath?r("path",{d:t.snapLinePath,fill:"none",style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))",strokeWidth:t.lineStrokeWidth,strokeDasharray:t.dashArray,strokeLinecap:"round"}}):void 0!==t.edgeX&&void 0!==t.edgeY&&r("line",{x1:t.edgeX,y1:t.edgeY,x2:t.centerX,y2:t.centerY,style:{stroke:"var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))",strokeWidth:t.lineStrokeWidth,strokeDasharray:t.dashArray,strokeLinecap:"round"}}),r("circle",{cx:t.centerX,cy:t.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&&r("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:"fixed",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.translateX+this.core.store.state.contextMenuX)/this.core.store.state.scale,y:(-this.core.store.state.translateY+this.core.store.state.contextMenuY)/this.core.store.state.scale},this.core.store.selectionGroup?.objects||[]),this.hideContextMenu()},onClose:()=>this.hideContextMenu()}),this.core.store.objects?.hasAwareness&&r("kritzel-awareness-cursors",{core:this.core}),this.core.store.state?.activeTool instanceof H&&!this.core.store.state.isScaling&&r("kritzel-cursor-trail",{core:this.core}))}static get watchers(){return{workspace:[{onWorkspaceChange:0}],activeWorkspaceId:[{onActiveWorkspaceIdChange:0}],syncConfig:[{onSyncConfigChange:0}],assetStorageConfig:[{onAssetStorageConfigChange:0}],user:[{onUserChange:0}],scaleMax:[{validateScaleMax:0}],scaleMin:[{validateScaleMin:0}],cursorTarget:[{onCursorTargetChange:0}],lockDrawingScale:[{onLockDrawingScaleChange:0}],theme:[{onThemeChange: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"],theme:[1],viewportBoundaryLeft:[2,"viewport-boundary-left"],viewportBoundaryRight:[2,"viewport-boundary-right"],viewportBoundaryTop:[2,"viewport-boundary-top"],viewportBoundaryBottom:[2,"viewport-boundary-bottom"],debugInfo:[16],wheelEnabled:[4,"wheel-enabled"],isLoading:[4,"is-loading"],forceUpdate:[32],triggerSelectionChange:[64],registerTool:[64],changeActiveTool:[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],getObjectById:[64],getAllObjects:[64],findObjects:[64],getObjectsTotalCount:[64],addObject:[64],updateObject:[64],removeObject:[64],getSelectedObjects:[64],getDisplayableShortcuts:[64],selectObjects:[64],selectAllObjectsInViewport:[64],clearSelection:[64],centerObjectInViewport:[64],backToContent:[64],centerAllObjects:[64],setViewport:[64],panTo:[64],zoomTo:[64],getViewport:[64],screenToWorld:[64],worldToScreen:[64],getCopiedObjects:[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]},[[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"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{workspace:[{onWorkspaceChange:0}],activeWorkspaceId:[{onActiveWorkspaceIdChange:0}],syncConfig:[{onSyncConfigChange:0}],assetStorageConfig:[{onAssetStorageConfigChange:0}],user:[{onUserChange:0}],scaleMax:[{validateScaleMax:0}],scaleMin:[{validateScaleMin:0}],cursorTarget:[{onCursorTargetChange:0}],lockDrawingScale:[{onLockDrawingScaleChange:0}],theme:[{onThemeChange:0}],viewportBoundaryLeft:[{onViewportBoundaryLeftChange:0}],viewportBoundaryRight:[{onViewportBoundaryRightChange:0}],viewportBoundaryTop:[{onViewportBoundaryTopChange:0}],viewportBoundaryBottom:[{onViewportBoundaryBottomChange:0}],debugInfo:[{onDebugInfoChange:0}],isLoading:[{onIsLoadingChange:0}]}]);function Rn(){"undefined"!=typeof customElements&&["kritzel-engine","kritzel-awareness-cursors","kritzel-context-menu","kritzel-cursor-trail","kritzel-icon"].forEach((t=>{switch(t){case"kritzel-engine":customElements.get(o(t))||customElements.define(o(t),Wn);break;case"kritzel-awareness-cursors":customElements.get(o(t))||K();break;case"kritzel-context-menu":customElements.get(o(t))||E();break;case"kritzel-cursor-trail":customElements.get(o(t))||V();break;case"kritzel-icon":customElements.get(o(t))||R()}}))}export{Et as A,Bt as D,Ct as I,H as K,_t as W,Mt as a,jt as b,zt as c,It as d,Ot as e,Pt as f,Rn as g,Wn as h,Tt as r}