@retikz/core 0.2.0-alpha.5 → 0.2.0-alpha.6

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 (123) hide show
  1. package/dist/es/compile/anchor-cache.d.ts +10 -0
  2. package/dist/es/compile/anchor-cache.d.ts.map +1 -1
  3. package/dist/es/compile/anchor-cache.js +25 -1
  4. package/dist/es/compile/index.d.ts +0 -1
  5. package/dist/es/compile/index.d.ts.map +1 -1
  6. package/dist/es/compile/path/anchor.d.ts.map +1 -1
  7. package/dist/es/compile/path/anchor.js +17 -18
  8. package/dist/es/compile/path/index.d.ts.map +1 -1
  9. package/dist/es/compile/path/index.js +10 -4
  10. package/dist/es/geometry/_edge.d.ts +29 -0
  11. package/dist/es/geometry/_edge.d.ts.map +1 -0
  12. package/dist/es/geometry/_edge.js +35 -0
  13. package/dist/es/geometry/circle.d.ts +3 -0
  14. package/dist/es/geometry/circle.d.ts.map +1 -1
  15. package/dist/es/geometry/circle.js +7 -0
  16. package/dist/es/geometry/diamond.d.ts +3 -0
  17. package/dist/es/geometry/diamond.d.ts.map +1 -1
  18. package/dist/es/geometry/diamond.js +29 -0
  19. package/dist/es/geometry/ellipse.d.ts +3 -0
  20. package/dist/es/geometry/ellipse.d.ts.map +1 -1
  21. package/dist/es/geometry/ellipse.js +7 -0
  22. package/dist/es/geometry/rect.d.ts +3 -0
  23. package/dist/es/geometry/rect.d.ts.map +1 -1
  24. package/dist/es/geometry/rect.js +6 -0
  25. package/dist/es/index.d.ts +3 -3
  26. package/dist/es/index.d.ts.map +1 -1
  27. package/dist/es/index.js +5 -4
  28. package/dist/es/ir/coordinate.d.ts +2 -2
  29. package/dist/es/ir/node.d.ts +2 -2
  30. package/dist/es/ir/path/path.d.ts +662 -167
  31. package/dist/es/ir/path/path.d.ts.map +1 -1
  32. package/dist/es/ir/path/step.d.ts +930 -192
  33. package/dist/es/ir/path/step.d.ts.map +1 -1
  34. package/dist/es/ir/path/target.d.ts +71 -1
  35. package/dist/es/ir/path/target.d.ts.map +1 -1
  36. package/dist/es/ir/path/target.js +24 -3
  37. package/dist/es/ir/scope.d.ts +932 -194
  38. package/dist/es/ir/scope.d.ts.map +1 -1
  39. package/dist/es/parsers/index.d.ts +1 -0
  40. package/dist/es/parsers/index.d.ts.map +1 -1
  41. package/dist/es/parsers/parseNodeTarget.d.ts +4 -0
  42. package/dist/es/parsers/parseNodeTarget.d.ts.map +1 -0
  43. package/dist/es/parsers/parseNodeTarget.js +33 -0
  44. package/dist/es/parsers/parseTargetSugar.d.ts +4 -2
  45. package/dist/es/parsers/parseTargetSugar.d.ts.map +1 -1
  46. package/dist/es/parsers/parseTargetSugar.js +6 -3
  47. package/dist/es/parsers/parseWay.d.ts +1 -1
  48. package/dist/es/parsers/parseWay.d.ts.map +1 -1
  49. package/dist/es/shapes/circle.d.ts.map +1 -1
  50. package/dist/es/shapes/circle.js +1 -0
  51. package/dist/es/shapes/diamond.d.ts.map +1 -1
  52. package/dist/es/shapes/diamond.js +1 -0
  53. package/dist/es/shapes/ellipse.d.ts.map +1 -1
  54. package/dist/es/shapes/ellipse.js +1 -0
  55. package/dist/es/shapes/rectangle.d.ts.map +1 -1
  56. package/dist/es/shapes/rectangle.js +1 -0
  57. package/dist/es/shapes/types.d.ts +6 -0
  58. package/dist/es/shapes/types.d.ts.map +1 -1
  59. package/dist/lib/compile/anchor-cache.cjs +25 -0
  60. package/dist/lib/compile/anchor-cache.d.ts +10 -0
  61. package/dist/lib/compile/anchor-cache.d.ts.map +1 -1
  62. package/dist/lib/compile/index.d.ts +0 -1
  63. package/dist/lib/compile/index.d.ts.map +1 -1
  64. package/dist/lib/compile/path/anchor.cjs +16 -17
  65. package/dist/lib/compile/path/anchor.d.ts.map +1 -1
  66. package/dist/lib/compile/path/index.cjs +10 -4
  67. package/dist/lib/compile/path/index.d.ts.map +1 -1
  68. package/dist/lib/geometry/_edge.cjs +38 -0
  69. package/dist/lib/geometry/_edge.d.ts +29 -0
  70. package/dist/lib/geometry/_edge.d.ts.map +1 -0
  71. package/dist/lib/geometry/circle.cjs +7 -0
  72. package/dist/lib/geometry/circle.d.ts +3 -0
  73. package/dist/lib/geometry/circle.d.ts.map +1 -1
  74. package/dist/lib/geometry/diamond.cjs +29 -0
  75. package/dist/lib/geometry/diamond.d.ts +3 -0
  76. package/dist/lib/geometry/diamond.d.ts.map +1 -1
  77. package/dist/lib/geometry/ellipse.cjs +7 -0
  78. package/dist/lib/geometry/ellipse.d.ts +3 -0
  79. package/dist/lib/geometry/ellipse.d.ts.map +1 -1
  80. package/dist/lib/geometry/rect.cjs +6 -0
  81. package/dist/lib/geometry/rect.d.ts +3 -0
  82. package/dist/lib/geometry/rect.d.ts.map +1 -1
  83. package/dist/lib/index.cjs +6 -2
  84. package/dist/lib/index.d.ts +3 -3
  85. package/dist/lib/index.d.ts.map +1 -1
  86. package/dist/lib/ir/coordinate.d.ts +2 -2
  87. package/dist/lib/ir/node.d.ts +2 -2
  88. package/dist/lib/ir/path/path.d.ts +662 -167
  89. package/dist/lib/ir/path/path.d.ts.map +1 -1
  90. package/dist/lib/ir/path/step.d.ts +930 -192
  91. package/dist/lib/ir/path/step.d.ts.map +1 -1
  92. package/dist/lib/ir/path/target.cjs +25 -2
  93. package/dist/lib/ir/path/target.d.ts +71 -1
  94. package/dist/lib/ir/path/target.d.ts.map +1 -1
  95. package/dist/lib/ir/scope.d.ts +932 -194
  96. package/dist/lib/ir/scope.d.ts.map +1 -1
  97. package/dist/lib/parsers/index.d.ts +1 -0
  98. package/dist/lib/parsers/index.d.ts.map +1 -1
  99. package/dist/lib/parsers/parseNodeTarget.cjs +33 -0
  100. package/dist/lib/parsers/parseNodeTarget.d.ts +4 -0
  101. package/dist/lib/parsers/parseNodeTarget.d.ts.map +1 -0
  102. package/dist/lib/parsers/parseTargetSugar.cjs +6 -3
  103. package/dist/lib/parsers/parseTargetSugar.d.ts +4 -2
  104. package/dist/lib/parsers/parseTargetSugar.d.ts.map +1 -1
  105. package/dist/lib/parsers/parseWay.d.ts +1 -1
  106. package/dist/lib/parsers/parseWay.d.ts.map +1 -1
  107. package/dist/lib/shapes/circle.cjs +1 -0
  108. package/dist/lib/shapes/circle.d.ts.map +1 -1
  109. package/dist/lib/shapes/diamond.cjs +1 -0
  110. package/dist/lib/shapes/diamond.d.ts.map +1 -1
  111. package/dist/lib/shapes/ellipse.cjs +1 -0
  112. package/dist/lib/shapes/ellipse.d.ts.map +1 -1
  113. package/dist/lib/shapes/rectangle.cjs +1 -0
  114. package/dist/lib/shapes/rectangle.d.ts.map +1 -1
  115. package/dist/lib/shapes/types.d.ts +6 -0
  116. package/dist/lib/shapes/types.d.ts.map +1 -1
  117. package/package.json +1 -1
  118. package/dist/es/compile/parseTarget.d.ts +0 -20
  119. package/dist/es/compile/parseTarget.d.ts.map +0 -1
  120. package/dist/es/compile/parseTarget.js +0 -36
  121. package/dist/lib/compile/parseTarget.cjs +0 -36
  122. package/dist/lib/compile/parseTarget.d.ts +0 -20
  123. package/dist/lib/compile/parseTarget.d.ts.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { Side } from '../geometry/_edge';
