@cardenelabs/cdl 0.13.0 → 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,26 @@ 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
+
10
30
  ## [0.13.0] - 2026-08-22
11
31
 
12
32
  ### Added
@@ -531,7 +551,8 @@ Initial OSS release.
531
551
  使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
532
552
  行き止まりになる。
533
553
 
534
- [Unreleased]: https://github.com/cardene777/cdl/compare/v0.13.0...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
535
556
  [0.13.0]: https://github.com/cardene777/cdl/compare/v0.12.1...v0.13.0
536
557
  [0.12.1]: https://github.com/cardene777/cdl/compare/v0.12.0...v0.12.1
537
558
  [0.12.0]: https://github.com/cardene777/cdl/compare/v0.11.0...v0.12.0
package/dist/index.cjs CHANGED
@@ -20268,10 +20268,10 @@ function fitTextSize(text, maxWidth, targetSize, minSize) {
20268
20268
  }
20269
20269
  var COMPACT_MAX_H = 100;
20270
20270
  var COMPACT_PADDING_X = 16;
20271
- var MIN_SIZE = 11;
20271
+ var MIN_TEXT_SIZE = 11;
20272
20272
  var ASCENT2 = 0.72;
20273
20273
  var DESCENT2 = 0.25;
20274
- var MIN_BAND_H = MIN_SIZE * (ASCENT2 + DESCENT2);
20274
+ var MIN_BAND_H = MIN_TEXT_SIZE * (ASCENT2 + DESCENT2);
20275
20275
  var EYEBROW_BASELINE = 38;
20276
20276
  var EYEBROW_SIZE = 18;
20277
20277
  var EYEBROW_GAP = 8;
@@ -20293,10 +20293,10 @@ function titlePlacement(node, \u901A\u5E38, opts = {}) {
20293
20293
  node.title,
20294
20294
  Math.max(0, node.w - COMPACT_PADDING_X),
20295
20295
  \u901A\u5E38.size,
20296
- MIN_SIZE
20296
+ MIN_TEXT_SIZE
20297
20297
  );
20298
20298
  const \u5E2F\u3067 = Math.floor(\u5E2F / (ASCENT2 + DESCENT2));
20299
- 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));
20300
20300
  const \u5B57\u9AD8 = size * (ASCENT2 + DESCENT2);
20301
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;
20302
20302
  return { x: node.w / 2, y, size, anchor: "middle" };
@@ -22026,6 +22026,12 @@ function \u5E45\u3067\u5207\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6
22026
22026
  }
22027
22027
  return `${\u51FA}${\u7701\u7565}`;
22028
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
+ }
22029
22035
  function \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text) {
22030
22036
  const \u533A\u5207\u308A = Intl.Segmenter;
22031
22037
  if (typeof \u533A\u5207\u308A !== "function") return [...text];
@@ -22039,12 +22045,13 @@ function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8
22039
22045
  const \u6B8B\u3059 = [...\u5019\u88DC];
22040
22046
  while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
22041
22047
  const \u5E45 = \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45);
22042
- 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);
22043
22050
  let \u7A4D\u307F = -\u7DCF\u9AD8 / 2;
22044
- return \u6B8B\u3059.map((r) => {
22051
+ return \u53CE\u3081\u305F.map((r) => {
22045
22052
  const dy = \u7A4D\u307F + (\u884C\u9001\u308A\u306E\u6BD4 + \u5B57\u306E\u9AD8\u3055\u306E\u6BD4) / 2 * r.fontSize;
22046
22053
  \u7A4D\u307F += r.fontSize * \u884C\u9001\u308A\u306E\u6BD4;
22047
- return { ...r, text: \u5E45\u3067\u5207\u308B(r.text, r.fontSize, \u5E45), dy };
22054
+ return { ...r, dy };
22048
22055
  });
22049
22056
  }
22050
22057
  var MIND_TONES = ["accent", "teal", "success", "warning", "info", "error"];
@@ -22112,6 +22119,7 @@ function MindMapNode({
22112
22119
  n.h
22113
22120
  );
22114
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));
22115
22123
  const \u6587\u5B57\u306E\u8272 = n.isRoot ? "var(--cdl-text-on-tone, #ffffff)" : "var(--cdl-chip-text, #1a1f2a)";
