@retikz/core 0.1.0-alpha.5 → 0.1.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 (231) hide show
  1. package/dist/es/compile/compile.d.ts +20 -3
  2. package/dist/es/compile/compile.d.ts.map +1 -1
  3. package/dist/es/compile/compile.js +44 -19
  4. package/dist/es/compile/index.d.ts +2 -2
  5. package/dist/es/compile/index.d.ts.map +1 -1
  6. package/dist/es/compile/layout.d.ts +5 -0
  7. package/dist/es/compile/layout.d.ts.map +1 -0
  8. package/dist/es/compile/{view-box.js → layout.js} +4 -4
  9. package/dist/es/compile/node.d.ts +4 -4
  10. package/dist/es/compile/node.d.ts.map +1 -1
  11. package/dist/es/compile/node.js +7 -7
  12. package/dist/es/compile/path/anchor.d.ts +19 -0
  13. package/dist/es/compile/path/anchor.d.ts.map +1 -0
  14. package/dist/es/compile/path/anchor.js +54 -0
  15. package/dist/es/compile/path/arrow-geometry.d.ts +22 -0
  16. package/dist/es/compile/path/arrow-geometry.d.ts.map +1 -0
  17. package/dist/es/compile/path/arrow-geometry.js +40 -0
  18. package/dist/es/compile/{path.d.ts → path/index.d.ts} +18 -7
  19. package/dist/es/compile/path/index.d.ts.map +1 -0
  20. package/dist/es/compile/path/index.js +308 -0
  21. package/dist/es/compile/path/label.d.ts +18 -0
  22. package/dist/es/compile/path/label.d.ts.map +1 -0
  23. package/dist/es/compile/path/label.js +102 -0
  24. package/dist/es/compile/path/relative.d.ts +8 -0
  25. package/dist/es/compile/path/relative.d.ts.map +1 -0
  26. package/dist/es/compile/path/relative.js +48 -0
  27. package/dist/es/compile/path/shrink.d.ts +18 -0
  28. package/dist/es/compile/path/shrink.d.ts.map +1 -0
  29. package/dist/es/compile/path/shrink.js +126 -0
  30. package/dist/es/compile/path/split.d.ts +15 -0
  31. package/dist/es/compile/path/split.d.ts.map +1 -0
  32. package/dist/es/compile/path/split.js +46 -0
  33. package/dist/es/compile/text-metrics.d.ts +4 -1
  34. package/dist/es/compile/text-metrics.d.ts.map +1 -1
  35. package/dist/es/compile/text-metrics.js +11 -5
  36. package/dist/es/geometry/_transform.d.ts +21 -0
  37. package/dist/es/geometry/_transform.d.ts.map +1 -0
  38. package/dist/es/geometry/_transform.js +27 -0
  39. package/dist/es/geometry/bend.d.ts +1 -1
  40. package/dist/es/geometry/bend.js +1 -1
  41. package/dist/es/geometry/circle.d.ts +2 -3
  42. package/dist/es/geometry/circle.d.ts.map +1 -1
  43. package/dist/es/geometry/circle.js +1 -16
  44. package/dist/es/geometry/diamond.d.ts +2 -3
  45. package/dist/es/geometry/diamond.d.ts.map +1 -1
  46. package/dist/es/geometry/diamond.js +1 -16
  47. package/dist/es/geometry/ellipse.d.ts +2 -3
  48. package/dist/es/geometry/ellipse.d.ts.map +1 -1
  49. package/dist/es/geometry/ellipse.js +1 -16
  50. package/dist/es/geometry/polar.d.ts +2 -2
  51. package/dist/es/geometry/polar.d.ts.map +1 -1
  52. package/dist/es/geometry/polar.js +2 -6
  53. package/dist/es/geometry/rect.d.ts.map +1 -1
  54. package/dist/es/geometry/rect.js +1 -18
  55. package/dist/es/geometry/segment.d.ts +5 -1
  56. package/dist/es/geometry/segment.d.ts.map +1 -1
  57. package/dist/es/index.d.ts +11 -7
  58. package/dist/es/index.d.ts.map +1 -1
  59. package/dist/es/index.js +5 -2
  60. package/dist/es/ir/coordinate.d.ts +1 -1
  61. package/dist/es/ir/coordinate.js +1 -1
  62. package/dist/es/ir/font.d.ts +21 -0
  63. package/dist/es/ir/font.d.ts.map +1 -0
  64. package/dist/es/ir/font.js +15 -0
  65. package/dist/es/ir/index.d.ts +2 -0
  66. package/dist/es/ir/index.d.ts.map +1 -1
  67. package/dist/es/ir/node.d.ts +32 -143
  68. package/dist/es/ir/node.d.ts.map +1 -1
  69. package/dist/es/ir/node.js +7 -31
  70. package/dist/es/ir/path/arrow.d.ts +14 -14
  71. package/dist/es/ir/path/arrow.d.ts.map +1 -1
  72. package/dist/es/ir/path/arrow.js +5 -5
  73. package/dist/es/ir/path/path.d.ts +19 -19
  74. package/dist/es/ir/path/path.d.ts.map +1 -1
  75. package/dist/es/ir/path/path.js +4 -4
  76. package/dist/es/ir/path/step.d.ts +1 -1
  77. package/dist/es/ir/path/step.d.ts.map +1 -1
  78. package/dist/es/ir/path/step.js +8 -8
  79. package/dist/es/ir/position/at-position.js +1 -1
  80. package/dist/es/ir/position/offset-position.js +1 -1
  81. package/dist/es/ir/position/polar-position.d.ts.map +1 -1
  82. package/dist/es/ir/position/polar-position.js +2 -2
  83. package/dist/es/ir/position/position.d.ts.map +1 -1
  84. package/dist/es/ir/position/position.js +1 -1
  85. package/dist/es/ir/scene.d.ts +128 -128
  86. package/dist/es/ir/text.d.ts +96 -0
  87. package/dist/es/ir/text.d.ts.map +1 -0
  88. package/dist/es/ir/text.js +20 -0
  89. package/dist/es/parsers/parseTargetSugar.d.ts +4 -0
  90. package/dist/es/parsers/parseTargetSugar.d.ts.map +1 -1
  91. package/dist/es/parsers/parseTargetSugar.js +3 -2
  92. package/dist/es/primitive/ellipse.d.ts +3 -3
  93. package/dist/es/primitive/ellipse.d.ts.map +1 -1
  94. package/dist/es/primitive/group.d.ts +23 -7
  95. package/dist/es/primitive/group.d.ts.map +1 -1
  96. package/dist/es/primitive/index.d.ts +1 -1
  97. package/dist/es/primitive/index.d.ts.map +1 -1
  98. package/dist/es/primitive/layout.d.ts +12 -0
  99. package/dist/es/primitive/layout.d.ts.map +1 -0
  100. package/dist/es/primitive/path.d.ts +55 -15
  101. package/dist/es/primitive/path.d.ts.map +1 -1
  102. package/dist/es/primitive/rect.d.ts +3 -3
  103. package/dist/es/primitive/rect.d.ts.map +1 -1
  104. package/dist/es/primitive/scene.d.ts +4 -4
  105. package/dist/es/primitive/scene.d.ts.map +1 -1
  106. package/dist/es/primitive/text.d.ts +10 -3
  107. package/dist/es/primitive/text.d.ts.map +1 -1
  108. package/dist/es/types.d.ts +8 -0
  109. package/dist/es/types.d.ts.map +1 -1
  110. package/dist/lib/compile/compile.cjs +44 -19
  111. package/dist/lib/compile/compile.d.ts +20 -3
  112. package/dist/lib/compile/compile.d.ts.map +1 -1
  113. package/dist/lib/compile/index.d.ts +2 -2
  114. package/dist/lib/compile/index.d.ts.map +1 -1
  115. package/dist/lib/compile/{view-box.cjs → layout.cjs} +4 -4
  116. package/dist/lib/compile/layout.d.ts +5 -0
  117. package/dist/lib/compile/layout.d.ts.map +1 -0
  118. package/dist/lib/compile/node.cjs +7 -7
  119. package/dist/lib/compile/node.d.ts +4 -4
  120. package/dist/lib/compile/node.d.ts.map +1 -1
  121. package/dist/lib/compile/path/anchor.cjs +58 -0
  122. package/dist/lib/compile/path/anchor.d.ts +19 -0
  123. package/dist/lib/compile/path/anchor.d.ts.map +1 -0
  124. package/dist/lib/compile/path/arrow-geometry.cjs +41 -0
  125. package/dist/lib/compile/path/arrow-geometry.d.ts +22 -0
  126. package/dist/lib/compile/path/arrow-geometry.d.ts.map +1 -0
  127. package/dist/lib/compile/path/index.cjs +308 -0
  128. package/dist/lib/compile/{path.d.ts → path/index.d.ts} +18 -7
  129. package/dist/lib/compile/path/index.d.ts.map +1 -0
  130. package/dist/lib/compile/path/label.cjs +103 -0
  131. package/dist/lib/compile/path/label.d.ts +18 -0
  132. package/dist/lib/compile/path/label.d.ts.map +1 -0
  133. package/dist/lib/compile/path/relative.cjs +48 -0
  134. package/dist/lib/compile/path/relative.d.ts +8 -0
  135. package/dist/lib/compile/path/relative.d.ts.map +1 -0
  136. package/dist/lib/compile/path/shrink.cjs +128 -0
  137. package/dist/lib/compile/path/shrink.d.ts +18 -0
  138. package/dist/lib/compile/path/shrink.d.ts.map +1 -0
  139. package/dist/lib/compile/path/split.cjs +46 -0
  140. package/dist/lib/compile/path/split.d.ts +15 -0
  141. package/dist/lib/compile/path/split.d.ts.map +1 -0
  142. package/dist/lib/compile/text-metrics.cjs +11 -5
  143. package/dist/lib/compile/text-metrics.d.ts +4 -1
  144. package/dist/lib/compile/text-metrics.d.ts.map +1 -1
  145. package/dist/lib/geometry/_transform.cjs +28 -0
  146. package/dist/lib/geometry/_transform.d.ts +21 -0
  147. package/dist/lib/geometry/_transform.d.ts.map +1 -0
  148. package/dist/lib/geometry/bend.cjs +1 -1
  149. package/dist/lib/geometry/bend.d.ts +1 -1
  150. package/dist/lib/geometry/circle.cjs +5 -20
  151. package/dist/lib/geometry/circle.d.ts +2 -3
  152. package/dist/lib/geometry/circle.d.ts.map +1 -1
  153. package/dist/lib/geometry/diamond.cjs +5 -20
  154. package/dist/lib/geometry/diamond.d.ts +2 -3
  155. package/dist/lib/geometry/diamond.d.ts.map +1 -1
  156. package/dist/lib/geometry/ellipse.cjs +5 -20
  157. package/dist/lib/geometry/ellipse.d.ts +2 -3
  158. package/dist/lib/geometry/ellipse.d.ts.map +1 -1
  159. package/dist/lib/geometry/polar.cjs +2 -6
  160. package/dist/lib/geometry/polar.d.ts +2 -2
  161. package/dist/lib/geometry/polar.d.ts.map +1 -1
  162. package/dist/lib/geometry/rect.cjs +5 -22
  163. package/dist/lib/geometry/rect.d.ts.map +1 -1
  164. package/dist/lib/geometry/segment.d.ts +5 -1
  165. package/dist/lib/geometry/segment.d.ts.map +1 -1
  166. package/dist/lib/index.cjs +7 -3
  167. package/dist/lib/index.d.ts +11 -7
  168. package/dist/lib/index.d.ts.map +1 -1
  169. package/dist/lib/ir/coordinate.cjs +1 -1
  170. package/dist/lib/ir/coordinate.d.ts +1 -1
  171. package/dist/lib/ir/font.cjs +15 -0
  172. package/dist/lib/ir/font.d.ts +21 -0
  173. package/dist/lib/ir/font.d.ts.map +1 -0
  174. package/dist/lib/ir/index.d.ts +2 -0
  175. package/dist/lib/ir/index.d.ts.map +1 -1
  176. package/dist/lib/ir/node.cjs +8 -35
  177. package/dist/lib/ir/node.d.ts +32 -143
  178. package/dist/lib/ir/node.d.ts.map +1 -1
  179. package/dist/lib/ir/path/arrow.cjs +5 -5
  180. package/dist/lib/ir/path/arrow.d.ts +14 -14
  181. package/dist/lib/ir/path/arrow.d.ts.map +1 -1
  182. package/dist/lib/ir/path/path.cjs +4 -4
  183. package/dist/lib/ir/path/path.d.ts +19 -19
  184. package/dist/lib/ir/path/path.d.ts.map +1 -1
  185. package/dist/lib/ir/path/step.cjs +8 -8
  186. package/dist/lib/ir/path/step.d.ts +1 -1
  187. package/dist/lib/ir/path/step.d.ts.map +1 -1
  188. package/dist/lib/ir/position/at-position.cjs +1 -1
  189. package/dist/lib/ir/position/offset-position.cjs +1 -1
  190. package/dist/lib/ir/position/polar-position.cjs +2 -2
  191. package/dist/lib/ir/position/polar-position.d.ts.map +1 -1
  192. package/dist/lib/ir/position/position.cjs +1 -1
  193. package/dist/lib/ir/position/position.d.ts.map +1 -1
  194. package/dist/lib/ir/scene.d.ts +128 -128
  195. package/dist/lib/ir/text.cjs +21 -0
  196. package/dist/lib/ir/text.d.ts +96 -0
  197. package/dist/lib/ir/text.d.ts.map +1 -0
  198. package/dist/lib/parsers/parseTargetSugar.cjs +3 -2
  199. package/dist/lib/parsers/parseTargetSugar.d.ts +4 -0
  200. package/dist/lib/parsers/parseTargetSugar.d.ts.map +1 -1
  201. package/dist/lib/primitive/ellipse.d.ts +3 -3
  202. package/dist/lib/primitive/ellipse.d.ts.map +1 -1
  203. package/dist/lib/primitive/group.d.ts +23 -7
  204. package/dist/lib/primitive/group.d.ts.map +1 -1
  205. package/dist/lib/primitive/index.d.ts +1 -1
  206. package/dist/lib/primitive/index.d.ts.map +1 -1
  207. package/dist/lib/primitive/layout.d.ts +12 -0
  208. package/dist/lib/primitive/layout.d.ts.map +1 -0
  209. package/dist/lib/primitive/path.d.ts +55 -15
  210. package/dist/lib/primitive/path.d.ts.map +1 -1
  211. package/dist/lib/primitive/rect.d.ts +3 -3
  212. package/dist/lib/primitive/rect.d.ts.map +1 -1
  213. package/dist/lib/primitive/scene.d.ts +4 -4
  214. package/dist/lib/primitive/scene.d.ts.map +1 -1
  215. package/dist/lib/primitive/text.d.ts +10 -3
  216. package/dist/lib/primitive/text.d.ts.map +1 -1
  217. package/dist/lib/types.d.ts +8 -0
  218. package/dist/lib/types.d.ts.map +1 -1
  219. package/package.json +12 -4
  220. package/dist/es/compile/path.d.ts.map +0 -1
  221. package/dist/es/compile/path.js +0 -636
  222. package/dist/es/compile/view-box.d.ts +0 -5
  223. package/dist/es/compile/view-box.d.ts.map +0 -1
  224. package/dist/es/primitive/view-box.d.ts +0 -12
  225. package/dist/es/primitive/view-box.d.ts.map +0 -1
  226. package/dist/lib/compile/path.cjs +0 -636
  227. package/dist/lib/compile/path.d.ts.map +0 -1
  228. package/dist/lib/compile/view-box.d.ts +0 -5
  229. package/dist/lib/compile/view-box.d.ts.map +0 -1
  230. package/dist/lib/primitive/view-box.d.ts +0 -12
  231. package/dist/lib/primitive/view-box.d.ts.map +0 -1
