@retikz/react 0.1.0-alpha.3 → 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 (43) hide show
  1. package/dist/es/index.d.ts +2 -2
  2. package/dist/es/index.d.ts.map +1 -1
  3. package/dist/es/index.js +2 -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/Tikz.d.ts +6 -0
  10. package/dist/es/kernel/Tikz.d.ts.map +1 -1
  11. package/dist/es/kernel/Tikz.js +6 -2
  12. package/dist/es/kernel/_builder.d.ts.map +1 -1
  13. package/dist/es/kernel/_builder.js +12 -2
  14. package/dist/es/kernel/_displayNames.d.ts +3 -1
  15. package/dist/es/kernel/_displayNames.d.ts.map +1 -1
  16. package/dist/es/kernel/_displayNames.js +4 -2
  17. package/dist/es/kernel/_unbuilder.d.ts.map +1 -1
  18. package/dist/es/kernel/_unbuilder.js +7 -0
  19. package/dist/es/kernel/index.d.ts +1 -0
  20. package/dist/es/kernel/index.d.ts.map +1 -1
  21. package/dist/es/kernel/index.js +1 -0
  22. package/dist/lib/index.cjs +2 -0
  23. package/dist/lib/index.d.ts +2 -2
  24. package/dist/lib/index.d.ts.map +1 -1
  25. package/dist/lib/kernel/Coordinate.cjs +13 -0
  26. package/dist/lib/kernel/Coordinate.d.ts +23 -0
  27. package/dist/lib/kernel/Coordinate.d.ts.map +1 -0
  28. package/dist/lib/kernel/Node.d.ts +16 -3
  29. package/dist/lib/kernel/Node.d.ts.map +1 -1
  30. package/dist/lib/kernel/Tikz.cjs +6 -2
  31. package/dist/lib/kernel/Tikz.d.ts +6 -0
  32. package/dist/lib/kernel/Tikz.d.ts.map +1 -1
  33. package/dist/lib/kernel/_builder.cjs +11 -1
  34. package/dist/lib/kernel/_builder.d.ts.map +1 -1
  35. package/dist/lib/kernel/_displayNames.cjs +4 -1
  36. package/dist/lib/kernel/_displayNames.d.ts +3 -1
  37. package/dist/lib/kernel/_displayNames.d.ts.map +1 -1
  38. package/dist/lib/kernel/_unbuilder.cjs +7 -0
  39. package/dist/lib/kernel/_unbuilder.d.ts.map +1 -1
  40. package/dist/lib/kernel/index.cjs +1 -0
  41. package/dist/lib/kernel/index.d.ts +1 -0
  42. package/dist/lib/kernel/index.d.ts.map +1 -1
  43. package/package.json +2 -2
@@ -6,8 +6,8 @@
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';
9
+ export { Tikz, Node, Path, Step, Text, Coordinate } from './kernel';
10
+ export type { TikzProps, NodeProps, PathProps, StepProps, TextProps, CoordinateProps, } from './kernel';
11
11
  export { Draw, EdgeLabel } from './sugar';
12
12
  export type { DrawProps, EdgeLabelProps } from './sugar';
13
13
  export { DrawWay } from '@retikz/core';
@@ -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,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"}
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"}
package/dist/es/index.js CHANGED
@@ -4,10 +4,11 @@ import { Node } from "./kernel/Node.js";
4
4
  import { Path } from "./kernel/Path.js";
5
5
  import { Step } from "./kernel/Step.js";
6
6
  import { Text } from "./kernel/Text.js";
7
+ import { Coordinate } from "./kernel/Coordinate.js";
7
8
  import "./kernel/index.js";
8
9
  import { Draw } from "./sugar/Draw.js";
9
10
  import { EdgeLabel } from "./sugar/EdgeLabel.js";
10
11
  import "./sugar/index.js";
11
12
  import { convertIRToReactNode } from "./kernel/_unbuilder.js";
12
13
  import { DrawWay } from "@retikz/core";
