@retikz/core 0.3.0-alpha.3 → 0.3.0-alpha.5

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 (242) hide show
  1. package/README.md +41 -41
  2. package/dist/es/compile/anchor-cache.d.ts +5 -3
  3. package/dist/es/compile/anchor-cache.d.ts.map +1 -1
  4. package/dist/es/compile/anchor-cache.js +14 -10
  5. package/dist/es/compile/boundary.d.ts +19 -0
  6. package/dist/es/compile/boundary.d.ts.map +1 -0
  7. package/dist/es/compile/boundary.js +64 -0
  8. package/dist/es/compile/compile.d.ts +1 -1
  9. package/dist/es/compile/compile.d.ts.map +1 -1
  10. package/dist/es/compile/compile.js +49 -5
  11. package/dist/es/compile/node.d.ts +26 -8
  12. package/dist/es/compile/node.d.ts.map +1 -1
  13. package/dist/es/compile/node.js +103 -16
  14. package/dist/es/compile/path/anchor.d.ts.map +1 -1
  15. package/dist/es/compile/path/anchor.js +7 -6
  16. package/dist/es/compile/path/index.d.ts.map +1 -1
  17. package/dist/es/compile/path/index.js +7 -3
  18. package/dist/es/compile/path/relative.js +1 -1
  19. package/dist/es/compile/scope.d.ts.map +1 -1
  20. package/dist/es/compile/scope.js +2 -1
  21. package/dist/es/geometry/arc.d.ts +14 -0
  22. package/dist/es/geometry/arc.d.ts.map +1 -1
  23. package/dist/es/geometry/arc.js +65 -9
  24. package/dist/es/geometry/index.d.ts +1 -0
  25. package/dist/es/geometry/index.d.ts.map +1 -1
  26. package/dist/es/geometry/rect.d.ts +2 -2
  27. package/dist/es/geometry/rect.d.ts.map +1 -1
  28. package/dist/es/geometry/rect.js +3 -3
  29. package/dist/es/geometry/roundedContour.d.ts +88 -0
  30. package/dist/es/geometry/roundedContour.d.ts.map +1 -0
  31. package/dist/es/geometry/roundedContour.js +417 -0
  32. package/dist/es/index.d.ts +9 -5
  33. package/dist/es/index.d.ts.map +1 -1
  34. package/dist/es/index.js +11 -6
  35. package/dist/es/ir/animation.d.ts +218 -0
  36. package/dist/es/ir/animation.d.ts.map +1 -0
  37. package/dist/es/ir/animation.js +118 -0
  38. package/dist/es/ir/boundary.d.ts +25 -0
  39. package/dist/es/ir/boundary.d.ts.map +1 -0
  40. package/dist/es/ir/boundary.js +14 -0
  41. package/dist/es/ir/index.d.ts +3 -0
  42. package/dist/es/ir/index.d.ts.map +1 -1
  43. package/dist/es/ir/node.d.ts +219 -27
  44. package/dist/es/ir/node.d.ts.map +1 -1
  45. package/dist/es/ir/node.js +10 -3
  46. package/dist/es/ir/path/arrow.d.ts +36 -36
  47. package/dist/es/ir/path/path.d.ts +702 -203
  48. package/dist/es/ir/path/path.d.ts.map +1 -1
  49. package/dist/es/ir/path/path.js +4 -0
  50. package/dist/es/ir/path/step.d.ts +674 -154
  51. package/dist/es/ir/path/step.d.ts.map +1 -1
  52. package/dist/es/ir/path/step.js +2 -2
  53. package/dist/es/ir/path/target.d.ts +43 -8
  54. package/dist/es/ir/path/target.d.ts.map +1 -1
  55. package/dist/es/ir/path/target.js +4 -5
  56. package/dist/es/ir/scene.d.ts +156 -0
  57. package/dist/es/ir/scene.d.ts.map +1 -1
  58. package/dist/es/ir/scene.js +3 -1
  59. package/dist/es/ir/scope.d.ts +1671 -424
  60. package/dist/es/ir/scope.d.ts.map +1 -1
  61. package/dist/es/ir/scope.js +10 -2
  62. package/dist/es/ir/shape.d.ts +14 -0
  63. package/dist/es/ir/shape.d.ts.map +1 -0
  64. package/dist/es/ir/shape.js +9 -0
  65. package/dist/es/parsers/parseNodeTarget.d.ts.map +1 -1
  66. package/dist/es/parsers/parseNodeTarget.js +4 -2
  67. package/dist/es/presets/animation.d.ts +123 -0
  68. package/dist/es/presets/animation.d.ts.map +1 -0
  69. package/dist/es/presets/animation.js +272 -0
  70. package/dist/es/presets/index.d.ts +3 -0
  71. package/dist/es/presets/index.d.ts.map +1 -0
  72. package/dist/es/primitive/ellipse.d.ts +6 -0
  73. package/dist/es/primitive/ellipse.d.ts.map +1 -1
  74. package/dist/es/primitive/group.d.ts +6 -0
  75. package/dist/es/primitive/group.d.ts.map +1 -1
  76. package/dist/es/primitive/path.d.ts +6 -0
  77. package/dist/es/primitive/path.d.ts.map +1 -1
  78. package/dist/es/primitive/rect.d.ts +6 -0
  79. package/dist/es/primitive/rect.d.ts.map +1 -1
  80. package/dist/es/primitive/scene.d.ts +3 -0
  81. package/dist/es/primitive/scene.d.ts.map +1 -1
  82. package/dist/es/primitive/text.d.ts +6 -0
  83. package/dist/es/primitive/text.d.ts.map +1 -1
  84. package/dist/es/shapes/_contour.d.ts +19 -0
  85. package/dist/es/shapes/_contour.d.ts.map +1 -0
  86. package/dist/es/shapes/_contour.js +60 -0
  87. package/dist/es/shapes/_shared.d.ts +54 -0
  88. package/dist/es/shapes/_shared.d.ts.map +1 -1
  89. package/dist/es/shapes/_shared.js +68 -1
  90. package/dist/es/shapes/arc.d.ts +8 -0
  91. package/dist/es/shapes/arc.d.ts.map +1 -0
  92. package/dist/es/shapes/arc.js +104 -0
  93. package/dist/es/shapes/define.d.ts +13 -0
  94. package/dist/es/shapes/define.d.ts.map +1 -0
  95. package/dist/es/shapes/define.js +13 -0
  96. package/dist/es/shapes/ellipse.d.ts +5 -4
  97. package/dist/es/shapes/ellipse.d.ts.map +1 -1
  98. package/dist/es/shapes/ellipse.js +15 -7
  99. package/dist/es/shapes/index.d.ts +9 -6
  100. package/dist/es/shapes/index.d.ts.map +1 -1
  101. package/dist/es/shapes/index.js +10 -5
  102. package/dist/es/shapes/polygon.d.ts +13 -0
  103. package/dist/es/shapes/polygon.d.ts.map +1 -0
  104. package/dist/es/shapes/polygon.js +104 -0
  105. package/dist/es/shapes/rectangle.d.ts +7 -5
  106. package/dist/es/shapes/rectangle.d.ts.map +1 -1
  107. package/dist/es/shapes/rectangle.js +37 -8
  108. package/dist/es/shapes/sector.d.ts +9 -0
  109. package/dist/es/shapes/sector.d.ts.map +1 -0
  110. package/dist/es/shapes/sector.js +143 -0
  111. package/dist/es/shapes/star.d.ts +15 -0
  112. package/dist/es/shapes/star.d.ts.map +1 -0
  113. package/dist/es/shapes/star.js +113 -0
  114. package/dist/es/shapes/types.d.ts +47 -14
  115. package/dist/es/shapes/types.d.ts.map +1 -1
  116. package/dist/lib/compile/anchor-cache.cjs +14 -10
  117. package/dist/lib/compile/anchor-cache.d.ts +5 -3
  118. package/dist/lib/compile/anchor-cache.d.ts.map +1 -1
  119. package/dist/lib/compile/boundary.cjs +65 -0
  120. package/dist/lib/compile/boundary.d.ts +19 -0
  121. package/dist/lib/compile/boundary.d.ts.map +1 -0
  122. package/dist/lib/compile/compile.cjs +49 -5
  123. package/dist/lib/compile/compile.d.ts +1 -1
  124. package/dist/lib/compile/compile.d.ts.map +1 -1
  125. package/dist/lib/compile/node.cjs +103 -16
  126. package/dist/lib/compile/node.d.ts +26 -8
  127. package/dist/lib/compile/node.d.ts.map +1 -1
  128. package/dist/lib/compile/path/anchor.cjs +7 -6
  129. package/dist/lib/compile/path/anchor.d.ts.map +1 -1
  130. package/dist/lib/compile/path/index.cjs +7 -3
  131. package/dist/lib/compile/path/index.d.ts.map +1 -1
  132. package/dist/lib/compile/path/relative.cjs +1 -1
  133. package/dist/lib/compile/scope.cjs +2 -1
  134. package/dist/lib/compile/scope.d.ts.map +1 -1
  135. package/dist/lib/geometry/arc.cjs +66 -8
  136. package/dist/lib/geometry/arc.d.ts +14 -0
  137. package/dist/lib/geometry/arc.d.ts.map +1 -1
  138. package/dist/lib/geometry/index.d.ts +1 -0
  139. package/dist/lib/geometry/index.d.ts.map +1 -1
  140. package/dist/lib/geometry/rect.cjs +3 -3
  141. package/dist/lib/geometry/rect.d.ts +2 -2
  142. package/dist/lib/geometry/rect.d.ts.map +1 -1
  143. package/dist/lib/geometry/roundedContour.cjs +418 -0
  144. package/dist/lib/geometry/roundedContour.d.ts +88 -0
  145. package/dist/lib/geometry/roundedContour.d.ts.map +1 -0
  146. package/dist/lib/index.cjs +41 -7
  147. package/dist/lib/index.d.ts +9 -5
  148. package/dist/lib/index.d.ts.map +1 -1
  149. package/dist/lib/ir/animation.cjs +127 -0
  150. package/dist/lib/ir/animation.d.ts +218 -0
  151. package/dist/lib/ir/animation.d.ts.map +1 -0
  152. package/dist/lib/ir/boundary.cjs +15 -0
  153. package/dist/lib/ir/boundary.d.ts +25 -0
  154. package/dist/lib/ir/boundary.d.ts.map +1 -0
  155. package/dist/lib/ir/index.d.ts +3 -0
  156. package/dist/lib/ir/index.d.ts.map +1 -1
  157. package/dist/lib/ir/node.cjs +10 -3
  158. package/dist/lib/ir/node.d.ts +219 -27
  159. package/dist/lib/ir/node.d.ts.map +1 -1
  160. package/dist/lib/ir/path/arrow.d.ts +36 -36
  161. package/dist/lib/ir/path/path.cjs +4 -0
  162. package/dist/lib/ir/path/path.d.ts +702 -203
  163. package/dist/lib/ir/path/path.d.ts.map +1 -1
  164. package/dist/lib/ir/path/step.cjs +2 -2
  165. package/dist/lib/ir/path/step.d.ts +674 -154
  166. package/dist/lib/ir/path/step.d.ts.map +1 -1
  167. package/dist/lib/ir/path/target.cjs +4 -5
  168. package/dist/lib/ir/path/target.d.ts +43 -8
  169. package/dist/lib/ir/path/target.d.ts.map +1 -1
  170. package/dist/lib/ir/scene.cjs +3 -1
  171. package/dist/lib/ir/scene.d.ts +156 -0
  172. package/dist/lib/ir/scene.d.ts.map +1 -1
  173. package/dist/lib/ir/scope.cjs +10 -2
  174. package/dist/lib/ir/scope.d.ts +1671 -424
  175. package/dist/lib/ir/scope.d.ts.map +1 -1
  176. package/dist/lib/ir/shape.cjs +9 -0
  177. package/dist/lib/ir/shape.d.ts +14 -0
  178. package/dist/lib/ir/shape.d.ts.map +1 -0
  179. package/dist/lib/parsers/parseNodeTarget.cjs +4 -2
  180. package/dist/lib/parsers/parseNodeTarget.d.ts.map +1 -1
  181. package/dist/lib/presets/animation.cjs +286 -0
  182. package/dist/lib/presets/animation.d.ts +123 -0
  183. package/dist/lib/presets/animation.d.ts.map +1 -0
  184. package/dist/lib/presets/index.d.ts +3 -0
  185. package/dist/lib/presets/index.d.ts.map +1 -0
  186. package/dist/lib/primitive/ellipse.d.ts +6 -0
  187. package/dist/lib/primitive/ellipse.d.ts.map +1 -1
  188. package/dist/lib/primitive/group.d.ts +6 -0
  189. package/dist/lib/primitive/group.d.ts.map +1 -1
  190. package/dist/lib/primitive/path.d.ts +6 -0
  191. package/dist/lib/primitive/path.d.ts.map +1 -1
  192. package/dist/lib/primitive/rect.d.ts +6 -0
  193. package/dist/lib/primitive/rect.d.ts.map +1 -1
  194. package/dist/lib/primitive/scene.d.ts +3 -0
  195. package/dist/lib/primitive/scene.d.ts.map +1 -1
  196. package/dist/lib/primitive/text.d.ts +6 -0
  197. package/dist/lib/primitive/text.d.ts.map +1 -1
  198. package/dist/lib/shapes/_contour.cjs +61 -0
  199. package/dist/lib/shapes/_contour.d.ts +19 -0
  200. package/dist/lib/shapes/_contour.d.ts.map +1 -0
  201. package/dist/lib/shapes/_shared.cjs +70 -0
  202. package/dist/lib/shapes/_shared.d.ts +54 -0
  203. package/dist/lib/shapes/_shared.d.ts.map +1 -1
  204. package/dist/lib/shapes/arc.cjs +104 -0
  205. package/dist/lib/shapes/arc.d.ts +8 -0
  206. package/dist/lib/shapes/arc.d.ts.map +1 -0
  207. package/dist/lib/shapes/define.cjs +13 -0
  208. package/dist/lib/shapes/define.d.ts +13 -0
  209. package/dist/lib/shapes/define.d.ts.map +1 -0
  210. package/dist/lib/shapes/ellipse.cjs +15 -7
  211. package/dist/lib/shapes/ellipse.d.ts +5 -4
  212. package/dist/lib/shapes/ellipse.d.ts.map +1 -1
  213. package/dist/lib/shapes/index.cjs +12 -6
  214. package/dist/lib/shapes/index.d.ts +9 -6
  215. package/dist/lib/shapes/index.d.ts.map +1 -1
  216. package/dist/lib/shapes/polygon.cjs +104 -0
  217. package/dist/lib/shapes/polygon.d.ts +13 -0
  218. package/dist/lib/shapes/polygon.d.ts.map +1 -0
  219. package/dist/lib/shapes/rectangle.cjs +37 -8
  220. package/dist/lib/shapes/rectangle.d.ts +7 -5
  221. package/dist/lib/shapes/rectangle.d.ts.map +1 -1
  222. package/dist/lib/shapes/sector.cjs +143 -0
  223. package/dist/lib/shapes/sector.d.ts +9 -0
  224. package/dist/lib/shapes/sector.d.ts.map +1 -0
  225. package/dist/lib/shapes/star.cjs +113 -0
  226. package/dist/lib/shapes/star.d.ts +15 -0
  227. package/dist/lib/shapes/star.d.ts.map +1 -0
  228. package/dist/lib/shapes/types.d.ts +47 -14
  229. package/dist/lib/shapes/types.d.ts.map +1 -1
  230. package/package.json +2 -2
  231. package/dist/es/shapes/circle.d.ts +0 -8
  232. package/dist/es/shapes/circle.d.ts.map +0 -1
  233. package/dist/es/shapes/circle.js +0 -34
  234. package/dist/es/shapes/diamond.d.ts +0 -8
  235. package/dist/es/shapes/diamond.d.ts.map +0 -1
  236. package/dist/es/shapes/diamond.js +0 -66
  237. package/dist/lib/shapes/circle.cjs +0 -34
  238. package/dist/lib/shapes/circle.d.ts +0 -8
  239. package/dist/lib/shapes/circle.d.ts.map +0 -1
  240. package/dist/lib/shapes/diamond.cjs +0 -66
  241. package/dist/lib/shapes/diamond.d.ts +0 -8
  242. package/dist/lib/shapes/diamond.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/primitive/rect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,wBAAwB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