@@ -0,0 +1,96 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * 单行文本规格:纯字符串走块级默认,对象形式可覆盖 fill/opacity/font
4
+ * @description 行级覆盖只生效于本行;font 子字段未填则继承块级;align/lineHeight 不可被行覆盖
5
+ */
6
+ export declare const LineSpecSchema: z.ZodUnion<[z.ZodString, z.ZodObject<{
7
+ text: z.ZodString;
8
+ fill: z.ZodOptional<z.ZodString>;
9
+ opacity: z.ZodOptional<z.ZodNumber>;
10
+ font: z.ZodOptional<z.ZodObject<{
11
+ family: z.ZodOptional<z.ZodString>;
12
+ size: z.ZodOptional<z.ZodNumber>;
13
+ weight: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["normal", "bold"]>, z.ZodNumber]>>;
14
+ style: z.ZodOptional<z.ZodEnum<["normal", "italic", "oblique"]>>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ family?: string | undefined;
17
+ size?: number | undefined;
18
+ weight?: number | "normal" | "bold" | undefined;
19
+ style?: "normal" | "italic" | "oblique" | undefined;
20
+ }, {
21
+ family?: string | undefined;
22
+ size?: number | undefined;
23
+ weight?: number | "normal" | "bold" | undefined;
24
+ style?: "normal" | "italic" | "oblique" | undefined;
25
+ }>>;
26
+ }, "strip", z.ZodTypeAny, {
27
+ text: string;
28
+ fill?: string | undefined;
29
+ opacity?: number | undefined;
30
+ font?: {
31
+ family?: string | undefined;
32
+ size?: number | undefined;
33
+ weight?: number | "normal" | "bold" | undefined;
34
+ style?: "normal" | "italic" | "oblique" | undefined;
35
+ } | undefined;
36
+ }, {
37
+ text: string;
38
+ fill?: string | undefined;
39
+ opacity?: number | undefined;
40
+ font?: {
41
+ family?: string | undefined;
42
+ size?: number | undefined;
43
+ weight?: number | "normal" | "bold" | undefined;
44
+ style?: "normal" | "italic" | "oblique" | undefined;
45
+ } | undefined;
46
+ }>]>;
47
+ /** 行规格 IR 类型 */
48
+ export type IRLineSpec = z.infer<typeof LineSpecSchema>;
49
+ /**
50
+ * 文本块:单字符串或非空多行 LineSpec 数组
51
+ * @description 选数组而非 `\n` 字符串:JSON 友好无 escape,行级覆盖天然落字段;通用文本结构,Node text / 未来 Step.label 等共用
52
+ */
53
+ export declare const TextBlockSchema: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
54
+ text: z.ZodString;
55
+ fill: z.ZodOptional<z.ZodString>;
56
+ opacity: z.ZodOptional<z.ZodNumber>;
57
+ font: z.ZodOptional<z.ZodObject<{
58
+ family: z.ZodOptional<z.ZodString>;
59
+ size: z.ZodOptional<z.ZodNumber>;
60
+ weight: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["normal", "bold"]>, z.ZodNumber]>>;
61
+ style: z.ZodOptional<z.ZodEnum<["normal", "italic", "oblique"]>>;
62
+ }, "strip", z.ZodTypeAny, {
63
+ family?: string | undefined;
64
+ size?: number | undefined;
65
+ weight?: number | "normal" | "bold" | undefined;
66
+ style?: "normal" | "italic" | "oblique" | undefined;
67
+ }, {
68
+ family?: string | undefined;
69
+ size?: number | undefined;
70
+ weight?: number | "normal" | "bold" | undefined;
71
+ style?: "normal" | "italic" | "oblique" | undefined;
72
+ }>>;
73
+ }, "strip", z.ZodTypeAny, {
74
+ text: string;
75
+ fill?: string | undefined;
76
+ opacity?: number | undefined;
77
+ font?: {
78
+ family?: string | undefined;
79
+ size?: number | undefined;
80
+ weight?: number | "normal" | "bold" | undefined;
81
+ style?: "normal" | "italic" | "oblique" | undefined;
82
+ } | undefined;
83
+ }, {
84
+ text: string;
85
+ fill?: string | undefined;
86
+ opacity?: number | undefined;
87
+ font?: {
88
+ family?: string | undefined;
89
+ size?: number | undefined;
90
+ weight?: number | "normal" | "bold" | undefined;
91
+ style?: "normal" | "italic" | "oblique" | undefined;
92
+ } | undefined;
93
+ }>]>, "many">]>;
94
+ /** 文本块 IR 类型(单字符串或多行 LineSpec 数组) */
95
+ export type IRTextBlock = z.infer<typeof TextBlockSchema>;
96
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/ir/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsBxB,CAAC;AAEJ,gBAAgB;AAChB,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAIzB,CAAC;AAEJ,qCAAqC;AACrC,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { FontSchema } from "./font.js";
2
+ import { z } from "zod";
3
+ //#region src/ir/text.ts
4
+ /**
5
+ * 单行文本规格:纯字符串走块级默认,对象形式可覆盖 fill/opacity/font
6
+ * @description 行级覆盖只生效于本行;font 子字段未填则继承块级;align/lineHeight 不可被行覆盖
7
+ */
8
+ var LineSpecSchema = z.union([z.string(), z.object({
9
+ text: z.string().describe("Line content"),
10
+ fill: z.string().optional().describe("Per-line text color; overrides block default"),
11
+ opacity: z.number().min(0).max(1).optional().describe("Per-line opacity 0..1"),
12
+ font: FontSchema.optional().describe("Per-line font overrides; missing fields inherit from block-level `font`")
13
+ })]).describe("Single line of text: bare string for default styling, or an object with per-line `fill` / `opacity` / `font` overrides.");
14
+ /**
15
+ * 文本块:单字符串或非空多行 LineSpec 数组
16
+ * @description 选数组而非 `\n` 字符串:JSON 友好无 escape,行级覆盖天然落字段;通用文本结构,Node text / 未来 Step.label 等共用
17
+ */
18
+ var TextBlockSchema = z.union([z.string(), z.array(LineSpecSchema).min(1)]).describe("Text block: a single string for one line, or a non-empty array of line specs (string for default, object for per-line overrides).");
19
+ //#endregion
20
+ export { LineSpecSchema, TextBlockSchema };
@@ -1,3 +1,7 @@
1
1
  import { IRTarget } from '../ir';
