@cardenelabs/cdl 0.118.0 → 0.120.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 +92 -1
- package/dist/index.cjs +40 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +40 -9
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +40 -9
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +40 -9
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/layout/head-label.ts +38 -10
- package/src/render/edges.tsx +26 -7
- package/src/render/stage.tsx +3 -2
- package/src/render/utils.ts +47 -0
- package/src/types.ts +11 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,95 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.120.0] - 2026-10-02
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **線の端に添える数が、線に近すぎて 1 つの帯に見えた** (#989)
|
|
13
|
+
|
|
14
|
+
[#984](https://github.com/cardene777/cdl/issues/984) で線の脇へ離す距離を 8 から 15 に広げたが、
|
|
15
|
+
使う側は図を縮めて出すので足りなかった。
|
|
16
|
+
見本帳はクラス図を 0.42 倍で出しており、15 は画面では 6 画素になる。
|
|
17
|
+
字の高さが 8 画素なので、字 1 つ分も空いていなかった。
|
|
18
|
+
|
|
19
|
+
余白を **字の箱の高さの半分** から導くようにした。
|
|
20
|
+
縮めた後も字の半行分の空きが残り、字を大きくした図では余白も一緒に広がる。
|
|
21
|
+
|
|
22
|
+
| 何を | 前 | 後 |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| 印と字の余白 | 8 | 12 |
|
|
25
|
+
| 線の脇へ離す | 15 | 19 |
|
|
26
|
+
| 端から線に沿って戻る | 22 | 26 |
|
|
27
|
+
|
|
28
|
+
線に沿って戻る距離が広がるので、縦に並ぶ箱の間隔も 4 ずつ広がる
|
|
29
|
+
(`端の字に要る線の長さ` を間隔の計算が引いているため)。
|
|
30
|
+
|
|
31
|
+
- **走る丸が端の印の中に入り、印に穴が開いたように見えた** (#988)
|
|
32
|
+
|
|
33
|
+
丸の通り道が線そのもの (`edge.d`) だったので、丸が端まで行き着いて印の上に重なっていた。
|
|
34
|
+
継承の線では輪郭だけの三角の中に濃い芯が入り、印に穴が開いたように読めた。
|
|
35
|
+
|
|
36
|
+
同じ型は点線で 1 度直している。
|
|
37
|
+
点線は端に粒が 1 つ出るので、線の方を端から 12 縮めて粒を隠した (`shrinkPathEnd`)。
|
|
38
|
+
走る丸の通り道は縮めていなかった。
|
|
39
|
+
|
|
40
|
+
通り道を両端で縮めるようにした。
|
|
41
|
+
縮める長さは **印の長さに芯の半径を足した値** で、どちらも実装の定数から導く。
|
|
42
|
+
|
|
43
|
+
| 何を | 値の出どころ |
|
|
44
|
+
|---|---|
|
|
45
|
+
| 印の長さ | `EDGE_HEAD_MARKER_SIZE.既定` |
|
|
46
|
+
| 芯の半径 | `走る丸の半径.芯` |
|
|
47
|
+
|
|
48
|
+
芯の半径を足すのは、丸の中心が印の外に出ても **芯の縁が印に掛かる** ため。
|
|
49
|
+
印の長さだけ縮めた形は実際に三角の底に芯が触れていた。
|
|
50
|
+
|
|
51
|
+
先頭を縮める処理 (`shrinkPathStart`) を、末尾を縮める処理と対にして足した。
|
|
52
|
+
曲線は最初の制御点の向きへ送る = 弦を使うと、大きく膨らむ曲線で線が端から出ていく向きと
|
|
53
|
+
別の向きになる。
|
|
54
|
+
|
|
55
|
+
**縮めると点に潰れる短い線は縮めない**。 潰れた通り道では丸が 1 点に止まって見え、
|
|
56
|
+
走っていないのと区別が付かない。
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
## [0.119.0] - 2026-10-01
|
|
60
|
+
|
|
61
|
+
### Fixed
|
|
62
|
+
|
|
63
|
+
- **線の端に添える数が、同じ端の印に貼り付いて読めた** (#984)
|
|
64
|
+
|
|
65
|
+
クラス図の多重度 (`1` / `1..*`) が、集約とコンポジションの菱の印と同じ高さに並び、
|
|
66
|
+
2 つが 1 つの塊として読めていた。
|
|
67
|
+
|
|
68
|
+
置き場所は端から線に沿って 22 戻り、線の脇へ 8 離した所に決まる。
|
|
69
|
+
22 は印の長さの最大 14 に余白 8 を足した値で、**線に沿う向きだけ** を見ていた。
|
|
70
|
+
印は直角の向きにも広がり、菱と三角は線の芯から 7 ある。
|
|
71
|
+
線の脇へ 8 しか離さないので、印の縁と字の箱の間は 1 しか空かなかった。
|
|
72
|
+
|
|
73
|
+
| 向き | 印の広がり | 字までの距離 | 空き |
|
|
74
|
+
|---|---|---|---|
|
|
75
|
+
| 線に沿う | 14 | 22 | 8 |
|
|
76
|
+
| 直角 (前) | 7 | 8 | 1 |
|
|
77
|
+
| 直角 (後) | 7 | 15 | 8 |
|
|
78
|
+
|
|
79
|
+
線の脇へ離す距離を、印の張り出し (印の縦の半分) に余白を足した値から導くようにした。
|
|
80
|
+
余白は線に沿う向きが使っているものと同じ値なので、2 つの向きで空き方が揃う。
|
|
81
|
+
|
|
82
|
+
線に沿って戻る距離 (22) は変えていない。
|
|
83
|
+
この値は箱と箱の間隔を決める計算 (`端の字に要る線の長さ`) に入っており、
|
|
84
|
+
変えると図の高さが動く。
|
|
85
|
+
|
|
86
|
+
印の大きさ (14 / 10) は `EDGE_HEAD_MARKER_SIZE` に出し、marker を定義する側と
|
|
87
|
+
字を置く側の両方が引くようにした。
|
|
88
|
+
片方に数を直に書くと、印を大きくした時に字だけが元の位置に残る。
|
|
89
|
+
|
|
90
|
+
置き場所の検査も直した。
|
|
91
|
+
箱と札と他の端の字とは突き合わせていたが、**自分の端の印とは突き合わせていなかった**。
|
|
92
|
+
2 つの箱の隙間では見えない = 字は端から線に沿って戻した所に置くので、軸ごとの離れ方の
|
|
93
|
+
大きいほう (線に沿う向きの値) が返り、直角の向きが 1 まで詰まっても同じ数字が出る。
|
|
94
|
+
詰まる側の軸だけを見る検査を足し、字を直す前の位置へ寄せ直す植え込み対照を添えた。
|
|
95
|
+
|
|
96
|
+
|
|
8
97
|
## [0.118.0] - 2026-10-01
|
|
9
98
|
|
|
10
99
|
### Fixed
|
|
@@ -4689,7 +4778,9 @@ Initial OSS release.
|
|
|
4689
4778
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
4690
4779
|
行き止まりになる。
|
|
4691
4780
|
|
|
4692
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.
|
|
4781
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.120.0...HEAD
|
|
4782
|
+
[0.120.0]: https://github.com/cardene777/cdl/compare/v0.119.0...v0.120.0
|
|
4783
|
+
[0.119.0]: https://github.com/cardene777/cdl/compare/v0.118.0...v0.119.0
|
|
4693
4784
|
[0.118.0]: https://github.com/cardene777/cdl/compare/v0.117.0...v0.118.0
|
|
4694
4785
|
[0.117.0]: https://github.com/cardene777/cdl/compare/v0.116.0...v0.117.0
|
|
4695
4786
|
[0.116.0]: https://github.com/cardene777/cdl/compare/v0.115.0...v0.116.0
|
package/dist/index.cjs
CHANGED
|
@@ -14693,6 +14693,7 @@ var EDGE_HEADS = [
|
|
|
14693
14693
|
];
|
|
14694
14694
|
var EDGE_HEAD_FILL_DEFAULT = "solid";
|
|
14695
14695
|
var EDGE_HEAD_FILLS = ["solid", "hollow"];
|
|
14696
|
+
var EDGE_HEAD_MARKER_SIZE = { \u65E2\u5B9A: 14, \u5C0F: 10 };
|
|
14696
14697
|
var EDGE_REVEALS = ["phase", "all"];
|
|
14697
14698
|
var RELATION_FOCUSES = ["off", "hover"];
|
|
14698
14699
|
var RELATION_FOCUS_DEFAULT = "off";
|
|
@@ -15438,6 +15439,32 @@ function shrinkPathEnd(d, shrinkPx) {
|
|
|
15438
15439
|
tokens[tokens.length - 1] = newEndY.toFixed(1);
|
|
15439
15440
|
return tokens.join(" ");
|
|
15440
15441
|
}
|
|
15442
|
+
function shrinkPathStart(d, shrinkPx) {
|
|
15443
|
+
const \u533A\u9593 = [...d.matchAll(/([MLCQZmlcqz])([^MLCQZmlcqz]*)/g)].map((m) => ({
|
|
15444
|
+
cmd: m[1],
|
|
15445
|
+
args: (m[2] ?? "").trim().split(/[\s,]+/).filter(Boolean).map(parseFloat)
|
|
15446
|
+
}));
|
|
15447
|
+
if (\u533A\u9593.length < 2) return d;
|
|
15448
|
+
const \u5148\u982D = \u533A\u9593[0];
|
|
15449
|
+
if (\u5148\u982D.cmd !== "M" || \u5148\u982D.args.length < 2) return d;
|
|
15450
|
+
const \u6B21 = \u533A\u9593[1];
|
|
15451
|
+
const \u5411\u304D\u5148 = \u6B21.cmd === "Q" || \u6B21.cmd === "C" ? { x: \u6B21.args[0], y: \u6B21.args[1] } : \u6B21.cmd === "L" || \u6B21.cmd === "M" ? { x: \u6B21.args[0], y: \u6B21.args[1] } : null;
|
|
15452
|
+
if (!\u5411\u304D\u5148 || !Number.isFinite(\u5411\u304D\u5148.x) || !Number.isFinite(\u5411\u304D\u5148.y)) return d;
|
|
15453
|
+
const x0 = \u5148\u982D.args[0];
|
|
15454
|
+
const y0 = \u5148\u982D.args[1];
|
|
15455
|
+
const dx = \u5411\u304D\u5148.x - x0;
|
|
15456
|
+
const dy = \u5411\u304D\u5148.y - y0;
|
|
15457
|
+
const len = Math.hypot(dx, dy);
|
|
15458
|
+
if (len < shrinkPx + 1) return d;
|
|
15459
|
+
const \u6BD4 = shrinkPx / len;
|
|
15460
|
+
const \u65B0x = x0 + dx * \u6BD4;
|
|
15461
|
+
const \u65B0y = y0 + dy * \u6BD4;
|
|
15462
|
+
const tokens = d.trim().split(/\s+/);
|
|
15463
|
+
if (tokens.length < 3) return d;
|
|
15464
|
+
tokens[1] = \u65B0x.toFixed(1);
|
|
15465
|
+
tokens[2] = \u65B0y.toFixed(1);
|
|
15466
|
+
return tokens.join(" ");
|
|
15467
|
+
}
|
|
15441
15468
|
function pathSubpath(d, progress) {
|
|
15442
15469
|
if (progress >= 1) return d;
|
|
15443
15470
|
if (progress <= 0) {
|
|
@@ -21567,10 +21594,12 @@ function recomputeContainedLanes(lanes, nodes) {
|
|
|
21567
21594
|
}
|
|
21568
21595
|
|
|
21569
21596
|
// src/layout/head-label.ts
|
|
21570
|
-
var \u7AEF\u306E\u5B57\u3092\u623B\u3059\u8DDD\u96E2 = 22;
|
|
21571
|
-
var \u7AEF\u306E\u5B57\u3068\u7DDA\u306E\u9699\u9593 = 8;
|
|
21572
21597
|
var \u7AEF\u306E\u5B57\u306E\u5927\u304D\u3055 = EDGE_LABEL_TEXT.sub.fontSize;
|
|
21573
21598
|
var \u7BB1\u306E\u9AD8\u3055 = Math.round(\u7AEF\u306E\u5B57\u306E\u5927\u304D\u3055 * 1.2);
|
|
21599
|
+
var \u7AEF\u306E\u5B57\u3068\u5370\u306E\u4F59\u767D = Math.round(\u7BB1\u306E\u9AD8\u3055 / 2);
|
|
21600
|
+
var \u7AEF\u306E\u5370\u306E\u5F35\u308A\u51FA\u3057 = EDGE_HEAD_MARKER_SIZE.\u65E2\u5B9A / 2;
|
|
21601
|
+
var \u7AEF\u306E\u5B57\u3092\u623B\u3059\u8DDD\u96E2 = EDGE_HEAD_MARKER_SIZE.\u65E2\u5B9A + \u7AEF\u306E\u5B57\u3068\u5370\u306E\u4F59\u767D;
|
|
21602
|
+
var \u7AEF\u306E\u5B57\u3068\u7DDA\u306E\u9699\u9593 = \u7AEF\u306E\u5370\u306E\u5F35\u308A\u51FA\u3057 + \u7AEF\u306E\u5B57\u3068\u5370\u306E\u4F59\u767D;
|
|
21574
21603
|
var BASELINE_RATIO = 0.8;
|
|
21575
21604
|
var \u4E21\u7AEF\u306E\u5B57\u306E\u9593 = \u7AEF\u306E\u5B57\u3092\u623B\u3059\u8DDD\u96E2 * 2;
|
|
21576
21605
|
function \u7AEF\u306E\u5B57\u306B\u8981\u308B\u7DDA\u306E\u9577\u3055(edge) {
|
|
@@ -24097,7 +24126,8 @@ function CdlEdgeView({
|
|
|
24097
24126
|
const isPassThrough = isDotted && Boolean(edge.dThrough);
|
|
24098
24127
|
const lineDotsD = isDotted ? shrinkPathEnd(edge.d, 12) : edge.d;
|
|
24099
24128
|
const glowPathId = `cdl-edge-${edge.id}`;
|
|
24100
|
-
const
|
|
24129
|
+
const \u901A\u308A\u9053\u3092\u7E2E\u3081\u308B = EDGE_HEAD_MARKER_SIZE.\u65E2\u5B9A + \u8D70\u308B\u4E38\u306E\u534A\u5F84.\u82AF;
|
|
24130
|
+
const glowPathD = shrinkPathStart(shrinkPathEnd(edge.d, \u901A\u308A\u9053\u3092\u7E2E\u3081\u308B), \u901A\u308A\u9053\u3092\u7E2E\u3081\u308B);
|
|
24101
24131
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
24102
24132
|
"g",
|
|
24103
24133
|
{
|
|
@@ -24160,7 +24190,7 @@ function CdlEdgeView({
|
|
|
24160
24190
|
}
|
|
24161
24191
|
),
|
|
24162
24192
|
flowing && !isDotted && /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-role": "edge-flow", children: [
|
|
24163
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { id: glowPathId, d:
|
|
24193
|
+
/* @__PURE__ */ jsxRuntime.jsx("path", { id: glowPathId, d: glowPathD, fill: "none", stroke: "none" }),
|
|
24164
24194
|
/* @__PURE__ */ jsxRuntime.jsx(EdgeGlowCircles, { color, edgeId: edge.id })
|
|
24165
24195
|
] })
|
|
24166
24196
|
]
|
|
@@ -24204,10 +24234,11 @@ function SolidEdgePath({
|
|
|
24204
24234
|
}
|
|
24205
24235
|
);
|
|
24206
24236
|
}
|
|
24237
|
+
var \u8D70\u308B\u4E38\u306E\u534A\u5F84 = { \u5916: 28, \u4E2D: 18, \u82AF: 11 };
|
|
24207
24238
|
function EdgeGlowCircles({ color, edgeId }) {
|
|
24208
24239
|
const ref = `#cdl-edge-${edgeId}`;
|
|
24209
24240
|
return /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-particle": edgeId, "data-cdl-particle-path-ref": ref, children: [
|
|
24210
|
-
/* @__PURE__ */ jsxRuntime.jsxs("circle", { r:
|
|
24241
|
+
/* @__PURE__ */ jsxRuntime.jsxs("circle", { r: \u8D70\u308B\u4E38\u306E\u534A\u5F84.\u5916, fill: color, children: [
|
|
24211
24242
|
/* @__PURE__ */ jsxRuntime.jsx("animateMotion", { dur: "2s", begin: "-1s", repeatCount: "indefinite", rotate: "auto", children: /* @__PURE__ */ jsxRuntime.jsx("mpath", { href: ref }) }),
|
|
24212
24243
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
24213
24244
|
"animate",
|
|
@@ -24221,7 +24252,7 @@ function EdgeGlowCircles({ color, edgeId }) {
|
|
|
24221
24252
|
}
|
|
24222
24253
|
)
|
|
24223
24254
|
] }),
|
|
24224
|
-
/* @__PURE__ */ jsxRuntime.jsxs("circle", { r:
|
|
24255
|
+
/* @__PURE__ */ jsxRuntime.jsxs("circle", { r: \u8D70\u308B\u4E38\u306E\u534A\u5F84.\u4E2D, fill: color, children: [
|
|
24225
24256
|
/* @__PURE__ */ jsxRuntime.jsx("animateMotion", { dur: "2s", begin: "-1s", repeatCount: "indefinite", rotate: "auto", children: /* @__PURE__ */ jsxRuntime.jsx("mpath", { href: ref }) }),
|
|
24226
24257
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
24227
24258
|
"animate",
|
|
@@ -24235,7 +24266,7 @@ function EdgeGlowCircles({ color, edgeId }) {
|
|
|
24235
24266
|
}
|
|
24236
24267
|
)
|
|
24237
24268
|
] }),
|
|
24238
|
-
/* @__PURE__ */ jsxRuntime.jsxs("circle", { r:
|
|
24269
|
+
/* @__PURE__ */ jsxRuntime.jsxs("circle", { r: \u8D70\u308B\u4E38\u306E\u534A\u5F84.\u82AF, fill: color, children: [
|
|
24239
24270
|
/* @__PURE__ */ jsxRuntime.jsx("animateMotion", { dur: "2s", begin: "-1s", repeatCount: "indefinite", rotate: "auto", children: /* @__PURE__ */ jsxRuntime.jsx("mpath", { href: ref }) }),
|
|
24240
24271
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
24241
24272
|
"animate",
|
|
@@ -33276,8 +33307,8 @@ function CdlStage({
|
|
|
33276
33307
|
}
|
|
33277
33308
|
return Object.entries(TONE).flatMap(
|
|
33278
33309
|
([tone, color]) => [
|
|
33279
|
-
[false,
|
|
33280
|
-
[true,
|
|
33310
|
+
[false, EDGE_HEAD_MARKER_SIZE.\u65E2\u5B9A],
|
|
33311
|
+
[true, EDGE_HEAD_MARKER_SIZE.\u5C0F]
|
|
33281
33312
|
].flatMap(
|
|
33282
33313
|
([small, size]) => EDGE_HEADS.flatMap(
|
|
33283
33314
|
(head) => EDGE_HEAD_FILLS.map((fill) => {
|