@cardenelabs/cdl 0.12.1 → 0.13.1

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,41 @@ CDL (Chainome Diagram Language) の主要変更履歴。
7
7
 
8
8
  予定 ... feedback を反映した patch / minor。
9
9
 
10
+ ## [0.13.1] - 2026-08-22
11
+
12
+ ### Fixed
13
+
14
+ - **入りきらない名前を、切る前に字を小さくして収めるようにした** (#534)
15
+
16
+ `#526` で放射と木の箱に幅を見る処理を入れたが、入れたのは **切る方だけ** だった。 中心の
17
+ 箱は幅 120 の固定で、使える幅 104 に全角 6 文字しか入らない。 全角 7 文字の名前
18
+ (`新プロジェクト`) が `新プロジェ…` になり、何の箱か読めなかった。
19
+
20
+ 同じ描画側の `compact-title.ts` は入りきらない時に字を 1 ずつ小さくして収めている
21
+ (`fitTextSize`)。 放射と木の箱だけが縮めずに切っており、扱いが揃っていなかった。
22
+
23
+ 幅に入るまで 1px ずつ小さくし、下限 (11px、 `compact-title.ts` の `MIN_SIZE` と同じ値) まで
24
+ 縮めても入らない時だけ切る。 縮めるのは入るところまでで、一律に下限へは落とさない。
25
+
26
+ 元の大きさで入る名前は字も文字も変わらない = 収まっていた図の見え方は動かない。
27
+
28
+ **箱の大きさは変えない**。 配置の計算が箱幅から出ているため。
29
+
30
+ ## [0.13.0] - 2026-08-22
31
+
32
+ ### Added
33
+
34
+ - **放射図の中心にも補足を渡せるようにした** (#530)
35
+
36
+ 枝 (`MindBranchNode`) は元から `subtitle` を持つのに、中心だけ渡す口が無かった。 呼出側が
37
+ 名前と補足を連結して `rootTitle` に入れるため 1 行に全部入り、箱幅 120px に対して 163px の
38
+ 文字が切られていた。
39
+
40
+ `MindBranchPayload` に `rootSubtitle` を足し、枝と同じ経路で 2 行に積む。 分けて渡せば
41
+ 1 行あたりが短くなり (`図を速くする` 90px / `300 ms 短縮` 60px)、同じ箱幅でも収まる。
42
+
43
+ **箱の大きさは変えない**。 配置の計算が箱幅から出ているため。
44
+
10
45
  ## [0.12.1] - 2026-08-22
11
46
 
12
47
  ### Fixed
@@ -516,7 +551,9 @@ Initial OSS release.
516
551
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
517
552
  行き止まりになる。
518
553
 
519
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.12.1...HEAD
554
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.13.1...HEAD
555
+ [0.13.1]: https://github.com/cardene777/cdl/compare/v0.13.0...v0.13.1
556
+ [0.13.0]: https://github.com/cardene777/cdl/compare/v0.12.1...v0.13.0
520
557
  [0.12.1]: https://github.com/cardene777/cdl/compare/v0.12.0...v0.12.1
521
558
  [0.12.0]: https://github.com/cardene777/cdl/compare/v0.11.0...v0.12.0
522
559
  [0.11.0]: https://github.com/cardene777/cdl/compare/v0.10.0...v0.11.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);
@@ -20267,10 +20268,10 @@ function fitTextSize(text, maxWidth, targetSize, minSize) {
20267
20268
  }
20268
20269
  var COMPACT_MAX_H = 100;
20269
20270
  var COMPACT_PADDING_X = 16;
20270
- var MIN_SIZE = 11;
20271
+ var MIN_TEXT_SIZE = 11;
20271
20272
  var ASCENT2 = 0.72;
20272
20273
  var DESCENT2 = 0.25;
20273
- var MIN_BAND_H = MIN_SIZE * (ASCENT2 + DESCENT2);
20274
+ var MIN_BAND_H = MIN_TEXT_SIZE * (ASCENT2 + DESCENT2);
20274
20275
  var EYEBROW_BASELINE = 38;
20275
20276
  var EYEBROW_SIZE = 18;
20276
20277
  var EYEBROW_GAP = 8;
@@ -20292,10 +20293,10 @@ function titlePlacement(node, \u901A\u5E38, opts = {}) {
20292
20293
  node.title,
20293
20294
  Math.max(0, node.w - COMPACT_PADDING_X),
20294
20295
  \u901A\u5E38.size,
20295
- MIN_SIZE
20296
+ MIN_TEXT_SIZE
20296
20297
  );
20297
20298
  const \u5E2F\u3067 = Math.floor(\u5E2F / (ASCENT2 + DESCENT2));
20298
- const size = Math.max(MIN_SIZE, Math.min(\u5E45\u3067, \u5E2F\u3067));
20299
+ const size = Math.max(MIN_TEXT_SIZE, Math.min(\u5E45\u3067, \u5E2F\u3067));
20299
20300
  const \u5B57\u9AD8 = size * (ASCENT2 + DESCENT2);
20300
20301
  const y = \u5B57\u9AD8 <= \u5E2F ? \u4E0A + \u5E2F / 2 + size * (ASCENT2 - DESCENT2) / 2 : \u4E0A > 0 ? \u4E0A + size * ASCENT2 : (\u9AD8\u3055 - \u5B57\u9AD8) / 2 + size * ASCENT2;
20301
20302
  return { x: node.w / 2, y, size, anchor: "middle" };
@@ -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
@@ -22019,6 +22026,12 @@ function \u5E45\u3067\u5207\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6
22019
22026
  }
22020
22027
  return `${\u51FA}${\u7701\u7565}`;
22021
22028
  }
