leafer-connector 1.4.1 → 1.5.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 (64) hide show
  1. package/README.md +93 -1
  2. package/dist/cjs/Connector.cjs +299 -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 +38 -12
  23. package/dist/esm/Connector.d.ts.map +1 -1
  24. package/dist/esm/Connector.js +298 -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,68 @@ 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
+
53
115
  ## 路由示例
54
116
 
55
117
  ### 正交(orthogonal)
@@ -159,6 +221,8 @@ const edge = new Connector(app, {
159
221
  | --- | --- | --- | --- | --- |
160
222
  | `from` | `IUI` | 是 | - | 起点节点 |
161
223
  | `to` | `IUI` | 是 | - | 终点节点 |
224
+ | `fromPoint` | `IPointData` | 否 | - | **Point 模式**起点坐标(world);与 `from/to` 互斥 |
225
+ | `toPoint` | `IPointData` | 否 | - | **Point 模式**终点坐标(world);与 `from/to` 互斥 |
162
226
  | `routeType` | `"orthogonal" \| "bezier" \| "straight" \| "custom"` | 否 | `"orthogonal"` | 路由类型 |
163
227
  | `padding` | `number` | 否 | `20` | 出线段长度(从 linkPoint 沿法线外扩) |
164
228
  | `margin` | `number` | 否 | `0` | 连接点与节点边界间距(让线不贴边) |
@@ -177,7 +241,8 @@ const edge = new Connector(app, {
177
241
  | `updateMode` | `"event" \| "render" \| "manual"` | 否 | `"event"` | 自动更新模式(协同场景建议用 render) |
178
242
  | `renderThrottleMs` | `number` | 否 | `16` | render 模式节流(ms) |
179
243
  | `getNodeId` | `(node: IUI) => string` | 否 | - | 协同序列化:node -> id(用于 getState/onChange) |
180
- | `onChange` | `({ reason, prev, next, diff, changedKeys }) => void` | 否 | - | 统一变更回调(reason: `"label" \| "setState"`) |
244
+ | `onChange` | `({ reason, prev, next, diff, changedKeys }) => void` | 否 | - | 统一变更回调(reason: `"label" \| "setState" \| "points"`) |
245
+ | `onPointsChange` | `({ from, to }) => void` | 否 | - | **Point 模式**端点坐标变化回调 |
181
246
  | `onLabelChange` | `({ oldText, newText }) => void` | 否 | - | label 文本变化回调 |
182
247
  | `stroke` | `string` | 否 | `"#ffffff"` | 线条颜色 |
183
248
  | `strokeWidth` | `number` | 否 | `2` | 线宽 |
@@ -191,6 +256,14 @@ const edge = new Connector(app, {
191
256
  | `label.editable` | `boolean` | 否 | - | 是否允许编辑(打开 inner editor) |
192
257
  | `label.style` | `Partial<ITextInputData>` | 否 | - | 文案样式(fill/fontSize/boxStyle/padding 等) |
193
258
  | `labelOnDoubleClick` | `boolean` | 否 | `true` | 是否允许双击连线打开/创建 label |
259
+ | `pointsEditable` | `boolean` | 否 | `true` | **Point 模式**是否允许点击进入编辑态(显示/拖拽端点圆点) |
260
+ | `pointHandles` | `{ ... }` | 否 | - | **Point 模式**端点圆点样式 |
261
+ | `pointHandles.size` | `number` | 否 | `10` | 端点圆点直径 |
262
+ | `pointHandles.fill` | `string` | 否 | `"#ffffff"` | 填充色 |
263
+ | `pointHandles.stroke` | `string` | 否 | `"#000000"` | 描边色 |
264
+ | `pointHandles.strokeWidth` | `number` | 否 | `1` | 描边宽度 |
265
+ | `pointHandles.opacity` | `number` | 否 | `1` | 透明度 |
266
+ | `pointHandles.hitStrokeWidth` | `number` | 否 | `12` | 命中范围(越大越好点) |
194
267
 
195
268
  ### `TargetOption`(用于 `opt1/opt2`)表格
196
269
 
@@ -367,6 +440,12 @@ const edge = new Connector(app, {
367
440
 
368
441
  - 导出:`Connector` 以及相关类型(见 `src/types.ts`)
369
442
 
443
+ ### Connector 实例方法(补充)
444
+
445
+ | 方法 | 说明 |
446
+ | --- | --- |
447
+ | `switchToNodeMode(from, to, opts?)` | 从 point-mode 切换到 node-mode,并重新绑定交互监听(详见上方“模式切换”小节) |
448
+
370
449
  ## 构建与发布
371
450
 
372
451
  本包默认输出 **双产物**:
@@ -374,6 +453,19 @@ const edge = new Connector(app, {
374
453
  - ESM:`dist/esm`
375
454
  - CJS:`dist/cjs`(`.cjs` 后缀)
376
455
 
456
+ ## Vue 3 + Vite Playground(本仓库内运行示例)
457
+
458
+ 本仓库内置了一个 Vue 3 的 Vite 示例项目(用于本地调试/演示):
459
+
460
+ ```bash
461
+ pnpm install
462
+ pnpm run dev
463
+ ```
464
+
465
+ - 默认会启动在 `http://localhost:5173`
466
+ - playground 代码在 `playground-vue/`
467
+ - 开发时会通过 Vite alias 直接引用本仓库源码:`leafer-connector → ../src/index.ts`
468
+
377
469
  可选:Rollup 生产 bundle(更适合做体积检查/发布前 smoke test):
378
470
 
379
471
  ```bash