@retikz/core 0.3.0-beta.1 → 0.3.0-beta.2

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 (203) hide show
  1. package/dist/es/arrows/index.d.ts.map +1 -1
  2. package/dist/es/arrows/index.js +1 -1
  3. package/dist/es/compile/anchor-cache.js +3 -3
  4. package/dist/es/compile/compile.d.ts.map +1 -1
  5. package/dist/es/compile/compile.js +13 -10
  6. package/dist/es/compile/constant.d.ts +1 -3
  7. package/dist/es/compile/constant.d.ts.map +1 -1
  8. package/dist/es/compile/constant.js +2 -4
  9. package/dist/es/compile/node.d.ts +3 -3
  10. package/dist/es/compile/node.d.ts.map +1 -1
  11. package/dist/es/compile/node.js +19 -9
  12. package/dist/es/compile/path/index.d.ts.map +1 -1
  13. package/dist/es/compile/path/index.js +40 -10
  14. package/dist/es/compile/path/label.d.ts.map +1 -1
  15. package/dist/es/compile/path/label.js +8 -4
  16. package/dist/es/compile/scope.d.ts +1 -1
  17. package/dist/es/compile/scope.d.ts.map +1 -1
  18. package/dist/es/compile/scope.js +17 -5
  19. package/dist/es/compile/text-metrics.d.ts +1 -1
  20. package/dist/es/compile/text-metrics.js +2 -2
  21. package/dist/es/geometry/bend.js +1 -1
  22. package/dist/es/geometry/contour.d.ts +5 -0
  23. package/dist/es/geometry/contour.d.ts.map +1 -1
  24. package/dist/es/geometry/contour.js +5 -3
  25. package/dist/es/geometry/diamond.d.ts +7 -1
  26. package/dist/es/geometry/diamond.d.ts.map +1 -1
  27. package/dist/es/geometry/diamond.js +9 -1
  28. package/dist/es/geometry/ellipse.d.ts.map +1 -1
  29. package/dist/es/geometry/ellipse.js +2 -0
  30. package/dist/es/geometry/index.d.ts +4 -0
  31. package/dist/es/geometry/index.d.ts.map +1 -1
  32. package/dist/es/geometry/segment.d.ts +7 -0
  33. package/dist/es/geometry/segment.d.ts.map +1 -1
  34. package/dist/es/geometry/segment.js +24 -1
  35. package/dist/es/index.d.ts +4 -4
  36. package/dist/es/index.d.ts.map +1 -1
  37. package/dist/es/index.js +4 -3
  38. package/dist/es/ir/animation.d.ts +20 -120
  39. package/dist/es/ir/animation.d.ts.map +1 -1
  40. package/dist/es/ir/animation.js +6 -6
  41. package/dist/es/ir/boundary.d.ts +3 -9
  42. package/dist/es/ir/boundary.d.ts.map +1 -1
  43. package/dist/es/ir/clip.d.ts +6 -46
  44. package/dist/es/ir/clip.d.ts.map +1 -1
  45. package/dist/es/ir/composite.d.ts +2 -14
  46. package/dist/es/ir/composite.d.ts.map +1 -1
  47. package/dist/es/ir/coordinate.d.ts +6 -42
  48. package/dist/es/ir/coordinate.d.ts.map +1 -1
  49. package/dist/es/ir/coordinate.js +1 -1
  50. package/dist/es/ir/font.d.ts +10 -13
  51. package/dist/es/ir/font.d.ts.map +1 -1
  52. package/dist/es/ir/json.d.ts +1 -1
  53. package/dist/es/ir/json.d.ts.map +1 -1
  54. package/dist/es/ir/json.js +1 -1
  55. package/dist/es/ir/node.d.ts +123 -770
  56. package/dist/es/ir/node.d.ts.map +1 -1
  57. package/dist/es/ir/node.js +2 -2
  58. package/dist/es/ir/paint.d.ts +13 -91
  59. package/dist/es/ir/paint.d.ts.map +1 -1
  60. package/dist/es/ir/path/arrow.d.ts +4 -117
  61. package/dist/es/ir/path/arrow.d.ts.map +1 -1
  62. package/dist/es/ir/path/path.d.ts +511 -3798
  63. package/dist/es/ir/path/path.d.ts.map +1 -1
  64. package/dist/es/ir/path/path.js +2 -2
  65. package/dist/es/ir/path/step.d.ts +917 -4374
  66. package/dist/es/ir/path/step.d.ts.map +1 -1
  67. package/dist/es/ir/path/step.js +7 -7
  68. package/dist/es/ir/path/target.d.ts +40 -121
  69. package/dist/es/ir/path/target.d.ts.map +1 -1
  70. package/dist/es/ir/position/at-position.d.ts +2 -10
  71. package/dist/es/ir/position/at-position.d.ts.map +1 -1
  72. package/dist/es/ir/position/at-position.js +1 -1
  73. package/dist/es/ir/position/offset-position.d.ts +2 -8
  74. package/dist/es/ir/position/offset-position.d.ts.map +1 -1
  75. package/dist/es/ir/scene.d.ts +17 -181
  76. package/dist/es/ir/scene.d.ts.map +1 -1
  77. package/dist/es/ir/scope.d.ts +283 -8761
  78. package/dist/es/ir/scope.d.ts.map +1 -1
  79. package/dist/es/ir/scope.js +5 -2
  80. package/dist/es/ir/shape.d.ts +2 -8
  81. package/dist/es/ir/shape.d.ts.map +1 -1
  82. package/dist/es/ir/text.d.ts +24 -70
  83. package/dist/es/ir/text.d.ts.map +1 -1
  84. package/dist/es/ir/transform.d.ts +23 -147
  85. package/dist/es/ir/transform.d.ts.map +1 -1
  86. package/dist/es/ir/transform.js +3 -3
  87. package/dist/es/parsers/way.d.ts +1 -1
  88. package/dist/es/parsers/way.js +1 -1
  89. package/dist/es/primitive/marker.d.ts +6 -6
  90. package/dist/es/primitive/marker.d.ts.map +1 -1
  91. package/dist/es/shapes/arc.d.ts.map +1 -1
  92. package/dist/es/shapes/arc.js +23 -4
  93. package/dist/es/shapes/rectangle.js +1 -1
  94. package/dist/es/shapes/shared.d.ts +3 -2
  95. package/dist/es/shapes/shared.d.ts.map +1 -1
  96. package/dist/es/shapes/shared.js +5 -3
  97. package/dist/es/shapes/star.d.ts.map +1 -1
  98. package/dist/es/shapes/star.js +2 -1
  99. package/dist/es/shapes/types.d.ts +10 -3
  100. package/dist/es/shapes/types.d.ts.map +1 -1
  101. package/dist/es/types.d.ts +1 -1
  102. package/dist/lib/arrows/index.cjs +1 -1
  103. package/dist/lib/arrows/index.d.ts.map +1 -1
  104. package/dist/lib/compile/anchor-cache.cjs +3 -3
  105. package/dist/lib/compile/compile.cjs +13 -10
  106. package/dist/lib/compile/compile.d.ts.map +1 -1
  107. package/dist/lib/compile/constant.cjs +2 -4
  108. package/dist/lib/compile/constant.d.ts +1 -3
  109. package/dist/lib/compile/constant.d.ts.map +1 -1
  110. package/dist/lib/compile/node.cjs +19 -9
  111. package/dist/lib/compile/node.d.ts +3 -3
  112. package/dist/lib/compile/node.d.ts.map +1 -1
  113. package/dist/lib/compile/path/index.cjs +39 -9
  114. package/dist/lib/compile/path/index.d.ts.map +1 -1
  115. package/dist/lib/compile/path/label.cjs +8 -4
  116. package/dist/lib/compile/path/label.d.ts.map +1 -1
  117. package/dist/lib/compile/scope.cjs +17 -5
  118. package/dist/lib/compile/scope.d.ts +1 -1
  119. package/dist/lib/compile/scope.d.ts.map +1 -1
  120. package/dist/lib/compile/text-metrics.cjs +2 -2
  121. package/dist/lib/compile/text-metrics.d.ts +1 -1
  122. package/dist/lib/geometry/bend.cjs +1 -1
  123. package/dist/lib/geometry/contour.cjs +5 -3
  124. package/dist/lib/geometry/contour.d.ts +5 -0
  125. package/dist/lib/geometry/contour.d.ts.map +1 -1
  126. package/dist/lib/geometry/diamond.cjs +9 -1
  127. package/dist/lib/geometry/diamond.d.ts +7 -1
  128. package/dist/lib/geometry/diamond.d.ts.map +1 -1
  129. package/dist/lib/geometry/ellipse.cjs +2 -0
  130. package/dist/lib/geometry/ellipse.d.ts.map +1 -1
  131. package/dist/lib/geometry/index.d.ts +4 -0
  132. package/dist/lib/geometry/index.d.ts.map +1 -1
  133. package/dist/lib/geometry/segment.cjs +24 -0
  134. package/dist/lib/geometry/segment.d.ts +7 -0
  135. package/dist/lib/geometry/segment.d.ts.map +1 -1
  136. package/dist/lib/index.cjs +6 -0
  137. package/dist/lib/index.d.ts +4 -4
  138. package/dist/lib/index.d.ts.map +1 -1
  139. package/dist/lib/ir/animation.cjs +6 -6
  140. package/dist/lib/ir/animation.d.ts +20 -120
  141. package/dist/lib/ir/animation.d.ts.map +1 -1
  142. package/dist/lib/ir/boundary.d.ts +3 -9
  143. package/dist/lib/ir/boundary.d.ts.map +1 -1
  144. package/dist/lib/ir/clip.d.ts +6 -46
  145. package/dist/lib/ir/clip.d.ts.map +1 -1
  146. package/dist/lib/ir/composite.d.ts +2 -14
  147. package/dist/lib/ir/composite.d.ts.map +1 -1
  148. package/dist/lib/ir/coordinate.cjs +1 -1
  149. package/dist/lib/ir/coordinate.d.ts +6 -42
  150. package/dist/lib/ir/coordinate.d.ts.map +1 -1
  151. package/dist/lib/ir/font.d.ts +10 -13
  152. package/dist/lib/ir/font.d.ts.map +1 -1
  153. package/dist/lib/ir/json.cjs +1 -1
  154. package/dist/lib/ir/json.d.ts +1 -1
  155. package/dist/lib/ir/json.d.ts.map +1 -1
  156. package/dist/lib/ir/node.cjs +2 -2
  157. package/dist/lib/ir/node.d.ts +123 -770
  158. package/dist/lib/ir/node.d.ts.map +1 -1
  159. package/dist/lib/ir/paint.d.ts +13 -91
  160. package/dist/lib/ir/paint.d.ts.map +1 -1
  161. package/dist/lib/ir/path/arrow.d.ts +4 -117
  162. package/dist/lib/ir/path/arrow.d.ts.map +1 -1
  163. package/dist/lib/ir/path/path.cjs +3 -1
  164. package/dist/lib/ir/path/path.d.ts +511 -3798
  165. package/dist/lib/ir/path/path.d.ts.map +1 -1
  166. package/dist/lib/ir/path/step.cjs +7 -7
  167. package/dist/lib/ir/path/step.d.ts +917 -4374
  168. package/dist/lib/ir/path/step.d.ts.map +1 -1
  169. package/dist/lib/ir/path/target.d.ts +40 -121
  170. package/dist/lib/ir/path/target.d.ts.map +1 -1
  171. package/dist/lib/ir/position/at-position.cjs +1 -1
  172. package/dist/lib/ir/position/at-position.d.ts +2 -10
  173. package/dist/lib/ir/position/at-position.d.ts.map +1 -1
  174. package/dist/lib/ir/position/offset-position.d.ts +2 -8
  175. package/dist/lib/ir/position/offset-position.d.ts.map +1 -1
  176. package/dist/lib/ir/scene.d.ts +17 -181
  177. package/dist/lib/ir/scene.d.ts.map +1 -1
  178. package/dist/lib/ir/scope.cjs +5 -2
  179. package/dist/lib/ir/scope.d.ts +283 -8761
  180. package/dist/lib/ir/scope.d.ts.map +1 -1
  181. package/dist/lib/ir/shape.d.ts +2 -8
  182. package/dist/lib/ir/shape.d.ts.map +1 -1
  183. package/dist/lib/ir/text.d.ts +24 -70
  184. package/dist/lib/ir/text.d.ts.map +1 -1
  185. package/dist/lib/ir/transform.cjs +3 -3
  186. package/dist/lib/ir/transform.d.ts +23 -147
  187. package/dist/lib/ir/transform.d.ts.map +1 -1
  188. package/dist/lib/parsers/way.cjs +1 -1
  189. package/dist/lib/parsers/way.d.ts +1 -1
  190. package/dist/lib/primitive/marker.d.ts +6 -6
  191. package/dist/lib/primitive/marker.d.ts.map +1 -1
  192. package/dist/lib/shapes/arc.cjs +22 -3
  193. package/dist/lib/shapes/arc.d.ts.map +1 -1
  194. package/dist/lib/shapes/rectangle.cjs +1 -1
  195. package/dist/lib/shapes/shared.cjs +5 -3
  196. package/dist/lib/shapes/shared.d.ts +3 -2
  197. package/dist/lib/shapes/shared.d.ts.map +1 -1
  198. package/dist/lib/shapes/star.cjs +2 -1
  199. package/dist/lib/shapes/star.d.ts.map +1 -1
  200. package/dist/lib/shapes/types.d.ts +10 -3
  201. package/dist/lib/shapes/types.d.ts.map +1 -1
  202. package/dist/lib/types.d.ts +1 -1
  203. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/arrows/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAiCjE;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,eAAe,CA2DpE,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/arrows/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAiCjE;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,eAAe,CA6DpE,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
