@cardenelabs/cdl 0.106.0 → 0.108.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/dist/react.js CHANGED
@@ -837,6 +837,11 @@ function isHalfwidthKana(code) {
837
837
  }
838
838
  var EMOJI_ADVANCE_EM = 1.05;
839
839
  var MONO_EMOJI_ADVANCE_EM = 1.16;
840
+ var DRAWN_CJK_RATIO = 1.08;
841
+ var DRAWN_ASCII_RATIO = 1.16;
842
+ function isAscii(code) {
843
+ return code < 128;
844
+ }
840
845
  var WIDE_SYMBOL_ADVANCE_EM = 0.95;
841
846
  function isEmoji(code) {
842
847
  return code >= 126976 && code <= 129791 || // 絵文字の主要面
@@ -875,29 +880,31 @@ function measureTextWidth(text, opts = {}) {
875
880
  const fontSize = opts.fontSize ?? 22;
876
881
  const letterSpacing = opts.letterSpacing ?? 0;
877
882
  const fontFamily = opts.fontFamily ?? "sans";
883
+ const bound = opts.bound ?? "layout";
878
884
  let advanceEmSum = 0;
879
885
  let charCount = 0;
880
886
  const \u6587\u5B57\u5217 = CLUSTER_JOINER_RE.test(text) ? segmentGraphemes(text) : [...text];
881
887
  for (const ch of \u6587\u5B57\u5217) {
882
888
  charCount++;
883
889
  const code = ch.codePointAt(0) ?? 0;
890
+ const \u5272\u308A\u623B\u3057 = bound === "drawn" && !isEmojiGrapheme(ch, code) ? isAscii(code) ? DRAWN_ASCII_RATIO : isCJK(code) ? DRAWN_CJK_RATIO : 1 : 1;
884
891
  if (isEmojiGrapheme(ch, code)) {
885
892
  advanceEmSum += fontFamily === "mono" ? MONO_EMOJI_ADVANCE_EM : EMOJI_ADVANCE_EM;
886
893
  continue;
887
894
  }
888
895
  if (fontFamily === "mono") {
889
- advanceEmSum += isCJK(code) ? 1.08 : JETBRAINS_MONO_ADVANCE_EM;
896
+ advanceEmSum += (isCJK(code) ? 1.08 : JETBRAINS_MONO_ADVANCE_EM) / \u5272\u308A\u623B\u3057;
890
897
  continue;
891
898
  }
892
899
  if (isCJK(code)) {
893
- advanceEmSum += 1.08;
900
+ advanceEmSum += 1.08 / \u5272\u308A\u623B\u3057;
894
901
  continue;
895
902
  }
896
903
  const table = ch.length === 1 ? INTER_BOLD_ADVANCE_EM[ch] : void 0;
897
- advanceEmSum += table !== void 0 ? table : defaultAdvanceEm(ch, code);
904
+ advanceEmSum += (table !== void 0 ? table : defaultAdvanceEm(ch, code)) / \u5272\u308A\u623B\u3057;
898
905
  }
899
906
  const w = advanceEmSum * fontSize + letterSpacing * charCount;
900
- return Math.max(w, fontSize * 1.2);
907
+ return bound === "drawn" ? w : Math.max(w, fontSize * 1.2);
901
908
  }
902
909
  function \u53CE\u3081\u308B\u500D\u7387(text, opts, \u5E45) {
903
910
  if (!(\u5E45 > 0) || !(opts.fontSize > 0)) return 1;
@@ -1038,6 +1045,51 @@ function titleFontSize(kind) {
1038
1045
  return TITLE_FONT_SIZE.get(kind ?? "") ?? TITLE_FONT_SIZE_DEFAULT;
1039
1046
  }
1040
1047
  var TITLE_BOX_PADDING = 52;
1048
+ var KINDS_SCALING_TITLE_WHEN_LOW = /* @__PURE__ */ new Set(["actor", "event", "function", "storage"]);
1049
+ var KINDS_SCALING_TITLE_ALWAYS = /* @__PURE__ */ new Set([
1050
+ "card",
1051
+ "shape-file",
1052
+ "shape-folder",
1053
+ "shape-cloud",
1054
+ "shape-cylinder",
1055
+ "shape-hexagon",
1056
+ "shape-diamond",
1057
+ "shape-stack",
1058
+ "shape-person",
1059
+ "shape-server-rack",
1060
+ "shape-network-node",
1061
+ "shape-mobile-device",
1062
+ "shape-satellite",
1063
+ "shape-smart-contract",
1064
+ "shape-rpc-node",
1065
+ "shape-wallet",
1066
+ "shape-nft",
1067
+ "shape-token",
1068
+ "shape-blockchain",
1069
+ "shape-bitcoin-chain",
1070
+ "shape-ethereum-chain",
1071
+ "shape-blockchain-node",
1072
+ "shape-bank",
1073
+ "shape-trust-bank",
1074
+ "shape-payment-provider",
1075
+ "shape-credit-card",
1076
+ "shape-brokerage",
1077
+ "shape-exchange",
1078
+ "shape-atm",
1079
+ "shape-website",
1080
+ "shape-storefront",
1081
+ "shape-warehouse",
1082
+ "shape-online-shop",
1083
+ "shape-cdn-edge",
1084
+ "shape-api-gateway"
1085
+ ]);
1086
+ var COMPACT_TITLE_MAX_H = 100;
1087
+ function titleScalesToFit(kind, h) {
1088
+ const k = kind ?? "";
1089
+ if (KINDS_SCALING_TITLE_ALWAYS.has(k)) return true;
1090
+ return KINDS_SCALING_TITLE_WHEN_LOW.has(k) && h < COMPACT_TITLE_MAX_H;
1091
+ }
1092
+ var MIN_TITLE_FONT_SIZE = 11;
1041
1093
  var KINDS_DRAWN_BY_GENERIC = [
1042
1094
  "person",
1043
1095
  "user-group",
@@ -3140,6 +3192,111 @@ function requiredRowsWidth(rows, kind) {
3140
3192
  if (kind === void 0) return Math.ceil(Math.max(storage, generic));
3141
3193
  return Math.ceil(kind === "storage" ? storage : generic);
3142
3194
  }
3195
+
3196
+ // src/kinds/compact-title.ts
3197
+ function estimateTextWidth(text, fontSize) {
3198
+ let w = 0;
3199
+ for (const ch of text) {
3200
+ const isFullWidth = /[\u3000-\u9FFF\uFF00-\uFFEF]/.test(ch);
3201
+ w += fontSize * (isFullWidth ? 1.05 : 0.62);
3202
+ }
3203
+ return w;
3204
+ }
3205
+ function fitTextSize(text, maxWidth, targetSize, minSize) {
3206
+ let size = targetSize;
3207
+ while (size > minSize && estimateTextWidth(text, size) > maxWidth) {
3208
+ size -= 1;
3209
+ }
3210
+ return size;
3211
+ }
3212
+ var COMPACT_MAX_H = 100;
3213
+ var COMPACT_PADDING_X = 16;
3214
+ var MIN_TEXT_SIZE = 11;
3215
+ var ASCENT = 0.72;
3216
+ var DESCENT = 0.25;
3217
+ var MIN_BAND_H = MIN_TEXT_SIZE * (ASCENT + DESCENT);
3218
+ var EYEBROW_BASELINE = 38;
3219
+ var EYEBROW_SIZE = 18;
3220
+ var EYEBROW_GAP = 8;
3221
+ var BOTTOM_INSET = 4;
3222
+ var eyebrowBottom = () => EYEBROW_BASELINE + EYEBROW_SIZE * DESCENT;
3223
+ var titleBandTop = (hasEyebrow) => eyebrowBottom() + EYEBROW_GAP ;
3224
+ var isCompactBox = (h) => h < COMPACT_MAX_H;
3225
+ function titlePlacement(node, \u901A\u5E38, opts = {}) {
3226
+ if (!isCompactBox(node.h)) {
3227
+ return { x: \u901A\u5E38.x, y: \u901A\u5E38.y, size: \u901A\u5E38.size, anchor: "start" };
3228
+ }
3229
+ const \u9AD8\u3055 = Math.max(0, node.h);
3230
+ const \u76EE\u5370\u3042\u308A = opts.hasEyebrow === true;
3231
+ const \u4E0A = \u76EE\u5370\u3042\u308A && \u9AD8\u3055 >= eyebrowBottom() ? titleBandTop() : 0;
3232
+ const \u751F\u306E\u5E2F = Math.max(0, \u9AD8\u3055 - \u4E0A);
3233
+ const \u4E0B\u4F59\u767D = \u751F\u306E\u5E2F >= MIN_BAND_H + BOTTOM_INSET ? BOTTOM_INSET : 0;
3234
+ const \u5E2F = \u751F\u306E\u5E2F - \u4E0B\u4F59\u767D;
3235
+ const \u5E45\u3067 = fitTextSize(
3236
+ node.title,
3237
+ Math.max(0, node.w - COMPACT_PADDING_X),
3238
+ \u901A\u5E38.size,
3239
+ MIN_TEXT_SIZE
3240
+ );
3241
+ const \u5E2F\u3067 = Math.floor(\u5E2F / (ASCENT + DESCENT));
3242
+ const size = Math.max(MIN_TEXT_SIZE, Math.min(\u5E45\u3067, \u5E2F\u3067));
3243
+ const \u5B57\u9AD8 = size * (ASCENT + DESCENT);
3244
+ const y = \u5B57\u9AD8 <= \u5E2F ? \u4E0A + \u5E2F / 2 + size * (ASCENT - DESCENT) / 2 : \u4E0A > 0 ? \u4E0A + size * ASCENT : (\u9AD8\u3055 - \u5B57\u9AD8) / 2 + size * ASCENT;
3245
+ return { x: node.w / 2, y, size, anchor: "middle" };
3246
+ }
3247
+
3248
+ // src/kinds/box-lines.ts
3249
+ var \u884C\u9001\u308A\u306E\u6BD4 = 1.15;
3250
+ var \u5B57\u306E\u9AD8\u3055\u306E\u6BD4 = 0.72;
3251
+ var \u4E0A\u4E0B\u306E\u4F59\u767D = 2;
3252
+ var \u5DE6\u53F3\u306E\u4F59\u767D = 8;
3253
+ function \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45) {
3254
+ return \u7BB1\u306E\u5E45 - \u5DE6\u53F3\u306E\u4F59\u767D * 2;
3255
+ }
3256
+ function \u5E45\u3067\u5207\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3257
+ if (\u4F7F\u3048\u308B\u5E452 <= 0) return "";
3258
+ if (\u6E2C\u308B(text, fontSize) <= \u4F7F\u3048\u308B\u5E452) return text;
3259
+ const \u7701\u7565 = "\u2026";
3260
+ const \u7701\u7565\u306E\u5E45 = \u6E2C\u308B(\u7701\u7565, fontSize);
3261
+ if (\u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) return "";
3262
+ let \u51FA = "";
3263
+ let \u5E45 = 0;
3264
+ for (const c of \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text)) {
3265
+ const \u5B57\u306E\u5E452 = \u6E2C\u308B(c, fontSize);
3266
+ if (\u5E45 + \u5B57\u306E\u5E452 + \u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) break;
3267
+ \u5E45 += \u5B57\u306E\u5E452;
3268
+ \u51FA += c;
3269
+ }
3270
+ return `${\u51FA}${\u7701\u7565}`;
3271
+ }
3272
+ var \u7E2E\u3081\u306E\u4E0B\u9650 = MIN_TEXT_SIZE;
3273
+ function \u5E45\u306B\u53CE\u3081\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3274
+ let size = fontSize;
3275
+ while (size > \u7E2E\u3081\u306E\u4E0B\u9650 && \u6E2C\u308B(text, size) > \u4F7F\u3048\u308B\u5E452) size -= 1;
3276
+ return { text: \u5E45\u3067\u5207\u308B(text, size, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B), fontSize: size };
3277
+ }
3278
+ function \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text) {
3279
+ const \u533A\u5207\u308A = Intl.Segmenter;
3280
+ if (typeof \u533A\u5207\u308A !== "function") return [...text];
3281
+ return [...new \u533A\u5207\u308A(void 0, { granularity: "grapheme" }).segment(text)].map((g) => g.segment);
3282
+ }
3283
+ function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8\u30553) {
3284
+ const \u5019\u88DC = \u884C.filter((r, i) => i === 0 || r.text.trim() !== "");
3285
+ if (\u5019\u88DC.length === 0) return [];
3286
+ const \u4F7F\u3048\u308B\u9AD8\u3055 = \u7BB1\u306E\u9AD8\u30553 - \u4E0A\u4E0B\u306E\u4F59\u767D * 2;
3287
+ const \u9AD8\u3055 = (rs) => rs.reduce((a, r) => a + r.fontSize * \u884C\u9001\u308A\u306E\u6BD4, 0);
3288
+ const \u6B8B\u3059 = [...\u5019\u88DC];
3289
+ while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
3290
+ const \u5E45 = \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45);
3291
+ const \u53CE\u3081\u305F = \u6B8B\u3059.map((r) => ({ ...r, ...\u5E45\u306B\u53CE\u3081\u308B(r.text, r.fontSize, \u5E45) }));
3292
+ const \u7DCF\u9AD8 = \u9AD8\u3055(\u53CE\u3081\u305F);
3293
+ let \u7A4D\u307F = -\u7DCF\u9AD8 / 2;
3294
+ return \u53CE\u3081\u305F.map((r) => {
3295
+ const dy = \u7A4D\u307F + (\u884C\u9001\u308A\u306E\u6BD4 + \u5B57\u306E\u9AD8\u3055\u306E\u6BD4) / 2 * r.fontSize;
3296
+ \u7A4D\u307F += r.fontSize * \u884C\u9001\u308A\u306E\u6BD4;
3297
+ return { ...r, dy };
3298
+ });
3299
+ }
3143
3300
  function \u66F8\u3044\u305F\u5024\u304B\u63A7\u3048(\u66F8\u3044\u305F, \u63A7\u3048) {
3144
3301
  const v = (\u66F8\u3044\u305F ?? "").trim();
3145
3302
  return v === "" ? \u63A7\u3048 : v;
@@ -3149,14 +3306,22 @@ function \u5E45\u306E\u500D\u7387(text, size, letterSpacing, \u5E45) {
3149
3306
  const \u5B9F\u5E45 = textWidth(text, size, letterSpacing);
3150
3307
  return \u5B9F\u5E45 > \u5E45 ? \u5E45 / \u5B9F\u5E45 : 1;
3151
3308
  }
3309
+ function \u8AAD\u3081\u308B\u4E0B\u9650\u306E\u500D\u7387(\u5927\u304D\u3055) {
3310
+ return \u5927\u304D\u3055 > MIN_TITLE_FONT_SIZE ? MIN_TITLE_FONT_SIZE / \u5927\u304D\u3055 : 0;
3311
+ }
3312
+ function \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(\u984C, \u5927\u304D\u3055, \u5B57\u9593, \u5E45\u4E0A\u9650, \u6E2C\u308B) {
3313
+ const \u4E0B\u9650 = \u8AAD\u3081\u308B\u4E0B\u9650\u306E\u500D\u7387(\u5927\u304D\u3055);
3314
+ if (!(\u4E0B\u9650 > 0) || !(\u5E45\u4E0A\u9650 > 0)) return 0;
3315
+ 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;
3316
+ }
3152
3317
  var TITLE_MAX = 18;
3153
3318
  var TITLE_MIN = 9;
3154
3319
  var TITLE_RATIO = 0.17;
3155
3320
  var SUB_RATIO = 0.72;
3156
3321
  var LINE_GAP = 3;
3157
3322
  var BOTTOM_PAD = 4;
3158
- var ASCENT = 0.72;
3159
- var DESCENT = 0.25;
3323
+ var ASCENT2 = 0.72;
3324
+ var DESCENT2 = 0.25;
3160
3325
  var ART_GAP = 4;
3161
3326
  var ART_MIN_BAND = 45;
3162
3327
  var \u843D\u3068\u3057\u3066\u3082\u63CF\u304F\u7A2E\u5225 = {
@@ -3221,9 +3386,9 @@ function labelPlan(node) {
3221
3386
  y -= \u540D\u524D\u5927 + LINE_GAP;
3222
3387
  const \u80A9\u66F8 = \u80A9\u66F8\u3042\u308A2 ? { y, size: \u5C0F\u3055\u3044\u5B57 } : null;
3223
3388
  const \u4E0A\u306E\u884C = \u80A9\u66F8 ?? \u540D\u524D;
3224
- return { \u540D\u524D, \u8AAC\u660E, \u80A9\u66F8, \u4E0A\u7AEF: \u4E0A\u306E\u884C.y - \u4E0A\u306E\u884C.size * ASCENT };
3389
+ return { \u540D\u524D, \u8AAC\u660E, \u80A9\u66F8, \u4E0A\u7AEF: \u4E0A\u306E\u884C.y - \u4E0A\u306E\u884C.size * ASCENT2 };
3225
3390
  };
3226
- const \u5165\u308B = (\u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2) => \u7A4D\u3080(1, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, 1 * DESCENT).\u4E0A\u7AEF >= \u5929;
3391
+ const \u5165\u308B = (\u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2) => \u7A4D\u3080(1, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, 1 * DESCENT2).\u4E0A\u7AEF >= \u5929;
3227
3392
  let \u8AAC\u660E\u3042\u308A = Boolean(node.subtitle);
3228
3393
  let \u80A9\u66F8\u3042\u308A = Boolean(node.eyebrow);
3229
3394
  const \u843D\u3068\u3057\u305F = [];
@@ -3241,14 +3406,14 @@ function labelPlan(node) {
3241
3406
  for (let size = \u4E0A\u9650; size >= 1; size--) {
3242
3407
  const \u5C0F\u3055\u3044\u5B572 = Math.max(1, Math.round(size * SUB_RATIO));
3243
3408
  const \u4E0B\u306E\u884C\u5927 = \u8AAC\u660E\u3042\u308A2 ? \u5C0F\u3055\u3044\u5B572 : size;
3244
- if (\u7A4D\u3080(size, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, \u4E0B\u306E\u884C\u5927 * DESCENT).\u4E0A\u7AEF >= \u5929) {
3409
+ if (\u7A4D\u3080(size, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, \u4E0B\u306E\u884C\u5927 * DESCENT2).\u4E0A\u7AEF >= \u5929) {
3245
3410
  \u540D\u524D\u5927 = size;
3246
3411
  break;
3247
3412
  }
3248
3413
  }
3249
- if (\u540D\u524D\u5927 === 0) \u540D\u524D\u5927 = \u9AD8\u3055 / (ASCENT + DESCENT);
3414
+ if (\u540D\u524D\u5927 === 0) \u540D\u524D\u5927 = \u9AD8\u3055 / (ASCENT2 + DESCENT2);
3250
3415
  const \u5C0F\u3055\u3044\u5B57 = Math.max(1, Math.round(\u540D\u524D\u5927 * SUB_RATIO));
3251
- const \u5F35\u308A\u51FA\u3057 = (\u8AAC\u660E\u3042\u308A2 ? \u5C0F\u3055\u3044\u5B57 : \u540D\u524D\u5927) * DESCENT;
3416
+ const \u5F35\u308A\u51FA\u3057 = (\u8AAC\u660E\u3042\u308A2 ? \u5C0F\u3055\u3044\u5B57 : \u540D\u524D\u5927) * DESCENT2;
3252
3417
  const \u4F59\u308A = Math.max(0, \u7A4D\u3080(\u540D\u524D\u5927, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, \u5F35\u308A\u51FA\u3057).\u4E0A\u7AEF - \u5929);
3253
3418
  const \u4E0B\u4F59\u767D = Math.min(Math.max(BOTTOM_PAD, \u5F35\u308A\u51FA\u3057), \u5F35\u308A\u51FA\u3057 + \u4F59\u308A);
3254
3419
  return \u7A4D\u3080(\u540D\u524D\u5927, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, \u4E0B\u4F59\u767D);
@@ -3308,16 +3473,19 @@ function bodyBand(node, opt) {
3308
3473
  const h = Math.max(0, \u7BB1h - \u7E26\u4F59\u767D * ky);
3309
3474
  return { x, y, w, h, cx: x + w / 2, cy: y + h / 2, \u53F3: x + w, \u5E95: y + h };
3310
3475
  }
3311
- function fitLabel(band, block, pos) {
3476
+ function fitLabel(band, block, pos, \u6A2A\u306E\u4E0B\u9650 = 0) {
3312
3477
  const \u7E26 = block.\u4E0A + block.\u4E0B;
3313
3478
  const \u6A2A = Math.max(0, block.\u5E45);
3314
3479
  if (!(\u7E26 > 0)) return { k: 1, x: pos.x, y: pos.y };
3315
3480
  if (!(band.h > 0) || !(band.w > 0)) return { k: 0, x: band.x + band.w / 2, y: band.y };
3316
- const k = Math.min(1, band.h / \u7E26, \u6A2A > 0 ? band.w / \u6A2A : 1);
3481
+ const \u6A2A\u3067 = \u6A2A > 0 ? Math.max(band.w / \u6A2A, \u6A2A\u306E\u4E0B\u9650) : 1;
3482
+ const k = Math.min(1, band.h / \u7E26, \u6A2A\u3067);
3317
3483
  const \u534A = \u6A2A * k / 2;
3318
3484
  return {
3319
3485
  k,
3320
- x: Math.max(band.x + \u534A, Math.min(pos.x, band.x + band.w - \u534A)),
3486
+ // 下限で止めた塊は帯より広い。 その時は帯の中央に置いて左右へ均等に出す =
3487
+ // 寄せの式をそのまま当てると片側だけに出る (`compact-title.ts` と同じ判断)
3488
+ x: \u534A * 2 > band.w ? band.x + band.w / 2 : Math.max(band.x + \u534A, Math.min(pos.x, band.x + band.w - \u534A)),
3321
3489
  y: Math.max(band.y + block.\u4E0A * k, Math.min(pos.y, band.y + band.h - block.\u4E0B * k))
3322
3490
  };
3323
3491
  }
@@ -3370,111 +3538,6 @@ function \u6253\u3061\u6D88\u3057\u306E\u500D\u7387(\u500D\u7387, \u5B57\u3089)
3370
3538
  return Math.max(1, Math.min(\u623B\u3057, \u4E0A\u9650));
3371
3539
  }
3372
3540
 
3373
- // src/kinds/compact-title.ts
3374
- function estimateTextWidth(text, fontSize) {
3375
- let w = 0;
3376
- for (const ch of text) {
3377
- const isFullWidth = /[\u3000-\u9FFF\uFF00-\uFFEF]/.test(ch);
3378
- w += fontSize * (isFullWidth ? 1.05 : 0.62);
3379
- }
3380
- return w;
3381
- }
3382
- function fitTextSize(text, maxWidth, targetSize, minSize) {
3383
- let size = targetSize;
3384
- while (size > minSize && estimateTextWidth(text, size) > maxWidth) {
3385
- size -= 1;
3386
- }
3387
- return size;
3388
- }
3389
- var COMPACT_MAX_H = 100;
3390
- var COMPACT_PADDING_X = 16;
3391
- var MIN_TEXT_SIZE = 11;
3392
- var ASCENT2 = 0.72;
3393
- var DESCENT2 = 0.25;
3394
- var MIN_BAND_H = MIN_TEXT_SIZE * (ASCENT2 + DESCENT2);
3395
- var EYEBROW_BASELINE = 38;
3396
- var EYEBROW_SIZE = 18;
3397
- var EYEBROW_GAP = 8;
3398
- var BOTTOM_INSET = 4;
3399
- var eyebrowBottom = () => EYEBROW_BASELINE + EYEBROW_SIZE * DESCENT2;
3400
- var titleBandTop = (hasEyebrow) => eyebrowBottom() + EYEBROW_GAP ;
3401
- var isCompactBox = (h) => h < COMPACT_MAX_H;
3402
- function titlePlacement(node, \u901A\u5E38, opts = {}) {
3403
- if (!isCompactBox(node.h)) {
3404
- return { x: \u901A\u5E38.x, y: \u901A\u5E38.y, size: \u901A\u5E38.size, anchor: "start" };
3405
- }
3406
- const \u9AD8\u3055 = Math.max(0, node.h);
3407
- const \u76EE\u5370\u3042\u308A = opts.hasEyebrow === true;
3408
- const \u4E0A = \u76EE\u5370\u3042\u308A && \u9AD8\u3055 >= eyebrowBottom() ? titleBandTop() : 0;
3409
- const \u751F\u306E\u5E2F = Math.max(0, \u9AD8\u3055 - \u4E0A);
3410
- const \u4E0B\u4F59\u767D = \u751F\u306E\u5E2F >= MIN_BAND_H + BOTTOM_INSET ? BOTTOM_INSET : 0;
3411
- const \u5E2F = \u751F\u306E\u5E2F - \u4E0B\u4F59\u767D;
3412
- const \u5E45\u3067 = fitTextSize(
3413
- node.title,
3414
- Math.max(0, node.w - COMPACT_PADDING_X),
3415
- \u901A\u5E38.size,
3416
- MIN_TEXT_SIZE
3417
- );
3418
- const \u5E2F\u3067 = Math.floor(\u5E2F / (ASCENT2 + DESCENT2));
3419
- const size = Math.max(MIN_TEXT_SIZE, Math.min(\u5E45\u3067, \u5E2F\u3067));
3420
- const \u5B57\u9AD8 = size * (ASCENT2 + DESCENT2);
3421
- const y = \u5B57\u9AD8 <= \u5E2F ? \u4E0A + \u5E2F / 2 + size * (ASCENT2 - DESCENT2) / 2 : \u4E0A > 0 ? \u4E0A + size * ASCENT2 : (\u9AD8\u3055 - \u5B57\u9AD8) / 2 + size * ASCENT2;
3422
- return { x: node.w / 2, y, size, anchor: "middle" };
3423
- }
3424
-
3425
- // src/kinds/box-lines.ts
3426
- var \u884C\u9001\u308A\u306E\u6BD4 = 1.15;
3427
- var \u5B57\u306E\u9AD8\u3055\u306E\u6BD4 = 0.72;
3428
- var \u4E0A\u4E0B\u306E\u4F59\u767D = 2;
3429
- var \u5DE6\u53F3\u306E\u4F59\u767D = 8;
3430
- function \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45) {
3431
- return \u7BB1\u306E\u5E45 - \u5DE6\u53F3\u306E\u4F59\u767D * 2;
3432
- }
3433
- function \u5E45\u3067\u5207\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3434
- if (\u4F7F\u3048\u308B\u5E452 <= 0) return "";
3435
- if (\u6E2C\u308B(text, fontSize) <= \u4F7F\u3048\u308B\u5E452) return text;
3436
- const \u7701\u7565 = "\u2026";
3437
- const \u7701\u7565\u306E\u5E45 = \u6E2C\u308B(\u7701\u7565, fontSize);
3438
- if (\u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) return "";
3439
- let \u51FA = "";
3440
- let \u5E45 = 0;
3441
- for (const c of \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text)) {
3442
- const \u5B57\u306E\u5E452 = \u6E2C\u308B(c, fontSize);
3443
- if (\u5E45 + \u5B57\u306E\u5E452 + \u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) break;
3444
- \u5E45 += \u5B57\u306E\u5E452;
3445
- \u51FA += c;
3446
- }
3447
- return `${\u51FA}${\u7701\u7565}`;
3448
- }
3449
- var \u7E2E\u3081\u306E\u4E0B\u9650 = MIN_TEXT_SIZE;
3450
- function \u5E45\u306B\u53CE\u3081\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3451
- let size = fontSize;
3452
- while (size > \u7E2E\u3081\u306E\u4E0B\u9650 && \u6E2C\u308B(text, size) > \u4F7F\u3048\u308B\u5E452) size -= 1;
3453
- return { text: \u5E45\u3067\u5207\u308B(text, size, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B), fontSize: size };
3454
- }
3455
- function \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text) {
3456
- const \u533A\u5207\u308A = Intl.Segmenter;
3457
- if (typeof \u533A\u5207\u308A !== "function") return [...text];
3458
- return [...new \u533A\u5207\u308A(void 0, { granularity: "grapheme" }).segment(text)].map((g) => g.segment);
3459
- }
3460
- function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8\u30553) {
3461
- const \u5019\u88DC = \u884C.filter((r, i) => i === 0 || r.text.trim() !== "");
3462
- if (\u5019\u88DC.length === 0) return [];
3463
- const \u4F7F\u3048\u308B\u9AD8\u3055 = \u7BB1\u306E\u9AD8\u30553 - \u4E0A\u4E0B\u306E\u4F59\u767D * 2;
3464
- const \u9AD8\u3055 = (rs) => rs.reduce((a, r) => a + r.fontSize * \u884C\u9001\u308A\u306E\u6BD4, 0);
3465
- const \u6B8B\u3059 = [...\u5019\u88DC];
3466
- while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
3467
- const \u5E45 = \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45);
3468
- const \u53CE\u3081\u305F = \u6B8B\u3059.map((r) => ({ ...r, ...\u5E45\u306B\u53CE\u3081\u308B(r.text, r.fontSize, \u5E45) }));
3469
- const \u7DCF\u9AD8 = \u9AD8\u3055(\u53CE\u3081\u305F);
3470
- let \u7A4D\u307F = -\u7DCF\u9AD8 / 2;
3471
- return \u53CE\u3081\u305F.map((r) => {
3472
- const dy = \u7A4D\u307F + (\u884C\u9001\u308A\u306E\u6BD4 + \u5B57\u306E\u9AD8\u3055\u306E\u6BD4) / 2 * r.fontSize;
3473
- \u7A4D\u307F += r.fontSize * \u884C\u9001\u308A\u306E\u6BD4;
3474
- return { ...r, dy };
3475
- });
3476
- }
3477
-
3478
3541
  // src/render/tone.ts
