@flowgram.ai/panel-manager-plugin 0.1.0-alpha.18 → 0.1.0-alpha.20

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.
@@ -9,13 +9,13 @@
9
9
  {"kind":"O","text":"\u001b[34mCLI\u001b[39m Target: es2020\n"}
10
10
  {"kind":"O","text":"\u001b[34mCJS\u001b[39m Build start\n"}
11
11
  {"kind":"O","text":"\u001b[34mESM\u001b[39m Build start\n"}
12
- {"kind":"O","text":"\u001b[32mCJS\u001b[39m \u001b[1mdist/index.js \u001b[22m\u001b[32m8.51 KB\u001b[39m\n"}
13
- {"kind":"O","text":"\u001b[32mCJS\u001b[39m \u001b[1mdist/index.js.map \u001b[22m\u001b[32m13.80 KB\u001b[39m\n"}
14
- {"kind":"O","text":"\u001b[32mCJS\u001b[39m ⚡️ Build success in 107ms\n"}
15
- {"kind":"O","text":"\u001b[32mESM\u001b[39m \u001b[1mdist/esm/index.js \u001b[22m\u001b[32m7.03 KB\u001b[39m\n"}
16
- {"kind":"O","text":"\u001b[32mESM\u001b[39m \u001b[1mdist/esm/index.js.map \u001b[22m\u001b[32m13.34 KB\u001b[39m\n"}
17
- {"kind":"O","text":"\u001b[32mESM\u001b[39m ⚡️ Build success in 108ms\n"}
12
+ {"kind":"O","text":"\u001b[32mCJS\u001b[39m \u001b[1mdist/index.js \u001b[22m\u001b[32m13.82 KB\u001b[39m\n"}
13
+ {"kind":"O","text":"\u001b[32mCJS\u001b[39m \u001b[1mdist/index.js.map \u001b[22m\u001b[32m22.26 KB\u001b[39m\n"}
14
+ {"kind":"O","text":"\u001b[32mCJS\u001b[39m ⚡️ Build success in 98ms\n"}
15
+ {"kind":"O","text":"\u001b[32mESM\u001b[39m \u001b[1mdist/esm/index.js \u001b[22m\u001b[32m11.54 KB\u001b[39m\n"}
16
+ {"kind":"O","text":"\u001b[32mESM\u001b[39m \u001b[1mdist/esm/index.js.map \u001b[22m\u001b[32m21.81 KB\u001b[39m\n"}
17
+ {"kind":"O","text":"\u001b[32mESM\u001b[39m ⚡️ Build success in 99ms\n"}
18
18
  {"kind":"O","text":"\u001b[34mDTS\u001b[39m Build start\n"}
