@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":"shared.d.ts","sourceRoot":"","sources":["../../../src/shapes/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD,8BAA8B;AAC9B,KAAK,YAAY,GAAG;IAClB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,EAAE,UAAU,MAAM,KAAG,YAI5E,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,iBAAiB;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,4CAA4C;IAC5C,YAAY,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,uDAAuD;IACvD,UAAU,EAAE,QAAQ,CAAC;IACrB,kDAAkD;IAClD,cAAc,EAAE,QAAQ,CAAC;IACzB,gDAAgD;IAChD,oBAAoB,EAAE,QAAQ,CAAC;CAChC,CAAC;AAEF,wEAAwE;AACxE,KAAK,mBAAmB,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,mBAAmB,KAAG,cAoE5D,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,QAC7B,CAAC"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/shapes/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD,8BAA8B;AAC9B,KAAK,YAAY,GAAG;IAClB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,EAAE,UAAU,MAAM,KAAG,YAI5E,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,iBAAiB;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,4CAA4C;IAC5C,YAAY,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,uDAAuD;IACvD,UAAU,EAAE,QAAQ,CAAC;IACrB,kDAAkD;IAClD,cAAc,EAAE,QAAQ,CAAC;IACzB,gDAAgD;IAChD,oBAAoB,EAAE,QAAQ,CAAC;CAChC,CAAC;AAEF,wEAAwE;AACxE,KAAK,mBAAmB,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,mBAAmB,KAAG,cAoE5D,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,QAC7B,CAAC"}
@@ -2,14 +2,16 @@ import { arcBoundingPoints, arcEndPoint } from "../geometry/arc.js";
2
2
  //#region src/shapes/shared.ts
3
3
  var DEG_TO_RAD = Math.PI / 180;
4
4
  /**
5
- * 规范化起止角:保证 end start(end<start 时加 360° 直至 ≥ start),并给出中分角
5
+ * 规范化起止角:保证 start ≤ end start+360(end<start 时加 360°、跨度>360° 钳到 360°),并给出中分角
6
6
  * @description 角度沿屏幕系(角度递增=CW)从 start 扫到 end;end<start 视为跨过 360°,与 polar / geometry/arc 约定一致。
7
7
  * end<start 时一次性加上 360°·k(k 为使 end ≥ start 的最小非负整数),O(1) 闭式计算——
8
8
  * 避免 while 循环在巨型角度(如 1e308 浮点 end+360===end 卡死、1e9 退化成数百万次迭代)下挂死。
9
- * end start 时 ceil((start−end)/360) 0,k 取 0、end 不变(语义与原逐次加法等价)。
9
+ * 再把跨度钳到 ≤360°:sweep≥360° 视觉即整圆,超出部分冗余;钳定同时防住巨角(如 endAngle=1e8)
10
+ * 让下游 arcBoundingPoints 枚举海量 90°·k 轴向极值点。
10
11
  */
