@cardenelabs/cdl 0.40.10 → 0.40.11

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,37 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.40.11] - 2026-09-09
9
+
10
+ ### Fixed
11
+
12
+ - **棒 / 弧 / 半円 が受け取った前の時点の値を描くようにした** (#767)
13
+
14
+ `previous` を読むのは円 / 内訳の帯 / 2 時点の線 / 数値ひとつの図の 4 種だけで、残る
15
+ 3 種は **受け取っておきながら 1 度も読んでいなかった**。 数値ひとつの図で同じ抜けを
16
+ 直したのが `#763` で、そちらは画面に出る文字の数の記録が落ちて初めて見つかっている。
17
+
18
+ 下流の見本帳が 49 組を描き比べて残りを洗い出した。
19
+
20
+ | 種別 | 置き方 | 役割名 |
21
+ |---|---|---|
22
+ | 棒 | 棒の上に、前の高さを指す印を 1 本引く | `chart-bar-previous` |
23
+ | 弧 | 弧の帯を横切る印を、前の割合の角度に置く | `chart-radial-previous` |
24
+ | 半円 | 内側に前の内訳の輪を 1 本足す | `chart-gauge-previous` |
25
+
26
+ **薄い色で後ろに重ねる形は採らない**。 前が今より小さい件で今の形に完全に隠れ、1 px も
27
+ 見えなくなる。 棒と弧は 1 件が 1 本なので印を引き、半円は件を積んで合計を出す図
28
+ (半分の円グラフ) なので円グラフ (`#679`) と同じく内側の輪にする。
29
+
30
+ 棒は縦軸の天井を前の時点まで含めて決めるようにした。 含めないと、前が今より大きい件で
31
+ 印が枠の外へ出る。
32
+
33
+ 書かない図では役割を 1 つも出さず、半円の輪の太さも変わらない。
34
+
35
+ 対象外が 4 つある。 折れ線の `previous` (横軸そのものが時の流れで、点ごとの前の時点は
36
+ 線の中に既にある)、100 個の印の `previous` (印が 200 個になり 100 個で読む前提が崩れる)、
37
+ 折れ線の `tone` (線は 1 本 1 色)、棒の `tone` (`#747` が 1 色 + 濃さと決めた形)。
38
+
8
39
  ## [0.40.10] - 2026-09-08
9
40
 
10
41
  ### Fixed
@@ -2032,7 +2063,8 @@ Initial OSS release.
2032
2063
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
2033
2064
  行き止まりになる。
2034
2065
 
2035
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.10...HEAD
2066
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.11...HEAD
2067
+ [0.40.11]: https://github.com/cardene777/cdl/compare/v0.40.10...v0.40.11
2036
2068
  [0.40.10]: https://github.com/cardene777/cdl/compare/v0.40.9...v0.40.10
2037
2069
  [0.40.9]: https://github.com/cardene777/cdl/compare/v0.40.8...v0.40.9
2038
2070
  [0.40.8]: https://github.com/cardene777/cdl/compare/v0.40.7...v0.40.8
package/dist/index.cjs CHANGED
@@ -24961,18 +24961,35 @@ function ChartGaugeNode({
24961
24961
  const \u5185\u534A\u5F84 = radius * 0.62;
24962
24962
  const cx = node.w / 2;
24963
24963
  const cy = PAD_TOP2 + radius;
24964
+ const \u524D\u3042\u308A = \u51FA\u3059\u4EF6\u305F\u3061.some((d) => d.previous !== void 0);
24965
+ const \u524D\u306E\u5024 = \u51FA\u3059\u4EF6\u305F\u3061.map((d) => Math.max(0, d.previous ?? 0));
24966
+ const \u524D\u306E\u5408\u8A08 = \u524D\u306E\u5024.reduce((acc, v) => acc + v, 0);
24967
+ const \u5E2F = radius - \u5185\u534A\u5F84;
24968
+ const \u4ECA\u306E\u5185\u534A\u5F84 = \u524D\u3042\u308A ? \u5185\u534A\u5F84 + \u5E2F * 0.42 : \u5185\u534A\u5F84;
24969
+ const \u524D\u306E\u5185\u534A\u5F84 = \u5185\u534A\u5F84;
24970
+ const \u524D\u306E\u5916\u534A\u5F84 = \u5185\u534A\u5F84 + \u5E2F * 0.32;
24971
+ const \u6247\u306E\u9053 = (a0, a1, \u5185, \u5916) => {
24972
+ const \u59161 = \u6975(cx, cy, \u5916, a0);
24973
+ const \u59162 = \u6975(cx, cy, \u5916, a1);
24974
+ const \u51852 = \u6975(cx, cy, \u5185, a1);
24975
+ const \u51851 = \u6975(cx, cy, \u5185, a0);
24976
+ return `M ${\u59161.x} ${\u59161.y} A ${\u5916} ${\u5916} 0 0 1 ${\u59162.x} ${\u59162.y} L ${\u51852.x} ${\u51852.y} A ${\u5185} ${\u5185} 0 0 0 ${\u51851.x} ${\u51851.y} Z`;
24977
+ };
24964
24978
  let cumFrac = 0;
24965
24979
  const slices = \u51FA\u3059\u4EF6\u305F\u3061.map((d) => {
24966
24980
  const frac = d.value / total;
24967
24981
  const a0 = Math.PI + cumFrac * Math.PI;
24968
24982
  const a1 = a0 + frac * Math.PI;
24969
24983
  cumFrac += frac;
24970
- const \u59161 = \u6975(cx, cy, radius, a0);
24971
- const \u59162 = \u6975(cx, cy, radius, a1);
24972
- const \u51852 = \u6975(cx, cy, \u5185\u534A\u5F84, a1);
24973
- const \u51851 = \u6975(cx, cy, \u5185\u534A\u5F84, a0);
24974
- const path = `M ${\u59161.x} ${\u59161.y} A ${radius} ${radius} 0 0 1 ${\u59162.x} ${\u59162.y} L ${\u51852.x} ${\u51852.y} A ${\u5185\u534A\u5F84} ${\u5185\u534A\u5F84} 0 0 0 ${\u51851.x} ${\u51851.y} Z`;
24975
- return { d, frac, path };
24984
+ return { d, frac, path: \u6247\u306E\u9053(a0, a1, \u4ECA\u306E\u5185\u534A\u5F84, radius) };
24985
+ });
24986
+ let \u524D\u306Ecum = 0;
24987
+ const \u524D\u306E\u6247\u305F\u3061 = \u51FA\u3059\u4EF6\u305F\u3061.map((d, idx) => {
24988
+ const frac = \u524D\u306E\u5408\u8A08 > 0 ? (\u524D\u306E\u5024[idx] ?? 0) / \u524D\u306E\u5408\u8A08 : 0;
24989
+ const a0 = Math.PI + \u524D\u306Ecum * Math.PI;
24990
+ const a1 = a0 + frac * Math.PI;
24991
+ \u524D\u306Ecum += frac;
24992
+ return { d, frac, path: \u6247\u306E\u9053(a0, a1, \u524D\u306E\u5185\u534A\u5F84, \u524D\u306E\u5916\u534A\u5F84) };
24976
24993
  });
24977
24994
  const \u5408\u8A08\u306E\u6587\u5B57 = \u5B9F\u5024\u8868\u8A18(Math.round(total));
24978
24995
  const \u5358\u4F4D\u5E45 = Math.max(textWidth(\u5408\u8A08\u306E\u6587\u5B57, 100), 1) / 100;
@@ -25001,6 +25018,20 @@ function ChartGaugeNode({
25001
25018
  },
25002
25019
  `arc-${idx}`
25003
25020
  ));
25021
+ const \u524D\u306E\u5F27\u305F\u3061 = \u524D\u3042\u308A ? \u524D\u306E\u6247\u305F\u3061.map((s, idx) => /* @__PURE__ */ jsxRuntime.jsx(
25022
+ "path",
25023
+ {
25024
+ "data-cdl-role": "chart-gauge-previous",
25025
+ "data-cdl-unresolved": s.d.unresolved ? "true" : void 0,
25026
+ d: s.path,
25027
+ fill: arcColor(s.d.tone, idx),
25028
+ fillOpacity: 0.45,
25029
+ stroke: "var(--cdl-node-fill, #ffffff)",
25030
+ strokeWidth: 1.5,
25031
+ strokeLinejoin: "round"
25032
+ },
25033
+ `prev-arc-${idx}`
25034
+ )) : null;
25004
25035
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
25005
25036
  /* @__PURE__ */ jsxRuntime.jsx(
25006
25037
  "rect",
@@ -25017,7 +25048,13 @@ function ChartGaugeNode({
25017
25048
  }
25018
25049
  ),
25019
25050
  drawing && /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: \u5207\u308A\u629C\u304Did, children: \u6247\u5F62\u306E\u5207\u308A\u629C\u304D(cx, cy, radius + 2, \u4F38\u3073, Math.PI, Math.PI) }) }),