19
- {"kind":"O","text":"\u001b[32mDTS\u001b[39m ⚡️ Build success in 2863ms\n"}
20
- {"kind":"O","text":"\u001b[32mDTS\u001b[39m \u001b[1mdist/index.d.ts \u001b[22m\u001b[32m1.87 KB\u001b[39m\n"}
21
- {"kind":"O","text":"\u001b[32mDTS\u001b[39m \u001b[1mdist/index.d.mts \u001b[22m\u001b[32m1.87 KB\u001b[39m\n"}
19
+ {"kind":"O","text":"\u001b[32mDTS\u001b[39m ⚡️ Build success in 3462ms\n"}
20
+ {"kind":"O","text":"\u001b[32mDTS\u001b[39m \u001b[1mdist/index.d.ts \u001b[22m\u001b[32m2.78 KB\u001b[39m\n"}
21
+ {"kind":"O","text":"\u001b[32mDTS\u001b[39m \u001b[1mdist/index.d.mts \u001b[22m\u001b[32m2.78 KB\u001b[39m\n"}
@@ -1,21 +1,23 @@
1
1
  {
2
2
  "files": {
3
3
  "packages/plugins/panel-manager-plugin/.eslintrc.cjs": "6b30cfc55136d429873e780785bf8d775edaaa74",
4
- "packages/plugins/panel-manager-plugin/.rush/temp/shrinkwrap-deps.json": "06e72e3927d9f66744d850a17a67751df476a6fa",
5
- "packages/plugins/panel-manager-plugin/package.json": "f2a7d6e60647063bbbddc3e1fdbdd5db033f59b7",
6
- "packages/plugins/panel-manager-plugin/src/components/panel-layer/css.ts": "5e1bd9a4c51bd72169422f33b40835baf5c9fe02",
7
- "packages/plugins/panel-manager-plugin/src/components/panel-layer/float-panel.tsx": "621fe5d092d463e21cbb019069fe05b722246ca5",
8
- "packages/plugins/panel-manager-plugin/src/components/panel-layer/index.ts": "40d07a944137146a8beb8e6842e421617e0b4f3c",
9
- "packages/plugins/panel-manager-plugin/src/components/panel-layer/panel-layer.tsx": "a297c4d59d0fce0a482dd641d386a77929cbeb35",
10
- "packages/plugins/panel-manager-plugin/src/create-panel-manager-plugin.ts": "63149b3c2df8ef693d8e55cb91925ea2de4297fe",
4
+ "packages/plugins/panel-manager-plugin/.rush/temp/shrinkwrap-deps.json": "31768a71cb9a14b49720a461fe04680fabc8c1b4",
5
+ "packages/plugins/panel-manager-plugin/package.json": "b578806137a3da06d5e4a79c98329da16ba385b0",
6
+ "packages/plugins/panel-manager-plugin/src/components/panel-layer/css.ts": "1956faac7baf1c7689b74fedacd40d16d7e59166",
7
+ "packages/plugins/panel-manager-plugin/src/components/panel-layer/float-panel.tsx": "73f08b4045d8b64b0a298ba8a0b45f6cb6c55756",
8
+ "packages/plugins/panel-manager-plugin/src/components/panel-layer/index.ts": "12fc8325355e02f272ad03ae7481f4b0a1d686df",
9
+ "packages/plugins/panel-manager-plugin/src/components/panel-layer/panel-layer.tsx": "acd6cd2e6cba1c60dbafec58ee09fe6a1060dd2d",
10
+ "packages/plugins/panel-manager-plugin/src/components/resize-bar/index.tsx": "a8eacd8ac80b61fa6930dc4ca31afa519caa2fb7",
11
+ "packages/plugins/panel-manager-plugin/src/create-panel-manager-plugin.ts": "a1872d870751a839ec2353eda3e02e6711dba779",
12
+ "packages/plugins/panel-manager-plugin/src/hooks/use-global-css.ts": "be94fd4759d691bdcc5eb8a03f90995956ce4bf0",
11
13
  "packages/plugins/panel-manager-plugin/src/hooks/use-panel-manager.ts": "0e0073c6ad9a1552a9896085b011b79dbfe6309d",
12
- "packages/plugins/panel-manager-plugin/src/index.ts": "42f953cb1cc88cc4efd148d834c9c10adc20f296",
13
- "packages/plugins/panel-manager-plugin/src/services/float-panel.ts": "3d945f7a20321c2e08a9bc27c6c72557969ac18d",
14
+ "packages/plugins/panel-manager-plugin/src/index.ts": "a7652838f2ac7287efda8a5dcc25ddd53c48a88e",
15
+ "packages/plugins/panel-manager-plugin/src/services/float-panel.ts": "579889c8dd30051a92c722856be1229960b57d16",
14
16
  "packages/plugins/panel-manager-plugin/src/services/index.ts": "bb44c19958ea0a21d5669480edaac6fd9b493f2b",
15
- "packages/plugins/panel-manager-plugin/src/services/panel-config.ts": "529cd761e24bb6231056f8c6d2233af577037cd7",
16
- "packages/plugins/panel-manager-plugin/src/services/panel-layer.ts": "462133ebe817aad63f75fa670a3a60e061c3798d",
17
- "packages/plugins/panel-manager-plugin/src/services/panel-manager.ts": "008960eef1d043343246f7e1b30f57baf5b4ea93",
18
- "packages/plugins/panel-manager-plugin/src/types.ts": "8593352079e1f0124d4cedea074c42b415e746e6",
17
+ "packages/plugins/panel-manager-plugin/src/services/panel-config.ts": "1874bbacad42eb92f9f284e277f1025c99799ee2",
18
+ "packages/plugins/panel-manager-plugin/src/services/panel-layer.ts": "e456afb5e28d3c93846521fa29ed352aca282bec",
19
+ "packages/plugins/panel-manager-plugin/src/services/panel-manager.ts": "74ae11f2e1b7f074ca80129a3239069417f523fa",
20
+ "packages/plugins/panel-manager-plugin/src/types.ts": "eda980407d8eb830108b30f60bae42bfb20e9985",
19
21
  "packages/plugins/panel-manager-plugin/tsconfig.json": "4b7a4f197dc4f9c62c2938fb3b77780944ad7675"
20
22
  },
21
23
  "arguments": "npm run build:fast -- --dts-resolve "
@@ -1,5 +1,5 @@
1
1
  {
2
- "../../packages/plugins/panel-manager-plugin": "../../packages/plugins/panel-manager-plugin:W4m7f3Huy4F0yXHfmnCL/sZBLf2QPBajFujBcJ/v7A8=:",
2
+ "../../packages/plugins/panel-manager-plugin": "../../packages/plugins/panel-manager-plugin:yX1mXvP2pUoHg+kWBxzailD0ct7xEMiUBGKeTuOw+zI=:",
3
3
  "@esbuild/aix-ppc64@0.25.9": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==",
4
4
  "@esbuild/android-arm64@0.25.9": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==",
5
5
  "@esbuild/android-arm@0.25.9": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==",
@@ -58,6 +58,7 @@
58
58
  "@rollup/rollup-win32-x64-msvc@4.50.1": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==",
59
59
  "@types/estree@1.0.8": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
60
60
  "@types/prop-types@15.7.15": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
61
+ "@types/react-dom@18.3.7(@types/react@18.3.24)": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
61
62
  "@types/react@18.3.24": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==",
62
63
  "acorn@8.15.0": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
63
64
  "ansi-regex@5.0.1": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
@@ -70,6 +71,7 @@
70
71
  "bundle-require@5.1.0(esbuild@0.25.9)": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
71
72
  "cac@6.7.14": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
72
73
  "chokidar@4.0.3": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
74
+ "clsx@1.2.1": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
73
75
  "color-convert@2.0.1": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
74
76
  "color-name@1.1.4": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
75
77
  "commander@4.1.1": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
@@ -121,12 +123,14 @@
121
123
  "postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.19.4)(yaml@2.8.1)": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
122
124
  "postcss@8.5.6": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
123
125
  "punycode@2.3.1": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
126
+ "react-dom@18.3.1(react@18.3.1)": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
124
127
  "react@18.3.1": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
125
128
  "readdirp@4.1.2": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
126
129
  "reflect-metadata@0.2.2": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
127
130
  "resolve-from@5.0.0": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
128
131
  "resolve-pkg-maps@1.0.0": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
129
132
  "rollup@4.50.1": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==",
133
+ "scheduler@0.23.2": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
130
134
  "shebang-command@2.0.0": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
131
135
  "shebang-regex@3.0.0": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
132
136
  "signal-exit@4.1.0": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
package/dist/esm/index.js CHANGED
@@ -22,7 +22,10 @@ var defineConfig = (config) => {
22
22
  bottom: {
23
23
  max: 1
24
24
  },
25
- factories: []
25
+ factories: [],
26
+ autoResize: true,
27
+ layerProps: {},
28
+ getPopupContainer: (ctx) => ctx.playground.node.parentNode
26
29
  };
27
30
  return {
28
31
  ...defaultConfig,
@@ -35,26 +38,43 @@ import { injectable, inject } from "inversify";
35
38
 
36
39
  // src/services/float-panel.ts
37
40
  import { Emitter } from "@flowgram.ai/utils";
41
+ var PANEL_SIZE_DEFAULT = 400;
38
42
  var FloatPanel = class {
39
43
  constructor(config) {
40
44
  this.config = config;
41
45
  this.elements = [];
42
46
  this.onUpdateEmitter = new Emitter();
47
+ this.sizeMap = /* @__PURE__ */ new Map();
43
48
  this.onUpdate = this.onUpdateEmitter.event;
49
+ this.currentFactoryKey = "";
50
+ }
51
+ updateSize(newSize) {
52
+ this.sizeMap.set(this.currentFactoryKey, newSize);
53
+ this.onUpdateEmitter.fire();
54
+ }
55
+ get currentSize() {
56
+ return this.sizeMap.get(this.currentFactoryKey) || PANEL_SIZE_DEFAULT;
44
57
  }
45
58
  open(factory, options) {
46
59
  const el = factory.render(options?.props);
47
60
  const idx = this.elements.findIndex((e) => e.key === factory.key);
61
+ this.currentFactoryKey = factory.key;
62
+ if (!this.sizeMap.has(factory.key)) {
63
+ this.sizeMap.set(factory.key, factory.defaultSize || PANEL_SIZE_DEFAULT);
64
+ }
48
65
  if (idx >= 0) {
49
- this.elements[idx] = { el, key: factory.key };
66
+ this.elements[idx] = { el, key: factory.key, style: factory.style };
50
67
  } else {
51
- this.elements.push({ el, key: factory.key });
68
+ this.elements.push({ el, key: factory.key, style: factory.style });
52
69
  if (this.elements.length > this.config.max) {
53
70
  this.elements.shift();
54
71
  }
55
72
  }
56
73
  this.onUpdateEmitter.fire();
57
74
  }
75
+ get visible() {
76
+ return this.elements.length > 0;
77
+ }
58
78
  close(key) {
59
79
  if (!key) {
60
80
  this.elements = [];
@@ -90,9 +110,9 @@ var PanelManager = class {
90
110
  const panel = this.getPanel(area);
91
111
  panel.open(factory, options);
92
112
  }
93
- close(key, area = "right") {
94
- const panel = this.getPanel(area);
95
- panel.close(key);
113
+ close(key) {
114
+ this.right.close(key);
115
+ this.bottom.close(key);
96
116
  }
97
117
  getPanel(area) {
98
118
  return area === "right" ? this.right : this.bottom;
@@ -110,31 +130,57 @@ PanelManager = __decorateClass([
110
130
  ], PanelManager);
111
131
 
112
132
  // src/services/panel-layer.ts
133
+ import ReactDOM from "react-dom";
113
134
  import { createElement } from "react";
114
- import { injectable as injectable2 } from "inversify";
115
- import { domUtils } from "@flowgram.ai/utils";
116
- import { Layer } from "@flowgram.ai/core";
135
+ import { injectable as injectable2, inject as inject2 } from "inversify";
136
+ import { domUtils, Disposable } from "@flowgram.ai/utils";
137
+ import { Layer, PluginContext } from "@flowgram.ai/core";
138
+
139
+ // src/components/panel-layer/panel-layer.tsx
140
+ import clsx from "clsx";
141
+
142
+ // src/hooks/use-global-css.ts
143
+ import { useEffect } from "react";
144
+ var useGlobalCSS = ({ cssText, id, cleanup }) => {
145
+ useEffect(() => {
146
+ if (typeof document === "undefined") return;
147
+ if (document.getElementById(id)) return;
148
+ const style = document.createElement("style");
149
+ style.id = id;
150
+ style.textContent = cssText;
151
+ document.head.appendChild(style);
152
+ return () => {
153
+ const existing = document.getElementById(id);
154
+ if (existing && cleanup) existing.remove();
155
+ };
156
+ }, [id]);
157
+ };
117
158
 
118
159
  // src/components/panel-layer/float-panel.tsx
119
- import { useEffect, useRef, startTransition, useState } from "react";
160
+ import { useEffect as useEffect2, useRef as useRef2, startTransition, useState as useState2, useCallback } from "react";
120
161
 
121
162
  // src/hooks/use-panel-manager.ts
122
163
  import { useService } from "@flowgram.ai/core";
123
164
  var usePanelManager = () => useService(PanelManager);
124
165
 
125
166
  // src/components/panel-layer/css.ts
126
- var panelLayer = {
127
- pointerEvents: "none",
128
- position: "absolute",
129
- top: 0,
130
- left: 0,
131
- display: "flex",
132
- columnGap: "4px",
133
- width: "100%",
134
- height: "100%",
135
- padding: "4px",
136
- boxSizing: "border-box"
137
- };
167
+ var globalCSS = `
168
+ .gedit-flow-panel-layer * {
169
+ box-sizing: border-box;
170
+ }
171
+ .gedit-flow-panel-layer-wrap {
172
+ pointer-events: none;
173
+ position: absolute;
174
+ top: 0;
175
+ left: 0;
176
+ display: flex;
177
+ column-gap: 4px;
178
+ width: 100%;
179
+ height: 100%;
180
+ padding: 4px;
181
+ overflow: hidden;
182
+ }
183
+ `;
138
184
  var leftArea = {
139
185
  width: "100%",
140
186
  minWidth: 0,
@@ -169,27 +215,89 @@ var bottomArea = {
169
215
  var floatPanelWrap = {
170
216
  pointerEvents: "auto",
171
217
  height: "100%",
172
- width: "100%"
218
+ width: "100%",
219
+ overflow: "auto"
220
+ };
221
+
222
+ // src/components/resize-bar/index.tsx
223
+ import { useRef, useState } from "react";
224
+ import { jsx } from "react/jsx-runtime";
225
+ var ResizeBar = ({ onResize, size, isVertical }) => {
226
+ const currentPoint = useRef(null);
227
+ const [isDragging, setIsDragging] = useState(false);
228
+ const [isHovered, setIsHovered] = useState(false);
229
+ return /* @__PURE__ */ jsx(
230
+ "div",
231
+ {
232
+ onMouseDown: (e) => {
233
+ currentPoint.current = isVertical ? e.clientX : e.clientY;
234
+ e.stopPropagation();
235
+ e.preventDefault();
236
+ setIsDragging(true);
237
+ const mouseUp = () => {
238
+ currentPoint.current = null;
239
+ document.body.removeEventListener("mouseup", mouseUp);
240
+ document.body.removeEventListener("mousemove", mouseMove);
241
+ setIsDragging(false);
242
+ };
243
+ const mouseMove = (e2) => {
244
+ const delta = currentPoint.current - (isVertical ? e2.clientX : e2.clientY);
245
+ onResize(size + delta);
246
+ };
247
+ document.body.addEventListener("mouseup", mouseUp);
248
+ document.body.addEventListener("mousemove", mouseMove);
249
+ },
250
+ onMouseEnter: () => setIsHovered(true),
251
+ onMouseLeave: () => setIsHovered(false),
252
+ style: {
253
+ position: "absolute",
254
+ top: 0,
255
+ left: 0,
256
+ zIndex: 999,
257
+ display: "flex",
258
+ alignItems: "center",
259
+ justifyContent: "center",
260
+ pointerEvents: "auto",
261
+ ...isVertical ? {
262
+ cursor: "ew-resize",
263
+ height: "100%",
264
+ marginLeft: -5,
265
+ width: 10
266
+ } : {
267
+ cursor: "ns-resize",
268
+ width: "100%",
269
+ marginTop: -5,
270
+ height: 10
271
+ }
272
+ },
273
+ children: /* @__PURE__ */ jsx(
274
+ "div",
275
+ {
276
+ style: {
277
+ ...isVertical ? {
278
+ width: 3,
279
+ height: "100%"
280
+ } : {
281
+ height: 3,
282
+ width: "100%"
283
+ },
284
+ backgroundColor: isDragging || isHovered ? "var(--g-playground-line)" : "transparent"
285
+ }
286
+ }
287
+ )
288
+ }
289
+ );
173
290
  };
174
291
 
175
292
  // src/components/panel-layer/float-panel.tsx
176
- import { Fragment, jsx } from "react/jsx-runtime";
293
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
177
294
  var FloatPanel2 = ({ area }) => {
178
- const [, setVersion] = useState(0);
295
+ const [, setVersion] = useState2(0);
179
296
  const panelManager = usePanelManager();
180
- const panel = useRef(panelManager.getPanel(area));
181
- const render = () => panel.current.elements.map((i) => /* @__PURE__ */ jsx(
182
- "div",
183
- {
184
- className: "float-panel-wrap",
185
- style: floatPanelWrap,
186
- onMouseDown: (e) => e.stopPropagation(),
187
- children: i.el
188
- },
189
- i.key
190
- ));
191
- const node = useRef(render());
192
- useEffect(() => {
297
+ const panel = useRef2(panelManager.getPanel(area));
298
+ const render = () => panel.current.elements.map((i) => /* @__PURE__ */ jsx2("div", { className: "float-panel-wrap", style: { ...floatPanelWrap, ...i.style }, children: i.el }, i.key));
299
+ const node = useRef2(render());
300
+ useEffect2(() => {
193
301
  const dispose = panel.current.onUpdate(() => {
194
302
  startTransition(() => {
195
303
  node.current = render();
@@ -198,70 +306,100 @@ var FloatPanel2 = ({ area }) => {
198
306
  });
199
307
  return () => dispose.dispose();
200
308
  }, [panel]);
201
- return /* @__PURE__ */ jsx(Fragment, { children: node.current });
309
+ const onResize = useCallback((newSize) => panel.current.updateSize(newSize), []);
310
+ const size = panel.current.currentSize;
311
+ const sizeStyle = area === "right" ? { width: size, height: "100%" } : { height: size, width: "100%" };
312
+ return /* @__PURE__ */ jsxs(
313
+ "div",
314
+ {
315
+ className: "gedit-flow-panel",
316
+ style: {
317
+ position: "relative",
318
+ display: panel.current.visible ? "block" : "none",
319
+ ...sizeStyle
320
+ },
321
+ children: [
322
+ panelManager.config.autoResize && panel.current.elements.length > 0 && /* @__PURE__ */ jsx2(ResizeBar, { size, isVertical: area === "right", onResize }),
323
+ node.current
324
+ ]
325
+ }
326
+ );
202
327
  };
203
328
 
204
329
  // src/components/panel-layer/panel-layer.tsx
205
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
206
- var PanelLayer = ({ children }) => /* @__PURE__ */ jsxs("div", { className: "panel-layer", style: panelLayer, children: [
207
- /* @__PURE__ */ jsxs("div", { className: "left-area", style: leftArea, children: [
208
- /* @__PURE__ */ jsx2("div", { className: "main-area", style: mainArea, children }),
209
- /* @__PURE__ */ jsx2("div", { className: "bottom-area", style: bottomArea, children: /* @__PURE__ */ jsx2(FloatPanel2, { area: "bottom" }) })
210
- ] }),
211
- /* @__PURE__ */ jsx2("div", { className: "right-area", style: rightArea, children: /* @__PURE__ */ jsx2(FloatPanel2, { area: "right" }) })
212
- ] });
330
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
331
+ var PanelLayer = ({ className, style, children }) => {
332
+ useGlobalCSS({
333
+ cssText: globalCSS,
334
+ id: "flow-panel-layer-css"
335
+ });
336
+ return /* @__PURE__ */ jsxs2("div", { className: clsx("gedit-flow-panel-layer-wrap", className), style, children: [
337
+ /* @__PURE__ */ jsxs2("div", { className: "gedit-flow-panel-left-area", style: leftArea, children: [
338
+ /* @__PURE__ */ jsx3("div", { className: "gedit-flow-panel-main-area", style: mainArea, children }),
339
+ /* @__PURE__ */ jsx3("div", { className: "gedit-flow-panel-bottom-area", style: bottomArea, children: /* @__PURE__ */ jsx3(FloatPanel2, { area: "bottom" }) })
340
+ ] }),
341
+ /* @__PURE__ */ jsx3("div", { className: "gedit-flow-panel-right-area", style: rightArea, children: /* @__PURE__ */ jsx3(FloatPanel2, { area: "right" }) })
342
+ ] });
343
+ };
213
344
 
214
345
  // src/services/panel-layer.ts
215
346
  var PanelLayer2 = class extends Layer {
216
347
  constructor() {
217
348
  super(...arguments);
218
- this.node = domUtils.createDivWithClass("gedit-flow-panel-layer");
349
+ this.panelRoot = domUtils.createDivWithClass("gedit-flow-panel-layer");
219
350
  this.layout = null;
220
351
  }
221
352
  onReady() {
353
+ this.panelConfig.getPopupContainer(this.pluginContext).appendChild(this.panelRoot);
354
+ this.toDispose.push(
355
+ Disposable.create(() => {
356
+ this.panelRoot.remove();
357
+ })
358
+ );
222
359
  const commonStyle = {
223
360
  pointerEvents: "none",
224
- zIndex: 11
361
+ width: "100%",
362
+ height: "100%",
363
+ position: "absolute",
364
+ left: 0,
365
+ top: 0,
366
+ zIndex: 100
225
367
  };
226
- domUtils.setStyle(this.node, commonStyle);
227
- this.config.onDataChange(() => {
228
- const { width, height, scrollX, scrollY } = this.config.config;
229
- domUtils.setStyle(this.node, {
230
- ...commonStyle,
231
- width,
232
- height,
233
- left: scrollX,
234
- top: scrollY
235
- });
236
- });
368
+ domUtils.setStyle(this.panelRoot, commonStyle);
237
369
  }
238
370
  render() {
239
371
  if (!this.layout) {
240
- this.layout = createElement(PanelLayer);
372
+ const { children, ...layoutProps } = this.panelConfig.layerProps;
373
+ this.layout = createElement(PanelLayer, layoutProps, children);
241
374
  }
242
- return this.layout;
375
+ return ReactDOM.createPortal(this.layout, this.panelRoot);
243
376
  }
244
377
  };
378
+ __decorateClass([
379
+ inject2(PanelManagerConfig)
380
+ ], PanelLayer2.prototype, "panelConfig", 2);
381
+ __decorateClass([
382
+ inject2(PluginContext)
383
+ ], PanelLayer2.prototype, "pluginContext", 2);
245
384
  PanelLayer2 = __decorateClass([
246
385
  injectable2()
247
386
  ], PanelLayer2);
248
387
 
249
388
  // src/create-panel-manager-plugin.ts
250
389
  var createPanelManagerPlugin = definePluginCreator({
251
- onBind: ({ bind }) => {
390
+ onBind: ({ bind }, opt) => {
252
391
  bind(PanelManager).to(PanelManager).inSingletonScope();
253
- bind(PanelManagerConfig).toConstantValue(defineConfig({}));
392
+ bind(PanelManagerConfig).toConstantValue(defineConfig(opt));
254
393
  },
255
- onInit(ctx, opt) {
394
+ onInit(ctx) {
256
395
  ctx.playground.registerLayer(PanelLayer2);
257
- const config = defineConfig(opt);
258
- ctx.container.rebind(PanelManagerConfig).toConstantValue(config);
259
396
  const panelManager = ctx.container.get(PanelManager);
260
397
  panelManager.init();
261
398
  }
262
399
  });
263
400
  export {
264
401
  PanelManager,
402
+ ResizeBar,
265
403
  createPanelManagerPlugin,
266
404
  usePanelManager
267
405
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../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/float-panel.tsx","../../src/hooks/use-panel-manager.ts","../../src/components/panel-layer/css.ts","../../src/components/panel-layer/panel-layer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator } from '@flowgram.ai/core';\n\nimport { defineConfig } from './services/panel-config';\nimport { PanelManager, PanelManagerConfig, PanelLayer } from './services';\n\nexport const createPanelManagerPlugin = definePluginCreator<Partial<PanelManagerConfig>>({\n onBind: ({ bind }) => {\n bind(PanelManager).to(PanelManager).inSingletonScope();\n bind(PanelManagerConfig).toConstantValue(defineConfig({}));\n },\n onInit(ctx, opt) {\n ctx.playground.registerLayer(PanelLayer);\n const config = defineConfig(opt);\n ctx.container.rebind(PanelManagerConfig).toConstantValue(config);\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 type { PanelFactory, PanelConfig } from '../types';\n\nexport interface PanelManagerConfig {\n factories: PanelFactory<any>[];\n right: PanelConfig;\n bottom: PanelConfig;\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 };\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) private 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, area: Area = 'right') {\n const panel = this.getPanel(area);\n panel.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 el: React.ReactNode;\n}\n\nexport class FloatPanel {\n elements: PanelElement[] = [];\n\n private onUpdateEmitter = new Emitter<void>();\n\n onUpdate = this.onUpdateEmitter.event;\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 if (idx >= 0) {\n this.elements[idx] = { el, key: factory.key };\n } else {\n this.elements.push({ el, key: factory.key });\n if (this.elements.length > this.config.max) {\n this.elements.shift();\n }\n }\n this.onUpdateEmitter.fire();\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 { createElement } from 'react';\n\nimport { injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport { Layer } from '@flowgram.ai/core';\n\nimport { PanelLayer as PanelLayerComp } from '../components/panel-layer';\n\n@injectable()\nexport class PanelLayer extends Layer {\n node = domUtils.createDivWithClass('gedit-flow-panel-layer');\n\n layout: JSX.Element | null = null;\n\n onReady(): void {\n const commonStyle = {\n pointerEvents: 'none',\n zIndex: 11,\n };\n domUtils.setStyle(this.node, commonStyle);\n this.config.onDataChange(() => {\n const { width, height, scrollX, scrollY } = this.config.config;\n domUtils.setStyle(this.node, {\n ...commonStyle,\n width,\n height,\n left: scrollX,\n top: scrollY,\n });\n });\n }\n\n render(): JSX.Element {\n if (!this.layout) {\n this.layout = createElement(PanelLayerComp);\n }\n return this.layout;\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { useEffect, useRef, startTransition, useState } 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 const render = () =>\n panel.current.elements.map((i) => (\n <div\n className=\"float-panel-wrap\"\n key={i.key}\n style={floatPanelWrap}\n onMouseDown={(e) => e.stopPropagation()}\n >\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\n return <>{node.current}</>;\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 panelLayer: React.CSSProperties = {\n pointerEvents: 'none',\n position: 'absolute',\n top: 0,\n left: 0,\n\n display: 'flex',\n columnGap: '4px',\n width: '100%',\n height: '100%',\n padding: '4px',\n boxSizing: 'border-box',\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};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { FloatPanel } from './float-panel';\nimport { panelLayer, leftArea, rightArea, mainArea, bottomArea } from './css';\n\nexport const PanelLayer: React.FC<React.PropsWithChildren> = ({ children }) => (\n <div className=\"panel-layer\" style={panelLayer}>\n <div className=\"left-area\" style={leftArea}>\n <div className=\"main-area\" style={mainArea}>\n {children}\n </div>\n <div className=\"bottom-area\" style={bottomArea}>\n <FloatPanel area=\"bottom\" />\n </div>\n </div>\n <div className=\"right-area\" style={rightArea}>\n <FloatPanel area=\"right\" />\n </div>\n </div>\n);\n"],"mappings":";;;;;;;;;;;;AAKA,SAAS,2BAA2B;;;ACQ7B,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,EACd;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;;;ACxBA,SAAS,YAAY,cAAc;;;ACAnC,SAAS,eAAe;AASjB,IAAM,aAAN,MAAiB;AAAA,EAOtB,YAAoB,QAAqB;AAArB;AANpB,oBAA2B,CAAC;AAE5B,SAAQ,kBAAkB,IAAI,QAAc;AAE5C,oBAAW,KAAK,gBAAgB;AAAA,EAEU;AAAA,EAE1C,KAAK,SAA4B,SAAc;AAC7C,UAAM,KAAK,QAAQ,OAAO,SAAS,KAAK;AACxC,UAAM,MAAM,KAAK,SAAS,UAAU,CAAC,MAAM,EAAE,QAAQ,QAAQ,GAAG;AAChE,QAAI,OAAO,GAAG;AACZ,WAAK,SAAS,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,IAAI;AAAA,IAC9C,OAAO;AACL,WAAK,SAAS,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC;AAC3C,UAAI,KAAK,SAAS,SAAS,KAAK,OAAO,KAAK;AAC1C,aAAK,SAAS,MAAM;AAAA,MACtB;AAAA,IACF;AACA,SAAK,gBAAgB,KAAK;AAAA,EAC5B;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;;;ADtCO,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,KAAa,OAAa,SAAS;AACvC,UAAM,QAAQ,KAAK,SAAS,IAAI;AAChC,UAAM,MAAM,GAAG;AAAA,EACjB;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;AAxC+C;AAAA,EAA5C,OAAO,kBAAkB;AAAA,GADf,aACkC;AADlC,eAAN;AAAA,EADN,WAAW;AAAA,GACC;;;AEPb,SAAS,qBAAqB;AAE9B,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,aAAa;;;ACJtB,SAAS,WAAW,QAAQ,iBAAiB,gBAAgB;;;ACA7D,SAAS,kBAAkB;AAIpB,IAAM,kBAAkB,MAAM,WAAyB,YAAY;;;ACJnE,IAAM,aAAkC;AAAA,EAC7C,eAAe;AAAA,EACf,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EAEN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AACb;AAEO,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;AACT;;;AF3CM,SAqBG,UArBH;AANC,IAAMC,cAAuC,CAAC,EAAE,KAAK,MAAM;AAChE,QAAM,CAAC,EAAE,UAAU,IAAI,SAAS,CAAC;AACjC,QAAM,eAAe,gBAAgB;AACrC,QAAM,QAAQ,OAAO,aAAa,SAAS,IAAI,CAAC;AAChD,QAAM,SAAS,MACb,MAAM,QAAQ,SAAS,IAAI,CAAC,MAC1B;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MAEV,OAAO;AAAA,MACP,aAAa,CAAC,MAAM,EAAE,gBAAgB;AAAA,MAErC,YAAE;AAAA;AAAA,IAJE,EAAE;AAAA,EAKT,CACD;AACH,QAAM,OAAO,OAAO,OAAO,CAAC;AAE5B,YAAU,MAAM;AACd,UAAM,UAAU,MAAM,QAAQ,SAAS,MAAM;AAC3C,sBAAgB,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;AAEV,SAAO,gCAAG,eAAK,SAAQ;AACzB;;;AG7BI,SACE,OAAAC,MADF;AAFG,IAAM,aAAgD,CAAC,EAAE,SAAS,MACvE,qBAAC,SAAI,WAAU,eAAc,OAAO,YAClC;AAAA,uBAAC,SAAI,WAAU,aAAY,OAAO,UAChC;AAAA,oBAAAA,KAAC,SAAI,WAAU,aAAY,OAAO,UAC/B,UACH;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAU,eAAc,OAAO,YAClC,0BAAAA,KAACC,aAAA,EAAW,MAAK,UAAS,GAC5B;AAAA,KACF;AAAA,EACA,gBAAAD,KAAC,SAAI,WAAU,cAAa,OAAO,WACjC,0BAAAA,KAACC,aAAA,EAAW,MAAK,SAAQ,GAC3B;AAAA,GACF;;;AJPK,IAAMC,cAAN,cAAyB,MAAM;AAAA,EAA/B;AAAA;AACL,gBAAO,SAAS,mBAAmB,wBAAwB;AAE3D,kBAA6B;AAAA;AAAA,EAE7B,UAAgB;AACd,UAAM,cAAc;AAAA,MAClB,eAAe;AAAA,MACf,QAAQ;AAAA,IACV;AACA,aAAS,SAAS,KAAK,MAAM,WAAW;AACxC,SAAK,OAAO,aAAa,MAAM;AAC7B,YAAM,EAAE,OAAO,QAAQ,SAAS,QAAQ,IAAI,KAAK,OAAO;AACxD,eAAS,SAAS,KAAK,MAAM;AAAA,QAC3B,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,KAAK;AAAA,MACP,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,SAAsB;AACpB,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,SAAS,cAAc,UAAc;AAAA,IAC5C;AACA,WAAO,KAAK;AAAA,EACd;AACF;AA7BaA,cAAN;AAAA,EADNC,YAAW;AAAA,GACCD;;;AJJN,IAAM,2BAA2B,oBAAiD;AAAA,EACvF,QAAQ,CAAC,EAAE,KAAK,MAAM;AACpB,SAAK,YAAY,EAAE,GAAG,YAAY,EAAE,iBAAiB;AACrD,SAAK,kBAAkB,EAAE,gBAAgB,aAAa,CAAC,CAAC,CAAC;AAAA,EAC3D;AAAA,EACA,OAAO,KAAK,KAAK;AACf,QAAI,WAAW,cAAcE,WAAU;AACvC,UAAM,SAAS,aAAa,GAAG;AAC/B,QAAI,UAAU,OAAO,kBAAkB,EAAE,gBAAgB,MAAM;AAC/D,UAAM,eAAe,IAAI,UAAU,IAAkB,YAAY;AACjE,iBAAa,KAAK;AAAA,EACpB;AACF,CAAC;","names":["injectable","FloatPanel","jsx","FloatPanel","PanelLayer","injectable","PanelLayer"]}
1
+ {"version":3,"sources":["../../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\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":"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","names":["injectable","inject","useEffect","useRef","useState","e","jsx","FloatPanel","useState","useRef","useEffect","jsx","jsxs","FloatPanel","PanelLayer","inject","injectable","PanelLayer"]}