13
- export { Draw, DrawWay, EdgeLabel, Node, Path, Step, Text, Tikz, convertIRToReactNode, buildIR as convertReactNodeToIR };
14
+ export { Coordinate, Draw, DrawWay, EdgeLabel, Node, Path, Step, Text, Tikz, convertIRToReactNode, buildIR as convertReactNodeToIR };
@@ -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"}
@@ -0,0 +1,13 @@
1
+ import { TIKZ_COORDINATE } from "./_displayNames.js";
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 = TIKZ_COORDINATE;
12
+ //#endregion
13
+ export { Coordinate };
@@ -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"}
@@ -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> 顶层容器。
@@ -1 +1 @@
1
- {"version":3,"file":"Tikz.d.ts","sourceRoot":"","sources":["../../../src/kernel/Tikz.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,EAAE,EAAE,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AACpF,OAAO,EAAmB,KAAK,EAAE,EAAuC,MAAM,cAAc,CAAC;AAO7F,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB,mDAAmD;IACnD,EAAE,CAAC,EAAE,EAAE,CAAC;IACR,gCAAgC;IAChC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAgBF;;;;;;;;;GASG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAuB9B,CAAC"}
1
+ {"version":3,"file":"Tikz.d.ts","sourceRoot":"","sources":["../../../src/kernel/Tikz.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,EAAE,EAAE,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AACpF,OAAO,EAAmB,KAAK,EAAE,EAAuC,MAAM,cAAc,CAAC;AAO7F,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB,mDAAmD;IACnD,EAAE,CAAC,EAAE,EAAE,CAAC;IACR,gCAAgC;IAChC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAgBF;;;;;;;;;GASG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CA2B9B,CAAC"}
@@ -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 = useMemo(() => irFromProp ?? buildIR(children), [irFromProp, children]);
31
- const scene = useMemo(() => compileToScene(ir, { measureText: browserMeasurer }), [ir]);
32
+ const scene = useMemo(() => compileToScene(ir, {
33
+ measureText: browserMeasurer,
34
+ nodeDistance
35
+ }), [ir, nodeDistance]);
32
36
  const arrowMarkerPrefix = `retikz-arrow-${useId().replace(/[^a-zA-Z0-9]/g, "")}`;
33
37
  const usedShapes = collectArrowShapes(scene.primitives);
34
38
  const arrowMarkerIdFor = (shape) => `${arrowMarkerPrefix}-${shape}`;
@@ -1 +1 @@
1
- {"version":3,"file":"_builder.d.ts","sourceRoot":"","sources":["../../../src/kernel/_builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AACpF,OAAO,KAAK,EACV,EAAE,EAQH,MAAM,cAAc,CAAC;AAkXtB;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,UAAU,SAAS,KAAG,EAI5C,CAAC"}
1
+ {"version":3,"file":"_builder.d.ts","sourceRoot":"","sources":["../../../src/kernel/_builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AACpF,OAAO,KAAK,EACV,EAAE,EASH,MAAM,cAAc,CAAC;AA8XtB;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,UAAU,SAAS,KAAG,EAI5C,CAAC"}
@@ -1,4 +1,4 @@
1
- import { TIKZ_NODE, TIKZ_PATH } from "./_displayNames.js";
1
+ import { TIKZ_COORDINATE, TIKZ_NODE, TIKZ_PATH } from "./_displayNames.js";
2
2
  import { Children, isValidElement } from "react";
3
3
  import { CURRENT_IR_VERSION, parseTargetSugar } from "@retikz/core";
4
4
  //#region src/kernel/_builder.ts
@@ -102,7 +102,8 @@ var buildNode = (props) => ({
102
102
  outerSep: props.outerSep,
103
103
  padding: props.padding,
104
104
  margin: props.margin,
105
- font: props.font
105
+ font: props.font,
106
+ label: props.label
106
107
  });
107
108
  /**
108
109
  * 扫描 Step children,把首个 <EdgeLabel> 翻译为 IRStepLabel;
@@ -257,6 +258,12 @@ var readPathChildren = (children) => {
257
258
  }
258
259
  return out;
259
260
  };
261
+ /** 把 <Coordinate> props 翻成 IRChild(占位节点,无视觉) */
262
+ var buildCoordinate = (props) => ({
263
+ type: "coordinate",
264
+ id: props.id,
265
+ position: props.position
266
+ });
260
267
  /** 把 <Path> props 翻成 IRChild;step 序列由 readPathChildren 收集 */
261
268
  var buildPath = (props) => ({
262
269
  type: "path",
@@ -293,6 +300,9 @@ var readSceneChildren = (children) => {
293
300
  case TIKZ_PATH:
294
301
  out.push(buildPath(child.props));
295
302
  return;
303
+ case TIKZ_COORDINATE:
304
+ out.push(buildCoordinate(child.props));
305
+ return;
296
306
  }
297
307
  if (typeof child.type === "function") {
298
308
  const expanded = child.type(child.props);
@@ -6,6 +6,8 @@ export declare const TIKZ_PATH = "@retikz/Path";
6
6
  export declare const TIKZ_STEP = "@retikz/Step";
7
7
  /** <Text> 组件的 displayName(Node 内多行文本带样式) */
8
8
  export declare const TIKZ_TEXT = "@retikz/Text";
9
- /** <EdgeLabel> 组件的 displayName(Step 内边标注,ADR-0004) */
9
+ /** <EdgeLabel> 组件的 displayName(Step 内边标注) */
10
10
  export declare const TIKZ_EDGE_LABEL = "@retikz/EdgeLabel";
11
+ /** <Coordinate> 组件的 displayName(占位节点) */
12
+ export declare const TIKZ_COORDINATE = "@retikz/Coordinate";
11
13
  //# sourceMappingURL=_displayNames.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_displayNames.d.ts","sourceRoot":"","sources":["../../../src/kernel/_displayNames.ts"],"names":[],"mappings":"AAKA,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,4CAA4C;AAC5C,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,sDAAsD;AACtD,eAAO,MAAM,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"_displayNames.d.ts","sourceRoot":"","sources":["../../../src/kernel/_displayNames.ts"],"names":[],"mappings":"AAKA,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,4CAA4C;AAC5C,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6CAA6C;AAC7C,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,yCAAyC;AACzC,eAAO,MAAM,eAAe,uBAAuB,CAAC"}
@@ -7,7 +7,9 @@ var TIKZ_PATH = "@retikz/Path";
7
7
  var TIKZ_STEP = "@retikz/Step";
8
8
  /** <Text> 组件的 displayName(Node 内多行文本带样式) */
9
9
  var TIKZ_TEXT = "@retikz/Text";
10
- /** <EdgeLabel> 组件的 displayName(Step 内边标注,ADR-0004) */
10
+ /** <EdgeLabel> 组件的 displayName(Step 内边标注) */
11
11
  var TIKZ_EDGE_LABEL = "@retikz/EdgeLabel";
12
+ /** <Coordinate> 组件的 displayName(占位节点) */
13
+ var TIKZ_COORDINATE = "@retikz/Coordinate";
12
14
  //#endregion
13
- export { TIKZ_EDGE_LABEL, TIKZ_NODE, TIKZ_PATH, TIKZ_STEP, TIKZ_TEXT };
15
+ export { TIKZ_COORDINATE, TIKZ_EDGE_LABEL, TIKZ_NODE, TIKZ_PATH, TIKZ_STEP, TIKZ_TEXT };
@@ -1 +1 @@
1
- {"version":3,"file":"_unbuilder.d.ts","sourceRoot":"","sources":["../../../src/kernel/_unbuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,EAAE,EAA2B,MAAM,cAAc,CAAC;AA2JhE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,IAAI,EAAE,KAAG,SACW,CAAC"}
1
+ {"version":3,"file":"_unbuilder.d.ts","sourceRoot":"","sources":["../../../src/kernel/_unbuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,EAAE,EAA2B,MAAM,cAAc,CAAC;AAmKhE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,IAAI,EAAE,KAAG,SACW,CAAC"}
@@ -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 */
@@ -134,6 +136,11 @@ var childToElement = (child, key) => {
134
136
  drawOpacity: child.drawOpacity,
135
137
  children: child.children.map((s, j) => stepToElement(s, j))
136
138
  });
139
+ case "coordinate": return createElement(Coordinate, {
140
+ key,
141
+ id: child.id,
142
+ position: child.position
143
+ });
137
144
  default: return assertNever(child);
138
145
  }
139
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";
@@ -5,12 +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");
10
11
  const require_EdgeLabel = require("./sugar/EdgeLabel.cjs");
11
12
  require("./sugar/index.cjs");
12
13
  const require__unbuilder = require("./kernel/_unbuilder.cjs");
13
14
  let _retikz_core = require("@retikz/core");
15
+ exports.Coordinate = require_Coordinate.Coordinate;
14
16
  exports.Draw = require_Draw.Draw;
15
17
  Object.defineProperty(exports, "DrawWay", {
16
18
  enumerable: true,
@@ -6,8 +6,8 @@
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';
9
+ export { Tikz, Node, Path, Step, Text, Coordinate } from './kernel';
10
+ export type { TikzProps, NodeProps, PathProps, StepProps, TextProps, CoordinateProps, } from './kernel';
11
11
  export { Draw, EdgeLabel } from './sugar';
12
12
  export type { DrawProps, EdgeLabelProps } from './sugar';
13
13
  export { DrawWay } from '@retikz/core';
@@ -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,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"}
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"}
@@ -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> 顶层容器。
@@ -1 +1 @@
1
- {"version":3,"file":"Tikz.d.ts","sourceRoot":"","sources":["../../../src/kernel/Tikz.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,EAAE,EAAE,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AACpF,OAAO,EAAmB,KAAK,EAAE,EAAuC,MAAM,cAAc,CAAC;AAO7F,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB,mDAAmD;IACnD,EAAE,CAAC,EAAE,EAAE,CAAC;IACR,gCAAgC;IAChC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CAAC;AAgBF;;;;;;;;;GASG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CAuB9B,CAAC"}
1
+ {"version":3,"file":"Tikz.d.ts","sourceRoot":"","sources":["../../../src/kernel/Tikz.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,EAAE,EAAE,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AACpF,OAAO,EAAmB,KAAK,EAAE,EAAuC,MAAM,cAAc,CAAC;AAO7F,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG;IACtB,mDAAmD;IACnD,EAAE,CAAC,EAAE,EAAE,CAAC;IACR,gCAAgC;IAChC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAgBF;;;;;;;;;GASG;AACH,eAAO,MAAM,IAAI,EAAE,EAAE,CAAC,SAAS,CA2B9B,CAAC"}
@@ -102,7 +102,8 @@ var buildNode = (props) => ({
102
102
  outerSep: props.outerSep,
103
103
  padding: props.padding,
104
104
  margin: props.margin,
105
- font: props.font
105
+ font: props.font,
106
+ label: props.label
106
107
  });
107
108
  /**
108
109
  * 扫描 Step children,把首个 <EdgeLabel> 翻译为 IRStepLabel;
@@ -257,6 +258,12 @@ var readPathChildren = (children) => {
257
258
  }
258
259
  return out;
259
260
  };
261
+ /** 把 <Coordinate> props 翻成 IRChild(占位节点,无视觉) */
262
+ var buildCoordinate = (props) => ({
263
+ type: "coordinate",
264
+ id: props.id,
265
+ position: props.position
266
+ });
260
267
  /** 把 <Path> props 翻成 IRChild;step 序列由 readPathChildren 收集 */
261
268
  var buildPath = (props) => ({
262
269
  type: "path",
@@ -293,6 +300,9 @@ var readSceneChildren = (children) => {
293
300
  case require__displayNames.TIKZ_PATH:
294
301
  out.push(buildPath(child.props));
295
302
  return;
303
+ case require__displayNames.TIKZ_COORDINATE:
304
+ out.push(buildCoordinate(child.props));
305
+ return;
296
306
  }
297
307
  if (typeof child.type === "function") {
298
308
  const expanded = child.type(child.props);
@@ -1 +1 @@
1
- {"version":3,"file":"_builder.d.ts","sourceRoot":"","sources":["../../../src/kernel/_builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AACpF,OAAO,KAAK,EACV,EAAE,EAQH,MAAM,cAAc,CAAC;AAkXtB;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,UAAU,SAAS,KAAG,EAI5C,CAAC"}
1
+ {"version":3,"file":"_builder.d.ts","sourceRoot":"","sources":["../../../src/kernel/_builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAkB,MAAM,OAAO,CAAC;AACpF,OAAO,KAAK,EACV,EAAE,EASH,MAAM,cAAc,CAAC;AA8XtB;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,UAAU,SAAS,KAAG,EAI5C,CAAC"}
@@ -7,9 +7,12 @@ var TIKZ_PATH = "@retikz/Path";
7
7
  var TIKZ_STEP = "@retikz/Step";
8
8
  /** <Text> 组件的 displayName(Node 内多行文本带样式) */
9
9
  var TIKZ_TEXT = "@retikz/Text";
10
- /** <EdgeLabel> 组件的 displayName(Step 内边标注,ADR-0004) */
10
+ /** <EdgeLabel> 组件的 displayName(Step 内边标注) */
11
11
  var TIKZ_EDGE_LABEL = "@retikz/EdgeLabel";
12
+ /** <Coordinate> 组件的 displayName(占位节点) */
13
+ var TIKZ_COORDINATE = "@retikz/Coordinate";
12
14
  //#endregion
15
+ exports.TIKZ_COORDINATE = TIKZ_COORDINATE;
13
16
  exports.TIKZ_EDGE_LABEL = TIKZ_EDGE_LABEL;
14
17
  exports.TIKZ_NODE = TIKZ_NODE;
15
18
  exports.TIKZ_PATH = TIKZ_PATH;
@@ -6,6 +6,8 @@ export declare const TIKZ_PATH = "@retikz/Path";
6
6
  export declare const TIKZ_STEP = "@retikz/Step";
7
7
  /** <Text> 组件的 displayName(Node 内多行文本带样式) */
8
8
  export declare const TIKZ_TEXT = "@retikz/Text";
9
- /** <EdgeLabel> 组件的 displayName(Step 内边标注,ADR-0004) */
9
+ /** <EdgeLabel> 组件的 displayName(Step 内边标注) */
10
10
  export declare const TIKZ_EDGE_LABEL = "@retikz/EdgeLabel";
11
+ /** <Coordinate> 组件的 displayName(占位节点) */
12
+ export declare const TIKZ_COORDINATE = "@retikz/Coordinate";
11
13
  //# sourceMappingURL=_displayNames.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_displayNames.d.ts","sourceRoot":"","sources":["../../../src/kernel/_displayNames.ts"],"names":[],"mappings":"AAKA,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,4CAA4C;AAC5C,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,sDAAsD;AACtD,eAAO,MAAM,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"_displayNames.d.ts","sourceRoot":"","sources":["../../../src/kernel/_displayNames.ts"],"names":[],"mappings":"AAKA,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6BAA6B;AAC7B,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,4CAA4C;AAC5C,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,6CAA6C;AAC7C,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,yCAAyC;AACzC,eAAO,MAAM,eAAe,uBAAuB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  const require_Node = require("./Node.cjs");
2
2
  const require_Path = require("./Path.cjs");
3
3
  const require_Step = require("./Step.cjs");
4
+ const require_Coordinate = require("./Coordinate.cjs");
4
5
  let react = require("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 */
@@ -134,6 +136,11 @@ var childToElement = (child, key) => {
134
136
  drawOpacity: child.drawOpacity,
135
137
  children: child.children.map((s, j) => stepToElement(s, j))
136
138
  });
139
+ case "coordinate": return (0, react.createElement)(require_Coordinate.Coordinate, {
140
+ key,
141
+ id: child.id,
142
+ position: child.position
143
+ });
137
144
  default: return assertNever(child);
138
145
  }
139
146
  };
@@ -1 +1 @@
1
- {"version":3,"file":"_unbuilder.d.ts","sourceRoot":"","sources":["../../../src/kernel/_unbuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,EAAE,EAA2B,MAAM,cAAc,CAAC;AA2JhE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,IAAI,EAAE,KAAG,SACW,CAAC"}
1
+ {"version":3,"file":"_unbuilder.d.ts","sourceRoot":"","sources":["../../../src/kernel/_unbuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,EAAE,EAA2B,MAAM,cAAc,CAAC;AAmKhE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAAI,IAAI,EAAE,KAAG,SACW,CAAC"}
@@ -3,3 +3,4 @@ require("./Node.cjs");
3
3
  require("./Path.cjs");
4
4
  require("./Step.cjs");
5
5
  require("./Text.cjs");
6
+ require("./Coordinate.cjs");
@@ -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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retikz/react",
3
- "version": "0.1.0-alpha.3",
3
+ "version": "0.1.0-alpha.4",
4
4
  "description": "React adapter for retikz: Kernel/Sugar JSX components and SVG renderer.",
5
5
  "type": "module",
6
6
  "main": "dist/lib/index.cjs",
@@ -24,7 +24,7 @@
24
24
  "react-dom": ">=18"
25
25
  },
26
26
  "dependencies": {
27
- "@retikz/core": "0.1.0-alpha.3"
27
+ "@retikz/core": "0.1.0-alpha.4"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/node": "^25.6.0",