lexgui 0.2.0 → 0.4.1

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.
@@ -1 +1 @@
1
- "use strict";var LX={version:"0.2.0",ready:!1,components:[],signals:{},extraCommandbarEntries:[]};function clamp(e,t,a){return Math.min(Math.max(e,t),a)}function round(e,t){return 0==t?Math.floor(e):+e.toFixed(t??2).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,"$1")}function remapRange(e,t,a,i,n){return(e-t)*(n-i)/(a-t)+i}LX.MOUSE_LEFT_CLICK=0,LX.MOUSE_MIDDLE_CLICK=1,LX.MOUSE_RIGHT_CLICK=2,LX.MOUSE_DOUBLE_CLICK=2,LX.MOUSE_TRIPLE_CLICK=3,LX.CURVE_MOVEOUT_CLAMP=0,LX.CURVE_MOVEOUT_DELETE=1,LX.clamp=clamp,LX.round=round,LX.remapRange=remapRange,"undefined"!=typeof performance?LX.getTime=performance.now.bind(performance):"undefined"!=typeof Date&&Date.now?LX.getTime=Date.now.bind(Date):"undefined"!=typeof process?LX.getTime=function(){var e=process.hrtime();return .001*e[0]+1e-6*e[1]}:LX.getTime=function(){return new Date().getTime()};let ASYNC_ENABLED=!0;function doAsync(e,t){ASYNC_ENABLED?setTimeout(e,t??0):e()}function getSupportedDOMName(e){return e.replace(/\s/g,"").replaceAll("@","_").replaceAll("+","_plus_").replaceAll(".","")}function has(e){return LX.components.indexOf(e)>-1}function getExtension(e){return e.includes(".")?e.split(".").pop():null}function deepCopy(e){return JSON.parse(JSON.stringify(e))}function setTheme(e){e="light"==e?"light":"dark",document.documentElement.setAttribute("data-theme",e),LX.emit("@on_new_color_scheme",e)}function setThemeColor(e,t){document.querySelector(":root").style.setProperty("--"+e,t)}function getThemeColor(e){let t=getComputedStyle(document.querySelector(":root")),a=t.getPropertyValue("--"+e);if(document.documentElement.getAttribute("data-theme"),a.includes("light-dark")){let i=t.getPropertyValue("color-scheme");return"light"==i?a.substring(a.indexOf("(")+1,a.indexOf(",")).replace(/\s/g,""):a.substring(a.indexOf(",")+1,a.indexOf(")")).replace(/\s/g,"")}return a}function getBase64Image(e){var t=document.createElement("canvas");return t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(e,0,0),t.toDataURL("image/png")}function hexToRgb(e){let t=parseInt(e.substring(1,3),16)/255,a=parseInt(e.substring(3,5),16)/255,i=parseInt(e.substring(5,7),16)/255;return[t,a,i]}function rgbToHex(e){let t="#";for(let a of e)t+=(a=Math.floor(255*a)).toString(16);return t}function measureRealWidth(e,t=8){var a=document.createElement("span");a.className="lexinputmeasure",a.innerHTML=e,document.body.appendChild(a);var i=a.getBoundingClientRect();return LX.UTILS.deleteElement(a),i.width+t}function simple_guidGenerator(){var e=function(){return((1+Math.random())*65536|0).toString(16).substring(1)};return e()+"-"+e()+"-"+e()}function buildTextPattern(e={}){let t=[];e.lowercase&&t.push("(?=.*[a-z])"),e.uppercase&&t.push("(?=.*[A-Z])"),e.digit&&t.push("(?=.*\\d)"),e.specialChar&&t.push("(?=.*[@#$%^&+=!])"),e.noSpaces&&t.push("(?!.*\\s)");let a,i=`^${t.join("")}.{${e.minLength||0},${e.maxLength||""}}$`;return e.asRegExp?RegExp(i):i}function makeDraggable(e,t={}){let a=0,i=0,n=null,l=t.targetClass,s=t.dragMargin??3,r=(t,n,l)=>{let r=e.parentElement?e.parentElement.getBoundingClientRect():{x:0,y:0,width:0,height:0},o="fixed"==e.style.position,d=o?new LX.vec2(r.x,r.y):new LX.vec2;l=l??t.clientX-a-r.x,n=n??t.clientY-i-r.y,e.style.left=clamp(l,s+d.x,d.x+r.width-e.offsetWidth-s)+"px",e.style.top=clamp(n,s+d.y,d.y+r.height-e.offsetHeight-s)+"px"};t.autoAdjust&&r(null,parseInt(e.style.left),parseInt(e.style.top));let o=LX.UTILS.uidGenerator();e["draggable-id"]=o;let d=e=>{n&&r(e)},c=e=>{n&&t.onMove&&t.onMove(n)},h=t.onMove?c:d,u=t.onDragStart;e.setAttribute("draggable",!0),e.addEventListener("mousedown",function(e){n=e.target.classList.contains(l)||!l?e.target:null}),e.addEventListener("dragstart",function(e){if(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),!n)return;var t=new Image;t.src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=",e.dataTransfer.setDragImage(t,0,0),e.dataTransfer.effectAllowed="move";let l=e.target.getBoundingClientRect(),s=n.parentElement.getBoundingClientRect(),r="fixed"==n.style.position,o=r?new LX.vec2(s.x,s.y):new LX.vec2;a=e.clientX-l.x-o.x,i=e.clientY-l.y-o.y,document.addEventListener("mousemove",h),u&&u(n,e)},!1),document.addEventListener("mouseup",()=>{n&&(n=null,document.removeEventListener("mousemove",h))})}function makeCodeSnippet(e,t,a={}){if(!LX.has("CodeEditor")){console.error("Import the CodeEditor component to create snippets!");return}let i=document.createElement("div");i.className="lexcodesnippet",i.style.width=t?t[0]:"auto",i.style.height=t?t[1]:"auto";let n=new Area({noAppend:!0}),l=new LX.CodeEditor(n,{skipInfo:!0,disableEdition:!0,allowAddScripts:!1,name:a.tabName});if(l.setText(e,a.language??"Plain Text"),a.linesAdded){let s=l.root.querySelector(".code");for(let r of a.linesAdded)if(r.constructor==Number)s.childNodes[r-1].classList.add("added");else if(r.constructor==Array)for(let o=r[0]-1;o<=r[1]-1;o++)s.childNodes[o].classList.add("added")}if(a.linesRemoved){let d=l.root.querySelector(".code");for(let c of a.linesRemoved)if(c.constructor==Number)d.childNodes[c-1].classList.add("removed");else if(c.constructor==Array)for(let h=c[0]-1;h<=c[1]-1;h++)d.childNodes[h].classList.add("removed")}if(a.windowMode){let u=document.createElement("div");u.className="lexwindowbuttons";let p=document.createElement("span");p.style.background="#ee4f50";let m=document.createElement("span");m.style.background="#f5b720";let g=document.createElement("span");g.style.background="#53ca29",u.appendChild(p),u.appendChild(m),u.appendChild(g);let f=l.root.querySelector(".lexareatabs");f.prepend(u)}return(a.lineNumbers??!0)||l.root.classList.add("no-gutter"),i.appendChild(n.root),i}function registerCommandbarEntry(e,t){LX.extraCommandbarEntries.push({name:e,callback:t})}LX.doAsync=doAsync,LX.getSupportedDOMName=getSupportedDOMName,LX.has=has,LX.getExtension=getExtension,LX.deepCopy=deepCopy,LX.setTheme=setTheme,LX.setThemeColor=setThemeColor,LX.getThemeColor=getThemeColor,LX.getBase64Image=getBase64Image,LX.hexToRgb=hexToRgb,LX.rgbToHex=rgbToHex,LX.measureRealWidth=measureRealWidth,LX.guidGenerator=simple_guidGenerator,LX.buildTextPattern=buildTextPattern,LX.makeDraggable=makeDraggable,LX.makeCodeSnippet=makeCodeSnippet,LX.registerCommandbarEntry=registerCommandbarEntry;class vec2{constructor(e,t){this.x=e??0,this.y=t??e??0}get xy(){return[this.x,this.y]}get yx(){return[this.y,this.x]}set(e,t){this.x=e,this.y=t}add(e,t=new vec2){return t.set(this.x+e.x,this.y+e.y),t}sub(e,t=new vec2){return t.set(this.x-e.x,this.y-e.y),t}mul(e,t=new vec2){return e.constructor==Number&&(e=new vec2(e)),t.set(this.x*e.x,this.y*e.y),t}div(e,t=new vec2){return e.constructor==Number&&(e=new vec2(e)),t.set(this.x/e.x,this.y/e.y),t}abs(e=new vec2){return e.set(Math.abs(this.x),Math.abs(this.y)),e}dot(e){return this.x*e.x+this.y*e.y}len2(){return this.dot(this)}len(){return Math.sqrt(this.len2())}nrm(e=new vec2){return e.set(this.x,this.y),e.mul(1/this.len(),e)}dst(e){return e.sub(this).len()}clp(e,t,a=new vec2){return a.set(clamp(this.x,e,t),clamp(this.y,e,t)),a}}function _createCommandbar(e){let t=document.createElement("dialog");t.className="commandbar",t.tabIndex=-1,e.appendChild(t);let a=[],i=null;t.addEventListener("keydown",function(e){if(e.stopPropagation(),e.stopImmediatePropagation(),i=i??-1,"Escape"==e.key)this.close(),p(!0);else if("Enter"==e.key){let n=a[i];if(n){let l=n.item.type&&"checkbox"===n.item.type;this.close(),l?(n.item.checked=!n.item.checked,n.callback.call(window,n.item.checked,n.entry_name)):n.callback.call(window,n.entry_name)}}else if("ArrowDown"==e.key&&i<a.length-1){i++,t.querySelectorAll(".hovered").forEach(e=>e.classList.remove("hovered")),a[i].classList.add("hovered");let s=a[i].offsetHeight*(i+1)-h.offsetHeight;s>0&&h.scrollTo({top:s,behavior:"smooth"})}else"ArrowUp"==e.key&&i>0&&(i--,t.querySelectorAll(".hovered").forEach(e=>e.classList.remove("hovered")),a[i].classList.add("hovered"))}),t.addEventListener("focusout",function(e){e.relatedTarget!=e.currentTarget&&(e.stopPropagation(),e.stopImmediatePropagation(),this.close(),p(!0))}),e.addEventListener("keydown",e=>{if(" "==e.key&&e.ctrlKey)e.stopImmediatePropagation(),e.stopPropagation(),LX.setCommandbarState(!0);else for(let t of LX.components){if(!LX[t]||!LX[t].prototype.onKeyPressed)continue;let a=LX.CodeEditor.getInstances();for(let i of a)i.onKeyPressed(e)}});let n=document.createElement("div");n.className="gs-header";let l=document.createElement("a");l.className="fa-solid fa-magnifying-glass",n.appendChild(l);let s=document.createElement("input");s.placeholder="Search...",s.value="",n.appendChild(s);let r=new Area({width:"100%",skipAppend:!0,className:"gs-tabs"}),o=r.addTabs(),d=null;{let c=(e,t)=>{d=t};o.add("All",document.createElement("div"),{selected:!0,onSelect:c})}let h=document.createElement("div");h.className="searchitembox";let u=null,p=e=>{h.innerHTML="",a.length=0,i=null,e&&(s.value="")},m=(e,n,l,s)=>{if(!e.length)return;u&&u.classList.remove("last");let r=document.createElement("div");r.className="searchitem last";let o=s&&s.type&&"checkbox"===s.type;o?r.innerHTML="<a class='fa fa-check'></a><span>"+(l+e)+"</span>":r.innerHTML=l+e,r.entry_name=e,r.callback=n,r.item=s,r.addEventListener("click",function(e){this.callback.call(window,this.entry_name),LX.setCommandbarState(!1),p(!0)}),r.addEventListener("mouseenter",function(e){t.querySelectorAll(".hovered").forEach(e=>e.classList.remove("hovered")),this.classList.add("hovered"),i=a.indexOf(this)}),r.addEventListener("mouseleave",function(e){this.classList.remove("hovered")}),a.push(r),h.appendChild(r),u=r},g=(e,t,a)=>{let i=Object.keys(e)[0];if((e.name??a+i).toLowerCase().includes(t)&&e.callback&&m(e.name??i,e.callback,a,e),!e.name)for(let n of(a+=i+" > ",e[i]))g(n,t,a)};return t._addElements=e=>{for(let t of(p(),LX.menubars))for(let a of t.items)g(a,e,"");for(let i of LX.extraCommandbarEntries){let n=i.name;n.toLowerCase().includes(e)&&m(n,i.callback,"",{})}if(LX.has("CodeEditor")){let l=LX.CodeEditor.getInstances();if(!l.length)return;let s=l[0].languages;for(let r of Object.keys(s)){let o="Language: "+r,d=l[0]._getFileIcon(null,s[r].ext),c=d.includes("fa-")?"<i class='"+d+"'></i>":"<img src='https://raw.githubusercontent.com/jxarco/lexgui.js/master/"+d+"'>";c+=o+" <span class='lang-ext'>("+s[r].ext+")</span>",o.toLowerCase().includes(e)&&m(c,()=>{for(let e of l)e._changeLanguage(r)},"",{})}}},s.addEventListener("input",function(e){t._addElements(this.value.toLowerCase())}),t.appendChild(n),t.appendChild(r.root),t.appendChild(h),t}function init(e={}){if(this.ready)return this.main_area;var t=document.createElement("div");t.id="lexroot",t.tabIndex=-1;var a=document.createElement("div");a.id="modal",this.modal=a,this.root=t,this.container=document.body,this.modal.classList.add("hiddenOpacity"),this.modal.toggle=function(e){this.classList.toggle("hiddenOpacity",e)},e.container&&(this.container=document.getElementById(e.container)),document.documentElement.setAttribute("data-strictVP",e.strictViewport??!0?"true":"false"),this.commandbar=_createCommandbar(this.container),this.container.appendChild(a),e.skipRoot?this.root=document.body:this.container.appendChild(t),t.addEventListener("dragover",function(e){e.preventDefault()},!1),document.addEventListener("contextmenu",function(e){e.preventDefault()},!1);var i=document.getElementsByTagName("HEAD")[0],n=document.createElement("link");return n.rel="stylesheet",n.type="text/css",n.crossOrigin="anonymous",n.href="https://use.fontawesome.com/releases/v6.7.2/css/all.css",i.appendChild(n),this.DEFAULT_NAME_WIDTH="30%",this.DEFAULT_SPLITBAR_SIZE=4,this.OPEN_CONTEXTMENU_ENTRY="click",this.ready=!0,this.menubars=[],e.skipRoot||e.skipDefaultArea||(this.main_area=new Area({id:e.id??"mainarea"})),(e.autoTheme??!0)&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches&&(LX.setTheme("light"),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{LX.setTheme(e.matches?"dark":"light")})),this.main_area}function setCommandbarState(e,t=!0){let a=this.commandbar;e?(a.show(),a.querySelector("input").focus(),t&&a._addElements(void 0)):a.close()}function message(e,t,a={}){if(!e)throw"No message to show";return a.modal=!0,new Dialog(t,t=>{t.addTextArea(null,e,null,{disabled:!0,fitHeight:!0})},a)}function popup(e,t,a={}){if(!e)throw"No message to show";a.size=a.size??["max-content","auto"],a.class="lexpopup";let i=a.timeout||3e3,n=new Dialog(t,t=>{t.addTextArea(null,e,null,{disabled:!0,fitHeight:!0})},a);return setTimeout(()=>{n.close()},Math.max(i,150)),n}function prompt(e,t,a,i={}){i.modal=!0;let n="",l=new Dialog(t,s=>{s.addTextArea(null,e,null,{disabled:!0,fitHeight:!0}),(i.input??!0)&&s.addText(null,i.input||n,e=>n=e,{placeholder:"..."}),s.sameLine(2),s.addButton(null,i.accept||"OK",()=>{i.required&&""===n?(e+=e.includes("You must fill the input text.")?"":"\nYou must fill the input text.",l.close(),prompt(e,t,a,i)):(a&&a.call(this,n),l.close())},{buttonClass:"primary"}),s.addButton(null,"Cancel",()=>{i.on_cancel&&i.on_cancel(),l.close()})},i);return(i.input??!0)&&l.root.querySelector("input").focus(),l}function badge(e,t,a={}){let i=document.createElement("div");return i.innerHTML=e,i.className="lexbadge "+(t??""),Object.assign(i.style,a.style??{}),i.outerHTML}function makeContainer(e,t,a={}){let i=document.createElement("div");return i.className="lexcontainer "+(t??""),i.style.width=e&&e[0]?e[0]:"100%",i.style.height=e&&e[1]?e[1]:"100%",Object.assign(i.style,a),i}LX.vec2=vec2,LX.init=init,LX.setCommandbarState=setCommandbarState,LX.message=message,LX.popup=popup,LX.prompt=prompt,LX.badge=badge,LX.makeContainer=makeContainer;class IEvent{constructor(e,t,a){this.name=e,this.value=t,this.domEvent=a}}LX.IEvent=IEvent;class TreeEvent{static NONE=0;static NODE_SELECTED=1;static NODE_DELETED=2;static NODE_DBLCLICKED=3;static NODE_CONTEXTMENU=4;static NODE_DRAGGED=5;static NODE_RENAMED=6;static NODE_VISIBILITY=7;static NODE_CARETCHANGED=8;constructor(e,t,a){this.type=e||TreeEvent.NONE,this.node=t,this.value=a,this.multiple=!1,this.panel=null}string(){switch(this.type){case TreeEvent.NONE:return"tree_event_none";case TreeEvent.NODE_SELECTED:return"tree_event_selected";case TreeEvent.NODE_DELETED:return"tree_event_deleted";case TreeEvent.NODE_DBLCLICKED:return"tree_event_dblclick";case TreeEvent.NODE_CONTEXTMENU:return"tree_event_contextmenu";case TreeEvent.NODE_DRAGGED:return"tree_event_dragged";case TreeEvent.NODE_RENAMED:return"tree_event_renamed";case TreeEvent.NODE_VISIBILITY:return"tree_event_visibility";case TreeEvent.NODE_CARETCHANGED:return"tree_event_caretchanged"}}}function emit(e,t,a={}){let i=LX.signals[e];if(!i)return;let n=a.target;if(n){n[e]&&n[e].call(n,t);return}for(let l of i)if(l.constructor===Widget)l.set(t,a.skipCallback??!0),l.options&&l.options.callback&&l.options.callback(t,i);else{let s=l;s(null,t)}}function addSignal(e,t,a){t[e]=a,LX.signals[e]||(LX.signals[e]=[]),!(LX.signals[e].indexOf(t)>-1)&&LX.signals[e].push(t)}LX.TreeEvent=TreeEvent,LX.emit=emit,LX.addSignal=addSignal;class Area{constructor(e={}){var t,a=document.createElement("div");a.className="lexarea",e.id&&(a.id=e.id),e.className&&(a.className+=" "+e.className);var i=e.width||"calc( 100% )",n=e.height||"100%";this.setLimitBox(e.minWidth,e.minHeight,e.maxWidth,e.maxHeight),i.constructor==Number&&(i+="px"),n.constructor==Number&&(n+="px"),a.style.width=i,a.style.height=n,this.offset=0,this.root=a,this.size=[this.root.offsetWidth,this.root.offsetHeight],this.sections=[],this.panels=[],!e.skipAppend&&document.getElementById("lexroot").appendChild(this.root);let l=e.overlay;if(l){this.root.classList.add("overlay-"+l),e.left?this.root.style.left=e.left:e.right?this.root.style.right=e.right:e.top?this.root.style.top=e.top:e.bottom&&(this.root.style.bottom=e.bottom);let s=e.draggable??!0;if(s&&makeDraggable(a,e),e.resizeable&&a.classList.add("resizeable"),e.resize){this.splitBar=document.createElement("div");let r="left"==l||"right"==l?"horizontal":"vertical";if(this.type=l,this.splitBar.className="lexsplitbar "+r,"right"==l)this.splitBar.style.width=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.style.left=-(LX.DEFAULT_SPLITBAR_SIZE/2)+"px";else if("left"==l){let o=Math.min(document.body.clientWidth-LX.DEFAULT_SPLITBAR_SIZE,this.root.clientWidth);this.splitBar.style.width=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.style.left=o+LX.DEFAULT_SPLITBAR_SIZE/2+"px"}else if("top"==l){let d=Math.min(document.body.clientHeight-LX.DEFAULT_SPLITBAR_SIZE,this.root.clientHeight);this.splitBar.style.height=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.style.top=d+LX.DEFAULT_SPLITBAR_SIZE/2+"px"}else"bottom"==l&&(this.splitBar.style.height=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.style.top=-(LX.DEFAULT_SPLITBAR_SIZE/2)+"px");this.splitBar.addEventListener("mousedown",u),this.root.appendChild(this.splitBar);var c=this,h=[0,0];function u(e){var t=c.root.ownerDocument;t.addEventListener("mousemove",p),t.addEventListener("mouseup",m),h[0]=e.x,h[1]=e.y,e.stopPropagation(),e.preventDefault(),document.body.classList.add("nocursor"),c.splitBar.classList.add("nocursor")}function p(e){switch(c.type){case"right":var t=h[0]-e.x,a=c.root.offsetWidth+t;c.root.style.width=a+"px";break;case"left":var t=h[0]-e.x,a=Math.min(document.body.clientWidth-LX.DEFAULT_SPLITBAR_SIZE,c.root.offsetWidth-t);c.root.style.width=a+"px",c.splitBar.style.left=a+LX.DEFAULT_SPLITBAR_SIZE/2+"px";break;case"top":var t=h[1]-e.y,a=Math.min(document.body.clientHeight-LX.DEFAULT_SPLITBAR_SIZE,c.root.offsetHeight-t);c.root.style.height=a+"px",c.splitBar.style.top=a+LX.DEFAULT_SPLITBAR_SIZE/2+"px";break;case"bottom":var t=h[1]-e.y,a=c.root.offsetHeight+t;c.root.style.height=a+"px"}h[0]=e.x,h[1]=e.y,e.stopPropagation(),e.preventDefault(),c.onresize&&c.onresize(c.root.getBoundingClientRect())}function m(e){var t=c.root.ownerDocument;t.removeEventListener("mousemove",p),t.removeEventListener("mouseup",m),document.body.classList.remove("nocursor"),c.splitBar.classList.remove("nocursor")}}}}attach(e){if(this.sections.length){this.sections[1].attach(e);return}if(!e)throw"no content to attach";e.parent=this;let t=e.root?e.root:e;this.root.appendChild(t)}split(e={}){this.sections.length&&(this.offset=this.root.childNodes[0].offsetHeight,this._root=this.sections[0].root,this.root=this.sections[1].root);var t=e.type||"horizontal",a=e.sizes||["50%","50%"],i="auto"===e.sizes;if(!a[1]){let n=a[0],l=e.top?e.top:0;n.constructor==Number&&(n+=l,n+="px"),a[1]="calc( 100% - "+n+" )"}var s=new Area({skipAppend:!0,className:"split"+(e.menubar||e.sidebar?"":" origin")}),r=new Area({skipAppend:!0,className:"split"});s.parentArea=this,r.parentArea=this;let o=e.minimizable??!1,d=(e.resize??!0)||o;var c="0px";if(this.offset=0,d&&(this.resize=d,this.splitBar=document.createElement("div"),this.splitBar.className="lexsplitbar "+t,"horizontal"==t?this.splitBar.style.width=LX.DEFAULT_SPLITBAR_SIZE+"px":this.splitBar.style.height=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.addEventListener("mousedown",function e(t){var a=f.root.ownerDocument;a.addEventListener("mousemove",v),a.addEventListener("mouseup",E),t.stopPropagation(),t.preventDefault(),document.body.classList.add("nocursor"),f.splitBar.classList.add("nocursor")}),c=LX.DEFAULT_SPLITBAR_SIZE/2+"px",o&&(this.splitExtended=!1,r.root.addEventListener("animationend",e=>{let a=getComputedStyle(r.root).opacity;r.root.classList.remove(e.animationName+"-"+t),r.root.style.opacity=a,flushCss(r.root)}),this.splitBar.addEventListener("contextmenu",e=>{e.preventDefault(),addContextMenu(null,e,e=>{e.add("Extend",{disabled:this.splitExtended,callback:()=>{this.extend()}}),e.add("Reduce",{disabled:!this.splitExtended,callback:()=>{this.reduce()}})})}))),"horizontal"==t){var h=a[0],u=a[1];h.constructor==Number&&(h+="px"),u.constructor==Number&&(u+="px"),s.root.style.width="calc( "+h+" - "+c+" )",s.root.style.height="calc(100% - 0px)",r.root.style.width="calc( "+u+" - "+c+" )",r.root.style.height="calc(100% - 0px)",this.root.style.display="flex"}else if(s.root.style.width="100%",r.root.style.width="100%",i){s.root.style.height="auto";let p=new ResizeObserver(e=>{for(let t of e){let a=t.contentRect;r.root.style.height="calc(100% - "+(a.height+4)+"px )"}});p.observe(s.root)}else{var m=a[0],g=a[1];m.constructor==Number&&(m+="px"),g.constructor==Number&&(g+="px"),s.root.style.width="100%",s.root.style.height="auto"==m?m:"calc( "+m+" - "+c+" )",r.root.style.height="auto"==g?g:"calc( "+g+" - "+c+" )"}if(this.root.appendChild(s.root),d&&this.root.appendChild(this.splitBar),this.root.appendChild(r.root),this.sections=[s,r],this.type=t,this._update(),!d)return this.sections;var f=this;function v(e){"horizontal"==f.type?f._moveSplit(-e.movementX):f._moveSplit(-e.movementY);let t=f.root.querySelectorAll(".lexwidget");for(let a of t){let i=a.jsInstance;i.onresize&&i.onresize()}e.stopPropagation(),e.preventDefault()}function E(e){var t=f.root.ownerDocument;t.removeEventListener("mousemove",v),t.removeEventListener("mouseup",E),document.body.classList.remove("nocursor"),f.splitBar.classList.remove("nocursor")}return this.sections}setLimitBox(e=0,t=0,a=1/0,i=1/0){this.minWidth=e,this.minHeight=t,this.maxWidth=a,this.maxHeight=i}setSize(e){let[t,a]=e;void 0!=t&&t.constructor==Number&&(t+="px"),void 0!=a&&a.constructor==Number&&(a+="px"),t&&(this.root.style.width=t),a&&(this.root.style.height=a),this.size=[this.root.clientWidth,this.root.clientHeight],this.propagateEvent("onresize")}extend(){if(this.splitExtended)return;let[e,t]=this.sections;this.splitExtended=!0,"vertical"==this.type?(this.offset=t.root.offsetHeight,t.root.classList.add("fadeout-vertical"),this._moveSplit(-1/0,!0)):(this.offset=t.root.offsetWidth-8,t.root.classList.add("fadeout-horizontal"),this._moveSplit(-1/0,!0,8)),doAsync(()=>this.propagateEvent("onresize"),150)}reduce(){if(!this.splitExtended)return;this.splitExtended=!1;let[e,t]=this.sections;"vertical"==this.type?(t.root.classList.add("fadein-vertical"),this._moveSplit(this.offset)):(t.root.classList.add("fadein-horizontal"),this._moveSplit(this.offset)),doAsync(()=>this.propagateEvent("onresize"),150)}hide(){this.root.classList.add("hidden")}show(){this.root.classList.remove("hidden")}toggle(e){this.root.classList.toggle("hidden",e)}propagateEvent(e){for(var t=0;t<this.sections.length;t++){let a=this.sections[t];a[e]&&a[e].call(this,a.root.getBoundingClientRect()),a.propagateEvent(e)}}addPanel(e){let t=new Panel(e);return this.attach(t),this.panels.push(t),t}addMenubar(e,t={}){let a=new Menubar(t);e&&e(a),LX.menubars.push(a);let[i,n]=this.split({type:"vertical",sizes:[48,null],resize:!1,menubar:!0});return i.attach(a),i.is_menubar=!0,a}addSidebar(e,t={}){let a=new SideBar(t);e&&e(a),LX.menubars.push(a);let[i,n]=this.split({type:"horizontal",sizes:[64,null],resize:!1,sidebar:!0});return i.attach(a),i.is_sidebar=!0,a}addOverlayButtons(e,t={}){if(this.sections.length){this.sections[1].addOverlayButtons(e,t);return}console.assert(e.constructor==Array&&e.length),this.root.style.position="relative",t.className="lexoverlaybuttons";let a=this.addPanel(t),i=null,n=document.createElement("div");n.className="lexoverlaybuttonscontainer",n.appendChild(a.root),this.attach(n);let l=t.float;if(l)for(var s=0;s<l.length;s++){let r=l[s];switch(r){case"h":case"t":case"l":break;case"v":n.className+=" vertical";break;case"m":n.className+=" middle";break;case"b":n.className+=" bottom";break;case"c":n.className+=" center";break;case"r":n.className+=" right"}}let o=function(e,t,n){let l={width:"auto",selectable:e.selectable,selected:e.selected,icon:e.icon,img:e.img,className:e.class};t&&(i||((i=document.createElement("div")).className="lexoverlaygroup",a.queuedContainer=i),l.parent=i);let s=e.callback;e.options?a.addDropdown(null,e.options,e.name,s,l):a.addButton(null,e.name,function(t,a){if(e.selectable){if(e.group){let i=e.selected;e.group.forEach(e=>e.selected=!1),e.selected=!i}else e.selected=!e.selected}s(t,a)},l),i&&n&&(a.root.appendChild(i),i=null,a.clearQueue())};!function(){for(let t of(a.clear(),e))if(t.constructor===Array)for(let i=0;i<t.length;++i){let s=t[i];s.group=t,o(s,!0,i==t.length-1)}else o(t);if(l){var r=0;a.root.childNodes.forEach(e=>{r+=e.offsetHeight}),n.className.includes("middle")&&(n.style.top="-moz-calc( 50% - "+.5*r+"px )",n.style.top="-webkit-calc( 50% - "+.5*r+"px )",n.style.top="calc( 50% - "+.5*r+"px )")}}()}addTabs(e={}){let t=new Tabs(this,e);return e.folding&&(this.parentArea._disableSplitResize(),this.root.style.paddingTop="4px"),t}_moveSplit(e,t=!1,a=0){if(!this.type)throw"No split area";if(void 0===e)return;let i=this.sections[0];var n=i.root;n.classList.contains("origin")||(n=n.parentElement);let l=this.sections[1],s=l.root,r=" - "+LX.DEFAULT_SPLITBAR_SIZE+"px",o=null;if(t||(o=n.style.transition,n.style.transition=s.style.transition="none",flushCss(n),flushCss(s)),"horizontal"==this.type){var d=Math.max(s.offsetWidth+e,parseInt(l.minWidth));a&&(d=a),n.style.width="-moz-calc( 100% - "+d+"px "+r+" )",n.style.width="-webkit-calc( 100% - "+d+"px "+r+" )",n.style.width="calc( 100% - "+d+"px "+r+" )",n.style.minWidth=parseInt(i.minWidth)+"px",s.style.width=d+"px",i.maxWidth!=1/0&&(s.style.minWidth="calc( 100% - "+parseInt(i.maxWidth)+"px )")}else{var d=Math.max(s.offsetHeight+e+l.offset,parseInt(l.minHeight));a&&(d=a),n.style.height="-moz-calc( 100% - "+d+"px "+r+" )",n.style.height="-webkit-calc( 100% - "+d+"px "+r+" )",n.style.height="calc( 100% - "+d+"px "+r+" )",n.style.minHeight=i.minHeight+"px",s.style.height=d-l.offset+"px"}t||(n.style.transition=s.style.transition=o),this._update(),this.propagateEvent("onresize")}_disableSplitResize(){this.resize=!1,this.splitBar.remove(),delete this.splitBar}_update(){let e=this.root.getBoundingClientRect();this.size=[e.width,e.height];for(var t=0;t<this.sections.length;t++)this.sections[t]._update()}}function flushCss(e){e.offsetHeight}LX.Area=Area;class Tabs{static TAB_SIZE=28;static TAB_ID=0;constructor(e,t={}){this.onclose=t.onclose;let a=document.createElement("div");a.className="lexareatabs "+(t.fit?"fit":"row");let i=t.folding??!1;i&&a.classList.add("folding");let n=this;if(a.addEventListener("dragenter",function(e){e.preventDefault(),this.classList.add("dockingtab")}),a.addEventListener("dragleave",function(e){e.preventDefault(),this.classList.remove("dockingtab")}),a.addEventListener("drop",function(e){e.preventDefault();let t=e.dataTransfer.getData("source"),a=document.getElementById(t);if(!a)return;this.appendChild(a);let i=document.getElementById(t+"_content");n.area.attach(i),this.classList.remove("dockingtab"),LX.emit("@on_tab_docked"),a.instance=n,a.click(),n.tabs[a.dataset.name]=i}),e.root.classList.add("lexareatabscontainer"),e.split({type:"vertical",sizes:t.sizes??"auto",resize:!1,top:6}),e.sections[0].attach(a),this.area=e.sections[1],this.area.root.className+=" lexareatabscontent",this.selected=null,this.root=a,this.tabs={},this.tabDOMs={},t.fit){let l=document.createElement("span");l.className="lexareatab thumb",this.thumb=l,this.root.appendChild(l);let s=new ResizeObserver(e=>{let t=this.thumb.item;if(t){var a=this.thumb.style.transition;this.thumb.style.transition="none",this.thumb.style.transform="translate( "+t.childIndex*t.offsetWidth+"px )",this.thumb.style.width=t.offsetWidth-5+"px",this.thumb.style.height=t.offsetHeight-6+"px",flushCss(this.thumb),this.thumb.style.transition=a}});s.observe(this.area.root)}if(i){this.folded=!0,this.folding=i,"up"==i&&e.root.insertChildAtIndex(e.sections[1].root,0);let r=new ResizeObserver(t=>{for(let a of t){let i=a.contentRect,n=e.parentArea.sections[0].root;n.style.height="calc(100% - "+(42+i.height)+"px )"}});r.observe(this.area.root),this.area.root.classList.add("folded")}}add(e,t,a={}){let i=a.selected??!1;i&&(this.root.querySelectorAll("span").forEach(e=>e.classList.remove("selected")),this.area.root.querySelectorAll(".lextabcontent").forEach(e=>e.style.display="none")),i=!Object.keys(this.tabs).length&&!this.folding||i;let n=t.root?t.root:t;n.originalDisplay=n.style.display,n.style.display=i?n.originalDisplay:"none",n.classList.add("lextabcontent"),a.icon&&(a.icon.includes("fa-")?a.icon="<i class='"+a.icon+"'></i>":a.icon="<img src='https://raw.githubusercontent.com/jxarco/lexgui.js/master/"+a.icon+"'>");let l=document.createElement("span");l.dataset.name=e,l.className="lexareatab"+(i?" selected":""),l.innerHTML=(a.icon??"")+e,l.id=e.replace(/\s/g,"")+Tabs.TAB_ID++,l.title=a.title??"",l.selected=i??!1,l.fixed=a.fixed,l.instance=this,n.id=l.id+"_content",l.selected&&(this.selected=e),LX.addSignal("@on_tab_docked",l,function(){1==this.parentElement.childNodes.length&&this.parentElement.childNodes[0].click()}),l.addEventListener("click",e=>{if(e.preventDefault(),e.stopPropagation(),!l.fixed){let t=l.selected;l.parentElement.querySelectorAll("span").forEach(e=>e.selected=!1),l.selected=!t,l.parentElement.querySelectorAll("span").forEach(e=>e.classList.remove("selected")),l.classList.toggle("selected",this.folding&&l.selected),l.instance.area.root.querySelectorAll(".lextabcontent").forEach(e=>e.style.display="none"),n.style.display=n.originalDisplay,l.instance.selected=l.dataset.name}this.folding&&(this.folded=l.selected,this.area.root.classList.toggle("folded",!this.folded)),a.onSelect&&a.onSelect(e,l.dataset.name),this.thumb&&(this.thumb.style.transform="translate( "+l.childIndex*l.offsetWidth+"px )",this.thumb.style.width=l.offsetWidth-5+"px",this.thumb.style.height=l.offsetHeight-6+"px",this.thumb.item=l)}),l.addEventListener("contextmenu",e=>{e.preventDefault(),e.stopPropagation(),a.onContextMenu&&a.onContextMenu(e,l.dataset.name)}),l.addEventListener("mouseup",e=>{e.preventDefault(),e.stopPropagation(),1==e.button&&this.delete(l.dataset.name)}),l.setAttribute("draggable",!0),l.addEventListener("dragstart",function(e){if(1==this.parentElement.childNodes.length){e.preventDefault();return}e.dataTransfer.setData("source",e.target.id)}),l.childIndex=this.root.childElementCount-1,this.root.appendChild(l),this.area.attach(n),this.tabDOMs[e]=l,this.tabs[e]=t,setTimeout(()=>{a.onCreate&&a.onCreate.call(this,this.area.root.getBoundingClientRect()),i&&this.thumb&&(this.thumb.style.transform="translate( "+l.childIndex*l.offsetWidth+"px )",this.thumb.style.width=l.offsetWidth-5+"px",this.thumb.style.height=l.offsetHeight-6+"px",this.thumb.item=l)},10)}select(e){this.tabDOMs[e]&&this.tabDOMs[e].click()}delete(e){let t=this.tabDOMs[e];if(!t||t.fixed)return;this.onclose&&this.onclose(e),this.tabDOMs[e].remove(),delete this.tabDOMs[e],this.tabs[e].remove(),delete this.tabs[e];let a=this.root.lastChild;a&&!a.fixed&&this.root.lastChild.click()}}LX.Tabs=Tabs;class Menubar{constructor(e={}){this.root=document.createElement("div"),this.root.className="lexmenubar",e.float&&(this.root.style.justifyContent=e.float),this.items=[],this.icons={},this.shorts={},this.buttons=[]}add(e,t={}){t.constructor==Function&&(t={callback:t});let a=e.split("/"),i=a[a.length-1];this.icons[i]=t.icon,this.shorts[i]=t.short;let n=0,l=this,s=(e,i)=>{if(void 0==e)return;let l=null;if(i.forEach(t=>{let a=Object.keys(t),i=a.find(t=>t==e);i&&(l=t[i])}),l)s(a[n++],l);else{let r={};r[e]=[];let o=a[n++];o||(r.callback=t.callback,r.type=t.type,r.checked=t.checked),i.push(r),s(o,r[e])}};for(let r of(s(a[n++],this.items),this.items)){let o=Object.keys(r)[0],d=o.replace(/\s/g,"").replaceAll(".","");if(this.root.querySelector("#"+d))continue;let c=document.createElement("div");c.className="lexmenuentry",c.id=d,c.innerHTML="<span>"+o+"</span>","left"==t.position?this.root.prepend(c):("right"==t.position&&(c.right=!0),this.root.lastChild&&this.root.lastChild.right?this.root.lastChild.before(c):this.root.appendChild(c));let h=function(e,t,a,i){let n=document.createElement("div");n.className="lexcontextmenu",n.tabIndex="0";let s=a.classList.contains("lexcontextmenuentry");var r=a.getBoundingClientRect();n.style.left=(s?r.width:r.left)+"px",n.style.top=(s?0:r.bottom-4)+"px",a.appendChild(n),n.focus(),r=n.getBoundingClientRect();for(var o=0;o<e[t].length;++o){let d=e[t][o],c=Object.keys(d)[0],u=d[c].length,p="checkbox"==d.type,m=document.createElement("div");if(m.className="lexcontextmenuentry",m.className+=o==e[t].length-1?" last":"",""==c)m.className=" lexseparator";else{m.id=c;let g=document.createElement("div");g.innerHTML="",g.classList="lexcontextmenuentrycontainer",m.appendChild(g);let f=l.icons[c];p?g.innerHTML+="<input type='checkbox' >":f?g.innerHTML+="<a class='"+f+" fa-sm'></a>":(g.innerHTML+="<a class='fa-solid fa-sm noicon'></a>",g.classList.add("noicon")),g.innerHTML+="<div class='lexentryname'>"+c+"</div>"}let v=m.querySelector("input");if(v&&(v.checked=d.checked??!1,v.addEventListener("change",e=>{d.checked=v.checked;let t=d.callback;t&&(t.call(this,d.checked,c,m),l.root.querySelectorAll(".lexcontextmenu").forEach(e=>e.remove())),e.stopPropagation(),e.stopImmediatePropagation()})),n.appendChild(m),""==c)continue;if(n.addEventListener("keydown",function(e){e.preventDefault();let t=l.shorts[c];t&&(t=1==t.length?t.toLowerCase():t)==e.key&&m.click()}),m.addEventListener("click",e=>{v&&(d.checked=!d.checked);let t=d.callback;t&&(t.call(this,v?d.checked:c,v?c:m),l.root.querySelectorAll(".lexcontextmenu").forEach(e=>e.remove())),e.stopPropagation(),e.stopImmediatePropagation()}),!u){if(l.shorts[c]){let E=document.createElement("div");E.className="lexentryshort",E.innerText=l.shorts[c],m.appendChild(E)}continue}let y=document.createElement("a");y.className="fa-solid fa-angle-right fa-xs",m.appendChild(y),m.addEventListener("mouseover",e=>{m.built||(m.built=!0,h(d,c,m,++i),e.stopPropagation())}),m.addEventListener("mouseleave",()=>{i=-1,delete m.built,n.querySelectorAll(".lexcontextmenu").forEach(e=>e.remove())})}n.style.width=n.offsetWidth+"px"};c.addEventListener("click",()=>{let e=r.callback;if(e){e.call(this,o,c);return}this.root.querySelectorAll(".lexmenuentry").forEach(e=>e.classList.remove("selected")),c.classList.add("selected"),this.root.querySelectorAll(".lexcontextmenu").forEach(e=>e.remove()),h(r,o,c,-1)}),c.addEventListener("mouseleave",()=>{this.root.querySelectorAll(".lexmenuentry").forEach(e=>e.classList.remove("selected")),this.root.querySelectorAll(".lexcontextmenu").forEach(e=>e.remove())})}}getButton(e){return this.buttons[e]}getSubitem(e,t){let a=null,i=t[0];for(let n=0;n<e.length;n++)if(e[n][i]){if(1==t.length)return e[n];return t.splice(0,1),this.getSubitem(e[n][i],t)}}getItem(e){let t=e.split("/");return this.getSubitem(this.items,t)}setButtonIcon(e,t,a,i={}){let n=this.buttons[e];if(n)n.querySelector("a").className="fa-solid "+t+" lexicon";else{let l=document.createElement("div"),s=i.disabled??!1;l.className="lexmenubutton"+(s?" disabled":""),l.title=e??"",l.innerHTML="<a class='"+t+" lexicon' style='font-size:x-large;'></a>",l.style.padding="5px 10px",l.style.maxHeight="calc(100% - 10px)",l.style.alignItems="center","right"==i.float&&(l.right=!0),this.root.lastChild&&this.root.lastChild.right?this.root.lastChild.before(l):"left"==i.float?this.root.prepend(l):this.root.appendChild(l);let r=l.querySelector("a");r.addEventListener("click",e=>{a&&!s&&a.call(this,r,e)})}}setButtonImage(e,t,a,i={}){let n=this.buttons[e];if(n)n.querySelector("a").className="fa-solid "+icon+" lexicon";else{let l=document.createElement("div"),s=i.disabled??!1;l.className="lexmenubutton"+(s?" disabled":""),l.title=e??"",l.innerHTML="<a><image src='"+t+"' class='lexicon' style='height:32px;'></a>",l.style.padding="5px",l.style.alignItems="center","right"==i.float&&(l.right=!0),this.root.lastChild&&this.root.lastChild.right?this.root.lastChild.before(l):"left"==i.float?this.root.prepend(l):this.root.appendChild(l);let r=l.querySelector("a");r.addEventListener("click",e=>{a&&!s&&a.call(this,r,e)})}}addButtons(e,t={}){if(!e)throw"No buttons to add!";this.buttonContainer||(this.buttonContainer=document.createElement("div"),this.buttonContainer.className="lexmenubuttons",this.buttonContainer.classList.add(t.float??"center"),"right"==t.position&&(this.buttonContainer.right=!0),this.root.lastChild&&this.root.lastChild.right?this.root.lastChild.before(this.buttonContainer):this.root.appendChild(this.buttonContainer));for(let a=0;a<e.length;++a){let i=e[a],n=document.createElement("label"),l=i.title,s=i.disabled??!1;n.className="lexmenubutton"+(s?" disabled":""),n.title=l??"",this.buttonContainer.appendChild(n);let r=document.createElement("a");r.className=i.icon+" lexicon",n.appendChild(r);let o=r;if(i.swap){n.classList.add("swap"),r.classList.add("swap-off");let d=document.createElement("input");d.type="checkbox",n.prepend(d),o=d;let c=document.createElement("a");c.className=i.swap+" swap-on lexicon",n.appendChild(c),n.swap=function(){let e=this.querySelector("input");e.checked=!e.checked},n.setState=function(e){let t=this.querySelector("input");t.checked=e}}o.addEventListener("click",e=>{if(i.callback&&!s){let t=n.querySelector("input");i.callback.call(this,e,t?.checked)}}),l&&(this.buttons[l]=n)}}}LX.Menubar=Menubar;class SideBar{constructor(e={}){this.root=document.createElement("div"),this.root.className="lexsidebar",this.footer=document.createElement("div"),this.footer.className="lexsidebarfooter",this.root.appendChild(this.footer),this.items=[]}add(e,t={}){t.constructor==Function&&(t={callback:t});let a=e.replace(/\s/g,"").replaceAll(".","");if(this.items.findIndex((e,t)=>e.key==a)>-1){console.warn(`'${e}' already created in Sidebar`);return}let i=document.createElement("div");i.className="lexsidebarentry "+(t.className??""),i.id=a,t.bottom?this.footer.appendChild(i):this.root.appendChild(i),this.root.appendChild(this.footer);let n=document.createElement("button");n.innerHTML="<i class='"+(t.icon??"")+"'></i>",i.appendChild(n);let l=document.createElement("span");l.className="lexsidebarentrydesc",l.innerHTML=e,i.appendChild(l),n.addEventListener("mouseenter",()=>{setTimeout(()=>{l.style.display="unset"},100)}),n.addEventListener("mouseleave",()=>{setTimeout(()=>{l.style.display="none"},100)}),i.addEventListener("click",()=>{let a=t.callback;a&&a.call(this,e,i),t.bottom||(this.root.querySelectorAll(".lexsidebarentry").forEach(e=>e.classList.remove("selected")),i.classList.add("selected"))}),this.items.push({name:a,domEl:i,callback:t.callback})}select(e){let t=e.replace(/\s/g,"").replaceAll(".",""),a=this.items.find(e=>e.name===t);a&&a.domEl.click()}}LX.SideBar=SideBar;class Widget{static NONE=0;static TEXT=1;static TEXTAREA=2;static BUTTON=3;static DROPDOWN=4;static CHECKBOX=5;static TOGGLE=6;static COLOR=7;static NUMBER=8;static TITLE=9;static VECTOR=10;static TREE=11;static PROGRESS=12;static FILE=13;static LAYERS=14;static ARRAY=15;static LIST=16;static TAGS=17;static CURVE=18;static CARD=19;static IMAGE=20;static CONTENT=21;static CUSTOM=22;static SEPARATOR=23;static KNOB=24;static SIZE=25;static PAD=26;static FORM=27;static DIAL=28;static COUNTER=29;static TABLE=30;static NO_CONTEXT_TYPES=[Widget.BUTTON,Widget.LIST,Widget.FILE,Widget.PROGRESS];constructor(e,t,a){this.name=e,this.type=t,this.options=a}value(){if(this.onGetValue)return this.onGetValue();console.warn("Can't get value of "+this.typeName())}set(e,t=!1,a=""){if(this.onSetValue)return this.onSetValue(e,t);console.warn("Can't set value of "+this.typeName())}oncontextmenu(e){Widget.NO_CONTEXT_TYPES.includes(this.type)||addContextMenu(this.typeName(),e,e=>{e.add("Copy",()=>{this.copy()}),e.add("Paste",{disabled:!this._can_paste(),callback:()=>{this.paste()}})})}copy(){navigator.clipboard.type=this.type,navigator.clipboard.customIdx=this.customIdx,navigator.clipboard.data=this.value(),navigator.clipboard.writeText(navigator.clipboard.data)}_can_paste(){return this.type===Widget.CUSTOM?void 0!==navigator.clipboard.customIdx&&this.customIdx==navigator.clipboard.customIdx:navigator.clipboard.type===this.type}paste(){this._can_paste()&&this.set(navigator.clipboard.data)}typeName(){switch(this.type){case Widget.TEXT:return"Text";case Widget.TEXTAREA:return"TextArea";case Widget.BUTTON:return"Button";case Widget.DROPDOWN:return"Dropdown";case Widget.CHECKBOX:return"Checkbox";case Widget.TOGGLE:return"Toggle";case Widget.COLOR:return"Color";case Widget.NUMBER:return"Number";case Widget.VECTOR:return"Vector";case Widget.TREE:return"Tree";case Widget.PROGRESS:return"Progress";case Widget.FILE:return"File";case Widget.LAYERS:return"Layers";case Widget.ARRAY:return"Array";case Widget.LIST:return"List";case Widget.TAGS:return"Tags";case Widget.CURVE:return"Curve";case Widget.KNOB:return"Knob";case Widget.SIZE:return"Size";case Widget.PAD:return"Pad";case Widget.FORM:return"Form";case Widget.DIAL:return"Dial";case Widget.COUNTER:return"Counter";case Widget.TABLE:return"Table";case Widget.CUSTOM:return this.customName}console.error(`Unknown Widget type: ${this.type}`)}refresh(){}}function ADD_CUSTOM_WIDGET(e,t={}){let a=simple_guidGenerator();Panel.prototype["add"+e]=function(i,n,l){let s=this.create_widget(i,Widget.CUSTOM,t);s.customName=e,s.customIdx=a,s.onGetValue=()=>n,s.onSetValue=(e,t)=>{n=e,h(),r.querySelector(".lexcustomitems").toggleAttribute("hidden",!1),t||this._trigger(new IEvent(i,n,null),l)};let r=s.domEl;r.style.flexWrap="wrap";let o,d,c=t.default??{},h=()=>{n&&(s.instance=n=Object.assign(deepCopy(c),n)),o&&o.remove(),d&&d.remove(),(o=document.createElement("div")).className="lexcustomcontainer",o.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")",this.queue(o);let a="<a class='fa-solid "+(t.icon??"fa-cube")+"' style='float:left'></a>";a+=e+(n?"":" [empty]"),a+="<a class='fa-solid "+(n?"fa-bars-staggered":" ")+" menu' style='float:right; width:5%;'></a>";let u=this.addButton(null,a,(t,a)=>{n?r.querySelector(".lexcustomitems").toggleAttribute("hidden"):addContextMenu(null,a,t=>{t.add("New "+e,()=>{n={},h(),r.querySelector(".lexcustomitems").toggleAttribute("hidden",!1)})})},{buttonClass:"custom"});if(this.clearQueue(),n&&u.querySelector("a.menu").addEventListener("click",e=>{e.stopImmediatePropagation(),e.stopPropagation(),addContextMenu(null,e,e=>{e.add("Clear",()=>{n=null,h()})})}),(d=document.createElement("div")).className="lexcustomitems",d.toggleAttribute("hidden",!0),r.appendChild(o),r.appendChild(d),n){this.queue(d);let p=(e,t,a)=>{n[e]=t,this._trigger(new IEvent(i,n,a),l)};for(let m in c){let g=n[m]??c[m];switch(g.constructor){case String:"#"===g[0]?this.addColor(m,g,p.bind(this,m)):this.addText(m,g,p.bind(this,m));break;case Number:this.addNumber(m,g,p.bind(this,m));break;case Boolean:this.addCheckbox(m,g,p.bind(this,m));break;case Array:g.length>4?this.addArray(m,g,p.bind(this,m)):this._add_vector(g.length,m,g,p.bind(this,m))}}this.clearQueue()}};h()}}LX.Widget=Widget,LX.ADD_CUSTOM_WIDGET=ADD_CUSTOM_WIDGET;class NodeTree{constructor(e,t,a){if(this.domEl=e,this.data=t,this.onevent=a.onevent,this.options=a,this.selected=[],t.constructor===Object)this._create_item(null,t);else for(let i of t)this._create_item(null,i)}_create_item(e,t,a=0,i){let n=this,l=this.domEl.querySelector("#lexnodetree_filter");if(t.children=t.children??[],l&&!t.id.includes(l.value)||void 0!=i&&i!=t.id){for(var s=0;s<t.children.length;++s)this._create_item(t,t.children[s],a+1,i);return}let r=this.domEl.querySelector("ul");t.visible=t.visible??!0,t.parent=e;let o=t.children.length>0,d=this.selected.indexOf(t)>-1||t.selected;if(this.options.onlyFolders){let c=!1;t.children.forEach(e=>c|="folder"==e.type),o=!!c}let h=document.createElement("li");h.className="lextreeitem datalevel"+a+(o?" parent":"")+(d?" selected":""),h.id=LX.getSupportedDOMName(t.id),h.tabIndex="0";let u=this.options.skip_default_icon??!0?"":"fa-solid fa-square";o&&(u=t.closed?"fa-solid fa-caret-right":"fa-solid fa-caret-down"),h.innerHTML="<a class='"+u+" hierarchy'></a>",u=t.icon,t.icon&&(t.icon.includes("fa-")?h.innerHTML+="<a class='"+t.icon+" tree-item-icon'></a>":h.innerHTML+="<img src='https://raw.githubusercontent.com/jxarco/lexgui.js/master/"+t.icon+"'>"),h.innerHTML+=t.rename?"":t.id,h.setAttribute("draggable",!0),h.style.paddingLeft=(o?0:3)+(3+(a+1)*15)+"px",r.appendChild(h),h.addEventListener("click",e=>{if(m){m=!1;return}e.shiftKey||(r.querySelectorAll("li").forEach(e=>{e.classList.remove("selected")}),this.selected.length=0);let a=this.selected.indexOf(t);if(a>-1?(h.classList.remove("selected"),this.selected.splice(a,1)):(h.classList.add("selected"),this.selected.push(t)),o&&t.id.length>1){if(t.closed=!1,n.onevent){let i=new TreeEvent(TreeEvent.NODE_CARETCHANGED,t,t.closed);n.onevent(i)}n.frefresh(t.id)}if(n.onevent){let l=new TreeEvent(TreeEvent.NODE_SELECTED,e.shiftKey?this.selected:t);l.multiple=e.shiftKey,n.onevent(l)}}),h.addEventListener("dblclick",function(){if((n.options.rename??!0)&&(t.rename=!0,n.refresh()),n.onevent){let e=new TreeEvent(TreeEvent.NODE_DBLCLICKED,t);n.onevent(e)}}),h.addEventListener("contextmenu",e=>{if(e.preventDefault(),n.onevent)return;let a=new TreeEvent(TreeEvent.NODE_CONTEXTMENU,this.selected.length>1?this.selected:t,e);a.multiple=this.selected.length>1,LX.addContextMenu(a.multiple?"Selected Nodes":a.node.id,a.value,e=>{a.panel=e}),n.onevent(a),(this.options.addDefault??!1)==!0&&(a.panel.items&&a.panel.add(""),a.panel.add("Select Children",()=>{let e=t=>{if(!t.closed)for(let a of t.children??[]){if(a)this.domEl.querySelector("#"+a.id).classList.add("selected"),this.selected.push(a),e(a)}};e(t)}),a.panel.add("Delete",{callback:()=>{if(!t.parent)return;if(n.onevent){let a=new TreeEvent(TreeEvent.NODE_DELETED,t,e);n.onevent(a)}let i=t.parent.children,l=i.indexOf(t);i.splice(l,1),this.refresh()}}))}),h.addEventListener("keydown",e=>{if(!t.rename){if(e.preventDefault(),"Delete"==e.key){if(n.onevent){let a=new TreeEvent(TreeEvent.NODE_DELETED,this.selected.length>1?this.selected:t,e);a.multiple=this.selected.length>1,n.onevent(a)}for(let i of this.selected){let l=i.parent.children,s=l.indexOf(i);l.splice(s,1)}this.selected.length=0,this.refresh()}else if("ArrowUp"==e.key||"ArrowDown"==e.key){var r=this.selected.length>1?"ArrowUp"==e.key?this.selected.shift():this.selected.pop():this.selected[0],o=this.domEl.querySelector("#"+LX.getSupportedDOMName(r.id)),d="ArrowUp"==e.key?o.previousSibling:o.nextSibling;d&&d.click()}}});let p=document.createElement("input");p.toggleAttribute("hidden",!t.rename),p.value=t.id,h.appendChild(p),t.rename&&(h.classList.add("selected"),p.focus()),p.addEventListener("keyup",function(e){if("Enter"==e.key){if(this.value=this.value.replace(/\s/g,"_"),n.onevent){let a=new TreeEvent(TreeEvent.NODE_RENAMED,t,this.value);n.onevent(a)}t.id=LX.getSupportedDOMName(this.value),delete t.rename,n.frefresh(t.id),r.querySelector("#"+t.id).classList.add("selected")}"Escape"==e.key&&(delete t.rename,n.frefresh(t.id))}),p.addEventListener("blur",function(e){delete t.rename,n.refresh()}),(this.options.draggable??!0)&&(e&&h.addEventListener("dragstart",e=>{window.__tree_node_dragged=t}),h.addEventListener("dragover",e=>{e.preventDefault()},!1),h.addEventListener("dragenter",e=>{e.target.classList.add("draggingover")}),h.addEventListener("dragleave",e=>{e.target.classList.remove("draggingover")}),h.addEventListener("drop",e=>{e.preventDefault();let a=window.__tree_node_dragged;if(!a)return;let i=t;if(a.id==i.id){console.warn("Cannot parent node to itself!");return}let l=function(e,t){var a=!1;for(var i of t.children){if(i.id==e.id)return!0;a|=l(e,i)}return a};if(l(i,a)){console.warn("Cannot parent node to a current child!");return}if(n.onevent){let s=new TreeEvent(TreeEvent.NODE_DRAGGED,a,i);n.onevent(s)}let r=a.parent.children.findIndex(e=>e.id==a.id),o=a.parent.children.splice(r,1);i.children.push(o[0]),n.refresh(),delete window.__tree_node_dragged}));let m=!1;if(o&&h.querySelector("a.hierarchy").addEventListener("click",function(e){if(m=!0,e.stopImmediatePropagation(),e.stopPropagation(),t.closed=!t.closed,n.onevent){let a=new TreeEvent(TreeEvent.NODE_CARETCHANGED,t,t.closed);n.onevent(a)}n.frefresh(t.id)}),!t.skipVisibility){let g=document.createElement("a");g.className="itemicon fa-solid fa-eye"+(t.visible?"":"-slash"),g.title="Toggle visible",g.addEventListener("click",function(e){if(e.stopPropagation(),t.visible=void 0!==t.visible&&!t.visible,this.className="itemicon fa-solid fa-eye"+(t.visible?"":"-slash"),n.onevent){let a=new TreeEvent(TreeEvent.NODE_VISIBILITY,t,t.visible);n.onevent(a)}}),h.appendChild(g)}if(t.actions)for(var s=0;s<t.actions.length;++s){let f=t.actions[s];var v=document.createElement("a");v.className="itemicon "+f.icon,v.title=f.name,v.addEventListener("click",function(e){f.callback(t,v),e.stopPropagation()}),h.appendChild(v)}if(void 0!=i&&t.id==i&&(this.selected=[t],h.click()),!t.closed)for(var s=0;s<t.children.length;++s){let E=t.children[s];this.options.onlyFolders&&"folder"!=E.type||this._create_item(t,E,a+1)}}refresh(e,t){this.data=e??this.data,this.domEl.querySelector("ul").innerHTML="",this._create_item(null,this.data,0,t)}frefresh(e){this.refresh();var t=this.domEl.querySelector("#"+e);t&&t.focus()}select(e){this.refresh(null,e)}}class Panel{constructor(e={}){var t=document.createElement("div");t.className="lexpanel",e.id&&(t.id=e.id),e.className&&(t.className+=" "+e.className),t.style.width=e.width||"calc( 100% - 6px )",t.style.height=e.height||"100%",Object.assign(t.style,e.style??{}),this._inline_widgets_left=-1,this._inline_queued_container=null,this.root=t,this.onevent=e=>{},this.branch_open=!1,this.branches=[],this.current_branch=null,this.widgets={},this._queue=[]}get(e){return this.widgets[e]}getValue(e){let t=this.widgets[e];if(!t)throw"No widget called "+e;return t.value()}setValue(e,t,a){let i=this.widgets[e];if(!i)throw"No widget called "+e;return i.set(t,a)}attach(e){if(!e)throw"no content to attach";e.parent=this;let t=e.root?e.root:e;this.root.appendChild(t)}clear(){for(let e in this.branch_open=!1,this.branches=[],this.current_branch=null,this.widgets)if(this.widgets[e].options&&this.widgets[e].options.signal){let t=this.widgets[e].options.signal;for(let a=0;a<LX.signals[t].length;a++)LX.signals[t][a]==this.widgets[e]&&(LX.signals[t]=[...LX.signals[t].slice(0,a),...LX.signals[t].slice(a+1)])}if(this.signals)for(let i=0;i<this.signals.length;i++){let n=Object.values(this.signals[i])[0],l=n.options.signal;for(let s=0;s<LX.signals[l].length;s++)LX.signals[l][s]==n&&(LX.signals[l]=[...LX.signals[l].slice(0,s),...LX.signals[l].slice(s+1)])}this.widgets={},this.root.innerHTML=""}sameLine(e){this._inline_queued_container=this.queuedContainer,this._inline_widgets_left=e||1/0}endLine(e){if(-1==this._inline_widgets_left){console.warn("No pending widgets to be inlined!");return}for(let t of(this._inline_widgets_left=-1,!this._inlineContainer&&(this._inlineContainer=document.createElement("div"),this._inlineContainer.className="lexinlinewidgets",e&&(this._inlineContainer.style.justifyContent=e)),this._inlineWidgets)){let a=t.constructor==Array;a?this._inline_queued_container?this._inlineContainer.appendChild(t[0]):t[1].appendChild(t[0]):this._inlineContainer.appendChild(t)}this._inline_queued_container?this._inline_queued_container.appendChild(this._inlineContainer):this.current_branch?this.current_branch.content.appendChild(this._inlineContainer):this.root.appendChild(this._inlineContainer),delete this._inlineWidgets,delete this._inlineContainer}branch(e,t={}){this.branch_open&&this.merge();var a=new Branch(e,t);return a.panel=this,this.branch_open=!0,this.current_branch=a,0==this.branches.length&&a.root.classList.add("first"),this.root.querySelectorAll(".lexbranch.last").forEach(e=>{e.classList.remove("last")}),a.root.classList.add("last"),this.branches.push(a),this.root.appendChild(a.root),t.filter&&this._addFilter(t.filter,{callback:this._searchWidgets.bind(this,a.name)}),a}merge(){this.branch_open=!1,this.current_branch=null}_pick(e,t){return void 0===e?t:e}static _dispatch_event(e,t,a,i,n){let l=new CustomEvent(t,{detail:a,bubbles:i,cancelable:n});e.dispatchEvent(l)}static _add_reset_property(e,t){var a=document.createElement("a");return a.style.display="none",a.style.marginRight="6px",a.className="lexicon fa fa-rotate-left",a.addEventListener("click",t),e.appendChild(a),a}create_widget(e,t,a={}){let i=new Widget(e,t,a),n=document.createElement("div");if(n.className="lexwidget",n.id=a.id??"",n.title=a.title??"",a.className&&(n.className+=" "+a.className),t!=Widget.TITLE&&(n.style.width="calc(100% - "+(this.current_branch||t==Widget.FILE?10:20)+"px)",a.width&&(n.style.width=n.style.minWidth=a.width),a.maxWidth&&(n.style.maxWidth=a.maxWidth),a.minWidth&&(n.style.minWidth=a.minWidth),a.height&&(n.style.height=n.style.minHeight=a.height)),void 0!=e){if(!a.hideName){let l=document.createElement("div");l.className="lexwidgetname",a.justifyName&&l.classList.add("float-"+a.justifyName),l.innerHTML=e||"",l.title=a.title??l.innerHTML,l.style.width=a.nameWidth||LX.DEFAULT_NAME_WIDTH,n.appendChild(l),n.domName=l,l.addEventListener("contextmenu",function(e){e.preventDefault(),i.oncontextmenu(e)})}this.widgets[e]=i}return a.signal&&(e||(this.signals||(this.signals=[]),this.signals.push({[a.signal]:i})),LX.addSignal(a.signal,i)),i.domEl=n,n.jsInstance=i,this._inline_widgets_left>0&&!a.skipInlineCount?(this._inlineWidgets||(this._inlineWidgets=[]),(e=>{this.queuedContainer?this._inlineWidgets.push([e,this.queuedContainer]):this._inlineWidgets.push(e)})(n),this._inline_widgets_left--,this._inline_widgets_left||this.endLine()):(e=>{a.container?a.container.appendChild(e):this.queuedContainer?this.queuedContainer.appendChild(e):this.current_branch?(a.skipWidget||this.current_branch.widgets.push(i),this.current_branch.content.appendChild(e)):(e.classList.add("nobranch"),this.root.appendChild(e))})(n),i}_addFilter(e,t={}){t.placeholder=e.constructor==String?e:"Filter properties..",t.skipWidget=t.skipWidget??!0,t.skipInlineCount=!0;let a=this.create_widget(null,Widget.TEXT,t).domEl;a.className+=" lexfilter noname";let i=document.createElement("input");i.className="lexinput-filter",i.setAttribute("placeholder",t.placeholder),i.style.width="calc( 100% - 17px )",i.value=t.filterValue||"";let n=document.createElement("a");return n.className="fa-solid fa-magnifying-glass",a.appendChild(n),a.appendChild(i),i.addEventListener("input",e=>{t.callback&&t.callback(i.value,e)}),a}_searchWidgets(e,t){for(let a of this.branches){if(a.name!==e)continue;for(let i of a.widgets)i.domEl.classList.contains("lexfilter")||i.domEl.remove();this.queue(a.content);let n=!t.length;for(let l of a.widgets){if(!n){if(!l.name)continue;t.toLowerCase();let s=l.name.toLowerCase();if(!s.includes(t))continue}this.queuedContainer.appendChild(l.domEl)}this.clearQueue();return}}_filterOptions(e,t){let a=!t.length,i=[];for(let n=0;n<e.length;n++){let l=e[n];if(!a){let s="string"==typeof l?l:l.value,r=t.toLowerCase(),o=s.toLowerCase();if(!o.includes(r))continue}i.push(l)}this.refresh(i)}_trigger(e,t){t&&t.call(this,e.value,e.domEvent,e.name),this.onevent&&this.onevent.call(this,e)}getBranch(e){return e?this.branches.find(t=>t.name==e):this.current_branch}queue(e){!e&&this.current_branch&&(e=this.current_branch.root),this.queuedContainer&&this._queue.push(this.queuedContainer),this.queuedContainer=e}clearQueue(){if(this._queue&&this._queue.length){this.queuedContainer=this._queue.pop();return}delete this.queuedContainer}addBlank(e=8,t){let a=this.create_widget(null,Widget.addBlank);return a.domEl.className+=" blank",a.domEl.style.height=e+"px",t&&(a.domEl.style.width=t),a}addTitle(e,t={}){if(!e)throw"Can't create Title without text!";let a=this.create_widget(null,Widget.TITLE,t).domEl;if(a.className="lextitle",t.icon){let i=document.createElement("a");i.className=t.icon,i.style.color=t.iconColor||"",a.appendChild(i)}let n=document.createElement("span");if(n.innerText=e,a.appendChild(n),Object.assign(a.style,t.style??{}),void 0!=t.link){let l=document.createElement("a");l.innerText=e,l.href=t.link,l.target=t.target??"",l.className="lextitle link",Object.assign(l.style,t.style??{}),a.replaceWith(l)}return a}addText(e,t,a,i={}){let n=this.create_widget(e,Widget.TEXT,i);n.onGetValue=()=>r.value,n.onSetValue=(e,t)=>{this.disabled?r.innerText=e:r.value=e,Panel._dispatch_event(r,"focusout",t)},n.valid=()=>{if(""==r.pattern)return!0;let e=RegExp(r.pattern);return e.test(r.value)};let l=n.domEl;n.name&&!i.skipReset&&Panel._add_reset_property(l.domName,function(){r.value=r.iValue,this.style.display="none",Panel._dispatch_event(r,"focusout")});let s=document.createElement("div");s.className="lextext"+(i.warning?" lexwarning":""),s.style.width=i.inputWidth||"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+" )",s.style.display="flex",i.textClass&&s.classList.add(i.textClass),this.disabled=(i.disabled||i.warning)??!!i.url;let r=null;if(this.disabled){r=document.createElement(i.url?"a":"div"),i.url&&(r.href=i.url,r.target="_blank");let o=i.warning?'<i class="fa-solid fa-triangle-exclamation"></i>':"";r.innerHTML=o+t||"",r.style.width="100%",r.style.textAlign=i.float??""}else{(r=document.createElement("input")).type=i.type||"",r.value=r.iValue=t||"",r.style.width="100%",r.style.textAlign=i.float??"",r.setAttribute("placeholder",i.placeholder??""),i.required&&r.setAttribute("required",i.required),i.pattern&&r.setAttribute("pattern",i.pattern);var d=(function(t,i){if(!n.valid())return;let s=i.detail,o=l.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=t!=r.iValue?"block":"none"),s||this._trigger(new IEvent(e,t,i),a)}).bind(this);let c=i.trigger??"default";if("default"==c?(r.addEventListener("keyup",function(e){"Enter"==e.key&&d(e.target.value,e)}),r.addEventListener("focusout",function(e){d(e.target.value,e)})):"input"==c&&r.addEventListener("input",function(e){d(e.target.value,e)}),r.addEventListener("mousedown",function(e){e.stopImmediatePropagation(),e.stopPropagation()}),i.icon){let h=document.createElement("a");h.className="inputicon "+i.icon,s.appendChild(h)}}return Object.assign(r.style,i.style??{}),s.appendChild(r),l.appendChild(s),n.name||(l.className+=" noname",s.style.width="100%"),n}addTextArea(e,t,a,i={}){let n=this.create_widget(e,Widget.TEXTAREA,i);n.onGetValue=()=>r.value,n.onSetValue=(e,t)=>{r.value=e,Panel._dispatch_event(r,"focusout",t)};let l=n.domEl;n.name&&!i.skipReset&&Panel._add_reset_property(l.domName,function(){r.value=r.iValue,this.style.display="none",Panel._dispatch_event(r,"focusout")});let s=document.createElement("div");s.className="lextextarea",s.style.width=i.inputWidth||"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+" )",s.style.height=i.height,s.style.display="flex";let r=document.createElement("textarea");r.value=r.iValue=t||"",r.style.width="100%",r.style.textAlign=i.float??"",Object.assign(r.style,i.style??{}),i.disabled&&r.setAttribute("disabled",!0),i.placeholder&&r.setAttribute("placeholder",i.placeholder);var o=(function(t,i){let n=i.detail,s=l.querySelector(".lexwidgetname .lexicon");s&&(s.style.display=t!=r.iValue?"block":"none"),n||this._trigger(new IEvent(e,t,i),a)}).bind(this);let d=i.trigger??"default";if("default"==d?(r.addEventListener("keyup",function(e){"Enter"==e.key&&o(e.target.value,e)}),r.addEventListener("focusout",function(e){o(e.target.value,e)})):"input"==d&&r.addEventListener("input",function(e){o(e.target.value,e)}),i.icon){let c=document.createElement("a");c.className="inputicon "+i.icon,s.appendChild(c)}return s.appendChild(r),l.appendChild(s),n.name||(l.className+=" noname",s.style.width="100%"),doAsync(()=>{i.fitHeight&&(r.style.height=r.scrollHeight+"px")},10),n}addLabel(e,t={}){return t.disabled=!0,this.addText(null,e,null,t)}addButton(e,t,a,i={}){let n=this.create_widget(e,Widget.BUTTON,i);n.onGetValue=()=>s.innerText,n.onSetValue=(e,t)=>{s.innerHTML=i.icon?"<a class='"+i.icon+"'></a>":i.img?"<img src='"+i.img+"'>":"<span>"+(e||"")+"</span>"};let l=n.domEl;var s=document.createElement("button");return s.title=i.title??"",s.className="lexbutton "+(i.buttonClass??""),i.selected&&s.classList.add("selected"),s.innerHTML=i.icon?"<a class='"+i.icon+"'></a>":i.img?"<img src='"+i.img+"'>":"<span>"+(t||"")+"</span>",s.style.width="calc( 100% - "+(i.nameWidth??LX.DEFAULT_NAME_WIDTH)+")",i.disabled&&s.setAttribute("disabled",!0),s.addEventListener("click",n=>{i.selectable&&(i.parent&&i.parent.querySelectorAll(".lexbutton.selected").forEach(e=>{e!=s&&e.classList.remove("selected")}),s.classList.toggle("selected")),this._trigger(new IEvent(e,t,n),a)}),l.appendChild(s),n.name||(s.className+=" noname",s.style.width="100%"),l}addComboButtons(e,t,a={}){let i=this.create_widget(e,Widget.BUTTON,a),n=i.domEl,l=this,s=document.createElement("div");s.className="lexcombobuttons ",a.float&&(s.className+=a.float),s.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let r=document.createElement("div");r.className="lexcombobuttonsbox ";let o=!a.noSelection;for(let d of t){if(!d.value)throw"Set 'value' for each button!";let c=document.createElement("button");c.className="lexbutton combo",c.title=d.icon?d.value:"",c.id=d.id??"",a.buttonClass&&c.classList.add(a.buttonClass),o&&a.selected==d.value&&c.classList.add("selected"),c.innerHTML=(d.icon?"<a class='"+d.icon+"'></a>":"")+"<span>"+(d.icon?"":d.value)+"</span>",a.disabled&&c.setAttribute("disabled",!0),c.addEventListener("click",function(t){o&&(s.querySelectorAll("button").forEach(e=>e.classList.remove("selected")),this.classList.add("selected")),l._trigger(new IEvent(e,d.value,t),d.callback)}),r.appendChild(c)}return i.name||(n.className+=" noname",s.style.width="100%"),s.appendChild(r),n.appendChild(s),i}addCard(e,t={}){t.hideName=!0;let a=this.create_widget(e,Widget.CARD,t),i=a.domEl,n=document.createElement("div");if(n.className="lexcard",n.style.width="100%",t.img){let l=document.createElement("img");l.src=t.img,n.appendChild(l),void 0!=t.link&&(l.style.cursor="pointer",l.addEventListener("click",function(){let e=n.querySelector("a");e&&e.click()}))}let s=document.createElement("span");if(s.innerText=e,void 0!=t.link){let r=document.createElement("a");r.innerText=e,r.href=t.link,r.target=t.target??"",s.innerText="",s.appendChild(r)}return n.appendChild(s),t.callback&&(n.style.cursor="pointer",n.addEventListener("click",a=>{this._trigger(new IEvent(e,null,a),t.callback)})),i.appendChild(n),a}addForm(e,t,a,i={}){if(t.constructor!=Object){console.error("Form data must be an Object");return}i.hideName=!0;let n=this.create_widget(e,Widget.FORM,i);n.onGetValue=()=>s.formData,n.onSetValue=(e,t)=>{s.formData=e;let a=s.querySelectorAll(".lexwidget");for(let i=0;i<a.length;++i){let n=a[i];if(n.jsInstance.type!=LX.Widget.TEXT)continue;let l=a[i].querySelector(".lexwidgetname").innerText,r=a[i].querySelector(".lextext input");r.value=e[l]??"",Panel._dispatch_event(r,"focusout",t)}};let l=n.domEl,s=document.createElement("div");for(let r in s.className="lexformdata",this.queue(s),s.formData={},t){let o=t[r];o.constructor!=Object&&(o={}),o.placeholder=o.placeholder??r,o.width="calc(100% - 10px)",this.addLabel(r,{textClass:"formlabel"}),o.textWidget=this.addText(null,o.constructor==Object?o.value:o,e=>{s.formData[r]=e},o),s.formData[r]=o.constructor==Object?o.value:o}return this.addBlank(),this.addButton(null,i.actionName??"Submit",(e,i)=>{for(let n in t)if(!t[n].textWidget.valid())return;a&&a(s.formData,i)},{buttonClass:"primary",width:"calc(100% - 10px)"}),this.clearQueue(),l.appendChild(s),(!n.name||i.hideName)&&(l.className+=" noname",s.style.width="100%"),n}addContent(e,t={}){if(!e)return;if(e.constructor==String){let a=document.createElement("div");a.innerHTML=e,e=a.childElementCount>1?a:a.firstElementChild}let i=this.create_widget(null,Widget.CONTENT,t);return i.domEl.appendChild(e),i}async addImage(e,t={}){if(!e)return;t.hideName=!0;let a=this.create_widget(null,Widget.IMAGE,t),i=a.domEl,n=document.createElement("div");n.className="leximage",n.style.width="100%";let l=document.createElement("img");for(let s in l.src=e,t.style)l.style[s]=t.style[s];return await l.decode(),n.appendChild(l),i.appendChild(n),a}addDropdown(e,t,a,i,n={}){let l=this.create_widget(e,Widget.DROPDOWN,n);l.onGetValue=()=>s.querySelector("li.selected").getAttribute("value"),l.onSetValue=(t,n)=>{let l=s.querySelector(".lexwidgetname .lexicon");l&&(l.style.display=t!=d.iValue?"block":"none"),a=t,m.querySelectorAll("li").forEach(e=>{e.getAttribute("value")==a&&e.click()}),n||this._trigger(new IEvent(e,a,null),i)};let s=l.domEl,r=this;l.name&&!n.skipReset&&Panel._add_reset_property(s.domName,function(){a=d.iValue,m.querySelectorAll("li").forEach(e=>{e.getAttribute("value")==a&&e.click()}),this.style.display="none"});let o=document.createElement("div");o.className="lexdropdown",o.style.width=n.inputWidth||"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let d=document.createElement("div");d.className="lexdropdown lexoption",d.name=e,d.iValue=a;let c=a;c+="<a class='fa-solid fa-angle-down' style='float:right; margin-right: 3px;'></a>",this.queue(o);let h=e=>{console.log("Replacing container");let t=e.getParentArea(),a=u.getBoundingClientRect(),i=e.parentElement.closest("dialog");{let n=e.offsetHeight,l=a.y,s=window.innerHeight;if(t){let r=t.getBoundingClientRect();s=r.y+r.height}if(i){let o=i.getBoundingClientRect();l-=o.y}e.style.top=l+u.offsetHeight+"px";let d=l+n>s;d&&(e.style.top=l-n+"px",e.classList.add("place-above"))}{let c=e.offsetWidth,h=a.x;if(e.style.minWidth=a.width+"px",i){let p=i.getBoundingClientRect();h-=p.x}e.style.left=h+"px";let m=window.innerWidth;if(t){let g=t.getBoundingClientRect();m=g.x+g.width}let f=h+c>m;f&&(e.style.left=h-(c-a.width)+"px")}},u=this.addButton(null,c,(e,t)=>{if(m.unfocus_event){delete m.unfocus_event;return}p.classList.remove("place-above");let a=p.hasAttribute("open");a?p.close():(p.show(),h(p)),g&&g.querySelector("input").focus()},{buttonClass:"array",skipInlineCount:!0,disabled:n.disabled});this.clearQueue(),u.style.width="100%",u.refresh=e=>{""==u.querySelector("span").innerText?u.querySelector("span").innerText=e:u.querySelector("span").innerHTML=u.querySelector("span").innerHTML.replaceAll(u.querySelector("span").innerText,e)};let p=document.createElement("dialog");p.className="lexdropdownoptions";let m=document.createElement("ul");m.tabIndex=-1,m.className="lexoptions",p.appendChild(m),m.addEventListener("focusout",function(e){if(e.stopPropagation(),e.stopImmediatePropagation(),e.relatedTarget===u.querySelector("button"))this.unfocus_event=!0,setTimeout(()=>delete this.unfocus_event,200);else if(e.relatedTarget&&"INPUT"==e.relatedTarget.tagName)return;else if("lexinput-filter"==e.target.className)return;p.close()});let g=null;n.filter&&(g=this._addFilter(n.placeholder??"Search...",{container:m,callback:this._filterOptions.bind(m,t)}),m.appendChild(g),g.addEventListener("focusout",function(e){!(e.relatedTarget&&"UL"==e.relatedTarget.tagName&&e.relatedTarget.classList.contains("lexoptions"))&&p.close()}));let f=document.createElement("span");return f.style.height="calc(100% - 25px)",m.appendChild(f),m.refresh=n=>{if(f.innerHTML="",!n.length){let l=n.emptyMsg??"No options found.",o=document.createElement("div");o.className="option",o.style.flexDirection="unset",o.innerHTML=l;let c=document.createElement("li");c.className="lexdropdownitem empty",c.appendChild(o),f.appendChild(c);return}for(let h=0;h<n.length;h++){let v=n[h],E=document.createElement("li"),y=document.createElement("div");if(y.className="option",E.appendChild(y),E.addEventListener("click",n=>{p.close();let l=s.querySelector(".lexoptions .selected");l&&l.classList.remove("selected"),a=n.currentTarget.getAttribute("value"),n.currentTarget.toggleAttribute("hidden",!1),n.currentTarget.classList.add("selected"),u.refresh(a);let o=s.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=a!=d.iValue?"block":"none"),r._trigger(new IEvent(e,a,null),i),g&&(g.querySelector("input").value="",this._filterOptions.bind(m,t,"")())}),v.constructor!=Object)y.style.flexDirection="unset",y.innerHTML="</a><span>"+v+"</span><a class='fa-solid fa-check'>",y.value=v,E.setAttribute("value",v),E.className="lexdropdownitem",v==a&&(E.classList.add("selected"),d.innerHTML=v);else{let $=document.createElement("img");$.src=v.src,E.setAttribute("value",v.value),E.className="lexlistitem",y.innerText=v.value,y.className+=" media",y.prepend($),y.setAttribute("value",v.value),y.setAttribute("data-index",h),y.setAttribute("data-src",v.src),y.setAttribute("title",v.value),a==v.value&&E.classList.add("selected")}f.appendChild(E)}},m.refresh(t),o.appendChild(p),s.appendChild(o),l.name||(s.className+=" noname",o.style.width="100%"),l}addCurve(e,t,a,i={}){if(!e)throw"Set Widget Name!";let n=this,l=this.create_widget(e,Widget.CURVE,i);l.onGetValue=()=>JSON.parse(JSON.stringify(d.element.value)),l.onSetValue=(t,i)=>{let l=s.querySelector(".lexwidgetname .lexicon");l&&(l.style.display=t!=d.element.value?"block":"none"),d.element.value=JSON.parse(JSON.stringify(t)),d.redraw(),i||n._trigger(new IEvent(e,d.element.value,null),a)};let s=l.domEl,r=JSON.parse(JSON.stringify(t));i.skipReset||Panel._add_reset_property(s.domName,function(t){this.style.display="none",d.element.value=JSON.parse(JSON.stringify(r)),d.redraw(),n._trigger(new IEvent(e,d.element.value,t),a)});var o=document.createElement("div");o.className="lexcurve",o.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")",i.callback=(t,i)=>{let l=s.querySelector(".lexwidgetname .lexicon");l&&(l.style.display=t!=r?"block":"none"),n._trigger(new IEvent(e,t,i),a)},i.name=e;let d=new Curve(this,t,i);return o.appendChild(d.element),s.appendChild(o),l.onresize=d.redraw.bind(d),l.curveInstance=d,doAsync(()=>{d.canvas.width=o.offsetWidth,d.redraw()}),l}addDial(e,t,a,i={}){let n=this,l=this.create_widget(e,Widget.DIAL,i);l.onGetValue=()=>JSON.parse(JSON.stringify(d.element.value)),l.onSetValue=(t,i)=>{let l=s.querySelector(".lexwidgetname .lexicon");l&&(l.style.display=t!=d.element.value?"block":"none"),d.element.value=JSON.parse(JSON.stringify(t)),d.redraw(),i||n._trigger(new IEvent(e,d.element.value,null),a)};let s=l.domEl,r=JSON.parse(JSON.stringify(t));l.name&&!i.skipReset&&Panel._add_reset_property(s.domName,function(t){this.style.display="none",d.element.value=JSON.parse(JSON.stringify(r)),d.redraw(),n._trigger(new IEvent(e,d.element.value,t),a)});var o=document.createElement("div");o.className="lexcurve",o.style.width=l.name?"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")":"100%",i.callback=(t,i)=>{let l=s.querySelector(".lexwidgetname .lexicon");l&&(l.style.display=t!=r?"block":"none"),n._trigger(new IEvent(e,t,i),a)},i.name=e;let d=new Dial(this,t,i);return o.appendChild(d.element),s.appendChild(o),l.onresize=d.redraw.bind(d),l.curveInstance=d,doAsync(()=>{d.element.style.height=d.element.offsetWidth+"px",d.canvas.width=d.element.offsetWidth,o.style.width=d.element.offsetWidth+"px",d.canvas.height=d.canvas.width,d.redraw()}),l}addLayers(e,t,a,i={}){if(!e)throw"Set Widget Name!";let n=this,l=this.create_widget(e,Widget.LAYERS,i);l.onGetValue=()=>s.value,l.onSetValue=(i,l)=>{let r=s.querySelector(".lexwidgetname .lexicon");r&&(r.style.display=i!=o?"block":"none"),t=s.value=i,d(),l||n._trigger(new IEvent(e,t),a)};let s=l.domEl;Panel._add_reset_property(s.domName,function(i){this.style.display="none",t=s.value=o,d(),n._trigger(new IEvent(e,t,i),a)});var r=document.createElement("div");r.className="lexlayers",r.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let o=s.value=t,d=()=>{r.innerHTML="";let i=t.toString(2),n=i.length;for(var l=0;l<16-n;++l)i="0"+i;for(let d=0;d<16;++d){let c=document.createElement("div");if(c.className="lexlayer",void 0!=t){let h=i[16-d-1];void 0!=h&&"1"==h&&c.classList.add("selected")}c.innerText=d+1,c.title="Bit "+d+", value "+(1<<d),r.appendChild(c),c.addEventListener("click",i=>{i.stopPropagation(),i.stopImmediatePropagation(),i.target.classList.toggle("selected"),t^=1<<d,s.value=t;let n=s.querySelector(".lexwidgetname .lexicon");n&&(n.style.display=t!=o?"block":"none"),this._trigger(new IEvent(e,t,i),a)})}};return d(),s.appendChild(r),l}addArray(e,t=[],a,i={}){if(!e)throw"Set Widget Name!";let n=this.create_widget(e,Widget.ARRAY,i);n.onGetValue=()=>{let e=l.querySelectorAll("input"),t=[];for(var a of e)t.push(a.value);return t},n.onSetValue=(i,n)=>{t=i,c(),n||this._trigger(new IEvent(e,t,null),a)};let l=n.domEl;l.style.flexWrap="wrap";var s=document.createElement("div");s.className="lexarray",s.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")",this.queue(s);let r="<a class='fa-solid fa-angle-down' style='float:right; margin-right: 3px;'></a>",o="Array (size "+t.length+")";o+=r,this.addButton(null,o,()=>{l.querySelector(".lexarrayitems").toggleAttribute("hidden")},{buttonClass:"array"}),this.clearQueue();let d=document.createElement("div");d.className="lexarrayitems",d.toggleAttribute("hidden",!0),l.appendChild(s),l.appendChild(d);let c=()=>{let n=l.querySelector(".lexbutton.array span");n.innerHTML="Array (size "+t.length+")",n.innerHTML+=r,d.innerHTML="",this.queue(d);for(let s=0;s<t.length;++s){let h=t[s],u=i.innerValues?"dropdown":h.constructor;switch(this.sameLine(2),u){case String:this.addText(s+"",h,function(e,i){t[s]=e,a(t)},{nameWidth:"4%",inputWidth:"95%",skipReset:!0});break;case Number:this.addNumber(s+"",h,function(e,i){t[s]=e,a(t)},{nameWidth:"4%",inputWidth:"95%",skipReset:!0});break;case"dropdown":this.addDropdown(s+"",i.innerValues,h,function(e,i){t[s]=e,a(t)},{nameWidth:"4%",inputWidth:"95%",skipReset:!0})}this.addButton(null,"<a class='lexicon fa-solid fa-trash'></a>",(i,n)=>{t.splice(t.indexOf(h),1),c(),this._trigger(new IEvent(e,t,n),a)},{title:"Remove item",className:"micro"})}o="Add item",o+="<a class='fa-solid fa-plus' style='float:right; margin-right: 3px; margin-top: 2px;'></a>",this.addButton(null,o,(n,l)=>{t.push(i.innerValues?i.innerValues[0]:""),c(),this._trigger(new IEvent(e,t,l),a)},{buttonClass:"array"}),this.clearQueue()};return c(),n}addList(e,t,a,i,n={}){let l=this.create_widget(e,Widget.LIST,n);l.onGetValue=()=>a,l.onSetValue=(n,l)=>{r.querySelectorAll(".lexlistitem").forEach(e=>e.classList.remove("selected"));let s=t.indexOf(n);-1==s||(r.children[s].classList.toggle("selected"),a=n,l||this._trigger(new IEvent(e,n),i))},l.updateValues=n=>{t=n,r.innerHTML="";for(let l=0;l<t.length;++l){let s=null,o=t[l];o.constructor===Array&&(s=o[1],o=o[0]);let d=document.createElement("div");d.className="lexlistitem"+(a==o?" selected":""),d.innerHTML="<span>"+o+"</span>"+(s?"<a class='"+s+"'></a>":""),d.addEventListener("click",t=>{r.querySelectorAll(".lexlistitem").forEach(e=>e.classList.remove("selected")),d.classList.toggle("selected"),a=o,this._trigger(new IEvent(e,o,t),i)}),r.appendChild(d)}};let s=l.domEl,r=document.createElement("div");return r.className="lexlist",r.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")",l.updateValues(t),l.name||(s.className+=" noname",r.style.width="100%"),s.appendChild(r),l}addTags(e,t,a,i={}){let n=[].concat(t=t.replace(/\s/g,"").split(",")),l=this.create_widget(e,Widget.TAGS,i);l.onGetValue=()=>[].concat(t),l.onSetValue=(i,l)=>{t=[].concat(i),d();let o=s.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=i!=n?"block":"none"),l||r._trigger(new IEvent(e,t),a)};let s=l.domEl,r=this;l.name&&Panel._add_reset_property(s.domName,function(i){this.style.display="none",t=[].concat(n),d(),r._trigger(new IEvent(e,t,i),a)});let o=document.createElement("div");o.className="lextags",o.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let d=()=>{o.innerHTML="";for(let i=0;i<t.length;++i){let l=t[i],c=document.createElement("span");c.className="lextag",c.innerHTML=l;let h=document.createElement("a");h.className="lextagrmb fa-solid fa-xmark lexicon",c.appendChild(h),h.addEventListener("click",i=>{c.remove(),t.splice(t.indexOf(l),1);let o=s.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=t!=n?"block":"none"),r._trigger(new IEvent(e,t,i),a)}),o.appendChild(c)}let u=document.createElement("input");u.value="",u.placeholder="Add tag...",o.appendChild(u),u.onkeydown=function(i){let n=this.value.replace(/\s/g,"");if(" "==i.key||"Enter"==i.key){if(i.preventDefault(),!n.length||t.indexOf(n)>-1)return;t.push(n),d();let l=s.querySelector(".lexwidgetname .lexicon");l&&(l.style.display="block"),r._trigger(new IEvent(e,t,i),a)}},u.focus()};return d(),l.name||(s.className+=" noname",o.style.width="100%"),s.appendChild(o),l}addCheckbox(e,t,a,i={}){if(!e)throw"Set Widget Name!";let n=this.create_widget(e,Widget.CHECKBOX,i);n.onGetValue=()=>r.checked,n.onSetValue=(e,t)=>{r.checked!==e&&(r.checked=e,Panel._dispatch_event(r,"change",t))};let l=n.domEl;Panel._add_reset_property(l.domName,function(){r.checked=!r.checked,Panel._dispatch_event(r,"change")});var s=document.createElement("div");s.className="lexcheckboxcont";let r=document.createElement("input");r.type="checkbox",r.className="lexcheckbox "+(i.className??""),r.checked=t,r.iValue=t,r.disabled=i.disabled??!1;let o=document.createElement("span");if(o.className="checkboxtext",o.innerHTML="On",s.appendChild(r),s.appendChild(o),r.addEventListener("change",t=>{let i=t.detail?.constructor==Number?null:t.detail;if(!i){let n=l.querySelector(".lexwidgetname .lexicon");n&&(n.style.display=r.checked!=r.iValue?"block":"none")}let s=l.querySelector(".lexcheckboxsubmenu");s&&s.toggleAttribute("hidden",!r.checked),i||this._trigger(new IEvent(e,r.checked,t),a)}),l.appendChild(s),i.suboptions){l.style.flexWrap="wrap";let d=document.createElement("div");d.className="lexcheckboxsubmenu",d.toggleAttribute("hidden",!r.checked),this.queue(d),i.suboptions.call(this,this),this.clearQueue(),l.appendChild(d)}return n}addToggle(e,t,a,i={}){if(!e)throw"Set Widget Name!";let n=this.create_widget(e,Widget.TOGGLE,i);n.onGetValue=()=>r.checked,n.onSetValue=(e,t)=>{r.checked!==e&&(r.checked=e,Panel._dispatch_event(r,"change",t))};let l=n.domEl;Panel._add_reset_property(l.domName,function(){r.checked=!r.checked,Panel._dispatch_event(r,"change")});var s=document.createElement("div");s.className="lextogglecont";let r=document.createElement("input");r.type="checkbox",r.className="lextoggle "+(i.className??""),r.checked=t,r.iValue=t,r.disabled=i.disabled??!1;let o=document.createElement("span");if(o.className="toggletext",o.innerHTML="On",s.appendChild(r),s.appendChild(o),r.addEventListener("change",t=>{let i=t.detail?.constructor==Number?null:t.detail;if(!i){let n=l.querySelector(".lexwidgetname .lexicon");n&&(n.style.display=r.checked!=r.iValue?"block":"none")}let s=l.querySelector(".lextogglesubmenu");s&&s.toggleAttribute("hidden",!r.checked),i||this._trigger(new IEvent(e,r.checked,t),a)}),l.appendChild(s),i.suboptions){l.style.flexWrap="wrap";let d=document.createElement("div");d.className="lextogglesubmenu",d.toggleAttribute("hidden",!r.checked),this.queue(d),i.suboptions.call(this,this),this.clearQueue(),l.appendChild(d)}return n}addColor(e,t,a,i={}){if(!e)throw"Set Widget Name!";let n=this.create_widget(e,Widget.COLOR,i);n.onGetValue=()=>o.value,n.onSetValue=(e,t)=>{o.value=e,Panel._dispatch_event(o,"input",t)};let l=n.domEl,s=!1;Panel._add_reset_property(l.domName,function(){this.style.display="none",o.value=o.iValue,Panel._dispatch_event(o,"input")});var r=document.createElement("span");r.className="lexcolor",r.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let o=document.createElement("input");o.style.width="32px",o.type="color",o.className="colorinput",o.id="color"+simple_guidGenerator(),o.useRGB=i.useRGB??!1,o.value=o.iValue=t.constructor===Array?rgbToHex(t):t,i.disabled&&(o.disabled=!0),o.addEventListener("input",t=>{let i=t.target.value,n=t.detail;if(s||d.set(i),!n){let r=l.querySelector(".lexwidgetname .lexicon");r&&(r.style.display=i!=o.iValue?"block":"none")}o.useRGB&&(i=hexToRgb(i)),n||this._trigger(new IEvent(e,i,t),a)},!1),r.appendChild(o),this.queue(r);let d=this.addText(null,o.value,e=>{s=!0,n.set(e),s=!1},{width:"calc( 100% - 32px )"});return d.domEl.style.marginLeft="4px",this.clearQueue(),l.appendChild(r),n}addNumber(e,t,a,i={}){let n=this.create_widget(e,Widget.NUMBER,i);n.onGetValue=()=>+o.value,n.onSetValue=(e,t)=>{o.value=round(e,i.precision),Panel._dispatch_event(o,"change",t)};let l=n.domEl;n.name&&Panel._add_reset_property(l.domName,function(){this.style.display="none",o.value=o.iValue,Panel._dispatch_event(o,"change")});var s=document.createElement("div");s.className="lexnumber",s.style.width=i.inputWidth||"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let r=document.createElement("div");r.className="numberbox";let o=document.createElement("input");if(o.id="number_"+simple_guidGenerator(),o.className="vecinput",o.min=i.min??-1e24,o.max=i.max??1e24,o.step=i.step??"any",o.type="number",t.constructor==Number&&(t=clamp(t,+o.min,+o.max),t=round(t,i.precision)),o.value=o.iValue=t,r.appendChild(o),i.units){let d=document.createElement("span");d.className="lexunit",d.innerText=i.units,d.style.left=measureRealWidth(o.value)+"px",o.unitSpan=d,r.appendChild(d)}let c=document.createElement("a");if(c.className="fa-solid fa-arrows-up-down drag-icon hidden",r.appendChild(c),i.disabled&&(o.disabled=!0),!i.skipSlider&&void 0!==i.min&&void 0!==i.max){let h=document.createElement("input");h.className="lexinputslider",h.min=i.min,h.max=i.max,h.step=i.step??1,h.type="range",h.value=t,h.addEventListener("input",function(e){let t=+this.valueAsNumber;o.value=round(t,i.precision),Panel._dispatch_event(o,"change")},!1),h.addEventListener("mousedown",function(e){i.onPress&&i.onPress.bind(h)(e,h)},!1),h.addEventListener("mouseup",function(e){i.onRelease&&i.onRelease.bind(h)(e,h)},!1),r.appendChild(h),n.setLimits=(e,t,a)=>{o.min=h.min=e??o.min,o.max=h.max=t??o.max,o.step=a??o.step,h.step=a??h.step,Panel._dispatch_event(o,"change",!0)}}o.addEventListener("input",function(e){let t=+this.valueAsNumber;o.value=round(t,i.precision),i.units&&(o.unitSpan.style.left=measureRealWidth(o.value)+"px")},!1),o.addEventListener("wheel",function(e){if(e.preventDefault(),this!==document.activeElement)return;let t=i.step??1;e.shiftKey?t*=10:e.altKey&&(t*=.1);let a=+this.valueAsNumber-t*(e.deltaY>0?1:-1);this.value=round(a,i.precision),Panel._dispatch_event(o,"change")},{passive:!1}),o.addEventListener("change",t=>{if(isNaN(t.target.valueAsNumber))return;let n=t.detail,s=t.target.value=clamp(+t.target.valueAsNumber,+o.min,+o.max);if(s=i.precision?round(s,i.precision):s,r.querySelector(".lexinputslider")&&(r.querySelector(".lexinputslider").value=s),o.value=s,i.units&&(o.unitSpan.style.left=measureRealWidth(o.value)+"px"),!n){let d=l.querySelector(".lexwidgetname .lexicon");d&&(d.style.display=s!=o.iValue?"block":"none")}n||this._trigger(new IEvent(e,s,t),a)},{passive:!1}),o.addEventListener("mousedown",function e(t){if(document.activeElement!=o){var a=u.root.ownerDocument;a.addEventListener("mousemove",p),a.addEventListener("mouseup",m),document.body.classList.add("noevents"),c.classList.remove("hidden"),t.stopImmediatePropagation(),t.stopPropagation(),document.pointerLockElement||o.requestPointerLock(),i.onPress&&i.onPress.bind(o)(t,o)}});var u=this;function p(e){let t=-e.movementY;if(0!=t){let a=i.step??1;e.shiftKey?a*=10:e.altKey&&(a*=.1);let n=+o.valueAsNumber+a*t;o.value=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,"$1"),Panel._dispatch_event(o,"change")}e.stopPropagation(),e.preventDefault()}function m(e){var t=u.root.ownerDocument;t.removeEventListener("mousemove",p),t.removeEventListener("mouseup",m),document.body.classList.remove("noevents"),c.classList.add("hidden"),document.pointerLockElement&&document.exitPointerLock(),i.onRelease&&i.onRelease.bind(o)(e,o)}return s.appendChild(r),l.appendChild(s),n.name||(l.className+=" noname",s.style.width="100%"),n}static VECTOR_COMPONENTS={0:"x",1:"y",2:"z",3:"w"};_add_vector(e,t,a,i,n={}){if(e=clamp(e,2,4),a=a??Array(e).fill(0),!t)throw"Set Widget Name!";let l=this.create_widget(t,Widget.VECTOR,n);l.onGetValue=()=>{let e=s.querySelectorAll("input"),t=[];for(var a of e)t.push(+a.value);return t},l.onSetValue=(e,t)=>{let a=s.querySelectorAll(".vecinput");if(a.length==e.length){console.error("Input length does not match vector length.");return}for(let i=0;i<a.length;++i){let l=e[i];a[i].value=round(l,n.precision)??0,Panel._dispatch_event(a[i],"change",t)}};let s=l.domEl;Panel._add_reset_property(s.domName,function(){for(let e of(this.style.display="none",s.querySelectorAll(".vecinput")))e.value=e.iValue,Panel._dispatch_event(e,"change")});var r=document.createElement("div");r.className="lexvector",r.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";for(let o=0;o<e;++o){let d=document.createElement("div");d.className="vecbox",d.innerHTML="<span class='"+Panel.VECTOR_COMPONENTS[o]+"'></span>";let c=document.createElement("input");c.className="vecinput v"+e,c.min=n.min??-1e24,c.max=n.max??1e24,c.step=n.step??"any",c.type="number",c.id="vec"+e+"_"+simple_guidGenerator(),c.idx=o,a[o].constructor==Number&&(a[o]=clamp(a[o],+c.min,+c.max),a[o]=round(a[o],n.precision)),c.value=c.iValue=a[o];let h=document.createElement("a");h.className="fa-solid fa-arrows-up-down drag-icon hidden",d.appendChild(h),n.disabled&&(c.disabled=!0),c.addEventListener("wheel",function(e){if(e.preventDefault(),this!==document.activeElement)return;let t=n.step??1;if(e.shiftKey?t=10:e.altKey&&(t=.1),f.locked)for(let a of s.querySelectorAll(".vecinput"))a.value=round(+a.valueAsNumber-t*(e.deltaY>0?1:-1),n.precision),Panel._dispatch_event(a,"change");else this.value=round(+this.valueAsNumber-t*(e.deltaY>0?1:-1),n.precision),Panel._dispatch_event(c,"change")},{passive:!1}),c.addEventListener("change",e=>{if(isNaN(e.target.value))return;let l=e.detail,r=e.target.value=clamp(e.target.value,+c.min,+c.max);if(r=round(r,n.precision),!l){let o=s.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=r!=c.iValue?"block":"none")}if(f.locked)for(let d of s.querySelectorAll(".vecinput"))d.value=r,a[d.idx]=r;else c.value=r,a[e.target.idx]=r;l||this._trigger(new IEvent(t,a,e),i)},!1),c.addEventListener("mousedown",p);var u=this;function p(e){if(document.activeElement!=c){var t=u.root.ownerDocument;t.addEventListener("mousemove",m),t.addEventListener("mouseup",g),document.body.classList.add("noevents"),h.classList.remove("hidden"),e.stopImmediatePropagation(),e.stopPropagation(),document.pointerLockElement||c.requestPointerLock(),n.onPress&&n.onPress.bind(c)(e,c)}}function m(e){let t=-e.movementY;if(0!=t){let a=n.step??1;if(e.shiftKey?a=10:e.altKey&&(a=.1),f.locked)for(let i of s.querySelectorAll(".vecinput"))i.value=round(+i.valueAsNumber+a*t,n.precision),Panel._dispatch_event(i,"change");else c.value=round(+c.valueAsNumber+a*t,n.precision),Panel._dispatch_event(c,"change")}e.stopPropagation(),e.preventDefault()}function g(e){var t=u.root.ownerDocument;t.removeEventListener("mousemove",m),t.removeEventListener("mouseup",g),document.body.classList.remove("noevents"),h.classList.add("hidden"),document.pointerLockElement&&document.exitPointerLock(),n.onRelease&&n.onRelease.bind(c)(e,c)}d.appendChild(c),r.appendChild(d)}(void 0!==n.min||void 0!==n.max)&&(l.setLimits=(e,n,l)=>{let r=s.querySelectorAll(".vecinput");for(let o of r)o.min=e??o.min,o.max=n??o.max,o.step=l??o.step,Panel._dispatch_event(o,"change",!0);this._trigger(new IEvent(t,a),i)});let f=document.createElement("a");return f.title="Lock",f.className="fa-solid fa-lock-open lexicon lock",r.appendChild(f),f.addEventListener("click",function(e){this.locked=!this.locked,this.locked?(this.classList.add("fa-lock"),this.classList.remove("fa-lock-open")):(this.classList.add("fa-lock-open"),this.classList.remove("fa-lock"))},!1),s.appendChild(r),l}addVector2(e,t,a,i){return this._add_vector(2,e,t,a,i)}addVector3(e,t,a,i){return this._add_vector(3,e,t,a,i)}addVector4(e,t,a,i){return this._add_vector(4,e,t,a,i)}addSize(e,t,a,i={}){let n=this.create_widget(e,Widget.SIZE,i);n.onGetValue=()=>{let e=[];for(let t=0;t<l.dimensions.length;++t)e.push(l.dimensions[t].onGetValue());return e},n.onSetValue=(e,t)=>{for(let a=0;a<l.dimensions.length;++a)l.dimensions[a].onSetValue(e[a],t)};let l=n.domEl;this.queue(l),l.aspectRatio=2==t.length?t[0]/t[1]:null,l.dimensions=[];for(let s=0;s<t.length;++s)if(l.dimensions[s]=this.addNumber(null,t[s],e=>{let t=n.onGetValue();if(l.locked){let i=0==s?1/l.aspectRatio:l.aspectRatio,r=(1+s)%2;t[r]=e*i,l.dimensions[r].onSetValue(t[r],!0)}a&&a(t)},{min:0,disabled:i.disabled,precision:i.precision}),s+1!=t.length){let r=document.createElement("a");r.className="lexsizecross fa-solid fa-xmark",l.appendChild(r)}if(this.clearQueue(),i.units){let o=document.createElement("span");o.className="lexunit",o.innerText=i.units,l.appendChild(o)}if(l.aspectRatio){let d=document.createElement("a");d.title="Lock Aspect Ratio",d.className="fa-solid fa-lock-open lexicon lock",l.appendChild(d),d.addEventListener("click",function(e){if(l.locked=!l.locked,l.locked){this.classList.add("fa-lock"),this.classList.remove("fa-lock-open");let t=n.onGetValue();l.aspectRatio=t[0]/t[1]}else this.classList.add("fa-lock-open"),this.classList.remove("fa-lock")},!1)}return n.name||(l.className+=" noname",container.style.width="100%"),n}addPad(e,t,a,i={}){if(!e)throw"Set Widget Name!";let n=this.create_widget(e,Widget.PAD,i);n.onGetValue=()=>o.value.xy,n.onSetValue=(t,i)=>{o.value.set(t[0],t[1]),d(o.value),i||this._trigger(new IEvent(e,o.value.xy),a)};let l=n.domEl;var s=document.createElement("div");s.className="lexpad",s.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let r=document.createElement("div");r.id="lexpad-"+e,r.className="lexinnerpad",r.style.width=i.padSize??"96px",r.style.height=i.padSize??"96px";let o=document.createElement("div");o.className="lexpadthumb",o.value=new LX.vec2(t[0],t[1]),o.min=i.min??0,o.max=i.max??1;let d=e=>{let[t,a]=[r.offsetWidth,r.offsetHeight],i=new LX.vec2(remapRange(e.x,o.min,o.max,0,1),remapRange(e.y,o.min,o.max,0,1));o.style.transform=`translate(calc( ${t*i.x}px - 50% ), calc( ${a*i.y}px - 50%)`};doAsync(()=>{d(o.value)}),r.appendChild(o),s.appendChild(r),l.appendChild(s),r.addEventListener("mousedown",function e(t){if(document.activeElement!=o){var a=c.root.ownerDocument;a.addEventListener("mousemove",h),a.addEventListener("mouseup",u),document.body.classList.add("nocursor"),document.body.classList.add("noevents"),t.stopImmediatePropagation(),t.stopPropagation(),i.onPress&&i.onPress.bind(o)(t,o)}});let c=this;function h(t){let i=r.getBoundingClientRect(),n=new LX.vec2(t.x-i.x,t.y-i.y);n.clp(0,r.offsetWidth,n);let[l,s]=[r.offsetWidth,r.offsetHeight],d=n.div(new LX.vec2(r.offsetWidth,r.offsetHeight));o.style.transform=`translate(calc( ${l*d.x}px - 50% ), calc( ${s*d.y}px - 50%)`,o.value=new LX.vec2(remapRange(d.x,0,1,o.min,o.max),remapRange(d.y,0,1,o.min,o.max)),c._trigger(new IEvent(e,o.value.xy,t),a),t.stopPropagation(),t.preventDefault()}function u(e){var t=c.root.ownerDocument;t.removeEventListener("mousemove",h),t.removeEventListener("mouseup",u),document.body.classList.remove("nocursor"),document.body.classList.remove("noevents"),i.onRelease&&i.onRelease.bind(o)(e,o)}return n}addProgress(e,t,a={}){if(!e)throw"Set Widget Name!";let i=this.create_widget(e,Widget.PROGRESS,a);i.onGetValue=()=>s.value,i.onSetValue=(e,t)=>{n.querySelector("meter").value=e,r(),n.querySelector("span")&&(n.querySelector("span").innerText=e)};let n=i.domEl;var l=document.createElement("div");l.className="lexprogress",l.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let s=document.createElement("meter");s.id="lexprogressbar-"+e,s.className="lexprogressbar",s.step="any",s.min=a.min??0,s.max=a.max??1,s.low=a.low??s.low,s.high=a.high??s.high,s.optimum=a.optimum??s.optimum,s.value=t;let r=()=>{let e=LX.getThemeColor("global-selected");void 0!=s.low&&s.value<s.low?e=LX.getThemeColor("global-color-error"):void 0!=s.high&&s.value<s.high&&(e=LX.getThemeColor("global-color-warning")),s.style.background=`color-mix(in srgb, ${e} 20%, transparent)`};if(l.appendChild(s),n.appendChild(l),a.showValue){document.getElementById("progressvalue-"+e)&&document.getElementById("progressvalue-"+e).remove();let o=document.createElement("span");o.id="progressvalue-"+e,o.style.padding="0px 5px",o.innerText=t,l.appendChild(o)}if(a.editable){s.classList.add("editable"),s.addEventListener("mousedown",function t(a){var i=d.root.ownerDocument;i.addEventListener("mousemove",c),i.addEventListener("mouseup",h),document.body.classList.add("noevents"),s.classList.add("grabbing"),a.stopImmediatePropagation(),a.stopPropagation();let n=s.getBoundingClientRect(),l=round(remapRange(a.offsetX,0,n.width,s.min,s.max));d.setValue(e,l)});let d=this;function c(t){if(0!=t.movementX){let i=s.getBoundingClientRect(),n=round(remapRange(t.offsetX-i.x,0,i.width,s.min,s.max));d.setValue(e,n),a.callback&&a.callback(n,t)}t.stopPropagation(),t.preventDefault()}function h(e){var t=d.root.ownerDocument;t.removeEventListener("mousemove",c),t.removeEventListener("mouseup",h),document.body.classList.remove("noevents"),s.classList.remove("grabbing")}}return r(),i}addFile(e,t,a={}){if(!e)throw"Set Widget Name!";let i=this.create_widget(e,Widget.FILE,a),n=i.domEl,l=a.local??!0,s=a.type??"text",r=a.read??!0,o=document.createElement("input");if(o.className="lexfileinput",o.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+" - 10%)",o.type="file",o.disabled=a.disabled??!1,a.placeholder&&(o.placeholder=a.placeholder),o.addEventListener("change",function(e){let i=e.target.files;if(i.length){if(r){a.onBeforeRead&&a.onBeforeRead();let n=new FileReader;"text"===s?n.readAsText(i[0]):"buffer"===s?n.readAsArrayBuffer(i[0]):"bin"===s?n.readAsBinaryString(i[0]):"url"===s&&n.readAsDataURL(i[0]),n.onload=e=>{t.call(this,e.target.result,i[0])}}else t(i[0])}}),o.addEventListener("cancel",function(e){t(null)}),n.appendChild(o),this.queue(n),l){let d=null;this.addButton(null,"<a style='margin-top: 0px;' class='fa-solid fa-gear'></a>",()=>{!d&&(d=new Dialog("Load Settings",e=>{e.addDropdown("Type",["text","buffer","bin","url"],s,e=>{s=e}),e.addButton(null,"Reload",e=>{o.dispatchEvent(new Event("change"))})},{onclose(e){e.remove(),d=null}}))},{className:"micro",skipInlineCount:!0,title:"Settings"})}return this.clearQueue(),i}addTree(e,t,a={}){let i=document.createElement("div");if(i.className="lextree",e){let n=document.createElement("span");n.innerHTML=e,i.appendChild(n)}let l=document.createElement("div");if(l.className="lextreetools",e||(l.className+=" notitle"),a.icons)for(let s of a.icons){let r=document.createElement("a");r.title=s.name,r.className="lexicon "+s.icon,r.addEventListener("click",s.callback),l.appendChild(r)}a.filter=a.filter??!0;let o=null;if(a.filter){(o=document.createElement("input")).id="lexnodetree_filter",o.setAttribute("placeholder","Filter.."),o.style.width="calc( 100% - 17px )",o.addEventListener("input",function(){h.refresh()});let d=document.createElement("a");d.className="lexicon fa-solid fa-magnifying-glass",l.appendChild(o),l.appendChild(d)}(a.icons||a.filter)&&i.appendChild(l);let c=document.createElement("ul");c.addEventListener("contextmenu",function(e){e.preventDefault()}),i.appendChild(c),this.root.appendChild(i);let h=new NodeTree(i,t,a);return h}addSeparator(){var e=document.createElement("div");e.className="lexseparator";let t=new Widget(null,Widget.SEPARATOR);t.domEl=e,this.current_branch?(this.current_branch.content.appendChild(e),this.current_branch.widgets.push(t)):this.root.appendChild(e)}addTabs(e,t={}){let a=this.current_branch?this.current_branch.content:this.root;if(this.current_branch||console.warn("No current branch!"),e.constructor!=Array)throw"Param @tabs must be an Array!";let i=t.vertical??!0,n=!i&&(t.showNames??!1),l=document.createElement("div");l.className="lextabscontainer",i||(l.className+=" horizontal");let s=document.createElement("div");s.className="tabs",l.appendChild(s),a.appendChild(l);for(let r=0;r<e.length;++r){let o=e[r];console.assert(o.name);let d=0==r,c=document.createElement("div");c.className="lextab "+(r==e.length-1?"last":"")+(d?"selected":""),c.innerHTML=(n?o.name:"")+"<a class='"+(o.icon||"fa fa-hashtag")+" "+(n?"withname":"")+"'></a>",c.title=o.name;let h=document.createElement("div");h.id=o.name.replace(/\s/g,""),h.className="widgets",d||h.toggleAttribute("hidden",!0),l.appendChild(h),c.addEventListener("click",e=>{s.querySelectorAll(".lextab").forEach(e=>{e.classList.remove("selected")}),e.target.classList.add("selected"),l.querySelectorAll(".widgets").forEach(e=>{e.toggleAttribute("hidden",!0)});let t=l.querySelector("#"+h.id);t.toggleAttribute("hidden"),o.onSelect&&o.onSelect(this,h)}),s.appendChild(c),o.onCreate&&(this.queue(h),o.onCreate(this,h),this.clearQueue())}this.addSeparator()}addCounter(e,t,a,i={}){let n=this.create_widget(e,Widget.COUNTER,i);n.onGetValue=()=>u.count,n.onSetValue=(e,t)=>{d(e,t)};let l=n.domEl,s=i.min??0,r=i.max??100,o=i.step??1,d=(t,i,n)=>{t=clamp(t,s,r),u.count=t,u.innerHTML=t,i||this._trigger(new IEvent(e,t,n),a)},c=document.createElement("div");c.className="lexcounter",l.appendChild(c),this.queue(c),this.addButton(null,"<a style='margin-top: 0px;' class='fa-solid fa-minus'></a>",(e,t)=>{let a=o??1;t.shiftKey&&(a*=10),d(u.count-a,!1,t)},{className:"micro",skipInlineCount:!0,title:"Minus"}),this.clearQueue();let h=document.createElement("div");h.className="lexcounterbox",c.appendChild(h);let u=document.createElement("span");if(u.className="lexcountervalue",u.innerHTML=t,u.count=t,h.appendChild(u),i.label){let p=document.createElement("span");p.className="lexcounterlabel",p.innerHTML=i.label,h.appendChild(p)}return this.queue(c),this.addButton(null,"<a style='margin-top: 0px;' class='fa-solid fa-plus'></a>",(e,t)=>{let a=o??1;t.shiftKey&&(a*=10),d(u.count+a,!1,t)},{className:"micro",skipInlineCount:!0,title:"Plus"}),this.clearQueue(),n}addTable(e,t,a={}){if(!t)throw"Data is needed to create a table!";let i=this.create_widget(e,Widget.TABLE,a);i.onGetValue=()=>{},i.onSetValue=(e,t)=>{};let n=i.domEl,l=document.createElement("div");l.className="lextable",l.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let s=document.createElement("table");function r(e,t,a,i){return a[e]<i[e]?-t:a[e]>i[e]?t:0}return l.appendChild(s),t.head=t.head??[],t.body=t.body??[],t.orderMap={},t.checkMap={},i.refreshTable=()=>{s.innerHTML="";{let e=document.createElement("thead");e.className="lextablehead",s.appendChild(e);let n=document.createElement("tr");if(a.selectable){let l=document.createElement("th"),o=document.createElement("input");o.type="checkbox",o.className="lexcheckbox",o.checked=t.checkMap[":root"]??!1,l.appendChild(o),o.addEventListener("change",function(){t.checkMap[":root"]=this.checked;let e=s.querySelector("tbody");for(let a of e.childNodes)t.checkMap[a.getAttribute("rowId")]=this.checked,a.querySelector("input").checked=this.checked}),n.appendChild(l)}for(let d of t.head){let c=document.createElement("th");c.innerHTML=`${d} <a class="fa-solid fa-sort"></a>`,c.querySelector("a").addEventListener("click",()=>{t.orderMap[d]||(t.orderMap[d]=1);let e=t.head.indexOf(d);t.body=t.body.sort(r.bind(this,e,t.orderMap[d])),t.orderMap[d]=-t.orderMap[d],i.refreshTable()}),n.appendChild(c)}if(a.rowActions){let h=document.createElement("th");h.className="sm",n.appendChild(h)}e.appendChild(n)}{let u=document.createElement("tbody");u.className="lextablebody",s.appendChild(u);for(let p=0;p<t.body.length;++p){let m=t.body[p],g=document.createElement("tr"),f=LX.getSupportedDOMName(m.join("-"));if(g.setAttribute("rowId",f),a.selectable){let v=document.createElement("td"),E=document.createElement("input");E.type="checkbox",E.className="lexcheckbox",E.checked=t.checkMap[f],v.appendChild(E),E.addEventListener("change",function(){t.checkMap[f]=this.checked}),g.appendChild(v)}for(let y of m){let $=document.createElement("td");$.innerHTML=`${y}`,g.appendChild($)}if(a.rowActions){let x=document.createElement("td");x.className="sm";let L=document.createElement("div");for(let b of(L.className="lextablebuttons",x.appendChild(L),a.rowActions)){let w=document.createElement("a");w.className="lexicon","delete"==b?(w.className+=" fa-solid fa-trash-can",w.addEventListener("click",function(){t.body.splice(p,1),g.remove()})):"menu"==b?(w.className+=" fa-solid fa-ellipsis",w.addEventListener("click",function(e){addContextMenu(null,e,e=>{if(a.onMenuAction){a.onMenuAction(e);return}console.warn("Using <Menu action> without action callbacks.")})})):(console.assert(b.constructor==Object),w.className+=` ${b.icon}`),L.appendChild(w)}g.appendChild(x)}u.appendChild(g)}}},i.refreshTable(),i.name||(n.className+=" noname",l.style.width="100%"),n.appendChild(l),i}}LX.Panel=Panel;class Branch{constructor(e,t={}){this.name=e;var a=document.createElement("div");a.className="lexbranch",t.id&&(a.id=t.id),t.className&&(a.className+=" "+t.className),a.style.width="calc(100% - 7px)",a.style.margin="0 auto";var i=this;this.root=a,this.widgets=[];var n=document.createElement("div");n.className="lexbranchtitle",n.innerHTML="<a class='fa-solid fa-angle-up switch-branch-button'></a>",t.icon&&(n.innerHTML+="<a class='branchicon "+t.icon+"' style='margin-right: 8px; margin-bottom: -2px;'>"),n.innerHTML+=e||"Branch",a.appendChild(n);var l=document.createElement("div");l.id=e.replace(/\s/g,""),l.className="lexbranchcontent",a.appendChild(l),this.content=l,this._addBranchSeparator(),t.closed&&(n.className+=" closed",a.className+=" closed",this.grabber.setAttribute("hidden",!0),doAsync(()=>{this.content.setAttribute("hidden",!0)},15)),this.onclick=function(e){e.stopPropagation(),this.classList.toggle("closed"),this.parentElement.classList.toggle("closed"),i.content.toggleAttribute("hidden"),i.grabber.toggleAttribute("hidden"),LX.emit("@on_branch_closed",this.classList.contains("closed"),{target:i.panel})},this.oncontextmenu=function(e){e.preventDefault(),e.stopPropagation(),!this.parentElement.classList.contains("dialog")&&addContextMenu("Dock",e,t=>{e.preventDefault(),t.add("Floating",i._on_make_floating.bind(i))},{icon:"fa-regular fa-window-restore"})},n.addEventListener("click",this.onclick),n.addEventListener("contextmenu",this.oncontextmenu)}_on_make_floating(){let e=new Dialog(this.name,e=>{for(let t of this.widgets)e.root.appendChild(t.domEl)});e.widgets=this.widgets;let t=this.root.parentElement;this.root.remove();let a=t.querySelector(".lexbranch");a&&a.classList.add("first");let i=t.querySelectorAll(".lexbranch");i.length&&i[i.length-1].classList.add("last")}_addBranchSeparator(){let e=document.createElement("div");e.className="lexwidgetseparator",e.style.width="100%",e.style.background="none";let t=document.createElement("div");t.innerHTML="&#9662;",e.appendChild(t),doAsync(()=>{t.style.marginLeft=parseFloat(LX.DEFAULT_NAME_WIDTH)/100*this.content.offsetWidth+"px"},10);let a=document.createElement("div");a.style.width="1px",a.style.marginLeft="6px",a.style.marginTop="2px",a.style.height="0px",t.appendChild(a),t.addEventListener("mousedown",function e(t){var s=i.root.ownerDocument;s.addEventListener("mouseup",l),s.addEventListener("mousemove",n),t.stopPropagation(),t.preventDefault();let r=i.root.offsetHeight-i.root.children[0].offsetHeight;a.style.height=r-3+"px",document.body.classList.add("nocursor")}),this.grabber=t;let i=this;function n(e){let a=e.movementX;if(0!=a){let n=parseFloat(t.style.marginLeft);t.style.marginLeft=clamp(n+a,32,i.content.offsetWidth-32)+"px"}}function l(e){i._updateWidgets(),a.style.height="0px";var t=i.root.ownerDocument;t.removeEventListener("mouseup",l),t.removeEventListener("mousemove",n),document.body.classList.remove("nocursor")}this.content.appendChild(e)}_updateWidgets(){for(var e=this.grabber.style.marginLeft,t=0;t<this.widgets.length;t++){let a=this.widgets[t],i=a.domEl;if(i.children.length<2)continue;var n=i.children[0],l=i.children[1];n.style.width=e;let s="0px";switch(a.type){case Widget.FILE:s="10%";break;case Widget.TEXT:s="8px"}l.style.width="-moz-calc( 100% - "+e+" - "+s+" )",l.style.width="-webkit-calc( 100% - "+e+" - "+s+" )",l.style.width="calc( 100% - "+e+" - "+s+" )",a.onresize&&a.onresize()}}}LX.Branch=Branch;class Footer{constructor(e={}){let t=document.createElement("footer");t.className="lexfooter";let a=document.createElement("div");if(a.className="wrapper",t.appendChild(a),e.columns&&e.columns.constructor==Array){let i=document.createElement("div");for(let n of(i.className="columns",i.style.gridTemplateColumns="1fr ".repeat(e.columns.length),a.appendChild(i),e.columns)){let l=document.createElement("div");l.className="col",i.appendChild(l);let s=document.createElement("h2");if(s.innerHTML=n.title,l.appendChild(s),!n.items||!n.items.length)continue;let r=document.createElement("ul");for(let o of(l.appendChild(r),n.items)){let d=document.createElement("li");d.innerHTML=`<a class="" href="${o.link}">${o.title}</a>`,r.appendChild(d)}}}if(e.credits||e.socials){let c=document.createElement("hr");a.appendChild(c);let h=document.createElement("div");if(h.className="credits-and-socials",a.appendChild(h),e.credits){let u=document.createElement("p");u.innerHTML=e.credits,h.appendChild(u)}if(e.socials){let p=document.createElement("div");for(let m of(p.className="social",e.socials)){let g=document.createElement("a");g.title=m.title,g.innerHTML=m.icon,g.href=m.link,g.target="_blank",p.appendChild(g)}h.appendChild(p)}}let f=e.parent??document.body;f.appendChild(t)}}LX.Footer=Footer;class Dialog{static _last_id=0;constructor(e,t,a={}){t||console.warn("Content is empty, add some widgets using 'callback' parameter!"),this._oncreate=t,this.id=simple_guidGenerator();let i=a.size??[],n=a.position??[],l=a.draggable??!0,s=a.modal??!1;var r=document.createElement("dialog");r.className="lexdialog "+(a.class??""),r.id=a.id??"dialog"+Dialog._last_id++,LX.root.appendChild(r),doAsync(()=>{s?r.showModal():r.show()},10);let o=this;var d=document.createElement("div");if(e&&(d.className="lexdialogtitle",d.innerHTML=e,d.setAttribute("draggable",!1),d.oncontextmenu=function(t){t.preventDefault(),t.stopPropagation(),LX.main_area&&"horizontal"===LX.main_area.type&&addContextMenu("Dock",t,a=>{t.preventDefault();let i=function(e){let t=e.panels[0];if(t)return t;for(var a of e.sections)if(t=i(a))return t},n=function(t){let a=t.branches.find(t=>t.name===e);for(let i of(a?t.root.appendChild(a.root):(t.branch(e),a=t.branches.find(t=>t.name===e)),o.widgets))a.content.appendChild(i.domEl);a.widgets=o.widgets,t.root.querySelectorAll(".lexbranch.last").forEach(e=>{e.classList.remove("last")}),a.root.classList.add("last"),r.remove()},l=i(LX.main_area.sections[1]);a.add('<i class="fa-regular fa-window-maximize fa-window-maximize fa-rotate-90">',{disabled:!l,id:"dock_options0",callback(){n(l)}});let s=i(LX.main_area.sections[0]);a.add('<i class="fa-regular fa-window-maximize fa-window-maximize fa-rotate-270">',{disabled:!s,id:"dock_options1",callback(){n(s)}})},{icon:"fa-regular fa-window-restore"})},r.appendChild(d)),a.closable??!0){this.close=()=>{a.onBeforeClose&&a.onBeforeClose(this),a.onclose?a.onclose(this.root):(r.close(),doAsync(()=>{o.panel.clear(),r.remove()},150))};var c=document.createElement("a");c.className="lexdialogcloser fa-solid fa-xmark",c.title="Close",c.addEventListener("click",this.close),e?d.appendChild(c):(c.classList.add("notitle"),r.appendChild(c))}let h=new Panel;h.root.classList.add("lexdialogcontent"),e||h.root.classList.add("notitle"),t&&t.call(this,h),r.appendChild(h.root),h.root.querySelectorAll(".lexbranch").forEach(e=>e.classList.add("dialog")),this.panel=h,this.root=r,this.title=d,l&&makeDraggable(r,Object.assign({targetClass:"lexdialogtitle"},a)),i.length&&"string"!=typeof i[0]&&(i[0]+="px"),i.length&&"string"!=typeof i[1]&&(i[1]+="px"),r.style.width=i[0]?i[0]:"25%",r.style.height=i[1]?i[1]:"auto",a.size&&(this.size=i);let u=r.getBoundingClientRect();r.style.left=n[0]?n[0]:"calc( 50% - "+.5*u.width+"px )",r.style.top=n[1]?n[1]:"calc( 50% - "+.5*u.height+"px )",h.root.style.width="calc( 100% - 30px )",h.root.style.height=e?"calc( 100% - "+(d.offsetHeight+30)+"px )":"calc( 100% - 51px )"}destroy(){this.root.remove()}refresh(){this.panel.root.innerHTML="",this._oncreate.call(this,this.panel)}setPosition(e,t){this.root.style.left=e+"px",this.root.style.top=t+"px"}setTitle(e){let t=this.root.querySelector(".lexdialogtitle");t&&(t.innerText=e)}}LX.Dialog=Dialog;class PocketDialog extends Dialog{static TOP=0;static BOTTOM=1;constructor(e,t,a={}){a.draggable=a.draggable??!1,a.closable=a.closable??!1;super(e,t,a);let i=this;if(LX.addSignal("@on_branch_closed",this.panel,e=>{this.dock_pos==PocketDialog.BOTTOM&&(this.root.style.top="calc(100% - "+(this.root.offsetHeight+3)+"px)")}),this.root.classList.add("pocket"),this.root.style.left="unset",a.position||(this.root.style.right="3px",this.root.style.top="3px"),this.panel.root.style.width="calc( 100% - 12px )",this.panel.root.style.height="calc( 100% - 40px )",this.dock_pos=PocketDialog.TOP,this.minimized=!1,this.title.tabIndex=-1,this.title.addEventListener("click",e=>{this.size&&(this.minimized?this.root.style.height=this.size[1]:this.root.style.height="auto"),this.root.classList.toggle("minimized"),this.minimized=!this.minimized,this.dock_pos==PocketDialog.BOTTOM&&(i.root.style.top=this.root.classList.contains("minimized")?"calc(100% - "+(i.title.offsetHeight+6)+"px)":"calc(100% - "+(i.root.offsetHeight+3)+"px)")}),!a.draggable){let n=a.float;if(n)for(var l=0;l<n.length;l++){let s=n[l];switch(s){case"b":this.root.style.top="calc(100% - "+(this.root.offsetHeight+3)+"px)";break;case"l":this.root.style.right="unset",this.root.style.left=a.position?a.position[1]:"3px"}}this.root.classList.add("dockable"),this.title.addEventListener("keydown",function(e){e.ctrlKey&&(i.root.style.right="unset","ArrowLeft"==e.key?i.root.style.left="0px":"ArrowRight"==e.key?i.root.style.left="calc(100% - "+(i.root.offsetWidth+3)+"px)":"ArrowUp"==e.key?(i.root.style.top="0px",i.dock_pos=PocketDialog.TOP):"ArrowDown"==e.key&&(i.root.style.top="calc(100% - "+(i.root.offsetHeight+3)+"px)",i.dock_pos=PocketDialog.BOTTOM))})}}}LX.PocketDialog=PocketDialog;class ContextMenu{constructor(e,t,a={}){if(document.body.querySelectorAll(".lexcontextmenubox").forEach(e=>e.remove()),this.root=document.createElement("div"),this.root.className="lexcontextmenubox",this.root.style.left=e.x-48+document.scrollingElement.scrollLeft+"px",this.root.style.top=e.y-8+document.scrollingElement.scrollTop+"px",this.root.addEventListener("mouseleave",function(){this.remove()}),this.items=[],this.colors={},t){let i={};i[t]=[],i.className="cmtitle",i.icon=a.icon,this.items.push(i)}}_adjust_position(e,t,a=!1){let i=e.getBoundingClientRect();if(a){let n=window.innerWidth-i.right;n<0&&(e.style.left=e.offsetLeft+(n-t)+"px"),(n=window.innerHeight-(i.top+i.height))<0&&(e.style.top=e.offsetTop+(n-t+20)+"px")}else{let l=i.width;i.left<0?e.style.left=t+"px":window.innerWidth-i.right<0&&(e.style.left=window.innerWidth-l-t+"px"),i.top<0?e.style.top=t+"px":i.top+i.height>window.innerHeight&&(e.style.top=window.innerHeight-i.height-t+"px")}}_create_submenu(e,t,a,i){this.root.querySelectorAll(".lexcontextmenubox").forEach(e=>e.remove());let n=document.createElement("div");n.className="lexcontextmenubox",a.appendChild(n);for(var l=0;l<e[t].length;++l){let s=e[t][l],r=Object.keys(s)[0];this._create_entry(s,r,n,i)}var o=a.getBoundingClientRect();n.style.left=o.width+"px",n.style.marginTop=3.5-a.offsetHeight+"px",this._adjust_position(n,6,!0)}_create_entry(e,t,a,i){let n=e[t].length,l=document.createElement("div");l.className="lexcontextmenuentry"+(e.className?" "+e.className:""),l.id=e.id??"eId"+getSupportedDOMName(t),l.innerHTML="";let s=e.icon;s&&(l.innerHTML+="<a class='"+s+" fa-sm'></a>");let r=e.disabled;if(l.innerHTML+="<div class='lexentryname"+(r?" disabled":"")+"'>"+t+"</div>",a.appendChild(l),this.colors[t]&&(l.style.borderColor=this.colors[t]),""==t){l.className+=" cmseparator";return}if(l.addEventListener("click",a=>{if(a.stopPropagation(),a.stopImmediatePropagation(),r)return;let s=e.callback;s&&(s.call(this,t,l),this.root.remove()),n&&"click"==LX.OPEN_CONTEXTMENU_ENTRY&&this._create_submenu(e,t,l,++i)}),!n)return;let o=document.createElement("a");o.className="fa-solid fa-bars-staggered fa-xs",l.appendChild(o),"mouseover"==LX.OPEN_CONTEXTMENU_ENTRY&&l.addEventListener("mouseover",a=>{l.built||(l.built=!0,this._create_submenu(e,t,l,++i),a.stopPropagation())}),l.addEventListener("mouseleave",()=>{i=-1,a.querySelectorAll(".lexcontextmenubox").forEach(e=>e.remove())})}onCreate(){doAsync(()=>this._adjust_position(this.root,6))}add(e,t={}){t.constructor==Function&&(t={callback:t}),e+="";let a=e.split("/"),i=a[a.length-1];this.colors[i]=t.color;let n=0,l=(e,i)=>{if(void 0==e)return;let s=null;if(i.forEach(t=>{let a=Object.keys(t),i=a.find(t=>t==e);i&&(s=t[i])}),s)l(a[n++],s);else{let r={};r[e]=[];let o=a[n++];o||(r.id=t.id,r.callback=t.callback,r.disabled=t.disabled??!1),i.push(r),l(o,r[e])}};l(a[n++],this.items);let s=e=>{let t=Object.keys(e)[0],a=e[t];if(a.length){if(null==a.find(e=>Object.keys(e)[0]==t)){let i={};i[t]=[],i.className="cmtitle",e[t].unshift(i)}for(var n of e[t]){let l=Object.keys(n)[0];for(var r=0;r<n[l].length;++r)s(n)}}};for(let r of this.items)s(r);for(let o of this.items){let d=Object.keys(o)[0],c="eId"+getSupportedDOMName(d),h="#"+(o.id??c);this.root.querySelector(h)||this._create_entry(o,d,this.root,-1)}}setColor(e,t){"#"!==t[0]&&(t=rgbToHex(t)),this.colors[e]=t}}function addContextMenu(e,t,a,i){var n=new ContextMenu(t,e,i);return LX.root.appendChild(n.root),a&&a(n),n.onCreate(),n}LX.ContextMenu=ContextMenu,LX.addContextMenu=addContextMenu;class Curve{constructor(e,t,a={}){let i=document.createElement("div");i.className="curve "+(a.className?a.className:""),i.style.minHeight="50px",i.style.width=a.width||"100%",i.style.minWidth="50px",i.style.minHeight="20px",i.bgcolor=a.bgColor||LX.getThemeColor("global-intense-background"),i.pointscolor=a.pointsColor||LX.getThemeColor("global-selected-light"),i.linecolor=a.lineColor||"#555",i.value=t||[],i.xrange=a.xrange||[0,1],i.yrange=a.yrange||[0,1],i.defaulty=null!=a.defaulty?a.defaulty:0,i.no_overlap=a.noOverlap||!1,i.show_samples=a.showSamples||0,i.allow_add_values=a.allowAddValues??!0,i.draggable_x=a.draggableX??!0,i.draggable_y=a.draggableY??!0,i.smooth=(a.smooth&&"number"==typeof a.smooth?a.smooth:.3)||!1,i.move_out=a.moveOutAction??LX.CURVE_MOVEOUT_DELETE,LX.addSignal("@on_new_color_scheme",(e,t)=>{i.bgcolor=a.bgColor||LX.getThemeColor("global-intense-background"),i.pointscolor=a.pointsColor||LX.getThemeColor("global-selected-light"),this.redraw()}),this.element=i;let n=document.createElement("canvas");function l(e){return[n.width*(e[0]-i.xrange[0])/i.xrange[1],n.height*(e[1]-i.yrange[0])/i.yrange[1]]}function s(e){return[e[0]*i.xrange[1]/n.width+i.xrange[0],e[1]*i.yrange[1]/n.height+i.yrange[0]]}n.width=a.width||200,n.height=a.height||50,i.appendChild(n),this.canvas=n,i.addEventListener("mousedown",d),i.getValueAt=function(e){if(e<i.xrange[0]||e>i.xrange[1])return i.defaulty;for(var t=[i.xrange[0],i.defaulty],a=0,n=0;n<i.value.length;n+=1){var l=i.value[n];if(e==l[0])return l[1];if(e<l[0])return a=(e-t[0])/(l[0]-t[0]),t[1]*(1-a)+l[1]*a;t=l}return l=[i.xrange[1],i.defaulty],a=(e-t[0])/(l[0]-t[0]),t[1]*(1-a)+l[1]*a},i.resample=function(e){for(var t=[],a=(i.xrange[1]-i.xrange[0])/e,n=i.xrange[0];n<=i.xrange[1];n+=a)t.push(i.getValueAt(n));return t},i.addValue=function(e){for(var t=0;t<i.value;t++)if(!(i.value[t][0]<e[0])){i.value.splice(t,0,e),redraw();return}i.value.push(e),redraw()};var r=-1;i.redraw=function(e={}){e.value&&(i.value=e.value),e.xrange&&(i.xrange=e.xrange),e.yrange&&(i.yrange=e.yrange),e.smooth&&(i.smooth=e.smooth);var t=n.parentElement.getBoundingClientRect();n.parentElement.parentElement&&(t=n.parentElement.parentElement.getBoundingClientRect()),t&&n.width!=t.width&&t.width&&t.width<1e3&&(n.width=t.width);var a=n.getContext("2d");a.setTransform(1,0,0,1,0,0),a.translate(0,n.height),a.scale(1,-1),a.fillStyle=i.bgcolor,a.fillRect(0,0,n.width,n.height),a.strokeStyle=i.linecolor,a.beginPath();var s=l([i.xrange[0],i.defaulty]);a.moveTo(s[0],s[1]);let o=[s[0],s[1]];for(var d in i.value){var c=i.value[d];s=l(c),o.push(s[0]),o.push(s[1]),i.smooth||a.lineTo(s[0],s[1])}s=l([i.xrange[1],i.defaulty]),o.push(s[0]),o.push(s[1]),i.smooth?LX.UTILS.drawSpline(a,o,i.smooth):(a.lineTo(s[0],s[1]),a.stroke());for(var d=0;d<i.value.length;d+=1){var c=i.value[d];s=l(c),r==d?a.fillStyle="white":a.fillStyle=i.pointscolor,a.beginPath(),a.arc(s[0],s[1],r==d?4:3,0,2*Math.PI),a.fill()}if(i.show_samples){var h=i.resample(i.show_samples);a.fillStyle="#888";for(var d=0;d<h.length;d+=1){var c=[d*((i.xrange[1]-i.xrange[0])/i.show_samples)+i.xrange[0],h[d]];s=l(c),a.beginPath(),a.arc(s[0],s[1],2,0,2*Math.PI),a.fill()}}};var o=[0,0];function d(e){document.addEventListener("mousemove",c),document.addEventListener("mouseup",h);var t=n.getBoundingClientRect(),a=e.clientX-t.left,l=e.clientY-t.top;if(r=m(a,n.height-l),e.button==LX.MOUSE_LEFT_CLICK&&-1==r&&i.allow_add_values){var d=s([a,n.height-l]);i.value.push(d),g(),r=i.value.indexOf(d)}o=[a,l],i.redraw(),e.preventDefault(),e.stopPropagation()}function c(e){var t=n.getBoundingClientRect(),a=e.clientX-t.left,l=e.clientY-t.top;a<0?a=0:a>n.width&&(a=n.width),l<0?l=0:l>n.height&&(l=n.height);let d=[e.clientX-t.left,e.clientY-t.top];if(-1!=r&&p(d,[a,l])>.5*n.height){if(i.move_out==LX.CURVE_MOVEOUT_DELETE)i.value.splice(r,1);else{let c=[d[0]-a,d[1]-l],m=i.value[r];m[0]=0==c[0]?m[0]:c[0]<0?i.xrange[0]:i.xrange[1],m[1]=0==c[1]?m[1]:c[1]<0?i.yrange[1]:i.yrange[0]}h(e);return}var f,v=s([-(i.draggable_x?o[0]-a:0),i.draggable_y?o[1]-l:0]);if(-1!=r){var E=i.xrange[0],y=i.xrange[1];i.no_overlap&&(r>0&&(E=i.value[r-1][0]),r<i.value.length-1&&(y=i.value[r+1][0]));var $=i.value[r];$[0]+=v[0],$[1]+=v[1],$[0]<E?$[0]=E:$[0]>y&&($[0]=y),$[1]<i.yrange[0]?$[1]=i.yrange[0]:$[1]>i.yrange[1]&&($[1]=i.yrange[1])}g(),i.redraw(),o[0]=a,o[1]=l,u(e),e.preventDefault(),e.stopPropagation()}function h(e){r=-1,i.redraw(),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",h),u(e),e.preventDefault(),e.stopPropagation()}function u(e){a.callback&&a.callback.call(i,i.value,e)}function p(e,t){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2))}function m(e,t){for(var a=1e5,n=-1,s=0;s<i.value.length;s++){var r=l(i.value[s]),o=p([e,t],r);o<a&&o<8&&(a=o,n=s)}return n}function g(){var e=null;-1!=r&&(e=i.value[r]),i.value.sort(function(e,t){return e[0]-t[0]}),e&&(r=i.value.indexOf(e))}return i.redraw(),this}redraw(e={}){this.element.redraw(e)}}LX.Curve=Curve;class Dial{constructor(e,t,a={}){let i=document.createElement("div");i.className="dial "+(a.className?a.className:""),i.style.width=i.style.height=a.size||"100%",i.style.minWidth=i.style.minHeight="50px",i.bgcolor=a.bgColor||LX.getThemeColor("global-dark-background"),i.pointscolor=a.pointsColor||LX.getThemeColor("global-selected-light"),i.linecolor=a.lineColor||"#555",i.value=t||[],i.xrange=a.xrange||[0,1],i.yrange=a.yrange||[0,1],i.defaulty=null!=a.defaulty?a.defaulty:0,i.no_overlap=a.noOverlap||!1,i.show_samples=a.showSamples||0,i.allow_add_values=a.allowAddValues??!0,i.draggable_x=a.draggableX??!0,i.draggable_y=a.draggableY??!0,i.smooth=(a.smooth&&"number"==typeof a.smooth?a.smooth:.3)||!1,i.move_out=a.moveOutAction??LX.CURVE_MOVEOUT_DELETE,this.element=i;let n=document.createElement("canvas");function l(e,t){return e[0],[n.width*(e[0]-i.xrange[0])/i.xrange[1],n.height*(e[1]-i.yrange[0])/i.yrange[1]]}function s(e){return[e[0]*i.xrange[1]/n.width+i.xrange[0],e[1]*i.yrange[1]/n.height+i.yrange[0]]}n.width=n.height=a.size||200,i.appendChild(n),this.canvas=n,i.addEventListener("mousedown",d),i.getValueAt=function(e){if(e<i.xrange[0]||e>i.xrange[1])return i.defaulty;for(var t=[i.xrange[0],i.defaulty],a=0,n=0;n<i.value.length;n+=1){var l=i.value[n];if(e==l[0])return l[1];if(e<l[0])return a=(e-t[0])/(l[0]-t[0]),t[1]*(1-a)+l[1]*a;t=l}return l=[i.xrange[1],i.defaulty],a=(e-t[0])/(l[0]-t[0]),t[1]*(1-a)+l[1]*a},i.resample=function(e){for(var t=[],a=(i.xrange[1]-i.xrange[0])/e,n=i.xrange[0];n<=i.xrange[1];n+=a)t.push(i.getValueAt(n));return t},i.addValue=function(e){for(var t=0;t<i.value;t++)if(!(i.value[t][0]<e[0])){i.value.splice(t,0,e),redraw();return}i.value.push(e),redraw()};var r=-1;i.redraw=function(e={}){e.value&&(i.value=e.value),e.xrange&&(i.xrange=e.xrange),e.yrange&&(i.yrange=e.yrange),e.smooth&&(i.smooth=e.smooth);var t=n.parentElement.getBoundingClientRect();n.parentElement.parentElement&&(t=n.parentElement.parentElement.getBoundingClientRect()),t&&n.width!=t.width&&t.width&&t.width<1e3&&(n.width=t.width);var a=n.getContext("2d");a.setTransform(1,0,0,1,0,0),a.translate(0,n.height),a.scale(1,-1),a.fillStyle=i.bgcolor,a.fillRect(0,0,n.width,n.height),a.strokeStyle=i.linecolor,a.beginPath();var s=l([i.xrange[0],i.defaulty]);a.moveTo(s[0],s[1]);let o=[s[0],s[1]];for(var d in i.value){var c=i.value[d];s=l(c),o.push(s[0]),o.push(s[1])}s=l([i.xrange[1],i.defaulty]),o.push(s[0]),o.push(s[1]),s=l([0,0]),a.fillStyle="gray",a.beginPath(),a.arc(s[0],s[1],3,0,2*Math.PI),a.fill();for(var d=0;d<i.value.length;d+=1){var c=i.value[d];s=l(c),r==d?a.fillStyle="white":a.fillStyle=i.pointscolor,a.beginPath(),a.arc(s[0],s[1],r==d?4:3,0,2*Math.PI),a.fill()}if(i.show_samples){var h=i.resample(i.show_samples);a.fillStyle="#888";for(var d=0;d<h.length;d+=1){var c=[d*((i.xrange[1]-i.xrange[0])/i.show_samples)+i.xrange[0],h[d]];s=l(c),a.beginPath(),a.arc(s[0],s[1],2,0,2*Math.PI),a.fill()}}};var o=[0,0];function d(e){document.addEventListener("mousemove",c),document.addEventListener("mouseup",h);var t=n.getBoundingClientRect(),a=e.clientX-t.left,l=e.clientY-t.top;if(r=m(a,n.height-l),e.button==LX.MOUSE_LEFT_CLICK&&-1==r&&i.allow_add_values){var d=s([a,n.height-l]);i.value.push(d),g(),r=i.value.indexOf(d)}o=[a,l],i.redraw(),e.preventDefault(),e.stopPropagation()}function c(e){var t=n.getBoundingClientRect(),a=e.clientX-t.left,l=e.clientY-t.top;a<0?a=0:a>n.width&&(a=n.width),l<0?l=0:l>n.height&&(l=n.height);let d=[e.clientX-t.left,e.clientY-t.top];if(-1!=r&&p(d,[a,l])>.5*n.height){if(i.move_out==LX.CURVE_MOVEOUT_DELETE)i.value.splice(r,1);else{let c=[d[0]-a,d[1]-l],m=i.value[r];m[0]=0==c[0]?m[0]:c[0]<0?i.xrange[0]:i.xrange[1],m[1]=0==c[1]?m[1]:c[1]<0?i.yrange[1]:i.yrange[0]}h(e);return}var f,v=s([-(i.draggable_x?o[0]-a:0),i.draggable_y?o[1]-l:0]);if(-1!=r){var E=i.xrange[0],y=i.xrange[1];i.no_overlap&&(r>0&&(E=i.value[r-1][0]),r<i.value.length-1&&(y=i.value[r+1][0]));var $=i.value[r];$[0]+=v[0],$[1]+=v[1],$[0]<E?$[0]=E:$[0]>y&&($[0]=y),$[1]<i.yrange[0]?$[1]=i.yrange[0]:$[1]>i.yrange[1]&&($[1]=i.yrange[1])}g(),i.redraw(),o[0]=a,o[1]=l,u(e),e.preventDefault(),e.stopPropagation()}function h(e){r=-1,i.redraw(),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",h),u(e),e.preventDefault(),e.stopPropagation()}function u(e){a.callback&&a.callback.call(i,i.value,e)}function p(e,t){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2))}function m(e,t){for(var a=1e5,n=-1,s=0;s<i.value.length;s++){var r=l(i.value[s]),o=p([e,t],r);o<a&&o<8&&(a=o,n=s)}return n}function g(){var e=null;-1!=r&&(e=i.value[r]),i.value.sort(function(e,t){return e[0]-t[0]}),e&&(r=i.value.indexOf(e))}return i.redraw(),this}redraw(e={}){this.element.redraw(e)}}LX.Dial=Dial;class AssetViewEvent{static NONE=0;static ASSET_SELECTED=1;static ASSET_DELETED=2;static ASSET_RENAMED=3;static ASSET_CLONED=4;static ASSET_DBLCLICKED=5;static ENTER_FOLDER=6;static ASSET_CHECKED=7;constructor(e,t,a){this.type=e||TreeEvent.NONE,this.item=t,this.value=a,this.multiple=!1}string(){switch(this.type){case AssetViewEvent.NONE:return"assetview_event_none";case AssetViewEvent.ASSET_SELECTED:return"assetview_event_selected";case AssetViewEvent.ASSET_DELETED:return"assetview_event_deleted";case AssetViewEvent.ASSET_RENAMED:return"assetview_event_renamed";case AssetViewEvent.ASSET_CLONED:return"assetview_event_cloned";case AssetViewEvent.ASSET_DBLCLICKED:return"assetview_event_dblclicked";case AssetViewEvent.ENTER_FOLDER:return"assetview_event_enter_folder";case AssetViewEvent.ASSET_CHECKED:return"assetview_event_checked"}}}LX.AssetViewEvent=AssetViewEvent;class AssetView{static LAYOUT_CONTENT=0;static LAYOUT_LIST=1;static MAX_PAGE_ELEMENTS=50;constructor(e={}){this.rootPath="https://raw.githubusercontent.com/jxarco/lexgui.js/master/",this.layout=e.layout??AssetView.LAYOUT_CONTENT,this.contentPage=1,e.rootPath&&(e.rootPath.constructor!==String?console.warn("Asset Root Path must be a String (now is "+path.constructor.name+")"):this.rootPath=e.rootPath);let t=document.createElement("div");t.className="lexassetbrowser",this.root=t;let a=new LX.Area({height:"100%"});t.appendChild(a.root);let i,n,l=a;this.skipBrowser=e.skipBrowser??!1,this.skipPreview=e.skipPreview??!1,this.useNativeTitle=e.useNativeTitle??!1,this.onlyFolders=e.onlyFolders??!0,this.allowMultipleSelection=e.allowMultipleSelection??!1,this.previewActions=e.previewActions??[],this.contextMenu=e.contextMenu??[],this.onRefreshContent=e.onRefreshContent,this.skipBrowser||([i,n]=a.split({type:"horizontal",sizes:["15%","85%"]}),l=n,i.setLimitBox(210,0),n.setLimitBox(512,0)),this.skipPreview||([l,n]=l.split({type:"horizontal",sizes:["80%","20%"]})),this.allowedTypes=e.allowedTypes||["None","Image","Mesh","Script","JSON","Clip"],this.prevData=[],this.nextData=[],this.data=[],this._processData(this.data,null),this.currentData=this.data,this.path=["@"],this.skipBrowser||this._createTreePanel(i),this._createContentPanel(l),this.skipPreview||(this.previewPanel=n.addPanel({className:"lexassetcontentpanel",style:{overflow:"scroll"}}))}load(e,t){this.prevData.length=0,this.nextData.length=0,this.data=e,this._processData(this.data,null),this.currentData=this.data,this.path=["@"],this.skipBrowser||this._createTreePanel(this.area),this._refreshContent(),this.onevent=t}clear(){this.previewPanel&&this.previewPanel.clear(),this.leftPanel&&this.leftPanel.clear(),this.rightPanel&&this.rightPanel.clear()}_processData(e,t){e.constructor!==Array&&(e.folder=t,e.children=e.children??[]);let a=e.constructor===Array?e:e.children;for(var i=0;i<a.length;++i)this._processData(a[i],e)}_updatePath(e){this.path.length=0;let t=e=>{if(!e)return;let a=(e.children?e.children:e)[0];a&&a.folder&&(this.path.push(a.folder.id??"@"),t(a.folder.folder))};t(e),LX.emit("@on_folder_change",this.path.reverse().join("/"))}_createTreePanel(e){this.leftPanel?this.leftPanel.clear():this.leftPanel=e.addPanel({className:"lexassetbrowserpanel"});let t={id:"/",children:this.data};this.tree=this.leftPanel.addTree("Content Browser",t,{filter:!1,onlyFolders:this.onlyFolders,onevent:e=>{let t=e.node,a=e.value;switch(e.type){case LX.TreeEvent.NODE_SELECTED:e.multiple||this._enterFolder(t),t.parent||(this.prevData.push(this.currentData),this.currentData=this.data,this._refreshContent(),this.path=["@"],LX.emit("@on_folder_change",this.path.join("/")));break;case LX.TreeEvent.NODE_DRAGGED:t.folder=a,this._refreshContent()}}})}_setContentLayout(e){this.layout=e,this._refreshContent()}_createContentPanel(e){this.rightPanel?this.rightPanel.clear():this.rightPanel=e.addPanel({className:"lexassetcontentpanel"});let t=(e,t)=>{let a=addContextMenu("Sort by",t,e=>{e.add("Name",()=>this._sortData("id")),e.add("Type",()=>this._sortData("type")),e.add(""),e.add("Ascending",()=>this._sortData()),e.add("Descending",()=>this._sortData(null,!0))}),i=this.parent.root.parentElement;i.classList.contains("lexdialog")&&(a.root.style.zIndex=+getComputedStyle(i).zIndex+1)},a=(e,t)=>{let a=addContextMenu("Layout",t,e=>{e.add("Content",()=>this._setContentLayout(AssetView.LAYOUT_CONTENT)),e.add(""),e.add("List",()=>this._setContentLayout(AssetView.LAYOUT_LIST))}),i=this.parent.root.parentElement;i.classList.contains("lexdialog")&&(a.root.style.zIndex=+getComputedStyle(i).zIndex+1)},i=(e,t)=>{if(!this.allowNextPage)return;let a=this.contentPage;this.contentPage+=e,this.contentPage=Math.min(this.contentPage,((this.currentData.length-1)/AssetView.MAX_PAGE_ELEMENTS|0)+1),this.contentPage=Math.max(this.contentPage,1),a!=this.contentPage&&this._refreshContent()};this.rightPanel.sameLine(),this.rightPanel.addDropdown("Filter",this.allowedTypes,this.allowedTypes[0],e=>this._refreshContent.call(this,null,e),{width:"30%",minWidth:"128px"}),this.rightPanel.addText(null,this.searchValue??"",e=>this._refreshContent.call(this,e,null),{placeholder:"Search assets.."}),this.rightPanel.addButton(null,"<a class='fa fa-arrow-up-short-wide'></a>",t.bind(this),{className:"micro",title:"Sort"}),this.rightPanel.addButton(null,"<a class='fa-solid fa-grip'></a>",a.bind(this),{className:"micro",title:"View"}),this.rightPanel.addButton(null,"<a class='fa-solid fa-angles-left'></a>",i.bind(this,-1),{className:"micro",title:"Previous Page"}),this.rightPanel.addButton(null,"<a class='fa-solid fa-angles-right'></a>",i.bind(this,1),{className:"micro",title:"Next Page"}),this.rightPanel.endLine(),this.skipBrowser||(this.rightPanel.sameLine(),this.rightPanel.addComboButtons(null,[{value:"Left",icon:"fa-solid fa-left-long",callback:e=>{this.prevData.length&&(this.nextData.push(this.currentData),this.currentData=this.prevData.pop(),this._refreshContent(),this._updatePath(this.currentData))}},{value:"Right",icon:"fa-solid fa-right-long",callback:e=>{this.nextData.length&&(this.prevData.push(this.currentData),this.currentData=this.nextData.pop(),this._refreshContent(),this._updatePath(this.currentData))}},{value:"Refresh",icon:"fa-solid fa-arrows-rotate",callback:e=>{this._refreshContent()}}],{width:"auto",noSelection:!0}),this.rightPanel.addText(null,this.path.join("/"),null,{disabled:!0,signal:"@on_folder_change",style:{fontWeight:"bolder",fontSize:"16px",color:"#aaa"}}),this.rightPanel.addText(null,"Page "+this.contentPage+" / "+(((this.currentData.length-1)/AssetView.MAX_PAGE_ELEMENTS|0)+1),null,{disabled:!0,signal:"@on_page_change",width:"fit-content"}),this.rightPanel.endLine()),this.content=document.createElement("ul"),this.content.className="lexassetscontent",this.rightPanel.root.appendChild(this.content),this.content.addEventListener("dragenter",function(e){e.preventDefault(),this.classList.add("dragging")}),this.content.addEventListener("dragleave",function(e){e.preventDefault(),this.classList.remove("dragging")}),this.content.addEventListener("drop",e=>{e.preventDefault(),this._processDrop(e)}),this.content.addEventListener("click",function(){this.querySelectorAll(".lexassetitem").forEach(e=>e.classList.remove("selected"))}),this._refreshContent()}_refreshContent(e,t){let a=this.layout==AssetView.LAYOUT_CONTENT;this.filter=t??this.filter??"None",this.searchValue=e??this.searchValue??"",this.content.innerHTML="",this.content.className=a?"lexassetscontent":"lexassetscontent list";let i=this,n=function(e){let t=e.type.charAt(0).toUpperCase()+e.type.slice(1),n=getExtension(e.id),l="Folder"===t,s=document.createElement("li");if(s.className="lexassetitem "+e.type.toLowerCase(),s.tabIndex=-1,i.content.appendChild(s),i.useNativeTitle)s.title=t+": "+e.id;else{let r=document.createElement("span");r.className="lexitemdesc",r.innerHTML="File: "+e.id+"<br>Type: "+t,i.content.appendChild(r),s.addEventListener("mousemove",e=>{if(!a)return;let t=s.getBoundingClientRect(),i=e.target.getBoundingClientRect(),n=r.parentElement.getBoundingClientRect(),l=i.x-n.x-(i.x-t.x),o=i.y-n.y-(i.y-t.y);e.target.classList.contains("lexassettitle")&&(o+=i.y-t.y),r.style.left=l+e.offsetX+12+"px",r.style.top=o+e.offsetY+"px"}),s.addEventListener("mouseenter",()=>{a&&(r.style.display="unset")}),s.addEventListener("mouseleave",()=>{a&&setTimeout(()=>{r.style.display="none"},100)})}if(i.allowMultipleSelection){let o=document.createElement("input");o.type="checkbox",o.className="lexcheckbox",o.checked=e.selected,o.addEventListener("change",(t,a)=>{if(e.selected=!e.selected,i.onevent){let n=new AssetViewEvent(AssetViewEvent.ASSET_CHECKED,t.shiftKey?[e]:e);n.multiple=!!t.shiftKey,i.onevent(n)}t.stopPropagation(),t.stopImmediatePropagation()}),s.appendChild(o)}let d=document.createElement("span");if(d.className="lexassettitle",d.innerText=e.id,s.appendChild(d),!i.skipPreview){let c=null,h=e.src&&(["png","jpg"].indexOf(getExtension(e.src))>-1||e.src.includes("data:image/"));if(h||l||!a){c=document.createElement("img");let u=e.unknown_extension?i.rootPath+"images/file.png":l?i.rootPath+"images/folder.png":e.src;c.src=a||l?u:i.rootPath+"images/file.png",s.appendChild(c)}else{(c=document.createElement("svg")).className="asset-file-preview",s.appendChild(c);let p=document.createElement("text");c.appendChild(p),p.innerText=n&&n!=e.id?"."+n.toUpperCase():e.type.toUpperCase();var m,g=2.5/p.innerText.length;g<1&&(p.style.fontSize=64*g+"px",c.style.paddingTop="calc(50% - "+(.5*p.offsetHeight+10)+"px)")}}if(!l){let f=document.createElement("span");f.className="lexassetinfo",f.innerText=t,s.appendChild(f)}return s.addEventListener("click",function(t){t.stopImmediatePropagation(),t.stopPropagation();let a=t.detail==LX.MOUSE_DOUBLE_CLICK;if(a){if(l){i._enterFolder(e);return}}else t.shiftKey||i.content.querySelectorAll(".lexassetitem").forEach(e=>e.classList.remove("selected")),this.classList.add("selected"),i.selectedItem=e,i.skipPreview||i._previewAsset(e);if(i.onevent){let n=new AssetViewEvent(a?AssetViewEvent.ASSET_DBLCLICKED:AssetViewEvent.ASSET_SELECTED,t.shiftKey?[e]:e);n.multiple=!!t.shiftKey,i.onevent(n)}}),i.contextMenu&&s.addEventListener("contextmenu",function(t){t.preventDefault();let a=i.content.querySelectorAll(".selected").length;LX.addContextMenu(a>1?a+" selected":l?e.id:e.type,t,t=>{a<=1&&t.add("Rename"),l||t.add("Clone",i._cloneItem.bind(i,e)),a<=1&&t.add("Properties"),t.add(""),t.add("Delete",i._deleteItem.bind(i,e))})}),s.addEventListener("dragstart",function(e){e.preventDefault()},!1),s},l=new FileReader,s=this.currentData.filter(e=>("None"==this.filter||e.type.toLowerCase()==this.filter.toLowerCase())&&e.id.toLowerCase().includes(this.searchValue.toLowerCase()));(t||e)&&(this.contentPage=1);let r=(this.contentPage-1)*AssetView.MAX_PAGE_ELEMENTS,o=Math.min(r+AssetView.MAX_PAGE_ELEMENTS,s.length);for(let d=r;d<o;++d){let c=s[d];c.path?LX.request({url:c.path,dataType:"blob",success:a=>{c.bytesize=a.size,l.readAsDataURL(a),l.onload=a=>{c.src=a.currentTarget.result,c._path=c.path,delete c.path,this._refreshContent(e,t)}}}):c.domEl=n(c)}this.allowNextPage=s.length-1>AssetView.MAX_PAGE_ELEMENTS,LX.emit("@on_page_change","Page "+this.contentPage+" / "+(((s.length-1)/AssetView.MAX_PAGE_ELEMENTS|0)+1)),this.onRefreshContent&&this.onRefreshContent(e,t)}_previewAsset(e){let t=e.src&&e.src.includes("data:image/");if(this.previewPanel.clear(),this.previewPanel.branch("Asset"),"image"==e.type||e.src){let a=["png","jpg"].indexOf(getExtension(e.src))>-1||t;a&&this.previewPanel.addImage(e.src,{style:{width:"100%"}})}let i={disabled:!0};this.previewPanel.addText("Filename",e.id,null,i),e.lastModified&&this.previewPanel.addText("Last Modified",new Date(e.lastModified).toLocaleString(),null,i),(e._path||e.src)&&this.previewPanel.addText("URL",e._path?e._path:e.src,null,i),this.previewPanel.addText("Path",this.path.join("/"),null,i),this.previewPanel.addText("Type",e.type,null,i),e.bytesize&&this.previewPanel.addText("Size",(e.bytesize/1024).toPrecision(3)+" KBs",null,i),"folder"==e.type&&this.previewPanel.addText("Files",e.children?e.children.length.toString():"0",null,i),this.previewPanel.addSeparator();let n=[...this.previewActions];for(let l of(n.length||n.push({name:"Download",callback:()=>LX.downloadURL(e.src,e.id)}),n))l.type&&l.type!==e.type||l.path&&l.path!==this.path.join("/")||this.previewPanel.addButton(null,l.name,l.callback.bind(this,e));this.previewPanel.merge()}_processDrop(e){let t=new FileReader,a=e.dataTransfer.files.length;for(let i=0;i<e.dataTransfer.files.length;++i){let n=e.dataTransfer.files[i],l=this.currentData.find(e=>e.id===n.name);l||(t.readAsDataURL(n),t.onload=e=>{let t=n.name.substr(n.name.lastIndexOf(".")+1).toLowerCase(),l={id:n.name,src:e.currentTarget.result,extension:t,lastModified:n.lastModified};switch(t){case"png":case"jpg":l.type="image";break;case"js":case"css":l.type="script";break;case"json":l.type="json";break;case"obj":l.type="mesh";break;default:l.type=t,l.unknown_extension=!0}this.currentData.push(l),i!=a-1||(this._refreshContent(),this.skipBrowser||this.tree.refresh())})}}_sortData(e,t=!1){e=e??this._lastSortBy??"id",this.currentData=this.currentData.sort((a,i)=>{var n=t?i[e].localeCompare(a[e]):a[e].localeCompare(i[e]);return 0==n&&(n=t?i.id.localeCompare(a.id):a.id.localeCompare(i.id)),n}),this._lastSortBy=e,this._refreshContent()}_enterFolder(e){if(this.prevData.push(this.currentData),this.currentData=e.children,this.contentPage=1,this._refreshContent(),this._updatePath(this.currentData),this.onevent){let t=new AssetViewEvent(AssetViewEvent.ENTER_FOLDER,e);this.onevent(t)}}_deleteItem(e){let t=this.currentData.indexOf(e);if(t<0){console.error("[AssetView Error] Cannot delete. Item not found.");return}if(this.currentData.splice(t,1),this._refreshContent(this.searchValue,this.filter),this.onevent){let a=new AssetViewEvent(AssetViewEvent.ASSET_DELETED,e);this.onevent(a)}this.tree.refresh(),this._processData(this.data)}_cloneItem(e){let t=this.currentData.indexOf(e);if(t<0)return;delete e.domEl,delete e.folder;let a=deepCopy(e);if(this.currentData.splice(t,0,a),this._refreshContent(this.searchValue,this.filter),this.onevent){let i=new AssetViewEvent(AssetViewEvent.ASSET_CLONED,e);this.onevent(i)}this._processData(this.data)}}LX.AssetView=AssetView,Object.assign(LX,{request(e){var t=e.dataType||"text";"json"==t?t="text":"xml"==t?t="text":"binary"==t&&(t="arraybuffer",e.mimeType="application/octet-stream");var a=new XMLHttpRequest;a.open(e.data?"POST":"GET",e.url,!0),t&&(a.responseType=t),e.mimeType&&a.overrideMimeType(e.mimeType),e.nocache&&a.setRequestHeader("Cache-Control","no-cache"),a.onload=function(t){var a=this.response;if(200!=this.status){var i="Error "+this.status;e.error&&e.error(i);return}if("json"==e.dataType)try{a=JSON.parse(a)}catch(n){if(e.error)e.error(n);else throw n}else if("xml"==e.dataType)try{a=new DOMParser().parseFromString(a,"text/xml")}catch(l){if(e.error)e.error(l);else throw l}e.success&&e.success.call(this,a,this)},a.onerror=function(t){e.error&&e.error(t)};var i=new FormData;if(e.data)for(var n in e.data)i.append(n,e.data[n]);return a.send(i),a},requestText(e,t,a){return this.request({url:e,dataType:"text",success:t,error:a})},requestJSON(e,t,a){return this.request({url:e,dataType:"json",success:t,error:a})},requestBinary(e,t,a){return this.request({url:e,dataType:"binary",success:t,error:a})},requireScript(e,t,a,i,n){if(!e)throw"invalid URL";e.constructor===String&&(e=[e]);var l=e.length,s=[];for(var r in e){var o=document.createElement("script");o.num=r,o.type="text/javascript",o.src=e[r]+(n?"?version="+n:""),o.original_src=e[r],o.async=!1,o.onload=function(e){l--,s.push(this),l?i&&i(this.original_src,this.num):t&&t(s)},a&&(o.onerror=function(e){a(e,this.original_src,this.num)}),document.getElementsByTagName("head")[0].appendChild(o)}},downloadURL(e,t){let a=new FileReader,i=function(e){var a=document.createElement("a");a.href=e,a.download=t,document.body.appendChild(a),a.click(),document.body.removeChild(a)};e.includes("http")?LX.request({url:e,dataType:"blob",success(e){a.readAsDataURL(e),a.onload=e=>{i(e.currentTarget.result)}}}):i(e)},downloadFile:function(e,t,a){if(!t){console.warn("No file provided to download");return}a||(a=t.constructor===String?"text/plain":"application/octet-stream");var i=null;i=t.constructor!==File&&t.constructor!==Blob?new Blob([t],{type:a}):t;var n=URL.createObjectURL(i),l=document.createElement("a");l.setAttribute("href",n),l.setAttribute("download",e),l.style.display="none",document.body.appendChild(l),l.click(),document.body.removeChild(l),setTimeout(function(){URL.revokeObjectURL(n)},6e4)}}),Object.defineProperty(String.prototype,"lastChar",{get:function(){return this[this.length-1]},enumerable:!0,configurable:!0}),Element.prototype.insertChildAtIndex=function(e,t=1/0){t>=this.children.length?this.appendChild(e):this.insertBefore(e,this.children[t])},Element.prototype.hasClass=function(e){return!!(e=[].concat(e)).filter(e=>this.classList.contains(e)).length},Element.prototype.addClass=function(e){e&&this.classList.add(e)},Element.prototype.getComputedSize=function(){let e=getComputedStyle(this);return{width:this.offsetWidth+e.getPropertyValue("marginLeft")+e.getPropertyValue("marginRight"),height:this.offsetHeight+e.getPropertyValue("marginTop")+e.getPropertyValue("marginBottom")}},Element.prototype.getParentArea=function(){let e=this.parentElement;for(;e;){if(e.classList.contains("lexarea"))return e;e=e.parentElement}},LX.UTILS={getTime:()=>new Date().getTime(),compareThreshold:(e,t,a,i)=>Math.abs(e-t)>=i||Math.abs(e-a)>=i,compareThresholdRange:(e,t,a,i)=>e>=a&&e<=i||t>=a&&t<=i||e<=a&&t>=i,uidGenerator:simple_guidGenerator,deleteElement(e){e&&e.remove()},flushCss(e){e.offsetHeight},getControlPoints(e,t,a,i,n,l,s){var r=Math.sqrt(Math.pow(a-e,2)+Math.pow(i-t,2)),o=s*r/(r+Math.sqrt(Math.pow(n-a,2)+Math.pow(l-i,2))),d=s-o;return[a+o*(e-n),i+o*(t-l),a-d*(e-n),i-d*(t-l)]},drawSpline(e,t,a){e.save();for(var i=[],n=t.length,l=0;l<n-4;l+=2)i=i.concat(LX.UTILS.getControlPoints(t[l],t[l+1],t[l+2],t[l+3],t[l+4],t[l+5],a));for(var l=2;l<t.length-5;l+=2)e.beginPath(),e.moveTo(t[l],t[l+1]),e.bezierCurveTo(i[2*l-2],i[2*l-1],i[2*l],i[2*l+1],t[l+2],t[l+3]),e.stroke(),e.closePath();e.beginPath(),e.moveTo(t[0],t[1]),e.quadraticCurveTo(i[0],i[1],t[2],t[3]),e.stroke(),e.closePath(),e.beginPath(),e.moveTo(t[n-2],t[n-1]),e.quadraticCurveTo(i[2*n-10],i[2*n-9],t[n-4],t[n-3]),e.stroke(),e.closePath(),e.restore()}};export{LX};
1
+ "use strict";var LX={version:"0.4.1",ready:!1,components:[],signals:{},extraCommandbarEntries:[],activeDraggable:null};function clamp(e,t,i){return Math.min(Math.max(e,t),i)}function round(e,t){return 0==t?Math.floor(e):+e.toFixed(t??2).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,"$1")}function remapRange(e,t,i,a,l){return(e-t)*(l-a)/(i-t)+a}LX.MOUSE_LEFT_CLICK=0,LX.MOUSE_MIDDLE_CLICK=1,LX.MOUSE_RIGHT_CLICK=2,LX.MOUSE_DOUBLE_CLICK=2,LX.MOUSE_TRIPLE_CLICK=3,LX.CURVE_MOVEOUT_CLAMP=0,LX.CURVE_MOVEOUT_DELETE=1,LX.DRAGGABLE_Z_INDEX=101,LX.clamp=clamp,LX.round=round,LX.remapRange=remapRange,"undefined"!=typeof performance?LX.getTime=performance.now.bind(performance):"undefined"!=typeof Date&&Date.now?LX.getTime=Date.now.bind(Date):"undefined"!=typeof process?LX.getTime=function(){var e=process.hrtime();return .001*e[0]+1e-6*e[1]}:LX.getTime=function(){return new Date().getTime()};let ASYNC_ENABLED=!0;function doAsync(e,t){ASYNC_ENABLED?setTimeout(e,t??0):e()}function getSupportedDOMName(e){return e.replace(/\s/g,"").replaceAll("@","_").replaceAll("+","_plus_").replaceAll(".","")}function has(e){return LX.components.indexOf(e)>-1}function getExtension(e){return e.includes(".")?e.split(".").pop():null}function deepCopy(e){return JSON.parse(JSON.stringify(e))}function setTheme(e){e="light"==e?"light":"dark",document.documentElement.setAttribute("data-theme",e),LX.emit("@on_new_color_scheme",e)}function setThemeColor(e,t){document.querySelector(":root").style.setProperty("--"+e,t)}function getThemeColor(e){let t=getComputedStyle(document.querySelector(":root")),i=t.getPropertyValue("--"+e);if(document.documentElement.getAttribute("data-theme"),i.includes("light-dark")){let a=t.getPropertyValue("color-scheme");return"light"==a?i.substring(i.indexOf("(")+1,i.indexOf(",")).replace(/\s/g,""):i.substring(i.indexOf(",")+1,i.indexOf(")")).replace(/\s/g,"")}return i}function getBase64Image(e){var t=document.createElement("canvas");return t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(e,0,0),t.toDataURL("image/png")}function hexToRgb(e){let t=parseInt(e.substring(1,3),16)/255,i=parseInt(e.substring(3,5),16)/255,a=parseInt(e.substring(5,7),16)/255;return[t,i,a]}function rgbToHex(e){let t="#";for(let i of e)t+=(i=Math.floor(255*i)).toString(16);return t}function measureRealWidth(e,t=8){var i=document.createElement("span");i.className="lexinputmeasure",i.innerHTML=e,document.body.appendChild(i);var a=i.getBoundingClientRect();return LX.UTILS.deleteElement(i),a.width+t}function simple_guidGenerator(){var e=function(){return((1+Math.random())*65536|0).toString(16).substring(1)};return e()+"-"+e()+"-"+e()}function buildTextPattern(e={}){let t=[];e.lowercase&&t.push("(?=.*[a-z])"),e.uppercase&&t.push("(?=.*[A-Z])"),e.digit&&t.push("(?=.*\\d)"),e.specialChar&&t.push("(?=.*[@#$%^&+=!])"),e.noSpaces&&t.push("(?!.*\\s)");let i,a=`^${t.join("")}.{${e.minLength||0},${e.maxLength||""}}$`;return e.asRegExp?RegExp(a):a}function makeDraggable(e,t={}){let i=0,a=0,l=null,n=t.targetClass,s=t.dragMargin??3,r=(t,l,n)=>{let r=e.parentElement?e.parentElement.getBoundingClientRect():{x:0,y:0,width:0,height:0},o="fixed"==e.style.position,d=o?new LX.vec2(r.x,r.y):new LX.vec2;n=n??t.clientX-i-r.x,l=l??t.clientY-a-r.y,e.style.left=clamp(n,s+d.x,d.x+r.width-e.offsetWidth-s)+"px",e.style.top=clamp(l,s+d.y,d.y+r.height-e.offsetHeight-s)+"px",e.style.translate="none"};t.autoAdjust&&r(null,parseInt(e.style.left),parseInt(e.style.top));let o=LX.UTILS.uidGenerator();e["draggable-id"]=o;let d=e=>{l&&r(e)},c=e=>{l&&t.onMove&&t.onMove(l)},h=t.onMove?c:d,u=t.onDragStart;e.setAttribute("draggable",!0),e.addEventListener("mousedown",function(e){l=e.target.classList.contains(n)||!n?e.target:null}),e.addEventListener("dragstart",function(t){if(t.preventDefault(),t.stopPropagation(),t.stopImmediatePropagation(),!l)return;var n=new Image;n.src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=",t.dataTransfer.setDragImage(n,0,0),t.dataTransfer.effectAllowed="move";let s=t.target.getBoundingClientRect(),r=l.parentElement.getBoundingClientRect(),o="fixed"==l.style.position,d=o?new LX.vec2(r.x,r.y):new LX.vec2;i=t.clientX-s.x-d.x,a=t.clientY-s.y-d.y,document.addEventListener("mousemove",h),l._eventCatched=!0,LX.activeDraggable&&(LX.activeDraggable.style.zIndex=LX.DRAGGABLE_Z_INDEX),LX.activeDraggable=e,LX.activeDraggable.style.zIndex=LX.DRAGGABLE_Z_INDEX+1,u&&u(l,t)},!1),document.addEventListener("mouseup",e=>{l&&(l=null,document.removeEventListener("mousemove",h))})}function makeCollapsible(e,t,i,a={}){e.classList.add("collapsible");let l=a.collapsed??!0,n=LX.makeIcon("Right");n.classList.add("collapser"),n.dataset.collapsed=l,n.style.marginLeft="auto",n.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),this.dataset.collapsed?(delete this.dataset.collapsed,t.style.display="block"):(this.dataset.collapsed=!0,t.style.display="none")}),e.appendChild(n),(i=i??e.parentElement).appendChild(t)}function makeCodeSnippet(e,t,i={}){if(!LX.has("CodeEditor")){console.error("Import the CodeEditor component to create snippets!");return}let a=document.createElement("div");a.className="lexcodesnippet",a.style.width=t?t[0]:"auto",a.style.height=t?t[1]:"auto";let l=new Area({noAppend:!0}),n=new LX.CodeEditor(l,{skipInfo:!0,disableEdition:!0,allowAddScripts:!1,name:i.tabName});if(n.setText(e,i.language??"Plain Text"),i.linesAdded){let s=n.root.querySelector(".code");for(let r of i.linesAdded)if(r.constructor==Number)s.childNodes[r-1].classList.add("added");else if(r.constructor==Array)for(let o=r[0]-1;o<=r[1]-1;o++)s.childNodes[o].classList.add("added")}if(i.linesRemoved){let d=n.root.querySelector(".code");for(let c of i.linesRemoved)if(c.constructor==Number)d.childNodes[c-1].classList.add("removed");else if(c.constructor==Array)for(let h=c[0]-1;h<=c[1]-1;h++)d.childNodes[h].classList.add("removed")}if(i.windowMode){let u=document.createElement("div");u.className="lexwindowbuttons";let p=document.createElement("span");p.style.background="#ee4f50";let m=document.createElement("span");m.style.background="#f5b720";let g=document.createElement("span");g.style.background="#53ca29",u.appendChild(p),u.appendChild(m),u.appendChild(g);let f=n.root.querySelector(".lexareatabs");f.prepend(u)}return(i.lineNumbers??!0)||n.root.classList.add("no-gutter"),a.appendChild(l.root),a}function makeIcon(e,t){let i=document.createElement("a");return i.title=t??"",i.className="lexicon",i.innerHTML=LX.ICONS[e]??"",i}function registerCommandbarEntry(e,t){LX.extraCommandbarEntries.push({name:e,callback:t})}LX.doAsync=doAsync,LX.getSupportedDOMName=getSupportedDOMName,LX.has=has,LX.getExtension=getExtension,LX.deepCopy=deepCopy,LX.setTheme=setTheme,LX.setThemeColor=setThemeColor,LX.getThemeColor=getThemeColor,LX.getBase64Image=getBase64Image,LX.hexToRgb=hexToRgb,LX.rgbToHex=rgbToHex,LX.measureRealWidth=measureRealWidth,LX.guidGenerator=simple_guidGenerator,LX.buildTextPattern=buildTextPattern,LX.makeDraggable=makeDraggable,LX.makeCollapsible=makeCollapsible,LX.makeCodeSnippet=makeCodeSnippet,LX.makeIcon=makeIcon,LX.registerCommandbarEntry=registerCommandbarEntry;class vec2{constructor(e,t){this.x=e??0,this.y=t??e??0}get xy(){return[this.x,this.y]}get yx(){return[this.y,this.x]}set(e,t){this.x=e,this.y=t}add(e,t=new vec2){return t.set(this.x+e.x,this.y+e.y),t}sub(e,t=new vec2){return t.set(this.x-e.x,this.y-e.y),t}mul(e,t=new vec2){return e.constructor==Number&&(e=new vec2(e)),t.set(this.x*e.x,this.y*e.y),t}div(e,t=new vec2){return e.constructor==Number&&(e=new vec2(e)),t.set(this.x/e.x,this.y/e.y),t}abs(e=new vec2){return e.set(Math.abs(this.x),Math.abs(this.y)),e}dot(e){return this.x*e.x+this.y*e.y}len2(){return this.dot(this)}len(){return Math.sqrt(this.len2())}nrm(e=new vec2){return e.set(this.x,this.y),e.mul(1/this.len(),e)}dst(e){return e.sub(this).len()}clp(e,t,i=new vec2){return i.set(clamp(this.x,e,t),clamp(this.y,e,t)),i}}function _createCommandbar(e){let t=document.createElement("dialog");t.className="commandbar",t.tabIndex=-1,e.appendChild(t);let i=[],a=null;t.addEventListener("keydown",function(e){if(e.stopPropagation(),e.stopImmediatePropagation(),a=a??-1,"Escape"==e.key)this.close(),p(!0);else if("Enter"==e.key){let l=i[a];if(l){let n=l.item.type&&"checkbox"===l.item.type;this.close(),n?(l.item.checked=!l.item.checked,l.callback.call(window,l.item.checked,l.entry_name)):l.callback.call(window,l.entry_name)}}else if("ArrowDown"==e.key&&a<i.length-1){a++,t.querySelectorAll(".hovered").forEach(e=>e.classList.remove("hovered")),i[a].classList.add("hovered");let s=i[a].offsetHeight*(a+1)-h.offsetHeight;s>0&&h.scrollTo({top:s,behavior:"smooth"})}else"ArrowUp"==e.key&&a>0&&(a--,t.querySelectorAll(".hovered").forEach(e=>e.classList.remove("hovered")),i[a].classList.add("hovered"))}),t.addEventListener("focusout",function(e){e.relatedTarget!=e.currentTarget&&(e.stopPropagation(),e.stopImmediatePropagation(),this.close(),p(!0))}),e.addEventListener("keydown",e=>{if(" "==e.key&&e.ctrlKey)e.stopImmediatePropagation(),e.stopPropagation(),LX.setCommandbarState(!0);else for(let t of LX.components){if(!LX[t]||!LX[t].prototype.onKeyPressed)continue;let i=LX.CodeEditor.getInstances();for(let a of i)a.onKeyPressed(e)}});let l=document.createElement("div");l.className="gs-header";let n=document.createElement("a");n.className="fa-solid fa-magnifying-glass",l.appendChild(n);let s=document.createElement("input");s.placeholder="Search...",s.value="",l.appendChild(s);let r=new Area({width:"100%",skipAppend:!0,className:"gs-tabs"}),o=r.addTabs(),d=null;{let c=(e,t)=>{d=t};o.add("All",document.createElement("div"),{selected:!0,onSelect:c})}let h=document.createElement("div");h.className="searchitembox";let u=null,p=e=>{h.innerHTML="",i.length=0,a=null,e&&(s.value="")},m=(e,l,n,s)=>{if(!e.length)return;u&&u.classList.remove("last");let r=document.createElement("div");r.className="searchitem last";let o=s&&s.type&&"checkbox"===s.type;o?r.innerHTML="<a class='fa fa-check'></a><span>"+(n+e)+"</span>":r.innerHTML=n+e,r.entry_name=e,r.callback=l,r.item=s,r.addEventListener("click",function(e){this.callback.call(window,this.entry_name),LX.setCommandbarState(!1),p(!0)}),r.addEventListener("mouseenter",function(e){t.querySelectorAll(".hovered").forEach(e=>e.classList.remove("hovered")),this.classList.add("hovered"),a=i.indexOf(this)}),r.addEventListener("mouseleave",function(e){this.classList.remove("hovered")}),i.push(r),h.appendChild(r),u=r},g=(e,t,i)=>{let a=Object.keys(e)[0];if((e.name??i+a).toLowerCase().includes(t)&&e.callback&&m(e.name??a,e.callback,i,e),!e.name)for(let l of(i+=a+" > ",e[a]))g(l,t,i)};return t._addElements=e=>{for(let t of(p(),LX.menubars))for(let i of t.items)g(i,e,"");for(let a of LX.extraCommandbarEntries){let l=a.name;l.toLowerCase().includes(e)&&m(l,a.callback,"",{})}if(LX.has("CodeEditor")){let n=LX.CodeEditor.getInstances();if(!n.length)return;let s=n[0].languages;for(let r of Object.keys(s)){let o="Language: "+r,d=n[0]._getFileIcon(null,s[r].ext),c=d.includes("fa-")?"<i class='"+d+"'></i>":"<img src='https://raw.githubusercontent.com/jxarco/lexgui.js/master/"+d+"'>";c+=o+" <span class='lang-ext'>("+s[r].ext+")</span>",o.toLowerCase().includes(e)&&m(c,()=>{for(let e of n)e._changeLanguage(r)},"",{})}}},s.addEventListener("input",function(e){t._addElements(this.value.toLowerCase())}),t.appendChild(l),t.appendChild(r.root),t.appendChild(h),t}function init(e={}){if(this.ready)return this.main_area;var t=document.createElement("div");t.id="lexroot",t.tabIndex=-1;var i=document.createElement("div");i.id="modal",this.modal=i,this.root=t,this.container=document.body,this.modal.classList.add("hiddenOpacity"),this.modal.toggle=function(e){this.classList.toggle("hiddenOpacity",e)},e.container&&(this.container=document.getElementById(e.container)),this.usingStrictViewport=e.strictViewport??!0,document.documentElement.setAttribute("data-strictVP",this.usingStrictViewport?"true":"false"),this.usingStrictViewport||document.addEventListener("scroll",e=>{let t=document.body.querySelectorAll(".lexmenubox");t.forEach(e=>{e._updatePosition()})}),this.commandbar=_createCommandbar(this.container),this.container.appendChild(i),e.skipRoot?this.root=document.body:this.container.appendChild(t);{let a=document.createElement("section");a.className="notifications",this.notifications=document.createElement("ol"),this.notifications.className="",this.notifications.iWidth=0,a.appendChild(this.notifications),this.container.appendChild(a),this.notifications.addEventListener("mouseenter",()=>{this.notifications.classList.add("list")}),this.notifications.addEventListener("mouseleave",()=>{this.notifications.classList.remove("list")})}t.addEventListener("dragover",function(e){e.preventDefault()},!1),document.addEventListener("contextmenu",function(e){e.preventDefault()},!1);var l=document.getElementsByTagName("HEAD")[0],n=document.createElement("link");return n.rel="stylesheet",n.type="text/css",n.crossOrigin="anonymous",n.href="https://use.fontawesome.com/releases/v6.7.2/css/all.css",l.appendChild(n),this.DEFAULT_NAME_WIDTH="30%",this.DEFAULT_SPLITBAR_SIZE=4,this.OPEN_CONTEXTMENU_ENTRY="click",this.ready=!0,this.menubars=[],e.skipRoot||e.skipDefaultArea||(this.main_area=new Area({id:e.id??"mainarea"})),(e.autoTheme??!0)&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches&&(LX.setTheme("light"),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{LX.setTheme(e.matches?"dark":"light")})),this.main_area}function setCommandbarState(e,t=!0){let i=this.commandbar;e?(i.show(),i.querySelector("input").focus(),t&&i._addElements(void 0)):i.close()}function message(e,t,i={}){if(!e)throw"No message to show";return i.modal=!0,new Dialog(t,t=>{t.addTextArea(null,e,null,{disabled:!0,fitHeight:!0})},i)}function popup(e,t,i={}){if(!e)throw"No message to show";i.size=i.size??["max-content","auto"],i.class="lexpopup";let a=i.timeout||3e3,l=new Dialog(t,t=>{t.addTextArea(null,e,null,{disabled:!0,fitHeight:!0})},i);return setTimeout(()=>{l.close()},Math.max(a,150)),l}function prompt(e,t,i,a={}){a.modal=!0,a.className="prompt";let l="",n=new Dialog(t,s=>{s.addTextArea(null,e,null,{disabled:!0,fitHeight:!0}),(a.input??!0)&&s.addText(null,a.input||l,e=>l=e,{placeholder:"..."}),s.sameLine(2),s.addButton(null,"Cancel",()=>{a.on_cancel&&a.on_cancel(),n.close()}),s.addButton(null,a.accept||"Continue",()=>{a.required&&""===l?(e+=e.includes("You must fill the input text.")?"":"\nYou must fill the input text.",n.close(),prompt(e,t,i,a)):(i&&i.call(this,l),n.close())},{buttonClass:"primary"})},a);return(a.input??!0)&&n.root.querySelector("input").focus(),n}function toast(e,t,i={}){if(!e)throw"The toast needs at least a title!";console.assert(this.notifications);let a=document.createElement("li");a.className="lextoast",a.style.translate="0 calc(100% + 30px)",this.notifications.prepend(a),doAsync(()=>{this.notifications.offsetWidth>this.notifications.iWidth&&(this.notifications.iWidth=Math.min(this.notifications.offsetWidth,480),this.notifications.style.width=this.notifications.iWidth+"px"),a.dataset.open=!0},10);let l=document.createElement("div");l.className="lextoastcontent",a.appendChild(l);let n=document.createElement("div");if(n.className="title",n.innerHTML=e,l.appendChild(n),t){let s=document.createElement("div");s.className="desc",s.innerHTML=t,l.appendChild(s)}if(i.action){let r=new Panel;r.addButton(null,i.action.name??"Accept",i.action.callback.bind(this,a),{width:"auto",maxWidth:"150px",className:"right",buttonClass:"outline"}),a.appendChild(r.root.childNodes[0])}let o=this;if(a.close=function(){this.dataset.closed=!0,doAsync(()=>{this.remove(),o.notifications.childElementCount||(o.notifications.style.width="unset",o.notifications.iWidth=0)},500)},i.closable??!0){let d=document.createElement("a");d.className="fa fa-xmark lexicon closer",d.addEventListener("click",()=>{a.close()}),a.appendChild(d)}let c=i.timeout??3e3;-1!=c&&doAsync(()=>{a.close()},c)}function badge(e,t,i={}){let a=document.createElement("div");return a.innerHTML=e,a.className="lexbadge "+(t??""),Object.assign(a.style,i.style??{}),a.outerHTML}function makeContainer(e,t,i={}){let a=document.createElement("div");return a.className="lexcontainer "+(t??""),a.style.width=e&&e[0]?e[0]:"100%",a.style.height=e&&e[1]?e[1]:"100%",Object.assign(a.style,i),a}LX.vec2=vec2,LX.init=init,LX.setCommandbarState=setCommandbarState,LX.message=message,LX.popup=popup,LX.prompt=prompt,LX.toast=toast,LX.badge=badge,LX.makeContainer=makeContainer;class IEvent{constructor(e,t,i){this.name=e,this.value=t,this.domEvent=i}}LX.IEvent=IEvent;class TreeEvent{static NONE=0;static NODE_SELECTED=1;static NODE_DELETED=2;static NODE_DBLCLICKED=3;static NODE_CONTEXTMENU=4;static NODE_DRAGGED=5;static NODE_RENAMED=6;static NODE_VISIBILITY=7;static NODE_CARETCHANGED=8;constructor(e,t,i){this.type=e||TreeEvent.NONE,this.node=t,this.value=i,this.multiple=!1,this.panel=null}string(){switch(this.type){case TreeEvent.NONE:return"tree_event_none";case TreeEvent.NODE_SELECTED:return"tree_event_selected";case TreeEvent.NODE_DELETED:return"tree_event_deleted";case TreeEvent.NODE_DBLCLICKED:return"tree_event_dblclick";case TreeEvent.NODE_CONTEXTMENU:return"tree_event_contextmenu";case TreeEvent.NODE_DRAGGED:return"tree_event_dragged";case TreeEvent.NODE_RENAMED:return"tree_event_renamed";case TreeEvent.NODE_VISIBILITY:return"tree_event_visibility";case TreeEvent.NODE_CARETCHANGED:return"tree_event_caretchanged"}}}function emit(e,t,i={}){let a=LX.signals[e];if(!a)return;let l=i.target;if(l){l[e]&&l[e].call(l,t);return}for(let n of a)if(n.constructor===Widget)n.set(t,i.skipCallback??!0),n.options&&n.options.callback&&n.options.callback(t,a);else{let s=n;s(null,t)}}function addSignal(e,t,i){t[e]=i,LX.signals[e]||(LX.signals[e]=[]),!(LX.signals[e].indexOf(t)>-1)&&LX.signals[e].push(t)}LX.TreeEvent=TreeEvent,LX.emit=emit,LX.addSignal=addSignal;class Area{constructor(e={}){var t,i=document.createElement("div");i.className="lexarea",e.id&&(i.id=e.id),e.className&&(i.className+=" "+e.className);var a=e.width||"calc( 100% )",l=e.height||"100%";this.setLimitBox(e.minWidth,e.minHeight,e.maxWidth,e.maxHeight),a.constructor==Number&&(a+="px"),l.constructor==Number&&(l+="px"),i.style.width=a,i.style.height=l,this.offset=0,this.root=i,this.size=[this.root.offsetWidth,this.root.offsetHeight],this.sections=[],this.panels=[],!e.skipAppend&&document.getElementById("lexroot").appendChild(this.root);let n=e.overlay;if(n){this.root.classList.add("overlay-"+n),e.left?this.root.style.left=e.left:e.right?this.root.style.right=e.right:e.top?this.root.style.top=e.top:e.bottom&&(this.root.style.bottom=e.bottom);let s=e.draggable??!0;if(s&&makeDraggable(i,e),e.resizeable&&i.classList.add("resizeable"),e.resize){this.splitBar=document.createElement("div");let r="left"==n||"right"==n?"horizontal":"vertical";if(this.type=n,this.splitBar.className="lexsplitbar "+r,"right"==n)this.splitBar.style.width=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.style.left=-(LX.DEFAULT_SPLITBAR_SIZE/2)+"px";else if("left"==n){let o=Math.min(document.body.clientWidth-LX.DEFAULT_SPLITBAR_SIZE,this.root.clientWidth);this.splitBar.style.width=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.style.left=o+LX.DEFAULT_SPLITBAR_SIZE/2+"px"}else if("top"==n){let d=Math.min(document.body.clientHeight-LX.DEFAULT_SPLITBAR_SIZE,this.root.clientHeight);this.splitBar.style.height=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.style.top=d+LX.DEFAULT_SPLITBAR_SIZE/2+"px"}else"bottom"==n&&(this.splitBar.style.height=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.style.top=-(LX.DEFAULT_SPLITBAR_SIZE/2)+"px");this.splitBar.addEventListener("mousedown",u),this.root.appendChild(this.splitBar);var c=this,h=[0,0];function u(e){var t=c.root.ownerDocument;t.addEventListener("mousemove",p),t.addEventListener("mouseup",m),h[0]=e.x,h[1]=e.y,e.stopPropagation(),e.preventDefault(),document.body.classList.add("nocursor"),c.splitBar.classList.add("nocursor")}function p(e){switch(c.type){case"right":var t=h[0]-e.x,i=c.root.offsetWidth+t;c.root.style.width=i+"px";break;case"left":var t=h[0]-e.x,i=Math.min(document.body.clientWidth-LX.DEFAULT_SPLITBAR_SIZE,c.root.offsetWidth-t);c.root.style.width=i+"px",c.splitBar.style.left=i+LX.DEFAULT_SPLITBAR_SIZE/2+"px";break;case"top":var t=h[1]-e.y,i=Math.min(document.body.clientHeight-LX.DEFAULT_SPLITBAR_SIZE,c.root.offsetHeight-t);c.root.style.height=i+"px",c.splitBar.style.top=i+LX.DEFAULT_SPLITBAR_SIZE/2+"px";break;case"bottom":var t=h[1]-e.y,i=c.root.offsetHeight+t;c.root.style.height=i+"px"}h[0]=e.x,h[1]=e.y,e.stopPropagation(),e.preventDefault(),c.onresize&&c.onresize(c.root.getBoundingClientRect())}function m(e){var t=c.root.ownerDocument;t.removeEventListener("mousemove",p),t.removeEventListener("mouseup",m),document.body.classList.remove("nocursor"),c.splitBar.classList.remove("nocursor")}}}}attach(e){if(this.sections.length){this.sections[1].attach(e);return}if(!e)throw"no content to attach";e.parent=this;let t=e.root?e.root:e;this.root.appendChild(t)}split(e={}){this.sections.length&&(this.offset=this.root.childNodes[0].offsetHeight,this._root=this.sections[0].root,this.root=this.sections[1].root);var t=e.type||"horizontal",i=e.sizes||["50%","50%"],a="auto"===e.sizes;if(!i[1]){let l=i[0],n=e.top?e.top:0;l.constructor==Number&&(l+=n,l+="px"),i[1]="calc( 100% - "+l+" )"}var s=new Area({skipAppend:!0,className:"split"+(e.menubar||e.sidebar?"":" origin")}),r=new Area({skipAppend:!0,className:"split"});s.parentArea=this,r.parentArea=this;let o=e.minimizable??!1,d=(e.resize??!0)||o;var c="0px";if(this.offset=0,d&&(this.resize=d,this.splitBar=document.createElement("div"),this.splitBar.className="lexsplitbar "+t,"horizontal"==t?this.splitBar.style.width=LX.DEFAULT_SPLITBAR_SIZE+"px":this.splitBar.style.height=LX.DEFAULT_SPLITBAR_SIZE+"px",this.splitBar.addEventListener("mousedown",function e(t){var i=f.root.ownerDocument;i.addEventListener("mousemove",v),i.addEventListener("mouseup",E),t.stopPropagation(),t.preventDefault(),document.body.classList.add("nocursor"),f.splitBar.classList.add("nocursor")}),c=LX.DEFAULT_SPLITBAR_SIZE/2+"px",o&&(this.splitExtended=!1,r.root.addEventListener("animationend",e=>{let i=getComputedStyle(r.root).opacity;r.root.classList.remove(e.animationName+"-"+t),r.root.style.opacity=i,flushCss(r.root)}),this.splitBar.addEventListener("contextmenu",e=>{e.preventDefault(),addContextMenu(null,e,e=>{e.add("Extend",{disabled:this.splitExtended,callback:()=>{this.extend()}}),e.add("Reduce",{disabled:!this.splitExtended,callback:()=>{this.reduce()}})})}))),"horizontal"==t){var h=i[0],u=i[1];h.constructor==Number&&(h+="px"),u.constructor==Number&&(u+="px"),s.root.style.width="calc( "+h+" - "+c+" )",s.root.style.height="calc(100% - 0px)",r.root.style.width="calc( "+u+" - "+c+" )",r.root.style.height="calc(100% - 0px)",this.root.style.display="flex"}else if(s.root.style.width="100%",r.root.style.width="100%",a){s.root.style.height="auto";let p=new ResizeObserver(e=>{for(let t of e){let i=t.contentRect;r.root.style.height="calc(100% - "+(i.height+4)+"px )"}});p.observe(s.root)}else{var m=i[0],g=i[1];m.constructor==Number&&(m+="px"),g.constructor==Number&&(g+="px"),s.root.style.width="100%",s.root.style.height="auto"==m?m:"calc( "+m+" - "+c+" )",r.root.style.height="auto"==g?g:"calc( "+g+" - "+c+" )"}if(this.root.appendChild(s.root),d&&this.root.appendChild(this.splitBar),this.root.appendChild(r.root),this.sections=[s,r],this.type=t,this._update(),!d)return this.sections;var f=this;function v(e){"horizontal"==f.type?f._moveSplit(-e.movementX):f._moveSplit(-e.movementY);let t=f.root.querySelectorAll(".lexwidget");for(let i of t){let a=i.jsInstance;a.onresize&&a.onresize()}e.stopPropagation(),e.preventDefault()}function E(e){var t=f.root.ownerDocument;t.removeEventListener("mousemove",v),t.removeEventListener("mouseup",E),document.body.classList.remove("nocursor"),f.splitBar.classList.remove("nocursor")}return this.sections}setLimitBox(e=0,t=0,i=1/0,a=1/0){this.minWidth=e,this.minHeight=t,this.maxWidth=i,this.maxHeight=a}setSize(e){let[t,i]=e;void 0!=t&&t.constructor==Number&&(t+="px"),void 0!=i&&i.constructor==Number&&(i+="px"),t&&(this.root.style.width=t),i&&(this.root.style.height=i),this.onresize&&this.onresize(this.root.getBoundingClientRect()),doAsync(()=>{this.size=[this.root.clientWidth,this.root.clientHeight],this.propagateEvent("onresize")},150)}extend(){if(this.splitExtended)return;let[e,t]=this.sections;this.splitExtended=!0,"vertical"==this.type?(this.offset=t.root.offsetHeight,t.root.classList.add("fadeout-vertical"),this._moveSplit(-1/0,!0)):(this.offset=t.root.offsetWidth-8,t.root.classList.add("fadeout-horizontal"),this._moveSplit(-1/0,!0,8)),doAsync(()=>this.propagateEvent("onresize"),150)}reduce(){if(!this.splitExtended)return;this.splitExtended=!1;let[e,t]=this.sections;"vertical"==this.type?(t.root.classList.add("fadein-vertical"),this._moveSplit(this.offset)):(t.root.classList.add("fadein-horizontal"),this._moveSplit(this.offset)),doAsync(()=>this.propagateEvent("onresize"),150)}hide(){this.root.classList.add("hidden")}show(){this.root.classList.remove("hidden")}toggle(e){this.root.classList.toggle("hidden",e)}propagateEvent(e){for(var t=0;t<this.sections.length;t++){let i=this.sections[t];i[e]&&i[e].call(this,i.root.getBoundingClientRect()),i.propagateEvent(e)}}addPanel(e){let t=new Panel(e);return this.attach(t),this.panels.push(t),t}addMenubar(e,t={}){let i=new Menubar(t);e&&e(i),LX.menubars.push(i);let[a,l]=this.split({type:"vertical",sizes:[48,null],resize:!1,menubar:!0});return i.siblingArea=l,a.attach(i),a.isMenubar=!0,(t.sticky??!0)&&a.root.classList.add("sticky"),i}addSidebar(e,t={}){let i=new SideBar(t);e&&e(i),i.update(),LX.menubars.push(i);let a=t.width??"16rem",[l,n]=this.split({type:"horizontal",sizes:[a,null],resize:!1,sidebar:!0});return i.siblingArea=n,l.attach(i),l.isSidebar=!0,i}addOverlayButtons(e,t={}){if(this.sections.length){this.sections[1].addOverlayButtons(e,t);return}console.assert(e.constructor==Array&&e.length),this.root.style.position="relative",t.className="lexoverlaybuttons";let i=this.addPanel(t),a=null,l=document.createElement("div");l.className="lexoverlaybuttonscontainer",l.appendChild(i.root),this.attach(l);let n=t.float;if(n)for(var s=0;s<n.length;s++){let r=n[s];switch(r){case"h":case"t":case"l":break;case"v":l.className+=" vertical";break;case"m":l.className+=" middle";break;case"b":l.className+=" bottom";break;case"c":l.className+=" center";break;case"r":l.className+=" right"}}let o=function(e,t,l){let n={width:"auto",selectable:e.selectable,selected:e.selected,icon:e.icon,img:e.img,className:e.class};t&&(a||((a=document.createElement("div")).className="lexoverlaygroup",i.queuedContainer=a),n.parent=a);let s=e.callback;e.options?i.addDropdown(null,e.options,e.name,s,n):i.addButton(null,e.name,function(t,i){if(e.selectable){if(e.group){let a=e.selected;e.group.forEach(e=>e.selected=!1),e.selected=!a}else e.selected=!e.selected}s(t,i)},n),a&&l&&(i.root.appendChild(a),a=null,i.clearQueue())};!function(){for(let t of(i.clear(),e))if(t.constructor===Array)for(let a=0;a<t.length;++a){let s=t[a];s.group=t,o(s,!0,a==t.length-1)}else o(t);if(n){var r=0;i.root.childNodes.forEach(e=>{r+=e.offsetHeight}),l.className.includes("middle")&&(l.style.top="-moz-calc( 50% - "+.5*r+"px )",l.style.top="-webkit-calc( 50% - "+.5*r+"px )",l.style.top="calc( 50% - "+.5*r+"px )")}}()}addTabs(e={}){let t=new Tabs(this,e);return e.folding&&(this.parentArea._disableSplitResize(),this.root.style.paddingTop="4px"),t}_moveSplit(e,t=!1,i=0){if(!this.type)throw"No split area";if(void 0===e)return;let a=this.sections[0];var l=a.root;l.classList.contains("origin")||(l=l.parentElement);let n=this.sections[1],s=n.root,r=" - "+LX.DEFAULT_SPLITBAR_SIZE+"px",o=null;if(t||(o=l.style.transition,l.style.transition=s.style.transition="none",flushCss(l),flushCss(s)),"horizontal"==this.type){var d=Math.max(s.offsetWidth+e,parseInt(n.minWidth));i&&(d=i),l.style.width="-moz-calc( 100% - "+d+"px "+r+" )",l.style.width="-webkit-calc( 100% - "+d+"px "+r+" )",l.style.width="calc( 100% - "+d+"px "+r+" )",l.style.minWidth=parseInt(a.minWidth)+"px",s.style.width=d+"px",a.maxWidth!=1/0&&(s.style.minWidth="calc( 100% - "+parseInt(a.maxWidth)+"px )")}else{var d=Math.max(s.offsetHeight+e+n.offset,parseInt(n.minHeight));i&&(d=i),l.style.height="-moz-calc( 100% - "+d+"px "+r+" )",l.style.height="-webkit-calc( 100% - "+d+"px "+r+" )",l.style.height="calc( 100% - "+d+"px "+r+" )",l.style.minHeight=a.minHeight+"px",s.style.height=d-n.offset+"px"}t||(l.style.transition=s.style.transition=o),this._update(),this.propagateEvent("onresize")}_disableSplitResize(){this.resize=!1,this.splitBar.remove(),delete this.splitBar}_update(){let e=this.root.getBoundingClientRect();this.size=[e.width,e.height];for(var t=0;t<this.sections.length;t++)this.sections[t]._update()}}function flushCss(e){e.offsetHeight}LX.Area=Area;class Tabs{static TAB_SIZE=28;static TAB_ID=0;constructor(e,t={}){this.onclose=t.onclose;let i=document.createElement("div");i.className="lexareatabs "+(t.fit?"fit":"row");let a=t.folding??!1;a&&i.classList.add("folding");let l=this;if(i.addEventListener("dragenter",function(e){e.preventDefault(),this.classList.add("dockingtab")}),i.addEventListener("dragleave",function(e){e.preventDefault(),this.classList.remove("dockingtab")}),i.addEventListener("drop",function(e){e.preventDefault();let t=e.dataTransfer.getData("source"),i=document.getElementById(t);if(!i)return;this.appendChild(i);let a=document.getElementById(t+"_content");l.area.attach(a),this.classList.remove("dockingtab"),LX.emit("@on_tab_docked"),i.instance=l,i.click(),l.tabs[i.dataset.name]=a}),e.root.classList.add("lexareatabscontainer"),e.split({type:"vertical",sizes:t.sizes??"auto",resize:!1,top:6}),e.sections[0].attach(i),this.area=e.sections[1],this.area.root.className+=" lexareatabscontent",this.selected=null,this.root=i,this.tabs={},this.tabDOMs={},t.fit){let n=document.createElement("span");n.className="lexareatab thumb",this.thumb=n,this.root.appendChild(n);let s=new ResizeObserver(e=>{let t=this.thumb.item;if(t){var i=this.thumb.style.transition;this.thumb.style.transition="none",this.thumb.style.transform="translate( "+t.childIndex*t.offsetWidth+"px )",this.thumb.style.width=t.offsetWidth-5+"px",this.thumb.style.height=t.offsetHeight-6+"px",flushCss(this.thumb),this.thumb.style.transition=i}});s.observe(this.area.root)}if(a){this.folded=!0,this.folding=a,"up"==a&&e.root.insertChildAtIndex(e.sections[1].root,0);let r=new ResizeObserver(t=>{for(let i of t){let a=i.contentRect,l=e.parentArea.sections[0].root;l.style.height="calc(100% - "+(42+a.height)+"px )"}});r.observe(this.area.root),this.area.root.classList.add("folded")}}add(e,t,i={}){let a=i.selected??!1;a&&(this.root.querySelectorAll("span").forEach(e=>e.classList.remove("selected")),this.area.root.querySelectorAll(".lextabcontent").forEach(e=>e.style.display="none")),a=!Object.keys(this.tabs).length&&!this.folding||a;let l=t.root?t.root:t;l.originalDisplay=l.style.display,l.style.display=a?l.originalDisplay:"none",l.classList.add("lextabcontent"),i.icon&&(i.icon.includes("fa-")?i.icon="<i class='"+i.icon+"'></i>":i.icon="<img src='https://raw.githubusercontent.com/jxarco/lexgui.js/master/"+i.icon+"'>");let n=document.createElement("span");n.dataset.name=e,n.className="lexareatab"+(a?" selected":""),n.innerHTML=(i.icon??"")+e,n.id=e.replace(/\s/g,"")+Tabs.TAB_ID++,n.title=i.title??"",n.selected=a??!1,n.fixed=i.fixed,n.instance=this,l.id=n.id+"_content",n.selected&&(this.selected=e),LX.addSignal("@on_tab_docked",n,function(){1==this.parentElement.childNodes.length&&this.parentElement.childNodes[0].click()}),n.addEventListener("click",e=>{if(e.preventDefault(),e.stopPropagation(),!n.fixed){let t=n.selected;n.parentElement.querySelectorAll("span").forEach(e=>e.selected=!1),n.selected=!t,n.parentElement.querySelectorAll("span").forEach(e=>e.classList.remove("selected")),n.classList.toggle("selected",this.folding&&n.selected),n.instance.area.root.querySelectorAll(".lextabcontent").forEach(e=>e.style.display="none"),l.style.display=l.originalDisplay,n.instance.selected=n.dataset.name}this.folding&&(this.folded=n.selected,this.area.root.classList.toggle("folded",!this.folded)),i.onSelect&&i.onSelect(e,n.dataset.name),this.thumb&&(this.thumb.style.transform="translate( "+n.childIndex*n.offsetWidth+"px )",this.thumb.style.width=n.offsetWidth-5+"px",this.thumb.style.height=n.offsetHeight-6+"px",this.thumb.item=n)}),n.addEventListener("contextmenu",e=>{e.preventDefault(),e.stopPropagation(),i.onContextMenu&&i.onContextMenu(e,n.dataset.name)}),n.addEventListener("mouseup",e=>{e.preventDefault(),e.stopPropagation(),1==e.button&&this.delete(n.dataset.name)}),n.setAttribute("draggable",!0),n.addEventListener("dragstart",function(e){if(1==this.parentElement.childNodes.length){e.preventDefault();return}e.dataTransfer.setData("source",e.target.id)}),n.childIndex=this.root.childElementCount-1,this.root.appendChild(n),this.area.attach(l),this.tabDOMs[e]=n,this.tabs[e]=t,setTimeout(()=>{i.onCreate&&i.onCreate.call(this,this.area.root.getBoundingClientRect()),a&&this.thumb&&(this.thumb.style.transform="translate( "+n.childIndex*n.offsetWidth+"px )",this.thumb.style.width=n.offsetWidth-5+"px",this.thumb.style.height=n.offsetHeight-6+"px",this.thumb.item=n)},10)}select(e){this.tabDOMs[e]&&this.tabDOMs[e].click()}delete(e){let t=this.tabDOMs[e];if(!t||t.fixed)return;this.onclose&&this.onclose(e),this.tabDOMs[e].remove(),delete this.tabDOMs[e],this.tabs[e].remove(),delete this.tabs[e];let i=this.root.lastChild;i&&!i.fixed&&this.root.lastChild.click()}}LX.Tabs=Tabs;class Menubar{constructor(e={}){this.root=document.createElement("div"),this.root.className="lexmenubar",e.float&&(this.root.style.justifyContent=e.float),this.items=[],this.buttons=[],this.icons={},this.shorts={}}_resetMenubar(){this.root.querySelectorAll(".lexmenuentry").forEach(e=>{e.classList.remove("selected"),e.built=!1}),LX.root.querySelectorAll(".lexmenubox").forEach(e=>e.remove()),this.focused=!1}_createSubmenu(e,t,i,a){let l=document.createElement("div");l.className="lexmenubox",l.tabIndex="0",i.currentMenu=l,l.parentEntry=i;let n=i.classList.contains("lexmenuboxentry");n&&(l.dataset.submenu=!0),l._updatePosition=()=>{let e=l.style.transition;l.style.transition="none",flushCss(l),doAsync(()=>{let t=i.getBoundingClientRect();t.x+=document.scrollingElement.scrollLeft,t.y+=document.scrollingElement.scrollTop,l.style.left=(n?t.x+t.width:t.x)+"px",l.style.top=(n?t.y:t.y+t.height-4)+"px",l.style.transition=e})},l._updatePosition(),doAsync(()=>{l.dataset.open=!0},10),LX.root.appendChild(l);for(var s=0;s<e[t].length;++s){let r=e[t][s],o=Object.keys(r)[0],d=r[o].length,c="checkbox"==r.type,h=document.createElement("div");if(h.className="lexmenuboxentry",h.className+=(s==e[t].length-1?" last":"")+(r.disabled?" disabled":""),""==o)h.className=" lexseparator";else{h.id=o;let u=document.createElement("div");u.innerHTML="",u.classList="lexmenuboxentrycontainer",h.appendChild(u);let p=this.icons[o];c?u.innerHTML+="<input type='checkbox' >":p?u.innerHTML+="<a class='"+p+" fa-sm'></a>":(u.innerHTML+="<a class='fa-solid fa-sm noicon'></a>",u.classList.add("noicon")),u.innerHTML+="<div class='lexentryname'>"+o+"</div>"}let m=h.querySelector("input");if(m&&(m.checked=r.checked??!1,m.addEventListener("change",e=>{r.checked=m.checked;let t=r.callback;t&&(t.call(this,r.checked,o,h),this._resetMenubar()),e.stopPropagation(),e.stopImmediatePropagation()})),l.appendChild(h),""==o)continue;if(l.addEventListener("keydown",e=>{e.preventDefault();let t=this.shorts[o];t&&(t=1==t.length?t.toLowerCase():t)==e.key&&h.click()}),h.addEventListener("click",e=>{m&&(r.checked=!r.checked);let t=r.callback;t&&(t.call(this,m?r.checked:o,m?o:h),this._resetMenubar()),e.stopPropagation(),e.stopImmediatePropagation()}),!d){if(this.shorts[o]){let g=document.createElement("div");g.className="lexentryshort",g.innerText=this.shorts[o],h.appendChild(g)}continue}let f=document.createElement("a");f.className="fa-solid fa-angle-right fa-xs",h.appendChild(f),h.addEventListener("mouseover",e=>{!h.built&&(h.built=!0,this._createSubmenu(r,o,h,++a),e.stopPropagation())}),h.addEventListener("mouseleave",e=>{h.currentMenu&&h.currentMenu!=e.toElement&&(a=-1,delete h.built,h.currentMenu.remove(),delete h.currentMenu)})}l.style.width=l.offsetWidth+"px"}add(e,t={}){t.constructor==Function&&(t={callback:t});let i=e.split("/"),a=i[i.length-1];this.icons[a]=t.icon,this.shorts[a]=t.short;let l=0,n=(e,a)=>{if(void 0==e)return;let s=null;if(a.forEach(t=>{let i=Object.keys(t),a=i.find(t=>t==e);a&&(s=t[a])}),s)n(i[l++],s);else{let r={};r[e]=[];let o=i[l++];o||(r.callback=t.callback,r.disabled=t.disabled,r.type=t.type,r.checked=t.checked),a.push(r),n(o,r[e])}};for(let s of(n(i[l++],this.items),this.items)){let r=Object.keys(s)[0],o=r.replace(/\s/g,"").replaceAll(".","");if(this.root.querySelector("#"+o))continue;let d=document.createElement("div");d.className="lexmenuentry",d.id=o,d.innerHTML="<span>"+r+"</span>",d.tabIndex="1","left"==t.position?this.root.prepend(d):("right"==t.position&&(d.right=!0),this.root.lastChild&&this.root.lastChild.right?this.root.lastChild.before(d):this.root.appendChild(d));let c=()=>{this._resetMenubar(),d.classList.add("selected"),d.built=!0,this._createSubmenu(s,r,d,-1)};d.addEventListener("click",()=>{let e=s.callback;if(e){e.call(this,r,d);return}c(),this.focused=!0}),d.addEventListener("mouseover",e=>{this.focused&&!d.built&&c()}),d.addEventListener("blur",e=>{!(e.relatedTarget&&e.relatedTarget.classList.contains("lexmenubox"))&&this._resetMenubar()})}}getButton(e){return this.buttons[e]}getSubitem(e,t){let i=null,a=t[0];for(let l=0;l<e.length;l++)if(e[l][a]){if(1==t.length)return e[l];return t.splice(0,1),this.getSubitem(e[l][a],t)}}getItem(e){let t=e.split("/");return this.getSubitem(this.items,t)}setButtonIcon(e,t,i,a={}){let l=this.buttons[e];if(l)l.querySelector("a").className="fa-solid "+t+" lexicon";else{let n=document.createElement("div"),s=a.disabled??!1;n.className="lexmenubutton"+(s?" disabled":""),n.title=e??"",n.innerHTML="<a class='"+t+" lexicon' style='font-size:x-large;'></a>",n.style.padding="5px 10px",n.style.maxHeight="calc(100% - 10px)",n.style.alignItems="center","right"==a.float&&(n.right=!0),this.root.lastChild&&this.root.lastChild.right?this.root.lastChild.before(n):"left"==a.float?this.root.prepend(n):this.root.appendChild(n);let r=n.querySelector("a");r.addEventListener("click",e=>{i&&!s&&i.call(this,r,e)})}}setButtonImage(e,t,i,a={}){let l=this.buttons[e];if(l)l.querySelector("a").className="fa-solid "+icon+" lexicon";else{let n=document.createElement("div"),s=a.disabled??!1;n.className="lexmenubutton"+(s?" disabled":""),n.title=e??"",n.innerHTML="<a><image src='"+t+"' class='lexicon' style='height:32px;'></a>",n.style.padding="5px",n.style.alignItems="center","right"==a.float&&(n.right=!0),this.root.lastChild&&this.root.lastChild.right?this.root.lastChild.before(n):"left"==a.float?this.root.prepend(n):this.root.appendChild(n);let r=n.querySelector("a");r.addEventListener("click",e=>{i&&!s&&i.call(this,r,e)})}}addButtons(e,t={}){if(!e)throw"No buttons to add!";this.buttonContainer||(this.buttonContainer=document.createElement("div"),this.buttonContainer.className="lexmenubuttons",this.buttonContainer.classList.add(t.float??"center"),"right"==t.position&&(this.buttonContainer.right=!0),this.root.lastChild&&this.root.lastChild.right?this.root.lastChild.before(this.buttonContainer):this.root.appendChild(this.buttonContainer));for(let i=0;i<e.length;++i){let a=e[i],l=document.createElement("label"),n=a.title,s=a.disabled??!1;l.className="lexmenubutton"+(s?" disabled":""),l.title=n??"",this.buttonContainer.appendChild(l);let r=document.createElement("a");r.className=a.icon+" lexicon",l.appendChild(r);let o=r;if(a.swap){l.classList.add("swap"),r.classList.add("swap-off");let d=document.createElement("input");d.type="checkbox",l.prepend(d),o=d;let c=document.createElement("a");c.className=a.swap+" swap-on lexicon",l.appendChild(c),l.swap=function(){let e=this.querySelector("input");e.checked=!e.checked},l.setState=function(e){let t=this.querySelector("input");t.checked=e}}o.addEventListener("click",e=>{if(a.callback&&!s){let t=l.querySelector("input");a.callback.call(this,e,t?.checked)}}),n&&(this.buttons[n]=l)}}}LX.Menubar=Menubar;class SideBar{constructor(e={}){this.root=document.createElement("div"),this.root.className="lexsidebar",this.collapsable=e.collapsable??!0,this._collapseWidth=e.collapseToIcons??!0?"58px":"0px",this.collapsed=!1,this.filterString="",doAsync(()=>{this.root.parentElement.ogWidth=this.root.parentElement.style.width,this.root.parentElement.style.transition="width 0.25s ease-out",this.resizeObserver=new ResizeObserver(e=>{for(let t of e)this.siblingArea.setSize(["calc(100% - "+t.contentRect.width+"px )",null])})},10);let t=32;if(!e.skipHeader){this.header=document.createElement("div"),this.header.className="lexsidebarheader",this.root.appendChild(this.header),this.header.addEventListener("click",t=>{this.collapsed?(t.preventDefault(),t.stopPropagation(),this.toggleCollapsed()):e.onHeaderPressed&&e.onHeaderPressed(t)});let i=document.createElement("span");if(i.className="lexavatar",this.header.appendChild(i),e.headerImage){let a=document.createElement("img");a.src=e.headerImage,i.appendChild(a)}else if(e.headerIcon){let l=LX.makeIcon(e.headerIcon);i.appendChild(l)}{let n=document.createElement("div");this.header.appendChild(n);let s=document.createElement("span");s.innerHTML=e.headerTitle??"",n.appendChild(s);let r=document.createElement("span");r.innerHTML=e.headerSubtitle??"",n.appendChild(r)}if(this.collapsable){let o=LX.makeIcon("Sidebar","Toggle Sidebar");this.header.appendChild(o),o.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation(),this.toggleCollapsed()})}t+=52}if(!e.filter){let d=new Panel;d.addText(null,"",(e,t)=>{this.filterString=e,this.update()},{placeholder:"Search...",icon:"fa-solid fa-magnifying-glass"}),this.filter=d.root.childNodes[0],this.root.appendChild(this.filter),t+=31}if(this.content=document.createElement("div"),this.content.className="lexsidebarcontent",this.root.appendChild(this.content),!e.skipFooter){this.footer=document.createElement("div"),this.footer.className="lexsidebarfooter",this.root.appendChild(this.footer),this.footer.addEventListener("click",t=>{e.onFooterPressed&&e.onFooterPressed(t)});let c=document.createElement("span");if(c.className="lexavatar",this.footer.appendChild(c),e.footerImage){let h=document.createElement("img");h.src=e.footerImage,c.appendChild(h)}else if(e.footerIcon){let u=LX.makeIcon(e.footerIcon);c.appendChild(u)}{let p=document.createElement("div");this.footer.appendChild(p);let m=document.createElement("span");m.innerHTML=e.footerTitle??"",p.appendChild(m);let g=document.createElement("span");g.innerHTML=e.footerSubtitle??"",p.appendChild(g)}let f=LX.makeIcon("MenuArrows");this.footer.appendChild(f),t+=52}this.content.style.height=`calc(100% - ${t}px)`,this.items=[],this.icons={},this.groups={}}toggleCollapsed(e){if(this.collapsable){if(this.collapsed=e??!this.collapsed,this.collapsed?(this.root.classList.add("collapsing"),this.root.parentElement.style.width=this._collapseWidth):(this.root.classList.remove("collapsing"),this.root.classList.remove("collapsed"),this.root.parentElement.style.width=this.root.parentElement.ogWidth),!this.resizeObserver)throw"Wait until ResizeObserver has been created!";this.resizeObserver.observe(this.root.parentElement),doAsync(()=>{this.root.classList.toggle("collapsed",this.collapsed),this.resizeObserver.unobserve(this.root.parentElement)},250)}}separator(){this.currentGroup=null,this.add("")}group(e,t){this.currentGroup=e,this.groups[e]=t}add(e,t={}){t.constructor==Function&&(t={callback:t});let i=e.split("/"),a=i[i.length-1];this.icons[a]=t.icon;let l=0,n=(e,a)=>{if(void 0==e)return;let s=null;if(a.forEach(t=>{let i=Object.keys(t),a=i.find(t=>t==e);a&&(s=t[a])}),s)n(i[l++],s);else{let r={};r[e]=[];let o=i[l++];o||(r.callback=t.callback,r.group=this.currentGroup,r.options=t),a.push(r),n(o,r[e])}};n(i[l++],this.items)}select(e){let t=e.replace(/\s/g,"").replaceAll(".",""),i=this.items.find(e=>e.name===t);i&&i.dom.click()}update(){for(let e of(this.content.innerHTML="",this.items))delete e.dom;for(let t of this.items){let i=t.options??{};if(t.dom)continue;let a=Object.keys(t)[0];if(this.filterString.length&&!a.toLowerCase().includes(this.filterString.toLowerCase()))continue;let l=a.replace(/\s/g,"").replaceAll(".",""),n=null,s=document.createElement("div");if(s.className="lexsidebarentry "+(i.className??""),s.id=t.name=l,t.group){let r=t.group.replace(/\s/g,"").replaceAll(".","");if(n=this.content.querySelector("#"+r)){if(!n.classList.contains("lexsidebargroup"))throw"Bad id: "+t.group}else{(n=document.createElement("div")).id=r,n.className="lexsidebargroup",this.content.appendChild(n);let o=document.createElement("div");o.className="lexsidebargrouptitle",n.appendChild(o);let d=document.createElement("div");if(d.innerHTML=t.group,o.appendChild(d),null!=this.groups[t.group]){let c=document.createElement("a");c.className=(this.groups[t.group].icon??"")+" lexicon",o.appendChild(c),c.addEventListener("click",e=>{this.groups[t.group].callback&&this.groups[t.group].callback(t.group,e)})}}}if(""==l){let h=document.createElement("div");h.className="lexsidebarseparator",this.content.appendChild(h);continue}this.collapseContainer?(this.collapseContainer.appendChild(s),this.collapseQueue--,this.collapseQueue||delete this.collapseContainer):n?n.appendChild(s):this.content.appendChild(s);let u=document.createElement("div");if(s.appendChild(u),t.dom=s,"checkbox"==i.type){t.value=i.value??!1;let p=new Panel;t.checkbox=p.addCheckbox(null,t.value,(e,l)=>{l.preventDefault(),l.stopPropagation();let n=i.callback;t.value=e,n&&n.call(this,a,e,l)},{label:a,signal:"@checkbox_"+a}),u.appendChild(p.root.childNodes[0])}else{if(i.icon){let m=document.createElement("i");m.className=i.icon,u.appendChild(m)}let g=document.createElement("a");g.innerHTML=a,u.appendChild(g)}if(s.addEventListener("click",e=>{if(!(e.target&&e.target.classList.contains("lexcheckbox"))){if(i.collapsable)u.querySelector(".collapser").click();else{let l=i.callback;l&&l.call(this,a,t.value,e),t.checkbox&&(t.value=!t.value,t.checkbox.set(t.value,!0))}this.root.querySelectorAll(".lexsidebarentry").forEach(e=>e.classList.remove("selected")),s.classList.add("selected")}}),i.action){let f=LX.makeIcon(i.action.icon??"MoreHorizontal",i.action.name);u.appendChild(f),f.addEventListener("click",e=>{e.preventDefault(),e.stopImmediatePropagation();let t=i.action.callback;t&&t.call(this,a,e)})}else if(i.collapsable){let v=document.createElement("div");Object.assign(v.style,{width:"100%",display:"none"}),LX.makeCollapsible(u,v,n??this.content),this.collapseQueue=i.collapsable,this.collapseContainer=v}let E=document.createElement("span");if(E.className="lexsidebarentrydesc",E.innerHTML=a,s.appendChild(E),u.addEventListener("mouseenter",()=>{setTimeout(()=>{E.style.display="unset"},150)}),u.addEventListener("mouseleave",()=>{setTimeout(()=>{E.style.display="none"},150)}),!t[a].length)continue;let $=document.createElement("div");$.className="lexsidebarsubentrycontainer",n?n.appendChild($):this.content.appendChild($);for(let y=0;y<t[a].length;++y){let x=t[a][y],L=x.options??{},b=Object.keys(x)[0];if(this.filterString.length&&!b.toLowerCase().includes(this.filterString.toLowerCase()))continue;let w=document.createElement("div");if(w.innerHTML=`<span>${b}</span>`,L.action){let C=LX.makeIcon(L.action.icon??"MoreHorizontal",L.action.name);w.appendChild(C),C.addEventListener("click",e=>{e.preventDefault(),e.stopImmediatePropagation();let t=L.action.callback;t&&t.call(this,b,e)})}w.className="lexsidebarentry",w.id=b,$.appendChild(w),w.addEventListener("click",e=>{let t=L.callback;t&&t.call(this,b,w,e),this.root.querySelectorAll(".lexsidebarentry").forEach(e=>e.classList.remove("selected")),s.classList.add("selected")})}}}}LX.SideBar=SideBar;class Widget{static NONE=0;static TEXT=1;static TEXTAREA=2;static BUTTON=3;static DROPDOWN=4;static CHECKBOX=5;static TOGGLE=6;static RADIO=7;static COLOR=8;static RANGE=9;static NUMBER=10;static TITLE=11;static VECTOR=12;static TREE=13;static PROGRESS=14;static FILE=15;static LAYERS=16;static ARRAY=17;static LIST=18;static TAGS=19;static CURVE=20;static CARD=21;static IMAGE=22;static CONTENT=23;static CUSTOM=24;static SEPARATOR=25;static KNOB=26;static SIZE=27;static PAD=28;static FORM=29;static DIAL=30;static COUNTER=31;static TABLE=32;static NO_CONTEXT_TYPES=[Widget.BUTTON,Widget.LIST,Widget.FILE,Widget.PROGRESS];constructor(e,t,i){this.name=e,this.type=t,this.options=i}value(){if(this.onGetValue)return this.onGetValue();console.warn("Can't get value of "+this.typeName())}set(e,t=!1,i=""){if(this.onSetValue)return this.onSetValue(e,t);console.warn("Can't set value of "+this.typeName())}oncontextmenu(e){Widget.NO_CONTEXT_TYPES.includes(this.type)||addContextMenu(this.typeName(),e,e=>{e.add("Copy",()=>{this.copy()}),e.add("Paste",{disabled:!this._can_paste(),callback:()=>{this.paste()}})})}copy(){navigator.clipboard.type=this.type,navigator.clipboard.customIdx=this.customIdx,navigator.clipboard.data=this.value(),navigator.clipboard.writeText(navigator.clipboard.data)}_can_paste(){return this.type===Widget.CUSTOM?void 0!==navigator.clipboard.customIdx&&this.customIdx==navigator.clipboard.customIdx:navigator.clipboard.type===this.type}paste(){this._can_paste()&&this.set(navigator.clipboard.data)}typeName(){switch(this.type){case Widget.TEXT:return"Text";case Widget.TEXTAREA:return"TextArea";case Widget.BUTTON:return"Button";case Widget.DROPDOWN:return"Dropdown";case Widget.CHECKBOX:return"Checkbox";case Widget.TOGGLE:return"Toggle";case Widget.RADIO:return"Radio";case Widget.COLOR:return"Color";case Widget.RANGE:return"Range";case Widget.NUMBER:return"Number";case Widget.VECTOR:return"Vector";case Widget.TREE:return"Tree";case Widget.PROGRESS:return"Progress";case Widget.FILE:return"File";case Widget.LAYERS:return"Layers";case Widget.ARRAY:return"Array";case Widget.LIST:return"List";case Widget.TAGS:return"Tags";case Widget.CURVE:return"Curve";case Widget.KNOB:return"Knob";case Widget.SIZE:return"Size";case Widget.PAD:return"Pad";case Widget.FORM:return"Form";case Widget.DIAL:return"Dial";case Widget.COUNTER:return"Counter";case Widget.TABLE:return"Table";case Widget.CUSTOM:return this.customName}console.error(`Unknown Widget type: ${this.type}`)}refresh(){}}function ADD_CUSTOM_WIDGET(e,t={}){let i=simple_guidGenerator();Panel.prototype["add"+e]=function(a,l,n){let s=this.create_widget(a,Widget.CUSTOM,t);s.customName=e,s.customIdx=i,s.onGetValue=()=>l,s.onSetValue=(e,t)=>{l=e,h(),r.querySelector(".lexcustomitems").toggleAttribute("hidden",!1),t||this._trigger(new IEvent(a,l,null),n)};let r=s.domEl;r.style.flexWrap="wrap";let o,d,c=t.default??{},h=()=>{l&&(s.instance=l=Object.assign(deepCopy(c),l)),o&&o.remove(),d&&d.remove(),(o=document.createElement("div")).className="lexcustomcontainer",o.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")",this.queue(o);let i="<a class='fa-solid "+(t.icon??"fa-cube")+"' style='float:left'></a>";i+=e+(l?"":" [empty]"),i+="<a class='fa-solid "+(l?"fa-bars-staggered":" ")+" menu' style='float:right; width:5%;'></a>";let u=this.addButton(null,i,(t,i)=>{l?r.querySelector(".lexcustomitems").toggleAttribute("hidden"):addContextMenu(null,i,t=>{t.add("New "+e,()=>{l={},h(),r.querySelector(".lexcustomitems").toggleAttribute("hidden",!1)})})},{buttonClass:"custom"});if(this.clearQueue(),l&&u.querySelector("a.menu").addEventListener("click",e=>{e.stopImmediatePropagation(),e.stopPropagation(),addContextMenu(null,e,e=>{e.add("Clear",()=>{l=null,h()})})}),(d=document.createElement("div")).className="lexcustomitems",d.toggleAttribute("hidden",!0),r.appendChild(o),r.appendChild(d),l){this.queue(d);let p=(e,t,i)=>{l[e]=t,this._trigger(new IEvent(a,l,i),n)};for(let m in c){let g=l[m]??c[m];switch(g.constructor){case String:"#"===g[0]?this.addColor(m,g,p.bind(this,m)):this.addText(m,g,p.bind(this,m));break;case Number:this.addNumber(m,g,p.bind(this,m));break;case Boolean:this.addCheckbox(m,g,p.bind(this,m));break;case Array:g.length>4?this.addArray(m,g,p.bind(this,m)):this._add_vector(g.length,m,g,p.bind(this,m))}}this.clearQueue()}};h()}}LX.Widget=Widget,LX.ADD_CUSTOM_WIDGET=ADD_CUSTOM_WIDGET;class NodeTree{constructor(e,t,i){if(this.domEl=e,this.data=t,this.onevent=i.onevent,this.options=i,this.selected=[],t.constructor===Object)this._create_item(null,t);else for(let a of t)this._create_item(null,a)}_create_item(e,t,i=0,a){let l=this,n=this.domEl.querySelector("#lexnodetree_filter");if(t.children=t.children??[],n&&!t.id.includes(n.value)||void 0!=a&&a!=t.id){for(var s=0;s<t.children.length;++s)this._create_item(t,t.children[s],i+1,a);return}let r=this.domEl.querySelector("ul");t.visible=t.visible??!0,t.parent=e;let o=t.children.length>0,d=this.selected.indexOf(t)>-1||t.selected;if(this.options.onlyFolders){let c=!1;t.children.forEach(e=>c|="folder"==e.type),o=!!c}let h=document.createElement("li");h.className="lextreeitem datalevel"+i+(o?" parent":"")+(d?" selected":""),h.id=LX.getSupportedDOMName(t.id),h.tabIndex="0";let u=this.options.skip_default_icon??!0?"":"fa-solid fa-square";o&&(u=t.closed?"fa-solid fa-caret-right":"fa-solid fa-caret-down"),h.innerHTML="<a class='"+u+" hierarchy'></a>",u=t.icon,t.icon&&(t.icon.includes("fa-")?h.innerHTML+="<a class='"+t.icon+" tree-item-icon'></a>":h.innerHTML+="<img src='https://raw.githubusercontent.com/jxarco/lexgui.js/master/"+t.icon+"'>"),h.innerHTML+=t.rename?"":t.id,h.setAttribute("draggable",!0),h.style.paddingLeft=(o?0:3)+(3+(i+1)*15)+"px",r.appendChild(h),h.addEventListener("click",e=>{if(m){m=!1;return}e.shiftKey||(r.querySelectorAll("li").forEach(e=>{e.classList.remove("selected")}),this.selected.length=0);let i=this.selected.indexOf(t);if(i>-1?(h.classList.remove("selected"),this.selected.splice(i,1)):(h.classList.add("selected"),this.selected.push(t)),o&&t.id.length>1){if(t.closed=!1,l.onevent){let a=new TreeEvent(TreeEvent.NODE_CARETCHANGED,t,t.closed);l.onevent(a)}l.frefresh(t.id)}if(l.onevent){let n=new TreeEvent(TreeEvent.NODE_SELECTED,e.shiftKey?this.selected:t);n.multiple=e.shiftKey,l.onevent(n)}}),h.addEventListener("dblclick",function(){if((l.options.rename??!0)&&(t.rename=!0,l.refresh()),l.onevent){let e=new TreeEvent(TreeEvent.NODE_DBLCLICKED,t);l.onevent(e)}}),h.addEventListener("contextmenu",e=>{if(e.preventDefault(),!l.onevent)return;let i=new TreeEvent(TreeEvent.NODE_CONTEXTMENU,this.selected.length>1?this.selected:t,e);i.multiple=this.selected.length>1,LX.addContextMenu(i.multiple?"Selected Nodes":i.node.id,i.value,e=>{i.panel=e}),l.onevent(i),(this.options.addDefault??!1)==!0&&(i.panel.items&&i.panel.add(""),i.panel.add("Select Children",()=>{let e=t=>{if(!t.closed)for(let i of t.children??[]){if(i)this.domEl.querySelector("#"+i.id).classList.add("selected"),this.selected.push(i),e(i)}};e(t)}),i.panel.add("Delete",{callback:()=>{if(!t.parent)return;if(l.onevent){let i=new TreeEvent(TreeEvent.NODE_DELETED,t,e);l.onevent(i)}let a=t.parent.children,n=a.indexOf(t);a.splice(n,1),this.refresh()}}))}),h.addEventListener("keydown",e=>{if(!t.rename){if(e.preventDefault(),"Delete"==e.key){if(l.onevent){let i=new TreeEvent(TreeEvent.NODE_DELETED,this.selected.length>1?this.selected:t,e);i.multiple=this.selected.length>1,l.onevent(i)}for(let a of this.selected){let n=a.parent.children,s=n.indexOf(a);n.splice(s,1)}this.selected.length=0,this.refresh()}else if("ArrowUp"==e.key||"ArrowDown"==e.key){var r=this.selected.length>1?"ArrowUp"==e.key?this.selected.shift():this.selected.pop():this.selected[0],o=this.domEl.querySelector("#"+LX.getSupportedDOMName(r.id)),d="ArrowUp"==e.key?o.previousSibling:o.nextSibling;d&&d.click()}}});let p=document.createElement("input");p.toggleAttribute("hidden",!t.rename),p.value=t.id,h.appendChild(p),t.rename&&(h.classList.add("selected"),p.focus()),p.addEventListener("keyup",function(e){if("Enter"==e.key){if(this.value=this.value.replace(/\s/g,"_"),l.onevent){let i=new TreeEvent(TreeEvent.NODE_RENAMED,t,this.value);l.onevent(i)}t.id=LX.getSupportedDOMName(this.value),delete t.rename,l.frefresh(t.id),r.querySelector("#"+t.id).classList.add("selected")}else"Escape"==e.key&&(delete t.rename,l.frefresh(t.id))}),p.addEventListener("blur",function(e){delete t.rename,l.refresh()}),(this.options.draggable??!0)&&(e&&h.addEventListener("dragstart",e=>{window.__tree_node_dragged=t}),h.addEventListener("dragover",e=>{e.preventDefault()},!1),h.addEventListener("dragenter",e=>{e.target.classList.add("draggingover")}),h.addEventListener("dragleave",e=>{e.target.classList.remove("draggingover")}),h.addEventListener("drop",e=>{e.preventDefault();let i=window.__tree_node_dragged;if(!i)return;let a=t;if(i.id==a.id){console.warn("Cannot parent node to itself!");return}let n=function(e,t){var i=!1;for(var a of t.children){if(a.id==e.id)return!0;i|=n(e,a)}return i};if(n(a,i)){console.warn("Cannot parent node to a current child!");return}if(l.onevent){let s=new TreeEvent(TreeEvent.NODE_DRAGGED,i,a);l.onevent(s)}let r=i.parent.children.findIndex(e=>e.id==i.id),o=i.parent.children.splice(r,1);a.children.push(o[0]),l.refresh(),delete window.__tree_node_dragged}));let m=!1;if(o&&h.querySelector("a.hierarchy").addEventListener("click",function(e){if(m=!0,e.stopImmediatePropagation(),e.stopPropagation(),t.closed=!t.closed,l.onevent){let i=new TreeEvent(TreeEvent.NODE_CARETCHANGED,t,t.closed);l.onevent(i)}l.frefresh(t.id)}),!t.skipVisibility){let g=document.createElement("a");g.className="itemicon fa-solid fa-eye"+(t.visible?"":"-slash"),g.title="Toggle visible",g.addEventListener("click",function(e){if(e.stopPropagation(),t.visible=void 0!==t.visible&&!t.visible,this.className="itemicon fa-solid fa-eye"+(t.visible?"":"-slash"),l.onevent){let i=new TreeEvent(TreeEvent.NODE_VISIBILITY,t,t.visible);l.onevent(i)}}),h.appendChild(g)}if(t.actions)for(var s=0;s<t.actions.length;++s){let f=t.actions[s];var v=document.createElement("a");v.className="itemicon "+f.icon,v.title=f.name,v.addEventListener("click",function(e){f.callback(t,v),e.stopPropagation()}),h.appendChild(v)}if(void 0!=a&&t.id==a&&(this.selected=[t],h.click()),!t.closed)for(var s=0;s<t.children.length;++s){let E=t.children[s];(!this.options.onlyFolders||"folder"==E.type)&&this._create_item(t,E,i+1)}}refresh(e,t){this.data=e??this.data,this.domEl.querySelector("ul").innerHTML="",this._create_item(null,this.data,0,t)}frefresh(e){this.refresh();var t=this.domEl.querySelector("#"+e);t&&t.focus()}select(e){this.refresh(null,e)}}class Panel{constructor(e={}){var t=document.createElement("div");t.className="lexpanel",e.id&&(t.id=e.id),e.className&&(t.className+=" "+e.className),t.style.width=e.width||"calc( 100% - 6px )",t.style.height=e.height||"100%",Object.assign(t.style,e.style??{}),this._inline_widgets_left=-1,this._inline_queued_container=null,this.root=t,this.onevent=e=>{},this.branch_open=!1,this.branches=[],this.current_branch=null,this.widgets={},this._queue=[]}get(e){return this.widgets[e]}getValue(e){let t=this.widgets[e];if(!t)throw"No widget called "+e;return t.value()}setValue(e,t,i){let a=this.widgets[e];if(!a)throw"No widget called "+e;return a.set(t,i)}attach(e){if(!e)throw"no content to attach";e.parent=this;let t=e.root?e.root:e;this.root.appendChild(t)}clear(){for(let e in this.branch_open=!1,this.branches=[],this.current_branch=null,this.widgets)if(this.widgets[e].options&&this.widgets[e].options.signal){let t=this.widgets[e].options.signal;for(let i=0;i<LX.signals[t].length;i++)LX.signals[t][i]==this.widgets[e]&&(LX.signals[t]=[...LX.signals[t].slice(0,i),...LX.signals[t].slice(i+1)])}if(this.signals)for(let a=0;a<this.signals.length;a++){let l=Object.values(this.signals[a])[0],n=l.options.signal;for(let s=0;s<LX.signals[n].length;s++)LX.signals[n][s]==l&&(LX.signals[n]=[...LX.signals[n].slice(0,s),...LX.signals[n].slice(s+1)])}this.widgets={},this.root.innerHTML=""}sameLine(e){this._inline_queued_container=this.queuedContainer,this._inline_widgets_left=e||1/0}endLine(e){if(-1==this._inline_widgets_left){console.warn("No pending widgets to be inlined!");return}for(let t of(this._inline_widgets_left=-1,!this._inlineContainer&&(this._inlineContainer=document.createElement("div"),this._inlineContainer.className="lexinlinewidgets",e&&(this._inlineContainer.style.justifyContent=e)),this._inlineWidgets)){let i=t.constructor==Array;i?this._inline_queued_container?this._inlineContainer.appendChild(t[0]):t[1].appendChild(t[0]):this._inlineContainer.appendChild(t)}this._inline_queued_container?this._inline_queued_container.appendChild(this._inlineContainer):this.current_branch?this.current_branch.content.appendChild(this._inlineContainer):this.root.appendChild(this._inlineContainer),delete this._inlineWidgets,delete this._inlineContainer}branch(e,t={}){this.branch_open&&this.merge();var i=new Branch(e,t);return i.panel=this,this.branch_open=!0,this.current_branch=i,0==this.branches.length&&i.root.classList.add("first"),this.root.querySelectorAll(".lexbranch.last").forEach(e=>{e.classList.remove("last")}),i.root.classList.add("last"),this.branches.push(i),this.root.appendChild(i.root),t.filter&&this._addFilter(t.filter,{callback:this._searchWidgets.bind(this,i.name)}),i}merge(){this.branch_open=!1,this.current_branch=null}_pick(e,t){return void 0===e?t:e}static _dispatch_event(e,t,i,a,l){let n=new CustomEvent(t,{detail:i,bubbles:a,cancelable:l});e.dispatchEvent(n)}static _add_reset_property(e,t){var i=document.createElement("a");return i.style.display="none",i.style.marginRight="6px",i.className="lexicon fa fa-rotate-left",i.addEventListener("click",t),e.appendChild(i),i}create_widget(e,t,i={}){let a=new Widget(e,t,i),l=document.createElement("div");if(l.className="lexwidget",l.id=i.id??"",l.title=i.title??"",i.className&&(l.className+=" "+i.className),t!=Widget.TITLE&&(l.style.width="calc(100% - "+(this.current_branch||t==Widget.FILE?10:20)+"px)",i.width&&(l.style.width=l.style.minWidth=i.width),i.maxWidth&&(l.style.maxWidth=i.maxWidth),i.minWidth&&(l.style.minWidth=i.minWidth),i.height&&(l.style.height=l.style.minHeight=i.height)),void 0!=e){if(!i.hideName){let n=document.createElement("div");n.className="lexwidgetname",i.justifyName&&n.classList.add("float-"+i.justifyName),n.innerHTML=e||"",n.title=i.title??n.innerHTML,n.style.width=i.nameWidth||LX.DEFAULT_NAME_WIDTH,l.appendChild(n),l.domName=n,n.addEventListener("contextmenu",function(e){e.preventDefault(),a.oncontextmenu(e)})}this.widgets[e]=a}return i.signal&&(e||(this.signals||(this.signals=[]),this.signals.push({[i.signal]:a})),LX.addSignal(i.signal,a)),a.domEl=l,l.jsInstance=a,this._inline_widgets_left>0&&!i.skipInlineCount?(this._inlineWidgets||(this._inlineWidgets=[]),(e=>{this.queuedContainer?this._inlineWidgets.push([e,this.queuedContainer]):this._inlineWidgets.push(e)})(l),this._inline_widgets_left--,this._inline_widgets_left||this.endLine()):(e=>{i.container?i.container.appendChild(e):this.queuedContainer?this.queuedContainer.appendChild(e):this.current_branch?(i.skipWidget||this.current_branch.widgets.push(a),this.current_branch.content.appendChild(e)):(e.classList.add("nobranch"),this.root.appendChild(e))})(l),a}_addFilter(e,t={}){t.placeholder=e.constructor==String?e:"Filter properties..",t.skipWidget=t.skipWidget??!0,t.skipInlineCount=!0;let i=this.create_widget(null,Widget.TEXT,t).domEl;i.className+=" lexfilter noname";let a=document.createElement("input");a.className="lexinput-filter",a.setAttribute("placeholder",t.placeholder),a.style.width="calc( 100% - 17px )",a.value=t.filterValue||"";let l=document.createElement("a");return l.className="fa-solid fa-magnifying-glass",i.appendChild(l),i.appendChild(a),a.addEventListener("input",e=>{t.callback&&t.callback(a.value,e)}),i}_searchWidgets(e,t){for(let i of this.branches){if(i.name!==e)continue;for(let a of i.widgets)!a.domEl.classList.contains("lexfilter")&&a.domEl.remove();this.queue(i.content);let l=!t.length;for(let n of i.widgets){if(!l){if(!n.name)continue;t.toLowerCase();let s=n.name.toLowerCase();if(!s.includes(t))continue}this.queuedContainer.appendChild(n.domEl)}this.clearQueue();return}}_filterOptions(e,t){let i=!t.length,a=[];for(let l=0;l<e.length;l++){let n=e[l];if(!i){let s="string"==typeof n?n:n.value,r=t.toLowerCase(),o=s.toLowerCase();if(!o.includes(r))continue}a.push(n)}this.refresh(a)}_trigger(e,t){t&&t.call(this,e.value,e.domEvent,e.name),this.onevent&&this.onevent.call(this,e)}getBranch(e){return e?this.branches.find(t=>t.name==e):this.current_branch}queue(e){!e&&this.current_branch&&(e=this.current_branch.root),this.queuedContainer&&this._queue.push(this.queuedContainer),this.queuedContainer=e}clearQueue(){if(this._queue&&this._queue.length){this.queuedContainer=this._queue.pop();return}delete this.queuedContainer}addBlank(e=8,t){let i=this.create_widget(null,Widget.addBlank);return i.domEl.className+=" blank",i.domEl.style.height=e+"px",t&&(i.domEl.style.width=t),i}addTitle(e,t={}){if(!e)throw"Can't create Title without text!";let i=this.create_widget(null,Widget.TITLE,t).domEl;if(i.className="lextitle",t.icon){let a=document.createElement("a");a.className=t.icon,a.style.color=t.iconColor||"",i.appendChild(a)}let l=document.createElement("span");if(l.innerText=e,i.appendChild(l),Object.assign(i.style,t.style??{}),void 0!=t.link){let n=document.createElement("a");n.innerText=e,n.href=t.link,n.target=t.target??"",n.className="lextitle link",Object.assign(n.style,t.style??{}),i.replaceWith(n)}return i}addText(e,t,i,a={}){let l=this.create_widget(e,Widget.TEXT,a);l.onGetValue=()=>r.value,l.onSetValue=(e,t)=>{this.disabled?r.innerText=e:r.value=e,Panel._dispatch_event(r,"focusout",t)},l.valid=()=>{if(""==r.pattern)return!0;let e=RegExp(r.pattern);return e.test(r.value)};let n=l.domEl;l.name&&!a.skipReset&&Panel._add_reset_property(n.domName,function(){r.value=r.iValue,this.style.display="none",Panel._dispatch_event(r,"focusout")});let s=document.createElement("div");s.className="lextext"+(a.warning?" lexwarning":""),s.style.width=a.inputWidth||"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+" )",s.style.display="flex",a.textClass&&s.classList.add(a.textClass),this.disabled=(a.disabled||a.warning)??!!a.url;let r=null;if(this.disabled){r=document.createElement(a.url?"a":"div"),a.url&&(r.href=a.url,r.target="_blank");let o=a.warning?'<i class="fa-solid fa-triangle-exclamation"></i>':"";r.innerHTML=o+t||"",r.style.width="100%",r.style.textAlign=a.float??""}else{(r=document.createElement("input")).type=a.type||"",r.value=r.iValue=t||"",r.style.width="100%",r.style.textAlign=a.float??"",r.setAttribute("placeholder",a.placeholder??""),a.required&&r.setAttribute("required",a.required),a.pattern&&r.setAttribute("pattern",a.pattern);var d=(function(t,a){if(!l.valid()||this._lastValueTriggered==t)return;let s=a.detail,o=n.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=t!=r.iValue?"block":"none"),s||this._trigger(new IEvent(e,t,a),i),this._lastValueTriggered=t}).bind(this);let c=a.trigger??"default";if("default"==c?(r.addEventListener("keyup",function(e){"Enter"==e.key&&d(e.target.value,e)}),r.addEventListener("focusout",function(e){d(e.target.value,e)})):"input"==c&&r.addEventListener("input",function(e){d(e.target.value,e)}),r.addEventListener("mousedown",function(e){e.stopImmediatePropagation(),e.stopPropagation()}),a.icon){let h=document.createElement("a");h.className="inputicon "+a.icon,s.appendChild(h)}}return Object.assign(r.style,a.style??{}),s.appendChild(r),n.appendChild(s),l.name||(n.className+=" noname",s.style.width="100%"),l}addTextArea(e,t,i,a={}){let l=this.create_widget(e,Widget.TEXTAREA,a);l.onGetValue=()=>r.value,l.onSetValue=(e,t)=>{r.value=e,Panel._dispatch_event(r,"focusout",t)};let n=l.domEl;l.name&&!a.skipReset&&Panel._add_reset_property(n.domName,function(){r.value=r.iValue,this.style.display="none",Panel._dispatch_event(r,"focusout")});let s=document.createElement("div");s.className="lextextarea",s.style.width=a.inputWidth||"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+" )",s.style.height=a.height,s.style.display="flex";let r=document.createElement("textarea");r.value=r.iValue=t||"",r.style.width="100%",r.style.textAlign=a.float??"",Object.assign(r.style,a.style??{}),a.disabled&&r.setAttribute("disabled",!0),a.placeholder&&r.setAttribute("placeholder",a.placeholder);var o=(function(t,a){let l=a.detail,s=n.querySelector(".lexwidgetname .lexicon");s&&(s.style.display=t!=r.iValue?"block":"none"),l||this._trigger(new IEvent(e,t,a),i)}).bind(this);let d=a.trigger??"default";if("default"==d?(r.addEventListener("keyup",function(e){"Enter"==e.key&&o(e.target.value,e)}),r.addEventListener("focusout",function(e){o(e.target.value,e)})):"input"==d&&r.addEventListener("input",function(e){o(e.target.value,e)}),a.icon){let c=document.createElement("a");c.className="inputicon "+a.icon,s.appendChild(c)}return s.appendChild(r),n.appendChild(s),l.name||(n.className+=" noname",s.style.width="100%"),doAsync(()=>{a.fitHeight&&(r.style.height=r.scrollHeight+"px")},10),l}addLabel(e,t={}){return t.disabled=!0,this.addText(null,e,null,t)}addButton(e,t,i,a={}){let l=this.create_widget(e,Widget.BUTTON,a);l.onGetValue=()=>s.innerText,l.onSetValue=(e,t)=>{s.innerHTML=a.icon?"<a class='"+a.icon+"'></a>":a.img?"<img src='"+a.img+"'>":"<span>"+(e||"")+"</span>"};let n=l.domEl;var s=document.createElement("button");return s.title=a.title??"",s.className="lexbutton "+(a.buttonClass??""),a.selected&&s.classList.add("selected"),s.innerHTML=a.icon?"<a class='"+a.icon+"'></a>":a.img?"<img src='"+a.img+"'>":"<span>"+(t||"")+"</span>",s.style.width="calc( 100% - "+(a.nameWidth??LX.DEFAULT_NAME_WIDTH)+")",a.disabled&&s.setAttribute("disabled",!0),s.addEventListener("click",l=>{a.selectable&&(a.parent&&a.parent.querySelectorAll(".lexbutton.selected").forEach(e=>{e!=s&&e.classList.remove("selected")}),s.classList.toggle("selected")),this._trigger(new IEvent(e,t,l),i)}),n.appendChild(s),l.name||(s.className+=" noname",s.style.width="100%"),n}addComboButtons(e,t,i={}){let a=this.create_widget(e,Widget.BUTTON,i),l=a.domEl,n=this,s=document.createElement("div");s.className="lexcombobuttons ",i.float&&(s.className+=i.float),s.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let r=document.createElement("div");r.className="lexcombobuttonsbox ";let o=!i.noSelection,d=o&&(i.toggle??!1);for(let c of t){if(!c.value)throw"Set 'value' for each button!";let h=document.createElement("button");h.className="lexbutton combo",h.title=c.icon?c.value:"",h.id=c.id??"",i.buttonClass&&h.classList.add(i.buttonClass),o&&(c.selected||i.selected==c.value)&&h.classList.add("selected"),h.innerHTML=(c.icon?"<a class='"+c.icon+"'></a>":"")+"<span>"+(c.icon?"":c.value)+"</span>",c.disabled&&h.setAttribute("disabled",!0),h.addEventListener("click",function(t){o&&(d?this.classList.toggle("selected"):(s.querySelectorAll("button").forEach(e=>e.classList.remove("selected")),this.classList.add("selected"))),n._trigger(new IEvent(e,c.value,t),c.callback)}),r.appendChild(h)}return a.name||(l.className+=" noname",s.style.width="100%"),s.appendChild(r),l.appendChild(s),a}addCard(e,t={}){t.hideName=!0;let i=this.create_widget(e,Widget.CARD,t),a=i.domEl,l=document.createElement("div");if(l.className="lexcard",l.style.width="100%",t.img){let n=document.createElement("img");n.src=t.img,l.appendChild(n),void 0!=t.link&&(n.style.cursor="pointer",n.addEventListener("click",function(){let e=l.querySelector("a");e&&e.click()}))}let s=document.createElement("span");if(s.innerText=e,void 0!=t.link){let r=document.createElement("a");r.innerText=e,r.href=t.link,r.target=t.target??"",s.innerText="",s.appendChild(r)}return l.appendChild(s),t.callback&&(l.style.cursor="pointer",l.addEventListener("click",i=>{this._trigger(new IEvent(e,null,i),t.callback)})),a.appendChild(l),i}addForm(e,t,i,a={}){if(t.constructor!=Object){console.error("Form data must be an Object");return}a.hideName=!0;let l=this.create_widget(e,Widget.FORM,a);l.onGetValue=()=>s.formData,l.onSetValue=(e,t)=>{s.formData=e;let i=s.querySelectorAll(".lexwidget");for(let a=0;a<i.length;++a){let l=i[a];if(l.jsInstance.type!=LX.Widget.TEXT)continue;let n=i[a].querySelector(".lexwidgetname").innerText,r=i[a].querySelector(".lextext input");r.value=e[n]??"",Panel._dispatch_event(r,"focusout",t)}};let n=l.domEl,s=document.createElement("div");for(let r in s.className="lexformdata",this.queue(s),s.formData={},t){let o=t[r];o.constructor!=Object&&(o={}),o.placeholder=o.placeholder??r,o.width="calc(100% - 10px)",this.addLabel(r,{textClass:"formlabel"}),o.textWidget=this.addText(null,o.constructor==Object?o.value:o,e=>{s.formData[r]=e},o),s.formData[r]=o.constructor==Object?o.value:o}return this.addBlank(),this.addButton(null,a.actionName??"Submit",(e,a)=>{for(let l in t)if(!t[l].textWidget.valid())return;i&&i(s.formData,a)},{buttonClass:"primary",width:"calc(100% - 10px)"}),this.clearQueue(),n.appendChild(s),(!l.name||a.hideName)&&(n.className+=" noname",s.style.width="100%"),l}addContent(e,t={}){if(!e)return;if(e.constructor==String){let i=document.createElement("div");i.innerHTML=e,e=i.childElementCount>1?i:i.firstElementChild}let a=this.create_widget(null,Widget.CONTENT,t);return a.domEl.appendChild(e),a}async addImage(e,t={}){if(!e)return;t.hideName=!0;let i=this.create_widget(null,Widget.IMAGE,t),a=i.domEl,l=document.createElement("div");l.className="leximage",l.style.width="100%";let n=document.createElement("img");for(let s in n.src=e,t.style)n.style[s]=t.style[s];return await n.decode(),l.appendChild(n),a.appendChild(l),i}addDropdown(e,t,i,a,l={}){let n=this.create_widget(e,Widget.DROPDOWN,l);n.onGetValue=()=>s.querySelector("li.selected").getAttribute("value"),n.onSetValue=(t,l)=>{let n=s.querySelector(".lexwidgetname .lexicon");n&&(n.style.display=t!=d.iValue?"block":"none"),i=t,m.querySelectorAll("li").forEach(e=>{e.getAttribute("value")==i&&e.click()}),l||this._trigger(new IEvent(e,i,null),a)};let s=n.domEl,r=this;n.name&&!l.skipReset&&Panel._add_reset_property(s.domName,function(){i=d.iValue,m.querySelectorAll("li").forEach(e=>{e.getAttribute("value")==i&&e.click()}),this.style.display="none"});let o=document.createElement("div");o.className="lexdropdown",o.style.width=l.inputWidth||"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let d=document.createElement("div");d.className="lexdropdown lexoption",d.name=e,d.iValue=i;let c=i;c+="<a class='fa-solid fa-angle-down' style='float:right; margin-right: 3px;'></a>",this.queue(o);let h=e=>{let t=e.getParentArea(),i=u.getBoundingClientRect(),a=e.parentElement.closest("dialog");{let l=e.offsetHeight,n=i.y,s=window.innerHeight;if(t){let r=t.getBoundingClientRect();s=r.y+r.height}if(a){let o=a.getBoundingClientRect();n-=o.y}e.style.top=n+u.offsetHeight+"px";let d=n+l>s;d&&(e.style.top=n-l+"px",e.classList.add("place-above"))}{let c=e.offsetWidth,h=i.x;if(e.style.minWidth=i.width+"px",a){let p=a.getBoundingClientRect();h-=p.x}e.style.left=h+"px";let m=window.innerWidth;if(t){let g=t.getBoundingClientRect();m=g.x+g.width}let f=h+c>m;f&&(e.style.left=h-(c-i.width)+"px")}},u=this.addButton(null,c,(e,t)=>{if(m.unfocus_event){delete m.unfocus_event;return}p.classList.remove("place-above");let i=p.hasAttribute("open");i?p.close():(p.show(),h(p)),g&&g.querySelector("input").focus()},{buttonClass:"array",skipInlineCount:!0,disabled:l.disabled});this.clearQueue(),u.style.width="100%",u.refresh=e=>{""==u.querySelector("span").innerText?u.querySelector("span").innerText=e:u.querySelector("span").innerHTML=u.querySelector("span").innerHTML.replaceAll(u.querySelector("span").innerText,e)};let p=document.createElement("dialog");p.className="lexdropdownoptions";let m=document.createElement("ul");m.tabIndex=-1,m.className="lexoptions",p.appendChild(m),m.addEventListener("focusout",function(e){if(e.stopPropagation(),e.stopImmediatePropagation(),e.relatedTarget===u.querySelector("button"))this.unfocus_event=!0,setTimeout(()=>delete this.unfocus_event,200);else if(e.relatedTarget&&"INPUT"==e.relatedTarget.tagName)return;else if("lexinput-filter"==e.target.className)return;p.close()});let g=null;l.filter&&(g=this._addFilter(l.placeholder??"Search...",{container:m,callback:this._filterOptions.bind(m,t)}),m.appendChild(g),g.addEventListener("focusout",function(e){!(e.relatedTarget&&"UL"==e.relatedTarget.tagName&&e.relatedTarget.classList.contains("lexoptions"))&&p.close()}));let f=document.createElement("span");return f.style.height="calc(100% - 25px)",m.appendChild(f),m.refresh=l=>{if(f.innerHTML="",!l.length){let n=l.emptyMsg??"No options found.",o=document.createElement("div");o.className="option",o.style.flexDirection="unset",o.innerHTML=n;let c=document.createElement("li");c.className="lexdropdownitem empty",c.appendChild(o),f.appendChild(c);return}for(let h=0;h<l.length;h++){let v=l[h],E=document.createElement("li"),$=document.createElement("div");if($.className="option",E.appendChild($),E.addEventListener("click",l=>{p.close();let n=s.querySelector(".lexoptions .selected");n&&n.classList.remove("selected"),i=l.currentTarget.getAttribute("value"),l.currentTarget.toggleAttribute("hidden",!1),l.currentTarget.classList.add("selected"),u.refresh(i);let o=s.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=i!=d.iValue?"block":"none"),r._trigger(new IEvent(e,i,null),a),g&&(g.querySelector("input").value="",this._filterOptions.bind(m,t,"")())}),v.constructor!=Object)$.style.flexDirection="unset",$.innerHTML="</a><span>"+v+"</span><a class='fa-solid fa-check'>",$.value=v,E.setAttribute("value",v),E.className="lexdropdownitem",v==i&&(E.classList.add("selected"),d.innerHTML=v);else{let y=document.createElement("img");y.src=v.src,E.setAttribute("value",v.value),E.className="lexlistitem",$.innerText=v.value,$.className+=" media",$.prepend(y),$.setAttribute("value",v.value),$.setAttribute("data-index",h),$.setAttribute("data-src",v.src),$.setAttribute("title",v.value),i==v.value&&E.classList.add("selected")}f.appendChild(E)}},m.refresh(t),o.appendChild(p),s.appendChild(o),n.name||(s.className+=" noname",o.style.width="100%"),n}addCurve(e,t,i,a={}){if(!e)throw"Set Widget Name!";let l=this,n=this.create_widget(e,Widget.CURVE,a);n.onGetValue=()=>JSON.parse(JSON.stringify(d.element.value)),n.onSetValue=(t,a)=>{let n=s.querySelector(".lexwidgetname .lexicon");n&&(n.style.display=t!=d.element.value?"block":"none"),d.element.value=JSON.parse(JSON.stringify(t)),d.redraw(),a||l._trigger(new IEvent(e,d.element.value,null),i)};let s=n.domEl,r=JSON.parse(JSON.stringify(t));a.skipReset||Panel._add_reset_property(s.domName,function(t){this.style.display="none",d.element.value=JSON.parse(JSON.stringify(r)),d.redraw(),l._trigger(new IEvent(e,d.element.value,t),i)});var o=document.createElement("div");o.className="lexcurve",o.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")",a.callback=(t,a)=>{let n=s.querySelector(".lexwidgetname .lexicon");n&&(n.style.display=t!=r?"block":"none"),l._trigger(new IEvent(e,t,a),i)},a.name=e;let d=new Curve(this,t,a);return o.appendChild(d.element),s.appendChild(o),n.onresize=d.redraw.bind(d),n.curveInstance=d,doAsync(()=>{d.canvas.width=o.offsetWidth,d.redraw()}),n}addDial(e,t,i,a={}){let l=this,n=this.create_widget(e,Widget.DIAL,a);n.onGetValue=()=>JSON.parse(JSON.stringify(d.element.value)),n.onSetValue=(t,a)=>{let n=s.querySelector(".lexwidgetname .lexicon");n&&(n.style.display=t!=d.element.value?"block":"none"),d.element.value=JSON.parse(JSON.stringify(t)),d.redraw(),a||l._trigger(new IEvent(e,d.element.value,null),i)};let s=n.domEl,r=JSON.parse(JSON.stringify(t));n.name&&!a.skipReset&&Panel._add_reset_property(s.domName,function(t){this.style.display="none",d.element.value=JSON.parse(JSON.stringify(r)),d.redraw(),l._trigger(new IEvent(e,d.element.value,t),i)});var o=document.createElement("div");o.className="lexcurve",o.style.width=n.name?"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")":"100%",a.callback=(t,a)=>{let n=s.querySelector(".lexwidgetname .lexicon");n&&(n.style.display=t!=r?"block":"none"),l._trigger(new IEvent(e,t,a),i)},a.name=e;let d=new Dial(this,t,a);return o.appendChild(d.element),s.appendChild(o),n.onresize=d.redraw.bind(d),n.curveInstance=d,doAsync(()=>{d.element.style.height=d.element.offsetWidth+"px",d.canvas.width=d.element.offsetWidth,o.style.width=d.element.offsetWidth+"px",d.canvas.height=d.canvas.width,d.redraw()}),n}addLayers(e,t,i,a={}){if(!e)throw"Set Widget Name!";let l=this,n=this.create_widget(e,Widget.LAYERS,a);n.onGetValue=()=>s.value,n.onSetValue=(a,n)=>{let r=s.querySelector(".lexwidgetname .lexicon");r&&(r.style.display=a!=o?"block":"none"),t=s.value=a,d(),n||l._trigger(new IEvent(e,t),i)};let s=n.domEl;Panel._add_reset_property(s.domName,function(a){this.style.display="none",t=s.value=o,d(),l._trigger(new IEvent(e,t,a),i)});var r=document.createElement("div");r.className="lexlayers",r.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let o=s.value=t,d=()=>{r.innerHTML="";let a=t.toString(2),l=a.length;for(var n=0;n<16-l;++n)a="0"+a;for(let d=0;d<16;++d){let c=document.createElement("div");if(c.className="lexlayer",void 0!=t){let h=a[16-d-1];void 0!=h&&"1"==h&&c.classList.add("selected")}c.innerText=d+1,c.title="Bit "+d+", value "+(1<<d),r.appendChild(c),c.addEventListener("click",a=>{a.stopPropagation(),a.stopImmediatePropagation(),a.target.classList.toggle("selected"),t^=1<<d,s.value=t;let l=s.querySelector(".lexwidgetname .lexicon");l&&(l.style.display=t!=o?"block":"none"),this._trigger(new IEvent(e,t,a),i)})}};return d(),s.appendChild(r),n}addArray(e,t=[],i,a={}){if(!e)throw"Set Widget Name!";let l=this.create_widget(e,Widget.ARRAY,a);l.onGetValue=()=>{let e=n.querySelectorAll("input"),t=[];for(var i of e)t.push(i.value);return t},l.onSetValue=(a,l)=>{t=a,c(),l||this._trigger(new IEvent(e,t,null),i)};let n=l.domEl;n.style.flexWrap="wrap";var s=document.createElement("div");s.className="lexarray",s.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")",this.queue(s);let r="<a class='fa-solid fa-angle-down' style='float:right; margin-right: 3px;'></a>",o="Array (size "+t.length+")";o+=r,this.addButton(null,o,()=>{n.querySelector(".lexarrayitems").toggleAttribute("hidden")},{buttonClass:"array"}),this.clearQueue();let d=document.createElement("div");d.className="lexarrayitems",d.toggleAttribute("hidden",!0),n.appendChild(s),n.appendChild(d);let c=()=>{let l=n.querySelector(".lexbutton.array span");l.innerHTML="Array (size "+t.length+")",l.innerHTML+=r,d.innerHTML="",this.queue(d);for(let s=0;s<t.length;++s){let h=t[s],u=a.innerValues?"dropdown":h.constructor;switch(this.sameLine(2),u){case String:this.addText(s+"",h,function(e,a){t[s]=e,i(t)},{nameWidth:"4%",inputWidth:"95%",skipReset:!0});break;case Number:this.addNumber(s+"",h,function(e,a){t[s]=e,i(t)},{nameWidth:"4%",inputWidth:"95%",skipReset:!0});break;case"dropdown":this.addDropdown(s+"",a.innerValues,h,function(e,a){t[s]=e,i(t)},{nameWidth:"4%",inputWidth:"95%",skipReset:!0})}this.addButton(null,"<a class='lexicon fa-solid fa-trash'></a>",(a,l)=>{t.splice(t.indexOf(h),1),c(),this._trigger(new IEvent(e,t,l),i)},{title:"Remove item",className:"micro"})}o="Add item",o+="<a class='fa-solid fa-plus' style='float:right; margin-right: 3px; margin-top: 2px;'></a>",this.addButton(null,o,(l,n)=>{t.push(a.innerValues?a.innerValues[0]:""),c(),this._trigger(new IEvent(e,t,n),i)},{buttonClass:"array"}),this.clearQueue()};return c(),l}addList(e,t,i,a,l={}){let n=this.create_widget(e,Widget.LIST,l);n.onGetValue=()=>i,n.onSetValue=(l,n)=>{r.querySelectorAll(".lexlistitem").forEach(e=>e.classList.remove("selected"));let s=t.indexOf(l);-1==s||(r.children[s].classList.toggle("selected"),i=l,n||this._trigger(new IEvent(e,l),a))},n.updateValues=l=>{t=l,r.innerHTML="";for(let n=0;n<t.length;++n){let s=null,o=t[n];o.constructor===Array&&(s=o[1],o=o[0]);let d=document.createElement("div");d.className="lexlistitem"+(i==o?" selected":""),d.innerHTML="<span>"+o+"</span>"+(s?"<a class='"+s+"'></a>":""),d.addEventListener("click",t=>{r.querySelectorAll(".lexlistitem").forEach(e=>e.classList.remove("selected")),d.classList.toggle("selected"),i=o,this._trigger(new IEvent(e,o,t),a)}),r.appendChild(d)}};let s=n.domEl,r=document.createElement("div");return r.className="lexlist",r.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")",n.updateValues(t),n.name||(s.className+=" noname",r.style.width="100%"),s.appendChild(r),n}addTags(e,t,i,a={}){let l=[].concat(t=t.replace(/\s/g,"").split(",")),n=this.create_widget(e,Widget.TAGS,a);n.onGetValue=()=>[].concat(t),n.onSetValue=(a,n)=>{t=[].concat(a),d();let o=s.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=a!=l?"block":"none"),n||r._trigger(new IEvent(e,t),i)};let s=n.domEl,r=this;n.name&&Panel._add_reset_property(s.domName,function(a){this.style.display="none",t=[].concat(l),d(),r._trigger(new IEvent(e,t,a),i)});let o=document.createElement("div");o.className="lextags",o.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let d=()=>{o.innerHTML="";for(let a=0;a<t.length;++a){let n=t[a],c=document.createElement("span");c.className="lextag",c.innerHTML=n;let h=document.createElement("a");h.className="lextagrmb fa-solid fa-xmark lexicon",c.appendChild(h),h.addEventListener("click",a=>{c.remove(),t.splice(t.indexOf(n),1);let o=s.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=t!=l?"block":"none"),r._trigger(new IEvent(e,t,a),i)}),o.appendChild(c)}let u=document.createElement("input");u.value="",u.placeholder="Add tag...",o.appendChild(u),u.onkeydown=function(a){let l=this.value.replace(/\s/g,"");if(" "==a.key||"Enter"==a.key){if(a.preventDefault(),!l.length||t.indexOf(l)>-1)return;t.push(l),d();let n=s.querySelector(".lexwidgetname .lexicon");n&&(n.style.display="block"),r._trigger(new IEvent(e,t,a),i)}},u.focus()};return d(),n.name||(s.className+=" noname",o.style.width="100%"),s.appendChild(o),n}addCheckbox(e,t,i,a={}){if(!e&&!a.label)throw"Set Widget Name or at least a label!";let l=this.create_widget(e,Widget.CHECKBOX,a);l.onGetValue=()=>r.checked,l.onSetValue=(e,t)=>{r.checked!==e&&(r.checked=e,Panel._dispatch_event(r,"change",t))};let n=l.domEl;e&&Panel._add_reset_property(n.domName,function(){r.checked=!r.checked,Panel._dispatch_event(r,"change")});var s=document.createElement("div");s.className="lexcheckboxcont";let r=document.createElement("input");r.type="checkbox",r.className="lexcheckbox "+(a.className??""),r.checked=t,r.iValue=t,r.disabled=a.disabled??!1;let o=document.createElement("span");if(o.className="checkboxtext",o.innerHTML=a.label??"On",s.appendChild(r),s.appendChild(o),r.addEventListener("change",t=>{let a=t.detail?.constructor==Number?null:t.detail;if(!a){let l=n.querySelector(".lexwidgetname .lexicon");l&&(l.style.display=r.checked!=r.iValue?"block":"none")}let s=n.querySelector(".lexcheckboxsubmenu");s&&s.toggleAttribute("hidden",!r.checked),a||this._trigger(new IEvent(e,r.checked,t),i)}),n.appendChild(s),a.suboptions){n.style.flexWrap="wrap";let d=document.createElement("div");d.className="lexcheckboxsubmenu",d.toggleAttribute("hidden",!r.checked),this.queue(d),a.suboptions.call(this,this),this.clearQueue(),n.appendChild(d)}return l}addToggle(e,t,i,a={}){if(!e)throw"Set Widget Name!";let l=this.create_widget(e,Widget.TOGGLE,a);l.onGetValue=()=>r.checked,l.onSetValue=(e,t)=>{r.checked!==e&&(r.checked=e,Panel._dispatch_event(r,"change",t))};let n=l.domEl;Panel._add_reset_property(n.domName,function(){r.checked=!r.checked,Panel._dispatch_event(r,"change")});var s=document.createElement("div");s.className="lextogglecont";let r=document.createElement("input");r.type="checkbox",r.className="lextoggle "+(a.className??""),r.checked=t,r.iValue=t,r.disabled=a.disabled??!1;let o=document.createElement("span");if(o.className="toggletext",o.innerHTML="On",s.appendChild(r),s.appendChild(o),r.addEventListener("change",t=>{let a=t.detail?.constructor==Number?null:t.detail;if(!a){let l=n.querySelector(".lexwidgetname .lexicon");l&&(l.style.display=r.checked!=r.iValue?"block":"none")}let s=n.querySelector(".lextogglesubmenu");s&&s.toggleAttribute("hidden",!r.checked),a||this._trigger(new IEvent(e,r.checked,t),i)}),n.appendChild(s),a.suboptions){n.style.flexWrap="wrap";let d=document.createElement("div");d.className="lextogglesubmenu",d.toggleAttribute("hidden",!r.checked),this.queue(d),a.suboptions.call(this,this),this.clearQueue(),n.appendChild(d)}return l}addRadioGroup(e,t,i,a={}){let l=this.create_widget(null,Widget.RADIO,a);l.onGetValue=()=>{let e=s.querySelectorAll("button");for(let i=0;i<e.length;++i){let a=e[i];if(a.checked)return[i,t[i]]}},l.onSetValue=(e,t)=>{let i=s.querySelectorAll("button");for(let a=0;a<i.length;++a){let l=i[a];e==a&&Panel._dispatch_event(l,"click",t)}};let n=l.domEl;var s=document.createElement("div");s.className="lexradiogroup "+(a.className??"");let r=document.createElement("span");r.innerHTML=e,s.appendChild(r);let o=this;for(let d=0;d<t.length;++d){let c=document.createElement("div");c.className="lexradiogroupitem",s.appendChild(c);let h=document.createElement("button");h.className="lexbutton",h.disabled=a.disabled??!1,c.appendChild(h),h.addEventListener("click",function(e){let a=e.detail?.constructor==Number?null:e.detail;s.querySelectorAll("button").forEach(e=>{e.checked=!1,e.classList.remove("checked")}),this.checked=!this.checked,this.classList.toggle("checked"),a||o._trigger(new IEvent(null,[d,t[d]],e),i)});{let u=document.createElement("span");h.appendChild(u)}let p=document.createElement("span");p.innerHTML=t[d],c.appendChild(p)}return a.selected&&(console.assert(a.selected.constructor==Number),l.set(a.selected,!0)),n.appendChild(s),l}addColor(e,t,i,a={}){if(!e)throw"Set Widget Name!";let l=this.create_widget(e,Widget.COLOR,a);l.onGetValue=()=>o.value,l.onSetValue=(e,t)=>{o.value=e,Panel._dispatch_event(o,"input",t)};let n=l.domEl,s=!1;Panel._add_reset_property(n.domName,function(){this.style.display="none",o.value=o.iValue,Panel._dispatch_event(o,"input")});var r=document.createElement("span");r.className="lexcolor",r.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let o=document.createElement("input");o.style.width="32px",o.type="color",o.className="colorinput",o.id="color"+simple_guidGenerator(),o.useRGB=a.useRGB??!1,o.value=o.iValue=t.constructor===Array?rgbToHex(t):t,a.disabled&&(o.disabled=!0),o.addEventListener("input",t=>{let a=t.target.value,l=t.detail;if(s||d.set(a),!l){let r=n.querySelector(".lexwidgetname .lexicon");r&&(r.style.display=a!=o.iValue?"block":"none")}o.useRGB&&(a=hexToRgb(a)),l||this._trigger(new IEvent(e,a,t),i)},!1),r.appendChild(o),this.queue(r);let d=this.addText(null,o.value,e=>{s=!0,l.set(e),s=!1},{width:"calc( 100% - 32px )"});return d.domEl.style.marginLeft="4px",this.clearQueue(),n.appendChild(r),l}addRange(e,t,i,a={}){let l=this.create_widget(e,Widget.RANGE,a);l.onGetValue=()=>+r.value,l.onSetValue=(e,t)=>{r.value=e,Panel._dispatch_event(r,"input",t)};let n=l.domEl;l.name&&Panel._add_reset_property(n.domName,function(){this.style.display="none",r.value=r.iValue,Panel._dispatch_event(r,"input")});var s=document.createElement("div");s.className="lexrange",s.style.width=a.inputWidth||"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let r=document.createElement("input");return r.className="lexrangeslider "+(a.className??""),r.value=r.iValue=t,r.min=a.min,r.max=a.max,r.step=a.step??1,r.type="range",r.disabled=a.disabled??!1,a.left&&r.classList.add("left"),(a.fill??!0)||r.classList.add("no-fill"),r.addEventListener("input",t=>{if(isNaN(t.target.valueAsNumber))return;let l=t.detail,s=t.target.value=clamp(+t.target.valueAsNumber,+r.min,+r.max);if(r.value=s,!l){let o=n.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=s!=r.iValue?"block":"none")}a.left&&(s=+r.max-s+ +r.min),l||this._trigger(new IEvent(e,s,t),i)},{passive:!1}),r.addEventListener("mousedown",function(e){a.onPress&&a.onPress.bind(r)(e,r)},!1),r.addEventListener("mouseup",function(e){a.onRelease&&a.onRelease.bind(r)(e,r)},!1),l.setLimits=(e,t,i)=>{r.min=e??r.min,r.max=t??r.max,r.step=i??r.step,Panel._dispatch_event(r,"input",!0)},t.constructor==Number&&(t=clamp(t,+r.min,+r.max)),s.appendChild(r),n.appendChild(s),l.name||(n.className+=" noname",s.style.width="100%"),l}addNumber(e,t,i,a={}){let l=this.create_widget(e,Widget.NUMBER,a);l.onGetValue=()=>+o.value,l.onSetValue=(e,t)=>{o.value=round(e,a.precision),Panel._dispatch_event(o,"change",t)};let n=l.domEl;l.name&&Panel._add_reset_property(n.domName,function(){this.style.display="none",o.value=o.iValue,Panel._dispatch_event(o,"change")});var s=document.createElement("div");s.className="lexnumber",s.style.width=a.inputWidth||"calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let r=document.createElement("div");r.className="numberbox";let o=document.createElement("input");if(o.id="number_"+simple_guidGenerator(),o.className="vecinput",o.min=a.min??-1e24,o.max=a.max??1e24,o.step=a.step??"any",o.type="number",t.constructor==Number&&(t=clamp(t,+o.min,+o.max),t=round(t,a.precision)),o.value=o.iValue=t,r.appendChild(o),a.units){let d=document.createElement("span");d.className="lexunit",d.innerText=a.units,d.style.left=measureRealWidth(o.value)+"px",o.unitSpan=d,r.appendChild(d)}let c=document.createElement("a");if(c.className="fa-solid fa-arrows-up-down drag-icon hidden",r.appendChild(c),a.disabled&&(o.disabled=!0),!a.skipSlider&&void 0!==a.min&&void 0!==a.max){let h=document.createElement("input");h.className="lexinputslider",h.min=a.min,h.max=a.max,h.step=a.step??1,h.type="range",h.value=t,h.addEventListener("input",function(e){let t=+this.valueAsNumber;o.value=round(t,a.precision),Panel._dispatch_event(o,"change")},!1),h.addEventListener("mousedown",function(e){a.onPress&&a.onPress.bind(h)(e,h)},!1),h.addEventListener("mouseup",function(e){a.onRelease&&a.onRelease.bind(h)(e,h)},!1),r.appendChild(h),l.setLimits=(e,t,i)=>{o.min=h.min=e??o.min,o.max=h.max=t??o.max,o.step=i??o.step,h.step=i??h.step,Panel._dispatch_event(o,"change",!0)}}o.addEventListener("input",function(e){let t=+this.valueAsNumber;o.value=round(t,a.precision),a.units&&(o.unitSpan.style.left=measureRealWidth(o.value)+"px")},!1),o.addEventListener("wheel",function(e){if(e.preventDefault(),this!==document.activeElement)return;let t=a.step??1;e.shiftKey?t*=10:e.altKey&&(t*=.1);let i=+this.valueAsNumber-t*(e.deltaY>0?1:-1);this.value=round(i,a.precision),Panel._dispatch_event(o,"change")},{passive:!1}),o.addEventListener("change",t=>{if(isNaN(t.target.valueAsNumber))return;let l=t.detail,s=t.target.value=clamp(+t.target.valueAsNumber,+o.min,+o.max);if(s=a.precision?round(s,a.precision):s,r.querySelector(".lexinputslider")&&(r.querySelector(".lexinputslider").value=s),o.value=s,a.units&&(o.unitSpan.style.left=measureRealWidth(o.value)+"px"),!l){let d=n.querySelector(".lexwidgetname .lexicon");d&&(d.style.display=s!=o.iValue?"block":"none")}l||this._trigger(new IEvent(e,s,t),i)},{passive:!1}),o.addEventListener("mousedown",function e(t){if(document.activeElement!=o){var i=u.root.ownerDocument;i.addEventListener("mousemove",p),i.addEventListener("mouseup",m),document.body.classList.add("noevents"),c.classList.remove("hidden"),t.stopImmediatePropagation(),t.stopPropagation(),document.pointerLockElement||o.requestPointerLock(),a.onPress&&a.onPress.bind(o)(t,o)}});var u=this;function p(e){let t=-e.movementY;if(0!=t){let i=a.step??1;e.shiftKey?i*=10:e.altKey&&(i*=.1);let l=+o.valueAsNumber+i*t;o.value=(+l).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,"$1"),Panel._dispatch_event(o,"change")}e.stopPropagation(),e.preventDefault()}function m(e){var t=u.root.ownerDocument;t.removeEventListener("mousemove",p),t.removeEventListener("mouseup",m),document.body.classList.remove("noevents"),c.classList.add("hidden"),document.pointerLockElement&&document.exitPointerLock(),a.onRelease&&a.onRelease.bind(o)(e,o)}return s.appendChild(r),n.appendChild(s),l.name||(n.className+=" noname",s.style.width="100%"),l}static VECTOR_COMPONENTS={0:"x",1:"y",2:"z",3:"w"};_add_vector(e,t,i,a,l={}){if(e=clamp(e,2,4),i=i??Array(e).fill(0),!t)throw"Set Widget Name!";let n=this.create_widget(t,Widget.VECTOR,l);n.onGetValue=()=>{let e=s.querySelectorAll("input"),t=[];for(var i of e)t.push(+i.value);return t},n.onSetValue=(e,t)=>{let i=s.querySelectorAll(".vecinput");if(i.length==e.length){console.error("Input length does not match vector length.");return}for(let a=0;a<i.length;++a){let n=e[a];i[a].value=round(n,l.precision)??0,Panel._dispatch_event(i[a],"change",t)}};let s=n.domEl;Panel._add_reset_property(s.domName,function(){for(let e of(this.style.display="none",s.querySelectorAll(".vecinput")))e.value=e.iValue,Panel._dispatch_event(e,"change")});var r=document.createElement("div");r.className="lexvector",r.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";for(let o=0;o<e;++o){let d=document.createElement("div");d.className="vecbox",d.innerHTML="<span class='"+Panel.VECTOR_COMPONENTS[o]+"'></span>";let c=document.createElement("input");c.className="vecinput v"+e,c.min=l.min??-1e24,c.max=l.max??1e24,c.step=l.step??"any",c.type="number",c.id="vec"+e+"_"+simple_guidGenerator(),c.idx=o,i[o].constructor==Number&&(i[o]=clamp(i[o],+c.min,+c.max),i[o]=round(i[o],l.precision)),c.value=c.iValue=i[o];let h=document.createElement("a");h.className="fa-solid fa-arrows-up-down drag-icon hidden",d.appendChild(h),l.disabled&&(c.disabled=!0),c.addEventListener("wheel",function(e){if(e.preventDefault(),this!==document.activeElement)return;let t=l.step??1;if(e.shiftKey?t=10:e.altKey&&(t=.1),f.locked)for(let i of s.querySelectorAll(".vecinput"))i.value=round(+i.valueAsNumber-t*(e.deltaY>0?1:-1),l.precision),Panel._dispatch_event(i,"change");else this.value=round(+this.valueAsNumber-t*(e.deltaY>0?1:-1),l.precision),Panel._dispatch_event(c,"change")},{passive:!1}),c.addEventListener("change",e=>{if(isNaN(e.target.value))return;let n=e.detail,r=e.target.value=clamp(e.target.value,+c.min,+c.max);if(r=round(r,l.precision),!n){let o=s.querySelector(".lexwidgetname .lexicon");o&&(o.style.display=r!=c.iValue?"block":"none")}if(f.locked)for(let d of s.querySelectorAll(".vecinput"))d.value=r,i[d.idx]=r;else c.value=r,i[e.target.idx]=r;n||this._trigger(new IEvent(t,i,e),a)},!1),c.addEventListener("mousedown",p);var u=this;function p(e){if(document.activeElement!=c){var t=u.root.ownerDocument;t.addEventListener("mousemove",m),t.addEventListener("mouseup",g),document.body.classList.add("noevents"),h.classList.remove("hidden"),e.stopImmediatePropagation(),e.stopPropagation(),document.pointerLockElement||c.requestPointerLock(),l.onPress&&l.onPress.bind(c)(e,c)}}function m(e){let t=-e.movementY;if(0!=t){let i=l.step??1;if(e.shiftKey?i=10:e.altKey&&(i=.1),f.locked)for(let a of s.querySelectorAll(".vecinput"))a.value=round(+a.valueAsNumber+i*t,l.precision),Panel._dispatch_event(a,"change");else c.value=round(+c.valueAsNumber+i*t,l.precision),Panel._dispatch_event(c,"change")}e.stopPropagation(),e.preventDefault()}function g(e){var t=u.root.ownerDocument;t.removeEventListener("mousemove",m),t.removeEventListener("mouseup",g),document.body.classList.remove("noevents"),h.classList.add("hidden"),document.pointerLockElement&&document.exitPointerLock(),l.onRelease&&l.onRelease.bind(c)(e,c)}d.appendChild(c),r.appendChild(d)}(void 0!==l.min||void 0!==l.max)&&(n.setLimits=(e,l,n)=>{let r=s.querySelectorAll(".vecinput");for(let o of r)o.min=e??o.min,o.max=l??o.max,o.step=n??o.step,Panel._dispatch_event(o,"change",!0);this._trigger(new IEvent(t,i),a)});let f=document.createElement("a");return f.title="Lock",f.className="fa-solid fa-lock-open lexicon lock",r.appendChild(f),f.addEventListener("click",function(e){this.locked=!this.locked,this.locked?(this.classList.add("fa-lock"),this.classList.remove("fa-lock-open")):(this.classList.add("fa-lock-open"),this.classList.remove("fa-lock"))},!1),s.appendChild(r),n}addVector2(e,t,i,a){return this._add_vector(2,e,t,i,a)}addVector3(e,t,i,a){return this._add_vector(3,e,t,i,a)}addVector4(e,t,i,a){return this._add_vector(4,e,t,i,a)}addSize(e,t,i,a={}){let l=this.create_widget(e,Widget.SIZE,a);l.onGetValue=()=>{let e=[];for(let t=0;t<n.dimensions.length;++t)e.push(n.dimensions[t].value());return e},l.onSetValue=(e,t)=>{for(let i=0;i<n.dimensions.length;++i)n.dimensions[i].set(e[i],t)};let n=l.domEl;this.queue(n),n.aspectRatio=2==t.length?t[0]/t[1]:null,n.dimensions=[];for(let s=0;s<t.length;++s)if(n.dimensions[s]=this.addNumber(null,t[s],e=>{let t=l.value();if(n.locked){let a=0==s?1/n.aspectRatio:n.aspectRatio,r=(1+s)%2;t[r]=e*a,n.dimensions[r].set(t[r],!0)}i&&i(t)},{min:0,disabled:a.disabled,precision:a.precision}),s+1!=t.length){let r=document.createElement("a");r.className="lexsizecross fa-solid fa-xmark",n.appendChild(r)}if(this.clearQueue(),a.units){let o=document.createElement("span");o.className="lexunit",o.innerText=a.units,n.appendChild(o)}if(n.aspectRatio){let d=document.createElement("a");d.title="Lock Aspect Ratio",d.className="fa-solid fa-lock-open lexicon lock",n.appendChild(d),d.addEventListener("click",function(e){if(n.locked=!n.locked,n.locked){this.classList.add("fa-lock"),this.classList.remove("fa-lock-open");let t=l.value();n.aspectRatio=t[0]/t[1]}else this.classList.add("fa-lock-open"),this.classList.remove("fa-lock")},!1)}return l.name||(n.className+=" noname",container.style.width="100%"),l}addPad(e,t,i,a={}){if(!e)throw"Set Widget Name!";let l=this.create_widget(e,Widget.PAD,a);l.onGetValue=()=>o.value.xy,l.onSetValue=(t,a)=>{o.value.set(t[0],t[1]),d(o.value),a||this._trigger(new IEvent(e,o.value.xy),i)};let n=l.domEl;var s=document.createElement("div");s.className="lexpad",s.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let r=document.createElement("div");r.id="lexpad-"+e,r.className="lexinnerpad",r.style.width=a.padSize??"96px",r.style.height=a.padSize??"96px";let o=document.createElement("div");o.className="lexpadthumb",o.value=new LX.vec2(t[0],t[1]),o.min=a.min??0,o.max=a.max??1;let d=e=>{let[t,i]=[r.offsetWidth,r.offsetHeight],a=new LX.vec2(remapRange(e.x,o.min,o.max,0,1),remapRange(e.y,o.min,o.max,0,1));o.style.transform=`translate(calc( ${t*a.x}px - 50% ), calc( ${i*a.y}px - 50%)`};doAsync(()=>{d(o.value)}),r.appendChild(o),s.appendChild(r),n.appendChild(s),r.addEventListener("mousedown",function e(t){if(document.activeElement!=o){var i=c.root.ownerDocument;i.addEventListener("mousemove",h),i.addEventListener("mouseup",u),document.body.classList.add("nocursor"),document.body.classList.add("noevents"),t.stopImmediatePropagation(),t.stopPropagation(),a.onPress&&a.onPress.bind(o)(t,o)}});let c=this;function h(t){let a=r.getBoundingClientRect(),l=new LX.vec2(t.x-a.x,t.y-a.y);l.clp(0,r.offsetWidth,l);let[n,s]=[r.offsetWidth,r.offsetHeight],d=l.div(new LX.vec2(r.offsetWidth,r.offsetHeight));o.style.transform=`translate(calc( ${n*d.x}px - 50% ), calc( ${s*d.y}px - 50%)`,o.value=new LX.vec2(remapRange(d.x,0,1,o.min,o.max),remapRange(d.y,0,1,o.min,o.max)),c._trigger(new IEvent(e,o.value.xy,t),i),t.stopPropagation(),t.preventDefault()}function u(e){var t=c.root.ownerDocument;t.removeEventListener("mousemove",h),t.removeEventListener("mouseup",u),document.body.classList.remove("nocursor"),document.body.classList.remove("noevents"),a.onRelease&&a.onRelease.bind(o)(e,o)}return l}addProgress(e,t,i={}){if(!e)throw"Set Widget Name!";let a=this.create_widget(e,Widget.PROGRESS,i);a.onGetValue=()=>s.value,a.onSetValue=(e,t)=>{l.querySelector("meter").value=e,r(),l.querySelector("span")&&(l.querySelector("span").innerText=e)};let l=a.domEl;var n=document.createElement("div");n.className="lexprogress",n.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let s=document.createElement("meter");s.id="lexprogressbar-"+e,s.className="lexprogressbar",s.step="any",s.min=i.min??0,s.max=i.max??1,s.low=i.low??s.low,s.high=i.high??s.high,s.optimum=i.optimum??s.optimum,s.value=t;let r=()=>{let e=LX.getThemeColor("global-selected");void 0!=s.low&&s.value<s.low?e=LX.getThemeColor("global-color-error"):void 0!=s.high&&s.value<s.high&&(e=LX.getThemeColor("global-color-warning")),s.style.background=`color-mix(in srgb, ${e} 20%, transparent)`};if(n.appendChild(s),l.appendChild(n),i.showValue){document.getElementById("progressvalue-"+e)&&document.getElementById("progressvalue-"+e).remove();let o=document.createElement("span");o.id="progressvalue-"+e,o.style.padding="0px 5px",o.innerText=t,n.appendChild(o)}if(i.editable){s.classList.add("editable"),s.addEventListener("mousedown",function t(i){var a=d.root.ownerDocument;a.addEventListener("mousemove",c),a.addEventListener("mouseup",h),document.body.classList.add("noevents"),s.classList.add("grabbing"),i.stopImmediatePropagation(),i.stopPropagation();let l=s.getBoundingClientRect(),n=round(remapRange(i.offsetX,0,l.width,s.min,s.max));d.setValue(e,n)});let d=this;function c(t){if(0!=t.movementX){let a=s.getBoundingClientRect(),l=round(remapRange(t.offsetX-a.x,0,a.width,s.min,s.max));d.setValue(e,l),i.callback&&i.callback(l,t)}t.stopPropagation(),t.preventDefault()}function h(e){var t=d.root.ownerDocument;t.removeEventListener("mousemove",c),t.removeEventListener("mouseup",h),document.body.classList.remove("noevents"),s.classList.remove("grabbing")}}return r(),a}addFile(e,t,i={}){if(!e)throw"Set Widget Name!";let a=this.create_widget(e,Widget.FILE,i),l=a.domEl,n=i.local??!0,s=i.type??"text",r=i.read??!0,o=document.createElement("input");if(o.className="lexfileinput",o.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+" - 10%)",o.type="file",o.disabled=i.disabled??!1,i.placeholder&&(o.placeholder=i.placeholder),o.addEventListener("change",function(e){let a=e.target.files;if(a.length){if(r){i.onBeforeRead&&i.onBeforeRead();let l=new FileReader;"text"===s?l.readAsText(a[0]):"buffer"===s?l.readAsArrayBuffer(a[0]):"bin"===s?l.readAsBinaryString(a[0]):"url"===s&&l.readAsDataURL(a[0]),l.onload=e=>{t.call(this,e.target.result,a[0])}}else t(a[0])}}),o.addEventListener("cancel",function(e){t(null)}),l.appendChild(o),this.queue(l),n){let d=null;this.addButton(null,"<a style='margin-top: 0px;' class='fa-solid fa-gear'></a>",()=>{!d&&(d=new Dialog("Load Settings",e=>{e.addDropdown("Type",["text","buffer","bin","url"],s,e=>{s=e}),e.addButton(null,"Reload",e=>{o.dispatchEvent(new Event("change"))})},{onclose(e){e.remove(),d=null}}))},{className:"micro",skipInlineCount:!0,title:"Settings"})}return this.clearQueue(),a}addTree(e,t,i={}){let a=document.createElement("div");if(a.className="lextree",e){let l=document.createElement("span");l.innerHTML=e,a.appendChild(l)}let n=document.createElement("div");if(n.className="lextreetools",e||(n.className+=" notitle"),i.icons)for(let s of i.icons){let r=document.createElement("a");r.title=s.name,r.className="lexicon "+s.icon,r.addEventListener("click",s.callback),n.appendChild(r)}i.filter=i.filter??!0;let o=null;if(i.filter){(o=document.createElement("input")).id="lexnodetree_filter",o.setAttribute("placeholder","Filter.."),o.style.width="calc( 100% - 17px )",o.addEventListener("input",function(){h.refresh()});let d=document.createElement("a");d.className="lexicon fa-solid fa-magnifying-glass",n.appendChild(o),n.appendChild(d)}(i.icons||i.filter)&&a.appendChild(n);let c=document.createElement("ul");c.addEventListener("contextmenu",function(e){e.preventDefault()}),a.appendChild(c),this.root.appendChild(a);let h=new NodeTree(a,t,i);return h}addSeparator(){var e=document.createElement("div");e.className="lexseparator";let t=new Widget(null,Widget.SEPARATOR);t.domEl=e,this.current_branch?(this.current_branch.content.appendChild(e),this.current_branch.widgets.push(t)):this.root.appendChild(e)}addTabs(e,t={}){let i=this.current_branch?this.current_branch.content:this.root;if(this.current_branch||console.warn("No current branch!"),e.constructor!=Array)throw"Param @tabs must be an Array!";let a=t.vertical??!0,l=!a&&(t.showNames??!1),n=document.createElement("div");n.className="lextabscontainer",a||(n.className+=" horizontal");let s=document.createElement("div");s.className="tabs",n.appendChild(s),i.appendChild(n);for(let r=0;r<e.length;++r){let o=e[r];console.assert(o.name);let d=0==r,c=document.createElement("div");c.className="lextab "+(r==e.length-1?"last":"")+(d?"selected":""),c.innerHTML=(l?o.name:"")+"<a class='"+(o.icon||"fa fa-hashtag")+" "+(l?"withname":"")+"'></a>",c.title=o.name;let h=document.createElement("div");h.id=o.name.replace(/\s/g,""),h.className="widgets",d||h.toggleAttribute("hidden",!0),n.appendChild(h),c.addEventListener("click",e=>{s.querySelectorAll(".lextab").forEach(e=>{e.classList.remove("selected")}),e.target.classList.add("selected"),n.querySelectorAll(".widgets").forEach(e=>{e.toggleAttribute("hidden",!0)});let t=n.querySelector("#"+h.id);t.toggleAttribute("hidden"),o.onSelect&&o.onSelect(this,h)}),s.appendChild(c),o.onCreate&&(this.queue(h),o.onCreate(this,h),this.clearQueue())}this.addSeparator()}addCounter(e,t,i,a={}){let l=this.create_widget(e,Widget.COUNTER,a);l.onGetValue=()=>u.count,l.onSetValue=(e,t)=>{d(e,t)};let n=l.domEl,s=a.min??0,r=a.max??100,o=a.step??1,d=(t,a,l)=>{t=clamp(t,s,r),u.count=t,u.innerHTML=t,a||this._trigger(new IEvent(e,t,l),i)},c=document.createElement("div");c.className="lexcounter",n.appendChild(c),this.queue(c),this.addButton(null,"<a style='margin-top: 0px;' class='fa-solid fa-minus'></a>",(e,t)=>{let i=o??1;t.shiftKey&&(i*=10),d(u.count-i,!1,t)},{className:"micro",skipInlineCount:!0,title:"Minus"}),this.clearQueue();let h=document.createElement("div");h.className="lexcounterbox",c.appendChild(h);let u=document.createElement("span");if(u.className="lexcountervalue",u.innerHTML=t,u.count=t,h.appendChild(u),a.label){let p=document.createElement("span");p.className="lexcounterlabel",p.innerHTML=a.label,h.appendChild(p)}return this.queue(c),this.addButton(null,"<a style='margin-top: 0px;' class='fa-solid fa-plus'></a>",(e,t)=>{let i=o??1;t.shiftKey&&(i*=10),d(u.count+i,!1,t)},{className:"micro",skipInlineCount:!0,title:"Plus"}),this.clearQueue(),l}addTable(e,t,i={}){if(!t)throw"Data is needed to create a table!";let a=this.create_widget(e,Widget.TABLE,i);a.onGetValue=()=>{},a.onSetValue=(e,t)=>{};let l=a.domEl,n=document.createElement("div");n.className="lextable",n.style.width="calc( 100% - "+LX.DEFAULT_NAME_WIDTH+")";let s=document.createElement("table");function r(e,t,i,a){return i[e]<a[e]?-t:i[e]>a[e]?t:0}return n.appendChild(s),t.head=t.head??[],t.body=t.body??[],t.orderMap={},t.checkMap={},a.refreshTable=()=>{s.innerHTML="";{let e=document.createElement("thead");e.className="lextablehead",s.appendChild(e);let l=document.createElement("tr");if(i.selectable){let n=document.createElement("th"),o=document.createElement("input");o.type="checkbox",o.className="lexcheckbox",o.checked=t.checkMap[":root"]??!1,n.appendChild(o),o.addEventListener("change",function(){t.checkMap[":root"]=this.checked;let e=s.querySelector("tbody");for(let i of e.childNodes)t.checkMap[i.getAttribute("rowId")]=this.checked,i.querySelector("input").checked=this.checked}),l.appendChild(n)}for(let d of t.head){let c=document.createElement("th");c.innerHTML=`${d} <a class="fa-solid fa-sort"></a>`,c.querySelector("a").addEventListener("click",()=>{t.orderMap[d]||(t.orderMap[d]=1);let e=t.head.indexOf(d);t.body=t.body.sort(r.bind(this,e,t.orderMap[d])),t.orderMap[d]=-t.orderMap[d],a.refreshTable()}),l.appendChild(c)}if(i.rowActions){let h=document.createElement("th");h.className="sm",l.appendChild(h)}e.appendChild(l)}{let u=document.createElement("tbody");u.className="lextablebody",s.appendChild(u);for(let p=0;p<t.body.length;++p){let m=t.body[p],g=document.createElement("tr"),f=LX.getSupportedDOMName(m.join("-"));if(g.setAttribute("rowId",f),i.selectable){let v=document.createElement("td"),E=document.createElement("input");E.type="checkbox",E.className="lexcheckbox",E.checked=t.checkMap[f],v.appendChild(E),E.addEventListener("change",function(){if(t.checkMap[f]=this.checked,!this.checked){let e=s.querySelector("thead input[type='checkbox']");e.checked=t.checkMap[":root"]=!1}}),g.appendChild(v)}for(let $ of m){let y=document.createElement("td");y.innerHTML=`${$}`,g.appendChild(y)}if(i.rowActions){let x=document.createElement("td");x.className="sm";let L=document.createElement("div");for(let b of(L.className="lextablebuttons",x.appendChild(L),i.rowActions)){let w=document.createElement("a");w.className="lexicon","delete"==b?(w.className+=" fa-solid fa-trash-can",w.addEventListener("click",function(){t.body.splice(p,1),g.remove()})):"menu"==b?(w.className+=" fa-solid fa-ellipsis",w.addEventListener("click",function(e){addContextMenu(null,e,e=>{if(i.onMenuAction){i.onMenuAction(e);return}console.warn("Using <Menu action> without action callbacks.")})})):(console.assert(b.constructor==Object),w.className+=` ${b.icon}`),L.appendChild(w)}g.appendChild(x)}u.appendChild(g)}}},a.refreshTable(),a.name||(l.className+=" noname",n.style.width="100%"),l.appendChild(n),a}}LX.Panel=Panel;class Branch{constructor(e,t={}){this.name=e;var i=document.createElement("div");i.className="lexbranch",t.id&&(i.id=t.id),t.className&&(i.className+=" "+t.className),i.style.width="calc(100% - 7px)",i.style.margin="0 auto";var a=this;this.root=i,this.widgets=[];var l=document.createElement("div");l.className="lexbranchtitle",l.innerHTML="<a class='fa-solid fa-angle-up switch-branch-button'></a>",t.icon&&(l.innerHTML+="<a class='branchicon "+t.icon+"' style='margin-right: 8px; margin-bottom: -2px;'>"),l.innerHTML+=e||"Branch",i.appendChild(l);var n=document.createElement("div");n.id=e.replace(/\s/g,""),n.className="lexbranchcontent",i.appendChild(n),this.content=n,this._addBranchSeparator(),t.closed&&(l.className+=" closed",i.className+=" closed",this.grabber.setAttribute("hidden",!0),doAsync(()=>{this.content.setAttribute("hidden",!0)},15)),this.onclick=function(e){e.stopPropagation(),this.classList.toggle("closed"),this.parentElement.classList.toggle("closed"),a.content.toggleAttribute("hidden"),a.grabber.toggleAttribute("hidden"),LX.emit("@on_branch_closed",this.classList.contains("closed"),{target:a.panel})},this.oncontextmenu=function(e){e.preventDefault(),e.stopPropagation(),!this.parentElement.classList.contains("dialog")&&addContextMenu("Dock",e,t=>{e.preventDefault(),t.add("Floating",a._on_make_floating.bind(a))},{icon:"fa-regular fa-window-restore"})},l.addEventListener("click",this.onclick),l.addEventListener("contextmenu",this.oncontextmenu)}_on_make_floating(){let e=new Dialog(this.name,e=>{for(let t of this.widgets)e.root.appendChild(t.domEl)});e.widgets=this.widgets;let t=this.root.parentElement;this.root.remove();let i=t.querySelector(".lexbranch");i&&i.classList.add("first");let a=t.querySelectorAll(".lexbranch");a.length&&a[a.length-1].classList.add("last")}_addBranchSeparator(){let e=document.createElement("div");e.className="lexwidgetseparator",e.style.width="100%",e.style.background="none";let t=document.createElement("div");t.innerHTML="&#9662;",e.appendChild(t),doAsync(()=>{t.style.marginLeft=parseFloat(LX.DEFAULT_NAME_WIDTH)/100*this.content.offsetWidth+"px"},10);let i=document.createElement("div");i.style.width="1px",i.style.marginLeft="6px",i.style.marginTop="2px",i.style.height="0px",t.appendChild(i),t.addEventListener("mousedown",function e(t){var s=a.root.ownerDocument;s.addEventListener("mouseup",n),s.addEventListener("mousemove",l),t.stopPropagation(),t.preventDefault();let r=a.root.offsetHeight-a.root.children[0].offsetHeight;i.style.height=r-3+"px",document.body.classList.add("nocursor")}),this.grabber=t;let a=this;function l(e){let i=e.movementX;if(0!=i){let l=parseFloat(t.style.marginLeft);t.style.marginLeft=clamp(l+i,32,a.content.offsetWidth-32)+"px"}}function n(e){a._updateWidgets(),i.style.height="0px";var t=a.root.ownerDocument;t.removeEventListener("mouseup",n),t.removeEventListener("mousemove",l),document.body.classList.remove("nocursor")}this.content.appendChild(e)}_updateWidgets(){for(var e=this.grabber.style.marginLeft,t=0;t<this.widgets.length;t++){let i=this.widgets[t],a=i.domEl;if(a.children.length<2)continue;var l=a.children[0],n=a.children[1];l.style.width=e;let s="0px";i.type===Widget.FILE&&(s="10%"),n.style.width="-moz-calc( 100% - "+e+" - "+s+" )",n.style.width="-webkit-calc( 100% - "+e+" - "+s+" )",n.style.width="calc( 100% - "+e+" - "+s+" )",i.onresize&&i.onresize()}}}LX.Branch=Branch;class Footer{constructor(e={}){let t=document.createElement("footer");t.className="lexfooter";let i=document.createElement("div");if(i.className="wrapper",t.appendChild(i),e.columns&&e.columns.constructor==Array){let a=document.createElement("div");for(let l of(a.className="columns",a.style.gridTemplateColumns="1fr ".repeat(e.columns.length),i.appendChild(a),e.columns)){let n=document.createElement("div");n.className="col",a.appendChild(n);let s=document.createElement("h2");if(s.innerHTML=l.title,n.appendChild(s),!l.items||!l.items.length)continue;let r=document.createElement("ul");for(let o of(n.appendChild(r),l.items)){let d=document.createElement("li");d.innerHTML=`<a class="" href="${o.link}">${o.title}</a>`,r.appendChild(d)}}}if(e.credits||e.socials){let c=document.createElement("hr");i.appendChild(c);let h=document.createElement("div");if(h.className="credits-and-socials",i.appendChild(h),e.credits){let u=document.createElement("p");u.innerHTML=e.credits,h.appendChild(u)}if(e.socials){let p=document.createElement("div");for(let m of(p.className="social",e.socials)){let g=document.createElement("a");g.title=m.title,g.innerHTML=m.icon,g.href=m.link,g.target="_blank",p.appendChild(g)}h.appendChild(p)}}let f=e.parent??document.body;f.appendChild(t)}}LX.Footer=Footer;class Dialog{static _last_id=0;constructor(e,t,i={}){t||console.warn("Content is empty, add some widgets using 'callback' parameter!"),this._oncreate=t,this.id=simple_guidGenerator();let a=i.size??[],l=i.position??[],n=i.draggable??!0,s=i.modal??!1;var r=document.createElement("dialog");r.className="lexdialog "+(i.className??""),r.id=i.id??"dialog"+Dialog._last_id++,LX.root.appendChild(r),doAsync(()=>{s?r.showModal():r.show()},10);let o=this;var d=document.createElement("div");if(e&&(d.className="lexdialogtitle",d.innerHTML=e,d.setAttribute("draggable",!1),d.oncontextmenu=function(t){t.preventDefault(),t.stopPropagation(),LX.main_area&&"horizontal"===LX.main_area.type&&addContextMenu("Dock",t,i=>{t.preventDefault();let a=function(e){let t=e.panels[0];if(t)return t;for(var i of e.sections)if(t=a(i))return t},l=function(t){let i=t.branches.find(t=>t.name===e);for(let a of(i?t.root.appendChild(i.root):(t.branch(e),i=t.branches.find(t=>t.name===e)),o.widgets))i.content.appendChild(a.domEl);i.widgets=o.widgets,t.root.querySelectorAll(".lexbranch.last").forEach(e=>{e.classList.remove("last")}),i.root.classList.add("last"),r.remove()},n=a(LX.main_area.sections[1]);i.add('<i class="fa-regular fa-window-maximize fa-window-maximize fa-rotate-90">',{disabled:!n,id:"dock_options0",callback(){l(n)}});let s=a(LX.main_area.sections[0]);i.add('<i class="fa-regular fa-window-maximize fa-window-maximize fa-rotate-270">',{disabled:!s,id:"dock_options1",callback(){l(s)}})},{icon:"fa-regular fa-window-restore"})},r.appendChild(d)),i.closable??!0){this.close=()=>{i.onBeforeClose&&i.onBeforeClose(this),i.onclose?i.onclose(this.root):(r.close(),doAsync(()=>{o.panel.clear(),r.remove()},150))};var c=document.createElement("a");c.className="lexdialogcloser fa-solid fa-xmark",c.title="Close",c.addEventListener("click",this.close),e?d.appendChild(c):(c.classList.add("notitle"),r.appendChild(c))}let h=new Panel;h.root.classList.add("lexdialogcontent"),e||h.root.classList.add("notitle"),t&&t.call(this,h),r.appendChild(h.root),h.root.querySelectorAll(".lexbranch").forEach(e=>e.classList.add("dialog")),this.panel=h,this.root=r,this.title=d,n&&makeDraggable(r,Object.assign({targetClass:"lexdialogtitle"},i)),a.length&&"string"!=typeof a[0]&&(a[0]+="px"),a.length&&"string"!=typeof a[1]&&(a[1]+="px"),r.style.width=a[0]?a[0]:"25%",r.style.height=a[1]?a[1]:"auto",r.style.translate=i.position?"unset":"-50% -50%",i.size&&(this.size=a),r.style.left=l[0]??"50%",r.style.top=l[1]??"50%",h.root.style.width="calc( 100% - 30px )",h.root.style.height=e?"calc( 100% - "+(d.offsetHeight+30)+"px )":"calc( 100% - 51px )"}destroy(){this.root.remove()}refresh(){this.panel.root.innerHTML="",this._oncreate.call(this,this.panel)}setPosition(e,t){this.root.style.left=e+"px",this.root.style.top=t+"px"}setTitle(e){let t=this.root.querySelector(".lexdialogtitle");t&&(t.innerText=e)}}LX.Dialog=Dialog;class PocketDialog extends Dialog{static TOP=0;static BOTTOM=1;constructor(e,t,i={}){i.draggable=i.draggable??!1,i.closable=i.closable??!1;super(e,t,i);let a=this;if(LX.addSignal("@on_branch_closed",this.panel,e=>{this.dock_pos==PocketDialog.BOTTOM&&(this.root.style.top="calc(100% - "+(this.root.offsetHeight+3)+"px)")}),this.root.classList.add("pocket"),this.root.style.translate="none",this.root.style.top="0",this.root.style.left="unset",i.position||(this.root.style.right="3px",this.root.style.top="3px"),this.panel.root.style.width="calc( 100% - 12px )",this.panel.root.style.height="calc( 100% - 40px )",this.dock_pos=PocketDialog.TOP,this.minimized=!1,this.title.tabIndex=-1,this.title.addEventListener("click",e=>{if(this.title._eventCatched){this.title._eventCatched=!1;return}this.size&&(this.minimized?this.root.style.height=this.size[1]:this.root.style.height="auto"),this.root.classList.toggle("minimized"),this.minimized=!this.minimized,this.dock_pos==PocketDialog.BOTTOM&&(a.root.style.top=this.root.classList.contains("minimized")?"calc(100% - "+(a.title.offsetHeight+6)+"px)":"calc(100% - "+(a.root.offsetHeight+3)+"px)")}),!i.draggable){let l=i.float;if(l)for(var n=0;n<l.length;n++){let s=l[n];switch(s){case"b":this.root.style.top="calc(100% - "+(this.root.offsetHeight+3)+"px)";break;case"l":this.root.style.right="unset",this.root.style.left=i.position?i.position[1]:"3px"}}this.root.classList.add("dockable"),this.title.addEventListener("keydown",function(e){e.ctrlKey&&(a.root.style.right="unset","ArrowLeft"==e.key?a.root.style.left="0px":"ArrowRight"==e.key?a.root.style.left="calc(100% - "+(a.root.offsetWidth+3)+"px)":"ArrowUp"==e.key?(a.root.style.top="0px",a.dock_pos=PocketDialog.TOP):"ArrowDown"==e.key&&(a.root.style.top="calc(100% - "+(a.root.offsetHeight+3)+"px)",a.dock_pos=PocketDialog.BOTTOM))})}}}LX.PocketDialog=PocketDialog;class ContextMenu{constructor(e,t,i={}){if(document.body.querySelectorAll(".lexcontextmenu").forEach(e=>e.remove()),this.root=document.createElement("div"),this.root.className="lexcontextmenu",this.root.style.left=e.x-48+document.scrollingElement.scrollLeft+"px",this.root.style.top=e.y-8+document.scrollingElement.scrollTop+"px",this.root.addEventListener("mouseleave",function(){this.remove()}),this.items=[],this.colors={},t){let a={};a[t]=[],a.className="cmtitle",a.icon=i.icon,this.items.push(a)}}_adjustPosition(e,t,i=!1){let a=e.getBoundingClientRect();if(i){let l=window.innerWidth-a.right;l<0&&(e.style.left=e.offsetLeft+(l-t)+"px"),(l=window.innerHeight-(a.top+a.height))<0&&(e.style.top=e.offsetTop+(l-t+20)+"px")}else{let n=a.width;a.left<0?e.style.left=t+"px":window.innerWidth-a.right<0&&(e.style.left=window.innerWidth-n-t+"px"),a.top<0?e.style.top=t+"px":a.top+a.height>window.innerHeight&&(e.style.top=window.innerHeight-a.height-t+"px")}}_createSubmenu(e,t,i,a){this.root.querySelectorAll(".lexcontextmenu").forEach(e=>e.remove());let l=document.createElement("div");l.className="lexcontextmenu",i.appendChild(l);for(var n=0;n<e[t].length;++n){let s=e[t][n],r=Object.keys(s)[0];this._createEntry(s,r,l,a)}var o=i.getBoundingClientRect();l.style.left=o.width+"px",l.style.marginTop=3.5-i.offsetHeight+"px",this._adjustPosition(l,6,!0)}_createEntry(e,t,i,a){let l=e[t].length,n=document.createElement("div");n.className="lexmenuboxentry"+(e.className?" "+e.className:""),n.id=e.id??"eId"+getSupportedDOMName(t),n.innerHTML="";let s=e.icon;s&&(n.innerHTML+="<a class='"+s+" fa-sm'></a>");let r=e.disabled;if(n.innerHTML+="<div class='lexentryname"+(r?" disabled":"")+"'>"+t+"</div>",i.appendChild(n),this.colors[t]&&(n.style.borderColor=this.colors[t]),""==t){n.className+=" cmseparator";return}if(n.addEventListener("click",i=>{if(i.stopPropagation(),i.stopImmediatePropagation(),r)return;let s=e.callback;s&&(s.call(this,t,n),this.root.remove()),l&&"click"==LX.OPEN_CONTEXTMENU_ENTRY&&this._createSubmenu(e,t,n,++a)}),!l)return;let o=document.createElement("a");o.className="fa-solid fa-bars-staggered fa-xs",n.appendChild(o),"mouseover"==LX.OPEN_CONTEXTMENU_ENTRY&&n.addEventListener("mouseover",i=>{n.built||(n.built=!0,this._createSubmenu(e,t,n,++a),i.stopPropagation())}),n.addEventListener("mouseleave",()=>{a=-1,i.querySelectorAll(".lexcontextmenu").forEach(e=>e.remove())})}onCreate(){doAsync(()=>this._adjustPosition(this.root,6))}add(e,t={}){t.constructor==Function&&(t={callback:t}),e+="";let i=e.split("/"),a=i[i.length-1];this.colors[a]=t.color;let l=0,n=(e,a)=>{if(void 0==e)return;let s=null;if(a.forEach(t=>{let i=Object.keys(t),a=i.find(t=>t==e);a&&(s=t[a])}),s)n(i[l++],s);else{let r={};r[e]=[];let o=i[l++];o||(r.id=t.id,r.callback=t.callback,r.disabled=t.disabled??!1),a.push(r),n(o,r[e])}};n(i[l++],this.items);let s=e=>{let t=Object.keys(e)[0],i=e[t];if(i.length){if(null==i.find(e=>Object.keys(e)[0]==t)){let a={};a[t]=[],a.className="cmtitle",e[t].unshift(a)}for(var l of e[t]){let n=Object.keys(l)[0];for(var r=0;r<l[n].length;++r)s(l)}}};for(let r of this.items)s(r);for(let o of this.items){let d=Object.keys(o)[0],c="eId"+getSupportedDOMName(d),h="#"+(o.id??c);this.root.querySelector(h)||this._createEntry(o,d,this.root,-1)}}setColor(e,t){"#"!==t[0]&&(t=rgbToHex(t)),this.colors[e]=t}}function addContextMenu(e,t,i,a){var l=new ContextMenu(t,e,a);return LX.root.appendChild(l.root),i&&i(l),l.onCreate(),l}LX.ContextMenu=ContextMenu,LX.addContextMenu=addContextMenu;class Curve{constructor(e,t,i={}){let a=document.createElement("div");a.className="curve "+(i.className?i.className:""),a.style.minHeight="50px",a.style.width=i.width||"100%",a.style.minWidth="50px",a.style.minHeight="20px",a.bgcolor=i.bgColor||LX.getThemeColor("global-intense-background"),a.pointscolor=i.pointsColor||LX.getThemeColor("global-selected-light"),a.linecolor=i.lineColor||"#555",a.value=t||[],a.xrange=i.xrange||[0,1],a.yrange=i.yrange||[0,1],a.defaulty=null!=i.defaulty?i.defaulty:0,a.no_overlap=i.noOverlap||!1,a.show_samples=i.showSamples||0,a.allow_add_values=i.allowAddValues??!0,a.draggable_x=i.draggableX??!0,a.draggable_y=i.draggableY??!0,a.smooth=(i.smooth&&"number"==typeof i.smooth?i.smooth:.3)||!1,a.move_out=i.moveOutAction??LX.CURVE_MOVEOUT_DELETE,LX.addSignal("@on_new_color_scheme",(e,t)=>{a.bgcolor=i.bgColor||LX.getThemeColor("global-intense-background"),a.pointscolor=i.pointsColor||LX.getThemeColor("global-selected-light"),this.redraw()}),this.element=a;let l=document.createElement("canvas");function n(e){return[l.width*(e[0]-a.xrange[0])/a.xrange[1],l.height*(e[1]-a.yrange[0])/a.yrange[1]]}function s(e){return[e[0]*a.xrange[1]/l.width+a.xrange[0],e[1]*a.yrange[1]/l.height+a.yrange[0]]}l.width=i.width||200,l.height=i.height||50,a.appendChild(l),this.canvas=l,a.addEventListener("mousedown",d),a.getValueAt=function(e){if(e<a.xrange[0]||e>a.xrange[1])return a.defaulty;for(var t=[a.xrange[0],a.defaulty],i=0,l=0;l<a.value.length;l+=1){var n=a.value[l];if(e==n[0])return n[1];if(e<n[0])return i=(e-t[0])/(n[0]-t[0]),t[1]*(1-i)+n[1]*i;t=n}return n=[a.xrange[1],a.defaulty],i=(e-t[0])/(n[0]-t[0]),t[1]*(1-i)+n[1]*i},a.resample=function(e){for(var t=[],i=(a.xrange[1]-a.xrange[0])/e,l=a.xrange[0];l<=a.xrange[1];l+=i)t.push(a.getValueAt(l));return t},a.addValue=function(e){for(var t=0;t<a.value;t++)if(!(a.value[t][0]<e[0])){a.value.splice(t,0,e),redraw();return}a.value.push(e),redraw()};var r=-1;a.redraw=function(e={}){e.value&&(a.value=e.value),e.xrange&&(a.xrange=e.xrange),e.yrange&&(a.yrange=e.yrange),e.smooth&&(a.smooth=e.smooth);var t=l.parentElement.getBoundingClientRect();l.parentElement.parentElement&&(t=l.parentElement.parentElement.getBoundingClientRect()),t&&l.width!=t.width&&t.width&&t.width<1e3&&(l.width=t.width);var i=l.getContext("2d");i.setTransform(1,0,0,1,0,0),i.translate(0,l.height),i.scale(1,-1),i.fillStyle=a.bgcolor,i.fillRect(0,0,l.width,l.height),i.strokeStyle=a.linecolor,i.beginPath();var s=n([a.xrange[0],a.defaulty]);i.moveTo(s[0],s[1]);let o=[s[0],s[1]];for(var d in a.value){var c=a.value[d];s=n(c),o.push(s[0]),o.push(s[1]),a.smooth||i.lineTo(s[0],s[1])}s=n([a.xrange[1],a.defaulty]),o.push(s[0]),o.push(s[1]),a.smooth?LX.UTILS.drawSpline(i,o,a.smooth):(i.lineTo(s[0],s[1]),i.stroke());for(var d=0;d<a.value.length;d+=1){var c=a.value[d];s=n(c),r==d?i.fillStyle="white":i.fillStyle=a.pointscolor,i.beginPath(),i.arc(s[0],s[1],r==d?4:3,0,2*Math.PI),i.fill()}if(a.show_samples){var h=a.resample(a.show_samples);i.fillStyle="#888";for(var d=0;d<h.length;d+=1){var c=[d*((a.xrange[1]-a.xrange[0])/a.show_samples)+a.xrange[0],h[d]];s=n(c),i.beginPath(),i.arc(s[0],s[1],2,0,2*Math.PI),i.fill()}}};var o=[0,0];function d(e){document.addEventListener("mousemove",c),document.addEventListener("mouseup",h);var t=l.getBoundingClientRect(),i=e.clientX-t.left,n=e.clientY-t.top;if(r=m(i,l.height-n),e.button==LX.MOUSE_LEFT_CLICK&&-1==r&&a.allow_add_values){var d=s([i,l.height-n]);a.value.push(d),g(),r=a.value.indexOf(d)}o=[i,n],a.redraw(),e.preventDefault(),e.stopPropagation()}function c(e){var t=l.getBoundingClientRect(),i=e.clientX-t.left,n=e.clientY-t.top;i<0?i=0:i>l.width&&(i=l.width),n<0?n=0:n>l.height&&(n=l.height);let d=[e.clientX-t.left,e.clientY-t.top];if(-1!=r&&p(d,[i,n])>.5*l.height){if(a.move_out==LX.CURVE_MOVEOUT_DELETE)a.value.splice(r,1);else{let c=[d[0]-i,d[1]-n],m=a.value[r];m[0]=0==c[0]?m[0]:c[0]<0?a.xrange[0]:a.xrange[1],m[1]=0==c[1]?m[1]:c[1]<0?a.yrange[1]:a.yrange[0]}h(e);return}var f,v=s([-(a.draggable_x?o[0]-i:0),a.draggable_y?o[1]-n:0]);if(-1!=r){var E=a.xrange[0],$=a.xrange[1];a.no_overlap&&(r>0&&(E=a.value[r-1][0]),r<a.value.length-1&&($=a.value[r+1][0]));var y=a.value[r];y[0]+=v[0],y[1]+=v[1],y[0]<E?y[0]=E:y[0]>$&&(y[0]=$),y[1]<a.yrange[0]?y[1]=a.yrange[0]:y[1]>a.yrange[1]&&(y[1]=a.yrange[1])}g(),a.redraw(),o[0]=i,o[1]=n,u(e),e.preventDefault(),e.stopPropagation()}function h(e){r=-1,a.redraw(),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",h),u(e),e.preventDefault(),e.stopPropagation()}function u(e){i.callback&&i.callback.call(a,a.value,e)}function p(e,t){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2))}function m(e,t){for(var i=1e5,l=-1,s=0;s<a.value.length;s++){var r=n(a.value[s]),o=p([e,t],r);o<i&&o<8&&(i=o,l=s)}return l}function g(){var e=null;-1!=r&&(e=a.value[r]),a.value.sort(function(e,t){return e[0]-t[0]}),e&&(r=a.value.indexOf(e))}return a.redraw(),this}redraw(e={}){this.element.redraw(e)}}LX.Curve=Curve;class Dial{constructor(e,t,i={}){let a=document.createElement("div");a.className="dial "+(i.className?i.className:""),a.style.width=a.style.height=i.size||"100%",a.style.minWidth=a.style.minHeight="50px",a.bgcolor=i.bgColor||LX.getThemeColor("global-dark-background"),a.pointscolor=i.pointsColor||LX.getThemeColor("global-selected-light"),a.linecolor=i.lineColor||"#555",a.value=t||[],a.xrange=i.xrange||[0,1],a.yrange=i.yrange||[0,1],a.defaulty=null!=i.defaulty?i.defaulty:0,a.no_overlap=i.noOverlap||!1,a.show_samples=i.showSamples||0,a.allow_add_values=i.allowAddValues??!0,a.draggable_x=i.draggableX??!0,a.draggable_y=i.draggableY??!0,a.smooth=(i.smooth&&"number"==typeof i.smooth?i.smooth:.3)||!1,a.move_out=i.moveOutAction??LX.CURVE_MOVEOUT_DELETE,this.element=a;let l=document.createElement("canvas");function n(e,t){return e[0],[l.width*(e[0]-a.xrange[0])/a.xrange[1],l.height*(e[1]-a.yrange[0])/a.yrange[1]]}function s(e){return[e[0]*a.xrange[1]/l.width+a.xrange[0],e[1]*a.yrange[1]/l.height+a.yrange[0]]}l.width=l.height=i.size||200,a.appendChild(l),this.canvas=l,a.addEventListener("mousedown",d),a.getValueAt=function(e){if(e<a.xrange[0]||e>a.xrange[1])return a.defaulty;for(var t=[a.xrange[0],a.defaulty],i=0,l=0;l<a.value.length;l+=1){var n=a.value[l];if(e==n[0])return n[1];if(e<n[0])return i=(e-t[0])/(n[0]-t[0]),t[1]*(1-i)+n[1]*i;t=n}return n=[a.xrange[1],a.defaulty],i=(e-t[0])/(n[0]-t[0]),t[1]*(1-i)+n[1]*i},a.resample=function(e){for(var t=[],i=(a.xrange[1]-a.xrange[0])/e,l=a.xrange[0];l<=a.xrange[1];l+=i)t.push(a.getValueAt(l));return t},a.addValue=function(e){for(var t=0;t<a.value;t++)if(!(a.value[t][0]<e[0])){a.value.splice(t,0,e),redraw();return}a.value.push(e),redraw()};var r=-1;a.redraw=function(e={}){e.value&&(a.value=e.value),e.xrange&&(a.xrange=e.xrange),e.yrange&&(a.yrange=e.yrange),e.smooth&&(a.smooth=e.smooth);var t=l.parentElement.getBoundingClientRect();l.parentElement.parentElement&&(t=l.parentElement.parentElement.getBoundingClientRect()),t&&l.width!=t.width&&t.width&&t.width<1e3&&(l.width=t.width);var i=l.getContext("2d");i.setTransform(1,0,0,1,0,0),i.translate(0,l.height),i.scale(1,-1),i.fillStyle=a.bgcolor,i.fillRect(0,0,l.width,l.height),i.strokeStyle=a.linecolor,i.beginPath();var s=n([a.xrange[0],a.defaulty]);i.moveTo(s[0],s[1]);let o=[s[0],s[1]];for(var d in a.value){var c=a.value[d];s=n(c),o.push(s[0]),o.push(s[1])}s=n([a.xrange[1],a.defaulty]),o.push(s[0]),o.push(s[1]),s=n([0,0]),i.fillStyle="gray",i.beginPath(),i.arc(s[0],s[1],3,0,2*Math.PI),i.fill();for(var d=0;d<a.value.length;d+=1){var c=a.value[d];s=n(c),r==d?i.fillStyle="white":i.fillStyle=a.pointscolor,i.beginPath(),i.arc(s[0],s[1],r==d?4:3,0,2*Math.PI),i.fill()}if(a.show_samples){var h=a.resample(a.show_samples);i.fillStyle="#888";for(var d=0;d<h.length;d+=1){var c=[d*((a.xrange[1]-a.xrange[0])/a.show_samples)+a.xrange[0],h[d]];s=n(c),i.beginPath(),i.arc(s[0],s[1],2,0,2*Math.PI),i.fill()}}};var o=[0,0];function d(e){document.addEventListener("mousemove",c),document.addEventListener("mouseup",h);var t=l.getBoundingClientRect(),i=e.clientX-t.left,n=e.clientY-t.top;if(r=m(i,l.height-n),e.button==LX.MOUSE_LEFT_CLICK&&-1==r&&a.allow_add_values){var d=s([i,l.height-n]);a.value.push(d),g(),r=a.value.indexOf(d)}o=[i,n],a.redraw(),e.preventDefault(),e.stopPropagation()}function c(e){var t=l.getBoundingClientRect(),i=e.clientX-t.left,n=e.clientY-t.top;i<0?i=0:i>l.width&&(i=l.width),n<0?n=0:n>l.height&&(n=l.height);let d=[e.clientX-t.left,e.clientY-t.top];if(-1!=r&&p(d,[i,n])>.5*l.height){if(a.move_out==LX.CURVE_MOVEOUT_DELETE)a.value.splice(r,1);else{let c=[d[0]-i,d[1]-n],m=a.value[r];m[0]=0==c[0]?m[0]:c[0]<0?a.xrange[0]:a.xrange[1],m[1]=0==c[1]?m[1]:c[1]<0?a.yrange[1]:a.yrange[0]}h(e);return}var f,v=s([-(a.draggable_x?o[0]-i:0),a.draggable_y?o[1]-n:0]);if(-1!=r){var E=a.xrange[0],$=a.xrange[1];a.no_overlap&&(r>0&&(E=a.value[r-1][0]),r<a.value.length-1&&($=a.value[r+1][0]));var y=a.value[r];y[0]+=v[0],y[1]+=v[1],y[0]<E?y[0]=E:y[0]>$&&(y[0]=$),y[1]<a.yrange[0]?y[1]=a.yrange[0]:y[1]>a.yrange[1]&&(y[1]=a.yrange[1])}g(),a.redraw(),o[0]=i,o[1]=n,u(e),e.preventDefault(),e.stopPropagation()}function h(e){r=-1,a.redraw(),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",h),u(e),e.preventDefault(),e.stopPropagation()}function u(e){i.callback&&i.callback.call(a,a.value,e)}function p(e,t){return Math.sqrt(Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2))}function m(e,t){for(var i=1e5,l=-1,s=0;s<a.value.length;s++){var r=n(a.value[s]),o=p([e,t],r);o<i&&o<8&&(i=o,l=s)}return l}function g(){var e=null;-1!=r&&(e=a.value[r]),a.value.sort(function(e,t){return e[0]-t[0]}),e&&(r=a.value.indexOf(e))}return a.redraw(),this}redraw(e={}){this.element.redraw(e)}}LX.Dial=Dial;class AssetViewEvent{static NONE=0;static ASSET_SELECTED=1;static ASSET_DELETED=2;static ASSET_RENAMED=3;static ASSET_CLONED=4;static ASSET_DBLCLICKED=5;static ENTER_FOLDER=6;static ASSET_CHECKED=7;constructor(e,t,i){this.type=e||TreeEvent.NONE,this.item=t,this.value=i,this.multiple=!1}string(){switch(this.type){case AssetViewEvent.NONE:return"assetview_event_none";case AssetViewEvent.ASSET_SELECTED:return"assetview_event_selected";case AssetViewEvent.ASSET_DELETED:return"assetview_event_deleted";case AssetViewEvent.ASSET_RENAMED:return"assetview_event_renamed";case AssetViewEvent.ASSET_CLONED:return"assetview_event_cloned";case AssetViewEvent.ASSET_DBLCLICKED:return"assetview_event_dblclicked";case AssetViewEvent.ENTER_FOLDER:return"assetview_event_enter_folder";case AssetViewEvent.ASSET_CHECKED:return"assetview_event_checked"}}}LX.AssetViewEvent=AssetViewEvent;class AssetView{static LAYOUT_CONTENT=0;static LAYOUT_LIST=1;static MAX_PAGE_ELEMENTS=50;constructor(e={}){this.rootPath="https://raw.githubusercontent.com/jxarco/lexgui.js/master/",this.layout=e.layout??AssetView.LAYOUT_CONTENT,this.contentPage=1,e.rootPath&&(e.rootPath.constructor!==String?console.warn("Asset Root Path must be a String (now is "+path.constructor.name+")"):this.rootPath=e.rootPath);let t=document.createElement("div");t.className="lexassetbrowser",this.root=t;let i=new LX.Area({height:"100%"});t.appendChild(i.root);let a,l,n=i;this.skipBrowser=e.skipBrowser??!1,this.skipPreview=e.skipPreview??!1,this.useNativeTitle=e.useNativeTitle??!1,this.onlyFolders=e.onlyFolders??!0,this.allowMultipleSelection=e.allowMultipleSelection??!1,this.previewActions=e.previewActions??[],this.contextMenu=e.contextMenu??[],this.onRefreshContent=e.onRefreshContent,this.skipBrowser||([a,l]=i.split({type:"horizontal",sizes:["15%","85%"]}),n=l,a.setLimitBox(210,0),l.setLimitBox(512,0)),this.skipPreview||([n,l]=n.split({type:"horizontal",sizes:["80%","20%"]})),this.allowedTypes=e.allowedTypes||["None","Image","Mesh","Script","JSON","Clip"],this.prevData=[],this.nextData=[],this.data=[],this._processData(this.data,null),this.currentData=this.data,this.path=["@"],this.skipBrowser||this._createTreePanel(a),this._createContentPanel(n),this.skipPreview||(this.previewPanel=l.addPanel({className:"lexassetcontentpanel",style:{overflow:"scroll"}}))}load(e,t){this.prevData.length=0,this.nextData.length=0,this.data=e,this._processData(this.data,null),this.currentData=this.data,this.path=["@"],this.skipBrowser||this._createTreePanel(this.area),this._refreshContent(),this.onevent=t}clear(){this.previewPanel&&this.previewPanel.clear(),this.leftPanel&&this.leftPanel.clear(),this.rightPanel&&this.rightPanel.clear()}_processData(e,t){e.constructor!==Array&&(e.folder=t,e.children=e.children??[]);let i=e.constructor===Array?e:e.children;for(var a=0;a<i.length;++a)this._processData(i[a],e)}_updatePath(e){this.path.length=0;let t=e=>{if(!e)return;let i=(e.children?e.children:e)[0];i&&i.folder&&(this.path.push(i.folder.id??"@"),t(i.folder.folder))};t(e),LX.emit("@on_folder_change",this.path.reverse().join("/"))}_createTreePanel(e){this.leftPanel?this.leftPanel.clear():this.leftPanel=e.addPanel({className:"lexassetbrowserpanel"});let t={id:"/",children:this.data};this.tree=this.leftPanel.addTree("Content Browser",t,{filter:!1,onlyFolders:this.onlyFolders,onevent:e=>{let t=e.node,i=e.value;switch(e.type){case LX.TreeEvent.NODE_SELECTED:e.multiple||this._enterFolder(t),t.parent||(this.prevData.push(this.currentData),this.currentData=this.data,this._refreshContent(),this.path=["@"],LX.emit("@on_folder_change",this.path.join("/")));break;case LX.TreeEvent.NODE_DRAGGED:t.folder=i,this._refreshContent()}}})}_setContentLayout(e){this.layout=e,this._refreshContent()}_createContentPanel(e){this.rightPanel?this.rightPanel.clear():this.rightPanel=e.addPanel({className:"lexassetcontentpanel"});let t=(e,t)=>{let i=addContextMenu("Sort by",t,e=>{e.add("Name",()=>this._sortData("id")),e.add("Type",()=>this._sortData("type")),e.add(""),e.add("Ascending",()=>this._sortData()),e.add("Descending",()=>this._sortData(null,!0))}),a=this.parent.root.parentElement;a.classList.contains("lexdialog")&&(i.root.style.zIndex=+getComputedStyle(a).zIndex+1)},i=(e,t)=>{let i=addContextMenu("Layout",t,e=>{e.add("Content",()=>this._setContentLayout(AssetView.LAYOUT_CONTENT)),e.add(""),e.add("List",()=>this._setContentLayout(AssetView.LAYOUT_LIST))}),a=this.parent.root.parentElement;a.classList.contains("lexdialog")&&(i.root.style.zIndex=+getComputedStyle(a).zIndex+1)},a=(e,t)=>{if(!this.allowNextPage)return;let i=this.contentPage;this.contentPage+=e,this.contentPage=Math.min(this.contentPage,((this.currentData.length-1)/AssetView.MAX_PAGE_ELEMENTS|0)+1),this.contentPage=Math.max(this.contentPage,1),i!=this.contentPage&&this._refreshContent()};this.rightPanel.sameLine(),this.rightPanel.addDropdown("Filter",this.allowedTypes,this.allowedTypes[0],e=>this._refreshContent.call(this,null,e),{width:"30%",minWidth:"128px"}),this.rightPanel.addText(null,this.searchValue??"",e=>this._refreshContent.call(this,e,null),{placeholder:"Search assets.."}),this.rightPanel.addButton(null,"<a class='fa fa-arrow-up-short-wide'></a>",t.bind(this),{className:"micro",title:"Sort"}),this.rightPanel.addButton(null,"<a class='fa-solid fa-grip'></a>",i.bind(this),{className:"micro",title:"View"}),this.rightPanel.addButton(null,"<a class='fa-solid fa-angles-left'></a>",a.bind(this,-1),{className:"micro",title:"Previous Page"}),this.rightPanel.addButton(null,"<a class='fa-solid fa-angles-right'></a>",a.bind(this,1),{className:"micro",title:"Next Page"}),this.rightPanel.endLine(),this.skipBrowser||(this.rightPanel.sameLine(),this.rightPanel.addComboButtons(null,[{value:"Left",icon:"fa-solid fa-left-long",callback:e=>{this.prevData.length&&(this.nextData.push(this.currentData),this.currentData=this.prevData.pop(),this._refreshContent(),this._updatePath(this.currentData))}},{value:"Right",icon:"fa-solid fa-right-long",callback:e=>{this.nextData.length&&(this.prevData.push(this.currentData),this.currentData=this.nextData.pop(),this._refreshContent(),this._updatePath(this.currentData))}},{value:"Refresh",icon:"fa-solid fa-arrows-rotate",callback:e=>{this._refreshContent()}}],{width:"20%",minWidth:"164px",noSelection:!0}),this.rightPanel.addText(null,this.path.join("/"),null,{width:"70%",maxWidth:"calc(70% - 64px)",minWidth:"164px",disabled:!0,signal:"@on_folder_change",style:{fontWeight:"bolder",fontSize:"16px",color:"#aaa"}}),this.rightPanel.addText(null,"Page "+this.contentPage+" / "+(((this.currentData.length-1)/AssetView.MAX_PAGE_ELEMENTS|0)+1),null,{disabled:!0,signal:"@on_page_change",width:"fit-content"}),this.rightPanel.endLine()),this.content=document.createElement("ul"),this.content.className="lexassetscontent",this.rightPanel.root.appendChild(this.content),this.content.addEventListener("dragenter",function(e){e.preventDefault(),this.classList.add("dragging")}),this.content.addEventListener("dragleave",function(e){e.preventDefault(),this.classList.remove("dragging")}),this.content.addEventListener("drop",e=>{e.preventDefault(),this._processDrop(e)}),this.content.addEventListener("click",function(){this.querySelectorAll(".lexassetitem").forEach(e=>e.classList.remove("selected"))}),this._refreshContent()}_refreshContent(e,t){let i=this.layout==AssetView.LAYOUT_CONTENT;this.filter=t??this.filter??"None",this.searchValue=e??this.searchValue??"",this.content.innerHTML="",this.content.className=i?"lexassetscontent":"lexassetscontent list";let a=this,l=function(e){let t=e.type.charAt(0).toUpperCase()+e.type.slice(1),l=getExtension(e.id),n="Folder"===t,s=document.createElement("li");if(s.className="lexassetitem "+e.type.toLowerCase(),s.tabIndex=-1,a.content.appendChild(s),a.useNativeTitle)s.title=t+": "+e.id;else{let r=document.createElement("span");r.className="lexitemdesc",r.innerHTML="File: "+e.id+"<br>Type: "+t,a.content.appendChild(r),s.addEventListener("mousemove",e=>{if(!i)return;let t=s.getBoundingClientRect(),a=e.target.getBoundingClientRect(),l=r.parentElement.getBoundingClientRect(),n=a.x-l.x-(a.x-t.x),o=a.y-l.y-(a.y-t.y);e.target.classList.contains("lexassettitle")&&(o+=a.y-t.y),r.style.left=n+e.offsetX+12+"px",r.style.top=o+e.offsetY+"px"}),s.addEventListener("mouseenter",()=>{i&&(r.style.display="unset")}),s.addEventListener("mouseleave",()=>{i&&setTimeout(()=>{r.style.display="none"},100)})}if(a.allowMultipleSelection){let o=document.createElement("input");o.type="checkbox",o.className="lexcheckbox",o.checked=e.selected,o.addEventListener("change",(t,i)=>{if(e.selected=!e.selected,a.onevent){let l=new AssetViewEvent(AssetViewEvent.ASSET_CHECKED,t.shiftKey?[e]:e);l.multiple=!!t.shiftKey,a.onevent(l)}t.stopPropagation(),t.stopImmediatePropagation()}),s.appendChild(o)}let d=document.createElement("span");if(d.className="lexassettitle",d.innerText=e.id,s.appendChild(d),!a.skipPreview){let c=null,h=e.src&&(["png","jpg"].indexOf(getExtension(e.src))>-1||e.src.includes("data:image/"));if(h||n||!i){c=document.createElement("img");let u=e.unknown_extension?a.rootPath+"images/file.png":n?a.rootPath+"images/folder.png":e.src;c.src=i||n?u:a.rootPath+"images/file.png",s.appendChild(c)}else{(c=document.createElement("svg")).className="asset-file-preview",s.appendChild(c);let p=document.createElement("text");c.appendChild(p),p.innerText=l&&l!=e.id?"."+l.toUpperCase():e.type.toUpperCase();var m,g=2.5/p.innerText.length;g<1&&(p.style.fontSize=64*g+"px",c.style.paddingTop="calc(50% - "+(.5*p.offsetHeight+10)+"px)")}}if(!n){let f=document.createElement("span");f.className="lexassetinfo",f.innerText=t,s.appendChild(f)}return s.addEventListener("click",function(t){t.stopImmediatePropagation(),t.stopPropagation();let i=t.detail==LX.MOUSE_DOUBLE_CLICK;if(i){if(n){a._enterFolder(e);return}}else t.shiftKey||a.content.querySelectorAll(".lexassetitem").forEach(e=>e.classList.remove("selected")),this.classList.add("selected"),a.selectedItem=e,a.skipPreview||a._previewAsset(e);if(a.onevent){let l=new AssetViewEvent(i?AssetViewEvent.ASSET_DBLCLICKED:AssetViewEvent.ASSET_SELECTED,t.shiftKey?[e]:e);l.multiple=!!t.shiftKey,a.onevent(l)}}),a.contextMenu&&s.addEventListener("contextmenu",function(t){t.preventDefault();let i=a.content.querySelectorAll(".selected").length;LX.addContextMenu(i>1?i+" selected":n?e.id:e.type,t,t=>{i<=1&&t.add("Rename"),n||t.add("Clone",a._cloneItem.bind(a,e)),i<=1&&t.add("Properties"),t.add(""),t.add("Delete",a._deleteItem.bind(a,e))})}),s.addEventListener("dragstart",function(e){e.preventDefault()},!1),s},n=new FileReader,s=this.currentData.filter(e=>("None"==this.filter||e.type.toLowerCase()==this.filter.toLowerCase())&&e.id.toLowerCase().includes(this.searchValue.toLowerCase()));(t||e)&&(this.contentPage=1);let r=(this.contentPage-1)*AssetView.MAX_PAGE_ELEMENTS,o=Math.min(r+AssetView.MAX_PAGE_ELEMENTS,s.length);for(let d=r;d<o;++d){let c=s[d];c.path?LX.request({url:c.path,dataType:"blob",success:i=>{c.bytesize=i.size,n.readAsDataURL(i),n.onload=i=>{c.src=i.currentTarget.result,c._path=c.path,delete c.path,this._refreshContent(e,t)}}}):c.domEl=l(c)}this.allowNextPage=s.length-1>AssetView.MAX_PAGE_ELEMENTS,LX.emit("@on_page_change","Page "+this.contentPage+" / "+(((s.length-1)/AssetView.MAX_PAGE_ELEMENTS|0)+1)),this.onRefreshContent&&this.onRefreshContent(e,t)}_previewAsset(e){let t=e.src&&e.src.includes("data:image/");if(this.previewPanel.clear(),this.previewPanel.branch("Asset"),"image"==e.type||e.src){let i=["png","jpg"].indexOf(getExtension(e.src))>-1||t;i&&this.previewPanel.addImage(e.src,{style:{width:"100%"}})}let a={disabled:!0};this.previewPanel.addText("Filename",e.id,null,a),e.lastModified&&this.previewPanel.addText("Last Modified",new Date(e.lastModified).toLocaleString(),null,a),(e._path||e.src)&&this.previewPanel.addText("URL",e._path?e._path:e.src,null,a),this.previewPanel.addText("Path",this.path.join("/"),null,a),this.previewPanel.addText("Type",e.type,null,a),e.bytesize&&this.previewPanel.addText("Size",(e.bytesize/1024).toPrecision(3)+" KBs",null,a),"folder"==e.type&&this.previewPanel.addText("Files",e.children?e.children.length.toString():"0",null,a),this.previewPanel.addSeparator();let l=[...this.previewActions];for(let n of(l.length||l.push({name:"Download",callback:()=>LX.downloadURL(e.src,e.id)}),l))n.type&&n.type!==e.type||n.path&&n.path!==this.path.join("/")||this.previewPanel.addButton(null,n.name,n.callback.bind(this,e));this.previewPanel.merge()}_processDrop(e){let t=new FileReader,i=e.dataTransfer.files.length;for(let a=0;a<e.dataTransfer.files.length;++a){let l=e.dataTransfer.files[a],n=this.currentData.find(e=>e.id===l.name);n||(t.readAsDataURL(l),t.onload=e=>{let t=l.name.substr(l.name.lastIndexOf(".")+1).toLowerCase(),n={id:l.name,src:e.currentTarget.result,extension:t,lastModified:l.lastModified};switch(t){case"png":case"jpg":n.type="image";break;case"js":case"css":n.type="script";break;case"json":n.type="json";break;case"obj":n.type="mesh";break;default:n.type=t,n.unknown_extension=!0}this.currentData.push(n),a!=i-1||(this._refreshContent(),this.skipBrowser||this.tree.refresh())})}}_sortData(e,t=!1){e=e??this._lastSortBy??"id",this.currentData=this.currentData.sort((i,a)=>{var l=t?a[e].localeCompare(i[e]):i[e].localeCompare(a[e]);return 0==l&&(l=t?a.id.localeCompare(i.id):i.id.localeCompare(a.id)),l}),this._lastSortBy=e,this._refreshContent()}_enterFolder(e){if(this.prevData.push(this.currentData),this.currentData=e.children,this.contentPage=1,this._refreshContent(),this._updatePath(this.currentData),this.onevent){let t=new AssetViewEvent(AssetViewEvent.ENTER_FOLDER,e);this.onevent(t)}}_deleteItem(e){let t=this.currentData.indexOf(e);if(t<0){console.error("[AssetView Error] Cannot delete. Item not found.");return}if(this.currentData.splice(t,1),this._refreshContent(this.searchValue,this.filter),this.onevent){let i=new AssetViewEvent(AssetViewEvent.ASSET_DELETED,e);this.onevent(i)}this.tree.refresh(),this._processData(this.data)}_cloneItem(e){let t=this.currentData.indexOf(e);if(t<0)return;delete e.domEl,delete e.folder;let i=deepCopy(e);if(this.currentData.splice(t,0,i),this._refreshContent(this.searchValue,this.filter),this.onevent){let a=new AssetViewEvent(AssetViewEvent.ASSET_CLONED,e);this.onevent(a)}this._processData(this.data)}}LX.AssetView=AssetView,Object.assign(LX,{request(e){var t=e.dataType||"text";"json"==t?t="text":"xml"==t?t="text":"binary"==t&&(t="arraybuffer",e.mimeType="application/octet-stream");var i=new XMLHttpRequest;i.open(e.data?"POST":"GET",e.url,!0),t&&(i.responseType=t),e.mimeType&&i.overrideMimeType(e.mimeType),e.nocache&&i.setRequestHeader("Cache-Control","no-cache"),i.onload=function(t){var i=this.response;if(200!=this.status){var a="Error "+this.status;e.error&&e.error(a);return}if("json"==e.dataType)try{i=JSON.parse(i)}catch(l){if(e.error)e.error(l);else throw l}else if("xml"==e.dataType)try{i=new DOMParser().parseFromString(i,"text/xml")}catch(n){if(e.error)e.error(n);else throw n}e.success&&e.success.call(this,i,this)},i.onerror=function(t){e.error&&e.error(t)};var a=new FormData;if(e.data)for(var l in e.data)a.append(l,e.data[l]);return i.send(a),i},requestText(e,t,i){return this.request({url:e,dataType:"text",success:t,error:i})},requestJSON(e,t,i){return this.request({url:e,dataType:"json",success:t,error:i})},requestBinary(e,t,i){return this.request({url:e,dataType:"binary",success:t,error:i})},requireScript(e,t,i,a,l){if(!e)throw"invalid URL";e.constructor===String&&(e=[e]);var n=e.length,s=[];for(var r in e){var o=document.createElement("script");o.num=r,o.type="text/javascript",o.src=e[r]+(l?"?version="+l:""),o.original_src=e[r],o.async=!1,o.onload=function(e){n--,s.push(this),n?a&&a(this.original_src,this.num):t&&t(s)},i&&(o.onerror=function(e){i(e,this.original_src,this.num)}),document.getElementsByTagName("head")[0].appendChild(o)}},downloadURL(e,t){let i=new FileReader,a=function(e){var i=document.createElement("a");i.href=e,i.download=t,document.body.appendChild(i),i.click(),document.body.removeChild(i)};e.includes("http")?LX.request({url:e,dataType:"blob",success(e){i.readAsDataURL(e),i.onload=e=>{a(e.currentTarget.result)}}}):a(e)},downloadFile:function(e,t,i){if(!t){console.warn("No file provided to download");return}i||(i=t.constructor===String?"text/plain":"application/octet-stream");var a=null;a=t.constructor!==File&&t.constructor!==Blob?new Blob([t],{type:i}):t;var l=URL.createObjectURL(a),n=document.createElement("a");n.setAttribute("href",l),n.setAttribute("download",e),n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n),setTimeout(function(){URL.revokeObjectURL(l)},6e4)}}),Object.defineProperty(String.prototype,"lastChar",{get:function(){return this[this.length-1]},enumerable:!0,configurable:!0}),Element.prototype.insertChildAtIndex=function(e,t=1/0){t>=this.children.length?this.appendChild(e):this.insertBefore(e,this.children[t])},Element.prototype.hasClass=function(e){return!!(e=[].concat(e)).filter(e=>this.classList.contains(e)).length},Element.prototype.addClass=function(e){e&&this.classList.add(e)},Element.prototype.getComputedSize=function(){let e=getComputedStyle(this);return{width:this.offsetWidth+e.getPropertyValue("marginLeft")+e.getPropertyValue("marginRight"),height:this.offsetHeight+e.getPropertyValue("marginTop")+e.getPropertyValue("marginBottom")}},Element.prototype.getParentArea=function(){let e=this.parentElement;for(;e;){if(e.classList.contains("lexarea"))return e;e=e.parentElement}},LX.ICONS={Sidebar:'<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g id="SVGRepo_iconCarrier"> <g id="Complete"> <g id="sidebar-left"> <g> <rect id="Square-2" data-name="Square" x="3" y="3" width="18" height="18" rx="2" ry="2" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="2"></rect> <line x1="9" y1="21" x2="9" y2="3" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="2"></line> </g> </g> </g> </g></svg>',More:'<svg fill="#000000" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g id="SVGRepo_iconCarrier"> <g id="Complete"> <g id="F-More"> <path id="Vertical" d="M12,16a2,2,0,1,1-2,2A2,2,0,0,1,12,16ZM10,6a2,2,0,1,0,2-2A2,2,0,0,0,10,6Zm0,6a2,2,0,1,0,2-2A2,2,0,0,0,10,12Z"></path> </g> </g> </g></svg>',MoreHorizontal:'<svg fill="#000000" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><g id="SVGRepo_iconCarrier"> <g id="Complete"> <g id="F-More"> <path id="Horizontal" d="M8,12a2,2,0,1,1-2-2A2,2,0,0,1,8,12Zm10-2a2,2,0,1,0,2,2A2,2,0,0,0,18,10Zm-6,0a2,2,0,1,0,2,2A2,2,0,0,0,12,10Z"></path> </g> </g> </g></svg>',MenuArrows:'<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#000000" transform="rotate(90)"><g id="SVGRepo_iconCarrier"> <g id="Complete"> <g id="Code"> <g> <polyline id="Right-2" data-name="Right" points="15.5 7 20.5 12 15.5 17" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></polyline> <polyline id="Left-2" data-name="Left" points="8.5 7 3.5 12 8.5 17" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></polyline> </g> </g> </g> </g></svg>',Plus:'<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#000000"<g id="SVGRepo_iconCarrier"> <g id="Complete"> <g id="add-2" data-name="add"> <g> <line x1="12" y1="19" x2="12" y2="5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></line> <line x1="5" y1="12" x2="19" y2="12" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></line> </g> </g> </g> </g></svg>',Down:'<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#000000"><g id="SVGRepo_iconCarrier"> <title>i</title> <g id="Complete"> <g id="F-Chevron"> <polyline id="Down" points="5 8.5 12 15.5 19 8.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></polyline> </g> </g> </g></svg>',Up:'<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#000000"><g id="SVGRepo_iconCarrier"> <title>i</title> <g id="Complete"> <g id="F-Chevron"> <polyline id="Up" points="5 15.5 12 8.5 19 15.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></polyline> </g> </g> </g></svg>',Right:'<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#000000"><g id="SVGRepo_iconCarrier"> <title>i</title> <g id="Complete"> <g id="F-Chevron"> <polyline id="Right" points="8.5 5 15.5 12 8.5 19" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></polyline> </g> </g> </g></svg>',Left:'<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="#000000"><g id="SVGRepo_iconCarrier"> <title>i</title> <g id="Complete"> <g id="F-Chevron"> <polyline id="Left" points="15.5 5 8.5 12 15.5 19" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"></polyline> </g> </g> </g></svg>'},LX.UTILS={getTime:()=>new Date().getTime(),compareThreshold:(e,t,i,a)=>Math.abs(e-t)>=a||Math.abs(e-i)>=a,compareThresholdRange:(e,t,i,a)=>e>=i&&e<=a||t>=i&&t<=a||e<=i&&t>=a,uidGenerator:simple_guidGenerator,deleteElement(e){e&&e.remove()},flushCss(e){e.offsetHeight},getControlPoints(e,t,i,a,l,n,s){var r=Math.sqrt(Math.pow(i-e,2)+Math.pow(a-t,2)),o=s*r/(r+Math.sqrt(Math.pow(l-i,2)+Math.pow(n-a,2))),d=s-o;return[i+o*(e-l),a+o*(t-n),i-d*(e-l),a-d*(t-n)]},drawSpline(e,t,i){e.save();for(var a=[],l=t.length,n=0;n<l-4;n+=2)a=a.concat(LX.UTILS.getControlPoints(t[n],t[n+1],t[n+2],t[n+3],t[n+4],t[n+5],i));for(var n=2;n<t.length-5;n+=2)e.beginPath(),e.moveTo(t[n],t[n+1]),e.bezierCurveTo(a[2*n-2],a[2*n-1],a[2*n],a[2*n+1],t[n+2],t[n+3]),e.stroke(),e.closePath();e.beginPath(),e.moveTo(t[0],t[1]),e.quadraticCurveTo(a[0],a[1],t[2],t[3]),e.stroke(),e.closePath(),e.beginPath(),e.moveTo(t[l-2],t[l-1]),e.quadraticCurveTo(a[2*l-10],a[2*l-9],t[l-4],t[l-3]),e.stroke(),e.closePath(),e.restore()}};export{LX};