@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.cjs CHANGED
@@ -3194,6 +3194,111 @@ function requiredRowsWidth(rows, kind) {
3194
3194
  if (kind === void 0) return Math.ceil(Math.max(storage, generic));
3195
3195
  return Math.ceil(kind === "storage" ? storage : generic);
3196
3196
  }
3197
+
3198
+ // src/kinds/compact-title.ts
3199
+ function estimateTextWidth(text, fontSize) {
3200
+ let w = 0;
3201
+ for (const ch of text) {
3202
+ const isFullWidth = /[\u3000-\u9FFF\uFF00-\uFFEF]/.test(ch);
3203
+ w += fontSize * (isFullWidth ? 1.05 : 0.62);
3204
+ }
3205
+ return w;
3206
+ }
3207
+ function fitTextSize(text, maxWidth, targetSize, minSize) {
3208
+ let size = targetSize;
3209
+ while (size > minSize && estimateTextWidth(text, size) > maxWidth) {
3210
+ size -= 1;
3211
+ }
3212
+ return size;
3213
+ }
3214
+ var COMPACT_MAX_H = 100;
3215
+ var COMPACT_PADDING_X = 16;
3216
+ var MIN_TEXT_SIZE = 11;
3217
+ var ASCENT = 0.72;
3218
+ var DESCENT = 0.25;
3219
+ var MIN_BAND_H = MIN_TEXT_SIZE * (ASCENT + DESCENT);
3220
+ var EYEBROW_BASELINE = 38;
3221
+ var EYEBROW_SIZE = 18;
3222
+ var EYEBROW_GAP = 8;
3223
+ var BOTTOM_INSET = 4;
3224
+ var eyebrowBottom = () => EYEBROW_BASELINE + EYEBROW_SIZE * DESCENT;
3225
+ var titleBandTop = (hasEyebrow) => eyebrowBottom() + EYEBROW_GAP ;
3226
+ var isCompactBox = (h) => h < COMPACT_MAX_H;
3227
+ function titlePlacement(node, \u901A\u5E38, opts = {}) {
3228
+ if (!isCompactBox(node.h)) {
3229
+ return { x: \u901A\u5E38.x, y: \u901A\u5E38.y, size: \u901A\u5E38.size, anchor: "start" };
3230
+ }
3231
+ const \u9AD8\u3055 = Math.max(0, node.h);
3232
+ const \u76EE\u5370\u3042\u308A = opts.hasEyebrow === true;
3233
+ const \u4E0A = \u76EE\u5370\u3042\u308A && \u9AD8\u3055 >= eyebrowBottom() ? titleBandTop() : 0;
3234
+ const \u751F\u306E\u5E2F = Math.max(0, \u9AD8\u3055 - \u4E0A);
3235
+ const \u4E0B\u4F59\u767D = \u751F\u306E\u5E2F >= MIN_BAND_H + BOTTOM_INSET ? BOTTOM_INSET : 0;
3236
+ const \u5E2F = \u751F\u306E\u5E2F - \u4E0B\u4F59\u767D;
3237
+ const \u5E45\u3067 = fitTextSize(
3238
+ node.title,
3239
+ Math.max(0, node.w - COMPACT_PADDING_X),
3240
+ \u901A\u5E38.size,
3241
+ MIN_TEXT_SIZE
3242
+ );
3243
+ const \u5E2F\u3067 = Math.floor(\u5E2F / (ASCENT + DESCENT));
3244
+ const size = Math.max(MIN_TEXT_SIZE, Math.min(\u5E45\u3067, \u5E2F\u3067));
3245
+ const \u5B57\u9AD8 = size * (ASCENT + DESCENT);
3246
+ const y = \u5B57\u9AD8 <= \u5E2F ? \u4E0A + \u5E2F / 2 + size * (ASCENT - DESCENT) / 2 : \u4E0A > 0 ? \u4E0A + size * ASCENT : (\u9AD8\u3055 - \u5B57\u9AD8) / 2 + size * ASCENT;
3247
+ return { x: node.w / 2, y, size, anchor: "middle" };
3248
+ }
3249
+
3250
+ // src/kinds/box-lines.ts
3251
+ var \u884C\u9001\u308A\u306E\u6BD4 = 1.15;
3252
+ var \u5B57\u306E\u9AD8\u3055\u306E\u6BD4 = 0.72;
3253
+ var \u4E0A\u4E0B\u306E\u4F59\u767D = 2;
3254
+ var \u5DE6\u53F3\u306E\u4F59\u767D = 8;
3255
+ function \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45) {
3256
+ return \u7BB1\u306E\u5E45 - \u5DE6\u53F3\u306E\u4F59\u767D * 2;
3257
+ }
3258
+ function \u5E45\u3067\u5207\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3259
+ if (\u4F7F\u3048\u308B\u5E452 <= 0) return "";
3260
+ if (\u6E2C\u308B(text, fontSize) <= \u4F7F\u3048\u308B\u5E452) return text;
3261
+ const \u7701\u7565 = "\u2026";
3262
+ const \u7701\u7565\u306E\u5E45 = \u6E2C\u308B(\u7701\u7565, fontSize);
3263
+ if (\u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) return "";
3264
+ let \u51FA = "";
3265
+ let \u5E45 = 0;
3266
+ for (const c of \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text)) {
3267
+ const \u5B57\u306E\u5E452 = \u6E2C\u308B(c, fontSize);
3268
+ if (\u5E45 + \u5B57\u306E\u5E452 + \u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) break;
3269
+ \u5E45 += \u5B57\u306E\u5E452;
3270
+ \u51FA += c;
3271
+ }
3272
+ return `${\u51FA}${\u7701\u7565}`;
3273
+ }
3274
+ var \u7E2E\u3081\u306E\u4E0B\u9650 = MIN_TEXT_SIZE;
3275
+ function \u5E45\u306B\u53CE\u3081\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3276
+ let size = fontSize;
3277
+ while (size > \u7E2E\u3081\u306E\u4E0B\u9650 && \u6E2C\u308B(text, size) > \u4F7F\u3048\u308B\u5E452) size -= 1;
3278
+ return { text: \u5E45\u3067\u5207\u308B(text, size, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B), fontSize: size };
3279
+ }
3280
+ function \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text) {
3281
+ const \u533A\u5207\u308A = Intl.Segmenter;
3282
+ if (typeof \u533A\u5207\u308A !== "function") return [...text];
3283
+ return [...new \u533A\u5207\u308A(void 0, { granularity: "grapheme" }).segment(text)].map((g) => g.segment);
3284
+ }
3285
+ function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8\u30553) {
3286
+ const \u5019\u88DC = \u884C.filter((r, i) => i === 0 || r.text.trim() !== "");
3287
+ if (\u5019\u88DC.length === 0) return [];
3288
+ const \u4F7F\u3048\u308B\u9AD8\u3055 = \u7BB1\u306E\u9AD8\u30553 - \u4E0A\u4E0B\u306E\u4F59\u767D * 2;
3289
+ const \u9AD8\u3055 = (rs) => rs.reduce((a, r) => a + r.fontSize * \u884C\u9001\u308A\u306E\u6BD4, 0);
3290
+ const \u6B8B\u3059 = [...\u5019\u88DC];
3291
+ while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
3292
+ const \u5E45 = \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45);
3293
+ const \u53CE\u3081\u305F = \u6B8B\u3059.map((r) => ({ ...r, ...\u5E45\u306B\u53CE\u3081\u308B(r.text, r.fontSize, \u5E45) }));
3294
+ const \u7DCF\u9AD8 = \u9AD8\u3055(\u53CE\u3081\u305F);
3295
+ let \u7A4D\u307F = -\u7DCF\u9AD8 / 2;
3296
+ return \u53CE\u3081\u305F.map((r) => {
3297
+ const dy = \u7A4D\u307F + (\u884C\u9001\u308A\u306E\u6BD4 + \u5B57\u306E\u9AD8\u3055\u306E\u6BD4) / 2 * r.fontSize;
3298
+ \u7A4D\u307F += r.fontSize * \u884C\u9001\u308A\u306E\u6BD4;
3299
+ return { ...r, dy };
3300
+ });
3301
+ }
3197
3302
  function \u66F8\u3044\u305F\u5024\u304B\u63A7\u3048(\u66F8\u3044\u305F, \u63A7\u3048) {
3198
3303
  const v = (\u66F8\u3044\u305F ?? "").trim();
3199
3304
  return v === "" ? \u63A7\u3048 : v;
@@ -3203,14 +3308,22 @@ function \u5E45\u306E\u500D\u7387(text, size, letterSpacing, \u5E45) {
3203
3308
  const \u5B9F\u5E45 = textWidth(text, size, letterSpacing);
3204
3309
  return \u5B9F\u5E45 > \u5E45 ? \u5E45 / \u5B9F\u5E45 : 1;
3205
3310
  }
3311
+ function \u8AAD\u3081\u308B\u4E0B\u9650\u306E\u500D\u7387(\u5927\u304D\u3055) {
3312
+ return \u5927\u304D\u3055 > MIN_TITLE_FONT_SIZE ? MIN_TITLE_FONT_SIZE / \u5927\u304D\u3055 : 0;
3313
+ }
3314
+ function \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(\u984C, \u5927\u304D\u3055, \u5B57\u9593, \u5E45\u4E0A\u9650, \u6E2C\u308B) {
3315
+ const \u4E0B\u9650 = \u8AAD\u3081\u308B\u4E0B\u9650\u306E\u500D\u7387(\u5927\u304D\u3055);
3316
+ if (!(\u4E0B\u9650 > 0) || !(\u5E45\u4E0A\u9650 > 0)) return 0;
3317
+ 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;
3318
+ }
3206
3319
  var TITLE_MAX = 18;
3207
3320
  var TITLE_MIN = 9;
3208
3321
  var TITLE_RATIO = 0.17;
3209
3322
  var SUB_RATIO = 0.72;
3210
3323
  var LINE_GAP = 3;
3211
3324
  var BOTTOM_PAD = 4;
3212
- var ASCENT = 0.72;
3213
- var DESCENT = 0.25;
3325
+ var ASCENT2 = 0.72;
3326
+ var DESCENT2 = 0.25;
3214
3327
  var ART_GAP = 4;
3215
3328
  var ART_MIN_BAND = 45;
3216
3329
  var \u843D\u3068\u3057\u3066\u3082\u63CF\u304F\u7A2E\u5225 = {
@@ -3275,9 +3388,9 @@ function labelPlan(node) {
3275
3388
  y -= \u540D\u524D\u5927 + LINE_GAP;
3276
3389
  const \u80A9\u66F8 = \u80A9\u66F8\u3042\u308A2 ? { y, size: \u5C0F\u3055\u3044\u5B57 } : null;
3277
3390
  const \u4E0A\u306E\u884C = \u80A9\u66F8 ?? \u540D\u524D;
3278
- return { \u540D\u524D, \u8AAC\u660E, \u80A9\u66F8, \u4E0A\u7AEF: \u4E0A\u306E\u884C.y - \u4E0A\u306E\u884C.size * ASCENT };
3391
+ return { \u540D\u524D, \u8AAC\u660E, \u80A9\u66F8, \u4E0A\u7AEF: \u4E0A\u306E\u884C.y - \u4E0A\u306E\u884C.size * ASCENT2 };
3279
3392
  };
3280
- 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;
3393
+ 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;
3281
3394
  let \u8AAC\u660E\u3042\u308A = Boolean(node.subtitle);
3282
3395
  let \u80A9\u66F8\u3042\u308A = Boolean(node.eyebrow);
3283
3396
  const \u843D\u3068\u3057\u305F = [];
@@ -3295,14 +3408,14 @@ function labelPlan(node) {
3295
3408
  for (let size = \u4E0A\u9650; size >= 1; size--) {
3296
3409
  const \u5C0F\u3055\u3044\u5B572 = Math.max(1, Math.round(size * SUB_RATIO));
3297
3410
  const \u4E0B\u306E\u884C\u5927 = \u8AAC\u660E\u3042\u308A2 ? \u5C0F\u3055\u3044\u5B572 : size;
3298
- if (\u7A4D\u3080(size, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, \u4E0B\u306E\u884C\u5927 * DESCENT).\u4E0A\u7AEF >= \u5929) {
3411
+ if (\u7A4D\u3080(size, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, \u4E0B\u306E\u884C\u5927 * DESCENT2).\u4E0A\u7AEF >= \u5929) {
3299
3412
  \u540D\u524D\u5927 = size;
3300
3413
  break;
3301
3414
  }
3302
3415
  }
3303
- if (\u540D\u524D\u5927 === 0) \u540D\u524D\u5927 = \u9AD8\u3055 / (ASCENT + DESCENT);
3416
+ if (\u540D\u524D\u5927 === 0) \u540D\u524D\u5927 = \u9AD8\u3055 / (ASCENT2 + DESCENT2);
3304
3417
  const \u5C0F\u3055\u3044\u5B57 = Math.max(1, Math.round(\u540D\u524D\u5927 * SUB_RATIO));
3305
- const \u5F35\u308A\u51FA\u3057 = (\u8AAC\u660E\u3042\u308A2 ? \u5C0F\u3055\u3044\u5B57 : \u540D\u524D\u5927) * DESCENT;
3418
+ const \u5F35\u308A\u51FA\u3057 = (\u8AAC\u660E\u3042\u308A2 ? \u5C0F\u3055\u3044\u5B57 : \u540D\u524D\u5927) * DESCENT2;
3306
3419
  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);
3307
3420
  const \u4E0B\u4F59\u767D = Math.min(Math.max(BOTTOM_PAD, \u5F35\u308A\u51FA\u3057), \u5F35\u308A\u51FA\u3057 + \u4F59\u308A);
3308
3421
  return \u7A4D\u3080(\u540D\u524D\u5927, \u8AAC\u660E\u3042\u308A2, \u80A9\u66F8\u3042\u308A2, \u4E0B\u4F59\u767D);
@@ -3362,16 +3475,19 @@ function bodyBand(node, opt) {
3362
3475
  const h = Math.max(0, \u7BB1h - \u7E26\u4F59\u767D * ky);
3363
3476
  return { x, y, w, h, cx: x + w / 2, cy: y + h / 2, \u53F3: x + w, \u5E95: y + h };
3364
3477
  }
3365
- function fitLabel(band, block, pos) {
3478
+ function fitLabel(band, block, pos, \u6A2A\u306E\u4E0B\u9650 = 0) {
3366
3479
  const \u7E26 = block.\u4E0A + block.\u4E0B;
3367
3480
  const \u6A2A = Math.max(0, block.\u5E45);
3368
3481
  if (!(\u7E26 > 0)) return { k: 1, x: pos.x, y: pos.y };
3369
3482
  if (!(band.h > 0) || !(band.w > 0)) return { k: 0, x: band.x + band.w / 2, y: band.y };
3370
- const k = Math.min(1, band.h / \u7E26, \u6A2A > 0 ? band.w / \u6A2A : 1);
3483
+ const \u6A2A\u3067 = \u6A2A > 0 ? Math.max(band.w / \u6A2A, \u6A2A\u306E\u4E0B\u9650) : 1;
3484
+ const k = Math.min(1, band.h / \u7E26, \u6A2A\u3067);
3371
3485
  const \u534A = \u6A2A * k / 2;
3372
3486
  return {
3373
3487
  k,
3374
- x: Math.max(band.x + \u534A, Math.min(pos.x, band.x + band.w - \u534A)),
3488
+ // 下限で止めた塊は帯より広い。 その時は帯の中央に置いて左右へ均等に出す =
3489
+ // 寄せの式をそのまま当てると片側だけに出る (`compact-title.ts` と同じ判断)
3490
+ x: \u534A * 2 > band.w ? band.x + band.w / 2 : Math.max(band.x + \u534A, Math.min(pos.x, band.x + band.w - \u534A)),
3375
3491
  y: Math.max(band.y + block.\u4E0A * k, Math.min(pos.y, band.y + band.h - block.\u4E0B * k))
3376
3492
  };
3377
3493
  }
@@ -3424,111 +3540,6 @@ function \u6253\u3061\u6D88\u3057\u306E\u500D\u7387(\u500D\u7387, \u5B57\u3089)
3424
3540
  return Math.max(1, Math.min(\u623B\u3057, \u4E0A\u9650));
3425
3541
  }
3426
3542
 
3427
- // src/kinds/compact-title.ts
3428
- function estimateTextWidth(text, fontSize) {
3429
- let w = 0;
3430
- for (const ch of text) {
3431
- const isFullWidth = /[\u3000-\u9FFF\uFF00-\uFFEF]/.test(ch);
3432
- w += fontSize * (isFullWidth ? 1.05 : 0.62);
3433
- }
3434
- return w;
3435
- }
3436
- function fitTextSize(text, maxWidth, targetSize, minSize) {
3437
- let size = targetSize;
3438
- while (size > minSize && estimateTextWidth(text, size) > maxWidth) {
3439
- size -= 1;
3440
- }
3441
- return size;
3442
- }
3443
- var COMPACT_MAX_H = 100;
3444
- var COMPACT_PADDING_X = 16;
3445
- var MIN_TEXT_SIZE = 11;
3446
- var ASCENT2 = 0.72;
3447
- var DESCENT2 = 0.25;
3448
- var MIN_BAND_H = MIN_TEXT_SIZE * (ASCENT2 + DESCENT2);
3449
- var EYEBROW_BASELINE = 38;
3450
- var EYEBROW_SIZE = 18;
3451
- var EYEBROW_GAP = 8;
3452
- var BOTTOM_INSET = 4;
3453
- var eyebrowBottom = () => EYEBROW_BASELINE + EYEBROW_SIZE * DESCENT2;
3454
- var titleBandTop = (hasEyebrow) => eyebrowBottom() + EYEBROW_GAP ;
3455
- var isCompactBox = (h) => h < COMPACT_MAX_H;
3456
- function titlePlacement(node, \u901A\u5E38, opts = {}) {
3457
- if (!isCompactBox(node.h)) {
3458
- return { x: \u901A\u5E38.x, y: \u901A\u5E38.y, size: \u901A\u5E38.size, anchor: "start" };
3459
- }
3460
- const \u9AD8\u3055 = Math.max(0, node.h);
3461
- const \u76EE\u5370\u3042\u308A = opts.hasEyebrow === true;
3462
- const \u4E0A = \u76EE\u5370\u3042\u308A && \u9AD8\u3055 >= eyebrowBottom() ? titleBandTop() : 0;
3463
- const \u751F\u306E\u5E2F = Math.max(0, \u9AD8\u3055 - \u4E0A);
3464
- const \u4E0B\u4F59\u767D = \u751F\u306E\u5E2F >= MIN_BAND_H + BOTTOM_INSET ? BOTTOM_INSET : 0;
3465
- const \u5E2F = \u751F\u306E\u5E2F - \u4E0B\u4F59\u767D;
3466
- const \u5E45\u3067 = fitTextSize(
3467
- node.title,
3468
- Math.max(0, node.w - COMPACT_PADDING_X),
3469
- \u901A\u5E38.size,
3470
- MIN_TEXT_SIZE
3471
- );
3472
- const \u5E2F\u3067 = Math.floor(\u5E2F / (ASCENT2 + DESCENT2));
3473
- const size = Math.max(MIN_TEXT_SIZE, Math.min(\u5E45\u3067, \u5E2F\u3067));
3474
- const \u5B57\u9AD8 = size * (ASCENT2 + DESCENT2);
3475
- const y = \u5B57\u9AD8 <= \u5E2F ? \u4E0A + \u5E2F / 2 + size * (ASCENT2 - DESCENT2) / 2 : \u4E0A > 0 ? \u4E0A + size * ASCENT2 : (\u9AD8\u3055 - \u5B57\u9AD8) / 2 + size * ASCENT2;
3476
- return { x: node.w / 2, y, size, anchor: "middle" };
3477
- }
3478
-
3479
- // src/kinds/box-lines.ts
3480
- var \u884C\u9001\u308A\u306E\u6BD4 = 1.15;
3481
- var \u5B57\u306E\u9AD8\u3055\u306E\u6BD4 = 0.72;
3482
- var \u4E0A\u4E0B\u306E\u4F59\u767D = 2;
3483
- var \u5DE6\u53F3\u306E\u4F59\u767D = 8;
3484
- function \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45) {
3485
- return \u7BB1\u306E\u5E45 - \u5DE6\u53F3\u306E\u4F59\u767D * 2;
3486
- }
3487
- function \u5E45\u3067\u5207\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3488
- if (\u4F7F\u3048\u308B\u5E452 <= 0) return "";
3489
- if (\u6E2C\u308B(text, fontSize) <= \u4F7F\u3048\u308B\u5E452) return text;
3490
- const \u7701\u7565 = "\u2026";
3491
- const \u7701\u7565\u306E\u5E45 = \u6E2C\u308B(\u7701\u7565, fontSize);
3492
- if (\u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) return "";
3493
- let \u51FA = "";
3494
- let \u5E45 = 0;
3495
- for (const c of \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text)) {
3496
- const \u5B57\u306E\u5E452 = \u6E2C\u308B(c, fontSize);
3497
- if (\u5E45 + \u5B57\u306E\u5E452 + \u7701\u7565\u306E\u5E45 > \u4F7F\u3048\u308B\u5E452) break;
3498
- \u5E45 += \u5B57\u306E\u5E452;
3499
- \u51FA += c;
3500
- }
3501
- return `${\u51FA}${\u7701\u7565}`;
3502
- }
3503
- var \u7E2E\u3081\u306E\u4E0B\u9650 = MIN_TEXT_SIZE;
3504
- function \u5E45\u306B\u53CE\u3081\u308B(text, fontSize, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B = textWidth) {
3505
- let size = fontSize;
3506
- while (size > \u7E2E\u3081\u306E\u4E0B\u9650 && \u6E2C\u308B(text, size) > \u4F7F\u3048\u308B\u5E452) size -= 1;
3507
- return { text: \u5E45\u3067\u5207\u308B(text, size, \u4F7F\u3048\u308B\u5E452, \u6E2C\u308B), fontSize: size };
3508
- }
3509
- function \u66F8\u8A18\u7D20\u306B\u5206\u3051\u308B(text) {
3510
- const \u533A\u5207\u308A = Intl.Segmenter;
3511
- if (typeof \u533A\u5207\u308A !== "function") return [...text];
3512
- return [...new \u533A\u5207\u308A(void 0, { granularity: "grapheme" }).segment(text)].map((g) => g.segment);
3513
- }
3514
- function \u7BB1\u306B\u7A4D\u3080(\u884C, \u7BB1\u306E\u5E45, \u7BB1\u306E\u9AD8\u30553) {
3515
- const \u5019\u88DC = \u884C.filter((r, i) => i === 0 || r.text.trim() !== "");
3516
- if (\u5019\u88DC.length === 0) return [];
3517
- const \u4F7F\u3048\u308B\u9AD8\u3055 = \u7BB1\u306E\u9AD8\u30553 - \u4E0A\u4E0B\u306E\u4F59\u767D * 2;
3518
- const \u9AD8\u3055 = (rs) => rs.reduce((a, r) => a + r.fontSize * \u884C\u9001\u308A\u306E\u6BD4, 0);
3519
- const \u6B8B\u3059 = [...\u5019\u88DC];
3520
- while (\u6B8B\u3059.length > 1 && \u9AD8\u3055(\u6B8B\u3059) > \u4F7F\u3048\u308B\u9AD8\u3055) \u6B8B\u3059.pop();
3521
- const \u5E45 = \u4F7F\u3048\u308B\u5E45(\u7BB1\u306E\u5E45);
3522
- const \u53CE\u3081\u305F = \u6B8B\u3059.map((r) => ({ ...r, ...\u5E45\u306B\u53CE\u3081\u308B(r.text, r.fontSize, \u5E45) }));
3523
- const \u7DCF\u9AD8 = \u9AD8\u3055(\u53CE\u3081\u305F);
3524
- let \u7A4D\u307F = -\u7DCF\u9AD8 / 2;
3525
- return \u53CE\u3081\u305F.map((r) => {
3526
- const dy = \u7A4D\u307F + (\u884C\u9001\u308A\u306E\u6BD4 + \u5B57\u306E\u9AD8\u3055\u306E\u6BD4) / 2 * r.fontSize;
3527
- \u7A4D\u307F += r.fontSize * \u884C\u9001\u308A\u306E\u6BD4;
3528
- return { ...r, dy };
3529
- });
3530
- }
3531
-
3532
3543
  // src/render/tone.ts
