@gustavolmo/react-window-manager 0.3.1 → 0.4.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/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.js +1297 -739
- package/dist/index.js.map +1 -1
- package/dist/window-manager/internal/features/cursor/cursor-move-listener.d.ts.map +1 -1
- package/dist/window-manager/internal/features/cursor/cursor-state.d.ts +1 -2
- package/dist/window-manager/internal/features/cursor/cursor-state.d.ts.map +1 -1
- package/dist/window-manager/internal/features/docking/docking-api.d.ts +0 -2
- package/dist/window-manager/internal/features/docking/docking-api.d.ts.map +1 -1
- package/dist/window-manager/internal/features/docking/docking-controls.d.ts +1 -1
- package/dist/window-manager/internal/features/docking/docking-controls.d.ts.map +1 -1
- package/dist/window-manager/internal/features/drag/drag-api.d.ts +5 -0
- package/dist/window-manager/internal/features/drag/drag-api.d.ts.map +1 -0
- package/dist/window-manager/internal/features/drag/drag-handle.d.ts.map +1 -1
- package/dist/window-manager/internal/features/focus/focus-api.d.ts +5 -0
- package/dist/window-manager/internal/features/focus/focus-api.d.ts.map +1 -0
- package/dist/window-manager/internal/features/grid/grid-orchestrator.d.ts +4 -0
- package/dist/window-manager/internal/features/grid/grid-orchestrator.d.ts.map +1 -0
- package/dist/window-manager/internal/features/resizing/resizing-api.d.ts +3 -4
- package/dist/window-manager/internal/features/resizing/resizing-api.d.ts.map +1 -1
- package/dist/window-manager/internal/features/resizing/resizing-controls.d.ts.map +1 -1
- package/dist/window-manager/internal/features/stack/stack-api.d.ts +0 -2
- package/dist/window-manager/internal/features/stack/stack-api.d.ts.map +1 -1
- package/dist/window-manager/internal/features/window-button.d.ts +5 -3
- package/dist/window-manager/internal/features/window-button.d.ts.map +1 -1
- package/dist/window-manager/internal/features/window-layout.d.ts +25 -3
- package/dist/window-manager/internal/features/window-layout.d.ts.map +1 -1
- package/dist/window-manager/internal/features/workspace/workspace-api.d.ts +15 -3
- package/dist/window-manager/internal/features/workspace/workspace-api.d.ts.map +1 -1
- package/dist/window-manager/internal/features/workspace/workspace-resize-listener.d.ts +2 -0
- package/dist/window-manager/internal/features/workspace/workspace-resize-listener.d.ts.map +1 -0
- package/dist/window-manager/internal/features/workspace/workspace-state.d.ts.map +1 -1
- package/dist/window-manager/internal/runtime/dock-resolver/dock-commands.d.ts +10 -0
- package/dist/window-manager/internal/runtime/dock-resolver/dock-commands.d.ts.map +1 -0
- package/dist/window-manager/internal/runtime/drag-resolver/drag-commands.d.ts +7 -0
- package/dist/window-manager/internal/runtime/drag-resolver/drag-commands.d.ts.map +1 -0
- package/dist/window-manager/internal/runtime/drag-resolver/drag-loop.d.ts +6 -0
- package/dist/window-manager/internal/runtime/drag-resolver/drag-loop.d.ts.map +1 -0
- package/dist/window-manager/internal/runtime/focus-resolver/focus-commands.d.ts +6 -0
- package/dist/window-manager/internal/runtime/focus-resolver/focus-commands.d.ts.map +1 -0
- package/dist/window-manager/internal/runtime/resize-resolver/resize-commands.d.ts +7 -0
- package/dist/window-manager/internal/runtime/resize-resolver/resize-commands.d.ts.map +1 -0
- package/dist/window-manager/internal/runtime/resize-resolver/resize-loop.d.ts +6 -0
- package/dist/window-manager/internal/runtime/resize-resolver/resize-loop.d.ts.map +1 -0
- package/dist/window-manager/internal/runtime/rwm-runtime.d.ts +67 -0
- package/dist/window-manager/internal/runtime/rwm-runtime.d.ts.map +1 -0
- package/dist/window-manager/internal/runtime/stack-resolver/stack-commands.d.ts +6 -0
- package/dist/window-manager/internal/runtime/stack-resolver/stack-commands.d.ts.map +1 -0
- package/dist/window-manager/internal/runtime/workspace-resolver/workspace-commands.d.ts +12 -0
- package/dist/window-manager/internal/runtime/workspace-resolver/workspace-commands.d.ts.map +1 -0
- package/dist/window-manager/model/window-types.d.ts +14 -22
- package/dist/window-manager/model/window-types.d.ts.map +1 -1
- package/dist/window-manager/model/workspace-types.d.ts +18 -6
- package/dist/window-manager/model/workspace-types.d.ts.map +1 -1
- package/dist/window-manager/registration/window-registry.d.ts +3 -0
- package/dist/window-manager/registration/window-registry.d.ts.map +1 -0
- package/dist/window-manager/registration/window-store-factory.d.ts +1 -4
- package/dist/window-manager/registration/window-store-factory.d.ts.map +1 -1
- package/dist/window-manager/rwm.d.ts +25 -10
- package/dist/window-manager/rwm.d.ts.map +1 -1
- package/dist/window-manager/workspace-layout.d.ts +1 -13
- package/dist/window-manager/workspace-layout.d.ts.map +1 -1
- package/package.json +5 -4
- package/dist/window-manager/internal/features/grid/grid-api.d.ts +0 -4
- package/dist/window-manager/internal/features/grid/grid-api.d.ts.map +0 -1
- package/dist/window-manager/internal/features/view-port/view-port-resize-listener.d.ts +0 -2
- package/dist/window-manager/internal/features/view-port/view-port-resize-listener.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,104 +1,357 @@
|
|
|
1
|
-
// src/window-manager/registration/window-
|
|
2
|
-
|
|
1
|
+
// src/window-manager/registration/window-registry.ts
|
|
2
|
+
var windowRegistry = {};
|
|
3
3
|
|
|
4
|
-
// src/window-manager/internal/features/
|
|
5
|
-
import {
|
|
4
|
+
// src/window-manager/internal/features/workspace/workspace-state.ts
|
|
5
|
+
import { create } from "zustand";
|
|
6
|
+
var useWorkspaceState = create((set, get) => ({
|
|
7
|
+
wsElement: null,
|
|
8
|
+
setWsElement: (el) => set({ wsElement: el }),
|
|
9
|
+
isGridEnabled: true,
|
|
10
|
+
isDockPannelEnabled: true,
|
|
11
|
+
responsiveBreak: "sm",
|
|
12
|
+
isBelowBreakPoint: false,
|
|
13
|
+
activeWindowId: "react-dynamic-window-instance0",
|
|
14
|
+
wsRect: {
|
|
15
|
+
top: 0,
|
|
16
|
+
left: 0,
|
|
17
|
+
innerHeight: 0,
|
|
18
|
+
innerWidth: 0,
|
|
19
|
+
bottom: 0,
|
|
20
|
+
right: 0,
|
|
21
|
+
centerX: 0,
|
|
22
|
+
centerY: 0
|
|
23
|
+
}
|
|
24
|
+
}));
|
|
6
25
|
|
|
7
|
-
// src/window-manager/internal/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
stroke: color ? color : "#cccccc",
|
|
20
|
-
color: color ? color : "#cccccc",
|
|
21
|
-
className: "size-6",
|
|
22
|
-
children: /* @__PURE__ */ jsx(
|
|
23
|
-
"path",
|
|
24
|
-
{
|
|
25
|
-
strokeLinecap: "round",
|
|
26
|
-
strokeLinejoin: "round",
|
|
27
|
-
d: "M5.25 7.5A2.25 2.25 0 0 1 7.5 5.25h9a2.25 2.25 0 0 1 2.25 2.25v9a2.25 2.25 0 0 1-2.25 2.25h-9a2.25 2.25 0 0 1-2.25-2.25v-9Z"
|
|
26
|
+
// src/window-manager/internal/runtime/dock-resolver/dock-commands.ts
|
|
27
|
+
var dockCommandResolver = {
|
|
28
|
+
DOCK_WINDOW_RIGHT: (targetWinId, wsRect) => {
|
|
29
|
+
return [
|
|
30
|
+
{
|
|
31
|
+
winId: targetWinId,
|
|
32
|
+
patch: {
|
|
33
|
+
winCoord: { pointX: wsRect.centerX, pointY: wsRect.top },
|
|
34
|
+
winWidth: wsRect.innerWidth / 2,
|
|
35
|
+
winHeight: wsRect.innerHeight,
|
|
36
|
+
winVisualState: "demaximized",
|
|
37
|
+
isDragging: false
|
|
28
38
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
strokeWidth: 1.5,
|
|
43
|
-
stroke: color ? color : "#cccccc",
|
|
44
|
-
color: color ? color : "#cccccc",
|
|
45
|
-
className: "size-6",
|
|
46
|
-
children: /* @__PURE__ */ jsx(
|
|
47
|
-
"path",
|
|
48
|
-
{
|
|
49
|
-
strokeLinecap: "round",
|
|
50
|
-
strokeLinejoin: "round",
|
|
51
|
-
d: "M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6"
|
|
39
|
+
}
|
|
40
|
+
];
|
|
41
|
+
},
|
|
42
|
+
DOCK_WINDOW_LEFT: (targetWinId, wsRect) => {
|
|
43
|
+
return [
|
|
44
|
+
{
|
|
45
|
+
winId: targetWinId,
|
|
46
|
+
patch: {
|
|
47
|
+
winCoord: { pointX: wsRect.left, pointY: wsRect.top },
|
|
48
|
+
winWidth: wsRect.innerWidth / 2,
|
|
49
|
+
winHeight: wsRect.innerHeight,
|
|
50
|
+
winVisualState: "demaximized",
|
|
51
|
+
isDragging: false
|
|
52
52
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
53
|
+
}
|
|
54
|
+
];
|
|
55
|
+
},
|
|
56
|
+
DOCK_WINDOW_TOP: (targetWinId, wsRect) => {
|
|
57
|
+
return [
|
|
58
|
+
{
|
|
59
|
+
winId: targetWinId,
|
|
60
|
+
patch: {
|
|
61
|
+
winCoord: { pointX: wsRect.left, pointY: wsRect.top },
|
|
62
|
+
winWidth: wsRect.innerWidth,
|
|
63
|
+
winHeight: wsRect.innerHeight / 2,
|
|
64
|
+
winVisualState: "demaximized",
|
|
65
|
+
isDragging: false
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
];
|
|
69
|
+
},
|
|
70
|
+
DOCK_WINDOW_BOTTOM: (targetWinId, wsRect) => {
|
|
71
|
+
return [
|
|
72
|
+
{
|
|
73
|
+
winId: targetWinId,
|
|
74
|
+
patch: {
|
|
75
|
+
winCoord: { pointX: wsRect.left, pointY: wsRect.centerY },
|
|
76
|
+
winWidth: wsRect.innerWidth,
|
|
77
|
+
winHeight: wsRect.innerHeight / 2,
|
|
78
|
+
winVisualState: "demaximized",
|
|
79
|
+
isDragging: false
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
];
|
|
83
|
+
},
|
|
84
|
+
DOCK_WINDOW_BOTTOM_RIGHT: (targetWinId, wsRect) => {
|
|
85
|
+
return [
|
|
86
|
+
{
|
|
87
|
+
winId: targetWinId,
|
|
88
|
+
patch: {
|
|
89
|
+
winCoord: {
|
|
90
|
+
pointX: wsRect.centerX,
|
|
91
|
+
pointY: wsRect.centerY
|
|
92
|
+
},
|
|
93
|
+
winWidth: wsRect.innerWidth / 2,
|
|
94
|
+
winHeight: wsRect.innerHeight / 2,
|
|
95
|
+
winVisualState: "demaximized",
|
|
96
|
+
isDragging: false
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
];
|
|
100
|
+
},
|
|
101
|
+
DOCK_WINDOW_TOP_RIGHT: (targetWinId, wsRect) => {
|
|
102
|
+
return [
|
|
103
|
+
{
|
|
104
|
+
winId: targetWinId,
|
|
105
|
+
patch: {
|
|
106
|
+
winCoord: { pointX: wsRect.centerX, pointY: wsRect.top },
|
|
107
|
+
winWidth: wsRect.innerWidth / 2,
|
|
108
|
+
winHeight: wsRect.innerHeight / 2,
|
|
109
|
+
winVisualState: "demaximized",
|
|
110
|
+
isDragging: false
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
];
|
|
114
|
+
},
|
|
115
|
+
DOCK_WINDOW_BOTTOM_LEFT: (targetWinId, wsRect) => {
|
|
116
|
+
return [
|
|
117
|
+
{
|
|
118
|
+
winId: targetWinId,
|
|
119
|
+
patch: {
|
|
120
|
+
winCoord: { pointX: wsRect.left, pointY: wsRect.centerY },
|
|
121
|
+
winWidth: wsRect.innerWidth / 2,
|
|
122
|
+
winHeight: wsRect.innerHeight / 2,
|
|
123
|
+
winVisualState: "demaximized",
|
|
124
|
+
isDragging: false
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
];
|
|
128
|
+
},
|
|
129
|
+
DOCK_WINDOW_TOP_LEFT: (targetWinId, wsRect) => {
|
|
130
|
+
return [
|
|
131
|
+
{
|
|
132
|
+
winId: targetWinId,
|
|
133
|
+
patch: {
|
|
134
|
+
winCoord: { pointX: wsRect.left, pointY: wsRect.top },
|
|
135
|
+
winWidth: wsRect.innerWidth / 2,
|
|
136
|
+
winHeight: wsRect.innerHeight / 2,
|
|
137
|
+
winVisualState: "demaximized",
|
|
138
|
+
isDragging: false
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
];
|
|
142
|
+
},
|
|
143
|
+
MAXIMIZE_WINDOW: (targetWinId, wsRect) => {
|
|
144
|
+
return [
|
|
145
|
+
{
|
|
146
|
+
winId: targetWinId,
|
|
147
|
+
patch: {
|
|
148
|
+
winCoord: { pointX: wsRect.left, pointY: wsRect.top },
|
|
149
|
+
winHeight: wsRect.innerHeight,
|
|
150
|
+
winWidth: wsRect.innerWidth,
|
|
151
|
+
winVisualState: "maximized",
|
|
152
|
+
isDragging: false
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
];
|
|
156
|
+
},
|
|
157
|
+
DEMAXIMIZE_WINDOW: (targetWinId, wsRect) => {
|
|
158
|
+
return [
|
|
159
|
+
{
|
|
160
|
+
winId: targetWinId,
|
|
161
|
+
patch: {
|
|
162
|
+
winCoord: { pointX: wsRect.left + 16, pointY: wsRect.top + 16 },
|
|
163
|
+
winWidth: wsRect.innerWidth * 0.95,
|
|
164
|
+
winHeight: wsRect.innerHeight * 0.75,
|
|
165
|
+
winVisualState: "demaximized",
|
|
166
|
+
isDragging: false
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
];
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
var getDockDependencies = () => {
|
|
173
|
+
const { wsRect } = useWorkspaceState.getState();
|
|
174
|
+
return { wsRect };
|
|
175
|
+
};
|
|
74
176
|
|
|
75
177
|
// src/window-manager/internal/features/cursor/cursor-state.ts
|
|
76
|
-
import { create } from "zustand";
|
|
77
|
-
var useCursorState =
|
|
178
|
+
import { create as create2 } from "zustand";
|
|
179
|
+
var useCursorState = create2((set) => ({
|
|
78
180
|
x: 10,
|
|
79
181
|
y: 10,
|
|
80
|
-
|
|
81
|
-
setY: (newY) => set({ y: newY })
|
|
182
|
+
setXY: (x, y) => set({ x, y })
|
|
82
183
|
}));
|
|
83
184
|
|
|
84
|
-
// src/window-manager/internal/
|
|
85
|
-
|
|
185
|
+
// src/window-manager/internal/runtime/drag-resolver/drag-loop.ts
|
|
186
|
+
var rafDragLoopResolver = {
|
|
187
|
+
LOOP_DRAG: (targetWinId, commit) => {
|
|
188
|
+
const { x, y } = useCursorState.getState();
|
|
189
|
+
const { winCoord, isDragging, windowId } = windowRegistry[targetWinId].getState();
|
|
190
|
+
if (!isDragging)
|
|
191
|
+
throw new Error(`LOOP_DRAG called with isDragging false for winId: ${windowId}`);
|
|
192
|
+
const pointerOffset = {
|
|
193
|
+
left: x - winCoord.pointX,
|
|
194
|
+
top: y - winCoord.pointY
|
|
195
|
+
};
|
|
196
|
+
requestAnimationFrame(() => dragLoop(targetWinId, pointerOffset, commit));
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
var dragLoop = (targetWinId, pointerOffset, commit) => {
|
|
200
|
+
const { winCoord, isDragging } = windowRegistry[targetWinId].getState();
|
|
201
|
+
const { wsRect } = useWorkspaceState.getState();
|
|
202
|
+
const { x, y } = useCursorState.getState();
|
|
203
|
+
if (!isDragging)
|
|
204
|
+
return;
|
|
205
|
+
let adjustedX = Math.round(x - pointerOffset.left);
|
|
206
|
+
if (x > wsRect.right || x < wsRect.left)
|
|
207
|
+
adjustedX = winCoord.pointX;
|
|
208
|
+
let adjustedY = Math.round(y - pointerOffset.top);
|
|
209
|
+
if (y > wsRect.bottom || y < wsRect.top)
|
|
210
|
+
adjustedY = winCoord.pointY;
|
|
211
|
+
if (adjustedX !== winCoord.pointX || adjustedY !== winCoord.pointY) {
|
|
212
|
+
commit([
|
|
213
|
+
{
|
|
214
|
+
winId: targetWinId,
|
|
215
|
+
patch: { winCoord: { pointX: adjustedX, pointY: adjustedY } }
|
|
216
|
+
}
|
|
217
|
+
]);
|
|
218
|
+
}
|
|
219
|
+
requestAnimationFrame(() => dragLoop(targetWinId, pointerOffset, commit));
|
|
220
|
+
};
|
|
86
221
|
|
|
87
|
-
// src/window-manager/internal/
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
222
|
+
// src/window-manager/internal/runtime/drag-resolver/drag-commands.ts
|
|
223
|
+
var dragCommandResolver = {
|
|
224
|
+
ENABLE_DRAG: (targetWinId) => {
|
|
225
|
+
const { wsRect } = useWorkspaceState.getState();
|
|
226
|
+
const { winVisualState } = windowRegistry[targetWinId].getState();
|
|
227
|
+
const patch = winVisualState === "maximized" ? {
|
|
228
|
+
winCoord: { pointX: wsRect.left + 16, pointY: wsRect.top + 4 },
|
|
229
|
+
winWidth: wsRect.innerWidth * 0.95,
|
|
230
|
+
winHeight: wsRect.innerHeight * 0.75,
|
|
231
|
+
winVisualState: "demaximized",
|
|
232
|
+
isDragging: true
|
|
233
|
+
} : { isDragging: true };
|
|
234
|
+
return [
|
|
235
|
+
{
|
|
236
|
+
winId: targetWinId,
|
|
237
|
+
patch
|
|
238
|
+
}
|
|
239
|
+
];
|
|
240
|
+
},
|
|
241
|
+
DISABLE_DRAG: (targetWinId) => {
|
|
242
|
+
return [
|
|
243
|
+
{
|
|
244
|
+
winId: targetWinId,
|
|
245
|
+
patch: {
|
|
246
|
+
isDragging: false
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
];
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
var isDragAllowed = () => {
|
|
253
|
+
return !useWorkspaceState.getState().isBelowBreakPoint;
|
|
254
|
+
};
|
|
97
255
|
|
|
98
|
-
// src/window-manager/internal/
|
|
99
|
-
var
|
|
100
|
-
|
|
101
|
-
const
|
|
256
|
+
// src/window-manager/internal/runtime/focus-resolver/focus-commands.ts
|
|
257
|
+
var focusCommandResolver = {
|
|
258
|
+
FOCUS_WINDOW: (targetWinId) => {
|
|
259
|
+
const targetWin = windowRegistry[targetWinId].getState();
|
|
260
|
+
if (targetWin.isActive && !targetWin.isWindowClosed)
|
|
261
|
+
return { win: [], ws: {} };
|
|
262
|
+
const newStackOrderUpdate = [];
|
|
263
|
+
const workspaceUpdate = { activeWindowId: targetWinId };
|
|
264
|
+
for (const key of Object.keys(windowRegistry)) {
|
|
265
|
+
const otherWin = windowRegistry[key].getState();
|
|
266
|
+
if (otherWin.windowId === targetWin.windowId)
|
|
267
|
+
continue;
|
|
268
|
+
const adjustedIndex = otherWin.zIndex >= targetWin.zIndex ? otherWin.zIndex - 1 : otherWin.zIndex;
|
|
269
|
+
newStackOrderUpdate.push({
|
|
270
|
+
winId: otherWin.windowId,
|
|
271
|
+
patch: {
|
|
272
|
+
isActive: false,
|
|
273
|
+
zIndex: adjustedIndex
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
newStackOrderUpdate.push({
|
|
278
|
+
winId: targetWin.windowId,
|
|
279
|
+
patch: {
|
|
280
|
+
isWindowClosed: false,
|
|
281
|
+
isActive: true,
|
|
282
|
+
zIndex: newStackOrderUpdate.length + 1
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
return {
|
|
286
|
+
win: newStackOrderUpdate,
|
|
287
|
+
ws: workspaceUpdate
|
|
288
|
+
};
|
|
289
|
+
},
|
|
290
|
+
CLOSE_WINDOW_AND_REFOCUS: (targetWinId) => {
|
|
291
|
+
const isTargetWinClosed = windowRegistry[targetWinId].getState().isWindowClosed;
|
|
292
|
+
if (isTargetWinClosed)
|
|
293
|
+
return { win: [], ws: {} };
|
|
294
|
+
let prevIndex = 0;
|
|
295
|
+
let highestIndexWinId = void 0;
|
|
296
|
+
for (const key of Object.keys(windowRegistry)) {
|
|
297
|
+
const { zIndex, windowId, isWindowClosed } = windowRegistry[key].getState();
|
|
298
|
+
if (windowId === targetWinId)
|
|
299
|
+
continue;
|
|
300
|
+
if (isWindowClosed)
|
|
301
|
+
continue;
|
|
302
|
+
if (zIndex > prevIndex) {
|
|
303
|
+
prevIndex = zIndex;
|
|
304
|
+
highestIndexWinId = windowId;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return !highestIndexWinId ? {
|
|
308
|
+
ws: {},
|
|
309
|
+
win: [
|
|
310
|
+
{
|
|
311
|
+
winId: targetWinId,
|
|
312
|
+
patch: { isActive: false, isWindowClosed: true }
|
|
313
|
+
}
|
|
314
|
+
]
|
|
315
|
+
} : {
|
|
316
|
+
ws: { activeWindowId: highestIndexWinId },
|
|
317
|
+
win: [
|
|
318
|
+
{
|
|
319
|
+
winId: highestIndexWinId,
|
|
320
|
+
patch: { isActive: true }
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
winId: targetWinId,
|
|
324
|
+
patch: { isActive: false, isWindowClosed: true }
|
|
325
|
+
}
|
|
326
|
+
]
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
// src/window-manager/internal/runtime/stack-resolver/stack-commands.ts
|
|
332
|
+
var stackCommandResolver = {
|
|
333
|
+
RESET_STACK: () => {
|
|
334
|
+
const batchUpdate = [];
|
|
335
|
+
for (const key of Object.keys(windowRegistry)) {
|
|
336
|
+
const { resetFlag } = windowRegistry[key].getState();
|
|
337
|
+
batchUpdate.push({
|
|
338
|
+
winId: key,
|
|
339
|
+
patch: {
|
|
340
|
+
resetFlag: !resetFlag,
|
|
341
|
+
// FIND ME: reset flag is anti-pattern
|
|
342
|
+
isWindowClosed: true,
|
|
343
|
+
isActive: false
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
return batchUpdate;
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
// src/window-manager/internal/runtime/workspace-resolver/workspace-commands.ts
|
|
352
|
+
var workspaceCommandResolver = {
|
|
353
|
+
UPDATE_WORKSPACE_RECT: () => {
|
|
354
|
+
const rect = useWorkspaceState.getState().wsElement?.getBoundingClientRect();
|
|
102
355
|
const top = rect?.top ?? 0;
|
|
103
356
|
const left = rect?.left ?? 0;
|
|
104
357
|
const innerHeight = rect?.height ?? 0;
|
|
@@ -107,22 +360,36 @@ var wsApi = {
|
|
|
107
360
|
const right = left + innerWidth;
|
|
108
361
|
const centerX = left + innerWidth / 2;
|
|
109
362
|
const centerY = top + innerHeight / 2;
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
363
|
+
const breakPoint = useWorkspaceState.getState().responsiveBreak;
|
|
364
|
+
const isBelowBreakPoint = innerWidth < responsiveBreakInPx(breakPoint);
|
|
365
|
+
return {
|
|
366
|
+
isBelowBreakPoint,
|
|
367
|
+
wsRect: {
|
|
368
|
+
top,
|
|
369
|
+
left,
|
|
370
|
+
innerHeight,
|
|
371
|
+
innerWidth,
|
|
372
|
+
bottom,
|
|
373
|
+
right,
|
|
374
|
+
centerX,
|
|
375
|
+
centerY
|
|
376
|
+
}
|
|
119
377
|
};
|
|
120
|
-
return wsWindow;
|
|
121
378
|
},
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return
|
|
379
|
+
SET_WORKSPACE_FEATURES: (_, ctx) => {
|
|
380
|
+
if (ctx?.isGridEnabled === void 0 || ctx?.isDockPannelEnabled === void 0)
|
|
381
|
+
throw new Error(`SET_WORKSPACE_FEATURES called without a ctx value`);
|
|
382
|
+
return {
|
|
383
|
+
isGridEnabled: ctx.isGridEnabled,
|
|
384
|
+
isDockPannelEnabled: ctx.isDockPannelEnabled
|
|
385
|
+
};
|
|
386
|
+
},
|
|
387
|
+
SET_RESPONSIVE_BREAK: (_, ctx) => {
|
|
388
|
+
if (ctx?.responsiveBreak === void 0 || ctx?.responsiveBreak === null)
|
|
389
|
+
throw new Error(`SET_RESPONSIVE_BREAK called without a ctx value`);
|
|
390
|
+
return {
|
|
391
|
+
responsiveBreak: ctx.responsiveBreak
|
|
392
|
+
};
|
|
126
393
|
}
|
|
127
394
|
};
|
|
128
395
|
var responsiveBreakInPx = (breakPoint) => {
|
|
@@ -144,341 +411,948 @@ var responsiveBreakInPx = (breakPoint) => {
|
|
|
144
411
|
}
|
|
145
412
|
};
|
|
146
413
|
|
|
147
|
-
// src/window-manager/internal/
|
|
148
|
-
var
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
414
|
+
// src/window-manager/internal/runtime/resize-resolver/resize-commands.ts
|
|
415
|
+
var resizeCommandResolver = {
|
|
416
|
+
ENABLE_RESIZE: (targetWinId, direction) => {
|
|
417
|
+
const currentResizeAction = windowRegistry[targetWinId].getState().resizeAction;
|
|
418
|
+
if (currentResizeAction)
|
|
419
|
+
throw new Error(`ENABLE_RESIZE called on a window that is already risizing`);
|
|
420
|
+
return [
|
|
421
|
+
{
|
|
422
|
+
winId: targetWinId,
|
|
423
|
+
patch: {
|
|
424
|
+
resizeAction: direction,
|
|
425
|
+
winVisualState: "demaximized"
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
];
|
|
157
429
|
},
|
|
158
|
-
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
privateApi.resizeTopWinHeight(ctx);
|
|
169
|
-
break;
|
|
170
|
-
case "e":
|
|
171
|
-
privateApi.resizeRightWinWidth(ctx);
|
|
172
|
-
break;
|
|
173
|
-
case "w":
|
|
174
|
-
privateApi.resizeLeftWinWidth(ctx);
|
|
175
|
-
break;
|
|
176
|
-
case "se":
|
|
177
|
-
privateApi.resizeRightBottomWidthAndHeight(ctx);
|
|
178
|
-
break;
|
|
179
|
-
case "sw":
|
|
180
|
-
privateApi.resizeLeftBottomWidthAndHeight(ctx);
|
|
181
|
-
break;
|
|
182
|
-
case "ne":
|
|
183
|
-
privateApi.resizeRightTopWidthAndHeight(ctx);
|
|
184
|
-
break;
|
|
185
|
-
case "nw":
|
|
186
|
-
privateApi.resizeLeftTopWidthAndHeight(ctx);
|
|
187
|
-
break;
|
|
188
|
-
}
|
|
430
|
+
DISABLE_RESIZE: (_) => {
|
|
431
|
+
const patch = [];
|
|
432
|
+
for (const key of Object.keys(windowRegistry))
|
|
433
|
+
patch.push({
|
|
434
|
+
winId: key,
|
|
435
|
+
patch: {
|
|
436
|
+
resizeAction: false
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
return patch;
|
|
189
440
|
}
|
|
190
441
|
};
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
442
|
+
|
|
443
|
+
// src/window-manager/internal/runtime/resize-resolver/resize-loop.ts
|
|
444
|
+
var rafResizeLoopResolver = {
|
|
445
|
+
LOOP_RESIZE: (targetWinId, commitCb) => {
|
|
446
|
+
const dep = getRafResizeDependencies(targetWinId);
|
|
447
|
+
const resizeDirection = dep.win.resizeAction;
|
|
448
|
+
if (!resizeDirection)
|
|
449
|
+
throw new Error(`LOOP_RESIZE called with resizeAction as false for winId: ${targetWinId}`);
|
|
450
|
+
const winElementBox = dep.winBox;
|
|
451
|
+
if (!winElementBox)
|
|
452
|
+
throw new Error(`LOOP_RESIZE called with null window element for winId: ${targetWinId}`);
|
|
453
|
+
requestAnimationFrame(
|
|
454
|
+
() => resizer[resizeDirection](getRafResizeDependencies(targetWinId), commitCb)
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
};
|
|
458
|
+
var resizer = {
|
|
459
|
+
e: (resizeDep, commit) => {
|
|
460
|
+
const { wsRect, win, winBox, x } = resizeDep;
|
|
461
|
+
if (!win.resizeAction)
|
|
195
462
|
return;
|
|
196
|
-
|
|
197
|
-
if (minWinWidth)
|
|
463
|
+
if (!winBox)
|
|
198
464
|
return;
|
|
199
465
|
const cursorOutOfBounds = x > wsRect.right || x < wsRect.left;
|
|
200
|
-
|
|
201
|
-
return;
|
|
466
|
+
const minWinWidth = x - winBox.left < win.WIN_MIN_WIDTH;
|
|
202
467
|
const sizeDiff = x - winBox.right;
|
|
203
|
-
|
|
468
|
+
if (!minWinWidth && !cursorOutOfBounds && sizeDiff !== 0) {
|
|
469
|
+
commit([
|
|
470
|
+
{
|
|
471
|
+
winId: win.windowId,
|
|
472
|
+
patch: { winWidth: Math.round(win.winWidth + sizeDiff) }
|
|
473
|
+
}
|
|
474
|
+
]);
|
|
475
|
+
}
|
|
476
|
+
requestAnimationFrame(() => resizer.e(getRafResizeDependencies(win.windowId), commit));
|
|
204
477
|
},
|
|
205
|
-
|
|
206
|
-
const { wsRect, win, winBox, x
|
|
478
|
+
w: (resizeDep, commit) => {
|
|
479
|
+
const { wsRect, win, winBox, x } = resizeDep;
|
|
480
|
+
if (!win.resizeAction)
|
|
481
|
+
return;
|
|
207
482
|
if (!winBox)
|
|
208
483
|
return;
|
|
209
484
|
const minWinWidth = winBox.right - x <= win.WIN_MIN_WIDTH;
|
|
210
|
-
if (minWinWidth)
|
|
211
|
-
return;
|
|
212
485
|
const cursorOutOfBounds = x > wsRect.right || x < wsRect.left;
|
|
213
|
-
if (cursorOutOfBounds)
|
|
214
|
-
return;
|
|
215
486
|
const sizeDiff = winBox.left - x;
|
|
216
|
-
|
|
217
|
-
|
|
487
|
+
if (!minWinWidth && !cursorOutOfBounds && sizeDiff !== 0) {
|
|
488
|
+
commit([
|
|
489
|
+
{
|
|
490
|
+
winId: win.windowId,
|
|
491
|
+
patch: {
|
|
492
|
+
winWidth: Math.round(win.winWidth + sizeDiff),
|
|
493
|
+
winCoord: { pointX: x, pointY: win.winCoord.pointY }
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
]);
|
|
497
|
+
}
|
|
498
|
+
requestAnimationFrame(() => resizer.w(getRafResizeDependencies(win.windowId), commit));
|
|
218
499
|
},
|
|
219
|
-
|
|
220
|
-
const { wsRect, win, winBox,
|
|
500
|
+
n: (resizeDep, commit) => {
|
|
501
|
+
const { wsRect, win, winBox, y } = resizeDep;
|
|
502
|
+
if (!win.resizeAction)
|
|
503
|
+
return;
|
|
221
504
|
if (!winBox)
|
|
222
505
|
return;
|
|
223
506
|
const minWinHeight = winBox.bottom - y <= win.WIN_MIN_HEIGHT;
|
|
224
|
-
if (minWinHeight)
|
|
225
|
-
return;
|
|
226
507
|
const cursorOutOfBounds = y > wsRect.bottom || y < wsRect.top;
|
|
227
|
-
if (cursorOutOfBounds)
|
|
228
|
-
return;
|
|
229
508
|
const sizeDiff = winBox.top - y;
|
|
230
|
-
|
|
231
|
-
|
|
509
|
+
if (!minWinHeight && !cursorOutOfBounds && sizeDiff !== 0) {
|
|
510
|
+
commit([
|
|
511
|
+
{
|
|
512
|
+
winId: win.windowId,
|
|
513
|
+
patch: {
|
|
514
|
+
winHeight: Math.round(win.winHeight + sizeDiff),
|
|
515
|
+
winCoord: { pointX: win.winCoord.pointX, pointY: y }
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
]);
|
|
519
|
+
}
|
|
520
|
+
requestAnimationFrame(() => resizer.n(getRafResizeDependencies(win.windowId), commit));
|
|
232
521
|
},
|
|
233
|
-
|
|
234
|
-
const { wsRect, win, winBox,
|
|
522
|
+
s: (resizeDep, commit) => {
|
|
523
|
+
const { wsRect, win, winBox, y } = resizeDep;
|
|
524
|
+
if (!win.resizeAction)
|
|
525
|
+
return;
|
|
235
526
|
if (!winBox)
|
|
236
527
|
return;
|
|
237
528
|
const minWinHeight = y - winBox.top < win.WIN_MIN_HEIGHT;
|
|
238
|
-
if (minWinHeight)
|
|
239
|
-
return;
|
|
240
529
|
const cursorOutOfBounds = y > wsRect.bottom || y < wsRect.top;
|
|
241
|
-
if (cursorOutOfBounds)
|
|
242
|
-
return;
|
|
243
530
|
const sizeDiff = y - winBox.bottom;
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
privateApi.resizeRightWinWidth(resizeCtx);
|
|
256
|
-
privateApi.resizeTopWinHeight(resizeCtx);
|
|
531
|
+
if (!minWinHeight && !cursorOutOfBounds && sizeDiff !== 0) {
|
|
532
|
+
commit([
|
|
533
|
+
{
|
|
534
|
+
winId: win.windowId,
|
|
535
|
+
patch: {
|
|
536
|
+
winHeight: Math.round(win.winHeight + sizeDiff)
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
]);
|
|
540
|
+
}
|
|
541
|
+
requestAnimationFrame(() => resizer.s(getRafResizeDependencies(win.windowId), commit));
|
|
257
542
|
},
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
*/
|
|
263
|
-
resizeLeftTopWidthAndHeight: (resizeCtx) => {
|
|
264
|
-
const { wsRect, win, winBox, x, y } = resizeCtx;
|
|
543
|
+
nw: (resizeDep, commit) => {
|
|
544
|
+
const { wsRect, win, winBox, x, y } = resizeDep;
|
|
545
|
+
if (!win.resizeAction)
|
|
546
|
+
return;
|
|
265
547
|
if (!winBox)
|
|
266
548
|
return;
|
|
267
549
|
const cursorOutOfBoundsY = y > wsRect.bottom || y < wsRect.top;
|
|
268
550
|
const cursorOutOfBoundsX = x > wsRect.right || x < wsRect.left;
|
|
269
|
-
|
|
270
|
-
|
|
551
|
+
const isCursorOutOfBounds = cursorOutOfBoundsY || cursorOutOfBoundsX;
|
|
552
|
+
if (isCursorOutOfBounds) {
|
|
553
|
+
requestAnimationFrame(() => resizer.nw(getRafResizeDependencies(win.windowId), commit));
|
|
554
|
+
}
|
|
271
555
|
const minWinHeight = winBox.bottom - y <= win.WIN_MIN_HEIGHT;
|
|
272
556
|
const minWinWidth = winBox.right - x <= win.WIN_MIN_WIDTH;
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
557
|
+
const sizeDiffY = winBox.top - y;
|
|
558
|
+
const sizeDiffX = winBox.left - x;
|
|
559
|
+
const stagedChagnes = [];
|
|
560
|
+
if (sizeDiffY !== 0 || sizeDiffX !== 0) {
|
|
561
|
+
stagedChagnes.push({
|
|
562
|
+
winId: win.windowId,
|
|
563
|
+
patch: {
|
|
564
|
+
winCoord: {
|
|
565
|
+
pointX: minWinWidth ? win.winCoord.pointX : x,
|
|
566
|
+
pointY: minWinHeight ? win.winCoord.pointY : y
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
if (!minWinHeight && sizeDiffY !== 0) {
|
|
572
|
+
stagedChagnes.push({
|
|
573
|
+
winId: win.windowId,
|
|
574
|
+
patch: { winHeight: Math.round(win.winHeight + sizeDiffY) }
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
if (!minWinWidth && sizeDiffX !== 0) {
|
|
578
|
+
stagedChagnes.push({
|
|
579
|
+
winId: win.windowId,
|
|
580
|
+
patch: { winWidth: Math.round(win.winWidth + sizeDiffX) }
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
commit(stagedChagnes);
|
|
584
|
+
requestAnimationFrame(() => resizer.nw(getRafResizeDependencies(win.windowId), commit));
|
|
585
|
+
},
|
|
586
|
+
se: (resizeDep, commit) => {
|
|
587
|
+
resizer.e(resizeDep, commit);
|
|
588
|
+
resizer.s(resizeDep, commit);
|
|
589
|
+
},
|
|
590
|
+
sw: (resizeDep, commit) => {
|
|
591
|
+
resizer.w(resizeDep, commit);
|
|
592
|
+
resizer.s(resizeDep, commit);
|
|
593
|
+
},
|
|
594
|
+
ne: (resizeDep, commit) => {
|
|
595
|
+
resizer.e(resizeDep, commit);
|
|
596
|
+
resizer.n(resizeDep, commit);
|
|
597
|
+
}
|
|
598
|
+
};
|
|
599
|
+
var getRafResizeDependencies = (winId) => {
|
|
600
|
+
const win = windowRegistry[winId].getState();
|
|
601
|
+
const winBox = win.winElement?.getBoundingClientRect();
|
|
602
|
+
const wsRect = useWorkspaceState.getState().wsRect;
|
|
603
|
+
const { x, y } = useCursorState.getState();
|
|
604
|
+
return { wsRect, win, winBox, x, y };
|
|
605
|
+
};
|
|
606
|
+
|
|
607
|
+
// src/window-manager/internal/runtime/rwm-runtime.ts
|
|
608
|
+
var rwmRuntime = {
|
|
609
|
+
dispatch: ({ subsystem, cmd, targetWinId, ctx }) => {
|
|
610
|
+
switch (subsystem) {
|
|
611
|
+
case "WORKSPACE": {
|
|
612
|
+
const stagedChanges = workspaceCommandResolver[cmd](targetWinId, ctx);
|
|
613
|
+
commitToWorkspace(stagedChanges);
|
|
614
|
+
break;
|
|
615
|
+
}
|
|
616
|
+
case "DRAG": {
|
|
617
|
+
if (!isDragAllowed())
|
|
618
|
+
return;
|
|
619
|
+
const stagedChanges = dragCommandResolver[cmd](targetWinId);
|
|
620
|
+
commitToWindow(stagedChanges);
|
|
621
|
+
break;
|
|
622
|
+
}
|
|
623
|
+
case "DOCK": {
|
|
624
|
+
const { wsRect } = getDockDependencies();
|
|
625
|
+
const stagedChanges = dockCommandResolver[cmd](targetWinId, wsRect);
|
|
626
|
+
commitToWindow(stagedChanges);
|
|
627
|
+
break;
|
|
628
|
+
}
|
|
629
|
+
case "RESIZE": {
|
|
630
|
+
const stagedChanges = resizeCommandResolver[cmd](targetWinId, ctx);
|
|
631
|
+
commitToWindow(stagedChanges);
|
|
632
|
+
break;
|
|
633
|
+
}
|
|
634
|
+
case "STACK": {
|
|
635
|
+
const stagedChanges = stackCommandResolver[cmd](targetWinId);
|
|
636
|
+
commitToWindow(stagedChanges);
|
|
637
|
+
break;
|
|
638
|
+
}
|
|
639
|
+
case "FOCUS": {
|
|
640
|
+
const stagedChanges = focusCommandResolver[cmd](targetWinId);
|
|
641
|
+
commitBatch(stagedChanges);
|
|
642
|
+
break;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
};
|
|
647
|
+
var rafRuntime = {
|
|
648
|
+
dispatch: ({ subsystem, cmd, targetWinId }) => {
|
|
649
|
+
switch (subsystem) {
|
|
650
|
+
case "RAF_DRAG": {
|
|
651
|
+
if (!isDragAllowed())
|
|
652
|
+
return;
|
|
653
|
+
rafDragLoopResolver[cmd](targetWinId, commitToWindow);
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
656
|
+
case "RAF_RESIZE": {
|
|
657
|
+
rafResizeLoopResolver[cmd](targetWinId, commitToWindow);
|
|
658
|
+
break;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
};
|
|
663
|
+
function commitBatch({ win, ws }) {
|
|
664
|
+
commitToWorkspace(ws);
|
|
665
|
+
commitToWindow(win);
|
|
666
|
+
}
|
|
667
|
+
function commitToWindow(patchStack) {
|
|
668
|
+
patchStack.forEach(({ winId, patch }) => {
|
|
669
|
+
windowRegistry[winId].setState(patch);
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
function commitToWorkspace(patch) {
|
|
673
|
+
if (patch) {
|
|
674
|
+
useWorkspaceState.setState(patch);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// src/window-manager/internal/features/docking/docking-api.ts
|
|
679
|
+
var dockApi = {
|
|
680
|
+
dockWindowRight: (winId) => rwmRuntime.dispatch({
|
|
681
|
+
targetWinId: winId,
|
|
682
|
+
subsystem: "DOCK",
|
|
683
|
+
cmd: "DOCK_WINDOW_RIGHT"
|
|
684
|
+
}),
|
|
685
|
+
dockWindowLeft: (winId) => rwmRuntime.dispatch({
|
|
686
|
+
targetWinId: winId,
|
|
687
|
+
subsystem: "DOCK",
|
|
688
|
+
cmd: "DOCK_WINDOW_LEFT"
|
|
689
|
+
}),
|
|
690
|
+
dockWindowTop: (winId) => rwmRuntime.dispatch({
|
|
691
|
+
targetWinId: winId,
|
|
692
|
+
subsystem: "DOCK",
|
|
693
|
+
cmd: "DOCK_WINDOW_TOP"
|
|
694
|
+
}),
|
|
695
|
+
dockWindowBottom: (winId) => rwmRuntime.dispatch({
|
|
696
|
+
targetWinId: winId,
|
|
697
|
+
subsystem: "DOCK",
|
|
698
|
+
cmd: "DOCK_WINDOW_BOTTOM"
|
|
699
|
+
}),
|
|
700
|
+
dockWindowBottomRight: (winId) => rwmRuntime.dispatch({
|
|
701
|
+
targetWinId: winId,
|
|
702
|
+
subsystem: "DOCK",
|
|
703
|
+
cmd: "DOCK_WINDOW_BOTTOM_RIGHT"
|
|
704
|
+
}),
|
|
705
|
+
dockWindowTopRight: (winId) => rwmRuntime.dispatch({
|
|
706
|
+
targetWinId: winId,
|
|
707
|
+
subsystem: "DOCK",
|
|
708
|
+
cmd: "DOCK_WINDOW_TOP_RIGHT"
|
|
709
|
+
}),
|
|
710
|
+
dockWindowBottomLeft: (winId) => rwmRuntime.dispatch({
|
|
711
|
+
targetWinId: winId,
|
|
712
|
+
subsystem: "DOCK",
|
|
713
|
+
cmd: "DOCK_WINDOW_BOTTOM_LEFT"
|
|
714
|
+
}),
|
|
715
|
+
dockWindowTopLeft: (winId) => rwmRuntime.dispatch({
|
|
716
|
+
targetWinId: winId,
|
|
717
|
+
subsystem: "DOCK",
|
|
718
|
+
cmd: "DOCK_WINDOW_TOP_LEFT"
|
|
719
|
+
}),
|
|
720
|
+
maximizeWindow: (winId) => rwmRuntime.dispatch({
|
|
721
|
+
targetWinId: winId,
|
|
722
|
+
subsystem: "DOCK",
|
|
723
|
+
cmd: "MAXIMIZE_WINDOW"
|
|
724
|
+
}),
|
|
725
|
+
demaximizeWindow: (winId) => rwmRuntime.dispatch({
|
|
726
|
+
targetWinId: winId,
|
|
727
|
+
subsystem: "DOCK",
|
|
728
|
+
cmd: "DEMAXIMIZE_WINDOW"
|
|
729
|
+
})
|
|
730
|
+
};
|
|
731
|
+
|
|
732
|
+
// src/window-manager/internal/features/focus/focus-api.ts
|
|
733
|
+
var focusApi = {
|
|
734
|
+
bringWindowToFocus: (targetId) => {
|
|
735
|
+
rwmRuntime.dispatch({
|
|
736
|
+
targetWinId: targetId,
|
|
737
|
+
subsystem: "FOCUS",
|
|
738
|
+
cmd: "FOCUS_WINDOW"
|
|
739
|
+
});
|
|
740
|
+
},
|
|
741
|
+
closeWindowAndRefocus: (targetId) => {
|
|
742
|
+
rwmRuntime.dispatch({
|
|
743
|
+
targetWinId: targetId,
|
|
744
|
+
subsystem: "FOCUS",
|
|
745
|
+
cmd: "CLOSE_WINDOW_AND_REFOCUS"
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
};
|
|
749
|
+
|
|
750
|
+
// src/window-manager/internal/features/stack/stack-api.ts
|
|
751
|
+
var stackApi = {
|
|
752
|
+
resetStack: () => {
|
|
753
|
+
rwmRuntime.dispatch({ subsystem: "STACK", cmd: "RESET_STACK" });
|
|
754
|
+
}
|
|
755
|
+
};
|
|
756
|
+
|
|
757
|
+
// src/window-manager/internal/features/workspace/workspace-api.ts
|
|
758
|
+
var wsApi = {
|
|
759
|
+
/**
|
|
760
|
+
* Always relative to the WorkspaceLayout dimensions. Use `wsApi.setWsResponsiveBreak` to modify the value
|
|
761
|
+
* @default 'sm'
|
|
762
|
+
* @param sm uses mobile format at 640px
|
|
763
|
+
* @param md uses mobile format at 768px
|
|
764
|
+
* @param lg uses mobile format at 1024px
|
|
765
|
+
* @param xl uses mobile format at 1280px
|
|
766
|
+
* @param never never uses mobile format
|
|
767
|
+
* @param always always uses mobile format
|
|
768
|
+
* @param number set custom break point value in px */
|
|
769
|
+
setWsResponsiveBreak: (breakPoint) => {
|
|
770
|
+
rwmRuntime.dispatch({
|
|
771
|
+
subsystem: "WORKSPACE",
|
|
772
|
+
cmd: "SET_RESPONSIVE_BREAK",
|
|
773
|
+
ctx: { responsiveBreak: breakPoint }
|
|
774
|
+
});
|
|
775
|
+
},
|
|
776
|
+
setWsFeatures: ({ isDockPannelEnabled = true, isGridEnabled = true }) => {
|
|
777
|
+
rwmRuntime.dispatch({
|
|
778
|
+
subsystem: "WORKSPACE",
|
|
779
|
+
cmd: "SET_WORKSPACE_FEATURES",
|
|
780
|
+
ctx: { isDockPannelEnabled, isGridEnabled }
|
|
781
|
+
});
|
|
782
|
+
},
|
|
783
|
+
updateWsRect: () => {
|
|
784
|
+
rwmRuntime.dispatch({ subsystem: "WORKSPACE", cmd: "UPDATE_WORKSPACE_RECT" });
|
|
785
|
+
}
|
|
786
|
+
};
|
|
787
|
+
|
|
788
|
+
// src/window-manager/rwm.ts
|
|
789
|
+
var { updateWsRect, ...publicWsApi } = wsApi;
|
|
790
|
+
var rwm = {
|
|
791
|
+
dockApi,
|
|
792
|
+
focusApi,
|
|
793
|
+
stackApi,
|
|
794
|
+
workspaceApi: publicWsApi,
|
|
795
|
+
/**
|
|
796
|
+
* @about
|
|
797
|
+
* Zustand hook, can be used to access the current state of the workspace by either
|
|
798
|
+
* calling `const { <someState> } = worskpaceState()` inside a component or by calling
|
|
799
|
+
* `worskpaceState.getState()` anywhere.
|
|
800
|
+
*
|
|
801
|
+
* @note
|
|
802
|
+
* The hook also exposes the `setState()` method, however, this is highly discouraged. Prefer calling
|
|
803
|
+
* the exposed apis in rwm for state mutation.
|
|
804
|
+
*/
|
|
805
|
+
worskpaceState: useWorkspaceState,
|
|
806
|
+
/**
|
|
807
|
+
* @about
|
|
808
|
+
* use the syntax `const { <someState> } = windowRegistry[<winId>]()` inside a component to access
|
|
809
|
+
* the zustand hook or `windowRegistry[<winId>].getState()` to get the current state of a window anywhere
|
|
810
|
+
*
|
|
811
|
+
* @note
|
|
812
|
+
* Each hook also exposes the `setState()` method, however, this is highly discouraged. Prefer calling
|
|
813
|
+
* the exposed apis in rwm for state mutation.
|
|
814
|
+
*/
|
|
815
|
+
windowRegistry
|
|
816
|
+
};
|
|
817
|
+
var rwm_default = rwm;
|
|
818
|
+
|
|
819
|
+
// src/window-manager/workspace-layout.tsx
|
|
820
|
+
import { useEffect as useEffect3, useRef } from "react";
|
|
821
|
+
|
|
822
|
+
// src/window-manager/internal/features/docking/docking-controls.tsx
|
|
823
|
+
import { useState } from "react";
|
|
824
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
825
|
+
function DockingControls() {
|
|
826
|
+
const [isHovering, setIsHovering] = useState(false);
|
|
827
|
+
const { activeWindowId, isDockPannelEnabled, isBelowBreakPoint } = useWorkspaceState();
|
|
828
|
+
const { isDragging } = windowRegistry[activeWindowId]();
|
|
829
|
+
const cornerDockControl = /* @__PURE__ */ jsxs("div", { className: `flex xl:p-0 shrink-0 gap-0.5`, children: [
|
|
830
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col justify-center gap-0.5", children: [
|
|
831
|
+
/* @__PURE__ */ jsx(
|
|
832
|
+
"button",
|
|
833
|
+
{
|
|
834
|
+
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-10 h-6 rounded-sm",
|
|
835
|
+
onPointerUp: () => dockApi.dockWindowTopLeft(activeWindowId)
|
|
836
|
+
}
|
|
837
|
+
),
|
|
838
|
+
/* @__PURE__ */ jsx(
|
|
839
|
+
"button",
|
|
840
|
+
{
|
|
841
|
+
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-10 h-6 rounded-sm",
|
|
842
|
+
onPointerUp: () => dockApi.dockWindowBottomLeft(activeWindowId)
|
|
843
|
+
}
|
|
844
|
+
)
|
|
845
|
+
] }),
|
|
846
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col justify-center gap-0.5", children: [
|
|
847
|
+
/* @__PURE__ */ jsx(
|
|
848
|
+
"button",
|
|
849
|
+
{
|
|
850
|
+
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-10 h-6 rounded-sm",
|
|
851
|
+
onPointerUp: () => dockApi.dockWindowTopRight(activeWindowId)
|
|
852
|
+
}
|
|
853
|
+
),
|
|
854
|
+
/* @__PURE__ */ jsx(
|
|
855
|
+
"button",
|
|
856
|
+
{
|
|
857
|
+
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-10 h-6 rounded-sm",
|
|
858
|
+
onPointerUp: () => dockApi.dockWindowBottomRight(activeWindowId)
|
|
859
|
+
}
|
|
860
|
+
)
|
|
861
|
+
] })
|
|
862
|
+
] });
|
|
863
|
+
const sideDideControl = /* @__PURE__ */ jsxs("div", { className: `flex shrink-0 items-center gap-0.5`, children: [
|
|
864
|
+
/* @__PURE__ */ jsx(
|
|
865
|
+
"button",
|
|
866
|
+
{
|
|
867
|
+
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-8 h-12 rounded-sm",
|
|
868
|
+
onPointerUp: () => dockApi.dockWindowLeft(activeWindowId)
|
|
869
|
+
}
|
|
870
|
+
),
|
|
871
|
+
/* @__PURE__ */ jsx(
|
|
872
|
+
"button",
|
|
873
|
+
{
|
|
874
|
+
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-8 h-12 rounded-sm",
|
|
875
|
+
onPointerUp: () => dockApi.dockWindowRight(activeWindowId)
|
|
876
|
+
}
|
|
877
|
+
)
|
|
878
|
+
] });
|
|
879
|
+
const horizontalDockControl = /* @__PURE__ */ jsxs("div", { className: `flex flex-col shrink-0 items-center gap-0.5`, children: [
|
|
880
|
+
/* @__PURE__ */ jsx(
|
|
881
|
+
"button",
|
|
882
|
+
{
|
|
883
|
+
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-14 h-6 rounded-sm",
|
|
884
|
+
onPointerUp: () => dockApi.dockWindowTop(activeWindowId)
|
|
885
|
+
}
|
|
886
|
+
),
|
|
887
|
+
/* @__PURE__ */ jsx(
|
|
888
|
+
"button",
|
|
889
|
+
{
|
|
890
|
+
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-14 h-6 rounded-sm",
|
|
891
|
+
onPointerUp: () => dockApi.dockWindowBottom(activeWindowId)
|
|
892
|
+
}
|
|
893
|
+
)
|
|
894
|
+
] });
|
|
895
|
+
const windowDockPannel = /* @__PURE__ */ jsx(
|
|
896
|
+
"span",
|
|
897
|
+
{
|
|
898
|
+
className: "pointer-events-auto px-4 pb-3",
|
|
899
|
+
onPointerOver: () => setIsHovering(true),
|
|
900
|
+
onPointerLeave: () => setIsHovering(false),
|
|
901
|
+
children: /* @__PURE__ */ jsxs(
|
|
902
|
+
"section",
|
|
903
|
+
{
|
|
904
|
+
className: `
|
|
905
|
+
flex w-fit border border-zinc-600 border-t-0 rounded-b-md bg-zinc-800
|
|
906
|
+
overflow-hidden px-8 gap-4 h-full py-4
|
|
907
|
+
`,
|
|
908
|
+
children: [
|
|
909
|
+
cornerDockControl,
|
|
910
|
+
horizontalDockControl,
|
|
911
|
+
sideDideControl
|
|
912
|
+
]
|
|
913
|
+
}
|
|
914
|
+
)
|
|
915
|
+
}
|
|
916
|
+
);
|
|
917
|
+
if (isBelowBreakPoint)
|
|
918
|
+
return;
|
|
919
|
+
if (!isDockPannelEnabled)
|
|
920
|
+
return;
|
|
921
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
922
|
+
"div",
|
|
923
|
+
{
|
|
924
|
+
className: `
|
|
925
|
+
${isDragging ? isHovering ? "top-0 opacity-50" : "top-[-68px] opacity-80" : "top-[-104px] opacity-0"}
|
|
926
|
+
transition-all duration-500
|
|
927
|
+
absolute z-50 flex items-center justify-center
|
|
928
|
+
w-full mx-auto pointer-events-none`,
|
|
929
|
+
children: windowDockPannel
|
|
930
|
+
}
|
|
931
|
+
) });
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
// src/window-manager/internal/features/resizing/resizing-api.ts
|
|
935
|
+
var resizeApi = {
|
|
936
|
+
startResize: (winId, direction) => {
|
|
937
|
+
rwmRuntime.dispatch({
|
|
938
|
+
targetWinId: winId,
|
|
939
|
+
subsystem: "RESIZE",
|
|
940
|
+
cmd: "ENABLE_RESIZE",
|
|
941
|
+
ctx: direction
|
|
942
|
+
});
|
|
943
|
+
rafRuntime.dispatch({ targetWinId: winId, subsystem: "RAF_RESIZE", cmd: "LOOP_RESIZE" });
|
|
944
|
+
},
|
|
945
|
+
stopResize: (winId) => {
|
|
946
|
+
rwmRuntime.dispatch({
|
|
947
|
+
targetWinId: winId,
|
|
948
|
+
subsystem: "RESIZE",
|
|
949
|
+
cmd: "DISABLE_RESIZE",
|
|
950
|
+
ctx: false
|
|
951
|
+
});
|
|
952
|
+
}
|
|
953
|
+
};
|
|
954
|
+
|
|
955
|
+
// src/window-manager/internal/features/cursor/cursor-move-listener.tsx
|
|
956
|
+
import { useEffect } from "react";
|
|
957
|
+
import { Fragment as Fragment2, jsx as jsx2 } from "react/jsx-runtime";
|
|
958
|
+
function CursorMoveListener() {
|
|
959
|
+
const { setXY } = useCursorState();
|
|
960
|
+
useEffect(() => {
|
|
961
|
+
const handlePointerMove = (e) => {
|
|
962
|
+
e.preventDefault();
|
|
963
|
+
setXY(e.clientX, e.clientY);
|
|
964
|
+
};
|
|
965
|
+
window.addEventListener("pointermove", handlePointerMove);
|
|
966
|
+
return () => window.removeEventListener("pointermove", handlePointerMove);
|
|
967
|
+
}, [setXY]);
|
|
968
|
+
return /* @__PURE__ */ jsx2(Fragment2, {});
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
// src/window-manager/internal/features/workspace/workspace-resize-listener.tsx
|
|
972
|
+
import { useEffect as useEffect2 } from "react";
|
|
973
|
+
import { Fragment as Fragment3, jsx as jsx3 } from "react/jsx-runtime";
|
|
974
|
+
function WorkspaceResizeListener() {
|
|
975
|
+
const { wsElement } = useWorkspaceState();
|
|
976
|
+
useEffect2(() => {
|
|
977
|
+
if (!wsElement)
|
|
978
|
+
return;
|
|
979
|
+
const onResize = () => {
|
|
980
|
+
wsApi.updateWsRect();
|
|
981
|
+
stackApi.resetStack();
|
|
982
|
+
};
|
|
983
|
+
onResize();
|
|
984
|
+
const observer = new ResizeObserver(onResize);
|
|
985
|
+
observer.observe(wsElement);
|
|
986
|
+
return () => observer.disconnect();
|
|
987
|
+
}, [wsElement]);
|
|
988
|
+
return /* @__PURE__ */ jsx3(Fragment3, {});
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
// src/window-manager/internal/features/drag/drag-api.ts
|
|
992
|
+
var dragApi = {
|
|
993
|
+
startDrag: (targetWinId) => {
|
|
994
|
+
rwmRuntime.dispatch({
|
|
995
|
+
targetWinId,
|
|
996
|
+
subsystem: "DRAG",
|
|
997
|
+
cmd: "ENABLE_DRAG"
|
|
998
|
+
});
|
|
999
|
+
rafRuntime.dispatch({ targetWinId, subsystem: "RAF_DRAG", cmd: "LOOP_DRAG" });
|
|
1000
|
+
},
|
|
1001
|
+
stopDrag: (targetWinId) => {
|
|
1002
|
+
rwmRuntime.dispatch({
|
|
1003
|
+
targetWinId,
|
|
1004
|
+
subsystem: "DRAG",
|
|
1005
|
+
cmd: "DISABLE_DRAG"
|
|
276
1006
|
});
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
1007
|
+
}
|
|
1008
|
+
};
|
|
1009
|
+
|
|
1010
|
+
// src/window-manager/workspace-layout.tsx
|
|
1011
|
+
import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
1012
|
+
function WorkspaceLayout({ children, className }) {
|
|
1013
|
+
const { setWsElement, wsElement, isBelowBreakPoint, activeWindowId } = useWorkspaceState();
|
|
1014
|
+
const workspaceRef = useRef(null);
|
|
1015
|
+
useEffect3(() => {
|
|
1016
|
+
if (!workspaceRef.current)
|
|
1017
|
+
return;
|
|
1018
|
+
setWsElement(workspaceRef.current);
|
|
1019
|
+
}, [wsElement]);
|
|
1020
|
+
const disabledDragAndResize = () => {
|
|
1021
|
+
dragApi.stopDrag(activeWindowId);
|
|
1022
|
+
resizeApi.stopResize(activeWindowId);
|
|
1023
|
+
};
|
|
1024
|
+
return /* @__PURE__ */ jsxs2(
|
|
1025
|
+
"section",
|
|
1026
|
+
{
|
|
1027
|
+
id: "rwm-workspace-layout",
|
|
1028
|
+
ref: workspaceRef,
|
|
1029
|
+
onPointerLeave: disabledDragAndResize,
|
|
1030
|
+
onPointerUp: disabledDragAndResize,
|
|
1031
|
+
className: className ? className : "fixed overflow-hidden h-full w-full touch-none -z-50",
|
|
1032
|
+
children: [
|
|
1033
|
+
/* @__PURE__ */ jsx4(WorkspaceResizeListener, {}),
|
|
1034
|
+
/* @__PURE__ */ jsx4(CursorMoveListener, {}),
|
|
1035
|
+
/* @__PURE__ */ jsxs2("div", { className: " w-full h-full relative overflow-hidden", children: [
|
|
1036
|
+
!isBelowBreakPoint && /* @__PURE__ */ jsx4(DockingControls, {}),
|
|
1037
|
+
children
|
|
1038
|
+
] })
|
|
1039
|
+
]
|
|
1040
|
+
}
|
|
1041
|
+
);
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
// src/window-manager/registration/window-store-factory.tsx
|
|
1045
|
+
import { create as create3 } from "zustand";
|
|
1046
|
+
|
|
1047
|
+
// src/window-manager/internal/features/window-layout.tsx
|
|
1048
|
+
import { useEffect as useEffect4, useRef as useRef2 } from "react";
|
|
1049
|
+
|
|
1050
|
+
// src/window-manager/internal/assets/svg-win-icons.tsx
|
|
1051
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
1052
|
+
function IconWinMaximize({ color }) {
|
|
1053
|
+
return /* @__PURE__ */ jsx5(
|
|
1054
|
+
"svg",
|
|
1055
|
+
{
|
|
1056
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
1057
|
+
fill: "none",
|
|
1058
|
+
viewBox: "0 0 24 24",
|
|
1059
|
+
width: 24,
|
|
1060
|
+
height: 24,
|
|
1061
|
+
strokeWidth: 1.5,
|
|
1062
|
+
stroke: color ? color : "#cccccc",
|
|
1063
|
+
color: color ? color : "#cccccc",
|
|
1064
|
+
className: "size-6",
|
|
1065
|
+
children: /* @__PURE__ */ jsx5(
|
|
1066
|
+
"path",
|
|
1067
|
+
{
|
|
1068
|
+
strokeLinecap: "round",
|
|
1069
|
+
strokeLinejoin: "round",
|
|
1070
|
+
d: "M5.25 7.5A2.25 2.25 0 0 1 7.5 5.25h9a2.25 2.25 0 0 1 2.25 2.25v9a2.25 2.25 0 0 1-2.25 2.25h-9a2.25 2.25 0 0 1-2.25-2.25v-9Z"
|
|
1071
|
+
}
|
|
1072
|
+
)
|
|
1073
|
+
}
|
|
1074
|
+
);
|
|
1075
|
+
}
|
|
1076
|
+
function IconWinDemaximize({ color }) {
|
|
1077
|
+
return /* @__PURE__ */ jsx5(
|
|
1078
|
+
"svg",
|
|
1079
|
+
{
|
|
1080
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
1081
|
+
fill: "none",
|
|
1082
|
+
viewBox: "0 0 24 24",
|
|
1083
|
+
width: 24,
|
|
1084
|
+
height: 24,
|
|
1085
|
+
strokeWidth: 1.5,
|
|
1086
|
+
stroke: color ? color : "#cccccc",
|
|
1087
|
+
color: color ? color : "#cccccc",
|
|
1088
|
+
className: "size-6",
|
|
1089
|
+
children: /* @__PURE__ */ jsx5(
|
|
1090
|
+
"path",
|
|
1091
|
+
{
|
|
1092
|
+
strokeLinecap: "round",
|
|
1093
|
+
strokeLinejoin: "round",
|
|
1094
|
+
d: "M16.5 8.25V6a2.25 2.25 0 0 0-2.25-2.25H6A2.25 2.25 0 0 0 3.75 6v8.25A2.25 2.25 0 0 0 6 16.5h2.25m8.25-8.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-7.5A2.25 2.25 0 0 1 8.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 0 0-2.25 2.25v6"
|
|
1095
|
+
}
|
|
1096
|
+
)
|
|
280
1097
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
1098
|
+
);
|
|
1099
|
+
}
|
|
1100
|
+
function IconWinMinimize({ color }) {
|
|
1101
|
+
return /* @__PURE__ */ jsx5(
|
|
1102
|
+
"svg",
|
|
1103
|
+
{
|
|
1104
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
1105
|
+
fill: "none",
|
|
1106
|
+
viewBox: "0 0 24 24",
|
|
1107
|
+
width: 24,
|
|
1108
|
+
height: 24,
|
|
1109
|
+
strokeWidth: 1.5,
|
|
1110
|
+
stroke: color ? color : "#cccccc",
|
|
1111
|
+
color: color ? color : "#cccccc",
|
|
1112
|
+
className: "size-6",
|
|
1113
|
+
children: /* @__PURE__ */ jsx5("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18 18 6M6 6l12 12" })
|
|
284
1114
|
}
|
|
285
|
-
|
|
286
|
-
}
|
|
287
|
-
var getDependencies = (winId) => {
|
|
288
|
-
const wsRect = wsApi.getRect();
|
|
289
|
-
const win = windowRegistry[winId].getState();
|
|
290
|
-
const winBox = win.self?.current?.getBoundingClientRect();
|
|
291
|
-
const { x, y } = useCursorState.getState();
|
|
292
|
-
return { wsRect, win, winBox, x, y };
|
|
293
|
-
};
|
|
1115
|
+
);
|
|
1116
|
+
}
|
|
294
1117
|
|
|
295
|
-
// src/window-manager/internal/features/
|
|
296
|
-
var
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
window2.setZIndex(window2.zIndex - 1);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
targetWindow.setZIndex(Object.keys(windowRegistry).length);
|
|
310
|
-
targetWindow.setIsActive(true);
|
|
311
|
-
},
|
|
312
|
-
getOpenedWindowCount: () => {
|
|
313
|
-
let openWnidowCount = 0;
|
|
314
|
-
for (const key of Object.keys(windowRegistry))
|
|
315
|
-
if (!windowRegistry[key].getState().isWindowClosed)
|
|
316
|
-
openWnidowCount++;
|
|
317
|
-
return openWnidowCount;
|
|
318
|
-
},
|
|
319
|
-
resetStack: () => {
|
|
320
|
-
for (const key of Object.keys(windowRegistry)) {
|
|
321
|
-
windowRegistry[key].getState().reset();
|
|
322
|
-
}
|
|
1118
|
+
// src/window-manager/internal/features/grid/grid-orchestrator.ts
|
|
1119
|
+
var tolerance = 4;
|
|
1120
|
+
var gridOrchestrator = {
|
|
1121
|
+
attachAdjacentGridBehavior: (winId) => {
|
|
1122
|
+
if (!useWorkspaceState.getState().isGridEnabled)
|
|
1123
|
+
return;
|
|
1124
|
+
if (getOpenWinCount() < 1)
|
|
1125
|
+
throw new Error(`gridOrchestrator initalized but all windows are closed`);
|
|
1126
|
+
if (getDraggingWinCount() < 1)
|
|
1127
|
+
throw new Error(`gridOrchestrator initalized but no window is currently resizing`);
|
|
1128
|
+
attachAdjacentGridBehavior(winId);
|
|
323
1129
|
}
|
|
324
1130
|
};
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
var orchestrationGridResize = (winId) => {
|
|
331
|
-
const tolerance = 4;
|
|
332
|
-
const allowDistantResize = stackApi.getOpenedWindowCount() >= 3;
|
|
1131
|
+
var attachAdjacentGridBehavior = (winId, visited = /* @__PURE__ */ new Set()) => {
|
|
1132
|
+
if (visited.has(winId))
|
|
1133
|
+
return;
|
|
1134
|
+
else
|
|
1135
|
+
visited.add(winId);
|
|
333
1136
|
const thisWin = windowRegistry[winId].getState();
|
|
334
1137
|
const currentResize = thisWin.resizeAction;
|
|
335
1138
|
for (const key of Object.keys(windowRegistry)) {
|
|
336
1139
|
const remoteWin = windowRegistry[key].getState();
|
|
337
|
-
if (remoteWin.windowId === thisWin.windowId)
|
|
1140
|
+
if (remoteWin.windowId === thisWin.windowId)
|
|
338
1141
|
continue;
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
const
|
|
346
|
-
const remoteWinStartX = remoteWin.winCoord.pointX;
|
|
347
|
-
const remoteWinEndX = remoteWin.winCoord.pointX + remoteWin.winWidth;
|
|
348
|
-
const isRemoteOutside = remoteWinEndY !== thisWinEndY || remoteWinEndX !== thisWinEndX || remoteWinStartY !== thisWinStartY || remoteWinStartX !== thisWinStartX;
|
|
1142
|
+
if (remoteWin.isWindowClosed)
|
|
1143
|
+
continue;
|
|
1144
|
+
if (remoteWin.resizeAction)
|
|
1145
|
+
continue;
|
|
1146
|
+
if (visited.has(remoteWin.windowId))
|
|
1147
|
+
continue;
|
|
1148
|
+
const dependencies = buildDependencies(thisWin, remoteWin);
|
|
349
1149
|
if (currentResize === "e") {
|
|
350
|
-
const
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
if (isEdgeResize) {
|
|
354
|
-
remoteWin.setResizeAction("w");
|
|
355
|
-
}
|
|
356
|
-
const isRemoteOnSameLane = Math.abs(thisWinEndX - remoteWinEndX) < tolerance && Math.abs(thisWinStartX - remoteWinStartX) < tolerance;
|
|
357
|
-
const isRemoteEdgeConnected = Math.abs(thisWinEndY - remoteWinStartY) < tolerance || Math.abs(thisWinStartY - remoteWinEndY) < tolerance;
|
|
358
|
-
const isStackResize = allowDistantResize ? isRemoteOnSameLane && isRemoteOutside : isRemoteOnSameLane && isRemoteEdgeConnected;
|
|
359
|
-
if (isStackResize) {
|
|
360
|
-
remoteWin.setResizeAction("e");
|
|
361
|
-
}
|
|
1150
|
+
const isRemoteConneted = resizeCase.whenDraggingEast(dependencies);
|
|
1151
|
+
if (isRemoteConneted)
|
|
1152
|
+
attachAdjacentGridBehavior(remoteWin.windowId, visited);
|
|
362
1153
|
}
|
|
363
1154
|
if (currentResize === "w") {
|
|
364
|
-
const
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
if (isEdgeResize) {
|
|
368
|
-
remoteWin.setResizeAction("e");
|
|
369
|
-
}
|
|
370
|
-
const isRemoteOnSameLane = Math.abs(thisWinEndX - remoteWinEndX) < tolerance && Math.abs(thisWinStartX - remoteWinStartX) < tolerance;
|
|
371
|
-
const isRemoteEdgeConnected = Math.abs(thisWinEndY - remoteWinStartY) < tolerance || Math.abs(thisWinStartY - remoteWinEndY) < tolerance;
|
|
372
|
-
const isStackResize = allowDistantResize ? isRemoteOnSameLane && isRemoteOutside : isRemoteOnSameLane && isRemoteEdgeConnected;
|
|
373
|
-
if (isStackResize) {
|
|
374
|
-
remoteWin.setResizeAction("w");
|
|
375
|
-
}
|
|
1155
|
+
const isRemoteConneted = resizeCase.whenDragginWest(dependencies);
|
|
1156
|
+
if (isRemoteConneted)
|
|
1157
|
+
attachAdjacentGridBehavior(remoteWin.windowId, visited);
|
|
376
1158
|
}
|
|
377
1159
|
if (currentResize === "n") {
|
|
378
|
-
const
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
if (isEdgeResize) {
|
|
382
|
-
remoteWin.setResizeAction("s");
|
|
383
|
-
}
|
|
384
|
-
const isRemoteOnSameLane = Math.abs(thisWinEndY - remoteWinEndY) < tolerance && Math.abs(thisWinStartY - remoteWinStartY) < tolerance;
|
|
385
|
-
const isRemoteEdgeConnected = Math.abs(thisWinEndX - remoteWinStartX) < tolerance || Math.abs(thisWinStartX - remoteWinEndX) < tolerance;
|
|
386
|
-
const isStackResize = allowDistantResize ? isRemoteOnSameLane && isRemoteOutside : isRemoteOnSameLane && isRemoteEdgeConnected;
|
|
387
|
-
if (isStackResize) {
|
|
388
|
-
remoteWin.setResizeAction("n");
|
|
389
|
-
}
|
|
1160
|
+
const isRemoteConneted = resizeCase.whenDragginNorth(dependencies);
|
|
1161
|
+
if (isRemoteConneted)
|
|
1162
|
+
attachAdjacentGridBehavior(remoteWin.windowId, visited);
|
|
390
1163
|
}
|
|
391
1164
|
if (currentResize === "s") {
|
|
392
|
-
const
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
1165
|
+
const isRemoteConneted = resizeCase.whenDraggingSouth(dependencies);
|
|
1166
|
+
if (isRemoteConneted)
|
|
1167
|
+
attachAdjacentGridBehavior(remoteWin.windowId, visited);
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
};
|
|
1171
|
+
var resizeCase = {
|
|
1172
|
+
whenDraggingEast: (d) => {
|
|
1173
|
+
const isOppositeEdgeAlignedOnXAxis = Math.abs(d.thisWinEndX - d.remoteWinStartX) <= tolerance;
|
|
1174
|
+
const isOverlapOnYAxis = d.thisWinStartY <= d.remoteWinEndY && d.thisWinEndY >= d.remoteWinStartY;
|
|
1175
|
+
const isEdgeResize = isOppositeEdgeAlignedOnXAxis && isOverlapOnYAxis;
|
|
1176
|
+
if (isEdgeResize) {
|
|
1177
|
+
resizeApi.startResize(d.remoteId, "w");
|
|
1178
|
+
return true;
|
|
1179
|
+
}
|
|
1180
|
+
const isSameEdgeAlignedOnXAxis = Math.abs(d.thisWinEndX - d.remoteWinEndX) <= tolerance;
|
|
1181
|
+
const isRemoteNorthOrSouthEdgeConnected = Math.abs(d.thisWinEndY - d.remoteWinStartY) < tolerance || Math.abs(d.thisWinStartY - d.remoteWinEndY) < tolerance;
|
|
1182
|
+
const isStackResize = isSameEdgeAlignedOnXAxis && isRemoteNorthOrSouthEdgeConnected;
|
|
1183
|
+
if (isStackResize) {
|
|
1184
|
+
resizeApi.startResize(d.remoteId, "e");
|
|
1185
|
+
return true;
|
|
1186
|
+
}
|
|
1187
|
+
return false;
|
|
1188
|
+
},
|
|
1189
|
+
whenDragginWest: (d) => {
|
|
1190
|
+
const isOppositeEdgeAlignedOnXAxis = Math.abs(d.thisWinStartX - d.remoteWinEndX) <= tolerance;
|
|
1191
|
+
const isOverlapOnYAxis = d.thisWinStartY <= d.remoteWinEndY && d.thisWinEndY >= d.remoteWinStartY;
|
|
1192
|
+
const isEdgeResize = isOppositeEdgeAlignedOnXAxis && isOverlapOnYAxis;
|
|
1193
|
+
if (isEdgeResize) {
|
|
1194
|
+
resizeApi.startResize(d.remoteId, "e");
|
|
1195
|
+
return true;
|
|
1196
|
+
}
|
|
1197
|
+
const isSameEdgeAlignedOnXAxis = Math.abs(d.thisWinStartX - d.remoteWinStartX) <= tolerance;
|
|
1198
|
+
const isRemoteNorthOrSouthEdgeConnected = Math.abs(d.thisWinEndY - d.remoteWinStartY) < tolerance || Math.abs(d.thisWinStartY - d.remoteWinEndY) < tolerance;
|
|
1199
|
+
const isStackResize = isSameEdgeAlignedOnXAxis && isRemoteNorthOrSouthEdgeConnected;
|
|
1200
|
+
if (isStackResize) {
|
|
1201
|
+
resizeApi.startResize(d.remoteId, "w");
|
|
1202
|
+
return true;
|
|
1203
|
+
}
|
|
1204
|
+
return false;
|
|
1205
|
+
},
|
|
1206
|
+
whenDragginNorth: (d) => {
|
|
1207
|
+
const isOppositeEdgeAlignedOnYAxis = Math.abs(d.thisWinStartY - d.remoteWinEndY) <= tolerance;
|
|
1208
|
+
const isOverlapOnXAxis = d.thisWinStartX <= d.remoteWinEndX && d.thisWinEndX >= d.remoteWinStartX;
|
|
1209
|
+
const isEdgeResize = isOppositeEdgeAlignedOnYAxis && isOverlapOnXAxis;
|
|
1210
|
+
if (isEdgeResize) {
|
|
1211
|
+
resizeApi.startResize(d.remoteId, "s");
|
|
1212
|
+
return true;
|
|
1213
|
+
}
|
|
1214
|
+
const isSameEdgeAlignedOnYAxis = Math.abs(d.thisWinStartY - d.remoteWinStartY) <= tolerance;
|
|
1215
|
+
const isRemoteEastOrWestEdgeConnected = Math.abs(d.thisWinEndX - d.remoteWinStartX) < tolerance || Math.abs(d.thisWinStartX - d.remoteWinEndX) < tolerance;
|
|
1216
|
+
const isStackResize = isSameEdgeAlignedOnYAxis && isRemoteEastOrWestEdgeConnected;
|
|
1217
|
+
if (isStackResize) {
|
|
1218
|
+
resizeApi.startResize(d.remoteId, "n");
|
|
1219
|
+
return true;
|
|
1220
|
+
}
|
|
1221
|
+
return false;
|
|
1222
|
+
},
|
|
1223
|
+
whenDraggingSouth: (d) => {
|
|
1224
|
+
const isOppositeEdgeAlignedOnYAxis = Math.abs(d.thisWinEndY - d.remoteWinStartY) <= tolerance;
|
|
1225
|
+
const isOverlapOnXAxis = d.thisWinStartX <= d.remoteWinEndX && d.thisWinEndX >= d.remoteWinStartX;
|
|
1226
|
+
const isEdgeResize = isOppositeEdgeAlignedOnYAxis && isOverlapOnXAxis;
|
|
1227
|
+
if (isEdgeResize) {
|
|
1228
|
+
resizeApi.startResize(d.remoteId, "n");
|
|
1229
|
+
return true;
|
|
404
1230
|
}
|
|
1231
|
+
const isSameEdgeAlignedOnYAxis = Math.abs(d.thisWinEndY - d.remoteWinEndY) <= tolerance;
|
|
1232
|
+
const isRemoteEastOrWestEdgeConnected = Math.abs(d.thisWinEndX - d.remoteWinStartX) < tolerance || Math.abs(d.thisWinStartX - d.remoteWinEndX) < tolerance;
|
|
1233
|
+
const isStackResize = isSameEdgeAlignedOnYAxis && isRemoteEastOrWestEdgeConnected;
|
|
1234
|
+
if (isStackResize) {
|
|
1235
|
+
resizeApi.startResize(d.remoteId, "s");
|
|
1236
|
+
return true;
|
|
1237
|
+
}
|
|
1238
|
+
return false;
|
|
405
1239
|
}
|
|
406
1240
|
};
|
|
1241
|
+
var buildDependencies = (thisWin, remoteWin) => {
|
|
1242
|
+
const thisWinStartY = thisWin.winCoord.pointY;
|
|
1243
|
+
const thisWinEndY = thisWin.winCoord.pointY + thisWin.winHeight;
|
|
1244
|
+
const remoteWinStartY = remoteWin.winCoord.pointY;
|
|
1245
|
+
const remoteWinEndY = remoteWin.winCoord.pointY + remoteWin.winHeight;
|
|
1246
|
+
const thisWinStartX = thisWin.winCoord.pointX;
|
|
1247
|
+
const thisWinEndX = thisWin.winCoord.pointX + thisWin.winWidth;
|
|
1248
|
+
const remoteWinStartX = remoteWin.winCoord.pointX;
|
|
1249
|
+
const remoteWinEndX = remoteWin.winCoord.pointX + remoteWin.winWidth;
|
|
1250
|
+
const isRemoteOutside = remoteWinEndY !== thisWinEndY || remoteWinEndX !== thisWinEndX || remoteWinStartY !== thisWinStartY || remoteWinStartX !== thisWinStartX;
|
|
1251
|
+
return {
|
|
1252
|
+
remoteId: remoteWin.windowId,
|
|
1253
|
+
thisWinStartY,
|
|
1254
|
+
thisWinEndY,
|
|
1255
|
+
remoteWinStartY,
|
|
1256
|
+
remoteWinEndY,
|
|
1257
|
+
thisWinStartX,
|
|
1258
|
+
thisWinEndX,
|
|
1259
|
+
remoteWinStartX,
|
|
1260
|
+
remoteWinEndX,
|
|
1261
|
+
isRemoteOutside
|
|
1262
|
+
};
|
|
1263
|
+
};
|
|
1264
|
+
var getDraggingWinCount = () => {
|
|
1265
|
+
let isWindowResizingCount = 0;
|
|
1266
|
+
for (const key of Object.keys(windowRegistry))
|
|
1267
|
+
if (windowRegistry[key].getState().resizeAction)
|
|
1268
|
+
isWindowResizingCount++;
|
|
1269
|
+
return isWindowResizingCount;
|
|
1270
|
+
};
|
|
1271
|
+
var getOpenWinCount = () => {
|
|
1272
|
+
let openWnidowCount = 0;
|
|
1273
|
+
for (const key of Object.keys(windowRegistry))
|
|
1274
|
+
if (!windowRegistry[key].getState().isWindowClosed)
|
|
1275
|
+
openWnidowCount++;
|
|
1276
|
+
return openWnidowCount;
|
|
1277
|
+
};
|
|
407
1278
|
|
|
408
1279
|
// src/window-manager/internal/features/resizing/resizing-controls.tsx
|
|
409
|
-
import { Fragment, jsx as
|
|
1280
|
+
import { Fragment as Fragment4, jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
410
1281
|
function ResizingControls({ winId }) {
|
|
411
|
-
const { x, y } = useCursorState();
|
|
412
1282
|
const { winCoord, winWidth, winHeight, resizeAction } = windowRegistry[winId]();
|
|
413
|
-
|
|
414
|
-
resizeApi.
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
1283
|
+
const startResize = (direction) => {
|
|
1284
|
+
resizeApi.startResize(winId, direction);
|
|
1285
|
+
gridOrchestrator.attachAdjacentGridBehavior(winId);
|
|
1286
|
+
};
|
|
1287
|
+
const stopResize = () => {
|
|
1288
|
+
resizeApi.stopResize(winId);
|
|
419
1289
|
};
|
|
420
|
-
return /* @__PURE__ */
|
|
421
|
-
/* @__PURE__ */
|
|
1290
|
+
return /* @__PURE__ */ jsxs3(Fragment4, { children: [
|
|
1291
|
+
/* @__PURE__ */ jsx6(
|
|
422
1292
|
"span",
|
|
423
1293
|
{
|
|
424
|
-
|
|
425
|
-
|
|
1294
|
+
onPointerUp: stopResize,
|
|
1295
|
+
onPointerDown: () => startResize("e"),
|
|
426
1296
|
id: "win-resize-right-width",
|
|
427
|
-
className:
|
|
1297
|
+
className: `fixed w-2 ${resizeAction === "e" ? "opacity-50" : ""} opacity-0 mix-blend-difference cursor-w-resize z-10 flex-col flex justify-center items-center overflow-hidden`,
|
|
428
1298
|
style: {
|
|
429
1299
|
top: `${winCoord.pointY}px`,
|
|
430
1300
|
left: `${winCoord.pointX + winWidth - 4}px`,
|
|
431
1301
|
height: `${winHeight}px`
|
|
432
|
-
}
|
|
1302
|
+
},
|
|
1303
|
+
children: /* @__PURE__ */ jsx6("div", { className: `w-1 h-full bg-zinc-50` })
|
|
433
1304
|
}
|
|
434
1305
|
),
|
|
435
|
-
/* @__PURE__ */
|
|
1306
|
+
/* @__PURE__ */ jsx6(
|
|
436
1307
|
"span",
|
|
437
1308
|
{
|
|
438
|
-
|
|
439
|
-
|
|
1309
|
+
onPointerUp: stopResize,
|
|
1310
|
+
onPointerDown: () => startResize("w"),
|
|
440
1311
|
id: "win-resize-left-width",
|
|
441
|
-
className:
|
|
1312
|
+
className: `fixed w-2 ${resizeAction === "w" ? "opacity-50" : ""} opacity-0 mix-blend-difference cursor-w-resize z-10 flex-col flex justify-center items-center`,
|
|
442
1313
|
style: {
|
|
443
1314
|
top: `${winCoord.pointY}px`,
|
|
444
1315
|
left: `${winCoord.pointX - 4}px`,
|
|
445
1316
|
height: `${winHeight}px`
|
|
446
|
-
}
|
|
1317
|
+
},
|
|
1318
|
+
children: /* @__PURE__ */ jsx6("div", { className: `w-1 h-full bg-zinc-50` })
|
|
447
1319
|
}
|
|
448
1320
|
),
|
|
449
|
-
/* @__PURE__ */
|
|
1321
|
+
/* @__PURE__ */ jsx6(
|
|
450
1322
|
"span",
|
|
451
1323
|
{
|
|
452
|
-
|
|
453
|
-
|
|
1324
|
+
onPointerUp: stopResize,
|
|
1325
|
+
onPointerDown: () => startResize("s"),
|
|
454
1326
|
id: "win-resize-bottom-height",
|
|
455
|
-
className:
|
|
1327
|
+
className: `fixed h-2 ${resizeAction === "s" ? "opacity-50" : ""} opacity-0 mix-blend-difference cursor-s-resize z-10 flex justify-center items-center`,
|
|
456
1328
|
style: {
|
|
457
|
-
top: `${winCoord.pointY + winHeight -
|
|
1329
|
+
top: `${winCoord.pointY + winHeight - 4}px`,
|
|
458
1330
|
left: `${winCoord.pointX}px`,
|
|
459
1331
|
width: `${winWidth}px`
|
|
460
|
-
}
|
|
1332
|
+
},
|
|
1333
|
+
children: /* @__PURE__ */ jsx6("div", { className: `w-full h-1 bg-zinc-50` })
|
|
461
1334
|
}
|
|
462
1335
|
),
|
|
463
|
-
/* @__PURE__ */
|
|
1336
|
+
/* @__PURE__ */ jsx6(
|
|
464
1337
|
"span",
|
|
465
1338
|
{
|
|
466
|
-
|
|
467
|
-
|
|
1339
|
+
onPointerUp: stopResize,
|
|
1340
|
+
onPointerDown: () => startResize("n"),
|
|
468
1341
|
id: "win-resize-top-height",
|
|
469
|
-
className:
|
|
1342
|
+
className: `fixed h-2 ${resizeAction === "n" ? "opacity-50" : ""} opacity-0 mix-blend-difference cursor-s-resize z-10 flex justify-center items-center`,
|
|
470
1343
|
style: {
|
|
471
|
-
top: `${winCoord.pointY -
|
|
1344
|
+
top: `${winCoord.pointY - 4}px`,
|
|
472
1345
|
left: `${winCoord.pointX}px`,
|
|
473
1346
|
width: `${winWidth}px`
|
|
474
|
-
}
|
|
1347
|
+
},
|
|
1348
|
+
children: /* @__PURE__ */ jsx6("div", { className: `w-full h-1 bg-zinc-50` })
|
|
475
1349
|
}
|
|
476
1350
|
),
|
|
477
|
-
/* @__PURE__ */
|
|
1351
|
+
/* @__PURE__ */ jsx6(
|
|
478
1352
|
"span",
|
|
479
1353
|
{
|
|
480
|
-
|
|
481
|
-
|
|
1354
|
+
onPointerUp: stopResize,
|
|
1355
|
+
onPointerDown: () => startResize("se"),
|
|
482
1356
|
id: "win-resize-bottom-right-all",
|
|
483
1357
|
className: "fixed h-3 w-3 opacity-60 cursor-se-resize z-20",
|
|
484
1358
|
style: {
|
|
@@ -487,11 +1361,11 @@ function ResizingControls({ winId }) {
|
|
|
487
1361
|
}
|
|
488
1362
|
}
|
|
489
1363
|
),
|
|
490
|
-
/* @__PURE__ */
|
|
1364
|
+
/* @__PURE__ */ jsx6(
|
|
491
1365
|
"span",
|
|
492
1366
|
{
|
|
493
|
-
|
|
494
|
-
|
|
1367
|
+
onPointerUp: stopResize,
|
|
1368
|
+
onPointerDown: () => startResize("sw"),
|
|
495
1369
|
id: "win-resize-bottom-left-all",
|
|
496
1370
|
className: "fixed h-3 w-3 opacity-60 cursor-sw-resize z-20",
|
|
497
1371
|
style: {
|
|
@@ -500,11 +1374,11 @@ function ResizingControls({ winId }) {
|
|
|
500
1374
|
}
|
|
501
1375
|
}
|
|
502
1376
|
),
|
|
503
|
-
/* @__PURE__ */
|
|
1377
|
+
/* @__PURE__ */ jsx6(
|
|
504
1378
|
"span",
|
|
505
1379
|
{
|
|
506
|
-
|
|
507
|
-
|
|
1380
|
+
onPointerUp: stopResize,
|
|
1381
|
+
onPointerDown: () => startResize("ne"),
|
|
508
1382
|
id: "win-resize-top-right-all",
|
|
509
1383
|
className: "fixed h-3 w-3 opacity-60 cursor-ne-resize z-20",
|
|
510
1384
|
style: {
|
|
@@ -513,11 +1387,11 @@ function ResizingControls({ winId }) {
|
|
|
513
1387
|
}
|
|
514
1388
|
}
|
|
515
1389
|
),
|
|
516
|
-
/* @__PURE__ */
|
|
1390
|
+
/* @__PURE__ */ jsx6(
|
|
517
1391
|
"span",
|
|
518
1392
|
{
|
|
519
|
-
|
|
520
|
-
|
|
1393
|
+
onPointerUp: stopResize,
|
|
1394
|
+
onPointerDown: () => startResize("nw"),
|
|
521
1395
|
id: "win-resize-top-left-all",
|
|
522
1396
|
className: "fixed h-3 w-3 opacity-60 cursor-nw-resize z-20",
|
|
523
1397
|
style: {
|
|
@@ -530,63 +1404,40 @@ function ResizingControls({ winId }) {
|
|
|
530
1404
|
}
|
|
531
1405
|
|
|
532
1406
|
// src/window-manager/internal/features/drag/drag-handle.tsx
|
|
533
|
-
import {
|
|
534
|
-
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
1407
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
535
1408
|
function DragHandle({ winId }) {
|
|
536
|
-
|
|
537
|
-
const { winVisualState, isDragging, winCoord, setWinCoord, setIsDragging } = windowRegistry[winId]();
|
|
538
|
-
const [dragClickOffset, setDragClickOffset] = useState({
|
|
539
|
-
pointX: wsApi.getRect().left,
|
|
540
|
-
pointY: wsApi.getRect().top
|
|
541
|
-
});
|
|
542
|
-
useEffect2(() => {
|
|
543
|
-
if (wsApi.isBelowBreakPoint())
|
|
544
|
-
return;
|
|
545
|
-
if (!isDragging)
|
|
546
|
-
return;
|
|
547
|
-
if (winVisualState === "maximized")
|
|
548
|
-
dockApi.demaximizeWindow(winId);
|
|
549
|
-
const wsRect = wsApi.getRect();
|
|
550
|
-
let adjustedX = x - dragClickOffset.pointX;
|
|
551
|
-
if (x > wsRect.right || x < wsRect.left)
|
|
552
|
-
adjustedX = winCoord.pointX;
|
|
553
|
-
let adjustedY = y - dragClickOffset.pointY;
|
|
554
|
-
if (y > wsRect.bottom || y < wsRect.top)
|
|
555
|
-
adjustedY = winCoord.pointY;
|
|
556
|
-
setWinCoord({ pointX: adjustedX, pointY: adjustedY });
|
|
557
|
-
}, [isDragging, x, y]);
|
|
558
|
-
const startDrag = (isDragging2) => {
|
|
559
|
-
setDragClickOffset({ pointX: x - winCoord.pointX, pointY: y - winCoord.pointY });
|
|
560
|
-
setIsDragging(isDragging2);
|
|
561
|
-
};
|
|
562
|
-
return /* @__PURE__ */ jsx3(
|
|
1409
|
+
return /* @__PURE__ */ jsx7(
|
|
563
1410
|
"div",
|
|
564
1411
|
{
|
|
565
|
-
|
|
566
|
-
|
|
1412
|
+
onPointerDown: () => dragApi.startDrag(winId),
|
|
1413
|
+
onPointerUp: () => dragApi.stopDrag(winId),
|
|
567
1414
|
onDoubleClick: () => dockApi.maximizeWindow(winId),
|
|
568
|
-
className:
|
|
1415
|
+
className: `
|
|
1416
|
+
grow min-w-8 h-8 px-2 text-white flex items-center text-sm bg-zinc-100 bg-opacity-0
|
|
1417
|
+
hover:bg-opacity-20 hover:mix-blend-overlay`
|
|
569
1418
|
}
|
|
570
1419
|
);
|
|
571
1420
|
}
|
|
572
1421
|
|
|
573
1422
|
// src/window-manager/internal/features/window-layout.tsx
|
|
574
|
-
import { Fragment as
|
|
1423
|
+
import { Fragment as Fragment5, jsx as jsx8, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
575
1424
|
function WindowLayout({
|
|
576
1425
|
children,
|
|
577
1426
|
windowName,
|
|
578
1427
|
navbarChildren,
|
|
1428
|
+
navbarClassName,
|
|
1429
|
+
className,
|
|
579
1430
|
winId,
|
|
580
1431
|
defaultDock = "default",
|
|
581
1432
|
style
|
|
582
1433
|
}) {
|
|
583
|
-
const {
|
|
584
|
-
const windowRef =
|
|
1434
|
+
const { wsElement, wsRect, isBelowBreakPoint } = useWorkspaceState();
|
|
1435
|
+
const windowRef = useRef2(null);
|
|
585
1436
|
const {
|
|
586
1437
|
windowId,
|
|
587
1438
|
zIndex,
|
|
588
1439
|
isActive,
|
|
589
|
-
|
|
1440
|
+
setWinElement,
|
|
590
1441
|
resetFlag,
|
|
591
1442
|
winVisualState,
|
|
592
1443
|
isWindowClosed,
|
|
@@ -594,14 +1445,16 @@ function WindowLayout({
|
|
|
594
1445
|
winWidth,
|
|
595
1446
|
winHeight
|
|
596
1447
|
} = windowRegistry[winId]();
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
1448
|
+
useEffect4(() => {
|
|
1449
|
+
setWinElement(windowRef.current);
|
|
1450
|
+
}, [setWinElement, windowRef.current]);
|
|
1451
|
+
useEffect4(() => {
|
|
1452
|
+
if (isBelowBreakPoint) {
|
|
600
1453
|
dockApi.maximizeWindow(winId);
|
|
601
|
-
|
|
1454
|
+
} else {
|
|
1455
|
+
dockingRoutes[defaultDock](winId);
|
|
602
1456
|
}
|
|
603
|
-
|
|
604
|
-
}, [setSelf, windowRef, resetFlag, wsRef]);
|
|
1457
|
+
}, [wsElement, resetFlag]);
|
|
605
1458
|
const dockingRoutes = {
|
|
606
1459
|
right: dockApi.dockWindowRight,
|
|
607
1460
|
left: dockApi.dockWindowLeft,
|
|
@@ -614,37 +1467,37 @@ function WindowLayout({
|
|
|
614
1467
|
"bottom-left": dockApi.dockWindowBottomLeft,
|
|
615
1468
|
default: dockApi.demaximizeWindow
|
|
616
1469
|
};
|
|
617
|
-
const maximizeControl = winVisualState === "maximized" ? /* @__PURE__ */
|
|
1470
|
+
const maximizeControl = winVisualState === "maximized" ? /* @__PURE__ */ jsx8(
|
|
618
1471
|
"button",
|
|
619
1472
|
{
|
|
620
1473
|
className: `block hover:bg-gray-500 hover:bg-opacity-10 px-5 h-full`,
|
|
621
1474
|
onClick: () => dockApi.demaximizeWindow(winId),
|
|
622
|
-
children: /* @__PURE__ */
|
|
1475
|
+
children: /* @__PURE__ */ jsx8(IconWinDemaximize, { color: style?.navControlsColor })
|
|
623
1476
|
}
|
|
624
|
-
) : /* @__PURE__ */
|
|
1477
|
+
) : /* @__PURE__ */ jsx8(
|
|
625
1478
|
"button",
|
|
626
1479
|
{
|
|
627
1480
|
className: `block hover:bg-gray-500 hover:bg-opacity-10 px-5 h-full`,
|
|
628
1481
|
onClick: () => dockApi.maximizeWindow(winId),
|
|
629
|
-
children: /* @__PURE__ */
|
|
1482
|
+
children: /* @__PURE__ */ jsx8(IconWinMaximize, { color: style?.navControlsColor })
|
|
630
1483
|
}
|
|
631
1484
|
);
|
|
632
|
-
const closeControl = /* @__PURE__ */
|
|
1485
|
+
const closeControl = /* @__PURE__ */ jsx8(
|
|
633
1486
|
"button",
|
|
634
1487
|
{
|
|
635
1488
|
className: "hover:bg-red-500 hover:bg-opacity-20 px-5 h-full",
|
|
636
|
-
onClick: () =>
|
|
637
|
-
children: /* @__PURE__ */
|
|
1489
|
+
onClick: () => focusApi.closeWindowAndRefocus(winId),
|
|
1490
|
+
children: /* @__PURE__ */ jsx8(IconWinMinimize, { color: style?.navControlsColor })
|
|
638
1491
|
}
|
|
639
1492
|
);
|
|
640
|
-
return /* @__PURE__ */
|
|
641
|
-
/* @__PURE__ */
|
|
1493
|
+
return /* @__PURE__ */ jsxs4(Fragment5, { children: [
|
|
1494
|
+
/* @__PURE__ */ jsxs4(
|
|
642
1495
|
"div",
|
|
643
1496
|
{
|
|
644
1497
|
id: windowId,
|
|
645
1498
|
ref: windowRef,
|
|
646
|
-
className: `fixed bg-white shadow-lg border border-zinc-600 rounded-sm
|
|
647
|
-
|
|
1499
|
+
className: `fixed overflow-hidden ${className ? className : "bg-white shadow-lg border border-zinc-600 rounded-sm"} `,
|
|
1500
|
+
onPointerDown: () => focusApi.bringWindowToFocus(windowId),
|
|
648
1501
|
style: {
|
|
649
1502
|
backgroundColor: style?.windowBackgroundColor,
|
|
650
1503
|
top: `${winCoord.pointY}px`,
|
|
@@ -655,30 +1508,30 @@ function WindowLayout({
|
|
|
655
1508
|
/* MINIMIZE LOGIC */
|
|
656
1509
|
transition: "transform 0.2s ease-in-out, opacity 0.3s ease-in-out",
|
|
657
1510
|
opacity: isWindowClosed ? 0 : 1,
|
|
658
|
-
transform: isWindowClosed ? `translate(${
|
|
659
|
-
${
|
|
1511
|
+
transform: isWindowClosed ? `translate(${wsRect.innerWidth / 2 - winCoord.pointX - winWidth / 2}px,
|
|
1512
|
+
${wsRect.innerHeight - winCoord.pointY - winHeight / 2}px) scale(0.02)` : ""
|
|
660
1513
|
},
|
|
661
1514
|
children: [
|
|
662
|
-
/* @__PURE__ */
|
|
1515
|
+
/* @__PURE__ */ jsxs4(
|
|
663
1516
|
"nav",
|
|
664
1517
|
{
|
|
665
1518
|
style: {
|
|
666
1519
|
backgroundColor: style?.navBackgroundColor
|
|
667
1520
|
},
|
|
668
|
-
className: `
|
|
669
|
-
|
|
670
|
-
|
|
1521
|
+
className: `h-[32px] w-full flex items-center
|
|
1522
|
+
${navbarClassName ? navbarClassName : `bg-neutral-800 ${isActive ? "brightness-100" : "brightness-150"}`}
|
|
1523
|
+
`,
|
|
671
1524
|
children: [
|
|
672
|
-
/* @__PURE__ */
|
|
673
|
-
/* @__PURE__ */
|
|
674
|
-
/* @__PURE__ */
|
|
675
|
-
!
|
|
1525
|
+
/* @__PURE__ */ jsx8("div", { className: "shrink h-8 px-2 text-white flex items-center text-sm truncate min-w-0", children: windowName }),
|
|
1526
|
+
/* @__PURE__ */ jsx8("div", { className: "h-8 px-2 text-white flex items-center text-sm truncate min-w-0", children: navbarChildren }),
|
|
1527
|
+
/* @__PURE__ */ jsx8(DragHandle, { winId }),
|
|
1528
|
+
!isBelowBreakPoint && maximizeControl,
|
|
676
1529
|
closeControl
|
|
677
1530
|
]
|
|
678
1531
|
}
|
|
679
1532
|
),
|
|
680
|
-
|
|
681
|
-
/* @__PURE__ */
|
|
1533
|
+
/* @__PURE__ */ jsx8(ResizingControls, { winId }),
|
|
1534
|
+
/* @__PURE__ */ jsx8("div", { className: `relative w-full h-[calc(100%-32px)] overflow-auto select-text`, children })
|
|
682
1535
|
]
|
|
683
1536
|
}
|
|
684
1537
|
),
|
|
@@ -687,367 +1540,72 @@ function WindowLayout({
|
|
|
687
1540
|
}
|
|
688
1541
|
|
|
689
1542
|
// src/window-manager/internal/features/window-button.tsx
|
|
690
|
-
import { jsx as
|
|
1543
|
+
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
691
1544
|
function WindowButton({
|
|
692
1545
|
children,
|
|
693
1546
|
winId,
|
|
694
1547
|
className,
|
|
695
|
-
isClosedClassName = "brightness-[85%]",
|
|
696
|
-
isOpenClassName = "brightness-150"
|
|
1548
|
+
isClosedClassName = "brightness-[85%] border-t-2 border-t-transparent",
|
|
1549
|
+
isOpenClassName = "brightness-150 border-t-2 border-t-transparent",
|
|
1550
|
+
isActiveClassName = "brightness-150 border-t-2 border-zinc-400 bg-zinc-50/10"
|
|
697
1551
|
}) {
|
|
698
1552
|
const { isWindowClosed, windowId, isActive } = windowRegistry[winId]();
|
|
699
1553
|
const handleOpenCloseWin = () => {
|
|
700
|
-
if (isWindowClosed) {
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
1554
|
+
if (!isWindowClosed && isActive) {
|
|
1555
|
+
focusApi.closeWindowAndRefocus(windowId);
|
|
1556
|
+
} else {
|
|
1557
|
+
focusApi.bringWindowToFocus(windowId);
|
|
704
1558
|
}
|
|
705
|
-
if (isActive)
|
|
706
|
-
dockApi.closeWindow(winId);
|
|
707
|
-
stackApi.bringTargetWindowToFront(windowId);
|
|
708
1559
|
};
|
|
709
|
-
return /* @__PURE__ */
|
|
1560
|
+
return /* @__PURE__ */ jsx9(
|
|
710
1561
|
"button",
|
|
711
1562
|
{
|
|
712
1563
|
id: `${windowId}_button`,
|
|
713
1564
|
onClick: handleOpenCloseWin,
|
|
714
1565
|
className: `
|
|
715
1566
|
${className}
|
|
716
|
-
${isWindowClosed ? isClosedClassName : isOpenClassName}
|
|
1567
|
+
${isWindowClosed ? isClosedClassName : isActive ? isActiveClassName : isOpenClassName}
|
|
1568
|
+
`,
|
|
717
1569
|
children
|
|
718
1570
|
}
|
|
719
1571
|
);
|
|
720
1572
|
}
|
|
721
1573
|
|
|
722
1574
|
// src/window-manager/registration/window-store-factory.tsx
|
|
723
|
-
import { jsx as
|
|
724
|
-
var
|
|
725
|
-
var
|
|
726
|
-
var windowRegistry = {};
|
|
1575
|
+
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
1576
|
+
var defaultMinWidth = 232;
|
|
1577
|
+
var defaultMinHeight = 128;
|
|
727
1578
|
var createWindowStore = () => {
|
|
728
1579
|
const zIndexAtLaunch = Object.keys(windowRegistry).length + 1;
|
|
729
1580
|
const windowInstanceId = `react-dynamic-window-instance${Object.keys(windowRegistry).length}`;
|
|
730
1581
|
const storeInstance = create3((set, get) => ({
|
|
1582
|
+
setWinElement: (ref) => set({ winElement: ref }),
|
|
1583
|
+
winElement: void 0,
|
|
731
1584
|
windowId: windowInstanceId,
|
|
732
|
-
self: void 0,
|
|
733
|
-
setSelf: (ref) => set({ self: ref }),
|
|
734
|
-
WIN_MIN_WIDTH: windownMinWidth,
|
|
735
|
-
setWIN_MIN_WIDTH: (w) => set({ WIN_MIN_WIDTH: w }),
|
|
736
|
-
WIN_MIN_HEIGHT: windownMinHeight,
|
|
737
|
-
setWIN_MIN_HEIGHT: (h) => set({ WIN_MIN_HEIGHT: h }),
|
|
738
|
-
isActive: false,
|
|
739
|
-
setIsActive: (isActive) => {
|
|
740
|
-
useWorkspaceState.getState().setActiveWindowId(get().windowId);
|
|
741
|
-
set({ isActive });
|
|
742
|
-
},
|
|
743
1585
|
resetFlag: false,
|
|
744
|
-
reset: () => set({ resetFlag: !get().resetFlag, isWindowClosed: true }),
|
|
745
1586
|
zIndex: zIndexAtLaunch,
|
|
746
|
-
|
|
1587
|
+
winCoord: { pointX: 40, pointY: 40 },
|
|
747
1588
|
winVisualState: "demaximized",
|
|
748
|
-
|
|
1589
|
+
isActive: false,
|
|
1590
|
+
isDragging: false,
|
|
749
1591
|
isWindowClosed: true,
|
|
750
|
-
setisWindowClosed: (isClosed) => set({ isWindowClosed: isClosed }),
|
|
751
|
-
winCoord: { pointX: 40, pointY: 40 },
|
|
752
|
-
setWinCoord: (newWinCoord) => set({ winCoord: { pointX: newWinCoord.pointX, pointY: newWinCoord.pointY } }),
|
|
753
|
-
winWidth: windownMinWidth,
|
|
754
|
-
setWinWidth: (newWinWidth) => set({ winWidth: newWinWidth }),
|
|
755
|
-
winHeight: windownMinHeight,
|
|
756
|
-
setWinHeight: (newWinHeight) => set({ winHeight: newWinHeight }),
|
|
757
1592
|
resizeAction: false,
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
1593
|
+
winWidth: defaultMinWidth,
|
|
1594
|
+
winHeight: defaultMinHeight,
|
|
1595
|
+
WIN_MIN_WIDTH: defaultMinWidth,
|
|
1596
|
+
WIN_MIN_HEIGHT: defaultMinHeight
|
|
761
1597
|
}));
|
|
762
1598
|
windowRegistry[windowInstanceId] = storeInstance;
|
|
763
1599
|
return {
|
|
764
1600
|
id: storeInstance.getState().windowId,
|
|
765
1601
|
store: storeInstance,
|
|
766
|
-
Window: (props) => /* @__PURE__ */
|
|
767
|
-
Button: (props) => /* @__PURE__ */
|
|
1602
|
+
Window: (props) => /* @__PURE__ */ jsx10(WindowLayout, { ...props, winId: windowInstanceId }),
|
|
1603
|
+
Button: (props) => /* @__PURE__ */ jsx10(WindowButton, { ...props, winId: windowInstanceId })
|
|
768
1604
|
};
|
|
769
1605
|
};
|
|
770
|
-
|
|
771
|
-
// src/window-manager/internal/features/docking/docking-api.ts
|
|
772
|
-
var dockApi = {
|
|
773
|
-
dockWindowRight: (winId) => {
|
|
774
|
-
windowRegistry[winId].setState({
|
|
775
|
-
winCoord: { pointX: wsApi.getRect().centerX, pointY: wsApi.getRect().top },
|
|
776
|
-
winWidth: wsApi.getRect().innerWidth / 2,
|
|
777
|
-
winHeight: wsApi.getRect().innerHeight,
|
|
778
|
-
winVisualState: "demaximized"
|
|
779
|
-
});
|
|
780
|
-
},
|
|
781
|
-
dockWindowLeft: (winId) => {
|
|
782
|
-
windowRegistry[winId].setState({
|
|
783
|
-
winCoord: { pointX: wsApi.getRect().left, pointY: wsApi.getRect().top },
|
|
784
|
-
winWidth: wsApi.getRect().innerWidth / 2,
|
|
785
|
-
winHeight: wsApi.getRect().innerHeight,
|
|
786
|
-
winVisualState: "demaximized"
|
|
787
|
-
});
|
|
788
|
-
},
|
|
789
|
-
dockWindowTop: (winId) => {
|
|
790
|
-
windowRegistry[winId].setState({
|
|
791
|
-
winCoord: { pointX: wsApi.getRect().left, pointY: wsApi.getRect().top },
|
|
792
|
-
winWidth: wsApi.getRect().innerWidth,
|
|
793
|
-
winHeight: wsApi.getRect().innerHeight / 2,
|
|
794
|
-
winVisualState: "demaximized"
|
|
795
|
-
});
|
|
796
|
-
},
|
|
797
|
-
dockWindowBottom: (winId) => {
|
|
798
|
-
windowRegistry[winId].setState({
|
|
799
|
-
winCoord: { pointX: wsApi.getRect().left, pointY: wsApi.getRect().centerY },
|
|
800
|
-
winWidth: wsApi.getRect().innerWidth,
|
|
801
|
-
winHeight: wsApi.getRect().innerHeight / 2,
|
|
802
|
-
winVisualState: "demaximized"
|
|
803
|
-
});
|
|
804
|
-
},
|
|
805
|
-
dockWindowBottomRight: (winId) => {
|
|
806
|
-
windowRegistry[winId].setState({
|
|
807
|
-
winCoord: {
|
|
808
|
-
pointX: wsApi.getRect().centerX,
|
|
809
|
-
pointY: wsApi.getRect().centerY
|
|
810
|
-
},
|
|
811
|
-
winWidth: wsApi.getRect().innerWidth / 2,
|
|
812
|
-
winHeight: wsApi.getRect().innerHeight / 2,
|
|
813
|
-
winVisualState: "demaximized"
|
|
814
|
-
});
|
|
815
|
-
},
|
|
816
|
-
dockWindowTopRight: (winId) => {
|
|
817
|
-
windowRegistry[winId].setState({
|
|
818
|
-
winCoord: { pointX: wsApi.getRect().centerX, pointY: wsApi.getRect().top },
|
|
819
|
-
winWidth: wsApi.getRect().innerWidth / 2,
|
|
820
|
-
winHeight: wsApi.getRect().innerHeight / 2,
|
|
821
|
-
winVisualState: "demaximized"
|
|
822
|
-
});
|
|
823
|
-
},
|
|
824
|
-
dockWindowBottomLeft: (winId) => {
|
|
825
|
-
windowRegistry[winId].setState({
|
|
826
|
-
winCoord: { pointX: wsApi.getRect().left, pointY: wsApi.getRect().centerY },
|
|
827
|
-
winWidth: wsApi.getRect().innerWidth / 2,
|
|
828
|
-
winHeight: wsApi.getRect().innerHeight / 2,
|
|
829
|
-
winVisualState: "demaximized"
|
|
830
|
-
});
|
|
831
|
-
},
|
|
832
|
-
dockWindowTopLeft: (winId) => {
|
|
833
|
-
windowRegistry[winId].setState({
|
|
834
|
-
winCoord: { pointX: wsApi.getRect().left, pointY: wsApi.getRect().top },
|
|
835
|
-
winWidth: wsApi.getRect().innerWidth / 2,
|
|
836
|
-
winHeight: wsApi.getRect().innerHeight / 2,
|
|
837
|
-
winVisualState: "demaximized"
|
|
838
|
-
});
|
|
839
|
-
},
|
|
840
|
-
maximizeWindow: (winId) => {
|
|
841
|
-
windowRegistry[winId].setState({
|
|
842
|
-
winCoord: { pointX: wsApi.getRect().left, pointY: wsApi.getRect().top },
|
|
843
|
-
winHeight: wsApi.getRect().innerHeight,
|
|
844
|
-
winWidth: wsApi.getRect().innerWidth,
|
|
845
|
-
winVisualState: "maximized"
|
|
846
|
-
});
|
|
847
|
-
},
|
|
848
|
-
demaximizeWindow: (winId) => {
|
|
849
|
-
windowRegistry[winId].setState({
|
|
850
|
-
winCoord: { pointX: wsApi.getRect().left + 16, pointY: wsApi.getRect().top + 16 },
|
|
851
|
-
winWidth: wsApi.getRect().innerWidth * 0.95,
|
|
852
|
-
winHeight: wsApi.getRect().innerHeight * 0.75,
|
|
853
|
-
winVisualState: "demaximized"
|
|
854
|
-
});
|
|
855
|
-
},
|
|
856
|
-
closeWindow: (winId) => {
|
|
857
|
-
windowRegistry[winId].setState({ isWindowClosed: true });
|
|
858
|
-
},
|
|
859
|
-
openWindow: (winId) => {
|
|
860
|
-
const winState = windowRegistry[winId].getState();
|
|
861
|
-
const winRef = winState.self;
|
|
862
|
-
if (winState.isWindowClosed && winRef?.current) {
|
|
863
|
-
windowRegistry[winId].setState({ isWindowClosed: false });
|
|
864
|
-
winRef.current.style.transform = "translate(0, 0) scale(1)";
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
};
|
|
868
|
-
|
|
869
|
-
// src/window-manager/rwm.ts
|
|
870
|
-
var rwm = {
|
|
871
|
-
dockApi,
|
|
872
|
-
resizeApi,
|
|
873
|
-
stackApi,
|
|
874
|
-
workspaceApi: wsApi,
|
|
875
|
-
worskpaceState: useWorkspaceState
|
|
876
|
-
};
|
|
877
|
-
var rwm_default = rwm;
|
|
878
|
-
|
|
879
|
-
// src/window-manager/workspace-layout.tsx
|
|
880
|
-
import { useEffect as useEffect6, useRef as useRef2 } from "react";
|
|
881
|
-
|
|
882
|
-
// src/window-manager/internal/features/docking/docking-controls.tsx
|
|
883
|
-
import { useState as useState2 } from "react";
|
|
884
|
-
import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
885
|
-
function DockingControls() {
|
|
886
|
-
const [isHovering, setIsHovering] = useState2(false);
|
|
887
|
-
const { activeWindowId } = useWorkspaceState();
|
|
888
|
-
const { isDragging } = windowRegistry[activeWindowId]();
|
|
889
|
-
const cornerDockControl = /* @__PURE__ */ jsxs3("div", { className: `flex xl:p-0 shrink-0 gap-0.5`, children: [
|
|
890
|
-
/* @__PURE__ */ jsxs3("div", { className: "flex flex-col justify-center gap-0.5", children: [
|
|
891
|
-
/* @__PURE__ */ jsx7(
|
|
892
|
-
"button",
|
|
893
|
-
{
|
|
894
|
-
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-10 h-6 rounded-sm",
|
|
895
|
-
onMouseUp: () => dockApi.dockWindowTopLeft(activeWindowId)
|
|
896
|
-
}
|
|
897
|
-
),
|
|
898
|
-
/* @__PURE__ */ jsx7(
|
|
899
|
-
"button",
|
|
900
|
-
{
|
|
901
|
-
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-10 h-6 rounded-sm",
|
|
902
|
-
onMouseUp: () => dockApi.dockWindowBottomLeft(activeWindowId)
|
|
903
|
-
}
|
|
904
|
-
)
|
|
905
|
-
] }),
|
|
906
|
-
/* @__PURE__ */ jsxs3("div", { className: "flex flex-col justify-center gap-0.5", children: [
|
|
907
|
-
/* @__PURE__ */ jsx7(
|
|
908
|
-
"button",
|
|
909
|
-
{
|
|
910
|
-
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-10 h-6 rounded-sm",
|
|
911
|
-
onMouseUp: () => dockApi.dockWindowTopRight(activeWindowId)
|
|
912
|
-
}
|
|
913
|
-
),
|
|
914
|
-
/* @__PURE__ */ jsx7(
|
|
915
|
-
"button",
|
|
916
|
-
{
|
|
917
|
-
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-10 h-6 rounded-sm",
|
|
918
|
-
onMouseUp: () => dockApi.dockWindowBottomRight(activeWindowId)
|
|
919
|
-
}
|
|
920
|
-
)
|
|
921
|
-
] })
|
|
922
|
-
] });
|
|
923
|
-
const sideDideControl = /* @__PURE__ */ jsxs3("div", { className: `flex shrink-0 items-center gap-0.5`, children: [
|
|
924
|
-
/* @__PURE__ */ jsx7(
|
|
925
|
-
"button",
|
|
926
|
-
{
|
|
927
|
-
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-8 h-12 rounded-sm",
|
|
928
|
-
onMouseUp: () => dockApi.dockWindowLeft(activeWindowId)
|
|
929
|
-
}
|
|
930
|
-
),
|
|
931
|
-
/* @__PURE__ */ jsx7(
|
|
932
|
-
"button",
|
|
933
|
-
{
|
|
934
|
-
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-8 h-12 rounded-sm",
|
|
935
|
-
onMouseUp: () => dockApi.dockWindowRight(activeWindowId)
|
|
936
|
-
}
|
|
937
|
-
)
|
|
938
|
-
] });
|
|
939
|
-
const horizontalDockControl = /* @__PURE__ */ jsxs3("div", { className: `flex flex-col shrink-0 items-center gap-0.5`, children: [
|
|
940
|
-
/* @__PURE__ */ jsx7(
|
|
941
|
-
"button",
|
|
942
|
-
{
|
|
943
|
-
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-14 h-6 rounded-sm",
|
|
944
|
-
onMouseUp: () => dockApi.dockWindowTop(activeWindowId)
|
|
945
|
-
}
|
|
946
|
-
),
|
|
947
|
-
/* @__PURE__ */ jsx7(
|
|
948
|
-
"button",
|
|
949
|
-
{
|
|
950
|
-
className: "hover:bg-zinc-300 border border-zinc-500 bg-zinc-600 w-14 h-6 rounded-sm",
|
|
951
|
-
onMouseUp: () => dockApi.dockWindowBottom(activeWindowId)
|
|
952
|
-
}
|
|
953
|
-
)
|
|
954
|
-
] });
|
|
955
|
-
const windowDockPannel = /* @__PURE__ */ jsx7(
|
|
956
|
-
"span",
|
|
957
|
-
{
|
|
958
|
-
className: "pointer-events-auto px-4 pb-2",
|
|
959
|
-
onMouseOver: () => setIsHovering(true),
|
|
960
|
-
onMouseLeave: () => setIsHovering(false),
|
|
961
|
-
children: /* @__PURE__ */ jsxs3(
|
|
962
|
-
"section",
|
|
963
|
-
{
|
|
964
|
-
className: `
|
|
965
|
-
flex w-fit border border-zinc-600 border-t-0 rounded-b-md bg-zinc-800
|
|
966
|
-
overflow-hidden px-8 gap-4 h-full py-4
|
|
967
|
-
`,
|
|
968
|
-
children: [
|
|
969
|
-
cornerDockControl,
|
|
970
|
-
horizontalDockControl,
|
|
971
|
-
sideDideControl
|
|
972
|
-
]
|
|
973
|
-
}
|
|
974
|
-
)
|
|
975
|
-
}
|
|
976
|
-
);
|
|
977
|
-
return /* @__PURE__ */ jsx7(
|
|
978
|
-
"div",
|
|
979
|
-
{
|
|
980
|
-
className: `
|
|
981
|
-
${isDragging ? isHovering ? "top-0 opacity-50" : "top-[-68px] opacity-80" : "top-[-104px] opacity-0"}
|
|
982
|
-
transition-all duration-500
|
|
983
|
-
absolute z-50 flex items-center justify-center
|
|
984
|
-
w-full mx-auto pointer-events-none`,
|
|
985
|
-
children: windowDockPannel
|
|
986
|
-
}
|
|
987
|
-
);
|
|
988
|
-
}
|
|
989
|
-
|
|
990
|
-
// src/window-manager/internal/features/cursor/cursor-move-listener.tsx
|
|
991
|
-
import { useEffect as useEffect4 } from "react";
|
|
992
|
-
import { Fragment as Fragment3, jsx as jsx8 } from "react/jsx-runtime";
|
|
993
|
-
function CursorMoveListener() {
|
|
994
|
-
const { setX, setY } = useCursorState();
|
|
995
|
-
useEffect4(() => {
|
|
996
|
-
const handleWindowPosition = (e) => {
|
|
997
|
-
e.preventDefault();
|
|
998
|
-
setX(e.clientX);
|
|
999
|
-
setY(e.clientY);
|
|
1000
|
-
};
|
|
1001
|
-
window.addEventListener("pointermove", handleWindowPosition);
|
|
1002
|
-
return () => window.removeEventListener("pointermove", handleWindowPosition);
|
|
1003
|
-
}, [setX, setY]);
|
|
1004
|
-
return /* @__PURE__ */ jsx8(Fragment3, {});
|
|
1005
|
-
}
|
|
1006
|
-
|
|
1007
|
-
// src/window-manager/internal/features/view-port/view-port-resize-listener.tsx
|
|
1008
|
-
import { useEffect as useEffect5 } from "react";
|
|
1009
|
-
import { Fragment as Fragment4, jsx as jsx9 } from "react/jsx-runtime";
|
|
1010
|
-
function ViewPortResizeListener() {
|
|
1011
|
-
useEffect5(() => {
|
|
1012
|
-
window.addEventListener("resize", stackApi.resetStack);
|
|
1013
|
-
return () => window.removeEventListener("resize", stackApi.resetStack);
|
|
1014
|
-
}, []);
|
|
1015
|
-
return /* @__PURE__ */ jsx9(Fragment4, {});
|
|
1016
|
-
}
|
|
1017
|
-
|
|
1018
|
-
// src/window-manager/workspace-layout.tsx
|
|
1019
|
-
import { jsx as jsx10, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
1020
|
-
function WorkspaceLayout({ children, className, responsiveBreak = "sm" }) {
|
|
1021
|
-
const workspaceRef = useRef2(null);
|
|
1022
|
-
const { setRef, setResponsiveBreak } = useWorkspaceState();
|
|
1023
|
-
useEffect6(() => {
|
|
1024
|
-
setRef(workspaceRef.current);
|
|
1025
|
-
}, []);
|
|
1026
|
-
useEffect6(() => {
|
|
1027
|
-
setResponsiveBreak(responsiveBreak);
|
|
1028
|
-
}, [responsiveBreak]);
|
|
1029
|
-
return /* @__PURE__ */ jsxs4(
|
|
1030
|
-
"section",
|
|
1031
|
-
{
|
|
1032
|
-
ref: workspaceRef,
|
|
1033
|
-
onMouseLeave: resizeApi.stopAllDragAndResize,
|
|
1034
|
-
onMouseUp: resizeApi.stopAllDragAndResize,
|
|
1035
|
-
className: className ? className : "fixed overflow-hidden h-full w-full touch-none",
|
|
1036
|
-
children: [
|
|
1037
|
-
/* @__PURE__ */ jsx10(ViewPortResizeListener, {}),
|
|
1038
|
-
/* @__PURE__ */ jsx10(CursorMoveListener, {}),
|
|
1039
|
-
/* @__PURE__ */ jsxs4("div", { className: " w-full h-full relative overflow-hidden", children: [
|
|
1040
|
-
!wsApi.isBelowBreakPoint() && /* @__PURE__ */ jsx10(DockingControls, {}),
|
|
1041
|
-
children
|
|
1042
|
-
] })
|
|
1043
|
-
]
|
|
1044
|
-
}
|
|
1045
|
-
);
|
|
1046
|
-
}
|
|
1047
1606
|
export {
|
|
1048
1607
|
WorkspaceLayout,
|
|
1049
1608
|
createWindowStore,
|
|
1050
|
-
rwm_default as rwm
|
|
1051
|
-
windowRegistry
|
|
1609
|
+
rwm_default as rwm
|
|
1052
1610
|
};
|
|
1053
1611
|
//# sourceMappingURL=index.js.map
|