leafer-connector 0.1.0

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.
Files changed (45) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +386 -0
  3. package/dist/cjs/Connector.cjs +806 -0
  4. package/dist/cjs/Connector.js.map +1 -0
  5. package/dist/cjs/anchors.cjs +140 -0
  6. package/dist/cjs/anchors.js.map +1 -0
  7. package/dist/cjs/bezier.cjs +101 -0
  8. package/dist/cjs/bezier.js.map +1 -0
  9. package/dist/cjs/index.cjs +21 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/route.cjs +185 -0
  12. package/dist/cjs/route.js.map +1 -0
  13. package/dist/cjs/types.cjs +3 -0
  14. package/dist/cjs/types.js.map +1 -0
  15. package/dist/cjs/utils.cjs +11 -0
  16. package/dist/cjs/utils.js.map +1 -0
  17. package/dist/esm/Connector.d.ts +49 -0
  18. package/dist/esm/Connector.d.ts.map +1 -0
  19. package/dist/esm/Connector.js +802 -0
  20. package/dist/esm/Connector.js.map +1 -0
  21. package/dist/esm/anchors.d.ts +9 -0
  22. package/dist/esm/anchors.d.ts.map +1 -0
  23. package/dist/esm/anchors.js +132 -0
  24. package/dist/esm/anchors.js.map +1 -0
  25. package/dist/esm/bezier.d.ts +10 -0
  26. package/dist/esm/bezier.d.ts.map +1 -0
  27. package/dist/esm/bezier.js +95 -0
  28. package/dist/esm/bezier.js.map +1 -0
  29. package/dist/esm/index.d.ts +3 -0
  30. package/dist/esm/index.d.ts.map +1 -0
  31. package/dist/esm/index.js +3 -0
  32. package/dist/esm/index.js.map +1 -0
  33. package/dist/esm/route.d.ts +23 -0
  34. package/dist/esm/route.d.ts.map +1 -0
  35. package/dist/esm/route.js +179 -0
  36. package/dist/esm/route.js.map +1 -0
  37. package/dist/esm/types.d.ts +202 -0
  38. package/dist/esm/types.d.ts.map +1 -0
  39. package/dist/esm/types.js +2 -0
  40. package/dist/esm/types.js.map +1 -0
  41. package/dist/esm/utils.d.ts +3 -0
  42. package/dist/esm/utils.d.ts.map +1 -0
  43. package/dist/esm/utils.js +7 -0
  44. package/dist/esm/utils.js.map +1 -0
  45. package/package.json +67 -0
