@cardenelabs/cdl 0.26.0 → 0.28.0

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,102 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.28.0] - 2026-09-04
9
+
10
+ ### Changed
11
+
12
+ - **クラス図の関係の色みを種類から決めるようにした** (#641)
13
+
14
+ 6 種の関係が全て同じ色 (`info`) で引かれていた。 見分けを担うのは 線 (実線 / 破線) と
15
+ 印の形 (三角 / 菱 / 開いた矢) と 印が付く側 の 3 軸だけで、6 種を 1 枚に並べると
16
+ 印の形まで見ないとどれがどれか判らない。
17
+
18
+ 種類から色みを決める対応表 (`CLASS_RELATION_TONE`) を足し、6 種を 3 群に寄せた。
19
+
20
+ | 群 | 種類 | 色み | 群の中の見分け |
21
+ |---|---|---|---|
22
+ | 縦の関係 | `extends` / `implements` | `accent` | 線 (実線 / 破線) |
23
+ | 所有 | `aggregates` / `composes` | `teal` | 印の塗り (白抜き / 塗る) |
24
+ | 向きだけ | `associates` / `uses` | `success` | 線 (実線 / 破線) |
25
+
26
+ **群の中は色を分けない**。 群の中の 2 種は既に線か印の塗りで分かれているので、
27
+ 色まで足すと同じことを 2 回言うことになる。 色が担うのは群の見分けだけ。
28
+
29
+ 優先順位は 関係に書いた色み > 図に書いた `defaultTone` > 種類から決まる既定 の 3 段。
30
+ `defaultTone` を書いた図は「全部同じ色みにする」 と宣言しているので、そちらが勝つ =
31
+ 既存の図の見た目は変わらない。
32
+
33
+ **色の値は持たない**。 名前だけを図に載せ、実際の色は消費側が `data-cdl-tone` を見て当てる。
34
+
35
+ ### Fixed
36
+
37
+ - **比較 link が 404 になっていた 6 版に tag を打った** (#639)
38
+
39
+ 変更履歴は 31 版ぶんの比較 link を持つが、tag があるのは 25 版だった。
40
+ `0.17.0` / `0.17.1` / `0.18.0` / `0.18.1` / `0.24.0` / `0.25.0` の 6 本が飛び先を持たず、
41
+ 押すと 404 になる。 この file は npm の配布物に入るので、`node_modules` から読んだ
42
+ 利用者にも 404 が届いていた。
43
+
44
+ 6 本とも、その版の値を持つ commit に打った。
45
+ 最上位の tag は `v0.27.0` のままなので、版の範囲を導く検査の判定は変わらない。
46
+
47
+ **`0.27.0` の記述に書いた tag の数も直した**。 「`v0.9.0` までしか tag が無い」 と
48
+ 書いていたが、実測では `v0.23.0` まであった。 `git tag --list` の並びを版順と読み違えた
49
+ もので、`--sort=-v:refname` で確かめると最上位は `v0.23.0` になる。
50
+ tag を打つ判断そのものは変わらない = `v0.23.0` を起点にしても 4 版ぶんが範囲に入る。
51
+
52
+ ### Added
53
+
54
+ - **版に入る commit が変更履歴から辿れることを検査する** (#637)
55
+
56
+ `0.27.0` を切る時に doc だけの PR (#633) の entry を書き忘れたが、既存の検査は 1 つも
57
+ 落ちなかった。 `release-packaging.test.ts` は公開物に変更履歴が入るかと比較 link の形しか
58
+ 見ないため、commit の記載漏れは素通りする。
59
+
60
+ 前の版から HEAD までの各 commit について、その commit が持つ番号のどれかが変更履歴に
61
+ 載っているか「利用者から見えない」 と宣言されていることを見る検査を足した。
62
+ 消費側 (dragon) の同名の検査を移したもので、あちらでは tag の打ち忘れと宣言の残骸を
63
+ 実際に捕まえている。
64
+
65
+ **併せて `v0.26.0` と `v0.27.0` の tag を打った**。 検査は版の範囲を tag から導くので、
66
+ 無いと起点が `v0.23.0` まで下がり、`0.24.0` から `0.27.0` の 4 版ぶんが範囲に入って使えない。
67
+ 間の版の tag は打っていない = 範囲の判定に効くのはいちばん新しい tag だけ。
68
+
69
+ ## [0.27.0] - 2026-09-04
70
+
71
+ ### Changed
72
+
73
+ - **高さの式の説明を印の有無で分けた** (#633)
74
+
75
+ 公開している `requiredRowsHeight` の説明が「`rows` を持つ node に必要な高さ」 と述べていたが、
76
+ 印を持つ箱は #631 から別の式で決まる。 読んだ人が印を持つ箱を 24 高く組まないよう、
77
+ 適用先を印を持たない箱に限定し、印を持つ箱がどこを起点にするかを 1 文で書いた。
78
+
79
+ 併せて、実在しない消費側の名指し (`dragon の sequence header 等`) を落とした。
80
+ 消費側を全件走査すると呼出は 0 件で、この記述は #631 より前から食い違っていた。
81
+
82
+ doc comment のみで、関数の中身と公開面は変えていない。
83
+
84
+ ### Fixed
85
+
86
+ - **行の縞が終わる位置から箱の下余白を取るようにした** (#631)
87
+
88
+ 行頭の印 (`rowMarks`) を持つ箱は、最後の行の中線から 76 下を下端にしていた。
89
+ 縞の帯は中線から 28 下で終わるため、差の 48 が行送り 56 に近い空の行 1 つに見えていた。
90
+ 縞が最後の行に乗る時は余白が面の色の帯に読め、乗らない時は最後の行が倍の高さに
91
+ 見えるため、どちらも行がそこで終わることを読めなかった。
92
+
93
+ 箱の下端を、最後の行に対応する縞の帯の下端から 24 下に置く。
94
+ 24 は箱の角の丸み 16 より大きく、これを下回ると縞の四角い角が丸みからはみ出して
95
+ 四隅に色が出る。
96
+ 余白は別の定数から足さず **帯から導く** ため、行送りを変えた時も字と帯だけが動いて
97
+ 余白が取り残されない。
98
+
99
+ 印を持たない箱の高さは変わらない。
100
+ `rowMarks` を持つ箱すべてに効き、組み立て器では `er()` / `stateMachine()` /
101
+ `classDiagram()` の 3 つが印を付ける。
102
+ 対象の箱は高さが 24 縮む。
103
+
8
104
  ## [0.26.0] - 2026-09-03
9
105
 
10
106
  ### Added
@@ -1315,7 +1411,9 @@ Initial OSS release.
1315
1411
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
1316
1412
  行き止まりになる。
1317
1413
 
1318
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.26.0...HEAD
1414
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.28.0...HEAD
1415
+ [0.28.0]: https://github.com/cardene777/cdl/compare/v0.27.0...v0.28.0
1416
+ [0.27.0]: https://github.com/cardene777/cdl/compare/v0.26.0...v0.27.0
1319
1417
  [0.26.0]: https://github.com/cardene777/cdl/compare/v0.25.0...v0.26.0
1320
1418
  [0.25.0]: https://github.com/cardene777/cdl/compare/v0.24.0...v0.25.0
1321
1419
  [0.24.0]: https://github.com/cardene777/cdl/compare/v0.23.0...v0.24.0
package/dist/index.cjs CHANGED
@@ -11838,6 +11838,7 @@ function rowGlyphDepth(kind) {
11838
11838
  return Math.ceil(font * ROW_GLYPH_DEPTH_RATIO);
11839
11839
  }
11840
11840
  var ROW_LAYOUT_BOTTOM_PAD = 20;
11841
+ var ROW_STRIPE_BOTTOM_PAD = 24;
11841
11842
  function requiredRowsHeight(kind, rowCount) {
11842
11843
  if (rowCount <= 0) return null;
11843
11844
  const lastBaseline = rowBaselineY(kind, rowCount - 1);
@@ -11845,6 +11846,12 @@ function requiredRowsHeight(kind, rowCount) {
11845
11846
  const pitch = kind === "storage" ? ROW_PITCH_STORAGE : ROW_PITCH_GENERIC;
11846
11847
  return lastBaseline + pitch + ROW_LAYOUT_BOTTOM_PAD;
11847
11848
  }
11849
+ function requiredMarkedRowsHeight(kind, rowCount) {
11850
+ if (rowCount <= 0) return null;
11851
+ const lastBand = rowStripeBand(kind, rowCount - 1, 0);
11852
+ if (lastBand === null) return null;
11853
+ return lastBand.y + lastBand.h + ROW_STRIPE_BOTTOM_PAD;
11854
+ }
11848
11855
  function isRenderedNode(n) {
11849
11856
  if (n.visibleIf === void 0 || n.visibleIf === "") return true;
11850
11857
  if (n.visibleIf.includes("{")) return true;
@@ -19967,7 +19974,10 @@ function autoStorageHeight(n, defaultH) {
19967
19974
  const \u7E70\u308A\u4E0A\u3052 = n.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("storage");
19968
19975
  if (!n.rows || n.rows.length === 0) return 115 + \u547C\u3073\u540D\u306E\u5206 - \u7E70\u308A\u4E0A\u3052;
19969
19976
  const \u5FC5\u8981 = requiredRowsHeight("storage", n.rows.length) ?? defaultH;
19970
- if (\u5370\u3042\u308A) return \u5FC5\u8981 + \u547C\u3073\u540D\u306E\u5206;
19977
+ if (\u5370\u3042\u308A) {
19978
+ const \u5E2F\u304B\u3089\u5FC5\u8981 = requiredMarkedRowsHeight("storage", n.rows.length) ?? defaultH;
19979
+ return \u5E2F\u304B\u3089\u5FC5\u8981 + \u547C\u3073\u540D\u306E\u5206;
19980
+ }
19971
19981
  return Math.max(defaultH, \u5FC5\u8981);
19972
19982
  }
19973
19983
  function autoRowsWidth(n, defaultW) {
@@ -30822,6 +30832,14 @@ var CLASS_RELATION_LOOK = {
30822
30832
  associates: { head: "open", fill: "solid", tailHead: "none", tailFill: "solid", style: "solid" },
30823
30833
  uses: { head: "open", fill: "solid", tailHead: "none", tailFill: "solid", style: "dashed" }
30824
30834
  };
30835
+ var CLASS_RELATION_TONE = {
30836
+ extends: "accent",
30837
+ implements: "accent",
30838
+ aggregates: "teal",
30839
+ composes: "teal",
30840
+ associates: "success",
30841
+ uses: "success"
30842
+ };
30825
30843
  Object.fromEntries(
30826
30844
  Object.entries(CLASS_RELATION_LOOK).map(([k, v]) => [k, v.head])
30827
30845
  );
@@ -30834,7 +30852,7 @@ function stripAccess(row) {
30834
30852
  }
30835
30853
  function classDiagram(preset) {
30836
30854
  const classW = resolveStorageBoxW(preset.classWidth, "classDiagram", "classWidth");
30837
- const tone = preset.defaultTone ?? "info";
30855
+ const \u56F3\u306E\u65E2\u5B9A = preset.defaultTone;
30838
30856
  const \u7E1E\u3092\u6577\u304F = preset.rowStripe ?? true;
30839
30857
  const b = diagram(preset.id, { topic: preset.topic, palette: preset.palette });
30840
30858
  const classes = [];
@@ -30898,7 +30916,7 @@ function classDiagram(preset) {
30898
30916
  id: edgeId,
30899
30917
  label: r.label ?? r.type,
30900
30918
  ...r.cardinality ? { sub: r.cardinality } : {},
30901
- tone: r.tone ?? tone,
30919
+ tone: r.tone ?? \u56F3\u306E\u65E2\u5B9A ?? CLASS_RELATION_TONE[r.type],
30902
30920
  // 関係の種類から線と端の形を決める (cdl#574 / #578)。 書いた値が勝つ
30903
30921
  style: r.style ?? \u898B\u305F\u76EE.style,
30904
30922
  head: r.head ?? \u898B\u305F\u76EE.head,