@cardenelabs/cdl 0.56.0 → 0.57.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,22 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.57.0] - 2026-09-11
9
+
10
+ ### Changed
11
+
12
+ - **箱の説明文が幅に入らない時、字を縮めずに 2 行へ折るようにした** (#843)
13
+
14
+ 説明文 (`subtitle`) は幅に入らないと字を 21 から 11 まで小さくして 1 行に収めていた。 下限まで縮むと、
15
+ 同じ図の中で同じ役割の字が 2 倍近く違って見える (実測 = 状態図で 待機 の説明文が 19、読み込み が 11)。
16
+
17
+ 読みやすさの下限 (12) を割る時は 2 行に折る。 折る位置は ` / ` のような区切りを優先し、無ければ空白、
18
+ それも無ければ字の境目で割る。 2 行にしても入らない時と、2 行を置く余白が無い低い箱は、今までどおり
19
+ 縮めて 1 行で描く。
20
+
21
+ 箱の幅と高さは変えていない。 幅を広げると状態を横に並べる図が横長になり、器に収めた時に題名の方が
22
+ 小さくなるため (#357 で幅を絞った経緯)。 2 行は、説明文の下の余白と題名との間に収める。
23
+
8
24
  ## [0.56.0] - 2026-09-11
9
25
 
10
26
  ### Changed
@@ -2509,7 +2525,8 @@ Initial OSS release.
2509
2525
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
2510
2526
  行き止まりになる。
2511
2527
 
2512
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.56.0...HEAD
2528
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.57.0...HEAD
2529
+ [0.57.0]: https://github.com/cardene777/cdl/compare/v0.56.0...v0.57.0
2513
2530
  [0.56.0]: https://github.com/cardene777/cdl/compare/v0.55.0...v0.56.0
2514
2531
  [0.55.0]: https://github.com/cardene777/cdl/compare/v0.54.0...v0.55.0
2515
2532
  [0.54.0]: https://github.com/cardene777/cdl/compare/v0.53.0...v0.54.0
package/dist/index.cjs CHANGED
@@ -23387,6 +23387,55 @@ function ActorNode({ node, active, value }) {
23387
23387
  )
23388
23388
  ] });
23389
23389
  }