3533
3544
  var TONE = {
3534
3545
  accent: "var(--cdl-tone-accent, #2d6a8f)",
@@ -10904,12 +10915,13 @@ function CdlHeader({
10904
10915
  stateValues,
10905
10916
  states,
10906
10917
  onJumpPhase,
10907
- headingLevel = 3
10918
+ headingLevel = 3,
10919
+ showTopic = true
10908
10920
  }) {
10909
10921
  const HeadingTag = `h${headingLevel}`;
10910
10922
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-b border-[var(--cdl-divider,#d4d4d8)]/35 px-7 py-6", children: [
10911
10923
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-5 flex items-center gap-3", children: [
10912
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[10px] font-bold uppercase tracking-[0.2em]", style: { color: "var(--cdl-text-accent, #2d6a8f)" }, children: topic }),
10924
+ showTopic && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[10px] font-bold uppercase tracking-[0.2em]", style: { color: "var(--cdl-text-accent, #2d6a8f)" }, children: topic }),
10913
10925
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [
10914
10926
  phases.map((p, idx) => {
10915
10927
  const active = idx === phaseIdx;
@@ -11841,7 +11853,7 @@ function CardNode({ node, active }) {
11841
11853
  const textAnchor = compact ? "middle" : "start";
11842
11854
  const subtitleY = 124 - \u305A\u3089\u3057;
11843
11855
  const \u6700\u5927\u306E\u884C\u9001\u308A = SUBTITLE_SIZE * \u884C\u9001\u308A\u306E\u500D\u7387;
11844
- 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;
11856
+ 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;
11845
11857
  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;
11846
11858
  const subtitleSize = \u8AAC\u660E?.size ?? 21;
11847
11859
  const \u884C\u9001\u308A = subtitleSize * \u884C\u9001\u308A\u306E\u500D\u7387;
@@ -16138,20 +16150,22 @@ var EYEBROW_TRACKING = 2;
16138
16150
  var SUB_SIZE = 11;
16139
16151
  var SUB_GAP = 4;
16140
16152
  function labelBlock(node, pos, size, band) {
16141
- const \u4E0A = node.eyebrow ? size + EYEBROW_GAP2 + EYEBROW_SIZE2 * ASCENT : size * ASCENT;
16142
- const \u4E0B = node.subtitle ? size + SUB_GAP + SUB_SIZE * DESCENT : size * DESCENT;
16153
+ const \u4E0A = node.eyebrow ? size + EYEBROW_GAP2 + EYEBROW_SIZE2 * ASCENT2 : size * ASCENT2;
16154
+ const \u4E0B = node.subtitle ? size + SUB_GAP + SUB_SIZE * DESCENT2 : size * DESCENT2;
16143
16155
  const \u5E45 = Math.max(
16144
16156
  textWidth(node.title ?? "", size),
16145
16157
  node.eyebrow ? textWidth(node.eyebrow, EYEBROW_SIZE2, EYEBROW_TRACKING) : 0,
16146
16158
  node.subtitle ? textWidth(node.subtitle, SUB_SIZE) : 0
16147
16159
  );
16148
- const { k, x, y: baseline } = fitLabel(band, { \u4E0A, \u4E0B, \u5E45 }, pos);
16160
+ const \u4E0B\u9650 = \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", size, 0, band.w, textWidth);
16161
+ const { k, x, y: baseline } = fitLabel(band, { \u4E0A, \u4E0B, \u5E45 }, pos, \u4E0B\u9650);
16149
16162
  return { k, x, baseline, \u4E0A\u7AEF: baseline - \u4E0A * k, \u4E0B\u7AEF: baseline + \u4E0B * k };
16150
16163
  }
16151
16164
  function commonLabel(node, pos, size, band) {
16152
16165
  const \u584A = labelBlock(node, pos, size, band);
16153
16166
  const k = \u584A.k;
16154
16167
  const x = \u584A.x;
16168
+ 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));
16155
16169
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
16156
16170
  node.eyebrow && /* @__PURE__ */ jsxRuntime.jsx(
16157
16171
  "text",
@@ -16163,7 +16177,7 @@ function commonLabel(node, pos, size, band) {
16163
16177
  letterSpacing: EYEBROW_TRACKING * k,
16164
16178
  textAnchor: "middle",
16165
16179
  fill: "var(--cdl-tone-accent, #2d6a8f)",
16166
- children: node.eyebrow
16180
+ children: \u5207\u308B(node.eyebrow, EYEBROW_SIZE2, EYEBROW_TRACKING)
16167
16181
  }
16168
16182
  ),
16169
16183
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -16176,7 +16190,7 @@ function commonLabel(node, pos, size, band) {
16176
16190
  fontWeight: 700,
16177
16191
  textAnchor: "middle",
16178
16192
  fill: "var(--cdl-text, #1a1f2a)",
16179
- children: node.title
16193
+ children: \u5207\u308B(node.title ?? "", size)
16180
16194
  }
16181
16195
  ),
16182
16196
  node.subtitle && /* @__PURE__ */ jsxRuntime.jsx(
@@ -16187,7 +16201,7 @@ function commonLabel(node, pos, size, band) {
16187
16201
  fontSize: SUB_SIZE * k,
16188
16202
  textAnchor: "middle",
16189
16203
  fill: "var(--cdl-text-dim, #5a6270)",
16190
- children: node.subtitle
16204
+ children: \u5207\u308B(node.subtitle, SUB_SIZE)
16191
16205
  }
16192
16206
  )
16193
16207
  ] });
@@ -16522,7 +16536,9 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16522
16536
  node.eyebrow && plan.\u80A9\u66F8 ? textWidth(node.eyebrow, plan.\u80A9\u66F8.size, EYEBROW_TRACKING) : 0,
16523
16537
  node.subtitle && plan.\u8AAC\u660E ? textWidth(node.subtitle, plan.\u8AAC\u660E.size) : 0
16524
16538
  );
16525
- const k = \u5E45 > 0 && \u5E45\u4E0A\u9650 > 0 ? Math.min(1, \u5E45\u4E0A\u9650 / \u5E45) : 1;
16539
+ const \u4E0B\u9650 = \u5207\u3063\u3066\u53CE\u307E\u308B\u4E0B\u9650(node.title ?? "", plan.\u540D\u524D.size, 0, \u5E45\u4E0A\u9650, textWidth);
16540
+ const k = \u5E45 > 0 && \u5E45\u4E0A\u9650 > 0 ? Math.min(1, Math.max(\u5E45\u4E0A\u9650 / \u5E45, \u4E0B\u9650)) : 1;
16541
+ 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));
16526
16542
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
16527
16543
  node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.jsx(
16528
16544
  "text",
@@ -16534,7 +16550,7 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16534
16550
  letterSpacing: EYEBROW_TRACKING * k,
16535
16551
  textAnchor: "middle",
16536
16552
  fill: "var(--cdl-tone-accent, #2d6a8f)",
16537
- children: node.eyebrow
16553
+ children: \u5207\u308B(node.eyebrow, plan.\u80A9\u66F8.size, EYEBROW_TRACKING)
16538
16554
  }
16539
16555
  ),
16540
16556
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -16547,7 +16563,7 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16547
16563
  fontWeight: 700,
16548
16564
  textAnchor: "middle",
16549
16565
  fill: "var(--cdl-text, #1a1f2a)",
16550
- children: node.title
16566
+ children: \u5207\u308B(node.title ?? "", plan.\u540D\u524D.size)
16551
16567
  }
