@cardenelabs/cdl 0.40.8 → 0.40.10

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,51 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.40.10] - 2026-09-08
9
+
10
+ ### Fixed
11
+
12
+ - **`chart-stat` が受け取った前の時点の値を描くようにした** (#763)
13
+
14
+ 記法は datum に `previous` を書けて解決の処理も通していたのに、数値を主役にする図だけが
15
+ 読んでいなかった。 書き手からは「前の値も見せたくて書いた」 のに、絵は何も変わらなかった。
16
+
17
+ 数値の下に 1 行添える。 呼び方は積み上げの帯 (`chart-stacked-bar`) と揃えた。
18
+
19
+ ```
20
+ 解約率 <- 名前
21
+ 24 <- 数値 (主役)
22
+ 前 38 <- 足した行
23
+ ```
24
+
25
+ | 図 | 前の行 | 縦の位置 |
26
+ |---|---|---|
27
+ | `previous` を書いた | 出る (`chart-stat-previous`) | 行のぶん中身が高くなる |
28
+ | 書いていない | 出さない | 変わらない |
29
+
30
+ **`0` は値として描く**。 `undefined` と同じに扱うと、前が 0 だった件だけ黙って消える。
31
+ 一部の件だけ前を持つ図では、行の位置を件ごとにずらさず揃える。
32
+
33
+ 字は名前と同じ級までにする。 数値より大きくすると「数値が主役」 というこの種別の中身が
34
+ 入れ替わる。
35
+
36
+ ## [0.40.9] - 2026-09-08
37
+
38
+ ### Fixed
39
+
40
+ - **件が 1 つの `chart-stat` に意味のない `100%` と全周の弧を出さなくした** (#759)
41
+
42
+ 割合は「この図に載っている全件の合計に対する取り分」 なので、件が 1 つだと分母が
43
+ 自分自身になり必ず `100%` になる。 値が動いても割合は動かない。
44
+
45
+ | 件数 | 名前 / 数値 | 割合の字 / 弧 / 下地 |
46
+ |---|---|---|
47
+ | 1 | 出る | 出さない |
48
+ | 2 以上 | 出る | 出る (変わらず) |
49
+
50
+ 判定は件数で行う。 `割合 === 1` で判定すると、件が 2 つ以上でも片方が 0 の図まで消える。
51
+ その図の `100%` は「他が 0 で自分が全部」 という読みが成立する。
52
+
8
53
  ## [0.40.8] - 2026-09-08
9
54
 
10
55
  ### Changed
@@ -1987,7 +2032,9 @@ Initial OSS release.
1987
2032
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
1988
2033
  行き止まりになる。
1989
2034
 
1990
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.8...HEAD
2035
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.10...HEAD
2036
+ [0.40.10]: https://github.com/cardene777/cdl/compare/v0.40.9...v0.40.10
2037
+ [0.40.9]: https://github.com/cardene777/cdl/compare/v0.40.8...v0.40.9
1991
2038
  [0.40.8]: https://github.com/cardene777/cdl/compare/v0.40.7...v0.40.8
1992
2039
  [0.40.7]: https://github.com/cardene777/cdl/compare/v0.40.6...v0.40.7
1993
2040
  [0.40.6]: https://github.com/cardene777/cdl/compare/v0.40.5...v0.40.6
package/dist/index.cjs CHANGED
@@ -25229,7 +25229,9 @@ function ChartStatNode({
25229
25229
  const y0 = node.cy - node.h / 2;
25230
25230
  const data = resolveChartData(node.chartData ?? [], stateValues);
25231
25231
  const total = data.reduce((acc, d) => acc + d.value, 0) || 1;
25232
- const \u533A\u753B = \u533A\u753B\u306E\u5272\u4ED8(node.w, node.h, data.length);
25232
+ const \u524D\u3092\u51FA\u3059 = data.some((d) => d.previous !== void 0);
25233
+ const \u533A\u753B = \u533A\u753B\u306E\u5272\u4ED8(node.w, node.h, data.length, \u524D\u3092\u51FA\u3059);
25234
+ const \u5272\u5408\u3092\u51FA\u3059 = data.length > 1;
25233
25235
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
25234
25236
  /* @__PURE__ */ jsxRuntime.jsx(
25235
25237
  "rect",
@@ -25251,109 +25253,140 @@ function ChartStatNode({
25251
25253
  const \u8272 = \u5370\u306E\u8272(d.tone, idx);
25252
25254
  const \u6570\u5024 = \u5B9F\u5024\u8868\u8A18(d.value);
25253
25255
  const \u6570\u5024\u306E\u7D1A = \u53CE\u3081\u308B\u7D1A(\u6570\u5024, \u67A02.w - \u533A\u753B.\u4F59\u767D * 2, \u533A\u753B.\u6570\u5024\u306E\u7D1A, \u533A\u753B.\u540D\u524D\u306E\u7D1A + 1);
25254
- return /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-role": "chart-stat-item", transform: `translate(${\u67A02.x} ${\u67A02.y})`, children: [
25255
- idx > 0 && /* @__PURE__ */ jsxRuntime.jsx(
25256
- "line",
25257
- {
25258
- "data-cdl-role": "chart-stat-divider",
25259
- x1: 0,
25260
- y1: \u533A\u753B.\u4F59\u767D,
25261
- x2: 0,
25262
- y2: \u67A02.h - \u533A\u753B.\u4F59\u767D,
25263
- stroke: "var(--cdl-divider, #d4d4d8)",
25264
- strokeWidth: 1
25265
- }
25266
- ),
25267
- /* @__PURE__ */ jsxRuntime.jsx(
25268
- "text",
25269
- {
25270
- "data-cdl-role": "chart-stat-label",
25271
- x: \u67A02.w / 2,
25272
- y: \u533A\u753B.\u540D\u524D\u306Ey,
25273
- fontSize: \u533A\u753B.\u540D\u524D\u306E\u7D1A,
25274
- fontWeight: 700,
25275
- textAnchor: "middle",
25276
- fill: "var(--cdl-text-dim, #5a6270)",
25277
- children: d.label
25278
- }
25279
- ),
25280
- /* @__PURE__ */ jsxRuntime.jsx(
25281
- "text",
25282
- {
25283
- "data-cdl-role": "chart-stat-value",
25284
- "data-cdl-unresolved": d.unresolved ? "true" : void 0,
25285
- x: \u67A02.w / 2,
25286
- y: \u533A\u753B.\u6570\u5024\u306Ey,
25287
- fontSize: \u6570\u5024\u306E\u7D1A,
25288
- fontWeight: 700,
25289
- textAnchor: "middle",
25290
- fill: \u8272,
25291
- children: \u6570\u5024
25292
- }
25293
- ),
25294
- /* @__PURE__ */ jsxRuntime.jsx(
25295
- "circle",
25296
- {
25297
- "data-cdl-role": "chart-stat-track",
25298
- cx: \u67A02.w / 2,
25299
- cy: \u533A\u753B.\u5F27\u306Ey,
25300
- r: \u533A\u753B.\u5F27\u306E\u534A\u5F84,
25301
- fill: "none",
25302
- stroke: "var(--cdl-divider, #d4d4d8)",
25303
- strokeWidth: \u533A\u753B.\u5F27\u306E\u592A\u3055,
25304
- strokeOpacity: 0.5
25305
- }
25306
- ),
25307
- frac > 0 && /* @__PURE__ */ jsxRuntime.jsx(
25308
- "path",
25309
- {
25310
- "data-cdl-role": "chart-stat-arc",
25311
- d: \u5F27\u306E\u90533(\u67A02.w / 2, \u533A\u753B.\u5F27\u306Ey, \u533A\u753B.\u5F27\u306E\u534A\u5F84, Math.min(frac, 0.9999)),
25312
- fill: "none",
25313
- stroke: \u8272,
25314
- strokeWidth: \u533A\u753B.\u5F27\u306E\u592A\u3055,
25315
- strokeLinecap: "round"
25316
- }
25317
- ),
25318
- /* @__PURE__ */ jsxRuntime.jsx(
25319
- "text",
25320
- {
25321
- "data-cdl-role": "chart-stat-share",
25322
- x: \u67A02.w / 2,
25323
- y: \u533A\u753B.\u5272\u5408\u306Ey,
25324
- fontSize: \u533A\u753B.\u5272\u5408\u306E\u7D1A,
25325
- textAnchor: "middle",
25326
- fill: "var(--cdl-text-dim, #5a6270)",
25327
- children: \u5272\u5408\u8868\u8A18(frac)
25328
- }
25329
- )
25330
- ] }, `stat-${idx}`);
25256
+ return /* @__PURE__ */ jsxRuntime.jsxs(
25257
+ "g",
25258
+ {
25259
+ "data-cdl-role": "chart-stat-item",
25260
+ transform: `translate(${\u67A02.x} ${\u67A02.y})`,
25261
+ children: [
25262
+ idx > 0 && /* @__PURE__ */ jsxRuntime.jsx(
25263
+ "line",
25264
+ {
25265
+ "data-cdl-role": "chart-stat-divider",
25266
+ x1: 0,
25267
+ y1: \u533A\u753B.\u4F59\u767D,
25268
+ x2: 0,
25269
+ y2: \u67A02.h - \u533A\u753B.\u4F59\u767D,
25270
+ stroke: "var(--cdl-divider, #d4d4d8)",
25271
+ strokeWidth: 1
25272
+ }
25273
+ ),
25274
+ /* @__PURE__ */ jsxRuntime.jsx(
25275
+ "text",
25276
+ {
25277
+ "data-cdl-role": "chart-stat-label",
25278
+ x: \u67A02.w / 2,
25279
+ y: \u533A\u753B.\u540D\u524D\u306Ey,
25280
+ fontSize: \u533A\u753B.\u540D\u524D\u306E\u7D1A,
25281
+ fontWeight: 700,
25282
+ textAnchor: "middle",
25283
+ fill: "var(--cdl-text-dim, #5a6270)",
25284
+ children: d.label
25285
+ }
25286
+ ),
25287
+ /* @__PURE__ */ jsxRuntime.jsx(
25288
+ "text",
25289
+ {
25290
+ "data-cdl-role": "chart-stat-value",
25291
+ "data-cdl-unresolved": d.unresolved ? "true" : void 0,
25292
+ x: \u67A02.w / 2,
25293
+ y: \u533A\u753B.\u6570\u5024\u306Ey,
25294
+ fontSize: \u6570\u5024\u306E\u7D1A,
25295
+ fontWeight: 700,
25296
+ textAnchor: "middle",
25297
+ fill: \u8272,
25298
+ children: \u6570\u5024
25299
+ }
25300
+ ),
25301
+ d.previous !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(
25302
+ "text",
25303
+ {
25304
+ "data-cdl-role": "chart-stat-previous",
25305
+ "data-cdl-unresolved": d.unresolved ? "true" : void 0,
25306
+ x: \u67A02.w / 2,
25307
+ y: \u533A\u753B.\u524D\u306Ey,
25308
+ fontSize: \u53CE\u3081\u308B\u7D1A(
25309
+ `\u524D ${\u5B9F\u5024\u8868\u8A18(d.previous)}`,
25310
+ \u67A02.w - \u533A\u753B.\u4F59\u767D * 2,
25311
+ \u533A\u753B.\u524D\u306E\u7D1A,
25312
+ 8
25313
+ ),
25314
+ textAnchor: "middle",
25315
+ fill: "var(--cdl-text-dim, #5a6270)",
25316
+ children: `\u524D ${\u5B9F\u5024\u8868\u8A18(d.previous)}`
25317
+ }
25318
+ ),
25319
+ \u5272\u5408\u3092\u51FA\u3059 && /* @__PURE__ */ jsxRuntime.jsx(
25320
+ "circle",
25321
+ {
25322
+ "data-cdl-role": "chart-stat-track",
25323
+ cx: \u67A02.w / 2,
25324
+ cy: \u533A\u753B.\u5F27\u306Ey,
25325
+ r: \u533A\u753B.\u5F27\u306E\u534A\u5F84,
25326
+ fill: "none",
25327
+ stroke: "var(--cdl-divider, #d4d4d8)",
25328
+ strokeWidth: \u533A\u753B.\u5F27\u306E\u592A\u3055,
25329
+ strokeOpacity: 0.5
25330
+ }
25331
+ ),
25332
+ \u5272\u5408\u3092\u51FA\u3059 && frac > 0 && /* @__PURE__ */ jsxRuntime.jsx(
25333
+ "path",
25334
+ {
25335
+ "data-cdl-role": "chart-stat-arc",
25336
+ d: \u5F27\u306E\u90533(\u67A02.w / 2, \u533A\u753B.\u5F27\u306Ey, \u533A\u753B.\u5F27\u306E\u534A\u5F84, Math.min(frac, 0.9999)),
25337
+ fill: "none",
25338
+ stroke: \u8272,
25339
+ strokeWidth: \u533A\u753B.\u5F27\u306E\u592A\u3055,
25340
+ strokeLinecap: "round"
25341
+ }
25342
+ ),
25343
+ \u5272\u5408\u3092\u51FA\u3059 && /* @__PURE__ */ jsxRuntime.jsx(
25344
+ "text",
25345
+ {
25346
+ "data-cdl-role": "chart-stat-share",
25347
+ x: \u67A02.w / 2,
25348
+ y: \u533A\u753B.\u5272\u5408\u306Ey,
25349
+ fontSize: \u533A\u753B.\u5272\u5408\u306E\u7D1A,
25350
+ textAnchor: "middle",
25351
+ fill: "var(--cdl-text-dim, #5a6270)",
25352
+ children: \u5272\u5408\u8868\u8A18(frac)
25353
+ }
25354
+ )
25355
+ ]
25356
+ },
25357
+ `stat-${idx}`
25358
+ );
25331
25359
  })
25332
25360
  ] });
