@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
@@ -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"}
package/dist/es/index.js CHANGED
@@ -4,9 +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";
10
+ import { EdgeLabel } from "./sugar/EdgeLabel.js";
9
11
  import "./sugar/index.js";
10
12
  import { convertIRToReactNode } from "./kernel/_unbuilder.js";
11
13
  import { DrawWay } from "@retikz/core";
12
- export { Draw, DrawWay, 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"}
@@ -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":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG1E;;;;;;;;;GASG;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;IACb,0CAA0C;IAC1C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GACD;IACE,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;IACjB,WAAW;IACX,EAAE,EAAE,QAAQ,CAAC;IACb,oBAAoB;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GACD;IACE,sDAAsD;IACtD,IAAI,EAAE,OAAO,CAAC;CACf,GACD;IACE,6CAA6C;IAC7C,IAAI,EAAE,OAAO,CAAC;IACd,qCAAqC;IACrC,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW;IACX,EAAE,EAAE,QAAQ,CAAC;IACb,oBAAoB;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GACD;IACE,qDAAqD;IACrD,IAAI,EAAE,OAAO,CAAC;IACd,oBAAoB;IACpB,QAAQ,EAAE,cAAc,CAAC;IACzB,oBAAoB;IACpB,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW;IACX,EAAE,EAAE,QAAQ,CAAC;IACb,oBAAoB;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GACD;IACE,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,mBAAmB;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS;IACT,EAAE,EAAE,QAAQ,CAAC;IACb,oBAAoB;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GACD;IACE,+EAA+E;IAC/E,IAAI,EAAE,KAAK,CAAC;IACZ,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GACD;IACE,+BAA+B;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GACD;IACE,sCAAsC;IACtC,IAAI,EAAE,aAAa,CAAC;IACpB,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,eAAe;IACf,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,CAAC;AAEN;;;GAGG;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,EAAE,EAAE,EAA+C,MAAM,cAAc,CAAC;AA6NpF;;;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,6 +1,6 @@
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
- import { CURRENT_IR_VERSION } from "@retikz/core";
3
+ import { CURRENT_IR_VERSION, parseTargetSugar } from "@retikz/core";
4
4
  //#region src/kernel/_builder.ts
5
5
  /** 取 React 元素 type 上的 displayName;type 为字符串时直接返回,用于识别 Kernel/Sugar 组件 */
6
6
  var getDisplayName = (el) => {
@@ -102,9 +102,37 @@ 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
  /**
109
+ * 扫描 Step children,把首个 <EdgeLabel> 翻译为 IRStepLabel;
110
+ * 非字符串 children 静默跳过;多个 <EdgeLabel> 取首个。
111
+ */
112
+ var readEdgeLabel = (children) => {
113
+ let result;
114
+ Children.forEach(children, (child) => {
115
+ if (result !== void 0) return;
116
+ if (!isValidElement(child)) return;
117
+ if (getDisplayName(child) !== "@retikz/EdgeLabel") return;
118
+ const props = child.props;
119
+ if (typeof props.children !== "string") return;
120
+ const out = { text: props.children };
121
+ if (props.position !== void 0) out.position = props.position;
122
+ if (props.side !== void 0) out.side = props.side;
123
+ result = out;
124
+ });
125
+ return result;
126
+ };
127
+ /**
128
+ * 解析 Step 的 label 来源:prop `label` 优先于 sugar `<EdgeLabel>` child;
129
+ * 都缺省时返回 undefined。
130
+ */
131
+ var resolveStepLabel = (props) => {
132
+ if (props.label !== void 0) return props.label;
133
+ return readEdgeLabel(props.children);
134
+ };
135
+ /**
108
136
  * 扫描 <Path> children 收集 <Step> 序列。
109
137
  * 至少 2 段;首段不是 move 时强制改为 move(与 SVG path 的 "M …" 语义对齐);
110
138
  * cycle 没有 to 字段,若用户把 cycle 放在首段,coerce 时降级到 move (0,0)。
@@ -123,46 +151,135 @@ var readPathChildren = (children) => {
123
151
  });
124
152
  return;
125
153
  }
154
+ const label = kind === "move" ? void 0 : resolveStepLabel(props);
126
155
  if (kind === "step") {
127
- out.push({
156
+ const step = {
128
157
  type: "step",
129
158
  kind: "step",
130
159
  via: props.via,
131
- to: props.to
160
+ to: parseTargetSugar(props.to)
161
+ };
162
+ if (label) step.label = label;
163
+ out.push(step);
164
+ return;
165
+ }
166
+ if (kind === "curve") {
167
+ const step = {
168
+ type: "step",
169
+ kind: "curve",
170
+ to: parseTargetSugar(props.to),
171
+ control: props.control
172
+ };
173
+ if (label) step.label = label;
174
+ out.push(step);
175
+ return;
176
+ }
177
+ if (kind === "cubic") {
178
+ const step = {
179
+ type: "step",
180
+ kind: "cubic",
181
+ to: parseTargetSugar(props.to),
182
+ control1: props.control1,
183
+ control2: props.control2
184
+ };
185
+ if (label) step.label = label;
186
+ out.push(step);
187
+ return;
188
+ }
189
+ if (kind === "bend") {
190
+ const step = {
191
+ type: "step",
192
+ kind: "bend",
193
+ to: parseTargetSugar(props.to),
194
+ bendDirection: props.bendDirection
195
+ };
196
+ if (props.bendAngle !== void 0) step.bendAngle = props.bendAngle;
197
+ if (label) step.label = label;
198
+ out.push(step);
199
+ return;
200
+ }
201
+ if (kind === "arc") {
202
+ const step = {
203
+ type: "step",
204
+ kind: "arc",
205
+ startAngle: props.startAngle,
206
+ endAngle: props.endAngle,
207
+ radius: props.radius
208
+ };
209
+ if (label) step.label = label;
210
+ out.push(step);
211
+ return;
212
+ }
213
+ if (kind === "circlePath") {
214
+ const step = {
215
+ type: "step",
216
+ kind: "circlePath",
217
+ radius: props.radius
218
+ };
219
+ if (label) step.label = label;
220
+ out.push(step);
221
+ return;
222
+ }
223
+ if (kind === "ellipsePath") {
224
+ const step = {
225
+ type: "step",
226
+ kind: "ellipsePath",
227
+ radiusX: props.radiusX,
228
+ radiusY: props.radiusY
229
+ };
230
+ if (label) step.label = label;
231
+ out.push(step);
232
+ return;
233
+ }
234
+ if (kind === "move") {
235
+ out.push({
236
+ type: "step",
237
+ kind: "move",
238
+ to: parseTargetSugar(props.to)
132
239
  });
133
240
  return;
134
241
  }
135
- out.push({
242
+ const step = {
136
243
  type: "step",
137
- kind,
138
- to: props.to
139
- });
244
+ kind: "line",
245
+ to: parseTargetSugar(props.to)
246
+ };
247
+ if (label) step.label = label;
248
+ out.push(step);
140
249
  });
141
250
  if (out.length < 2) throw new Error("<Path> requires at least 2 <Step> children");
142
251
  if (out[0].kind !== "move") {
143
252
  const first = out[0];
144
- out[0] = first.kind === "cycle" ? {
253
+ out[0] = {
145
254
  type: "step",
146
255
  kind: "move",
147
- to: [0, 0]
148
- } : {
149
- type: "step",
150
- kind: "move",
151
- to: first.to
256
+ to: first.kind === "cycle" || first.kind === "arc" || first.kind === "circlePath" || first.kind === "ellipsePath" ? [0, 0] : first.to
152
257
  };
153
258
  }
154
259
  return out;
155
260
  };
261
+ /** 把 <Coordinate> props 翻成 IRChild(占位节点,无视觉) */
262
+ var buildCoordinate = (props) => ({
263
+ type: "coordinate",
264
+ id: props.id,
265
+ position: props.position
266
+ });
156
267
  /** 把 <Path> props 翻成 IRChild;step 序列由 readPathChildren 收集 */
157
268
  var buildPath = (props) => ({
158
269
  type: "path",
159
270
  stroke: props.stroke,
160
271
  strokeWidth: props.strokeWidth,
161
272
  strokeDasharray: props.strokeDasharray,
273
+ lineCap: props.lineCap,
274
+ lineJoin: props.lineJoin,
275
+ thickness: props.thickness,
162
276
  arrow: props.arrow,
163
277
  arrowShape: props.arrowShape,
164
278
  fill: props.fill,
165
279
  fillRule: props.fillRule,
280
+ opacity: props.opacity,
281
+ fillOpacity: props.fillOpacity,
282
+ drawOpacity: props.drawOpacity,
166
283
  children: readPathChildren(props.children)
167
284
  });
168
285
  /**
@@ -183,6 +300,9 @@ var readSceneChildren = (children) => {
183
300
  case TIKZ_PATH:
184
301
  out.push(buildPath(child.props));
185
302
  return;
303
+ case TIKZ_COORDINATE:
304
+ out.push(buildCoordinate(child.props));
305
+ return;
186
306
  }
187
307
  if (typeof child.type === "function") {
188
308
  const expanded = child.type(child.props);
@@ -6,4 +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 内边标注) */
10
+ export declare const TIKZ_EDGE_LABEL = "@retikz/EdgeLabel";
11
+ /** <Coordinate> 组件的 displayName(占位节点) */
12
+ export declare const TIKZ_COORDINATE = "@retikz/Coordinate";
9
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"}
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,5 +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 内边标注) */
11
+ var TIKZ_EDGE_LABEL = "@retikz/EdgeLabel";
12
+ /** <Coordinate> 组件的 displayName(占位节点) */
13
+ var TIKZ_COORDINATE = "@retikz/Coordinate";
10
14
  //#endregion
11
- export { 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;AA8EhE;;;;;;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"}