@cardenelabs/cdl 0.108.0 → 0.110.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,64 @@ CDL (Chainome Diagram Language) の主要変更履歴。
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.110.0] - 2026-09-30
9
+
10
+ ### Fixed
11
+
12
+ - **題の下限が、題以外の行まで切っていた** (#957)
13
+
14
+ 0.108.0 (#953) で入れた読める下限 (11px) の効き方が、題以外の行に及んでいた。
15
+ 引く側 (見本帳) を 0.109.0 に上げると、記法に書いた補いの行が切られる図が出た。
16
+
17
+ `shape-diamond` の 260x260 の箱で実測した内訳。
18
+
19
+ | 版 | 肩書 | 題 | 説明 |
20
+ |---|---|---|---|
21
+ | 0.107.0 相当 | 8.32 `方針` | 10.40 `再送の判定` | 7.63 `間隔を倍に広げる · 最大 3 …` |
22
+ | 0.109.0 | 8.80 `方針` | 11.00 `再送の判定` | 8.07 `間隔を倍に広げる · 最大 …` |
23
+ | 0.110.0 (本版) | 8.32 `方針` | 10.40 `再送の判定` | 7.63 `間隔を倍に広げる · 最大 3 回` |
24
+
25
+ 2 つ直した。
26
+
27
+ **1 つ目 = 塊の倍率は一番広い行で決まるのに、下限を題の大きさから出していた**。
28
+ この箱で一番広いのは説明の行 (14 字) で、題は 5 字しかない。 題を 0.6px 上げるために
29
+ 説明から `3 回` を落としていた = 払うのと得るのが別の行になる。
30
+
31
+ 下限を当てるのは **題が一番広い行のときだけ** にした。 行ごとに倍率を出す 4 種
32
+ (`shape-commerce` / `shape-finance` / `shape-hardware` / `shape-blockchain`) では、
33
+ 下限を当てるのは題の行だけにした (#953 の対象外 scope と同じ)。
34
+
35
+ **2 つ目 = ちょうど収まる行を丸め誤差で切っていた**。
36
+ 塊の倍率は一番広い行が帯にちょうど収まる値なので、切る側の測り直しが浮動小数で
37
+ 髪の毛 1 本ぶん上回ると、収まっている行を切る。 切る判定に相対の余裕 (1e-9) を入れた。
38
+
39
+ これで **切られるのは、自分が入らない行だけ** になる。
40
+ 題が一番広い行のときに下限で止めて切る振る舞い (#953) は変えていない。
41
+
42
+ ## [0.109.0] - 2026-09-30
43
+
44
+ ### Fixed
45
+
46
+ - **頭の帯が、図の描いた題と同じ字をもう 1 度出していた** (#955)
47
+
48
+ `CdlDiagramView` は既定で頭の帯を出し、その左上に図の話題 (`topic`) を小さな字で置く。
49
+ 0.96.0 (#930) から図表 15 種が自分の題を箱の上に描くようになったため、話題と題が同じ
50
+ 文字列の図では同じ字が 2 か所に並んでいた。
51
+
52
+ 実測は `chart-bar` 1 つの図で 2 件 (帯の `div` と図の `text`)。 `hideHeader` を渡す側
53
+ (見本帳) には出ず、**engine の既定で描く側** に出る。 この repo の `thumbnail.tsx` も
54
+ `hideHeader={false}` を渡している。
55
+
56
+ 図が話題と同じ字を既に描いているなら、帯は話題を出さない。 判定は 0.103.0 (#943) で
57
+ 出した `drawsFigureTitle` から導く = 種別の一覧を手で持つと、図表が増えた日にずれる。
58
+
59
+ 落とすのは話題の 1 行だけで、帯そのものと段の印は残る。 印は `ml-auto` で右へ寄せてある
60
+ ので並びも動かない。 話題は図の代替文 (`buildDiagramAltText`) に入るため、読み上げでは
61
+ 引き続き届く。
62
+
63
+ 箱の題 (`node-label`) が話題と同じ場合は出し続ける。 図表と違い箱は図の中の 1 つに
64
+ すぎず、話題を名乗る場所が他に無い。
65
+
8
66
  ## [0.108.0] - 2026-09-30
9
67
 
10
68
  ### Fixed
@@ -4359,7 +4417,9 @@ Initial OSS release.
4359
4417
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
4360
4418
  行き止まりになる。
4361
4419
 
4362
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.108.0...HEAD
4420
+ [Unreleased]: https://github.com/cardene777/cdl/compare/v0.110.0...HEAD
4421
+ [0.110.0]: https://github.com/cardene777/cdl/compare/v0.109.0...v0.110.0
4422
+ [0.109.0]: https://github.com/cardene777/cdl/compare/v0.108.0...v0.109.0
4363
4423
  [0.108.0]: https://github.com/cardene777/cdl/compare/v0.107.0...v0.108.0
4364
4424
  [0.107.0]: https://github.com/cardene777/cdl/compare/v0.106.0...v0.107.0
4365
4425
  [0.106.0]: https://github.com/cardene777/cdl/compare/v0.105.0...v0.106.0
package/dist/index.cjs CHANGED
@@ -14704,10 +14704,14 @@ function \u5E45\u306E\u500D\u7387(text, size, letterSpacing, \u5E45) {
14704
14704
  function \u8AAD\u3081\u308B\u4E0B\u9650\u306E\u500D\u7387(\u5927\u304D\u3055) {
14705
14705
  return \u5927\u304D\u3055 > MIN_TITLE_FONT_SIZE ? MIN_TITLE_FONT_SIZE / \u5927\u304D\u3055 : 0;
14706
14706
  }
14707
+ var \u5207\u308B\u4F59\u88D5 = 1e-9;
14708
+ function \u5E2F\u3067\u5207\u308B(text, \u5927\u304D\u3055, \u5E45\u4E0A\u9650, \u6E2C\u308B) {
14709
+ return \u5E45\u3067\u5207\u308B(text, \u5927\u304D\u3055, \u5E45\u4E0A\u9650 * (1 + \u5207\u308B\u4F59\u88D5), \u6E2C\u308B);
14710
+ }
14707
14711
  function \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(\u984C, \u5927\u304D\u3055, \u5B57\u9593, \u5E45\u4E0A\u9650, \u6E2C\u308B) {
14708
14712
  const \u4E0B\u9650 = \u8AAD\u3081\u308B\u4E0B\u9650\u306E\u500D\u7387(\u5927\u304D\u3055);
14709
14713
  if (!(\u4E0B\u9650 > 0) || !(\u5E45\u4E0A\u9650 > 0)) return 0;
14710
- return \u5E45\u3067\u5207\u308B(\u984C, \u5927\u304D\u3055 * \u4E0B\u9650, \u5E45\u4E0A\u9650, (u, f) => \u6E2C\u308B(u, f, \u5B57\u9593 * \u4E0B\u9650)) === "" ? 0 : \u4E0B\u9650;
14714
+ return \u5E2F\u3067\u5207\u308B(\u984C, \u5927\u304D\u3055 * \u4E0B\u9650, \u5E45\u4E0A\u9650, (u, f) => \u6E2C\u308B(u, f, \u5B57\u9593 * \u4E0B\u9650)) === "" ? 0 : \u4E0B\u9650;
14711
14715
  }
14712
14716
  var TITLE_MAX = 18;
14713
14717
  var TITLE_MIN = 9;
@@ -23476,12 +23480,13 @@ function CdlHeader({
23476
23480
  stateValues,
23477
23481
  states,
23478
23482
  onJumpPhase,
23479
- headingLevel = 3
23483
+ headingLevel = 3,
23484
+ showTopic = true
23480
23485
  }) {
23481
23486
  const HeadingTag = `h${headingLevel}`;
23482
23487
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-[var(--cdl-divider,#d4d4d8)]/35 px-7 py-6", children: [
23483
23488
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-5 flex items-center gap-3", children: [
23484
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[10px] font-bold uppercase tracking-[0.2em]", style: { color: "var(--cdl-text-accent, #2d6a8f)" }, children: topic }),
23489
+ showTopic && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[10px] font-bold uppercase tracking-[0.2em]", style: { color: "var(--cdl-text-accent, #2d6a8f)" }, children: topic }),
23485
23490
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [
23486
23491
  phases.map((p, idx) => {
23487
23492
  const active = idx === phaseIdx;
@@ -28720,7 +28725,8 @@ function labelBlock(node, pos, size, band) {
28720
28725
  node.eyebrow ? textWidth(node.eyebrow, EYEBROW_SIZE2, EYEBROW_TRACKING) : 0,
28721
28726
  node.subtitle ? textWidth(node.subtitle, SUB_SIZE) : 0
28722
28727
  );
28723
- const \u4E0B\u9650 = \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", size, 0, band.w, textWidth);
28728
+ const \u984C\u5E45 = textWidth(node.title ?? "", size);
28729
+ const \u4E0B\u9650 = \u984C\u5E45 >= \u5E45 ? \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", size, 0, band.w, textWidth) : 0;
28724
28730
  const { k, x, y: baseline } = fitLabel(band, { \u4E0A, \u4E0B, \u5E45 }, pos, \u4E0B\u9650);
28725
28731
  return { k, x, baseline, \u4E0A\u7AEF: baseline - \u4E0A * k, \u4E0B\u7AEF: baseline + \u4E0B * k };
28726
28732
  }
@@ -28728,7 +28734,7 @@ function commonLabel(node, pos, size, band) {
28728
28734
  const \u584A = labelBlock(node, pos, size, band);
28729
28735
  const k = \u584A.k;
28730
28736
  const x = \u584A.x;
28731
- const \u5207\u308B = (t, \u5927\u304D\u3055, \u5B57\u9593 = 0) => \u5E45\u3067\u5207\u308B(t, \u5927\u304D\u3055 * k, band.w, (u, f) => textWidth(u, f, \u5B57\u9593 * k));
28737
+ const \u5207\u308B = (t, \u5927\u304D\u3055, \u5B57\u9593 = 0) => \u5E2F\u3067\u5207\u308B(t, \u5927\u304D\u3055 * k, band.w, (u, f) => textWidth(u, f, \u5B57\u9593 * k));
28732
28738
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
28733
28739
  node.eyebrow && /* @__PURE__ */ jsxRuntime.jsx(
28734
28740
  "text",
@@ -29099,9 +29105,10 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
29099
29105
  node.eyebrow && plan.\u80A9\u66F8 ? textWidth(node.eyebrow, plan.\u80A9\u66F8.size, EYEBROW_TRACKING) : 0,
29100
29106
  node.subtitle && plan.\u8AAC\u660E ? textWidth(node.subtitle, plan.\u8AAC\u660E.size) : 0
29101
29107
  );
29102
- const \u4E0B\u9650 = \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", plan.\u540D\u524D.size, 0, \u5E45\u4E0A\u9650, textWidth);
29108
+ const \u984C\u5E45 = textWidth(node.title ?? "", plan.\u540D\u524D.size);
29109
+ const \u4E0B\u9650 = \u984C\u5E45 >= \u5E45 ? \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", plan.\u540D\u524D.size, 0, \u5E45\u4E0A\u9650, textWidth) : 0;
29103
29110
  const k = \u5E45 > 0 && \u5E45\u4E0A\u9650 > 0 ? Math.min(1, Math.max(\u5E45\u4E0A\u9650 / \u5E45, \u4E0B\u9650)) : 1;
29104
- const \u5207\u308B = (t, \u5927\u304D\u3055, \u5B57\u9593 = 0) => \u5E45\u3067\u5207\u308B(t, \u5927\u304D\u3055 * k, \u5E45\u4E0A\u9650, (u, f) => textWidth(u, f, \u5B57\u9593 * k));
29111
+ const \u5207\u308B = (t, \u5927\u304D\u3055, \u5B57\u9593 = 0) => \u5E2F\u3067\u5207\u308B(t, \u5927\u304D\u3055 * k, \u5E45\u4E0A\u9650, (u, f) => textWidth(u, f, \u5B57\u9593 * k));
29105
29112
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
29106
29113
  node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.jsx(
29107
29114
  "text",
@@ -30058,16 +30065,17 @@ var externalLabel = (node, cx, bottomY) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRu
30058
30065
  )
30059
30066
  ] });
30060
30067
  var LABEL_EYEBROW_SPACING = 2;
30061
- function \u5E45\u306B\u53CE\u3081\u308B2(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
30068
+ function \u5E45\u306B\u53CE\u3081\u308B2(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45, \u984C\u304B = false) {
30062
30069
  const \u5E45 = textWidth(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
30063
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, Math.max(\u7BB1\u5E45 / \u5E45, \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45, textWidth))) : 1;
30070
+ const \u4E0B\u9650 = \u984C\u304B ? \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45, textWidth) : 0;
30071
+ const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, Math.max(\u7BB1\u5E45 / \u5E45, \u4E0B\u9650)) : 1;
30064
30072
  const size = \u5927\u304D\u3055 * \u500D\u7387;
30065
30073
  const spacing = \u5B57\u9593 * \u500D\u7387;
30066
- return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => textWidth(u, f, spacing)) };
30074
+ return { size, spacing, text: \u5E2F\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => textWidth(u, f, spacing)) };
30067
30075
  }
30068
30076
  function bottomLabel(node, cx, plan) {
30069
30077
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B2(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING, node.w);
30070
- const \u540D = \u5E45\u306B\u53CE\u3081\u308B2(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
30078
+ const \u540D = \u5E45\u306B\u53CE\u3081\u308B2(node.title ?? "", plan.\u540D\u524D.size, 0, node.w, true);
30071
30079
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B2(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
30072
30080
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
30073
30081
  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: \u80A9.text }),
@@ -30867,14 +30875,15 @@ function blockchainNodeExtent(strokeWidth) {
30867
30875
  return { \u4E0A: \u7E26, \u4E0B: \u7E26, \u5DE6: \u6A2A, \u53F3: \u6A2A };
30868
30876
  }
30869
30877
  function bottomLabel2(node, cx, plan) {
30870
- const \u53CE\u3081\u308B = (t, \u5927\u304D\u3055, \u5B57\u9593) => {
30878
+ const \u53CE\u3081\u308B = (t, \u5927\u304D\u3055, \u5B57\u9593, \u984C\u304B = false) => {
30871
30879
  const \u6E2C\u308B = (u, f, ls) => \u5B57\u306E\u5E45(u, f) + ls * [...u].length;
30872
- const \u500D\u7387 = Math.max(\u5E45\u306E\u500D\u7387(t, \u5927\u304D\u3055, \u5B57\u9593, node.w), \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(t, \u5927\u304D\u3055, \u5B57\u9593, node.w, \u6E2C\u308B));
30880
+ const \u4E0B\u9650 = \u984C\u304B ? \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(t, \u5927\u304D\u3055, \u5B57\u9593, node.w, \u6E2C\u308B) : 0;
30881
+ const \u500D\u7387 = Math.max(\u5E45\u306E\u500D\u7387(t, \u5927\u304D\u3055, \u5B57\u9593, node.w), \u4E0B\u9650);
30873
30882
  const size = \u5927\u304D\u3055 * \u500D\u7387;
30874
- return { \u500D\u7387, text: \u5E45\u3067\u5207\u308B(t, size, node.w, (u, f) => \u5B57\u306E\u5E45(u, f) + \u5B57\u9593 * \u500D\u7387 * [...u].length) };
30883
+ return { \u500D\u7387, text: \u5E2F\u3067\u5207\u308B(t, size, node.w, (u, f) => \u5B57\u306E\u5E45(u, f) + \u5B57\u9593 * \u500D\u7387 * [...u].length) };
30875
30884
  };
30876
30885
  const \u80A9 = node.eyebrow && plan.\u80A9\u66F8 ? \u53CE\u3081\u308B(node.eyebrow, plan.\u80A9\u66F8.size, 2) : { \u500D\u7387: 1, text: node.eyebrow ?? "" };
30877
- const \u540D = \u53CE\u3081\u308B(node.title ?? "", plan.\u540D\u524D.size, 0);
30886
+ const \u540D = \u53CE\u3081\u308B(node.title ?? "", plan.\u540D\u524D.size, 0, true);
30878
30887
  const \u8AAC = node.subtitle && plan.\u8AAC\u660E ? \u53CE\u3081\u308B(node.subtitle, plan.\u8AAC\u660E.size, 0) : { \u500D\u7387: 1, text: node.subtitle ?? "" };
30879
30888
  const \u80A9\u66F8\u500D\u7387 = \u80A9.\u500D\u7387;
30880
30889
  const \u540D\u524D\u500D\u7387 = \u540D.\u500D\u7387;
@@ -31489,16 +31498,17 @@ function \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
31489
31498
  }
31490
31499
  return \u5E45 + \u5B57\u9593 * \u5B57\u6570;
31491
31500
  }
31492
- function \u5E45\u306B\u53CE\u3081\u308B3(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
31501
+ function \u5E45\u306B\u53CE\u3081\u308B3(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45, \u984C\u304B = false) {
31493
31502
  const \u5E45 = \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
31494
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, Math.max(\u7BB1\u5E45 / \u5E45, \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45, \u5B57\u5E45))) : 1;
31503
+ const \u4E0B\u9650 = \u984C\u304B ? \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45, \u5B57\u5E45) : 0;
31504
+ const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, Math.max(\u7BB1\u5E45 / \u5E45, \u4E0B\u9650)) : 1;
31495
31505
  const size = \u5927\u304D\u3055 * \u500D\u7387;
31496
31506
  const spacing = \u5B57\u9593 * \u500D\u7387;
31497
- return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E45(u, f, spacing)) };
31507
+ return { size, spacing, text: \u5E2F\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E45(u, f, spacing)) };
31498
31508
  }
31499
31509
  function bottomLabel3(node, cx, plan) {
31500
31510
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B3(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING2, node.w);
31501
- const \u540D = \u5E45\u306B\u53CE\u3081\u308B3(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
31511
+ const \u540D = \u5E45\u306B\u53CE\u3081\u308B3(node.title ?? "", plan.\u540D\u524D.size, 0, node.w, true);
31502
31512
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B3(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
31503
31513
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
31504
31514
  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: \u80A9.text }),
@@ -31974,16 +31984,17 @@ function \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
31974
31984
  }
31975
31985
  return \u5E45 + \u5B57\u9593 * \u5B57\u6570;
31976
31986
  }
31977
- function \u5E45\u306B\u53CE\u3081\u308B4(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
31987
+ function \u5E45\u306B\u53CE\u3081\u308B4(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45, \u984C\u304B = false) {
31978
31988
  const \u5E45 = \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
31979
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, Math.max(\u7BB1\u5E45 / \u5E45, \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45, \u5B57\u5E452))) : 1;
31989
+ const \u4E0B\u9650 = \u984C\u304B ? \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45, \u5B57\u5E452) : 0;
31990
+ const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, Math.max(\u7BB1\u5E45 / \u5E45, \u4E0B\u9650)) : 1;
31980
31991
  const size = \u5927\u304D\u3055 * \u500D\u7387;