22029
+ var \u7E2E\u3081\u306E\u4E0B\u9650 = MIN_TEXT_SIZE;
22030
+ function \u5E45\u306B\u53CE\u3081\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
22031
+ let size = fontSize;
22032
+ while (size > \u7E2E\u3081\u306E\u4E0B\u9650 && \u6E2C\u308B(text, size) > \u4F7F\u3048\u308B\u5E452) size -= 1;
22033
+ return { text: \u5E45\u3067\u5207\u308B(text, size, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B), fontSize: size };
22034
+ }
22022
22035
  function \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text) {
22023
22036
  const \u533A\u5207\u308A = Intl.Segmenter;
22024
22037
  if (typeof \u533A\u5207\u308A !== "function") return [...text];
@@ -22032,12 +22045,13 @@ function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8
22032
22045
  const \u6B8B\u3059 = [...\u5019\u88DC];
22033
22046
  while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
22034
22047
  const \u5E45 = \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45);
22035
- const \u7DCF\u9AD8 = \u9AD8\u3055(\u6B8B\u3059);
22048
+ const \u53CE\u3081\u305F = \u6B8B\u3059.map((r) => ({ ...r, ...\u5E45\u306B\u53CE\u3081\u308B(r.text, r.fontSize, \u5E45) }));
22049
+ const \u7DCF\u9AD8 = \u9AD8\u3055(\u53CE\u3081\u305F);
22036
22050
  let \u7A4D\u307F = -\u7DCF\u9AD8 / 2;
