@cardenelabs/cdl 0.104.0 → 0.105.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,49 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.105.0] - 2026-09-30
9
+
10
+ ### Fixed
11
+
12
+ - **箱の題の幅を、その種別が描く大きさから見積もるようにした** (#946)
13
+
14
+ 軸 3 (`text-readability`) は「字数 × 1 字の幅 + 余白」 が箱の幅を超えるかで、題が切れる
15
+ 可能性を見る。 1 字の幅を 22 の定数で持っていたが、`NODE_KINDS` を全件描いて題の字の
16
+ 大きさを読むと **22 で描く種別は 1 つも無かった**。
17
+
18
+ | 大きさ | 種別の数 |
19
+ |---|---|
20
+ | 18 | 34 |
21
+ | 20 | 21 |
22
+ | 15 | 21 |
23
+ | 16 | 6 |
24
+ | 13 | 5 |
25
+ | 24 | 3 |
26
+ | 34 / 32 / 17 | 各 1 |
27
+
28
+ 見積りが実物の 1.2 倍から 1.7 倍になり、収まっている題まで挙がっていた。
29
+ 0.99.0 (#933) でどの種別も箱の題を読むようになってから差が表に出て、引く側 (見本帳) では
30
+ 35 枚が新しく挙がっていた。 いずれも実際には収まっている。
31
+
32
+ 種別ごとの大きさを `titleFontSize` に持ち、見積りをそこから出すようにした。
33
+
34
+ **内側の余白 (52) は、題を箱の中に描く種別にだけ足す**。
35
+ 形だけを描く `dyn-*` 5 種は名前を箱の上に描き、図表 15 種も題を箱の上に描く。
36
+ 箱の内側の余白に縛られないので、足すと収まっている題が挙がる。
37
+ どの種別が外に描くかは `drawsTitleOutsideBox` が持つ。
38
+
39
+ **一覧は実物と突き合わせる**。
40
+ `test/title-width-estimate.test.tsx` が `NODE_KINDS` を全件描き、表の値が実測を下回らず
41
+ 実測 + 1 未満であることと、題の役割名 (`node-label` / `shape-name` / `figure-title`) が
42
+ 述語と揃っていることを見る。 種別が増えた時に黙ってずれない。
43
+
44
+ 表が持つのは **箱が十分に大きい時の大きさ** になる。 `shape-*` の多くは箱の高さに比例して
45
+ 字を縮めるため、狭い箱では実物のほうが小さい。 見積りが実物を下回らない側に倒れるので、
46
+ 切れる題を見逃す向きには外れない。
47
+
48
+ 軸 `responsive-viewport` が使う基準の 22 は動かしていない。
49
+ 図の中の文字全体を見る目安で、題の幅を見る本軸とは別の判定になる。
50
+
8
51
  ## [0.104.0] - 2026-09-30
9
52
 
10
53
  ### Fixed
@@ -4220,7 +4263,8 @@ Initial OSS release.
4220
4263
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
4221
4264
  行き止まりになる。
4222
4265
 
4223
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.104.0...HEAD
4266
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.105.0...HEAD
4267
+ [0.105.0]: https://github.com/cardene777/cdl/compare/v0.104.0...v0.105.0
4224
4268
  [0.104.0]: https://github.com/cardene777/cdl/compare/v0.103.0...v0.104.0
4225
4269
  [0.103.0]: https://github.com/cardene777/cdl/compare/v0.102.0...v0.103.0
4226
4270
  [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",
@@ -17161,7 +17226,7 @@ function runAxes(laid, diag, violations, counts, push, profile, skippedAxes, \u5
17161
17226
  const titleTrimmed = n.title?.trim() ?? "";
17162
17227
  if (!titleTrimmed) continue;
17163
17228
  const titleLen = titleTrimmed.length;
17164
- const expectedW = titleLen * 22 + 52;
17229
+ const expectedW = titleLen * titleFontSize(n.kind) + (drawsTitleOutsideBox(n.kind) ? 0 : TITLE_BOX_PADDING);
17165
17230
  if (expectedW > n.w + 8) {
17166
17231
  push(
17167
17232
  "text-readability",