react-panel-layout 0.4.1 → 0.4.2
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/README.md +291 -0
- package/dist/FloatingPanelFrame-SOrLGjZd.js +67 -0
- package/dist/FloatingPanelFrame-SOrLGjZd.js.map +1 -0
- package/dist/FloatingPanelFrame-XtBcHANI.cjs +2 -0
- package/dist/FloatingPanelFrame-XtBcHANI.cjs.map +1 -0
- package/dist/{GridLayout-DZCV1X-3.js → GridLayout-CLvW8jID.js} +516 -502
- package/dist/GridLayout-CLvW8jID.js.map +1 -0
- package/dist/GridLayout-qufTyOQM.cjs +2 -0
- package/dist/GridLayout-qufTyOQM.cjs.map +1 -0
- package/dist/components/pivot/PivotLayer.d.ts +14 -0
- package/dist/config/PanelContentDeclaration.d.ts +20 -0
- package/dist/config/panelRouter.d.ts +3 -1
- package/dist/config.cjs +1 -1
- package/dist/config.cjs.map +1 -1
- package/dist/config.js +125 -76
- package/dist/config.js.map +1 -1
- package/dist/constants/styles.d.ts +8 -0
- package/dist/floating.cjs +1 -1
- package/dist/floating.js +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +573 -500
- package/dist/index.js.map +1 -1
- package/dist/modules/panels/rendering/ContentRegistry.d.ts +50 -0
- package/dist/modules/panels/rendering/RenderContext.d.ts +1 -0
- package/dist/modules/panels/state/types.d.ts +2 -2
- package/dist/modules/pivot/PivotContent.d.ts +29 -0
- package/dist/modules/pivot/index.d.ts +5 -0
- package/dist/modules/pivot/types.d.ts +62 -0
- package/dist/modules/pivot/usePivot.d.ts +28 -0
- package/dist/pivot/index.d.ts +8 -0
- package/dist/pivot.cjs +2 -0
- package/dist/pivot.cjs.map +1 -0
- package/dist/pivot.js +5 -0
- package/dist/pivot.js.map +1 -0
- package/dist/styles-DcG3aIFx.cjs +2 -0
- package/dist/styles-DcG3aIFx.cjs.map +1 -0
- package/dist/styles-w0ZixggV.js +51 -0
- package/dist/styles-w0ZixggV.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/usePivot-C8q0pMgW.cjs +2 -0
- package/dist/usePivot-C8q0pMgW.cjs.map +1 -0
- package/dist/usePivot-z9gumDf-.js +97 -0
- package/dist/usePivot-z9gumDf-.js.map +1 -0
- package/package.json +6 -1
- package/dist/FloatingPanelFrame-BeP9z8EI.js +0 -98
- package/dist/FloatingPanelFrame-BeP9z8EI.js.map +0 -1
- package/dist/FloatingPanelFrame-Cu50Y9xg.cjs +0 -2
- package/dist/FloatingPanelFrame-Cu50Y9xg.cjs.map +0 -1
- package/dist/GridLayout-CwuQEP7k.cjs +0 -2
- package/dist/GridLayout-CwuQEP7k.cjs.map +0 -1
- package/dist/GridLayout-DZCV1X-3.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const G=require("./GridLayout-CwuQEP7k.cjs"),f=require("react/jsx-runtime"),Tt=require("react"),C=require("./FloatingPanelFrame-Cu50Y9xg.cjs");function St(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const r in t)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,n.get?n:{enumerable:!0,get:()=>t[r]})}}return e.default=t,Object.freeze(e)}const l=St(Tt),Gt=t=>{const e=t==="drag"?C.COLOR_RESIZE_HANDLE_ACTIVE:t==="hover"?C.COLOR_RESIZE_HANDLE_HOVER:C.COLOR_RESIZE_HANDLE_IDLE;return{width:C.HORIZONTAL_DIVIDER_WIDTH,cursor:"col-resize",position:"relative",userSelect:"none",backgroundColor:e}},Et=({onResize:t,component:e,element:r})=>{const{ref:n,isDragging:o,onPointerDown:s}=G.useResizeDrag({axis:"x",onResize:t}),[a,i]=l.useState(!1),c={ref:n,style:Gt(o?"drag":a?"hover":"idle"),role:"separator","aria-orientation":"vertical","data-dragging":o?"true":void 0,onPointerDown:s,onPointerEnter:()=>i(!0),onPointerLeave:()=>i(!1)};return r?l.cloneElement(r,c):e?f.jsx(e,{...c}):f.jsx("div",{...c})},Rt=()=>{const{layerId:t}=G.useLayerInstance(),{getLayerHandleProps:e}=G.useGridLayoutContext();return l.useMemo(()=>e(t),[e,t])},it=l.createContext(null),Pt=()=>{const t=l.useContext(it);if(!t)throw new Error("useKeybindings must be used within KeybindingsProvider");return t},Ct=t=>{const e=[];t.metaKey&&e.push("Mod"),t.ctrlKey&&e.push("Ctrl"),t.altKey&&e.push("Alt"),t.shiftKey&&e.push("Shift");const r=t.key.length===1?t.key.toUpperCase():t.key;return e.push(r),e.join("-")},Dt=({children:t,configure:e})=>{const r=l.useRef({}),n=l.useCallback((a,i)=>{r.current={...r.current,[a]:i}},[]),o=l.useCallback(a=>{const i={...r.current};delete i[a],r.current=i},[]);l.useEffect(()=>{const a=i=>{const c=Ct(i),u=r.current[c];u&&u(i)};return window.addEventListener("keydown",a),()=>{window.removeEventListener("keydown",a)}},[]);const s=l.useMemo(()=>({register:n,unregister:o}),[n,o]);return l.useEffect(()=>{e&&e(s)},[s,e]),f.jsx(it.Provider,{value:s,children:t})},jt=(t,e)=>{t.register("Mod-\\",r=>{r.preventDefault(),e.splitFocused("vertical")}),t.register("Mod-Shift-\\",r=>{r.preventDefault(),e.splitFocused("horizontal")});for(const r of[1,2,3,4,5,6,7,8,9])t.register(`Mod-${String(r)}`,n=>{n.preventDefault(),e.focusGroupIndex(r)});t.register("Alt-ArrowRight",r=>{r.preventDefault(),e.focusNextGroup()}),t.register("Alt-ArrowLeft",r=>{r.preventDefault(),e.focusPrevGroup()})},At=t=>t.type==="group",at=(t,e={x:0,y:0,w:100,h:100})=>{const r=new Map,n=(o,s)=>{if(At(o)){r.set(o.groupId,s);return}if(o.direction==="vertical"){const c=s.w*o.ratio,u=s.w-c;n(o.a,{x:s.x,y:s.y,w:c,h:s.h}),n(o.b,{x:s.x+c,y:s.y,w:u,h:s.h});return}const a=s.h*o.ratio,i=s.h-a;n(o.a,{x:s.x,y:s.y,w:s.w,h:a}),n(o.b,{x:s.x,y:s.y+a,w:s.w,h:i})};return n(t,e),r},_t=(t,e)=>{const r=at(t.tree),n={areas:[["root"]],rows:[{size:"1fr"}],columns:[{size:"1fr"}],gap:"0px",style:{position:"relative"}},o=Array.from(r.entries()).map(([s,a])=>{const i={position:"absolute",left:`${a.x}%`,top:`${a.y}%`,width:`${a.w}%`,height:`${a.h}%`,overflow:"hidden",display:"flex",flexDirection:"column"};return{id:s,positionMode:"absolute",style:i,component:e(s)}});return{config:n,layers:o}},kt=(t,e,r)=>{const n=at(t.tree),o=Array.from(new Set(Array.from(n.values()).flatMap(m=>[m.x,m.x+m.w]))).sort((m,x)=>m-x),s=Array.from(new Set(Array.from(n.values()).flatMap(m=>[m.y,m.y+m.h]))).sort((m,x)=>m-x),a=o.slice(1).map((m,x)=>`${m-o[x]}fr`),i=s.slice(1).map((m,x)=>`${m-s[x]}fr`),c=a.map(m=>({size:m,resizable:r})),u=i.map(m=>({size:m,resizable:r})),d=(m,x,b,w)=>{for(const[g,I]of n.entries())if(m>=I.x&&x<=I.x+I.w&&b>=I.y&&w<=I.y+I.h)return g;return"."},h=[];for(let m=0;m<s.length-1;m+=1){const x=[];for(let b=0;b<o.length-1;b+=1)x.push(d(o[b],o[b+1],s[m],s[m+1]));h.push(x)}const v={areas:h,rows:u,columns:c,gap:"0px"},y=Array.from(n.keys()).map(m=>({id:m,gridArea:m,component:e(m)}));return{config:v,layers:y}},ct=l.createContext(null),Ot=()=>{const t=l.useContext(ct);if(!t)throw new Error("usePanelRenderContext must be used within PanelRenderProvider");return t},Mt=({value:t,children:e})=>f.jsx(ct.Provider,{value:t,children:e}),ut=l.createContext(null),lt=()=>{const t=l.useContext(ut);if(!t)throw new Error("useDomRegistry must be used within DomRegistryProvider");return t},Nt=({children:t})=>{const e=l.useRef(new Map),r=l.useCallback(c=>{const u=e.current.get(c);if(u)return u;const d={group:null,tabbar:null,content:null};return e.current.set(c,d),d},[]),n=l.useCallback((c,u)=>{const d=r(c);if(d.group=u,u===null){const h=e.current.get(c);(h?h.tabbar===null&&h.content===null:!1)&&e.current.delete(c)}},[r]),o=l.useCallback((c,u)=>{const d=r(c);if(d.tabbar=u,u===null){const h=e.current.get(c);(h?h.group===null&&h.content===null:!1)&&e.current.delete(c)}},[r]),s=l.useCallback((c,u)=>{const d=r(c);if(d.content=u,u===null){const h=e.current.get(c);(h?h.group===null&&h.tabbar===null:!1)&&e.current.delete(c)}},[r]),a=l.useCallback(()=>e.current,[]),i=l.useMemo(()=>({setGroupEl:n,setTabbarEl:o,setContentEl:s,getAll:a}),[n,o,s,a]);return f.jsx(ut.Provider,{value:i,children:t})},Lt={display:"flex",flexDirection:"column",width:"100%",height:"100%"},Bt={flex:"1 1 auto",minWidth:0,minHeight:0,position:"relative",overflow:"hidden"};function Ht(t,e,r,n){return t?l.cloneElement(t,r,n):e?f.jsx(e,{...r,children:n}):f.jsx("div",{...r,children:n})}function $t(t,e,r,n){return t?l.cloneElement(t,r,n):e?f.jsx(e,{...r,children:n}):f.jsx("div",{...r,children:n})}const zt=({group:t,tabbar:e,content:r,onContentPointerDown:n,groupRef:o,contentRef:s,component:a,element:i,contentComponent:c,contentElement:u})=>{const d={ref:o,style:Lt,"data-group-id":t.id},v=Ht(u,c,{ref:s,style:Bt,"data-dnd-zone":"content",onPointerDown:n},r),y=f.jsxs(f.Fragment,{children:[e,v]});return $t(i,a,d,y)},dt=l.memo(zt,(t,e)=>t.group.id!==e.group.id||t.group.activeTabId!==e.group.activeTabId||t.group.tabs.length!==e.group.tabs.length?!1:t.group.tabs===e.group.tabs);dt.displayName="PanelGroupView";const V=(t,e,r)=>{const n=t.left,o=t.top,s=t.width,a=t.height,i=e-n,c=r-o,u=s/3,d=a/3;return i>u&&i<s-u&&c>d&&c<a-d?"center":i<c&&i<s-i&&c<a-c?"left":s-i<c&&s-i<i&&c<a-c?"right":c<i&&c<a-c&&i<s-i?"top":"bottom"};function _(t,e){if(!e){const n=(()=>({type:t}));return Object.defineProperty(n,"type",{value:t,writable:!1,enumerable:!0}),n}const r=((...n)=>{const o=e(...n);return typeof o>"u"?{type:t}:{type:t,payload:o}});return Object.defineProperty(r,"type",{value:t,writable:!1,enumerable:!0}),r}const Xt=(t,e)=>{const r={};return Object.keys(t).forEach(n=>{const o=t[n];r[n]=((...s)=>{const a=o(...s);return e(a),a})}),r},pt=(t,e)=>{const r={};return Object.keys(e).forEach(n=>{const o=e[n];if(!o)return;const s=t[n];if(!s)throw new Error(`Missing action creator for key "${String(n)}"`);r[s.type]=o}),r},ft={phase:{kind:"idle"},suggest:null,pointer:null,tabbarHover:null,draggingTabElement:null},A={startContent:_("START_CONTENT",t=>t),startTab:_("START_TAB",t=>t),setSuggest:_("SET_SUGGEST",t=>t),setPointer:_("SET_POINTER",t=>t),setTabbarHover:_("SET_TABBAR_HOVER",t=>t),reset:_("RESET")},Ft=pt(A,{startContent:(t,e)=>({phase:{kind:"content",startX:e.payload.x,startY:e.payload.y,fromGroupId:e.payload.groupId,tabId:e.payload.tabId,cache:e.payload.cache},suggest:null,pointer:null,tabbarHover:null,draggingTabElement:null}),startTab:(t,e)=>({phase:{kind:"tab",startX:e.payload.x,startY:e.payload.y,fromGroupId:e.payload.groupId,tabId:e.payload.tabId,cache:e.payload.cache},suggest:null,pointer:null,tabbarHover:null,draggingTabElement:e.payload.element}),setSuggest:(t,e)=>({...t,suggest:e.payload}),setPointer:(t,e)=>({...t,pointer:e.payload}),setTabbarHover:(t,e)=>({...t,tabbarHover:e.payload}),reset:()=>ft}),Yt=(t,e)=>{const r=Ft[e.type];return r?r(t,e,void 0):t},bt=l.createContext(null),U=()=>{const t=l.useContext(bt);if(!t)throw new Error("usePanelInteractions must be used within InteractionsProvider");return t},Vt=({containerRef:t,dragThresholdPx:e,onCommitContentDrop:r,onCommitTabDrop:n,isContentZoneAllowed:o,children:s})=>{const[a,i]=l.useReducer(Yt,ft),c=lt(),u=l.useCallback(()=>{const b=Array.from(c.getAll().entries()),w=b.map(([p,T])=>({gid:p,el:T.content??T.group})).filter(p=>!!p.el).map(p=>({...p,rect:p.el.getBoundingClientRect()})),g=b.map(([p,T])=>({gid:p,el:T.tabbar})).filter(p=>!!p.el).map(p=>({...p,rect:p.el.getBoundingClientRect()})),I=b.map(([p,T])=>({gid:p,el:T.content??T.group})).filter(p=>!!p.el).map(p=>({...p,rect:p.el.getBoundingClientRect()}));return{groups:w,tabbars:g,contents:I}},[c]),d=G.useEffectEvent(b=>{if(!t.current)return;const g=b.clientX,I=b.clientY,p=a.phase;if(p.kind==="idle")return;const T=Math.abs(g-p.startX),R=Math.abs(I-p.startY);if(T<e&&R<e){a.phase.kind==="content"&&i(A.setSuggest(null)),i(A.setPointer(null)),i(A.setTabbarHover(null));return}if(i(A.setPointer({x:g,y:I})),p.kind==="content"){const E=p.cache.groups.find(({rect:S})=>g>=S.left&&g<=S.right&&I>=S.top&&I<=S.bottom);if(!E){i(A.setSuggest(null));return}const D=V(E.rect,g,I);if(o&&!o({targetGroupId:E.gid,zone:D})){i(A.setSuggest(null));return}i(A.setSuggest({rect:E.rect,zone:D}));return}if(p.kind==="tab"){const E=p.cache.tabbars.find(({rect:P})=>g>=P.left&&g<=P.right&&I>=P.top&&I<=P.bottom);if(E){const k=Array.from(E.el.querySelectorAll("[role='tab']")).map(H=>H.getBoundingClientRect()),j=k.map(H=>H.left+H.width/2),M=j.findIndex(H=>g<H),N=M===-1?j.length:M,yt=k.length===0?E.rect.left+8:N===0?k[0].left:N===k.length?k[k.length-1].right:(k[N-1].right+k[N].left)/2;i(A.setTabbarHover({groupId:E.gid,index:N,rect:E.rect,insertX:yt}))}else i(A.setTabbarHover(null));const D=p.cache.contents.find(({rect:P})=>g>=P.left&&g<=P.right&&I>=P.top&&I<=P.bottom);if(!D){i(A.setSuggest(null));return}const S=V(D.rect,g,I);if(o&&!o({targetGroupId:D.gid,zone:S})){i(A.setSuggest(null));return}i(A.setSuggest({rect:D.rect,zone:S}))}}),h=G.useEffectEvent(b=>{const w=t.current,g=a;if(i(A.reset()),!w)return;const I=b.clientX,p=b.clientY;if(g.phase.kind==="idle")return;const T=Math.abs(I-g.phase.startX),R=Math.abs(p-g.phase.startY);if(!(T<e&&R<e)){if(g.phase.kind==="content"){const E=g.phase.cache.groups.find(({rect:P})=>I>=P.left&&I<=P.right&&p>=P.top&&p<=P.bottom);if(!E)return;const D=E.gid??null;if(!D)return;const S=V(E.rect,I,p);if(o&&!o({targetGroupId:D,zone:S}))return;r({fromGroupId:g.phase.fromGroupId,tabId:g.phase.tabId,targetGroupId:D,zone:S});return}if(g.phase.kind==="tab"){const E=g.phase.cache.tabbars.find(({rect:S})=>I>=S.left&&I<=S.right&&p>=S.top&&p<=S.bottom);if(E){const S=E.gid;if(!S)return;const k=Array.from(E.el.querySelectorAll("[role='tab']")).map(N=>{const Z=N.getBoundingClientRect();return Z.left+Z.width/2}),j=k.findIndex(N=>I<N),M=j===-1?k.length:j;n({fromGroupId:g.phase.fromGroupId,tabId:g.phase.tabId,targetGroupId:S,targetIndex:M});return}const D=g.phase.cache.contents.find(({rect:S})=>I>=S.left&&I<=S.right&&p>=S.top&&p<=S.bottom);if(D){const S=D.gid??null;if(!S)return;const P=V(D.rect,I,p);if(o&&!o({targetGroupId:S,zone:P}))return;r({fromGroupId:g.phase.fromGroupId,tabId:g.phase.tabId,targetGroupId:S,zone:P})}}}}),v=G.useEffectEvent(()=>{i(A.reset())});l.useEffect(()=>{if(a.phase.kind!=="idle")return window.addEventListener("pointermove",d),window.addEventListener("pointerup",h,{once:!0}),window.addEventListener("pointercancel",v,{once:!0}),()=>{window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",h),window.removeEventListener("pointercancel",v)}},[a.phase.kind]);const y=l.useCallback((b,w,g)=>{if(g.button!==0)return;g.currentTarget.setPointerCapture(g.pointerId);const I=u();i(A.startContent({x:g.clientX,y:g.clientY,groupId:b,tabId:w,cache:I}))},[u]),m=l.useCallback((b,w,g)=>{if(g.button!==0)return;const I=g.currentTarget;I&&I.setPointerCapture(g.pointerId);const p=u();i(A.startTab({x:g.clientX,y:g.clientY,groupId:w,tabId:b,cache:p,element:I}))},[u]),x=l.useMemo(()=>({suggest:a.suggest,isTabDragging:a.phase.kind==="tab",draggingTabId:a.phase.kind==="tab"?a.phase.tabId:null,dragPointer:a.pointer,tabbarHover:a.tabbarHover,draggingTabElement:a.draggingTabElement,onStartContentDrag:y,onStartTabDrag:m}),[a.suggest,a.pointer,a.tabbarHover,a.phase,a.draggingTabElement,y,m]);return f.jsx(bt.Provider,{value:x,children:s})},et={display:"inline-flex",alignItems:"center",userSelect:"none"},qt=({groupId:t,tab:e,active:r,dragging:n,onClickTab:o,onStartDrag:s,onCloseTab:a,tabComponent:i,tabElement:c,onDoubleClick:u})=>{const d=l.useEffectEvent(()=>{o(e.id)}),h=l.useEffectEvent(x=>{s&&x.button===0&&s(e.id,t,x)}),v=()=>{const x=!!a;return f.jsx(l.Activity,{mode:x?"visible":"hidden",children:f.jsx("button",{type:"button","aria-label":`Close tab ${e.title}`,onClick:b=>{a&&(b.stopPropagation(),a(t,e.id))},style:{marginLeft:6},tabIndex:x?void 0:-1,disabled:!x,"aria-hidden":x?void 0:!0,children:"×"})})},y={role:"tab","aria-selected":r,tabIndex:r?0:-1,style:et,onClick:d,onPointerDown:h,onDoubleClick:u,"data-tab-id":e.id,"data-active":r?"true":"false","data-dragging":n?"true":"false",children:f.jsxs(f.Fragment,{children:[f.jsx("span",{children:e.title}),v()]})},m={type:"button",role:"tab","aria-selected":r,tabIndex:r?0:-1,style:et,onClick:()=>{o(e.id)},onPointerDown:x=>{s&&x.button===0&&s(e.id,t,x)},onDoubleClick:u,children:f.jsx("span",{children:e.title})};return c?c(m):i?f.jsx(i,{...m}):f.jsx("div",{...y})},Kt={display:"flex",alignItems:"center"},Ut={flex:"1 1 auto",alignSelf:"stretch"},Wt=({group:t,onClickTab:e,onStartDrag:r,rootRef:n,component:o,element:s,tabComponent:a,tabElement:i,onAddTab:c,onCloseTab:u,doubleClickToAdd:d})=>{const{isTabDragging:h,draggingTabId:v}=U(),y=l.useRef(null),m=l.useCallback(p=>{if(y.current=p,!!n){if(typeof n=="function"){n(p);return}try{n.current=p}catch{}}},[n]),x=l.useEffectEvent(p=>{const T=y.current??p.currentTarget;if(!T)return;const R=Array.from(T.querySelectorAll('[role="tab"]'));if(R.length===0)return;const E=j=>{const M=Math.max(0,Math.min(j,R.length-1)),N=R[M];N&&N.focus()},D=document.activeElement,S=D?R.indexOf(D):R.findIndex(j=>j.getAttribute("data-tab-id")===t.activeTabId);if(p.key==="ArrowRight"){p.preventDefault();const j=S>=0?S+1:0;E(j>=R.length?0:j);return}if(p.key==="ArrowLeft"){p.preventDefault();const j=S>=0?S-1:R.length-1;E(j<0?R.length-1:j);return}if(p.key==="Home"){p.preventDefault(),E(0);return}if(p.key==="End"){p.preventDefault(),E(R.length-1);return}if(p.key==="Enter"||p.key===" "){p.preventDefault();const M=(S>=0?R[S]:null)?.getAttribute("data-tab-id")??null;M&&e(M);return}if(p.key==="Delete"||p.key==="Backspace"){if(u){p.preventDefault();const M=(S>=0?R[S]:null)?.getAttribute("data-tab-id")??null;M&&u(t.id,M)}return}const P=(p.ctrlKey?1:0)+(p.metaKey?1:0)>0,k=typeof p.key=="string"?p.key.toLowerCase():"";if(P&&k==="t"){c&&(p.preventDefault(),c(t.id));return}});l.useEffect(()=>{const p=y.current;if(!p)return;const T=p.querySelector(`[role="tab"][data-tab-id="${t.activeTabId}"]`);if(T===document.activeElement)return;!p.contains(document.activeElement)&&T&&T.focus()},[t.activeTabId]);const b={style:Kt,role:"tablist","data-tabbar":"true","data-group-id":t.id,"data-dragging":h?"true":"false",onKeyDown:x},w=G.useElementComponentWrapper({element:s,component:o}),g=()=>c?f.jsx("button",{type:"button","aria-label":"Add tab",onClick:()=>{c(t.id)},children:"+"}):null,I=l.useCallback(()=>{d&&c&&c(t.id)},[d,c,t.id]);return f.jsxs(w,{...b,ref:m,onDoubleClick:I,children:[t.tabs.map((p,T)=>f.jsx(qt,{groupId:t.id,tab:p,active:t.activeTabId===p.id,dragging:v===p.id,onClickTab:e,onStartDrag:r,onCloseTab:u,tabComponent:a,tabElement:i,onDoubleClick:R=>R.stopPropagation()},`${t.id}:${p.id}:${T}`)),f.jsx("span",{style:Ut}),g()]})},Zt=({id:t,TabBarComponent:e,PanelGroupComponent:r})=>{const{getGroup:n,getGroupContent:o,onClickTab:s,onAddTab:a,onCloseTab:i,onStartContentDrag:c,onStartTabDrag:u,doubleClickToAdd:d}=Ot(),{setGroupEl:h,setTabbarEl:v,setContentEl:y}=lt(),m=l.useCallback(T=>{h(t,T)},[t,h]),x=l.useCallback(T=>{y(t,T)},[t,y]),b=l.useCallback(T=>{v(t,T)},[t,v]),w=n(t);if(!w)return null;const g=o(t),I=e??Wt,p=r??(T=>f.jsx(dt,{...T}));return f.jsx(p,{group:w,tabbar:f.jsx(I,{rootRef:b,group:w,onClickTab:T=>s(t,T),onAddTab:a,onCloseTab:i,onStartDrag:(T,R,E)=>u(T,R,E),doubleClickToAdd:d}),content:g,groupRef:m,contentRef:x,onContentPointerDown:T=>c(t,T)})},Jt=(t,e)=>{const r=new Array(16);for(let n=0;n<4;n++)for(let o=0;o<4;o++)r[n*4+o]=t[0+o]*e[n*4+0]+t[4+o]*e[n*4+1]+t[8+o]*e[n*4+2]+t[12+o]*e[n*4+3];return r},q=t=>{if(t.length!==16)throw new Error("Matrix must have exactly 16 values");const e=Object.freeze([...t]),r=n=>{const o=Jt(e,n);return q(o)};return Object.freeze({translate:(n=0,o=0,s=0)=>r([1,0,0,0,0,1,0,0,0,0,1,0,n,o,s,1]),translate3d:(n,o,s)=>r([1,0,0,0,0,1,0,0,0,0,1,0,n,o,s,1]),translateX:n=>r([1,0,0,0,0,1,0,0,0,0,1,0,n,0,0,1]),translateY:n=>r([1,0,0,0,0,1,0,0,0,0,1,0,0,n,0,1]),translateZ:n=>r([1,0,0,0,0,1,0,0,0,0,1,0,0,0,n,1]),scale:(n=1,o=1,s=1)=>r([n,0,0,0,0,o,0,0,0,0,s,0,0,0,0,1]),scale3d:(n,o,s)=>r([n,0,0,0,0,o,0,0,0,0,s,0,0,0,0,1]),scaleX:n=>r([n,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),scaleY:n=>r([1,0,0,0,0,n,0,0,0,0,1,0,0,0,0,1]),scaleZ:n=>r([1,0,0,0,0,1,0,0,0,0,n,0,0,0,0,1]),rotateX:n=>{const o=Math.cos(n),s=Math.sin(n);return r([1,0,0,0,0,o,s,0,0,-s,o,0,0,0,0,1])},rotateY:n=>{const o=Math.cos(n),s=Math.sin(n);return r([o,0,-s,0,0,1,0,0,s,0,o,0,0,0,0,1])},rotateZ:n=>{const o=Math.cos(n),s=Math.sin(n);return r([o,s,0,0,-s,o,0,0,0,0,1,0,0,0,0,1])},rotate:(n,o,s,a)=>{const i=Math.sqrt(o*o+s*s+a*a);if(i===0)return q(e);o/=i,s/=i,a/=i;const c=Math.cos(n),u=Math.sin(n),d=1-c;return r([d*o*o+c,d*o*s+u*a,d*o*a-u*s,0,d*o*s-u*a,d*s*s+c,d*s*a+u*o,0,d*o*a+u*s,d*s*a-u*o,d*a*a+c,0,0,0,0,1])},rotate3d:(n,o,s,a)=>{const i=Math.sqrt(n*n+o*o+s*s);if(i===0)return q(e);n/=i,o/=i,s/=i;const c=Math.cos(a),u=Math.sin(a),d=1-c;return r([d*n*n+c,d*n*o+u*s,d*n*s-u*o,0,d*n*o-u*s,d*o*o+c,d*o*s+u*n,0,d*n*s+u*o,d*o*s-u*n,d*s*s+c,0,0,0,0,1])},skew:(n=0,o=0)=>{const s=Math.tan(n),a=Math.tan(o);return r([1,a,0,0,s,1,0,0,0,0,1,0,0,0,0,1])},skewX:n=>{const o=Math.tan(n);return r([1,0,0,0,o,1,0,0,0,0,1,0,0,0,0,1])},skewY:n=>{const o=Math.tan(n);return r([1,o,0,0,0,1,0,0,0,0,1,0,0,0,0,1])},perspective:n=>{if(n===0)throw new Error("Perspective distance cannot be zero");return r([1,0,0,0,0,1,0,0,0,0,1,-1/n,0,0,0,1])},toCSS:()=>`matrix3d(${e.join(", ")})`,toArray:()=>e,toString:()=>[`[${e[0]}, ${e[4]}, ${e[8]}, ${e[12]}]`,`[${e[1]}, ${e[5]}, ${e[9]}, ${e[13]}]`,`[${e[2]}, ${e[6]}, ${e[10]}, ${e[14]}]`,`[${e[3]}, ${e[7]}, ${e[11]}, ${e[15]}]`].join(`
|
|
2
|
-
`)})},Qt=()=>q([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),te={position:"fixed",inset:0,pointerEvents:"none",zIndex:C.DROP_SUGGEST_Z_INDEX},ee={position:"absolute",border:`${C.DROP_SUGGEST_BORDER_WIDTH} dashed ${C.DROP_SUGGEST_BORDER_COLOR}`,background:C.DROP_SUGGEST_BG_COLOR,borderRadius:C.DROP_SUGGEST_BORDER_RADIUS,transformOrigin:"top left"},L=(t,e)=>e<=0?0:G.clampNumber(t/e,0),re=(t,e,r)=>{const{width:n,height:o}=t,s=r/2,a=n>0?n:1,i=o>0?o:1,c={translateX:r,translateY:r,scaleX:L(G.clampNumber(n-r*2,0),a),scaleY:L(G.clampNumber(o-r*2,0),i)},u={translateX:r,translateY:r,scaleX:L(G.clampNumber(n/2-r*1.5,0),a),scaleY:L(G.clampNumber(o-r*2,0),i)},d={translateX:n/2+s,translateY:r,scaleX:L(G.clampNumber(n/2-r*1.5,0),a),scaleY:L(G.clampNumber(o-r*2,0),i)},h={translateX:r,translateY:r,scaleX:L(G.clampNumber(n-r*2,0),a),scaleY:L(G.clampNumber(o/2-r*1.5,0),i)},v={translateX:r,translateY:o/2+s,scaleX:L(G.clampNumber(n-r*2,0),a),scaleY:L(G.clampNumber(o/2-r*1.5,0),i)},y={center:c,left:u,right:d,top:h,bottom:v},{translateX:m,translateY:x,scaleX:b,scaleY:w}=y[e];return Qt().translate(m,x,0).scale(b,w,1).toCSS()},ne=(t,e)=>{const r=C.DROP_SUGGEST_PADDING_PX;return{...ee,left:t.left,top:t.top,width:t.width,height:t.height,transform:re(t,e,r)}},oe=({suggest:t})=>{if(!t)return null;const{rect:e,zone:r}=t,n=ne(e,r);return f.jsx("div",{style:te,children:f.jsx("div",{style:n})})},se=typeof window<"u"&&typeof document<"u",ie=t=>{const[e,r]=l.useState(null),[n,o]=l.useState(null);return G.useIsomorphicLayoutEffect(()=>{if(!se||!t){r(null),o(null);return}const s=t.getBoundingClientRect();r({width:s.width,height:s.height}),o(t.outerHTML)},[t]),{html:n,size:e}},ae={position:"fixed",inset:0,pointerEvents:"none",zIndex:C.TAB_DRAG_OVERLAY_Z_INDEX},ce={position:"absolute",width:C.TAB_DRAG_INSERT_GUIDE_WIDTH,borderRadius:C.TAB_DRAG_INSERT_GUIDE_BORDER_RADIUS,background:C.TAB_DRAG_INSERT_GUIDE_COLOR,boxShadow:C.TAB_DRAG_INSERT_GUIDE_SHADOW},ue=()=>{const{isTabDragging:t,draggingTabId:e,dragPointer:r,tabbarHover:n,draggingTabElement:o}=U(),{html:s,size:a}=ie(o),i=r!==null&&e!==null,c=l.useMemo(()=>{if(!(!i||!r))return{position:"absolute",left:r.x,top:r.y,transform:`translate(${C.TAB_DRAG_PREVIEW_OFFSET_X}, ${C.TAB_DRAG_PREVIEW_OFFSET_Y})`,pointerEvents:"none"}},[i,r]),u=l.useMemo(()=>{if(!(!c||!o))return a?{...c,width:a.width,height:a.height}:c},[c,o,a]),d=l.useMemo(()=>{if(n)return{...ce,left:n.insertX,top:n.rect.top+4,height:Math.max(0,n.rect.height-8)}},[n]);return t?f.jsxs("div",{style:ae,children:[f.jsx(l.Activity,{mode:u?"visible":"hidden",children:f.jsx("div",{style:u,children:f.jsx("div",{style:{width:"100%",height:"100%",pointerEvents:"none"},dangerouslySetInnerHTML:{__html:s??""}})})}),f.jsx(l.Activity,{mode:d?"visible":"hidden",children:f.jsx("div",{style:d})})]}):null},O=t=>t.type==="group",X=(t,e=[])=>{if(O(t))return[...e,t.groupId];const r=X(t.a,e);return X(t.b,r)},W=(t,e)=>e.reduce((r,n)=>O(r)?r:r[n],t),F=(t,e,r)=>{if(e.length===0)return r;const[n,...o]=e;return O(t)?t:n==="a"?{...t,a:F(t.a,o,r)}:{...t,b:F(t.b,o,r)}},K=(t,e,r=[])=>{if(O(t))return t.groupId===e?{splitPath:null,side:null}:null;if(O(t.a)&&t.a.groupId===e)return{splitPath:r,side:"a"};if(O(t.b)&&t.b.groupId===e)return{splitPath:r,side:"b"};const n=K(t.a,e,[...r,"a"]);return n||K(t.b,e,[...r,"b"])},gt=(t,e,r,n)=>{const o=n(),s=K(t,e),a={type:"split",direction:r,ratio:.5,a:{type:"group",groupId:e},b:{type:"group",groupId:o}};if(!s||s.splitPath===null)return{tree:a,newGroupId:o};const i=s.splitPath,c=W(t,i);if(O(c))return{tree:a,newGroupId:o};const u=s.side==="a"?{...c,a}:{...c,b:a};return{tree:F(t,i,u),newGroupId:o}},le=(t,e)=>{const r=K(t,e);if(!r||r.splitPath===null)return{tree:t,survivorGroupId:e};const n=r.splitPath,o=W(t,n);if(O(o))return{tree:t,survivorGroupId:e};const s=r.side==="a"?o.b:o.a,a=F(t,n,s),i=O(s)?s.groupId:X(s)[0]??null;return{tree:a,survivorGroupId:i}},de=(t,e,r)=>{const n=W(t,e);if(O(n))return t;const o={...n,ratio:G.clampNumber(r,.05,.95)};return F(t,e,o)},J=t=>{if(Object.keys(t.groups).filter(o=>t.groups[o].tabIds.length===0).length===0)return t;const n=(o,s)=>{const a=o.groups[s];if(!a||a.tabs.length>0||Object.keys(o.groups).length<=1)return o;const{tree:c,survivorGroupId:u}=le(o.tree,s),{[s]:d,...h}=o.groups,v=X(c),y=o.focusedGroupId===s?u??v[0]??null:o.focusedGroupId;return{...o,tree:c,groups:h,groupOrder:v,focusedGroupId:y}};return t.groupOrder.reduce((o,s)=>n(o,s),t)},pe=t=>({id:t,tabIds:[],tabs:[],activeTabId:null}),rt=(t,e,r,n)=>{const o={...t.groups},s=o[e];if(!s)throw new Error(`Group ${e} does not exist.`);const a={...t.panels,[r.id]:r},i=[...s.tabIds,r.id],c=n?r.id:s.activeTabId??r.id,u=i.map(h=>a[h]),d={...s,tabIds:i,tabs:u,activeTabId:c};return o[e]=d,{...t,panels:a,groups:o}},fe=(t,e,r)=>{const n={...t.groups},o=n[e];if(!o)throw new Error(`Group ${e} does not exist.`);const s=o.tabIds.filter(c=>c!==r),a=s.map(c=>t.panels[c]),i=o.activeTabId===r?s[0]??null:o.activeTabId;return n[e]={...o,tabIds:s,tabs:a,activeTabId:i},{...t,groups:n}},nt=(t,e,r,n,o)=>{const s=t.groups[e],a=t.groups[r];if(!s||!a)throw new Error("moveTab: source or target group is missing.");const i={...t.groups},c=s.tabIds.filter(h=>h!==n),u=[...a.tabIds.filter(h=>h!==n),n],d=s.activeTabId===n?c[0]??null:s.activeTabId;return i[e]={...s,tabIds:c,tabs:c.map(h=>t.panels[h]),activeTabId:d},i[r]={...a,tabIds:u,tabs:u.map(h=>t.panels[h]),activeTabId:n},{...t,groups:i}},ht=(t,e,r)=>{const n=t.groups[e];if(!n)throw new Error(`setActiveTab: group ${e} not found.`);if(!n.tabIds.some(s=>s===r))throw new Error(`setActiveTab: tab ${r} not found in group ${e}.`);const o={...t.groups,[e]:{...n,activeTabId:r}};return{...t,groups:o,focusedGroupId:e}},ot=(t,e,r,n,o)=>{const s=t.groups[e];if(!s)throw new Error(`addTabToGroupAtIndex: group ${e} not found.`);const a={...t.panels,[r.id]:r},i=s.tabIds.slice(),c=Math.max(0,Math.min(n,i.length));i.splice(c,0,r.id);const u=i.map(v=>a[v]),d=o?r.id:s.activeTabId??r.id,h={...t.groups,[e]:{...s,tabIds:i,tabs:u,activeTabId:d}};return{...t,panels:a,groups:h}},B=(t,e)=>{if(!t.groups[e])throw new Error(`setFocusedGroup: group ${e} not found.`);return{...t,focusedGroupId:e}},be=(t,e)=>{const r=e-1,n=t.groupOrder[r];return n?B(t,n):t},ge=t=>{const e=t.groupOrder,r=t.focusedGroupId;if(!r){const s=e[0];return s?B(t,s):t}const n=e.indexOf(r),o=e[(n+1)%e.length];return B(t,o)},he=t=>{const e=t.groupOrder,r=t.focusedGroupId;if(!r){const s=e[e.length-1];return s?B(t,s):t}const n=e.indexOf(r),o=e[(n-1+e.length)%e.length];return B(t,o)},mt=(t,e,r,n)=>{const{tree:o,newGroupId:s}=gt(t.tree,e,r,n),a={...t.groups,[s]:pe(s)},i=X(o);return{...t,tree:o,groups:a,groupOrder:i,focusedGroupId:s}},me=t=>{const r={type:"group",groupId:"g_1"},n=Object.fromEntries(t.map(i=>[i.id,i])),s={g_1:{id:"g_1",tabIds:t.map(i=>i.id),tabs:t,activeTabId:t[0]?.id??null}};return{tree:r,panels:n,groups:s,groupOrder:["g_1"],focusedGroupId:"g_1"}},ve=l.createContext(null),Ie=({value:t,children:e})=>f.jsx(ve.Provider,{value:t,children:e}),vt=l.createContext(null),xe=()=>{const t=l.useContext(vt);if(!t)throw new Error("useTree must be used within TreeProvider");return t},we=({value:t,children:e})=>f.jsx(vt.Provider,{value:t,children:e}),ye=l.createContext(null),Te=({value:t,children:e})=>f.jsx(ye.Provider,{value:t,children:e}),$=t=>{const e=G.toFiniteNumberOr(t,Number.POSITIVE_INFINITY);return G.clampNumber(e,1)},Se=t=>typeof t=="object"&&t!==null,Ge=t=>Se(t)?"rows"in t?!0:"cols"in t:!1,It=t=>{if(!t)return{rows:Number.POSITIVE_INFINITY,cols:Number.POSITIVE_INFINITY};if(typeof t=="number"){const r=$(t);return{rows:r,cols:r}}if(Ge(t))return{rows:$(t.rows),cols:$(t.cols)};const e=t;return{rows:$(e.maxHorizontal),cols:$(e.maxVertical)}},Q=t=>{if(O(t))return{horizontal:1,vertical:1};const e=Q(t.a),r=Q(t.b);return t.direction==="horizontal"?{horizontal:e.horizontal+r.horizontal,vertical:Math.max(e.vertical,r.vertical)}:{horizontal:Math.max(e.horizontal,r.horizontal),vertical:e.vertical+r.vertical}},Ee=(t,e,r)=>{const{tree:n}=gt(t,e,r,()=>"__preview__");return n},tt=(t,e,r,n)=>{if(!Number.isFinite(n.rows)&&!Number.isFinite(n.cols))return!0;const o=Ee(t,e,r),s=Q(o);return!(s.horizontal>n.rows||s.vertical>n.cols)},xt={splitFocused:_("panelState/splitFocused",t=>({direction:t})),focusGroupIndex:_("panelState/focusGroupIndex",t=>({index1Based:t})),focusNextGroup:_("panelState/focusNextGroup"),focusPrevGroup:_("panelState/focusPrevGroup"),setActiveTab:_("panelState/setActiveTab",(t,e)=>({groupId:t,tabId:e})),addTab:_("panelState/addTab",t=>t),addNewTab:_("panelState/addNewTab",t=>t),removeTab:_("panelState/removeTab",(t,e)=>({groupId:t,tabId:e})),contentDrop:_("panelState/contentDrop",t=>t),tabDrop:_("panelState/tabDrop",t=>t),adjustSplitRatio:_("panelState/adjustSplitRatio",t=>t)},Re=(t,e,r)=>{const n=t.groups[e.fromGroupId],o=t.groups[e.targetGroupId];if(!n||!o||!n.tabs.find(h=>h.id===e.tabId))return t;if(e.zone==="center"&&e.fromGroupId===e.targetGroupId)return ht(t,e.fromGroupId,e.tabId);if(e.zone==="center"){const h=nt(t,e.fromGroupId,e.targetGroupId,e.tabId);return B(h,e.targetGroupId)}const a=e.zone==="left"||e.zone==="right"?"vertical":"horizontal";if(!tt(t.tree,e.targetGroupId,a,r.splitLimits))return t;const i=r.createGroupId(),c=mt(t,e.targetGroupId,a,()=>i),u=e.zone==="left"||e.zone==="top"?e.targetGroupId:i,d=nt(c,e.fromGroupId,u,e.tabId);return B(d,u)},Pe=(t,e)=>{const r=t.groups[e.fromGroupId],n=t.groups[e.targetGroupId];if(!r||!n||!t.panels[e.tabId])return t;if(e.fromGroupId===e.targetGroupId){const v=r.tabIds.filter(w=>w!==e.tabId),y=Math.max(0,Math.min(e.targetIndex,v.length)),m=v.slice(0,y).concat([e.tabId],v.slice(y)),x=m.map(w=>t.panels[w]).filter(Boolean),b={...t.groups,[e.fromGroupId]:{...r,tabIds:m,tabs:x}};return{...t,groups:b}}const s={...t.groups},a=r.tabIds.filter(v=>v!==e.tabId),i=a.map(v=>t.panels[v]);s[e.fromGroupId]={...r,tabIds:a,tabs:i,activeTabId:r.activeTabId===e.tabId?i[0]?.id??null:r.activeTabId};const c=n.tabIds.filter(v=>v!==e.tabId),u=Math.max(0,Math.min(e.targetIndex,c.length)),d=c.slice(0,u).concat([e.tabId],c.slice(u)),h=d.map(v=>t.panels[v]).filter(Boolean);return s[e.targetGroupId]={...n,tabIds:d,tabs:h,activeTabId:e.tabId},{...t,groups:s,focusedGroupId:e.targetGroupId}},Ce=pt(xt,{splitFocused:(t,e,r)=>{const n=t.focusedGroupId??t.groupOrder[0]??null;return!n||!tt(t.tree,n,e.payload.direction,r.splitLimits)?t:mt(t,n,e.payload.direction,r.createGroupId)},focusGroupIndex:(t,e)=>be(t,e.payload.index1Based),focusNextGroup:t=>ge(t),focusPrevGroup:t=>he(t),setActiveTab:(t,e)=>ht(t,e.payload.groupId,e.payload.tabId),addTab:(t,e)=>{const{groupId:r,tab:n,index:o,makeActive:s}=e.payload;return typeof o=="number"?ot(t,r,n,o,s??!0):rt(t,r,n,s??!0)},addNewTab:(t,e,r)=>{if(!r.createPanelId)throw new Error("addNewTab requires PanelSystemProvider.createPanelId");const o={id:r.createPanelId(),title:e.payload.title,render:()=>e.payload.title},{groupId:s,index:a,makeActive:i}=e.payload;return typeof a=="number"?ot(t,s,o,a,i??!0):rt(t,s,o,i??!0)},removeTab:(t,e)=>fe(t,e.payload.groupId,e.payload.tabId),contentDrop:(t,e,r)=>Re(t,e.payload,r),tabDrop:(t,e)=>Pe(t,e.payload),adjustSplitRatio:(t,e)=>{const r=W(t.tree,e.payload.path);if(O(r))return t;const n=de(t.tree,e.payload.path,r.ratio+e.payload.deltaRatio);return{...t,tree:n}}}),st=(t,e,r)=>{const n=Ce[e.type];if(!n)return t;const o=n(t,e,r);return J(o)},wt=l.createContext(null),Y=()=>{const t=l.useContext(wt);if(!t)throw new Error("usePanelSystem must be used within PanelSystemProvider");return t},De=({initialState:t,createGroupId:e,createPanelId:r,state:n,onStateChange:o,splitLimits:s,children:a})=>{const i=l.useMemo(()=>J(t),[t]),c=l.useMemo(()=>It(s),[s]),u=l.useRef({createGroupId:e,splitLimits:c,createPanelId:r});u.current.createGroupId=e,u.current.splitLimits=c,u.current.createPanelId=r;const[d,h]=l.useReducer((T,R)=>st(T,R,u.current),i),v=l.useMemo(()=>n?J(n):d,[n,d]),y=l.useRef(v);y.current=v;const m=n!==void 0,x=l.useCallback(T=>{if(m){const R=st(y.current,T,u.current);o?.(R);return}h(T)},[m,o,h]),b=l.useMemo(()=>Xt(xt,x),[x]),w=l.useMemo(()=>({setActiveTab:b.setActiveTab,tabDrop:b.tabDrop}),[b]),g=l.useMemo(()=>({adjustSplitRatio:b.adjustSplitRatio}),[b]),I=l.useMemo(()=>({focusGroupIndex:b.focusGroupIndex,focusNextGroup:b.focusNextGroup,focusPrevGroup:b.focusPrevGroup}),[b]),p=l.useMemo(()=>({state:v,dispatch:x,actions:b}),[v,x,b]);return f.jsx(wt.Provider,{value:p,children:f.jsx(Ie,{value:w,children:f.jsx(we,{value:g,children:f.jsx(Te,{value:I,children:a})})})})},je=()=>{const{actions:t}=Y();return l.useMemo(()=>({splitFocused:e=>{t.splitFocused(e)},focusGroupIndex:e=>{t.focusGroupIndex(e)},focusNextGroup:()=>{t.focusNextGroup()},focusPrevGroup:()=>{t.focusPrevGroup()},closeFocusedGroup:()=>{}}),[t])},Ae=()=>{const{actions:t}=Y(),e=l.useCallback(({fromGroupId:n,tabId:o,targetGroupId:s,zone:a})=>{t.contentDrop({fromGroupId:n,tabId:o,targetGroupId:s,zone:a})},[t]),r=l.useCallback(({fromGroupId:n,tabId:o,targetGroupId:s,targetIndex:a})=>{t.tabDrop({fromGroupId:n,tabId:o,targetGroupId:s,targetIndex:a})},[t]);return{onCommitContentDrop:e,onCommitTabDrop:r}},_e=()=>{const t=Pt(),e=je();return l.useEffect(()=>{jt(t,e)},[t,e]),null},ke=({children:t,emptyContentComponent:e,doubleClickToAdd:r})=>{const n=U(),{state:o,actions:s}=Y(),a=l.useCallback(()=>l.createElement("div",{style:{color:"#888",fontSize:12,padding:12}},"No tabs"),[]),i=e??a,c=l.useCallback(b=>{const w=o.groups[b];if(!w)return null;const g=w.tabIds.map(I=>o.panels[I]).filter(Boolean);return{...w,tabs:g}},[o.groups,o.panels]),u=l.useCallback(b=>{const w=o.groups[b];if(!w)return f.jsx(i,{});const g=w.activeTabId;if(!g)return f.jsx(i,{});const I=o.panels[g];return I?I.render():f.jsx(i,{})},[o.groups,o.panels,i]),d=l.useCallback((b,w)=>{s.setActiveTab(b,w)},[s]),h=l.useCallback(b=>{s.addNewTab({groupId:b,title:"New Tab",makeActive:!0})},[s]),v=l.useCallback((b,w)=>{s.removeTab(b,w)},[s]),y=l.useCallback((b,w,g)=>{s.setActiveTab(w,b),n.onStartTabDrag(b,w,g)},[s,n]),m=l.useCallback((b,w)=>{const g=o.groups[b];!g||!g.activeTabId||n.onStartContentDrag(b,g.activeTabId,w)},[o.groups,n]),x=l.useMemo(()=>({getGroup:c,getGroupContent:u,onClickTab:d,onAddTab:h,onCloseTab:v,onStartTabDrag:y,onStartContentDrag:m,doubleClickToAdd:r}),[c,u,d,h,v,y,m,r]);return f.jsx(Mt,{value:x,children:t})},z=(t,e,r,n)=>{if(O(t))return n;const o=t.direction,s=o==="vertical"?r.x+r.w*t.ratio:r.y+r.h*t.ratio;if(n.push({path:e,direction:o,parentRect:r,linePos:s}),o==="vertical"){const c=r.w*t.ratio,u=r.w-c;return z(t.a,[...e,"a"],{x:r.x,y:r.y,w:c,h:r.h},n),z(t.b,[...e,"b"],{x:r.x+c,y:r.y,w:u,h:r.h},n),n}const a=r.h*t.ratio,i=r.h-a;return z(t.a,[...e,"a"],{x:r.x,y:r.y,w:r.w,h:a},n),z(t.b,[...e,"b"],{x:r.x,y:r.y+a,w:r.w,h:i},n),n},Oe=({containerRef:t})=>{const{state:e}=Y(),{adjustSplitRatio:r}=xe(),n=l.useMemo(()=>z(e.tree,[],{x:0,y:0,w:100,h:100},[]),[e.tree]),[o,s]=l.useState(null);if(l.useLayoutEffect(()=>{const i=t.current;if(!i)return;const c=()=>{const y=i.getBoundingClientRect();s({left:y.left,top:y.top,width:y.width,height:y.height})};c();function u(){try{const y=window.ResizeObserver;return typeof y=="function"?y:null}catch{return null}}const d=u(),h=d?new d(()=>c()):null;h&&h.observe(i);const v=()=>c();return window.addEventListener("scroll",v,!0),()=>{window.removeEventListener("scroll",v,!0),h&&h.disconnect()}},[t,e.tree]),!o)return null;const a=(i,c)=>{const u={left:o.left+o.width*i.parentRect.x/100,top:o.top+o.height*i.parentRect.y/100,width:o.width*i.parentRect.w/100,height:o.height*i.parentRect.h/100},d=C.SPLIT_HANDLE_THICKNESS;if(i.direction==="vertical"){const m=u.left+u.width*(i.linePos-i.parentRect.x)/i.parentRect.w,x={position:"fixed",left:`calc(${Math.round(m)}px - ${d} / 2)`,top:Math.round(u.top),width:d,height:Math.round(u.height),cursor:"col-resize",pointerEvents:"auto"},b=w=>{const g=o.width*i.parentRect.w/100,I=g===0?0:w/g;r({path:i.path,deltaRatio:I})};return f.jsx("div",{style:x,children:f.jsx(G.ResizeHandle,{direction:"vertical",onResize:b})},`split-${c}`)}const h=u.top+u.height*(i.linePos-i.parentRect.y)/i.parentRect.h,v={position:"fixed",left:Math.round(u.left),top:`calc(${Math.round(h)}px - ${d} / 2)`,width:Math.round(u.width),height:d,cursor:"row-resize",pointerEvents:"auto"},y=m=>{const x=o.height*i.parentRect.h/100,b=x===0?0:m/x;r({path:i.path,deltaRatio:b})};return f.jsx("div",{style:v,children:f.jsx(G.ResizeHandle,{direction:"horizontal",onResize:y})},`split-${c}`)};return f.jsx("div",{style:{position:"fixed",inset:0,pointerEvents:"none"},children:n.map((i,c)=>a(i,c))})},Me={position:"relative",display:"flex",width:"100%",height:"100%"},Ne=({state:t,layoutMode:e,gridTracksInteractive:r,view:n,tabBarComponent:o,panelGroupComponent:s})=>{const a=c=>{if(n){const u=n;return f.jsx(u,{groupId:c})}return f.jsx(Zt,{id:c,TabBarComponent:o,PanelGroupComponent:s})};if(e==="grid"){const c=kt(t,a,!!r);return f.jsx(G.GridLayout,{config:c.config,layers:c.layers})}const i=_t(t,a);return f.jsx(G.GridLayout,{config:i.config,layers:i.layers})},Le=({containerRef:t,layoutMode:e,gridTracksInteractive:r,dragThresholdPx:n,view:o,style:s,className:a,tabBarComponent:i,panelGroupComponent:c,splitLimits:u,emptyContentComponent:d,doubleClickToAdd:h})=>{const{state:v}=Y(),{onCommitContentDrop:y,onCommitTabDrop:m}=Ae(),x=l.useMemo(()=>({...Me,...s}),[s]),b=l.useCallback(({targetGroupId:w,zone:g})=>{if(g==="center")return!0;const I=g==="left"||g==="right"?"vertical":"horizontal";return tt(v.tree,w,I,u)},[v.tree,u]);return f.jsx(Nt,{children:f.jsxs(Vt,{containerRef:t,dragThresholdPx:n,onCommitContentDrop:y,onCommitTabDrop:m,isContentZoneAllowed:b,children:[f.jsx(ke,{emptyContentComponent:d,doubleClickToAdd:h,children:f.jsx("div",{ref:t,className:a,style:x,children:f.jsx(Ne,{state:v,layoutMode:e,gridTracksInteractive:r,view:o,tabBarComponent:i,panelGroupComponent:c})})}),f.jsx(Oe,{containerRef:t}),f.jsx(Be,{})]})})},Be=()=>{const t=U();return f.jsxs(f.Fragment,{children:[f.jsx(oe,{suggest:t.suggest}),f.jsx(ue,{})]})},He=({initialState:t,createGroupId:e,createPanelId:r,layoutMode:n,gridTracksInteractive:o,dragThresholdPx:s,view:a,emptyContentComponent:i,state:c,onStateChange:u,className:d,style:h,tabBarComponent:v,panelGroupComponent:y,splitLimits:m,doubleClickToAdd:x})=>{if(!t)throw new Error("PanelSystem requires initialState.");if(!e)throw new Error("PanelSystem requires explicit createGroupId function.");if(!n)throw new Error("PanelSystem requires explicit layoutMode ('absolute' | 'grid').");if(n==="grid"&&o===void 0)throw new Error("PanelSystem(layoutMode='grid') requires explicit 'gridTracksInteractive' flag.");if(s===void 0)throw new Error("PanelSystem requires explicit 'dragThresholdPx' value.");const b=l.useRef(null),w=l.useMemo(()=>It(m),[m]);return f.jsx(De,{initialState:t,createGroupId:e,createPanelId:r,state:c,onStateChange:u,splitLimits:m,children:f.jsxs(Dt,{children:[f.jsx(_e,{}),f.jsx(Le,{containerRef:b,layoutMode:n,gridTracksInteractive:o,dragThresholdPx:s,view:a,style:h,className:d,tabBarComponent:v,panelGroupComponent:y,splitLimits:w,emptyContentComponent:i,doubleClickToAdd:x})]})})};exports.Drawer=G.Drawer;exports.DrawerLayers=G.DrawerLayers;exports.GridLayout=G.GridLayout;exports.ResizeHandle=G.ResizeHandle;exports.runTransition=G.runTransition;exports.useTransitionState=G.useTransitionState;exports.CSS_VAR_PREFIX=C.CSS_VAR_PREFIX;exports.HorizontalDivider=Et;exports.PanelSystem=He;exports.buildInitialState=me;exports.useLayerDragHandle=Rt;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const G=require("./GridLayout-qufTyOQM.cjs"),b=require("react/jsx-runtime"),Et=require("react"),P=require("./styles-DcG3aIFx.cjs"),tt=require("./usePivot-C8q0pMgW.cjs"),Rt=require("react-dom");function Ct(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const r in t)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,n.get?n:{enumerable:!0,get:()=>t[r]})}}return e.default=t,Object.freeze(e)}const l=Ct(Et),Pt=t=>{const e=t==="drag"?P.COLOR_RESIZE_HANDLE_ACTIVE:t==="hover"?P.COLOR_RESIZE_HANDLE_HOVER:P.COLOR_RESIZE_HANDLE_IDLE;return{width:P.HORIZONTAL_DIVIDER_WIDTH,cursor:"col-resize",position:"relative",userSelect:"none",backgroundColor:e}},Dt=({onResize:t,component:e,element:r})=>{const{ref:n,isDragging:o,onPointerDown:s}=G.useResizeDrag({axis:"x",onResize:t}),[c,i]=l.useState(!1),a={ref:n,style:Pt(o?"drag":c?"hover":"idle"),role:"separator","aria-orientation":"vertical","data-dragging":o?"true":void 0,onPointerDown:s,onPointerEnter:()=>i(!0),onPointerLeave:()=>i(!1)};return r?l.cloneElement(r,a):e?b.jsx(e,{...a}):b.jsx("div",{...a})},jt=()=>{const{layerId:t}=G.useLayerInstance(),{getLayerHandleProps:e}=G.useGridLayoutContext();return l.useMemo(()=>e(t),[e,t])},ct=l.createContext(null),At=()=>{const t=l.useContext(ct);if(!t)throw new Error("useKeybindings must be used within KeybindingsProvider");return t},_t=t=>{const e=[];t.metaKey&&e.push("Mod"),t.ctrlKey&&e.push("Ctrl"),t.altKey&&e.push("Alt"),t.shiftKey&&e.push("Shift");const r=t.key.length===1?t.key.toUpperCase():t.key;return e.push(r),e.join("-")},kt=({children:t,configure:e})=>{const r=l.useRef({}),n=l.useCallback((c,i)=>{r.current={...r.current,[c]:i}},[]),o=l.useCallback(c=>{const i={...r.current};delete i[c],r.current=i},[]);l.useEffect(()=>{const c=i=>{const a=_t(i),u=r.current[a];u&&u(i)};return window.addEventListener("keydown",c),()=>{window.removeEventListener("keydown",c)}},[]);const s=l.useMemo(()=>({register:n,unregister:o}),[n,o]);return l.useEffect(()=>{e&&e(s)},[s,e]),b.jsx(ct.Provider,{value:s,children:t})},Mt=(t,e)=>{t.register("Mod-\\",r=>{r.preventDefault(),e.splitFocused("vertical")}),t.register("Mod-Shift-\\",r=>{r.preventDefault(),e.splitFocused("horizontal")});for(const r of[1,2,3,4,5,6,7,8,9])t.register(`Mod-${String(r)}`,n=>{n.preventDefault(),e.focusGroupIndex(r)});t.register("Alt-ArrowRight",r=>{r.preventDefault(),e.focusNextGroup()}),t.register("Alt-ArrowLeft",r=>{r.preventDefault(),e.focusPrevGroup()})},Ot=t=>t.type==="group",at=(t,e={x:0,y:0,w:100,h:100})=>{const r=new Map,n=(o,s)=>{if(Ot(o)){r.set(o.groupId,s);return}if(o.direction==="vertical"){const a=s.w*o.ratio,u=s.w-a;n(o.a,{x:s.x,y:s.y,w:a,h:s.h}),n(o.b,{x:s.x+a,y:s.y,w:u,h:s.h});return}const c=s.h*o.ratio,i=s.h-c;n(o.a,{x:s.x,y:s.y,w:s.w,h:c}),n(o.b,{x:s.x,y:s.y+c,w:s.w,h:i})};return n(t,e),r},Nt=(t,e)=>{const r=at(t.tree),n={areas:[["root"]],rows:[{size:"1fr"}],columns:[{size:"1fr"}],gap:"0px",style:{position:"relative"}},o=Array.from(r.entries()).map(([s,c])=>{const i={position:"absolute",left:`${c.x}%`,top:`${c.y}%`,width:`${c.w}%`,height:`${c.h}%`,overflow:"hidden",display:"flex",flexDirection:"column"};return{id:s,positionMode:"absolute",style:i,component:e(s)}});return{config:n,layers:o}},Lt=(t,e,r)=>{const n=at(t.tree),o=Array.from(new Set(Array.from(n.values()).flatMap(m=>[m.x,m.x+m.w]))).sort((m,x)=>m-x),s=Array.from(new Set(Array.from(n.values()).flatMap(m=>[m.y,m.y+m.h]))).sort((m,x)=>m-x),c=o.slice(1).map((m,x)=>`${m-o[x]}fr`),i=s.slice(1).map((m,x)=>`${m-s[x]}fr`),a=c.map(m=>({size:m,resizable:r})),u=i.map(m=>({size:m,resizable:r})),d=(m,x,I,y)=>{for(const[g,v]of n.entries())if(m>=v.x&&x<=v.x+v.w&&I>=v.y&&y<=v.y+v.h)return g;return"."},f=[];for(let m=0;m<s.length-1;m+=1){const x=[];for(let I=0;I<o.length-1;I+=1)x.push(d(o[I],o[I+1],s[m],s[m+1]));f.push(x)}const h={areas:f,rows:u,columns:a,gap:"0px"},w=Array.from(n.keys()).map(m=>({id:m,gridArea:m,component:e(m)}));return{config:h,layers:w}},ut=l.createContext(null),Bt=()=>{const t=l.useContext(ut);if(!t)throw new Error("usePanelRenderContext must be used within PanelRenderProvider");return t},Ht=({value:t,children:e})=>b.jsx(ut.Provider,{value:t,children:e}),lt=l.createContext(null),dt=()=>{const t=l.useContext(lt);if(!t)throw new Error("useDomRegistry must be used within DomRegistryProvider");return t},$t=({children:t})=>{const e=l.useRef(new Map),r=l.useCallback(a=>{const u=e.current.get(a);if(u)return u;const d={group:null,tabbar:null,content:null};return e.current.set(a,d),d},[]),n=l.useCallback((a,u)=>{const d=r(a);if(d.group=u,u===null){const f=e.current.get(a);(f?f.tabbar===null&&f.content===null:!1)&&e.current.delete(a)}},[r]),o=l.useCallback((a,u)=>{const d=r(a);if(d.tabbar=u,u===null){const f=e.current.get(a);(f?f.group===null&&f.content===null:!1)&&e.current.delete(a)}},[r]),s=l.useCallback((a,u)=>{const d=r(a);if(d.content=u,u===null){const f=e.current.get(a);(f?f.group===null&&f.tabbar===null:!1)&&e.current.delete(a)}},[r]),c=l.useCallback(()=>e.current,[]),i=l.useMemo(()=>({setGroupEl:n,setTabbarEl:o,setContentEl:s,getAll:c}),[n,o,s,c]);return b.jsx(lt.Provider,{value:i,children:t})},zt={display:"flex",flexDirection:"column",width:"100%",height:"100%"},Xt={flex:"1 1 auto",minWidth:0,minHeight:0,position:"relative",overflow:"hidden"};function Ft(t,e,r,n){return t?l.cloneElement(t,r,n):e?b.jsx(e,{...r,children:n}):b.jsx("div",{...r,children:n})}function Yt(t,e,r,n){return t?l.cloneElement(t,r,n):e?b.jsx(e,{...r,children:n}):b.jsx("div",{...r,children:n})}const qt=({group:t,tabbar:e,content:r,onContentPointerDown:n,groupRef:o,contentRef:s,component:c,element:i,contentComponent:a,contentElement:u})=>{const d={ref:o,style:zt,"data-group-id":t.id},h=Ft(u,a,{ref:s,style:Xt,"data-dnd-zone":"content",onPointerDown:n},r),w=b.jsxs(b.Fragment,{children:[e,h]});return Yt(i,c,d,w)},pt=l.memo(qt,(t,e)=>t.group.id!==e.group.id||t.group.activeTabId!==e.group.activeTabId||t.group.tabs.length!==e.group.tabs.length?!1:t.group.tabs===e.group.tabs);pt.displayName="PanelGroupView";const q=(t,e,r)=>{const n=t.left,o=t.top,s=t.width,c=t.height,i=e-n,a=r-o,u=s/3,d=c/3;return i>u&&i<s-u&&a>d&&a<c-d?"center":i<a&&i<s-i&&a<c-a?"left":s-i<a&&s-i<i&&a<c-a?"right":a<i&&a<c-a&&i<s-i?"top":"bottom"};function _(t,e){if(!e){const n=(()=>({type:t}));return Object.defineProperty(n,"type",{value:t,writable:!1,enumerable:!0}),n}const r=((...n)=>{const o=e(...n);return typeof o>"u"?{type:t}:{type:t,payload:o}});return Object.defineProperty(r,"type",{value:t,writable:!1,enumerable:!0}),r}const Vt=(t,e)=>{const r={};return Object.keys(t).forEach(n=>{const o=t[n];r[n]=((...s)=>{const c=o(...s);return e(c),c})}),r},ft=(t,e)=>{const r={};return Object.keys(e).forEach(n=>{const o=e[n];if(!o)return;const s=t[n];if(!s)throw new Error(`Missing action creator for key "${String(n)}"`);r[s.type]=o}),r},bt={phase:{kind:"idle"},suggest:null,pointer:null,tabbarHover:null,draggingTabElement:null},A={startContent:_("START_CONTENT",t=>t),startTab:_("START_TAB",t=>t),setSuggest:_("SET_SUGGEST",t=>t),setPointer:_("SET_POINTER",t=>t),setTabbarHover:_("SET_TABBAR_HOVER",t=>t),reset:_("RESET")},Kt=ft(A,{startContent:(t,e)=>({phase:{kind:"content",startX:e.payload.x,startY:e.payload.y,fromGroupId:e.payload.groupId,tabId:e.payload.tabId,cache:e.payload.cache},suggest:null,pointer:null,tabbarHover:null,draggingTabElement:null}),startTab:(t,e)=>({phase:{kind:"tab",startX:e.payload.x,startY:e.payload.y,fromGroupId:e.payload.groupId,tabId:e.payload.tabId,cache:e.payload.cache},suggest:null,pointer:null,tabbarHover:null,draggingTabElement:e.payload.element}),setSuggest:(t,e)=>({...t,suggest:e.payload}),setPointer:(t,e)=>({...t,pointer:e.payload}),setTabbarHover:(t,e)=>({...t,tabbarHover:e.payload}),reset:()=>bt}),Ut=(t,e)=>{const r=Kt[e.type];return r?r(t,e,void 0):t},gt=l.createContext(null),U=()=>{const t=l.useContext(gt);if(!t)throw new Error("usePanelInteractions must be used within InteractionsProvider");return t},Wt=({containerRef:t,dragThresholdPx:e,onCommitContentDrop:r,onCommitTabDrop:n,isContentZoneAllowed:o,children:s})=>{const[c,i]=l.useReducer(Ut,bt),a=dt(),u=l.useCallback(()=>{const I=Array.from(a.getAll().entries()),y=I.map(([p,T])=>({gid:p,el:T.content??T.group})).filter(p=>!!p.el).map(p=>({...p,rect:p.el.getBoundingClientRect()})),g=I.map(([p,T])=>({gid:p,el:T.tabbar})).filter(p=>!!p.el).map(p=>({...p,rect:p.el.getBoundingClientRect()})),v=I.map(([p,T])=>({gid:p,el:T.content??T.group})).filter(p=>!!p.el).map(p=>({...p,rect:p.el.getBoundingClientRect()}));return{groups:y,tabbars:g,contents:v}},[a]),d=G.useEffectEvent(I=>{if(!t.current)return;const g=I.clientX,v=I.clientY,p=c.phase;if(p.kind==="idle")return;const T=Math.abs(g-p.startX),R=Math.abs(v-p.startY);if(T<e&&R<e){c.phase.kind==="content"&&i(A.setSuggest(null)),i(A.setPointer(null)),i(A.setTabbarHover(null));return}if(i(A.setPointer({x:g,y:v})),p.kind==="content"){const E=p.cache.groups.find(({rect:S})=>g>=S.left&&g<=S.right&&v>=S.top&&v<=S.bottom);if(!E){i(A.setSuggest(null));return}const D=q(E.rect,g,v);if(o&&!o({targetGroupId:E.gid,zone:D})){i(A.setSuggest(null));return}i(A.setSuggest({rect:E.rect,zone:D}));return}if(p.kind==="tab"){const E=p.cache.tabbars.find(({rect:C})=>g>=C.left&&g<=C.right&&v>=C.top&&v<=C.bottom);if(E){const k=Array.from(E.el.querySelectorAll("[role='tab']")).map(H=>H.getBoundingClientRect()),j=k.map(H=>H.left+H.width/2),O=j.findIndex(H=>g<H),N=O===-1?j.length:O,Gt=k.length===0?E.rect.left+8:N===0?k[0].left:N===k.length?k[k.length-1].right:(k[N-1].right+k[N].left)/2;i(A.setTabbarHover({groupId:E.gid,index:N,rect:E.rect,insertX:Gt}))}else i(A.setTabbarHover(null));const D=p.cache.contents.find(({rect:C})=>g>=C.left&&g<=C.right&&v>=C.top&&v<=C.bottom);if(!D){i(A.setSuggest(null));return}const S=q(D.rect,g,v);if(o&&!o({targetGroupId:D.gid,zone:S})){i(A.setSuggest(null));return}i(A.setSuggest({rect:D.rect,zone:S}))}}),f=G.useEffectEvent(I=>{const y=t.current,g=c;if(i(A.reset()),!y)return;const v=I.clientX,p=I.clientY;if(g.phase.kind==="idle")return;const T=Math.abs(v-g.phase.startX),R=Math.abs(p-g.phase.startY);if(!(T<e&&R<e)){if(g.phase.kind==="content"){const E=g.phase.cache.groups.find(({rect:C})=>v>=C.left&&v<=C.right&&p>=C.top&&p<=C.bottom);if(!E)return;const D=E.gid??null;if(!D)return;const S=q(E.rect,v,p);if(o&&!o({targetGroupId:D,zone:S}))return;r({fromGroupId:g.phase.fromGroupId,tabId:g.phase.tabId,targetGroupId:D,zone:S});return}if(g.phase.kind==="tab"){const E=g.phase.cache.tabbars.find(({rect:S})=>v>=S.left&&v<=S.right&&p>=S.top&&p<=S.bottom);if(E){const S=E.gid;if(!S)return;const k=Array.from(E.el.querySelectorAll("[role='tab']")).map(N=>{const Z=N.getBoundingClientRect();return Z.left+Z.width/2}),j=k.findIndex(N=>v<N),O=j===-1?k.length:j;n({fromGroupId:g.phase.fromGroupId,tabId:g.phase.tabId,targetGroupId:S,targetIndex:O});return}const D=g.phase.cache.contents.find(({rect:S})=>v>=S.left&&v<=S.right&&p>=S.top&&p<=S.bottom);if(D){const S=D.gid??null;if(!S)return;const C=q(D.rect,v,p);if(o&&!o({targetGroupId:S,zone:C}))return;r({fromGroupId:g.phase.fromGroupId,tabId:g.phase.tabId,targetGroupId:S,zone:C})}}}}),h=G.useEffectEvent(()=>{i(A.reset())});l.useEffect(()=>{if(c.phase.kind!=="idle")return window.addEventListener("pointermove",d),window.addEventListener("pointerup",f,{once:!0}),window.addEventListener("pointercancel",h,{once:!0}),()=>{window.removeEventListener("pointermove",d),window.removeEventListener("pointerup",f),window.removeEventListener("pointercancel",h)}},[c.phase.kind]);const w=l.useCallback((I,y,g)=>{if(g.button!==0)return;g.currentTarget.setPointerCapture(g.pointerId);const v=u();i(A.startContent({x:g.clientX,y:g.clientY,groupId:I,tabId:y,cache:v}))},[u]),m=l.useCallback((I,y,g)=>{if(g.button!==0)return;const v=g.currentTarget;v&&v.setPointerCapture(g.pointerId);const p=u();i(A.startTab({x:g.clientX,y:g.clientY,groupId:y,tabId:I,cache:p,element:v}))},[u]),x=l.useMemo(()=>({suggest:c.suggest,isTabDragging:c.phase.kind==="tab",draggingTabId:c.phase.kind==="tab"?c.phase.tabId:null,dragPointer:c.pointer,tabbarHover:c.tabbarHover,draggingTabElement:c.draggingTabElement,onStartContentDrag:w,onStartTabDrag:m}),[c.suggest,c.pointer,c.tabbarHover,c.phase,c.draggingTabElement,w,m]);return b.jsx(gt.Provider,{value:x,children:s})},rt={display:"inline-flex",alignItems:"center",userSelect:"none"},Zt=({groupId:t,tab:e,active:r,dragging:n,onClickTab:o,onStartDrag:s,onCloseTab:c,tabComponent:i,tabElement:a,onDoubleClick:u})=>{const d=l.useEffectEvent(()=>{o(e.id)}),f=l.useEffectEvent(x=>{s&&x.button===0&&s(e.id,t,x)}),h=()=>{const x=!!c;return b.jsx(l.Activity,{mode:x?"visible":"hidden",children:b.jsx("button",{type:"button","aria-label":`Close tab ${e.title}`,onClick:I=>{c&&(I.stopPropagation(),c(t,e.id))},style:{marginLeft:6},tabIndex:x?void 0:-1,disabled:!x,"aria-hidden":x?void 0:!0,children:"×"})})},w={role:"tab","aria-selected":r,tabIndex:r?0:-1,style:rt,onClick:d,onPointerDown:f,onDoubleClick:u,"data-tab-id":e.id,"data-active":r?"true":"false","data-dragging":n?"true":"false",children:b.jsxs(b.Fragment,{children:[b.jsx("span",{children:e.title}),h()]})},m={type:"button",role:"tab","aria-selected":r,tabIndex:r?0:-1,style:rt,onClick:()=>{o(e.id)},onPointerDown:x=>{s&&x.button===0&&s(e.id,t,x)},onDoubleClick:u,children:b.jsx("span",{children:e.title})};return a?a(m):i?b.jsx(i,{...m}):b.jsx("div",{...w})},Jt={display:"flex",alignItems:"center"},Qt={flex:"1 1 auto",alignSelf:"stretch"},te=({group:t,onClickTab:e,onStartDrag:r,rootRef:n,component:o,element:s,tabComponent:c,tabElement:i,onAddTab:a,onCloseTab:u,doubleClickToAdd:d})=>{const{isTabDragging:f,draggingTabId:h}=U(),w=l.useRef(null),m=l.useCallback(p=>{if(w.current=p,!!n){if(typeof n=="function"){n(p);return}try{n.current=p}catch{}}},[n]),x=l.useEffectEvent(p=>{const T=w.current??p.currentTarget;if(!T)return;const R=Array.from(T.querySelectorAll('[role="tab"]'));if(R.length===0)return;const E=j=>{const O=Math.max(0,Math.min(j,R.length-1)),N=R[O];N&&N.focus()},D=document.activeElement,S=D?R.indexOf(D):R.findIndex(j=>j.getAttribute("data-tab-id")===t.activeTabId);if(p.key==="ArrowRight"){p.preventDefault();const j=S>=0?S+1:0;E(j>=R.length?0:j);return}if(p.key==="ArrowLeft"){p.preventDefault();const j=S>=0?S-1:R.length-1;E(j<0?R.length-1:j);return}if(p.key==="Home"){p.preventDefault(),E(0);return}if(p.key==="End"){p.preventDefault(),E(R.length-1);return}if(p.key==="Enter"||p.key===" "){p.preventDefault();const O=(S>=0?R[S]:null)?.getAttribute("data-tab-id")??null;O&&e(O);return}if(p.key==="Delete"||p.key==="Backspace"){if(u){p.preventDefault();const O=(S>=0?R[S]:null)?.getAttribute("data-tab-id")??null;O&&u(t.id,O)}return}const C=(p.ctrlKey?1:0)+(p.metaKey?1:0)>0,k=typeof p.key=="string"?p.key.toLowerCase():"";if(C&&k==="t"){a&&(p.preventDefault(),a(t.id));return}});l.useEffect(()=>{const p=w.current;if(!p)return;const T=p.querySelector(`[role="tab"][data-tab-id="${t.activeTabId}"]`);if(T===document.activeElement)return;!p.contains(document.activeElement)&&T&&T.focus()},[t.activeTabId]);const I={style:Jt,role:"tablist","data-tabbar":"true","data-group-id":t.id,"data-dragging":f?"true":"false",onKeyDown:x},y=G.useElementComponentWrapper({element:s,component:o}),g=()=>a?b.jsx("button",{type:"button","aria-label":"Add tab",onClick:()=>{a(t.id)},children:"+"}):null,v=l.useCallback(()=>{d&&a&&a(t.id)},[d,a,t.id]);return b.jsxs(y,{...I,ref:m,onDoubleClick:v,children:[t.tabs.map((p,T)=>b.jsx(Zt,{groupId:t.id,tab:p,active:t.activeTabId===p.id,dragging:h===p.id,onClickTab:e,onStartDrag:r,onCloseTab:u,tabComponent:c,tabElement:i,onDoubleClick:R=>R.stopPropagation()},`${t.id}:${p.id}:${T}`)),b.jsx("span",{style:Qt}),g()]})},ee=({id:t,TabBarComponent:e,PanelGroupComponent:r})=>{const{getGroup:n,getGroupContent:o,onClickTab:s,onAddTab:c,onCloseTab:i,onStartTabDrag:a,doubleClickToAdd:u,registerContentContainer:d}=Bt(),{setGroupEl:f,setTabbarEl:h,setContentEl:w}=dt(),m=l.useCallback(T=>{f(t,T)},[t,f]),x=l.useCallback(T=>{w(t,T),d(t,T)},[t,w,d]),I=l.useCallback(T=>{h(t,T)},[t,h]),y=n(t);if(!y)return null;const g=o(t),v=e??te,p=r??(T=>b.jsx(pt,{...T}));return b.jsx(p,{group:y,tabbar:b.jsx(v,{rootRef:I,group:y,onClickTab:T=>s(t,T),onAddTab:c,onCloseTab:i,onStartDrag:(T,R,E)=>a(T,R,E),doubleClickToAdd:u}),content:g,groupRef:m,contentRef:x})},re=(t,e)=>{const r=new Array(16);for(let n=0;n<4;n++)for(let o=0;o<4;o++)r[n*4+o]=t[0+o]*e[n*4+0]+t[4+o]*e[n*4+1]+t[8+o]*e[n*4+2]+t[12+o]*e[n*4+3];return r},V=t=>{if(t.length!==16)throw new Error("Matrix must have exactly 16 values");const e=Object.freeze([...t]),r=n=>{const o=re(e,n);return V(o)};return Object.freeze({translate:(n=0,o=0,s=0)=>r([1,0,0,0,0,1,0,0,0,0,1,0,n,o,s,1]),translate3d:(n,o,s)=>r([1,0,0,0,0,1,0,0,0,0,1,0,n,o,s,1]),translateX:n=>r([1,0,0,0,0,1,0,0,0,0,1,0,n,0,0,1]),translateY:n=>r([1,0,0,0,0,1,0,0,0,0,1,0,0,n,0,1]),translateZ:n=>r([1,0,0,0,0,1,0,0,0,0,1,0,0,0,n,1]),scale:(n=1,o=1,s=1)=>r([n,0,0,0,0,o,0,0,0,0,s,0,0,0,0,1]),scale3d:(n,o,s)=>r([n,0,0,0,0,o,0,0,0,0,s,0,0,0,0,1]),scaleX:n=>r([n,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),scaleY:n=>r([1,0,0,0,0,n,0,0,0,0,1,0,0,0,0,1]),scaleZ:n=>r([1,0,0,0,0,1,0,0,0,0,n,0,0,0,0,1]),rotateX:n=>{const o=Math.cos(n),s=Math.sin(n);return r([1,0,0,0,0,o,s,0,0,-s,o,0,0,0,0,1])},rotateY:n=>{const o=Math.cos(n),s=Math.sin(n);return r([o,0,-s,0,0,1,0,0,s,0,o,0,0,0,0,1])},rotateZ:n=>{const o=Math.cos(n),s=Math.sin(n);return r([o,s,0,0,-s,o,0,0,0,0,1,0,0,0,0,1])},rotate:(n,o,s,c)=>{const i=Math.sqrt(o*o+s*s+c*c);if(i===0)return V(e);o/=i,s/=i,c/=i;const a=Math.cos(n),u=Math.sin(n),d=1-a;return r([d*o*o+a,d*o*s+u*c,d*o*c-u*s,0,d*o*s-u*c,d*s*s+a,d*s*c+u*o,0,d*o*c+u*s,d*s*c-u*o,d*c*c+a,0,0,0,0,1])},rotate3d:(n,o,s,c)=>{const i=Math.sqrt(n*n+o*o+s*s);if(i===0)return V(e);n/=i,o/=i,s/=i;const a=Math.cos(c),u=Math.sin(c),d=1-a;return r([d*n*n+a,d*n*o+u*s,d*n*s-u*o,0,d*n*o-u*s,d*o*o+a,d*o*s+u*n,0,d*n*s+u*o,d*o*s-u*n,d*s*s+a,0,0,0,0,1])},skew:(n=0,o=0)=>{const s=Math.tan(n),c=Math.tan(o);return r([1,c,0,0,s,1,0,0,0,0,1,0,0,0,0,1])},skewX:n=>{const o=Math.tan(n);return r([1,0,0,0,o,1,0,0,0,0,1,0,0,0,0,1])},skewY:n=>{const o=Math.tan(n);return r([1,o,0,0,0,1,0,0,0,0,1,0,0,0,0,1])},perspective:n=>{if(n===0)throw new Error("Perspective distance cannot be zero");return r([1,0,0,0,0,1,0,0,0,0,1,-1/n,0,0,0,1])},toCSS:()=>`matrix3d(${e.join(", ")})`,toArray:()=>e,toString:()=>[`[${e[0]}, ${e[4]}, ${e[8]}, ${e[12]}]`,`[${e[1]}, ${e[5]}, ${e[9]}, ${e[13]}]`,`[${e[2]}, ${e[6]}, ${e[10]}, ${e[14]}]`,`[${e[3]}, ${e[7]}, ${e[11]}, ${e[15]}]`].join(`
|
|
2
|
+
`)})},ne=()=>V([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),oe={position:"fixed",inset:0,pointerEvents:"none",zIndex:P.DROP_SUGGEST_Z_INDEX},se={position:"absolute",border:`${P.DROP_SUGGEST_BORDER_WIDTH} dashed ${P.DROP_SUGGEST_BORDER_COLOR}`,background:P.DROP_SUGGEST_BG_COLOR,borderRadius:P.DROP_SUGGEST_BORDER_RADIUS,transformOrigin:"top left"},L=(t,e)=>e<=0?0:G.clampNumber(t/e,0),ie=(t,e,r)=>{const{width:n,height:o}=t,s=r/2,c=n>0?n:1,i=o>0?o:1,a={translateX:r,translateY:r,scaleX:L(G.clampNumber(n-r*2,0),c),scaleY:L(G.clampNumber(o-r*2,0),i)},u={translateX:r,translateY:r,scaleX:L(G.clampNumber(n/2-r*1.5,0),c),scaleY:L(G.clampNumber(o-r*2,0),i)},d={translateX:n/2+s,translateY:r,scaleX:L(G.clampNumber(n/2-r*1.5,0),c),scaleY:L(G.clampNumber(o-r*2,0),i)},f={translateX:r,translateY:r,scaleX:L(G.clampNumber(n-r*2,0),c),scaleY:L(G.clampNumber(o/2-r*1.5,0),i)},h={translateX:r,translateY:o/2+s,scaleX:L(G.clampNumber(n-r*2,0),c),scaleY:L(G.clampNumber(o/2-r*1.5,0),i)},w={center:a,left:u,right:d,top:f,bottom:h},{translateX:m,translateY:x,scaleX:I,scaleY:y}=w[e];return ne().translate(m,x,0).scale(I,y,1).toCSS()},ce=(t,e)=>{const r=P.DROP_SUGGEST_PADDING_PX;return{...se,left:t.left,top:t.top,width:t.width,height:t.height,transform:ie(t,e,r)}},ae=({suggest:t})=>{if(!t)return null;const{rect:e,zone:r}=t,n=ce(e,r);return b.jsx("div",{style:oe,children:b.jsx("div",{style:n})})},ue=typeof window<"u"&&typeof document<"u",le=t=>{const[e,r]=l.useState(null),[n,o]=l.useState(null);return tt.useIsomorphicLayoutEffect(()=>{if(!ue||!t){r(null),o(null);return}const s=t.getBoundingClientRect();r({width:s.width,height:s.height}),o(t.outerHTML)},[t]),{html:n,size:e}},de={position:"fixed",inset:0,pointerEvents:"none",zIndex:P.TAB_DRAG_OVERLAY_Z_INDEX},pe={position:"absolute",width:P.TAB_DRAG_INSERT_GUIDE_WIDTH,borderRadius:P.TAB_DRAG_INSERT_GUIDE_BORDER_RADIUS,background:P.TAB_DRAG_INSERT_GUIDE_COLOR,boxShadow:P.TAB_DRAG_INSERT_GUIDE_SHADOW},fe=()=>{const{isTabDragging:t,draggingTabId:e,dragPointer:r,tabbarHover:n,draggingTabElement:o}=U(),{html:s,size:c}=le(o),i=r!==null&&e!==null,a=l.useMemo(()=>{if(!(!i||!r))return{position:"absolute",left:r.x,top:r.y,transform:`translate(${P.TAB_DRAG_PREVIEW_OFFSET_X}, ${P.TAB_DRAG_PREVIEW_OFFSET_Y})`,pointerEvents:"none"}},[i,r]),u=l.useMemo(()=>{if(!(!a||!o))return c?{...a,width:c.width,height:c.height}:a},[a,o,c]),d=l.useMemo(()=>{if(n)return{...pe,left:n.insertX,top:n.rect.top+4,height:Math.max(0,n.rect.height-8)}},[n]);return t?b.jsxs("div",{style:de,children:[b.jsx(l.Activity,{mode:u?"visible":"hidden",children:b.jsx("div",{style:u,children:b.jsx("div",{style:{width:"100%",height:"100%",pointerEvents:"none"},dangerouslySetInnerHTML:{__html:s??""}})})}),b.jsx(l.Activity,{mode:d?"visible":"hidden",children:b.jsx("div",{style:d})})]}):null},M=t=>t.type==="group",F=(t,e=[])=>{if(M(t))return[...e,t.groupId];const r=F(t.a,e);return F(t.b,r)},W=(t,e)=>e.reduce((r,n)=>M(r)?r:r[n],t),Y=(t,e,r)=>{if(e.length===0)return r;const[n,...o]=e;return M(t)?t:n==="a"?{...t,a:Y(t.a,o,r)}:{...t,b:Y(t.b,o,r)}},K=(t,e,r=[])=>{if(M(t))return t.groupId===e?{splitPath:null,side:null}:null;if(M(t.a)&&t.a.groupId===e)return{splitPath:r,side:"a"};if(M(t.b)&&t.b.groupId===e)return{splitPath:r,side:"b"};const n=K(t.a,e,[...r,"a"]);return n||K(t.b,e,[...r,"b"])},ht=(t,e,r,n)=>{const o=n(),s=K(t,e),c={type:"split",direction:r,ratio:.5,a:{type:"group",groupId:e},b:{type:"group",groupId:o}};if(!s||s.splitPath===null)return{tree:c,newGroupId:o};const i=s.splitPath,a=W(t,i);if(M(a))return{tree:c,newGroupId:o};const u=s.side==="a"?{...a,a:c}:{...a,b:c};return{tree:Y(t,i,u),newGroupId:o}},be=(t,e)=>{const r=K(t,e);if(!r||r.splitPath===null)return{tree:t,survivorGroupId:e};const n=r.splitPath,o=W(t,n);if(M(o))return{tree:t,survivorGroupId:e};const s=r.side==="a"?o.b:o.a,c=Y(t,n,s),i=M(s)?s.groupId:F(s)[0]??null;return{tree:c,survivorGroupId:i}},ge=(t,e,r)=>{const n=W(t,e);if(M(n))return t;const o={...n,ratio:G.clampNumber(r,.05,.95)};return Y(t,e,o)},J=t=>{if(Object.keys(t.groups).filter(o=>t.groups[o].tabIds.length===0).length===0)return t;const n=(o,s)=>{const c=o.groups[s];if(!c||c.tabs.length>0||Object.keys(o.groups).length<=1)return o;const{tree:a,survivorGroupId:u}=be(o.tree,s),{[s]:d,...f}=o.groups,h=F(a),w=o.focusedGroupId===s?u??h[0]??null:o.focusedGroupId;return{...o,tree:a,groups:f,groupOrder:h,focusedGroupId:w}};return t.groupOrder.reduce((o,s)=>n(o,s),t)},he=t=>({id:t,tabIds:[],tabs:[],activeTabId:null}),nt=(t,e,r,n)=>{const o={...t.groups},s=o[e];if(!s)throw new Error(`Group ${e} does not exist.`);const c={...t.panels,[r.id]:r},i=[...s.tabIds,r.id],a=n?r.id:s.activeTabId??r.id,u=i.map(f=>c[f]),d={...s,tabIds:i,tabs:u,activeTabId:a};return o[e]=d,{...t,panels:c,groups:o}},me=(t,e,r)=>{const n={...t.groups},o=n[e];if(!o)throw new Error(`Group ${e} does not exist.`);const s=o.tabIds.filter(a=>a!==r),c=s.map(a=>t.panels[a]),i=o.activeTabId===r?s[0]??null:o.activeTabId;return n[e]={...o,tabIds:s,tabs:c,activeTabId:i},{...t,groups:n}},ot=(t,e,r,n,o)=>{const s=t.groups[e],c=t.groups[r];if(!s||!c)throw new Error("moveTab: source or target group is missing.");const i={...t.groups},a=s.tabIds.filter(f=>f!==n),u=[...c.tabIds.filter(f=>f!==n),n],d=s.activeTabId===n?a[0]??null:s.activeTabId;return i[e]={...s,tabIds:a,tabs:a.map(f=>t.panels[f]),activeTabId:d},i[r]={...c,tabIds:u,tabs:u.map(f=>t.panels[f]),activeTabId:n},{...t,groups:i}},mt=(t,e,r)=>{const n=t.groups[e];if(!n)throw new Error(`setActiveTab: group ${e} not found.`);if(!n.tabIds.some(s=>s===r))throw new Error(`setActiveTab: tab ${r} not found in group ${e}.`);const o={...t.groups,[e]:{...n,activeTabId:r}};return{...t,groups:o,focusedGroupId:e}},st=(t,e,r,n,o)=>{const s=t.groups[e];if(!s)throw new Error(`addTabToGroupAtIndex: group ${e} not found.`);const c={...t.panels,[r.id]:r},i=s.tabIds.slice(),a=Math.max(0,Math.min(n,i.length));i.splice(a,0,r.id);const u=i.map(h=>c[h]),d=o?r.id:s.activeTabId??r.id,f={...t.groups,[e]:{...s,tabIds:i,tabs:u,activeTabId:d}};return{...t,panels:c,groups:f}},B=(t,e)=>{if(!t.groups[e])throw new Error(`setFocusedGroup: group ${e} not found.`);return{...t,focusedGroupId:e}},ve=(t,e)=>{const r=e-1,n=t.groupOrder[r];return n?B(t,n):t},Ie=t=>{const e=t.groupOrder,r=t.focusedGroupId;if(!r){const s=e[0];return s?B(t,s):t}const n=e.indexOf(r),o=e[(n+1)%e.length];return B(t,o)},we=t=>{const e=t.groupOrder,r=t.focusedGroupId;if(!r){const s=e[e.length-1];return s?B(t,s):t}const n=e.indexOf(r),o=e[(n-1+e.length)%e.length];return B(t,o)},vt=(t,e,r,n)=>{const{tree:o,newGroupId:s}=ht(t.tree,e,r,n),c={...t.groups,[s]:he(s)},i=F(o);return{...t,tree:o,groups:c,groupOrder:i,focusedGroupId:s}},xe=t=>{const r={type:"group",groupId:"g_1"},n=Object.fromEntries(t.map(i=>[i.id,i])),s={g_1:{id:"g_1",tabIds:t.map(i=>i.id),tabs:t,activeTabId:t[0]?.id??null}};return{tree:r,panels:n,groups:s,groupOrder:["g_1"],focusedGroupId:"g_1"}},ye=l.createContext(null),Te=({value:t,children:e})=>b.jsx(ye.Provider,{value:t,children:e}),It=l.createContext(null),Se=()=>{const t=l.useContext(It);if(!t)throw new Error("useTree must be used within TreeProvider");return t},Ge=({value:t,children:e})=>b.jsx(It.Provider,{value:t,children:e}),Ee=l.createContext(null),Re=({value:t,children:e})=>b.jsx(Ee.Provider,{value:t,children:e}),z=t=>{const e=G.toFiniteNumberOr(t,Number.POSITIVE_INFINITY);return G.clampNumber(e,1)},Ce=t=>typeof t=="object"&&t!==null,Pe=t=>Ce(t)?"rows"in t?!0:"cols"in t:!1,wt=t=>{if(!t)return{rows:Number.POSITIVE_INFINITY,cols:Number.POSITIVE_INFINITY};if(typeof t=="number"){const r=z(t);return{rows:r,cols:r}}if(Pe(t))return{rows:z(t.rows),cols:z(t.cols)};const e=t;return{rows:z(e.maxHorizontal),cols:z(e.maxVertical)}},Q=t=>{if(M(t))return{horizontal:1,vertical:1};const e=Q(t.a),r=Q(t.b);return t.direction==="horizontal"?{horizontal:e.horizontal+r.horizontal,vertical:Math.max(e.vertical,r.vertical)}:{horizontal:Math.max(e.horizontal,r.horizontal),vertical:e.vertical+r.vertical}},De=(t,e,r)=>{const{tree:n}=ht(t,e,r,()=>"__preview__");return n},et=(t,e,r,n)=>{if(!Number.isFinite(n.rows)&&!Number.isFinite(n.cols))return!0;const o=De(t,e,r),s=Q(o);return!(s.horizontal>n.rows||s.vertical>n.cols)},xt={splitFocused:_("panelState/splitFocused",t=>({direction:t})),focusGroupIndex:_("panelState/focusGroupIndex",t=>({index1Based:t})),focusNextGroup:_("panelState/focusNextGroup"),focusPrevGroup:_("panelState/focusPrevGroup"),setActiveTab:_("panelState/setActiveTab",(t,e)=>({groupId:t,tabId:e})),addTab:_("panelState/addTab",t=>t),addNewTab:_("panelState/addNewTab",t=>t),removeTab:_("panelState/removeTab",(t,e)=>({groupId:t,tabId:e})),contentDrop:_("panelState/contentDrop",t=>t),tabDrop:_("panelState/tabDrop",t=>t),adjustSplitRatio:_("panelState/adjustSplitRatio",t=>t)},je=(t,e,r)=>{const n=t.groups[e.fromGroupId],o=t.groups[e.targetGroupId];if(!n||!o||!n.tabs.find(f=>f.id===e.tabId))return t;if(e.zone==="center"&&e.fromGroupId===e.targetGroupId)return mt(t,e.fromGroupId,e.tabId);if(e.zone==="center"){const f=ot(t,e.fromGroupId,e.targetGroupId,e.tabId);return B(f,e.targetGroupId)}const c=e.zone==="left"||e.zone==="right"?"vertical":"horizontal";if(!et(t.tree,e.targetGroupId,c,r.splitLimits))return t;const i=r.createGroupId(),a=vt(t,e.targetGroupId,c,()=>i),u=e.zone==="left"||e.zone==="top"?e.targetGroupId:i,d=ot(a,e.fromGroupId,u,e.tabId);return B(d,u)},Ae=(t,e)=>{const r=t.groups[e.fromGroupId],n=t.groups[e.targetGroupId];if(!r||!n||!t.panels[e.tabId])return t;if(e.fromGroupId===e.targetGroupId){const h=r.tabIds.filter(y=>y!==e.tabId),w=Math.max(0,Math.min(e.targetIndex,h.length)),m=h.slice(0,w).concat([e.tabId],h.slice(w)),x=m.map(y=>t.panels[y]).filter(Boolean),I={...t.groups,[e.fromGroupId]:{...r,tabIds:m,tabs:x}};return{...t,groups:I}}const s={...t.groups},c=r.tabIds.filter(h=>h!==e.tabId),i=c.map(h=>t.panels[h]);s[e.fromGroupId]={...r,tabIds:c,tabs:i,activeTabId:r.activeTabId===e.tabId?i[0]?.id??null:r.activeTabId};const a=n.tabIds.filter(h=>h!==e.tabId),u=Math.max(0,Math.min(e.targetIndex,a.length)),d=a.slice(0,u).concat([e.tabId],a.slice(u)),f=d.map(h=>t.panels[h]).filter(Boolean);return s[e.targetGroupId]={...n,tabIds:d,tabs:f,activeTabId:e.tabId},{...t,groups:s,focusedGroupId:e.targetGroupId}},_e=ft(xt,{splitFocused:(t,e,r)=>{const n=t.focusedGroupId??t.groupOrder[0]??null;return!n||!et(t.tree,n,e.payload.direction,r.splitLimits)?t:vt(t,n,e.payload.direction,r.createGroupId)},focusGroupIndex:(t,e)=>ve(t,e.payload.index1Based),focusNextGroup:t=>Ie(t),focusPrevGroup:t=>we(t),setActiveTab:(t,e)=>mt(t,e.payload.groupId,e.payload.tabId),addTab:(t,e)=>{const{groupId:r,tab:n,index:o,makeActive:s}=e.payload;return typeof o=="number"?st(t,r,n,o,s??!0):nt(t,r,n,s??!0)},addNewTab:(t,e,r)=>{if(!r.createPanelId)throw new Error("addNewTab requires PanelSystemProvider.createPanelId");const o={id:r.createPanelId(),title:e.payload.title,render:()=>e.payload.title},{groupId:s,index:c,makeActive:i}=e.payload;return typeof c=="number"?st(t,s,o,c,i??!0):nt(t,s,o,i??!0)},removeTab:(t,e)=>me(t,e.payload.groupId,e.payload.tabId),contentDrop:(t,e,r)=>je(t,e.payload,r),tabDrop:(t,e)=>Ae(t,e.payload),adjustSplitRatio:(t,e)=>{const r=W(t.tree,e.payload.path);if(M(r))return t;const n=ge(t.tree,e.payload.path,r.ratio+e.payload.deltaRatio);return{...t,tree:n}}}),it=(t,e,r)=>{const n=_e[e.type];if(!n)return t;const o=n(t,e,r);return J(o)},yt=l.createContext(null),$=()=>{const t=l.useContext(yt);if(!t)throw new Error("usePanelSystem must be used within PanelSystemProvider");return t},ke=({initialState:t,createGroupId:e,createPanelId:r,state:n,onStateChange:o,splitLimits:s,children:c})=>{const i=l.useMemo(()=>J(t),[t]),a=l.useMemo(()=>wt(s),[s]),u=l.useRef({createGroupId:e,splitLimits:a,createPanelId:r});u.current.createGroupId=e,u.current.splitLimits=a,u.current.createPanelId=r;const[d,f]=l.useReducer((T,R)=>it(T,R,u.current),i),h=l.useMemo(()=>n?J(n):d,[n,d]),w=l.useRef(h);w.current=h;const m=n!==void 0,x=l.useCallback(T=>{if(m){const R=it(w.current,T,u.current);o?.(R);return}f(T)},[m,o,f]),I=l.useMemo(()=>Vt(xt,x),[x]),y=l.useMemo(()=>({setActiveTab:I.setActiveTab,tabDrop:I.tabDrop}),[I]),g=l.useMemo(()=>({adjustSplitRatio:I.adjustSplitRatio}),[I]),v=l.useMemo(()=>({focusGroupIndex:I.focusGroupIndex,focusNextGroup:I.focusNextGroup,focusPrevGroup:I.focusPrevGroup}),[I]),p=l.useMemo(()=>({state:h,dispatch:x,actions:I}),[h,x,I]);return b.jsx(yt.Provider,{value:p,children:b.jsx(Te,{value:y,children:b.jsx(Ge,{value:g,children:b.jsx(Re,{value:v,children:c})})})})},Me=()=>{const{actions:t}=$();return l.useMemo(()=>({splitFocused:e=>{t.splitFocused(e)},focusGroupIndex:e=>{t.focusGroupIndex(e)},focusNextGroup:()=>{t.focusNextGroup()},focusPrevGroup:()=>{t.focusPrevGroup()},closeFocusedGroup:()=>{}}),[t])},Oe=()=>{const{actions:t}=$(),e=l.useCallback(({fromGroupId:n,tabId:o,targetGroupId:s,zone:c})=>{t.contentDrop({fromGroupId:n,tabId:o,targetGroupId:s,zone:c})},[t]),r=l.useCallback(({fromGroupId:n,tabId:o,targetGroupId:s,targetIndex:c})=>{t.tabDrop({fromGroupId:n,tabId:o,targetGroupId:s,targetIndex:c})},[t]);return{onCommitContentDrop:e,onCommitTabDrop:r}},Ne=()=>{const t=At(),e=Me();return l.useEffect(()=>{Mt(t,e)},[t,e]),null},Tt=l.createContext(null),Le=()=>{const t=l.useContext(Tt);if(!t)throw new Error("useContentRegistry must be used within ContentRegistryProvider");return t},Be=t=>{const e=document.createElement("div");return e.setAttribute("data-panel-wrapper",t),e.style.display="contents",e},He=(t,e,r)=>{const[n]=l.useState(()=>Be(t));return tt.useIsomorphicLayoutEffect(()=>(n.style.display=r?"contents":"none",e&&n.parentElement!==e&&e.appendChild(n),()=>{n.parentElement?.removeChild(n)}),[n,e,r]),n},St=l.memo(({panelId:t,content:e,placement:r,containerElement:n})=>{const o=r?.isActive??!1,s=He(t,n,o);return Rt.createPortal(b.jsx(l.Activity,{mode:o?"visible":"hidden",children:e}),s)});St.displayName="PanelContentHost";const $e=({children:t,panels:e,placements:r})=>{const[n,o]=l.useState(new Map),s=l.useRef(new Map),c=l.useCallback((d,f)=>{o(h=>{const w=new Map(h);return f?w.set(d,f):w.delete(d),w})},[]),i=l.useMemo(()=>({registerContentContainer:c}),[c]),a=l.useCallback((d,f)=>{const h=s.current.get(d);if(h)return h;const w=f.render(f.id);return s.current.set(d,w),w},[]),u=Object.keys(e);return b.jsxs(Tt.Provider,{value:i,children:[t,u.map(d=>{const f=e[d];if(!f)return null;const h=r[d]??null,w=h?n.get(h.groupId)??null:null,m=a(d,f);return b.jsx(St,{panelId:d,content:m,placement:h,containerElement:w},d)})]})},ze=({children:t,emptyContentComponent:e,doubleClickToAdd:r})=>{const n=U(),{state:o,actions:s}=$(),{registerContentContainer:c}=Le(),i=l.useCallback(()=>l.createElement("div",{style:{color:"#888",fontSize:12,padding:12}},"No tabs"),[]),a=e??i,u=l.useCallback(y=>{const g=o.groups[y];if(!g)return null;const v=g.tabIds.map(p=>o.panels[p]).filter(Boolean);return{...g,tabs:v}},[o.groups,o.panels]),d=l.useCallback(y=>{const g=o.groups[y];return!g||g.tabIds.length===0?b.jsx(a,{}):null},[o.groups,a]),f=l.useCallback((y,g)=>{s.setActiveTab(y,g)},[s]),h=l.useCallback(y=>{s.addNewTab({groupId:y,title:"New Tab",makeActive:!0})},[s]),w=l.useCallback((y,g)=>{s.removeTab(y,g)},[s]),m=l.useCallback((y,g,v)=>{s.setActiveTab(g,y),n.onStartTabDrag(y,g,v)},[s,n]),x=l.useCallback((y,g)=>{const v=o.groups[y];!v||!v.activeTabId||n.onStartContentDrag(y,v.activeTabId,g)},[o.groups,n]),I=l.useMemo(()=>({getGroup:u,getGroupContent:d,onClickTab:f,onAddTab:h,onCloseTab:w,onStartTabDrag:m,onStartContentDrag:x,doubleClickToAdd:r,registerContentContainer:c}),[u,d,f,h,w,m,x,r,c]);return b.jsx(Ht,{value:I,children:t})},Xe=({children:t,emptyContentComponent:e,doubleClickToAdd:r})=>{const{state:n}=$(),o=l.useMemo(()=>{const s={};for(const[c,i]of Object.entries(n.groups))for(const a of i.tabIds)s[a]={groupId:c,isActive:a===i.activeTabId};return s},[n.groups]);return b.jsx($e,{panels:n.panels,placements:o,children:b.jsx(ze,{emptyContentComponent:e,doubleClickToAdd:r,children:t})})},X=(t,e,r,n)=>{if(M(t))return n;const o=t.direction,s=o==="vertical"?r.x+r.w*t.ratio:r.y+r.h*t.ratio;if(n.push({path:e,direction:o,parentRect:r,linePos:s}),o==="vertical"){const a=r.w*t.ratio,u=r.w-a;return X(t.a,[...e,"a"],{x:r.x,y:r.y,w:a,h:r.h},n),X(t.b,[...e,"b"],{x:r.x+a,y:r.y,w:u,h:r.h},n),n}const c=r.h*t.ratio,i=r.h-c;return X(t.a,[...e,"a"],{x:r.x,y:r.y,w:r.w,h:c},n),X(t.b,[...e,"b"],{x:r.x,y:r.y+c,w:r.w,h:i},n),n},Fe=({containerRef:t})=>{const{state:e}=$(),{adjustSplitRatio:r}=Se(),n=l.useMemo(()=>X(e.tree,[],{x:0,y:0,w:100,h:100},[]),[e.tree]),[o,s]=l.useState(null);if(tt.useIsomorphicLayoutEffect(()=>{const i=t.current;if(!i)return;const a=()=>{const w=i.getBoundingClientRect();s({left:w.left,top:w.top,width:w.width,height:w.height})};a();function u(){try{const w=window.ResizeObserver;return typeof w=="function"?w:null}catch{return null}}const d=u(),f=d?new d(()=>a()):null;f&&f.observe(i);const h=()=>a();return window.addEventListener("scroll",h,!0),()=>{window.removeEventListener("scroll",h,!0),f&&f.disconnect()}},[t,e.tree]),!o)return null;const c=(i,a)=>{const u={left:o.left+o.width*i.parentRect.x/100,top:o.top+o.height*i.parentRect.y/100,width:o.width*i.parentRect.w/100,height:o.height*i.parentRect.h/100},d=P.SPLIT_HANDLE_THICKNESS;if(i.direction==="vertical"){const m=u.left+u.width*(i.linePos-i.parentRect.x)/i.parentRect.w,x={position:"fixed",left:`calc(${Math.round(m)}px - ${d} / 2)`,top:Math.round(u.top),width:d,height:Math.round(u.height),cursor:"col-resize",pointerEvents:"auto"},I=y=>{const g=o.width*i.parentRect.w/100,v=g===0?0:y/g;r({path:i.path,deltaRatio:v})};return b.jsx("div",{style:x,children:b.jsx(G.ResizeHandle,{direction:"vertical",onResize:I})},`split-${a}`)}const f=u.top+u.height*(i.linePos-i.parentRect.y)/i.parentRect.h,h={position:"fixed",left:Math.round(u.left),top:`calc(${Math.round(f)}px - ${d} / 2)`,width:Math.round(u.width),height:d,cursor:"row-resize",pointerEvents:"auto"},w=m=>{const x=o.height*i.parentRect.h/100,I=x===0?0:m/x;r({path:i.path,deltaRatio:I})};return b.jsx("div",{style:h,children:b.jsx(G.ResizeHandle,{direction:"horizontal",onResize:w})},`split-${a}`)};return b.jsx("div",{style:{position:"fixed",inset:0,pointerEvents:"none"},children:n.map((i,a)=>c(i,a))})},Ye={position:"relative",display:"flex",width:"100%",height:"100%"},qe=({state:t,layoutMode:e,gridTracksInteractive:r,view:n,tabBarComponent:o,panelGroupComponent:s})=>{const c=a=>{if(n){const u=n;return b.jsx(u,{groupId:a})}return b.jsx(ee,{id:a,TabBarComponent:o,PanelGroupComponent:s})};if(e==="grid"){const a=Lt(t,c,!!r);return b.jsx(G.GridLayout,{config:a.config,layers:a.layers})}const i=Nt(t,c);return b.jsx(G.GridLayout,{config:i.config,layers:i.layers})},Ve=({containerRef:t,layoutMode:e,gridTracksInteractive:r,dragThresholdPx:n,view:o,style:s,className:c,tabBarComponent:i,panelGroupComponent:a,splitLimits:u,emptyContentComponent:d,doubleClickToAdd:f})=>{const{state:h}=$(),{onCommitContentDrop:w,onCommitTabDrop:m}=Oe(),x=l.useMemo(()=>({...Ye,...s}),[s]),I=l.useCallback(({targetGroupId:y,zone:g})=>{if(g==="center")return!0;const v=g==="left"||g==="right"?"vertical":"horizontal";return et(h.tree,y,v,u)},[h.tree,u]);return b.jsx($t,{children:b.jsxs(Wt,{containerRef:t,dragThresholdPx:n,onCommitContentDrop:w,onCommitTabDrop:m,isContentZoneAllowed:I,children:[b.jsx(Xe,{emptyContentComponent:d,doubleClickToAdd:f,children:b.jsx("div",{ref:t,className:c,style:x,children:b.jsx(qe,{state:h,layoutMode:e,gridTracksInteractive:r,view:o,tabBarComponent:i,panelGroupComponent:a})})}),b.jsx(Fe,{containerRef:t}),b.jsx(Ke,{})]})})},Ke=()=>{const t=U();return b.jsxs(b.Fragment,{children:[b.jsx(ae,{suggest:t.suggest}),b.jsx(fe,{})]})},Ue=({initialState:t,createGroupId:e,createPanelId:r,layoutMode:n,gridTracksInteractive:o,dragThresholdPx:s,view:c,emptyContentComponent:i,state:a,onStateChange:u,className:d,style:f,tabBarComponent:h,panelGroupComponent:w,splitLimits:m,doubleClickToAdd:x})=>{if(!t)throw new Error("PanelSystem requires initialState.");if(!e)throw new Error("PanelSystem requires explicit createGroupId function.");if(!n)throw new Error("PanelSystem requires explicit layoutMode ('absolute' | 'grid').");if(n==="grid"&&o===void 0)throw new Error("PanelSystem(layoutMode='grid') requires explicit 'gridTracksInteractive' flag.");if(s===void 0)throw new Error("PanelSystem requires explicit 'dragThresholdPx' value.");const I=l.useRef(null),y=l.useMemo(()=>wt(m),[m]);return b.jsx(ke,{initialState:t,createGroupId:e,createPanelId:r,state:a,onStateChange:u,splitLimits:m,children:b.jsxs(kt,{children:[b.jsx(Ne,{}),b.jsx(Ve,{containerRef:I,layoutMode:n,gridTracksInteractive:o,dragThresholdPx:s,view:c,style:f,className:d,tabBarComponent:h,panelGroupComponent:w,splitLimits:y,emptyContentComponent:i,doubleClickToAdd:x})]})})};exports.Drawer=G.Drawer;exports.DrawerLayers=G.DrawerLayers;exports.GridLayout=G.GridLayout;exports.ResizeHandle=G.ResizeHandle;exports.runTransition=G.runTransition;exports.useTransitionState=G.useTransitionState;exports.CSS_VAR_PREFIX=P.CSS_VAR_PREFIX;exports.HorizontalDivider=Dt;exports.PanelSystem=Ue;exports.buildInitialState=xe;exports.useLayerDragHandle=jt;
|
|
3
3
|
//# sourceMappingURL=index.cjs.map
|