@cardenelabs/cdl 0.58.0 → 0.59.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/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { useMemo, useEffect, useState, useSyncExternalStore, useRef, useCallback, useLayoutEffect, useId, createElement } from 'react';
1
+ import { createContext, useMemo, useEffect, useState, useSyncExternalStore, useRef, useCallback, useLayoutEffect, useId, createElement, useContext } from 'react';
2
2
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
3
 
4
4
  // src/reactive/internal.ts
@@ -423,7 +423,147 @@ var en = {
423
423
  /** `shape-api-gateway` の 2 行目の宛先 */
424
424
  "apiGateway.orders": "/orders",
425
425
  /** `shape-api-gateway` の 3 行目の宛先 */
426
- "apiGateway.session": "/session"
426
+ "apiGateway.session": "/session",
427
+ // 読み出し (`readout.*`) と入力欄の固定の字 (#849)。
428
+ // `{名前}` は描く時に値を差し込む位置 (`字を差し込む`)。 語順が言語で変わるので、位置ごと辞書に持つ
429
+ /** 配列を描く読み出しで、値が空の時の字 */
430
+ "readout.empty": "empty",
431
+ /** `sparkline` で点がまだ無い時の字 */
432
+ "readout.sparkline.waiting": "waiting",
433
+ /** 時の流れの入力欄の速さ */
434
+ "input.timeline.speed": "{speed}x",
435
+ /** 時の流れの入力欄の経過と長さ (秒) */
436
+ "input.timeline.time": "{t}s / {d}s",
437
+ /** `sequence-timeline` の点の見出し */
438
+ "readout.sequenceTimeline.title": "{name}: t={t}",
439
+ /** `bubble-chart` の泡の見出し */
440
+ "readout.bubbleChart.title": "({x}, {y}) r={r}",
441
+ /** `calendar-heatmap` の升目の見出し (`i` は 0 から) */
442
+ "readout.calendarHeatmap.title": "day {i}: {v}",
443
+ /** `candlestick` の足の見出し (始値 / 高値 / 安値 / 終値) */
444
+ "readout.candlestick.title": "O:{o} H:{h} L:{l} C:{c}",
445
+ /** `slope` の左の目盛 */
446
+ "readout.slope.before": "before",
447
+ /** `slope` の右の目盛 */
448
+ "readout.slope.after": "after",
449
+ /** `bullet-chart` の実績の見出し */
450
+ "readout.bulletChart.actual": "actual: {v}",
451
+ /** `bullet-chart` の目標の見出し */
452
+ "readout.bulletChart.target": "target: {v}",
453
+ /** `rating` の塗った星の見出し */
454
+ "readout.rating.full": "full",
455
+ /** `rating` の半分塗った星の見出し */
456
+ "readout.rating.half": "half",
457
+ /** `rating` の塗っていない星の見出し */
458
+ "readout.rating.empty": "empty",
459
+ /** `price-tag` の割引額 */
460
+ "readout.priceTag.save": "You save {amount}",
461
+ /** `confidence-meter` の低い帯の名前 */
462
+ "readout.confidence.low": "low",
463
+ /** `confidence-meter` の中ほどの帯の名前 */
464
+ "readout.confidence.mid": "mid",
465
+ /** `confidence-meter` の高い帯の名前 */
466
+ "readout.confidence.high": "high",
467
+ /** 並べきれなかった件数 (`user-stack` / `kanban-board` / `user-presence`) */
468
+ "readout.more": "+{n} more",
469
+ /** `video-card` の再生数 */
470
+ "readout.videoCard.views": "{v} views",
471
+ /** `attendance-grid` の角の見出し */
472
+ "readout.attendance.corner": "day",
473
+ /** `calendar-month` の曜日 (日曜) */
474
+ "readout.weekday.0": "Sun",
475
+ /** `calendar-month` の曜日 (月曜) */
476
+ "readout.weekday.1": "Mon",
477
+ /** `calendar-month` の曜日 (火曜) */
478
+ "readout.weekday.2": "Tue",
479
+ /** `calendar-month` の曜日 (水曜) */
480
+ "readout.weekday.3": "Wed",
481
+ /** `calendar-month` の曜日 (木曜) */
482
+ "readout.weekday.4": "Thu",
483
+ /** `calendar-month` の曜日 (金曜) */
484
+ "readout.weekday.5": "Fri",
485
+ /** `calendar-month` の曜日 (土曜) */
486
+ "readout.weekday.6": "Sat",
487
+ /** `rating-thumb` の賛成の割合と票数 */
488
+ "readout.ratingThumb.summary": "{pct}% up \xB7 {total} votes",
489
+ /** `kpi-trend-tile` の前の期間の値 */
490
+ "readout.kpiTrend.prev": "prev {v}",
491
+ /** `quick-poll-emoji` の票の合計 */
492
+ "readout.poll.total": "total {n}",
493
+ /** `thread-summary` の参加者の数 */
494
+ "readout.thread.participants": "{n} participants",
495
+ /** `thread-summary` の最後に書いた人 */
496
+ "readout.thread.last": "last: {name}",
497
+ /** `read-receipt` の送信した段 */
498
+ "readout.readReceipt.sent": "sent",
499
+ /** `read-receipt` の相手に届いた段 */
500
+ "readout.readReceipt.delivered": "delivered",
501
+ /** `read-receipt` の読まれた段 */
502
+ "readout.readReceipt.read": "read",
503
+ /** `password-strength` の段階 0 */
504
+ "readout.password.0": "too weak",
505
+ /** `password-strength` の段階 1 */
506
+ "readout.password.1": "weak",
507
+ /** `password-strength` の段階 2 */
508
+ "readout.password.2": "fair",
509
+ /** `password-strength` の段階 3 */
510
+ "readout.password.3": "good",
511
+ /** `password-strength` の段階 4 */
512
+ "readout.password.4": "strong",
513
+ /** `file-dropzone` で取り込んだ後の字 */
514
+ "readout.dropzone.uploaded": "uploaded",
515
+ /** `file-dropzone` の空の時の 1 行目 */
516
+ "readout.dropzone.drop": "\u2B06 Drop file here",
517
+ /** `file-dropzone` の空の時の 2 行目 */
518
+ "readout.dropzone.browse": "or click to browse",
519
+ /** `log-stream` の重さ 0 (調べるための詳細) */
520
+ "readout.log.0": "DBG",
521
+ /** `log-stream` の重さ 1 (知らせ) */
522
+ "readout.log.1": "INF",
523
+ /** `log-stream` の重さ 2 (警告) */
524
+ "readout.log.2": "WRN",
525
+ /** `log-stream` の重さ 3 (異常) */
526
+ "readout.log.3": "ERR",
527
+ /** `cart-summary` の点数 */
528
+ "readout.cart.items": "Items",
529
+ /** `cart-summary` の小計 */
530
+ "readout.cart.subtotal": "Subtotal",
531
+ /** `cart-summary` の送料 */
532
+ "readout.cart.shipping": "Shipping",
533
+ /** `cart-summary` の合計 */
534
+ "readout.cart.total": "Total",
535
+ /** `pricing-tier` で名前が空の時の名前 */
536
+ "readout.pricing.plan": "Plan",
537
+ /** `pricing-tier` の価格の後ろ */
538
+ "readout.pricing.perMonth": "per month",
539
+ /** `pricing-tier` の押す札 */
540
+ "readout.pricing.get": "Get {name}",
541
+ /** `coupon-code` で番号が空の時の字 */
542
+ "readout.coupon.placeholder": "ENTER CODE",
543
+ /** `coupon-code` の割引の割合 */
544
+ "readout.coupon.off": "-{pct}% off",
545
+ /** `coupon-code` の押す札 */
546
+ "readout.coupon.apply": "Apply",
547
+ /** `article-preview` の書いた人 */
548
+ "readout.article.by": "by {author}",
549
+ /** `priority-badge` の高い優先度の表示 (値は `high` / `2` で読む) */
550
+ "readout.priority.high": "HIGH",
551
+ /** `priority-badge` の中ほどの優先度の表示 */
552
+ "readout.priority.med": "MED",
553
+ /** `priority-badge` の低い優先度の表示 (値は `low` / `0` で読む) */
554
+ "readout.priority.low": "LOW",
555
+ /** `kanban-board` の列の見出し (値は `todo` で読む) */
556
+ "readout.kanban.todo": "Todo",
557
+ /** `kanban-board` の列の見出し (値は `inprogress` で読む) */
558
+ "readout.kanban.inprogress": "In Progress",
559
+ /** `kanban-board` の列の見出し (値は `done` で読む) */
560
+ "readout.kanban.done": "Done",
561
+ /** `traffic-light` の赤の灯の見出し (値は `red` で読む) */
562
+ "readout.trafficLight.red": "red",
563
+ /** `traffic-light` の黄の灯の見出し (値は `yellow` / `amber` で読む) */
564
+ "readout.trafficLight.yellow": "yellow",
565
+ /** `traffic-light` の緑の灯の見出し (値は `green` で読む) */
566
+ "readout.trafficLight.green": "green"
427
567
  };
