@flowgram.ai/background-plugin 0.1.0-alpha.2
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 +144 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/index.d.mts +56 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.js +169 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
4
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
5
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
6
|
+
if (decorator = decorators[i])
|
|
7
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
8
|
+
if (kind && result) __defProp(target, key, result);
|
|
9
|
+
return result;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// src/background-layer.tsx
|
|
13
|
+
import { Layer, observeEntity, PlaygroundConfigEntity, SCALE_WIDTH } from "@flowgram.ai/core";
|
|
14
|
+
import { domUtils } from "@flowgram.ai/utils";
|
|
15
|
+
var PATTERN_PREFIX = "gedit-background-pattern-";
|
|
16
|
+
var RENDER_SIZE = 20;
|
|
17
|
+
var DOT_SIZE = 1;
|
|
18
|
+
var id = 0;
|
|
19
|
+
var BackgroundLayer = class extends Layer {
|
|
20
|
+
constructor() {
|
|
21
|
+
super(...arguments);
|
|
22
|
+
this._patternId = `${PATTERN_PREFIX}${id++}`;
|
|
23
|
+
this.node = domUtils.createDivWithClass("gedit-flow-background-layer");
|
|
24
|
+
this.grid = document.createElement("div");
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 当前缩放比
|
|
28
|
+
*/
|
|
29
|
+
get zoom() {
|
|
30
|
+
return this.config.finalScale;
|
|
31
|
+
}
|
|
32
|
+
onReady() {
|
|
33
|
+
const { firstChild } = this.pipelineNode;
|
|
34
|
+
this.pipelineNode.insertBefore(this.node, firstChild);
|
|
35
|
+
this.playgroundConfigEntity.updateConfig({
|
|
36
|
+
minZoom: 0.1,
|
|
37
|
+
maxZoom: 2
|
|
38
|
+
});
|
|
39
|
+
this.grid.style.zIndex = "-1";
|
|
40
|
+
this.grid.style.position = "relative";
|
|
41
|
+
this.node.appendChild(this.grid);
|
|
42
|
+
this.grid.className = "gedit-grid-svg";
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 最小单元格大小
|
|
46
|
+
*/
|
|
47
|
+
getScaleUnit() {
|
|
48
|
+
const { zoom } = this;
|
|
49
|
+
return {
|
|
50
|
+
realSize: RENDER_SIZE,
|
|
51
|
+
// 一个单元格代表的真实大小
|
|
52
|
+
renderSize: Math.round(RENDER_SIZE * zoom * 100) / 100,
|
|
53
|
+
// 一个单元格渲染的大小值
|
|
54
|
+
zoom
|
|
55
|
+
// 缩放比
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 绘制
|
|
60
|
+
*/
|
|
61
|
+
autorun() {
|
|
62
|
+
const playgroundConfig = this.playgroundConfigEntity.config;
|
|
63
|
+
const scaleUnit = this.getScaleUnit();
|
|
64
|
+
const mod = scaleUnit.renderSize * 10;
|
|
65
|
+
const viewBoxWidth = playgroundConfig.width + mod * 2;
|
|
66
|
+
const viewBoxHeight = playgroundConfig.height + mod * 2;
|
|
67
|
+
const { scrollX } = playgroundConfig;
|
|
68
|
+
const { scrollY } = playgroundConfig;
|
|
69
|
+
const scrollXDelta = this.getScrollDelta(scrollX, mod);
|
|
70
|
+
const scrollYDelta = this.getScrollDelta(scrollY, mod);
|
|
71
|
+
domUtils.setStyle(this.node, {
|
|
72
|
+
left: scrollX - SCALE_WIDTH,
|
|
73
|
+
top: scrollY - SCALE_WIDTH
|
|
74
|
+
});
|
|
75
|
+
this.drawGrid(scaleUnit);
|
|
76
|
+
this.setSVGStyle(this.grid, {
|
|
77
|
+
width: viewBoxWidth,
|
|
78
|
+
height: viewBoxHeight,
|
|
79
|
+
left: SCALE_WIDTH - scrollXDelta - mod,
|
|
80
|
+
top: SCALE_WIDTH - scrollYDelta - mod
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 绘制网格
|
|
85
|
+
*/
|
|
86
|
+
drawGrid(unit) {
|
|
87
|
+
const minor = unit.renderSize;
|
|
88
|
+
if (!this.grid) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const patternSize = DOT_SIZE * this.zoom;
|
|
92
|
+
const newContent = `
|
|
93
|
+
<svg width="100%" height="100%">
|
|
94
|
+
<pattern id="${this._patternId}" width="${minor}" height="${minor}" patternUnits="userSpaceOnUse">
|
|
95
|
+
<circle
|
|
96
|
+
cx="${patternSize}"
|
|
97
|
+
cy="${patternSize}"
|
|
98
|
+
r="${patternSize}"
|
|
99
|
+
stroke="#eceeef"
|
|
100
|
+
fill-opacity="0.5"
|
|
101
|
+
/>
|
|
102
|
+
</pattern>
|
|
103
|
+
<rect width="100%" height="100%" fill="url(#${this._patternId})"/>
|
|
104
|
+
</svg>`;
|
|
105
|
+
this.grid.innerHTML = newContent;
|
|
106
|
+
}
|
|
107
|
+
setSVGStyle(svgElement, style) {
|
|
108
|
+
if (!svgElement) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
svgElement.style.width = `${style.width}px`;
|
|
112
|
+
svgElement.style.height = `${style.height}px`;
|
|
113
|
+
svgElement.style.left = `${style.left}px`;
|
|
114
|
+
svgElement.style.top = `${style.top}px`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 获取相对滚动距离
|
|
118
|
+
* @param realScroll
|
|
119
|
+
* @param mod
|
|
120
|
+
*/
|
|
121
|
+
getScrollDelta(realScroll, mod) {
|
|
122
|
+
if (realScroll >= 0) {
|
|
123
|
+
return realScroll % mod;
|
|
124
|
+
}
|
|
125
|
+
return mod - Math.abs(realScroll) % mod;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
BackgroundLayer.type = "WorkflowBackgroundLayer";
|
|
129
|
+
__decorateClass([
|
|
130
|
+
observeEntity(PlaygroundConfigEntity)
|
|
131
|
+
], BackgroundLayer.prototype, "playgroundConfigEntity", 2);
|
|
132
|
+
|
|
133
|
+
// src/create-background-plugin.ts
|
|
134
|
+
import { definePluginCreator } from "@flowgram.ai/core";
|
|
135
|
+
var createBackgroundPlugin = definePluginCreator({
|
|
136
|
+
onInit: (ctx, opts) => {
|
|
137
|
+
ctx.playground.registerLayer(BackgroundLayer, opts);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
export {
|
|
141
|
+
BackgroundLayer,
|
|
142
|
+
createBackgroundPlugin
|
|
143
|
+
};
|
|
144
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/background-layer.tsx","../../src/create-background-plugin.ts"],"sourcesContent":["import { Layer, observeEntity, PlaygroundConfigEntity, SCALE_WIDTH } from '@flowgram.ai/core';\nimport { domUtils } from '@flowgram.ai/utils';\n\ninterface BackgroundScaleUnit {\n realSize: number;\n renderSize: number;\n zoom: number;\n}\n\nconst PATTERN_PREFIX = 'gedit-background-pattern-';\nconst RENDER_SIZE = 20;\nconst DOT_SIZE = 1;\nlet id = 0;\nexport interface BackgroundLayerOptions {\n // 预留配置项目\n}\n/**\n * dot 网格背景\n */\nexport class BackgroundLayer extends Layer<BackgroundLayerOptions> {\n static type = 'WorkflowBackgroundLayer';\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n private _patternId = `${PATTERN_PREFIX}${id++}`;\n\n node = domUtils.createDivWithClass('gedit-flow-background-layer');\n\n grid: HTMLElement = document.createElement('div');\n\n /**\n * 当前缩放比\n */\n get zoom(): number {\n return this.config.finalScale;\n }\n\n onReady() {\n const { firstChild } = this.pipelineNode;\n // 背景插入到最下边\n this.pipelineNode.insertBefore(this.node, firstChild);\n // 初始化设置最大 200% 最小 10% 缩放\n this.playgroundConfigEntity.updateConfig({\n minZoom: 0.1,\n maxZoom: 2,\n });\n // 确保点的位置在线条的下方\n this.grid.style.zIndex = '-1';\n this.grid.style.position = 'relative';\n this.node.appendChild(this.grid);\n this.grid.className = 'gedit-grid-svg';\n }\n\n /**\n * 最小单元格大小\n */\n getScaleUnit(): BackgroundScaleUnit {\n const { zoom } = this;\n\n return {\n realSize: RENDER_SIZE, // 一个单元格代表的真实大小\n renderSize: Math.round(RENDER_SIZE * zoom * 100) / 100, // 一个单元格渲染的大小值\n zoom, // 缩放比\n };\n }\n\n /**\n * 绘制\n */\n autorun(): void {\n const playgroundConfig = this.playgroundConfigEntity.config;\n const scaleUnit = this.getScaleUnit();\n const mod = scaleUnit.renderSize * 10;\n const viewBoxWidth = playgroundConfig.width + mod * 2;\n const viewBoxHeight = playgroundConfig.height + mod * 2;\n const { scrollX } = playgroundConfig;\n const { scrollY } = playgroundConfig;\n const scrollXDelta = this.getScrollDelta(scrollX, mod);\n const scrollYDelta = this.getScrollDelta(scrollY, mod);\n domUtils.setStyle(this.node, {\n left: scrollX - SCALE_WIDTH,\n top: scrollY - SCALE_WIDTH,\n });\n this.drawGrid(scaleUnit);\n // 设置网格\n this.setSVGStyle(this.grid, {\n width: viewBoxWidth,\n height: viewBoxHeight,\n left: SCALE_WIDTH - scrollXDelta - mod,\n top: SCALE_WIDTH - scrollYDelta - mod,\n });\n }\n\n /**\n * 绘制网格\n */\n protected drawGrid(unit: BackgroundScaleUnit): void {\n const minor = unit.renderSize;\n if (!this.grid) {\n return;\n }\n const patternSize = DOT_SIZE * this.zoom;\n const newContent = `\n <svg width=\"100%\" height=\"100%\">\n <pattern id=\"${this._patternId}\" width=\"${minor}\" height=\"${minor}\" patternUnits=\"userSpaceOnUse\">\n <circle\n cx=\"${patternSize}\"\n cy=\"${patternSize}\"\n r=\"${patternSize}\"\n stroke=\"#eceeef\"\n fill-opacity=\"0.5\"\n />\n </pattern>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#${this._patternId})\"/>\n </svg>`;\n this.grid.innerHTML = newContent;\n }\n\n protected setSVGStyle(\n svgElement: HTMLElement | undefined,\n style: { width: number; height: number; left: number; top: number },\n ): void {\n if (!svgElement) {\n return;\n }\n\n svgElement.style.width = `${style.width}px`;\n svgElement.style.height = `${style.height}px`;\n svgElement.style.left = `${style.left}px`;\n svgElement.style.top = `${style.top}px`;\n }\n\n /**\n * 获取相对滚动距离\n * @param realScroll\n * @param mod\n */\n protected getScrollDelta(realScroll: number, mod: number): number {\n // 正向滚动不用补差\n if (realScroll >= 0) {\n return realScroll % mod;\n }\n return mod - (Math.abs(realScroll) % mod);\n }\n}\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { BackgroundLayer, BackgroundLayerOptions } from './background-layer';\n\n/**\n * 点位背景插件\n */\nexport const createBackgroundPlugin = definePluginCreator<BackgroundLayerOptions>({\n onInit: (ctx, opts) => {\n ctx.playground.registerLayer(BackgroundLayer, opts);\n },\n});\n"],"mappings":"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","names":[]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as _flowgram_ai_core from '@flowgram.ai/core';
|
|
2
|
+
import { Layer, PlaygroundConfigEntity } from '@flowgram.ai/core';
|
|
3
|
+
|
|
4
|
+
interface BackgroundScaleUnit {
|
|
5
|
+
realSize: number;
|
|
6
|
+
renderSize: number;
|
|
7
|
+
zoom: number;
|
|
8
|
+
}
|
|
9
|
+
interface BackgroundLayerOptions {
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* dot 网格背景
|
|
13
|
+
*/
|
|
14
|
+
declare class BackgroundLayer extends Layer<BackgroundLayerOptions> {
|
|
15
|
+
static type: string;
|
|
16
|
+
protected playgroundConfigEntity: PlaygroundConfigEntity;
|
|
17
|
+
private _patternId;
|
|
18
|
+
node: HTMLDivElement;
|
|
19
|
+
grid: HTMLElement;
|
|
20
|
+
/**
|
|
21
|
+
* 当前缩放比
|
|
22
|
+
*/
|
|
23
|
+
get zoom(): number;
|
|
24
|
+
onReady(): void;
|
|
25
|
+
/**
|
|
26
|
+
* 最小单元格大小
|
|
27
|
+
*/
|
|
28
|
+
getScaleUnit(): BackgroundScaleUnit;
|
|
29
|
+
/**
|
|
30
|
+
* 绘制
|
|
31
|
+
*/
|
|
32
|
+
autorun(): void;
|
|
33
|
+
/**
|
|
34
|
+
* 绘制网格
|
|
35
|
+
*/
|
|
36
|
+
protected drawGrid(unit: BackgroundScaleUnit): void;
|
|
37
|
+
protected setSVGStyle(svgElement: HTMLElement | undefined, style: {
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
left: number;
|
|
41
|
+
top: number;
|
|
42
|
+
}): void;
|
|
43
|
+
/**
|
|
44
|
+
* 获取相对滚动距离
|
|
45
|
+
* @param realScroll
|
|
46
|
+
* @param mod
|
|
47
|
+
*/
|
|
48
|
+
protected getScrollDelta(realScroll: number, mod: number): number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 点位背景插件
|
|
53
|
+
*/
|
|
54
|
+
declare const createBackgroundPlugin: _flowgram_ai_core.PluginCreator<BackgroundLayerOptions>;
|
|
55
|
+
|
|
56
|
+
export { BackgroundLayer, type BackgroundLayerOptions, createBackgroundPlugin };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as _flowgram_ai_core from '@flowgram.ai/core';
|
|
2
|
+
import { Layer, PlaygroundConfigEntity } from '@flowgram.ai/core';
|
|
3
|
+
|
|
4
|
+
interface BackgroundScaleUnit {
|
|
5
|
+
realSize: number;
|
|
6
|
+
renderSize: number;
|
|
7
|
+
zoom: number;
|
|
8
|
+
}
|
|
9
|
+
interface BackgroundLayerOptions {
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* dot 网格背景
|
|
13
|
+
*/
|
|
14
|
+
declare class BackgroundLayer extends Layer<BackgroundLayerOptions> {
|
|
15
|
+
static type: string;
|
|
16
|
+
protected playgroundConfigEntity: PlaygroundConfigEntity;
|
|
17
|
+
private _patternId;
|
|
18
|
+
node: HTMLDivElement;
|
|
19
|
+
grid: HTMLElement;
|
|
20
|
+
/**
|
|
21
|
+
* 当前缩放比
|
|
22
|
+
*/
|
|
23
|
+
get zoom(): number;
|
|
24
|
+
onReady(): void;
|
|
25
|
+
/**
|
|
26
|
+
* 最小单元格大小
|
|
27
|
+
*/
|
|
28
|
+
getScaleUnit(): BackgroundScaleUnit;
|
|
29
|
+
/**
|
|
30
|
+
* 绘制
|
|
31
|
+
*/
|
|
32
|
+
autorun(): void;
|
|
33
|
+
/**
|
|
34
|
+
* 绘制网格
|
|
35
|
+
*/
|
|
36
|
+
protected drawGrid(unit: BackgroundScaleUnit): void;
|
|
37
|
+
protected setSVGStyle(svgElement: HTMLElement | undefined, style: {
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
left: number;
|
|
41
|
+
top: number;
|
|
42
|
+
}): void;
|
|
43
|
+
/**
|
|
44
|
+
* 获取相对滚动距离
|
|
45
|
+
* @param realScroll
|
|
46
|
+
* @param mod
|
|
47
|
+
*/
|
|
48
|
+
protected getScrollDelta(realScroll: number, mod: number): number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 点位背景插件
|
|
53
|
+
*/
|
|
54
|
+
declare const createBackgroundPlugin: _flowgram_ai_core.PluginCreator<BackgroundLayerOptions>;
|
|
55
|
+
|
|
56
|
+
export { BackgroundLayer, type BackgroundLayerOptions, createBackgroundPlugin };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
20
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
21
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
22
|
+
if (decorator = decorators[i])
|
|
23
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
24
|
+
if (kind && result) __defProp(target, key, result);
|
|
25
|
+
return result;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// src/index.ts
|
|
29
|
+
var src_exports = {};
|
|
30
|
+
__export(src_exports, {
|
|
31
|
+
BackgroundLayer: () => BackgroundLayer,
|
|
32
|
+
createBackgroundPlugin: () => createBackgroundPlugin
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(src_exports);
|
|
35
|
+
|
|
36
|
+
// src/background-layer.tsx
|
|
37
|
+
var import_core = require("@flowgram.ai/core");
|
|
38
|
+
var import_utils = require("@flowgram.ai/utils");
|
|
39
|
+
var PATTERN_PREFIX = "gedit-background-pattern-";
|
|
40
|
+
var RENDER_SIZE = 20;
|
|
41
|
+
var DOT_SIZE = 1;
|
|
42
|
+
var id = 0;
|
|
43
|
+
var BackgroundLayer = class extends import_core.Layer {
|
|
44
|
+
constructor() {
|
|
45
|
+
super(...arguments);
|
|
46
|
+
this._patternId = `${PATTERN_PREFIX}${id++}`;
|
|
47
|
+
this.node = import_utils.domUtils.createDivWithClass("gedit-flow-background-layer");
|
|
48
|
+
this.grid = document.createElement("div");
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 当前缩放比
|
|
52
|
+
*/
|
|
53
|
+
get zoom() {
|
|
54
|
+
return this.config.finalScale;
|
|
55
|
+
}
|
|
56
|
+
onReady() {
|
|
57
|
+
const { firstChild } = this.pipelineNode;
|
|
58
|
+
this.pipelineNode.insertBefore(this.node, firstChild);
|
|
59
|
+
this.playgroundConfigEntity.updateConfig({
|
|
60
|
+
minZoom: 0.1,
|
|
61
|
+
maxZoom: 2
|
|
62
|
+
});
|
|
63
|
+
this.grid.style.zIndex = "-1";
|
|
64
|
+
this.grid.style.position = "relative";
|
|
65
|
+
this.node.appendChild(this.grid);
|
|
66
|
+
this.grid.className = "gedit-grid-svg";
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 最小单元格大小
|
|
70
|
+
*/
|
|
71
|
+
getScaleUnit() {
|
|
72
|
+
const { zoom } = this;
|
|
73
|
+
return {
|
|
74
|
+
realSize: RENDER_SIZE,
|
|
75
|
+
// 一个单元格代表的真实大小
|
|
76
|
+
renderSize: Math.round(RENDER_SIZE * zoom * 100) / 100,
|
|
77
|
+
// 一个单元格渲染的大小值
|
|
78
|
+
zoom
|
|
79
|
+
// 缩放比
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 绘制
|
|
84
|
+
*/
|
|
85
|
+
autorun() {
|
|
86
|
+
const playgroundConfig = this.playgroundConfigEntity.config;
|
|
87
|
+
const scaleUnit = this.getScaleUnit();
|
|
88
|
+
const mod = scaleUnit.renderSize * 10;
|
|
89
|
+
const viewBoxWidth = playgroundConfig.width + mod * 2;
|
|
90
|
+
const viewBoxHeight = playgroundConfig.height + mod * 2;
|
|
91
|
+
const { scrollX } = playgroundConfig;
|
|
92
|
+
const { scrollY } = playgroundConfig;
|
|
93
|
+
const scrollXDelta = this.getScrollDelta(scrollX, mod);
|
|
94
|
+
const scrollYDelta = this.getScrollDelta(scrollY, mod);
|
|
95
|
+
import_utils.domUtils.setStyle(this.node, {
|
|
96
|
+
left: scrollX - import_core.SCALE_WIDTH,
|
|
97
|
+
top: scrollY - import_core.SCALE_WIDTH
|
|
98
|
+
});
|
|
99
|
+
this.drawGrid(scaleUnit);
|
|
100
|
+
this.setSVGStyle(this.grid, {
|
|
101
|
+
width: viewBoxWidth,
|
|
102
|
+
height: viewBoxHeight,
|
|
103
|
+
left: import_core.SCALE_WIDTH - scrollXDelta - mod,
|
|
104
|
+
top: import_core.SCALE_WIDTH - scrollYDelta - mod
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 绘制网格
|
|
109
|
+
*/
|
|
110
|
+
drawGrid(unit) {
|
|
111
|
+
const minor = unit.renderSize;
|
|
112
|
+
if (!this.grid) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const patternSize = DOT_SIZE * this.zoom;
|
|
116
|
+
const newContent = `
|
|
117
|
+
<svg width="100%" height="100%">
|
|
118
|
+
<pattern id="${this._patternId}" width="${minor}" height="${minor}" patternUnits="userSpaceOnUse">
|
|
119
|
+
<circle
|
|
120
|
+
cx="${patternSize}"
|
|
121
|
+
cy="${patternSize}"
|
|
122
|
+
r="${patternSize}"
|
|
123
|
+
stroke="#eceeef"
|
|
124
|
+
fill-opacity="0.5"
|
|
125
|
+
/>
|
|
126
|
+
</pattern>
|
|
127
|
+
<rect width="100%" height="100%" fill="url(#${this._patternId})"/>
|
|
128
|
+
</svg>`;
|
|
129
|
+
this.grid.innerHTML = newContent;
|
|
130
|
+
}
|
|
131
|
+
setSVGStyle(svgElement, style) {
|
|
132
|
+
if (!svgElement) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
svgElement.style.width = `${style.width}px`;
|
|
136
|
+
svgElement.style.height = `${style.height}px`;
|
|
137
|
+
svgElement.style.left = `${style.left}px`;
|
|
138
|
+
svgElement.style.top = `${style.top}px`;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 获取相对滚动距离
|
|
142
|
+
* @param realScroll
|
|
143
|
+
* @param mod
|
|
144
|
+
*/
|
|
145
|
+
getScrollDelta(realScroll, mod) {
|
|
146
|
+
if (realScroll >= 0) {
|
|
147
|
+
return realScroll % mod;
|
|
148
|
+
}
|
|
149
|
+
return mod - Math.abs(realScroll) % mod;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
BackgroundLayer.type = "WorkflowBackgroundLayer";
|
|
153
|
+
__decorateClass([
|
|
154
|
+
(0, import_core.observeEntity)(import_core.PlaygroundConfigEntity)
|
|
155
|
+
], BackgroundLayer.prototype, "playgroundConfigEntity", 2);
|
|
156
|
+
|
|
157
|
+
// src/create-background-plugin.ts
|
|
158
|
+
var import_core2 = require("@flowgram.ai/core");
|
|
159
|
+
var createBackgroundPlugin = (0, import_core2.definePluginCreator)({
|
|
160
|
+
onInit: (ctx, opts) => {
|
|
161
|
+
ctx.playground.registerLayer(BackgroundLayer, opts);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
165
|
+
0 && (module.exports = {
|
|
166
|
+
BackgroundLayer,
|
|
167
|
+
createBackgroundPlugin
|
|
168
|
+
});
|
|
169
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/background-layer.tsx","../src/create-background-plugin.ts"],"sourcesContent":["export * from './background-layer';\nexport * from './create-background-plugin';\n","import { Layer, observeEntity, PlaygroundConfigEntity, SCALE_WIDTH } from '@flowgram.ai/core';\nimport { domUtils } from '@flowgram.ai/utils';\n\ninterface BackgroundScaleUnit {\n realSize: number;\n renderSize: number;\n zoom: number;\n}\n\nconst PATTERN_PREFIX = 'gedit-background-pattern-';\nconst RENDER_SIZE = 20;\nconst DOT_SIZE = 1;\nlet id = 0;\nexport interface BackgroundLayerOptions {\n // 预留配置项目\n}\n/**\n * dot 网格背景\n */\nexport class BackgroundLayer extends Layer<BackgroundLayerOptions> {\n static type = 'WorkflowBackgroundLayer';\n\n @observeEntity(PlaygroundConfigEntity)\n protected playgroundConfigEntity: PlaygroundConfigEntity;\n\n private _patternId = `${PATTERN_PREFIX}${id++}`;\n\n node = domUtils.createDivWithClass('gedit-flow-background-layer');\n\n grid: HTMLElement = document.createElement('div');\n\n /**\n * 当前缩放比\n */\n get zoom(): number {\n return this.config.finalScale;\n }\n\n onReady() {\n const { firstChild } = this.pipelineNode;\n // 背景插入到最下边\n this.pipelineNode.insertBefore(this.node, firstChild);\n // 初始化设置最大 200% 最小 10% 缩放\n this.playgroundConfigEntity.updateConfig({\n minZoom: 0.1,\n maxZoom: 2,\n });\n // 确保点的位置在线条的下方\n this.grid.style.zIndex = '-1';\n this.grid.style.position = 'relative';\n this.node.appendChild(this.grid);\n this.grid.className = 'gedit-grid-svg';\n }\n\n /**\n * 最小单元格大小\n */\n getScaleUnit(): BackgroundScaleUnit {\n const { zoom } = this;\n\n return {\n realSize: RENDER_SIZE, // 一个单元格代表的真实大小\n renderSize: Math.round(RENDER_SIZE * zoom * 100) / 100, // 一个单元格渲染的大小值\n zoom, // 缩放比\n };\n }\n\n /**\n * 绘制\n */\n autorun(): void {\n const playgroundConfig = this.playgroundConfigEntity.config;\n const scaleUnit = this.getScaleUnit();\n const mod = scaleUnit.renderSize * 10;\n const viewBoxWidth = playgroundConfig.width + mod * 2;\n const viewBoxHeight = playgroundConfig.height + mod * 2;\n const { scrollX } = playgroundConfig;\n const { scrollY } = playgroundConfig;\n const scrollXDelta = this.getScrollDelta(scrollX, mod);\n const scrollYDelta = this.getScrollDelta(scrollY, mod);\n domUtils.setStyle(this.node, {\n left: scrollX - SCALE_WIDTH,\n top: scrollY - SCALE_WIDTH,\n });\n this.drawGrid(scaleUnit);\n // 设置网格\n this.setSVGStyle(this.grid, {\n width: viewBoxWidth,\n height: viewBoxHeight,\n left: SCALE_WIDTH - scrollXDelta - mod,\n top: SCALE_WIDTH - scrollYDelta - mod,\n });\n }\n\n /**\n * 绘制网格\n */\n protected drawGrid(unit: BackgroundScaleUnit): void {\n const minor = unit.renderSize;\n if (!this.grid) {\n return;\n }\n const patternSize = DOT_SIZE * this.zoom;\n const newContent = `\n <svg width=\"100%\" height=\"100%\">\n <pattern id=\"${this._patternId}\" width=\"${minor}\" height=\"${minor}\" patternUnits=\"userSpaceOnUse\">\n <circle\n cx=\"${patternSize}\"\n cy=\"${patternSize}\"\n r=\"${patternSize}\"\n stroke=\"#eceeef\"\n fill-opacity=\"0.5\"\n />\n </pattern>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#${this._patternId})\"/>\n </svg>`;\n this.grid.innerHTML = newContent;\n }\n\n protected setSVGStyle(\n svgElement: HTMLElement | undefined,\n style: { width: number; height: number; left: number; top: number },\n ): void {\n if (!svgElement) {\n return;\n }\n\n svgElement.style.width = `${style.width}px`;\n svgElement.style.height = `${style.height}px`;\n svgElement.style.left = `${style.left}px`;\n svgElement.style.top = `${style.top}px`;\n }\n\n /**\n * 获取相对滚动距离\n * @param realScroll\n * @param mod\n */\n protected getScrollDelta(realScroll: number, mod: number): number {\n // 正向滚动不用补差\n if (realScroll >= 0) {\n return realScroll % mod;\n }\n return mod - (Math.abs(realScroll) % mod);\n }\n}\n","import { definePluginCreator } from '@flowgram.ai/core';\n\nimport { BackgroundLayer, BackgroundLayerOptions } from './background-layer';\n\n/**\n * 点位背景插件\n */\nexport const createBackgroundPlugin = definePluginCreator<BackgroundLayerOptions>({\n onInit: (ctx, opts) => {\n ctx.playground.registerLayer(BackgroundLayer, opts);\n },\n});\n"],"mappings":"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","names":["import_core"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flowgram.ai/background-plugin",
|
|
3
|
+
"version": "0.1.0-alpha.2",
|
|
4
|
+
"homepage": "https://flowgram.ai/",
|
|
5
|
+
"repository": "https://github.com/bytedance/flowgram.ai",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"exports": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/esm/index.js",
|
|
10
|
+
"require": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"module": "./dist/esm/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"inversify": "^6.0.1",
|
|
20
|
+
"reflect-metadata": "~0.2.2",
|
|
21
|
+
"@flowgram.ai/core": "0.1.0-alpha.2",
|
|
22
|
+
"@flowgram.ai/utils": "0.1.0-alpha.2"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/react": "^18",
|
|
26
|
+
"@types/react-dom": "^18",
|
|
27
|
+
"@vitest/coverage-v8": "^0.32.0",
|
|
28
|
+
"eslint": "^8.54.0",
|
|
29
|
+
"tsup": "^8.0.1",
|
|
30
|
+
"typescript": "^5.0.4",
|
|
31
|
+
"vitest": "^0.34.6",
|
|
32
|
+
"@flowgram.ai/eslint-config": "0.1.0-alpha.2",
|
|
33
|
+
"@flowgram.ai/ts-config": "0.1.0-alpha.2"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"react": ">=17",
|
|
37
|
+
"react-dom": ">=17"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public",
|
|
41
|
+
"registry": "https://registry.npmjs.org/"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "npm run build:fast -- --dts-resolve",
|
|
45
|
+
"build:fast": "tsup src/index.ts --format cjs,esm --sourcemap --legacy-output",
|
|
46
|
+
"build:watch": "npm run build:fast -- --dts-resolve",
|
|
47
|
+
"clean": "rimraf dist",
|
|
48
|
+
"test": "exit 0",
|
|
49
|
+
"test:cov": "exit 0",
|
|
50
|
+
"ts-check": "tsc --noEmit",
|
|
51
|
+
"watch": "npm run build:fast -- --dts-resolve --watch --ignore-watch dist"
|
|
52
|
+
}
|
|
53
|
+
}
|