3479
3542
  var TONE = {
3480
3543
  accent: "var(--cdl-tone-accent, #2d6a8f)",
@@ -6131,12 +6194,23 @@ function runAxes(laid, diag, violations, counts, push, profile, skippedAxes, \u5
6131
6194
  if (!isRenderedNode(n)) continue;
6132
6195
  const titleTrimmed = n.title?.trim() ?? "";
6133
6196
  if (!titleTrimmed) continue;
6134
- const expectedW = measureTextWidth(titleTrimmed, { fontSize: titleFontSize(n.kind) }) + (drawsTitleOutsideBox(n.kind) ? 0 : TITLE_BOX_PADDING);
6135
- if (expectedW > n.w + 8) {
6197
+ const \u4F59\u767D = drawsTitleOutsideBox(n.kind) ? 0 : TITLE_BOX_PADDING;
6198
+ const \u4F7F\u3048\u308B\u5E452 = n.w - \u4F59\u767D;
6199
+ const \u5B9F\u5E45 = measureTextWidth(titleTrimmed, { fontSize: titleFontSize(n.kind), bound: "drawn" });
6200
+ if (titleScalesToFit(n.kind, n.h)) {
6201
+ const \u7E2E\u3081\u305F\u5927\u304D\u3055 = \u5B9F\u5E45 > 0 ? titleFontSize(n.kind) * Math.min(1, \u4F7F\u3048\u308B\u5E452 / \u5B9F\u5E45) : titleFontSize(n.kind);
6202
+ if (\u7E2E\u3081\u305F\u5927\u304D\u3055 < MIN_TITLE_FONT_SIZE) {
6203
+ push(
6204
+ "text-readability",
6205
+ `node "${n.id}" title "${n.title}" \u304C node \u5E45 ${n.w}px \u306B\u53CE\u307E\u3089\u305A\u3001\u8AAD\u3081\u308B\u4E0B\u9650 ${MIN_TITLE_FONT_SIZE}px \u3092\u5272\u308B (\u7E2E\u3081\u3066 ${\u7E2E\u3081\u305F\u5927\u304D\u3055.toFixed(1)}px)`,
6206
+ "warn"
6207
+ );
6208
+ }
6209
+ } else if (\u5B9F\u5E45 > \u4F7F\u3048\u308B\u5E452 + 8) {
6136
6210
  push(
6137
6211
  "text-readability",
6138
6212
  // 字ごとの実幅は小数になるので、読む人に出す時だけ丸める (判定は丸めない)
6139
- `node "${n.id}" title "${n.title}" \u304C node \u5E45 ${n.w}px \u3092\u8D85\u904E\u3059\u308B\u53EF\u80FD\u6027 (\u671F\u5F85 ${Math.round(expectedW)}px)`,
6213
+ `node "${n.id}" title "${n.title}" \u304C node \u5E45 ${n.w}px \u3092\u8D85\u904E\u3059\u308B\u53EF\u80FD\u6027 (\u671F\u5F85 ${Math.round(\u5B9F\u5E45 + \u4F59\u767D)}px)`,
6140
6214
  "warn"
6141
6215
  );
6142
6216
  }
@@ -11776,7 +11850,7 @@ function CardNode({ node, active }) {
11776
11850
  const textAnchor = compact ? "middle" : "start";
11777
11851
  const subtitleY = 124 - \u305A\u3089\u3057;
11778
11852
  const \u6700\u5927\u306E\u884C\u9001\u308A = SUBTITLE_SIZE * \u884C\u9001\u308A\u306E\u500D\u7387;
11779
- 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;
11853
+ const \u4E8C\u884C\u304C\u5165\u308B = !compact && subtitleY - \u6700\u5927\u306E\u884C\u9001\u308A / 2 - SUBTITLE_SIZE * ASCENT > titleY + titleSize * DESCENT && subtitleY + \u6700\u5927\u306E\u884C\u9001\u308A / 2 + SUBTITLE_SIZE * DESCENT <= node.h - 4;
11780
11854
  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;
11781
11855
  const subtitleSize = \u8AAC\u660E?.size ?? 21;
11782
11856
  const \u884C\u9001\u308A = subtitleSize * \u884C\u9001\u308A\u306E\u500D\u7387;
@@ -16073,20 +16147,22 @@ var EYEBROW_TRACKING = 2;
16073
16147
  var SUB_SIZE = 11;
16074
16148
  var SUB_GAP = 4;
16075
16149
  function labelBlock(node, pos, size, band) {
16076
- const \u4E0A = node.eyebrow ? size + EYEBROW_GAP2 + EYEBROW_SIZE2 * ASCENT : size * ASCENT;
16077
- const \u4E0B = node.subtitle ? size + SUB_GAP + SUB_SIZE * DESCENT : size * DESCENT;
16150
+ const \u4E0A = node.eyebrow ? size + EYEBROW_GAP2 + EYEBROW_SIZE2 * ASCENT2 : size * ASCENT2;
16151
+ const \u4E0B = node.subtitle ? size + SUB_GAP + SUB_SIZE * DESCENT2 : size * DESCENT2;
16078
16152
  const \u5E45 = Math.max(
16079
16153
  textWidth(node.title ?? "", size),
16080
16154
  node.eyebrow ? textWidth(node.eyebrow, EYEBROW_SIZE2, EYEBROW_TRACKING) : 0,
16081
16155
  node.subtitle ? textWidth(node.subtitle, SUB_SIZE) : 0
16082
16156
  );
16083
- const { k, x, y: baseline } = fitLabel(band, { \u4E0A, \u4E0B, \u5E45 }, pos);
16157
+ const \u4E0B\u9650 = \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", size, 0, band.w, textWidth);
16158
+ const { k, x, y: baseline } = fitLabel(band, { \u4E0A, \u4E0B, \u5E45 }, pos, \u4E0B\u9650);
16084
16159
  return { k, x, baseline, \u4E0A\u7AEF: baseline - \u4E0A * k, \u4E0B\u7AEF: baseline + \u4E0B * k };
16085
16160
  }
16086
16161
  function commonLabel(node, pos, size, band) {
16087
16162
  const \u584A = labelBlock(node, pos, size, band);
16088
16163
  const k = \u584A.k;
16089
16164
  const x = \u584A.x;
16165
+ 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));
16090
16166
  return /* @__PURE__ */ jsxs(Fragment, { children: [
16091
16167
  node.eyebrow && /* @__PURE__ */ jsx(
16092
16168
  "text",
@@ -16098,7 +16174,7 @@ function commonLabel(node, pos, size, band) {
16098
16174
  letterSpacing: EYEBROW_TRACKING * k,
16099
16175
  textAnchor: "middle",
16100
16176
  fill: "var(--cdl-tone-accent, #2d6a8f)",
16101
- children: node.eyebrow
16177
+ children: \u5207\u308B(node.eyebrow, EYEBROW_SIZE2, EYEBROW_TRACKING)
16102
16178
  }
16103
16179
  ),
16104
16180
  /* @__PURE__ */ jsx(
@@ -16111,7 +16187,7 @@ function commonLabel(node, pos, size, band) {
16111
16187
  fontWeight: 700,
16112
16188
  textAnchor: "middle",
16113
16189
  fill: "var(--cdl-text, #1a1f2a)",
16114
- children: node.title
16190
+ children: \u5207\u308B(node.title ?? "", size)
16115
16191
  }
16116
16192
  ),
16117
16193
  node.subtitle && /* @__PURE__ */ jsx(
@@ -16122,7 +16198,7 @@ function commonLabel(node, pos, size, band) {
16122
16198
  fontSize: SUB_SIZE * k,
16123
16199
  textAnchor: "middle",
16124
16200
  fill: "var(--cdl-text-dim, #5a6270)",
16125
- children: node.subtitle
16201
+ children: \u5207\u308B(node.subtitle, SUB_SIZE)
16126
16202
  }
16127
16203
  )
16128
16204
  ] });
@@ -16457,7 +16533,9 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16457
16533
  node.eyebrow && plan.\u80A9\u66F8 ? textWidth(node.eyebrow, plan.\u80A9\u66F8.size, EYEBROW_TRACKING) : 0,
16458
16534
  node.subtitle && plan.\u8AAC\u660E ? textWidth(node.subtitle, plan.\u8AAC\u660E.size) : 0
16459
16535
  );
16460
- const k = \u5E45 > 0 && \u5E45\u4E0A\u9650 > 0 ? Math.min(1, \u5E45\u4E0A\u9650 / \u5E45) : 1;
16536
+ const \u4E0B\u9650 = \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", plan.\u540D\u524D.size, 0, \u5E45\u4E0A\u9650, textWidth);
16537
+ const k = \u5E45 > 0 && \u5E45\u4E0A\u9650 > 0 ? Math.min(1, Math.max(\u5E45\u4E0A\u9650 / \u5E45, \u4E0B\u9650)) : 1;
16538
+ 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));
16461
16539
  return /* @__PURE__ */ jsxs(Fragment, { children: [
16462
16540
  node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsx(
16463
16541
  "text",
@@ -16469,7 +16547,7 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16469
16547
  letterSpacing: EYEBROW_TRACKING * k,
16470
16548
  textAnchor: "middle",
16471
16549
  fill: "var(--cdl-tone-accent, #2d6a8f)",
16472
- children: node.eyebrow
16550
+ children: \u5207\u308B(node.eyebrow, plan.\u80A9\u66F8.size, EYEBROW_TRACKING)
16473
16551
  }
16474
16552
  ),
16475
16553
  /* @__PURE__ */ jsx(
@@ -16482,7 +16560,7 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16482
16560
  fontWeight: 700,
16483
16561
  textAnchor: "middle",
16484
16562
  fill: "var(--cdl-text, #1a1f2a)",
16485
- children: node.title
16563
+ children: \u5207\u308B(node.title ?? "", plan.\u540D\u524D.size)
16486
16564
  }
16487
16565
  ),
16488
16566
  node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx(
@@ -16493,7 +16571,7 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16493
16571
  fontSize: plan.\u8AAC\u660E.size * k,
16494
16572
  textAnchor: "middle",
16495
16573
  fill: "var(--cdl-text-dim, #5a6270)",
16496
- children: node.subtitle
16574
+ children: \u5207\u308B(node.subtitle, plan.\u8AAC\u660E.size)
16497
16575
  }
16498
16576
  )
