@flowgram.ai/panel-manager-plugin 0.1.0-alpha.24 → 0.1.0-alpha.26
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/.rush/temp/chunked-rush-logs/panel-manager-plugin.build.chunks.jsonl +9 -9
- package/.rush/temp/package-deps_build.json +8 -7
- package/dist/esm/index.js +184 -90
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +15 -4
- package/dist/index.d.ts +15 -4
- package/dist/index.js +199 -105
- package/dist/index.js.map +1 -1
- package/{.eslintrc.cjs → eslint.config.js} +2 -2
- package/package.json +5 -5
- package/rush-logs/panel-manager-plugin.build.log +9 -9
- package/src/components/panel-layer/css.ts +0 -6
- package/src/components/panel-layer/panel.tsx +38 -13
- package/src/hooks/use-panel.ts +9 -0
- package/src/services/panel-factory.ts +61 -5
- package/src/services/panel-manager.ts +31 -16
- package/src/types.ts +3 -0
- package/src/utils.ts +22 -0
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
{"kind":"O","text":"\u001b[34mCLI\u001b[39m Target: es2020\n"}
|
|
10
10
|
{"kind":"O","text":"\u001b[34mCJS\u001b[39m Build start\n"}
|
|
11
11
|
{"kind":"O","text":"\u001b[34mESM\u001b[39m Build start\n"}
|
|
12
|
-
{"kind":"O","text":"\u001b[32mCJS\u001b[39m \u001b[1mdist/index.js \u001b[22m\u001b[
|
|
13
|
-
{"kind":"O","text":"\u001b[32mCJS\u001b[39m \u001b[1mdist/index.js.map \u001b[22m\u001b[
|
|
14
|
-
{"kind":"O","text":"\u001b[32mCJS\u001b[39m ⚡️ Build success in
|
|
15
|
-
{"kind":"O","text":"\u001b[32mESM\u001b[39m \u001b[1mdist/esm/index.js \u001b[22m\u001b[
|
|
16
|
-
{"kind":"O","text":"\u001b[32mESM\u001b[39m \u001b[1mdist/esm/index.js.map \u001b[22m\u001b[
|
|
17
|
-
{"kind":"O","text":"\u001b[32mESM\u001b[39m ⚡️ Build success in
|
|
12
|
+
{"kind":"O","text":"\u001b[32mCJS\u001b[39m \u001b[1mdist/index.js \u001b[22m\u001b[32m21.17 KB\u001b[39m\n"}
|
|
13
|
+
{"kind":"O","text":"\u001b[32mCJS\u001b[39m \u001b[1mdist/index.js.map \u001b[22m\u001b[32m35.97 KB\u001b[39m\n"}
|
|
14
|
+
{"kind":"O","text":"\u001b[32mCJS\u001b[39m ⚡️ Build success in 124ms\n"}
|
|
15
|
+
{"kind":"O","text":"\u001b[32mESM\u001b[39m \u001b[1mdist/esm/index.js \u001b[22m\u001b[32m18.44 KB\u001b[39m\n"}
|
|
16
|
+
{"kind":"O","text":"\u001b[32mESM\u001b[39m \u001b[1mdist/esm/index.js.map \u001b[22m\u001b[32m35.39 KB\u001b[39m\n"}
|
|
17
|
+
{"kind":"O","text":"\u001b[32mESM\u001b[39m ⚡️ Build success in 126ms\n"}
|
|
18
18
|
{"kind":"O","text":"\u001b[34mDTS\u001b[39m Build start\n"}
|
|
19
|
-
{"kind":"O","text":"\u001b[32mDTS\u001b[39m ⚡️ Build success in
|
|
20
|
-
{"kind":"O","text":"\u001b[32mDTS\u001b[39m \u001b[1mdist/index.d.ts \u001b[22m\u001b[
|
|
21
|
-
{"kind":"O","text":"\u001b[32mDTS\u001b[39m \u001b[1mdist/index.d.mts \u001b[22m\u001b[
|
|
19
|
+
{"kind":"O","text":"\u001b[32mDTS\u001b[39m ⚡️ Build success in 4127ms\n"}
|
|
20
|
+
{"kind":"O","text":"\u001b[32mDTS\u001b[39m \u001b[1mdist/index.d.ts \u001b[22m\u001b[32m5.10 KB\u001b[39m\n"}
|
|
21
|
+
{"kind":"O","text":"\u001b[32mDTS\u001b[39m \u001b[1mdist/index.d.mts \u001b[22m\u001b[32m5.10 KB\u001b[39m\n"}
|
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
|
-
"packages/plugins/panel-manager-plugin/.eslintrc.cjs": "6b30cfc55136d429873e780785bf8d775edaaa74",
|
|
4
3
|
"packages/plugins/panel-manager-plugin/.rush/temp/shrinkwrap-deps.json": "75dbadf340a3fdaa60befb137b12769e13b91282",
|
|
4
|
+
"packages/plugins/panel-manager-plugin/eslint.config.js": "fc090051ebd4baacf22d6966ed4de1f236b9a73a",
|
|
5
5
|
"packages/plugins/panel-manager-plugin/package.json": "cb0835394b1db5cfb167091ca40438cdbc571dbd",
|
|
6
|
-
"packages/plugins/panel-manager-plugin/src/components/panel-layer/css.ts": "
|
|
6
|
+
"packages/plugins/panel-manager-plugin/src/components/panel-layer/css.ts": "2cae7373567f0f293c9c802ea67515f1d9047d89",
|
|
7
7
|
"packages/plugins/panel-manager-plugin/src/components/panel-layer/docked-panel-layer.tsx": "232cd8edbac3a8d8b17b2a5a07c463e57ee8f5c8",
|
|
8
8
|
"packages/plugins/panel-manager-plugin/src/components/panel-layer/index.ts": "4c78ec72d6acde8f2192ac956436a870cccc583f",
|
|
9
9
|
"packages/plugins/panel-manager-plugin/src/components/panel-layer/panel-layer.tsx": "d5a9464fa66a9819fa1b0055071990532fd819d9",
|
|
10
|
-
"packages/plugins/panel-manager-plugin/src/components/panel-layer/panel.tsx": "
|
|
10
|
+
"packages/plugins/panel-manager-plugin/src/components/panel-layer/panel.tsx": "b3d3567c664b32ef578620e6d60a97a44ea91bdc",
|
|
11
11
|
"packages/plugins/panel-manager-plugin/src/components/resize-bar/index.tsx": "7712eb70c08b0826ac8940be64582287d279d564",
|
|
12
12
|
"packages/plugins/panel-manager-plugin/src/contexts.ts": "21e828a3c16a060f92c62c52dd978224f2ab7436",
|
|
13
13
|
"packages/plugins/panel-manager-plugin/src/create-panel-manager-plugin.ts": "660998495abbabc247370c3525e0009415e6f752",
|
|
14
14
|
"packages/plugins/panel-manager-plugin/src/hooks/use-global-css.ts": "be94fd4759d691bdcc5eb8a03f90995956ce4bf0",
|
|
15
15
|
"packages/plugins/panel-manager-plugin/src/hooks/use-panel-manager.ts": "0e0073c6ad9a1552a9896085b011b79dbfe6309d",
|
|
16
|
-
"packages/plugins/panel-manager-plugin/src/hooks/use-panel.ts": "
|
|
16
|
+
"packages/plugins/panel-manager-plugin/src/hooks/use-panel.ts": "f1683e6411d3f461448ec67cf6ec7d7bfd3ed2c2",
|
|
17
17
|
"packages/plugins/panel-manager-plugin/src/index.ts": "990c6bff8e5f16e876a903a8e52fe764f30b3a88",
|
|
18
18
|
"packages/plugins/panel-manager-plugin/src/services/index.ts": "9cb6cc67c05c10f00bd7b5fffdf44c3fcd0a4c28",
|
|
19
19
|
"packages/plugins/panel-manager-plugin/src/services/panel-config.ts": "b5b96aa95acf3dd188894a739d534e599a1cd755",
|
|
20
|
-
"packages/plugins/panel-manager-plugin/src/services/panel-factory.ts": "
|
|
20
|
+
"packages/plugins/panel-manager-plugin/src/services/panel-factory.ts": "acb81a6e73eec2a11dbdd4899700bbdf31814e60",
|
|
21
21
|
"packages/plugins/panel-manager-plugin/src/services/panel-layer.ts": "e456afb5e28d3c93846521fa29ed352aca282bec",
|
|
22
|
-
"packages/plugins/panel-manager-plugin/src/services/panel-manager.ts": "
|
|
22
|
+
"packages/plugins/panel-manager-plugin/src/services/panel-manager.ts": "43c9db43bd8e76ee0ed5bcceef256de2dbd34b15",
|
|
23
23
|
"packages/plugins/panel-manager-plugin/src/services/panel-restore.ts": "c3151b5281cc35efb262654f8500556a23811829",
|
|
24
|
-
"packages/plugins/panel-manager-plugin/src/types.ts": "
|
|
24
|
+
"packages/plugins/panel-manager-plugin/src/types.ts": "938145cc6b7205d01cfb6a26c0be7da21127eaca",
|
|
25
|
+
"packages/plugins/panel-manager-plugin/src/utils.ts": "4ceb7654f72dad582be35d0c48297bdc3a54b0e3",
|
|
25
26
|
"packages/plugins/panel-manager-plugin/tsconfig.json": "4b7a4f197dc4f9c62c2938fb3b77780944ad7675"
|
|
26
27
|
},
|
|
27
28
|
"arguments": "npm run build:fast -- --dts-resolve "
|
package/dist/esm/index.js
CHANGED
|
@@ -35,59 +35,6 @@ PanelRestoreImpl = __decorateClass([
|
|
|
35
35
|
injectable()
|
|
36
36
|
], PanelRestoreImpl);
|
|
37
37
|
|
|
38
|
-
// src/services/panel-factory.ts
|
|
39
|
-
var PanelEntityFactory = Symbol("PanelEntityFactory");
|
|
40
|
-
var PanelEntityFactoryConstant = Symbol("PanelEntityFactoryConstant");
|
|
41
|
-
var PanelEntityConfigConstant = Symbol("PanelEntityConfigConstant");
|
|
42
|
-
var PANEL_SIZE_DEFAULT = 400;
|
|
43
|
-
var PanelEntity = class {
|
|
44
|
-
constructor() {
|
|
45
|
-
this.initialized = false;
|
|
46
|
-
/** 实例唯一标识 */
|
|
47
|
-
this.id = nanoid();
|
|
48
|
-
/** 渲染缓存 */
|
|
49
|
-
this.node = null;
|
|
50
|
-
}
|
|
51
|
-
get area() {
|
|
52
|
-
return this.config.area;
|
|
53
|
-
}
|
|
54
|
-
get key() {
|
|
55
|
-
return this.factory.key;
|
|
56
|
-
}
|
|
57
|
-
get renderer() {
|
|
58
|
-
if (!this.node) {
|
|
59
|
-
this.node = this.factory.render(this.config.props);
|
|
60
|
-
}
|
|
61
|
-
return this.node;
|
|
62
|
-
}
|
|
63
|
-
init() {
|
|
64
|
-
if (this.initialized) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
this.initialized = true;
|
|
68
|
-
const cache = this.restore.restore(this.key);
|
|
69
|
-
this.store = createStore(() => ({
|
|
70
|
-
size: this.config.defaultSize || this.factory.defaultSize || PANEL_SIZE_DEFAULT,
|
|
71
|
-
...cache ?? {}
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
74
|
-
dispose() {
|
|
75
|
-
this.restore.store(this.key, this.store.getState());
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
__decorateClass([
|
|
79
|
-
inject(PanelRestore)
|
|
80
|
-
], PanelEntity.prototype, "restore", 2);
|
|
81
|
-
__decorateClass([
|
|
82
|
-
inject(PanelEntityFactoryConstant)
|
|
83
|
-
], PanelEntity.prototype, "factory", 2);
|
|
84
|
-
__decorateClass([
|
|
85
|
-
inject(PanelEntityConfigConstant)
|
|
86
|
-
], PanelEntity.prototype, "config", 2);
|
|
87
|
-
PanelEntity = __decorateClass([
|
|
88
|
-
injectable2()
|
|
89
|
-
], PanelEntity);
|
|
90
|
-
|
|
91
38
|
// src/components/resize-bar/index.tsx
|
|
92
39
|
import { useRef, useState } from "react";
|
|
93
40
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -187,6 +134,117 @@ var defineConfig = (config) => {
|
|
|
187
134
|
};
|
|
188
135
|
};
|
|
189
136
|
|
|
137
|
+
// src/utils.ts
|
|
138
|
+
var merge = (...objs) => {
|
|
139
|
+
const result = {};
|
|
140
|
+
for (const obj of objs) {
|
|
141
|
+
if (!obj || typeof obj !== "object") continue;
|
|
142
|
+
for (const key of Object.keys(obj)) {
|
|
143
|
+
const value = obj[key];
|
|
144
|
+
if (result[key] === void 0) {
|
|
145
|
+
result[key] = value;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// src/services/panel-factory.ts
|
|
153
|
+
var PanelEntityFactory = Symbol("PanelEntityFactory");
|
|
154
|
+
var PanelEntityFactoryConstant = Symbol("PanelEntityFactoryConstant");
|
|
155
|
+
var PanelEntityConfigConstant = Symbol("PanelEntityConfigConstant");
|
|
156
|
+
var PANEL_SIZE_DEFAULT = 400;
|
|
157
|
+
var PanelEntity = class {
|
|
158
|
+
constructor() {
|
|
159
|
+
this.initialized = false;
|
|
160
|
+
/** 实例唯一标识 */
|
|
161
|
+
this.id = nanoid();
|
|
162
|
+
/** 渲染缓存 */
|
|
163
|
+
this.node = null;
|
|
164
|
+
}
|
|
165
|
+
get area() {
|
|
166
|
+
return this.config.area;
|
|
167
|
+
}
|
|
168
|
+
get mode() {
|
|
169
|
+
return this.config.area.startsWith("docked") ? "docked" : "floating";
|
|
170
|
+
}
|
|
171
|
+
get key() {
|
|
172
|
+
return this.factory.key;
|
|
173
|
+
}
|
|
174
|
+
get renderer() {
|
|
175
|
+
if (!this.node) {
|
|
176
|
+
this.node = this.factory.render(this.config.props);
|
|
177
|
+
}
|
|
178
|
+
return this.node;
|
|
179
|
+
}
|
|
180
|
+
get fullscreen() {
|
|
181
|
+
return this.store.getState().fullscreen;
|
|
182
|
+
}
|
|
183
|
+
set fullscreen(next) {
|
|
184
|
+
this.store.setState({ fullscreen: next });
|
|
185
|
+
}
|
|
186
|
+
get resizable() {
|
|
187
|
+
if (this.fullscreen) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
return this.factory.resize !== void 0 ? this.factory.resize : this.globalConfig.autoResize;
|
|
191
|
+
}
|
|
192
|
+
get keepDOM() {
|
|
193
|
+
return this.factory.keepDOM;
|
|
194
|
+
}
|
|
195
|
+
get visible() {
|
|
196
|
+
return this.store.getState().visible;
|
|
197
|
+
}
|
|
198
|
+
set visible(next) {
|
|
199
|
+
this.store.setState({ visible: next });
|
|
200
|
+
}
|
|
201
|
+
get layer() {
|
|
202
|
+
return document.querySelector(
|
|
203
|
+
this.mode ? ".gedit-flow-panel-layer-wrap-docked" : ".gedit-flow-panel-layer-wrap-floating"
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
init() {
|
|
207
|
+
if (this.initialized) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
this.initialized = true;
|
|
211
|
+
const cache = this.restore.restore(this.key);
|
|
212
|
+
const initialState = merge(
|
|
213
|
+
{
|
|
214
|
+
size: this.config.defaultSize,
|
|
215
|
+
fullscreen: this.config.fullscreen
|
|
216
|
+
},
|
|
217
|
+
cache ? cache : {},
|
|
218
|
+
{
|
|
219
|
+
size: this.factory.defaultSize || PANEL_SIZE_DEFAULT,
|
|
220
|
+
fullscreen: this.factory.fullscreen || false,
|
|
221
|
+
...this.factory.keepDOM ? { visible: true } : {}
|
|
222
|
+
}
|
|
223
|
+
);
|
|
224
|
+
this.store = createStore(() => initialState);
|
|
225
|
+
}
|
|
226
|
+
mergeState() {
|
|
227
|
+
}
|
|
228
|
+
dispose() {
|
|
229
|
+
this.restore.store(this.key, this.store.getState());
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
__decorateClass([
|
|
233
|
+
inject(PanelRestore)
|
|
234
|
+
], PanelEntity.prototype, "restore", 2);
|
|
235
|
+
__decorateClass([
|
|
236
|
+
inject(PanelEntityFactoryConstant)
|
|
237
|
+
], PanelEntity.prototype, "factory", 2);
|
|
238
|
+
__decorateClass([
|
|
239
|
+
inject(PanelEntityConfigConstant)
|
|
240
|
+
], PanelEntity.prototype, "config", 2);
|
|
241
|
+
__decorateClass([
|
|
242
|
+
inject(PanelManagerConfig)
|
|
243
|
+
], PanelEntity.prototype, "globalConfig", 2);
|
|
244
|
+
PanelEntity = __decorateClass([
|
|
245
|
+
injectable2()
|
|
246
|
+
], PanelEntity);
|
|
247
|
+
|
|
190
248
|
// src/services/panel-manager.ts
|
|
191
249
|
import { injectable as injectable3, inject as inject2 } from "inversify";
|
|
192
250
|
import { Emitter } from "@flowgram.ai/utils";
|
|
@@ -211,32 +269,39 @@ var PanelManager = class {
|
|
|
211
269
|
return;
|
|
212
270
|
}
|
|
213
271
|
const sameKeyPanels = this.getPanels(area).filter((p) => p.key === key);
|
|
214
|
-
if (
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
272
|
+
if (factory.keepDOM && sameKeyPanels.length) {
|
|
273
|
+
const [panel] = sameKeyPanels;
|
|
274
|
+
this.panels.delete(panel.id);
|
|
275
|
+
this.panels.set(panel.id, panel);
|
|
276
|
+
panel.visible = true;
|
|
277
|
+
} else {
|
|
278
|
+
if (!factory.allowDuplicates && sameKeyPanels.length) {
|
|
279
|
+
sameKeyPanels.forEach((p) => this.remove(p.id));
|
|
222
280
|
}
|
|
223
|
-
|
|
224
|
-
|
|
281
|
+
const panel = this.createPanel({
|
|
282
|
+
factory,
|
|
283
|
+
config: {
|
|
284
|
+
area,
|
|
285
|
+
...options
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
this.panels.set(panel.id, panel);
|
|
289
|
+
}
|
|
225
290
|
this.trim(area);
|
|
226
291
|
this.onPanelsChangeEvent.fire();
|
|
227
|
-
console.log("jxj", this.panels);
|
|
228
292
|
}
|
|
229
293
|
/** close panel */
|
|
230
294
|
close(key) {
|
|
231
295
|
const panels = this.getPanels();
|
|
232
296
|
const closedPanels = key ? panels.filter((p) => p.key === key) : panels;
|
|
233
|
-
closedPanels.forEach((
|
|
297
|
+
closedPanels.forEach((panel) => {
|
|
298
|
+
this.remove(panel.id);
|
|
299
|
+
});
|
|
234
300
|
this.onPanelsChangeEvent.fire();
|
|
235
301
|
}
|
|
236
302
|
trim(area) {
|
|
237
|
-
const panels = this.getPanels(area);
|
|
303
|
+
const panels = this.getPanels(area).filter((p) => !p.keepDOM || p.visible);
|
|
238
304
|
const areaConfig = this.getAreaConfig(area);
|
|
239
|
-
console.log("jxj", areaConfig.max, panels.length);
|
|
240
305
|
while (panels.length > areaConfig.max) {
|
|
241
306
|
const removed = panels.shift();
|
|
242
307
|
if (removed) {
|
|
@@ -246,7 +311,12 @@ var PanelManager = class {
|
|
|
246
311
|
}
|
|
247
312
|
remove(id) {
|
|
248
313
|
const panel = this.panels.get(id);
|
|
249
|
-
if (panel) {
|
|
314
|
+
if (!panel) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (panel.keepDOM) {
|
|
318
|
+
panel.visible = false;
|
|
319
|
+
} else {
|
|
250
320
|
panel.dispose();
|
|
251
321
|
this.panels.delete(id);
|
|
252
322
|
}
|
|
@@ -316,27 +386,41 @@ var useGlobalCSS = ({ cssText, id, cleanup }) => {
|
|
|
316
386
|
|
|
317
387
|
// src/components/panel-layer/panel.tsx
|
|
318
388
|
import { useEffect as useEffect2, startTransition, useState as useState2, useRef as useRef2 } from "react";
|
|
319
|
-
import {
|
|
320
|
-
import { shallow } from "zustand/shallow";
|
|
321
|
-
import clsx from "clsx";
|
|
389
|
+
import { clsx } from "clsx";
|
|
322
390
|
|
|
323
391
|
// src/hooks/use-panel-manager.ts
|
|
324
392
|
import { useService } from "@flowgram.ai/core";
|
|
325
393
|
var usePanelManager = () => useService(PanelManager);
|
|
326
394
|
|
|
395
|
+
// src/hooks/use-panel.ts
|
|
396
|
+
import { useContext } from "react";
|
|
397
|
+
import { useStoreWithEqualityFn } from "zustand/traditional";
|
|
398
|
+
import { shallow } from "zustand/shallow";
|
|
399
|
+
|
|
327
400
|
// src/contexts.ts
|
|
328
401
|
import { createContext } from "react";
|
|
329
402
|
var PanelContext = createContext({});
|
|
330
403
|
|
|
404
|
+
// src/hooks/use-panel.ts
|
|
405
|
+
var usePanel = () => useContext(PanelContext);
|
|
406
|
+
var usePanelStore = (selector) => {
|
|
407
|
+
const panel = usePanel();
|
|
408
|
+
return useStoreWithEqualityFn(panel.store, selector, shallow);
|
|
409
|
+
};
|
|
410
|
+
|
|
331
411
|
// src/components/panel-layer/panel.tsx
|
|
332
412
|
import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
333
|
-
var PanelItem = ({ panel }) => {
|
|
413
|
+
var PanelItem = ({ panel, hidden }) => {
|
|
334
414
|
const panelManager = usePanelManager();
|
|
335
415
|
const ref = useRef2(null);
|
|
336
|
-
const resize = panel.factory.resize !== void 0 ? panel.factory.resize : panelManager.config.autoResize;
|
|
337
416
|
const isHorizontal = ["right", "docked-right"].includes(panel.area);
|
|
338
|
-
const size =
|
|
339
|
-
|
|
417
|
+
const { size, fullscreen } = usePanelStore((s) => ({
|
|
418
|
+
size: s.size,
|
|
419
|
+
fullscreen: s.fullscreen
|
|
420
|
+
}));
|
|
421
|
+
const [layerSize, setLayerSize] = useState2(size);
|
|
422
|
+
const currentSize = fullscreen ? layerSize : size;
|
|
423
|
+
const sizeStyle = isHorizontal ? { width: currentSize } : { height: currentSize };
|
|
340
424
|
const handleResize = (next) => {
|
|
341
425
|
let nextSize = next;
|
|
342
426
|
if (typeof panel.factory.maxSize === "number" && nextSize > panel.factory.maxSize) {
|
|
@@ -347,12 +431,27 @@ var PanelItem = ({ panel }) => {
|
|
|
347
431
|
panel.store.setState({ size: nextSize });
|
|
348
432
|
};
|
|
349
433
|
useEffect2(() => {
|
|
350
|
-
if (ref.current) {
|
|
434
|
+
if (ref.current && !fullscreen) {
|
|
351
435
|
const { width, height } = ref.current.getBoundingClientRect();
|
|
352
436
|
const realSize = isHorizontal ? width : height;
|
|
353
437
|
panel.store.setState({ size: realSize });
|
|
354
438
|
}
|
|
355
|
-
}, []);
|
|
439
|
+
}, [fullscreen]);
|
|
440
|
+
useEffect2(() => {
|
|
441
|
+
if (!fullscreen) {
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
const layer = panel.layer;
|
|
445
|
+
if (!layer) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
const observer = new ResizeObserver(([entry]) => {
|
|
449
|
+
const { width, height } = entry.contentRect;
|
|
450
|
+
setLayerSize(isHorizontal ? width : height);
|
|
451
|
+
});
|
|
452
|
+
observer.observe(layer);
|
|
453
|
+
return () => observer.disconnect();
|
|
454
|
+
}, [fullscreen]);
|
|
356
455
|
return /* @__PURE__ */ jsxs(
|
|
357
456
|
"div",
|
|
358
457
|
{
|
|
@@ -361,9 +460,14 @@ var PanelItem = ({ panel }) => {
|
|
|
361
460
|
isHorizontal ? "panel-horizontal" : "panel-vertical"
|
|
362
461
|
),
|
|
363
462
|
ref,
|
|
364
|
-
style: {
|
|
463
|
+
style: {
|
|
464
|
+
display: hidden ? "none" : "block",
|
|
465
|
+
...panel.factory.style,
|
|
466
|
+
...panel.config.style,
|
|
467
|
+
...sizeStyle
|
|
468
|
+
},
|
|
365
469
|
children: [
|
|
366
|
-
|
|
470
|
+
panel.resizable && panelManager.config.resizeBarRender({
|
|
367
471
|
size,
|
|
368
472
|
direction: isHorizontal ? "vertical" : "horizontal",
|
|
369
473
|
onResize: handleResize
|
|
@@ -385,7 +489,7 @@ var PanelArea = ({ area }) => {
|
|
|
385
489
|
});
|
|
386
490
|
return () => dispose.dispose();
|
|
387
491
|
}, []);
|
|
388
|
-
return /* @__PURE__ */ jsx2(Fragment, { children: panels.map((panel) => /* @__PURE__ */ jsx2(PanelContext.Provider, { value: panel, children: /* @__PURE__ */ jsx2(PanelItem, { panel }) }, panel.id)) });
|
|
492
|
+
return /* @__PURE__ */ jsx2(Fragment, { children: panels.map((panel) => /* @__PURE__ */ jsx2(PanelContext.Provider, { value: panel, children: /* @__PURE__ */ jsx2(PanelItem, { panel, hidden: panel.keepDOM && !panel.visible }) }, panel.id)) });
|
|
389
493
|
};
|
|
390
494
|
|
|
391
495
|
// src/components/panel-layer/css.ts
|
|
@@ -406,8 +510,6 @@ var globalCSS = `
|
|
|
406
510
|
|
|
407
511
|
}
|
|
408
512
|
.gedit-flow-panel-layer-wrap-floating {
|
|
409
|
-
column-gap: 4px;
|
|
410
|
-
padding: 4px;
|
|
411
513
|
pointer-events: none;
|
|
412
514
|
}
|
|
413
515
|
|
|
@@ -419,16 +521,12 @@ var globalCSS = `
|
|
|
419
521
|
display: flex;
|
|
420
522
|
flex-direction: column;
|
|
421
523
|
}
|
|
422
|
-
.gedit-flow-panel-layer-wrap-floating .gedit-flow-panel-left-area {
|
|
423
|
-
row-gap: 4px;
|
|
424
|
-
}
|
|
425
524
|
.gedit-flow-panel-right-area {
|
|
426
525
|
height: 100%;
|
|
427
526
|
flex-grow: 1;
|
|
428
527
|
flex-shrink: 0;
|
|
429
528
|
min-width: 0;
|
|
430
529
|
display: flex;
|
|
431
|
-
column-gap: 4px;
|
|
432
530
|
max-width: 100%;
|
|
433
531
|
}
|
|
434
532
|
|
|
@@ -565,10 +663,6 @@ var createPanelManagerPlugin = definePluginCreator({
|
|
|
565
663
|
panelManager.init();
|
|
566
664
|
}
|
|
567
665
|
});
|
|
568
|
-
|
|
569
|
-
// src/hooks/use-panel.ts
|
|
570
|
-
import { useContext } from "react";
|
|
571
|
-
var usePanel = () => useContext(PanelContext);
|
|
572
666
|
export {
|
|
573
667
|
DockedPanelLayer,
|
|
574
668
|
PanelManager,
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/create-panel-manager-plugin.ts","../../src/services/panel-factory.ts","../../src/services/panel-restore.ts","../../src/components/resize-bar/index.tsx","../../src/services/panel-config.ts","../../src/services/panel-manager.ts","../../src/services/panel-layer.ts","../../src/components/panel-layer/panel-layer.tsx","../../src/hooks/use-global-css.ts","../../src/components/panel-layer/panel.tsx","../../src/hooks/use-panel-manager.ts","../../src/contexts.ts","../../src/components/panel-layer/css.ts","../../src/components/panel-layer/docked-panel-layer.tsx","../../src/hooks/use-panel.ts"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator } from '@flowgram.ai/core';\n\nimport {\n PanelEntityFactory,\n PanelEntity,\n PanelEntityFactoryConstant,\n PanelEntityConfigConstant,\n} from './services/panel-factory';\nimport { defineConfig } from './services/panel-config';\nimport {\n PanelManager,\n PanelManagerConfig,\n PanelLayer,\n PanelRestore,\n PanelRestoreImpl,\n} from './services';\n\nexport const createPanelManagerPlugin = definePluginCreator<Partial<PanelManagerConfig>>({\n onBind: ({ bind }, opt) => {\n bind(PanelManager).to(PanelManager).inSingletonScope();\n bind(PanelRestore).to(PanelRestoreImpl).inSingletonScope();\n bind(PanelManagerConfig).toConstantValue(defineConfig(opt));\n bind(PanelEntityFactory).toFactory(\n (context) =>\n ({\n factory,\n config,\n }: {\n factory: PanelEntityFactoryConstant;\n config: PanelEntityConfigConstant;\n }) => {\n const container = context.container.createChild();\n container.bind(PanelEntityFactoryConstant).toConstantValue(factory);\n container.bind(PanelEntityConfigConstant).toConstantValue(config);\n const panel = container.resolve(PanelEntity);\n panel.init();\n return panel;\n }\n );\n },\n onInit(ctx) {\n ctx.playground.registerLayer(PanelLayer);\n const panelManager = ctx.container.get<PanelManager>(PanelManager);\n panelManager.init();\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { createStore, StoreApi } from 'zustand/vanilla';\nimport { nanoid } from 'nanoid';\nimport { inject, injectable } from 'inversify';\n\nimport type { PanelFactory, PanelEntityConfig, Area } from '../types';\nimport { PanelRestore } from './panel-restore';\n\nexport const PanelEntityFactory = Symbol('PanelEntityFactory');\nexport type PanelEntityFactory = (options: {\n factory: PanelEntityFactoryConstant;\n config: PanelEntityConfigConstant;\n}) => PanelEntity;\n\nexport const PanelEntityFactoryConstant = Symbol('PanelEntityFactoryConstant');\nexport type PanelEntityFactoryConstant = PanelFactory<any>;\nexport const PanelEntityConfigConstant = Symbol('PanelEntityConfigConstant');\nexport type PanelEntityConfigConstant = PanelEntityConfig<any> & {\n area: Area;\n};\n\nconst PANEL_SIZE_DEFAULT = 400;\n\ninterface PanelEntityState {\n size: number;\n}\n\n@injectable()\nexport class PanelEntity {\n @inject(PanelRestore) restore: PanelRestore;\n\n /** 面板工厂 */\n @inject(PanelEntityFactoryConstant) public factory: PanelEntityFactoryConstant;\n\n @inject(PanelEntityConfigConstant) public config: PanelEntityConfigConstant;\n\n private initialized = false;\n\n /** 实例唯一标识 */\n id: string = nanoid();\n\n /** 渲染缓存 */\n node: React.ReactNode = null;\n\n store: StoreApi<PanelEntityState>;\n\n get area() {\n return this.config.area;\n }\n\n get key() {\n return this.factory.key;\n }\n\n get renderer() {\n if (!this.node) {\n this.node = this.factory.render(this.config.props);\n }\n return this.node;\n }\n\n init() {\n if (this.initialized) {\n return;\n }\n this.initialized = true;\n const cache = this.restore.restore<PanelEntityState>(this.key);\n this.store = createStore<PanelEntityState>(() => ({\n size: this.config.defaultSize || this.factory.defaultSize || PANEL_SIZE_DEFAULT,\n ...(cache ?? {}),\n }));\n }\n\n dispose() {\n this.restore.store(this.key, this.store.getState());\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\n\nexport const PanelRestore = Symbol('PanelRestore');\nexport interface PanelRestore {\n store: (k: string, v: any) => void;\n restore: <T>(k: string) => T | undefined;\n}\n\n@injectable()\nexport class PanelRestoreImpl implements PanelRestore {\n map = new Map<string, any>();\n\n store(k: string, v: any) {\n this.map.set(k, v);\n }\n\n restore<T>(k: string): T | undefined {\n return this.map.get(k) as T;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useRef, useState } from 'react';\n\ninterface Props {\n size: number;\n direction?: 'vertical' | 'horizontal';\n onResize: (w: number) => void;\n}\n\nexport const ResizeBar: React.FC<Props> = ({ onResize, size, direction }) => {\n const currentPoint = useRef<null | number>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n const isVertical = direction === 'vertical';\n\n return (\n <div\n onMouseDown={(e) => {\n currentPoint.current = isVertical ? e.clientX : e.clientY;\n e.stopPropagation();\n e.preventDefault();\n setIsDragging(true);\n const mouseUp = () => {\n currentPoint.current = null;\n document.body.removeEventListener('mouseup', mouseUp);\n document.body.removeEventListener('mousemove', mouseMove);\n setIsDragging(false);\n };\n const mouseMove = (e: MouseEvent) => {\n const delta = currentPoint.current! - (isVertical ? e.clientX : e.clientY);\n onResize(size + delta);\n };\n document.body.addEventListener('mouseup', mouseUp);\n document.body.addEventListener('mousemove', mouseMove);\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'auto',\n ...(isVertical\n ? {\n cursor: 'ew-resize',\n height: '100%',\n marginLeft: -5,\n width: 10,\n }\n : {\n cursor: 'ns-resize',\n width: '100%',\n marginTop: -5,\n height: 10,\n }),\n }}\n >\n <div\n style={{\n ...(isVertical\n ? {\n width: 3,\n height: '100%',\n }\n : {\n height: 3,\n width: '100%',\n }),\n backgroundColor: isDragging || isHovered ? 'var(--g-playground-line)' : 'transparent',\n }}\n />\n </div>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { PluginContext } from '@flowgram.ai/core';\n\nimport type { PanelFactory, PanelConfig } from '../types';\nimport { ResizeBar } from '../components/resize-bar';\nimport type { PanelLayerProps } from '../components/panel-layer';\n\nexport interface PanelManagerConfig {\n factories: PanelFactory<any>[];\n right: PanelConfig;\n bottom: PanelConfig;\n dockedRight: PanelConfig;\n dockedBottom: PanelConfig;\n /** Resizable, and multi-panel options mutually exclusive */\n autoResize: boolean;\n layerProps: PanelLayerProps;\n resizeBarRender: ({\n size,\n }: {\n size: number;\n direction?: 'vertical' | 'horizontal';\n onResize: (size: number) => void;\n }) => React.ReactNode;\n getPopupContainer: (ctx: PluginContext) => HTMLElement; // default playground.node.parentElement\n}\n\nexport const PanelManagerConfig = Symbol('PanelManagerConfig');\n\nexport const defineConfig = (config: Partial<PanelManagerConfig>) => {\n const defaultConfig: PanelManagerConfig = {\n right: {\n max: 1,\n },\n bottom: {\n max: 1,\n },\n dockedRight: {\n max: 1,\n },\n dockedBottom: {\n max: 1,\n },\n factories: [],\n autoResize: true,\n layerProps: {},\n resizeBarRender: ResizeBar,\n getPopupContainer: (ctx: PluginContext) => ctx.playground.node.parentNode as HTMLElement,\n };\n return {\n ...defaultConfig,\n ...config,\n };\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, inject } from 'inversify';\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport { PanelManagerConfig } from './panel-config';\nimport type { Area, PanelEntityConfig, PanelFactory } from '../types';\nimport { PanelEntity, PanelEntityFactory } from './panel-factory';\n\n@injectable()\nexport class PanelManager {\n @inject(PanelManagerConfig) readonly config: PanelManagerConfig;\n\n @inject(PanelEntityFactory) readonly createPanel: PanelEntityFactory;\n\n readonly panelRegistry = new Map<string, PanelFactory<any>>();\n\n private panels = new Map<string, PanelEntity>();\n\n private onPanelsChangeEvent = new Emitter<void>();\n\n public onPanelsChange = this.onPanelsChangeEvent.event;\n\n init() {\n this.config.factories.forEach((factory) => this.register(factory));\n }\n\n /** registry panel factory */\n register<T extends any>(factory: PanelFactory<T>) {\n this.panelRegistry.set(factory.key, factory);\n }\n\n /** open panel */\n public open(key: string, area: Area = 'right', options?: PanelEntityConfig) {\n const factory = this.panelRegistry.get(key);\n if (!factory) {\n return;\n }\n\n const sameKeyPanels = this.getPanels(area).filter((p) => p.key === key);\n if (!factory.allowDuplicates && sameKeyPanels.length) {\n sameKeyPanels.forEach((p) => this.remove(p.id));\n }\n\n const panel = this.createPanel({\n factory,\n config: {\n area,\n ...options,\n },\n });\n\n this.panels.set(panel.id, panel);\n this.trim(area);\n this.onPanelsChangeEvent.fire();\n console.log('jxj', this.panels);\n }\n\n /** close panel */\n public close(key?: string) {\n const panels = this.getPanels();\n const closedPanels = key ? panels.filter((p) => p.key === key) : panels;\n closedPanels.forEach((p) => this.remove(p.id));\n this.onPanelsChangeEvent.fire();\n }\n\n private trim(area: Area) {\n const panels = this.getPanels(area);\n const areaConfig = this.getAreaConfig(area);\n console.log('jxj', areaConfig.max, panels.length);\n while (panels.length > areaConfig.max) {\n const removed = panels.shift();\n if (removed) {\n this.remove(removed.id);\n }\n }\n }\n\n private remove(id: string) {\n const panel = this.panels.get(id);\n if (panel) {\n panel.dispose();\n this.panels.delete(id);\n }\n }\n\n getPanels(area?: Area) {\n const panels: PanelEntity[] = [];\n this.panels.forEach((panel) => {\n if (!area || panel.area === area) {\n panels.push(panel);\n }\n });\n return panels;\n }\n\n getAreaConfig(area: Area) {\n switch (area) {\n case 'docked-bottom':\n return this.config.dockedBottom;\n case 'docked-right':\n return this.config.dockedRight;\n case 'bottom':\n return this.config.bottom;\n case 'right':\n default:\n return this.config.right;\n }\n }\n\n dispose() {\n this.onPanelsChangeEvent.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport ReactDOM from 'react-dom';\nimport { createElement } from 'react';\n\nimport { injectable, inject } from 'inversify';\nimport { domUtils, Disposable } from '@flowgram.ai/utils';\nimport { Layer, PluginContext } from '@flowgram.ai/core';\n\nimport { PanelLayer as PanelLayerComp } from '../components/panel-layer';\nimport { PanelManagerConfig } from './panel-config';\n\n@injectable()\nexport class PanelLayer extends Layer {\n @inject(PanelManagerConfig) private readonly panelConfig: PanelManagerConfig;\n\n @inject(PluginContext) private readonly pluginContext: PluginContext;\n\n readonly panelRoot = domUtils.createDivWithClass('gedit-flow-panel-layer');\n\n layout: JSX.Element | null = null;\n\n onReady(): void {\n this.panelConfig.getPopupContainer(this.pluginContext).appendChild(this.panelRoot);\n this.toDispose.push(\n Disposable.create(() => {\n // Remove from PopupContainer\n this.panelRoot.remove();\n })\n );\n const commonStyle = {\n pointerEvents: 'none',\n width: '100%',\n height: '100%',\n position: 'absolute',\n left: 0,\n top: 0,\n zIndex: 100,\n };\n domUtils.setStyle(this.panelRoot, commonStyle);\n }\n\n render(): JSX.Element {\n if (!this.layout) {\n const { children, ...layoutProps } = this.panelConfig.layerProps;\n this.layout = createElement(PanelLayerComp, layoutProps, children);\n }\n return ReactDOM.createPortal(this.layout, this.panelRoot);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport clsx from 'clsx';\n\nimport { useGlobalCSS } from '../../hooks/use-global-css';\nimport { PanelArea } from './panel';\nimport { globalCSS } from './css';\n\nexport type PanelLayerProps = React.PropsWithChildren<{\n /** 模式:悬浮|挤压 */\n mode?: 'floating' | 'docked';\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport const PanelLayer: React.FC<PanelLayerProps> = ({\n mode = 'floating',\n className,\n style,\n children,\n}) => {\n useGlobalCSS({\n cssText: globalCSS,\n id: 'flow-panel-layer-css',\n });\n\n return (\n <div\n className={clsx(\n 'gedit-flow-panel-layer-wrap',\n mode === 'docked' && 'gedit-flow-panel-layer-wrap-docked',\n mode === 'floating' && 'gedit-flow-panel-layer-wrap-floating',\n className\n )}\n style={style}\n >\n <div className=\"gedit-flow-panel-left-area\">\n <div className=\"gedit-flow-panel-main-area\">{children}</div>\n <div className=\"gedit-flow-panel-bottom-area\">\n <PanelArea area={mode === 'docked' ? 'docked-bottom' : 'bottom'} />\n </div>\n </div>\n <div className=\"gedit-flow-panel-right-area\">\n <PanelArea area={mode === 'docked' ? 'docked-right' : 'right'} />\n </div>\n </div>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect } from 'react';\n\ninterface UseGlobalCSSOptions {\n cssText: string;\n id: string;\n cleanup?: boolean;\n}\n\nexport const useGlobalCSS = ({ cssText, id, cleanup }: UseGlobalCSSOptions) => {\n useEffect(() => {\n /** SSR safe */\n if (typeof document === 'undefined') return;\n\n if (document.getElementById(id)) return;\n\n const style = document.createElement('style');\n style.id = id;\n style.textContent = cssText;\n document.head.appendChild(style);\n\n return () => {\n const existing = document.getElementById(id);\n if (existing && cleanup) existing.remove();\n };\n }, [id]);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, startTransition, useState, useRef } from 'react';\n\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\nimport { shallow } from 'zustand/shallow';\nimport clsx from 'clsx';\n\nimport { Area } from '../../types';\nimport { PanelEntity } from '../../services/panel-factory';\nimport { usePanelManager } from '../../hooks/use-panel-manager';\nimport { PanelContext } from '../../contexts';\n\nconst PanelItem: React.FC<{ panel: PanelEntity }> = ({ panel }) => {\n const panelManager = usePanelManager();\n const ref = useRef<HTMLDivElement>(null);\n const resize =\n panel.factory.resize !== undefined ? panel.factory.resize : panelManager.config.autoResize;\n\n const isHorizontal = ['right', 'docked-right'].includes(panel.area);\n\n const size = useStoreWithEqualityFn(panel.store, (s) => s.size, shallow);\n\n const sizeStyle = isHorizontal ? { width: size } : { height: size };\n const handleResize = (next: number) => {\n let nextSize = next;\n if (typeof panel.factory.maxSize === 'number' && nextSize > panel.factory.maxSize) {\n nextSize = panel.factory.maxSize;\n } else if (typeof panel.factory.minSize === 'number' && nextSize < panel.factory.minSize) {\n nextSize = panel.factory.minSize;\n }\n panel.store.setState({ size: nextSize });\n };\n\n useEffect(() => {\n /** The set size may be illegal and needs to be updated according to the real element rendered for the first time. */\n if (ref.current) {\n const { width, height } = ref.current.getBoundingClientRect();\n const realSize = isHorizontal ? width : height;\n panel.store.setState({ size: realSize });\n }\n }, []);\n\n return (\n <div\n className={clsx(\n 'gedit-flow-panel-wrap',\n isHorizontal ? 'panel-horizontal' : 'panel-vertical'\n )}\n key={panel.id}\n ref={ref}\n style={{ ...panel.factory.style, ...panel.config.style, ...sizeStyle }}\n >\n {resize &&\n panelManager.config.resizeBarRender({\n size,\n direction: isHorizontal ? 'vertical' : 'horizontal',\n onResize: handleResize,\n })}\n {panel.renderer}\n </div>\n );\n};\n\nexport const PanelArea: React.FC<{ area: Area }> = ({ area }) => {\n const panelManager = usePanelManager();\n const [panels, setPanels] = useState(panelManager.getPanels(area));\n\n useEffect(() => {\n const dispose = panelManager.onPanelsChange(() => {\n startTransition(() => {\n setPanels(panelManager.getPanels(area));\n });\n });\n return () => dispose.dispose();\n }, []);\n\n return (\n <>\n {panels.map((panel) => (\n <PanelContext.Provider value={panel} key={panel.id}>\n <PanelItem panel={panel} />\n </PanelContext.Provider>\n ))}\n </>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useService } from '@flowgram.ai/core';\n\nimport { PanelManager } from '../services/panel-manager';\n\nexport const usePanelManager = () => useService<PanelManager>(PanelManager);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { createContext } from 'react';\n\nimport type { PanelEntity } from './services/panel-factory';\n\nexport const PanelContext = createContext({} as PanelEntity);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport const globalCSS = `\n .gedit-flow-panel-layer-wrap * {\n box-sizing: border-box;\n }\n .gedit-flow-panel-layer-wrap {\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n .gedit-flow-panel-layer-wrap-docked {\n\n }\n .gedit-flow-panel-layer-wrap-floating {\n column-gap: 4px;\n padding: 4px;\n pointer-events: none;\n }\n\n .gedit-flow-panel-left-area {\n width: 100%;\n min-width: 0;\n flex-grow: 0;\n flex-shrink: 1;\n display: flex;\n flex-direction: column;\n }\n .gedit-flow-panel-layer-wrap-floating .gedit-flow-panel-left-area {\n row-gap: 4px;\n }\n .gedit-flow-panel-right-area {\n height: 100%;\n flex-grow: 1;\n flex-shrink: 0;\n min-width: 0;\n display: flex;\n column-gap: 4px;\n max-width: 100%;\n }\n\n .gedit-flow-panel-main-area {\n position: relative;\n overflow: hidden;\n flex-grow: 0;\n flex-shrink: 1;\n width: 100%;\n height: 100%;\n }\n .gedit-flow-panel-bottom-area {\n flex-grow: 1;\n flex-shrink: 0;\n width: 100%;\n min-height: 0;\n }\n .gedit-flow-panel-wrap {\n pointer-events: auto;\n overflow: auto;\n position: relative;\n }\n .gedit-flow-panel-wrap.panel-horizontal {\n height: 100%;\n }\n .gedit-flow-panel-wrap.panel-vertical {\n width: 100%;\n }\n`;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { PanelLayer, PanelLayerProps } from './panel-layer';\n\nexport type DockedPanelLayerProps = Omit<PanelLayerProps, 'mode'>;\n\nexport const DockedPanelLayer: React.FC<DockedPanelLayerProps> = (props) => (\n <PanelLayer mode=\"docked\" {...props} />\n);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext } from 'react';\n\nimport { PanelContext } from '../contexts';\n\nexport const usePanel = () => useContext(PanelContext);\n"],"mappings":"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","names":["injectable","injectable","e","injectable","inject","inject","injectable","injectable","inject","clsx","useEffect","useState","useRef","jsx","useRef","useEffect","useState","jsx","jsxs","clsx","jsx","PanelLayer","inject","injectable","PanelLayer"]}
|
|
1
|
+
{"version":3,"sources":["../../src/create-panel-manager-plugin.ts","../../src/services/panel-factory.ts","../../src/services/panel-restore.ts","../../src/components/resize-bar/index.tsx","../../src/services/panel-config.ts","../../src/utils.ts","../../src/services/panel-manager.ts","../../src/services/panel-layer.ts","../../src/components/panel-layer/panel-layer.tsx","../../src/hooks/use-global-css.ts","../../src/components/panel-layer/panel.tsx","../../src/hooks/use-panel-manager.ts","../../src/hooks/use-panel.ts","../../src/contexts.ts","../../src/components/panel-layer/css.ts","../../src/components/panel-layer/docked-panel-layer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator } from '@flowgram.ai/core';\n\nimport {\n PanelEntityFactory,\n PanelEntity,\n PanelEntityFactoryConstant,\n PanelEntityConfigConstant,\n} from './services/panel-factory';\nimport { defineConfig } from './services/panel-config';\nimport {\n PanelManager,\n PanelManagerConfig,\n PanelLayer,\n PanelRestore,\n PanelRestoreImpl,\n} from './services';\n\nexport const createPanelManagerPlugin = definePluginCreator<Partial<PanelManagerConfig>>({\n onBind: ({ bind }, opt) => {\n bind(PanelManager).to(PanelManager).inSingletonScope();\n bind(PanelRestore).to(PanelRestoreImpl).inSingletonScope();\n bind(PanelManagerConfig).toConstantValue(defineConfig(opt));\n bind(PanelEntityFactory).toFactory(\n (context) =>\n ({\n factory,\n config,\n }: {\n factory: PanelEntityFactoryConstant;\n config: PanelEntityConfigConstant;\n }) => {\n const container = context.container.createChild();\n container.bind(PanelEntityFactoryConstant).toConstantValue(factory);\n container.bind(PanelEntityConfigConstant).toConstantValue(config);\n const panel = container.resolve(PanelEntity);\n panel.init();\n return panel;\n }\n );\n },\n onInit(ctx) {\n ctx.playground.registerLayer(PanelLayer);\n const panelManager = ctx.container.get<PanelManager>(PanelManager);\n panelManager.init();\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { createStore, StoreApi } from 'zustand/vanilla';\nimport { nanoid } from 'nanoid';\nimport { inject, injectable } from 'inversify';\n\nimport type { PanelFactory, PanelEntityConfig, Area } from '../types';\nimport { PanelRestore } from './panel-restore';\nimport { PanelManagerConfig } from './panel-config';\nimport { merge } from '../utils';\n\nexport const PanelEntityFactory = Symbol('PanelEntityFactory');\nexport type PanelEntityFactory = (options: {\n factory: PanelEntityFactoryConstant;\n config: PanelEntityConfigConstant;\n}) => PanelEntity;\n\nexport const PanelEntityFactoryConstant = Symbol('PanelEntityFactoryConstant');\nexport type PanelEntityFactoryConstant = PanelFactory<any>;\nexport const PanelEntityConfigConstant = Symbol('PanelEntityConfigConstant');\nexport type PanelEntityConfigConstant = PanelEntityConfig<any> & {\n area: Area;\n};\n\nconst PANEL_SIZE_DEFAULT = 400;\n\nexport interface PanelEntityState {\n size: number;\n fullscreen: boolean;\n visible: boolean;\n}\n\n@injectable()\nexport class PanelEntity {\n @inject(PanelRestore) restore: PanelRestore;\n\n /** 面板工厂 */\n @inject(PanelEntityFactoryConstant) public factory: PanelEntityFactoryConstant;\n\n @inject(PanelEntityConfigConstant) public config: PanelEntityConfigConstant;\n\n @inject(PanelManagerConfig) readonly globalConfig: PanelManagerConfig;\n\n private initialized = false;\n\n /** 实例唯一标识 */\n id: string = nanoid();\n\n /** 渲染缓存 */\n node: React.ReactNode = null;\n\n store: StoreApi<PanelEntityState>;\n\n get area() {\n return this.config.area;\n }\n\n get mode() {\n return this.config.area.startsWith('docked') ? 'docked' : 'floating';\n }\n\n get key() {\n return this.factory.key;\n }\n\n get renderer() {\n if (!this.node) {\n this.node = this.factory.render(this.config.props);\n }\n return this.node;\n }\n\n get fullscreen() {\n return this.store.getState().fullscreen;\n }\n\n set fullscreen(next: boolean) {\n this.store.setState({ fullscreen: next });\n }\n\n get resizable() {\n if (this.fullscreen) {\n return false;\n }\n return this.factory.resize !== undefined ? this.factory.resize : this.globalConfig.autoResize;\n }\n\n get keepDOM() {\n return this.factory.keepDOM;\n }\n\n get visible() {\n return this.store.getState().visible;\n }\n\n set visible(next: boolean) {\n this.store.setState({ visible: next });\n }\n\n get layer() {\n return document.querySelector(\n this.mode ? '.gedit-flow-panel-layer-wrap-docked' : '.gedit-flow-panel-layer-wrap-floating'\n );\n }\n\n init() {\n if (this.initialized) {\n return;\n }\n this.initialized = true;\n const cache = this.restore.restore<PanelEntityState>(this.key);\n\n const initialState = merge<PanelEntityState>(\n {\n size: this.config.defaultSize,\n fullscreen: this.config.fullscreen,\n },\n cache ? cache : {},\n {\n size: this.factory.defaultSize || PANEL_SIZE_DEFAULT,\n fullscreen: this.factory.fullscreen || false,\n ...(this.factory.keepDOM ? { visible: true } : {}),\n }\n );\n\n this.store = createStore<PanelEntityState>(() => initialState);\n }\n\n mergeState() {}\n\n dispose() {\n this.restore.store(this.key, this.store.getState());\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable } from 'inversify';\n\nexport const PanelRestore = Symbol('PanelRestore');\nexport interface PanelRestore {\n store: (k: string, v: any) => void;\n restore: <T>(k: string) => T | undefined;\n}\n\n@injectable()\nexport class PanelRestoreImpl implements PanelRestore {\n map = new Map<string, any>();\n\n store(k: string, v: any) {\n this.map.set(k, v);\n }\n\n restore<T>(k: string): T | undefined {\n return this.map.get(k) as T;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { useRef, useState } from 'react';\n\ninterface Props {\n size: number;\n direction?: 'vertical' | 'horizontal';\n onResize: (w: number) => void;\n}\n\nexport const ResizeBar: React.FC<Props> = ({ onResize, size, direction }) => {\n const currentPoint = useRef<null | number>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n\n const isVertical = direction === 'vertical';\n\n return (\n <div\n onMouseDown={(e) => {\n currentPoint.current = isVertical ? e.clientX : e.clientY;\n e.stopPropagation();\n e.preventDefault();\n setIsDragging(true);\n const mouseUp = () => {\n currentPoint.current = null;\n document.body.removeEventListener('mouseup', mouseUp);\n document.body.removeEventListener('mousemove', mouseMove);\n setIsDragging(false);\n };\n const mouseMove = (e: MouseEvent) => {\n const delta = currentPoint.current! - (isVertical ? e.clientX : e.clientY);\n onResize(size + delta);\n };\n document.body.addEventListener('mouseup', mouseUp);\n document.body.addEventListener('mousemove', mouseMove);\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n zIndex: 999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'auto',\n ...(isVertical\n ? {\n cursor: 'ew-resize',\n height: '100%',\n marginLeft: -5,\n width: 10,\n }\n : {\n cursor: 'ns-resize',\n width: '100%',\n marginTop: -5,\n height: 10,\n }),\n }}\n >\n <div\n style={{\n ...(isVertical\n ? {\n width: 3,\n height: '100%',\n }\n : {\n height: 3,\n width: '100%',\n }),\n backgroundColor: isDragging || isHovered ? 'var(--g-playground-line)' : 'transparent',\n }}\n />\n </div>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { PluginContext } from '@flowgram.ai/core';\n\nimport type { PanelFactory, PanelConfig } from '../types';\nimport { ResizeBar } from '../components/resize-bar';\nimport type { PanelLayerProps } from '../components/panel-layer';\n\nexport interface PanelManagerConfig {\n factories: PanelFactory<any>[];\n right: PanelConfig;\n bottom: PanelConfig;\n dockedRight: PanelConfig;\n dockedBottom: PanelConfig;\n /** Resizable, and multi-panel options mutually exclusive */\n autoResize: boolean;\n layerProps: PanelLayerProps;\n resizeBarRender: ({\n size,\n }: {\n size: number;\n direction?: 'vertical' | 'horizontal';\n onResize: (size: number) => void;\n }) => React.ReactNode;\n getPopupContainer: (ctx: PluginContext) => HTMLElement; // default playground.node.parentElement\n}\n\nexport const PanelManagerConfig = Symbol('PanelManagerConfig');\n\nexport const defineConfig = (config: Partial<PanelManagerConfig>) => {\n const defaultConfig: PanelManagerConfig = {\n right: {\n max: 1,\n },\n bottom: {\n max: 1,\n },\n dockedRight: {\n max: 1,\n },\n dockedBottom: {\n max: 1,\n },\n factories: [],\n autoResize: true,\n layerProps: {},\n resizeBarRender: ResizeBar,\n getPopupContainer: (ctx: PluginContext) => ctx.playground.node.parentNode as HTMLElement,\n };\n return {\n ...defaultConfig,\n ...config,\n };\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport const merge = <T>(...objs: Partial<T>[]) => {\n const result: any = {};\n\n for (const obj of objs) {\n if (!obj || typeof obj !== 'object') continue;\n\n for (const key of Object.keys(obj)) {\n const value = (obj as any)[key];\n\n if (result[key] === undefined) {\n result[key] = value;\n }\n }\n }\n\n return result as T;\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { injectable, inject } from 'inversify';\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport { PanelManagerConfig } from './panel-config';\nimport type { Area, PanelEntityConfig, PanelFactory } from '../types';\nimport { PanelEntity, PanelEntityFactory } from './panel-factory';\n\n@injectable()\nexport class PanelManager {\n @inject(PanelManagerConfig) readonly config: PanelManagerConfig;\n\n @inject(PanelEntityFactory) readonly createPanel: PanelEntityFactory;\n\n readonly panelRegistry = new Map<string, PanelFactory<any>>();\n\n private panels = new Map<string, PanelEntity>();\n\n private onPanelsChangeEvent = new Emitter<void>();\n\n public onPanelsChange = this.onPanelsChangeEvent.event;\n\n init() {\n this.config.factories.forEach((factory) => this.register(factory));\n }\n\n /** registry panel factory */\n register<T extends any>(factory: PanelFactory<T>) {\n this.panelRegistry.set(factory.key, factory);\n }\n\n /** open panel */\n public open(key: string, area: Area = 'right', options?: PanelEntityConfig) {\n const factory = this.panelRegistry.get(key);\n if (!factory) {\n return;\n }\n\n const sameKeyPanels = this.getPanels(area).filter((p) => p.key === key);\n\n if (factory.keepDOM && sameKeyPanels.length) {\n const [panel] = sameKeyPanels;\n // move to last\n this.panels.delete(panel.id);\n this.panels.set(panel.id, panel);\n panel.visible = true;\n } else {\n if (!factory.allowDuplicates && sameKeyPanels.length) {\n sameKeyPanels.forEach((p) => this.remove(p.id));\n }\n const panel = this.createPanel({\n factory,\n config: {\n area,\n ...options,\n },\n });\n\n this.panels.set(panel.id, panel);\n }\n\n this.trim(area);\n this.onPanelsChangeEvent.fire();\n }\n\n /** close panel */\n public close(key?: string) {\n const panels = this.getPanels();\n const closedPanels = key ? panels.filter((p) => p.key === key) : panels;\n closedPanels.forEach((panel) => {\n this.remove(panel.id);\n });\n this.onPanelsChangeEvent.fire();\n }\n\n private trim(area: Area) {\n /** 1. general panel; 2. keepDOM visible panel */\n const panels = this.getPanels(area).filter((p) => !p.keepDOM || p.visible);\n const areaConfig = this.getAreaConfig(area);\n while (panels.length > areaConfig.max) {\n const removed = panels.shift();\n if (removed) {\n this.remove(removed.id);\n }\n }\n }\n\n private remove(id: string) {\n const panel = this.panels.get(id);\n if (!panel) {\n return;\n }\n if (panel.keepDOM) {\n panel.visible = false;\n } else {\n panel.dispose();\n this.panels.delete(id);\n }\n }\n\n getPanels(area?: Area) {\n const panels: PanelEntity[] = [];\n this.panels.forEach((panel) => {\n if (!area || panel.area === area) {\n panels.push(panel);\n }\n });\n return panels;\n }\n\n getAreaConfig(area: Area) {\n switch (area) {\n case 'docked-bottom':\n return this.config.dockedBottom;\n case 'docked-right':\n return this.config.dockedRight;\n case 'bottom':\n return this.config.bottom;\n case 'right':\n default:\n return this.config.right;\n }\n }\n\n dispose() {\n this.onPanelsChangeEvent.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport ReactDOM from 'react-dom';\nimport { createElement } from 'react';\n\nimport { injectable, inject } from 'inversify';\nimport { domUtils, Disposable } from '@flowgram.ai/utils';\nimport { Layer, PluginContext } from '@flowgram.ai/core';\n\nimport { PanelLayer as PanelLayerComp } from '../components/panel-layer';\nimport { PanelManagerConfig } from './panel-config';\n\n@injectable()\nexport class PanelLayer extends Layer {\n @inject(PanelManagerConfig) private readonly panelConfig: PanelManagerConfig;\n\n @inject(PluginContext) private readonly pluginContext: PluginContext;\n\n readonly panelRoot = domUtils.createDivWithClass('gedit-flow-panel-layer');\n\n layout: JSX.Element | null = null;\n\n onReady(): void {\n this.panelConfig.getPopupContainer(this.pluginContext).appendChild(this.panelRoot);\n this.toDispose.push(\n Disposable.create(() => {\n // Remove from PopupContainer\n this.panelRoot.remove();\n })\n );\n const commonStyle = {\n pointerEvents: 'none',\n width: '100%',\n height: '100%',\n position: 'absolute',\n left: 0,\n top: 0,\n zIndex: 100,\n };\n domUtils.setStyle(this.panelRoot, commonStyle);\n }\n\n render(): JSX.Element {\n if (!this.layout) {\n const { children, ...layoutProps } = this.panelConfig.layerProps;\n this.layout = createElement(PanelLayerComp, layoutProps, children);\n }\n return ReactDOM.createPortal(this.layout, this.panelRoot);\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport clsx from 'clsx';\n\nimport { useGlobalCSS } from '../../hooks/use-global-css';\nimport { PanelArea } from './panel';\nimport { globalCSS } from './css';\n\nexport type PanelLayerProps = React.PropsWithChildren<{\n /** 模式:悬浮|挤压 */\n mode?: 'floating' | 'docked';\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport const PanelLayer: React.FC<PanelLayerProps> = ({\n mode = 'floating',\n className,\n style,\n children,\n}) => {\n useGlobalCSS({\n cssText: globalCSS,\n id: 'flow-panel-layer-css',\n });\n\n return (\n <div\n className={clsx(\n 'gedit-flow-panel-layer-wrap',\n mode === 'docked' && 'gedit-flow-panel-layer-wrap-docked',\n mode === 'floating' && 'gedit-flow-panel-layer-wrap-floating',\n className\n )}\n style={style}\n >\n <div className=\"gedit-flow-panel-left-area\">\n <div className=\"gedit-flow-panel-main-area\">{children}</div>\n <div className=\"gedit-flow-panel-bottom-area\">\n <PanelArea area={mode === 'docked' ? 'docked-bottom' : 'bottom'} />\n </div>\n </div>\n <div className=\"gedit-flow-panel-right-area\">\n <PanelArea area={mode === 'docked' ? 'docked-right' : 'right'} />\n </div>\n </div>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect } from 'react';\n\ninterface UseGlobalCSSOptions {\n cssText: string;\n id: string;\n cleanup?: boolean;\n}\n\nexport const useGlobalCSS = ({ cssText, id, cleanup }: UseGlobalCSSOptions) => {\n useEffect(() => {\n /** SSR safe */\n if (typeof document === 'undefined') return;\n\n if (document.getElementById(id)) return;\n\n const style = document.createElement('style');\n style.id = id;\n style.textContent = cssText;\n document.head.appendChild(style);\n\n return () => {\n const existing = document.getElementById(id);\n if (existing && cleanup) existing.remove();\n };\n }, [id]);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, startTransition, useState, useRef } from 'react';\n\nimport { clsx } from 'clsx';\n\nimport { Area } from '../../types';\nimport { PanelEntity } from '../../services/panel-factory';\nimport { usePanelManager } from '../../hooks/use-panel-manager';\nimport { usePanelStore } from '../../hooks/use-panel';\nimport { PanelContext } from '../../contexts';\n\nconst PanelItem: React.FC<{ panel: PanelEntity; hidden?: boolean }> = ({ panel, hidden }) => {\n const panelManager = usePanelManager();\n const ref = useRef<HTMLDivElement>(null);\n\n const isHorizontal = ['right', 'docked-right'].includes(panel.area);\n\n const { size, fullscreen } = usePanelStore((s) => ({\n size: s.size,\n fullscreen: s.fullscreen,\n }));\n\n const [layerSize, setLayerSize] = useState(size);\n\n const currentSize = fullscreen ? layerSize : size;\n\n const sizeStyle = isHorizontal ? { width: currentSize } : { height: currentSize };\n const handleResize = (next: number) => {\n let nextSize = next;\n if (typeof panel.factory.maxSize === 'number' && nextSize > panel.factory.maxSize) {\n nextSize = panel.factory.maxSize;\n } else if (typeof panel.factory.minSize === 'number' && nextSize < panel.factory.minSize) {\n nextSize = panel.factory.minSize;\n }\n panel.store.setState({ size: nextSize });\n };\n\n useEffect(() => {\n /** The set size may be illegal and needs to be updated according to the real element rendered for the first time. */\n if (ref.current && !fullscreen) {\n const { width, height } = ref.current.getBoundingClientRect();\n const realSize = isHorizontal ? width : height;\n panel.store.setState({ size: realSize });\n }\n }, [fullscreen]);\n\n useEffect(() => {\n if (!fullscreen) {\n return;\n }\n const layer = panel.layer;\n if (!layer) {\n return;\n }\n const observer = new ResizeObserver(([entry]) => {\n const { width, height } = entry.contentRect;\n setLayerSize(isHorizontal ? width : height);\n });\n observer.observe(layer);\n return () => observer.disconnect();\n }, [fullscreen]);\n\n return (\n <div\n className={clsx(\n 'gedit-flow-panel-wrap',\n isHorizontal ? 'panel-horizontal' : 'panel-vertical'\n )}\n key={panel.id}\n ref={ref}\n style={{\n display: hidden ? 'none' : 'block',\n ...panel.factory.style,\n ...panel.config.style,\n ...sizeStyle,\n }}\n >\n {panel.resizable &&\n panelManager.config.resizeBarRender({\n size,\n direction: isHorizontal ? 'vertical' : 'horizontal',\n onResize: handleResize,\n })}\n {panel.renderer}\n </div>\n );\n};\n\nexport const PanelArea: React.FC<{ area: Area }> = ({ area }) => {\n const panelManager = usePanelManager();\n const [panels, setPanels] = useState(panelManager.getPanels(area));\n\n useEffect(() => {\n const dispose = panelManager.onPanelsChange(() => {\n startTransition(() => {\n setPanels(panelManager.getPanels(area));\n });\n });\n return () => dispose.dispose();\n }, []);\n\n return (\n <>\n {panels.map((panel) => (\n <PanelContext.Provider value={panel} key={panel.id}>\n <PanelItem panel={panel} hidden={panel.keepDOM && !panel.visible} />\n </PanelContext.Provider>\n ))}\n </>\n );\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useService } from '@flowgram.ai/core';\n\nimport { PanelManager } from '../services/panel-manager';\n\nexport const usePanelManager = () => useService<PanelManager>(PanelManager);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useContext } from 'react';\n\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\nimport { shallow } from 'zustand/shallow';\n\nimport { PanelEntityState } from '../services/panel-factory';\nimport { PanelContext } from '../contexts';\n\nexport const usePanel = () => useContext(PanelContext);\n\nexport const usePanelStore = <T>(selector: (s: PanelEntityState) => T) => {\n const panel = usePanel();\n return useStoreWithEqualityFn(panel.store, selector, shallow);\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { createContext } from 'react';\n\nimport type { PanelEntity } from './services/panel-factory';\n\nexport const PanelContext = createContext({} as PanelEntity);\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nexport const globalCSS = `\n .gedit-flow-panel-layer-wrap * {\n box-sizing: border-box;\n }\n .gedit-flow-panel-layer-wrap {\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n .gedit-flow-panel-layer-wrap-docked {\n\n }\n .gedit-flow-panel-layer-wrap-floating {\n pointer-events: none;\n }\n\n .gedit-flow-panel-left-area {\n width: 100%;\n min-width: 0;\n flex-grow: 0;\n flex-shrink: 1;\n display: flex;\n flex-direction: column;\n }\n .gedit-flow-panel-right-area {\n height: 100%;\n flex-grow: 1;\n flex-shrink: 0;\n min-width: 0;\n display: flex;\n max-width: 100%;\n }\n\n .gedit-flow-panel-main-area {\n position: relative;\n overflow: hidden;\n flex-grow: 0;\n flex-shrink: 1;\n width: 100%;\n height: 100%;\n }\n .gedit-flow-panel-bottom-area {\n flex-grow: 1;\n flex-shrink: 0;\n width: 100%;\n min-height: 0;\n }\n .gedit-flow-panel-wrap {\n pointer-events: auto;\n overflow: auto;\n position: relative;\n }\n .gedit-flow-panel-wrap.panel-horizontal {\n height: 100%;\n }\n .gedit-flow-panel-wrap.panel-vertical {\n width: 100%;\n }\n`;\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { PanelLayer, PanelLayerProps } from './panel-layer';\n\nexport type DockedPanelLayerProps = Omit<PanelLayerProps, 'mode'>;\n\nexport const DockedPanelLayer: React.FC<DockedPanelLayerProps> = (props) => (\n <PanelLayer mode=\"docked\" {...props} />\n);\n"],"mappings":"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","names":["injectable","e","injectable","injectable","inject","inject","injectable","injectable","inject","clsx","useEffect","useState","useRef","jsx","useRef","useState","useEffect","jsx","jsxs","clsx","jsx","PanelLayer","inject","injectable","PanelLayer"]}
|