@retikz/core 0.1.0-alpha.4 → 0.1.0-beta.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 (275) hide show
  1. package/dist/es/compile/compile.d.ts +23 -13
  2. package/dist/es/compile/compile.d.ts.map +1 -1
  3. package/dist/es/compile/compile.js +44 -25
  4. package/dist/es/compile/index.d.ts +1 -1
  5. package/dist/es/compile/index.d.ts.map +1 -1
  6. package/dist/es/compile/node.d.ts +40 -59
  7. package/dist/es/compile/node.d.ts.map +1 -1
  8. package/dist/es/compile/node.js +51 -43
  9. package/dist/es/compile/parseTarget.d.ts +3 -8
  10. package/dist/es/compile/parseTarget.d.ts.map +1 -1
  11. package/dist/es/compile/parseTarget.js +7 -19
  12. package/dist/es/compile/path/anchor.d.ts +19 -0
  13. package/dist/es/compile/path/anchor.d.ts.map +1 -0
  14. package/dist/es/compile/path/anchor.js +54 -0
  15. package/dist/es/compile/path/index.d.ts +24 -0
  16. package/dist/es/compile/path/index.d.ts.map +1 -0
  17. package/dist/es/compile/path/index.js +308 -0
  18. package/dist/es/compile/path/label.d.ts +18 -0
  19. package/dist/es/compile/path/label.d.ts.map +1 -0
  20. package/dist/es/compile/path/label.js +102 -0
  21. package/dist/es/compile/path/relative.d.ts +8 -0
  22. package/dist/es/compile/path/relative.d.ts.map +1 -0
  23. package/dist/es/compile/path/relative.js +48 -0
  24. package/dist/es/compile/path/shrink.d.ts +24 -0
  25. package/dist/es/compile/path/shrink.d.ts.map +1 -0
  26. package/dist/es/compile/path/shrink.js +136 -0
  27. package/dist/es/compile/path/split.d.ts +15 -0
  28. package/dist/es/compile/path/split.d.ts.map +1 -0
  29. package/dist/es/compile/path/split.js +46 -0
  30. package/dist/es/compile/position.d.ts +4 -8
  31. package/dist/es/compile/position.d.ts.map +1 -1
  32. package/dist/es/compile/position.js +10 -10
  33. package/dist/es/compile/text-metrics.d.ts +6 -5
  34. package/dist/es/compile/text-metrics.d.ts.map +1 -1
  35. package/dist/es/compile/text-metrics.js +11 -5
  36. package/dist/es/compile/view-box.d.ts +1 -4
  37. package/dist/es/compile/view-box.d.ts.map +1 -1
  38. package/dist/es/compile/view-box.js +1 -4
  39. package/dist/es/geometry/_transform.d.ts +21 -0
  40. package/dist/es/geometry/_transform.d.ts.map +1 -0
  41. package/dist/es/geometry/_transform.js +27 -0
  42. package/dist/es/geometry/arc.d.ts +3 -28
  43. package/dist/es/geometry/arc.d.ts.map +1 -1
  44. package/dist/es/geometry/arc.js +4 -31
  45. package/dist/es/geometry/bend.d.ts +2 -13
  46. package/dist/es/geometry/bend.d.ts.map +1 -1
  47. package/dist/es/geometry/bend.js +2 -13
  48. package/dist/es/geometry/circle.d.ts +6 -15
  49. package/dist/es/geometry/circle.d.ts.map +1 -1
  50. package/dist/es/geometry/circle.js +2 -20
  51. package/dist/es/geometry/diamond.d.ts +10 -26
  52. package/dist/es/geometry/diamond.d.ts.map +1 -1
  53. package/dist/es/geometry/diamond.js +5 -30
  54. package/dist/es/geometry/ellipse.d.ts +10 -17
  55. package/dist/es/geometry/ellipse.d.ts.map +1 -1
  56. package/dist/es/geometry/ellipse.js +5 -24
  57. package/dist/es/geometry/point.d.ts +8 -9
  58. package/dist/es/geometry/point.d.ts.map +1 -1
  59. package/dist/es/geometry/point.js +8 -9
  60. package/dist/es/geometry/polar.d.ts +12 -21
  61. package/dist/es/geometry/polar.d.ts.map +1 -1
  62. package/dist/es/geometry/polar.js +8 -19
  63. package/dist/es/geometry/rect.d.ts +8 -32
  64. package/dist/es/geometry/rect.d.ts.map +1 -1
  65. package/dist/es/geometry/rect.js +6 -49
  66. package/dist/es/geometry/segment.d.ts +15 -18
  67. package/dist/es/geometry/segment.d.ts.map +1 -1
  68. package/dist/es/geometry/segment.js +9 -16
  69. package/dist/es/index.d.ts +13 -13
  70. package/dist/es/index.d.ts.map +1 -1
  71. package/dist/es/index.js +7 -4
  72. package/dist/es/ir/coordinate.d.ts +18 -10
  73. package/dist/es/ir/coordinate.d.ts.map +1 -1
  74. package/dist/es/ir/coordinate.js +6 -11
  75. package/dist/es/ir/font.d.ts +21 -0
  76. package/dist/es/ir/font.d.ts.map +1 -0
  77. package/dist/es/ir/font.js +15 -0
  78. package/dist/es/ir/index.d.ts +2 -0
  79. package/dist/es/ir/index.d.ts.map +1 -1
  80. package/dist/es/ir/node.d.ts +51 -181
  81. package/dist/es/ir/node.d.ts.map +1 -1
  82. package/dist/es/ir/node.js +15 -70
  83. package/dist/es/ir/path/arrow.d.ts +210 -12
  84. package/dist/es/ir/path/arrow.d.ts.map +1 -1
  85. package/dist/es/ir/path/arrow.js +39 -12
  86. package/dist/es/ir/path/path.d.ts +477 -153
  87. package/dist/es/ir/path/path.d.ts.map +1 -1
  88. package/dist/es/ir/path/path.js +6 -6
  89. package/dist/es/ir/path/step.d.ts +395 -223
  90. package/dist/es/ir/path/step.d.ts.map +1 -1
  91. package/dist/es/ir/path/step.js +21 -22
  92. package/dist/es/ir/path/target.d.ts +25 -16
  93. package/dist/es/ir/path/target.d.ts.map +1 -1
  94. package/dist/es/ir/path/target.js +8 -6
  95. package/dist/es/ir/position/at-position.d.ts +4 -11
  96. package/dist/es/ir/position/at-position.d.ts.map +1 -1
  97. package/dist/es/ir/position/at-position.js +2 -9
  98. package/dist/es/ir/position/index.d.ts +1 -0
  99. package/dist/es/ir/position/index.d.ts.map +1 -1
  100. package/dist/es/ir/position/offset-position.d.ts +14 -0
  101. package/dist/es/ir/position/offset-position.d.ts.map +1 -0
  102. package/dist/es/ir/position/offset-position.js +14 -0
  103. package/dist/es/ir/position/polar-position.d.ts +1 -4
  104. package/dist/es/ir/position/polar-position.d.ts.map +1 -1
  105. package/dist/es/ir/position/polar-position.js +3 -6
  106. package/dist/es/ir/position/position.d.ts.map +1 -1
  107. package/dist/es/ir/position/position.js +1 -1
  108. package/dist/es/ir/scene.d.ts +1236 -422
  109. package/dist/es/ir/scene.d.ts.map +1 -1
  110. package/dist/es/ir/text.d.ts +96 -0
  111. package/dist/es/ir/text.d.ts.map +1 -0
  112. package/dist/es/ir/text.js +20 -0
  113. package/dist/es/parsers/parseTargetSugar.d.ts +4 -0
  114. package/dist/es/parsers/parseTargetSugar.d.ts.map +1 -1
  115. package/dist/es/parsers/parseTargetSugar.js +7 -19
  116. package/dist/es/parsers/parseWay.d.ts +26 -118
  117. package/dist/es/parsers/parseWay.d.ts.map +1 -1
  118. package/dist/es/parsers/parseWay.js +19 -61
  119. package/dist/es/primitive/ellipse.d.ts +4 -14
  120. package/dist/es/primitive/ellipse.d.ts.map +1 -1
  121. package/dist/es/primitive/group.d.ts +37 -3
  122. package/dist/es/primitive/group.d.ts.map +1 -1
  123. package/dist/es/primitive/path.d.ts +107 -7
  124. package/dist/es/primitive/path.d.ts.map +1 -1
  125. package/dist/es/primitive/rect.d.ts +2 -2
  126. package/dist/es/primitive/rect.d.ts.map +1 -1
  127. package/dist/es/primitive/scene.d.ts +2 -4
  128. package/dist/es/primitive/scene.d.ts.map +1 -1
  129. package/dist/es/primitive/text.d.ts +16 -32
  130. package/dist/es/primitive/text.d.ts.map +1 -1
  131. package/dist/es/primitive/view-box.d.ts +1 -1
  132. package/dist/es/primitive/view-box.d.ts.map +1 -1
  133. package/dist/es/types.d.ts +8 -0
  134. package/dist/es/types.d.ts.map +1 -1
  135. package/dist/lib/compile/compile.cjs +44 -25
  136. package/dist/lib/compile/compile.d.ts +23 -13
  137. package/dist/lib/compile/compile.d.ts.map +1 -1
  138. package/dist/lib/compile/index.d.ts +1 -1
  139. package/dist/lib/compile/index.d.ts.map +1 -1
  140. package/dist/lib/compile/node.cjs +51 -43
  141. package/dist/lib/compile/node.d.ts +40 -59
  142. package/dist/lib/compile/node.d.ts.map +1 -1
  143. package/dist/lib/compile/parseTarget.cjs +7 -19
  144. package/dist/lib/compile/parseTarget.d.ts +3 -8
  145. package/dist/lib/compile/parseTarget.d.ts.map +1 -1
  146. package/dist/lib/compile/path/anchor.cjs +58 -0
  147. package/dist/lib/compile/path/anchor.d.ts +19 -0
  148. package/dist/lib/compile/path/anchor.d.ts.map +1 -0
  149. package/dist/lib/compile/path/index.cjs +308 -0
  150. package/dist/lib/compile/path/index.d.ts +24 -0
  151. package/dist/lib/compile/path/index.d.ts.map +1 -0
  152. package/dist/lib/compile/path/label.cjs +103 -0
  153. package/dist/lib/compile/path/label.d.ts +18 -0
  154. package/dist/lib/compile/path/label.d.ts.map +1 -0
  155. package/dist/lib/compile/path/relative.cjs +48 -0
  156. package/dist/lib/compile/path/relative.d.ts +8 -0
  157. package/dist/lib/compile/path/relative.d.ts.map +1 -0
  158. package/dist/lib/compile/path/shrink.cjs +138 -0
  159. package/dist/lib/compile/path/shrink.d.ts +24 -0
  160. package/dist/lib/compile/path/shrink.d.ts.map +1 -0
  161. package/dist/lib/compile/path/split.cjs +46 -0
  162. package/dist/lib/compile/path/split.d.ts +15 -0
  163. package/dist/lib/compile/path/split.d.ts.map +1 -0
  164. package/dist/lib/compile/position.cjs +10 -10
  165. package/dist/lib/compile/position.d.ts +4 -8
  166. package/dist/lib/compile/position.d.ts.map +1 -1
  167. package/dist/lib/compile/text-metrics.cjs +11 -5
  168. package/dist/lib/compile/text-metrics.d.ts +6 -5
  169. package/dist/lib/compile/text-metrics.d.ts.map +1 -1
  170. package/dist/lib/compile/view-box.cjs +1 -4
  171. package/dist/lib/compile/view-box.d.ts +1 -4
  172. package/dist/lib/compile/view-box.d.ts.map +1 -1
  173. package/dist/lib/geometry/_transform.cjs +28 -0
  174. package/dist/lib/geometry/_transform.d.ts +21 -0
  175. package/dist/lib/geometry/_transform.d.ts.map +1 -0
  176. package/dist/lib/geometry/arc.cjs +3 -31
  177. package/dist/lib/geometry/arc.d.ts +3 -28
  178. package/dist/lib/geometry/arc.d.ts.map +1 -1
  179. package/dist/lib/geometry/bend.cjs +2 -13
  180. package/dist/lib/geometry/bend.d.ts +2 -13
  181. package/dist/lib/geometry/bend.d.ts.map +1 -1
  182. package/dist/lib/geometry/circle.cjs +6 -24
  183. package/dist/lib/geometry/circle.d.ts +6 -15
  184. package/dist/lib/geometry/circle.d.ts.map +1 -1
  185. package/dist/lib/geometry/diamond.cjs +9 -34
  186. package/dist/lib/geometry/diamond.d.ts +10 -26
  187. package/dist/lib/geometry/diamond.d.ts.map +1 -1
  188. package/dist/lib/geometry/ellipse.cjs +9 -28
  189. package/dist/lib/geometry/ellipse.d.ts +10 -17
  190. package/dist/lib/geometry/ellipse.d.ts.map +1 -1
  191. package/dist/lib/geometry/point.cjs +8 -9
  192. package/dist/lib/geometry/point.d.ts +8 -9
  193. package/dist/lib/geometry/point.d.ts.map +1 -1
  194. package/dist/lib/geometry/polar.cjs +8 -19
  195. package/dist/lib/geometry/polar.d.ts +12 -21
  196. package/dist/lib/geometry/polar.d.ts.map +1 -1
  197. package/dist/lib/geometry/rect.cjs +10 -53
  198. package/dist/lib/geometry/rect.d.ts +8 -32
  199. package/dist/lib/geometry/rect.d.ts.map +1 -1
  200. package/dist/lib/geometry/segment.cjs +9 -16
  201. package/dist/lib/geometry/segment.d.ts +15 -18
  202. package/dist/lib/geometry/segment.d.ts.map +1 -1
  203. package/dist/lib/index.cjs +14 -5
  204. package/dist/lib/index.d.ts +13 -13
  205. package/dist/lib/index.d.ts.map +1 -1
  206. package/dist/lib/ir/coordinate.cjs +6 -11
  207. package/dist/lib/ir/coordinate.d.ts +18 -10
  208. package/dist/lib/ir/coordinate.d.ts.map +1 -1
  209. package/dist/lib/ir/font.cjs +15 -0
  210. package/dist/lib/ir/font.d.ts +21 -0
  211. package/dist/lib/ir/font.d.ts.map +1 -0
  212. package/dist/lib/ir/index.d.ts +2 -0
  213. package/dist/lib/ir/index.d.ts.map +1 -1
  214. package/dist/lib/ir/node.cjs +16 -74
  215. package/dist/lib/ir/node.d.ts +51 -181
  216. package/dist/lib/ir/node.d.ts.map +1 -1
  217. package/dist/lib/ir/path/arrow.cjs +43 -11
  218. package/dist/lib/ir/path/arrow.d.ts +210 -12
  219. package/dist/lib/ir/path/arrow.d.ts.map +1 -1
  220. package/dist/lib/ir/path/path.cjs +5 -5
  221. package/dist/lib/ir/path/path.d.ts +477 -153
  222. package/dist/lib/ir/path/path.d.ts.map +1 -1
  223. package/dist/lib/ir/path/step.cjs +21 -22
  224. package/dist/lib/ir/path/step.d.ts +395 -223
  225. package/dist/lib/ir/path/step.d.ts.map +1 -1
  226. package/dist/lib/ir/path/target.cjs +9 -7
  227. package/dist/lib/ir/path/target.d.ts +25 -16
  228. package/dist/lib/ir/path/target.d.ts.map +1 -1
  229. package/dist/lib/ir/position/at-position.cjs +2 -9
  230. package/dist/lib/ir/position/at-position.d.ts +4 -11
  231. package/dist/lib/ir/position/at-position.d.ts.map +1 -1
  232. package/dist/lib/ir/position/index.d.ts +1 -0
  233. package/dist/lib/ir/position/index.d.ts.map +1 -1
  234. package/dist/lib/ir/position/offset-position.cjs +14 -0
  235. package/dist/lib/ir/position/offset-position.d.ts +14 -0
  236. package/dist/lib/ir/position/offset-position.d.ts.map +1 -0
  237. package/dist/lib/ir/position/polar-position.cjs +3 -6
  238. package/dist/lib/ir/position/polar-position.d.ts +1 -4
  239. package/dist/lib/ir/position/polar-position.d.ts.map +1 -1
  240. package/dist/lib/ir/position/position.cjs +1 -1
  241. package/dist/lib/ir/position/position.d.ts.map +1 -1
  242. package/dist/lib/ir/scene.d.ts +1236 -422
  243. package/dist/lib/ir/scene.d.ts.map +1 -1
  244. package/dist/lib/ir/text.cjs +21 -0
  245. package/dist/lib/ir/text.d.ts +96 -0
  246. package/dist/lib/ir/text.d.ts.map +1 -0
  247. package/dist/lib/parsers/parseTargetSugar.cjs +7 -19
  248. package/dist/lib/parsers/parseTargetSugar.d.ts +4 -0
  249. package/dist/lib/parsers/parseTargetSugar.d.ts.map +1 -1
  250. package/dist/lib/parsers/parseWay.cjs +19 -61
  251. package/dist/lib/parsers/parseWay.d.ts +26 -118
  252. package/dist/lib/parsers/parseWay.d.ts.map +1 -1
  253. package/dist/lib/primitive/ellipse.d.ts +4 -14
  254. package/dist/lib/primitive/ellipse.d.ts.map +1 -1
  255. package/dist/lib/primitive/group.d.ts +37 -3
  256. package/dist/lib/primitive/group.d.ts.map +1 -1
  257. package/dist/lib/primitive/path.d.ts +107 -7
  258. package/dist/lib/primitive/path.d.ts.map +1 -1
  259. package/dist/lib/primitive/rect.d.ts +2 -2
  260. package/dist/lib/primitive/rect.d.ts.map +1 -1
  261. package/dist/lib/primitive/scene.d.ts +2 -4
  262. package/dist/lib/primitive/scene.d.ts.map +1 -1
  263. package/dist/lib/primitive/text.d.ts +16 -32
  264. package/dist/lib/primitive/text.d.ts.map +1 -1
  265. package/dist/lib/primitive/view-box.d.ts +1 -1
  266. package/dist/lib/primitive/view-box.d.ts.map +1 -1
  267. package/dist/lib/types.d.ts +8 -0
  268. package/dist/lib/types.d.ts.map +1 -1
  269. package/package.json +13 -4
  270. package/dist/es/compile/path.d.ts +0 -30
  271. package/dist/es/compile/path.d.ts.map +0 -1
  272. package/dist/es/compile/path.js +0 -617
  273. package/dist/lib/compile/path.cjs +0 -617
  274. package/dist/lib/compile/path.d.ts +0 -30
  275. package/dist/lib/compile/path.d.ts.map +0 -1