2
+ /**
3
+ * Sugar 字符串解析:TikZ 风格相对偏移字面量 → IR 对象
4
+ * @description `'+dx,dy'` → `{relative:[dx,dy]}`(TikZ `+`,不更新 prevEnd);`'++dx,dy'` → `{relativeAccumulate:[dx,dy]}`(TikZ `++`,累积);其他形态(节点 id、笛卡尔 / 极坐标、已是 relative 对象)原样返回。纯函数无 nodeIndex 依赖,react adapter 与 Draw DSL 共用
5
+ */
2
6
  export declare const parseTargetSugar: (input: unknown) => IRTarget;
3
7
  //# sourceMappingURL=parseTargetSugar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseTargetSugar.d.ts","sourceRoot":"","sources":["../../../src/parsers/parseTargetSugar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQtC,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,QAWjD,CAAC"}
1
+ {"version":3,"file":"parseTargetSugar.d.ts","sourceRoot":"","sources":["../../../src/parsers/parseTargetSugar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAKtC;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,QAWjD,CAAC"}
@@ -1,9 +1,10 @@
1
1
  //#region src/parsers/parseTargetSugar.ts
2
+ /** TikZ 风格相对偏移字面量正则:捕获 `+` / `++` 前缀 + dx / dy 数值 */
3
+ var RELATIVE_OFFSET_RE = /^(\+{1,2})\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)$/;
2
4
  /**
3
5
  * Sugar 字符串解析:TikZ 风格相对偏移字面量 → IR 对象
4
- * @description `'+dx,dy'` → `{relative:[dx,dy]}`(TikZ `+`,不更新 prevEnd);`'++dx,dy'` → `{relativeAccumulate:[dx,dy]}`(TikZ `++`,累积);其他形态(节点 id、笛卡尔/极坐标、已是 relative 对象)原样返回。纯函数无 nodeIndex 依赖,react adapter 与 Draw DSL 共用
6
+ * @description `'+dx,dy'` → `{relative:[dx,dy]}`(TikZ `+`,不更新 prevEnd);`'++dx,dy'` → `{relativeAccumulate:[dx,dy]}`(TikZ `++`,累积);其他形态(节点 id、笛卡尔 / 极坐标、已是 relative 对象)原样返回。纯函数无 nodeIndex 依赖,react adapter 与 Draw DSL 共用
5
7
  */
