@retikz/react 0.1.0-alpha.2 → 0.1.0-alpha.4

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 (69) hide show
  1. package/dist/es/index.d.ts +5 -5
  2. package/dist/es/index.d.ts.map +1 -1
  3. package/dist/es/index.js +3 -1
  4. package/dist/es/kernel/Coordinate.d.ts +23 -0
  5. package/dist/es/kernel/Coordinate.d.ts.map +1 -0
  6. package/dist/es/kernel/Coordinate.js +13 -0
  7. package/dist/es/kernel/Node.d.ts +16 -3
  8. package/dist/es/kernel/Node.d.ts.map +1 -1
  9. package/dist/es/kernel/Path.d.ts +12 -0
  10. package/dist/es/kernel/Path.d.ts.map +1 -1
  11. package/dist/es/kernel/Step.d.ts +86 -3
  12. package/dist/es/kernel/Step.d.ts.map +1 -1
  13. package/dist/es/kernel/Tikz.d.ts +6 -0
  14. package/dist/es/kernel/Tikz.d.ts.map +1 -1
  15. package/dist/es/kernel/Tikz.js +6 -2
  16. package/dist/es/kernel/_builder.d.ts.map +1 -1
  17. package/dist/es/kernel/_builder.js +135 -15
  18. package/dist/es/kernel/_displayNames.d.ts +4 -0
  19. package/dist/es/kernel/_displayNames.d.ts.map +1 -1
  20. package/dist/es/kernel/_displayNames.js +5 -1
  21. package/dist/es/kernel/_unbuilder.d.ts.map +1 -1
  22. package/dist/es/kernel/_unbuilder.js +65 -1
  23. package/dist/es/kernel/index.d.ts +1 -0
  24. package/dist/es/kernel/index.d.ts.map +1 -1
  25. package/dist/es/kernel/index.js +1 -0
  26. package/dist/es/sugar/Draw.d.ts +20 -2
  27. package/dist/es/sugar/Draw.d.ts.map +1 -1
  28. package/dist/es/sugar/Draw.js +57 -3
  29. package/dist/es/sugar/EdgeLabel.d.ts +20 -0
  30. package/dist/es/sugar/EdgeLabel.d.ts.map +1 -0
  31. package/dist/es/sugar/EdgeLabel.js +13 -0
  32. package/dist/es/sugar/index.d.ts +1 -0
  33. package/dist/es/sugar/index.d.ts.map +1 -1
  34. package/dist/es/sugar/index.js +1 -0
  35. package/dist/lib/index.cjs +4 -0
  36. package/dist/lib/index.d.ts +5 -5
  37. package/dist/lib/index.d.ts.map +1 -1
  38. package/dist/lib/kernel/Coordinate.cjs +13 -0
  39. package/dist/lib/kernel/Coordinate.d.ts +23 -0
  40. package/dist/lib/kernel/Coordinate.d.ts.map +1 -0
  41. package/dist/lib/kernel/Node.d.ts +16 -3
  42. package/dist/lib/kernel/Node.d.ts.map +1 -1
  43. package/dist/lib/kernel/Path.d.ts +12 -0
  44. package/dist/lib/kernel/Path.d.ts.map +1 -1
  45. package/dist/lib/kernel/Step.d.ts +86 -3
  46. package/dist/lib/kernel/Step.d.ts.map +1 -1
  47. package/dist/lib/kernel/Tikz.cjs +6 -2
  48. package/dist/lib/kernel/Tikz.d.ts +6 -0
  49. package/dist/lib/kernel/Tikz.d.ts.map +1 -1
  50. package/dist/lib/kernel/_builder.cjs +133 -13
  51. package/dist/lib/kernel/_builder.d.ts.map +1 -1
  52. package/dist/lib/kernel/_displayNames.cjs +6 -0
  53. package/dist/lib/kernel/_displayNames.d.ts +4 -0
  54. package/dist/lib/kernel/_displayNames.d.ts.map +1 -1
  55. package/dist/lib/kernel/_unbuilder.cjs +65 -1
  56. package/dist/lib/kernel/_unbuilder.d.ts.map +1 -1
  57. package/dist/lib/kernel/index.cjs +1 -0
  58. package/dist/lib/kernel/index.d.ts +1 -0
  59. package/dist/lib/kernel/index.d.ts.map +1 -1
  60. package/dist/lib/sugar/Draw.cjs +57 -3
  61. package/dist/lib/sugar/Draw.d.ts +20 -2
  62. package/dist/lib/sugar/Draw.d.ts.map +1 -1
  63. package/dist/lib/sugar/EdgeLabel.cjs +13 -0
  64. package/dist/lib/sugar/EdgeLabel.d.ts +20 -0
  65. package/dist/lib/sugar/EdgeLabel.d.ts.map +1 -0
  66. package/dist/lib/sugar/index.cjs +1 -0
  67. package/dist/lib/sugar/index.d.ts +1 -0
  68. package/dist/lib/sugar/index.d.ts.map +1 -1
  69. package/package.json +2 -2
