@cardenelabs/cdl 0.55.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,33 @@ 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
+
24
+ ## [0.56.0] - 2026-09-11
25
+
26
+ ### Changed
27
+
28
+ - **ユーザージャーニーの気持ちの行の名前を、日本語で描くようにした** (#841)
29
+
30
+ 気持ちの曲線の左に並ぶ 5 段の行は、型の値 (`delighted` `happy` `neutral` `frustrated` `angry`) を
31
+ そのまま描いていた。 書き手の入力ではなく描く側が足す字なので、日本語の図でも英語の 5 語が並んでいた。
32
+ 行の字を 大満足 / 満足 / ふつう / 不満 / 怒り に引き替える。 型の値は書き手が記法と組み立て API に書く値なので
33
+ 変えていない。 絵文字と行の色も変えていない。
34
+
8
35
  ## [0.55.0] - 2026-09-11
9
36
 
10
37
  ### Changed
@@ -2498,7 +2525,9 @@ Initial OSS release.
2498
2525
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
2499
2526
  行き止まりになる。
2500
2527
 
2501
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.55.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
2530
+ [0.56.0]: https://github.com/cardene777/cdl/compare/v0.55.0...v0.56.0
2502
2531
  [0.55.0]: https://github.com/cardene777/cdl/compare/v0.54.0...v0.55.0
2503
2532
  [0.54.0]: https://github.com/cardene777/cdl/compare/v0.53.0...v0.54.0
2504
2533
  [0.53.0]: https://github.com/cardene777/cdl/compare/v0.52.0...v0.53.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
  {
@@ -26976,6 +27040,13 @@ function UserJourneyNode({
26976
27040
  frustrated: "\u{1F615}",
26977
27041
  angry: "\u{1F620}"
26978
27042
  };
27043
+ const emotionLabel = {
27044
+ delighted: "\u5927\u6E80\u8DB3",
27045
+ happy: "\u6E80\u8DB3",
27046
+ neutral: "\u3075\u3064\u3046",
27047
+ frustrated: "\u4E0D\u6E80",
27048
+ angry: "\u6012\u308A"
27049
+ };
26979
27050
  const rowH = canvasH / 5;
26980
27051
  const colW = canvasW / Math.max(steps.length, 1);
26981
27052
  const xAt = (idx) => PAD_LEFT2 + (steps.length <= 1 ? canvasW / 2 : colW / 2 + colW * idx);
@@ -27040,7 +27111,7 @@ function UserJourneyNode({
27040
27111
  fontWeight: 600,
27041
27112
  textAnchor: "end",
27042
27113
  fill: emotionColor[e],
27043
- children: e
27114
+ children: emotionLabel[e]
27044
27115
  }
27045
27116
  )
27046
27117
  ] }, `band-${e}`)),