@cardenelabs/cdl 0.107.0 → 0.109.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
@@ -3192,6 +3192,111 @@ function requiredRowsWidth(rows, kind) {
3192
3192
  if (kind === void 0) return Math.ceil(Math.max(storage, generic));
3193
3193
  return Math.ceil(kind === "storage" ? storage : generic);
3194
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
+ }
3195
3300
  function \u66F8\u3044\u305F\u5024\u304B\u63A7\u3048(\u66F8\u3044\u305F, \u63A7\u3048) {
3196
3301
  const v = (\u66F8\u3044\u305F ?? "").trim();
3197
3302
  return v === "" ? \u63A7\u3048 : v;
@@ -3201,14 +3306,22 @@ function \u5E45\u306E\u500D\u7387(text, size, letterSpacing, \u5E45) {
3201
3306
  const \u5B9F\u5E45 = textWidth(text, size, letterSpacing);
3202
3307
  return \u5B9F\u5E45 > \u5E45 ? \u5E45 / \u5B9F\u5E45 : 1;
3203
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
+ }
3204
3317
  var TITLE_MAX = 18;
3205
3318
  var TITLE_MIN = 9;
3206
3319
  var TITLE_RATIO = 0.17;
3207
3320
  var SUB_RATIO = 0.72;
3208
3321
  var LINE_GAP = 3;
3209
3322
  var BOTTOM_PAD = 4;
3210
- var ASCENT = 0.72;
3211
- var DESCENT = 0.25;
3323
+ var ASCENT2 = 0.72;
3324
+ var DESCENT2 = 0.25;
3212
3325
  var ART_GAP = 4;
3213
3326
  var ART_MIN_BAND = 45;
3214
3327
  var \u843D\u3068\u3057\u3066\u3082\u63CF\u304F\u7A2E\u5225 = {
@@ -3273,9 +3386,9 @@ function labelPlan(node) {
3273
3386
  y -= \u540D\u524D\u5927 + LINE_GAP;
3274
3387
  const \u80A9\u66F8 = \u80A9\u66F8\u3042\u308A2 ? { y, size: \u5C0F\u3055\u3044\u5B57 } : null;
3275
3388
  const \u4E0A\u306E\u884C = \u80A9\u66F8 ?? \u540D\u524D;
3276
- 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 };
3277
3390
  };
3278
- 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;
3279
3392
  let \u8AAC\u660E\u3042\u308A = Boolean(node.subtitle);
3280
3393
  let \u80A9\u66F8\u3042\u308A = Boolean(node.eyebrow);
3281
3394
  const \u843D\u3068\u3057\u305F = [];
@@ -3293,14 +3406,14 @@ function labelPlan(node) {
3293
3406
  for (let size = \u4E0A\u9650; size >= 1; size--) {
3294
3407
  const \u5C0F\u3055\u3044\u5B572 = Math.max(1, Math.round(size * SUB_RATIO));
3295
3408
  const \u4E0B\u306E\u884C\u5927 = \u8AAC\u660E\u3042\u308A2 ? \u5C0F\u3055\u3044\u5B572 : size;
3296
- 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) {
3297
3410
  \u540D\u524D\u5927 = size;
3298
3411
  break;
3299
3412
  }
3300
3413
  }
3301
- 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);
3302
3415
  const \u5C0F\u3055\u3044\u5B57 = Math.max(1, Math.round(\u540D\u524D\u5927 * SUB_RATIO));
3303
- 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;
3304
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);
3305
3418
  const \u4E0B\u4F59\u767D = Math.min(Math.max(BOTTOM_PAD, \u5F35\u308A\u51FA\u3057), \u5F35\u308A\u51FA\u3057 + \u4F59\u308A);
3306
3419
  return \u7A4D\u3080(\u540D\u524D\u5927, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, \u4E0B\u4F59\u767D);
@@ -3360,16 +3473,19 @@ function bodyBand(node, opt) {
3360
3473
  const h = Math.max(0, \u7BB1h - \u7E26\u4F59\u767D * ky);
3361
3474
  return { x, y, w, h, cx: x + w / 2, cy: y + h / 2, \u53F3: x + w, \u5E95: y + h };
3362
3475
  }