1
2
  import { IRPosition } from '../ir';
2
3
  import { NodeLayout } from './node';
3
4
  /**
@@ -9,4 +10,13 @@ import { NodeLayout } from './node';
9
10
  * @returns 全局坐标系下的 IRPosition `[x, y]`
10
11
  */
11
12
  export declare const resolveAnchor: (layout: NodeLayout, anchorName: string) => IRPosition;
13
+ /**
14
+ * 取节点边上比例点 `{ side, t }` 的全局坐标,带 per-layout 缓存
15
+ * @description 走 `layout.shapeDef.edgePoint`——shape 未实现(如自定义 shape)抛"does not support side anchors";
16
+ * 零尺寸 layout(Coordinate)抛错(边上比例点对一个点无意义,报错比退化中心更可诊断,见 alpha.6 ADR-01 决策细节 #10)。
17
+ * 缓存 key = `${side}:${t}`,与命名 anchor(`'north'` / `'30'`)共用 layout 的 Map——key 含 `:` 故命名空间不冲突。
18
+ * @param layout 已 Pass 1 完成的 NodeLayout(rect 已是全局坐标)
19
+ * @returns 全局坐标系下的 IRPosition `[x, y]`
20
+ */
21
+ export declare const resolveEdgePoint: (layout: NodeLayout, side: Side, t: number) => IRPosition;
12
22
  //# sourceMappingURL=anchor-cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anchor-cache.d.ts","sourceRoot":"","sources":["../../../src/compile/anchor-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AA4BzC;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,UAAU,EAClB,YAAY,MAAM,KACjB,UAWF,CAAC"}
