react-zeugma 6.8.0 → 6.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -49
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/{types-DeeEm3Ls.d.cts → types-V7PXu-Mo.d.cts} +29 -0
- package/dist/{types-DeeEm3Ls.d.ts → types-V7PXu-Mo.d.ts} +29 -0
- package/dist/utils.cjs +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +1 -1
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { Dispatch, SetStateAction, ReactNode } from 'react';
|
|
2
2
|
|
|
3
|
+
declare global {
|
|
4
|
+
interface Window {
|
|
5
|
+
__zeugmaActivePopoutDocument?: Document | null;
|
|
6
|
+
__zeugmaCleanup?: () => void;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
3
9
|
type SplitDirection = 'row' | 'column';
|
|
4
10
|
interface SplitNode {
|
|
5
11
|
type: 'split';
|
|
@@ -23,6 +29,8 @@ interface TabDetails {
|
|
|
23
29
|
isActive: boolean;
|
|
24
30
|
index: number;
|
|
25
31
|
metadata: Record<string, unknown> | undefined;
|
|
32
|
+
/** Force-remount the component during window transitions instead of adopting the DOM node. */
|
|
33
|
+
remountOnPopout?: boolean;
|
|
26
34
|
}
|
|
27
35
|
interface RenderTabProps extends TabDetails {
|
|
28
36
|
/** Whether this tab is currently being dragged. */
|
|
@@ -33,6 +41,12 @@ interface RenderTabProps extends TabDetails {
|
|
|
33
41
|
onSelect: () => void;
|
|
34
42
|
/** Callback to close/remove this tab. */
|
|
35
43
|
onRemove: () => void;
|
|
44
|
+
/** Whether this tab is popped out in a separate window. */
|
|
45
|
+
isPoppedOut: boolean;
|
|
46
|
+
/** Popout this tab. */
|
|
47
|
+
popout: () => void;
|
|
48
|
+
/** Dock this tab back. */
|
|
49
|
+
dock: () => void;
|
|
36
50
|
}
|
|
37
51
|
interface UseZeugmaOptions {
|
|
38
52
|
/** Initial layout tree model defining pane organization for uncontrolled mode. Only used on initial mount. */
|
|
@@ -55,6 +69,8 @@ interface ZeugmaState {
|
|
|
55
69
|
fullscreenPaneId: string | null;
|
|
56
70
|
/** Whether the layout is globally locked. */
|
|
57
71
|
locked: boolean;
|
|
72
|
+
/** The list of tab/widget IDs that are currently open in a new window. */
|
|
73
|
+
poppedOutTabIds: string[];
|
|
58
74
|
}
|
|
59
75
|
interface ZeugmaStateSetters {
|
|
60
76
|
/** Updates the layout tree. Also resets transient states like fullscreenPaneId. */
|
|
@@ -85,6 +101,10 @@ interface ZeugmaActions {
|
|
|
85
101
|
updateSplitPercentage: (currentNode: SplitNode, percentage: number) => void;
|
|
86
102
|
/** Moves/reorders a tab relative to another target tab. */
|
|
87
103
|
moveTab: (draggedTabId: string, targetTabId: string, position?: 'before' | 'after' | 'center') => void;
|
|
104
|
+
/** Popout the specified tab into a new window. */
|
|
105
|
+
popoutTab: (tabId: string) => void;
|
|
106
|
+
/** Dock the specified tab back to the main layout. */
|
|
107
|
+
dockTab: (tabId: string) => void;
|
|
88
108
|
}
|
|
89
109
|
interface ZeugmaQueries {
|
|
90
110
|
/** Find a PaneNode or WidgetNode by its ID in the layout tree. */
|
|
@@ -198,6 +218,15 @@ interface BaseZeugmaProps {
|
|
|
198
218
|
onDismissIntentChange?: (paneId: string | null) => void;
|
|
199
219
|
/** Configuration for layout persistence in localStorage. */
|
|
200
220
|
persist?: boolean | ZeugmaPersistOptions;
|
|
221
|
+
/** Optional custom wrapper element/component to wrap the contents of a popout tab.
|
|
222
|
+
* Useful for styled-components (StyleSheetManager), Antd (ConfigProvider), etc.
|
|
223
|
+
*/
|
|
224
|
+
renderPopoutWrapper?: (props: {
|
|
225
|
+
tabId: string;
|
|
226
|
+
document: Document;
|
|
227
|
+
window: Window;
|
|
228
|
+
children: React.ReactNode;
|
|
229
|
+
}) => React.ReactNode;
|
|
201
230
|
}
|
|
202
231
|
interface ZeugmaPersistOptions {
|
|
203
232
|
/** Whether to enable persistence. Defaults to true if the object is provided. */
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { Dispatch, SetStateAction, ReactNode } from 'react';
|
|
2
2
|
|
|
3
|
+
declare global {
|
|
4
|
+
interface Window {
|
|
5
|
+
__zeugmaActivePopoutDocument?: Document | null;
|
|
6
|
+
__zeugmaCleanup?: () => void;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
3
9
|
type SplitDirection = 'row' | 'column';
|
|
4
10
|
interface SplitNode {
|
|
5
11
|
type: 'split';
|
|
@@ -23,6 +29,8 @@ interface TabDetails {
|
|
|
23
29
|
isActive: boolean;
|
|
24
30
|
index: number;
|
|
25
31
|
metadata: Record<string, unknown> | undefined;
|
|
32
|
+
/** Force-remount the component during window transitions instead of adopting the DOM node. */
|
|
33
|
+
remountOnPopout?: boolean;
|
|
26
34
|
}
|
|
27
35
|
interface RenderTabProps extends TabDetails {
|
|
28
36
|
/** Whether this tab is currently being dragged. */
|
|
@@ -33,6 +41,12 @@ interface RenderTabProps extends TabDetails {
|
|
|
33
41
|
onSelect: () => void;
|
|
34
42
|
/** Callback to close/remove this tab. */
|
|
35
43
|
onRemove: () => void;
|
|
44
|
+
/** Whether this tab is popped out in a separate window. */
|
|
45
|
+
isPoppedOut: boolean;
|
|
46
|
+
/** Popout this tab. */
|
|
47
|
+
popout: () => void;
|
|
48
|
+
/** Dock this tab back. */
|
|
49
|
+
dock: () => void;
|
|
36
50
|
}
|
|
37
51
|
interface UseZeugmaOptions {
|
|
38
52
|
/** Initial layout tree model defining pane organization for uncontrolled mode. Only used on initial mount. */
|
|
@@ -55,6 +69,8 @@ interface ZeugmaState {
|
|
|
55
69
|
fullscreenPaneId: string | null;
|
|
56
70
|
/** Whether the layout is globally locked. */
|
|
57
71
|
locked: boolean;
|
|
72
|
+
/** The list of tab/widget IDs that are currently open in a new window. */
|
|
73
|
+
poppedOutTabIds: string[];
|
|
58
74
|
}
|
|
59
75
|
interface ZeugmaStateSetters {
|
|
60
76
|
/** Updates the layout tree. Also resets transient states like fullscreenPaneId. */
|
|
@@ -85,6 +101,10 @@ interface ZeugmaActions {
|
|
|
85
101
|
updateSplitPercentage: (currentNode: SplitNode, percentage: number) => void;
|
|
86
102
|
/** Moves/reorders a tab relative to another target tab. */
|
|
87
103
|
moveTab: (draggedTabId: string, targetTabId: string, position?: 'before' | 'after' | 'center') => void;
|
|
104
|
+
/** Popout the specified tab into a new window. */
|
|
105
|
+
popoutTab: (tabId: string) => void;
|
|
106
|
+
/** Dock the specified tab back to the main layout. */
|
|
107
|
+
dockTab: (tabId: string) => void;
|
|
88
108
|
}
|
|
89
109
|
interface ZeugmaQueries {
|
|
90
110
|
/** Find a PaneNode or WidgetNode by its ID in the layout tree. */
|
|
@@ -198,6 +218,15 @@ interface BaseZeugmaProps {
|
|
|
198
218
|
onDismissIntentChange?: (paneId: string | null) => void;
|
|
199
219
|
/** Configuration for layout persistence in localStorage. */
|
|
200
220
|
persist?: boolean | ZeugmaPersistOptions;
|
|
221
|
+
/** Optional custom wrapper element/component to wrap the contents of a popout tab.
|
|
222
|
+
* Useful for styled-components (StyleSheetManager), Antd (ConfigProvider), etc.
|
|
223
|
+
*/
|
|
224
|
+
renderPopoutWrapper?: (props: {
|
|
225
|
+
tabId: string;
|
|
226
|
+
document: Document;
|
|
227
|
+
window: Window;
|
|
228
|
+
children: React.ReactNode;
|
|
229
|
+
}) => React.ReactNode;
|
|
201
230
|
}
|
|
202
231
|
interface ZeugmaPersistOptions {
|
|
203
232
|
/** Whether to enable persistence. Defaults to true if the object is provided. */
|
package/dist/utils.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';function M(){return "pane-"+Math.random().toString(36).substring(2,11)}function x(n,t){if(n===null)return null;if(n.type==="pane")return n.id===t?null:n;let e=x(n.first,t),i=x(n.second,t);return e===null?i:i===null?e:{...n,first:e,second:i}}function P(n,t){if(n===null)return null;if(n.type==="pane"){if(n.tabIds.includes(t)){let s=n.tabIds.filter(o=>o!==t);if(s.length===0)return null;let l=n.activeTabId;n.activeTabId===t&&(l=s[0]);let u={...n.tabsMetadata};return delete u[t],{...n,tabIds:s,activeTabId:l,tabsMetadata:Object.keys(u).length>0?u:void 0}}return n}let e=P(n.first,t),i=P(n.second,t);return e===null?i:i===null?e:{...n,first:e,second:i}}function v(n,t,e,i,s){if(n===null)return typeof s=="string"?{type:"pane",id:M(),tabIds:[s],activeTabId:s}:s;if(n.type==="pane"){if(n.id===t){let l=typeof s=="string"?{type:"pane",id:M(),tabIds:[s],activeTabId:s}:s,u=i==="left"||i==="top";return {type:"split",direction:e,first:u?l:n,second:u?n:l,splitPercentage:50}}return n}return {...n,first:v(n.first,t,e,i,s)||n.first,second:v(n.second,t,e,i,s)||n.second}}function D(n,t){if(n===null)return t;function e(i,s){return i.type==="pane"?{type:"split",direction:s==="row"?"column":"row",splitPercentage:50,first:i,second:t}:{...i,second:e(i.second,i.direction)}}return e(n,null)}function h(n,t,e,i){if(n===null)return {type:"pane",id:M(),tabIds:[e],activeTabId:e,tabsMetadata:i?{[e]:i}:void 0};let s=t?y(n,t):null;if(s&&s.type==="pane"){let o=function(r){if(r.type==="pane"&&r.id===t){let f=[...r.tabIds];f.includes(e)||f.push(e);let a=r.tabsMetadata;return i&&(a={...r.tabsMetadata,[e]:i}),{...r,tabIds:f,activeTabId:e,tabsMetadata:a}}return r.type==="split"?{...r,first:o(r.first),second:o(r.second)}:r};return o(n)}let l={type:"pane",id:M(),tabIds:[e],activeTabId:e,tabsMetadata:i?{[e]:i}:void 0};return D(n,l)}function w(n,t,e){return n===null?null:n===t?{...n,splitPercentage:e}:n.type==="split"?{...n,first:w(n.first,t,e)||n.first,second:w(n.second,t,e)||n.second}:n}function y(n,t){return n===null?null:n.type==="pane"?n.id===t?n:null:n.type==="split"?y(n.first,t)??y(n.second,t):null}function N(n,t){return n===null?null:n.type==="pane"?n.tabIds.includes(t)?n:null:n.type==="split"?N(n.first,t)??N(n.second,t):null}function j(n,t){let e=N(n,t);if(!e)return null;let i=e.tabIds.indexOf(t);return {id:t,paneId:e.id,isActive:e.activeTabId===t,index:i,metadata:e.tabsMetadata?.[t]}}function R(n,t){return N(n,t)?.tabsMetadata?.[t]}function $(n,t){let e=y(n,t);return e?.tabsMetadata?.[e.activeTabId]}function S(n,t,e){if(n===null)return null;if(n.type==="pane"){if(n.tabIds.includes(t)){let i=n.tabsMetadata||{},s=i[t],l=e(s),u={...i};return l===void 0?delete u[t]:u[t]=l,{...n,tabsMetadata:Object.keys(u).length>0?u:void 0}}return n}return n.type==="split"?{...n,first:S(n.first,t,e)??n.first,second:S(n.second,t,e)??n.second}:n}function O(n,t,e){if(n===null)return null;if(n.type==="pane"){if(n.id===t){if(e===false){let{locked:i,...s}=n;return s}return {...n,locked:e}}return n}return n.type==="split"?{...n,first:O(n.first,t,e)??n.first,second:O(n.second,t,e)??n.second}:n}function C(n,t,e){return n===null?null:n.type==="pane"?n.id===t?n.activeTabId===e?n:{...n,activeTabId:e}:n:n.type==="split"?{...n,first:C(n.first,t,e)??n.first,second:C(n.second,t,e)??n.second}:n}function B(n,t,e){if(n===null)return null;let s=N(n,t)?.tabsMetadata?.[t],l=P(n,t);if(l===null)return {type:"pane",id:M(),tabIds:[t],activeTabId:t,tabsMetadata:s?{[t]:s}:void 0};function u(o){if(o.type==="pane"){if(o.id===e){let r=[...o.tabIds];r.includes(t)||r.push(t);let f={...o.tabsMetadata};return s&&(f[t]=s),{...o,tabIds:r,activeTabId:t,tabsMetadata:Object.keys(f).length>0?f:void 0}}return o}return o.type==="split"?{...o,first:u(o.first),second:u(o.second)}:o}return u(l)}function L(n,t,e){if(n===null)return null;if(t===e)return n;let i=N(n,t),s=N(n,e);if(!i||!s)return n;let l=i.id,u=s.id,o=i.tabsMetadata?.[t],r=s.tabsMetadata?.[e];function f(a){if(a.type==="pane"){let T=false,c=[...a.tabIds],p=a.activeTabId,d=a.tabsMetadata?{...a.tabsMetadata}:{};if(l===u){if(a.id===l){let b=c.indexOf(t),k=c.indexOf(e);b!==-1&&k!==-1&&(c[b]=e,c[k]=t),p=t,T=true;}}else a.id===l&&(c=c.map(b=>b===t?e:b),p===t&&(p=e),delete d[t],r&&(d[e]=r),T=true),a.id===u&&(c=c.map(b=>b===e?t:b),p===e&&(p=t),delete d[e],o&&(d[t]=o),T=true);return T?{...a,tabIds:c,activeTabId:p,tabsMetadata:Object.keys(d).length>0?d:void 0}:a}return a.type==="split"?{...a,first:f(a.first),second:f(a.second)}:a}return f(n)}function H(n,t,e,i="before"){if(n===null)return null;if(t===e)return n;if(i==="center")return L(n,t,e);let l=N(n,t)?.tabsMetadata?.[t],u=P(n,t);if(u===null)return {type:"pane",id:M(),tabIds:[t],activeTabId:t,tabsMetadata:l?{[t]:l}:void 0};function o(r){if(r.type==="pane"){if(r.tabIds.includes(e)){let a=[...r.tabIds].filter(p=>p!==t),T=a.indexOf(e);T<0&&(T=0),i==="after"&&(T+=1),a.splice(T,0,t);let c={...r.tabsMetadata};return l&&(c[t]=l),{...r,tabIds:a,activeTabId:t,tabsMetadata:Object.keys(c).length>0?c:void 0}}return r}return r.type==="split"?{...r,first:o(r.first),second:o(r.second)}:r}return o(u)}function m(n,t=0,e=0,i=100,s=100,l="root"){if(n===null)return {panes:[],splitters:[]};if(n.type==="pane")return {panes:[{paneId:n.id,left:t,top:e,width:i,height:s,node:n}],splitters:[]};let{direction:u,splitPercentage:o,first:r,second:f}=n,T={id:`splitter-${l}-${u}`,currentNode:n,direction:u,left:u==="row"?t+i*(o/100):t,top:u==="column"?e+s*(o/100):e,width:u==="row"?0:i,height:u==="column"?0:s,parentLeft:t,parentTop:e,parentWidth:i,parentHeight:s},c={panes:[],splitters:[]},p={panes:[],splitters:[]};if(u==="row"){let d=i*(o/100);c=m(r,t,e,d,s,`${l}-L`),p=m(f,t+d,e,i-d,s,`${l}-R`);}else {let d=s*(o/100);c=m(r,t,e,i,d,`${l}-T`),p=m(f,t,e+d,i,s-d,`${l}-B`);}return {panes:[...c.panes,...p.panes],splitters:[T,...c.splitters,...p.splitters]}}function F(n,t,e,i="before"){if(n===null)return null;let s=y(n,t);if(!s)return n;let l=s.tabIds,u=s.activeTabId,o=s.tabsMetadata||{},r=x(n,t);if(r===null)return s;function f(a){if(a.type==="pane"){if(a.tabIds.includes(e)){let c=[...a.tabIds].filter(b=>!l.includes(b)),p=c.indexOf(e);p<0&&(p=0),i==="after"&&(p+=1),c.splice(p,0,...l);let d={...a.tabsMetadata};for(let b of l)o[b]&&(d[b]=o[b]);return {...a,tabIds:c,activeTabId:u,tabsMetadata:Object.keys(d).length>0?d:void 0}}return a}return a.type==="split"?{...a,first:f(a.first),second:f(a.second)}:a}return f(r)}function W(n,t,e,i){if(!((t==="tab"||t==="pane")&&e&&n.includes(e))||!i)return -1;let u=n.indexOf(e);return i==="before"?u:u+1}exports.addTab=h;exports.calculateTabDropIndex=W;exports.computeLayout=m;exports.findPaneById=y;exports.findPaneContainingTab=N;exports.findTabById=j;exports.generateUniqueId=M;exports.getActiveTabMetadata=$;exports.getTabMetadata=R;exports.insertLeaf=D;exports.mergeTab=B;exports.movePaneTabs=F;exports.moveTab=H;exports.removePane=x;exports.removeTab=P;exports.selectTab=C;exports.splitPane=v;exports.swapTabs=L;exports.updateMetadata=S;exports.updatePaneLock=O;exports.updateSplitPercentage=w;//# sourceMappingURL=utils.cjs.map
|
|
1
|
+
'use strict';function M(){return "pane-"+Math.random().toString(36).substring(2,11)}function x(n,t){if(n===null)return null;if(n.type==="pane")return n.id===t?null:n;let e=x(n.first,t),i=x(n.second,t);return e===null?i:i===null?e:{...n,first:e,second:i}}function P(n,t){if(n===null)return null;if(n.type==="pane"){if(n.tabIds.includes(t)){let s=n.tabIds.filter(o=>o!==t);if(s.length===0)return null;let l=n.activeTabId;n.activeTabId===t&&(l=s[0]);let u={...n.tabsMetadata};return delete u[t],{...n,tabIds:s,activeTabId:l,tabsMetadata:Object.keys(u).length>0?u:void 0}}return n}let e=P(n.first,t),i=P(n.second,t);return e===null?i:i===null?e:{...n,first:e,second:i}}function v(n,t,e,i,s){if(n===null)return typeof s=="string"?{type:"pane",id:M(),tabIds:[s],activeTabId:s}:s;if(n.type==="pane"){if(n.id===t){let l=typeof s=="string"?{type:"pane",id:M(),tabIds:[s],activeTabId:s}:s,u=i==="left"||i==="top";return {type:"split",direction:e,first:u?l:n,second:u?n:l,splitPercentage:50}}return n}return {...n,first:v(n.first,t,e,i,s)||n.first,second:v(n.second,t,e,i,s)||n.second}}function D(n,t){if(n===null)return t;function e(i,s){return i.type==="pane"?{type:"split",direction:s==="row"?"column":"row",splitPercentage:50,first:i,second:t}:{...i,second:e(i.second,i.direction)}}return e(n,null)}function h(n,t,e,i){if(n===null)return {type:"pane",id:M(),tabIds:[e],activeTabId:e,tabsMetadata:i?{[e]:i}:void 0};let s=t?y(n,t):null;if(s&&s.type==="pane"){let o=function(r){if(r.type==="pane"&&r.id===t){let f=[...r.tabIds];f.includes(e)||f.push(e);let a=r.tabsMetadata;return i&&(a={...r.tabsMetadata,[e]:i}),{...r,tabIds:f,activeTabId:e,tabsMetadata:a}}return r.type==="split"?{...r,first:o(r.first),second:o(r.second)}:r};return o(n)}let l={type:"pane",id:M(),tabIds:[e],activeTabId:e,tabsMetadata:i?{[e]:i}:void 0};return D(n,l)}function w(n,t,e){return n===null?null:n===t?{...n,splitPercentage:e}:n.type==="split"?{...n,first:w(n.first,t,e)||n.first,second:w(n.second,t,e)||n.second}:n}function y(n,t){return n===null?null:n.type==="pane"?n.id===t?n:null:n.type==="split"?y(n.first,t)??y(n.second,t):null}function N(n,t){return n===null?null:n.type==="pane"?n.tabIds.includes(t)?n:null:n.type==="split"?N(n.first,t)??N(n.second,t):null}function j(n,t){let e=N(n,t);if(!e)return null;let i=e.tabIds.indexOf(t);return {id:t,paneId:e.id,isActive:e.activeTabId===t,index:i,metadata:e.tabsMetadata?.[t],remountOnPopout:e.tabsMetadata?.[t]?.remountOnPopout}}function R(n,t){return N(n,t)?.tabsMetadata?.[t]}function $(n,t){let e=y(n,t);return e?.tabsMetadata?.[e.activeTabId]}function S(n,t,e){if(n===null)return null;if(n.type==="pane"){if(n.tabIds.includes(t)){let i=n.tabsMetadata||{},s=i[t],l=e(s),u={...i};return l===void 0?delete u[t]:u[t]=l,{...n,tabsMetadata:Object.keys(u).length>0?u:void 0}}return n}return n.type==="split"?{...n,first:S(n.first,t,e)??n.first,second:S(n.second,t,e)??n.second}:n}function O(n,t,e){if(n===null)return null;if(n.type==="pane"){if(n.id===t){if(e===false){let{locked:i,...s}=n;return s}return {...n,locked:e}}return n}return n.type==="split"?{...n,first:O(n.first,t,e)??n.first,second:O(n.second,t,e)??n.second}:n}function C(n,t,e){return n===null?null:n.type==="pane"?n.id===t?n.activeTabId===e?n:{...n,activeTabId:e}:n:n.type==="split"?{...n,first:C(n.first,t,e)??n.first,second:C(n.second,t,e)??n.second}:n}function B(n,t,e){if(n===null)return null;let s=N(n,t)?.tabsMetadata?.[t],l=P(n,t);if(l===null)return {type:"pane",id:M(),tabIds:[t],activeTabId:t,tabsMetadata:s?{[t]:s}:void 0};function u(o){if(o.type==="pane"){if(o.id===e){let r=[...o.tabIds];r.includes(t)||r.push(t);let f={...o.tabsMetadata};return s&&(f[t]=s),{...o,tabIds:r,activeTabId:t,tabsMetadata:Object.keys(f).length>0?f:void 0}}return o}return o.type==="split"?{...o,first:u(o.first),second:u(o.second)}:o}return u(l)}function L(n,t,e){if(n===null)return null;if(t===e)return n;let i=N(n,t),s=N(n,e);if(!i||!s)return n;let l=i.id,u=s.id,o=i.tabsMetadata?.[t],r=s.tabsMetadata?.[e];function f(a){if(a.type==="pane"){let T=false,c=[...a.tabIds],p=a.activeTabId,d=a.tabsMetadata?{...a.tabsMetadata}:{};if(l===u){if(a.id===l){let b=c.indexOf(t),k=c.indexOf(e);b!==-1&&k!==-1&&(c[b]=e,c[k]=t),p=t,T=true;}}else a.id===l&&(c=c.map(b=>b===t?e:b),p===t&&(p=e),delete d[t],r&&(d[e]=r),T=true),a.id===u&&(c=c.map(b=>b===e?t:b),p===e&&(p=t),delete d[e],o&&(d[t]=o),T=true);return T?{...a,tabIds:c,activeTabId:p,tabsMetadata:Object.keys(d).length>0?d:void 0}:a}return a.type==="split"?{...a,first:f(a.first),second:f(a.second)}:a}return f(n)}function H(n,t,e,i="before"){if(n===null)return null;if(t===e)return n;if(i==="center")return L(n,t,e);let l=N(n,t)?.tabsMetadata?.[t],u=P(n,t);if(u===null)return {type:"pane",id:M(),tabIds:[t],activeTabId:t,tabsMetadata:l?{[t]:l}:void 0};function o(r){if(r.type==="pane"){if(r.tabIds.includes(e)){let a=[...r.tabIds].filter(p=>p!==t),T=a.indexOf(e);T<0&&(T=0),i==="after"&&(T+=1),a.splice(T,0,t);let c={...r.tabsMetadata};return l&&(c[t]=l),{...r,tabIds:a,activeTabId:t,tabsMetadata:Object.keys(c).length>0?c:void 0}}return r}return r.type==="split"?{...r,first:o(r.first),second:o(r.second)}:r}return o(u)}function m(n,t=0,e=0,i=100,s=100,l="root"){if(n===null)return {panes:[],splitters:[]};if(n.type==="pane")return {panes:[{paneId:n.id,left:t,top:e,width:i,height:s,node:n}],splitters:[]};let{direction:u,splitPercentage:o,first:r,second:f}=n,T={id:`splitter-${l}-${u}`,currentNode:n,direction:u,left:u==="row"?t+i*(o/100):t,top:u==="column"?e+s*(o/100):e,width:u==="row"?0:i,height:u==="column"?0:s,parentLeft:t,parentTop:e,parentWidth:i,parentHeight:s},c={panes:[],splitters:[]},p={panes:[],splitters:[]};if(u==="row"){let d=i*(o/100);c=m(r,t,e,d,s,`${l}-L`),p=m(f,t+d,e,i-d,s,`${l}-R`);}else {let d=s*(o/100);c=m(r,t,e,i,d,`${l}-T`),p=m(f,t,e+d,i,s-d,`${l}-B`);}return {panes:[...c.panes,...p.panes],splitters:[T,...c.splitters,...p.splitters]}}function F(n,t,e,i="before"){if(n===null)return null;let s=y(n,t);if(!s)return n;let l=s.tabIds,u=s.activeTabId,o=s.tabsMetadata||{},r=x(n,t);if(r===null)return s;function f(a){if(a.type==="pane"){if(a.tabIds.includes(e)){let c=[...a.tabIds].filter(b=>!l.includes(b)),p=c.indexOf(e);p<0&&(p=0),i==="after"&&(p+=1),c.splice(p,0,...l);let d={...a.tabsMetadata};for(let b of l)o[b]&&(d[b]=o[b]);return {...a,tabIds:c,activeTabId:u,tabsMetadata:Object.keys(d).length>0?d:void 0}}return a}return a.type==="split"?{...a,first:f(a.first),second:f(a.second)}:a}return f(r)}function W(n,t,e,i){if(!((t==="tab"||t==="pane")&&e&&n.includes(e))||!i)return -1;let u=n.indexOf(e);return i==="before"?u:u+1}exports.addTab=h;exports.calculateTabDropIndex=W;exports.computeLayout=m;exports.findPaneById=y;exports.findPaneContainingTab=N;exports.findTabById=j;exports.generateUniqueId=M;exports.getActiveTabMetadata=$;exports.getTabMetadata=R;exports.insertLeaf=D;exports.mergeTab=B;exports.movePaneTabs=F;exports.moveTab=H;exports.removePane=x;exports.removeTab=P;exports.selectTab=C;exports.splitPane=v;exports.swapTabs=L;exports.updateMetadata=S;exports.updatePaneLock=O;exports.updateSplitPercentage=w;//# sourceMappingURL=utils.cjs.map
|
|
2
2
|
//# sourceMappingURL=utils.cjs.map
|
package/dist/utils.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/lib/tree/tree-helpers.ts"],"names":["generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","tabId","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","insertLeaf","leafNode","insert","node","parentDirection","addTab","targetPaneId","metadata","targetPane","findPaneById","appendTabToTarget","newPane","updateSplitPercentage","target","newPercentage","findPaneContainingTab","findTabById","pane","index","getTabMetadata","getActiveTabMetadata","updateMetadata","id","updater","currentTabsMetadata","currentTabMeta","newTabMeta","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","swapTabs","targetTabId","sourcePane","sourcePaneId","targetMetadata","swap","changed","newTabIds","newActiveTabId","dragIdx","targetIdx","moveTab","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","movePaneTabs","draggedPaneId","draggedTabIds","draggedActiveTabId","draggedTabsMetadata","tid","calculateTabDropIndex","tabIds","activeType","overTabId","overTabPosition"],"mappings":"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","file":"utils.cjs","sourcesContent":["import { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabIds.includes(tabId)) {\n const newTabs = tree.tabIds.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabIds: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane or widget by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabIds: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabIds: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Helper to insert a leaf node (PaneNode or WidgetNode) into the layout tree.\n */\nexport function insertLeaf(tree: TreeNode | null, leafNode: PaneNode): TreeNode {\n if (tree === null) {\n return leafNode\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: leafNode,\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Add a tab into a target pane node, or splits/creates a new pane if no target pane ID is provided.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string | undefined | null,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n }\n\n const targetPane = targetPaneId ? findPaneById(tree, targetPaneId) : null\n if (targetPane && targetPane.type === 'pane') {\n function appendTabToTarget(node: TreeNode): TreeNode {\n if (node.type === 'pane' && node.id === targetPaneId) {\n const newTabs = [...node.tabIds]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = node.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...node.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...node,\n tabIds: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: appendTabToTarget(node.first),\n second: appendTabToTarget(node.second),\n }\n }\n return node\n }\n return appendTabToTarget(tree)\n }\n\n const newPane: PaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n return insertLeaf(tree, newPane)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage }\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode or WidgetNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n }\n return null\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabIds.includes(tabId) ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n }\n return null\n}\n\n/**\n * Find a PaneNode by its own ID, or by a tab ID it contains.\n */\nexport function findPaneOrContainingTab(tree: TreeNode | null, id: string): PaneNode | null {\n return findPaneById(tree, id) ?? findPaneContainingTab(tree, id)\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabIds.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n }\n}\n\n/**\n * Get the metadata for a specific tab by its ID.\n */\nexport function getTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneContainingTab(tree, tabId)\n return pane?.tabsMetadata?.[tabId]\n}\n\n/**\n * Get the metadata of the active item (either tab or pane).\n */\n/**\n * Get the metadata of the active tab in a specific pane.\n */\nexport function getActiveTabMetadata(\n tree: TreeNode | null,\n paneId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneById(tree, paneId)\n return pane?.tabsMetadata?.[pane.activeTabId]\n}\n\n/**\n * Update metadata on a specific tab or widget node using an updater function.\n */\nexport function updateMetadata(\n tree: TreeNode | null,\n id: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabIds.includes(id)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[id]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[id]\n } else {\n newTabsMetadata[id] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateMetadata(tree.first, id, updater) ?? tree.first,\n second: updateMetadata(tree.second, id, updater) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Update the locked status on a specific pane or widget node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (tree.activeTabId === tabId) return tree\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabIds]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabIds: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport function swapTabs(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n): TreeNode | null {\n if (tree === null) return null\n if (draggedTabId === targetTabId) return tree\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const targetPane = findPaneContainingTab(tree, targetTabId)\n\n if (!sourcePane || !targetPane) return tree\n\n const sourcePaneId = sourcePane.id\n const targetPaneId = targetPane.id\n const sourceMetadata = sourcePane.tabsMetadata?.[draggedTabId]\n const targetMetadata = targetPane.tabsMetadata?.[targetTabId]\n\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n let changed = false\n let newTabIds = [...node.tabIds]\n let newActiveTabId = node.activeTabId\n const newTabsMetadata = node.tabsMetadata ? { ...node.tabsMetadata } : {}\n\n if (sourcePaneId === targetPaneId) {\n if (node.id === sourcePaneId) {\n const dragIdx = newTabIds.indexOf(draggedTabId)\n const targetIdx = newTabIds.indexOf(targetTabId)\n if (dragIdx !== -1 && targetIdx !== -1) {\n newTabIds[dragIdx] = targetTabId\n newTabIds[targetIdx] = draggedTabId\n }\n newActiveTabId = draggedTabId\n changed = true\n }\n } else {\n if (node.id === sourcePaneId) {\n newTabIds = newTabIds.map((id) => (id === draggedTabId ? targetTabId : id))\n if (newActiveTabId === draggedTabId) {\n newActiveTabId = targetTabId\n }\n delete newTabsMetadata[draggedTabId]\n if (targetMetadata) {\n newTabsMetadata[targetTabId] = targetMetadata\n }\n changed = true\n }\n if (node.id === targetPaneId) {\n newTabIds = newTabIds.map((id) => (id === targetTabId ? draggedTabId : id))\n if (newActiveTabId === targetTabId) {\n newActiveTabId = draggedTabId\n }\n delete newTabsMetadata[targetTabId]\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n changed = true\n }\n }\n\n if (changed) {\n return {\n ...node,\n tabIds: newTabIds,\n activeTabId: newActiveTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n return node\n }\n\n return swap(tree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' | 'center' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n if (draggedTabId === targetTabId) return tree\n\n if (position === 'center') {\n return swapTabs(tree, draggedTabId, targetTabId)\n }\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabIds.includes(targetTabId)) {\n const newTabs = [...node.tabIds]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabIds: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Tree Helper: Move/insert all tabs of a dragged pane next to a target tab in another pane.\n */\nexport function movePaneTabs(\n tree: TreeNode | null,\n draggedPaneId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n // 1. Find the dragged pane to get its tabs, activeTabId, and tabsMetadata\n const sourcePane = findPaneById(tree, draggedPaneId)\n if (!sourcePane) return tree\n\n const draggedTabIds = sourcePane.tabIds\n const draggedActiveTabId = sourcePane.activeTabId\n const draggedTabsMetadata = sourcePane.tabsMetadata || {}\n\n // 2. Remove the dragged pane from the layout tree\n const cleanTree = removePane(tree, draggedPaneId)\n if (cleanTree === null) {\n return sourcePane\n }\n\n // 3. Insert the dragged pane's tabs into the target pane next to targetTabId\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabIds.includes(targetTabId)) {\n const newTabs = [...node.tabIds]\n // Filter out any of the dragged tabs if they somehow already existed\n const filteredTabs = newTabs.filter((t) => !draggedTabIds.includes(t))\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, ...draggedTabIds)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n for (const tid of draggedTabIds) {\n if (draggedTabsMetadata[tid]) {\n newTabsMetadata[tid] = draggedTabsMetadata[tid]\n }\n }\n return {\n ...node,\n tabIds: filteredTabs,\n activeTabId: draggedActiveTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Calculates the target drop insertion index in a list of tabs during a drag.\n * Returns -1 if the drop target is not in the list.\n */\nexport function calculateTabDropIndex(\n tabIds: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTabOrPane = activeType === 'tab' || activeType === 'pane'\n const isHoveredTabInThisPane = isDraggingTabOrPane && overTabId && tabIds.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabIds.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/lib/tree/tree-helpers.ts"],"names":["generateUniqueId","removePane","tree","paneId","newFirst","newSecond","removeTab","tabId","newTabs","t","newActive","newTabsMetadata","splitPane","targetId","direction","splitType","paneToAdd","addedNode","isFirst","insertLeaf","leafNode","insert","node","parentDirection","addTab","targetPaneId","metadata","targetPane","findPaneById","appendTabToTarget","newPane","updateSplitPercentage","target","newPercentage","findPaneContainingTab","findTabById","pane","index","getTabMetadata","getActiveTabMetadata","updateMetadata","id","updater","currentTabsMetadata","currentTabMeta","newTabMeta","updatePaneLock","locked","_","rest","selectTab","mergeTab","draggedTabId","sourceMetadata","cleanTree","swapTabs","targetTabId","sourcePane","sourcePaneId","targetMetadata","swap","changed","newTabIds","newActiveTabId","dragIdx","targetIdx","moveTab","position","filteredTabs","insertIndex","computeLayout","left","top","width","height","path","splitPercentage","first","second","currentSplitter","firstLayout","secondLayout","firstWidth","firstHeight","movePaneTabs","draggedPaneId","draggedTabIds","draggedActiveTabId","draggedTabsMetadata","tid","calculateTabDropIndex","tabIds","activeType","overTabId","overTabPosition"],"mappings":"aAEO,SAASA,CAAAA,EAA2B,CACzC,OAAO,OAAA,CAAU,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,CAAG,EAAE,CAC7D,CAKO,SAASC,CAAAA,CAAWC,CAAAA,CAAuBC,CAAAA,CAAiC,CACjF,GAAID,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,OAAS,MAAA,CAChB,OAAIA,CAAAA,CAAK,EAAA,GAAOC,CAAAA,CAAe,IAAA,CACxBD,EAET,IAAME,CAAAA,CAAWH,CAAAA,CAAWC,CAAAA,CAAK,KAAA,CAAOC,CAAM,EACxCE,CAAAA,CAAYJ,CAAAA,CAAWC,CAAAA,CAAK,MAAA,CAAQC,CAAM,CAAA,CAChD,OAAIC,CAAAA,GAAa,IAAA,CAAaC,CAAAA,CAC1BA,CAAAA,GAAc,IAAA,CAAaD,CAAAA,CACxB,CAAE,GAAGF,CAAAA,CAAM,KAAA,CAAOE,CAAAA,CAAU,MAAA,CAAQC,CAAU,CACvD,CAKO,SAASC,CAAAA,CAAUJ,CAAAA,CAAuBK,CAAAA,CAAgC,CAC/E,GAAIL,IAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,MAAA,CAAO,QAAA,CAASK,CAAK,CAAA,CAAG,CAC/B,IAAMC,CAAAA,CAAUN,CAAAA,CAAK,MAAA,CAAO,MAAA,CAAQO,CAAAA,EAAMA,IAAMF,CAAK,CAAA,CACrD,GAAIC,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAAG,OAAO,IAAA,CACjC,IAAIE,CAAAA,CAAYR,CAAAA,CAAK,WAAA,CACjBA,CAAAA,CAAK,WAAA,GAAgBK,CAAAA,GACvBG,CAAAA,CAAYF,CAAAA,CAAQ,CAAC,CAAA,CAAA,CAEvB,IAAMG,CAAAA,CAAkB,CAAE,GAAGT,CAAAA,CAAK,YAAa,CAAA,CAC/C,OAAA,OAAOS,CAAAA,CAAgBJ,CAAK,CAAA,CACrB,CACL,GAAGL,CAAAA,CACH,MAAA,CAAQM,CAAAA,CACR,YAAaE,CAAAA,CACb,YAAA,CAAc,MAAA,CAAO,IAAA,CAAKC,CAAe,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,MAC5E,CACF,CACA,OAAOT,CACT,CACA,IAAME,CAAAA,CAAWE,CAAAA,CAAUJ,CAAAA,CAAK,KAAA,CAAOK,CAAK,EACtCF,CAAAA,CAAYC,CAAAA,CAAUJ,CAAAA,CAAK,MAAA,CAAQK,CAAK,CAAA,CAC9C,OAAIH,CAAAA,GAAa,IAAA,CAAaC,CAAAA,CAC1BA,CAAAA,GAAc,IAAA,CAAaD,CAAAA,CACxB,CAAE,GAAGF,CAAAA,CAAM,KAAA,CAAOE,CAAAA,CAAU,MAAA,CAAQC,CAAU,CACvD,CAKO,SAASO,CAAAA,CACdV,CAAAA,CACAW,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,EACiB,CACjB,GAAId,CAAAA,GAAS,IAAA,CACX,OAAI,OAAOc,GAAc,QAAA,CAChB,CAAE,IAAA,CAAM,MAAA,CAAQ,EAAA,CAAIhB,CAAAA,EAAiB,CAAG,MAAA,CAAQ,CAACgB,CAAS,CAAA,CAAG,WAAA,CAAaA,CAAU,CAAA,CAEtFA,EAET,GAAId,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,EAAA,GAAOW,CAAAA,CAAU,CACxB,IAAMI,CAAAA,CACJ,OAAOD,CAAAA,EAAc,SACjB,CAAE,IAAA,CAAM,MAAA,CAAQ,EAAA,CAAIhB,CAAAA,EAAiB,CAAG,MAAA,CAAQ,CAACgB,CAAS,CAAA,CAAG,WAAA,CAAaA,CAAU,CAAA,CACpFA,CAAAA,CACAE,EAAUH,CAAAA,GAAc,MAAA,EAAUA,CAAAA,GAAc,KAAA,CACtD,OAAO,CACL,KAAM,OAAA,CACN,SAAA,CAAAD,CAAAA,CACA,KAAA,CAAOI,CAAAA,CAAUD,CAAAA,CAAYf,EAC7B,MAAA,CAAQgB,CAAAA,CAAUhB,CAAAA,CAAOe,CAAAA,CACzB,eAAA,CAAiB,EACnB,CACF,CACA,OAAOf,CACT,CACA,OAAO,CACL,GAAGA,EACH,KAAA,CAAOU,CAAAA,CAAUV,CAAAA,CAAK,KAAA,CAAOW,CAAAA,CAAUC,CAAAA,CAAWC,EAAWC,CAAS,CAAA,EAAKd,CAAAA,CAAK,KAAA,CAChF,MAAA,CAAQU,CAAAA,CAAUV,EAAK,MAAA,CAAQW,CAAAA,CAAUC,CAAAA,CAAWC,CAAAA,CAAWC,CAAS,CAAA,EAAKd,CAAAA,CAAK,MACpF,CACF,CAKO,SAASiB,CAAAA,CAAWjB,CAAAA,CAAuBkB,CAAAA,CAA8B,CAC9E,GAAIlB,CAAAA,GAAS,IAAA,CACX,OAAOkB,CAAAA,CAGT,SAASC,EAAOC,CAAAA,CAAgBC,CAAAA,CAAkD,CAChF,OAAID,CAAAA,CAAK,IAAA,GAAS,OAET,CACL,IAAA,CAAM,OAAA,CACN,SAAA,CAHgCC,CAAAA,GAAoB,KAAA,CAAQ,QAAA,CAAW,KAAA,CAIvE,eAAA,CAAiB,EAAA,CACjB,KAAA,CAAOD,CAAAA,CACP,MAAA,CAAQF,CACV,EAGK,CACL,GAAGE,CAAAA,CACH,MAAA,CAAQD,CAAAA,CAAOC,CAAAA,CAAK,OAAQA,CAAAA,CAAK,SAAS,CAC5C,CACF,CAEA,OAAOD,EAAOnB,CAAAA,CAAM,IAAI,CAC1B,CAKO,SAASsB,CAAAA,CACdtB,CAAAA,CACAuB,CAAAA,CACAlB,CAAAA,CACAmB,CAAAA,CACiB,CACjB,GAAIxB,CAAAA,GAAS,IAAA,CACX,OAAO,CACL,IAAA,CAAM,MAAA,CACN,EAAA,CAAIF,CAAAA,EAAiB,CACrB,OAAQ,CAACO,CAAK,CAAA,CACd,WAAA,CAAaA,CAAAA,CACb,YAAA,CAAcmB,EAAW,CAAE,CAACnB,CAAK,EAAGmB,CAAS,CAAA,CAAI,MACnD,CAAA,CAGF,IAAMC,CAAAA,CAAaF,CAAAA,CAAeG,CAAAA,CAAa1B,CAAAA,CAAMuB,CAAY,EAAI,IAAA,CACrE,GAAIE,CAAAA,EAAcA,CAAAA,CAAW,IAAA,GAAS,MAAA,CAAQ,CAC5C,IAASE,CAAAA,CAAT,SAA2BP,CAAAA,CAA0B,CACnD,GAAIA,EAAK,IAAA,GAAS,MAAA,EAAUA,CAAAA,CAAK,EAAA,GAAOG,CAAAA,CAAc,CACpD,IAAMjB,CAAAA,CAAU,CAAC,GAAGc,CAAAA,CAAK,MAAM,CAAA,CAC1Bd,CAAAA,CAAQ,SAASD,CAAK,CAAA,EACzBC,CAAAA,CAAQ,IAAA,CAAKD,CAAK,CAAA,CAEpB,IAAII,CAAAA,CAAkBW,CAAAA,CAAK,YAAA,CAC3B,OAAII,CAAAA,GACFf,CAAAA,CAAkB,CAChB,GAAGW,CAAAA,CAAK,YAAA,CACR,CAACf,CAAK,EAAGmB,CACX,CAAA,CAAA,CAEK,CACL,GAAGJ,CAAAA,CACH,MAAA,CAAQd,CAAAA,CACR,WAAA,CAAaD,EACb,YAAA,CAAcI,CAChB,CACF,CACA,OAAIW,CAAAA,CAAK,IAAA,GAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOO,CAAAA,CAAkBP,CAAAA,CAAK,KAAK,CAAA,CACnC,MAAA,CAAQO,CAAAA,CAAkBP,CAAAA,CAAK,MAAM,CACvC,CAAA,CAEKA,CACT,CAAA,CACA,OAAOO,CAAAA,CAAkB3B,CAAI,CAC/B,CAEA,IAAM4B,CAAAA,CAAoB,CACxB,IAAA,CAAM,MAAA,CACN,GAAI9B,CAAAA,EAAiB,CACrB,MAAA,CAAQ,CAACO,CAAK,CAAA,CACd,YAAaA,CAAAA,CACb,YAAA,CAAcmB,CAAAA,CAAW,CAAE,CAACnB,CAAK,EAAGmB,CAAS,CAAA,CAAI,MACnD,CAAA,CACA,OAAOP,CAAAA,CAAWjB,CAAAA,CAAM4B,CAAO,CACjC,CAKO,SAASC,CAAAA,CACd7B,CAAAA,CACA8B,CAAAA,CACAC,EACiB,CACjB,OAAI/B,CAAAA,GAAS,IAAA,CAAa,IAAA,CACtBA,CAAAA,GAAS8B,EACJ,CAAE,GAAG9B,CAAAA,CAAM,eAAA,CAAiB+B,CAAc,CAAA,CAE/C/B,CAAAA,CAAK,IAAA,GAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAO6B,CAAAA,CAAsB7B,EAAK,KAAA,CAAO8B,CAAAA,CAAQC,CAAa,CAAA,EAAK/B,CAAAA,CAAK,KAAA,CACxE,OAAQ6B,CAAAA,CAAsB7B,CAAAA,CAAK,MAAA,CAAQ8B,CAAAA,CAAQC,CAAa,CAAA,EAAK/B,EAAK,MAC5E,CAAA,CAEKA,CACT,CAKO,SAAS0B,CAAAA,CAAa1B,CAAAA,CAAuBC,CAAAA,CAAiC,CACnF,OAAID,CAAAA,GAAS,IAAA,CAAa,IAAA,CACtBA,CAAAA,CAAK,OAAS,MAAA,CACTA,CAAAA,CAAK,EAAA,GAAOC,CAAAA,CAASD,CAAAA,CAAO,IAAA,CAEjCA,EAAK,IAAA,GAAS,OAAA,CACT0B,CAAAA,CAAa1B,CAAAA,CAAK,KAAA,CAAOC,CAAM,GAAKyB,CAAAA,CAAa1B,CAAAA,CAAK,MAAA,CAAQC,CAAM,CAAA,CAEtE,IACT,CAKO,SAAS+B,CAAAA,CAAsBhC,CAAAA,CAAuBK,CAAAA,CAAgC,CAC3F,OAAIL,CAAAA,GAAS,KAAa,IAAA,CACtBA,CAAAA,CAAK,IAAA,GAAS,MAAA,CACTA,CAAAA,CAAK,MAAA,CAAO,SAASK,CAAK,CAAA,CAAIL,CAAAA,CAAO,IAAA,CAE1CA,CAAAA,CAAK,IAAA,GAAS,QACTgC,CAAAA,CAAsBhC,CAAAA,CAAK,KAAA,CAAOK,CAAK,CAAA,EAAK2B,CAAAA,CAAsBhC,CAAAA,CAAK,MAAA,CAAQK,CAAK,CAAA,CAEtF,IACT,CAYO,SAAS4B,CAAAA,CAAYjC,EAAuBK,CAAAA,CAAkC,CACnF,IAAM6B,CAAAA,CAAOF,CAAAA,CAAsBhC,CAAAA,CAAMK,CAAK,CAAA,CAC9C,GAAI,CAAC6B,CAAAA,CAAM,OAAO,IAAA,CAClB,IAAMC,CAAAA,CAAQD,CAAAA,CAAK,MAAA,CAAO,OAAA,CAAQ7B,CAAK,CAAA,CACvC,OAAO,CACL,EAAA,CAAIA,CAAAA,CACJ,MAAA,CAAQ6B,CAAAA,CAAK,EAAA,CACb,QAAA,CAAUA,EAAK,WAAA,GAAgB7B,CAAAA,CAC/B,KAAA,CAAA8B,CAAAA,CACA,QAAA,CAAUD,CAAAA,CAAK,eAAe7B,CAAK,CAAA,CACnC,eAAA,CAAiB6B,CAAAA,CAAK,YAAA,GAAe7B,CAAK,GAAG,eAC/C,CACF,CAKO,SAAS+B,CAAAA,CACdpC,CAAAA,CACAK,CAAAA,CACqC,CAErC,OADa2B,CAAAA,CAAsBhC,CAAAA,CAAMK,CAAK,CAAA,EACjC,YAAA,GAAeA,CAAK,CACnC,CAQO,SAASgC,CAAAA,CACdrC,CAAAA,CACAC,CAAAA,CACqC,CACrC,IAAMiC,CAAAA,CAAOR,CAAAA,CAAa1B,CAAAA,CAAMC,CAAM,CAAA,CACtC,OAAOiC,GAAM,YAAA,GAAeA,CAAAA,CAAK,WAAW,CAC9C,CAKO,SAASI,CAAAA,CACdtC,CAAAA,CACAuC,CAAAA,CACAC,CAAAA,CACiB,CACjB,GAAIxC,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,MAAA,CAAO,QAAA,CAASuC,CAAE,CAAA,CAAG,CAC5B,IAAME,CAAAA,CAAsBzC,CAAAA,CAAK,YAAA,EAAgB,EAAC,CAC5C0C,CAAAA,CAAiBD,CAAAA,CAAoBF,CAAE,CAAA,CACvCI,CAAAA,CAAaH,CAAAA,CAAQE,CAAc,CAAA,CAEnCjC,CAAAA,CAAkB,CAAE,GAAGgC,CAAoB,CAAA,CACjD,OAAIE,CAAAA,GAAe,MAAA,CACjB,OAAOlC,CAAAA,CAAgB8B,CAAE,CAAA,CAEzB9B,CAAAA,CAAgB8B,CAAE,CAAA,CAAII,EAGjB,CACL,GAAG3C,CAAAA,CACH,YAAA,CAAc,MAAA,CAAO,IAAA,CAAKS,CAAe,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,MAC5E,CACF,CACA,OAAOT,CACT,CACA,OAAIA,CAAAA,CAAK,IAAA,GAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOsC,CAAAA,CAAetC,CAAAA,CAAK,KAAA,CAAOuC,EAAIC,CAAO,CAAA,EAAKxC,CAAAA,CAAK,KAAA,CACvD,MAAA,CAAQsC,CAAAA,CAAetC,CAAAA,CAAK,MAAA,CAAQuC,CAAAA,CAAIC,CAAO,CAAA,EAAKxC,CAAAA,CAAK,MAC3D,CAAA,CAEKA,CACT,CAKO,SAAS4C,CAAAA,CACd5C,CAAAA,CACAC,CAAAA,CACA4C,CAAAA,CACiB,CACjB,GAAI7C,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIA,EAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,EAAA,GAAOC,CAAAA,CAAQ,CACtB,GAAI4C,CAAAA,GAAW,KAAA,CAAO,CACpB,GAAM,CAAE,OAAQC,CAAAA,CAAG,GAAGC,CAAK,CAAA,CAAI/C,CAAAA,CAC/B,OAAO+C,CACT,CACA,OAAO,CAAE,GAAG/C,CAAAA,CAAM,MAAA,CAAA6C,CAAO,CAC3B,CACA,OAAO7C,CACT,CACA,OAAIA,CAAAA,CAAK,IAAA,GAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAO4C,CAAAA,CAAe5C,EAAK,KAAA,CAAOC,CAAAA,CAAQ4C,CAAM,CAAA,EAAK7C,CAAAA,CAAK,KAAA,CAC1D,OAAQ4C,CAAAA,CAAe5C,CAAAA,CAAK,MAAA,CAAQC,CAAAA,CAAQ4C,CAAM,CAAA,EAAK7C,EAAK,MAC9D,CAAA,CAEKA,CACT,CAKO,SAASgD,CAAAA,CAAUhD,CAAAA,CAAuBC,CAAAA,CAAgBI,CAAAA,CAAgC,CAC/F,OAAIL,CAAAA,GAAS,IAAA,CAAa,IAAA,CACtBA,EAAK,IAAA,GAAS,MAAA,CACZA,CAAAA,CAAK,EAAA,GAAOC,CAAAA,CACVD,CAAAA,CAAK,cAAgBK,CAAAA,CAAcL,CAAAA,CAChC,CAAE,GAAGA,CAAAA,CAAM,WAAA,CAAaK,CAAM,CAAA,CAEhCL,CAAAA,CAELA,CAAAA,CAAK,IAAA,GAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOgD,CAAAA,CAAUhD,CAAAA,CAAK,KAAA,CAAOC,CAAAA,CAAQI,CAAK,GAAKL,CAAAA,CAAK,KAAA,CACpD,MAAA,CAAQgD,CAAAA,CAAUhD,CAAAA,CAAK,MAAA,CAAQC,CAAAA,CAAQI,CAAK,CAAA,EAAKL,CAAAA,CAAK,MACxD,CAAA,CAEKA,CACT,CAKO,SAASiD,CAAAA,CACdjD,CAAAA,CACAkD,CAAAA,CACA3B,CAAAA,CACiB,CACjB,GAAIvB,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAG1B,IAAMmD,CAAAA,CADanB,CAAAA,CAAsBhC,CAAAA,CAAMkD,CAAY,CAAA,EACxB,YAAA,GAAeA,CAAY,CAAA,CAExDE,CAAAA,CAAYhD,CAAAA,CAAUJ,EAAMkD,CAAY,CAAA,CAC9C,GAAIE,CAAAA,GAAc,IAAA,CAChB,OAAO,CACL,IAAA,CAAM,MAAA,CACN,EAAA,CAAItD,CAAAA,EAAiB,CACrB,MAAA,CAAQ,CAACoD,CAAY,CAAA,CACrB,WAAA,CAAaA,CAAAA,CACb,YAAA,CAAcC,CAAAA,CAAiB,CAAE,CAACD,CAAY,EAAGC,CAAe,CAAA,CAAI,MACtE,CAAA,CAGF,SAAShC,CAAAA,CAAOC,CAAAA,CAA0B,CACxC,GAAIA,CAAAA,CAAK,IAAA,GAAS,OAAQ,CACxB,GAAIA,CAAAA,CAAK,EAAA,GAAOG,CAAAA,CAAc,CAC5B,IAAMjB,CAAAA,CAAU,CAAC,GAAGc,CAAAA,CAAK,MAAM,CAAA,CAC1Bd,CAAAA,CAAQ,SAAS4C,CAAY,CAAA,EAChC5C,CAAAA,CAAQ,IAAA,CAAK4C,CAAY,CAAA,CAE3B,IAAMzC,CAAAA,CAAkB,CAAE,GAAGW,CAAAA,CAAK,YAAa,CAAA,CAC/C,OAAI+B,CAAAA,GACF1C,CAAAA,CAAgByC,CAAY,CAAA,CAAIC,CAAAA,CAAAA,CAE3B,CACL,GAAG/B,CAAAA,CACH,MAAA,CAAQd,CAAAA,CACR,WAAA,CAAa4C,CAAAA,CACb,YAAA,CAAc,MAAA,CAAO,KAAKzC,CAAe,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,MAC5E,CACF,CACA,OAAOW,CACT,CACA,OAAIA,CAAAA,CAAK,OAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOD,CAAAA,CAAOC,CAAAA,CAAK,KAAK,CAAA,CACxB,MAAA,CAAQD,CAAAA,CAAOC,CAAAA,CAAK,MAAM,CAC5B,EAEKA,CACT,CAEA,OAAOD,CAAAA,CAAOiC,CAAS,CACzB,CAEO,SAASC,CAAAA,CACdrD,CAAAA,CACAkD,CAAAA,CACAI,CAAAA,CACiB,CACjB,GAAItD,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIkD,CAAAA,GAAiBI,CAAAA,CAAa,OAAOtD,CAAAA,CAEzC,IAAMuD,CAAAA,CAAavB,CAAAA,CAAsBhC,CAAAA,CAAMkD,CAAY,EACrDzB,CAAAA,CAAaO,CAAAA,CAAsBhC,CAAAA,CAAMsD,CAAW,CAAA,CAE1D,GAAI,CAACC,CAAAA,EAAc,CAAC9B,CAAAA,CAAY,OAAOzB,CAAAA,CAEvC,IAAMwD,EAAeD,CAAAA,CAAW,EAAA,CAC1BhC,CAAAA,CAAeE,CAAAA,CAAW,EAAA,CAC1B0B,CAAAA,CAAiBI,CAAAA,CAAW,YAAA,GAAeL,CAAY,CAAA,CACvDO,CAAAA,CAAiBhC,CAAAA,CAAW,YAAA,GAAe6B,CAAW,EAE5D,SAASI,CAAAA,CAAKtC,CAAAA,CAA0B,CACtC,GAAIA,CAAAA,CAAK,OAAS,MAAA,CAAQ,CACxB,IAAIuC,CAAAA,CAAU,KAAA,CACVC,CAAAA,CAAY,CAAC,GAAGxC,CAAAA,CAAK,MAAM,CAAA,CAC3ByC,CAAAA,CAAiBzC,CAAAA,CAAK,WAAA,CACpBX,CAAAA,CAAkBW,CAAAA,CAAK,YAAA,CAAe,CAAE,GAAGA,CAAAA,CAAK,YAAa,EAAI,EAAC,CAExE,GAAIoC,CAAAA,GAAiBjC,CAAAA,CAAAA,CACnB,GAAIH,CAAAA,CAAK,EAAA,GAAOoC,CAAAA,CAAc,CAC5B,IAAMM,CAAAA,CAAUF,CAAAA,CAAU,OAAA,CAAQV,CAAY,CAAA,CACxCa,CAAAA,CAAYH,CAAAA,CAAU,OAAA,CAAQN,CAAW,CAAA,CAC3CQ,CAAAA,GAAY,EAAA,EAAMC,CAAAA,GAAc,EAAA,GAClCH,CAAAA,CAAUE,CAAO,CAAA,CAAIR,CAAAA,CACrBM,EAAUG,CAAS,CAAA,CAAIb,CAAAA,CAAAA,CAEzBW,CAAAA,CAAiBX,CAAAA,CACjBS,CAAAA,CAAU,KACZ,CAAA,CAAA,KAEIvC,CAAAA,CAAK,EAAA,GAAOoC,CAAAA,GACdI,CAAAA,CAAYA,CAAAA,CAAU,IAAKrB,CAAAA,EAAQA,CAAAA,GAAOW,CAAAA,CAAeI,CAAAA,CAAcf,CAAG,CAAA,CACtEsB,CAAAA,GAAmBX,CAAAA,GACrBW,CAAAA,CAAiBP,CAAAA,CAAAA,CAEnB,OAAO7C,CAAAA,CAAgByC,CAAY,CAAA,CAC/BO,IACFhD,CAAAA,CAAgB6C,CAAW,CAAA,CAAIG,CAAAA,CAAAA,CAEjCE,CAAAA,CAAU,IAAA,CAAA,CAERvC,EAAK,EAAA,GAAOG,CAAAA,GACdqC,CAAAA,CAAYA,CAAAA,CAAU,GAAA,CAAKrB,CAAAA,EAAQA,IAAOe,CAAAA,CAAcJ,CAAAA,CAAeX,CAAG,CAAA,CACtEsB,CAAAA,GAAmBP,CAAAA,GACrBO,CAAAA,CAAiBX,CAAAA,CAAAA,CAEnB,OAAOzC,CAAAA,CAAgB6C,CAAW,CAAA,CAC9BH,CAAAA,GACF1C,CAAAA,CAAgByC,CAAY,CAAA,CAAIC,CAAAA,CAAAA,CAElCQ,CAAAA,CAAU,IAAA,CAAA,CAId,OAAIA,CAAAA,CACK,CACL,GAAGvC,CAAAA,CACH,MAAA,CAAQwC,CAAAA,CACR,WAAA,CAAaC,CAAAA,CACb,aAAc,MAAA,CAAO,IAAA,CAAKpD,CAAe,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,MAC5E,CAAA,CAEKW,CACT,CACA,OAAIA,CAAAA,CAAK,IAAA,GAAS,QACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOsC,CAAAA,CAAKtC,CAAAA,CAAK,KAAK,CAAA,CACtB,MAAA,CAAQsC,CAAAA,CAAKtC,CAAAA,CAAK,MAAM,CAC1B,EAEKA,CACT,CAEA,OAAOsC,CAAAA,CAAK1D,CAAI,CAClB,CAKO,SAASgE,CAAAA,CACdhE,CAAAA,CACAkD,CAAAA,CACAI,CAAAA,CACAW,CAAAA,CAA0C,QAAA,CACzB,CACjB,GAAIjE,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAC1B,GAAIkD,IAAiBI,CAAAA,CAAa,OAAOtD,CAAAA,CAEzC,GAAIiE,CAAAA,GAAa,QAAA,CACf,OAAOZ,CAAAA,CAASrD,CAAAA,CAAMkD,CAAAA,CAAcI,CAAW,CAAA,CAIjD,IAAMH,CAAAA,CADanB,CAAAA,CAAsBhC,CAAAA,CAAMkD,CAAY,CAAA,EACxB,YAAA,GAAeA,CAAY,CAAA,CAExDE,EAAYhD,CAAAA,CAAUJ,CAAAA,CAAMkD,CAAY,CAAA,CAC9C,GAAIE,CAAAA,GAAc,KAChB,OAAO,CACL,IAAA,CAAM,MAAA,CACN,EAAA,CAAItD,CAAAA,GACJ,MAAA,CAAQ,CAACoD,CAAY,CAAA,CACrB,WAAA,CAAaA,CAAAA,CACb,YAAA,CAAcC,CAAAA,CAAiB,CAAE,CAACD,CAAY,EAAGC,CAAe,CAAA,CAAI,MACtE,CAAA,CAGF,SAAShC,CAAAA,CAAOC,CAAAA,CAA0B,CACxC,GAAIA,EAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,MAAA,CAAO,SAASkC,CAAW,CAAA,CAAG,CAErC,IAAMY,CAAAA,CADU,CAAC,GAAG9C,CAAAA,CAAK,MAAM,CAAA,CACF,MAAA,CAAQb,CAAAA,EAAMA,CAAAA,GAAM2C,CAAY,EACzDiB,CAAAA,CAAcD,CAAAA,CAAa,OAAA,CAAQZ,CAAW,CAAA,CAC9Ca,CAAAA,CAAc,CAAA,GAChBA,CAAAA,CAAc,CAAA,CAAA,CAEZF,CAAAA,GAAa,OAAA,GACfE,CAAAA,EAAe,CAAA,CAAA,CAEjBD,CAAAA,CAAa,OAAOC,CAAAA,CAAa,CAAA,CAAGjB,CAAY,CAAA,CAEhD,IAAMzC,CAAAA,CAAkB,CAAE,GAAGW,CAAAA,CAAK,YAAa,CAAA,CAC/C,OAAI+B,CAAAA,GACF1C,CAAAA,CAAgByC,CAAY,CAAA,CAAIC,CAAAA,CAAAA,CAE3B,CACL,GAAG/B,CAAAA,CACH,MAAA,CAAQ8C,EACR,WAAA,CAAahB,CAAAA,CACb,YAAA,CAAc,MAAA,CAAO,IAAA,CAAKzC,CAAe,EAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,MAC5E,CACF,CACA,OAAOW,CACT,CACA,OAAIA,CAAAA,CAAK,IAAA,GAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOD,CAAAA,CAAOC,CAAAA,CAAK,KAAK,CAAA,CACxB,OAAQD,CAAAA,CAAOC,CAAAA,CAAK,MAAM,CAC5B,CAAA,CAEKA,CACT,CAEA,OAAOD,CAAAA,CAAOiC,CAAS,CACzB,CAyBO,SAASgB,CAAAA,CACdhD,CAAAA,CACAiD,CAAAA,CAAO,CAAA,CACPC,CAAAA,CAAM,CAAA,CACNC,CAAAA,CAAQ,GAAA,CACRC,EAAS,GAAA,CACTC,CAAAA,CAAO,MAAA,CACmD,CAC1D,GAAIrD,CAAAA,GAAS,KAAM,OAAO,CAAE,KAAA,CAAO,EAAC,CAAG,SAAA,CAAW,EAAG,CAAA,CACrD,GAAIA,CAAAA,CAAK,IAAA,GAAS,MAAA,CAChB,OAAO,CACL,KAAA,CAAO,CAAC,CAAE,MAAA,CAAQA,CAAAA,CAAK,EAAA,CAAI,KAAAiD,CAAAA,CAAM,GAAA,CAAAC,CAAAA,CAAK,KAAA,CAAAC,CAAAA,CAAO,MAAA,CAAAC,EAAQ,IAAA,CAAApD,CAAK,CAAC,CAAA,CAC3D,SAAA,CAAW,EACb,CAAA,CAGF,GAAM,CAAE,SAAA,CAAAR,CAAAA,CAAW,eAAA,CAAA8D,CAAAA,CAAiB,KAAA,CAAAC,CAAAA,CAAO,MAAA,CAAAC,CAAO,CAAA,CAAIxD,CAAAA,CAGhDyD,CAAAA,CAAoC,CACxC,EAAA,CAHiB,CAAA,SAAA,EAAYJ,CAAI,CAAA,CAAA,EAAI7D,CAAS,CAAA,CAAA,CAI9C,YAAaQ,CAAAA,CACb,SAAA,CAAAR,CAAAA,CACA,IAAA,CAAMA,CAAAA,GAAc,KAAA,CAAQyD,EAAOE,CAAAA,EAASG,CAAAA,CAAkB,GAAA,CAAA,CAAOL,CAAAA,CACrE,GAAA,CAAKzD,CAAAA,GAAc,QAAA,CAAW0D,CAAAA,CAAME,CAAAA,EAAUE,CAAAA,CAAkB,GAAA,CAAA,CAAOJ,CAAAA,CACvE,KAAA,CAAO1D,CAAAA,GAAc,MAAQ,CAAA,CAAI2D,CAAAA,CACjC,MAAA,CAAQ3D,CAAAA,GAAc,QAAA,CAAW,CAAA,CAAI4D,EACrC,UAAA,CAAYH,CAAAA,CACZ,SAAA,CAAWC,CAAAA,CACX,WAAA,CAAaC,CAAAA,CACb,aAAcC,CAChB,CAAA,CAEIM,CAAAA,CAAc,CAAE,KAAA,CAAO,EAAC,CAAqB,SAAA,CAAW,EAAyB,CAAA,CACjFC,CAAAA,CAAe,CAAE,KAAA,CAAO,EAAC,CAAqB,SAAA,CAAW,EAAyB,CAAA,CAEtF,GAAInE,IAAc,KAAA,CAAO,CACvB,IAAMoE,CAAAA,CAAaT,CAAAA,EAASG,CAAAA,CAAkB,KAC9CI,CAAAA,CAAcV,CAAAA,CAAcO,CAAAA,CAAON,CAAAA,CAAMC,CAAAA,CAAKU,CAAAA,CAAYR,CAAAA,CAAQ,CAAA,EAAGC,CAAI,CAAA,EAAA,CAAI,CAAA,CAC7EM,CAAAA,CAAeX,CAAAA,CACbQ,CAAAA,CACAP,EAAOW,CAAAA,CACPV,CAAAA,CACAC,CAAAA,CAAQS,CAAAA,CACRR,CAAAA,CACA,CAAA,EAAGC,CAAI,CAAA,EAAA,CACT,EACF,CAAA,KAAO,CACL,IAAMQ,CAAAA,CAAcT,CAAAA,EAAUE,EAAkB,GAAA,CAAA,CAChDI,CAAAA,CAAcV,CAAAA,CAAcO,CAAAA,CAAON,CAAAA,CAAMC,CAAAA,CAAKC,CAAAA,CAAOU,CAAAA,CAAa,CAAA,EAAGR,CAAI,CAAA,EAAA,CAAI,CAAA,CAC7EM,CAAAA,CAAeX,CAAAA,CACbQ,EACAP,CAAAA,CACAC,CAAAA,CAAMW,CAAAA,CACNV,CAAAA,CACAC,CAAAA,CAASS,CAAAA,CACT,GAAGR,CAAI,CAAA,EAAA,CACT,EACF,CAEA,OAAO,CACL,MAAO,CAAC,GAAGK,CAAAA,CAAY,KAAA,CAAO,GAAGC,CAAAA,CAAa,KAAK,CAAA,CACnD,SAAA,CAAW,CAACF,CAAAA,CAAiB,GAAGC,CAAAA,CAAY,SAAA,CAAW,GAAGC,CAAAA,CAAa,SAAS,CAClF,CACF,CAKO,SAASG,EACdlF,CAAAA,CACAmF,CAAAA,CACA7B,CAAAA,CACAW,CAAAA,CAA+B,QAAA,CACd,CACjB,GAAIjE,CAAAA,GAAS,IAAA,CAAM,OAAO,IAAA,CAG1B,IAAMuD,CAAAA,CAAa7B,CAAAA,CAAa1B,CAAAA,CAAMmF,CAAa,CAAA,CACnD,GAAI,CAAC5B,CAAAA,CAAY,OAAOvD,EAExB,IAAMoF,CAAAA,CAAgB7B,CAAAA,CAAW,MAAA,CAC3B8B,CAAAA,CAAqB9B,CAAAA,CAAW,YAChC+B,CAAAA,CAAsB/B,CAAAA,CAAW,YAAA,EAAgB,EAAC,CAGlDH,CAAAA,CAAYrD,EAAWC,CAAAA,CAAMmF,CAAa,CAAA,CAChD,GAAI/B,CAAAA,GAAc,IAAA,CAChB,OAAOG,CAAAA,CAIT,SAASpC,CAAAA,CAAOC,CAAAA,CAA0B,CACxC,GAAIA,CAAAA,CAAK,OAAS,MAAA,CAAQ,CACxB,GAAIA,CAAAA,CAAK,MAAA,CAAO,QAAA,CAASkC,CAAW,CAAA,CAAG,CAGrC,IAAMY,CAAAA,CAFU,CAAC,GAAG9C,EAAK,MAAM,CAAA,CAEF,MAAA,CAAQb,CAAAA,EAAM,CAAC6E,CAAAA,CAAc,QAAA,CAAS7E,CAAC,CAAC,CAAA,CACjE4D,CAAAA,CAAcD,CAAAA,CAAa,OAAA,CAAQZ,CAAW,EAC9Ca,CAAAA,CAAc,CAAA,GAChBA,CAAAA,CAAc,CAAA,CAAA,CAEZF,CAAAA,GAAa,OAAA,GACfE,GAAe,CAAA,CAAA,CAEjBD,CAAAA,CAAa,MAAA,CAAOC,CAAAA,CAAa,CAAA,CAAG,GAAGiB,CAAa,CAAA,CAEpD,IAAM3E,CAAAA,CAAkB,CAAE,GAAGW,CAAAA,CAAK,YAAa,CAAA,CAC/C,IAAA,IAAWmE,CAAAA,IAAOH,CAAAA,CACZE,CAAAA,CAAoBC,CAAG,CAAA,GACzB9E,EAAgB8E,CAAG,CAAA,CAAID,CAAAA,CAAoBC,CAAG,CAAA,CAAA,CAGlD,OAAO,CACL,GAAGnE,CAAAA,CACH,MAAA,CAAQ8C,CAAAA,CACR,WAAA,CAAamB,CAAAA,CACb,aAAc,MAAA,CAAO,IAAA,CAAK5E,CAAe,CAAA,CAAE,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAkB,MAC5E,CACF,CACA,OAAOW,CACT,CACA,OAAIA,EAAK,IAAA,GAAS,OAAA,CACT,CACL,GAAGA,CAAAA,CACH,KAAA,CAAOD,EAAOC,CAAAA,CAAK,KAAK,CAAA,CACxB,MAAA,CAAQD,CAAAA,CAAOC,CAAAA,CAAK,MAAM,CAC5B,CAAA,CAEKA,CACT,CAEA,OAAOD,CAAAA,CAAOiC,CAAS,CACzB,CAMO,SAASoC,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,EACQ,CAGR,GAAI,EAAA,CAFwBF,CAAAA,GAAe,KAAA,EAASA,CAAAA,GAAe,MAAA,GACbC,CAAAA,EAAaF,CAAAA,CAAO,QAAA,CAASE,CAAS,CAAA,CAAA,EAC7D,CAACC,CAAAA,CAC9B,OAAO,GAAA,CAET,IAAMzD,CAAAA,CAAQsD,CAAAA,CAAO,OAAA,CAAQE,CAAS,CAAA,CACtC,OAAOC,CAAAA,GAAoB,QAAA,CAAWzD,CAAAA,CAAQA,CAAAA,CAAQ,CACxD","file":"utils.cjs","sourcesContent":["import { TreeNode, SplitNode, SplitDirection, PaneNode, TabDetails } from '../../model'\n\nexport function generateUniqueId(): string {\n return 'pane-' + Math.random().toString(36).substring(2, 11)\n}\n\n/**\n * Tree Helper: Remove a pane container and consolidate the tree structure.\n */\nexport function removePane(tree: TreeNode | null, paneId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) return null\n return tree\n }\n const newFirst = removePane(tree.first, paneId)\n const newSecond = removePane(tree.second, paneId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Remove a tab from a pane and consolidate the tree structure if no tabs remain.\n */\nexport function removeTab(tree: TreeNode | null, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabIds.includes(tabId)) {\n const newTabs = tree.tabIds.filter((t) => t !== tabId)\n if (newTabs.length === 0) return null\n let newActive = tree.activeTabId\n if (tree.activeTabId === tabId) {\n newActive = newTabs[0]\n }\n const newTabsMetadata = { ...tree.tabsMetadata }\n delete newTabsMetadata[tabId]\n return {\n ...tree,\n tabIds: newTabs,\n activeTabId: newActive,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n const newFirst = removeTab(tree.first, tabId)\n const newSecond = removeTab(tree.second, tabId)\n if (newFirst === null) return newSecond\n if (newSecond === null) return newFirst\n return { ...tree, first: newFirst, second: newSecond }\n}\n\n/**\n * Tree Helper: Insert a pane or widget by splitting an existing target node.\n */\nexport function splitPane(\n tree: TreeNode | null,\n targetId: string,\n direction: SplitDirection,\n splitType: 'left' | 'right' | 'top' | 'bottom',\n paneToAdd: string | PaneNode,\n): TreeNode | null {\n if (tree === null) {\n if (typeof paneToAdd === 'string') {\n return { type: 'pane', id: generateUniqueId(), tabIds: [paneToAdd], activeTabId: paneToAdd }\n }\n return paneToAdd\n }\n if (tree.type === 'pane') {\n if (tree.id === targetId) {\n const addedNode: PaneNode =\n typeof paneToAdd === 'string'\n ? { type: 'pane', id: generateUniqueId(), tabIds: [paneToAdd], activeTabId: paneToAdd }\n : paneToAdd\n const isFirst = splitType === 'left' || splitType === 'top'\n return {\n type: 'split',\n direction,\n first: isFirst ? addedNode : tree,\n second: isFirst ? tree : addedNode,\n splitPercentage: 50,\n }\n }\n return tree\n }\n return {\n ...tree,\n first: splitPane(tree.first, targetId, direction, splitType, paneToAdd) || tree.first,\n second: splitPane(tree.second, targetId, direction, splitType, paneToAdd) || tree.second,\n }\n}\n\n/**\n * Helper to insert a leaf node (PaneNode or WidgetNode) into the layout tree.\n */\nexport function insertLeaf(tree: TreeNode | null, leafNode: PaneNode): TreeNode {\n if (tree === null) {\n return leafNode\n }\n\n function insert(node: TreeNode, parentDirection: SplitDirection | null): TreeNode {\n if (node.type === 'pane') {\n const direction: SplitDirection = parentDirection === 'row' ? 'column' : 'row'\n return {\n type: 'split',\n direction,\n splitPercentage: 50,\n first: node,\n second: leafNode,\n }\n }\n\n return {\n ...node,\n second: insert(node.second, node.direction),\n }\n }\n\n return insert(tree, null)\n}\n\n/**\n * Tree Helper: Add a tab into a target pane node, or splits/creates a new pane if no target pane ID is provided.\n */\nexport function addTab(\n tree: TreeNode | null,\n targetPaneId: string | undefined | null,\n tabId: string,\n metadata?: Record<string, unknown>,\n): TreeNode | null {\n if (tree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n }\n\n const targetPane = targetPaneId ? findPaneById(tree, targetPaneId) : null\n if (targetPane && targetPane.type === 'pane') {\n function appendTabToTarget(node: TreeNode): TreeNode {\n if (node.type === 'pane' && node.id === targetPaneId) {\n const newTabs = [...node.tabIds]\n if (!newTabs.includes(tabId)) {\n newTabs.push(tabId)\n }\n let newTabsMetadata = node.tabsMetadata\n if (metadata) {\n newTabsMetadata = {\n ...node.tabsMetadata,\n [tabId]: metadata,\n }\n }\n return {\n ...node,\n tabIds: newTabs,\n activeTabId: tabId,\n tabsMetadata: newTabsMetadata,\n }\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: appendTabToTarget(node.first),\n second: appendTabToTarget(node.second),\n }\n }\n return node\n }\n return appendTabToTarget(tree)\n }\n\n const newPane: PaneNode = {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [tabId],\n activeTabId: tabId,\n tabsMetadata: metadata ? { [tabId]: metadata } : undefined,\n }\n return insertLeaf(tree, newPane)\n}\n\n/**\n * Tree Helper: Update split percentage recursively.\n */\nexport function updateSplitPercentage(\n tree: TreeNode | null,\n target: SplitNode,\n newPercentage: number,\n): TreeNode | null {\n if (tree === null) return null\n if (tree === target) {\n return { ...tree, splitPercentage: newPercentage }\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateSplitPercentage(tree.first, target, newPercentage) || tree.first,\n second: updateSplitPercentage(tree.second, target, newPercentage) || tree.second,\n }\n }\n return tree\n}\n\n/**\n * Find a PaneNode or WidgetNode by its ID.\n */\nexport function findPaneById(tree: TreeNode | null, paneId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.id === paneId ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneById(tree.first, paneId) ?? findPaneById(tree.second, paneId)\n }\n return null\n}\n\n/**\n * Find a PaneNode containing the given tab ID.\n */\nexport function findPaneContainingTab(tree: TreeNode | null, tabId: string): PaneNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n return tree.tabIds.includes(tabId) ? tree : null\n }\n if (tree.type === 'split') {\n return findPaneContainingTab(tree.first, tabId) ?? findPaneContainingTab(tree.second, tabId)\n }\n return null\n}\n\n/**\n * Find a PaneNode by its own ID, or by a tab ID it contains.\n */\nexport function findPaneOrContainingTab(tree: TreeNode | null, id: string): PaneNode | null {\n return findPaneById(tree, id) ?? findPaneContainingTab(tree, id)\n}\n\n/**\n * Find the details of a tab by its ID.\n */\nexport function findTabById(tree: TreeNode | null, tabId: string): TabDetails | null {\n const pane = findPaneContainingTab(tree, tabId)\n if (!pane) return null\n const index = pane.tabIds.indexOf(tabId)\n return {\n id: tabId,\n paneId: pane.id,\n isActive: pane.activeTabId === tabId,\n index,\n metadata: pane.tabsMetadata?.[tabId],\n remountOnPopout: pane.tabsMetadata?.[tabId]?.remountOnPopout as boolean | undefined,\n }\n}\n\n/**\n * Get the metadata for a specific tab by its ID.\n */\nexport function getTabMetadata(\n tree: TreeNode | null,\n tabId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneContainingTab(tree, tabId)\n return pane?.tabsMetadata?.[tabId]\n}\n\n/**\n * Get the metadata of the active item (either tab or pane).\n */\n/**\n * Get the metadata of the active tab in a specific pane.\n */\nexport function getActiveTabMetadata(\n tree: TreeNode | null,\n paneId: string,\n): Record<string, unknown> | undefined {\n const pane = findPaneById(tree, paneId)\n return pane?.tabsMetadata?.[pane.activeTabId]\n}\n\n/**\n * Update metadata on a specific tab or widget node using an updater function.\n */\nexport function updateMetadata(\n tree: TreeNode | null,\n id: string,\n updater: (current: Record<string, unknown> | undefined) => Record<string, unknown> | undefined,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.tabIds.includes(id)) {\n const currentTabsMetadata = tree.tabsMetadata || {}\n const currentTabMeta = currentTabsMetadata[id]\n const newTabMeta = updater(currentTabMeta)\n\n const newTabsMetadata = { ...currentTabsMetadata }\n if (newTabMeta === undefined) {\n delete newTabsMetadata[id]\n } else {\n newTabsMetadata[id] = newTabMeta\n }\n\n return {\n ...tree,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updateMetadata(tree.first, id, updater) ?? tree.first,\n second: updateMetadata(tree.second, id, updater) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Update the locked status on a specific pane or widget node in the layout tree.\n */\nexport function updatePaneLock(\n tree: TreeNode | null,\n paneId: string,\n locked: boolean,\n): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (locked === false) {\n const { locked: _, ...rest } = tree\n return rest as PaneNode\n }\n return { ...tree, locked }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: updatePaneLock(tree.first, paneId, locked) ?? tree.first,\n second: updatePaneLock(tree.second, paneId, locked) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Activate a tab within a pane.\n */\nexport function selectTab(tree: TreeNode | null, paneId: string, tabId: string): TreeNode | null {\n if (tree === null) return null\n if (tree.type === 'pane') {\n if (tree.id === paneId) {\n if (tree.activeTabId === tabId) return tree\n return { ...tree, activeTabId: tabId }\n }\n return tree\n }\n if (tree.type === 'split') {\n return {\n ...tree,\n first: selectTab(tree.first, paneId, tabId) ?? tree.first,\n second: selectTab(tree.second, paneId, tabId) ?? tree.second,\n }\n }\n return tree\n}\n\n/**\n * Tree Helper: Merge a tab into a target pane node.\n */\nexport function mergeTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetPaneId: string,\n): TreeNode | null {\n if (tree === null) return null\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.id === targetPaneId) {\n const newTabs = [...node.tabIds]\n if (!newTabs.includes(draggedTabId)) {\n newTabs.push(draggedTabId)\n }\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabIds: newTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport function swapTabs(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n): TreeNode | null {\n if (tree === null) return null\n if (draggedTabId === targetTabId) return tree\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const targetPane = findPaneContainingTab(tree, targetTabId)\n\n if (!sourcePane || !targetPane) return tree\n\n const sourcePaneId = sourcePane.id\n const targetPaneId = targetPane.id\n const sourceMetadata = sourcePane.tabsMetadata?.[draggedTabId]\n const targetMetadata = targetPane.tabsMetadata?.[targetTabId]\n\n function swap(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n let changed = false\n let newTabIds = [...node.tabIds]\n let newActiveTabId = node.activeTabId\n const newTabsMetadata = node.tabsMetadata ? { ...node.tabsMetadata } : {}\n\n if (sourcePaneId === targetPaneId) {\n if (node.id === sourcePaneId) {\n const dragIdx = newTabIds.indexOf(draggedTabId)\n const targetIdx = newTabIds.indexOf(targetTabId)\n if (dragIdx !== -1 && targetIdx !== -1) {\n newTabIds[dragIdx] = targetTabId\n newTabIds[targetIdx] = draggedTabId\n }\n newActiveTabId = draggedTabId\n changed = true\n }\n } else {\n if (node.id === sourcePaneId) {\n newTabIds = newTabIds.map((id) => (id === draggedTabId ? targetTabId : id))\n if (newActiveTabId === draggedTabId) {\n newActiveTabId = targetTabId\n }\n delete newTabsMetadata[draggedTabId]\n if (targetMetadata) {\n newTabsMetadata[targetTabId] = targetMetadata\n }\n changed = true\n }\n if (node.id === targetPaneId) {\n newTabIds = newTabIds.map((id) => (id === targetTabId ? draggedTabId : id))\n if (newActiveTabId === targetTabId) {\n newActiveTabId = draggedTabId\n }\n delete newTabsMetadata[targetTabId]\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n changed = true\n }\n }\n\n if (changed) {\n return {\n ...node,\n tabIds: newTabIds,\n activeTabId: newActiveTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: swap(node.first),\n second: swap(node.second),\n }\n }\n return node\n }\n\n return swap(tree)\n}\n\n/**\n * Tree Helper: Move/reorder a tab inside or to a target pane next to a target tab.\n */\nexport function moveTab(\n tree: TreeNode | null,\n draggedTabId: string,\n targetTabId: string,\n position: 'before' | 'after' | 'center' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n if (draggedTabId === targetTabId) return tree\n\n if (position === 'center') {\n return swapTabs(tree, draggedTabId, targetTabId)\n }\n\n const sourcePane = findPaneContainingTab(tree, draggedTabId)\n const sourceMetadata = sourcePane?.tabsMetadata?.[draggedTabId]\n\n const cleanTree = removeTab(tree, draggedTabId)\n if (cleanTree === null) {\n return {\n type: 'pane',\n id: generateUniqueId(),\n tabIds: [draggedTabId],\n activeTabId: draggedTabId,\n tabsMetadata: sourceMetadata ? { [draggedTabId]: sourceMetadata } : undefined,\n }\n }\n\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabIds.includes(targetTabId)) {\n const newTabs = [...node.tabIds]\n const filteredTabs = newTabs.filter((t) => t !== draggedTabId)\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, draggedTabId)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n if (sourceMetadata) {\n newTabsMetadata[draggedTabId] = sourceMetadata\n }\n return {\n ...node,\n tabIds: filteredTabs,\n activeTabId: draggedTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\nexport interface ComputedPane {\n paneId: string\n left: number\n top: number\n width: number\n height: number\n node: PaneNode\n}\n\nexport interface ComputedSplitter {\n id: string\n currentNode: SplitNode\n direction: SplitDirection\n left: number\n top: number\n width: number\n height: number\n parentLeft: number\n parentTop: number\n parentWidth: number\n parentHeight: number\n}\n\nexport function computeLayout(\n node: TreeNode | null,\n left = 0,\n top = 0,\n width = 100,\n height = 100,\n path = 'root',\n): { panes: ComputedPane[]; splitters: ComputedSplitter[] } {\n if (node === null) return { panes: [], splitters: [] }\n if (node.type === 'pane') {\n return {\n panes: [{ paneId: node.id, left, top, width, height, node }],\n splitters: [],\n }\n }\n\n const { direction, splitPercentage, first, second } = node\n const splitterId = `splitter-${path}-${direction}`\n\n const currentSplitter: ComputedSplitter = {\n id: splitterId,\n currentNode: node,\n direction,\n left: direction === 'row' ? left + width * (splitPercentage / 100) : left,\n top: direction === 'column' ? top + height * (splitPercentage / 100) : top,\n width: direction === 'row' ? 0 : width,\n height: direction === 'column' ? 0 : height,\n parentLeft: left,\n parentTop: top,\n parentWidth: width,\n parentHeight: height,\n }\n\n let firstLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n let secondLayout = { panes: [] as ComputedPane[], splitters: [] as ComputedSplitter[] }\n\n if (direction === 'row') {\n const firstWidth = width * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, firstWidth, height, `${path}-L`)\n secondLayout = computeLayout(\n second,\n left + firstWidth,\n top,\n width - firstWidth,\n height,\n `${path}-R`,\n )\n } else {\n const firstHeight = height * (splitPercentage / 100)\n firstLayout = computeLayout(first, left, top, width, firstHeight, `${path}-T`)\n secondLayout = computeLayout(\n second,\n left,\n top + firstHeight,\n width,\n height - firstHeight,\n `${path}-B`,\n )\n }\n\n return {\n panes: [...firstLayout.panes, ...secondLayout.panes],\n splitters: [currentSplitter, ...firstLayout.splitters, ...secondLayout.splitters],\n }\n}\n\n/**\n * Tree Helper: Move/insert all tabs of a dragged pane next to a target tab in another pane.\n */\nexport function movePaneTabs(\n tree: TreeNode | null,\n draggedPaneId: string,\n targetTabId: string,\n position: 'before' | 'after' = 'before',\n): TreeNode | null {\n if (tree === null) return null\n\n // 1. Find the dragged pane to get its tabs, activeTabId, and tabsMetadata\n const sourcePane = findPaneById(tree, draggedPaneId)\n if (!sourcePane) return tree\n\n const draggedTabIds = sourcePane.tabIds\n const draggedActiveTabId = sourcePane.activeTabId\n const draggedTabsMetadata = sourcePane.tabsMetadata || {}\n\n // 2. Remove the dragged pane from the layout tree\n const cleanTree = removePane(tree, draggedPaneId)\n if (cleanTree === null) {\n return sourcePane\n }\n\n // 3. Insert the dragged pane's tabs into the target pane next to targetTabId\n function insert(node: TreeNode): TreeNode {\n if (node.type === 'pane') {\n if (node.tabIds.includes(targetTabId)) {\n const newTabs = [...node.tabIds]\n // Filter out any of the dragged tabs if they somehow already existed\n const filteredTabs = newTabs.filter((t) => !draggedTabIds.includes(t))\n let insertIndex = filteredTabs.indexOf(targetTabId)\n if (insertIndex < 0) {\n insertIndex = 0\n }\n if (position === 'after') {\n insertIndex += 1\n }\n filteredTabs.splice(insertIndex, 0, ...draggedTabIds)\n\n const newTabsMetadata = { ...node.tabsMetadata }\n for (const tid of draggedTabIds) {\n if (draggedTabsMetadata[tid]) {\n newTabsMetadata[tid] = draggedTabsMetadata[tid]\n }\n }\n return {\n ...node,\n tabIds: filteredTabs,\n activeTabId: draggedActiveTabId,\n tabsMetadata: Object.keys(newTabsMetadata).length > 0 ? newTabsMetadata : undefined,\n }\n }\n return node\n }\n if (node.type === 'split') {\n return {\n ...node,\n first: insert(node.first),\n second: insert(node.second),\n }\n }\n return node\n }\n\n return insert(cleanTree)\n}\n\n/**\n * Calculates the target drop insertion index in a list of tabs during a drag.\n * Returns -1 if the drop target is not in the list.\n */\nexport function calculateTabDropIndex(\n tabIds: string[],\n activeType: string | null,\n overTabId: string | null,\n overTabPosition: 'before' | 'after' | null,\n): number {\n const isDraggingTabOrPane = activeType === 'tab' || activeType === 'pane'\n const isHoveredTabInThisPane = isDraggingTabOrPane && overTabId && tabIds.includes(overTabId)\n if (!isHoveredTabInThisPane || !overTabPosition) {\n return -1\n }\n const index = tabIds.indexOf(overTabId)\n return overTabPosition === 'before' ? index : index + 1\n}\n"]}
|
package/dist/utils.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as PaneNode, b as SplitNode, S as SplitDirection, T as TreeNode, c as TabDetails } from './types-
|
|
1
|
+
import { P as PaneNode, b as SplitNode, S as SplitDirection, T as TreeNode, c as TabDetails } from './types-V7PXu-Mo.cjs';
|
|
2
2
|
import 'react';
|
|
3
3
|
|
|
4
4
|
declare function generateUniqueId(): string;
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as PaneNode, b as SplitNode, S as SplitDirection, T as TreeNode, c as TabDetails } from './types-
|
|
1
|
+
import { P as PaneNode, b as SplitNode, S as SplitDirection, T as TreeNode, c as TabDetails } from './types-V7PXu-Mo.js';
|
|
2
2
|
import 'react';
|
|
3
3
|
|
|
4
4
|
declare function generateUniqueId(): string;
|
package/dist/utils.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function M(){return "pane-"+Math.random().toString(36).substring(2,11)}function x(n,t){if(n===null)return null;if(n.type==="pane")return n.id===t?null:n;let e=x(n.first,t),i=x(n.second,t);return e===null?i:i===null?e:{...n,first:e,second:i}}function P(n,t){if(n===null)return null;if(n.type==="pane"){if(n.tabIds.includes(t)){let s=n.tabIds.filter(o=>o!==t);if(s.length===0)return null;let l=n.activeTabId;n.activeTabId===t&&(l=s[0]);let u={...n.tabsMetadata};return delete u[t],{...n,tabIds:s,activeTabId:l,tabsMetadata:Object.keys(u).length>0?u:void 0}}return n}let e=P(n.first,t),i=P(n.second,t);return e===null?i:i===null?e:{...n,first:e,second:i}}function v(n,t,e,i,s){if(n===null)return typeof s=="string"?{type:"pane",id:M(),tabIds:[s],activeTabId:s}:s;if(n.type==="pane"){if(n.id===t){let l=typeof s=="string"?{type:"pane",id:M(),tabIds:[s],activeTabId:s}:s,u=i==="left"||i==="top";return {type:"split",direction:e,first:u?l:n,second:u?n:l,splitPercentage:50}}return n}return {...n,first:v(n.first,t,e,i,s)||n.first,second:v(n.second,t,e,i,s)||n.second}}function D(n,t){if(n===null)return t;function e(i,s){return i.type==="pane"?{type:"split",direction:s==="row"?"column":"row",splitPercentage:50,first:i,second:t}:{...i,second:e(i.second,i.direction)}}return e(n,null)}function h(n,t,e,i){if(n===null)return {type:"pane",id:M(),tabIds:[e],activeTabId:e,tabsMetadata:i?{[e]:i}:void 0};let s=t?y(n,t):null;if(s&&s.type==="pane"){let o=function(r){if(r.type==="pane"&&r.id===t){let f=[...r.tabIds];f.includes(e)||f.push(e);let a=r.tabsMetadata;return i&&(a={...r.tabsMetadata,[e]:i}),{...r,tabIds:f,activeTabId:e,tabsMetadata:a}}return r.type==="split"?{...r,first:o(r.first),second:o(r.second)}:r};return o(n)}let l={type:"pane",id:M(),tabIds:[e],activeTabId:e,tabsMetadata:i?{[e]:i}:void 0};return D(n,l)}function w(n,t,e){return n===null?null:n===t?{...n,splitPercentage:e}:n.type==="split"?{...n,first:w(n.first,t,e)||n.first,second:w(n.second,t,e)||n.second}:n}function y(n,t){return n===null?null:n.type==="pane"?n.id===t?n:null:n.type==="split"?y(n.first,t)??y(n.second,t):null}function N(n,t){return n===null?null:n.type==="pane"?n.tabIds.includes(t)?n:null:n.type==="split"?N(n.first,t)??N(n.second,t):null}function j(n,t){let e=N(n,t);if(!e)return null;let i=e.tabIds.indexOf(t);return {id:t,paneId:e.id,isActive:e.activeTabId===t,index:i,metadata:e.tabsMetadata?.[t]}}function R(n,t){return N(n,t)?.tabsMetadata?.[t]}function $(n,t){let e=y(n,t);return e?.tabsMetadata?.[e.activeTabId]}function S(n,t,e){if(n===null)return null;if(n.type==="pane"){if(n.tabIds.includes(t)){let i=n.tabsMetadata||{},s=i[t],l=e(s),u={...i};return l===void 0?delete u[t]:u[t]=l,{...n,tabsMetadata:Object.keys(u).length>0?u:void 0}}return n}return n.type==="split"?{...n,first:S(n.first,t,e)??n.first,second:S(n.second,t,e)??n.second}:n}function O(n,t,e){if(n===null)return null;if(n.type==="pane"){if(n.id===t){if(e===false){let{locked:i,...s}=n;return s}return {...n,locked:e}}return n}return n.type==="split"?{...n,first:O(n.first,t,e)??n.first,second:O(n.second,t,e)??n.second}:n}function C(n,t,e){return n===null?null:n.type==="pane"?n.id===t?n.activeTabId===e?n:{...n,activeTabId:e}:n:n.type==="split"?{...n,first:C(n.first,t,e)??n.first,second:C(n.second,t,e)??n.second}:n}function B(n,t,e){if(n===null)return null;let s=N(n,t)?.tabsMetadata?.[t],l=P(n,t);if(l===null)return {type:"pane",id:M(),tabIds:[t],activeTabId:t,tabsMetadata:s?{[t]:s}:void 0};function u(o){if(o.type==="pane"){if(o.id===e){let r=[...o.tabIds];r.includes(t)||r.push(t);let f={...o.tabsMetadata};return s&&(f[t]=s),{...o,tabIds:r,activeTabId:t,tabsMetadata:Object.keys(f).length>0?f:void 0}}return o}return o.type==="split"?{...o,first:u(o.first),second:u(o.second)}:o}return u(l)}function L(n,t,e){if(n===null)return null;if(t===e)return n;let i=N(n,t),s=N(n,e);if(!i||!s)return n;let l=i.id,u=s.id,o=i.tabsMetadata?.[t],r=s.tabsMetadata?.[e];function f(a){if(a.type==="pane"){let T=false,c=[...a.tabIds],p=a.activeTabId,d=a.tabsMetadata?{...a.tabsMetadata}:{};if(l===u){if(a.id===l){let b=c.indexOf(t),k=c.indexOf(e);b!==-1&&k!==-1&&(c[b]=e,c[k]=t),p=t,T=true;}}else a.id===l&&(c=c.map(b=>b===t?e:b),p===t&&(p=e),delete d[t],r&&(d[e]=r),T=true),a.id===u&&(c=c.map(b=>b===e?t:b),p===e&&(p=t),delete d[e],o&&(d[t]=o),T=true);return T?{...a,tabIds:c,activeTabId:p,tabsMetadata:Object.keys(d).length>0?d:void 0}:a}return a.type==="split"?{...a,first:f(a.first),second:f(a.second)}:a}return f(n)}function H(n,t,e,i="before"){if(n===null)return null;if(t===e)return n;if(i==="center")return L(n,t,e);let l=N(n,t)?.tabsMetadata?.[t],u=P(n,t);if(u===null)return {type:"pane",id:M(),tabIds:[t],activeTabId:t,tabsMetadata:l?{[t]:l}:void 0};function o(r){if(r.type==="pane"){if(r.tabIds.includes(e)){let a=[...r.tabIds].filter(p=>p!==t),T=a.indexOf(e);T<0&&(T=0),i==="after"&&(T+=1),a.splice(T,0,t);let c={...r.tabsMetadata};return l&&(c[t]=l),{...r,tabIds:a,activeTabId:t,tabsMetadata:Object.keys(c).length>0?c:void 0}}return r}return r.type==="split"?{...r,first:o(r.first),second:o(r.second)}:r}return o(u)}function m(n,t=0,e=0,i=100,s=100,l="root"){if(n===null)return {panes:[],splitters:[]};if(n.type==="pane")return {panes:[{paneId:n.id,left:t,top:e,width:i,height:s,node:n}],splitters:[]};let{direction:u,splitPercentage:o,first:r,second:f}=n,T={id:`splitter-${l}-${u}`,currentNode:n,direction:u,left:u==="row"?t+i*(o/100):t,top:u==="column"?e+s*(o/100):e,width:u==="row"?0:i,height:u==="column"?0:s,parentLeft:t,parentTop:e,parentWidth:i,parentHeight:s},c={panes:[],splitters:[]},p={panes:[],splitters:[]};if(u==="row"){let d=i*(o/100);c=m(r,t,e,d,s,`${l}-L`),p=m(f,t+d,e,i-d,s,`${l}-R`);}else {let d=s*(o/100);c=m(r,t,e,i,d,`${l}-T`),p=m(f,t,e+d,i,s-d,`${l}-B`);}return {panes:[...c.panes,...p.panes],splitters:[T,...c.splitters,...p.splitters]}}function F(n,t,e,i="before"){if(n===null)return null;let s=y(n,t);if(!s)return n;let l=s.tabIds,u=s.activeTabId,o=s.tabsMetadata||{},r=x(n,t);if(r===null)return s;function f(a){if(a.type==="pane"){if(a.tabIds.includes(e)){let c=[...a.tabIds].filter(b=>!l.includes(b)),p=c.indexOf(e);p<0&&(p=0),i==="after"&&(p+=1),c.splice(p,0,...l);let d={...a.tabsMetadata};for(let b of l)o[b]&&(d[b]=o[b]);return {...a,tabIds:c,activeTabId:u,tabsMetadata:Object.keys(d).length>0?d:void 0}}return a}return a.type==="split"?{...a,first:f(a.first),second:f(a.second)}:a}return f(r)}function W(n,t,e,i){if(!((t==="tab"||t==="pane")&&e&&n.includes(e))||!i)return -1;let u=n.indexOf(e);return i==="before"?u:u+1}export{h as addTab,W as calculateTabDropIndex,m as computeLayout,y as findPaneById,N as findPaneContainingTab,j as findTabById,M as generateUniqueId,$ as getActiveTabMetadata,R as getTabMetadata,D as insertLeaf,B as mergeTab,F as movePaneTabs,H as moveTab,x as removePane,P as removeTab,C as selectTab,v as splitPane,L as swapTabs,S as updateMetadata,O as updatePaneLock,w as updateSplitPercentage};//# sourceMappingURL=utils.js.map
|
|
1
|
+
function M(){return "pane-"+Math.random().toString(36).substring(2,11)}function x(n,t){if(n===null)return null;if(n.type==="pane")return n.id===t?null:n;let e=x(n.first,t),i=x(n.second,t);return e===null?i:i===null?e:{...n,first:e,second:i}}function P(n,t){if(n===null)return null;if(n.type==="pane"){if(n.tabIds.includes(t)){let s=n.tabIds.filter(o=>o!==t);if(s.length===0)return null;let l=n.activeTabId;n.activeTabId===t&&(l=s[0]);let u={...n.tabsMetadata};return delete u[t],{...n,tabIds:s,activeTabId:l,tabsMetadata:Object.keys(u).length>0?u:void 0}}return n}let e=P(n.first,t),i=P(n.second,t);return e===null?i:i===null?e:{...n,first:e,second:i}}function v(n,t,e,i,s){if(n===null)return typeof s=="string"?{type:"pane",id:M(),tabIds:[s],activeTabId:s}:s;if(n.type==="pane"){if(n.id===t){let l=typeof s=="string"?{type:"pane",id:M(),tabIds:[s],activeTabId:s}:s,u=i==="left"||i==="top";return {type:"split",direction:e,first:u?l:n,second:u?n:l,splitPercentage:50}}return n}return {...n,first:v(n.first,t,e,i,s)||n.first,second:v(n.second,t,e,i,s)||n.second}}function D(n,t){if(n===null)return t;function e(i,s){return i.type==="pane"?{type:"split",direction:s==="row"?"column":"row",splitPercentage:50,first:i,second:t}:{...i,second:e(i.second,i.direction)}}return e(n,null)}function h(n,t,e,i){if(n===null)return {type:"pane",id:M(),tabIds:[e],activeTabId:e,tabsMetadata:i?{[e]:i}:void 0};let s=t?y(n,t):null;if(s&&s.type==="pane"){let o=function(r){if(r.type==="pane"&&r.id===t){let f=[...r.tabIds];f.includes(e)||f.push(e);let a=r.tabsMetadata;return i&&(a={...r.tabsMetadata,[e]:i}),{...r,tabIds:f,activeTabId:e,tabsMetadata:a}}return r.type==="split"?{...r,first:o(r.first),second:o(r.second)}:r};return o(n)}let l={type:"pane",id:M(),tabIds:[e],activeTabId:e,tabsMetadata:i?{[e]:i}:void 0};return D(n,l)}function w(n,t,e){return n===null?null:n===t?{...n,splitPercentage:e}:n.type==="split"?{...n,first:w(n.first,t,e)||n.first,second:w(n.second,t,e)||n.second}:n}function y(n,t){return n===null?null:n.type==="pane"?n.id===t?n:null:n.type==="split"?y(n.first,t)??y(n.second,t):null}function N(n,t){return n===null?null:n.type==="pane"?n.tabIds.includes(t)?n:null:n.type==="split"?N(n.first,t)??N(n.second,t):null}function j(n,t){let e=N(n,t);if(!e)return null;let i=e.tabIds.indexOf(t);return {id:t,paneId:e.id,isActive:e.activeTabId===t,index:i,metadata:e.tabsMetadata?.[t],remountOnPopout:e.tabsMetadata?.[t]?.remountOnPopout}}function R(n,t){return N(n,t)?.tabsMetadata?.[t]}function $(n,t){let e=y(n,t);return e?.tabsMetadata?.[e.activeTabId]}function S(n,t,e){if(n===null)return null;if(n.type==="pane"){if(n.tabIds.includes(t)){let i=n.tabsMetadata||{},s=i[t],l=e(s),u={...i};return l===void 0?delete u[t]:u[t]=l,{...n,tabsMetadata:Object.keys(u).length>0?u:void 0}}return n}return n.type==="split"?{...n,first:S(n.first,t,e)??n.first,second:S(n.second,t,e)??n.second}:n}function O(n,t,e){if(n===null)return null;if(n.type==="pane"){if(n.id===t){if(e===false){let{locked:i,...s}=n;return s}return {...n,locked:e}}return n}return n.type==="split"?{...n,first:O(n.first,t,e)??n.first,second:O(n.second,t,e)??n.second}:n}function C(n,t,e){return n===null?null:n.type==="pane"?n.id===t?n.activeTabId===e?n:{...n,activeTabId:e}:n:n.type==="split"?{...n,first:C(n.first,t,e)??n.first,second:C(n.second,t,e)??n.second}:n}function B(n,t,e){if(n===null)return null;let s=N(n,t)?.tabsMetadata?.[t],l=P(n,t);if(l===null)return {type:"pane",id:M(),tabIds:[t],activeTabId:t,tabsMetadata:s?{[t]:s}:void 0};function u(o){if(o.type==="pane"){if(o.id===e){let r=[...o.tabIds];r.includes(t)||r.push(t);let f={...o.tabsMetadata};return s&&(f[t]=s),{...o,tabIds:r,activeTabId:t,tabsMetadata:Object.keys(f).length>0?f:void 0}}return o}return o.type==="split"?{...o,first:u(o.first),second:u(o.second)}:o}return u(l)}function L(n,t,e){if(n===null)return null;if(t===e)return n;let i=N(n,t),s=N(n,e);if(!i||!s)return n;let l=i.id,u=s.id,o=i.tabsMetadata?.[t],r=s.tabsMetadata?.[e];function f(a){if(a.type==="pane"){let T=false,c=[...a.tabIds],p=a.activeTabId,d=a.tabsMetadata?{...a.tabsMetadata}:{};if(l===u){if(a.id===l){let b=c.indexOf(t),k=c.indexOf(e);b!==-1&&k!==-1&&(c[b]=e,c[k]=t),p=t,T=true;}}else a.id===l&&(c=c.map(b=>b===t?e:b),p===t&&(p=e),delete d[t],r&&(d[e]=r),T=true),a.id===u&&(c=c.map(b=>b===e?t:b),p===e&&(p=t),delete d[e],o&&(d[t]=o),T=true);return T?{...a,tabIds:c,activeTabId:p,tabsMetadata:Object.keys(d).length>0?d:void 0}:a}return a.type==="split"?{...a,first:f(a.first),second:f(a.second)}:a}return f(n)}function H(n,t,e,i="before"){if(n===null)return null;if(t===e)return n;if(i==="center")return L(n,t,e);let l=N(n,t)?.tabsMetadata?.[t],u=P(n,t);if(u===null)return {type:"pane",id:M(),tabIds:[t],activeTabId:t,tabsMetadata:l?{[t]:l}:void 0};function o(r){if(r.type==="pane"){if(r.tabIds.includes(e)){let a=[...r.tabIds].filter(p=>p!==t),T=a.indexOf(e);T<0&&(T=0),i==="after"&&(T+=1),a.splice(T,0,t);let c={...r.tabsMetadata};return l&&(c[t]=l),{...r,tabIds:a,activeTabId:t,tabsMetadata:Object.keys(c).length>0?c:void 0}}return r}return r.type==="split"?{...r,first:o(r.first),second:o(r.second)}:r}return o(u)}function m(n,t=0,e=0,i=100,s=100,l="root"){if(n===null)return {panes:[],splitters:[]};if(n.type==="pane")return {panes:[{paneId:n.id,left:t,top:e,width:i,height:s,node:n}],splitters:[]};let{direction:u,splitPercentage:o,first:r,second:f}=n,T={id:`splitter-${l}-${u}`,currentNode:n,direction:u,left:u==="row"?t+i*(o/100):t,top:u==="column"?e+s*(o/100):e,width:u==="row"?0:i,height:u==="column"?0:s,parentLeft:t,parentTop:e,parentWidth:i,parentHeight:s},c={panes:[],splitters:[]},p={panes:[],splitters:[]};if(u==="row"){let d=i*(o/100);c=m(r,t,e,d,s,`${l}-L`),p=m(f,t+d,e,i-d,s,`${l}-R`);}else {let d=s*(o/100);c=m(r,t,e,i,d,`${l}-T`),p=m(f,t,e+d,i,s-d,`${l}-B`);}return {panes:[...c.panes,...p.panes],splitters:[T,...c.splitters,...p.splitters]}}function F(n,t,e,i="before"){if(n===null)return null;let s=y(n,t);if(!s)return n;let l=s.tabIds,u=s.activeTabId,o=s.tabsMetadata||{},r=x(n,t);if(r===null)return s;function f(a){if(a.type==="pane"){if(a.tabIds.includes(e)){let c=[...a.tabIds].filter(b=>!l.includes(b)),p=c.indexOf(e);p<0&&(p=0),i==="after"&&(p+=1),c.splice(p,0,...l);let d={...a.tabsMetadata};for(let b of l)o[b]&&(d[b]=o[b]);return {...a,tabIds:c,activeTabId:u,tabsMetadata:Object.keys(d).length>0?d:void 0}}return a}return a.type==="split"?{...a,first:f(a.first),second:f(a.second)}:a}return f(r)}function W(n,t,e,i){if(!((t==="tab"||t==="pane")&&e&&n.includes(e))||!i)return -1;let u=n.indexOf(e);return i==="before"?u:u+1}export{h as addTab,W as calculateTabDropIndex,m as computeLayout,y as findPaneById,N as findPaneContainingTab,j as findTabById,M as generateUniqueId,$ as getActiveTabMetadata,R as getTabMetadata,D as insertLeaf,B as mergeTab,F as movePaneTabs,H as moveTab,x as removePane,P as removeTab,C as selectTab,v as splitPane,L as swapTabs,S as updateMetadata,O as updatePaneLock,w as updateSplitPercentage};//# sourceMappingURL=utils.js.map
|
|
2
2
|
//# sourceMappingURL=utils.js.map
|