@cardenelabs/cdl 0.40.6 → 0.40.7

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 CHANGED
@@ -5,6 +5,34 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.40.7] - 2026-09-08
9
+
10
+ ### Changed
11
+
12
+ - **棒グラフの縦軸の目盛りを人が読む数にして、棒の太さと色を直した** (#747)
13
+
14
+ 見本帳の棒グラフを測ると、普通の棒グラフから外れた値が 4 つ出ていた。
15
+
16
+ | 見たもの | 直す前 | 直した後 |
17
+ |---|---|---|
18
+ | 縦軸の目盛り | `0 / 170 / 340 / 510 / 680` | `0 / 200 / 400 / 600 / 800` |
19
+ | 棒幅 対 隙間 | 12.7 : 1 | 2.2 : 1 |
20
+ | 棒の色 | 1 種類 | いちばん大きい棒だけ濃い |
21
+ | 角丸 | `2` (幅 126.5px に対して) | 棒幅の 6% |
22
+
23
+ 原因は 2 つに分かれる。 目盛りが半端なのは最大値をそのまま天井にして 4 等分していたため
24
+ (`680 / 4 = 170`)、棒が太いのは隙間を `10px` の固定値にして残りを全部棒へ配っていたため。
25
+
26
+ 天井は `1 / 2 / 2.5 / 5` に 10 の累乗を掛けた刻みの倍数へ切り上げる。 **天井を水増しして
27
+ 余白は作らない** = 最大 `100` の図は `0 / 25 / 50 / 75 / 100` が正しい形で、値札が枠に
28
+ 重ならない余白は図の上の余白が持つ。
29
+
30
+ 色は 1 つのまま濃さだけを変える。 棒グラフは同じ量どうしの比較で、色は量を表さない =
31
+ 4 本に 4 色を配ると読み手が「色に意味がある」 と誤読する余地が残る。
32
+
33
+ 棒の高さの比は値の比のままで、高さから値を読む使い方は変わらない。
34
+ 記法 (`chartData`) にも読み込みにも影響しない。
35
+
8
36
  ## [0.40.6] - 2026-09-08
9
37
 
10
38
  ### Fixed
@@ -1904,7 +1932,8 @@ Initial OSS release.
1904
1932
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
1905
1933
  行き止まりになる。
1906
1934
 
1907
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.6...HEAD
1935
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.7...HEAD
1936
+ [0.40.7]: https://github.com/cardene777/cdl/compare/v0.40.6...v0.40.7
1908
1937
  [0.40.6]: https://github.com/cardene777/cdl/compare/v0.40.5...v0.40.6
1909
1938
  [0.40.5]: https://github.com/cardene777/cdl/compare/v0.40.4...v0.40.5
1910
1939
  [0.40.4]: https://github.com/cardene777/cdl/compare/v0.40.3...v0.40.4
package/dist/index.cjs CHANGED
@@ -25897,6 +25897,20 @@ function \u53CE\u3081\u308B\u7D1A2(\u540D\u524D\u305F\u3061, \u5E45, \u4E0A\u965
25897
25897
  while (\u7D1A > \u4E0B\u9650 && Math.max(...\u540D\u524D\u305F\u3061.map((n) => textWidth(n, \u7D1A))) > \u5E45) \u7D1A -= 1;
25898
25898
  return \u7D1A;
25899
25899
  }
25900
+ function \u76EE\u76DB\u308A\u306E\u523B\u307F(\u6700\u5927, \u76EE\u5B89\u306E\u672C\u6570) {
25901
+ if (!(\u6700\u5927 > 0) || false) return 0;
25902
+ const \u7C97\u3044 = \u6700\u5927 / \u76EE\u5B89\u306E\u672C\u6570;
25903
+ const \u6841 = 10 ** Math.floor(Math.log10(\u7C97\u3044));
25904
+ const \u6B63\u898F = \u7C97\u3044 / \u6841;
25905
+ const \u5019\u88DC = \u6B63\u898F <= 1 ? 1 : \u6B63\u898F <= 2 ? 2 : \u6B63\u898F <= 2.5 ? 2.5 : \u6B63\u898F <= 5 ? 5 : 10;
25906
+ return \u5019\u88DC * \u6841;
25907
+ }
25908
+ function \u5C0F\u6570\u306E\u6841(n) {
25909
+ const [\u4EEE\u6570, \u6307\u6570] = n.toExponential().split("e");
25910
+ const \u5C0F\u6570\u90E8 = (\u4EEE\u6570 ?? "").split(".")[1]?.length ?? 0;
25911
+ return Math.min(20, Math.max(0, \u5C0F\u6570\u90E8 - Number(\u6307\u6570)));
25912
+ }
25913
+ var \u6841\u3067\u4E38\u3081\u308B = (v, \u6841) => Number(v.toFixed(\u6841));
25900
25914
  function ChartBarNode({
25901
25915
  node,
25902
25916
  active,
@@ -25907,24 +25921,33 @@ function ChartBarNode({
25907
25921
  const x0 = node.cx - node.w / 2;
25908
25922
  const y0 = node.cy - node.h / 2;
25909
25923
  const data = resolveChartData(node.chartData ?? [], stateValues);
25910
- const PAD_TOP2 = 20;
25924
+ const PAD_TOP2 = 34;
25911
25925
  const PAD_RIGHT2 = 24;
25912
25926
  const PAD_BOTTOM2 = 44;
25913
25927
  const PAD_LEFT2 = 60;
25914
25928
  const canvasW = node.w - PAD_LEFT2 - PAD_RIGHT2;
25915
25929
  const canvasH = node.h - PAD_TOP2 - PAD_BOTTOM2;
25916
25930
  const vMax = data.length > 0 ? Math.max(...data.map((d) => d.value)) : 1;
25917
- const vRange = vMax || 1;
25918
- const barGap = 10;
25931
+ const \u76EE\u76DB\u308A\u306E\u76EE\u5B89 = 4;
25932
+ const \u5929\u4E95\u306E\u3082\u3068 = vMax > 0 ? vMax : 1;
25933
+ const \u523B\u307F = \u76EE\u76DB\u308A\u306E\u523B\u307F(\u5929\u4E95\u306E\u3082\u3068, \u76EE\u76DB\u308A\u306E\u76EE\u5B89);
25934
+ const \u523B\u307F\u306E\u6841 = \u5C0F\u6570\u306E\u6841(\u523B\u307F);
25935
+ 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);
25936
+ const \u68D2\u3068\u9699\u9593\u306E\u6BD4 = 2.2;
25937
+ const \u68D2\u306E\u4E0A\u9650 = 96;
25919
25938
  const barCount = data.length || 1;
25920
- const barW = (canvasW - barGap * (barCount + 1)) / barCount;
25921
- const yAt = (v) => PAD_TOP2 + canvasH - v / vRange * canvasH;
25939
+ const \u5358\u4F4D = canvasW / (barCount * \u68D2\u3068\u9699\u9593\u306E\u6BD4 + (barCount + 1));
25940
+ const barW = Math.max(0, Math.min(\u5358\u4F4D * \u68D2\u3068\u9699\u9593\u306E\u6BD4, \u68D2\u306E\u4E0A\u9650));
25941
+ const barGap = (canvasW - barW * barCount) / (barCount + 1);
25942
+ const yAt = (v) => PAD_TOP2 + canvasH - v / \u5929\u4E95 * canvasH;
25922
25943
  const xAt = (idx) => PAD_LEFT2 + barGap + idx * (barW + barGap);
25923
- const gridCount = 4;
25924
- const gridTicks = Array.from({ length: gridCount + 1 }, (_, i) => {
25925
- const v = vMax * i / gridCount;
25944
+ const \u76EE\u76DB\u308A\u306E\u672C\u6570 = Math.round(\u5929\u4E95 / \u523B\u307F);
25945
+ const gridTicks = Array.from({ length: \u76EE\u76DB\u308A\u306E\u672C\u6570 + 1 }, (_, i) => {
25946
+ const v = \u6841\u3067\u4E38\u3081\u308B(\u523B\u307F * i, \u523B\u307F\u306E\u6841);
25926
25947
  return { y: yAt(v), value: v };
25927
25948
  });
25949
+ const \u6FC3\u3055 = (v) => vMax > 0 ? v >= vMax ? 1 : 0.45 : 0.9;
25950
+ const \u89D2\u4E38 = Math.min(barW * 0.06, 8);
25928
25951
  const \u4F38\u3073 = \u9032\u307F\u3092\u7573\u3080(drawing, progress);
25929
25952
  const \u6A2A\u8EF8\u306Ey = PAD_TOP2 + canvasH;
25930
25953
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
@@ -25959,12 +25982,13 @@ function ChartBarNode({
25959
25982
  /* @__PURE__ */ jsxRuntime.jsx(
25960
25983
  "text",
25961
25984
  {
25985
+ "data-cdl-role": "chart-bar-tick",
25962
25986
  x: PAD_LEFT2 - 8,
25963
25987
  y: t.y + 4,
25964
25988
  fontSize: 11,
25965
25989
  textAnchor: "end",
25966
25990
  fill: "var(--cdl-text-dim, #5a6270)",
25967
- children: Math.round(t.value)
25991
+ children: t.value
25968
25992
  }
25969
25993
  )
25970
25994
  ] }, `grid-${i}`)),
@@ -25982,7 +26006,7 @@ function ChartBarNode({
25982
26006
  data.map((d, idx) => {
25983
26007
  const bx = xAt(idx);
25984
26008
  const by = yAt(d.value);
25985
- const bh = PAD_TOP2 + canvasH - by;
26009
+ const bh = Math.max(0, PAD_TOP2 + canvasH - by);
25986
26010
  const \u898B\u3048\u3066\u3044\u308B\u982D = \u6A2A\u8EF8\u306Ey - (\u6A2A\u8EF8\u306Ey - by) * \u4F38\u3073;
25987
26011
  const \u68D2 = /* @__PURE__ */ jsxRuntime.jsx(
25988
26012
  "rect",
@@ -25993,9 +26017,9 @@ function ChartBarNode({
25993
26017
  y: by,
25994
26018
  width: barW,
25995
26019
  height: bh,
25996
- rx: 2,
26020
+ rx: \u89D2\u4E38,
25997
26021
  fill: "var(--cdl-tone-accent, #2d6a8f)",
25998
- fillOpacity: 0.9
26022
+ fillOpacity: \u6FC3\u3055(d.value)
25999
26023
  }
26000
26024
  );
26001
26025
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
@@ -26003,9 +26027,11 @@ function ChartBarNode({
26003
26027
  /* @__PURE__ */ jsxRuntime.jsx(
26004
26028
  "text",
26005
26029
  {
26030
+ "data-cdl-role": "chart-bar-value",
26006
26031
  x: bx + barW / 2,
26007
- y: \u898B\u3048\u3066\u3044\u308B\u982D - 6,
26008
- fontSize: 11,
26032
+ y: \u898B\u3048\u3066\u3044\u308B\u982D - 8,
26033
+ fontSize: 12,
26034
+ fontWeight: 600,
26009
26035
  textAnchor: "middle",
26010
26036
  fill: "var(--cdl-text, #1a1f2a)",
26011
26037
  children: d.value.toLocaleString()
@@ -26014,9 +26040,10 @@ function ChartBarNode({
26014
26040
  /* @__PURE__ */ jsxRuntime.jsx(
26015
26041
  "text",
26016
26042
  {
26043
+ "data-cdl-role": "chart-bar-label",
26017
26044
  x: bx + barW / 2,
26018
26045
  y: PAD_TOP2 + canvasH + 18,
26019
- fontSize: 12,
26046
+ fontSize: 11,
26020
26047
  textAnchor: "middle",
26021
26048
  fill: "var(--cdl-text-dim, #5a6270)",
26022
26049
  children: d.label