@cardenelabs/cdl 0.64.1 → 0.65.0
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/CHANGELOG.md +46 -1
- package/dist/index.cjs +16 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +16 -12
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +16 -12
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +16 -12
- package/dist/react.js.map +1 -1
- package/package.json +12 -9
- package/src/layout/edges.ts +38 -12
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cardenelabs/cdl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.65.0",
|
|
4
4
|
"description": "CDL (Chainome Diagram Language). Mermaid-like declarative DSL that compiles to animated SVG diagrams. Built for blockchain / Solidity flows, generic enough for sequence / flow / state / ER / topology diagrams.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "cardene777",
|
|
@@ -57,6 +57,16 @@
|
|
|
57
57
|
"node": ">=18"
|
|
58
58
|
},
|
|
59
59
|
"sideEffects": false,
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "tsup",
|
|
62
|
+
"dev": "tsup --watch",
|
|
63
|
+
"typecheck": "tsc --noEmit",
|
|
64
|
+
"test": "cd ../.. && vitest run packages/cdl",
|
|
65
|
+
"lint": "tsc --noEmit",
|
|
66
|
+
"prepublishOnly": "pnpm run typecheck && pnpm run build",
|
|
67
|
+
"prepack": "node scripts/prepack-check.mjs",
|
|
68
|
+
"postpack": "node scripts/prepack-check.mjs"
|
|
69
|
+
},
|
|
60
70
|
"peerDependencies": {
|
|
61
71
|
"react": "^19.0.0",
|
|
62
72
|
"react-dom": "^19.0.0"
|
|
@@ -68,12 +78,5 @@
|
|
|
68
78
|
"typedoc": "^0.28.19",
|
|
69
79
|
"typedoc-plugin-markdown": "^4.12.0",
|
|
70
80
|
"typescript": "^5.8.0"
|
|
71
|
-
},
|
|
72
|
-
"scripts": {
|
|
73
|
-
"build": "tsup",
|
|
74
|
-
"dev": "tsup --watch",
|
|
75
|
-
"typecheck": "tsc --noEmit",
|
|
76
|
-
"test": "cd ../.. && vitest run packages/cdl",
|
|
77
|
-
"lint": "tsc --noEmit"
|
|
78
81
|
}
|
|
79
|
-
}
|
|
82
|
+
}
|
package/src/layout/edges.ts
CHANGED
|
@@ -48,6 +48,25 @@ const VERTICAL_DETOUR_CORNER = 14;
|
|
|
48
48
|
export function verticalCornerDir(from: number, to: number): 1 | -1 {
|
|
49
49
|
return to < from ? -1 : 1;
|
|
50
50
|
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 角の丸みを、その角が使える長さで頭打ちにする (`#865`)。
|
|
54
|
+
*
|
|
55
|
+
* 丸めた角は「手前で半径だけ直線を止め、弧で半径だけ先へ抜ける」 形で作る。 走りがその分を
|
|
56
|
+
* 持っていないと、止めた点が走りの向こう側へ回り込み、直線が逆走して角の外に突起が出る。
|
|
57
|
+
*
|
|
58
|
+
* `走り` には **その走りを 1 つの角が使える長さ** を渡す。 両端の 2 角で使う走り (L 字の縦)
|
|
59
|
+
* は半分を渡し、片端の 1 角しか使わない走り (L 字の横) はそのまま渡す。
|
|
60
|
+
*
|
|
61
|
+
* 0 を返す時は丸める余地が無い。 呼び出し側は弧の切り口が角そのものに重なった形を出すので、
|
|
62
|
+
* 見た目は折れ線のまま繋がる。 `verticesToPath` が同じ規則を別の経路で持っている。
|
|
63
|
+
*
|
|
64
|
+
* 走りの向きは見ない = 経路は右にも左にも上にも下にも走るため、呼び出し側は符号付きの差を
|
|
65
|
+
* そのまま渡せる。 返り値が負にならないのは、半径を負で呼ばない限り長さが下限になるため。
|
|
66
|
+
*/
|
|
67
|
+
export function cornerRadiusFor(半径: number, ...走り: readonly number[]): number {
|
|
68
|
+
return Math.min(半径, ...走り.map((v) => Math.abs(v)));
|
|
69
|
+
}
|
|
51
70
|
/** 縦 detour が source から曲がるまで直進する距離 (world unit)。 EDGE_STUB_OUT を上回る。 */
|
|
52
71
|
const VERTICAL_DETOUR_EXIT = 45;
|
|
53
72
|
|
|
@@ -1933,6 +1952,13 @@ function routePath(
|
|
|
1933
1952
|
iter++;
|
|
1934
1953
|
}
|
|
1935
1954
|
}
|
|
1955
|
+
// 角の丸みは `midX` が決まってから頭打ちにする (`#865`)。 上の繰り返しが札を避けて `midX` を
|
|
1956
|
+
// 中央から動かすため、中央のつもりで先に計算すると、動いた後の横の走りを測り損ねる。
|
|
1957
|
+
//
|
|
1958
|
+
// 縦の走りは両端の 2 角で使うので半分を渡し、横の走りは片端の 1 角しか使わないのでそのまま
|
|
1959
|
+
// 渡す。 頭打ちにしないと、中心の高さの差が 28 (丸み 14 の 2 倍) より近い対で縦の走りが
|
|
1960
|
+
// 逆走する = 実測で 506 → 516 の対が `500 520` から `500 502` へ 18 戻る形を出していた。
|
|
1961
|
+
const lCorner = cornerRadiusFor(corner, (B.y - A.y) / 2, midX - A.x, B.x - midX);
|
|
1936
1962
|
// label 初期位置 = L 字 corner の垂直 segment 中点、 A.y と B.y の中間 高さ (routing v6)。
|
|
1937
1963
|
// 旧実装は labelX=(A.x+midX)/2, labelY=A.y の水平 segment 上に置いていたが、 label 幅の広い
|
|
1938
1964
|
// edge (幅 230px 等) では A 側 node bbox に食い込んで overlap 発生 (rollback pattern e3 の
|
|
@@ -1990,10 +2016,10 @@ function routePath(
|
|
|
1990
2016
|
// enter 水平 (539.11→400) 139 world、 最長 = mid 垂直、 中点 = (553.11, 410)、
|
|
1991
2017
|
// pill (label 幅 102 × 高さ 36) 中心 = (553.11, 410) で垂直 segment 上 straddle。
|
|
1992
2018
|
if (edge?.overlay) {
|
|
1993
|
-
const exitEndX = midX - xDir *
|
|
1994
|
-
const enterStartX = midX + xDir *
|
|
1995
|
-
const midStartY = A.y + yDir *
|
|
1996
|
-
const midEndY = B.y - yDir *
|
|
2019
|
+
const exitEndX = midX - xDir * lCorner;
|
|
2020
|
+
const enterStartX = midX + xDir * lCorner;
|
|
2021
|
+
const midStartY = A.y + yDir * lCorner;
|
|
2022
|
+
const midEndY = B.y - yDir * lCorner;
|
|
1997
2023
|
const segments = [
|
|
1998
2024
|
{ len: Math.abs(exitEndX - A.x), midXVal: (A.x + exitEndX) / 2, midYVal: A.y },
|
|
1999
2025
|
{ len: Math.abs(midEndY - midStartY), midXVal: midX, midYVal: (midStartY + midEndY) / 2 },
|
|
@@ -2002,10 +2028,10 @@ function routePath(
|
|
|
2002
2028
|
const longest = segments.reduce((a, b) => (b.len > a.len ? b : a));
|
|
2003
2029
|
return {
|
|
2004
2030
|
d: `M ${A.x} ${A.y}
|
|
2005
|
-
L ${midX - xDir *
|
|
2006
|
-
Q ${midX} ${A.y}, ${midX} ${A.y + yDir *
|
|
2007
|
-
L ${midX} ${B.y - yDir *
|
|
2008
|
-
Q ${midX} ${B.y}, ${midX + xDir *
|
|
2031
|
+
L ${midX - xDir * lCorner} ${A.y}
|
|
2032
|
+
Q ${midX} ${A.y}, ${midX} ${A.y + yDir * lCorner}
|
|
2033
|
+
L ${midX} ${B.y - yDir * lCorner}
|
|
2034
|
+
Q ${midX} ${B.y}, ${midX + xDir * lCorner} ${B.y}
|
|
2009
2035
|
L ${B.x} ${B.y}`,
|
|
2010
2036
|
labelX: longest.midXVal,
|
|
2011
2037
|
labelY: longest.midYVal,
|
|
@@ -2014,10 +2040,10 @@ function routePath(
|
|
|
2014
2040
|
}
|
|
2015
2041
|
return {
|
|
2016
2042
|
d: `M ${A.x} ${A.y}
|
|
2017
|
-
L ${midX - xDir *
|
|
2018
|
-
Q ${midX} ${A.y}, ${midX} ${A.y + yDir *
|
|
2019
|
-
L ${midX} ${B.y - yDir *
|
|
2020
|
-
Q ${midX} ${B.y}, ${midX + xDir *
|
|
2043
|
+
L ${midX - xDir * lCorner} ${A.y}
|
|
2044
|
+
Q ${midX} ${A.y}, ${midX} ${A.y + yDir * lCorner}
|
|
2045
|
+
L ${midX} ${B.y - yDir * lCorner}
|
|
2046
|
+
Q ${midX} ${B.y}, ${midX + xDir * lCorner} ${B.y}
|
|
2021
2047
|
L ${B.x} ${B.y}`,
|
|
2022
2048
|
labelX: midX,
|
|
2023
2049
|
labelY: verticalMidY,
|