16499
16577
  ] });
@@ -17416,17 +17494,19 @@ var externalLabel = (node, cx, bottomY) => /* @__PURE__ */ jsxs(Fragment, { chil
17416
17494
  var LABEL_EYEBROW_SPACING = 2;
17417
17495
  function \u5E45\u306B\u53CE\u3081\u308B2(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
17418
17496
  const \u5E45 = textWidth(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
17419
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
17420
- return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
17497
+ 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;
17498
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
17499
+ const spacing = \u5B57\u9593 * \u500D\u7387;
17500
+ return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => textWidth(u, f, spacing)) };
17421
17501
  }
17422
17502
  function bottomLabel(node, cx, plan) {
17423
17503
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B2(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING, node.w);
17424
17504
  const \u540D = \u5E45\u306B\u53CE\u3081\u308B2(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
17425
17505
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B2(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
17426
17506
  return /* @__PURE__ */ jsxs(Fragment, { children: [
17427
- node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ 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 }),
17428
- /* @__PURE__ */ 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 }),
17429
- node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
17507
+ node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ 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 }),
17508
+ /* @__PURE__ */ 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: \u540D.text }),
17509
+ node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: \u8AAC.text })
17430
17510
  ] });
17431
17511
  }
17432
17512
  var RACK_SLOT_TOP = 20;