22037
- return \u6B8B\u3059.map((r) => {
22051
+ return \u53CE\u3081\u305F.map((r) => {
22038
22052
  const dy = \u7A4D\u307F + (\u884C\u9001\u308A\u306E\u6BD4 + \u5B57\u306E\u9AD8\u3055\u306E\u6BD4) / 2 * r.fontSize;
22039
22053
  \u7A4D\u307F += r.fontSize * \u884C\u9001\u308A\u306E\u6BD4;
22040
- return { ...r, text: \u5E45\u3067\u5207\u308B(r.text, r.fontSize, \u5E45), dy };
22054
+ return { ...r, dy };
22041
22055
  });
22042
22056
  }
22043
22057
  var MIND_TONES = ["accent", "teal", "success", "warning", "info", "error"];
@@ -22105,6 +22119,7 @@ function MindMapNode({
22105
22119
  n.h
22106
22120
  );
22107
22121
  const \u88DC\u8DB3\u3042\u308A = (n.subtitle ?? "").trim() !== "";
22122
+ const \u53CE\u3081\u305F\u540D\u524D = \u88DC\u8DB3\u3042\u308A ? void 0 : \u5E45\u306B\u53CE\u3081\u308B(n.title, n.isRoot ? 15 : 13, \u4F7F\u3048\u308B\u5E45(n.w));
22108
22123
  const \u6587\u5B57\u306E\u8272 = n.isRoot ? "var(--cdl-text-on-tone, #ffffff)" : "var(--cdl-chip-text, #1a1f2a)";
22109
22124
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-unresolved": n.unresolved ? "true" : void 0, children: [
22110
22125
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -22120,7 +22135,7 @@ function MindMapNode({
22120
22135
  strokeWidth: n.isRoot ? 2 : 1.75
22121
22136
  }
22122
22137
  ),
22123
- \u88DC\u8DB3\u3042\u308A ? \u884C.map((r) => /* @__PURE__ */ jsxRuntime.jsx(
22138
+ \u53CE\u3081\u305F\u540D\u524D === void 0 ? \u884C.map((r) => /* @__PURE__ */ jsxRuntime.jsx(
22124
22139
  "text",
22125
22140
  {
22126
22141
  "data-cdl-role": r.\u5F79\u5272 === "subtitle" ? "mind-node-subtitle" : void 0,
@@ -22137,17 +22152,18 @@ function MindMapNode({
22137
22152
  )) : (
22138
22153
  // 補足が無くても **幅に収める** (#526)。 `箱に積む` を通らないこの経路だけが
22139
22154
  // 幅を見ておらず、長い名前がそのまま箱の外へ出て枝の線と重なっていた
22140
- // (実測 = 中心の箱で文字 163px に対し箱 120px)
22155
+ // (実測 = 中心の箱で文字 163px に対し箱 120px)
22156
+ // 収める手段は縮めるのが先で、切るのは下限まで縮めても入らない時だけ (#534)
22141
22157
  /* @__PURE__ */ jsxRuntime.jsx(
22142
22158
  "text",
22143
22159
  {
22144
22160
  x: n.x,
22145
22161
  y: n.y + 5,
22146
- fontSize: n.isRoot ? 15 : 13,
22162
+ fontSize: \u53CE\u3081\u305F\u540D\u524D.fontSize,
22147
22163
  fontWeight: n.isRoot ? 700 : 600,
22148
22164
  textAnchor: "middle",
22149
22165
  fill: \u6587\u5B57\u306E\u8272,
22150
- children: \u5E45\u3067\u5207\u308B(n.title, n.isRoot ? 15 : 13, \u4F7F\u3048\u308B\u5E45(n.w))
22166
+ children: \u53CE\u3081\u305F\u540D\u524D.text
22151
22167
  }
22152
22168
  )
22153
22169
  )
@@ -22163,6 +22179,8 @@ function computeMindMapLayout(mindData, cx, cy, canvasW, canvasH) {
22163
22179
  nodes.push({
22164
22180
  id: mindData.rootId,
22165
22181
  title: mindData.rootTitle,
22182
+ // 中心も枝と同じく 2 行に積める (#530)。 高さ 52 に 15px + 9px の 2 行が入る
22183
+ ...mindData.rootSubtitle === void 0 ? {} : { subtitle: mindData.rootSubtitle },
22166
22184
  x: cx,
22167
22185
  y: cy,
22168
22186
  w: rootW,
@@ -22741,6 +22759,7 @@ function TreeNode({
22741
22759
  n.h
22742
22760
  );
22743
22761
  const \u88DC\u8DB3\u3042\u308A = (n.subtitle ?? "").trim() !== "";
22762
+ const \u53CE\u3081\u305F\u540D\u524D = \u88DC\u8DB3\u3042\u308A ? void 0 : \u5E45\u306B\u53CE\u3081\u308B(n.title, isRoot ? 13 : 12, \u4F7F\u3048\u308B\u5E45(n.w));
22744
22763
  return /* @__PURE__ */ jsxRuntime.jsx(
22745
22764
  "g",
22746
22765
  {
@@ -22759,7 +22778,7 @@ function TreeNode({
22759
22778
  fill: `url(#${gradientId})`
22760
22779
  }
22761
22780
  ),
22762
- \u88DC\u8DB3\u3042\u308A ? \u7BB1\u306E\u6587\u5B57({
22781
+ \u53CE\u3081\u305F\u540D\u524D === void 0 ? \u7BB1\u306E\u6587\u5B57({
22763
22782
  \u884C,
22764
22783
  x: n.w / 2,
22765
22784
  \u7BB1\u306E\u9AD8\u3055: n.h,
@@ -22773,11 +22792,11 @@ function TreeNode({
22773
22792
  {
22774
22793
  x: n.w / 2,
22775
22794
  y: n.h / 2 + 5,
22776
- fontSize: 13,
22795
+ fontSize: \u53CE\u3081\u305F\u540D\u524D.fontSize,
22777
22796
  fontWeight: 700,
22778
22797
  textAnchor: "middle",
22779
22798
  fill: "var(--cdl-text-on-tone, #ffffff)",
22780
- children: \u5E45\u3067\u5207\u308B(n.title, 13, \u4F7F\u3048\u308B\u5E45(n.w))
22799
+ children: \u53CE\u3081\u305F\u540D\u524D.text
22781
22800
  }
22782
22801
  )
22783
22802
  )
@@ -22797,7 +22816,7 @@ function TreeNode({
22797
22816
  }
22798
22817
  ),
22799
22818
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: 4, height: n.h, rx: 2, fill: accent }),
22800
- \u88DC\u8DB3\u3042\u308A ? \u7BB1\u306E\u6587\u5B57({
22819
+ \u53CE\u3081\u305F\u540D\u524D === void 0 ? \u7BB1\u306E\u6587\u5B57({
22801
22820
  \u884C,
22802
22821
  x: n.w / 2 + 2,
22803
22822
  \u7BB1\u306E\u9AD8\u3055: n.h,
@@ -22808,11 +22827,11 @@ function TreeNode({
22808
22827
  {
22809
22828
  x: n.w / 2 + 2,
22810
22829
  y: n.h / 2 + 4,
22811
- fontSize: 12,
22830
+ fontSize: \u53CE\u3081\u305F\u540D\u524D.fontSize,
22812
22831
  fontWeight: 600,
22813
22832
  textAnchor: "middle",
22814
22833
  fill: "var(--cdl-chip-text, #1a1f2a)",
22815
- children: \u5E45\u3067\u5207\u308B(n.title, 12, \u4F7F\u3048\u308B\u5E45(n.w))
22834
+ children: \u53CE\u3081\u305F\u540D\u524D.text
22816
22835
  }
22817
22836
  )
22818
22837
  ] })
@@ -24517,15 +24536,15 @@ var externalLabel = (node, cx, bottomY) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRu
24517
24536
  )
24518
24537
  ] });
24519
24538
  var LABEL_EYEBROW_SPACING = 2;
24520
- function \u5E45\u306B\u53CE\u3081\u308B(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
24539
+ function \u5E45\u306B\u53CE\u3081\u308B2(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
24521
24540
  const \u5E45 = textWidth(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
24522
24541
  const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
24523
24542
  return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
24524
24543
  }
24525
24544
  function bottomLabel(node, cx, plan) {
24526
- const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING, node.w);
24527
- const \u540D = \u5E45\u306B\u53CE\u3081\u308B(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
24528
- const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
24545
+ const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B2(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING, node.w);
24546
+ const \u540D = \u5E45\u306B\u53CE\u3081\u308B2(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
24547
+ const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B2(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
24529
24548
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24530
24549
  node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u80A9\u66F8.y, fontSize: \u80A9.size, fontWeight: 700, letterSpacing: \u80A9.spacing, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", children: node.eyebrow }),
24531
24550
  /* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-role": "node-label", x: cx, y: plan.\u540D\u524D.y, fontSize: \u540D.size, fontWeight: 700, textAnchor: "middle", fill: "var(--cdl-text, #1a1f2a)", children: node.title }),
@@ -25842,15 +25861,15 @@ function \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
25842
25861
  }
25843
25862
  return \u5E45 + \u5B57\u9593 * \u5B57\u6570;
25844
25863
  }
25845
- function \u5E45\u306B\u53CE\u3081\u308B2(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
25864
+ function \u5E45\u306B\u53CE\u3081\u308B3(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
25846
25865
  const \u5E45 = \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
25847
25866
  const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
25848
25867
  return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
25849
25868
  }
25850
25869
  function bottomLabel3(node, cx, plan) {
25851
- const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B2(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING2, node.w);
25852
- const \u540D = \u5E45\u306B\u53CE\u3081\u308B2(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
25853
- const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B2(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
25870
+ const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B3(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING2, node.w);
25871
+ const \u540D = \u5E45\u306B\u53CE\u3081\u308B3(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
25872
+ const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B3(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
25854
25873
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
25855
25874
  node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u80A9\u66F8.y, fontSize: \u80A9.size, fontWeight: 700, letterSpacing: \u80A9.spacing, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", children: node.eyebrow }),
25856
25875
  /* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-role": "node-label", x: cx, y: plan.\u540D\u524D.y, fontSize: \u540D.size, fontWeight: 700, textAnchor: "middle", fill: "var(--cdl-text, #1a1f2a)", children: node.title }),
@@ -26291,15 +26310,15 @@ function \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
26291
26310
  }
26292
26311
  return \u5E45 + \u5B57\u9593 * \u5B57\u6570;
26293
26312
  }
26294
- function \u5E45\u306B\u53CE\u3081\u308B3(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
26313
+ function \u5E45\u306B\u53CE\u3081\u308B4(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
26295
26314
  const \u5E45 = \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
26296
26315
  const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
26297
26316
  return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
26298
26317
  }
26299
26318
  function bottomLabel4(node, cx, plan) {
26300
- const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B3(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING3, node.w);
26301
- const \u540D = \u5E45\u306B\u53CE\u3081\u308B3(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
26302
- const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B3(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
26319
+ const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B4(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING3, node.w);
26320
+ const \u540D = \u5E45\u306B\u53CE\u3081\u308B4(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
26321
+ const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B4(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
26303
26322
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
26304
26323
  node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u80A9\u66F8.y, fontSize: \u80A9.size, fontWeight: 700, letterSpacing: \u80A9.spacing, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", children: node.eyebrow }),
26305
26324
  /* @__PURE__ */ jsxRuntime.jsx("text", { "data-cdl-role": "node-label", x: cx, y: plan.\u540D\u524D.y, fontSize: \u540D.size, fontWeight: 700, textAnchor: "middle", fill: "var(--cdl-text, #1a1f2a)", children: node.title }),
@@ -28403,6 +28422,7 @@ function mindMap(preset) {
28403
28422
  mindData: {
28404
28423
  rootId: preset.rootId,
28405
28424
  rootTitle: preset.rootTitle,
28425
+ ...preset.rootSubtitle === void 0 ? {} : { rootSubtitle: preset.rootSubtitle },
28406
28426
  branches: branches.map((br) => ({
28407
28427
  id: br.id,
28408
28428
  title: br.title,