@cardenelabs/cdl 0.12.0 → 0.13.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
@@ -7,6 +7,39 @@ CDL (Chainome Diagram Language) の主要変更履歴。
7
7
 
8
8
  予定 ... feedback を反映した patch / minor。
9
9
 
10
+ ## [0.13.0] - 2026-08-22
11
+
12
+ ### Added
13
+
14
+ - **放射図の中心にも補足を渡せるようにした** (#530)
15
+
16
+ 枝 (`MindBranchNode`) は元から `subtitle` を持つのに、中心だけ渡す口が無かった。 呼出側が
17
+ 名前と補足を連結して `rootTitle` に入れるため 1 行に全部入り、箱幅 120px に対して 163px の
18
+ 文字が切られていた。
19
+
20
+ `MindBranchPayload` に `rootSubtitle` を足し、枝と同じ経路で 2 行に積む。 分けて渡せば
21
+ 1 行あたりが短くなり (`図を速くする` 90px / `300 ms 短縮` 60px)、同じ箱幅でも収まる。
22
+
23
+ **箱の大きさは変えない**。 配置の計算が箱幅から出ているため。
24
+
25
+ ## [0.12.1] - 2026-08-22
26
+
27
+ ### Fixed
28
+
29
+ - **放射と木の箱で、名前が枠を超えて描かれるのを直した** (#526)
30
+
31
+ 補足 (`subtitle`) が無い箱は行を積む処理を通らず、名前をそのまま描いていた。 その経路
32
+ だけが幅を見ておらず、長い名前が箱の外へ出て枝の線と重なる (実測 = 中心の箱で文字
33
+ 163px に対し箱 120px)。
34
+
35
+ 補足の有無に関わらず箱の幅に収める。 収まらない分は末尾に `…` を付けて切る = 切られた
36
+ ことが読み手に見える。
37
+
38
+ **箱の幅は変えない**。 配置の計算が箱幅から出ているため、広げると枝どうしの重なりと
39
+ canvas 超えの確認が要る。
40
+
41
+ 同じ形は木 (`tree`) にも 2 箇所あり、併せて直した。
42
+
10
43
  ## [0.12.0] - 2026-08-21
11
44
 
12
45
  ### Added
@@ -498,7 +531,9 @@ Initial OSS release.
498
531
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
499
532
  行き止まりになる。
500
533
 
501
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.12.0...HEAD
534
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.13.0...HEAD
535
+ [0.13.0]: https://github.com/cardene777/cdl/compare/v0.12.1...v0.13.0
536
+ [0.12.1]: https://github.com/cardene777/cdl/compare/v0.12.0...v0.12.1
502
537
  [0.12.0]: https://github.com/cardene777/cdl/compare/v0.11.0...v0.12.0
503
538
  [0.11.0]: https://github.com/cardene777/cdl/compare/v0.10.0...v0.11.0
504
539
  [0.10.0]: https://github.com/cardene777/cdl/compare/v0.9.0...v0.10.0
package/dist/index.cjs CHANGED
@@ -15837,6 +15837,7 @@ function payloadTexts(node) {
15837
15837
  }
15838
15838
  if (node.mindData) {
15839
15839
  \u8DB3\u3059(node.mindData.rootTitle);
15840
+ \u8DB3\u3059(node.mindData.rootSubtitle);
15840
15841
  for (const b of node.mindData.branches) {
15841
15842
  \u8DB3\u3059(b.title);
15842
15843
  \u8DB3\u3059(b.subtitle);
@@ -21275,9 +21276,10 @@ function resolveTreeData(nodes, values) {
21275
21276
  });
21276
21277
  }
21277
21278
  function resolveMindData(data, values) {
21278
- const \u8AAD\u3080 = data.rootTitle.includes("{") || data.branches.some((b) => b.title.includes("{") || (b.subtitle?.includes("{") ?? false));
21279
+ const \u8AAD\u3080 = data.rootTitle.includes("{") || (data.rootSubtitle?.includes("{") ?? false) || data.branches.some((b) => b.title.includes("{") || (b.subtitle?.includes("{") ?? false));
21279
21280
  if (!\u8AAD\u3080) return data;
21280
21281
  const root = resolveBoundText(data.rootTitle, values);
21282
+ const rootSubtitle = data.rootSubtitle === void 0 ? void 0 : resolveBoundText(data.rootSubtitle, values);
21281
21283
  const branches = data.branches.map((b) => {
21282
21284
  const title = resolveBoundText(b.title, values);
21283
21285
  const subtitle = b.subtitle === void 0 ? void 0 : resolveBoundText(b.subtitle, values);
@@ -21288,8 +21290,13 @@ function resolveMindData(data, values) {
21288
21290
  };
21289
21291
  return title.ok && (subtitle?.ok ?? true) ? \u89E3\u6C7A\u5F8C2 : { ...\u89E3\u6C7A\u5F8C2, unresolved: true };
21290
21292
  });
21291
- const \u89E3\u6C7A\u5F8C = { ...data, rootTitle: root.value, branches };
21292
- return root.ok ? \u89E3\u6C7A\u5F8C : { ...\u89E3\u6C7A\u5F8C, unresolved: true };
21293
+ const \u89E3\u6C7A\u5F8C = {
21294
+ ...data,
21295
+ rootTitle: root.value,
21296
+ ...rootSubtitle ? { rootSubtitle: rootSubtitle.value } : {},
21297
+ branches
21298
+ };
21299
+ return root.ok && (rootSubtitle?.ok ?? true) ? \u89E3\u6C7A\u5F8C : { ...\u89E3\u6C7A\u5F8C, unresolved: true };
21293
21300
  }
21294
21301
 
21295
21302
  // src/kinds/draw-progress.ts
@@ -22000,17 +22007,20 @@ var \u884C\u9001\u308A\u306E\u6BD4 = 1.15;
22000
22007
  var \u5B57\u306E\u9AD8\u3055\u306E\u6BD4 = 0.72;
22001
22008
  var \u4E0A\u4E0B\u306E\u4F59\u767D = 2;
22002
22009
  var \u5DE6\u53F3\u306E\u4F59\u767D = 8;
22003
- function \u5E45\u3067\u5207\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E45, \u6E2C\u308B = textWidth) {
22004
- if (\u4F7F\u3048\u308B\u5E45 <= 0) return "";
22005
- if (\u6E2C\u308B(text, fontSize) <= \u4F7F\u3048\u308B\u5E45) return text;
22010
+ function \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45) {
22011
+ return \u7BB1\u306E\u5E45 - \u5DE6\u53F3\u306E\u4F59\u767D * 2;
22012
+ }
22013
+ function \u5E45\u3067\u5207\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
22014
+ if (\u4F7F\u3048\u308B\u5E452 <= 0) return "";
22015
+ if (\u6E2C\u308B(text, fontSize) <= \u4F7F\u3048\u308B\u5E452) return text;
22006
22016
  const \u7701\u7565 = "\u2026";
22007
22017
  const \u7701\u7565\u306E\u5E45 = \u6E2C\u308B(\u7701\u7565, fontSize);
22008
- if (\u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E45) return "";
22018
+ if (\u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) return "";
22009
22019
  let \u51FA = "";
22010
22020
  let \u5E45 = 0;
22011
22021
  for (const c of \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text)) {
22012
22022
  const \u5B57\u306E\u5E452 = \u6E2C\u308B(c, fontSize);
22013
- if (\u5E45 + \u5B57\u306E\u5E452 + \u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E45) break;
22023
+ if (\u5E45 + \u5B57\u306E\u5E452 + \u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) break;
22014
22024
  \u5E45 += \u5B57\u306E\u5E452;
22015
22025
  \u51FA += c;
22016
22026
  }
