@flowgram.ai/panel-manager-plugin 0.1.0-alpha.21 → 0.1.0-alpha.22
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 +10 -9
- package/dist/esm/index.js +179 -115
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +25 -5
- package/dist/index.d.ts +25 -5
- package/dist/index.js +189 -124
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/rush-logs/panel-manager-plugin.build.log +9 -9
- package/src/components/panel-layer/css.ts +43 -40
- package/src/components/panel-layer/docked-panel-layer.tsx +12 -0
- package/src/components/panel-layer/float-panel.tsx +11 -6
- package/src/components/panel-layer/index.ts +1 -0
- package/src/components/panel-layer/panel-layer.tsx +24 -11
- package/src/components/resize-bar/index.tsx +6 -3
- package/src/index.ts +1 -0
- package/src/services/panel-config.ts +17 -0
- package/src/services/panel-manager.ts +24 -1
- package/src/types.ts +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _flowgram_ai_core from '@flowgram.ai/core';
|
|
2
|
-
import { PluginContext } from '@flowgram.ai/core';
|
|
2
|
+
import { PluginContext, Playground } from '@flowgram.ai/core';
|
|
3
3
|
import * as _flowgram_ai_utils from '@flowgram.ai/utils';
|
|
4
4
|
import React$1 from 'react';
|
|
5
5
|
|
|
@@ -7,7 +7,7 @@ import React$1 from 'react';
|
|
|
7
7
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
8
8
|
* SPDX-License-Identifier: MIT
|
|
9
9
|
*/
|
|
10
|
-
type Area = 'right' | 'bottom';
|
|
10
|
+
type Area = 'right' | 'bottom' | 'docked-right' | 'docked-bottom';
|
|
11
11
|
interface PanelConfig {
|
|
12
12
|
/** max panel */
|
|
13
13
|
max: number;
|
|
@@ -24,10 +24,20 @@ interface PanelFactory<T extends any> {
|
|
|
24
24
|
* SPDX-License-Identifier: MIT
|
|
25
25
|
*/
|
|
26
26
|
type PanelLayerProps = React.PropsWithChildren<{
|
|
27
|
+
/** 模式:悬浮|挤压 */
|
|
28
|
+
mode?: 'floating' | 'docked';
|
|
27
29
|
className?: string;
|
|
28
30
|
style?: React.CSSProperties;
|
|
29
31
|
}>;
|
|
30
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
35
|
+
* SPDX-License-Identifier: MIT
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
type DockedPanelLayerProps = Omit<PanelLayerProps, 'mode'>;
|
|
39
|
+
declare const DockedPanelLayer: React.FC<DockedPanelLayerProps>;
|
|
40
|
+
|
|
31
41
|
/**
|
|
32
42
|
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
33
43
|
* SPDX-License-Identifier: MIT
|
|
@@ -37,8 +47,15 @@ interface PanelManagerConfig {
|
|
|
37
47
|
factories: PanelFactory<any>[];
|
|
38
48
|
right: PanelConfig;
|
|
39
49
|
bottom: PanelConfig;
|
|
50
|
+
dockedRight: PanelConfig;
|
|
51
|
+
dockedBottom: PanelConfig;
|
|
40
52
|
autoResize: boolean;
|
|
41
53
|
layerProps: PanelLayerProps;
|
|
54
|
+
resizeBarRender: ({ size, }: {
|
|
55
|
+
size: number;
|
|
56
|
+
direction?: 'vertical' | 'horizontal';
|
|
57
|
+
onResize: (size: number) => void;
|
|
58
|
+
}) => React.ReactNode;
|
|
42
59
|
getPopupContainer: (ctx: PluginContext) => HTMLElement;
|
|
43
60
|
}
|
|
44
61
|
declare const PanelManagerConfig: unique symbol;
|
|
@@ -70,10 +87,13 @@ declare class FloatPanel {
|
|
|
70
87
|
*/
|
|
71
88
|
|
|
72
89
|
declare class PanelManager {
|
|
90
|
+
readonly playground: Playground;
|
|
73
91
|
readonly config: PanelManagerConfig;
|
|
74
92
|
readonly panelRegistry: Map<string, PanelFactory<any>>;
|
|
75
93
|
right: FloatPanel;
|
|
76
94
|
bottom: FloatPanel;
|
|
95
|
+
dockedRight: FloatPanel;
|
|
96
|
+
dockedBottom: FloatPanel;
|
|
77
97
|
init(): void;
|
|
78
98
|
register<T extends any>(factory: PanelFactory<T>): void;
|
|
79
99
|
open(key: string, area?: Area, options?: any): void;
|
|
@@ -97,10 +117,10 @@ declare const usePanelManager: () => PanelManager;
|
|
|
97
117
|
*/
|
|
98
118
|
|
|
99
119
|
interface Props {
|
|
100
|
-
onResize: (w: number) => void;
|
|
101
120
|
size: number;
|
|
102
|
-
|
|
121
|
+
direction?: 'vertical' | 'horizontal';
|
|
122
|
+
onResize: (w: number) => void;
|
|
103
123
|
}
|
|
104
124
|
declare const ResizeBar: React$1.FC<Props>;
|
|
105
125
|
|
|
106
|
-
export { type Area, type PanelFactory, PanelManager, PanelManagerConfig, ResizeBar, createPanelManagerPlugin, usePanelManager };
|
|
126
|
+
export { type Area, DockedPanelLayer, type DockedPanelLayerProps, type PanelFactory, PanelManager, PanelManagerConfig, ResizeBar, createPanelManagerPlugin, usePanelManager };
|
package/dist/index.js
CHANGED
|
@@ -38,6 +38,7 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
38
38
|
// src/index.ts
|
|
39
39
|
var index_exports = {};
|
|
40
40
|
__export(index_exports, {
|
|
41
|
+
DockedPanelLayer: () => DockedPanelLayer,
|
|
41
42
|
PanelManager: () => PanelManager,
|
|
42
43
|
ResizeBar: () => ResizeBar,
|
|
43
44
|
createPanelManagerPlugin: () => createPanelManagerPlugin,
|
|
@@ -46,7 +47,78 @@ __export(index_exports, {
|
|
|
46
47
|
module.exports = __toCommonJS(index_exports);
|
|
47
48
|
|
|
48
49
|
// src/create-panel-manager-plugin.ts
|
|
49
|
-
var
|
|
50
|
+
var import_core4 = require("@flowgram.ai/core");
|
|
51
|
+
|
|
52
|
+
// src/components/resize-bar/index.tsx
|
|
53
|
+
var import_react = require("react");
|
|
54
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
55
|
+
var ResizeBar = ({ onResize, size, direction }) => {
|
|
56
|
+
const currentPoint = (0, import_react.useRef)(null);
|
|
57
|
+
const [isDragging, setIsDragging] = (0, import_react.useState)(false);
|
|
58
|
+
const [isHovered, setIsHovered] = (0, import_react.useState)(false);
|
|
59
|
+
const isVertical = direction === "vertical";
|
|
60
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
onMouseDown: (e) => {
|
|
64
|
+
currentPoint.current = isVertical ? e.clientX : e.clientY;
|
|
65
|
+
e.stopPropagation();
|
|
66
|
+
e.preventDefault();
|
|
67
|
+
setIsDragging(true);
|
|
68
|
+
const mouseUp = () => {
|
|
69
|
+
currentPoint.current = null;
|
|
70
|
+
document.body.removeEventListener("mouseup", mouseUp);
|
|
71
|
+
document.body.removeEventListener("mousemove", mouseMove);
|
|
72
|
+
setIsDragging(false);
|
|
73
|
+
};
|
|
74
|
+
const mouseMove = (e2) => {
|
|
75
|
+
const delta = currentPoint.current - (isVertical ? e2.clientX : e2.clientY);
|
|
76
|
+
onResize(size + delta);
|
|
77
|
+
};
|
|
78
|
+
document.body.addEventListener("mouseup", mouseUp);
|
|
79
|
+
document.body.addEventListener("mousemove", mouseMove);
|
|
80
|
+
},
|
|
81
|
+
onMouseEnter: () => setIsHovered(true),
|
|
82
|
+
onMouseLeave: () => setIsHovered(false),
|
|
83
|
+
style: {
|
|
84
|
+
position: "absolute",
|
|
85
|
+
top: 0,
|
|
86
|
+
left: 0,
|
|
87
|
+
zIndex: 999,
|
|
88
|
+
display: "flex",
|
|
89
|
+
alignItems: "center",
|
|
90
|
+
justifyContent: "center",
|
|
91
|
+
pointerEvents: "auto",
|
|
92
|
+
...isVertical ? {
|
|
93
|
+
cursor: "ew-resize",
|
|
94
|
+
height: "100%",
|
|
95
|
+
marginLeft: -5,
|
|
96
|
+
width: 10
|
|
97
|
+
} : {
|
|
98
|
+
cursor: "ns-resize",
|
|
99
|
+
width: "100%",
|
|
100
|
+
marginTop: -5,
|
|
101
|
+
height: 10
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
105
|
+
"div",
|
|
106
|
+
{
|
|
107
|
+
style: {
|
|
108
|
+
...isVertical ? {
|
|
109
|
+
width: 3,
|
|
110
|
+
height: "100%"
|
|
111
|
+
} : {
|
|
112
|
+
height: 3,
|
|
113
|
+
width: "100%"
|
|
114
|
+
},
|
|
115
|
+
backgroundColor: isDragging || isHovered ? "var(--g-playground-line)" : "transparent"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
};
|
|
50
122
|
|
|
51
123
|
// src/services/panel-config.ts
|
|
52
124
|
var PanelManagerConfig = Symbol("PanelManagerConfig");
|
|
@@ -58,9 +130,16 @@ var defineConfig = (config) => {
|
|
|
58
130
|
bottom: {
|
|
59
131
|
max: 1
|
|
60
132
|
},
|
|
133
|
+
dockedRight: {
|
|
134
|
+
max: 1
|
|
135
|
+
},
|
|
136
|
+
dockedBottom: {
|
|
137
|
+
max: 1
|
|
138
|
+
},
|
|
61
139
|
factories: [],
|
|
62
140
|
autoResize: true,
|
|
63
141
|
layerProps: {},
|
|
142
|
+
resizeBarRender: ResizeBar,
|
|
64
143
|
getPopupContainer: (ctx) => ctx.playground.node.parentNode
|
|
65
144
|
};
|
|
66
145
|
return {
|
|
@@ -71,6 +150,7 @@ var defineConfig = (config) => {
|
|
|
71
150
|
|
|
72
151
|
// src/services/panel-manager.ts
|
|
73
152
|
var import_inversify = require("inversify");
|
|
153
|
+
var import_core = require("@flowgram.ai/core");
|
|
74
154
|
|
|
75
155
|
// src/services/float-panel.ts
|
|
76
156
|
var import_utils = require("@flowgram.ai/utils");
|
|
@@ -134,6 +214,8 @@ var PanelManager = class {
|
|
|
134
214
|
this.config.factories.forEach((factory) => this.register(factory));
|
|
135
215
|
this.right = new FloatPanel(this.config.right);
|
|
136
216
|
this.bottom = new FloatPanel(this.config.bottom);
|
|
217
|
+
this.dockedRight = new FloatPanel(this.config.dockedRight);
|
|
218
|
+
this.dockedBottom = new FloatPanel(this.config.dockedBottom);
|
|
137
219
|
}
|
|
138
220
|
register(factory) {
|
|
139
221
|
this.panelRegistry.set(factory.key, factory);
|
|
@@ -149,15 +231,32 @@ var PanelManager = class {
|
|
|
149
231
|
close(key) {
|
|
150
232
|
this.right.close(key);
|
|
151
233
|
this.bottom.close(key);
|
|
234
|
+
this.dockedRight.close(key);
|
|
235
|
+
this.dockedBottom.close(key);
|
|
152
236
|
}
|
|
153
237
|
getPanel(area) {
|
|
154
|
-
|
|
238
|
+
switch (area) {
|
|
239
|
+
case "docked-bottom":
|
|
240
|
+
return this.dockedBottom;
|
|
241
|
+
case "docked-right":
|
|
242
|
+
return this.dockedRight;
|
|
243
|
+
case "bottom":
|
|
244
|
+
return this.bottom;
|
|
245
|
+
case "right":
|
|
246
|
+
default:
|
|
247
|
+
return this.right;
|
|
248
|
+
}
|
|
155
249
|
}
|
|
156
250
|
dispose() {
|
|
157
251
|
this.right.dispose();
|
|
158
252
|
this.bottom.dispose();
|
|
253
|
+
this.dockedBottom.dispose();
|
|
254
|
+
this.dockedRight.dispose();
|
|
159
255
|
}
|
|
160
256
|
};
|
|
257
|
+
__decorateClass([
|
|
258
|
+
(0, import_inversify.inject)(import_core.Playground)
|
|
259
|
+
], PanelManager.prototype, "playground", 2);
|
|
161
260
|
__decorateClass([
|
|
162
261
|
(0, import_inversify.inject)(PanelManagerConfig)
|
|
163
262
|
], PanelManager.prototype, "config", 2);
|
|
@@ -170,15 +269,15 @@ var import_react_dom = __toESM(require("react-dom"));
|
|
|
170
269
|
var import_react4 = require("react");
|
|
171
270
|
var import_inversify2 = require("inversify");
|
|
172
271
|
var import_utils2 = require("@flowgram.ai/utils");
|
|
173
|
-
var
|
|
272
|
+
var import_core3 = require("@flowgram.ai/core");
|
|
174
273
|
|
|
175
274
|
// src/components/panel-layer/panel-layer.tsx
|
|
176
275
|
var import_clsx = __toESM(require("clsx"));
|
|
177
276
|
|
|
178
277
|
// src/hooks/use-global-css.ts
|
|
179
|
-
var
|
|
278
|
+
var import_react2 = require("react");
|
|
180
279
|
var useGlobalCSS = ({ cssText, id, cleanup }) => {
|
|
181
|
-
(0,
|
|
280
|
+
(0, import_react2.useEffect)(() => {
|
|
182
281
|
if (typeof document === "undefined") return;
|
|
183
282
|
if (document.getElementById(id)) return;
|
|
184
283
|
const style = document.createElement("style");
|
|
@@ -196,58 +295,67 @@ var useGlobalCSS = ({ cssText, id, cleanup }) => {
|
|
|
196
295
|
var import_react3 = require("react");
|
|
197
296
|
|
|
198
297
|
// src/hooks/use-panel-manager.ts
|
|
199
|
-
var
|
|
200
|
-
var usePanelManager = () => (0,
|
|
298
|
+
var import_core2 = require("@flowgram.ai/core");
|
|
299
|
+
var usePanelManager = () => (0, import_core2.useService)(PanelManager);
|
|
201
300
|
|
|
202
301
|
// src/components/panel-layer/css.ts
|
|
203
302
|
var globalCSS = `
|
|
204
|
-
.gedit-flow-panel-layer * {
|
|
303
|
+
.gedit-flow-panel-layer-wrap * {
|
|
205
304
|
box-sizing: border-box;
|
|
206
305
|
}
|
|
207
306
|
.gedit-flow-panel-layer-wrap {
|
|
208
|
-
pointer-events: none;
|
|
209
307
|
position: absolute;
|
|
210
308
|
top: 0;
|
|
211
309
|
left: 0;
|
|
212
310
|
display: flex;
|
|
213
|
-
column-gap: 4px;
|
|
214
311
|
width: 100%;
|
|
215
312
|
height: 100%;
|
|
313
|
+
overflow: hidden;
|
|
314
|
+
}
|
|
315
|
+
.gedit-flow-panel-layer-wrap-docked {
|
|
316
|
+
|
|
317
|
+
}
|
|
318
|
+
.gedit-flow-panel-layer-wrap-floating {
|
|
319
|
+
column-gap: 4px;
|
|
216
320
|
padding: 4px;
|
|
321
|
+
pointer-events: none;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.gedit-flow-panel-left-area {
|
|
325
|
+
width: 100%;
|
|
326
|
+
min-width: 0;
|
|
327
|
+
flex-grow: 0;
|
|
328
|
+
flex-shrink: 1;
|
|
329
|
+
display: flex;
|
|
330
|
+
flex-direction: column;
|
|
331
|
+
}
|
|
332
|
+
.gedit-flow-panel-layer-wrap-floating .gedit-flow-panel-left-area {
|
|
333
|
+
row-gap: 4px;
|
|
334
|
+
}
|
|
335
|
+
.gedit-flow-panel-right-area {
|
|
336
|
+
height: 100%;
|
|
337
|
+
flex-grow: 1;
|
|
338
|
+
flex-shrink: 0;
|
|
339
|
+
min-width: 0;
|
|
340
|
+
display: flex;
|
|
341
|
+
column-gap: 4px;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.gedit-flow-panel-main-area {
|
|
345
|
+
position: relative;
|
|
217
346
|
overflow: hidden;
|
|
347
|
+
flex-grow: 0;
|
|
348
|
+
flex-shrink: 1;
|
|
349
|
+
width: 100%;
|
|
350
|
+
height: 100%;
|
|
351
|
+
}
|
|
352
|
+
.gedit-flow-panel-bottom-area {
|
|
353
|
+
flex-grow: 1;
|
|
354
|
+
flex-shrink: 0;
|
|
355
|
+
width: 100%;
|
|
356
|
+
min-height: 0;
|
|
218
357
|
}
|
|
219
358
|
`;
|
|
220
|
-
var leftArea = {
|
|
221
|
-
width: "100%",
|
|
222
|
-
minWidth: 0,
|
|
223
|
-
flexGrow: 0,
|
|
224
|
-
flexShrink: 1,
|
|
225
|
-
display: "flex",
|
|
226
|
-
flexDirection: "column",
|
|
227
|
-
rowGap: "4px"
|
|
228
|
-
};
|
|
229
|
-
var rightArea = {
|
|
230
|
-
height: "100%",
|
|
231
|
-
flexGrow: 1,
|
|
232
|
-
flexShrink: 0,
|
|
233
|
-
minWidth: 0,
|
|
234
|
-
display: "flex",
|
|
235
|
-
columnGap: "4px"
|
|
236
|
-
};
|
|
237
|
-
var mainArea = {
|
|
238
|
-
position: "relative",
|
|
239
|
-
overflow: "hidden",
|
|
240
|
-
flexGrow: 0,
|
|
241
|
-
flexShrink: 1,
|
|
242
|
-
width: "100%",
|
|
243
|
-
height: "100%"
|
|
244
|
-
};
|
|
245
|
-
var bottomArea = {
|
|
246
|
-
flexGrow: 1,
|
|
247
|
-
flexShrink: 0,
|
|
248
|
-
width: "100%",
|
|
249
|
-
minHeight: 0
|
|
250
|
-
};
|
|
251
359
|
var floatPanelWrap = {
|
|
252
360
|
pointerEvents: "auto",
|
|
253
361
|
height: "100%",
|
|
@@ -255,82 +363,13 @@ var floatPanelWrap = {
|
|
|
255
363
|
overflow: "auto"
|
|
256
364
|
};
|
|
257
365
|
|
|
258
|
-
// src/components/resize-bar/index.tsx
|
|
259
|
-
var import_react2 = require("react");
|
|
260
|
-
var import_jsx_runtime = require("react/jsx-runtime");
|
|
261
|
-
var ResizeBar = ({ onResize, size, isVertical }) => {
|
|
262
|
-
const currentPoint = (0, import_react2.useRef)(null);
|
|
263
|
-
const [isDragging, setIsDragging] = (0, import_react2.useState)(false);
|
|
264
|
-
const [isHovered, setIsHovered] = (0, import_react2.useState)(false);
|
|
265
|
-
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
266
|
-
"div",
|
|
267
|
-
{
|
|
268
|
-
onMouseDown: (e) => {
|
|
269
|
-
currentPoint.current = isVertical ? e.clientX : e.clientY;
|
|
270
|
-
e.stopPropagation();
|
|
271
|
-
e.preventDefault();
|
|
272
|
-
setIsDragging(true);
|
|
273
|
-
const mouseUp = () => {
|
|
274
|
-
currentPoint.current = null;
|
|
275
|
-
document.body.removeEventListener("mouseup", mouseUp);
|
|
276
|
-
document.body.removeEventListener("mousemove", mouseMove);
|
|
277
|
-
setIsDragging(false);
|
|
278
|
-
};
|
|
279
|
-
const mouseMove = (e2) => {
|
|
280
|
-
const delta = currentPoint.current - (isVertical ? e2.clientX : e2.clientY);
|
|
281
|
-
onResize(size + delta);
|
|
282
|
-
};
|
|
283
|
-
document.body.addEventListener("mouseup", mouseUp);
|
|
284
|
-
document.body.addEventListener("mousemove", mouseMove);
|
|
285
|
-
},
|
|
286
|
-
onMouseEnter: () => setIsHovered(true),
|
|
287
|
-
onMouseLeave: () => setIsHovered(false),
|
|
288
|
-
style: {
|
|
289
|
-
position: "absolute",
|
|
290
|
-
top: 0,
|
|
291
|
-
left: 0,
|
|
292
|
-
zIndex: 999,
|
|
293
|
-
display: "flex",
|
|
294
|
-
alignItems: "center",
|
|
295
|
-
justifyContent: "center",
|
|
296
|
-
pointerEvents: "auto",
|
|
297
|
-
...isVertical ? {
|
|
298
|
-
cursor: "ew-resize",
|
|
299
|
-
height: "100%",
|
|
300
|
-
marginLeft: -5,
|
|
301
|
-
width: 10
|
|
302
|
-
} : {
|
|
303
|
-
cursor: "ns-resize",
|
|
304
|
-
width: "100%",
|
|
305
|
-
marginTop: -5,
|
|
306
|
-
height: 10
|
|
307
|
-
}
|
|
308
|
-
},
|
|
309
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
310
|
-
"div",
|
|
311
|
-
{
|
|
312
|
-
style: {
|
|
313
|
-
...isVertical ? {
|
|
314
|
-
width: 3,
|
|
315
|
-
height: "100%"
|
|
316
|
-
} : {
|
|
317
|
-
height: 3,
|
|
318
|
-
width: "100%"
|
|
319
|
-
},
|
|
320
|
-
backgroundColor: isDragging || isHovered ? "var(--g-playground-line)" : "transparent"
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
)
|
|
324
|
-
}
|
|
325
|
-
);
|
|
326
|
-
};
|
|
327
|
-
|
|
328
366
|
// src/components/panel-layer/float-panel.tsx
|
|
329
367
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
330
368
|
var FloatPanel2 = ({ area }) => {
|
|
331
369
|
const [, setVersion] = (0, import_react3.useState)(0);
|
|
332
370
|
const panelManager = usePanelManager();
|
|
333
371
|
const panel = (0, import_react3.useRef)(panelManager.getPanel(area));
|
|
372
|
+
const isHorizontal = ["right", "docked-right"].includes(area);
|
|
334
373
|
const render = () => panel.current.elements.map((i) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "float-panel-wrap", style: { ...floatPanelWrap, ...i.style }, children: i.el }, i.key));
|
|
335
374
|
const node = (0, import_react3.useRef)(render());
|
|
336
375
|
(0, import_react3.useEffect)(() => {
|
|
@@ -344,7 +383,7 @@ var FloatPanel2 = ({ area }) => {
|
|
|
344
383
|
}, [panel]);
|
|
345
384
|
const onResize = (0, import_react3.useCallback)((newSize) => panel.current.updateSize(newSize), []);
|
|
346
385
|
const size = panel.current.currentSize;
|
|
347
|
-
const sizeStyle =
|
|
386
|
+
const sizeStyle = isHorizontal ? { width: size, height: "100%" } : { height: size, width: "100%" };
|
|
348
387
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
349
388
|
"div",
|
|
350
389
|
{
|
|
@@ -355,7 +394,11 @@ var FloatPanel2 = ({ area }) => {
|
|
|
355
394
|
...sizeStyle
|
|
356
395
|
},
|
|
357
396
|
children: [
|
|
358
|
-
panelManager.config.
|
|
397
|
+
panelManager.config.resizeBarRender({
|
|
398
|
+
size,
|
|
399
|
+
direction: isHorizontal ? "vertical" : "horizontal",
|
|
400
|
+
onResize
|
|
401
|
+
}),
|
|
359
402
|
node.current
|
|
360
403
|
]
|
|
361
404
|
}
|
|
@@ -364,22 +407,43 @@ var FloatPanel2 = ({ area }) => {
|
|
|
364
407
|
|
|
365
408
|
// src/components/panel-layer/panel-layer.tsx
|
|
366
409
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
367
|
-
var PanelLayer = ({
|
|
410
|
+
var PanelLayer = ({
|
|
411
|
+
mode = "floating",
|
|
412
|
+
className,
|
|
413
|
+
style,
|
|
414
|
+
children
|
|
415
|
+
}) => {
|
|
368
416
|
useGlobalCSS({
|
|
369
417
|
cssText: globalCSS,
|
|
370
418
|
id: "flow-panel-layer-css"
|
|
371
419
|
});
|
|
372
|
-
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
420
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
421
|
+
"div",
|
|
422
|
+
{
|
|
423
|
+
className: (0, import_clsx.default)(
|
|
424
|
+
"gedit-flow-panel-layer-wrap",
|
|
425
|
+
mode === "docked" && "gedit-flow-panel-layer-wrap-docked",
|
|
426
|
+
mode === "floating" && "gedit-flow-panel-layer-wrap-floating",
|
|
427
|
+
className
|
|
428
|
+
),
|
|
429
|
+
style,
|
|
430
|
+
children: [
|
|
431
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "gedit-flow-panel-left-area", children: [
|
|
432
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "gedit-flow-panel-main-area", children }),
|
|
433
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "gedit-flow-panel-bottom-area", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(FloatPanel2, { area: mode === "docked" ? "docked-bottom" : "bottom" }) })
|
|
434
|
+
] }),
|
|
435
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "gedit-flow-panel-right-area", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(FloatPanel2, { area: mode === "docked" ? "docked-right" : "right" }) })
|
|
436
|
+
]
|
|
437
|
+
}
|
|
438
|
+
);
|
|
379
439
|
};
|
|
380
440
|
|
|
441
|
+
// src/components/panel-layer/docked-panel-layer.tsx
|
|
442
|
+
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
443
|
+
var DockedPanelLayer = (props) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PanelLayer, { mode: "docked", ...props });
|
|
444
|
+
|
|
381
445
|
// src/services/panel-layer.ts
|
|
382
|
-
var PanelLayer2 = class extends
|
|
446
|
+
var PanelLayer2 = class extends import_core3.Layer {
|
|
383
447
|
constructor() {
|
|
384
448
|
super(...arguments);
|
|
385
449
|
this.panelRoot = import_utils2.domUtils.createDivWithClass("gedit-flow-panel-layer");
|
|
@@ -415,14 +479,14 @@ __decorateClass([
|
|
|
415
479
|
(0, import_inversify2.inject)(PanelManagerConfig)
|
|
416
480
|
], PanelLayer2.prototype, "panelConfig", 2);
|
|
417
481
|
__decorateClass([
|
|
418
|
-
(0, import_inversify2.inject)(
|
|
482
|
+
(0, import_inversify2.inject)(import_core3.PluginContext)
|
|
419
483
|
], PanelLayer2.prototype, "pluginContext", 2);
|
|
420
484
|
PanelLayer2 = __decorateClass([
|
|
421
485
|
(0, import_inversify2.injectable)()
|
|
422
486
|
], PanelLayer2);
|
|
423
487
|
|
|
424
488
|
// src/create-panel-manager-plugin.ts
|
|
425
|
-
var createPanelManagerPlugin = (0,
|
|
489
|
+
var createPanelManagerPlugin = (0, import_core4.definePluginCreator)({
|
|
426
490
|
onBind: ({ bind }, opt) => {
|
|
427
491
|
bind(PanelManager).to(PanelManager).inSingletonScope();
|
|
428
492
|
bind(PanelManagerConfig).toConstantValue(defineConfig(opt));
|
|
@@ -435,6 +499,7 @@ var createPanelManagerPlugin = (0, import_core3.definePluginCreator)({
|
|
|
435
499
|
});
|
|
436
500
|
// Annotate the CommonJS export names for ESM import in node:
|
|
437
501
|
0 && (module.exports = {
|
|
502
|
+
DockedPanelLayer,
|
|
438
503
|
PanelManager,
|
|
439
504
|
ResizeBar,
|
|
440
505
|
createPanelManagerPlugin,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/create-panel-manager-plugin.ts","../src/services/panel-config.ts","../src/services/panel-manager.ts","../src/services/float-panel.ts","../src/services/panel-layer.ts","../src/components/panel-layer/panel-layer.tsx","../src/hooks/use-global-css.ts","../src/components/panel-layer/float-panel.tsx","../src/hooks/use-panel-manager.ts","../src/components/panel-layer/css.ts","../src/components/resize-bar/index.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\n/** create plugin function */\nexport { createPanelManagerPlugin } from './create-panel-manager-plugin';\n\n/** services */\nexport { PanelManager, type PanelManagerConfig } from './services';\n\n/** react hooks */\nexport { usePanelManager } from './hooks/use-panel-manager';\n\nexport { ResizeBar } from './components/resize-bar';\n\n/** types */\nexport type { Area, PanelFactory } from './types';\n","/**\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 { defineConfig } from './services/panel-config';\nimport { PanelManager, PanelManagerConfig, PanelLayer } from './services';\n\nexport const createPanelManagerPlugin = definePluginCreator<Partial<PanelManagerConfig>>({\n onBind: ({ bind }, opt) => {\n bind(PanelManager).to(PanelManager).inSingletonScope();\n bind(PanelManagerConfig).toConstantValue(defineConfig(opt));\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 { PluginContext } from '@flowgram.ai/core';\n\nimport type { PanelFactory, PanelConfig } from '../types';\nimport type { PanelLayerProps } from '../components/panel-layer';\n\nexport interface PanelManagerConfig {\n factories: PanelFactory<any>[];\n right: PanelConfig;\n bottom: PanelConfig;\n autoResize: boolean;\n layerProps: PanelLayerProps;\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 factories: [],\n autoResize: true,\n layerProps: {},\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';\n\nimport { PanelManagerConfig } from './panel-config';\nimport type { Area, PanelFactory } from '../types';\nimport { FloatPanel } from './float-panel';\n\n@injectable()\nexport class PanelManager {\n @inject(PanelManagerConfig) readonly config: PanelManagerConfig;\n\n readonly panelRegistry = new Map<string, PanelFactory<any>>();\n\n right: FloatPanel;\n\n bottom: FloatPanel;\n\n init() {\n this.config.factories.forEach((factory) => this.register(factory));\n this.right = new FloatPanel(this.config.right);\n this.bottom = new FloatPanel(this.config.bottom);\n }\n\n register<T extends any>(factory: PanelFactory<T>) {\n this.panelRegistry.set(factory.key, factory);\n }\n\n open(key: string, area: Area = 'right', options?: any) {\n const factory = this.panelRegistry.get(key);\n if (!factory) {\n return;\n }\n const panel = this.getPanel(area);\n panel.open(factory, options);\n }\n\n close(key?: string) {\n this.right.close(key);\n this.bottom.close(key);\n }\n\n getPanel(area: Area) {\n return area === 'right' ? this.right : this.bottom;\n }\n\n dispose() {\n this.right.dispose();\n this.bottom.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport type { PanelFactory, PanelConfig } from '../types';\n\nexport interface PanelElement {\n key: string;\n style?: React.CSSProperties;\n el: React.ReactNode;\n}\n\nconst PANEL_SIZE_DEFAULT = 400;\n\nexport class FloatPanel {\n elements: PanelElement[] = [];\n\n private onUpdateEmitter = new Emitter<void>();\n\n sizeMap = new Map<string, number>();\n\n onUpdate = this.onUpdateEmitter.event;\n\n currentFactoryKey = '';\n\n updateSize(newSize: number) {\n this.sizeMap.set(this.currentFactoryKey, newSize);\n this.onUpdateEmitter.fire();\n }\n\n get currentSize(): number {\n return this.sizeMap.get(this.currentFactoryKey) || PANEL_SIZE_DEFAULT;\n }\n\n constructor(private config: PanelConfig) {}\n\n open(factory: PanelFactory<any>, options: any) {\n const el = factory.render(options?.props);\n const idx = this.elements.findIndex((e) => e.key === factory.key);\n this.currentFactoryKey = factory.key;\n if (!this.sizeMap.has(factory.key)) {\n this.sizeMap.set(factory.key, factory.defaultSize || PANEL_SIZE_DEFAULT);\n }\n if (idx >= 0) {\n this.elements[idx] = { el, key: factory.key, style: factory.style };\n } else {\n this.elements.push({ el, key: factory.key, style: factory.style });\n if (this.elements.length > this.config.max) {\n this.elements.shift();\n }\n }\n this.onUpdateEmitter.fire();\n }\n\n get visible() {\n return this.elements.length > 0;\n }\n\n close(key?: string) {\n if (!key) {\n this.elements = [];\n } else {\n this.elements = this.elements.filter((e) => e.key !== key);\n }\n this.onUpdateEmitter.fire();\n }\n\n dispose() {\n this.elements = [];\n this.onUpdateEmitter.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 { FloatPanel } from './float-panel';\nimport { leftArea, rightArea, mainArea, bottomArea, globalCSS } from './css';\n\nexport type PanelLayerProps = React.PropsWithChildren<{\n className?: string;\n style?: React.CSSProperties;\n}>;\n\nexport const PanelLayer: React.FC<PanelLayerProps> = ({ className, style, children }) => {\n useGlobalCSS({\n cssText: globalCSS,\n id: 'flow-panel-layer-css',\n });\n\n return (\n <div className={clsx('gedit-flow-panel-layer-wrap', className)} style={style}>\n <div className=\"gedit-flow-panel-left-area\" style={leftArea}>\n <div className=\"gedit-flow-panel-main-area\" style={mainArea}>\n {children}\n </div>\n <div className=\"gedit-flow-panel-bottom-area\" style={bottomArea}>\n <FloatPanel area=\"bottom\" />\n </div>\n </div>\n <div className=\"gedit-flow-panel-right-area\" style={rightArea}>\n <FloatPanel area=\"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, useRef, startTransition, useState, useCallback } from 'react';\n\nimport { Area } from '../../types';\nimport { usePanelManager } from '../../hooks/use-panel-manager';\nimport { floatPanelWrap } from './css';\nimport { ResizeBar } from '../resize-bar';\n\nexport const FloatPanel: React.FC<{ area: Area }> = ({ area }) => {\n const [, setVersion] = useState(0);\n const panelManager = usePanelManager();\n const panel = useRef(panelManager.getPanel(area));\n const render = () =>\n panel.current.elements.map((i) => (\n <div className=\"float-panel-wrap\" key={i.key} style={{ ...floatPanelWrap, ...i.style }}>\n {i.el}\n </div>\n ));\n const node = useRef(render());\n\n useEffect(() => {\n const dispose = panel.current.onUpdate(() => {\n startTransition(() => {\n node.current = render();\n setVersion((v) => v + 1);\n });\n });\n return () => dispose.dispose();\n }, [panel]);\n const onResize = useCallback((newSize: number) => panel.current!.updateSize(newSize), []);\n const size = panel.current!.currentSize;\n const sizeStyle =\n area === 'right' ? { width: size, height: '100%' } : { height: size, width: '100%' };\n\n return (\n <div\n className=\"gedit-flow-panel\"\n style={{\n position: 'relative',\n display: panel.current.visible ? 'block' : 'none',\n ...sizeStyle,\n }}\n >\n {panelManager.config.autoResize && panel.current.elements.length > 0 && (\n <ResizeBar size={size} isVertical={area === 'right'} onResize={onResize} />\n )}\n {node.current}\n </div>\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\nexport const globalCSS = `\n .gedit-flow-panel-layer * {\n box-sizing: border-box;\n }\n .gedit-flow-panel-layer-wrap {\n pointer-events: none;\n position: absolute;\n top: 0;\n left: 0;\n display: flex;\n column-gap: 4px;\n width: 100%;\n height: 100%;\n padding: 4px;\n overflow: hidden;\n }\n`;\n\nexport const leftArea: React.CSSProperties = {\n width: '100%',\n minWidth: 0,\n flexGrow: 0,\n flexShrink: 1,\n\n display: 'flex',\n flexDirection: 'column',\n rowGap: '4px',\n};\n\nexport const rightArea: React.CSSProperties = {\n height: '100%',\n flexGrow: 1,\n flexShrink: 0,\n minWidth: 0,\n\n display: 'flex',\n columnGap: '4px',\n};\n\nexport const mainArea: React.CSSProperties = {\n position: 'relative',\n overflow: 'hidden',\n flexGrow: 0,\n flexShrink: 1,\n width: '100%',\n height: '100%',\n};\n\nexport const bottomArea: React.CSSProperties = {\n flexGrow: 1,\n flexShrink: 0,\n width: '100%',\n minHeight: 0,\n};\n\nexport const floatPanelWrap: React.CSSProperties = {\n pointerEvents: 'auto',\n height: '100%',\n width: '100%',\n overflow: 'auto',\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 onResize: (w: number) => void;\n size: number;\n isVertical?: boolean;\n}\n\nexport const ResizeBar: React.FC<Props> = ({ onResize, size, isVertical }) => {\n const currentPoint = useRef<null | number>(null);\n const [isDragging, setIsDragging] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAAA,eAAoC;;;ACc7B,IAAM,qBAAqB,OAAO,oBAAoB;AAEtD,IAAM,eAAe,CAAC,WAAwC;AACnE,QAAM,gBAAoC;AAAA,IACxC,OAAO;AAAA,MACL,KAAK;AAAA,IACP;AAAA,IACA,QAAQ;AAAA,MACN,KAAK;AAAA,IACP;AAAA,IACA,WAAW,CAAC;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY,CAAC;AAAA,IACb,mBAAmB,CAAC,QAAuB,IAAI,WAAW,KAAK;AAAA,EACjE;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;;;ACjCA,uBAAmC;;;ACAnC,mBAAwB;AAUxB,IAAM,qBAAqB;AAEpB,IAAM,aAAN,MAAiB;AAAA,EAoBtB,YAAoB,QAAqB;AAArB;AAnBpB,oBAA2B,CAAC;AAE5B,SAAQ,kBAAkB,IAAI,qBAAc;AAE5C,mBAAU,oBAAI,IAAoB;AAElC,oBAAW,KAAK,gBAAgB;AAEhC,6BAAoB;AAAA,EAWsB;AAAA,EAT1C,WAAW,SAAiB;AAC1B,SAAK,QAAQ,IAAI,KAAK,mBAAmB,OAAO;AAChD,SAAK,gBAAgB,KAAK;AAAA,EAC5B;AAAA,EAEA,IAAI,cAAsB;AACxB,WAAO,KAAK,QAAQ,IAAI,KAAK,iBAAiB,KAAK;AAAA,EACrD;AAAA,EAIA,KAAK,SAA4B,SAAc;AAC7C,UAAM,KAAK,QAAQ,OAAO,SAAS,KAAK;AACxC,UAAM,MAAM,KAAK,SAAS,UAAU,CAAC,MAAM,EAAE,QAAQ,QAAQ,GAAG;AAChE,SAAK,oBAAoB,QAAQ;AACjC,QAAI,CAAC,KAAK,QAAQ,IAAI,QAAQ,GAAG,GAAG;AAClC,WAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,eAAe,kBAAkB;AAAA,IACzE;AACA,QAAI,OAAO,GAAG;AACZ,WAAK,SAAS,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,KAAK,OAAO,QAAQ,MAAM;AAAA,IACpE,OAAO;AACL,WAAK,SAAS,KAAK,EAAE,IAAI,KAAK,QAAQ,KAAK,OAAO,QAAQ,MAAM,CAAC;AACjE,UAAI,KAAK,SAAS,SAAS,KAAK,OAAO,KAAK;AAC1C,aAAK,SAAS,MAAM;AAAA,MACtB;AAAA,IACF;AACA,SAAK,gBAAgB,KAAK;AAAA,EAC5B;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,SAAS,SAAS;AAAA,EAChC;AAAA,EAEA,MAAM,KAAc;AAClB,QAAI,CAAC,KAAK;AACR,WAAK,WAAW,CAAC;AAAA,IACnB,OAAO;AACL,WAAK,WAAW,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG;AAAA,IAC3D;AACA,SAAK,gBAAgB,KAAK;AAAA,EAC5B;AAAA,EAEA,UAAU;AACR,SAAK,WAAW,CAAC;AACjB,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AACF;;;AD9DO,IAAM,eAAN,MAAmB;AAAA,EAAnB;AAGL,SAAS,gBAAgB,oBAAI,IAA+B;AAAA;AAAA,EAM5D,OAAO;AACL,SAAK,OAAO,UAAU,QAAQ,CAAC,YAAY,KAAK,SAAS,OAAO,CAAC;AACjE,SAAK,QAAQ,IAAI,WAAW,KAAK,OAAO,KAAK;AAC7C,SAAK,SAAS,IAAI,WAAW,KAAK,OAAO,MAAM;AAAA,EACjD;AAAA,EAEA,SAAwB,SAA0B;AAChD,SAAK,cAAc,IAAI,QAAQ,KAAK,OAAO;AAAA,EAC7C;AAAA,EAEA,KAAK,KAAa,OAAa,SAAS,SAAe;AACrD,UAAM,UAAU,KAAK,cAAc,IAAI,GAAG;AAC1C,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,SAAS,IAAI;AAChC,UAAM,KAAK,SAAS,OAAO;AAAA,EAC7B;AAAA,EAEA,MAAM,KAAc;AAClB,SAAK,MAAM,MAAM,GAAG;AACpB,SAAK,OAAO,MAAM,GAAG;AAAA,EACvB;AAAA,EAEA,SAAS,MAAY;AACnB,WAAO,SAAS,UAAU,KAAK,QAAQ,KAAK;AAAA,EAC9C;AAAA,EAEA,UAAU;AACR,SAAK,MAAM,QAAQ;AACnB,SAAK,OAAO,QAAQ;AAAA,EACtB;AACF;AAxCuC;AAAA,MAApC,yBAAO,kBAAkB;AAAA,GADf,aAC0B;AAD1B,eAAN;AAAA,MADN,6BAAW;AAAA,GACC;;;AEPb,uBAAqB;AACrB,IAAAC,gBAA8B;AAE9B,IAAAC,oBAAmC;AACnC,IAAAC,gBAAqC;AACrC,IAAAC,eAAqC;;;ACLrC,kBAAiB;;;ACAjB,mBAA0B;AAQnB,IAAM,eAAe,CAAC,EAAE,SAAS,IAAI,QAAQ,MAA2B;AAC7E,8BAAU,MAAM;AAEd,QAAI,OAAO,aAAa,YAAa;AAErC,QAAI,SAAS,eAAe,EAAE,EAAG;AAEjC,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AACpB,aAAS,KAAK,YAAY,KAAK;AAE/B,WAAO,MAAM;AACX,YAAM,WAAW,SAAS,eAAe,EAAE;AAC3C,UAAI,YAAY,QAAS,UAAS,OAAO;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,EAAE,CAAC;AACT;;;ACzBA,IAAAC,gBAA0E;;;ACA1E,kBAA2B;AAIpB,IAAM,kBAAkB,UAAM,wBAAyB,YAAY;;;ACJnE,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBlB,IAAM,WAAgC;AAAA,EAC3C,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EAEZ,SAAS;AAAA,EACT,eAAe;AAAA,EACf,QAAQ;AACV;AAEO,IAAM,YAAiC;AAAA,EAC5C,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EAEV,SAAS;AAAA,EACT,WAAW;AACb;AAEO,IAAM,WAAgC;AAAA,EAC3C,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AACV;AAEO,IAAM,aAAkC;AAAA,EAC7C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AACb;AAEO,IAAM,iBAAsC;AAAA,EACjD,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AACZ;;;AC5DA,IAAAC,gBAAwC;AA0DlC;AAlDC,IAAM,YAA6B,CAAC,EAAE,UAAU,MAAM,WAAW,MAAM;AAC5E,QAAM,mBAAe,sBAAsB,IAAI;AAC/C,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAa,CAAC,MAAM;AAClB,qBAAa,UAAU,aAAa,EAAE,UAAU,EAAE;AAClD,UAAE,gBAAgB;AAClB,UAAE,eAAe;AACjB,sBAAc,IAAI;AAClB,cAAM,UAAU,MAAM;AACpB,uBAAa,UAAU;AACvB,mBAAS,KAAK,oBAAoB,WAAW,OAAO;AACpD,mBAAS,KAAK,oBAAoB,aAAa,SAAS;AACxD,wBAAc,KAAK;AAAA,QACrB;AACA,cAAM,YAAY,CAACC,OAAkB;AACnC,gBAAM,QAAQ,aAAa,WAAY,aAAaA,GAAE,UAAUA,GAAE;AAClE,mBAAS,OAAO,KAAK;AAAA,QACvB;AACA,iBAAS,KAAK,iBAAiB,WAAW,OAAO;AACjD,iBAAS,KAAK,iBAAiB,aAAa,SAAS;AAAA,MACvD;AAAA,MACA,cAAc,MAAM,aAAa,IAAI;AAAA,MACrC,cAAc,MAAM,aAAa,KAAK;AAAA,MACtC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,GAAI,aACA;AAAA,UACE,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO;AAAA,QACT,IACA;AAAA,UACE,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,MACN;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,GAAI,aACA;AAAA,cACE,OAAO;AAAA,cACP,QAAQ;AAAA,YACV,IACA;AAAA,cACE,QAAQ;AAAA,cACR,OAAO;AAAA,YACT;AAAA,YACJ,iBAAiB,cAAc,YAAY,6BAA6B;AAAA,UAC1E;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AH7DM,IAAAC,sBAAA;AANC,IAAMC,cAAuC,CAAC,EAAE,KAAK,MAAM;AAChE,QAAM,CAAC,EAAE,UAAU,QAAI,wBAAS,CAAC;AACjC,QAAM,eAAe,gBAAgB;AACrC,QAAM,YAAQ,sBAAO,aAAa,SAAS,IAAI,CAAC;AAChD,QAAM,SAAS,MACb,MAAM,QAAQ,SAAS,IAAI,CAAC,MAC1B,6CAAC,SAAI,WAAU,oBAA+B,OAAO,EAAE,GAAG,gBAAgB,GAAG,EAAE,MAAM,GAClF,YAAE,MADkC,EAAE,GAEzC,CACD;AACH,QAAM,WAAO,sBAAO,OAAO,CAAC;AAE5B,+BAAU,MAAM;AACd,UAAM,UAAU,MAAM,QAAQ,SAAS,MAAM;AAC3C,yCAAgB,MAAM;AACpB,aAAK,UAAU,OAAO;AACtB,mBAAW,CAAC,MAAM,IAAI,CAAC;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AACD,WAAO,MAAM,QAAQ,QAAQ;AAAA,EAC/B,GAAG,CAAC,KAAK,CAAC;AACV,QAAM,eAAW,2BAAY,CAAC,YAAoB,MAAM,QAAS,WAAW,OAAO,GAAG,CAAC,CAAC;AACxF,QAAM,OAAO,MAAM,QAAS;AAC5B,QAAM,YACJ,SAAS,UAAU,EAAE,OAAO,MAAM,QAAQ,OAAO,IAAI,EAAE,QAAQ,MAAM,OAAO,OAAO;AAErF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS,MAAM,QAAQ,UAAU,UAAU;AAAA,QAC3C,GAAG;AAAA,MACL;AAAA,MAEC;AAAA,qBAAa,OAAO,cAAc,MAAM,QAAQ,SAAS,SAAS,KACjE,6CAAC,aAAU,MAAY,YAAY,SAAS,SAAS,UAAoB;AAAA,QAE1E,KAAK;AAAA;AAAA;AAAA,EACR;AAEJ;;;AF7BM,IAAAC,sBAAA;AARC,IAAM,aAAwC,CAAC,EAAE,WAAW,OAAO,SAAS,MAAM;AACvF,eAAa;AAAA,IACX,SAAS;AAAA,IACT,IAAI;AAAA,EACN,CAAC;AAED,SACE,8CAAC,SAAI,eAAW,YAAAC,SAAK,+BAA+B,SAAS,GAAG,OAC9D;AAAA,kDAAC,SAAI,WAAU,8BAA6B,OAAO,UACjD;AAAA,mDAAC,SAAI,WAAU,8BAA6B,OAAO,UAChD,UACH;AAAA,MACA,6CAAC,SAAI,WAAU,gCAA+B,OAAO,YACnD,uDAACC,aAAA,EAAW,MAAK,UAAS,GAC5B;AAAA,OACF;AAAA,IACA,6CAAC,SAAI,WAAU,+BAA8B,OAAO,WAClD,uDAACA,aAAA,EAAW,MAAK,SAAQ,GAC3B;AAAA,KACF;AAEJ;;;ADrBO,IAAMC,cAAN,cAAyB,mBAAM;AAAA,EAA/B;AAAA;AAKL,SAAS,YAAY,uBAAS,mBAAmB,wBAAwB;AAEzE,kBAA6B;AAAA;AAAA,EAE7B,UAAgB;AACd,SAAK,YAAY,kBAAkB,KAAK,aAAa,EAAE,YAAY,KAAK,SAAS;AACjF,SAAK,UAAU;AAAA,MACb,yBAAW,OAAO,MAAM;AAEtB,aAAK,UAAU,OAAO;AAAA,MACxB,CAAC;AAAA,IACH;AACA,UAAM,cAAc;AAAA,MAClB,eAAe;AAAA,MACf,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,IACV;AACA,2BAAS,SAAS,KAAK,WAAW,WAAW;AAAA,EAC/C;AAAA,EAEA,SAAsB;AACpB,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,EAAE,UAAU,GAAG,YAAY,IAAI,KAAK,YAAY;AACtD,WAAK,aAAS,6BAAc,YAAgB,aAAa,QAAQ;AAAA,IACnE;AACA,WAAO,iBAAAC,QAAS,aAAa,KAAK,QAAQ,KAAK,SAAS;AAAA,EAC1D;AACF;AAnC+C;AAAA,MAA5C,0BAAO,kBAAkB;AAAA,GADfD,YACkC;AAEL;AAAA,MAAvC,0BAAO,0BAAa;AAAA,GAHVA,YAG6B;AAH7BA,cAAN;AAAA,MADN,8BAAW;AAAA,GACCA;;;AJNN,IAAM,+BAA2B,kCAAiD;AAAA,EACvF,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ;AACzB,SAAK,YAAY,EAAE,GAAG,YAAY,EAAE,iBAAiB;AACrD,SAAK,kBAAkB,EAAE,gBAAgB,aAAa,GAAG,CAAC;AAAA,EAC5D;AAAA,EACA,OAAO,KAAK;AACV,QAAI,WAAW,cAAcE,WAAU;AACvC,UAAM,eAAe,IAAI,UAAU,IAAkB,YAAY;AACjE,iBAAa,KAAK;AAAA,EACpB;AACF,CAAC;","names":["import_core","import_react","import_inversify","import_utils","import_core","import_react","import_react","e","import_jsx_runtime","FloatPanel","import_jsx_runtime","clsx","FloatPanel","PanelLayer","ReactDOM","PanelLayer"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/create-panel-manager-plugin.ts","../src/components/resize-bar/index.tsx","../src/services/panel-config.ts","../src/services/panel-manager.ts","../src/services/float-panel.ts","../src/services/panel-layer.ts","../src/components/panel-layer/panel-layer.tsx","../src/hooks/use-global-css.ts","../src/components/panel-layer/float-panel.tsx","../src/hooks/use-panel-manager.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\n/** create plugin function */\nexport { createPanelManagerPlugin } from './create-panel-manager-plugin';\n\n/** services */\nexport { PanelManager, type PanelManagerConfig } from './services';\n\n/** react hooks */\nexport { usePanelManager } from './hooks/use-panel-manager';\n\nexport { DockedPanelLayer, type DockedPanelLayerProps } from './components/panel-layer';\nexport { ResizeBar } from './components/resize-bar';\n\n/** types */\nexport type { Area, PanelFactory } from './types';\n","/**\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 { defineConfig } from './services/panel-config';\nimport { PanelManager, PanelManagerConfig, PanelLayer } from './services';\n\nexport const createPanelManagerPlugin = definePluginCreator<Partial<PanelManagerConfig>>({\n onBind: ({ bind }, opt) => {\n bind(PanelManager).to(PanelManager).inSingletonScope();\n bind(PanelManagerConfig).toConstantValue(defineConfig(opt));\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 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 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 { Playground } from '@flowgram.ai/core';\n\nimport { PanelManagerConfig } from './panel-config';\nimport type { Area, PanelFactory } from '../types';\nimport { FloatPanel } from './float-panel';\n\n@injectable()\nexport class PanelManager {\n @inject(Playground) readonly playground: Playground;\n\n @inject(PanelManagerConfig) readonly config: PanelManagerConfig;\n\n readonly panelRegistry = new Map<string, PanelFactory<any>>();\n\n right: FloatPanel;\n\n bottom: FloatPanel;\n\n dockedRight: FloatPanel;\n\n dockedBottom: FloatPanel;\n\n init() {\n this.config.factories.forEach((factory) => this.register(factory));\n this.right = new FloatPanel(this.config.right);\n this.bottom = new FloatPanel(this.config.bottom);\n this.dockedRight = new FloatPanel(this.config.dockedRight);\n this.dockedBottom = new FloatPanel(this.config.dockedBottom);\n }\n\n register<T extends any>(factory: PanelFactory<T>) {\n this.panelRegistry.set(factory.key, factory);\n }\n\n open(key: string, area: Area = 'right', options?: any) {\n const factory = this.panelRegistry.get(key);\n if (!factory) {\n return;\n }\n const panel = this.getPanel(area);\n panel.open(factory, options);\n }\n\n close(key?: string) {\n this.right.close(key);\n this.bottom.close(key);\n this.dockedRight.close(key);\n this.dockedBottom.close(key);\n }\n\n getPanel(area: Area) {\n switch (area) {\n case 'docked-bottom':\n return this.dockedBottom;\n case 'docked-right':\n return this.dockedRight;\n case 'bottom':\n return this.bottom;\n case 'right':\n default:\n return this.right;\n }\n }\n\n dispose() {\n this.right.dispose();\n this.bottom.dispose();\n this.dockedBottom.dispose();\n this.dockedRight.dispose();\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { Emitter } from '@flowgram.ai/utils';\n\nimport type { PanelFactory, PanelConfig } from '../types';\n\nexport interface PanelElement {\n key: string;\n style?: React.CSSProperties;\n el: React.ReactNode;\n}\n\nconst PANEL_SIZE_DEFAULT = 400;\n\nexport class FloatPanel {\n elements: PanelElement[] = [];\n\n private onUpdateEmitter = new Emitter<void>();\n\n sizeMap = new Map<string, number>();\n\n onUpdate = this.onUpdateEmitter.event;\n\n currentFactoryKey = '';\n\n updateSize(newSize: number) {\n this.sizeMap.set(this.currentFactoryKey, newSize);\n this.onUpdateEmitter.fire();\n }\n\n get currentSize(): number {\n return this.sizeMap.get(this.currentFactoryKey) || PANEL_SIZE_DEFAULT;\n }\n\n constructor(private config: PanelConfig) {}\n\n open(factory: PanelFactory<any>, options: any) {\n const el = factory.render(options?.props);\n const idx = this.elements.findIndex((e) => e.key === factory.key);\n this.currentFactoryKey = factory.key;\n if (!this.sizeMap.has(factory.key)) {\n this.sizeMap.set(factory.key, factory.defaultSize || PANEL_SIZE_DEFAULT);\n }\n if (idx >= 0) {\n this.elements[idx] = { el, key: factory.key, style: factory.style };\n } else {\n this.elements.push({ el, key: factory.key, style: factory.style });\n if (this.elements.length > this.config.max) {\n this.elements.shift();\n }\n }\n this.onUpdateEmitter.fire();\n }\n\n get visible() {\n return this.elements.length > 0;\n }\n\n close(key?: string) {\n if (!key) {\n this.elements = [];\n } else {\n this.elements = this.elements.filter((e) => e.key !== key);\n }\n this.onUpdateEmitter.fire();\n }\n\n dispose() {\n this.elements = [];\n this.onUpdateEmitter.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 { FloatPanel } from './float-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 <FloatPanel area={mode === 'docked' ? 'docked-bottom' : 'bottom'} />\n </div>\n </div>\n <div className=\"gedit-flow-panel-right-area\">\n <FloatPanel 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, useRef, startTransition, useState, useCallback } from 'react';\n\nimport { Area } from '../../types';\nimport { usePanelManager } from '../../hooks/use-panel-manager';\nimport { floatPanelWrap } from './css';\n\nexport const FloatPanel: React.FC<{ area: Area }> = ({ area }) => {\n const [, setVersion] = useState(0);\n const panelManager = usePanelManager();\n const panel = useRef(panelManager.getPanel(area));\n\n const isHorizontal = ['right', 'docked-right'].includes(area);\n\n const render = () =>\n panel.current.elements.map((i) => (\n <div className=\"float-panel-wrap\" key={i.key} style={{ ...floatPanelWrap, ...i.style }}>\n {i.el}\n </div>\n ));\n const node = useRef(render());\n\n useEffect(() => {\n const dispose = panel.current.onUpdate(() => {\n startTransition(() => {\n node.current = render();\n setVersion((v) => v + 1);\n });\n });\n return () => dispose.dispose();\n }, [panel]);\n const onResize = useCallback((newSize: number) => panel.current!.updateSize(newSize), []);\n const size = panel.current!.currentSize;\n const sizeStyle = isHorizontal\n ? { width: size, height: '100%' }\n : { height: size, width: '100%' };\n\n return (\n <div\n className=\"gedit-flow-panel\"\n style={{\n position: 'relative',\n display: panel.current.visible ? 'block' : 'none',\n ...sizeStyle,\n }}\n >\n {panelManager.config.resizeBarRender({\n size,\n direction: isHorizontal ? 'vertical' : 'horizontal',\n onResize,\n })}\n {node.current}\n </div>\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\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 }\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`;\n\nexport const floatPanelWrap: React.CSSProperties = {\n pointerEvents: 'auto',\n height: '100%',\n width: '100%',\n overflow: 'auto',\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":["import_core","e","import_react","import_inversify","import_utils","import_core","import_react","import_react","import_core","import_jsx_runtime","FloatPanel","import_jsx_runtime","clsx","FloatPanel","import_jsx_runtime","PanelLayer","ReactDOM","PanelLayer"]}
|