react-dockable-desktop 2.0.0 → 3.0.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 +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +111 -64
- package/dist/index.d.ts +111 -64
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Ct,{useState as Pe,useRef as pe,useEffect as oe}from"react";import{createPortal as Bt}from"react-dom";import{createContext as ze,useContext as we,useState as Ut,useRef as Ae,useMemo as ut,useCallback as G,useEffect as gt}from"react";var Se=class{registry=new Map;register(o,a,m){this.registry.set(o,{Component:a,defaultOptions:m})}get(o){return this.registry.get(o)}getRegisteredIds(){return Array.from(this.registry.keys())}},nt=new Se;var De={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"}};import{jsx as Te}from"react/jsx-runtime";var kt=ze(null),ft=ze(null),It=ze(null),St=ze(De),Tt=ze({}),he=()=>we(Tt),zt=ze(nt),Be=()=>we(zt),pt=class{listeners={};subscribe(o,a){return this.listeners[o]||(this.listeners[o]=[]),this.listeners[o].push(a),()=>{this.listeners[o]=this.listeners[o].filter(m=>m!==a)}}publish(o,a){this.listeners[o]&&this.listeners[o].forEach(m=>m(a))}},Jt={type:"leaf",id:"group-default",panels:[],activePanelId:null};function Vt(s){if(s)try{let o=JSON.parse(s);if(o.gridRoot&&Array.isArray(o.floating)&&Array.isArray(o.minimized)&&o.panels)return{gridRoot:o.gridRoot,floating:o.floating,minimized:o.minimized,panels:o.panels,activePanelId:Object.keys(o.panels)[0]??null}}catch{}return{gridRoot:Jt,floating:[],minimized:[],panels:{},activePanelId:null}}var Zt=({children:s,client:o,formatMessage:a,predefinedMessages:m,dir:N,modalClass:k,modalBodyClass:A,sidePanelClass:D,sidePanelBodyClass:M,windowClass:R,windowBodyClass:O})=>{let g=Ae(o?.registry??nt).current,T=o?.config.formatMessage??a,b=o?.config.predefinedMessages??m,I=o?.config.dir??N,[W,l]=Ut(()=>({...Vt(o?.initialState??null),draggedPanelId:null,dir:I||"ltr",isRtl:I==="rtl"})),w=Ae(W);w.current=W;let y=Ae({}),f=ut(()=>({...De,...b}),[b]),B=Ae(new pt),L=Ae(1e3),P=G((e,t)=>B.current.subscribe(e,t),[]),E=G((e,t)=>{B.current.publish(e,t)},[]),$=G((e,t)=>{let n=typeof e.x=="string"?parseFloat(e.x):e.x,i=typeof e.y=="string"?parseFloat(e.y):e.y,c=typeof e.width=="string"?parseFloat(e.width):e.width,d=typeof e.height=="string"?parseFloat(e.height):e.height;isNaN(n)&&(n=300),isNaN(i)&&(i=150),isNaN(c)&&(c=450),isNaN(d)&&(d=350);let C=H=>t.some(U=>{let _=typeof U.x=="string"?parseFloat(U.x):U.x,q=typeof U.y=="string"?parseFloat(U.y):U.y;return!U.maximized&&Math.abs(_-H.x)<20&&Math.abs(q-H.y)<20}),h=0;for(;C({x:n,y:i})&&h<10;)n+=30,i+=30,h++;let x=Math.max(100,window.innerWidth||1024),S=Math.max(100,window.innerHeight||768);return(n+c>x||i+d>S)&&(n=100+h%5*30,i=100+h%5*30),n=Math.max(0,Math.min(n,x-100)),i=Math.max(0,Math.min(i,S-40)),{x:n,y:i,width:c,height:d}},[]),z=G(e=>{L.current+=1;let t=L.current;l(n=>{let i=n.panels[e];if(!i)return n;if(i.state==="floating")return{...n,floating:n.floating.map(c=>c.id===e?{...c,z:t}:c),activePanelId:e};if(i.state==="docked"){let c=d=>d.type==="leaf"?d.panels.includes(e)?{...d,activePanelId:e}:d:{...d,children:d.children.map(c)};return{...n,gridRoot:c(n.gridRoot),activePanelId:e}}return{...n,activePanelId:e}})},[]),F=(e,t)=>{if(e.type==="leaf"){let n=e.panels.indexOf(t);if(n===-1)return e;let i=e.panels.filter(C=>C!==t),c=e.activePanelId===t?i[n]||i[n-1]||i[0]||null:e.activePanelId,d={...e,panels:i,activePanelId:c};return i.length===0&&!e.keepOnEmpty?null:d}else{let n=e.children.map(d=>F(d,t)).filter(d=>d!==null);if(n.length===0)return null;if(n.length===1)return n[0];let i=e.sizes.slice(0,n.length),c=i.reduce((d,C)=>d+C,0);return{...e,children:n,sizes:i.map(d=>d/c)}}},Y=(e,t,n)=>{if(e.type==="leaf"){if(e.id===t){let i=e.panels.includes(n)?e.panels:[...e.panels,n];return{...e,panels:i,activePanelId:n}}return e}else return{...e,children:e.children.map(i=>Y(i,t,n))}},ee=e=>{if(e.type==="leaf")return e.id;for(let t of e.children){let n=ee(t);if(n)return n}return null},se=G((e,t,n)=>{l(i=>{let c=i.panels[e],d=g.get(t),C=n?.title||n?.title||d?.defaultOptions?.title||e,h=n?.initialTarget||d?.defaultOptions?.initialTarget||"docked",x=d?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350};if(c)if(c.state==="minimized"){let _=i.minimized.filter(q=>q.id!==e);if(h==="floating"||!i.gridRoot){L.current+=1;let q=$(x,i.floating);return{...i,minimized:_,floating:[...i.floating,{...q,id:e,z:L.current}],panels:{...i.panels,[e]:{...c,state:"floating"}}}}else{let q=ee(i.gridRoot)||"group-default";return{...i,minimized:_,gridRoot:Y(i.gridRoot,q,e),panels:{...i.panels,[e]:{...c,state:"docked"}}}}}else{if(c.state==="floating")return z(e),i;{let _=q=>q.type==="leaf"?q.panels.includes(e)?{...q,activePanelId:e}:q:{...q,children:q.children.map(_)};return{...i,gridRoot:_(i.gridRoot)}}}let H={id:e,title:C,component:t,state:h==="tabbed"?"docked":h},U={...i.panels,[e]:H};if(h==="floating"){L.current+=1;let _=$(x,i.floating),q=n?.stickyRight??d?.defaultOptions?.defaultStickyRight??!1,Ce=n?.stickyBottom??d?.defaultOptions?.defaultStickyBottom??!1,We=Math.max(100,window.innerWidth||1024),Oe=Math.max(100,window.innerHeight||768),dt=typeof _.width=="string"?parseFloat(_.width):_.width,ct=typeof _.height=="string"?parseFloat(_.height):_.height,et=_.x,tt=_.y,Fe=10;return q&&(et=We-dt-Fe),Ce&&(tt=Oe-ct-Fe),{...i,floating:[...i.floating,{..._,id:e,z:L.current,x:et,y:tt,stickyRight:q,stickyBottom:Ce}],panels:U}}else{let _=ee(i.gridRoot)||"group-default";return{...i,gridRoot:Y(i.gridRoot,_,e),panels:U}}})},[$,z]),te=G(e=>{l(t=>{let n=t.panels[e];if(!n||g.get(n.component)?.defaultOptions?.canClose===!1)return t;delete y.current[e];let c={...t.panels};delete c[e];let d=F(t.gridRoot,e);return{...t,gridRoot:d||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:t.floating.filter(C=>C.id!==e),minimized:t.minimized.filter(C=>C.id!==e),panels:c}})},[]),K=G((e,t)=>{y.current[e]=t},[]),V=G(e=>{delete y.current[e]},[]),fe=G((e,t,n)=>{l(i=>{let c=i.panels[e];return c?{...i,panels:{...i.panels,[e]:{...c,dirty:t,dirtyOptions:n}}}:i})},[]),ce=G((e,t)=>{l(n=>{let i=n.panels[e];return i?{...n,panels:{...n.panels,[e]:{...i,title:t}}}:n})},[]),J=G(async(e,t)=>{if(t?.force){te(e);return}let n=y.current[e];if(n&&!await n())return;let i=w.current.panels[e];if(i?.dirty)if(t?.onConfirm){if(!await t.onConfirm(i.dirtyOptions))return}else return;te(e)},[te]),ae=G(e=>{l(t=>{let n=t.panels[e];if(!n||n.state==="minimized"||g.get(n.component)?.defaultOptions?.canMinimize===!1)return t;let c,d;if(n.state==="floating"){let h=t.floating.find(x=>x.id===e);h&&(c={x:h.x,y:h.y,width:h.width,height:h.height,stickyRight:h.stickyRight,stickyBottom:h.stickyBottom})}else if(n.state==="docked"){let h=x=>{if(x.type==="leaf")return x.panels.includes(e)?x.id:null;for(let S of x.children){let H=h(S);if(H)return H}return null};d=h(t.gridRoot)}let C=F(t.gridRoot,e);return{...t,gridRoot:C||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:t.floating.filter(h=>h.id!==e),minimized:[...t.minimized,{id:e,title:n.title,component:n.component}],panels:{...t.panels,[e]:{...n,state:"minimized",previousState:n.state,lastFloatingRect:c,lastLeafId:d}}}})},[]),Z=G(e=>{l(t=>{let n=t.panels[e];if(!n||n.state!=="minimized")return t;let i=t.minimized.filter(d=>d.id!==e);if((n.previousState||"docked")==="floating"){L.current+=1;let d=g.get(n.component),C=n.lastFloatingRect||d?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},h=$(C,t.floating);return{...t,minimized:i,floating:[...t.floating,{...h,id:e,z:L.current,stickyRight:!!n.lastFloatingRect?.stickyRight,stickyBottom:!!n.lastFloatingRect?.stickyBottom}],panels:{...t.panels,[e]:{...n,state:"floating"}}}}else{let d=(S,H)=>S.type==="leaf"?S.id===H:S.children.some(U=>d(U,H)),C=n.lastLeafId&&d(t.gridRoot,n.lastLeafId),h=g.get(n.component),x=h?.defaultOptions?.canDrag!==!1;if(C)return{...t,minimized:i,gridRoot:Y(t.gridRoot,n.lastLeafId,e),panels:{...t.panels,[e]:{...n,state:"docked"}}};if(x){L.current+=1;let S=n.lastFloatingRect||h?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},H=$(S,t.floating);return{...t,minimized:i,floating:[...t.floating,{...H,id:e,z:L.current,stickyRight:!!n.lastFloatingRect?.stickyRight,stickyBottom:!!n.lastFloatingRect?.stickyBottom}],panels:{...t.panels,[e]:{...n,state:"floating"}}}}else{let S=ee(t.gridRoot)||"group-default";return{...t,minimized:i,gridRoot:Y(t.gridRoot,S,e),panels:{...t.panels,[e]:{...n,state:"docked"}}}}}})},[$]),Q=G((e,t)=>{l(n=>{let i=n.panels[e];if(!i||g.get(i.component)?.defaultOptions?.canDrag===!1)return n;let d=g.get(i.component),C=t||d?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},h=F(n.gridRoot,e);L.current+=1;let x=$(C,n.floating);return{...n,gridRoot:h||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:[...n.floating,{...x,id:e,z:L.current}],panels:{...n.panels,[e]:{...i,state:"floating"}}}})},[$]),Ge=G((e,t)=>{l(n=>{let i=n.panels[e];if(!i)return n;let c=n.floating.filter(h=>h.id!==e),d=F(n.gridRoot,e),C=t||ee(d||n.gridRoot)||"group-default";return{...n,gridRoot:Y(d||n.gridRoot,C,e),floating:c,panels:{...n.panels,[e]:{...i,state:"docked"}}}})},[]),be=(e,t,n,i)=>{if(e.type==="leaf"){if(e.id===t){let c={type:"leaf",id:`group-split-${Date.now()}-${Math.floor(Math.random()*1e3)}`,panels:[n],activePanelId:n};return{type:"branch",orientation:i==="left"||i==="right"?"horizontal":"vertical",sizes:[.5,.5],children:i==="left"||i==="top"?[c,e]:[e,c]}}return e}else return{...e,children:e.children.map(c=>be(c,t,n,i))}},me=G(e=>{l(t=>({...t,draggedPanelId:e}))},[]),Ye=G((e,t,n)=>{l(i=>{let c=i.panels[e];if(!c)return i;let d=i.floating.filter(x=>x.id!==e),C=F(i.gridRoot,e),h;return n==="center"?h=Y(C||i.gridRoot,t,e):h=be(C||i.gridRoot,t,e,n),{...i,gridRoot:h,floating:d,panels:{...i.panels,[e]:{...c,state:"docked"}},draggedPanelId:null}})},[]),Xe=G((e,t)=>{l(n=>{let i=n.panels[e];if(!i)return n;let c=n.floating.filter(H=>H.id!==e),d=F(n.gridRoot,e),C={type:"leaf",id:`group-edge-${Date.now()}-${Math.floor(Math.random()*1e3)}`,panels:[e],activePanelId:e},h=t==="left"||t==="right"?"horizontal":"vertical",x=t==="left"||t==="top"?[C,d||n.gridRoot]:[d||n.gridRoot,C];return{...n,gridRoot:{type:"branch",orientation:h,sizes:t==="left"||t==="top"?[.3,.7]:[.7,.3],children:x},floating:c,panels:{...n.panels,[e]:{...i,state:"docked"}},draggedPanelId:null}})},[]),qe=G((e,t,n)=>{l(i=>{let c=i.panels[e];if(!c)return i;let d=F(i.gridRoot,e),C=S=>{if(S.type==="leaf"){if(S.id===t){let H=S.panels.filter(q=>q!==e),U=Math.max(0,Math.min(n,H.length)),_=[...H];return _.splice(U,0,e),{...S,panels:_,activePanelId:e}}return S}else return{...S,children:S.children.map(C)}},h=C(d||i.gridRoot),x=i.floating.filter(S=>S.id!==e);return{...i,gridRoot:h,floating:x,panels:{...i.panels,[e]:{...c,state:"docked"}},draggedPanelId:null}})},[]),Ke=G(e=>{l(t=>{let n=c=>{if(c.type==="leaf")return c.id===e&&c.canClose!==!1?null:c;{let d=c.children.map(x=>n(x)).filter(x=>x!==null);if(d.length===0)return null;if(d.length===1)return d[0];let C=c.sizes.slice(0,d.length),h=C.reduce((x,S)=>x+S,0);return{...c,children:d,sizes:C.map(x=>x/h)}}},i=n(t.gridRoot);return{...t,gridRoot:i||{type:"leaf",id:"group-default",panels:[],activePanelId:null}}})},[]),je=G(e=>{l(t=>({...t,floating:t.floating.map(n=>n.id===e?{...n,maximized:!n.maximized}:n)}))},[]),Ie=G((e,t)=>{let n=(i,c)=>{if(i.type==="leaf")return i;if(c===e.length)return{...i,sizes:t};let d=e[c],C=i.children.map((h,x)=>x===d?n(h,c+1):h);return{...i,children:C}};l(i=>({...i,gridRoot:n(i.gridRoot,0)}))},[]),ue=G((e,t)=>{l(n=>({...n,floating:n.floating.map(i=>i.id===e?{...i,...t}:i)}))},[]),Ue=G(()=>JSON.stringify({gridRoot:w.current.gridRoot,floating:w.current.floating,minimized:w.current.minimized,panels:w.current.panels}),[]),Je=G(e=>{try{let t=JSON.parse(e);if(t.gridRoot&&t.floating&&t.minimized&&t.panels){let n=Object.keys(t.panels)[0]||null;l(i=>({...i,gridRoot:t.gridRoot,floating:t.floating,minimized:t.minimized,panels:t.panels,draggedPanelId:null,activePanelId:n}))}}catch(t){console.error("Failed to parse layout configuration:",t)}},[]),Ve=G(e=>{l(t=>t.activePanelId===e?t:{...t,activePanelId:e})},[]),Ne=G(e=>{l(t=>t.dir===e?t:{...t,dir:e,isRtl:e==="rtl"})},[]),Ze=G(e=>e in w.current.panels,[]),Qe=G(()=>Object.keys(w.current.panels),[]);gt(()=>{I&&l(e=>e.dir===I?e:{...e,dir:I,isRtl:I==="rtl"})},[I]);let r=ut(()=>({openPanel:se,closePanel:te,minimizePanel:ae,restorePanel:Z,floatPanel:Q,dockPanel:Ge,maximizePanel:je,updateSplitSizes:Ie,updateFloatingPosition:ue,focusPanel:z,isOpen:Ze,getOpenPanelIds:Qe,saveLayout:Ue,loadLayout:Je,publish:E,subscribe:P,setDraggedPanelId:me,dockPanelToGroup:Ye,movePanelOrder:qe,closeLeafGroup:Ke,registerCloseGuard:K,unregisterCloseGuard:V,setPanelDirty:fe,updatePanelTitle:ce,requestClosePanel:J,dockPanelToWorkspaceEdge:Xe,setActivePanel:Ve,setDirection:Ne}),[se,te,ae,Z,Q,Ge,je,Ie,ue,z,Ze,Qe,Ue,Je,E,P,me,Ye,qe,Ke,K,V,fe,ce,J,Xe,Ve,Ne]),v=e=>{let t=e.defaultMessage||e.id;return e.values&&Object.entries(e.values).forEach(([n,i])=>{t=t.replace(`{${n}}`,String(i))}),t},u=ut(()=>({modalClass:k,modalBodyClass:A,sidePanelClass:D,sidePanelBodyClass:M,windowClass:R,windowBodyClass:O}),[k,A,D,M,R,O]);return gt(()=>{if(process.env.NODE_ENV!=="development")return;let e=!1;try{for(let t of Array.from(document.styleSheets))try{if(Array.from(t.cssRules||[]).some(i=>i.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"`)},[]),
|
|
3
|
-
new WorkspaceClient({ panels: { "${o}": { component: YourComponent } } })`),j("div",{className:"dw-unregistered-panel",style:{border:"2px dashed #dc3545"},children:[p("h6",{style:{fontWeight:700,marginBottom:"0.25rem"},children:"\u26A0\uFE0F Component Unregistered"}),j("span",{style:{fontSize:"0.875rem",color:"var(--text-secondary, #94a3b8)"},children:["Key: ",o]})]});let N=m.Component;return p(N,{panelId:s})},$t=new Map,Ee=new Map,it=s=>{let o=Ee.get(s);return o||(o={onClose:new Set,onMinimize:new Set,onRestore:new Set,onResize:new Set},Ee.set(s,o)),o},_t=({panelId:s})=>{let o=pe(null);return oe(()=>{let a=o.current;if(!a)return;let m=Ht(s);a.appendChild(m);let N=new ResizeObserver(k=>{for(let A of k){let{width:D,height:M}=A.contentRect;if(D>0&&M>0){$t.set(s,{width:D,height:M});let R=Ee.get(s);R&&R.onResize.forEach(O=>O(D,M))}}});return N.observe(a),()=>{N.disconnect();let k=document.getElementById(st);k||(k=document.createElement("div"),k.id=st,k.style.display="none",document.body.appendChild(k)),k.appendChild(m)}},[s]),p("div",{ref:o,style:{width:"100%",height:"100%"}})},pn=({panelId:s})=>{let o=ge(),a=Be(),m=ne(),N=pe(null),k=o.panels[s],A=k?a.get(k.component):null,D=A?.defaultOptions?.disableLivePreview||!1,M=$t.get(s)||{width:800,height:500},R=M.width,O=M.height,b=Math.min(220/R,140/O);if(oe(()=>{if(D)return;let I=N.current;if(!I)return;let W=$e.get(s);if(W)return I.appendChild(W),()=>{let l=document.getElementById(st);l||(l=document.createElement("div"),l.id=st,l.style.display="none",document.body.appendChild(l)),l.appendChild(W)}},[s,D]),D){let I=R*b,W=O*b,l=k?.title||A?.defaultOptions?.title||"Panel",w=X(l,m),y=(Array.from(w)[0]||"P").toUpperCase();return p("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:p("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 p("div",{className:"taskbar-item-preview-frame",style:{width:`${R*b}px`,height:`${O*b}px`},children:p("div",{ref:N,className:"taskbar-item-preview-host",style:{width:`${R}px`,height:`${O}px`,transform:`scale(${b})`,transformOrigin:"top left",position:"absolute",top:0,left:0,"--preview-scale":b}})})},fn=({panelId:s,children:o})=>{let a=ge(),{requestClosePanel:m,setPanelDirty:N,registerCloseGuard:k,unregisterCloseGuard:A,updatePanelTitle:D}=He(),M=a.minimized.some(g=>g.id===s),R=pe(M);oe(()=>{let g=Ee.get(s);g&&(M&&!R.current?g.onMinimize.forEach(T=>T()):!M&&R.current&&g.onRestore.forEach(T=>T()),R.current=M)},[M,s]),oe(()=>()=>{let g=Ee.get(s);g&&(g.onClose.forEach(T=>T()),Ee.delete(s))},[s]);let O=Ct.useMemo(()=>({requestClose:g=>m(s,g),setDirty:g=>N(s,g),onCloseRequested:g=>(k(s,g),()=>A(s)),setTitle:g=>D(s,g),instanceId:s,onClose:g=>{let T=it(s);return T.onClose.add(g),()=>T.onClose.delete(g)},onMinimize:g=>{let T=it(s);return T.onMinimize.add(g),()=>T.onMinimize.delete(g)},onRestore:g=>{let T=it(s);return T.onRestore.add(g),()=>T.onRestore.delete(g)},onResize:g=>{let T=it(s);return T.onResize.add(g),()=>T.onResize.delete(g)}}),[s,m,N,k,A,D]);return p(xe,{value:O,children:o})},Gt=({node:s,path:o,onTabRightClick:a,activeDropZone:m,onHoverDropZone:N,onTabDragStart:k,hoveredTab:A,onTabHover:D,defaultPanelIcon:M,onRequestClosePanel:R})=>{let{updateSplitSizes:O}=He();if(s.type==="leaf")return p(mn,{leaf:s,onTabRightClick:a,activeDropZone:m,onHoverDropZone:N,onTabDragStart:k,hoveredTab:A,onTabHover:D,defaultPanelIcon:M,onRequestClosePanel:R});let g=s.orientation==="horizontal",T=(b,I)=>{I.preventDefault();let W=g?I.clientX:I.clientY,l=[...s.sizes],w=I.currentTarget;w.classList.add("active"),document.body.classList.add("resizing-active",g?"resizing-row-active":"resizing-col-active");let y=I.currentTarget.parentElement,f=y?g?y.clientWidth:y.clientHeight:g?1e3:800,B=P=>{let z=((g?P.clientX:P.clientY)-W)/f,F=[...l];F[b]+=z,F[b+1]-=z,F[b]>.1&&F[b+1]>.1&&O(o,F)},L=()=>{w.classList.remove("active"),document.body.classList.remove("resizing-active","resizing-row-active","resizing-col-active"),window.removeEventListener("mousemove",B),window.removeEventListener("mouseup",L)};window.addEventListener("mousemove",B),window.addEventListener("mouseup",L)};return p("div",{style:{display:"flex",flexDirection:g?"row":"column",width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:s.children.map((b,I)=>{let W=s.sizes[I]*100;return j(Ct.Fragment,{children:[p("div",{style:{flexGrow:s.sizes[I],flexBasis:`${W}%`,overflow:"hidden",position:"relative"},children:p(Gt,{node:b,path:[...o,I],onTabRightClick:a,activeDropZone:m,onHoverDropZone:N,onTabDragStart:k,hoveredTab:A,onTabHover:D,defaultPanelIcon:M,onRequestClosePanel:R})}),I<s.children.length-1&&p("div",{onMouseDown:l=>T(I,l),style:{cursor:g?"col-resize":"row-resize",width:g?"1px":"100%",height:g?"100%":"1px",zIndex:20},className:"resizer-bar"})]},I)})})},mn=({leaf:s,onTabRightClick:o,activeDropZone:a,onHoverDropZone:m,onTabDragStart:N,hoveredTab:k,onTabHover:A,defaultPanelIcon:D,onRequestClosePanel:M})=>{let R=ge(),O=Be(),{openPanel:g,closeLeafGroup:T,setActivePanel:b}=mt(),I=ne(),W=re(),{windowClass:l,windowBodyClass:w}=he(),y=f=>{g(f,R.panels[f].component),b(f)};return j("div",{"data-active-panel-id":s.activePanelId||"",className:`workspace-panel ${l??""}`,style:{overflow:"hidden",position:"relative"},children:[j("div",{className:"workspace-tab-bar",style:{minHeight:"38px"},children:[p("div",{className:"tab-headers-container",style:{scrollbarWidth:"none"},onMouseMove:f=>{R.draggedPanelId&&f.target===f.currentTarget&&A(s.id,"EMPTY",s.panels.length,"right")},onMouseLeave:f=>{R.draggedPanelId&&f.target===f.currentTarget&&A(s.id,"",-1,null)},children:s.panels.map((f,B)=>{let L=R.panels[f];if(!L)return null;let P=s.activePanelId===f,E=R.activePanelId===f,z=O.get(L.component)?.defaultOptions,F=k&&k.leafId===s.id&&k.panelId===f,Y=B===s.panels.length-1,ee=k&&k.leafId===s.id&&k.panelId==="EMPTY"&&Y,se=F?k.side==="left"?"drag-hover-left":"drag-hover-right":ee?"drag-hover-right":"";return j("div",{onClick:()=>y(f),onMouseDown:K=>{z?.canDrag!==!1&&N(f,K)},onContextMenu:K=>o(f,K),onMouseMove:K=>{if(R.draggedPanelId){let V=K.currentTarget.getBoundingClientRect(),ce=K.clientX-V.left<V.width/2?"left":"right";A(s.id,f,B,ce)}},onMouseLeave:()=>{R.draggedPanelId&&A(s.id,"",-1,null)},className:`workspace-tab ${P?E?"active workspace-tab-active-focused":"active workspace-tab-active-unfocused":"workspace-tab-inactive"} ${se}`,style:{cursor:z?.canDrag===!1?"default":"pointer"},children:[j("span",{className:"text-truncate",style:{maxWidth:"120px",display:"flex",alignItems:"center"},children:[p("span",{className:"workspace-tab-icon",children:z?.icon||D||bt}),j("span",{children:[X(L.title,I),L.dirty?" *":""]})]}),z?.renderHeaderActions&&p("span",{className:"tab-header-actions",onClick:K=>K.stopPropagation(),onMouseDown:K=>K.stopPropagation(),children:z.renderHeaderActions(f)}),z?.canClose!==!1&&p("span",{onClick:K=>{K.stopPropagation(),M(f)},title:X(W.closeTab,I),className:"close-tab-x",style:{width:"18px",height:"18px",...z?.renderHeaderActions?{}:{marginInlineStart:"auto"}},children:p("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:p("path",{d:"M18 6L6 18M6 6l12 12"})})})]},f)})}),s.panels.length===0&&s.keepOnEmpty&&s.canClose!==!1&&p("span",{onClick:()=>T(s.id),className:"close-tab-x header-close-empty-group",style:{width:"18px",height:"18px",cursor:"pointer"},title:X(W.closeEmptyGroup,I),children:p("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:p("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),j("div",{className:`dw-panel-body ${w??""}`,style:{position:"relative",overflow:"hidden"},children:[s.activePanelId&&R.panels[s.activePanelId]?p(_t,{panelId:s.activePanelId},s.activePanelId):p("div",{className:"empty-leaf-placeholder",children:p("span",{children:"Empty Workspace Section"})}),R.draggedPanelId!==null&&p("div",{className:"dock-drop-zone-overlay",children:j("div",{className:"dock-target-cross",children:[p("div",{onMouseEnter:()=>m(s.id,"top"),onMouseLeave:()=>m(s.id,null),className:"dock-target-box dock-target-top",children:"\u25B2"}),p("div",{onMouseEnter:()=>m(s.id,"bottom"),onMouseLeave:()=>m(s.id,null),className:"dock-target-box dock-target-bottom",children:"\u25BC"}),p("div",{onMouseEnter:()=>m(s.id,"left"),onMouseLeave:()=>m(s.id,null),className:"dock-target-box dock-target-left",children:"\u25C0"}),p("div",{onMouseEnter:()=>m(s.id,"right"),onMouseLeave:()=>m(s.id,null),className:"dock-target-box dock-target-right",children:"\u25B6"}),p("div",{onMouseEnter:()=>m(s.id,"center"),onMouseLeave:()=>m(s.id,null),className:"dock-target-box dock-target-center",children:"\u25A3"})]})}),R.draggedPanelId!==null&&a!==null&&a.leafId===s.id&&p("div",{className:"dock-preview-highlight",style:{left:a.position==="right"?"50%":"0",top:a.position==="bottom"?"50%":"0",width:a.position==="left"||a.position==="right"?"50%":"100%",height:a.position==="top"||a.position==="bottom"?"50%":"100%"}})]})]})},hn=({skin:s="vscode",defaultPanelIcon:o})=>{let a=ge(),m=Be(),{restorePanel:N,minimizePanel:k,requestClosePanel:A,maximizePanel:D,updateFloatingPosition:M,focusPanel:R,floatPanel:O,setDraggedPanelId:g,dockPanelToGroup:T,movePanelOrder:b,dockPanelToWorkspaceEdge:I,setActivePanel:W,setDirection:l}=mt(),{openModal:w}=Me(),y=ne(),f=re(),B=Ct.useCallback(r=>{let v=a.panels[r];A(r,{onConfirm:u=>new Promise(e=>{let t=u||v?.dirtyOptions,n=v?X(v.title,y):"Panel";w(ke,{title:t?.title||f.unsavedChangesTitle,message:t?.message||{id:f.unsavedChangesMessage.id,defaultMessage:f.unsavedChangesMessage.defaultMessage,values:{title:n}},alert:t?.alert,alertType:t?.alertType||"danger",useYesNoTitles:!0,onOK:()=>e(!0),onCancel:()=>e(!1)},{size:"small"})})})},[A,a.panels,y,w,f]),{windowClass:L,windowBodyClass:P}=he(),E=pe(null),$=pe(null),[z,F]=Pe(null),Y=pe(null),[ee,se]=Pe(!1);oe(()=>()=>{Y.current&&clearTimeout(Y.current)},[]),oe(()=>{z&&(a.minimized.some(v=>v.id===z.id)||F(null))},[a.minimized,z]);let[te,K]=Pe(null),V=pe(null),[fe,ce]=Pe({x:0,y:0}),[J,ae]=Pe(null),Z=pe(null),Q=r=>{ae(r),Z.current=r},[Ge,be]=Pe(null),me=pe(null),Ye=(r,v,u,e)=>{let t=e?{leafId:r,panelId:v,index:u,side:e}:null;be(t),me.current=t},Xe=(r,v)=>{let u=v?{leafId:r,position:v}:null;K(u),V.current=u},qe=(r,v)=>{if(v.button!==0)return;let u=v.clientX,e=v.clientY,t=!1,n=d=>{let C=d.clientX-u,h=d.clientY-e;!t&&(Math.abs(C)>5||Math.abs(h)>5)&&(t=!0,g(r)),t&&ce({x:d.clientX,y:d.clientY})},i=d=>{if(window.removeEventListener("mousemove",n),window.removeEventListener("mouseup",c),t){let C=V.current,h=me.current,x=Z.current;if(x)I(r,x);else if(h){let S=h.index;h.side==="right"&&(S+=1),b(r,h.leafId,S)}else C?T(r,C.leafId,C.position):O(r,{x:d.clientX-150,y:d.clientY-15,width:450,height:350});g(null),K(null),V.current=null,be(null),me.current=null,Q(null)}},c=d=>{i(d)};window.addEventListener("mousemove",n),window.addEventListener("mouseup",c)},Ke=(r,v)=>{v.preventDefault();let u=a.panels[r];if(!u)return;let t=m.get(u.component)?.defaultOptions,n=[];t?.canDrag!==!1&&n.push({label:X(f.floatWindow,y),action:()=>O(r)}),t?.canMinimize!==!1&&n.push({label:X(f.minimizePanel,y),action:()=>k(r)}),n.length>0&&t?.canClose!==!1&&n.push({separator:!0}),t?.canClose!==!1&&n.push({label:X(f.closeTab,y),action:()=>B(r)}),n.length!==0&&$.current?.show({event:v,contextMenu:{items:n}})},je=(r,v)=>{v.preventDefault(),F(null),$.current?.show({event:v,contextMenu:{items:[{label:X(f.restorePanel,y),action:()=>N(r)},{label:X(f.maximizePanel,y),action:()=>D(r)},{separator:!0},{label:X(f.closePanel,y),action:()=>B(r)}]}})};oe(()=>{let r=Object.keys(a.panels);for(let v of Array.from($e.keys()))r.includes(v)||$e.delete(v)},[a.panels]),oe(()=>{let r=()=>{a.draggedPanelId!==null&&(g(null),K(null),be(null))};return window.addEventListener("blur",r),()=>{window.removeEventListener("blur",r)}},[a.draggedPanelId]);let Ie=pe(null),[ue,Ue]=Pe({width:1024,height:768});oe(()=>{let r=Ie.current;if(!r)return;let v=new ResizeObserver(u=>{if(!u||u.length===0)return;let e=u[0].contentRect;Ue({width:Math.max(100,e.width),height:Math.max(100,e.height)})});return v.observe(r),()=>{v.disconnect()}},[]),oe(()=>{let r=Ie.current;if(!r)return;let v=()=>{let t=Et(r);l(t?"rtl":"ltr")};v();let u=new MutationObserver(v);u.observe(document.documentElement,{attributes:!0,attributeFilter:["dir"]}),u.observe(document.body,{attributes:!0,attributeFilter:["dir"]});let e=r.closest("[dir]");return e&&e!==document.documentElement&&e!==document.body&&u.observe(e,{attributes:!0,attributeFilter:["dir"]}),()=>{u.disconnect()}},[l]),oe(()=>{let r=ue.width,v=ue.height;a.floating.forEach(u=>{let e=typeof u.width=="string"?parseFloat(u.width):u.width,t=typeof u.height=="string"?parseFloat(u.height):u.height,n=typeof u.x=="string"?parseFloat(u.x):u.x,i=typeof u.y=="string"?parseFloat(u.y):u.y,c=e,d=t,C=n,h=i,x=!1;c>r&&(c=Math.max(200,r-20),x=!0),d>v&&(d=Math.max(150,v-40),x=!0);let S=10;if(u.stickyRight)C=r-c-S,x=!0;else{let H=r-100;C>H&&(C=Math.max(0,H),x=!0)}if(u.stickyBottom)h=v-d-S,x=!0;else{let H=v-40;h>H&&(h=Math.max(0,H),x=!0)}x&&M(u.id,{x:C,y:h,width:c,height:d})})},[ue,a.floating,M]),oe(()=>{let r=v=>{if(v.button!==0)return;let u=v.target;if(!u)return;let e=u.closest(".floating-window");if(e){let n=e.getAttribute("data-window-id");n&&(W(n),R(n));return}let t=u.closest(".workspace-panel");if(t){let n=t.getAttribute("data-active-panel-id");n&&W(n)}};return document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}},[R,W]);let Je=(r,v)=>{let u=a.floating.find(S=>S.id===r);if(!u||u.maximized)return;R(r);let e=v.clientX,t=v.clientY,i=v.currentTarget.closest(".floating-window"),c=i?i.offsetLeft:0,d=i?i.offsetTop:0,C=!1,h=S=>{let H=S.clientX-e,U=S.clientY-t;if(!C&&(Math.abs(H)>5||Math.abs(U)>5)&&(C=!0,g(r)),C){let _=c+H,q=d+U;M(r,{x:_,y:q,stickyRight:!1,stickyBottom:!1})}},x=()=>{if(C){let S=V.current,H=me.current,U=Z.current;if(U)I(r,U);else if(H){let _=H.index;H.side==="right"&&(_+=1),b(r,H.leafId,_)}else S&&T(r,S.leafId,S.position);g(null),K(null),V.current=null,be(null),me.current=null,Q(null)}window.removeEventListener("mousemove",h),window.removeEventListener("mouseup",x)};window.addEventListener("mousemove",h),window.addEventListener("mouseup",x)},Ve=(r,v)=>{v.stopPropagation();let u=a.floating.find(x=>x.id===r);if(!u||u.maximized)return;R(r);let e=v.clientX,t=v.clientY,i=v.currentTarget.closest(".floating-window"),c=i?i.offsetWidth:400,d=i?i.offsetHeight:300,C=x=>{let S=x.clientX-e,H=x.clientY-t,U=Math.max(200,c+S),_=Math.max(150,d+H),q=u.x,Ce=u.y,We=ue.width,Oe=ue.height,dt=typeof u.x=="string"?parseFloat(u.x):u.x,ct=typeof u.y=="string"?parseFloat(u.y):u.y,et=typeof u.width=="string"?parseFloat(u.width):u.width,tt=typeof u.height=="string"?parseFloat(u.height):u.height,Fe=Math.abs(dt+et-We)<4,Rt=Math.abs(ct+tt-Oe)<4;Fe&&(q=We-U,q<0&&(q=0,U=We)),Rt&&(Ce=Oe-_,Ce<0&&(Ce=0,_=Oe)),M(r,{x:q,y:Ce,width:U,height:_,stickyRight:Fe,stickyBottom:Rt})},h=()=>{window.removeEventListener("mousemove",C),window.removeEventListener("mouseup",h)};window.addEventListener("mousemove",C),window.addEventListener("mouseup",h)},Ne=r=>{if(E.current){let v=r==="left"?-150:150;E.current.scrollBy({left:v,behavior:"smooth"})}},[Ze,Qe]=Pe("dark");return oe(()=>{let r=()=>{let u=document.documentElement.getAttribute("data-color-scheme")==="light"?"light":"dark";Qe(u)};r();let v=new MutationObserver(r);return v.observe(document.documentElement,{attributes:!0,attributeFilter:["data-color-scheme"]}),()=>v.disconnect()},[]),j("div",{"data-workspace-skin":s,"data-color-scheme":Ze,style:{display:"flex",flexDirection:"column",width:"100%",height:"100%",overflow:"hidden",userSelect:"none"},dir:a.dir,children:[j("div",{ref:Ie,className:a.draggedPanelId?"dragging-active":void 0,style:{flexGrow:1,width:"100%",position:"relative",overflow:"hidden"},children:[a.draggedPanelId!==null&&j(Pn,{children:[p("div",{className:"workspace-edge-trigger edge-trigger-left",onMouseEnter:()=>Q("left"),onMouseLeave:()=>Q(null)}),p("div",{className:"workspace-edge-trigger edge-trigger-right",onMouseEnter:()=>Q("right"),onMouseLeave:()=>Q(null)}),p("div",{className:"workspace-edge-trigger edge-trigger-top",onMouseEnter:()=>Q("top"),onMouseLeave:()=>Q(null)}),p("div",{className:"workspace-edge-trigger edge-trigger-bottom",onMouseEnter:()=>Q("bottom"),onMouseLeave:()=>Q(null)})]}),a.draggedPanelId!==null&&J!==null&&p("div",{className:`workspace-edge-preview edge-preview-${J}`}),p("div",{style:{width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:a.gridRoot?p(Gt,{node:a.gridRoot,path:[],onTabRightClick:Ke,activeDropZone:te,onHoverDropZone:Xe,onTabDragStart:qe,hoveredTab:Ge,onTabHover:Ye,defaultPanelIcon:o,onRequestClosePanel:B}):p("div",{className:"empty-workspace-grid",children:"Grid Empty"})}),a.floating.map(r=>{let v=a.panels[r.id];if(!v)return null;let u=r.maximized,e=a.draggedPanelId===r.id,t=a.activePanelId===r.id,i=m.get(v.component)?.defaultOptions;return j("div",{"data-window-id":r.id,dir:a.dir,onMouseDownCapture:()=>{W(r.id),R(r.id)},className:`floating-window ${u?"maximized":""} ${t?"v2-window-focused":""} ${L??""}`,style:{position:"absolute",left:u?0:typeof r.x=="number"?`${r.x}px`:r.x,top:u?0:typeof r.y=="number"?`${r.y}px`:r.y,width:u?"100%":typeof r.width=="number"?`${r.width}px`:r.width,height:u?"100%":typeof r.height=="number"?`${r.height}px`:r.height,zIndex:r.z,pointerEvents:e?"none":"auto"},children:[j("div",{onDoubleClick:()=>D(r.id),onMouseDown:c=>{i?.canDrag!==!1&&Je(r.id,c)},className:"floating-window-titlebar cursor-move",style:{cursor:u||i?.canDrag===!1?"default":"move"},children:[j("span",{className:"floating-window-title",children:[p("span",{className:"window-title-icon",children:i?.icon||o||bt}),j("span",{children:[X(v.title,y),v.dirty?" *":""]})]}),j("div",{className:"fw-titlebar-actions",style:{gap:"var(--header-button-gap, 4px)"},onMouseDown:c=>c.stopPropagation(),children:[i?.renderHeaderActions&&p("div",{className:"window-header-actions",children:i.renderHeaderActions(r.id)}),i?.canDrag!==!1&&p("button",{type:"button",title:X(f.windowAnchoringOptions,y),onClick:c=>{let d=!!r.stickyRight,C=!!r.stickyBottom;$.current?.show({event:c,contextMenu:{items:[{label:X(f.anchorToRightEdge,y),checkbox:{active:!0,enabled:!0,value:d},action:()=>{let h=ue.width,x=typeof r.width=="string"?parseFloat(r.width):r.width;d?M(r.id,{stickyRight:!1}):M(r.id,{x:h-x-10,stickyRight:!0})}},{label:X(f.anchorToBottomEdge,y),checkbox:{active:!0,enabled:!0,value:C},action:()=>{let h=ue.height,x=typeof r.height=="string"?parseFloat(r.height):r.height;C?M(r.id,{stickyBottom:!1}):M(r.id,{y:h-x-10,stickyBottom:!0})}}]}})},className:"custom-tab-btn btn-anchor-tab",children:j("svg",{className:`anchor-icon ${r.stickyRight&&r.stickyBottom?"anchor-sticky-both":r.stickyRight?"anchor-sticky-right":r.stickyBottom?"anchor-sticky-bottom":""}`,width:"11",height:"11",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:[p("circle",{cx:"12",cy:"5",r:"2"}),p("path",{d:"M12 7v7m0 0a4 4 0 0 1-4-4M12 14a4 4 0 0 0 4-4M5 18h14"})]})}),p("button",{type:"button",title:u?X(f.restoreSize,y):X(f.maximize,y),onClick:()=>D(r.id),className:"custom-tab-btn btn-maximize-tab",children:p("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:p("rect",{x:"4",y:"4",width:"16",height:"16",rx:"1.5"})})}),i?.canMinimize!==!1&&p("button",{type:"button",title:X(f.minimize,y),onClick:()=>k(r.id),className:"custom-tab-btn btn-minimize-tab",children:p("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3",children:p("path",{d:"M5 12h14"})})}),i?.canClose!==!1&&p("button",{type:"button",title:X(f.close,y),onClick:()=>B(r.id),className:"custom-tab-btn btn-close-tab",children:p("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3",children:p("path",{d:"M18 6L6 18M6 6l12 12"})})})]})]}),p("div",{className:P??void 0,style:{flexGrow:1,width:"100%",overflow:"hidden",position:"relative",isolation:"isolate"},children:p(_t,{panelId:r.id},r.id)}),!u&&p("div",{onMouseDown:c=>Ve(r.id,c),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%)"}})]},r.id)})]}),a.minimized.length>0&&j("div",{className:"taskbar-footer-container",style:{height:"48px",zIndex:100},children:[p("button",{type:"button",onClick:()=>Ne("left"),className:"taskbar-nav-btn",style:{display:a.minimized.length>4?"block":"none"},children:"\u25C0"}),p("div",{ref:E,className:"taskbar-items-container",style:{scrollSnapType:"x mandatory"},children:a.minimized.map(r=>{let u=m.get(r.component)?.defaultOptions?.icon||o||bt;return p("div",{onClick:()=>{F(null),N(r.id)},onContextMenu:e=>je(r.id,e),onMouseEnter:e=>{if(ee)return;Y.current&&clearTimeout(Y.current);let t=e.currentTarget.getBoundingClientRect();e.clientX>=t.left&&e.clientX<=t.right&&e.clientY>=t.top&&e.clientY<=t.bottom&&F({id:r.id,rect:t,title:r.title,component:r.component})},onMouseLeave:()=>{Y.current=setTimeout(()=>{F(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:p("span",{className:"taskbar-item-icon",children:u})},r.id)})}),z&&Bt(j("div",{className:"taskbar-item-tooltip",dir:a.dir,style:{position:"fixed",left:`${z.rect.left+z.rect.width/2}px`,top:`${z.rect.top-8}px`,transform:"translateX(-50%) translateY(-100%)",opacity:1,pointerEvents:"auto",zIndex:999999},onMouseEnter:()=>{Y.current&&clearTimeout(Y.current)},onMouseLeave:()=>{F(null)},onClick:()=>{N(z.id),F(null)},children:[j("div",{className:"tooltip-header-row",children:[j("span",{className:"tooltip-title-text text-truncate",style:{maxWidth:"140px"},children:[X(z.title,y),a.panels[z.id]?.dirty?" *":""]}),p("span",{onClick:r=>{r.stopPropagation(),B(z.id),F(null)},title:X(f.closePanel,y),className:"tooltip-close-x",children:p("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:p("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),p(pn,{panelId:z.id})]}),document.body),p("button",{type:"button",onClick:()=>Ne("right"),className:"taskbar-nav-btn",style:{display:a.minimized.length>4?"block":"none"},children:"\u25B6"})]}),Object.keys(a.panels).map(r=>{let v=a.panels[r];if(!v)return null;let u=Ht(r);return Bt(p(fn,{panelId:r,children:p("div",{style:{width:"100%",height:"100%"},children:gn(r,v.component,m)})}),u,r)}),p(un,{ref:$,id:"workspace-context-menu",theme:"dark",onShow:()=>se(!0),onHide:()=>se(!1)}),a.draggedPanelId!==null&&!a.floating.some(r=>r.id===a.draggedPanelId)&&j("div",{className:"drag-ghost-tab",style:{left:fe.x+12,top:fe.y+12,zIndex:1e5},children:["\u{1F4C4} ",X(a.panels[a.draggedPanelId]?.title,y)||"Tab"]})]})},yn=hn;var wt=class{registry;initialState;config;_actions=null;_pendingCalls=[];_disconnectedWarnTimer=null;constructor(o={}){if(this.registry=new Se,this.initialState=o.initialState??null,this.config={formatMessage:o.formatMessage,predefinedMessages:o.predefinedMessages,dir:o.dir},o.panels)for(let[a,m]of Object.entries(o.panels))this.registry.register(a,m.component,m.defaultOptions)}_connect(o){this._actions=o,this._disconnectedWarnTimer!==null&&(clearTimeout(this._disconnectedWarnTimer),this._disconnectedWarnTimer=null);let a=this._pendingCalls.splice(0);for(let m of a)m(o)}_disconnect(){this._actions=null}get isConnected(){return this._actions!==null}_dispatch(o){this._actions?o(this._actions):(this._pendingCalls.push(o),process.env.NODE_ENV!=="production"&&this._disconnectedWarnTimer===null&&(this._disconnectedWarnTimer=setTimeout(()=>{!this.isConnected&&this._pendingCalls.length>0&&console.warn("[react-dockable-desktop] WorkspaceClient has queued calls but was never connected to a provider. Did you forget client={workspace} on <WindowManagerProvider client={workspace}>?")},1e3)))}openPanel(...o){this._dispatch(a=>a.openPanel(...o))}closePanel(o){this._dispatch(a=>a.closePanel(o))}minimizePanel(o){this._dispatch(a=>a.minimizePanel(o))}restorePanel(o){this._dispatch(a=>a.restorePanel(o))}floatPanel(...o){this._dispatch(a=>a.floatPanel(...o))}dockPanel(...o){this._dispatch(a=>a.dockPanel(...o))}maximizePanel(o){this._dispatch(a=>a.maximizePanel(o))}focusPanel(o){this._dispatch(a=>a.focusPanel(o))}isOpen(o){return this._actions?.isOpen(o)??!1}getOpenPanelIds(){return this._actions?.getOpenPanelIds()??[]}saveLayout(){return this._actions?.saveLayout()??""}loadLayout(o){this._dispatch(a=>a.loadLayout(o))}setDirection(o){this._dispatch(a=>a.setDirection(o))}publish(o,a){this._dispatch(m=>m.publish(o,a))}subscribe(o,a){return this._actions?.subscribe(o,a)??(()=>{})}};import{useCallback as _e,useRef as Yt,useEffect as vn,useState as bn,useMemo as Cn}from"react";import{Fragment as Rn,jsx as de,jsxs as xt}from"react/jsx-runtime";var wn=({modal:s,index:o,isTopmost:a})=>{let{close:m,openModal:N,updateInstance:k,setDirty:A}=Me(),D=ne(),M=re(),{dir:R}=ge(),{modalClass:O,modalBodyClass:g}=he(),T=Yt(null),{id:b,Component:I,props:W,options:l,dirty:w,dirtyOptions:y}=s,f=l,[B,L]=bn(f.icon||null),P=Yt(f);P.current=f;let E=X(f.title,D),$=_e(async J=>{if(J?.force){m(b);return}if(T.current){if(!await T.current())return;m(b);return}if(w){N(ke,{title:y?.title||M.unsavedChangesTitle,message:y?.message||{id:M.unsavedChangesMessage.id,defaultMessage:M.unsavedChangesMessage.defaultMessage,values:{title:E}},alert:y?.alert,alertType:y?.alertType||"danger",useYesNoTitles:!0,onOK:()=>m(b)},{size:"small"});return}m(b)},[m,N,b,w,y,E,M]),z=_e((J,ae)=>A(b,J,ae),[A,b]),F=_e(J=>k(b,{options:{...P.current,title:J}}),[k,b]),Y=_e(J=>L(J),[]),ee=_e(J=>(T.current=J,()=>{T.current=null}),[]),se=Cn(()=>({requestClose:$,setDirty:z,setTitle:F,setIcon:Y,onCloseRequested:ee,containerType:"modal",instanceId:b}),[$,z,F,Y,ee,b]),te=w?`${E} *`:E,K=f.size?`v2-modal-size-${f.size}`:"v2-modal-size-auto",V=f.closable!==!1;vn(()=>{if(!a||!V)return;let J=ae=>{ae.key==="Escape"&&(ae.stopPropagation(),$())};return document.addEventListener("keydown",J),()=>document.removeEventListener("keydown",J)},[$,V,a]);let ce=1e4+o*10;return xt("div",{className:"v2-modal-overlay",style:{zIndex:ce},dir:R,children:[de("div",{className:"v2-modal-curtain",onClick:V?()=>$():void 0}),xt("div",{className:`v2-modal-window ${K} ${O??""}`,children:[xt("div",{className:"v2-modal-header",children:[B&&de("div",{className:"v2-modal-icon",children:B}),de("h4",{className:"v2-modal-title",children:te}),V&&de("button",{className:"v2-modal-close-button",onClick:()=>$(),title:D(M.closeTooltip),type:"button",children:de("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:de("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),de("div",{className:`v2-modal-body ${g??""}`,children:de(xe,{value:se,children:de(I,{...W,panelId:b})})})]})]})},xn=()=>{let{modals:s}=ye();return s.length===0?null:de(Rn,{children:s.map((o,a)=>de(wn,{modal:o,index:a,isTopmost:a===s.length-1},o.id))})},Mn=xn;import{useCallback as Le,useRef as Xt,useEffect as qt,useState as kn,useMemo as In}from"react";import{Fragment as Ln,jsx as ie,jsxs as Mt}from"react/jsx-runtime";var at=({panel:s,position:o,defaultWidth:a})=>{let{close:m,openModal:N,updateInstance:k,setDirty:A,registerCloseHandler:D,unregisterCloseHandler:M}=Me(),{modals:R}=ye(),O=ne(),g=re(),{dir:T}=ge(),{sidePanelClass:b,sidePanelBodyClass:I}=he(),W=Xt(null),{id:l,Component:w,props:y,options:f,dirty:B,dirtyOptions:L}=s,P=f,[E,$]=kn(P.icon||null),z=Xt(P);z.current=P;let F=X(P.title,O),Y=Le(async Z=>{if(Z?.force){m(l);return}if(W.current){if(!await W.current())return;m(l);return}if(B){N(ke,{title:L?.title||g.unsavedChangesTitle,message:L?.message||{id:g.unsavedChangesMessage.id,defaultMessage:g.unsavedChangesMessage.defaultMessage,values:{title:F}},alert:L?.alert,alertType:L?.alertType||"danger",useYesNoTitles:!0,onOK:()=>m(l)},{size:"small"});return}m(l)},[m,N,l,B,L,F,g]),ee=Le(async()=>W.current?await W.current():!B,[B]);qt(()=>(D(l,ee),()=>M(l)),[l,ee,D,M]);let se=Le((Z,Q)=>A(l,Z,Q),[A,l]),te=Le(Z=>k(l,{options:{...z.current,title:Z}}),[k,l]),K=Le(Z=>$(Z),[]),V=Le(Z=>(W.current=Z,()=>{W.current=null}),[]),fe=In(()=>({requestClose:Y,setDirty:se,setTitle:te,setIcon:K,onCloseRequested:V,containerType:o==="left"?"left-panel":"right-panel",instanceId:l}),[Y,se,te,K,V,o,l]),ce=B?`${F} *`:F;qt(()=>{let Z=Q=>{Q.key==="Escape"&&R.length===0&&Y()};return document.addEventListener("keydown",Z),()=>document.removeEventListener("keydown",Z)},[Y,R.length]);let J=P.width||a||400,ae=typeof J=="number"?`${J}px`:J;return ie("div",{className:`v2-side-panel v2-side-panel-${o} v2-side-panel-visible ${b??""}`,style:{width:ae},dir:T,children:Mt("div",{className:"v2-side-panel-window",children:[Mt("div",{className:"v2-side-panel-header",children:[E&&ie("div",{className:"v2-side-panel-icon",children:E}),ie("h4",{className:"v2-side-panel-title",children:ce}),ie("button",{className:"v2-side-panel-close-button",onClick:()=>Y(),title:O(g.closeTooltip),type:"button",children:ie("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:ie("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),ie("div",{className:`v2-side-panel-body ${I??""}`,children:ie(xe,{value:fe,children:ie(w,{...y,panelId:l})})})]})})},Sn=({defaultWidth:s})=>{let{leftPanel:o,rightPanel:a}=ye();return Mt(Ln,{children:[o&&ie(at,{panel:o,position:"left",defaultWidth:s},o.id),a&&ie(at,{panel:a,position:"right",defaultWidth:s},a.id)]})},Tn=({defaultWidth:s})=>{let{leftPanel:o}=ye();return o?ie(at,{panel:o,position:"left",defaultWidth:s},o.id):null},zn=({defaultWidth:s})=>{let{rightPanel:o}=ye();return o?ie(at,{panel:o,position:"right",defaultWidth:s},o.id):null},En=Sn;import{useState as Kt,useEffect as rt,useRef as Nn,useCallback as jt,useImperativeHandle as Wn,forwardRef as On}from"react";import{Fragment as Dn,jsx as ve,jsxs as lt}from"react/jsx-runtime";var Fn=On(function({position:o="right",tabs:a,drawerWidth:m="220px",activeTabId:N,onActiveTabChange:k,children:A},D){let M=N!==void 0,R=ne(),O=re(),[g,T]=Kt(null),b=M?N:g,[I,W]=Kt(()=>{let P=new Set;for(let E of a)E.eagerMount&&P.add(E.id);return P});rt(()=>{let P=a.filter(E=>E.eagerMount&&!I.has(E.id));P.length>0&&W(E=>{let $=new Set(E);for(let z of P)$.add(z.id);return $})},[a]);let l=Nn(b??null);rt(()=>{l.current=b??null},[b]);let w=jt(P=>{M||T(P),k?.(P)},[M,k]);Wn(D,()=>({openTab:P=>w(P),closeDrawer:()=>w(null),getActiveTab:()=>l.current}),[w]);let y=P=>{w(b===P?null:P)},f=jt(()=>w(null),[w]);rt(()=>{b&&!I.has(b)&&W(P=>{let E=new Set(P);return E.add(b),E})},[b,I]),rt(()=>{b===null&&W(P=>{let E=!1,$=new Set(P);for(let z of P){let F=a.find(Y=>Y.id===z);F&&!F.eagerMount&&!F.preserveState&&($.delete(z),E=!0)}return E?$:P})},[b,a]);let B=ve("div",{className:`sidebar-tabs-strip ${o}`,style:{width:"56px",height:"100%"},children:a.map(P=>{let E=b===P.id;return ve("button",{type:"button",onClick:()=>y(P.id),className:`sidebar-tab-btn ${E?"active":""}`,title:P.label,"aria-pressed":E,children:P.icon},P.id)})}),L=ve("div",{className:`sidebar-content-drawer h-100 ${o}`,style:{width:b?m:"0px",minWidth:b?m:"0px",overflow:"hidden",flexShrink:0},children:a.map(P=>{if(!I.has(P.id))return null;let $=b===P.id,z=()=>w(P.id);return lt("div",{style:{display:$?"flex":"none",flexDirection:"column",height:"100%",width:"100%"},children:[lt("div",{className:"sidebar-drawer-header",children:[ve("span",{className:"sidebar-header-title",children:P.label}),ve("button",{type:"button",onClick:f,className:"sidebar-close-btn",title:R(O.closePanelTooltip),"aria-label":R(O.closePanelTooltip),children:lt("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[ve("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),ve("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),ve("div",{className:"sidebar-drawer-body",children:P.renderContent(P.id,f,z)})]},P.id)})});return lt(Dn,{children:[o==="left"&&B,o==="left"&&L,A,o==="right"&&L,o==="right"&&B]})});export{ke as ConfirmationForm,ht as FormContainerContext,xe as FormContainerProvider,Tn as LeftPanelRenderer,Mn as ModalStackRenderer,ln as PanelProvider,nt as PanelRegistry,Se as PanelRegistryClass,zn as RightPanelRenderer,En as SidePanelRenderer,Fn as Sidebar,yn as WindowManager,Zt as WindowManagerProvider,wt as WorkspaceClient,De as defaultPredefinedMessages,X as formatLabel,yt as useFormContainer,ne as useFormatMessage,Me as usePanelActions,Qt as usePanelContext,ye as usePanelState,re as usePredefinedMessages,Be as useRegistry,he as useStyleClasses,He as useWindowManagerActions,ge as useWindowManagerState};
|
|
1
|
+
import Mt,{useState as Me,useRef as ve,useEffect as de}from"react";import{createPortal as Xt}from"react-dom";import{createContext as Ee,useContext as we,useState as an,useRef as Te,useMemo as rt,useCallback as G,useEffect as mt,useLayoutEffect as ln,useSyncExternalStore as dn}from"react";import{createContext as on,useContext as sn}from"react";var rn={requestClose:()=>{console.warn("FormContainerContract: requestClose called but no container is present")},setDirty:()=>{},onCloseRequested:()=>()=>{},setTitle:()=>{},setIcon:()=>{},containerType:"standalone",instanceId:"standalone",onClose:()=>()=>{},onMinimize:()=>()=>{},onRestore:()=>()=>{},onResize:()=>()=>{}},ft=on(rn),Se=ft.Provider,Be=()=>sn(ft);var Oe=class{registry=new Map;register(t,i,c){this.registry.set(t,{Component:i,defaultOptions:c})}get(t){return this.registry.get(t)}getRegisteredIds(){return Array.from(this.registry.keys())}},st=new Oe;var _e={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"}};import{jsx as Ie}from"react/jsx-runtime";var zt=Ee(null),yt=Ee(null),Lt=Ee(null),Wt=Ee(null),Nt=Ee(_e),Ot=Ee({}),Ce=()=>we(Ot),Dt=Ee(st),He=()=>we(Dt),ht=class{listeners={};subscribe(t,i){return this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push(i),()=>{this.listeners[t]=this.listeners[t].filter(c=>c!==i)}}publish(t,i){this.listeners[t]&&this.listeners[t].forEach(c=>c(i))}},cn={type:"leaf",id:"group-default",panels:[],activePanelId:null};function un(s){if(s)try{let t=JSON.parse(s);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:cn,floating:[],minimized:[],panels:{},activePanelId:null}}var Pt=({children:s,client:t,formatMessage:i,predefinedMessages:c,dir:I,modalClass:C,modalBodyClass:A,sidePanelClass:D,sidePanelBodyClass:M,windowClass:R,windowBodyClass:O})=>{let p=Te(t?.registry??st).current,E=t?.config.formatMessage??i,b=t?.config.predefinedMessages??c,k=t?.config.dir??I,[L,d]=an(()=>({...un(t?.initialState??null),draggedPanelId:null,dir:k||"ltr",isRtl:k==="rtl"})),P=Te(L);P.current=L;let h=Te(new Set);ln(()=>{h.current.forEach(e=>e())},[L]);let m=G(()=>P.current,[]),B=G(e=>(h.current.add(e),()=>h.current.delete(e)),[]),H=Te({}),y=rt(()=>({..._e,...b}),[b]),S=Te(new ht),F=Te(1e3),W=G((e,r)=>S.current.subscribe(e,r),[]),$=G((e,r)=>{S.current.publish(e,r)},[]),Y=G((e,r)=>{let n=typeof e.x=="string"?parseFloat(e.x):e.x,o=typeof e.y=="string"?parseFloat(e.y):e.y,l=typeof e.width=="string"?parseFloat(e.width):e.width,g=typeof e.height=="string"?parseFloat(e.height):e.height;isNaN(n)&&(n=300),isNaN(o)&&(o=150),isNaN(l)&&(l=450),isNaN(g)&&(g=350);let w=J=>r.some(V=>{let ae=typeof V.x=="string"?parseFloat(V.x):V.x,Z=typeof V.y=="string"?parseFloat(V.y):V.y;return!V.maximized&&Math.abs(ae-J.x)<20&&Math.abs(Z-J.y)<20}),T=0;for(;w({x:n,y:o})&&T<10;)n+=30,o+=30,T++;let x=Math.max(100,window.innerWidth||1024),_=Math.max(100,window.innerHeight||768);return(n+l>x||o+g>_)&&(n=100+T%5*30,o=100+T%5*30),n=Math.max(0,Math.min(n,x-100)),o=Math.max(0,Math.min(o,_-40)),{x:n,y:o,width:l,height:g}},[]),re=G(e=>{d(r=>{let n=r.panels[e];if(!n)return r;if(n.state==="floating"){let o=r.floating.find(g=>g.id===e);if(!o)return r;let l=!r.floating.some(g=>g.z>o.z);return l&&r.activePanelId===e?r:(l||(F.current+=1),{...r,floating:r.floating.map(g=>g.id===e?{...g,z:l?o.z:F.current}:g),activePanelId:e})}else if(n.state==="docked"){if(r.activePanelId===e)return r;let o=l=>l.type==="leaf"?l.panels.includes(e)?{...l,activePanelId:e}:l:{...l,children:l.children.map(o)};return{...r,gridRoot:o(r.gridRoot),activePanelId:e}}return r.activePanelId===e?r:{...r,activePanelId:e}})},[]),ne=(e,r)=>{if(e.type==="leaf"){let n=e.panels.indexOf(r);if(n===-1)return e;let o=e.panels.filter(w=>w!==r),l=e.activePanelId===r?o[n]||o[n-1]||o[0]||null:e.activePanelId,g={...e,panels:o,activePanelId:l};return o.length===0&&!e.keepOnEmpty?null:g}else{let n=e.children.map(g=>ne(g,r)).filter(g=>g!==null);if(n.length===0)return null;if(n.length===1)return n[0];let o=e.sizes.slice(0,n.length),l=o.reduce((g,w)=>g+w,0);return{...e,children:n,sizes:o.map(g=>g/l)}}},se=(e,r,n)=>{if(e.type==="leaf"){if(e.id===r){let o=e.panels.includes(n)?e.panels:[...e.panels,n];return{...e,panels:o,activePanelId:n}}return e}else return{...e,children:e.children.map(o=>se(o,r,n))}},X=e=>{if(e.type==="leaf")return e.id;for(let r of e.children){let n=X(r);if(n)return n}return null},ee=G((e,r,n)=>{let o=!(e in P.current.panels);d(l=>{let g=l.panels[e],w=p.get(r),T=n?.title||n?.title||w?.defaultOptions?.title||e,x=n?.initialTarget||w?.defaultOptions?.initialTarget||"docked",_=w?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350};if(g)if(g.state==="minimized"){let Z=l.minimized.filter(ie=>ie.id!==e);if(x==="floating"||!l.gridRoot){F.current+=1;let ie=Y(_,l.floating);return{...l,minimized:Z,floating:[...l.floating,{...ie,id:e,z:F.current}],panels:{...l.panels,[e]:{...g,state:"floating"}}}}else{let ie=X(l.gridRoot)||"group-default";return{...l,minimized:Z,gridRoot:se(l.gridRoot,ie,e),panels:{...l.panels,[e]:{...g,state:"docked"}}}}}else{if(g.state==="floating")return re(e),l;{let Z=ie=>ie.type==="leaf"?ie.panels.includes(e)?{...ie,activePanelId:e}:ie:{...ie,children:ie.children.map(Z)};return{...l,gridRoot:Z(l.gridRoot)}}}let V={id:e,title:T,component:r,state:x==="tabbed"?"docked":x},ae={...l.panels,[e]:V};if(x==="floating"){F.current+=1;let Z=Y(_,l.floating),ie=n?.stickyRight??w?.defaultOptions?.defaultStickyRight??!1,nt=n?.stickyBottom??w?.defaultOptions?.defaultStickyBottom??!1,pt=Math.max(100,window.innerWidth||1024),ot=Math.max(100,window.innerHeight||768),it=typeof Z.width=="string"?parseFloat(Z.width):Z.width,nn=typeof Z.height=="string"?parseFloat(Z.height):Z.height,It=Z.x,Tt=Z.y,Et=10;return ie&&(It=pt-it-Et),nt&&(Tt=ot-nn-Et),{...l,floating:[...l.floating,{...Z,id:e,z:F.current,x:It,y:Tt,stickyRight:ie,stickyBottom:nt}],panels:ae}}else{let Z=X(l.gridRoot)||"group-default";return{...l,gridRoot:se(l.gridRoot,Z,e),panels:ae}}}),o&&S.current.publish("panel:opened",{id:e,component:r})},[Y,re]),ue=G(e=>{let r=e in P.current.panels;d(n=>{let o=n.panels[e];if(!o||p.get(o.component)?.defaultOptions?.canClose===!1)return n;delete H.current[e];let g={...n.panels};delete g[e];let w=ne(n.gridRoot,e);return{...n,gridRoot:w||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:n.floating.filter(T=>T.id!==e),minimized:n.minimized.filter(T=>T.id!==e),panels:g}}),r&&S.current.publish("panel:closed",{id:e})},[]),he=G((e,r)=>{H.current[e]=r},[]),Q=G(e=>{delete H.current[e]},[]),ge=G((e,r,n)=>{d(o=>{let l=o.panels[e];return l?{...o,panels:{...o.panels,[e]:{...l,dirty:r,dirtyOptions:n}}}:o})},[]),te=G((e,r)=>{d(n=>{let o=n.panels[e];return o?{...n,panels:{...n.panels,[e]:{...o,title:r}}}:n})},[]),oe=G(async(e,r)=>{if(r?.force){ue(e);return}let n=H.current[e];if(n&&!await n())return;let o=P.current.panels[e];if(o?.dirty)if(r?.onConfirm){if(!await r.onConfirm(o.dirtyOptions))return}else return;ue(e)},[ue]),Xe=G(e=>{let r=P.current.panels[e]?.state!=="minimized"&&e in P.current.panels;d(n=>{let o=n.panels[e];if(!o||o.state==="minimized"||p.get(o.component)?.defaultOptions?.canMinimize===!1)return n;let g,w;if(o.state==="floating"){let x=n.floating.find(_=>_.id===e);x&&(g={x:Number(x.x),y:Number(x.y),width:Number(x.width),height:Number(x.height),stickyRight:x.stickyRight,stickyBottom:x.stickyBottom})}else if(o.state==="docked"){let x=_=>{if(_.type==="leaf")return _.panels.includes(e)?_.id:null;for(let J of _.children){let V=x(J);if(V)return V}return null};w=x(n.gridRoot)??void 0}let T=ne(n.gridRoot,e);return{...n,gridRoot:T||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:n.floating.filter(x=>x.id!==e),minimized:[...n.minimized,{id:e,title:o.title,component:o.component}],panels:{...n.panels,[e]:{...o,state:"minimized",previousState:o.state,lastFloatingRect:g,lastLeafId:w}}}}),r&&S.current.publish("panel:minimized",{id:e})},[]),ke=G(e=>{let r=P.current.panels[e]?.state==="minimized";d(n=>{let o=n.panels[e];if(!o||o.state!=="minimized")return n;let l=n.minimized.filter(w=>w.id!==e);if((o.previousState||"docked")==="floating"){F.current+=1;let w=p.get(o.component),T=o.lastFloatingRect||w?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},x=Y(T,n.floating);return{...n,minimized:l,floating:[...n.floating,{...x,id:e,z:F.current,stickyRight:!!o.lastFloatingRect?.stickyRight,stickyBottom:!!o.lastFloatingRect?.stickyBottom}],panels:{...n.panels,[e]:{...o,state:"floating"}}}}else{let w=(J,V)=>J.type==="leaf"?J.id===V:J.children.some(ae=>w(ae,V)),T=o.lastLeafId&&w(n.gridRoot,o.lastLeafId),x=p.get(o.component),_=x?.defaultOptions?.canDrag!==!1;if(T)return{...n,minimized:l,gridRoot:se(n.gridRoot,o.lastLeafId,e),panels:{...n.panels,[e]:{...o,state:"docked"}}};if(_){F.current+=1;let J=o.lastFloatingRect||x?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},V=Y(J,n.floating);return{...n,minimized:l,floating:[...n.floating,{...V,id:e,z:F.current,stickyRight:!!o.lastFloatingRect?.stickyRight,stickyBottom:!!o.lastFloatingRect?.stickyBottom}],panels:{...n.panels,[e]:{...o,state:"floating"}}}}else{let J=X(n.gridRoot)||"group-default";return{...n,minimized:l,gridRoot:se(n.gridRoot,J,e),panels:{...n.panels,[e]:{...o,state:"docked"}}}}}}),r&&S.current.publish("panel:restored",{id:e})},[Y]),be=G((e,r)=>{d(n=>{let o=n.panels[e];if(!o||p.get(o.component)?.defaultOptions?.canDrag===!1)return n;let g=p.get(o.component),w=r||g?.defaultOptions?.favoritePosition||{x:300,y:150,width:450,height:350},T=ne(n.gridRoot,e);F.current+=1;let x=Y(w,n.floating);return{...n,gridRoot:T||{type:"leaf",id:"group-default",panels:[],activePanelId:null},floating:[...n.floating,{...x,id:e,z:F.current}],panels:{...n.panels,[e]:{...o,state:"floating"}}}})},[Y]),qe=G((e,r)=>{d(n=>{let o=n.panels[e];if(!o)return n;let l=n.floating.filter(T=>T.id!==e),g=ne(n.gridRoot,e),w=r||X(g||n.gridRoot)||"group-default";return{...n,gridRoot:se(g||n.gridRoot,w,e),floating:l,panels:{...n.panels,[e]:{...o,state:"docked"}}}})},[]),Ke=(e,r,n,o)=>{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:o==="left"||o==="right"?"horizontal":"vertical",sizes:[.5,.5],children:o==="left"||o==="top"?[l,e]:[e,l]}}return e}else return{...e,children:e.children.map(l=>Ke(l,r,n,o))}},Ue=G(e=>{d(r=>({...r,draggedPanelId:e}))},[]),je=G((e,r,n)=>{d(o=>{let l=o.panels[e];if(!l)return o;let g=o.floating.filter(x=>x.id!==e),w=ne(o.gridRoot,e),T;return n==="center"?T=se(w||o.gridRoot,r,e):T=Ke(w||o.gridRoot,r,e,n),{...o,gridRoot:T,floating:g,panels:{...o.panels,[e]:{...l,state:"docked"}},draggedPanelId:null}})},[]),Je=G((e,r)=>{d(n=>{let o=n.panels[e];if(!o)return n;let l=n.floating.filter(J=>J.id!==e),g=ne(n.gridRoot,e),w={type:"leaf",id:`group-edge-${Date.now()}-${Math.floor(Math.random()*1e3)}`,panels:[e],activePanelId:e},T=r==="left"||r==="right"?"horizontal":"vertical",x=r==="left"||r==="top"?[w,g||n.gridRoot]:[g||n.gridRoot,w];return{...n,gridRoot:{type:"branch",orientation:T,sizes:r==="left"||r==="top"?[.3,.7]:[.7,.3],children:x},floating:l,panels:{...n.panels,[e]:{...o,state:"docked"}},draggedPanelId:null}})},[]),Ne=G((e,r,n)=>{d(o=>{let l=o.panels[e];if(!l)return o;let g=ne(o.gridRoot,e),w=_=>{if(_.type==="leaf"){if(_.id===r){let J=_.panels.filter(Z=>Z!==e),V=Math.max(0,Math.min(n,J.length)),ae=[...J];return ae.splice(V,0,e),{..._,panels:ae,activePanelId:e}}return _}else return{..._,children:_.children.map(w)}},T=w(g||o.gridRoot),x=o.floating.filter(_=>_.id!==e);return{...o,gridRoot:T,floating:x,panels:{...o.panels,[e]:{...l,state:"docked"}},draggedPanelId:null}})},[]),ye=G(e=>{d(r=>{let n=l=>{if(l.type==="leaf")return l.id===e&&l.canClose!==!1?null:l;{let g=l.children.map(x=>n(x)).filter(x=>x!==null);if(g.length===0)return null;if(g.length===1)return g[0];let w=l.sizes.slice(0,g.length),T=w.reduce((x,_)=>x+_,0);return{...l,children:g,sizes:w.map(x=>x/T)}}},o=n(r.gridRoot);return{...r,gridRoot:o||{type:"leaf",id:"group-default",panels:[],activePanelId:null}}})},[]),Ve=G(e=>{d(r=>({...r,floating:r.floating.map(n=>n.id===e?{...n,maximized:!n.maximized}:n)}))},[]),Ze=G((e,r)=>{let n=(o,l)=>{if(o.type==="leaf")return o;if(l===e.length)return{...o,sizes:r};let g=e[l],w=o.children.map((T,x)=>x===g?n(T,l+1):T);return{...o,children:w}};d(o=>({...o,gridRoot:n(o.gridRoot,0)}))},[]),Qe=G((e,r)=>{d(n=>({...n,floating:n.floating.map(o=>o.id===e?{...o,...r}:o)}))},[]),Ae=G(()=>JSON.stringify({gridRoot:P.current.gridRoot,floating:P.current.floating,minimized:P.current.minimized,panels:P.current.panels}),[]),et=G(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 d(o=>({...o,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}},[]),tt=G(e=>{d(r=>r.activePanelId===e?r:{...r,activePanelId:e})},[]),a=G(e=>{d(r=>r.dir===e?r:{...r,dir:e,isRtl:e==="rtl"})},[]),v=G(e=>e in P.current.panels,[]),u=G(()=>Object.keys(P.current.panels),[]);mt(()=>{k&&d(e=>e.dir===k?e:{...e,dir:k,isRtl:k==="rtl"})},[k]);let z=rt(()=>({openPanel:ee,closePanel:ue,minimizePanel:Xe,restorePanel:ke,floatPanel:be,dockPanel:qe,maximizePanel:Ve,updateSplitSizes:Ze,updateFloatingPosition:Qe,focusPanel:re,isOpen:v,getOpenPanelIds:u,saveLayout:Ae,loadLayout:et,publish:$,subscribe:W,setDraggedPanelId:Ue,dockPanelToGroup:je,movePanelOrder:Ne,closeLeafGroup:ye,registerCloseGuard:he,unregisterCloseGuard:Q,setPanelDirty:ge,updatePanelTitle:te,requestClosePanel:oe,dockPanelToWorkspaceEdge:Je,setActivePanel:tt,setDirection:a}),[ee,ue,Xe,ke,be,qe,Ve,Ze,Qe,re,v,u,Ae,et,$,W,Ue,je,Ne,ye,he,Q,ge,te,oe,Je,tt,a]),N=e=>{let r=e.defaultMessage||e.id;return e.values&&Object.entries(e.values).forEach(([n,o])=>{r=r.replace(`{${n}}`,String(o))}),r},K=rt(()=>({modalClass:C,modalBodyClass:A,sidePanelClass:D,sidePanelBodyClass:M,windowClass:R,windowBodyClass:O}),[C,A,D,M,R,O]);mt(()=>{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(o=>o.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"`)},[]),mt(()=>{if(t)return t._connect(z),()=>{t._disconnect()}},[t,z]);let j=rt(()=>({getSnapshot:m,subscribeToState:B}),[m,B]);return Ie(Ot.Provider,{value:K,children:Ie(Dt.Provider,{value:p,children:Ie(Wt.Provider,{value:j,children:Ie(zt.Provider,{value:L,children:Ie(yt.Provider,{value:z,children:Ie(Lt.Provider,{value:E||N,children:Ie(Nt.Provider,{value:y,children:s})})})})})})})},gn=s=>()=>{};function Pe(s){let t=we(zt),i=we(Wt),c=Te(s);c.current=s;let I=dn(i?.subscribeToState??gn,()=>{let C=i?.getSnapshot()??t;return c.current?c.current(C):C},()=>{let C=i?.getSnapshot()??t;return c.current?c.current(C):C});if(!t)throw new Error("useWindowManagerState must be used within WindowManagerProvider");return s?I:t}var $e=()=>{let s=we(yt);if(!s)throw new Error("useWindowManagerActions must be used within WindowManagerProvider");return s},vt=()=>{let s=we(yt);if(!s)throw new Error("useWindowManagerActionsInternal must be used within WindowManagerProvider");return s},le=()=>we(Lt)||(t=>{let i=t.defaultMessage||t.id;return t.values&&Object.entries(t.values).forEach(([c,I])=>{i=i.replace(`{${c}}`,String(I))}),i}),q=(s,t)=>s?typeof s=="string"?s:t(s):"",pn=()=>{let{publish:s,subscribe:t}=$e();return{publish:s,subscribe:t}},pe=()=>we(Nt),fn=()=>Be().instanceId;function Ft(s){if(!s)return typeof document<"u"?document.documentElement.dir?.toLowerCase()==="rtl"||document.body.dir?.toLowerCase()==="rtl":!1;let t=s.closest("[dir]");return t?t.getAttribute("dir")?.toLowerCase()==="rtl":document.documentElement.dir?.toLowerCase()==="rtl"||document.body.dir?.toLowerCase()==="rtl"}import{JsonContextMenu as wn}from"replace-react-contexify";import"replace-react-contexify/styles.css";import{createContext as _t,useContext as Ht,useState as mn,useCallback as fe,useMemo as hn,useRef as yn}from"react";import{jsx as Bt}from"react/jsx-runtime";var Pn=0,bt=()=>`panel-${++Pn}-${Date.now()}`,at=new Map,At={leftPanel:null,rightPanel:null,modals:[]},$t=_t(null),Gt=_t(null),wt=({children:s})=>{let[t,i]=mn(At),c=yn(t);c.current=t;let I=fe((d,P)=>{at.set(d,P)},[]),C=fe(d=>{at.delete(d)},[]),A=fe(async(d,P,h={})=>{let m=c.current.leftPanel;if(m){let y=at.get(m.id);if(y&&!await y())return null}let B=bt(),H={id:B,Component:d,props:P,containerType:"left-panel",options:h};return i(y=>({...y,leftPanel:H})),B},[]),D=fe(async(d,P,h={})=>{let m=c.current.rightPanel;if(m){let y=at.get(m.id);if(y&&!await y())return null}let B=bt(),H={id:B,Component:d,props:P,containerType:"right-panel",options:h};return i(y=>({...y,rightPanel:H})),B},[]),M=fe((d,P,h={})=>{let m=bt(),B=P.title,H={...h,title:h.title||B||"Confirmation"},y={id:m,Component:d,props:P,containerType:"modal",options:H};return i(S=>({...S,modals:[...S.modals,y]})),m},[]),R=fe(d=>{i(P=>({leftPanel:P.leftPanel?.id===d?null:P.leftPanel,rightPanel:P.rightPanel?.id===d?null:P.rightPanel,modals:P.modals.filter(h=>h.id!==d)}))},[]),O=fe(()=>{i(At)},[]),p=fe(()=>{i(d=>({...d,modals:[]}))},[]),E=fe(d=>t.leftPanel?.id===d?t.leftPanel:t.rightPanel?.id===d?t.rightPanel:t.modals.find(P=>P.id===d),[t]),b=fe((d,P)=>{i(h=>({leftPanel:h.leftPanel?.id===d?{...h.leftPanel,...P}:h.leftPanel,rightPanel:h.rightPanel?.id===d?{...h.rightPanel,...P}:h.rightPanel,modals:h.modals.map(m=>m.id===d?{...m,...P}:m)}))},[]),k=fe((d,P,h)=>{b(d,{dirty:P,dirtyOptions:h})},[b]),L=hn(()=>({openLeftPanel:A,openRightPanel:D,openModal:M,close:R,closeAll:O,closeAllModals:p,getInstance:E,updateInstance:b,setDirty:k,registerCloseHandler:I,unregisterCloseHandler:C}),[A,D,M,R,O,p,E,b,k,I,C]);return Bt($t.Provider,{value:t,children:Bt(Gt.Provider,{value:L,children:s})})},xe=()=>{let s=Ht($t);if(!s)throw new Error("usePanelState must be used within PanelProvider");return s},ze=()=>{let s=Ht(Gt);if(!s)throw new Error("usePanelActions must be used within PanelProvider");return s};import{useEffect as Yt,useRef as vn}from"react";import{jsx as Le,jsxs as Ct}from"react/jsx-runtime";var bn=({title:s,message:t,alert:i,alertType:c="info",useYesNoTitles:I=!1,onOK:C,onCancel:A})=>{let{requestClose:D,setIcon:M,setTitle:R}=Be(),O=le(),p=pe(),E=vn(null);Yt(()=>{if(s){let h=typeof s=="string"?s:O(s);R(h)}M&&M(Le("span",{children:"\u2753"}))},[s,R,M,O]),Yt(()=>{E.current?.focus()},[]);let b=typeof t=="string"?t:O(t),k=O(I?p.no:p.cancel),L=O(I?p.yes:p.ok),d=h=>{h.preventDefault(),C?.(),D()},P=()=>{A?.(),D()};return Ct("form",{onSubmit:d,className:"confirmation-form-body",children:[i&&Ct("div",{className:`confirmation-alert confirmation-alert-${c}`,children:[Le("span",{children:"\u2139\uFE0F"}),Le("span",{children:i})]}),Le("div",{style:{fontSize:"0.9rem",color:"inherit",lineHeight:1.5},children:b}),Le("hr",{style:{marginTop:"0.5rem",marginBottom:"0.5rem",opacity:.1}}),Ct("div",{className:"confirmation-actions",children:[Le("button",{type:"button",className:"dw-btn dw-btn-sm dw-btn-outline",onClick:P,children:k}),Le("button",{type:"submit",className:"dw-btn dw-btn-sm dw-btn-primary",ref:E,children:L})]})]})},We=bn;import{Fragment as In,jsx as f,jsxs as U}from"react/jsx-runtime";var Ge=new Map,dt="preserved-dom-container",xt=U("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",style:{display:"block"},children:[f("rect",{x:"3",y:"3",width:"7",height:"9",rx:"1"}),f("rect",{x:"14",y:"3",width:"7",height:"5",rx:"1"}),f("rect",{x:"14",y:"12",width:"7",height:"9",rx:"1"}),f("rect",{x:"3",y:"16",width:"7",height:"5",rx:"1"})]}),qt=s=>{let t=Ge.get(s);return t||(t=document.createElement("div"),t.style.width="100%",t.style.height="100%",Ge.set(s,t)),t},Cn=(s,t,i)=>{let c=i.get(t);if(!c)return console.warn(`[react-dockable-desktop] Panel "${s}" references component key "${t}" which is not registered. Add it to the WorkspaceClient panels config:
|
|
3
|
+
new WorkspaceClient({ panels: { "${t}": { component: YourComponent } } })`),U("div",{className:"dw-unregistered-panel",style:{border:"2px dashed #dc3545"},children:[f("h6",{style:{fontWeight:700,marginBottom:"0.25rem"},children:"\u26A0\uFE0F Component Unregistered"}),U("span",{style:{fontSize:"0.875rem",color:"var(--text-secondary, #94a3b8)"},children:["Key: ",t]})]});let I=c.Component;return f(I,{panelId:s})},Kt=new Map,De=new Map,lt=s=>{let t=De.get(s);return t||(t={onClose:new Set,onMinimize:new Set,onRestore:new Set,onResize:new Set},De.set(s,t)),t},Ut=({panelId:s})=>{let t=ve(null);return de(()=>{let i=t.current;if(!i)return;let c=qt(s);i.appendChild(c);let I=new ResizeObserver(C=>{for(let A of C){let{width:D,height:M}=A.contentRect;if(D>0&&M>0){Kt.set(s,{width:D,height:M});let R=De.get(s);R&&R.onResize.forEach(O=>O(D,M))}}});return I.observe(i),()=>{I.disconnect();let C=document.getElementById(dt);C||(C=document.createElement("div"),C.id=dt,C.style.display="none",document.body.appendChild(C)),C.appendChild(c)}},[s]),f("div",{ref:t,style:{width:"100%",height:"100%"}})},xn=({panelId:s})=>{let t=Pe(),i=He(),c=le(),I=ve(null),C=t.panels[s],A=C?i.get(C.component):null,D=A?.defaultOptions?.disableLivePreview||!1,M=Kt.get(s)||{width:800,height:500},R=M.width,O=M.height,b=Math.min(220/R,140/O);if(de(()=>{if(D)return;let k=I.current;if(!k)return;let L=Ge.get(s);if(L)return k.appendChild(L),()=>{let d=document.getElementById(dt);d||(d=document.createElement("div"),d.id=dt,d.style.display="none",document.body.appendChild(d)),d.appendChild(L)}},[s,D]),D){let k=R*b,L=O*b,d=C?.title||A?.defaultOptions?.title||"Panel",P=q(d,c),h=(Array.from(P)[0]||"P").toUpperCase();return f("div",{className:"taskbar-item-preview-frame",style:{width:`${k}px`,height:`${L}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:f("div",{style:{fontSize:"2rem",fontWeight:600,color:"var(--panel-title-color, var(--panel-text, rgba(255, 255, 255, 0.85)))",userSelect:"none"},children:h})})}return f("div",{className:"taskbar-item-preview-frame",style:{width:`${R*b}px`,height:`${O*b}px`},children:f("div",{ref:I,className:"taskbar-item-preview-host",style:{width:`${R}px`,height:`${O}px`,transform:`scale(${b})`,transformOrigin:"top left",position:"absolute",top:0,left:0,"--preview-scale":b}})})},Mn=({panelId:s,children:t})=>{let i=Pe(),{requestClosePanel:c,setPanelDirty:I,registerCloseGuard:C,unregisterCloseGuard:A,updatePanelTitle:D}=$e(),M=i.minimized.some(p=>p.id===s),R=ve(M);de(()=>{let p=De.get(s);p&&(M&&!R.current?p.onMinimize.forEach(E=>E()):!M&&R.current&&p.onRestore.forEach(E=>E()),R.current=M)},[M,s]),de(()=>()=>{let p=De.get(s);p&&(p.onClose.forEach(E=>E()),De.delete(s))},[s]);let O=Mt.useMemo(()=>({requestClose:p=>c(s,p),setDirty:p=>I(s,p),onCloseRequested:p=>(C(s,p),()=>A(s)),setTitle:p=>D(s,p),instanceId:s,onClose:p=>{let E=lt(s);return E.onClose.add(p),()=>E.onClose.delete(p)},onMinimize:p=>{let E=lt(s);return E.onMinimize.add(p),()=>E.onMinimize.delete(p)},onRestore:p=>{let E=lt(s);return E.onRestore.add(p),()=>E.onRestore.delete(p)},onResize:p=>{let E=lt(s);return E.onResize.add(p),()=>E.onResize.delete(p)}}),[s,c,I,C,A,D]);return f(Se,{value:O,children:t})},jt=({node:s,path:t,onTabRightClick:i,activeDropZone:c,onHoverDropZone:I,onTabDragStart:C,hoveredTab:A,onTabHover:D,defaultPanelIcon:M,onRequestClosePanel:R})=>{let{updateSplitSizes:O}=$e();if(s.type==="leaf")return f(Rn,{leaf:s,onTabRightClick:i,activeDropZone:c,onHoverDropZone:I,onTabDragStart:C,hoveredTab:A,onTabHover:D,defaultPanelIcon:M,onRequestClosePanel:R});let p=s.orientation==="horizontal",E=(b,k)=>{k.preventDefault();let L=p?k.clientX:k.clientY,d=[...s.sizes],P=k.currentTarget;P.classList.add("active"),document.body.classList.add("resizing-active",p?"resizing-row-active":"resizing-col-active");let h=k.currentTarget.parentElement,m=h?p?h.clientWidth:h.clientHeight:p?1e3:800,B=y=>{let W=((p?y.clientX:y.clientY)-L)/m,$=[...d];$[b]+=W,$[b+1]-=W,$[b]>.1&&$[b+1]>.1&&O(t,$)},H=()=>{P.classList.remove("active"),document.body.classList.remove("resizing-active","resizing-row-active","resizing-col-active"),window.removeEventListener("mousemove",B),window.removeEventListener("mouseup",H)};window.addEventListener("mousemove",B),window.addEventListener("mouseup",H)};return f("div",{style:{display:"flex",flexDirection:p?"row":"column",width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:s.children.map((b,k)=>{let L=s.sizes[k]*100;return U(Mt.Fragment,{children:[f("div",{style:{flexGrow:s.sizes[k],flexBasis:`${L}%`,overflow:"hidden",position:"relative"},children:f(jt,{node:b,path:[...t,k],onTabRightClick:i,activeDropZone:c,onHoverDropZone:I,onTabDragStart:C,hoveredTab:A,onTabHover:D,defaultPanelIcon:M,onRequestClosePanel:R})}),k<s.children.length-1&&f("div",{onMouseDown:d=>E(k,d),style:{cursor:p?"col-resize":"row-resize",width:p?"1px":"100%",height:p?"100%":"1px",zIndex:20},className:"resizer-bar"})]},k)})})},Rn=({leaf:s,onTabRightClick:t,activeDropZone:i,onHoverDropZone:c,onTabDragStart:I,hoveredTab:C,onTabHover:A,defaultPanelIcon:D,onRequestClosePanel:M})=>{let R=Pe(),O=He(),{openPanel:p,closeLeafGroup:E,setActivePanel:b}=vt(),k=le(),L=pe(),{windowClass:d,windowBodyClass:P}=Ce(),h=m=>{p(m,R.panels[m].component),b(m)};return U("div",{"data-active-panel-id":s.activePanelId||"",className:`workspace-panel ${d??""}`,style:{overflow:"hidden",position:"relative"},children:[U("div",{className:"workspace-tab-bar",style:{minHeight:"38px"},children:[f("div",{className:"tab-headers-container",style:{scrollbarWidth:"none"},onMouseMove:m=>{R.draggedPanelId&&m.target===m.currentTarget&&A(s.id,"EMPTY",s.panels.length,"right")},onMouseLeave:m=>{R.draggedPanelId&&m.target===m.currentTarget&&A(s.id,"",-1,null)},children:s.panels.map((m,B)=>{let H=R.panels[m];if(!H)return null;let y=s.activePanelId===m,S=R.activePanelId===m,W=O.get(H.component)?.defaultOptions,$=C&&C.leafId===s.id&&C.panelId===m,Y=B===s.panels.length-1,re=C&&C.leafId===s.id&&C.panelId==="EMPTY"&&Y,ne=$?C.side==="left"?"drag-hover-left":"drag-hover-right":re?"drag-hover-right":"";return U("div",{onClick:()=>h(m),onMouseDown:X=>{W?.canDrag!==!1&&I(m,X)},onContextMenu:X=>t(m,X),onMouseMove:X=>{if(R.draggedPanelId){let ee=X.currentTarget.getBoundingClientRect(),he=X.clientX-ee.left<ee.width/2?"left":"right";A(s.id,m,B,he)}},onMouseLeave:()=>{R.draggedPanelId&&A(s.id,"",-1,null)},className:`workspace-tab ${y?S?"active workspace-tab-active-focused":"active workspace-tab-active-unfocused":"workspace-tab-inactive"} ${ne}`,style:{cursor:W?.canDrag===!1?"default":"pointer"},children:[U("span",{className:"text-truncate",style:{maxWidth:"120px",display:"flex",alignItems:"center"},children:[f("span",{className:"workspace-tab-icon",children:W?.icon||D||xt}),U("span",{children:[q(H.title,k),H.dirty?" *":""]})]}),W?.renderHeaderActions&&f("span",{className:"tab-header-actions",onClick:X=>X.stopPropagation(),onMouseDown:X=>X.stopPropagation(),children:W.renderHeaderActions(m)}),W?.canClose!==!1&&f("span",{onClick:X=>{X.stopPropagation(),M(m)},title:q(L.closeTab,k),className:"close-tab-x",style:{width:"18px",height:"18px",...W?.renderHeaderActions?{}:{marginInlineStart:"auto"}},children:f("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:f("path",{d:"M18 6L6 18M6 6l12 12"})})})]},m)})}),s.panels.length===0&&s.keepOnEmpty&&s.canClose!==!1&&f("span",{onClick:()=>E(s.id),className:"close-tab-x header-close-empty-group",style:{width:"18px",height:"18px",cursor:"pointer"},title:q(L.closeEmptyGroup,k),children:f("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:f("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),U("div",{className:`dw-panel-body ${P??""}`,style:{position:"relative",overflow:"hidden"},children:[s.activePanelId&&R.panels[s.activePanelId]?f(Ut,{panelId:s.activePanelId},s.activePanelId):f("div",{className:"empty-leaf-placeholder",children:f("span",{children:"Empty Workspace Section"})}),R.draggedPanelId!==null&&f("div",{className:"dock-drop-zone-overlay",children:U("div",{className:"dock-target-cross",children:[f("div",{onMouseEnter:()=>c(s.id,"top"),onMouseLeave:()=>c(s.id,null),className:"dock-target-box dock-target-top",children:"\u25B2"}),f("div",{onMouseEnter:()=>c(s.id,"bottom"),onMouseLeave:()=>c(s.id,null),className:"dock-target-box dock-target-bottom",children:"\u25BC"}),f("div",{onMouseEnter:()=>c(s.id,"left"),onMouseLeave:()=>c(s.id,null),className:"dock-target-box dock-target-left",children:"\u25C0"}),f("div",{onMouseEnter:()=>c(s.id,"right"),onMouseLeave:()=>c(s.id,null),className:"dock-target-box dock-target-right",children:"\u25B6"}),f("div",{onMouseEnter:()=>c(s.id,"center"),onMouseLeave:()=>c(s.id,null),className:"dock-target-box dock-target-center",children:"\u25A3"})]})}),R.draggedPanelId!==null&&i!==null&&i.leafId===s.id&&f("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%"}})]})]})},kn=({skin:s="vscode",defaultPanelIcon:t})=>{let i=Pe(),c=He(),{restorePanel:I,minimizePanel:C,requestClosePanel:A,maximizePanel:D,updateFloatingPosition:M,focusPanel:R,floatPanel:O,setDraggedPanelId:p,dockPanelToGroup:E,movePanelOrder:b,dockPanelToWorkspaceEdge:k,setActivePanel:L,setDirection:d}=vt(),{openModal:P}=ze(),h=le(),m=pe(),B=Mt.useCallback(a=>{let v=i.panels[a];A(a,{onConfirm:u=>new Promise(z=>{let N=u||v?.dirtyOptions,K=v?q(v.title,h):"Panel";P(We,{title:N?.title||m.unsavedChangesTitle,message:N?.message||{id:m.unsavedChangesMessage.id,defaultMessage:m.unsavedChangesMessage.defaultMessage,values:{title:K}},alert:N?.alert,alertType:N?.alertType||"danger",useYesNoTitles:!0,onOK:()=>z(!0),onCancel:()=>z(!1)},{size:"small"})})})},[A,i.panels,h,P,m]),{windowClass:H,windowBodyClass:y}=Ce(),S=ve(null),F=ve(null),[W,$]=Me(null),Y=ve(null),[re,ne]=Me(!1);de(()=>()=>{Y.current&&clearTimeout(Y.current)},[]),de(()=>{W&&(i.minimized.some(v=>v.id===W.id)||$(null))},[i.minimized,W]);let[se,X]=Me(null),ee=ve(null),[ue,he]=Me({x:0,y:0}),[Q,ge]=Me(null),te=ve(null),oe=a=>{ge(a),te.current=a},[Xe,ke]=Me(null),be=ve(null),qe=(a,v,u,z)=>{let N=z?{leafId:a,panelId:v,index:u,side:z}:null;ke(N),be.current=N},Ke=(a,v)=>{let u=v?{leafId:a,position:v}:null;X(u),ee.current=u},Ue=(a,v)=>{if(v.button!==0)return;let u=v.clientX,z=v.clientY,N=!1,K=r=>{let n=r.clientX-u,o=r.clientY-z;!N&&(Math.abs(n)>5||Math.abs(o)>5)&&(N=!0,p(a)),N&&he({x:r.clientX,y:r.clientY})},j=r=>{if(window.removeEventListener("mousemove",K),window.removeEventListener("mouseup",e),N){let n=ee.current,o=be.current,l=te.current;if(l)k(a,l);else if(o){let g=o.index;o.side==="right"&&(g+=1),b(a,o.leafId,g)}else n?E(a,n.leafId,n.position):O(a,{x:r.clientX-150,y:r.clientY-15,width:450,height:350});p(null),X(null),ee.current=null,ke(null),be.current=null,oe(null)}},e=r=>{j(r)};window.addEventListener("mousemove",K),window.addEventListener("mouseup",e)},je=(a,v)=>{v.preventDefault();let u=i.panels[a];if(!u)return;let N=c.get(u.component)?.defaultOptions,K=[];N?.canDrag!==!1&&K.push({label:q(m.floatWindow,h),action:()=>O(a)}),N?.canMinimize!==!1&&K.push({label:q(m.minimizePanel,h),action:()=>C(a)}),K.length>0&&N?.canClose!==!1&&K.push({separator:!0}),N?.canClose!==!1&&K.push({label:q(m.closeTab,h),action:()=>B(a)}),K.length!==0&&F.current?.show({event:v,contextMenu:{items:K}})},Je=(a,v)=>{v.preventDefault(),$(null),F.current?.show({event:v,contextMenu:{items:[{label:q(m.restorePanel,h),action:()=>I(a)},{label:q(m.maximizePanel,h),action:()=>D(a)},{separator:!0},{label:q(m.closePanel,h),action:()=>B(a)}]}})};de(()=>{let a=Object.keys(i.panels);for(let v of Array.from(Ge.keys()))a.includes(v)||Ge.delete(v)},[i.panels]),de(()=>{let a=()=>{i.draggedPanelId!==null&&(p(null),X(null),ke(null))};return window.addEventListener("blur",a),()=>{window.removeEventListener("blur",a)}},[i.draggedPanelId]);let Ne=ve(null),[ye,Ve]=Me({width:1024,height:768});de(()=>{let a=Ne.current;if(!a)return;let v=new ResizeObserver(u=>{if(!u||u.length===0)return;let z=u[0].contentRect;process.env.NODE_ENV==="development"&&z.height<10&&console.warn("[react-dockable-desktop] Workspace height is near zero. Add: html, body, #root { height: 100%; overflow: hidden; }"),Ve({width:Math.max(100,z.width),height:Math.max(100,z.height)})});return v.observe(a),()=>{v.disconnect()}},[]),de(()=>{let a=Ne.current;if(!a)return;let v=()=>{let N=Ft(a);d(N?"rtl":"ltr")};v();let u=new MutationObserver(v);u.observe(document.documentElement,{attributes:!0,attributeFilter:["dir"]}),u.observe(document.body,{attributes:!0,attributeFilter:["dir"]});let z=a.closest("[dir]");return z&&z!==document.documentElement&&z!==document.body&&u.observe(z,{attributes:!0,attributeFilter:["dir"]}),()=>{u.disconnect()}},[d]),de(()=>{let a=ye.width,v=ye.height;i.floating.forEach(u=>{let z=typeof u.width=="string"?parseFloat(u.width):u.width,N=typeof u.height=="string"?parseFloat(u.height):u.height,K=typeof u.x=="string"?parseFloat(u.x):u.x,j=typeof u.y=="string"?parseFloat(u.y):u.y,e=z,r=N,n=K,o=j,l=!1;e>a&&(e=Math.max(200,a-20),l=!0),r>v&&(r=Math.max(150,v-40),l=!0);let g=10;if(u.stickyRight)n=a-e-g,l=!0;else{let w=a-100;n>w&&(n=Math.max(0,w),l=!0)}if(u.stickyBottom)o=v-r-g,l=!0;else{let w=v-40;o>w&&(o=Math.max(0,w),l=!0)}l&&M(u.id,{x:n,y:o,width:e,height:r})})},[ye,i.floating,M]),de(()=>{let a=v=>{if(v.button!==0)return;let u=v.target;if(!u)return;let z=u.closest(".floating-window");if(z){let K=z.getAttribute("data-window-id");K&&(L(K),R(K));return}let N=u.closest(".workspace-panel");if(N){let K=N.getAttribute("data-active-panel-id");K&&L(K)}};return document.addEventListener("mousedown",a),()=>{document.removeEventListener("mousedown",a)}},[R,L]);let Ze=(a,v)=>{let u=i.floating.find(g=>g.id===a);if(!u||u.maximized)return;R(a);let z=v.clientX,N=v.clientY,j=v.currentTarget.closest(".floating-window"),e=j?j.offsetLeft:0,r=j?j.offsetTop:0,n=!1,o=g=>{let w=g.clientX-z,T=g.clientY-N;if(!n&&(Math.abs(w)>5||Math.abs(T)>5)&&(n=!0,p(a)),n){let x=e+w,_=r+T;M(a,{x,y:_,stickyRight:!1,stickyBottom:!1})}},l=()=>{if(n){let g=ee.current,w=be.current,T=te.current;if(T)k(a,T);else if(w){let x=w.index;w.side==="right"&&(x+=1),b(a,w.leafId,x)}else g&&E(a,g.leafId,g.position);p(null),X(null),ee.current=null,ke(null),be.current=null,oe(null)}window.removeEventListener("mousemove",o),window.removeEventListener("mouseup",l)};window.addEventListener("mousemove",o),window.addEventListener("mouseup",l)},Qe=(a,v)=>{v.stopPropagation();let u=i.floating.find(l=>l.id===a);if(!u||u.maximized)return;R(a);let z=v.clientX,N=v.clientY,j=v.currentTarget.closest(".floating-window"),e=j?j.offsetWidth:400,r=j?j.offsetHeight:300,n=l=>{let g=l.clientX-z,w=l.clientY-N,T=Math.max(200,e+g),x=Math.max(150,r+w),_=u.x,J=u.y,V=ye.width,ae=ye.height,Z=typeof u.x=="string"?parseFloat(u.x):u.x,ie=typeof u.y=="string"?parseFloat(u.y):u.y,nt=typeof u.width=="string"?parseFloat(u.width):u.width,pt=typeof u.height=="string"?parseFloat(u.height):u.height,ot=Math.abs(Z+nt-V)<4,it=Math.abs(ie+pt-ae)<4;ot&&(_=V-T,_<0&&(_=0,T=V)),it&&(J=ae-x,J<0&&(J=0,x=ae)),M(a,{x:_,y:J,width:T,height:x,stickyRight:ot,stickyBottom:it})},o=()=>{window.removeEventListener("mousemove",n),window.removeEventListener("mouseup",o)};window.addEventListener("mousemove",n),window.addEventListener("mouseup",o)},Ae=a=>{if(S.current){let v=a==="left"?-150:150;S.current.scrollBy({left:v,behavior:"smooth"})}},[et,tt]=Me("dark");return de(()=>{let a=()=>{let u=document.documentElement.getAttribute("data-color-scheme")==="light"?"light":"dark";tt(u)};a();let v=new MutationObserver(a);return v.observe(document.documentElement,{attributes:!0,attributeFilter:["data-color-scheme"]}),()=>v.disconnect()},[]),U("div",{"data-workspace-skin":s,"data-color-scheme":et,style:{display:"flex",flexDirection:"column",width:"100%",height:"100%",overflow:"hidden",userSelect:"none"},dir:i.dir,children:[U("div",{ref:Ne,className:i.draggedPanelId?"dragging-active":void 0,style:{flexGrow:1,width:"100%",position:"relative",overflow:"hidden"},children:[i.draggedPanelId!==null&&U(In,{children:[f("div",{className:"workspace-edge-trigger edge-trigger-left",onMouseEnter:()=>oe("left"),onMouseLeave:()=>oe(null)}),f("div",{className:"workspace-edge-trigger edge-trigger-right",onMouseEnter:()=>oe("right"),onMouseLeave:()=>oe(null)}),f("div",{className:"workspace-edge-trigger edge-trigger-top",onMouseEnter:()=>oe("top"),onMouseLeave:()=>oe(null)}),f("div",{className:"workspace-edge-trigger edge-trigger-bottom",onMouseEnter:()=>oe("bottom"),onMouseLeave:()=>oe(null)})]}),i.draggedPanelId!==null&&Q!==null&&f("div",{className:`workspace-edge-preview edge-preview-${Q}`}),f("div",{style:{width:"100%",height:"100%",overflow:"hidden",position:"relative"},children:i.gridRoot?f(jt,{node:i.gridRoot,path:[],onTabRightClick:je,activeDropZone:se,onHoverDropZone:Ke,onTabDragStart:Ue,hoveredTab:Xe,onTabHover:qe,defaultPanelIcon:t,onRequestClosePanel:B}):f("div",{className:"empty-workspace-grid",children:"Grid Empty"})}),i.floating.map(a=>{let v=i.panels[a.id];if(!v)return null;let u=a.maximized,z=i.draggedPanelId===a.id,N=i.activePanelId===a.id,j=c.get(v.component)?.defaultOptions;return U("div",{"data-window-id":a.id,dir:i.dir,onMouseDownCapture:()=>{L(a.id),R(a.id)},className:`floating-window ${u?"maximized":""} ${N?"v2-window-focused":""} ${H??""}`,style:{position:"absolute",left:u?0:typeof a.x=="number"?`${a.x}px`:a.x,top:u?0:typeof a.y=="number"?`${a.y}px`:a.y,width:u?"100%":typeof a.width=="number"?`${a.width}px`:a.width,height:u?"100%":typeof a.height=="number"?`${a.height}px`:a.height,zIndex:a.z,pointerEvents:z?"none":"auto"},children:[U("div",{onDoubleClick:()=>D(a.id),onMouseDown:e=>{j?.canDrag!==!1&&Ze(a.id,e)},className:"floating-window-titlebar cursor-move",style:{cursor:u||j?.canDrag===!1?"default":"move"},children:[U("span",{className:"floating-window-title",children:[f("span",{className:"window-title-icon",children:j?.icon||t||xt}),U("span",{children:[q(v.title,h),v.dirty?" *":""]})]}),U("div",{className:"fw-titlebar-actions",style:{gap:"var(--header-button-gap, 4px)"},onMouseDown:e=>e.stopPropagation(),children:[j?.renderHeaderActions&&f("div",{className:"window-header-actions",children:j.renderHeaderActions(a.id)}),j?.canDrag!==!1&&f("button",{type:"button",title:q(m.windowAnchoringOptions,h),onClick:e=>{let r=!!a.stickyRight,n=!!a.stickyBottom;F.current?.show({event:e,contextMenu:{items:[{label:q(m.anchorToRightEdge,h),checkbox:{active:!0,enabled:!0,value:r},action:()=>{let o=ye.width,l=typeof a.width=="string"?parseFloat(a.width):a.width;r?M(a.id,{stickyRight:!1}):M(a.id,{x:o-l-10,stickyRight:!0})}},{label:q(m.anchorToBottomEdge,h),checkbox:{active:!0,enabled:!0,value:n},action:()=>{let o=ye.height,l=typeof a.height=="string"?parseFloat(a.height):a.height;n?M(a.id,{stickyBottom:!1}):M(a.id,{y:o-l-10,stickyBottom:!0})}}]}})},className:"custom-tab-btn btn-anchor-tab",children:U("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:[f("circle",{cx:"12",cy:"5",r:"2"}),f("path",{d:"M12 7v7m0 0a4 4 0 0 1-4-4M12 14a4 4 0 0 0 4-4M5 18h14"})]})}),f("button",{type:"button",title:u?q(m.restoreSize,h):q(m.maximize,h),onClick:()=>D(a.id),className:"custom-tab-btn btn-maximize-tab",children:f("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:f("rect",{x:"4",y:"4",width:"16",height:"16",rx:"1.5"})})}),j?.canMinimize!==!1&&f("button",{type:"button",title:q(m.minimize,h),onClick:()=>C(a.id),className:"custom-tab-btn btn-minimize-tab",children:f("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3",children:f("path",{d:"M5 12h14"})})}),j?.canClose!==!1&&f("button",{type:"button",title:q(m.close,h),onClick:()=>B(a.id),className:"custom-tab-btn btn-close-tab",children:f("svg",{width:"10",height:"10",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3",children:f("path",{d:"M18 6L6 18M6 6l12 12"})})})]})]}),f("div",{className:y??void 0,style:{flexGrow:1,width:"100%",overflow:"hidden",position:"relative",isolation:"isolate"},children:f(Ut,{panelId:a.id},a.id)}),!u&&f("div",{onMouseDown:e=>Qe(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)})]}),i.minimized.length>0&&U("div",{className:"taskbar-footer-container",style:{height:"48px",zIndex:100},children:[f("button",{type:"button",onClick:()=>Ae("left"),className:"taskbar-nav-btn",style:{display:i.minimized.length>4?"block":"none"},children:"\u25C0"}),f("div",{ref:S,className:"taskbar-items-container",style:{scrollSnapType:"x mandatory"},children:i.minimized.map(a=>{let u=c.get(a.component)?.defaultOptions?.icon||t||xt;return f("div",{onClick:()=>{$(null),I(a.id)},onContextMenu:z=>Je(a.id,z),onMouseEnter:z=>{if(re)return;Y.current&&clearTimeout(Y.current);let N=z.currentTarget.getBoundingClientRect();z.clientX>=N.left&&z.clientX<=N.right&&z.clientY>=N.top&&z.clientY<=N.bottom&&$({id:a.id,rect:N,title:a.title,component:a.component})},onMouseLeave:()=>{Y.current=setTimeout(()=>{$(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:f("span",{className:"taskbar-item-icon",children:u})},a.id)})}),W&&Xt(U("div",{className:"taskbar-item-tooltip",dir:i.dir,style:{position:"fixed",left:`${W.rect.left+W.rect.width/2}px`,top:`${W.rect.top-8}px`,transform:"translateX(-50%) translateY(-100%)",opacity:1,pointerEvents:"auto",zIndex:999999},onMouseEnter:()=>{Y.current&&clearTimeout(Y.current)},onMouseLeave:()=>{$(null)},onClick:()=>{I(W.id),$(null)},children:[U("div",{className:"tooltip-header-row",children:[U("span",{className:"tooltip-title-text text-truncate",style:{maxWidth:"140px"},children:[q(W.title,h),i.panels[W.id]?.dirty?" *":""]}),f("span",{onClick:a=>{a.stopPropagation(),B(W.id),$(null)},title:q(m.closePanel,h),className:"tooltip-close-x",children:f("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:f("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),f(xn,{panelId:W.id})]}),document.body),f("button",{type:"button",onClick:()=>Ae("right"),className:"taskbar-nav-btn",style:{display:i.minimized.length>4?"block":"none"},children:"\u25B6"})]}),Object.keys(i.panels).map(a=>{let v=i.panels[a];if(!v)return null;let u=qt(a);return Xt(f(Mn,{panelId:a,children:f("div",{style:{width:"100%",height:"100%"},children:Cn(a,v.component,c)})}),u,a)}),f(wn,{ref:F,id:"workspace-context-menu",theme:"dark",onShow:()=>ne(!0),onHide:()=>ne(!1)}),i.draggedPanelId!==null&&!i.floating.some(a=>a.id===i.draggedPanelId)&&U("div",{className:"drag-ghost-tab",style:{left:ue.x+12,top:ue.y+12,zIndex:1e5},children:["\u{1F4C4} ",q(i.panels[i.draggedPanelId]?.title,h)||"Tab"]})]})},Sn=kn;var Rt=class{registry;initialState;config;_actions=null;_initialized=!1;_pendingCalls=[];_pendingOpenPanelIds=new Set;_pendingSubscriptions=[];_disconnectedWarnTimer=null;constructor(t={}){if(this.registry=new Oe,this.initialState=t.initialState??null,this.config={formatMessage:t.formatMessage,predefinedMessages:t.predefinedMessages,dir:t.dir},t.panels)for(let[i,c]of Object.entries(t.panels))this.registry.register(i,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 i=this._pendingCalls.splice(0);for(let c of i)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,i){if(this._actions)return this._actions.subscribe(t,i);let c={event:t,callback:i,unsub:null};return this._pendingSubscriptions.push(c),()=>{c.unsub?.(),c.unsub=null;let I=this._pendingSubscriptions.indexOf(c);I!==-1&&this._pendingSubscriptions.splice(I,1)}}openPanel(...t){if(this._actions){this._actions.openPanel(...t);return}let i=t[0];this._pendingOpenPanelIds.has(i)||(this._pendingOpenPanelIds.add(i),this._pendingCalls.push(c=>{this._pendingOpenPanelIds.delete(i),c.openPanel(...t)}),this._startWarnTimer())}closePanel(t){this._dispatch(i=>i.closePanel(t))}minimizePanel(t){this._dispatch(i=>i.minimizePanel(t))}restorePanel(t){this._dispatch(i=>i.restorePanel(t))}floatPanel(...t){this._dispatch(i=>i.floatPanel(...t))}dockPanel(...t){this._dispatch(i=>i.dockPanel(...t))}maximizePanel(t){this._dispatch(i=>i.maximizePanel(t))}focusPanel(t){this._dispatch(i=>i.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(i=>{i.loadLayout(t)}),!1)}setDirection(t){this._dispatch(i=>i.setDirection(t))}publish(t,i){this._dispatch(c=>c.publish(t,i))}subscribe(t,i){return this._subscribeRaw(t,i)}onPanelOpen(t){return this._subscribeRaw("panel:opened",i=>{let c=i;t(c.id,c.component)})}onPanelClose(t){return this._subscribeRaw("panel:closed",i=>{t(i.id)})}onPanelMinimize(t){return this._subscribeRaw("panel:minimized",i=>{t(i.id)})}onPanelRestore(t){return this._subscribeRaw("panel:restored",i=>{t(i.id)})}};import"react";import{jsx as Jt}from"react/jsx-runtime";var Tn=s=>Jt(Pt,{...s,children:Jt(wt,{children:s.children})});import{useCallback as Ye,useRef as Vt,useEffect as En,useState as zn,useMemo as Ln}from"react";import{Fragment as Dn,jsx as me,jsxs as kt}from"react/jsx-runtime";var Wn=({modal:s,index:t,isTopmost:i})=>{let{close:c,openModal:I,updateInstance:C,setDirty:A}=ze(),D=le(),M=pe(),{dir:R}=Pe(),{modalClass:O,modalBodyClass:p}=Ce(),E=Vt(null),{id:b,Component:k,props:L,options:d,dirty:P,dirtyOptions:h}=s,m=d,[B,H]=zn(m.icon||null),y=Vt(m);y.current=m;let S=q(m.title,D),F=Ye(async Q=>{if(Q?.force){c(b);return}if(E.current){if(!await E.current())return;c(b);return}if(P){I(We,{title:h?.title||M.unsavedChangesTitle,message:h?.message||{id:M.unsavedChangesMessage.id,defaultMessage:M.unsavedChangesMessage.defaultMessage,values:{title:S}},alert:h?.alert,alertType:h?.alertType||"danger",useYesNoTitles:!0,onOK:()=>c(b)},{size:"small"});return}c(b)},[c,I,b,P,h,S,M]),W=Ye((Q,ge)=>A(b,Q,ge),[A,b]),$=Ye(Q=>C(b,{options:{...y.current,title:Q}}),[C,b]),Y=Ye(Q=>H(Q),[]),re=Ye(Q=>(E.current=Q,()=>{E.current=null}),[]),ne=Ln(()=>({requestClose:F,setDirty:W,setTitle:$,setIcon:Y,onCloseRequested:re,containerType:"modal",instanceId:b}),[F,W,$,Y,re,b]),se=P?`${S} *`:S,X=m.size?`v2-modal-size-${m.size}`:"v2-modal-size-auto",ee=m.closable!==!1;En(()=>{if(!i||!ee)return;let Q=ge=>{ge.key==="Escape"&&(ge.stopPropagation(),F())};return document.addEventListener("keydown",Q),()=>document.removeEventListener("keydown",Q)},[F,ee,i]);let he=1e4+t*10;return kt("div",{className:"v2-modal-overlay",style:{zIndex:he},dir:R,children:[me("div",{className:"v2-modal-curtain",onClick:ee?()=>F():void 0}),kt("div",{className:`v2-modal-window ${X} ${O??""}`,children:[kt("div",{className:"v2-modal-header",children:[B&&me("div",{className:"v2-modal-icon",children:B}),me("h4",{className:"v2-modal-title",children:se}),ee&&me("button",{className:"v2-modal-close-button",onClick:()=>F(),title:D(M.closeTooltip),type:"button",children:me("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:me("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),me("div",{className:`v2-modal-body ${p??""}`,children:me(Se,{value:ne,children:me(k,{...L,panelId:b})})})]})]})},Nn=()=>{let{modals:s}=xe();return s.length===0?null:me(Dn,{children:s.map((t,i)=>me(Wn,{modal:t,index:i,isTopmost:i===s.length-1},t.id))})},On=Nn;import{useCallback as Fe,useRef as Zt,useEffect as Qt,useState as Fn,useMemo as An}from"react";import{Fragment as Gn,jsx as ce,jsxs as St}from"react/jsx-runtime";var ct=({panel:s,position:t,defaultWidth:i})=>{let{close:c,openModal:I,updateInstance:C,setDirty:A,registerCloseHandler:D,unregisterCloseHandler:M}=ze(),{modals:R}=xe(),O=le(),p=pe(),{dir:E}=Pe(),{sidePanelClass:b,sidePanelBodyClass:k}=Ce(),L=Zt(null),{id:d,Component:P,props:h,options:m,dirty:B,dirtyOptions:H}=s,y=m,[S,F]=Fn(y.icon||null),W=Zt(y);W.current=y;let $=q(y.title,O),Y=Fe(async te=>{if(te?.force){c(d);return}if(L.current){if(!await L.current())return;c(d);return}if(B){I(We,{title:H?.title||p.unsavedChangesTitle,message:H?.message||{id:p.unsavedChangesMessage.id,defaultMessage:p.unsavedChangesMessage.defaultMessage,values:{title:$}},alert:H?.alert,alertType:H?.alertType||"danger",useYesNoTitles:!0,onOK:()=>c(d)},{size:"small"});return}c(d)},[c,I,d,B,H,$,p]),re=Fe(async()=>L.current?await L.current():!B,[B]);Qt(()=>(D(d,re),()=>M(d)),[d,re,D,M]);let ne=Fe((te,oe)=>A(d,te,oe),[A,d]),se=Fe(te=>C(d,{options:{...W.current,title:te}}),[C,d]),X=Fe(te=>F(te),[]),ee=Fe(te=>(L.current=te,()=>{L.current=null}),[]),ue=An(()=>({requestClose:Y,setDirty:ne,setTitle:se,setIcon:X,onCloseRequested:ee,containerType:t==="left"?"left-panel":"right-panel",instanceId:d}),[Y,ne,se,X,ee,t,d]),he=B?`${$} *`:$;Qt(()=>{let te=oe=>{oe.key==="Escape"&&R.length===0&&Y()};return document.addEventListener("keydown",te),()=>document.removeEventListener("keydown",te)},[Y,R.length]);let Q=y.width||i||400,ge=typeof Q=="number"?`${Q}px`:Q;return ce("div",{className:`v2-side-panel v2-side-panel-${t} v2-side-panel-visible ${b??""}`,style:{width:ge},dir:E,children:St("div",{className:"v2-side-panel-window",children:[St("div",{className:"v2-side-panel-header",children:[S&&ce("div",{className:"v2-side-panel-icon",children:S}),ce("h4",{className:"v2-side-panel-title",children:he}),ce("button",{className:"v2-side-panel-close-button",onClick:()=>Y(),title:O(p.closeTooltip),type:"button",children:ce("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:ce("path",{d:"M18 6L6 18M6 6l12 12"})})})]}),ce("div",{className:`v2-side-panel-body ${k??""}`,children:ce(Se,{value:ue,children:ce(P,{...h,panelId:d})})})]})})},Bn=({defaultWidth:s})=>{let{leftPanel:t,rightPanel:i}=xe();return St(Gn,{children:[t&&ce(ct,{panel:t,position:"left",defaultWidth:s},t.id),i&&ce(ct,{panel:i,position:"right",defaultWidth:s},i.id)]})},_n=({defaultWidth:s})=>{let{leftPanel:t}=xe();return t?ce(ct,{panel:t,position:"left",defaultWidth:s},t.id):null},Hn=({defaultWidth:s})=>{let{rightPanel:t}=xe();return t?ce(ct,{panel:t,position:"right",defaultWidth:s},t.id):null},$n=Bn;import{useState as en,useEffect as ut,useRef as Yn,useCallback as tn,useImperativeHandle as Xn,forwardRef as qn}from"react";import{Fragment as Un,jsx as Re,jsxs as gt}from"react/jsx-runtime";var Kn=qn(function({position:t="right",tabs:i,drawerWidth:c="220px",activeTabId:I,onActiveTabChange:C,children:A},D){let M=I!==void 0,R=le(),O=pe(),[p,E]=en(null),b=M?I:p,[k,L]=en(()=>{let y=new Set;for(let S of i)S.eagerMount&&y.add(S.id);return y});ut(()=>{let y=i.filter(S=>S.eagerMount&&!k.has(S.id));y.length>0&&L(S=>{let F=new Set(S);for(let W of y)F.add(W.id);return F})},[i]);let d=Yn(b??null);ut(()=>{d.current=b??null},[b]);let P=tn(y=>{M||E(y),C?.(y)},[M,C]);Xn(D,()=>({openTab:y=>P(y),closeDrawer:()=>P(null),getActiveTab:()=>d.current}),[P]);let h=y=>{P(b===y?null:y)},m=tn(()=>P(null),[P]);ut(()=>{b&&!k.has(b)&&L(y=>{let S=new Set(y);return S.add(b),S})},[b,k]),ut(()=>{b===null&&L(y=>{let S=!1,F=new Set(y);for(let W of y){let $=i.find(Y=>Y.id===W);$&&!$.eagerMount&&!$.preserveState&&(F.delete(W),S=!0)}return S?F:y})},[b,i]);let B=Re("div",{className:`sidebar-tabs-strip ${t}`,style:{width:"56px",height:"100%"},children:i.map(y=>{let S=b===y.id;return Re("button",{type:"button",onClick:()=>h(y.id),className:`sidebar-tab-btn ${S?"active":""}`,title:y.label,"aria-pressed":S,children:y.icon},y.id)})}),H=Re("div",{className:`sidebar-content-drawer h-100 ${t}`,style:{width:b?c:"0px",minWidth:b?c:"0px",overflow:"hidden",flexShrink:0},children:i.map(y=>{if(!k.has(y.id))return null;let F=b===y.id,W=()=>P(y.id);return gt("div",{style:{display:F?"flex":"none",flexDirection:"column",height:"100%",width:"100%"},children:[gt("div",{className:"sidebar-drawer-header",children:[Re("span",{className:"sidebar-header-title",children:y.label}),Re("button",{type:"button",onClick:m,className:"sidebar-close-btn",title:R(O.closePanelTooltip),"aria-label":R(O.closePanelTooltip),children:gt("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[Re("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),Re("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})]}),Re("div",{className:"sidebar-drawer-body",children:y.renderContent(y.id,m,W)})]},y.id)})});return gt(Un,{children:[t==="left"&&B,t==="left"&&H,A,t==="right"&&H,t==="right"&&B]})});export{We as ConfirmationForm,Tn as DockableDesktopProvider,ft as FormContainerContext,Se as FormContainerProvider,_n as LeftPanelRenderer,On as ModalStackRenderer,wt as PanelProvider,st as PanelRegistry,Oe as PanelRegistryClass,Hn as RightPanelRenderer,$n as SidePanelRenderer,Kn as Sidebar,Sn as WindowManager,Pt as WindowManagerProvider,Rt as WorkspaceClient,_e as defaultPredefinedMessages,q as formatLabel,Be as useFormContainer,le as useFormatMessage,ze as usePanelActions,pn as usePanelContext,fn as usePanelId,xe as usePanelState,pe as usePredefinedMessages,He as useRegistry,Ce as useStyleClasses,$e as useWindowManagerActions,Pe as useWindowManagerState};
|
|
4
4
|
//# sourceMappingURL=index.js.map
|