22116
22124
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { "data-cdl-unresolved": n.unresolved ? "true" : void 0, children: [
22117
22125
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -22127,7 +22135,7 @@ function MindMapNode({
22127
22135
  strokeWidth: n.isRoot ? 2 : 1.75
22128
22136
  }
22129
22137
  ),
22130
- \u88DC\u8DB3\u3042\u308A ? \u884C.map((r) => /* @__PURE__ */ jsxRuntime.jsx(
22138
+ \u53CE\u3081\u305F\u540D\u524D === void 0 ? \u884C.map((r) => /* @__PURE__ */ jsxRuntime.jsx(
22131
22139
  "text",
22132
22140
  {
22133
22141
  "data-cdl-role": r.\u5F79\u5272 === "subtitle" ? "mind-node-subtitle" : void 0,
@@ -22144,17 +22152,18 @@ function MindMapNode({
22144
22152
  )) : (
22145
22153
  // 補足が無くても **幅に収める** (#526)。 `箱に積む` を通らないこの経路だけが
22146
22154
  // 幅を見ておらず、長い名前がそのまま箱の外へ出て枝の線と重なっていた
22147
- // (実測 = 中心の箱で文字 163px に対し箱 120px)
22155
+ // (実測 = 中心の箱で文字 163px に対し箱 120px)
22156
+ // 収める手段は縮めるのが先で、切るのは下限まで縮めても入らない時だけ (#534)
22148
22157
  /* @__PURE__ */ jsxRuntime.jsx(
22149
22158
  "text",
22150
22159
  {
22151
22160
  x: n.x,
22152
22161
  y: n.y + 5,
22153
- fontSize: n.isRoot ? 15 : 13,
22162
+ fontSize: \u53CE\u3081\u305F\u540D\u524D.fontSize,
22154
22163
  fontWeight: n.isRoot ? 700 : 600,
22155
22164
  textAnchor: "middle",
22156
22165
  fill: \u6587\u5B57\u306E\u8272,
22157
- 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
22158
22167
  }
22159
22168
  )
22160
22169
  )
@@ -22750,6 +22759,7 @@ function TreeNode({
22750
22759
  n.h
22751
22760
  );
22752
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));
22753
22763
  return /* @__PURE__ */ jsxRuntime.jsx(
22754
22764
  "g",
22755
22765
  {
@@ -22768,7 +22778,7 @@ function TreeNode({
22768
22778
  fill: `url(#${gradientId})`
22769
22779
  }
22770
22780
  ),
22771
- \u88DC\u8DB3\u3042\u308A ? \u7BB1\u306E\u6587\u5B57({
22781
+ \u53CE\u3081\u305F\u540D\u524D === void 0 ? \u7BB1\u306E\u6587\u5B57({
22772
22782
  \u884C,
22773
22783
  x: n.w / 2,
22774
22784
  \u7BB1\u306E\u9AD8\u3055: n.h,
@@ -22782,11 +22792,11 @@ function TreeNode({
22782
22792
  {
22783
22793
  x: n.w / 2,
22784
22794
  y: n.h / 2 + 5,
22785
- fontSize: 13,
22795
+ fontSize: \u53CE\u3081\u305F\u540D\u524D.fontSize,
22786
22796
  fontWeight: 700,
22787
22797
  textAnchor: "middle",
22788
22798
  fill: "var(--cdl-text-on-tone, #ffffff)",
22789
- children: \u5E45\u3067\u5207\u308B(n.title, 13, \u4F7F\u3048\u308B\u5E45(n.w))
22799
+ children: \u53CE\u3081\u305F\u540D\u524D.text
22790
22800
  }
22791
22801
  )
22792
22802
  )
@@ -22806,7 +22816,7 @@ function TreeNode({
22806
22816
  }
22807
22817
  ),
22808
22818
  /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: 4, height: n.h, rx: 2, fill: accent }),
22809
- \u88DC\u8DB3\u3042\u308A ? \u7BB1\u306E\u6587\u5B57({
22819
+ \u53CE\u3081\u305F\u540D\u524D === void 0 ? \u7BB1\u306E\u6587\u5B57({
22810
22820
  \u884C,
22811
22821
  x: n.w / 2 + 2,
22812
22822
  \u7BB1\u306E\u9AD8\u3055: n.h,
@@ -22817,11 +22827,11 @@ function TreeNode({
22817
22827
  {
22818
22828
  x: n.w / 2 + 2,
22819
22829
  y: n.h / 2 + 4,
22820
- fontSize: 12,
22830
+ fontSize: \u53CE\u3081\u305F\u540D\u524D.fontSize,
22821
22831
  fontWeight: 600,
22822
22832
  textAnchor: "middle",
22823
22833
  fill: "var(--cdl-chip-text, #1a1f2a)",
22824
- children: \u5E45\u3067\u5207\u308B(n.title, 12, \u4F7F\u3048\u308B\u5E45(n.w))
22834
+ children: \u53CE\u3081\u305F\u540D\u524D.text
22825
22835
  }
22826
22836
  )
22827
22837
  ] })
@@ -24526,15 +24536,15 @@ var externalLabel = (node, cx, bottomY) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRu
24526
24536
  )
24527
24537
  ] });
24528
24538
  var LABEL_EYEBROW_SPACING = 2;
24529
- 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) {
24530
24540
  const \u5E45 = textWidth(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
24531
24541
  const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
24532
24542
  return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
24533
24543
  }
24534
24544
  function bottomLabel(node, cx, plan) {
24535
- const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING, node.w);
24536
- const \u540D = \u5E45\u306B\u53CE\u3081\u308B(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
24537
- 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);
24538
24548
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24539
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 }),
24540
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 }),
@@ -25851,15 +25861,15 @@ function \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
25851
25861
  }
25852
25862
  return \u5E45 + \u5B57\u9593 * \u5B57\u6570;
25853
25863
  }
25854
- 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) {
25855
25865
  const \u5E45 = \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
25856
25866
  const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
25857
25867
  return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
25858
25868
  }
25859
25869
  function bottomLabel3(node, cx, plan) {
25860
- const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B2(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING2, node.w);
25861
- const \u540D = \u5E45\u306B\u53CE\u3081\u308B2(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
25862
- 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);
25863
25873
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
25864
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 }),
25865
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 }),
@@ -26300,15 +26310,15 @@ function \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
26300
26310
  }
26301
26311
  return \u5E45 + \u5B57\u9593 * \u5B57\u6570;
26302
26312
  }
26303
- 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) {
26304
26314
  const \u5E45 = \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
26305
26315
  const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
26306
26316
  return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
26307
26317
  }
26308
26318
  function bottomLabel4(node, cx, plan) {
26309
- const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B3(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING3, node.w);
26310
- const \u540D = \u5E45\u306B\u53CE\u3081\u308B3(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
26311
- 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);
26312
26322
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
26313
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 }),
26314
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 }),