@@ -1,6 +1,7 @@
1
1
  import { Node } from "./Node.js";
2
2
  import { Path } from "./Path.js";
3
3
  import { Step } from "./Step.js";
4
+ import { Coordinate } from "./Coordinate.js";
4
5
  import { createElement } from "react";
5
6
  //#region src/kernel/_unbuilder.ts
6
7
  /** IR 'node' child → NodeProps;过滤 undefined 字段,不污染 React DevTools 显示 */
@@ -35,6 +36,7 @@ var nodePropsFromIR = (n) => {
35
36
  if (n.yScale !== void 0) props.yScale = n.yScale;
36
37
  if (n.textColor !== void 0) props.textColor = n.textColor;
37
38
  if (n.opacity !== void 0) props.opacity = n.opacity;
39
+ if (n.label !== void 0) props.label = n.label;
38
40
  return props;
39
41
  };
40
42
  /** 单个 IRStep → <Step /> element */
@@ -47,12 +49,63 @@ var stepToElement = (step, key) => {
47
49
  key,
48
50
  kind: "step",
49
51
  via: step.via,
52
+ to: step.to,
53
+ ...step.label !== void 0 && { label: step.label }
54
+ });
55
+ if (step.kind === "curve") return createElement(Step, {
56
+ key,
57
+ kind: "curve",
58
+ to: step.to,
59
+ control: step.control,
60
+ ...step.label !== void 0 && { label: step.label }
61
+ });
62
+ if (step.kind === "cubic") return createElement(Step, {
63
+ key,
64
+ kind: "cubic",
65
+ to: step.to,
66
+ control1: step.control1,
67
+ control2: step.control2,
68
+ ...step.label !== void 0 && { label: step.label }
69
+ });
70
+ if (step.kind === "bend") return createElement(Step, {
71
+ key,
72
+ kind: "bend",
73
+ to: step.to,
74
+ bendDirection: step.bendDirection,
75
+ ...step.bendAngle !== void 0 && { bendAngle: step.bendAngle },
76
+ ...step.label !== void 0 && { label: step.label }
77
+ });
78
+ if (step.kind === "arc") return createElement(Step, {
79
+ key,
80
+ kind: "arc",
81
+ startAngle: step.startAngle,
82
+ endAngle: step.endAngle,
83
+ radius: step.radius,
84
+ ...step.label !== void 0 && { label: step.label }
85
+ });
86
+ if (step.kind === "circlePath") return createElement(Step, {
87
+ key,
88
+ kind: "circlePath",
89
+ radius: step.radius,
90
+ ...step.label !== void 0 && { label: step.label }
91
+ });
92
+ if (step.kind === "ellipsePath") return createElement(Step, {
93
+ key,
94
+ kind: "ellipsePath",
95
+ radiusX: step.radiusX,
96
+ radiusY: step.radiusY,
97
+ ...step.label !== void 0 && { label: step.label }
98
+ });
99
+ if (step.kind === "move") return createElement(Step, {
100
+ key,
101
+ kind: "move",
50
102
  to: step.to
51
103
  });
52
104
  return createElement(Step, {
53
105
  key,
54
106
  kind: step.kind,
55
- to: step.to
107
+ to: step.to,
108
+ ...step.label !== void 0 && { label: step.label }
56
109
  });
57
110
  };
58
111
  /** discriminated union 兜底:编译期保证不漏 case,运行时给出明确错误 */
@@ -71,12 +124,23 @@ var childToElement = (child, key) => {
71
124
  stroke: child.stroke,
72
125
  strokeWidth: child.strokeWidth,
73
126
  strokeDasharray: child.strokeDasharray,
127
+ lineCap: child.lineCap,
128
+ lineJoin: child.lineJoin,
129
+ thickness: child.thickness,
74
130
  arrow: child.arrow,
75
131
  arrowShape: child.arrowShape,
76
132
  fill: child.fill,
77
133
  fillRule: child.fillRule,
134
+ opacity: child.opacity,
135
+ fillOpacity: child.fillOpacity,
136
+ drawOpacity: child.drawOpacity,
78
137
  children: child.children.map((s, j) => stepToElement(s, j))
79
138
  });
139
+ case "coordinate": return createElement(Coordinate, {
140
+ key,
141
+ id: child.id,
142
+ position: child.position
143
+ });
80
144
  default: return assertNever(child);
81
145
  }
82
146
  };
@@ -3,4 +3,5 @@ export * from './Node';
3
3
  export * from './Path';
4
4
  export * from './Step';
5
5
  export * from './Text';
6
+ export * from './Coordinate';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/kernel/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/kernel/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC"}
@@ -3,3 +3,4 @@ import "./Node.js";
3
3
  import "./Path.js";
4
4
  import "./Step.js";
5
5
  import "./Text.js";