3363
- function fitLabel(band, block, pos) {
3476
+ function fitLabel(band, block, pos, \u6A2A\u306E\u4E0B\u9650 = 0) {
3364
3477
  const \u7E26 = block.\u4E0A + block.\u4E0B;
3365
3478
  const \u6A2A = Math.max(0, block.\u5E45);
3366
3479
  if (!(\u7E26 > 0)) return { k: 1, x: pos.x, y: pos.y };
3367
3480
  if (!(band.h > 0) || !(band.w > 0)) return { k: 0, x: band.x + band.w / 2, y: band.y };
3368
- 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);
3369
3483
  const \u534A = \u6A2A * k / 2;
3370
3484
  return {
3371
3485
  k,
3372
- 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)),
3373
3489
  y: Math.max(band.y + block.\u4E0A * k, Math.min(pos.y, band.y + band.h - block.\u4E0B * k))
3374
3490
  };
3375
3491
  }
@@ -3422,111 +3538,6 @@ function \u6253\u3061\u6D88\u3057\u306E\u500D\u7387(\u500D\u7387, \u5B57\u3089)
3422
3538
  return Math.max(1, Math.min(\u623B\u3057, \u4E0A\u9650));
3423
3539
  }
3424
3540
 
3425
- // src/kinds/compact-title.ts
3426
- function estimateTextWidth(text, fontSize) {
3427
- let w = 0;
3428
- for (const ch of text) {
3429
- const isFullWidth = /[\u3000-\u9FFF\uFF00-\uFFEF]/.test(ch);
3430
- w += fontSize * (isFullWidth ? 1.05 : 0.62);
3431
- }
3432
- return w;
3433
- }
3434
- function fitTextSize(text, maxWidth, targetSize, minSize) {
3435
- let size = targetSize;
3436
- while (size > minSize && estimateTextWidth(text, size) > maxWidth) {
3437
- size -= 1;
3438
- }
3439
- return size;
3440
- }
3441
- var COMPACT_MAX_H = 100;
3442
- var COMPACT_PADDING_X = 16;
3443
- var MIN_TEXT_SIZE = 11;
3444
- var ASCENT2 = 0.72;
3445
- var DESCENT2 = 0.25;
3446
- var MIN_BAND_H = MIN_TEXT_SIZE * (ASCENT2 + DESCENT2);
3447
- var EYEBROW_BASELINE = 38;
3448
- var EYEBROW_SIZE = 18;
3449
- var EYEBROW_GAP = 8;
3450
- var BOTTOM_INSET = 4;
3451
- var eyebrowBottom = () => EYEBROW_BASELINE + EYEBROW_SIZE * DESCENT2;
3452
- var titleBandTop = (hasEyebrow) => eyebrowBottom() + EYEBROW_GAP ;
3453
- var isCompactBox = (h) => h < COMPACT_MAX_H;
3454
- function titlePlacement(node, \u901A\u5E38, opts = {}) {
3455
- if (!isCompactBox(node.h)) {
3456
- return { x: \u901A\u5E38.x, y: \u901A\u5E38.y, size: \u901A\u5E38.size, anchor: "start" };
3457
- }
3458
- const \u9AD8\u3055 = Math.max(0, node.h);
3459
- const \u76EE\u5370\u3042\u308A = opts.hasEyebrow === true;
3460
- const \u4E0A = \u76EE\u5370\u3042\u308A && \u9AD8\u3055 >= eyebrowBottom() ? titleBandTop() : 0;
3461
- const \u751F\u306E\u5E2F = Math.max(0, \u9AD8\u3055 - \u4E0A);
3462
- const \u4E0B\u4F59\u767D = \u751F\u306E\u5E2F >= MIN_BAND_H + BOTTOM_INSET ? BOTTOM_INSET : 0;
3463
- const \u5E2F = \u751F\u306E\u5E2F - \u4E0B\u4F59\u767D;
3464
- const \u5E45\u3067 = fitTextSize(
3465
- node.title,
3466
- Math.max(0, node.w - COMPACT_PADDING_X),
3467
- \u901A\u5E38.size,
3468
- MIN_TEXT_SIZE
3469
- );
3470
- const \u5E2F\u3067 = Math.floor(\u5E2F / (ASCENT2 + DESCENT2));
3471
- const size = Math.max(MIN_TEXT_SIZE, Math.min(\u5E45\u3067, \u5E2F\u3067));
3472
- const \u5B57\u9AD8 = size * (ASCENT2 + DESCENT2);
3473
- const y = \u5B57\u9AD8 <= \u5E2F ? \u4E0A + \u5E2F / 2 + size * (ASCENT2 - DESCENT2) / 2 : \u4E0A > 0 ? \u4E0A + size * ASCENT2 : (\u9AD8\u3055 - \u5B57\u9AD8) / 2 + size * ASCENT2;
3474
- return { x: node.w / 2, y, size, anchor: "middle" };
3475
- }
3476
-
3477
- // src/kinds/box-lines.ts
3478
- var \u884C\u9001\u308A\u306E\u6BD4 = 1.15;
3479
- var \u5B57\u306E\u9AD8\u3055\u306E\u6BD4 = 0.72;
3480
- var \u4E0A\u4E0B\u306E\u4F59\u767D = 2;
3481
- var \u5DE6\u53F3\u306E\u4F59\u767D = 8;
3482
- function \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45) {
3483
- return \u7BB1\u306E\u5E45 - \u5DE6\u53F3\u306E\u4F59\u767D * 2;
3484
- }
3485
- function \u5E45\u3067\u5207\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3486
- if (\u4F7F\u3048\u308B\u5E452 <= 0) return "";
3487
- if (\u6E2C\u308B(text, fontSize) <= \u4F7F\u3048\u308B\u5E452) return text;
3488
- const \u7701\u7565 = "\u2026";
3489
- const \u7701\u7565\u306E\u5E45 = \u6E2C\u308B(\u7701\u7565, fontSize);
3490
- if (\u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) return "";
3491
- let \u51FA = "";
3492
- let \u5E45 = 0;
3493
- for (const c of \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text)) {
3494
- const \u5B57\u306E\u5E452 = \u6E2C\u308B(c, fontSize);
3495
- if (\u5E45 + \u5B57\u306E\u5E452 + \u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) break;
3496
- \u5E45 += \u5B57\u306E\u5E452;
3497
- \u51FA += c;
3498
- }
3499
- return `${\u51FA}${\u7701\u7565}`;
3500
- }
3501
- var \u7E2E\u3081\u306E\u4E0B\u9650 = MIN_TEXT_SIZE;
3502
- function \u5E45\u306B\u53CE\u3081\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3503
- let size = fontSize;
3504
- while (size > \u7E2E\u3081\u306E\u4E0B\u9650 && \u6E2C\u308B(text, size) > \u4F7F\u3048\u308B\u5E452) size -= 1;
3505
- return { text: \u5E45\u3067\u5207\u308B(text, size, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B), fontSize: size };
3506
- }
3507
- function \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text) {
3508
- const \u533A\u5207\u308A = Intl.Segmenter;
3509
- if (typeof \u533A\u5207\u308A !== "function") return [...text];
3510
- return [...new \u533A\u5207\u308A(void 0, { granularity: "grapheme" }).segment(text)].map((g) => g.segment);
3511
- }
3512
- function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8\u30553) {
3513
- const \u5019\u88DC = \u884C.filter((r, i) => i === 0 || r.text.trim() !== "");
3514
- if (\u5019\u88DC.length === 0) return [];
3515
- const \u4F7F\u3048\u308B\u9AD8\u3055 = \u7BB1\u306E\u9AD8\u30553 - \u4E0A\u4E0B\u306E\u4F59\u767D * 2;
3516
- const \u9AD8\u3055 = (rs) => rs.reduce((a, r) => a + r.fontSize * \u884C\u9001\u308A\u306E\u6BD4, 0);
3517
- const \u6B8B\u3059 = [...\u5019\u88DC];
3518
- while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
3519
- const \u5E45 = \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45);
3520
- const \u53CE\u3081\u305F = \u6B8B\u3059.map((r) => ({ ...r, ...\u5E45\u306B\u53CE\u3081\u308B(r.text, r.fontSize, \u5E45) }));
3521
- const \u7DCF\u9AD8 = \u9AD8\u3055(\u53CE\u3081\u305F);
3522
- let \u7A4D\u307F = -\u7DCF\u9AD8 / 2;
3523
- return \u53CE\u3081\u305F.map((r) => {
3524
- const dy = \u7A4D\u307F + (\u884C\u9001\u308A\u306E\u6BD4 + \u5B57\u306E\u9AD8\u3055\u306E\u6BD4) / 2 * r.fontSize;
3525
- \u7A4D\u307F += r.fontSize * \u884C\u9001\u308A\u306E\u6BD4;
3526
- return { ...r, dy };
3527
- });
3528
- }
3529
-
3530
3541
  // src/render/tone.ts
