@excalidraw/common 0.18.0-4e471c107 → 0.18.0-51ad895

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/dev/index.js +329 -46
  2. package/dist/dev/index.js.map +3 -3
  3. package/dist/prod/index.js +3 -3
  4. package/dist/types/common/src/constants.d.ts +21 -15
  5. package/dist/types/common/src/editorInterface.d.ts +34 -0
  6. package/dist/types/common/src/index.d.ts +2 -0
  7. package/dist/types/common/src/utils.d.ts +9 -3
  8. package/dist/types/common/src/visualdebug.d.ts +41 -0
  9. package/dist/types/element/src/Scene.d.ts +6 -2
  10. package/dist/types/element/src/align.d.ts +2 -1
  11. package/dist/types/element/src/binding.d.ts +55 -43
  12. package/dist/types/element/src/bounds.d.ts +1 -1
  13. package/dist/types/element/src/collision.d.ts +6 -2
  14. package/dist/types/element/src/delta.d.ts +16 -4
  15. package/dist/types/element/src/distribute.d.ts +2 -1
  16. package/dist/types/element/src/groups.d.ts +1 -0
  17. package/dist/types/element/src/index.d.ts +1 -3
  18. package/dist/types/element/src/linearElementEditor.d.ts +17 -19
  19. package/dist/types/element/src/positionElementsOnGrid.d.ts +2 -0
  20. package/dist/types/element/src/renderElement.d.ts +5 -2
  21. package/dist/types/element/src/resizeTest.d.ts +5 -4
  22. package/dist/types/element/src/store.d.ts +6 -1
  23. package/dist/types/element/src/textElement.d.ts +1 -1
  24. package/dist/types/element/src/transformHandles.d.ts +5 -4
  25. package/dist/types/element/src/typeChecks.d.ts +2 -3
  26. package/dist/types/element/src/types.d.ts +7 -11
  27. package/dist/types/element/src/utils.d.ts +2 -1
  28. package/dist/types/element/src/zindex.d.ts +7 -1
  29. package/dist/types/excalidraw/actions/actionAddToLibrary.d.ts +34 -16
  30. package/dist/types/excalidraw/actions/actionAlign.d.ts +6 -6
  31. package/dist/types/excalidraw/actions/actionBoundText.d.ts +25 -13
  32. package/dist/types/excalidraw/actions/actionCanvas.d.ts +153 -275
  33. package/dist/types/excalidraw/actions/actionClipboard.d.ts +45 -777
  34. package/dist/types/excalidraw/actions/actionCropEditor.d.ts +12 -6
  35. package/dist/types/excalidraw/actions/actionDeleteSelected.d.ts +45 -29
  36. package/dist/types/excalidraw/actions/actionDistribute.d.ts +2 -2
  37. package/dist/types/excalidraw/actions/actionDuplicateSelection.d.ts +2 -2
  38. package/dist/types/excalidraw/actions/actionElementLink.d.ts +11 -7
  39. package/dist/types/excalidraw/actions/actionElementLock.d.ts +23 -11
  40. package/dist/types/excalidraw/actions/actionEmbeddable.d.ts +12 -6
  41. package/dist/types/excalidraw/actions/actionExport.d.ts +68 -952
  42. package/dist/types/excalidraw/actions/actionFinalize.d.ts +10 -394
  43. package/dist/types/excalidraw/actions/actionFlip.d.ts +2 -2
  44. package/dist/types/excalidraw/actions/actionFrame.d.ts +50 -28
  45. package/dist/types/excalidraw/actions/actionGroup.d.ts +24 -12
  46. package/dist/types/excalidraw/actions/actionLinearEditor.d.ts +47 -14
  47. package/dist/types/excalidraw/actions/actionLink.d.ts +9 -3
  48. package/dist/types/excalidraw/actions/actionMenu.d.ts +10 -374
  49. package/dist/types/excalidraw/actions/actionNavigate.d.ts +21 -361
  50. package/dist/types/excalidraw/actions/actionProperties.d.ts +87 -2418
  51. package/dist/types/excalidraw/actions/actionSelectAll.d.ts +12 -6
  52. package/dist/types/excalidraw/actions/actionStyles.d.ts +13 -7
  53. package/dist/types/excalidraw/actions/actionTextAutoResize.d.ts +1 -1
  54. package/dist/types/excalidraw/actions/actionToggleGridMode.d.ts +11 -5
  55. package/dist/types/excalidraw/actions/actionToggleObjectsSnapMode.d.ts +11 -5
  56. package/dist/types/excalidraw/actions/actionToggleSearchMenu.d.ts +10 -6
  57. package/dist/types/excalidraw/actions/actionToggleShapeSwitch.d.ts +1 -1
  58. package/dist/types/excalidraw/actions/actionToggleStats.d.ts +11 -5
  59. package/dist/types/excalidraw/actions/actionToggleViewMode.d.ts +11 -5
  60. package/dist/types/excalidraw/actions/actionToggleZenMode.d.ts +12 -6
  61. package/dist/types/excalidraw/actions/actionZindex.d.ts +2 -2
  62. package/dist/types/excalidraw/actions/index.d.ts +2 -2
  63. package/dist/types/excalidraw/actions/manager.d.ts +1 -1
  64. package/dist/types/excalidraw/actions/register.d.ts +1 -1
  65. package/dist/types/excalidraw/actions/types.d.ts +4 -4
  66. package/dist/types/excalidraw/appState.d.ts +9 -4
  67. package/dist/types/excalidraw/clipboard.d.ts +64 -1
  68. package/dist/types/excalidraw/components/Actions.d.ts +20 -7
  69. package/dist/types/excalidraw/components/App.d.ts +35 -25
  70. package/dist/types/excalidraw/components/ColorPicker/Picker.d.ts +2 -0
  71. package/dist/types/excalidraw/components/ColorPicker/PickerColorList.d.ts +2 -1
  72. package/dist/types/excalidraw/components/ColorPicker/ShadeList.d.ts +2 -1
  73. package/dist/types/excalidraw/components/CommandPalette/CommandPalette.d.ts +1 -0
  74. package/dist/types/excalidraw/components/CommandPalette/types.d.ts +1 -2
  75. package/dist/types/excalidraw/components/Ellipsify.d.ts +4 -0
  76. package/dist/types/excalidraw/components/ExcalidrawLogo.d.ts +1 -1
  77. package/dist/types/excalidraw/components/FilledButton.d.ts +1 -1
  78. package/dist/types/excalidraw/components/FontPicker/FontPicker.d.ts +2 -1
  79. package/dist/types/excalidraw/components/FontPicker/FontPickerTrigger.d.ts +3 -1
  80. package/dist/types/excalidraw/components/HintViewer.d.ts +4 -3
  81. package/dist/types/excalidraw/components/InlineIcon.d.ts +3 -1
  82. package/dist/types/excalidraw/components/LayerUI.d.ts +2 -1
  83. package/dist/types/excalidraw/components/LibraryMenuSection.d.ts +1 -1
  84. package/dist/types/excalidraw/components/MobileMenu.d.ts +3 -5
  85. package/dist/types/excalidraw/components/MobileToolBar.d.ts +11 -0
  86. package/dist/types/excalidraw/components/Popover.d.ts +2 -1
  87. package/dist/types/excalidraw/components/PropertiesPopover.d.ts +1 -0
  88. package/dist/types/excalidraw/components/Stats/utils.d.ts +1 -1
  89. package/dist/types/excalidraw/components/TTDDialog/TTDDialogTrigger.d.ts +1 -2
  90. package/dist/types/excalidraw/components/TextField.d.ts +1 -0
  91. package/dist/types/excalidraw/components/ToolPopover.d.ts +25 -0
  92. package/dist/types/excalidraw/components/canvases/InteractiveCanvas.d.ts +6 -3
  93. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenu.d.ts +4 -2
  94. package/dist/types/excalidraw/components/dropdownMenu/DropdownMenuContent.d.ts +2 -1
  95. package/dist/types/excalidraw/components/icons.d.ts +10 -0
  96. package/dist/types/excalidraw/components/live-collaboration/LiveCollaborationTrigger.d.ts +13 -1
  97. package/dist/types/excalidraw/components/main-menu/MainMenu.d.ts +0 -3
  98. package/dist/types/excalidraw/components/shapes.d.ts +129 -1
  99. package/dist/types/excalidraw/data/blob.d.ts +3 -7
  100. package/dist/types/excalidraw/data/reconcile.d.ts +1 -0
  101. package/dist/types/excalidraw/data/restore.d.ts +7 -2
  102. package/dist/types/excalidraw/data/types.d.ts +4 -1
  103. package/dist/types/excalidraw/hooks/useLibraryItemSvg.d.ts +1 -1
  104. package/dist/types/excalidraw/hooks/useOutsideClick.d.ts +3 -1
  105. package/dist/types/excalidraw/hooks/useTextEditorFocus.d.ts +14 -0
  106. package/dist/types/excalidraw/index.d.ts +4 -4
  107. package/dist/types/excalidraw/renderer/animation.d.ts +12 -0
  108. package/dist/types/excalidraw/renderer/helpers.d.ts +2 -6
  109. package/dist/types/excalidraw/renderer/interactiveScene.d.ts +5 -13
  110. package/dist/types/excalidraw/renderer/staticScene.d.ts +4 -1
  111. package/dist/types/excalidraw/scene/types.d.ts +15 -3
  112. package/dist/types/excalidraw/shortcut.d.ts +1 -0
  113. package/dist/types/excalidraw/types.d.ts +37 -24
  114. package/dist/types/math/src/segment.d.ts +1 -0
  115. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- var he=Object.create;var Y=Object.defineProperty;var ye=Object.getOwnPropertyDescriptor;var ge=Object.getOwnPropertyNames;var Le=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty;var Oe=(e,t)=>()=>(e&&(t=e(e=0)),t);var V=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Re=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ge(t))!Se.call(e,s)&&s!==n&&Y(e,s,{get:()=>t[s],enumerable:!(r=ye(t,s))||r.enumerable});return e};var X=(e,t,n)=>(n=e!=null?he(Le(e)):{},Re(t||!e||!e.__esModule?Y(n,"default",{value:e,enumerable:!0}):n,e));var f,c=Oe(()=>{f={PROD:!0}});var le=V((G,ae)=>{c();(function(e,t){typeof define=="function"&&define.amd?define([],t):typeof G=="object"?ae.exports=t():(e.PromisePool=t(),e.promisePool=e.PromisePool)})(G,function(){"use strict";var e=function(){this._listeners={}};e.prototype.addEventListener=function(o,a){this._listeners[o]=this._listeners[o]||[],this._listeners[o].indexOf(a)<0&&this._listeners[o].push(a)},e.prototype.removeEventListener=function(o,a){if(this._listeners[o]){var p=this._listeners[o].indexOf(a);p>=0&&this._listeners[o].splice(p,1)}},e.prototype.dispatchEvent=function(o){if(this._listeners[o.type]&&this._listeners[o.type].length)for(var a=this._listeners[o.type].slice(),p=0,m=a.length;p<m;++p)a[p].call(this,o)};var t=function(o){return typeof o.constructor=="function"&&o.constructor.name==="GeneratorFunction"},n=function(o){return{next:function(){var a=o();return a?{value:a}:{done:!0}}}},r=function(o){var a=!1;return{next:function(){return a?{done:!0}:(a=!0,{value:o})}}},s=function(o,a){var p=typeof o;if(p==="object"){if(typeof o.next=="function")return o;if(typeof o.then=="function")return r(o)}return p==="function"?t(o)?o():n(o):r(a.resolve(o))},l=function(o,a,p){this.target=o,this.type=a,this.data=p},i=function(o,a,p){if(e.call(this),typeof a!="number"||Math.floor(a)!==a||a<1)throw new Error("Invalid concurrency");this._concurrency=a,this._options=p||{},this._options.promise=this._options.promise||Promise,this._iterator=s(o,this._options.promise),this._done=!1,this._size=0,this._promise=null,this._callbacks=null};return i.prototype=new e,i.prototype.constructor=i,i.prototype.concurrency=function(o){return typeof o<"u"&&(this._concurrency=o,this.active()&&this._proceed()),this._concurrency},i.prototype.size=function(){return this._size},i.prototype.active=function(){return!!this._promise},i.prototype.promise=function(){return this._promise},i.prototype.start=function(){var o=this,a=this._options.promise;return this._promise=new a(function(p,m){o._callbacks={reject:m,resolve:p},o._proceed()}),this._promise},i.prototype._fireEvent=function(o,a){this.dispatchEvent(new l(this,o,a))},i.prototype._settle=function(o){o?this._callbacks.reject(o):this._callbacks.resolve(),this._promise=null,this._callbacks=null},i.prototype._onPooledPromiseFulfilled=function(o,a){this._size--,this.active()&&(this._fireEvent("fulfilled",{promise:o,result:a}),this._proceed())},i.prototype._onPooledPromiseRejected=function(o,a){this._size--,this.active()&&(this._fireEvent("rejected",{promise:o,error:a}),this._settle(a||new Error("Unknown error")))},i.prototype._trackPromise=function(o){var a=this;o.then(function(p){a._onPooledPromiseFulfilled(o,p)},function(p){a._onPooledPromiseRejected(o,p)}).catch(function(p){a._settle(new Error("Promise processing failed: "+p))})},i.prototype._proceed=function(){if(!this._done){for(var o={done:!1};this._size<this._concurrency&&!(o=this._iterator.next()).done;)this._size++,this._trackPromise(o.value);this._done=o===null||!!o.done}this._done&&this._size===0&&this._settle()},i.PromisePoolEvent=l,i.PromisePool=i,i})});var be=V(U=>{"use strict";c();Object.defineProperty(U,"__esModule",{value:!0});U.sanitizeUrl=void 0;var tt=/^([^\w]*)(javascript|data|vbscript)/im,nt=/&#(\w+)(^\w|;)?/g,rt=/&(newline|tab);/gi,ot=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,st=/^.+(:|&colon;)/gim,it=[".","/"];function at(e){return it.indexOf(e[0])>-1}function lt(e){return e.replace(nt,function(t,n){return String.fromCharCode(n)})}function ct(e){var t=lt(e||"").replace(rt,"").replace(ot,"").trim();if(!t)return"about:blank";if(at(t))return t;var n=t.match(st);if(!n)return t;var r=n[0];return tt.test(r)?"about:blank":t}U.sanitizeUrl=ct});c();c();var $=class{constructor(t){this.scoreFunction=t}content=[];sinkDown(t){let n=this.content[t];for(;t>0;){let r=(t+1>>1)-1,s=this.content[r];if(this.scoreFunction(n)<this.scoreFunction(s))this.content[r]=n,this.content[t]=s,t=r;else break}}bubbleUp(t){let n=this.content.length,r=this.content[t],s=this.scoreFunction(r);for(;;){let l=t+1<<1,i=l-1,o=null,a=0;if(i<n){let p=this.content[i];a=this.scoreFunction(p),a<s&&(o=i)}if(l<n){let p=this.content[l];this.scoreFunction(p)<(o===null?s:a)&&(o=l)}if(o!==null)this.content[t]=this.content[o],this.content[o]=r,t=o;else break}}push(t){this.content.push(t),this.sinkDown(this.content.length-1)}pop(){if(this.content.length===0)return null;let t=this.content[0],n=this.content.pop();return this.content.length>0&&(this.content[0]=n,this.bubbleUp(0)),t}remove(t){if(this.content.length===0)return;let n=this.content.indexOf(t),r=this.content.pop();n<this.content.length&&(this.content[n]=r,this.scoreFunction(r)<this.scoreFunction(t)?this.sinkDown(n):this.bubbleUp(n))}size(){return this.content.length}rescoreElement(t){this.sinkDown(this.content.indexOf(t))}};c();var z={white:"#ffffff",black:"#000000",gray:["#f8f9fa","#f1f3f5","#e9ecef","#dee2e6","#ced4da","#adb5bd","#868e96","#495057","#343a40","#212529"],red:["#fff5f5","#ffe3e3","#ffc9c9","#ffa8a8","#ff8787","#ff6b6b","#fa5252","#f03e3e","#e03131","#c92a2a"],pink:["#fff0f6","#ffdeeb","#fcc2d7","#faa2c1","#f783ac","#f06595","#e64980","#d6336c","#c2255c","#a61e4d"],grape:["#f8f0fc","#f3d9fa","#eebefa","#e599f7","#da77f2","#cc5de8","#be4bdb","#ae3ec9","#9c36b5","#862e9c"],violet:["#f3f0ff","#e5dbff","#d0bfff","#b197fc","#9775fa","#845ef7","#7950f2","#7048e8","#6741d9","#5f3dc4"],indigo:["#edf2ff","#dbe4ff","#bac8ff","#91a7ff","#748ffc","#5c7cfa","#4c6ef5","#4263eb","#3b5bdb","#364fc7"],blue:["#e7f5ff","#d0ebff","#a5d8ff","#74c0fc","#4dabf7","#339af0","#228be6","#1c7ed6","#1971c2","#1864ab"],cyan:["#e3fafc","#c5f6fa","#99e9f2","#66d9e8","#3bc9db","#22b8cf","#15aabf","#1098ad","#0c8599","#0b7285"],teal:["#e6fcf5","#c3fae8","#96f2d7","#63e6be","#38d9a9","#20c997","#12b886","#0ca678","#099268","#087f5b"],green:["#ebfbee","#d3f9d8","#b2f2bb","#8ce99a","#69db7c","#51cf66","#40c057","#37b24d","#2f9e44","#2b8a3e"],lime:["#f4fce3","#e9fac8","#d8f5a2","#c0eb75","#a9e34b","#94d82d","#82c91e","#74b816","#66a80f","#5c940d"],yellow:["#fff9db","#fff3bf","#ffec99","#ffe066","#ffd43b","#fcc419","#fab005","#f59f00","#f08c00","#e67700"],orange:["#fff4e6","#ffe8cc","#ffd8a8","#ffc078","#ffa94d","#ff922b","#fd7e14","#f76707","#e8590c","#d9480f"]};var xt=240,Fe=(e,t)=>t.reduce((n,r)=>(r in e&&(n[r]=e[r]),n),{}),bt=5,_t=5,At=4,C=4,F=1,E=[0,2,4,6,8],ht=[0,1,2,3,4],x=(e,t)=>t.map(n=>z[e][n]),u={transparent:"transparent",black:"#1e1e1e",white:"#ffffff",gray:x("gray",E),red:x("red",E),pink:x("pink",E),grape:x("grape",E),violet:x("violet",E),blue:x("blue",E),cyan:x("cyan",E),teal:x("teal",E),green:x("green",E),yellow:x("yellow",E),orange:x("orange",E),bronze:["#f8f1ee","#eaddd7","#d2bab0","#a18072","#846358"]},j=Fe(u,["cyan","blue","violet","grape","pink","green","teal","yellow","orange","red"]),yt=[u.black,u.red[C],u.green[C],u.blue[C],u.yellow[C]],gt=[u.transparent,u.red[F],u.green[F],u.blue[F],u.yellow[F]],Lt=[u.white,"#f8f9fa","#f5faff","#fffce8","#fdf8f6"],St={transparent:u.transparent,white:u.white,gray:u.gray,black:u.black,bronze:u.bronze,...j},Ot={transparent:u.transparent,white:u.white,gray:u.gray,black:u.black,bronze:u.bronze,...j},Rt=e=>[u.cyan[e],u.blue[e],u.violet[e],u.grape[e],u.pink[e],u.green[e],u.teal[e],u.yellow[e],u.orange[e],u.red[e]],vt=(e,t,n)=>`#${((1<<24)+(e<<16)+(t<<8)+n).toString(16).slice(1)}`;c();var w=/Mac|iPod|iPhone|iPad/.test(navigator.platform),It=/^Win/.test(navigator.platform),Mt=/\b(android)\b/i.test(navigator.userAgent),Pt=typeof window<"u"&&"netscape"in window&&navigator.userAgent.indexOf("rv:")>1&&navigator.userAgent.indexOf("Gecko")>1,we=navigator.userAgent.indexOf("Chrome")!==-1,Dt=!we&&navigator.userAgent.indexOf("Safari")!==-1,Ut=/iPad|iPhone/.test(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document,Nt=()=>navigator.brave?.isBrave?.name==="isBrave",kt=typeof window<"u"&&"ResizeObserver"in window,Ht="Excalidraw",Kt=36,Bt=10,Gt=8,Wt=5,Yt=1,Vt=30,Xt=Math.PI/12,$t="red",zt={TEXT:"text",CROSSHAIR:"crosshair",GRABBING:"grabbing",GRAB:"grab",POINTER:"pointer",MOVE:"move",AUTO:""},jt={MAIN:0,WHEEL:1,SECONDARY:2,TOUCH:-1,ERASER:5},Zt={enabled:"all",disabled:"none",inheritFromUI:"var(--ui-pointerEvents)"},Ie=(d=>(d.COPY="copy",d.PASTE="paste",d.CUT="cut",d.KEYDOWN="keydown",d.KEYUP="keyup",d.MOUSE_MOVE="mousemove",d.RESIZE="resize",d.UNLOAD="unload",d.FOCUS="focus",d.BLUR="blur",d.DRAG_OVER="dragover",d.DROP="drop",d.GESTURE_END="gestureend",d.BEFORE_UNLOAD="beforeunload",d.GESTURE_START="gesturestart",d.GESTURE_CHANGE="gesturechange",d.POINTER_MOVE="pointermove",d.POINTER_DOWN="pointerdown",d.POINTER_UP="pointerup",d.STATE_CHANGE="statechange",d.WHEEL="wheel",d.TOUCH_START="touchstart",d.TOUCH_END="touchend",d.HASHCHANGE="hashchange",d.VISIBILITY_CHANGE="visibilitychange",d.SCROLL="scroll",d.EXCALIDRAW_LINK="excalidraw-link",d.MENU_ITEM_SELECT="menu.itemSelect",d.MESSAGE="message",d.FULLSCREENCHANGE="fullscreenchange",d))(Ie||{}),qt={UNSTARTED:-1,ENDED:0,PLAYING:1,PAUSED:2,BUFFERING:3,CUED:5},I={TEST:"test",DEVELOPMENT:"development",PRODUCTION:"production"},Qt={SHAPE_ACTIONS_MENU:"App-menu__left",ZOOM_ACTIONS:"zoom-actions",SEARCH_MENU_INPUT_WRAPPER:"layer-ui__search-inputWrapper",CONVERT_ELEMENT_TYPE_POPUP:"ConvertElementTypePopup"},q="Xiaolai",L="Segoe UI Emoji",T={Virgil:1,Helvetica:2,Cascadia:3,Excalifont:5,Nunito:6,"Lilita One":7,"Comic Shanns":8,"Liberation Sans":9,Assistant:10},Q="sans-serif",J="monospace",Me={[Q]:998,[J]:999},B={[q]:100,...Me,[L]:1e3};function Pe(e){switch(e){case T.Cascadia:case T["Comic Shanns"]:return J;default:return Q}}var ee=e=>{let t=Pe(e);switch(e){case T.Excalifont:return[q,t,L];default:return[t,L]}},Jt={LIGHT:"light",DARK:"dark"},en={strokeColor:"#bbb",strokeWidth:2,strokeStyle:"solid",fillStyle:"solid",roughness:0,roundness:null,backgroundColor:"transparent",radius:8,nameOffsetY:3,nameColorLightTheme:"#999999",nameColorDarkTheme:"#7a7a7a",nameFontSize:14,nameLineHeight:1.25},tn=1,nn=20,rn=T.Excalifont,on="left",sn="top",te="{version}",De=2,Ue=2*De,Ne=1e-5,an=2*Ue-Ne,ln="#ffffff",cn="#1e1e1e",un="#a2f1a6",pn=["selectAll"],dn=20,fn=5,ne={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",ico:"image/x-icon",avif:"image/avif",jfif:"image/jfif"},Z={text:"text/plain",html:"text/html",json:"application/json",excalidraw:"application/vnd.excalidraw+json",excalidrawlib:"application/vnd.excalidrawlib+json","excalidraw.svg":"image/svg+xml","excalidraw.png":"image/png",binary:"application/octet-stream",...ne},Tn=[Z.text,Z.html,...Object.values(ne)],mn={png:"png",svg:"svg",clipboard:"clipboard"},En={excalidraw:"excalidraw",excalidrawClipboard:"excalidraw/clipboard",excalidrawLibrary:"excalidrawlib",excalidrawClipboardWithAPI:"excalidraw-api/clipboard"},xn=()=>window.EXCALIDRAW_EXPORT_SOURCE||window.location.origin,bn=500,_n=300,An=500,hn=1e4,yn=3e4,gn=100,Ln=.1,Sn=.1,On=30,Rn=300,vn=6e4,Cn=3e3,Fn="invert(93%) hue-rotate(180deg)",wn={addLibrary:"addLibrary"},In={addLibrary:"addLibrary"},Mn={canvasActions:{changeViewBackgroundColor:!0,clearCanvas:!0,export:{saveFileToDisk:!0},loadScene:!0,saveToActiveFile:!0,toggleTheme:null,saveAsImage:!0},tools:{image:!0}},Pn=730,Dn=1e3,Un=500,Nn=1229,kn=2,Hn=[1,2,3],Kn=10,Bn=1440,Gn=4*1024*1024,Wn="http://www.w3.org/2000/svg",Yn=`<?xml version="1.0" standalone="no"?>
1
+ var we=Object.create;var $=Object.defineProperty;var Ie=Object.getOwnPropertyDescriptor;var Pe=Object.getOwnPropertyNames;var Ce=Object.getPrototypeOf,De=Object.prototype.hasOwnProperty;var Ue=(e,t)=>()=>(e&&(t=e(e=0)),t);var j=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ne=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Pe(t))!De.call(e,r)&&r!==n&&$(e,r,{get:()=>t[r],enumerable:!(o=Ie(t,r))||o.enumerable});return e};var Q=(e,t,n)=>(n=e!=null?we(Ce(e)):{},Ne(t||!e||!e.__esModule?$(n,"default",{value:e,enumerable:!0}):n,e));var f,c=Ue(()=>{f={PROD:!0}});var Ee=j((Y,Te)=>{c();(function(e,t){typeof define=="function"&&define.amd?define([],t):typeof Y=="object"?Te.exports=t():(e.PromisePool=t(),e.promisePool=e.PromisePool)})(Y,function(){"use strict";var e=function(){this._listeners={}};e.prototype.addEventListener=function(s,i){this._listeners[s]=this._listeners[s]||[],this._listeners[s].indexOf(i)<0&&this._listeners[s].push(i)},e.prototype.removeEventListener=function(s,i){if(this._listeners[s]){var p=this._listeners[s].indexOf(i);p>=0&&this._listeners[s].splice(p,1)}},e.prototype.dispatchEvent=function(s){if(this._listeners[s.type]&&this._listeners[s.type].length)for(var i=this._listeners[s.type].slice(),p=0,E=i.length;p<E;++p)i[p].call(this,s)};var t=function(s){return typeof s.constructor=="function"&&s.constructor.name==="GeneratorFunction"},n=function(s){return{next:function(){var i=s();return i?{value:i}:{done:!0}}}},o=function(s){var i=!1;return{next:function(){return i?{done:!0}:(i=!0,{value:s})}}},r=function(s,i){var p=typeof s;if(p==="object"){if(typeof s.next=="function")return s;if(typeof s.then=="function")return o(s)}return p==="function"?t(s)?s():n(s):o(i.resolve(s))},l=function(s,i,p){this.target=s,this.type=i,this.data=p},a=function(s,i,p){if(e.call(this),typeof i!="number"||Math.floor(i)!==i||i<1)throw new Error("Invalid concurrency");this._concurrency=i,this._options=p||{},this._options.promise=this._options.promise||Promise,this._iterator=r(s,this._options.promise),this._done=!1,this._size=0,this._promise=null,this._callbacks=null};return a.prototype=new e,a.prototype.constructor=a,a.prototype.concurrency=function(s){return typeof s<"u"&&(this._concurrency=s,this.active()&&this._proceed()),this._concurrency},a.prototype.size=function(){return this._size},a.prototype.active=function(){return!!this._promise},a.prototype.promise=function(){return this._promise},a.prototype.start=function(){var s=this,i=this._options.promise;return this._promise=new i(function(p,E){s._callbacks={reject:E,resolve:p},s._proceed()}),this._promise},a.prototype._fireEvent=function(s,i){this.dispatchEvent(new l(this,s,i))},a.prototype._settle=function(s){s?this._callbacks.reject(s):this._callbacks.resolve(),this._promise=null,this._callbacks=null},a.prototype._onPooledPromiseFulfilled=function(s,i){this._size--,this.active()&&(this._fireEvent("fulfilled",{promise:s,result:i}),this._proceed())},a.prototype._onPooledPromiseRejected=function(s,i){this._size--,this.active()&&(this._fireEvent("rejected",{promise:s,error:i}),this._settle(i||new Error("Unknown error")))},a.prototype._trackPromise=function(s){var i=this;s.then(function(p){i._onPooledPromiseFulfilled(s,p)},function(p){i._onPooledPromiseRejected(s,p)}).catch(function(p){i._settle(new Error("Promise processing failed: "+p))})},a.prototype._proceed=function(){if(!this._done){for(var s={done:!1};this._size<this._concurrency&&!(s=this._iterator.next()).done;)this._size++,this._trackPromise(s.value);this._done=s===null||!!s.done}this._done&&this._size===0&&this._settle()},a.PromisePoolEvent=l,a.PromisePool=a,a})});var Re=j(k=>{"use strict";c();Object.defineProperty(k,"__esModule",{value:!0});k.sanitizeUrl=void 0;var Tt=/^([^\w]*)(javascript|data|vbscript)/im,Et=/&#(\w+)(^\w|;)?/g,xt=/&(newline|tab);/gi,bt=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,_t=/^.+(:|&colon;)/gim,At=[".","/"];function ht(e){return At.indexOf(e[0])>-1}function yt(e){return e.replace(Et,function(t,n){return String.fromCharCode(n)})}function gt(e){var t=yt(e||"").replace(xt,"").replace(bt,"").trim();if(!t)return"about:blank";if(ht(t))return t;var n=t.match(_t);if(!n)return t;var o=n[0];return Tt.test(o)?"about:blank":t}k.sanitizeUrl=gt});c();c();var Z=class{constructor(t){this.scoreFunction=t}content=[];sinkDown(t){let n=this.content[t],o=this.scoreFunction(n);for(;t>0;){let r=(t+1>>1)-1,l=this.content[r];if(o<this.scoreFunction(l))this.content[t]=l,t=r;else break}this.content[t]=n}bubbleUp(t){let n=this.content.length,o=this.content[t],r=this.scoreFunction(o);for(;;){let l=(t+1<<1)-1,a=l+1,s=t,i=r;if(l<n){let p=this.scoreFunction(this.content[l]);p<i&&(s=l,i=p)}if(a<n&&this.scoreFunction(this.content[a])<i&&(s=a),s===t)break;this.content[t]=this.content[s],t=s}this.content[t]=o}push(t){this.content.push(t),this.sinkDown(this.content.length-1)}pop(){if(this.content.length===0)return null;let t=this.content[0],n=this.content.pop();return this.content.length>0&&(this.content[0]=n,this.bubbleUp(0)),t}remove(t){if(this.content.length===0)return;let n=this.content.indexOf(t),o=this.content.pop();n<this.content.length&&(this.content[n]=o,this.scoreFunction(o)<this.scoreFunction(t)?this.sinkDown(n):this.bubbleUp(n))}size(){return this.content.length}rescoreElement(t){this.sinkDown(this.content.indexOf(t))}};c();var q={white:"#ffffff",black:"#000000",gray:["#f8f9fa","#f1f3f5","#e9ecef","#dee2e6","#ced4da","#adb5bd","#868e96","#495057","#343a40","#212529"],red:["#fff5f5","#ffe3e3","#ffc9c9","#ffa8a8","#ff8787","#ff6b6b","#fa5252","#f03e3e","#e03131","#c92a2a"],pink:["#fff0f6","#ffdeeb","#fcc2d7","#faa2c1","#f783ac","#f06595","#e64980","#d6336c","#c2255c","#a61e4d"],grape:["#f8f0fc","#f3d9fa","#eebefa","#e599f7","#da77f2","#cc5de8","#be4bdb","#ae3ec9","#9c36b5","#862e9c"],violet:["#f3f0ff","#e5dbff","#d0bfff","#b197fc","#9775fa","#845ef7","#7950f2","#7048e8","#6741d9","#5f3dc4"],indigo:["#edf2ff","#dbe4ff","#bac8ff","#91a7ff","#748ffc","#5c7cfa","#4c6ef5","#4263eb","#3b5bdb","#364fc7"],blue:["#e7f5ff","#d0ebff","#a5d8ff","#74c0fc","#4dabf7","#339af0","#228be6","#1c7ed6","#1971c2","#1864ab"],cyan:["#e3fafc","#c5f6fa","#99e9f2","#66d9e8","#3bc9db","#22b8cf","#15aabf","#1098ad","#0c8599","#0b7285"],teal:["#e6fcf5","#c3fae8","#96f2d7","#63e6be","#38d9a9","#20c997","#12b886","#0ca678","#099268","#087f5b"],green:["#ebfbee","#d3f9d8","#b2f2bb","#8ce99a","#69db7c","#51cf66","#40c057","#37b24d","#2f9e44","#2b8a3e"],lime:["#f4fce3","#e9fac8","#d8f5a2","#c0eb75","#a9e34b","#94d82d","#82c91e","#74b816","#66a80f","#5c940d"],yellow:["#fff9db","#fff3bf","#ffec99","#ffe066","#ffd43b","#fcc419","#fab005","#f59f00","#f08c00","#e67700"],orange:["#fff4e6","#ffe8cc","#ffd8a8","#ffc078","#ffa94d","#ff922b","#fd7e14","#f76707","#e8590c","#d9480f"]};var Ct=240,Ge=(e,t)=>t.reduce((n,o)=>(o in e&&(n[o]=e[o]),n),{}),Dt=5,Ut=5,Nt=4,I=4,P=1,x=[0,2,4,6,8],kt=[0,1,2,3,4],b=(e,t)=>t.map(n=>q[e][n]),u={transparent:"transparent",black:"#1e1e1e",white:"#ffffff",gray:b("gray",x),red:b("red",x),pink:b("pink",x),grape:b("grape",x),violet:b("violet",x),blue:b("blue",x),cyan:b("cyan",x),teal:b("teal",x),green:b("green",x),yellow:b("yellow",x),orange:b("orange",x),bronze:["#f8f1ee","#eaddd7","#d2bab0","#a18072","#846358"]},J=Ge(u,["cyan","blue","violet","grape","pink","green","teal","yellow","orange","red"]),Ht=[u.black,u.red[I],u.green[I],u.blue[I],u.yellow[I]],Gt=[u.transparent,u.red[P],u.green[P],u.blue[P],u.yellow[P]],Bt=[u.white,"#f8f9fa","#f5faff","#fffce8","#fdf8f6"],Kt={transparent:u.transparent,white:u.white,gray:u.gray,black:u.black,bronze:u.bronze,...J},Wt={transparent:u.transparent,white:u.white,gray:u.gray,black:u.black,bronze:u.bronze,...J},Yt=e=>[u.cyan[e],u.blue[e],u.violet[e],u.grape[e],u.pink[e],u.green[e],u.teal[e],u.yellow[e],u.orange[e],u.red[e]],Xt=(e,t,n)=>`#${((1<<24)+(e<<16)+(t<<8)+n).toString(16).slice(1)}`;c();var jt=typeof window<"u"&&"ResizeObserver"in window,Qt="Excalidraw",Zt=36,qt=10,Jt=20,en=8,tn=5,nn=1,on=30,rn=Math.PI/12,sn="red",an={TEXT:"text",CROSSHAIR:"crosshair",GRABBING:"grabbing",GRAB:"grab",POINTER:"pointer",MOVE:"move",AUTO:""},ln={MAIN:0,WHEEL:1,SECONDARY:2,TOUCH:-1,ERASER:5},cn={enabled:"all",disabled:"none",inheritFromUI:"var(--ui-pointerEvents)"},Be=(d=>(d.COPY="copy",d.PASTE="paste",d.CUT="cut",d.KEYDOWN="keydown",d.KEYUP="keyup",d.MOUSE_MOVE="mousemove",d.RESIZE="resize",d.UNLOAD="unload",d.FOCUS="focus",d.BLUR="blur",d.DRAG_OVER="dragover",d.DROP="drop",d.GESTURE_END="gestureend",d.BEFORE_UNLOAD="beforeunload",d.GESTURE_START="gesturestart",d.GESTURE_CHANGE="gesturechange",d.POINTER_MOVE="pointermove",d.POINTER_DOWN="pointerdown",d.POINTER_UP="pointerup",d.STATE_CHANGE="statechange",d.WHEEL="wheel",d.TOUCH_START="touchstart",d.TOUCH_END="touchend",d.HASHCHANGE="hashchange",d.VISIBILITY_CHANGE="visibilitychange",d.SCROLL="scroll",d.EXCALIDRAW_LINK="excalidraw-link",d.MENU_ITEM_SELECT="menu.itemSelect",d.MESSAGE="message",d.FULLSCREENCHANGE="fullscreenchange",d))(Be||{}),un={UNSTARTED:-1,ENDED:0,PLAYING:1,PAUSED:2,BUFFERING:3,CUED:5},C={TEST:"test",DEVELOPMENT:"development",PRODUCTION:"production"},pn={SIDEBAR:"sidebar",SHAPE_ACTIONS_MENU:"App-menu__left",ZOOM_ACTIONS:"zoom-actions",SEARCH_MENU_INPUT_WRAPPER:"layer-ui__search-inputWrapper",CONVERT_ELEMENT_TYPE_POPUP:"ConvertElementTypePopup",SHAPE_ACTIONS_THEME_SCOPE:"shape-actions-theme-scope",FRAME_NAME:"frame-name"},te="Xiaolai",R="Segoe UI Emoji",m={Virgil:1,Helvetica:2,Cascadia:3,Excalifont:5,Nunito:6,"Lilita One":7,"Comic Shanns":8,"Liberation Sans":9,Assistant:10},ne="sans-serif",oe="monospace",Ke={[ne]:998,[oe]:999},W={[te]:100,...Ke,[R]:1e3};function We(e){switch(e){case m.Cascadia:case m["Comic Shanns"]:return oe;default:return ne}}var re=e=>{let t=We(e);switch(e){case m.Excalifont:return[te,t,R];default:return[t,R]}},dn={LIGHT:"light",DARK:"dark"},fn={strokeColor:"#bbb",strokeWidth:2,strokeStyle:"solid",fillStyle:"solid",roughness:0,roundness:null,backgroundColor:"transparent",radius:8,nameOffsetY:3,nameColorLightTheme:"#999999",nameColorDarkTheme:"#7a7a7a",nameFontSize:14,nameLineHeight:1.25},mn=1,Tn=20,En=m.Excalifont,xn="left",bn="top",se="{version}",Ye=2,Xe=2*Ye,ze=1e-5,_n=2*Xe-ze,An="#ffffff",hn="#1e1e1e",yn="#a2f1a6",gn=["selectAll"],Sn=20,Ln=5,ae={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",gif:"image/gif",webp:"image/webp",bmp:"image/bmp",ico:"image/x-icon",avif:"image/avif",jfif:"image/jfif"},Ve={text:"text/plain",html:"text/html",json:"application/json",excalidraw:"application/vnd.excalidraw+json",excalidrawlib:"application/vnd.excalidrawlib+json",excalidrawlibIds:"application/vnd.excalidrawlib.ids+json"},ee={...Ve,"excalidraw.svg":"image/svg+xml","excalidraw.png":"image/png",binary:"application/octet-stream",...ae},On=[ee.text,ee.html,...Object.values(ae)],Rn={png:"png",svg:"svg",clipboard:"clipboard"},vn={excalidraw:"excalidraw",excalidrawClipboard:"excalidraw/clipboard",excalidrawLibrary:"excalidrawlib",excalidrawClipboardWithAPI:"excalidraw-api/clipboard"},Fn=()=>window.EXCALIDRAW_EXPORT_SOURCE||window.location.origin,Mn=500,wn=300,In=500,Pn=1e4,Cn=3e4,Dn=100,Un=.1,Nn=.1,kn=30,Hn=300,Gn=6e4,Bn=3e3,Kn="invert(93%) hue-rotate(180deg)",Wn={addLibrary:"addLibrary"},Yn={addLibrary:"addLibrary"},Xn={canvasActions:{changeViewBackgroundColor:!0,clearCanvas:!0,export:{saveFileToDisk:!0},loadScene:!0,saveToActiveFile:!0,toggleTheme:null,saveAsImage:!0},tools:{image:!0}},zn=2,Vn=[1,2,3],$n=10,jn=1440,Qn=4*1024*1024,Zn="http://www.w3.org/2000/svg",qn=`<?xml version="1.0" standalone="no"?>
2
2
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
- `,Vn=128,Xn={excalidraw:2,excalidrawLibrary:2},$n=5,zn=.7,jn=11,Zn={TOP:"top",MIDDLE:"middle",BOTTOM:"bottom"},qn={LEFT:"left",CENTER:"center",RIGHT:"right"},Qn=20,Jn=.25,er=32,tr={LEGACY:1,PROPORTIONAL_RADIUS:2,ADAPTIVE_RADIUS:3},ke={architect:0,artist:1,cartoonist:2},nr={thin:1,bold:2,extraBold:4},rr={strokeColor:u.black,backgroundColor:u.transparent,fillStyle:"solid",strokeWidth:2,strokeStyle:"solid",roughness:ke.artist,opacity:100,locked:!1},He="library",or="search",sr={name:"default",defaultTab:He},ir=new Set(["iframe","embeddable","image"]),ar={selection:"selection",lasso:"lasso",rectangle:"rectangle",diamond:"diamond",ellipse:"ellipse",arrow:"arrow",line:"line",freedraw:"freedraw",text:"text",image:"image",eraser:"eraser",hand:"hand",frame:"frame",magicframe:"magicframe",embeddable:"embeddable",laser:"laser"},lr={OAI_API_KEY:"excalidraw-oai-api-key",MERMAID_TO_EXCALIDRAW:"mermaid-to-excalidraw",PUBLISH_LIBRARY:"publish-library-data"},cr="Untitled",ur={generalStats:1,elementProperties:2},pr=1,dr={sharp:"sharp",round:"round",elbow:"elbow"},fr=.3,Tr="element",mr=Symbol.for("__test__originalId__"),Ke=(r=>(r.ACTIVE="active",r.AWAY="away",r.IDLE="idle",r))(Ke||{}),Er=20;c();var M={[T.Excalifont]:{metrics:{unitsPerEm:1e3,ascender:886,descender:-374,lineHeight:1.25}},[T.Nunito]:{metrics:{unitsPerEm:1e3,ascender:1011,descender:-353,lineHeight:1.25}},[T["Lilita One"]]:{metrics:{unitsPerEm:1e3,ascender:923,descender:-220,lineHeight:1.15}},[T["Comic Shanns"]]:{metrics:{unitsPerEm:1e3,ascender:750,descender:-250,lineHeight:1.25}},[T.Virgil]:{metrics:{unitsPerEm:1e3,ascender:886,descender:-374,lineHeight:1.25},deprecated:!0},[T.Helvetica]:{metrics:{unitsPerEm:2048,ascender:1577,descender:-471,lineHeight:1.15},deprecated:!0,local:!0},[T.Cascadia]:{metrics:{unitsPerEm:2048,ascender:1900,descender:-480,lineHeight:1.2},deprecated:!0},[T["Liberation Sans"]]:{metrics:{unitsPerEm:2048,ascender:1854,descender:-434,lineHeight:1.15},private:!0},[T.Assistant]:{metrics:{unitsPerEm:2048,ascender:1021,descender:-287,lineHeight:1.25},private:!0},[B.Xiaolai]:{metrics:{unitsPerEm:1e3,ascender:880,descender:-144,lineHeight:1.25},fallback:!0},[B["Segoe UI Emoji"]]:{metrics:{unitsPerEm:1e3,ascender:886,descender:-374,lineHeight:1.25},local:!0,fallback:!0}},Ar={LATIN:"U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD",LATIN_EXT:"U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF",CYRILIC_EXT:"U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F",CYRILIC:"U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116",VIETNAMESE:"U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB"},hr="local:",yr=(e,t,n)=>{let{unitsPerEm:r,ascender:s,descender:l}=M[e]?.metrics||M[T.Excalifont].metrics,i=t/r,o=(n-i*s+i*l)/2;return i*s+o},gr=e=>{let{lineHeight:t}=M[e]?.metrics||M[T.Excalifont].metrics;return t};c();var re=class{jobs=[];running=!1;tick(){if(this.running)return;let t=this.jobs.shift();t?(this.running=!0,t.promise.resolve(se(t.jobFactory,...t.args).finally(()=>{this.running=!1,this.tick()}))):this.running=!1}push(t,...n){let r=oe();return this.jobs.push({jobFactory:t,promise:r,args:n}),this.tick(),r}};c();var ie={EQUAL:"Equal",MINUS:"Minus",NUM_ADD:"NumpadAdd",NUM_SUBTRACT:"NumpadSubtract",NUM_ZERO:"Numpad0",BRACKET_RIGHT:"BracketRight",BRACKET_LEFT:"BracketLeft",ONE:"Digit1",TWO:"Digit2",THREE:"Digit3",NINE:"Digit9",QUOTE:"Quote",ZERO:"Digit0",SLASH:"Slash",C:"KeyC",D:"KeyD",H:"KeyH",V:"KeyV",Z:"KeyZ",Y:"KeyY",R:"KeyR",S:"KeyS"},y={ARROW_DOWN:"ArrowDown",ARROW_LEFT:"ArrowLeft",ARROW_RIGHT:"ArrowRight",ARROW_UP:"ArrowUp",PAGE_UP:"PageUp",PAGE_DOWN:"PageDown",BACKSPACE:"Backspace",ALT:"Alt",CTRL_OR_CMD:w?"metaKey":"ctrlKey",DELETE:"Delete",ENTER:"Enter",ESCAPE:"Escape",QUESTION_MARK:"?",SPACE:" ",TAB:"Tab",CHEVRON_LEFT:"<",CHEVRON_RIGHT:">",PERIOD:".",COMMA:",",SUBTRACT:"-",SLASH:"/",A:"a",C:"c",D:"d",E:"e",F:"f",G:"g",H:"h",I:"i",L:"l",O:"o",P:"p",Q:"q",R:"r",S:"s",T:"t",V:"v",X:"x",Y:"y",Z:"z",K:"k",W:"w",0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9"},Be=new Map([[y.Z,ie.Z],[y.Y,ie.Y]]),Ge=e=>/^[a-z]$/.test(e.toLowerCase()),Fr=(e,t)=>{if(t===e.key.toLowerCase())return!0;let n=Be.get(t);return!!(n&&!Ge(e.key)&&e.code===n)},wr=e=>e===y.ARROW_LEFT||e===y.ARROW_RIGHT||e===y.ARROW_DOWN||e===y.ARROW_UP,Ir=e=>e.altKey,Mr=e=>e.shiftKey,Pr=e=>e.shiftKey;c();import{pointFromPair as We}from"@excalidraw/math";var kr=e=>{let t=e.map(r=>r[0]),n=e.map(r=>r[1]);return{width:Math.max(...t)-Math.min(...t),height:Math.max(...n)-Math.min(...n)}},Hr=(e,t,n,r)=>{let s=n.map(b=>b[e]),l=Math.max(...s),i=Math.min(...s),o=l-i,a=o===0?1:t/o,p=1/0,m=n.map(b=>{let _=b[e]*a,A=[...b];return A[e]=_,_<p&&(p=_),A});if(!r||m.length===2)return m;let O=i-p;return m.map(b=>We(b.map((_,A)=>A===e?_+O:_)))},Kr=(e,t,n)=>n?[Math.round(e/n)*n,Math.round(t/n)*n]:[e,t];c();var ue=X(le(),1),ce=class{pool;entries={};constructor(t,n){this.pool=new ue.default(t,n)}all(){let t=n=>{if(n.data.result){let[r,s]=n.data.result;this.entries[r]=s}};return this.pool.addEventListener("fulfilled",t),this.pool.start().then(()=>(setTimeout(()=>{this.pool.removeEventListener("fulfilled",t)}),Object.values(this.entries)))}};c();c();c();var pe=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,n)=>(n&=63,n<36?t+=n.toString(36):n<62?t+=(n-26).toString(36).toUpperCase():n>62?t+="-":t+="_",t),"");c();var S=class{constructor(t){this.seed=t}next(){return this.seed?(2**31-1&(this.seed=Math.imul(48271,this.seed)))/2**31:Math.random()}};c();import{average as P}from"@excalidraw/math";var W=null,ro=e=>{W=e},oo=()=>{if(W)return W;let e=new Date,t=e.getFullYear(),n=`${e.getMonth()+1}`.padStart(2,"0"),r=`${e.getDate()}`.padStart(2,"0"),s=`${e.getHours()}`.padStart(2,"0"),l=`${e.getMinutes()}`.padStart(2,"0");return`${t}-${n}-${r}-${s}${l}`},so=e=>e.charAt(0).toUpperCase()+e.slice(1),io=e=>e instanceof HTMLElement&&e.className.includes("ToolIcon"),Ye=e=>e instanceof HTMLElement&&e.dataset.type==="wysiwyg"||e instanceof HTMLBRElement||e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement,ao=e=>Ye(e)||e instanceof Element&&!!e.closest("label, button"),lo=e=>e instanceof HTMLElement&&e.dataset.type==="wysiwyg"||e instanceof HTMLBRElement||e instanceof HTMLTextAreaElement||e instanceof HTMLInputElement&&(e.type==="text"||e.type==="number"||e.type==="password"),Ve=({fontFamily:e})=>{for(let[t,n]of Object.entries(T))if(n===e)return`${t}${ee(n).map(r=>`, ${r}`).join("")}`;return L},co=({fontSize:e,fontFamily:t})=>`${e}px ${Ve({fontFamily:t})}`,uo=(e,t)=>{let n=0,r=null,s=(...l)=>{r=l,clearTimeout(n),n=window.setTimeout(()=>{r=null,e(...l)},t)};return s.flush=()=>{if(clearTimeout(n),r){let l=r;r=null,e(...l)}},s.cancel=()=>{r=null,clearTimeout(n)},s},po=(e,t)=>{let n=null,r=null,s=null,l=o=>{n=window.requestAnimationFrame(()=>{n=null,e(...o),r=null,s&&(r=s,s=null,l(r))})},i=(...o)=>{if(D()){e(...o);return}r=o,n===null?l(r):t?.trailing&&(s=o)};return i.flush=()=>{n!==null&&(cancelAnimationFrame(n),n=null),r&&(e(...s||r),r=s=null)},i.cancel=()=>{r=s=null,n!==null&&(cancelAnimationFrame(n),n=null)},i},Te=e=>1-Math.pow(1-e,4),de=(e,t,n)=>(t-e)*Te(n)+e,fo=({fromValues:e,toValues:t,onStep:n,duration:r=250,interpolateValue:s,onStart:l,onEnd:i,onCancel:o})=>{let a=!1,p=0,m;function O(N){if(a)return;m===void 0&&(m=N,l?.());let b=Math.min(N-m,r),_=Te(b/r),A={};if(Object.keys(e).forEach(g=>{let h=g,k=(t[h]-e[h])*_+e[h];A[h]=k}),n(A),b<r){let g=b/r,h={};Object.keys(e).forEach(k=>{let R=k,H=e[R],K=t[R],v;v=s?s(H,K,g,R):de(H,K,g),v==null&&(v=de(H,K,g)),h[R]=v}),n(h),p=window.requestAnimationFrame(O)}else n(t),i?.()}return p=window.requestAnimationFrame(O),()=>{o?.(),a=!0,window.cancelAnimationFrame(p)}},To=(e,t)=>{if(!e.length||t<1)return[];let n=0,r=0,s=Array(Math.ceil(e.length/t));for(;n<e.length;)s[r++]=e.slice(n,n+=t);return s},mo=e=>{let t=window.getSelection();if(t){let n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}},Eo=()=>{let e=window.getSelection();e&&e.removeAllRanges()},xo=(e,t)=>Math.abs(e-t),bo=(e,t)=>t.type==="custom"?{...e.activeTool,type:"custom",customType:t.customType,locked:t.locked??e.activeTool.locked}:{...e.activeTool,lastActiveTool:t.lastActiveToolBeforeEraser===void 0?e.activeTool.lastActiveTool:t.lastActiveToolBeforeEraser,type:t.type,customType:null,locked:t.locked??e.activeTool.locked,fromSelection:t.fromSelection??!1},_o=()=>document.fullscreenElement?.nodeName==="HTML",Ao=()=>document.documentElement.requestFullscreen(),ho=()=>document.exitFullscreen(),yo=e=>(e=e.replace(/\bAlt\b/i,"Alt").replace(/\bShift\b/i,"Shift").replace(/\b(Enter|Return)\b/i,"Enter"),w?e.replace(/\bCtrlOrCmd\b/gi,"Cmd").replace(/\bAlt\b/i,"Option"):e.replace(/\bCtrlOrCmd\b/gi,"Ctrl")),go=({clientX:e,clientY:t},{zoom:n,offsetLeft:r,offsetTop:s,scrollX:l,scrollY:i})=>{let o=(e-r)/n.value-l,a=(t-s)/n.value-i;return{x:o,y:a}},Lo=({sceneX:e,sceneY:t},{zoom:n,offsetLeft:r,offsetTop:s,scrollX:l,scrollY:i})=>{let o=(e+l)*n.value+r,a=(t+i)*n.value+s;return{x:o,y:a}},So=e=>getComputedStyle(document.documentElement).getPropertyValue(`--${e}`),Xe="A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u0300-\u0590\u0800-\u1FFF\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF",$e="\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC",ze=new RegExp(`^[^${Xe}]*[${$e}]`),Oo=e=>ze.test(e),Ro=e=>{let[t,n]=e;return{x:t,y:n}},vo=e=>{if(e?.name==="AbortError"){console.warn(e);return}throw e},Co=(e,t,n=0)=>{n<0&&(n=e.length+n),n=Math.min(e.length,Math.max(n,0));let r=n-1;for(;++r<e.length;)if(t(e[r],r,e))return r;return-1},Fo=(e,t,n=e.length-1)=>{n<0&&(n=e.length+n),n=Math.min(e.length-1,Math.max(n,0));let r=n+1;for(;--r>-1;)if(t(e[r],r,e))return r;return-1},wo=(e,t)=>{for(let n=0;n<e.length;n++){let r=t(e[n],n);if(r!=null)return r}},je=e=>{let t=e.length===5&&e.substr(4,1)==="0",n=e.length===9&&e.substr(7,2)==="00";return t||n||e===u.transparent},Io=e=>e.fillStyle!=="solid"||je(e.backgroundColor),oe=()=>{let e,t,n=new Promise((r,s)=>{e=r,t=s});return n.resolve=e,n.reject=t,n},Mo=(e,t)=>{let n=[{value:1,symbol:"b"},{value:1e3,symbol:"k"},{value:1e6,symbol:"M"},{value:1e9,symbol:"G"}],r=/\.0+$|(\.[0-9]*[1-9])0+$/,s;for(s=n.length-1;s>0&&!(e>=n[s].value);s--);return(e/n[s].value).toFixed(t).replace(r,"$1")+n[s].symbol},Po=()=>document.querySelector('meta[name="version"]')?.content||te,Do=()=>{let t=document.createElement("canvas").getContext("2d");if(!t)return!1;let n=12;return t.fillStyle="#f00",t.textBaseline="top",t.font="32px Arial",t.fillText("\u{1F600}",0,0),t.getImageData(n,n,1,1).data[0]!==0},Uo=e=>{let t=e.parentElement;for(;t;){if(t===document.body)return document;let{overflowY:n}=window.getComputedStyle(t);if(t.scrollHeight>t.clientHeight&&(n==="auto"||n==="scroll"||n==="overlay"))return t;t=t.parentElement}return document},No=e=>{let t=e.parentElement;for(;t;){if(t.tabIndex>-1){t.focus();return}t=t.parentElement}},ko=e=>{e.preventDefault(),e.returnValue=""},Ho=e=>Array.from(e).map(t=>`0${t.toString(16)}`.slice(-2)).join(""),Ko=()=>D()?1:Date.now(),Bo=e=>e instanceof Map?e:e.reduce((t,n)=>(t.set(typeof n=="string"?n:n.id,n),t),new Map),Go=e=>e.reduce((t,n,r)=>(t.set(n.id,[n,r]),t),new Map),Wo=(e,t)=>e.reduce((n,r,s)=>(n[t?t(r):s]=r,n),{}),Yo=e=>e.reduce((t,n,r)=>{let s={...n,prev:null,next:null};if(r!==0){let l=t[r-1];if(s.prev=l,l.next=s,r===e.length-1){let i=t[0];s.next=i,i.prev=s}}return t.push(s),t},[]),Ze=e=>Array.isArray(e)?e:e.values(),Vo=e=>Array.isArray(e)?e:Array.from(Ze(e)),D=()=>f.MODE===I.TEST,Xo=()=>f.MODE===I.DEVELOPMENT,$o=()=>f.MODE===I.PRODUCTION,zo=()=>typeof process<"u"&&!0,jo=(e,t)=>new CustomEvent(e,{detail:{nativeEvent:t},cancelable:!0}),Zo=(e,t)=>{let n=!1;for(let r in t){let s=t[r];if(typeof s<"u"){if(e[r]===s&&(typeof s!="object"||s===null))continue;n=!0}}return n?{...e,...t}:e},qo=e=>{let t=typeof e;return e==null||t!=="object"&&t!=="function"},qe=()=>{try{return window.self===window.top?"top":"iframe"}catch{return"iframe"}},Qo=()=>qe()==="iframe",Jo=e=>!!e&&typeof e=="object"&&"then"in e&&"catch"in e&&"finally"in e,es=e=>{let t=e?.querySelectorAll("button, a, input, select, textarea, div[tabindex], label[tabindex]");return t?Array.from(t).filter(n=>n.tabIndex>-1&&!n.disabled):[]},fe=(e,t)=>Array.isArray(e)&&Array.isArray(t)&&e.length===0&&t.length===0?!0:e===t,Qe=(e,t,n,r=!1)=>{let s=Object.keys(e),l=Object.keys(t);if(s.length!==l.length)return r&&console.warn("%cisShallowEqual: objects don't have same properties ->","color: #8B4000",e,t),!1;if(n&&Array.isArray(n)){for(let i of n)if(!(e[i]===t[i]||fe(e[i],t[i])))return r&&console.warn(`%cisShallowEqual: ${i} not equal ->`,"color: #8B4000",e[i],t[i]),!1;return!0}return s.every(i=>{let o=n?.[i],a=o?o(e[i],t[i]):e[i]===t[i]||fe(e[i],t[i]);return!a&&r&&console.warn(`%cisShallowEqual: ${i} not equal ->`,"color: #8B4000",e[i],t[i]),a})},ts=(e,t,{checkForDefaultPrevented:n=!0}={})=>function(s){if(e?.(s),!n||!s?.defaultPrevented)return t?.(s)},ns=(e,t,n)=>{if(!t)return e;if(n)return console.error(t),e;throw new Error(t)};function rs(e,t){if(!e)throw new Error(t)}var os=e=>{let t,n,r=function(s){let l=Object.entries(s);if(t){let o=!0;for(let[a,p]of l)if(t.get(a)!==p){o=!1;break}if(o)return n}let i=e(s);return t=new Map(l),n=i,i};return r.clear=()=>{t=void 0,n=void 0},r},ss=(e,t)=>e instanceof Set||e instanceof Map?e.has(t):"includes"in e?e.includes(t):e.hasOwnProperty(t),is=e=>JSON.parse(JSON.stringify(e)),as=(e,t)=>Qe(e,t)?e:t;function ls(e,t,n,r){return e?(e?.addEventListener?.(t,n,r),()=>{e?.removeEventListener?.(t,n,r)}):()=>{}}function cs(e,t=!0){let n=e.length;if(n<4)return"";let r=e[0],s=e[1],l=e[2],i=`M${r[0].toFixed(2)},${r[1].toFixed(2)} Q${s[0].toFixed(2)},${s[1].toFixed(2)} ${P(s[0],l[0]).toFixed(2)},${P(s[1],l[1]).toFixed(2)} T`;for(let o=2,a=n-1;o<a;o++)r=e[o],s=e[o+1],i+=`${P(r[0],s[0]).toFixed(2)},${P(r[1],s[1]).toFixed(2)} `;return t&&(i+="Z"),i}var us=e=>e.replace(/\r?\n|\r/g,`
4
- `),ps=e=>e,se=async(e,...t)=>new Promise(n=>{n(e(...t))}),ds=(...e)=>Math.max(...e.map(t=>t?1:0))>0,fs=e=>{try{return JSON.parse(e)}catch{return null}},me=e=>e.replace(/"/g,"&quot;"),Ts=e=>Array.isArray(e)?e:[e],Je=e=>Array.isArray(e),et=e=>Je(e)?e.length:e instanceof Map||e instanceof Set?e.size:Object.keys(e).length,ms=(e,t)=>{if(et(e)===0)return null;let n=t||(s=>s),r=null;for(let s of e){let l=n(s);if((r===null||r===l)&&l!=null)r=l;else return null}return r};var Ee=new S(Date.now()),xe=0,hs=()=>Math.floor(Ee.next()*2**31),ys=e=>{Ee=new S(e),xe=0},gs=()=>D()?`id${xe++}`:pe();c();var _e=X(be(),1);var ut=e=>(e=e.trim(),e&&(0,_e.sanitizeUrl)(me(e))),Cs=e=>!!(e?.includes(location.origin)||e?.startsWith("/")),Fs=e=>{if(e=ut(e),e.startsWith("/"))return`${location.origin}${e}`;try{new URL(e)}catch{return"about:blank"}return e};c();var Ae=class{subscribers=[];on(...t){let n=t.flat().filter(r=>typeof r=="function");return this.subscribers.push(...n),()=>this.off(n)}once(...t){let n=t.flat().filter(s=>typeof s=="function");n.push(()=>r());let r=this.on(...n);return r}off(...t){let n=t.flat();this.subscribers=this.subscribers.filter(r=>!n.includes(r))}trigger(...t){for(let n of this.subscribers)n(...t);return this}clear(){this.subscribers=[]}};export{Cn as ACTIVE_THRESHOLD,Tn as ALLOWED_PASTE_MIME_TYPES,Ht as APP_NAME,jn as ARROW_LABEL_FONT_SIZE_TO_MIN_WIDTH_RATIO,zn as ARROW_LABEL_WIDTH_FRACTION,dr as ARROW_TYPE,$n as BOUND_TEXT_PADDING,$ as BinaryHeap,pn as CANVAS_ONLY_ACTIONS,ht as CANVAS_PALETTE_SHADE_INDEXES,or as CANVAS_SEARCH_TAB,q as CJK_HAND_DRAWN_FALLBACK_FONT,Qt as CLASSES,ie as CODES,_t as COLORS_PER_ROW,cn as COLOR_CHARCOAL_BLACK,xt as COLOR_OUTLINE_CONTRAST_THRESHOLD,u as COLOR_PALETTE,un as COLOR_VOICE_CALL,ln as COLOR_WHITE,zt as CURSOR_TYPE,er as DEFAULT_ADAPTIVE_RADIUS,Lt as DEFAULT_CANVAS_BACKGROUND_PICKS,At as DEFAULT_CHART_COLOR_INDEX,an as DEFAULT_COLLISION_THRESHOLD,F as DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX,Ot as DEFAULT_ELEMENT_BACKGROUND_COLOR_PALETTE,gt as DEFAULT_ELEMENT_BACKGROUND_PICKS,rr as DEFAULT_ELEMENT_PROPS,C as DEFAULT_ELEMENT_STROKE_COLOR_INDEX,St as DEFAULT_ELEMENT_STROKE_COLOR_PALETTE,yt as DEFAULT_ELEMENT_STROKE_PICKS,Kn as DEFAULT_EXPORT_PADDING,cr as DEFAULT_FILENAME,rn as DEFAULT_FONT_FAMILY,nn as DEFAULT_FONT_SIZE,dn as DEFAULT_GRID_SIZE,fn as DEFAULT_GRID_STEP,$t as DEFAULT_LASER_COLOR,Bn as DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,Jn as DEFAULT_PROPORTIONAL_RADIUS,fr as DEFAULT_REDUCED_GLOBAL_ALPHA,sr as DEFAULT_SIDEBAR,on as DEFAULT_TEXT_ALIGN,De as DEFAULT_TRANSFORM_HANDLE_SPACING,Mn as DEFAULT_UI_OPTIONS,te as DEFAULT_VERSION,sn as DEFAULT_VERTICAL_ALIGN,Bt as DRAGGING_THRESHOLD,lr as EDITOR_LS_KEYS,E as ELEMENTS_PALETTE_SHADE_INDEXES,Tr as ELEMENT_LINK_KEY,Qn as ELEMENT_READY_TO_ERASE_OPACITY,Wt as ELEMENT_SHIFT_TRANSLATE_AMOUNT,Yt as ELEMENT_TRANSLATE_AMOUNT,Vn as ENCRYPTION_KEY_BITS,I as ENV,Ne as EPSILON,Ie as EVENT,En as EXPORT_DATA_TYPES,mn as EXPORT_IMAGE_TYPES,Hn as EXPORT_SCALES,Ae as Emitter,T as FONT_FAMILY,B as FONT_FAMILY_FALLBACKS,Me as FONT_FAMILY_GENERIC_FALLBACKS,M as FONT_METADATA,en as FRAME_STYLE,Ar as GOOGLE_FONTS_RANGES,Rn as HYPERLINK_TOOLTIP_DELAY,vn as IDLE_THRESHOLD,ne as IMAGE_MIME_TYPES,bn as IMAGE_RENDER_TIMEOUT,y as KEYS,Be as KeyCodeMap,ir as LIBRARY_DISABLED_TYPES,He as LIBRARY_SIDEBAR_TAB,Gt as LINE_CONFIRM_THRESHOLD,Er as LINE_POLYGON_POINT_MERGE_DISTANCE,hr as LOCAL_FONT_PROTOCOL,Gn as MAX_ALLOWED_FILE_BYTES,bt as MAX_CUSTOM_COLORS_USED_IN_CANVAS,kn as MAX_DECIMALS_FOR_SVG_EXPORT,On as MAX_ZOOM,Z as MIME_TYPES,tn as MIN_FONT_SIZE,pr as MIN_WIDTH_OR_HEIGHT,Sn as MIN_ZOOM,J as MONOSPACE_GENERIC_FONT,Un as MQ_MAX_HEIGHT_LANDSCAPE,Dn as MQ_MAX_WIDTH_LANDSCAPE,Pn as MQ_MAX_WIDTH_PORTRAIT,Nn as MQ_RIGHT_SIDEBAR_MIN_WIDTH,mr as ORIG_ID,jt as POINTER_BUTTON,Zt as POINTER_EVENTS,ce as PromisePool,re as Queue,ke as ROUGHNESS,tr as ROUNDNESS,Q as SANS_SERIF_GENERIC_FONT,gn as SCROLL_TIMEOUT,Xt as SHIFT_LOCKING_ANGLE,Ue as SIDE_RESIZING_THRESHOLD,ur as STATS_PANELS,nr as STROKE_WIDTH,Yn as SVG_DOCUMENT_PREAMBLE,Wn as SVG_NS,_n as TAP_TWICE_TIMEOUT,qn as TEXT_ALIGN,Kt as TEXT_AUTOWRAP_THRESHOLD,Vt as TEXT_TO_CENTER_SNAP_THRESHOLD,Jt as THEME,Fn as THEME_FILTER,hn as TITLE_TIMEOUT,ar as TOOL_TYPE,An as TOUCH_CTX_MENU_TIMEOUT,In as URL_HASH_KEYS,wn as URL_QUERY_KEYS,Ke as UserIdleState,Xn as VERSIONS,yn as VERSION_TIMEOUT,Zn as VERTICAL_ALIGN,L as WINDOWS_EMOJI_FALLBACK_FONT,qt as YOUTUBE_STATES,Ln as ZOOM_STEP,ls as addEventListener,Ao as allowFullScreen,Yo as arrayToList,Bo as arrayToMap,Go as arrayToMapWithIndex,Wo as arrayToObject,ns as assertNever,Ho as bytesToHexString,so as capitalizeString,Ts as castArray,To as chunk,is as cloneJSON,ts as composeEventHandlers,uo as debounce,xo as distance,Te as easeOut,fo as easeToValuesRAF,me as escapeDoubleQuotes,ho as exitFullScreen,Co as findIndex,Fo as findLastIndex,No as focusNearestParent,Rt as getAllColorsSpecificShade,oo as getDateTime,xn as getExportSource,ee as getFontFamilyFallbacks,Ve as getFontFamilyString,co as getFontString,qe as getFrame,Pe as getGenericFontFamilyFallback,So as getGlobalCSSVariable,Kr as getGridPoint,gr as getLineHeight,Uo as getNearestScrollableContainer,yo as getShortcutKey,kr as getSizeFromPoints,x as getSpecificColorShades,cs as getSvgPathFromStroke,Ko as getUpdatedTimestamp,Po as getVersion,yr as getVerticalOffset,rs as invariant,Mt as isAndroid,ds as isAnyTrue,wr as isArrowKey,Io as isBindingFallthroughEnabled,Nt as isBrave,we as isChrome,w as isDarwin,Xo as isDevEnv,Pt as isFirefox,_o as isFullScreen,Ut as isIOS,Ye as isInputLike,ao as isInteractive,Ge as isLatinChar,Cs as isLocalLink,ss as isMemberOf,qo as isPrimitive,$o as isProdEnv,Jo as isPromiseLike,Oo as isRTL,Je as isReadonlyArray,Qo as isRunningInIframe,Dt as isSafari,zo as isServerEnv,Qe as isShallowEqual,D as isTestEnv,io as isToolIcon,je as isTransparent,It as isWindows,lo as isWritableElement,wo as mapFind,Fr as matchKey,os as memoize,vo as muteFSAbortError,Mo as nFormatter,us as normalizeEOL,ut as normalizeLink,ko as preventUnload,se as promiseTry,es as queryFocusableElements,gs as randomId,hs as randomInteger,ms as reduceToCommonValue,Eo as removeSelection,Hr as rescalePoints,ys as reseed,oe as resolvablePromise,vt as rgbToHex,fs as safelyParseJSON,Lo as sceneCoordsToViewportCoords,mo as selectNode,ro as setDateTimeForTests,Mr as shouldMaintainAspectRatio,Ir as shouldResizeFromCenter,Pr as shouldRotateWithDiscreteAngle,et as sizeOf,Do as supportsEmoji,kt as supportsResizeObserver,po as throttleRAF,Vo as toArray,ps as toBrandedType,Ze as toIterable,Fs as toValidURL,Ro as tupleToCoors,bo as updateActiveTool,Zo as updateObject,as as updateStable,go as viewportCoordsToSceneCoords,jo as wrapEvent};
3
+ `,Jn=128,eo={excalidraw:2,excalidrawLibrary:2},to=5,no=.7,oo=11,ro={TOP:"top",MIDDLE:"middle",BOTTOM:"bottom"},so={LEFT:"left",CENTER:"center",RIGHT:"right"},ao=20,io=.25,lo=32,co={LEGACY:1,PROPORTIONAL_RADIUS:2,ADAPTIVE_RADIUS:3},$e={architect:0,artist:1,cartoonist:2},uo={thin:1,bold:2,extraBold:4},po={strokeColor:u.black,backgroundColor:u.transparent,fillStyle:"solid",strokeWidth:2,strokeStyle:"solid",roughness:$e.artist,opacity:100,locked:!1},je="library",fo="search",mo={name:"default",defaultTab:je},To=new Set(["iframe","embeddable","image"]),Eo={selection:"selection",lasso:"lasso",rectangle:"rectangle",diamond:"diamond",ellipse:"ellipse",arrow:"arrow",line:"line",freedraw:"freedraw",text:"text",image:"image",eraser:"eraser",hand:"hand",frame:"frame",magicframe:"magicframe",embeddable:"embeddable",laser:"laser"},xo={OAI_API_KEY:"excalidraw-oai-api-key",MERMAID_TO_EXCALIDRAW:"mermaid-to-excalidraw",PUBLISH_LIBRARY:"publish-library-data"},bo="Untitled",_o={generalStats:1,elementProperties:2},Ao=1,ho={sharp:"sharp",round:"round",elbow:"elbow"},yo=.3,go="element",So=Symbol.for("__test__originalId__"),Qe=(o=>(o.ACTIVE="active",o.AWAY="away",o.IDLE="idle",o))(Qe||{}),Lo=20,Oo=35,Ro=700,vo={background:"var(--mobile-action-button-bg)"};c();var D={[m.Excalifont]:{metrics:{unitsPerEm:1e3,ascender:886,descender:-374,lineHeight:1.25}},[m.Nunito]:{metrics:{unitsPerEm:1e3,ascender:1011,descender:-353,lineHeight:1.25}},[m["Lilita One"]]:{metrics:{unitsPerEm:1e3,ascender:923,descender:-220,lineHeight:1.15}},[m["Comic Shanns"]]:{metrics:{unitsPerEm:1e3,ascender:750,descender:-250,lineHeight:1.25}},[m.Virgil]:{metrics:{unitsPerEm:1e3,ascender:886,descender:-374,lineHeight:1.25},deprecated:!0},[m.Helvetica]:{metrics:{unitsPerEm:2048,ascender:1577,descender:-471,lineHeight:1.15},deprecated:!0,local:!0},[m.Cascadia]:{metrics:{unitsPerEm:2048,ascender:1900,descender:-480,lineHeight:1.2},deprecated:!0},[m["Liberation Sans"]]:{metrics:{unitsPerEm:2048,ascender:1854,descender:-434,lineHeight:1.15},private:!0},[m.Assistant]:{metrics:{unitsPerEm:2048,ascender:1021,descender:-287,lineHeight:1.25},private:!0},[W.Xiaolai]:{metrics:{unitsPerEm:1e3,ascender:880,descender:-144,lineHeight:1.25},fallback:!0},[W["Segoe UI Emoji"]]:{metrics:{unitsPerEm:1e3,ascender:886,descender:-374,lineHeight:1.25},local:!0,fallback:!0}},Io={LATIN:"U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD",LATIN_EXT:"U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF",CYRILIC_EXT:"U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F",CYRILIC:"U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116",VIETNAMESE:"U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB"},Po="local:",Co=(e,t,n)=>{let{unitsPerEm:o,ascender:r,descender:l}=D[e]?.metrics||D[m.Excalifont].metrics,a=t/o,s=(n-a*r+a*l)/2;return a*r+s},Do=e=>{let{lineHeight:t}=D[e]?.metrics||D[m.Excalifont].metrics;return t};c();var ie=class{jobs=[];running=!1;tick(){if(this.running)return;let t=this.jobs.shift();t?(this.running=!0,t.promise.resolve(ce(t.jobFactory,...t.args).finally(()=>{this.running=!1,this.tick()}))):this.running=!1}push(t,...n){let o=le();return this.jobs.push({jobFactory:t,promise:o,args:n}),this.tick(),o}};c();c();var ue="excalidraw.desktopUIMode",Bo=599,Ko=1e3,Wo=500,Yo=600,Xo=1400,zo=1440,Vo=1229,pe=/Mac|iPod|iPhone|iPad/.test(navigator.platform),$o=/^Win/.test(navigator.platform),de=/\b(android)\b/i.test(navigator.userAgent),jo=typeof window<"u"&&"netscape"in window&&navigator.userAgent.indexOf("rv:")>1&&navigator.userAgent.indexOf("Gecko")>1,Ze=navigator.userAgent.indexOf("Chrome")!==-1,Qo=!Ze&&navigator.userAgent.indexOf("Safari")!==-1,fe=/iPad|iPhone/i.test(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document,Zo=()=>navigator.brave?.isBrave?.name==="isBrave",qe=(e,t)=>e<=599||t<500&&e<1e3,Je=(e,t)=>{let n=Math.min(e,t),o=Math.max(e,t);return n>=600&&o<=1400},et=()=>{let e=navigator.userAgent||"",t=navigator.platform||"",n=navigator.userAgentData;if(n){let r=(n.platform||"").toLowerCase(),l=r==="windows"||r==="macos"||r==="linux"||r==="chrome os";if(n.mobile===!0)return!0;if(n.mobile===!1&&r==="android")return matchMedia?.("(hover: none)").matches&&matchMedia?.("(pointer: coarse)").matches;if(l)return!1}if(fe)return!0;if(de){let r=/Mobile/i.test(e);if(r||!r)return matchMedia?.("(hover: none)").matches&&matchMedia?.("(pointer: coarse)").matches}return/Win|Linux|CrOS|Mac/.test(t)||/Windows NT|X11|CrOS|Macintosh/.test(e),!1},qo=(e,t)=>qe(e,t)?"phone":Je(e,t)?"tablet":"desktop",Jo=e=>e.formFactor==="phone"?"mobile":e.formFactor==="tablet"?"compact":e.desktopUIMode,er=e=>{let t=e??"",n="unknown";return fe?n="ios":de?n="android":t&&(n="other"),{isMobileDevice:et(),platform:n}},tr=()=>{if(typeof window>"u")return null;try{let e=window.localStorage.getItem(ue);if(e==="compact"||e==="full")return e}catch{}return null},tt=e=>{if(!(typeof window>"u"))try{window.localStorage.setItem(ue,e)}catch{}},nr=e=>{if(!(e!=="compact"&&e!=="full"))return tt(e),e};var me={EQUAL:"Equal",MINUS:"Minus",NUM_ADD:"NumpadAdd",NUM_SUBTRACT:"NumpadSubtract",NUM_ZERO:"Numpad0",BRACKET_RIGHT:"BracketRight",BRACKET_LEFT:"BracketLeft",ONE:"Digit1",TWO:"Digit2",THREE:"Digit3",NINE:"Digit9",QUOTE:"Quote",ZERO:"Digit0",SLASH:"Slash",C:"KeyC",D:"KeyD",H:"KeyH",V:"KeyV",Z:"KeyZ",Y:"KeyY",R:"KeyR",S:"KeyS"},g={ARROW_DOWN:"ArrowDown",ARROW_LEFT:"ArrowLeft",ARROW_RIGHT:"ArrowRight",ARROW_UP:"ArrowUp",PAGE_UP:"PageUp",PAGE_DOWN:"PageDown",BACKSPACE:"Backspace",ALT:"Alt",CTRL_OR_CMD:pe?"metaKey":"ctrlKey",DELETE:"Delete",ENTER:"Enter",ESCAPE:"Escape",QUESTION_MARK:"?",SPACE:" ",TAB:"Tab",CHEVRON_LEFT:"<",CHEVRON_RIGHT:">",PERIOD:".",COMMA:",",SUBTRACT:"-",SLASH:"/",A:"a",C:"c",D:"d",E:"e",F:"f",G:"g",H:"h",I:"i",L:"l",O:"o",P:"p",Q:"q",R:"r",S:"s",T:"t",V:"v",X:"x",Y:"y",Z:"z",K:"k",W:"w",0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9"},nt=new Map([[g.Z,me.Z],[g.Y,me.Y]]),ot=e=>/^[a-z]$/.test(e.toLowerCase()),ar=(e,t)=>{if(t===e.key.toLowerCase())return!0;let n=nt.get(t);return!!(n&&!ot(e.key)&&e.code===n)},ir=e=>e===g.ARROW_LEFT||e===g.ARROW_RIGHT||e===g.ARROW_DOWN||e===g.ARROW_UP,lr=e=>e.altKey,cr=e=>e.shiftKey,ur=e=>e.shiftKey;c();import{pointFromPair as rt}from"@excalidraw/math";var mr=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return{width:Math.max(...t)-Math.min(...t),height:Math.max(...n)-Math.min(...n)}},Tr=(e,t,n,o)=>{let r=n.map(_=>_[e]),l=Math.max(...r),a=Math.min(...r),s=l-a,i=s===0?1:t/s,p=1/0,E=n.map(_=>{let A=_[e]*i,h=[..._];return h[e]=A,A<p&&(p=A),h});if(!o||E.length===2)return E;let F=a-p;return E.map(_=>rt(_.map((A,h)=>h===e?A+F:A)))},Er=(e,t,n)=>n?[Math.round(e/n)*n,Math.round(t/n)*n]:[e,t];c();var be=Q(Ee(),1),xe=class{pool;entries={};constructor(t,n){this.pool=new be.default(t,n)}all(){let t=n=>{if(n.data.result){let[o,r]=n.data.result;this.entries[o]=r}};return this.pool.addEventListener("fulfilled",t),this.pool.start().then(()=>(setTimeout(()=>{this.pool.removeEventListener("fulfilled",t)}),Object.values(this.entries)))}};c();c();c();var _e=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((t,n)=>(n&=63,n<36?t+=n.toString(36):n<62?t+=(n-26).toString(36).toUpperCase():n>62?t+="-":t+="_",t),"");c();var v=class{constructor(t){this.seed=t}next(){return this.seed?(2**31-1&(this.seed=Math.imul(48271,this.seed)))/2**31:Math.random()}};c();import{average as U}from"@excalidraw/math";var X=null,Pr=e=>{X=e},Cr=()=>{if(X)return X;let e=new Date,t=e.getFullYear(),n=`${e.getMonth()+1}`.padStart(2,"0"),o=`${e.getDate()}`.padStart(2,"0"),r=`${e.getHours()}`.padStart(2,"0"),l=`${e.getMinutes()}`.padStart(2,"0");return`${t}-${n}-${o}-${r}${l}`},Dr=e=>e.charAt(0).toUpperCase()+e.slice(1),Ur=e=>e instanceof HTMLElement&&e.className.includes("ToolIcon"),st=e=>e instanceof HTMLElement&&e.dataset.type==="wysiwyg"||e instanceof HTMLBRElement||e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement,Nr=e=>st(e)||e instanceof Element&&!!e.closest("label, button"),kr=e=>e instanceof HTMLElement&&e.dataset.type==="wysiwyg"||e instanceof HTMLBRElement||e instanceof HTMLTextAreaElement||e instanceof HTMLInputElement&&(e.type==="text"||e.type==="number"||e.type==="password"||e.type==="search"),at=({fontFamily:e})=>{for(let[t,n]of Object.entries(m))if(n===e)return`${t}${re(n).map(o=>`, ${o}`).join("")}`;return R},Hr=({fontSize:e,fontFamily:t})=>`${e}px ${at({fontFamily:t})}`,Gr=async e=>{requestAnimationFrame(()=>requestAnimationFrame(e))},Br=(e,t)=>{let n=0,o=null,r=(...l)=>{o=l,clearTimeout(n),n=window.setTimeout(()=>{o=null,e(...l)},t)};return r.flush=()=>{if(clearTimeout(n),o){let l=o;o=null,e(...l)}},r.cancel=()=>{o=null,clearTimeout(n)},r},Kr=(e,t)=>{let n=null,o=null,r=null,l=s=>{n=window.requestAnimationFrame(()=>{n=null,e(...s),o=null,r&&(o=r,r=null,l(o))})},a=(...s)=>{if(N()){e(...s);return}o=s,n===null?l(o):t?.trailing&&(r=s)};return a.flush=()=>{n!==null&&(cancelAnimationFrame(n),n=null),o&&(e(...r||o),o=r=null)},a.cancel=()=>{o=r=null,n!==null&&(cancelAnimationFrame(n),n=null)},a},ye=e=>1-Math.pow(1-e,4),Ae=(e,t,n)=>(t-e)*ye(n)+e,Wr=({fromValues:e,toValues:t,onStep:n,duration:o=250,interpolateValue:r,onStart:l,onEnd:a,onCancel:s})=>{let i=!1,p=0,E;function F(H){if(i)return;E===void 0&&(E=H,l?.());let _=Math.min(H-E,o),A=ye(_/o),h={};if(Object.keys(e).forEach(O=>{let y=O,G=(t[y]-e[y])*A+e[y];h[y]=G}),n(h),_<o){let O=_/o,y={};Object.keys(e).forEach(G=>{let M=G,B=e[M],K=t[M],w;w=r?r(B,K,O,M):Ae(B,K,O),w==null&&(w=Ae(B,K,O)),y[M]=w}),n(y),p=window.requestAnimationFrame(F)}else n(t),a?.()}return p=window.requestAnimationFrame(F),()=>{s?.(),i=!0,window.cancelAnimationFrame(p)}},Yr=(e,t)=>{if(!e.length||t<1)return[];let n=0,o=0,r=Array(Math.ceil(e.length/t));for(;n<e.length;)r[o++]=e.slice(n,n+=t);return r},Xr=e=>{let t=window.getSelection();if(t){let n=document.createRange();n.selectNodeContents(e),t.removeAllRanges(),t.addRange(n)}},zr=()=>{let e=window.getSelection();e&&e.removeAllRanges()},Vr=(e,t)=>Math.abs(e-t),$r=e=>e==="selection"||e==="lasso",jr=(e,t)=>t.type==="custom"?{...e.activeTool,type:"custom",customType:t.customType,locked:t.locked??e.activeTool.locked}:{...e.activeTool,lastActiveTool:t.lastActiveToolBeforeEraser===void 0?e.activeTool.lastActiveTool:t.lastActiveToolBeforeEraser,type:t.type,customType:null,locked:t.locked??e.activeTool.locked,fromSelection:t.fromSelection??!1},Qr=()=>document.fullscreenElement?.nodeName==="HTML",Zr=()=>document.documentElement.requestFullscreen(),qr=()=>document.exitFullscreen(),Jr=({clientX:e,clientY:t},{zoom:n,offsetLeft:o,offsetTop:r,scrollX:l,scrollY:a})=>{let s=(e-o)/n.value-l,i=(t-r)/n.value-a;return{x:s,y:i}},es=({sceneX:e,sceneY:t},{zoom:n,offsetLeft:o,offsetTop:r,scrollX:l,scrollY:a})=>{let s=(e+l)*n.value+o,i=(t+a)*n.value+r;return{x:s,y:i}},ts=e=>getComputedStyle(document.documentElement).getPropertyValue(`--${e}`),it="A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\u02B8\u0300-\u0590\u0800-\u1FFF\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF",lt="\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC",ct=new RegExp(`^[^${it}]*[${lt}]`),ns=e=>ct.test(e),os=e=>{let[t,n]=e;return{x:t,y:n}},rs=e=>{if(e?.name==="AbortError"){console.warn(e);return}throw e},ss=(e,t,n=0)=>{n<0&&(n=e.length+n),n=Math.min(e.length,Math.max(n,0));let o=n-1;for(;++o<e.length;)if(t(e[o],o,e))return o;return-1},as=(e,t,n=e.length-1)=>{n<0&&(n=e.length+n),n=Math.min(e.length-1,Math.max(n,0));let o=n+1;for(;--o>-1;)if(t(e[o],o,e))return o;return-1},is=(e,t)=>{for(let n=0;n<e.length;n++){let o=t(e[n],n);if(o!=null)return o}},ls=e=>{let t=e.length===5&&e.substr(4,1)==="0",n=e.length===9&&e.substr(7,2)==="00";return t||n||e===u.transparent},le=()=>{let e,t,n=new Promise((o,r)=>{e=o,t=r});return n.resolve=e,n.reject=t,n},cs=(e,t)=>{let n=[{value:1,symbol:"b"},{value:1e3,symbol:"k"},{value:1e6,symbol:"M"},{value:1e9,symbol:"G"}],o=/\.0+$|(\.[0-9]*[1-9])0+$/,r;for(r=n.length-1;r>0&&!(e>=n[r].value);r--);return(e/n[r].value).toFixed(t).replace(o,"$1")+n[r].symbol},us=()=>document.querySelector('meta[name="version"]')?.content||se,ps=()=>{let t=document.createElement("canvas").getContext("2d");if(!t)return!1;let n=12;return t.fillStyle="#f00",t.textBaseline="top",t.font="32px Arial",t.fillText("\u{1F600}",0,0),t.getImageData(n,n,1,1).data[0]!==0},ds=e=>{let t=e.parentElement;for(;t;){if(t===document.body)return document;let{overflowY:n}=window.getComputedStyle(t);if(t.scrollHeight>t.clientHeight&&(n==="auto"||n==="scroll"||n==="overlay"))return t;t=t.parentElement}return document},fs=e=>{let t=e.parentElement;for(;t;){if(t.tabIndex>-1){t.focus();return}t=t.parentElement}},ms=e=>{e.preventDefault(),e.returnValue=""},Ts=e=>Array.from(e).map(t=>`0${t.toString(16)}`.slice(-2)).join(""),Es=()=>N()?1:Date.now(),xs=e=>e instanceof Map?e:e.reduce((t,n)=>(t.set(typeof n=="string"?n:n.id,n),t),new Map),bs=e=>e.reduce((t,n,o)=>(t.set(n.id,[n,o]),t),new Map),_s=(e,t)=>e.reduce((n,o,r)=>(n[t?t(o):r]=o,n),{}),As=e=>e.reduce((t,n,o)=>{let r={...n,prev:null,next:null};if(o!==0){let l=t[o-1];if(r.prev=l,l.next=r,o===e.length-1){let a=t[0];r.next=a,a.prev=r}}return t.push(r),t},[]),ut=e=>Array.isArray(e)?e:e.values(),hs=e=>Array.isArray(e)?e:Array.from(ut(e)),N=()=>f.MODE===C.TEST,ys=()=>f.MODE===C.DEVELOPMENT,gs=()=>f.MODE===C.PRODUCTION,Ss=()=>typeof process<"u"&&!0,Ls=(e,t)=>new CustomEvent(e,{detail:{nativeEvent:t},cancelable:!0}),Os=(e,t)=>{let n=!1;for(let o in t){let r=t[o];if(typeof r<"u"){if(e[o]===r&&(typeof r!="object"||r===null))continue;n=!0}}return n?{...e,...t}:e},Rs=e=>{let t=typeof e;return e==null||t!=="object"&&t!=="function"},pt=()=>{try{return window.self===window.top?"top":"iframe"}catch{return"iframe"}},vs=()=>pt()==="iframe",Fs=e=>!!e&&typeof e=="object"&&"then"in e&&"catch"in e&&"finally"in e,Ms=e=>{let t=e?.querySelectorAll("button, a, input, select, textarea, div[tabindex], label[tabindex]");return t?Array.from(t).filter(n=>n.tabIndex>-1&&!n.disabled):[]},he=(e,t)=>Array.isArray(e)&&Array.isArray(t)&&e.length===0&&t.length===0?!0:e===t,dt=(e,t,n,o=!1)=>{let r=Object.keys(e),l=Object.keys(t);if(r.length!==l.length)return o&&console.warn("%cisShallowEqual: objects don't have same properties ->","color: #8B4000",e,t),!1;if(n&&Array.isArray(n)){for(let a of n)if(!(e[a]===t[a]||he(e[a],t[a])))return o&&console.warn(`%cisShallowEqual: ${a} not equal ->`,"color: #8B4000",e[a],t[a]),!1;return!0}return r.every(a=>{let s=n?.[a],i=s?s(e[a],t[a]):e[a]===t[a]||he(e[a],t[a]);return!i&&o&&console.warn(`%cisShallowEqual: ${a} not equal ->`,"color: #8B4000",e[a],t[a]),i})},ws=(e,t,{checkForDefaultPrevented:n=!0}={})=>function(r){if(e?.(r),!n||!r?.defaultPrevented)return t?.(r)},Is=(e,t,n)=>{if(!t)return e;if(n)return console.error(t),e;throw new Error(t)};function Ps(e,t){if(!e)throw new Error(t)}var Cs=e=>{let t,n,o=function(r){let l=Object.entries(r);if(t){let s=!0;for(let[i,p]of l)if(t.get(i)!==p){s=!1;break}if(s)return n}let a=e(r);return t=new Map(l),n=a,a};return o.clear=()=>{t=void 0,n=void 0},o},Ds=(e,t)=>e instanceof Set||e instanceof Map?e.has(t):"includes"in e?e.includes(t):e.hasOwnProperty(t),Us=e=>JSON.parse(JSON.stringify(e)),Ns=(e,t)=>dt(e,t)?e:t;function ks(e,t,n,o){return e?(e?.addEventListener?.(t,n,o),()=>{e?.removeEventListener?.(t,n,o)}):()=>{}}function Hs(e,t=!0){let n=e.length;if(n<4)return"";let o=e[0],r=e[1],l=e[2],a=`M${o[0].toFixed(2)},${o[1].toFixed(2)} Q${r[0].toFixed(2)},${r[1].toFixed(2)} ${U(r[0],l[0]).toFixed(2)},${U(r[1],l[1]).toFixed(2)} T`;for(let s=2,i=n-1;s<i;s++)o=e[s],r=e[s+1],a+=`${U(o[0],r[0]).toFixed(2)},${U(o[1],r[1]).toFixed(2)} `;return t&&(a+="Z"),a}var Gs=e=>e.replace(/\r?\n|\r/g,`
4
+ `),Bs=e=>e,ce=async(e,...t)=>new Promise(n=>{n(e(...t))}),Ks=(...e)=>Math.max(...e.map(t=>t?1:0))>0,Ws=e=>{try{return JSON.parse(e)}catch{return null}},ge=e=>e.replace(/"/g,"&quot;"),Ys=e=>Array.isArray(e)?e:[e],ft=e=>Array.isArray(e),mt=e=>ft(e)?e.length:e instanceof Map||e instanceof Set?e.size:Object.keys(e).length,Xs=(e,t)=>{if(mt(e)===0)return null;let n=t||(r=>r),o=null;for(let r of e){let l=n(r);if((o===null||o===l)&&l!=null)o=l;else return null}return o},Se="excalidraw-feature-flags",z={COMPLEX_BINDINGS:!1},S=null,zs=e=>{if(!S)try{let t=localStorage.getItem(Se);t&&(S=JSON.parse(t)??z)}catch{}return(S||z)[e]},Vs=(e,t)=>{try{S={...S||z,[e]:t},localStorage.setItem(Se,JSON.stringify(S))}catch(n){console.error("unable to set feature flag",n)}};var Le=new v(Date.now()),Oe=0,Js=()=>Math.floor(Le.next()*2**31),ea=e=>{Le=new v(e),Oe=0},ta=()=>N()?`id${Oe++}`:_e();c();var ve=Q(Re(),1);var St=e=>(e=e.trim(),e&&(0,ve.sanitizeUrl)(ge(e))),ia=e=>!!(e?.includes(location.origin)||e?.startsWith("/")),la=e=>{if(e=St(e),e.startsWith("/"))return`${location.origin}${e}`;try{new URL(e)}catch{return"about:blank"}return e};c();var Fe=class{subscribers=[];on(...t){let n=t.flat().filter(o=>typeof o=="function");return this.subscribers.push(...n),()=>this.off(n)}once(...t){let n=t.flat().filter(r=>typeof r=="function");n.push(()=>o());let o=this.on(...n);return o}off(...t){let n=t.flat();this.subscribers=this.subscribers.filter(o=>!n.includes(o))}trigger(...t){for(let n of this.subscribers)n(...t);return this}clear(){this.subscribers=[]}};c();import{isLineSegment as Lt,lineSegment as L,pointFrom as T}from"@excalidraw/math";import{isBounds as Ot}from"@excalidraw/element";var Ta=(e,t)=>{Me({color:t?.color??"purple",permanent:!!t?.permanent,data:e})},V=(e,t)=>{(Lt(e)?[e]:e).forEach(o=>Me({color:t?.color??"red",data:o,permanent:!!t?.permanent}))},Rt=(e,t)=>{let n=t?.fuzzy?Math.random()*3:0,o=t?.fuzzy?Math.random()*3:0;V(L(T(e[0]+n-10,e[1]+o-10),T(e[0]+n+10,e[1]+o+10)),{color:t?.color??"cyan",permanent:t?.permanent}),V(L(T(e[0]+n-10,e[1]+o+10),T(e[0]+n+10,e[1]+o-10)),{color:t?.color??"cyan",permanent:t?.permanent})},Ea=(e,t)=>{(Ot(e)?[e]:e).forEach(n=>V([L(T(n[0],n[1]),T(n[2],n[1])),L(T(n[2],n[1]),T(n[2],n[3])),L(T(n[2],n[3]),T(n[0],n[3])),L(T(n[0],n[3]),T(n[0],n[1]))],{color:t?.color??"green",permanent:!!t?.permanent}))},xa=({x:e,y:t,points:n},o)=>{n.forEach(r=>Rt(T(e+r[0],t+r[1]),o))},ba=()=>{window.visualDebug?.data.push([])},_a=()=>{window.visualDebug?.data&&(window.visualDebug.data=[])},Me=e=>{window.visualDebug?.data&&window.visualDebug.data.length===0&&(window.visualDebug.data[0]=[]),window.visualDebug?.data&&window.visualDebug.data[window.visualDebug.data.length-1].push(e)};export{Bn as ACTIVE_THRESHOLD,On as ALLOWED_PASTE_MIME_TYPES,Qt as APP_NAME,oo as ARROW_LABEL_FONT_SIZE_TO_MIN_WIDTH_RATIO,no as ARROW_LABEL_WIDTH_FRACTION,ho as ARROW_TYPE,Ro as BIND_MODE_TIMEOUT,to as BOUND_TEXT_PADDING,Z as BinaryHeap,gn as CANVAS_ONLY_ACTIONS,kt as CANVAS_PALETTE_SHADE_INDEXES,fo as CANVAS_SEARCH_TAB,te as CJK_HAND_DRAWN_FALLBACK_FONT,pn as CLASSES,me as CODES,Ut as COLORS_PER_ROW,hn as COLOR_CHARCOAL_BLACK,Ct as COLOR_OUTLINE_CONTRAST_THRESHOLD,u as COLOR_PALETTE,yn as COLOR_VOICE_CALL,An as COLOR_WHITE,an as CURSOR_TYPE,lo as DEFAULT_ADAPTIVE_RADIUS,Bt as DEFAULT_CANVAS_BACKGROUND_PICKS,Nt as DEFAULT_CHART_COLOR_INDEX,_n as DEFAULT_COLLISION_THRESHOLD,P as DEFAULT_ELEMENT_BACKGROUND_COLOR_INDEX,Wt as DEFAULT_ELEMENT_BACKGROUND_COLOR_PALETTE,Gt as DEFAULT_ELEMENT_BACKGROUND_PICKS,po as DEFAULT_ELEMENT_PROPS,I as DEFAULT_ELEMENT_STROKE_COLOR_INDEX,Kt as DEFAULT_ELEMENT_STROKE_COLOR_PALETTE,Ht as DEFAULT_ELEMENT_STROKE_PICKS,$n as DEFAULT_EXPORT_PADDING,bo as DEFAULT_FILENAME,En as DEFAULT_FONT_FAMILY,Tn as DEFAULT_FONT_SIZE,Sn as DEFAULT_GRID_SIZE,Ln as DEFAULT_GRID_STEP,sn as DEFAULT_LASER_COLOR,jn as DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,io as DEFAULT_PROPORTIONAL_RADIUS,yo as DEFAULT_REDUCED_GLOBAL_ALPHA,mo as DEFAULT_SIDEBAR,xn as DEFAULT_TEXT_ALIGN,Ye as DEFAULT_TRANSFORM_HANDLE_SPACING,Xn as DEFAULT_UI_OPTIONS,se as DEFAULT_VERSION,bn as DEFAULT_VERTICAL_ALIGN,Oo as DOUBLE_TAP_POSITION_THRESHOLD,qt as DRAGGING_THRESHOLD,xo as EDITOR_LS_KEYS,x as ELEMENTS_PALETTE_SHADE_INDEXES,go as ELEMENT_LINK_KEY,ao as ELEMENT_READY_TO_ERASE_OPACITY,tn as ELEMENT_SHIFT_TRANSLATE_AMOUNT,nn as ELEMENT_TRANSLATE_AMOUNT,Jn as ENCRYPTION_KEY_BITS,C as ENV,ze as EPSILON,Be as EVENT,vn as EXPORT_DATA_TYPES,Rn as EXPORT_IMAGE_TYPES,Vn as EXPORT_SCALES,Fe as Emitter,m as FONT_FAMILY,W as FONT_FAMILY_FALLBACKS,Ke as FONT_FAMILY_GENERIC_FALLBACKS,D as FONT_METADATA,fn as FRAME_STYLE,Io as GOOGLE_FONTS_RANGES,Hn as HYPERLINK_TOOLTIP_DELAY,Gn as IDLE_THRESHOLD,ae as IMAGE_MIME_TYPES,Mn as IMAGE_RENDER_TIMEOUT,g as KEYS,nt as KeyCodeMap,To as LIBRARY_DISABLED_TYPES,je as LIBRARY_SIDEBAR_TAB,en as LINE_CONFIRM_THRESHOLD,Lo as LINE_POLYGON_POINT_MERGE_DISTANCE,Po as LOCAL_FONT_PROTOCOL,Qn as MAX_ALLOWED_FILE_BYTES,Dt as MAX_CUSTOM_COLORS_USED_IN_CANVAS,zn as MAX_DECIMALS_FOR_SVG_EXPORT,kn as MAX_ZOOM,ee as MIME_TYPES,Jt as MINIMUM_ARROW_SIZE,mn as MIN_FONT_SIZE,Ao as MIN_WIDTH_OR_HEIGHT,Nn as MIN_ZOOM,vo as MOBILE_ACTION_BUTTON_BG,oe as MONOSPACE_GENERIC_FONT,Wo as MQ_MAX_HEIGHT_LANDSCAPE,Bo as MQ_MAX_MOBILE,Xo as MQ_MAX_TABLET,Ko as MQ_MAX_WIDTH_LANDSCAPE,Yo as MQ_MIN_TABLET,zo as MQ_MIN_WIDTH_DESKTOP,Vo as MQ_RIGHT_SIDEBAR_MIN_WIDTH,So as ORIG_ID,ln as POINTER_BUTTON,cn as POINTER_EVENTS,xe as PromisePool,ie as Queue,$e as ROUGHNESS,co as ROUNDNESS,ne as SANS_SERIF_GENERIC_FONT,Dn as SCROLL_TIMEOUT,rn as SHIFT_LOCKING_ANGLE,Xe as SIDE_RESIZING_THRESHOLD,_o as STATS_PANELS,Ve as STRING_MIME_TYPES,uo as STROKE_WIDTH,qn as SVG_DOCUMENT_PREAMBLE,Zn as SVG_NS,wn as TAP_TWICE_TIMEOUT,so as TEXT_ALIGN,Zt as TEXT_AUTOWRAP_THRESHOLD,on as TEXT_TO_CENTER_SNAP_THRESHOLD,dn as THEME,Kn as THEME_FILTER,Pn as TITLE_TIMEOUT,Eo as TOOL_TYPE,In as TOUCH_CTX_MENU_TIMEOUT,Yn as URL_HASH_KEYS,Wn as URL_QUERY_KEYS,Qe as UserIdleState,eo as VERSIONS,Cn as VERSION_TIMEOUT,ro as VERTICAL_ALIGN,R as WINDOWS_EMOJI_FALLBACK_FONT,un as YOUTUBE_STATES,Un as ZOOM_STEP,ks as addEventListener,Zr as allowFullScreen,As as arrayToList,xs as arrayToMap,bs as arrayToMapWithIndex,_s as arrayToObject,Is as assertNever,Ts as bytesToHexString,Dr as capitalizeString,Ys as castArray,Yr as chunk,Us as cloneJSON,ws as composeEventHandlers,er as createUserAgentDescriptor,Br as debounce,_a as debugClear,ba as debugCloseFrame,Ea as debugDrawBounds,Ta as debugDrawCubicBezier,V as debugDrawLine,Rt as debugDrawPoint,xa as debugDrawPoints,Jo as deriveStylesPanelMode,Vr as distance,ye as easeOut,Wr as easeToValuesRAF,ge as escapeDoubleQuotes,qr as exitFullScreen,ss as findIndex,as as findLastIndex,fs as focusNearestParent,Yt as getAllColorsSpecificShade,Cr as getDateTime,Fn as getExportSource,zs as getFeatureFlag,re as getFontFamilyFallbacks,at as getFontFamilyString,Hr as getFontString,qo as getFormFactor,pt as getFrame,We as getGenericFontFamilyFallback,ts as getGlobalCSSVariable,Er as getGridPoint,Do as getLineHeight,ds as getNearestScrollableContainer,mr as getSizeFromPoints,b as getSpecificColorShades,Hs as getSvgPathFromStroke,Es as getUpdatedTimestamp,us as getVersion,Co as getVerticalOffset,Ps as invariant,de as isAndroid,Ks as isAnyTrue,ir as isArrowKey,Zo as isBrave,Ze as isChrome,pe as isDarwin,ys as isDevEnv,jo as isFirefox,Qr as isFullScreen,fe as isIOS,st as isInputLike,Nr as isInteractive,ot as isLatinChar,ia as isLocalLink,Ds as isMemberOf,qe as isMobileBreakpoint,Rs as isPrimitive,gs as isProdEnv,Fs as isPromiseLike,ns as isRTL,ft as isReadonlyArray,vs as isRunningInIframe,Qo as isSafari,$r as isSelectionLikeTool,Ss as isServerEnv,dt as isShallowEqual,Je as isTabletBreakpoint,N as isTestEnv,Ur as isToolIcon,ls as isTransparent,$o as isWindows,kr as isWritableElement,tr as loadDesktopUIModePreference,is as mapFind,ar as matchKey,Cs as memoize,rs as muteFSAbortError,cs as nFormatter,Gr as nextAnimationFrame,Gs as normalizeEOL,St as normalizeLink,ms as preventUnload,ce as promiseTry,Ms as queryFocusableElements,ta as randomId,Js as randomInteger,Xs as reduceToCommonValue,zr as removeSelection,Tr as rescalePoints,ea as reseed,le as resolvablePromise,Xt as rgbToHex,Ws as safelyParseJSON,es as sceneCoordsToViewportCoords,Xr as selectNode,Pr as setDateTimeForTests,nr as setDesktopUIMode,Vs as setFeatureFlag,cr as shouldMaintainAspectRatio,lr as shouldResizeFromCenter,ur as shouldRotateWithDiscreteAngle,mt as sizeOf,ps as supportsEmoji,jt as supportsResizeObserver,Kr as throttleRAF,hs as toArray,Bs as toBrandedType,ut as toIterable,la as toValidURL,os as tupleToCoors,jr as updateActiveTool,Os as updateObject,Ns as updateStable,Jr as viewportCoordsToSceneCoords,Ls as wrapEvent};
@@ -1,17 +1,10 @@
1
1
  import type { ExcalidrawElement, FontFamilyValues } from "@excalidraw/element/types";
2
2
  import type { AppProps, AppState } from "@excalidraw/excalidraw/types";
3
- export declare const isDarwin: boolean;
4
- export declare const isWindows: boolean;
5
- export declare const isAndroid: boolean;
6
- export declare const isFirefox: boolean;
7
- export declare const isChrome: boolean;
8
- export declare const isSafari: boolean;
9
- export declare const isIOS: boolean;
10
- export declare const isBrave: () => boolean;
11
3
  export declare const supportsResizeObserver: boolean;
12
4
  export declare const APP_NAME = "Excalidraw";
13
5
  export declare const TEXT_AUTOWRAP_THRESHOLD = 36;
14
6
  export declare const DRAGGING_THRESHOLD = 10;
7
+ export declare const MINIMUM_ARROW_SIZE = 20;
15
8
  export declare const LINE_CONFIRM_THRESHOLD = 8;
16
9
  export declare const ELEMENT_SHIFT_TRANSLATE_AMOUNT = 5;
17
10
  export declare const ELEMENT_TRANSLATE_AMOUNT = 1;
@@ -85,10 +78,13 @@ export declare const ENV: {
85
78
  PRODUCTION: string;
86
79
  };
87
80
  export declare const CLASSES: {
81
+ SIDEBAR: string;
88
82
  SHAPE_ACTIONS_MENU: string;
89
83
  ZOOM_ACTIONS: string;
90
84
  SEARCH_MENU_INPUT_WRAPPER: string;
91
85
  CONVERT_ELEMENT_TYPE_POPUP: string;
86
+ SHAPE_ACTIONS_THEME_SCOPE: string;
87
+ FRAME_NAME: string;
92
88
  };
93
89
  export declare const CJK_HAND_DRAWN_FALLBACK_FONT = "Xiaolai";
94
90
  export declare const WINDOWS_EMOJI_FALLBACK_FONT = "Segoe UI Emoji";
@@ -174,6 +170,14 @@ export declare const IMAGE_MIME_TYPES: {
174
170
  readonly avif: "image/avif";
175
171
  readonly jfif: "image/jfif";
176
172
  };
173
+ export declare const STRING_MIME_TYPES: {
174
+ readonly text: "text/plain";
175
+ readonly html: "text/html";
176
+ readonly json: "application/json";
177
+ readonly excalidraw: "application/vnd.excalidraw+json";
178
+ readonly excalidrawlib: "application/vnd.excalidrawlib+json";
179
+ readonly excalidrawlibIds: "application/vnd.excalidrawlib.ids+json";
180
+ };
177
181
  export declare const MIME_TYPES: {
178
182
  readonly svg: "image/svg+xml";
179
183
  readonly png: "image/png";
@@ -184,14 +188,15 @@ export declare const MIME_TYPES: {
184
188
  readonly ico: "image/x-icon";
185
189
  readonly avif: "image/avif";
186
190
  readonly jfif: "image/jfif";
191
+ readonly "excalidraw.svg": "image/svg+xml";
192
+ readonly "excalidraw.png": "image/png";
193
+ readonly binary: "application/octet-stream";
187
194
  readonly text: "text/plain";
188
195
  readonly html: "text/html";
189
196
  readonly json: "application/json";
190
197
  readonly excalidraw: "application/vnd.excalidraw+json";
191
198
  readonly excalidrawlib: "application/vnd.excalidrawlib+json";
192
- readonly "excalidraw.svg": "image/svg+xml";
193
- readonly "excalidraw.png": "image/png";
194
- readonly binary: "application/octet-stream";
199
+ readonly excalidrawlibIds: "application/vnd.excalidrawlib.ids+json";
195
200
  };
196
201
  export declare const ALLOWED_PASTE_MIME_TYPES: readonly ["text/plain", "text/html", ...("image/svg+xml" | "image/png" | "image/jpeg" | "image/gif" | "image/webp" | "image/bmp" | "image/x-icon" | "image/avif" | "image/jfif")[]];
197
202
  export declare const EXPORT_IMAGE_TYPES: {
@@ -226,10 +231,6 @@ export declare const URL_HASH_KEYS: {
226
231
  readonly addLibrary: "addLibrary";
227
232
  };
228
233
  export declare const DEFAULT_UI_OPTIONS: AppProps["UIOptions"];
229
- export declare const MQ_MAX_WIDTH_PORTRAIT = 730;
230
- export declare const MQ_MAX_WIDTH_LANDSCAPE = 1000;
231
- export declare const MQ_MAX_HEIGHT_LANDSCAPE = 500;
232
- export declare const MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;
233
234
  export declare const MAX_DECIMALS_FOR_SVG_EXPORT = 2;
234
235
  export declare const EXPORT_SCALES: number[];
235
236
  export declare const DEFAULT_EXPORT_PADDING = 10;
@@ -341,3 +342,8 @@ export declare enum UserIdleState {
341
342
  * the start and end points)
342
343
  */
343
344
  export declare const LINE_POLYGON_POINT_MERGE_DISTANCE = 20;
345
+ export declare const DOUBLE_TAP_POSITION_THRESHOLD = 35;
346
+ export declare const BIND_MODE_TIMEOUT = 700;
347
+ export declare const MOBILE_ACTION_BUTTON_BG: {
348
+ readonly background: "var(--mobile-action-button-bg)";
349
+ };
@@ -0,0 +1,34 @@
1
+ export type StylesPanelMode = "compact" | "full" | "mobile";
2
+ export type EditorInterface = Readonly<{
3
+ formFactor: "phone" | "tablet" | "desktop";
4
+ desktopUIMode: "compact" | "full";
5
+ userAgent: Readonly<{
6
+ isMobileDevice: boolean;
7
+ platform: "ios" | "android" | "other" | "unknown";
8
+ }>;
9
+ isTouchScreen: boolean;
10
+ canFitSidebar: boolean;
11
+ isLandscape: boolean;
12
+ }>;
13
+ export declare const MQ_MAX_MOBILE = 599;
14
+ export declare const MQ_MAX_WIDTH_LANDSCAPE = 1000;
15
+ export declare const MQ_MAX_HEIGHT_LANDSCAPE = 500;
16
+ export declare const MQ_MIN_TABLET: number;
17
+ export declare const MQ_MAX_TABLET = 1400;
18
+ export declare const MQ_MIN_WIDTH_DESKTOP = 1440;
19
+ export declare const MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;
20
+ export declare const isDarwin: boolean;
21
+ export declare const isWindows: boolean;
22
+ export declare const isAndroid: boolean;
23
+ export declare const isFirefox: boolean;
24
+ export declare const isChrome: boolean;
25
+ export declare const isSafari: boolean;
26
+ export declare const isIOS: boolean;
27
+ export declare const isBrave: () => boolean;
28
+ export declare const isMobileBreakpoint: (width: number, height: number) => boolean;
29
+ export declare const isTabletBreakpoint: (editorWidth: number, editorHeight: number) => boolean;
30
+ export declare const getFormFactor: (editorWidth: number, editorHeight: number) => EditorInterface["formFactor"];
31
+ export declare const deriveStylesPanelMode: (editorInterface: EditorInterface) => StylesPanelMode;
32
+ export declare const createUserAgentDescriptor: (userAgentString: string) => EditorInterface["userAgent"];
33
+ export declare const loadDesktopUIModePreference: () => "compact" | "full" | null;
34
+ export declare const setDesktopUIMode: (mode: EditorInterface["desktopUIMode"]) => "compact" | "full" | undefined;
@@ -10,3 +10,5 @@ export * from "./random";
10
10
  export * from "./url";
11
11
  export * from "./utils";
12
12
  export * from "./emitter";
13
+ export * from "./visualdebug";
14
+ export * from "./editorInterface";
@@ -1,4 +1,4 @@
1
- import type { ExcalidrawBindableElement, FontFamilyValues, FontString } from "@excalidraw/element/types";
1
+ import type { FontFamilyValues, FontString } from "@excalidraw/element/types";
2
2
  import type { ActiveTool, AppState, ToolType, UnsubscribeCallback, Zoom } from "@excalidraw/excalidraw/types";
3
3
  import type { MaybePromise } from "./utility-types";
4
4
  import type { EVENT } from "./constants";
@@ -17,6 +17,8 @@ export declare const getFontString: ({ fontSize, fontFamily, }: {
17
17
  fontSize: number;
18
18
  fontFamily: FontFamilyValues;
19
19
  }) => FontString;
20
+ /** executes callback in the frame that's after the current one */
21
+ export declare const nextAnimationFrame: (cb: () => any) => Promise<void>;
20
22
  export declare const debounce: <T extends any[]>(fn: (...args: T) => void, timeout: number) => {
21
23
  (...args: T): void;
22
24
  flush(): void;
@@ -80,6 +82,7 @@ export declare const chunk: <T extends unknown>(array: readonly T[], size: numbe
80
82
  export declare const selectNode: (node: Element) => void;
81
83
  export declare const removeSelection: () => void;
82
84
  export declare const distance: (x: number, y: number) => number;
85
+ export declare const isSelectionLikeTool: (type: ToolType | "custom") => boolean;
83
86
  export declare const updateActiveTool: (appState: Pick<AppState, "activeTool">, data: (({
84
87
  type: ToolType;
85
88
  } | {
@@ -94,7 +97,6 @@ export declare const updateActiveTool: (appState: Pick<AppState, "activeTool">,
94
97
  export declare const isFullScreen: () => boolean;
95
98
  export declare const allowFullScreen: () => Promise<void>;
96
99
  export declare const exitFullScreen: () => Promise<void>;
97
- export declare const getShortcutKey: (shortcut: string) => string;
98
100
  export declare const viewportCoordsToSceneCoords: ({ clientX, clientY }: {
99
101
  clientX: number;
100
102
  clientY: number;
@@ -140,7 +142,6 @@ export declare const findLastIndex: <T>(array: readonly T[], cb: (element: T, in
140
142
  /** returns the first non-null mapped value */
141
143
  export declare const mapFind: <T, K>(collection: readonly T[], iteratee: (value: T, index: number) => K | null | undefined) => K | undefined;
142
144
  export declare const isTransparent: (color: string) => boolean;
143
- export declare const isBindingFallthroughEnabled: (el: ExcalidrawBindableElement) => boolean;
144
145
  export type ResolvablePromise<T> = Promise<T> & {
145
146
  resolve: [T] extends [undefined] ? (value?: MaybePromise<Awaited<T>>) => void : (value: MaybePromise<Awaited<T>>) => void;
146
147
  reject: (error: Error) => void;
@@ -264,4 +265,9 @@ export declare const castArray: <T>(value: T | T[]) => T[];
264
265
  export declare const isReadonlyArray: (value?: any) => value is readonly any[];
265
266
  export declare const sizeOf: (value: readonly unknown[] | Readonly<Map<string, unknown>> | Readonly<Record<string, unknown>> | ReadonlySet<unknown>) => number;
266
267
  export declare const reduceToCommonValue: <T, R = T>(collection: ReadonlySet<T> | readonly T[], getValue?: ((item: T) => R) | undefined) => R | null;
268
+ type FEATURE_FLAGS = {
269
+ COMPLEX_BINDINGS: boolean;
270
+ };
271
+ export declare const getFeatureFlag: <F extends "COMPLEX_BINDINGS">(flag: F) => FEATURE_FLAGS[F];
272
+ export declare const setFeatureFlag: <F extends "COMPLEX_BINDINGS">(flag: F, value: FEATURE_FLAGS[F]) => void;
267
273
  export {};
@@ -0,0 +1,41 @@
1
+ import { type GlobalPoint, type LocalPoint } from "@excalidraw/math";
2
+ import type { Curve } from "@excalidraw/math";
3
+ import type { LineSegment } from "@excalidraw/utils";
4
+ import type { Bounds } from "@excalidraw/element";
5
+ declare global {
6
+ interface Window {
7
+ visualDebug?: {
8
+ data: DebugElement[][];
9
+ currentFrame?: number;
10
+ };
11
+ }
12
+ }
13
+ export type DebugElement = {
14
+ color: string;
15
+ data: LineSegment<GlobalPoint> | Curve<GlobalPoint>;
16
+ permanent: boolean;
17
+ };
18
+ export declare const debugDrawCubicBezier: (c: Curve<GlobalPoint>, opts?: {
19
+ color?: string;
20
+ permanent?: boolean;
21
+ }) => void;
22
+ export declare const debugDrawLine: (segment: LineSegment<GlobalPoint> | LineSegment<GlobalPoint>[], opts?: {
23
+ color?: string;
24
+ permanent?: boolean;
25
+ }) => void;
26
+ export declare const debugDrawPoint: (p: GlobalPoint, opts?: {
27
+ color?: string;
28
+ permanent?: boolean;
29
+ fuzzy?: boolean;
30
+ }) => void;
31
+ export declare const debugDrawBounds: (box: Bounds | Bounds[], opts?: {
32
+ color?: string;
33
+ permanent?: boolean;
34
+ }) => void;
35
+ export declare const debugDrawPoints: ({ x, y, points, }: {
36
+ x: number;
37
+ y: number;
38
+ points: readonly LocalPoint[];
39
+ }, options?: any) => void;
40
+ export declare const debugCloseFrame: () => void;
41
+ export declare const debugClear: () => void;
@@ -27,7 +27,9 @@ export declare class Scene {
27
27
  getElementsMapIncludingDeleted(): Map<string, Ordered<ExcalidrawElement>> & import("@excalidraw/common/utility-types").MakeBrand<"SceneElementsMap">;
28
28
  getNonDeletedElements(): readonly Ordered<NonDeletedExcalidrawElement>[];
29
29
  getFramesIncludingDeleted(): readonly ExcalidrawFrameLikeElement[];
30
- constructor(elements?: ElementsMapOrArray | null);
30
+ constructor(elements?: ElementsMapOrArray | null, options?: {
31
+ skipValidation?: true;
32
+ });
31
33
  getSelectedElements(opts: {
32
34
  selectedElementIds: AppState["selectedElementIds"];
33
35
  /**
@@ -55,7 +57,9 @@ export declare class Scene {
55
57
  * @returns whether a change was made
56
58
  */
57
59
  mapElements(iteratee: (element: ExcalidrawElement) => ExcalidrawElement): boolean;
58
- replaceAllElements(nextElements: ElementsMapOrArray): void;
60
+ replaceAllElements(nextElements: ElementsMapOrArray, options?: {
61
+ skipValidation?: true;
62
+ }): void;
59
63
  triggerUpdate(): void;
60
64
  onUpdate(cb: SceneStateCallback): SceneStateCallbackRemover;
61
65
  destroy(): void;
@@ -1,7 +1,8 @@
1
+ import type { AppState } from "@excalidraw/excalidraw/types";
1
2
  import type { Scene } from "./Scene";
2
3
  import type { ExcalidrawElement } from "./types";
3
4
  export interface Alignment {
4
5
  position: "start" | "center" | "end";
5
6
  axis: "x" | "y";
6
7
  }
7
- export declare const alignElements: (selectedElements: ExcalidrawElement[], alignment: Alignment, scene: Scene) => ExcalidrawElement[];
8
+ export declare const alignElements: (selectedElements: ExcalidrawElement[], alignment: Alignment, scene: Scene, appState: Readonly<AppState>) => ExcalidrawElement[];
@@ -1,68 +1,80 @@
1
1
  import { type GlobalPoint } from "@excalidraw/math";
2
- import type { LocalPoint } from "@excalidraw/math";
2
+ import type { LineSegment, LocalPoint } from "@excalidraw/math";
3
3
  import type { AppState } from "@excalidraw/excalidraw/types";
4
4
  import { type Heading } from "./heading";
5
5
  import type { Scene } from "./Scene";
6
6
  import type { Bounds } from "./bounds";
7
7
  import type { ElementUpdate } from "./mutateElement";
8
- import type { ExcalidrawBindableElement, ExcalidrawElement, NonDeleted, ExcalidrawLinearElement, NonDeletedExcalidrawElement, ElementsMap, NonDeletedSceneElementsMap, ExcalidrawElbowArrowElement, FixedPoint } from "./types";
9
- export type SuggestedBinding = NonDeleted<ExcalidrawBindableElement> | SuggestedPointBinding;
10
- export type SuggestedPointBinding = [
11
- NonDeleted<ExcalidrawLinearElement>,
12
- "start" | "end" | "both",
13
- NonDeleted<ExcalidrawBindableElement>
14
- ];
8
+ import type { BindMode, ElementsMap, ExcalidrawArrowElement, ExcalidrawBindableElement, ExcalidrawElbowArrowElement, ExcalidrawElement, FixedPoint, FixedPointBinding, NonDeleted, NonDeletedExcalidrawElement, NonDeletedSceneElementsMap, Ordered, PointsPositionUpdates } from "./types";
9
+ export type BindingStrategy = {
10
+ mode: BindMode;
11
+ element: NonDeleted<ExcalidrawBindableElement>;
12
+ focusPoint: GlobalPoint;
13
+ } | {
14
+ mode: null;
15
+ element?: undefined;
16
+ focusPoint?: undefined;
17
+ } | {
18
+ mode: undefined;
19
+ element?: undefined;
20
+ focusPoint?: undefined;
21
+ };
22
+ /**
23
+ * gaps exclude element strokeWidth
24
+ *
25
+ * IMPORTANT: currently must be > 0 (this also applies to the computed gap)
26
+ */
27
+ export declare const BASE_BINDING_GAP = 10;
28
+ export declare const BASE_BINDING_GAP_ELBOW = 5;
29
+ export declare const getBindingGap: (bindTarget: ExcalidrawBindableElement, opts: Pick<ExcalidrawArrowElement, "elbowed">) => number;
30
+ export declare const maxBindingDistance_simple: (zoom?: AppState["zoom"]) => number;
15
31
  export declare const shouldEnableBindingForPointerEvent: (event: React.PointerEvent<HTMLElement>) => boolean;
16
32
  export declare const isBindingEnabled: (appState: AppState) => boolean;
17
- export declare const FIXED_BINDING_DISTANCE = 5;
18
- export declare const BINDING_HIGHLIGHT_THICKNESS = 10;
19
- export declare const bindOrUnbindLinearElement: (linearElement: NonDeleted<ExcalidrawLinearElement>, startBindingElement: ExcalidrawBindableElement | null | "keep", endBindingElement: ExcalidrawBindableElement | null | "keep", scene: Scene) => void;
20
- export declare const bindOrUnbindLinearElements: (selectedElements: NonDeleted<ExcalidrawLinearElement>[], isBindingEnabled: boolean, draggingPoints: readonly number[] | null, scene: Scene, zoom?: AppState["zoom"]) => void;
21
- export declare const getSuggestedBindingsForArrows: (selectedElements: NonDeleted<ExcalidrawElement>[], elementsMap: NonDeletedSceneElementsMap, zoom: AppState["zoom"]) => SuggestedBinding[];
22
- export declare const maybeSuggestBindingsForLinearElementAtCoords: (linearElement: NonDeleted<ExcalidrawLinearElement>, pointerCoords: {
23
- x: number;
24
- y: number;
25
- }[], scene: Scene, zoom: AppState["zoom"], oppositeBindingBoundElement?: ExcalidrawBindableElement | null) => ExcalidrawBindableElement[];
26
- export declare const maybeBindLinearElement: (linearElement: NonDeleted<ExcalidrawLinearElement>, appState: AppState, pointerCoords: {
27
- x: number;
28
- y: number;
29
- }, scene: Scene) => void;
30
- export declare const bindLinearElement: (linearElement: NonDeleted<ExcalidrawLinearElement>, hoveredElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", scene: Scene) => void;
31
- export declare const isLinearElementSimpleAndAlreadyBound: (linearElement: NonDeleted<ExcalidrawLinearElement>, alreadyBoundToId: ExcalidrawBindableElement["id"] | undefined, bindableElement: ExcalidrawBindableElement) => boolean;
32
- export declare const getHoveredElementForBinding: (pointerCoords: {
33
- x: number;
34
- y: number;
35
- }, elements: readonly NonDeletedExcalidrawElement[], elementsMap: NonDeletedSceneElementsMap, zoom?: AppState["zoom"], fullShape?: boolean, considerAllElements?: boolean) => NonDeleted<ExcalidrawBindableElement> | null;
33
+ export declare const bindOrUnbindBindingElement: (arrow: NonDeleted<ExcalidrawArrowElement>, draggingPoints: PointsPositionUpdates, scene: Scene, appState: AppState, opts?: {
34
+ newArrow?: boolean;
35
+ altKey?: boolean;
36
+ initialBinding?: boolean;
37
+ }) => {
38
+ start: BindingStrategy;
39
+ end: BindingStrategy;
40
+ };
41
+ export declare const getBindingStrategyForDraggingBindingElementEndpoints: (arrow: NonDeleted<ExcalidrawArrowElement>, draggingPoints: PointsPositionUpdates, elementsMap: NonDeletedSceneElementsMap, elements: readonly Ordered<NonDeletedExcalidrawElement>[], appState: AppState, opts?: {
42
+ newArrow?: boolean;
43
+ shiftKey?: boolean;
44
+ altKey?: boolean;
45
+ finalize?: boolean;
46
+ initialBinding?: boolean;
47
+ zoom?: AppState["zoom"];
48
+ }) => {
49
+ start: BindingStrategy;
50
+ end: BindingStrategy;
51
+ };
52
+ export declare const bindOrUnbindBindingElements: (selectedArrows: NonDeleted<ExcalidrawArrowElement>[], scene: Scene, appState: AppState) => void;
53
+ export declare const bindBindingElement: (arrow: NonDeleted<ExcalidrawArrowElement>, hoveredElement: ExcalidrawBindableElement, mode: BindMode, startOrEnd: "start" | "end", scene: Scene, focusPoint?: GlobalPoint) => void;
54
+ export declare const unbindBindingElement: (arrow: NonDeleted<ExcalidrawArrowElement>, startOrEnd: "start" | "end", scene: Scene) => ExcalidrawBindableElement["id"] | null;
36
55
  export declare const updateBoundElements: (changedElement: NonDeletedExcalidrawElement, scene: Scene, options?: {
37
56
  simultaneouslyUpdated?: readonly ExcalidrawElement[];
38
- newSize?: {
39
- width: number;
40
- height: number;
41
- };
42
57
  changedElements?: Map<string, ExcalidrawElement>;
43
58
  }) => void;
44
- export declare const updateBindings: (latestElement: ExcalidrawElement, scene: Scene, options?: {
59
+ export declare const updateBindings: (latestElement: ExcalidrawElement, scene: Scene, appState: AppState, options?: {
45
60
  simultaneouslyUpdated?: readonly ExcalidrawElement[];
46
61
  newSize?: {
47
62
  width: number;
48
63
  height: number;
49
64
  };
50
- zoom?: AppState["zoom"];
51
65
  }) => void;
52
66
  export declare const getHeadingForElbowArrowSnap: (p: Readonly<GlobalPoint>, otherPoint: Readonly<GlobalPoint>, bindableElement: ExcalidrawBindableElement | undefined | null, aabb: Bounds | undefined | null, origPoint: GlobalPoint, elementsMap: ElementsMap, zoom?: AppState["zoom"]) => Heading;
53
- export declare const bindPointToSnapToElementOutline: (arrow: ExcalidrawElbowArrowElement, bindableElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap) => GlobalPoint;
54
- export declare const avoidRectangularCorner: (element: ExcalidrawBindableElement, elementsMap: ElementsMap, p: GlobalPoint) => GlobalPoint;
55
- export declare const snapToMid: (element: ExcalidrawBindableElement, elementsMap: ElementsMap, p: GlobalPoint, tolerance?: number) => GlobalPoint;
67
+ export declare const bindPointToSnapToElementOutline: (arrowElement: ExcalidrawArrowElement, bindableElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap, customIntersector?: LineSegment<GlobalPoint>) => GlobalPoint;
68
+ export declare const avoidRectangularCorner: (arrowElement: ExcalidrawArrowElement, bindTarget: ExcalidrawBindableElement, elementsMap: ElementsMap, p: GlobalPoint) => GlobalPoint;
69
+ export declare const updateBoundPoint: (arrow: NonDeleted<ExcalidrawArrowElement>, startOrEnd: "startBinding" | "endBinding", binding: FixedPointBinding | null | undefined, bindableElement: ExcalidrawBindableElement, elementsMap: ElementsMap, customIntersector?: LineSegment<GlobalPoint>) => LocalPoint | null;
56
70
  export declare const calculateFixedPointForElbowArrowBinding: (linearElement: NonDeleted<ExcalidrawElbowArrowElement>, hoveredElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap) => {
57
71
  fixedPoint: FixedPoint;
58
72
  };
73
+ export declare const calculateFixedPointForNonElbowArrowBinding: (linearElement: NonDeleted<ExcalidrawArrowElement>, hoveredElement: ExcalidrawBindableElement, startOrEnd: "start" | "end", elementsMap: ElementsMap, focusPoint?: GlobalPoint) => {
74
+ fixedPoint: FixedPoint;
75
+ };
59
76
  export declare const fixDuplicatedBindingsAfterDuplication: (duplicatedElements: ExcalidrawElement[], origIdToDuplicateId: Map<ExcalidrawElement["id"], ExcalidrawElement["id"]>, duplicateElementsMap: NonDeletedSceneElementsMap) => void;
60
77
  export declare const fixBindingsAfterDeletion: (sceneElements: readonly ExcalidrawElement[], deletedElements: readonly ExcalidrawElement[]) => void;
61
- export declare const bindingBorderTest: (element: NonDeleted<ExcalidrawBindableElement>, { x, y }: {
62
- x: number;
63
- y: number;
64
- }, elementsMap: NonDeletedSceneElementsMap, zoom?: AppState["zoom"], fullShape?: boolean) => boolean;
65
- export declare const maxBindingGap: (element: ExcalidrawElement, elementWidth: number, elementHeight: number, zoom?: AppState["zoom"]) => number;
66
78
  export declare const bindingProperties: Set<BindableProp | BindingProp>;
67
79
  export type BindableProp = "boundElements";
68
80
  export type BindingProp = "frameId" | "containerId" | "startBinding" | "endBinding";
@@ -104,7 +116,7 @@ export declare class BindableElement {
104
116
  */
105
117
  static rebindAffected: (elements: ElementsMap, bindableElement: ExcalidrawElement | undefined, updateElementWith: (affected: ExcalidrawElement, updates: ElementUpdate<ExcalidrawElement>) => void) => void;
106
118
  }
107
- export declare const getGlobalFixedPointForBindableElement: (fixedPointRatio: [number, number], element: ExcalidrawBindableElement, elementsMap: ElementsMap) => GlobalPoint;
108
- export declare const getGlobalFixedPoints: (arrow: ExcalidrawElbowArrowElement, elementsMap: ElementsMap) => [GlobalPoint, GlobalPoint];
119
+ export declare const getGlobalFixedPointForBindableElement: (fixedPointRatio: FixedPoint, element: ExcalidrawBindableElement, elementsMap: ElementsMap) => GlobalPoint;
120
+ export declare const getGlobalFixedPoints: (arrow: ExcalidrawArrowElement, elementsMap: ElementsMap) => [GlobalPoint, GlobalPoint];
109
121
  export declare const getArrowLocalFixedPoints: (arrow: ExcalidrawElbowArrowElement, elementsMap: ElementsMap) => LocalPoint[];
110
122
  export declare const normalizeFixedPoint: <T extends FixedPoint | null>(fixedPoint: T) => T extends null ? null : FixedPoint;
@@ -74,7 +74,7 @@ export interface BoundingBox {
74
74
  width: number;
75
75
  height: number;
76
76
  }
77
- export declare const getCommonBoundingBox: (elements: ExcalidrawElement[] | readonly NonDeleted<ExcalidrawElement>[]) => BoundingBox;
77
+ export declare const getCommonBoundingBox: (elements: readonly ExcalidrawElement[] | readonly NonDeleted<ExcalidrawElement>[]) => BoundingBox;
78
78
  /**
79
79
  * returns scene coords of user's editor viewport (visible canvas area) bounds
80
80
  */