1
+ {"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/primitive/rect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,kHAAkH;IAClH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,mGAAmG;IACnG,UAAU,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACrC,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,wBAAwB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
@@ -5,6 +5,7 @@ import { RectPrim } from './rect';
5
5
  import { TextPrim } from './text';
6
6
  import { Layout } from './layout';
7
7
  import { SceneResource } from './paint';
8
+ import { IRAnimationTrack } from '../ir/animation';
8
9
  export type { PaintValue, SceneResource, PaintResource, ResolvedPatternTile } from './paint';
9
10
  export type { ClipShape, ClipResource } from './clip';
10
11
  /**
@@ -20,5 +21,7 @@ export type Scene = {
20
21
  layout: Layout;
21
22
  /** 渲染无关资源表(paint server 等);adapter 物化(SVG → `<defs>`)。无资源时省略 */
22
23
  resources?: Array<SceneResource>;
24
+ /** scene 根(镜头)时间轴动画 tracks(viewBox property):compile 从 IR 根 animations 原样透传;renderer 能播则播、不能则用静态 layout 并 warn。无则省略 */
25
+ animations?: Array<IRAnimationTrack>;
23
26
  };
24
27
  //# sourceMappingURL=scene.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../../src/primitive/scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC7F,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtF,qCAAqC;AACrC,MAAM,MAAM,KAAK,GAAG;IAClB,wBAAwB;IACxB,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;CAClC,CAAC"}
