@cardenelabs/cdl 0.39.0 → 0.40.1

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,47 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.40.1] - 2026-09-07
9
+
10
+ ### Fixed
11
+
12
+ - **傾き図で同じ値の系列の名札が重なって読めなくなるのを直した** (#723)
13
+
14
+ `chart-slope` は名札 (値と名前) を点と同じ縦の位置に置いていたので、値が同じ / 近い
15
+ 系列が 2 件以上あると同じ場所に印字されていた。 実測で 59 と 59 の 2 件が完全に重なり、
16
+ 値は太字が二重に乗った染み、名前は 2 つの語が重なった判読不能な塊になっていた。
17
+ 完全一致でなくても起きる = 59 と 60 の差は 3.55 しかなく、字の高さ 14 に対して足りない。
18
+
19
+ **動かすのは名札だけ**。 点と線は真の位置に残す = 位置をずらすと、書いていない差を
20
+ 絵が主張することになる (同順位を段でずらさない判断と同じ理由、#707)。 同じ値の点は
21
+ 重なったままで、どの名札がどの系列かは名前の色が担う (#698)。
22
+
23
+ 重なった連なりは **元の位置の平均を中心にして** 間隔ぶんずつ均等に置き直す。
24
+ 上から順に押し下げるだけだと塊が片側へ寄り、点との対応が遠くなる。
25
+
26
+ 枠に入り切らない件数の図では、どれか 1 つを枠の外へ出さず全部を等間隔に詰める。
27
+
28
+ ## [0.40.0] - 2026-09-07
29
+
30
+ ### Added
31
+
32
+ - **100 個の印も段の `draw` で 1 個ずつ埋まるようにした** (#719)
33
+
34
+ `chart-waffle` は上の行から左詰めで印を配る図なので、埋まる順もそのまま読む向きになる。
35
+
36
+ **切り抜きでは表せない**。 弧の 3 種 (#715) は切り抜きで隠したが、この図に当てると
37
+ 升の途中が斜めや半分で切れる = 1 個 = 1% の印が半分だけ出て、数えられない図になる。
38
+
39
+ 代わりに **塗りだけを変える**。 印は 100 個とも最初から描き、進みまで届いていない印を
40
+ 持ち主のいない印と同じ地の色にする。 升の位置と大きさ、`data-cdl-waffle-owner` の
41
+ 持ち主の欄はどちらも進みで変わらない。
42
+
43
+ 左の一覧 (名前と印の数) は最初から全部出す。 この図は「数えて確かめられる」 ことが
44
+ 存在理由で、一覧はその答え合わせの表になる。
45
+
46
+ これで図表で動きを持たないのは 指標 (`chart-stat`) と 四象限 (`quadrant-matrix`) の
47
+ 2 つになった。 どちらも長さも順序も持たないため対象外のまま。
48
+
8
49
  ## [0.39.0] - 2026-09-07
9
50
 
10
51
  ### Added
@@ -1760,7 +1801,9 @@ Initial OSS release.
1760
1801
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
1761
1802
  行き止まりになる。
1762
1803
 
1763
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.39.0...HEAD
1804
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.1...HEAD
1805
+ [0.40.1]: https://github.com/cardene777/cdl/compare/v0.40.0...v0.40.1
1806
+ [0.40.0]: https://github.com/cardene777/cdl/compare/v0.39.0...v0.40.0
1764
1807
  [0.39.0]: https://github.com/cardene777/cdl/compare/v0.38.0...v0.39.0
1765
1808
  [0.38.0]: https://github.com/cardene777/cdl/compare/v0.37.0...v0.38.0
1766
1809
  [0.37.0]: https://github.com/cardene777/cdl/compare/v0.36.0...v0.37.0
package/SPEC.md CHANGED
@@ -149,6 +149,7 @@ phase でも線を引き直すことになる。
149
149
  | `chart-gauge` | 9 時 | 弧が上を通って 3 時へ伸びる | 合計と内訳は最初から出る |
150
150
  | `chart-radial` | 12 時 | 各輪が時計回りに開く | 軌道と一覧は最初から出る |
151
151
  | `chart-stacked-bar` | 左端 | 帯が右へ伸びる | 区画の字はその区画が広がった時 |
152
+ | `chart-waffle` | 左上 | 印が読む向きに 1 個ずつ埋まる | 一覧は最初から出る |
152
153
 
153
154
  対応種別の一覧は `validate.ts` の `DRAW_KINDS` が持ち、 知らせの文面もそこから組み立てる。
154
155
 
package/dist/index.cjs CHANGED
@@ -20811,7 +20811,8 @@ var DRAW_KINDS = /* @__PURE__ */ new Set([
20811
20811
  "funnel-stages",
20812
20812
  "chart-gauge",
20813
20813
  "chart-radial",
20814
- "chart-stacked-bar"
20814
+ "chart-stacked-bar",
20815
+ "chart-waffle"
20815
20816
  ]);
20816
20817
  var KINDS = new Set(NODE_KINDS);
20817
20818
  var ENG_BANNED = /\b(FUNCTION|STORAGE|EVENT LOG|BALANCES MAPPING|READ|WRITE|EMIT|CALL)\b/;
@@ -25262,7 +25263,9 @@ function \u5370\u306E\u5272\u4ED8(\u5024) {
25262
25263
  function ChartWaffleNode({
25263
25264
  node,
25264
25265
  active,
25265
- stateValues = {}
25266
+ stateValues = {},
25267
+ drawing = false,
25268
+ progress = 1
25266
25269
  }) {
25267
25270
  const x0 = node.cx - node.w / 2;
25268
25271
  const y0 = node.cy - node.h / 2;
@@ -25291,6 +25294,7 @@ function ChartWaffleNode({
25291
25294
  \u914D\u5206.forEach((n, idx) => {
25292
25295
  for (let k = 0; k < n; k++) \u6301\u3061\u4E3B.push(idx);
25293
25296
  });
25297
+ const \u57CB\u307E\u3063\u305F = Math.round(\u9032\u307F\u3092\u7573\u3080(drawing, progress) * WAFFLE_TOTAL);
25294
25298
  const \u4E00\u89A7\u306E\u59CB\u307E\u308A = PAD + (\u4F7F\u3048\u308B\u9AD8\u3055 - \u884C\u306E\u9AD8\u3055 * data.length) / 2 + \u884C\u306E\u9AD8\u3055 / 2;
25295
25299
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
25296
25300
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -25311,6 +25315,7 @@ function ChartWaffleNode({
25311
25315
  const \u884C = Math.floor(k / WAFFLE_COLS);
25312
25316
  const \u5217 = k % WAFFLE_COLS;
25313
25317
  const owner = \u6301\u3061\u4E3B[k];
25318
+ const \u57CB\u307E\u3063\u3066\u3044\u308B = owner !== void 0 && k < \u57CB\u307E\u3063\u305F;
25314
25319
  return /* @__PURE__ */ jsxRuntime.jsx(
25315
25320
  "rect",
25316
25321
  {
@@ -25321,8 +25326,8 @@ function ChartWaffleNode({
25321
25326
  width: \u5370,
25322
25327
  height: \u5370,
25323
25328
  rx: 2,
25324
- fill: owner === void 0 ? "var(--cdl-divider, #d4d4d8)" : \u5370\u306E\u82722(data[owner].tone, owner),
25325
- fillOpacity: owner === void 0 ? 0.35 : 1
25329
+ fill: \u57CB\u307E\u3063\u3066\u3044\u308B ? \u5370\u306E\u82722(data[owner].tone, owner) : "var(--cdl-divider, #d4d4d8)",
25330
+ fillOpacity: \u57CB\u307E\u3063\u3066\u3044\u308B ? 1 : 0.35
25326
25331
  },
25327
25332
  `cell-${k}`
25328
25333
  );
@@ -25523,6 +25528,36 @@ function \u4E00\u89A7\u306E\u4E26\u3073(data, \u5DE6, \u53F3\u7AEF, \u7D1A) {
25523
25528
  return out;
25524
25529
  }
25525
25530
  var \u7DDA\u306E\u6700\u5C0F\u5E45 = 120;
25531
+ function \u540D\u672D\u306E\u6BB5\u3092\u307B\u3069\u304F(\u771F\u306Ey, \u9593\u9694, \u4E0A\u9650, \u4E0B\u9650) {
25532
+ const \u4EF6\u6570 = \u771F\u306Ey.length;
25533
+ if (\u4EF6\u6570 === 0) return [];
25534
+ const \u4E26\u3073 = \u771F\u306Ey.map((y, i) => ({ y, i })).sort((a, b) => a.y - b.y || a.i - b.i);
25535
+ const \u7D50\u679C = new Array(\u4EF6\u6570);
25536
+ if (\u9593\u9694 * (\u4EF6\u6570 - 1) > \u4E0B\u9650 - \u4E0A\u9650) {
25537
+ \u4E26\u3073.forEach((e, k) => {
25538
+ \u7D50\u679C[e.i] = \u4EF6\u6570 > 1 ? \u4E0A\u9650 + (\u4E0B\u9650 - \u4E0A\u9650) / (\u4EF6\u6570 - 1) * k : (\u4E0A\u9650 + \u4E0B\u9650) / 2;
25539
+ });
25540
+ return \u7D50\u679C;
25541
+ }
25542
+ const \u584A\u305F\u3061 = [];
25543
+ \u4E26\u3073.forEach((e, k) => {
25544
+ \u584A\u305F\u3061.push({ \u5408\u8A08: e.y - \u9593\u9694 * k, \u4EF6\u6570: 1 });
25545
+ while (\u584A\u305F\u3061.length >= 2) {
25546
+ const \u5F8C = \u584A\u305F\u3061[\u584A\u305F\u3061.length - 1];
25547
+ const \u524D = \u584A\u305F\u3061[\u584A\u305F\u3061.length - 2];
25548
+ if (\u524D.\u5408\u8A08 / \u524D.\u4EF6\u6570 <= \u5F8C.\u5408\u8A08 / \u5F8C.\u4EF6\u6570) break;
25549
+ \u584A\u305F\u3061.splice(\u584A\u305F\u3061.length - 2, 2, { \u5408\u8A08: \u524D.\u5408\u8A08 + \u5F8C.\u5408\u8A08, \u4EF6\u6570: \u524D.\u4EF6\u6570 + \u5F8C.\u4EF6\u6570 });
25550
+ }
25551
+ });
25552
+ const \u307B\u3069\u3044\u305F = [];
25553
+ \u584A\u305F\u3061.forEach((\u584A) => {
25554
+ const \u5E73\u5747 = \u584A.\u5408\u8A08 / \u584A.\u4EF6\u6570;
25555
+ for (let j = 0; j < \u584A.\u4EF6\u6570; j++) \u307B\u3069\u3044\u305F.push(\u5E73\u5747 + \u9593\u9694 * \u307B\u3069\u3044\u305F.length);
25556
+ });
25557
+ const \u305A\u308C = Math.max(0, \u4E0A\u9650 - \u307B\u3069\u3044\u305F[0]) - Math.max(0, \u307B\u3069\u3044\u305F[\u4EF6\u6570 - 1] - \u4E0B\u9650);
25558
+ \u4E26\u3073.forEach((e, k) => \u7D50\u679C[e.i] = \u307B\u3069\u3044\u305F[k] + \u305A\u308C);
25559
+ return \u7D50\u679C;
25560
+ }
25526
25561
  function ChartSlopeNode({
25527
25562
  node,
25528
25563
  active,
@@ -25588,6 +25623,15 @@ function ChartSlopeNode({
25588
25623
  const \u53F3\u8EF8x = \u524D\u3042\u308A ? Math.min(node.w - PAD, Math.max(node.w - PAD - \u53F3\u306E\u4F59\u767D, node.w / 2 + \u7DDA\u306E\u6700\u5C0F\u5E45 / 2)) : \u5DE6\u8EF8x;
25589
25624
  const \u4F38\u3073 = \u9032\u307F\u3092\u7573\u3080(drawing, progress);
25590
25625
  const \u53F3\u3092\u51FA\u3059 = !drawing || \u4F38\u3073 >= 1;
25626
+ const \u5DE6\u306E\u70B9y = \u7CFB\u5217\u305F\u3061.map(
25627
+ (s, i) => \u5F62 === "rank" ? \u6BB5\u306Ey\u3092\u53D6\u308B(\u524D\u306E\u9806\u4F4D[i]) : y\u3092\u53D6\u308B(s.\u524D)
25628
+ );
25629
+ const \u53F3\u306E\u70B9y = \u7CFB\u5217\u305F\u3061.map(
25630
+ (s, i) => \u5F62 === "rank" ? \u6BB5\u306Ey\u3092\u53D6\u308B(\u4ECA\u306E\u9806\u4F4D[i]) : y\u3092\u53D6\u308B(s.\u4ECA)
25631
+ );
25632
+ const \u540D\u672D\u306E\u884C = Math.max(\u5024\u306E\u7D1A, \u540D\u524D\u306E\u7D1A) + 4;
25633
+ const \u5DE6\u306E\u540D\u672Dy = \u524D\u3042\u308A ? \u540D\u672D\u306E\u6BB5\u3092\u307B\u3069\u304F(\u5DE6\u306E\u70B9y, \u540D\u672D\u306E\u884C, \u4E0A\u7AEF, \u4E0B\u7AEF) : \u5DE6\u306E\u70B9y;
25634
+ const \u53F3\u306E\u540D\u672Dy = \u540D\u672D\u306E\u6BB5\u3092\u307B\u3069\u304F(\u53F3\u306E\u70B9y, \u540D\u672D\u306E\u884C, \u4E0A\u7AEF, \u4E0B\u7AEF);
25591
25635
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x0} ${y0})`, children: [
25592
25636
  /* @__PURE__ */ jsxRuntime.jsx(
25593
25637
  "rect",
@@ -25645,8 +25689,10 @@ function ChartSlopeNode({
25645
25689
  )
25646
25690
  ] }),
25647
25691
  \u7CFB\u5217\u305F\u3061.map((s, i) => {
25648
- const \u5DE6y = \u5F62 === "rank" ? \u6BB5\u306Ey\u3092\u53D6\u308B(\u524D\u306E\u9806\u4F4D[i]) : y\u3092\u53D6\u308B(s.\u524D);
25649
- const \u53F3y = \u5F62 === "rank" ? \u6BB5\u306Ey\u3092\u53D6\u308B(\u4ECA\u306E\u9806\u4F4D[i]) : y\u3092\u53D6\u308B(s.\u4ECA);
25692
+ const \u5DE6y = \u5DE6\u306E\u70B9y[i];
25693
+ const \u53F3y = \u53F3\u306E\u70B9y[i];
25694
+ const \u5DE6\u672Dy = \u5DE6\u306E\u540D\u672Dy[i];
25695
+ const \u53F3\u672Dy = \u53F3\u306E\u540D\u672Dy[i];
25650
25696
  const \u672A\u89E3\u6C7A = s.\u672A\u89E3\u6C7A ? "true" : void 0;
25651
25697
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
25652
25698
  \u524D\u3042\u308A && /* @__PURE__ */ jsxRuntime.jsx(
@@ -25690,7 +25736,7 @@ function ChartSlopeNode({
25690
25736
  {
25691
25737
  "data-cdl-role": "chart-slope-value",
25692
25738
  x: \u5DE6\u8EF8x - \u8EF8\u304B\u3089\u5024\u307E\u3067,
25693
- y: \u5DE6y + 5,
25739
+ y: \u5DE6\u672Dy + 5,
25694
25740
  textAnchor: "end",
25695
25741
  fontSize: \u5024\u306E\u7D1A,
25696
25742
  fontWeight: 600,
@@ -25703,7 +25749,7 @@ function ChartSlopeNode({
25703
25749
  {
25704
25750
  "data-cdl-role": "chart-slope-name",
25705
25751
  x: \u5DE6\u8EF8x - \u8EF8\u304B\u3089\u5024\u307E\u3067 - \u5DE6\u5024\u5E45 - \u5024\u304B\u3089\u540D\u524D\u307E\u3067,
25706
- y: \u5DE6y + 5,
25752
+ y: \u5DE6\u672Dy + 5,
25707
25753
  textAnchor: "end",
25708
25754
  fontSize: \u540D\u524D\u306E\u7D1A,
25709
25755
  fill: s.\u8272,
@@ -25715,7 +25761,7 @@ function ChartSlopeNode({
25715
25761
  {
25716
25762
  "data-cdl-role": "chart-slope-name",
25717
25763
  x: \u5DE6\u8EF8x - \u8EF8\u304B\u3089\u5024\u307E\u3067,
25718
- y: \u53F3y + 5,
25764
+ y: \u53F3\u672Dy + 5,
25719
25765
  textAnchor: "end",
25720
25766
  fontSize: \u540D\u524D\u306E\u7D1A,
25721
25767
  fill: s.\u8272,
@@ -25728,7 +25774,7 @@ function ChartSlopeNode({
25728
25774
  {
25729
25775
  "data-cdl-role": \u5F62 === "delta" ? "chart-slope-delta" : "chart-slope-value",
25730
25776
  x: \u53F3\u8EF8x + \u8EF8\u304B\u3089\u5024\u307E\u3067,
25731
- y: \u53F3y + 5,
25777
+ y: \u53F3\u672Dy + 5,
25732
25778
  fontSize: \u5024\u306E\u7D1A,
25733
25779
  fontWeight: 600,
25734
25780
  fill: "var(--cdl-text, #1a1f2a)",
@@ -25740,7 +25786,7 @@ function ChartSlopeNode({
25740
25786
  {
25741
25787
  "data-cdl-role": "chart-slope-name",
25742
25788
  x: \u53F3\u8EF8x + \u8EF8\u304B\u3089\u5024\u307E\u3067 + \u53F3\u5024\u5E45 + \u5024\u304B\u3089\u540D\u524D\u307E\u3067,
25743
- y: \u53F3y + 5,
25789
+ y: \u53F3\u672Dy + 5,
25744
25790
  fontSize: \u540D\u524D\u306E\u7D1A,
25745
25791
  fill: s.\u8272,
25746
25792
  children: s.\u540D\u524D
@@ -30470,7 +30516,16 @@ function CdlNodeView({
30470
30516
  }
30471
30517
  );
30472
30518
  case "chart-waffle":
30473
- return /* @__PURE__ */ jsxRuntime.jsx(ChartWaffleNode, { node: resolvedNode, active, stateValues });
30519
+ return /* @__PURE__ */ jsxRuntime.jsx(
30520
+ ChartWaffleNode,
30521
+ {
30522
+ node: resolvedNode,
30523
+ active,
30524
+ stateValues,
30525
+ drawing,
30526
+ progress
30527
+ }
30528
+ );
30474
30529
  case "chart-stat":
30475
30530
  return /* @__PURE__ */ jsxRuntime.jsx(ChartStatNode, { node: resolvedNode, active, stateValues });
30476
30531
  case "chart-radial":