@@ -0,0 +1,202 @@
1
+ import type { IArrowStyle, IPointData, ITextInputData, IUI } from "leafer-editor";
2
+ export type ConnectorRouteType = "orthogonal" | "bezier" | "straight" | "custom";
3
+ export type ConnectorScaleMode = "world" | "pixel";
4
+ export type ConnectorSide = "top" | "right" | "bottom" | "left";
5
+ export type ConnectorAnchorSpec = "center" | {
6
+ type: "center";
7
+ } | {
8
+ type: "side";
9
+ side: ConnectorSide;
10
+ } | {
11
+ type: "nearest-side";
12
+ } | {
13
+ type: "nearest-edge";
14
+ };
15
+ export interface ConnectorPoint {
16
+ node: IUI;
17
+ side: ConnectorSide;
18
+ percent: number;
19
+ margin: number;
20
+ padding: number;
21
+ /**
22
+ * 与节点边界相交(考虑 margin)的点(world)
23
+ */
24
+ linkPoint: IPointData;
25
+ /**
26
+ * 从 linkPoint 沿法线方向外扩 padding 后的点(world)
27
+ */
28
+ paddingPoint: IPointData;
29
+ }
30
+ export interface TargetOption {
31
+ /**
32
+ * 强制连接面:top/right/bottom/left
33
+ * - "auto":自动在有效 side 中择优
34
+ */
35
+ side?: ConnectorSide | "auto";
36
+ /**
37
+ * 连接点在该面上的比例位置(0~1)
38
+ */
39
+ percent?: number;
40
+ /**
41
+ * 单端 padding(覆盖全局)
42
+ */
43
+ padding?: number;
44
+ /**
45
+ * 单端 margin(覆盖全局)
46
+ */
47
+ margin?: number;
48
+ /**
49
+ * 固定连接点(world 坐标,优先级最高)
50
+ */
51
+ linkPoint?: IPointData;
52
+ }
53
+ export type ConnectorDrawResult = {
54
+ /**
55
+ * 生成的路径点(world 坐标)
56
+ */
57
+ points: IPointData[];
58
+ /**
59
+ * SVG path 字符串(world 坐标)
60
+ */
61
+ path: string;
62
+ };
63
+ export interface ConnectorOptions {
64
+ from: IUI;
65
+ to: IUI;
66
+ /**
67
+ * 全局:从边界外扩的距离(出线段长度)
68
+ */
69
+ padding?: number;
70
+ /**
71
+ * 全局:连线与对象之间间距(让线不贴边)
72
+ */
73
+ margin?: number;
74
+ /**
75
+ * 全局:正交/智能路由的圆角半径
76
+ */
77
+ cornerRadius?: number;
78
+ /**
79
+ * 端点配置(单端覆盖)
80
+ */
81
+ opt1?: TargetOption;
82
+ opt2?: TargetOption;
83
+ /**
84
+ * 路由类型
85
+ */
86
+ routeType?: ConnectorRouteType;
87
+ /**
88
+ * bezier 张力/曲率(用于控制点强度/或 smart-route 参数),默认 0.6
89
+ */
90
+ bezierCurvature?: number;
91
+ /**
92
+ * 自定义绘制(结构化回调)
93
+ * - 你可以基于默认结果修改 points/path
94
+ */
95
+ onDraw?: (param: {
96
+ s: ConnectorPoint;
97
+ e: ConnectorPoint;
98
+ defaultResult: ConnectorDrawResult;
99
+ }) => Partial<ConnectorDrawResult> | void;
100
+ /**
101
+ * 路由参数(smart-route 参数化)
102
+ */
103
+ routeOptions?: {
104
+ /**
105
+ * 避障 padding:将需要避开的 bounds 外扩多少(local 坐标)
106
+ * - 默认使用 margin
107
+ */
108
+ avoidPadding?: number;
109
+ /**
110
+ * 线段与避障矩形相交的惩罚分(越大越“绕开”)
111
+ */
112
+ intersectionPenalty?: number;
113
+ /**
114
+ * “长直线惩罚”的阈值(maxSegment/total > ratio 开始加惩罚)
115
+ */
116
+ longStraightRatio?: number;
117
+ /**
118
+ * “长直线惩罚”的权重
119
+ */
120
+ longStraightWeight?: number;
121
+ /**
122
+ * 生成候选路径时是否包含 S-route(两次转折)
123
+ */
124
+ enableSRoutes?: boolean;
125
+ /**
126
+ * routeType=bezier 时,距离小于该值会自动降级为 orthogonal(避免回勾/贴边)
127
+ */
128
+ bezierFallbackDistance?: number;
129
+ };
130
+ /**
131
+ * 自动更新模式
132
+ * - event: 仅 DragEvent + 交互触发 update(默认)
133
+ * - render: 每帧 RenderEvent.END 调用 update(适合协同/程序频繁改坐标)
134
+ * - manual: 完全手动(你需要自己调用 connector.update())
135
+ */
136
+ updateMode?: "event" | "render" | "manual";
137
+ /**
138
+ * render 模式下的节流(ms)
139
+ * - 0 表示不节流(每帧都允许触发,但仍会走内部 key 去重)
140
+ * - 建议协同场景设置 16~33
141
+ */
142
+ renderThrottleMs?: number;
143
+ /**
144
+ * 协同序列化:从节点对象获取 id(用于 getState)
145
+ */
146
+ getNodeId?: (node: IUI) => string;
147
+ /**
148
+ * label 文本变化回调(用于协同同步 label)
149
+ */
150
+ onLabelChange?: (param: {
151
+ oldText: string;
152
+ newText: string;
153
+ }) => void;
154
+ /**
155
+ * 统一变更回调(用于协同同步 connector 状态)
156
+ * - 依赖 getNodeId,缺失时将无法生成 state(会跳过回调)
157
+ */
158
+ onChange?: (param: {
159
+ reason: "label" | "setState";
160
+ prev: ConnectorState;
161
+ next: ConnectorState;
162
+ diff: Partial<ConnectorState>;
163
+ changedKeys: (keyof ConnectorState)[];
164
+ }) => void;
165
+ stroke?: string;
166
+ strokeWidth?: number;
167
+ dashPattern?: number[];
168
+ startArrow?: IArrowStyle;
169
+ endArrow?: IArrowStyle;
170
+ scaleMode?: ConnectorScaleMode;
171
+ arrowBaseScale?: number;
172
+ label?: {
173
+ text?: string;
174
+ editable?: boolean;
175
+ style?: Partial<ITextInputData>;
176
+ };
177
+ labelOnDoubleClick?: boolean;
178
+ }
179
+ export interface ConnectorState {
180
+ fromId: string | number;
181
+ toId: string | number;
182
+ routeType: ConnectorRouteType;
183
+ padding: number;
184
+ margin: number;
185
+ cornerRadius: number;
186
+ bezierCurvature: number;
187
+ opt1?: TargetOption;
188
+ opt2?: TargetOption;
189
+ stroke?: string;
190
+ strokeWidth?: number;
191
+ dashPattern?: number[];
192
+ startArrow?: IArrowStyle;
193
+ endArrow?: IArrowStyle;
194
+ scaleMode?: ConnectorScaleMode;
195
+ arrowBaseScale?: number;
196
+ label?: {
197
+ text?: string;
198
+ editable?: boolean;
199
+ style?: Partial<ITextInputData>;
200
+ };
201
+ }
202
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export declare function mid(a: number, b: number): number;
2
+ export declare function clamp(n: number, min: number, max: number): number;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,UAEvC;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,UAExD"}
@@ -0,0 +1,7 @@
1
+ export function mid(a, b) {
2
+ return (a + b) / 2;
3
+ }
4
+ export function clamp(n, min, max) {
5
+ return Math.max(min, Math.min(max, n));
6
+ }
7
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,CAAS;IACtC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAS,EAAE,GAAW,EAAE,GAAW;IACvD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "leafer-connector",
3
+ "version": "0.1.0",
4
+ "description": "A LeaferJS connector (edge) component with arrows, multiple route types, labels, and collaboration helpers.",
5
+ "license": "MIT",
6
+ "homepage": "https://github.com/rideWind97/leafer-connector",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/rideWind97/leafer-connector.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/rideWind97/leafer-connector/issues"
13
+ },
14
+ "type": "module",
15
+ "sideEffects": false,
16
+ "keywords": [
17
+ "leafer",
18
+ "leaferjs",
19
+ "connector",
20
+ "edge",
21
+ "arrow",
22
+ "diagram",
23
+ "flow"
24
+ ],
25
+ "files": [
26
+ "dist",
27
+ "README.md"
28
+ ],
29
+ "main": "./dist/cjs/index.cjs",
30
+ "module": "./dist/esm/index.js",
31
+ "types": "./dist/esm/index.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/esm/index.d.ts",
35
+ "import": "./dist/esm/index.js",
36
+ "require": "./dist/cjs/index.cjs"
37
+ }
38
+ },
39
+ "peerDependencies": {
40
+ "leafer-editor": "^1.12.1"
41
+ },
42
+ "peerDependenciesMeta": {
43
+ "leafer-editor": {
44
+ "optional": false
45
+ }
46
+ },
47
+ "scripts": {
48
+ "clean": "node scripts/clean.mjs",
49
+ "build:esm": "pnpm exec tsc -p tsconfig.build.esm.json",
50
+ "build:cjs": "pnpm exec tsc -p tsconfig.build.cjs.json && node scripts/rename-cjs.mjs",
51
+ "build": "pnpm run clean && pnpm run build:esm && pnpm run build:cjs",
52
+ "bundle:rollup": "pnpm run build && pnpm exec rollup -c rollup.config.mjs",
53
+ "prepublishOnly": "pnpm run build"
54
+ },
55
+ "devDependencies": {
56
+ "@rollup/plugin-commonjs": "^28.0.6",
57
+ "@rollup/plugin-node-resolve": "^16.0.1",
58
+ "@rollup/plugin-terser": "^0.4.4",
59
+ "rollup": "^4.40.0",
60
+ "typescript": "^5.8.3"
61
+ },
62
+ "publishConfig": {
63
+ "access": "public"
64
+ }
65
+ }
66
+
67
+