428
568
  var ja = {
429
569
  "terminal.output": "\u2192 1.8 \u79D2\u3067\u5B8C\u4E86",
@@ -459,13 +599,85 @@ var ja = {
459
599
  "apiGateway.delete": "DELETE",
460
600
  "apiGateway.users": "/\u5229\u7528\u8005",
461
601
  "apiGateway.orders": "/\u6CE8\u6587",
462
- "apiGateway.session": "/\u63A5\u7D9A"
602
+ "apiGateway.session": "/\u63A5\u7D9A",
603
+ "readout.empty": "\u306A\u3057",
604
+ "readout.sparkline.waiting": "\u5F85\u6A5F\u4E2D",
605
+ "input.timeline.speed": "{speed}\u500D",
606
+ "input.timeline.time": "{t}\u79D2 / {d}\u79D2",
607
+ "readout.sequenceTimeline.title": "{name}: \u6642\u523B {t}",
608
+ "readout.bubbleChart.title": "({x}, {y}) \u534A\u5F84 {r}",
609
+ "readout.calendarHeatmap.title": "{i} \u65E5\u76EE: {v}",
610
+ "readout.candlestick.title": "\u59CB {o} \u9AD8 {h} \u5B89 {l} \u7D42 {c}",
611
+ "readout.slope.before": "\u524D",
612
+ "readout.slope.after": "\u5F8C",
613
+ "readout.bulletChart.actual": "\u5B9F\u7E3E: {v}",
614
+ "readout.bulletChart.target": "\u76EE\u6A19: {v}",
615
+ "readout.rating.full": "\u6E80",
616
+ "readout.rating.half": "\u534A\u5206",
617
+ "readout.rating.empty": "\u7A7A",
618
+ "readout.priceTag.save": "{amount} \u304A\u5F97",
619
+ "readout.confidence.low": "\u4F4E",
620
+ "readout.confidence.mid": "\u4E2D",
621
+ "readout.confidence.high": "\u9AD8",
622
+ "readout.more": "\u307B\u304B {n}",
623
+ "readout.videoCard.views": "{v} \u56DE\u8996\u8074",
624
+ "readout.attendance.corner": "\u65E5",
625
+ "readout.weekday.0": "\u65E5",
626
+ "readout.weekday.1": "\u6708",
627
+ "readout.weekday.2": "\u706B",
628
+ "readout.weekday.3": "\u6C34",
629
+ "readout.weekday.4": "\u6728",
630
+ "readout.weekday.5": "\u91D1",
631
+ "readout.weekday.6": "\u571F",
632
+ "readout.ratingThumb.summary": "\u8CDB\u6210 {pct}% \xB7 {total} \u7968",
633
+ "readout.kpiTrend.prev": "\u524D\u56DE {v}",
634
+ "readout.poll.total": "\u5408\u8A08 {n}",
635
+ "readout.thread.participants": "{n} \u4EBA",
636
+ "readout.thread.last": "\u6700\u5F8C: {name}",
637
+ "readout.readReceipt.sent": "\u9001\u4FE1\u6E08\u307F",
638
+ "readout.readReceipt.delivered": "\u914D\u4FE1\u6E08\u307F",
639
+ "readout.readReceipt.read": "\u65E2\u8AAD",
640
+ "readout.password.0": "\u5F31\u3059\u304E\u308B",
641
+ "readout.password.1": "\u5F31\u3044",
642
+ "readout.password.2": "\u666E\u901A",
643
+ "readout.password.3": "\u826F\u3044",
644
+ "readout.password.4": "\u5F37\u3044",
645
+ "readout.dropzone.uploaded": "\u53D6\u308A\u8FBC\u307F\u6E08\u307F",
646
+ "readout.dropzone.drop": "\u2B06 \u3053\u3053\u306B\u30D5\u30A1\u30A4\u30EB\u3092\u7F6E\u304F",
647
+ "readout.dropzone.browse": "\u307E\u305F\u306F\u62BC\u3057\u3066\u9078\u3076",
648
+ "readout.log.0": "\u8A73\u7D30",
649
+ "readout.log.1": "\u60C5\u5831",
650
+ "readout.log.2": "\u8B66\u544A",
651
+ "readout.log.3": "\u7570\u5E38",
652
+ "readout.cart.items": "\u70B9\u6570",
653
+ "readout.cart.subtotal": "\u5C0F\u8A08",
654
+ "readout.cart.shipping": "\u9001\u6599",
655
+ "readout.cart.total": "\u5408\u8A08",
656
+ "readout.pricing.plan": "\u30D7\u30E9\u30F3",
657
+ "readout.pricing.perMonth": "\u6708\u984D",
658
+ "readout.pricing.get": "{name}\u3092\u9078\u3076",
659
+ "readout.coupon.placeholder": "\u30B3\u30FC\u30C9\u3092\u5165\u529B",
660
+ "readout.coupon.off": "-{pct}% \u5F15\u304D",
661
+ "readout.coupon.apply": "\u9069\u7528",
662
+ "readout.article.by": "\u6587: {author}",
663
+ "readout.priority.high": "\u9AD8",
664
+ "readout.priority.med": "\u4E2D",
665
+ "readout.priority.low": "\u4F4E",
666
+ "readout.kanban.todo": "\u672A\u7740\u624B",
667
+ "readout.kanban.inprogress": "\u9032\u884C\u4E2D",
668
+ "readout.kanban.done": "\u5B8C\u4E86",
669
+ "readout.trafficLight.red": "\u8D64",
670
+ "readout.trafficLight.yellow": "\u9EC4",
671
+ "readout.trafficLight.green": "\u7DD1"
463
672
  };
464
673
  var CDL_TEXT = { en, ja };
465
674
  function \u5B57\u5F15\u304D\u3092\u4F5C\u308B(lang) {
466
675
  const \u8A00\u8A9E = lang ?? "en";
467
676
  return (key) => CDL_TEXT[\u8A00\u8A9E][key];
468
677
  }
678
+ function \u5B57\u3092\u5DEE\u3057\u8FBC\u3080(template, values) {
679
+ return template.replace(/\{(\w+)\}/g, (whole, name) => name in values ? String(values[name]) : whole);
680
+ }
469
681
 
470
682
  // src/formula/ast.ts
471
683
  var ALLOWED_MATH_FNS = /* @__PURE__ */ new Set([
@@ -1377,6 +1589,23 @@ function textWidth(s, size, \u5B57\u9001\u308A = 0) {
1377
1589
  }
1378
1590
  return \u5E45 * size + \u5B57\u9001\u308A * \u5B57\u6570;
1379
1591
  }
1592
+ var \u64CD\u4F5C\u90E8\u306E\u8A00\u8A9E = createContext("en");
1593
+ function use\u5B57\u5F15() {
1594
+ const lang = useContext(\u64CD\u4F5C\u90E8\u306E\u8A00\u8A9E);
1595
+ return (key, values) => values ? \u5B57\u3092\u5DEE\u3057\u8FBC\u3080(CDL_TEXT[lang][key], values) : CDL_TEXT[lang][key];
1596
+ }
1597
+ function \u5B57({ k, v }) {
1598
+ const \u5F15\u304F = use\u5B57\u5F15();
1599
+ return /* @__PURE__ */ jsx(Fragment, { children: \u5F15\u304F(k, v) });
1600
+ }
1601
+ function \u5B57\u306E\u898B\u51FA\u3057({
1602
+ k,
1603
+ v,
1604
+ \u524D = ""
1605
+ }) {
1606
+ const \u5F15\u304F = use\u5B57\u5F15();
1607
+ return /* @__PURE__ */ jsx("title", { children: k === void 0 ? "" : `${\u524D}${\u5F15\u304F(k, v)}` });
1608
+ }
1380
1609
  function createInteractiveSignalsAccessor(diagram2, signals, formula, scroll) {
1381
1610
  const kindByInputId = /* @__PURE__ */ new Map();
1382
1611
  for (const inp of diagram2.inputs ?? []) {
@@ -1691,20 +1920,23 @@ function useInteractiveIntegration(diagram2, options = {}) {
1691
1920
  const readouts = diagram2.readouts ?? [];
1692
1921
  if (inputs.length === 0 && scrolls.length === 0 && formulasList.length === 0 && readouts.length === 0)
1693
1922
  return null;
1694
- return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-root", "data-cdl-interactive-panel": "true", children: [
1695
- inputs.length > 0 && /* @__PURE__ */ jsx("div", { className: "cdl-ip-group", children: inputs.map((input) => /* @__PURE__ */ jsx(InputWidget, { input, signal: signals[input.id] }, input.id)) }),
1696
- formulasList.length > 0 && /* @__PURE__ */ jsx("div", { className: "cdl-ip-group", children: formulasList.map((f) => /* @__PURE__ */ jsx(
1697
- FormulaReadout,
1698
- {
1699
- id: f.id,
1700
- expression: f.expression,
1701
- value: stateOverrides[f.id]
1702
- },
1703
- f.id
1704
- )) }),
1705
- scrolls.length > 0 && /* @__PURE__ */ jsx("div", { className: "cdl-ip-group", children: scrolls.map((s) => /* @__PURE__ */ jsx(ScrollReadout, { id: s.id, progress: stateOverrides[s.id] }, s.id)) }),
1706
- readouts.length > 0 && /* @__PURE__ */ jsx("div", { className: "cdl-ip-group", children: readouts.map((r) => /* @__PURE__ */ jsx(ReadoutWidget, { readout: r, stateOverrides: mergedStateValues }, r.id)) })
1707
- ] });
1923
+ return (
1924
+ // 操作部の中の読み出しと入力欄へ、図の言語を届ける (#849)。 型の外の値は英語に落ちる
1925
+ /* @__PURE__ */ jsx(\u64CD\u4F5C\u90E8\u306E\u8A00\u8A9E.Provider, { value: resolveLang(diagram2.lang), children: /* @__PURE__ */ jsxs("div", { className: "cdl-ip-root", "data-cdl-interactive-panel": "true", children: [
1926
+ inputs.length > 0 && /* @__PURE__ */ jsx("div", { className: "cdl-ip-group", children: inputs.map((input) => /* @__PURE__ */ jsx(InputWidget, { input, signal: signals[input.id] }, input.id)) }),
1927
+ formulasList.length > 0 && /* @__PURE__ */ jsx("div", { className: "cdl-ip-group", children: formulasList.map((f) => /* @__PURE__ */ jsx(
1928
+ FormulaReadout,
1929
+ {
1930
+ id: f.id,
1931
+ expression: f.expression,
1932
+ value: stateOverrides[f.id]
1933
+ },
1934
+ f.id
1935
+ )) }),
1936
+ scrolls.length > 0 && /* @__PURE__ */ jsx("div", { className: "cdl-ip-group", children: scrolls.map((s) => /* @__PURE__ */ jsx(ScrollReadout, { id: s.id, progress: stateOverrides[s.id] }, s.id)) }),
1937
+ readouts.length > 0 && /* @__PURE__ */ jsx("div", { className: "cdl-ip-group", children: readouts.map((r) => /* @__PURE__ */ jsx(ReadoutWidget, { readout: r, stateOverrides: mergedStateValues }, r.id)) })
1938
+ ] }) })
1939
+ );
1708
1940
  }, [diagram2, signals, stateOverrides, mergedStateValues]);
1709
1941
  return { stateOverrides, panel, svgRef, containerRef };
1710
1942
  }
@@ -3565,7 +3797,7 @@ function SparklineReadout({
3565
3797
  if (points.length < 2) {
3566
3798
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-sparkline", "data-cdl-readout": id, children: [
3567
3799
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
3568
- /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-sparkline-empty", style: { width: w, height: h }, children: points.length === 0 ? "waiting" : "\u2014" }),
3800
+ /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-sparkline-empty", style: { width: w, height: h }, children: points.length === 0 ? /* @__PURE__ */ jsx(\u5B57, { k: "readout.sparkline.waiting" }) : "\u2014" }),
3569
3801
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-sparkline-value", children: Number.isFinite(value) ? value : "\u2014" })
3570
3802
  ] });
3571
3803
  }
@@ -3828,27 +4060,24 @@ function TimelineWidget({
3828
4060
  className: "cdl-ip-timeline-scrubber"
3829
4061
  }
3830
4062
  ),
3831
- /* @__PURE__ */ jsxs(
4063
+ /* @__PURE__ */ jsx(
3832
4064
  "button",
3833
4065
  {
3834
4066
  type: "button",
3835
4067
  className: "cdl-ip-timeline-btn cdl-ip-timeline-speed",
3836
4068
  onClick: cycleSpeed,
3837
4069
  "aria-label": "speed",
3838
- children: [
3839
- speed,
3840
- "x"
3841
- ]
4070
+ children: /* @__PURE__ */ jsx(\u5B57, { k: "input.timeline.speed", v: { speed } })
3842
4071
  }
3843
4072
  )
3844
4073
  ] }),
