0?1:0),d=s?4:6,p=Math.max(1,Math.ceil(u/d)),f=[],h=!1;f.push(c().createElement("div",{className:"layer-ui__library-header"},c().createElement(ji,{key:"import",type:"button",title:_("buttons.load"),"aria-label":_("buttons.load"),icon:Gi,onClick:function(){Eu().then((function(){i({isLibraryOpen:!1})})).catch(Un).catch((function(e){i({errorMessage:e.message})}))}}),t.length>0&&c().createElement(c().Fragment,null,c().createElement(ji,{key:"export",type:"button",title:_("buttons.export"),"aria-label":_("buttons.export"),icon:Yi,onClick:function(){xu().catch(Un).catch((function(e){i({errorMessage:e.message})}))}}),c().createElement(ji,{key:"reset",type:"button",title:_("buttons.resetLibrary"),"aria-label":_("buttons.resetLibrary"),icon:Ki,onClick:function(){window.confirm(_("alerts.resetLibrary"))&&(gu.resetLibrary(),l([]))}}))));for(var m=0;m0&&!h&&g+b>=t.length;h=h||y,v.push(c().createElement(Gd,{key:b},c().createElement(mp,{elements:t[g+b],pendingElements:y?a:void 0,onRemoveFromLibrary:n.bind(null,g+b),onClick:y?r.bind(null,a):o.bind(null,t[g+b])})))}f.push(c().createElement(Wd,{align:"center",gap:1,key:m},v))}return c().createElement(Gd,{align:"start",gap:1,className:"layer-ui__library-items"},f)},Dp=function(e){var t=e.onClickOutside,n=e.onInsertShape,r=e.pendingElements,o=e.onAddToLibrary,a=e.setAppState,i=(0,l.useRef)(null);!function(e,t){(0,l.useEffect)((function(){var n=function(n){e.current&&(n.target instanceof Element&&(e.current.contains(n.target)||!document.body.contains(n.target))||t(n))};return document.addEventListener("pointerdown",n,!1),function(){document.removeEventListener("pointerdown",n)}}),[e,t])}(i,(function(e){e.target.closest(".ToolIcon_type_button__library")||t(e)}));var s=N((0,l.useState)([]),2),u=s[0],d=s[1],h=N((0,l.useState)("preloading"),2),m=h[0],g=h[1],v=(0,l.useRef)(null);(0,l.useEffect)((function(){return Promise.race([new Promise((function(e){v.current=setTimeout((function(){e("loading")}),100)})),gu.loadLibrary().then((function(e){d(e),g("ready")}))]).then((function(e){"loading"===e&&g("loading")})),function(){clearTimeout(v.current)}}),[]);var b=(0,l.useCallback)(function(){var e=(0,f.Z)(p().mark((function e(t){var n,r;return p().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,gu.loadLibrary();case 2:n=e.sent,r=n.filter((function(e,n){return n!==t})),gu.saveLibrary(r),d(r);case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),[]),y=(0,l.useCallback)(function(){var e=(0,f.Z)(p().mark((function e(t){var n,r;return p().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,gu.loadLibrary();case 2:n=e.sent,r=[].concat(R(n),[t]),o(),gu.saveLibrary(r),d(r);case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),[o]);return"preloading"===m?null:c().createElement(Qd,{padding:1,ref:i,className:"layer-ui__library"},"loading"===m?c().createElement("div",{className:"layer-ui__library-message"},_("labels.libraryLoadingMessage")):c().createElement(_p,{library:u,onRemoveFromLibrary:b,onAddToLibrary:y,onInsertShape:n,pendingElements:r,setAppState:a,setLibraryItems:d}))},jp=function(e){var t,n=e.actionManager,r=e.appState,o=e.setAppState,a=e.canvas,i=e.elements,u=e.onCollabButtonClick,d=e.onLockToggle,h=e.onInsertElements,m=e.zenModeEnabled,g=e.showExitZenModeBtn,v=e.toggleZenMode,b=e.isCollaborating,y=e.onExportToBackend,w=e.renderCustomFooter,x=e.renderTopRight,E=e.viewModeEnabled,k=e.onHomeButtonClick,S=Tc(),C=function(){var e=function(e){return function(){var t=(0,f.Z)(p().mark((function t(n,i){return p().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!a){t.next=3;break}return t.next=3,ku(e,n,r,a,{exportBackground:r.exportBackground,name:r.name,viewBackgroundColor:r.viewBackgroundColor,scale:i,shouldAddWatermark:r.shouldAddWatermark}).catch(Un).catch((function(e){console.error(e),o({errorMessage:e.message})}));case 3:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}()};return c().createElement(sp,{elements:i,appState:r,actionManager:n,onExportToPng:e("png"),onExportToSvg:e("svg"),onExportToClipboard:e("clipboard"),onExportToBackend:y?function(e){y&&y(e,r,a)}:void 0})},O=(0,l.useCallback)((function(e){o({isLibraryOpen:!1})}),[o]),M=(0,l.useCallback)((function(){o({selectedElementIds:{},selectedGroupIds:{}})}),[o]),I=r.isLibraryOpen?c().createElement(Dp,{pendingElements:ki(i,r),onClickOutside:O,onInsertShape:h,onAddToLibrary:M,setAppState:o}):null,T=c().createElement(c().Fragment,null,r.isLoading&&c().createElement(D,null),r.errorMessage&&c().createElement(np,{message:r.errorMessage,onClose:function(){return o({errorMessage:null})}}),r.showHelpDialog&&c().createElement(Ap,{onClose:function(){return o({showHelpDialog:!1})}}),r.pasteDialog.shown&&c().createElement(kp,{setAppState:o,appState:r,onInsertChart:h,onClose:function(){return o({pasteDialog:{shown:!1,data:null}})}}));return S?c().createElement(c().Fragment,null,T,c().createElement(xp,{appState:r,elements:i,actionManager:n,libraryMenu:I,exportButton:C(),setAppState:o,onCollabButtonClick:u,onLockToggle:d,canvas:a,isCollaborating:b,renderCustomFooter:w,viewModeEnabled:E,onHomeButtonClick:k})):c().createElement("div",{className:Ue("layer-ui__wrapper",{"disable-pointerEvents":r.draggingElement||r.resizingElement||r.editingElement&&!Ye(r.editingElement)})},T,(t=si(r,i),c().createElement(up,{side:"top"},c().createElement("div",{className:"App-menu App-menu_top"},c().createElement(Gd,{gap:4,className:Ue({"disable-pointerEvents":m})},E?c().createElement(bp,{heading:"canvasActions",className:Ue("zen-mode-transition",{"transition-left":m})},c().createElement(Qd,{padding:2,style:{zIndex:1}},c().createElement(Gd,{gap:4},c().createElement(Wd,{gap:1,justifyContent:"space-between"},C())))):c().createElement(bp,{heading:"canvasActions",className:Ue("zen-mode-transition",{"transition-left":m})},c().createElement(Qd,{padding:2,style:{zIndex:1}},c().createElement(Gd,{gap:4},c().createElement(Wd,{gap:3,justifyContent:"space-between"},n.renderAction("loadScene"),C(),u&&c().createElement(Xd,{isCollaborating:b,collaboratorCount:r.collaborators.size,onClick:u}),n.renderAction("clearCanvas")),c().createElement(Zd,{actionManager:n,appState:r,setAppState:o})))),t&&c().createElement(bp,{heading:"selectedShapeActions",className:Ue("zen-mode-transition",{"transition-left":m})},c().createElement(Qd,{className:s.$C.SHAPE_ACTIONS_MENU,padding:2,style:{maxHeight:"".concat(r.height-200,"px")}},c().createElement(Vd,{appState:r,elements:i,renderAction:n.renderAction,elementType:r.elementType})))),!E&&c().createElement(bp,{heading:"shapes"},(function(e){return c().createElement(Gd,{gap:4,align:"start"},c().createElement(Wd,{gap:1},c().createElement(Qd,{padding:1,className:Ue({"zen-mode":m})},c().createElement(dp,{appState:r,elements:i}),e,c().createElement(Wd,{gap:1},c().createElement(Ud,{elementType:r.elementType,setAppState:o,isLibraryOpen:r.isLibraryOpen}))),c().createElement(vp,{zenModeEnabled:m,checked:r.elementLocked,onChange:d,title:_("toolBar.lock")})),I)})),c().createElement("div",{style:{display:"flex",alignItems:"center",justifyContent:"flex-end",paddingRight:"var(--space-factor)"}},null==x?void 0:x(S)),c().createElement(yp,{className:Ue("zen-mode-transition",{"transition-right":m}),layout:"vertical",collaborators:r.collaborators},r.collaborators.size>0&&Array.from(r.collaborators).filter((function(e){var t=N(e,2),n=(t[0],t[1]);return 0!==Object.keys(n).length})).map((function(e){var t=N(e,2),r=t[0],o=t[1];return c().createElement(Fc,{label:o.username||"Unknown user",key:r},n.renderAction("goToCollaborator",r))})))))),c().createElement("div",{className:Ue("App-menu App-menu_bottom zen-mode-transition",{"App-menu_bottom--transition-left":m})},c().createElement(Gd,{gap:2},c().createElement(bp,{heading:"canvasActions"},c().createElement(Qd,{padding:1},c().createElement(Yd,{renderAction:n.renderAction,zoom:r.zoom}))))),c().createElement("footer",{role:"contentinfo",className:"layer-ui__wrapper__footer"},c().createElement("div",{className:Ue("zen-mode-transition",{"transition-right disable-pointerEvents":m})},null==w?void 0:w(!1),n.renderAction("toggleShortcuts")),c().createElement("button",{className:Ue("disable-zen-mode",{"disable-zen-mode--visible":g}),onClick:v},_("buttons.exitZenMode"))),r.scrolledOutside&&c().createElement("button",{className:"scroll-back-to-content",onClick:function(){o(function(e){for(var t=1;t1&&c().createElement(c().Fragment,null,c().createElement("tr",null,c().createElement("th",{colSpan:2},_("stats.selected"))),c().createElement("tr",null,c().createElement("td",null,_("stats.elements")),c().createElement("td",null,i.length))),i.length>0&&c().createElement(c().Fragment,null,c().createElement("tr",null,c().createElement("td",null,"x"),c().createElement("td",null,Math.round(1===i.length?i[0].x:u[0]))),c().createElement("tr",null,c().createElement("td",null,"y"),c().createElement("td",null,Math.round(1===i.length?i[0].y:u[1]))),c().createElement("tr",null,c().createElement("td",null,_("stats.width")),c().createElement("td",null,Math.round(1===i.length?i[0].width:u[2]-u[0]))),c().createElement("tr",null,c().createElement("td",null,_("stats.height")),c().createElement("td",null,Math.round(1===i.length?i[0].height:u[3]-u[1])))),1===i.length&&c().createElement("tr",null,c().createElement("td",null,_("stats.angle")),c().createElement("td",null,"".concat(Math.round(180*i[0].angle/Math.PI),"°"))),c().createElement("tr",null,c().createElement("th",{colSpan:2},_("stats.version"))),c().createElement("tr",null,c().createElement("td",{colSpan:2,style:{textAlign:"center",cursor:"pointer"},onClick:(0,f.Z)(p().mark((function t(){return p().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,hu(Xn());case 3:e.setAppState({toastMessage:_("toast.copyToClipboard")}),t.next=8;break;case 6:t.prev=6,t.t0=t.catch(0);case 8:case"end":return t.stop()}}),t,null,[[0,6]])}))),title:_("stats.versionCopy")},h,c().createElement("br",null),d))))))},Kp=(n(5849),function(e){var t=e.message,n=e.clearToast,r=(0,l.useRef)(0),o=(0,l.useCallback)((function(){return r.current=window.setTimeout((function(){return n()}),s.Lg)}),[n]);return(0,l.useEffect)((function(){return o(),function(){return clearTimeout(r.current)}}),[o,t]),c().createElement("div",{className:"Toast",onMouseEnter:function(){return clearTimeout(null==r?void 0:r.current)},onMouseLeave:o},c().createElement("p",{className:"Toast__message"},t))});function Up(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Yp(e){for(var t=1;t=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,i=!0,l=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return i=e.done,e},e:function(e){l=!0,a=e},f:function(){try{i||null==n.return||n.return()}finally{if(l)throw a}}}}function qp(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0);(this.state.scrolledOutside!==w&&this.setState({scrolledOutside:w}),ef.record(this.state,this.scene.getElementsIncludingDeleted()),this.state.isLoading)||(null===(b=(y=this.props).onChange)||void 0===b||b.call(y,this.scene.getElementsIncludingDeleted(),this.state))}},{key:"addTextFromPaste",value:function(e){var t,n=Rn({clientX:rf,clientY:of},this.state),r=n.x,o=n.y,a=qr({x:r,y:o,strokeColor:this.state.currentItemStrokeColor,backgroundColor:this.state.currentItemBackgroundColor,fillStyle:this.state.currentItemFillStyle,strokeWidth:this.state.currentItemStrokeWidth,strokeStyle:this.state.currentItemStrokeStyle,roughness:this.state.currentItemRoughness,opacity:this.state.currentItemOpacity,strokeSharpness:this.state.currentItemStrokeSharpness,text:e,fontSize:this.state.currentItemFontSize,fontFamily:this.state.currentItemFontFamily,textAlign:this.state.currentItemTextAlign,verticalAlign:s.hs});this.scene.replaceAllElements([].concat(R(this.scene.getElementsIncludingDeleted()),[a])),this.setState({selectedElementIds:(t={},t[a.id]=!0,t)}),ef.resumeRecording()}},{key:"selectShapeTool",value:function(e){var t;af||Bn(e),(t=document.activeElement)instanceof HTMLElement&&t.className.includes("ToolIcon")&&document.activeElement.blur(),Xe(e)||this.setState({suggestedBindings:[]}),"selection"!==e?this.setState({elementType:e,selectedElementIds:{},selectedGroupIds:{},editingGroupId:null}):this.setState({elementType:e})}},{key:"handleTextWysiwyg",value:function(e,t){var n=this,r=t.isExistingElement,o=void 0!==r&&r,a=function(t){var r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];n.scene.replaceAllElements(R(n.scene.getElementsIncludingDeleted().map((function(n){return n.id===e.id&&Ye(n)?$r(n,{text:t,isDeleted:r}):n}))))};!function(e){var t=e.id,n=e.appState,r=e.onChange,o=e.onSubmit,a=e.getViewportCoords,i=e.element,l=e.canvas,c=function(){var e,r=null===(e=xr.getScene(i))||void 0===e?void 0:e.getElement(t);if(r&&Ye(r)){var o=N(a(r.x,r.y),2),l=o[0],c=o[1],s=r.textAlign,d=r.angle;u.value=r.text;var p=r.text.replace(/\r\n?/g,"\n").split("\n"),f=r.height/p.length;Object.assign(u.style,{font:Pn(r),lineHeight:"".concat(f,"px"),width:"".concat(r.width,"px"),height:"".concat(r.height,"px"),left:"".concat(l,"px"),top:"".concat(c,"px"),transform:li(r.width,r.height,d,n),textAlign:s,color:r.strokeColor,opacity:r.opacity/100,filter:"var(--appearance-filter)"})}},u=document.createElement("textarea");u.dir="auto",u.tabIndex=0,u.dataset.type="wysiwyg",u.wrap="off",Object.assign(u.style,{position:"fixed",display:"inline-block",minHeight:"1em",backfaceVisibility:"hidden",margin:0,padding:0,border:0,outline:0,resize:"none",background:"transparent",overflow:"hidden",whiteSpace:"pre",zIndex:"var(--zIndex-wysiwyg)"}),c(),r&&(u.oninput=function(){r(ii(u.value))}),u.onkeydown=function(e){if(e.key===tn)e.preventDefault(),p();else if(e.key===en&&e[Qt]){if(e.preventDefault(),e.isComposing||229===e.keyCode)return;p()}else e.key!==en||e.altKey||e.stopPropagation()};var d=function(e){e.preventDefault(),e.stopPropagation()},p=function(){o(ii(u.value)),f()},f=function(){v||(v=!0,u.onblur=null,u.oninput=null,u.onkeydown=null,b&&b.disconnect(),window.removeEventListener("resize",c),window.removeEventListener("wheel",d,!0),window.removeEventListener("pointerdown",m),window.removeEventListener("pointerup",h),window.removeEventListener("blur",p),g(),u.remove())},h=function e(){window.removeEventListener("pointerup",e),setTimeout((function(){u.onblur=p,u.focus()}))},m=function(e){e.target instanceof HTMLElement&&e.target.closest(".".concat(s.$C.SHAPE_ACTIONS_MENU))&&!In(e.target)&&(u.onblur=null,window.addEventListener("pointerup",h),window.addEventListener("blur",p))},g=xr.getScene(i).addCallback((function(){c(),u.focus()})),v=!1;u.onblur=p;var b=null;l&&"ResizeObserver"in window?(b=new window.ResizeObserver((function(){c()}))).observe(l):window.addEventListener("resize",c),window.addEventListener("pointerdown",m),window.addEventListener("wheel",d,{passive:!1,capture:!0}),document.querySelector(".excalidraw-textEditorContainer").appendChild(u),u.focus(),u.select()}({id:e.id,appState:this.state,canvas:this.canvas,getViewportCoords:function(e,t){var r=Fn({sceneX:e,sceneY:t},n.state);return[r.x,r.y]},onChange:Yn((function(t){a(t),gi(e)&&Da(e)})),onSubmit:Yn((function(t){var r=!t.trim();a(t,r),r?Ua(n.scene.getElements(),[e]):n.setState((function(t){var n;return{selectedElementIds:Qp(Qp({},t.selectedElementIds),{},(n={},n[e.id]=!0,n))}})),r&&!o||ef.resumeRecording(),n.setState({draggingElement:null,editingElement:null}),n.state.elementLocked&&Bn(n.state.elementType)})),element:e}),this.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null}),a(e.text)}},{key:"getTextElementAtPosition",value:function(e,t){var n=this.getElementAtPosition(e,t);return n&&Ye(n)&&!n.isDeleted?n:null}},{key:"getElementAtPosition",value:function(e,t){var n=this.getElementsAtPosition(e,t);if(n.length>1){var r=n[n.length-1];return jo(r,this.state,e,t)?n[n.length-2]:r}return 1===n.length?n[0]:null}},{key:"getElementsAtPosition",value:function(e,t){var n,r,o=this;return n=this.scene.getElements(),r=function(n){return function(e,t,n,r){var o=10/t.zoom.value,a=[n,r];return Bo(t,e)?Ho(e,a,o):zo(e,t,a)}(n,o.state,e,t)},n.filter((function(e){return!e.isDeleted&&r(e)}))}},{key:"maybeCleanupAfterMissingPointerUp",value:function(e){null!==pf&&pf(e)}},{key:"updateGestureOnPointerDown",value:function(e){ff.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),2===ff.pointers.size&&(ff.lastCenter=Od(ff.pointers),ff.initialScale=this.state.zoom.value,ff.initialDistance=Md(Array.from(ff.pointers.values())))}},{key:"initialPointerDownState",value:function(e){var t=Rn(e,this.state),n=ki(this.scene.getElements(),this.state),r=N(vt(n),4),o=r[0],a=r[1],i=r[2],l=r[3];return{origin:t,originInGrid:Kn(ct(t.x,t.y,this.state.gridSize)),scrollbars:xi(sf,e.clientX-this.state.offsetLeft,e.clientY-this.state.offsetTop),lastCoords:Qp({},t),originalElements:this.scene.getElements().reduce((function(e,t){return e.set(t.id,Jr(t)),e}),new Map),resize:{handleType:!1,isResizing:!1,offset:{x:0,y:0},arrowDirection:"origin",center:{x:(i+o)/2,y:(l+a)/2}},hit:{element:null,allHitElements:[],wasAddedToSelection:!1,hasBeenDuplicated:!1,hasHitCommonBoundingBoxOfSelectedElements:this.isHittingCommonBoundingBoxOfSelectedElements(t,n)},drag:{hasOccurred:!1,offset:null},eventListeners:{onMove:null,onUp:null,onKeyUp:null,onKeyDown:null}}}},{key:"handleDraggingScrollBar",value:function(e,t){var n=this;if(!t.scrollbars.isOverEither||this.state.multiElement)return!1;cf=!0,t.lastCoords.x=e.clientX,t.lastCoords.y=e.clientY;var r=Yn((function(e){e.target instanceof HTMLElement&&n.handlePointerMoveOverScrollbars(e,t)})),o=Yn((function(){cf=!1,Bn(n.state.elementType),pf=null,n.setState({cursorButton:"up"}),n.savePointer(e.clientX,e.clientY,"up"),window.removeEventListener(s.Ks.POINTER_MOVE,r),window.removeEventListener(s.Ks.POINTER_UP,o)}));return pf=o,window.addEventListener(s.Ks.POINTER_MOVE,r),window.addEventListener(s.Ks.POINTER_UP,o),!0}},{key:"isASelectedElement",value:function(e){return null!=e&&this.state.selectedElementIds[e.id]}},{key:"isHittingCommonBoundingBoxOfSelectedElements",value:function(e,t){if(t.length<2)return!1;var n=10/this.state.zoom.value,r=N(vt(t),4),o=r[0],a=r[1],i=r[2],l=r[3];return e.x>o-n&&e.xa-n&&e.y0){var c=N(ct(r.x-e.drag.offset.x,r.y-e.drag.offset.y,t.state.gridSize),2),u=c[0],d=c[1],p=[Math.abs(r.x-e.origin.x),Math.abs(r.y-e.origin.y)],f=p[0],h=p[1],m=n.shiftKey;if(function(e,t,n,r,o){var a=arguments.length>5&&void 0!==arguments[5]&&arguments[5],i=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,l=arguments.length>7&&void 0!==arguments[7]?arguments[7]:0,c=N(vt(t),2),s=c[0],u=c[1],d={x:n-s,y:r-u};t.forEach((function(n){var r,o;if(a){var c=a&&il,u=e.originalElements.get(n.id);r=c&&u?u.x:n.x+d.x,o=s&&u?u.y:n.y+d.y}else r=n.x+d.x,o=n.y+d.y;Mr(n,{x:r,y:o}),Da(n,{simultaneouslyUpdated:t})}))}(e,l,u,d,t.scene,m,f,h),t.maybeSuggestBindingForAll(l),n.altKey&&!e.hit.hasBeenDuplicated){e.hit.hasBeenDuplicated=!0;var g,v=[],b=[],y=new Map,w=new Map,x=e.hit.element,E=Xp(t.scene.getElementsIncludingDeleted());try{for(E.s();!(g=E.n()).done;){var k=g.value;if(t.state.selectedElementIds[k.id]||k.id===(null==x?void 0:x.id)&&e.hit.wasAddedToSelection){var S=eo(t.state.editingGroupId,y,k),C=N(ct(e.origin.x-e.drag.offset.x,e.origin.y-e.drag.offset.y,t.state.gridSize),2),O=C[0],M=C[1];Mr(S,{x:S.x+(O-u),y:S.y+(M-d)}),v.push(S),b.push(k),w.set(k.id,S.id)}else v.push(k)}}catch(e){E.e(e)}finally{E.f()}var I=[].concat(v,b);Va(I,b,w,"duplicatesServeAsOld"),t.scene.replaceAllElements(I)}return}}var T=t.state.draggingElement;if(T){if(Ze(T)){e.drag.hasOccurred=!0;var P,A,L=T.points;if("draw"===T.type?(P=r.x-T.x,A=r.y-T.y):(P=a-T.x,A=i-T.y),kn(n)&&2===L.length){var _=Pr(t.state.elementType,P,A);P=_.width,A=_.height}1===L.length?Mr(T,{points:[].concat(R(L),[[P,A]])}):L.length>1&&("draw"===T.type?Mr(T,{points:U([].concat(R(L),[[P,A]]),.7/t.state.zoom.value)}):Mr(T,{points:[].concat(R(L.slice(0,-1)),[[P,A]])})),qe(T)&&t.maybeSuggestBindingForLinearElementAtCursor(T,"end",r,t.state.startBoundElement)}else e.lastCoords.x=r.x,e.lastCoords.y=r.y,t.maybeDragNewGenericElement(e,n);if("selection"===t.state.elementType){var D=t.scene.getElements();!n.shiftKey&&Ei(D,t.state)&&t.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null});var j=function(e,t){var n=N(pt(t),4),r=n[0],o=n[1],a=n[2],i=n[3];return e.filter((function(e){var t=N(gt(e),4),n=t[0],l=t[1],c=t[2],s=t[3];return"selection"!==e.type&&r<=n&&o<=l&&a>=c&&i>=s}))}(D,T);t.setState((function(e){return Fr(Qp(Qp({},e),{},{selectedElementIds:Qp(Qp({},e.selectedElementIds),j.reduce((function(e,t){return e[t.id]=!0,e}),{}))}),t.scene.getElements())}))}}}}}))}},{key:"handlePointerMoveOverScrollbars",value:function(e,t){if(t.scrollbars.isOverHorizontal){var n=e.clientX,r=n-t.lastCoords.x;return this.setState({scrollX:this.state.scrollX-r/this.state.zoom.value}),t.lastCoords.x=n,!0}if(t.scrollbars.isOverVertical){var o=e.clientY,a=o-t.lastCoords.y;return this.setState({scrollY:this.state.scrollY-a/this.state.zoom.value}),t.lastCoords.y=o,!0}return!1}},{key:"onPointerUpFromPointerDownHandler",value:function(e){var t=this;return Yn((function(n){var r=t.state,o=r.draggingElement,a=r.resizingElement,i=r.multiElement,l=r.elementType,c=r.elementLocked,u=r.isResizing,d=r.isRotating;if(t.setState({isResizing:!1,isRotating:!1,resizingElement:null,selectionElement:null,cursorButton:"up",editingElement:i||Ye(t.state.editingElement)?t.state.editingElement:null}),t.savePointer(n.clientX,n.clientY,"up"),t.state.editingLinearElement){var p=ya.handlePointerUp(n,t.state.editingLinearElement,t.state);p!==t.state.editingLinearElement&&t.setState({editingLinearElement:p,suggestedBindings:[]})}if(pf=null,window.removeEventListener(s.Ks.POINTER_MOVE,e.eventListeners.onMove),window.removeEventListener(s.Ks.POINTER_UP,e.eventListeners.onUp),window.removeEventListener(s.Ks.KEYDOWN,e.eventListeners.onKeyDown),window.removeEventListener(s.Ks.KEYUP,e.eventListeners.onKeyUp),"draw"!==(null==o?void 0:o.type))if(Ze(o)){o.points.length>1&&ef.resumeRecording();var f=Rn(n,t.state);e.drag.hasOccurred||!o||i?e.drag.hasOccurred&&!i&&(xa(t.state)&&qe(o)&&Oa(o,t.state,t.scene,f),t.setState({suggestedBindings:[],startBoundElement:null}),c||"draw"===l?t.setState((function(e){var n;return{draggingElement:null,selectedElementIds:Qp(Qp({},e.selectedElementIds),{},(n={},n[t.state.draggingElement.id]=!0,n))}})):(zn(),t.setState((function(e){var n;return{draggingElement:null,elementType:"selection",selectedElementIds:Qp(Qp({},e.selectedElementIds),{},(n={},n[t.state.draggingElement.id]=!0,n))}})))):(Mr(o,{points:[].concat(R(o.points),[[f.x-o.x,f.y-o.y]])}),t.setState({multiElement:o,editingElement:t.state.draggingElement}))}else{if("selection"!==l&&o&&Tr(o))return t.scene.replaceAllElements(t.scene.getElementsIncludingDeleted().slice(0,-1)),void t.setState({draggingElement:null});o&&Mr(o,Ar(o)),a&&ef.resumeRecording(),a&&Tr(a)&&t.scene.replaceAllElements(t.scene.getElementsIncludingDeleted().filter((function(e){return e.id!==a.id})));var h=e.hit.element;if(h&&!e.drag.hasOccurred&&!e.hit.wasAddedToSelection)if(n.shiftKey)if(t.state.selectedElementIds[h.id])if(Hr(t.state,h)){var m=h.groupIds.flatMap((function(e){return Gr(t.scene.getElements(),e)})).map((function(e){var t;return(t={})[e.id]=!1,t})).reduce((function(e,t){return Qp(Qp({},e),t)}),{});t.setState((function(e){return{selectedGroupIds:Qp(Qp({},e.selectedElementIds),h.groupIds.map((function(e){var t;return(t={})[e]=!1,t})).reduce((function(e,t){return Qp(Qp({},e),t)}),{})),selectedElementIds:Qp(Qp({},e.selectedElementIds),m)}}))}else t.setState((function(e){var t;return{selectedElementIds:Qp(Qp({},e.selectedElementIds),{},(t={},t[h.id]=!1,t))}}));else t.setState((function(e){var t;return{selectedElementIds:Qp(Qp({},e.selectedElementIds),{},(t={},t[h.id]=!0,t))}}));else t.setState((function(e){var n;return Qp({},Fr(Qp(Qp({},e),{},{selectedElementIds:(n={},n[h.id]=!0,n)}),t.scene.getElements()))}));t.state.editingLinearElement||e.drag.hasOccurred||t.state.isResizing||!(h&&jo(h,t.state,e.origin.x,e.origin.y)||!h&&e.hit.hasHitCommonBoundingBoxOfSelectedElements)?(!c&&"draw"!==l&&o&&t.setState((function(e){var t;return{selectedElementIds:Qp(Qp({},e.selectedElementIds),{},(t={},t[o.id]=!0,t))}})),("selection"!==l||Ei(t.scene.getElements(),t.state))&&ef.resumeRecording(),(e.drag.hasOccurred||u||d)&&(xa(t.state)?Sa:Pa)(ki(t.scene.getElements(),t.state)),c||"draw"===l?t.setState({draggingElement:null,suggestedBindings:[]}):(zn(),t.setState({draggingElement:null,suggestedBindings:[],elementType:"selection"}))):t.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null})}else t.actionManager.executeAction(Bc)}))}},{key:"maybeSuggestBindingForAll",value:function(e){var t,n,r=(t=e,n=new Set(t.map((function(e){return e.id}))),t.flatMap((function(e){return qe(e)?Na(e).filter((function(e){return!n.has(e.id)})):Qe(e)?Wa(e).filter((function(e){return!n.has(e[0].id)})):[]})));this.setState({suggestedBindings:r})}},{key:"clearSelection",value:function(e){this.setState((function(t){return{selectedElementIds:{},selectedGroupIds:{},editingGroupId:t.editingGroupId&&null!=e&&Wr(e,t.editingGroupId)?t.editingGroupId:null}})),this.setState({selectedElementIds:{},previousSelectedElementIds:this.state.selectedElementIds})}},{key:"getTextWysiwygSnappedToCenterPosition",value:function(e,t,n,r,o){var a=function(e,t,n){for(var r=null,o=e.length-1;o>=0;--o)if(!e[o].isDeleted){var a=N(pt(e[o]),4),i=a[0],l=a[1],c=a[2],s=a[3];if(i0&&e.setState({previousSelectedElementIds:{},selectedElementIds:e.state.previousSelectedElementIds})},this.pasteFromClipboard=Yn(function(){var t=(0,f.Z)(p().mark((function t(n){var r,o,a;return p().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(r=document.activeElement,o=document.elementFromPoint(rf,of),!n||o instanceof HTMLCanvasElement&&!In(r)){t.next=4;break}return t.abrupt("return");case 4:return t.next=6,pu(n);case 6:(a=t.sent).errorMessage?e.setState({errorMessage:a.errorMessage}):a.spreadsheet?e.setState({pasteDialog:{data:a.spreadsheet,shown:!0}}):a.elements?e.addElementsFromPasteOrLibrary(a.elements):a.text&&e.addTextFromPaste(a.text),e.selectShapeTool("selection"),null==n||n.preventDefault();case 10:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()),this.addElementsFromPasteOrLibrary=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:rf,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:of,o=vt(t),a=N(o,4),i=a[0],l=a[1],c=a[2],s=a[3],u=jn(i,c)/2,d=jn(l,s)/2,p=Rn({clientX:n,clientY:r},e.state),f=p.x,h=p.y,m=f-u,g=h-d,v=new Map,b=ct(m,g,e.state.gridSize),y=N(b,2),w=y[0],x=y[1],E=new Map,k=t.map((function(t){var n=eo(e.state.editingGroupId,v,t,{x:t.x+w-i,y:t.y+x-l});return E.set(t.id,n.id),n})),S=[].concat(R(e.scene.getElementsIncludingDeleted()),R(k));Va(S,t,E),e.scene.replaceAllElements(S),ef.resumeRecording(),e.setState(Fr(Qp(Qp({},e.state),{},{isLibraryOpen:!1,selectedElementIds:k.reduce((function(e,t){return e[t.id]=!0,e}),{}),selectedGroupIds:{}}),e.scene.getElements()))},this.setAppState=function(t){e.setState(t)},this.removePointer=function(e){"touch"===e.pointerType&&uf&&(clearTimeout(uf),uf=0,df=!1),ff.pointers.delete(e.pointerId)},this.toggleLock=function(){e.setState((function(e){return{elementLocked:!e.elementLocked,elementType:e.elementLocked?"selection":e.elementType}}))},this.toggleZenMode=function(){e.actionManager.executeAction(bd)},this.toggleStats=function(){e.state.showStats||Hc("dialog","stats"),e.actionManager.executeAction(xd)},this.setScrollToCenter=function(t){e.setState(Qp({},Oi(mi(t),e.state,e.canvas)))},this.clearToast=function(){e.setState({toastMessage:null})},this.updateScene=Yn((function(t){t.commitToHistory&&ef.resumeRecording(),t.appState&&e.setState(t.appState),t.elements&&e.scene.replaceAllElements(t.elements),t.collaborators&&e.setState({collaborators:t.collaborators})})),this.onSceneUpdated=function(){e.setState({})},this.updateCurrentCursorPosition=Yn((function(e){rf=e.x,of=e.y})),this.onKeyDown=Yn((function(t){var n;if(("Proxy"in window&&(!t.shiftKey&&/^[A-Z]$/.test(t.key)||t.shiftKey&&/^[a-z]$/.test(t.key))&&(t=new Proxy(t,{get:function(e,n){var r=e[n];return"function"==typeof r?r.bind(e):"key"===n?t.shiftKey?e.key.toUpperCase():e.key.toLowerCase():r}})),!(In(t.target)&&t.key!==tn||wn(t.key)&&(n=t.target,n instanceof HTMLElement&&"wysiwyg"===n.dataset.type||n instanceof HTMLBRElement||n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement)))&&(t.key===nn&&e.setState({showHelpDialog:!0}),!e.actionManager.handleKeyDown(t)&&!e.state.viewModeEnabled)){if(t[Qt]&&e.setState({isBindingEnabled:!1}),t.code===jt&&e.setState({isLibraryOpen:!e.state.isLibraryOpen}),wn(t.key)){var r=e.state.gridSize&&(t.shiftKey?s.$e:e.state.gridSize)||(t.shiftKey?s.Iw:s.$e),o=e.scene.getElements().filter((function(t){return e.state.selectedElementIds[t.id]})),a=0,i=0;t.key===Yt?a=-r:t.key===Zt?a=r:t.key===Xt?i=-r:t.key===Ut&&(i=r),o.forEach((function(e){Mr(e,{x:e.x+a,y:e.y+i}),Da(e,{simultaneouslyUpdated:o})})),e.maybeSuggestBindingForAll(o),t.preventDefault()}else if(t.key===en){var l=ki(e.scene.getElements(),e.state);if(1===l.length&&Ze(l[0]))e.state.editingLinearElement&&e.state.editingLinearElement.elementId===l[0].id||(ef.resumeRecording(),e.setState({editingLinearElement:new ya(l[0],e.scene)}));else if(1===l.length&&!Ze(l[0])){var c=l[0];return e.startTextEditing({sceneX:c.x+c.width/2,sceneY:c.y+c.height/2}),void t.preventDefault()}}else if(!t.ctrlKey&&!t.altKey&&!t.metaKey&&null===e.state.draggingElement){var u=function(e){var t=Dd.find((function(t,n){return e===(n+1).toString()||("string"==typeof t.key?t.key===e:t.key.includes(e))}));return(null==t?void 0:t.value)||null}(t.key);u?e.selectShapeTool(u):t.key===pn&&e.toggleLock()}t.key===rn&&0===ff.pointers.size&&(af=!0,document.documentElement.style.cursor=s.oc.GRABBING)}})),this.onKeyUp=Yn((function(t){if(t.key===rn&&("selection"===e.state.elementType?zn():(Bn(e.state.elementType),e.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null})),af=!1),t[Qt]||e.state.isBindingEnabled||e.setState({isBindingEnabled:!0}),wn(t.key)){var n=ki(e.scene.getElements(),e.state);xa(e.state)?Sa(n):Pa(n),e.setState({suggestedBindings:[]})}})),this.onGestureStart=Yn((function(t){t.preventDefault(),e.setState({selectedElementIds:{}}),ff.initialScale=e.state.zoom.value})),this.onGestureChange=Yn((function(t){if(t.preventDefault(),2!==ff.pointers.size){var n=ff.initialScale;n&&e.setState((function(e){var r=e.zoom,o=e.offsetLeft,a=e.offsetTop;return{zoom:_i(Di(n*t.scale),r,{left:o,top:a},{x:rf,y:of})}}))}})),this.onGestureEnd=Yn((function(t){t.preventDefault(),e.setState({previousSelectedElementIds:{},selectedElementIds:e.state.previousSelectedElementIds}),ff.initialScale=null})),this.startTextEditing=function(t){var n=t.sceneX,r=t.sceneY,o=t.insertAtParentCenter,a=void 0===o||o,i=e.getTextElementAtPosition(n,r),l=a&&e.getTextWysiwygSnappedToCenterPosition(n,r,e.state,e.canvas,window.devicePixelRatio),c=i||qr({x:l?l.elementCenterX:n,y:l?l.elementCenterY:r,strokeColor:e.state.currentItemStrokeColor,backgroundColor:e.state.currentItemBackgroundColor,fillStyle:e.state.currentItemFillStyle,strokeWidth:e.state.currentItemStrokeWidth,strokeStyle:e.state.currentItemStrokeStyle,roughness:e.state.currentItemRoughness,opacity:e.state.currentItemOpacity,strokeSharpness:e.state.currentItemStrokeSharpness,text:"",fontSize:e.state.currentItemFontSize,fontFamily:e.state.currentItemFontFamily,textAlign:l?"center":e.state.currentItemTextAlign,verticalAlign:l?"middle":s.hs});e.setState({editingElement:c}),i?l&&"center"===c.textAlign||Mr(c,{verticalAlign:s.hs}):(e.scene.replaceAllElements([].concat(R(e.scene.getElementsIncludingDeleted()),[c])),l||Mr(c,{y:c.y-c.baseline/2})),e.setState({editingElement:c}),e.handleTextWysiwyg(c,{isExistingElement:!!i})},this.handleCanvasDoubleClick=function(t){if(!e.state.multiElement&&"selection"===e.state.elementType){var n=ki(e.scene.getElements(),e.state);if(1===n.length&&Ze(n[0]))e.state.editingLinearElement&&e.state.editingLinearElement.elementId===n[0].id||(ef.resumeRecording(),e.setState({editingLinearElement:new ya(n[0],e.scene)}));else{zn();var r=Rn(t,e.state),o=r.x,a=r.y;if(Rr(e.state).length>0){var i=e.getElementAtPosition(o,a),l=i&&function(e,t){return e.groupIds.find((function(e){return t[e]}))}(i,e.state.selectedGroupIds);if(l)return void e.setState((function(t){var n;return Fr(Qp(Qp({},t),{},{editingGroupId:l,selectedElementIds:(n={},n[i.id]=!0,n),selectedGroupIds:{}}),e.scene.getElements())}))}zn(),t[Qt]||e.startTextEditing({sceneX:o,sceneY:a,insertAtParentCenter:!t.altKey})}}},this.handleCanvasPointerMove=function(t){e.savePointer(t.clientX,t.clientY,e.state.cursorButton),ff.pointers.has(t.pointerId)&&ff.pointers.set(t.pointerId,{x:t.clientX,y:t.clientY});var n=ff.initialScale;if(2===ff.pointers.size&&ff.lastCenter&&n&&ff.initialDistance){var r=Od(ff.pointers),o=r.x-ff.lastCenter.x,a=r.y-ff.lastCenter.y;ff.lastCenter=r;var i=Md(Array.from(ff.pointers.values()))/ff.initialDistance;e.setState((function(e){var t=e.zoom,l=e.scrollX,c=e.scrollY,s=e.offsetLeft,u=e.offsetTop;return{scrollX:l+o/t.value,scrollY:c+a/t.value,zoom:_i(Di(n*i),t,{left:s,top:u},r),shouldCacheIgnoreZoom:!0}})),e.resetShouldCacheIgnoreZoomDebounced()}else ff.lastCenter=ff.initialDistance=ff.initialScale=null;if(!(af||lf||cf)){var l=xi(sf,t.clientX-e.state.offsetLeft,t.clientY-e.state.offsetTop).isOverEither;e.state.draggingElement||e.state.multiElement||(l?zn():Bn(e.state.elementType));var c=Rn(t,e.state),u=c.x,d=c.y;if(e.state.editingLinearElement&&!e.state.editingLinearElement.isDragging){var p=ya.handlePointerMove(t,u,d,e.state.editingLinearElement,e.state.gridSize);p!==e.state.editingLinearElement&&e.setState({editingLinearElement:p}),null!=p.lastUncommittedPoint?e.maybeSuggestBindingAtCursor(c):e.setState({suggestedBindings:[]})}if($e(e.state.elementType)){var f=e.state.draggingElement;qe(f)?e.maybeSuggestBindingForLinearElementAtCursor(f,"end",c,e.state.startBoundElement):e.maybeSuggestBindingAtCursor(c)}if(e.state.multiElement){var h=e.state.multiElement,m=h.x,g=h.y,v=h.points,b=h.lastCommittedPoint,y=v[v.length-1];return Bn(e.state.elementType),void(y===b?nt(u-m,d-g,y[0],y[1])>=s.qx?Mr(h,{points:[].concat(R(v),[[u-m,d-g]])}):document.documentElement.style.cursor=s.oc.POINTER:v.length>2&&b&&nt(u-m,d-g,b[0],b[1])1&&!l){var E=ha(vt(x),u,d,e.state.zoom,t.pointerType);if(E)return void(document.documentElement.style.cursor=ga({transformHandleType:E}))}}else{var k=fa(w,e.state,u,d,e.state.zoom,t.pointerType);if(k&&k.transformHandleType)return void(document.documentElement.style.cursor=ga(k))}var S=e.getElementAtPosition(c.x,c.y);"text"===e.state.elementType?document.documentElement.style.cursor=Ye(S)?s.oc.TEXT:s.oc.CROSSHAIR:l?document.documentElement.style.cursor=s.oc.AUTO:S||e.isHittingCommonBoundingBoxOfSelectedElements(c,x)?document.documentElement.style.cursor=s.oc.MOVE:document.documentElement.style.cursor=s.oc.AUTO}}},this.handleTouchMove=function(e){df=!0},this.handleCanvasPointerDown=function(t){if(t.persist(),e.maybeOpenContextMenuAfterPointerDownOnTouchDevices(t),e.maybeCleanupAfterMissingPointerUp(t),!lf&&(e.setState({lastPointerDownWith:t.pointerType,cursorButton:"down"}),e.savePointer(t.clientX,t.clientY,"down"),!e.handleCanvasPanUsingWheelOrSpaceDrag(t)&&!(t.button!==s.Oh.MAIN&&t.button!==s.Oh.TOUCH||(e.updateGestureOnPointerDown(t),t.preventDefault(),document.activeElement instanceof HTMLElement&&document.activeElement.blur(),ff.pointers.size>1)))){var n=e.initialPointerDownState(t);if(!e.handleDraggingScrollBar(t,n)&&(e.clearSelectionIfNotUsingSelection(),e.updateBindingEnabledOnPointerMove(t),!e.handleSelectionOnPointerDown(t,n)))if("text"!==e.state.elementType){"arrow"===e.state.elementType||"draw"===e.state.elementType||"line"===e.state.elementType?e.handleLinearElementOnPointerDown(t,e.state.elementType,n):e.createGenericElementOnPointerDown(e.state.elementType,n);var r=e.onPointerMoveFromPointerDownHandler(n),o=e.onPointerUpFromPointerDownHandler(n),a=e.onKeyDownFromPointerDownHandler(n),i=e.onKeyUpFromPointerDownHandler(n);pf=o,e.state.viewModeEnabled||(window.addEventListener(s.Ks.POINTER_MOVE,r),window.addEventListener(s.Ks.POINTER_UP,o),window.addEventListener(s.Ks.KEYDOWN,a),window.addEventListener(s.Ks.KEYUP,i),n.eventListeners.onMove=r,n.eventListeners.onUp=o,n.eventListeners.onKeyUp=i,n.eventListeners.onKeyDown=a)}else e.handleTextOnPointerDown(t,n)}},this.maybeOpenContextMenuAfterPointerDownOnTouchDevices=function(t){"touch"===t.pointerType&&(df=!1,uf?df=!0:uf=window.setTimeout((function(){uf=0,df||e.openContextMenu({clientX:t.clientX,clientY:t.clientY})}),s.nM))},this.handleCanvasPanUsingWheelOrSpaceDrag=function(t){if(0!==ff.pointers.size||!(t.button===s.Oh.WHEEL||t.button===s.Oh.MAIN&&af||e.state.viewModeEnabled))return!1;lf=!0;var n=!1,r=/Linux/.test(window.navigator.platform);document.documentElement.style.cursor=s.oc.GRABBING;var o=t.clientX,a=t.clientY,i=Yn((function(t){var i=o-t.clientX,l=a-t.clientY;if(o=t.clientX,a=t.clientY,r&&!n&&(Math.abs(i)>1||Math.abs(l)>1)){n=!0;var c=function e(t){document.body.removeEventListener(s.Ks.PASTE,e),t.stopPropagation()};document.body.addEventListener(s.Ks.PASTE,c),window.addEventListener(s.Ks.POINTER_UP,(function e(){setTimeout((function(){document.body.removeEventListener(s.Ks.PASTE,c),window.removeEventListener(s.Ks.POINTER_UP,e)}),100)}))}e.setState({scrollX:e.state.scrollX-i/e.state.zoom.value,scrollY:e.state.scrollY-l/e.state.zoom.value})})),l=Yn(pf=function(){pf=null,lf=!1,af||Bn(e.state.elementType),e.setState({cursorButton:"up"}),e.savePointer(t.clientX,t.clientY,"up"),window.removeEventListener(s.Ks.POINTER_MOVE,i),window.removeEventListener(s.Ks.POINTER_UP,l),window.removeEventListener(s.Ks.BLUR,l)});return window.addEventListener(s.Ks.BLUR,l),window.addEventListener(s.Ks.POINTER_MOVE,i,{passive:!0}),window.addEventListener(s.Ks.POINTER_UP,l),!0},this.clearSelectionIfNotUsingSelection=function(){"selection"!==e.state.elementType&&e.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null})},this.handleSelectionOnPointerDown=function(t,n){if("selection"===e.state.elementType){var r=e.scene.getElements(),o=ki(r,e.state);if(1!==o.length||e.state.editingLinearElement)o.length>1&&(n.resize.handleType=ha(vt(o),n.origin.x,n.origin.y,e.state.zoom,t.pointerType));else{var a=fa(r,e.state,n.origin.x,n.origin.y,e.state.zoom,t.pointerType);null!=a&&(e.setState({resizingElement:a.element}),n.resize.handleType=a.transformHandleType)}if(n.resize.handleType)document.documentElement.style.cursor=ga({transformHandleType:n.resize.handleType}),n.resize.isResizing=!0,n.resize.offset=Kn(function(e,t,n,r){var o=N(1===t.length?pt(t[0]):vt(t),4),a=o[0],i=o[1],l=o[2],c=o[3],s=(a+l)/2,u=(i+c)/2,d=1===t.length?t[0].angle:0,p=N(Je(n,r,s,u,-d),2);switch(n=p[0],r=p[1],e){case"n":return Je(n-(a+l)/2,r-i,0,0,d);case"s":return Je(n-(a+l)/2,r-c,0,0,d);case"w":return Je(n-a,r-(i+c)/2,0,0,d);case"e":return Je(n-l,r-(i+c)/2,0,0,d);case"nw":return Je(n-a,r-i,0,0,d);case"ne":return Je(n-l,r-i,0,0,d);case"sw":return Je(n-a,r-c,0,0,d);case"se":return Je(n-l,r-c,0,0,d);default:return[0,0]}}(n.resize.handleType,o,n.origin.x,n.origin.y)),1===o.length&&Ze(o[0])&&2===o[0].points.length&&(n.resize.arrowDirection=(u=n.resize.handleType,d=o[0],p=N(d.points,2),f=N(p[1],2),h=f[0],m=f[1],"nw"===u&&(h<0||m<0)||"ne"===u&&h>=0||"sw"===u&&h<=0||"se"===u&&(h>0||m>0)?"end":"origin"));else{var i;if(e.state.editingLinearElement){var l=ya.handlePointerDown(t,e.state,(function(t){return e.setState(t)}),ef,n.origin);if(l.hitElement&&(n.hit.element=l.hitElement),l.didAddPoint)return!0}n.hit.element=null!==(i=n.hit.element)&&void 0!==i?i:e.getElementAtPosition(n.origin.x,n.origin.y),n.hit.allHitElements=e.getElementsAtPosition(n.origin.x,n.origin.y);var c=n.hit.element,s=n.hit.allHitElements.some((function(t){return e.isASelectedElement(t)}));if(null!==c&&s||t.shiftKey||n.hit.hasHitCommonBoundingBoxOfSelectedElements||e.clearSelection(c),null!=c){if(t[Qt])return e.setState((function(t){return Qp(Qp({},function(e,t){var n;return zr(zr({},e),{},{editingGroupId:t.groupIds.length?t.groupIds[0]:null,selectedGroupIds:{},selectedElementIds:(n={},n[t.id]=!0,n)})}(t,c)),{},{previousSelectedElementIds:e.state.selectedElementIds})})),!1;e.state.selectedElementIds[c.id]||(e.state.editingGroupId&&!Wr(c,e.state.editingGroupId)&&e.setState({selectedElementIds:{},selectedGroupIds:{},editingGroupId:null}),s||n.hit.hasHitCommonBoundingBoxOfSelectedElements||(e.setState((function(t){var n;return Fr(Qp(Qp({},t),{},{selectedElementIds:Qp(Qp({},t.selectedElementIds),{},(n={},n[c.id]=!0,n))}),e.scene.getElements())})),n.hit.wasAddedToSelection=!0))}e.setState({previousSelectedElementIds:e.state.selectedElementIds})}}var u,d,p,f,h,m;return!1},this.handleTextOnPointerDown=function(t,n){var r;"text"!==(null===(r=e.state.editingElement)||void 0===r?void 0:r.type)&&(e.startTextEditing({sceneX:n.origin.x,sceneY:n.origin.y,insertAtParentCenter:!t.altKey}),zn(),e.state.elementLocked||e.setState({elementType:"selection"}))},this.handleLinearElementOnPointerDown=function(t,n,r){if(e.state.multiElement){var o=e.state.multiElement;if("line"===o.type&&rt(o.points,e.state.zoom.value))return Mr(o,{lastCommittedPoint:o.points[o.points.length-1]}),void e.actionManager.executeAction(Bc);var a=o.x,i=o.y,l=o.lastCommittedPoint;if(o.points.length>1&&l&&nt(r.origin.x-a,r.origin.y-i,l[0],l[1])1){if("rotation"===t)return oi(e,n,l,c,o,s,u),!0;if("nw"===t||"ne"===t||"sw"===t||"se"===t)return ri(n,t,l,c),!0}return!1}(t,o,r,t.resize.arrowDirection,kn(n),xn(n),En(n),l,c,t.resize.center.x,t.resize.center.y)&&(e.maybeSuggestBindingForAll(r),!0)},this.openContextMenu=function(t){var n,r=t.clientX,o=t.clientY,a=Rn({clientX:r,clientY:o},e.state),i=a.x,l=a.y,c=Wu.contextItemPredicate(e.actionManager.getElementsIncludingDeleted(),e.actionManager.getAppState()),s=Gu.contextItemPredicate(e.actionManager.getElementsIncludingDeleted(),e.actionManager.getAppState()),u="separator",d=Ic(),p=e.scene.getElements(),f=e.getElementAtPosition(i,l),h=[];if(lu&&p.length>0&&h.push(pd),iu&&p.length>0&&h.push(dd),f)e.state.selectedElementIds[f.id]||e.setState({selectedElementIds:(n={},n[f.id]=!0,n)}),e.state.viewModeEnabled?Nd({options:[navigator.clipboard&&sd].concat(h),top:o,left:r,actionManager:e.actionManager,appState:e.state}):Nd({options:[d&&ud,d&&navigator.clipboard&&sd,d&&navigator.clipboard&&{name:"paste",perform:function(t,n){return e.pasteFromClipboard(null),{commitToHistory:!1}},contextItemLabel:"labels.paste"},d&&u].concat(h,[u,Lu,_u,u,c&&Wu,s&&Gu,(c||s)&&u,Yu,u,$l,Ql,Jl,ec,u,ic,Wl]),top:o,left:r,actionManager:e.actionManager,appState:e.state});else{var m=[].concat(h,[void 0===e.props.gridModeEnabled&&md,void 0===e.props.zenModeEnabled&&bd,void 0===e.props.viewModeEnabled&&Zp,xd]);if(Nd({options:m,top:o,left:r,actionManager:e.actionManager,appState:e.state}),e.state.viewModeEnabled)return;Nd({options:[d&&navigator.clipboard&&{name:"paste",perform:function(t,n){return e.pasteFromClipboard(null),{commitToHistory:!1}},contextItemLabel:"labels.paste"},d&&navigator.clipboard&&u,lu&&p.length>0&&pd,iu&&p.length>0&&dd,(lu&&p.length>0||iu&&p.length>0)&&u,rc,u,void 0===e.props.gridModeEnabled&&md,void 0===e.props.zenModeEnabled&&bd,void 0===e.props.viewModeEnabled&&Zp,xd],top:o,left:r,actionManager:e.actionManager,appState:e.state})}},this.handleWheel=Yn((function(t){if(t.preventDefault(),!lf){var n=t.deltaX,r=t.deltaY,o=e.state,a=o.selectedElementIds,i=o.previousSelectedElementIds;if(t.metaKey||t.ctrlKey){var l=Math.sign(r),c=Math.abs(r);c>10&&(c=10),c*=l,0!==Object.keys(i).length&&setTimeout((function(){e.setState({selectedElementIds:i,previousSelectedElementIds:{}})}),1e3);var u=e.state.zoom.value-c/100;return u+=Math.log10(Math.max(1,e.state.zoom.value))*-l,u=Math.round(u*s.V4*100)/(100*s.V4),e.setState((function(e){var t=e.zoom,n=e.offsetLeft,r=e.offsetTop;return{zoom:_i(Di(u),t,{left:n,top:r},{x:rf,y:of}),selectedElementIds:{},previousSelectedElementIds:0!==Object.keys(a).length?a:i,shouldCacheIgnoreZoom:!0}})),void e.resetShouldCacheIgnoreZoomDebounced()}t.shiftKey?e.setState((function(e){var t=e.zoom;return{scrollX:e.scrollX-(r||n)/t.value}})):e.setState((function(e){var t=e.zoom,o=e.scrollX,a=e.scrollY;return{scrollX:o-n/t.value,scrollY:a-r/t.value}}))}})),this.savePointer=function(t,n,r){var o,a;if(t&&n){var i=Rn({clientX:t,clientY:n},e.state);isNaN(i.x)||isNaN(i.y),null===(o=(a=e.props).onPointerUpdate)||void 0===o||o.call(a,{pointer:i,button:r,pointersMap:ff.pointers})}},this.resetShouldCacheIgnoreZoomDebounced=Ln((function(){e.unmounted||e.setState({shouldCacheIgnoreZoom:!1})}),300)};"production"!==s.Vi.TEST&&"production"!==s.Vi.DEVELOPMENT||(window.h=window.h||{},Object.defineProperties(window.h,{elements:{configurable:!0,get:function(){return this.app.scene.getElementsIncludingDeleted()},set:function(e){return this.app.scene.replaceAllElements(e)}},history:{configurable:!0,get:function(){return ef}},library:{configurable:!0,value:gu}}));var gf=hf;n(8234),n(4651);function vf(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function bf(e){for(var t=1;t {
isCollaborating,
onPointerUpdate,
onExportToBackend,
- renderFooter,
langCode = defaultLang.code,
viewModeEnabled,
zenModeEnabled,
gridModeEnabled,
+ onHomeButtonClick,
+ renderTopRight,
} = props;
useEffect(() => {
@@ -64,11 +65,12 @@ const Excalidraw = (props: ExcalidrawProps) => {
isCollaborating={isCollaborating}
onPointerUpdate={onPointerUpdate}
onExportToBackend={onExportToBackend}
- renderFooter={renderFooter}
langCode={langCode}
viewModeEnabled={viewModeEnabled}
zenModeEnabled={zenModeEnabled}
gridModeEnabled={gridModeEnabled}
+ onHomeButtonClick={onHomeButtonClick}
+ renderTopRight={renderTopRight}
/>
@@ -100,11 +102,24 @@ const forwardedRefComp = forwardRef<
ExcalidrawAPIRefValue,
PublicExcalidrawProps
>((props, ref) => );
+
export default React.memo(forwardedRefComp, areEqual);
+
export {
getSceneVersion,
getSyncableElements,
getElementMap,
} from "../../element";
export { defaultLang, languages } from "../../i18n";
-export { restore, restoreAppState, restoreElements } from "../../data/restore";
+export { restore, restoreElements, restoreAppState } from "../../data/restore";
+export {
+ exportToBlob,
+ exportToCanvas,
+ exportToSvg,
+ exportToClipboard,
+} from "../utils";
+export { getDefaultAppState } from "../../appState";
+export {
+ cleanAppStateForExport,
+ clearAppStateForLocalStorage,
+} from "../../appState";
diff --git a/src/packages/excalidraw/package.json b/src/packages/excalidraw/package.json
index cf29bed0cb0f..bad0e8bd7dd7 100644
--- a/src/packages/excalidraw/package.json
+++ b/src/packages/excalidraw/package.json
@@ -67,6 +67,7 @@
"homepage": "https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw",
"scripts": {
"build:umd": "cross-env NODE_ENV=production webpack --config webpack.prod.config.js",
+ "build": "rm -rf ./dist && cross-env NODE_ENV=production webpack --config webpack.prod.config.js",
"build:umd:withAnalyzer": "cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js",
"pack": "yarn build:umd && yarn pack"
}
diff --git a/src/packages/utils.ts b/src/packages/utils.ts
index 25731ef66a73..32dc956d1b29 100644
--- a/src/packages/utils.ts
+++ b/src/packages/utils.ts
@@ -87,3 +87,15 @@ export const exportToSvg = ({
metadata,
});
};
+
+export const exportToClipboard = async (
+ opts: ExportOpts & { mimeType?: string; quality?: number },
+) => {
+ const blob = await exportToBlob(opts);
+ if (!blob) {
+ throw new Error("couldn't export to blob");
+ }
+ await navigator.clipboard.write([
+ new window.ClipboardItem({ "image/png": blob }),
+ ]);
+};
diff --git a/src/packages/utils/yarn.lock b/src/packages/utils/yarn.lock
index f7f04722254c..09b462fd0454 100644
--- a/src/packages/utils/yarn.lock
+++ b/src/packages/utils/yarn.lock
@@ -673,9 +673,9 @@
"@babel/helper-plugin-utils" "^7.12.13"
"@babel/plugin-transform-runtime@^7.12.10":
- version "7.13.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.8.tgz#8c9a16db6cb6c2a1f748e36ae23558b92d223010"
- integrity sha512-6UbZ7P0FuuJiiUyRCfDgLw4PIG9bR2x6swHocv4qNZItkhXad0WsN6YX0deILuyZY2++meDKiDMuSVcejDZN0Q==
+ version "7.13.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.9.tgz#744d3103338a0d6c90dee0497558150b490cee07"
+ integrity sha512-XCxkY/wBI6M6Jj2mlWxkmqbKPweRanszWbF3Tyut+hKh+PHcuIH/rSr/7lmmE7C3WW+HSIm2GT+d5jwmheuB0g==
dependencies:
"@babel/helper-module-imports" "^7.12.13"
"@babel/helper-plugin-utils" "^7.13.0"
diff --git a/src/renderer/renderScene.ts b/src/renderer/renderScene.ts
index e0228464c996..9ae690ab1e4f 100644
--- a/src/renderer/renderScene.ts
+++ b/src/renderer/renderScene.ts
@@ -318,7 +318,11 @@ export const renderScene = (
if (sceneState.remoteSelectedElementIds[element.id]) {
selectionColors.push(
...sceneState.remoteSelectedElementIds[element.id].map((socketId) => {
- const { background } = getClientColors(socketId, appState);
+ const picture = appState.collaborators.get(socketId)?.picture;
+ const { background } = getClientColors(
+ picture || socketId,
+ appState,
+ );
return background;
}),
);
@@ -428,7 +432,6 @@ export const renderScene = (
// Paint remote pointers
for (const clientId in sceneState.remotePointerViewportCoords) {
let { x, y } = sceneState.remotePointerViewportCoords[clientId];
-
x -= appState.offsetLeft;
y -= appState.offsetTop;
@@ -446,7 +449,11 @@ export const renderScene = (
y = Math.max(y, 0);
y = Math.min(y, normalizedCanvasHeight - height);
- const { background, stroke } = getClientColors(clientId, appState);
+ const picture = appState.collaborators.get(clientId)?.picture;
+ const { background, stroke } = getClientColors(
+ picture || clientId,
+ appState,
+ );
const strokeStyle = context.strokeStyle;
const fillStyle = context.fillStyle;
diff --git a/src/types.ts b/src/types.ts
index 4e192daa0cdf..efe1be4e943e 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -37,6 +37,7 @@ export type Collaborator = {
background: string;
stroke: string;
};
+ picture?: string;
};
export type AppState = {
@@ -159,6 +160,8 @@ export type ExcalidrawAPIRefValue =
ready?: false;
};
+type InitialData = ImportedDataState & { scrollX?: number; scrollY?: number };
+
export interface ExcalidrawProps {
width?: number;
height?: number;
@@ -170,7 +173,11 @@ export interface ExcalidrawProps {
elements: readonly ExcalidrawElement[],
appState: AppState,
) => void;
- initialData?: ImportedDataState | null | Promise;
+ onHomeButtonClick?: () => void;
+ initialData?: InitialData | null | Promise;
+ user?: {
+ name?: string | null;
+ };
excalidrawRef?: ForwardRef;
onCollabButtonClick?: () => void;
isCollaborating?: boolean;
@@ -184,6 +191,7 @@ export interface ExcalidrawProps {
appState: AppState,
canvas: HTMLCanvasElement | null,
) => void;
+ renderTopRight?: (isMobile: boolean) => JSX.Element;
renderFooter?: (isMobile: boolean) => JSX.Element;
langCode?: Language["code"];
viewModeEnabled?: boolean;
diff --git a/src/utils.ts b/src/utils.ts
index 2532aefcca21..e76d4e7bcb6e 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -132,7 +132,7 @@ export const debounce = (
ret.flush = () => {
clearTimeout(handle);
if (lastArgs) {
- fn(...lastArgs);
+ fn(...(lastArgs || []));
}
};
ret.cancel = () => {