@@ -22028,13 +22038,13 @@ function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8
22028
22038
  const \u9AD8\u3055 = (rs) => rs.reduce((a, r) => a + r.fontSize * \u884C\u9001\u308A\u306E\u6BD4, 0);
22029
22039
  const \u6B8B\u3059 = [...\u5019\u88DC];
22030
22040
  while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
22031
- const \u4F7F\u3048\u308B\u5E45 = \u7BB1\u306E\u5E45 - \u5DE6\u53F3\u306E\u4F59\u767D * 2;
22041
+ const \u5E45 = \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45);
22032
22042
  const \u7DCF\u9AD8 = \u9AD8\u3055(\u6B8B\u3059);
22033
22043
  let \u7A4D\u307F = -\u7DCF\u9AD8 / 2;
22034
22044
  return \u6B8B\u3059.map((r) => {
22035
22045
  const dy = \u7A4D\u307F + (\u884C\u9001\u308A\u306E\u6BD4 + \u5B57\u306E\u9AD8\u3055\u306E\u6BD4) / 2 * r.fontSize;
22036
22046
  \u7A4D\u307F += r.fontSize * \u884C\u9001\u308A\u306E\u6BD4;
22037
- return { ...r, text: \u5E45\u3067\u5207\u308B(r.text, r.fontSize, \u4F7F\u3048\u308B\u5E45), dy };
22047
+ return { ...r, text: \u5E45\u3067\u5207\u308B(r.text, r.fontSize, \u5E45), dy };
22038
22048
  });
22039
22049
  }
22040
22050
  var MIND_TONES = ["accent", "teal", "success", "warning", "info", "error"];
