@cardenelabs/cdl 0.117.0 → 0.119.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,87 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.119.0] - 2026-10-01
9
+
10
+ ### Fixed
11
+
12
+ - **線の端に添える数が、同じ端の印に貼り付いて読めた** (#984)
13
+
14
+ クラス図の多重度 (`1` / `1..*`) が、集約とコンポジションの菱の印と同じ高さに並び、
15
+ 2 つが 1 つの塊として読めていた。
16
+
17
+ 置き場所は端から線に沿って 22 戻り、線の脇へ 8 離した所に決まる。
18
+ 22 は印の長さの最大 14 に余白 8 を足した値で、**線に沿う向きだけ** を見ていた。
19
+ 印は直角の向きにも広がり、菱と三角は線の芯から 7 ある。
20
+ 線の脇へ 8 しか離さないので、印の縁と字の箱の間は 1 しか空かなかった。
21
+
22
+ | 向き | 印の広がり | 字までの距離 | 空き |
23
+ |---|---|---|---|
24
+ | 線に沿う | 14 | 22 | 8 |
25
+ | 直角 (前) | 7 | 8 | 1 |
26
+ | 直角 (後) | 7 | 15 | 8 |
27
+
28
+ 線の脇へ離す距離を、印の張り出し (印の縦の半分) に余白を足した値から導くようにした。
29
+ 余白は線に沿う向きが使っているものと同じ値なので、2 つの向きで空き方が揃う。
30
+
31
+ 線に沿って戻る距離 (22) は変えていない。
32
+ この値は箱と箱の間隔を決める計算 (`端の字に要る線の長さ`) に入っており、
33
+ 変えると図の高さが動く。
34
+
35
+ 印の大きさ (14 / 10) は `EDGE_HEAD_MARKER_SIZE` に出し、marker を定義する側と
36
+ 字を置く側の両方が引くようにした。
37
+ 片方に数を直に書くと、印を大きくした時に字だけが元の位置に残る。
38
+
39
+ 置き場所の検査も直した。
40
+ 箱と札と他の端の字とは突き合わせていたが、**自分の端の印とは突き合わせていなかった**。
41
+ 2 つの箱の隙間では見えない = 字は端から線に沿って戻した所に置くので、軸ごとの離れ方の
42
+ 大きいほう (線に沿う向きの値) が返り、直角の向きが 1 まで詰まっても同じ数字が出る。
43
+ 詰まる側の軸だけを見る検査を足し、字を直す前の位置へ寄せ直す植え込み対照を添えた。
44
+
45
+
46
+ ## [0.118.0] - 2026-10-01
47
+
48
+ ### Fixed
49
+
50
+ - **呼び名を書いた箱の下の余白が、上の 2 倍空いていた** (#974)
51
+
52
+ `storage` の箱に呼び名 (`subtitle`) を書くと、字が上に貼り付いて箱が下に間延びしていた。
53
+
54
+ | 書き方 | 箱の高さ | 上の余白 | 下の余白 |
55
+ |---|---|---|---|
56
+ | 名前だけ | 79 | 揃う | 揃う |
57
+ | 小見出し + 名前 | 115 | 揃う | 揃う |
58
+ | 名前 + 説明 | 125 | 17 | 39 |
59
+ | 小見出し + 名前 + 説明 | 161 | 21 | 39 |
60
+
61
+ 許容は 7 なので、呼び名を書いた 2 通りだけが外れていた。
62
+
63
+ 高さを決める側が、呼び名の分として **行の群を下げる幅** (`SUBTITLE_ROW_SHIFT` = 46) を
64
+ そのまま足していた。 46 は行を持つ箱で行の塊を何 world 下げるかの値で、
65
+ **行を持たない箱には下げる相手が居ない**。
66
+
67
+ 足すべきなのは字の塊の下端が下がる分になる。
68
+ 下端は題の字形の底から呼び名の字形の底へ移るので、baseline の差に字形の深さの差を足す。
69
+
70
+ ```
71
+ 呼び名で伸びる量 = (呼び名の baseline 118 - 題の baseline 86)
72
+ + (呼び名の級 20 - 題の級 34) × 字形の深さの割合 0.4
73
+ = 26
74
+ ```
75
+
76
+ 呼び名の方が字が小さいぶん深さは浅いので、差は引き算になる。
77
+
78
+ | 書き方 | 直す前 | 直した後 |
79
+ |---|---|---|
80
+ | 名前 + 説明 | 125 | 105 |
81
+ | 小見出し + 名前 + 説明 | 161 | 141 |
82
+
83
+ **行を持つ箱は触っていない**。 そちらの 46 は行の塊を下げる分として正しく、
84
+ 描く側の下げ幅と対になっている。
85
+
86
+ 呼び名の baseline と級は `layout/spec.ts` に移した。
87
+ 描く側と高さを出す側が同じ値を読む形にしないと、片方だけ動いて箱の下が空く。
88
+
8
89
  ## [0.117.0] - 2026-10-01
9
90
 
10
91
  ### Fixed
@@ -4646,7 +4727,9 @@ Initial OSS release.
4646
4727
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
4647
4728
  行き止まりになる。
4648
4729
 
4649
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.117.0...HEAD
4730
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.119.0...HEAD
4731
+ [0.119.0]: https://github.com/cardene777/cdl/compare/v0.118.0...v0.119.0
4732
+ [0.118.0]: https://github.com/cardene777/cdl/compare/v0.117.0...v0.118.0
4650
4733
  [0.117.0]: https://github.com/cardene777/cdl/compare/v0.116.0...v0.117.0
4651
4734
  [0.116.0]: https://github.com/cardene777/cdl/compare/v0.115.0...v0.116.0
4652
4735
  [0.115.0]: https://github.com/cardene777/cdl/compare/v0.114.0...v0.115.0
package/dist/index.cjs CHANGED
@@ -12589,11 +12589,16 @@ var ROW_FONT_GENERIC = 21;
12589
12589
  var STORAGE_TITLE_BASELINE = 86;
12590
12590
  var STORAGE_TITLE_FONT = 34;
12591
12591
  var SUBTITLE_ROW_SHIFT = 46;
12592
+ var STORAGE_SUBTITLE_BASELINE = 118;
12593
+ var STORAGE_SUBTITLE_FONT = 20;
12592
12594
  var STORAGE_ROW_DIVIDER_Y = Math.round(
12593
12595
  (STORAGE_TITLE_BASELINE + (ROW_TOP_STORAGE - ROW_FONT_STORAGE * GLYPH_CAP_RATIO)) / 2
12594
12596
  );
12595
12597
  var ROW_GLYPH_DEPTH_RATIO = 0.4;
12596
12598
  var TITLE_ROW_MIN_GAP = GENERIC_TITLE_FONT * ROW_GLYPH_DEPTH_RATIO + ROW_FONT_GENERIC * GLYPH_CAP_RATIO;
12599
+ var \u547C\u3073\u540D\u3067\u4F38\u3073\u308B\u91CF = Math.round(
12600
+ STORAGE_SUBTITLE_BASELINE - STORAGE_TITLE_BASELINE + (STORAGE_SUBTITLE_FONT - STORAGE_TITLE_FONT) * ROW_GLYPH_DEPTH_RATIO
12601
+ );
12597
12602
  function rowGlyphDepth(kind) {
12598
12603
  if (!rendersRows(kind)) return null;
12599
12604
  const font = kind === "storage" ? ROW_FONT_STORAGE : ROW_FONT_GENERIC;
@@ -14688,6 +14693,7 @@ var EDGE_HEADS = [
14688
14693
  ];
14689
14694
  var EDGE_HEAD_FILL_DEFAULT = "solid";
14690
14695
  var EDGE_HEAD_FILLS = ["solid", "hollow"];
14696
+ var EDGE_HEAD_MARKER_SIZE = { \u65E2\u5B9A: 14, \u5C0F: 10 };
14691
14697
  var EDGE_REVEALS = ["phase", "all"];
14692
14698
  var RELATION_FOCUSES = ["off", "hover"];
14693
14699
  var RELATION_FOCUS_DEFAULT = "off";
@@ -21562,8 +21568,10 @@ function recomputeContainedLanes(lanes, nodes) {
21562
21568
  }
21563
21569
 
21564
21570
  // src/layout/head-label.ts
21565
- var \u7AEF\u306E\u5B57\u3092\u623B\u3059\u8DDD\u96E2 = 22;
21566
- var \u7AEF\u306E\u5B57\u3068\u7DDA\u306E\u9699\u9593 = 8;
21571
+ var \u7AEF\u306E\u5B57\u3068\u5370\u306E\u4F59\u767D = 8;
21572
+ var \u7AEF\u306E\u5370\u306E\u5F35\u308A\u51FA\u3057 = EDGE_HEAD_MARKER_SIZE.\u65E2\u5B9A / 2;
21573
+ var \u7AEF\u306E\u5B57\u3092\u623B\u3059\u8DDD\u96E2 = EDGE_HEAD_MARKER_SIZE.\u65E2\u5B9A + \u7AEF\u306E\u5B57\u3068\u5370\u306E\u4F59\u767D;
21574
+ var \u7AEF\u306E\u5B57\u3068\u7DDA\u306E\u9699\u9593 = \u7AEF\u306E\u5370\u306E\u5F35\u308A\u51FA\u3057 + \u7AEF\u306E\u5B57\u3068\u5370\u306E\u4F59\u767D;
21567
21575
  var \u7AEF\u306E\u5B57\u306E\u5927\u304D\u3055 = EDGE_LABEL_TEXT.sub.fontSize;
21568
21576
  var \u7BB1\u306E\u9AD8\u3055 = Math.round(\u7AEF\u306E\u5B57\u306E\u5927\u304D\u3055 * 1.2);
21569
21577
  var BASELINE_RATIO = 0.8;
@@ -21649,7 +21657,9 @@ function autoStorageHeight(n, defaultH) {
21649
21657
  const \u5370\u3042\u308A = n.rowMarks !== void 0;
21650
21658
  const \u547C\u3073\u540D\u306E\u5206 = n.subtitle ? SUBTITLE_ROW_SHIFT : 0;
21651
21659
  const \u7E70\u308A\u4E0A\u3052 = n.eyebrow ? 0 : \u76EE\u5370\u306A\u3057\u306E\u7E70\u308A\u4E0A\u3052("storage");
21652
- if (!n.rows || n.rows.length === 0) return 115 + \u547C\u3073\u540D\u306E\u5206 - \u7E70\u308A\u4E0A\u3052;
21660
+ if (!n.rows || n.rows.length === 0) {
21661
+ return 115 + (n.subtitle ? \u547C\u3073\u540D\u3067\u4F38\u3073\u308B\u91CF : 0) - \u7E70\u308A\u4E0A\u3052;
21662
+ }
21653
21663
  const \u5FC5\u8981 = requiredRowsHeight("storage", n.rows.length) ?? defaultH;
21654
21664
  if (\u5370\u3042\u308A) {
21655
21665
  const \u5E2F\u304B\u3089\u5FC5\u8981 = requiredMarkedRowsHeight("storage", n.rows.length) ?? defaultH;
@@ -24926,9 +24936,9 @@ var ROW_GLYPH_HALF = 7;
24926
24936
  var ROW_GLYPH_CX = ROW_PAD_X_PX + ROW_GLYPH_HALF + 1;
24927
24937
  var ROW_GLYPH_LEAD = 40;
24928
24938
  var ROW_TYPE_FONT = 22;
24929
- var SUBTITLE_BASELINE = 118;
24939
+ var SUBTITLE_BASELINE = STORAGE_SUBTITLE_BASELINE;
24930
24940
  var STRIPE_MIN_ROWS = 2;
24931
- var SUBTITLE_FONT = 20;
24941
+ var SUBTITLE_FONT = STORAGE_SUBTITLE_FONT;
24932
24942
  var UNDERLINE_DROP = 7;
24933
24943
  function RowGlyph({ mark, x, y, color }) {
24934
24944
  const \u534A = ROW_GLYPH_HALF;
@@ -33269,8 +33279,8 @@ function CdlStage({
33269
33279
  }
33270
33280
  return Object.entries(TONE).flatMap(
33271
33281
  ([tone, color]) => [
33272
- [false, 14],
33273
- [true, 10]
33282
+ [false, EDGE_HEAD_MARKER_SIZE.\u65E2\u5B9A],
33283
+ [true, EDGE_HEAD_MARKER_SIZE.\u5C0F]
33274
33284
  ].flatMap(
33275
33285
  ([small, size]) => EDGE_HEADS.flatMap(
33276
33286
  (head) => EDGE_HEAD_FILLS.map((fill) => {