16552
16568
  ),
16553
16569
  node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsxRuntime.jsx(
@@ -16558,7 +16574,7 @@ function planLabel(node, cx, \u5E45\u4E0A\u9650, plan) {
16558
16574
  fontSize: plan.\u8AAC\u660E.size * k,
16559
16575
  textAnchor: "middle",
16560
16576
  fill: "var(--cdl-text-dim, #5a6270)",
16561
- children: node.subtitle
16577
+ children: \u5207\u308B(node.subtitle, plan.\u8AAC\u660E.size)
16562
16578
  }
16563
16579
  )
16564
16580
  ] });
@@ -17481,17 +17497,19 @@ var externalLabel = (node, cx, bottomY) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRu
17481
17497
  var LABEL_EYEBROW_SPACING = 2;
17482
17498
  function \u5E45\u306B\u53CE\u3081\u308B2(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
17483
17499
  const \u5E45 = textWidth(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
17484
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
17485
- return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
17500
+ 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;
17501
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
17502
+ const spacing = \u5B57\u9593 * \u500D\u7387;
17503
+ return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => textWidth(u, f, spacing)) };
17486
17504
  }
17487
17505
  function bottomLabel(node, cx, plan) {
17488
17506
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B2(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING, node.w);
17489
17507
  const \u540D = \u5E45\u306B\u53CE\u3081\u308B2(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
17490
17508
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B2(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
17491
17509
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17492
- 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 }),
17493
- /* @__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 }),
17494
- node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
17510
+ node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u80A9\u66F8.y, fontSize: \u80A9.size, fontWeight: 700, letterSpacing: \u80A9.spacing, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", children: \u80A9.text }),
17511
+ /* @__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: \u540D.text }),
17512
+ node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: \u8AAC.text })
17495
17513
  ] });
17496
17514
  }
17497
17515
  var RACK_SLOT_TOP = 20;
@@ -18286,13 +18304,22 @@ function blockchainNodeExtent(strokeWidth) {
18286
18304
  return { \u4E0A: \u7E26, \u4E0B: \u7E26, \u5DE6: \u6A2A, \u53F3: \u6A2A };
18287
18305
  }
18288
18306
  function bottomLabel2(node, cx, plan) {
18289
- const \u80A9\u66F8\u500D\u7387 = node.eyebrow && plan.\u80A9\u66F8 ? \u5E45\u306E\u500D\u7387(node.eyebrow, plan.\u80A9\u66F8.size, 2, node.w) : 1;
18290
- const \u540D\u524D\u500D\u7387 = \u5E45\u306E\u500D\u7387(node.title, plan.\u540D\u524D.size, 0, node.w);
18291
- const \u8AAC\u660E\u500D\u7387 = node.subtitle && plan.\u8AAC\u660E ? \u5E45\u306E\u500D\u7387(node.subtitle, plan.\u8AAC\u660E.size, 0, node.w) : 1;
18307
+ const \u53CE\u3081\u308B = (t, \u5927\u304D\u3055, \u5B57\u9593) => {
18308
+ const \u6E2C\u308B = (u, f, ls) => \u5B57\u306E\u5E45(u, f) + ls * [...u].length;
18309
+ 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));
18310
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
18311
+ 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) };
18312
+ };
18313
+ const \u80A9 = node.eyebrow && plan.\u80A9\u66F8 ? \u53CE\u3081\u308B(node.eyebrow, plan.\u80A9\u66F8.size, 2) : { \u500D\u7387: 1, text: node.eyebrow ?? "" };
18314
+ const \u540D = \u53CE\u3081\u308B(node.title ?? "", plan.\u540D\u524D.size, 0);
18315
+ const \u8AAC = node.subtitle && plan.\u8AAC\u660E ? \u53CE\u3081\u308B(node.subtitle, plan.\u8AAC\u660E.size, 0) : { \u500D\u7387: 1, text: node.subtitle ?? "" };
18316
+ const \u80A9\u66F8\u500D\u7387 = \u80A9.\u500D\u7387;
18317
+ const \u540D\u524D\u500D\u7387 = \u540D.\u500D\u7387;
18318
+ const \u8AAC\u660E\u500D\u7387 = \u8AAC.\u500D\u7387;
18292
18319
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18293
- node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.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 }),
18294
- /* @__PURE__ */ jsxRuntime.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 }),
18295
- node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsxRuntime.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 })
18320
+ node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.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 }),
18321
+ /* @__PURE__ */ jsxRuntime.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 }),
18322
+ node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsxRuntime.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 })
18296
18323
  ] });