@@ -8,22 +8,22 @@ var DEFAULT_FONT_SIZE = 14;
8
8
  var DEFAULT_PADDING = 8;
9
9
  var DEFAULT_LINE_HEIGHT_FACTOR = 1.2;
10
10
  var DEG_TO_RAD = Math.PI / 180;
11
- /** Node label 与 node 边界的默认距离(user units);TikZ 默认是 0pt 但视觉上太贴 */
11
+ /** Node label 与 node 边界默认距离(TikZ 默认 0pt 视觉太贴) */
12
12
  var DEFAULT_LABEL_DISTANCE = 4;
13
13
  var SQRT2 = Math.SQRT2;
14
- /** dashed 预设:SVG stroke-dasharray "4 2"——4 px 实线 + 2 px 间隙循环 */
14
+ /** dashed 预设:4 px 实线 + 2 px 间隙循环 */
15
15
  var DASHED_PATTERN = "4 2";
16
- /** dotted 预设:SVG stroke-dasharray "1 2"——1 px 圆点 + 2 px 间隙 */
16
+ /** dotted 预设:1 px 圆点 + 2 px 间隙 */
17
17
  var DOTTED_PATTERN = "1 2";
18
- /** 解析 dashed / dotted / dashArray 优先级:dashArray > dashed > dotted */
18
+ /** dashed / dotted / dashArray 优先级:dashArray > dashed > dotted */
19
19
  var resolveDashArray = (dashArray, dashed, dotted) => {
20
20
  if (dashArray !== void 0) return dashArray;
21
21
  if (dashed) return DASHED_PATTERN;
22
22
  if (dotted) return DOTTED_PATTERN;
23
23
  };