11
12
  var normalizeAngularRange = (startAngle, endAngle) => {
12
- const end = endAngle + 360 * Math.max(0, Math.ceil((startAngle - endAngle) / 360));
13
+ const k = Math.max(0, Math.ceil((startAngle - endAngle) / 360));
14
+ const end = Math.min(endAngle + 360 * k, startAngle + 360);
13
15
  return {
14
16
  start: startAngle,
15
17
  end,
@@ -1 +1 @@
1
- {"version":3,"file":"star.d.ts","sourceRoot":"","sources":["../../../src/shapes/star.ts"],"names":[],"mappings":"AAsFA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,IAAI,mCAiFf,CAAC"}
1
+ {"version":3,"file":"star.d.ts","sourceRoot":"","sources":["../../../src/shapes/star.ts"],"names":[],"mappings":"AAuFA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,IAAI,mCAkFf,CAAC"}
@@ -5,6 +5,7 @@ import { contourToPathCommands, contourToPathPrimitive, verticesToSegments } fro
5
5
  import { z } from "zod";
6
6
  //#region src/shapes/star.ts
7
7
  var DEG_TO_RAD = Math.PI / 180;
8
+ var MAX_STAR_POINTS = 1024;
8
9
  /**
9
10
  * 计算 star 单一真源几何
10
11
  * @description 局部系以中心为原点:顶点 k 角 = (rotate ?? 0) + k·(180/points) − 90,半径偶 outer / 奇 inner,
@@ -58,7 +59,7 @@ var worldVertices = (rect, geo) => geo.vertices.map((v) => toWorld(rect, v));
58
59
  */
59
60
  var star = defineShape({
60
61
  paramsSchema: z.strictObject({
61
- points: z.number().int().min(3).describe("Number of star points (>= 3)."),
62
+ points: z.number().int().min(3).max(MAX_STAR_POINTS).describe(`Number of star points (3..${MAX_STAR_POINTS}); capped to bound vertex count (mirrors polygon sides).`),
62
63
  innerRadius: z.number().finite().positive().describe("Inner (notch) radius in user units."),
63
64
  outerRadius: z.number().finite().positive().describe("Outer (tip) radius in user units; must be > innerRadius."),
64
65
  rotate: z.number().finite().optional().describe("Shape self-rotation in degrees; default 0 = first tip points up (screen -y / top); positive rotates clockwise (screen). Composes with Node.rotate."),
@@ -21,7 +21,8 @@ export type ShapeStyle = {
21
21
  /**
22
22
  * 一个 shape 的参数化可注册定义(定义点 typed 形态)
23
23
  * @description plain object(factory 友好:`createPolygonShape(6)` 这类普通函数返回它即可);含函数与
24
- * `paramsSchema`,**不进 IR**,走 `CompileOptions.shapes` 运行时注入。内置 4 shape 也是注册项(无内置特权)。
24
+ * `paramsSchema`,**不进 IR**,走 `CompileOptions.shapes` 运行时注入。内置 shape(rectangle / ellipse /
25
+ * sector / arc / polygon / star,circle / diamond 为 preset 别名)也是注册项(无内置特权)。
25
26
  * 每个计算函数末位收 per-instance `params`(类型由 `paramsSchema.parse` 在编译期保证),无参形状用
26
27
  * `z.strictObject({})` 并忽略 `params`。
27
28
  *
@@ -55,11 +56,17 @@ export type ShapeDefinitionInput<TParams extends IRJsonObject> = {
55
56
  circumscribeOffset?: (params: TParams) => Position;
56
57
  /** 中心 → toward 射线 ∩ 边界(rect 带 rotate);params 喂参数化边界。 */
57
58
  boundaryPoint: (rect: Rect, toward: Position, params: TParams) => Position;
58
- /** 命名 anchor 世界坐标;shape 不认识的名字返回 `undefined`(调用方据此抛清晰错误)。 */
59
+ /**
60
+ * 命名 anchor 世界坐标;shape 不认识的名字返回 `undefined`(调用方据此抛清晰错误)。
61
+ * @description compass 方位名(north / south / ... / center)的约定(与 TikZ 一致):默认连接面下 compile 先调本函数,
62
+ * shape 返回真实形状上的点即采用(如 ellipse 落真实周长、polygon 落外接 AABB);返回 `undefined` 则 compile
63
+ * 回退到外接 AABB 矩形。故 shape 作者可只实现 shape 专属命名 anchor(tip-N / apex 等),compass 名交回退即可;
64
+ * 要让 compass 贴真实形状边界(圆 / 椭圆类)才需自行处理 compass。
65
+ */
59
66
  anchor: (rect: Rect, name: string, params: TParams) => Position | undefined;
60
67
  /**
61
68
  * 边上比例点:side 真实边界从约定起点起 t∈[0,1] 处(轴对齐空间求出后由 layout 投回世界系)。
62
- * @description 可选——内置 4 shape 必实现,不实现的 shape 收到 `{ side, t }` 时编译期(resolveEdgePoint)抛明确错。
69
+ * @description 可选——目前仅 rectangle / ellipse 实现;未实现的 shape(polygon / sector / arc / star)收到 `{ side, t }` 时编译期(resolveEdgePoint)抛明确错。
63
70
  * 与 `anchor` 同坐标语义:收**带 rotate 的 Rect**,自行用 worldToLocal/localToWorld 处理旋转。
64
71
  */
65
72
  edgePoint?: (rect: Rect, side: 'north' | 'south' | 'east' | 'west', t: number, params: TParams) => Position;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shapes/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/D;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,YAAY,IAAI;IAC/D,qEAAqE;IACrE,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC;;;;OAIG;IACH,YAAY,EAAE,CACZ,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,OAAO,KACZ;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC;IACnD,wDAAwD;IACxD,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC;IAC3E,6DAA6D;IAC7D,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,QAAQ,GAAG,SAAS,CAAC;IAC5E;;;;OAIG;IACH,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EACzC,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,OAAO,KACZ,QAAQ,CAAC;IACd,0EAA0E;IAC1E,IAAI,EAAE,CACJ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,MAAM,EAAE,OAAO,KACZ,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;CACpE,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shapes/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/D;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,YAAY,IAAI;IAC/D,qEAAqE;IACrE,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC;;;;OAIG;IACH,YAAY,EAAE,CACZ,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,OAAO,KACZ;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC;IACnD,wDAAwD;IACxD,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC;IAC3E;;;;;;OAMG;IACH,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,QAAQ,GAAG,SAAS,CAAC;IAC5E;;;;OAIG;IACH,SAAS,CAAC,EAAE,CACV,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EACzC,CAAC,EAAE,MAAM,EACT,MAAM,EAAE,OAAO,KACZ,QAAQ,CAAC;IACd,0EAA0E;IAC1E,IAAI,EAAE,CACJ,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,MAAM,EAAE,OAAO,KACZ,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;CACpE,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /** 获取对象所有值的联合类型,等价于 (typeof T)[keyof typeof T] */
2
2
  export type ValueOf<T extends object> = T[keyof T];
3
3
  /**
4
- * 类型层等价检查工具(internal idiom,公开 API 不导出)
4
+ * 类型层等价检查工具(从包根导出,供各包字段表互锁复用)
5
5
  * @description 当 A、B 完全等价时类型为 `true`,否则为 `false`——配合 `as const satisfies` 实现"字段表必须完备覆盖类型 key 集合"的互锁;漏字段或多字段 TS 编译期报错
6
6
  * @example
7
7
  * const NODE_FIELDS = ['id', 'shape'] as const satisfies ReadonlyArray<keyof IRNode>;
@@ -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
  }
@@ -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"}
@@ -9,7 +9,7 @@ const require_node = require("./node.cjs");
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: require_node.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) => {
@@ -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 require_constant.CompileWarningCode.OffsetBaseUnresolved;
135
- if (t.kind === "at-translate") return require_constant.CompileWarningCode.AtTargetUnresolved;
136
- if (t.kind === "polar-translate") return require_constant.CompileWarningCode.PolarOriginUnresolved;
137
- if (t.kind === "between-translate") return require_constant.CompileWarningCode.UnresolvedNodeReference;
131
+ /** 据**实际解析失败**的那个 transform 的成因映射 warn code(由 lowerScopeTransforms 的 onUnresolved 回调给出) */
132
+ var transformWarnCode = (failed) => {
133
+ switch (failed?.kind) {
134
+ case "offset-translate": return require_constant.CompileWarningCode.OffsetBaseUnresolved;
135
+ case "at-translate": return require_constant.CompileWarningCode.AtTargetUnresolved;
136
+ case "polar-translate": return require_constant.CompileWarningCode.PolarOriginUnresolved;
137
+ default: return require_constant.CompileWarningCode.UnresolvedNodeReference;
138
138
  }
139
- return require_constant.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 = require_scope.lowerScopeTransforms(child.transforms ?? [], nameStack, nodeDistance, require_anchor.refPointOfTarget);
300
+ const rawTransforms = child.transforms ?? [];
301
+ let failedTransform;
302
+ const loweredOwn = require_scope.lowerScopeTransforms(rawTransforms, nameStack, nodeDistance, require_anchor.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
  });
@@ -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"}
@@ -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
@@ -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"}
@@ -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 = require_anchor.normalizeCompassAnchor(name);
158
158
  if (compassAnchor !== void 0) {
159
- const { def, rect, params } = require_boundary.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 = require_boundary.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 } = require_boundary.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 = require_position.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`);
@@ -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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"}
@@ -14,14 +14,23 @@ const require_shrink = require("./shrink.cjs");
14
14
  const require_split = require("./split.cjs");
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 = require_text_metr
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(require_constant.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 = require_text_metr
435
463
  const fromClip = usedOverride ?? (prev ? require_anchor.clipForTarget(prev.step.to, moveAnchor, nameStack, scopeChain) : null);
436
464
  const toClip = require_anchor.clipForTarget(moveTo, fromClip ?? prev?.anchor ?? moveAnchor, nameStack, scopeChain);
437
465
  if (!fromClip || !toClip) return null;
466
+ segmentSamplers.push((t) => require_segment.lineSegmentSample(fromClip, toClip, t));
438
467
  if (require_anchor.samePoint(fromClip, lastEnd) && require_anchor.samePoint(toClip, subPathStart)) {
439
468
  emitClose();
440
469
  continue;
@@ -465,6 +494,7 @@ var emitPathPrimitive = (path, nameStack, round, measureText = require_text_metr
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) => require_segment.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 = require_text_metr
646
676
  const localT = scaled - segIdx;
647
677
  const sample = segmentSamplers[segIdx](pos === 1 ? 1 : localT);
648
678
  const spec = require_shrink.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":"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"}
@@ -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
  };
@@ -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"}
@@ -9,7 +9,7 @@ const require_node = require("./node.cjs");
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 = require_position.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 = require_position.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],
@@ -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"}
@@ -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
@@ -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
@@ -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) => {