18297
18324
  }
18298
18325
  function EthereumDiamond({ cx, cy, h, colors }) {
@@ -18901,17 +18928,19 @@ function \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
18901
18928
  }
18902
18929
  function \u5E45\u306B\u53CE\u3081\u308B3(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
18903
18930
  const \u5E45 = \u5B57\u5E45(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
18904
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
18905
- return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
18931
+ 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;
18932
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
18933
+ const spacing = \u5B57\u9593 * \u500D\u7387;
18934
+ return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E45(u, f, spacing)) };
18906
18935
  }
18907
18936
  function bottomLabel3(node, cx, plan) {
18908
18937
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B3(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING2, node.w);
18909
18938
  const \u540D = \u5E45\u306B\u53CE\u3081\u308B3(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
18910
18939
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B3(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
18911
18940
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
18912
- 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 }),
18913
- /* @__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 }),
18914
- node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
18941
+ node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u80A9\u66F8.y, fontSize: \u80A9.size, fontWeight: 700, letterSpacing: \u80A9.spacing, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", children: \u80A9.text }),
18942
+ /* @__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: \u540D.text }),
18943
+ node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: \u8AAC.text })
18915
18944
  ] });
18916
18945
  }
18917
18946
  var BANK_PEDIMENT_H = 44;
@@ -19384,17 +19413,19 @@ function \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593) {
19384
19413
  }
19385
19414
  function \u5E45\u306B\u53CE\u3081\u308B4(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593, \u7BB1\u5E45) {
19386
19415
  const \u5E45 = \u5B57\u5E452(\u6587\u5B57\u5217, \u5927\u304D\u3055, \u5B57\u9593);
19387
- const \u500D\u7387 = \u5E45 > 0 && \u7BB1\u5E45 > 0 ? Math.min(1, \u7BB1\u5E45 / \u5E45) : 1;
19388
- return { size: \u5927\u304D\u3055 * \u500D\u7387, spacing: \u5B57\u9593 * \u500D\u7387 };
19416
+ 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;
19417
+ const size = \u5927\u304D\u3055 * \u500D\u7387;
19418
+ const spacing = \u5B57\u9593 * \u500D\u7387;
19419
+ return { size, spacing, text: \u5E45\u3067\u5207\u308B(\u6587\u5B57\u5217, size, \u7BB1\u5E45, (u, f) => \u5B57\u5E452(u, f, spacing)) };
19389
19420
  }
19390
19421
  function bottomLabel4(node, cx, plan) {
19391
19422
  const \u80A9 = \u5E45\u306B\u53CE\u3081\u308B4(node.eyebrow ?? "", plan.\u80A9\u66F8?.size ?? 0, LABEL_EYEBROW_SPACING3, node.w);
19392
19423
  const \u540D = \u5E45\u306B\u53CE\u3081\u308B4(node.title ?? "", plan.\u540D\u524D.size, 0, node.w);
19393
19424
  const \u8AAC = \u5E45\u306B\u53CE\u3081\u308B4(node.subtitle ?? "", plan.\u8AAC\u660E?.size ?? 0, 0, node.w);
19394
19425
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19395
- 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 }),
19396
- /* @__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 }),
19397
- node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: node.subtitle })
19426
+ node.eyebrow && plan.\u80A9\u66F8 && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u80A9\u66F8.y, fontSize: \u80A9.size, fontWeight: 700, letterSpacing: \u80A9.spacing, textAnchor: "middle", fill: "var(--cdl-tone-accent, #2d6a8f)", children: \u80A9.text }),
19427
+ /* @__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: \u540D.text }),
19428
+ node.subtitle && plan.\u8AAC\u660E && /* @__PURE__ */ jsxRuntime.jsx("text", { x: cx, y: plan.\u8AAC\u660E.y, fontSize: \u8AAC.size, textAnchor: "middle", fill: "var(--cdl-text-dim, #5a6270)", children: \u8AAC.text })
19398
19429
  ] });
