@cardenelabs/cdl 0.40.4 → 0.40.6

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,48 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.40.6] - 2026-09-08
9
+
10
+ ### Fixed
11
+
12
+ - **図表を描くたびに「使われていない」 と警告が出るのを直した** (#743)
13
+
14
+ 図表は 1 つの節が図の全体を表す形で、記法にその節を activate する書き方が無い。
15
+ それでも「どの phase でも activate されていない (unused、 typo の可能性)」 が出ており、
16
+ 見本帳の図表の記法 15 件すべてで実測した (棒 / 折れ線 / 円 / 半円ゲージ / 同心の弧 /
17
+ 大きな数字 / 100 個の印 / 内訳の帯 / 傾き / 絞り込み / 工程表 / 体験の道筋 / 枝分かれ /
18
+ 4 象限 / 階層)。
19
+
20
+ 書き手に直せない警告は、読む価値のある警告まで一緒に無視させる。 同じ検査は「未定義の
21
+ state を参照している」 のような本当の誤りも出しており、図表を扱う限り雑音がその手前に並ぶ。
22
+
23
+ 図表の荷 (`chartData` / `ganttData` / `mindData` / `funnelData` / `quadrantData` /
24
+ `treeData` / `journeyData`) を持つ節を、この警告の対象から外した。 種別の一覧は持たない =
25
+ 図表の種別は増えるので、一覧を手で書くと追記を忘れて警告が復活する。
26
+
27
+ 図表でない節と辺では今までどおり出る。 未使用の state など他の警告も変わらない。
28
+
29
+ ## [0.40.5] - 2026-09-07
30
+
31
+ ### Fixed
32
+
33
+ - **内訳が多い半円ゲージで合計が主役でなくなるのを直した** (#735)
34
+
35
+ 段を折り返すようにした (#732) 結果、件数が増えると弧に残る高さが尽き、**合計の字が
36
+ 内訳の名前より小さくなっていた**。 実測で件数 22 から合計 13 に対し名前 14、
37
+ 件数 30 では合計が弧の内側の穴から 4.9 はみ出し、件数 40 では 10.2 はみ出した。
38
+ この種別は合計を大きく見せるために作ったので、主役が入れ替わると図の意味が変わる。
39
+
40
+ 弧に残す高さ (48) を先に確保し、そこから置ける段数を逆算する。 入り切らない件は
41
+ 末尾 1 件に「その他」 として畳み、**合計の値は変えない** = 畳んだ件の値を足して持たせる。
42
+ 弧も同じ並びで描くので、扇と内訳が食い違わない。
43
+
44
+ 合計の級の決め方も直した。 中心の高さの横幅で測っていたため、字が中心より上に置かれる
45
+ ぶんだけ穴からはみ出していた。 字の上の角が穴の円に入る大きさを解いて決める。
46
+
47
+ 件数 12 以下の図は段の数も弧の半径も今までと同じ (実測で 1 段が半径 128.96、
48
+ 2 段が 94.24 で前後一致)。
49
+
8
50
  ## [0.40.4] - 2026-09-07
9
51
 
10
52
  ### Fixed
@@ -1862,7 +1904,9 @@ Initial OSS release.
1862
1904
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
1863
1905
  行き止まりになる。
1864
1906
 
1865
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.4...HEAD
1907
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.40.6...HEAD
1908
+ [0.40.6]: https://github.com/cardene777/cdl/compare/v0.40.5...v0.40.6
1909
+ [0.40.5]: https://github.com/cardene777/cdl/compare/v0.40.4...v0.40.5
1866
1910
  [0.40.4]: https://github.com/cardene777/cdl/compare/v0.40.3...v0.40.4
1867
1911
  [0.40.3]: https://github.com/cardene777/cdl/compare/v0.40.2...v0.40.3
1868
1912
  [0.40.2]: https://github.com/cardene777/cdl/compare/v0.40.1...v0.40.2
package/dist/index.cjs CHANGED
@@ -20816,6 +20816,18 @@ var DRAW_KINDS = /* @__PURE__ */ new Set([
20816
20816
  ]);
20817
20817
  var KINDS = new Set(NODE_KINDS);
20818
20818
  var ENG_BANNED = /\b(FUNCTION|STORAGE|EVENT LOG|BALANCES MAPPING|READ|WRITE|EMIT|CALL)\b/;
20819
+ var \u56F3\u8868\u306E\u8377\u306E\u6B04 = [
20820
+ "chartData",
20821
+ "ganttData",
20822
+ "mindData",
20823
+ "funnelData",
20824
+ "quadrantData",
20825
+ "treeData",
20826
+ "journeyData"
20827
+ ];
20828
+ function \u56F3\u8868\u306E\u7BC0(n) {
20829
+ return \u56F3\u8868\u306E\u8377\u306E\u6B04.some((\u6B04) => n[\u6B04] !== void 0);
20830
+ }
20819
20831
  function validate(diag) {
20820
20832
  const errors = [];
20821
20833
  const warnings = [];
@@ -20973,7 +20985,7 @@ function validate(diag) {
20973
20985
  for (const id of p.activate) allActivated.add(id);
20974
20986
  }
20975
20987
  for (const n of diag.nodes) {
20976
- if (!allActivated.has(n.id)) {
20988
+ if (!allActivated.has(n.id) && !\u56F3\u8868\u306E\u7BC0(n)) {
20977
20989
  warnings.push(`node "${n.id}" \u304C\u3069\u306E phase \u3067\u3082 activate \u3055\u308C\u3066\u3044\u306A\u3044 (unused\u3001 typo \u306E\u53EF\u80FD\u6027)`);
20978
20990
  }
20979
20991
  }
@@ -24892,13 +24904,46 @@ function ChartGaugeNode({
24892
24904
  const \u5F27\u3068\u5185\u8A33\u306E\u9593 = 16;
24893
24905
  const \u5370\u306E\u5E452 = 30;
24894
24906
  const \u533A\u753B\u306E\u9593 = 12;
24895
- const \u5185\u8A33\u306E\u6570\u5024 = data.map((d) => `${\u5B9F\u5024\u8868\u8A18(d.value)} ${\u5272\u5408\u8868\u8A18(d.value / total)}`);
24896
- const \u4EF6\u306B\u8981\u308B\u5E45 = Math.max(\u5370\u306E\u5E452, ...\u5185\u8A33\u306E\u6570\u5024.map((t) => textWidth(t, \u6570\u5024\u306E\u7D1A))) + \u533A\u753B\u306E\u9593;
24897
- const \u884C\u306E\u4EF6\u6570 = Math.min(
24898
- Math.max(1, Math.floor(\u4F7F\u3048\u308B\u5E452 / Math.max(\u4EF6\u306B\u8981\u308B\u5E45, 1))),
24899
- Math.max(data.length, 1)
24907
+ const \u6570\u5024\u306E\u884C = (d) => `${\u5B9F\u5024\u8868\u8A18(d.value)} ${\u5272\u5408\u8868\u8A18(d.value / total)}`;
24908
+ const \u5272\u308A\u4ED8\u3051\u308B = (\u4EF6\u305F\u3061) => {
24909
+ const \u5E45 = Math.max(\u5370\u306E\u5E452, ...\u4EF6\u305F\u3061.map((d) => textWidth(\u6570\u5024\u306E\u884C(d), \u6570\u5024\u306E\u7D1A))) + \u533A\u753B\u306E\u9593;
24910
+ const \u884C\u306E\u4EF6\u65702 = Math.min(
24911
+ Math.max(1, Math.floor(\u4F7F\u3048\u308B\u5E452 / Math.max(\u5E45, 1))),
24912
+ Math.max(\u4EF6\u305F\u3061.length, 1)
24913
+ );
24914
+ return { \u884C\u306E\u4EF6\u6570: \u884C\u306E\u4EF6\u65702, \u6BB5\u6570: Math.ceil(Math.max(\u4EF6\u305F\u3061.length, 1) / \u884C\u306E\u4EF6\u65702) };
24915
+ };
24916
+ const \u5F27\u306B\u6B8B\u3059\u9AD8\u3055 = 48;
24917
+ const \u7F6E\u3051\u308B\u6BB5\u6570 = Math.max(
24918
+ 1,
24919
+ Math.floor((\u4F7F\u3048\u308B\u9AD8\u3055 - \u5F27\u306B\u6B8B\u3059\u9AD8\u3055 - \u5F27\u3068\u5185\u8A33\u306E\u9593) / \u6BB5\u306E\u9AD8\u3055)
24900
24920
  );
24901
- const \u5185\u8A33\u306E\u6BB5\u6570 = Math.ceil(Math.max(data.length, 1) / \u884C\u306E\u4EF6\u6570);
24921
+ const \u7573\u3080 = (\u6B8B\u3059\u4EF6\u6570) => {
24922
+ if (\u6B8B\u3059\u4EF6\u6570 >= data.length) return data;
24923
+ const \u524D = data.slice(0, Math.max(0, \u6B8B\u3059\u4EF6\u6570 - 1));
24924
+ const \u6B8B\u308A = data.slice(Math.max(0, \u6B8B\u3059\u4EF6\u6570 - 1));
24925
+ const \u5024 = \u6B8B\u308A.reduce((acc, d) => acc + d.value, 0);
24926
+ const \u8AAD\u3081\u306A\u3044 = \u6B8B\u308A.some((d) => d.unresolved);
24927
+ const \u7573\u3093\u3060 = {
24928
+ ...\u6B8B\u308A[0],
24929
+ label: "\u305D\u306E\u4ED6",
24930
+ value: \u5024,
24931
+ previous: void 0,
24932
+ ...\u8AAD\u3081\u306A\u3044 ? { unresolved: true } : { unresolved: void 0 }
24933
+ };
24934
+ return [...\u524D, \u7573\u3093\u3060];
24935
+ };
24936
+ const \u51FA\u3059\u4EF6\u305F\u3061 = (() => {
24937
+ let \u4EF6\u305F\u3061 = data;
24938
+ for (let i = 0; i < 4; i++) {
24939
+ const { \u884C\u306E\u4EF6\u6570: \u884C\u306E\u4EF6\u65702, \u6BB5\u6570 } = \u5272\u308A\u4ED8\u3051\u308B(\u4EF6\u305F\u3061);
24940
+ if (\u6BB5\u6570 <= \u7F6E\u3051\u308B\u6BB5\u6570) return \u4EF6\u305F\u3061;
24941
+ \u4EF6\u305F\u3061 = \u7573\u3080(Math.max(1, \u7F6E\u3051\u308B\u6BB5\u6570 * \u884C\u306E\u4EF6\u65702));
24942
+ }
24943
+ return \u4EF6\u305F\u3061;
24944
+ })();
24945
+ const \u5185\u8A33\u306E\u6570\u5024 = \u51FA\u3059\u4EF6\u305F\u3061.map((d) => \u6570\u5024\u306E\u884C(d));
24946
+ const { \u884C\u306E\u4EF6\u6570, \u6BB5\u6570: \u5185\u8A33\u306E\u6BB5\u6570 } = \u5272\u308A\u4ED8\u3051\u308B(\u51FA\u3059\u4EF6\u305F\u3061);
24902
24947
  const \u5185\u8A33\u306E\u9AD8\u3055 = \u6BB5\u306E\u9AD8\u3055 * \u5185\u8A33\u306E\u6BB5\u6570;
24903
24948
  const \u5F27\u306B\u4F7F\u3048\u308B\u9AD8\u3055 = \u4F7F\u3048\u308B\u9AD8\u3055 - \u5185\u8A33\u306E\u9AD8\u3055 - \u5F27\u3068\u5185\u8A33\u306E\u9593;
24904
24949
  const radius = Math.max(24, Math.min(\u5F27\u306B\u4F7F\u3048\u308B\u9AD8\u3055, \u4F7F\u3048\u308B\u5E452 / 2));
@@ -24906,7 +24951,7 @@ function ChartGaugeNode({
24906
24951
  const cx = node.w / 2;
24907
24952
  const cy = PAD_TOP2 + radius;
24908
24953
  let cumFrac = 0;
24909
- const slices = data.map((d) => {
24954
+ const slices = \u51FA\u3059\u4EF6\u305F\u3061.map((d) => {
24910
24955
  const frac = d.value / total;
24911
24956
  const a0 = Math.PI + cumFrac * Math.PI;
24912
24957
  const a1 = a0 + frac * Math.PI;
@@ -24919,10 +24964,10 @@ function ChartGaugeNode({
24919
24964
  return { d, frac, path };
24920
24965
  });
24921
24966
  const \u5408\u8A08\u306E\u6587\u5B57 = \u5B9F\u5024\u8868\u8A18(Math.round(total));
24922
- const \u6A2A\u306E\u4E0A\u9650 = \u5185\u534A\u5F84 * 2 * 0.86;
24967
+ const \u5358\u4F4D\u5E45 = Math.max(textWidth(\u5408\u8A08\u306E\u6587\u5B57, 100), 1) / 100;
24923
24968
  const \u7D1A\u306E\u5019\u88DC = Math.min(
24924
- // 横 = 実際の字幅から逆算する
24925
- \u6A2A\u306E\u4E0A\u9650 / Math.max(textWidth(\u5408\u8A08\u306E\u6587\u5B57, 100), 1) * 100,
24969
+ // 横 = 字の上の角が内側の円に入る大きさ
24970
+ \u5185\u534A\u5F84 / Math.sqrt((\u5358\u4F4D\u5E45 / 2) ** 2 + 1.25 ** 2),
24926
24971
  // 縦 = 合計 1 行 + 見出し 1 行が内側の高さに収まる比
24927
24972
  \u5185\u534A\u5F84 * 0.52
24928
24973
  );
@@ -24985,7 +25030,7 @@ function ChartGaugeNode({
24985
25030
  children: "\u5408\u8A08"
24986
25031
  }
24987
25032
  ),
24988
- data.map((d, idx) => {
25033
+ \u51FA\u3059\u4EF6\u305F\u3061.map((d, idx) => {
24989
25034
  const \u5217 = idx % \u884C\u306E\u4EF6\u6570;
24990
25035
  const \u6BB5 = Math.floor(idx / \u884C\u306E\u4EF6\u6570);
24991
25036
  const x = PAD_SIDE + \u5185\u8A33\u306E\u5E45 * \u5217;