6
+ import "./Coordinate.js";
@@ -2,7 +2,13 @@ import { FC } from 'react';
2
2
  import { IRPath, WayDSL } from '@retikz/core';
3
3
  /** <Draw> 组件的 props */
4
4
  export type DrawProps = {
5
- /** way 数组 DSL:节点 id / 坐标 / 极坐标 / 折角算子 `'-|'` `'|-'` / 闭合 `DrawWay.cycle` */
5
+ /**
6
+ * way 数组 DSL:节点 id / 笛卡尔 / 极坐标 / 相对偏移 `{ position, type: DrawWay.Relative | DrawWay.Accumulate }` /
7
+ * 折角算子 `'-|'` `'|-'`(或 `DrawWay.Hv` / `DrawWay.Vh`)/ 闭合 `DrawWay.Cycle` /
8
+ * 曲线算子 `{ curve | cubic | bend }`(infix)/
9
+ * 形状算子 `{ arc | circle | ellipse }`(infix,以"上一项"为圆心,不消耗下一项)/
10
+ * 边标注算子 `{ label }`(infix,修饰下一段)
11
+ */
6
12
  way: WayDSL;
7
13
  /** 描边色,省略时用 currentColor */
8
14
  stroke?: IRPath['stroke'];
@@ -10,6 +16,12 @@ export type DrawProps = {
10
16
  strokeWidth?: IRPath['strokeWidth'];
11
17
  /** SVG stroke-dasharray 模式(如 "4 2") */
12
18
  strokeDasharray?: IRPath['strokeDasharray'];
19
+ /** 端点形状(SVG `stroke-linecap`) */
20
+ lineCap?: IRPath['lineCap'];
21
+ /** 拐点形状(SVG `stroke-linejoin`) */
22
+ lineJoin?: IRPath['lineJoin'];
23
+ /** 语义 stroke 档位(TikZ `ultra thin` … `ultra thick`);显式 `strokeWidth` 始终优先 */
24
+ thickness?: IRPath['thickness'];
13
25
  /**
14
26
  * 路径级箭头方向。`'->'` = 终点;`'<-'` = 起点;`'<->'` = 两端;
15
27
  * 省略或 `'none'` = 无箭头。
@@ -19,10 +31,16 @@ export type DrawProps = {
19
31
  * 箭头形状。默认 `'normal'`。其他:`'open'` / `'stealth'` / `'diamond'` / `'circle'`。
20
32
  */
21
33
  arrowShape?: IRPath['arrowShape'];
22
- /** 闭合区域填充色,省略 = 不填充。配合 way 末尾的 `DrawWay.cycle` 画填充形状 */
34
+ /** 闭合区域填充色,省略 = 不填充。配合 way 末尾的 `DrawWay.Cycle` 画填充形状 */
23
35
  fill?: IRPath['fill'];
24
36
  /** SVG fill-rule:`'nonzero'`(默认)/ `'evenodd'` */
25
37
  fillRule?: IRPath['fillRule'];
38
+ /** 整 path 透明度 0~1 */
39
+ opacity?: IRPath['opacity'];
40
+ /** 仅 fill 透明度 0~1 */
41
+ fillOpacity?: IRPath['fillOpacity'];
42
+ /** 仅 stroke 透明度 0~1(TikZ `draw opacity`) */
43
+ drawOpacity?: IRPath['drawOpacity'];
26
44
  };
27
45
  /**
28
46
  * Sugar 组件——展开为等价的 <Path><Step.../></Path> Kernel 子树。
@@ -1 +1 @@
1
- {"version":3,"file":"Draw.d.ts","sourceRoot":"","sources":["../../../src/sugar/Draw.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAKnD,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAClC,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;CAC/B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAsB9B,CAAC"}
1
+ {"version":3,"file":"Draw.d.ts","sourceRoot":"","sources":["../../../src/sugar/Draw.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAKnD,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB;;;;;;OAMG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5C,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5B,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAChC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAClC,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5B,qBAAqB;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;CACrC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CA0G9B,CAAC"}
@@ -12,15 +12,21 @@ import { jsx } from "react/jsx-runtime";
12
12
  * (useState / useMemo / useEffect 等会抛 "Invalid hook call")。
13
13
  */
14
14
  var Draw = (props) => {
15
- const { way, stroke, strokeWidth, strokeDasharray, arrow, arrowShape, fill, fillRule } = props;
15
+ const { way, stroke, strokeWidth, strokeDasharray, lineCap, lineJoin, thickness, arrow, arrowShape, fill, fillRule, opacity, fillOpacity, drawOpacity } = props;
16
16
  return /* @__PURE__ */ jsx(Path, {
17
17
  stroke,
18
18
  strokeWidth,
19
19
  strokeDasharray,
20
+ lineCap,
21
+ lineJoin,
22
+ thickness,
20
23
  arrow,
21
24
  arrowShape,
22
25
  fill,
23
26
  fillRule,
27
+ opacity,
28
+ fillOpacity,
29
+ drawOpacity,
24
30
  children: parseWay(way).map((s, i) => {
25
31
  if (s.kind === "cycle") return /* @__PURE__ */ jsx(Step, { kind: "cycle" }, i);
26
32
  if (s.kind === "move") return /* @__PURE__ */ jsx(Step, {
@@ -30,11 +36,59 @@ var Draw = (props) => {
30
36
  if (s.kind === "step") return /* @__PURE__ */ jsx(Step, {
31
37
  kind: "step",
32
38
  via: s.via,
33
- to: s.to
39
+ to: s.to,
40
+ label: s.label
41
+ }, i);
42
+ if (s.kind === "curve") return /* @__PURE__ */ jsx(Step, {
43
+ kind: "curve",
44
+ to: s.to,
45
+ control: s.control,
46
+ label: s.label
47
+ }, i);
48
+ if (s.kind === "cubic") return /* @__PURE__ */ jsx(Step, {
49
+ kind: "cubic",
50
+ to: s.to,
51
+ control1: s.control1,
52
+ control2: s.control2,
53
+ label: s.label
54
+ }, i);
55
+ if (s.kind === "bend") {
56
+ if (s.bendAngle !== void 0) return /* @__PURE__ */ jsx(Step, {
57
+ kind: "bend",
58
+ to: s.to,
59
+ bendDirection: s.bendDirection,
60
+ bendAngle: s.bendAngle,
61
+ label: s.label
62
+ }, i);
63
+ return /* @__PURE__ */ jsx(Step, {
64
+ kind: "bend",
65
+ to: s.to,
66
+ bendDirection: s.bendDirection,
67
+ label: s.label
68
+ }, i);
69
+ }
70
+ if (s.kind === "arc") return /* @__PURE__ */ jsx(Step, {
71
+ kind: "arc",
72
+ startAngle: s.startAngle,
73
+ endAngle: s.endAngle,
74
+ radius: s.radius,
75
+ label: s.label
76
+ }, i);
77
+ if (s.kind === "circlePath") return /* @__PURE__ */ jsx(Step, {
78
+ kind: "circlePath",
79
+ radius: s.radius,
80
+ label: s.label
81
+ }, i);
82
+ if (s.kind === "ellipsePath") return /* @__PURE__ */ jsx(Step, {
83
+ kind: "ellipsePath",
84
+ radiusX: s.radiusX,
85
+ radiusY: s.radiusY,
86
+ label: s.label
34
87
  }, i);
35
88
  return /* @__PURE__ */ jsx(Step, {
36
89
  kind: "line",
37
- to: s.to
90
+ to: s.to,
91
+ label: s.label
38
92
  }, i);
39
93
  })
40
94
  });
@@ -0,0 +1,20 @@
1
+ import { FC } from 'react';
2
+ import { IRStepLabel } from '@retikz/core';
3
+ /** <EdgeLabel> 组件的 props(ADR-0004) */
4
+ export type EdgeLabelProps = {
5
+ /** 段上位置(TikZ `midway` / `near start` / `near end`),缺省 'midway' */
6
+ position?: IRStepLabel['position'];
7
+ /** 相对段方向 / 视觉方位的偏移侧('sloped' = 沿切线旋转),缺省 'above' */
8
+ side?: IRStepLabel['side'];
9
+ /** 标签文字内容;必须是字符串 */
10
+ children: string;
11
+ };
12
+ /**
13
+ * Sugar 组件——挂在 <Step> 内作为子节点声明边标注。等价于在 Step 上写
14
+ * `label={{ text, position, side }}` prop;二者并存时 prop 优先。
15
+ *
16
+ * <EdgeLabel> 自身不渲染,由 buildIR 在收集 Step 时识别 displayName 后
17
+ * 提取到 IR `step.label`。
18
+ */
19
+ export declare const EdgeLabel: FC<EdgeLabelProps>;
20
+ //# sourceMappingURL=EdgeLabel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdgeLabel.d.ts","sourceRoot":"","sources":["../../../src/sugar/EdgeLabel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACnC,oDAAoD;IACpD,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAAc,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { TIKZ_EDGE_LABEL } from "../kernel/_displayNames.js";
2
+ //#region src/sugar/EdgeLabel.tsx
3
+ /**
4
+ * Sugar 组件——挂在 <Step> 内作为子节点声明边标注。等价于在 Step 上写
5
+ * `label={{ text, position, side }}` prop;二者并存时 prop 优先。
6
+ *
7
+ * <EdgeLabel> 自身不渲染,由 buildIR 在收集 Step 时识别 displayName 后
8
+ * 提取到 IR `step.label`。
9
+ */
10
+ var EdgeLabel = () => null;
11
+ EdgeLabel.displayName = TIKZ_EDGE_LABEL;
12
+ //#endregion
13
+ export { EdgeLabel };
@@ -1,2 +1,3 @@
1
1
  export * from './Draw';
2
+ export * from './EdgeLabel';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sugar/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sugar/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC"}
@@ -1 +1,2 @@
1
1
  import "./Draw.js";
2
+ import "./EdgeLabel.js";
@@ -5,11 +5,14 @@ const require_Node = require("./kernel/Node.cjs");
5
5
  const require_Path = require("./kernel/Path.cjs");
6
6
  const require_Step = require("./kernel/Step.cjs");
7
7
  const require_Text = require("./kernel/Text.cjs");
8
+ const require_Coordinate = require("./kernel/Coordinate.cjs");
8
9
  require("./kernel/index.cjs");
9
10
  const require_Draw = require("./sugar/Draw.cjs");
11
+ const require_EdgeLabel = require("./sugar/EdgeLabel.cjs");
10
12
  require("./sugar/index.cjs");
11
13
  const require__unbuilder = require("./kernel/_unbuilder.cjs");
12
14
  let _retikz_core = require("@retikz/core");
15
+ exports.Coordinate = require_Coordinate.Coordinate;
13
16
  exports.Draw = require_Draw.Draw;
14
17
  Object.defineProperty(exports, "DrawWay", {
15
18
  enumerable: true,
@@ -17,6 +20,7 @@ Object.defineProperty(exports, "DrawWay", {
17
20
  return _retikz_core.DrawWay;
18
21
  }
19
22
  });
23
+ exports.EdgeLabel = require_EdgeLabel.EdgeLabel;
20
24
  exports.Node = require_Node.Node;
21
25
  exports.Path = require_Path.Path;
22
26
  exports.Step = require_Step.Step;
@@ -6,12 +6,12 @@
6
6
  *
7
7
  * 渲染管道:buildIR → compileToScene → renderPrim → SVG
8
8
  */
9
- export { Tikz, Node, Path, Step, Text } from './kernel';
10
- export type { TikzProps, NodeProps, PathProps, StepProps, TextProps } from './kernel';
11
- export { Draw } from './sugar';
12
- export type { DrawProps } from './sugar';
9
+ export { Tikz, Node, Path, Step, Text, Coordinate } from './kernel';
10
+ export type { TikzProps, NodeProps, PathProps, StepProps, TextProps, CoordinateProps, } from './kernel';
11
+ export { Draw, EdgeLabel } from './sugar';
12
+ export type { DrawProps, EdgeLabelProps } from './sugar';
13
13
  export { DrawWay } from '@retikz/core';
14
- export type { WayItem, WayDSL, WayCycle, WayVia } from '@retikz/core';
14
+ export type { WayItem, WayDSL, WayCycle, WayVia, WayRelItem, WayLabel, WayLabelOp, } from '@retikz/core';
15
15
  export { buildIR as convertReactNodeToIR } from './kernel/_builder';
16
16
  export { convertIRToReactNode } from './kernel/_unbuilder';
17
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtF,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGtE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACpE,YAAY,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,eAAe,GAChB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,13 @@
1
+ const require__displayNames = require("./_displayNames.cjs");
2
+ //#region src/kernel/Coordinate.tsx
3
+ /**
4
+ * 占位节点——TikZ `\coordinate (id) at (x, y);` 同义。
5
+ *
6
+ * 命名一个点供后续 path 与其他 node 的 `at.of` 引用,自身不渲染任何图形,
7
+ * 不参与 viewBox 扩展。本组件不返回任何 React 元素,由 <Tikz> builder 在
8
+ * children 扫描阶段读出 props 构造 IR。
9
+ */
10
+ var Coordinate = () => null;
11
+ Coordinate.displayName = require__displayNames.TIKZ_COORDINATE;
12
+ //#endregion
13
+ exports.Coordinate = Coordinate;
@@ -0,0 +1,23 @@
1
+ import { FC } from 'react';
2
+ import { IRAtPosition, IRPosition, PolarPosition } from '@retikz/core';
3
+ /** <Coordinate> 组件的 props */
4
+ export type CoordinateProps = {
5
+ /** 占位节点的 id;其它 path / node `at.of` 通过这个 id 引用 */
6
+ id: string;
7
+ /**
8
+ * 占位点位置;与 `<Node position>` 形态完全一致:
9
+ * - 笛卡尔 `[x, y]`
10
+ * - 极坐标 `{ angle, radius, origin? }`
11
+ * - 相对定位 `{ direction, of, distance? }`
12
+ */
13
+ position: IRPosition | PolarPosition | IRAtPosition;
14
+ };
15
+ /**
16
+ * 占位节点——TikZ `\coordinate (id) at (x, y);` 同义。
17
+ *
18
+ * 命名一个点供后续 path 与其他 node 的 `at.of` 引用,自身不渲染任何图形,
19
+ * 不参与 viewBox 扩展。本组件不返回任何 React 元素,由 <Tikz> builder 在
20
+ * children 扫描阶段读出 props 构造 IR。
21
+ */
22
+ export declare const Coordinate: FC<CoordinateProps>;
23
+ //# sourceMappingURL=Coordinate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Coordinate.d.ts","sourceRoot":"","sources":["../../../src/kernel/Coordinate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG5E,6BAA6B;AAC7B,MAAM,MAAM,eAAe,GAAG;IAC5B,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IACX;;;;;OAKG;IACH,QAAQ,EAAE,UAAU,GAAG,aAAa,GAAG,YAAY,CAAC;CACrD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAAc,CAAC"}
@@ -1,13 +1,18 @@
1
1
  import { FC, ReactNode } from 'react';
2
- import { IRFont, IRLineSpec, IRNode, IRPosition, NodeTextAlign, PolarPosition } from '@retikz/core';
2
+ import { IRAtPosition, IRFont, IRLineSpec, IRNode, IRNodeLabel, IRPosition, NodeTextAlign, PolarPosition } from '@retikz/core';
3
3
  /** <Node> 组件的 props */
4
4
  export type NodeProps = {
5
5
  /** 节点 id;其他 Path/Draw 通过这个 id 引用本节点 */
6
6
  id?: string;
7
7
  /** 节点形状:rectangle(默认)/ circle / ellipse / diamond */
8
8
  shape?: IRNode['shape'];
9
- /** 节点中心位置;笛卡尔 [x, y] 或极坐标(编译时解析) */
10
- position: IRPosition | PolarPosition;
9
+ /**
10
+ * 节点中心位置。三种形态:
11
+ * - 笛卡尔 `[x, y]`
12
+ * - 极坐标 `{ angle, radius, origin? }`(编译时解析)
13
+ * - 相对定位 `{ direction, of, distance? }`(TikZ `[<direction>=<distance> of <id>]` 同义;编译时解析)
14
+ */
15
+ position: IRPosition | PolarPosition | IRAtPosition;
11
16
  /** 旋转角度(度数,与 TikZ 一致),绕节点中心;正值顺时针 */
12
17
  rotate?: number;
13
18
  /**
@@ -77,6 +82,14 @@ export type NodeProps = {
77
82
  textColor?: string;
78
83
  /** 整节点透明度 0~1(同时作用于 shape 与 text) */
79
84
  opacity?: number;
85
+ /**
86
+ * 节点附属标签——TikZ `[label=above:foo]` 同义。
87
+ *
88
+ * 单对象或数组形态;每条 label 接 `text` / `position?` / `distance?` / 样式继承。
89
+ * `position` 接 8 方向枚举(`above`/`right`/...)或数字角度(`label=30:foo` 等价 `position: 30`);
90
+ * 缺省 'above',distance 缺省 4。
91
+ */
92
+ label?: IRNodeLabel | Array<IRNodeLabel>;
80
93
  };
81
94
  /**
82
95
  * Node 是 DSL 标记组件——本身不渲染任何 React 元素。
@@ -1 +1 @@
1
- {"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../../../src/kernel/Node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EACV,MAAM,EACN,UAAU,EACV,aAAa,EACb,aAAa,EACd,MAAM,cAAc,CAAC;AAGtB,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB,oCAAoC;IACpC,QAAQ,EAAE,UAAU,GAAG,aAAa,CAAC;IACrC,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,qDAAqD;IACrD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU;IACV,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU;IACV,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAAc,CAAC"}
1
+ {"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../../../src/kernel/Node.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EACV,YAAY,EACZ,MAAM,EACN,UAAU,EACV,MAAM,EACN,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACd,MAAM,cAAc,CAAC;AAGtB,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB,uCAAuC;IACvC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB;;;;;OAKG;IACH,QAAQ,EAAE,UAAU,GAAG,aAAa,GAAG,YAAY,CAAC;IACpD,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,qDAAqD;IACrD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU;IACV,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU;IACV,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iCAAiC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;CAC1C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAAc,CAAC"}
@@ -8,6 +8,12 @@ export type PathProps = {
8
8
  strokeWidth?: IRPath['strokeWidth'];
9
9
  /** SVG stroke-dasharray 模式(如 "4 2") */
10
10
  strokeDasharray?: IRPath['strokeDasharray'];
11
+ /** 端点形状(SVG `stroke-linecap`):`'butt'`(默认 / 直角)/ `'round'`(半圆)/ `'square'`(方头外扩半 stroke) */
12
+ lineCap?: IRPath['lineCap'];
13
+ /** 拐点形状(SVG `stroke-linejoin`):`'miter'`(默认 / 尖角)/ `'round'`(圆角)/ `'bevel'`(切角) */
14
+ lineJoin?: IRPath['lineJoin'];
15
+ /** 语义 stroke 档位(TikZ `ultra thin` … `ultra thick`);显式 `strokeWidth` 始终优先 */
16
+ thickness?: IRPath['thickness'];
11
17
  /**
12
18
  * 路径级箭头方向。`'->'` = 终点;`'<-'` = 起点;`'<->'` = 两端;
13
19
  * 省略或 `'none'` = 无箭头。
@@ -22,6 +28,12 @@ export type PathProps = {
22
28
  fill?: IRPath['fill'];
23
29
  /** SVG fill-rule:`'nonzero'`(默认)/ `'evenodd'`(环形 / 孔洞) */
24
30
  fillRule?: IRPath['fillRule'];
31
+ /** 整 path 透明度 0~1;同时作用于 stroke 与 fill */
32
+ opacity?: IRPath['opacity'];
33
+ /** 仅 fill 透明度 0~1 */
34
+ fillOpacity?: IRPath['fillOpacity'];
35
+ /** 仅 stroke 透明度 0~1(TikZ `draw opacity`) */
36
+ drawOpacity?: IRPath['drawOpacity'];
25
37
  /** 应当全部是 <Step /> */
26
38
  children: ReactNode;
27
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/kernel/Path.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5C;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAClC,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,qBAAqB;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAAc,CAAC"}
1
+ {"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../../src/kernel/Path.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,uCAAuC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5C,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5B,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAChC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAClC,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACtB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC9B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5B,qBAAqB;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACpC,qBAAqB;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAAc,CAAC"}
@@ -1,9 +1,14 @@
1
- import { FC } from 'react';
2
- import { IRTarget } from '@retikz/core';
1
+ import { FC, ReactNode } from 'react';
2
+ import { IRControlPoint, IRStepLabel, IRTarget } from '@retikz/core';
3
3
  /**
4
4
  * <Step> 组件的 props。
5
- * v0.1.0-alpha.1 支持四种 kind:'move' / 'line' / 'step'(折角)/ 'cycle'(闭合)。
5
+ * alpha.3 起支持十种 kind:'move' / 'line' / 'step'(折角)/ 'cycle'(闭合)/
6
+ * 'curve'(二次贝塞尔)/ 'cubic'(三次贝塞尔)/ 'bend'(弧形简记)/
7
+ * 'arc'(圆弧段)/ 'circlePath'(整圆)/ 'ellipsePath'(整椭圆)。
6
8
  * kind 默认 'line'。
9
+ *
10
+ * ADR-0004:除 'move' / 'cycle' 外的八种 kind 都可挂 `label?: IRStepLabel` 边标注;
11
+ * 等价的写法是用 sugar `<EdgeLabel>` 当 children。两者并存时 prop 优先。
7
12
  */
8
13
  export type StepProps = {
9
14
  /** 移动游标但不绘制(类似 SVG path "M") */
@@ -15,6 +20,10 @@ export type StepProps = {
15
20
  kind?: 'line';
16
21
  /** 直线终点 */
17
22
  to: IRTarget;
23
+ /** 边标注(ADR-0004),等价于 <EdgeLabel> child */
24
+ label?: IRStepLabel;
25
+ /** sugar 形态:`<Step><EdgeLabel>...</EdgeLabel></Step>`;其它 children 静默忽略 */
26
+ children?: ReactNode;
18
27
  } | {
19
28
  /** 折角段:从游标经一个直角拐点到目标点(TikZ `-|` / `|-`) */
20
29
  kind: 'step';
@@ -22,9 +31,83 @@ export type StepProps = {
22
31
  via: '-|' | '|-';
23
32
  /** 折角终点 */
24
33
  to: IRTarget;
34
+ /** 边标注(ADR-0004) */
35
+ label?: IRStepLabel;
36
+ /** sugar 形态 */
37
+ children?: ReactNode;
25
38
  } | {
26
39
  /** 闭合:把当前子路径回到最近一个 move 起点(TikZ `cycle` / SVG `Z`) */
27
40
  kind: 'cycle';
41
+ } | {
42
+ /** 二次贝塞尔:一个控制点(TikZ `.. controls (B) ..`) */
43
+ kind: 'curve';
44
+ /** 控制点(alpha.3 仅支持 [x, y],未来可能扩展) */
45
+ control: IRControlPoint;
46
+ /** 曲线终点 */
47
+ to: IRTarget;
48
+ /** 边标注(ADR-0004) */
49
+ label?: IRStepLabel;
50
+ /** sugar 形态 */
51
+ children?: ReactNode;
52
+ } | {
53
+ /** 三次贝塞尔:两个控制点(TikZ `.. controls (B) and (C) ..`) */
54
+ kind: 'cubic';
55
+ /** 第一控制点(影响起点切线) */
56
+ control1: IRControlPoint;
57
+ /** 第二控制点(影响终点切线) */
58
+ control2: IRControlPoint;
59
+ /** 曲线终点 */
60
+ to: IRTarget;
61
+ /** 边标注(ADR-0004) */
62
+ label?: IRStepLabel;
63
+ /** sugar 形态 */
64
+ children?: ReactNode;
65
+ } | {
66
+ /** 弧形简记:按方向 + 角度生成 cubic(TikZ `to[bend left=N]` / `to[bend right=N]`) */
67
+ kind: 'bend';
68
+ /** 弯向:'left' / 'right'(视觉左右,相对 from→to) */
69
+ bendDirection: 'left' | 'right';
70
+ /** 弯角度(度),缺省 30 */
71
+ bendAngle?: number;
72
+ /** 终点 */
73
+ to: IRTarget;
74
+ /** 边标注(ADR-0004) */
75
+ label?: IRStepLabel;
76
+ /** sugar 形态 */
77
+ children?: ReactNode;
78
+ } | {
79
+ /** 弧段:以游标为圆心,按起末角度 + 半径绘制(TikZ `arc[start angle=…, end angle=…, radius=…]`) */
80
+ kind: 'arc';
81
+ /** 弧的起始角度(度),CCW from +x(注意 retikz polar y 轴向下,角度 90 视觉朝下) */
82
+ startAngle: number;
83
+ /** 弧的终止角度(度) */
84
+ endAngle: number;
85
+ /** 弧的半径 */
86
+ radius: number;
87
+ /** 边标注(ADR-0004) */
88
+ label?: IRStepLabel;
89
+ /** sugar 形态 */
90
+ children?: ReactNode;
91
+ } | {
92
+ /** 整圆:以游标为圆心,按半径绘制;画完画笔留在圆心 */
93
+ kind: 'circlePath';
94
+ /** 圆的半径 */
95
+ radius: number;
96
+ /** 边标注(ADR-0004) */
97
+ label?: IRStepLabel;
98
+ /** sugar 形态 */
99
+ children?: ReactNode;
100
+ } | {
101
+ /** 整椭圆:以游标为圆心,按 x/y 轴半径绘制;画完画笔留在圆心 */
102
+ kind: 'ellipsePath';
103
+ /** 椭圆 x 轴半径 */
104
+ radiusX: number;
105
+ /** 椭圆 y 轴半径 */
106
+ radiusY: number;
107
+ /** 边标注(ADR-0004) */
108
+ label?: IRStepLabel;
109
+ /** sugar 形态 */
110
+ children?: ReactNode;
28
111
  };
29
112
  /**
30
113
  * Step 是 DSL 标记组件——本身不渲染。
@@ -1 +1 @@
1
- {"version":3,"file":"Step.d.ts","sourceRoot":"","sources":["../../../src/kernel/Step.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB;IACE,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,EAAE,EAAE,QAAQ,CAAC;CACd,GACD;IACE,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW;IACX,EAAE,EAAE,QAAQ,CAAC;CACd,GACD;IACE,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;IACjB,WAAW;IACX,EAAE,EAAE,QAAQ,CAAC;CACd,GACD;IACE,sDAAsD;IACtD,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEN;;;GAGG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAAc,CAAC"}
1
+ {"version":3,"file":"Step.d.ts","sourceRoot":"","sources":["../../../src/kernel/Step.tsx"],"names":[],"mappings":"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"}
@@ -26,9 +26,13 @@ var collectArrowShapes = (prims) => {
26
26
  * 每种用到的 shape 一个 marker 定义,id 形如 `${prefix}-${shape}`,
27
27
  * marker 内 path 借 `context-stroke` / `context-fill` 让颜色随 path 同步。
28
28
  */
29
- var Tikz = ({ ir: irFromProp, children, width, height, className, style }) => {
29
+ var Tikz = (props) => {
30
+ const { ir: irFromProp, children, width, height, className, style, nodeDistance } = props;
30
31
  const ir = (0, react.useMemo)(() => irFromProp ?? require__builder.buildIR(children), [irFromProp, children]);
31
- const scene = (0, react.useMemo)(() => (0, _retikz_core.compileToScene)(ir, { measureText: require_browser_measurer.browserMeasurer }), [ir]);
32
+ const scene = (0, react.useMemo)(() => (0, _retikz_core.compileToScene)(ir, {
33
+ measureText: require_browser_measurer.browserMeasurer,
34
+ nodeDistance
35
+ }), [ir, nodeDistance]);
32
36
  const arrowMarkerPrefix = `retikz-arrow-${(0, react.useId)().replace(/[^a-zA-Z0-9]/g, "")}`;
33
37
  const usedShapes = collectArrowShapes(scene.primitives);
34
38
  const arrowMarkerIdFor = (shape) => `${arrowMarkerPrefix}-${shape}`;
@@ -14,6 +14,12 @@ export type TikzProps = {
14
14
  className?: string;
15
15
  /** 透传到 svg 元素的内联样式 */
16
16
  style?: CSSProperties;
17
+ /**
18
+ * 节点相对定位(`Node.position = { direction, of }`)的默认距离,单位 user units;
19
+ * 对应 TikZ 的 `node distance=...`。当节点 position 自带 `distance` 时优先用自带值;
20
+ * 都缺省时回退到 1。
21
+ */
22
+ nodeDistance?: number;
17
23
  };
18
24
  /**
19
25
  * <Tikz> 顶层容器。