19399
19430
  }
19400
19431
  var DROP_SHADOW_D = 4;
@@ -29603,6 +29634,11 @@ function CdlDiagramView({ diagram, laid: laidProp, hideHeader = false, hideMiniP
29603
29634
  return mergeStateValues(baseStateValues, interactive.stateOverrides);
29604
29635
  }, [isInteractive, baseStateValues, interactive.stateOverrides]);
29605
29636
  const \u5024\u306E\u540D\u524D = react.useMemo(() => \u5024\u306E\u540D\u524D\u306E\u8868\u3092\u4F5C\u308B(diagram.inputs), [diagram.inputs]);
29637
+ const \u56F3\u304C\u8A71\u984C\u3092\u63CF\u304F = react.useMemo(() => {
29638
+ const \u8A71\u984C = laid.topic.trim();
29639
+ if (\u8A71\u984C === "") return false;
29640
+ return laid.nodes.some((n) => drawsFigureTitle(n.kind) && (n.title ?? "").trim() === \u8A71\u984C);
29641
+ }, [laid.nodes, laid.topic]);
29606
29642
  return /* @__PURE__ */ jsxRuntime.jsxs(
29607
29643
  "div",
29608
29644
  {
@@ -29627,7 +29663,8 @@ function CdlDiagramView({ diagram, laid: laidProp, hideHeader = false, hideMiniP
29627
29663
  timeline.goto(idx);
29628
29664
  timeline.play();
29629
29665
  },
29630
- headingLevel
29666
+ headingLevel,
29667
+ showTopic: !\u56F3\u304C\u8A71\u984C\u3092\u63CF\u304F
29631
29668
  }
29632
29669
  ),
29633
29670
  isInteractive && interactive.panel,