react-dockable-desktop 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,25 @@
1
- "use strict";var Jt=Object.create;var nt=Object.defineProperty;var Vt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var Qt=Object.getPrototypeOf,en=Object.prototype.hasOwnProperty;var tn=(i,t)=>{for(var o in t)nt(i,o,{get:t[o],enumerable:!0})},Mt=(i,t,o,c)=>{if(t&&typeof t=="object"||typeof t=="function")for(let R of Zt(t))!en.call(i,R)&&R!==o&&nt(i,R,{get:()=>t[R],enumerable:!(c=Vt(t,R))||c.enumerable});return i};var nn=(i,t,o)=>(o=i!=null?Jt(Qt(i)):{},Mt(t||!i||!i.__esModule?nt(o,"default",{value:i,enumerable:!0}):o,i)),on=i=>Mt(nt({},"__esModule",{value:!0}),i);var vn={};tn(vn,{ConfirmationForm:()=>Te,DockableDesktopProvider:()=>Gt,FormContainerContext:()=>it,FormContainerProvider:()=>ke,LeftPanelRenderer:()=>Xt,ModalStackRenderer:()=>Yt,PanelProvider:()=>at,PanelRegistry:()=>Be,PanelRegistryClass:()=>ze,RightPanelRenderer:()=>qt,SidePanelRenderer:()=>Kt,Sidebar:()=>Ut,WindowManager:()=>$t,WindowManagerProvider:()=>st,WorkspaceClient:()=>ct,defaultPredefinedMessages:()=>Ne,formatLabel:()=>q,useFormContainer:()=>We,useFormatMessage:()=>fe,usePanelActions:()=>Ie,usePanelContext:()=>zt,usePanelId:()=>Lt,usePanelState:()=>Me,usePredefinedMessages:()=>he,useRegistry:()=>Oe,useStyleClasses:()=>xe,useWindowManagerActions:()=>De,useWindowManagerState:()=>be});module.exports=on(vn);var D=nn(require("react"),1),Pt=require("react-dom");var m=require("react");var ot=require("react"),sn={requestClose:()=>{console.warn("FormContainerContract: requestClose called but no container is present")},setDirty:()=>{},onCloseRequested:()=>()=>{},setTitle:()=>{},setIcon:()=>{},containerType:"standalone",instanceId:"standalone",onClose:()=>()=>{},onMinimize:()=>()=>{},onRestore:()=>()=>{},onResize:()=>()=>{}},it=(0,ot.createContext)(sn),ke=it.Provider,We=()=>(0,ot.useContext)(it);var ze=class{registry=new Map;register(t,o,c){this.registry.set(t,{Component:o,defaultOptions:c})}get(t){return this.registry.get(t)}getRegisteredIds(){return Array.from(this.registry.keys())}},Be=new ze;var Ne={floatWindow:{id:"dockable-desktop-floatWindow",defaultMessage:"Float Window"},minimizePanel:{id:"dockable-desktop-minimizePanel",defaultMessage:"Minimize Panel"},closeTab:{id:"dockable-desktop-closeTab",defaultMessage:"Close Tab"},restorePanel:{id:"dockable-desktop-restorePanel",defaultMessage:"Restore Panel"},maximizePanel:{id:"dockable-desktop-maximizePanel",defaultMessage:"Maximize Panel"},closePanel:{id:"dockable-desktop-closePanel",defaultMessage:"Close Panel"},dockWindow:{id:"dockable-desktop-dockWindow",defaultMessage:"Dock Window"},minimize:{id:"dockable-desktop-minimize",defaultMessage:"Minimize"},maximize:{id:"dockable-desktop-maximize",defaultMessage:"Maximize"},restoreSize:{id:"dockable-desktop-restoreSize",defaultMessage:"Restore Size"},close:{id:"dockable-desktop-close",defaultMessage:"Close"},closeEmptyGroup:{id:"dockable-desktop-closeEmptyGroup",defaultMessage:"Close empty split group"},anchorToRightEdge:{id:"dockable-desktop-anchorToRightEdge",defaultMessage:"Anchor to Right Edge"},anchorToBottomEdge:{id:"dockable-desktop-anchorToBottomEdge",defaultMessage:"Anchor to Bottom Edge"},windowAnchoringOptions:{id:"dockable-desktop-windowAnchoringOptions",defaultMessage:"Window Anchoring Options"},unsavedChangesTitle:{id:"dockable-desktop-unsavedChangesTitle",defaultMessage:"Unsaved Changes"},unsavedChangesMessage:{id:"dockable-desktop-unsavedChangesMessage",defaultMessage:'"{title}" has unsaved changes. Do you want to discard your changes and close?'},discardChanges:{id:"dockable-desktop-discardChanges",defaultMessage:"Discard Changes"},cancel:{id:"dockable-desktop-cancel",defaultMessage:"Cancel"},yes:{id:"dockable-desktop-yes",defaultMessage:"Yes"},no:{id:"dockable-desktop-no",defaultMessage:"No"},ok:{id:"dockable-desktop-ok",defaultMessage:"OK"},closePanelTooltip:{id:"dockable-desktop-closePanelTooltip",defaultMessage:"Close panel"},closeTooltip:{id:"dockable-desktop-closeTooltip",defaultMessage:"Close"}};var Se=require("react/jsx-runtime"),Rt=(0,m.createContext)(null),ft=(0,m.createContext)(null),kt=(0,m.createContext)(null),St=(0,m.createContext)(null),It=(0,m.createContext)(Ne),Tt=(0,m.createContext)({}),xe=()=>(0,m.useContext)(Tt),Et=(0,m.createContext)(Be),Oe=()=>(0,m.useContext)(Et),pt=class{listeners={};subscribe(t,o){return this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push(o),()=>{this.listeners[t]=this.listeners[t].filter(c=>c!==o)}}publish(t,o){this.listeners[t]&&this.listeners[t].forEach(c=>c(o))}},rn={type:"leaf",id:"group-default",panels:[],activePanelId:null};function an(i){if(i)try{let t=JSON.parse(i);if(t.gridRoot&&Array.isArray(t.floating)&&Array.isArray(t.minimized)&&t.panels)return{gridRoot:t.gridRoot,floating:t.floating,minimized:t.minimized,panels:t.panels,activePanelId:Object.keys(t.panels)[0]??null}}catch{}return{gridRoot:rn,floating:[],minimized:[],panels:{},activePanelId:null}}var st=({children:i,client:t,formatMessage:o,predefinedMessages:c,dir:R,modalClass:x,modalBodyClass:_,sidePanelClass:A,sidePanelBodyClass:k,windowClass:S,windowBodyClass:F})=>{let f=(0,m.useRef)(t?.registry??Be).current,z=t?.config.formatMessage??o,w=t?.config.predefinedMessages??c,I=t?.config.dir??R,[W,u]=(0,m.useState)(()=>({...an(t?.initialState??null),draggedPanelId:null,dir:I||"ltr",isRtl:I==="rtl"})),v=(0,m.useRef)(W);v.current=W;let y=(0,m.useRef)(new Set);(0,m.useLayoutEffect)(()=>{y.current.forEach(e=>e())},[W]);let h=(0,m.useCallback)(()=>v.current,[]),H=(0,m.useCallback)(e=>(y.current.add(e),()=>y.current.delete(e)),[]),G=(0,m.useRef)({}),P=(0,m.useMemo)(()=>({...Ne,...w}),[w]),T=(0,m.useRef)(new pt),B=(0,m.useRef)(1e3),N=(0,m.useCallback)((e,r)=>T.current.subscribe(e,r),[]),Y=(0,m.useCallback)((e,r)=>{T.current.publish(e,r)},[]),X=(0,m.useCallback)((e,r)=>{let n=typeof e.x=="string"?parseFloat(e.x):e.x,s=typeof e.y=="string"?parseFloat(e.y):e.y,l=typeof e.width=="string"?parseFloat(e.width):e.width,p=typeof e.height=="string"?parseFloat(e.height):e.height;isNaN(n)&&(n=300),isNaN(s)&&(s=150),isNaN(l)&&(l=450),isNaN(p)&&(p=350);let C=V=>r.some(Z=>{let me=typeof Z.x=="string"?parseFloat(Z.x):Z.x,Q=typeof Z.y=="string"?parseFloat(Z.y):Z.y;return!Z.maximized&&Math.abs(me-V.x)<20&&Math.abs(Q-V.y)<20}),E=0;for(;C({x:n,y:s})&&E<10;)n+=30,s+=30,E++;let M=Math.max(100,window.innerWidth||1024),$=Math.max(100,window.innerHeight||768);return(n+l>M||s+p>$)&&(n=100+E%5*30,s=100+E%5*30),n=Math.max(0,Math.min(n,M-100)),s=Math.max(0,Math.min(s,$-40)),{x:n,y:s,width:l,height:p}},[]),pe=(0,m.useCallback)(e=>{u(r=>{let n=r.panels[e];if(!n)return r;if(n.state==="floating"){let s=r.floating.find(p=>p.id===e);if(!s)return r;let l=!r.floating.some(p=>p.z>s.z);return l&&r.activePanelId===e?r:(l||(B.current+=1),{...r,floating:r.floating.map(p=>p.id===e?{...p,z:l?s.z:B.current}:p),activePanelId:e})}else if(n.state==="docked"){if(r.activePanelId===e)return r;let s=l=>l.type==="leaf"?l.panels.includes(e)?{...l,activePanelId:e}:l:{...l,children:l.children.map(s)};return{...r,gridRoot:s(r.gridRoot),activePanelId:e}}return r.activePanelId===e?r:{...r,activePanelId:e}})},[]),ie=(e,r)=>{if(e.type==="leaf"){let n=e.panels.indexOf(r);if(n===-1)return e;let s=e.panels.filter(C=>C!==r),l=e.activePanelId===r?s[n]||s[n-1]||s[0]||null:e.activePanelId,p={...e,panels:s,activePanelId:l};return s.length===0&&!e.keepOnEmpty?null:p}else{let n=e.children.map(p=>ie(p,r)).filter(p=>p!==null);if(n.length===0)return null;if(n.length===1)return n[0];let s=e.sizes.slice(0,n.length),l=s.reduce((p,C)=>p+C,0);return{...e,children:n,sizes:s.map(p=>p/l)}}},ue=(e,r,n)=>{if(e.type==="leaf"){if(e.id===r){let s=e.panels.includes(n)?e.panels:[...e.panels,n];return{...e,panels:s,activePanelId:n}}return e}else return{...e,children:e.children.map(s=>ue(s,r,n))}},K=e=>{if(e.type==="leaf")return e.id;for(let r of e.children){let n=K(r);if(n)return n}return null},ne=(0,m.useCallback)((e,r,n)=>{let s=!(e in v.current.panels);u(l=>{let p=l.panels[e],C=f.get(r),E=n?.title||n?.title||C?.defaultOptions?.title||e,M=n?.initialTarget||C?.defaultOptions?.initialTarget||"docked",$=C?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350};if(p)if(p.state==="minimized"){let Q=l.minimized.filter(ae=>ae.id!==e);if(M==="floating"||!l.gridRoot){B.current+=1;let ae=X($,l.floating);return{...l,minimized:Q,floating:[...l.floating,{...ae,id:e,z:B.current}],panels:{...l.panels,[e]:{...p,state:"floating"}}}}else{let ae=K(l.gridRoot)||"group-default";return{...l,minimized:Q,gridRoot:ue(l.gridRoot,ae,e),panels:{...l.panels,[e]:{...p,state:"docked"}}}}}else{if(p.state==="floating")return pe(e),l;{let Q=ae=>ae.type==="leaf"?ae.panels.includes(e)?{...ae,activePanelId:e}:ae:{...ae,children:ae.children.map(Q)};return{...l,gridRoot:Q(l.gridRoot)}}}let Z={id:e,title:E,component:r,state:M==="tabbed"?"docked":M},me={...l.panels,[e]:Z};if(M==="floating"){B.current+=1;let Q=X($,l.floating),ae=n?.stickyRight??C?.defaultOptions?.defaultStickyRight??!1,Qe=n?.stickyBottom??C?.defaultOptions?.defaultStickyBottom??!1,gt=Math.max(100,window.innerWidth||1024),et=Math.max(100,window.innerHeight||768),tt=typeof Q.width=="string"?parseFloat(Q.width):Q.width,jt=typeof Q.height=="string"?parseFloat(Q.height):Q.height,wt=Q.x,Ct=Q.y,xt=10;return ae&&(wt=gt-tt-xt),Qe&&(Ct=et-jt-xt),{...l,floating:[...l.floating,{...Q,id:e,z:B.current,x:wt,y:Ct,stickyRight:ae,stickyBottom:Qe}],panels:me}}else{let Q=K(l.gridRoot)||"group-default";return{...l,gridRoot:ue(l.gridRoot,Q,e),panels:me}}}),s&&T.current.publish("panel:opened",{id:e,component:r})},[X,pe]),ye=(0,m.useCallback)(e=>{let r=e in v.current.panels;u(n=>{let s=n.panels[e];if(!s||f.get(s.component)?.defaultOptions?.canClose===!1)return n;delete G.current[e];let p={...n.panels};delete p[e];let C=ie(n.gridRoot,e);return{...n,gridRoot:C||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:n.floating.filter(E=>E.id!==e),minimized:n.minimized.filter(E=>E.id!==e),panels:p}}),r&&T.current.publish("panel:closed",{id:e})},[]),we=(0,m.useCallback)((e,r)=>{G.current[e]=r},[]),ee=(0,m.useCallback)(e=>{delete G.current[e]},[]),Pe=(0,m.useCallback)((e,r,n)=>{u(s=>{let l=s.panels[e];return l?{...s,panels:{...s.panels,[e]:{...l,dirty:r,dirtyOptions:n}}}:s})},[]),oe=(0,m.useCallback)((e,r)=>{u(n=>{let s=n.panels[e];return s?{...n,panels:{...n.panels,[e]:{...s,title:r}}}:n})},[]),se=(0,m.useCallback)(async(e,r)=>{if(r?.force){ye(e);return}let n=G.current[e];if(n&&!await n())return;let s=v.current.panels[e];if(s?.dirty)if(r?.onConfirm){if(!await r.onConfirm(s.dirtyOptions))return}else return;ye(e)},[ye]),$e=(0,m.useCallback)(e=>{let r=v.current.panels[e]?.state!=="minimized"&&e in v.current.panels;u(n=>{let s=n.panels[e];if(!s||s.state==="minimized"||f.get(s.component)?.defaultOptions?.canMinimize===!1)return n;let p,C;if(s.state==="floating"){let M=n.floating.find($=>$.id===e);M&&(p={x:Number(M.x),y:Number(M.y),width:Number(M.width),height:Number(M.height),stickyRight:M.stickyRight,stickyBottom:M.stickyBottom})}else if(s.state==="docked"){let M=$=>{if($.type==="leaf")return $.panels.includes(e)?$.id:null;for(let V of $.children){let Z=M(V);if(Z)return Z}return null};C=M(n.gridRoot)??void 0}let E=ie(n.gridRoot,e);return{...n,gridRoot:E||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:n.floating.filter(M=>M.id!==e),minimized:[...n.minimized,{id:e,title:s.title,component:s.component}],panels:{...n.panels,[e]:{...s,state:"minimized",previousState:s.state,lastFloatingRect:p,lastLeafId:C}}}}),r&&T.current.publish("panel:minimized",{id:e})},[]),Ee=(0,m.useCallback)(e=>{let r=v.current.panels[e]?.state==="minimized";u(n=>{let s=n.panels[e];if(!s||s.state!=="minimized")return n;let l=n.minimized.filter(C=>C.id!==e);if((s.previousState||"docked")==="floating"){B.current+=1;let C=f.get(s.component),E=s.lastFloatingRect||C?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},M=X(E,n.floating);return{...n,minimized:l,floating:[...n.floating,{...M,id:e,z:B.current,stickyRight:!!s.lastFloatingRect?.stickyRight,stickyBottom:!!s.lastFloatingRect?.stickyBottom}],panels:{...n.panels,[e]:{...s,state:"floating"}}}}else{let C=(V,Z)=>V.type==="leaf"?V.id===Z:V.children.some(me=>C(me,Z)),E=s.lastLeafId&&C(n.gridRoot,s.lastLeafId),M=f.get(s.component),$=M?.defaultOptions?.canDrag!==!1;if(E)return{...n,minimized:l,gridRoot:ue(n.gridRoot,s.lastLeafId,e),panels:{...n.panels,[e]:{...s,state:"docked"}}};if($){B.current+=1;let V=s.lastFloatingRect||M?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},Z=X(V,n.floating);return{...n,minimized:l,floating:[...n.floating,{...Z,id:e,z:B.current,stickyRight:!!s.lastFloatingRect?.stickyRight,stickyBottom:!!s.lastFloatingRect?.stickyBottom}],panels:{...n.panels,[e]:{...s,state:"floating"}}}}else{let V=K(n.gridRoot)||"group-default";return{...n,minimized:l,gridRoot:ue(n.gridRoot,V,e),panels:{...n.panels,[e]:{...s,state:"docked"}}}}}}),r&&T.current.publish("panel:restored",{id:e})},[X]),Re=(0,m.useCallback)((e,r)=>{u(n=>{let s=n.panels[e];if(!s||f.get(s.component)?.defaultOptions?.canDrag===!1)return n;let p=f.get(s.component),C=r||p?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},E=ie(n.gridRoot,e);B.current+=1;let M=X(C,n.floating);return{...n,gridRoot:E||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:[...n.floating,{...M,id:e,z:B.current}],panels:{...n.panels,[e]:{...s,state:"floating"}}}})},[X]),Ge=(0,m.useCallback)((e,r)=>{u(n=>{let s=n.panels[e];if(!s)return n;let l=n.floating.filter(E=>E.id!==e),p=ie(n.gridRoot,e),C=r||K(p||n.gridRoot)||"group-default";return{...n,gridRoot:ue(p||n.gridRoot,C,e),floating:l,panels:{...n.panels,[e]:{...s,state:"docked"}}}})},[]),Ye=(e,r,n,s)=>{if(e.type==="leaf"){if(e.id===r){let l={type:"leaf",id:`group-split-${Date.now()}-${Math.floor(Math.random()*1e3)}`,panels:[n],activePanelId:n};return{type:"branch",orientation:s==="left"||s==="right"?"horizontal":"vertical",sizes:[.5,.5],children:s==="left"||s==="top"?[l,e]:[e,l]}}return e}else return{...e,children:e.children.map(l=>Ye(l,r,n,s))}},Xe=(0,m.useCallback)(e=>{u(r=>({...r,draggedPanelId:e}))},[]),qe=(0,m.useCallback)((e,r,n)=>{u(s=>{let l=s.panels[e];if(!l)return s;let p=s.floating.filter(M=>M.id!==e),C=ie(s.gridRoot,e),E;return n==="center"?E=ue(C||s.gridRoot,r,e):E=Ye(C||s.gridRoot,r,e,n),{...s,gridRoot:E,floating:p,panels:{...s.panels,[e]:{...l,state:"docked"}},draggedPanelId:null}})},[]),Ke=(0,m.useCallback)((e,r)=>{u(n=>{let s=n.panels[e];if(!s)return n;let l=n.floating.filter(V=>V.id!==e),p=ie(n.gridRoot,e),C={type:"leaf",id:`group-edge-${Date.now()}-${Math.floor(Math.random()*1e3)}`,panels:[e],activePanelId:e},E=r==="left"||r==="right"?"horizontal":"vertical",M=r==="left"||r==="top"?[C,p||n.gridRoot]:[p||n.gridRoot,C];return{...n,gridRoot:{type:"branch",orientation:E,sizes:r==="left"||r==="top"?[.3,.7]:[.7,.3],children:M},floating:l,panels:{...n.panels,[e]:{...s,state:"docked"}},draggedPanelId:null}})},[]),Le=(0,m.useCallback)((e,r,n)=>{u(s=>{let l=s.panels[e];if(!l)return s;let p=ie(s.gridRoot,e),C=$=>{if($.type==="leaf"){if($.id===r){let V=$.panels.filter(Q=>Q!==e),Z=Math.max(0,Math.min(n,V.length)),me=[...V];return me.splice(Z,0,e),{...$,panels:me,activePanelId:e}}return $}else return{...$,children:$.children.map(C)}},E=C(p||s.gridRoot),M=s.floating.filter($=>$.id!==e);return{...s,gridRoot:E,floating:M,panels:{...s.panels,[e]:{...l,state:"docked"}},draggedPanelId:null}})},[]),Ce=(0,m.useCallback)(e=>{u(r=>{let n=l=>{if(l.type==="leaf")return l.id===e&&l.canClose!==!1?null:l;{let p=l.children.map(M=>n(M)).filter(M=>M!==null);if(p.length===0)return null;if(p.length===1)return p[0];let C=l.sizes.slice(0,p.length),E=C.reduce((M,$)=>M+$,0);return{...l,children:p,sizes:C.map(M=>M/E)}}},s=n(r.gridRoot);return{...r,gridRoot:s||{type:"leaf",id:"group-default",panels:[],activePanelId:null}}})},[]),Ue=(0,m.useCallback)(e=>{u(r=>({...r,floating:r.floating.map(n=>n.id===e?{...n,maximized:!n.maximized}:n)}))},[]),je=(0,m.useCallback)((e,r)=>{let n=(s,l)=>{if(s.type==="leaf")return s;if(l===e.length)return{...s,sizes:r};let p=e[l],C=s.children.map((E,M)=>M===p?n(E,l+1):E);return{...s,children:C}};u(s=>({...s,gridRoot:n(s.gridRoot,0)}))},[]),Je=(0,m.useCallback)((e,r)=>{u(n=>({...n,floating:n.floating.map(s=>s.id===e?{...s,...r}:s)}))},[]),Ae=(0,m.useCallback)(()=>JSON.stringify({gridRoot:v.current.gridRoot,floating:v.current.floating,minimized:v.current.minimized,panels:v.current.panels}),[]),Ve=(0,m.useCallback)(e=>{try{let r=JSON.parse(e);if(r.gridRoot&&r.floating&&r.minimized&&r.panels){let n=Object.keys(r.panels)[0]||null;return u(s=>({...s,gridRoot:r.gridRoot,floating:r.floating,minimized:r.minimized,panels:r.panels,draggedPanelId:null,activePanelId:n})),!0}return!1}catch(r){return console.error("Failed to parse layout configuration:",r),!1}},[]),Ze=(0,m.useCallback)(e=>{u(r=>r.activePanelId===e?r:{...r,activePanelId:e})},[]),a=(0,m.useCallback)(e=>{u(r=>r.dir===e?r:{...r,dir:e,isRtl:e==="rtl"})},[]),b=(0,m.useCallback)(e=>e in v.current.panels,[]),g=(0,m.useCallback)(()=>Object.keys(v.current.panels),[]);(0,m.useEffect)(()=>{I&&u(e=>e.dir===I?e:{...e,dir:I,isRtl:I==="rtl"})},[I]);let L=(0,m.useMemo)(()=>({openPanel:ne,closePanel:ye,minimizePanel:$e,restorePanel:Ee,floatPanel:Re,dockPanel:Ge,maximizePanel:Ue,updateSplitSizes:je,updateFloatingPosition:Je,focusPanel:pe,isOpen:b,getOpenPanelIds:g,saveLayout:Ae,loadLayout:Ve,publish:Y,subscribe:N,setDraggedPanelId:Xe,dockPanelToGroup:qe,movePanelOrder:Le,closeLeafGroup:Ce,registerCloseGuard:we,unregisterCloseGuard:ee,setPanelDirty:Pe,updatePanelTitle:oe,requestClosePanel:se,dockPanelToWorkspaceEdge:Ke,setActivePanel:Ze,setDirection:a}),[ne,ye,$e,Ee,Re,Ge,Ue,je,Je,pe,b,g,Ae,Ve,Y,N,Xe,qe,Le,Ce,we,ee,Pe,oe,se,Ke,Ze,a]),O=e=>{let r=e.defaultMessage||e.id;return e.values&&Object.entries(e.values).forEach(([n,s])=>{r=r.replace(`{${n}}`,String(s))}),r},U=(0,m.useMemo)(()=>({modalClass:x,modalBodyClass:_,sidePanelClass:A,sidePanelBodyClass:k,windowClass:S,windowBodyClass:F}),[x,_,A,k,S,F]);(0,m.useEffect)(()=>{if(process.env.NODE_ENV!=="development")return;let e=!1;try{for(let r of Array.from(document.styleSheets))try{if(Array.from(r.cssRules||[]).some(s=>s.cssText?.includes("react-contexify"))){e=!0;break}}catch{}}catch{}e||console.warn(`[react-dockable-desktop] replace-react-contexify CSS not detected. Context menus may not render correctly.
2
- Add: import "replace-react-contexify/dist/ReactContexify.css"`)},[]),(0,m.useEffect)(()=>{if(t)return t._connect(L),()=>{t._disconnect()}},[t,L]);let j=(0,m.useMemo)(()=>({getSnapshot:h,subscribeToState:H}),[h,H]);return(0,Se.jsx)(Tt.Provider,{value:U,children:(0,Se.jsx)(Et.Provider,{value:f,children:(0,Se.jsx)(St.Provider,{value:j,children:(0,Se.jsx)(Rt.Provider,{value:W,children:(0,Se.jsx)(ft.Provider,{value:L,children:(0,Se.jsx)(kt.Provider,{value:z||O,children:(0,Se.jsx)(It.Provider,{value:P,children:i})})})})})})})},ln=i=>()=>{};function be(i){let t=(0,m.useContext)(Rt),o=(0,m.useContext)(St),c=(0,m.useRef)(i);c.current=i;let R=(0,m.useSyncExternalStore)(o?.subscribeToState??ln,()=>{let x=o?.getSnapshot()??t;return c.current?c.current(x):x},()=>{let x=o?.getSnapshot()??t;return c.current?c.current(x):x});if(!t)throw new Error("useWindowManagerState must be used within WindowManagerProvider");return i?R:t}var De=()=>{let i=(0,m.useContext)(ft);if(!i)throw new Error("useWindowManagerActions must be used within WindowManagerProvider");return i},mt=()=>{let i=(0,m.useContext)(ft);if(!i)throw new Error("useWindowManagerActionsInternal must be used within WindowManagerProvider");return i},fe=()=>(0,m.useContext)(kt)||(t=>{let o=t.defaultMessage||t.id;return t.values&&Object.entries(t.values).forEach(([c,R])=>{o=o.replace(`{${c}}`,String(R))}),o}),q=(i,t)=>i?typeof i=="string"?i:t(i):"",zt=()=>{let{publish:i,subscribe:t}=De();return{publish:i,subscribe:t}},he=()=>(0,m.useContext)(It),Lt=()=>We().instanceId;function Wt(i){if(!i)return typeof document<"u"?document.documentElement.dir?.toLowerCase()==="rtl"||document.body.dir?.toLowerCase()==="rtl":!1;let t=i.closest("[dir]");return t?t.getAttribute("dir")?.toLowerCase()==="rtl":document.documentElement.dir?.toLowerCase()==="rtl"||document.body.dir?.toLowerCase()==="rtl"}var Ft=require("replace-react-contexify"),Bn=require("replace-react-contexify/styles.css");var J=require("react"),yt=require("react/jsx-runtime"),dn=0,ht=()=>`panel-${++dn}-${Date.now()}`,rt=new Map,Nt={leftPanel:null,rightPanel:null,modals:[]},Ot=(0,J.createContext)(null),Dt=(0,J.createContext)(null),at=({children:i})=>{let[t,o]=(0,J.useState)(Nt),c=(0,J.useRef)(t);c.current=t;let R=(0,J.useCallback)((u,v)=>{rt.set(u,v)},[]),x=(0,J.useCallback)(u=>{rt.delete(u)},[]),_=(0,J.useCallback)(async(u,v,y={})=>{let h=c.current.leftPanel;if(h){let P=rt.get(h.id);if(P&&!await P())return null}let H=ht(),G={id:H,Component:u,props:v,containerType:"left-panel",options:y};return o(P=>({...P,leftPanel:G})),H},[]),A=(0,J.useCallback)(async(u,v,y={})=>{let h=c.current.rightPanel;if(h){let P=rt.get(h.id);if(P&&!await P())return null}let H=ht(),G={id:H,Component:u,props:v,containerType:"right-panel",options:y};return o(P=>({...P,rightPanel:G})),H},[]),k=(0,J.useCallback)((u,v,y={})=>{let h=ht(),H=v.title,G={...y,title:y.title||H||"Confirmation"},P={id:h,Component:u,props:v,containerType:"modal",options:G};return o(T=>({...T,modals:[...T.modals,P]})),h},[]),S=(0,J.useCallback)(u=>{o(v=>({leftPanel:v.leftPanel?.id===u?null:v.leftPanel,rightPanel:v.rightPanel?.id===u?null:v.rightPanel,modals:v.modals.filter(y=>y.id!==u)}))},[]),F=(0,J.useCallback)(()=>{o(Nt)},[]),f=(0,J.useCallback)(()=>{o(u=>({...u,modals:[]}))},[]),z=(0,J.useCallback)(u=>t.leftPanel?.id===u?t.leftPanel:t.rightPanel?.id===u?t.rightPanel:t.modals.find(v=>v.id===u),[t]),w=(0,J.useCallback)((u,v)=>{o(y=>({leftPanel:y.leftPanel?.id===u?{...y.leftPanel,...v}:y.leftPanel,rightPanel:y.rightPanel?.id===u?{...y.rightPanel,...v}:y.rightPanel,modals:y.modals.map(h=>h.id===u?{...h,...v}:h)}))},[]),I=(0,J.useCallback)((u,v,y)=>{w(u,{dirty:v,dirtyOptions:y})},[w]),W=(0,J.useMemo)(()=>({openLeftPanel:_,openRightPanel:A,openModal:k,close:S,closeAll:F,closeAllModals:f,getInstance:z,updateInstance:w,setDirty:I,registerCloseHandler:R,unregisterCloseHandler:x}),[_,A,k,S,F,f,z,w,I,R,x]);return(0,yt.jsx)(Ot.Provider,{value:t,children:(0,yt.jsx)(Dt.Provider,{value:W,children:i})})},Me=()=>{let i=(0,J.useContext)(Ot);if(!i)throw new Error("usePanelState must be used within PanelProvider");return i},Ie=()=>{let i=(0,J.useContext)(Dt);if(!i)throw new Error("usePanelActions must be used within PanelProvider");return i};var _e=require("react");var ve=require("react/jsx-runtime"),cn=({title:i,message:t,alert:o,alertType:c="info",useYesNoTitles:R=!1,onOK:x,onCancel:_})=>{let{requestClose:A,setIcon:k,setTitle:S}=We(),F=fe(),f=he(),z=(0,_e.useRef)(null);(0,_e.useEffect)(()=>{if(i){let y=typeof i=="string"?i:F(i);S(y)}k&&k((0,ve.jsx)("span",{children:"\u2753"}))},[i,S,k,F]),(0,_e.useEffect)(()=>{z.current?.focus()},[]);let w=typeof t=="string"?t:F(t),I=F(R?f.no:f.cancel),W=F(R?f.yes:f.ok),u=y=>{y.preventDefault(),x?.(),A()},v=()=>{_?.(),A()};return(0,ve.jsxs)("form",{onSubmit:u,className:"confirmation-form-body",children:[o&&(0,ve.jsxs)("div",{className:`confirmation-alert confirmation-alert-${c}`,children:[(0,ve.jsx)("span",{children:"\u2139\uFE0F"}),(0,ve.jsx)("span",{children:o})]}),(0,ve.jsx)("div",{style:{fontSize:"0.9rem",color:"inherit",lineHeight:1.5},children:w}),(0,ve.jsx)("hr",{style:{marginTop:"0.5rem",marginBottom:"0.5rem",opacity:.1}}),(0,ve.jsxs)("div",{className:"confirmation-actions",children:[(0,ve.jsx)("button",{type:"button",className:"dw-btn dw-btn-sm dw-btn-outline",onClick:v,children:I}),(0,ve.jsx)("button",{type:"submit",className:"dw-btn dw-btn-sm dw-btn-primary",ref:z,children:W})]})]})},Te=cn;var d=require("react/jsx-runtime"),He=new Map,dt="preserved-dom-container",vt=(0,d.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:[(0,d.jsx)("rect",{x:"3",y:"3",width:"7",height:"9",rx:"1"}),(0,d.jsx)("rect",{x:"14",y:"3",width:"7",height:"5",rx:"1"}),(0,d.jsx)("rect",{x:"14",y:"12",width:"7",height:"9",rx:"1"}),(0,d.jsx)("rect",{x:"3",y:"16",width:"7",height:"5",rx:"1"})]}),At=i=>{let t=He.get(i);return t||(t=document.createElement("div"),t.style.width="100%",t.style.height="100%",He.set(i,t)),t},un=(i,t,o)=>{let c=o.get(t);if(!c)return console.warn(`[react-dockable-desktop] Panel "${i}" references component key "${t}" which is not registered. Add it to the WorkspaceClient panels config:
3
- new WorkspaceClient({ panels: { "${t}": { component: YourComponent } } })`),(0,d.jsxs)("div",{className:"dw-unregistered-panel",style:{border:"2px dashed #dc3545"},children:[(0,d.jsx)("h6",{style:{fontWeight:700,marginBottom:"0.25rem"},children:"\u26A0\uFE0F Component Unregistered"}),(0,d.jsxs)("span",{style:{fontSize:"0.875rem",color:"var(--text-secondary, #94a3b8)"},children:["Key: ",t]})]});let R=c.Component;return(0,d.jsx)(R,{panelId:i})},Bt=new Map,Fe=new Map,lt=i=>{let t=Fe.get(i);return t||(t={onClose:new Set,onMinimize:new Set,onRestore:new Set,onResize:new Set},Fe.set(i,t)),t},_t=({panelId:i})=>{let t=(0,D.useRef)(null);return(0,D.useEffect)(()=>{let o=t.current;if(!o)return;let c=At(i);o.appendChild(c);let R=new ResizeObserver(x=>{for(let _ of x){let{width:A,height:k}=_.contentRect;if(A>0&&k>0){Bt.set(i,{width:A,height:k});let S=Fe.get(i);S&&S.onResize.forEach(F=>F(A,k))}}});return R.observe(o),()=>{R.disconnect();let x=document.getElementById(dt);x||(x=document.createElement("div"),x.id=dt,x.style.display="none",document.body.appendChild(x)),x.appendChild(c)}},[i]),(0,d.jsx)("div",{ref:t,style:{width:"100%",height:"100%"}})},gn=({panelId:i})=>{let t=be(),o=Oe(),c=fe(),R=(0,D.useRef)(null),x=t.panels[i],_=x?o.get(x.component):null,A=_?.defaultOptions?.disableLivePreview||!1,k=Bt.get(i)||{width:800,height:500},S=k.width,F=k.height,w=Math.min(220/S,140/F);if((0,D.useEffect)(()=>{if(A)return;let I=R.current;if(!I)return;let W=He.get(i);if(W)return I.appendChild(W),()=>{let u=document.getElementById(dt);u||(u=document.createElement("div"),u.id=dt,u.style.display="none",document.body.appendChild(u)),u.appendChild(W)}},[i,A]),A){let I=S*w,W=F*w,u=x?.title||_?.defaultOptions?.title||"Panel",v=q(u,c),y=(Array.from(v)[0]||"P").toUpperCase();return(0,d.jsx)("div",{className:"taskbar-item-preview-frame",style:{width:`${I}px`,height:`${W}px`,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(108, 117, 125, 0.15)",border:"1px dashed var(--taskbar-item-border, rgba(255, 255, 255, 0.15))"},children:(0,d.jsx)("div",{style:{fontSize:"2rem",fontWeight:600,color:"var(--panel-title-color, var(--panel-text, rgba(255, 255, 255, 0.85)))",userSelect:"none"},children:y})})}return(0,d.jsx)("div",{className:"taskbar-item-preview-frame",style:{width:`${S*w}px`,height:`${F*w}px`},children:(0,d.jsx)("div",{ref:R,className:"taskbar-item-preview-host",style:{width:`${S}px`,height:`${F}px`,transform:`scale(${w})`,transformOrigin:"top left",position:"absolute",top:0,left:0,"--preview-scale":w}})})},pn=({panelId:i,children:t})=>{let o=be(),{requestClosePanel:c,setPanelDirty:R,registerCloseGuard:x,unregisterCloseGuard:_,updatePanelTitle:A}=De(),k=o.minimized.some(f=>f.id===i),S=(0,D.useRef)(k);(0,D.useEffect)(()=>{let f=Fe.get(i);f&&(k&&!S.current?f.onMinimize.forEach(z=>z()):!k&&S.current&&f.onRestore.forEach(z=>z()),S.current=k)},[k,i]),(0,D.useEffect)(()=>()=>{let f=Fe.get(i);f&&(f.onClose.forEach(z=>z()),Fe.delete(i))},[i]);let F=D.default.useMemo(()=>({requestClose:f=>c(i,f),setDirty:f=>R(i,f),onCloseRequested:f=>(x(i,f),()=>_(i)),setTitle:f=>A(i,f),instanceId:i,onClose:f=>{let z=lt(i);return z.onClose.add(f),()=>z.onClose.delete(f)},onMinimize:f=>{let z=lt(i);return z.onMinimize.add(f),()=>z.onMinimize.delete(f)},onRestore:f=>{let z=lt(i);return z.onRestore.add(f),()=>z.onRestore.delete(f)},onResize:f=>{let z=lt(i);return z.onResize.add(f),()=>z.onResize.delete(f)}}),[i,c,R,x,_,A]);return(0,d.jsx)(ke,{value:F,children:t})},Ht=({node:i,path:t,onTabRightClick:o,activeDropZone:c,onHoverDropZone:R,onTabDragStart:x,hoveredTab:_,onTabHover:A,defaultPanelIcon:k,onRequestClosePanel:S})=>{let{updateSplitSizes:F}=De();if(i.type==="leaf")return(0,d.jsx)(fn,{leaf:i,onTabRightClick:o,activeDropZone:c,onHoverDropZone:R,onTabDragStart:x,hoveredTab:_,onTabHover:A,defaultPanelIcon:k,onRequestClosePanel:S});let f=i.orientation==="horizontal",z=(w,I)=>{I.preventDefault();let W=f?I.clientX:I.clientY,u=[...i.sizes],v=I.currentTarget;v.classList.add("active"),document.body.classList.add("resizing-active",f?"resizing-row-active":"resizing-col-active");let y=I.currentTarget.parentElement,h=y?f?y.clientWidth:y.clientHeight:f?1e3:800,H=P=>{let N=((f?P.clientX:P.clientY)-W)/h,Y=[...u];Y[w]+=N,Y[w+1]-=N,Y[w]>.1&&Y[w+1]>.1&&F(t,Y)},G=()=>{v.classList.remove("active"),document.body.classList.remove("resizing-active","resizing-row-active","resizing-col-active"),window.removeEventListener("mousemove",H),window.removeEventListener("mouseup",G)};window.addEventListener("mousemove",H),window.addEventListener("mouseup",G)};return(0,d.jsx)("div",{style:{display:"flex",flexDirection:f?"row":"column",width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:i.children.map((w,I)=>{let W=i.sizes[I]*100;return(0,d.jsxs)(D.default.Fragment,{children:[(0,d.jsx)("div",{style:{flexGrow:i.sizes[I],flexBasis:`${W}%`,overflow:"hidden",position:"relative"},children:(0,d.jsx)(Ht,{node:w,path:[...t,I],onTabRightClick:o,activeDropZone:c,onHoverDropZone:R,onTabDragStart:x,hoveredTab:_,onTabHover:A,defaultPanelIcon:k,onRequestClosePanel:S})}),I<i.children.length-1&&(0,d.jsx)("div",{onMouseDown:u=>z(I,u),style:{cursor:f?"col-resize":"row-resize",width:f?"1px":"100%",height:f?"100%":"1px",zIndex:20},className:"resizer-bar"})]},I)})})},fn=({leaf:i,onTabRightClick:t,activeDropZone:o,onHoverDropZone:c,onTabDragStart:R,hoveredTab:x,onTabHover:_,defaultPanelIcon:A,onRequestClosePanel:k})=>{let S=be(),F=Oe(),{openPanel:f,closeLeafGroup:z,setActivePanel:w}=mt(),I=fe(),W=he(),{windowClass:u,windowBodyClass:v}=xe(),y=h=>{f(h,S.panels[h].component),w(h)};return(0,d.jsxs)("div",{"data-active-panel-id":i.activePanelId||"",className:`workspace-panel ${u??""}`,style:{overflow:"hidden",position:"relative"},children:[(0,d.jsxs)("div",{className:"workspace-tab-bar",style:{minHeight:"38px"},children:[(0,d.jsx)("div",{className:"tab-headers-container",style:{scrollbarWidth:"none"},onMouseMove:h=>{S.draggedPanelId&&h.target===h.currentTarget&&_(i.id,"EMPTY",i.panels.length,"right")},onMouseLeave:h=>{S.draggedPanelId&&h.target===h.currentTarget&&_(i.id,"",-1,null)},children:i.panels.map((h,H)=>{let G=S.panels[h];if(!G)return null;let P=i.activePanelId===h,T=S.activePanelId===h,N=F.get(G.component)?.defaultOptions,Y=x&&x.leafId===i.id&&x.panelId===h,X=H===i.panels.length-1,pe=x&&x.leafId===i.id&&x.panelId==="EMPTY"&&X,ie=Y?x.side==="left"?"drag-hover-left":"drag-hover-right":pe?"drag-hover-right":"";return(0,d.jsxs)("div",{onClick:()=>y(h),onMouseDown:K=>{N?.canDrag!==!1&&R(h,K)},onContextMenu:K=>t(h,K),onMouseMove:K=>{if(S.draggedPanelId){let ne=K.currentTarget.getBoundingClientRect(),we=K.clientX-ne.left<ne.width/2?"left":"right";_(i.id,h,H,we)}},onMouseLeave:()=>{S.draggedPanelId&&_(i.id,"",-1,null)},className:`workspace-tab ${P?T?"active workspace-tab-active-focused":"active workspace-tab-active-unfocused":"workspace-tab-inactive"} ${ie}`,style:{cursor:N?.canDrag===!1?"default":"pointer"},children:[(0,d.jsxs)("span",{className:"text-truncate",style:{maxWidth:"120px",display:"flex",alignItems:"center"},children:[(0,d.jsx)("span",{className:"workspace-tab-icon",children:N?.icon||A||vt}),(0,d.jsxs)("span",{children:[q(G.title,I),G.dirty?" *":""]})]}),N?.renderHeaderActions&&(0,d.jsx)("span",{className:"tab-header-actions",onClick:K=>K.stopPropagation(),onMouseDown:K=>K.stopPropagation(),children:N.renderHeaderActions(h)}),N?.canClose!==!1&&(0,d.jsx)("span",{onClick:K=>{K.stopPropagation(),k(h)},title:q(W.closeTab,I),className:"close-tab-x",style:{width:"18px",height:"18px",...N?.renderHeaderActions?{}:{marginInlineStart:"auto"}},children:(0,d.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,d.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]},h)})}),i.panels.length===0&&i.keepOnEmpty&&i.canClose!==!1&&(0,d.jsx)("span",{onClick:()=>z(i.id),className:"close-tab-x header-close-empty-group",style:{width:"18px",height:"18px",cursor:"pointer"},title:q(W.closeEmptyGroup,I),children:(0,d.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,d.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),(0,d.jsxs)("div",{className:`dw-panel-body ${v??""}`,style:{position:"relative",overflow:"hidden"},children:[i.activePanelId&&S.panels[i.activePanelId]?(0,d.jsx)(_t,{panelId:i.activePanelId},i.activePanelId):(0,d.jsx)("div",{className:"empty-leaf-placeholder",children:(0,d.jsx)("span",{children:"Empty Workspace Section"})}),S.draggedPanelId!==null&&(0,d.jsx)("div",{className:"dock-drop-zone-overlay",children:(0,d.jsxs)("div",{className:"dock-target-cross",children:[(0,d.jsx)("div",{onMouseEnter:()=>c(i.id,"top"),onMouseLeave:()=>c(i.id,null),className:"dock-target-box dock-target-top",children:"\u25B2"}),(0,d.jsx)("div",{onMouseEnter:()=>c(i.id,"bottom"),onMouseLeave:()=>c(i.id,null),className:"dock-target-box dock-target-bottom",children:"\u25BC"}),(0,d.jsx)("div",{onMouseEnter:()=>c(i.id,"left"),onMouseLeave:()=>c(i.id,null),className:"dock-target-box dock-target-left",children:"\u25C0"}),(0,d.jsx)("div",{onMouseEnter:()=>c(i.id,"right"),onMouseLeave:()=>c(i.id,null),className:"dock-target-box dock-target-right",children:"\u25B6"}),(0,d.jsx)("div",{onMouseEnter:()=>c(i.id,"center"),onMouseLeave:()=>c(i.id,null),className:"dock-target-box dock-target-center",children:"\u25A3"})]})}),S.draggedPanelId!==null&&o!==null&&o.leafId===i.id&&(0,d.jsx)("div",{className:"dock-preview-highlight",style:{left:o.position==="right"?"50%":"0",top:o.position==="bottom"?"50%":"0",width:o.position==="left"||o.position==="right"?"50%":"100%",height:o.position==="top"||o.position==="bottom"?"50%":"100%"}})]})]})},mn=({skin:i="vscode",defaultPanelIcon:t})=>{let o=be(),c=Oe(),{restorePanel:R,minimizePanel:x,requestClosePanel:_,maximizePanel:A,updateFloatingPosition:k,focusPanel:S,floatPanel:F,setDraggedPanelId:f,dockPanelToGroup:z,movePanelOrder:w,dockPanelToWorkspaceEdge:I,setActivePanel:W,setDirection:u}=mt(),{openModal:v}=Ie(),y=fe(),h=he(),H=D.default.useCallback(a=>{let b=o.panels[a];_(a,{onConfirm:g=>new Promise(L=>{let O=g||b?.dirtyOptions,U=b?q(b.title,y):"Panel";v(Te,{title:O?.title||h.unsavedChangesTitle,message:O?.message||{id:h.unsavedChangesMessage.id,defaultMessage:h.unsavedChangesMessage.defaultMessage,values:{title:U}},alert:O?.alert,alertType:O?.alertType||"danger",useYesNoTitles:!0,onOK:()=>L(!0),onCancel:()=>L(!1)},{size:"small"})})})},[_,o.panels,y,v,h]),{windowClass:G,windowBodyClass:P}=xe(),T=(0,D.useRef)(null),B=(0,D.useRef)(null),[N,Y]=(0,D.useState)(null),X=(0,D.useRef)(null),[pe,ie]=(0,D.useState)(!1);(0,D.useEffect)(()=>()=>{X.current&&clearTimeout(X.current)},[]),(0,D.useEffect)(()=>{N&&(o.minimized.some(b=>b.id===N.id)||Y(null))},[o.minimized,N]);let[ue,K]=(0,D.useState)(null),ne=(0,D.useRef)(null),[ye,we]=(0,D.useState)({x:0,y:0}),[ee,Pe]=(0,D.useState)(null),oe=(0,D.useRef)(null),se=a=>{Pe(a),oe.current=a},[$e,Ee]=(0,D.useState)(null),Re=(0,D.useRef)(null),Ge=(a,b,g,L)=>{let O=L?{leafId:a,panelId:b,index:g,side:L}:null;Ee(O),Re.current=O},Ye=(a,b)=>{let g=b?{leafId:a,position:b}:null;K(g),ne.current=g},Xe=(a,b)=>{if(b.button!==0)return;let g=b.clientX,L=b.clientY,O=!1,U=r=>{let n=r.clientX-g,s=r.clientY-L;!O&&(Math.abs(n)>5||Math.abs(s)>5)&&(O=!0,f(a)),O&&we({x:r.clientX,y:r.clientY})},j=r=>{if(window.removeEventListener("mousemove",U),window.removeEventListener("mouseup",e),O){let n=ne.current,s=Re.current,l=oe.current;if(l)I(a,l);else if(s){let p=s.index;s.side==="right"&&(p+=1),w(a,s.leafId,p)}else n?z(a,n.leafId,n.position):F(a,{x:r.clientX-150,y:r.clientY-15,width:450,height:350});f(null),K(null),ne.current=null,Ee(null),Re.current=null,se(null)}},e=r=>{j(r)};window.addEventListener("mousemove",U),window.addEventListener("mouseup",e)},qe=(a,b)=>{b.preventDefault();let g=o.panels[a];if(!g)return;let O=c.get(g.component)?.defaultOptions,U=[];O?.canDrag!==!1&&U.push({label:q(h.floatWindow,y),action:()=>F(a)}),O?.canMinimize!==!1&&U.push({label:q(h.minimizePanel,y),action:()=>x(a)}),U.length>0&&O?.canClose!==!1&&U.push({separator:!0}),O?.canClose!==!1&&U.push({label:q(h.closeTab,y),action:()=>H(a)}),U.length!==0&&B.current?.show({event:b,contextMenu:{items:U}})},Ke=(a,b)=>{b.preventDefault(),Y(null),B.current?.show({event:b,contextMenu:{items:[{label:q(h.restorePanel,y),action:()=>R(a)},{label:q(h.maximizePanel,y),action:()=>A(a)},{separator:!0},{label:q(h.closePanel,y),action:()=>H(a)}]}})};(0,D.useEffect)(()=>{let a=Object.keys(o.panels);for(let b of Array.from(He.keys()))a.includes(b)||He.delete(b)},[o.panels]),(0,D.useEffect)(()=>{let a=()=>{o.draggedPanelId!==null&&(f(null),K(null),Ee(null))};return window.addEventListener("blur",a),()=>{window.removeEventListener("blur",a)}},[o.draggedPanelId]);let Le=(0,D.useRef)(null),[Ce,Ue]=(0,D.useState)({width:1024,height:768});(0,D.useEffect)(()=>{let a=Le.current;if(!a)return;let b=new ResizeObserver(g=>{if(!g||g.length===0)return;let L=g[0].contentRect;process.env.NODE_ENV==="development"&&L.height<10&&console.warn("[react-dockable-desktop] Workspace height is near zero. Add: html, body, #root { height: 100%; overflow: hidden; }"),Ue({width:Math.max(100,L.width),height:Math.max(100,L.height)})});return b.observe(a),()=>{b.disconnect()}},[]),(0,D.useEffect)(()=>{let a=Le.current;if(!a)return;let b=()=>{let O=Wt(a);u(O?"rtl":"ltr")};b();let g=new MutationObserver(b);g.observe(document.documentElement,{attributes:!0,attributeFilter:["dir"]}),g.observe(document.body,{attributes:!0,attributeFilter:["dir"]});let L=a.closest("[dir]");return L&&L!==document.documentElement&&L!==document.body&&g.observe(L,{attributes:!0,attributeFilter:["dir"]}),()=>{g.disconnect()}},[u]),(0,D.useEffect)(()=>{let a=Ce.width,b=Ce.height;o.floating.forEach(g=>{let L=typeof g.width=="string"?parseFloat(g.width):g.width,O=typeof g.height=="string"?parseFloat(g.height):g.height,U=typeof g.x=="string"?parseFloat(g.x):g.x,j=typeof g.y=="string"?parseFloat(g.y):g.y,e=L,r=O,n=U,s=j,l=!1;e>a&&(e=Math.max(200,a-20),l=!0),r>b&&(r=Math.max(150,b-40),l=!0);let p=10;if(g.stickyRight)n=a-e-p,l=!0;else{let C=a-100;n>C&&(n=Math.max(0,C),l=!0)}if(g.stickyBottom)s=b-r-p,l=!0;else{let C=b-40;s>C&&(s=Math.max(0,C),l=!0)}l&&k(g.id,{x:n,y:s,width:e,height:r})})},[Ce,o.floating,k]),(0,D.useEffect)(()=>{let a=b=>{if(b.button!==0)return;let g=b.target;if(!g)return;let L=g.closest(".floating-window");if(L){let U=L.getAttribute("data-window-id");U&&(W(U),S(U));return}let O=g.closest(".workspace-panel");if(O){let U=O.getAttribute("data-active-panel-id");U&&W(U)}};return document.addEventListener("mousedown",a),()=>{document.removeEventListener("mousedown",a)}},[S,W]);let je=(a,b)=>{let g=o.floating.find(p=>p.id===a);if(!g||g.maximized)return;S(a);let L=b.clientX,O=b.clientY,j=b.currentTarget.closest(".floating-window"),e=j?j.offsetLeft:0,r=j?j.offsetTop:0,n=!1,s=p=>{let C=p.clientX-L,E=p.clientY-O;if(!n&&(Math.abs(C)>5||Math.abs(E)>5)&&(n=!0,f(a)),n){let M=e+C,$=r+E;k(a,{x:M,y:$,stickyRight:!1,stickyBottom:!1})}},l=()=>{if(n){let p=ne.current,C=Re.current,E=oe.current;if(E)I(a,E);else if(C){let M=C.index;C.side==="right"&&(M+=1),w(a,C.leafId,M)}else p&&z(a,p.leafId,p.position);f(null),K(null),ne.current=null,Ee(null),Re.current=null,se(null)}window.removeEventListener("mousemove",s),window.removeEventListener("mouseup",l)};window.addEventListener("mousemove",s),window.addEventListener("mouseup",l)},Je=(a,b)=>{b.stopPropagation();let g=o.floating.find(l=>l.id===a);if(!g||g.maximized)return;S(a);let L=b.clientX,O=b.clientY,j=b.currentTarget.closest(".floating-window"),e=j?j.offsetWidth:400,r=j?j.offsetHeight:300,n=l=>{let p=l.clientX-L,C=l.clientY-O,E=Math.max(200,e+p),M=Math.max(150,r+C),$=g.x,V=g.y,Z=Ce.width,me=Ce.height,Q=typeof g.x=="string"?parseFloat(g.x):g.x,ae=typeof g.y=="string"?parseFloat(g.y):g.y,Qe=typeof g.width=="string"?parseFloat(g.width):g.width,gt=typeof g.height=="string"?parseFloat(g.height):g.height,et=Math.abs(Q+Qe-Z)<4,tt=Math.abs(ae+gt-me)<4;et&&($=Z-E,$<0&&($=0,E=Z)),tt&&(V=me-M,V<0&&(V=0,M=me)),k(a,{x:$,y:V,width:E,height:M,stickyRight:et,stickyBottom:tt})},s=()=>{window.removeEventListener("mousemove",n),window.removeEventListener("mouseup",s)};window.addEventListener("mousemove",n),window.addEventListener("mouseup",s)},Ae=a=>{if(T.current){let b=a==="left"?-150:150;T.current.scrollBy({left:b,behavior:"smooth"})}},[Ve,Ze]=(0,D.useState)("dark");return(0,D.useEffect)(()=>{let a=()=>{let g=document.documentElement.getAttribute("data-color-scheme")==="light"?"light":"dark";Ze(g)};a();let b=new MutationObserver(a);return b.observe(document.documentElement,{attributes:!0,attributeFilter:["data-color-scheme"]}),()=>b.disconnect()},[]),(0,d.jsxs)("div",{"data-workspace-skin":i,"data-color-scheme":Ve,style:{display:"flex",flexDirection:"column",width:"100%",height:"100%",overflow:"hidden",userSelect:"none"},dir:o.dir,children:[(0,d.jsxs)("div",{ref:Le,className:o.draggedPanelId?"dragging-active":void 0,style:{flexGrow:1,width:"100%",position:"relative",overflow:"hidden"},children:[o.draggedPanelId!==null&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("div",{className:"workspace-edge-trigger edge-trigger-left",onMouseEnter:()=>se("left"),onMouseLeave:()=>se(null)}),(0,d.jsx)("div",{className:"workspace-edge-trigger edge-trigger-right",onMouseEnter:()=>se("right"),onMouseLeave:()=>se(null)}),(0,d.jsx)("div",{className:"workspace-edge-trigger edge-trigger-top",onMouseEnter:()=>se("top"),onMouseLeave:()=>se(null)}),(0,d.jsx)("div",{className:"workspace-edge-trigger edge-trigger-bottom",onMouseEnter:()=>se("bottom"),onMouseLeave:()=>se(null)})]}),o.draggedPanelId!==null&&ee!==null&&(0,d.jsx)("div",{className:`workspace-edge-preview edge-preview-${ee}`}),(0,d.jsx)("div",{style:{width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:o.gridRoot?(0,d.jsx)(Ht,{node:o.gridRoot,path:[],onTabRightClick:qe,activeDropZone:ue,onHoverDropZone:Ye,onTabDragStart:Xe,hoveredTab:$e,onTabHover:Ge,defaultPanelIcon:t,onRequestClosePanel:H}):(0,d.jsx)("div",{className:"empty-workspace-grid",children:"Grid Empty"})}),o.floating.map(a=>{let b=o.panels[a.id];if(!b)return null;let g=a.maximized,L=o.draggedPanelId===a.id,O=o.activePanelId===a.id,j=c.get(b.component)?.defaultOptions;return(0,d.jsxs)("div",{"data-window-id":a.id,dir:o.dir,onMouseDownCapture:()=>{W(a.id),S(a.id)},className:`floating-window ${g?"maximized":""} ${O?"v2-window-focused":""} ${G??""}`,style:{position:"absolute",left:g?0:typeof a.x=="number"?`${a.x}px`:a.x,top:g?0:typeof a.y=="number"?`${a.y}px`:a.y,width:g?"100%":typeof a.width=="number"?`${a.width}px`:a.width,height:g?"100%":typeof a.height=="number"?`${a.height}px`:a.height,zIndex:a.z,pointerEvents:L?"none":"auto"},children:[(0,d.jsxs)("div",{onDoubleClick:()=>A(a.id),onMouseDown:e=>{j?.canDrag!==!1&&je(a.id,e)},className:"floating-window-titlebar cursor-move",style:{cursor:g||j?.canDrag===!1?"default":"move"},children:[(0,d.jsxs)("span",{className:"floating-window-title",children:[(0,d.jsx)("span",{className:"window-title-icon",children:j?.icon||t||vt}),(0,d.jsxs)("span",{children:[q(b.title,y),b.dirty?" *":""]})]}),(0,d.jsxs)("div",{className:"fw-titlebar-actions",style:{gap:"var(--header-button-gap, 4px)"},onMouseDown:e=>e.stopPropagation(),children:[j?.renderHeaderActions&&(0,d.jsx)("div",{className:"window-header-actions",children:j.renderHeaderActions(a.id)}),j?.canDrag!==!1&&(0,d.jsx)("button",{type:"button",title:q(h.windowAnchoringOptions,y),onClick:e=>{let r=!!a.stickyRight,n=!!a.stickyBottom;B.current?.show({event:e,contextMenu:{items:[{label:q(h.anchorToRightEdge,y),checkbox:{active:!0,enabled:!0,value:r},action:()=>{let s=Ce.width,l=typeof a.width=="string"?parseFloat(a.width):a.width;r?k(a.id,{stickyRight:!1}):k(a.id,{x:s-l-10,stickyRight:!0})}},{label:q(h.anchorToBottomEdge,y),checkbox:{active:!0,enabled:!0,value:n},action:()=>{let s=Ce.height,l=typeof a.height=="string"?parseFloat(a.height):a.height;n?k(a.id,{stickyBottom:!1}):k(a.id,{y:s-l-10,stickyBottom:!0})}}]}})},className:"custom-tab-btn btn-anchor-tab",children:(0,d.jsxs)("svg",{className:`anchor-icon ${a.stickyRight&&a.stickyBottom?"anchor-sticky-both":a.stickyRight?"anchor-sticky-right":a.stickyBottom?"anchor-sticky-bottom":""}`,width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[(0,d.jsx)("circle",{cx:"12",cy:"5",r:"2"}),(0,d.jsx)("path",{d:"M12 7v7m0 0a4 4 0 0 1-4-4M12 14a4 4 0 0 0 4-4M5 18h14"})]})}),(0,d.jsx)("button",{type:"button",title:g?q(h.restoreSize,y):q(h.maximize,y),onClick:()=>A(a.id),className:"custom-tab-btn btn-maximize-tab",children:(0,d.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,d.jsx)("rect",{x:"4",y:"4",width:"16",height:"16",rx:"1.5"})})}),j?.canMinimize!==!1&&(0,d.jsx)("button",{type:"button",title:q(h.minimize,y),onClick:()=>x(a.id),className:"custom-tab-btn btn-minimize-tab",children:(0,d.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3",children:(0,d.jsx)("path",{d:"M5 12h14"})})}),j?.canClose!==!1&&(0,d.jsx)("button",{type:"button",title:q(h.close,y),onClick:()=>H(a.id),className:"custom-tab-btn btn-close-tab",children:(0,d.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3",children:(0,d.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]})]}),(0,d.jsx)("div",{className:P??void 0,style:{flexGrow:1,width:"100%",overflow:"hidden",position:"relative",isolation:"isolate"},children:(0,d.jsx)(_t,{panelId:a.id},a.id)}),!g&&(0,d.jsx)("div",{onMouseDown:e=>Je(a.id,e),style:{position:"absolute",right:0,bottom:0,width:"14px",height:"14px",cursor:"se-resize",zIndex:30,background:"linear-gradient(135deg, transparent 50%, rgba(255,255,255,0.2) 50%)"}})]},a.id)})]}),o.minimized.length>0&&(0,d.jsxs)("div",{className:"taskbar-footer-container",style:{height:"48px",zIndex:100},children:[(0,d.jsx)("button",{type:"button",onClick:()=>Ae("left"),className:"taskbar-nav-btn",style:{display:o.minimized.length>4?"block":"none"},children:"\u25C0"}),(0,d.jsx)("div",{ref:T,className:"taskbar-items-container",style:{scrollSnapType:"x mandatory"},children:o.minimized.map(a=>{let g=c.get(a.component)?.defaultOptions?.icon||t||vt;return(0,d.jsx)("div",{onClick:()=>{Y(null),R(a.id)},onContextMenu:L=>Ke(a.id,L),onMouseEnter:L=>{if(pe)return;X.current&&clearTimeout(X.current);let O=L.currentTarget.getBoundingClientRect();L.clientX>=O.left&&L.clientX<=O.right&&L.clientY>=O.top&&L.clientY<=O.bottom&&Y({id:a.id,rect:O,title:a.title,component:a.component})},onMouseLeave:()=>{X.current=setTimeout(()=>{Y(null)},150)},className:"taskbar-glassmorphic-item",style:{backdropFilter:"blur(6px)",transition:"all 0.2s",cursor:"pointer",scrollSnapAlign:"start",width:"38px",height:"38px",position:"relative",padding:0},children:(0,d.jsx)("span",{className:"taskbar-item-icon",children:g})},a.id)})}),N&&(0,Pt.createPortal)((0,d.jsxs)("div",{className:"taskbar-item-tooltip",dir:o.dir,style:{position:"fixed",left:`${N.rect.left+N.rect.width/2}px`,top:`${N.rect.top-8}px`,transform:"translateX(-50%) translateY(-100%)",opacity:1,pointerEvents:"auto",zIndex:999999},onMouseEnter:()=>{X.current&&clearTimeout(X.current)},onMouseLeave:()=>{Y(null)},onClick:()=>{R(N.id),Y(null)},children:[(0,d.jsxs)("div",{className:"tooltip-header-row",children:[(0,d.jsxs)("span",{className:"tooltip-title-text text-truncate",style:{maxWidth:"140px"},children:[q(N.title,y),o.panels[N.id]?.dirty?" *":""]}),(0,d.jsx)("span",{onClick:a=>{a.stopPropagation(),H(N.id),Y(null)},title:q(h.closePanel,y),className:"tooltip-close-x",children:(0,d.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,d.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),(0,d.jsx)(gn,{panelId:N.id})]}),document.body),(0,d.jsx)("button",{type:"button",onClick:()=>Ae("right"),className:"taskbar-nav-btn",style:{display:o.minimized.length>4?"block":"none"},children:"\u25B6"})]}),Object.keys(o.panels).map(a=>{let b=o.panels[a];if(!b)return null;let g=At(a);return(0,Pt.createPortal)((0,d.jsx)(pn,{panelId:a,children:(0,d.jsx)("div",{style:{width:"100%",height:"100%"},children:un(a,b.component,c)})}),g,a)}),(0,d.jsx)(Ft.JsonContextMenu,{ref:B,id:"workspace-context-menu",theme:"dark",onShow:()=>ie(!0),onHide:()=>ie(!1)}),o.draggedPanelId!==null&&!o.floating.some(a=>a.id===o.draggedPanelId)&&(0,d.jsxs)("div",{className:"drag-ghost-tab",style:{left:ye.x+12,top:ye.y+12,zIndex:1e5},children:["\u{1F4C4} ",q(o.panels[o.draggedPanelId]?.title,y)||"Tab"]})]})},$t=mn;var ct=class{registry;initialState;config;_actions=null;_initialized=!1;_pendingCalls=[];_pendingOpenPanelIds=new Set;_pendingSubscriptions=[];_disconnectedWarnTimer=null;constructor(t={}){if(this.registry=new ze,this.initialState=t.initialState??null,this.config={formatMessage:t.formatMessage,predefinedMessages:t.predefinedMessages,dir:t.dir},t.panels)for(let[o,c]of Object.entries(t.panels))this.registry.register(o,c.component,c.defaultOptions)}_connect(t){this._actions=t,this._disconnectedWarnTimer!==null&&(clearTimeout(this._disconnectedWarnTimer),this._disconnectedWarnTimer=null),this._initialized||(this._initialized=!0);for(let c of this._pendingSubscriptions)c.unsub=t.subscribe(c.event,c.callback);let o=this._pendingCalls.splice(0);for(let c of o)c(t)}_disconnect(){this._actions=null;for(let t of this._pendingSubscriptions)t.unsub?.(),t.unsub=null}get isConnected(){return this._actions!==null}_startWarnTimer(){this._disconnectedWarnTimer===null&&(this._disconnectedWarnTimer=setTimeout(()=>{!this.isConnected&&this._pendingCalls.length>0&&console.error("[react-dockable-desktop] WorkspaceClient has "+this._pendingCalls.length+" queued call(s) but was never connected to a WindowManagerProvider. Did you forget client={workspace} on <WindowManagerProvider>?")},process.env.NODE_ENV==="production"?5e3:1e3))}_dispatch(t){this._actions?t(this._actions):(this._pendingCalls.push(t),this._startWarnTimer())}_subscribeRaw(t,o){if(this._actions)return this._actions.subscribe(t,o);let c={event:t,callback:o,unsub:null};return this._pendingSubscriptions.push(c),()=>{c.unsub?.(),c.unsub=null;let R=this._pendingSubscriptions.indexOf(c);R!==-1&&this._pendingSubscriptions.splice(R,1)}}openPanel(...t){if(this._actions){this._actions.openPanel(...t);return}let o=t[0];this._pendingOpenPanelIds.has(o)||(this._pendingOpenPanelIds.add(o),this._pendingCalls.push(c=>{this._pendingOpenPanelIds.delete(o),c.openPanel(...t)}),this._startWarnTimer())}closePanel(t){this._dispatch(o=>o.closePanel(t))}minimizePanel(t){this._dispatch(o=>o.minimizePanel(t))}restorePanel(t){this._dispatch(o=>o.restorePanel(t))}floatPanel(...t){this._dispatch(o=>o.floatPanel(...t))}dockPanel(...t){this._dispatch(o=>o.dockPanel(...t))}maximizePanel(t){this._dispatch(o=>o.maximizePanel(t))}focusPanel(t){this._dispatch(o=>o.focusPanel(t))}isOpen(t){return this._actions?.isOpen(t)??!1}getOpenPanelIds(){return this._actions?.getOpenPanelIds()??[]}saveLayout(){return this._actions?.saveLayout()??""}loadLayout(t){return this._actions?this._actions.loadLayout(t):(this._pendingCalls.push(o=>{o.loadLayout(t)}),!1)}setDirection(t){this._dispatch(o=>o.setDirection(t))}publish(t,o){this._dispatch(c=>c.publish(t,o))}subscribe(t,o){return this._subscribeRaw(t,o)}onPanelOpen(t){return this._subscribeRaw("panel:opened",o=>{let c=o;t(c.id,c.component)})}onPanelClose(t){return this._subscribeRaw("panel:closed",o=>{t(o.id)})}onPanelMinimize(t){return this._subscribeRaw("panel:minimized",o=>{t(o.id)})}onPanelRestore(t){return this._subscribeRaw("panel:restored",o=>{t(o.id)})}};var qn=require("react");var bt=require("react/jsx-runtime"),Gt=i=>(0,bt.jsx)(st,{...i,children:(0,bt.jsx)(at,{children:i.children})});var ge=require("react");var re=require("react/jsx-runtime"),hn=({modal:i,index:t,isTopmost:o})=>{let{close:c,openModal:R,updateInstance:x,setDirty:_}=Ie(),A=fe(),k=he(),{dir:S}=be(),{modalClass:F,modalBodyClass:f}=xe(),z=(0,ge.useRef)(null),{id:w,Component:I,props:W,options:u,dirty:v,dirtyOptions:y}=i,h=u,[H,G]=(0,ge.useState)(h.icon||null),P=(0,ge.useRef)(h);P.current=h;let T=q(h.title,A),B=(0,ge.useCallback)(async ee=>{if(ee?.force){c(w);return}if(z.current){if(!await z.current())return;c(w);return}if(v){R(Te,{title:y?.title||k.unsavedChangesTitle,message:y?.message||{id:k.unsavedChangesMessage.id,defaultMessage:k.unsavedChangesMessage.defaultMessage,values:{title:T}},alert:y?.alert,alertType:y?.alertType||"danger",useYesNoTitles:!0,onOK:()=>c(w)},{size:"small"});return}c(w)},[c,R,w,v,y,T,k]),N=(0,ge.useCallback)((ee,Pe)=>_(w,ee,Pe),[_,w]),Y=(0,ge.useCallback)(ee=>x(w,{options:{...P.current,title:ee}}),[x,w]),X=(0,ge.useCallback)(ee=>G(ee),[]),pe=(0,ge.useCallback)(ee=>(z.current=ee,()=>{z.current=null}),[]),ie=(0,ge.useMemo)(()=>({requestClose:B,setDirty:N,setTitle:Y,setIcon:X,onCloseRequested:pe,containerType:"modal",instanceId:w}),[B,N,Y,X,pe,w]),ue=v?`${T} *`:T,K=h.size?`v2-modal-size-${h.size}`:"v2-modal-size-auto",ne=h.closable!==!1;(0,ge.useEffect)(()=>{if(!o||!ne)return;let ee=Pe=>{Pe.key==="Escape"&&(Pe.stopPropagation(),B())};return document.addEventListener("keydown",ee),()=>document.removeEventListener("keydown",ee)},[B,ne,o]);let we=1e4+t*10;return(0,re.jsxs)("div",{className:"v2-modal-overlay",style:{zIndex:we},dir:S,children:[(0,re.jsx)("div",{className:"v2-modal-curtain",onClick:ne?()=>B():void 0}),(0,re.jsxs)("div",{className:`v2-modal-window ${K} ${F??""}`,children:[(0,re.jsxs)("div",{className:"v2-modal-header",children:[H&&(0,re.jsx)("div",{className:"v2-modal-icon",children:H}),(0,re.jsx)("h4",{className:"v2-modal-title",children:ue}),ne&&(0,re.jsx)("button",{className:"v2-modal-close-button",onClick:()=>B(),title:A(k.closeTooltip),type:"button",children:(0,re.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,re.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),(0,re.jsx)("div",{className:`v2-modal-body ${f??""}`,children:(0,re.jsx)(ke,{value:ie,children:(0,re.jsx)(I,{...W,panelId:w})})})]})]})},yn=()=>{let{modals:i}=Me();return i.length===0?null:(0,re.jsx)(re.Fragment,{children:i.map((t,o)=>(0,re.jsx)(hn,{modal:t,index:o,isTopmost:o===i.length-1},t.id))})},Yt=yn;var le=require("react");var te=require("react/jsx-runtime"),ut=({panel:i,position:t,defaultWidth:o})=>{let{close:c,openModal:R,updateInstance:x,setDirty:_,registerCloseHandler:A,unregisterCloseHandler:k}=Ie(),{modals:S}=Me(),F=fe(),f=he(),{dir:z}=be(),{sidePanelClass:w,sidePanelBodyClass:I}=xe(),W=(0,le.useRef)(null),{id:u,Component:v,props:y,options:h,dirty:H,dirtyOptions:G}=i,P=h,[T,B]=(0,le.useState)(P.icon||null),N=(0,le.useRef)(P);N.current=P;let Y=q(P.title,F),X=(0,le.useCallback)(async oe=>{if(oe?.force){c(u);return}if(W.current){if(!await W.current())return;c(u);return}if(H){R(Te,{title:G?.title||f.unsavedChangesTitle,message:G?.message||{id:f.unsavedChangesMessage.id,defaultMessage:f.unsavedChangesMessage.defaultMessage,values:{title:Y}},alert:G?.alert,alertType:G?.alertType||"danger",useYesNoTitles:!0,onOK:()=>c(u)},{size:"small"});return}c(u)},[c,R,u,H,G,Y,f]),pe=(0,le.useCallback)(async()=>W.current?await W.current():!H,[H]);(0,le.useEffect)(()=>(A(u,pe),()=>k(u)),[u,pe,A,k]);let ie=(0,le.useCallback)((oe,se)=>_(u,oe,se),[_,u]),ue=(0,le.useCallback)(oe=>x(u,{options:{...N.current,title:oe}}),[x,u]),K=(0,le.useCallback)(oe=>B(oe),[]),ne=(0,le.useCallback)(oe=>(W.current=oe,()=>{W.current=null}),[]),ye=(0,le.useMemo)(()=>({requestClose:X,setDirty:ie,setTitle:ue,setIcon:K,onCloseRequested:ne,containerType:t==="left"?"left-panel":"right-panel",instanceId:u}),[X,ie,ue,K,ne,t,u]),we=H?`${Y} *`:Y;(0,le.useEffect)(()=>{let oe=se=>{se.key==="Escape"&&S.length===0&&X()};return document.addEventListener("keydown",oe),()=>document.removeEventListener("keydown",oe)},[X,S.length]);let ee=P.width||o||400,Pe=typeof ee=="number"?`${ee}px`:ee;return(0,te.jsx)("div",{className:`v2-side-panel v2-side-panel-${t} v2-side-panel-visible ${w??""}`,style:{width:Pe},dir:z,children:(0,te.jsxs)("div",{className:"v2-side-panel-window",children:[(0,te.jsxs)("div",{className:"v2-side-panel-header",children:[T&&(0,te.jsx)("div",{className:"v2-side-panel-icon",children:T}),(0,te.jsx)("h4",{className:"v2-side-panel-title",children:we}),(0,te.jsx)("button",{className:"v2-side-panel-close-button",onClick:()=>X(),title:F(f.closeTooltip),type:"button",children:(0,te.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,te.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),(0,te.jsx)("div",{className:`v2-side-panel-body ${I??""}`,children:(0,te.jsx)(ke,{value:ye,children:(0,te.jsx)(v,{...y,panelId:u})})})]})})},Pn=({defaultWidth:i})=>{let{leftPanel:t,rightPanel:o}=Me();return(0,te.jsxs)(te.Fragment,{children:[t&&(0,te.jsx)(ut,{panel:t,position:"left",defaultWidth:i},t.id),o&&(0,te.jsx)(ut,{panel:o,position:"right",defaultWidth:i},o.id)]})},Xt=({defaultWidth:i})=>{let{leftPanel:t}=Me();return t?(0,te.jsx)(ut,{panel:t,position:"left",defaultWidth:i},t.id):null},qt=({defaultWidth:i})=>{let{rightPanel:t}=Me();return t?(0,te.jsx)(ut,{panel:t,position:"right",defaultWidth:i},t.id):null},Kt=Pn;var de=require("react");var ce=require("react/jsx-runtime"),Ut=(0,de.forwardRef)(function({position:t="right",tabs:o,drawerWidth:c="220px",activeTabId:R,onActiveTabChange:x,children:_},A){let k=R!==void 0,S=fe(),F=he(),[f,z]=(0,de.useState)(null),w=k?R:f,[I,W]=(0,de.useState)(()=>{let P=new Set;for(let T of o)T.eagerMount&&P.add(T.id);return P});(0,de.useEffect)(()=>{let P=o.filter(T=>T.eagerMount&&!I.has(T.id));P.length>0&&W(T=>{let B=new Set(T);for(let N of P)B.add(N.id);return B})},[o]);let u=(0,de.useRef)(w??null);(0,de.useEffect)(()=>{u.current=w??null},[w]);let v=(0,de.useCallback)(P=>{k||z(P),x?.(P)},[k,x]);(0,de.useImperativeHandle)(A,()=>({openTab:P=>v(P),closeDrawer:()=>v(null),getActiveTab:()=>u.current}),[v]);let y=P=>{v(w===P?null:P)},h=(0,de.useCallback)(()=>v(null),[v]);(0,de.useEffect)(()=>{w&&!I.has(w)&&W(P=>{let T=new Set(P);return T.add(w),T})},[w,I]),(0,de.useEffect)(()=>{w===null&&W(P=>{let T=!1,B=new Set(P);for(let N of P){let Y=o.find(X=>X.id===N);Y&&!Y.eagerMount&&!Y.preserveState&&(B.delete(N),T=!0)}return T?B:P})},[w,o]);let H=(0,ce.jsx)("div",{className:`sidebar-tabs-strip ${t}`,style:{width:"56px",height:"100%"},children:o.map(P=>{let T=w===P.id;return(0,ce.jsx)("button",{type:"button",onClick:()=>y(P.id),className:`sidebar-tab-btn ${T?"active":""}`,title:P.label,"aria-pressed":T,children:P.icon},P.id)})}),G=(0,ce.jsx)("div",{className:`sidebar-content-drawer h-100 ${t}`,style:{width:w?c:"0px",minWidth:w?c:"0px",overflow:"hidden",flexShrink:0},children:o.map(P=>{if(!I.has(P.id))return null;let B=w===P.id,N=()=>v(P.id);return(0,ce.jsxs)("div",{style:{display:B?"flex":"none",flexDirection:"column",height:"100%",width:"100%"},children:[(0,ce.jsxs)("div",{className:"sidebar-drawer-header",children:[(0,ce.jsx)("span",{className:"sidebar-header-title",children:P.label}),(0,ce.jsx)("button",{type:"button",onClick:h,className:"sidebar-close-btn",title:S(F.closePanelTooltip),"aria-label":S(F.closePanelTooltip),children:(0,ce.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,ce.jsx)("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),(0,ce.jsx)("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),(0,ce.jsx)("div",{className:"sidebar-drawer-body",children:P.renderContent(P.id,h,N)})]},P.id)})});return(0,ce.jsxs)(ce.Fragment,{children:[t==="left"&&H,t==="left"&&G,_,t==="right"&&G,t==="right"&&H]})});0&&(module.exports={ConfirmationForm,DockableDesktopProvider,FormContainerContext,FormContainerProvider,LeftPanelRenderer,ModalStackRenderer,PanelProvider,PanelRegistry,PanelRegistryClass,RightPanelRenderer,SidePanelRenderer,Sidebar,WindowManager,WindowManagerProvider,WorkspaceClient,defaultPredefinedMessages,formatLabel,useFormContainer,useFormatMessage,usePanelActions,usePanelContext,usePanelId,usePanelState,usePredefinedMessages,useRegistry,useStyleClasses,useWindowManagerActions,useWindowManagerState});
1
+ "use strict";var In=Object.create;var wt=Object.defineProperty;var Sn=Object.getOwnPropertyDescriptor;var En=Object.getOwnPropertyNames;var Ln=Object.getPrototypeOf,zn=Object.prototype.hasOwnProperty;var Nn=(t,n)=>{for(var i in n)wt(t,i,{get:n[i],enumerable:!0})},Xt=(t,n,i,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let b of En(n))!zn.call(t,b)&&b!==i&&wt(t,b,{get:()=>n[b],enumerable:!(r=Sn(n,b))||r.enumerable});return t};var Wn=(t,n,i)=>(i=t!=null?In(Ln(t)):{},Xt(n||!t||!t.__esModule?wt(i,"default",{value:t,enumerable:!0}):i,t)),Dn=t=>Xt(wt({},"__esModule",{value:!0}),t);var eo={};Nn(eo,{ConfirmationForm:()=>$e,DockableDesktopProvider:()=>mn,FormContainerContext:()=>Mt,FormContainerProvider:()=>He,LeftPanelRenderer:()=>vn,ModalStackRenderer:()=>hn,PanelProvider:()=>St,PanelRegistry:()=>dt,PanelRegistryClass:()=>qe,RightPanelRenderer:()=>bn,SidePanelRenderer:()=>yn,Sidebar:()=>wn,Toolbar:()=>Tn,ToolbarProvider:()=>pt,WindowManager:()=>pn,WindowManagerProvider:()=>Tt,WorkspaceClient:()=>zt,defaultPredefinedMessages:()=>Ze,formatLabel:()=>U,useFormContainer:()=>Je,useFormatMessage:()=>xe,usePanelActions:()=>Ge,usePanelContext:()=>Qt,usePanelContextMenu:()=>en,usePanelId:()=>At,usePanelState:()=>Le,usePredefinedMessages:()=>Me,useRegistry:()=>Qe,useSidebar:()=>Rn,useSidebarTab:()=>Mn,useStyleClasses:()=>Ee,useToolbar:()=>gt,useWindowManagerActions:()=>et,useWindowManagerState:()=>Re});module.exports=Dn(eo);var N=Wn(require("react"),1),_t=require("react-dom");var y=require("react");var Rt=require("react"),On={requestClose:()=>{console.warn("FormContainerContract: requestClose called but no container is present")},setDirty:()=>{},onCloseRequested:()=>()=>{},setTitle:()=>{},setIcon:()=>{},containerType:"standalone",instanceId:"standalone",onClose:()=>()=>{},onMinimize:()=>()=>{},onRestore:()=>()=>{},onResize:()=>()=>{}},Mt=(0,Rt.createContext)(On),He=Mt.Provider,Je=()=>(0,Rt.useContext)(Mt);var qe=class{registry=new Map;register(n,i,r){this.registry.set(n,{Component:i,defaultOptions:r})}get(n){return this.registry.get(n)}getRegisteredIds(){return Array.from(this.registry.keys())}},dt=new qe;var Ze={floatWindow:{id:"dockable-desktop-floatWindow",defaultMessage:"Float Window"},minimizePanel:{id:"dockable-desktop-minimizePanel",defaultMessage:"Minimize Panel"},closeTab:{id:"dockable-desktop-closeTab",defaultMessage:"Close Tab"},restorePanel:{id:"dockable-desktop-restorePanel",defaultMessage:"Restore Panel"},maximizePanel:{id:"dockable-desktop-maximizePanel",defaultMessage:"Maximize Panel"},closePanel:{id:"dockable-desktop-closePanel",defaultMessage:"Close Panel"},dockWindow:{id:"dockable-desktop-dockWindow",defaultMessage:"Dock Window"},minimize:{id:"dockable-desktop-minimize",defaultMessage:"Minimize"},maximize:{id:"dockable-desktop-maximize",defaultMessage:"Maximize"},restoreSize:{id:"dockable-desktop-restoreSize",defaultMessage:"Restore Size"},close:{id:"dockable-desktop-close",defaultMessage:"Close"},closeEmptyGroup:{id:"dockable-desktop-closeEmptyGroup",defaultMessage:"Close empty split group"},anchorToRightEdge:{id:"dockable-desktop-anchorToRightEdge",defaultMessage:"Anchor to Right Edge"},anchorToBottomEdge:{id:"dockable-desktop-anchorToBottomEdge",defaultMessage:"Anchor to Bottom Edge"},windowAnchoringOptions:{id:"dockable-desktop-windowAnchoringOptions",defaultMessage:"Window Anchoring Options"},unsavedChangesTitle:{id:"dockable-desktop-unsavedChangesTitle",defaultMessage:"Unsaved Changes"},unsavedChangesMessage:{id:"dockable-desktop-unsavedChangesMessage",defaultMessage:'"{title}" has unsaved changes. Do you want to discard your changes and close?'},discardChanges:{id:"dockable-desktop-discardChanges",defaultMessage:"Discard Changes"},cancel:{id:"dockable-desktop-cancel",defaultMessage:"Cancel"},yes:{id:"dockable-desktop-yes",defaultMessage:"Yes"},no:{id:"dockable-desktop-no",defaultMessage:"No"},ok:{id:"dockable-desktop-ok",defaultMessage:"OK"},closePanelTooltip:{id:"dockable-desktop-closePanelTooltip",defaultMessage:"Close panel"},closeTooltip:{id:"dockable-desktop-closeTooltip",defaultMessage:"Close"}};var _e=require("react/jsx-runtime"),qt=(0,y.createContext)(null),kt=(0,y.createContext)(null),Kt=(0,y.createContext)(null),jt=(0,y.createContext)(null),Ut=(0,y.createContext)(Ze),Jt=(0,y.createContext)({}),Ee=()=>(0,y.useContext)(Jt),Zt=(0,y.createContext)(dt),Qe=()=>(0,y.useContext)(Zt),Ot=class{listeners={};subscribe(n,i){return this.listeners[n]||(this.listeners[n]=[]),this.listeners[n].push(i),()=>{this.listeners[n]=this.listeners[n].filter(r=>r!==i)}}publish(n,i){this.listeners[n]&&this.listeners[n].forEach(r=>r(i))}},Fn={type:"leaf",id:"group-default",panels:[],activePanelId:null};function An(t){if(t)try{let n=JSON.parse(t);if(n.gridRoot&&Array.isArray(n.floating)&&Array.isArray(n.minimized)&&n.panels)return{gridRoot:n.gridRoot,floating:n.floating,minimized:n.minimized,panels:n.panels,activePanelId:Object.keys(n.panels)[0]??null}}catch{}return{gridRoot:Fn,floating:[],minimized:[],panels:{},activePanelId:null}}var Tt=({children:t,client:n,formatMessage:i,predefinedMessages:r,dir:b,modalClass:x,modalBodyClass:T,sidePanelClass:I,sidePanelBodyClass:M,windowClass:k,windowBodyClass:D})=>{let v=(0,y.useRef)(n?.registry??dt).current,E=n?.config.formatMessage??i,W=n?.config.predefinedMessages??r,F=n?.config.dir??b,[A,g]=(0,y.useState)(()=>({...An(n?.initialState??null),draggedPanelId:null,dir:F||"ltr",isRtl:F==="rtl"})),R=(0,y.useRef)(A);R.current=A;let S=(0,y.useRef)(new Set);(0,y.useEffect)(()=>{S.current.forEach(o=>o())},[A]);let $=(0,y.useCallback)(()=>R.current,[]),H=(0,y.useCallback)(o=>(S.current.add(o),()=>S.current.delete(o)),[]),O=(0,y.useRef)({}),B=(0,y.useMemo)(()=>({...Ze,...W}),[W]),Z=(0,y.useRef)(new Ot),C=(0,y.useRef)(1e3),Q=(0,y.useCallback)((o,f)=>Z.current.subscribe(o,f),[]),ne=(0,y.useCallback)((o,f)=>{Z.current.publish(o,f)},[]),oe=(0,y.useCallback)((o,f)=>{let a=typeof o.x=="string"?parseFloat(o.x):o.x,c=typeof o.y=="string"?parseFloat(o.y):o.y,e=typeof o.width=="string"?parseFloat(o.width):o.width,l=typeof o.height=="string"?parseFloat(o.height):o.height;isNaN(a)&&(a=300),isNaN(c)&&(c=150),isNaN(e)&&(e=450),isNaN(l)&&(l=350);let s=P=>f.some(m=>{let L=typeof m.x=="string"?parseFloat(m.x):m.x,z=typeof m.y=="string"?parseFloat(m.y):m.y;return!m.maximized&&Math.abs(L-P.x)<20&&Math.abs(z-P.y)<20}),u=0;for(;s({x:a,y:c})&&u<10;)a+=30,c+=30,u++;let p=Math.max(100,window.innerWidth||1024),h=Math.max(100,window.innerHeight||768);return(a+e>p||c+l>h)&&(a=100+u%5*30,c=100+u%5*30),a=Math.max(0,Math.min(a,p-100)),c=Math.max(0,Math.min(c,h-40)),{x:a,y:c,width:e,height:l}},[]),le=(0,y.useCallback)(o=>{g(f=>{let a=f.panels[o];if(!a)return f;if(a.state==="floating"){let c=f.floating.find(l=>l.id===o);if(!c)return f;let e=!f.floating.some(l=>l.z>c.z);return e&&f.activePanelId===o?f:(e||(C.current+=1),{...f,floating:f.floating.map(l=>l.id===o?{...l,z:e?c.z:C.current}:l),activePanelId:o})}else if(a.state==="docked"){if(f.activePanelId===o)return f;let c=e=>e.type==="leaf"?e.panels.includes(o)?{...e,activePanelId:o}:e:{...e,children:e.children.map(c)};return{...f,gridRoot:c(f.gridRoot),activePanelId:o}}return f.activePanelId===o?f:{...f,activePanelId:o}})},[]),X=(o,f)=>{if(o.type==="leaf"){let a=o.panels.indexOf(f);if(a===-1)return o;let c=o.panels.filter(s=>s!==f),e=o.activePanelId===f?c[a]||c[a-1]||c[0]||null:o.activePanelId,l={...o,panels:c,activePanelId:e};return c.length===0&&!o.keepOnEmpty?null:l}else{let a=o.children.map(l=>X(l,f)).filter(l=>l!==null);if(a.length===0)return null;if(a.length===1)return a[0];let c=o.sizes.slice(0,a.length),e=c.reduce((l,s)=>l+s,0);return{...o,children:a,sizes:c.map(l=>l/e)}}},ee=(o,f,a)=>{if(o.type==="leaf"){if(o.id===f){let c=o.panels.includes(a)?o.panels:[...o.panels,a];return{...o,panels:c,activePanelId:a}}return o}else return{...o,children:o.children.map(c=>ee(c,f,a))}},V=o=>{if(o.type==="leaf")return o.id;for(let f of o.children){let a=V(f);if(a)return a}return null},te=(0,y.useCallback)((o,f,a)=>{let c=!(o in R.current.panels);g(e=>{let l=e.panels[o],s=v.get(f),u=a?.title||a?.title||s?.defaultOptions?.title||o,p=a?.initialTarget||s?.defaultOptions?.initialTarget||"docked",h=s?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350};if(l)if(l.state==="minimized"){let z=e.minimized.filter(w=>w.id!==o);if(p==="floating"||!e.gridRoot){C.current+=1;let w=oe(h,e.floating);return{...e,minimized:z,floating:[...e.floating,{...w,id:o,z:C.current}],panels:{...e.panels,[o]:{...l,state:"floating"}}}}else{let w=V(e.gridRoot)||"group-default";return{...e,minimized:z,gridRoot:ee(e.gridRoot,w,o),panels:{...e.panels,[o]:{...l,state:"docked"}}}}}else{if(l.state==="floating")return le(o),e;{let z=w=>w.type==="leaf"?w.panels.includes(o)?{...w,activePanelId:o}:w:{...w,children:w.children.map(z)};return{...e,gridRoot:z(e.gridRoot)}}}let m={id:o,title:u,component:f,state:p==="tabbed"?"docked":p},L={...e.panels,[o]:m};if(p==="floating"){C.current+=1;let z=oe(h,e.floating),w=a?.stickyRight??s?.defaultOptions?.defaultStickyRight??!1,G=a?.stickyBottom??s?.defaultOptions?.defaultStickyBottom??!1,j=Math.max(100,window.innerWidth||1024),Y=Math.max(100,window.innerHeight||768),ue=typeof z.width=="string"?parseFloat(z.width):z.width,ye=typeof z.height=="string"?parseFloat(z.height):z.height,Ae=z.x,Be=z.y,Ie=10;return w&&(Ae=j-ue-Ie),G&&(Be=Y-ye-Ie),{...e,floating:[...e.floating,{...z,id:o,z:C.current,x:Ae,y:Be,stickyRight:w,stickyBottom:G}],panels:L}}else{let z=V(e.gridRoot)||"group-default";return{...e,gridRoot:ee(e.gridRoot,z,o),panels:L}}}),c&&Z.current.publish("panel:opened",{id:o,component:f})},[oe,le]),ae=(0,y.useCallback)(o=>{let f=o in R.current.panels;g(a=>{let c=a.panels[o];if(!c||v.get(c.component)?.defaultOptions?.canClose===!1)return a;delete O.current[o];let l={...a.panels};delete l[o];let s=X(a.gridRoot,o);return{...a,gridRoot:s||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:a.floating.filter(u=>u.id!==o),minimized:a.minimized.filter(u=>u.id!==o),panels:l}}),f&&Z.current.publish("panel:closed",{id:o})},[]),he=(0,y.useCallback)((o,f)=>{O.current[o]=f},[]),J=(0,y.useCallback)(o=>{delete O.current[o]},[]),K=(0,y.useCallback)((o,f,a)=>{g(c=>{let e=c.panels[o];return e?{...c,panels:{...c.panels,[o]:{...e,dirty:f,dirtyOptions:a}}}:c})},[]),re=(0,y.useCallback)((o,f)=>{g(a=>{let c=a.panels[o];return c?{...a,panels:{...a.panels,[o]:{...c,title:f}}}:a})},[]),_=(0,y.useCallback)(async(o,f)=>{if(f?.force){ae(o);return}let a=O.current[o];if(a&&!await a())return;let c=R.current.panels[o];if(c?.dirty)if(f?.onConfirm){if(!await f.onConfirm(c.dirtyOptions))return}else return;ae(o)},[ae]),se=(0,y.useCallback)(o=>{let f=R.current.panels[o]?.state!=="minimized"&&o in R.current.panels;g(a=>{let c=a.panels[o];if(!c||c.state==="minimized"||v.get(c.component)?.defaultOptions?.canMinimize===!1)return a;let l,s;if(c.state==="floating"){let p=a.floating.find(h=>h.id===o);p&&(l={x:Number(p.x),y:Number(p.y),width:Number(p.width),height:Number(p.height),stickyRight:p.stickyRight,stickyBottom:p.stickyBottom})}else if(c.state==="docked"){let p=h=>{if(h.type==="leaf")return h.panels.includes(o)?h.id:null;for(let P of h.children){let m=p(P);if(m)return m}return null};s=p(a.gridRoot)??void 0}let u=X(a.gridRoot,o);return{...a,gridRoot:u||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:a.floating.filter(p=>p.id!==o),minimized:[...a.minimized,{id:o,title:c.title,component:c.component}],panels:{...a.panels,[o]:{...c,state:"minimized",previousState:c.state,lastFloatingRect:l,lastLeafId:s}}}}),f&&Z.current.publish("panel:minimized",{id:o})},[]),be=(0,y.useCallback)(o=>{let f=R.current.panels[o]?.state==="minimized";g(a=>{let c=a.panels[o];if(!c||c.state!=="minimized")return a;let e=a.minimized.filter(s=>s.id!==o);if((c.previousState||"docked")==="floating"){C.current+=1;let s=v.get(c.component),u=c.lastFloatingRect||s?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},p=oe(u,a.floating);return{...a,minimized:e,floating:[...a.floating,{...p,id:o,z:C.current,stickyRight:!!c.lastFloatingRect?.stickyRight,stickyBottom:!!c.lastFloatingRect?.stickyBottom}],panels:{...a.panels,[o]:{...c,state:"floating"}}}}else{let s=(P,m)=>P.type==="leaf"?P.id===m:P.children.some(L=>s(L,m)),u=c.lastLeafId&&s(a.gridRoot,c.lastLeafId),p=v.get(c.component),h=p?.defaultOptions?.canDrag!==!1;if(u)return{...a,minimized:e,gridRoot:ee(a.gridRoot,c.lastLeafId,o),panels:{...a.panels,[o]:{...c,state:"docked"}}};if(h){C.current+=1;let P=c.lastFloatingRect||p?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},m=oe(P,a.floating);return{...a,minimized:e,floating:[...a.floating,{...m,id:o,z:C.current,stickyRight:!!c.lastFloatingRect?.stickyRight,stickyBottom:!!c.lastFloatingRect?.stickyBottom}],panels:{...a.panels,[o]:{...c,state:"floating"}}}}else{let P=V(a.gridRoot)||"group-default";return{...a,minimized:e,gridRoot:ee(a.gridRoot,P,o),panels:{...a.panels,[o]:{...c,state:"docked"}}}}}}),f&&Z.current.publish("panel:restored",{id:o})},[oe]),we=(0,y.useCallback)((o,f)=>{g(a=>{let c=a.panels[o];if(!c||v.get(c.component)?.defaultOptions?.canDrag===!1)return a;let l=v.get(c.component),s=f||l?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},u=X(a.gridRoot,o);C.current+=1;let p=oe(s,a.floating);return{...a,gridRoot:u||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:[...a.floating,{...p,id:o,z:C.current}],panels:{...a.panels,[o]:{...c,state:"floating"}}}})},[oe]),Ne=(0,y.useCallback)((o,f)=>{g(a=>{let c=a.panels[o];if(!c)return a;let e=a.floating.filter(u=>u.id!==o),l=X(a.gridRoot,o),s=f||V(l||a.gridRoot)||"group-default";return{...a,gridRoot:ee(l||a.gridRoot,s,o),floating:e,panels:{...a.panels,[o]:{...c,state:"docked"}}}})},[]),We=(o,f,a,c)=>{if(o.type==="leaf"){if(o.id===f){let e={type:"leaf",id:`group-split-${Date.now()}-${Math.floor(Math.random()*1e3)}`,panels:[a],activePanelId:a};return{type:"branch",orientation:c==="left"||c==="right"?"horizontal":"vertical",sizes:[.5,.5],children:c==="left"||c==="top"?[e,o]:[o,e]}}return o}else return{...o,children:o.children.map(e=>We(e,f,a,c))}},De=(0,y.useCallback)(o=>{g(f=>({...f,draggedPanelId:o}))},[]),ve=(0,y.useCallback)((o,f,a)=>{g(c=>{let e=c.panels[o];if(!e)return c;let l=c.floating.filter(p=>p.id!==o),s=X(c.gridRoot,o),u;return a==="center"?u=ee(s||c.gridRoot,f,o):u=We(s||c.gridRoot,f,o,a),{...c,gridRoot:u,floating:l,panels:{...c.panels,[o]:{...e,state:"docked"}},draggedPanelId:null}})},[]),ft=(0,y.useCallback)((o,f)=>{g(a=>{let c=a.panels[o];if(!c)return a;let e=a.floating.filter(P=>P.id!==o),l=X(a.gridRoot,o),s={type:"leaf",id:`group-edge-${Date.now()}-${Math.floor(Math.random()*1e3)}`,panels:[o],activePanelId:o},u=f==="left"||f==="right"?"horizontal":"vertical",p=f==="left"||f==="top"?[s,l||a.gridRoot]:[l||a.gridRoot,s];return{...a,gridRoot:{type:"branch",orientation:u,sizes:f==="left"||f==="top"?[.3,.7]:[.7,.3],children:p},floating:e,panels:{...a.panels,[o]:{...c,state:"docked"}},draggedPanelId:null}})},[]),Oe=(0,y.useCallback)((o,f,a)=>{g(c=>{let e=c.panels[o];if(!e)return c;let l=X(c.gridRoot,o),s=h=>{if(h.type==="leaf"){if(h.id===f){let P=h.panels.filter(z=>z!==o),m=Math.max(0,Math.min(a,P.length)),L=[...P];return L.splice(m,0,o),{...h,panels:L,activePanelId:o}}return h}else return{...h,children:h.children.map(s)}},u=s(l||c.gridRoot),p=c.floating.filter(h=>h.id!==o);return{...c,gridRoot:u,floating:p,panels:{...c.panels,[o]:{...e,state:"docked"}},draggedPanelId:null}})},[]),Se=(0,y.useCallback)(o=>{g(f=>{let a=e=>{if(e.type==="leaf")return e.id===o&&e.canClose!==!1?null:e;{let l=e.children.map(p=>a(p)).filter(p=>p!==null);if(l.length===0)return null;if(l.length===1)return l[0];let s=e.sizes.slice(0,l.length),u=s.reduce((p,h)=>p+h,0);return{...e,children:l,sizes:s.map(p=>p/u)}}},c=a(f.gridRoot);return{...f,gridRoot:c||{type:"leaf",id:"group-default",panels:[],activePanelId:null}}})},[]),mt=(0,y.useCallback)(o=>{g(f=>({...f,floating:f.floating.map(a=>a.id===o?{...a,maximized:!a.maximized}:a)}))},[]),ht=(0,y.useCallback)((o,f)=>{let a=(c,e)=>{if(c.type==="leaf")return c;if(e===o.length)return{...c,sizes:f};let l=o[e],s=c.children.map((u,p)=>p===l?a(u,e+1):u);return{...c,children:s}};g(c=>({...c,gridRoot:a(c.gridRoot,0)}))},[]),ot=(0,y.useCallback)((o,f)=>{g(a=>({...a,floating:a.floating.map(c=>c.id===o?{...c,...f}:c)}))},[]),Ye=(0,y.useCallback)(()=>JSON.stringify({gridRoot:R.current.gridRoot,floating:R.current.floating,minimized:R.current.minimized,panels:R.current.panels}),[]),Xe=(0,y.useCallback)(o=>{try{let f=JSON.parse(o);if(f.gridRoot&&f.floating&&f.minimized&&f.panels){let a=Object.keys(f.panels)[0]||null;return g(c=>({...c,gridRoot:f.gridRoot,floating:f.floating,minimized:f.minimized,panels:f.panels,draggedPanelId:null,activePanelId:a})),!0}return!1}catch(f){return console.error("Failed to parse layout configuration:",f),!1}},[]),Ve=(0,y.useCallback)(o=>{g(f=>f.activePanelId===o?f:{...f,activePanelId:o})},[]),it=(0,y.useCallback)(o=>{g(f=>f.dir===o?f:{...f,dir:o,isRtl:o==="rtl"})},[]),vt=(0,y.useCallback)(o=>o in R.current.panels,[]),rt=(0,y.useCallback)(()=>Object.keys(R.current.panels),[]);(0,y.useEffect)(()=>{F&&g(o=>o.dir===F?o:{...o,dir:F,isRtl:F==="rtl"})},[F]);let Fe=(0,y.useRef)(new Map),Ke=(0,y.useCallback)((o,f)=>(Fe.current.set(o,f),()=>{Fe.current.delete(o)}),[]),ke=(0,y.useCallback)(o=>Fe.current.get(o)?.()??[],[]),st=(0,y.useMemo)(()=>({openPanel:te,closePanel:ae,minimizePanel:se,restorePanel:be,floatPanel:we,dockPanel:Ne,maximizePanel:mt,updateSplitSizes:ht,updateFloatingPosition:ot,focusPanel:le,isOpen:vt,getOpenPanelIds:rt,saveLayout:Ye,loadLayout:Xe,publish:ne,subscribe:Q,setDraggedPanelId:De,dockPanelToGroup:ve,movePanelOrder:Oe,closeLeafGroup:Se,registerCloseGuard:he,unregisterCloseGuard:J,setPanelDirty:K,updatePanelTitle:re,requestClosePanel:_,dockPanelToWorkspaceEdge:ft,setActivePanel:Ve,setDirection:it,registerPanelContextMenu:Ke,getPanelContextMenuItems:ke}),[te,ae,se,be,we,Ne,mt,ht,ot,le,vt,rt,Ye,Xe,ne,Q,De,ve,Oe,Se,he,J,K,re,_,ft,Ve,it,Ke,ke]),Dt=o=>{let f=o.defaultMessage||o.id;return o.values&&Object.entries(o.values).forEach(([a,c])=>{f=f.replace(`{${a}}`,String(c))}),f},Te=(0,y.useMemo)(()=>({modalClass:x,modalBodyClass:T,sidePanelClass:I,sidePanelBodyClass:M,windowClass:k,windowBodyClass:D}),[x,T,I,M,k,D]);(0,y.useEffect)(()=>{if(process.env.NODE_ENV!=="development")return;try{getComputedStyle(document.documentElement).getPropertyValue("--rdd-styles-loaded").trim()!=="1"&&console.error(`[react-dockable-desktop] styles.css is not imported.
2
+ Add this to your entry file (main.tsx / index.tsx):
3
+ import 'react-dockable-desktop/styles.css'
4
+ Without it the workspace renders as a black screen with no console errors.`)}catch{}let o=!1;try{for(let f of Array.from(document.styleSheets))try{if(Array.from(f.cssRules||[]).some(c=>c.cssText?.includes("react-contexify"))){o=!0;break}}catch{}}catch{}o||console.warn(`[react-dockable-desktop] replace-react-contexify CSS not detected. Context menus may not render correctly.
5
+ Add: import "replace-react-contexify/dist/ReactContexify.css"`)},[]),(0,y.useEffect)(()=>{if(n)return n._connect(st),()=>{n._disconnect()}},[n,st]);let bt=(0,y.useMemo)(()=>({getSnapshot:$,subscribeToState:H}),[$,H]);return(0,_e.jsx)(Jt.Provider,{value:Te,children:(0,_e.jsx)(Zt.Provider,{value:v,children:(0,_e.jsx)(jt.Provider,{value:bt,children:(0,_e.jsx)(qt.Provider,{value:A,children:(0,_e.jsx)(kt.Provider,{value:st,children:(0,_e.jsx)(Kt.Provider,{value:E||Dt,children:(0,_e.jsx)(Ut.Provider,{value:B,children:t})})})})})})})},Vt=t=>()=>{};function Re(t){let n=(0,y.useContext)(qt),i=(0,y.useContext)(jt),r=(0,y.useRef)(t);r.current=t;let b=(0,y.useSyncExternalStore)(t?i?.subscribeToState??Vt:Vt,()=>{let x=i?.getSnapshot()??n;return r.current?r.current(x):x},()=>{let x=i?.getSnapshot()??n;return r.current?r.current(x):x});if(!n)throw new Error("useWindowManagerState must be used within WindowManagerProvider");return t?b:n}var et=()=>{let t=(0,y.useContext)(kt);if(!t)throw new Error("useWindowManagerActions must be used within WindowManagerProvider");return t},Ft=()=>{let t=(0,y.useContext)(kt);if(!t)throw new Error("useWindowManagerActionsInternal must be used within WindowManagerProvider");return t},xe=()=>(0,y.useContext)(Kt)||(n=>{let i=n.defaultMessage||n.id;return n.values&&Object.entries(n.values).forEach(([r,b])=>{i=i.replace(`{${r}}`,String(b))}),i}),U=(t,n)=>t?typeof t=="string"?t:n(t):"",Qt=()=>{let{publish:t,subscribe:n}=et();return{publish:t,subscribe:n}},Me=()=>(0,y.useContext)(Ut),At=()=>Je().instanceId;function en(t){let n=(0,y.useContext)(kt),i=At(),r=(0,y.useRef)(t);r.current=t,(0,y.useEffect)(()=>{if(!(!n?.registerPanelContextMenu||!i))return n.registerPanelContextMenu(i,()=>r.current)},[i,n?.registerPanelContextMenu])}function tn(t){if(!t)return typeof document<"u"?document.documentElement.dir?.toLowerCase()==="rtl"||document.body.dir?.toLowerCase()==="rtl":!1;let n=t.closest("[dir]");return n?n.getAttribute("dir")?.toLowerCase()==="rtl":document.documentElement.dir?.toLowerCase()==="rtl"||document.body.dir?.toLowerCase()==="rtl"}var sn=require("replace-react-contexify"),xo=require("replace-react-contexify/styles.css");var ie=require("react"),Ht=require("react/jsx-runtime"),Bn=0,Bt=()=>`panel-${++Bn}-${Date.now()}`,It=new Map,nn={leftPanel:null,rightPanel:null,modals:[]},on=(0,ie.createContext)(null),rn=(0,ie.createContext)(null),St=({children:t})=>{let[n,i]=(0,ie.useState)(nn),r=(0,ie.useRef)(n);r.current=n;let b=(0,ie.useCallback)((g,R)=>{It.set(g,R)},[]),x=(0,ie.useCallback)(g=>{It.delete(g)},[]),T=(0,ie.useCallback)(async(g,R,S={})=>{let $=r.current.leftPanel;if($){let B=It.get($.id);if(B&&!await B())return null}let H=Bt(),O={id:H,Component:g,props:R,containerType:"left-panel",options:S};return i(B=>({...B,leftPanel:O})),H},[]),I=(0,ie.useCallback)(async(g,R,S={})=>{let $=r.current.rightPanel;if($){let B=It.get($.id);if(B&&!await B())return null}let H=Bt(),O={id:H,Component:g,props:R,containerType:"right-panel",options:S};return i(B=>({...B,rightPanel:O})),H},[]),M=(0,ie.useCallback)((g,R,S={})=>{let $=Bt(),H=R.title,O={...S,title:S.title||H||"Confirmation"},B={id:$,Component:g,props:R,containerType:"modal",options:O};return i(Z=>({...Z,modals:[...Z.modals,B]})),$},[]),k=(0,ie.useCallback)(g=>{i(R=>({leftPanel:R.leftPanel?.id===g?null:R.leftPanel,rightPanel:R.rightPanel?.id===g?null:R.rightPanel,modals:R.modals.filter(S=>S.id!==g)}))},[]),D=(0,ie.useCallback)(()=>{i(nn)},[]),v=(0,ie.useCallback)(()=>{i(g=>({...g,modals:[]}))},[]),E=(0,ie.useCallback)(g=>n.leftPanel?.id===g?n.leftPanel:n.rightPanel?.id===g?n.rightPanel:n.modals.find(R=>R.id===g),[n]),W=(0,ie.useCallback)((g,R)=>{i(S=>({leftPanel:S.leftPanel?.id===g?{...S.leftPanel,...R}:S.leftPanel,rightPanel:S.rightPanel?.id===g?{...S.rightPanel,...R}:S.rightPanel,modals:S.modals.map($=>$.id===g?{...$,...R}:$)}))},[]),F=(0,ie.useCallback)((g,R,S)=>{W(g,{dirty:R,dirtyOptions:S})},[W]),A=(0,ie.useMemo)(()=>({openLeftPanel:T,openRightPanel:I,openModal:M,close:k,closeAll:D,closeAllModals:v,getInstance:E,updateInstance:W,setDirty:F,registerCloseHandler:b,unregisterCloseHandler:x}),[T,I,M,k,D,v,E,W,F,b,x]);return(0,Ht.jsx)(on.Provider,{value:n,children:(0,Ht.jsx)(rn.Provider,{value:A,children:t})})},Le=()=>{let t=(0,ie.useContext)(on);if(!t)throw new Error("usePanelState must be used within PanelProvider");return t},Ge=()=>{let t=(0,ie.useContext)(rn);if(!t)throw new Error("usePanelActions must be used within PanelProvider");return t};var ct=require("react");var Ce=require("react/jsx-runtime"),Hn=({title:t,message:n,alert:i,alertType:r="info",useYesNoTitles:b=!1,onOK:x,onCancel:T})=>{let{requestClose:I,setIcon:M,setTitle:k}=Je(),D=xe(),v=Me(),E=(0,ct.useRef)(null);(0,ct.useEffect)(()=>{if(t){let S=typeof t=="string"?t:D(t);k(S)}M&&M((0,Ce.jsx)("span",{children:"\u2753"}))},[t,k,M,D]),(0,ct.useEffect)(()=>{E.current?.focus()},[]);let W=typeof n=="string"?n:D(n),F=D(b?v.no:v.cancel),A=D(b?v.yes:v.ok),g=S=>{S.preventDefault(),x?.(),I()},R=()=>{T?.(),I()};return(0,Ce.jsxs)("form",{onSubmit:g,className:"confirmation-form-body",children:[i&&(0,Ce.jsxs)("div",{className:`confirmation-alert confirmation-alert-${r}`,children:[(0,Ce.jsx)("span",{children:"\u2139\uFE0F"}),(0,Ce.jsx)("span",{children:i})]}),(0,Ce.jsx)("div",{style:{fontSize:"0.9rem",color:"inherit",lineHeight:1.5},children:W}),(0,Ce.jsx)("hr",{style:{marginTop:"0.5rem",marginBottom:"0.5rem",opacity:.1}}),(0,Ce.jsxs)("div",{className:"confirmation-actions",children:[(0,Ce.jsx)("button",{type:"button",className:"dw-btn dw-btn-sm dw-btn-outline",onClick:R,children:F}),(0,Ce.jsx)("button",{type:"submit",className:"dw-btn dw-btn-sm dw-btn-primary",ref:E,children:A})]})]})},$e=Hn;var d=require("react/jsx-runtime"),an=(t,n)=>{if(!t)return null;if(t.type==="leaf")return t.id===n?t:null;for(let i of t.children){let r=an(i,n);if(r)return r}return null},ut=new Map,Lt="preserved-dom-container",Gt=(0,d.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:[(0,d.jsx)("rect",{x:"3",y:"3",width:"7",height:"9",rx:"1"}),(0,d.jsx)("rect",{x:"14",y:"3",width:"7",height:"5",rx:"1"}),(0,d.jsx)("rect",{x:"14",y:"12",width:"7",height:"9",rx:"1"}),(0,d.jsx)("rect",{x:"3",y:"16",width:"7",height:"5",rx:"1"})]}),tt={float:(0,d.jsx)("span",{className:"wm-menu-icon",children:(0,d.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:[(0,d.jsx)("rect",{x:"2",y:"8",width:"14",height:"14",rx:"1"}),(0,d.jsx)("rect",{x:"8",y:"2",width:"14",height:"14",rx:"1"})]})}),minimize:(0,d.jsx)("span",{className:"wm-menu-icon",children:(0,d.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",style:{display:"block"},children:(0,d.jsx)("line",{x1:"4",y1:"18",x2:"20",y2:"18"})})}),restore:(0,d.jsx)("span",{className:"wm-menu-icon",children:(0,d.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:(0,d.jsx)("rect",{x:"4",y:"4",width:"16",height:"16",rx:"1"})})}),maximize:(0,d.jsx)("span",{className:"wm-menu-icon",children:(0,d.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:(0,d.jsx)("rect",{x:"2",y:"2",width:"20",height:"20",rx:"1"})})}),close:(0,d.jsx)("span",{className:"wm-menu-icon",children:(0,d.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:(0,d.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})},ln=t=>{let n=ut.get(t);return n||(n=document.createElement("div"),n.style.width="100%",n.style.height="100%",ut.set(t,n)),n},_n=(t,n,i)=>{let r=i.get(n);if(!r)return console.warn(`[react-dockable-desktop] Panel "${t}" references component key "${n}" which is not registered. Add it to the WorkspaceClient panels config:
6
+ new WorkspaceClient({ panels: { "${n}": { component: YourComponent } } })`),(0,d.jsxs)("div",{className:"dw-unregistered-panel",style:{border:"2px dashed #dc3545"},children:[(0,d.jsx)("h6",{style:{fontWeight:700,marginBottom:"0.25rem"},children:"\u26A0\uFE0F Component Unregistered"}),(0,d.jsxs)("span",{style:{fontSize:"0.875rem",color:"var(--text-secondary, #94a3b8)"},children:["Key: ",n]})]});let b=r.Component;return(0,d.jsx)(b,{panelId:t})},dn=new Map,nt=new Map,Et=t=>{let n=nt.get(t);return n||(n={onClose:new Set,onMinimize:new Set,onRestore:new Set,onResize:new Set},nt.set(t,n)),n},cn=({panelId:t})=>{let n=(0,N.useRef)(null);return(0,N.useEffect)(()=>{let i=n.current;if(!i)return;let r=ln(t);i.appendChild(r);let b=new ResizeObserver(x=>{for(let T of x){let{width:I,height:M}=T.contentRect;if(I>0&&M>0){dn.set(t,{width:I,height:M});let k=nt.get(t);k&&k.onResize.forEach(D=>D(I,M))}}});return b.observe(i),()=>{b.disconnect();let x=document.getElementById(Lt);x||(x=document.createElement("div"),x.id=Lt,x.style.display="none",document.body.appendChild(x)),x.appendChild(r)}},[t]),(0,d.jsx)("div",{ref:n,style:{width:"100%",height:"100%"}})},Gn=({panelId:t})=>{let n=Re(),i=Qe(),r=xe(),b=(0,N.useRef)(null),x=n.panels[t],T=x?i.get(x.component):null,I=T?.defaultOptions?.disableLivePreview||!1,M=dn.get(t)||{width:800,height:500},k=M.width,D=M.height,W=Math.min(220/k,140/D);if((0,N.useEffect)(()=>{if(I)return;let F=b.current;if(!F)return;let A=ut.get(t);if(A)return F.appendChild(A),()=>{let g=document.getElementById(Lt);g||(g=document.createElement("div"),g.id=Lt,g.style.display="none",document.body.appendChild(g)),g.appendChild(A)}},[t,I]),I){let F=k*W,A=D*W,g=x?.title||T?.defaultOptions?.title||"Panel",R=U(g,r),S=(Array.from(R)[0]||"P").toUpperCase();return(0,d.jsx)("div",{className:"taskbar-item-preview-frame",style:{width:`${F}px`,height:`${A}px`,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(108, 117, 125, 0.15)",border:"1px dashed var(--taskbar-item-border, rgba(255, 255, 255, 0.15))"},children:(0,d.jsx)("div",{style:{fontSize:"2rem",fontWeight:600,color:"var(--panel-title-color, var(--panel-text, rgba(255, 255, 255, 0.85)))",userSelect:"none"},children:S})})}return(0,d.jsx)("div",{className:"taskbar-item-preview-frame",style:{width:`${k*W}px`,height:`${D*W}px`},children:(0,d.jsx)("div",{ref:b,className:"taskbar-item-preview-host",style:{width:`${k}px`,height:`${D}px`,transform:`scale(${W})`,transformOrigin:"top left",position:"absolute",top:0,left:0,"--preview-scale":W}})})},$n=({panelId:t,children:n})=>{let i=Re(),{requestClosePanel:r,setPanelDirty:b,registerCloseGuard:x,unregisterCloseGuard:T,updatePanelTitle:I}=et(),M=i.minimized.some(v=>v.id===t),k=(0,N.useRef)(M);(0,N.useEffect)(()=>{let v=nt.get(t);v&&(M&&!k.current?v.onMinimize.forEach(E=>E()):!M&&k.current&&v.onRestore.forEach(E=>E()),k.current=M)},[M,t]),(0,N.useEffect)(()=>()=>{let v=nt.get(t);v&&(v.onClose.forEach(E=>E()),nt.delete(t))},[t]);let D=N.default.useMemo(()=>({requestClose:v=>r(t,v),setDirty:v=>b(t,v),onCloseRequested:v=>(x(t,v),()=>T(t)),setTitle:v=>I(t,v),instanceId:t,onClose:v=>{let E=Et(t);return E.onClose.add(v),()=>E.onClose.delete(v)},onMinimize:v=>{let E=Et(t);return E.onMinimize.add(v),()=>E.onMinimize.delete(v)},onRestore:v=>{let E=Et(t);return E.onRestore.add(v),()=>E.onRestore.delete(v)},onResize:v=>{let E=Et(t);return E.onResize.add(v),()=>E.onResize.delete(v)}}),[t,r,b,x,T,I]);return(0,d.jsx)(He,{value:D,children:n})},un=({node:t,path:n,onTabRightClick:i,activeDropZone:r,onHoverDropZone:b,onTabDragStart:x,hoveredTab:T,onTabHover:I,defaultPanelIcon:M,onRequestClosePanel:k})=>{let{updateSplitSizes:D}=et();if(t.type==="leaf")return(0,d.jsx)(Yn,{leaf:t,onTabRightClick:i,activeDropZone:r,onHoverDropZone:b,onTabDragStart:x,hoveredTab:T,onTabHover:I,defaultPanelIcon:M,onRequestClosePanel:k});let v=t.orientation==="horizontal",E=(W,F)=>{F.preventDefault();let A=F.currentTarget;A.setPointerCapture(F.pointerId);let g=v?F.clientX:F.clientY,R=[...t.sizes];A.classList.add("active"),document.body.classList.add("resizing-active",v?"resizing-col-active":"resizing-row-active");let S=A.parentElement,$=S?v?S.clientWidth:S.clientHeight:v?1e3:800,H=B=>{let C=((v?B.clientX:B.clientY)-g)/$,Q=[...R];Q[W]+=C,Q[W+1]-=C,Q[W]>.1&&Q[W+1]>.1&&D(n,Q)},O=()=>{A.classList.remove("active"),document.body.classList.remove("resizing-active","resizing-row-active","resizing-col-active"),A.removeEventListener("pointermove",H),A.removeEventListener("pointerup",O),A.removeEventListener("pointercancel",O)};A.addEventListener("pointermove",H),A.addEventListener("pointerup",O),A.addEventListener("pointercancel",O)};return(0,d.jsx)("div",{style:{display:"flex",flexDirection:v?"row":"column",width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:t.children.map((W,F)=>{let A=t.sizes[F]*100;return(0,d.jsxs)(N.default.Fragment,{children:[(0,d.jsx)("div",{style:{flexGrow:t.sizes[F],flexBasis:`${A}%`,overflow:"hidden",position:"relative"},children:(0,d.jsx)(un,{node:W,path:[...n,F],onTabRightClick:i,activeDropZone:r,onHoverDropZone:b,onTabDragStart:x,hoveredTab:T,onTabHover:I,defaultPanelIcon:M,onRequestClosePanel:k})}),F<t.children.length-1&&(0,d.jsx)("div",{onPointerDown:g=>E(F,g),style:{cursor:v?"col-resize":"row-resize",width:v?"1px":"100%",height:v?"100%":"1px",zIndex:20},className:"resizer-bar"})]},F)})})},Yn=({leaf:t,onTabRightClick:n,activeDropZone:i,onHoverDropZone:r,onTabDragStart:b,hoveredTab:x,onTabHover:T,defaultPanelIcon:I,onRequestClosePanel:M})=>{let k=Re(),D=Qe(),{openPanel:v,closeLeafGroup:E,setActivePanel:W}=Ft(),F=xe(),A=Me(),{windowClass:g,windowBodyClass:R}=Ee(),S=(0,N.useRef)(null),[$,H]=(0,N.useState)({left:!1,right:!1}),O=(0,N.useCallback)(()=>{let C=S.current;C&&H({left:C.scrollLeft>0,right:C.scrollLeft<C.scrollWidth-C.clientWidth-1})},[]);(0,N.useEffect)(()=>{let C=S.current;if(!C)return;C.addEventListener("scroll",O,{passive:!0});let Q=new ResizeObserver(O);return Q.observe(C),O(),()=>{C.removeEventListener("scroll",O),Q.disconnect()}},[O]);let B=C=>{S.current?.scrollBy({left:C==="left"?-120:120,behavior:"smooth"})},Z=C=>{v(C,k.panels[C].component),W(C)};return(0,d.jsxs)("div",{"data-active-panel-id":t.activePanelId||"",className:`workspace-panel ${g??""}`,style:{overflow:"hidden",position:"relative"},children:[(0,d.jsxs)("div",{className:"workspace-tab-bar",style:{minHeight:"38px"},children:[$.left&&(0,d.jsx)("button",{className:"tab-scroll-btn tab-scroll-btn-left",onPointerDown:C=>C.stopPropagation(),onClick:()=>B("left"),tabIndex:-1,"aria-label":"Scroll tabs left",children:"\u2039"}),(0,d.jsx)("div",{ref:S,className:"tab-headers-container",style:{scrollbarWidth:"none"},onPointerMove:C=>{k.draggedPanelId&&C.target===C.currentTarget&&T(t.id,"EMPTY",t.panels.length,"right")},onPointerLeave:C=>{k.draggedPanelId&&C.target===C.currentTarget&&T(t.id,"",-1,null)},children:t.panels.map((C,Q)=>{let ne=k.panels[C];if(!ne)return null;let oe=t.activePanelId===C,le=k.activePanelId===C,ee=D.get(ne.component)?.defaultOptions,V=x&&x.leafId===t.id&&x.panelId===C,te=Q===t.panels.length-1,ae=x&&x.leafId===t.id&&x.panelId==="EMPTY"&&te,he=V?x.side==="left"?"drag-hover-left":"drag-hover-right":ae?"drag-hover-right":"",J=oe?le?"active workspace-tab-active-focused":"active workspace-tab-active-unfocused":"workspace-tab-inactive";return(0,d.jsxs)("div",{"data-tab-id":C,"data-leaf-id":t.id,"data-tab-index":String(Q),onClick:()=>Z(C),onPointerDown:K=>{ee?.canDrag!==!1&&b(C,K)},onContextMenu:K=>n(C,K),onPointerMove:K=>{if(k.draggedPanelId&&K.pointerType!=="touch"){let re=K.currentTarget.getBoundingClientRect(),se=K.clientX-re.left<re.width/2?"left":"right";T(t.id,C,Q,se)}},onPointerLeave:()=>{k.draggedPanelId&&T(t.id,"",-1,null)},className:`workspace-tab ${J} ${he}`,style:{cursor:ee?.canDrag===!1?"default":"pointer"},children:[(0,d.jsxs)("span",{className:"text-truncate",style:{maxWidth:"120px",display:"flex",alignItems:"center"},children:[(0,d.jsx)("span",{className:"workspace-tab-icon",children:ee?.icon||I||Gt}),(0,d.jsxs)("span",{children:[U(ne.title,F),ne.dirty?" *":""]})]}),ee?.renderHeaderActions&&(0,d.jsx)("span",{className:"tab-header-actions",onClick:K=>K.stopPropagation(),onPointerDown:K=>K.stopPropagation(),children:ee.renderHeaderActions(C)}),ee?.canClose!==!1&&(0,d.jsx)("span",{onClick:K=>{K.stopPropagation(),M(C)},title:U(A.closeTab,F),className:"close-tab-x",style:{width:"18px",height:"18px",...ee?.renderHeaderActions?{}:{marginInlineStart:"auto"}},children:(0,d.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,d.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]},C)})}),$.right&&(0,d.jsx)("button",{className:"tab-scroll-btn tab-scroll-btn-right",onPointerDown:C=>C.stopPropagation(),onClick:()=>B("right"),tabIndex:-1,"aria-label":"Scroll tabs right",children:"\u203A"}),t.panels.length===0&&t.keepOnEmpty&&t.canClose!==!1&&(0,d.jsx)("span",{onClick:()=>E(t.id),className:"close-tab-x header-close-empty-group",style:{width:"18px",height:"18px",cursor:"pointer"},title:U(A.closeEmptyGroup,F),children:(0,d.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,d.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),(0,d.jsxs)("div",{className:`dw-panel-body ${R??""}`,style:{position:"relative",overflow:"hidden"},children:[t.activePanelId&&k.panels[t.activePanelId]?(0,d.jsx)(cn,{panelId:t.activePanelId},t.activePanelId):(0,d.jsx)("div",{className:"empty-leaf-placeholder",children:(0,d.jsx)("span",{children:"Empty Workspace Section"})}),k.draggedPanelId!==null&&(0,d.jsx)("div",{className:"dock-drop-zone-overlay",children:(0,d.jsxs)("div",{className:"dock-target-cross",children:[(0,d.jsx)("div",{"data-leaf-id":t.id,"data-drop-zone":"top",onPointerEnter:()=>r(t.id,"top"),onPointerLeave:()=>r(t.id,null),className:"dock-target-box dock-target-top",children:"\u25B2"}),(0,d.jsx)("div",{"data-leaf-id":t.id,"data-drop-zone":"bottom",onPointerEnter:()=>r(t.id,"bottom"),onPointerLeave:()=>r(t.id,null),className:"dock-target-box dock-target-bottom",children:"\u25BC"}),(0,d.jsx)("div",{"data-leaf-id":t.id,"data-drop-zone":"left",onPointerEnter:()=>r(t.id,"left"),onPointerLeave:()=>r(t.id,null),className:"dock-target-box dock-target-left",children:"\u25C0"}),(0,d.jsx)("div",{"data-leaf-id":t.id,"data-drop-zone":"right",onPointerEnter:()=>r(t.id,"right"),onPointerLeave:()=>r(t.id,null),className:"dock-target-box dock-target-right",children:"\u25B6"}),(0,d.jsx)("div",{"data-leaf-id":t.id,"data-drop-zone":"center",onPointerEnter:()=>r(t.id,"center"),onPointerLeave:()=>r(t.id,null),className:"dock-target-box dock-target-center",children:"\u25A3"})]})}),k.draggedPanelId!==null&&i!==null&&i.leafId===t.id&&(0,d.jsx)("div",{className:"dock-preview-highlight",style:{left:i.position==="right"?"50%":"0",top:i.position==="bottom"?"50%":"0",width:i.position==="left"||i.position==="right"?"50%":"100%",height:i.position==="top"||i.position==="bottom"?"50%":"100%"}})]})]})},Xn=({skin:t="vscode",defaultPanelIcon:n,taskbarVisibility:i="always"})=>{let r=Re(),b=Qe(),{restorePanel:x,minimizePanel:T,requestClosePanel:I,maximizePanel:M,updateFloatingPosition:k,focusPanel:D,floatPanel:v,setDraggedPanelId:E,dockPanelToGroup:W,movePanelOrder:F,dockPanelToWorkspaceEdge:A,setActivePanel:g,setDirection:R,getPanelContextMenuItems:S}=Ft(),{openModal:$}=Ge(),H=xe(),O=Me(),B=N.default.useCallback(e=>{let l=r.panels[e];I(e,{onConfirm:s=>new Promise(u=>{let p=s||l?.dirtyOptions,h=l?U(l.title,H):"Panel";$($e,{title:p?.title||O.unsavedChangesTitle,message:p?.message||{id:O.unsavedChangesMessage.id,defaultMessage:O.unsavedChangesMessage.defaultMessage,values:{title:h}},alert:p?.alert,alertType:p?.alertType||"danger",useYesNoTitles:!0,onOK:()=>u(!0),onCancel:()=>u(!1)},{size:"small"})})})},[I,r.panels,H,$,O]),{windowClass:Z,windowBodyClass:C}=Ee(),Q=(0,N.useRef)(null),ne=(0,N.useRef)(null),[oe,le]=(0,N.useState)(!1),X=(0,N.useRef)(null),ee=(0,N.useRef)(r.minimized.length),[V,te]=(0,N.useState)(null),ae=(0,N.useRef)(null),he=(0,N.useRef)("mouse"),[J,K]=(0,N.useState)(!1);(0,N.useEffect)(()=>()=>{ae.current&&clearTimeout(ae.current)},[]),(0,N.useEffect)(()=>{V&&(r.minimized.some(l=>l.id===V.id)||te(null))},[r.minimized,V]),(0,N.useEffect)(()=>{if(!V?.fromTouch)return;let e=l=>{l.pointerType!=="touch"||document.querySelector(".taskbar-item-tooltip")?.contains(l.target)||te(null)};return document.addEventListener("pointerdown",e,{capture:!0}),()=>document.removeEventListener("pointerdown",e,{capture:!0})},[V?.fromTouch]);let[re,_]=(0,N.useState)(null),se=(0,N.useRef)(null),[be,we]=(0,N.useState)({x:0,y:0}),[Ne,We]=(0,N.useState)(null),De=(0,N.useRef)(null),ve=e=>{We(e),De.current=e},[ft,Oe]=(0,N.useState)(null),Se=(0,N.useRef)(null),mt=(e,l,s,u)=>{let p=u?{leafId:e,panelId:l,index:s,side:u}:null;Oe(p),Se.current=p},ht=(e,l)=>{let s=l?{leafId:e,position:l}:null;_(s),se.current=s},ot=(e,l)=>{let s=document.elementsFromPoint(e,l),u=!1,p=!1,h=!1;for(let P of s)if(P instanceof HTMLElement){if(!u&&P.dataset.dropZone){let m=P.dataset.leafId;if(m){let L=P.dataset.dropZone;_({leafId:m,position:L}),se.current={leafId:m,position:L},u=!0}}if(!h&&P.dataset.tabId){let m=P.dataset.leafId,L=parseInt(P.dataset.tabIndex||"0",10);if(m){let z=P.getBoundingClientRect(),w=e-z.left<z.width/2?"left":"right";Oe({leafId:m,panelId:P.dataset.tabId,index:L,side:w}),Se.current={leafId:m,panelId:P.dataset.tabId,index:L,side:w},h=!0}}if(!p&&P.dataset.edgeTrigger&&(ve(P.dataset.edgeTrigger),p=!0),u&&p&&h)break}u||(_(null),se.current=null),p||ve(null),h||(Oe(null),Se.current=null)},Ye=300,Xe=8,Ve=()=>{E(null),_(null),se.current=null,Oe(null),Se.current=null,ve(null)},it=(e,l)=>{let s=se.current,u=Se.current,p=De.current;if(p)A(e,p);else if(u){let h=u.index;u.side==="right"&&(h+=1);let P=an(r.gridRoot,u.leafId);if(P){let m=P.panels.indexOf(e);m!==-1&&m<h&&(h-=1)}F(e,u.leafId,h)}else s?W(e,s.leafId,s.position):v(e,{x:l.clientX-150,y:l.clientY-15,width:450,height:350});Ve()},vt=(e,l)=>{if(l.pointerType==="mouse"&&l.button!==0)return;let s=l.currentTarget,u=l.clientX,p=l.clientY;if(l.pointerType==="touch"){let h=l.pointerId,P=!1,m=()=>{P=!0,clearTimeout(z),s.removeEventListener("pointermove",L),s.removeEventListener("pointerup",m),s.removeEventListener("pointercancel",m)},L=w=>{Math.hypot(w.clientX-u,w.clientY-p)>Xe&&m()},z=setTimeout(()=>{if(P)return;s.removeEventListener("pointermove",L),s.removeEventListener("pointerup",m),s.removeEventListener("pointercancel",m);try{s.setPointerCapture(h)}catch{return}s.classList.add("long-press-active"),navigator.vibrate&&navigator.vibrate(10);let w=!1,G=ue=>{w||(w=!0,E(e)),we({x:ue.clientX,y:ue.clientY}),ot(ue.clientX,ue.clientY)},j=ue=>{s.classList.remove("long-press-active"),s.removeEventListener("pointermove",G),s.removeEventListener("pointerup",j),s.removeEventListener("pointercancel",Y),w?it(e,ue):rt(e,ue)},Y=()=>{s.classList.remove("long-press-active"),s.removeEventListener("pointermove",G),s.removeEventListener("pointerup",j),s.removeEventListener("pointercancel",Y),w&&Ve()};s.addEventListener("pointermove",G),s.addEventListener("pointerup",j),s.addEventListener("pointercancel",Y)},Ye);s.addEventListener("pointermove",L),s.addEventListener("pointerup",m),s.addEventListener("pointercancel",m)}else{let h=!1,P=L=>{let z=L.clientX-u,w=L.clientY-p;!h&&(Math.abs(z)>5||Math.abs(w)>5)&&(h=!0,E(e)),h&&we({x:L.clientX,y:L.clientY})},m=L=>{window.removeEventListener("pointermove",P),window.removeEventListener("pointerup",m),h&&it(e,L)};window.addEventListener("pointermove",P),window.addEventListener("pointerup",m)}},rt=(e,l)=>{l.preventDefault();let s=r.panels[e];if(!s)return;let p=b.get(s.component)?.defaultOptions,h=[];if(p?.canDrag!==!1&&h.push({label:U(O.floatWindow,H),icon:tt.float,action:()=>v(e)}),p?.canMinimize!==!1&&h.push({label:U(O.minimizePanel,H),icon:tt.minimize,action:()=>T(e)}),h.length>0&&p?.canClose!==!1&&h.push({separator:!0}),p?.canClose!==!1&&h.push({label:U(O.closeTab,H),icon:tt.close,action:()=>B(e)}),h.length===0)return;let P=S(e),m=P.length>0?[...h,{separator:!0},...P]:h;ne.current?.show({event:l,contextMenu:{items:m}})},Fe=(e,l)=>{l.preventDefault(),te(null),ne.current?.show({event:l,contextMenu:{items:[{label:U(O.restorePanel,H),icon:tt.restore,action:()=>x(e)},{label:U(O.maximizePanel,H),icon:tt.maximize,action:()=>M(e)},{separator:!0},{label:U(O.closePanel,H),icon:tt.close,action:()=>B(e)}]}})};(0,N.useEffect)(()=>{let e=Object.keys(r.panels);for(let l of Array.from(ut.keys()))e.includes(l)||ut.delete(l)},[r.panels]),(0,N.useEffect)(()=>{let e=()=>{r.draggedPanelId!==null&&(E(null),_(null),Oe(null))};return window.addEventListener("blur",e),()=>{window.removeEventListener("blur",e)}},[r.draggedPanelId]);let Ke=(0,N.useRef)(null),[ke,st]=(0,N.useState)({width:1024,height:768});(0,N.useEffect)(()=>{let e=Ke.current;if(!e)return;let l=!1,s=new ResizeObserver(u=>{if(!u||u.length===0)return;let p=u[0].contentRect;if(process.env.NODE_ENV==="development"&&p.height<10&&!l){l=!0;let h=e,P=e.parentElement;for(;P&&P!==document.documentElement&&P.getBoundingClientRect().height<10;){h=P;P=P.parentElement}let m=h.tagName.toLowerCase(),L=h.id?` id="${h.id}"`:"",z=h.className?` class="${h.className}"`:"",w=h===e?"the WindowManager container itself":`a wrapper element: <${m}${L}${z}>`;console.warn(`[react-dockable-desktop] Workspace height is 0px \u2014 the workspace will be invisible.
7
+
8
+ Zero height found at: ${w}
9
+
10
+ Root cause: in CSS, "height: 100%" only works when the parent has an explicit height.
11
+ If any ancestor has height: auto (the default for <div>), the chain breaks and
12
+ everything inside collapses to 0px.
13
+
14
+ Fix options:
15
+ 1. Use height: 100vh directly on the workspace wrapper:
16
+ <div style={{ height: '100vh', overflow: 'hidden' }}>
17
+ <WindowManager />
18
+ </div>
19
+
20
+ 2. Use CSS Grid/Flex and let the workspace fill remaining space:
21
+ .layout { display: flex; flex-direction: column; height: 100vh; }
22
+ .workspace { flex: 1; min-height: 0; }
23
+
24
+ 3. Verify styles.css is imported \u2014 it anchors html, body, #root to 100% height.`)}st({width:Math.max(100,p.width),height:Math.max(100,p.height)})});return s.observe(e),()=>{s.disconnect()}},[]),(0,N.useEffect)(()=>{let e=Ke.current;if(!e)return;let l=()=>{let p=tn(e);R(p?"rtl":"ltr")};l();let s=new MutationObserver(l);s.observe(document.documentElement,{attributes:!0,attributeFilter:["dir"]}),s.observe(document.body,{attributes:!0,attributeFilter:["dir"]});let u=e.closest("[dir]");return u&&u!==document.documentElement&&u!==document.body&&s.observe(u,{attributes:!0,attributeFilter:["dir"]}),()=>{s.disconnect()}},[R]),(0,N.useEffect)(()=>{let e=ke.width,l=ke.height;r.floating.forEach(s=>{let u=typeof s.width=="string"?parseFloat(s.width):s.width,p=typeof s.height=="string"?parseFloat(s.height):s.height,h=typeof s.x=="string"?parseFloat(s.x):s.x,P=typeof s.y=="string"?parseFloat(s.y):s.y,m=u,L=p,z=h,w=P,G=!1;m>e&&(m=Math.max(200,e-20),G=!0),L>l&&(L=Math.max(150,l-40),G=!0);let j=10;if(s.stickyRight)z=e-m-j,G=!0;else{let Y=e-100;z>Y&&(z=Math.max(0,Y),G=!0)}if(s.stickyBottom)w=l-L-j,G=!0;else{let Y=l-40;w>Y&&(w=Math.max(0,Y),G=!0)}G&&k(s.id,{x:z,y:w,width:m,height:L})})},[ke,r.floating,k]),(0,N.useEffect)(()=>{let e=l=>{if(l.button!==0)return;let s=l.target;if(!s||typeof s.closest!="function")return;let u=s.closest(".floating-window");if(u){let h=u.getAttribute("data-window-id");h&&(g(h),D(h));return}let p=s.closest(".workspace-panel");if(p){let h=p.getAttribute("data-active-panel-id");h&&g(h)}};return document.addEventListener("pointerdown",e),()=>{document.removeEventListener("pointerdown",e)}},[D,g]);let Dt=(e,l)=>{let s=r.floating.find(w=>w.id===e);if(!s||s.maximized)return;D(e);let u=l.currentTarget,p=u.closest(".floating-window"),h=l.clientX,P=l.clientY,m=p?p.offsetLeft:0,L=p?p.offsetTop:0,z=()=>{let w=se.current,G=Se.current,j=De.current;if(j)A(e,j);else if(G){let Y=G.index;G.side==="right"&&(Y+=1),F(e,G.leafId,Y)}else w&&W(e,w.leafId,w.position);Ve()};if(l.pointerType==="touch"){let w=l.pointerId,G=!1,j=()=>{G=!0,clearTimeout(ue),u.removeEventListener("pointermove",Y),u.removeEventListener("pointerup",j),u.removeEventListener("pointercancel",j)},Y=ye=>{Math.hypot(ye.clientX-h,ye.clientY-P)>Xe&&j()},ue=setTimeout(()=>{if(G)return;u.removeEventListener("pointermove",Y),u.removeEventListener("pointerup",j),u.removeEventListener("pointercancel",j);try{u.setPointerCapture(w)}catch{return}u.classList.add("long-press-active"),E(e);let ye=Ie=>{let yt=Ie.clientX-h,Pt=Ie.clientY-P;k(e,{x:m+yt,y:L+Pt,stickyRight:!1,stickyBottom:!1}),ot(Ie.clientX,Ie.clientY)},Ae=()=>{u.classList.remove("long-press-active"),u.removeEventListener("pointermove",ye),u.removeEventListener("pointerup",Ae),u.removeEventListener("pointercancel",Be),z()},Be=()=>{u.classList.remove("long-press-active"),u.removeEventListener("pointermove",ye),u.removeEventListener("pointerup",Ae),u.removeEventListener("pointercancel",Be),Ve()};u.addEventListener("pointermove",ye),u.addEventListener("pointerup",Ae),u.addEventListener("pointercancel",Be)},Ye);u.addEventListener("pointermove",Y),u.addEventListener("pointerup",j),u.addEventListener("pointercancel",j)}else{let w=!1,G=Y=>{let ue=Y.clientX-h,ye=Y.clientY-P;!w&&(Math.abs(ue)>5||Math.abs(ye)>5)&&(w=!0,E(e)),w&&k(e,{x:m+ue,y:L+ye,stickyRight:!1,stickyBottom:!1})},j=()=>{window.removeEventListener("pointermove",G),window.removeEventListener("pointerup",j),w&&z()};window.addEventListener("pointermove",G),window.addEventListener("pointerup",j)}},Te=(e,l,s)=>{s.stopPropagation();let u=r.floating.find(Ct=>Ct.id===e);if(!u||u.maximized)return;D(e);let p=s.currentTarget;p.setPointerCapture(s.pointerId);let h=s.clientX,P=s.clientY,m=p.closest(".floating-window"),L=m?m.offsetWidth:400,z=m?m.offsetHeight:300,w=m?m.offsetLeft:0,G=m?m.offsetTop:0,j=ke.width,Y=ke.height,ue=typeof u.x=="string"?parseFloat(u.x):u.x,ye=typeof u.y=="string"?parseFloat(u.y):u.y,Ae=typeof u.width=="string"?parseFloat(u.width):u.width,Be=typeof u.height=="string"?parseFloat(u.height):u.height,Ie=l==="se"&&Math.abs(ue+Ae-j)<4,yt=l==="se"&&Math.abs(ye+Be-Y)<4,Pt=Ct=>{let $t=Ct.clientX-h,Yt=Ct.clientY-P,at=w,lt=G,je=L,Ue=z;l.includes("e")&&(je=Math.max(200,L+$t)),l.includes("w")&&(je=Math.max(200,L-$t),at=w+L-je),l.includes("s")&&(Ue=Math.max(150,z+Yt)),l.includes("n")&&(Ue=Math.max(150,z-Yt),lt=G+z-Ue),Ie&&(at=j-je,at<0&&(at=0,je=j)),yt&&(lt=Y-Ue,lt<0&&(lt=0,Ue=Y)),k(e,{x:at,y:lt,width:je,height:Ue,stickyRight:Ie,stickyBottom:yt})},xt=()=>{p.removeEventListener("pointermove",Pt),p.removeEventListener("pointerup",xt),p.removeEventListener("pointercancel",xt)};p.addEventListener("pointermove",Pt),p.addEventListener("pointerup",xt),p.addEventListener("pointercancel",xt)},bt=e=>{if(Q.current){let l=e==="left"?-150:150;Q.current.scrollBy({left:l,behavior:"smooth"})}},o=(0,N.useCallback)(()=>{X.current&&clearTimeout(X.current),le(!0)},[]),f=(0,N.useCallback)(()=>{X.current=setTimeout(()=>le(!1),400)},[]);(0,N.useEffect)(()=>{i==="autohide"&&r.minimized.length>ee.current&&(X.current&&clearTimeout(X.current),le(!0),X.current=setTimeout(()=>le(!1),2e3)),ee.current=r.minimized.length},[r.minimized.length,i]);let[a,c]=(0,N.useState)("dark");return(0,N.useEffect)(()=>{let e=()=>{let s=document.documentElement.getAttribute("data-color-scheme")==="light"?"light":"dark";c(s)};e();let l=new MutationObserver(e);return l.observe(document.documentElement,{attributes:!0,attributeFilter:["data-color-scheme"]}),()=>l.disconnect()},[]),(0,N.useEffect)(()=>(t?document.documentElement.setAttribute("data-workspace-skin",t):document.documentElement.removeAttribute("data-workspace-skin"),()=>{document.documentElement.removeAttribute("data-workspace-skin")}),[t]),(0,d.jsxs)("div",{"data-workspace-skin":t,"data-color-scheme":a,style:{display:"flex",flexDirection:"column",position:"relative",width:"100%",height:"100%",overflow:"hidden",userSelect:"none"},dir:r.dir,children:[(0,d.jsxs)("div",{ref:Ke,className:r.draggedPanelId?"dragging-active":void 0,style:{flexGrow:1,width:"100%",position:"relative",overflow:"hidden"},children:[r.draggedPanelId!==null&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("div",{"data-edge-trigger":"left",className:"workspace-edge-trigger edge-trigger-left",onPointerEnter:()=>ve("left"),onPointerLeave:()=>ve(null)}),(0,d.jsx)("div",{"data-edge-trigger":"right",className:"workspace-edge-trigger edge-trigger-right",onPointerEnter:()=>ve("right"),onPointerLeave:()=>ve(null)}),(0,d.jsx)("div",{"data-edge-trigger":"top",className:"workspace-edge-trigger edge-trigger-top",onPointerEnter:()=>ve("top"),onPointerLeave:()=>ve(null)}),(0,d.jsx)("div",{"data-edge-trigger":"bottom",className:"workspace-edge-trigger edge-trigger-bottom",onPointerEnter:()=>ve("bottom"),onPointerLeave:()=>ve(null)})]}),r.draggedPanelId!==null&&Ne!==null&&(0,d.jsx)("div",{className:`workspace-edge-preview edge-preview-${Ne}`}),(0,d.jsx)("div",{style:{width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:r.gridRoot?(0,d.jsx)(un,{node:r.gridRoot,path:[],onTabRightClick:rt,activeDropZone:re,onHoverDropZone:ht,onTabDragStart:vt,hoveredTab:ft,onTabHover:mt,defaultPanelIcon:n,onRequestClosePanel:B}):(0,d.jsx)("div",{className:"empty-workspace-grid",children:"Grid Empty"})}),r.floating.map(e=>{let l=r.panels[e.id];if(!l)return null;let s=e.maximized,u=r.draggedPanelId===e.id,p=r.activePanelId===e.id,P=b.get(l.component)?.defaultOptions;return(0,d.jsxs)("div",{"data-window-id":e.id,dir:r.dir,onPointerDownCapture:()=>{g(e.id),D(e.id)},className:`floating-window ${s?"maximized":""} ${p?"v2-window-focused":""} ${Z??""}`,style:{position:"absolute",left:s?0:typeof e.x=="number"?`${e.x}px`:e.x,top:s?0:typeof e.y=="number"?`${e.y}px`:e.y,width:s?"100%":typeof e.width=="number"?`${e.width}px`:e.width,height:s?"100%":typeof e.height=="number"?`${e.height}px`:e.height,zIndex:e.z,pointerEvents:u?"none":"auto"},children:[(0,d.jsxs)("div",{onDoubleClick:()=>M(e.id),onPointerDown:m=>{P?.canDrag!==!1&&Dt(e.id,m)},className:"floating-window-titlebar cursor-move",style:{cursor:s||P?.canDrag===!1?"default":"move"},children:[(0,d.jsxs)("span",{className:"floating-window-title",children:[(0,d.jsx)("span",{className:"window-title-icon",children:P?.icon||n||Gt}),(0,d.jsxs)("span",{children:[U(l.title,H),l.dirty?" *":""]})]}),(0,d.jsxs)("div",{className:"fw-titlebar-actions",style:{gap:"var(--header-button-gap, 4px)"},onPointerDown:m=>m.stopPropagation(),children:[P?.renderHeaderActions&&(0,d.jsx)("div",{className:"window-header-actions",children:P.renderHeaderActions(e.id)}),S(e.id).length>0&&(0,d.jsx)("button",{type:"button",className:"custom-tab-btn btn-more-actions",title:"More actions",onClick:m=>{m.stopPropagation();let L=S(e.id);L.length!==0&&ne.current?.show({event:m,contextMenu:{items:L}})},children:(0,d.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"currentColor",style:{display:"block"},children:[(0,d.jsx)("circle",{cx:"12",cy:"5",r:"2"}),(0,d.jsx)("circle",{cx:"12",cy:"12",r:"2"}),(0,d.jsx)("circle",{cx:"12",cy:"19",r:"2"})]})}),P?.canDrag!==!1&&(0,d.jsx)("button",{type:"button",title:U(O.windowAnchoringOptions,H),onClick:m=>{let L=!!e.stickyRight,z=!!e.stickyBottom;ne.current?.show({event:m,contextMenu:{items:[{label:U(O.anchorToRightEdge,H),checkbox:{active:!0,enabled:!0,value:L},action:()=>{let w=ke.width,G=typeof e.width=="string"?parseFloat(e.width):e.width;L?k(e.id,{stickyRight:!1}):k(e.id,{x:w-G-10,stickyRight:!0})}},{label:U(O.anchorToBottomEdge,H),checkbox:{active:!0,enabled:!0,value:z},action:()=>{let w=ke.height,G=typeof e.height=="string"?parseFloat(e.height):e.height;z?k(e.id,{stickyBottom:!1}):k(e.id,{y:w-G-10,stickyBottom:!0})}}]}})},className:"custom-tab-btn btn-anchor-tab",children:(0,d.jsxs)("svg",{className:`anchor-icon ${e.stickyRight&&e.stickyBottom?"anchor-sticky-both":e.stickyRight?"anchor-sticky-right":e.stickyBottom?"anchor-sticky-bottom":""}`,width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[(0,d.jsx)("circle",{cx:"12",cy:"5",r:"2"}),(0,d.jsx)("path",{d:"M12 7v7m0 0a4 4 0 0 1-4-4M12 14a4 4 0 0 0 4-4M5 18h14"})]})}),(0,d.jsx)("button",{type:"button",title:s?U(O.restoreSize,H):U(O.maximize,H),onClick:()=>M(e.id),className:"custom-tab-btn btn-maximize-tab",children:(0,d.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,d.jsx)("rect",{x:"4",y:"4",width:"16",height:"16",rx:"1.5"})})}),P?.canMinimize!==!1&&(0,d.jsx)("button",{type:"button",title:U(O.minimize,H),onClick:()=>T(e.id),className:"custom-tab-btn btn-minimize-tab",children:(0,d.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3",children:(0,d.jsx)("path",{d:"M5 12h14"})})}),P?.canClose!==!1&&(0,d.jsx)("button",{type:"button",title:U(O.close,H),onClick:()=>B(e.id),className:"custom-tab-btn btn-close-tab",children:(0,d.jsx)("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3",children:(0,d.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]})]}),(0,d.jsx)("div",{className:C??void 0,style:{flexGrow:1,width:"100%",overflow:"hidden",position:"relative",isolation:"isolate"},children:(0,d.jsx)(cn,{panelId:e.id},e.id)}),!s&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("div",{onPointerDown:m=>Te(e.id,"n",m),className:"resize-handle resize-n"}),(0,d.jsx)("div",{onPointerDown:m=>Te(e.id,"ne",m),className:"resize-handle resize-ne"}),(0,d.jsx)("div",{onPointerDown:m=>Te(e.id,"e",m),className:"resize-handle resize-e"}),(0,d.jsx)("div",{onPointerDown:m=>Te(e.id,"se",m),className:"resize-handle resize-se"}),(0,d.jsx)("div",{onPointerDown:m=>Te(e.id,"s",m),className:"resize-handle resize-s"}),(0,d.jsx)("div",{onPointerDown:m=>Te(e.id,"sw",m),className:"resize-handle resize-sw"}),(0,d.jsx)("div",{onPointerDown:m=>Te(e.id,"w",m),className:"resize-handle resize-w"}),(0,d.jsx)("div",{onPointerDown:m=>Te(e.id,"nw",m),className:"resize-handle resize-nw"})]})]},e.id)})]}),(i==="always"||r.minimized.length>0)&&(0,d.jsxs)("div",{className:["taskbar-footer-container",`taskbar-mode-${i}`,i==="autohide"&&oe?"taskbar-expanded":""].filter(Boolean).join(" "),style:{height:"48px",zIndex:100},onPointerEnter:i==="autohide"?o:void 0,onPointerLeave:i==="autohide"?f:void 0,children:[i==="autohide"&&(0,d.jsx)("div",{className:"taskbar-peek-handle"}),(0,d.jsx)("button",{type:"button",onClick:()=>bt("left"),className:"taskbar-nav-btn",style:{display:r.minimized.length>4?"block":"none"},children:"\u25C0"}),(0,d.jsx)("div",{ref:Q,className:"taskbar-items-container",style:{scrollSnapType:"x mandatory"},children:r.minimized.map(e=>{let s=b.get(e.component)?.defaultOptions?.icon||n||Gt;return(0,d.jsx)("div",{onClick:()=>{he.current!=="touch"&&(te(null),x(e.id))},onContextMenu:u=>Fe(e.id,u),onPointerDown:u=>{if(he.current=u.pointerType,u.pointerType!=="touch")return;let p=u.currentTarget,h=u.clientX,P=u.clientY,m=u.pointerId,L=!1,z=()=>{L=!0,clearTimeout(j),p.removeEventListener("pointermove",G),p.removeEventListener("pointerup",w),p.removeEventListener("pointercancel",z)},w=()=>{z();let Y=p.getBoundingClientRect();V?.id===e.id?(x(e.id),te(null)):te({id:e.id,rect:Y,title:e.title,component:e.component,fromTouch:!0})},G=Y=>{Math.hypot(Y.clientX-h,Y.clientY-P)>Xe&&z()},j=setTimeout(()=>{if(L)return;p.removeEventListener("pointermove",G),p.removeEventListener("pointerup",w),p.removeEventListener("pointercancel",z);try{p.setPointerCapture(m)}catch{return}navigator.vibrate&&navigator.vibrate(10);let Y=ue=>{p.removeEventListener("pointerup",Y),p.removeEventListener("pointercancel",Y),Fe(e.id,ue)};p.addEventListener("pointerup",Y),p.addEventListener("pointercancel",Y)},Ye);p.addEventListener("pointermove",G),p.addEventListener("pointerup",w),p.addEventListener("pointercancel",z)},onPointerEnter:u=>{if(u.pointerType==="touch"||J)return;ae.current&&clearTimeout(ae.current);let p=u.currentTarget.getBoundingClientRect();u.clientX>=p.left&&u.clientX<=p.right&&u.clientY>=p.top&&u.clientY<=p.bottom&&te({id:e.id,rect:p,title:e.title,component:e.component})},onPointerLeave:u=>{u.pointerType!=="touch"&&(ae.current=setTimeout(()=>{te(null)},150))},className:"taskbar-glassmorphic-item",style:{backdropFilter:"blur(6px)",transition:"all 0.2s",cursor:"pointer",scrollSnapAlign:"start",width:"38px",height:"38px",position:"relative",padding:0},children:(0,d.jsx)("span",{className:"taskbar-item-icon",children:s})},e.id)})}),V&&(0,_t.createPortal)((0,d.jsxs)("div",{className:"taskbar-item-tooltip",dir:r.dir,style:{position:"fixed",left:`${V.rect.left+V.rect.width/2}px`,top:`${V.rect.top-8}px`,transform:"translateX(-50%) translateY(-100%)",opacity:1,pointerEvents:"auto",zIndex:999999},onPointerEnter:()=>{ae.current&&clearTimeout(ae.current)},onPointerLeave:e=>{e.pointerType!=="touch"&&te(null)},onClick:()=>{x(V.id),te(null)},onContextMenu:e=>Fe(V.id,e),onPointerDown:e=>{if(e.pointerType!=="touch")return;let l=V.id,s=e.currentTarget,u=e.clientX,p=e.clientY,h=e.pointerId,P=!1,m=()=>{P=!0,clearTimeout(z),s.removeEventListener("pointermove",L),s.removeEventListener("pointerup",m),s.removeEventListener("pointercancel",m)},L=w=>{Math.hypot(w.clientX-u,w.clientY-p)>Xe&&m()},z=setTimeout(()=>{if(P)return;s.removeEventListener("pointermove",L),s.removeEventListener("pointerup",m),s.removeEventListener("pointercancel",m);try{s.setPointerCapture(h)}catch{return}navigator.vibrate&&navigator.vibrate(10);let w=G=>{s.removeEventListener("pointerup",w),s.removeEventListener("pointercancel",w),Fe(l,G)};s.addEventListener("pointerup",w),s.addEventListener("pointercancel",w)},Ye);s.addEventListener("pointermove",L),s.addEventListener("pointerup",m),s.addEventListener("pointercancel",m)},children:[(0,d.jsxs)("div",{className:"tooltip-header-row",children:[(0,d.jsxs)("span",{className:"tooltip-title-text text-truncate",style:{maxWidth:"140px"},children:[U(V.title,H),r.panels[V.id]?.dirty?" *":""]}),(0,d.jsx)("span",{onClick:e=>{e.stopPropagation(),B(V.id),te(null)},title:U(O.closePanel,H),className:"tooltip-close-x",children:(0,d.jsx)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,d.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),(0,d.jsx)(Gn,{panelId:V.id})]}),document.body),(0,d.jsx)("button",{type:"button",onClick:()=>bt("right"),className:"taskbar-nav-btn",style:{display:r.minimized.length>4?"block":"none"},children:"\u25B6"})]}),Object.keys(r.panels).map(e=>{let l=r.panels[e];if(!l)return null;let s=ln(e);return(0,_t.createPortal)((0,d.jsx)($n,{panelId:e,children:(0,d.jsx)("div",{style:{width:"100%",height:"100%"},children:_n(e,l.component,b)})}),s,e)}),(0,d.jsx)(sn.JsonContextMenu,{ref:ne,id:"workspace-context-menu",theme:"dark",onShow:()=>K(!0),onHide:()=>K(!1)}),r.draggedPanelId!==null&&!r.floating.some(e=>e.id===r.draggedPanelId)&&(0,d.jsxs)("div",{className:"drag-ghost-tab",style:{left:be.x+12,top:be.y+12,zIndex:1e5},children:["\u{1F4C4} ",U(r.panels[r.draggedPanelId]?.title,H)||"Tab"]})]})},pn=Xn;var zt=class{registry;initialState;config;_actions=null;_initialized=!1;_pendingCalls=[];_pendingOpenPanelIds=new Set;_pendingSubscriptions=[];_disconnectedWarnTimer=null;constructor(n={}){if(this.registry=new qe,this.initialState=n.initialState??null,this.config={formatMessage:n.formatMessage,predefinedMessages:n.predefinedMessages,dir:n.dir},n.panels)for(let[i,r]of Object.entries(n.panels))this.registry.register(i,r.component,r.defaultOptions)}_connect(n){this._actions=n,this._disconnectedWarnTimer!==null&&(clearTimeout(this._disconnectedWarnTimer),this._disconnectedWarnTimer=null),this._initialized||(this._initialized=!0);for(let r of this._pendingSubscriptions)r.unsub=n.subscribe(r.event,r.callback);let i=this._pendingCalls.splice(0);for(let r of i)r(n)}_disconnect(){this._actions=null;for(let n of this._pendingSubscriptions)n.unsub?.(),n.unsub=null}get isConnected(){return this._actions!==null}_startWarnTimer(){this._disconnectedWarnTimer===null&&(this._disconnectedWarnTimer=setTimeout(()=>{!this.isConnected&&this._pendingCalls.length>0&&console.error("[react-dockable-desktop] WorkspaceClient has "+this._pendingCalls.length+" queued call(s) but was never connected to a WindowManagerProvider. Did you forget client={workspace} on <WindowManagerProvider>?")},process.env.NODE_ENV==="production"?5e3:1e3))}_dispatch(n){this._actions?n(this._actions):(this._pendingCalls.push(n),this._startWarnTimer())}_subscribeRaw(n,i){if(this._actions)return this._actions.subscribe(n,i);let r={event:n,callback:i,unsub:null};return this._pendingSubscriptions.push(r),()=>{r.unsub?.(),r.unsub=null;let b=this._pendingSubscriptions.indexOf(r);b!==-1&&this._pendingSubscriptions.splice(b,1)}}openPanel(...n){if(this._actions){this._actions.openPanel(...n);return}let i=n[0];this._pendingOpenPanelIds.has(i)||(this._pendingOpenPanelIds.add(i),this._pendingCalls.push(r=>{this._pendingOpenPanelIds.delete(i),r.openPanel(...n)}),this._startWarnTimer())}closePanel(n){this._dispatch(i=>i.closePanel(n))}minimizePanel(n){this._dispatch(i=>i.minimizePanel(n))}restorePanel(n){this._dispatch(i=>i.restorePanel(n))}floatPanel(...n){this._dispatch(i=>i.floatPanel(...n))}dockPanel(...n){this._dispatch(i=>i.dockPanel(...n))}maximizePanel(n){this._dispatch(i=>i.maximizePanel(n))}focusPanel(n){this._dispatch(i=>i.focusPanel(n))}isOpen(n){return this._actions?.isOpen(n)??!1}getOpenPanelIds(){return this._actions?.getOpenPanelIds()??[]}saveLayout(){return this._actions?.saveLayout()??""}loadLayout(n){return this._actions?this._actions.loadLayout(n):(this._pendingCalls.push(i=>{i.loadLayout(n)}),!1)}setDirection(n){this._dispatch(i=>i.setDirection(n))}publish(n,i){this._dispatch(r=>r.publish(n,i))}subscribe(n,i){return this._subscribeRaw(n,i)}onPanelOpen(n){return this._subscribeRaw("panel:opened",i=>{let r=i;n(r.id,r.component)})}onPanelClose(n){return this._subscribeRaw("panel:closed",i=>{n(i.id)})}onPanelMinimize(n){return this._subscribeRaw("panel:minimized",i=>{n(i.id)})}onPanelRestore(n){return this._subscribeRaw("panel:restored",i=>{n(i.id)})}};var Eo=require("react");var ze=require("react"),fn=require("react/jsx-runtime"),gn=(0,ze.createContext)(null),pt=({children:t})=>{let[n,i]=(0,ze.useState)({}),[r,b]=(0,ze.useState)({}),x=(0,ze.useMemo)(()=>({getActiveInGroup:T=>n[T]??null,setActiveInGroup:(T,I)=>i(M=>({...M,[T]:I})),isModifierActive:T=>r[T]??!1,setModifierActive:(T,I)=>b(M=>({...M,[T]:I})),toggleModifier:T=>b(I=>({...I,[T]:!I[T]}))}),[n,r]);return(0,fn.jsx)(gn.Provider,{value:x,children:t})};function gt(){let t=(0,ze.useContext)(gn);return t||(console.warn("useToolbar() called outside <DockableDesktopProvider>. Returning no-op."),{getActiveInGroup:()=>null,setActiveInGroup:()=>{},isModifierActive:()=>!1,setModifierActive:()=>{},toggleModifier:()=>{}})}var Nt=require("react/jsx-runtime"),mn=t=>(0,Nt.jsx)(pt,{children:(0,Nt.jsx)(Tt,{...t,children:(0,Nt.jsx)(St,{children:t.children})})});var me=require("react");var pe=require("react/jsx-runtime"),Vn=({modal:t,index:n,isTopmost:i})=>{let{close:r,openModal:b,updateInstance:x,setDirty:T}=Ge(),I=xe(),M=Me(),{dir:k}=Re(),{modalClass:D,modalBodyClass:v}=Ee(),E=(0,me.useRef)(null),{id:W,Component:F,props:A,options:g,dirty:R,dirtyOptions:S}=t,$=g,[H,O]=(0,me.useState)($.icon||null),B=(0,me.useRef)($);B.current=$;let Z=U($.title,I),C=(0,me.useCallback)(async J=>{if(J?.force){r(W);return}if(E.current){if(!await E.current())return;r(W);return}if(R){b($e,{title:S?.title||M.unsavedChangesTitle,message:S?.message||{id:M.unsavedChangesMessage.id,defaultMessage:M.unsavedChangesMessage.defaultMessage,values:{title:Z}},alert:S?.alert,alertType:S?.alertType||"danger",useYesNoTitles:!0,onOK:()=>r(W)},{size:"small"});return}r(W)},[r,b,W,R,S,Z,M]),Q=(0,me.useCallback)((J,K)=>T(W,J,K),[T,W]),ne=(0,me.useCallback)(J=>x(W,{options:{...B.current,title:J}}),[x,W]),oe=(0,me.useCallback)(J=>O(J),[]),le=(0,me.useCallback)(J=>(E.current=J,()=>{E.current=null}),[]),X=(0,me.useMemo)(()=>({requestClose:C,setDirty:Q,setTitle:ne,setIcon:oe,onCloseRequested:le,containerType:"modal",instanceId:W}),[C,Q,ne,oe,le,W]),ee=R?`${Z} *`:Z,V=$.size?`v2-modal-size-${$.size}`:"v2-modal-size-auto",te=$.closable!==!1;(0,me.useEffect)(()=>{if(!i||!te)return;let J=K=>{K.key==="Escape"&&(K.stopPropagation(),C())};return document.addEventListener("keydown",J),()=>document.removeEventListener("keydown",J)},[C,te,i]);let he=1e4+n*10;return(0,pe.jsxs)("div",{className:"v2-modal-overlay",style:{zIndex:he},dir:k,children:[(0,pe.jsx)("div",{className:"v2-modal-curtain",onClick:te?()=>C():void 0}),(0,pe.jsxs)("div",{className:`v2-modal-window ${V} ${D??""}`,children:[(0,pe.jsxs)("div",{className:"v2-modal-header",children:[H&&(0,pe.jsx)("div",{className:"v2-modal-icon",children:H}),(0,pe.jsx)("h4",{className:"v2-modal-title",children:ee}),te&&(0,pe.jsx)("button",{className:"v2-modal-close-button",onClick:()=>C(),title:I(M.closeTooltip),type:"button",children:(0,pe.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,pe.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),(0,pe.jsx)("div",{className:`v2-modal-body ${v??""}`,children:(0,pe.jsx)(He,{value:X,children:(0,pe.jsx)(F,{...A,panelId:W})})})]})]})},qn=()=>{let{modals:t}=Le();return t.length===0?null:(0,pe.jsx)(pe.Fragment,{children:t.map((n,i)=>(0,pe.jsx)(Vn,{modal:n,index:i,isTopmost:i===t.length-1},n.id))})},hn=qn;var fe=require("react");var de=require("react/jsx-runtime"),Wt=({panel:t,position:n,defaultWidth:i})=>{let{close:r,openModal:b,updateInstance:x,setDirty:T,registerCloseHandler:I,unregisterCloseHandler:M}=Ge(),{modals:k}=Le(),D=xe(),v=Me(),{dir:E}=Re(),{sidePanelClass:W,sidePanelBodyClass:F}=Ee(),A=(0,fe.useRef)(null),{id:g,Component:R,props:S,options:$,dirty:H,dirtyOptions:O}=t,B=$,[Z,C]=(0,fe.useState)(B.icon||null),Q=(0,fe.useRef)(B);Q.current=B;let ne=U(B.title,D),oe=(0,fe.useCallback)(async re=>{if(re?.force){r(g);return}if(A.current){if(!await A.current())return;r(g);return}if(H){b($e,{title:O?.title||v.unsavedChangesTitle,message:O?.message||{id:v.unsavedChangesMessage.id,defaultMessage:v.unsavedChangesMessage.defaultMessage,values:{title:ne}},alert:O?.alert,alertType:O?.alertType||"danger",useYesNoTitles:!0,onOK:()=>r(g)},{size:"small"});return}r(g)},[r,b,g,H,O,ne,v]),le=(0,fe.useCallback)(async()=>A.current?await A.current():!H,[H]);(0,fe.useEffect)(()=>(I(g,le),()=>M(g)),[g,le,I,M]);let X=(0,fe.useCallback)((re,_)=>T(g,re,_),[T,g]),ee=(0,fe.useCallback)(re=>x(g,{options:{...Q.current,title:re}}),[x,g]),V=(0,fe.useCallback)(re=>C(re),[]),te=(0,fe.useCallback)(re=>(A.current=re,()=>{A.current=null}),[]),ae=(0,fe.useMemo)(()=>({requestClose:oe,setDirty:X,setTitle:ee,setIcon:V,onCloseRequested:te,containerType:n==="left"?"left-panel":"right-panel",instanceId:g}),[oe,X,ee,V,te,n,g]),he=H?`${ne} *`:ne;(0,fe.useEffect)(()=>{let re=_=>{_.key==="Escape"&&k.length===0&&oe()};return document.addEventListener("keydown",re),()=>document.removeEventListener("keydown",re)},[oe,k.length]);let J=B.width||i||400,K=typeof J=="number"?`${J}px`:J;return(0,de.jsx)("div",{className:`v2-side-panel v2-side-panel-${n} v2-side-panel-visible ${W??""}`,style:{width:K},dir:E,children:(0,de.jsxs)("div",{className:"v2-side-panel-window",children:[(0,de.jsxs)("div",{className:"v2-side-panel-header",children:[Z&&(0,de.jsx)("div",{className:"v2-side-panel-icon",children:Z}),(0,de.jsx)("h4",{className:"v2-side-panel-title",children:he}),(0,de.jsx)("button",{className:"v2-side-panel-close-button",onClick:()=>oe(),title:D(v.closeTooltip),type:"button",children:(0,de.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:(0,de.jsx)("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),(0,de.jsx)("div",{className:`v2-side-panel-body ${F??""}`,children:(0,de.jsx)(He,{value:ae,children:(0,de.jsx)(R,{...S,panelId:g})})})]})})},Kn=({defaultWidth:t})=>{let{leftPanel:n,rightPanel:i}=Le();return(0,de.jsxs)(de.Fragment,{children:[n&&(0,de.jsx)(Wt,{panel:n,position:"left",defaultWidth:t},n.id),i&&(0,de.jsx)(Wt,{panel:i,position:"right",defaultWidth:t},i.id)]})},vn=({defaultWidth:t})=>{let{leftPanel:n}=Le();return n?(0,de.jsx)(Wt,{panel:n,position:"left",defaultWidth:t},n.id):null},bn=({defaultWidth:t})=>{let{rightPanel:n}=Le();return n?(0,de.jsx)(Wt,{panel:n,position:"right",defaultWidth:t},n.id):null},yn=Kn;var q=require("react"),ce=require("react/jsx-runtime"),xn=(0,q.createContext)(null),Cn=(0,q.createContext)(null);function jn({tabId:t,onClose:n,onOpen:i,setActiveTabId:r,children:b}){let x=(0,q.useMemo)(()=>({tabId:t,onClose:n,onOpen:i,openTab:T=>r(T)}),[t,n,i,r]);return(0,ce.jsx)(Cn.Provider,{value:x,children:b})}var Pn=(0,q.memo)(function({tabs:n,activeTabId:i,isVisible:r,position:b,onTabClick:x}){return(0,ce.jsx)("div",{style:{width:r?"56px":"0px",height:"100%",overflow:"hidden",transition:"width 0.25s cubic-bezier(0.4, 0, 0.2, 1)",flexShrink:0},children:(0,ce.jsx)("div",{className:`sidebar-tabs-strip ${b}`,style:{width:"56px",height:"100%"},children:n.map(T=>{let I=i===T.id;return(0,ce.jsx)("button",{type:"button",onClick:()=>x(T.id),className:`sidebar-tab-btn${I?" active":""}`,title:T.label,"aria-pressed":I,children:T.icon},T.id)})})})});function Un({position:t,currentWidth:n,minWidth:i,maxWidth:r,onWidthChange:b,rootRef:x}){return(0,ce.jsx)("div",{className:"resizer-bar",style:{cursor:"col-resize",width:"1px",height:"100%",flexShrink:0,zIndex:20},onPointerDown:I=>{I.preventDefault();let M=I.currentTarget;M.setPointerCapture(I.pointerId);let k=I.clientX,D=n;M.classList.add("active"),document.body.classList.add("resizing-active","resizing-col-active"),x.current?.classList.add("sidebar-resizing");let v=W=>{let F=W.clientX-k,A=t==="right"?D-F:D+F;b(Math.max(i,Math.min(r,A)))},E=()=>{M.classList.remove("active"),document.body.classList.remove("resizing-active","resizing-col-active"),x.current?.classList.remove("sidebar-resizing"),M.removeEventListener("pointermove",v),M.removeEventListener("pointerup",E),M.removeEventListener("pointercancel",E)};M.addEventListener("pointermove",v),M.addEventListener("pointerup",E),M.addEventListener("pointercancel",E)}})}var wn=(0,q.forwardRef)(function({position:n="right",tabs:i,defaultWidth:r,minWidth:b=150,maxWidth:x=600,onWidthChange:T,drawerWidth:I,activeTabId:M,onActiveTabChange:k,visible:D,onVisibilityChange:v,stripVisible:E,onStripVisibilityChange:W,children:F},A){let g=M!==void 0,[R,S]=(0,q.useState)(()=>r!==void 0?r:I!==void 0&&parseInt(I,10)||220),$=(0,q.useCallback)(_=>{S(_),T?.(_)},[T]),[H,O]=(0,q.useState)(null),B=g?M:H,[Z,C]=(0,q.useState)(()=>new Set),Q=(0,q.useMemo)(()=>{let _=new Set(Z);B&&_.add(B);for(let se of i)se.eagerMount&&_.add(se.id);return _},[Z,B,i]),ne=(0,q.useRef)(B??null);(0,q.useEffect)(()=>{ne.current=B??null},[B]);let oe=(0,q.useRef)(R);(0,q.useEffect)(()=>{oe.current=R},[R]);let le=(0,q.useRef)(null),X=(0,q.useCallback)(_=>{C(_!==null?se=>{if(se.has(_))return se;let be=new Set(se);return be.add(_),be}:se=>{let be=!1,we=new Set(se);for(let Ne of se){let We=i.find(De=>De.id===Ne);We&&!We.eagerMount&&!We.preserveState&&(we.delete(Ne),be=!0)}return be?we:se}),g||O(_),k?.(_)},[g,k,i]);(0,q.useImperativeHandle)(A,()=>({openTab:_=>X(_),closeDrawer:()=>X(null),getActiveTab:()=>ne.current,show:()=>v?.(!0),hide:()=>v?.(!1),toggle:()=>v?.(D===!1),showStrip:()=>W?.(!0),hideStrip:()=>W?.(!1),setWidth:_=>$(Math.max(b,Math.min(x,_))),getWidth:()=>oe.current}),[X,D,v,W,$,b,x]);let ee=(0,q.useCallback)(_=>{X(B===_?null:_)},[B,X]),V=(0,q.useCallback)(()=>X(null),[X]),te=(0,q.useMemo)(()=>({openTab:_=>X(_),closeDrawer:()=>X(null),getActiveTab:()=>ne.current}),[X]),ae=D!==!1,he=ae&&E!==!1,J=ae&&B!=null,K=(0,ce.jsx)("div",{className:`sidebar-content-drawer ${n}`,style:{flexBasis:J?`${R}px`:"0px",flexShrink:1,flexGrow:0,minWidth:J?`${b}px`:"0px",maxWidth:J?`${x}px`:"0px",overflow:"hidden",transition:"flex-basis 0.2s cubic-bezier(0.4, 0, 0.2, 1), min-width 0.2s cubic-bezier(0.4, 0, 0.2, 1), max-width 0.2s cubic-bezier(0.4, 0, 0.2, 1)"},children:i.map(_=>{if(!Q.has(_.id))return null;let be=B===_.id,we=()=>X(_.id);return(0,ce.jsxs)("div",{style:{display:be?"flex":"none",flexDirection:"column",height:"100%",width:"100%"},children:[(0,ce.jsx)("div",{className:"sidebar-drawer-header",children:(0,ce.jsx)("span",{className:"sidebar-header-title",children:_.label})}),(0,ce.jsx)("div",{className:"sidebar-drawer-body",children:(0,ce.jsx)(jn,{tabId:_.id,onClose:V,onOpen:we,setActiveTabId:X,children:_.renderContent(_.id,V,we)})})]},_.id)})}),re=J?(0,ce.jsx)(Un,{position:n,currentWidth:R,minWidth:b,maxWidth:x,onWidthChange:$,rootRef:le}):null;return(0,ce.jsx)(xn.Provider,{value:te,children:(0,ce.jsxs)("div",{ref:le,style:{display:"flex",flexDirection:"row",width:"100%",height:"100%",overflow:"hidden"},children:[n==="left"&&(0,ce.jsx)(Pn,{tabs:i,activeTabId:B,isVisible:he,position:n,onTabClick:ee}),n==="left"&&K,n==="left"&&re,(0,ce.jsx)("div",{style:{flex:"1 1 auto",minWidth:0,overflow:"hidden"},children:F}),n==="right"&&re,n==="right"&&K,n==="right"&&(0,ce.jsx)(Pn,{tabs:i,activeTabId:B,isVisible:he,position:n,onTabClick:ee})]})})});function Rn(){let t=(0,q.useContext)(xn);return t||(console.warn("useSidebar() called outside a <Sidebar> tree. Returning no-op."),{openTab:()=>{},closeDrawer:()=>{},getActiveTab:()=>null})}function Mn(){let t=(0,q.useContext)(Cn);return t||(console.warn("useSidebarTab() called outside a <Sidebar> tab renderContent tree. Returning no-op."),{tabId:"",onOpen:()=>{},onClose:()=>{},openTab:()=>{}})}var Pe=require("react"),kn=require("react-dom");var ge=require("react/jsx-runtime");function Jn(t,n,i=8){switch(n){case"left":return{left:t.right+i,top:t.top};case"right":return{right:window.innerWidth-t.left+i,top:t.top};case"top":return{top:t.bottom+i,left:t.left};case"bottom":return{bottom:window.innerHeight-t.top+i,left:t.left}}}function Zn({item:t,position:n,toolbar:i}){let[r,b]=(0,Pe.useState)(!1),[x,T]=(0,Pe.useState)(null),I=(0,Pe.useRef)(null),M=(0,Pe.useRef)(null),k=t.activeItemId!==void 0,D=k?t.activeItemId:i.getActiveInGroup(t.id),v=t.items.find(g=>!("type"in g)&&g.id===D),E=D!==null,W=v?.icon??t.defaultIcon,F=v?.label??t.label,A=()=>{t.disabled||(!r&&I.current&&T(I.current.getBoundingClientRect()),b(g=>!g))};return(0,Pe.useEffect)(()=>{if(!r)return;let g=R=>{let S=R.target;I.current?.contains(S)||M.current?.contains(S)||b(!1)};return document.addEventListener("mousedown",g),()=>document.removeEventListener("mousedown",g)},[r]),(0,Pe.useEffect)(()=>{if(!r)return;let g=R=>{R.key==="Escape"&&b(!1)};return document.addEventListener("keydown",g),()=>document.removeEventListener("keydown",g)},[r]),(0,ge.jsxs)(ge.Fragment,{children:[(0,ge.jsx)("button",{ref:I,type:"button",className:`toolbar-btn toolbar-btn-group${E?" active":""}`,title:F,"aria-label":F,"aria-expanded":r,"aria-haspopup":"menu",disabled:t.disabled,onClick:A,children:W}),r&&x&&(0,kn.createPortal)((0,ge.jsx)("div",{ref:M,className:`toolbar-group-flyout ${n}`,style:Jn(x,n),role:"menu",children:t.items.map((g,R)=>{if("type"in g)return(0,ge.jsx)("div",{className:"toolbar-group-flyout-sep",role:"separator"},`sep-${R}`);let S=D===g.id;return(0,ge.jsxs)("button",{type:"button",className:`toolbar-group-flyout-item${S?" active":""}`,disabled:g.disabled,role:"menuitem","aria-pressed":S,onClick:()=>{k?t.onActiveItemChange?.(g.id):i.setActiveInGroup(t.id,g.id),g.onActivate?.(g.id),b(!1)},children:[(0,ge.jsx)("span",{className:"toolbar-group-flyout-icon",children:g.icon}),(0,ge.jsx)("span",{className:"toolbar-group-flyout-label",children:g.label}),g.shortcut&&(0,ge.jsx)("span",{className:"toolbar-group-flyout-shortcut",children:g.shortcut})]},g.id)})}),document.body)]})}function Qn(t,n,i,r){switch(t.type){case"separator":return(0,ge.jsx)("div",{className:"toolbar-separator",role:"separator"},`sep-${n}`);case"action":return(0,ge.jsx)("button",{type:"button",className:"toolbar-btn toolbar-btn-action",title:t.label,"aria-label":t.label,disabled:t.disabled,onClick:t.onClick,children:t.icon},t.id);case"radio":{let b=i.getActiveInGroup(t.group)===t.id;return(0,ge.jsx)("button",{type:"button",className:`toolbar-btn toolbar-btn-radio${b?" active":""}`,title:t.label,"aria-label":t.label,"aria-pressed":b,disabled:t.disabled,onClick:()=>{i.setActiveInGroup(t.group,t.id),t.onActivate?.(t.id)},children:t.icon},t.id)}case"toggle":{let b=i.isModifierActive(t.id);return(0,ge.jsx)("button",{type:"button",className:`toolbar-btn toolbar-btn-toggle${b?" active":""}`,title:t.label,"aria-label":t.label,"aria-pressed":b,disabled:t.disabled,onClick:()=>{i.toggleModifier(t.id),t.onToggle?.(!b)},children:t.icon},t.id)}case"group":return(0,ge.jsx)(Zn,{item:t,position:r,toolbar:i},t.id)}}var Tn=(0,Pe.forwardRef)(function({position:n="left",items:i,visible:r,onVisibilityChange:b,className:x,style:T},I){let M=gt(),k=n==="left"||n==="right";(0,Pe.useImperativeHandle)(I,()=>({show:()=>b?.(!0),hide:()=>b?.(!1),toggle:()=>b?.(r===!1)}),[r,b]);let D=r!==!1?{}:k?{width:"0px"}:{height:"0px"};return(0,ge.jsx)("div",{className:`toolbar-strip ${n}${x?` ${x}`:""}`,role:"toolbar","aria-orientation":k?"vertical":"horizontal",style:{...D,...T},children:i.map((v,E)=>Qn(v,E,M,n))})});0&&(module.exports={ConfirmationForm,DockableDesktopProvider,FormContainerContext,FormContainerProvider,LeftPanelRenderer,ModalStackRenderer,PanelProvider,PanelRegistry,PanelRegistryClass,RightPanelRenderer,SidePanelRenderer,Sidebar,Toolbar,ToolbarProvider,WindowManager,WindowManagerProvider,WorkspaceClient,defaultPredefinedMessages,formatLabel,useFormContainer,useFormatMessage,usePanelActions,usePanelContext,usePanelContextMenu,usePanelId,usePanelState,usePredefinedMessages,useRegistry,useSidebar,useSidebarTab,useStyleClasses,useToolbar,useWindowManagerActions,useWindowManagerState});
4
25
  //# sourceMappingURL=index.cjs.map