@flowgram.ai/minimap-plugin 0.4.6 → 0.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/esm/index.js CHANGED
@@ -11,135 +11,16 @@ var __decorateClass = (decorators, target, key, kind) => {
11
11
 
12
12
  // src/component.tsx
13
13
  import React, { useEffect, useRef, useState } from "react";
14
-
15
- // src/constant.ts
16
- var MinimapDefaultCanvasStyle = {
17
- canvasWidth: 250,
18
- canvasHeight: 250,
19
- canvasPadding: 50,
20
- canvasBackground: "rgba(242, 243, 245, 1)",
21
- canvasBorderRadius: 10,
22
- viewportBackground: "rgba(255, 255, 255, 1)",
23
- viewportBorderRadius: 4,
24
- viewportBorderColor: "rgba(6, 7, 9, 0.10)",
25
- viewportBorderWidth: 1,
26
- viewportBorderDashLength: void 0,
27
- nodeColor: "rgba(0, 0, 0, 0.10)",
28
- nodeBorderRadius: 2,
29
- nodeBorderWidth: 0.145,
30
- nodeBorderColor: "rgba(6, 7, 9, 0.10)",
31
- overlayColor: "rgba(255, 255, 255, 0.55)"
32
- };
33
- var MinimapDefaultInactiveStyle = {
34
- scale: 0.7,
35
- opacity: 1,
36
- translateX: 15,
37
- translateY: 15
38
- };
39
- var MinimapDefaultOptions = {
40
- canvasStyle: MinimapDefaultCanvasStyle,
41
- canvasClassName: "gedit-minimap-canvas",
42
- enableActiveDebounce: false,
43
- enableInactiveDebounce: true,
44
- enableDisplayAllNodes: false,
45
- activeDebounceTime: 0,
46
- inactiveDebounceTime: 5
47
- };
48
-
49
- // src/component.tsx
50
- var MinimapRender = (props) => {
51
- const {
52
- service,
53
- panelStyles = {},
54
- containerStyles = {},
55
- inactiveStyle: customInactiveStyle = {}
56
- } = props;
57
- const inactiveStyle = {
58
- ...MinimapDefaultInactiveStyle,
59
- ...customInactiveStyle
60
- };
61
- const panelRef = useRef(null);
62
- const [activated, setActivated] = useState(false);
63
- useEffect(() => {
64
- const canvasContainer = panelRef.current;
65
- if (canvasContainer && service.canvas) {
66
- canvasContainer.appendChild(service.canvas);
67
- }
68
- const disposer = service.onActive((activate) => {
69
- setActivated(activate);
70
- });
71
- return () => {
72
- disposer.dispose();
73
- };
74
- }, []);
75
- const scale = activated ? 1 : inactiveStyle.scale;
76
- const opacity = activated ? 1 : inactiveStyle.opacity;
77
- const translateX = activated ? 0 : inactiveStyle.translateX;
78
- const translateY = activated ? 0 : inactiveStyle.translateY;
79
- return /* @__PURE__ */ React.createElement(
80
- "div",
81
- {
82
- className: "minimap-container",
83
- style: {
84
- position: "fixed",
85
- right: 30,
86
- bottom: 70,
87
- transition: "all 0.3s ease",
88
- // 添加过渡效果
89
- transform: `scale(${scale}) translate(${translateX}px, ${translateY}px)`,
90
- opacity,
91
- transformOrigin: "bottom right",
92
- // 设置变换的原点
93
- ...containerStyles
94
- }
95
- },
96
- /* @__PURE__ */ React.createElement(
97
- "div",
98
- {
99
- className: "minimap-panel",
100
- style: {
101
- display: "flex",
102
- width: "100%",
103
- height: "100%",
104
- borderRadius: "10px",
105
- backgroundColor: "rgba(255, 255, 255, 1)",
106
- border: "0.572px solid rgba(6, 7, 9, 0.10)",
107
- overflow: "hidden",
108
- boxShadow: "0px 2.289px 6.867px 0px rgba(0, 0, 0, 0.08), 0px 4.578px 13.733px 0px rgba(0, 0, 0, 0.04)",
109
- boxSizing: "border-box",
110
- padding: 8,
111
- ...panelStyles
112
- },
113
- "data-flow-editor-selectable": "false",
114
- ref: panelRef,
115
- onMouseEnter: () => {
116
- service.setActivate(true);
117
- },
118
- onMouseLeave: () => {
119
- service.setActivate(false);
120
- },
121
- onTouchStartCapture: () => {
122
- service.setActivate(true);
123
- },
124
- onTouchEndCapture: () => {
125
- service.setActivate(false);
126
- }
127
- }
128
- )
129
- );
130
- };
131
-
132
- // src/create-plugin.ts
133
- import { definePluginCreator } from "@flowgram.ai/core";
14
+ import { usePlaygroundContainer } from "@flowgram.ai/core";
134
15
 
135
16
  // src/service.ts
136
- import { debounce } from "lodash";
17
+ import { throttle } from "lodash-es";
137
18
  import { inject, injectable } from "inversify";
138
19
  import { DisposableCollection, Rectangle } from "@flowgram.ai/utils";
139
20
  import { FlowNodeTransformData } from "@flowgram.ai/document";
140
21
  import { FlowNodeBaseType } from "@flowgram.ai/document";
141
22
  import { FlowDocument } from "@flowgram.ai/document";
142
- import { EntityManager, MouseTouchEvent, PlaygroundConfigEntity } from "@flowgram.ai/core";
23
+ import { MouseTouchEvent, PlaygroundConfigEntity } from "@flowgram.ai/core";
143
24
 
144
25
  // src/draw.ts
145
26
  var MinimapDraw;
@@ -224,9 +105,42 @@ var MinimapDraw;
224
105
  };
225
106
  })(MinimapDraw || (MinimapDraw = {}));
226
107
 
108
+ // src/constant.ts
109
+ var MinimapDefaultCanvasStyle = {
110
+ canvasWidth: 250,
111
+ canvasHeight: 250,
112
+ canvasPadding: 50,
113
+ canvasBackground: "rgba(242, 243, 245, 1)",
114
+ canvasBorderRadius: 10,
115
+ viewportBackground: "rgba(255, 255, 255, 1)",
116
+ viewportBorderRadius: 4,
117
+ viewportBorderColor: "rgba(6, 7, 9, 0.10)",
118
+ viewportBorderWidth: 1,
119
+ viewportBorderDashLength: void 0,
120
+ nodeColor: "rgba(0, 0, 0, 0.10)",
121
+ nodeBorderRadius: 2,
122
+ nodeBorderWidth: 0.145,
123
+ nodeBorderColor: "rgba(6, 7, 9, 0.10)",
124
+ overlayColor: "rgba(255, 255, 255, 0.55)"
125
+ };
126
+ var MinimapDefaultInactiveStyle = {
127
+ scale: 0.7,
128
+ opacity: 1,
129
+ translateX: 15,
130
+ translateY: 15
131
+ };
132
+ var MinimapDefaultOptions = {
133
+ canvasStyle: MinimapDefaultCanvasStyle,
134
+ canvasClassName: "gedit-minimap-canvas",
135
+ enableDisplayAllNodes: false,
136
+ activeThrottleTime: 0,
137
+ inactiveThrottleTime: 24
138
+ };
139
+
227
140
  // src/service.ts