3531
3542
  var TONE = {
3532
3543
  accent: "var(--cdl-tone-accent, #2d6a8f)",
@@ -10902,12 +10913,13 @@ function CdlHeader({
10902
10913
  stateValues,
10903
10914
  states,
10904
10915
  onJumpPhase,
10905
- headingLevel = 3
10916
+ headingLevel = 3,
10917
+ showTopic = true
10906
10918
  }) {
10907
10919
  const HeadingTag = `h${headingLevel}`;
10908
10920
  return /* @__PURE__ */ jsxs("div", { className: "border-b border-[var(--cdl-divider,#d4d4d8)]/35 px-7 py-6", children: [
10909
10921
  /* @__PURE__ */ jsxs("div", { className: "mb-5 flex items-center gap-3", children: [
10910
- /* @__PURE__ */ jsx("div", { className: "text-[10px] font-bold uppercase tracking-[0.2em]", style: { color: "var(--cdl-text-accent, #2d6a8f)" }, children: topic }),
10922
+ showTopic && /* @__PURE__ */ jsx("div", { className: "text-[10px] font-bold uppercase tracking-[0.2em]", style: { color: "var(--cdl-text-accent, #2d6a8f)" }, children: topic }),
10911
10923
  /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [
10912
10924
  phases.map((p, idx) => {
10913
10925
  const active = idx === phaseIdx;
@@ -11839,7 +11851,7 @@ function CardNode({ node, active }) {
11839
11851
  const textAnchor = compact ? "middle" : "start";
11840
11852
  const subtitleY = 124 - \u305A\u3089\u3057;
11841
11853
  const \u6700\u5927\u306E\u884C\u9001\u308A = SUBTITLE_SIZE * \u884C\u9001\u308A\u306E\u500D\u7387;
11842
- 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;
11854
+ 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;
11843
11855
  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;
11844
11856
  const subtitleSize = \u8AAC\u660E?.size ?? 21;
11845
11857
  const \u884C\u9001\u308A = subtitleSize * \u884C\u9001\u308A\u306E\u500D\u7387;
@@ -16136,20 +16148,22 @@ var EYEBROW_TRACKING = 2;
16136
16148
  var SUB_SIZE = 11;
16137
16149
  var SUB_GAP = 4;
16138
16150
  function labelBlock(node, pos, size, band) {
16139
- const \u4E0A = node.eyebrow ? size + EYEBROW_GAP2 + EYEBROW_SIZE2 * ASCENT : size * ASCENT;
16140
- const \u4E0B = node.subtitle ? size + SUB_GAP + SUB_SIZE * DESCENT : size * DESCENT;
16151
+ const \u4E0A = node.eyebrow ? size + EYEBROW_GAP2 + EYEBROW_SIZE2 * ASCENT2 : size * ASCENT2;
16152
+ const \u4E0B = node.subtitle ? size + SUB_GAP + SUB_SIZE * DESCENT2 : size * DESCENT2;
16141
16153
  const \u5E45 = Math.max(
16142
16154
  textWidth(node.title ?? "", size),
16143
16155
  node.eyebrow ? textWidth(node.eyebrow, EYEBROW_SIZE2, EYEBROW_TRACKING) : 0,
16144
16156
  node.subtitle ? textWidth(node.subtitle, SUB_SIZE) : 0
16145
16157
  );
16146
- const { k, x, y: baseline } = fitLabel(band, { \u4E0A, \u4E0B, \u5E45 }, pos);
16158
+ const \u4E0B\u9650 = \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", size, 0, band.w, textWidth);
16159
+ const { k, x, y: baseline } = fitLabel(band, { \u4E0A, \u4E0B, \u5E45 }, pos, \u4E0B\u9650);
16147
16160
  return { k, x, baseline, \u4E0A\u7AEF: baseline - \u4E0A * k, \u4E0B\u7AEF: baseline + \u4E0B * k };
16148
16161
  }
16149
16162
  function commonLabel(node, pos, size, band) {
16150
16163
  const \u584A = labelBlock(node, pos, size, band);
16151
16164
  const k = \u584A.k;
16152
16165
  const x = \u584A.x;
16166
+ 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));
16153
16167
  return /* @__PURE__ */ jsxs(Fragment, { children: [
16154
16168
  node.eyebrow && /* @__PURE__ */ jsx(
16155
16169
  "text",
@@ -16161,7 +16175,7 @@ function commonLabel(node, pos, size, band) {
16161
16175
  letterSpacing: EYEBROW_TRACKING * k,
16162
16176
  textAnchor: "middle",
16163
16177
  fill: "var(--cdl-tone-accent, #2d6a8f)",
16164
- children: node.eyebrow
16178
+ children: \u5207\u308B(node.eyebrow, EYEBROW_SIZE2, EYEBROW_TRACKING)
16165
16179
  }
16166
16180
  ),
16167
16181
  /* @__PURE__ */ jsx(
@@ -16174,7 +16188,7 @@ function commonLabel(node, pos, size, band) {
16174
16188
  fontWeight: 700,
16175
16189
  textAnchor: "middle",
16176
16190
  fill: "var(--cdl-text, #1a1f2a)",
16177
- children: node.title
16191
+ children: \u5207\u308B(node.title ?? "", size)
16178
16192
  }
16179
16193
  ),
16180
16194
  node.subtitle && /* @__PURE__ */ jsx(
@@ -16185,7 +16199,7 @@ function commonLabel(node, pos, size, band) {
16185
16199
  fontSize: SUB_SIZE * k,
16186
16200
  textAnchor: "middle",
16187
16201
  fill: "var(--cdl-text-dim, #5a6270)",
16188
- children: node.subtitle
16202
+ children: \u5207\u308B(node.subtitle, SUB_SIZE)
16189
16203
  }
16190
16204
  )
16191
16205
  ] });
@@ -16520,7 +16534,9 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16520
16534
  node.eyebrow && plan.\u80A9\u66F8 ? textWidth(node.eyebrow, plan.\u80A9\u66F8.size, EYEBROW_TRACKING) : 0,
16521
16535
  node.subtitle && plan.\u8AAC\u660E ? textWidth(node.subtitle, plan.\u8AAC\u660E.size) : 0
16522
16536
  );
16523
- const k = \u5E45 > 0 && \u5E45\u4E0A\u9650 > 0 ? Math.min(1, \u5E45\u4E0A\u9650 / \u5E45) : 1;
16537
+ const \u4E0B\u9650 = \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", plan.\u540D\u524D.size, 0, \u5E45\u4E0A\u9650, textWidth);
16538
+ const k = \u5E45 > 0 && \u5E45\u4E0A\u9650 > 0 ? Math.min(1, Math.max(\u5E45\u4E0A\u9650 / \u5E45, \u4E0B\u9650)) : 1;
16539
+ 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));
16524
16540
  return /* @__PURE__ */ jsxs(Fragment, { children: [
16525
16541
  node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsx(
16526
16542
  "text",
@@ -16532,7 +16548,7 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16532
16548
  letterSpacing: EYEBROW_TRACKING * k,
16533
16549
  textAnchor: "middle",
16534
16550
  fill: "var(--cdl-tone-accent, #2d6a8f)",
16535
- children: node.eyebrow
16551
+ children: \u5207\u308B(node.eyebrow, plan.\u80A9\u66F8.size, EYEBROW_TRACKING)
16536
16552
  }
16537
16553
  ),
16538
16554
  /* @__PURE__ */ jsx(
@@ -16545,7 +16561,7 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16545
16561
  fontWeight: 700,
16546
16562
  textAnchor: "middle",
16547
16563
  fill: "var(--cdl-text, #1a1f2a)",
16548
- children: node.title
16564
+ children: \u5207\u308B(node.title ?? "", plan.\u540D\u524D.size)
16549
16565
  }
16550
16566
  ),
16551
16567
  node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsx(
@@ -16556,7 +16572,7 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16556
16572
  fontSize: plan.\u8AAC\u660E.size * k,
16557
16573
  textAnchor: "middle",
16558
16574
  fill: "var(--cdl-text-dim, #5a6270)",
16559
- children: node.subtitle
16575
+ children: \u5207\u308B(node.subtitle, plan.\u8AAC\u660E.size)
16560
16576
  }
16561
16577
  )
16562
16578
  ] });
@@ -17479,17 +17495,19 @@ var externalLabel = (node, cx, bottomY) => /* @__PURE__ */ jsxs(Fragment, { chil
17479
17495
  var LABEL_EYEBROW_SPACING = 2;
17480
17496
  function \u5E45\u306B\u53CE\u3081\u308B2(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
17481
17497
  const \u5E45 = textWidth(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
17482
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
17483
- return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
17498
+ 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;
17499
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
17500
+ const spacing = \u5B57\u9593 * \u500D\u7387;
17501
+ return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => textWidth(u, f, spacing)) };
17484
17502
  }
17485
17503
  function bottomLabel(node, cx, plan) {
17486
17504
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B2(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING, node.w);
17487
17505
  const \u540D = \u5E45\u306B\u53CE\u3081\u308B2(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
17488
17506
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B2(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
17489
17507
  return /* @__PURE__ */ jsxs(Fragment, { children: [
17490
- 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 }),
17491
- /* @__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 }),
17492
- 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 })
17508
+ 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 }),
17509
+ /* @__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 }),
17510
+ 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 })
17493
17511
  ] });
17494
17512
  }
17495
17513
  var RACK_SLOT_TOP = 20;
@@ -18284,13 +18302,22 @@ function blockchainNodeExtent(strokeWidth) {
18284
18302
  return { \u4E0A: \u7E26, \u4E0B: \u7E26, \u5DE6: \u6A2A, \u53F3: \u6A2A };
18285
18303
  }
18286
18304
  function bottomLabel2(node, cx, plan) {
18287
- const \u80A9\u66F8\u500D\u7387 = node.eyebrow && plan.\u80A9\u66F8 ? \u5E45\u306E\u500D\u7387(node.eyebrow, plan.\u80A9\u66F8.size, 2, node.w) : 1;
18288
- const \u540D\u524D\u500D\u7387 = \u5E45\u306E\u500D\u7387(node.title, plan.\u540D\u524D.size, 0, node.w);
18289
- const \u8AAC\u660E\u500D\u7387 = node.subtitle && plan.\u8AAC\u660E ? \u5E45\u306E\u500D\u7387(node.subtitle, plan.\u8AAC\u660E.size, 0, node.w) : 1;
18305
+ const \u53CE\u3081\u308B = (t, \u5927\u304D\u3055, \u5B57\u9593) => {
18306
+ const \u6E2C\u308B = (u, f, ls) => \u5B57\u306E\u5E45(u, f) + ls * [...u].length;
18307
+ 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));
18308
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
18309
+ 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) };
18310
+ };
18311
+ const \u80A9 = node.eyebrow && plan.\u80A9\u66F8 ? \u53CE\u3081\u308B(node.eyebrow, plan.\u80A9\u66F8.size, 2) : { \u500D\u7387: 1, text: node.eyebrow ?? "" };
18312
+ const \u540D = \u53CE\u3081\u308B(node.title ?? "", plan.\u540D\u524D.size, 0);
18313
+ const \u8AAC = node.subtitle && plan.\u8AAC\u660E ? \u53CE\u3081\u308B(node.subtitle, plan.\u8AAC\u660E.size, 0) : { \u500D\u7387: 1, text: node.subtitle ?? "" };
18314
+ const \u80A9\u66F8\u500D\u7387 = \u80A9.\u500D\u7387;
18315
+ const \u540D\u524D\u500D\u7387 = \u540D.\u500D\u7387;
18316
+ const \u8AAC\u660E\u500D\u7387 = \u8AAC.\u500D\u7387;
18290
18317
  return /* @__PURE__ */ jsxs(Fragment, { children: [
18291
- 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 }),
18292
- /* @__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 }),
18293
- 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 })
18318
+ 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 }),
18319
+ /* @__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 }),
18320
+ 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 })
18294
18321
  ] });
18295
18322
  }
18296
18323
  function EthereumDiamond({ cx, cy, h, colors }) {
@@ -18899,17 +18926,19 @@ function \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
18899
18926
  }
18900
18927
  function \u5E45\u306B\u53CE\u3081\u308B3(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
18901
18928
  const \u5E45 = \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
18902
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
18903
- return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
18929
+ 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;
18930
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
18931
+ const spacing = \u5B57\u9593 * \u500D\u7387;
18932
+ return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E45(u, f, spacing)) };
18904
18933
  }
18905
18934
  function bottomLabel3(node, cx, plan) {
18906
18935
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B3(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING2, node.w);
18907
18936
  const \u540D = \u5E45\u306B\u53CE\u3081\u308B3(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
18908
18937
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B3(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
18909
18938
  return /* @__PURE__ */ jsxs(Fragment, { children: [
18910
- 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 }),
18911
- /* @__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 }),
18912
- 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 })
18939
+ 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 }),
18940
+ /* @__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 }),
18941
+ 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 })
18913
18942
  ] });
18914
18943
  }
18915
18944
  var BANK_PEDIMENT_H = 44;
@@ -19382,17 +19411,19 @@ function \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
19382
19411
  }
19383
19412
  function \u5E45\u306B\u53CE\u3081\u308B4(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
19384
19413
  const \u5E45 = \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
19385
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
19386
- return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
19414
+ 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;
19415
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
19416
+ const spacing = \u5B57\u9593 * \u500D\u7387;
19417
+ return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E452(u, f, spacing)) };
19387
19418
  }
19388
19419
  function bottomLabel4(node, cx, plan) {
19389
19420
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B4(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING3, node.w);
19390
19421
  const \u540D = \u5E45\u306B\u53CE\u3081\u308B4(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
19391
19422
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B4(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
19392
19423
  return /* @__PURE__ */ jsxs(Fragment, { children: [
19393
- 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 }),
19394
- /* @__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 }),
19395
- 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 })
19424
+ 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 }),
19425
+ /* @__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 }),
19426
+ 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 })
19396
19427
  ] });
19397
19428
  }
19398
19429
  var DROP_SHADOW_D = 4;
@@ -29601,6 +29632,11 @@ function CdlDiagramView({ diagram, laid: laidProp, hideHeader = false, hideMiniP
29601
29632
  return mergeStateValues(baseStateValues, interactive.stateOverrides);
29602
29633
  }, [isInteractive, baseStateValues, interactive.stateOverrides]);
29603
29634
  const \u5024\u306E\u540D\u524D = useMemo(() => \u5024\u306E\u540D\u524D\u306E\u8868\u3092\u4F5C\u308B(diagram.inputs), [diagram.inputs]);
29635
+ const \u56F3\u304C\u8A71\u984C\u3092\u63CF\u304F = useMemo(() => {
29636
+ const \u8A71\u984C = laid.topic.trim();
29637
+ if (\u8A71\u984C === "") return false;
29638
+ return laid.nodes.some((n) => drawsFigureTitle(n.kind) && (n.title ?? "").trim() === \u8A71\u984C);
29639
+ }, [laid.nodes, laid.topic]);
29604
29640
  return /* @__PURE__ */ jsxs(
29605
29641
  "div",
29606
29642
  {
@@ -29625,7 +29661,8 @@ function CdlDiagramView({ diagram, laid: laidProp, hideHeader = false, hideMiniP
29625
29661
  timeline.goto(idx);
29626
29662
  timeline.play();
29627
29663
  },
29628
- headingLevel
29664
+ headingLevel,
29665
+ showTopic: !\u56F3\u304C\u8A71\u984C\u3092\u63CF\u304F
29629
29666
  }
29630
29667
  ),
29631
29668
  isInteractive && interactive.panel,