6
- var RELATIVE_OFFSET_RE = /^(\+{1,2})\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)$/;
7
8
  var parseTargetSugar = (input) => {
8
9
  if (typeof input !== "string") return input;
9
10
  const match = input.match(RELATIVE_OFFSET_RE);
@@ -1,6 +1,6 @@
1
1
  /**
2
- * 椭圆原语,对应 SVG `<ellipse>`
3
- * @description 圆形(rx=ry)复用同一 prim 单 case 处理;rotate 度数绕中心,非零时 renderer SVG transform 包裹
2
+ * 椭圆原语(cx/cy 圆心,rx/ry 半径)
3
+ * @description 圆形(rx=ry)复用同一 prim 单 case 处理;rotate 度数绕中心,非零时由 renderer emit 阶段应用旋转变换
4
4
  */
5
5
  export type EllipsePrim = {
6
6
  type: 'ellipse';
@@ -17,7 +17,7 @@ export type EllipsePrim = {
17
17
  /** 描边透明度 0~1 */
18
18
  strokeOpacity?: number;
19
19
  strokeWidth?: number;
20
- strokeDasharray?: string;
20
+ dashPattern?: Array<number>;
21
21
  /** 整体透明度 0~1 */
22
22
  opacity?: number;
23
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/primitive/ellipse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
1
+ {"version":3,"file":"ellipse.d.ts","sourceRoot":"","sources":["../../../src/primitive/ellipse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
@@ -1,22 +1,38 @@
1
1
  import { ScenePrimitive } from './scene';
2
- /**
3
- * Group transform:结构化变换
4
- * @description 按数组顺序应用(与 SVG transform 多操作列表语义一致);角度=度,缩放 y 缺省等比 x,rotate cx/cy 缺省绕原点
5
- */
6
- export type Transform = {
2
+ /** Translate transform:沿 x / y 平移(user units) */
3
+ export type TranslateTransform = {
4
+ /** 鉴别字面量 */
7
5
  kind: 'translate';
6
+ /** x 方向位移 */
8
7
  x: number;
8
+ /** y 方向位移(屏幕 y-down) */
9
9
  y: number;
10
- } | {
10
+ };
11
+ /** Rotate transform:按角度旋转,可指定旋转中心;中心缺省 = 绕原点 (0, 0) */
12
+ export type RotateTransform = {
13
+ /** 鉴别字面量 */
11
14
  kind: 'rotate';
15
+ /** 旋转角度(度,正向 = 屏幕 y-down 下的视觉顺时针) */
12
16
  degrees: number;
17
+ /** 旋转中心 x(缺省 0) */
13
18
  cx?: number;
19
+ /** 旋转中心 y(缺省 0) */
14
20
  cy?: number;
15
- } | {
21
+ };
22
+ /** Scale transform:等比 / 非等比缩放;y 缺省 = x(等比) */
23
+ export type ScaleTransform = {
24
+ /** 鉴别字面量 */
16
25
  kind: 'scale';
26
+ /** x 轴缩放因子 */
17
27
  x: number;
28
+ /** y 轴缩放因子;缺省 = x(等比缩放) */
18
29
  y?: number;
19
30
  };
31
+ /**
32
+ * Group transform:结构化变换(3 分支 discriminated union)
33
+ * @description 按数组顺序应用(与 SVG transform 多操作列表语义一致);角度=度,缩放 y 缺省等比 x,rotate cx/cy 缺省绕原点。每个 kind 有对应 named type export。
34
+ */
35
+ export type Transform = TranslateTransform | RotateTransform | ScaleTransform;
20
36
  /** 编组:把若干 primitive 用结构化 transforms 包起来 */
21
37
  export type GroupPrim = {
22
38
  /** 类型判别符 */
@@ -1 +1 @@
1
- {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../src/primitive/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;GAGG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7C,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,YAAY;IACZ,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;CACjC,CAAC"}
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../src/primitive/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,iDAAiD;AACjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mBAAmB;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,cAAc;IACd,CAAC,EAAE,MAAM,CAAC;IACV,2BAA2B;IAC3B,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,eAAe,GACf,cAAc,CAAC;AAEnB,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,YAAY;IACZ,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;CACjC,CAAC"}
@@ -3,6 +3,6 @@ export * from './ellipse';
3
3
  export * from './text';
4
4
  export * from './path';
5
5
  export * from './group';
6
- export * from './view-box';
6
+ export * from './layout';
7
7
  export * from './scene';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitive/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitive/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** 场景整体布局边界 */
2
+ export type Layout = {
3
+ /** 布局边界左上角横坐标 */
4
+ x: number;
5
+ /** 布局边界左上角纵坐标 */
6
+ y: number;
7
+ /** 布局边界宽度 */
8
+ width: number;
9
+ /** 布局边界高度 */
10
+ height: number;
11
+ };
12
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/primitive/layout.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,MAAM,MAAM,MAAM,GAAG;IACnB,iBAAiB;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,iBAAiB;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -1,42 +1,82 @@
1
1
  import { ArrowShape } from '../ir/path/arrow';
2
- /**
3
- * Path 命令:结构化路径绘制操作
4
- * @description discriminated union 按 kind 分发;坐标 / 角度均使用 user units(角度=度,0=+x、90=+y/视觉下、CW=正)。各 adapter 自行翻译为原生 API:SVG 拼 `d` 字符串、Canvas 调 ctx.moveTo/lineTo/arc 等
5
- */
6
- export type PathCommand = {
2
+ /** Move command:移动游标到目标点,不绘制 */
3
+ export type MovePathCommand = {
4
+ /** 鉴别字面量 */
7
5
  kind: 'move';
6
+ /** 目标点 [x, y] */
8
7
  to: [number, number];
9
- } | {
8
+ };
9
+ /** Line command:从游标到目标点画直线 */
10
+ export type LinePathCommand = {
11
+ /** 鉴别字面量 */
10
12
  kind: 'line';
13
+ /** 终点 [x, y] */
11
14
  to: [number, number];
12
- } | {
15
+ };
16
+ /** Quad command:二次贝塞尔,一个控制点 */
17
+ export type QuadPathCommand = {
18
+ /** 鉴别字面量 */
13
19
  kind: 'quad';
20
+ /** 控制点 [x, y] */
14
21
  control: [number, number];
22
+ /** 终点 [x, y] */
15
23
  to: [number, number];
16
- } | {
24
+ };
25
+ /** Cubic command:三次贝塞尔,两个控制点 */
26
+ export type CubicPathCommand = {
27
+ /** 鉴别字面量 */
17
28
  kind: 'cubic';
29
+ /** 第一控制点 [x, y](影响起点切线) */
18
30
  control1: [number, number];
31
+ /** 第二控制点 [x, y](影响终点切线) */
19
32
  control2: [number, number];
33
+ /** 终点 [x, y] */
20
34
  to: [number, number];
21
- } | {
35
+ };
36
+ /** Arc command:以 center 为圆心、给定半径与起末角度的圆弧(center-parameterization) */
37
+ export type ArcPathCommand = {
38
+ /** 鉴别字面量 */
22
39
  kind: 'arc';
40
+ /** 圆心 [x, y] */
23
41
  center: [number, number];
42
+ /** 半径(user units) */
24
43
  radius: number;
44
+ /** 起始角度(度,0° = +x、90° = +y screen-down) */
25
45
  startAngle: number;
46
+ /** 终止角度(度) */
26
47
  endAngle: number;
48
+ /** 是否逆时针扫描;缺省 / `false` = CW(屏幕坐标系正向) */
27
49
  counterClockwise?: boolean;
28
- } | {
50
+ };
51
+ /** EllipseArc command:以 center 为圆心、给定 x/y 半径与起末角度的椭圆弧;可选 rotation */
52
+ export type EllipseArcPathCommand = {
53
+ /** 鉴别字面量 */
29
54
  kind: 'ellipseArc';
55
+ /** 圆心 [x, y] */
30
56
  center: [number, number];
57
+ /** x 轴半径 */
31
58
  radiusX: number;
59
+ /** y 轴半径 */
32
60
  radiusY: number;
61
+ /** 椭圆整体旋转角度(度),缺省 0 */
33
62
  rotation?: number;
63
+ /** 起始角度(度) */
34
64
  startAngle: number;
65
+ /** 终止角度(度) */
35
66
  endAngle: number;
67
+ /** 是否逆时针扫描;缺省 / `false` = CW */
36
68
  counterClockwise?: boolean;
37
- } | {
69
+ };
70
+ /** Close command:闭合当前子路径回最近一次 move 起点 */
71
+ export type ClosePathCommand = {
72
+ /** 鉴别字面量;无其他字段 */
38
73
  kind: 'close';
39
74
  };
75
+ /**
76
+ * Path 命令:结构化路径绘制操作(7 分支 discriminated union)
77
+ * @description discriminated union 按 kind 分发;坐标 / 角度均使用 user units(角度=度,0=+x、90=+y/视觉下、CW=正)。各 adapter 自行翻译为原生 API:SVG 拼 `d` 字符串、Canvas 调 ctx.moveTo/lineTo/arc 等。每个 kind 有对应 named type export,便于 wrapper / `Pick<>` 派生。
78
+ */
79
+ export type PathCommand = MovePathCommand | LinePathCommand | QuadPathCommand | CubicPathCommand | ArcPathCommand | EllipseArcPathCommand | ClosePathCommand;
40
80
  /**
41
81
  * 端点级解析后的箭头视觉规格(Scene primitive 层)
42
82
  * @description compile/path.ts 把 IR `arrowDetail` 顶层 + start/end merge 后产出此结构。`shape` 必填、其余视觉字段全 optional:缺省字段交给 renderer 走 context-stroke / 硬编码 fallback,保持向后兼容
@@ -69,16 +109,16 @@ export type PathPrim = {
69
109
  fill?: string;
70
110
  /** 填充透明度 0~1 */
71
111
  fillOpacity?: number;
72
- /** SVG fill-rule:`nonzero`(默认)/ `evenodd`(环形 / 孔洞场景) */
112
+ /** 填充规则:`nonzero`(默认)/ `evenodd`(环形 / 孔洞场景) */
73
113
  fillRule?: 'nonzero' | 'evenodd';
74
114
  /** 描边色 */
75
115
  stroke?: string;
76
- /** 描边透明度 0~1(SVG stroke-opacity) */
116
+ /** 描边透明度 0~1 */
77
117
  strokeOpacity?: number;
78
118
  /** 描边宽度 */
79
119
  strokeWidth?: number;
80
- /** SVG stroke-dasharray 模式 */
81
- strokeDasharray?: string;
120
+ /** 描边 dash pattern */
121
+ dashPattern?: Array<number>;
82
122
  /** 端点形状 */
83
123
  strokeLinecap?: 'butt' | 'round' | 'square';
84
124
  /** 拐点形状 */
@@ -1 +1 @@
1
- {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/primitive/path.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/primitive/path.ts"],"names":[],"mappings":"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"}
@@ -16,12 +16,12 @@ export type RectPrim = {
16
16
  fillOpacity?: number;
17
17
  /** 描边色 */
18
18
  stroke?: string;
19
- /** 描边透明度 0~1(SVG stroke-opacity) */
19
+ /** 描边透明度 0~1 */
20
20
  strokeOpacity?: number;
21
21
  /** 描边宽度 */
22
22
  strokeWidth?: number;
23
- /** SVG stroke-dasharray 模式 */
24
- strokeDasharray?: string;
23
+ /** 描边 dash pattern(如 [4, 2]) */
24
+ dashPattern?: Array<number>;
25
25
  /** 圆角半径(同时作用于 rx/ry) */
26
26
  cornerRadius?: number;
27
27
  /** 整体透明度 0~1 */
@@ -1 +1 @@
1
- {"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/primitive/rect.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,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,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,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,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,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,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,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"}
@@ -3,17 +3,17 @@ import { GroupPrim } from './group';
3
3
  import { PathPrim } from './path';
4
4
  import { RectPrim } from './rect';
5
5
  import { TextPrim } from './text';
6
- import { ViewBox } from './view-box';
6
+ import { Layout } from './layout';
7
7
  /**
8
8
  * Scene primitive:渲染目标无关的最大公约子集
9
9
  * @description 所有 adapter(SVG/Canvas/PDF/Skia)都应能消费;不允许出现 SVG-only 或 Canvas-only 特性(filter/marker/imageData)
10
10
  */
11
11
  export type ScenePrimitive = RectPrim | EllipsePrim | TextPrim | PathPrim | GroupPrim;
12
- /** 场景:渲染目标无关的"已布局好的图元集合 + viewBox" */
12
+ /** 场景:渲染目标无关的"已布局好的图元集合 + layout" */
13
13
  export type Scene = {
14
14
  /** 已布局好的图元数组,按渲染顺序排列 */
15
15
  primitives: Array<ScenePrimitive>;
16
- /** 整个场景的视口范围 */
17
- viewBox: ViewBox;
16
+ /** 整个场景的布局边界 */
17
+ layout: Layout;
18
18
  };
19
19
  //# 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,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtF,sCAAsC;AACtC,MAAM,MAAM,KAAK,GAAG;IAClB,wBAAwB;IACxB,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,gBAAgB;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,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;AAEvC;;;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;CAChB,CAAC"}
@@ -1,16 +1,23 @@
1
- /** 行级字段(`<tspan>` 可独立指定),未填走块级 TextPrim 默认 */
1
+ /** 行级字段(每行可独立指定),未填走块级 TextPrim 默认 */
2
2
  export type TextLine = {
3
+ /** 行文字内容 */
3
4
  text: string;
5
+ /** 行级字号 override(user units);缺省走块级 TextPrim.fontSize */
4
6
  fontSize?: number;
7
+ /** 行级字体族 override(CSS font-family);缺省走块级 */
5
8
  fontFamily?: string;
9
+ /** 行级字重 override(CSS font-weight);缺省走块级 */
6
10
  fontWeight?: string | number;
11
+ /** 行级字形 override;缺省走块级 */
7
12
  fontStyle?: 'normal' | 'italic' | 'oblique';
13
+ /** 行级文字颜色 override;缺省走块级 TextPrim.fill */
8
14
  fill?: string;
15
+ /** 行级透明度 0..1 override;缺省走块级 */
9
16
  opacity?: number;
10
17
  };
11
18
  /**
12
19
  * 文本原语(measuredWidth/Height 由 Scene 编译阶段算好)
13
- * @description 多行 lines 至少 1 行;renderer 每行画 `<tspan>`,按 lineHeight 堆叠,按 baseline 在 (x,y) 锚点上下对齐。顶层属性是块级默认,单行 TextLine 可覆盖
20
+ * @description 多行 lines 至少 1 行;renderer lineHeight 堆叠每行、按 baseline 在 (x,y) 锚点上下对齐。顶层属性是块级默认,单行 TextLine 可覆盖
14
21
  */
15
22
  export type TextPrim = {
16
23
  type: 'text';
@@ -26,7 +33,7 @@ export type TextPrim = {
26
33
  fontStyle?: 'normal' | 'italic' | 'oblique';
27
34
  align: 'start' | 'middle' | 'end';
28
35
  baseline: 'top' | 'middle' | 'bottom' | 'alphabetic';
29
- /** 行高,多行下相邻 `<tspan>` 垂直距离 */
36
+ /** 行高,多行下相邻行的垂直距离 */
30
37
  lineHeight: number;
31
38
  /** 编译期算好的整块文字宽度 = max line width */
32
39
  measuredWidth: number;
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/primitive/text.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,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,8BAA8B;IAC9B,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,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,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,3 +1,11 @@
1
1
  /** 获取对象所有值的联合类型,等价于 (typeof T)[keyof typeof T] */
2
2
  export type ValueOf<T extends object> = T[keyof T];
3
+ /**
4
+ * 类型层等价检查工具(internal idiom,公开 API 不导出)
5
+ * @description 当 A、B 完全等价时类型为 `true`,否则为 `false`——配合 `as const satisfies` 实现"字段表必须完备覆盖类型 key 集合"的互锁;漏字段或多字段 TS 编译期报错
6
+ * @example
7
+ * const NODE_FIELDS = ['id', 'shape'] as const satisfies ReadonlyArray<keyof IRNode>;
8
+ * type _Check = AssertEqual<typeof NODE_FIELDS[number], keyof IRNode>;
9
+ */
10
+ export type AssertEqual<TActual, TExpected> = [TActual] extends [TExpected] ? [TExpected] extends [TActual] ? true : false : false;
3
11
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,GACvE,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,GAC3B,IAAI,GACJ,KAAK,GACP,KAAK,CAAC"}
@@ -2,9 +2,9 @@ const require_rect = require("../geometry/rect.cjs");
2
2
  const require_position = require("./position.cjs");
3
3
  const require_node = require("./node.cjs");
4
4
  const require_text_metrics = require("./text-metrics.cjs");
5
- const require_path = require("./path.cjs");
5
+ const require_index = require("./path/index.cjs");
6
6
  const require_precision = require("./precision.cjs");
7
- const require_view_box = require("./view-box.cjs");
7
+ const require_layout = require("./layout.cjs");
8
8
  //#region src/compile/compile.ts
9
9
  /**
10
10
  * 把 coordinate 注册成 0×0 NodeLayout
@@ -29,37 +29,62 @@ var coordinateAsLayout = (id, center) => ({
29
29
  fontSize: 0
30
30
  });
31
31
  /**
32
+ * 默认 warn dispatcher:dev 模式 console.warn、生产静默
33
+ * @description 用户传 onWarn 时使用用户的;不传走此 fallback
34
+ */
35
+ var defaultWarnDispatcher = (warning) => {
36
+ if (typeof process !== "undefined" && process.env.NODE_ENV === "production") return;
37
+ console.warn(`[retikz] ${warning.code} at ${warning.path}: ${warning.message}`);
38
+ };
39
+ /**
32
40
  * IR → Scene 纯函数转换,所有 adapter 共享
33
- * @description Pass 1 处理 Node/coordinate 并注册 nodeIndex、发 primitive、累积 bbox;Pass 2 解析 Path 端点写 d 字符串;末端按 precision 折算 viewBox
41
+ * @description Pass 1 处理 Node/coordinate 并注册 nodeIndex、发 primitive、累积 bbox;Pass 2 解析 Path 端点写 d 字符串;末端按 precision 折算 layout
34
42
  */
35
43
  var compileToScene = (ir, options = {}) => {
36
44
  const measureText = options.measureText ?? require_text_metrics.fallbackMeasurer;
37
- const viewBoxPadding = options.padding ?? 10;
45
+ const layoutPadding = options.padding ?? 10;
38
46
  const round = require_precision.makeRound(options.precision ?? 2);
39
47
  const nodeDistance = options.nodeDistance;
48
+ const onWarn = options.onWarn ?? defaultWarnDispatcher;
40
49
  const primitives = [];
41
50
  const nodeIndex = /* @__PURE__ */ new Map();
42
51
  const allPoints = [];
43
- for (const child of ir.children) if (child.type === "node") {
44
- const layout = require_node.layoutNode(child, measureText, nodeIndex, nodeDistance);
45
- if (child.id) nodeIndex.set(child.id, layout);
46
- for (const prim of require_node.emitNodePrimitives(layout, round)) primitives.push(prim);
47
- allPoints.push(require_rect.rect.anchor(layout.rect, "north-west"), require_rect.rect.anchor(layout.rect, "north-east"), require_rect.rect.anchor(layout.rect, "south-west"), require_rect.rect.anchor(layout.rect, "south-east"));
48
- } else if (child.type === "coordinate") {
49
- const center = require_position.resolvePosition(child.position, nodeIndex, nodeDistance);
50
- if (!center) throw new Error(`Cannot resolve position for coordinate ${child.id}; polar.origin or at.of may reference an undefined node`);
51
- nodeIndex.set(child.id, coordinateAsLayout(child.id, center));
52
+ for (let i = 0; i < ir.children.length; i++) {
53
+ const child = ir.children[i];
54
+ if (child.type === "node") {
55
+ const layout = require_node.layoutNode(child, measureText, nodeIndex, nodeDistance);
56
+ if (child.id) nodeIndex.set(child.id, layout);
57
+ for (const prim of require_node.emitNodePrimitives(layout, round)) primitives.push(prim);
58
+ allPoints.push(require_rect.rect.anchor(layout.rect, "north-west"), require_rect.rect.anchor(layout.rect, "north-east"), require_rect.rect.anchor(layout.rect, "south-west"), require_rect.rect.anchor(layout.rect, "south-east"));
59
+ } else if (child.type === "coordinate") {
60
+ const center = require_position.resolvePosition(child.position, nodeIndex, nodeDistance);
61
+ if (!center) {
62
+ onWarn({
63
+ code: "POLAR_ORIGIN_UNRESOLVED",
64
+ message: `Cannot resolve position for coordinate '${child.id}'; polar.origin or at.of may reference an undefined node`,
65
+ path: `children[${i}].coordinate.position`
66
+ });
67
+ throw new Error(`Cannot resolve position for coordinate ${child.id}; polar.origin or at.of may reference an undefined node`);
68
+ }
69
+ nodeIndex.set(child.id, coordinateAsLayout(child.id, center));
70
+ }
52
71
  }
53
- for (const child of ir.children) if (child.type === "path") {
54
- const result = require_path.emitPathPrimitive(child, nodeIndex, round, measureText);
55
- if (result) {
56
- for (const prim of result.primitives) primitives.push(prim);
57
- for (const p of result.points) allPoints.push(p);
72
+ for (let i = 0; i < ir.children.length; i++) {
73
+ const child = ir.children[i];
74
+ if (child.type === "path") {
75
+ const result = require_index.emitPathPrimitive(child, nodeIndex, round, measureText, {
76
+ onWarn,
77
+ irPath: `children[${i}].path`
78
+ });
79
+ if (result) {
80
+ for (const prim of result.primitives) primitives.push(prim);
81
+ for (const p of result.points) allPoints.push(p);
82
+ }
58
83
  }
59
84
  }
60
85
  return {
61
86
  primitives,
62
- viewBox: require_view_box.computeViewBox(allPoints, viewBoxPadding, round)
87
+ layout: require_layout.computeLayout(allPoints, layoutPadding, round)
63
88
  };
64
89
  };
65
90
  //#endregion