@corenel/editor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/diagnostics.d.ts +9 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +2 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/dock/PanelChooser.d.ts +13 -0
- package/dist/dock/PanelChooser.d.ts.map +1 -0
- package/dist/dock/PanelChooser.js +72 -0
- package/dist/dock/PanelChooser.js.map +1 -0
- package/dist/dock/PanelFrame.d.ts +37 -0
- package/dist/dock/PanelFrame.d.ts.map +1 -0
- package/dist/dock/PanelFrame.js +102 -0
- package/dist/dock/PanelFrame.js.map +1 -0
- package/dist/dock/PanelHost.d.ts +12 -0
- package/dist/dock/PanelHost.d.ts.map +1 -0
- package/dist/dock/PanelHost.js +331 -0
- package/dist/dock/PanelHost.js.map +1 -0
- package/dist/dock/config.d.ts +35 -0
- package/dist/dock/config.d.ts.map +1 -0
- package/dist/dock/config.js +2 -0
- package/dist/dock/config.js.map +1 -0
- package/dist/dock/index.d.ts +9 -0
- package/dist/dock/index.d.ts.map +1 -0
- package/dist/dock/index.js +13 -0
- package/dist/dock/index.js.map +1 -0
- package/dist/dock/layouts.d.ts +12 -0
- package/dist/dock/layouts.d.ts.map +1 -0
- package/dist/dock/layouts.js +50 -0
- package/dist/dock/layouts.js.map +1 -0
- package/dist/dock/tree.d.ts +73 -0
- package/dist/dock/tree.d.ts.map +1 -0
- package/dist/dock/tree.js +276 -0
- package/dist/dock/tree.js.map +1 -0
- package/dist/dock/types.d.ts +51 -0
- package/dist/dock/types.d.ts.map +1 -0
- package/dist/dock/types.js +42 -0
- package/dist/dock/types.js.map +1 -0
- package/dist/dock/use-layout.d.ts +41 -0
- package/dist/dock/use-layout.d.ts.map +1 -0
- package/dist/dock/use-layout.js +114 -0
- package/dist/dock/use-layout.js.map +1 -0
- package/dist/engine/index.d.ts +6 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +8 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/runModel.d.ts +16 -0
- package/dist/engine/runModel.d.ts.map +1 -0
- package/dist/engine/runModel.js +7 -0
- package/dist/engine/runModel.js.map +1 -0
- package/dist/engine/useDocResults.d.ts +38 -0
- package/dist/engine/useDocResults.d.ts.map +1 -0
- package/dist/engine/useDocResults.js +51 -0
- package/dist/engine/useDocResults.js.map +1 -0
- package/dist/engine/useRunController.d.ts +18 -0
- package/dist/engine/useRunController.d.ts.map +1 -0
- package/dist/engine/useRunController.js +28 -0
- package/dist/engine/useRunController.js.map +1 -0
- package/dist/engine/useRunHistory.d.ts +22 -0
- package/dist/engine/useRunHistory.d.ts.map +1 -0
- package/dist/engine/useRunHistory.js +20 -0
- package/dist/engine/useRunHistory.js.map +1 -0
- package/dist/engine/useRunOutput.d.ts +32 -0
- package/dist/engine/useRunOutput.d.ts.map +1 -0
- package/dist/engine/useRunOutput.js +51 -0
- package/dist/engine/useRunOutput.js.map +1 -0
- package/dist/errorLog.d.ts +17 -0
- package/dist/errorLog.d.ts.map +1 -0
- package/dist/errorLog.js +44 -0
- package/dist/errorLog.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/inlineAssist.d.ts +109 -0
- package/dist/inlineAssist.d.ts.map +1 -0
- package/dist/inlineAssist.js +272 -0
- package/dist/inlineAssist.js.map +1 -0
- package/dist/panels/DesignView.d.ts +9 -0
- package/dist/panels/DesignView.d.ts.map +1 -0
- package/dist/panels/DesignView.js +36 -0
- package/dist/panels/DesignView.js.map +1 -0
- package/dist/panels/ParamCard.d.ts +14 -0
- package/dist/panels/ParamCard.d.ts.map +1 -0
- package/dist/panels/ParamCard.js +138 -0
- package/dist/panels/ParamCard.js.map +1 -0
- package/dist/panels/ProblemsPanel.d.ts +9 -0
- package/dist/panels/ProblemsPanel.d.ts.map +1 -0
- package/dist/panels/ProblemsPanel.js +46 -0
- package/dist/panels/ProblemsPanel.js.map +1 -0
- package/dist/panels/UsageButton.d.ts +9 -0
- package/dist/panels/UsageButton.d.ts.map +1 -0
- package/dist/panels/UsageButton.js +40 -0
- package/dist/panels/UsageButton.js.map +1 -0
- package/dist/panels/index.d.ts +5 -0
- package/dist/panels/index.d.ts.map +1 -0
- package/dist/panels/index.js +8 -0
- package/dist/panels/index.js.map +1 -0
- package/dist/params.d.ts +27 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/params.js +142 -0
- package/dist/params.js.map +1 -0
- package/dist/useWorkbench.d.ts +9 -0
- package/dist/useWorkbench.d.ts.map +1 -0
- package/dist/useWorkbench.js +21 -0
- package/dist/useWorkbench.js.map +1 -0
- package/dist/workflowModel.d.ts +128 -0
- package/dist/workflowModel.d.ts.map +1 -0
- package/dist/workflowModel.js +135 -0
- package/dist/workflowModel.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment, useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { PanelFrame } from './PanelFrame';
|
|
4
|
+
import { isInert } from './tree';
|
|
5
|
+
/** A row/col flex container with a draggable resizer between adjacent expanded
|
|
6
|
+
* panes. Collapsed panes shrink to their rail and lose their resizer. */
|
|
7
|
+
function SplitView({ node, ctx }) {
|
|
8
|
+
const ref = useRef(null);
|
|
9
|
+
const isRow = node.dir === 'row';
|
|
10
|
+
// Resizers act on a pair of EXPANDED panes (a, b). b may be more than one index
|
|
11
|
+
// past a when collapsed rails sit between them — so a rail never breaks resizing.
|
|
12
|
+
const equalize = (a, b) => () => {
|
|
13
|
+
const sizes = [...node.sizes];
|
|
14
|
+
const avg = ((sizes[a] ?? 1) + (sizes[b] ?? 1)) / 2;
|
|
15
|
+
sizes[a] = avg;
|
|
16
|
+
sizes[b] = avg;
|
|
17
|
+
ctx.dock.resize(node.id, sizes);
|
|
18
|
+
};
|
|
19
|
+
const startResize = (a, b) => (e) => {
|
|
20
|
+
e.preventDefault();
|
|
21
|
+
const el = ref.current;
|
|
22
|
+
if (!el)
|
|
23
|
+
return;
|
|
24
|
+
const handle = e.currentTarget;
|
|
25
|
+
// Measure the two panes being resized. A drag only redistributes weight
|
|
26
|
+
// BETWEEN this pair (their combined weight is conserved), so the conversion
|
|
27
|
+
// must use their own pixel span — not the whole container's. Using the
|
|
28
|
+
// container span counts collapsed rails + other panes' pixels and weights
|
|
29
|
+
// that this drag never touches, which makes it oversensitive (the doubling).
|
|
30
|
+
const paneA = el.querySelector(`:scope > [data-dock-pane="${a}"]`);
|
|
31
|
+
const paneB = el.querySelector(`:scope > [data-dock-pane="${b}"]`);
|
|
32
|
+
if (!paneA || !paneB)
|
|
33
|
+
return;
|
|
34
|
+
const ra = paneA.getBoundingClientRect();
|
|
35
|
+
const rb = paneB.getBoundingClientRect();
|
|
36
|
+
const pairSpan = isRow ? ra.width + rb.width : ra.height + rb.height;
|
|
37
|
+
if (pairSpan <= 0)
|
|
38
|
+
return;
|
|
39
|
+
handle.classList.add('dragging');
|
|
40
|
+
const startPos = isRow ? e.clientX : e.clientY;
|
|
41
|
+
const sizes = [...node.sizes];
|
|
42
|
+
const a0 = sizes[a] ?? 1;
|
|
43
|
+
const b0 = sizes[b] ?? 1;
|
|
44
|
+
const pairWeight = a0 + b0;
|
|
45
|
+
const min = (40 / pairSpan) * pairWeight; // keep each pane >= ~40px
|
|
46
|
+
const onMove = (ev) => {
|
|
47
|
+
const pos = isRow ? ev.clientX : ev.clientY;
|
|
48
|
+
const delta = ((pos - startPos) / pairSpan) * pairWeight;
|
|
49
|
+
let na = a0 + delta;
|
|
50
|
+
let nb = b0 - delta;
|
|
51
|
+
if (na < min) {
|
|
52
|
+
nb -= min - na;
|
|
53
|
+
na = min;
|
|
54
|
+
}
|
|
55
|
+
if (nb < min) {
|
|
56
|
+
na -= min - nb;
|
|
57
|
+
nb = min;
|
|
58
|
+
}
|
|
59
|
+
const next = [...sizes];
|
|
60
|
+
next[a] = na;
|
|
61
|
+
next[b] = nb;
|
|
62
|
+
ctx.dock.resize(node.id, next);
|
|
63
|
+
};
|
|
64
|
+
const onUp = () => {
|
|
65
|
+
window.removeEventListener('mousemove', onMove);
|
|
66
|
+
window.removeEventListener('mouseup', onUp);
|
|
67
|
+
document.body.style.cursor = '';
|
|
68
|
+
document.body.style.userSelect = '';
|
|
69
|
+
handle.classList.remove('dragging');
|
|
70
|
+
};
|
|
71
|
+
document.body.style.cursor = isRow ? 'col-resize' : 'row-resize';
|
|
72
|
+
document.body.style.userSelect = 'none';
|
|
73
|
+
window.addEventListener('mousemove', onMove);
|
|
74
|
+
window.addEventListener('mouseup', onUp);
|
|
75
|
+
};
|
|
76
|
+
const gatherLeaves = (n, index, acc) => {
|
|
77
|
+
if (n.type === 'panel')
|
|
78
|
+
acc.push({ child: n, index });
|
|
79
|
+
else
|
|
80
|
+
n.children.forEach((c) => gatherLeaves(c, index, acc));
|
|
81
|
+
};
|
|
82
|
+
const groups = [];
|
|
83
|
+
for (let i = 0; i < node.children.length;) {
|
|
84
|
+
if (isInert(node.children[i])) {
|
|
85
|
+
const items = [];
|
|
86
|
+
while (i < node.children.length && isInert(node.children[i])) {
|
|
87
|
+
gatherLeaves(node.children[i], i, items);
|
|
88
|
+
i++;
|
|
89
|
+
}
|
|
90
|
+
if (items.length)
|
|
91
|
+
groups.push({ kind: 'tabs', items });
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
groups.push({ kind: 'node', child: node.children[i], index: i });
|
|
95
|
+
i++;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return (_jsx("div", { ref: ref, style: { display: 'flex', flexDirection: isRow ? 'row' : 'column', flex: 1, minWidth: 0, minHeight: 0 }, children: groups.map((g, gi) => {
|
|
99
|
+
if (g.kind === 'tabs') {
|
|
100
|
+
const tabKey = g.items.map((it) => (it.child.type === 'panel' ? it.child.id : '')).join('-');
|
|
101
|
+
return _jsx(CollapsedTabBar, { items: g.items, dir: node.dir, ctx: ctx }, `tabs-${tabKey}`);
|
|
102
|
+
}
|
|
103
|
+
const child = g.child;
|
|
104
|
+
const i = g.index;
|
|
105
|
+
const style = { flexGrow: node.sizes[i] ?? 1, flexShrink: 1, flexBasis: 0, minWidth: 0, minHeight: 0, display: 'flex' };
|
|
106
|
+
// Resizer to the next expanded track, spanning any collapsed tab bar in
|
|
107
|
+
// between (so a collapsed group never removes the handle between two opens).
|
|
108
|
+
const nextNode = groups.slice(gi + 1).find((x) => x.kind === 'node');
|
|
109
|
+
const key = child.type === 'split' ? child.id : `p-${child.id}`;
|
|
110
|
+
return (_jsxs(Fragment, { children: [_jsx("div", { "data-dock-pane": i, style: style, children: renderNode(child, node.dir, ctx) }), nextNode && (_jsx("div", { className: `dock-rsz ${isRow ? 'dock-rsz--col' : 'dock-rsz--row'}`, title: "Drag to resize \u00B7 double-click to even out", onMouseDown: startResize(i, nextNode.index), onDoubleClick: equalize(i, nextNode.index), children: _jsx("span", { className: "dock-rsz-line" }) }))] }, key));
|
|
111
|
+
}) }));
|
|
112
|
+
}
|
|
113
|
+
/** Collapsed sibling panels shown as ONE tab bar instead of separate rails. In a
|
|
114
|
+
* row split it's a vertical icon bar; in a col split a horizontal icon+label bar.
|
|
115
|
+
* Clicking a tab expands that panel back inline. Monochrome per the design system. */
|
|
116
|
+
function CollapsedTabBar({ items, dir, ctx }) {
|
|
117
|
+
const vertical = dir === 'row';
|
|
118
|
+
return (_jsx("div", { style: vertical ? T.barV : T.barH, children: items.map(({ child }) => {
|
|
119
|
+
if (child.type !== 'panel')
|
|
120
|
+
return null;
|
|
121
|
+
const def = ctx.panels[child.id];
|
|
122
|
+
if (!def)
|
|
123
|
+
return null;
|
|
124
|
+
return (_jsxs("button", { className: "dock-tab", "data-dock-rail": true, style: vertical ? T.tabV : T.tabH, title: `Peek ${def.label}`, "aria-label": `Peek ${def.label}`, onClick: (e) => ctx.onPeek(child.id, e.currentTarget.getBoundingClientRect()), children: [_jsx("span", { style: T.tabIcon, children: def.icon ?? def.label.charAt(0) }), !vertical && _jsx("span", { style: T.tabLabel, children: def.label })] }, child.id));
|
|
125
|
+
}) }));
|
|
126
|
+
}
|
|
127
|
+
const T = {
|
|
128
|
+
barV: { display: 'flex', flexDirection: 'column', alignItems: 'stretch', gap: 2, width: 40, flex: '0 0 auto', height: '100%', padding: '6px 4px', borderLeft: '1px solid var(--border-subtle)', background: 'var(--surface-rail)' },
|
|
129
|
+
barH: { display: 'flex', flexDirection: 'row', alignItems: 'center', gap: 2, height: 34, flex: '0 0 auto', padding: '0 6px', borderTop: '1px solid var(--border-subtle)', background: 'var(--surface-rail)' },
|
|
130
|
+
tabV: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', height: 32, width: '100%', border: 0, borderRadius: 'var(--radius-sm)', background: 'transparent', color: 'var(--text-tertiary)', cursor: 'pointer' },
|
|
131
|
+
tabH: { display: 'inline-flex', alignItems: 'center', gap: 6, height: 26, padding: '0 10px', border: 0, borderRadius: 'var(--radius-sm)', background: 'transparent', color: 'var(--text-tertiary)', cursor: 'pointer', font: 'inherit' },
|
|
132
|
+
tabIcon: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', fontSize: 12, fontWeight: 700 },
|
|
133
|
+
tabLabel: { fontSize: 11.5, fontWeight: 600, letterSpacing: '0.04em', textTransform: 'uppercase' },
|
|
134
|
+
};
|
|
135
|
+
function renderNode(node, parentDir, ctx) {
|
|
136
|
+
if (node.type === 'panel') {
|
|
137
|
+
return (_jsx(PanelFrame, { id: node.id, def: ctx.panels[node.id], dir: parentDir, collapsed: Boolean(node.collapsed), dragId: ctx.dragId, onDragStart: ctx.setDragId, onDragEnd: () => ctx.setDragId(null), onDrop: (targetId, edge) => { if (ctx.dragId)
|
|
138
|
+
ctx.dock.move(ctx.dragId, targetId, edge); ctx.setDragId(null); }, onCollapse: ctx.dock.collapse, onClose: ctx.dock.close, onMaximize: ctx.onMaximize, onPeek: ctx.onPeek }));
|
|
139
|
+
}
|
|
140
|
+
return _jsx(SplitView, { node: node, ctx: ctx });
|
|
141
|
+
}
|
|
142
|
+
/** Nearest surface edge to the clicked rail — so the overlay slides in from the
|
|
143
|
+
* side the panel actually lives on (right-edge rail → slides from the right). */
|
|
144
|
+
function nearestEdge(origin, host) {
|
|
145
|
+
const cx = origin.left + origin.width / 2;
|
|
146
|
+
const cy = origin.top + origin.height / 2;
|
|
147
|
+
const d = {
|
|
148
|
+
left: Math.abs(cx - host.left),
|
|
149
|
+
right: Math.abs(host.right - cx),
|
|
150
|
+
top: Math.abs(cy - host.top),
|
|
151
|
+
bottom: Math.abs(host.bottom - cy),
|
|
152
|
+
};
|
|
153
|
+
return Object.keys(d).reduce((a, b) => (d[b] < d[a] ? b : a), 'right');
|
|
154
|
+
}
|
|
155
|
+
/** Whether a panel currently sits as a collapsed rail (the only state a peek is
|
|
156
|
+
* valid for — once pinned or closed the overlay must clear). */
|
|
157
|
+
function isCollapsedRail(node, id) {
|
|
158
|
+
if (node.type === 'panel')
|
|
159
|
+
return node.id === id && Boolean(node.collapsed);
|
|
160
|
+
return node.children.some((c) => isCollapsedRail(c, id));
|
|
161
|
+
}
|
|
162
|
+
const isHorizontalEdge = (e) => e === 'left' || e === 'right';
|
|
163
|
+
const defaultOverlaySize = (e) => (isHorizontalEdge(e) ? 380 : 300);
|
|
164
|
+
// Lifetime of the slide-out copy: must be >= the CSS transform transition
|
|
165
|
+
// (--motion-base, 200ms) so the exiting overlay is unmounted only AFTER it has
|
|
166
|
+
// finished sliding off. Kept slightly longer as a deliberate buffer.
|
|
167
|
+
const OVERLAY_ANIM_MS = 240;
|
|
168
|
+
/**
|
|
169
|
+
* One peek overlay: a floating, resizable PanelFrame anchored to a surface edge.
|
|
170
|
+
* It animates by mounting in the closed (off-edge) position and flipping to the
|
|
171
|
+
* target on the next frame — so an incoming peek slides IN and an outgoing one
|
|
172
|
+
* (target=false) slides OUT, letting a switch animate both at once.
|
|
173
|
+
*/
|
|
174
|
+
function Overlay({ peek, target, panels, sizePx, onResize, onPin, onHide, onMaximize }) {
|
|
175
|
+
const { id, edge } = peek;
|
|
176
|
+
const [open, setOpen] = useState(false);
|
|
177
|
+
useEffect(() => {
|
|
178
|
+
const r = requestAnimationFrame(() => setOpen(target));
|
|
179
|
+
return () => cancelAnimationFrame(r);
|
|
180
|
+
}, [target]);
|
|
181
|
+
const horizontal = isHorizontalEdge(edge);
|
|
182
|
+
const startResize = (e) => {
|
|
183
|
+
e.preventDefault();
|
|
184
|
+
const startX = e.clientX;
|
|
185
|
+
const startY = e.clientY;
|
|
186
|
+
const start = sizePx;
|
|
187
|
+
const onMove = (ev) => {
|
|
188
|
+
// The handle sits on the overlay's INNER edge; dragging inward shrinks it.
|
|
189
|
+
const delta = edge === 'right' ? startX - ev.clientX
|
|
190
|
+
: edge === 'left' ? ev.clientX - startX
|
|
191
|
+
: edge === 'bottom' ? startY - ev.clientY
|
|
192
|
+
: ev.clientY - startY;
|
|
193
|
+
onResize(start + delta);
|
|
194
|
+
};
|
|
195
|
+
const onUp = () => {
|
|
196
|
+
window.removeEventListener('mousemove', onMove);
|
|
197
|
+
window.removeEventListener('mouseup', onUp);
|
|
198
|
+
document.body.style.cursor = '';
|
|
199
|
+
document.body.style.userSelect = '';
|
|
200
|
+
};
|
|
201
|
+
document.body.style.cursor = horizontal ? 'col-resize' : 'row-resize';
|
|
202
|
+
document.body.style.userSelect = 'none';
|
|
203
|
+
window.addEventListener('mousemove', onMove);
|
|
204
|
+
window.addEventListener('mouseup', onUp);
|
|
205
|
+
};
|
|
206
|
+
if (!panels[id])
|
|
207
|
+
return null;
|
|
208
|
+
const closed = `translate${horizontal ? 'X' : 'Y'}(${edge === 'left' || edge === 'top' ? '-100%' : '100%'})`;
|
|
209
|
+
const pos = edge === 'left' ? { top: 0, bottom: 0, left: 0, width: sizePx }
|
|
210
|
+
: edge === 'right' ? { top: 0, bottom: 0, right: 0, width: sizePx }
|
|
211
|
+
: edge === 'top' ? { top: 0, left: 0, right: 0, height: sizePx }
|
|
212
|
+
: { bottom: 0, left: 0, right: 0, height: sizePx };
|
|
213
|
+
return (_jsxs("div", { "data-dock-overlay": true, style: {
|
|
214
|
+
position: 'absolute', ...pos, zIndex: 40, display: 'flex',
|
|
215
|
+
background: 'var(--surface-1)', boxShadow: 'var(--shadow-4)',
|
|
216
|
+
border: '1px solid var(--border-default)', borderRadius: 'var(--radius-md)', overflow: 'hidden',
|
|
217
|
+
transform: open ? 'translate(0,0)' : closed,
|
|
218
|
+
transition: 'transform var(--motion-base)',
|
|
219
|
+
}, children: [_jsx("div", { style: { flex: 1, display: 'flex', minWidth: 0, minHeight: 0 }, children: _jsx(PanelFrame, { id: id, def: panels[id], dir: horizontal ? 'row' : 'col', collapsed: false, dragId: null, onDragStart: () => { }, onDragEnd: () => { }, onDrop: () => { }, onCollapse: () => { }, overlay: true, onPin: onPin, onHidePeek: onHide, onMaximize: () => onMaximize(id) }) }), _jsx("div", { className: "dock-overlay-rsz", onMouseDown: startResize, title: "Drag to resize", style: {
|
|
220
|
+
position: 'absolute', cursor: horizontal ? 'col-resize' : 'row-resize', zIndex: 1,
|
|
221
|
+
...(edge === 'left' ? { top: 0, bottom: 0, right: 0, width: 6 }
|
|
222
|
+
: edge === 'right' ? { top: 0, bottom: 0, left: 0, width: 6 }
|
|
223
|
+
: edge === 'top' ? { left: 0, right: 0, bottom: 0, height: 6 }
|
|
224
|
+
: { left: 0, right: 0, top: 0, height: 6 }),
|
|
225
|
+
} })] }));
|
|
226
|
+
}
|
|
227
|
+
/** Root of a dockable surface: renders the persisted split tree and owns the
|
|
228
|
+
* transient drag id, maximized panel, and peek overlay (none persisted; only an
|
|
229
|
+
* overlay's resized extent persists, via the dock api). */
|
|
230
|
+
export function PanelHost({ panels, dock }) {
|
|
231
|
+
const [dragId, setDragId] = useState(null);
|
|
232
|
+
const [maximized, setMaximized] = useState(null);
|
|
233
|
+
// The visible peek and, briefly, the one sliding out as it's replaced/closed —
|
|
234
|
+
// so a switch animates both at once (one transient at a time, per the model).
|
|
235
|
+
const [peek, setPeek] = useState(null);
|
|
236
|
+
const [exiting, setExiting] = useState(null);
|
|
237
|
+
const hostRef = useRef(null);
|
|
238
|
+
const exitTimer = useRef(null);
|
|
239
|
+
const scheduleClearExit = useCallback((p) => {
|
|
240
|
+
if (exitTimer.current)
|
|
241
|
+
window.clearTimeout(exitTimer.current);
|
|
242
|
+
setExiting(p);
|
|
243
|
+
if (p)
|
|
244
|
+
exitTimer.current = window.setTimeout(() => setExiting(null), OVERLAY_ANIM_MS);
|
|
245
|
+
}, []);
|
|
246
|
+
// Drop both overlays immediately, no slide-out — used when the panel has left
|
|
247
|
+
// rail state (pinned/closed) and a lingering exit copy would double-mount it.
|
|
248
|
+
const clearPeekNow = useCallback(() => {
|
|
249
|
+
if (exitTimer.current)
|
|
250
|
+
window.clearTimeout(exitTimer.current);
|
|
251
|
+
setExiting(null);
|
|
252
|
+
setPeek(null);
|
|
253
|
+
}, []);
|
|
254
|
+
// Cancel any pending exit timer on unmount so it can't fire into a dead surface.
|
|
255
|
+
useEffect(() => () => { if (exitTimer.current)
|
|
256
|
+
window.clearTimeout(exitTimer.current); }, []);
|
|
257
|
+
const closePeek = useCallback(() => {
|
|
258
|
+
setPeek((cur) => { if (cur)
|
|
259
|
+
scheduleClearExit(cur); return null; });
|
|
260
|
+
}, [scheduleClearExit]);
|
|
261
|
+
const onPeek = useCallback((id, origin) => {
|
|
262
|
+
const host = hostRef.current?.getBoundingClientRect();
|
|
263
|
+
const edge = host ? nearestEdge(origin, host) : 'right';
|
|
264
|
+
setPeek((cur) => {
|
|
265
|
+
if (cur?.id === id) {
|
|
266
|
+
scheduleClearExit(cur);
|
|
267
|
+
return null;
|
|
268
|
+
} // tapping the same rail toggles it off
|
|
269
|
+
// A different rail replaces the current peek; slide the old one out only when
|
|
270
|
+
// it lives on another edge (same-edge swaps just exchange content in place).
|
|
271
|
+
scheduleClearExit(cur && cur.edge !== edge ? cur : null);
|
|
272
|
+
return { id, edge };
|
|
273
|
+
});
|
|
274
|
+
}, [scheduleClearExit]);
|
|
275
|
+
const pin = useCallback((id) => {
|
|
276
|
+
setPeek(null);
|
|
277
|
+
scheduleClearExit(null);
|
|
278
|
+
dock.collapse(id, false); // dock inline — the panel now lives in the tree, stationary
|
|
279
|
+
}, [dock, scheduleClearExit]);
|
|
280
|
+
// Maximizing from a peek promotes it out of the overlay layer entirely.
|
|
281
|
+
const maximizeFromPeek = useCallback((id) => {
|
|
282
|
+
setPeek(null);
|
|
283
|
+
scheduleClearExit(null);
|
|
284
|
+
setMaximized(id);
|
|
285
|
+
}, [scheduleClearExit]);
|
|
286
|
+
// Esc closes a peek (and, separately, restores a maximized panel).
|
|
287
|
+
useEffect(() => {
|
|
288
|
+
if (!maximized && !peek)
|
|
289
|
+
return;
|
|
290
|
+
const onKey = (e) => {
|
|
291
|
+
if (e.key !== 'Escape')
|
|
292
|
+
return;
|
|
293
|
+
if (peek)
|
|
294
|
+
closePeek();
|
|
295
|
+
else
|
|
296
|
+
setMaximized(null);
|
|
297
|
+
};
|
|
298
|
+
window.addEventListener('keydown', onKey);
|
|
299
|
+
return () => window.removeEventListener('keydown', onKey);
|
|
300
|
+
}, [maximized, peek, closePeek]);
|
|
301
|
+
// Click-away dismiss: any mousedown outside the overlay closes it. Clicks on a
|
|
302
|
+
// rail are excluded — onPeek already owns that transition (old out, new in).
|
|
303
|
+
// A context menu is excluded too: it's a <body> portal (outside the overlay)
|
|
304
|
+
// but OWNED by a panel inside it, so closing the peek on mousedown would unmount
|
|
305
|
+
// the menu before its click fired — e.g. "New file/folder" would be lost.
|
|
306
|
+
useEffect(() => {
|
|
307
|
+
if (!peek)
|
|
308
|
+
return;
|
|
309
|
+
const onDown = (e) => {
|
|
310
|
+
const t = e.target;
|
|
311
|
+
if (t.closest('[data-dock-overlay]') || t.closest('[data-dock-rail]') || t.closest('[data-context-menu]'))
|
|
312
|
+
return;
|
|
313
|
+
closePeek();
|
|
314
|
+
};
|
|
315
|
+
window.addEventListener('mousedown', onDown);
|
|
316
|
+
return () => window.removeEventListener('mousedown', onDown);
|
|
317
|
+
}, [peek, closePeek]);
|
|
318
|
+
// A peek is only valid while its panel is a collapsed rail. If it gets pinned,
|
|
319
|
+
// closed, or the layout is swapped out from under it, drop the overlay outright
|
|
320
|
+
// (no slide-out) — the panel may now be mounted inline, so an exit copy would
|
|
321
|
+
// briefly double-mount the same body.
|
|
322
|
+
useEffect(() => {
|
|
323
|
+
if (peek && !isCollapsedRail(dock.tree, peek.id))
|
|
324
|
+
clearPeekNow();
|
|
325
|
+
}, [dock.tree, peek, clearPeekNow]);
|
|
326
|
+
const ctx = { panels, dock, dragId, setDragId, onMaximize: setMaximized, onPeek };
|
|
327
|
+
const maxId = maximized && panels[maximized] ? maximized : null;
|
|
328
|
+
const sizeFor = (p) => dock.overlaySizes[p.id] ?? defaultOverlaySize(p.edge);
|
|
329
|
+
return (_jsxs("div", { ref: hostRef, style: { position: 'relative', display: 'flex', flex: 1, minHeight: 0, minWidth: 0, background: 'var(--surface-canvas)', overflow: 'hidden' }, children: [maxId ? (_jsx(PanelFrame, { id: maxId, def: panels[maxId], dir: "col", collapsed: false, dragId: null, onDragStart: () => { }, onDragEnd: () => { }, onDrop: () => { }, onCollapse: () => { }, maximized: true, onMaximize: setMaximized })) : (renderNode(dock.tree, 'col', ctx)), !maxId && exiting && (_jsx(Overlay, { peek: exiting, target: false, panels: panels, sizePx: sizeFor(exiting), onResize: () => { }, onPin: pin, onHide: closePeek, onMaximize: maximizeFromPeek }, `x-${exiting.edge}`)), !maxId && peek && (_jsx(Overlay, { peek: peek, target: true, panels: panels, sizePx: sizeFor(peek), onResize: (px) => dock.setOverlaySize(peek.id, px), onPin: pin, onHide: closePeek, onMaximize: maximizeFromPeek }, `p-${peek.edge}`))] }));
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=PanelHost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PanelHost.js","sourceRoot":"","sources":["../../dock/PanelHost.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { LayoutNode, PanelId } from './types';
|
|
3
|
+
/** One dockable panel: chrome (label/title/icon) + the body rendered into the
|
|
4
|
+
* pane. The body is a thunk so the surface owner (EditorApp) closes over its
|
|
5
|
+
* state; panels stay decoupled from where they live in the tree. */
|
|
6
|
+
export interface PanelDef {
|
|
7
|
+
id: PanelId;
|
|
8
|
+
/** Plain text for the collapsed rail + drag label. */
|
|
9
|
+
label: string;
|
|
10
|
+
/** Header content (may include a live count/status). Defaults to `label`. */
|
|
11
|
+
title?: ReactNode;
|
|
12
|
+
/** Small monochrome icon for the header + collapsed rail. */
|
|
13
|
+
icon?: ReactNode;
|
|
14
|
+
/** Optional controls rendered on the right of the header (e.g. the editor's
|
|
15
|
+
* Design/Code/Preview switcher), so a panel needs no second toolbar bar. */
|
|
16
|
+
actions?: ReactNode;
|
|
17
|
+
/** Section this panel lists under in the panel chooser (e.g. "Editor",
|
|
18
|
+
* "Run"). Uncategorized panels collect in a trailing "Other" section. */
|
|
19
|
+
category?: string;
|
|
20
|
+
/** The panel body. */
|
|
21
|
+
render: () => ReactNode;
|
|
22
|
+
}
|
|
23
|
+
/** A dock surface's configuration: which panels exist, how to validate/seed the
|
|
24
|
+
* persisted tree, and where it's stored. */
|
|
25
|
+
export interface DockConfig {
|
|
26
|
+
panels: Record<PanelId, PanelDef>;
|
|
27
|
+
/** Valid panel ids — a persisted layout must hold a duplicate-free subset
|
|
28
|
+
* (panels can be closed; unknown ids invalidate the tree — see isValidLayout). */
|
|
29
|
+
ids: readonly PanelId[];
|
|
30
|
+
/** localStorage key for this surface's layout. */
|
|
31
|
+
storageKey: string;
|
|
32
|
+
/** Starting arrangement when nothing valid is persisted. */
|
|
33
|
+
makeDefault: () => LayoutNode;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../dock/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEnD;;oEAEoE;AACpE,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;gFAC4E;IAC5E,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;6EACyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,MAAM,EAAE,MAAM,SAAS,CAAC;CACzB;AAED;4CAC4C;AAC5C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClC;sFACkF;IAClF,GAAG,EAAE,SAAS,OAAO,EAAE,CAAC;IACxB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,UAAU,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../dock/config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './config';
|
|
3
|
+
export { PRESET_NAMES, PRESET_LABELS, PRESETS, defaultLayout, editorPreset, chatPreset, balancedPreset, movePanel, setCollapsed, setSizes, collectPanels, isPanelVisible, isValidLayout, type PresetName, } from './tree';
|
|
4
|
+
export { useDockLayout, type DockApi, type DockLayoutConfig } from './use-layout';
|
|
5
|
+
export { PanelHost } from './PanelHost';
|
|
6
|
+
export { PanelFrame } from './PanelFrame';
|
|
7
|
+
export { PanelChooser } from './PanelChooser';
|
|
8
|
+
export { listLayouts, saveLayout, getLayout, deleteLayout, type SavedLayout } from './layouts';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../dock/index.ts"],"names":[],"mappings":"AAIA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EACnD,YAAY,EAAE,UAAU,EAAE,cAAc,EACxC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAC/E,KAAK,UAAU,GAChB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/* Dockable panel system (ported from the Marshal web dock, adapted for
|
|
2
|
+
* prompd-web). Recursive split tree, single-panel leaves, drag-to-dock, resize,
|
|
3
|
+
* collapse, maximize, one-tap presets. Pure tree ops in `tree.ts`; one registry
|
|
4
|
+
* feeds both this desktop host and the mobile bottom-nav. */
|
|
5
|
+
export * from './types';
|
|
6
|
+
export * from './config';
|
|
7
|
+
export { PRESET_NAMES, PRESET_LABELS, PRESETS, defaultLayout, editorPreset, chatPreset, balancedPreset, movePanel, setCollapsed, setSizes, collectPanels, isPanelVisible, isValidLayout, } from './tree';
|
|
8
|
+
export { useDockLayout } from './use-layout';
|
|
9
|
+
export { PanelHost } from './PanelHost';
|
|
10
|
+
export { PanelFrame } from './PanelFrame';
|
|
11
|
+
export { PanelChooser } from './PanelChooser';
|
|
12
|
+
export { listLayouts, saveLayout, getLayout, deleteLayout } from './layouts';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../dock/index.ts"],"names":[],"mappings":"AAAA;;;6DAG6D;AAC7D,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,OAAO,EACL,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EACnD,YAAY,EAAE,UAAU,EAAE,cAAc,EACxC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,GAEhF,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,aAAa,EAAuC,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAoB,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type LayoutNode, type PanelId } from './types';
|
|
2
|
+
export interface SavedLayout {
|
|
3
|
+
name: string;
|
|
4
|
+
tree: LayoutNode;
|
|
5
|
+
overlaySizes?: Record<PanelId, number>;
|
|
6
|
+
}
|
|
7
|
+
export declare function listLayouts(): SavedLayout[];
|
|
8
|
+
/** Upsert a layout by name, capturing its tree and overlay extents. */
|
|
9
|
+
export declare function saveLayout(name: string, tree: LayoutNode, overlaySizes?: Record<PanelId, number>): void;
|
|
10
|
+
export declare function getLayout(name: string): SavedLayout | null;
|
|
11
|
+
export declare function deleteLayout(name: string): void;
|
|
12
|
+
//# sourceMappingURL=layouts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layouts.d.ts","sourceRoot":"","sources":["../../dock/layouts.ts"],"names":[],"mappings":"AAIA,OAAO,EAAwB,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAI9E,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;CAAE;AASvG,wBAAgB,WAAW,IAAI,WAAW,EAAE,CAY3C;AAMD,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,CAMvG;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAE1D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/* Saved custom dock layouts (localStorage). Named snapshots of the panel tree
|
|
2
|
+
* the user can save and load from Settings. A snapshot also carries each panel's
|
|
3
|
+
* peek-overlay extent, so loading a layout restores how wide its overlays were. */
|
|
4
|
+
import { isValidLayout } from './tree';
|
|
5
|
+
import { sanitizeOverlaySizes } from './types';
|
|
6
|
+
const LS = 'prompd.web.layouts.v1';
|
|
7
|
+
/** As the shared sanitizer, but collapse an empty map to undefined so a layout
|
|
8
|
+
* with no resized overlays stores nothing extra. */
|
|
9
|
+
function overlaySizesOrUndefined(value) {
|
|
10
|
+
const out = sanitizeOverlaySizes(value);
|
|
11
|
+
return Object.keys(out).length ? out : undefined;
|
|
12
|
+
}
|
|
13
|
+
export function listLayouts() {
|
|
14
|
+
try {
|
|
15
|
+
const raw = localStorage.getItem(LS);
|
|
16
|
+
if (!raw)
|
|
17
|
+
return [];
|
|
18
|
+
const parsed = JSON.parse(raw);
|
|
19
|
+
if (!Array.isArray(parsed))
|
|
20
|
+
return [];
|
|
21
|
+
return parsed
|
|
22
|
+
.filter((l) => l && typeof l.name === 'string' && isValidLayout(l.tree))
|
|
23
|
+
.map((l) => ({ name: l.name, tree: l.tree, overlaySizes: overlaySizesOrUndefined(l.overlaySizes) }));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function write(list) {
|
|
30
|
+
try {
|
|
31
|
+
localStorage.setItem(LS, JSON.stringify(list));
|
|
32
|
+
}
|
|
33
|
+
catch { /* ignore quota */ }
|
|
34
|
+
}
|
|
35
|
+
/** Upsert a layout by name, capturing its tree and overlay extents. */
|
|
36
|
+
export function saveLayout(name, tree, overlaySizes) {
|
|
37
|
+
const trimmed = name.trim();
|
|
38
|
+
if (!trimmed)
|
|
39
|
+
return;
|
|
40
|
+
const list = listLayouts().filter((l) => l.name !== trimmed);
|
|
41
|
+
list.push({ name: trimmed, tree, overlaySizes: overlaySizesOrUndefined(overlaySizes) });
|
|
42
|
+
write(list);
|
|
43
|
+
}
|
|
44
|
+
export function getLayout(name) {
|
|
45
|
+
return listLayouts().find((l) => l.name === name) ?? null;
|
|
46
|
+
}
|
|
47
|
+
export function deleteLayout(name) {
|
|
48
|
+
write(listLayouts().filter((l) => l.name !== name));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=layouts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layouts.js","sourceRoot":"","sources":["../../dock/layouts.ts"],"names":[],"mappings":"AAAA;;mFAEmF;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAiC,MAAM,SAAS,CAAC;AAE9E,MAAM,EAAE,GAAG,uBAAuB,CAAC;AAInC;oDACoD;AACpD,SAAS,uBAAuB,CAAC,KAAc;IAC7C,MAAM,GAAG,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aACvE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE,IAAI,EAAE,CAAC,CAAC,IAAkB,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IACjI,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,IAAmB;IAChC,IAAI,CAAC;QAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;AACtF,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,IAAgB,EAAE,YAAsC;IAC/F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAC7D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,uBAAuB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { type DropEdge, type LayoutNode, type PanelId, type PanelNode, type SplitNode } from './types';
|
|
2
|
+
export declare const PRESET_NAMES: readonly ["editor", "chat", "balanced"];
|
|
3
|
+
export type PresetName = (typeof PRESET_NAMES)[number];
|
|
4
|
+
export declare const PRESET_LABELS: Record<PresetName, string>;
|
|
5
|
+
/** Editor-focused: editor large in the center, params/result on the right, the
|
|
6
|
+
* agent + file/package surfaces as collapsed rails. The factory default. */
|
|
7
|
+
export declare function editorPreset(): SplitNode;
|
|
8
|
+
/** Chat-focused (brainstorm mode): the agent fills the surface; the editor and the
|
|
9
|
+
* rest collapse to rails on the left, one click away. */
|
|
10
|
+
export declare function chatPreset(): SplitNode;
|
|
11
|
+
/** Balanced: editor and agent side by side, params/result tucked to the right,
|
|
12
|
+
* file/package rails on the left. */
|
|
13
|
+
export declare function balancedPreset(): SplitNode;
|
|
14
|
+
export declare const PRESETS: Record<PresetName, () => SplitNode>;
|
|
15
|
+
export declare function defaultLayout(): SplitNode;
|
|
16
|
+
/** Every panel id present in the tree, in left-to-right / top-to-bottom order. */
|
|
17
|
+
export declare function collectPanels(node: LayoutNode, acc?: PanelId[]): PanelId[];
|
|
18
|
+
/** Whether a panel is showing its content right now: present in the tree AND not
|
|
19
|
+
* collapsed (a collapsed panel renders only as a rail, so it isn't "visible"). */
|
|
20
|
+
export declare function isPanelVisible(node: LayoutNode, id: PanelId): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Whether a node contributes NO expanded content: a collapsed panel, a childless
|
|
23
|
+
* split, or a split whose every descendant is itself inert. The renderer must not
|
|
24
|
+
* give such a node a flex-growing pane — it would keep its slot while rendering
|
|
25
|
+
* only a rail (or, for an empty split, nothing at all), leaving dead space a
|
|
26
|
+
* sibling can't reclaim. Its panel leaves are gathered into the collapsed tab bar.
|
|
27
|
+
*
|
|
28
|
+
* The empty-split case (`children.length === 0`) is load-bearing: a childless
|
|
29
|
+
* split is inert. Treating it as expanded is exactly the bug that left a growing
|
|
30
|
+
* blank pane beside the editor.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isInert(node: LayoutNode): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Remove a panel from the tree. Splits left with a single child are lifted (that
|
|
35
|
+
* child replaces the split, keeping the tree minimal); empty splits vanish.
|
|
36
|
+
* Returns null only if `node` itself was the removed panel.
|
|
37
|
+
*/
|
|
38
|
+
export declare function removePanel(node: LayoutNode, id: PanelId): LayoutNode | null;
|
|
39
|
+
/** Replace the target panel leaf with a 2-way split that places `p` on the given
|
|
40
|
+
* edge. (Adjacent same-direction splits are merged later by `normalize`.) */
|
|
41
|
+
export declare function insertBeside(node: LayoutNode, targetId: PanelId, p: PanelNode, edge: DropEdge): LayoutNode;
|
|
42
|
+
/**
|
|
43
|
+
* Flatten the tree: merge a split into its parent when they share a direction (so
|
|
44
|
+
* dragging never produces redundant nesting), and lift any single-child split.
|
|
45
|
+
* Child weights are scaled into the parent's slot so sizes stay sensible.
|
|
46
|
+
*/
|
|
47
|
+
export declare function normalize(node: LayoutNode): LayoutNode;
|
|
48
|
+
/** Move `dragId` to the given edge of `targetId`, returning a normalized tree.
|
|
49
|
+
* No-op if the ids match or the dragged panel isn't present. */
|
|
50
|
+
export declare function movePanel(root: LayoutNode, dragId: PanelId, targetId: PanelId, edge: DropEdge): LayoutNode;
|
|
51
|
+
/**
|
|
52
|
+
* Set the collapsed flag on a single panel, moving its flex weight to (collapse)
|
|
53
|
+
* or back from (expand) its nearest expanded sibling. Without this, collapsing a
|
|
54
|
+
* panel leaves flexbox to spread the freed space across every remaining pane by
|
|
55
|
+
* weight — so a heavy auxiliary pane (e.g. an empty result column) greedily
|
|
56
|
+
* inflates while the panel you're actually working in shrinks, reading as
|
|
57
|
+
* unrecoverable dead space. Keeping the freed space with the neighbor is local and
|
|
58
|
+
* symmetric: a collapse/expand round-trip restores the prior sizes.
|
|
59
|
+
*/
|
|
60
|
+
export declare function setCollapsed(node: LayoutNode, id: PanelId, collapsed: boolean): LayoutNode;
|
|
61
|
+
/** Replace a split's child weights (used by the resizer). */
|
|
62
|
+
export declare function setSizes(node: LayoutNode, splitId: string, sizes: number[]): LayoutNode;
|
|
63
|
+
/** Close a panel (remove it from the tree). Splits collapse via removePanel.
|
|
64
|
+
* Returns the tree unchanged if it would empty the surface (never close the last). */
|
|
65
|
+
export declare function closePanel(root: LayoutNode, id: PanelId): LayoutNode;
|
|
66
|
+
/** Dock a panel against an edge of the whole surface (top/right/bottom/left).
|
|
67
|
+
* Removes it first if already present, so this also re-docks an open panel. */
|
|
68
|
+
export declare function addPanelAtEdge(root: LayoutNode, id: PanelId, edge: DropEdge): LayoutNode;
|
|
69
|
+
/** A persisted tree is trusted if it holds a non-empty, duplicate-free SUBSET of
|
|
70
|
+
* `expected`'s panels (panels can be closed, so not all need be present). `isNode`
|
|
71
|
+
* already rejects unknown ids. Otherwise fall back to the default. */
|
|
72
|
+
export declare function isValidLayout(node: unknown, expected?: readonly PanelId[]): node is LayoutNode;
|
|
73
|
+
//# sourceMappingURL=tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../dock/tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAiB,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAiBnJ,eAAO,MAAM,YAAY,yCAA0C,CAAC;AACpE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAIpD,CAAC;AAUF;4EAC4E;AAC5E,wBAAgB,YAAY,IAAI,SAAS,CAQxC;AAED;yDACyD;AACzD,wBAAgB,UAAU,IAAI,SAAS,CAWtC;AAED;qCACqC;AACrC,wBAAgB,cAAc,IAAI,SAAS,CAO1C;AAED,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,SAAS,CAIvD,CAAC;AAEF,wBAAgB,aAAa,IAAI,SAAS,CAEzC;AAID,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,GAAE,OAAO,EAAO,GAAG,OAAO,EAAE,CAI9E;AAED;kFACkF;AAClF,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,GAAG,OAAO,CAGrE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAIjD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAc5E;AAQD;6EAC6E;AAC7E,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,CAG1G;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CA0BtD;AAED;gEACgE;AAChE,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,CAO1G;AAcD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,UAAU,CAgB1F;AAED,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAIvF;AAED;sFACsF;AACtF,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,GAAG,UAAU,CAGpE;AAED;+EAC+E;AAC/E,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,CAWxF;AAED;;sEAEsE;AACtE,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,GAAE,SAAS,OAAO,EAAqB,GAAG,IAAI,IAAI,UAAU,CAKhH"}
|