31981
31992
  const spacing = \u5B57\u9593 * \u500D\u7387;
31982
- return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E452(u, f, spacing)) };
31993
+ return { size, spacing, text: \u5E2F\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E452(u, f, spacing)) };
31983
31994
  }
31984
31995
  function bottomLabel4(node, cx, plan) {
31985
31996
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B4(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING3, node.w);
31986
- const \u540D = \u5E45\u306B\u53CE\u3081\u308B4(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
31997
+ const \u540D = \u5E45\u306B\u53CE\u3081\u308B4(node.title ?? "", plan.\u540D\u524D.size, 0, node.w, true);
31987
31998
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B4(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
31988
31999
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
31989
32000
  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: \u80A9.text }),
@@ -33587,6 +33598,11 @@ function CdlDiagramView({ diagram: diagram2, laid: laidProp, hideHeader = false,
33587
33598
  return mergeStateValues(baseStateValues, interactive.stateOverrides);
33588
33599
  }, [isInteractive, baseStateValues, interactive.stateOverrides]);
33589
33600
  const \u5024\u306E\u540D\u524D = react.useMemo(() => \u5024\u306E\u540D\u524D\u306E\u8868\u3092\u4F5C\u308B(diagram2.inputs), [diagram2.inputs]);
33601
+ const \u56F3\u304C\u8A71\u984C\u3092\u63CF\u304F = react.useMemo(() => {
33602
+ const \u8A71\u984C = laid.topic.trim();
33603
+ if (\u8A71\u984C === "") return false;
33604
+ return laid.nodes.some((n) => drawsFigureTitle(n.kind) && (n.title ?? "").trim() === \u8A71\u984C);
33605
+ }, [laid.nodes, laid.topic]);
33590
33606
  return /* @__PURE__ */ jsxRuntime.jsxs(
33591
33607
  "div",
33592
33608
  {
@@ -33611,7 +33627,8 @@ function CdlDiagramView({ diagram: diagram2, laid: laidProp, hideHeader = false,
33611
33627
  timeline.goto(idx);
33612
33628
  timeline.play();
33613
33629
  },
33614
- headingLevel
33630
+ headingLevel,
33631
+ showTopic: !\u56F3\u304C\u8A71\u984C\u3092\u63CF\u304F
33615
33632
  }
33616
33633
  ),
33617
33634
  isInteractive && interactive.panel,