@retikz/core 0.2.0-alpha.2 → 0.2.0-alpha.3

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 (73) hide show
  1. package/dist/es/compile/compile.d.ts +8 -1
  2. package/dist/es/compile/compile.d.ts.map +1 -1
  3. package/dist/es/compile/compile.js +15 -2
  4. package/dist/es/compile/node.d.ts +15 -10
  5. package/dist/es/compile/node.d.ts.map +1 -1
  6. package/dist/es/compile/node.js +38 -175
  7. package/dist/es/compile/scope.d.ts.map +1 -1
  8. package/dist/es/compile/scope.js +3 -1
  9. package/dist/es/index.d.ts +3 -1
  10. package/dist/es/index.d.ts.map +1 -1
  11. package/dist/es/index.js +4 -2
  12. package/dist/es/ir/node.d.ts +14 -10
  13. package/dist/es/ir/node.d.ts.map +1 -1
  14. package/dist/es/ir/node.js +1 -1
  15. package/dist/es/ir/scope.d.ts +8 -18
  16. package/dist/es/ir/scope.d.ts.map +1 -1
  17. package/dist/es/shapes/_shared.d.ts +7 -0
  18. package/dist/es/shapes/_shared.d.ts.map +1 -0
  19. package/dist/es/shapes/_shared.js +11 -0
  20. package/dist/es/shapes/circle.d.ts +8 -0
  21. package/dist/es/shapes/circle.d.ts.map +1 -0
  22. package/dist/es/shapes/circle.js +33 -0
  23. package/dist/es/shapes/diamond.d.ts +8 -0
  24. package/dist/es/shapes/diamond.d.ts.map +1 -0
  25. package/dist/es/shapes/diamond.js +65 -0
  26. package/dist/es/shapes/ellipse.d.ts +8 -0
  27. package/dist/es/shapes/ellipse.d.ts.map +1 -0
  28. package/dist/es/shapes/ellipse.js +45 -0
  29. package/dist/es/shapes/index.d.ts +14 -0
  30. package/dist/es/shapes/index.d.ts.map +1 -0
  31. package/dist/es/shapes/index.js +15 -0
  32. package/dist/es/shapes/rectangle.d.ts +8 -0
  33. package/dist/es/shapes/rectangle.d.ts.map +1 -0
  34. package/dist/es/shapes/rectangle.js +40 -0
  35. package/dist/es/shapes/types.d.ts +44 -0
  36. package/dist/es/shapes/types.d.ts.map +1 -0
  37. package/dist/lib/compile/compile.cjs +17 -4
  38. package/dist/lib/compile/compile.d.ts +8 -1
  39. package/dist/lib/compile/compile.d.ts.map +1 -1
  40. package/dist/lib/compile/node.cjs +38 -175
  41. package/dist/lib/compile/node.d.ts +15 -10
  42. package/dist/lib/compile/node.d.ts.map +1 -1
  43. package/dist/lib/compile/scope.cjs +3 -1
  44. package/dist/lib/compile/scope.d.ts.map +1 -1
  45. package/dist/lib/index.cjs +6 -1
  46. package/dist/lib/index.d.ts +3 -1
  47. package/dist/lib/index.d.ts.map +1 -1
  48. package/dist/lib/ir/node.cjs +1 -1
  49. package/dist/lib/ir/node.d.ts +14 -10
  50. package/dist/lib/ir/node.d.ts.map +1 -1
  51. package/dist/lib/ir/scope.d.ts +8 -18
  52. package/dist/lib/ir/scope.d.ts.map +1 -1
  53. package/dist/lib/shapes/_shared.cjs +11 -0
  54. package/dist/lib/shapes/_shared.d.ts +7 -0
  55. package/dist/lib/shapes/_shared.d.ts.map +1 -0
  56. package/dist/lib/shapes/circle.cjs +33 -0
  57. package/dist/lib/shapes/circle.d.ts +8 -0
  58. package/dist/lib/shapes/circle.d.ts.map +1 -0
  59. package/dist/lib/shapes/diamond.cjs +65 -0
  60. package/dist/lib/shapes/diamond.d.ts +8 -0
  61. package/dist/lib/shapes/diamond.d.ts.map +1 -0
  62. package/dist/lib/shapes/ellipse.cjs +45 -0
  63. package/dist/lib/shapes/ellipse.d.ts +8 -0
  64. package/dist/lib/shapes/ellipse.d.ts.map +1 -0
  65. package/dist/lib/shapes/index.cjs +14 -0
  66. package/dist/lib/shapes/index.d.ts +14 -0
  67. package/dist/lib/shapes/index.d.ts.map +1 -0
  68. package/dist/lib/shapes/rectangle.cjs +40 -0
  69. package/dist/lib/shapes/rectangle.d.ts +8 -0
  70. package/dist/lib/shapes/rectangle.d.ts.map +1 -0
  71. package/dist/lib/shapes/types.d.ts +44 -0
  72. package/dist/lib/shapes/types.d.ts.map +1 -0
  73. package/package.json +1 -1
@@ -1,5 +1,6 @@
1
1
  import { IR } from '../ir';
2
2
  import { Scene } from '../primitive';
3
+ import { ShapeDefinition } from '../shapes';
3
4
  import { TextMeasurer } from './text-metrics';
4
5
  /** 编译期警告:path / position 解析失败时通过 `CompileOptions.onWarn` 发出,不影响编译产物 */