23390
+
23391
+ // src/kinds/subtitle-lines.ts
23392
+ var SUBTITLE_SIZE = 21;
23393
+ var SUBTITLE_MIN_SIZE = 12;
23394
+ var \u884C\u9001\u308A\u306E\u500D\u7387 = 1.2;
23395
+ function \u8AAC\u660E\u6587\u3092\u5272\u308A\u4ED8\u3051\u308B(text, maxWidth, opts) {
23396
+ const \u76EE\u6A19 = opts.targetSize ?? SUBTITLE_SIZE;
23397
+ const \u8AAD\u3081\u308B\u5927\u304D\u3055 = fitTextSize(text, maxWidth, \u76EE\u6A19, SUBTITLE_MIN_SIZE);
23398
+ if (estimateTextWidth(text, \u8AAD\u3081\u308B\u5927\u304D\u3055) <= maxWidth) return { size: \u8AAD\u3081\u308B\u5927\u304D\u3055, lines: [text] };
23399
+ if (opts.\u4E8C\u884C\u307E\u3067) {
23400
+ for (let size = \u76EE\u6A19; size >= SUBTITLE_MIN_SIZE; size -= 1) {
23401
+ const \u884C = \u4E8C\u884C\u306B\u5272\u308B(text, maxWidth, size);
23402
+ if (\u884C) return { size, lines: \u884C };
23403
+ }
23404
+ }
23405
+ return { size: fitTextSize(text, maxWidth, \u76EE\u6A19, MIN_TEXT_SIZE), lines: [text] };
23406
+ }
23407
+ function \u4E8C\u884C\u306B\u5272\u308B(text, maxWidth, size) {
23408
+ let \u4E00\u756A\u826F\u3044;
23409
+ let \u4E00\u756A\u72ED\u3044 = Infinity;
23410
+ for (const [\u5DE6, \u53F3] of \u5272\u308B\u5019\u88DC(text)) {
23411
+ const \u5E45 = Math.max(estimateTextWidth(\u5DE6, size), estimateTextWidth(\u53F3, size));
23412
+ if (\u5E45 > maxWidth || \u5E45 >= \u4E00\u756A\u72ED\u3044) continue;
23413
+ \u4E00\u756A\u72ED\u3044 = \u5E45;
23414
+ \u4E00\u756A\u826F\u3044 = [\u5DE6, \u53F3];
23415
+ }
23416
+ return \u4E00\u756A\u826F\u3044;
23417
+ }
23418
+ function \u5272\u308B\u5019\u88DC(text) {
23419
+ const \u533A\u5207\u308A = [];
23420
+ for (const m of text.matchAll(/\s*\/\s*/g)) {
23421
+ \u533A\u5207\u308A.push([text.slice(0, m.index).trim(), text.slice(m.index + m[0].length).trim()]);
23422
+ }
23423
+ if (\u533A\u5207\u308A.length > 0) return \u533A\u5207\u308A.filter(\u5165\u3063\u3066\u3044\u308B);
23424
+ const \u7A7A\u767D = [];
23425
+ for (const m of text.matchAll(/\s+/g)) {
23426
+ \u7A7A\u767D.push([text.slice(0, m.index).trim(), text.slice(m.index + m[0].length).trim()]);
23427
+ }
23428
+ if (\u7A7A\u767D.length > 0) return \u7A7A\u767D.filter(\u5165\u3063\u3066\u3044\u308B);
23429
+ const \u5B57 = [];
23430
+ const \u4E26\u3073 = [...text];
23431
+ for (let i = 1; i < \u4E26\u3073.length; i += 1) {
23432
+ \u5B57.push([\u4E26\u3073.slice(0, i).join(""), \u4E26\u3073.slice(i).join("")]);
23433
+ }
23434
+ return \u5B57.filter(\u5165\u3063\u3066\u3044\u308B);
23435
+ }
23436
+ function \u5165\u3063\u3066\u3044\u308B([\u5DE6, \u53F3]) {
23437
+ return \u5DE6 !== "" && \u53F3 !== "";
23438
+ }
23390
23439
  function CardNode({ node, active }) {
23391
23440
  const accent = nodeAccent(node, "var(--cdl-tone-accent, #2d6a8f)");
23392
23441
  const x = node.cx - node.w / 2;
@@ -23411,7 +23460,12 @@ function CardNode({ node, active }) {
23411
23460
  const initialTitleSize = compact ? 20 : 24;
23412
23461
  const titleSize = fitTextSize(node.title, availableW, initialTitleSize, 11);
23413
23462
  const textAnchor = compact ? "middle" : "start";
23414
- const subtitleSize = node.subtitle ? fitTextSize(node.subtitle, availableW, 21, 11) : 21;
23463
+ const subtitleY = 124 - \u305A\u3089\u3057;
23464
+ const \u6700\u5927\u306E\u884C\u9001\u308A = SUBTITLE_SIZE * \u884C\u9001\u308A\u306E\u500D\u7387;
23465
+ const \u4E8C\u884C\u304C\u5165\u308B = !compact && subtitleY - \u6700\u5927\u306E\u884C\u9001\u308A / 2 - SUBTITLE_SIZE * ASCENT2 > titleY + titleSize * DESCENT2 && subtitleY + \u6700\u5927\u306E\u884C\u9001\u308A / 2 + SUBTITLE_SIZE * DESCENT2 <= node.h - 4;
23466
+ const \u8AAC\u660E = node.subtitle ? \u8AAC\u660E\u6587\u3092\u5272\u308A\u4ED8\u3051\u308B(node.subtitle, availableW, { \u4E8C\u884C\u307E\u3067: \u4E8C\u884C\u304C\u5165\u308B }) : void 0;
23467
+ const subtitleSize = \u8AAC\u660E?.size ?? 21;
23468
+ const \u884C\u9001\u308A = subtitleSize * \u884C\u9001\u308A\u306E\u500D\u7387;
23415
23469
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${x} ${y})`, children: [
23416
23470
  /* @__PURE__ */ jsxRuntime.jsx(
23417
23471
  "rect",
@@ -23441,7 +23495,17 @@ function CardNode({ node, active }) {
23441
23495
  children: node.title
23442
23496
  }
23443
23497
  ),
23444
- !compact && node.subtitle && /* @__PURE__ */ jsxRuntime.jsx("text", { x: 26, y: 124 - \u305A\u3089\u3057, fontSize: subtitleSize, fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle }),
23498
+ !compact && \u8AAC\u660E?.lines.map((\u884C, i) => /* @__PURE__ */ jsxRuntime.jsx(
23499
+ "text",
23500
+ {
23501
+ x: 26,
23502
+ y: subtitleY + (i - (\u8AAC\u660E.lines.length - 1) / 2) * \u884C\u9001\u308A,
23503
+ fontSize: subtitleSize,
23504
+ fill: "var(--cdl-text-dim, #5a6270)",
23505
+ children: \u884C
23506
+ },
23507
+ `sub-${i}`
23508
+ )),
23445
23509
  \u5C0F\u578B\u306B\u547C\u3073\u540D && /* @__PURE__ */ jsxRuntime.jsx(
23446
23510
  "text",
23447
23511
  {