25333
25361
  }
25334
- function \u533A\u753B\u306E\u5272\u4ED8(w, h, \u4EF6\u6570) {
25362
+ function \u533A\u753B\u306E\u5272\u4ED8(w, h, \u4EF6\u6570, \u524D\u3092\u51FA\u3059) {
25335
25363
  const \u4F59\u767D = 20;
25336
25364
  const \u5E45 = \u4EF6\u6570 > 0 ? w / \u4EF6\u6570 : w;
25337
25365
  const \u540D\u524D\u306E\u7D1A = 14;
25338
25366
  const \u6570\u5024\u306E\u7D1A = 40;
25367
+ const \u524D\u306E\u7D1A = \u540D\u524D\u306E\u7D1A;
25339
25368
  const \u5272\u5408\u306E\u7D1A = 12;
25340
25369
  const \u5F27\u306E\u534A\u5F84 = 20;
25341
25370
  const \u5F27\u306E\u592A\u3055 = 4;
25342
- const \u4E2D\u8EAB\u306E\u9AD8\u3055 = \u540D\u524D\u306E\u7D1A + 12 + \u6570\u5024\u306E\u7D1A + 16 + \u5F27\u306E\u534A\u5F84 * 2 + 8 + \u5272\u5408\u306E\u7D1A;
25371
+ const \u524D\u306E\u9AD8\u3055 = \u524D\u3092\u51FA\u3059 ? 8 + \u524D\u306E\u7D1A : 0;
25372
+ const \u4E2D\u8EAB\u306E\u9AD8\u3055 = \u540D\u524D\u306E\u7D1A + 12 + \u6570\u5024\u306E\u7D1A + \u524D\u306E\u9AD8\u3055 + 16 + \u5F27\u306E\u534A\u5F84 * 2 + 8 + \u5272\u5408\u306E\u7D1A;
25343
25373
  const \u4E0A\u7AEF = Math.max(\u4F59\u767D, (h - \u4E2D\u8EAB\u306E\u9AD8\u3055) / 2);
25344
25374
  const \u540D\u524D\u306Ey = \u4E0A\u7AEF + \u540D\u524D\u306E\u7D1A;
25345
25375
  const \u6570\u5024\u306Ey = \u540D\u524D\u306Ey + 12 + \u6570\u5024\u306E\u7D1A * 0.78;
25346
- const \u5F27\u306Ey = \u6570\u5024\u306Ey + 16 + \u5F27\u306E\u534A\u5F84;
25376
+ const \u524D\u306Ey = \u6570\u5024\u306Ey + 8 + \u524D\u306E\u7D1A;
25377
+ const \u5F27\u306Ey = \u6570\u5024\u306Ey + \u524D\u306E\u9AD8\u3055 + 16 + \u5F27\u306E\u534A\u5F84;
25347
25378
  const \u5272\u5408\u306Ey = \u5F27\u306Ey + \u5F27\u306E\u534A\u5F84 + 8 + \u5272\u5408\u306E\u7D1A;
25348
25379
  return {
25349
25380
  \u4F59\u767D,
25350
25381
  \u540D\u524D\u306E\u7D1A,
25351
25382
  \u6570\u5024\u306E\u7D1A,
25383
+ \u524D\u306E\u7D1A,
25352
25384
  \u5272\u5408\u306E\u7D1A,
25353
25385
  \u5F27\u306E\u534A\u5F84,
25354
25386
  \u5F27\u306E\u592A\u3055,
25355
25387
  \u540D\u524D\u306Ey,
25356
25388
  \u6570\u5024\u306Ey,
25389
+ \u524D\u306Ey,
25357
25390
  \u5F27\u306Ey,
25358
25391
  \u5272\u5408\u306Ey,
25359
25392
  \u67A0: (idx) => ({ x: \u5E45 * idx, y: 0, w: \u5E45, h })