@@ -18221,13 +18301,22 @@ function blockchainNodeExtent(strokeWidth) {
18221
18301
  return { \u4E0A: \u7E26, \u4E0B: \u7E26, \u5DE6: \u6A2A, \u53F3: \u6A2A };
18222
18302
  }
18223
18303
  function bottomLabel2(node, cx, plan) {
18224
- const \u80A9\u66F8\u500D\u7387 = node.eyebrow && plan.\u80A9\u66F8 ? \u5E45\u306E\u500D\u7387(node.eyebrow, plan.\u80A9\u66F8.size, 2, node.w) : 1;
18225
- const \u540D\u524D\u500D\u7387 = \u5E45\u306E\u500D\u7387(node.title, plan.\u540D\u524D.size, 0, node.w);
18226
- const \u8AAC\u660E\u500D\u7387 = node.subtitle && plan.\u8AAC\u660E ? \u5E45\u306E\u500D\u7387(node.subtitle, plan.\u8AAC\u660E.size, 0, node.w) : 1;
18304
+ const \u53CE\u3081\u308B = (t, \u5927\u304D\u3055, \u5B57\u9593) => {
18305
+ const \u6E2C\u308B = (u, f, ls) => \u5B57\u306E\u5E45(u, f) + ls * [...u].length;
18306
+ 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));
18307
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
18308
+ 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) };
18309
+ };
18310
+ const \u80A9 = node.eyebrow && plan.\u80A9\u66F8 ? \u53CE\u3081\u308B(node.eyebrow, plan.\u80A9\u66F8.size, 2) : { \u500D\u7387: 1, text: node.eyebrow ?? "" };
18311
+ const \u540D = \u53CE\u3081\u308B(node.title ?? "", plan.\u540D\u524D.size, 0);
18312
+ const \u8AAC = node.subtitle && plan.\u8AAC\u660E ? \u53CE\u3081\u308B(node.subtitle, plan.\u8AAC\u660E.size, 0) : { \u500D\u7387: 1, text: node.subtitle ?? "" };
18313
+ const \u80A9\u66F8\u500D\u7387 = \u80A9.\u500D\u7387;
18314
+ const \u540D\u524D\u500D\u7387 = \u540D.\u500D\u7387;
18315
+ const \u8AAC\u660E\u500D\u7387 = \u8AAC.\u500D\u7387;
18227
18316
  return /* @__PURE__ */ jsxs(Fragment, { children: [
18228
- node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u80A9\u66F8.y, fontSize: plan.\u80A9\u66F8.size * \u80A9\u66F8\u500D\u7387, fontWeight: 700, letterSpacing: 2 * \u80A9\u66F8\u500D\u7387, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", children: node.eyebrow }),
18229
- /* @__PURE__ */ jsx("text", { "data-cdl-role": "node-label", x: cx, y: plan.\u540D\u524D.y, fontSize: plan.\u540D\u524D.size * \u540D\u524D\u500D\u7387, fontWeight: 700, textAnchor: "middle", fill: "var(--cdl-text, #1a1f2a)", children: node.title }),
18230
- node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: plan.\u8AAC\u660E.size * \u8AAC\u660E\u500D\u7387, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
18317
+ node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u80A9\u66F8.y, fontSize: plan.\u80A9\u66F8.size * \u80A9\u66F8\u500D\u7387, fontWeight: 700, letterSpacing: 2 * \u80A9\u66F8\u500D\u7387, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", children: \u80A9.text }),
18318
+ /* @__PURE__ */ jsx("text", { "data-cdl-role": "node-label", x: cx, y: plan.\u540D\u524D.y, fontSize: plan.\u540D\u524D.size * \u540D\u524D\u500D\u7387, fontWeight: 700, textAnchor: "middle", fill: "var(--cdl-text, #1a1f2a)", children: \u540D.text }),
18319
+ node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: plan.\u8AAC\u660E.size * \u8AAC\u660E\u500D\u7387, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: \u8AAC.text })
18231
18320
  ] });
