@cardenelabs/cdl 0.104.0 → 0.106.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,71 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.106.0] - 2026-09-30
9
+
10
+ ### Fixed
11
+
12
+ - **箱の題の幅を、字ごとの実幅で見積もるようにした** (#949)
13
+
14
+ 軸 3 (`text-readability`) は字数に 1 字の幅を掛けて見積もっていた。
15
+ 英数字は全角の半分ほどしか取らないため、英数字の題を持つ箱で過大に見積もる。
16
+
17
+ | 題 | 種別 | 字数の近似 | 字ごとの実幅 |
18
+ |---|---|---|---|
19
+ | `order_items` | `storage` (34) | 426px | 約 250px |
20
+
21
+ engine は字ごとの実幅を出す `measureTextWidth` を既に持ち、辺の名札の外枠で使っている。
22
+ 軸 3 だけが字数の近似を使っていたので、同じものに揃えた。
23
+
24
+ 0.105.0 (#946) で 1 字の幅を種別ごとの実寸にした結果、大きく描く種別
25
+ (`storage` 34 / `actor` 32 / `card` 24 / `function` 24) で英数字の題が新しく挙がっていた。
26
+ 引く側 (見本帳) で 11 枚を実測している。 本版でその 11 枚が挙がらなくなる。
27
+
28
+ 判定の向きは変えていない。 全角の題が箱に収まらない場合は従来どおり挙がる。
29
+
30
+ ## [0.105.0] - 2026-09-30
31
+
32
+ ### Fixed
33
+
34
+ - **箱の題の幅を、その種別が描く大きさから見積もるようにした** (#946)
35
+
36
+ 軸 3 (`text-readability`) は「字数 × 1 字の幅 + 余白」 が箱の幅を超えるかで、題が切れる
37
+ 可能性を見る。 1 字の幅を 22 の定数で持っていたが、`NODE_KINDS` を全件描いて題の字の
38
+ 大きさを読むと **22 で描く種別は 1 つも無かった**。
39
+
40
+ | 大きさ | 種別の数 |
41
+ |---|---|
42
+ | 18 | 34 |
43
+ | 20 | 21 |
44
+ | 15 | 21 |
45
+ | 16 | 6 |
46
+ | 13 | 5 |
47
+ | 24 | 3 |
48
+ | 34 / 32 / 17 | 各 1 |
49
+
50
+ 見積りが実物の 1.2 倍から 1.7 倍になり、収まっている題まで挙がっていた。
51
+ 0.99.0 (#933) でどの種別も箱の題を読むようになってから差が表に出て、引く側 (見本帳) では
52
+ 35 枚が新しく挙がっていた。 いずれも実際には収まっている。
53
+
54
+ 種別ごとの大きさを `titleFontSize` に持ち、見積りをそこから出すようにした。
55
+
56
+ **内側の余白 (52) は、題を箱の中に描く種別にだけ足す**。
57
+ 形だけを描く `dyn-*` 5 種は名前を箱の上に描き、図表 15 種も題を箱の上に描く。
58
+ 箱の内側の余白に縛られないので、足すと収まっている題が挙がる。
59
+ どの種別が外に描くかは `drawsTitleOutsideBox` が持つ。
60
+
61
+ **一覧は実物と突き合わせる**。
62
+ `test/title-width-estimate.test.tsx` が `NODE_KINDS` を全件描き、表の値が実測を下回らず
63
+ 実測 + 1 未満であることと、題の役割名 (`node-label` / `shape-name` / `figure-title`) が
64
+ 述語と揃っていることを見る。 種別が増えた時に黙ってずれない。
65
+
66
+ 表が持つのは **箱が十分に大きい時の大きさ** になる。 `shape-*` の多くは箱の高さに比例して
67
+ 字を縮めるため、狭い箱では実物のほうが小さい。 見積りが実物を下回らない側に倒れるので、
68
+ 切れる題を見逃す向きには外れない。
69
+
70
+ 軸 `responsive-viewport` が使う基準の 22 は動かしていない。
71
+ 図の中の文字全体を見る目安で、題の幅を見る本軸とは別の判定になる。
72
+
8
73
  ## [0.104.0] - 2026-09-30
9
74
 
10
75
  ### Fixed
@@ -4220,7 +4285,9 @@ Initial OSS release.
4220
4285
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
4221
4286
  行き止まりになる。
4222
4287
 
4223
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.104.0...HEAD
4288
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.106.0...HEAD
4289
+ [0.106.0]: https://github.com/cardene777/cdl/compare/v0.105.0...v0.106.0
4290
+ [0.105.0]: https://github.com/cardene777/cdl/compare/v0.104.0...v0.105.0
4224
4291
  [0.104.0]: https://github.com/cardene777/cdl/compare/v0.103.0...v0.104.0
4225
4292
  [0.103.0]: https://github.com/cardene777/cdl/compare/v0.102.0...v0.103.0
4226
4293
  [0.102.0]: https://github.com/cardene777/cdl/compare/v0.101.0...v0.102.0
package/dist/index.cjs CHANGED
@@ -12377,6 +12377,71 @@ var KINDS_FITTING_OWN_TITLE = /* @__PURE__ */ new Set([
12377
12377
  function fitsOwnTitleWidth(kind) {
12378
12378
  return KINDS_FITTING_OWN_TITLE.has(kind ?? "");
12379
12379
  }
12380
+ var KINDS_DRAWING_TITLE_OUTSIDE = /* @__PURE__ */ new Set([
12381
+ "dyn-rect",
12382
+ "dyn-circle",
12383
+ "dyn-arc",
12384
+ "dyn-wave",
12385
+ "dyn-polygon",
12386
+ ...KINDS_DRAWING_OWN_PAYLOAD
12387
+ ]);
12388
+ function drawsTitleOutsideBox(kind) {
12389
+ return KINDS_DRAWING_TITLE_OUTSIDE.has(kind ?? "");
12390
+ }
12391
+ var TITLE_FONT_SIZE_DEFAULT = 18;
12392
+ var TITLE_FONT_SIZE = new Map([
12393
+ ...["dyn-rect", "dyn-circle", "dyn-arc", "dyn-wave", "dyn-polygon"].map(
12394
+ (k) => [k, 13]
12395
+ ),
12396
+ ...[
12397
+ "shape-code-block",
12398
+ "shape-cylinder",
12399
+ "shape-diamond",
12400
+ "shape-iot-sensor",
12401
+ "shape-robot-arm",
12402
+ "shape-stack",
12403
+ "shape-terminal"
12404
+ ].map((k) => [k, 15]),
12405
+ ...[
12406
+ "shape-cloud",
12407
+ "shape-file",
12408
+ "shape-folder",
12409
+ "shape-hexagon",
12410
+ "shape-message-bubble",
12411
+ "shape-window"
12412
+ ].map((k) => [k, 16]),
12413
+ ["shape-kanban-card", 17],
12414
+ ...[
12415
+ "admin",
12416
+ "api",
12417
+ "backend",
12418
+ "cache",
12419
+ "cdn",
12420
+ "cloud",
12421
+ "database",
12422
+ "decision",
12423
+ "developer",
12424
+ "external-user",
12425
+ "frontend",
12426
+ "merkle-tree",
12427
+ "message-bus",
12428
+ "microservice",
12429
+ "oracle",
12430
+ "person",
12431
+ "queue",
12432
+ "service",
12433
+ "signer",
12434
+ "user-group",
12435
+ "webhook"
12436
+ ].map((k) => [k, 20]),
12437
+ ...["card", "event", "function"].map((k) => [k, 24]),
12438
+ ["actor", 32],
12439
+ ["storage", 34]
12440
+ ]);
12441
+ function titleFontSize(kind) {
12442
+ return TITLE_FONT_SIZE.get(kind ?? "") ?? TITLE_FONT_SIZE_DEFAULT;
12443
+ }
12444
+ var TITLE_BOX_PADDING = 52;
12380
12445
  var KINDS_DRAWN_BY_GENERIC = [
12381
12446
  "person",
12382
12447
  "user-group",
@@ -17160,12 +17225,12 @@ function runAxes(laid, diag, violations, counts, push, profile, skippedAxes, \u5
17160
17225
  if (!isRenderedNode(n)) continue;
17161
17226
  const titleTrimmed = n.title?.trim() ?? "";
17162
17227
  if (!titleTrimmed) continue;
17163
- const titleLen = titleTrimmed.length;
17164
- const expectedW = titleLen * 22 + 52;
17228
+ const expectedW = measureTextWidth(titleTrimmed, { fontSize: titleFontSize(n.kind) }) + (drawsTitleOutsideBox(n.kind) ? 0 : TITLE_BOX_PADDING);
17165
17229
  if (expectedW > n.w + 8) {
17166
17230
  push(
17167
17231
  "text-readability",
17168
- `node "${n.id}" title "${n.title}" \u304C node \u5E45 ${n.w}px \u3092\u8D85\u904E\u3059\u308B\u53EF\u80FD\u6027 (\u671F\u5F85 ${expectedW}px)`,
17232
+ // 字ごとの実幅は小数になるので、読む人に出す時だけ丸める (判定は丸めない)
17233
+ `node "${n.id}" title "${n.title}" \u304C node \u5E45 ${n.w}px \u3092\u8D85\u904E\u3059\u308B\u53EF\u80FD\u6027 (\u671F\u5F85 ${Math.round(expectedW)}px)`,
17169
17234
  "warn"
17170
17235
  );
17171
17236
  }