25020
- drawing ? /* @__PURE__ */ jsxRuntime.jsx("g", { clipPath: `url(#${\u5207\u308A\u629C\u304Did})`, children: \u5F27\u305F\u3061 }) : \u5F27\u305F\u3061,
25051
+ drawing ? /* @__PURE__ */ jsxRuntime.jsxs("g", { clipPath: `url(#${\u5207\u308A\u629C\u304Did})`, children: [
25052
+ \u524D\u306E\u5F27\u305F\u3061,
25053
+ \u5F27\u305F\u3061
25054
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
25055
+ \u524D\u306E\u5F27\u305F\u3061,
25056
+ \u5F27\u305F\u3061
25057
+ ] }),
25021
25058
  /* @__PURE__ */ jsxRuntime.jsx(
25022
25059
  "text",
25023
25060
  {
@@ -25126,9 +25163,11 @@ function ChartRadialNode({
25126
25163
  const rings = data.map((d, idx) => {
25127
25164
  const frac = d.value / total;
25128
25165
  const \u4E2D\u5FC3\u534A\u5F84 = \u5916\u534A\u5F84 - \u5E2F1\u672C * idx - \u5E2F1\u672C / 2;
25166
+ const \u524D\u306E\u5272\u5408 = d.previous === void 0 ? null : Math.max(0, d.previous) / total;
25129
25167
  return {
25130
25168
  d,
25131
25169
  frac,
25170
+ \u524D\u306E\u5272\u5408,
25132
25171
  \u4E2D\u5FC3\u534A\u5F84,
25133
25172
  // 軌道は全周。 1 周ちょうどは弧で表せないので、 わずかに欠かして描く
25134
25173
  \u8ECC\u9053: \u5F27\u306E\u90532(\u5F27\u306Ecx, cy, \u4E2D\u5FC3\u534A\u5F84, \u5E2F\u306E\u5E45, 0.9999),
@@ -25177,6 +25216,20 @@ function ChartRadialNode({
25177
25216
  )),
25178
25217
  drawing && /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: \u5207\u308A\u629C\u304Did, children: \u6247\u5F62\u306E\u5207\u308A\u629C\u304D(\u5F27\u306Ecx, cy, \u5916\u534A\u5F84 + \u5E2F\u306E\u5E45, \u958B\u304D) }) }),
25179
25218
  drawing ? /* @__PURE__ */ jsxRuntime.jsx("g", { clipPath: `url(#${\u5207\u308A\u629C\u304Did})`, children: \u53D6\u308A\u5206\u305F\u3061 }) : \u53D6\u308A\u5206\u305F\u3061,
25219
+ rings.map(
25220
+ (r, idx) => r.\u524D\u306E\u5272\u5408 === null ? null : /* @__PURE__ */ jsxRuntime.jsx(
25221
+ "line",
25222
+ {
25223
+ "data-cdl-role": "chart-radial-previous",
25224
+ "data-cdl-unresolved": r.d.unresolved ? "true" : void 0,
25225
+ ...\u5E2F\u3092\u6A2A\u5207\u308B\u5370(\u5F27\u306Ecx, cy, r.\u4E2D\u5FC3\u534A\u5F84, \u5E2F\u306E\u5E45, Math.min(r.\u524D\u306E\u5272\u5408, 0.9999)),
25226
+ stroke: "var(--cdl-text-mute, #8a8678)",
25227
+ strokeWidth: 2,
25228
+ strokeLinecap: "round"
25229
+ },
25230
+ `prev-${idx}`
25231
+ )
25232
+ ),
25180
25233
  data.map((d, idx) => {
25181
25234
  const y = \u4E00\u89A7\u306E\u59CB\u307E\u308A + \u884C\u306E\u9AD8\u3055 * idx;
25182
25235
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-role": "chart-radial-item", children: [
@@ -25216,6 +25269,18 @@ function \u5F27\u306E\u90532(cx, cy, \u4E2D\u5FC3\u534A\u5F84, \u5E45, \u5272\u5
25216
25269
  const p = (r, a) => `${cx + r * Math.cos(a)} ${cy + r * Math.sin(a)}`;
25217
25270
  return `M ${p(\u5916, a0)} A ${\u5916} ${\u5916} 0 ${large} 1 ${p(\u5916, a1)} L ${p(\u5185, a1)} A ${\u5185} ${\u5185} 0 ${large} 0 ${p(\u5185, a0)} Z`;
25218
25271
  }
25272
+ function \u5E2F\u3092\u6A2A\u5207\u308B\u5370(cx, cy, \u4E2D\u5FC3\u534A\u5F84, \u5E45, \u5272\u5408) {
25273
+ const \u306F\u307F\u51FA\u3057 = Math.min(\u5E45 * 0.3, 5);
25274
+ const \u5916 = \u4E2D\u5FC3\u534A\u5F84 + \u5E45 / 2 + \u306F\u307F\u51FA\u3057;
25275
+ const \u5185 = Math.max(0.5, \u4E2D\u5FC3\u534A\u5F84 - \u5E45 / 2 - \u306F\u307F\u51FA\u3057);
25276
+ const a = -Math.PI / 2 + \u5272\u5408 * Math.PI * 2;
25277
+ return {
25278
+ x1: cx + \u5185 * Math.cos(a),
25279
+ y1: cy + \u5185 * Math.sin(a),
25280
+ x2: cx + \u5916 * Math.cos(a),
25281
+ y2: cy + \u5916 * Math.sin(a)
25282
+ };
25283
+ }
25219
25284
  function arcColor2(tone, idx) {
25220
25285
  if (tone) return TONE[tone];
25221
25286
  return chartSeriesColor(idx);
@@ -25966,8 +26031,9 @@ function ChartBarNode({
25966
26031
  const canvasW = node.w - PAD_LEFT2 - PAD_RIGHT2;
25967
26032
  const canvasH = node.h - PAD_TOP2 - PAD_BOTTOM2;
25968
26033
  const vMax = data.length > 0 ? Math.max(...data.map((d) => d.value)) : 1;
26034
+ const \u8EF8\u306E\u3082\u3068 = data.length > 0 ? Math.max(vMax, ...data.map((d) => d.previous ?? 0)) : vMax;
25969
26035
  const \u76EE\u76DB\u308A\u306E\u76EE\u5B892 = 4;
25970
- const \u5929\u4E95\u306E\u3082\u3068 = vMax > 0 ? vMax : 1;
26036
+ const \u5929\u4E95\u306E\u3082\u3068 = \u8EF8\u306E\u3082\u3068 > 0 ? \u8EF8\u306E\u3082\u3068 : 1;
25971
26037
  const \u523B\u307F = \u76EE\u76DB\u308A\u306E\u523B\u307F(\u5929\u4E95\u306E\u3082\u3068, \u76EE\u76DB\u308A\u306E\u76EE\u5B892);
25972
26038
  const \u523B\u307F\u306E\u6841 = \u5C0F\u6570\u306E\u6841(\u523B\u307F);
25973
26039
  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);
@@ -26060,8 +26126,24 @@ function ChartBarNode({
26060
26126
  fillOpacity: \u6FC3\u3055(d.value)
26061
26127
  }
26062
26128
  );
26129
+ const \u5370\u306E\u306F\u307F\u51FA\u3057 = Math.min(barW * 0.18, 8);
26130
+ const \u524D\u306E\u5370 = d.previous === void 0 ? null : /* @__PURE__ */ jsxRuntime.jsx(
26131
+ "line",
26132
+ {
26133
+ "data-cdl-role": "chart-bar-previous",
26134
+ "data-cdl-unresolved": d.unresolved ? "true" : void 0,
26135
+ x1: bx - \u5370\u306E\u306F\u307F\u51FA\u3057,
26136
+ y1: yAt(Math.max(0, d.previous)),
26137
+ x2: bx + barW + \u5370\u306E\u306F\u307F\u51FA\u3057,
26138
+ y2: yAt(Math.max(0, d.previous)),
26139
+ stroke: "var(--cdl-text-mute, #8a8678)",
26140
+ strokeWidth: 1.5,
26141
+ strokeDasharray: "5 3"
26142
+ }
26143
+ );
26063
26144
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
26064
26145
  drawing ? /* @__PURE__ */ jsxRuntime.jsx("g", { transform: `translate(0 ${\u6A2A\u8EF8\u306Ey}) scale(1 ${\u4F38\u3073}) translate(0 ${-\u6A2A\u8EF8\u306Ey})`, children: \u68D2 }) : \u68D2,
26146
+ \u524D\u306E\u5370,
26065
26147
  /* @__PURE__ */ jsxRuntime.jsx(
26066
26148
  "text",
26067
26149
  {