228
141
  var FlowMinimapService = class {
229
142
  constructor() {
143
+ this.visible = false;
230
144
  this.onActive = (callback) => {
231
145
  this.onActiveCallbacks.add(callback);
232
146
  return {
@@ -328,12 +242,8 @@ var FlowMinimapService = class {
328
242
  init(options) {
329
243
  this.options = MinimapDefaultOptions;
330
244
  Object.assign(this.options, options);
331
- this.setDebounce({
332
- enableDebounce: this.options.enableInactiveDebounce,
333
- debounceTime: this.options.inactiveDebounceTime
334
- });
245
+ this.setThrottle(this.options.inactiveThrottleTime);
335
246
  this.initStyle();
336
- this.mountListener();
337
247
  }
338
248
  dispose() {
339
249
  this.toDispose.dispose();
@@ -341,6 +251,9 @@ var FlowMinimapService = class {
341
251
  this.activated = false;
342
252
  this.removeEventListeners();
343
253
  }
254
+ setVisible(visible) {
255
+ this.visible = visible;
256
+ }
344
257
  setActivate(activate) {
345
258
  if (activate === this.activated) {
346
259
  return;
@@ -350,16 +263,10 @@ var FlowMinimapService = class {
350
263
  }
351
264
  this.activated = activate;
352
265
  if (activate) {
353
- this.setDebounce({
354
- enableDebounce: this.options.enableActiveDebounce,
355
- debounceTime: this.options.activeDebounceTime
356
- });
266
+ this.setThrottle(this.options.activeThrottleTime);
357
267
  this.addEventListeners();
358
268
  } else {
359
- this.setDebounce({
360
- enableDebounce: this.options.enableInactiveDebounce,
361
- debounceTime: this.options.inactiveDebounceTime
362
- });
269
+ this.setThrottle(this.options.inactiveThrottleTime);
363
270
  this.removeEventListeners();
364
271
  }
365
272
  this.render();
@@ -379,24 +286,19 @@ var FlowMinimapService = class {
379
286
  this.canvas.height = this.style.canvasHeight;
380
287
  this.canvas.style.borderRadius = this.style.canvasBorderRadius ? `${this.style.canvasBorderRadius}px` : "unset";
381
288
  }
382
- setDebounce(params) {
383
- const { enableDebounce, debounceTime } = params;
384
- if (enableDebounce) {
385
- this.render = debounce(this._render, debounceTime);
386
- } else {
387
- this.render = this._render;
388
- }
289
+ setThrottle(throttleTime) {
290
+ this.render = throttle(this._render, throttleTime);
389
291
  }
390
292
  _render() {
391
- if (!this.initialized) {
293
+ if (!this.initialized || !this.visible) {
392
294
  return;
393
295
  }
394
296
  const renderContext = this.createRenderContext();
395
297
  this.renderCanvas(renderContext);
396
298
  }
397
299
  createRenderContext() {
398
- const { canvas, context2D, nodes } = this;
399
- const nodeTransforms = this.nodeTransforms(nodes);
300
+ const { canvas, context2D } = this;
301
+ const nodeTransforms = this.transformVisibles;
400
302
  const nodeRects = nodeTransforms.map((transform) => transform.bounds);
401
303
  const viewRect = this.viewRect();
402
304
  const renderRect = this.renderRect(nodeRects).withPadding({
@@ -476,8 +378,13 @@ var FlowMinimapService = class {
476
378
  };
477
379
  return { scale, offset };
478
380
  }
479
- get nodes() {
480
- return this.document.getAllNodes().filter((node) => {
381
+ get transformVisibles() {
382
+ const transformVisible = this.document.getRenderDatas(
383
+ FlowNodeTransformData,
384
+ false
385
+ );
386
+ return transformVisible.filter((transform) => {
387
+ const node = transform.entity;
481
388
  if (node.hidden) return false;
482
389
  if (node.flowNodeType === FlowNodeBaseType.ROOT) return;
483
390
  if (!this.options.enableDisplayAllNodes && node.parent && node.parent.flowNodeType !== FlowNodeBaseType.ROOT)
@@ -485,9 +392,6 @@ var FlowMinimapService = class {
485
392
  return true;
486
393
  });
487
394
  }
488
- nodeTransforms(nodes) {
489
- return nodes.map((node) => node.getData(FlowNodeTransformData)).filter(Boolean);
490
- }
491
395
  renderRect(rects) {
492
396
  return Rectangle.enlarge(rects);
493
397
  }
@@ -495,10 +399,6 @@ var FlowMinimapService = class {
495
399
  const { width, height, scrollX, scrollY, zoom } = this.playgroundConfig.config;
496
400
  return new Rectangle(scrollX / zoom, scrollY / zoom, width / zoom, height / zoom);
497
401
  }
498
- mountListener() {
499
- const entityManagerDisposer = this.entityManager.onEntityChange(() => this.render());
500
- this.toDispose.push(entityManagerDisposer);
501
- }
502
402
  /** 计算画布坐标系下的矩形 */
503
403
  rectOnCanvas(params) {
504
404
  const { rect, scale, offset } = params;
@@ -541,9 +441,6 @@ var FlowMinimapService = class {
541
441
  __decorateClass([
542
442
  inject(FlowDocument)
543
443
  ], FlowMinimapService.prototype, "document", 2);
544
- __decorateClass([
545
- inject(EntityManager)
546
- ], FlowMinimapService.prototype, "entityManager", 2);
547
444
  __decorateClass([
548
445
  inject(PlaygroundConfigEntity)
549
446
  ], FlowMinimapService.prototype, "playgroundConfig", 2);
@@ -551,11 +448,107 @@ FlowMinimapService = __decorateClass([
551
448
  injectable()
552
449
  ], FlowMinimapService);
553
450
 
451
+ // src/component.tsx
452
+ var MinimapRender = (props) => {
453
+ const { panelStyles = {}, containerStyles = {}, inactiveStyle: customInactiveStyle = {} } = props;
454
+ const inactiveStyle = {
455
+ ...MinimapDefaultInactiveStyle,
456
+ ...customInactiveStyle
457
+ };
458
+ const playgroundContainer = usePlaygroundContainer();
459
+ const service = props.service || playgroundContainer?.get(FlowMinimapService);
460
+ const panelRef = useRef(null);
461
+ const [activated, setActivated] = useState(false);
462
+ useEffect(() => {
463
+ const canvasContainer = panelRef.current;
464
+ if (canvasContainer && service.canvas) {
465
+ canvasContainer.appendChild(service.canvas);
466
+ }
467
+ const disposer = service.onActive((activate) => {
468
+ setActivated(activate);
469
+ });
470
+ service.setVisible(true);
471
+ service.render();
472
+ return () => {
473
+ disposer.dispose();
474
+ service.setVisible(false);
475
+ };
476
+ }, [service]);
477
+ const scale = activated ? 1 : inactiveStyle.scale;
478
+ const opacity = activated ? 1 : inactiveStyle.opacity;
479
+ const translateX = activated ? 0 : inactiveStyle.translateX;
480
+ const translateY = activated ? 0 : inactiveStyle.translateY;
481
+ return /* @__PURE__ */ React.createElement(
482
+ "div",
483
+ {
484
+ className: "minimap-container",
485
+ style: {
486
+ position: "fixed",
487
+ right: 30,
488
+ bottom: 70,
489
+ transition: "all 0.3s ease",
490
+ // 添加过渡效果
491
+ transform: `scale(${scale}) translate(${translateX}px, ${translateY}px)`,
492
+ opacity,
493
+ transformOrigin: "bottom right",
494
+ // 设置变换的原点
495
+ ...containerStyles
496
+ }
497
+ },
498
+ /* @__PURE__ */ React.createElement(
499
+ "div",
500
+ {
501
+ className: "minimap-panel",
502
+ style: {
503
+ display: "flex",
504
+ width: "100%",
505
+ height: "100%",
506
+ borderRadius: "10px",
507
+ backgroundColor: "rgba(255, 255, 255, 1)",
508
+ border: "0.572px solid rgba(6, 7, 9, 0.10)",
509
+ overflow: "hidden",
510
+ boxShadow: "0px 2.289px 6.867px 0px rgba(0, 0, 0, 0.08), 0px 4.578px 13.733px 0px rgba(0, 0, 0, 0.04)",
511
+ boxSizing: "border-box",
512
+ padding: 8,
513
+ ...panelStyles
514
+ },
515
+ "data-flow-editor-selectable": "false",
516
+ ref: panelRef,
517
+ onMouseEnter: () => {
518
+ service.setActivate(true);
519
+ },
520
+ onMouseLeave: () => {
521
+ service.setActivate(false);
522
+ },
523
+ onTouchStartCapture: () => {
524
+ service.setActivate(true);
525
+ },
526
+ onTouchEndCapture: () => {
527
+ service.setActivate(false);
528
+ }
529
+ }
530
+ )
531
+ );
532
+ };
533
+
534
+ // src/create-plugin.ts
535
+ import { definePluginCreator } from "@flowgram.ai/core";
536
+
554
537
  // src/layer.tsx
555
538
  import React2 from "react";
556
539
  import { inject as inject2, injectable as injectable2 } from "inversify";
557
- import { Layer } from "@flowgram.ai/core";
558
540
  import { domUtils } from "@flowgram.ai/utils";
541
+ import {
542
+ FlowNodeEntity,
543
+ FlowNodeTransformData as FlowNodeTransformData2,
544
+ FlowDocumentTransformerEntity
545
+ } from "@flowgram.ai/document";
546
+ import {
547
+ Layer,
548
+ observeEntityDatas,
549
+ observeEntity,
550
+ PlaygroundConfigEntity as PlaygroundConfigEntity2
551
+ } from "@flowgram.ai/core";
559
552
  var FlowMinimapLayer = class extends Layer {
560
553
  constructor() {
561
554
  super();
@@ -564,6 +557,9 @@ var FlowMinimapLayer = class extends Layer {
564
557
  this.node.style.zIndex = "9999";
565
558
  }
566
559
  render() {
560
+ if (this.documentTransformer.loading) return /* @__PURE__ */ React2.createElement(React2.Fragment, null);
561
+ this.documentTransformer.refresh();
562
+ this.service.render();
567
563
  if (this.options.disableLayer) {
568
564
  return /* @__PURE__ */ React2.createElement(React2.Fragment, null);
569
565
  }
@@ -582,6 +578,15 @@ FlowMinimapLayer.type = "FlowMinimapLayer";
582
578
  __decorateClass([
583
579
  inject2(FlowMinimapService)
584
580
  ], FlowMinimapLayer.prototype, "service", 2);
581
+ __decorateClass([
582
+ observeEntityDatas(FlowNodeEntity, FlowNodeTransformData2)
583
+ ], FlowMinimapLayer.prototype, "transformDatas", 2);
584
+ __decorateClass([
585
+ observeEntity(PlaygroundConfigEntity2)
586
+ ], FlowMinimapLayer.prototype, "configEntity", 2);
587
+ __decorateClass([
588
+ observeEntity(FlowDocumentTransformerEntity)
589
+ ], FlowMinimapLayer.prototype, "documentTransformer", 2);
585
590
  FlowMinimapLayer = __decorateClass([
586
591
  injectable2()
587
592
  ], FlowMinimapLayer);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/component.tsx","../../src/constant.ts","../../src/create-plugin.ts","../../src/service.ts","../../src/draw.ts","../../src/layer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { CSSProperties, useEffect, useRef, useState } from 'react';\n\nimport { MinimapInactiveStyle } from './type';\nimport { FlowMinimapService } from './service';\nimport { MinimapDefaultInactiveStyle } from './constant';\n\ninterface MinimapProps {\n service: FlowMinimapService;\n panelStyles?: CSSProperties;\n containerStyles?: CSSProperties;\n inactiveStyle?: Partial<MinimapInactiveStyle>;\n}\n\nexport const MinimapRender: React.FC<MinimapProps> = (props) => {\n const {\n service,\n panelStyles = {},\n containerStyles = {},\n inactiveStyle: customInactiveStyle = {},\n } = props;\n const inactiveStyle = {\n ...MinimapDefaultInactiveStyle,\n ...customInactiveStyle,\n };\n const panelRef = useRef<HTMLDivElement>(null);\n const [activated, setActivated] = useState<boolean>(false);\n\n useEffect(() => {\n const canvasContainer: HTMLDivElement | null = panelRef.current;\n if (canvasContainer && service.canvas) {\n canvasContainer.appendChild(service.canvas);\n }\n const disposer = service.onActive((activate: boolean) => {\n setActivated(activate);\n });\n return () => {\n disposer.dispose();\n };\n }, []);\n\n // 计算缩放比例和透明度\n const scale: number = activated ? 1 : inactiveStyle.scale;\n const opacity: number = activated ? 1 : inactiveStyle.opacity;\n\n // 计算偏移量\n const translateX: number = activated ? 0 : inactiveStyle.translateX; // 向右偏移的像素\n const translateY: number = activated ? 0 : inactiveStyle.translateY; // 向下偏移的像素\n\n return (\n <div\n className=\"minimap-container\"\n style={{\n position: 'fixed',\n right: 30,\n bottom: 70,\n transition: 'all 0.3s ease', // 添加过渡效果\n transform: `scale(${scale}) translate(${translateX}px, ${translateY}px)`,\n opacity: opacity,\n transformOrigin: 'bottom right', // 设置变换的原点\n ...containerStyles,\n }}\n >\n <div\n className=\"minimap-panel\"\n style={{\n display: 'flex',\n width: '100%',\n height: '100%',\n borderRadius: '10px',\n backgroundColor: 'rgba(255, 255, 255, 1)',\n border: '0.572px solid rgba(6, 7, 9, 0.10)',\n overflow: 'hidden',\n boxShadow:\n '0px 2.289px 6.867px 0px rgba(0, 0, 0, 0.08), 0px 4.578px 13.733px 0px rgba(0, 0, 0, 0.04)',\n boxSizing: 'border-box',\n padding: 8,\n ...panelStyles,\n }}\n data-flow-editor-selectable=\"false\"\n ref={panelRef}\n onMouseEnter={() => {\n service.setActivate(true);\n }}\n onMouseLeave={() => {\n service.setActivate(false);\n }}\n onTouchStartCapture={() => {\n service.setActivate(true);\n }}\n onTouchEndCapture={() => {\n service.setActivate(false);\n }}\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 type { MinimapCanvasStyle, MinimapInactiveStyle, MinimapServiceOptions } from './type';\n\nexport const MinimapDefaultCanvasStyle: MinimapCanvasStyle = {\n canvasWidth: 250,\n canvasHeight: 250,\n canvasPadding: 50,\n canvasBackground: 'rgba(242, 243, 245, 1)',\n canvasBorderRadius: 10,\n viewportBackground: 'rgba(255, 255, 255, 1)',\n viewportBorderRadius: 4,\n viewportBorderColor: 'rgba(6, 7, 9, 0.10)',\n viewportBorderWidth: 1,\n viewportBorderDashLength: undefined,\n nodeColor: 'rgba(0, 0, 0, 0.10)',\n nodeBorderRadius: 2,\n nodeBorderWidth: 0.145,\n nodeBorderColor: 'rgba(6, 7, 9, 0.10)',\n overlayColor: 'rgba(255, 255, 255, 0.55)',\n};\n\nexport const MinimapDefaultInactiveStyle: MinimapInactiveStyle = {\n scale: 0.7,\n opacity: 1,\n translateX: 15,\n translateY: 15,\n};\n\nexport const MinimapDefaultOptions: MinimapServiceOptions = {\n canvasStyle: MinimapDefaultCanvasStyle,\n canvasClassName: 'gedit-minimap-canvas',\n enableActiveDebounce: false,\n enableInactiveDebounce: true,\n enableDisplayAllNodes: false,\n activeDebounceTime: 0,\n inactiveDebounceTime: 5,\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { CreateMinimapPluginOptions } from './type';\nimport { FlowMinimapService } from './service';\nimport { FlowMinimapLayer } from './layer';\n\nexport const createMinimapPlugin = definePluginCreator<CreateMinimapPluginOptions>({\n onBind: ({ bind }) => {\n bind(FlowMinimapService).toSelf().inSingletonScope();\n },\n onInit: (ctx: PluginContext, opts: CreateMinimapPluginOptions) => {\n ctx.playground.registerLayer(FlowMinimapLayer, opts);\n ctx.get(FlowMinimapService).init(opts);\n },\n onDispose: (ctx: PluginContext) => {\n ctx.get(FlowMinimapService).dispose();\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { debounce } from 'lodash';\nimport { inject, injectable } from 'inversify';\nimport { Disposable, DisposableCollection, IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { FlowNodeEntity, FlowNodeTransformData } from '@flowgram.ai/document';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { EntityManager, MouseTouchEvent, PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nimport type { MinimapRenderContext, MinimapServiceOptions, MinimapCanvasStyle } from './type';\nimport { MinimapDraw } from './draw';\nimport { MinimapDefaultCanvasStyle, MinimapDefaultOptions } from './constant';\n\n@injectable()\nexport class FlowMinimapService {\n @inject(FlowDocument) private readonly document: FlowDocument;\n\n @inject(EntityManager) private readonly entityManager: EntityManager;\n\n @inject(PlaygroundConfigEntity)\n private readonly playgroundConfig: PlaygroundConfigEntity;\n\n public readonly canvas: HTMLCanvasElement;\n\n public readonly context2D: CanvasRenderingContext2D;\n\n public activated;\n\n private onActiveCallbacks: Set<(activated: boolean) => void>;\n\n private options: MinimapServiceOptions;\n\n private toDispose: DisposableCollection;\n\n private initialized;\n\n private isDragging;\n\n private style: MinimapCanvasStyle;\n\n private dragStart?: IPoint;\n\n constructor() {\n this.canvas = document.createElement('canvas');\n this.context2D = this.canvas.getContext('2d')!;\n this.initialized = !!this.context2D;\n this.onActiveCallbacks = new Set();\n this.toDispose = new DisposableCollection();\n this.render = this._render;\n this.activated = false;\n this.isDragging = false;\n }\n\n public init(options?: Partial<MinimapServiceOptions>) {\n this.options = MinimapDefaultOptions;\n Object.assign(this.options, options);\n this.setDebounce({\n enableDebounce: this.options.enableInactiveDebounce,\n debounceTime: this.options.inactiveDebounceTime,\n });\n this.initStyle();\n this.mountListener();\n }\n\n public dispose(): void {\n this.toDispose.dispose();\n this.initialized = false;\n this.activated = false;\n this.removeEventListeners();\n }\n\n public setActivate(activate: boolean): void {\n if (activate === this.activated) {\n return;\n }\n if (!activate && this.isDragging) {\n // 拖拽时持续激活\n return;\n }\n this.activated = activate;\n if (activate) {\n this.setDebounce({\n enableDebounce: this.options.enableActiveDebounce,\n debounceTime: this.options.activeDebounceTime,\n });\n this.addEventListeners();\n } else {\n this.setDebounce({\n enableDebounce: this.options.enableInactiveDebounce,\n debounceTime: this.options.inactiveDebounceTime,\n });\n this.removeEventListeners();\n }\n this.render();\n this.onActiveCallbacks.forEach((callback) => callback(activate));\n }\n\n public onActive = (callback: (activated: boolean) => void): Disposable => {\n this.onActiveCallbacks.add(callback);\n return {\n dispose: () => {\n this.onActiveCallbacks.delete(callback);\n },\n };\n };\n\n private initStyle() {\n if (!this.initialized) {\n return;\n }\n const { canvasClassName, canvasStyle } = this.options;\n this.canvas.className = canvasClassName;\n this.style = {\n ...MinimapDefaultCanvasStyle,\n ...canvasStyle,\n };\n this.canvas.width = this.style.canvasWidth;\n this.canvas.height = this.style.canvasHeight;\n this.canvas.style.borderRadius = this.style.canvasBorderRadius\n ? `${this.style.canvasBorderRadius}px`\n : 'unset';\n }\n\n private setDebounce(params: { enableDebounce: boolean; debounceTime: number }) {\n const { enableDebounce, debounceTime } = params;\n if (enableDebounce) {\n this.render = debounce(this._render, debounceTime);\n } else {\n this.render = this._render;\n }\n }\n\n /**\n * 触发渲染\n */\n private render: () => void = this._render;\n\n private _render(): void {\n if (!this.initialized) {\n return;\n }\n const renderContext = this.createRenderContext();\n this.renderCanvas(renderContext);\n }\n\n private createRenderContext(): MinimapRenderContext {\n const { canvas, context2D, nodes } = this;\n const nodeTransforms: FlowNodeTransformData[] = this.nodeTransforms(nodes);\n const nodeRects: Rectangle[] = nodeTransforms.map((transform) => transform.bounds);\n const viewRect: Rectangle = this.viewRect();\n const renderRect: Rectangle = this.renderRect(nodeRects).withPadding({\n top: this.style.canvasPadding,\n bottom: this.style.canvasPadding,\n left: this.style.canvasPadding,\n right: this.style.canvasPadding,\n });\n const canvasRect: Rectangle = Rectangle.enlarge([viewRect, renderRect]);\n\n const { scale, offset } = this.calculateScaleAndOffset({ canvasRect });\n\n return {\n canvas,\n context2D,\n nodeRects,\n canvasRect,\n viewRect,\n renderRect,\n scale,\n offset,\n };\n }\n\n private renderCanvas(renderContext: MinimapRenderContext) {\n const { canvas, context2D, nodeRects, viewRect, scale, offset } = renderContext;\n\n // 清空画布\n MinimapDraw.clear({ canvas, context: context2D });\n\n // 设置背景色\n MinimapDraw.backgroundColor({\n canvas,\n context: context2D,\n color: this.style.canvasBackground,\n });\n\n // 绘制视窗\n MinimapDraw.roundRectangle({\n context: context2D,\n rect: this.rectOnCanvas({ rect: viewRect, scale, offset }),\n color: this.style.viewportBackground,\n radius: this.style.viewportBorderRadius as number,\n });\n\n // 绘制节点\n nodeRects.forEach((nodeRect: Rectangle) => {\n MinimapDraw.roundRectangle({\n context: context2D,\n rect: this.rectOnCanvas({ rect: nodeRect, scale, offset }),\n color: this.style.nodeColor as string,\n radius: this.style.nodeBorderRadius as number,\n borderWidth: this.style.nodeBorderWidth as number,\n borderColor: this.style.nodeBorderColor as string,\n });\n });\n\n // 绘制视窗边框\n MinimapDraw.roundRectangle({\n context: context2D,\n rect: this.rectOnCanvas({ rect: viewRect, scale, offset }),\n color: 'rgba(255, 255, 255, 0)' as string,\n radius: this.style.viewportBorderRadius as number,\n borderColor: this.style.viewportBorderColor as string,\n borderWidth: this.style.viewportBorderWidth as number,\n borderDashLength: this.style.viewportBorderDashLength as number,\n });\n\n // 绘制视窗外的蒙层\n MinimapDraw.overlay({\n canvas,\n context: context2D,\n offset,\n scale,\n rect: viewRect,\n color: this.style.overlayColor as string,\n });\n }\n\n private calculateScaleAndOffset(params: { canvasRect: Rectangle }): {\n scale: number;\n offset: IPoint;\n } {\n const { canvasRect } = params;\n const { width: canvasWidth, height: canvasHeight } = this.canvas;\n\n // 计算缩放比例\n const scaleX = canvasWidth / canvasRect.width;\n const scaleY = canvasHeight / canvasRect.height;\n const scale = Math.min(scaleX, scaleY);\n\n // 计算缩放后的渲染区域尺寸\n const scaledWidth = canvasRect.width * scale;\n const scaledHeight = canvasRect.height * scale;\n\n // 计算居中偏移量\n const centerOffsetX = (canvasWidth - scaledWidth) / 2;\n const centerOffsetY = (canvasHeight - scaledHeight) / 2;\n\n // 计算最终偏移量\n const offset = {\n x: centerOffsetX / scale - canvasRect.x,\n y: centerOffsetY / scale - canvasRect.y,\n };\n\n return { scale, offset };\n }\n\n private get nodes(): FlowNodeEntity[] {\n return this.document.getAllNodes().filter((node) => {\n // 去除不可见节点\n if (node.hidden) return false;\n // 去除根节点\n if (node.flowNodeType === FlowNodeBaseType.ROOT) return;\n // 去除非一级节点\n if (\n !this.options.enableDisplayAllNodes &&\n node.parent &&\n node.parent.flowNodeType !== FlowNodeBaseType.ROOT\n )\n return;\n return true;\n });\n }\n\n private nodeTransforms(nodes: FlowNodeEntity[]): FlowNodeTransformData[] {\n return nodes.map((node) => node.getData(FlowNodeTransformData)).filter(Boolean);\n }\n\n private renderRect(rects: Rectangle[]): Rectangle {\n return Rectangle.enlarge(rects);\n }\n\n private viewRect(): Rectangle {\n const { width, height, scrollX, scrollY, zoom } = this.playgroundConfig.config;\n return new Rectangle(scrollX / zoom, scrollY / zoom, width / zoom, height / zoom);\n }\n\n private mountListener(): void {\n const entityManagerDisposer = this.entityManager.onEntityChange(() => this.render());\n this.toDispose.push(entityManagerDisposer);\n }\n\n /** 计算画布坐标系下的矩形 */\n private rectOnCanvas(params: { rect: Rectangle; scale: number; offset: IPoint }): Rectangle {\n const { rect, scale, offset } = params;\n return new Rectangle(\n (rect.x + offset.x) * scale,\n (rect.y + offset.y) * scale,\n rect.width * scale,\n rect.height * scale\n );\n }\n\n private isPointInRect(params: { point: IPoint; rect: Rectangle }): boolean {\n const { point, rect } = params;\n return (\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height\n );\n }\n\n private addEventListeners(): void {\n this.canvas.addEventListener('wheel', this.handleWheel);\n this.canvas.addEventListener('mousedown', this.handleStartDrag);\n this.canvas.addEventListener('touchstart', this.handleStartDrag, { passive: false });\n this.canvas.addEventListener('mousemove', this.handleCursor);\n }\n\n private removeEventListeners(): void {\n this.canvas.removeEventListener('wheel', this.handleWheel);\n this.canvas.removeEventListener('mousedown', this.handleStartDrag);\n this.canvas.removeEventListener('touchstart', this.handleStartDrag);\n this.canvas.removeEventListener('mousemove', this.handleCursor);\n }\n\n private handleWheel = (event: WheelEvent): void => {};\n\n private handleStartDrag = (event: MouseEvent | TouchEvent): void => {\n MouseTouchEvent.preventDefault(event);\n event.stopPropagation();\n const renderContext = this.createRenderContext();\n const { viewRect, scale, offset } = renderContext;\n const canvasRect = this.canvas.getBoundingClientRect();\n const { clientX, clientY } = MouseTouchEvent.getEventCoord(event);\n const mousePoint: IPoint = {\n x: clientX - canvasRect.left,\n y: clientY - canvasRect.top,\n };\n\n const viewRectOnCanvas = this.rectOnCanvas({\n rect: viewRect,\n scale,\n offset,\n });\n if (!this.isPointInRect({ point: mousePoint, rect: viewRectOnCanvas })) {\n return;\n }\n this.isDragging = true;\n this.dragStart = mousePoint;\n // click\n document.addEventListener('mousemove', this.handleDragging);\n document.addEventListener('mouseup', this.handleEndDrag);\n // touch\n document.addEventListener('touchmove', this.handleDragging, { passive: false });\n document.addEventListener('touchend', this.handleEndDrag);\n document.addEventListener('touchcancel', this.handleEndDrag);\n };\n\n private handleDragging = (event: MouseEvent | TouchEvent): void => {\n if (!this.isDragging || !this.dragStart) return;\n MouseTouchEvent.preventDefault(event);\n event.stopPropagation();\n\n const renderContext = this.createRenderContext();\n const { scale } = renderContext;\n const canvasRect = this.canvas.getBoundingClientRect();\n const { clientX, clientY } = MouseTouchEvent.getEventCoord(event);\n const mouseX = clientX - canvasRect.left;\n const mouseY = clientY - canvasRect.top;\n\n const deltaX = (mouseX - this.dragStart.x) / scale;\n const deltaY = (mouseY - this.dragStart.y) / scale;\n\n this.updateScrollPosition(deltaX, deltaY);\n\n this.dragStart = { x: mouseX, y: mouseY };\n this.render();\n };\n\n private handleEndDrag = (event: MouseEvent | TouchEvent): void => {\n MouseTouchEvent.preventDefault(event);\n event.stopPropagation();\n // click\n document.removeEventListener('mousemove', this.handleDragging);\n document.removeEventListener('mouseup', this.handleEndDrag);\n // touch\n document.removeEventListener('touchmove', this.handleDragging);\n document.removeEventListener('touchend', this.handleEndDrag);\n document.removeEventListener('touchcancel', this.handleEndDrag);\n this.isDragging = false;\n this.dragStart = undefined;\n this.setActivate(this.isMouseInCanvas(event));\n };\n\n private handleCursor = (event: MouseEvent): void => {\n if (!this.activated) return;\n\n const renderContext = this.createRenderContext();\n const { viewRect, scale, offset } = renderContext;\n const canvasRect = this.canvas.getBoundingClientRect();\n const mousePoint: IPoint = {\n x: event.clientX - canvasRect.left,\n y: event.clientY - canvasRect.top,\n };\n\n const viewRectOnCanvas = this.rectOnCanvas({\n rect: viewRect,\n scale,\n offset,\n });\n\n if (this.isPointInRect({ point: mousePoint, rect: viewRectOnCanvas })) {\n // 鼠标在视窗框内\n this.canvas.style.cursor = 'grab';\n } else {\n // 鼠标在视窗框外但在画布内\n this.canvas.style.cursor = 'default';\n }\n };\n\n private isMouseInCanvas(event: MouseEvent | TouchEvent): boolean {\n const canvasRect = this.canvas.getBoundingClientRect();\n const { clientX, clientY } = MouseTouchEvent.getEventCoord(event);\n return (\n clientX >= canvasRect.left &&\n clientX <= canvasRect.right &&\n clientY >= canvasRect.top &&\n clientY <= canvasRect.bottom\n );\n }\n\n private updateScrollPosition(deltaX: number, deltaY: number): void {\n const { scrollX, scrollY, zoom } = this.playgroundConfig.config;\n this.playgroundConfig.updateConfig({\n scrollX: scrollX + deltaX * zoom,\n scrollY: scrollY + deltaY * zoom,\n });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type { IPoint, Rectangle } from '@flowgram.ai/utils';\n\nexport namespace MinimapDraw {\n /** 矩形是否合法 */\n const isRectValid = (rect: Rectangle): boolean => rect.width > 0 && rect.height > 0;\n\n /** 清空画布 */\n export const clear = (params: {\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n }) => {\n const { canvas, context } = params;\n context.clearRect(0, 0, canvas.width, canvas.height);\n };\n\n /** 设置背景色 */\n export const backgroundColor = (params: {\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n color: string;\n }) => {\n const { canvas, context, color } = params;\n context.fillStyle = color;\n context.fillRect(0, 0, canvas.width, canvas.height);\n };\n\n /** 绘制矩形 */\n export const rectangle = (params: {\n context: CanvasRenderingContext2D;\n rect: Rectangle;\n color: string;\n }): void => {\n const { context, rect, color } = params;\n if (!isRectValid(rect)) {\n return;\n }\n context.fillStyle = color;\n context.fillRect(rect.x, rect.y, rect.width, rect.height);\n };\n\n /** 绘制圆角矩形 */\n export const roundRectangle = (params: {\n context: CanvasRenderingContext2D;\n rect: Rectangle;\n color: string;\n radius: number;\n borderColor?: string;\n borderWidth?: number;\n borderDashLength?: number;\n }): void => {\n const { context, rect, color, radius, borderColor, borderDashLength, borderWidth = 0 } = params;\n const { x, y, width, height } = rect;\n\n if (!isRectValid(rect)) {\n return;\n }\n\n // 开始新路径\n context.beginPath();\n\n // 绘制圆角矩形路径\n const drawRoundedRectPath = (): void => {\n context.moveTo(x + radius, y);\n context.lineTo(x + width - radius, y);\n context.quadraticCurveTo(x + width, y, x + width, y + radius);\n context.lineTo(x + width, y + height - radius);\n context.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n context.lineTo(x + radius, y + height);\n context.quadraticCurveTo(x, y + height, x, y + height - radius);\n context.lineTo(x, y + radius);\n context.quadraticCurveTo(x, y, x + radius, y);\n context.closePath();\n };\n\n drawRoundedRectPath();\n\n // 填充矩形\n context.fillStyle = color;\n context.fill();\n\n // 如果设置了边框,绘制边框\n if (borderColor && borderWidth > 0) {\n context.strokeStyle = borderColor;\n context.lineWidth = borderWidth;\n\n // 设置虚线样式\n if (borderDashLength) {\n context.setLineDash([borderDashLength, borderDashLength]);\n } else {\n context.setLineDash([]);\n }\n\n context.stroke();\n\n // 重置虚线样式\n context.setLineDash([]);\n }\n };\n\n /** 绘制矩形外的蒙层 */\n export const overlay = (params: {\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n offset: IPoint;\n scale: number;\n rect: Rectangle;\n color: string;\n }): void => {\n const { canvas, context, offset, scale, rect, color } = params;\n\n if (!isRectValid(rect)) {\n return;\n }\n\n context.fillStyle = color;\n\n // 上方蒙层\n context.fillRect(0, 0, canvas.width, (rect.y + offset.y) * scale);\n\n // 下方蒙层\n context.fillRect(\n 0,\n (rect.y + rect.height + offset.y) * scale,\n canvas.width,\n canvas.height - (rect.y + rect.height + offset.y) * scale\n );\n\n // 左侧蒙层\n context.fillRect(\n 0,\n (rect.y + offset.y) * scale,\n (rect.x + offset.x) * scale,\n rect.height * scale\n );\n\n // 右侧蒙层\n context.fillRect(\n (rect.x + rect.width + offset.x) * scale,\n (rect.y + offset.y) * scale,\n canvas.width - (rect.x + rect.width + offset.x) * scale,\n rect.height * scale\n );\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { Layer } from '@flowgram.ai/core';\nimport { domUtils } from '@flowgram.ai/utils';\n\nimport { MinimapLayerOptions } from './type';\nimport { FlowMinimapService } from './service';\nimport { MinimapRender } from './component';\n\n@injectable()\nexport class FlowMinimapLayer extends Layer<MinimapLayerOptions> {\n public static type = 'FlowMinimapLayer';\n\n @inject(FlowMinimapService) private readonly service: FlowMinimapService;\n\n public readonly node: HTMLElement;\n\n private readonly className = 'gedit-minimap-layer gedit-playground-layer';\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass(this.className);\n this.node.style.zIndex = '9999';\n }\n\n public render(): JSX.Element {\n if (this.options.disableLayer) {\n return <></>;\n }\n return (\n <MinimapRender\n service={this.service}\n panelStyles={this.options.panelStyles}\n containerStyles={this.options.containerStyles}\n inactiveStyle={this.options.inactiveStyle}\n />\n );\n }\n}\n"],"mappings":"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","names":["MinimapDraw","React","inject","injectable","React","inject","injectable"]}
1
+ {"version":3,"sources":["../../src/component.tsx","../../src/service.ts","../../src/draw.ts","../../src/constant.ts","../../src/create-plugin.ts","../../src/layer.tsx"],"sourcesContent":["/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React, { CSSProperties, useEffect, useRef, useState } from 'react';\n\nimport { usePlaygroundContainer } from '@flowgram.ai/core';\n\nimport { MinimapInactiveStyle } from './type';\nimport { FlowMinimapService } from './service';\nimport { MinimapDefaultInactiveStyle } from './constant';\n\ninterface MinimapProps {\n service?: FlowMinimapService;\n panelStyles?: CSSProperties;\n containerStyles?: CSSProperties;\n inactiveStyle?: Partial<MinimapInactiveStyle>;\n}\n\nexport const MinimapRender: React.FC<MinimapProps> = (props) => {\n const { panelStyles = {}, containerStyles = {}, inactiveStyle: customInactiveStyle = {} } = props;\n const inactiveStyle = {\n ...MinimapDefaultInactiveStyle,\n ...customInactiveStyle,\n };\n const playgroundContainer = usePlaygroundContainer();\n const service = props.service || playgroundContainer?.get(FlowMinimapService);\n const panelRef = useRef<HTMLDivElement>(null);\n const [activated, setActivated] = useState<boolean>(false);\n\n useEffect(() => {\n const canvasContainer: HTMLDivElement | null = panelRef.current;\n if (canvasContainer && service.canvas) {\n canvasContainer.appendChild(service.canvas);\n }\n const disposer = service.onActive((activate: boolean) => {\n setActivated(activate);\n });\n service.setVisible(true);\n service.render();\n return () => {\n disposer.dispose();\n service.setVisible(false);\n };\n }, [service]);\n\n // 计算缩放比例和透明度\n const scale: number = activated ? 1 : inactiveStyle.scale;\n const opacity: number = activated ? 1 : inactiveStyle.opacity;\n\n // 计算偏移量\n const translateX: number = activated ? 0 : inactiveStyle.translateX; // 向右偏移的像素\n const translateY: number = activated ? 0 : inactiveStyle.translateY; // 向下偏移的像素\n\n return (\n <div\n className=\"minimap-container\"\n style={{\n position: 'fixed',\n right: 30,\n bottom: 70,\n transition: 'all 0.3s ease', // 添加过渡效果\n transform: `scale(${scale}) translate(${translateX}px, ${translateY}px)`,\n opacity: opacity,\n transformOrigin: 'bottom right', // 设置变换的原点\n ...containerStyles,\n }}\n >\n <div\n className=\"minimap-panel\"\n style={{\n display: 'flex',\n width: '100%',\n height: '100%',\n borderRadius: '10px',\n backgroundColor: 'rgba(255, 255, 255, 1)',\n border: '0.572px solid rgba(6, 7, 9, 0.10)',\n overflow: 'hidden',\n boxShadow:\n '0px 2.289px 6.867px 0px rgba(0, 0, 0, 0.08), 0px 4.578px 13.733px 0px rgba(0, 0, 0, 0.04)',\n boxSizing: 'border-box',\n padding: 8,\n ...panelStyles,\n }}\n data-flow-editor-selectable=\"false\"\n ref={panelRef}\n onMouseEnter={() => {\n service.setActivate(true);\n }}\n onMouseLeave={() => {\n service.setActivate(false);\n }}\n onTouchStartCapture={() => {\n service.setActivate(true);\n }}\n onTouchEndCapture={() => {\n service.setActivate(false);\n }}\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 { throttle } from 'lodash-es';\nimport { inject, injectable } from 'inversify';\nimport { Disposable, DisposableCollection, IPoint, Rectangle } from '@flowgram.ai/utils';\nimport { FlowNodeTransformData } from '@flowgram.ai/document';\nimport { FlowNodeBaseType } from '@flowgram.ai/document';\nimport { FlowDocument } from '@flowgram.ai/document';\nimport { MouseTouchEvent, PlaygroundConfigEntity } from '@flowgram.ai/core';\n\nimport type { MinimapRenderContext, MinimapServiceOptions, MinimapCanvasStyle } from './type';\nimport { MinimapDraw } from './draw';\nimport { MinimapDefaultCanvasStyle, MinimapDefaultOptions } from './constant';\n\n@injectable()\nexport class FlowMinimapService {\n @inject(FlowDocument) private readonly document: FlowDocument;\n\n @inject(PlaygroundConfigEntity)\n private readonly playgroundConfig: PlaygroundConfigEntity;\n\n public readonly canvas: HTMLCanvasElement;\n\n public readonly context2D: CanvasRenderingContext2D;\n\n public activated;\n\n private onActiveCallbacks: Set<(activated: boolean) => void>;\n\n private options: MinimapServiceOptions;\n\n private toDispose: DisposableCollection;\n\n private initialized;\n\n private visible: boolean = false;\n\n private isDragging;\n\n private style: MinimapCanvasStyle;\n\n private dragStart?: IPoint;\n\n constructor() {\n this.canvas = document.createElement('canvas');\n this.context2D = this.canvas.getContext('2d')!;\n this.initialized = !!this.context2D;\n this.onActiveCallbacks = new Set();\n this.toDispose = new DisposableCollection();\n this.render = this._render;\n this.activated = false;\n this.isDragging = false;\n }\n\n public init(options?: Partial<MinimapServiceOptions>) {\n this.options = MinimapDefaultOptions;\n Object.assign(this.options, options);\n this.setThrottle(this.options.inactiveThrottleTime);\n this.initStyle();\n }\n\n public dispose(): void {\n this.toDispose.dispose();\n this.initialized = false;\n this.activated = false;\n this.removeEventListeners();\n }\n\n setVisible(visible: boolean) {\n this.visible = visible;\n }\n\n public setActivate(activate: boolean): void {\n if (activate === this.activated) {\n return;\n }\n if (!activate && this.isDragging) {\n // 拖拽时持续激活\n return;\n }\n this.activated = activate;\n if (activate) {\n this.setThrottle(this.options.activeThrottleTime);\n this.addEventListeners();\n } else {\n this.setThrottle(this.options.inactiveThrottleTime);\n this.removeEventListeners();\n }\n this.render();\n this.onActiveCallbacks.forEach((callback) => callback(activate));\n }\n\n public onActive = (callback: (activated: boolean) => void): Disposable => {\n this.onActiveCallbacks.add(callback);\n return {\n dispose: () => {\n this.onActiveCallbacks.delete(callback);\n },\n };\n };\n\n private initStyle() {\n if (!this.initialized) {\n return;\n }\n const { canvasClassName, canvasStyle } = this.options;\n this.canvas.className = canvasClassName;\n this.style = {\n ...MinimapDefaultCanvasStyle,\n ...canvasStyle,\n };\n this.canvas.width = this.style.canvasWidth;\n this.canvas.height = this.style.canvasHeight;\n this.canvas.style.borderRadius = this.style.canvasBorderRadius\n ? `${this.style.canvasBorderRadius}px`\n : 'unset';\n }\n\n private setThrottle(throttleTime: number) {\n this.render = throttle(this._render, throttleTime);\n }\n\n /**\n * 触发渲染\n */\n public render: () => void = this._render;\n\n private _render(): void {\n if (!this.initialized || !this.visible) {\n return;\n }\n const renderContext = this.createRenderContext();\n this.renderCanvas(renderContext);\n }\n\n private createRenderContext(): MinimapRenderContext {\n const { canvas, context2D } = this;\n const nodeTransforms: FlowNodeTransformData[] = this.transformVisibles;\n const nodeRects: Rectangle[] = nodeTransforms.map((transform) => transform.bounds);\n const viewRect: Rectangle = this.viewRect();\n const renderRect: Rectangle = this.renderRect(nodeRects).withPadding({\n top: this.style.canvasPadding,\n bottom: this.style.canvasPadding,\n left: this.style.canvasPadding,\n right: this.style.canvasPadding,\n });\n const canvasRect: Rectangle = Rectangle.enlarge([viewRect, renderRect]);\n\n const { scale, offset } = this.calculateScaleAndOffset({ canvasRect });\n\n return {\n canvas,\n context2D,\n nodeRects,\n canvasRect,\n viewRect,\n renderRect,\n scale,\n offset,\n };\n }\n\n private renderCanvas(renderContext: MinimapRenderContext) {\n const { canvas, context2D, nodeRects, viewRect, scale, offset } = renderContext;\n\n // 清空画布\n MinimapDraw.clear({ canvas, context: context2D });\n\n // 设置背景色\n MinimapDraw.backgroundColor({\n canvas,\n context: context2D,\n color: this.style.canvasBackground,\n });\n\n // 绘制视窗\n MinimapDraw.roundRectangle({\n context: context2D,\n rect: this.rectOnCanvas({ rect: viewRect, scale, offset }),\n color: this.style.viewportBackground,\n radius: this.style.viewportBorderRadius as number,\n });\n\n // 绘制节点\n nodeRects.forEach((nodeRect: Rectangle) => {\n MinimapDraw.roundRectangle({\n context: context2D,\n rect: this.rectOnCanvas({ rect: nodeRect, scale, offset }),\n color: this.style.nodeColor as string,\n radius: this.style.nodeBorderRadius as number,\n borderWidth: this.style.nodeBorderWidth as number,\n borderColor: this.style.nodeBorderColor as string,\n });\n });\n\n // 绘制视窗边框\n MinimapDraw.roundRectangle({\n context: context2D,\n rect: this.rectOnCanvas({ rect: viewRect, scale, offset }),\n color: 'rgba(255, 255, 255, 0)' as string,\n radius: this.style.viewportBorderRadius as number,\n borderColor: this.style.viewportBorderColor as string,\n borderWidth: this.style.viewportBorderWidth as number,\n borderDashLength: this.style.viewportBorderDashLength as number,\n });\n\n // 绘制视窗外的蒙层\n MinimapDraw.overlay({\n canvas,\n context: context2D,\n offset,\n scale,\n rect: viewRect,\n color: this.style.overlayColor as string,\n });\n }\n\n private calculateScaleAndOffset(params: { canvasRect: Rectangle }): {\n scale: number;\n offset: IPoint;\n } {\n const { canvasRect } = params;\n const { width: canvasWidth, height: canvasHeight } = this.canvas;\n\n // 计算缩放比例\n const scaleX = canvasWidth / canvasRect.width;\n const scaleY = canvasHeight / canvasRect.height;\n const scale = Math.min(scaleX, scaleY);\n\n // 计算缩放后的渲染区域尺寸\n const scaledWidth = canvasRect.width * scale;\n const scaledHeight = canvasRect.height * scale;\n\n // 计算居中偏移量\n const centerOffsetX = (canvasWidth - scaledWidth) / 2;\n const centerOffsetY = (canvasHeight - scaledHeight) / 2;\n\n // 计算最终偏移量\n const offset = {\n x: centerOffsetX / scale - canvasRect.x,\n y: centerOffsetY / scale - canvasRect.y,\n };\n\n return { scale, offset };\n }\n\n private get transformVisibles(): FlowNodeTransformData[] {\n const transformVisible = this.document.getRenderDatas<FlowNodeTransformData>(\n FlowNodeTransformData,\n false\n );\n return transformVisible.filter((transform) => {\n const node = transform.entity;\n // 去除不可见节点\n if (node.hidden) return false;\n // 去除根节点\n if (node.flowNodeType === FlowNodeBaseType.ROOT) return;\n // 去除非一级节点\n if (\n !this.options.enableDisplayAllNodes &&\n node.parent &&\n node.parent.flowNodeType !== FlowNodeBaseType.ROOT\n )\n return;\n return true;\n });\n }\n\n private renderRect(rects: Rectangle[]): Rectangle {\n return Rectangle.enlarge(rects);\n }\n\n private viewRect(): Rectangle {\n const { width, height, scrollX, scrollY, zoom } = this.playgroundConfig.config;\n return new Rectangle(scrollX / zoom, scrollY / zoom, width / zoom, height / zoom);\n }\n\n /** 计算画布坐标系下的矩形 */\n private rectOnCanvas(params: { rect: Rectangle; scale: number; offset: IPoint }): Rectangle {\n const { rect, scale, offset } = params;\n return new Rectangle(\n (rect.x + offset.x) * scale,\n (rect.y + offset.y) * scale,\n rect.width * scale,\n rect.height * scale\n );\n }\n\n private isPointInRect(params: { point: IPoint; rect: Rectangle }): boolean {\n const { point, rect } = params;\n return (\n point.x >= rect.x &&\n point.x <= rect.x + rect.width &&\n point.y >= rect.y &&\n point.y <= rect.y + rect.height\n );\n }\n\n private addEventListeners(): void {\n this.canvas.addEventListener('wheel', this.handleWheel);\n this.canvas.addEventListener('mousedown', this.handleStartDrag);\n this.canvas.addEventListener('touchstart', this.handleStartDrag, { passive: false });\n this.canvas.addEventListener('mousemove', this.handleCursor);\n }\n\n private removeEventListeners(): void {\n this.canvas.removeEventListener('wheel', this.handleWheel);\n this.canvas.removeEventListener('mousedown', this.handleStartDrag);\n this.canvas.removeEventListener('touchstart', this.handleStartDrag);\n this.canvas.removeEventListener('mousemove', this.handleCursor);\n }\n\n private handleWheel = (event: WheelEvent): void => {};\n\n private handleStartDrag = (event: MouseEvent | TouchEvent): void => {\n MouseTouchEvent.preventDefault(event);\n event.stopPropagation();\n const renderContext = this.createRenderContext();\n const { viewRect, scale, offset } = renderContext;\n const canvasRect = this.canvas.getBoundingClientRect();\n const { clientX, clientY } = MouseTouchEvent.getEventCoord(event);\n const mousePoint: IPoint = {\n x: clientX - canvasRect.left,\n y: clientY - canvasRect.top,\n };\n\n const viewRectOnCanvas = this.rectOnCanvas({\n rect: viewRect,\n scale,\n offset,\n });\n if (!this.isPointInRect({ point: mousePoint, rect: viewRectOnCanvas })) {\n return;\n }\n this.isDragging = true;\n this.dragStart = mousePoint;\n // click\n document.addEventListener('mousemove', this.handleDragging);\n document.addEventListener('mouseup', this.handleEndDrag);\n // touch\n document.addEventListener('touchmove', this.handleDragging, { passive: false });\n document.addEventListener('touchend', this.handleEndDrag);\n document.addEventListener('touchcancel', this.handleEndDrag);\n };\n\n private handleDragging = (event: MouseEvent | TouchEvent): void => {\n if (!this.isDragging || !this.dragStart) return;\n MouseTouchEvent.preventDefault(event);\n event.stopPropagation();\n\n const renderContext = this.createRenderContext();\n const { scale } = renderContext;\n const canvasRect = this.canvas.getBoundingClientRect();\n const { clientX, clientY } = MouseTouchEvent.getEventCoord(event);\n const mouseX = clientX - canvasRect.left;\n const mouseY = clientY - canvasRect.top;\n\n const deltaX = (mouseX - this.dragStart.x) / scale;\n const deltaY = (mouseY - this.dragStart.y) / scale;\n\n this.updateScrollPosition(deltaX, deltaY);\n\n this.dragStart = { x: mouseX, y: mouseY };\n this.render();\n };\n\n private handleEndDrag = (event: MouseEvent | TouchEvent): void => {\n MouseTouchEvent.preventDefault(event);\n event.stopPropagation();\n // click\n document.removeEventListener('mousemove', this.handleDragging);\n document.removeEventListener('mouseup', this.handleEndDrag);\n // touch\n document.removeEventListener('touchmove', this.handleDragging);\n document.removeEventListener('touchend', this.handleEndDrag);\n document.removeEventListener('touchcancel', this.handleEndDrag);\n this.isDragging = false;\n this.dragStart = undefined;\n this.setActivate(this.isMouseInCanvas(event));\n };\n\n private handleCursor = (event: MouseEvent): void => {\n if (!this.activated) return;\n\n const renderContext = this.createRenderContext();\n const { viewRect, scale, offset } = renderContext;\n const canvasRect = this.canvas.getBoundingClientRect();\n const mousePoint: IPoint = {\n x: event.clientX - canvasRect.left,\n y: event.clientY - canvasRect.top,\n };\n\n const viewRectOnCanvas = this.rectOnCanvas({\n rect: viewRect,\n scale,\n offset,\n });\n\n if (this.isPointInRect({ point: mousePoint, rect: viewRectOnCanvas })) {\n // 鼠标在视窗框内\n this.canvas.style.cursor = 'grab';\n } else {\n // 鼠标在视窗框外但在画布内\n this.canvas.style.cursor = 'default';\n }\n };\n\n private isMouseInCanvas(event: MouseEvent | TouchEvent): boolean {\n const canvasRect = this.canvas.getBoundingClientRect();\n const { clientX, clientY } = MouseTouchEvent.getEventCoord(event);\n return (\n clientX >= canvasRect.left &&\n clientX <= canvasRect.right &&\n clientY >= canvasRect.top &&\n clientY <= canvasRect.bottom\n );\n }\n\n private updateScrollPosition(deltaX: number, deltaY: number): void {\n const { scrollX, scrollY, zoom } = this.playgroundConfig.config;\n this.playgroundConfig.updateConfig({\n scrollX: scrollX + deltaX * zoom,\n scrollY: scrollY + deltaY * zoom,\n });\n }\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type { IPoint, Rectangle } from '@flowgram.ai/utils';\n\nexport namespace MinimapDraw {\n /** 矩形是否合法 */\n const isRectValid = (rect: Rectangle): boolean => rect.width > 0 && rect.height > 0;\n\n /** 清空画布 */\n export const clear = (params: {\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n }) => {\n const { canvas, context } = params;\n context.clearRect(0, 0, canvas.width, canvas.height);\n };\n\n /** 设置背景色 */\n export const backgroundColor = (params: {\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n color: string;\n }) => {\n const { canvas, context, color } = params;\n context.fillStyle = color;\n context.fillRect(0, 0, canvas.width, canvas.height);\n };\n\n /** 绘制矩形 */\n export const rectangle = (params: {\n context: CanvasRenderingContext2D;\n rect: Rectangle;\n color: string;\n }): void => {\n const { context, rect, color } = params;\n if (!isRectValid(rect)) {\n return;\n }\n context.fillStyle = color;\n context.fillRect(rect.x, rect.y, rect.width, rect.height);\n };\n\n /** 绘制圆角矩形 */\n export const roundRectangle = (params: {\n context: CanvasRenderingContext2D;\n rect: Rectangle;\n color: string;\n radius: number;\n borderColor?: string;\n borderWidth?: number;\n borderDashLength?: number;\n }): void => {\n const { context, rect, color, radius, borderColor, borderDashLength, borderWidth = 0 } = params;\n const { x, y, width, height } = rect;\n\n if (!isRectValid(rect)) {\n return;\n }\n\n // 开始新路径\n context.beginPath();\n\n // 绘制圆角矩形路径\n const drawRoundedRectPath = (): void => {\n context.moveTo(x + radius, y);\n context.lineTo(x + width - radius, y);\n context.quadraticCurveTo(x + width, y, x + width, y + radius);\n context.lineTo(x + width, y + height - radius);\n context.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n context.lineTo(x + radius, y + height);\n context.quadraticCurveTo(x, y + height, x, y + height - radius);\n context.lineTo(x, y + radius);\n context.quadraticCurveTo(x, y, x + radius, y);\n context.closePath();\n };\n\n drawRoundedRectPath();\n\n // 填充矩形\n context.fillStyle = color;\n context.fill();\n\n // 如果设置了边框,绘制边框\n if (borderColor && borderWidth > 0) {\n context.strokeStyle = borderColor;\n context.lineWidth = borderWidth;\n\n // 设置虚线样式\n if (borderDashLength) {\n context.setLineDash([borderDashLength, borderDashLength]);\n } else {\n context.setLineDash([]);\n }\n\n context.stroke();\n\n // 重置虚线样式\n context.setLineDash([]);\n }\n };\n\n /** 绘制矩形外的蒙层 */\n export const overlay = (params: {\n canvas: HTMLCanvasElement;\n context: CanvasRenderingContext2D;\n offset: IPoint;\n scale: number;\n rect: Rectangle;\n color: string;\n }): void => {\n const { canvas, context, offset, scale, rect, color } = params;\n\n if (!isRectValid(rect)) {\n return;\n }\n\n context.fillStyle = color;\n\n // 上方蒙层\n context.fillRect(0, 0, canvas.width, (rect.y + offset.y) * scale);\n\n // 下方蒙层\n context.fillRect(\n 0,\n (rect.y + rect.height + offset.y) * scale,\n canvas.width,\n canvas.height - (rect.y + rect.height + offset.y) * scale\n );\n\n // 左侧蒙层\n context.fillRect(\n 0,\n (rect.y + offset.y) * scale,\n (rect.x + offset.x) * scale,\n rect.height * scale\n );\n\n // 右侧蒙层\n context.fillRect(\n (rect.x + rect.width + offset.x) * scale,\n (rect.y + offset.y) * scale,\n canvas.width - (rect.x + rect.width + offset.x) * scale,\n rect.height * scale\n );\n };\n}\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type { MinimapCanvasStyle, MinimapInactiveStyle, MinimapServiceOptions } from './type';\n\nexport const MinimapDefaultCanvasStyle: MinimapCanvasStyle = {\n canvasWidth: 250,\n canvasHeight: 250,\n canvasPadding: 50,\n canvasBackground: 'rgba(242, 243, 245, 1)',\n canvasBorderRadius: 10,\n viewportBackground: 'rgba(255, 255, 255, 1)',\n viewportBorderRadius: 4,\n viewportBorderColor: 'rgba(6, 7, 9, 0.10)',\n viewportBorderWidth: 1,\n viewportBorderDashLength: undefined,\n nodeColor: 'rgba(0, 0, 0, 0.10)',\n nodeBorderRadius: 2,\n nodeBorderWidth: 0.145,\n nodeBorderColor: 'rgba(6, 7, 9, 0.10)',\n overlayColor: 'rgba(255, 255, 255, 0.55)',\n};\n\nexport const MinimapDefaultInactiveStyle: MinimapInactiveStyle = {\n scale: 0.7,\n opacity: 1,\n translateX: 15,\n translateY: 15,\n};\n\nexport const MinimapDefaultOptions: MinimapServiceOptions = {\n canvasStyle: MinimapDefaultCanvasStyle,\n canvasClassName: 'gedit-minimap-canvas',\n enableDisplayAllNodes: false,\n activeThrottleTime: 0,\n inactiveThrottleTime: 24,\n};\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport { definePluginCreator, PluginContext } from '@flowgram.ai/core';\n\nimport { CreateMinimapPluginOptions } from './type';\nimport { FlowMinimapService } from './service';\nimport { FlowMinimapLayer } from './layer';\n\nexport const createMinimapPlugin = definePluginCreator<CreateMinimapPluginOptions>({\n onBind: ({ bind }) => {\n bind(FlowMinimapService).toSelf().inSingletonScope();\n },\n onInit: (ctx: PluginContext, opts: CreateMinimapPluginOptions) => {\n ctx.playground.registerLayer(FlowMinimapLayer, opts);\n ctx.get(FlowMinimapService).init(opts);\n },\n onDispose: (ctx: PluginContext) => {\n ctx.get(FlowMinimapService).dispose();\n },\n});\n","/**\n * Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport React from 'react';\n\nimport { inject, injectable } from 'inversify';\nimport { domUtils } from '@flowgram.ai/utils';\nimport {\n FlowNodeEntity,\n FlowNodeTransformData,\n FlowDocumentTransformerEntity,\n} from '@flowgram.ai/document';\nimport {\n Layer,\n observeEntityDatas,\n observeEntity,\n PlaygroundConfigEntity,\n} from '@flowgram.ai/core';\n\nimport { MinimapLayerOptions } from './type';\nimport { FlowMinimapService } from './service';\nimport { MinimapRender } from './component';\n\n@injectable()\nexport class FlowMinimapLayer extends Layer<MinimapLayerOptions> {\n public static type = 'FlowMinimapLayer';\n\n @inject(FlowMinimapService) private readonly service: FlowMinimapService;\n\n @observeEntityDatas(FlowNodeEntity, FlowNodeTransformData)\n transformDatas: FlowNodeTransformData[];\n\n @observeEntity(PlaygroundConfigEntity) configEntity: PlaygroundConfigEntity;\n\n @observeEntity(FlowDocumentTransformerEntity)\n readonly documentTransformer: FlowDocumentTransformerEntity;\n\n public readonly node: HTMLElement;\n\n private readonly className = 'gedit-minimap-layer gedit-playground-layer';\n\n constructor() {\n super();\n this.node = domUtils.createDivWithClass(this.className);\n this.node.style.zIndex = '9999';\n }\n\n public render(): JSX.Element {\n if (this.documentTransformer.loading) return <></>;\n this.documentTransformer.refresh();\n this.service.render();\n if (this.options.disableLayer) {\n return <></>;\n }\n return (\n <MinimapRender\n service={this.service}\n panelStyles={this.options.panelStyles}\n containerStyles={this.options.containerStyles}\n inactiveStyle={this.options.inactiveStyle}\n />\n );\n }\n}\n"],"mappings":"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","names":["MinimapDraw","React","inject","injectable","FlowNodeTransformData","PlaygroundConfigEntity","React","inject","FlowNodeTransformData","PlaygroundConfigEntity","injectable"]}