1
+ {"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../../src/primitive/scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC7F,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtF,qCAAqC;AACrC,MAAM,MAAM,KAAK,GAAG;IAClB,wBAAwB;IACxB,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,uHAAuH;IACvH,UAAU,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;CACtC,CAAC"}
@@ -1,3 +1,5 @@
1
+ import { IRAnimationTrack } from '../ir/animation';
2
+ import { IRJsonObject } from '../ir/json';
1
3
  /** 行级字段(每行可独立指定),未填走块级 TextPrim 默认 */
2
4
  export type TextLine = {
3
5
  /** 行文字内容 */
@@ -23,6 +25,10 @@ export type TextPrim = {
23
25
  type: 'text';
24
26
  /** 稳定挂点 id:compile 从 IR 元素 user id stamp,供 renderer emit data-retikz-id / canvas hit-test */
25
27
  id?: string;
28
+ /** provenance 元数据:compile 从 IR 元素(node / path / scope)的 `meta` 原样 stamp,renderer 忽略(不进 DOM),交互层 / 工具链从 Scene 读 */
29
+ meta?: IRJsonObject;
30
+ /** 时间轴动画 tracks:compile 从 IR 元素的 animations 原样 stamp;renderer 能播则播、不能则渲染 settled 静态态并 warn(不丢图) */
31
+ animations?: Array<IRAnimationTrack>;
26
32
  /** 锚点横坐标(具体含义由 align 决定) */
27
33
  x: number;
28
34
  /** 锚点纵坐标(具体含义由 baseline 决定) */
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/primitive/text.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,0BAA0B;IAC1B,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,0CAA0C;IAC1C,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;IACrD,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/primitive/text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,sCAAsC;AACtC,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,0BAA0B;IAC1B,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,kHAAkH;IAClH,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,mGAAmG;IACnG,UAAU,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACrC,4BAA4B;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,0CAA0C;IAC1C,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;IACrD,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { Position } from '../geometry/point';
2
+ import { ContourCommand, LineSegment } from '../geometry/roundedContour';
3
+ import { PathCommand } from '../primitive';
4
+ /**
5
+ * 由顶点环构造闭合折线段序列(接缝顺序同顶点顺序)
6
+ * @description 第 i 段 from = 顶点 i、to = 顶点 (i+1)%n;供 polygon / star 的 emit / boundaryPoint
7
+ * 委托 rounded-contour 模块。绕向与各形状现状 emit 顶点顺序一致(rounded-contour 据接缝转向叉积判内外侧、
8
+ * 凸 / 凹角统一处理),polygon 全凸、star 凸尖 / 凹角交替都用这同一条构造。
9
+ */
10
+ export declare const verticesToSegments: (verts: Array<Position>) => Array<LineSegment>;
11
+ /**
12
+ * contour 命令 → path PathCommand(每点过 round)
13
+ * @description passthrough(r 省略 / 0)时每段都 emit 一条回到起点的 line、末尾接 close;而顶点形状现状 emit
14
+ * 是 `move + (n−1) line + close`(无回起点的冗余 line)——故此处剔除「紧贴 close 前、落点 == 初始 move 落点」
15
+ * 的那条 line,保证 r=0 与现状逐字等价。fillet(r>0)时末尾 fillet 弧已自然收尾,无该冗余。
16
+ * polygon / star 共用此映射器(单一实现)。
17
+ */
18
+ export declare const contourToPathCommands: (commands: Array<ContourCommand>, round: (n: number) => number) => Array<PathCommand>;
19
+ //# sourceMappingURL=_contour.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_contour.d.ts","sourceRoot":"","sources":["../../../src/shapes/_contour.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAG,KAAK,CAAC,WAAW,CACQ,CAAC;AAEtF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GAChC,UAAU,KAAK,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,KAC3B,KAAK,CAAC,WAAW,CAqCnB,CAAC"}
@@ -0,0 +1,60 @@
1
+ //#region src/shapes/_contour.ts
2
+ /**
3
+ * 由顶点环构造闭合折线段序列(接缝顺序同顶点顺序)
4
+ * @description 第 i 段 from = 顶点 i、to = 顶点 (i+1)%n;供 polygon / star 的 emit / boundaryPoint
5
+ * 委托 rounded-contour 模块。绕向与各形状现状 emit 顶点顺序一致(rounded-contour 据接缝转向叉积判内外侧、
6
+ * 凸 / 凹角统一处理),polygon 全凸、star 凸尖 / 凹角交替都用这同一条构造。
7
+ */
8
+ var verticesToSegments = (verts) => verts.map((from, i) => ({
9
+ kind: "line",
10
+ from,
11
+ to: verts[(i + 1) % verts.length]
12
+ }));
13
+ /**
14
+ * contour 命令 → path PathCommand(每点过 round)
15
+ * @description passthrough(r 省略 / 0)时每段都 emit 一条回到起点的 line、末尾接 close;而顶点形状现状 emit
16
+ * 是 `move + (n−1) line + close`(无回起点的冗余 line)——故此处剔除「紧贴 close 前、落点 == 初始 move 落点」
17
+ * 的那条 line,保证 r=0 与现状逐字等价。fillet(r>0)时末尾 fillet 弧已自然收尾,无该冗余。
18
+ * polygon / star 共用此映射器(单一实现)。
19
+ */
20
+ var contourToPathCommands = (commands, round) => {
21
+ const rp = (p) => [round(p[0]), round(p[1])];
22
+ const out = [];
23
+ let moveTo;
24
+ commands.forEach((cmd, i) => {
25
+ switch (cmd.kind) {
26
+ case "move":
27
+ moveTo = rp(cmd.to);
28
+ out.push({
29
+ kind: "move",
30
+ to: moveTo
31
+ });
32
+ break;
33
+ case "line": {
34
+ const to = rp(cmd.to);
35
+ if (i + 1 < commands.length && commands[i + 1].kind === "close" && moveTo && to[0] === moveTo[0] && to[1] === moveTo[1]) break;
36
+ out.push({
37
+ kind: "line",
38
+ to
39
+ });
40
+ break;
41
+ }
42
+ case "arc":
43
+ out.push({
44
+ kind: "arc",
45
+ center: rp(cmd.center),
46
+ radius: round(cmd.radius),
47
+ startAngle: cmd.startAngle,
48
+ endAngle: cmd.endAngle,
49
+ counterClockwise: cmd.counterClockwise
50
+ });
51
+ break;
52
+ case "close":
53
+ out.push({ kind: "close" });
54
+ break;
55
+ }
56
+ });
57
+ return out;
58
+ };
59
+ //#endregion
60
+ export { contourToPathCommands, verticesToSegments };
@@ -1,7 +1,61 @@
1
+ import { Position } from '../geometry/point';
1
2
  import { RectAnchor } from '../geometry/rect';
2
3
  /**
3
4
  * 把任意字符串收窄为合法 RectAnchor,否则 undefined
4
5
  * @description 内置 4 shape 的 anchor 只认这 9 名;不在集合内返回 undefined,由 `anchorOf` 抛 Unknown anchor
5
6
  */
6
7
  export declare const asRectAnchor: (name: string) => RectAnchor | undefined;
8
+ /** sector / arc 共用的角度约定起止角 */
9
+ type AngularRange = {
10
+ /** 规范化后的起始角(度)= 原 startAngle */
11
+ start: number;
12
+ /** 规范化后的终止角(度)≥ start(end<start 时已加 360°) */
13
+ end: number;
14
+ /** 起止角中分角(度),= (start + end) / 2 */
15
+ mid: number;
16
+ };
17
+ /**
18
+ * 规范化起止角:保证 end ≥ start(end<start 时加 360° 直至 ≥ start),并给出中分角
19
+ * @description 角度沿屏幕系(角度递增=CW)从 start 扫到 end;end<start 视为跨过 360°,与 polar / geometry/arc 约定一致。
20
+ * end<start 时一次性加上 360°·k(k 为使 end ≥ start 的最小非负整数),O(1) 闭式计算——
21
+ * 避免 while 循环在巨型角度(如 1e308 浮点 end+360===end 卡死、1e9 退化成数百万次迭代)下挂死。
22
+ * end 已 ≥ start 时 ceil((start−end)/360) ≤ 0,k 取 0、end 不变(语义与原逐次加法等价)。
23
+ */
24
+ export declare const normalizeAngularRange: (startAngle: number, endAngle: number) => AngularRange;
25
+ /**
26
+ * sector 的派生几何(circumscribe / boundaryPoint / anchor / emit 单一真源)
27
+ * @description 据 params(内外半径 + 起止角)在「圆心(apex)为原点」局部系算精确 AABB 与各特征点偏移。
28
+ * AABB 覆盖 圆心 ∪ 外弧 ∪ 内弧(含弧跨过的 90°·k 轴向 outerRadius 极值点),其半轴即 circumscribe 输出;
29
+ * apex / centroid 等特征点以「相对 AABB 中心的偏移」给出,便于上层用 rect.center + offset 落到世界系。
30
+ */
31
+ export type SectorGeometry = {
32
+ /** 规范化起止角与中分角 */
33
+ range: AngularRange;
34
+ /** 含圆心 + 内外弧的精确 AABB 半轴(circumscribe 输出) */
35
+ aabbHalfAxes: {
36
+ halfWidth: number;
37
+ halfHeight: number;
38
+ };
39
+ /** 圆心(apex)相对 AABB 中心的偏移(apex 常在 AABB 内角,非 AABB 中心) */
40
+ apexOffset: Position;
41
+ /** 质心(centroid)相对 AABB 中心的偏移(落在环楔内,作 boundaryPoint 向外射线起点) */
42
+ centroidOffset: Position;
43
+ };
44
+ /** sector params 的最小结构(与 sector.ts 的 SectorParams 同形,避免循环 import 类型) */
45
+ type SectorGeometryInput = {
46
+ innerRadius: number;
47
+ outerRadius: number;
48
+ startAngle: number;
49
+ endAngle: number;
50
+ };
51
+ /**
52
+ * 计算 sector 单一真源几何
53
+ * @description 局部系以圆心为原点:候选极值点 = 圆心(0,0) ∪ 外弧 bbox 点 ∪ 内弧 bbox 点
54
+ * (arcBoundingPoints 已含起止端点与区间内 90°·k 轴向点)。由这些点的 min/max 得 AABB,
55
+ * AABB 中心相对圆心的偏移即 −apexOffset。质心用环楔解析公式(极坐标积分)。
56
+ */
57
+ export declare const sectorGeometry: (params: SectorGeometryInput) => SectorGeometry;
58
+ /** sector 局部系点(圆心为原点):极角(度) + 半径 → 直角坐标 */
59
+ export declare const sectorPolarPoint: (radius: number, angleDeg: number) => Position;
60
+ export {};
7
61
  //# sourceMappingURL=_shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/shapes/_shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKjE;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,UAAU,GAAG,SACK,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;AAClD,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKjE;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,UAAU,GAAG,SACK,CAAC;AAI/D,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,8DAA8D;IAC9D,cAAc,EAAE,QAAQ,CAAC;CAC1B,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,cA0D5D,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,QAC7B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { RECT_ANCHORS } from "../geometry/rect.js";
2
+ import { arcBoundingPoints, arcEndPoint } from "../geometry/arc.js";
2
3
  //#region src/shapes/_shared.ts
3
4
  /** RECT_ANCHORS 的 9 个合法 anchor 名集合(成员校验用) */
4
5
  var RECT_ANCHOR_SET = new Set(Object.values(RECT_ANCHORS));
@@ -7,5 +8,71 @@ var RECT_ANCHOR_SET = new Set(Object.values(RECT_ANCHORS));
7
8
  * @description 内置 4 shape 的 anchor 只认这 9 名;不在集合内返回 undefined,由 `anchorOf` 抛 Unknown anchor
8
9
  */
9
10
  var asRectAnchor = (name) => RECT_ANCHOR_SET.has(name) ? name : void 0;
11
+ var DEG_TO_RAD = Math.PI / 180;
12
+ /**
13
+ * 规范化起止角:保证 end ≥ start(end<start 时加 360° 直至 ≥ start),并给出中分角
14
+ * @description 角度沿屏幕系(角度递增=CW)从 start 扫到 end;end<start 视为跨过 360°,与 polar / geometry/arc 约定一致。
15
+ * end<start 时一次性加上 360°·k(k 为使 end ≥ start 的最小非负整数),O(1) 闭式计算——
16
+ * 避免 while 循环在巨型角度(如 1e308 浮点 end+360===end 卡死、1e9 退化成数百万次迭代)下挂死。
17
+ * end 已 ≥ start 时 ceil((start−end)/360) ≤ 0,k 取 0、end 不变(语义与原逐次加法等价)。
18
+ */
19
+ var normalizeAngularRange = (startAngle, endAngle) => {
20
+ const end = endAngle + 360 * Math.max(0, Math.ceil((startAngle - endAngle) / 360));
21
+ return {
22
+ start: startAngle,
23
+ end,
24
+ mid: (startAngle + end) / 2
25
+ };
26
+ };
27
+ /**
28
+ * 计算 sector 单一真源几何
29
+ * @description 局部系以圆心为原点:候选极值点 = 圆心(0,0) ∪ 外弧 bbox 点 ∪ 内弧 bbox 点
30
+ * (arcBoundingPoints 已含起止端点与区间内 90°·k 轴向点)。由这些点的 min/max 得 AABB,
31
+ * AABB 中心相对圆心的偏移即 −apexOffset。质心用环楔解析公式(极坐标积分)。
32
+ */
33
+ var sectorGeometry = (params) => {
34
+ const { innerRadius, outerRadius } = params;
35
+ const range = normalizeAngularRange(params.startAngle, params.endAngle);
36
+ const apex = [0, 0];
37
+ const candidates = [apex];
38
+ candidates.push(...arcBoundingPoints(apex, outerRadius, range.start, range.end));
39
+ if (innerRadius > 0) candidates.push(...arcBoundingPoints(apex, innerRadius, range.start, range.end));
40
+ let minX = Infinity;
41
+ let maxX = -Infinity;
42
+ let minY = Infinity;
43
+ let maxY = -Infinity;
44
+ for (const [px, py] of candidates) {
45
+ if (px < minX) minX = px;
46
+ if (px > maxX) maxX = px;
47
+ if (py < minY) minY = py;
48
+ if (py > maxY) maxY = py;
49
+ }
50
+ const halfWidth = (maxX - minX) / 2;
51
+ const halfHeight = (maxY - minY) / 2;
52
+ const aabbCenter = [(minX + maxX) / 2, (minY + maxY) / 2];
53
+ const apexOffset = [-aabbCenter[0], -aabbCenter[1]];
54
+ const sweepRad = (range.end - range.start) * DEG_TO_RAD;
55
+ const midRad = range.mid * DEG_TO_RAD;
56
+ const R = outerRadius;
57
+ const r = innerRadius;
58
+ const half = sweepRad / 2;
59
+ const areaDenom = R * R - r * r;
60
+ let centroidRadius;
61
+ if (Math.abs(half) < 1e-9 || Math.abs(areaDenom) < 1e-12) centroidRadius = (R + r) / 2;
62
+ else centroidRadius = 2 / 3 * (Math.sin(half) / half) * ((R * R * R - r * r * r) / areaDenom);
63
+ const centroidLocal = [Math.cos(midRad) * centroidRadius, Math.sin(midRad) * centroidRadius];
64
+ const centroidOffset = [centroidLocal[0] - aabbCenter[0], centroidLocal[1] - aabbCenter[1]];
65
+ return {
66
+ range,
67
+ aabbHalfAxes: {
68
+ halfWidth,
69
+ halfHeight
70
+ },
71
+ apexOffset,
72
+ centroidOffset
73
+ };
74
+ };
75
+ /** sector 局部系点(圆心为原点):极角(度) + 半径 → 直角坐标 */
76
+ var sectorPolarPoint = (radius, angleDeg) => arcEndPoint([0, 0], radius, angleDeg);
10
77
  //#endregion
11
- export { asRectAnchor };
78
+ export { asRectAnchor, normalizeAngularRange, sectorGeometry, sectorPolarPoint };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * arc 注册项:单半径曲线(描边、可选闭合为弓形)
3
+ * @description circumscribe 返回弧 bbox 半轴(含弧跨过的 90°·k 轴向极值点),node position = AABB 中心;
4
+ * emit 出弧 path(close=false 开放描边、无 close 命令;close=true 弦闭合成弓形可填充);anchor 提供
5
+ * arc-mid(弧中点)/ start / end / center(圆心)。scaleParams 只缩 radius、不缩角度与 close。
6
+ */
7
+ export declare const arc: import('./types').ShapeDefinition;
8
+ //# sourceMappingURL=arc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arc.d.ts","sourceRoot":"","sources":["../../../src/shapes/arc.ts"],"names":[],"mappings":"AA8DA;;;;;GAKG;AACH,eAAO,MAAM,GAAG,mCA8Ed,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { localToWorld } from "../geometry/_transform.js";
2
+ import { arcBoundingPoints, arcEndPoint } from "../geometry/arc.js";
3
+ import { defineShape } from "./define.js";
4
+ import { normalizeAngularRange } from "./_shared.js";
5
+ import { z } from "zod";
6
+ //#region src/shapes/arc.ts
7
+ /** arc 的派生几何:圆心局部系 AABB + 圆心相对 AABB 中心偏移 */
8
+ var arcGeometry = (params) => {
9
+ const { radius } = params;
10
+ const range = normalizeAngularRange(params.startAngle, params.endAngle);
11
+ const points = arcBoundingPoints([0, 0], radius, range.start, range.end);
12
+ let minX = Infinity;
13
+ let maxX = -Infinity;
14
+ let minY = Infinity;
15
+ let maxY = -Infinity;
16
+ for (const [px, py] of points) {
17
+ if (px < minX) minX = px;
18
+ if (px > maxX) maxX = px;
19
+ if (py < minY) minY = py;
20
+ if (py > maxY) maxY = py;
21
+ }
22
+ const aabbCenter = [(minX + maxX) / 2, (minY + maxY) / 2];
23
+ return {
24
+ range,
25
+ aabbHalfAxes: {
26
+ halfWidth: (maxX - minX) / 2,
27
+ halfHeight: (maxY - minY) / 2
28
+ },
29
+ centerOffset: [-aabbCenter[0], -aabbCenter[1]]
30
+ };
31
+ };
32
+ /** 圆心局部点(相对圆心)→ 世界系(+centerOffset 到相对 AABB 中心后经 rect 投影) */
33
+ var arcLocalToWorld = (rect, centerOffset, localFromCenter) => localToWorld(rect, [localFromCenter[0] + centerOffset[0], localFromCenter[1] + centerOffset[1]]);
34
+ /**
35
+ * arc 注册项:单半径曲线(描边、可选闭合为弓形)
36
+ * @description circumscribe 返回弧 bbox 半轴(含弧跨过的 90°·k 轴向极值点),node position = AABB 中心;
37
+ * emit 出弧 path(close=false 开放描边、无 close 命令;close=true 弦闭合成弓形可填充);anchor 提供
38
+ * arc-mid(弧中点)/ start / end / center(圆心)。scaleParams 只缩 radius、不缩角度与 close。
39
+ */
40
+ var arc = defineShape({
41
+ paramsSchema: z.strictObject({
42
+ radius: z.number().finite().positive().describe("Arc radius in user units."),
43
+ startAngle: z.number().finite().describe("Start angle in degrees; polar convention 0°=+x, 90°=+y (screen y-down), matching core polar."),
44
+ endAngle: z.number().finite().describe("End angle in degrees; swept from startAngle in screen space."),
45
+ close: z.boolean().optional().describe("When true, close the arc into a chord/segment outline (fillable); default false = open stroked arc.")
46
+ }),
47
+ circumscribe: (_hw, _hh, params) => arcGeometry(params).aabbHalfAxes,
48
+ circumscribeOffset: (params) => {
49
+ const { centerOffset } = arcGeometry(params);
50
+ return [-centerOffset[0], -centerOffset[1]];
51
+ },
52
+ boundaryPoint: (rect, _toward, params) => {
53
+ const geo = arcGeometry(params);
54
+ return arcLocalToWorld(rect, geo.centerOffset, arcEndPoint([0, 0], params.radius, geo.range.mid));
55
+ },
56
+ anchor: (rect, name, params) => {
57
+ const geo = arcGeometry(params);
58
+ const { radius } = params;
59
+ const { start, end, mid } = geo.range;
60
+ const at = (angle) => arcLocalToWorld(rect, geo.centerOffset, arcEndPoint([0, 0], radius, angle));
61
+ switch (name) {
62
+ case "center": return arcLocalToWorld(rect, geo.centerOffset, [0, 0]);
63
+ case "arc-mid": return at(mid);
64
+ case "start": return at(start);
65
+ case "end": return at(end);
66
+ default: return;
67
+ }
68
+ },
69
+ *emit(rect, style, round, params) {
70
+ const geo = arcGeometry(params);
71
+ const { radius, close } = params;
72
+ const { start, end } = geo.range;
73
+ const rp = (p) => [round(p[0]), round(p[1])];
74
+ const center = arcLocalToWorld(rect, geo.centerOffset, [0, 0]);
75
+ const commands = [{
76
+ kind: "move",
77
+ to: rp(arcLocalToWorld(rect, geo.centerOffset, arcEndPoint([0, 0], radius, start)))
78
+ }, {
79
+ kind: "arc",
80
+ center: rp(center),
81
+ radius: round(radius),
82
+ startAngle: start,
83
+ endAngle: end
84
+ }];
85
+ if (close) commands.push({ kind: "close" });
86
+ yield {
87
+ type: "path",
88
+ commands,
89
+ fill: close ? style.fill ?? "transparent" : "transparent",
90
+ fillOpacity: style.fillOpacity,
91
+ stroke: style.stroke ?? "currentColor",
92
+ strokeOpacity: style.strokeOpacity,
93
+ strokeWidth: style.strokeWidth ?? 1,
94
+ dashPattern: style.dashPattern,
95
+ opacity: style.opacity
96
+ };
97
+ },
98
+ scaleParams: (params, sx, sy) => ({
99
+ ...params,
100
+ radius: params.radius * Math.sqrt(sx * sy)
101
+ })
102
+ });
103
+ //#endregion
104
+ export { arc };
@@ -0,0 +1,13 @@
1
+ import { IRJsonObject } from '../ir/json';
2
+ import { ShapeDefinition, ShapeDefinitionInput } from './types';
3
+ /**
4
+ * 注册一个参数化 shape(定义点 typed,返回擦除形态进 registry)
5
+ * @description 定义点用具体 `TParams` 拿全程类型安全(`paramsSchema` 输出与 5 个计算函数末位 `params` 同型),
6
+ * 返回擦除成 `ShapeDefinition`(所有函数收 `IRJsonObject`)供同构 registry 存放。擦除的单点 cast 封在此处,
7
+ * **形状实现者不 cast**。含函数与 `paramsSchema`,**不进 IR**——它是 `CompileOptions.shapes` 运行时注入的
8
+ * TS 对象,符合 IR 100% JSON 可序列化约束(函数只在运行时注入面,不在 IR 字段里)。
9
+ * @param def shape 定义(paramsSchema / circumscribe / boundaryPoint / anchor / edgePoint? / emit)
10
+ * @returns 擦除成 `ShapeDefinition` 的同一份 def(便于 `export const sector = defineShape({ ... })`)
11
+ */
12
+ export declare const defineShape: <TParams extends IRJsonObject>(def: ShapeDefinitionInput<TParams>) => ShapeDefinition;
13
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../../src/shapes/define.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAErE;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,OAAO,SAAS,YAAY,EACtD,KAAK,oBAAoB,CAAC,OAAO,CAAC,KACjC,eAAoD,CAAC"}
@@ -0,0 +1,13 @@
1
+ //#region src/shapes/define.ts
2
+ /**
3
+ * 注册一个参数化 shape(定义点 typed,返回擦除形态进 registry)
4
+ * @description 定义点用具体 `TParams` 拿全程类型安全(`paramsSchema` 输出与 5 个计算函数末位 `params` 同型),
5
+ * 返回擦除成 `ShapeDefinition`(所有函数收 `IRJsonObject`)供同构 registry 存放。擦除的单点 cast 封在此处,
6
+ * **形状实现者不 cast**。含函数与 `paramsSchema`,**不进 IR**——它是 `CompileOptions.shapes` 运行时注入的
7
+ * TS 对象,符合 IR 100% JSON 可序列化约束(函数只在运行时注入面,不在 IR 字段里)。
8
+ * @param def shape 定义(paramsSchema / circumscribe / boundaryPoint / anchor / edgePoint? / emit)
9
+ * @returns 擦除成 `ShapeDefinition` 的同一份 def(便于 `export const sector = defineShape({ ... })`)
10
+ */
11
+ var defineShape = (def) => def;
12
+ //#endregion
13
+ export { defineShape };
@@ -1,8 +1,9 @@
1
- import { ShapeDefinition } from './types';
2
1
  /**
3
2
  * ellipse 注册项
4
- * @description circumscribe = 内框 ×√2(内框 4 顶点落在椭圆周上);几何由外接框半轴派生;
5
- * emit EllipsePrim,与旧 `emitEllipseShape` 逐字段等价
3
+ * @description circumscribe `params.circumscribe` 控制:`'equal'`(等轴,circle:两轴 = 内框对角线半长
4
+ * `√(hw²+hh²)`)/ `'proportional'`(默认,各轴 ×√2,内框 4 顶点落在椭圆周上)。几何由外接框半轴派生;
5
+ * emit / anchor / edgePoint / boundaryPoint 只一套(不读 `params`)。circle 在 compile 期规范化为
6
+ * `{ type: 'ellipse', params: { circumscribe: 'equal' } }`。
6
7
  */
7
- export declare const ellipse: ShapeDefinition;
8
+ export declare const ellipse: import('./types').ShapeDefinition;
8
9
  //# sourceMappingURL=ellipse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/shapes/ellipse.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAW/C;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAE,eAwBrB,CAAC"}
1
+ {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/shapes/ellipse.ts"],"names":[],"mappings":"AAgBA;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,mCAmClB,CAAC"}
@@ -1,5 +1,7 @@
1
- import { ellipse as ellipse$1 } from "../geometry/ellipse.js";
1
+ import { defineShape } from "./define.js";
2
2
  import { asRectAnchor } from "./_shared.js";
3
+ import { ellipse as ellipse$1 } from "../geometry/ellipse.js";
4
+ import { z } from "zod";
3
5
  //#region src/shapes/ellipse.ts
4
6
  /** 外接框 Rect → Ellipse(rx/ry = 半宽/半高) */
5
7
  var toEllipse = (r) => ({
@@ -11,14 +13,20 @@ var toEllipse = (r) => ({
11
13
  });
12
14
  /**
13
15
  * ellipse 注册项
14
- * @description circumscribe = 内框 ×√2(内框 4 顶点落在椭圆周上);几何由外接框半轴派生;
15
- * emit EllipsePrim,与旧 `emitEllipseShape` 逐字段等价
16
+ * @description circumscribe `params.circumscribe` 控制:`'equal'`(等轴,circle:两轴 = 内框对角线半长
17
+ * `√(hw²+hh²)`)/ `'proportional'`(默认,各轴 ×√2,内框 4 顶点落在椭圆周上)。几何由外接框半轴派生;
18
+ * emit / anchor / edgePoint / boundaryPoint 只一套(不读 `params`)。circle 在 compile 期规范化为
19
+ * `{ type: 'ellipse', params: { circumscribe: 'equal' } }`。
16
20
  */
17
- var ellipse = {
18
- circumscribe: (hw, hh) => ({
21
+ var ellipse = defineShape({
22
+ paramsSchema: z.strictObject({ circumscribe: z.enum(["proportional", "equal"]).optional().describe("Circumscription policy from the inner content box: \"proportional\" (per-axis ×√2, ellipse) or \"equal\" (isotropic, circle: r = diagonal half-length). Default \"proportional\".") }),
23
+ circumscribe: (hw, hh, params) => params.circumscribe === "equal" ? {
24
+ halfWidth: Math.hypot(hw, hh),
25
+ halfHeight: Math.hypot(hw, hh)
26
+ } : {
19
27
  halfWidth: hw * Math.SQRT2,
20
28
  halfHeight: hh * Math.SQRT2
21
- }),
29
+ },
22
30
  boundaryPoint: (r, toward) => ellipse$1.boundaryPoint(toEllipse(r), toward),
23
31
  anchor: (r, name) => {
24
32
  const a = asRectAnchor(name);
@@ -41,6 +49,6 @@ var ellipse = {
41
49
  opacity: style.opacity
42
50
  };
43
51
  }
44
- };
52
+ });
45
53
  //#endregion
46
54
  export { ellipse };
@@ -1,13 +1,16 @@
1
1
  import { BuiltinShapeName } from '../ir/node';
2
- import { circle } from './circle';
3
- import { diamond } from './diamond';
2
+ import { arc } from './arc';
3
+ import { defineShape } from './define';
4
4
  import { ellipse } from './ellipse';
5
+ import { polygon } from './polygon';
5
6
  import { rectangle } from './rectangle';
7
+ import { sector } from './sector';
8
+ import { star } from './star';
6
9
  import { ShapeDefinition } from './types';
7
- /** 内置 4 shape 注册项;与 `CompileOptions.shapes` 合并时被同名注入覆盖 */
8
- export declare const BUILTIN_SHAPES: Record<BuiltinShapeName, ShapeDefinition>;
9
- export { rectangle, circle, ellipse, diamond };
10
- export type { ShapeDefinition, ShapeStyle } from './types';
10
+ /** 内置 shape 注册项(circle / diamond 已收为 preset,不占独立项);与 `CompileOptions.shapes` 合并时被同名注入覆盖 */
11
+ export declare const BUILTIN_SHAPES: Record<Exclude<BuiltinShapeName, 'circle' | 'diamond'> | 'sector' | 'arc' | 'polygon' | 'star', ShapeDefinition>;
12
+ export { rectangle, ellipse, polygon, sector, arc, star, defineShape };
13
+ export type { ShapeDefinition, ShapeDefinitionInput, ShapeStyle } from './types';
11
14
  export type { Rect } from '../geometry/rect';
12
15
  export type { Position } from '../geometry/point';
13
16
  export { worldToLocal, localToWorld } from '../geometry/_transform';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shapes/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,0DAA0D;AAC1D,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAKpE,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE3D,YAAY,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shapes/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,2FAA2F;AAC3F,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,GAAG,SAAS,CAAC,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,EAAE,eAAe,CAO3I,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AACvE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEjF,YAAY,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,15 +1,20 @@
1
1
  import "../geometry/_transform.js";
2
+ import "./define.js";
3
+ import { arc } from "./arc.js";
2
4
  import { ellipse } from "./ellipse.js";
3
- import { circle } from "./circle.js";
4
- import { diamond } from "./diamond.js";
5
+ import { polygon } from "./polygon.js";
5
6
  import { rectangle } from "./rectangle.js";
7
+ import { sector } from "./sector.js";
8
+ import { star } from "./star.js";
6
9
  //#region src/shapes/index.ts
7
- /** 内置 4 shape 注册项;与 `CompileOptions.shapes` 合并时被同名注入覆盖 */
10
+ /** 内置 shape 注册项(circle / diamond 已收为 preset,不占独立项);与 `CompileOptions.shapes` 合并时被同名注入覆盖 */
8
11
  var BUILTIN_SHAPES = {
9
12
  rectangle,
10
- circle,
11
13
  ellipse,
12
- diamond
14
+ sector,
15
+ arc,
16
+ polygon,
17
+ star
13
18
  };
14
19
  //#endregion
15
20
  export { BUILTIN_SHAPES };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * polygon 注册项:正多边形(sides 顶点均布外接圆,rotate 定起始角,cornerRadius 顶点倒角)
3
+ * @description 文本容器形状——circumscribe 从内框 `innerHalfWidth/Height` 推能容纳内框的外接圆、再取其 AABB 半轴,
4
+ * 尺寸仍由内框 + minimumSize 驱动(区别于 sector / star 的 params-半径驱动)。emit / boundaryPoint 把顶点环构造成
5
+ * `sides` 条折线段,委托 rounded-contour 模块:cornerRadius 省略 / 0 出原尖角轮廓、>0 在每个顶点插逐角夹紧的
6
+ * fillet 弧。emit 收轴对齐 rect(旋转由外层 group 施加)、boundaryPoint 收带 rotate 的 rect 且 rayOrigin = 几何中心
7
+ * (多边形关于中心对称,AABB 中心 = 形心 = node position)。命名 anchor 走外接 AABB 的 9 名 rect anchor(不随
8
+ * cornerRadius 移);self-rotate(params.rotate)与 Node.rotate 叠加。scaleParams:cornerRadius 是长度随 scale
9
+ * 缩(几何均值因子),sides 计数 / rotate 角度不缩。
10
+ * diamond ≡ `{ type: 'polygon', params: { sides: 4, rotate: 45 } }`,由 compile 规范化。
11
+ */
12
+ export declare const polygon: import('./types').ShapeDefinition;
13
+ //# sourceMappingURL=polygon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polygon.d.ts","sourceRoot":"","sources":["../../../src/shapes/polygon.ts"],"names":[],"mappings":"AA8EA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,mCAiElB,CAAC"}