18232
18321
  }
18233
18322
  function EthereumDiamond({ cx, cy, h, colors }) {
@@ -18836,17 +18925,19 @@ function \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
18836
18925
  }
18837
18926
  function \u5E45\u306B\u53CE\u3081\u308B3(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
18838
18927
  const \u5E45 = \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
18839
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
18840
- return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
18928
+ 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;
18929
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
18930
+ const spacing = \u5B57\u9593 * \u500D\u7387;
18931
+ return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E45(u, f, spacing)) };
18841
18932
  }
18842
18933
  function bottomLabel3(node, cx, plan) {
18843
18934
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B3(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING2, node.w);
18844
18935
  const \u540D = \u5E45\u306B\u53CE\u3081\u308B3(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
18845
18936
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B3(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
18846
18937
  return /* @__PURE__ */ jsxs(Fragment, { children: [
18847
- node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ 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 }),
18848
- /* @__PURE__ */ 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 }),
18849
- node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
18938
+ node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ 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 }),
18939
+ /* @__PURE__ */ 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: \u540D.text }),
18940
+ node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: \u8AAC.text })
18850
18941
  ] });
18851
18942
  }
18852
18943
  var BANK_PEDIMENT_H = 44;
@@ -19319,17 +19410,19 @@ function \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
19319
19410
  }
19320
19411
  function \u5E45\u306B\u53CE\u3081\u308B4(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
19321
19412
  const \u5E45 = \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
19322
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
19323
- return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
19413
+ 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;
19414
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
19415
+ const spacing = \u5B57\u9593 * \u500D\u7387;
19416
+ return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E452(u, f, spacing)) };
19324
19417
  }
19325
19418
  function bottomLabel4(node, cx, plan) {
19326
19419
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B4(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING3, node.w);
19327
19420
  const \u540D = \u5E45\u306B\u53CE\u3081\u308B4(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
19328
19421
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B4(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
19329
19422
  return /* @__PURE__ */ jsxs(Fragment, { children: [
19330
- node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ 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 }),
19331
- /* @__PURE__ */ 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 }),
19332
- node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
19423
+ node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ 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 }),
19424
+ /* @__PURE__ */ 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: \u540D.text }),
19425
+ node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: \u8AAC.text })
19333
19426
  ] });
19334
19427
  }
19335
19428
  var DROP_SHADOW_D = 4;