@retikz/core 0.3.0-beta.1 → 0.3.0-rc.1
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.
- package/LICENSE +21 -21
- package/README.md +41 -41
- package/dist/es/arrows/index.d.ts.map +1 -1
- package/dist/es/arrows/index.js +1 -1
- package/dist/es/compile/anchor-cache.js +3 -3
- package/dist/es/compile/compile.d.ts.map +1 -1
- package/dist/es/compile/compile.js +13 -10
- package/dist/es/compile/constant.d.ts +1 -3
- package/dist/es/compile/constant.d.ts.map +1 -1
- package/dist/es/compile/constant.js +2 -4
- package/dist/es/compile/node.d.ts +3 -3
- package/dist/es/compile/node.d.ts.map +1 -1
- package/dist/es/compile/node.js +19 -9
- package/dist/es/compile/path/index.d.ts.map +1 -1
- package/dist/es/compile/path/index.js +40 -10
- package/dist/es/compile/path/label.d.ts.map +1 -1
- package/dist/es/compile/path/label.js +8 -4
- package/dist/es/compile/scope.d.ts +1 -1
- package/dist/es/compile/scope.d.ts.map +1 -1
- package/dist/es/compile/scope.js +17 -5
- package/dist/es/compile/text-metrics.d.ts +1 -1
- package/dist/es/compile/text-metrics.js +2 -2
- package/dist/es/geometry/bend.js +1 -1
- package/dist/es/geometry/contour.d.ts +5 -0
- package/dist/es/geometry/contour.d.ts.map +1 -1
- package/dist/es/geometry/contour.js +5 -3
- package/dist/es/geometry/diamond.d.ts +7 -1
- package/dist/es/geometry/diamond.d.ts.map +1 -1
- package/dist/es/geometry/diamond.js +9 -1
- package/dist/es/geometry/ellipse.d.ts.map +1 -1
- package/dist/es/geometry/ellipse.js +2 -0
- package/dist/es/geometry/index.d.ts +4 -0
- package/dist/es/geometry/index.d.ts.map +1 -1
- package/dist/es/geometry/segment.d.ts +7 -0
- package/dist/es/geometry/segment.d.ts.map +1 -1
- package/dist/es/geometry/segment.js +24 -1
- package/dist/es/index.d.ts +4 -4
- package/dist/es/index.d.ts.map +1 -1
- package/dist/es/index.js +4 -3
- package/dist/es/ir/animation.d.ts +20 -120
- package/dist/es/ir/animation.d.ts.map +1 -1
- package/dist/es/ir/animation.js +6 -6
- package/dist/es/ir/boundary.d.ts +3 -9
- package/dist/es/ir/boundary.d.ts.map +1 -1
- package/dist/es/ir/clip.d.ts +6 -46
- package/dist/es/ir/clip.d.ts.map +1 -1
- package/dist/es/ir/composite.d.ts +2 -14
- package/dist/es/ir/composite.d.ts.map +1 -1
- package/dist/es/ir/coordinate.d.ts +6 -42
- package/dist/es/ir/coordinate.d.ts.map +1 -1
- package/dist/es/ir/coordinate.js +1 -1
- package/dist/es/ir/font.d.ts +10 -13
- package/dist/es/ir/font.d.ts.map +1 -1
- package/dist/es/ir/json.d.ts +1 -1
- package/dist/es/ir/json.d.ts.map +1 -1
- package/dist/es/ir/json.js +1 -1
- package/dist/es/ir/node.d.ts +123 -770
- package/dist/es/ir/node.d.ts.map +1 -1
- package/dist/es/ir/node.js +2 -2
- package/dist/es/ir/paint.d.ts +13 -91
- package/dist/es/ir/paint.d.ts.map +1 -1
- package/dist/es/ir/path/arrow.d.ts +4 -117
- package/dist/es/ir/path/arrow.d.ts.map +1 -1
- package/dist/es/ir/path/path.d.ts +511 -3798
- package/dist/es/ir/path/path.d.ts.map +1 -1
- package/dist/es/ir/path/path.js +2 -2
- package/dist/es/ir/path/step.d.ts +917 -4374
- package/dist/es/ir/path/step.d.ts.map +1 -1
- package/dist/es/ir/path/step.js +7 -7
- package/dist/es/ir/path/target.d.ts +40 -121
- package/dist/es/ir/path/target.d.ts.map +1 -1
- package/dist/es/ir/position/at-position.d.ts +2 -10
- package/dist/es/ir/position/at-position.d.ts.map +1 -1
- package/dist/es/ir/position/at-position.js +1 -1
- package/dist/es/ir/position/offset-position.d.ts +2 -8
- package/dist/es/ir/position/offset-position.d.ts.map +1 -1
- package/dist/es/ir/scene.d.ts +17 -181
- package/dist/es/ir/scene.d.ts.map +1 -1
- package/dist/es/ir/scope.d.ts +283 -8761
- package/dist/es/ir/scope.d.ts.map +1 -1
- package/dist/es/ir/scope.js +5 -2
- package/dist/es/ir/shape.d.ts +2 -8
- package/dist/es/ir/shape.d.ts.map +1 -1
- package/dist/es/ir/text.d.ts +24 -70
- package/dist/es/ir/text.d.ts.map +1 -1
- package/dist/es/ir/transform.d.ts +23 -147
- package/dist/es/ir/transform.d.ts.map +1 -1
- package/dist/es/ir/transform.js +3 -3
- package/dist/es/parsers/way.d.ts +1 -1
- package/dist/es/parsers/way.js +1 -1
- package/dist/es/primitive/marker.d.ts +6 -6
- package/dist/es/primitive/marker.d.ts.map +1 -1
- package/dist/es/shapes/arc.d.ts.map +1 -1
- package/dist/es/shapes/arc.js +23 -4
- package/dist/es/shapes/rectangle.js +1 -1
- package/dist/es/shapes/shared.d.ts +3 -2
- package/dist/es/shapes/shared.d.ts.map +1 -1
- package/dist/es/shapes/shared.js +5 -3
- package/dist/es/shapes/star.d.ts.map +1 -1
- package/dist/es/shapes/star.js +2 -1
- package/dist/es/shapes/types.d.ts +10 -3
- package/dist/es/shapes/types.d.ts.map +1 -1
- package/dist/es/types.d.ts +1 -1
- package/dist/lib/arrows/index.cjs +1 -1
- package/dist/lib/arrows/index.d.ts.map +1 -1
- package/dist/lib/compile/anchor-cache.cjs +3 -3
- package/dist/lib/compile/compile.cjs +13 -10
- package/dist/lib/compile/compile.d.ts.map +1 -1
- package/dist/lib/compile/constant.cjs +2 -4
- package/dist/lib/compile/constant.d.ts +1 -3
- package/dist/lib/compile/constant.d.ts.map +1 -1
- package/dist/lib/compile/node.cjs +19 -9
- package/dist/lib/compile/node.d.ts +3 -3
- package/dist/lib/compile/node.d.ts.map +1 -1
- package/dist/lib/compile/path/index.cjs +39 -9
- package/dist/lib/compile/path/index.d.ts.map +1 -1
- package/dist/lib/compile/path/label.cjs +8 -4
- package/dist/lib/compile/path/label.d.ts.map +1 -1
- package/dist/lib/compile/scope.cjs +17 -5
- package/dist/lib/compile/scope.d.ts +1 -1
- package/dist/lib/compile/scope.d.ts.map +1 -1
- package/dist/lib/compile/text-metrics.cjs +2 -2
- package/dist/lib/compile/text-metrics.d.ts +1 -1
- package/dist/lib/geometry/bend.cjs +1 -1
- package/dist/lib/geometry/contour.cjs +5 -3
- package/dist/lib/geometry/contour.d.ts +5 -0
- package/dist/lib/geometry/contour.d.ts.map +1 -1
- package/dist/lib/geometry/diamond.cjs +9 -1
- package/dist/lib/geometry/diamond.d.ts +7 -1
- package/dist/lib/geometry/diamond.d.ts.map +1 -1
- package/dist/lib/geometry/ellipse.cjs +2 -0
- package/dist/lib/geometry/ellipse.d.ts.map +1 -1
- package/dist/lib/geometry/index.d.ts +4 -0
- package/dist/lib/geometry/index.d.ts.map +1 -1
- package/dist/lib/geometry/segment.cjs +24 -0
- package/dist/lib/geometry/segment.d.ts +7 -0
- package/dist/lib/geometry/segment.d.ts.map +1 -1
- package/dist/lib/index.cjs +6 -0
- package/dist/lib/index.d.ts +4 -4
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/ir/animation.cjs +6 -6
- package/dist/lib/ir/animation.d.ts +20 -120
- package/dist/lib/ir/animation.d.ts.map +1 -1
- package/dist/lib/ir/boundary.d.ts +3 -9
- package/dist/lib/ir/boundary.d.ts.map +1 -1
- package/dist/lib/ir/clip.d.ts +6 -46
- package/dist/lib/ir/clip.d.ts.map +1 -1
- package/dist/lib/ir/composite.d.ts +2 -14
- package/dist/lib/ir/composite.d.ts.map +1 -1
- package/dist/lib/ir/coordinate.cjs +1 -1
- package/dist/lib/ir/coordinate.d.ts +6 -42
- package/dist/lib/ir/coordinate.d.ts.map +1 -1
- package/dist/lib/ir/font.d.ts +10 -13
- package/dist/lib/ir/font.d.ts.map +1 -1
- package/dist/lib/ir/json.cjs +1 -1
- package/dist/lib/ir/json.d.ts +1 -1
- package/dist/lib/ir/json.d.ts.map +1 -1
- package/dist/lib/ir/node.cjs +2 -2
- package/dist/lib/ir/node.d.ts +123 -770
- package/dist/lib/ir/node.d.ts.map +1 -1
- package/dist/lib/ir/paint.d.ts +13 -91
- package/dist/lib/ir/paint.d.ts.map +1 -1
- package/dist/lib/ir/path/arrow.d.ts +4 -117
- package/dist/lib/ir/path/arrow.d.ts.map +1 -1
- package/dist/lib/ir/path/path.cjs +3 -1
- package/dist/lib/ir/path/path.d.ts +511 -3798
- package/dist/lib/ir/path/path.d.ts.map +1 -1
- package/dist/lib/ir/path/step.cjs +7 -7
- package/dist/lib/ir/path/step.d.ts +917 -4374
- package/dist/lib/ir/path/step.d.ts.map +1 -1
- package/dist/lib/ir/path/target.d.ts +40 -121
- package/dist/lib/ir/path/target.d.ts.map +1 -1
- package/dist/lib/ir/position/at-position.cjs +1 -1
- package/dist/lib/ir/position/at-position.d.ts +2 -10
- package/dist/lib/ir/position/at-position.d.ts.map +1 -1
- package/dist/lib/ir/position/offset-position.d.ts +2 -8
- package/dist/lib/ir/position/offset-position.d.ts.map +1 -1
- package/dist/lib/ir/scene.d.ts +17 -181
- package/dist/lib/ir/scene.d.ts.map +1 -1
- package/dist/lib/ir/scope.cjs +5 -2
- package/dist/lib/ir/scope.d.ts +283 -8761
- package/dist/lib/ir/scope.d.ts.map +1 -1
- package/dist/lib/ir/shape.d.ts +2 -8
- package/dist/lib/ir/shape.d.ts.map +1 -1
- package/dist/lib/ir/text.d.ts +24 -70
- package/dist/lib/ir/text.d.ts.map +1 -1
- package/dist/lib/ir/transform.cjs +3 -3
- package/dist/lib/ir/transform.d.ts +23 -147
- package/dist/lib/ir/transform.d.ts.map +1 -1
- package/dist/lib/parsers/way.cjs +1 -1
- package/dist/lib/parsers/way.d.ts +1 -1
- package/dist/lib/primitive/marker.d.ts +6 -6
- package/dist/lib/primitive/marker.d.ts.map +1 -1
- package/dist/lib/shapes/arc.cjs +22 -3
- package/dist/lib/shapes/arc.d.ts.map +1 -1
- package/dist/lib/shapes/rectangle.cjs +1 -1
- package/dist/lib/shapes/shared.cjs +5 -3
- package/dist/lib/shapes/shared.d.ts +3 -2
- package/dist/lib/shapes/shared.d.ts.map +1 -1
- package/dist/lib/shapes/star.cjs +2 -1
- package/dist/lib/shapes/star.d.ts.map +1 -1
- package/dist/lib/shapes/types.d.ts +10 -3
- package/dist/lib/shapes/types.d.ts.map +1 -1
- package/dist/lib/types.d.ts +1 -1
- package/package.json +2 -2
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2024 pionpill
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 pionpill
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
# @retikz/core
|
|
2
|
-
|
|
3
|
-
Framework-agnostic core of [retikz](https://pionpill.github.io/retikz/) — a TikZ-inspired diagramming library. Provides the zod-typed **IR**, the **`compileToScene`** compiler, pure **parsers**, geometry helpers, and the shape / arrow / pattern / path-generator registries.
|
|
4
|
-
|
|
5
|
-
零框架核心:retikz 的中间表示(IR)、`compileToScene` 编译器、纯解析器、几何工具与形状 / 箭头 / 图案 / 路径生成器注册面。**零 React、零 DOM**,运行时依赖只有 `zod`,IR 100% 可 JSON 序列化。
|
|
6
|
-
|
|
7
|
-
## Install
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
pnpm add @retikz/core
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Usage
|
|
14
|
-
|
|
15
|
-
`@retikz/core` is renderer-agnostic: it turns an IR into a serializable `Scene`. A backend (`@retikz/render`) or runtime (`@retikz/react` / `@retikz/vanilla`) then renders that Scene.
|
|
16
|
-
|
|
17
|
-
```ts
|
|
18
|
-
import { compileToScene } from '@retikz/core';
|
|
19
|
-
|
|
20
|
-
const scene = compileToScene(ir);
|
|
21
|
-
// optional: compileToScene(ir, { measureText, shapes, arrows, padding, ... })
|
|
22
|
-
// hand `scene` to @retikz/render/svg, @retikz/render/canvas, or a runtime
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Most users consume core indirectly through [`@retikz/react`](https://www.npmjs.com/package/@retikz/react) or [`@retikz/vanilla`](https://www.npmjs.com/package/@retikz/vanilla). Use core directly when you build IR programmatically, persist/transport scenes, or write a custom renderer.
|
|
26
|
-
|
|
27
|
-
## Exports
|
|
28
|
-
|
|
29
|
-
- `compileToScene` / `computeLayout` / `fallbackMeasurer` — IR → `Scene`
|
|
30
|
-
- IR & `Scene` zod schemas + inferred types
|
|
31
|
-
- `parseWay` / `parseNodeTarget` / `parseTargetSugar` — pure parsers
|
|
32
|
-
- `point` / `rect` / `circle` / `ellipse` / `diamond` / `polar` — geometry
|
|
33
|
-
- `BUILTIN_SHAPES` / `BUILTIN_ARROWS` / `BUILTIN_PATTERNS` + `ShapeDefinition` / `ArrowDefinition` / `PatternDefinition` / `definePathGenerator` — registries
|
|
34
|
-
|
|
35
|
-
## Docs
|
|
36
|
-
|
|
37
|
-
<https://pionpill.github.io/retikz/>
|
|
38
|
-
|
|
39
|
-
## License
|
|
40
|
-
|
|
41
|
-
MIT
|
|
1
|
+
# @retikz/core
|
|
2
|
+
|
|
3
|
+
Framework-agnostic core of [retikz](https://pionpill.github.io/retikz/) — a TikZ-inspired diagramming library. Provides the zod-typed **IR**, the **`compileToScene`** compiler, pure **parsers**, geometry helpers, and the shape / arrow / pattern / path-generator registries.
|
|
4
|
+
|
|
5
|
+
零框架核心:retikz 的中间表示(IR)、`compileToScene` 编译器、纯解析器、几何工具与形状 / 箭头 / 图案 / 路径生成器注册面。**零 React、零 DOM**,运行时依赖只有 `zod`,IR 100% 可 JSON 序列化。
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @retikz/core
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
`@retikz/core` is renderer-agnostic: it turns an IR into a serializable `Scene`. A backend (`@retikz/render`) or runtime (`@retikz/react` / `@retikz/vanilla`) then renders that Scene.
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { compileToScene } from '@retikz/core';
|
|
19
|
+
|
|
20
|
+
const scene = compileToScene(ir);
|
|
21
|
+
// optional: compileToScene(ir, { measureText, shapes, arrows, padding, ... })
|
|
22
|
+
// hand `scene` to @retikz/render/svg, @retikz/render/canvas, or a runtime
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Most users consume core indirectly through [`@retikz/react`](https://www.npmjs.com/package/@retikz/react) or [`@retikz/vanilla`](https://www.npmjs.com/package/@retikz/vanilla). Use core directly when you build IR programmatically, persist/transport scenes, or write a custom renderer.
|
|
26
|
+
|
|
27
|
+
## Exports
|
|
28
|
+
|
|
29
|
+
- `compileToScene` / `computeLayout` / `fallbackMeasurer` — IR → `Scene`
|
|
30
|
+
- IR & `Scene` zod schemas + inferred types
|
|
31
|
+
- `parseWay` / `parseNodeTarget` / `parseTargetSugar` — pure parsers
|
|
32
|
+
- `point` / `rect` / `circle` / `ellipse` / `diamond` / `polar` — geometry
|
|
33
|
+
- `BUILTIN_SHAPES` / `BUILTIN_ARROWS` / `BUILTIN_PATTERNS` + `ShapeDefinition` / `ArrowDefinition` / `PatternDefinition` / `definePathGenerator` — registries
|
|
34
|
+
|
|
35
|
+
## Docs
|
|
36
|
+
|
|
37
|
+
<https://pionpill.github.io/retikz/>
|
|
38
|
+
|
|
39
|
+
## License
|
|
40
|
+
|
|
41
|
+
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/arrows/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAiCjE;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/arrows/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAiCjE;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,eAAe,CA6DpE,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/es/arrows/index.js
CHANGED
|
@@ -122,7 +122,7 @@ var BUILTIN_ARROWS = {
|
|
|
122
122
|
cy: 5,
|
|
123
123
|
rx: 4.25,
|
|
124
124
|
ry: 4.25,
|
|
125
|
-
stroke: typeof ctx.stroke === "string" ? ctx.stroke : "
|
|
125
|
+
stroke: typeof ctx.stroke === "string" ? ctx.stroke : { kind: "contextStroke" },
|
|
126
126
|
strokeWidth: ctx.lineWidth
|
|
127
127
|
}]
|
|
128
128
|
}
|
|
@@ -9,7 +9,7 @@ import { anchorOf, angleBoundaryOf, outerRectOf } from "./node.js";
|
|
|
9
9
|
var cache = /* @__PURE__ */ new WeakMap();
|
|
10
10
|
/** 角度字符串识别:可选负号 + 数字 + 可选小数;与 parseTarget.ts 的 ANGLE_RE 同语义 */
|
|
11
11
|
var ANGLE_RE = /^-?\d+(\.\d+)?$/;
|
|
12
|
-
/** 把 layout 的 rect 换成外边界 AABB(外扩 outerSep)——border 类 anchor
|
|
12
|
+
/** 把 layout 的 rect 换成外边界 AABB(外扩 outerSep)——border 类 anchor(compass / 数字角度)在其上解析 */
|
|
13
13
|
var withOuterRect = (layout) => ({
|
|
14
14
|
...layout,
|
|
15
15
|
rect: outerRectOf(layout)
|
|
@@ -17,8 +17,8 @@ var withOuterRect = (layout) => ({
|
|
|
17
17
|
/**
|
|
18
18
|
* 把 anchorName 解析到对应 shape 的 anchor / boundaryPoint 上
|
|
19
19
|
* @description 数字字符串走 angleBoundaryOf;其余按标准方位 / shape-specific anchor 走 anchorOf;boundary 透传给两者。
|
|
20
|
-
* border 类 anchor(数字角度 + compass 方位名)按 outerSep 外推:在外扩 margin 的 rect(`outerRectOf
|
|
21
|
-
*
|
|
20
|
+
* border 类 anchor(数字角度 + compass 方位名)按 outerSep 外推:在外扩 margin 的 rect(`outerRectOf`)上解析。
|
|
21
|
+
* 形状专属命名 anchor(tip-N / apex 等)恒走视觉 rect、不外扩。`center` 在 inflate 下
|
|
22
22
|
* 中心不变,走哪条路结果一致。
|
|
23
23
|
*/
|
|
24
24
|
var computeAnchor = (layout, anchorName, boundary) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/compile/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/compile/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAA8D,MAAM,OAAO,CAAC;AAC5F,OAAO,KAAK,EAAa,KAAK,EAA6B,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,YAAY,CAAC;AAuBpB,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAGrE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAoDhD,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;IACzC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACzD;;;;OAIG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACxC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAuLF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,EAAE,EAAE,UAAS,cAAmB,KAAG,KAqXrE,CAAC"}
|
|
@@ -128,15 +128,14 @@ var collectPlaceholderLocators = (prims, prefix = "primitives") => {
|
|
|
128
128
|
});
|
|
129
129
|
return locators;
|
|
130
130
|
};
|
|
131
|
-
/**
|
|
132
|
-
var
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
131
|
+
/** 据**实际解析失败**的那个 transform 的成因映射 warn code(由 lowerScopeTransforms 的 onUnresolved 回调给出) */
|
|
132
|
+
var transformWarnCode = (failed) => {
|
|
133
|
+
switch (failed?.kind) {
|
|
134
|
+
case "offset-translate": return CompileWarningCode.OffsetBaseUnresolved;
|
|
135
|
+
case "at-translate": return CompileWarningCode.AtTargetUnresolved;
|
|
136
|
+
case "polar-translate": return CompileWarningCode.PolarOriginUnresolved;
|
|
137
|
+
default: return CompileWarningCode.UnresolvedNodeReference;
|
|
138
138
|
}
|
|
139
|
-
return CompileWarningCode.UnresolvedNodeReference;
|
|
140
139
|
};
|
|
141
140
|
/** 把 DuplicateRegisterInfo 翻成 CompileWarning(含可读 message + 双 IR locator) */
|
|
142
141
|
var formatDuplicateWarning = (info) => {
|
|
@@ -298,9 +297,13 @@ var compileToScene = (ir, options = {}) => {
|
|
|
298
297
|
nameStack.register(child.id, coordLayout, `${locatorPrefix}children[${i}].coordinate.id`);
|
|
299
298
|
layoutsAccumulator.push(coordLayout);
|
|
300
299
|
} else if (child.type === "scope") {
|
|
301
|
-
const
|
|
300
|
+
const rawTransforms = child.transforms ?? [];
|
|
301
|
+
let failedTransform;
|
|
302
|
+
const loweredOwn = lowerScopeTransforms(rawTransforms, nameStack, nodeDistance, refPointOfTarget, (t) => {
|
|
303
|
+
failedTransform = t;
|
|
304
|
+
});
|
|
302
305
|
if (loweredOwn === null) onWarn({
|
|
303
|
-
code:
|
|
306
|
+
code: transformWarnCode(failedTransform),
|
|
304
307
|
message: `Cannot resolve one of scope.transforms; referent (at.of / offset.of / polar.origin / between endpoints) is undefined or defined later in the IR`,
|
|
305
308
|
path: `${locatorPrefix}children[${i}].scope.transforms`
|
|
306
309
|
});
|
|
@@ -3,12 +3,9 @@ import { ValueOf } from '../types';
|
|
|
3
3
|
export declare const CompileWarningCode: {
|
|
4
4
|
readonly UnresolvedNodeReference: "UNRESOLVED_NODE_REFERENCE";
|
|
5
5
|
readonly PathTooShort: "PATH_TOO_SHORT";
|
|
6
|
-
readonly AnchorResolutionFailed: "ANCHOR_RESOLUTION_FAILED";
|
|
7
6
|
readonly OffsetBaseUnresolved: "OFFSET_BASE_UNRESOLVED";
|
|
8
7
|
readonly PolarOriginUnresolved: "POLAR_ORIGIN_UNRESOLVED";
|
|
9
8
|
readonly AtTargetUnresolved: "AT_TARGET_UNRESOLVED";
|
|
10
|
-
readonly RelativeInitialNoPrevEnd: "RELATIVE_INITIAL_NO_PREV_END";
|
|
11
|
-
readonly BboxExtremeInput: "BBOX_EXTREME_INPUT";
|
|
12
9
|
readonly DuplicateNodeId: "DUPLICATE_NODE_ID";
|
|
13
10
|
readonly ShapeOverridesBuiltin: "SHAPE_OVERRIDES_BUILTIN";
|
|
14
11
|
readonly ArrowOverridesBuiltin: "ARROW_OVERRIDES_BUILTIN";
|
|
@@ -17,6 +14,7 @@ export declare const CompileWarningCode: {
|
|
|
17
14
|
readonly AnimationInvalidProperty: "ANIMATION_INVALID_PROPERTY";
|
|
18
15
|
readonly ArcMissingRadius: "ARC_MISSING_RADIUS";
|
|
19
16
|
readonly PartialArcNeedsBothAngles: "PARTIAL_ARC_NEEDS_BOTH_ANGLES";
|
|
17
|
+
readonly PartialArcClosedInvalid: "PARTIAL_ARC_CLOSED_INVALID";
|
|
20
18
|
};
|
|
21
19
|
export type CompileWarningCodeValue = ValueOf<typeof CompileWarningCode> | (string & {});
|
|
22
20
|
/** 编译期 warning:不影响 Scene 产物,交给调用方收集或展示。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../../src/compile/constant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../../src/compile/constant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;CAerB,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAC/B,OAAO,CAAC,OAAO,kBAAkB,CAAC,GAClC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElB,2CAA2C;AAC3C,MAAM,MAAM,cAAc,GAAG;IAC3B,yBAAyB;IACzB,IAAI,EAAE,uBAAuB,CAAC;IAC9B,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,cAAc,KAAG,MACI,CAAC"}
|
|
@@ -3,12 +3,9 @@
|
|
|
3
3
|
var CompileWarningCode = {
|
|
4
4
|
UnresolvedNodeReference: "UNRESOLVED_NODE_REFERENCE",
|
|
5
5
|
PathTooShort: "PATH_TOO_SHORT",
|
|
6
|
-
AnchorResolutionFailed: "ANCHOR_RESOLUTION_FAILED",
|
|
7
6
|
OffsetBaseUnresolved: "OFFSET_BASE_UNRESOLVED",
|
|
8
7
|
PolarOriginUnresolved: "POLAR_ORIGIN_UNRESOLVED",
|
|
9
8
|
AtTargetUnresolved: "AT_TARGET_UNRESOLVED",
|
|
10
|
-
RelativeInitialNoPrevEnd: "RELATIVE_INITIAL_NO_PREV_END",
|
|
11
|
-
BboxExtremeInput: "BBOX_EXTREME_INPUT",
|
|
12
9
|
DuplicateNodeId: "DUPLICATE_NODE_ID",
|
|
13
10
|
ShapeOverridesBuiltin: "SHAPE_OVERRIDES_BUILTIN",
|
|
14
11
|
ArrowOverridesBuiltin: "ARROW_OVERRIDES_BUILTIN",
|
|
@@ -16,7 +13,8 @@ var CompileWarningCode = {
|
|
|
16
13
|
CompositeNotRegistered: "COMPOSITE_NOT_REGISTERED",
|
|
17
14
|
AnimationInvalidProperty: "ANIMATION_INVALID_PROPERTY",
|
|
18
15
|
ArcMissingRadius: "ARC_MISSING_RADIUS",
|
|
19
|
-
PartialArcNeedsBothAngles: "PARTIAL_ARC_NEEDS_BOTH_ANGLES"
|
|
16
|
+
PartialArcNeedsBothAngles: "PARTIAL_ARC_NEEDS_BOTH_ANGLES",
|
|
17
|
+
PartialArcClosedInvalid: "PARTIAL_ARC_CLOSED_INVALID"
|
|
20
18
|
};
|
|
21
19
|
var formatCompileWarning = (warning) => `[retikz] ${warning.code} at ${warning.path}: ${warning.message}`;
|
|
22
20
|
//#endregion
|
|
@@ -113,7 +113,7 @@ export type NodeLabelLayout = {
|
|
|
113
113
|
* @description = `inflateRect(layout.rect, layout.margin)`,中心不变、四向各 +margin。border 类
|
|
114
114
|
* anchor(compass / 数字角度)解析与 bbox / viewBox / 布局占位都基于这层;视觉 emit / 裁剪 /
|
|
115
115
|
* 形状专属 anchor / edgePoint / label 附着点仍读 `layout.rect`(不外扩)。单一派生量,不另存字段。
|
|
116
|
-
*
|
|
116
|
+
* (对齐 TikZ outer sep 语义。)
|
|
117
117
|
*/
|
|
118
118
|
export declare const outerRectOf: (layout: NodeLayout) => Rect;
|
|
119
119
|
/**
|
|
@@ -127,8 +127,8 @@ export declare const boundaryPointOf: (layout: NodeLayout, toward: Position, bou
|
|
|
127
127
|
* @description 纯几何:在传入的 `layout.rect` 上求点,本体**不施加 outerSep(margin)**。outerSep 的
|
|
128
128
|
* 「border 外推」由调用方决定——`anchor-cache.ts` 的 compass 解析先把 rect 外扩 margin(`outerRectOf`)
|
|
129
129
|
* 再调本函数;`labelBorderPoint` 喂视觉 rect(label 附着点不含 margin)。这样 outer sep 只作用于
|
|
130
|
-
* path / position 的 anchor 引用,不波及 label
|
|
131
|
-
* compass(9 个 rect
|
|
130
|
+
* path / position 的 anchor 引用,不波及 label。
|
|
131
|
+
* compass(9 个 rect 方位名):默认连接面先走视觉 shape 自身 compass(ellipse/circle 落真实周长、polygon/rect 落 AABB,与 TikZ 一致),shape 未实现则回退 AABB 矩形;显式 boundary 按其解析。
|
|
132
132
|
* 形状专属命名 anchor(tip-N / apex 等非 compass 名)恒走视觉形状自身,boundary 不影响。
|
|
133
133
|
* boundary 缺省 = 'shape'。
|
|
134
134
|
*/
|
|
@@ -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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"}
|
package/dist/es/compile/node.js
CHANGED
|
@@ -131,7 +131,7 @@ var inflateRect = (r, m) => m === 0 ? r : {
|
|
|
131
131
|
* @description = `inflateRect(layout.rect, layout.margin)`,中心不变、四向各 +margin。border 类
|
|
132
132
|
* anchor(compass / 数字角度)解析与 bbox / viewBox / 布局占位都基于这层;视觉 emit / 裁剪 /
|
|
133
133
|
* 形状专属 anchor / edgePoint / label 附着点仍读 `layout.rect`(不外扩)。单一派生量,不另存字段。
|
|
134
|
-
*
|
|
134
|
+
* (对齐 TikZ outer sep 语义。)
|
|
135
135
|
*/
|
|
136
136
|
var outerRectOf = (layout) => inflateRect(layout.rect, layout.margin);
|
|
137
137
|
/**
|
|
@@ -148,15 +148,23 @@ var boundaryPointOf = (layout, toward, boundary = "shape") => {
|
|
|
148
148
|
* @description 纯几何:在传入的 `layout.rect` 上求点,本体**不施加 outerSep(margin)**。outerSep 的
|
|
149
149
|
* 「border 外推」由调用方决定——`anchor-cache.ts` 的 compass 解析先把 rect 外扩 margin(`outerRectOf`)
|
|
150
150
|
* 再调本函数;`labelBorderPoint` 喂视觉 rect(label 附着点不含 margin)。这样 outer sep 只作用于
|
|
151
|
-
* path / position 的 anchor 引用,不波及 label
|
|
152
|
-
* compass(9 个 rect
|
|
151
|
+
* path / position 的 anchor 引用,不波及 label。
|
|
152
|
+
* compass(9 个 rect 方位名):默认连接面先走视觉 shape 自身 compass(ellipse/circle 落真实周长、polygon/rect 落 AABB,与 TikZ 一致),shape 未实现则回退 AABB 矩形;显式 boundary 按其解析。
|
|
153
153
|
* 形状专属命名 anchor(tip-N / apex 等非 compass 名)恒走视觉形状自身,boundary 不影响。
|
|
154
154
|
* boundary 缺省 = 'shape'。
|
|
155
155
|
*/
|
|
156
156
|
var anchorOf = (layout, name, boundary = "shape") => {
|
|
157
157
|
const compassAnchor = normalizeCompassAnchor(name);
|
|
158
158
|
if (compassAnchor !== void 0) {
|
|
159
|
-
|
|
159
|
+
if (boundary === "shape") {
|
|
160
|
+
const own = layout.shapeDef.anchor(layout.rect, compassAnchor, layout.shapeParams ?? EMPTY_SHAPE_PARAMS);
|
|
161
|
+
if (own !== void 0) return own;
|
|
162
|
+
const fallback = resolveBoundary("rectangle", layout.shapeDef, layout.rect, layout.shapeParams ?? EMPTY_SHAPE_PARAMS, layout.shapes);
|
|
163
|
+
const p = fallback.def.anchor(fallback.rect, compassAnchor, fallback.params);
|
|
164
|
+
if (p === void 0) throw new Error(`Unknown anchor '${name}' for shape '${layout.shapeName}'`);
|
|
165
|
+
return p;
|
|
166
|
+
}
|
|
167
|
+
const { def, rect, params } = resolveBoundary(boundary, layout.shapeDef, layout.rect, layout.shapeParams ?? EMPTY_SHAPE_PARAMS, layout.shapes);
|
|
160
168
|
const p = def.anchor(rect, compassAnchor, params);
|
|
161
169
|
if (p === void 0) throw new Error(`Unknown anchor '${name}' for shape '${layout.shapeName}'`);
|
|
162
170
|
return p;
|
|
@@ -308,11 +316,13 @@ var layoutNode = (node, measureText, nameStack, nodeDistance, scopeChain = [], l
|
|
|
308
316
|
}
|
|
309
317
|
textHeight = lines.length * lineHeight;
|
|
310
318
|
}
|
|
311
|
-
const
|
|
312
|
-
const
|
|
313
|
-
const
|
|
314
|
-
const
|
|
315
|
-
const
|
|
319
|
+
const innerHalfW = Math.max(textWidth / 2 + xSep, xSep);
|
|
320
|
+
const innerHalfH = Math.max(textHeight / 2 + ySep, ySep);
|
|
321
|
+
const circumscribed = shapeDef.circumscribe(innerHalfW, innerHalfH, shapeParams);
|
|
322
|
+
const minHalfW = (node.minimumWidth ?? node.minimumSize ?? 0) * sx / 2;
|
|
323
|
+
const minHalfH = (node.minimumHeight ?? node.minimumSize ?? 0) * sy / 2;
|
|
324
|
+
const boundsHalfW = Math.max(circumscribed.halfWidth, minHalfW);
|
|
325
|
+
const boundsHalfH = Math.max(circumscribed.halfHeight, minHalfH);
|
|
316
326
|
const rotateDeg = node.rotate ?? 0;
|
|
317
327
|
const center = resolvePosition(node.position, nameStack, nodeDistance, scopeChain, resolveBetweenGlobal);
|
|
318
328
|
if (!center) throw new Error(`Cannot resolve position for node ${node.id ?? "(unnamed)"}; polar.origin / at.of / between endpoint may reference an undefined node`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAa9C,OAAO,KAAK,EACV,MAAM,EAEN,UAAU,EAGX,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAMV,cAAc,EACd,SAAS,EACV,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AAKtE,OAAO,EAAE,KAAK,eAAe,EAA2D,MAAM,UAAU,CAAC;AAyGzG,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iCAAiC;IACjC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3C,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACtC,wEAAwE;IACxE,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;;OAKG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CACnE,CAAC;AAkGF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,WAAW,SAAS,EACpB,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAa,YAA+B,EAC5C,WAAU,gBAAqB,KAC9B;IAAE,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAAE,GAAG,IAkyBrE,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { BUILTIN_ARROWS } from "../../arrows/index.js";
|
|
|
5
5
|
import { CompileWarningCode } from "../constant.js";
|
|
6
6
|
import { applyTransformChain } from "../scope.js";
|
|
7
7
|
import { bendControlPoints, outInControlPoints } from "../../geometry/bend.js";
|
|
8
|
-
import { arcSegmentSample, circleSegmentSample, cubicSegmentSample, ellipseArcSegmentSample, ellipseSegmentSample, foldSegmentSample, lineSegmentSample, quadSegmentSample } from "../../geometry/segment.js";
|
|
8
|
+
import { arcSegmentSample, circleSegmentSample, cubicSegmentSample, ellipseArcSegmentSample, ellipseSegmentSample, foldSegmentSample, lineSegmentSample, quadSegmentSample, rectPerimeterSample } from "../../geometry/segment.js";
|
|
9
9
|
import { fallbackMeasurer } from "../text-metrics.js";
|
|
10
10
|
import { clipForTarget, cornerOf, isAutoBoundaryTarget, refPointOfTarget, samePoint } from "./anchor.js";
|
|
11
11
|
import { emitLabelPrimitive, tForLabelPosition } from "./label.js";
|
|
@@ -14,14 +14,23 @@ import { applyArrowShrinks, endpointArrows, resolveMarkArrowSpec } from "./shrin
|
|
|
14
14
|
import { splitSubPathsForEndpointArrows } from "./split.js";
|
|
15
15
|
//#region src/compile/path/index.ts
|
|
16
16
|
/**
|
|
17
|
+
* referent(offset.of / polar.origin 的并集形态:节点 id 字符串 / `[x, y]` 字面量 / 嵌套 PolarPosition)里挖节点 id
|
|
18
|
+
* @description 裸字符串即节点 id(offset.of / polar.origin 的 string 分支语义);其余交回 nodeRefId 递归。
|
|
19
|
+
*/
|
|
20
|
+
var referentNodeId = (ref) => typeof ref === "string" ? ref : nodeRefId(ref);
|
|
21
|
+
/**
|
|
17
22
|
* 目标里的一个代表性节点 id——给 UNRESOLVED_NODE_REFERENCE 诊断用
|
|
18
23
|
* @description 对象 NodeTarget(`{ id, ... }`)直接取 id;between 比例点递归挖端点里第一个节点引用
|
|
19
|
-
* (端点未解析时整 between 失败,需照样报 unresolved
|
|
24
|
+
* (端点未解析时整 between 失败,需照样报 unresolved 而非静默);OffsetPosition(`{ of }`)/ PolarPosition
|
|
25
|
+
* (`{ origin }`)递归挖其 referent——否则引用未定义节点时 refPoint 为 null 但 toId 为 undefined,整条 path
|
|
26
|
+
* 会被静默丢弃(零诊断);直接坐标 / 极坐标无 origin 等形态返回 undefined。
|
|
20
27
|
*/
|
|
21
28
|
var nodeRefId = (t) => {
|
|
22
29
|
if (typeof t !== "object" || Array.isArray(t)) return void 0;
|
|
23
30
|
if ("id" in t) return t.id;
|
|
24
31
|
if ("between" in t) return nodeRefId(t.between[0]) ?? nodeRefId(t.between[1]);
|
|
32
|
+
if ("of" in t) return referentNodeId(t.of);
|
|
33
|
+
if ("origin" in t) return referentNodeId(t.origin);
|
|
25
34
|
};
|
|
26
35
|
/** 有限数 */
|
|
27
36
|
var isFiniteNum = (n) => typeof n === "number" && Number.isFinite(n);
|
|
@@ -130,13 +139,32 @@ var buildPathTransforms = (rotate, scale, center, round) => {
|
|
|
130
139
|
* 把已物化的 arrow marker(局部 baseSize 坐标系,尖端 +x)按路径切线定向放到采样点
|
|
131
140
|
* @description marker 局部系:viewBox `0 0 baseSize baseSize`,参考点 (refX, baseSize/2),尖端朝 +x。
|
|
132
141
|
* GroupPrim transforms 数组语义 array[0] 最外层(最后 apply),故链 = translate(point) ∘ rotate(tangentDeg)
|
|
133
|
-
* ∘ scale(markerWidth/baseSize, markerHeight/baseSize) ∘ translate(-refX, -baseSize/2)
|
|
134
|
-
*
|
|
142
|
+
* ∘ scale(markerWidth·strokeWidth/baseSize, markerHeight·strokeWidth/baseSize) ∘ translate(-refX, -baseSize/2):
|
|
143
|
+
* 先把参考点移到原点、缩放到目标尺寸、绕切线角旋转、平移到采样点。缩放含 strokeWidth 因子,与端点箭头
|
|
144
|
+
* (SVG markerUnits=strokeWidth / Canvas 同口径 ×strokeWidth)一致——中段 mark 随线宽缩放(TikZ 语义)。
|
|
145
|
+
*
|
|
146
|
+
* marker 几何拍平进 Scene 作 children:marker 窄子集结构上是 ScenePrimitive 子集,唯一差异是 fill/stroke 可为
|
|
147
|
+
* `{ kind: 'contextStroke' }`。端点箭头物化成真正的 `<marker>` 时 contextStroke 由 renderer 继承引用方描边;
|
|
148
|
+
* 但中段 mark 是独立 Scene group,已无引用上下文可继承,故在此把 contextStroke 解析成 path 的实际描边色
|
|
149
|
+
* (contextStroke 字符串单位 = path 的已解析 stroke)。
|
|
135
150
|
*/
|
|
136
|
-
var
|
|
151
|
+
var resolveMarkerContextFill = (value, contextStroke) => typeof value === "string" ? value : contextStroke;
|
|
152
|
+
/** marker 图元 → Scene 图元:结构同构,仅把 fill/stroke 的 contextStroke 解析成具体描边色(递归 group) */
|
|
153
|
+
var markerPrimToScene = (prim, contextStroke) => {
|
|
154
|
+
if (prim.type === "group") return {
|
|
155
|
+
...prim,
|
|
156
|
+
children: prim.children.map((c) => markerPrimToScene(c, contextStroke))
|
|
157
|
+
};
|
|
158
|
+
return {
|
|
159
|
+
...prim,
|
|
160
|
+
...prim.fill !== void 0 && { fill: resolveMarkerContextFill(prim.fill, contextStroke) },
|
|
161
|
+
...prim.stroke !== void 0 && { stroke: resolveMarkerContextFill(prim.stroke, contextStroke) }
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
var buildMarkMarkerGroup = (spec, sample, strokeWidth, round, contextStroke) => {
|
|
137
165
|
const angleDeg = Math.atan2(sample.tangent[1], sample.tangent[0]) * 180 / Math.PI;
|
|
138
|
-
const sx = spec.markerWidth / spec.baseSize;
|
|
139
|
-
const sy = spec.markerHeight / spec.baseSize;
|
|
166
|
+
const sx = spec.markerWidth * strokeWidth / spec.baseSize;
|
|
167
|
+
const sy = spec.markerHeight * strokeWidth / spec.baseSize;
|
|
140
168
|
const refY = spec.baseSize / 2;
|
|
141
169
|
return {
|
|
142
170
|
type: "group",
|
|
@@ -161,7 +189,7 @@ var buildMarkMarkerGroup = (spec, sample, round) => {
|
|
|
161
189
|
y: round(-refY)
|
|
162
190
|
}
|
|
163
191
|
],
|
|
164
|
-
children:
|
|
192
|
+
children: spec.marker.map((p) => markerPrimToScene(p, contextStroke))
|
|
165
193
|
};
|
|
166
194
|
};
|
|
167
195
|
/**
|
|
@@ -344,7 +372,7 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
|
|
|
344
372
|
const resolvePartialClosed = (closed, idx) => {
|
|
345
373
|
if (closed === "open") return "open";
|
|
346
374
|
if (closed === "sector") return "sector";
|
|
347
|
-
if (closed === "closed") warn(
|
|
375
|
+
if (closed === "closed") warn(CompileWarningCode.PartialArcClosedInvalid, "Partial circle/ellipse (with angles) cannot use closed:'closed'; falling back to 'chord'", `children[${idx}]`);
|
|
348
376
|
return "chord";
|
|
349
377
|
};
|
|
350
378
|
for (let i = 0; i < steps.length; i++) {
|
|
@@ -435,6 +463,7 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
|
|
|
435
463
|
const fromClip = usedOverride ?? (prev ? clipForTarget(prev.step.to, moveAnchor, nameStack, scopeChain) : null);
|
|
436
464
|
const toClip = clipForTarget(moveTo, fromClip ?? prev?.anchor ?? moveAnchor, nameStack, scopeChain);
|
|
437
465
|
if (!fromClip || !toClip) return null;
|
|
466
|
+
segmentSamplers.push((t) => lineSegmentSample(fromClip, toClip, t));
|
|
438
467
|
if (samePoint(fromClip, lastEnd) && samePoint(toClip, subPathStart)) {
|
|
439
468
|
emitClose();
|
|
440
469
|
continue;
|
|
@@ -465,6 +494,7 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
|
|
|
465
494
|
const ry0 = Math.min(fromPt[1], toPt[1]);
|
|
466
495
|
const ry1 = Math.max(fromPt[1], toPt[1]);
|
|
467
496
|
points.push([rx0, ry0], [rx1, ry0], [rx1, ry1], [rx0, ry1]);
|
|
497
|
+
segmentSamplers.push((t) => rectPerimeterSample(fromPt, toPt, t));
|
|
468
498
|
if (rectStart) penOverride = rectStart;
|
|
469
499
|
continue;
|
|
470
500
|
}
|
|
@@ -646,7 +676,7 @@ var emitPathPrimitive = (path, nameStack, round, measureText = fallbackMeasurer,
|
|
|
646
676
|
const localT = scaled - segIdx;
|
|
647
677
|
const sample = segmentSamplers[segIdx](pos === 1 ? 1 : localT);
|
|
648
678
|
const spec = resolveMarkArrowSpec(mark, effectiveArrows, round);
|
|
649
|
-
markPrims.push(buildMarkMarkerGroup(spec, sample, round));
|
|
679
|
+
markPrims.push(buildMarkMarkerGroup(spec, sample, strokeWidth, round, baseProps.stroke ?? "currentColor"));
|
|
650
680
|
points.push(sample.point);
|
|
651
681
|
}
|
|
652
682
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAmBpD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,WAAW,CAAC,UAAU,CAAC,KAAG,MAIhE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,WAAW,EAClB,QAAQ,aAAa,EACrB,aAAa,YAAY,EACzB,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAc,MAAM,KACnB;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAmBpD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,WAAW,CAAC,UAAU,CAAC,KAAG,MAIhE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,WAAW,EAClB,QAAQ,aAAa,EACrB,aAAa,YAAY,EACzB,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAc,MAAM,KACnB;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAyGxD,CAAC"}
|
|
@@ -103,13 +103,17 @@ var emitLabelPrimitive = (label, sample, measureText, round, hostOpacity) => {
|
|
|
103
103
|
}
|
|
104
104
|
const halfW = measuredWidth / 2;
|
|
105
105
|
const halfH = measuredHeight / 2;
|
|
106
|
+
const left = align === "start" ? x : align === "end" ? x - measuredWidth : x - halfW;
|
|
107
|
+
const right = align === "start" ? x + measuredWidth : align === "end" ? x : x + halfW;
|
|
108
|
+
const top = baseline === "top" ? y : baseline === "bottom" ? y - measuredHeight : y - halfH;
|
|
109
|
+
const bottom = baseline === "top" ? y + measuredHeight : baseline === "bottom" ? y : y + halfH;
|
|
106
110
|
return {
|
|
107
111
|
primitive: text,
|
|
108
112
|
points: [
|
|
109
|
-
[
|
|
110
|
-
[
|
|
111
|
-
[
|
|
112
|
-
[
|
|
113
|
+
[left, top],
|
|
114
|
+
[right, top],
|
|
115
|
+
[left, bottom],
|
|
116
|
+
[right, bottom]
|
|
113
117
|
]
|
|
114
118
|
};
|
|
115
119
|
};
|
|
@@ -10,7 +10,7 @@ import { ResolveBetweenGlobal } from './position';
|
|
|
10
10
|
* 各自构造对应 Position 字面量并调用 `resolvePosition` 拿到 Cartesian (x, y),再写成 Cartesian translate;
|
|
11
11
|
* rotate / scale 直接透传。referent 未解析时返回 null(上游负责发 warn / throw)
|
|
12
12
|
*/
|
|
13
|
-
export declare const lowerScopeTransforms: (transforms: ReadonlyArray<IRTransform>, nameStack: NameStack, nodeDistance?: number, resolveBetweenGlobal?: ResolveBetweenGlobal) => Array<Transform> | null;
|
|
13
|
+
export declare const lowerScopeTransforms: (transforms: ReadonlyArray<IRTransform>, nameStack: NameStack, nodeDistance?: number, resolveBetweenGlobal?: ResolveBetweenGlobal, onUnresolved?: (failed: IRTransform) => void) => Array<Transform> | null;
|
|
14
14
|
/**
|
|
15
15
|
* 把局部坐标点 (x, y) 按 Cartesian-only transform 链 apply 到全局坐标
|
|
16
16
|
* @description 数组语义与 SVG `transform="t0 t1 t2"` / TikZ scope option 顺序一致:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/compile/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,UAAU,EACV,WAAW,EAEZ,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,KAAK,oBAAoB,EAAmB,MAAM,YAAY,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,YAAY,aAAa,CAAC,WAAW,CAAC,EACtC,WAAW,SAAS,EACpB,eAAe,MAAM,EACrB,uBAAuB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../../src/compile/scope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,UAAU,EACV,WAAW,EAEZ,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,KAAK,oBAAoB,EAAmB,MAAM,YAAY,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,YAAY,aAAa,CAAC,WAAW,CAAC,EACtC,WAAW,SAAS,EACpB,eAAe,MAAM,EACrB,uBAAuB,oBAAoB,EAC3C,eAAe,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,KAC3C,KAAK,CAAC,SAAS,CAAC,GAAG,IAoErB,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,UA+BF,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,UAAU,EAClB,OAAO,aAAa,CAAC,SAAS,CAAC,KAC9B,UA4BF,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,IA6BrB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,IAAI,MAAM,EACV,MAAM,gBAAgB,GAAG,IAAI,EAC7B,gBAAgB,UAAU,EAC1B,SAAQ,MAAM,CAAC,MAAM,EAAE,eAAe,CAAkB,KACvD,UAiBF,CAAC"}
|
package/dist/es/compile/scope.js
CHANGED
|
@@ -9,7 +9,7 @@ import { outerRectOf } from "./node.js";
|
|
|
9
9
|
* 各自构造对应 Position 字面量并调用 `resolvePosition` 拿到 Cartesian (x, y),再写成 Cartesian translate;
|
|
10
10
|
* rotate / scale 直接透传。referent 未解析时返回 null(上游负责发 warn / throw)
|
|
11
11
|
*/
|
|
12
|
-
var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenGlobal) => {
|
|
12
|
+
var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenGlobal, onUnresolved) => {
|
|
13
13
|
const out = [];
|
|
14
14
|
for (const t of transforms) switch (t.kind) {
|
|
15
15
|
case "translate":
|
|
@@ -26,7 +26,10 @@ var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenG
|
|
|
26
26
|
};
|
|
27
27
|
if (t.origin !== void 0) polar.origin = t.origin;
|
|
28
28
|
const resolved = resolvePosition(polar, nameStack, nodeDistance);
|
|
29
|
-
if (!resolved)
|
|
29
|
+
if (!resolved) {
|
|
30
|
+
onUnresolved?.(t);
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
30
33
|
out.push({
|
|
31
34
|
kind: "translate",
|
|
32
35
|
x: resolved[0],
|
|
@@ -41,7 +44,10 @@ var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenG
|
|
|
41
44
|
};
|
|
42
45
|
if (t.distance !== void 0) at.distance = t.distance;
|
|
43
46
|
const resolved = resolvePosition(at, nameStack, nodeDistance);
|
|
44
|
-
if (!resolved)
|
|
47
|
+
if (!resolved) {
|
|
48
|
+
onUnresolved?.(t);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
45
51
|
out.push({
|
|
46
52
|
kind: "translate",
|
|
47
53
|
x: resolved[0],
|
|
@@ -54,7 +60,10 @@ var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenG
|
|
|
54
60
|
of: t.of,
|
|
55
61
|
offset: t.offset ?? [0, 0]
|
|
56
62
|
}, nameStack, nodeDistance);
|
|
57
|
-
if (!resolved)
|
|
63
|
+
if (!resolved) {
|
|
64
|
+
onUnresolved?.(t);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
58
67
|
out.push({
|
|
59
68
|
kind: "translate",
|
|
60
69
|
x: resolved[0],
|
|
@@ -67,7 +76,10 @@ var lowerScopeTransforms = (transforms, nameStack, nodeDistance, resolveBetweenG
|
|
|
67
76
|
between: t.between,
|
|
68
77
|
t: t.t
|
|
69
78
|
}, nameStack, nodeDistance, [], resolveBetweenGlobal);
|
|
70
|
-
if (!resolved)
|
|
79
|
+
if (!resolved) {
|
|
80
|
+
onUnresolved?.(t);
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
71
83
|
out.push({
|
|
72
84
|
kind: "translate",
|
|
73
85
|
x: resolved[0],
|
|
@@ -27,7 +27,7 @@ export type TextMetrics = {
|
|
|
27
27
|
export type TextMeasurer = (text: string, font: FontSpec) => TextMetrics;
|
|
28
28
|
/**
|
|
29
29
|
* 默认 fallback 度量:基于平均字宽估算,不准但保证可运行
|
|
30
|
-
* @description size=0 → 退化返回 (0, 0)(与 text='' 一致);负 size
|
|
30
|
+
* @description size=0 → 退化返回 (0, 0)(与 text='' 一致);负 size 或非有限(NaN / Infinity)size → throw(非法输入早 fail,避免 NaN / Infinity 传播到 Scene)
|
|
31
31
|
*/
|
|
32
32
|
export declare const fallbackMeasurer: TextMeasurer;
|
|
33
33
|
//# sourceMappingURL=text-metrics.d.ts.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
//#region src/compile/text-metrics.ts
|
|
2
2
|
/**
|
|
3
3
|
* 默认 fallback 度量:基于平均字宽估算,不准但保证可运行
|
|
4
|
-
* @description size=0 → 退化返回 (0, 0)(与 text='' 一致);负 size
|
|
4
|
+
* @description size=0 → 退化返回 (0, 0)(与 text='' 一致);负 size 或非有限(NaN / Infinity)size → throw(非法输入早 fail,避免 NaN / Infinity 传播到 Scene)
|
|
5
5
|
*/
|
|
6
6
|
var fallbackMeasurer = (text, font) => {
|
|
7
|
-
if (Number.
|
|
7
|
+
if (!Number.isFinite(font.size) || font.size < 0) throw new Error(`fallbackMeasurer: invalid font.size '${font.size}'; must be a non-negative finite number`);
|
|
8
8
|
return {
|
|
9
9
|
width: text.length * font.size * .55,
|
|
10
10
|
height: font.size * 1.2
|