@@ -122,7 +122,7 @@ var BUILTIN_ARROWS = {
122
122
  cy: 5,
123
123
  rx: 4.25,
124
124
  ry: 4.25,
125
- stroke: typeof ctx.stroke === "string" ? ctx.stroke : "context-stroke",
125
+ stroke: typeof ctx.stroke === "string" ? ctx.stroke : { kind: "contextStroke" },
126
126
  strokeWidth: ctx.lineWidth
127
127
  }]
128
128
  }
@@ -9,7 +9,7 @@ import { anchorOf, angleBoundaryOf, outerRectOf } from "./node.js";
9
9
  var cache = /* @__PURE__ */ new WeakMap();
10
10
  /** 角度字符串识别:可选负号 + 数字 + 可选小数;与 parseTarget.ts 的 ANGLE_RE 同语义 */
11
11
  var ANGLE_RE = /^-?\d+(\.\d+)?$/;
12
- /** 把 layout 的 rect 换成外边界 AABB(外扩 outerSep)——border 类 anchor 在其上解析(ADR-07 §1) */
12
+ /** 把 layout 的 rect 换成外边界 AABB(外扩 outerSep)——border 类 anchor(compass / 数字角度)在其上解析 */
13
13
  var withOuterRect = (layout) => ({
14
14
  ...layout,
15
15
  rect: outerRectOf(layout)
@@ -17,8 +17,8 @@ var withOuterRect = (layout) => ({
17
17
  /**
18
18
  * 把 anchorName 解析到对应 shape 的 anchor / boundaryPoint 上
19
19
  * @description 数字字符串走 angleBoundaryOf;其余按标准方位 / shape-specific anchor 走 anchorOf;boundary 透传给两者。
20
- * border 类 anchor(数字角度 + compass 方位名)按 outerSep 外推:在外扩 margin 的 rect(`outerRectOf`)上解析
21
- * (ADR-07 §1)。形状专属命名 anchor(tip-N / apex 等)恒走视觉 rect、不外扩(§3)。`center` 在 inflate 下
20
+ * border 类 anchor(数字角度 + compass 方位名)按 outerSep 外推:在外扩 margin 的 rect(`outerRectOf`)上解析。
21
+ * 形状专属命名 anchor(tip-N / apex 等)恒走视觉 rect、不外扩。`center` 在 inflate 下
22
22
  * 中心不变,走哪条路结果一致。
23
23
  */
24
24
  var computeAnchor = (layout, anchorName, boundary) => {
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/compile/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAA0D,MAAM,OAAO,CAAC;AACxF,OAAO,KAAK,EAAa,KAAK,EAA6B,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,YAAY,CAAC;AAuBpB,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAGrE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAoDhD,2BAA2B;AAC3B,MAAM,MAAM,cAAc,GAAG;IAC3B,oCAAoC;IACpC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACzD;;;;OAIG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACxC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAuLF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,EAAE,EAAE,UAAS,cAAmB,KAAG,KAkXrE,CAAC"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/compile/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAA8D,MAAM,OAAO,CAAC;AAC5F,OAAO,KAAK,EAAa,KAAK,EAA6B,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,YAAY,CAAC;AAuBpB,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAGrE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAoDhD,2BAA2B;AAC3B,MAAM,MAAM,cAAc,GAAG;IAC3B,oCAAoC;IACpC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACzD;;;;OAIG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACxC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAuLF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,EAAE,EAAE,UAAS,cAAmB,KAAG,KAqXrE,CAAC"}
@@ -128,15 +128,14 @@ var collectPlaceholderLocators = (prims, prefix = "primitives") => {
128
128
  });
129
129
  return locators;
130
130
  };
131
- /** scope.transforms 解析失败时根据失败成因映射的 warn code */
132
- var scopeTransformWarnCode = (scope) => {
133
- for (const t of scope.transforms ?? []) {
134
- if (t.kind === "offset-translate") return CompileWarningCode.OffsetBaseUnresolved;
135
- if (t.kind === "at-translate") return CompileWarningCode.AtTargetUnresolved;
136
- if (t.kind === "polar-translate") return CompileWarningCode.PolarOriginUnresolved;
137
- if (t.kind === "between-translate") return CompileWarningCode.UnresolvedNodeReference;
131
+ /** 据**实际解析失败**的那个 transform 的成因映射 warn code(由 lowerScopeTransforms 的 onUnresolved 回调给出) */
132
+ var transformWarnCode = (failed) => {
133
+ switch (failed?.kind) {
134
+ case "offset-translate": return CompileWarningCode.OffsetBaseUnresolved;
135
+ case "at-translate": return CompileWarningCode.AtTargetUnresolved;
136
+ case "polar-translate": return CompileWarningCode.PolarOriginUnresolved;
137
+ default: return CompileWarningCode.UnresolvedNodeReference;
138
138
  }
139
- return CompileWarningCode.UnresolvedNodeReference;
140
139
  };
141
140
  /** 把 DuplicateRegisterInfo 翻成 CompileWarning(含可读 message + 双 IR locator) */
142
141
  var formatDuplicateWarning = (info) => {
@@ -298,9 +297,13 @@ var compileToScene = (ir, options = {}) => {
298
297
  nameStack.register(child.id, coordLayout, `${locatorPrefix}children[${i}].coordinate.id`);
299
298
  layoutsAccumulator.push(coordLayout);
300
299
  } else if (child.type === "scope") {
301
- const loweredOwn = lowerScopeTransforms(child.transforms ?? [], nameStack, nodeDistance, refPointOfTarget);
300
+ const rawTransforms = child.transforms ?? [];
301
+ let failedTransform;
302
+ const loweredOwn = lowerScopeTransforms(rawTransforms, nameStack, nodeDistance, refPointOfTarget, (t) => {
303
+ failedTransform = t;
304
+ });
302
305
  if (loweredOwn === null) onWarn({
303
- code: scopeTransformWarnCode(child),
306
+ code: transformWarnCode(failedTransform),
304
307
  message: `Cannot resolve one of scope.transforms; referent (at.of / offset.of / polar.origin / between endpoints) is undefined or defined later in the IR`,
305
308
  path: `${locatorPrefix}children[${i}].scope.transforms`
306
309
  });
@@ -3,12 +3,9 @@ import { ValueOf } from '../types';
3
3
  export declare const CompileWarningCode: {
4
4
  readonly UnresolvedNodeReference: "UNRESOLVED_NODE_REFERENCE";
5
5
  readonly PathTooShort: "PATH_TOO_SHORT";
6
- readonly AnchorResolutionFailed: "ANCHOR_RESOLUTION_FAILED";
7
6
  readonly OffsetBaseUnresolved: "OFFSET_BASE_UNRESOLVED";
8
7
  readonly PolarOriginUnresolved: "POLAR_ORIGIN_UNRESOLVED";
9
8
  readonly AtTargetUnresolved: "AT_TARGET_UNRESOLVED";
10
- readonly RelativeInitialNoPrevEnd: "RELATIVE_INITIAL_NO_PREV_END";
11
- readonly BboxExtremeInput: "BBOX_EXTREME_INPUT";
12
9
  readonly DuplicateNodeId: "DUPLICATE_NODE_ID";
13
10
  readonly ShapeOverridesBuiltin: "SHAPE_OVERRIDES_BUILTIN";
14
11
  readonly ArrowOverridesBuiltin: "ARROW_OVERRIDES_BUILTIN";
@@ -17,6 +14,7 @@ export declare const CompileWarningCode: {
17
14
  readonly AnimationInvalidProperty: "ANIMATION_INVALID_PROPERTY";
18
15
  readonly ArcMissingRadius: "ARC_MISSING_RADIUS";
19
16
  readonly PartialArcNeedsBothAngles: "PARTIAL_ARC_NEEDS_BOTH_ANGLES";
17
+ readonly PartialArcClosedInvalid: "PARTIAL_ARC_CLOSED_INVALID";
20
18
  };
21
19
  export type CompileWarningCodeValue = ValueOf<typeof CompileWarningCode> | (string & {});
22
20
  /** 编译期 warning:不影响 Scene 产物,交给调用方收集或展示。 */
@@ -1 +1 @@
1
- {"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../../src/compile/constant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;CAiBrB,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAC/B,OAAO,CAAC,OAAO,kBAAkB,CAAC,GAClC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,2CAA2C;AAC3C,MAAM,MAAM,cAAc,GAAG;IAC3B,yBAAyB;IACzB,IAAI,EAAE,uBAAuB,CAAC;IAC9B,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,cAAc,KAAG,MACI,CAAC"}
1
+ {"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../../src/compile/constant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;CAerB,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAC/B,OAAO,CAAC,OAAO,kBAAkB,CAAC,GAClC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,2CAA2C;AAC3C,MAAM,MAAM,cAAc,GAAG;IAC3B,yBAAyB;IACzB,IAAI,EAAE,uBAAuB,CAAC;IAC9B,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,cAAc,KAAG,MACI,CAAC"}
@@ -3,12 +3,9 @@
3
3
  var CompileWarningCode = {
4
4
  UnresolvedNodeReference: "UNRESOLVED_NODE_REFERENCE",
5
5
  PathTooShort: "PATH_TOO_SHORT",
6
- AnchorResolutionFailed: "ANCHOR_RESOLUTION_FAILED",
7
6
  OffsetBaseUnresolved: "OFFSET_BASE_UNRESOLVED",
8
7
  PolarOriginUnresolved: "POLAR_ORIGIN_UNRESOLVED",
9
8
  AtTargetUnresolved: "AT_TARGET_UNRESOLVED",
10
- RelativeInitialNoPrevEnd: "RELATIVE_INITIAL_NO_PREV_END",
11
- BboxExtremeInput: "BBOX_EXTREME_INPUT",
12
9
  DuplicateNodeId: "DUPLICATE_NODE_ID",
13
10
  ShapeOverridesBuiltin: "SHAPE_OVERRIDES_BUILTIN",
14
11
  ArrowOverridesBuiltin: "ARROW_OVERRIDES_BUILTIN",
@@ -16,7 +13,8 @@ var CompileWarningCode = {
16
13
  CompositeNotRegistered: "COMPOSITE_NOT_REGISTERED",
17
14
  AnimationInvalidProperty: "ANIMATION_INVALID_PROPERTY",
18
15
  ArcMissingRadius: "ARC_MISSING_RADIUS",
19
- PartialArcNeedsBothAngles: "PARTIAL_ARC_NEEDS_BOTH_ANGLES"
16
+ PartialArcNeedsBothAngles: "PARTIAL_ARC_NEEDS_BOTH_ANGLES",
17
+ PartialArcClosedInvalid: "PARTIAL_ARC_CLOSED_INVALID"
20
18
  };
21
19
  var formatCompileWarning = (warning) => `[retikz] ${warning.code} at ${warning.path}: ${warning.message}`;
22
20
  //#endregion
@@ -113,7 +113,7 @@ export type NodeLabelLayout = {
113
113
  * @description = `inflateRect(layout.rect, layout.margin)`,中心不变、四向各 +margin。border 类
114
114
  * anchor(compass / 数字角度)解析与 bbox / viewBox / 布局占位都基于这层;视觉 emit / 裁剪 /
115
115
  * 形状专属 anchor / edgePoint / label 附着点仍读 `layout.rect`(不外扩)。单一派生量,不另存字段。
116
- * TikZ outer sep 对齐见 v0.3-beta.1 ADR-07。)
116
+ * (对齐 TikZ outer sep 语义。)
117
117
  */
118
118
  export declare const outerRectOf: (layout: NodeLayout) => Rect;
119
119
  /**
@@ -127,8 +127,8 @@ export declare const boundaryPointOf: (layout: NodeLayout, toward: Position, bou
127
127
  * @description 纯几何:在传入的 `layout.rect` 上求点,本体**不施加 outerSep(margin)**。outerSep 的
128
128
  * 「border 外推」由调用方决定——`anchor-cache.ts` 的 compass 解析先把 rect 外扩 margin(`outerRectOf`)
129
129
  * 再调本函数;`labelBorderPoint` 喂视觉 rect(label 附着点不含 margin)。这样 outer sep 只作用于
130
- * path / position 的 anchor 引用,不波及 label(详见 v0.3-beta.1 ADR-07 §1/§2)。
131
- * compass(9 个 rect 方位名)走连接面 AABB:'shape' 时归一为 'rectangle'(矩形 AABB),其余按 boundary 解析。
130
+ * path / position 的 anchor 引用,不波及 label
131
+ * compass(9 个 rect 方位名):默认连接面先走视觉 shape 自身 compass(ellipse/circle 落真实周长、polygon/rect 落 AABB,与 TikZ 一致),shape 未实现则回退 AABB 矩形;显式 boundary 按其解析。
132
132
  * 形状专属命名 anchor(tip-N / apex 等非 compass 名)恒走视觉形状自身,boundary 不影响。
133
133
  * boundary 缺省 = 'shape'。
134
134
  */
@@ -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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"}
@@ -131,7 +131,7 @@ var inflateRect = (r, m) => m === 0 ? r : {
131
131
  * @description = `inflateRect(layout.rect, layout.margin)`,中心不变、四向各 +margin。border 类
132
132
  * anchor(compass / 数字角度)解析与 bbox / viewBox / 布局占位都基于这层;视觉 emit / 裁剪 /
133
133
  * 形状专属 anchor / edgePoint / label 附着点仍读 `layout.rect`(不外扩)。单一派生量,不另存字段。
134
- * TikZ outer sep 对齐见 v0.3-beta.1 ADR-07。)
134
+ * (对齐 TikZ outer sep 语义。)
135
135
  */
136
136
  var outerRectOf = (layout) => inflateRect(layout.rect, layout.margin);
137
137
  /**
@@ -148,15 +148,23 @@ var boundaryPointOf = (layout, toward, boundary = "shape") => {
148
148
  * @description 纯几何:在传入的 `layout.rect` 上求点,本体**不施加 outerSep(margin)**。outerSep 的
149
149
  * 「border 外推」由调用方决定——`anchor-cache.ts` 的 compass 解析先把 rect 外扩 margin(`outerRectOf`)
150
150
  * 再调本函数;`labelBorderPoint` 喂视觉 rect(label 附着点不含 margin)。这样 outer sep 只作用于
151
- * path / position 的 anchor 引用,不波及 label(详见 v0.3-beta.1 ADR-07 §1/§2)。
152
- * compass(9 个 rect 方位名)走连接面 AABB:'shape' 时归一为 'rectangle'(矩形 AABB),其余按 boundary 解析。
151
+ * path / position 的 anchor 引用,不波及 label
152
+ * compass(9 个 rect 方位名):默认连接面先走视觉 shape 自身 compass(ellipse/circle 落真实周长、polygon/rect 落 AABB,与 TikZ 一致),shape 未实现则回退 AABB 矩形;显式 boundary 按其解析。
153
153
  * 形状专属命名 anchor(tip-N / apex 等非 compass 名)恒走视觉形状自身,boundary 不影响。
154
154
  * boundary 缺省 = 'shape'。
155
155
  */
156
156
  var anchorOf = (layout, name, boundary = "shape") => {
157
157
  const compassAnchor = normalizeCompassAnchor(name);
158
158
  if (compassAnchor !== void 0) {
159
- const { def, rect, params } = resolveBoundary(boundary === "shape" ? "rectangle" : boundary, layout.shapeDef, layout.rect, layout.shapeParams ?? EMPTY_SHAPE_PARAMS, layout.shapes);
159
+ if (boundary === "shape") {
160
+ const own = layout.shapeDef.anchor(layout.rect, compassAnchor, layout.shapeParams ?? EMPTY_SHAPE_PARAMS);
161
+ if (own !== void 0) return own;
162
+ const fallback = resolveBoundary("rectangle", layout.shapeDef, layout.rect, layout.shapeParams ?? EMPTY_SHAPE_PARAMS, layout.shapes);
163
+ const p = fallback.def.anchor(fallback.rect, compassAnchor, fallback.params);
164
+ if (p === void 0) throw new Error(`Unknown anchor '${name}' for shape '${layout.shapeName}'`);
165
+ return p;
166
+ }
167
+ const { def, rect, params } = resolveBoundary(boundary, layout.shapeDef, layout.rect, layout.shapeParams ?? EMPTY_SHAPE_PARAMS, layout.shapes);
160
168
  const p = def.anchor(rect, compassAnchor, params);
161
169
  if (p === void 0) throw new Error(`Unknown anchor '${name}' for shape '${layout.shapeName}'`);
162
170
  return p;
@@ -308,11 +316,13 @@ var layoutNode = (node, measureText, nameStack, nodeDistance, scopeChain = [], l
308
316
  }
309
317
  textHeight = lines.length * lineHeight;
310
318
  }
311
- const minW = node.minimumWidth ?? node.minimumSize ?? 0;
312
- const minH = node.minimumHeight ?? node.minimumSize ?? 0;
313
- const innerHalfW = Math.max(textWidth / 2 + xSep, xSep, minW / 2);
314
- const innerHalfH = Math.max(textHeight / 2 + ySep, ySep, minH / 2);
315
- const { halfWidth: boundsHalfW, halfHeight: boundsHalfH } = shapeDef.circumscribe(innerHalfW, innerHalfH, shapeParams);
319
+ const innerHalfW = Math.max(textWidth / 2 + xSep, xSep);
320
+ const innerHalfH = Math.max(textHeight / 2 + ySep, ySep);
321
+ const circumscribed = shapeDef.circumscribe(innerHalfW, innerHalfH, shapeParams);
322
+ const minHalfW = (node.minimumWidth ?? node.minimumSize ?? 0) * sx / 2;
323
+ const minHalfH = (node.minimumHeight ?? node.minimumSize ?? 0) * sy / 2;
324
+ const boundsHalfW = Math.max(circumscribed.halfWidth, minHalfW);
325
+ const boundsHalfH = Math.max(circumscribed.halfHeight, minHalfH);
316
326
  const rotateDeg = node.rotate ?? 0;
317
327
  const center = resolvePosition(node.position, nameStack, nodeDistance, scopeChain, resolveBetweenGlobal);
318
328
  if (!center) throw new Error(`Cannot resolve position for node ${node.id ?? "(unnamed)"}; polar.origin / at.of / between endpoint may reference an undefined node`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAY9C,OAAO,KAAK,EACV,MAAM,EAEN,UAAU,EAGX,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAIV,cAAc,EACd,SAAS,EACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAKtE,OAAO,EAAE,KAAK,eAAe,EAA2D,MAAM,UAAU,CAAC;AA8FzG,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iCAAiC;IACjC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,wEAAwE;IACxE,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CACnE,CAAC;AA0EF;;;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,IA6xBrE,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAa9C,OAAO,KAAK,EACV,MAAM,EAEN,UAAU,EAGX,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAMV,cAAc,EACd,SAAS,EACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAKtE,OAAO,EAAE,KAAK,eAAe,EAA2D,MAAM,UAAU,CAAC;AAyGzG,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iCAAiC;IACjC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,wEAAwE;IACxE,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CACnE,CAAC;AAkGF;;;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,IAkyBrE,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
@@ -5,7 +5,7 @@ import { BUILTIN_ARROWS } from "../../arrows/index.js";
5
5
  import { CompileWarningCode } from "../constant.js";
6
6
  import { applyTransformChain } from "../scope.js";
7
7
  import { bendControlPoints, outInControlPoints } from "../../geometry/bend.js";
8
- import { arcSegmentSample, circleSegmentSample, cubicSegmentSample, ellipseArcSegmentSample, ellipseSegmentSample, foldSegmentSample, lineSegmentSample, quadSegmentSample } from "../../geometry/segment.js";
8
+ import { arcSegmentSample, circleSegmentSample, cubicSegmentSample, ellipseArcSegmentSample, ellipseSegmentSample, foldSegmentSample, lineSegmentSample, quadSegmentSample, rectPerimeterSample } from "../../geometry/segment.js";
9
9
  import { fallbackMeasurer } from "../text-metrics.js";
10
10
  import { clipForTarget, cornerOf, isAutoBoundaryTarget, refPointOfTarget, samePoint } from "./anchor.js";
11
11
  import { emitLabelPrimitive, tForLabelPosition } from "./label.js";
@@ -14,14 +14,23 @@ import { applyArrowShrinks, endpointArrows, resolveMarkArrowSpec } from "./shrin
14
14
  import { splitSubPathsForEndpointArrows } from "./split.js";
15
15
  //#region src/compile/path/index.ts
16
16
  /**
17
+ * referent(offset.of / polar.origin 的并集形态:节点 id 字符串 / `[x, y]` 字面量 / 嵌套 PolarPosition)里挖节点 id
18
+ * @description 裸字符串即节点 id(offset.of / polar.origin 的 string 分支语义);其余交回 nodeRefId 递归。
19
+ */
20
+ var referentNodeId = (ref) => typeof ref === "string" ? ref : nodeRefId(ref);
21
+ /**
17
22
  * 目标里的一个代表性节点 id——给 UNRESOLVED_NODE_REFERENCE 诊断用
18
23
  * @description 对象 NodeTarget(`{ id, ... }`)直接取 id;between 比例点递归挖端点里第一个节点引用
19
- * (端点未解析时整 between 失败,需照样报 unresolved 而非静默);其余形态返回 undefined。
24
+ * (端点未解析时整 between 失败,需照样报 unresolved 而非静默);OffsetPosition(`{ of }`)/ PolarPosition
25
+ * (`{ origin }`)递归挖其 referent——否则引用未定义节点时 refPoint 为 null 但 toId 为 undefined,整条 path
26
+ * 会被静默丢弃(零诊断);直接坐标 / 极坐标无 origin 等形态返回 undefined。
20
27
  */
21
28
  var nodeRefId = (t) => {
22
29
  if (typeof t !== "object" || Array.isArray(t)) return void 0;
23
30
  if ("id" in t) return t.id;
24
31
  if ("between" in t) return nodeRefId(t.between[0]) ?? nodeRefId(t.between[1]);
32
+ if ("of" in t) return referentNodeId(t.of);
33
+ if ("origin" in t) return referentNodeId(t.origin);
25
34
  };
26
35
  /** 有限数 */
27
36
  var isFiniteNum = (n) => typeof n === "number" && Number.isFinite(n);
@@ -130,13 +139,32 @@ var buildPathTransforms = (rotate, scale, center, round) => {
130
139
  * 把已物化的 arrow marker(局部 baseSize 坐标系,尖端 +x)按路径切线定向放到采样点
131
140
  * @description marker 局部系:viewBox `0 0 baseSize baseSize`,参考点 (refX, baseSize/2),尖端朝 +x。
132
141
  * GroupPrim transforms 数组语义 array[0] 最外层(最后 apply),故链 = translate(point) ∘ rotate(tangentDeg)
133
- * ∘ scale(markerWidth/baseSize, markerHeight/baseSize) ∘ translate(-refX, -baseSize/2):先把参考点移到原点、
134
- * 缩放到目标尺寸、绕切线角旋转、平移到采样点。marker 几何(`MarkerPrimitive[]`)是 ScenePrimitive 的结构子集,直接作 children。
142
+ * ∘ scale(markerWidth·strokeWidth/baseSize, markerHeight·strokeWidth/baseSize) ∘ translate(-refX, -baseSize/2)
143
+ * 先把参考点移到原点、缩放到目标尺寸、绕切线角旋转、平移到采样点。缩放含 strokeWidth 因子,与端点箭头
144
+ * (SVG markerUnits=strokeWidth / Canvas 同口径 ×strokeWidth)一致——中段 mark 随线宽缩放(TikZ 语义)。
145
+ *
146
+ * marker 几何拍平进 Scene 作 children:marker 窄子集结构上是 ScenePrimitive 子集,唯一差异是 fill/stroke 可为
147
+ * `{ kind: 'contextStroke' }`。端点箭头物化成真正的 `<marker>` 时 contextStroke 由 renderer 继承引用方描边;
148
+ * 但中段 mark 是独立 Scene group,已无引用上下文可继承,故在此把 contextStroke 解析成 path 的实际描边色
149
+ * (contextStroke 字符串单位 = path 的已解析 stroke)。
135
150
  */
136
- var buildMarkMarkerGroup = (spec, sample, round) => {
151
+ var resolveMarkerContextFill = (value, contextStroke) => typeof value === "string" ? value : contextStroke;
152
+ /** marker 图元 → Scene 图元:结构同构,仅把 fill/stroke 的 contextStroke 解析成具体描边色(递归 group) */
153
+ var markerPrimToScene = (prim, contextStroke) => {
154
+ if (prim.type === "group") return {
155
+ ...prim,
156
+ children: prim.children.map((c) => markerPrimToScene(c, contextStroke))
157
+ };
158
+ return {
159
+ ...prim,
160
+ ...prim.fill !== void 0 && { fill: resolveMarkerContextFill(prim.fill, contextStroke) },
161
+ ...prim.stroke !== void 0 && { stroke: resolveMarkerContextFill(prim.stroke, contextStroke) }
162
+ };
163
+ };
164
+ var buildMarkMarkerGroup = (spec, sample, strokeWidth, round, contextStroke) => {
137
165
  const angleDeg = Math.atan2(sample.tangent[1], sample.tangent[0]) * 180 / Math.PI;
138
- const sx = spec.markerWidth / spec.baseSize;
139
- const sy = spec.markerHeight / spec.baseSize;
166
+ const sx = spec.markerWidth * strokeWidth / spec.baseSize;
167
+ const sy = spec.markerHeight * strokeWidth / spec.baseSize;
140
168
  const refY = spec.baseSize / 2;
141
169
  return {
142
170
  type: "group",
@@ -161,7 +189,7 @@ var buildMarkMarkerGroup = (spec, sample, round) => {
161
189
  y: round(-refY)
162
190
  }
163
191
  ],
164
- children: [...spec.marker]
192
+ children: spec.marker.map((p) => markerPrimToScene(p, contextStroke))
165
193
  };
166
194
  };
167
195
  /**
@@ -344,7 +372,7 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
344
372
  const resolvePartialClosed = (closed, idx) => {
345
373
  if (closed === "open") return "open";
346
374
  if (closed === "sector") return "sector";
347
- if (closed === "closed") warn("PARTIAL_ARC_CLOSED_INVALID", "Partial circle/ellipse (with angles) cannot use closed:'closed'; falling back to 'chord'", `children[${idx}]`);
375
+ if (closed === "closed") warn(CompileWarningCode.PartialArcClosedInvalid, "Partial circle/ellipse (with angles) cannot use closed:'closed'; falling back to 'chord'", `children[${idx}]`);
348
376
  return "chord";
349
377
  };
350
378
  for (let i = 0; i < steps.length; i++) {
@@ -435,6 +463,7 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
435
463
  const fromClip = usedOverride ?? (prev ? clipForTarget(prev.step.to, moveAnchor, nameStack, scopeChain) : null);
436
464
  const toClip = clipForTarget(moveTo, fromClip ?? prev?.anchor ?? moveAnchor, nameStack, scopeChain);
437
465
  if (!fromClip || !toClip) return null;
466
+ segmentSamplers.push((t) => lineSegmentSample(fromClip, toClip, t));
438
467
  if (samePoint(fromClip, lastEnd) && samePoint(toClip, subPathStart)) {
439
468
  emitClose();
440
469
  continue;
@@ -465,6 +494,7 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
465
494
  const ry0 = Math.min(fromPt[1], toPt[1]);
466
495
  const ry1 = Math.max(fromPt[1], toPt[1]);
467
496
  points.push([rx0, ry0], [rx1, ry0], [rx1, ry1], [rx0, ry1]);
497
+ segmentSamplers.push((t) => rectPerimeterSample(fromPt, toPt, t));
468
498
  if (rectStart) penOverride = rectStart;
469
499
  continue;
470
500
  }
@@ -646,7 +676,7 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
646
676
  const localT = scaled - segIdx;
647
677
  const sample = segmentSamplers[segIdx](pos === 1 ? 1 : localT);
648
678
  const spec = resolveMarkArrowSpec(mark, effectiveArrows, round);
649
- markPrims.push(buildMarkMarkerGroup(spec, sample, round));
679
+ markPrims.push(buildMarkMarkerGroup(spec, sample, strokeWidth, round, baseProps.stroke ?? "currentColor"));
650
680
  points.push(sample.point);
651
681
  }
652
682
  }
@@ -1 +1 @@
1
- {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAmBpD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,WAAW,CAAC,UAAU,CAAC,KAAG,MAIhE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,WAAW,EAClB,QAAQ,aAAa,EACrB,aAAa,YAAY,EACzB,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAc,MAAM,KACnB;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAmGxD,CAAC"}
1
+ {"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAmBpD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,WAAW,CAAC,UAAU,CAAC,KAAG,MAIhE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,WAAW,EAClB,QAAQ,aAAa,EACrB,aAAa,YAAY,EACzB,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAc,MAAM,KACnB;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAyGxD,CAAC"}
@@ -103,13 +103,17 @@ var emitLabelPrimitive = (label, sample, measureText, round, hostOpacity) => {
103
103
  }
104
104
  const halfW = measuredWidth / 2;
105
105
  const halfH = measuredHeight / 2;
106
+ const left = align === "start" ? x : align === "end" ? x - measuredWidth : x - halfW;
107
+ const right = align === "start" ? x + measuredWidth : align === "end" ? x : x + halfW;
108
+ const top = baseline === "top" ? y : baseline === "bottom" ? y - measuredHeight : y - halfH;
109
+ const bottom = baseline === "top" ? y + measuredHeight : baseline === "bottom" ? y : y + halfH;
106
110
  return {
107
111
  primitive: text,
108
112
  points: [
109
- [x - halfW, y - halfH],
110
- [x + halfW, y - halfH],
111
- [x - halfW, y + halfH],
112
- [x + halfW, y + halfH]
113
+ [left, top],
114
+ [right, top],
115
+ [left, bottom],
116
+ [right, bottom]
113
117
  ]
114
118
  };
115
119
  };
@@ -10,7 +10,7 @@ import { ResolveBetweenGlobal } from './position';
10
10
  * 各自构造对应 Position 字面量并调用 `resolvePosition` 拿到 Cartesian (x, y),再写成 Cartesian translate;
11
11
  * rotate / scale 直接透传。referent 未解析时返回 null(上游负责发 warn / throw)
12
12
  */
13
- export declare const lowerScopeTransforms: (transforms: ReadonlyArray<IRTransform>, nameStack: NameStack, nodeDistance?: number, resolveBetweenGlobal?: ResolveBetweenGlobal) => Array<Transform> | null;
13
+ export declare const lowerScopeTransforms: (transforms: ReadonlyArray<IRTransform>, nameStack: NameStack, nodeDistance?: number, resolveBetweenGlobal?: ResolveBetweenGlobal, onUnresolved?: (failed: IRTransform) => void) => Array<Transform> | null;
14
14
  /**
15
15
  * 把局部坐标点 (x, y) 按 Cartesian-only transform 链 apply 到全局坐标
16
16
  * @description 数组语义与 SVG `transform="t0 t1 t2"` / TikZ scope option 顺序一致:
@@ -1 +1 @@
1
- {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/compile/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,UAAU,EACV,WAAW,EAEZ,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,KAAK,oBAAoB,EAAmB,MAAM,YAAY,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,YAAY,aAAa,CAAC,WAAW,CAAC,EACtC,WAAW,SAAS,EACpB,eAAe,MAAM,EACrB,uBAAuB,oBAAoB,KAC1C,KAAK,CAAC,SAAS,CAAC,GAAG,IAwDrB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,UAAU,EACjB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UAyBF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UAgCF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UA4BF,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,SAAS,aAAa,CAAC,UAAU,CAAC,KACjC,gBAAgB,GAAG,IA6BrB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,IAAI,MAAM,EACV,MAAM,gBAAgB,GAAG,IAAI,EAC7B,gBAAgB,UAAU,EAC1B,SAAQ,MAAM,CAAC,MAAM,EAAE,eAAe,CAAkB,KACvD,UAiBF,CAAC"}
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/compile/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,UAAU,EACV,WAAW,EAEZ,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,KAAK,oBAAoB,EAAmB,MAAM,YAAY,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,YAAY,aAAa,CAAC,WAAW,CAAC,EACtC,WAAW,SAAS,EACpB,eAAe,MAAM,EACrB,uBAAuB,oBAAoB,EAC3C,eAAe,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,KAC3C,KAAK,CAAC,SAAS,CAAC,GAAG,IAoErB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,UAAU,EACjB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UAyBF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UA+BF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UA4BF,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,SAAS,aAAa,CAAC,UAAU,CAAC,KACjC,gBAAgB,GAAG,IA6BrB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,IAAI,MAAM,EACV,MAAM,gBAAgB,GAAG,IAAI,EAC7B,gBAAgB,UAAU,EAC1B,SAAQ,MAAM,CAAC,MAAM,EAAE,eAAe,CAAkB,KACvD,UAiBF,CAAC"}
@@ -9,7 +9,7 @@ import { outerRectOf } from "./node.js";
9
9
  * 各自构造对应 Position 字面量并调用 `resolvePosition` 拿到 Cartesian (x, y),再写成 Cartesian translate;
10
10
  * rotate / scale 直接透传。referent 未解析时返回 null(上游负责发 warn / throw)
11
11
  */
12
- var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenGlobal) => {
12
+ var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenGlobal, onUnresolved) => {
13
13
  const out = [];
14
14
  for (const t of transforms) switch (t.kind) {
15
15
  case "translate":
@@ -26,7 +26,10 @@ var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenG
26
26
  };
27
27
  if (t.origin !== void 0) polar.origin = t.origin;
28
28
  const resolved = resolvePosition(polar, nameStack, nodeDistance);
29
- if (!resolved) return null;
29
+ if (!resolved) {
30
+ onUnresolved?.(t);
31
+ return null;
32
+ }
30
33
  out.push({
31
34
  kind: "translate",
32
35
  x: resolved[0],
@@ -41,7 +44,10 @@ var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenG
41
44
  };
42
45
  if (t.distance !== void 0) at.distance = t.distance;
43
46
  const resolved = resolvePosition(at, nameStack, nodeDistance);
44
- if (!resolved) return null;
47
+ if (!resolved) {
48
+ onUnresolved?.(t);
49
+ return null;
50
+ }
45
51
  out.push({
46
52
  kind: "translate",
47
53
  x: resolved[0],
@@ -54,7 +60,10 @@ var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenG
54
60
  of: t.of,
55
61
  offset: t.offset ?? [0, 0]
56
62
  }, nameStack, nodeDistance);
57
- if (!resolved) return null;
63
+ if (!resolved) {
64
+ onUnresolved?.(t);
65
+ return null;
66
+ }
58
67
  out.push({
59
68
  kind: "translate",
60
69
  x: resolved[0],
@@ -67,7 +76,10 @@ var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenG
67
76
  between: t.between,
68
77
  t: t.t
69
78
  }, nameStack, nodeDistance, [], resolveBetweenGlobal);
70
- if (!resolved) return null;
79
+ if (!resolved) {
80
+ onUnresolved?.(t);
81
+ return null;
82
+ }
71
83
  out.push({
72
84
  kind: "translate",
73
85
  x: resolved[0],
@@ -27,7 +27,7 @@ export type TextMetrics = {
27
27
  export type TextMeasurer = (text: string, font: FontSpec) => TextMetrics;
28
28
  /**
29
29
  * 默认 fallback 度量:基于平均字宽估算,不准但保证可运行
30
- * @description size=0 → 退化返回 (0, 0)(与 text='' 一致);负 size NaN size → throw(非法输入早 fail,避免 NaN 噪音传播到 Scene)
30
+ * @description size=0 → 退化返回 (0, 0)(与 text='' 一致);负 size 或非有限(NaN / Infinity)size → throw(非法输入早 fail,避免 NaN / Infinity 传播到 Scene)
31
31
  */
32
32
  export declare const fallbackMeasurer: TextMeasurer;
33
33
  //# sourceMappingURL=text-metrics.d.ts.map
@@ -1,10 +1,10 @@
1
1
  //#region src/compile/text-metrics.ts
2
2
  /**
3
3
  * 默认 fallback 度量:基于平均字宽估算,不准但保证可运行
4
- * @description size=0 → 退化返回 (0, 0)(与 text='' 一致);负 size NaN size → throw(非法输入早 fail,避免 NaN 噪音传播到 Scene)
4
+ * @description size=0 → 退化返回 (0, 0)(与 text='' 一致);负 size 或非有限(NaN / Infinity)size → throw(非法输入早 fail,避免 NaN / Infinity 传播到 Scene)
5
5
  */
6
6
  var fallbackMeasurer = (text, font) => {
7
- if (Number.isNaN(font.size) || font.size < 0) throw new Error(`fallbackMeasurer: invalid font.size '${font.size}'; must be a non-negative finite number`);
7
+ if (!Number.isFinite(font.size) || font.size < 0) throw new Error(`fallbackMeasurer: invalid font.size '${font.size}'; must be a non-negative finite number`);
8
8
  return {
9
9
  width: text.length * font.size * .55,
10
10
  height: font.size * 1.2
@@ -18,7 +18,7 @@ var bendControlPoints = (from, to, direction, bendAngle) => {
18
18
  var DEFAULT_LOOSENESS = 1;
19
19
  /** self-loop(from==to)默认环大小(user units,受 looseness 缩放) */
20
20
  var DEFAULT_LOOP_SIZE = 1;
21
- /** 直边 cubic 控制点距离系数(chord 的几分之一) */
21
+ /** 直边 cubic 控制点距离系数(chord 的几分之一);retikz 取 1/3,TikZ 默认 looseness 对应 ≈0.3915,本库简化为 1/3 */
22
22
  var OUTIN_DISTANCE_FACTOR = 1 / 3;
23
23
  /** 角度(度)转单位方向向量(0°=+x,90°=+y screen-down,与 IR 角度约定一致) */
24
24
  var dirOf = (angleDeg) => {
@@ -77,6 +77,11 @@ export declare const filletContour: (segments: Array<ContourSegment>, cornerRadi
77
77
  * 夹紧到 0 的角不插弧、按原尖角连接。
78
78
  */
79
79
  export declare const contourCommands: (segments: Array<ContourSegment>, cornerRadius?: number, fillets?: Array<FilletSolution>) => Array<ContourCommand>;
80
+ /** 调整 endAngle 使「start→end」沿给定扫描方向(ccw: 递减 / 否则递增),保持裁剪后弧方向不变 */
81
+ export declare const alignSweep: (start: number, end: number, ccw: boolean) => {
82
+ start: number;
83
+ end: number;
84
+ };
80
85
  /**
81
86
  * 从 rayOrigin 朝 toward 射线 ∩ fillet 后轮廓全部段,返回最近正向交点
82
87
  * @description rayOrigin 显式传(不假设中心);toward 是射线指向的目标点(方向 = toward − rayOrigin)。
@@ -1 +1 @@
1
- {"version":3,"file":"contour.d.ts","sourceRoot":"","sources":["../../../src/geometry/contour.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAS,MAAM,SAAS,CAAC;AAkB/C,4BAA4B;AAC5B,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB;IAChB,EAAE,EAAE,QAAQ,CAAC;CACd,CAAC;AAEF,oDAAoD;AACpD,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY;IACZ,IAAI,EAAE,KAAK,CAAC;IACZ,gBAAgB;IAChB,MAAM,EAAE,QAAQ,CAAC;IACjB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,6BAA6B;AAC7B,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,CAAC;AAEtD,qFAAqF;AACrF,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GACD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AA6BtB;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,kBAAkB;IAClB,cAAc,EAAE,QAAQ,CAAC;IACzB,kBAAkB;IAClB,eAAe,EAAE,QAAQ,CAAC;IAC1B,gBAAgB;IAChB,MAAM,EAAE,QAAQ,CAAC;IACjB,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAgTF;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,UAAU,KAAK,CAAC,cAAc,CAAC,EAC/B,eAAe,MAAM,KACpB,KAAK,CAAC,cAAc,CAUtB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,KAAK,CAAC,cAAc,CAAC,EAC/B,eAAe,MAAM,EACrB,UAAS,KAAK,CAAC,cAAc,CAAyC,KACrE,KAAK,CAAC,cAAc,CAsCtB,CAAC;AAwCF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC9B,UAAU,KAAK,CAAC,cAAc,CAAC,EAC/B,cAAc,MAAM,GAAG,SAAS,EAChC,WAAW,QAAQ,EACnB,QAAQ,QAAQ,EAChB,UAAS,KAAK,CAAC,cAAc,CAAyC,KACrE,QAAQ,GAAG,SA0Eb,CAAC"}
1
+ {"version":3,"file":"contour.d.ts","sourceRoot":"","sources":["../../../src/geometry/contour.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAS,MAAM,SAAS,CAAC;AAkB/C,4BAA4B;AAC5B,MAAM,MAAM,WAAW,GAAG;IACxB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,IAAI,EAAE,QAAQ,CAAC;IACf,gBAAgB;IAChB,EAAE,EAAE,QAAQ,CAAC;CACd,CAAC;AAEF,oDAAoD;AACpD,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY;IACZ,IAAI,EAAE,KAAK,CAAC;IACZ,gBAAgB;IAChB,MAAM,EAAE,QAAQ,CAAC;IACjB,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,6BAA6B;AAC7B,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,CAAC;AAEtD,qFAAqF;AACrF,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAC9B;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GACD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AA6BtB;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,kBAAkB;IAClB,cAAc,EAAE,QAAQ,CAAC;IACzB,kBAAkB;IAClB,eAAe,EAAE,QAAQ,CAAC;IAC1B,gBAAgB;IAChB,MAAM,EAAE,QAAQ,CAAC;IACjB,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAoTF;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,UAAU,KAAK,CAAC,cAAc,CAAC,EAC/B,eAAe,MAAM,KACpB,KAAK,CAAC,cAAc,CAUtB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,KAAK,CAAC,cAAc,CAAC,EAC/B,eAAe,MAAM,EACrB,UAAS,KAAK,CAAC,cAAc,CAAyC,KACrE,KAAK,CAAC,cAAc,CAsCtB,CAAC;AA2BF,iEAAiE;AACjE,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,KAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAUjG,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC9B,UAAU,KAAK,CAAC,cAAc,CAAC,EAC/B,cAAc,MAAM,GAAG,SAAS,EAChC,WAAW,QAAQ,EACnB,QAAQ,QAAQ,EAChB,UAAS,KAAK,CAAC,cAAc,CAAyC,KACrE,QAAQ,GAAG,SA0Eb,CAAC"}
@@ -32,7 +32,7 @@ var fractionAlong = (seg, p, fromStart) => {
32
32
  const ex = seg.to[0] - seg.from[0];
33
33
  const ey = seg.to[1] - seg.from[1];
34
34
  const len2 = ex * ex + ey * ey;
35
- if (len2 < EPSILON) return 0;
35
+ if (len2 < EPSILON * EPSILON) return 0;
36
36
  const t = ((p[0] - seg.from[0]) * ex + (p[1] - seg.from[1]) * ey) / len2;
37
37
  return fromStart ? t : 1 - t;
38
38
  }
@@ -155,9 +155,10 @@ var solveFillet = (segA, segB, r) => {
155
155
  const tInPt = tangentPointOn(segA, cand, radius);
156
156
  const tOutPt = tangentPointOn(segB, cand, radius);
157
157
  if (!tInPt || !tOutPt) continue;
158
+ const tol = 1e-6 * Math.max(1, radius, Math.abs(corner[0]), Math.abs(corner[1]));
158
159
  const dA = distanceToAny(segA, cand);
159
160
  const dB = distanceToAny(segB, cand);
160
- if (Math.abs(dA - radius) > 1e-6 || Math.abs(dB - radius) > 1e-6) continue;
161
+ if (Math.abs(dA - radius) > tol || Math.abs(dB - radius) > tol) continue;
161
162
  const inFrac = fractionAlong(segA, tInPt, false);
162
163
  const outFrac = fractionAlong(segB, tOutPt, true);
163
164
  if (inFrac < -1e-7 || inFrac > .5000001 || outFrac < -1e-7 || outFrac > .5000001) continue;
@@ -252,7 +253,8 @@ var tangentPointOn = (seg, filletCenter, radius) => {
252
253
  best = cand;
253
254
  }
254
255
  }
255
- return bestErr <= 1e-6 ? best : void 0;
256
+ const tol = 1e-6 * Math.max(1, radius, Math.abs(filletCenter[0]), Math.abs(filletCenter[1]));
257
+ return bestErr <= tol ? best : void 0;
256
258
  };
257
259
  /**
258
260
  * 对闭合轮廓的每个接缝做 fillet,返回 fillet 解算列表(与接缝一一对应,下标 i = 段 i 终点接段 (i+1)%n 起点)
@@ -12,7 +12,13 @@ export type Diamond = {
12
12
  /** 绕中心旋转弧度 */
13
13
  rotate?: number;
14
14
  };
15
- /** 菱形相关基础工具 */
15
+ /**
16
+ * 菱形相关基础工具(独立几何原语)
17
+ * @description 注意:这是一套独立的菱形几何工具,**与 Node 的 diamond shape 不是同一条路径**——
18
+ * 后者已被 compile 规范化为 `polygon` preset(`{ sides: 4 }`),其 compass anchor 走外接 AABB 角。
19
+ * 本工具的 NE/NW/SE/SW anchor 取斜边中点(落在真实菱形边上),语义与 polygon 路径不同;
20
+ * 作为通用几何 API 保留,勿假设它与 Node diamond shape 行为一致。
21
+ */
16
22
  export declare const diamond: {
17
23
  /** 中心 */
18
24
  center: (d: Diamond) => Position;
@@ -1 +1 @@
1
- {"version":3,"file":"diamond.d.ts","sourceRoot":"","sources":["../../../src/geometry/diamond.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAqB,MAAM,QAAQ,CAAC;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUxC,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,kBAAkB,KAAG,QAAQ;IAqC1D;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;IAOvD,yDAAyD;mBAC1C,OAAO,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CASzD,CAAC"}
1
+ {"version":3,"file":"diamond.d.ts","sourceRoot":"","sources":["../../../src/geometry/diamond.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,EAAqB,MAAM,QAAQ,CAAC;AAEtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUxC,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;;;;;;GAMG;AACH,eAAO,MAAM,OAAO;IAClB,SAAS;gBACG,OAAO,KAAG,QAAQ;IAC9B,oDAAoD;kBACtC,OAAO,KAAK,QAAQ,KAAG,OAAO;IAK5C,sDAAsD;gBAC1C,OAAO,QAAQ,kBAAkB,KAAG,QAAQ;IAqC1D;;;OAGG;uBACkB,OAAO,UAAU,QAAQ,KAAG,QAAQ;IAQvD,yDAAyD;mBAC1C,OAAO,QAAQ,IAAI,KAAK,MAAM,KAAG,QAAQ;CASzD,CAAC"}
@@ -24,12 +24,19 @@ var DIAMOND_EDGE = {
24
24
  "south-west"
25
25
  ]
26
26
  };
27
- /** 菱形相关基础工具 */
27
+ /**
28
+ * 菱形相关基础工具(独立几何原语)
29
+ * @description 注意:这是一套独立的菱形几何工具,**与 Node 的 diamond shape 不是同一条路径**——
30
+ * 后者已被 compile 规范化为 `polygon` preset(`{ sides: 4 }`),其 compass anchor 走外接 AABB 角。
31
+ * 本工具的 NE/NW/SE/SW anchor 取斜边中点(落在真实菱形边上),语义与 polygon 路径不同;
32
+ * 作为通用几何 API 保留,勿假设它与 Node diamond shape 行为一致。
33
+ */
28
34
  var diamond = {
29
35
  /** 中心 */
30
36
  center: (d) => [d.x, d.y],
31
37
  /** 点是否在菱形内(含边界,含旋转);方程 |x|/halfA + |y|/halfB ≤ 1 */
32
38
  contains: (d, p) => {
39
+ if (d.halfA === 0 || d.halfB === 0) return false;
33
40
  const [lx, ly] = worldToLocal(d, p);
34
41
  return Math.abs(lx) / d.halfA + Math.abs(ly) / d.halfB <= 1.000000001;
35
42
  },
@@ -75,6 +82,7 @@ var diamond = {
75
82
  * @description 菱形方程 |x|/halfA + |y|/halfB = 1;沿方向 (lx,ly) 缩放 t 倍命中:t = 1 / (|lx|/halfA + |ly|/halfB)
76
83
  */
77
84
  boundaryPoint: (d, toward) => {
85
+ if (d.halfA === 0 || d.halfB === 0) return [d.x, d.y];
78
86
  const [lx, ly] = worldToLocal(d, toward);
79
87
  const denom = Math.abs(lx) / d.halfA + Math.abs(ly) / d.halfB;
80
88
  if (denom === 0) return [d.x, d.y];