@@ -22131,17 +22141,22 @@ function MindMapNode({
22131
22141
  children: r.text
22132
22142
  },
22133
22143
  r.\u5F79\u5272
22134
- )) : /* @__PURE__ */ jsxRuntime.jsx(
22135
- "text",
22136
- {
22137
- x: n.x,
22138
- y: n.y + 5,
22139
- fontSize: n.isRoot ? 15 : 13,
22140
- fontWeight: n.isRoot ? 700 : 600,
22141
- textAnchor: "middle",
22142
- fill: \u6587\u5B57\u306E\u8272,
22143
- children: n.title
22144
- }
22144
+ )) : (
22145
+ // 補足が無くても **幅に収める** (#526)。 `箱に積む` を通らないこの経路だけが
22146
+ // 幅を見ておらず、長い名前がそのまま箱の外へ出て枝の線と重なっていた
22147
+ // (実測 = 中心の箱で文字 163px に対し箱 120px)
22148
+ /* @__PURE__ */ jsxRuntime.jsx(
22149
+ "text",
22150
+ {
22151
+ x: n.x,
22152
+ y: n.y + 5,
22153
+ fontSize: n.isRoot ? 15 : 13,
22154
+ fontWeight: n.isRoot ? 700 : 600,
22155
+ textAnchor: "middle",
22156
+ fill: \u6587\u5B57\u306E\u8272,
22157
+ children: \u5E45\u3067\u5207\u308B(n.title, n.isRoot ? 15 : 13, \u4F7F\u3048\u308B\u5E45(n.w))
22158
+ }
22159
+ )
22145
22160
  )
22146
22161
  ] }, `n-${n.id}`);
22147
22162
  })
@@ -22155,6 +22170,8 @@ function computeMindMapLayout(mindData, cx, cy, canvasW, canvasH) {
22155
22170
  nodes.push({
22156
22171
  id: mindData.rootId,
22157
22172
  title: mindData.rootTitle,
22173
+ // 中心も枝と同じく 2 行に積める (#530)。 高さ 52 に 15px + 9px の 2 行が入る
22174
+ ...mindData.rootSubtitle === void 0 ? {} : { subtitle: mindData.rootSubtitle },
22158
22175
  x: cx,
22159
22176
  y: cy,
22160
22177
  w: rootW,
@@ -22757,17 +22774,21 @@ function TreeNode({
22757
22774
  \u7BB1\u306E\u9AD8\u3055: n.h,
22758
22775
  fill: "var(--cdl-text-on-tone, #ffffff)",
22759
22776
  \u540D\u524D\u306E\u592A\u3055: 700
22760
- }) : /* @__PURE__ */ jsxRuntime.jsx(
22761
- "text",
22762
- {
22763
- x: n.w / 2,
22764
- y: n.h / 2 + 5,
22765
- fontSize: 13,
22766
- fontWeight: 700,
22767
- textAnchor: "middle",
22768
- fill: "var(--cdl-text-on-tone, #ffffff)",
22769
- children: n.title
22770
- }
22777
+ }) : (
22778
+ // 補足が無くても幅に収める (#526)。 `箱の文字` を通らないこの経路だけが
22779
+ // 幅を見ておらず、長い名前が箱の外へ出ていた
22780
+ /* @__PURE__ */ jsxRuntime.jsx(
22781
+ "text",
22782
+ {
22783
+ x: n.w / 2,
22784
+ y: n.h / 2 + 5,
22785
+ fontSize: 13,
22786
+ fontWeight: 700,
22787
+ textAnchor: "middle",
22788
+ fill: "var(--cdl-text-on-tone, #ffffff)",
22789
+ children: \u5E45\u3067\u5207\u308B(n.title, 13, \u4F7F\u3048\u308B\u5E45(n.w))
22790
+ }
22791
+ )
22771
22792
  )
22772
22793
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
22773
22794
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -22800,7 +22821,7 @@ function TreeNode({
22800
22821
  fontWeight: 600,
22801
22822
  textAnchor: "middle",
22802
22823
  fill: "var(--cdl-chip-text, #1a1f2a)",
22803
- children: n.title
22824
+ children: \u5E45\u3067\u5207\u308B(n.title, 12, \u4F7F\u3048\u308B\u5E45(n.w))
22804
22825
  }
22805
22826
  )
22806
22827
  ] })
@@ -28391,6 +28412,7 @@ function mindMap(preset) {
28391
28412
  mindData: {
28392
28413
  rootId: preset.rootId,
28393
28414
  rootTitle: preset.rootTitle,
28415
+ ...preset.rootSubtitle === void 0 ? {} : { rootSubtitle: preset.rootSubtitle },
28394
28416
  branches: branches.map((br) => ({
28395
28417
  id: br.id,
28396
28418
  title: br.title,