@flowgram.ai/panel-manager-plugin 0.1.0-alpha.24 → 0.1.0-alpha.25
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 +7 -6
- package/dist/esm/index.js +136 -74
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +10 -4
- package/dist/index.d.ts +10 -4
- package/dist/index.js +151 -89
- 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 +0 -6
- package/src/components/panel-layer/panel.tsx +27 -10
- package/src/hooks/use-panel.ts +9 -0
- package/src/services/panel-factory.ts +47 -5
- package/src/services/panel-manager.ts +0 -2
- package/src/types.ts +2 -0
- package/src/utils.ts +22 -0
package/dist/index.js
CHANGED
|
@@ -74,59 +74,6 @@ PanelRestoreImpl = __decorateClass([
|
|
|
74
74
|
(0, import_inversify.injectable)()
|
|
75
75
|
], PanelRestoreImpl);
|
|
76
76
|
|
|
77
|
-
// src/services/panel-factory.ts
|
|
78
|
-
var PanelEntityFactory = Symbol("PanelEntityFactory");
|
|
79
|
-
var PanelEntityFactoryConstant = Symbol("PanelEntityFactoryConstant");
|
|
80
|
-
var PanelEntityConfigConstant = Symbol("PanelEntityConfigConstant");
|
|
81
|
-
var PANEL_SIZE_DEFAULT = 400;
|
|
82
|
-
var PanelEntity = class {
|
|
83
|
-
constructor() {
|
|
84
|
-
this.initialized = false;
|
|
85
|
-
/** 实例唯一标识 */
|
|
86
|
-
this.id = (0, import_nanoid.nanoid)();
|
|
87
|
-
/** 渲染缓存 */
|
|
88
|
-
this.node = null;
|
|
89
|
-
}
|
|
90
|
-
get area() {
|
|
91
|
-
return this.config.area;
|
|
92
|
-
}
|
|
93
|
-
get key() {
|
|
94
|
-
return this.factory.key;
|
|
95
|
-
}
|
|
96
|
-
get renderer() {
|
|
97
|
-
if (!this.node) {
|
|
98
|
-
this.node = this.factory.render(this.config.props);
|
|
99
|
-
}
|
|
100
|
-
return this.node;
|
|
101
|
-
}
|
|
102
|
-
init() {
|
|
103
|
-
if (this.initialized) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
this.initialized = true;
|
|
107
|
-
const cache = this.restore.restore(this.key);
|
|
108
|
-
this.store = (0, import_vanilla.createStore)(() => ({
|
|
109
|
-
size: this.config.defaultSize || this.factory.defaultSize || PANEL_SIZE_DEFAULT,
|
|
110
|
-
...cache ?? {}
|
|
111
|
-
}));
|
|
112
|
-
}
|
|
113
|
-
dispose() {
|
|
114
|
-
this.restore.store(this.key, this.store.getState());
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
__decorateClass([
|
|
118
|
-
(0, import_inversify2.inject)(PanelRestore)
|
|
119
|
-
], PanelEntity.prototype, "restore", 2);
|
|
120
|
-
__decorateClass([
|
|
121
|
-
(0, import_inversify2.inject)(PanelEntityFactoryConstant)
|
|
122
|
-
], PanelEntity.prototype, "factory", 2);
|
|
123
|
-
__decorateClass([
|
|
124
|
-
(0, import_inversify2.inject)(PanelEntityConfigConstant)
|
|
125
|
-
], PanelEntity.prototype, "config", 2);
|
|
126
|
-
PanelEntity = __decorateClass([
|
|
127
|
-
(0, import_inversify2.injectable)()
|
|
128
|
-
], PanelEntity);
|
|
129
|
-
|
|
130
77
|
// src/components/resize-bar/index.tsx
|
|
131
78
|
var import_react = require("react");
|
|
132
79
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -226,14 +173,115 @@ var defineConfig = (config) => {
|
|
|
226
173
|
};
|
|
227
174
|
};
|
|
228
175
|
|
|
176
|
+
// src/utils.ts
|
|
177
|
+
var merge = (...objs) => {
|
|
178
|
+
const result = {};
|
|
179
|
+
for (const obj of objs) {
|
|
180
|
+
if (!obj || typeof obj !== "object") continue;
|
|
181
|
+
for (const key of Object.keys(obj)) {
|
|
182
|
+
const value = obj[key];
|
|
183
|
+
if (result[key] === void 0) {
|
|
184
|
+
result[key] = value;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
// src/services/panel-factory.ts
|
|
192
|
+
var PanelEntityFactory = Symbol("PanelEntityFactory");
|
|
193
|
+
var PanelEntityFactoryConstant = Symbol("PanelEntityFactoryConstant");
|
|
194
|
+
var PanelEntityConfigConstant = Symbol("PanelEntityConfigConstant");
|
|
195
|
+
var PANEL_SIZE_DEFAULT = 400;
|
|
196
|
+
var PanelEntity = class {
|
|
197
|
+
constructor() {
|
|
198
|
+
this.initialized = false;
|
|
199
|
+
/** 实例唯一标识 */
|
|
200
|
+
this.id = (0, import_nanoid.nanoid)();
|
|
201
|
+
/** 渲染缓存 */
|
|
202
|
+
this.node = null;
|
|
203
|
+
}
|
|
204
|
+
get area() {
|
|
205
|
+
return this.config.area;
|
|
206
|
+
}
|
|
207
|
+
get mode() {
|
|
208
|
+
return this.config.area.startsWith("docked") ? "docked" : "floating";
|
|
209
|
+
}
|
|
210
|
+
get key() {
|
|
211
|
+
return this.factory.key;
|
|
212
|
+
}
|
|
213
|
+
get renderer() {
|
|
214
|
+
if (!this.node) {
|
|
215
|
+
this.node = this.factory.render(this.config.props);
|
|
216
|
+
}
|
|
217
|
+
return this.node;
|
|
218
|
+
}
|
|
219
|
+
get fullscreen() {
|
|
220
|
+
return this.store.getState().fullscreen;
|
|
221
|
+
}
|
|
222
|
+
set fullscreen(next) {
|
|
223
|
+
this.store.setState({ fullscreen: next });
|
|
224
|
+
}
|
|
225
|
+
get resizable() {
|
|
226
|
+
if (this.fullscreen) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
return this.factory.resize !== void 0 ? this.factory.resize : this.globalConfig.autoResize;
|
|
230
|
+
}
|
|
231
|
+
get layer() {
|
|
232
|
+
return document.querySelector(
|
|
233
|
+
this.mode ? ".gedit-flow-panel-layer-wrap-docked" : ".gedit-flow-panel-layer-wrap-floating"
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
init() {
|
|
237
|
+
if (this.initialized) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
this.initialized = true;
|
|
241
|
+
const cache = this.restore.restore(this.key);
|
|
242
|
+
const initialState = merge(
|
|
243
|
+
{
|
|
244
|
+
size: this.config.defaultSize,
|
|
245
|
+
fullscreen: this.config.fullscreen
|
|
246
|
+
},
|
|
247
|
+
cache ? cache : {},
|
|
248
|
+
{
|
|
249
|
+
size: this.factory.defaultSize || PANEL_SIZE_DEFAULT,
|
|
250
|
+
fullscreen: this.factory.fullscreen || false
|
|
251
|
+
}
|
|
252
|
+
);
|
|
253
|
+
this.store = (0, import_vanilla.createStore)(() => initialState);
|
|
254
|
+
}
|
|
255
|
+
mergeState() {
|
|
256
|
+
}
|
|
257
|
+
dispose() {
|
|
258
|
+
this.restore.store(this.key, this.store.getState());
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
__decorateClass([
|
|
262
|
+
(0, import_inversify2.inject)(PanelRestore)
|
|
263
|
+
], PanelEntity.prototype, "restore", 2);
|
|
264
|
+
__decorateClass([
|
|
265
|
+
(0, import_inversify2.inject)(PanelEntityFactoryConstant)
|
|
266
|
+
], PanelEntity.prototype, "factory", 2);
|
|
267
|
+
__decorateClass([
|
|
268
|
+
(0, import_inversify2.inject)(PanelEntityConfigConstant)
|
|
269
|
+
], PanelEntity.prototype, "config", 2);
|
|
270
|
+
__decorateClass([
|
|
271
|
+
(0, import_inversify2.inject)(PanelManagerConfig)
|
|
272
|
+
], PanelEntity.prototype, "globalConfig", 2);
|
|
273
|
+
PanelEntity = __decorateClass([
|
|
274
|
+
(0, import_inversify2.injectable)()
|
|
275
|
+
], PanelEntity);
|
|
276
|
+
|
|
229
277
|
// src/services/panel-manager.ts
|
|
230
278
|
var import_inversify3 = require("inversify");
|
|
231
|
-
var
|
|
279
|
+
var import_utils2 = require("@flowgram.ai/utils");
|
|
232
280
|
var PanelManager = class {
|
|
233
281
|
constructor() {
|
|
234
282
|
this.panelRegistry = /* @__PURE__ */ new Map();
|
|
235
283
|
this.panels = /* @__PURE__ */ new Map();
|
|
236
|
-
this.onPanelsChangeEvent = new
|
|
284
|
+
this.onPanelsChangeEvent = new import_utils2.Emitter();
|
|
237
285
|
this.onPanelsChange = this.onPanelsChangeEvent.event;
|
|
238
286
|
}
|
|
239
287
|
init() {
|
|
@@ -263,7 +311,6 @@ var PanelManager = class {
|
|
|
263
311
|
this.panels.set(panel.id, panel);
|
|
264
312
|
this.trim(area);
|
|
265
313
|
this.onPanelsChangeEvent.fire();
|
|
266
|
-
console.log("jxj", this.panels);
|
|
267
314
|
}
|
|
268
315
|
/** close panel */
|
|
269
316
|
close(key) {
|
|
@@ -275,7 +322,6 @@ var PanelManager = class {
|
|
|
275
322
|
trim(area) {
|
|
276
323
|
const panels = this.getPanels(area);
|
|
277
324
|
const areaConfig = this.getAreaConfig(area);
|
|
278
|
-
console.log("jxj", areaConfig.max, panels.length);
|
|
279
325
|
while (panels.length > areaConfig.max) {
|
|
280
326
|
const removed = panels.shift();
|
|
281
327
|
if (removed) {
|
|
@@ -328,9 +374,9 @@ PanelManager = __decorateClass([
|
|
|
328
374
|
|
|
329
375
|
// src/services/panel-layer.ts
|
|
330
376
|
var import_react_dom = __toESM(require("react-dom"));
|
|
331
|
-
var
|
|
377
|
+
var import_react6 = require("react");
|
|
332
378
|
var import_inversify4 = require("inversify");
|
|
333
|
-
var
|
|
379
|
+
var import_utils3 = require("@flowgram.ai/utils");
|
|
334
380
|
var import_core2 = require("@flowgram.ai/core");
|
|
335
381
|
|
|
336
382
|
// src/components/panel-layer/panel-layer.tsx
|
|
@@ -354,28 +400,39 @@ var useGlobalCSS = ({ cssText, id, cleanup }) => {
|
|
|
354
400
|
};
|
|
355
401
|
|
|
356
402
|
// src/components/panel-layer/panel.tsx
|
|
357
|
-
var
|
|
358
|
-
var
|
|
359
|
-
var import_shallow = require("zustand/shallow");
|
|
360
|
-
var import_clsx = __toESM(require("clsx"));
|
|
403
|
+
var import_react5 = require("react");
|
|
404
|
+
var import_clsx = require("clsx");
|
|
361
405
|
|
|
362
406
|
// src/hooks/use-panel-manager.ts
|
|
363
407
|
var import_core = require("@flowgram.ai/core");
|
|
364
408
|
var usePanelManager = () => (0, import_core.useService)(PanelManager);
|
|
365
409
|
|
|
410
|
+
// src/hooks/use-panel.ts
|
|
411
|
+
var import_react4 = require("react");
|
|
412
|
+
var import_traditional = require("zustand/traditional");
|
|
413
|
+
var import_shallow = require("zustand/shallow");
|
|
414
|
+
|
|
366
415
|
// src/contexts.ts
|
|
367
416
|
var import_react3 = require("react");
|
|
368
417
|
var PanelContext = (0, import_react3.createContext)({});
|
|
369
418
|
|
|
419
|
+
// src/hooks/use-panel.ts
|
|
420
|
+
var usePanel = () => (0, import_react4.useContext)(PanelContext);
|
|
421
|
+
var usePanelStore = (selector) => {
|
|
422
|
+
const panel = usePanel();
|
|
423
|
+
return (0, import_traditional.useStoreWithEqualityFn)(panel.store, selector, import_shallow.shallow);
|
|
424
|
+
};
|
|
425
|
+
|
|
370
426
|
// src/components/panel-layer/panel.tsx
|
|
371
427
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
372
428
|
var PanelItem = ({ panel }) => {
|
|
373
429
|
const panelManager = usePanelManager();
|
|
374
|
-
const ref = (0,
|
|
375
|
-
const resize = panel.factory.resize !== void 0 ? panel.factory.resize : panelManager.config.autoResize;
|
|
430
|
+
const ref = (0, import_react5.useRef)(null);
|
|
376
431
|
const isHorizontal = ["right", "docked-right"].includes(panel.area);
|
|
377
|
-
const size = (
|
|
378
|
-
const
|
|
432
|
+
const { size, fullscreen } = usePanelStore((s) => ({ size: s.size, fullscreen: s.fullscreen }));
|
|
433
|
+
const [layerSize, setLayerSize] = (0, import_react5.useState)(size);
|
|
434
|
+
const currentSize = fullscreen ? layerSize : size;
|
|
435
|
+
const sizeStyle = isHorizontal ? { width: currentSize } : { height: currentSize };
|
|
379
436
|
const handleResize = (next) => {
|
|
380
437
|
let nextSize = next;
|
|
381
438
|
if (typeof panel.factory.maxSize === "number" && nextSize > panel.factory.maxSize) {
|
|
@@ -385,24 +442,39 @@ var PanelItem = ({ panel }) => {
|
|
|
385
442
|
}
|
|
386
443
|
panel.store.setState({ size: nextSize });
|
|
387
444
|
};
|
|
388
|
-
(0,
|
|
389
|
-
if (ref.current) {
|
|
445
|
+
(0, import_react5.useEffect)(() => {
|
|
446
|
+
if (ref.current && !fullscreen) {
|
|
390
447
|
const { width, height } = ref.current.getBoundingClientRect();
|
|
391
448
|
const realSize = isHorizontal ? width : height;
|
|
392
449
|
panel.store.setState({ size: realSize });
|
|
393
450
|
}
|
|
394
|
-
}, []);
|
|
451
|
+
}, [fullscreen]);
|
|
452
|
+
(0, import_react5.useEffect)(() => {
|
|
453
|
+
if (!fullscreen) {
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
const layer = panel.layer;
|
|
457
|
+
if (!layer) {
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
const observer = new ResizeObserver(([entry]) => {
|
|
461
|
+
const { width, height } = entry.contentRect;
|
|
462
|
+
setLayerSize(isHorizontal ? width : height);
|
|
463
|
+
});
|
|
464
|
+
observer.observe(layer);
|
|
465
|
+
return () => observer.disconnect();
|
|
466
|
+
}, [fullscreen]);
|
|
395
467
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
396
468
|
"div",
|
|
397
469
|
{
|
|
398
|
-
className: (0, import_clsx.
|
|
470
|
+
className: (0, import_clsx.clsx)(
|
|
399
471
|
"gedit-flow-panel-wrap",
|
|
400
472
|
isHorizontal ? "panel-horizontal" : "panel-vertical"
|
|
401
473
|
),
|
|
402
474
|
ref,
|
|
403
475
|
style: { ...panel.factory.style, ...panel.config.style, ...sizeStyle },
|
|
404
476
|
children: [
|
|
405
|
-
|
|
477
|
+
panel.resizable && panelManager.config.resizeBarRender({
|
|
406
478
|
size,
|
|
407
479
|
direction: isHorizontal ? "vertical" : "horizontal",
|
|
408
480
|
onResize: handleResize
|
|
@@ -415,10 +487,10 @@ var PanelItem = ({ panel }) => {
|
|
|
415
487
|
};
|
|
416
488
|
var PanelArea = ({ area }) => {
|
|
417
489
|
const panelManager = usePanelManager();
|
|
418
|
-
const [panels, setPanels] = (0,
|
|
419
|
-
(0,
|
|
490
|
+
const [panels, setPanels] = (0, import_react5.useState)(panelManager.getPanels(area));
|
|
491
|
+
(0, import_react5.useEffect)(() => {
|
|
420
492
|
const dispose = panelManager.onPanelsChange(() => {
|
|
421
|
-
(0,
|
|
493
|
+
(0, import_react5.startTransition)(() => {
|
|
422
494
|
setPanels(panelManager.getPanels(area));
|
|
423
495
|
});
|
|
424
496
|
});
|
|
@@ -445,8 +517,6 @@ var globalCSS = `
|
|
|
445
517
|
|
|
446
518
|
}
|
|
447
519
|
.gedit-flow-panel-layer-wrap-floating {
|
|
448
|
-
column-gap: 4px;
|
|
449
|
-
padding: 4px;
|
|
450
520
|
pointer-events: none;
|
|
451
521
|
}
|
|
452
522
|
|
|
@@ -458,16 +528,12 @@ var globalCSS = `
|
|
|
458
528
|
display: flex;
|
|
459
529
|
flex-direction: column;
|
|
460
530
|
}
|
|
461
|
-
.gedit-flow-panel-layer-wrap-floating .gedit-flow-panel-left-area {
|
|
462
|
-
row-gap: 4px;
|
|
463
|
-
}
|
|
464
531
|
.gedit-flow-panel-right-area {
|
|
465
532
|
height: 100%;
|
|
466
533
|
flex-grow: 1;
|
|
467
534
|
flex-shrink: 0;
|
|
468
535
|
min-width: 0;
|
|
469
536
|
display: flex;
|
|
470
|
-
column-gap: 4px;
|
|
471
537
|
max-width: 100%;
|
|
472
538
|
}
|
|
473
539
|
|
|
@@ -539,13 +605,13 @@ var DockedPanelLayer = (props) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(P
|
|
|
539
605
|
var PanelLayer2 = class extends import_core2.Layer {
|
|
540
606
|
constructor() {
|
|
541
607
|
super(...arguments);
|
|
542
|
-
this.panelRoot =
|
|
608
|
+
this.panelRoot = import_utils3.domUtils.createDivWithClass("gedit-flow-panel-layer");
|
|
543
609
|
this.layout = null;
|
|
544
610
|
}
|
|
545
611
|
onReady() {
|
|
546
612
|
this.panelConfig.getPopupContainer(this.pluginContext).appendChild(this.panelRoot);
|
|
547
613
|
this.toDispose.push(
|
|
548
|
-
|
|
614
|
+
import_utils3.Disposable.create(() => {
|
|
549
615
|
this.panelRoot.remove();
|
|
550
616
|
})
|
|
551
617
|
);
|
|
@@ -558,12 +624,12 @@ var PanelLayer2 = class extends import_core2.Layer {
|
|
|
558
624
|
top: 0,
|
|
559
625
|
zIndex: 100
|
|
560
626
|
};
|
|
561
|
-
|
|
627
|
+
import_utils3.domUtils.setStyle(this.panelRoot, commonStyle);
|
|
562
628
|
}
|
|
563
629
|
render() {
|
|
564
630
|
if (!this.layout) {
|
|
565
631
|
const { children, ...layoutProps } = this.panelConfig.layerProps;
|
|
566
|
-
this.layout = (0,
|
|
632
|
+
this.layout = (0, import_react6.createElement)(PanelLayer, layoutProps, children);
|
|
567
633
|
}
|
|
568
634
|
return import_react_dom.default.createPortal(this.layout, this.panelRoot);
|
|
569
635
|
}
|
|
@@ -604,10 +670,6 @@ var createPanelManagerPlugin = (0, import_core3.definePluginCreator)({
|
|
|
604
670
|
panelManager.init();
|
|
605
671
|
}
|
|
606
672
|
});
|
|
607
|
-
|
|
608
|
-
// src/hooks/use-panel.ts
|
|
609
|
-
var import_react6 = require("react");
|
|
610
|
-
var usePanel = () => (0, import_react6.useContext)(PanelContext);
|
|
611
673
|
// Annotate the CommonJS export names for ESM import in node:
|
|
612
674
|
0 && (module.exports = {
|
|
613
675
|
DockedPanelLayer,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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\n/** create plugin function */\nexport { createPanelManagerPlugin } from './create-panel-manager-plugin';\n\n/** services */\nexport { PanelManager, PanelRestore, type PanelManagerConfig } from './services';\n\n/** react hooks */\nexport { usePanelManager } from './hooks/use-panel-manager';\nexport { usePanel } from './hooks/use-panel';\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 {\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":["import_core","import_inversify","e","import_inversify","import_react","import_inversify","import_utils","import_core","import_clsx","import_react","import_react","import_react","import_jsx_runtime","clsx","import_jsx_runtime","clsx","import_jsx_runtime","PanelLayer","ReactDOM","PanelLayer","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../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\n/** create plugin function */\nexport { createPanelManagerPlugin } from './create-panel-manager-plugin';\n\n/** services */\nexport { PanelManager, PanelRestore, type PanelManagerConfig } from './services';\n\n/** react hooks */\nexport { usePanelManager } from './hooks/use-panel-manager';\nexport { usePanel } from './hooks/use-panel';\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 {\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}\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 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 }\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 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 }\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 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 { 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 }> = ({ panel }) => {\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) => ({ size: s.size, fullscreen: s.fullscreen }));\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={{ ...panel.factory.style, ...panel.config.style, ...sizeStyle }}\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} />\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":["import_core","import_inversify","e","import_inversify","import_utils","import_react","import_inversify","import_utils","import_core","import_clsx","import_react","import_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","clsx","import_jsx_runtime","PanelLayer","ReactDOM","PanelLayer"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowgram.ai/panel-manager-plugin",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.25",
|
|
4
4
|
"homepage": "https://flowgram.ai/",
|
|
5
5
|
"repository": "https://github.com/bytedance/flowgram.ai",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"nanoid": "^5.0.9",
|
|
19
19
|
"zustand": "^5.0.8",
|
|
20
20
|
"use-sync-external-store": "^1.6.0",
|
|
21
|
-
"@flowgram.ai/
|
|
22
|
-
"@flowgram.ai/
|
|
21
|
+
"@flowgram.ai/core": "0.1.0-alpha.25",
|
|
22
|
+
"@flowgram.ai/utils": "0.1.0-alpha.25"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"react": "^18",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"@types/react-dom": "^18",
|
|
29
29
|
"tsup": "^8.0.1",
|
|
30
30
|
"typescript": "^5.8.3",
|
|
31
|
-
"@flowgram.ai/eslint-config": "0.1.0-alpha.
|
|
32
|
-
"@flowgram.ai/ts-config": "0.1.0-alpha.
|
|
31
|
+
"@flowgram.ai/eslint-config": "0.1.0-alpha.25",
|
|
32
|
+
"@flowgram.ai/ts-config": "0.1.0-alpha.25"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"react": ">=16.8",
|
|
@@ -9,13 +9,13 @@ CLI tsup v8.5.0
|
|
|
9
9
|
CLI Target: es2020
|
|
10
10
|
CJS Build start
|
|
11
11
|
ESM Build start
|
|
12
|
-
CJS dist/index.js
|
|
13
|
-
CJS dist/index.js.map
|
|
14
|
-
CJS ⚡️ Build success in
|
|
15
|
-
ESM dist/esm/index.js
|
|
16
|
-
ESM dist/esm/index.js.map
|
|
17
|
-
ESM ⚡️ Build success in
|
|
12
|
+
CJS dist/index.js 20.43 KB
|
|
13
|
+
CJS dist/index.js.map 34.43 KB
|
|
14
|
+
CJS ⚡️ Build success in 95ms
|
|
15
|
+
ESM dist/esm/index.js 17.69 KB
|
|
16
|
+
ESM dist/esm/index.js.map 33.85 KB
|
|
17
|
+
ESM ⚡️ Build success in 97ms
|
|
18
18
|
DTS Build start
|
|
19
|
-
DTS ⚡️ Build success in
|
|
20
|
-
DTS dist/index.d.ts 4.
|
|
21
|
-
DTS dist/index.d.mts 4.
|
|
19
|
+
DTS ⚡️ Build success in 3688ms
|
|
20
|
+
DTS dist/index.d.ts 4.96 KB
|
|
21
|
+
DTS dist/index.d.mts 4.96 KB
|
|
@@ -20,8 +20,6 @@ export const globalCSS = `
|
|
|
20
20
|
|
|
21
21
|
}
|
|
22
22
|
.gedit-flow-panel-layer-wrap-floating {
|
|
23
|
-
column-gap: 4px;
|
|
24
|
-
padding: 4px;
|
|
25
23
|
pointer-events: none;
|
|
26
24
|
}
|
|
27
25
|
|
|
@@ -33,16 +31,12 @@ export const globalCSS = `
|
|
|
33
31
|
display: flex;
|
|
34
32
|
flex-direction: column;
|
|
35
33
|
}
|
|
36
|
-
.gedit-flow-panel-layer-wrap-floating .gedit-flow-panel-left-area {
|
|
37
|
-
row-gap: 4px;
|
|
38
|
-
}
|
|
39
34
|
.gedit-flow-panel-right-area {
|
|
40
35
|
height: 100%;
|
|
41
36
|
flex-grow: 1;
|
|
42
37
|
flex-shrink: 0;
|
|
43
38
|
min-width: 0;
|
|
44
39
|
display: flex;
|
|
45
|
-
column-gap: 4px;
|
|
46
40
|
max-width: 100%;
|
|
47
41
|
}
|
|
48
42
|
|