@a-multilayout-splitter/core 6.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";var Je=Object.defineProperty;var Ze=(t,e,n)=>e in t?Je(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var te=(t,e,n)=>Ze(t,typeof e!="symbol"?e+"":e,n);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const H=require("react/jsx-runtime"),c=require("react");function Qe(t,e){e?(t.classList.add("a-split-hidden"),t.style.flexGrow="0",t.style.flexShrink="0",t.style.flexBasis="0"):(t.classList.remove("a-split-hidden"),t.style.flexGrow="",t.style.flexShrink="")}function ve(t,e,n={}){return new Promise(s=>{const l=n.duration||300;if(!n.animate){t.style.flexBasis=e,s();return}t.style.transition=`flex-basis ${l}ms ease`,t.offsetHeight,t.style.flexBasis=e,setTimeout(()=>{t.style.transition="",s()},l)})}function Ke(t){return{...t,collapsed:!t.collapsed}}function et(t,e){return t.findIndex(n=>n.id===e)}function Ce(t){return!t.collapsed}function tt(t){return t.filter(Ce)}function nt(t){return document.querySelector(`[data-pane-id="${t}"]`)}function rt(t,e,n){return Math.max(e,Math.min(n,t))}function st(t,e,n,s={}){return{id:t,size:e,content:n,collapsed:s.collapsed??!1,minSize:s.minSize??0,maxSize:s.maxSize??100}}function it(t,e){return{...t,size:e}}function at(t,e){return t.map(n=>{const s=e.get(n.id);return s?{...n,...s}:n})}function ot(t,e){return{...t,size:e.size,collapsed:e.collapsed}}function lt(t){return{id:t.id,size:t.size,collapsed:t.collapsed}}function Ee(t,e){return!0}function ne(t,e){return typeof e=="boolean"?e:Array.isArray(e)?e.length>0&&typeof e[0]=="boolean"?e[t-1]===!0:e.includes(t):!1}function re(t,e){return typeof e=="boolean"?e:Array.isArray(e)?e.length>0&&typeof e[0]=="boolean"?e[t-1]!==!1:e.includes(t):!0}function se(t,e){return typeof e=="boolean"?e:Array.isArray(e)?e.length>0&&typeof e[0]=="boolean"?e[t-1]===!0:e.includes(t):!1}function $e(t,e=[],n=[],s=[],l=[],w="split"){const[h,z]=c.useState(()=>c.Children.toArray(t).map((g,p)=>({id:`${w}-pane-${p}`,size:e[p]||"100%",collapsed:n[p]||!1,minSize:s[p]||0,maxSize:l[p]||100,content:g}))),C=c.useRef(t);c.useEffect(()=>{const o=c.Children.toArray(t),g=c.Children.toArray(C.current);o.length===h.length&&z(p=>{let r=!1;const i=p.map((a,u)=>{const S=o[u],A=g[u];return S!==A?(r=!0,{...a,content:S}):a});return r?i:p}),C.current=t},[t,h.length]);const P=c.useCallback(o=>{z(g=>{const p=o.position??g.length,r={id:`${w}-pane-${Date.now()}`,size:o.size,collapsed:o.collapsed||!1,minSize:o.minSize||0,maxSize:o.maxSize||100,content:o.content},i=[...g];return i.splice(p,0,r),ct(i,p,o.size)})},[w]),v=c.useCallback(o=>{z(g=>{if(o<0||o>=g.length)return g;const p=[...g],r=p.splice(o,1)[0];return r?ut(p,r.size):p})},[]),d=c.useCallback(o=>{z(g=>{if(o<0||o>=g.length)return g;const p=g[o];if(!p)return g;const r=[...g];r[o]={...p,collapsed:!p.collapsed};const i=document.querySelector(`[data-pane-id="${p.id}"]`);if(i){const a=r[o];(a==null?void 0:a.collapsed)??!1?(i.classList.add("a-split-hidden"),i.style.flexGrow="0"):(i.classList.remove("a-split-hidden"),i.style.flexGrow="")}return r})},[]),b=c.useCallback((o,g,p)=>{z(r=>{if(o<0||o>=r.length)return r;const i=r[o];if(!i)return r;const a=[...r];a[o]={...i,size:g,flexGrow:void 0};const u=document.querySelector(`[data-pane-id="${i.id}"]`);return u&&ve(u,g,p||{animate:!1}),a})},[]),m=c.useCallback(()=>h,[h]),E=c.useCallback(o=>{z(g=>{const p=[...o].sort((a,u)=>u-a);let r=[...g],i=0;if(p.forEach(a=>{if(a>=0&&a<r.length){const u=r.splice(a,1)[0];u&&(i+=parseFloat(u.size)||0)}}),r.length>0&&i>0){const a=i/r.length;r=r.map(u=>({...u,size:`${(parseFloat(u.size)||0)+a}%`}))}return r})},[]),D=c.useCallback((o,g)=>{z(p=>{if(o<0||o>=p.length||g<0||g>=p.length||o===g)return p;const r=[...p],i=r[o];return r[o]=r[g],r[g]=i,r})},[]),I=c.useCallback((o,g)=>{z(p=>{if(o<0||o>=p.length)return p;const r=p[o];if(!r||r.collapsed)return p;const i=g==null?void 0:g.direction;let a;i==="left"?a=o+1:i==="right"?a=o-1:a=o<p.length-1?o+1:o-1;const u=p.map((S,A)=>A===o?{...S,collapsed:!0,flexGrow:0}:A===a&&!S.collapsed?{...S,flexGrow:1}:S.collapsed?S:{...S,flexGrow:0});if(g!=null&&g.animate){const S=document.querySelector(`[data-pane-id="${r.id}"]`);S&&(S.style.transition=`flex-basis ${g.duration||300}ms ease`,setTimeout(()=>{S.style.transition=""},g.duration||300))}return u})},[]),M=c.useCallback((o,g)=>{z(p=>{if(o<0||o>=p.length)return p;const r=p[o];if(!r||!r.collapsed)return p;const i=p.filter(S=>!S.collapsed).length+1,a=p.length;let u=[...p];if(u[o]={...r,collapsed:!1,flexGrow:void 0},i===a)u=u.map(S=>({...S,flexGrow:void 0}));else{const S=g==null?void 0:g.direction;let A;if(S==="left"?A=o+1:S==="right"?A=o-1:A=o<p.length-1?o+1:o-1,A>=0&&A<u.length){const L=u[A];L&&L.flexGrow===1&&(u[A]={...L,flexGrow:void 0})}}if(g!=null&&g.animate){const S=document.querySelector(`[data-pane-id="${r.id}"]`);S&&(S.style.transition=`flex-basis ${g.duration||300}ms ease`,setTimeout(()=>{S.style.transition=""},g.duration||300))}return u})},[]),N=c.useCallback((o,g)=>{z(p=>{if(o<0||o>=p.length)return p;const r=p[o];if(!r)return p;const i=parseFloat(r.size)||0,a=Math.max(r.minSize||0,Math.min(r.maxSize||100,i+g)),u=[...p];u[o]={...r,size:`${a}%`};const S=document.querySelector(`[data-pane-id="${r.id}"]`);return S&&(S.style.flexBasis=`${a}%`),u})},[]);return{panes:h,addPane:P,removePane:v,togglePane:d,setPaneSize:b,getPaneState:m,removePanes:E,swapPanes:D,collapsePane:I,expandPane:M,resizePane:N}}function ct(t,e,n){const s=parseFloat(n);if(!n.includes("%"))return t;const h=t.filter((C,P)=>P!==e).reduce((C,P)=>C+parseFloat(P.size),0),z=(100-s)/h;return t.map((C,P)=>{if(P===e)return C;const d=parseFloat(C.size)*z;return{...C,size:C.size.includes("%")?`${d}%`:C.size}})}function ut(t,e){if(t.length===0)return t;const n=parseFloat(e);if(!e.includes("%"))return t;const l=n/t.length;return t.map(w=>{if(!w.size.includes("%"))return w;const z=parseFloat(w.size)+l;return{...w,size:`${z}%`}})}function ke(t,e){let n=null,s=0;return function(...w){const h=Date.now();h-s>=e?(t(...w),s=h):(n&&clearTimeout(n),n=setTimeout(()=>{t(...w),s=Date.now()},e-(h-s)))}}function Ie(t,e){let n=null;return function(...l){n&&clearTimeout(n),n=setTimeout(()=>{t(...l)},e)}}function Ae(t,e,n={}){const{onDragStart:s,onDragMove:l,onDragEnd:w}=n,h=c.useRef(null),z=c.useRef(null),C=c.useCallback((b,m)=>{var u,S;m.preventDefault(),m.stopPropagation();const E=m.target;if(E.closest("button")||E.tagName==="BUTTON")return;const D=t.current;if(!D)return;const I=Array.from(D.children),M=(b-1)*2,N=b*2,o=I[M],g=I[N];if(!o||!g||o.classList.contains("a-split-hidden")||g.classList.contains("a-split-hidden"))return;const p="touches"in m?((u=m.touches[0])==null?void 0:u.clientX)??0:m.clientX,r="touches"in m?((S=m.touches[0])==null?void 0:S.clientY)??0:m.clientY,i=Array.from(D.querySelectorAll(".a-split-handlebar")).filter(A=>A.parentElement===D);let a=0;i.forEach(A=>{const L=A,k=window.getComputedStyle(L);if(e==="horizontal"){const j=parseFloat(k.marginLeft)||0,_=parseFloat(k.marginRight)||0;a+=L.offsetWidth+j+_}else{const j=parseFloat(k.marginTop)||0,_=parseFloat(k.marginBottom)||0;a+=L.offsetHeight+j+_}}),h.current={active:!0,paneIndex:b,startX:p,startY:r,prevElement:o,nextElement:g,prevInitialWidth:o.offsetWidth,nextInitialWidth:g.offsetWidth,prevInitialHeight:o.offsetHeight,nextInitialHeight:g.offsetHeight,containerWidth:D.offsetWidth-(e==="horizontal"?a:0),containerHeight:D.offsetHeight-(e==="vertical"?a:0),minPrevSize:parseFloat(o.getAttribute("data-min-size")||"0"),maxPrevSize:parseFloat(o.getAttribute("data-max-size")||"100"),minNextSize:parseFloat(g.getAttribute("data-min-size")||"0"),maxNextSize:parseFloat(g.getAttribute("data-max-size")||"100")},z.current=null,s==null||s({paneIndex:b})},[t,s,e]),P=c.useCallback(b=>{var k,j;const m=h.current;if(!(m!=null&&m.active))return null;const E=e==="horizontal",D="touches"in b?((k=b.touches[0])==null?void 0:k.clientX)??0:b.clientX,I="touches"in b?((j=b.touches[0])==null?void 0:j.clientY)??0:b.clientY,M=E?D-m.startX:I-m.startY,N=E?m.containerWidth:m.containerHeight,o=E?m.prevInitialWidth:m.prevInitialHeight,g=E?m.nextInitialWidth:m.nextInitialHeight;let p=o+M,r=g-M;p<0&&(p=0),r<0&&(r=0);const i=p/N*100,a=r/N*100,u=i<=m.minPrevSize,S=i>=m.maxPrevSize,A=a<=m.minNextSize,L=a>=m.maxNextSize;return u||S||A||L?null:{prevSize:i,nextSize:a,prevSizePx:p,nextSizePx:r,state:m}},[e]),v=c.useCallback(ke(b=>{const m=P(b);if(!m)return;const{prevSize:E,nextSize:D,prevSizePx:I,nextSizePx:M,state:N}=m,{prevInitialWidth:o,prevInitialHeight:g}=N,p=e==="horizontal"?o:g;Math.abs(m.prevSizePx-p)<=1||(z.current={prevSize:E,nextSize:D},requestAnimationFrame(()=>{if(!N.prevElement||!N.nextElement)return;const r=N.prevElement.style.flexBasis.includes("%"),i=N.nextElement.style.flexBasis.includes("%");r?N.prevElement.style.flexBasis=`${E}%`:N.prevElement.style.flexBasis=`${I}px`,i?N.nextElement.style.flexBasis=`${D}%`:N.nextElement.style.flexBasis=`${M}px`}),l==null||l({paneIndex:N.paneIndex,prevSize:E,nextSize:D}))},16),[P,e,l]),d=c.useCallback(b=>{const m=h.current;if(!(m!=null&&m.active))return;const E=P(b);E&&(z.current={prevSize:E.prevSize,nextSize:E.nextSize});const D=z.current;D&&(w==null||w({paneIndex:m.paneIndex,prevSize:D.prevSize,nextSize:D.nextSize})),h.current=null,z.current=null},[P,w]);return c.useEffect(()=>{const b=v,m=d;return window.addEventListener("mousemove",b),window.addEventListener("mouseup",m),window.addEventListener("touchmove",b,{passive:!1}),window.addEventListener("touchend",m),()=>{window.removeEventListener("mousemove",b),window.removeEventListener("mouseup",m),window.removeEventListener("touchmove",b),window.removeEventListener("touchend",m)}},[v,d]),{handleMouseDown:C}}function De(t,e,n){const s=c.useCallback(Ie(h=>{if(t)try{const z=`${e}-${n}`,C=h.map(P=>({id:P.id,size:P.size,collapsed:P.collapsed}));localStorage.setItem(z,JSON.stringify(C))}catch(z){console.warn("Failed to save split state to localStorage:",z)}},300),[t,e,n]),l=c.useCallback(()=>{if(!t)return null;try{const h=`${e}-${n}`,z=localStorage.getItem(h);return z?JSON.parse(z):null}catch(h){return console.warn("Failed to load split state from localStorage:",h),null}},[t,e,n]),w=c.useCallback(()=>{if(t)try{const h=`${e}-${n}`;localStorage.removeItem(h)}catch(h){console.warn("Failed to clear split state from localStorage:",h)}},[t,e,n]);return{save:s,load:l,clear:w}}function Fe(t,e,n,s){const l=c.useRef(e),w=c.useRef(n);return l.current=e,w.current=n,c.useMemo(()=>({splitId:t,getState:()=>l.current(),dispatch:z=>w.current(z),getElement:()=>s.current,getPanes:()=>l.current().panes}),[t,s])}const He=c.createContext(0);function ie(){return c.useContext(He)}const Z=({level:t=0,children:e})=>H.jsx(He.Provider,{value:t,children:e});Z.displayName="NestingProvider";function dt(t){const e=n=>{const s=ie();return H.jsx(Z,{level:s+1,children:H.jsx(t,{...n})})};return e.displayName=`withNesting(${t.displayName||t.name||"Component"})`,e}const ae=({index:t,mode:e,disabled:n,lineBar:s,onMouseDown:l,onTouchStart:w,onCollapse:h,onExpand:z,renderCustom:C,leftPaneCollapsed:P=!1,rightPaneCollapsed:v=!1,explicitlyDisabled:d=!1})=>{if(C){const a={index:t,mode:e,disabled:n,lineBar:s,onMouseDown:l,onTouchStart:w||l,onCollapse:h,onExpand:z};return H.jsx("div",{className:"a-split-handlebar",onMouseDown:u=>!n&&l(u),onTouchStart:u=>!n&&(w?w(u):l(u)),children:C(a,t)})}const b=["a-split-handlebar",e==="horizontal"?"a-split-handlebar-horizontal":"a-split-handlebar-vertical",n?"a-split-handlebar-disabled":"",s?"a-split-handlebar-line":""].filter(Boolean).join(" "),m=a=>{a.stopPropagation(),v?z==null||z("right"):h==null||h("left")},E=a=>{a.stopPropagation(),P?z==null||z("left"):h==null||h("right")},D=!s&&!d,I=e==="horizontal",M=P&&!v,N=v&&!P,o=I?"M8 3L4 6L8 9":"M3 8L6 4L9 8",g=I?"M4 3L8 6L4 9":"M3 4L6 8L9 4",p=o,r=g,i=P||v;return H.jsx("div",{className:b,onMouseDown:a=>!n&&l(a),onTouchStart:a=>!n&&l(a),style:{cursor:n?"default":I?"col-resize":"row-resize"},children:D&&H.jsxs(H.Fragment,{children:[H.jsx("button",{className:`a-split-collapse-btn a-split-collapse-btn-${I?"left":"top"}${M?" hidden":""}`,onClick:m,"aria-label":v?`Expand ${I?"right":"bottom"} pane`:`Collapse ${I?"left":"top"} pane`,title:v?`Expand ${I?"right":"bottom"} pane`:`Collapse ${I?"left":"top"} pane`,children:H.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:H.jsx("path",{d:p,stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}),H.jsx("div",{className:`a-split-grip-icon${i?" hidden":""}`,"aria-hidden":"true",children:I?H.jsxs("svg",{width:"8",height:"24",viewBox:"0 0 8 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[H.jsx("circle",{cx:"4",cy:"4",r:"2.5",fill:"currentColor"}),H.jsx("circle",{cx:"4",cy:"12",r:"2.5",fill:"currentColor"}),H.jsx("circle",{cx:"4",cy:"20",r:"2.5",fill:"currentColor"})]}):H.jsxs("svg",{width:"24",height:"8",viewBox:"0 0 24 8",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:[H.jsx("circle",{cx:"4",cy:"4",r:"2.5",fill:"currentColor"}),H.jsx("circle",{cx:"12",cy:"4",r:"2.5",fill:"currentColor"}),H.jsx("circle",{cx:"20",cy:"4",r:"2.5",fill:"currentColor"})]})}),H.jsx("button",{className:`a-split-collapse-btn a-split-collapse-btn-${I?"right":"bottom"}${N?" hidden":""}`,onClick:E,"aria-label":P?`Expand ${I?"left":"top"} pane`:`Collapse ${I?"right":"bottom"} pane`,title:P?`Expand ${I?"left":"top"} pane`:`Collapse ${I?"right":"bottom"} pane`,children:H.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:H.jsx("path",{d:r,stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})]})})};ae.displayName="DragHandle";function ft(t,e){if(e.includes("vw")){const n=parseFloat(e);return t/100*window.innerWidth*(n/100)}if(e.includes("vh")){const n=parseFloat(e);return t/100*window.innerHeight*(n/100)}if(e.includes("px")){const n=parseFloat(e);return t/100*n}return e.includes("%")?(console.warn("Percentage reference not fully supported, assuming viewport"),t/100*window.innerWidth*(parseFloat(e)/100)):t/100*parseFloat(e)}function ht(t,e){if(e.includes("vw")){const n=parseFloat(e),s=window.innerWidth*(n/100);return t/s*100}if(e.includes("vh")){const n=parseFloat(e),s=window.innerHeight*(n/100);return t/s*100}if(e.includes("px")){const n=parseFloat(e);return t/n*100}if(e.includes("%")){console.warn("Percentage reference not fully supported, assuming viewport");const n=window.innerWidth*(parseFloat(e)/100);return t/n*100}return t/parseFloat(e)*100}function pt(t,e,n){const s=parseFloat(t);return t.includes("%")?n==="px"?`${s/100*e}px`:t:t.includes("px")?n==="%"?`${s/e*100}%`:t:n==="px"?`${s}px`:`${s/e*100}%`}function B(t){const e=parseFloat(t);return t.includes("%")?{value:e,unit:"%"}:t.includes("px")?{value:e,unit:"px"}:t.includes("vw")?{value:e,unit:"vw"}:t.includes("vh")?{value:e,unit:"vh"}:t.includes("fr")?{value:e,unit:"fr"}:{value:e,unit:"px"}}function gt(t,e){const n=B(t),s=B(e);return n.unit===s.unit}function mt(t,e,n,s){return`${Math.max(e,Math.min(n,t))}${s}`}function St(t){if(t.length===0)return{total:0,unit:"px"};const e=t[0];if(!e)return{total:0,unit:"px"};const n=B(e.size);let s=0;for(const l of t){const w=B(l.size);w.unit===n.unit||console.warn(`Mixed units detected: ${n.unit} and ${w.unit}. Results may be inaccurate.`),s+=w.value}return{total:s,unit:n.unit}}function zt(t,e){const n=[];if(t.length===0)return n.push("No panes defined"),{valid:!1,errors:n};const s=t.filter(l=>l.size.includes("%"));if(s.length>0){const l=s.reduce((w,h)=>w+parseFloat(h.size),0);l>100.1&&n.push(`Total percentage (${l}%) exceeds 100%`)}return t.forEach((l,w)=>{l.minSize<0&&n.push(`Pane ${w}: minSize cannot be negative`),l.maxSize<l.minSize&&n.push(`Pane ${w}: maxSize (${l.maxSize}) less than minSize (${l.minSize})`),l.maxSize>100&&n.push(`Pane ${w}: maxSize (${l.maxSize}%) exceeds 100%`)}),{valid:n.length===0,errors:n}}function Re(t,e){const n=B(t);switch(n.unit){case"%":return t;case"px":return t;case"vw":return`${n.value/100*window.innerWidth}px`;case"vh":return`${n.value/100*window.innerHeight}px`;case"fr":return"0";default:return`${n.value}px`}}function Ne(t,e=!1){if(e)return{flexGrow:0,flexShrink:0};const n=B(t.size);return n.unit==="%"?{flexGrow:1,flexShrink:1}:n.unit==="fr"?{flexGrow:n.value,flexShrink:1}:{flexGrow:0,flexShrink:0}}function wt(t,e,n){const s=B(t);return s.unit==="%"?s.value/100*e:s.unit==="px"?s.value:s.unit==="vw"?s.value/100*window.innerWidth:s.unit==="vh"?s.value/100*window.innerHeight:s.value}const xt=11;function bt(t,e,n=0){const s=t.offsetWidth,l=t.offsetHeight,w=e==="horizontal"?s:l,h=n*xt,z=w-h;return{width:s,height:l,primary:w,availableForPanes:z}}function yt(t){const e=t.filter(l=>l.size.includes("%"));if(e.length===0)return t;const n=e.reduce((l,w)=>l+parseFloat(w.size),0);if(Math.abs(n-100)<.01)return t;const s=100/n;return t.map(l=>{if(!l.size.includes("%"))return l;const h=parseFloat(l.size)*s;return{...l,size:`${h}%`}})}function Pt(t,e,n){const s=e+n;return!(s<t.minSize||s>t.maxSize)}function vt(t){return t==="horizontal"?"width":"height"}function Ct(t){return t==="horizontal"?"clientX":"clientY"}const oe=({id:t,size:e,collapsed:n,minSize:s,maxSize:l,mode:w,content:h,flexGrow:z})=>{const C=e||"100%",P={size:C},{flexGrow:v,flexShrink:d}=Ne(P,n),b=z!==void 0?z:v,m=n?"0":Re(C);return H.jsx("div",{"data-pane-id":t,"data-min-size":s,"data-max-size":l,className:`a-split-pane${n?" a-split-hidden":""}`,style:{flexBasis:m,flexGrow:b,flexShrink:d,overflow:n?"hidden":"auto"},children:h})};oe.displayName="Pane";class Le{constructor(e){te(this,"plugins",[]);te(this,"context");this.context=e}registerPlugins(e){this.plugins=e,this.plugins.forEach(n=>{n.onInit&&n.onInit(this.context)})}destroy(){this.plugins.forEach(e=>{e.onDestroy&&e.onDestroy(this.context)}),this.plugins=[]}onPaneAdd(e){this.plugins.forEach(n=>{n.onPaneAdd&&n.onPaneAdd(e,this.context)})}onPaneRemove(e){this.plugins.forEach(n=>{n.onPaneRemove&&n.onPaneRemove(e,this.context)})}onPaneCollapse(e){this.plugins.forEach(n=>{n.onPaneCollapse&&n.onPaneCollapse(e,this.context)})}onPaneExpand(e){this.plugins.forEach(n=>{n.onPaneExpand&&n.onPaneExpand(e,this.context)})}onDragStart(e){this.plugins.forEach(n=>{n.onDragStart&&n.onDragStart(e,this.context)})}onDragMove(e){let n=!0;for(const s of this.plugins)s.onDragMove&&s.onDragMove(e,this.context)===!1&&(n=!1);return n}onDragEnd(e){this.plugins.forEach(n=>{n.onDragEnd&&n.onDragEnd(e,this.context)})}onResize(e){this.plugins.forEach(n=>{n.onResize&&n.onResize(e,this.context)})}renderHandle(e){for(const n of this.plugins)if(n.renderHandle){const s=n.renderHandle(e,this.context);if(s)return s}return null}renderPane(e){for(const n of this.plugins)if(n.renderPane){const s=n.renderPane(e,this.context);if(s)return s}return null}getPlugins(){return this.plugins}getPlugin(e){return this.plugins.find(n=>n.name===e)}hasPlugin(e){return this.plugins.some(n=>n.name===e)}}const le=c.forwardRef((t,e)=>{const{id:n,mode:s="horizontal",initialSizes:l=[],minSizes:w=[],maxSizes:h=[],collapsed:z=[],disable:C=!1,visible:P=!0,lineBar:v=!1,renderBar:d,plugins:b=[],enableSessionStorage:m=!1,width:E=null,height:D=null,className:I="",style:M={},fixClass:N=!1,children:o,onDragging:g,onDragEnd:p,onLayoutChange:r}=t,i=c.useRef(`split-${Math.random().toString(36).slice(2,11)}`),a=n||i.current,u=c.useRef(null),S=c.useRef(null),A=ie(),L=!N&&A>2;c.useEffect(()=>{var y,x;if(typeof globalThis<"u"&&((x=(y=globalThis.process)==null?void 0:y.env)==null?void 0:x.NODE_ENV)!=="production"){if(l.length>0){const $=c.Children.toArray(o);l.length!==$.length&&console.warn(`[Split] initialSizes length (${l.length}) doesn't match children count (${$.length})`),l.forEach((R,G)=>{if(typeof R=="string"){const W=parseFloat(R);if(isNaN(W)&&console.warn(`[Split] Invalid size at index ${G}: "${R}". Expected format: "50%", "100px", etc.`),R.includes("%")){const J=parseFloat(R);(J<0||J>100)&&console.warn(`[Split] Size at index ${G} is out of range: "${R}". Percentage should be 0-100.`)}}});const F=l.reduce((R,G)=>typeof G=="string"&&G.includes("%")?R+parseFloat(G):R,0);F>100&&console.warn(`[Split] Total percentage (${F}%) exceeds 100%. Sizes will be normalized.`)}if((w.length>0||h.length>0)&&(w.forEach(($,F)=>{const R=h[F];R!==void 0&&$>R&&console.warn(`[Split] minSize (${$}) is greater than maxSize (${R}) at index ${F}`),($<0||$>100)&&console.warn(`[Split] minSize at index ${F} is out of range: ${$}. Should be 0-100.`)}),h.forEach(($,F)=>{($<0||$>100)&&console.warn(`[Split] maxSize at index ${F} is out of range: ${$}. Should be 0-100.`)})),z.length>0){const $=c.Children.toArray(o);z.length!==$.length&&console.warn(`[Split] collapsed length (${z.length}) doesn't match children count (${$.length})`)}}},[l,w,h,z,o]);const{panes:k,addPane:j,removePane:_,togglePane:q,setPaneSize:V,getPaneState:ce,removePanes:ue,swapPanes:de,collapsePane:X,expandPane:Y,resizePane:fe}=$e(o,l,z,w,h,a),[T,he]=c.useState(null);c.useEffect(()=>(T&&T.active?(document.body.classList.add("a-split-body-dragging"),document.body.classList.add(s==="horizontal"?"a-split-body-dragging-horizontal":"a-split-body-dragging-vertical")):(document.body.classList.remove("a-split-body-dragging"),document.body.classList.remove("a-split-body-dragging-horizontal"),document.body.classList.remove("a-split-body-dragging-vertical")),()=>{document.body.classList.remove("a-split-body-dragging"),document.body.classList.remove("a-split-body-dragging-horizontal"),document.body.classList.remove("a-split-body-dragging-vertical")}),[T,s]);const Be=c.useCallback(()=>({panes:k,mode:s,dragState:T}),[k,s,T]),qe=c.useCallback(f=>{switch(f.type){case"ADD_PANE":j(f.payload);break;case"REMOVE_PANE":_(f.payload);break;case"TOGGLE_PANE":q(f.payload);break;case"SET_PANE_SIZE":V(f.payload.index,f.payload.size);break;case"RESTORE_STATE":f.payload.panes.forEach((y,x)=>{V(x,y.size),y.collapsed&&q(x)});break;case"ADJUST_PANE_SIZE":if(f.payload&&(T==null?void 0:T.paneIndex)!=null){const y=T.paneIndex,x=k[y];if(x){const $=parseFloat(x.size),F=f.payload.direction==="grow"?f.payload.amount:-f.payload.amount,R=Math.max(x.minSize||0,Math.min(x.maxSize||100,$+F));V(y,`${R}%`)}}break}},[j,_,q,V,k,T]),pe=Fe(a,Be,qe,u);c.useEffect(()=>{if(b.length>0)return S.current=new Le(pe),S.current.registerPlugins(b),()=>{var f;(f=S.current)==null||f.destroy(),S.current=null}},[b,pe]);const Q=De(m,`split-state-${a}`,s);c.useEffect(()=>{const f=Q.load();f&&f.length===k.length&&f.forEach((y,x)=>{k[x]&&y.id===k[x].id&&(V(x,y.size),y.collapsed!==k[x].collapsed&&q(x))})},[]),c.useEffect(()=>{Q.save(k)},[k,Q]);const ge=c.useRef(!0),me=c.useRef(c.Children.count(o)),K=c.useRef(l);c.useEffect(()=>{if(!u.current||l.length===0)return;const f=c.Children.count(o),y=f!==me.current,x=l.length!==K.current.length||l.some(($,F)=>$!==K.current[F]);(ge.current||y||x)&&(l.forEach(($,F)=>{V(F,$)}),ge.current=!1,me.current=f,K.current=l)},[o,l]);const ee=c.useRef(z);c.useEffect(()=>{!u.current||!z.some((y,x)=>y!==ee.current[x])&&ee.current.length===z.length||(ee.current=z,z.forEach((y,x)=>{const $=k[x];$&&$.collapsed!==y&&(y?X(x):Y(x))}))},[z,k,X,Y]),c.useEffect(()=>{u.current&&k.forEach((f,y)=>{var $;const x=($=u.current)==null?void 0:$.querySelector(`[data-pane-id="${f.id}"]`);if(x){const F=w[y],R=h[y];F!==void 0&&x.setAttribute("data-min-size",String(w[y])),R!==void 0&&x.setAttribute("data-max-size",String(h[y]))}})},[w,h,k]),c.useEffect(()=>{if(!u.current)return;u.current.querySelectorAll(".a-split-handlebar").forEach((y,x)=>{const $=y,F=x+1;ne(F,C)?($.classList.add("a-split-handlebar-disabled"),$.style.cursor="default"):($.classList.remove("a-split-handlebar-disabled"),$.style.cursor=s==="horizontal"?"col-resize":"row-resize");const G=re(F,P);$.style.display=G?"":"none",se(F,v)?$.classList.add("a-split-handlebar-line"):$.classList.remove("a-split-handlebar-line")})},[C,P,v,s]);const{handleMouseDown:Se}=Ae(u,s,{onDragStart:f=>{var x;he({active:!0,paneIndex:f.paneIndex}),(x=S.current)==null||x.onDragStart(f);const y=k[f.paneIndex];y&&(r==null||r(f.paneIndex,y.id,"dragging",null))},onDragMove:f=>{var x;(((x=S.current)==null?void 0:x.onDragMove(f))??!0)&&(g==null||g(f.prevSize,f.nextSize,f.paneIndex))},onDragEnd:f=>{var x;V(f.paneIndex-1,`${f.prevSize}%`),V(f.paneIndex,`${f.nextSize}%`),he(null),(x=S.current)==null||x.onDragEnd(f),p==null||p(f.prevSize,f.nextSize,f.paneIndex);const y=k[f.paneIndex];y&&(r==null||r(f.paneIndex,y.id,"dragged",null))}}),Oe=c.useCallback((f,y)=>{var $;const x=y==="left"?f-1:f;if(x>=0&&x<k.length){X(x,{direction:y});const F=k[x];F&&(($=S.current)==null||$.onPaneCollapse({pane:F,index:x,direction:y}),r==null||r(x,F.id,"close",y))}},[k,X,r]),Xe=c.useCallback((f,y)=>{var $;const x=y==="left"?f-1:f;if(x>=0&&x<k.length){Y(x,{direction:y});const F=k[x];F&&(($=S.current)==null||$.onPaneExpand({pane:F,index:x,direction:y}),r==null||r(x,F.id,"open",y))}},[k,Y,r]);c.useImperativeHandle(e,()=>({addPane:j,removePane:_,togglePane:q,setPaneSize:V,getPaneState:ce,removePanes:ue,swapPanes:de,collapsePane:X,expandPane:Y,resizePane:fe,getSnapshot:()=>{const f=u.current,y=f?s==="horizontal"?f.offsetWidth:f.offsetHeight:0;return{panes:k.map(x=>({...x})),totalSize:y,mode:s,timestamp:Date.now()}},restore:f=>{if(f.mode!==s){console.warn(`Cannot restore snapshot with different mode. Current: ${s}, Snapshot: ${f.mode}`);return}f.panes.forEach((y,x)=>{k[x]&&(V(x,y.size),y.collapsed!==k[x].collapsed&&q(x))})}}),[j,_,q,V,ce,ue,de,X,Y,fe,k,s]);const Ye=c.useMemo(()=>({display:"flex",flexDirection:s==="horizontal"?"row":"column",width:E||"100%",height:D||"100%",overflow:"hidden",...M}),[s,E,D,M]),Ue=c.useMemo(()=>{const f=["a-split-container"];return s==="vertical"&&f.push("a-split-vertical"),(N||L)&&f.push("a-split-fix"),T!=null&&T.active&&f.push("a-split-dragging"),I&&f.push(I),f.join(" ")},[s,N,L,I,T==null?void 0:T.active]),We=()=>{const f=[];return k.forEach((y,x)=>{var F;const $=H.jsx(Z,{level:A+1,children:y.content});if(f.push(H.jsx(oe,{id:y.id,size:y.size,collapsed:y.collapsed,minSize:y.minSize,maxSize:y.maxSize,mode:s,content:$,flexGrow:y.flexGrow},y.id)),x<k.length-1){const R=x+1,G=k[x+1];if(!G)return;const W=Ee(),J=re(R,P),ze=se(R,v),we=y.collapsed||!1,xe=G.collapsed||!1,be=ne(R,C),ye=be||we||xe;if(J&&W){const Pe=(F=S.current)==null?void 0:F.renderHandle({index:R,mode:s,disabled:ye,lineBar:ze,onMouseDown:O=>Se(R,O)});Pe?f.push(H.jsx(c.Fragment,{children:Pe},`handlebar-${R}`)):f.push(H.jsx(ae,{index:R,mode:s,disabled:ye,lineBar:ze,explicitlyDisabled:be,onMouseDown:O=>Se(R,O),onCollapse:O=>Oe(R,O),onExpand:O=>Xe(R,O),renderCustom:d,leftPaneCollapsed:we,rightPaneCollapsed:xe},`handlebar-${R}`))}}}),f};return H.jsx("div",{ref:u,id:a,className:Ue,style:Ye,children:We()})});le.displayName="Split";function Et(t={}){const{mode:e="horizontal",initialPanes:n=[],initialSizes:s=[],minSizes:l=[],maxSizes:w=[],onPaneChange:h}=t,[z,C]=c.useState(()=>n.length>0?n:s.map((r,i)=>({id:`pane-${i}`,size:r,collapsed:!1,minSize:l[i]||0,maxSize:w[i]||100,content:null}))),[P]=c.useState(!1),v=c.useRef(!1),d=c.useCallback(r=>{C(i=>{const a=typeof r=="function"?r(i):r;return!v.current&&h&&h(a),a})},[h]),b=c.useCallback(r=>{d(i=>{const a=r.position??i.length,u={id:`pane-${Date.now()}`,size:r.size,collapsed:r.collapsed||!1,minSize:r.minSize||0,maxSize:r.maxSize||100,content:r.content},S=[...i];return S.splice(a,0,u),S})},[d]),m=c.useCallback(r=>{d(i=>{if(r<0||r>=i.length)return i;const a=[...i],u=a.splice(r,1)[0];if(u&&a.length>0){const A=(parseFloat(u.size)||0)/a.length;return a.map(L=>({...L,size:`${(parseFloat(L.size)||0)+A}%`}))}return a})},[d]),E=c.useCallback(r=>{d(i=>{const a=[...r].sort((A,L)=>L-A);let u=[...i],S=0;if(a.forEach(A=>{if(A>=0&&A<u.length){const L=u.splice(A,1)[0];L&&(S+=parseFloat(L.size)||0)}}),u.length>0&&S>0){const A=S/u.length;u=u.map(L=>({...L,size:`${(parseFloat(L.size)||0)+A}%`}))}return u})},[d]),D=c.useCallback(r=>{d(i=>{if(r<0||r>=i.length)return i;const a=i[r];if(!a)return i;const u=[...i];return u[r]={...a,collapsed:!a.collapsed},u})},[d]),I=c.useCallback(r=>{d(i=>{if(r<0||r>=i.length)return i;const a=i[r];if(!a||a.collapsed)return i;const u=[...i];return u[r]={...a,collapsed:!0},u})},[d]),M=c.useCallback(r=>{d(i=>{if(r<0||r>=i.length)return i;const a=i[r];if(!a||!a.collapsed)return i;const u=[...i];return u[r]={...a,collapsed:!1},u})},[d]),N=c.useCallback((r,i,a)=>{d(u=>{if(r<0||r>=u.length)return u;const S=u[r];if(!S)return u;const A=[...u];return A[r]={...S,size:i},A})},[d]),o=c.useCallback((r,i)=>{d(a=>{if(r<0||r>=a.length||i<0||i>=a.length||r===i)return a;const u=[...a],S=u[r];return u[r]=u[i],u[i]=S,u})},[d]),g=c.useCallback(()=>({panes:z.map(r=>({...r})),totalSize:0,mode:e,timestamp:Date.now()}),[z,e]),p=c.useCallback(r=>{if(r.mode!==e){console.warn(`Cannot restore snapshot with different mode. Current: ${e}, Snapshot: ${r.mode}`);return}v.current=!0,d(i=>r.panes.map((a,u)=>{const S=i.find(A=>A.id===a.id)||i[u];return{id:a.id,size:a.size,collapsed:a.collapsed,minSize:(S==null?void 0:S.minSize)??0,maxSize:(S==null?void 0:S.maxSize)??100,content:(S==null?void 0:S.content)??null}})),v.current=!1,h&&C(i=>(h(i),i))},[e,d,h]);return c.useMemo(()=>({panes:z,mode:e,isDragging:P,addPane:b,removePane:m,removePanes:E,togglePane:D,collapsePane:I,expandPane:M,setPaneSize:N,swapPanes:o,setPanes:d,getSnapshot:g,restore:p}),[z,e,P,b,m,E,D,I,M,N,o,d,g,p])}function $t(t){return t}function kt(t={}){const{storage:e="localStorage",key:n,debounceDelay:s=300}=t;let l=null;const w=v=>n||`a-multilayout-splitter:${v}`,h=()=>typeof window>"u"?null:e==="localStorage"?window.localStorage:window.sessionStorage,z=(v,d)=>{const b=h();if(b)try{const m=w(v),E=JSON.stringify({panes:d.panes.map(D=>({id:D.id,size:D.size,collapsed:D.collapsed})),mode:d.mode,timestamp:Date.now()});b.setItem(m,E)}catch(m){console.error("Failed to save split state:",m)}},C=v=>{const d=h();if(!d)return null;try{const b=w(v),m=d.getItem(b);return m?JSON.parse(m):null}catch(b){return console.error("Failed to load split state:",b),null}},P=(v,d)=>{l&&clearTimeout(l),l=setTimeout(()=>{z(v,d),l=null},s)};return{name:"persistence",version:"1.0.0",onInit(v){const d=C(v.splitId),b=d==null?void 0:d.panes;b&&b.length>0?setTimeout(()=>{v.getState().panes.length===b.length&&v.dispatch({type:"RESTORE_STATE",payload:{panes:b}})},0):setTimeout(()=>{const m=v.getState();z(v.splitId,m)},0)},onDragEnd(v,d){setTimeout(()=>{const b=d.getState();P(d.splitId,b)},0)},onPaneAdd(v,d){setTimeout(()=>{const b=d.getState();P(d.splitId,b)},0)},onPaneRemove(v,d){setTimeout(()=>{const b=d.getState();P(d.splitId,b)},0)},onPaneCollapse(v,d){setTimeout(()=>{const b=d.getState();P(d.splitId,b)},0)},onPaneExpand(v,d){setTimeout(()=>{const b=d.getState();P(d.splitId,b)},0)},onDestroy(){l&&(clearTimeout(l),l=null)}}}function It(t,e="localStorage"){const n=e==="localStorage"?window.localStorage:window.sessionStorage;try{const s=`a-multilayout-splitter:${t}`;n.removeItem(s)}catch(s){console.error("Failed to clear persisted state:",s)}}function At(t={}){const{enableArrowKeys:e=!0,enableNumberKeys:n=!0,stepSize:s=5,enableTabNavigation:l=!0}=t;let w=0,h=null;const z=(C,P)=>{if(!C)return;const d=C.querySelectorAll(".a-split-pane")[P];d&&(d.focus(),d.setAttribute("tabindex","0"),w=P)};return{name:"keyboard",version:"1.0.0",onInit(C){const P=C.getElement();if(!P)return;P.setAttribute("tabindex","0"),P.querySelectorAll(".a-split-pane").forEach((d,b)=>{d.setAttribute("tabindex",b===0?"0":"-1")}),h=d=>{const b=C.getState(),m=b.panes;if(e&&(d.key==="ArrowLeft"||d.key==="ArrowRight"||d.key==="ArrowUp"||d.key==="ArrowDown")){d.preventDefault();const E=b.mode==="horizontal",D=E&&d.key==="ArrowRight"||!E&&d.key==="ArrowDown",I=w,M=m[I],N=I<m.length-1?I+1:I-1,o=m[N];if(!M||!o)return;const g=parseFloat(M.size),p=parseFloat(o.size),r=D?s:-s;let i=g+r,a=p-r;const u=M.minSize||0,S=M.maxSize||100,A=o.minSize||0,L=o.maxSize||100;i=Math.max(u,Math.min(S,i)),a=Math.max(A,Math.min(L,a));const k=g+p;i+a!==k&&(i===u||i===S?a=k-i:i=k-a),C.dispatch({type:"SET_PANE_SIZE",payload:{index:I,size:`${i}%`}}),C.dispatch({type:"SET_PANE_SIZE",payload:{index:N,size:`${a}%`}})}if(n){const E=parseInt(d.key,10);if(!isNaN(E)&&E>=1&&E<=9){const D=E-1;D<m.length&&z(P,D)}}if(l&&d.key==="Tab"){d.preventDefault();let E=d.shiftKey?w-1:w+1;E<0?E=m.length-1:E>=m.length&&(E=0),z(P,E)}},P.addEventListener("keydown",h)},onDestroy(C){const P=C.getElement();P&&h&&(P.removeEventListener("keydown",h),h=null)}}}function Dt(t,e){return{name:"custom-handle",version:"1.0.0",renderHandle(n){return c.createElement(t,{...n,...e})}}}function Ft(t){return{name:"custom-handle-render",version:"1.0.0",renderHandle(e){return t(e)}}}const Me=c.createContext(null),Te=c.createContext(null),je=c.createContext(null);function Ht({id:t,mode:e="horizontal",enableSessionStorage:n=!1,storageKey:s=`split-state-${t}`,children:l,_panes:w=[],_addPane:h,_removePane:z,_togglePane:C,_setPaneSize:P,_getPaneState:v}){const d=c.useRef({isDragging:!1,activeHandlebar:null}),b=c.useMemo(()=>({id:t,mode:e,enableSessionStorage:n,storageKey:s}),[t,e,n,s]),m=c.useMemo(()=>({panes:w,isDragging:d.current.isDragging,activeHandlebar:d.current.activeHandlebar}),[w,d.current.isDragging,d.current.activeHandlebar]),E=c.useMemo(()=>({addPane:h||(()=>console.warn("addPane not available")),removePane:z||(()=>console.warn("removePane not available")),togglePane:C||(()=>console.warn("togglePane not available")),setPaneSize:P||(()=>console.warn("setPaneSize not available")),getPaneState:v||(()=>[]),setDragging:(D,I)=>{d.current.isDragging=D,d.current.activeHandlebar=I??null}}),[h,z,C,P,v]);return H.jsx(Me.Provider,{value:b,children:H.jsx(Te.Provider,{value:m,children:H.jsx(je.Provider,{value:E,children:l})})})}function Ve(){const t=c.useContext(Me);if(!t)throw new Error("useSplitConfig must be used within SplitProvider");return t}function U(){const t=c.useContext(Te);if(!t)throw new Error("useSplitState must be used within SplitProvider");return t}function Ge(){return c.useContext(je)}function Rt(){const t=Ge();if(!t)throw new Error("useSplit must be used within SplitProvider");return{config:Ve(),state:U(),actions:t}}function _e(t){const{panes:e}=U();return e[t]}function Nt(){const{panes:t}=U();return t.length}function Lt(){const{isDragging:t}=U();return t}function Mt(t){const e=_e(t);return(e==null?void 0:e.collapsed)??!1}function Tt(){const{panes:t}=U();return c.useMemo(()=>t.filter(e=>!e.collapsed),[t])}exports.DragHandle=ae;exports.NestingProvider=Z;exports.PaneComponent=oe;exports.PluginManager=Le;exports.Split=le;exports.SplitProvider=Ht;exports.animatePaneSize=ve;exports.applyCollapseState=Qe;exports.batchUpdatePanes=at;exports.calculateFlexBasis=Re;exports.calculateFlexValues=Ne;exports.calculateHandlebarPosition=wt;exports.calculateTotalSize=St;exports.canResize=Pt;exports.clampSize=mt;exports.clearPersistedState=It;exports.constrainSize=rt;exports.createPane=st;exports.createPlugin=$t;exports.customHandlePlugin=Dt;exports.customHandleRenderPlugin=Ft;exports.debounce=Ie;exports.default=le;exports.findPaneIndex=et;exports.getAxisProperty=vt;exports.getContainerDimensions=bt;exports.getCoordinateProperty=Ct;exports.getPaneElement=nt;exports.getVisiblePanes=tt;exports.haveSameUnit=gt;exports.isHandlebarDisabled=ne;exports.isHandlebarVisible=re;exports.isLineBarStyle=se;exports.isPaneVisible=Ce;exports.keyboardPlugin=At;exports.normalizePaneSizes=yt;exports.normalizeSize=pt;exports.parseSize=B;exports.percentageToPixel=ft;exports.persistencePlugin=kt;exports.pixelToPercentage=ht;exports.restorePaneState=ot;exports.serializePaneState=lt;exports.shouldShowHandlebar=Ee;exports.throttle=ke;exports.togglePaneCollapse=Ke;exports.updatePaneSize=it;exports.useDragHandler=Ae;exports.useIsCollapsed=Mt;exports.useIsDragging=Lt;exports.useNestingLevel=ie;exports.usePane=_e;exports.usePaneCount=Nt;exports.usePaneManager=$e;exports.usePersistence=De;exports.usePluginContext=Fe;exports.useSplit=Rt;exports.useSplitActions=Ge;exports.useSplitConfig=Ve;exports.useSplitController=Et;exports.useSplitState=U;exports.useVisiblePanes=Tt;exports.validatePaneSizes=zt;exports.withNesting=dt;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/utils/paneOperations.ts","../src/hooks/usePaneManager.ts","../src/utils/native/throttle.ts","../src/hooks/useDragHandler.ts","../src/hooks/usePersistence.ts","../src/hooks/usePluginContext.ts","../src/contexts/NestingContext.tsx","../src/components/DragHandle.tsx","../src/utils/sizeConversion.ts","../src/utils/layoutCalculations.ts","../src/components/Pane.tsx","../src/plugins/PluginManager.ts","../src/components/Split.tsx","../src/hooks/useSplitController.ts","../src/plugins/createPlugin.ts","../src/plugins/builtins/persistencePlugin.ts","../src/plugins/builtins/keyboardPlugin.ts","../src/plugins/builtins/customHandlePlugin.ts","../src/contexts/SplitProvider.tsx"],"sourcesContent":["import { Pane, AnimationOptions } from '../types';\r\n\r\n/**\r\n * Applies collapse state styles directly to a pane element.\r\n * \r\n * @param element - The pane HTMLElement\r\n * @param collapsed - Whether the pane should be hidden\r\n */\r\nexport function applyCollapseState(element: HTMLElement, collapsed: boolean): void {\r\n if (collapsed) {\r\n element.classList.add('a-split-hidden');\r\n element.style.flexGrow = '0';\r\n element.style.flexShrink = '0';\r\n element.style.flexBasis = '0';\r\n } else {\r\n element.classList.remove('a-split-hidden');\r\n element.style.flexGrow = '';\r\n element.style.flexShrink = '';\r\n }\r\n}\r\n\r\n/**\r\n * Animates a pane's size change using CSS transitions.\r\n * \r\n * @param element - The pane HTMLElement\r\n * @param targetSize - The target size string (e.g., \"50%\")\r\n * @param options - Animation configuration\r\n */\r\nexport function animatePaneSize(\r\n element: HTMLElement,\r\n targetSize: string,\r\n options: AnimationOptions = {}\r\n): Promise<void> {\r\n return new Promise((resolve) => {\r\n const duration = options.duration || 300;\r\n\r\n if (!options.animate) {\r\n element.style.flexBasis = targetSize;\r\n resolve();\r\n return;\r\n }\r\n\r\n element.style.transition = `flex-basis ${duration}ms ease`;\r\n element.offsetHeight; // force reflow\r\n element.style.flexBasis = targetSize;\r\n\r\n setTimeout(() => {\r\n element.style.transition = '';\r\n resolve();\r\n }, duration);\r\n });\r\n}\r\n\r\n/**\r\n * Returns a new pane object with the collapsed state toggled.\r\n */\r\nexport function togglePaneCollapse(pane: Pane): Pane {\r\n return {\r\n ...pane,\r\n collapsed: !pane.collapsed,\r\n };\r\n}\r\n\r\n/**\r\n * Finds the index of a pane within an array by its ID.\r\n */\r\nexport function findPaneIndex(panes: Pane[], id: string): number {\r\n return panes.findIndex((pane) => pane.id === id);\r\n}\r\n\r\n/**\r\n * Returns true if the pane is currently expanded.\r\n */\r\nexport function isPaneVisible(pane: Pane): boolean {\r\n return !pane.collapsed;\r\n}\r\n\r\n/**\r\n * Returns an array containing only the visible panes.\r\n */\r\nexport function getVisiblePanes(panes: Pane[]): Pane[] {\r\n return panes.filter(isPaneVisible);\r\n}\r\n\r\n/**\r\n * Retrieves a pane element from the DOM using its data attribute.\r\n */\r\nexport function getPaneElement(id: string): HTMLElement | null {\r\n return document.querySelector(`[data-pane-id=\"${id}\"]`);\r\n}\r\n\r\n/**\r\n * Clamps a numeric size value between min and max bounds.\r\n */\r\nexport function constrainSize(value: number, minSize: number, maxSize: number): number {\r\n return Math.max(minSize, Math.min(maxSize, value));\r\n}\r\n\r\n/**\r\n * Factory function to create a new pane object with default values.\r\n */\r\nexport function createPane(\r\n id: string,\r\n size: string,\r\n content: React.ReactNode,\r\n options: Partial<Pane> = {}\r\n): Pane {\r\n return {\r\n id,\r\n size,\r\n content,\r\n collapsed: options.collapsed ?? false,\r\n minSize: options.minSize ?? 0,\r\n maxSize: options.maxSize ?? 100,\r\n };\r\n}\r\n\r\n/**\r\n * Returns a new pane object with an updated size.\r\n */\r\nexport function updatePaneSize(pane: Pane, newSize: string): Pane {\r\n return {\r\n ...pane,\r\n size: newSize,\r\n };\r\n}\r\n\r\n/**\r\n * Applies multiple updates to an array of panes based on their IDs.\r\n */\r\nexport function batchUpdatePanes(\r\n panes: Pane[],\r\n updates: Map<string, Partial<Pane>>\r\n): Pane[] {\r\n return panes.map((pane) => {\r\n const update = updates.get(pane.id);\r\n return update ? { ...pane, ...update } : pane;\r\n });\r\n}\r\n\r\n/**\r\n * Restores a pane's state from a saved persistence object.\r\n */\r\nexport function restorePaneState(\r\n pane: Pane,\r\n savedState: { id: string; size: string; collapsed: boolean }\r\n): Pane {\r\n return {\r\n ...pane,\r\n size: savedState.size,\r\n collapsed: savedState.collapsed,\r\n };\r\n}\r\n\r\n/**\r\n * serializes a pane's state into a persistence-friendly object.\r\n */\r\nexport function serializePaneState(pane: Pane): {\r\n id: string;\r\n size: string;\r\n collapsed: boolean;\r\n} {\r\n return {\r\n id: pane.id,\r\n size: pane.size,\r\n collapsed: pane.collapsed,\r\n };\r\n}\r\n\r\n/**\r\n * Determines if a handlebar should be rendered between two panes.\r\n */\r\nexport function shouldShowHandlebar(_prevPane: Pane, _nextPane: Pane): boolean {\r\n return true;\r\n}\r\n\r\n/**\r\n * Calculates whether a specific handlebar should be interaction-disabled.\r\n */\r\nexport function isHandlebarDisabled(\r\n index: number,\r\n disable?: boolean | boolean[] | number[]\r\n): boolean {\r\n if (typeof disable === 'boolean') {\r\n return disable;\r\n }\r\n if (Array.isArray(disable)) {\r\n if (disable.length > 0 && typeof disable[0] === 'boolean') {\r\n return disable[index - 1] === true;\r\n }\r\n return (disable as number[]).includes(index);\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Calculates whether a specific handlebar should be visible in the DOM.\r\n */\r\nexport function isHandlebarVisible(\r\n index: number,\r\n visible?: boolean | boolean[] | number[]\r\n): boolean {\r\n if (typeof visible === 'boolean') {\r\n return visible;\r\n }\r\n if (Array.isArray(visible)) {\r\n if (visible.length > 0 && typeof visible[0] === 'boolean') {\r\n return visible[index - 1] !== false;\r\n }\r\n return (visible as number[]).includes(index);\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Calculates whether a handlebar should use the simplified line style.\r\n */\r\nexport function isLineBarStyle(\r\n index: number,\r\n lineBar?: boolean | boolean[] | number[]\r\n): boolean {\r\n if (typeof lineBar === 'boolean') {\r\n return lineBar;\r\n }\r\n if (Array.isArray(lineBar)) {\r\n if (lineBar.length > 0 && typeof lineBar[0] === 'boolean') {\r\n return lineBar[index - 1] === true;\r\n }\r\n return (lineBar as number[]).includes(index);\r\n }\r\n return false;\r\n}\r\n","import React, { useState, useCallback, useEffect, useRef, ReactNode } from \"react\";\r\nimport { Pane, AddPaneConfig, AnimationOptions } from \"../types\";\r\nimport { animatePaneSize } from \"../utils/paneOperations\";\r\n\r\n/**\r\n * usePaneManager\r\n *\r\n * Internal hook responsible for managing the state and dynamic lifecycle of split panes.\r\n * It handles adding, removing, toggling, and resizing panes while maintaining\r\n * proportional size redistribution.\r\n *\r\n * @param children - React children elements to be managed as panes\r\n * @param initialSizes - Array of starting size strings (e.g. \"50%\", \"100px\")\r\n * @param collapsed - Array indicating initial collapse state for each pane\r\n * @param minSizes - Array of minimum percentage constraints\r\n * @param maxSizes - Array of maximum percentage constraints\r\n * @param splitId - Unique identifier used for DOM attribution\r\n */\r\nexport function usePaneManager(\r\n children: ReactNode,\r\n initialSizes: string[] = [],\r\n collapsed: boolean[] = [],\r\n minSizes: number[] = [],\r\n maxSizes: number[] = [],\r\n splitId: string = \"split\",\r\n) {\r\n const [panes, setPanes] = useState<Pane[]>(() => {\r\n const childArray = React.Children.toArray(children);\r\n\r\n return childArray.map((child, index) => ({\r\n id: `${splitId}-pane-${index}`,\r\n size: initialSizes[index] || \"100%\",\r\n collapsed: collapsed[index] || false,\r\n minSize: minSizes[index] || 0,\r\n maxSize: maxSizes[index] || 100,\r\n content: child,\r\n }));\r\n });\r\n\r\n // Track previous children to detect changes\r\n const prevChildrenRef = useRef<ReactNode>(children);\r\n\r\n /**\r\n * Sync pane content when children change.\r\n * This ensures nested components receive updated props.\r\n */\r\n useEffect(() => {\r\n const childArray = React.Children.toArray(children);\r\n const prevChildArray = React.Children.toArray(prevChildrenRef.current);\r\n\r\n // Only update if children count matches (not adding/removing panes)\r\n if (childArray.length === panes.length) {\r\n setPanes((prevPanes) => {\r\n let hasChanges = false;\r\n const newPanes = prevPanes.map((pane, index) => {\r\n const newChild = childArray[index];\r\n const prevChild = prevChildArray[index];\r\n\r\n // Check if this child has changed (by reference)\r\n if (newChild !== prevChild) {\r\n hasChanges = true;\r\n return { ...pane, content: newChild };\r\n }\r\n return pane;\r\n });\r\n\r\n return hasChanges ? newPanes : prevPanes;\r\n });\r\n }\r\n\r\n prevChildrenRef.current = children;\r\n }, [children, panes.length]);\r\n\r\n /**\r\n * Adds a new pane at the specified position.\r\n */\r\n const addPane = useCallback(\r\n (config: AddPaneConfig) => {\r\n setPanes((prevPanes) => {\r\n const position = config.position ?? prevPanes.length;\r\n const newPane: Pane = {\r\n id: `${splitId}-pane-${Date.now()}`,\r\n size: config.size,\r\n collapsed: config.collapsed || false,\r\n minSize: config.minSize || 0,\r\n maxSize: config.maxSize || 100,\r\n content: config.content,\r\n };\r\n\r\n const newPanes = [...prevPanes];\r\n newPanes.splice(position, 0, newPane);\r\n\r\n return redistributeSizesOnAdd(newPanes, position, config.size);\r\n });\r\n },\r\n [splitId],\r\n );\r\n\r\n /**\r\n * Removes a pane by its index and redistributes the freed space.\r\n */\r\n const removePane = useCallback((index: number) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const newPanes = [...prevPanes];\r\n const removedPane = newPanes.splice(index, 1)[0];\r\n\r\n if (removedPane) {\r\n return redistributeSizesOnRemove(newPanes, removedPane.size);\r\n }\r\n return newPanes;\r\n });\r\n }, []);\r\n\r\n /**\r\n * Toggles the visibility (collapse/expand) of a specific pane.\r\n */\r\n const togglePane = useCallback((index: number) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const currentPane = prevPanes[index];\r\n if (!currentPane) return prevPanes;\r\n\r\n const newPanes = [...prevPanes];\r\n newPanes[index] = {\r\n ...currentPane,\r\n collapsed: !currentPane.collapsed,\r\n };\r\n\r\n const element = document.querySelector(`[data-pane-id=\"${currentPane.id}\"]`) as HTMLElement;\r\n\r\n if (element) {\r\n const updatedPane = newPanes[index];\r\n const isCollapsed = updatedPane?.collapsed ?? false;\r\n\r\n if (isCollapsed) {\r\n element.classList.add(\"a-split-hidden\");\r\n element.style.flexGrow = \"0\";\r\n } else {\r\n element.classList.remove(\"a-split-hidden\");\r\n element.style.flexGrow = \"\";\r\n }\r\n }\r\n\r\n return newPanes;\r\n });\r\n }, []);\r\n\r\n /**\r\n * Sets a pane's size and optionally triggers a CSS transition.\r\n */\r\n const setPaneSize = useCallback((index: number, size: string, options?: AnimationOptions) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const currentPane = prevPanes[index];\r\n if (!currentPane) return prevPanes;\r\n\r\n const newPanes = [...prevPanes];\r\n newPanes[index] = { ...currentPane, size, flexGrow: undefined };\r\n\r\n const element = document.querySelector(`[data-pane-id=\"${currentPane.id}\"]`) as HTMLElement;\r\n\r\n if (element) {\r\n animatePaneSize(element, size, options || { animate: false });\r\n }\r\n\r\n return newPanes;\r\n });\r\n }, []);\r\n\r\n /**\r\n * Helper to retrieve the current internal pane array.\r\n */\r\n const getPaneState = useCallback(() => panes, [panes]);\r\n\r\n /**\r\n * Removes multiple panes by their indices simultaneously.\r\n */\r\n const removePanes = useCallback((indices: number[]) => {\r\n setPanes((prevPanes) => {\r\n const sortedIndices = [...indices].sort((a, b) => b - a);\r\n let newPanes = [...prevPanes];\r\n let totalRemovedSize = 0;\r\n\r\n sortedIndices.forEach((index) => {\r\n if (index >= 0 && index < newPanes.length) {\r\n const removed = newPanes.splice(index, 1)[0];\r\n if (removed) {\r\n totalRemovedSize += parseFloat(removed.size) || 0;\r\n }\r\n }\r\n });\r\n\r\n if (newPanes.length > 0 && totalRemovedSize > 0) {\r\n const redistributeAmount = totalRemovedSize / newPanes.length;\r\n newPanes = newPanes.map((pane) => ({\r\n ...pane,\r\n size: `${(parseFloat(pane.size) || 0) + redistributeAmount}%`,\r\n }));\r\n }\r\n\r\n return newPanes;\r\n });\r\n }, []);\r\n\r\n /**\r\n * Swaps the positions of two panes in the DOM order.\r\n */\r\n const swapPanes = useCallback((indexA: number, indexB: number) => {\r\n setPanes((prevPanes) => {\r\n if (indexA < 0 || indexA >= prevPanes.length || indexB < 0 || indexB >= prevPanes.length || indexA === indexB) {\r\n return prevPanes;\r\n }\r\n\r\n const newPanes = [...prevPanes];\r\n const temp = newPanes[indexA];\r\n newPanes[indexA] = newPanes[indexB]!;\r\n newPanes[indexB] = temp!;\r\n\r\n return newPanes;\r\n });\r\n }, []);\r\n\r\n /**\r\n * Direct collapse method that optionally handles neighboring growth.\r\n */\r\n const collapsePane = useCallback((index: number, options?: AnimationOptions & { direction?: \"left\" | \"right\" }) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const currentPane = prevPanes[index];\r\n if (!currentPane || currentPane.collapsed) return prevPanes;\r\n\r\n const direction = options?.direction;\r\n let adjacentIndex: number;\r\n\r\n if (direction === \"left\") {\r\n adjacentIndex = index + 1;\r\n } else if (direction === \"right\") {\r\n adjacentIndex = index - 1;\r\n } else {\r\n adjacentIndex = index < prevPanes.length - 1 ? index + 1 : index - 1;\r\n }\r\n\r\n const newPanes = prevPanes.map((pane, i) => {\r\n if (i === index) {\r\n return { ...pane, collapsed: true, flexGrow: 0 };\r\n } else if (i === adjacentIndex && !pane.collapsed) {\r\n return { ...pane, flexGrow: 1 };\r\n } else if (!pane.collapsed) {\r\n return { ...pane, flexGrow: 0 };\r\n }\r\n return pane;\r\n });\r\n\r\n if (options?.animate) {\r\n const element = document.querySelector(`[data-pane-id=\"${currentPane.id}\"]`) as HTMLElement;\r\n if (element) {\r\n element.style.transition = `flex-basis ${options.duration || 300}ms ease`;\r\n setTimeout(() => {\r\n element.style.transition = \"\";\r\n }, options.duration || 300);\r\n }\r\n }\r\n\r\n return newPanes;\r\n });\r\n }, []);\r\n\r\n /**\r\n * Expands a previously collapsed pane back to its original size.\r\n */\r\n const expandPane = useCallback((index: number, options?: AnimationOptions & { direction?: \"left\" | \"right\" }) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const currentPane = prevPanes[index];\r\n if (!currentPane || !currentPane.collapsed) return prevPanes;\r\n\r\n const openPaneCountAfter = prevPanes.filter((p) => !p.collapsed).length + 1;\r\n const totalPanes = prevPanes.length;\r\n\r\n let newPanes = [...prevPanes];\r\n newPanes[index] = { ...currentPane, collapsed: false, flexGrow: undefined };\r\n\r\n if (openPaneCountAfter === totalPanes) {\r\n newPanes = newPanes.map((pane) => ({\r\n ...pane,\r\n flexGrow: undefined,\r\n }));\r\n } else {\r\n const direction = options?.direction;\r\n let adjacentIndex: number;\r\n\r\n if (direction === \"left\") {\r\n adjacentIndex = index + 1;\r\n } else if (direction === \"right\") {\r\n adjacentIndex = index - 1;\r\n } else {\r\n adjacentIndex = index < prevPanes.length - 1 ? index + 1 : index - 1;\r\n }\r\n\r\n if (adjacentIndex >= 0 && adjacentIndex < newPanes.length) {\r\n const adjacentPane = newPanes[adjacentIndex];\r\n if (adjacentPane && adjacentPane.flexGrow === 1) {\r\n newPanes[adjacentIndex] = { ...adjacentPane, flexGrow: undefined };\r\n }\r\n }\r\n }\r\n\r\n if (options?.animate) {\r\n const element = document.querySelector(`[data-pane-id=\"${currentPane.id}\"]`) as HTMLElement;\r\n if (element) {\r\n element.style.transition = `flex-basis ${options.duration || 300}ms ease`;\r\n setTimeout(() => {\r\n element.style.transition = \"\";\r\n }, options.duration || 300);\r\n }\r\n }\r\n\r\n return newPanes;\r\n });\r\n }, []);\r\n\r\n /**\r\n * Resizes a pane by a relative delta.\r\n */\r\n const resizePane = useCallback((index: number, delta: number) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const currentPane = prevPanes[index];\r\n if (!currentPane) return prevPanes;\r\n\r\n const currentSize = parseFloat(currentPane.size) || 0;\r\n const newSize = Math.max(currentPane.minSize || 0, Math.min(currentPane.maxSize || 100, currentSize + delta));\r\n\r\n const newPanes = [...prevPanes];\r\n newPanes[index] = { ...currentPane, size: `${newSize}%` };\r\n\r\n const element = document.querySelector(`[data-pane-id=\"${currentPane.id}\"]`) as HTMLElement;\r\n if (element) {\r\n element.style.flexBasis = `${newSize}%`;\r\n }\r\n\r\n return newPanes;\r\n });\r\n }, []);\r\n\r\n return {\r\n panes,\r\n addPane,\r\n removePane,\r\n togglePane,\r\n setPaneSize,\r\n getPaneState,\r\n removePanes,\r\n swapPanes,\r\n collapsePane,\r\n expandPane,\r\n resizePane,\r\n };\r\n}\r\n\r\n/**\r\n * Redistributes sizes among panes when a new pane is added.\r\n * @param panes The current array of panes.\r\n * @param addedIndex The index where the new pane was added.\r\n * @param addedSize The size of the newly added pane.\r\n * @returns A new array of panes with redistributed sizes.\r\n */\r\nfunction redistributeSizesOnAdd(panes: Pane[], addedIndex: number, addedSize: string): Pane[] {\r\n const addedValue = parseFloat(addedSize);\r\n const isPercent = addedSize.includes(\"%\");\r\n\r\n if (!isPercent) {\r\n return panes;\r\n }\r\n\r\n const remainingPanes = panes.filter((_, i) => i !== addedIndex);\r\n const totalOtherSize = remainingPanes.reduce((sum, pane) => {\r\n return sum + parseFloat(pane.size);\r\n }, 0);\r\n\r\n const scaleFactor = (100 - addedValue) / totalOtherSize;\r\n\r\n return panes.map((pane, i) => {\r\n if (i === addedIndex) return pane;\r\n\r\n const currentValue = parseFloat(pane.size);\r\n const newValue = currentValue * scaleFactor;\r\n\r\n return {\r\n ...pane,\r\n size: pane.size.includes(\"%\") ? `${newValue}%` : pane.size,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Redistributes sizes among remaining panes when a pane is removed.\r\n * @param panes The current array of panes after removal.\r\n * @param removedSize The size of the pane that was removed.\r\n * @returns A new array of panes with redistributed sizes.\r\n */\r\nfunction redistributeSizesOnRemove(panes: Pane[], removedSize: string): Pane[] {\r\n if (panes.length === 0) return panes;\r\n\r\n const removedValue = parseFloat(removedSize);\r\n const isPercent = removedSize.includes(\"%\");\r\n\r\n if (!isPercent) {\r\n return panes;\r\n }\r\n\r\n const distributionAmount = removedValue / panes.length;\r\n\r\n return panes.map((pane) => {\r\n if (!pane.size.includes(\"%\")) return pane;\r\n\r\n const currentValue = parseFloat(pane.size);\r\n const newValue = currentValue + distributionAmount;\r\n\r\n return {\r\n ...pane,\r\n size: `${newValue}%`,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Redistributes pane sizes proportionally based on their current sizes.\r\n */\r\nexport function redistributeSizesProportional(panes: Pane[], removedSize: string): Pane[] {\r\n if (panes.length === 0) return panes;\r\n\r\n const removedValue = parseFloat(removedSize);\r\n const isPercent = removedSize.includes(\"%\");\r\n\r\n if (!isPercent) return panes;\r\n\r\n const totalSize = panes.reduce((sum, pane) => {\r\n return sum + parseFloat(pane.size);\r\n }, 0);\r\n\r\n return panes.map((pane) => {\r\n if (!pane.size.includes(\"%\")) return pane;\r\n\r\n const currentValue = parseFloat(pane.size);\r\n const proportion = currentValue / totalSize;\r\n const addition = removedValue * proportion;\r\n const newValue = currentValue + addition;\r\n\r\n return {\r\n ...pane,\r\n size: `${newValue}%`,\r\n };\r\n });\r\n}\r\n","/**\r\n * throttle\r\n * \r\n * Ensures a function is called at most once per specified time interval.\r\n * Replaces heavier utility libraries to maintain a minimal bundle size.\r\n * \r\n * @param func - The function to execute\r\n * @param wait - Milliseconds to wait between executions\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n): (...args: Parameters<T>) => void {\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n let lastRun = 0;\r\n\r\n return function executedFunction(...args: Parameters<T>) {\r\n const now = Date.now();\r\n\r\n if (now - lastRun >= wait) {\r\n func(...args);\r\n lastRun = now;\r\n } else {\r\n if (timeout) clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n func(...args);\r\n lastRun = Date.now();\r\n }, wait - (now - lastRun));\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * debounce\r\n * \r\n * Postpones function execution until after a specified silence period.\r\n * \r\n * @param func - The function to execute\r\n * @param wait - Milliseconds of silence to wait for\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n func: T,\r\n wait: number\r\n): (...args: Parameters<T>) => void {\r\n let timeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n return function executedFunction(...args: Parameters<T>) {\r\n if (timeout) clearTimeout(timeout);\r\n\r\n timeout = setTimeout(() => {\r\n func(...args);\r\n }, wait);\r\n };\r\n}\r\n","import { useCallback, useRef, useEffect, RefObject } from \"react\";\r\nimport { throttle } from \"../utils/native/throttle\";\r\nimport { DragState, DragCallbacks, SplitMode } from \"../types\";\r\n\r\n/**\r\n * useDragHandler\r\n * \r\n * Orchestrates the low-level pointer events and DOM manipulation required for \r\n * high-performance pane resizing. Bypasses React's render loop during active \r\n * dragging to maintain a consistent 60fps experience even in nested layouts.\r\n * \r\n * @param containerRef - DOM reference to the master split container\r\n * @param mode - Active layout orientation\r\n * @param callbacks - Lifecycle callbacks for the drag sequence\r\n */\r\nexport function useDragHandler(containerRef: RefObject<HTMLDivElement>, mode: SplitMode, callbacks: DragCallbacks = {}) {\r\n const { onDragStart, onDragMove, onDragEnd } = callbacks;\r\n\r\n const dragState = useRef<DragState | null>(null);\r\n const finalSizes = useRef<{ prevSize: number; nextSize: number } | null>(null);\r\n\r\n /**\r\n * handleMouseDown\r\n * \r\n * Captures initial state and attaches window-level listeners to begin the \r\n * drag sequence. Calculates and caches container dimensions to avoid \r\n * layout thrashing during movement.\r\n */\r\n const handleMouseDown = useCallback(\r\n (paneIndex: number, e: React.MouseEvent | React.TouchEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const target = e.target as HTMLElement;\r\n if (target.closest('button') || target.tagName === 'BUTTON') {\r\n return;\r\n }\r\n\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const children = Array.from(container.children);\r\n\r\n const prevElementIndex = (paneIndex - 1) * 2;\r\n const nextElementIndex = paneIndex * 2;\r\n\r\n const prevElement = children[prevElementIndex] as HTMLElement;\r\n const nextElement = children[nextElementIndex] as HTMLElement;\r\n\r\n if (!prevElement || !nextElement) return;\r\n\r\n if (prevElement.classList.contains(\"a-split-hidden\") || nextElement.classList.contains(\"a-split-hidden\")) {\r\n return;\r\n }\r\n\r\n const clientX = \"touches\" in e ? (e.touches[0]?.clientX ?? 0) : e.clientX;\r\n const clientY = \"touches\" in e ? (e.touches[0]?.clientY ?? 0) : e.clientY;\r\n\r\n const handlebars = Array.from(container.querySelectorAll(\".a-split-handlebar\")).filter(\r\n (h) => h.parentElement === container\r\n );\r\n\r\n let totalHandlebarSpace = 0;\r\n handlebars.forEach((handlebar) => {\r\n const h = handlebar as HTMLElement;\r\n const style = window.getComputedStyle(h);\r\n \r\n if (mode === \"horizontal\") {\r\n const marginLeft = parseFloat(style.marginLeft) || 0;\r\n const marginRight = parseFloat(style.marginRight) || 0;\r\n totalHandlebarSpace += h.offsetWidth + marginLeft + marginRight;\r\n } else {\r\n const marginTop = parseFloat(style.marginTop) || 0;\r\n const marginBottom = parseFloat(style.marginBottom) || 0;\r\n totalHandlebarSpace += h.offsetHeight + marginTop + marginBottom;\r\n }\r\n });\r\n\r\n\r\n dragState.current = {\r\n active: true,\r\n paneIndex,\r\n startX: clientX,\r\n startY: clientY,\r\n prevElement,\r\n nextElement,\r\n prevInitialWidth: prevElement.offsetWidth,\r\n nextInitialWidth: nextElement.offsetWidth,\r\n prevInitialHeight: prevElement.offsetHeight,\r\n nextInitialHeight: nextElement.offsetHeight,\r\n containerWidth: container.offsetWidth - (mode === \"horizontal\" ? totalHandlebarSpace : 0),\r\n containerHeight: container.offsetHeight - (mode === \"vertical\" ? totalHandlebarSpace : 0),\r\n minPrevSize: parseFloat(prevElement.getAttribute(\"data-min-size\") || \"0\"),\r\n maxPrevSize: parseFloat(prevElement.getAttribute(\"data-max-size\") || \"100\"),\r\n minNextSize: parseFloat(nextElement.getAttribute(\"data-min-size\") || \"0\"),\r\n maxNextSize: parseFloat(nextElement.getAttribute(\"data-max-size\") || \"100\"),\r\n };\r\n\r\n finalSizes.current = null;\r\n\r\n onDragStart?.({ paneIndex });\r\n },\r\n [containerRef, onDragStart, mode],\r\n );\r\n\r\n /**\r\n * calculateDragState\r\n * \r\n * Pure logic to determine new percentage sizes based on current pointer offset.\r\n */\r\n const calculateDragState = useCallback(\r\n (e: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent) => {\r\n const state = dragState.current;\r\n if (!state?.active) return null;\r\n\r\n const isHorizontal = mode === \"horizontal\";\r\n\r\n const clientX = \"touches\" in e ? (e.touches[0]?.clientX ?? 0) : (e as MouseEvent).clientX;\r\n const clientY = \"touches\" in e ? (e.touches[0]?.clientY ?? 0) : (e as MouseEvent).clientY;\r\n\r\n const delta = isHorizontal ? clientX - state.startX : clientY - state.startY;\r\n\r\n const containerSize = isHorizontal ? state.containerWidth : state.containerHeight;\r\n\r\n const prevInitialSize = isHorizontal ? state.prevInitialWidth : state.prevInitialHeight;\r\n const nextInitialSize = isHorizontal ? state.nextInitialWidth : state.nextInitialHeight;\r\n\r\n let prevSizePx = prevInitialSize + delta;\r\n let nextSizePx = nextInitialSize - delta;\r\n\r\n if (prevSizePx < 0) prevSizePx = 0;\r\n if (nextSizePx < 0) nextSizePx = 0;\r\n\r\n const prevSize = (prevSizePx / containerSize) * 100;\r\n const nextSize = (nextSizePx / containerSize) * 100;\r\n\r\n const hitMinPrev = prevSize <= state.minPrevSize;\r\n const hitMaxPrev = prevSize >= state.maxPrevSize;\r\n const hitMinNext = nextSize <= state.minNextSize;\r\n const hitMaxNext = nextSize >= state.maxNextSize;\r\n \r\n if (hitMinPrev || hitMaxPrev || hitMinNext || hitMaxNext) return null;\r\n\r\n return {\r\n prevSize,\r\n nextSize,\r\n prevSizePx,\r\n nextSizePx,\r\n state\r\n };\r\n }, \r\n [mode]\r\n );\r\n\r\n /**\r\n * handleMouseMove\r\n * \r\n * Throttled handler that performs the raw DOM updates for flex-basis properties.\r\n */\r\n const handleMouseMove = useCallback(\r\n throttle((e: MouseEvent | TouchEvent) => {\r\n const result = calculateDragState(e);\r\n if (!result) return;\r\n\r\n const { prevSize, nextSize, prevSizePx, nextSizePx, state } = result;\r\n const { prevInitialWidth, prevInitialHeight } = state;\r\n const prevInitialSize = mode === \"horizontal\" ? prevInitialWidth : prevInitialHeight;\r\n\r\n if (Math.abs(result.prevSizePx - prevInitialSize) <= 1) {\r\n return;\r\n }\r\n\r\n finalSizes.current = { prevSize, nextSize };\r\n\r\n requestAnimationFrame(() => {\r\n if (!state.prevElement || !state.nextElement) return;\r\n\r\n const prevHasPercent = state.prevElement.style.flexBasis.includes(\"%\");\r\n const nextHasPercent = state.nextElement.style.flexBasis.includes(\"%\");\r\n\r\n if (prevHasPercent) {\r\n state.prevElement.style.flexBasis = `${prevSize}%`;\r\n } else {\r\n state.prevElement.style.flexBasis = `${prevSizePx}px`;\r\n }\r\n\r\n if (nextHasPercent) {\r\n state.nextElement.style.flexBasis = `${nextSize}%`;\r\n } else {\r\n state.nextElement.style.flexBasis = `${nextSizePx}px`;\r\n }\r\n });\r\n\r\n onDragMove?.({ paneIndex: state.paneIndex, prevSize, nextSize });\r\n }, 16),\r\n [calculateDragState, mode, onDragMove],\r\n );\r\n\r\n /**\r\n * handleMouseUp\r\n * \r\n * Cleans up the drag sequence and triggers the final React-level update.\r\n */\r\n const handleMouseUp = useCallback((e: MouseEvent | TouchEvent) => {\r\n const state = dragState.current;\r\n if (!state?.active) return;\r\n\r\n const result = calculateDragState(e);\r\n if (result) {\r\n finalSizes.current = { prevSize: result.prevSize, nextSize: result.nextSize };\r\n }\r\n\r\n const sizes = finalSizes.current;\r\n if (sizes) {\r\n onDragEnd?.({ paneIndex: state.paneIndex, prevSize: sizes.prevSize, nextSize: sizes.nextSize });\r\n }\r\n\r\n dragState.current = null;\r\n finalSizes.current = null;\r\n }, [calculateDragState, onDragEnd]);\r\n\r\n useEffect(() => {\r\n const moveHandler = handleMouseMove as any;\r\n const upHandler = handleMouseUp;\r\n\r\n window.addEventListener(\"mousemove\", moveHandler);\r\n window.addEventListener(\"mouseup\", upHandler);\r\n window.addEventListener(\"touchmove\", moveHandler, { passive: false });\r\n window.addEventListener(\"touchend\", upHandler);\r\n\r\n return () => {\r\n window.removeEventListener(\"mousemove\", moveHandler);\r\n window.removeEventListener(\"mouseup\", upHandler);\r\n window.removeEventListener(\"touchmove\", moveHandler);\r\n window.removeEventListener(\"touchend\", upHandler);\r\n };\r\n }, [handleMouseMove, handleMouseUp]);\r\n\r\n return {\r\n handleMouseDown,\r\n };\r\n}\r\n","import { useCallback } from 'react';\r\nimport { debounce } from '../utils/native/throttle';\r\nimport { Pane, SplitMode } from '../types';\r\n\r\n/**\r\n * usePersistence\r\n * \r\n * Manages the serialization and retrieval of pane dimensions to localStorage.\r\n * Handles mode-specific keys to ensure horizontal and vertical layouts for the \r\n * same ID remain distinct.\r\n * \r\n * @param enabled - Whether auto-persistence is toggled on\r\n * @param storageKey - Base identifier for the storage entry\r\n * @param mode - Current split orientation\r\n */\r\nexport function usePersistence(\r\n enabled: boolean,\r\n storageKey: string,\r\n mode: SplitMode\r\n) {\r\n /**\r\n * save\r\n * \r\n * Debounced write operation to commit current pane states to localStorage.\r\n */\r\n const save = useCallback(\r\n debounce((panes: Pane[]) => {\r\n if (!enabled) return;\r\n\r\n try {\r\n const key = `${storageKey}-${mode}`;\r\n const data = panes.map((pane) => ({\r\n id: pane.id,\r\n size: pane.size,\r\n collapsed: pane.collapsed,\r\n }));\r\n\r\n localStorage.setItem(key, JSON.stringify(data));\r\n } catch (error) {\r\n console.warn('Failed to save split state to localStorage:', error);\r\n }\r\n }, 300),\r\n [enabled, storageKey, mode]\r\n );\r\n\r\n /**\r\n * load\r\n * \r\n * Retrieves and parses the saved layout state from localStorage.\r\n */\r\n const load = useCallback((): Array<{\r\n id: string;\r\n size: string;\r\n collapsed: boolean;\r\n }> | null => {\r\n if (!enabled) return null;\r\n\r\n try {\r\n const key = `${storageKey}-${mode}`;\r\n const stored = localStorage.getItem(key);\r\n\r\n if (!stored) return null;\r\n\r\n return JSON.parse(stored);\r\n } catch (error) {\r\n console.warn('Failed to load split state from localStorage:', error);\r\n return null;\r\n }\r\n }, [enabled, storageKey, mode]);\r\n\r\n /**\r\n * clear\r\n * \r\n * Formally removes the stored state for this specific instance and mode.\r\n */\r\n const clear = useCallback(() => {\r\n if (!enabled) return;\r\n\r\n try {\r\n const key = `${storageKey}-${mode}`;\r\n localStorage.removeItem(key);\r\n } catch (error) {\r\n console.warn('Failed to clear split state from localStorage:', error);\r\n }\r\n }, [enabled, storageKey, mode]);\r\n\r\n return {\r\n save,\r\n load,\r\n clear,\r\n };\r\n}\r\n","import { useRef, RefObject, useMemo } from 'react';\r\nimport { PluginContext, SplitState, SplitAction } from '../types';\r\n\r\n/**\r\n * usePluginContext\r\n *\r\n * Internal hook to initialize and provide a stable reference context for plugins.\r\n * This context allows plugins to interact with the Split component's state and\r\n * lifecycle without triggering redundant renders.\r\n *\r\n * The context object itself is stable (same reference), but internally it always\r\n * uses the latest getState/dispatch callbacks through refs.\r\n *\r\n * @param splitId - Unique identifier of the split instance\r\n * @param getState - Callback to retrieve current reactive state\r\n * @param dispatch - Callback to trigger state modifications\r\n * @param containerRef - Ref to the split's underlying DOM element\r\n */\r\nexport function usePluginContext(\r\n splitId: string,\r\n getState: () => SplitState,\r\n dispatch: (action: SplitAction) => void,\r\n containerRef: RefObject<HTMLDivElement | null>\r\n): PluginContext {\r\n // Store latest callbacks in refs so context methods always use current values\r\n const getStateRef = useRef(getState);\r\n const dispatchRef = useRef(dispatch);\r\n\r\n // Update refs on each render\r\n getStateRef.current = getState;\r\n dispatchRef.current = dispatch;\r\n\r\n // Create stable context object once per splitId\r\n const context = useMemo<PluginContext>(() => ({\r\n splitId,\r\n getState: () => getStateRef.current(),\r\n dispatch: (action: SplitAction) => dispatchRef.current(action),\r\n getElement: () => containerRef.current,\r\n getPanes: () => getStateRef.current().panes,\r\n }), [splitId, containerRef]);\r\n\r\n return context;\r\n}\r\n","import React, { createContext, useContext, ReactNode } from 'react';\r\n\r\n/**\r\n * Internal context for tracking the nesting depth of Split components.\r\n */\r\nconst NestingContext = createContext<number>(0);\r\n\r\n/**\r\n * useNestingLevel\r\n * \r\n * Hook to retrieve the current nesting depth.\r\n * 0 indicates top-level, 1 indicates first nested level, etc.\r\n */\r\nexport function useNestingLevel(): number {\r\n return useContext(NestingContext);\r\n}\r\n\r\n/**\r\n * useNeedsFixClass\r\n * \r\n * Determines if a CSS fix class is necessary based on nesting depth.\r\n * Deeply nested layouts sometimes require specific CSS overrides to maintain correct flex distribution.\r\n * \r\n * @param threshold - The nesting level at which the fix class is applied (default: 2)\r\n */\r\nexport function useNeedsFixClass(threshold: number = 2): boolean {\r\n const level = useNestingLevel();\r\n return level > threshold;\r\n}\r\n\r\n/**\r\n * NestingProviderProps\r\n */\r\nexport interface NestingProviderProps {\r\n /** The specific nesting level to provide to children */\r\n level?: number;\r\n /** React children */\r\n children: ReactNode;\r\n}\r\n\r\n/**\r\n * NestingProvider\r\n * \r\n * Provides nesting level information to descendant Split components.\r\n */\r\nexport const NestingProvider: React.FC<NestingProviderProps> = ({\r\n level = 0,\r\n children,\r\n}) => {\r\n return (\r\n <NestingContext.Provider value={level}>\r\n {children}\r\n </NestingContext.Provider>\r\n );\r\n};\r\n\r\nNestingProvider.displayName = 'NestingProvider';\r\n\r\n/**\r\n * withNesting\r\n * \r\n * Higher-Order Component (HOC) that automatically increments the nesting level\r\n * for any component it wraps.\r\n * \r\n * @param Component - The component to be enhanced with nesting detection\r\n */\r\nexport function withNesting<P extends object>(\r\n Component: React.ComponentType<P>\r\n): React.FC<P> {\r\n const WrappedComponent: React.FC<P> = (props) => {\r\n const currentLevel = useNestingLevel();\r\n\r\n return (\r\n <NestingProvider level={currentLevel + 1}>\r\n <Component {...props} />\r\n </NestingProvider>\r\n );\r\n };\r\n\r\n WrappedComponent.displayName = `withNesting(${Component.displayName || Component.name || 'Component'})`;\r\n\r\n return WrappedComponent;\r\n}\r\n","import React from 'react';\r\nimport { DragHandleProps } from '../types';\r\n\r\n/**\r\n * DragHandle\r\n * \r\n * A functional component that renders the resize handlebar between panes.\r\n * Includes interactive buttons for collapsing/expanding adjacent panes and a central grip icon.\r\n * Supports custom rendering via the `renderCustom` prop.\r\n * \r\n * @param props - Component properties including drag and collapse handlers\r\n */\r\nexport const DragHandle: React.FC<DragHandleProps> = ({\r\n index,\r\n mode,\r\n disabled,\r\n lineBar,\r\n onMouseDown,\r\n onTouchStart,\r\n onCollapse,\r\n onExpand,\r\n renderCustom,\r\n leftPaneCollapsed = false,\r\n rightPaneCollapsed = false,\r\n explicitlyDisabled = false,\r\n}) => {\r\n if (renderCustom) {\r\n const handleRenderProps = {\r\n index,\r\n mode,\r\n disabled,\r\n lineBar,\r\n onMouseDown,\r\n onTouchStart: onTouchStart || onMouseDown,\r\n onCollapse,\r\n onExpand,\r\n };\r\n\r\n return (\r\n <div\r\n className=\"a-split-handlebar\"\r\n onMouseDown={(e) => !disabled && onMouseDown(e)}\r\n onTouchStart={(e) => !disabled && (onTouchStart ? onTouchStart(e) : onMouseDown(e))}\r\n >\r\n {renderCustom(handleRenderProps, index)}\r\n </div>\r\n );\r\n }\r\n\r\n const handlebarClass = [\r\n 'a-split-handlebar',\r\n mode === 'horizontal' ? 'a-split-handlebar-horizontal' : 'a-split-handlebar-vertical',\r\n disabled ? 'a-split-handlebar-disabled' : '',\r\n lineBar ? 'a-split-handlebar-line' : '',\r\n ].filter(Boolean).join(' ');\r\n\r\n const handleLeftClick = (e: React.MouseEvent<HTMLButtonElement>) => {\r\n e.stopPropagation();\r\n if (rightPaneCollapsed) {\r\n onExpand?.('right');\r\n } else {\r\n onCollapse?.('left');\r\n }\r\n };\r\n\r\n const handleRightClick = (e: React.MouseEvent<HTMLButtonElement>) => {\r\n e.stopPropagation();\r\n if (leftPaneCollapsed) {\r\n onExpand?.('left');\r\n } else {\r\n onCollapse?.('right');\r\n }\r\n };\r\n\r\n const showButtons = !lineBar && !explicitlyDisabled;\r\n\r\n const isHorizontal = mode === 'horizontal';\r\n\r\n const hideLeftButton = leftPaneCollapsed && !rightPaneCollapsed;\r\n const hideRightButton = rightPaneCollapsed && !leftPaneCollapsed;\r\n\r\n const arrowLeft = isHorizontal ? \"M8 3L4 6L8 9\" : \"M3 8L6 4L9 8\";\r\n const arrowRight = isHorizontal ? \"M4 3L8 6L4 9\" : \"M3 4L6 8L9 4\";\r\n\r\n const leftArrow = arrowLeft;\r\n const rightArrow = arrowRight;\r\n\r\n const hideGrip = leftPaneCollapsed || rightPaneCollapsed;\r\n\r\n return (\r\n <div\r\n className={handlebarClass}\r\n onMouseDown={(e) => !disabled && onMouseDown(e)}\r\n onTouchStart={(e) => !disabled && onMouseDown(e)}\r\n style={{ cursor: disabled ? 'default' : isHorizontal ? 'col-resize' : 'row-resize' }}\r\n >\r\n {showButtons && (\r\n <>\r\n <button\r\n className={`a-split-collapse-btn a-split-collapse-btn-${isHorizontal ? 'left' : 'top'}${hideLeftButton ? ' hidden' : ''}`}\r\n onClick={handleLeftClick}\r\n aria-label={rightPaneCollapsed ? `Expand ${isHorizontal ? 'right' : 'bottom'} pane` : `Collapse ${isHorizontal ? 'left' : 'top'} pane`}\r\n title={rightPaneCollapsed ? `Expand ${isHorizontal ? 'right' : 'bottom'} pane` : `Collapse ${isHorizontal ? 'left' : 'top'} pane`}\r\n >\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d={leftArrow} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n </button>\r\n\r\n <div className={`a-split-grip-icon${hideGrip ? ' hidden' : ''}`} aria-hidden=\"true\">\r\n {isHorizontal ? (\r\n <svg width=\"8\" height=\"24\" viewBox=\"0 0 8 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"4\" cy=\"4\" r=\"2.5\" fill=\"currentColor\" />\r\n <circle cx=\"4\" cy=\"12\" r=\"2.5\" fill=\"currentColor\" />\r\n <circle cx=\"4\" cy=\"20\" r=\"2.5\" fill=\"currentColor\" />\r\n </svg>\r\n ) : (\r\n <svg width=\"24\" height=\"8\" viewBox=\"0 0 24 8\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"4\" cy=\"4\" r=\"2.5\" fill=\"currentColor\" />\r\n <circle cx=\"12\" cy=\"4\" r=\"2.5\" fill=\"currentColor\" />\r\n <circle cx=\"20\" cy=\"4\" r=\"2.5\" fill=\"currentColor\" />\r\n </svg>\r\n )}\r\n </div>\r\n\r\n <button\r\n className={`a-split-collapse-btn a-split-collapse-btn-${isHorizontal ? 'right' : 'bottom'}${hideRightButton ? ' hidden' : ''}`}\r\n onClick={handleRightClick}\r\n aria-label={leftPaneCollapsed ? `Expand ${isHorizontal ? 'left' : 'top'} pane` : `Collapse ${isHorizontal ? 'right' : 'bottom'} pane`}\r\n title={leftPaneCollapsed ? `Expand ${isHorizontal ? 'left' : 'top'} pane` : `Collapse ${isHorizontal ? 'right' : 'bottom'} pane`}\r\n >\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d={rightArrow} stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nDragHandle.displayName = 'DragHandle';\r\n","/**\r\n * Converts a percentage value to pixels based on a reference width.\r\n * \r\n * @param percentage - Numeric percentage (0-100)\r\n * @param referenceWidth - Container or viewport width string\r\n */\r\nexport function percentageToPixel(\r\n percentage: number,\r\n referenceWidth: string\r\n): number {\r\n if (referenceWidth.includes('vw')) {\r\n const vwValue = parseFloat(referenceWidth);\r\n return (percentage / 100) * window.innerWidth * (vwValue / 100);\r\n }\r\n\r\n if (referenceWidth.includes('vh')) {\r\n const vhValue = parseFloat(referenceWidth);\r\n return (percentage / 100) * window.innerHeight * (vhValue / 100);\r\n }\r\n\r\n if (referenceWidth.includes('px')) {\r\n const pxValue = parseFloat(referenceWidth);\r\n return (percentage / 100) * pxValue;\r\n }\r\n\r\n if (referenceWidth.includes('%')) {\r\n console.warn('Percentage reference not fully supported, assuming viewport');\r\n return (percentage / 100) * window.innerWidth * (parseFloat(referenceWidth) / 100);\r\n }\r\n\r\n return (percentage / 100) * parseFloat(referenceWidth);\r\n}\r\n\r\n/**\r\n * Converts a pixel value to a percentage based on a reference width.\r\n * \r\n * @param pixelValue - Size in pixels\r\n * @param referenceWidth - Container or viewport width string\r\n */\r\nexport function pixelToPercentage(\r\n pixelValue: number,\r\n referenceWidth: string\r\n): number {\r\n if (referenceWidth.includes('vw')) {\r\n const vwValue = parseFloat(referenceWidth);\r\n const containerPx = window.innerWidth * (vwValue / 100);\r\n return (pixelValue / containerPx) * 100;\r\n }\r\n\r\n if (referenceWidth.includes('vh')) {\r\n const vhValue = parseFloat(referenceWidth);\r\n const containerPx = window.innerHeight * (vhValue / 100);\r\n return (pixelValue / containerPx) * 100;\r\n }\r\n\r\n if (referenceWidth.includes('px')) {\r\n const pxValue = parseFloat(referenceWidth);\r\n return (pixelValue / pxValue) * 100;\r\n }\r\n\r\n if (referenceWidth.includes('%')) {\r\n console.warn('Percentage reference not fully supported, assuming viewport');\r\n const containerPx = window.innerWidth * (parseFloat(referenceWidth) / 100);\r\n return (pixelValue / containerPx) * 100;\r\n }\r\n\r\n return (pixelValue / parseFloat(referenceWidth)) * 100;\r\n}\r\n\r\n/**\r\n * Normalizes a size string to a target unit (px or %).\r\n * \r\n * @param value - Original size string\r\n * @param containerSize - Current container dimension in pixels\r\n * @param targetUnit - The unit to convert into\r\n */\r\nexport function normalizeSize(\r\n value: string,\r\n containerSize: number,\r\n targetUnit: 'px' | '%'\r\n): string {\r\n const numericValue = parseFloat(value);\r\n\r\n if (value.includes('%')) {\r\n if (targetUnit === 'px') {\r\n return `${(numericValue / 100) * containerSize}px`;\r\n }\r\n return value;\r\n }\r\n\r\n if (value.includes('px')) {\r\n if (targetUnit === '%') {\r\n return `${(numericValue / containerSize) * 100}%`;\r\n }\r\n return value;\r\n }\r\n\r\n return targetUnit === 'px' ? `${numericValue}px` : `${(numericValue / containerSize) * 100}%`;\r\n}\r\n\r\n/**\r\n * Parses a size string and extracts the numeric value and unit.\r\n * \r\n * @param value - The size string (e.g., \"50%\", \"100px\")\r\n */\r\nexport function parseSize(value: string): { value: number; unit: string } {\r\n const numericValue = parseFloat(value);\r\n\r\n if (value.includes('%')) {\r\n return { value: numericValue, unit: '%' };\r\n }\r\n\r\n if (value.includes('px')) {\r\n return { value: numericValue, unit: 'px' };\r\n }\r\n\r\n if (value.includes('vw')) {\r\n return { value: numericValue, unit: 'vw' };\r\n }\r\n\r\n if (value.includes('vh')) {\r\n return { value: numericValue, unit: 'vh' };\r\n }\r\n\r\n if (value.includes('fr')) {\r\n return { value: numericValue, unit: 'fr' };\r\n }\r\n\r\n return { value: numericValue, unit: 'px' };\r\n}\r\n\r\n/**\r\n * Checks if two size strings share the same measurement unit.\r\n */\r\nexport function haveSameUnit(size1: string, size2: string): boolean {\r\n const parsed1 = parseSize(size1);\r\n const parsed2 = parseSize(size2);\r\n return parsed1.unit === parsed2.unit;\r\n}\r\n\r\n/**\r\n * Clamps a size value and appends the appropriate unit.\r\n * \r\n * @param value - Target size\r\n * @param min - Minimum bound\r\n * @param max - Maximum bound\r\n * @param unit - CSS unit string\r\n */\r\nexport function clampSize(\r\n value: number,\r\n min: number,\r\n max: number,\r\n unit: string\r\n): string {\r\n const clamped = Math.max(min, Math.min(max, value));\r\n return `${clamped}${unit}`;\r\n}\r\n","import { Pane, SplitMode } from '../types';\r\nimport { parseSize } from './sizeConversion';\r\n\r\n/**\r\n * Calculates the total size of an array of panes.\r\n * \r\n * @param panes - Array of pane configurations\r\n * @returns Total size and the unit of the first pane\r\n */\r\nexport function calculateTotalSize(panes: Pane[]): { total: number; unit: string } {\r\n if (panes.length === 0) return { total: 0, unit: 'px' };\r\n\r\n const firstPane = panes[0];\r\n if (!firstPane) return { total: 0, unit: 'px' };\r\n\r\n const firstParsed = parseSize(firstPane.size);\r\n let total = 0;\r\n\r\n for (const pane of panes) {\r\n const parsed = parseSize(pane.size);\r\n if (parsed.unit === firstParsed.unit) {\r\n total += parsed.value;\r\n } else {\r\n console.warn(\r\n `Mixed units detected: ${firstParsed.unit} and ${parsed.unit}. Results may be inaccurate.`\r\n );\r\n total += parsed.value;\r\n }\r\n }\r\n\r\n return { total, unit: firstParsed.unit };\r\n}\r\n\r\n/**\r\n * Validates pane size configurations against container constraints.\r\n * \r\n * @param panes - Array of panes\r\n * @param _containerSize - Container size in pixels\r\n * @returns Object indicating validity and a list of errors\r\n */\r\nexport function validatePaneSizes(\r\n panes: Pane[],\r\n _containerSize: number\r\n): { valid: boolean; errors: string[] } {\r\n const errors: string[] = [];\r\n\r\n if (panes.length === 0) {\r\n errors.push('No panes defined');\r\n return { valid: false, errors };\r\n }\r\n\r\n const percentagePanes = panes.filter((p) => p.size.includes('%'));\r\n if (percentagePanes.length > 0) {\r\n const totalPercent = percentagePanes.reduce((sum, pane) => {\r\n return sum + parseFloat(pane.size);\r\n }, 0);\r\n\r\n if (totalPercent > 100.1) {\r\n errors.push(`Total percentage (${totalPercent}%) exceeds 100%`);\r\n }\r\n }\r\n\r\n panes.forEach((pane, index) => {\r\n if (pane.minSize < 0) {\r\n errors.push(`Pane ${index}: minSize cannot be negative`);\r\n }\r\n if (pane.maxSize < pane.minSize) {\r\n errors.push(`Pane ${index}: maxSize (${pane.maxSize}) less than minSize (${pane.minSize})`);\r\n }\r\n if (pane.maxSize > 100) {\r\n errors.push(`Pane ${index}: maxSize (${pane.maxSize}%) exceeds 100%`);\r\n }\r\n });\r\n\r\n return { valid: errors.length === 0, errors };\r\n}\r\n\r\n/**\r\n * Calculates the appropriate flex-basis value for CSS layout.\r\n * \r\n * @param size - Original size string\r\n * @param _containerSize - Container dimension in pixels\r\n * @returns Formatted CSS flex-basis value\r\n */\r\nexport function calculateFlexBasis(size: string, _containerSize: number): string {\r\n const parsed = parseSize(size);\r\n\r\n switch (parsed.unit) {\r\n case '%':\r\n return size;\r\n case 'px':\r\n return size;\r\n case 'vw':\r\n return `${(parsed.value / 100) * window.innerWidth}px`;\r\n case 'vh':\r\n return `${(parsed.value / 100) * window.innerHeight}px`;\r\n case 'fr':\r\n return '0';\r\n default:\r\n return `${parsed.value}px`;\r\n }\r\n}\r\n\r\n/**\r\n * Determines CSS flex-grow and flex-shrink values based on pane state.\r\n * \r\n * @param pane - Pane configuration\r\n * @param isCollapsed - Whether the pane is currently hidden\r\n */\r\nexport function calculateFlexValues(\r\n pane: Pane,\r\n isCollapsed: boolean = false\r\n): { flexGrow: number; flexShrink: number } {\r\n if (isCollapsed) {\r\n return { flexGrow: 0, flexShrink: 0 };\r\n }\r\n\r\n const parsed = parseSize(pane.size);\r\n\r\n if (parsed.unit === '%') {\r\n return { flexGrow: 1, flexShrink: 1 };\r\n }\r\n\r\n if (parsed.unit === 'fr') {\r\n return { flexGrow: parsed.value, flexShrink: 1 };\r\n }\r\n\r\n return { flexGrow: 0, flexShrink: 0 };\r\n}\r\n\r\n/**\r\n * Calculates the pixel position for a handlebar relative to its container.\r\n * \r\n * @param prevPaneSize - Size of the pane preceding the handlebar\r\n * @param containerSize - Total dimension of the container\r\n * @param _mode - Layout orientation\r\n */\r\nexport function calculateHandlebarPosition(\r\n prevPaneSize: string,\r\n containerSize: number,\r\n _mode: SplitMode\r\n): number {\r\n const parsed = parseSize(prevPaneSize);\r\n\r\n if (parsed.unit === '%') {\r\n return (parsed.value / 100) * containerSize;\r\n }\r\n\r\n if (parsed.unit === 'px') {\r\n return parsed.value;\r\n }\r\n\r\n if (parsed.unit === 'vw') {\r\n return (parsed.value / 100) * window.innerWidth;\r\n }\r\n\r\n if (parsed.unit === 'vh') {\r\n return (parsed.value / 100) * window.innerHeight;\r\n }\r\n\r\n return parsed.value;\r\n}\r\n\r\n/**\r\n * Default size of the resize handlebar in pixels.\r\n */\r\nexport const HANDLEBAR_SIZE = 11;\r\n\r\n/**\r\n * Calculates the operational dimensions of the split container.\r\n * \r\n * @param element - Container DOM element\r\n * @param mode - Layout orientation\r\n * @param handlebarCount - Number of resize bars\r\n */\r\nexport function getContainerDimensions(\r\n element: HTMLElement,\r\n mode: SplitMode,\r\n handlebarCount: number = 0\r\n): { width: number; height: number; primary: number; availableForPanes: number } {\r\n const width = element.offsetWidth;\r\n const height = element.offsetHeight;\r\n const primary = mode === 'horizontal' ? width : height;\r\n\r\n const handlebarSpace = handlebarCount * HANDLEBAR_SIZE;\r\n const availableForPanes = primary - handlebarSpace;\r\n\r\n return { width, height, primary, availableForPanes };\r\n}\r\n\r\n/**\r\n * Normalizes pane percentages so they sum exactly to 100%.\r\n */\r\nexport function normalizePaneSizes(panes: Pane[]): Pane[] {\r\n const percentagePanes = panes.filter((p) => p.size.includes('%'));\r\n\r\n if (percentagePanes.length === 0) {\r\n return panes;\r\n }\r\n\r\n const totalPercent = percentagePanes.reduce((sum, pane) => {\r\n return sum + parseFloat(pane.size);\r\n }, 0);\r\n\r\n if (Math.abs(totalPercent - 100) < 0.01) {\r\n return panes;\r\n }\r\n\r\n const adjustmentFactor = 100 / totalPercent;\r\n\r\n return panes.map((pane) => {\r\n if (!pane.size.includes('%')) return pane;\r\n\r\n const currentValue = parseFloat(pane.size);\r\n const newValue = currentValue * adjustmentFactor;\r\n\r\n return {\r\n ...pane,\r\n size: `${newValue}%`,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Checks if a pane resize operation stays within its min/max limits.\r\n */\r\nexport function canResize(pane: Pane, currentSize: number, delta: number): boolean {\r\n const newSize = currentSize + delta;\r\n\r\n if (newSize < pane.minSize) return false;\r\n if (newSize > pane.maxSize) return false;\r\n\r\n return true;\r\n}\r\n\r\n/**\r\n * Retrieves the dimension property ('width' or 'height') associated with an orientation.\r\n */\r\nexport function getAxisProperty(mode: SplitMode): 'width' | 'height' {\r\n return mode === 'horizontal' ? 'width' : 'height';\r\n}\r\n\r\n/**\r\n * Retrieves the coordinate property ('clientX' or 'clientY') associated with an orientation.\r\n */\r\nexport function getCoordinateProperty(mode: SplitMode): 'clientX' | 'clientY' {\r\n return mode === 'horizontal' ? 'clientX' : 'clientY';\r\n}\r\n","import React from 'react';\r\nimport { PaneProps, Pane as PaneType } from '../types';\r\nimport { calculateFlexBasis, calculateFlexValues } from '../utils/layoutCalculations';\r\n\r\n/**\r\n * Pane\r\n * \r\n * Individual split pane component.\r\n * Responsible for rendering individual pane content and applying flex styles.\r\n * \r\n * @param props - Component properties\r\n */\r\nexport const Pane: React.FC<PaneProps> = ({\r\n id,\r\n size: sizeProp,\r\n collapsed,\r\n minSize,\r\n maxSize,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n mode: _mode,\r\n content,\r\n flexGrow: flexGrowProp,\r\n}) => {\r\n const size = sizeProp || '100%';\r\n\r\n const paneConfig: PaneType = {\r\n id,\r\n size,\r\n collapsed,\r\n minSize,\r\n maxSize,\r\n content,\r\n };\r\n const { flexGrow: defaultFlexGrow, flexShrink } = calculateFlexValues(paneConfig, collapsed);\r\n\r\n const flexGrow = flexGrowProp !== undefined ? flexGrowProp : defaultFlexGrow;\r\n\r\n const flexBasis = collapsed ? '0' : calculateFlexBasis(size, 0);\r\n\r\n return (\r\n <div\r\n data-pane-id={id}\r\n data-min-size={minSize}\r\n data-max-size={maxSize}\r\n className={`a-split-pane${collapsed ? ' a-split-hidden' : ''}`}\r\n style={{\r\n flexBasis,\r\n flexGrow,\r\n flexShrink,\r\n overflow: collapsed ? 'hidden' : 'auto',\r\n }}\r\n >\r\n {content}\r\n </div>\r\n );\r\n};\r\n\r\nPane.displayName = 'Pane';\r\n","import {\r\n SplitPlugin,\r\n PluginContext,\r\n DragStartEvent,\r\n DragMoveEvent,\r\n DragEndEvent,\r\n PaneAddEvent,\r\n PaneRemoveEvent,\r\n PaneCollapseEvent,\r\n PaneExpandEvent,\r\n ResizeEvent,\r\n HandleRenderProps,\r\n Pane,\r\n} from '../types';\r\nimport { ReactNode } from 'react';\r\n\r\n/**\r\n * PluginManager\r\n * \r\n * Internal class that orchestrates the lifecycle and events of Split plugins.\r\n * Acts as a bridge between the Split component and registered plugin instances.\r\n */\r\nexport class PluginManager {\r\n private plugins: SplitPlugin[] = [];\r\n private context: PluginContext;\r\n\r\n constructor(context: PluginContext) {\r\n this.context = context;\r\n }\r\n\r\n /**\r\n * Registers a set of plugins and triggers their initialization.\r\n */\r\n registerPlugins(plugins: SplitPlugin[]): void {\r\n this.plugins = plugins;\r\n this.plugins.forEach(plugin => {\r\n if (plugin.onInit) {\r\n plugin.onInit(this.context);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Cleans up all plugins and triggers their destruction hooks.\r\n */\r\n destroy(): void {\r\n this.plugins.forEach(plugin => {\r\n if (plugin.onDestroy) {\r\n plugin.onDestroy(this.context);\r\n }\r\n });\r\n this.plugins = [];\r\n }\r\n\r\n /**\r\n * Notifies plugins when a pane is added.\r\n */\r\n onPaneAdd(event: PaneAddEvent): void {\r\n this.plugins.forEach(plugin => {\r\n if (plugin.onPaneAdd) {\r\n plugin.onPaneAdd(event, this.context);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Notifies plugins when a pane is removed.\r\n */\r\n onPaneRemove(event: PaneRemoveEvent): void {\r\n this.plugins.forEach(plugin => {\r\n if (plugin.onPaneRemove) {\r\n plugin.onPaneRemove(event, this.context);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Notifies plugins when a pane is collapsed.\r\n */\r\n onPaneCollapse(event: PaneCollapseEvent): void {\r\n this.plugins.forEach(plugin => {\r\n if (plugin.onPaneCollapse) {\r\n plugin.onPaneCollapse(event, this.context);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Notifies plugins when a pane is expanded.\r\n */\r\n onPaneExpand(event: PaneExpandEvent): void {\r\n this.plugins.forEach(plugin => {\r\n if (plugin.onPaneExpand) {\r\n plugin.onPaneExpand(event, this.context);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Notifies plugins when a drag operation begins.\r\n */\r\n onDragStart(event: DragStartEvent): void {\r\n this.plugins.forEach(plugin => {\r\n if (plugin.onDragStart) {\r\n plugin.onDragStart(event, this.context);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Notifies plugins during drag movement.\r\n * Plugins can return false to cancel the default drag behavior.\r\n */\r\n onDragMove(event: DragMoveEvent): boolean {\r\n let shouldContinue = true;\r\n\r\n for (const plugin of this.plugins) {\r\n if (plugin.onDragMove) {\r\n const result = plugin.onDragMove(event, this.context);\r\n if (result === false) {\r\n shouldContinue = false;\r\n }\r\n }\r\n }\r\n\r\n return shouldContinue;\r\n }\r\n\r\n /**\r\n * Notifies plugins when a drag operation ends.\r\n */\r\n onDragEnd(event: DragEndEvent): void {\r\n this.plugins.forEach(plugin => {\r\n if (plugin.onDragEnd) {\r\n plugin.onDragEnd(event, this.context);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Notifies plugins when the split container is resized.\r\n */\r\n onResize(event: ResizeEvent): void {\r\n this.plugins.forEach(plugin => {\r\n if (plugin.onResize) {\r\n plugin.onResize(event, this.context);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Allows plugins to provide a custom handlebar renderer.\r\n * Returns the first valid renderer found.\r\n */\r\n renderHandle(props: HandleRenderProps): ReactNode | null {\r\n for (const plugin of this.plugins) {\r\n if (plugin.renderHandle) {\r\n const customHandle = plugin.renderHandle(props, this.context);\r\n if (customHandle) {\r\n return customHandle;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Allows plugins to provide a custom pane wrapper.\r\n * Returns the first valid renderer found.\r\n */\r\n renderPane(pane: Pane): ReactNode | null {\r\n for (const plugin of this.plugins) {\r\n if (plugin.renderPane) {\r\n const customPane = plugin.renderPane(pane, this.context);\r\n if (customPane) {\r\n return customPane;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Retrieves all registered plugins.\r\n */\r\n getPlugins(): SplitPlugin[] {\r\n return this.plugins;\r\n }\r\n\r\n /**\r\n * Retrieves a specific plugin by its unique name.\r\n */\r\n getPlugin(name: string): SplitPlugin | undefined {\r\n return this.plugins.find(plugin => plugin.name === name);\r\n }\r\n\r\n /**\r\n * Checks if a plugin with the given name is currently registered.\r\n */\r\n hasPlugin(name: string): boolean {\r\n return this.plugins.some(plugin => plugin.name === name);\r\n }\r\n}\r\n","/**\r\n * Split\r\n *\r\n * A high-performance, functional split pane component for React.\r\n * Uses direct DOM manipulation for 60fps drag performance.\r\n */\r\n\r\nimport React, { forwardRef, useImperativeHandle, useRef, useEffect, useMemo, useState, useCallback } from \"react\";\r\n// @ts-ignore - SplitSnapshot is used in function signature\r\nimport type { SplitProps, SplitRef, SplitState, SplitAction, SplitSnapshot } from \"../types\";\r\nimport { usePaneManager } from \"../hooks/usePaneManager\";\r\nimport { useDragHandler } from \"../hooks/useDragHandler\";\r\nimport { usePersistence } from \"../hooks/usePersistence\";\r\nimport { usePluginContext } from \"../hooks/usePluginContext\";\r\nimport { isHandlebarDisabled, isHandlebarVisible, isLineBarStyle, shouldShowHandlebar } from \"../utils/paneOperations\";\r\nimport { useNestingLevel, NestingProvider } from \"../contexts/NestingContext\";\r\nimport { DragHandle } from \"./DragHandle\";\r\nimport { Pane } from \"./Pane\";\r\nimport { PluginManager } from \"../plugins/PluginManager\";\r\nimport \"../styles/split.css\";\r\n\r\n/**\r\n * Split Component\r\n *\r\n * Provides a resizable layout container with support for multiple panes,\r\n * custom handlebars, and a plugin system.\r\n *\r\n * @example\r\n * ```tsx\r\n * <Split\r\n * id=\"main-layout\"\r\n * mode=\"horizontal\"\r\n * initialSizes={['30%', '70%']}\r\n * >\r\n * <div id=\"sidebar\">Sidebar Content</div>\r\n * <div id=\"content\">Main Content</div>\r\n * </Split>\r\n * ```\r\n *\r\n * @param props - Component properties\r\n * @param ref - Imperative API reference\r\n */\r\nexport const Split = forwardRef<SplitRef, SplitProps>((props, ref) => {\r\n const {\r\n id: providedId,\r\n mode = \"horizontal\",\r\n initialSizes = [],\r\n minSizes = [],\r\n maxSizes = [],\r\n collapsed = [],\r\n disable = false,\r\n visible = true,\r\n lineBar = false,\r\n renderBar,\r\n plugins = [],\r\n enableSessionStorage = false,\r\n width = null,\r\n height = null,\r\n className = \"\",\r\n style = {},\r\n fixClass = false,\r\n children,\r\n onDragging,\r\n onDragEnd,\r\n onLayoutChange,\r\n } = props;\r\n\r\n const generatedIdRef = useRef(`split-${Math.random().toString(36).slice(2, 11)}`);\r\n const id = providedId || generatedIdRef.current;\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const pluginManagerRef = useRef<PluginManager | null>(null);\r\n\r\n const nestingLevel = useNestingLevel();\r\n const autoFixClass = !fixClass && nestingLevel > 2;\r\n\r\n useEffect(() => {\r\n // Development-only validation warnings - use globalThis to avoid TypeScript errors\r\n const isDevelopment = typeof globalThis !== \"undefined\" &&\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (globalThis as any).process?.env?.NODE_ENV !== \"production\";\r\n if (isDevelopment) {\r\n if (initialSizes.length > 0) {\r\n const childArray = React.Children.toArray(children);\r\n if (initialSizes.length !== childArray.length) {\r\n console.warn(`[Split] initialSizes length (${initialSizes.length}) doesn't match children count (${childArray.length})`);\r\n }\r\n\r\n initialSizes.forEach((size, idx) => {\r\n if (typeof size === \"string\") {\r\n const parsed = parseFloat(size);\r\n if (isNaN(parsed)) {\r\n console.warn(`[Split] Invalid size at index ${idx}: \"${size}\". Expected format: \"50%\", \"100px\", etc.`);\r\n }\r\n if (size.includes(\"%\")) {\r\n const percent = parseFloat(size);\r\n if (percent < 0 || percent > 100) {\r\n console.warn(`[Split] Size at index ${idx} is out of range: \"${size}\". Percentage should be 0-100.`);\r\n }\r\n }\r\n }\r\n });\r\n\r\n const totalPercent = initialSizes.reduce((sum, size) => {\r\n if (typeof size === \"string\" && size.includes(\"%\")) {\r\n return sum + parseFloat(size);\r\n }\r\n return sum;\r\n }, 0);\r\n if (totalPercent > 100) {\r\n console.warn(`[Split] Total percentage (${totalPercent}%) exceeds 100%. Sizes will be normalized.`);\r\n }\r\n }\r\n\r\n if (minSizes.length > 0 || maxSizes.length > 0) {\r\n minSizes.forEach((min, idx) => {\r\n const max = maxSizes[idx];\r\n if (max !== undefined && min > max) {\r\n console.warn(`[Split] minSize (${min}) is greater than maxSize (${max}) at index ${idx}`);\r\n }\r\n if (min < 0 || min > 100) {\r\n console.warn(`[Split] minSize at index ${idx} is out of range: ${min}. Should be 0-100.`);\r\n }\r\n });\r\n maxSizes.forEach((max, idx) => {\r\n if (max < 0 || max > 100) {\r\n console.warn(`[Split] maxSize at index ${idx} is out of range: ${max}. Should be 0-100.`);\r\n }\r\n });\r\n }\r\n\r\n if (collapsed.length > 0) {\r\n const childArray = React.Children.toArray(children);\r\n if (collapsed.length !== childArray.length) {\r\n console.warn(`[Split] collapsed length (${collapsed.length}) doesn't match children count (${childArray.length})`);\r\n }\r\n }\r\n }\r\n }, [initialSizes, minSizes, maxSizes, collapsed, children]);\r\n\r\n const { panes, addPane, removePane, togglePane, setPaneSize, getPaneState, removePanes, swapPanes, collapsePane, expandPane, resizePane } = usePaneManager(\r\n children,\r\n initialSizes,\r\n collapsed,\r\n minSizes,\r\n maxSizes,\r\n id,\r\n );\r\n\r\n const [dragState, setDragState] = useState<any>(null);\r\n\r\n useEffect(() => {\r\n if (dragState && dragState.active) {\r\n document.body.classList.add(\"a-split-body-dragging\");\r\n document.body.classList.add(mode === \"horizontal\" ? \"a-split-body-dragging-horizontal\" : \"a-split-body-dragging-vertical\");\r\n } else {\r\n document.body.classList.remove(\"a-split-body-dragging\");\r\n document.body.classList.remove(\"a-split-body-dragging-horizontal\");\r\n document.body.classList.remove(\"a-split-body-dragging-vertical\");\r\n }\r\n\r\n return () => {\r\n document.body.classList.remove(\"a-split-body-dragging\");\r\n document.body.classList.remove(\"a-split-body-dragging-horizontal\");\r\n document.body.classList.remove(\"a-split-body-dragging-vertical\");\r\n };\r\n }, [dragState, mode]);\r\n\r\n const getState = useCallback((): SplitState => {\r\n return {\r\n panes,\r\n mode,\r\n dragState,\r\n };\r\n }, [panes, mode, dragState]);\r\n\r\n const dispatch = useCallback(\r\n (action: SplitAction) => {\r\n switch (action.type) {\r\n case \"ADD_PANE\":\r\n addPane(action.payload);\r\n break;\r\n case \"REMOVE_PANE\":\r\n removePane(action.payload);\r\n break;\r\n case \"TOGGLE_PANE\":\r\n togglePane(action.payload);\r\n break;\r\n case \"SET_PANE_SIZE\":\r\n setPaneSize(action.payload.index, action.payload.size);\r\n break;\r\n case \"RESTORE_STATE\":\r\n action.payload.panes.forEach((pane, idx) => {\r\n setPaneSize(idx, pane.size);\r\n if (pane.collapsed) {\r\n togglePane(idx);\r\n }\r\n });\r\n break;\r\n case \"ADJUST_PANE_SIZE\":\r\n if (action.payload && dragState?.paneIndex != null) {\r\n const paneIndex = dragState.paneIndex;\r\n const currentPane = panes[paneIndex];\r\n if (currentPane) {\r\n const currentSize = parseFloat(currentPane.size);\r\n const delta = action.payload.direction === \"grow\" ? action.payload.amount : -action.payload.amount;\r\n const newSize = Math.max(currentPane.minSize || 0, Math.min(currentPane.maxSize || 100, currentSize + delta));\r\n setPaneSize(paneIndex, `${newSize}%`);\r\n }\r\n }\r\n break;\r\n }\r\n },\r\n [addPane, removePane, togglePane, setPaneSize, panes, dragState],\r\n );\r\n\r\n const pluginContext = usePluginContext(id, getState, dispatch, containerRef);\r\n\r\n useEffect(() => {\r\n if (plugins.length > 0) {\r\n pluginManagerRef.current = new PluginManager(pluginContext);\r\n pluginManagerRef.current.registerPlugins(plugins);\r\n\r\n return () => {\r\n pluginManagerRef.current?.destroy();\r\n pluginManagerRef.current = null;\r\n };\r\n }\r\n }, [plugins, pluginContext]);\r\n\r\n const persistence = usePersistence(enableSessionStorage, `split-state-${id}`, mode);\r\n\r\n useEffect(() => {\r\n const savedState = persistence.load();\r\n if (savedState && savedState.length === panes.length) {\r\n savedState.forEach((saved, index) => {\r\n if (panes[index] && saved.id === panes[index].id) {\r\n setPaneSize(index, saved.size);\r\n if (saved.collapsed !== panes[index].collapsed) {\r\n togglePane(index);\r\n }\r\n }\r\n });\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n persistence.save(panes);\r\n }, [panes, persistence]);\r\n\r\n // Track whether this is the initial mount, previous children count, and previous initialSizes\r\n const isInitialMountRef = useRef(true);\r\n const prevChildCountRef = useRef(React.Children.count(children));\r\n const prevInitialSizesRef = useRef<string[]>(initialSizes);\r\n\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n if (initialSizes.length === 0) return;\r\n\r\n const currentChildCount = React.Children.count(children);\r\n const childCountChanged = currentChildCount !== prevChildCountRef.current;\r\n\r\n // Check if initialSizes values actually changed (not just reference)\r\n const initialSizesChanged = initialSizes.length !== prevInitialSizesRef.current.length || initialSizes.some((size, idx) => size !== prevInitialSizesRef.current[idx]);\r\n\r\n // Apply initialSizes on:\r\n // 1. First mount\r\n // 2. When children count changes (panes added/removed)\r\n // 3. When initialSizes values actually change\r\n // This preserves user's drag-resized values when other props change\r\n if (isInitialMountRef.current || childCountChanged || initialSizesChanged) {\r\n initialSizes.forEach((size, idx) => {\r\n setPaneSize(idx, size);\r\n });\r\n isInitialMountRef.current = false;\r\n prevChildCountRef.current = currentChildCount;\r\n prevInitialSizesRef.current = initialSizes;\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [children, initialSizes]);\r\n\r\n const collapsedRef = useRef(collapsed);\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n\r\n const collapsedChanged = collapsed.some((val, idx) => val !== collapsedRef.current[idx]);\r\n if (!collapsedChanged && collapsedRef.current.length === collapsed.length) {\r\n return;\r\n }\r\n\r\n collapsedRef.current = collapsed;\r\n\r\n collapsed.forEach((isCollapsed, idx) => {\r\n const pane = panes[idx];\r\n if (pane && pane.collapsed !== isCollapsed) {\r\n if (isCollapsed) {\r\n collapsePane(idx);\r\n } else {\r\n expandPane(idx);\r\n }\r\n }\r\n });\r\n }, [collapsed, panes, collapsePane, expandPane]);\r\n\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n\r\n panes.forEach((pane, idx) => {\r\n const element = containerRef.current?.querySelector(`[data-pane-id=\"${pane.id}\"]`) as HTMLElement | null;\r\n if (element) {\r\n const minSize = minSizes[idx];\r\n const maxSize = maxSizes[idx];\r\n if (minSize !== undefined) {\r\n element.setAttribute(\"data-min-size\", String(minSizes[idx]));\r\n }\r\n if (maxSize !== undefined) {\r\n element.setAttribute(\"data-max-size\", String(maxSizes[idx]));\r\n }\r\n }\r\n });\r\n }, [minSizes, maxSizes, panes]);\r\n\r\n useEffect(() => {\r\n if (!containerRef.current) return;\r\n\r\n const handlebars = containerRef.current.querySelectorAll(\".a-split-handlebar\");\r\n handlebars.forEach((handlebar, idx) => {\r\n const element = handlebar as HTMLElement;\r\n const handlebarIndex = idx + 1;\r\n\r\n const isDisabled = isHandlebarDisabled(handlebarIndex, disable);\r\n if (isDisabled) {\r\n element.classList.add(\"a-split-handlebar-disabled\");\r\n element.style.cursor = \"default\";\r\n } else {\r\n element.classList.remove(\"a-split-handlebar-disabled\");\r\n element.style.cursor = mode === \"horizontal\" ? \"col-resize\" : \"row-resize\";\r\n }\r\n\r\n const isVisible = isHandlebarVisible(handlebarIndex, visible);\r\n element.style.display = isVisible ? \"\" : \"none\";\r\n\r\n const isLinebar = isLineBarStyle(handlebarIndex, lineBar);\r\n if (isLinebar) {\r\n element.classList.add(\"a-split-handlebar-line\");\r\n } else {\r\n element.classList.remove(\"a-split-handlebar-line\");\r\n }\r\n });\r\n }, [disable, visible, lineBar, mode]);\r\n\r\n const { handleMouseDown } = useDragHandler(containerRef, mode, {\r\n onDragStart: (event) => {\r\n setDragState({ active: true, paneIndex: event.paneIndex });\r\n pluginManagerRef.current?.onDragStart(event);\r\n const pane = panes[event.paneIndex];\r\n if (pane) {\r\n onLayoutChange?.(event.paneIndex, pane.id, \"dragging\", null);\r\n }\r\n },\r\n onDragMove: (event) => {\r\n const shouldContinue = pluginManagerRef.current?.onDragMove(event) ?? true;\r\n if (shouldContinue) {\r\n onDragging?.(event.prevSize, event.nextSize, event.paneIndex);\r\n }\r\n },\r\n onDragEnd: (event) => {\r\n setPaneSize(event.paneIndex - 1, `${event.prevSize}%`);\r\n setPaneSize(event.paneIndex, `${event.nextSize}%`);\r\n setDragState(null);\r\n pluginManagerRef.current?.onDragEnd(event);\r\n onDragEnd?.(event.prevSize, event.nextSize, event.paneIndex);\r\n const pane = panes[event.paneIndex];\r\n if (pane) {\r\n onLayoutChange?.(event.paneIndex, pane.id, \"dragged\", null);\r\n }\r\n },\r\n });\r\n\r\n const handleCollapse = useCallback(\r\n (handlebarIndex: number, direction: \"left\" | \"right\") => {\r\n const paneIndexToCollapse = direction === \"left\" ? handlebarIndex - 1 : handlebarIndex;\r\n\r\n if (paneIndexToCollapse >= 0 && paneIndexToCollapse < panes.length) {\r\n collapsePane(paneIndexToCollapse, { direction });\r\n const pane = panes[paneIndexToCollapse];\r\n if (pane) {\r\n pluginManagerRef.current?.onPaneCollapse({ pane, index: paneIndexToCollapse, direction });\r\n onLayoutChange?.(paneIndexToCollapse, pane.id, \"close\", direction);\r\n }\r\n }\r\n },\r\n [panes, collapsePane, onLayoutChange],\r\n );\r\n\r\n const handleExpand = useCallback(\r\n (handlebarIndex: number, direction: \"left\" | \"right\") => {\r\n const paneIndexToExpand = direction === \"left\" ? handlebarIndex - 1 : handlebarIndex;\r\n\r\n if (paneIndexToExpand >= 0 && paneIndexToExpand < panes.length) {\r\n expandPane(paneIndexToExpand, { direction });\r\n const pane = panes[paneIndexToExpand];\r\n if (pane) {\r\n pluginManagerRef.current?.onPaneExpand({ pane, index: paneIndexToExpand, direction });\r\n onLayoutChange?.(paneIndexToExpand, pane.id, \"open\", direction);\r\n }\r\n }\r\n },\r\n [panes, expandPane, onLayoutChange],\r\n );\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n addPane,\r\n removePane,\r\n togglePane,\r\n setPaneSize,\r\n getPaneState,\r\n removePanes,\r\n swapPanes,\r\n collapsePane,\r\n expandPane,\r\n resizePane,\r\n getSnapshot: () => {\r\n const container = containerRef.current;\r\n const totalSize = container ? (mode === \"horizontal\" ? container.offsetWidth : container.offsetHeight) : 0;\r\n\r\n return {\r\n panes: panes.map((p) => ({ ...p })),\r\n totalSize,\r\n mode,\r\n timestamp: Date.now(),\r\n };\r\n },\r\n restore: (snapshot) => {\r\n if (snapshot.mode !== mode) {\r\n console.warn(`Cannot restore snapshot with different mode. Current: ${mode}, Snapshot: ${snapshot.mode}`);\r\n return;\r\n }\r\n\r\n snapshot.panes.forEach((pane, idx) => {\r\n if (panes[idx]) {\r\n setPaneSize(idx, pane.size);\r\n if (pane.collapsed !== panes[idx].collapsed) {\r\n togglePane(idx);\r\n }\r\n }\r\n });\r\n },\r\n }),\r\n [addPane, removePane, togglePane, setPaneSize, getPaneState, removePanes, swapPanes, collapsePane, expandPane, resizePane, panes, mode],\r\n );\r\n\r\n const containerStyles = useMemo(() => {\r\n const baseStyles: React.CSSProperties = {\r\n display: \"flex\",\r\n flexDirection: mode === \"horizontal\" ? \"row\" : \"column\",\r\n width: width || \"100%\",\r\n height: height || \"100%\",\r\n overflow: \"hidden\",\r\n ...style,\r\n };\r\n return baseStyles;\r\n }, [mode, width, height, style]);\r\n\r\n const containerClass = useMemo(() => {\r\n const classes = [\"a-split-container\"];\r\n if (mode === \"vertical\") classes.push(\"a-split-vertical\");\r\n if (fixClass || autoFixClass) classes.push(\"a-split-fix\");\r\n\r\n if (dragState?.active) {\r\n classes.push(\"a-split-dragging\");\r\n }\r\n\r\n if (className) classes.push(className);\r\n return classes.join(\" \");\r\n }, [mode, fixClass, autoFixClass, className, dragState?.active]);\r\n\r\n const renderContent = () => {\r\n const elements: JSX.Element[] = [];\r\n\r\n panes.forEach((pane, index) => {\r\n const wrappedContent = <NestingProvider level={nestingLevel + 1}>{pane.content}</NestingProvider>;\r\n\r\n elements.push(\r\n <Pane\r\n key={pane.id}\r\n id={pane.id}\r\n size={pane.size}\r\n collapsed={pane.collapsed}\r\n minSize={pane.minSize}\r\n maxSize={pane.maxSize}\r\n mode={mode}\r\n content={wrappedContent}\r\n flexGrow={pane.flexGrow}\r\n />,\r\n );\r\n\r\n if (index < panes.length - 1) {\r\n const handlebarIndex = index + 1;\r\n const nextPane = panes[index + 1];\r\n if (!nextPane) return;\r\n\r\n const showHandlebar = shouldShowHandlebar(pane, nextPane);\r\n const isVisible = isHandlebarVisible(handlebarIndex, visible);\r\n const isLinebar = isLineBarStyle(handlebarIndex, lineBar);\r\n\r\n const leftPaneCollapsed = pane.collapsed || false;\r\n const rightPaneCollapsed = nextPane.collapsed || false;\r\n\r\n const explicitlyDisabled = isHandlebarDisabled(handlebarIndex, disable);\r\n const isDisabled = explicitlyDisabled || leftPaneCollapsed || rightPaneCollapsed;\r\n\r\n if (isVisible && showHandlebar) {\r\n const customHandle = pluginManagerRef.current?.renderHandle({\r\n index: handlebarIndex,\r\n mode,\r\n disabled: isDisabled,\r\n lineBar: isLinebar,\r\n onMouseDown: (e: React.MouseEvent | React.TouchEvent) => handleMouseDown(handlebarIndex, e),\r\n });\r\n\r\n if (customHandle) {\r\n elements.push(<React.Fragment key={`handlebar-${handlebarIndex}`}>{customHandle}</React.Fragment>);\r\n } else {\r\n elements.push(\r\n <DragHandle\r\n key={`handlebar-${handlebarIndex}`}\r\n index={handlebarIndex}\r\n mode={mode}\r\n disabled={isDisabled}\r\n lineBar={isLinebar}\r\n explicitlyDisabled={explicitlyDisabled}\r\n onMouseDown={(e: React.MouseEvent | React.TouchEvent) => handleMouseDown(handlebarIndex, e)}\r\n onCollapse={(direction: \"left\" | \"right\") => handleCollapse(handlebarIndex, direction)}\r\n onExpand={(direction: \"left\" | \"right\") => handleExpand(handlebarIndex, direction)}\r\n renderCustom={renderBar}\r\n leftPaneCollapsed={leftPaneCollapsed}\r\n rightPaneCollapsed={rightPaneCollapsed}\r\n />,\r\n );\r\n }\r\n }\r\n }\r\n });\r\n\r\n return elements;\r\n };\r\n\r\n return (\r\n <div ref={containerRef} id={id} className={containerClass} style={containerStyles}>\r\n {renderContent()}\r\n </div>\r\n );\r\n});\r\n\r\nSplit.displayName = \"Split\";\r\n","import { useState, useCallback, useMemo, useRef } from 'react';\r\nimport {\r\n Pane,\r\n AddPaneConfig,\r\n AnimationOptions,\r\n SplitSnapshot,\r\n SplitControllerState,\r\n SplitControllerActions,\r\n UseSplitControllerOptions,\r\n} from '../types';\r\n\r\n/**\r\n * useSplitController\r\n * \r\n * Provides a React-friendly hook to manage the state of a Split layout externally.\r\n * Ideal for building custom UIs where panes need to be synchronized or manipulated \r\n * from outside the actual Split component boundary.\r\n * \r\n * @param options - Configuration for initializing the controller\r\n */\r\nexport function useSplitController(\r\n options: UseSplitControllerOptions = {}\r\n): SplitControllerState & SplitControllerActions {\r\n const {\r\n mode = 'horizontal',\r\n initialPanes = [],\r\n initialSizes = [],\r\n minSizes = [],\r\n maxSizes = [],\r\n onPaneChange,\r\n } = options;\r\n\r\n const [panes, setPanesInternal] = useState<Pane[]>(() => {\r\n if (initialPanes.length > 0) {\r\n return initialPanes;\r\n }\r\n\r\n return initialSizes.map((size, idx) => ({\r\n id: `pane-${idx}`,\r\n size,\r\n collapsed: false,\r\n minSize: minSizes[idx] || 0,\r\n maxSize: maxSizes[idx] || 100,\r\n content: null,\r\n }));\r\n });\r\n\r\n const [isDragging] = useState(false);\r\n const isBatchUpdateRef = useRef(false);\r\n\r\n const setPanes = useCallback(\r\n (newPanes: Pane[] | ((prev: Pane[]) => Pane[])) => {\r\n setPanesInternal((prev) => {\r\n const updated = typeof newPanes === 'function' ? newPanes(prev) : newPanes;\r\n\r\n if (!isBatchUpdateRef.current && onPaneChange) {\r\n onPaneChange(updated);\r\n }\r\n\r\n return updated;\r\n });\r\n },\r\n [onPaneChange]\r\n );\r\n\r\n /**\r\n * Adds a new pane configuration to the controller state.\r\n */\r\n const addPane = useCallback(\r\n (config: AddPaneConfig) => {\r\n setPanes((prevPanes) => {\r\n const position = config.position ?? prevPanes.length;\r\n const newPane: Pane = {\r\n id: `pane-${Date.now()}`,\r\n size: config.size,\r\n collapsed: config.collapsed || false,\r\n minSize: config.minSize || 0,\r\n maxSize: config.maxSize || 100,\r\n content: config.content,\r\n };\r\n\r\n const newPanes = [...prevPanes];\r\n newPanes.splice(position, 0, newPane);\r\n\r\n return newPanes;\r\n });\r\n },\r\n [setPanes]\r\n );\r\n\r\n /**\r\n * Removes a single pane by its index and redistributes sizes.\r\n */\r\n const removePane = useCallback(\r\n (index: number) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const newPanes = [...prevPanes];\r\n const removedPane = newPanes.splice(index, 1)[0];\r\n\r\n if (removedPane && newPanes.length > 0) {\r\n const removedSize = parseFloat(removedPane.size) || 0;\r\n const redistributeAmount = removedSize / newPanes.length;\r\n\r\n return newPanes.map((pane) => ({\r\n ...pane,\r\n size: `${(parseFloat(pane.size) || 0) + redistributeAmount}%`,\r\n }));\r\n }\r\n\r\n return newPanes;\r\n });\r\n },\r\n [setPanes]\r\n );\r\n\r\n /**\r\n * Removes a batch of panes by their indices.\r\n */\r\n const removePanes = useCallback(\r\n (indices: number[]) => {\r\n setPanes((prevPanes) => {\r\n const sortedIndices = [...indices].sort((a, b) => b - a);\r\n let newPanes = [...prevPanes];\r\n let totalRemovedSize = 0;\r\n\r\n sortedIndices.forEach((index) => {\r\n if (index >= 0 && index < newPanes.length) {\r\n const removed = newPanes.splice(index, 1)[0];\r\n if (removed) {\r\n totalRemovedSize += parseFloat(removed.size) || 0;\r\n }\r\n }\r\n });\r\n\r\n if (newPanes.length > 0 && totalRemovedSize > 0) {\r\n const redistributeAmount = totalRemovedSize / newPanes.length;\r\n newPanes = newPanes.map((pane) => ({\r\n ...pane,\r\n size: `${(parseFloat(pane.size) || 0) + redistributeAmount}%`,\r\n }));\r\n }\r\n\r\n return newPanes;\r\n });\r\n },\r\n [setPanes]\r\n );\r\n\r\n /**\r\n * Toggles the collapse state for a specific pane.\r\n */\r\n const togglePane = useCallback(\r\n (index: number) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const pane = prevPanes[index];\r\n if (!pane) return prevPanes;\r\n\r\n const newPanes = [...prevPanes];\r\n newPanes[index] = {\r\n ...pane,\r\n collapsed: !pane.collapsed,\r\n };\r\n\r\n return newPanes;\r\n });\r\n },\r\n [setPanes]\r\n );\r\n\r\n /**\r\n * Forces a pane into a collapsed state.\r\n */\r\n const collapsePane = useCallback(\r\n (index: number) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const pane = prevPanes[index];\r\n if (!pane || pane.collapsed) return prevPanes;\r\n\r\n const newPanes = [...prevPanes];\r\n newPanes[index] = { ...pane, collapsed: true };\r\n\r\n return newPanes;\r\n });\r\n },\r\n [setPanes]\r\n );\r\n\r\n /**\r\n * Forces a pane into an expanded state.\r\n */\r\n const expandPane = useCallback(\r\n (index: number) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const pane = prevPanes[index];\r\n if (!pane || !pane.collapsed) return prevPanes;\r\n\r\n const newPanes = [...prevPanes];\r\n newPanes[index] = { ...pane, collapsed: false };\r\n\r\n return newPanes;\r\n });\r\n },\r\n [setPanes]\r\n );\r\n\r\n /**\r\n * Explicitly sets the size string for a pane.\r\n */\r\n const setPaneSize = useCallback(\r\n (index: number, size: string, _options?: AnimationOptions) => {\r\n setPanes((prevPanes) => {\r\n if (index < 0 || index >= prevPanes.length) return prevPanes;\r\n\r\n const pane = prevPanes[index];\r\n if (!pane) return prevPanes;\r\n\r\n const newPanes = [...prevPanes];\r\n newPanes[index] = { ...pane, size };\r\n\r\n return newPanes;\r\n });\r\n },\r\n [setPanes]\r\n );\r\n\r\n /**\r\n * Swaps the ordering of two panes.\r\n */\r\n const swapPanes = useCallback(\r\n (indexA: number, indexB: number) => {\r\n setPanes((prevPanes) => {\r\n if (\r\n indexA < 0 ||\r\n indexA >= prevPanes.length ||\r\n indexB < 0 ||\r\n indexB >= prevPanes.length ||\r\n indexA === indexB\r\n ) {\r\n return prevPanes;\r\n }\r\n\r\n const newPanes = [...prevPanes];\r\n const temp = newPanes[indexA];\r\n newPanes[indexA] = newPanes[indexB]!;\r\n newPanes[indexB] = temp!;\r\n\r\n return newPanes;\r\n });\r\n },\r\n [setPanes]\r\n );\r\n\r\n /**\r\n * Returns a serializable snapshot of the current state.\r\n */\r\n const getSnapshot = useCallback((): SplitSnapshot => {\r\n return {\r\n panes: panes.map((p) => ({ ...p })),\r\n totalSize: 0,\r\n mode,\r\n timestamp: Date.now(),\r\n };\r\n }, [panes, mode]);\r\n\r\n /**\r\n * Restores the controller state from a snapshot.\r\n */\r\n const restore = useCallback(\r\n (snapshot: SplitSnapshot) => {\r\n if (snapshot.mode !== mode) {\r\n console.warn(\r\n `Cannot restore snapshot with different mode. Current: ${mode}, Snapshot: ${snapshot.mode}`\r\n );\r\n return;\r\n }\r\n\r\n isBatchUpdateRef.current = true;\r\n setPanes((prevPanes) => \r\n snapshot.panes.map((snapshotPane, index) => {\r\n // Try to find matching pane by id, or use index as fallback\r\n const existingPane = prevPanes.find(p => p.id === snapshotPane.id) || prevPanes[index];\r\n \r\n return {\r\n id: snapshotPane.id,\r\n size: snapshotPane.size,\r\n collapsed: snapshotPane.collapsed,\r\n // Preserve existing values, or use defaults if no matching pane found\r\n minSize: existingPane?.minSize ?? 0,\r\n maxSize: existingPane?.maxSize ?? 100,\r\n content: existingPane?.content ?? null,\r\n };\r\n })\r\n );\r\n isBatchUpdateRef.current = false;\r\n\r\n if (onPaneChange) {\r\n setPanesInternal((currentPanes) => {\r\n onPaneChange(currentPanes);\r\n return currentPanes;\r\n });\r\n }\r\n },\r\n [mode, setPanes, onPaneChange]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n panes,\r\n mode,\r\n isDragging,\r\n addPane,\r\n removePane,\r\n removePanes,\r\n togglePane,\r\n collapsePane,\r\n expandPane,\r\n setPaneSize,\r\n swapPanes,\r\n setPanes,\r\n getSnapshot,\r\n restore,\r\n }),\r\n [\r\n panes,\r\n mode,\r\n isDragging,\r\n addPane,\r\n removePane,\r\n removePanes,\r\n togglePane,\r\n collapsePane,\r\n expandPane,\r\n setPaneSize,\r\n swapPanes,\r\n setPanes,\r\n getSnapshot,\r\n restore,\r\n ]\r\n );\r\n}\r\n","import { SplitPlugin } from '../types';\r\n\r\n/**\r\n * Helper function to create a plugin with type safety\r\n *\r\n * @example\r\n * ```typescript\r\n * const myPlugin = createPlugin({\r\n * name: 'my-plugin',\r\n * version: '1.0.0',\r\n * onInit(context) {\r\n * console.log('Plugin initialized for split:', context.splitId);\r\n * },\r\n * onDragEnd(event, context) {\r\n * console.log('Drag ended:', event);\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function createPlugin(plugin: SplitPlugin): SplitPlugin {\r\n return plugin;\r\n}\r\n","import { createPlugin } from '../createPlugin';\r\nimport { SplitState } from '../../types';\r\n\r\n/**\r\n * Storage backend type for persistence.\r\n */\r\nexport type StorageType = 'localStorage' | 'sessionStorage';\r\n\r\n/**\r\n * Options for the persistence plugin.\r\n */\r\nexport interface PersistencePluginOptions {\r\n /** Which storage backend to use */\r\n storage?: StorageType;\r\n /** Custom key used for storage serialization */\r\n key?: string;\r\n /** Milliseconds to debounce save operations */\r\n debounceDelay?: number;\r\n}\r\n\r\n/**\r\n * persistencePlugin\r\n * \r\n * Automatically captures and restores the state of split panes across page reloads.\r\n * Uses a debounced save mechanism to ensure performance during active resizing.\r\n * \r\n * @param options - Plugin configuration options\r\n */\r\nexport function persistencePlugin(options: PersistencePluginOptions = {}) {\r\n const {\r\n storage = 'localStorage',\r\n key: customKey,\r\n debounceDelay = 300,\r\n } = options;\r\n\r\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n const getStorageKey = (splitId: string) =>\r\n customKey || `a-multilayout-splitter:${splitId}`;\r\n\r\n const getStorage = (): Storage | null => {\r\n if (typeof window === 'undefined') return null;\r\n return storage === 'localStorage' ? window.localStorage : window.sessionStorage;\r\n };\r\n\r\n const saveState = (splitId: string, state: SplitState) => {\r\n const storageInstance = getStorage();\r\n if (!storageInstance) return;\r\n\r\n try {\r\n const key = getStorageKey(splitId);\r\n const serialized = JSON.stringify({\r\n panes: state.panes.map(pane => ({\r\n id: pane.id,\r\n size: pane.size,\r\n collapsed: pane.collapsed,\r\n })),\r\n mode: state.mode,\r\n timestamp: Date.now(),\r\n });\r\n storageInstance.setItem(key, serialized);\r\n } catch (error) {\r\n console.error('Failed to save split state:', error);\r\n }\r\n };\r\n\r\n const loadState = (splitId: string): Partial<SplitState> | null => {\r\n const storageInstance = getStorage();\r\n if (!storageInstance) return null;\r\n\r\n try {\r\n const key = getStorageKey(splitId);\r\n const saved = storageInstance.getItem(key);\r\n if (!saved) return null;\r\n\r\n return JSON.parse(saved);\r\n } catch (error) {\r\n console.error('Failed to load split state:', error);\r\n return null;\r\n }\r\n };\r\n\r\n const debouncedSave = (splitId: string, state: SplitState) => {\r\n if (debounceTimer) {\r\n clearTimeout(debounceTimer);\r\n }\r\n debounceTimer = setTimeout(() => {\r\n saveState(splitId, state);\r\n debounceTimer = null;\r\n }, debounceDelay);\r\n };\r\n\r\n return createPlugin({\r\n name: 'persistence',\r\n version: '1.0.0',\r\n\r\n onInit(context) {\r\n const saved = loadState(context.splitId);\r\n const savedPanes = saved?.panes;\r\n\r\n if (savedPanes && savedPanes.length > 0) {\r\n // Use setTimeout to restore state AFTER React has completed initial render\r\n // and applied initialSizes. This ensures persistence overrides initialSizes.\r\n setTimeout(() => {\r\n const currentState = context.getState();\r\n // Only restore if pane count matches (layout structure unchanged)\r\n if (currentState.panes.length === savedPanes.length) {\r\n context.dispatch({\r\n type: 'RESTORE_STATE',\r\n payload: { panes: savedPanes as { size: string; collapsed: boolean; id: string }[] },\r\n });\r\n }\r\n }, 0);\r\n } else {\r\n // No saved state - save the initial state after render completes\r\n setTimeout(() => {\r\n const state = context.getState();\r\n saveState(context.splitId, state);\r\n }, 0);\r\n }\r\n },\r\n\r\n onDragEnd(_event, context) {\r\n // Use setTimeout to ensure state is updated after React's state batch\r\n // The drag handler calls setPaneSize before onDragEnd, but React batches state updates\r\n setTimeout(() => {\r\n const state = context.getState();\r\n debouncedSave(context.splitId, state);\r\n }, 0);\r\n },\r\n\r\n onPaneAdd(_event, context) {\r\n setTimeout(() => {\r\n const state = context.getState();\r\n debouncedSave(context.splitId, state);\r\n }, 0);\r\n },\r\n\r\n onPaneRemove(_event, context) {\r\n setTimeout(() => {\r\n const state = context.getState();\r\n debouncedSave(context.splitId, state);\r\n }, 0);\r\n },\r\n\r\n onPaneCollapse(_event, context) {\r\n setTimeout(() => {\r\n const state = context.getState();\r\n debouncedSave(context.splitId, state);\r\n }, 0);\r\n },\r\n\r\n onPaneExpand(_event, context) {\r\n setTimeout(() => {\r\n const state = context.getState();\r\n debouncedSave(context.splitId, state);\r\n }, 0);\r\n },\r\n\r\n onDestroy() {\r\n if (debounceTimer) {\r\n clearTimeout(debounceTimer);\r\n debounceTimer = null;\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Utility to manually clear the persisted state for a specific split ID.\r\n * \r\n * @param splitId - Unique ID of the split instance to clear\r\n * @param storage - The storage backend that was used\r\n */\r\nexport function clearPersistedState(\r\n splitId: string,\r\n storage: StorageType = 'localStorage'\r\n): void {\r\n const storageInstance =\r\n storage === 'localStorage' ? window.localStorage : window.sessionStorage;\r\n\r\n try {\r\n const key = `a-multilayout-splitter:${splitId}`;\r\n storageInstance.removeItem(key);\r\n } catch (error) {\r\n console.error('Failed to clear persisted state:', error);\r\n }\r\n}\r\n","import { createPlugin } from '../createPlugin';\r\n\r\n/**\r\n * Options for the keyboard navigation plugin.\r\n */\r\nexport interface KeyboardPluginOptions {\r\n /** Enable arrow key resizing */\r\n enableArrowKeys?: boolean;\r\n /** Enable number key (1-9) to focus specific panes */\r\n enableNumberKeys?: boolean;\r\n /** Relative step size for each arrow key press (percentage) */\r\n stepSize?: number;\r\n /** Enable Tab to cycle through panes */\r\n enableTabNavigation?: boolean;\r\n}\r\n\r\n/**\r\n * keyboardPlugin\r\n *\r\n * Provides accessibility enhancements by enabling keyboard navigation.\r\n * Supports resizing via arrows, focusing via numbers, and Tab cycling.\r\n *\r\n * @param options - Plugin configuration options\r\n */\r\nexport function keyboardPlugin(options: KeyboardPluginOptions = {}) {\r\n const {\r\n enableArrowKeys = true,\r\n enableNumberKeys = true,\r\n stepSize = 5,\r\n enableTabNavigation = true,\r\n } = options;\r\n\r\n let currentFocusedPaneIndex = 0;\r\n let keydownHandler: ((e: KeyboardEvent) => void) | null = null;\r\n\r\n const focusPane = (element: HTMLElement | null, index: number) => {\r\n if (!element) return;\r\n\r\n const panes = element.querySelectorAll('.a-split-pane');\r\n const pane = panes[index] as HTMLElement;\r\n\r\n if (pane) {\r\n pane.focus();\r\n pane.setAttribute('tabindex', '0');\r\n currentFocusedPaneIndex = index;\r\n }\r\n };\r\n\r\n return createPlugin({\r\n name: 'keyboard',\r\n version: '1.0.0',\r\n\r\n onInit(context) {\r\n const element = context.getElement();\r\n if (!element) return;\r\n\r\n element.setAttribute('tabindex', '0');\r\n const panes = element.querySelectorAll('.a-split-pane');\r\n panes.forEach((pane, index) => {\r\n (pane as HTMLElement).setAttribute('tabindex', index === 0 ? '0' : '-1');\r\n });\r\n\r\n keydownHandler = (e: KeyboardEvent) => {\r\n const state = context.getState();\r\n const panesState = state.panes;\r\n\r\n if (enableArrowKeys) {\r\n if (\r\n e.key === 'ArrowLeft' ||\r\n e.key === 'ArrowRight' ||\r\n e.key === 'ArrowUp' ||\r\n e.key === 'ArrowDown'\r\n ) {\r\n e.preventDefault();\r\n\r\n const isHorizontal = state.mode === 'horizontal';\r\n const isIncrease =\r\n (isHorizontal && e.key === 'ArrowRight') ||\r\n (!isHorizontal && e.key === 'ArrowDown');\r\n\r\n // Use currentFocusedPaneIndex to determine which pane to resize\r\n // Resize the focused pane and the next pane (or previous if last pane)\r\n const paneIndex = currentFocusedPaneIndex;\r\n const currentPane = panesState[paneIndex];\r\n const neighborIndex = paneIndex < panesState.length - 1 ? paneIndex + 1 : paneIndex - 1;\r\n const neighborPane = panesState[neighborIndex];\r\n\r\n if (!currentPane || !neighborPane) return;\r\n\r\n const currentSize = parseFloat(currentPane.size);\r\n const neighborSize = parseFloat(neighborPane.size);\r\n\r\n // Calculate new sizes\r\n const delta = isIncrease ? stepSize : -stepSize;\r\n let newCurrentSize = currentSize + delta;\r\n let newNeighborSize = neighborSize - delta;\r\n\r\n // Apply min/max constraints\r\n const minCurrent = currentPane.minSize || 0;\r\n const maxCurrent = currentPane.maxSize || 100;\r\n const minNeighbor = neighborPane.minSize || 0;\r\n const maxNeighbor = neighborPane.maxSize || 100;\r\n\r\n newCurrentSize = Math.max(minCurrent, Math.min(maxCurrent, newCurrentSize));\r\n newNeighborSize = Math.max(minNeighbor, Math.min(maxNeighbor, newNeighborSize));\r\n\r\n // Ensure total remains consistent\r\n const total = currentSize + neighborSize;\r\n if (newCurrentSize + newNeighborSize !== total) {\r\n // Adjust if constraints prevented full resize\r\n if (newCurrentSize === minCurrent || newCurrentSize === maxCurrent) {\r\n newNeighborSize = total - newCurrentSize;\r\n } else {\r\n newCurrentSize = total - newNeighborSize;\r\n }\r\n }\r\n\r\n // Apply sizes via dispatch\r\n context.dispatch({\r\n type: 'SET_PANE_SIZE',\r\n payload: { index: paneIndex, size: `${newCurrentSize}%` },\r\n });\r\n context.dispatch({\r\n type: 'SET_PANE_SIZE',\r\n payload: { index: neighborIndex, size: `${newNeighborSize}%` },\r\n });\r\n }\r\n }\r\n\r\n if (enableNumberKeys) {\r\n const num = parseInt(e.key, 10);\r\n if (!isNaN(num) && num >= 1 && num <= 9) {\r\n const paneIndex = num - 1;\r\n if (paneIndex < panesState.length) {\r\n focusPane(element, paneIndex);\r\n }\r\n }\r\n }\r\n\r\n if (enableTabNavigation && e.key === 'Tab') {\r\n e.preventDefault();\r\n\r\n let nextIndex = e.shiftKey\r\n ? currentFocusedPaneIndex - 1\r\n : currentFocusedPaneIndex + 1;\r\n\r\n if (nextIndex < 0) {\r\n nextIndex = panesState.length - 1;\r\n } else if (nextIndex >= panesState.length) {\r\n nextIndex = 0;\r\n }\r\n\r\n focusPane(element, nextIndex);\r\n }\r\n };\r\n\r\n element.addEventListener('keydown', keydownHandler);\r\n },\r\n\r\n onDestroy(context) {\r\n const element = context.getElement();\r\n if (element && keydownHandler) {\r\n element.removeEventListener('keydown', keydownHandler);\r\n keydownHandler = null;\r\n }\r\n },\r\n });\r\n}\r\n","import React, { ComponentType, ReactNode } from 'react';\r\nimport { createPlugin } from '../createPlugin';\r\nimport { HandleRenderProps } from '../../types';\r\n\r\n/**\r\n * Props for custom handle components\r\n */\r\nexport interface CustomHandleComponentProps extends HandleRenderProps {\r\n /** Additional custom props */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Creates a custom handle plugin that replaces default handles\r\n *\r\n * This allows full control over handle appearance and behavior while\r\n * maintaining all features like disable, lineBar, collapse/expand, etc.\r\n *\r\n * @example\r\n * ```typescript\r\n * const MyCustomHandle = ({ index, disabled, onMouseDown }) => (\r\n * <div\r\n * className=\"my-handle\"\r\n * onMouseDown={disabled ? undefined : onMouseDown}\r\n * >\r\n * <span>Handle {index}</span>\r\n * </div>\r\n * );\r\n *\r\n * <Split plugins={[customHandlePlugin(MyCustomHandle)]}>\r\n * ...\r\n * </Split>\r\n * ```\r\n */\r\nexport function customHandlePlugin(\r\n component: ComponentType<CustomHandleComponentProps>,\r\n additionalProps?: Record<string, any>\r\n) {\r\n return createPlugin({\r\n name: 'custom-handle',\r\n version: '1.0.0',\r\n\r\n renderHandle(props: HandleRenderProps): ReactNode {\r\n return React.createElement(component, {\r\n ...props,\r\n ...additionalProps,\r\n });\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Creates a custom handle plugin with a render function\r\n *\r\n * @example\r\n * ```typescript\r\n * <Split\r\n * plugins={[\r\n * customHandleRenderPlugin((props) => (\r\n * <div className=\"my-handle\">\r\n * {!props.disabled && <DragIndicator />}\r\n * </div>\r\n * ))\r\n * ]}\r\n * >\r\n * ...\r\n * </Split>\r\n * ```\r\n */\r\nexport function customHandleRenderPlugin(\r\n render: (props: HandleRenderProps) => ReactNode\r\n) {\r\n return createPlugin({\r\n name: 'custom-handle-render',\r\n version: '1.0.0',\r\n\r\n renderHandle(props: HandleRenderProps): ReactNode {\r\n return render(props);\r\n },\r\n });\r\n}\r\n","import {\r\n createContext,\r\n useContext,\r\n useRef,\r\n useMemo,\r\n ReactNode,\r\n} from 'react';\r\nimport { Pane, SplitMode, AddPaneConfig, AnimationOptions } from '../types';\r\n\r\n/**\r\n * SplitConfig\r\n */\r\nexport interface SplitConfig {\r\n /** Unique identifier for the split instance */\r\n id: string;\r\n /** Current layout orientation */\r\n mode: SplitMode;\r\n /** Whether session persistence is active */\r\n enableSessionStorage: boolean;\r\n /** Key used for localStorage persistence */\r\n storageKey: string;\r\n}\r\n\r\n/**\r\n * SplitState\r\n */\r\nexport interface SplitState {\r\n /** Current list of pane configurations */\r\n panes: Pane[];\r\n /** Whether a drag operation is currently active */\r\n isDragging: boolean;\r\n /** Index of the handlebar currently being dragged */\r\n activeHandlebar: number | null;\r\n}\r\n\r\n/**\r\n * SplitActions\r\n */\r\nexport interface SplitActions {\r\n /** Programmatically add a new pane */\r\n addPane: (config: AddPaneConfig) => void;\r\n /** Programmatically remove a pane by index */\r\n removePane: (index: number) => void;\r\n /** Toggle the collapse state of a pane */\r\n togglePane: (index: number) => void;\r\n /** Explicitly set the size of a pane */\r\n setPaneSize: (index: number, size: string, options?: AnimationOptions) => void;\r\n /** Retrieve the current reactive pane state */\r\n getPaneState: () => Pane[];\r\n /** Internal action to update drag state */\r\n setDragging: (dragging: boolean, handlebar?: number) => void;\r\n}\r\n\r\nconst ConfigContext = createContext<SplitConfig | null>(null);\r\nconst StateContext = createContext<SplitState | null>(null);\r\nconst ActionsContext = createContext<SplitActions | null>(null);\r\n\r\n/**\r\n * SplitProviderProps\r\n */\r\nexport interface SplitProviderProps {\r\n id: string;\r\n mode?: SplitMode;\r\n enableSessionStorage?: boolean;\r\n storageKey?: string;\r\n children: ReactNode;\r\n\r\n // Internal props injected by the Split component\r\n /** @internal */\r\n _panes?: Pane[];\r\n /** @internal */\r\n _addPane?: (config: AddPaneConfig) => void;\r\n /** @internal */\r\n _removePane?: (index: number) => void;\r\n /** @internal */\r\n _togglePane?: (index: number) => void;\r\n /** @internal */\r\n _setPaneSize?: (index: number, size: string, options?: AnimationOptions) => void;\r\n /** @internal */\r\n _getPaneState?: () => Pane[];\r\n}\r\n\r\n/**\r\n * SplitProvider\r\n * \r\n * An optional context provider that exposes split state and actions to nested components.\r\n * Useful for building custom toolbars or complex layouts that need to interact with the splitter.\r\n * \r\n * @param props - Provider configuration\r\n */\r\nexport function SplitProvider({\r\n id,\r\n mode = 'horizontal',\r\n enableSessionStorage = false,\r\n storageKey = `split-state-${id}`,\r\n children,\r\n _panes = [],\r\n _addPane,\r\n _removePane,\r\n _togglePane,\r\n _setPaneSize,\r\n _getPaneState,\r\n}: SplitProviderProps) {\r\n const dragStateRef = useRef({ isDragging: false, activeHandlebar: null as number | null });\r\n\r\n const config = useMemo<SplitConfig>(\r\n () => ({\r\n id,\r\n mode,\r\n enableSessionStorage,\r\n storageKey,\r\n }),\r\n [id, mode, enableSessionStorage, storageKey]\r\n );\r\n\r\n const state = useMemo<SplitState>(\r\n () => ({\r\n panes: _panes,\r\n isDragging: dragStateRef.current.isDragging,\r\n activeHandlebar: dragStateRef.current.activeHandlebar,\r\n }),\r\n [_panes, dragStateRef.current.isDragging, dragStateRef.current.activeHandlebar]\r\n );\r\n\r\n const actions = useMemo<SplitActions>(\r\n () => ({\r\n addPane: _addPane || (() => console.warn('addPane not available')),\r\n removePane: _removePane || (() => console.warn('removePane not available')),\r\n togglePane: _togglePane || (() => console.warn('togglePane not available')),\r\n setPaneSize: _setPaneSize || (() => console.warn('setPaneSize not available')),\r\n getPaneState: _getPaneState || (() => []),\r\n setDragging: (dragging: boolean, handlebar?: number) => {\r\n dragStateRef.current.isDragging = dragging;\r\n dragStateRef.current.activeHandlebar = handlebar ?? null;\r\n },\r\n }),\r\n [_addPane, _removePane, _togglePane, _setPaneSize, _getPaneState]\r\n );\r\n\r\n return (\r\n <ConfigContext.Provider value={config}>\r\n <StateContext.Provider value={state}>\r\n <ActionsContext.Provider value={actions}>\r\n {children}\r\n </ActionsContext.Provider>\r\n </StateContext.Provider>\r\n </ConfigContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * useSplitConfig\r\n * \r\n * Hook to retrieve the static configuration of the current Split instance.\r\n */\r\nexport function useSplitConfig(): SplitConfig {\r\n const context = useContext(ConfigContext);\r\n if (!context) {\r\n throw new Error('useSplitConfig must be used within SplitProvider');\r\n }\r\n return context;\r\n}\r\n\r\n/**\r\n * useSplitState\r\n * \r\n * Hook to subscribe to the reactive state (panes, drag status) of the Split instance.\r\n */\r\nexport function useSplitState(): SplitState {\r\n const context = useContext(StateContext);\r\n if (!context) {\r\n throw new Error('useSplitState must be used within SplitProvider');\r\n }\r\n return context;\r\n}\r\n\r\n/**\r\n * useSplitActions\r\n * \r\n * Hook to access methods for controlling the Split instance.\r\n * These methods are stable and do not trigger re-renders.\r\n */\r\nexport function useSplitActions(): SplitActions | null {\r\n const context = useContext(ActionsContext);\r\n return context;\r\n}\r\n\r\n/**\r\n * useSplit\r\n * \r\n * Convenience hook that returns the full split context (config, state, and actions).\r\n */\r\nexport function useSplit(): {\r\n config: SplitConfig;\r\n state: SplitState;\r\n actions: SplitActions;\r\n} {\r\n const actions = useSplitActions();\r\n if (!actions) {\r\n throw new Error('useSplit must be used within SplitProvider');\r\n }\r\n return {\r\n config: useSplitConfig(),\r\n state: useSplitState(),\r\n actions,\r\n };\r\n}\r\n\r\n/**\r\n * usePane\r\n * \r\n * Fine-grained hook to subscribe to state updates for a specific pane.\r\n */\r\nexport function usePane(index: number): Pane | undefined {\r\n const { panes } = useSplitState();\r\n return panes[index];\r\n}\r\n\r\n/**\r\n * usePaneCount\r\n * \r\n * Hook to retrieve and subscribe to the total number of panes.\r\n */\r\nexport function usePaneCount(): number {\r\n const { panes } = useSplitState();\r\n return panes.length;\r\n}\r\n\r\n/**\r\n * useIsDragging\r\n * \r\n * Hook to subscribe specifically to the active dragging status.\r\n */\r\nexport function useIsDragging(): boolean {\r\n const { isDragging } = useSplitState();\r\n return isDragging;\r\n}\r\n\r\n/**\r\n * useIsCollapsed\r\n * \r\n * Hook to check and subscribe to the collapsed state of a specific pane.\r\n */\r\nexport function useIsCollapsed(index: number): boolean {\r\n const pane = usePane(index);\r\n return pane?.collapsed ?? false;\r\n}\r\n\r\n/**\r\n * useVisiblePanes\r\n * \r\n * Hook to retrieve and subscribe to only the currently expanded panes.\r\n */\r\nexport function useVisiblePanes(): Pane[] {\r\n const { panes } = useSplitState();\r\n return useMemo(() => panes.filter((p) => !p.collapsed), [panes]);\r\n}\r\n"],"names":["applyCollapseState","element","collapsed","animatePaneSize","targetSize","options","resolve","duration","togglePaneCollapse","pane","findPaneIndex","panes","id","isPaneVisible","getVisiblePanes","getPaneElement","constrainSize","value","minSize","maxSize","createPane","size","content","updatePaneSize","newSize","batchUpdatePanes","updates","update","restorePaneState","savedState","serializePaneState","shouldShowHandlebar","_prevPane","_nextPane","isHandlebarDisabled","index","disable","isHandlebarVisible","visible","isLineBarStyle","lineBar","usePaneManager","children","initialSizes","minSizes","maxSizes","splitId","setPanes","useState","React","child","prevChildrenRef","useRef","useEffect","childArray","prevChildArray","prevPanes","hasChanges","newPanes","newChild","prevChild","addPane","useCallback","config","position","newPane","redistributeSizesOnAdd","removePane","removedPane","redistributeSizesOnRemove","togglePane","currentPane","updatedPane","setPaneSize","getPaneState","removePanes","indices","sortedIndices","b","totalRemovedSize","removed","redistributeAmount","swapPanes","indexA","indexB","temp","collapsePane","direction","adjacentIndex","i","expandPane","openPaneCountAfter","p","totalPanes","adjacentPane","resizePane","delta","currentSize","addedIndex","addedSize","addedValue","totalOtherSize","_","sum","scaleFactor","newValue","removedSize","removedValue","distributionAmount","throttle","func","wait","timeout","lastRun","args","now","debounce","useDragHandler","containerRef","mode","callbacks","onDragStart","onDragMove","onDragEnd","dragState","finalSizes","handleMouseDown","paneIndex","e","target","container","prevElementIndex","nextElementIndex","prevElement","nextElement","clientX","_a","clientY","_b","handlebars","h","totalHandlebarSpace","handlebar","style","marginLeft","marginRight","marginTop","marginBottom","calculateDragState","state","isHorizontal","containerSize","prevInitialSize","nextInitialSize","prevSizePx","nextSizePx","prevSize","nextSize","hitMinPrev","hitMaxPrev","hitMinNext","hitMaxNext","handleMouseMove","result","prevInitialWidth","prevInitialHeight","prevHasPercent","nextHasPercent","handleMouseUp","sizes","moveHandler","upHandler","usePersistence","enabled","storageKey","save","key","data","error","load","stored","clear","usePluginContext","getState","dispatch","getStateRef","dispatchRef","useMemo","action","NestingContext","createContext","useNestingLevel","useContext","NestingProvider","level","withNesting","Component","WrappedComponent","props","currentLevel","jsx","DragHandle","disabled","onMouseDown","onTouchStart","onCollapse","onExpand","renderCustom","leftPaneCollapsed","rightPaneCollapsed","explicitlyDisabled","handleRenderProps","handlebarClass","handleLeftClick","handleRightClick","showButtons","hideLeftButton","hideRightButton","arrowLeft","arrowRight","leftArrow","rightArrow","hideGrip","jsxs","Fragment","percentageToPixel","percentage","referenceWidth","vwValue","vhValue","pxValue","pixelToPercentage","pixelValue","containerPx","normalizeSize","targetUnit","numericValue","parseSize","haveSameUnit","size1","size2","parsed1","parsed2","clampSize","min","max","unit","calculateTotalSize","firstPane","firstParsed","total","parsed","validatePaneSizes","_containerSize","errors","percentagePanes","totalPercent","calculateFlexBasis","calculateFlexValues","isCollapsed","calculateHandlebarPosition","prevPaneSize","_mode","HANDLEBAR_SIZE","getContainerDimensions","handlebarCount","width","height","primary","handlebarSpace","availableForPanes","normalizePaneSizes","adjustmentFactor","canResize","getAxisProperty","getCoordinateProperty","Pane","sizeProp","flexGrowProp","paneConfig","defaultFlexGrow","flexShrink","flexGrow","flexBasis","PluginManager","context","__publicField","plugins","plugin","event","shouldContinue","customHandle","customPane","name","Split","forwardRef","ref","providedId","renderBar","enableSessionStorage","className","fixClass","onDragging","onLayoutChange","generatedIdRef","pluginManagerRef","nestingLevel","autoFixClass","idx","percent","setDragState","pluginContext","persistence","saved","isInitialMountRef","prevChildCountRef","prevInitialSizesRef","currentChildCount","childCountChanged","initialSizesChanged","collapsedRef","val","handlebarIndex","isVisible","handleCollapse","paneIndexToCollapse","handleExpand","paneIndexToExpand","useImperativeHandle","totalSize","snapshot","containerStyles","containerClass","classes","renderContent","elements","wrappedContent","nextPane","showHandlebar","isLinebar","isDisabled","useSplitController","initialPanes","onPaneChange","setPanesInternal","isDragging","isBatchUpdateRef","prev","updated","a","_options","getSnapshot","restore","snapshotPane","existingPane","currentPanes","createPlugin","persistencePlugin","storage","customKey","debounceDelay","debounceTimer","getStorageKey","getStorage","saveState","storageInstance","serialized","loadState","debouncedSave","savedPanes","_event","clearPersistedState","keyboardPlugin","enableArrowKeys","enableNumberKeys","stepSize","enableTabNavigation","currentFocusedPaneIndex","keydownHandler","focusPane","panesState","isIncrease","neighborIndex","neighborPane","neighborSize","newCurrentSize","newNeighborSize","minCurrent","maxCurrent","minNeighbor","maxNeighbor","num","nextIndex","customHandlePlugin","component","additionalProps","customHandleRenderPlugin","render","ConfigContext","StateContext","ActionsContext","SplitProvider","_panes","_addPane","_removePane","_togglePane","_setPaneSize","_getPaneState","dragStateRef","actions","dragging","useSplitConfig","useSplitState","useSplitActions","useSplit","usePane","usePaneCount","useIsDragging","useIsCollapsed","useVisiblePanes"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './src/index'
2
+ import AMultiLayoutSplitter from './src/index'
3
+ export default AMultiLayoutSplitter