5
6
  export type CompileWarning = {
@@ -7,7 +8,7 @@ export type CompileWarning = {
7
8
  * 警告类型代码(机器可读)
8
9
  * @description 用户可按 code 分支处理;未来 alpha 加新 code 不破坏调用方
9
10
  */
10
- code: 'UNRESOLVED_NODE_REFERENCE' | 'PATH_TOO_SHORT' | 'ANCHOR_RESOLUTION_FAILED' | 'OFFSET_BASE_UNRESOLVED' | 'POLAR_ORIGIN_UNRESOLVED' | 'AT_TARGET_UNRESOLVED' | 'RELATIVE_INITIAL_NO_PREV_END' | 'BBOX_EXTREME_INPUT' | 'DUPLICATE_NODE_ID' | (string & {});
11
+ code: 'UNRESOLVED_NODE_REFERENCE' | 'PATH_TOO_SHORT' | 'ANCHOR_RESOLUTION_FAILED' | 'OFFSET_BASE_UNRESOLVED' | 'POLAR_ORIGIN_UNRESOLVED' | 'AT_TARGET_UNRESOLVED' | 'RELATIVE_INITIAL_NO_PREV_END' | 'BBOX_EXTREME_INPUT' | 'DUPLICATE_NODE_ID' | 'SHAPE_OVERRIDES_BUILTIN' | (string & {});
11
12
  /** 人类可读消息(英文) */
12
13
  message: string;
13
14
  /** IR locator 路径(jq-like,如 `'children[3].path.children[1].to'`) */
@@ -34,6 +35,12 @@ export type CompileOptions = {
34
35
  * @description path / position 解析失败时按 IR locator + code + message 同步触发;不传时 dev 模式(`process.env.NODE_ENV !== 'production'`)默认 `console.warn`、生产静默
35
36
  */
36
37
  onWarn?: (warning: CompileWarning) => void;
38
+ /**
39
+ * 运行时注入的第三方 shape(不进 IR)
40
+ * @description 有效 shape 表 = `{ ...BUILTIN_SHAPES, ...shapes }`——同名 key 覆盖内置,经 `onWarn` 发
41
+ * `SHAPE_OVERRIDES_BUILTIN`。IR 的 `node.shape` 仍是字符串;未注册名在编译期 throw。
42
+ */
43
+ shapes?: Record<string, ShapeDefinition>;
37
44
  };
38
45
  /**
39
46
  * IR → Scene 纯函数转换,所有 adapter 共享
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/compile/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAwC,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAa,KAAK,EAA6B,MAAM,cAAc,CAAC;AAoBhF,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AA2CrE,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,IAAI,EACA,2BAA2B,GAC3B,gBAAgB,GAChB,0BAA0B,GAC1B,wBAAwB,GACxB,yBAAyB,GACzB,sBAAsB,GACtB,8BAA8B,GAC9B,oBAAoB,GACpB,mBAAmB,GACnB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAClB,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,2BAA2B;AAC3B,MAAM,MAAM,cAAc,GAAG;IAC3B,oCAAoC;IACpC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;CAC5C,CAAC;AAsDF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,EAAE,EAAE,UAAS,cAAmB,KAAG,KA+MrE,CAAC"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/compile/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAwC,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAa,KAAK,EAA6B,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAoBjD,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AA4CrE,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,IAAI,EACA,2BAA2B,GAC3B,gBAAgB,GAChB,0BAA0B,GAC1B,wBAAwB,GACxB,yBAAyB,GACzB,sBAAsB,GACtB,8BAA8B,GAC9B,oBAAoB,GACpB,mBAAmB,GACnB,yBAAyB,GACzB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAClB,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,2BAA2B;AAC3B,MAAM,MAAM,cAAc,GAAG;IAC3B,oCAAoC;IACpC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC1C,CAAC;AAsDF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,EAAE,EAAE,UAAS,cAAmB,KAAG,KAgOrE,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { rect } from "../geometry/rect.js";
2
+ import { BUILTIN_SHAPES } from "../shapes/index.js";
2
3
  import { NameStack } from "./name-stack.js";
3
4
  import { applyTransformChain, computeScopeBoundingBox, lowerScopeTransforms, projectLayoutToGlobal, registerScopeAsLayout } from "./scope.js";
4
5
  import { resolvePosition } from "./position.js";
@@ -16,7 +17,8 @@ import { computeLayout } from "./layout.js";
16
17
  */
17
18
  var zeroSizeRectAt = (id, [cx, cy]) => ({
18
19
  id,
19
- shape: "rectangle",
20
+ shapeName: "rectangle",
21
+ shapeDef: BUILTIN_SHAPES.rectangle,
20
22
  rect: {
21
23
  x: cx,
22
24
  y: cy,
@@ -84,6 +86,17 @@ var compileToScene = (ir, options = {}) => {
84
86
  const round = makeRound(options.precision ?? 2);
85
87
  const nodeDistance = options.nodeDistance;
86
88
  const onWarn = options.onWarn ?? defaultWarnDispatcher;
89
+ const effectiveShapes = options.shapes ? {
90
+ ...BUILTIN_SHAPES,
91
+ ...options.shapes
92
+ } : BUILTIN_SHAPES;
93
+ if (options.shapes) {
94
+ for (const name of Object.keys(options.shapes)) if (Object.prototype.hasOwnProperty.call(BUILTIN_SHAPES, name)) onWarn({
95
+ code: "SHAPE_OVERRIDES_BUILTIN",
96
+ message: `Injected shape '${name}' overrides the built-in shape of the same name.`,
97
+ path: `options.shapes.${name}`
98
+ });
99
+ }
87
100
  const primitives = [];
88
101
  const nameStack = new NameStack({ onDuplicate: (info) => onWarn(formatDuplicateWarning(info)) });
89
102
  const allPoints = [];
@@ -127,7 +140,7 @@ var compileToScene = (ir, options = {}) => {
127
140
  for (let i = 0; i < children.length; i++) {
128
141
  const child = children[i];
129
142
  if (child.type === "node") {
130
- const layout = layoutNode(resolveNodeStyle(child, styleStack), measureText, nameStack, nodeDistance, chain, resolveLabelDefault(styleStack));
143
+ const layout = layoutNode(resolveNodeStyle(child, styleStack), measureText, nameStack, nodeDistance, chain, resolveLabelDefault(styleStack), effectiveShapes);
131
144
  const globalLayout = chain.length === 0 ? layout : projectLayoutToGlobal(layout, chain);
132
145
  if (child.id) nameStack.register(child.id, globalLayout, `${locatorPrefix}children[${i}].node.id`);
133
146
  for (const prim of emitNodePrimitives(layout, round)) sink.push(prim);
@@ -1,14 +1,17 @@
1
1
  import { Position } from '../geometry/point';
2
- import { Rect, RectAnchor } from '../geometry/rect';
3
- import { AtDirection, IRLabelDefault, IRNode, NodeShape } from '../ir';
2
+ import { Rect } from '../geometry/rect';
3
+ import { AtDirection, IRLabelDefault, IRNode } from '../ir';
4
4
  import { ScenePrimitive, TextLine, Transform } from '../primitive';
5
+ import { ShapeDefinition } from '../shapes';
5
6
  import { NameStack } from './name-stack';
6
7
  import { TextMeasurer } from './text-metrics';
7
8
  export type NodeLayout = {
8
9
  /** 节点 id(其他位置可引用) */
9
10
  id?: string;
10
- /** 节点形状,所有几何 / boundaryPoint shape 多态 */
11
- shape: NodeShape;
11
+ /** 节点形状名(诊断 / 错误信息用;几何走 shapeDef) */
12
+ shapeName: string;
13
+ /** 已解析的 shape 定义;circumscribe / boundaryPoint / anchor / emit 多点复用,取代旧 switch */
14
+ shapeDef: ShapeDefinition;
12
15
  /**
13
16
  * 节点视觉边界框(所有 shape 共享语义)
14
17
  * @description rectangle: rect 本身;circle: width=height=2×radius;ellipse: 2×rx,2×ry;diamond: 2×halfA,2×halfB。x,y 是几何中心,rotate 弧度
@@ -79,14 +82,15 @@ export type NodeLabelLayout = {
79
82
  };
80
83
  /**
81
84
  * 取节点 shape 在 toward 方向的附着点(path 端点贴边用)
82
- * @description shape 多态调用各自 boundaryPoint;margin > 0 时形状先外扩,让 path 在 border 外停 margin
85
+ * @description shapeDef.boundaryPoint;margin > 0 时先膨胀外接 Rect,让 path 在 border 外停 margin
83
86
  */
84
87
  export declare const boundaryPointOf: (layout: NodeLayout, toward: Position) => Position;
85
88
  /**
86
- * 取节点 shape 命名 anchor(center / north / east / north-east 等 9 个)
87
- * @description 不应用 margin——TikZ 语义中 explicit anchor 取视觉边界点不涉及 outer sep;用于 `'A.north'` 落点
89
+ * 取节点 shape 命名 anchor(center / north / east / north-east 等)
90
+ * @description 不应用 margin——TikZ 语义中 explicit anchor 取视觉边界点不涉及 outer sep;用于 `'A.north'` 落点。
91
+ * shapeDef.anchor 不认识的名字返回 undefined,此处抛 Unknown anchor(列出 shape 名)
88
92
  */
89
- export declare const anchorOf: (layout: NodeLayout, name: RectAnchor) => Position;
93
+ export declare const anchorOf: (layout: NodeLayout, name: string) => Position;
90
94
  /**
91
95
  * 取节点 shape 在指定角度方向的边界点
92
96
  * @description 角度是节点**局部坐标系**下的极角(度数:0°=局部 +x,90°=局部 +y)。layout.rect.rotate 把局部基绕中心旋转,得到世界系下的视觉方向;shape boundaryPoint 内部用 rotate-aware 投影,所以这里把局部 (cos, sin) 经 rect.rotate 旋转后加到中心当作世界系 toward 传入。不应用 margin(同 anchorOf);用于 `'A.30'` 落点
@@ -99,10 +103,11 @@ export declare const angleBoundaryOf: (layout: NodeLayout, angleDeg: number) =>
99
103
  * scope 局部度量),调用方负责后续 `projectLayoutToGlobal` / `applyTransformChain` 投回全局;
100
104
  * 笛卡尔字面量 `Position` 已在 scope 局部度量,行为延续 v0.1。
101
105
  */
102
- export declare const layoutNode: (node: IRNode, measureText: TextMeasurer, nameStack: NameStack, nodeDistance?: number, scopeChain?: ReadonlyArray<Transform>, labelDefault?: IRLabelDefault) => NodeLayout;
106
+ export declare const layoutNode: (node: IRNode, measureText: TextMeasurer, nameStack: NameStack, nodeDistance?: number, scopeChain?: ReadonlyArray<Transform>, labelDefault?: IRLabelDefault, shapes?: Record<string, ShapeDefinition>) => NodeLayout;
103
107
  /**
104
108
  * NodeLayout → Scene primitives
105
- * @description shape 主体按 shape 分发(rect/ellipse/path);text 始终走 TextPrim;有旋转时外层 GroupPrim 用 `rotate(deg cx cy)` 统一包裹(text 必须靠 group 旋转)
109
+ * @description shape 主体走 `shapeDef.emit`(收轴对齐 rect、可出多 primitive);text 始终走 TextPrim
110
+ * 有旋转时外层 GroupPrim 用 `rotate(deg cx cy)` 统一包裹 shape + text(diamond 顶点 / text 都靠 group 旋转)
106
111
  */
107
112
  export declare const emitNodePrimitives: (layout: NodeLayout, round: (n: number) => number) => Array<ScenePrimitive>;
108
113
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,4 @@
1
- import { rect } from "../geometry/rect.js";
2
- import { circle } from "../geometry/circle.js";
3
- import { diamond } from "../geometry/diamond.js";
4
- import { ellipse } from "../geometry/ellipse.js";
1
+ import { BUILTIN_SHAPES } from "../shapes/index.js";
5
2
  import { resolvePosition } from "./position.js";
6
3
  //#region src/compile/node.ts
7
4
  var DEFAULT_FONT_SIZE = 14;
@@ -10,7 +7,6 @@ var DEFAULT_LINE_HEIGHT_FACTOR = 1.2;
10
7
  var DEG_TO_RAD = Math.PI / 180;
11
8
  /** Node label 与 node 边界默认距离(TikZ 默认 0pt 视觉太贴) */
12
9
  var DEFAULT_LABEL_DISTANCE = 12;
13
- var SQRT2 = Math.SQRT2;
14
10
  /** dashed 预设:4 px 实线 + 2 px 间隙循环 */
15
11
  var DASHED_PATTERN = [4, 2];
16
12
  /** dotted 预设:1 px 圆点 + 2 px 间隙 */
@@ -23,61 +19,28 @@ var resolveDashArray = (dashArray, dashed, dotted) => {
23
19
  };
24
20
  /** IR align → 文字对齐锚点(start / middle / end) */
25
21
  var alignToTextAnchor = (a) => a === "left" ? "start" : a === "right" ? "end" : "middle";
26
- /** layout 构造 Rect(带 margin 扩张) */
27
- var rectOf = (layout, marginAdd) => ({
28
- x: layout.rect.x,
29
- y: layout.rect.y,
30
- width: layout.rect.width + 2 * marginAdd,
31
- height: layout.rect.height + 2 * marginAdd,
32
- rotate: layout.rect.rotate
33
- });
34
- /** 从 layout 构造 Circle(radius=外接框边长/2 + margin) */
35
- var circleOf = (layout, marginAdd) => ({
36
- x: layout.rect.x,
37
- y: layout.rect.y,
38
- radius: layout.rect.width / 2 + marginAdd,
39
- rotate: layout.rect.rotate
40
- });
41
- /** 从 layout 构造 Ellipse(rx/ry 各加 margin) */
42
- var ellipseOf = (layout, marginAdd) => ({
43
- x: layout.rect.x,
44
- y: layout.rect.y,
45
- rx: layout.rect.width / 2 + marginAdd,
46
- ry: layout.rect.height / 2 + marginAdd,
47
- rotate: layout.rect.rotate
48
- });
49
- /** 从 layout 构造 Diamond(halfA/halfB 各加 margin) */
50
- var diamondOf = (layout, marginAdd) => ({
51
- x: layout.rect.x,
52
- y: layout.rect.y,
53
- halfA: layout.rect.width / 2 + marginAdd,
54
- halfB: layout.rect.height / 2 + marginAdd,
55
- rotate: layout.rect.rotate
56
- });
22
+ /** Rect 各方向外扩 m(margin generic:所有 shape 都 w+2m, h+2m,由 boundaryPointOf 调用前膨胀) */
23
+ var inflateRect = (r, m) => m === 0 ? r : {
24
+ x: r.x,
25
+ y: r.y,
26
+ width: r.width + 2 * m,
27
+ height: r.height + 2 * m,
28
+ rotate: r.rotate
29
+ };
57
30
  /**
58
31
  * 取节点 shape 在 toward 方向的附着点(path 端点贴边用)
59
- * @description shape 多态调用各自 boundaryPoint;margin > 0 时形状先外扩,让 path 在 border 外停 margin
32
+ * @description shapeDef.boundaryPoint;margin > 0 时先膨胀外接 Rect,让 path 在 border 外停 margin
60
33
  */
61
- var boundaryPointOf = (layout, toward) => {
62
- const m = layout.margin;
63
- switch (layout.shape) {
64
- case "rectangle": return rect.boundaryPoint(rectOf(layout, m), toward);
65
- case "circle": return circle.boundaryPoint(circleOf(layout, m), toward);
66
- case "ellipse": return ellipse.boundaryPoint(ellipseOf(layout, m), toward);
67
- case "diamond": return diamond.boundaryPoint(diamondOf(layout, m), toward);
68
- }
69
- };
34
+ var boundaryPointOf = (layout, toward) => layout.shapeDef.boundaryPoint(inflateRect(layout.rect, layout.margin), toward);
70
35
  /**
71
- * 取节点 shape 命名 anchor(center / north / east / north-east 等 9 个)
72
- * @description 不应用 margin——TikZ 语义中 explicit anchor 取视觉边界点不涉及 outer sep;用于 `'A.north'` 落点
36
+ * 取节点 shape 命名 anchor(center / north / east / north-east 等)
37
+ * @description 不应用 margin——TikZ 语义中 explicit anchor 取视觉边界点不涉及 outer sep;用于 `'A.north'` 落点。
38
+ * shapeDef.anchor 不认识的名字返回 undefined,此处抛 Unknown anchor(列出 shape 名)
73
39
  */
74
40
  var anchorOf = (layout, name) => {
75
- switch (layout.shape) {
76
- case "rectangle": return rect.anchor(rectOf(layout, 0), name);
77
- case "circle": return circle.anchor(circleOf(layout, 0), name);
78
- case "ellipse": return ellipse.anchor(ellipseOf(layout, 0), name);
79
- case "diamond": return diamond.anchor(diamondOf(layout, 0), name);
80
- }
41
+ const p = layout.shapeDef.anchor(layout.rect, name);
42
+ if (p === void 0) throw new Error(`Unknown anchor '${name}' for shape '${layout.shapeName}'`);
43
+ return p;
81
44
  };
82
45
  /** 8 方向 label position → (anchorName, 单位向量);above 视觉上方即 y 减小 */
83
46
  var LABEL_DIRECTION_MAP = {
@@ -140,12 +103,7 @@ var angleBoundaryOf = (layout, angleDeg) => {
140
103
  const cosR = Math.cos(rot);
141
104
  const sinR = Math.sin(rot);
142
105
  const toward = [layout.rect.x + lx * cosR - ly * sinR, layout.rect.y + lx * sinR + ly * cosR];
143
- switch (layout.shape) {
144
- case "rectangle": return rect.boundaryPoint(rectOf(layout, 0), toward);
145
- case "circle": return circle.boundaryPoint(circleOf(layout, 0), toward);
146
- case "ellipse": return ellipse.boundaryPoint(ellipseOf(layout, 0), toward);
147
- case "diamond": return diamond.boundaryPoint(diamondOf(layout, 0), toward);
148
- }
106
+ return layout.shapeDef.boundaryPoint(layout.rect, toward);
149
107
  };
150
108
  /**
151
109
  * IR Node → 内部 NodeLayout
@@ -154,7 +112,10 @@ var angleBoundaryOf = (layout, angleDeg) => {
154
112
  * scope 局部度量),调用方负责后续 `projectLayoutToGlobal` / `applyTransformChain` 投回全局;
155
113
  * 笛卡尔字面量 `Position` 已在 scope 局部度量,行为延续 v0.1。
156
114
  */
157
- var layoutNode = (node, measureText, nameStack, nodeDistance, scopeChain = [], labelDefault) => {
115
+ var layoutNode = (node, measureText, nameStack, nodeDistance, scopeChain = [], labelDefault, shapes = BUILTIN_SHAPES) => {
116
+ const shapeName = node.shape ?? "rectangle";
117
+ const shapeDef = Object.prototype.hasOwnProperty.call(shapes, shapeName) ? shapes[shapeName] : void 0;
118
+ if (!shapeDef) throw new Error(`Unknown shape '${shapeName}'; registered shapes: ${Object.keys(shapes).sort().join(", ")}`);
158
119
  const sx = node.xScale ?? node.scale ?? 1;
159
120
  const sy = node.yScale ?? node.scale ?? 1;
160
121
  const fontScale = Math.min(sx, sy);
@@ -201,29 +162,7 @@ var layoutNode = (node, measureText, nameStack, nodeDistance, scopeChain = [], l
201
162
  const minH = node.minimumHeight ?? node.minimumSize ?? 0;
202
163
  const innerHalfW = Math.max(textWidth / 2 + xSep, xSep, minW / 2);
203
164
  const innerHalfH = Math.max(textHeight / 2 + ySep, ySep, minH / 2);
204
- const shape = node.shape ?? "rectangle";
205
- let boundsHalfW;
206
- let boundsHalfH;
207
- switch (shape) {
208
- case "rectangle":
209
- boundsHalfW = innerHalfW;
210
- boundsHalfH = innerHalfH;
211
- break;
212
- case "circle": {
213
- const r = Math.sqrt(innerHalfW * innerHalfW + innerHalfH * innerHalfH);
214
- boundsHalfW = r;
215
- boundsHalfH = r;
216
- break;
217
- }
218
- case "ellipse":
219
- boundsHalfW = innerHalfW * SQRT2;
220
- boundsHalfH = innerHalfH * SQRT2;
221
- break;
222
- case "diamond":
223
- boundsHalfW = innerHalfW * 2;
224
- boundsHalfH = innerHalfH * 2;
225
- break;
226
- }
165
+ const { halfWidth: boundsHalfW, halfHeight: boundsHalfH } = shapeDef.circumscribe(innerHalfW, innerHalfH);
227
166
  const rotateDeg = node.rotate ?? 0;
228
167
  const center = resolvePosition(node.position, nameStack, nodeDistance, scopeChain);
229
168
  if (!center) throw new Error(`Cannot resolve position for node ${node.id ?? "(unnamed)"}; polar.origin or at.of may reference an undefined node`);
@@ -243,7 +182,8 @@ var layoutNode = (node, measureText, nameStack, nodeDistance, scopeChain = [], l
243
182
  });
244
183
  return {
245
184
  id: node.id,
246
- shape,
185
+ shapeName,
186
+ shapeDef,
247
187
  rect: {
248
188
  x: center[0],
249
189
  y: center[1],
@@ -274,97 +214,28 @@ var layoutNode = (node, measureText, nameStack, nodeDistance, scopeChain = [], l
274
214
  labels
275
215
  };
276
216
  };
277
- /** rectangle RectPrim */
278
- var emitRectShape = (layout, round) => {
279
- const halfW = layout.rect.width / 2;
280
- const halfH = layout.rect.height / 2;
281
- return {
282
- type: "rect",
283
- x: round(layout.rect.x - halfW),
284
- y: round(layout.rect.y - halfH),
285
- width: round(layout.rect.width),
286
- height: round(layout.rect.height),
287
- fill: layout.fill ?? "transparent",
288
- fillOpacity: layout.fillOpacity,
289
- stroke: layout.stroke ?? "currentColor",
290
- strokeOpacity: layout.strokeOpacity,
291
- strokeWidth: layout.strokeWidth ?? 1,
292
- dashPattern: layout.dashPattern,
293
- cornerRadius: layout.roundedCorners,
294
- opacity: layout.opacity
295
- };
296
- };
297
- /** circle/ellipse → EllipsePrim(圆形 rx=ry) */
298
- var emitEllipseShape = (layout, round) => ({
299
- type: "ellipse",
300
- cx: round(layout.rect.x),
301
- cy: round(layout.rect.y),
302
- rx: round(layout.rect.width / 2),
303
- ry: round(layout.rect.height / 2),
304
- fill: layout.fill ?? "transparent",
217
+ /** NodeLayout 收敛 emit 所需的视觉样式子集(ShapeStyle,不含几何 / 文本) */
218
+ var toShapeStyle = (layout) => ({
219
+ fill: layout.fill,
305
220
  fillOpacity: layout.fillOpacity,
306
- stroke: layout.stroke ?? "currentColor",
221
+ stroke: layout.stroke,
307
222
  strokeOpacity: layout.strokeOpacity,
308
- strokeWidth: layout.strokeWidth ?? 1,
223
+ strokeWidth: layout.strokeWidth,
309
224
  dashPattern: layout.dashPattern,
225
+ roundedCorners: layout.roundedCorners,
310
226
  opacity: layout.opacity
311
227
  });
312
- /** diamond → PathPrim(4 顶点 + close 闭合) */
313
- var emitDiamondShape = (layout, round) => {
314
- const diam = diamondOf(layout, 0);
315
- const e = diamond.anchor(diam, "east");
316
- const n = diamond.anchor(diam, "north");
317
- const w = diamond.anchor(diam, "west");
318
- const s = diamond.anchor(diam, "south");
319
- return {
320
- type: "path",
321
- commands: [
322
- {
323
- kind: "move",
324
- to: [round(e[0]), round(e[1])]
325
- },
326
- {
327
- kind: "line",
328
- to: [round(n[0]), round(n[1])]
329
- },
330
- {
331
- kind: "line",
332
- to: [round(w[0]), round(w[1])]
333
- },
334
- {
335
- kind: "line",
336
- to: [round(s[0]), round(s[1])]
337
- },
338
- { kind: "close" }
339
- ],
340
- fill: layout.fill ?? "transparent",
341
- fillOpacity: layout.fillOpacity,
342
- stroke: layout.stroke ?? "currentColor",
343
- strokeOpacity: layout.strokeOpacity,
344
- strokeWidth: layout.strokeWidth ?? 1,
345
- dashPattern: layout.dashPattern,
346
- opacity: layout.opacity
347
- };
348
- };
349
228
  /**
350
229
  * NodeLayout → Scene primitives
351
- * @description shape 主体按 shape 分发(rect/ellipse/path);text 始终走 TextPrim;有旋转时外层 GroupPrim 用 `rotate(deg cx cy)` 统一包裹(text 必须靠 group 旋转)
230
+ * @description shape 主体走 `shapeDef.emit`(收轴对齐 rect、可出多 primitive);text 始终走 TextPrim
231
+ * 有旋转时外层 GroupPrim 用 `rotate(deg cx cy)` 统一包裹 shape + text(diamond 顶点 / text 都靠 group 旋转)
352
232
  */
353
233
  var emitNodePrimitives = (layout, round) => {
354
- let shapePrim;
355
- switch (layout.shape) {
356
- case "rectangle":
357
- shapePrim = emitRectShape(layout, round);
358
- break;
359
- case "circle":
360
- case "ellipse":
361
- shapePrim = emitEllipseShape(layout, round);
362
- break;
363
- case "diamond":
364
- shapePrim = emitDiamondShape(unrotated(layout), round);
365
- break;
366
- }
367
- const inner = [shapePrim];
234
+ const axisAlignedRect = {
235
+ ...layout.rect,
236
+ rotate: 0
237
+ };
238
+ const inner = [...layout.shapeDef.emit(axisAlignedRect, toShapeStyle(layout), round)];
368
239
  if (layout.lines) {
369
240
  const halfBlockW = layout.textWidth / 2;
370
241
  const xOffset = layout.align === "start" ? -halfBlockW : layout.align === "end" ? halfBlockW : 0;
@@ -418,13 +289,5 @@ var emitNodePrimitives = (layout, round) => {
418
289
  children: inner
419
290
  }];
420
291
  };
421
- /** layout 的"未旋转"副本,让 diamond 顶点先按未旋转算,外层 group 统一旋转 */
422
- var unrotated = (layout) => ({
423
- ...layout,
424
- rect: {
425
- ...layout.rect,
426
- rotate: 0
427
- }
428
- });
429
292
  //#endregion
430
293
  export { anchorOf, angleBoundaryOf, boundaryPointOf, emitNodePrimitives, layoutNode };
@@ -1 +1 @@
1
- {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/compile/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,UAAU,EACV,WAAW,EAEZ,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGzC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,YAAY,aAAa,CAAC,WAAW,CAAC,EACtC,WAAW,SAAS,EACpB,eAAe,MAAM,KACpB,KAAK,CAAC,SAAS,CAAC,GAAG,IAiDrB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,UAAU,EACjB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UAyBF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UAgCF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UAuBF,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,SAAS,aAAa,CAAC,UAAU,CAAC,KACjC,gBAAgB,GAAG,IA2BrB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,IAAI,MAAM,EACV,MAAM,gBAAgB,GAAG,IAAI,EAC7B,gBAAgB,UAAU,KACzB,UAeF,CAAC"}
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/compile/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,UAAU,EACV,WAAW,EAEZ,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGzC;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,YAAY,aAAa,CAAC,WAAW,CAAC,EACtC,WAAW,SAAS,EACpB,eAAe,MAAM,KACpB,KAAK,CAAC,SAAS,CAAC,GAAG,IAiDrB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,UAAU,EACjB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UAyBF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UAgCF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UAuBF,CAAC;AAEF,8EAA8E;AAC9E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAClC,SAAS,aAAa,CAAC,UAAU,CAAC,KACjC,gBAAgB,GAAG,IA2BrB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,IAAI,MAAM,EACV,MAAM,gBAAgB,GAAG,IAAI,EAC7B,gBAAgB,UAAU,KACzB,UAgBF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { rect } from "../geometry/rect.js";
2
+ import { BUILTIN_SHAPES } from "../shapes/index.js";
2
3
  import { resolvePosition } from "./position.js";
3
4
  //#region src/compile/scope.ts
4
5
  /**
@@ -235,7 +236,8 @@ var registerScopeAsLayout = (id, bbox, fallbackOrigin) => {
235
236
  };
236
237
  return {
237
238
  id,
238
- shape: "rectangle",
239
+ shapeName: "rectangle",
240
+ shapeDef: BUILTIN_SHAPES.rectangle,
239
241
  rect: {
240
242
  x: box.x,
241
243
  y: box.y,
@@ -3,7 +3,7 @@
3
3
  * @description 任何 framework adapter(@retikz/react、@retikz/vue、@retikz/canvas、@retikz/ssr)只能 import 本文件导出内容,不准走子路径。本包零 React/零 DOM 依赖
4
4
  */
5
5
  export { PositionSchema, PolarPositionSchema, AtPositionSchema, OffsetPositionSchema, AT_DIRECTIONS, TargetSchema, RelativeTargetSchema, RelativeAccumulateTargetSchema, MoveStepSchema, LineStepSchema, FoldStepSchema, CycleStepSchema, CurveStepSchema, CubicStepSchema, BendStepSchema, ArcStepSchema, CirclePathStepSchema, EllipsePathStepSchema, ControlPointSchema, StepLabelSchema, StepSchema, NodeSchema, NodeLabelSchema, CoordinateSchema, FontSchema, TextBlockSchema, LineSpecSchema, PathSchema, ArrowDetailSchema, ArrowEndDetailSchema, ScopeSchema, NodeDefaultSchema, PathDefaultSchema, LabelDefaultSchema, ArrowDefaultSchema, TransformSchema, ChildSchema, SceneSchema, CURRENT_IR_VERSION, } from './ir';
6
- export type { IRPosition, IRAtPosition, IROffsetPosition, AtDirection, IRTarget, IRRelativeTarget, IRRelativeAccumulateTarget, IRMoveStep, IRLineStep, IRFoldStep, IRCycleStep, IRCurveStep, IRCubicStep, IRBendStep, IRArcStep, IRCirclePathStep, IREllipsePathStep, IRControlPoint, IRStepLabel, IRStep, IRNode, IRNodeLabel, IRCoordinate, IRFont, IRLineSpec, IRTextBlock, IRPath, IRScope, IRNodeDefault, IRPathDefault, IRLabelDefault, IRArrowDefault, StyleChannel, IRTransform, IRTranslateTransform, IRPolarTranslateTransform, IRAtTranslateTransform, IROffsetTranslateTransform, IRRotateTransform, IRScaleTransform, IRChild, IR, ArrowShape, IRArrowDetail, IRArrowEndDetail, NodeShape, NodeTextAlign, } from './ir';
6
+ export type { IRPosition, IRAtPosition, IROffsetPosition, AtDirection, IRTarget, IRRelativeTarget, IRRelativeAccumulateTarget, IRMoveStep, IRLineStep, IRFoldStep, IRCycleStep, IRCurveStep, IRCubicStep, IRBendStep, IRArcStep, IRCirclePathStep, IREllipsePathStep, IRControlPoint, IRStepLabel, IRStep, IRNode, IRNodeLabel, IRCoordinate, IRFont, IRLineSpec, IRTextBlock, IRPath, IRScope, IRNodeDefault, IRPathDefault, IRLabelDefault, IRArrowDefault, StyleChannel, IRTransform, IRTranslateTransform, IRPolarTranslateTransform, IRAtTranslateTransform, IROffsetTranslateTransform, IRRotateTransform, IRScaleTransform, IRChild, IR, ArrowShape, IRArrowDetail, IRArrowEndDetail, NodeShape, BuiltinShapeName, NodeTextAlign, } from './ir';
7
7
  export { ARROW_SHAPES, DEFAULT_ARROW_SHAPE, HOLLOW_ARROW_SHAPES, ARROW_MARKER_DEFAULT_SIZE, ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH, NODE_SHAPES, NODE_TEXT_ALIGNS, } from './ir';
8
8
  export type { ScenePrimitive, RectPrim, EllipsePrim, TextPrim, TextLine, PathPrim, PathCommand,
9
9
  /** 7 个 named PathCommand 分支(便于 wrapper / Pick<>) */
@@ -16,5 +16,7 @@ export type { WayItem, WayDSL, WayCycle, WayVia, WayRelativeItem, WayLabel, WayL
16
16
  export { parseWay, DrawWay, parseTargetSugar } from './parsers';
17
17
  export type { Position, Rect, RectAnchor, Circle, Ellipse, Diamond, PolarPosition, } from './geometry';
18
18
  export { point, rect, circle, ellipse, diamond, RECT_ANCHORS, polar } from './geometry';
19
+ export type { ShapeDefinition, ShapeStyle } from './shapes';
20
+ export { BUILTIN_SHAPES, worldToLocal, localToWorld } from './shapes';
19
21
  export type { ValueOf, AssertEqual } from './types';
20
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,8BAA8B,EAC9B,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,MAAM,CAAC;AACd,YAAY,EACV,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,0BAA0B,EAC1B,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,MAAM,EACN,MAAM,EACN,WAAW,EACX,YAAY,EACZ,MAAM,EACN,UAAU,EACV,WAAW,EACX,MAAM,EACN,OAAO,EACP,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,OAAO,EACP,EAAE,EACF,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,aAAa,GACd,MAAM,MAAM,CAAC;AACd,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,sCAAsC,EACtC,WAAW,EACX,gBAAgB,GACjB,MAAM,MAAM,CAAC;AAGd,YAAY,EACV,cAAc,EACd,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW;AACX,oDAAoD;AACpD,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,SAAS;AACT,6BAA6B;AAC7B,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,MAAM,EACN,KAAK,GACN,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG5E,YAAY,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,eAAe,EACf,QAAQ,EACR,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAIhE,YAAY,EACV,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxF,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,8BAA8B,EAC9B,cAAc,EACd,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,MAAM,CAAC;AACd,YAAY,EACV,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,0BAA0B,EAC1B,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,MAAM,EACN,MAAM,EACN,WAAW,EACX,YAAY,EACZ,MAAM,EACN,UAAU,EACV,WAAW,EACX,MAAM,EACN,OAAO,EACP,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,iBAAiB,EACjB,gBAAgB,EAChB,OAAO,EACP,EAAE,EACF,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,aAAa,GACd,MAAM,MAAM,CAAC;AACd,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,yBAAyB,EACzB,sCAAsC,EACtC,WAAW,EACX,gBAAgB,GACjB,MAAM,MAAM,CAAC;AAGd,YAAY,EACV,cAAc,EACd,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW;AACX,oDAAoD;AACpD,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,SAAS;AACT,6BAA6B;AAC7B,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,MAAM,EACN,KAAK,GACN,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG5E,YAAY,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,eAAe,EACf,QAAQ,EACR,UAAU,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAIhE,YAAY,EACV,QAAQ,EACR,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxF,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGtE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC"}
package/dist/es/index.js CHANGED
@@ -13,10 +13,12 @@ import { CoordinateSchema } from "./ir/coordinate.js";
13
13
  import { TransformSchema } from "./ir/transform.js";
14
14
  import { ArrowDefaultSchema, LabelDefaultSchema, NodeDefaultSchema, PathDefaultSchema, ScopeSchema } from "./ir/scope.js";
15
15
  import { CURRENT_IR_VERSION, ChildSchema, SceneSchema } from "./ir/scene.js";
16
+ import { localToWorld, worldToLocal } from "./geometry/_transform.js";
16
17
  import { RECT_ANCHORS, rect } from "./geometry/rect.js";
17
18
  import { circle } from "./geometry/circle.js";
18
- import { diamond } from "./geometry/diamond.js";
19
19
  import { ellipse } from "./geometry/ellipse.js";
20
+ import { diamond } from "./geometry/diamond.js";
21
+ import { BUILTIN_SHAPES } from "./shapes/index.js";
20
22
  import { fallbackMeasurer } from "./compile/text-metrics.js";
21
23
  import { computeLayout } from "./compile/layout.js";
22
24
  import { compileToScene } from "./compile/compile.js";
@@ -24,4 +26,4 @@ import { parseTargetSugar } from "./parsers/parseTargetSugar.js";
24
26
  import { DrawWay, parseWay } from "./parsers/parseWay.js";
25
27
  import { polar } from "./geometry/polar.js";
26
28
  import { point } from "./geometry/point.js";
27
- export { ARROW_MARKER_DEFAULT_SIZE, ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH, ARROW_SHAPES, AT_DIRECTIONS, ArcStepSchema, ArrowDefaultSchema, ArrowDetailSchema, ArrowEndDetailSchema, AtPositionSchema, BendStepSchema, CURRENT_IR_VERSION, ChildSchema, CirclePathStepSchema, ControlPointSchema, CoordinateSchema, CubicStepSchema, CurveStepSchema, CycleStepSchema, DEFAULT_ARROW_SHAPE, DrawWay, EllipsePathStepSchema, FoldStepSchema, FontSchema, HOLLOW_ARROW_SHAPES, LabelDefaultSchema, LineSpecSchema, LineStepSchema, MoveStepSchema, NODE_SHAPES, NODE_TEXT_ALIGNS, NodeDefaultSchema, NodeLabelSchema, NodeSchema, OffsetPositionSchema, PathDefaultSchema, PathSchema, PolarPositionSchema, PositionSchema, RECT_ANCHORS, RelativeAccumulateTargetSchema, RelativeTargetSchema, SceneSchema, ScopeSchema, StepLabelSchema, StepSchema, TargetSchema, TextBlockSchema, TransformSchema, circle, compileToScene, computeLayout, diamond, ellipse, fallbackMeasurer, parseTargetSugar, parseWay, point, polar, rect };
29
+ export { ARROW_MARKER_DEFAULT_SIZE, ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH, ARROW_SHAPES, AT_DIRECTIONS, ArcStepSchema, ArrowDefaultSchema, ArrowDetailSchema, ArrowEndDetailSchema, AtPositionSchema, BUILTIN_SHAPES, BendStepSchema, CURRENT_IR_VERSION, ChildSchema, CirclePathStepSchema, ControlPointSchema, CoordinateSchema, CubicStepSchema, CurveStepSchema, CycleStepSchema, DEFAULT_ARROW_SHAPE, DrawWay, EllipsePathStepSchema, FoldStepSchema, FontSchema, HOLLOW_ARROW_SHAPES, LabelDefaultSchema, LineSpecSchema, LineStepSchema, MoveStepSchema, NODE_SHAPES, NODE_TEXT_ALIGNS, NodeDefaultSchema, NodeLabelSchema, NodeSchema, OffsetPositionSchema, PathDefaultSchema, PathSchema, PolarPositionSchema, PositionSchema, RECT_ANCHORS, RelativeAccumulateTargetSchema, RelativeTargetSchema, SceneSchema, ScopeSchema, StepLabelSchema, StepSchema, TargetSchema, TextBlockSchema, TransformSchema, circle, compileToScene, computeLayout, diamond, ellipse, fallbackMeasurer, localToWorld, parseTargetSugar, parseWay, point, polar, rect, worldToLocal };
@@ -10,8 +10,17 @@ export declare const NODE_SHAPES: {
10
10
  readonly ellipse: "ellipse";
11
11
  readonly diamond: "diamond";
12
12
  };
13
- /** 节点形状字面量类型 */
14
- export type NodeShape = ValueOf<typeof NODE_SHAPES>;
13
+ /**
14
+ * 内置 4 shape 名联合
15
+ * @description `BUILTIN_SHAPES` 的 Record key(保穷尽性约束,不随 `NodeShape` 开放而退化为 `string`)
16
+ */
17
+ export type BuiltinShapeName = ValueOf<typeof NODE_SHAPES>;
18
+ /**
19
+ * 节点形状名:开放字符串
20
+ * @description 内置 `BuiltinShapeName`,或经 `CompileOptions.shapes` 注册的扩展 shape 名;
21
+ * `& {}` 让 IDE 仍对内置 4 名自动补全,同时接受任意非空字符串
22
+ */
23
+ export type NodeShape = BuiltinShapeName | (string & {});
15
24
  /** 节点文本对齐(TikZ `align=` 同义) */
16
25
  export declare const NODE_TEXT_ALIGNS: {
17
26
  readonly left: "left";
@@ -84,12 +93,7 @@ export type IRNodeLabel = z.infer<typeof NodeLabelSchema>;
84
93
  export declare const NodeSchema: z.ZodObject<{
85
94
  type: z.ZodLiteral<"node">;
86
95
  id: z.ZodOptional<z.ZodString>;
87
- shape: z.ZodOptional<z.ZodNativeEnum<{
88
- readonly rectangle: "rectangle";
89
- readonly circle: "circle";
90
- readonly ellipse: "ellipse";
91
- readonly diamond: "diamond";
92
- }>>;
96
+ shape: z.ZodOptional<z.ZodString>;
93
97
  position: z.ZodUnion<[z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>, z.ZodType<import('./position').PolarPosition, z.ZodTypeDef, import('./position').PolarPosition>, z.ZodObject<{
94
98
  direction: z.ZodNativeEnum<{
95
99
  readonly above: "above";
@@ -348,7 +352,7 @@ export declare const NodeSchema: z.ZodObject<{
348
352
  weight?: number | "normal" | "bold" | undefined;
349
353
  style?: "normal" | "italic" | "oblique" | undefined;
350
354
  } | undefined;
351
- shape?: "diamond" | "circle" | "rectangle" | "ellipse" | undefined;
355
+ shape?: string | undefined;
352
356
  scale?: number | undefined;
353
357
  color?: string | undefined;
354
358
  textColor?: string | undefined;
@@ -428,7 +432,7 @@ export declare const NodeSchema: z.ZodObject<{
428
432
  weight?: number | "normal" | "bold" | undefined;
429
433
  style?: "normal" | "italic" | "oblique" | undefined;
430
434
  } | undefined;
431
- shape?: "diamond" | "circle" | "rectangle" | "ellipse" | undefined;
435
+ shape?: string | undefined;
432
436
  scale?: number | undefined;
433
437
  color?: string | undefined;
434
438
  textColor?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/ir/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAKxC;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX,gBAAgB;AAChB,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC;AAEpD,+BAA+B;AAC/B,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCzB,CAAC;AAEJ,uBAAuB;AACvB,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE1D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsLpB,CAAC;AAEJ,sCAAsC;AACtC,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/ir/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAKxC;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC;AAE3D;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAEzD,+BAA+B;AAC/B,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCzB,CAAC;AAEJ,uBAAuB;AACvB,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE1D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuLpB,CAAC;AAEJ,sCAAsC;AACtC,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC"}
@@ -37,7 +37,7 @@ var NodeLabelSchema = z.object({
37
37
  var NodeSchema = z.object({
38
38
  type: z.literal("node").describe("Discriminator marking this child as a node"),
39
39
  id: z.string().min(1).optional().describe("Optional unique id; required if any path needs to reference this node by string"),
40
- shape: z.nativeEnum(NODE_SHAPES).optional().describe("Node visual shape; defaults to `rectangle`. The boundary fully contains text + padding (circumscribed for circle / ellipse / diamond)."),
40
+ shape: z.string().min(1).optional().describe("Node visual shape name; built-in `rectangle` / `circle` / `ellipse` / `diamond`, or an extension shape registered via `CompileOptions.shapes`. Any non-empty string passes schema validation; unregistered names are rejected at compile time. Defaults to `rectangle`. The boundary fully contains text + padding (circumscribed for circle / ellipse / diamond)."),
41
41
  position: z.union([
42
42
  PositionSchema,
43
43
  PolarPositionSchema,