leafer-connector 1.4.1 → 1.5.1

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 (64) hide show
  1. package/README.md +124 -1
  2. package/dist/cjs/Connector.cjs +326 -621
  3. package/dist/cjs/Connector.js.map +1 -1
  4. package/dist/cjs/connector/LabelManager.cjs +197 -0
  5. package/dist/cjs/connector/LabelManager.js.map +1 -0
  6. package/dist/cjs/connector/arrowStyle.cjs +17 -0
  7. package/dist/cjs/connector/arrowStyle.js.map +1 -0
  8. package/dist/cjs/connector/geometry.cjs +52 -0
  9. package/dist/cjs/connector/geometry.js.map +1 -0
  10. package/dist/cjs/connector/interactions.cjs +100 -0
  11. package/dist/cjs/connector/interactions.js.map +1 -0
  12. package/dist/cjs/connector/nodeMode.cjs +218 -0
  13. package/dist/cjs/connector/nodeMode.js.map +1 -0
  14. package/dist/cjs/connector/pointMode.cjs +101 -0
  15. package/dist/cjs/connector/pointMode.js.map +1 -0
  16. package/dist/cjs/connector/stableStringify.cjs +36 -0
  17. package/dist/cjs/connector/stableStringify.js.map +1 -0
  18. package/dist/cjs/connector/state.cjs +84 -0
  19. package/dist/cjs/connector/state.js.map +1 -0
  20. package/dist/cjs/connector/svgPath.cjs +39 -0
  21. package/dist/cjs/connector/svgPath.js.map +1 -0
  22. package/dist/esm/Connector.d.ts +55 -12
  23. package/dist/esm/Connector.d.ts.map +1 -1
  24. package/dist/esm/Connector.js +325 -620
  25. package/dist/esm/Connector.js.map +1 -1
  26. package/dist/esm/connector/LabelManager.d.ts +33 -0
  27. package/dist/esm/connector/LabelManager.d.ts.map +1 -0
  28. package/dist/esm/connector/LabelManager.js +193 -0
  29. package/dist/esm/connector/LabelManager.js.map +1 -0
  30. package/dist/esm/connector/arrowStyle.d.ts +3 -0
  31. package/dist/esm/connector/arrowStyle.d.ts.map +1 -0
  32. package/dist/esm/connector/arrowStyle.js +14 -0
  33. package/dist/esm/connector/arrowStyle.js.map +1 -0
  34. package/dist/esm/connector/geometry.d.ts +17 -0
  35. package/dist/esm/connector/geometry.d.ts.map +1 -0
  36. package/dist/esm/connector/geometry.js +44 -0
  37. package/dist/esm/connector/geometry.js.map +1 -0
  38. package/dist/esm/connector/interactions.d.ts +36 -0
  39. package/dist/esm/connector/interactions.d.ts.map +1 -0
  40. package/dist/esm/connector/interactions.js +97 -0
  41. package/dist/esm/connector/interactions.js.map +1 -0
  42. package/dist/esm/connector/nodeMode.d.ts +70 -0
  43. package/dist/esm/connector/nodeMode.d.ts.map +1 -0
  44. package/dist/esm/connector/nodeMode.js +212 -0
  45. package/dist/esm/connector/nodeMode.js.map +1 -0
  46. package/dist/esm/connector/pointMode.d.ts +35 -0
  47. package/dist/esm/connector/pointMode.d.ts.map +1 -0
  48. package/dist/esm/connector/pointMode.js +97 -0
  49. package/dist/esm/connector/pointMode.js.map +1 -0
  50. package/dist/esm/connector/stableStringify.d.ts +2 -0
  51. package/dist/esm/connector/stableStringify.d.ts.map +1 -0
  52. package/dist/esm/connector/stableStringify.js +33 -0
  53. package/dist/esm/connector/stableStringify.js.map +1 -0
  54. package/dist/esm/connector/state.d.ts +15 -0
  55. package/dist/esm/connector/state.d.ts.map +1 -0
  56. package/dist/esm/connector/state.js +80 -0
  57. package/dist/esm/connector/state.js.map +1 -0
  58. package/dist/esm/connector/svgPath.d.ts +3 -0
  59. package/dist/esm/connector/svgPath.d.ts.map +1 -0
  60. package/dist/esm/connector/svgPath.js +36 -0
  61. package/dist/esm/connector/svgPath.js.map +1 -0
  62. package/dist/esm/types.d.ts +67 -6
  63. package/dist/esm/types.d.ts.map +1 -1
  64. package/package.json +9 -2
package/README.md CHANGED
@@ -50,6 +50,98 @@ const edge = new Connector(app, { from: a, to: b });
50
50
  app.tree.add([a, b, edge]);
