@dynamix-layout/core 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.iife.js CHANGED
@@ -1,4 +1,4 @@
1
- this.dynamix=this.dynamix||{};this.dynamix.layout=this.dynamix.layout||{};this.dynamix.layout.core=(function(y){"use strict";class k{buffer;head=0;tail=0;count=0;capacity;constructor(t=16,e=[]){this.capacity=Math.max(t,e.length),this.buffer=new Array(this.capacity),e.forEach(n=>{this.enqueue(n)})}enqueue(t){this.count===this.capacity&&this.resize(),this.buffer[this.tail]=t,this.tail=(this.tail+1)%this.capacity,this.count++}enqueueFront(t){this.count===this.capacity&&this.resize(),this.head=(this.head-1+this.capacity)%this.capacity,this.buffer[this.head]=t,this.count++}insert(t,e){if(t<0||t>this.count)return!1;if(t===0)return this.enqueueFront(e),!0;if(t===this.count)return this.enqueue(e),!0;this.count===this.capacity&&this.resize();const n=t,i=this.count-t;return n<=i?this.shiftLeft(t,e):this.shiftRight(t,e),this.count++,!0}insertArray(t,e){if(t<0||t>this.count)return!1;if(e.length===0)return!0;if(t===0){for(let r=e.length-1;r>=0;r--)this.enqueueFront(e[r]);return!0}if(t===this.count)return e.forEach(r=>this.enqueue(r)),!0;for(;this.count+e.length>this.capacity;)this.resize();const n=t,i=this.count-t,s=e.length;return n<=i?this.shiftLeftArray(t,e):this.shiftRightArray(t,e),this.count+=s,!0}insertQueue(t,e){if(t<0||t>this.count)return!1;if(e.isEmpty())return!0;const n=e.size();if(t===0){const c=e.toArray();for(let d=c.length-1;d>=0;d--)this.enqueueFront(c[d]);return!0}if(t===this.count){for(const c of e)this.enqueue(c);return!0}for(;this.count+n>this.capacity;)this.resize();const i=e.toArray(),s=t,r=this.count-t;return s<=r?this.shiftLeftArray(t,i):this.shiftRightArray(t,i),this.count+=n,!0}push(t){this.enqueue(t)}unshift(t){this.enqueueFront(t)}dequeue(){if(this.count===0)return;const t=this.buffer[this.head];return this.head=(this.head+1)%this.capacity,this.count--,t}dequeueBack(){if(this.count===0)return;this.tail=(this.tail-1+this.capacity)%this.capacity;const t=this.buffer[this.tail];return this.count--,t}indexOf(t){for(let e=0;e<this.count;e++){const n=(this.head+e)%this.capacity;if(this.buffer[n]===t)return e}return-1}remove(t){const e=this.indexOf(t);return e===-1?!1:(this.removeAt(e),!0)}removeAt(t){if(t<0||t>=this.count)return;if(t===0)return this.dequeue();if(t===this.count-1)return this.dequeueBack();const e=(this.head+t)%this.capacity,n=this.buffer[e],i=t,s=this.count-t-1;return i<=s?this.shiftRightForRemoval(t):this.shiftLeftForRemoval(t),this.count--,n}shift(){return this.dequeue()}pop(){return this.dequeueBack()}fifoAdd(t){this.enqueue(t)}fifoRemove(){return this.dequeue()}filoAdd(t){this.enqueue(t)}filoRemove(){return this.dequeueBack()}lifoAdd(t){this.enqueueFront(t)}lifoRemove(){return this.dequeue()}liloAdd(t){this.enqueueFront(t)}liloRemove(){return this.dequeueBack()}get(t){if(t<0||t>=this.count)return;const e=(this.head+t)%this.capacity;return this.buffer[e]}set(t,e){if(t<0||t>=this.count)return!1;const n=(this.head+t)%this.capacity;return this.buffer[n]=e,!0}peek(){return this.count>0?this.buffer[this.head]:void 0}peekBack(){if(this.count===0)return;const t=(this.tail-1+this.capacity)%this.capacity;return this.buffer[t]}front(){return this.peek()}back(){return this.peekBack()}size(){return this.count}getCapacity(){return this.capacity}isEmpty(){return this.count===0}isFull(){return this.count===this.capacity}clear(){this.head=0,this.tail=0,this.count=0}toArray(){const t=[];for(let e=0;e<this.count;e++){const n=(this.head+e)%this.capacity;t.push(this.buffer[n])}return t}*[Symbol.iterator](){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*forward(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*reverse(){for(let t=this.count-1;t>=0;t--){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*entries(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield[t,this.buffer[e]]}}*keys(){for(let t=0;t<this.count;t++)yield t}*values(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}toString(){return`Queue(${this.toArray().join(", ")})`}resize(){const t=this.capacity*2,e=new Array(t);for(let n=0;n<this.count;n++){const i=(this.head+n)%this.capacity;e[n]=this.buffer[i]}this.buffer=e,this.capacity=t,this.head=0,this.tail=this.count}shiftLeft(t,e){this.head=(this.head-1+this.capacity)%this.capacity;for(let i=0;i<t;i++){const s=(this.head+1+i)%this.capacity,r=(this.head+i)%this.capacity;this.buffer[r]=this.buffer[s]}const n=(this.head+t)%this.capacity;this.buffer[n]=e}shiftRight(t,e){for(let i=this.count-1;i>=t;i--){const s=(this.head+i)%this.capacity,r=(this.head+i+1)%this.capacity;this.buffer[r]=this.buffer[s]}const n=(this.head+t)%this.capacity;this.buffer[n]=e,this.tail=(this.tail+1)%this.capacity}shiftRightForRemoval(t){for(let e=t;e>0;e--){const n=(this.head+e-1)%this.capacity,i=(this.head+e)%this.capacity;this.buffer[i]=this.buffer[n]}this.head=(this.head+1)%this.capacity}shiftLeftForRemoval(t){for(let e=t;e<this.count-1;e++){const n=(this.head+e+1)%this.capacity,i=(this.head+e)%this.capacity;this.buffer[i]=this.buffer[n]}this.tail=(this.tail-1+this.capacity)%this.capacity}shiftLeftArray(t,e){const n=e.length;this.head=(this.head-n+this.capacity)%this.capacity;for(let i=0;i<t;i++){const s=(this.head+n+i)%this.capacity,r=(this.head+i)%this.capacity;this.buffer[r]=this.buffer[s]}for(let i=0;i<n;i++){const s=(this.head+t+i)%this.capacity;this.buffer[s]=e[i]}}shiftRightArray(t,e){const n=e.length;for(let i=this.count-1;i>=t;i--){const s=(this.head+i)%this.capacity,r=(this.head+i+n)%this.capacity;this.buffer[r]=this.buffer[s]}for(let i=0;i<n;i++){const s=(this.head+t+i)%this.capacity;this.buffer[s]=e[i]}this.tail=(this.tail+n)%this.capacity}}function v(o,t=(e,n)=>e===n){let e=o;const n=new Set;let i=[];const s=()=>e,r=(f,m=!1)=>{if(m){e=f;return}t(e,f)||(e=f,n.forEach(p=>p(e)),i.forEach(p=>p(e)),i=[])},c=()=>{n.forEach(f=>f(e)),i.forEach(f=>f(e)),i=[]},d=f=>(n.add(f),()=>n.delete(f)),l=()=>new Promise(f=>{i.push(f)});return{get:s,set:r,onChange:d,nextChange:l,triggerChange:c,onChangePromise:f=>{let m=!0;return(async()=>{for(;m;){const I=await l();if(!m)break;f(I)}})(),()=>{m=!1}}}}function E(o,t){if(o.size!==t.size)return!1;for(const[e,n]of o.entries()){const i=t.get(e);if(!i||!D(n,i))return!1}return!0}function D(o,t){if(o.typNode!==t.typNode||o.nodName!==t.nodName||o.uidNode!==t.uidNode||o.nodPart!==t.nodPart)return!1;const e=o.nodDims,n=t.nodDims;return e.x===n.x&&e.y===n.y&&e.w===n.w&&e.h===n.h}const x=()=>crypto.randomUUID(),A={set:(o,t)=>setTimeout(o,t),clear:o=>clearTimeout(o)},u={createId:x,timer:A,root:void 0,tree:null,minW:40,minH:40,bond:10,inst:null};class a{static cache={dimMins:new Map,mapDirs:new Map,tabCnts:new Map,mapElem:new Map,tabOpts:v(new Map,E),nodOpts:v(new Map,E),bndOpts:v(new Map,E)};kids=new k;dims={w:0,h:0,x:0,y:0};unId;next=null;prev=null;type="row";name="";part=0;host=null;open="";constructor(t={}){const e={type:"row",host:null,name:"",part:100,dims:{w:0,h:0,x:0,y:0},unId:u.createId(),open:""};this.type=t.type??e.type,this.host=t.host??e.host,this.name=t.name??e.name,this.part=t.part??e.part,this.dims=t.dims??e.dims,this.open=t.open??e.open,this.unId=t.unId||e.unId}addBond(t,e=null){if(!e)return;const n=new O(t,this,e);a.cache.mapElem.set(n.unId,n)}getReqDimension(){const t=a.cache.dimMins.get(this.unId),e=a.cache.tabCnts.get(this.unId),n=Math.max(t.minWidth,e.horizontal*u.minW+Math.max(0,e.horizontal-1)*u.bond),i=Math.max(t.minHeight,e.vertical*u.minH+Math.max(0,e.vertical-1)*u.bond);return{width:n,height:i}}calcDimensions(){const t=a.cache.mapDirs.get(this.unId);if(!this.kids)return;let e=0;const n=a.cache.dimMins.get(this.unId)||{minWidth:0,minHeight:0};let i=0;for(const h of this.kids)e+=h.part;if(e===0)return;let s;t?s=this.dims.w-n.minWidth:s=this.dims.h-n.minHeight;const r=s<0,c=this.kids.peekBack();let d=0,l=0;for(const h of this.kids){const f=a.cache.dimMins.get(h.unId)||{minWidth:0,minHeight:0};let m=0;if(!r){d+=h.part;const p=h===c?s:Math.round(s*d/e);m=p-l,l=p}t?(h.dims.w=f.minWidth+m,h.dims.h=this.dims.h,h.dims.x=this.dims.x+i,h.dims.y=this.dims.y,i+=h.dims.w+u.bond):(h.dims.h=f.minHeight+m,h.dims.w=this.dims.w,h.dims.y=this.dims.y+i,h.dims.x=this.dims.x,i+=h.dims.h+u.bond),h.next&&(t?h.next.dims={w:u.bond,h:h.dims.h,x:h.dims.x+h.dims.w,y:h.dims.y}:h.next.dims={w:h.dims.w,h:u.bond,x:h.dims.x,y:h.dims.y+h.dims.h})}}toJSON(){const t=[];for(const n of this.kids)t.push(n.toJSON());const e={typNode:this.type,nodPart:this.part,nodName:this.name,uidNode:this.unId};return this.open&&(e.nodOpen=this.open),t.length>0&&(e.nodKids=t),e}}class O{dims={w:0,h:0,x:0,y:0};unId=u.createId();next=null;prev=null;host=null;constructor(t=null,e=null,n=null){this.host=t,this.next=e,this.prev=n,this.next&&(this.next.prev=this),this.prev&&(this.prev.next=this)}toJSON(){return{nodName:this.host?.name||"",typNode:"bond",uidNode:this.unId,nodPart:0,nodOpen:"",nodKids:[]}}}function*R(o){const t=new k;for(t.enqueue(o);!t.isEmpty();){const e=t.dequeue();if(e&&(yield e,e.nodKids&&e.nodKids.length>0))for(const n of e.nodKids)t.enqueue(n)}}function*q(o){const t=new k;for(t.enqueue(o);!t.isEmpty();){const e=t.dequeue();if(e&&(a.cache.mapElem.set(e.unId,e),yield e,e.kids.size()>0))for(const n of e.kids)t.enqueue(n)}}function*H(o,t){for(const e of t.kids)yield*o.NodeLayoutRecursiveIterator(e);yield t}function B(o,t){const e=a.cache.mapDirs.get(t.unId);if(e===void 0){console.warn(`Cannot update child directions for node ${t.unId}; its own direction is not set.`);return}for(const n of t.kids)a.cache.mapDirs.set(n.unId,!e),n.kids.size()>0&&(n.host=t,o.updateChildDirections(n),n.next&&a.cache.mapDirs.set(n.next.unId,!e))}function M(o,t=u.tree){if(!t)return;const e=o.JSONLayoutIterator(t),n=o.NodeLayoutIterator(u.root);for(a.cache.mapDirs.set(u.root.unId,!0);;){const i=e.next(),s=n.next();if(i.done||s.done)break;const r=i.value,c=s.value;!r||!c||o.createNodeTreeFromJSONTree(r,c)}o.calcTabsetCountAndMinDim()}function C(o,t,e){const n=a.cache.mapDirs.get(e.unId);for(const i of t.nodKids||[]){const s=o.createNodeFromJSON(i),r=e.kids.peekBack();s.host=e,s.addBond(s.host,r),e.kids.enqueue(s),a.cache.mapDirs.set(s.unId,!n)}e.type==="tabset"&&a.cache.mapElem.set(e.unId,e),e.type==="tab"&&a.cache.mapElem.set(e.unId,e)}function F(o,t,e=u.root){const n=new k;for(n.enqueue(e),a.cache.mapDirs.set(u.root.unId,!0);!t.isEmpty();){const i=n.dequeue();if(!i)break;const s=a.cache.mapDirs.get(i.unId);if(t.size()==2){const h=t.dequeue(),f=t.dequeue(),m=new a({type:"tabset",host:i}),p=new a({type:"tabset",host:i}),I=new a({type:"tab",host:m,name:h,unId:o.tabsIds.get(h??"")??u.createId()}),N=new a({type:"tab",host:p,name:f,unId:o.tabsIds.get(f??"")??u.createId()});m.open=I.name,p.open=N.name,m.kids.enqueue(I),p.kids.enqueue(N),i.kids.enqueue(m),i.kids.enqueue(p),p.addBond(i,m),a.cache.mapDirs.set(m.unId,!s),a.cache.mapDirs.set(p.unId,!s),a.cache.mapElem.set(m.unId,m),a.cache.mapElem.set(p.unId,p),a.cache.mapDirs.set(I.unId,s),a.cache.mapDirs.set(N.unId,s),a.cache.mapElem.set(I.unId,I),a.cache.mapElem.set(N.unId,N);break}const r=t.dequeue(),c=new a({type:"tabset",host:i}),d=new a({type:"row",host:i}),l=new a({type:"tab",host:c,name:r,unId:o.tabsIds.get(r??"")??u.createId()});c.open=l.name,c.kids.enqueue(l),i.kids.enqueue(c),i.kids.enqueue(d),d.addBond(i,c),a.cache.mapDirs.set(c.unId,!s),a.cache.mapDirs.set(d.unId,!s),a.cache.mapElem.set(c.unId,c),a.cache.mapDirs.set(l.unId,s),a.cache.mapElem.set(l.unId,l),n.enqueue(d)}o.calcTabsetCountAndMinDim()}function W(o,t){const e=new a({type:t.typNode,name:t.nodName,unId:t.uidNode,part:t.nodPart,dims:{w:0,h:0,x:0,y:0},open:typeof t.nodOpen=="string"?t.nodOpen:""});return t.typNode==="tab"&&(e.unId=o.tabsIds.get(t.nodName)||t.uidNode),e}function L(o,t=u.root,e=!0){t===u.root&&e&&(a.cache.tabCnts.clear(),a.cache.dimMins.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear());for(const n of o.NodeLayoutRecursiveIterator(t)){const i=a.cache.tabCnts,s=a.cache.dimMins;a.cache.mapElem.set(n.unId,n);const r=i.set(n.unId,{horizontal:0,vertical:0}).get(n.unId),c=s.set(n.unId,{minWidth:0,minHeight:0}).get(n.unId),d=a.cache.mapDirs.get(n.unId);if(n.type==="tab"&&(a.cache.mapElem.set(n.unId,n),s.set(n.unId,{minWidth:0,minHeight:0})),n.next&&a.cache.mapElem.set(n.next.unId,n.next),n.type==="tabset"&&(a.cache.mapElem.set(n.unId,n),s.set(n.unId,{minWidth:u.minW,minHeight:u.minH}),d?i.set(n.unId,{horizontal:0,vertical:1}):i.set(n.unId,{horizontal:1,vertical:0})),n.type==="row"){for(const l of n.kids){const h=i.get(l.unId),f=s.get(l.unId);h&&(r.horizontal+=h.horizontal,r.vertical+=h.vertical,d?(c.minHeight=Math.max(c.minHeight,f.minHeight),c.minWidth+=f.minWidth):(c.minHeight+=f.minHeight,c.minWidth=Math.max(c.minWidth,f.minWidth)))}d?c.minWidth+=(n.kids.size()-1)*u.bond:c.minHeight+=(n.kids.size()-1)*u.bond}}t===u.root&&e&&o.pruneStaleDirections()}function P(){for(const o of a.cache.mapDirs.keys())a.cache.mapElem.has(o)||a.cache.mapDirs.delete(o)}function z(){const o=u.root.getReqDimension();let t=!1,e=u.root.dims.w,n=u.root.dims.h;return u.root.dims.w<o.width&&(e=o.width,t=!0),u.root.dims.h<o.height&&(n=o.height,t=!0),t&&(u.root.dims.w=e,u.root.dims.h=n),{adjustedW:e,adjustedH:n,wasAdjusted:t}}function K(o,t=u.root,e=!1){const n=t===u.root,i=d=>n?new Map:new Map(d.get()),s=i(a.cache.nodOpts),r=i(a.cache.bndOpts),c=i(a.cache.tabOpts);n&&o.calculateRootAdjustment();for(const d of o.NodeLayoutIterator(t)){d.calcDimensions();const l=a.cache.mapDirs.get(d.unId);if(d.type==="tabset"){const h={typNode:d.type,nodName:d.name,uidNode:d.unId,nodPart:d.part,nodOpen:d.open,nodeDir:l,nodKids:Array.from(d.kids).map(f=>{const m={typNode:f.type,nodName:f.name,uidNode:f.unId,nodPart:f.part,nodOpen:d.open===f.name,nodeDir:!l,nodDims:{...d.dims}};return c.set(f.unId,m),m}),nodDims:{...d.dims}};s.set(d.unId,h)}if(d.next&&d.type!=="tab"){const h={typNode:"bond",nodName:d.name,uidNode:d.next.unId,nodeDir:l,nodPart:0,nodDims:{...d.next.dims}};r.set(d.next.unId,h)}}a.cache.nodOpts.set(s,e),a.cache.bndOpts.set(r,e),a.cache.tabOpts.set(c,e)}function U(o,t,e=!1,n=2){if(u.root.dims=t,e){o.calcDimensions(u.root);return}o.cntdown&&(u.timer.clear(o.cntdown),o.cntdown=null),o.cntdown=u.timer.set(()=>{o.cntdown=null,o.calcDimensions()},n)}function $(o,t,e,n=!1,i=2){if(n){o.updateSliderDimension(t,e);return}o.cntdown&&(u.timer.clear(o.cntdown),o.cntdown=null),o.cntdown=u.timer.set(()=>{o.cntdown=null,o.updateSliderDimension(t,e)},i)}function _(o,t,e){const n=a.cache.mapElem.get(t);if(!n||!(n instanceof O)){console.warn(`Bond with id ${t} not found or is not a Bond instance`);return}const i=a.cache.mapDirs.get(n.host.unId),s=n.prev,r=n.next,c=n.host;if(!s||!r||!c){console.warn("Missing prev, next, or host node",s,r,c);return}const d=a.cache.dimMins.get(s.unId)||{minWidth:0,minHeight:0},l=a.cache.dimMins.get(r.unId)||{minWidth:0,minHeight:0},h=u.bond/2;if(i){const f=r.dims.x+r.dims.w,m=s.dims.x+d.minWidth+h,p=f-l.minWidth-h,I=Math.max(m,Math.min(p,e.x));n.dims.x=I-h,s.dims.w=n.dims.x-s.dims.x,r.dims.x=I+h,r.dims.w=f-r.dims.x;const N=Math.max(0,s.dims.w-d.minWidth),T=Math.max(0,r.dims.w-l.minWidth),g=N+T,b=s.part+r.part;g>0?(s.part=N/g*b,r.part=T/g*b):(s.part=b/2,r.part=b/2)}else{const f=r.dims.y+r.dims.h,m=s.dims.y+d.minHeight+h,p=f-l.minHeight-h,I=Math.max(m,Math.min(p,e.y));n.dims.y=I-h,s.dims.h=n.dims.y-s.dims.y,r.dims.y=I+h,r.dims.h=f-r.dims.y;const N=Math.max(0,s.dims.h-d.minHeight),T=Math.max(0,r.dims.h-l.minHeight),g=N+T,b=s.part+r.part;g>0?(s.part=N/g*b,r.part=T/g*b):(s.part=b/2,r.part=b/2)}o.calcDimensions(c)}function Y(o,t,e,n){const i=a.cache.mapElem.get(t);let s=a.cache.mapElem.get(e);return!i||!(i instanceof a)||!s||!(s instanceof a)?(console.warn(`Source node ${t} not found or is not a Node instance`),!1):i?.type=="tab"&&i.host===s&&s.kids.size()<2?(console.warn("Cannot move to self as it has only one tab"),!1):i?.type=="tabset"&&s?.host===i?(console.warn("Cannot move tabset to self as it is already a child"),!1):!i||!s?(console.warn(`Source or destination node not found: ${t}, ${e}`),!1):i===s?(console.warn("Source and destination nodes are the same, no action taken."),!1):!i.host||!s.host&&s.type!=="row"?(console.warn(`Source node or destination node's host is null: ${i.unId}, ${s.unId}`),!1):s.type==="row"&&s!==u.root?(console.warn(`Cannot move relative to a nested row: ${s.unId}`),!1):s.type==="row"&&n==="contain"?(console.warn(`Cannot move to a row with 'contain' layout: ${s.unId}`),!1):i.type==="row"||(s.type==="tabset"&&n==="contain"&&(s=s.kids.peekBack()||s),i===s)?!1:o.isOnlyContent(i)?(console.warn("Cannot move the only tabset or tab in the layout"),!1):(s.type==="tab"&&(n==="contain"||n==="left"||n==="right")?o.moveNodeAsTab(i,s,n):s.type==="row"&&n!=="contain"?o.moveRelativeToRoot(i,s,n):s.type==="tabset"&&n!=="contain"&&o.moveRelativeToTabset(i,s,n),o.calcTabsetCountAndMinDim(),o.calcDimensions(u.root,!0),!0)}function G(o,t){let e=0;for(const n of o.NodeLayoutRecursiveIterator(u.root))n.type==="tabset"&&e++;return e!==1?!1:t.type==="tabset"||t.type==="tab"&&t.host?.kids.size()===1}function J(o,t,e,n){if(!e||!e.host){console.warn(`Destination node ${e.unId} has no host, cannot move.`);return}o.removeNode(t);const i=e.host,s=i.kids.indexOf(e);if(s===void 0||s===-1)return;const r=n==="contain"||n==="left",c=r?s:s+1,d=i.kids.get(c+1),l=i.kids.get(c-1),h=e.next,f=e.prev;if(!r&&h?a.cache.mapElem.delete(h.unId):r&&f&&a.cache.mapElem.delete(f.unId),t.type=="tab")r?(l&&t.addBond(i,l),e.addBond(i,t)):(t.addBond(i,e),d&&d.addBond(i,t)),i.kids.insert(c,t),t.host=i,i.open=t.name;else if(t.type=="tabset"){const m=t.kids.peek(),p=t.kids.peekBack();r?(m&&l&&m.addBond(i,l),p&&e&&e.addBond(i,p)):(m&&e&&m.addBond(i,e),p&&d&&d.addBond(i,p)),i.kids.insertQueue(c,t.kids);for(const I of t.kids)I.host=i,I.next&&(I.next.host=i);i.open=p?p.name:""}o.updateChildDirections(i)}const Q={root:(o,t)=>o===t,tabset:(o,t)=>o!==t};function S(o,t,e,n,i){if(o.removeNode(t),t.type!=="tab"&&t.type!=="tabset")return;const s=a.cache.mapDirs.get(e.unId)===!1,r=n==="left"||n==="right",c=n==="top"||n==="left";let d=t;t.type==="tab"&&(d=new a({type:"tabset",host:e.host}),d.kids.enqueue(t),d.open=t.name,t.host=d),Q[i](s,r)?o.insertNodeWithNewParent(d,e,c):o.insertNode(e,d,c)}function j(o,t,e,n){S(o,t,e,n,"root")}function X(o,t,e,n){S(o,t,e,n,"tabset")}function V(o,t,e,n){const i=t.host;if(t==u.root){const f=u.root.kids.peek(),m=u.root.kids.peekBack();n?(u.root.kids.enqueueFront(e),f&&f.addBond(u.root,e)):(u.root.kids.enqueue(e),m&&e.addBond(u.root,m)),e.host=u.root,o.updateChildDirections(u.root);return}if(!i){console.warn(`Destination node ${t.unId} has no host, cannot insert.`);return}const s=i.kids.indexOf(t);if(s===-1){console.warn(`Destination node ${t.unId} not found in its host's kids.`);return}const r=a.cache.mapDirs.get(i.unId);r&&a.cache.mapDirs.set(e.unId,!r);const c=i.kids.get(s+1),d=i.kids.get(s-1),l=t.next,h=t.prev;e.host=i,n?(i.kids.insert(s,e),t.addBond(i,e),d&&e.addBond(i,d),h&&a.cache.mapElem.delete(h.unId)):(i.kids.insert(s+1,e),e.addBond(i,t),c&&c.addBond(i,e),l&&a.cache.mapElem.delete(l.unId)),o.updateChildDirections(i)}function Z(o,t,e,n){const i=new k,s=new a({type:"tabset",host:e.host});if(!e||!t){console.warn(`Destination node ${e.unId} has no host, cannot insert.`);return}if(e===u.root){const c=new a({type:"row",host:e});if(e.kids.size()===0)e.kids.enqueue(t),t.host=e;else if(e.kids.size()==1&&e.kids.peek()?.type==="tabset"){const d=e.kids.dequeue();if(!d){console.warn(`No kid found in destination node ${e.unId}, cannot insert.`);return}n?(c.kids.enqueue(t),c.kids.enqueue(d),e.kids.enqueue(c),d.addBond(c,t)):(c.kids.enqueue(d),c.kids.enqueue(t),t.addBond(c,d),e.kids.enqueue(c)),t.host=c,d.host=c}else if(e.kids.size()==1&&e.kids.peek()?.type==="row"){const d=e.kids.peek(),l=d?.kids.peek(),h=d?.kids.peekBack();n&&d?(d.kids.enqueueFront(t),l&&l.addBond(d,t)):d&&(d.kids.enqueue(t),h&&t.addBond(d,h)),t.host=d}else if(e.kids.size()>1){const d=new a({type:"row",host:e}),l=new a({type:"row",host:d});for(const h of e.kids)l.kids.enqueue(h),h.host=l,h.next&&(h.next.host=l);t.host=d,e.kids.clear(),n?(d.kids.enqueueFront(t),d.kids.enqueue(l),l.addBond(d,t)):(d.kids.enqueue(l),d.kids.enqueue(t),t.addBond(d,l)),e.kids.enqueue(d)}o.updateChildDirections(e);return}t.host=e,s.host=e,s.kids=e.kids,s.open=e.open;const r=a.cache.mapDirs.get(e.unId);for(const c of s.kids)c.host=s,c.next&&(c.next.host=s),a.cache.mapDirs.set(c.unId,r);for(const c of t.kids)c.host=t,c.next&&(c.next.host=t),a.cache.mapDirs.set(c.unId,r);a.cache.mapDirs.set(s.unId,!r),a.cache.mapDirs.set(t.unId,!r),n?(i.enqueue(t),i.enqueue(s),e.kids=i,e.type="row",s.addBond(e,t)):(i.enqueue(s),i.enqueue(t),e.kids=i,e.type="row",t.addBond(e,s))}function tt(o,t){if(!t.host||!t.host.host){console.warn(`Source node ${t.unId} has no host, cannot move.`);return}const e=t.host,n=t.host.host,i=n.kids.indexOf(e),s=n.kids.get(i-1),r=n.kids.get(i+1),c=t.kids.peek(),d=t.kids.peekBack();o.removeKid(e);let l=i;if(t.type=="row"&&e){s&&c&&c.addBond(n,s),r&&d&&r.addBond(n,d);for(const h of t.kids)h.host=n,h.next&&(h.next.host=n),n.kids.insert(l,h),a.cache.mapDirs.set(h.unId,!a.cache.mapDirs.get(n.unId)),a.cache.dimMins.delete(h.unId),l++}else if(t.type=="tabset"){s&&t.addBond(n,s),r&&r.addBond(n,t),n.kids.insert(l,t),t.host=n,a.cache.mapDirs.set(t.unId,!a.cache.mapDirs.get(n.unId));for(const h of t.kids)a.cache.mapDirs.set(h.unId,a.cache.mapDirs.get(n.unId)),a.cache.dimMins.delete(h.unId)}}function et(o,t=!0){const e=o.host,n=o.prev,i=o.next;if(o.host=null,o.next=null,o.prev=null,n&&(n.next=null),i&&(i.prev=null),!t)return o;n&&i&&n.prev&&i.next?n.prev.addBond(e,i.next):n&&n.prev?n.prev.next=null:i&&i.next&&(i.next.prev=null)}function nt(o,t){if(!t.host){console.warn("Kid node has no host, cannot remove.");return}const e=t?.host,n=e?.host;if(o.removeKid(t),t.type==="tabset"&&e.kids.size()===1){const i=e.kids.peek();i&&o.moveAdjacentNodeToGrandParent(i)}else if(t.type==="tab"&&e.kids.size()===0&&n.kids.size()===2){o.removeKid(e);const i=n?.kids.peek();i&&o.moveAdjacentNodeToGrandParent(i)}else if(t.type==="tab"&&e.kids.size()===0&&n.kids.size()>2)o.removeKid(e);else if(t.type==="tab"&&e.open===t.name&&e.kids.size()>0){const i=e.kids.peek();i&&(e.open=i.name)}}function it(o){if(!o.host){console.warn("Kid node has no host, cannot remove.");return}const t=o.host,e=t.kids.indexOf(o),n=t.kids.get(e+1),i=t.kids.get(e-1),s=o.next,r=o.prev;if(e===-1){console.warn("Kid node not found in its host's kids.");return}s&&a.cache.mapElem.delete(s.unId),r&&a.cache.mapElem.delete(r.unId),n&&i?n.addBond(t,i):n?n.prev=null:i&&(i.next=null),t.kids.removeAt(e),a.cache.mapElem.delete(o.unId),a.cache.dimMins.delete(o.unId),a.cache.mapDirs.delete(o.unId),a.cache.tabCnts.delete(o.unId),o.type==="tabset"&&a.cache.mapElem.delete(o.unId),o.type==="tab"&&a.cache.mapElem.delete(o.unId),o.host=null,o.next=null,o.prev=null}function ot(){a.cache.dimMins.clear(),a.cache.mapDirs.clear(),a.cache.tabCnts.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear()}class w{static get _root(){return u.root}static set _root(t){u.root=t}static get _tree(){return u.tree}static set _tree(t){u.tree=t}static get _minW(){return u.minW}static set _minW(t){u.minW=t}static get _minH(){return u.minH}static set _minH(t){u.minH=t}static get _bond(){return u.bond}static set _bond(t){u.bond=t}static get _inst(){return u.inst}static set _inst(t){u.inst=t}nodeOps;cntdown=null;tabsIds=new Map;constructor(t={}){const e={tabs:[],tree:null,minW:40,minH:40,bond:10,uqid:"dynamix-layout-root",tabsIds:new Map,...t};this.tabsIds=e.tabsIds,u.createId=e.createId??x,u.timer=e.timer??A,w._tree=e.tree??null,w._root=new a({unId:e.uqid,name:e.uqid,type:"row"}),this.nodeOps=v(new Map,E),w._minW=e.minW,w._minH=e.minH,w._bond=e.bond;const n=new k(e.tabs.length,e.tabs);w._tree?this.createNodeLayout():this.createBinaryNodeTreeFromQueue(n),w._inst=this}*JSONLayoutIterator(t){yield*R(t)}*NodeLayoutIterator(t){yield*q(t)}*NodeLayoutRecursiveIterator(t){yield*H(this,t)}updateChildDirections(t){return B(this,t)}createNodeLayout(t=w._tree){return M(this,t)}createNodeTreeFromJSONTree(t,e){return C(this,t,e)}createBinaryNodeTreeFromQueue(t,e=w._root){return F(this,t,e)}createNodeFromJSON(t){return W(this,t)}calcTabsetCountAndMinDim(t=w._root,e=!0){return L(this,t,e)}pruneStaleDirections(){return P()}calculateRootAdjustment(){return z()}calcDimensions(t=w._root,e=!1){return K(this,t,e)}updateDimension(t,e=!1,n=2){return U(this,t,e,n)}updateSlider(t,e,n=!1,i=2){return $(this,t,e,n,i)}updateSliderDimension(t,e){return _(this,t,e)}updateTree(t,e,n){return Y(this,t,e,n)}isOnlyContent(t){return G(this,t)}moveNodeAsTab(t,e,n){return J(this,t,e,n)}moveRelativeToRoot(t,e,n){return j(this,t,e,n)}moveRelativeToTabset(t,e,n){return X(this,t,e,n)}insertNode(t,e,n){return V(this,t,e,n)}insertNodeWithNewParent(t,e,n){return Z(this,t,e,n)}moveAdjacentNodeToGrandParent(t){return tt(this,t)}removeRelation(t,e=!0){return et(t,e)}removeNode(t){return nt(this,t)}removeKid(t){return it(t)}clearAllCache(){return ot()}}const st=6;function at(o,t,e){const{left:n,top:i,width:s,height:r}=o,c=t-n,d=e-i;return c<s/3?{area:"left",left:n,top:i,width:s/2,height:r}:c>2*s/3?{area:"right",left:n+s/2,top:i,width:s/2,height:r}:d<r/3?{area:"top",left:n,top:i,width:s,height:r/2}:d>2*r/3?{area:"bottom",left:n,top:i+r/2,width:s,height:r/2}:{area:"contain",left:n+s*.1,top:i+r*.1,width:s*.8,height:r*.8}}function rt(o,t){const{x:e,y:n,w:i,h:s}=o;switch(t){case"left":return{area:t,left:e,top:n,width:i/2,height:s};case"right":return{area:t,left:e+i/2,top:n,width:i/2,height:s};case"top":return{area:t,left:e,top:n,width:i,height:s/2};case"bottom":return{area:t,left:e,top:n+s/2,width:i,height:s/2}}}function dt(o,t,e,n){if(t.length===0||n<o.top||n>o.bottom)return null;const i=t[0],s=t[t.length-1];let r=st;if(e>s.right)return{index:t.length-1,area:"right",left:s.right+1,top:s.top,width:r-2,height:s.height};if(e<i.left)return{index:0,area:"left",left:i.left-r+1,top:i.top,width:r-2,height:i.height};let c=0,d=1/0,l=!1;t.forEach((m,p)=>{const I=m.left+m.width/2,N=Math.abs(e-I);N<d&&(d=N,c=p,l=e<I)});const h=l?c>0:c<t.length-1;t.length>1&&h&&(r=t[1].left-i.right);const f=t[c];return{index:c,area:l?"left":"right",left:l?f.left-r+1:f.right+1,top:f.top,width:r-2,height:f.height}}function ct(o,t){return o.area===t.area&&o.left===t.left&&o.top===t.top&&o.width===t.width&&o.height===t.height}function ht(o,{x:t,y:e,w:n,h:i}){o.style.left=`${t}px`,o.style.top=`${e}px`,o.style.width=`${n}px`,o.style.height=`${i}px`}function ut(o,t){return{x:o.x,y:o.y+t,w:o.w,h:Math.max(0,o.h-t)}}function lt(o){let t=null,e=null;const n=()=>{e=null;const i=t;t=null,i&&o(i.value)};return{schedule(i){t={value:i},e===null&&(e=requestAnimationFrame(n))},flush(){e!==null&&(cancelAnimationFrame(e),n())},cancel(){e!==null&&cancelAnimationFrame(e),e=null,t=null}}}return(()=>{if(typeof window>"u")return;const o="color: #03A9F4; font-weight: bold; line-height: 1.2;",t="color: #E0E0E0; font-size: 12px;",e="color: #42a5f5; font-size: 12px;",n="color: #9E9E9E; font-size: 10px;",i=`
1
+ this.dynamix=this.dynamix||{};this.dynamix.layout=this.dynamix.layout||{};this.dynamix.layout.core=(function(y){"use strict";class x{buffer;head=0;tail=0;count=0;capacity;constructor(t=16,e=[]){this.capacity=Math.max(t,e.length),this.buffer=new Array(this.capacity),e.forEach(n=>{this.enqueue(n)})}enqueue(t){this.count===this.capacity&&this.resize(),this.buffer[this.tail]=t,this.tail=(this.tail+1)%this.capacity,this.count++}enqueueFront(t){this.count===this.capacity&&this.resize(),this.head=(this.head-1+this.capacity)%this.capacity,this.buffer[this.head]=t,this.count++}insert(t,e){if(t<0||t>this.count)return!1;if(t===0)return this.enqueueFront(e),!0;if(t===this.count)return this.enqueue(e),!0;this.count===this.capacity&&this.resize();const n=t,i=this.count-t;return n<=i?this.shiftLeft(t,e):this.shiftRight(t,e),this.count++,!0}insertArray(t,e){if(t<0||t>this.count)return!1;if(e.length===0)return!0;if(t===0){for(let r=e.length-1;r>=0;r--)this.enqueueFront(e[r]);return!0}if(t===this.count)return e.forEach(r=>this.enqueue(r)),!0;for(;this.count+e.length>this.capacity;)this.resize();const n=t,i=this.count-t,s=e.length;return n<=i?this.shiftLeftArray(t,e):this.shiftRightArray(t,e),this.count+=s,!0}insertQueue(t,e){if(t<0||t>this.count)return!1;if(e.isEmpty())return!0;const n=e.size();if(t===0){const h=e.toArray();for(let u=h.length-1;u>=0;u--)this.enqueueFront(h[u]);return!0}if(t===this.count){for(const h of e)this.enqueue(h);return!0}for(;this.count+n>this.capacity;)this.resize();const i=e.toArray(),s=t,r=this.count-t;return s<=r?this.shiftLeftArray(t,i):this.shiftRightArray(t,i),this.count+=n,!0}push(t){this.enqueue(t)}unshift(t){this.enqueueFront(t)}dequeue(){if(this.count===0)return;const t=this.buffer[this.head];return this.head=(this.head+1)%this.capacity,this.count--,t}dequeueBack(){if(this.count===0)return;this.tail=(this.tail-1+this.capacity)%this.capacity;const t=this.buffer[this.tail];return this.count--,t}indexOf(t){for(let e=0;e<this.count;e++){const n=(this.head+e)%this.capacity;if(this.buffer[n]===t)return e}return-1}remove(t){const e=this.indexOf(t);return e===-1?!1:(this.removeAt(e),!0)}removeAt(t){if(t<0||t>=this.count)return;if(t===0)return this.dequeue();if(t===this.count-1)return this.dequeueBack();const e=(this.head+t)%this.capacity,n=this.buffer[e],i=t,s=this.count-t-1;return i<=s?this.shiftRightForRemoval(t):this.shiftLeftForRemoval(t),this.count--,n}shift(){return this.dequeue()}pop(){return this.dequeueBack()}fifoAdd(t){this.enqueue(t)}fifoRemove(){return this.dequeue()}filoAdd(t){this.enqueue(t)}filoRemove(){return this.dequeueBack()}lifoAdd(t){this.enqueueFront(t)}lifoRemove(){return this.dequeue()}liloAdd(t){this.enqueueFront(t)}liloRemove(){return this.dequeueBack()}get(t){if(t<0||t>=this.count)return;const e=(this.head+t)%this.capacity;return this.buffer[e]}set(t,e){if(t<0||t>=this.count)return!1;const n=(this.head+t)%this.capacity;return this.buffer[n]=e,!0}peek(){return this.count>0?this.buffer[this.head]:void 0}peekBack(){if(this.count===0)return;const t=(this.tail-1+this.capacity)%this.capacity;return this.buffer[t]}front(){return this.peek()}back(){return this.peekBack()}size(){return this.count}getCapacity(){return this.capacity}isEmpty(){return this.count===0}isFull(){return this.count===this.capacity}clear(){this.head=0,this.tail=0,this.count=0}toArray(){const t=[];for(let e=0;e<this.count;e++){const n=(this.head+e)%this.capacity;t.push(this.buffer[n])}return t}*[Symbol.iterator](){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*forward(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*reverse(){for(let t=this.count-1;t>=0;t--){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*entries(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield[t,this.buffer[e]]}}*keys(){for(let t=0;t<this.count;t++)yield t}*values(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}toString(){return`Queue(${this.toArray().join(", ")})`}resize(){const t=this.capacity*2,e=new Array(t);for(let n=0;n<this.count;n++){const i=(this.head+n)%this.capacity;e[n]=this.buffer[i]}this.buffer=e,this.capacity=t,this.head=0,this.tail=this.count}shiftLeft(t,e){this.head=(this.head-1+this.capacity)%this.capacity;for(let i=0;i<t;i++){const s=(this.head+1+i)%this.capacity,r=(this.head+i)%this.capacity;this.buffer[r]=this.buffer[s]}const n=(this.head+t)%this.capacity;this.buffer[n]=e}shiftRight(t,e){for(let i=this.count-1;i>=t;i--){const s=(this.head+i)%this.capacity,r=(this.head+i+1)%this.capacity;this.buffer[r]=this.buffer[s]}const n=(this.head+t)%this.capacity;this.buffer[n]=e,this.tail=(this.tail+1)%this.capacity}shiftRightForRemoval(t){for(let e=t;e>0;e--){const n=(this.head+e-1)%this.capacity,i=(this.head+e)%this.capacity;this.buffer[i]=this.buffer[n]}this.head=(this.head+1)%this.capacity}shiftLeftForRemoval(t){for(let e=t;e<this.count-1;e++){const n=(this.head+e+1)%this.capacity,i=(this.head+e)%this.capacity;this.buffer[i]=this.buffer[n]}this.tail=(this.tail-1+this.capacity)%this.capacity}shiftLeftArray(t,e){const n=e.length;this.head=(this.head-n+this.capacity)%this.capacity;for(let i=0;i<t;i++){const s=(this.head+n+i)%this.capacity,r=(this.head+i)%this.capacity;this.buffer[r]=this.buffer[s]}for(let i=0;i<n;i++){const s=(this.head+t+i)%this.capacity;this.buffer[s]=e[i]}}shiftRightArray(t,e){const n=e.length;for(let i=this.count-1;i>=t;i--){const s=(this.head+i)%this.capacity,r=(this.head+i+n)%this.capacity;this.buffer[r]=this.buffer[s]}for(let i=0;i<n;i++){const s=(this.head+t+i)%this.capacity;this.buffer[s]=e[i]}this.tail=(this.tail+n)%this.capacity}}function T(o,t=(e,n)=>e===n){let e=o;const n=new Set;let i=[];const s=()=>e,r=(l,m=!1)=>{if(m){e=l;return}t(e,l)||(e=l,n.forEach(p=>p(e)),i.forEach(p=>p(e)),i=[])},h=()=>{n.forEach(l=>l(e)),i.forEach(l=>l(e)),i=[]},u=l=>(n.add(l),()=>n.delete(l)),f=()=>new Promise(l=>{i.push(l)});return{get:s,set:r,onChange:u,nextChange:f,triggerChange:h,onChangePromise:l=>{let m=!0;return(async()=>{for(;m;){const I=await f();if(!m)break;l(I)}})(),()=>{m=!1}}}}function v(o,t){if(o.size!==t.size)return!1;for(const[e,n]of o.entries()){const i=t.get(e);if(!i||!A(n,i))return!1}return!0}function A(o,t){if(o.typNode!==t.typNode||o.nodName!==t.nodName||o.uidNode!==t.uidNode||o.nodPart!==t.nodPart||o.nodFold!==t.nodFold||o.nodMaxd!==t.nodMaxd||o.nodHidden!==t.nodHidden||o.nodLocked!==t.nodLocked)return!1;const e=o.nodDims,n=t.nodDims;return e.x===n.x&&e.y===n.y&&e.w===n.w&&e.h===n.h}const S=()=>crypto.randomUUID(),R={set:(o,t)=>setTimeout(o,t),clear:o=>clearTimeout(o)},c={createId:S,timer:R,root:void 0,tree:null,minW:40,minH:40,bond:10,inst:null,maximized:null,collapsedSize:40,foldSeq:0};class a{static cache={dimMins:new Map,mapDirs:new Map,tabCnts:new Map,mapElem:new Map,tabOpts:T(new Map,v),nodOpts:T(new Map,v),bndOpts:T(new Map,v)};kids=new x;dims={w:0,h:0,x:0,y:0};unId;next=null;prev=null;type="row";name="";part=0;host=null;open="";collapsed=!1;foldedAt=0;constructor(t={}){const e={type:"row",host:null,name:"",part:100,dims:{w:0,h:0,x:0,y:0},unId:c.createId(),open:""};this.type=t.type??e.type,this.host=t.host??e.host,this.name=t.name??e.name,this.part=t.part??e.part,this.dims=t.dims??e.dims,this.open=t.open??e.open,this.unId=t.unId||e.unId}addBond(t,e=null){if(!e)return;const n=new D(t,this,e);a.cache.mapElem.set(n.unId,n)}getReqDimension(){const t=a.cache.dimMins.get(this.unId),e=a.cache.tabCnts.get(this.unId),n=Math.max(t.minWidth,e.horizontal*c.minW+Math.max(0,e.horizontal-1)*c.bond),i=Math.max(t.minHeight,e.vertical*c.minH+Math.max(0,e.vertical-1)*c.bond);return{width:n,height:i}}calcDimensions(){const t=a.cache.mapDirs.get(this.unId);if(!this.kids)return;let e=0;const n=a.cache.dimMins.get(this.unId)||{minWidth:0,minHeight:0};let i=0,s;for(const d of this.kids)d.collapsed||(e+=d.part,s=d);if(e===0)return;let r;t?r=this.dims.w-n.minWidth:r=this.dims.h-n.minHeight;const h=r<0;let u=0,f=0;for(const d of this.kids){const l=a.cache.dimMins.get(d.unId)||{minWidth:0,minHeight:0};let m=0;if(!h&&!d.collapsed){u+=d.part;const p=d===s?r:Math.round(r*u/e);m=p-f,f=p}t?(d.dims.w=l.minWidth+m,d.dims.h=this.dims.h,d.dims.x=this.dims.x+i,d.dims.y=this.dims.y,i+=d.dims.w+c.bond):(d.dims.h=l.minHeight+m,d.dims.w=this.dims.w,d.dims.y=this.dims.y+i,d.dims.x=this.dims.x,i+=d.dims.h+c.bond),d.next&&(t?d.next.dims={w:c.bond,h:d.dims.h,x:d.dims.x+d.dims.w,y:d.dims.y}:d.next.dims={w:d.dims.w,h:c.bond,x:d.dims.x,y:d.dims.y+d.dims.h})}}toJSON(){const t=[];for(const n of this.kids)t.push(n.toJSON());const e={typNode:this.type,nodPart:this.part,nodName:this.name,uidNode:this.unId};return this.open&&(e.nodOpen=this.open),this.collapsed&&(e.nodFold=!0),this===c.root&&c.maximized&&(e.nodMaxd=c.maximized),t.length>0&&(e.nodKids=t),e}}class D{dims={w:0,h:0,x:0,y:0};unId=c.createId();next=null;prev=null;host=null;constructor(t=null,e=null,n=null){this.host=t,this.next=e,this.prev=n,this.next&&(this.next.prev=this),this.prev&&(this.prev.next=this)}toJSON(){return{nodName:this.host?.name||"",typNode:"bond",uidNode:this.unId,nodPart:0,nodOpen:"",nodKids:[]}}}function*P(o){const t=new x;for(t.enqueue(o);!t.isEmpty();){const e=t.dequeue();if(e&&(yield e,e.nodKids&&e.nodKids.length>0))for(const n of e.nodKids)t.enqueue(n)}}function*K(o){const t=new x;for(t.enqueue(o);!t.isEmpty();){const e=t.dequeue();if(e&&(a.cache.mapElem.set(e.unId,e),yield e,e.kids.size()>0))for(const n of e.kids)t.enqueue(n)}}function*U(o,t){for(const e of t.kids)yield*o.NodeLayoutRecursiveIterator(e);yield t}function $(o,t){const e=a.cache.mapDirs.get(t.unId);if(e===void 0){console.warn(`Cannot update child directions for node ${t.unId}; its own direction is not set.`);return}for(const n of t.kids)a.cache.mapDirs.set(n.unId,!e),n.kids.size()>0&&(n.host=t,o.updateChildDirections(n),n.next&&a.cache.mapDirs.set(n.next.unId,!e))}function _(o,t=c.tree){if(!t)return;const e=o.JSONLayoutIterator(t),n=o.NodeLayoutIterator(c.root);for(a.cache.mapDirs.set(c.root.unId,!0);;){const i=e.next(),s=n.next();if(i.done||s.done)break;const r=i.value,h=s.value;!r||!h||o.createNodeTreeFromJSONTree(r,h)}o.calcTabsetCountAndMinDim()}function Y(o,t,e){const n=a.cache.mapDirs.get(e.unId);for(const i of t.nodKids||[]){const s=o.createNodeFromJSON(i),r=e.kids.peekBack();s.host=e,s.addBond(s.host,r),e.kids.enqueue(s),a.cache.mapDirs.set(s.unId,!n)}e.type==="tabset"&&a.cache.mapElem.set(e.unId,e),e.type==="tab"&&a.cache.mapElem.set(e.unId,e)}function G(o,t,e=c.root){const n=new x;for(n.enqueue(e),a.cache.mapDirs.set(c.root.unId,!0);!t.isEmpty();){const i=n.dequeue();if(!i)break;const s=a.cache.mapDirs.get(i.unId);if(t.size()===1){const d=t.dequeue(),l=new a({type:"tabset",host:i}),m=new a({type:"tab",host:l,name:d,unId:o.tabsIds.get(d??"")??c.createId()});l.open=m.name,l.kids.enqueue(m),i.kids.enqueue(l),a.cache.mapDirs.set(l.unId,!s),a.cache.mapDirs.set(m.unId,s),a.cache.mapElem.set(l.unId,l),a.cache.mapElem.set(m.unId,m);break}if(t.size()==2){const d=t.dequeue(),l=t.dequeue(),m=new a({type:"tabset",host:i}),p=new a({type:"tabset",host:i}),I=new a({type:"tab",host:m,name:d,unId:o.tabsIds.get(d??"")??c.createId()}),w=new a({type:"tab",host:p,name:l,unId:o.tabsIds.get(l??"")??c.createId()});m.open=I.name,p.open=w.name,m.kids.enqueue(I),p.kids.enqueue(w),i.kids.enqueue(m),i.kids.enqueue(p),p.addBond(i,m),a.cache.mapDirs.set(m.unId,!s),a.cache.mapDirs.set(p.unId,!s),a.cache.mapElem.set(m.unId,m),a.cache.mapElem.set(p.unId,p),a.cache.mapDirs.set(I.unId,s),a.cache.mapDirs.set(w.unId,s),a.cache.mapElem.set(I.unId,I),a.cache.mapElem.set(w.unId,w);break}const r=t.dequeue(),h=new a({type:"tabset",host:i}),u=new a({type:"row",host:i}),f=new a({type:"tab",host:h,name:r,unId:o.tabsIds.get(r??"")??c.createId()});h.open=f.name,h.kids.enqueue(f),i.kids.enqueue(h),i.kids.enqueue(u),u.addBond(i,h),a.cache.mapDirs.set(h.unId,!s),a.cache.mapDirs.set(u.unId,!s),a.cache.mapElem.set(h.unId,h),a.cache.mapDirs.set(f.unId,s),a.cache.mapElem.set(f.unId,f),n.enqueue(u)}o.calcTabsetCountAndMinDim()}function J(o,t){const e=new a({type:t.typNode,name:t.nodName,unId:t.uidNode,part:t.nodPart,dims:{w:0,h:0,x:0,y:0},open:typeof t.nodOpen=="string"?t.nodOpen:""});return e.collapsed=t.typNode==="tabset"&&t.nodFold===!0,t.typNode==="tab"&&(e.unId=o.tabsIds.get(t.nodName)||t.uidNode),e}function E(o){const t=a.cache.mapElem.get(o);return t instanceof a&&t.type==="tabset"?t:null}function Q(o=c.root){let t=0;const e=n=>{n.type==="tabset"&&t++;for(const i of n.kids)e(i)};return e(o),t}function O(o){return o.type==="tabset"&&!!o.host&&o.host.kids.size()>1}function H(){return Q()>1}function M(){const o=c.maximized;return o?E(o):null}function z(o,t){let e=null;for(const n of o.kids)n===t||!n.collapsed||(!e||n.foldedAt>e.foldedAt)&&(e=n);e&&(e.collapsed=!1)}function j(o=c.root){let t=!1;const e=n=>{n.type==="tabset"&&(n.unId===c.maximized&&(t=!0),n.collapsed&&!O(n)&&(n.collapsed=!1)),n.type!=="tab"&&n.kids.size()>0&&[...n.kids].every(s=>s.collapsed)&&z(n);for(const i of n.kids)e(i)};e(o),t||(c.maximized=null)}function q(o,t){return!E(t)||!H()||c.maximized===t?!1:(c.maximized=t,o.calcDimensions(),!0)}function F(o){return c.maximized?(c.maximized=null,o.calcDimensions(),!0):!1}function V(o,t){return c.maximized===t?F(o):q(o,t)}function B(o,t){const e=E(t);if(!e||e.collapsed||!O(e))return!1;c.maximized=null,e.collapsed=!0,e.foldedAt=++c.foldSeq;const n=e.host;return[...n.kids].every(i=>i.collapsed)&&z(n,e),o.calcTabsetCountAndMinDim(),o.calcDimensions(),!0}function C(o,t){const e=E(t);return!e||!e.collapsed?!1:(e.collapsed=!1,o.calcTabsetCountAndMinDim(),o.calcDimensions(),!0)}function X(o,t){const e=E(t);return e?e.collapsed?C(o,t):B(o,t):!1}function Z(o,t=c.root,e=!0){t===c.root&&e&&(j(t),a.cache.tabCnts.clear(),a.cache.dimMins.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear());for(const n of o.NodeLayoutRecursiveIterator(t)){const i=a.cache.tabCnts,s=a.cache.dimMins;a.cache.mapElem.set(n.unId,n);const r=i.set(n.unId,{horizontal:0,vertical:0}).get(n.unId),h=s.set(n.unId,{minWidth:0,minHeight:0}).get(n.unId),u=a.cache.mapDirs.get(n.unId);if(n.type==="tab"&&(a.cache.mapElem.set(n.unId,n),s.set(n.unId,{minWidth:0,minHeight:0})),n.next&&a.cache.mapElem.set(n.next.unId,n.next),n.type==="tabset"&&(a.cache.mapElem.set(n.unId,n),s.set(n.unId,{minWidth:c.minW,minHeight:c.minH}),u?i.set(n.unId,{horizontal:0,vertical:1}):i.set(n.unId,{horizontal:1,vertical:0}),n.collapsed&&n.host&&(a.cache.mapDirs.get(n.host.unId)?(s.set(n.unId,{minWidth:c.collapsedSize,minHeight:c.minH}),i.get(n.unId).horizontal=0):(s.set(n.unId,{minWidth:c.minW,minHeight:c.collapsedSize}),i.get(n.unId).vertical=0))),n.type==="row"){for(const f of n.kids){const d=i.get(f.unId),l=s.get(f.unId);d&&(r.horizontal+=d.horizontal,r.vertical+=d.vertical,u?(h.minHeight=Math.max(h.minHeight,l.minHeight),h.minWidth+=l.minWidth):(h.minHeight+=l.minHeight,h.minWidth=Math.max(h.minWidth,l.minWidth)))}u?h.minWidth+=(n.kids.size()-1)*c.bond:h.minHeight+=(n.kids.size()-1)*c.bond}}t===c.root&&e&&o.pruneStaleDirections()}function tt(){for(const o of a.cache.mapDirs.keys())a.cache.mapElem.has(o)||a.cache.mapDirs.delete(o)}function et(){const o=c.root.getReqDimension();let t=!1,e=c.root.dims.w,n=c.root.dims.h;return c.root.dims.w<o.width&&(e=o.width,t=!0),c.root.dims.h<o.height&&(n=o.height,t=!0),t&&(c.root.dims.w=e,c.root.dims.h=n),{adjustedW:e,adjustedH:n,wasAdjusted:t}}function nt(o,t=c.root,e=!1){const n=t===c.root,i=d=>n?new Map:new Map(d.get()),s=i(a.cache.nodOpts),r=i(a.cache.bndOpts),h=i(a.cache.tabOpts);n&&o.calculateRootAdjustment();const u=M(),f=H();for(const d of o.NodeLayoutIterator(t)){d.calcDimensions();const l=a.cache.mapDirs.get(d.unId);if(d.type==="tabset"){const m=d===u,p=!!u&&!m,I=m?{...c.root.dims}:{...d.dims},w={typNode:d.type,nodName:d.name,uidNode:d.unId,nodPart:d.part,nodOpen:d.open,nodeDir:l,nodFold:d.collapsed&&!m,nodMaxd:m,nodHidden:p,nodFoldable:O(d),nodMaximizable:f,nodKids:Array.from(d.kids).map(k=>{const g={typNode:k.type,nodName:k.name,uidNode:k.unId,nodPart:k.part,nodOpen:d.open===k.name,nodeDir:!l,nodHidden:p,nodFold:d.collapsed&&!m,nodDims:{...I}};return h.set(k.unId,g),g}),nodDims:I};s.set(d.unId,w)}if(d.next&&d.type!=="tab"){const m={typNode:"bond",nodName:d.name,uidNode:d.next.unId,nodeDir:l,nodPart:0,nodHidden:!!u,nodLocked:d.collapsed||!!d.next.next?.collapsed,nodDims:{...d.next.dims}};r.set(d.next.unId,m)}}a.cache.nodOpts.set(s,e),a.cache.bndOpts.set(r,e),a.cache.tabOpts.set(h,e)}function it(o,t,e=!1,n=2){if(c.root.dims=t,e){o.calcDimensions(c.root);return}o.cntdown&&(c.timer.clear(o.cntdown),o.cntdown=null),o.cntdown=c.timer.set(()=>{o.cntdown=null,o.calcDimensions()},n)}function ot(o,t,e,n=!1,i=2){if(n){o.updateSliderDimension(t,e);return}o.cntdown&&(c.timer.clear(o.cntdown),o.cntdown=null),o.cntdown=c.timer.set(()=>{o.cntdown=null,o.updateSliderDimension(t,e)},i)}function st(o,t,e){const n=a.cache.mapElem.get(t);if(!n||!(n instanceof D)){console.warn(`Bond with id ${t} not found or is not a Bond instance`);return}const i=a.cache.mapDirs.get(n.host.unId),s=n.prev,r=n.next,h=n.host;if(!s||!r||!h){console.warn("Missing prev, next, or host node",s,r,h);return}if(s.collapsed||r.collapsed||c.maximized)return;const u=a.cache.dimMins.get(s.unId)||{minWidth:0,minHeight:0},f=a.cache.dimMins.get(r.unId)||{minWidth:0,minHeight:0},d=c.bond/2;if(i){const l=r.dims.x+r.dims.w,m=s.dims.x+u.minWidth+d,p=l-f.minWidth-d,I=Math.max(m,Math.min(p,e.x));n.dims.x=I-d,s.dims.w=n.dims.x-s.dims.x,r.dims.x=I+d,r.dims.w=l-r.dims.x;const w=Math.max(0,s.dims.w-u.minWidth),k=Math.max(0,r.dims.w-f.minWidth),g=w+k,N=s.part+r.part;g>0?(s.part=w/g*N,r.part=k/g*N):(s.part=N/2,r.part=N/2)}else{const l=r.dims.y+r.dims.h,m=s.dims.y+u.minHeight+d,p=l-f.minHeight-d,I=Math.max(m,Math.min(p,e.y));n.dims.y=I-d,s.dims.h=n.dims.y-s.dims.y,r.dims.y=I+d,r.dims.h=l-r.dims.y;const w=Math.max(0,s.dims.h-u.minHeight),k=Math.max(0,r.dims.h-f.minHeight),g=w+k,N=s.part+r.part;g>0?(s.part=w/g*N,r.part=k/g*N):(s.part=N/2,r.part=N/2)}o.calcDimensions(h)}function at(o,t,e,n){const i=a.cache.mapElem.get(t);let s=a.cache.mapElem.get(e);return!i||!(i instanceof a)||!s||!(s instanceof a)?(console.warn(`Source node ${t} not found or is not a Node instance`),!1):i?.type=="tab"&&i.host===s&&s.kids.size()<2?(console.warn("Cannot move to self as it has only one tab"),!1):i?.type=="tabset"&&s?.host===i?(console.warn("Cannot move tabset to self as it is already a child"),!1):!i||!s?(console.warn(`Source or destination node not found: ${t}, ${e}`),!1):i===s?(console.warn("Source and destination nodes are the same, no action taken."),!1):!i.host||!s.host&&s.type!=="row"?(console.warn(`Source node or destination node's host is null: ${i.unId}, ${s.unId}`),!1):s.type==="row"&&s!==c.root?(console.warn(`Cannot move relative to a nested row: ${s.unId}`),!1):s.type==="row"&&n==="contain"?(console.warn(`Cannot move to a row with 'contain' layout: ${s.unId}`),!1):i.type==="row"||(s.type==="tabset"&&n==="contain"&&(s=s.kids.peekBack()||s),i===s)?!1:o.isOnlyContent(i)?(console.warn("Cannot move the only tabset or tab in the layout"),!1):(c.maximized=null,i.collapsed=!1,s.type==="tab"&&(n==="contain"||n==="left"||n==="right")?o.moveNodeAsTab(i,s,n):s.type==="row"&&n!=="contain"?o.moveRelativeToRoot(i,s,n):s.type==="tabset"&&n!=="contain"&&o.moveRelativeToTabset(i,s,n),o.calcTabsetCountAndMinDim(),o.calcDimensions(c.root,!0),!0)}function rt(o,t){let e=0;for(const n of o.NodeLayoutRecursiveIterator(c.root))n.type==="tabset"&&e++;return e!==1?!1:t.type==="tabset"||t.type==="tab"&&t.host?.kids.size()===1}function dt(o,t,e,n){if(!e||!e.host){console.warn(`Destination node ${e.unId} has no host, cannot move.`);return}o.removeNode(t);const i=e.host,s=i.kids.indexOf(e);if(s===void 0||s===-1)return;const r=n==="contain"||n==="left",h=r?s:s+1,u=i.kids.get(h+1),f=i.kids.get(h-1),d=e.next,l=e.prev;if(!r&&d?a.cache.mapElem.delete(d.unId):r&&l&&a.cache.mapElem.delete(l.unId),t.type=="tab")r?(f&&t.addBond(i,f),e.addBond(i,t)):(t.addBond(i,e),u&&u.addBond(i,t)),i.kids.insert(h,t),t.host=i,i.open=t.name,i.collapsed=!1;else if(t.type=="tabset"){const m=t.kids.peek(),p=t.kids.peekBack();r?(m&&f&&m.addBond(i,f),p&&e&&e.addBond(i,p)):(m&&e&&m.addBond(i,e),p&&u&&u.addBond(i,p)),i.kids.insertQueue(h,t.kids);for(const I of t.kids)I.host=i,I.next&&(I.next.host=i);i.open=p?p.name:"",i.collapsed=!1}o.updateChildDirections(i)}const ct={root:(o,t)=>o===t,tabset:(o,t)=>o!==t};function W(o,t,e,n,i){if(o.removeNode(t),t.type!=="tab"&&t.type!=="tabset")return;const s=a.cache.mapDirs.get(e.unId)===!1,r=n==="left"||n==="right",h=n==="top"||n==="left";let u=t;t.type==="tab"&&(u=new a({type:"tabset",host:e.host}),u.kids.enqueue(t),u.open=t.name,t.host=u),ct[i](s,r)?o.insertNodeWithNewParent(u,e,h):o.insertNode(e,u,h)}function ht(o,t,e,n){W(o,t,e,n,"root")}function ut(o,t,e,n){W(o,t,e,n,"tabset")}function lt(o,t,e,n){const i=t.host;if(t==c.root){const l=c.root.kids.peek(),m=c.root.kids.peekBack();n?(c.root.kids.enqueueFront(e),l&&l.addBond(c.root,e)):(c.root.kids.enqueue(e),m&&e.addBond(c.root,m)),e.host=c.root,o.updateChildDirections(c.root);return}if(!i){console.warn(`Destination node ${t.unId} has no host, cannot insert.`);return}const s=i.kids.indexOf(t);if(s===-1){console.warn(`Destination node ${t.unId} not found in its host's kids.`);return}const r=a.cache.mapDirs.get(i.unId);r&&a.cache.mapDirs.set(e.unId,!r);const h=i.kids.get(s+1),u=i.kids.get(s-1),f=t.next,d=t.prev;e.host=i,n?(i.kids.insert(s,e),t.addBond(i,e),u&&e.addBond(i,u),d&&a.cache.mapElem.delete(d.unId)):(i.kids.insert(s+1,e),e.addBond(i,t),h&&h.addBond(i,e),f&&a.cache.mapElem.delete(f.unId)),o.updateChildDirections(i)}function ft(o,t,e,n){const i=new x,s=new a({type:"tabset",host:e.host});if(!e||!t){console.warn(`Destination node ${e.unId} has no host, cannot insert.`);return}if(e===c.root){const h=new a({type:"row",host:e});if(e.kids.size()===0)e.kids.enqueue(t),t.host=e;else if(e.kids.size()==1&&e.kids.peek()?.type==="tabset"){const u=e.kids.dequeue();if(!u){console.warn(`No kid found in destination node ${e.unId}, cannot insert.`);return}n?(h.kids.enqueue(t),h.kids.enqueue(u),e.kids.enqueue(h),u.addBond(h,t)):(h.kids.enqueue(u),h.kids.enqueue(t),t.addBond(h,u),e.kids.enqueue(h)),t.host=h,u.host=h}else if(e.kids.size()==1&&e.kids.peek()?.type==="row"){const u=e.kids.peek(),f=u?.kids.peek(),d=u?.kids.peekBack();n&&u?(u.kids.enqueueFront(t),f&&f.addBond(u,t)):u&&(u.kids.enqueue(t),d&&t.addBond(u,d)),t.host=u}else if(e.kids.size()>1){const u=new a({type:"row",host:e}),f=new a({type:"row",host:u});for(const d of e.kids)f.kids.enqueue(d),d.host=f,d.next&&(d.next.host=f);t.host=u,e.kids.clear(),n?(u.kids.enqueueFront(t),u.kids.enqueue(f),f.addBond(u,t)):(u.kids.enqueue(f),u.kids.enqueue(t),t.addBond(u,f)),e.kids.enqueue(u)}o.updateChildDirections(e);return}t.host=e,s.host=e,s.kids=e.kids,s.open=e.open;const r=a.cache.mapDirs.get(e.unId);for(const h of s.kids)h.host=s,h.next&&(h.next.host=s),a.cache.mapDirs.set(h.unId,r);for(const h of t.kids)h.host=t,h.next&&(h.next.host=t),a.cache.mapDirs.set(h.unId,r);a.cache.mapDirs.set(s.unId,!r),a.cache.mapDirs.set(t.unId,!r),n?(i.enqueue(t),i.enqueue(s),e.kids=i,e.type="row",s.addBond(e,t)):(i.enqueue(s),i.enqueue(t),e.kids=i,e.type="row",t.addBond(e,s))}function mt(o,t){if(!t.host||!t.host.host){console.warn(`Source node ${t.unId} has no host, cannot move.`);return}const e=t.host,n=t.host.host,i=n.kids.indexOf(e),s=n.kids.get(i-1),r=n.kids.get(i+1),h=t.kids.peek(),u=t.kids.peekBack();o.removeKid(e);let f=i;if(t.type=="row"&&e){s&&h&&h.addBond(n,s),r&&u&&r.addBond(n,u);for(const d of t.kids)d.host=n,d.next&&(d.next.host=n),n.kids.insert(f,d),a.cache.mapDirs.set(d.unId,!a.cache.mapDirs.get(n.unId)),a.cache.dimMins.delete(d.unId),f++}else if(t.type=="tabset"){s&&t.addBond(n,s),r&&r.addBond(n,t),n.kids.insert(f,t),t.host=n,a.cache.mapDirs.set(t.unId,!a.cache.mapDirs.get(n.unId));for(const d of t.kids)a.cache.mapDirs.set(d.unId,a.cache.mapDirs.get(n.unId)),a.cache.dimMins.delete(d.unId)}}function pt(o,t=!0){const e=o.host,n=o.prev,i=o.next;if(o.host=null,o.next=null,o.prev=null,n&&(n.next=null),i&&(i.prev=null),!t)return o;n&&i&&n.prev&&i.next?n.prev.addBond(e,i.next):n&&n.prev?n.prev.next=null:i&&i.next&&(i.next.prev=null)}function It(o,t){if(!t.host){console.warn("Kid node has no host, cannot remove.");return}const e=t?.host,n=e?.host;if(o.removeKid(t),t.type==="tabset"&&e.kids.size()===1){const i=e.kids.peek();i&&o.moveAdjacentNodeToGrandParent(i)}else if(t.type==="tab"&&e.kids.size()===0&&n.kids.size()===2){o.removeKid(e);const i=n?.kids.peek();i&&o.moveAdjacentNodeToGrandParent(i)}else if(t.type==="tab"&&e.kids.size()===0&&n.kids.size()>2)o.removeKid(e);else if(t.type==="tab"&&e.open===t.name&&e.kids.size()>0){const i=e.kids.peek();i&&(e.open=i.name)}}function yt(o){if(!o.host){console.warn("Kid node has no host, cannot remove.");return}const t=o.host,e=t.kids.indexOf(o),n=t.kids.get(e+1),i=t.kids.get(e-1),s=o.next,r=o.prev;if(e===-1){console.warn("Kid node not found in its host's kids.");return}s&&a.cache.mapElem.delete(s.unId),r&&a.cache.mapElem.delete(r.unId),n&&i?n.addBond(t,i):n?n.prev=null:i&&(i.next=null),t.kids.removeAt(e),a.cache.mapElem.delete(o.unId),a.cache.dimMins.delete(o.unId),a.cache.mapDirs.delete(o.unId),a.cache.tabCnts.delete(o.unId),o.type==="tabset"&&a.cache.mapElem.delete(o.unId),o.type==="tab"&&a.cache.mapElem.delete(o.unId),o.host=null,o.next=null,o.prev=null}function wt(){a.cache.dimMins.clear(),a.cache.mapDirs.clear(),a.cache.tabCnts.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear()}class b{static get _root(){return c.root}static set _root(t){c.root=t}static get _tree(){return c.tree}static set _tree(t){c.tree=t}static get _minW(){return c.minW}static set _minW(t){c.minW=t}static get _minH(){return c.minH}static set _minH(t){c.minH=t}static get _bond(){return c.bond}static set _bond(t){c.bond=t}static get _inst(){return c.inst}static set _inst(t){c.inst=t}nodeOps;cntdown=null;tabsIds=new Map;constructor(t={}){const e={tabs:[],tree:null,minW:40,minH:40,bond:10,uqid:"dynamix-layout-root",tabsIds:new Map,...t};this.tabsIds=e.tabsIds,c.createId=e.createId??S,c.timer=e.timer??R,c.collapsedSize=e.collapsedSize??e.minH,b._tree=e.tree??null,c.maximized=e.tree?.nodMaxd??null,b._root=new a({unId:e.uqid,name:e.uqid,type:"row"}),this.nodeOps=T(new Map,v),b._minW=e.minW,b._minH=e.minH,b._bond=e.bond;const n=new x(e.tabs.length,e.tabs);b._tree?this.createNodeLayout():this.createBinaryNodeTreeFromQueue(n),b._inst=this}*JSONLayoutIterator(t){yield*P(t)}*NodeLayoutIterator(t){yield*K(t)}*NodeLayoutRecursiveIterator(t){yield*U(this,t)}updateChildDirections(t){return $(this,t)}createNodeLayout(t=b._tree){return _(this,t)}createNodeTreeFromJSONTree(t,e){return Y(this,t,e)}createBinaryNodeTreeFromQueue(t,e=b._root){return G(this,t,e)}createNodeFromJSON(t){return J(this,t)}calcTabsetCountAndMinDim(t=b._root,e=!0){return Z(this,t,e)}pruneStaleDirections(){return tt()}calculateRootAdjustment(){return et()}calcDimensions(t=b._root,e=!1){return nt(this,t,e)}updateDimension(t,e=!1,n=2){return it(this,t,e,n)}updateSlider(t,e,n=!1,i=2){return ot(this,t,e,n,i)}updateSliderDimension(t,e){return st(this,t,e)}updateTree(t,e,n){return at(this,t,e,n)}isOnlyContent(t){return rt(this,t)}moveNodeAsTab(t,e,n){return dt(this,t,e,n)}moveRelativeToRoot(t,e,n){return ht(this,t,e,n)}moveRelativeToTabset(t,e,n){return ut(this,t,e,n)}insertNode(t,e,n){return lt(this,t,e,n)}insertNodeWithNewParent(t,e,n){return ft(this,t,e,n)}moveAdjacentNodeToGrandParent(t){return mt(this,t)}removeRelation(t,e=!0){return pt(t,e)}removeNode(t){return It(this,t)}removeKid(t){return yt(t)}clearAllCache(){return wt()}get maximizedId(){return M()?.unId??null}maximize(t){return q(this,t)}restore(){return F(this)}toggleMaximize(t){return V(this,t)}collapse(t){return B(this,t)}expand(t){return C(this,t)}toggleCollapse(t){return X(this,t)}}const bt=6;function kt(o,t,e){const{left:n,top:i,width:s,height:r}=o,h=t-n,u=e-i;return h<s/3?{area:"left",left:n,top:i,width:s/2,height:r}:h>2*s/3?{area:"right",left:n+s/2,top:i,width:s/2,height:r}:u<r/3?{area:"top",left:n,top:i,width:s,height:r/2}:u>2*r/3?{area:"bottom",left:n,top:i+r/2,width:s,height:r/2}:{area:"contain",left:n+s*.1,top:i+r*.1,width:s*.8,height:r*.8}}function gt(o,t){const{x:e,y:n,w:i,h:s}=o;switch(t){case"left":return{area:t,left:e,top:n,width:i/2,height:s};case"right":return{area:t,left:e+i/2,top:n,width:i/2,height:s};case"top":return{area:t,left:e,top:n,width:i,height:s/2};case"bottom":return{area:t,left:e,top:n+s/2,width:i,height:s/2}}}function Nt(o,t,e,n){if(t.length===0||n<o.top||n>o.bottom)return null;const i=t[0],s=t[t.length-1];let r=bt;if(e>s.right)return{index:t.length-1,area:"right",left:s.right+1,top:s.top,width:r-2,height:s.height};if(e<i.left)return{index:0,area:"left",left:i.left-r+1,top:i.top,width:r-2,height:i.height};let h=0,u=1/0,f=!1;t.forEach((m,p)=>{const I=m.left+m.width/2,w=Math.abs(e-I);w<u&&(u=w,h=p,f=e<I)});const d=f?h>0:h<t.length-1;t.length>1&&d&&(r=t[1].left-i.right);const l=t[h];return{index:h,area:f?"left":"right",left:f?l.left-r+1:l.right+1,top:l.top,width:r-2,height:l.height}}function xt(o,t){return o.area===t.area&&o.left===t.left&&o.top===t.top&&o.width===t.width&&o.height===t.height}function L(o,{x:t,y:e,w:n,h:i}){o.style.left=`${t}px`,o.style.top=`${e}px`,o.style.width=`${n}px`,o.style.height=`${i}px`}function Tt(o,t){return{x:o.x,y:o.y+t,w:o.w,h:Math.max(0,o.h-t)}}function vt(o,t){const{x:e,y:n,w:i,h:s}=o.nodDims,r=o.nodeDir===!1;return o.nodFold&&r?{rect:{x:e+i,y:n,w:s,h:i},rotated:!0}:{rect:{x:e,y:n,w:i,h:t},rotated:!1}}function Et(o,t){L(o,t.rect),o.style.transformOrigin="0 0",o.style.transform=t.rotated?"rotate(90deg)":""}function Dt(o){let t=null,e=null;const n=()=>{e=null;const i=t;t=null,i&&o(i.value)};return{schedule(i){t={value:i},e===null&&(e=requestAnimationFrame(n))},flush(){e!==null&&(cancelAnimationFrame(e),n())},cancel(){e!==null&&cancelAnimationFrame(e),e=null,t=null}}}return(()=>{if(typeof window>"u")return;const o="color: #03A9F4; font-weight: bold; line-height: 1.2;",t="color: #E0E0E0; font-size: 12px;",e="color: #42a5f5; font-size: 12px;",n="color: #9E9E9E; font-size: 10px;",i=`
2
2
  ██████╗ ██╗ ██╗ ███╗ ██╗ █████╗ ███╗ ███╗ ██████╗ ██╗ ██╗
3
3
  ██╔══██╗╚██╗ ██╔╝ ████╗ ██║ ██╔══██╗ ████╗ ████║ ╚═██╔═╝ ╚██╗██╔╝
4
4
  ██║ ██║ ╚████╔╝ ██╔██╗ ██║ ███████║ ██╔████╔██║ ██║ ╚███╔╝
@@ -54,4 +54,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
54
54
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
55
55
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56
56
  SOFTWARE.
57
- `,__LAYOUT__:w})})(),y.Bond=O,y.DynamixLayoutCore=w,y.Node=a,y.Queue=k,y.areNodeOptionsEqual=D,y.areNodeOptionsMapEqual=E,y.createFrameScheduler=lt,y.createReactiveState=v,y.getNavbarDropPreview=dt,y.getRootSplitPreview=rt,y.getTabBodyRect=ut,y.getTabsetDropPreview=at,y.isSameDropPreview=ct,y.setElementRect=ht,Object.defineProperty(y,Symbol.toStringTag,{value:"Module"}),y})({});
57
+ `,__LAYOUT__:b})})(),y.Bond=D,y.DynamixLayoutCore=b,y.Node=a,y.Queue=x,y.areNodeOptionsEqual=A,y.areNodeOptionsMapEqual=v,y.createFrameScheduler=Dt,y.createReactiveState=T,y.getNavbarDropPreview=Nt,y.getRootSplitPreview=gt,y.getTabBodyRect=Tt,y.getTabbarPlacement=vt,y.getTabsetDropPreview=kt,y.isSameDropPreview=xt,y.placeTabbar=Et,y.setElementRect=L,Object.defineProperty(y,Symbol.toStringTag,{value:"Module"}),y})({});
package/dist/core.umd.js CHANGED
@@ -1,4 +1,4 @@
1
- (function(I,b){typeof exports=="object"&&typeof module<"u"?b(exports):typeof define=="function"&&define.amd?define(["exports"],b):(I=typeof globalThis<"u"?globalThis:I||self,b((I.dynamix=I.dynamix||{},I.dynamix.layout=I.dynamix.layout||{},I.dynamix.layout.core={})))})(this,(function(I){"use strict";class b{buffer;head=0;tail=0;count=0;capacity;constructor(t=16,e=[]){this.capacity=Math.max(t,e.length),this.buffer=new Array(this.capacity),e.forEach(n=>{this.enqueue(n)})}enqueue(t){this.count===this.capacity&&this.resize(),this.buffer[this.tail]=t,this.tail=(this.tail+1)%this.capacity,this.count++}enqueueFront(t){this.count===this.capacity&&this.resize(),this.head=(this.head-1+this.capacity)%this.capacity,this.buffer[this.head]=t,this.count++}insert(t,e){if(t<0||t>this.count)return!1;if(t===0)return this.enqueueFront(e),!0;if(t===this.count)return this.enqueue(e),!0;this.count===this.capacity&&this.resize();const n=t,i=this.count-t;return n<=i?this.shiftLeft(t,e):this.shiftRight(t,e),this.count++,!0}insertArray(t,e){if(t<0||t>this.count)return!1;if(e.length===0)return!0;if(t===0){for(let r=e.length-1;r>=0;r--)this.enqueueFront(e[r]);return!0}if(t===this.count)return e.forEach(r=>this.enqueue(r)),!0;for(;this.count+e.length>this.capacity;)this.resize();const n=t,i=this.count-t,s=e.length;return n<=i?this.shiftLeftArray(t,e):this.shiftRightArray(t,e),this.count+=s,!0}insertQueue(t,e){if(t<0||t>this.count)return!1;if(e.isEmpty())return!0;const n=e.size();if(t===0){const c=e.toArray();for(let d=c.length-1;d>=0;d--)this.enqueueFront(c[d]);return!0}if(t===this.count){for(const c of e)this.enqueue(c);return!0}for(;this.count+n>this.capacity;)this.resize();const i=e.toArray(),s=t,r=this.count-t;return s<=r?this.shiftLeftArray(t,i):this.shiftRightArray(t,i),this.count+=n,!0}push(t){this.enqueue(t)}unshift(t){this.enqueueFront(t)}dequeue(){if(this.count===0)return;const t=this.buffer[this.head];return this.head=(this.head+1)%this.capacity,this.count--,t}dequeueBack(){if(this.count===0)return;this.tail=(this.tail-1+this.capacity)%this.capacity;const t=this.buffer[this.tail];return this.count--,t}indexOf(t){for(let e=0;e<this.count;e++){const n=(this.head+e)%this.capacity;if(this.buffer[n]===t)return e}return-1}remove(t){const e=this.indexOf(t);return e===-1?!1:(this.removeAt(e),!0)}removeAt(t){if(t<0||t>=this.count)return;if(t===0)return this.dequeue();if(t===this.count-1)return this.dequeueBack();const e=(this.head+t)%this.capacity,n=this.buffer[e],i=t,s=this.count-t-1;return i<=s?this.shiftRightForRemoval(t):this.shiftLeftForRemoval(t),this.count--,n}shift(){return this.dequeue()}pop(){return this.dequeueBack()}fifoAdd(t){this.enqueue(t)}fifoRemove(){return this.dequeue()}filoAdd(t){this.enqueue(t)}filoRemove(){return this.dequeueBack()}lifoAdd(t){this.enqueueFront(t)}lifoRemove(){return this.dequeue()}liloAdd(t){this.enqueueFront(t)}liloRemove(){return this.dequeueBack()}get(t){if(t<0||t>=this.count)return;const e=(this.head+t)%this.capacity;return this.buffer[e]}set(t,e){if(t<0||t>=this.count)return!1;const n=(this.head+t)%this.capacity;return this.buffer[n]=e,!0}peek(){return this.count>0?this.buffer[this.head]:void 0}peekBack(){if(this.count===0)return;const t=(this.tail-1+this.capacity)%this.capacity;return this.buffer[t]}front(){return this.peek()}back(){return this.peekBack()}size(){return this.count}getCapacity(){return this.capacity}isEmpty(){return this.count===0}isFull(){return this.count===this.capacity}clear(){this.head=0,this.tail=0,this.count=0}toArray(){const t=[];for(let e=0;e<this.count;e++){const n=(this.head+e)%this.capacity;t.push(this.buffer[n])}return t}*[Symbol.iterator](){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*forward(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*reverse(){for(let t=this.count-1;t>=0;t--){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*entries(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield[t,this.buffer[e]]}}*keys(){for(let t=0;t<this.count;t++)yield t}*values(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}toString(){return`Queue(${this.toArray().join(", ")})`}resize(){const t=this.capacity*2,e=new Array(t);for(let n=0;n<this.count;n++){const i=(this.head+n)%this.capacity;e[n]=this.buffer[i]}this.buffer=e,this.capacity=t,this.head=0,this.tail=this.count}shiftLeft(t,e){this.head=(this.head-1+this.capacity)%this.capacity;for(let i=0;i<t;i++){const s=(this.head+1+i)%this.capacity,r=(this.head+i)%this.capacity;this.buffer[r]=this.buffer[s]}const n=(this.head+t)%this.capacity;this.buffer[n]=e}shiftRight(t,e){for(let i=this.count-1;i>=t;i--){const s=(this.head+i)%this.capacity,r=(this.head+i+1)%this.capacity;this.buffer[r]=this.buffer[s]}const n=(this.head+t)%this.capacity;this.buffer[n]=e,this.tail=(this.tail+1)%this.capacity}shiftRightForRemoval(t){for(let e=t;e>0;e--){const n=(this.head+e-1)%this.capacity,i=(this.head+e)%this.capacity;this.buffer[i]=this.buffer[n]}this.head=(this.head+1)%this.capacity}shiftLeftForRemoval(t){for(let e=t;e<this.count-1;e++){const n=(this.head+e+1)%this.capacity,i=(this.head+e)%this.capacity;this.buffer[i]=this.buffer[n]}this.tail=(this.tail-1+this.capacity)%this.capacity}shiftLeftArray(t,e){const n=e.length;this.head=(this.head-n+this.capacity)%this.capacity;for(let i=0;i<t;i++){const s=(this.head+n+i)%this.capacity,r=(this.head+i)%this.capacity;this.buffer[r]=this.buffer[s]}for(let i=0;i<n;i++){const s=(this.head+t+i)%this.capacity;this.buffer[s]=e[i]}}shiftRightArray(t,e){const n=e.length;for(let i=this.count-1;i>=t;i--){const s=(this.head+i)%this.capacity,r=(this.head+i+n)%this.capacity;this.buffer[r]=this.buffer[s]}for(let i=0;i<n;i++){const s=(this.head+t+i)%this.capacity;this.buffer[s]=e[i]}this.tail=(this.tail+n)%this.capacity}}function v(o,t=(e,n)=>e===n){let e=o;const n=new Set;let i=[];const s=()=>e,r=(f,m=!1)=>{if(m){e=f;return}t(e,f)||(e=f,n.forEach(p=>p(e)),i.forEach(p=>p(e)),i=[])},c=()=>{n.forEach(f=>f(e)),i.forEach(f=>f(e)),i=[]},d=f=>(n.add(f),()=>n.delete(f)),l=()=>new Promise(f=>{i.push(f)});return{get:s,set:r,onChange:d,nextChange:l,triggerChange:c,onChangePromise:f=>{let m=!0;return(async()=>{for(;m;){const y=await l();if(!m)break;f(y)}})(),()=>{m=!1}}}}function E(o,t){if(o.size!==t.size)return!1;for(const[e,n]of o.entries()){const i=t.get(e);if(!i||!x(n,i))return!1}return!0}function x(o,t){if(o.typNode!==t.typNode||o.nodName!==t.nodName||o.uidNode!==t.uidNode||o.nodPart!==t.nodPart)return!1;const e=o.nodDims,n=t.nodDims;return e.x===n.x&&e.y===n.y&&e.w===n.w&&e.h===n.h}const D=()=>crypto.randomUUID(),A={set:(o,t)=>setTimeout(o,t),clear:o=>clearTimeout(o)},u={createId:D,timer:A,root:void 0,tree:null,minW:40,minH:40,bond:10,inst:null};class a{static cache={dimMins:new Map,mapDirs:new Map,tabCnts:new Map,mapElem:new Map,tabOpts:v(new Map,E),nodOpts:v(new Map,E),bndOpts:v(new Map,E)};kids=new b;dims={w:0,h:0,x:0,y:0};unId;next=null;prev=null;type="row";name="";part=0;host=null;open="";constructor(t={}){const e={type:"row",host:null,name:"",part:100,dims:{w:0,h:0,x:0,y:0},unId:u.createId(),open:""};this.type=t.type??e.type,this.host=t.host??e.host,this.name=t.name??e.name,this.part=t.part??e.part,this.dims=t.dims??e.dims,this.open=t.open??e.open,this.unId=t.unId||e.unId}addBond(t,e=null){if(!e)return;const n=new O(t,this,e);a.cache.mapElem.set(n.unId,n)}getReqDimension(){const t=a.cache.dimMins.get(this.unId),e=a.cache.tabCnts.get(this.unId),n=Math.max(t.minWidth,e.horizontal*u.minW+Math.max(0,e.horizontal-1)*u.bond),i=Math.max(t.minHeight,e.vertical*u.minH+Math.max(0,e.vertical-1)*u.bond);return{width:n,height:i}}calcDimensions(){const t=a.cache.mapDirs.get(this.unId);if(!this.kids)return;let e=0;const n=a.cache.dimMins.get(this.unId)||{minWidth:0,minHeight:0};let i=0;for(const h of this.kids)e+=h.part;if(e===0)return;let s;t?s=this.dims.w-n.minWidth:s=this.dims.h-n.minHeight;const r=s<0,c=this.kids.peekBack();let d=0,l=0;for(const h of this.kids){const f=a.cache.dimMins.get(h.unId)||{minWidth:0,minHeight:0};let m=0;if(!r){d+=h.part;const p=h===c?s:Math.round(s*d/e);m=p-l,l=p}t?(h.dims.w=f.minWidth+m,h.dims.h=this.dims.h,h.dims.x=this.dims.x+i,h.dims.y=this.dims.y,i+=h.dims.w+u.bond):(h.dims.h=f.minHeight+m,h.dims.w=this.dims.w,h.dims.y=this.dims.y+i,h.dims.x=this.dims.x,i+=h.dims.h+u.bond),h.next&&(t?h.next.dims={w:u.bond,h:h.dims.h,x:h.dims.x+h.dims.w,y:h.dims.y}:h.next.dims={w:h.dims.w,h:u.bond,x:h.dims.x,y:h.dims.y+h.dims.h})}}toJSON(){const t=[];for(const n of this.kids)t.push(n.toJSON());const e={typNode:this.type,nodPart:this.part,nodName:this.name,uidNode:this.unId};return this.open&&(e.nodOpen=this.open),t.length>0&&(e.nodKids=t),e}}class O{dims={w:0,h:0,x:0,y:0};unId=u.createId();next=null;prev=null;host=null;constructor(t=null,e=null,n=null){this.host=t,this.next=e,this.prev=n,this.next&&(this.next.prev=this),this.prev&&(this.prev.next=this)}toJSON(){return{nodName:this.host?.name||"",typNode:"bond",uidNode:this.unId,nodPart:0,nodOpen:"",nodKids:[]}}}function*R(o){const t=new b;for(t.enqueue(o);!t.isEmpty();){const e=t.dequeue();if(e&&(yield e,e.nodKids&&e.nodKids.length>0))for(const n of e.nodKids)t.enqueue(n)}}function*q(o){const t=new b;for(t.enqueue(o);!t.isEmpty();){const e=t.dequeue();if(e&&(a.cache.mapElem.set(e.unId,e),yield e,e.kids.size()>0))for(const n of e.kids)t.enqueue(n)}}function*H(o,t){for(const e of t.kids)yield*o.NodeLayoutRecursiveIterator(e);yield t}function B(o,t){const e=a.cache.mapDirs.get(t.unId);if(e===void 0){console.warn(`Cannot update child directions for node ${t.unId}; its own direction is not set.`);return}for(const n of t.kids)a.cache.mapDirs.set(n.unId,!e),n.kids.size()>0&&(n.host=t,o.updateChildDirections(n),n.next&&a.cache.mapDirs.set(n.next.unId,!e))}function M(o,t=u.tree){if(!t)return;const e=o.JSONLayoutIterator(t),n=o.NodeLayoutIterator(u.root);for(a.cache.mapDirs.set(u.root.unId,!0);;){const i=e.next(),s=n.next();if(i.done||s.done)break;const r=i.value,c=s.value;!r||!c||o.createNodeTreeFromJSONTree(r,c)}o.calcTabsetCountAndMinDim()}function C(o,t,e){const n=a.cache.mapDirs.get(e.unId);for(const i of t.nodKids||[]){const s=o.createNodeFromJSON(i),r=e.kids.peekBack();s.host=e,s.addBond(s.host,r),e.kids.enqueue(s),a.cache.mapDirs.set(s.unId,!n)}e.type==="tabset"&&a.cache.mapElem.set(e.unId,e),e.type==="tab"&&a.cache.mapElem.set(e.unId,e)}function F(o,t,e=u.root){const n=new b;for(n.enqueue(e),a.cache.mapDirs.set(u.root.unId,!0);!t.isEmpty();){const i=n.dequeue();if(!i)break;const s=a.cache.mapDirs.get(i.unId);if(t.size()==2){const h=t.dequeue(),f=t.dequeue(),m=new a({type:"tabset",host:i}),p=new a({type:"tabset",host:i}),y=new a({type:"tab",host:m,name:h,unId:o.tabsIds.get(h??"")??u.createId()}),N=new a({type:"tab",host:p,name:f,unId:o.tabsIds.get(f??"")??u.createId()});m.open=y.name,p.open=N.name,m.kids.enqueue(y),p.kids.enqueue(N),i.kids.enqueue(m),i.kids.enqueue(p),p.addBond(i,m),a.cache.mapDirs.set(m.unId,!s),a.cache.mapDirs.set(p.unId,!s),a.cache.mapElem.set(m.unId,m),a.cache.mapElem.set(p.unId,p),a.cache.mapDirs.set(y.unId,s),a.cache.mapDirs.set(N.unId,s),a.cache.mapElem.set(y.unId,y),a.cache.mapElem.set(N.unId,N);break}const r=t.dequeue(),c=new a({type:"tabset",host:i}),d=new a({type:"row",host:i}),l=new a({type:"tab",host:c,name:r,unId:o.tabsIds.get(r??"")??u.createId()});c.open=l.name,c.kids.enqueue(l),i.kids.enqueue(c),i.kids.enqueue(d),d.addBond(i,c),a.cache.mapDirs.set(c.unId,!s),a.cache.mapDirs.set(d.unId,!s),a.cache.mapElem.set(c.unId,c),a.cache.mapDirs.set(l.unId,s),a.cache.mapElem.set(l.unId,l),n.enqueue(d)}o.calcTabsetCountAndMinDim()}function W(o,t){const e=new a({type:t.typNode,name:t.nodName,unId:t.uidNode,part:t.nodPart,dims:{w:0,h:0,x:0,y:0},open:typeof t.nodOpen=="string"?t.nodOpen:""});return t.typNode==="tab"&&(e.unId=o.tabsIds.get(t.nodName)||t.uidNode),e}function L(o,t=u.root,e=!0){t===u.root&&e&&(a.cache.tabCnts.clear(),a.cache.dimMins.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear());for(const n of o.NodeLayoutRecursiveIterator(t)){const i=a.cache.tabCnts,s=a.cache.dimMins;a.cache.mapElem.set(n.unId,n);const r=i.set(n.unId,{horizontal:0,vertical:0}).get(n.unId),c=s.set(n.unId,{minWidth:0,minHeight:0}).get(n.unId),d=a.cache.mapDirs.get(n.unId);if(n.type==="tab"&&(a.cache.mapElem.set(n.unId,n),s.set(n.unId,{minWidth:0,minHeight:0})),n.next&&a.cache.mapElem.set(n.next.unId,n.next),n.type==="tabset"&&(a.cache.mapElem.set(n.unId,n),s.set(n.unId,{minWidth:u.minW,minHeight:u.minH}),d?i.set(n.unId,{horizontal:0,vertical:1}):i.set(n.unId,{horizontal:1,vertical:0})),n.type==="row"){for(const l of n.kids){const h=i.get(l.unId),f=s.get(l.unId);h&&(r.horizontal+=h.horizontal,r.vertical+=h.vertical,d?(c.minHeight=Math.max(c.minHeight,f.minHeight),c.minWidth+=f.minWidth):(c.minHeight+=f.minHeight,c.minWidth=Math.max(c.minWidth,f.minWidth)))}d?c.minWidth+=(n.kids.size()-1)*u.bond:c.minHeight+=(n.kids.size()-1)*u.bond}}t===u.root&&e&&o.pruneStaleDirections()}function P(){for(const o of a.cache.mapDirs.keys())a.cache.mapElem.has(o)||a.cache.mapDirs.delete(o)}function z(){const o=u.root.getReqDimension();let t=!1,e=u.root.dims.w,n=u.root.dims.h;return u.root.dims.w<o.width&&(e=o.width,t=!0),u.root.dims.h<o.height&&(n=o.height,t=!0),t&&(u.root.dims.w=e,u.root.dims.h=n),{adjustedW:e,adjustedH:n,wasAdjusted:t}}function K(o,t=u.root,e=!1){const n=t===u.root,i=d=>n?new Map:new Map(d.get()),s=i(a.cache.nodOpts),r=i(a.cache.bndOpts),c=i(a.cache.tabOpts);n&&o.calculateRootAdjustment();for(const d of o.NodeLayoutIterator(t)){d.calcDimensions();const l=a.cache.mapDirs.get(d.unId);if(d.type==="tabset"){const h={typNode:d.type,nodName:d.name,uidNode:d.unId,nodPart:d.part,nodOpen:d.open,nodeDir:l,nodKids:Array.from(d.kids).map(f=>{const m={typNode:f.type,nodName:f.name,uidNode:f.unId,nodPart:f.part,nodOpen:d.open===f.name,nodeDir:!l,nodDims:{...d.dims}};return c.set(f.unId,m),m}),nodDims:{...d.dims}};s.set(d.unId,h)}if(d.next&&d.type!=="tab"){const h={typNode:"bond",nodName:d.name,uidNode:d.next.unId,nodeDir:l,nodPart:0,nodDims:{...d.next.dims}};r.set(d.next.unId,h)}}a.cache.nodOpts.set(s,e),a.cache.bndOpts.set(r,e),a.cache.tabOpts.set(c,e)}function U(o,t,e=!1,n=2){if(u.root.dims=t,e){o.calcDimensions(u.root);return}o.cntdown&&(u.timer.clear(o.cntdown),o.cntdown=null),o.cntdown=u.timer.set(()=>{o.cntdown=null,o.calcDimensions()},n)}function $(o,t,e,n=!1,i=2){if(n){o.updateSliderDimension(t,e);return}o.cntdown&&(u.timer.clear(o.cntdown),o.cntdown=null),o.cntdown=u.timer.set(()=>{o.cntdown=null,o.updateSliderDimension(t,e)},i)}function _(o,t,e){const n=a.cache.mapElem.get(t);if(!n||!(n instanceof O)){console.warn(`Bond with id ${t} not found or is not a Bond instance`);return}const i=a.cache.mapDirs.get(n.host.unId),s=n.prev,r=n.next,c=n.host;if(!s||!r||!c){console.warn("Missing prev, next, or host node",s,r,c);return}const d=a.cache.dimMins.get(s.unId)||{minWidth:0,minHeight:0},l=a.cache.dimMins.get(r.unId)||{minWidth:0,minHeight:0},h=u.bond/2;if(i){const f=r.dims.x+r.dims.w,m=s.dims.x+d.minWidth+h,p=f-l.minWidth-h,y=Math.max(m,Math.min(p,e.x));n.dims.x=y-h,s.dims.w=n.dims.x-s.dims.x,r.dims.x=y+h,r.dims.w=f-r.dims.x;const N=Math.max(0,s.dims.w-d.minWidth),T=Math.max(0,r.dims.w-l.minWidth),g=N+T,k=s.part+r.part;g>0?(s.part=N/g*k,r.part=T/g*k):(s.part=k/2,r.part=k/2)}else{const f=r.dims.y+r.dims.h,m=s.dims.y+d.minHeight+h,p=f-l.minHeight-h,y=Math.max(m,Math.min(p,e.y));n.dims.y=y-h,s.dims.h=n.dims.y-s.dims.y,r.dims.y=y+h,r.dims.h=f-r.dims.y;const N=Math.max(0,s.dims.h-d.minHeight),T=Math.max(0,r.dims.h-l.minHeight),g=N+T,k=s.part+r.part;g>0?(s.part=N/g*k,r.part=T/g*k):(s.part=k/2,r.part=k/2)}o.calcDimensions(c)}function Y(o,t,e,n){const i=a.cache.mapElem.get(t);let s=a.cache.mapElem.get(e);return!i||!(i instanceof a)||!s||!(s instanceof a)?(console.warn(`Source node ${t} not found or is not a Node instance`),!1):i?.type=="tab"&&i.host===s&&s.kids.size()<2?(console.warn("Cannot move to self as it has only one tab"),!1):i?.type=="tabset"&&s?.host===i?(console.warn("Cannot move tabset to self as it is already a child"),!1):!i||!s?(console.warn(`Source or destination node not found: ${t}, ${e}`),!1):i===s?(console.warn("Source and destination nodes are the same, no action taken."),!1):!i.host||!s.host&&s.type!=="row"?(console.warn(`Source node or destination node's host is null: ${i.unId}, ${s.unId}`),!1):s.type==="row"&&s!==u.root?(console.warn(`Cannot move relative to a nested row: ${s.unId}`),!1):s.type==="row"&&n==="contain"?(console.warn(`Cannot move to a row with 'contain' layout: ${s.unId}`),!1):i.type==="row"||(s.type==="tabset"&&n==="contain"&&(s=s.kids.peekBack()||s),i===s)?!1:o.isOnlyContent(i)?(console.warn("Cannot move the only tabset or tab in the layout"),!1):(s.type==="tab"&&(n==="contain"||n==="left"||n==="right")?o.moveNodeAsTab(i,s,n):s.type==="row"&&n!=="contain"?o.moveRelativeToRoot(i,s,n):s.type==="tabset"&&n!=="contain"&&o.moveRelativeToTabset(i,s,n),o.calcTabsetCountAndMinDim(),o.calcDimensions(u.root,!0),!0)}function G(o,t){let e=0;for(const n of o.NodeLayoutRecursiveIterator(u.root))n.type==="tabset"&&e++;return e!==1?!1:t.type==="tabset"||t.type==="tab"&&t.host?.kids.size()===1}function J(o,t,e,n){if(!e||!e.host){console.warn(`Destination node ${e.unId} has no host, cannot move.`);return}o.removeNode(t);const i=e.host,s=i.kids.indexOf(e);if(s===void 0||s===-1)return;const r=n==="contain"||n==="left",c=r?s:s+1,d=i.kids.get(c+1),l=i.kids.get(c-1),h=e.next,f=e.prev;if(!r&&h?a.cache.mapElem.delete(h.unId):r&&f&&a.cache.mapElem.delete(f.unId),t.type=="tab")r?(l&&t.addBond(i,l),e.addBond(i,t)):(t.addBond(i,e),d&&d.addBond(i,t)),i.kids.insert(c,t),t.host=i,i.open=t.name;else if(t.type=="tabset"){const m=t.kids.peek(),p=t.kids.peekBack();r?(m&&l&&m.addBond(i,l),p&&e&&e.addBond(i,p)):(m&&e&&m.addBond(i,e),p&&d&&d.addBond(i,p)),i.kids.insertQueue(c,t.kids);for(const y of t.kids)y.host=i,y.next&&(y.next.host=i);i.open=p?p.name:""}o.updateChildDirections(i)}const Q={root:(o,t)=>o===t,tabset:(o,t)=>o!==t};function S(o,t,e,n,i){if(o.removeNode(t),t.type!=="tab"&&t.type!=="tabset")return;const s=a.cache.mapDirs.get(e.unId)===!1,r=n==="left"||n==="right",c=n==="top"||n==="left";let d=t;t.type==="tab"&&(d=new a({type:"tabset",host:e.host}),d.kids.enqueue(t),d.open=t.name,t.host=d),Q[i](s,r)?o.insertNodeWithNewParent(d,e,c):o.insertNode(e,d,c)}function j(o,t,e,n){S(o,t,e,n,"root")}function X(o,t,e,n){S(o,t,e,n,"tabset")}function V(o,t,e,n){const i=t.host;if(t==u.root){const f=u.root.kids.peek(),m=u.root.kids.peekBack();n?(u.root.kids.enqueueFront(e),f&&f.addBond(u.root,e)):(u.root.kids.enqueue(e),m&&e.addBond(u.root,m)),e.host=u.root,o.updateChildDirections(u.root);return}if(!i){console.warn(`Destination node ${t.unId} has no host, cannot insert.`);return}const s=i.kids.indexOf(t);if(s===-1){console.warn(`Destination node ${t.unId} not found in its host's kids.`);return}const r=a.cache.mapDirs.get(i.unId);r&&a.cache.mapDirs.set(e.unId,!r);const c=i.kids.get(s+1),d=i.kids.get(s-1),l=t.next,h=t.prev;e.host=i,n?(i.kids.insert(s,e),t.addBond(i,e),d&&e.addBond(i,d),h&&a.cache.mapElem.delete(h.unId)):(i.kids.insert(s+1,e),e.addBond(i,t),c&&c.addBond(i,e),l&&a.cache.mapElem.delete(l.unId)),o.updateChildDirections(i)}function Z(o,t,e,n){const i=new b,s=new a({type:"tabset",host:e.host});if(!e||!t){console.warn(`Destination node ${e.unId} has no host, cannot insert.`);return}if(e===u.root){const c=new a({type:"row",host:e});if(e.kids.size()===0)e.kids.enqueue(t),t.host=e;else if(e.kids.size()==1&&e.kids.peek()?.type==="tabset"){const d=e.kids.dequeue();if(!d){console.warn(`No kid found in destination node ${e.unId}, cannot insert.`);return}n?(c.kids.enqueue(t),c.kids.enqueue(d),e.kids.enqueue(c),d.addBond(c,t)):(c.kids.enqueue(d),c.kids.enqueue(t),t.addBond(c,d),e.kids.enqueue(c)),t.host=c,d.host=c}else if(e.kids.size()==1&&e.kids.peek()?.type==="row"){const d=e.kids.peek(),l=d?.kids.peek(),h=d?.kids.peekBack();n&&d?(d.kids.enqueueFront(t),l&&l.addBond(d,t)):d&&(d.kids.enqueue(t),h&&t.addBond(d,h)),t.host=d}else if(e.kids.size()>1){const d=new a({type:"row",host:e}),l=new a({type:"row",host:d});for(const h of e.kids)l.kids.enqueue(h),h.host=l,h.next&&(h.next.host=l);t.host=d,e.kids.clear(),n?(d.kids.enqueueFront(t),d.kids.enqueue(l),l.addBond(d,t)):(d.kids.enqueue(l),d.kids.enqueue(t),t.addBond(d,l)),e.kids.enqueue(d)}o.updateChildDirections(e);return}t.host=e,s.host=e,s.kids=e.kids,s.open=e.open;const r=a.cache.mapDirs.get(e.unId);for(const c of s.kids)c.host=s,c.next&&(c.next.host=s),a.cache.mapDirs.set(c.unId,r);for(const c of t.kids)c.host=t,c.next&&(c.next.host=t),a.cache.mapDirs.set(c.unId,r);a.cache.mapDirs.set(s.unId,!r),a.cache.mapDirs.set(t.unId,!r),n?(i.enqueue(t),i.enqueue(s),e.kids=i,e.type="row",s.addBond(e,t)):(i.enqueue(s),i.enqueue(t),e.kids=i,e.type="row",t.addBond(e,s))}function tt(o,t){if(!t.host||!t.host.host){console.warn(`Source node ${t.unId} has no host, cannot move.`);return}const e=t.host,n=t.host.host,i=n.kids.indexOf(e),s=n.kids.get(i-1),r=n.kids.get(i+1),c=t.kids.peek(),d=t.kids.peekBack();o.removeKid(e);let l=i;if(t.type=="row"&&e){s&&c&&c.addBond(n,s),r&&d&&r.addBond(n,d);for(const h of t.kids)h.host=n,h.next&&(h.next.host=n),n.kids.insert(l,h),a.cache.mapDirs.set(h.unId,!a.cache.mapDirs.get(n.unId)),a.cache.dimMins.delete(h.unId),l++}else if(t.type=="tabset"){s&&t.addBond(n,s),r&&r.addBond(n,t),n.kids.insert(l,t),t.host=n,a.cache.mapDirs.set(t.unId,!a.cache.mapDirs.get(n.unId));for(const h of t.kids)a.cache.mapDirs.set(h.unId,a.cache.mapDirs.get(n.unId)),a.cache.dimMins.delete(h.unId)}}function et(o,t=!0){const e=o.host,n=o.prev,i=o.next;if(o.host=null,o.next=null,o.prev=null,n&&(n.next=null),i&&(i.prev=null),!t)return o;n&&i&&n.prev&&i.next?n.prev.addBond(e,i.next):n&&n.prev?n.prev.next=null:i&&i.next&&(i.next.prev=null)}function nt(o,t){if(!t.host){console.warn("Kid node has no host, cannot remove.");return}const e=t?.host,n=e?.host;if(o.removeKid(t),t.type==="tabset"&&e.kids.size()===1){const i=e.kids.peek();i&&o.moveAdjacentNodeToGrandParent(i)}else if(t.type==="tab"&&e.kids.size()===0&&n.kids.size()===2){o.removeKid(e);const i=n?.kids.peek();i&&o.moveAdjacentNodeToGrandParent(i)}else if(t.type==="tab"&&e.kids.size()===0&&n.kids.size()>2)o.removeKid(e);else if(t.type==="tab"&&e.open===t.name&&e.kids.size()>0){const i=e.kids.peek();i&&(e.open=i.name)}}function it(o){if(!o.host){console.warn("Kid node has no host, cannot remove.");return}const t=o.host,e=t.kids.indexOf(o),n=t.kids.get(e+1),i=t.kids.get(e-1),s=o.next,r=o.prev;if(e===-1){console.warn("Kid node not found in its host's kids.");return}s&&a.cache.mapElem.delete(s.unId),r&&a.cache.mapElem.delete(r.unId),n&&i?n.addBond(t,i):n?n.prev=null:i&&(i.next=null),t.kids.removeAt(e),a.cache.mapElem.delete(o.unId),a.cache.dimMins.delete(o.unId),a.cache.mapDirs.delete(o.unId),a.cache.tabCnts.delete(o.unId),o.type==="tabset"&&a.cache.mapElem.delete(o.unId),o.type==="tab"&&a.cache.mapElem.delete(o.unId),o.host=null,o.next=null,o.prev=null}function ot(){a.cache.dimMins.clear(),a.cache.mapDirs.clear(),a.cache.tabCnts.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear()}class w{static get _root(){return u.root}static set _root(t){u.root=t}static get _tree(){return u.tree}static set _tree(t){u.tree=t}static get _minW(){return u.minW}static set _minW(t){u.minW=t}static get _minH(){return u.minH}static set _minH(t){u.minH=t}static get _bond(){return u.bond}static set _bond(t){u.bond=t}static get _inst(){return u.inst}static set _inst(t){u.inst=t}nodeOps;cntdown=null;tabsIds=new Map;constructor(t={}){const e={tabs:[],tree:null,minW:40,minH:40,bond:10,uqid:"dynamix-layout-root",tabsIds:new Map,...t};this.tabsIds=e.tabsIds,u.createId=e.createId??D,u.timer=e.timer??A,w._tree=e.tree??null,w._root=new a({unId:e.uqid,name:e.uqid,type:"row"}),this.nodeOps=v(new Map,E),w._minW=e.minW,w._minH=e.minH,w._bond=e.bond;const n=new b(e.tabs.length,e.tabs);w._tree?this.createNodeLayout():this.createBinaryNodeTreeFromQueue(n),w._inst=this}*JSONLayoutIterator(t){yield*R(t)}*NodeLayoutIterator(t){yield*q(t)}*NodeLayoutRecursiveIterator(t){yield*H(this,t)}updateChildDirections(t){return B(this,t)}createNodeLayout(t=w._tree){return M(this,t)}createNodeTreeFromJSONTree(t,e){return C(this,t,e)}createBinaryNodeTreeFromQueue(t,e=w._root){return F(this,t,e)}createNodeFromJSON(t){return W(this,t)}calcTabsetCountAndMinDim(t=w._root,e=!0){return L(this,t,e)}pruneStaleDirections(){return P()}calculateRootAdjustment(){return z()}calcDimensions(t=w._root,e=!1){return K(this,t,e)}updateDimension(t,e=!1,n=2){return U(this,t,e,n)}updateSlider(t,e,n=!1,i=2){return $(this,t,e,n,i)}updateSliderDimension(t,e){return _(this,t,e)}updateTree(t,e,n){return Y(this,t,e,n)}isOnlyContent(t){return G(this,t)}moveNodeAsTab(t,e,n){return J(this,t,e,n)}moveRelativeToRoot(t,e,n){return j(this,t,e,n)}moveRelativeToTabset(t,e,n){return X(this,t,e,n)}insertNode(t,e,n){return V(this,t,e,n)}insertNodeWithNewParent(t,e,n){return Z(this,t,e,n)}moveAdjacentNodeToGrandParent(t){return tt(this,t)}removeRelation(t,e=!0){return et(t,e)}removeNode(t){return nt(this,t)}removeKid(t){return it(t)}clearAllCache(){return ot()}}const st=6;function at(o,t,e){const{left:n,top:i,width:s,height:r}=o,c=t-n,d=e-i;return c<s/3?{area:"left",left:n,top:i,width:s/2,height:r}:c>2*s/3?{area:"right",left:n+s/2,top:i,width:s/2,height:r}:d<r/3?{area:"top",left:n,top:i,width:s,height:r/2}:d>2*r/3?{area:"bottom",left:n,top:i+r/2,width:s,height:r/2}:{area:"contain",left:n+s*.1,top:i+r*.1,width:s*.8,height:r*.8}}function rt(o,t){const{x:e,y:n,w:i,h:s}=o;switch(t){case"left":return{area:t,left:e,top:n,width:i/2,height:s};case"right":return{area:t,left:e+i/2,top:n,width:i/2,height:s};case"top":return{area:t,left:e,top:n,width:i,height:s/2};case"bottom":return{area:t,left:e,top:n+s/2,width:i,height:s/2}}}function dt(o,t,e,n){if(t.length===0||n<o.top||n>o.bottom)return null;const i=t[0],s=t[t.length-1];let r=st;if(e>s.right)return{index:t.length-1,area:"right",left:s.right+1,top:s.top,width:r-2,height:s.height};if(e<i.left)return{index:0,area:"left",left:i.left-r+1,top:i.top,width:r-2,height:i.height};let c=0,d=1/0,l=!1;t.forEach((m,p)=>{const y=m.left+m.width/2,N=Math.abs(e-y);N<d&&(d=N,c=p,l=e<y)});const h=l?c>0:c<t.length-1;t.length>1&&h&&(r=t[1].left-i.right);const f=t[c];return{index:c,area:l?"left":"right",left:l?f.left-r+1:f.right+1,top:f.top,width:r-2,height:f.height}}function ct(o,t){return o.area===t.area&&o.left===t.left&&o.top===t.top&&o.width===t.width&&o.height===t.height}function ht(o,{x:t,y:e,w:n,h:i}){o.style.left=`${t}px`,o.style.top=`${e}px`,o.style.width=`${n}px`,o.style.height=`${i}px`}function ut(o,t){return{x:o.x,y:o.y+t,w:o.w,h:Math.max(0,o.h-t)}}function lt(o){let t=null,e=null;const n=()=>{e=null;const i=t;t=null,i&&o(i.value)};return{schedule(i){t={value:i},e===null&&(e=requestAnimationFrame(n))},flush(){e!==null&&(cancelAnimationFrame(e),n())},cancel(){e!==null&&cancelAnimationFrame(e),e=null,t=null}}}(()=>{if(typeof window>"u")return;const o="color: #03A9F4; font-weight: bold; line-height: 1.2;",t="color: #E0E0E0; font-size: 12px;",e="color: #42a5f5; font-size: 12px;",n="color: #9E9E9E; font-size: 10px;",i=`
1
+ (function(I,g){typeof exports=="object"&&typeof module<"u"?g(exports):typeof define=="function"&&define.amd?define(["exports"],g):(I=typeof globalThis<"u"?globalThis:I||self,g((I.dynamix=I.dynamix||{},I.dynamix.layout=I.dynamix.layout||{},I.dynamix.layout.core={})))})(this,(function(I){"use strict";class g{buffer;head=0;tail=0;count=0;capacity;constructor(t=16,e=[]){this.capacity=Math.max(t,e.length),this.buffer=new Array(this.capacity),e.forEach(n=>{this.enqueue(n)})}enqueue(t){this.count===this.capacity&&this.resize(),this.buffer[this.tail]=t,this.tail=(this.tail+1)%this.capacity,this.count++}enqueueFront(t){this.count===this.capacity&&this.resize(),this.head=(this.head-1+this.capacity)%this.capacity,this.buffer[this.head]=t,this.count++}insert(t,e){if(t<0||t>this.count)return!1;if(t===0)return this.enqueueFront(e),!0;if(t===this.count)return this.enqueue(e),!0;this.count===this.capacity&&this.resize();const n=t,i=this.count-t;return n<=i?this.shiftLeft(t,e):this.shiftRight(t,e),this.count++,!0}insertArray(t,e){if(t<0||t>this.count)return!1;if(e.length===0)return!0;if(t===0){for(let r=e.length-1;r>=0;r--)this.enqueueFront(e[r]);return!0}if(t===this.count)return e.forEach(r=>this.enqueue(r)),!0;for(;this.count+e.length>this.capacity;)this.resize();const n=t,i=this.count-t,s=e.length;return n<=i?this.shiftLeftArray(t,e):this.shiftRightArray(t,e),this.count+=s,!0}insertQueue(t,e){if(t<0||t>this.count)return!1;if(e.isEmpty())return!0;const n=e.size();if(t===0){const h=e.toArray();for(let u=h.length-1;u>=0;u--)this.enqueueFront(h[u]);return!0}if(t===this.count){for(const h of e)this.enqueue(h);return!0}for(;this.count+n>this.capacity;)this.resize();const i=e.toArray(),s=t,r=this.count-t;return s<=r?this.shiftLeftArray(t,i):this.shiftRightArray(t,i),this.count+=n,!0}push(t){this.enqueue(t)}unshift(t){this.enqueueFront(t)}dequeue(){if(this.count===0)return;const t=this.buffer[this.head];return this.head=(this.head+1)%this.capacity,this.count--,t}dequeueBack(){if(this.count===0)return;this.tail=(this.tail-1+this.capacity)%this.capacity;const t=this.buffer[this.tail];return this.count--,t}indexOf(t){for(let e=0;e<this.count;e++){const n=(this.head+e)%this.capacity;if(this.buffer[n]===t)return e}return-1}remove(t){const e=this.indexOf(t);return e===-1?!1:(this.removeAt(e),!0)}removeAt(t){if(t<0||t>=this.count)return;if(t===0)return this.dequeue();if(t===this.count-1)return this.dequeueBack();const e=(this.head+t)%this.capacity,n=this.buffer[e],i=t,s=this.count-t-1;return i<=s?this.shiftRightForRemoval(t):this.shiftLeftForRemoval(t),this.count--,n}shift(){return this.dequeue()}pop(){return this.dequeueBack()}fifoAdd(t){this.enqueue(t)}fifoRemove(){return this.dequeue()}filoAdd(t){this.enqueue(t)}filoRemove(){return this.dequeueBack()}lifoAdd(t){this.enqueueFront(t)}lifoRemove(){return this.dequeue()}liloAdd(t){this.enqueueFront(t)}liloRemove(){return this.dequeueBack()}get(t){if(t<0||t>=this.count)return;const e=(this.head+t)%this.capacity;return this.buffer[e]}set(t,e){if(t<0||t>=this.count)return!1;const n=(this.head+t)%this.capacity;return this.buffer[n]=e,!0}peek(){return this.count>0?this.buffer[this.head]:void 0}peekBack(){if(this.count===0)return;const t=(this.tail-1+this.capacity)%this.capacity;return this.buffer[t]}front(){return this.peek()}back(){return this.peekBack()}size(){return this.count}getCapacity(){return this.capacity}isEmpty(){return this.count===0}isFull(){return this.count===this.capacity}clear(){this.head=0,this.tail=0,this.count=0}toArray(){const t=[];for(let e=0;e<this.count;e++){const n=(this.head+e)%this.capacity;t.push(this.buffer[n])}return t}*[Symbol.iterator](){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*forward(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*reverse(){for(let t=this.count-1;t>=0;t--){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}*entries(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield[t,this.buffer[e]]}}*keys(){for(let t=0;t<this.count;t++)yield t}*values(){for(let t=0;t<this.count;t++){const e=(this.head+t)%this.capacity;yield this.buffer[e]}}toString(){return`Queue(${this.toArray().join(", ")})`}resize(){const t=this.capacity*2,e=new Array(t);for(let n=0;n<this.count;n++){const i=(this.head+n)%this.capacity;e[n]=this.buffer[i]}this.buffer=e,this.capacity=t,this.head=0,this.tail=this.count}shiftLeft(t,e){this.head=(this.head-1+this.capacity)%this.capacity;for(let i=0;i<t;i++){const s=(this.head+1+i)%this.capacity,r=(this.head+i)%this.capacity;this.buffer[r]=this.buffer[s]}const n=(this.head+t)%this.capacity;this.buffer[n]=e}shiftRight(t,e){for(let i=this.count-1;i>=t;i--){const s=(this.head+i)%this.capacity,r=(this.head+i+1)%this.capacity;this.buffer[r]=this.buffer[s]}const n=(this.head+t)%this.capacity;this.buffer[n]=e,this.tail=(this.tail+1)%this.capacity}shiftRightForRemoval(t){for(let e=t;e>0;e--){const n=(this.head+e-1)%this.capacity,i=(this.head+e)%this.capacity;this.buffer[i]=this.buffer[n]}this.head=(this.head+1)%this.capacity}shiftLeftForRemoval(t){for(let e=t;e<this.count-1;e++){const n=(this.head+e+1)%this.capacity,i=(this.head+e)%this.capacity;this.buffer[i]=this.buffer[n]}this.tail=(this.tail-1+this.capacity)%this.capacity}shiftLeftArray(t,e){const n=e.length;this.head=(this.head-n+this.capacity)%this.capacity;for(let i=0;i<t;i++){const s=(this.head+n+i)%this.capacity,r=(this.head+i)%this.capacity;this.buffer[r]=this.buffer[s]}for(let i=0;i<n;i++){const s=(this.head+t+i)%this.capacity;this.buffer[s]=e[i]}}shiftRightArray(t,e){const n=e.length;for(let i=this.count-1;i>=t;i--){const s=(this.head+i)%this.capacity,r=(this.head+i+n)%this.capacity;this.buffer[r]=this.buffer[s]}for(let i=0;i<n;i++){const s=(this.head+t+i)%this.capacity;this.buffer[s]=e[i]}this.tail=(this.tail+n)%this.capacity}}function T(o,t=(e,n)=>e===n){let e=o;const n=new Set;let i=[];const s=()=>e,r=(l,m=!1)=>{if(m){e=l;return}t(e,l)||(e=l,n.forEach(p=>p(e)),i.forEach(p=>p(e)),i=[])},h=()=>{n.forEach(l=>l(e)),i.forEach(l=>l(e)),i=[]},u=l=>(n.add(l),()=>n.delete(l)),f=()=>new Promise(l=>{i.push(l)});return{get:s,set:r,onChange:u,nextChange:f,triggerChange:h,onChangePromise:l=>{let m=!0;return(async()=>{for(;m;){const y=await f();if(!m)break;l(y)}})(),()=>{m=!1}}}}function v(o,t){if(o.size!==t.size)return!1;for(const[e,n]of o.entries()){const i=t.get(e);if(!i||!A(n,i))return!1}return!0}function A(o,t){if(o.typNode!==t.typNode||o.nodName!==t.nodName||o.uidNode!==t.uidNode||o.nodPart!==t.nodPart||o.nodFold!==t.nodFold||o.nodMaxd!==t.nodMaxd||o.nodHidden!==t.nodHidden||o.nodLocked!==t.nodLocked)return!1;const e=o.nodDims,n=t.nodDims;return e.x===n.x&&e.y===n.y&&e.w===n.w&&e.h===n.h}const S=()=>crypto.randomUUID(),R={set:(o,t)=>setTimeout(o,t),clear:o=>clearTimeout(o)},c={createId:S,timer:R,root:void 0,tree:null,minW:40,minH:40,bond:10,inst:null,maximized:null,collapsedSize:40,foldSeq:0};class a{static cache={dimMins:new Map,mapDirs:new Map,tabCnts:new Map,mapElem:new Map,tabOpts:T(new Map,v),nodOpts:T(new Map,v),bndOpts:T(new Map,v)};kids=new g;dims={w:0,h:0,x:0,y:0};unId;next=null;prev=null;type="row";name="";part=0;host=null;open="";collapsed=!1;foldedAt=0;constructor(t={}){const e={type:"row",host:null,name:"",part:100,dims:{w:0,h:0,x:0,y:0},unId:c.createId(),open:""};this.type=t.type??e.type,this.host=t.host??e.host,this.name=t.name??e.name,this.part=t.part??e.part,this.dims=t.dims??e.dims,this.open=t.open??e.open,this.unId=t.unId||e.unId}addBond(t,e=null){if(!e)return;const n=new D(t,this,e);a.cache.mapElem.set(n.unId,n)}getReqDimension(){const t=a.cache.dimMins.get(this.unId),e=a.cache.tabCnts.get(this.unId),n=Math.max(t.minWidth,e.horizontal*c.minW+Math.max(0,e.horizontal-1)*c.bond),i=Math.max(t.minHeight,e.vertical*c.minH+Math.max(0,e.vertical-1)*c.bond);return{width:n,height:i}}calcDimensions(){const t=a.cache.mapDirs.get(this.unId);if(!this.kids)return;let e=0;const n=a.cache.dimMins.get(this.unId)||{minWidth:0,minHeight:0};let i=0,s;for(const d of this.kids)d.collapsed||(e+=d.part,s=d);if(e===0)return;let r;t?r=this.dims.w-n.minWidth:r=this.dims.h-n.minHeight;const h=r<0;let u=0,f=0;for(const d of this.kids){const l=a.cache.dimMins.get(d.unId)||{minWidth:0,minHeight:0};let m=0;if(!h&&!d.collapsed){u+=d.part;const p=d===s?r:Math.round(r*u/e);m=p-f,f=p}t?(d.dims.w=l.minWidth+m,d.dims.h=this.dims.h,d.dims.x=this.dims.x+i,d.dims.y=this.dims.y,i+=d.dims.w+c.bond):(d.dims.h=l.minHeight+m,d.dims.w=this.dims.w,d.dims.y=this.dims.y+i,d.dims.x=this.dims.x,i+=d.dims.h+c.bond),d.next&&(t?d.next.dims={w:c.bond,h:d.dims.h,x:d.dims.x+d.dims.w,y:d.dims.y}:d.next.dims={w:d.dims.w,h:c.bond,x:d.dims.x,y:d.dims.y+d.dims.h})}}toJSON(){const t=[];for(const n of this.kids)t.push(n.toJSON());const e={typNode:this.type,nodPart:this.part,nodName:this.name,uidNode:this.unId};return this.open&&(e.nodOpen=this.open),this.collapsed&&(e.nodFold=!0),this===c.root&&c.maximized&&(e.nodMaxd=c.maximized),t.length>0&&(e.nodKids=t),e}}class D{dims={w:0,h:0,x:0,y:0};unId=c.createId();next=null;prev=null;host=null;constructor(t=null,e=null,n=null){this.host=t,this.next=e,this.prev=n,this.next&&(this.next.prev=this),this.prev&&(this.prev.next=this)}toJSON(){return{nodName:this.host?.name||"",typNode:"bond",uidNode:this.unId,nodPart:0,nodOpen:"",nodKids:[]}}}function*P(o){const t=new g;for(t.enqueue(o);!t.isEmpty();){const e=t.dequeue();if(e&&(yield e,e.nodKids&&e.nodKids.length>0))for(const n of e.nodKids)t.enqueue(n)}}function*K(o){const t=new g;for(t.enqueue(o);!t.isEmpty();){const e=t.dequeue();if(e&&(a.cache.mapElem.set(e.unId,e),yield e,e.kids.size()>0))for(const n of e.kids)t.enqueue(n)}}function*U(o,t){for(const e of t.kids)yield*o.NodeLayoutRecursiveIterator(e);yield t}function $(o,t){const e=a.cache.mapDirs.get(t.unId);if(e===void 0){console.warn(`Cannot update child directions for node ${t.unId}; its own direction is not set.`);return}for(const n of t.kids)a.cache.mapDirs.set(n.unId,!e),n.kids.size()>0&&(n.host=t,o.updateChildDirections(n),n.next&&a.cache.mapDirs.set(n.next.unId,!e))}function _(o,t=c.tree){if(!t)return;const e=o.JSONLayoutIterator(t),n=o.NodeLayoutIterator(c.root);for(a.cache.mapDirs.set(c.root.unId,!0);;){const i=e.next(),s=n.next();if(i.done||s.done)break;const r=i.value,h=s.value;!r||!h||o.createNodeTreeFromJSONTree(r,h)}o.calcTabsetCountAndMinDim()}function Y(o,t,e){const n=a.cache.mapDirs.get(e.unId);for(const i of t.nodKids||[]){const s=o.createNodeFromJSON(i),r=e.kids.peekBack();s.host=e,s.addBond(s.host,r),e.kids.enqueue(s),a.cache.mapDirs.set(s.unId,!n)}e.type==="tabset"&&a.cache.mapElem.set(e.unId,e),e.type==="tab"&&a.cache.mapElem.set(e.unId,e)}function G(o,t,e=c.root){const n=new g;for(n.enqueue(e),a.cache.mapDirs.set(c.root.unId,!0);!t.isEmpty();){const i=n.dequeue();if(!i)break;const s=a.cache.mapDirs.get(i.unId);if(t.size()===1){const d=t.dequeue(),l=new a({type:"tabset",host:i}),m=new a({type:"tab",host:l,name:d,unId:o.tabsIds.get(d??"")??c.createId()});l.open=m.name,l.kids.enqueue(m),i.kids.enqueue(l),a.cache.mapDirs.set(l.unId,!s),a.cache.mapDirs.set(m.unId,s),a.cache.mapElem.set(l.unId,l),a.cache.mapElem.set(m.unId,m);break}if(t.size()==2){const d=t.dequeue(),l=t.dequeue(),m=new a({type:"tabset",host:i}),p=new a({type:"tabset",host:i}),y=new a({type:"tab",host:m,name:d,unId:o.tabsIds.get(d??"")??c.createId()}),w=new a({type:"tab",host:p,name:l,unId:o.tabsIds.get(l??"")??c.createId()});m.open=y.name,p.open=w.name,m.kids.enqueue(y),p.kids.enqueue(w),i.kids.enqueue(m),i.kids.enqueue(p),p.addBond(i,m),a.cache.mapDirs.set(m.unId,!s),a.cache.mapDirs.set(p.unId,!s),a.cache.mapElem.set(m.unId,m),a.cache.mapElem.set(p.unId,p),a.cache.mapDirs.set(y.unId,s),a.cache.mapDirs.set(w.unId,s),a.cache.mapElem.set(y.unId,y),a.cache.mapElem.set(w.unId,w);break}const r=t.dequeue(),h=new a({type:"tabset",host:i}),u=new a({type:"row",host:i}),f=new a({type:"tab",host:h,name:r,unId:o.tabsIds.get(r??"")??c.createId()});h.open=f.name,h.kids.enqueue(f),i.kids.enqueue(h),i.kids.enqueue(u),u.addBond(i,h),a.cache.mapDirs.set(h.unId,!s),a.cache.mapDirs.set(u.unId,!s),a.cache.mapElem.set(h.unId,h),a.cache.mapDirs.set(f.unId,s),a.cache.mapElem.set(f.unId,f),n.enqueue(u)}o.calcTabsetCountAndMinDim()}function J(o,t){const e=new a({type:t.typNode,name:t.nodName,unId:t.uidNode,part:t.nodPart,dims:{w:0,h:0,x:0,y:0},open:typeof t.nodOpen=="string"?t.nodOpen:""});return e.collapsed=t.typNode==="tabset"&&t.nodFold===!0,t.typNode==="tab"&&(e.unId=o.tabsIds.get(t.nodName)||t.uidNode),e}function E(o){const t=a.cache.mapElem.get(o);return t instanceof a&&t.type==="tabset"?t:null}function Q(o=c.root){let t=0;const e=n=>{n.type==="tabset"&&t++;for(const i of n.kids)e(i)};return e(o),t}function O(o){return o.type==="tabset"&&!!o.host&&o.host.kids.size()>1}function H(){return Q()>1}function M(){const o=c.maximized;return o?E(o):null}function z(o,t){let e=null;for(const n of o.kids)n===t||!n.collapsed||(!e||n.foldedAt>e.foldedAt)&&(e=n);e&&(e.collapsed=!1)}function j(o=c.root){let t=!1;const e=n=>{n.type==="tabset"&&(n.unId===c.maximized&&(t=!0),n.collapsed&&!O(n)&&(n.collapsed=!1)),n.type!=="tab"&&n.kids.size()>0&&[...n.kids].every(s=>s.collapsed)&&z(n);for(const i of n.kids)e(i)};e(o),t||(c.maximized=null)}function q(o,t){return!E(t)||!H()||c.maximized===t?!1:(c.maximized=t,o.calcDimensions(),!0)}function F(o){return c.maximized?(c.maximized=null,o.calcDimensions(),!0):!1}function V(o,t){return c.maximized===t?F(o):q(o,t)}function B(o,t){const e=E(t);if(!e||e.collapsed||!O(e))return!1;c.maximized=null,e.collapsed=!0,e.foldedAt=++c.foldSeq;const n=e.host;return[...n.kids].every(i=>i.collapsed)&&z(n,e),o.calcTabsetCountAndMinDim(),o.calcDimensions(),!0}function C(o,t){const e=E(t);return!e||!e.collapsed?!1:(e.collapsed=!1,o.calcTabsetCountAndMinDim(),o.calcDimensions(),!0)}function X(o,t){const e=E(t);return e?e.collapsed?C(o,t):B(o,t):!1}function Z(o,t=c.root,e=!0){t===c.root&&e&&(j(t),a.cache.tabCnts.clear(),a.cache.dimMins.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear());for(const n of o.NodeLayoutRecursiveIterator(t)){const i=a.cache.tabCnts,s=a.cache.dimMins;a.cache.mapElem.set(n.unId,n);const r=i.set(n.unId,{horizontal:0,vertical:0}).get(n.unId),h=s.set(n.unId,{minWidth:0,minHeight:0}).get(n.unId),u=a.cache.mapDirs.get(n.unId);if(n.type==="tab"&&(a.cache.mapElem.set(n.unId,n),s.set(n.unId,{minWidth:0,minHeight:0})),n.next&&a.cache.mapElem.set(n.next.unId,n.next),n.type==="tabset"&&(a.cache.mapElem.set(n.unId,n),s.set(n.unId,{minWidth:c.minW,minHeight:c.minH}),u?i.set(n.unId,{horizontal:0,vertical:1}):i.set(n.unId,{horizontal:1,vertical:0}),n.collapsed&&n.host&&(a.cache.mapDirs.get(n.host.unId)?(s.set(n.unId,{minWidth:c.collapsedSize,minHeight:c.minH}),i.get(n.unId).horizontal=0):(s.set(n.unId,{minWidth:c.minW,minHeight:c.collapsedSize}),i.get(n.unId).vertical=0))),n.type==="row"){for(const f of n.kids){const d=i.get(f.unId),l=s.get(f.unId);d&&(r.horizontal+=d.horizontal,r.vertical+=d.vertical,u?(h.minHeight=Math.max(h.minHeight,l.minHeight),h.minWidth+=l.minWidth):(h.minHeight+=l.minHeight,h.minWidth=Math.max(h.minWidth,l.minWidth)))}u?h.minWidth+=(n.kids.size()-1)*c.bond:h.minHeight+=(n.kids.size()-1)*c.bond}}t===c.root&&e&&o.pruneStaleDirections()}function tt(){for(const o of a.cache.mapDirs.keys())a.cache.mapElem.has(o)||a.cache.mapDirs.delete(o)}function et(){const o=c.root.getReqDimension();let t=!1,e=c.root.dims.w,n=c.root.dims.h;return c.root.dims.w<o.width&&(e=o.width,t=!0),c.root.dims.h<o.height&&(n=o.height,t=!0),t&&(c.root.dims.w=e,c.root.dims.h=n),{adjustedW:e,adjustedH:n,wasAdjusted:t}}function nt(o,t=c.root,e=!1){const n=t===c.root,i=d=>n?new Map:new Map(d.get()),s=i(a.cache.nodOpts),r=i(a.cache.bndOpts),h=i(a.cache.tabOpts);n&&o.calculateRootAdjustment();const u=M(),f=H();for(const d of o.NodeLayoutIterator(t)){d.calcDimensions();const l=a.cache.mapDirs.get(d.unId);if(d.type==="tabset"){const m=d===u,p=!!u&&!m,y=m?{...c.root.dims}:{...d.dims},w={typNode:d.type,nodName:d.name,uidNode:d.unId,nodPart:d.part,nodOpen:d.open,nodeDir:l,nodFold:d.collapsed&&!m,nodMaxd:m,nodHidden:p,nodFoldable:O(d),nodMaximizable:f,nodKids:Array.from(d.kids).map(k=>{const N={typNode:k.type,nodName:k.name,uidNode:k.unId,nodPart:k.part,nodOpen:d.open===k.name,nodeDir:!l,nodHidden:p,nodFold:d.collapsed&&!m,nodDims:{...y}};return h.set(k.unId,N),N}),nodDims:y};s.set(d.unId,w)}if(d.next&&d.type!=="tab"){const m={typNode:"bond",nodName:d.name,uidNode:d.next.unId,nodeDir:l,nodPart:0,nodHidden:!!u,nodLocked:d.collapsed||!!d.next.next?.collapsed,nodDims:{...d.next.dims}};r.set(d.next.unId,m)}}a.cache.nodOpts.set(s,e),a.cache.bndOpts.set(r,e),a.cache.tabOpts.set(h,e)}function it(o,t,e=!1,n=2){if(c.root.dims=t,e){o.calcDimensions(c.root);return}o.cntdown&&(c.timer.clear(o.cntdown),o.cntdown=null),o.cntdown=c.timer.set(()=>{o.cntdown=null,o.calcDimensions()},n)}function ot(o,t,e,n=!1,i=2){if(n){o.updateSliderDimension(t,e);return}o.cntdown&&(c.timer.clear(o.cntdown),o.cntdown=null),o.cntdown=c.timer.set(()=>{o.cntdown=null,o.updateSliderDimension(t,e)},i)}function st(o,t,e){const n=a.cache.mapElem.get(t);if(!n||!(n instanceof D)){console.warn(`Bond with id ${t} not found or is not a Bond instance`);return}const i=a.cache.mapDirs.get(n.host.unId),s=n.prev,r=n.next,h=n.host;if(!s||!r||!h){console.warn("Missing prev, next, or host node",s,r,h);return}if(s.collapsed||r.collapsed||c.maximized)return;const u=a.cache.dimMins.get(s.unId)||{minWidth:0,minHeight:0},f=a.cache.dimMins.get(r.unId)||{minWidth:0,minHeight:0},d=c.bond/2;if(i){const l=r.dims.x+r.dims.w,m=s.dims.x+u.minWidth+d,p=l-f.minWidth-d,y=Math.max(m,Math.min(p,e.x));n.dims.x=y-d,s.dims.w=n.dims.x-s.dims.x,r.dims.x=y+d,r.dims.w=l-r.dims.x;const w=Math.max(0,s.dims.w-u.minWidth),k=Math.max(0,r.dims.w-f.minWidth),N=w+k,x=s.part+r.part;N>0?(s.part=w/N*x,r.part=k/N*x):(s.part=x/2,r.part=x/2)}else{const l=r.dims.y+r.dims.h,m=s.dims.y+u.minHeight+d,p=l-f.minHeight-d,y=Math.max(m,Math.min(p,e.y));n.dims.y=y-d,s.dims.h=n.dims.y-s.dims.y,r.dims.y=y+d,r.dims.h=l-r.dims.y;const w=Math.max(0,s.dims.h-u.minHeight),k=Math.max(0,r.dims.h-f.minHeight),N=w+k,x=s.part+r.part;N>0?(s.part=w/N*x,r.part=k/N*x):(s.part=x/2,r.part=x/2)}o.calcDimensions(h)}function at(o,t,e,n){const i=a.cache.mapElem.get(t);let s=a.cache.mapElem.get(e);return!i||!(i instanceof a)||!s||!(s instanceof a)?(console.warn(`Source node ${t} not found or is not a Node instance`),!1):i?.type=="tab"&&i.host===s&&s.kids.size()<2?(console.warn("Cannot move to self as it has only one tab"),!1):i?.type=="tabset"&&s?.host===i?(console.warn("Cannot move tabset to self as it is already a child"),!1):!i||!s?(console.warn(`Source or destination node not found: ${t}, ${e}`),!1):i===s?(console.warn("Source and destination nodes are the same, no action taken."),!1):!i.host||!s.host&&s.type!=="row"?(console.warn(`Source node or destination node's host is null: ${i.unId}, ${s.unId}`),!1):s.type==="row"&&s!==c.root?(console.warn(`Cannot move relative to a nested row: ${s.unId}`),!1):s.type==="row"&&n==="contain"?(console.warn(`Cannot move to a row with 'contain' layout: ${s.unId}`),!1):i.type==="row"||(s.type==="tabset"&&n==="contain"&&(s=s.kids.peekBack()||s),i===s)?!1:o.isOnlyContent(i)?(console.warn("Cannot move the only tabset or tab in the layout"),!1):(c.maximized=null,i.collapsed=!1,s.type==="tab"&&(n==="contain"||n==="left"||n==="right")?o.moveNodeAsTab(i,s,n):s.type==="row"&&n!=="contain"?o.moveRelativeToRoot(i,s,n):s.type==="tabset"&&n!=="contain"&&o.moveRelativeToTabset(i,s,n),o.calcTabsetCountAndMinDim(),o.calcDimensions(c.root,!0),!0)}function rt(o,t){let e=0;for(const n of o.NodeLayoutRecursiveIterator(c.root))n.type==="tabset"&&e++;return e!==1?!1:t.type==="tabset"||t.type==="tab"&&t.host?.kids.size()===1}function dt(o,t,e,n){if(!e||!e.host){console.warn(`Destination node ${e.unId} has no host, cannot move.`);return}o.removeNode(t);const i=e.host,s=i.kids.indexOf(e);if(s===void 0||s===-1)return;const r=n==="contain"||n==="left",h=r?s:s+1,u=i.kids.get(h+1),f=i.kids.get(h-1),d=e.next,l=e.prev;if(!r&&d?a.cache.mapElem.delete(d.unId):r&&l&&a.cache.mapElem.delete(l.unId),t.type=="tab")r?(f&&t.addBond(i,f),e.addBond(i,t)):(t.addBond(i,e),u&&u.addBond(i,t)),i.kids.insert(h,t),t.host=i,i.open=t.name,i.collapsed=!1;else if(t.type=="tabset"){const m=t.kids.peek(),p=t.kids.peekBack();r?(m&&f&&m.addBond(i,f),p&&e&&e.addBond(i,p)):(m&&e&&m.addBond(i,e),p&&u&&u.addBond(i,p)),i.kids.insertQueue(h,t.kids);for(const y of t.kids)y.host=i,y.next&&(y.next.host=i);i.open=p?p.name:"",i.collapsed=!1}o.updateChildDirections(i)}const ct={root:(o,t)=>o===t,tabset:(o,t)=>o!==t};function W(o,t,e,n,i){if(o.removeNode(t),t.type!=="tab"&&t.type!=="tabset")return;const s=a.cache.mapDirs.get(e.unId)===!1,r=n==="left"||n==="right",h=n==="top"||n==="left";let u=t;t.type==="tab"&&(u=new a({type:"tabset",host:e.host}),u.kids.enqueue(t),u.open=t.name,t.host=u),ct[i](s,r)?o.insertNodeWithNewParent(u,e,h):o.insertNode(e,u,h)}function ht(o,t,e,n){W(o,t,e,n,"root")}function ut(o,t,e,n){W(o,t,e,n,"tabset")}function lt(o,t,e,n){const i=t.host;if(t==c.root){const l=c.root.kids.peek(),m=c.root.kids.peekBack();n?(c.root.kids.enqueueFront(e),l&&l.addBond(c.root,e)):(c.root.kids.enqueue(e),m&&e.addBond(c.root,m)),e.host=c.root,o.updateChildDirections(c.root);return}if(!i){console.warn(`Destination node ${t.unId} has no host, cannot insert.`);return}const s=i.kids.indexOf(t);if(s===-1){console.warn(`Destination node ${t.unId} not found in its host's kids.`);return}const r=a.cache.mapDirs.get(i.unId);r&&a.cache.mapDirs.set(e.unId,!r);const h=i.kids.get(s+1),u=i.kids.get(s-1),f=t.next,d=t.prev;e.host=i,n?(i.kids.insert(s,e),t.addBond(i,e),u&&e.addBond(i,u),d&&a.cache.mapElem.delete(d.unId)):(i.kids.insert(s+1,e),e.addBond(i,t),h&&h.addBond(i,e),f&&a.cache.mapElem.delete(f.unId)),o.updateChildDirections(i)}function ft(o,t,e,n){const i=new g,s=new a({type:"tabset",host:e.host});if(!e||!t){console.warn(`Destination node ${e.unId} has no host, cannot insert.`);return}if(e===c.root){const h=new a({type:"row",host:e});if(e.kids.size()===0)e.kids.enqueue(t),t.host=e;else if(e.kids.size()==1&&e.kids.peek()?.type==="tabset"){const u=e.kids.dequeue();if(!u){console.warn(`No kid found in destination node ${e.unId}, cannot insert.`);return}n?(h.kids.enqueue(t),h.kids.enqueue(u),e.kids.enqueue(h),u.addBond(h,t)):(h.kids.enqueue(u),h.kids.enqueue(t),t.addBond(h,u),e.kids.enqueue(h)),t.host=h,u.host=h}else if(e.kids.size()==1&&e.kids.peek()?.type==="row"){const u=e.kids.peek(),f=u?.kids.peek(),d=u?.kids.peekBack();n&&u?(u.kids.enqueueFront(t),f&&f.addBond(u,t)):u&&(u.kids.enqueue(t),d&&t.addBond(u,d)),t.host=u}else if(e.kids.size()>1){const u=new a({type:"row",host:e}),f=new a({type:"row",host:u});for(const d of e.kids)f.kids.enqueue(d),d.host=f,d.next&&(d.next.host=f);t.host=u,e.kids.clear(),n?(u.kids.enqueueFront(t),u.kids.enqueue(f),f.addBond(u,t)):(u.kids.enqueue(f),u.kids.enqueue(t),t.addBond(u,f)),e.kids.enqueue(u)}o.updateChildDirections(e);return}t.host=e,s.host=e,s.kids=e.kids,s.open=e.open;const r=a.cache.mapDirs.get(e.unId);for(const h of s.kids)h.host=s,h.next&&(h.next.host=s),a.cache.mapDirs.set(h.unId,r);for(const h of t.kids)h.host=t,h.next&&(h.next.host=t),a.cache.mapDirs.set(h.unId,r);a.cache.mapDirs.set(s.unId,!r),a.cache.mapDirs.set(t.unId,!r),n?(i.enqueue(t),i.enqueue(s),e.kids=i,e.type="row",s.addBond(e,t)):(i.enqueue(s),i.enqueue(t),e.kids=i,e.type="row",t.addBond(e,s))}function mt(o,t){if(!t.host||!t.host.host){console.warn(`Source node ${t.unId} has no host, cannot move.`);return}const e=t.host,n=t.host.host,i=n.kids.indexOf(e),s=n.kids.get(i-1),r=n.kids.get(i+1),h=t.kids.peek(),u=t.kids.peekBack();o.removeKid(e);let f=i;if(t.type=="row"&&e){s&&h&&h.addBond(n,s),r&&u&&r.addBond(n,u);for(const d of t.kids)d.host=n,d.next&&(d.next.host=n),n.kids.insert(f,d),a.cache.mapDirs.set(d.unId,!a.cache.mapDirs.get(n.unId)),a.cache.dimMins.delete(d.unId),f++}else if(t.type=="tabset"){s&&t.addBond(n,s),r&&r.addBond(n,t),n.kids.insert(f,t),t.host=n,a.cache.mapDirs.set(t.unId,!a.cache.mapDirs.get(n.unId));for(const d of t.kids)a.cache.mapDirs.set(d.unId,a.cache.mapDirs.get(n.unId)),a.cache.dimMins.delete(d.unId)}}function pt(o,t=!0){const e=o.host,n=o.prev,i=o.next;if(o.host=null,o.next=null,o.prev=null,n&&(n.next=null),i&&(i.prev=null),!t)return o;n&&i&&n.prev&&i.next?n.prev.addBond(e,i.next):n&&n.prev?n.prev.next=null:i&&i.next&&(i.next.prev=null)}function It(o,t){if(!t.host){console.warn("Kid node has no host, cannot remove.");return}const e=t?.host,n=e?.host;if(o.removeKid(t),t.type==="tabset"&&e.kids.size()===1){const i=e.kids.peek();i&&o.moveAdjacentNodeToGrandParent(i)}else if(t.type==="tab"&&e.kids.size()===0&&n.kids.size()===2){o.removeKid(e);const i=n?.kids.peek();i&&o.moveAdjacentNodeToGrandParent(i)}else if(t.type==="tab"&&e.kids.size()===0&&n.kids.size()>2)o.removeKid(e);else if(t.type==="tab"&&e.open===t.name&&e.kids.size()>0){const i=e.kids.peek();i&&(e.open=i.name)}}function yt(o){if(!o.host){console.warn("Kid node has no host, cannot remove.");return}const t=o.host,e=t.kids.indexOf(o),n=t.kids.get(e+1),i=t.kids.get(e-1),s=o.next,r=o.prev;if(e===-1){console.warn("Kid node not found in its host's kids.");return}s&&a.cache.mapElem.delete(s.unId),r&&a.cache.mapElem.delete(r.unId),n&&i?n.addBond(t,i):n?n.prev=null:i&&(i.next=null),t.kids.removeAt(e),a.cache.mapElem.delete(o.unId),a.cache.dimMins.delete(o.unId),a.cache.mapDirs.delete(o.unId),a.cache.tabCnts.delete(o.unId),o.type==="tabset"&&a.cache.mapElem.delete(o.unId),o.type==="tab"&&a.cache.mapElem.delete(o.unId),o.host=null,o.next=null,o.prev=null}function wt(){a.cache.dimMins.clear(),a.cache.mapDirs.clear(),a.cache.tabCnts.clear(),a.cache.mapElem.clear(),a.cache.nodOpts.get().clear(),a.cache.bndOpts.get().clear()}class b{static get _root(){return c.root}static set _root(t){c.root=t}static get _tree(){return c.tree}static set _tree(t){c.tree=t}static get _minW(){return c.minW}static set _minW(t){c.minW=t}static get _minH(){return c.minH}static set _minH(t){c.minH=t}static get _bond(){return c.bond}static set _bond(t){c.bond=t}static get _inst(){return c.inst}static set _inst(t){c.inst=t}nodeOps;cntdown=null;tabsIds=new Map;constructor(t={}){const e={tabs:[],tree:null,minW:40,minH:40,bond:10,uqid:"dynamix-layout-root",tabsIds:new Map,...t};this.tabsIds=e.tabsIds,c.createId=e.createId??S,c.timer=e.timer??R,c.collapsedSize=e.collapsedSize??e.minH,b._tree=e.tree??null,c.maximized=e.tree?.nodMaxd??null,b._root=new a({unId:e.uqid,name:e.uqid,type:"row"}),this.nodeOps=T(new Map,v),b._minW=e.minW,b._minH=e.minH,b._bond=e.bond;const n=new g(e.tabs.length,e.tabs);b._tree?this.createNodeLayout():this.createBinaryNodeTreeFromQueue(n),b._inst=this}*JSONLayoutIterator(t){yield*P(t)}*NodeLayoutIterator(t){yield*K(t)}*NodeLayoutRecursiveIterator(t){yield*U(this,t)}updateChildDirections(t){return $(this,t)}createNodeLayout(t=b._tree){return _(this,t)}createNodeTreeFromJSONTree(t,e){return Y(this,t,e)}createBinaryNodeTreeFromQueue(t,e=b._root){return G(this,t,e)}createNodeFromJSON(t){return J(this,t)}calcTabsetCountAndMinDim(t=b._root,e=!0){return Z(this,t,e)}pruneStaleDirections(){return tt()}calculateRootAdjustment(){return et()}calcDimensions(t=b._root,e=!1){return nt(this,t,e)}updateDimension(t,e=!1,n=2){return it(this,t,e,n)}updateSlider(t,e,n=!1,i=2){return ot(this,t,e,n,i)}updateSliderDimension(t,e){return st(this,t,e)}updateTree(t,e,n){return at(this,t,e,n)}isOnlyContent(t){return rt(this,t)}moveNodeAsTab(t,e,n){return dt(this,t,e,n)}moveRelativeToRoot(t,e,n){return ht(this,t,e,n)}moveRelativeToTabset(t,e,n){return ut(this,t,e,n)}insertNode(t,e,n){return lt(this,t,e,n)}insertNodeWithNewParent(t,e,n){return ft(this,t,e,n)}moveAdjacentNodeToGrandParent(t){return mt(this,t)}removeRelation(t,e=!0){return pt(t,e)}removeNode(t){return It(this,t)}removeKid(t){return yt(t)}clearAllCache(){return wt()}get maximizedId(){return M()?.unId??null}maximize(t){return q(this,t)}restore(){return F(this)}toggleMaximize(t){return V(this,t)}collapse(t){return B(this,t)}expand(t){return C(this,t)}toggleCollapse(t){return X(this,t)}}const bt=6;function kt(o,t,e){const{left:n,top:i,width:s,height:r}=o,h=t-n,u=e-i;return h<s/3?{area:"left",left:n,top:i,width:s/2,height:r}:h>2*s/3?{area:"right",left:n+s/2,top:i,width:s/2,height:r}:u<r/3?{area:"top",left:n,top:i,width:s,height:r/2}:u>2*r/3?{area:"bottom",left:n,top:i+r/2,width:s,height:r/2}:{area:"contain",left:n+s*.1,top:i+r*.1,width:s*.8,height:r*.8}}function gt(o,t){const{x:e,y:n,w:i,h:s}=o;switch(t){case"left":return{area:t,left:e,top:n,width:i/2,height:s};case"right":return{area:t,left:e+i/2,top:n,width:i/2,height:s};case"top":return{area:t,left:e,top:n,width:i,height:s/2};case"bottom":return{area:t,left:e,top:n+s/2,width:i,height:s/2}}}function Nt(o,t,e,n){if(t.length===0||n<o.top||n>o.bottom)return null;const i=t[0],s=t[t.length-1];let r=bt;if(e>s.right)return{index:t.length-1,area:"right",left:s.right+1,top:s.top,width:r-2,height:s.height};if(e<i.left)return{index:0,area:"left",left:i.left-r+1,top:i.top,width:r-2,height:i.height};let h=0,u=1/0,f=!1;t.forEach((m,p)=>{const y=m.left+m.width/2,w=Math.abs(e-y);w<u&&(u=w,h=p,f=e<y)});const d=f?h>0:h<t.length-1;t.length>1&&d&&(r=t[1].left-i.right);const l=t[h];return{index:h,area:f?"left":"right",left:f?l.left-r+1:l.right+1,top:l.top,width:r-2,height:l.height}}function xt(o,t){return o.area===t.area&&o.left===t.left&&o.top===t.top&&o.width===t.width&&o.height===t.height}function L(o,{x:t,y:e,w:n,h:i}){o.style.left=`${t}px`,o.style.top=`${e}px`,o.style.width=`${n}px`,o.style.height=`${i}px`}function Tt(o,t){return{x:o.x,y:o.y+t,w:o.w,h:Math.max(0,o.h-t)}}function vt(o,t){const{x:e,y:n,w:i,h:s}=o.nodDims,r=o.nodeDir===!1;return o.nodFold&&r?{rect:{x:e+i,y:n,w:s,h:i},rotated:!0}:{rect:{x:e,y:n,w:i,h:t},rotated:!1}}function Et(o,t){L(o,t.rect),o.style.transformOrigin="0 0",o.style.transform=t.rotated?"rotate(90deg)":""}function Dt(o){let t=null,e=null;const n=()=>{e=null;const i=t;t=null,i&&o(i.value)};return{schedule(i){t={value:i},e===null&&(e=requestAnimationFrame(n))},flush(){e!==null&&(cancelAnimationFrame(e),n())},cancel(){e!==null&&cancelAnimationFrame(e),e=null,t=null}}}(()=>{if(typeof window>"u")return;const o="color: #03A9F4; font-weight: bold; line-height: 1.2;",t="color: #E0E0E0; font-size: 12px;",e="color: #42a5f5; font-size: 12px;",n="color: #9E9E9E; font-size: 10px;",i=`
2
2
  ██████╗ ██╗ ██╗ ███╗ ██╗ █████╗ ███╗ ███╗ ██████╗ ██╗ ██╗
3
3
  ██╔══██╗╚██╗ ██╔╝ ████╗ ██║ ██╔══██╗ ████╗ ████║ ╚═██╔═╝ ╚██╗██╔╝
4
4
  ██║ ██║ ╚████╔╝ ██╔██╗ ██║ ███████║ ██╔████╔██║ ██║ ╚███╔╝
@@ -54,4 +54,4 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
54
54
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
55
55
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56
56
  SOFTWARE.
57
- `,__LAYOUT__:w})})(),I.Bond=O,I.DynamixLayoutCore=w,I.Node=a,I.Queue=b,I.areNodeOptionsEqual=x,I.areNodeOptionsMapEqual=E,I.createFrameScheduler=lt,I.createReactiveState=v,I.getNavbarDropPreview=dt,I.getRootSplitPreview=rt,I.getTabBodyRect=ut,I.getTabsetDropPreview=at,I.isSameDropPreview=ct,I.setElementRect=ht,Object.defineProperty(I,Symbol.toStringTag,{value:"Module"})}));
57
+ `,__LAYOUT__:b})})(),I.Bond=D,I.DynamixLayoutCore=b,I.Node=a,I.Queue=g,I.areNodeOptionsEqual=A,I.areNodeOptionsMapEqual=v,I.createFrameScheduler=Dt,I.createReactiveState=T,I.getNavbarDropPreview=Nt,I.getRootSplitPreview=gt,I.getTabBodyRect=Tt,I.getTabbarPlacement=vt,I.getTabsetDropPreview=kt,I.isSameDropPreview=xt,I.placeTabbar=Et,I.setElementRect=L,Object.defineProperty(I,Symbol.toStringTag,{value:"Module"})}));
@@ -84,6 +84,8 @@ export declare class DynamixLayoutCore {
84
84
  createId?: () => string;
85
85
  /** Schedules deferred updates (default `setTimeout`/`clearTimeout`). */
86
86
  timer?: Timer;
87
+ /** Size of a folded tabset along its row; pass the tab bar height. */
88
+ collapsedSize?: number;
87
89
  });
88
90
  JSONLayoutIterator(root: LayoutTree): IterableIterator<LayoutTree>;
89
91
  NodeLayoutIterator(root: Node_2): IterableIterator<Node_2>;
@@ -118,6 +120,18 @@ export declare class DynamixLayoutCore {
118
120
  removeNode(src: Node_2): void;
119
121
  removeKid(kid: Node_2): void;
120
122
  clearAllCache(): void;
123
+ /** Uid of the maximized tabset, or null. */
124
+ get maximizedId(): string | null;
125
+ /** Show one tabset over the whole layout; the others stay mounted. */
126
+ maximize(id: string): boolean;
127
+ /** Leave maximized mode; the previous split is restored exactly. */
128
+ restore(): boolean;
129
+ toggleMaximize(id: string): boolean;
130
+ /** Fold a tabset to a strip along its row (its tab bar). */
131
+ collapse(id: string): boolean;
132
+ /** Unfold a tabset; it returns to its previous size. */
133
+ expand(id: string): boolean;
134
+ toggleCollapse(id: string): boolean;
121
135
  }
122
136
 
123
137
  export declare interface FrameScheduler<T> {
@@ -144,6 +158,13 @@ export declare function getNavbarDropPreview(navbarRect: PreviewRect, tabRects:
144
158
  */
145
159
  export declare function getRootSplitPreview(container: Dimension, side: RootSide): DropPreview;
146
160
 
161
+ /**
162
+ * Where a tabset's tab bar goes. A folded tabset in a side-by-side row shows
163
+ * its tab bar rotated 90 degrees: an element `h` wide and `w` tall, rotated
164
+ * around its top-left corner and placed at `x + w`, covers exactly the strip.
165
+ */
166
+ export declare function getTabbarPlacement(tabset: Pick<NodeOptions, 'nodDims' | 'nodFold' | 'nodeDir'>, tabbarHeight: number): TabbarPlacement;
167
+
147
168
  /**
148
169
  * Area of a tabset below its tab bar; never negative when squeezed.
149
170
  * @deprecated Replaced in 2.0 by `getTabContentRect(tabsetRect, tabBarHeight)`. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md
@@ -163,6 +184,10 @@ export declare function isSameDropPreview(a: Partial<DropPreview>, b: DropPrevie
163
184
  /** @deprecated Replaced in 2.0 by `LayoutJSON` (v1 trees load automatically; `LayoutTreeV1` describes this shape). See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
164
185
  export declare type LayoutTree = Omit<BaseNode, 'nodeDir' | 'nodDims'> & {
165
186
  nodKids?: LayoutTree[];
187
+ /** Tabset only: folded to a strip along its parent row. */
188
+ nodFold?: boolean;
189
+ /** Root only: uid of the maximized tabset. */
190
+ nodMaxd?: string;
166
191
  };
167
192
 
168
193
  /** @deprecated Internal; removed in 2.0. Read layout state from `layout.getSnapshot()` / `subscribe()`. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
@@ -178,6 +203,10 @@ declare class Node_2 {
178
203
  part: number;
179
204
  host: Node_2 | null;
180
205
  open: string;
206
+ /** Tabset only: folded to a strip along its parent row. */
207
+ collapsed: boolean;
208
+ /** Fold order, used to pick which sibling to unfold. */
209
+ foldedAt: number;
181
210
  constructor(options?: {
182
211
  type?: 'row' | 'tabset' | 'tab' | 'bond';
183
212
  host?: Node_2 | null;
@@ -216,12 +245,26 @@ export declare interface NodeCache {
216
245
  /** @deprecated Replaced in 2.0 by `TabsetState`, `SplitterState`, `TabState` and `snapshot.rects`. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
217
246
  export declare interface NodeOptions extends BaseNode {
218
247
  nodKids?: BaseNode[];
248
+ /** Tabset: folded to a strip (ignored while it is maximized). */
249
+ nodFold?: boolean;
250
+ /** Tabset: currently maximized over the whole layout. */
251
+ nodMaxd?: boolean;
252
+ /** Hidden because another tabset is maximized (content stays mounted). */
253
+ nodHidden?: boolean;
254
+ /** Bond: next to a folded tabset, so it cannot be dragged. */
255
+ nodLocked?: boolean;
256
+ /** Tabset: can be folded (it has siblings in its row). */
257
+ nodFoldable?: boolean;
258
+ /** Tabset: can be maximized (the layout has more than one tabset). */
259
+ nodMaximizable?: boolean;
219
260
  }
220
261
 
221
262
  export declare type NodeType = 'row' | 'tabset' | 'tab';
222
263
 
223
264
  export declare type NodeTypeWithBond = NodeType | 'bond';
224
265
 
266
+ export declare function placeTabbar(el: HTMLElement, placement: TabbarPlacement): void;
267
+
225
268
  export declare type PreviewRect = Pick<DOMRect, 'left' | 'top' | 'right' | 'bottom' | 'width' | 'height'>;
226
269
 
227
270
  /** @deprecated Internal; removed in 2.0. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
@@ -462,6 +505,13 @@ export declare type RootSide = Exclude<DropArea, 'contain'>;
462
505
  /** @deprecated Replaced in 2.0 by `applyRect(element, rect)`. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
463
506
  export declare function setElementRect(el: HTMLElement, { x, y, w, h }: Dimension): void;
464
507
 
508
+ export declare interface TabbarPlacement {
509
+ /** Box to give the tab bar element before `rotated` is applied. */
510
+ rect: Dimension;
511
+ /** Folded tabset in a side-by-side row: the bar is drawn as a vertical strip. */
512
+ rotated: boolean;
513
+ }
514
+
465
515
  export declare type TabsIds = Map<string, string>;
466
516
 
467
517
  declare type Timer = {
@@ -84,6 +84,8 @@ export declare class DynamixLayoutCore {
84
84
  createId?: () => string;
85
85
  /** Schedules deferred updates (default `setTimeout`/`clearTimeout`). */
86
86
  timer?: Timer;
87
+ /** Size of a folded tabset along its row; pass the tab bar height. */
88
+ collapsedSize?: number;
87
89
  });
88
90
  JSONLayoutIterator(root: LayoutTree): IterableIterator<LayoutTree>;
89
91
  NodeLayoutIterator(root: Node_2): IterableIterator<Node_2>;
@@ -118,6 +120,18 @@ export declare class DynamixLayoutCore {
118
120
  removeNode(src: Node_2): void;
119
121
  removeKid(kid: Node_2): void;
120
122
  clearAllCache(): void;
123
+ /** Uid of the maximized tabset, or null. */
124
+ get maximizedId(): string | null;
125
+ /** Show one tabset over the whole layout; the others stay mounted. */
126
+ maximize(id: string): boolean;
127
+ /** Leave maximized mode; the previous split is restored exactly. */
128
+ restore(): boolean;
129
+ toggleMaximize(id: string): boolean;
130
+ /** Fold a tabset to a strip along its row (its tab bar). */
131
+ collapse(id: string): boolean;
132
+ /** Unfold a tabset; it returns to its previous size. */
133
+ expand(id: string): boolean;
134
+ toggleCollapse(id: string): boolean;
121
135
  }
122
136
 
123
137
  export declare interface FrameScheduler<T> {
@@ -144,6 +158,13 @@ export declare function getNavbarDropPreview(navbarRect: PreviewRect, tabRects:
144
158
  */
145
159
  export declare function getRootSplitPreview(container: Dimension, side: RootSide): DropPreview;
146
160
 
161
+ /**
162
+ * Where a tabset's tab bar goes. A folded tabset in a side-by-side row shows
163
+ * its tab bar rotated 90 degrees: an element `h` wide and `w` tall, rotated
164
+ * around its top-left corner and placed at `x + w`, covers exactly the strip.
165
+ */
166
+ export declare function getTabbarPlacement(tabset: Pick<NodeOptions, 'nodDims' | 'nodFold' | 'nodeDir'>, tabbarHeight: number): TabbarPlacement;
167
+
147
168
  /**
148
169
  * Area of a tabset below its tab bar; never negative when squeezed.
149
170
  * @deprecated Replaced in 2.0 by `getTabContentRect(tabsetRect, tabBarHeight)`. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md
@@ -163,6 +184,10 @@ export declare function isSameDropPreview(a: Partial<DropPreview>, b: DropPrevie
163
184
  /** @deprecated Replaced in 2.0 by `LayoutJSON` (v1 trees load automatically; `LayoutTreeV1` describes this shape). See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
164
185
  export declare type LayoutTree = Omit<BaseNode, 'nodeDir' | 'nodDims'> & {
165
186
  nodKids?: LayoutTree[];
187
+ /** Tabset only: folded to a strip along its parent row. */
188
+ nodFold?: boolean;
189
+ /** Root only: uid of the maximized tabset. */
190
+ nodMaxd?: string;
166
191
  };
167
192
 
168
193
  /** @deprecated Internal; removed in 2.0. Read layout state from `layout.getSnapshot()` / `subscribe()`. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
@@ -178,6 +203,10 @@ declare class Node_2 {
178
203
  part: number;
179
204
  host: Node_2 | null;
180
205
  open: string;
206
+ /** Tabset only: folded to a strip along its parent row. */
207
+ collapsed: boolean;
208
+ /** Fold order, used to pick which sibling to unfold. */
209
+ foldedAt: number;
181
210
  constructor(options?: {
182
211
  type?: 'row' | 'tabset' | 'tab' | 'bond';
183
212
  host?: Node_2 | null;
@@ -216,12 +245,26 @@ export declare interface NodeCache {
216
245
  /** @deprecated Replaced in 2.0 by `TabsetState`, `SplitterState`, `TabState` and `snapshot.rects`. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
217
246
  export declare interface NodeOptions extends BaseNode {
218
247
  nodKids?: BaseNode[];
248
+ /** Tabset: folded to a strip (ignored while it is maximized). */
249
+ nodFold?: boolean;
250
+ /** Tabset: currently maximized over the whole layout. */
251
+ nodMaxd?: boolean;
252
+ /** Hidden because another tabset is maximized (content stays mounted). */
253
+ nodHidden?: boolean;
254
+ /** Bond: next to a folded tabset, so it cannot be dragged. */
255
+ nodLocked?: boolean;
256
+ /** Tabset: can be folded (it has siblings in its row). */
257
+ nodFoldable?: boolean;
258
+ /** Tabset: can be maximized (the layout has more than one tabset). */
259
+ nodMaximizable?: boolean;
219
260
  }
220
261
 
221
262
  export declare type NodeType = 'row' | 'tabset' | 'tab';
222
263
 
223
264
  export declare type NodeTypeWithBond = NodeType | 'bond';
224
265
 
266
+ export declare function placeTabbar(el: HTMLElement, placement: TabbarPlacement): void;
267
+
225
268
  export declare type PreviewRect = Pick<DOMRect, 'left' | 'top' | 'right' | 'bottom' | 'width' | 'height'>;
226
269
 
227
270
  /** @deprecated Internal; removed in 2.0. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
@@ -462,6 +505,13 @@ export declare type RootSide = Exclude<DropArea, 'contain'>;
462
505
  /** @deprecated Replaced in 2.0 by `applyRect(element, rect)`. See https://github.com/xcode-studio/dynamix-layout/blob/main/docs/migration-v1-to-v2.md */
463
506
  export declare function setElementRect(el: HTMLElement, { x, y, w, h }: Dimension): void;
464
507
 
508
+ export declare interface TabbarPlacement {
509
+ /** Box to give the tab bar element before `rotated` is applied. */
510
+ rect: Dimension;
511
+ /** Folded tabset in a side-by-side row: the bar is drawn as a vertical strip. */
512
+ rotated: boolean;
513
+ }
514
+
465
515
  export declare type TabsIds = Map<string, string>;
466
516
 
467
517
  declare type Timer = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamix-layout/core",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "description": "Dynamix Layout/Core is a JavaScript package for creating dynamic layouts with ease.",
5
5
  "keywords": [
6
6
  "dynamix-layout",