3845
- /* @__PURE__ */ jsxs("span", { className: "cdl-ip-timeline-time", children: [
3846
- (progress * (input.duration / 1e3)).toFixed(1),
3847
- "s /",
3848
- " ",
3849
- (input.duration / 1e3).toFixed(1),
3850
- "s"
3851
- ] })
4074
+ /* @__PURE__ */ jsx("span", { className: "cdl-ip-timeline-time", children: /* @__PURE__ */ jsx(
4075
+ \u5B57,
4076
+ {
4077
+ k: "input.timeline.time",
4078
+ v: { t: (progress * (input.duration / 1e3)).toFixed(1), d: (input.duration / 1e3).toFixed(1) }
4079
+ }
4080
+ ) })
3852
4081
  ] });
3853
4082
  }
3854
4083
  function RangeWidget({
@@ -4086,7 +4315,7 @@ function ArrayBarReadout({
4086
4315
  const range = max - min || 1;
4087
4316
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-array-bar", "data-cdl-readout": id, children: [
4088
4317
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4089
- /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-array-bar-row", children: arr.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : arr.map((v, i) => {
4318
+ /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-array-bar-row", children: arr.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : arr.map((v, i) => {
4090
4319
  const h = Math.max(0, Math.min(1, (v - min) / range));
4091
4320
  return /* @__PURE__ */ jsx(
4092
4321
  "span",
@@ -4163,7 +4392,7 @@ function StackedBarReadout({
4163
4392
  const range = max - min || 1;
4164
4393
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-stacked-bar", "data-cdl-readout": id, children: [
4165
4394
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4166
- /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-stacked-bar-row", children: n === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : Array.from({ length: n }).map((_, i) => {
4395
+ /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-stacked-bar-row", children: n === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : Array.from({ length: n }).map((_, i) => {
4167
4396
  const va = arrA[i] ?? 0;
4168
4397
  const vb = arrB[i] ?? 0;
4169
4398
  const hA = Math.max(0, Math.min(1, (va - min) / range));
@@ -4258,7 +4487,7 @@ function MatrixReadout({
4258
4487
  };
4259
4488
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-matrix", "data-cdl-readout": id, children: [
4260
4489
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4261
- rows === 0 || cols === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx(
4490
+ rows === 0 || cols === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx(
4262
4491
  "svg",
4263
4492
  {
4264
4493
  className: "cdl-ip-readout-matrix-svg",
@@ -4316,7 +4545,7 @@ function ProgressGroupReadout({
4316
4545
  const labelArr = labels ? safeParseArray(labels).map(String) : [];
4317
4546
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-progress-group", "data-cdl-readout": id, children: [
4318
4547
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4319
- arr.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-progress-group-list", children: arr.map((v, i) => {
4548
+ arr.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-progress-group-list", children: arr.map((v, i) => {
4320
4549
  const pct = Math.max(0, Math.min(100, v / (max || 1) * 100));
4321
4550
  const rowLabel = labelArr[i] ?? String(i + 1);
4322
4551
  return /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-progress-group-row", children: [
@@ -4378,7 +4607,7 @@ function SequenceTimelineReadout({
4378
4607
  const xFor = (t) => pad + (Math.max(min, Math.min(max, t)) - min) / range * (viewW - pad * 2);
4379
4608
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-sequence-timeline", "data-cdl-readout": id, children: [
4380
4609
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4381
- events.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs(
4610
+ events.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs(
4382
4611
  "svg",
4383
4612
  {
4384
4613
  className: "cdl-ip-readout-sequence-timeline-svg",
@@ -4392,7 +4621,7 @@ function SequenceTimelineReadout({
4392
4621
  events.map((e, i) => {
4393
4622
  const x = xFor(e.t);
4394
4623
  return /* @__PURE__ */ jsxs("g", { "data-cdl-event-marker": e.name, children: [
4395
- /* @__PURE__ */ jsx("circle", { cx: x, cy: trackY, r: 5, fill: color, stroke: "#fff", strokeWidth: 1.5, children: /* @__PURE__ */ jsx("title", { children: `${e.name}: t=${e.t}` }) }),
4624
+ /* @__PURE__ */ jsx("circle", { cx: x, cy: trackY, r: 5, fill: color, stroke: "#fff", strokeWidth: 1.5, children: /* @__PURE__ */ jsx(\u5B57\u306E\u898B\u51FA\u3057, { k: "readout.sequenceTimeline.title", v: { name: e.name, t: e.t } }) }),
4396
4625
  /* @__PURE__ */ jsx("text", { x, y: trackY - 12, textAnchor: sequenceLabelAnchor(x, e.name, 10, viewW), fontSize: 10, fill: "var(--v4-ink, #1a1f2a)", children: e.name }),
4397
4626
  /* @__PURE__ */ jsx("text", { x, y: trackY + 18, textAnchor: "middle", fontSize: 9, fill: "var(--v4-mute, #64748b)", children: e.t })
4398
4627
  ] }, i);
@@ -4435,7 +4664,7 @@ function RadarReadout({
4435
4664
  const polygon = points.length ? points.map((p) => `${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(" ") : "";
4436
4665
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-radar", "data-cdl-readout": id, children: [
4437
4666
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4438
- n === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-radar-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
4667
+ n === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-radar-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
4439
4668
  [0.33, 0.66, 1].map((t) => /* @__PURE__ */ jsx(
4440
4669
  "polygon",
4441
4670
  {
@@ -4497,14 +4726,14 @@ function BubbleChartReadout({
4497
4726
  const maxCircleR = 18;
4498
4727
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-bubble-chart", "data-cdl-readout": id, children: [
4499
4728
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4500
- bubbles.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-bubble-chart-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
4729
+ bubbles.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-bubble-chart-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
4501
4730
  /* @__PURE__ */ jsx("line", { x1: pad, x2: viewW - pad, y1: viewH - pad, y2: viewH - pad, stroke: "rgba(148,163,184,0.4)" }),
4502
4731
  /* @__PURE__ */ jsx("line", { x1: pad, x2: pad, y1: pad, y2: viewH - pad, stroke: "rgba(148,163,184,0.4)" }),
4503
4732
  bubbles.map((b, i) => {
4504
4733
  const cx = pad + (Math.max(xMin, Math.min(xMax, b.x)) - xMin) / xRange * w;
4505
4734
  const cy = viewH - pad - (Math.max(yMin, Math.min(yMax, b.y)) - yMin) / yRange * h;
4506
4735
  const r = 4 + (Math.max(rMin, Math.min(rMax, b.r)) - rMin) / rRange * (maxCircleR - 4);
4507
- return /* @__PURE__ */ jsx("circle", { cx, cy, r, fill: color, fillOpacity: 0.35, stroke: color, strokeWidth: 1.5, children: /* @__PURE__ */ jsx("title", { children: `(${b.x}, ${b.y}) r=${b.r}` }) }, i);
4736
+ return /* @__PURE__ */ jsx("circle", { cx, cy, r, fill: color, fillOpacity: 0.35, stroke: color, strokeWidth: 1.5, children: /* @__PURE__ */ jsx(\u5B57\u306E\u898B\u51FA\u3057, { k: "readout.bubbleChart.title", v: { x: b.x, y: b.y, r: b.r } }) }, i);
4508
4737
  })
4509
4738
  ] })
4510
4739
  ] });
@@ -4527,7 +4756,7 @@ function DonutReadout({
4527
4756
  let acc = 0;
4528
4757
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-donut", "data-cdl-readout": id, children: [
4529
4758
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4530
- arr.length === 0 || total === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-donut-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: arr.map((v, i) => {
4759
+ arr.length === 0 || total === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-donut-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: arr.map((v, i) => {
4531
4760
  const from = acc;
4532
4761
  const to = acc + v / total;
4533
4762
  acc = to;
@@ -4588,7 +4817,7 @@ function CalendarHeatmapReadout({
4588
4817
  height: cellSize,
4589
4818
  rx: 2,
4590
4819
  fill,
4591
- children: /* @__PURE__ */ jsx("title", { children: `day ${i}: ${v}` })
4820
+ children: /* @__PURE__ */ jsx(\u5B57\u306E\u898B\u51FA\u3057, { k: "readout.calendarHeatmap.title", v: { i, v } })
4592
4821
  },
4593
4822
  i
4594
4823
  );
@@ -4708,7 +4937,7 @@ function CandlestickReadout({
4708
4937
  const candleW = candles.length === 0 ? 0 : Math.max(3, (w - (candles.length - 1) * 3) / candles.length);
4709
4938
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-candlestick", "data-cdl-readout": id, children: [
4710
4939
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4711
- candles.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-candlestick-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: candles.map((cd, i) => {
4940
+ candles.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-candlestick-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: candles.map((cd, i) => {
4712
4941
  const cx = pad + i * (candleW + 3) + candleW / 2;
4713
4942
  const yHigh = yFor(cd.h);
4714
4943
  const yLow = yFor(cd.l);
@@ -4729,7 +4958,7 @@ function CandlestickReadout({
4729
4958
  height: bodyH,
4730
4959
  fill: isUp ? color : color,
4731
4960
  fillOpacity: isUp ? 1 : 0.85,
4732
- children: /* @__PURE__ */ jsx("title", { children: `O:${cd.o} H:${cd.h} L:${cd.l} C:${cd.c}` })
4961
+ children: /* @__PURE__ */ jsx(\u5B57\u306E\u898B\u51FA\u3057, { k: "readout.candlestick.title", v: { o: cd.o, h: cd.h, l: cd.l, c: cd.c } })
4733
4962
  }
4734
4963
  )
4735
4964
  ] }, i);
@@ -4763,7 +4992,7 @@ function VennReadout({
4763
4992
  const cxB = viewW / 2 + gap / 2;
4764
4993
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-venn", "data-cdl-readout": id, children: [
4765
4994
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4766
- sizeA === 0 && sizeB === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-venn-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
4995
+ sizeA === 0 && sizeB === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-venn-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
4767
4996
  /* @__PURE__ */ jsx("circle", { cx: cxA, cy, r: rA, fill: colorA, fillOpacity: 0.4, stroke: colorA, strokeWidth: 1.5 }),
4768
4997
  /* @__PURE__ */ jsx("circle", { cx: cxB, cy, r: rB, fill: colorB, fillOpacity: 0.4, stroke: colorB, strokeWidth: 1.5 }),
4769
4998
  /* @__PURE__ */ jsx("text", { x: cxA - rA + 8, y: cy - 4, fontSize: 11, fill: "var(--v4-ink, #1a1f2a)", fontWeight: 600, children: labelA }),
@@ -4814,11 +5043,11 @@ function SlopeReadout({
4814
5043
  const yFor = (v) => pad + (1 - (Math.max(min, Math.min(max, v)) - min) / range) * h;
4815
5044
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-slope", "data-cdl-readout": id, children: [
4816
5045
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4817
- slopes.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-slope-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
5046
+ slopes.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-slope-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
4818
5047
  /* @__PURE__ */ jsx("line", { x1: xL, x2: xL, y1: pad - 4, y2: viewH - pad + 4, stroke: "rgba(148,163,184,0.4)" }),
4819
5048
  /* @__PURE__ */ jsx("line", { x1: xR, x2: xR, y1: pad - 4, y2: viewH - pad + 4, stroke: "rgba(148,163,184,0.4)" }),
4820
- /* @__PURE__ */ jsx("text", { x: xL, y: viewH - 4, fontSize: 9, textAnchor: "middle", fill: "var(--v4-mute, #64748b)", children: "before" }),
4821
- /* @__PURE__ */ jsx("text", { x: xR, y: viewH - 4, fontSize: 9, textAnchor: "middle", fill: "var(--v4-mute, #64748b)", children: "after" }),
5049
+ /* @__PURE__ */ jsx("text", { x: xL, y: viewH - 4, fontSize: 9, textAnchor: "middle", fill: "var(--v4-mute, #64748b)", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.slope.before" }) }),
5050
+ /* @__PURE__ */ jsx("text", { x: xR, y: viewH - 4, fontSize: 9, textAnchor: "middle", fill: "var(--v4-mute, #64748b)", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.slope.after" }) }),
4822
5051
  slopes.map((s, i) => {
4823
5052
  const yB = yFor(s.before);
4824
5053
  const yA = yFor(s.after);
@@ -4865,7 +5094,7 @@ function FunnelReadout({
4865
5094
  const [bR, bG, bB] = hexToRgb(colorBottom);
4866
5095
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-funnel", "data-cdl-readout": id, children: [
4867
5096
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4868
- stages.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-funnel-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: stages.map((s, i) => {
5097
+ stages.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-funnel-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: stages.map((s, i) => {
4869
5098
  const ratio = i / Math.max(1, stages.length - 1);
4870
5099
  const w = maxCount > 0 ? s.count / maxCount * (viewW - 12) : 0;
4871
5100
  const yTop = i * stageH + 2;
@@ -4927,7 +5156,7 @@ function GanttReadout({
4927
5156
  const xFor = (v) => labelW + (Math.max(min, Math.min(max, v)) - min) / range * (viewW - labelW - pad);
4928
5157
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-gantt", "data-cdl-readout": id, children: [
4929
5158
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
4930
- tasks.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-gantt-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: tasks.map((t, i) => {
5159
+ tasks.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-gantt-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: tasks.map((t, i) => {
4931
5160
  const y = pad + i * rowH;
4932
5161
  const x1 = xFor(t.start);
4933
5162
  const x2 = xFor(t.start + t.duration);
@@ -5018,7 +5247,7 @@ function TreemapReadout({
5018
5247
  }
5019
5248
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-treemap", "data-cdl-readout": id, children: [
5020
5249
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
5021
- rects.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-treemap-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: rects.map((r, i) => /* @__PURE__ */ jsxs("g", { children: [
5250
+ rects.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-treemap-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: rects.map((r, i) => /* @__PURE__ */ jsxs("g", { children: [
5022
5251
  /* @__PURE__ */ jsx("rect", { x: r.x + 1, y: r.y + 1, width: Math.max(0, r.w - 2), height: Math.max(0, r.h - 2), fill: colors[i % colors.length] ?? "#94a3b8", rx: 2, children: /* @__PURE__ */ jsx("title", { children: `${r.name}: ${r.size}` }) }),
5023
5252
  r.w > 40 && r.h > 20 ? /* @__PURE__ */ jsx("text", { x: r.x + 6, y: r.y + 14, fontSize: 10, fill: "#fff", fontWeight: 600, children: r.name }) : null
5024
5253
  ] }, i)) })
@@ -5084,7 +5313,7 @@ function SankeyReadout({
5084
5313
  const rightUsed = {};
5085
5314
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-sankey", "data-cdl-readout": id, children: [
5086
5315
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
5087
- flows.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-sankey-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
5316
+ flows.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-sankey-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
5088
5317
  leftNodes.map((n, i) => {
5089
5318
  const p = leftPos[n.name];
5090
5319
  return /* @__PURE__ */ jsxs("g", { children: [
@@ -5146,7 +5375,7 @@ function PolarAreaReadout({
5146
5375
  const maxR = Math.min(cx, cy) - 20;
5147
5376
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-polar-area", "data-cdl-readout": id, children: [
5148
5377
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
5149
- n === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-polar-area-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
5378
+ n === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-polar-area-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
5150
5379
  [0.33, 0.66, 1].map((t) => /* @__PURE__ */ jsx("circle", { cx, cy, r: maxR * t, fill: "none", stroke: "rgba(148,163,184,0.2)", strokeWidth: 1 }, t)),
5151
5380
  arr.map((v, i) => {
5152
5381
  const ratio = Math.sqrt(Math.max(0, Math.min(max, v)) / (max || 1));
@@ -5192,7 +5421,7 @@ function StepIndicatorReadout({
5192
5421
  const cy = viewH / 2 - 2;
5193
5422
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-step-indicator", "data-cdl-readout": id, children: [
5194
5423
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
5195
- n === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-step-indicator-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
5424
+ n === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-step-indicator-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
5196
5425
  n > 1 ? Array.from({ length: n - 1 }).map((_, i) => {
5197
5426
  const x1 = pad + i * step;
5198
5427
  const x2 = pad + (i + 1) * step;
@@ -5282,8 +5511,8 @@ function BulletChartReadout({
5282
5511
  /* @__PURE__ */ jsx("rect", { x: pad, y: pad, width: badX - pad, height: trackH, fill: "rgba(239,68,68,0.25)", rx: 2 }),
5283
5512
  /* @__PURE__ */ jsx("rect", { x: badX, y: pad, width: avgX - badX, height: trackH, fill: "rgba(234,179,8,0.25)" }),
5284
5513
  /* @__PURE__ */ jsx("rect", { x: avgX, y: pad, width: pad + w - avgX, height: trackH, fill: "rgba(34,197,94,0.25)" }),
5285
- /* @__PURE__ */ jsx("rect", { x: pad, y: pad + trackH * 0.3, width: actualX - pad, height: trackH * 0.4, fill: colorActual, rx: 2, children: /* @__PURE__ */ jsx("title", { children: `actual: ${safeActual}` }) }),
5286
- /* @__PURE__ */ jsx("line", { x1: targetX, x2: targetX, y1: pad - 2, y2: pad + trackH + 2, stroke: "#0f172a", strokeWidth: 2, children: /* @__PURE__ */ jsx("title", { children: `target: ${safeTarget}` }) })
5514
+ /* @__PURE__ */ jsx("rect", { x: pad, y: pad + trackH * 0.3, width: actualX - pad, height: trackH * 0.4, fill: colorActual, rx: 2, children: /* @__PURE__ */ jsx(\u5B57\u306E\u898B\u51FA\u3057, { k: "readout.bulletChart.actual", v: { v: safeActual } }) }),
5515
+ /* @__PURE__ */ jsx("line", { x1: targetX, x2: targetX, y1: pad - 2, y2: pad + trackH + 2, stroke: "#0f172a", strokeWidth: 2, children: /* @__PURE__ */ jsx(\u5B57\u306E\u898B\u51FA\u3057, { k: "readout.bulletChart.target", v: { v: safeTarget } }) })
5287
5516
  ] })
5288
5517
  ] });
5289
5518
  }
@@ -5338,7 +5567,7 @@ function LeaderboardReadout({
5338
5567
  const medals = ["#eab308", "#94a3b8", "#c2410c"];
5339
5568
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-leaderboard", "data-cdl-readout": id, children: [
5340
5569
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
5341
- sorted.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ol", { className: "cdl-ip-readout-leaderboard-list", children: sorted.map((it, i) => {
5570
+ sorted.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ol", { className: "cdl-ip-readout-leaderboard-list", children: sorted.map((it, i) => {
5342
5571
  const pct = topMax > 0 ? it.value / topMax * 100 : 0;
5343
5572
  const rankColor = i < medals.length ? medals[i] : "#cbd5e1";
5344
5573
  return /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-leaderboard-row", children: [
@@ -5389,7 +5618,7 @@ function TrafficLightReadout({
5389
5618
  style: {
5390
5619
  filter: isActive ? `drop-shadow(0 0 6px ${colors[i]})` : void 0
5391
5620
  },
5392
- children: /* @__PURE__ */ jsx("title", { children: isActive ? ["red", "yellow", "green"][i] : "" })
5621
+ children: /* @__PURE__ */ jsx(\u5B57\u306E\u898B\u51FA\u3057, { k: isActive ? ["readout.trafficLight.red", "readout.trafficLight.yellow", "readout.trafficLight.green"][i] : void 0 })
5393
5622
  },
5394
5623
  i
5395
5624
  );
@@ -5428,7 +5657,7 @@ function TagCloudReadout({
5428
5657
  const sizeFor = (w) => minSize + (w - minW) / range * (maxSize - minSize);
5429
5658
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-tag-cloud", "data-cdl-readout": id, children: [
5430
5659
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
5431
- tags.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-tag-cloud-list", children: tags.map((t, i) => /* @__PURE__ */ jsx(
5660
+ tags.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-tag-cloud-list", children: tags.map((t, i) => /* @__PURE__ */ jsx(
5432
5661
  "span",
5433
5662
  {
5434
5663
  className: "cdl-ip-readout-tag-cloud-tag",
@@ -5465,7 +5694,7 @@ function ActivityFeedReadout({
5465
5694
  const shown = events.slice(0, max);
5466
5695
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-activity-feed", "data-cdl-readout": id, children: [
5467
5696
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
5468
- shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-activity-feed-list", children: shown.map((e, i) => /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-activity-feed-row", children: [
5697
+ shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-activity-feed-list", children: shown.map((e, i) => /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-activity-feed-row", children: [
5469
5698
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-activity-feed-bullet", style: { background: color } }),
5470
5699
  /* @__PURE__ */ jsxs("span", { className: "cdl-ip-readout-activity-feed-content", children: [
5471
5700
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-activity-feed-actor", children: e.actor }),
@@ -5516,7 +5745,7 @@ function RatingReadout({
5516
5745
  strokeWidth: 1
5517
5746
  }
5518
5747
  ),
5519
- isEmpty ? /* @__PURE__ */ jsx("title", { children: `${i + 1}: empty` }) : /* @__PURE__ */ jsx("title", { children: `${i + 1}: ${isFull ? "full" : "half"}` })
5748
+ isEmpty ? /* @__PURE__ */ jsx(\u5B57\u306E\u898B\u51FA\u3057, { \u524D: `${i + 1}: `, k: "readout.rating.empty" }) : /* @__PURE__ */ jsx(\u5B57\u306E\u898B\u51FA\u3057, { \u524D: `${i + 1}: `, k: isFull ? "readout.rating.full" : "readout.rating.half" })
5520
5749
  ]
5521
5750
  },
5522
5751
  i
@@ -5612,7 +5841,7 @@ function ChatBubbleReadout({
5612
5841
  const shown = messages.slice(0, max);
5613
5842
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-chat-bubble", "data-cdl-readout": id, children: [
5614
5843
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
5615
- shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-chat-bubble-list", children: shown.map((m, i) => /* @__PURE__ */ jsx(
5844
+ shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-chat-bubble-list", children: shown.map((m, i) => /* @__PURE__ */ jsx(
5616
5845
  "li",
5617
5846
  {
5618
5847
  className: `cdl-ip-readout-chat-bubble-row ${m.isSelf ? "self" : "other"}`,
@@ -5704,7 +5933,7 @@ function ChecklistReadout({
5704
5933
  const pct = items.length === 0 ? 0 : Math.round(done / items.length * 100);
5705
5934
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-checklist", "data-cdl-readout": id, children: [
5706
5935
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
5707
- items.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs(Fragment, { children: [
5936
+ items.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
5708
5937
  /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-checklist-progress", children: [
5709
5938
  /* @__PURE__ */ jsxs("span", { className: "cdl-ip-readout-checklist-progress-text", children: [
5710
5939
  done,
@@ -5815,11 +6044,7 @@ function PriceTagReadout({
5815
6044
  "%"
5816
6045
  ] }) : null
5817
6046
  ] }),
5818
- savings > 0 ? /* @__PURE__ */ jsxs("span", { className: "cdl-ip-readout-price-tag-savings", children: [
5819
- "You save ",
5820
- currency,
5821
- savings
5822
- ] }) : null
6047
+ savings > 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-price-tag-savings", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.priceTag.save", v: { amount: `${currency}${savings}` } }) }) : null
5823
6048
  ] });
5824
6049
  }
5825
6050
  function SpinnerReadout({
@@ -5956,6 +6181,11 @@ function StopwatchReadout({
5956
6181
  }
5957
6182
  );
5958
6183
  }
6184
+ var \u78BA\u4FE1\u5EA6\u306E\u5E2F\u306E\u5B57 = {
6185
+ low: "readout.confidence.low",
6186
+ mid: "readout.confidence.mid",
6187
+ high: "readout.confidence.high"
6188
+ };
5959
6189
  function ConfidenceMeterReadout({
5960
6190
  id,
5961
6191
  label,
@@ -5988,7 +6218,7 @@ function ConfidenceMeterReadout({
5988
6218
  Math.round(safeValue),
5989
6219
  "%"
5990
6220
  ] }),
5991
- /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-confidence-meter-band", style: { color: bandColor }, children: bandLabel })
6221
+ /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-confidence-meter-band", style: { color: bandColor }, children: /* @__PURE__ */ jsx(\u5B57, { k: \u78BA\u4FE1\u5EA6\u306E\u5E2F\u306E\u5B57[bandLabel] }) })
5992
6222
  ] }),
5993
6223
  /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-confidence-meter-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
5994
6224
  /* @__PURE__ */ jsx("rect", { x: pad, y: pad, width: lowX - pad, height: h, fill: "rgba(239,68,68,0.2)", rx: 2 }),
@@ -6023,7 +6253,7 @@ function ReactionBarReadout({
6023
6253
  }
6024
6254
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-reaction-bar", "data-cdl-readout": id, children: [
6025
6255
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6026
- reactions.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-reaction-bar-row", children: reactions.map((r, i) => /* @__PURE__ */ jsxs("span", { className: "cdl-ip-readout-reaction-bar-pill", style: { borderColor: color }, children: [
6256
+ reactions.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-reaction-bar-row", children: reactions.map((r, i) => /* @__PURE__ */ jsxs("span", { className: "cdl-ip-readout-reaction-bar-pill", style: { borderColor: color }, children: [
6027
6257
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-reaction-bar-emoji", children: r.emoji }),
6028
6258
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-reaction-bar-count", style: { color }, children: r.count })
6029
6259
  ] }, i)) })
@@ -6056,7 +6286,7 @@ function PillGroupReadout({
6056
6286
  }
6057
6287
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-pill-group", "data-cdl-readout": id, children: [
6058
6288
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6059
- pills.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-pill-group-row", children: pills.map((p, i) => /* @__PURE__ */ jsx(
6289
+ pills.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-pill-group-row", children: pills.map((p, i) => /* @__PURE__ */ jsx(
6060
6290
  "span",
6061
6291
  {
6062
6292
  className: "cdl-ip-readout-pill-group-pill",
@@ -6144,7 +6374,7 @@ function MetricsGridReadout({
6144
6374
  }
6145
6375
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-metrics-grid", "data-cdl-readout": id, children: [
6146
6376
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6147
- items.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-metrics-grid-grid", children: items.map((m, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-metrics-grid-cell", children: [
6377
+ items.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-metrics-grid-grid", children: items.map((m, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-metrics-grid-cell", children: [
6148
6378
  /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-metrics-grid-value", style: { color }, children: [
6149
6379
  m.value,
6150
6380
  m.unit ? /* @__PURE__ */ jsxs("span", { className: "cdl-ip-readout-metrics-grid-unit", children: [
@@ -6231,7 +6461,7 @@ function IconTileReadout({
6231
6461
  }
6232
6462
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-icon-tile", "data-cdl-readout": id, children: [
6233
6463
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6234
- tiles.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-icon-tile-row", children: tiles.map((t, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-icon-tile-cell", children: [
6464
+ tiles.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-icon-tile-row", children: tiles.map((t, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-icon-tile-cell", children: [
6235
6465
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-icon-tile-icon", style: { background: color }, children: t.icon }),
6236
6466
  /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-icon-tile-content", children: [
6237
6467
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-icon-tile-value", children: t.value }),
@@ -6272,7 +6502,7 @@ function TokenListReadout({
6272
6502
  }
6273
6503
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-token-list", "data-cdl-readout": id, children: [
6274
6504
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6275
- tokens.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-token-list-items", children: tokens.map((t, i) => {
6505
+ tokens.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-token-list-items", children: tokens.map((t, i) => {
6276
6506
  const isUp = t.delta >= 0;
6277
6507
  const deltaColor = isUp ? colorUp : colorDown;
6278
6508
  const arrow = isUp ? "\u25B2" : "\u25BC";
@@ -6326,7 +6556,7 @@ function MapPinReadout({
6326
6556
  const yFor = (v) => pad + (Math.max(yMin, Math.min(yMax, v)) - yMin) / yRange * (viewH - pad * 2);
6327
6557
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-map-pin", "data-cdl-readout": id, children: [
6328
6558
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6329
- pins.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-map-pin-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
6559
+ pins.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("svg", { className: "cdl-ip-readout-map-pin-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: [
6330
6560
  /* @__PURE__ */ jsx("rect", { x: 0, y: 0, width: viewW, height: viewH, fill: "rgba(148,163,184,0.08)", stroke: "rgba(148,163,184,0.3)", strokeWidth: 1, rx: 4 }),
6331
6561
  [0.25, 0.5, 0.75].map((t) => /* @__PURE__ */ jsxs("g", { children: [
6332
6562
  /* @__PURE__ */ jsx("line", { x1: pad + (viewW - pad * 2) * t, x2: pad + (viewW - pad * 2) * t, y1: pad, y2: viewH - pad, stroke: "rgba(148,163,184,0.15)" }),
@@ -6354,9 +6584,9 @@ function PriorityBadgeReadout({
6354
6584
  if (p === "high" || p === "2") level = "high";
6355
6585
  else if (p === "low" || p === "0") level = "low";
6356
6586
  const spec = {
6357
- high: { icon: "\u25B2", color: "#ef4444", bg: "rgba(239,68,68,0.12)", text: "HIGH" },
6358
- med: { icon: "\u25CF", color: "#eab308", bg: "rgba(234,179,8,0.12)", text: "MED" },
6359
- low: { icon: "\u25BC", color: "#64748b", bg: "rgba(100,116,139,0.12)", text: "LOW" }
6587
+ high: { icon: "\u25B2", color: "#ef4444", bg: "rgba(239,68,68,0.12)", text: "readout.priority.high" },
6588
+ med: { icon: "\u25CF", color: "#eab308", bg: "rgba(234,179,8,0.12)", text: "readout.priority.med" },
6589
+ low: { icon: "\u25BC", color: "#64748b", bg: "rgba(100,116,139,0.12)", text: "readout.priority.low" }
6360
6590
  };
6361
6591
  const cur = spec[level];
6362
6592
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-priority-badge", "data-cdl-readout": id, "data-cdl-priority": level, children: [
@@ -6369,7 +6599,7 @@ function PriorityBadgeReadout({
6369
6599
  style: { background: cur.bg, borderColor: cur.color, color: cur.color },
6370
6600
  children: [
6371
6601
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-priority-badge-icon", children: cur.icon }),
6372
- /* @__PURE__ */ jsx("span", { children: cur.text })
6602
+ /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(\u5B57, { k: cur.text }) })
6373
6603
  ]
6374
6604
  }
6375
6605
  ),
@@ -6408,7 +6638,7 @@ function PodiumReadout({
6408
6638
  const order = [1, 0, 2];
6409
6639
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-podium", "data-cdl-readout": id, children: [
6410
6640
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6411
- podium.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-podium-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: order.map((rankIdx, colIdx) => {
6641
+ podium.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("svg", { className: "cdl-ip-readout-podium-svg", viewBox: `0 0 ${viewW} ${viewH}`, width: viewW, height: viewH, children: order.map((rankIdx, colIdx) => {
6412
6642
  const w = podium[rankIdx];
6413
6643
  if (!w) return null;
6414
6644
  const x = pad + colIdx * (colW + pad);
@@ -6451,7 +6681,7 @@ function PollBarReadout({
6451
6681
  const maxCount = options.length ? Math.max(...options.map((o) => o.count)) : 0;
6452
6682
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-poll-bar", "data-cdl-readout": id, children: [
6453
6683
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6454
- options.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-poll-bar-list", children: options.map((o, i) => {
6684
+ options.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-poll-bar-list", children: options.map((o, i) => {
6455
6685
  const pct = Math.round(o.count / total * 100);
6456
6686
  const isWinner = o.count === maxCount && maxCount > 0;
6457
6687
  const fillColor = isWinner ? colorWinner : color;
@@ -6486,6 +6716,7 @@ function UserStackReadout({
6486
6716
  max,
6487
6717
  size
6488
6718
  }) {
6719
+ const \u5F15\u304F = use\u5B57\u5F15();
6489
6720
  const names = safeParseArray(value).map(String);
6490
6721
  const shown = names.slice(0, max);
6491
6722
  const overflow = names.length > max;
@@ -6494,7 +6725,7 @@ function UserStackReadout({
6494
6725
  const initialsOf = (name) => name.split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0]?.toUpperCase() ?? "").join("") || "?";
6495
6726
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-user-stack", "data-cdl-readout": id, children: [
6496
6727
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6497
- shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-user-stack-row", children: [
6728
+ shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-user-stack-row", children: [
6498
6729
  shown.map((name, i) => /* @__PURE__ */ jsx(
6499
6730
  "span",
6500
6731
  {
@@ -6522,7 +6753,7 @@ function UserStackReadout({
6522
6753
  fontSize: `${Math.round(size * 0.35)}px`,
6523
6754
  marginLeft: `-${size * 0.3}px`
6524
6755
  },
6525
- title: `+${overflowCount} more`,
6756
+ title: \u5F15\u304F("readout.more", { n: overflowCount }),
6526
6757
  children: [
6527
6758
  "+",
6528
6759
  overflowCount
@@ -6557,7 +6788,7 @@ function CommitListReadout({
6557
6788
  const shown = commits.slice(0, max);
6558
6789
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-commit-list", "data-cdl-readout": id, children: [
6559
6790
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6560
- shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-commit-list-items", children: shown.map((c, i) => /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-commit-list-row", children: [
6791
+ shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-commit-list-items", children: shown.map((c, i) => /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-commit-list-row", children: [
6561
6792
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-commit-list-sha", style: { color }, children: c.sha }),
6562
6793
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-commit-list-msg", children: c.msg }),
6563
6794
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-commit-list-author", children: c.author })
@@ -6637,7 +6868,7 @@ function EventLogReadout({
6637
6868
  };
6638
6869
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-event-log", "data-cdl-readout": id, children: [
6639
6870
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6640
- shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-event-log-items", children: shown.map((e, i) => {
6871
+ shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-event-log-items", children: shown.map((e, i) => {
6641
6872
  const spec = severitySpec[e.severity] ?? severitySpec.info;
6642
6873
  return /* @__PURE__ */ jsxs(
6643
6874
  "li",
@@ -6680,7 +6911,7 @@ function SearchResultReadout({
6680
6911
  const shown = hits.slice(0, max);
6681
6912
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-search-result", "data-cdl-readout": id, children: [
6682
6913
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6683
- shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-search-result-items", children: shown.map((h, i) => /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-search-result-row", children: [
6914
+ shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-search-result-items", children: shown.map((h, i) => /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-search-result-row", children: [
6684
6915
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-search-result-title", style: { color }, children: h.title }),
6685
6916
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-search-result-snippet", children: h.snippet }),
6686
6917
  h.url ? /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-search-result-url", children: h.url }) : null
@@ -6713,7 +6944,7 @@ function RoadmapReadout({
6713
6944
  const colors = ["#2563eb", "#22c55e", "#eab308", "#a855f7"];
6714
6945
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-roadmap", "data-cdl-readout": id, style: { minWidth: `${viewW}px` }, children: [
6715
6946
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6716
- quarters.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-roadmap-row", style: { minHeight: `${viewH}px` }, children: quarters.map((q, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-roadmap-column", children: [
6947
+ quarters.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-roadmap-row", style: { minHeight: `${viewH}px` }, children: quarters.map((q, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-roadmap-column", children: [
6717
6948
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-roadmap-header", style: { background: colors[i % colors.length] }, children: q.quarter }),
6718
6949
  /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-roadmap-items", children: q.items.map((it, j) => /* @__PURE__ */ jsx("li", { className: "cdl-ip-readout-roadmap-item", children: it }, j)) })
6719
6950
  ] }, i)) })
@@ -6745,7 +6976,7 @@ function WeatherForecastReadout({
6745
6976
  }
6746
6977
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-weather-forecast", "data-cdl-readout": id, children: [
6747
6978
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6748
- days.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-weather-forecast-row", children: days.map((d, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-weather-forecast-day", children: [
6979
+ days.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-weather-forecast-row", children: days.map((d, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-weather-forecast-day", children: [
6749
6980
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-weather-forecast-name", children: d.day }),
6750
6981
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-weather-forecast-icon", children: d.icon }),
6751
6982
  /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-weather-forecast-high", children: [
@@ -6789,17 +7020,14 @@ function VideoCardReadout({
6789
7020
  const shown = videos.slice(0, max);
6790
7021
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-video-card", "data-cdl-readout": id, children: [
6791
7022
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6792
- shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-video-card-list", children: shown.map((v, i) => /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-video-card-row", children: [
7023
+ shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-video-card-list", children: shown.map((v, i) => /* @__PURE__ */ jsxs("li", { className: "cdl-ip-readout-video-card-row", children: [
6793
7024
  /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-video-card-thumb", style: { background: color }, children: [
6794
7025
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-video-card-thumb-icon", children: v.emoji }),
6795
7026
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-video-card-duration", children: v.duration })
6796
7027
  ] }),
6797
7028
  /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-video-card-info", children: [
6798
7029
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-video-card-title", children: v.title }),
6799
- /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-video-card-views", children: [
6800
- v.views,
6801
- " views"
6802
- ] })
7030
+ /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-video-card-views", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.videoCard.views", v: { v: v.views } }) })
6803
7031
  ] })
6804
7032
  ] }, i)) })
6805
7033
  ] });
@@ -6816,7 +7044,7 @@ function OrderStatusReadout({
6816
7044
  const safeCurrent = Number.isFinite(current) ? Math.max(0, Math.min(stepArr.length - 1, Math.round(current))) : 0;
6817
7045
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-order-status", "data-cdl-readout": id, "data-cdl-step": safeCurrent, children: [
6818
7046
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6819
- stepArr.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-order-status-list", children: stepArr.map((s, i) => {
7047
+ stepArr.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ul", { className: "cdl-ip-readout-order-status-list", children: stepArr.map((s, i) => {
6820
7048
  const isDone = i < safeCurrent;
6821
7049
  const isCurrent = i === safeCurrent;
6822
7050
  const isPending = i > safeCurrent;
@@ -6866,9 +7094,9 @@ function AttendanceGridReadout({
6866
7094
  const memberArr = safeParseArray(members).map(String);
6867
7095
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-attendance-grid", "data-cdl-readout": id, children: [
6868
7096
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6869
- rows.length === 0 || memberArr.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("table", { className: "cdl-ip-readout-attendance-grid-table", children: [
7097
+ rows.length === 0 || memberArr.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("table", { className: "cdl-ip-readout-attendance-grid-table", children: [
6870
7098
  /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
6871
- /* @__PURE__ */ jsx("th", { className: "cdl-ip-readout-attendance-grid-corner", children: "day" }),
7099
+ /* @__PURE__ */ jsx("th", { className: "cdl-ip-readout-attendance-grid-corner", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.attendance.corner" }) }),
6872
7100
  memberArr.map((m, i) => /* @__PURE__ */ jsx("th", { className: "cdl-ip-readout-attendance-grid-member", children: m }, i))
6873
7101
  ] }) }),
6874
7102
  /* @__PURE__ */ jsx("tbody", { children: rows.map((r, i) => /* @__PURE__ */ jsxs("tr", { children: [
@@ -6922,7 +7150,7 @@ function TimezoneClockReadout({
6922
7150
  }
6923
7151
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-timezone-clock", "data-cdl-readout": id, children: [
6924
7152
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6925
- clocks.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-timezone-clock-row", children: clocks.map((c, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-timezone-clock-cell", children: [
7153
+ clocks.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-timezone-clock-row", children: clocks.map((c, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-timezone-clock-cell", children: [
6926
7154
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-timezone-clock-city", children: c.city }),
6927
7155
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-timezone-clock-time", style: { color }, children: c.time }),
6928
7156
  /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-timezone-clock-offset", children: [
@@ -6956,7 +7184,7 @@ function FormSummaryReadout({
6956
7184
  }
6957
7185
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-form-summary", "data-cdl-readout": id, children: [
6958
7186
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6959
- fields.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("dl", { className: "cdl-ip-readout-form-summary-list", children: fields.map((f, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-form-summary-row", children: [
7187
+ fields.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("dl", { className: "cdl-ip-readout-form-summary-list", children: fields.map((f, i) => /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-form-summary-row", children: [
6960
7188
  /* @__PURE__ */ jsx("dt", { className: "cdl-ip-readout-form-summary-key", children: f.name }),
6961
7189
  /* @__PURE__ */ jsx("dd", { className: "cdl-ip-readout-form-summary-value", style: { color }, children: f.value })
6962
7190
  ] }, i)) })
@@ -6989,7 +7217,7 @@ function SongQueueReadout({
6989
7217
  const safeCurrent = Number.isFinite(current) ? Math.round(current) : -1;
6990
7218
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-song-queue", "data-cdl-readout": id, "data-cdl-current": safeCurrent, children: [
6991
7219
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
6992
- shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsx("ol", { className: "cdl-ip-readout-song-queue-list", children: shown.map((s, i) => {
7220
+ shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsx("ol", { className: "cdl-ip-readout-song-queue-list", children: shown.map((s, i) => {
6993
7221
  const isCurrent = i === safeCurrent;
6994
7222
  return /* @__PURE__ */ jsxs(
6995
7223
  "li",
@@ -7034,12 +7262,20 @@ function CalendarMonthReadout({
7034
7262
  } catch {
7035
7263
  }
7036
7264
  }
7037
- const weekDays = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
7265
+ const weekDays = [
7266
+ "readout.weekday.0",
7267
+ "readout.weekday.1",
7268
+ "readout.weekday.2",
7269
+ "readout.weekday.3",
7270
+ "readout.weekday.4",
7271
+ "readout.weekday.5",
7272
+ "readout.weekday.6"
7273
+ ];
7038
7274
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-calendar-month", "data-cdl-readout": id, children: [
7039
7275
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
7040
- days.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-calendar-month-widget", children: [
7276
+ days.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-calendar-month-widget", children: [
7041
7277
  monthName ? /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-calendar-month-header", children: monthName }) : null,
7042
- /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-calendar-month-weekdays", children: weekDays.map((w) => /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-calendar-month-weekday", children: w }, w)) }),
7278
+ /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-calendar-month-weekdays", children: weekDays.map((w) => /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-calendar-month-weekday", children: /* @__PURE__ */ jsx(\u5B57, { k: w }) }, w)) }),
7043
7279
  /* @__PURE__ */ jsx("div", { className: "cdl-ip-readout-calendar-month-grid", children: days.map((d, i) => /* @__PURE__ */ jsxs(
7044
7280
  "div",
7045
7281
  {
@@ -7082,7 +7318,7 @@ function TerminalReadout({
7082
7318
  const shown = lines.slice(0, max);
7083
7319
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-terminal", "data-cdl-readout": id, children: [
7084
7320
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-label", children: label }),
7085
- shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: "empty" }) : /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-terminal-window", children: [
7321
+ shown.length === 0 ? /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-array-bar-empty", children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.empty" }) }) : /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-terminal-window", children: [
7086
7322
  /* @__PURE__ */ jsxs("div", { className: "cdl-ip-readout-terminal-titlebar", children: [
7087
7323
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-terminal-dot", style: { background: "#ef4444" } }),
7088
7324
  /* @__PURE__ */ jsx("span", { className: "cdl-ip-readout-terminal-dot", style: { background: "#eab308" } }),
@@ -7181,10 +7417,11 @@ function KanbanBoardReadout({
7181
7417
  columnWidth,
7182
7418
  max
7183
7419
  }) {
7420
+ const \u5F15\u304F = use\u5B57\u5F15();
7184
7421
  const buckets = {
7185
- todo: { key: "todo", label: "Todo", color: "#94a3b8", tasks: [] },
7186
- inprogress: { key: "inprogress", label: "In Progress", color: "#2563eb", tasks: [] },
7187
- done: { key: "done", label: "Done", color: "#22c55e", tasks: [] }
7422
+ todo: { key: "todo", label: \u5F15\u304F("readout.kanban.todo"), color: "#94a3b8", tasks: [] },
7423
+ inprogress: { key: "inprogress", label: \u5F15\u304F("readout.kanban.inprogress"), color: "#2563eb", tasks: [] },
7424
+ done: { key: "done", label: \u5F15\u304F("readout.kanban.done"), color: "#22c55e", tasks: [] }
7188
7425
  };
7189
7426
  const trimmed = value.trim();
7190
7427
  if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
@@ -7301,7 +7538,7 @@ function KanbanBoardReadout({
7301
7538
  )
7302
7539
  ] }, ti);
7303
7540
  }),
7304
- overflow > 0 ? /* @__PURE__ */ jsxs(
7541
+ overflow > 0 ? /* @__PURE__ */ jsx(
7305
7542
  "text",
7306
7543
  {
7307
7544
  x: x + columnWidth / 2,
@@ -7310,11 +7547,7 @@ function KanbanBoardReadout({
7310
7547
  textAnchor: "middle",
7311
7548
  fill: "#64748b",
7312
7549
  style: { userSelect: "none" },
7313
- children: [
7314
- "+",
7315
- overflow,
7316
- " more"
7317
- ]
7550
+ children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.more", v: { n: overflow } })
7318
7551
  }
7319
7552
  ) : null
7320
7553
  ] }, k);
@@ -7871,7 +8104,7 @@ function UserPresenceReadout({
7871
8104
  )
7872
8105
  ] }, i);
7873
8106
  }),
7874
- overflow > 0 ? /* @__PURE__ */ jsxs(
8107
+ overflow > 0 ? /* @__PURE__ */ jsx(
7875
8108
  "text",
7876
8109
  {
7877
8110
  x: width / 2,
@@ -7880,11 +8113,7 @@ function UserPresenceReadout({
7880
8113
  textAnchor: "middle",
7881
8114
  fill: "#64748b",
7882
8115
  style: { userSelect: "none" },
7883
- children: [
7884
- "+",
7885
- overflow,
7886
- " more"
7887
- ]
8116
+ children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.more", v: { n: overflow } })
7888
8117
  }
7889
8118
  ) : null
7890
8119
  ]
@@ -7935,12 +8164,7 @@ function RatingThumbReadout({
7935
8164
  "\u25B2 ",
7936
8165
  upCount
7937
8166
  ] }),
7938
- /* @__PURE__ */ jsxs("text", { x: width / 2, y: 20, fontSize: 11, textAnchor: "middle", fill: "#64748b", style: { userSelect: "none" }, children: [
7939
- upPct,
7940
- "% up \xB7 ",
7941
- total,
7942
- " votes"
7943
- ] }),
8167
+ /* @__PURE__ */ jsx("text", { x: width / 2, y: 20, fontSize: 11, textAnchor: "middle", fill: "#64748b", style: { userSelect: "none" }, children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.ratingThumb.summary", v: { pct: upPct, total } }) }),
7944
8168
  /* @__PURE__ */ jsxs(
7945
8169
  "text",
7946
8170
  {
@@ -8115,11 +8339,7 @@ function KpiTrendTileReadout({
8115
8339
  deltaPct.toFixed(1),
8116
8340
  "%)"
8117
8341
  ] }),
8118
- /* @__PURE__ */ jsxs("text", { x: 12, y: 78, fontSize: 10, fill: "#64748b", style: { userSelect: "none" }, children: [
8119
- "prev ",
8120
- prev,
8121
- unit
8122
- ] }),
8342
+ /* @__PURE__ */ jsx("text", { x: 12, y: 78, fontSize: 10, fill: "#64748b", style: { userSelect: "none" }, children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.kpiTrend.prev", v: { v: `${prev}${unit}` } }) }),
8123
8343
  history.length > 1 ? /* @__PURE__ */ jsx("polyline", { points, fill: "none", stroke: arrowColor, strokeWidth: 2 }) : null
8124
8344
  ]
8125
8345
  }
@@ -8207,7 +8427,7 @@ function QuickPollEmojiReadout({
8207
8427
  )
8208
8428
  ] }, i);
8209
8429
  }),
8210
- /* @__PURE__ */ jsxs(
8430
+ /* @__PURE__ */ jsx(
8211
8431
  "text",
8212
8432
  {
8213
8433
  x: width - 8,
@@ -8216,10 +8436,7 @@ function QuickPollEmojiReadout({
8216
8436
  textAnchor: "end",
8217
8437
  fill: "#64748b",
8218
8438
  style: { userSelect: "none" },
8219
- children: [
8220
- "total ",
8221
- total
8222
- ]
8439
+ children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.poll.total", v: { n: total } })
8223
8440
  }
8224
8441
  )
8225
8442
  ]
@@ -8354,14 +8571,8 @@ function ThreadSummaryReadout({
8354
8571
  height,
8355
8572
  children: [
8356
8573
  /* @__PURE__ */ jsx("rect", { x: 0, y: 0, width, height, fill: "#f8fafc", rx: 6 }),
8357
- /* @__PURE__ */ jsxs("text", { x: 12, y: 22, fontSize: 12, fontWeight: 600, fill: "#0f172a", style: { userSelect: "none" }, children: [
8358
- participants,
8359
- " participants"
8360
- ] }),
8361
- /* @__PURE__ */ jsxs("text", { x: 12, y: 42, fontSize: 11, fill: "#334155", style: { userSelect: "none" }, children: [
8362
- "last: ",
8363
- lastAuthor
8364
- ] }),
8574
+ /* @__PURE__ */ jsx("text", { x: 12, y: 22, fontSize: 12, fontWeight: 600, fill: "#0f172a", style: { userSelect: "none" }, children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.thread.participants", v: { n: participants } }) }),
8575
+ /* @__PURE__ */ jsx("text", { x: 12, y: 42, fontSize: 11, fill: "#334155", style: { userSelect: "none" }, children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.thread.last", v: { name: lastAuthor } }) }),
8365
8576
  /* @__PURE__ */ jsx("text", { x: 12, y: 60, fontSize: 10, fill: "#64748b", style: { userSelect: "none" }, children: timeAgo }),
8366
8577
  unread > 0 ? /* @__PURE__ */ jsxs("g", { "data-cdl-thread-unread": "1", children: [
8367
8578
  /* @__PURE__ */ jsx("circle", { cx: width - 24, cy: 26, r: 14, fill: colorUnread }),
@@ -8392,7 +8603,7 @@ function ReadReceiptReadout({
8392
8603
  colorPending
8393
8604
  }) {
8394
8605
  const status = Number.isFinite(value) ? Math.max(0, Math.min(2, Math.floor(value))) : 0;
8395
- const labelText = status === 0 ? "sent" : status === 1 ? "delivered" : "read";
8606
+ const labelKey = status === 0 ? "readout.readReceipt.sent" : status === 1 ? "readout.readReceipt.delivered" : "readout.readReceipt.read";
8396
8607
  const iconColor = status === 2 ? colorRead : colorPending;
8397
8608
  const width = 180;
8398
8609
  const height = 32;
@@ -8427,7 +8638,7 @@ function ReadReceiptReadout({
8427
8638
  }
8428
8639
  ) : null
8429
8640
  ] }),
8430
- /* @__PURE__ */ jsx("text", { x: 52, y: height / 2 + 4, fontSize: 11, fontWeight: 600, fill: iconColor, style: { userSelect: "none" }, children: labelText })
8641
+ /* @__PURE__ */ jsx("text", { x: 52, y: height / 2 + 4, fontSize: 11, fontWeight: 600, fill: iconColor, style: { userSelect: "none" }, children: /* @__PURE__ */ jsx(\u5B57, { k: labelKey }) })
8431
8642
  ]
8432
8643
  }
8433
8644
  )
@@ -8441,7 +8652,7 @@ function PasswordStrengthReadout({
8441
8652
  colorWeak
8442
8653
  }) {
8443
8654
  const level = Number.isFinite(value) ? Math.max(0, Math.min(4, Math.floor(value))) : 0;
8444
- const labels = ["too weak", "weak", "fair", "good", "strong"];
8655
+ const labels = ["readout.password.0", "readout.password.1", "readout.password.2", "readout.password.3", "readout.password.4"];
8445
8656
  const colors = [colorWeak, "#f97316", "#eab308", "#84cc16", colorStrong];
8446
8657
  const barW = 46;
8447
8658
  const gap = 6;
@@ -8485,7 +8696,7 @@ function PasswordStrengthReadout({
8485
8696
  textAnchor: "end",
8486
8697
  fill: level > 0 ? colors[level] ?? colorStrong : "#94a3b8",
8487
8698
  style: { userSelect: "none" },
8488
- children: labels[level]
8699
+ children: /* @__PURE__ */ jsx(\u5B57, { k: labels[level] })
8489
8700
  }
8490
8701
  )
8491
8702
  ]
@@ -8620,7 +8831,7 @@ function FileDropzoneReadout({
8620
8831
  /* @__PURE__ */ jsx("title", { children: filename }),
8621
8832
  filename.length > 26 ? `${filename.slice(0, 25)}\u2026` : filename
8622
8833
  ] }),
8623
- /* @__PURE__ */ jsx("text", { x: 54, y: 50, fontSize: 10, fill: "#64748b", style: { userSelect: "none" }, children: "uploaded" })
8834
+ /* @__PURE__ */ jsx("text", { x: 54, y: 50, fontSize: 10, fill: "#64748b", style: { userSelect: "none" }, children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.dropzone.uploaded" }) })
8624
8835
  ] }) : /* @__PURE__ */ jsxs("g", { "data-cdl-dropzone-empty": "1", children: [
8625
8836
  /* @__PURE__ */ jsx(
8626
8837
  "text",
@@ -8632,7 +8843,7 @@ function FileDropzoneReadout({
8632
8843
  textAnchor: "middle",
8633
8844
  fill: "#64748b",
8634
8845
  style: { userSelect: "none" },
8635
- children: "\u2B06 Drop file here"
8846
+ children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.dropzone.drop" })
8636
8847
  }
8637
8848
  ),
8638
8849
  /* @__PURE__ */ jsx(
@@ -8644,7 +8855,7 @@ function FileDropzoneReadout({
8644
8855
  textAnchor: "middle",
8645
8856
  fill: "#94a3b8",
8646
8857
  style: { userSelect: "none" },
8647
- children: "or click to browse"
8858
+ children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.dropzone.browse" })
8648
8859
  }
8649
8860
  )
8650
8861
  ] })
@@ -8679,7 +8890,7 @@ function LogStreamReadout({
8679
8890
  }
8680
8891
  }
8681
8892
  const shown = rows.slice(-5);
8682
- const levelLabels = ["DBG", "INF", "WRN", "ERR"];
8893
+ const levelLabels = ["readout.log.0", "readout.log.1", "readout.log.2", "readout.log.3"];
8683
8894
  const levelColors = ["#94a3b8", "#2563eb", "#f97316", "#ef4444"];
8684
8895
  const width = 300;
8685
8896
  const rowH = 18;
@@ -8712,7 +8923,7 @@ function LogStreamReadout({
8712
8923
  fill: "#ffffff",
8713
8924
  fontFamily: "monospace",
8714
8925
  style: { userSelect: "none" },
8715
- children: levelLabels[r.level] ?? "INF"
8926
+ children: /* @__PURE__ */ jsx(\u5B57, { k: levelLabels[r.level] ?? "readout.log.1" })
8716
8927
  }
8717
8928
  ),
8718
8929
  /* @__PURE__ */ jsxs("text", { x: 94, y: y + 12, fontSize: 10, fill: "#e2e8f0", fontFamily: "monospace", style: { userSelect: "none" }, children: [
@@ -8906,10 +9117,10 @@ function CartSummaryReadout({
8906
9117
  if (!Number.isFinite(shipping)) shipping = 0;
8907
9118
  if (!Number.isFinite(total)) total = 0;
8908
9119
  const rows = [
8909
- { l: "Items", v: `${items}`, bold: false },
8910
- { l: "Subtotal", v: `${currency}${subtotal.toFixed(2)}`, bold: false },
8911
- { l: "Shipping", v: `${currency}${shipping.toFixed(2)}`, bold: false },
8912
- { l: "Total", v: `${currency}${total.toFixed(2)}`, bold: true }
9120
+ { l: "readout.cart.items", v: `${items}`, bold: false },
9121
+ { l: "readout.cart.subtotal", v: `${currency}${subtotal.toFixed(2)}`, bold: false },
9122
+ { l: "readout.cart.shipping", v: `${currency}${shipping.toFixed(2)}`, bold: false },
9123
+ { l: "readout.cart.total", v: `${currency}${total.toFixed(2)}`, bold: true }
8913
9124
  ];
8914
9125
  const width = 260;
8915
9126
  const rowH = 20;
@@ -8939,7 +9150,7 @@ function CartSummaryReadout({
8939
9150
  fontWeight: isTotal ? 700 : 500,
8940
9151
  fill: isTotal ? colorTotal : "#334155",
8941
9152
  style: { userSelect: "none" },
8942
- children: r.l
9153
+ children: /* @__PURE__ */ jsx(\u5B57, { k: r.l })
8943
9154
  }
8944
9155
  ),
8945
9156
  /* @__PURE__ */ jsx(
@@ -8987,6 +9198,8 @@ function PricingTierReadout({
8987
9198
  }
8988
9199
  }
8989
9200
  if (!Number.isFinite(price)) price = 0;
9201
+ const \u5F15\u304F = use\u5B57\u5F15();
9202
+ const \u898B\u305B\u308B\u540D\u524D = planName || \u5F15\u304F("readout.pricing.plan");
8990
9203
  const width = 240;
8991
9204
  const height = 176;
8992
9205
  return /* @__PURE__ */ jsxs("div", { className: "cdl-ip-item cdl-ip-readout-pricing-tier", "data-cdl-readout": id, children: [
@@ -9011,7 +9224,7 @@ function PricingTierReadout({
9011
9224
  textAnchor: "middle",
9012
9225
  fill: "#ffffff",
9013
9226
  style: { userSelect: "none" },
9014
- children: planName || "Plan"
9227
+ children: \u898B\u305B\u308B\u540D\u524D
9015
9228
  }
9016
9229
  ),
9017
9230
  /* @__PURE__ */ jsxs(
@@ -9039,7 +9252,7 @@ function PricingTierReadout({
9039
9252
  textAnchor: "middle",
9040
9253
  fill: "#64748b",
9041
9254
  style: { userSelect: "none" },
9042
- children: "per month"
9255
+ children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.pricing.perMonth" })
9043
9256
  }
9044
9257
  ),
9045
9258
  features.slice(0, 3).map((f, i) => {
@@ -9054,7 +9267,7 @@ function PricingTierReadout({
9054
9267
  ] }, i);
9055
9268
  }),
9056
9269
  /* @__PURE__ */ jsx("rect", { x: 16, y: 150, width: width - 32, height: 20, fill: colorAccent, rx: 4 }),
9057
- /* @__PURE__ */ jsxs(
9270
+ /* @__PURE__ */ jsx(
9058
9271
  "text",
9059
9272
  {
9060
9273
  x: width / 2,
@@ -9064,10 +9277,7 @@ function PricingTierReadout({
9064
9277
  textAnchor: "middle",
9065
9278
  fill: "#ffffff",
9066
9279
  style: { userSelect: "none" },
9067
- children: [
9068
- "Get ",
9069
- planName || "Plan"
9070
- ]
9280
+ children: \u5F15\u304F("readout.pricing.get", { name: \u898B\u305B\u308B\u540D\u524D })
9071
9281
  }
9072
9282
  )
9073
9283
  ]
@@ -9133,12 +9343,12 @@ function CouponCodeReadout({
9133
9343
  fill: applied ? colorApplied : "#94a3b8",
9134
9344
  fontFamily: "monospace",
9135
9345
  style: { userSelect: "none" },
9136
- children: code || "ENTER CODE"
9346
+ children: code || /* @__PURE__ */ jsx(\u5B57, { k: "readout.coupon.placeholder" })
9137
9347
  }
9138
9348
  ),
9139
9349
  applied ? /* @__PURE__ */ jsxs("g", { "data-cdl-coupon-applied": "1", children: [
9140
9350
  /* @__PURE__ */ jsx("rect", { x: boxW + 12, y: 10, width: 90, height: height - 20, fill: colorApplied, rx: 4 }),
9141
- /* @__PURE__ */ jsxs(
9351
+ /* @__PURE__ */ jsx(
9142
9352
  "text",
9143
9353
  {
9144
9354
  x: boxW + 57,
@@ -9148,11 +9358,7 @@ function CouponCodeReadout({
9148
9358
  textAnchor: "middle",
9149
9359
  fill: "#ffffff",
9150
9360
  style: { userSelect: "none" },
9151
- children: [
9152
- "-",
9153
- discountPct,
9154
- "% off"
9155
- ]
9361
+ children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.coupon.off", v: { pct: discountPct } })
9156
9362
  }
9157
9363
  )
9158
9364
  ] }) : /* @__PURE__ */ jsxs("g", { "data-cdl-coupon-empty": "1", children: [
@@ -9167,7 +9373,7 @@ function CouponCodeReadout({
9167
9373
  textAnchor: "middle",
9168
9374
  fill: "#ffffff",
9169
9375
  style: { userSelect: "none" },
9170
- children: "Apply"
9376
+ children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.coupon.apply" })
9171
9377
  }
9172
9378
  )
9173
9379
  ] })
@@ -9247,10 +9453,7 @@ function ArticlePreviewReadout({
9247
9453
  excerpt.length > 28 ? `${excerpt.slice(0, 27)}\u2026` : excerpt
9248
9454
  ] }),
9249
9455
  /* @__PURE__ */ jsx("text", { x: thumbW + 20, y: 60, fontSize: 10, fill: "#334155", style: { userSelect: "none" }, children: excerpt.length > 56 ? `${excerpt.slice(28, 55)}\u2026` : excerpt.slice(28, 56) }),
9250
- /* @__PURE__ */ jsxs("text", { x: thumbW + 20, y: height - 14, fontSize: 10, fontWeight: 600, fill: "#64748b", style: { userSelect: "none" }, children: [
9251
- "by ",
9252
- author
9253
- ] }),
9456
+ /* @__PURE__ */ jsx("text", { x: thumbW + 20, y: height - 14, fontSize: 10, fontWeight: 600, fill: "#64748b", style: { userSelect: "none" }, children: /* @__PURE__ */ jsx(\u5B57, { k: "readout.article.by", v: { author } }) }),
9254
9457
  /* @__PURE__ */ jsx("text", { x: width - 8, y: height - 14, fontSize: 10, textAnchor: "end", fill: "#94a3b8", style: { userSelect: "none" }, children: timeAgo })
9255
9458
  ]
9256
9459
  }
@@ -23551,12 +23754,12 @@ function \u5272\u308B\u5019\u88DC(text) {
23551
23754
  \u7A7A\u767D.push([text.slice(0, m.index).trim(), text.slice(m.index + m[0].length).trim()]);
23552
23755
  }
23553
23756
  if (\u7A7A\u767D.length > 0) return \u7A7A\u767D.filter(\u5165\u3063\u3066\u3044\u308B);
23554
- const \u5B57 = [];
23757
+ const \u5B572 = [];
23555
23758
  const \u4E26\u3073 = [...text];
23556
23759
  for (let i = 1; i < \u4E26\u3073.length; i += 1) {
23557
- \u5B57.push([\u4E26\u3073.slice(0, i).join(""), \u4E26\u3073.slice(i).join("")]);
23760
+ \u5B572.push([\u4E26\u3073.slice(0, i).join(""), \u4E26\u3073.slice(i).join("")]);
23558
23761
  }
23559
- return \u5B57.filter(\u5165\u3063\u3066\u3044\u308B);
23762
+ return \u5B572.filter(\u5165\u3063\u3066\u3044\u308B);
23560
23763
  }
23561
23764
  function \u5165\u3063\u3066\u3044\u308B([\u5DE6, \u53F3]) {
23562
23765
  return \u5DE6 !== "" && \u53F3 !== "";
@@ -25915,9 +26118,9 @@ function \u533A\u753B\u306E\u5272\u4ED8(w, h, \u4EF6\u6570, \u524D\u3092\u51FA\u
25915
26118
  \u67A0: (idx) => ({ x: \u5E45 * idx, y: 0, w: \u5E45, h })
25916
26119
  };
25917
26120
  }
25918
- function \u53CE\u3081\u308B\u7D1A(\u5B57, \u4F7F\u3048\u308B\u5E452, \u521D\u671F, \u4E0B\u9650) {
26121
+ function \u53CE\u3081\u308B\u7D1A(\u5B572, \u4F7F\u3048\u308B\u5E452, \u521D\u671F, \u4E0B\u9650) {
25919
26122
  let \u7D1A = \u521D\u671F;
25920
- while (\u7D1A > \u4E0B\u9650 && textWidth(\u5B57, \u7D1A) > \u4F7F\u3048\u308B\u5E452) \u7D1A -= 1;
26123
+ while (\u7D1A > \u4E0B\u9650 && textWidth(\u5B572, \u7D1A) > \u4F7F\u3048\u308B\u5E452) \u7D1A -= 1;
25921
26124
  return \u7D1A;
25922
26125
  }
25923
26126
  function \u5F27\u306E\u90533(cx, cy, r, \u5272\u5408) {