51
51
  ```
52
52
 
53
+ ## 纯坐标连线(Point 模式)
54
+
55
+ 如果你不想传节点(`IUI`),只想用 **两个点坐标** 画一条连线,可以用 point 模式:
56
+
57
+ - 只传点时,Connector **不会监听节点拖拽/渲染事件**(默认 `updateMode="manual"`)
58
+ - **点击连线**会显示起点/终点两个圆点(handle),拖动圆点会更新端点坐标
59
+
60
+ Point 模式新增参数:
61
+
62
+ - **`fromPoint` / `toPoint`**:`IPointData`(world 坐标),与 `from/to` 二选一
63
+ - **`pointsEditable`**:`boolean`,是否允许点击进入编辑态(显示/拖拽端点圆点),默认 `true`
64
+ - **`pointHandles`**:端点圆点样式(见下表)
65
+ - **`onPointsChange`**:端点坐标变化回调(拖拽端点 / `setPoints` 时触发)
66
+
67
+ ```ts
68
+ import { App } from "leafer-editor";
69
+ import { Connector } from "leafer-connector";
70
+
71
+ const app = new App({ view: container, editor: {} });
72
+
73
+ const edge = new Connector(app, {
74
+ fromPoint: { x: 120, y: 160 },
75
+ toPoint: { x: 520, y: 320 },
76
+ routeType: "bezier",
77
+ pointsEditable: true, // 默认 true(仅 point 模式生效)
78
+ onPointsChange: ({ from, to }) => {
79
+ console.log("points changed:", from, to);
80
+ },
81
+ });
82
+
83
+ app.tree.add(edge);
84
+ edge.update(); // point 模式下你也可以手动触发刷新
85
+ ```
86
+ ![Preview](https://github.com/rideWind97/leafer-connector/blob/master/playground/assets/point-mode.gif)
87
+
88
+
89
+ ### 模式切换(Point → Node)
90
+
91
+ Connector 支持在运行时从 **Point 模式切回 Node 模式**(比如你先用点画线,后续拿到真实节点再绑定):
92
+
93
+ - **会自动清理 point-mode 的编辑态/拖拽态**(隐藏 handles)
94
+ - **会解绑旧的交互监听并重新绑定**,避免残留 point-mode 的 click/drag 行为
95
+ - 默认会把 `updateMode` 切回 `"event"`(因为 point-mode 默认 `updateMode="manual"`)
96
+
97
+ API:
98
+
99
+ ```ts
100
+ // 从 point-mode 切换到 node-mode
101
+ edge.switchToNodeMode(a, b);
102
+
103
+ // 或者显式指定 updateMode(例如协同场景)
104
+ edge.switchToNodeMode(a, b, { updateMode: "render" });
105
+ ```
106
+
107
+ 参数说明:
108
+
109
+ - **`from`**:`IUI`,起点节点
110
+ - **`to`**:`IUI`,终点节点
111
+ - **`opts`**(可选):
112
+ - **`opts.autoUpdateMode`**:`boolean`,默认 `true`。为 `true` 时(且未传 `opts.updateMode`),会将 `updateMode` 设为 `"event"`
113
+ - **`opts.updateMode`**:`"event" | "render" | "manual"`,强制设置切换后的更新模式
114
+
115
+ ### 模式切换(Node → Point)
116
+
117
+ 当你希望“先连节点”,后续又想把它变成“纯点坐标线”(不再依赖节点)时,可以用:
118
+
119
+ ```ts
120
+ // 从 node-mode 切换到 point-mode
121
+ edge.switchToPointMode({ x: 120, y: 160 }, { x: 520, y: 320 });
122
+
123
+ // 或者显式指定 updateMode
124
+ edge.switchToPointMode(
125
+ { x: 120, y: 160 },
126
+ { x: 520, y: 320 },
127
+ { updateMode: "manual" }
128
+ );
129
+ ```
130
+
131
+ 行为说明:
132
+
133
+ - 会解绑旧的交互监听并按 point-mode 重新绑定
134
+ - 会清理 node 引用与拖拽态
135
+ - 默认会把 `updateMode` 切到 `"manual"`(因为 point-mode 通常由业务侧手动刷新/控制)
136
+
137
+ 参数说明:
138
+
139
+ - **`fromPoint`**:`IPointData`,起点坐标(world)
140
+ - **`toPoint`**:`IPointData`,终点坐标(world)
141
+ - **`opts`**(可选):
142
+ - **`opts.autoUpdateMode`**:`boolean`,默认 `true`。为 `true` 时(且未传 `opts.updateMode`),会将 `updateMode` 设为 `"manual"`
143
+ - **`opts.updateMode`**:`"event" | "render" | "manual"`,强制设置切换后的更新模式
144
+
53
145
  ## 路由示例
54
146
 
55
147
  ### 正交(orthogonal)
@@ -159,6 +251,8 @@ const edge = new Connector(app, {
159
251
  | --- | --- | --- | --- | --- |
160
252
  | `from` | `IUI` | 是 | - | 起点节点 |
161
253
  | `to` | `IUI` | 是 | - | 终点节点 |
254
+ | `fromPoint` | `IPointData` | 否 | - | **Point 模式**起点坐标(world);与 `from/to` 互斥 |
255
+ | `toPoint` | `IPointData` | 否 | - | **Point 模式**终点坐标(world);与 `from/to` 互斥 |
162
256
  | `routeType` | `"orthogonal" \| "bezier" \| "straight" \| "custom"` | 否 | `"orthogonal"` | 路由类型 |
163
257
  | `padding` | `number` | 否 | `20` | 出线段长度(从 linkPoint 沿法线外扩) |
164
258
  | `margin` | `number` | 否 | `0` | 连接点与节点边界间距(让线不贴边) |
@@ -177,7 +271,8 @@ const edge = new Connector(app, {
177
271
  | `updateMode` | `"event" \| "render" \| "manual"` | 否 | `"event"` | 自动更新模式(协同场景建议用 render) |
178
272
  | `renderThrottleMs` | `number` | 否 | `16` | render 模式节流(ms) |
179
273
  | `getNodeId` | `(node: IUI) => string` | 否 | - | 协同序列化:node -> id(用于 getState/onChange) |
180
- | `onChange` | `({ reason, prev, next, diff, changedKeys }) => void` | 否 | - | 统一变更回调(reason: `"label" \| "setState"`) |
274
+ | `onChange` | `({ reason, prev, next, diff, changedKeys }) => void` | 否 | - | 统一变更回调(reason: `"label" \| "setState" \| "points"`) |
275
+ | `onPointsChange` | `({ from, to }) => void` | 否 | - | **Point 模式**端点坐标变化回调 |
181
276
  | `onLabelChange` | `({ oldText, newText }) => void` | 否 | - | label 文本变化回调 |
182
277
  | `stroke` | `string` | 否 | `"#ffffff"` | 线条颜色 |
183
278
  | `strokeWidth` | `number` | 否 | `2` | 线宽 |
@@ -191,6 +286,14 @@ const edge = new Connector(app, {
191
286
  | `label.editable` | `boolean` | 否 | - | 是否允许编辑(打开 inner editor) |
192
287
  | `label.style` | `Partial<ITextInputData>` | 否 | - | 文案样式(fill/fontSize/boxStyle/padding 等) |
193
288
  | `labelOnDoubleClick` | `boolean` | 否 | `true` | 是否允许双击连线打开/创建 label |
289
+ | `pointsEditable` | `boolean` | 否 | `true` | **Point 模式**是否允许点击进入编辑态(显示/拖拽端点圆点) |
290
+ | `pointHandles` | `{ ... }` | 否 | - | **Point 模式**端点圆点样式 |
291
+ | `pointHandles.size` | `number` | 否 | `10` | 端点圆点直径 |
292
+ | `pointHandles.fill` | `string` | 否 | `"#ffffff"` | 填充色 |
293
+ | `pointHandles.stroke` | `string` | 否 | `"#000000"` | 描边色 |
294
+ | `pointHandles.strokeWidth` | `number` | 否 | `1` | 描边宽度 |
295
+ | `pointHandles.opacity` | `number` | 否 | `1` | 透明度 |
296
+ | `pointHandles.hitStrokeWidth` | `number` | 否 | `12` | 命中范围(越大越好点) |
194
297
 
195
298
  ### `TargetOption`(用于 `opt1/opt2`)表格
196
299
 
@@ -367,6 +470,13 @@ const edge = new Connector(app, {
367
470
 
368
471
  - 导出:`Connector` 以及相关类型(见 `src/types.ts`)
369
472
 
473
+ ### Connector 实例方法(补充)
474
+
475
+ | 方法 | 说明 |
476
+ | --- | --- |
477
+ | `switchToNodeMode(from, to, opts?)` | 从 point-mode 切换到 node-mode,并重新绑定交互监听(详见上方“模式切换”小节) |
478
+ | `switchToPointMode(fromPoint, toPoint, opts?)` | 从 node-mode 切换到 point-mode,并重新绑定交互监听(详见上方“模式切换”小节) |
479
+
370
480
  ## 构建与发布
371
481
 
372
482
  本包默认输出 **双产物**:
@@ -374,6 +484,19 @@ const edge = new Connector(app, {
374
484
  - ESM:`dist/esm`
375
485
  - CJS:`dist/cjs`(`.cjs` 后缀)
376
486
 
487
+ ## Vue 3 + Vite Playground(本仓库内运行示例)
488
+
489
+ 本仓库内置了一个 Vue 3 的 Vite 示例项目(用于本地调试/演示):
490
+
491
+ ```bash
492
+ pnpm install
493
+ pnpm run dev
494
+ ```
495
+
496
+ - 默认会启动在 `http://localhost:5173`
497
+ - playground 代码在 `playground-vue/`
498
+ - 开发时会通过 Vite alias 直接引用本仓库源码:`leafer-connector → ../src/index.ts`
499
+
377
500
  可选:Rollup 生产 bundle(更适合做体积检查/发布前 smoke test):
378
501
 
379
502
  ```bash