@cardenelabs/cdl 0.40.6 → 0.40.8
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 +86 -1
- package/dist/index.cjs +54 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +54 -22
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +54 -22
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +54 -22
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/kinds/axis-ticks.ts +32 -0
- package/src/kinds/chart-bar.tsx +84 -16
- package/src/kinds/chart-line.tsx +24 -8
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,89 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.40.8] - 2026-09-08
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **折れ線グラフの目盛りと軸の名前を役割名で拾えるようにした** (#755)
|
|
13
|
+
|
|
14
|
+
軸を持つ図は棒と折れ線の 2 つで、折れ線だけ縦軸の目盛りと横軸の名前に役割名が無かった。
|
|
15
|
+
|
|
16
|
+
| 字 | 棒グラフ | 折れ線グラフ (直す前) | 折れ線グラフ (直した後) |
|
|
17
|
+
|---|---|---|---|
|
|
18
|
+
| 縦軸の目盛りの数字 | `chart-bar-tick` | なし | `chart-line-tick` |
|
|
19
|
+
| 値札 | `chart-bar-value` | `chart-line-value` | `chart-line-value` |
|
|
20
|
+
| 横軸の名前 | `chart-bar-label` | なし | `chart-line-label` |
|
|
21
|
+
|
|
22
|
+
役割名が無いと字を位置か中身で拾うことになり、**図の見た目を変えていないのに検査が落ちる**。
|
|
23
|
+
位置で拾う形は余白を動かすと壊れ、中身で拾う形は同じ数が 2 か所に出ると壊れる
|
|
24
|
+
(実測で 4 件のはずが 5 件になった)。
|
|
25
|
+
|
|
26
|
+
描いたものは役割名が増えた以外 1 文字も変わらない。 円グラフと凡例を持つ図は
|
|
27
|
+
字の役割が別 (名前 / 割合 / 中央の合計) で同じ 3 つ組では表せないため、対象にしていない。
|
|
28
|
+
|
|
29
|
+
- **折れ線グラフだけ値札が軸の名前より小さかったのを揃えた** (#753)
|
|
30
|
+
|
|
31
|
+
軸を持つ図は棒と折れ線の 2 つで、この 2 つだけ大きさの順が逆だった。
|
|
32
|
+
|
|
33
|
+
| 図 | 値札 | 軸の名前 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| 棒グラフ | `12` | `11` |
|
|
36
|
+
| 折れ線グラフ (直す前) | `11` | `12` |
|
|
37
|
+
| 折れ線グラフ (直した後) | `12` | `11` |
|
|
38
|
+
|
|
39
|
+
棒を直した `#747` より前は棒も `11` / `12` で折れ線と同じだった = 逆転させたのは `#747` で、
|
|
40
|
+
片方だけ直して残りを置いていった形になっていた。
|
|
41
|
+
|
|
42
|
+
**凡例を持つ図 (半円ゲージ / 同心の弧 / 100 個の印 / 内訳の帯) は逆の順のまま**。
|
|
43
|
+
凡例では名前が行を見分ける鍵で、数値はそれに添える数になる。 軸の図では値札が印の上に
|
|
44
|
+
載る数そのもので、軸の名前は目盛りの側にある = 役割が違うので順も違ってよい。
|
|
45
|
+
|
|
46
|
+
大きさに名前を付け (`値札の級` / `軸の名前の級`)、2 図で揃っていることを検査が実物から
|
|
47
|
+
読んで確かめる。
|
|
48
|
+
|
|
49
|
+
- **目盛りの刻みの計算が 2 箇所にあったのを 1 つに寄せた** (#751)
|
|
50
|
+
|
|
51
|
+
`1 / 2 / 2.5 / 5` に 10 の累乗を掛けた中から刻みを選ぶ計算が、折れ線と棒の両方にあった。
|
|
52
|
+
折れ線が先にあり、棒を直した `#747` で同じ計算を書き足していた。
|
|
53
|
+
|
|
54
|
+
`packages/cdl/src/kinds/axis-ticks.ts` に 1 つだけ置き、両方がそこから読む。
|
|
55
|
+
引数は「範囲」 と「目盛りの本数の目安」 で、折れ線は `最大 - 最小`、
|
|
56
|
+
棒は床が必ず 0 なので `最大` を渡す。
|
|
57
|
+
|
|
58
|
+
**天井と床の決め方は寄せない** = 折れ線は床も動かし、棒は床が必ず 0 で規則が違う。
|
|
59
|
+
目盛りの数字の書き方も図ごとに残す (折れ線は `toLocaleString`、棒は桁で丸めた数)。
|
|
60
|
+
|
|
61
|
+
出る目盛りは寄せる前と 1 つも変わらない。 描画にも記法にも影響しない。
|
|
62
|
+
|
|
63
|
+
## [0.40.7] - 2026-09-08
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
|
|
67
|
+
- **棒グラフの縦軸の目盛りを人が読む数にして、棒の太さと色を直した** (#747)
|
|
68
|
+
|
|
69
|
+
見本帳の棒グラフを測ると、普通の棒グラフから外れた値が 4 つ出ていた。
|
|
70
|
+
|
|
71
|
+
| 見たもの | 直す前 | 直した後 |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| 縦軸の目盛り | `0 / 170 / 340 / 510 / 680` | `0 / 200 / 400 / 600 / 800` |
|
|
74
|
+
| 棒幅 対 隙間 | 12.7 : 1 | 2.2 : 1 |
|
|
75
|
+
| 棒の色 | 1 種類 | いちばん大きい棒だけ濃い |
|
|
76
|
+
| 角丸 | `2` (幅 126.5px に対して) | 棒幅の 6% |
|
|
77
|
+
|
|
78
|
+
原因は 2 つに分かれる。 目盛りが半端なのは最大値をそのまま天井にして 4 等分していたため
|
|
79
|
+
(`680 / 4 = 170`)、棒が太いのは隙間を `10px` の固定値にして残りを全部棒へ配っていたため。
|
|
80
|
+
|
|
81
|
+
天井は `1 / 2 / 2.5 / 5` に 10 の累乗を掛けた刻みの倍数へ切り上げる。 **天井を水増しして
|
|
82
|
+
余白は作らない** = 最大 `100` の図は `0 / 25 / 50 / 75 / 100` が正しい形で、値札が枠に
|
|
83
|
+
重ならない余白は図の上の余白が持つ。
|
|
84
|
+
|
|
85
|
+
色は 1 つのまま濃さだけを変える。 棒グラフは同じ量どうしの比較で、色は量を表さない =
|
|
86
|
+
4 本に 4 色を配ると読み手が「色に意味がある」 と誤読する余地が残る。
|
|
87
|
+
|
|
88
|
+
棒の高さの比は値の比のままで、高さから値を読む使い方は変わらない。
|
|
89
|
+
記法 (`chartData`) にも読み込みにも影響しない。
|
|
90
|
+
|
|
8
91
|
## [0.40.6] - 2026-09-08
|
|
9
92
|
|
|
10
93
|
### Fixed
|
|
@@ -1904,7 +1987,9 @@ Initial OSS release.
|
|
|
1904
1987
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
1905
1988
|
行き止まりになる。
|
|
1906
1989
|
|
|
1907
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.
|
|
1990
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.8...HEAD
|
|
1991
|
+
[0.40.8]: https://github.com/cardene777/cdl/compare/v0.40.7...v0.40.8
|
|
1992
|
+
[0.40.7]: https://github.com/cardene777/cdl/compare/v0.40.6...v0.40.7
|
|
1908
1993
|
[0.40.6]: https://github.com/cardene777/cdl/compare/v0.40.5...v0.40.6
|
|
1909
1994
|
[0.40.5]: https://github.com/cardene777/cdl/compare/v0.40.4...v0.40.5
|
|
1910
1995
|
[0.40.4]: https://github.com/cardene777/cdl/compare/v0.40.3...v0.40.4
|
package/dist/index.cjs
CHANGED
|
@@ -22422,6 +22422,19 @@ function StateDiffCard({
|
|
|
22422
22422
|
}
|
|
22423
22423
|
);
|
|
22424
22424
|
}
|
|
22425
|
+
|
|
22426
|
+
// src/kinds/axis-ticks.ts
|
|
22427
|
+
function \u76EE\u76DB\u308A\u306E\u523B\u307F(\u7BC4\u56F2, \u76EE\u5B89\u306E\u672C\u6570) {
|
|
22428
|
+
if (!(\u7BC4\u56F2 > 0) || false) return 0;
|
|
22429
|
+
const \u7C97\u3044 = \u7BC4\u56F2 / \u76EE\u5B89\u306E\u672C\u6570;
|
|
22430
|
+
const \u6841 = 10 ** Math.floor(Math.log10(\u7C97\u3044));
|
|
22431
|
+
const \u6B63\u898F = \u7C97\u3044 / \u6841;
|
|
22432
|
+
const \u5019\u88DC = \u6B63\u898F <= 1 ? 1 : \u6B63\u898F <= 2 ? 2 : \u6B63\u898F <= 2.5 ? 2.5 : \u6B63\u898F <= 5 ? 5 : 10;
|
|
22433
|
+
return \u5019\u88DC * \u6841;
|
|
22434
|
+
}
|
|
22435
|
+
var \u76EE\u76DB\u308A\u306E\u76EE\u5B89 = 4;
|
|
22436
|
+
var \u5024\u672D\u306E\u7D1A = 12;
|
|
22437
|
+
var \u8EF8\u306E\u540D\u524D\u306E\u7D1A = 11;
|
|
22425
22438
|
var \u6570\u3092\u66F8\u304F = (value) => value.toLocaleString("en-US", { maximumFractionDigits: 12 });
|
|
22426
22439
|
function \u6298\u308C\u7DDA\u306E\u76EE\u76DB(values) {
|
|
22427
22440
|
let rawMin = values.length > 0 ? Math.min(...values) : 0;
|
|
@@ -22431,11 +22444,7 @@ function \u6298\u308C\u7DDA\u306E\u76EE\u76DB(values) {
|
|
|
22431
22444
|
rawMin -= room;
|
|
22432
22445
|
rawMax += room;
|
|
22433
22446
|
}
|
|
22434
|
-
const
|
|
22435
|
-
const power = 10 ** Math.floor(Math.log10(roughStep));
|
|
22436
|
-
const fraction = roughStep / power;
|
|
22437
|
-
const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 2.5 ? 2.5 : fraction <= 5 ? 5 : 10;
|
|
22438
|
-
const step = niceFraction * power;
|
|
22447
|
+
const step = \u76EE\u76DB\u308A\u306E\u523B\u307F(rawMax - rawMin, \u76EE\u76DB\u308A\u306E\u76EE\u5B89);
|
|
22439
22448
|
const min = Math.floor(rawMin / step) * step;
|
|
22440
22449
|
const max = Math.ceil(rawMax / step) * step;
|
|
22441
22450
|
const tickCount = Math.round((max - min) / step);
|
|
@@ -22542,6 +22551,7 @@ function ChartLineNode({
|
|
|
22542
22551
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
22543
22552
|
"text",
|
|
22544
22553
|
{
|
|
22554
|
+
"data-cdl-role": "chart-line-tick",
|
|
22545
22555
|
x: PAD_LEFT2 - 8,
|
|
22546
22556
|
y: t.y + 4,
|
|
22547
22557
|
fontSize: 11,
|
|
@@ -22619,7 +22629,7 @@ function ChartLineNode({
|
|
|
22619
22629
|
"data-cdl-role": "chart-line-value",
|
|
22620
22630
|
x: cx,
|
|
22621
22631
|
y: labelY,
|
|
22622
|
-
fontSize:
|
|
22632
|
+
fontSize: \u5024\u672D\u306E\u7D1A,
|
|
22623
22633
|
fontWeight: 600,
|
|
22624
22634
|
textAnchor: "middle",
|
|
22625
22635
|
fill: "var(--cdl-text, #1a1f2a)",
|
|
@@ -22677,9 +22687,10 @@ function ChartLineNode({
|
|
|
22677
22687
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
22678
22688
|
"text",
|
|
22679
22689
|
{
|
|
22690
|
+
"data-cdl-role": "chart-line-label",
|
|
22680
22691
|
x: cx,
|
|
22681
22692
|
y: PAD_TOP2 + canvasH + 20,
|
|
22682
|
-
fontSize:
|
|
22693
|
+
fontSize: \u8EF8\u306E\u540D\u524D\u306E\u7D1A,
|
|
22683
22694
|
textAnchor: "middle",
|
|
22684
22695
|
fill: "var(--cdl-text-dim, #5a6270)",
|
|
22685
22696
|
children: d.label
|
|
@@ -25897,6 +25908,14 @@ function \u53CE\u3081\u308B\u7D1A2(\u540D\u524D\u305F\u3061, \u5E45, \u4E0A\u965
|
|
|
25897
25908
|
while (\u7D1A > \u4E0B\u9650 && Math.max(...\u540D\u524D\u305F\u3061.map((n) => textWidth(n, \u7D1A))) > \u5E45) \u7D1A -= 1;
|
|
25898
25909
|
return \u7D1A;
|
|
25899
25910
|
}
|
|
25911
|
+
function \u5C0F\u6570\u306E\u6841(n) {
|
|
25912
|
+
const [\u4EEE\u6570, \u6307\u6570] = n.toExponential().split("e");
|
|
25913
|
+
const \u5C0F\u6570\u90E8 = (\u4EEE\u6570 ?? "").split(".")[1]?.length ?? 0;
|
|
25914
|
+
return Math.min(20, Math.max(0, \u5C0F\u6570\u90E8 - Number(\u6307\u6570)));
|
|
25915
|
+
}
|
|
25916
|
+
var \u5024\u672D\u306E\u7D1A2 = 12;
|
|
25917
|
+
var \u8EF8\u306E\u540D\u524D\u306E\u7D1A2 = 11;
|
|
25918
|
+
var \u6841\u3067\u4E38\u3081\u308B = (v, \u6841) => Number(v.toFixed(\u6841));
|
|
25900
25919
|
function ChartBarNode({
|
|
25901
25920
|
node,
|
|
25902
25921
|
active,
|
|
@@ -25907,24 +25926,33 @@ function ChartBarNode({
|
|
|
25907
25926
|
const x0 = node.cx - node.w / 2;
|
|
25908
25927
|
const y0 = node.cy - node.h / 2;
|
|
25909
25928
|
const data = resolveChartData(node.chartData ?? [], stateValues);
|
|
25910
|
-
const PAD_TOP2 =
|
|
25929
|
+
const PAD_TOP2 = 34;
|
|
25911
25930
|
const PAD_RIGHT2 = 24;
|
|
25912
25931
|
const PAD_BOTTOM2 = 44;
|
|
25913
25932
|
const PAD_LEFT2 = 60;
|
|
25914
25933
|
const canvasW = node.w - PAD_LEFT2 - PAD_RIGHT2;
|
|
25915
25934
|
const canvasH = node.h - PAD_TOP2 - PAD_BOTTOM2;
|
|
25916
25935
|
const vMax = data.length > 0 ? Math.max(...data.map((d) => d.value)) : 1;
|
|
25917
|
-
const
|
|
25918
|
-
const
|
|
25936
|
+
const \u76EE\u76DB\u308A\u306E\u76EE\u5B892 = 4;
|
|
25937
|
+
const \u5929\u4E95\u306E\u3082\u3068 = vMax > 0 ? vMax : 1;
|
|
25938
|
+
const \u523B\u307F = \u76EE\u76DB\u308A\u306E\u523B\u307F(\u5929\u4E95\u306E\u3082\u3068, \u76EE\u76DB\u308A\u306E\u76EE\u5B892);
|
|
25939
|
+
const \u523B\u307F\u306E\u6841 = \u5C0F\u6570\u306E\u6841(\u523B\u307F);
|
|
25940
|
+
const \u5929\u4E95 = \u6841\u3067\u4E38\u3081\u308B(Math.ceil(\u5929\u4E95\u306E\u3082\u3068 / \u523B\u307F - 1e-9) * \u523B\u307F, \u523B\u307F\u306E\u6841);
|
|
25941
|
+
const \u68D2\u3068\u9699\u9593\u306E\u6BD4 = 2.2;
|
|
25942
|
+
const \u68D2\u306E\u4E0A\u9650 = 96;
|
|
25919
25943
|
const barCount = data.length || 1;
|
|
25920
|
-
const
|
|
25921
|
-
const
|
|
25944
|
+
const \u5358\u4F4D = canvasW / (barCount * \u68D2\u3068\u9699\u9593\u306E\u6BD4 + (barCount + 1));
|
|
25945
|
+
const barW = Math.max(0, Math.min(\u5358\u4F4D * \u68D2\u3068\u9699\u9593\u306E\u6BD4, \u68D2\u306E\u4E0A\u9650));
|
|
25946
|
+
const barGap = (canvasW - barW * barCount) / (barCount + 1);
|
|
25947
|
+
const yAt = (v) => PAD_TOP2 + canvasH - v / \u5929\u4E95 * canvasH;
|
|
25922
25948
|
const xAt = (idx) => PAD_LEFT2 + barGap + idx * (barW + barGap);
|
|
25923
|
-
const
|
|
25924
|
-
const gridTicks = Array.from({ length:
|
|
25925
|
-
const v =
|
|
25949
|
+
const \u76EE\u76DB\u308A\u306E\u672C\u6570 = Math.round(\u5929\u4E95 / \u523B\u307F);
|
|
25950
|
+
const gridTicks = Array.from({ length: \u76EE\u76DB\u308A\u306E\u672C\u6570 + 1 }, (_, i) => {
|
|
25951
|
+
const v = \u6841\u3067\u4E38\u3081\u308B(\u523B\u307F * i, \u523B\u307F\u306E\u6841);
|
|
25926
25952
|
return { y: yAt(v), value: v };
|
|
25927
25953
|
});
|
|
25954
|
+
const \u6FC3\u3055 = (v) => vMax > 0 ? v >= vMax ? 1 : 0.45 : 0.9;
|
|
25955
|
+
const \u89D2\u4E38 = Math.min(barW * 0.06, 8);
|
|
25928
25956
|
const \u4F38\u3073 = \u9032\u307F\u3092\u7573\u3080(drawing, progress);
|
|
25929
25957
|
const \u6A2A\u8EF8\u306Ey = PAD_TOP2 + canvasH;
|
|
25930
25958
|
return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
|
|
@@ -25959,12 +25987,13 @@ function ChartBarNode({
|
|
|
25959
25987
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
25960
25988
|
"text",
|
|
25961
25989
|
{
|
|
25990
|
+
"data-cdl-role": "chart-bar-tick",
|
|
25962
25991
|
x: PAD_LEFT2 - 8,
|
|
25963
25992
|
y: t.y + 4,
|
|
25964
25993
|
fontSize: 11,
|
|
25965
25994
|
textAnchor: "end",
|
|
25966
25995
|
fill: "var(--cdl-text-dim, #5a6270)",
|
|
25967
|
-
children:
|
|
25996
|
+
children: t.value
|
|
25968
25997
|
}
|
|
25969
25998
|
)
|
|
25970
25999
|
] }, `grid-${i}`)),
|
|
@@ -25982,7 +26011,7 @@ function ChartBarNode({
|
|
|
25982
26011
|
data.map((d, idx) => {
|
|
25983
26012
|
const bx = xAt(idx);
|
|
25984
26013
|
const by = yAt(d.value);
|
|
25985
|
-
const bh = PAD_TOP2 + canvasH - by;
|
|
26014
|
+
const bh = Math.max(0, PAD_TOP2 + canvasH - by);
|
|
25986
26015
|
const \u898B\u3048\u3066\u3044\u308B\u982D = \u6A2A\u8EF8\u306Ey - (\u6A2A\u8EF8\u306Ey - by) * \u4F38\u3073;
|
|
25987
26016
|
const \u68D2 = /* @__PURE__ */ jsxRuntime.jsx(
|
|
25988
26017
|
"rect",
|
|
@@ -25993,9 +26022,9 @@ function ChartBarNode({
|
|
|
25993
26022
|
y: by,
|
|
25994
26023
|
width: barW,
|
|
25995
26024
|
height: bh,
|
|
25996
|
-
rx:
|
|
26025
|
+
rx: \u89D2\u4E38,
|
|
25997
26026
|
fill: "var(--cdl-tone-accent, #2d6a8f)",
|
|
25998
|
-
fillOpacity:
|
|
26027
|
+
fillOpacity: \u6FC3\u3055(d.value)
|
|
25999
26028
|
}
|
|
26000
26029
|
);
|
|
26001
26030
|
return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
|
|
@@ -26003,9 +26032,11 @@ function ChartBarNode({
|
|
|
26003
26032
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
26004
26033
|
"text",
|
|
26005
26034
|
{
|
|
26035
|
+
"data-cdl-role": "chart-bar-value",
|
|
26006
26036
|
x: bx + barW / 2,
|
|
26007
|
-
y: \u898B\u3048\u3066\u3044\u308B\u982D -
|
|
26008
|
-
fontSize:
|
|
26037
|
+
y: \u898B\u3048\u3066\u3044\u308B\u982D - 8,
|
|
26038
|
+
fontSize: \u5024\u672D\u306E\u7D1A2,
|
|
26039
|
+
fontWeight: 600,
|
|
26009
26040
|
textAnchor: "middle",
|
|
26010
26041
|
fill: "var(--cdl-text, #1a1f2a)",
|
|
26011
26042
|
children: d.value.toLocaleString()
|
|
@@ -26014,9 +26045,10 @@ function ChartBarNode({
|
|
|
26014
26045
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
26015
26046
|
"text",
|
|
26016
26047
|
{
|
|
26048
|
+
"data-cdl-role": "chart-bar-label",
|
|
26017
26049
|
x: bx + barW / 2,
|
|
26018
26050
|
y: PAD_TOP2 + canvasH + 18,
|
|
26019
|
-
fontSize:
|
|
26051
|
+
fontSize: \u8EF8\u306E\u540D\u524D\u306E\u7D1A2,
|
|
26020
26052
|
textAnchor: "middle",
|
|
26021
26053
|
fill: "var(--cdl-text-dim, #5a6270)",
|
|
26022
26054
|
children: d.label
|