24
- /** IR `align` ('left' | 'center' | 'right') SVG textAnchor ('start' | 'middle' | 'end') */
24
+ /** IR align → 文字对齐锚点(start / middle / end */
25
25
  var alignToTextAnchor = (a) => a === "left" ? "start" : a === "right" ? "end" : "middle";
26
- /** layout 构造的 Rect(带 margin 扩张) */
26
+ /** layout 构造 Rect(带 margin 扩张) */
27
27
  var rectOf = (layout, marginAdd) => ({
28
28
  x: layout.rect.x,
29
29
  y: layout.rect.y,
@@ -31,14 +31,14 @@ var rectOf = (layout, marginAdd) => ({
31
31
  height: layout.rect.height + 2 * marginAdd,
32
32
  rotate: layout.rect.rotate
33
33
  });
34
- /** layout 构造的 Circle(圆心 + 半径,半径=外接框边长/2 + margin) */
34
+ /** layout 构造 Circle(radius=外接框边长/2 + margin) */
35
35
  var circleOf = (layout, marginAdd) => ({
36
36
  x: layout.rect.x,
37
37
  y: layout.rect.y,
38
38
  radius: layout.rect.width / 2 + marginAdd,
39
39
  rotate: layout.rect.rotate
40
40
  });
41
- /** layout 构造的 Ellipse(rx/ry 各加 margin) */
41
+ /** layout 构造 Ellipse(rx/ry 各加 margin) */
42
42
  var ellipseOf = (layout, marginAdd) => ({
43
43
  x: layout.rect.x,
44
44
  y: layout.rect.y,
@@ -46,7 +46,7 @@ var ellipseOf = (layout, marginAdd) => ({
46
46
  ry: layout.rect.height / 2 + marginAdd,
47
47
  rotate: layout.rect.rotate
48
48
  });
49
- /** layout 构造的 Diamond(halfA/halfB 各加 margin) */
49
+ /** layout 构造 Diamond(halfA/halfB 各加 margin) */
50
50
  var diamondOf = (layout, marginAdd) => ({
51
51
  x: layout.rect.x,
52
52
  y: layout.rect.y,
@@ -55,9 +55,8 @@ var diamondOf = (layout, marginAdd) => ({
55
55
  rotate: layout.rect.rotate
56
56
  });
57
57
  /**
58
- * 取节点 shape 在 toward 方向上的"附着点"——path 端点贴边用。
59
- * 按 shape 多态:rect / circle / ellipse / diamond 各自的 boundaryPoint。
60
- * margin > 0 时形状先外扩,让 path 在 border 外停 margin 个 user units。
58
+ * 取节点 shape 在 toward 方向的附着点(path 端点贴边用)
59
+ * @description 按 shape 多态调用各自 boundaryPoint;margin > 0 时形状先外扩,让 path border 外停 margin
61
60
  */
62
61
  var boundaryPointOf = (layout, toward) => {
63
62
  const m = layout.margin;
@@ -69,9 +68,8 @@ var boundaryPointOf = (layout, toward) => {
69
68
  }
70
69
  };
71
70
  /**
72
- * 取节点 shape 的命名 anchor(center / north / east / north-east 等 9 个)。
73
- * **不应用 margin**——TikZ 语义中 explicit anchor 取的是视觉边界点,不涉及 outer sep
74
- * 用于 `'A.north'` 这种语法落点。
71
+ * 取节点 shape 命名 anchor(center / north / east / north-east 等 9 个)
72
+ * @description 不应用 margin——TikZ 语义中 explicit anchor 取视觉边界点不涉及 outer sep;用于 `'A.north'` 落点
75
73
  */
76
74
  var anchorOf = (layout, name) => {
77
75
  switch (layout.shape) {
@@ -81,10 +79,7 @@ var anchorOf = (layout, name) => {
81
79
  case "diamond": return require_diamond.diamond.anchor(diamondOf(layout, 0), name);
82
80
  }
83
81
  };
84
- /**
85
- * 8 方向 label position → (anchorName, 单位向量) 映射。
86
- * 视觉语义与 `at.direction` 一致——above 是视觉上方(y 减小)。
87
- */
82
+ /** 8 方向 label position → (anchorName, 单位向量);above 视觉上方即 y 减小 */
88
83
  var LABEL_DIRECTION_MAP = {
89
84
  above: {
90
85
  anchor: "north",
@@ -120,9 +115,8 @@ var LABEL_DIRECTION_MAP = {
120
115
  }
121
116
  };
122
117
  /**
123
- * 算 label 中心点:
124
- * - 8 方向:节点对应 anchor 出发,按单位向量 × distance 外推
125
- * - 数字角度:先取 angleBoundary 边界点,再沿 (cos, sin) 单位向量 × distance 外推
118
+ * 算 label 中心点
119
+ * @description 8 方向:节点对应 anchor 出发按单位向量 × distance 外推;数字角度:先取 angleBoundary 边界点再沿 (cos,sin) × distance 外推
126
120
  */
127
121
  var labelCenter = (layout, label) => {
128
122
  if (typeof label.position === "number") {
@@ -135,9 +129,8 @@ var labelCenter = (layout, label) => {
135
129
  return [bx + vec[0] * label.distance, by + vec[1] * label.distance];
136
130
  };
137
131
  /**
138
- * 取节点 shape 在指定角度方向上的边界点。角度约定与 PolarPosition 一致(度数):
139
- * = +x(east),90° = +y(screen 下方)。
140
- * **不应用 margin**——同 anchorOf。用于 `'A.30'` 这种语法落点。
132
+ * 取节点 shape 在指定角度方向的边界点
133
+ * @description 角度约定与 PolarPosition 一致(度数:0°=+x90°=+y screen 下方);不应用 margin(同 anchorOf);用于 `'A.30'` 落点
141
134
  */
142
135
  var angleBoundaryOf = (layout, angleDeg) => {
143
136
  const rad = angleDeg * Math.PI / 180;
@@ -150,12 +143,8 @@ var angleBoundaryOf = (layout, angleDeg) => {
150
143
  }
151
144
  };
152
145
  /**
153
- * IR Node 解析为内部 NodeLayout
154
- * - 算出文本度量与 padding 推导出"内框"半轴 (innerHalfW/H)
155
- * - 按 shape 决定外接边界尺寸(circle 取半对角线、ellipse 各 ×√2、diamond 各 ×2)
156
- * - 解析 position(笛卡尔或极坐标)为几何中心
157
- * - IR 的 rotate(度数)转弧度存进 Rect.rotate
158
- * - 透传 margin / 样式属性
146
+ * IR Node 内部 NodeLayout
147
+ * @description 文本度量 + padding 推内框半轴;按 shape 算外接边界(circle 取半对角线、ellipse ×√2、diamond ×2);解析 position 为几何中心;rotate 度数转弧度
159
148
  */
160
149
  var layoutNode = (node, measureText, nodeIndex, nodeDistance) => {
161
150
  const sx = node.xScale ?? node.scale ?? 1;
@@ -277,7 +266,7 @@ var layoutNode = (node, measureText, nodeIndex, nodeDistance) => {
277
266
  labels
278
267
  };
279
268
  };
280
- /** rectangle shape RectPrim */
269
+ /** rectangle RectPrim */
281
270
  var emitRectShape = (layout, round) => {
282
271
  const halfW = layout.rect.width / 2;
283
272
  const halfH = layout.rect.height / 2;
@@ -297,7 +286,7 @@ var emitRectShape = (layout, round) => {
297
286
  opacity: layout.opacity
298
287
  };
299
288
  };
300
- /** circle / ellipse shape EllipsePrim(圆形 rx=ry) */
289
+ /** circle/ellipse EllipsePrim(圆形 rx=ry) */
301
290
  var emitEllipseShape = (layout, round) => ({
302
291
  type: "ellipse",
303
292
  cx: round(layout.rect.x),
@@ -312,7 +301,7 @@ var emitEllipseShape = (layout, round) => ({
312
301
  strokeDasharray: layout.strokeDasharray,
313
302
  opacity: layout.opacity
314
303
  });
315
- /** diamond shape PathPrim(4 顶点 + Z 闭合) */
304
+ /** diamond PathPrim(4 顶点 + close 闭合) */
316
305
  var emitDiamondShape = (layout, round) => {
317
306
  const diam = diamondOf(layout, 0);
318
307
  const e = require_diamond.diamond.anchor(diam, "east");
@@ -321,7 +310,25 @@ var emitDiamondShape = (layout, round) => {
321
310
  const s = require_diamond.diamond.anchor(diam, "south");
322
311
  return {
323
312
  type: "path",
324
- d: `M ${round(e[0])} ${round(e[1])} L ${round(n[0])} ${round(n[1])} L ${round(w[0])} ${round(w[1])} L ${round(s[0])} ${round(s[1])} Z`,
313
+ commands: [
314
+ {
315
+ kind: "move",
316
+ to: [round(e[0]), round(e[1])]
317
+ },
318
+ {
319
+ kind: "line",
320
+ to: [round(n[0]), round(n[1])]
321
+ },
322
+ {
323
+ kind: "line",
324
+ to: [round(w[0]), round(w[1])]
325
+ },
326
+ {
327
+ kind: "line",
328
+ to: [round(s[0]), round(s[1])]
329
+ },
330
+ { kind: "close" }
331
+ ],
325
332
  fill: layout.fill ?? "transparent",
326
333
  fillOpacity: layout.fillOpacity,
327
334
  stroke: layout.stroke ?? "currentColor",
@@ -332,12 +339,8 @@ var emitDiamondShape = (layout, round) => {
332
339
  };
333
340
  };
334
341
  /**
335
- * NodeLayout 翻译为 Scene primitives
336
- * - shape 主体:按 shape 分发(rect / ellipse / path)
337
- * - text(如有内容):始终走 TextPrim
338
- * - 若有旋转:外面套一层 GroupPrim 用 SVG `rotate(deg cx cy)` 实现
339
- * (PathPrim 的 diamond 顶点已自带旋转坐标,但 text 需要 group 旋转,
340
- * 所以仍统一用 group 包裹)
342
+ * NodeLayout Scene primitives
343
+ * @description shape 主体按 shape 分发(rect/ellipse/path);text 始终走 TextPrim;有旋转时外层 GroupPrim 用 `rotate(deg cx cy)` 统一包裹(text 必须靠 group 旋转)
341
344
  */
342
345
  var emitNodePrimitives = (layout, round) => {
343
346
  let shapePrim;
@@ -398,11 +401,16 @@ var emitNodePrimitives = (layout, round) => {
398
401
  if (layout.rotateDeg === 0) return inner;
399
402
  return [{
400
403
  type: "group",
401
- transform: `rotate(${round(layout.rotateDeg)} ${round(layout.rect.x)} ${round(layout.rect.y)})`,
404
+ transforms: [{
405
+ kind: "rotate",
406
+ degrees: round(layout.rotateDeg),
407
+ cx: round(layout.rect.x),
408
+ cy: round(layout.rect.y)
409
+ }],
402
410
  children: inner
403
411
  }];
404
412
  };
405
- /** 返回 layout 的"未旋转"副本——用于先把 diamond 顶点按未旋转算,再由外层 group 统一旋转 */
413
+ /** layout 的"未旋转"副本,让 diamond 顶点先按未旋转算,外层 group 统一旋转 */
406
414
  var unrotated = (layout) => ({
407
415
  ...layout,
408
416
  rect: {
@@ -4,78 +4,70 @@ import { AtDirection, IRNode, NodeShape } from '../ir';
4
4
  import { ScenePrimitive, TextLine } from '../primitive';
5
5
  import { TextMeasurer } from './text-metrics';
6
6
  export type NodeLayout = {
7
- /** 节点 id(如 IR Node 提供);其他位置可通过 id 引用本节点 */
7
+ /** 节点 id(其他位置可引用) */
8
8
  id?: string;
9
- /** 节点形状——所有几何 / boundaryPoint 计算按 shape 多态 */
9
+ /** 节点形状,所有几何 / boundaryPoint shape 多态 */
10
10
  shape: NodeShape;
11
11
  /**
12
- * 节点视觉边界框(所有 shape 共享语义):
13
- * - rectangle: rect 即矩形本身
14
- * - circle: rect.width = rect.height = 2 × radius(外接正方形)
15
- * - ellipse: rect.width = 2 × rx,rect.height = 2 × ry(外接矩形)
16
- * - diamond: rect.width = 2 × halfA,rect.height = 2 × halfB(外接矩形)
17
- *
18
- * x, y 是几何中心;rotate 是弧度(与 packages/core/AGENTS.md 对齐)。
12
+ * 节点视觉边界框(所有 shape 共享语义)
13
+ * @description rectangle: rect 本身;circle: width=height=2×radius;ellipse: 2×rx,2×ry;diamond: 2×halfA,2×halfB。x,y 是几何中心,rotate 弧度
19
14
  */
20
15
  rect: Rect;
21
- /** IR 中原始的旋转角(度数),保留供 emit 阶段写 SVG transform */
16
+ /** IR 原始旋转角(度数),供 emit 阶段写入 GroupPrim 的 rotate transform */
22
17
  rotateDeg: number;
23
- /** 外边距(user units,≥ 0);path 附着到形状外扩 margin 的虚拟边界上 */
18
+ /** 外边距(≥ 0),path 附着到外扩 margin 的虚拟边界 */
24
19
  margin: number;
25
20
  /**
26
- * 节点文本行;undefined 表示无文本,否则非空数组。
27
- * 每行可带覆盖样式(fill / opacity / fontSize / fontFamily / fontWeight / fontStyle);
28
- * 未覆盖的字段在 emit 阶段不写出,由下游走 TextPrim 块级默认。
21
+ * 节点文本行(undefined 表示无文本,否则非空数组)
22
+ * @description 每行可带覆盖样式(fill/opacity/fontSize/fontFamily/fontWeight/fontStyle),未覆盖字段 emit 阶段不写出由下游走块级默认
29
23
  */
30
24
  lines?: Array<TextLine>;
31
- /** 文本块宽度(user units)= max(per-line measureText.width) */
25
+ /** 文本块宽度 = max(per-line measureText.width) */
32
26
  textWidth: number;
33
- /** 文本块高度(user units)≈ lines × lineHeight */
27
+ /** 文本块高度 lines × lineHeight */
34
28
  textHeight: number;
35
- /** 文本对齐(已映射到 SVG textAnchor 三态);emit 时透传给 TextPrim.align */
29
+ /** 文本对齐(start / middle / end 三态) */
36
30
  align: 'start' | 'middle' | 'end';
37
- /** 行高(user units),已应用默认值;emit 时透传给 TextPrim.lineHeight */
31
+ /** 行高(已应用默认值) */
38
32
  lineHeight: number;
39
- /** 文本字号(user units),已应用默认值 */
33
+ /** 文本字号(已应用默认值) */
40
34
  fontSize: number;
41
- /** 字体族;CSS font-family;emit 时透传给 TextPrim */
35
+ /** 字体族(CSS font-family */
42
36
  fontFamily?: string;
43
- /** 字重;emit 时透传给 TextPrim */
37
+ /** 字重 */
44
38
  fontWeight?: string | number;
45
- /** 字形:normal / italic / oblique;emit 时透传给 TextPrim */
39
+ /** 字形 */
46
40
  fontStyle?: 'normal' | 'italic' | 'oblique';
47
- /** 节点背景色,CSS 颜色字符串;emit 时用 'transparent' 兜底 */
41
+ /** 节点背景色,emit 'transparent' 兜底 */
48
42
  fill?: string;
49
- /** 节点填充透明度 0~1;透传 shape primitive */
43
+ /** 填充透明度 0~1 */
50
44
  fillOpacity?: number;
51
- /** 节点边框色,CSS 颜色字符串;emit 时用 'currentColor' 兜底 */
45
+ /** 节点边框色,emit 'currentColor' 兜底 */
52
46
  stroke?: string;
53
- /** 节点描边透明度 0~1TikZ `draw opacity`,透传 shape primitive */
47
+ /** 描边透明度 0~1TikZ `draw opacity`) */
54
48
  strokeOpacity?: number;
55
- /** 节点边框宽度(user units);emit 时用 1 兜底 */
49
+ /** 边框宽度,emit 1 兜底 */
56
50
  strokeWidth?: number;
57
- /** SVG stroke-dasharray 字符串;compile 已把 dashed / dotted 预设解析为具体 pattern */
51
+ /** 描边 dash 模式(与 SVG/CSS `stroke-dasharray` 同格式),已把 dashed/dotted 预设解析为具体 pattern */
58
52
  strokeDasharray?: string;
59
- /** rectangle shape 的圆角半径(user units);非 rect shape 该字段无效 */
53
+ /** rectangle 圆角半径(非 rect shape 无效) */
60
54
  roundedCorners?: number;
61
- /** 文字颜色;emit 时透传给 TextPrim.fill,兜底 'currentColor' */
55
+ /** 文字颜色,emit 'currentColor' 兜底 */
62
56
  textColor?: string;
63
- /** 整节点透明度 0~1;emit 时同时挂 shape 与 text primitive */
57
+ /** 整节点透明度 0~1(同时挂 shape 与 text primitive */
64
58
  opacity?: number;
65
59
  /**
66
- * 已解析的 label 列表(IR 层 `Node.label` 标准化后)。每条 label 已合并:
67
- * - position 默认 'above'
68
- * - distance 默认 DEFAULT_LABEL_DISTANCE
69
- * - font 字段从 Node 继承(family / size / weight / style 任一未填则取 Node 块级值)
60
+ * 已解析的 label 列表
61
+ * @description IR 层 `Node.label` 标准化:position 默认 'above'、distance 默认 DEFAULT_LABEL_DISTANCE、font 从 Node 继承
70
62
  */
71
63
  labels?: Array<NodeLabelLayout>;
72
64
  };
73
- /** 节点附属标签的 layout——layoutNode 阶段已合并好默认值与样式继承 */
65
+ /** 节点附属标签 layoutlayoutNode 已合并默认值与样式继承) */
74
66
  export type NodeLabelLayout = {
75
67
  text: string;
76
- /** 8 方向枚举或数字角度(与 IR 同形态) */
68
+ /** 8 方向枚举或数字角度 */
77
69
  position: AtDirection | number;
78
- /** 已应用默认值的距离 */
70
+ /** 已应用默认值 */
79
71
  distance: number;
80
72
  textColor?: string;
81
73
  opacity?: number;
@@ -85,39 +77,28 @@ export type NodeLabelLayout = {
85
77
  fontStyle?: 'normal' | 'italic' | 'oblique';
86
78
  };
87
79
  /**
88
- * 取节点 shape 在 toward 方向上的"附着点"——path 端点贴边用。
89
- * 按 shape 多态:rect / circle / ellipse / diamond 各自的 boundaryPoint。
90
- * margin > 0 时形状先外扩,让 path 在 border 外停 margin 个 user units。
80
+ * 取节点 shape 在 toward 方向的附着点(path 端点贴边用)
81
+ * @description 按 shape 多态调用各自 boundaryPoint;margin > 0 时形状先外扩,让 path border 外停 margin
91
82
  */
92
83
  export declare const boundaryPointOf: (layout: NodeLayout, toward: Position) => Position;
93
84
  /**
94
- * 取节点 shape 的命名 anchor(center / north / east / north-east 等 9 个)。
95
- * **不应用 margin**——TikZ 语义中 explicit anchor 取的是视觉边界点,不涉及 outer sep
96
- * 用于 `'A.north'` 这种语法落点。
85
+ * 取节点 shape 命名 anchor(center / north / east / north-east 等 9 个)
86
+ * @description 不应用 margin——TikZ 语义中 explicit anchor 取视觉边界点不涉及 outer sep;用于 `'A.north'` 落点
97
87
  */
98
88
  export declare const anchorOf: (layout: NodeLayout, name: RectAnchor) => Position;
99
89
  /**
100
- * 取节点 shape 在指定角度方向上的边界点。角度约定与 PolarPosition 一致(度数):
101
- * = +x(east),90° = +y(screen 下方)。
102
- * **不应用 margin**——同 anchorOf。用于 `'A.30'` 这种语法落点。
90
+ * 取节点 shape 在指定角度方向的边界点
91
+ * @description 角度约定与 PolarPosition 一致(度数:0°=+x90°=+y screen 下方);不应用 margin(同 anchorOf);用于 `'A.30'` 落点
103
92
  */
104
93
  export declare const angleBoundaryOf: (layout: NodeLayout, angleDeg: number) => Position;
105
94
  /**
106
- * IR Node 解析为内部 NodeLayout
107
- * - 算出文本度量与 padding 推导出"内框"半轴 (innerHalfW/H)
108
- * - 按 shape 决定外接边界尺寸(circle 取半对角线、ellipse 各 ×√2、diamond 各 ×2)
109
- * - 解析 position(笛卡尔或极坐标)为几何中心
110
- * - IR 的 rotate(度数)转弧度存进 Rect.rotate
111
- * - 透传 margin / 样式属性
95
+ * IR Node 内部 NodeLayout
96
+ * @description 文本度量 + padding 推内框半轴;按 shape 算外接边界(circle 取半对角线、ellipse ×√2、diamond ×2);解析 position 为几何中心;rotate 度数转弧度
112
97
  */
113
98
  export declare const layoutNode: (node: IRNode, measureText: TextMeasurer, nodeIndex: Map<string, NodeLayout>, nodeDistance?: number) => NodeLayout;
114
99
  /**
115
- * NodeLayout 翻译为 Scene primitives
116
- * - shape 主体:按 shape 分发(rect / ellipse / path)
117
- * - text(如有内容):始终走 TextPrim
118
- * - 若有旋转:外面套一层 GroupPrim 用 SVG `rotate(deg cx cy)` 实现
119
- * (PathPrim 的 diamond 顶点已自带旋转坐标,但 text 需要 group 旋转,
120
- * 所以仍统一用 group 包裹)
100
+ * NodeLayout Scene primitives
101
+ * @description shape 主体按 shape 分发(rect/ellipse/path);text 始终走 TextPrim;有旋转时外层 GroupPrim 用 `rotate(deg cx cy)` 统一包裹(text 必须靠 group 旋转)
121
102
  */
122
103
  export declare const emitNodePrimitives: (layout: NodeLayout, round: (n: number) => number) => Array<ScenePrimitive>;
123
104
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"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"}
@@ -1,28 +1,16 @@
1
1
  const require_rect = require("../geometry/rect.cjs");
2
2
  //#region src/compile/parseTarget.ts
3
3
  /**
4
- * 节点 ref 字符串扩展语法(ADR-0004):
5
- *
6
- * `'A'` → 节点 A,由 path 自动 boundary clip(auto 模式)
7
- * `'A.<name>'` → 节点 A 的命名 anchor(center/north/south/east/west/north-east/...)
8
- * `'A.<deg>'` → 节点 A 在 degree 角度方向上的边界点(同 PolarPosition 角度约定)
9
- *
10
- * id 约束:`[A-Za-z_][\w-]*`——禁数字开头、禁含 `.`(与 anchor 分隔符冲突);
11
- * anchor 名只接受 alpha.1 首批 9 个 RECT_ANCHORS(其余如 'text' / 'base' / 'mid'
12
- * 留 alpha.2 + 字体改造时再支持);角度纯数字(含可选 `.`/`-`)。
4
+ * 节点 ref 字符串扩展语法
5
+ * @description `'A'`→节点(auto boundary clip);`'A.<name>'`→命名 anchor(center/north/.../north-east);`'A.<deg>'`→角度方向边界点(同 PolarPosition 约定)。id 约束 `[A-Za-z_][\w-]*` 禁数字开头与 `.`;角度纯数字含可选 `.`/`-`
13
6
  */
14
- /** alpha.1 支持的 anchor 名集合(RECT_ANCHORS 的 9 个值) */
7
+ /** RECT_ANCHORS 的 9 anchor 名 */
15
8
  var ANCHOR_NAMES = new Set(Object.values(require_rect.RECT_ANCHORS));
16
- /** 纯数字(可选小数 / 负号),用于识别 `A.30` / `A.-45` / `A.180.5` */
9
+ /** 纯数字识别 `A.30` / `A.-45` / `A.180.5` */
17
10
  var ANGLE_RE = /^-?\d+(\.\d+)?$/;
18
11
  /**
19
- * 解析节点 ref 字符串。
20
- *
21
- * - 不带 `.`:node(auto-clip)
22
- * - 带 `.` 后纯数字:angle(toward 方向上的边界点,与 PolarPosition 同角度约定)
23
- * - 带 `.` 后字母 / 连字符:anchor(命中 ANCHOR_NAMES 才合法,否则抛错)
24
- *
25
- * 抛错路径:未知 anchor 名(避免静默吞掉拼写错误)。
12
+ * 解析节点 ref 字符串
13
+ * @description 不带 `.`→node(auto-clip);带 `.` 后纯数字→angle;带 `.` 后字母/连字符→anchor(不命中 ANCHOR_NAMES 抛错避免静默吞拼写错误)
26
14
  */
27
15
  var parseNodeRef = (s) => {
28
16
  const dot = s.indexOf(".");
@@ -37,7 +25,7 @@ var parseNodeRef = (s) => {
37
25
  id,
38
26
  angle: Number(tail)
39
27
  };
40
- if (!ANCHOR_NAMES.has(tail)) throw new Error(`parseNodeRef: unknown anchor '${tail}' in '${s}' (alpha.1 supports: ${[...ANCHOR_NAMES].join(", ")})`);
28
+ if (!ANCHOR_NAMES.has(tail)) throw new Error(`parseNodeRef: unknown anchor '${tail}' in '${s}' (supports: ${[...ANCHOR_NAMES].join(", ")})`);
41
29
  return {
42
30
  kind: "anchor",
43
31
  id,
@@ -1,5 +1,5 @@
1
1
  import { RectAnchor } from '../geometry/rect';
2
- /** 解析后的节点 ref 三态 */
2
+ /** 节点 ref 解析后三态 */
3
3
  export type ParsedNodeRef = {
4
4
  kind: 'node';
5
5
  id: string;
@@ -13,13 +13,8 @@ export type ParsedNodeRef = {
13
13
  angle: number;
14
14
  };
15
15
  /**
16
- * 解析节点 ref 字符串。
17
- *
18
- * - 不带 `.`:node(auto-clip)
19
- * - 带 `.` 后纯数字:angle(toward 方向上的边界点,与 PolarPosition 同角度约定)
20
- * - 带 `.` 后字母 / 连字符:anchor(命中 ANCHOR_NAMES 才合法,否则抛错)
21
- *
22
- * 抛错路径:未知 anchor 名(避免静默吞掉拼写错误)。
16
+ * 解析节点 ref 字符串
17
+ * @description 不带 `.`→node(auto-clip);带 `.` 后纯数字→angle;带 `.` 后字母/连字符→anchor(不命中 ANCHOR_NAMES 抛错避免静默吞拼写错误)
23
18
  */
24
19
  export declare const parseNodeRef: (s: string) => ParsedNodeRef;
25
20
  //# sourceMappingURL=parseTarget.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseTarget.d.ts","sourceRoot":"","sources":["../../../src/compile/parseTarget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQjE,oBAAoB;AACpB,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,aAcxC,CAAC"}
1
+ {"version":3,"file":"parseTarget.d.ts","sourceRoot":"","sources":["../../../src/compile/parseTarget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQjE,mBAAmB;AACnB,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,aAcxC,CAAC"}
@@ -0,0 +1,58 @@
1
+ const require_position = require("../position.cjs");
2
+ const require_node = require("../node.cjs");
3
+ const require_parseTarget = require("../parseTarget.cjs");
4
+ //#region src/compile/path/anchor.ts
5
+ /**
6
+ * 求 step.to 的参考点(给 boundary clip 算方向 / 折角 corner 用)
7
+ * @description 三态:`'A'`(auto) 节点中心;`'A.<anchor>'`/`'A.<deg>'` 显式锚点 refPoint=endpoint 位置不随邻居变。直接坐标/极坐标解析为笛卡尔
8
+ */
9
+ var refPointOfTarget = (target, nodeIndex) => {
10
+ if (typeof target === "string") {
11
+ const ref = require_parseTarget.parseNodeRef(target);
12
+ const node = nodeIndex.get(ref.id);
13
+ if (!node) return null;
14
+ switch (ref.kind) {
15
+ case "node": return [node.rect.x, node.rect.y];
16
+ case "anchor": return require_node.anchorOf(node, ref.anchor);
17
+ case "angle": return require_node.angleBoundaryOf(node, ref.angle);
18
+ }
19
+ }
20
+ if (typeof target === "object" && !Array.isArray(target) && ("relative" in target || "relativeAccumulate" in target)) return null;
21
+ return require_position.resolvePosition(target, nodeIndex);
22
+ };
23
+ /** 折角中间点:`-|` → (curr.x, prev.y);`|-` → (prev.x, curr.y) */
24
+ var cornerOf = (prev, curr, via) => via === "-|" ? [curr[0], prev[1]] : [prev[0], curr[1]];
25
+ /**
26
+ * 在 toward 方向算 step.to 的实际绘制端点
27
+ * @description 节点 auto `'A'`:按 shape 走 boundaryPointOf 求中心→toward 射线交点;命名 anchor/角度:位置已定不受 toward 影响;直接坐标/极坐标:解析后返回;失败返回 null
28
+ */
29
+ var clipForTarget = (target, toward, nodeIndex) => {
30
+ if (typeof target === "string") {
31
+ const ref = require_parseTarget.parseNodeRef(target);
32
+ const node = nodeIndex.get(ref.id);
33
+ if (!node) return null;
34
+ switch (ref.kind) {
35
+ case "node": return require_node.boundaryPointOf(node, toward);
36
+ case "anchor": return require_node.anchorOf(node, ref.anchor);
37
+ case "angle": return require_node.angleBoundaryOf(node, ref.angle);
38
+ }
39
+ }
40
+ if (typeof target === "object" && !Array.isArray(target) && ("relative" in target || "relativeAccumulate" in target)) return null;
41
+ return require_position.resolvePosition(target, nodeIndex);
42
+ };
43
+ /** 两个 IRPosition 两分量精确相等(未 round) */
44
+ var samePoint = (a, b) => !!a && !!b && a[0] === b[0] && a[1] === b[1];
45
+ /** 把 p 朝 target 方向移动 dist */
46
+ var shiftToward = (p, target, dist) => {
47
+ const dx = target[0] - p[0];
48
+ const dy = target[1] - p[1];
49
+ const len = Math.sqrt(dx * dx + dy * dy);
50
+ if (len === 0 || dist === 0) return p;
51
+ return [p[0] + dx / len * dist, p[1] + dy / len * dist];
52
+ };
53
+ //#endregion
54
+ exports.clipForTarget = clipForTarget;
55
+ exports.cornerOf = cornerOf;
56
+ exports.refPointOfTarget = refPointOfTarget;
57
+ exports.samePoint = samePoint;
58
+ exports.shiftToward = shiftToward;
@@ -0,0 +1,19 @@
1
+ import { IRPosition, IRTarget } from '../../ir';
2
+ import { NodeLayout } from '../node';
3
+ /**
4
+ * 求 step.to 的参考点(给 boundary clip 算方向 / 折角 corner 用)
5
+ * @description 三态:`'A'`(auto) 节点中心;`'A.<anchor>'`/`'A.<deg>'` 显式锚点 refPoint=endpoint 位置不随邻居变。直接坐标/极坐标解析为笛卡尔
6
+ */
7
+ export declare const refPointOfTarget: (target: IRTarget, nodeIndex: Map<string, NodeLayout>) => IRPosition | null;
8
+ /** 折角中间点:`-|` → (curr.x, prev.y);`|-` → (prev.x, curr.y) */
9
+ export declare const cornerOf: (prev: IRPosition, curr: IRPosition, via: "-|" | "|-") => IRPosition;
10
+ /**
11
+ * 在 toward 方向算 step.to 的实际绘制端点
12
+ * @description 节点 auto `'A'`:按 shape 走 boundaryPointOf 求中心→toward 射线交点;命名 anchor/角度:位置已定不受 toward 影响;直接坐标/极坐标:解析后返回;失败返回 null
13
+ */
14
+ export declare const clipForTarget: (target: IRTarget, toward: IRPosition, nodeIndex: Map<string, NodeLayout>) => IRPosition | null;
15
+ /** 两个 IRPosition 两分量精确相等(未 round) */
16
+ export declare const samePoint: (a: IRPosition | null, b: IRPosition | null) => boolean;
17
+ /** 把 p 朝 target 方向移动 dist */
18
+ export declare const shiftToward: (p: IRPosition, target: IRPosition, dist: number) => IRPosition;
19
+ //# sourceMappingURL=anchor.d.ts.map
@@ -0,0 +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,EAAE,KAAK,UAAU,EAA8C,MAAM,SAAS,CAAC;AAItF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,QAAQ,EAChB,WAAW,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,KACjC,UAAU,GAAG,IAmBf,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,QAAQ,GACnB,MAAM,UAAU,EAChB,MAAM,UAAU,EAChB,KAAK,IAAI,GAAG,IAAI,KACf,UACqD,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,QAAQ,EAChB,QAAQ,UAAU,EAClB,WAAW,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,KACjC,UAAU,GAAG,IAmBf,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"}