1
+ {"version":3,"file":"anchor-cache.d.ts","sourceRoot":"","sources":["../../../src/compile/anchor-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AA4BzC;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,UAAU,EAClB,YAAY,MAAM,KACjB,UAWF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,UAAU,EAClB,MAAM,IAAI,EACV,GAAG,MAAM,KACR,UAuBF,CAAC"}
@@ -37,5 +37,29 @@ var resolveAnchor = (layout, anchorName) => {
37
37
  layoutCache.set(anchorName, result);
38
38
  return result;
39
39
  };
40
+ /**
41
+ * 取节点边上比例点 `{ side, t }` 的全局坐标,带 per-layout 缓存
42
+ * @description 走 `layout.shapeDef.edgePoint`——shape 未实现(如自定义 shape)抛"does not support side anchors";
43
+ * 零尺寸 layout(Coordinate)抛错(边上比例点对一个点无意义,报错比退化中心更可诊断,见 alpha.6 ADR-01 决策细节 #10)。
44
+ * 缓存 key = `${side}:${t}`,与命名 anchor(`'north'` / `'30'`)共用 layout 的 Map——key 含 `:` 故命名空间不冲突。
45
+ * @param layout 已 Pass 1 完成的 NodeLayout(rect 已是全局坐标)
46
+ * @returns 全局坐标系下的 IRPosition `[x, y]`
47
+ */
48
+ var resolveEdgePoint = (layout, side, t) => {
49
+ const { edgePoint } = layout.shapeDef;
50
+ if (!edgePoint) throw new Error(`shape '${layout.shapeName}' does not support side anchors ({ side, t })`);
51
+ if (layout.rect.width === 0 && layout.rect.height === 0) throw new Error(`{ side, t } is not meaningful on a zero-size Coordinate (shape '${layout.shapeName}')`);
52
+ let layoutCache = cache.get(layout);
53
+ if (!layoutCache) {
54
+ layoutCache = /* @__PURE__ */ new Map();
55
+ cache.set(layout, layoutCache);
56
+ }
57
+ const key = `${side}:${t}`;
58
+ const cached = layoutCache.get(key);
59
+ if (cached !== void 0) return cached;
60
+ const result = positionToIR(edgePoint(layout.rect, side, t));
61
+ layoutCache.set(key, result);
62
+ return result;
63
+ };
40
64
  //#endregion
41
- export { resolveAnchor };
65
+ export { resolveAnchor, resolveEdgePoint };
@@ -1,6 +1,5 @@
1
1
  export * from './compile';
2
2
  export * from './node';
3
- export * from './parseTarget';
4
3
  export * from './path/index';
5
4
  export * from './position';
6
5
  export * from './precision';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/compile/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/compile/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/anchor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAM/C;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,QAAQ,EAChB,WAAW,SAAS,EACpB,aAAY,aAAa,CAAC,SAAS,CAAM,KACxC,UAAU,GAAG,IAqBf,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,QAAQ,GACnB,MAAM,UAAU,EAChB,MAAM,UAAU,EAChB,KAAK,IAAI,GAAG,IAAI,KACf,UACqD,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,QAAQ,EAChB,QAAQ,UAAU,EAClB,WAAW,SAAS,EACpB,aAAY,aAAa,CAAC,SAAS,CAAM,KACxC,UAAU,GAAG,IAqBf,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,GAAG,IAAI,EAAE,GAAG,UAAU,GAAG,IAAI,KAAG,OACzB,CAAC;AAE/C,6BAA6B;AAC7B,eAAO,MAAM,WAAW,GAAI,GAAG,UAAU,EAAE,QAAQ,UAAU,EAAE,MAAM,MAAM,KAAG,UAM7E,CAAC"}
1
+ {"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/anchor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAqB/C;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,QAAQ,EAChB,WAAW,SAAS,EACpB,aAAY,aAAa,CAAC,SAAS,CAAM,KACxC,UAAU,GAAG,IAkBf,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,QAAQ,GACnB,MAAM,UAAU,EAChB,MAAM,UAAU,EAChB,KAAK,IAAI,GAAG,IAAI,KACf,UACqD,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,QAAQ,EAChB,QAAQ,UAAU,EAClB,WAAW,SAAS,EACpB,aAAY,aAAa,CAAC,SAAS,CAAM,KACxC,UAAU,GAAG,IAkBf,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,GAAG,IAAI,EAAE,GAAG,UAAU,GAAG,IAAI,KAAG,OACzB,CAAC;AAE/C,6BAA6B;AAC7B,eAAO,MAAM,WAAW,GAAI,GAAG,UAAU,EAAE,QAAQ,UAAU,EAAE,MAAM,MAAM,KAAG,UAM7E,CAAC"}
@@ -1,9 +1,18 @@
1
1
  import { applyTransformChain } from "../scope.js";
2
2
  import { resolvePosition } from "../position.js";
3
3
  import { boundaryPointOf } from "../node.js";
4
- import { resolveAnchor } from "../anchor-cache.js";
5
- import { parseNodeRef } from "../parseTarget.js";
4
+ import { resolveAnchor, resolveEdgePoint } from "../anchor-cache.js";
6
5
  //#region src/compile/path/anchor.ts
6
+ /** target 是否对象形态 NodeTarget(`{ id, anchor?, offset? }`);与 Position(array) / Polar / Offset(of) / Relative 区分(独有 `id`) */
7
+ var isNodeTarget = (t) => typeof t === "object" && !Array.isArray(t) && "id" in t;
8
+ /** 解析 NodeTarget 的 anchor(非 undefined)到世界坐标:命名 / 角度走 resolveAnchor,`{ side, t }` 走 resolveEdgePoint */
9
+ var resolveAnchorRef = (node, anchor) => {
10
+ if (typeof anchor === "number") return resolveAnchor(node, String(anchor));
11
+ if (typeof anchor === "string") return resolveAnchor(node, anchor);
12
+ return resolveEdgePoint(node, anchor.side, anchor.t);
13
+ };
14
+ /** anchor/边点解析后叠加世界系 offset(不随节点 rotate 旋转) */
15
+ var addOffset = (base, offset) => offset ? [base[0] + offset[0], base[1] + offset[1]] : base;
7
16
  /**
8
17
  * 求 step.to 的参考点(给 boundary clip 算方向 / 折角 corner 用)
9
18
  * @description 三态:`'A'`(auto) 节点中心;`'A.<anchor>'`/`'A.<deg>'` 显式锚点 refPoint=endpoint 位置不随邻居变。直接坐标/极坐标解析为笛卡尔。
@@ -12,15 +21,10 @@ import { parseNodeRef } from "../parseTarget.js";
12
21
  * `applyTransformChain` 投回全局。`scopeChain=[]` 等价 v0.1(恒等)。
13
22
  */
14
23
  var refPointOfTarget = (target, nameStack, scopeChain = []) => {
15
- if (typeof target === "string") {
16
- const ref = parseNodeRef(target);
17
- const node = nameStack.lookup(ref.id);
24
+ if (isNodeTarget(target)) {
25
+ const node = nameStack.lookup(target.id);
18
26
  if (!node) return null;
19
- switch (ref.kind) {
20
- case "node": return [node.rect.x, node.rect.y];
21
- case "anchor": return resolveAnchor(node, ref.anchor);
22
- case "angle": return resolveAnchor(node, String(ref.angle));
23
- }
27
+ return addOffset(target.anchor === void 0 ? [node.rect.x, node.rect.y] : resolveAnchorRef(node, target.anchor), target.offset);
24
28
  }
25
29
  if (typeof target === "object" && !Array.isArray(target) && ("relative" in target || "relativeAccumulate" in target)) return null;
26
30
  const local = resolvePosition(target, nameStack, void 0, scopeChain);
@@ -36,15 +40,10 @@ var cornerOf = (prev, curr, via) => via === "-|" ? [curr[0], prev[1]] : [prev[0]
36
40
  * `resolvePosition(..., scopeChain)` 拿到当前 scope 局部坐标后 `applyTransformChain` 投回全局。
37
41
  */
38
42
  var clipForTarget = (target, toward, nameStack, scopeChain = []) => {
39
- if (typeof target === "string") {
40
- const ref = parseNodeRef(target);
41
- const node = nameStack.lookup(ref.id);
43
+ if (isNodeTarget(target)) {
44
+ const node = nameStack.lookup(target.id);
42
45
  if (!node) return null;
43
- switch (ref.kind) {
44
- case "node": return boundaryPointOf(node, toward);
45
- case "anchor": return resolveAnchor(node, ref.anchor);
46
- case "angle": return resolveAnchor(node, String(ref.angle));
47
- }
46
+ return addOffset(target.anchor === void 0 ? boundaryPointOf(node, toward) : resolveAnchorRef(node, target.anchor), target.offset);
48
47
  }
49
48
  if (typeof target === "object" && !Array.isArray(target) && ("relative" in target || "relativeAccumulate" in target)) return null;
50
49
  const local = resolvePosition(target, nameStack, void 0, scopeChain);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EAGX,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAEV,cAAc,EACd,SAAS,EACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AA8BtE,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iCAAiC;IACjC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,IAAI,CAAC;IACX,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACvC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,WAAW,SAAS,EACpB,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAa,YAA+B,EAC5C,WAAU,gBAAqB,KAC9B;IAAE,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAAE,GAAG,IA8gBrE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EAGX,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAEV,cAAc,EACd,SAAS,EACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAkCtE,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iCAAiC;IACjC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,IAAI,CAAC;IACX,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACvC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,WAAW,SAAS,EACpB,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAa,YAA+B,EAC5C,WAAU,gBAAqB,KAC9B;IAAE,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAAE,GAAG,IAkhBrE,CAAC"}
@@ -9,6 +9,8 @@ import { normalizeRelativeTargets } from "./relative.js";
9
9
  import { applyArrowShrinks, computeShrink, endpointArrows } from "./shrink.js";
10
10
  import { splitSubPathsForEndpointArrows } from "./split.js";
11
11
  //#region src/compile/path/index.ts
12
+ /** 目标若是对象 NodeTarget(`{ id, ... }`)返回其 id,否则 undefined——给 UNRESOLVED_NODE_REFERENCE 诊断用 */
13
+ var nodeRefId = (t) => typeof t === "object" && !Array.isArray(t) && "id" in t ? t.id : void 0;
12
14
  /**
13
15
  * 语义 stroke 档位 → 数值(user units)
14
16
  * @description 对齐 TikZ 比例(thin=0.4pt→1=默认 strokeWidth):ultraThin 0.25、veryThin 0.5、thin 1、semithick 1.5、thick 2、veryThick 3、ultraThick 4。显式 strokeWidth 覆盖 thickness。
@@ -56,7 +58,8 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
56
58
  const anchors = steps.map((s, idx) => {
57
59
  if (!hasTo(s)) return null;
58
60
  const ref = refPointOfTarget(s.to, nameStack, scopeChain);
59
- if (!ref && typeof s.to === "string") warn("UNRESOLVED_NODE_REFERENCE", `Step.to references undefined node id '${s.to}'; the entire path is skipped`, `children[${idx}].to`);
61
+ const toId = nodeRefId(s.to);
62
+ if (!ref && toId !== void 0) warn("UNRESOLVED_NODE_REFERENCE", `Step.to references undefined node id '${toId}'; the entire path is skipped`, `children[${idx}].to`);
60
63
  return ref;
61
64
  });
62
65
  /**
@@ -204,8 +207,10 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
204
207
  const fromPt = refPointOfTarget(step.from, nameStack, scopeChain);
205
208
  const toPt = refPointOfTarget(step.to, nameStack, scopeChain);
206
209
  if (!fromPt || !toPt) {
207
- if (!fromPt && typeof step.from === "string") warn("UNRESOLVED_NODE_REFERENCE", `Rectangle from references undefined node id '${step.from}'; the entire path is skipped`, `children[${i}].from`);
208
- if (!toPt && typeof step.to === "string") warn("UNRESOLVED_NODE_REFERENCE", `Rectangle to references undefined node id '${step.to}'; the entire path is skipped`, `children[${i}].to`);
210
+ const fromId = nodeRefId(step.from);
211
+ const rectToId = nodeRefId(step.to);
212
+ if (!fromPt && fromId !== void 0) warn("UNRESOLVED_NODE_REFERENCE", `Rectangle from references undefined node id '${fromId}'; the entire path is skipped`, `children[${i}].from`);
213
+ if (!toPt && rectToId !== void 0) warn("UNRESOLVED_NODE_REFERENCE", `Rectangle to references undefined node id '${rectToId}'; the entire path is skipped`, `children[${i}].to`);
209
214
  return null;
210
215
  }
211
216
  let rectStart = null;
@@ -230,7 +235,8 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
230
235
  if (step.center !== void 0) {
231
236
  const c = refPointOfTarget(step.center, nameStack, scopeChain);
232
237
  if (!c) {
233
- if (typeof step.center === "string") warn("UNRESOLVED_NODE_REFERENCE", `Arc step center references undefined node id '${step.center}'; the entire path is skipped`, `children[${i}].center`);
238
+ const centerId = nodeRefId(step.center);
239
+ if (centerId !== void 0) warn("UNRESOLVED_NODE_REFERENCE", `Arc step center references undefined node id '${centerId}'; the entire path is skipped`, `children[${i}].center`);
234
240
  return null;
235
241
  }
236
242
  center = c;
@@ -0,0 +1,29 @@
1
+ import { Position } from './point';
2
+ /** 边上比例点 `{ side, t }` 的四个 side(north/south/east/west) */
3
+ export type Side = 'north' | 'south' | 'east' | 'west';
4
+ /**
5
+ * rect 四直边 t=0 / t=1 端点对应的角 anchor
6
+ * @description 方向约定单一真源:north/south = 西→东(t=0 在 west 端),east/west = 北→南(t=0 在 north 端)。
7
+ * 仅 rect 直边用两角端点;circle/ellipse 用 `edgeAngleDeg` 角度表、diamond 用过顶点折线。
8
+ */
9
+ export declare const EDGE_ENDS: {
10
+ readonly north: readonly ["north-west", "north-east"];
11
+ readonly south: readonly ["south-west", "south-east"];
12
+ readonly east: readonly ["north-east", "south-east"];
13
+ readonly west: readonly ["north-west", "south-west"];
14
+ };
15
+ /** 线性插值 a + (b − a)·t */
16
+ export declare const lerpPoint: (a: Position, b: Position, t: number) => Position;
17
+ /**
18
+ * circle / ellipse 周长弧段:side 的局部参数角 θ(t),单位度
19
+ * @description 约定同 geometry 既有 `(cosθ, sinθ)` + y 轴向下 ⇒ east=0° / south=90° / west=180° / north=270°,
20
+ * 顺时针为正。每条 side 是一段 90° 弧(等角插值);三点(t=0/0.5/1)与 9-anchor 重合。
21
+ */
22
+ export declare const edgeAngleDeg: (side: Side, t: number) => number;
23
+ /**
24
+ * diamond 过 cardinal 顶点的两段折线
25
+ * @description t∈[0,0.5] 走 p0→vertex、t∈[0.5,1] 走 vertex→p1;t=0.5 恰落 vertex。
26
+ * p0/p1 为相邻边中点 anchor、vertex 为 cardinal 顶点 anchor——全落真实斜边
27
+ */
28
+ export declare const polylineViaVertex: (p0: Position, vertex: Position, p1: Position, t: number) => Position;
29
+ //# sourceMappingURL=_edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_edge.d.ts","sourceRoot":"","sources":["../../../src/geometry/_edge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGxC,0DAA0D;AAC1D,MAAM,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;;;CAK8C,CAAC;AAErE,yBAAyB;AACzB,eAAO,MAAM,SAAS,GAAI,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,KAAG,QAG/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,IAAI,EAAE,GAAG,MAAM,KAAG,MAWpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAC5B,IAAI,QAAQ,EACZ,QAAQ,QAAQ,EAChB,IAAI,QAAQ,EACZ,GAAG,MAAM,KACR,QAA4F,CAAC"}
@@ -0,0 +1,35 @@
1
+ //#region src/geometry/_edge.ts
2
+ /**
3
+ * rect 四直边 t=0 / t=1 端点对应的角 anchor
4
+ * @description 方向约定单一真源:north/south = 西→东(t=0 在 west 端),east/west = 北→南(t=0 在 north 端)。
5
+ * 仅 rect 直边用两角端点;circle/ellipse 用 `edgeAngleDeg` 角度表、diamond 用过顶点折线。
6
+ */
7
+ var EDGE_ENDS = {
8
+ north: ["north-west", "north-east"],
9
+ south: ["south-west", "south-east"],
10
+ east: ["north-east", "south-east"],
11
+ west: ["north-west", "south-west"]
12
+ };
13
+ /** 线性插值 a + (b − a)·t */
14
+ var lerpPoint = (a, b, t) => [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];
15
+ /**
16
+ * circle / ellipse 周长弧段:side 的局部参数角 θ(t),单位度
17
+ * @description 约定同 geometry 既有 `(cosθ, sinθ)` + y 轴向下 ⇒ east=0° / south=90° / west=180° / north=270°,
18
+ * 顺时针为正。每条 side 是一段 90° 弧(等角插值);三点(t=0/0.5/1)与 9-anchor 重合。
19
+ */
20
+ var edgeAngleDeg = (side, t) => {
21
+ switch (side) {
22
+ case "north": return 225 + 90 * t;
23
+ case "south": return 135 - 90 * t;
24
+ case "east": return -45 + 90 * t;
25
+ case "west": return 225 - 90 * t;
26
+ }
27
+ };
28
+ /**
29
+ * diamond 过 cardinal 顶点的两段折线
30
+ * @description t∈[0,0.5] 走 p0→vertex、t∈[0.5,1] 走 vertex→p1;t=0.5 恰落 vertex。
31
+ * p0/p1 为相邻边中点 anchor、vertex 为 cardinal 顶点 anchor——全落真实斜边
32
+ */
33
+ var polylineViaVertex = (p0, vertex, p1, t) => t <= .5 ? lerpPoint(p0, vertex, t * 2) : lerpPoint(vertex, p1, (t - .5) * 2);
34
+ //#endregion
35
+ export { EDGE_ENDS, edgeAngleDeg, lerpPoint, polylineViaVertex };
@@ -1,3 +1,4 @@
1
+ import { Side } from './_edge';
1
2
  import { Position } from './point';
2
3
  import { RectAnchor } from './rect';
3
4
  /** 圆形:几何中心 + 半径,预留旋转字段保持与 Rect 同形 API */
@@ -19,5 +20,7 @@ export declare const circle: {
19
20
  anchor: (c: Circle, name: RectAnchor) => Position;
20
21
  /** 从圆心向 toward 方向射线与圆周交点(Path 端点贴 Node 边界用) */
21
22
  boundaryPoint: (c: Circle, toward: Position) => Position;
23
+ /** 边上比例点:side 的 90° 周长弧段 t∈[0,1] 处(等角,落真实圆周;含旋转) */
24
+ edgePoint: (c: Circle, side: Side, t: number) => Position;
22
25
  };
23
26
  //# sourceMappingURL=circle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"circle.d.ts","sourceRoot":"","sources":["../../../src/geometry/circle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,yCAAyC;AACzC,MAAM,MAAM,MAAM,GAAG;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,SAAS;IACT,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,eAAe;AACf,eAAO,MAAM,MAAM;IACjB,SAAS;gBACG,MAAM,KAAG,QAAQ;IAC7B,oBAAoB;kBACN,MAAM,KAAK,QAAQ,KAAG,OAAO;IAI3C,2BAA2B;gBACf,MAAM,QAAQ,UAAU,KAAG,QAAQ;IAsC/C,+CAA+C;uBAC5B,MAAM,UAAU,QAAQ,KAAG,QAAQ;CAOvD,CAAC"}
1
+ {"version":3,"file":"circle.d.ts","sourceRoot":"","sources":["../../../src/geometry/circle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAgB,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAIzC,yCAAyC;AACzC,MAAM,MAAM,MAAM,GAAG;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,SAAS;IACT,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,eAAe;AACf,eAAO,MAAM,MAAM;IACjB,SAAS;gBACG,MAAM,KAAG,QAAQ;IAC7B,oBAAoB;kBACN,MAAM,KAAK,QAAQ,KAAG,OAAO;IAI3C,2BAA2B;gBACf,MAAM,QAAQ,UAAU,KAAG,QAAQ;IAsC/C,+CAA+C;uBAC5B,MAAM,UAAU,QAAQ,KAAG,QAAQ;IAOtD,oDAAoD;mBACrC,MAAM,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CAIxD,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { localToWorld, worldToLocal } from "./_transform.js";
2
+ import { edgeAngleDeg } from "./_edge.js";
2
3
  //#region src/geometry/circle.ts
4
+ var DEG_TO_RAD = Math.PI / 180;
3
5
  var SQRT_HALF = Math.SQRT1_2;
4
6
  /** 圆形相关基础工具 */
5
7
  var circle = {
@@ -55,6 +57,11 @@ var circle = {
55
57
  if (len === 0) return [c.x, c.y];
56
58
  const t = c.radius / len;
57
59
  return localToWorld(c, [lx * t, ly * t]);
60
+ },
61
+ /** 边上比例点:side 的 90° 周长弧段 t∈[0,1] 处(等角,落真实圆周;含旋转) */
62
+ edgePoint: (c, side, t) => {
63
+ const rad = edgeAngleDeg(side, t) * DEG_TO_RAD;
64
+ return localToWorld(c, [c.radius * Math.cos(rad), c.radius * Math.sin(rad)]);
58
65
  }
59
66
  };
60
67
  //#endregion
@@ -1,3 +1,4 @@
1
+ import { Side } from './_edge';
1
2
  import { Position } from './point';
2
3
  import { RectAnchor } from './rect';
3
4
  /** 菱形:中心 + halfA/halfB 半轴长 + 可选旋转;顶点在 (±halfA,0) 与 (0,±halfB) */
@@ -24,5 +25,7 @@ export declare const diamond: {
24
25
  * @description 菱形方程 |x|/halfA + |y|/halfB = 1;沿方向 (lx,ly) 缩放 t 倍命中:t = 1 / (|lx|/halfA + |ly|/halfB)
25
26
  */
26
27
  boundaryPoint: (d: Diamond, toward: Position) => Position;
28
+ /** 边上比例点:side 过 cardinal 顶点的两段折线 t∈[0,1] 处(落真实斜边;含旋转) */
29
+ edgePoint: (d: Diamond, side: Side, t: number) => Position;
27
30
  };
28
31
  //# sourceMappingURL=diamond.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"diamond.d.ts","sourceRoot":"","sources":["../../../src/geometry/diamond.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,iEAAiE;AACjE,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,oDAAoD;kBACtC,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI5C,sDAAsD;gBAC1C,OAAO,QAAQ,UAAU,KAAG,QAAQ;IAqClD;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;CAOxD,CAAC"}
1
+ {"version":3,"file":"diamond.d.ts","sourceRoot":"","sources":["../../../src/geometry/diamond.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAqB,MAAM,SAAS,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAUzC,iEAAiE;AACjE,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,oDAAoD;kBACtC,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI5C,sDAAsD;gBAC1C,OAAO,QAAQ,UAAU,KAAG,QAAQ;IAqClD;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;IAOvD,yDAAyD;mBAC1C,OAAO,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CASzD,CAAC"}
@@ -1,5 +1,29 @@
1
1
  import { localToWorld, worldToLocal } from "./_transform.js";
2
+ import { polylineViaVertex } from "./_edge.js";
2
3
  //#region src/geometry/diamond.ts
4
+ /** 每条 side 的过顶点折线三 anchor:[邻边中点, cardinal 顶点, 邻边中点](方向 north/south=西→东、east/west=北→南) */
5
+ var DIAMOND_EDGE = {
6
+ north: [
7
+ "north-west",
8
+ "north",
9
+ "north-east"
10
+ ],
11
+ south: [
12
+ "south-west",
13
+ "south",
14
+ "south-east"
15
+ ],
16
+ east: [
17
+ "north-east",
18
+ "east",
19
+ "south-east"
20
+ ],
21
+ west: [
22
+ "north-west",
23
+ "west",
24
+ "south-west"
25
+ ]
26
+ };
3
27
  /** 菱形相关基础工具 */
4
28
  var diamond = {
5
29
  /** 中心 */
@@ -56,6 +80,11 @@ var diamond = {
56
80
  if (denom === 0) return [d.x, d.y];
57
81
  const t = 1 / denom;
58
82
  return localToWorld(d, [lx * t, ly * t]);
83
+ },
84
+ /** 边上比例点:side 过 cardinal 顶点的两段折线 t∈[0,1] 处(落真实斜边;含旋转) */
85
+ edgePoint: (d, side, t) => {
86
+ const [mid0, vertex, mid1] = DIAMOND_EDGE[side];
87
+ return polylineViaVertex(diamond.anchor(d, mid0), diamond.anchor(d, vertex), diamond.anchor(d, mid1), t);
59
88
  }
60
89
  };
61
90
  //#endregion
@@ -1,3 +1,4 @@
1
+ import { Side } from './_edge';
1
2
  import { Position } from './point';
2
3
  import { RectAnchor } from './rect';
3
4
  /** 椭圆:中心 + 半长轴 rx / 半短轴 ry + 可选旋转 */
@@ -27,5 +28,7 @@ export declare const ellipse: {
27
28
  * @description 椭圆方程 (x/rx)² + (y/ry)² = 1;沿 (lx,ly) 缩放 t 倍命中 t = 1 / √((lx/rx)² + (ly/ry)²)
28
29
  */
29
30
  boundaryPoint: (e: Ellipse, toward: Position) => Position;
31
+ /** 边上比例点:side 的 90° 周长弧段 t∈[0,1] 处(等角,落真实椭圆周;含旋转) */
32
+ edgePoint: (e: Ellipse, side: Side, t: number) => Position;
30
33
  };
31
34
  //# sourceMappingURL=ellipse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/geometry/ellipse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,qCAAqC;AACrC,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,0BAA0B;kBACZ,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI9C;;;OAGG;gBACW,OAAO,QAAQ,UAAU,KAAG,QAAQ;IAqClD;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;CAQxD,CAAC"}
1
+ {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/geometry/ellipse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAgB,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAIzC,qCAAqC;AACrC,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,EAAE,EAAE,MAAM,CAAC;IACX,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAIF,eAAe;AACf,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,0BAA0B;kBACZ,OAAO,KAAK,QAAQ,KAAG,OAAO;IAI9C;;;OAGG;gBACW,OAAO,QAAQ,UAAU,KAAG,QAAQ;IAqClD;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;IAQvD,qDAAqD;mBACtC,OAAO,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CAIzD,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { localToWorld, worldToLocal } from "./_transform.js";
2
+ import { edgeAngleDeg } from "./_edge.js";
2
3
  //#region src/geometry/ellipse.ts
4
+ var DEG_TO_RAD = Math.PI / 180;
3
5
  var SQRT_HALF = Math.SQRT1_2;
4
6
  /** 椭圆相关基础工具 */
5
7
  var ellipse = {
@@ -61,6 +63,11 @@ var ellipse = {
61
63
  const b = ly / e.ry;
62
64
  const t = 1 / Math.sqrt(a * a + b * b);
63
65
  return localToWorld(e, [lx * t, ly * t]);
66
+ },
67
+ /** 边上比例点:side 的 90° 周长弧段 t∈[0,1] 处(等角,落真实椭圆周;含旋转) */
68
+ edgePoint: (e, side, t) => {
69
+ const rad = edgeAngleDeg(side, t) * DEG_TO_RAD;
70
+ return localToWorld(e, [e.rx * Math.cos(rad), e.ry * Math.sin(rad)]);
64
71
  }
65
72
  };
66
73
  //#endregion
@@ -1,3 +1,4 @@
1
+ import { Side } from './_edge';
1
2
  import { Position } from './point';
2
3
  /** 轴对齐矩形:几何中心 + 宽高 + 可选绕中心旋转 */
3
4
  export type Rect = {
@@ -31,6 +32,8 @@ export declare const rect: {
31
32
  anchor: (r: Rect, name: RectAnchor) => Position;
32
33
  /** 从中心向 toward 方向射线与矩形边界交点(含旋转),Path 端点贴 Node 边界用 */
33
34
  boundaryPoint: (r: Rect, toward: Position) => Position;
35
+ /** 边上比例点:side 直边 t∈[0,1] 处(两角 anchor 线性插值,含旋转);方向见 EDGE_ENDS */
36
+ edgePoint: (r: Rect, side: Side, t: number) => Position;
34
37
  };
35
38
  /** rectOutline 的命令算子(供 compile 翻译为 PathCommand;几何在 core 下沉,便于未来 rectangle node shape 复用) */
36
39
  export type RectOutlineOp = {
@@ -1 +1 @@
1
- {"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/geometry/rect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,gCAAgC;AAChC,MAAM,MAAM,IAAI,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,YAAY;;;;;;;;;;CAUf,CAAC;AAEX,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE1E,eAAO,MAAM,IAAI;IACf,WAAW;gBACC,IAAI,KAAG,QAAQ;IAC3B,uBAAuB;kBACT,IAAI,KAAK,QAAQ,KAAG,OAAO;IAMzC,sCAAsC;gBAC1B,IAAI,QAAQ,UAAU,KAAG,QAAQ;IAuC7C,qDAAqD;uBAClC,IAAI,UAAU,QAAQ,KAAG,QAAQ;CAUrD,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,iBAAiB,MAAM,KACtB,KAAK,CAAC,aAAa,CAgCrB,CAAC"}
1
+ {"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/geometry/rect.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,IAAI,EAAa,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,gCAAgC;AAChC,MAAM,MAAM,IAAI,GAAG;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,YAAY;;;;;;;;;;CAUf,CAAC;AAEX,+BAA+B;AAC/B,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE1E,eAAO,MAAM,IAAI;IACf,WAAW;gBACC,IAAI,KAAG,QAAQ;IAC3B,uBAAuB;kBACT,IAAI,KAAK,QAAQ,KAAG,OAAO;IAMzC,sCAAsC;gBAC1B,IAAI,QAAQ,UAAU,KAAG,QAAQ;IAuC7C,qDAAqD;uBAClC,IAAI,UAAU,QAAQ,KAAG,QAAQ;IAUpD,gEAAgE;mBACjD,IAAI,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CAItD,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,QAAQ,EACd,IAAI,QAAQ,EACZ,iBAAiB,MAAM,KACtB,KAAK,CAAC,aAAa,CAgCrB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { localToWorld, worldToLocal } from "./_transform.js";
2
+ import { EDGE_ENDS, lerpPoint } from "./_edge.js";
2
3
  //#region src/geometry/rect.ts
3
4
  /** 矩形 9 个标准 anchor 名常量(与 RectAnchor 配对,用 RECT_ANCHORS.NORTH 避免拼错) */
4
5
  var RECT_ANCHORS = {
@@ -71,6 +72,11 @@ var rect = {
71
72
  const ty = localY === 0 ? Infinity : halfH / Math.abs(localY);
72
73
  const t = Math.min(tx, ty);
73
74
  return localToWorld(r, [localX * t, localY * t]);
75
+ },
76
+ /** 边上比例点:side 直边 t∈[0,1] 处(两角 anchor 线性插值,含旋转);方向见 EDGE_ENDS */
77
+ edgePoint: (r, side, t) => {
78
+ const [a, b] = EDGE_ENDS[side];
79
+ return lerpPoint(rect.anchor(r, a), rect.anchor(r, b), t);
74
80
  }
75
81
  };
76
82
  /**
@@ -2,8 +2,8 @@
2
2
  * @retikz/core 公开 API
3
3
  * @description 任何 framework adapter(@retikz/react、@retikz/vue、@retikz/canvas、@retikz/ssr)只能 import 本文件导出内容,不准走子路径。本包零 React/零 DOM 依赖
4
4
  */
5
- export { PositionSchema, PolarPositionSchema, AtPositionSchema, OffsetPositionSchema, AT_DIRECTIONS, TargetSchema, RelativeTargetSchema, RelativeAccumulateTargetSchema, MoveStepSchema, LineStepSchema, FoldStepSchema, CycleStepSchema, CurveStepSchema, CubicStepSchema, BendStepSchema, ArcStepSchema, CirclePathStepSchema, EllipsePathStepSchema, RectangleStepSchema, ControlPointSchema, StepLabelSchema, StepSchema, NodeSchema, NodeLabelSchema, CoordinateSchema, FontSchema, TextBlockSchema, LineSpecSchema, PathSchema, ArrowDetailSchema, ArrowEndDetailSchema, ScopeSchema, NodeDefaultSchema, PathDefaultSchema, LabelDefaultSchema, ArrowDefaultSchema, TransformSchema, ChildSchema, SceneSchema, CURRENT_IR_VERSION, } from './ir';
6
- export type { IRPosition, IRAtPosition, IROffsetPosition, AtDirection, IRTarget, IRRelativeTarget, IRRelativeAccumulateTarget, IRMoveStep, IRLineStep, IRFoldStep, IRCycleStep, IRCurveStep, IRCubicStep, IRBendStep, IRArcStep, IRCirclePathStep, IREllipsePathStep, IRRectangleStep, IRControlPoint, IRStepLabel, IRStep, IRNode, IRNodeLabel, IRCoordinate, IRFont, IRLineSpec, IRTextBlock, IRPath, IRScope, IRNodeDefault, IRPathDefault, IRLabelDefault, IRArrowDefault, StyleChannel, IRTransform, IRTranslateTransform, IRPolarTranslateTransform, IRAtTranslateTransform, IROffsetTranslateTransform, IRRotateTransform, IRScaleTransform, IRChild, IR, ArrowShape, IRArrowDetail, IRArrowEndDetail, NodeShape, BuiltinShapeName, NodeTextAlign, } from './ir';
5
+ export { PositionSchema, PolarPositionSchema, AtPositionSchema, OffsetPositionSchema, AT_DIRECTIONS, TargetSchema, AnchorRefSchema, NodeTargetSchema, RelativeTargetSchema, RelativeAccumulateTargetSchema, MoveStepSchema, LineStepSchema, FoldStepSchema, CycleStepSchema, CurveStepSchema, CubicStepSchema, BendStepSchema, ArcStepSchema, CirclePathStepSchema, EllipsePathStepSchema, RectangleStepSchema, ControlPointSchema, StepLabelSchema, StepSchema, NodeSchema, NodeLabelSchema, CoordinateSchema, FontSchema, TextBlockSchema, LineSpecSchema, PathSchema, ArrowDetailSchema, ArrowEndDetailSchema, ScopeSchema, NodeDefaultSchema, PathDefaultSchema, LabelDefaultSchema, ArrowDefaultSchema, TransformSchema, ChildSchema, SceneSchema, CURRENT_IR_VERSION, } from './ir';
6
+ export type { IRPosition, IRAtPosition, IROffsetPosition, AtDirection, IRTarget, IRAnchorRef, IRNodeTarget, IRRelativeTarget, IRRelativeAccumulateTarget, IRMoveStep, IRLineStep, IRFoldStep, IRCycleStep, IRCurveStep, IRCubicStep, IRBendStep, IRArcStep, IRCirclePathStep, IREllipsePathStep, IRRectangleStep, IRControlPoint, IRStepLabel, IRStep, IRNode, IRNodeLabel, IRCoordinate, IRFont, IRLineSpec, IRTextBlock, IRPath, IRScope, IRNodeDefault, IRPathDefault, IRLabelDefault, IRArrowDefault, StyleChannel, IRTransform, IRTranslateTransform, IRPolarTranslateTransform, IRAtTranslateTransform, IROffsetTranslateTransform, IRRotateTransform, IRScaleTransform, IRChild, IR, ArrowShape, IRArrowDetail, IRArrowEndDetail, NodeShape, BuiltinShapeName, NodeTextAlign, } from './ir';
7
7
  export { ARROW_SHAPES, DEFAULT_ARROW_SHAPE, HOLLOW_ARROW_SHAPES, ARROW_MARKER_DEFAULT_SIZE, ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH, NODE_SHAPES, NODE_TEXT_ALIGNS, } from './ir';
8
8
  export type { ScenePrimitive, RectPrim, EllipsePrim, TextPrim, TextLine, PathPrim, PathCommand,
9
9
  /** 7 个 named PathCommand 分支(便于 wrapper / Pick<>) */
@@ -13,7 +13,7 @@ TranslateTransform, RotateTransform, ScaleTransform, Layout, Scene, } from './pr
13
13
  export type { FontSpec, TextMetrics, TextMeasurer, CompileOptions, CompileWarning, } from './compile';
14
14
  export { computeLayout, fallbackMeasurer, compileToScene } from './compile';
15
15
  export type { WayItem, WayDSL, WayCycle, WayVia, WayRelativeItem, WayLabel, WayLabelOp, } from './parsers';
16
- export { parseWay, DrawWay, parseTargetSugar } from './parsers';
16
+ export { parseWay, DrawWay, parseTargetSugar, parseNodeTarget } from './parsers';
17
17
  export type { Position, Rect, RectAnchor, Circle, Ellipse, Diamond, PolarPosition, } from './geometry';
18
18
  export { point, rect, circle, ellipse, diamond, RECT_ANCHORS, polar } from './geometry';
19
19
  export type { ShapeDefinition, ShapeStyle } from './shapes';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,8BAA8B,EAC9B,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,MAAM,CAAC;AACd,YAAY,EACV,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,0BAA0B,EAC1B,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,WAAW,EACX,MAAM,EACN,MAAM,EACN,WAAW,EACX,YAAY,EACZ,MAAM,EACN,UAAU,EACV,WAAW,EACX,MAAM,EACN,OAAO,EACP,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,OAAO,EACP,EAAE,EACF,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,aAAa,GACd,MAAM,MAAM,CAAC;AACd,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,sCAAsC,EACtC,WAAW,EACX,gBAAgB,GACjB,MAAM,MAAM,CAAC;AAGd,YAAY,EACV,cAAc,EACd,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW;AACX,oDAAoD;AACpD,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,SAAS;AACT,6BAA6B;AAC7B,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,MAAM,EACN,KAAK,GACN,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG5E,YAAY,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,eAAe,EACf,QAAQ,EACR,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAIjF,YAAY,EACV,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxF,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGtE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
package/dist/es/index.js CHANGED
@@ -5,7 +5,9 @@ import { OffsetPositionSchema } from "./ir/position/offset-position.js";
5
5
  import { FontSchema } from "./ir/font.js";
6
6
  import { LineSpecSchema, TextBlockSchema } from "./ir/text.js";
7
7
  import { ARROW_MARKER_DEFAULT_SIZE, ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH, ARROW_SHAPES, ArrowDetailSchema, ArrowEndDetailSchema, DEFAULT_ARROW_SHAPE, HOLLOW_ARROW_SHAPES } from "./ir/path/arrow.js";
8
- import { RelativeAccumulateTargetSchema, RelativeTargetSchema, TargetSchema } from "./ir/path/target.js";
8
+ import { localToWorld, worldToLocal } from "./geometry/_transform.js";
9
+ import { RECT_ANCHORS, rect } from "./geometry/rect.js";
10
+ import { AnchorRefSchema, NodeTargetSchema, RelativeAccumulateTargetSchema, RelativeTargetSchema, TargetSchema } from "./ir/path/target.js";
9
11
  import { ArcStepSchema, BendStepSchema, CirclePathStepSchema, ControlPointSchema, CubicStepSchema, CurveStepSchema, CycleStepSchema, EllipsePathStepSchema, FoldStepSchema, LineStepSchema, MoveStepSchema, RectangleStepSchema, StepLabelSchema, StepSchema } from "./ir/path/step.js";
10
12
  import { PathSchema } from "./ir/path/path.js";
11
13
  import { NODE_SHAPES, NODE_TEXT_ALIGNS, NodeLabelSchema, NodeSchema } from "./ir/node.js";
@@ -13,8 +15,6 @@ import { CoordinateSchema } from "./ir/coordinate.js";
13
15
  import { TransformSchema } from "./ir/transform.js";
14
16
  import { ArrowDefaultSchema, LabelDefaultSchema, NodeDefaultSchema, PathDefaultSchema, ScopeSchema } from "./ir/scope.js";
15
17
  import { CURRENT_IR_VERSION, ChildSchema, SceneSchema } from "./ir/scene.js";
16
- import { localToWorld, worldToLocal } from "./geometry/_transform.js";
17
- import { RECT_ANCHORS, rect } from "./geometry/rect.js";
18
18
  import { circle } from "./geometry/circle.js";
19
19
  import { ellipse } from "./geometry/ellipse.js";
20
20
  import { diamond } from "./geometry/diamond.js";
@@ -22,8 +22,9 @@ import { BUILTIN_SHAPES } from "./shapes/index.js";
22
22
  import { fallbackMeasurer } from "./compile/text-metrics.js";
23
23
  import { computeLayout } from "./compile/layout.js";
24
24
  import { compileToScene } from "./compile/compile.js";
25
+ import { parseNodeTarget } from "./parsers/parseNodeTarget.js";
25
26
  import { parseTargetSugar } from "./parsers/parseTargetSugar.js";
26
27
  import { DrawWay, parseWay } from "./parsers/parseWay.js";
27
28
  import { polar } from "./geometry/polar.js";
28
29
  import { point } from "./geometry/point.js";
29
- export { ARROW_MARKER_DEFAULT_SIZE, ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH, ARROW_SHAPES, AT_DIRECTIONS, ArcStepSchema, ArrowDefaultSchema, ArrowDetailSchema, ArrowEndDetailSchema, AtPositionSchema, BUILTIN_SHAPES, BendStepSchema, CURRENT_IR_VERSION, ChildSchema, CirclePathStepSchema, ControlPointSchema, CoordinateSchema, CubicStepSchema, CurveStepSchema, CycleStepSchema, DEFAULT_ARROW_SHAPE, DrawWay, EllipsePathStepSchema, FoldStepSchema, FontSchema, HOLLOW_ARROW_SHAPES, LabelDefaultSchema, LineSpecSchema, LineStepSchema, MoveStepSchema, NODE_SHAPES, NODE_TEXT_ALIGNS, NodeDefaultSchema, NodeLabelSchema, NodeSchema, OffsetPositionSchema, PathDefaultSchema, PathSchema, PolarPositionSchema, PositionSchema, RECT_ANCHORS, RectangleStepSchema, RelativeAccumulateTargetSchema, RelativeTargetSchema, SceneSchema, ScopeSchema, StepLabelSchema, StepSchema, TargetSchema, TextBlockSchema, TransformSchema, circle, compileToScene, computeLayout, diamond, ellipse, fallbackMeasurer, localToWorld, parseTargetSugar, parseWay, point, polar, rect, worldToLocal };
30
+ export { ARROW_MARKER_DEFAULT_SIZE, ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH, ARROW_SHAPES, AT_DIRECTIONS, AnchorRefSchema, ArcStepSchema, ArrowDefaultSchema, ArrowDetailSchema, ArrowEndDetailSchema, AtPositionSchema, BUILTIN_SHAPES, BendStepSchema, CURRENT_IR_VERSION, ChildSchema, CirclePathStepSchema, ControlPointSchema, CoordinateSchema, CubicStepSchema, CurveStepSchema, CycleStepSchema, DEFAULT_ARROW_SHAPE, DrawWay, EllipsePathStepSchema, FoldStepSchema, FontSchema, HOLLOW_ARROW_SHAPES, LabelDefaultSchema, LineSpecSchema, LineStepSchema, MoveStepSchema, NODE_SHAPES, NODE_TEXT_ALIGNS, NodeDefaultSchema, NodeLabelSchema, NodeSchema, NodeTargetSchema, OffsetPositionSchema, PathDefaultSchema, PathSchema, PolarPositionSchema, PositionSchema, RECT_ANCHORS, RectangleStepSchema, RelativeAccumulateTargetSchema, RelativeTargetSchema, SceneSchema, ScopeSchema, StepLabelSchema, StepSchema, TargetSchema, TextBlockSchema, TransformSchema, circle, compileToScene, computeLayout, diamond, ellipse, fallbackMeasurer, localToWorld, parseNodeTarget, parseTargetSugar, parseWay, point, polar, rect, worldToLocal };
@@ -39,6 +39,7 @@ export declare const CoordinateSchema: z.ZodObject<{
39
39
  }>]>;
40
40
  }, "strip", z.ZodTypeAny, {
41
41
  type: "coordinate";
42
+ id: string;
42
43
  position: [number, number] | import('./position').PolarPosition | {
43
44
  direction: "above" | "below" | "left" | "right" | "above-left" | "above-right" | "below-left" | "below-right";
44
45
  of: string;
@@ -47,9 +48,9 @@ export declare const CoordinateSchema: z.ZodObject<{
47
48
  of: string | [number, number] | import('./position').PolarPosition;
48
49
  offset: [number, number];
49
50
  };
50
- id: string;
51
51
  }, {
52
52
  type: "coordinate";
53
+ id: string;
53
54
  position: [number, number] | import('./position').PolarPosition | {
54
55
  direction: "above" | "below" | "left" | "right" | "above-left" | "above-right" | "below-left" | "below-right";
55
56
  of: string;
@@ -58,7 +59,6 @@ export declare const CoordinateSchema: z.ZodObject<{
58
59
  of: string | [number, number] | import('./position').PolarPosition;
59
60
  offset: [number, number];
60
61
  };
61
- id: string;
62
62
  }>;
63
63
  /** Coordinate IR 类型 `{ type:'coordinate', id, position }` */
64
64
  export type IRCoordinate = z.infer<typeof CoordinateSchema>;
@@ -374,6 +374,7 @@ export declare const NodeSchema: z.ZodObject<{
374
374
  shape?: string | undefined;
375
375
  scale?: number | undefined;
376
376
  color?: string | undefined;
377
+ id?: string | undefined;
377
378
  textColor?: string | undefined;
378
379
  label?: {
379
380
  text: string;
@@ -411,7 +412,6 @@ export declare const NodeSchema: z.ZodObject<{
411
412
  drawOpacity?: number | undefined;
412
413
  zIndex?: number | undefined;
413
414
  rotate?: number | undefined;
414
- id?: string | undefined;
415
415
  align?: "left" | "right" | "center" | undefined;
416
416
  lineHeight?: number | undefined;
417
417
  dashed?: boolean | undefined;
@@ -459,6 +459,7 @@ export declare const NodeSchema: z.ZodObject<{
459
459
  shape?: string | undefined;
460
460
  scale?: number | undefined;
461
461
  color?: string | undefined;
462
+ id?: string | undefined;
462
463
  textColor?: string | undefined;
463
464
  label?: {
464
465
  text: string;
@@ -496,7 +497,6 @@ export declare const NodeSchema: z.ZodObject<{
496
497
  drawOpacity?: number | undefined;
497
498
  zIndex?: number | undefined;
498
499
  rotate?: number | undefined;
499
- id?: string | undefined;
500
500
  align?: "left" | "right" | "center" | undefined;
501
501
  lineHeight?: number | undefined;
502
502
  dashed?: boolean | undefined;