@squadbase/vantage 0.6.2-dev1.b332e5a → 0.6.2-dev1.d7c0911

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.
Files changed (212) hide show
  1. package/dist/add-4GHF2TX2.js +6 -0
  2. package/dist/add-4GHF2TX2.js.map +1 -0
  3. package/dist/{build-TVKFIVFQ.js → build-X5NVCQKT.js} +7 -7
  4. package/dist/{build-TVKFIVFQ.js.map → build-X5NVCQKT.js.map} +1 -1
  5. package/dist/{check-3KHZXZMQ.js → check-ZBIH422T.js} +5 -5
  6. package/dist/{check-3KHZXZMQ.js.map → check-ZBIH422T.js.map} +1 -1
  7. package/dist/chunk-2ICNHUG6.js +1820 -0
  8. package/dist/chunk-2ICNHUG6.js.map +1 -0
  9. package/dist/{chunk-5ZOP4SQR.js → chunk-2N72FKLB.js} +12 -7
  10. package/dist/chunk-2N72FKLB.js.map +1 -0
  11. package/dist/{chunk-P7W4LR3Z.js → chunk-7DZGJQ3P.js} +3 -3
  12. package/dist/{chunk-P7W4LR3Z.js.map → chunk-7DZGJQ3P.js.map} +1 -1
  13. package/dist/{chunk-U2M6HGKQ.js → chunk-AABMKHEU.js} +4 -4
  14. package/dist/{chunk-U2M6HGKQ.js.map → chunk-AABMKHEU.js.map} +1 -1
  15. package/dist/{chunk-QI3XQKHS.js → chunk-GNXCX4WE.js} +10 -3
  16. package/dist/chunk-GNXCX4WE.js.map +1 -0
  17. package/dist/{chunk-PXRX5PEC.js → chunk-PDOBHMUQ.js} +3 -3
  18. package/dist/chunk-PDOBHMUQ.js.map +1 -0
  19. package/dist/{chunk-ZVANIULZ.js → chunk-RNTDBX6S.js} +4 -4
  20. package/dist/{chunk-ZVANIULZ.js.map → chunk-RNTDBX6S.js.map} +1 -1
  21. package/dist/{chunk-A2UUGASH.js → chunk-U736PVHY.js} +2 -2
  22. package/dist/chunk-U736PVHY.js.map +1 -0
  23. package/dist/{chunk-PVTHHV7X.js → chunk-V3LF7BE7.js} +27 -5
  24. package/dist/chunk-V3LF7BE7.js.map +1 -0
  25. package/dist/{chunk-LMUACBMA.js → chunk-WAMZWZJB.js} +53 -8
  26. package/dist/chunk-WAMZWZJB.js.map +1 -0
  27. package/dist/chunk-WRSX2MDK.js +7866 -0
  28. package/dist/chunk-WRSX2MDK.js.map +1 -0
  29. package/dist/{chunk-RPZAALCX.js → chunk-XPQSTZUU.js} +254 -164
  30. package/dist/chunk-XPQSTZUU.js.map +1 -0
  31. package/dist/{chunk-DTDVSFRY.js → chunk-XQUSGIDG.js} +17 -3
  32. package/dist/chunk-XQUSGIDG.js.map +1 -0
  33. package/dist/cli.js +12 -11
  34. package/dist/cli.js.map +1 -1
  35. package/dist/client/index.d.ts +32 -3
  36. package/dist/client/index.js +205 -12
  37. package/dist/client/index.js.map +1 -1
  38. package/dist/components/index.d.ts +1975 -28
  39. package/dist/components/index.js +4 -4
  40. package/dist/{dev-GDKATCC7.js → dev-4XEDTELV.js} +8 -8
  41. package/dist/dev-4XEDTELV.js.map +1 -0
  42. package/dist/doc/index.js +2 -2
  43. package/dist/doc/index.js.map +1 -1
  44. package/dist/{docs-EJJ3BECT.js → docs-JVP4RPKT.js} +3 -3
  45. package/dist/{docs-EJJ3BECT.js.map → docs-JVP4RPKT.js.map} +1 -1
  46. package/dist/{doctor-WQXPXP6K.js → doctor-5E2VEZPK.js} +5 -5
  47. package/dist/{doctor-WQXPXP6K.js.map → doctor-5E2VEZPK.js.map} +1 -1
  48. package/dist/markdown/index.js +1 -1
  49. package/dist/markdown/index.js.map +1 -1
  50. package/dist/{preview-OGMCNQUO.js → preview-T6CLSQVX.js} +3 -3
  51. package/dist/{preview-OGMCNQUO.js.map → preview-T6CLSQVX.js.map} +1 -1
  52. package/dist/query/index.d.ts +0 -11
  53. package/dist/query/index.js +2 -2
  54. package/dist/{routes-MWBWWOJ2.js → routes-3SGAFDMC.js} +4 -4
  55. package/dist/{routes-MWBWWOJ2.js.map → routes-3SGAFDMC.js.map} +1 -1
  56. package/dist/{search-6Y422SV6.js → search-5LC4XPB5.js} +3 -3
  57. package/dist/{search-6Y422SV6.js.map → search-5LC4XPB5.js.map} +1 -1
  58. package/dist/table/index.js +10 -9
  59. package/dist/table/index.js.map +1 -1
  60. package/dist/ui/index.d.ts +144 -11
  61. package/dist/ui/index.js +1339 -87
  62. package/dist/ui/index.js.map +1 -1
  63. package/dist/{upgrade-HCANX4GQ.js → upgrade-JHXZBGQS.js} +6 -6
  64. package/dist/{upgrade-HCANX4GQ.js.map → upgrade-JHXZBGQS.js.map} +1 -1
  65. package/dist/vite/index.d.ts +10 -0
  66. package/dist/vite/index.js +3 -3
  67. package/docs/en/components.md +29 -15
  68. package/docs/en/parts/data-table.md +22 -0
  69. package/docs/en/parts/delta.md +50 -0
  70. package/docs/en/parts/format.md +43 -0
  71. package/docs/en/parts/kpi-card.md +57 -0
  72. package/docs/en/parts/metric-value.md +3 -2
  73. package/docs/en/parts/sparkline.md +1 -1
  74. package/docs/en/parts/trend-indicator.md +17 -1
  75. package/docs/en/ui-and-theming.md +1 -1
  76. package/docs/index.json +366 -76
  77. package/docs/ja/changelog.md +31 -0
  78. package/docs/ja/components.md +57 -101
  79. package/docs/ja/page-types/csv.md +83 -0
  80. package/docs/ja/page-types/doc.md +83 -0
  81. package/docs/ja/page-types/excel.md +82 -0
  82. package/docs/ja/page-types/slide.md +132 -0
  83. package/docs/ja/page-types.md +47 -0
  84. package/docs/ja/parts/area-chart.md +61 -0
  85. package/docs/ja/parts/bar-chart.md +69 -0
  86. package/docs/ja/parts/bar-list.md +35 -0
  87. package/docs/ja/parts/category-bar.md +36 -0
  88. package/docs/ja/parts/data-table.md +22 -0
  89. package/docs/ja/parts/delta.md +50 -0
  90. package/docs/ja/parts/donut-chart.md +47 -0
  91. package/docs/ja/parts/echart.md +3 -0
  92. package/docs/ja/parts/format.md +44 -0
  93. package/docs/ja/parts/kpi-card.md +55 -0
  94. package/docs/ja/parts/line-chart.md +58 -0
  95. package/docs/ja/parts/metric-value.md +3 -2
  96. package/docs/ja/parts/progress-circle.md +34 -0
  97. package/docs/ja/parts/sparkline.md +2 -2
  98. package/docs/ja/parts/tracker.md +32 -0
  99. package/docs/ja/parts/trend-indicator.md +17 -1
  100. package/docs/ja/routing.md +8 -86
  101. package/docs/ja/ui/alert-dialog.md +41 -0
  102. package/docs/ja/ui/avatar.md +31 -0
  103. package/docs/ja/ui/combobox.md +74 -0
  104. package/docs/ja/ui/drawer.md +41 -0
  105. package/docs/ja/ui/field.md +42 -0
  106. package/docs/ja/ui/hover-card.md +21 -0
  107. package/docs/ja/ui/kbd.md +16 -0
  108. package/docs/ja/ui/pagination.md +36 -0
  109. package/docs/ja/ui/radio-group.md +21 -0
  110. package/docs/ja/ui/toast.md +46 -0
  111. package/docs/ja/ui-and-theming.md +14 -7
  112. package/package.json +13 -4
  113. package/registry/ui/accordion.tsx +76 -0
  114. package/registry/ui/alert-dialog.tsx +189 -0
  115. package/registry/ui/alert.tsx +80 -0
  116. package/registry/ui/app-shell.tsx +287 -0
  117. package/registry/ui/area-chart.tsx +3639 -0
  118. package/registry/ui/avatar.tsx +110 -0
  119. package/registry/ui/badge.tsx +56 -0
  120. package/registry/ui/bar-chart.tsx +3636 -0
  121. package/registry/ui/bar-list.tsx +3680 -0
  122. package/registry/ui/breadcrumb.tsx +128 -0
  123. package/registry/ui/button.tsx +62 -0
  124. package/registry/ui/calendar.tsx +223 -0
  125. package/registry/ui/card.tsx +107 -0
  126. package/registry/ui/category-bar.tsx +1255 -0
  127. package/registry/ui/chart-frame.tsx +1358 -0
  128. package/registry/ui/checkbox.tsx +30 -0
  129. package/registry/ui/collapsible.tsx +23 -0
  130. package/registry/ui/combobox.tsx +310 -0
  131. package/registry/ui/command.tsx +198 -0
  132. package/registry/ui/dashboard-card.tsx +217 -0
  133. package/registry/ui/data-table.tsx +693 -146
  134. package/registry/ui/date-range-picker.tsx +390 -0
  135. package/registry/ui/delta.tsx +188 -0
  136. package/registry/ui/dialog.tsx +161 -0
  137. package/registry/ui/donut-chart.tsx +3688 -0
  138. package/registry/ui/drawer.tsx +229 -0
  139. package/registry/ui/dropdown-menu.tsx +274 -0
  140. package/registry/ui/echart.tsx +890 -0
  141. package/registry/ui/field.tsx +240 -0
  142. package/registry/ui/filter-bar.tsx +392 -0
  143. package/registry/ui/funnel-steps.tsx +3541 -0
  144. package/registry/ui/heatmap.tsx +1752 -0
  145. package/registry/ui/hover-card.tsx +52 -0
  146. package/registry/ui/input-group.tsx +160 -0
  147. package/registry/ui/input.tsx +24 -0
  148. package/registry/ui/kbd.tsx +30 -0
  149. package/registry/ui/kpi-card.tsx +677 -0
  150. package/registry/ui/label.tsx +22 -0
  151. package/registry/ui/legend.tsx +3500 -0
  152. package/registry/ui/line-chart.tsx +3637 -0
  153. package/registry/ui/metric-value.tsx +62 -0
  154. package/registry/ui/multi-select.tsx +232 -0
  155. package/registry/ui/page-shell.tsx +282 -0
  156. package/registry/ui/pagination.tsx +140 -0
  157. package/registry/ui/placeholder.tsx +36 -0
  158. package/registry/ui/popover.tsx +92 -0
  159. package/registry/ui/progress-circle.tsx +867 -0
  160. package/registry/ui/progress.tsx +85 -0
  161. package/registry/ui/radio-group.tsx +39 -0
  162. package/registry/ui/sample-data.tsx +86 -0
  163. package/registry/ui/scatter-chart.tsx +4150 -0
  164. package/registry/ui/scroll-area.tsx +56 -0
  165. package/registry/ui/searchable-select.tsx +214 -0
  166. package/registry/ui/section-header.tsx +43 -0
  167. package/registry/ui/segmented-control.tsx +76 -0
  168. package/registry/ui/select.tsx +255 -0
  169. package/registry/ui/separator.tsx +27 -0
  170. package/registry/ui/sheet.tsx +139 -0
  171. package/registry/ui/sidebar.tsx +725 -0
  172. package/registry/ui/skeleton.tsx +17 -0
  173. package/registry/ui/slider.tsx +56 -0
  174. package/registry/ui/sparkline.tsx +230 -0
  175. package/registry/ui/spinner.tsx +14 -0
  176. package/registry/ui/states.tsx +90 -0
  177. package/registry/ui/status-badge.tsx +121 -0
  178. package/registry/ui/switch.tsx +34 -0
  179. package/registry/ui/table.tsx +118 -0
  180. package/registry/ui/tabs.tsx +84 -0
  181. package/registry/ui/textarea.tsx +22 -0
  182. package/registry/ui/toast.tsx +250 -0
  183. package/registry/ui/toggle-group.tsx +91 -0
  184. package/registry/ui/toggle.tsx +47 -0
  185. package/registry/ui/tooltip.tsx +68 -0
  186. package/registry/ui/tracker.tsx +843 -0
  187. package/registry/ui/trend-indicator.tsx +74 -0
  188. package/registry/ui/updated-at.tsx +122 -0
  189. package/registry/ui/waterfall-chart.tsx +4186 -0
  190. package/skills/vantage-add-feature/SKILL.md +9 -7
  191. package/skills/vantage-pitfalls/SKILL.md +5 -1
  192. package/templates/AGENTS.md +22 -1
  193. package/templates/agents/csv.md +2 -1
  194. package/templates/agents/doc.md +4 -3
  195. package/templates/agents/page.md +20 -6
  196. package/templates/agents/xlsx.md +2 -1
  197. package/theme.css +237 -136
  198. package/dist/add-DY4AXANK.js +0 -6
  199. package/dist/add-DY4AXANK.js.map +0 -1
  200. package/dist/chunk-5ZOP4SQR.js.map +0 -1
  201. package/dist/chunk-A2UUGASH.js.map +0 -1
  202. package/dist/chunk-DTDVSFRY.js.map +0 -1
  203. package/dist/chunk-LMUACBMA.js.map +0 -1
  204. package/dist/chunk-NKFBFDRZ.js +0 -2241
  205. package/dist/chunk-NKFBFDRZ.js.map +0 -1
  206. package/dist/chunk-PVTHHV7X.js.map +0 -1
  207. package/dist/chunk-PXRX5PEC.js.map +0 -1
  208. package/dist/chunk-QI3XQKHS.js.map +0 -1
  209. package/dist/chunk-RPZAALCX.js.map +0 -1
  210. package/dist/chunk-VA776YE5.js +0 -316
  211. package/dist/chunk-VA776YE5.js.map +0 -1
  212. package/dist/dev-GDKATCC7.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../squadkit/registry/lib/format.ts","../../squadkit/registry/lib/relative-time.ts","../../squadkit/registry/components/updated-at.tsx","../../squadkit/registry/components/page-shell.tsx","../../squadkit/registry/components/app-shell.tsx","../../squadkit/registry/components/section-header.tsx","../../squadkit/registry/components/sample-data.tsx","../../squadkit/registry/components/dashboard-card.tsx","../../squadkit/registry/lib/chart-theme.ts","../../squadkit/registry/charts/chart-frame.tsx","../../squadkit/registry/charts/echart.tsx","../../squadkit/registry/lib/chart-utils.ts","../../squadkit/registry/lib/comparison.ts","../../squadkit/registry/lib/chart-options.ts","../../squadkit/registry/charts/area-chart.tsx","../../squadkit/registry/charts/bar-chart.tsx","../../squadkit/registry/charts/line-chart.tsx","../../squadkit/registry/charts/donut-chart.tsx","../../squadkit/registry/charts/bar-list.tsx","../../squadkit/registry/charts/category-bar.tsx","../../squadkit/registry/charts/progress-circle.tsx","../../squadkit/registry/charts/tracker.tsx","../../squadkit/registry/charts/waterfall-chart.tsx","../../squadkit/registry/charts/scatter-chart.tsx","../../squadkit/registry/charts/legend.tsx","../../squadkit/registry/charts/funnel-steps.tsx","../../squadkit/registry/charts/heatmap.tsx","../../squadkit/registry/charts/sparkline.tsx","../../squadkit/registry/components/data-table.tsx","../../squadkit/registry/components/filter-bar.tsx","../../squadkit/registry/components/date-range-picker.tsx","../../squadkit/registry/components/segmented-control.tsx","../../squadkit/registry/lib/types.ts","../../squadkit/registry/components/option-command.tsx","../../squadkit/registry/components/searchable-select.tsx","../../squadkit/registry/components/multi-select.tsx","../../squadkit/registry/components/metric-value.tsx","../../squadkit/registry/lib/insights.ts","../../squadkit/registry/components/delta.tsx","../../squadkit/registry/components/kpi-card.tsx","../../squadkit/registry/components/trend-indicator.tsx","../../squadkit/registry/components/status-badge.tsx","../../squadkit/registry/components/placeholder.tsx"],"names":["format","forwardRef","jsx","jsxs","label","createContext","useState","useEffect","ChartFrame","useMemo","EChart","useRef","useCallback","useContext","toDate","series","NO_ROWS","BarChart","LineChart","formatValue","CategoryBar","ProgressCircle","Tracker","use","EScatterChart","GraphicComponent","ROW_STYLE","extent","Legend","cva","comparisonLabel","index","Fragment","withAlpha","escapeHtml","estimateTextWidth","Sparkline","meta","table","Download","DateRangePicker","formatDateRange","SegmentedControl","NO_OPTIONS","SearchableSelect","MultiSelect","useId","ChevronDownIcon","achievement","ArrowUp","ArrowDown","isJapanese","relative","absolute","Minus","StatusBadge","Placeholder"],"mappings":"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","file":"chunk-WRSX2MDK.js","sourcesContent":["/**\n * Locale-aware number formatting shared by KPI cards, tables and charts. All\n * shortening is delegated to `Intl.NumberFormat` (`notation: \"compact\"`); this\n * module never hard-codes unit thresholds or unit strings.\n *\n * | `format` | input | ja-JP output |\n * |--------------------------------------------|--------------|----------------|\n * | `\"compact\"` (default) | `48_200_000` | `4,820万` |\n * | `\"number\"` | `1234.567` | `1,234.57` |\n * | `\"currency\"` (JPY, compact) | `48_200_000` | `¥4,820万` |\n * | `{ type: \"currency\", notation: \"standard\" }` | `48_200_000` | `¥48,200,000` |\n * | `{ type: \"currency\", currency: \"USD\" }` | `1234.5` | `$1,234.5` |\n * | `\"percent\"` — pass a **ratio** | `0.124` | `12.4%` |\n * | `{ type: \"percent\", digits: 0 }` | `0.124` | `12%` |\n * | `\"multiple\"` | `1.5` | `1.5×` |\n * | `{ type: \"number\", unit: \"件\" }` | `48_210` | `48,210件` |\n * | `{ type: \"compact\", unit: \"人\" }` | `12_345` | `1.2万人` |\n * | `\"duration\"` — pass **seconds** | `12_000` | `3時間20分` |\n * | `{ type: \"duration\", durationUnit: \"minute\" }` | `2160` | `1.5日` |\n *\n * - `percent` takes a ratio (0.124 → 12.4%). Passing 12.4 renders 1,240%. The fraction\n * digits are **fixed**, never trimmed (`PERCENT_DIGITS` = 1: 0.14 → \"14.0%\", never \"14%\"\n * beside \"11.9%\"). Pass `digits` in the format to share another count across cards.\n * - A minus sign is always U+2212 (`MINUS_SIGN`, \"−1,234\" / \"−5.0%\"), never the hyphen-minus.\n * - `currency` defaults to JPY and to compact notation (万・億 in ja); pass\n * `notation: \"standard\"` for every digit (tables, invoices). In ja-JP the yen\n * sign is the half-width `¥`.\n * - `unit` is a counter appended right after the number, with no space\n * (\"48,210件\", \"1.2万人\"), for `number` / `compact` / `currency`. It is\n * ignored for `percent` and `duration`, and for `multiple` it replaces the\n * default `×` (\"2.7倍\"). Do not write it into a `valueFormatter` by hand.\n * - Charts take the same `format` a KpiCard takes (`format=\"currency\"`).\n * `toValueFormatter(format)` turns it into a function for places that need\n * one (a `valueFormatter`, table cells).\n * - Missing values (null / undefined / NaN) render as `—` (`EMPTY_VALUE`).\n * - Dates go through `formatDate` (`Intl.DateTimeFormat`): `\"date\"` → `2026/10/20`,\n * `\"datetime\"` → `2026/10/20 14:30`, `\"year-month\"` → `2026年10月`, `\"month\"` → `10月`,\n * `\"year\"` → `2026年`.\n * - A period goes through `formatDateRange`: `2026/9/23〜10/20` (same year drops the end year),\n * `2025/12/20〜2026/1/18` across years; month and day are not zero-padded.\n */\n\n/**\n * The kind of number a value is. Pick by what the number means, not by how\n * long it is: `currency` for money, `percent` for a ratio, `multiple` for a\n * factor (\"1.5×\"), `duration` for a length of time (\"3時間20分\"), `number` for\n * exact counts in tables, `compact` (default) for large headline counts (万・億).\n */\nexport type FormatKind = \"number\" | \"compact\" | \"currency\" | \"percent\" | \"multiple\" | \"duration\"\n\n/** The unit a `duration` value is measured in. */\nexport type DurationUnit = \"second\" | \"minute\" | \"hour\" | \"day\"\n\n/**\n * How to display a number: a `FormatKind` alone, or an object for digits,\n * currency, notation and a counter. The same value is accepted by KpiCard,\n * Delta, the charts (`format`) and `formatValue`.\n *\n * @example\n * \"currency\" // ¥4,820万\n * { type: \"currency\", notation: \"standard\" } // ¥48,200,000\n * { type: \"percent\", digits: 1 } // 2.0%\n * { type: \"number\", unit: \"件\" } // 48,210件\n */\nexport type ValueFormat =\n | FormatKind\n | {\n type: FormatKind\n /** Fixed number of fraction digits. */\n digits?: number\n /** ISO 4217 code for `currency`. Default `\"JPY\"`. */\n currency?: string\n /** `currency` only: `\"compact\"` (default, 万・億) or `\"standard\"` (every digit). */\n notation?: \"compact\" | \"standard\"\n /** Counter appended after the number, e.g. `\"件\"`, `\"人\"`. Ignored for `percent` and `duration`. For `multiple` it replaces the default `×` (`\"倍\"` → `2.7倍`). */\n unit?: string\n /** 値をこの数で割ってから整形する。例: `divisor: 100`(セント → ドル)。0 と非有限は無視。 */\n divisor?: number\n /** `duration` only: the unit the value is in. Default `\"second\"`. Reads as \"45秒\" / \"12分\" / \"3時間20分\" / \"1.5日\" (`digits` sets the fraction digits of days). */\n durationUnit?: DurationUnit\n }\n\n/** Locale used when none is passed. Every function here takes a `locale` to override it. */\nexport const DEFAULT_LOCALE = \"ja-JP\"\n\n/** Shown in place of a missing value (null / undefined / NaN). */\nexport const EMPTY_VALUE = \"—\"\n\n/** The minus sign every formatter writes (U+2212), so a negative never mixes with a hyphen-minus. */\nexport const MINUS_SIGN = \"\\u2212\"\n\n/** Fraction digits of a `percent` value (and of the points in `formatPoints`) when `digits` is not given. Fixed, never trimmed. */\nexport const PERCENT_DIGITS = 1\n\nconst DEFAULT_CURRENCY = \"JPY\"\nconst MULTIPLE_SUFFIX = \"×\"\n/** Suffix for a difference between two rates, in percentage points. */\nconst POINTS_SUFFIX = \"pt\"\n\n/** Extra options for `formatValue`. */\nexport interface FormatValueOptions {\n /** `\"auto\"` (default) signs negatives only; `\"exceptZero\"` also writes `+` on positives (for differences). */\n signDisplay?: \"auto\" | \"exceptZero\"\n /** Round to this many significant digits (e.g. 3 for an estimate: 79,653,985 → 7,970万). */\n significantDigits?: number\n}\n\ntype NormalizedFormat = Exclude<ValueFormat, FormatKind>\n\nfunction normalize(format: ValueFormat | undefined): NormalizedFormat {\n if (format === undefined) return { type: \"compact\" }\n return typeof format === \"string\" ? { type: format } : format\n}\n\n/**\n * The kind of a format, whether it was given as a string or an object. Use it\n * to branch on the meaning of a metric (e.g. a `percent` metric compares in\n * points) without unpacking `ValueFormat` yourself.\n *\n * @param format - The format as a KpiCard / chart takes it. `undefined` means the default.\n * @returns The `FormatKind`; `\"compact\"` when `format` is omitted.\n *\n * @example\n * formatKind(\"percent\") // \"percent\"\n * formatKind({ type: \"currency\", notation: \"standard\" }) // \"currency\"\n * formatKind(undefined) // \"compact\"\n */\nexport function formatKind(format: ValueFormat | undefined): FormatKind {\n return normalize(format).type\n}\n\nfunction digitOptions(\n digits: number | undefined,\n defaultMax: number | undefined,\n significantDigits: number | undefined,\n): Intl.NumberFormatOptions {\n if (significantDigits !== undefined) return { maximumSignificantDigits: significantDigits }\n if (digits !== undefined) return { minimumFractionDigits: digits, maximumFractionDigits: digits }\n return defaultMax === undefined ? {} : { maximumFractionDigits: defaultMax }\n}\n\n/**\n * Format through Intl, letting Intl decide whether the number is large enough to\n * shorten. Shortened numbers keep digit grouping (\"7,965万\"), and the full-width\n * currency sign some locales emit (\"¥\") is folded to its half-width form (\"¥\").\n */\nfunction formatParts(locale: string, options: Intl.NumberFormatOptions, value: number): string {\n if (options.notation === \"compact\") {\n const compact = new Intl.NumberFormat(locale, {\n ...options,\n useGrouping: \"always\" as unknown as boolean,\n }).formatToParts(value)\n if (!compact.some((p) => p.type === \"compact\")) return formatParts(locale, { ...options, notation: \"standard\" }, value)\n return joinParts(compact)\n }\n return joinParts(new Intl.NumberFormat(locale, options).formatToParts(value))\n}\n\nconst joinParts = (parts: Intl.NumberFormatPart[]): string =>\n parts\n .map((p) => (p.type === \"currency\" ? p.value.normalize(\"NFKC\") : p.type === \"minusSign\" ? MINUS_SIGN : p.value))\n .join(\"\")\n\n/**\n * Format a number for display — KPI values, table cells, chart labels and\n * sentences built from data (titles, summaries). See the table at the top of\n * this module.\n *\n * @param value - The number. `null` / `undefined` / `NaN` render as `—`.\n * For `percent`, a ratio (0.124 means 12.4%).\n * @param format - How to display it. Default `\"compact\"`.\n * @param locale - BCP 47 locale. Default `\"ja-JP\"`.\n * @param options - `signDisplay` and `significantDigits` (rounding for estimates).\n * @returns The display string. In ja-JP the yen sign is the half-width `¥`.\n *\n * @example\n * formatValue(48_200_000, \"currency\") // \"¥4,820万\"\n * formatValue(48_200_000, { type: \"currency\", notation: \"standard\" }) // \"¥48,200,000\"\n * formatValue(0.021, \"percent\") // \"2.1%\"\n * formatValue(0.124, \"percent\", \"ja-JP\", { signDisplay: \"exceptZero\" }) // \"+12.4%\"\n * formatValue(79_653_985, \"currency\", \"ja-JP\", { significantDigits: 3 }) // \"¥7,970万\"\n * formatValue(48_210, { type: \"number\", unit: \"件\" }) // \"48,210件\"\n * formatValue(1.5, \"multiple\") // \"1.5×\"\n * formatValue(null) // \"—\"\n */\nexport function formatValue(\n value: number | null | undefined,\n format?: ValueFormat,\n locale: string = DEFAULT_LOCALE,\n options?: FormatValueOptions,\n): string {\n if (value === null || value === undefined || Number.isNaN(value)) return EMPTY_VALUE\n const { type, digits, currency, notation, unit, divisor, durationUnit } = normalize(format)\n if (divisor !== undefined && Number.isFinite(divisor) && divisor !== 0) value = value / divisor\n const signDisplay = options?.signDisplay ?? \"auto\"\n const sig = options?.significantDigits\n const withUnit = (s: string) => (unit ? `${s}${unit}` : s)\n\n switch (type) {\n case \"number\":\n return withUnit(formatParts(locale, { ...digitOptions(digits, 2, sig), signDisplay }, value))\n case \"percent\":\n return formatParts(locale, { style: \"percent\", ...digitOptions(digits ?? PERCENT_DIGITS, undefined, sig), signDisplay }, value)\n case \"currency\":\n return withUnit(\n formatParts(\n locale,\n {\n style: \"currency\",\n currency: currency ?? DEFAULT_CURRENCY,\n notation: notation ?? \"compact\",\n ...digitOptions(digits, notation === \"standard\" ? undefined : 1, sig),\n signDisplay,\n },\n value,\n ),\n )\n case \"multiple\":\n return `${formatParts(locale, { ...digitOptions(digits, 2, sig), signDisplay }, value)}${unit || MULTIPLE_SUFFIX}`\n case \"compact\":\n return withUnit(formatParts(locale, { ...digitOptions(digits, 1, sig), signDisplay, notation: \"compact\" }, value))\n case \"duration\":\n return formatDuration(value, durationUnit ?? \"second\", locale, digits, signDisplay)\n }\n}\n\nconst SECONDS_PER: Record<DurationUnit, number> = { second: 1, minute: 60, hour: 3600, day: 86_400 }\n\n/**\n * Unit words and spacing: Japanese reads \"3時間20分\" (no space, like \"48,210件\"),\n * other locales \"3 h 20 min\".\n */\nfunction durationWords(locale: string) {\n return locale.toLowerCase().startsWith(\"ja\")\n ? { day: \"日\", hour: \"時間\", minute: \"分\", second: \"秒\", sep: \"\" }\n : { day: \"d\", hour: \"h\", minute: \"min\", second: \"s\", sep: \" \" }\n}\n\n/**\n * A length of time in the largest sensible unit: under a minute in seconds, under\n * an hour in minutes (+ seconds), under a day in hours + minutes, from a day on\n * in days with a decimal (\"1.5日\"). Rounded before splitting, so 59.6 minutes\n * never reads \"59分60秒\".\n */\nfunction formatDuration(\n value: number,\n unit: DurationUnit,\n locale: string,\n digits: number | undefined,\n signDisplay: \"auto\" | \"exceptZero\",\n): string {\n const w = durationWords(locale)\n const abs = Math.round(Math.abs(value) * SECONDS_PER[unit])\n const join = (...parts: Array<[number, string]>) =>\n parts\n .filter(([n]) => n !== 0)\n .map(([n, u]) => `${n}${w.sep}${u}`)\n .join(w.sep) || `0${w.sep}${parts.at(-1)?.[1] ?? w.second}`\n let body: string\n let zero = false\n if (abs >= 86_400) {\n const days = new Intl.NumberFormat(locale, { maximumFractionDigits: digits ?? 1, minimumFractionDigits: digits ?? 0 })\n body = `${days.format(abs / 86_400)}${w.sep}${w.day}`\n } else if (abs >= 3600) {\n const minutes = Math.round(abs / 60)\n body = join([Math.floor(minutes / 60), w.hour], [minutes % 60, w.minute])\n } else if (abs >= 60) {\n body = join([Math.floor(abs / 60), w.minute], [abs % 60, w.second])\n } else {\n zero = abs === 0\n body = `${abs}${w.sep}${w.second}`\n }\n const sign = zero ? \"\" : value < 0 ? MINUS_SIGN : signDisplay === \"exceptZero\" ? \"+\" : \"\"\n return `${sign}${body}`\n}\n\n/**\n * Like `formatValue`, but always signed (except zero) — for a difference\n * between two values (\"+¥530万\", \"−120件\"). Use `formatPoints` instead for a\n * difference between two rates.\n *\n * @param value - The difference (current − previous). Missing values render as `—`.\n * @param format - Format of the metric itself. Default `\"compact\"`.\n * @param locale - BCP 47 locale. Default `\"ja-JP\"`.\n * @returns The signed display string; zero has no sign.\n *\n * @example\n * formatDelta(5_300_000, \"currency\") // \"+¥530万\"\n * formatDelta(-120, { type: \"number\", unit: \"件\" }) // \"−120件\"\n * formatDelta(0.031, \"percent\") // \"+3.1%\"\n * formatDelta(0, \"currency\") // \"¥0\"\n */\nexport function formatDelta(value: number | null | undefined, format?: ValueFormat, locale: string = DEFAULT_LOCALE): string {\n return formatValue(value, format, locale, { signDisplay: \"exceptZero\" })\n}\n\n/**\n * A difference between two rates in percentage points, always signed:\n * `formatPoints(0.021 - 0.026)` → `\"−0.5pt\"`. Use it instead of a relative\n * change for rate metrics (churn, conversion), where \"−19.2%\" reads as a drop\n * of nineteen points. `signDisplay: \"never\"` drops the sign (\"あと 0.5pt\").\n *\n * @param difference - The difference of two **ratios** (0.021 − 0.026). Missing values render as `—`.\n * @param locale - BCP 47 locale. Default `\"ja-JP\"`.\n * @param options - `digits`: fixed fraction digits (default `PERCENT_DIGITS` = 1, so \"0.0pt\" / \"+0.5pt\"); `signDisplay`:\n * `\"exceptZero\"` (default) or `\"never\"` when the sentence already says the direction.\n * @returns The difference in points with the `pt` suffix.\n *\n * @example\n * formatPoints(0.021 - 0.026) // \"−0.5pt\"\n * formatPoints(0.031 - 0.026) // \"+0.5pt\"\n * formatPoints(0.02 - 0.015, \"ja-JP\", { signDisplay: \"never\" }) // \"0.5pt\"(「目標まであと 0.5pt」)\n */\nexport function formatPoints(\n difference: number | null | undefined,\n locale: string = DEFAULT_LOCALE,\n options?: { digits?: number; signDisplay?: \"exceptZero\" | \"never\" },\n): string {\n if (difference === null || difference === undefined || Number.isNaN(difference)) return EMPTY_VALUE\n const digits = options?.digits ?? PERCENT_DIGITS\n const number = formatParts(\n locale,\n { minimumFractionDigits: digits, maximumFractionDigits: digits, signDisplay: options?.signDisplay ?? \"exceptZero\" },\n difference * 100,\n )\n return `${number}${POINTS_SUFFIX}`\n}\n\n/**\n * Binds a format and locale into a single-argument formatter, for a chart\n * `valueFormatter` or a table cell: `valueFormatter={toValueFormatter(\"currency\")}`.\n * Prefer passing `format` to the chart directly; this is for APIs that only\n * take a function.\n *\n * @param format - How to display each value. Default `\"compact\"`.\n * @param locale - BCP 47 locale. Default `\"ja-JP\"`.\n * @returns `(value) => string`, rendering missing values as `—`.\n *\n * @example\n * const yen = toValueFormatter(\"currency\")\n * yen(48_200_000) // \"¥4,820万\"\n * yen(null) // \"—\"\n * const count = toValueFormatter({ type: \"number\", unit: \"件\" })\n * count(48_210) // \"48,210件\"(表のセル)\n */\nexport function toValueFormatter(\n format?: ValueFormat,\n locale: string = DEFAULT_LOCALE,\n): (value: number | null | undefined) => string {\n return (value) => formatValue(value, format, locale)\n}\n\n/**\n * 日付の書式。何を表す日付かで選ぶ: 日単位は `\"date\"`、時刻まで要るなら `\"datetime\"`、\n * 月次の集計は `\"year-month\"`(年をまたぐ軸)か `\"month\"`(同じ年の中の軸)、年次は `\"year\"`。\n */\nexport type DateStyle = \"date\" | \"datetime\" | \"month\" | \"year-month\" | \"year\"\n\n/** `formatDate` の追加オプション。 */\nexport interface FormatDateOptions {\n /**\n * IANA のタイムゾーン名(例: `\"Asia/Tokyo\"`)。既定は実行環境のタイムゾーン。\n * サーバーとブラウザで描画が食い違う(SSR)なら固定する。日付だけの文字列(`\"2026-10-20\"`)には効かず、常にその暦日のまま出す。\n */\n timeZone?: string\n}\n\nconst DATE_STYLE_OPTIONS: Record<DateStyle, Intl.DateTimeFormatOptions> = {\n date: { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" },\n datetime: { year: \"numeric\", month: \"2-digit\", day: \"2-digit\", hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\" },\n month: { month: \"short\" },\n \"year-month\": { year: \"numeric\", month: \"long\" },\n year: { year: \"numeric\" },\n}\n\n/** `\"2026-10-20\"` / `\"2026-10\"` はタイムゾーンを持たない暦日。UTC で解釈して UTC で出し、ずれを防ぐ。 */\nconst CALENDAR_DATE = /^\\d{4}-\\d{2}(-\\d{2})?$/\n\n/**\n * 日付を表示用の文字列にする。表のセル・タイトル・文に埋める日付に使い、`toLocaleString` や手組みの\n * `getMonth() + 1` は使わない。\n *\n * @param value - `Date`、エポックミリ秒、または日付文字列(`\"2026-10-20\"`、ISO 8601)。`null` / `undefined` / 解釈できない値は `—`。\n * @param style - 何を表す日付か。既定 `\"date\"`。\n * @param locale - BCP 47 ロケール。既定 `\"ja-JP\"`。\n * @param options - `timeZone`。\n * @returns 表示文字列。\n *\n * @example\n * formatDate(\"2026-10-20\") // \"2026/10/20\"\n * formatDate(new Date(\"2026-10-20T05:30:00Z\"), \"datetime\", \"ja-JP\", { timeZone: \"Asia/Tokyo\" }) // \"2026/10/20 14:30\"\n * formatDate(\"2026-10-01\", \"year-month\") // \"2026年10月\"\n * formatDate(\"2026-10-01\", \"month\") // \"10月\"\n * formatDate(null) // \"—\"\n */\nexport function formatDate(\n value: Date | string | number | null | undefined,\n style: DateStyle = \"date\",\n locale: string = DEFAULT_LOCALE,\n options?: FormatDateOptions,\n): string {\n if (value === null || value === undefined || value === \"\") return EMPTY_VALUE\n const calendar = typeof value === \"string\" && CALENDAR_DATE.test(value)\n const date = value instanceof Date ? value : new Date(value)\n if (!Number.isFinite(date.getTime())) return EMPTY_VALUE\n return new Intl.DateTimeFormat(locale, {\n ...DATE_STYLE_OPTIONS[style],\n timeZone: calendar ? \"UTC\" : options?.timeZone,\n }).format(date)\n}\n\n/** `formatDateRange` のオプション。 */\nexport interface FormatDateRangeOptions extends FormatDateOptions {\n /** BCP 47 ロケール。既定 `\"ja-JP\"`。 */\n locale?: string\n}\n\n/**\n * 期間を「2026/9/23〜10/20」の形にする。同じ年なら終了側の年を省き、年をまたぐときは両方に付ける。\n * 月日はゼロ詰めしない。区切りは日本語で「〜」、それ以外のロケールでは「 – 」。始まりと終わりが同じ日なら 1 日だけ出す。\n *\n * @param start - 期間の最初の日(`Date`、エポックミリ秒、日付文字列)。`\"2026-09-23\"` のような日付だけの文字列はその暦日のまま出す。\n * @param end - 期間の最後の日。\n * @param options - `locale` と `timeZone`。\n * @returns 表示文字列。どちらかが解釈できなければ `—`。\n *\n * @example\n * formatDateRange(\"2026-09-23\", \"2026-10-20\") // \"2026/9/23〜10/20\"\n * formatDateRange(\"2025-12-20\", \"2026-01-18\") // \"2025/12/20〜2026/1/18\"\n */\nexport function formatDateRange(\n start: Date | string | number | null | undefined,\n end: Date | string | number | null | undefined,\n options?: FormatDateRangeOptions,\n): string {\n const locale = options?.locale ?? DEFAULT_LOCALE\n const parse = (value: Date | string | number | null | undefined) => {\n if (value === null || value === undefined || value === \"\") return null\n const calendar = typeof value === \"string\" && CALENDAR_DATE.test(value)\n const date = value instanceof Date ? value : new Date(value)\n if (!Number.isFinite(date.getTime())) return null\n return { date, timeZone: calendar ? \"UTC\" : options?.timeZone }\n }\n const a = parse(start)\n const b = parse(end)\n if (!a || !b) return EMPTY_VALUE\n const full = (x: NonNullable<typeof a>, withYear: boolean) =>\n new Intl.DateTimeFormat(locale, {\n ...(withYear ? { year: \"numeric\" } : {}),\n month: \"numeric\",\n day: \"numeric\",\n timeZone: x.timeZone,\n } as Intl.DateTimeFormatOptions).format(x.date)\n const year = (x: NonNullable<typeof a>) =>\n new Intl.DateTimeFormat(\"en-US\", { year: \"numeric\", timeZone: x.timeZone }).format(x.date)\n const startText = full(a, true)\n const sameYear = year(a) === year(b)\n const endFull = full(b, true)\n if (startText === endFull) return startText\n const separator = locale.toLowerCase().startsWith(\"ja\") ? \"〜\" : \" – \"\n return `${startText}${separator}${sameYear ? full(b, false) : endFull}`\n}\n\n/**\n * 文中の ISO の年月・日付(`2023-04`、`2026-10-20`)を `formatDate` の書式に置き換える。期間や出典の注記のように、\n * 利用者が文字列で渡す文に日付が混ざるときの表示用(`\"2023-04 以降\"` → `\"2023年4月 以降\"`)。日付でない数字は触らない。\n *\n * @param text - 日付を含みうる文。\n * @param locale - BCP 47 ロケール。既定 `\"ja-JP\"`。\n * @returns ISO の年月は `\"year-month\"`、年月日は `\"date\"` で整形した文。\n */\nexport function formatDatesInText(text: string, locale: string = DEFAULT_LOCALE): string {\n return text.replace(/(?<![\\d-])(\\d{4})-(0[1-9]|1[0-2])(-(0[1-9]|[12]\\d|3[01]))?(?![\\d-])/g, (match, _y, _m, day) =>\n formatDate(match, day ? \"date\" : \"year-month\", locale),\n )\n}\n","/**\n * \"3 分前\" style relative timestamps via `Intl.RelativeTimeFormat`, picking the\n * largest unit whose magnitude is at least one.\n */\nimport { DEFAULT_LOCALE, EMPTY_VALUE } from \"./format\"\n\nconst SECOND = 1000\nconst MINUTE = 60 * SECOND\nconst HOUR = 60 * MINUTE\nconst DAY = 24 * HOUR\nconst WEEK = 7 * DAY\nconst MONTH = 30 * DAY\nconst YEAR = 365 * DAY\n\nconst UNITS: ReadonlyArray<[Intl.RelativeTimeFormatUnit, number]> = [\n [\"year\", YEAR],\n [\"month\", MONTH],\n [\"week\", WEEK],\n [\"day\", DAY],\n [\"hour\", HOUR],\n [\"minute\", MINUTE],\n [\"second\", SECOND],\n]\n\nexport function formatRelativeTime(\n date: Date | string | number,\n options?: { now?: Date | number; locale?: string },\n): string {\n const time = date instanceof Date ? date.getTime() : new Date(date).getTime()\n const nowValue = options?.now ?? Date.now()\n const now = nowValue instanceof Date ? nowValue.getTime() : nowValue\n if (!Number.isFinite(time) || !Number.isFinite(now)) return EMPTY_VALUE\n const diff = time - now\n const rtf = new Intl.RelativeTimeFormat(options?.locale ?? DEFAULT_LOCALE, { numeric: \"always\" })\n for (const [unit, size] of UNITS) {\n if (Math.abs(diff) >= size) return rtf.format(Math.trunc(diff / size), unit)\n }\n return rtf.format(Math.trunc(diff / SECOND), \"second\")\n}\n","\"use client\"\n\n/**\n * UpdatedAt — freshness label. Renders a `<time>` whose `dateTime` is the ISO\n * instant, with the absolute time and zone (\"2026/10/20 16:41 JST\") in both a\n * tooltip and the `title` attribute.\n *\n * `variant=\"relative\"` (default) reads \"23 分前に更新\"; `\"absolute-first\"` reads\n * \"16:41 更新(23 分前)\" (the date is added when it is not today).\n *\n * Hydration-safe: the first render (server and client) is an empty `<time>`\n * carrying only the ISO `dateTime`, because the text depends on the clock and\n * time zone of whoever renders. After mount it shows the label and refreshes\n * every 60 seconds; the interval is cleared on unmount. `now` pins the clock\n * (tests, fixtures) and skips the timer; `timeZone` pins the zone. The `<time>`\n * sets `suppressHydrationWarning` so sample data built from `Date.now()` at\n * module load (which differs between server and client) does not warn.\n */\nimport { forwardRef, useEffect, useState } from \"react\"\n\nimport { EMPTY_VALUE, formatDate } from \"../lib/format\"\nimport { formatRelativeTime } from \"../lib/relative-time\"\nimport { cn } from \"../lib/utils\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\"\n\nconst REFRESH_MS = 60_000\n\nexport interface UpdatedAtProps {\n /** When the data was last updated. */\n at: Date | string | number\n /** `\"relative\"` (default): \"23 分前に更新\". `\"absolute-first\"`: \"16:41 更新(23 分前)\" — for pages where \"now\" matters. */\n variant?: \"relative\" | \"absolute-first\"\n /** IANA time zone (e.g. `\"Asia/Tokyo\"`) for the absolute time. Defaults to the runtime's zone. */\n timeZone?: string\n /** Text placed before the label, e.g. `\"売上データ: \"`. */\n prefix?: string\n /** Fixed \"current time\" for tests and fixtures. Disables the 60 s refresh. */\n now?: Date | number\n className?: string\n}\n\nconst toMs = (value: Date | string | number) =>\n value instanceof Date ? value.getTime() : new Date(value).getTime()\n\nfunction relative(at: number, now: number): string {\n if (now - at < REFRESH_MS && now - at > -REFRESH_MS) return \"たった今\"\n return formatRelativeTime(at, { now })\n}\n\n/** \"2026/10/20 16:41 JST\" */\nfunction absolute(at: number, timeZone?: string): string | undefined {\n if (!Number.isFinite(at)) return undefined\n const zone = new Intl.DateTimeFormat(\"ja-JP\", { timeZone, timeZoneName: \"short\" })\n .formatToParts(at)\n .find((part) => part.type === \"timeZoneName\")?.value\n const text = formatDate(at, \"datetime\", \"ja-JP\", { timeZone })\n return zone ? `${text} ${zone}` : text\n}\n\nfunction label(at: number, now: number, variant: \"relative\" | \"absolute-first\", timeZone?: string): string {\n if (!Number.isFinite(at) || !Number.isFinite(now)) return EMPTY_VALUE\n if (variant === \"relative\") {\n return now - at < REFRESH_MS && now - at > -REFRESH_MS ? \"たった今\" : `${relative(at, now)}に更新`\n }\n const today = formatDate(at, \"date\", \"ja-JP\", { timeZone }) === formatDate(now, \"date\", \"ja-JP\", { timeZone })\n const when = formatDate(at, \"datetime\", \"ja-JP\", { timeZone })\n // \"2026/10/20 16:41\" -> time only when it is today.\n const shown = today ? when.slice(-5) : when\n return `${shown} 更新(${relative(at, now)})`\n}\n\nexport const UpdatedAt = forwardRef<HTMLTimeElement, UpdatedAtProps>(\n ({ at, variant = \"relative\", timeZone, prefix, now, className }, ref) => {\n const atMs = toMs(at)\n const [current, setCurrent] = useState<number | null>(null)\n const fixed = now === undefined ? undefined : toMs(now as Date | number)\n\n useEffect(() => {\n if (fixed !== undefined) return\n setCurrent(Date.now())\n const id = setInterval(() => setCurrent(Date.now()), REFRESH_MS)\n return () => clearInterval(id)\n }, [fixed])\n\n const clock = fixed ?? current\n const ready = clock !== null\n const dateTime = Number.isFinite(atMs) ? new Date(atMs).toISOString() : undefined\n const full = ready ? absolute(atMs, timeZone) : undefined\n const classes = cn(\"text-sm text-muted-foreground tabular-nums\", className)\n const text = ready ? `${prefix ?? \"\"}${label(atMs, clock, variant, timeZone)}` : null\n\n if (!full) {\n return (\n <time ref={ref} data-slot=\"updated-at\" dateTime={dateTime} className={classes} suppressHydrationWarning>\n {text}\n </time>\n )\n }\n return (\n <Tooltip>\n <TooltipTrigger\n render={\n <time\n ref={ref}\n data-slot=\"updated-at\"\n dateTime={dateTime}\n title={full}\n className={classes}\n suppressHydrationWarning\n />\n }\n >\n {text}\n </TooltipTrigger>\n <TooltipContent className=\"tabular-nums\">{full}</TooltipContent>\n </Tooltip>\n )\n },\n)\nUpdatedAt.displayName = \"UpdatedAt\"\n","\"use client\"\n\n/**\n * PageShell — the standard page frame: a bordered header band (title,\n * description, meta, actions), an optional summary card row, and the content\n * area. Composed from parts so a page can use only what it needs.\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { formatDateRange, EMPTY_VALUE } from \"../lib/format\"\nimport { cn } from \"../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { UpdatedAt, type UpdatedAtProps } from \"./updated-at\"\n\nexport interface PageShellProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const PageShell = forwardRef<HTMLDivElement, PageShellProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"page-shell\" className={cn(\"flex flex-col\", className)} {...props} />\n ),\n)\nPageShell.displayName = \"PageShell\"\n\nexport interface PageShellHeaderProps extends HTMLAttributes<HTMLDivElement> {\n /** When the data was last updated. Drawn by `UpdatedAt` at the right end of the title row. */\n updatedAt?: UpdatedAtProps[\"at\"]\n /** `\"relative\"` (default) or `\"absolute-first\"` (\"16:41 更新(23 分前)\") for pages where \"now\" matters. */\n updatedAtVariant?: UpdatedAtProps[\"variant\"]\n /** IANA time zone for the absolute time of `updatedAt`. Defaults to the runtime's zone. */\n timeZone?: string\n /** Where the data comes from. Shown as a chip \"出典:○○\" on the second row. */\n source?: string\n /** The period the data covers. Shown as a chip \"2026/9/23〜10/20\" on the second row. */\n period?: { start: Date | string | number; end: Date | string | number }\n /** The page's overall state (an alert, a status badge). Shown on the third row; no row when absent. */\n status?: ReactNode\n}\n\n/**\n * A wrapping flex row, not a two-column grid: when the heading cannot keep its\n * 20rem basis next to `PageShellHeaderEnd`, the end block drops below it. A\n * `1fr auto` grid would instead hand the heading whatever the end block leaves,\n * and a CJK title — breakable between any two characters — collapses into a\n * one-character column.\n *\n * The meta props (`updatedAt`, `source`, `period`, `status`) fix the order every\n * page head shares: title and update time (right end) → source / period chips →\n * overall status → summary cards. Empty rows are not drawn. Rows are placed with\n * flex `order`, so they land before `PageShellSummary` whatever the child order.\n */\nexport const PageShellHeader = forwardRef<HTMLDivElement, PageShellHeaderProps>(\n ({ className, updatedAt, updatedAtVariant, timeZone, source, period, status, children, ...props }, ref) => {\n const periodText = period ? formatDateRange(period.start, period.end, { timeZone }) : undefined\n const hasChips = Boolean(source) || (periodText !== undefined && periodText !== EMPTY_VALUE)\n const hasStatus = status !== undefined && status !== null && status !== false && status !== \"\"\n return (\n <div\n ref={ref}\n data-slot=\"page-shell-header\"\n className={cn(\"flex flex-wrap items-start gap-x-4 gap-y-6 px-6 py-12\", className)}\n {...props}\n >\n {children}\n {updatedAt !== undefined && updatedAt !== null ? (\n <div data-slot=\"page-shell-updated-at\" className=\"ml-auto max-w-full shrink-0 text-right\">\n <UpdatedAt at={updatedAt} variant={updatedAtVariant} timeZone={timeZone} />\n </div>\n ) : null}\n {hasChips ? (\n <div data-slot=\"page-shell-chips\" className=\"order-1 flex basis-full flex-wrap gap-1.5\">\n {source ? (\n <Badge variant=\"outline\" className=\"h-auto max-w-full whitespace-normal\">\n 出典:{source}\n </Badge>\n ) : null}\n {periodText && periodText !== EMPTY_VALUE ? (\n <Badge variant=\"outline\" className=\"tabular-nums\">\n {periodText}\n </Badge>\n ) : null}\n </div>\n ) : null}\n {hasStatus ? (\n <div data-slot=\"page-shell-status\" className=\"order-2 min-w-0 basis-full\">\n {status}\n </div>\n ) : null}\n </div>\n )\n },\n)\nPageShellHeader.displayName = \"PageShellHeader\"\n\nexport interface PageShellHeadingProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const PageShellHeading = forwardRef<HTMLDivElement, PageShellHeadingProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"page-shell-heading\"\n className={cn(\"min-w-0 grow basis-80\", className)}\n {...props}\n />\n ),\n)\nPageShellHeading.displayName = \"PageShellHeading\"\n\nexport interface PageShellTitleProps extends HTMLAttributes<HTMLHeadingElement> {}\n\nexport const PageShellTitle = forwardRef<HTMLHeadingElement, PageShellTitleProps>(\n ({ className, ...props }, ref) => (\n <h1\n ref={ref}\n data-slot=\"page-shell-title\"\n className={cn(\"text-2xl font-bold tracking-tight text-foreground\", className)}\n {...props}\n />\n ),\n)\nPageShellTitle.displayName = \"PageShellTitle\"\n\nexport interface PageShellDescriptionProps extends HTMLAttributes<HTMLParagraphElement> {}\n\nexport const PageShellDescription = forwardRef<HTMLParagraphElement, PageShellDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"page-shell-description\"\n className={cn(\"mt-1 text-sm text-muted-foreground\", className)}\n {...props}\n />\n ),\n)\nPageShellDescription.displayName = \"PageShellDescription\"\n\nexport interface PageShellHeaderEndProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const PageShellHeaderEnd = forwardRef<HTMLDivElement, PageShellHeaderEndProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"page-shell-header-end\"\n className={cn(\"flex max-w-full shrink-0 flex-col flex-wrap items-end gap-2\", className)}\n {...props}\n />\n ),\n)\nPageShellHeaderEnd.displayName = \"PageShellHeaderEnd\"\n\nexport interface PageShellMetaProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const PageShellMeta = forwardRef<HTMLDivElement, PageShellMetaProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"page-shell-meta\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n ),\n)\nPageShellMeta.displayName = \"PageShellMeta\"\n\nexport interface PageShellActionsProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const PageShellActions = forwardRef<HTMLDivElement, PageShellActionsProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"page-shell-actions\"\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n />\n ),\n)\nPageShellActions.displayName = \"PageShellActions\"\n\nexport interface PageShellSummaryProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const PageShellSummary = forwardRef<HTMLDivElement, PageShellSummaryProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"page-shell-summary\"\n className={cn(\n \"order-3 grid basis-full grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\",\n className,\n )}\n {...props}\n />\n ),\n)\nPageShellSummary.displayName = \"PageShellSummary\"\n\n/**\n * Accent tints come from theme tokens, never Tailwind palette colours: the\n * semantic tones (`--positive` / `--negative` / `--warning` / `--info` /\n * `--neutral` and their `*-subtle`) and, for hues with no status meaning,\n * `--chart-4` / `--chart-5`. The colour-named accents are kept for compatibility\n * and map to the nearest tone. Each set is a literal string — Tailwind only\n * emits classes it can see literally in the source.\n */\nconst summaryCardTones = {\n positive: \"border-positive/30 bg-positive-subtle [&>svg]:text-positive\",\n negative: \"border-negative/30 bg-negative-subtle [&>svg]:text-negative\",\n warning: \"border-warning/30 bg-warning-subtle [&>svg]:text-warning\",\n info: \"border-info/30 bg-info-subtle [&>svg]:text-info\",\n neutral: \"border-neutral/30 bg-neutral-subtle [&>svg]:text-neutral\",\n violet: \"border-chart-4/30 bg-chart-4/5 [&>svg]:text-chart-4\",\n pink: \"border-chart-5/30 bg-chart-5/5 [&>svg]:text-chart-5\",\n} as const\n\nexport const pageShellSummaryCardVariants = cva(\n \"relative flex items-start gap-3 rounded-lg border bg-background px-4 py-3 text-sm [&>svg]:mt-0.5 [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n accent: {\n default: \"text-card-foreground\",\n accent:\n \"border-[var(--chart-1)]/30 bg-linear-to-r from-[var(--chart-1)]/5 to-[var(--chart-1)]/5 [&>svg]:text-[var(--chart-1)]\",\n amber: summaryCardTones.warning,\n blue: summaryCardTones.info,\n emerald: summaryCardTones.positive,\n red: summaryCardTones.negative,\n violet: summaryCardTones.violet,\n orange: summaryCardTones.warning,\n cyan: summaryCardTones.info,\n slate: summaryCardTones.neutral,\n green: summaryCardTones.positive,\n teal: summaryCardTones.positive,\n sky: summaryCardTones.info,\n indigo: summaryCardTones.info,\n purple: summaryCardTones.violet,\n pink: summaryCardTones.pink,\n rose: summaryCardTones.negative,\n yellow: summaryCardTones.warning,\n lime: summaryCardTones.positive,\n gray: summaryCardTones.neutral,\n zinc: summaryCardTones.neutral,\n neutral: summaryCardTones.neutral,\n stone: summaryCardTones.neutral,\n fuchsia: summaryCardTones.violet,\n },\n },\n defaultVariants: {\n accent: \"default\",\n },\n },\n)\n\nexport interface PageShellSummaryCardProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof pageShellSummaryCardVariants> {}\n\nexport const PageShellSummaryCard = forwardRef<HTMLDivElement, PageShellSummaryCardProps>(\n ({ className, accent, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"page-shell-summary-card\"\n className={cn(pageShellSummaryCardVariants({ accent }), className)}\n {...props}\n />\n ),\n)\nPageShellSummaryCard.displayName = \"PageShellSummaryCard\"\n\nexport interface PageShellContentProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const PageShellContent = forwardRef<HTMLDivElement, PageShellContentProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"page-shell-content\"\n className={cn(\"flex-1 p-6\", className)}\n {...props}\n />\n ),\n)\nPageShellContent.displayName = \"PageShellContent\"\n","\"use client\"\n\n/**\n * AppShell — the outermost application frame. `variant=\"sidebar\"` (default)\n * renders a collapsible sidebar with nested nav groups; `variant=\"header\"`\n * collapses the same nav into a single select in a top bar.\n *\n * Navigation is router-agnostic: pass `linkComponent` to render links with your\n * router's Link, or leave it and `onNavigate` handles the header variant.\n */\nimport { forwardRef, type ElementType, type ReactNode } from \"react\"\nimport { ChevronRight } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../ui/collapsible\"\nimport { Separator } from \"../ui/separator\"\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\"\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupLabel,\n SidebarInset,\n SidebarMenu,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarTrigger,\n} from \"../ui/sidebar\"\nimport type { NavGroup, NavItem } from \"../lib/types\"\n\nexport interface AppShellSidebarProps {\n variant?: \"sidebar\"\n groups: NavGroup[]\n actions?: ReactNode\n header?: ReactNode\n children: ReactNode\n defaultOpen?: boolean\n className?: string\n linkComponent?: ElementType\n onNavigate?: (href: string) => void\n}\n\nexport interface AppShellHeaderProps {\n variant: \"header\"\n groups: NavGroup[]\n actions?: ReactNode\n header?: ReactNode\n children: ReactNode\n className?: string\n linkComponent?: ElementType\n onNavigate?: (href: string) => void\n}\n\nexport type AppShellProps = AppShellSidebarProps | AppShellHeaderProps\n\n/** Nested groups collapse to their leaves — the select is a flat list. */\nfunction flattenItems(item: NavItem): NavItem[] {\n if (item.children && item.children.length > 0) {\n return item.children.flatMap(flattenItems)\n }\n return [item]\n}\n\nfunction NavSelect({\n groups,\n onNavigate,\n}: {\n groups: NavGroup[]\n onNavigate: (href: string) => void\n}) {\n const allItems = groups.flatMap((g) => g.items.flatMap(flattenItems))\n const currentValue = allItems.find((item) => item.isActive)?.href ?? \"\"\n // Base UI's SelectValue renders the raw value (the href) unless `items` maps\n // it to a label, so pass the page names explicitly.\n const selectItems = allItems.map((item) => ({ value: item.href, label: item.label }))\n\n return (\n <Select\n items={selectItems}\n value={currentValue}\n onValueChange={(href) => {\n // Base UI reports `null` when the selection is cleared; there is no\n // page to navigate to in that case.\n if (href !== null) onNavigate(href)\n }}\n >\n <SelectTrigger size=\"sm\" className=\"w-48\">\n <SelectValue placeholder=\"ページを選択\" />\n </SelectTrigger>\n {/*\n Page titles are author-written and often longer than the 12rem trigger,\n so the list is allowed to grow past the anchor width (bounded by the\n viewport) instead of clamping every title to the trigger's width.\n */}\n <SelectContent\n align=\"start\"\n className=\"w-auto min-w-(--anchor-width) max-w-[min(24rem,var(--available-width))]\"\n >\n {groups.map((group, index) => (\n <SelectGroup key={group.label ?? index}>\n {group.label && <SelectLabel>{group.label}</SelectLabel>}\n {group.items.flatMap(flattenItems).map((item) => (\n <SelectItem key={item.href} value={item.href} disabled={item.disabled}>\n {item.label}\n </SelectItem>\n ))}\n </SelectGroup>\n ))}\n </SelectContent>\n </Select>\n )\n}\n\nfunction NavItemWithChildren({\n item,\n linkComponent: LinkComponent = \"a\",\n}: {\n item: NavItem\n linkComponent?: ElementType\n}) {\n return (\n <Collapsible\n defaultOpen={item.isActive}\n className=\"group/collapsible\"\n render={<SidebarMenuItem />}\n >\n <CollapsibleTrigger\n render={\n <SidebarMenuButton\n tooltip={item.label}\n aria-disabled={item.disabled}\n className={cn(item.disabled && \"pointer-events-none\")}\n />\n }\n >\n {item.icon && <item.icon />}\n <span>{item.label}</span>\n <ChevronRight className=\"ml-auto transition-transform duration-200 group-data-open/collapsible:rotate-90\" />\n </CollapsibleTrigger>\n {item.badge && <SidebarMenuBadge>{item.badge}</SidebarMenuBadge>}\n <CollapsibleContent>\n <SidebarMenuSub>\n {item.children!.map((child) => (\n <SidebarMenuSubItem key={child.href}>\n <SidebarMenuSubButton\n isActive={child.isActive}\n render={\n <LinkComponent\n href={child.href}\n aria-disabled={child.disabled}\n tabIndex={child.disabled ? -1 : undefined}\n className={cn(child.disabled && \"pointer-events-none opacity-50\")}\n />\n }\n >\n {child.icon && <child.icon />}\n <span>{child.label}</span>\n </SidebarMenuSubButton>\n </SidebarMenuSubItem>\n ))}\n </SidebarMenuSub>\n </CollapsibleContent>\n </Collapsible>\n )\n}\n\nfunction NavItemLink({\n item,\n linkComponent: LinkComponent = \"a\",\n}: {\n item: NavItem\n linkComponent?: ElementType\n}) {\n return (\n <SidebarMenuItem>\n <SidebarMenuButton\n tooltip={item.label}\n isActive={item.isActive}\n render={\n <LinkComponent\n href={item.href}\n aria-disabled={item.disabled}\n tabIndex={item.disabled ? -1 : undefined}\n className={cn(item.disabled && \"pointer-events-none\")}\n />\n }\n >\n {item.icon && <item.icon />}\n <span>{item.label}</span>\n </SidebarMenuButton>\n {item.badge && <SidebarMenuBadge>{item.badge}</SidebarMenuBadge>}\n </SidebarMenuItem>\n )\n}\n\nconst defaultNavigate = (href: string) => {\n window.location.assign(href)\n}\n\nexport const AppShell = forwardRef<HTMLDivElement, AppShellProps>((props, ref) => {\n const {\n variant = \"sidebar\",\n groups,\n actions,\n header,\n children,\n className,\n linkComponent,\n onNavigate = defaultNavigate,\n } = props\n\n if (variant === \"header\") {\n return (\n <div ref={ref} data-slot=\"app-shell\" className={cn(\"flex h-full flex-col\", className)}>\n {header !== undefined ? (\n header\n ) : (\n <header className=\"flex h-14 shrink-0 items-center gap-3 border-b px-4\">\n {groups.length > 0 && <NavSelect groups={groups} onNavigate={onNavigate} />}\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </header>\n )}\n <main className=\"flex-1 overflow-auto\">{children}</main>\n </div>\n )\n }\n\n const { defaultOpen = true } = props as AppShellSidebarProps\n\n return (\n <SidebarProvider defaultOpen={defaultOpen}>\n <Sidebar data-slot=\"app-sidebar\" collapsible=\"offcanvas\">\n <SidebarContent>\n {groups.map((group, index) => (\n <SidebarGroup key={group.label ?? index}>\n {group.label && <SidebarGroupLabel>{group.label}</SidebarGroupLabel>}\n <SidebarMenu>\n {group.items.map((item) =>\n item.children && item.children.length > 0 ? (\n <NavItemWithChildren\n key={item.href}\n item={item}\n linkComponent={linkComponent}\n />\n ) : (\n <NavItemLink key={item.href} item={item} linkComponent={linkComponent} />\n ),\n )}\n </SidebarMenu>\n </SidebarGroup>\n ))}\n </SidebarContent>\n {actions && <SidebarFooter>{actions}</SidebarFooter>}\n <SidebarRail />\n </Sidebar>\n <SidebarInset ref={ref} data-slot=\"app-shell\" className={className}>\n {header !== undefined ? (\n header\n ) : (\n <header className=\"flex h-14 shrink-0 items-center gap-2 border-b px-4\">\n <SidebarTrigger />\n <Separator orientation=\"vertical\" className=\"h-4\" />\n </header>\n )}\n <main className=\"flex-1 overflow-auto\">{children}</main>\n </SidebarInset>\n </SidebarProvider>\n )\n})\nAppShell.displayName = \"AppShell\"\n","\"use client\"\n\n/**\n * SectionHeader — a titled divider inside a page: heading, optional\n * description, and right-aligned actions that wrap below on narrow screens.\n */\nimport { forwardRef, type ReactNode } from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst headingStyles = {\n h1: \"text-3xl font-bold tracking-tight\",\n h2: \"text-xl font-semibold tracking-tight\",\n h3: \"text-xl font-semibold\",\n h4: \"text-lg font-semibold\",\n} as const\n\nexport interface SectionHeaderProps {\n title: string\n description?: string\n actions?: ReactNode\n className?: string\n as?: keyof typeof headingStyles\n}\n\nexport const SectionHeader = forwardRef<HTMLDivElement, SectionHeaderProps>(\n ({ title, description, actions, className, as: Comp = \"h2\" }, ref) => (\n <div\n ref={ref}\n data-slot=\"section-header\"\n className={cn(\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\", className)}\n >\n <div>\n <Comp className={headingStyles[Comp]}>{title}</Comp>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"shrink-0\">{actions}</div>}\n </div>\n ),\n)\nSectionHeader.displayName = \"SectionHeader\"\n","\"use client\"\n\n/**\n * SampleData — marks the values inside it as a sample: they are not connected to real data yet\n * (a draft laid out before its queries are wired, a screen built from column definitions only).\n * Not the same as `provisional` on KpiCard and the charts, which means 速報 — real values that are\n * not final yet. For a single value in running text or a heading, use `Placeholder` instead.\n *\n * - **No box of its own.** It renders `display: contents`, so the grid / subgrid of the parent\n * still sees the cards inside as its direct children (KpiCard rows keep lining up).\n * - **The card shows the mark.** The nearest `KpiCard` or `DashboardCardPreset` inside it puts a\n * `SampleBadge` in its header, once (also while loading): a card claims the mark, so the parts\n * anywhere inside that card (body, actions, footer) do not repeat it. Put a bare chart in a\n * `DashboardCardPreset` to have it marked.\n * - The mark is a word, not only a colour (`--warning` on `--warning-subtle`), and its\n * `title` says what it means.\n *\n * @example\n * import { SampleData } from \"@/components/sample-data\"\n * // Vantage: import { SampleData } from \"@squadbase/vantage/components\"\n * <SampleData>\n * <KpiCard label=\"売上\" value={12400000} format={{ type: \"currency\", currency: \"JPY\" }} />\n * </SampleData>\n */\nimport { createContext, useContext, useMemo, type HTMLAttributes, type ReactNode } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Badge } from \"../ui/badge\"\n\nexport const DEFAULT_SAMPLE_LABEL = \"見本の値\"\nconst SAMPLE_TITLE = \"実データにまだつながっていない見本の値です\"\n\ninterface SampleState {\n label: string\n}\n\nconst SampleContext = createContext<SampleState | null>(null)\n\n/**\n * The mark a card inside `SampleData` should show, or null. A card that shows it wraps its\n * content in `<SampleClaim>` so the parts inside do not show it again.\n */\nexport function useSampleMark(): SampleState | null {\n return useContext(SampleContext)\n}\n\n/** Ends the `SampleData` scope for the parts inside a card that already shows the mark. */\nexport function SampleClaim({ children }: { children?: ReactNode }) {\n return <SampleContext.Provider value={null}>{children}</SampleContext.Provider>\n}\n\nexport interface SampleBadgeProps extends HTMLAttributes<HTMLSpanElement> {\n /** 印の文言。既定「見本の値」。 */\n label?: string\n}\n\nexport function SampleBadge({ label = DEFAULT_SAMPLE_LABEL, className, ...props }: SampleBadgeProps) {\n return (\n <Badge\n data-slot=\"sample-badge\"\n title={SAMPLE_TITLE}\n className={cn(\"border-warning/30 bg-warning-subtle text-warning align-middle\", className)}\n {...props}\n >\n {label}\n </Badge>\n )\n}\n\nexport interface SampleDataProps {\n /** 印の文言。既定「見本の値」。 */\n label?: string\n children?: ReactNode\n}\n\nexport function SampleData({ label = DEFAULT_SAMPLE_LABEL, children }: SampleDataProps) {\n // A stable value, so the cards inside do not re-render when only the parent does.\n const state = useMemo(() => ({ label }), [label])\n return (\n <div data-slot=\"sample-data\" style={{ display: \"contents\" }}>\n <SampleContext.Provider value={state}>{children}</SampleContext.Provider>\n </div>\n )\n}\n","\"use client\"\n\n/**\n * DashboardCard — the tighter card used for dashboard tiles: smaller padding\n * than the plain `Card`, a title/description/action header, and a matching\n * skeleton for the loading state. `DashboardCardPreset` wires the common\n * arrangement in one prop-driven component.\n *\n * - **Rows line up by subgrid.** `subgrid={3}` (header, content, footer) or `{2}` makes the\n * tile span that many rows of its parent grid (`row-span-N` + `grid-template-rows: subgrid`),\n * so tiles placed directly in one grid share the top edge of each part. Parts that are not\n * given are not drawn (no empty header or footer, no fixed `h-*` / `min-h-*`); the preset puts\n * each part on its own row. Without `subgrid` it is a plain block.\n * - **`size=\"sm\"`** is a step tighter (padding), for two tiles side by side in a narrow place.\n *\n * Use it for tiles that hold a chart, ranking or table. For a single KPI use\n * `KpiCard` — it is already a card, and computes the delta, labels and target\n * lines from the values.\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Skeleton } from \"../ui/skeleton\"\nimport { SampleBadge, SampleClaim, useSampleMark } from \"./sample-data\"\n\nexport interface DashboardCardProps extends HTMLAttributes<HTMLDivElement> {\n /** 親の grid の何行にまたがって subgrid で揃えるか(ヘッダー・本文・フッターなら 3、ヘッダー・本文なら 2)。未指定なら通常のブロック。 */\n subgrid?: 2 | 3\n /** `\"sm\"` は一段小さい余白。Sheet の中などで 2 枚を横に並べるとき。既定 `\"default\"`。 */\n size?: \"default\" | \"sm\"\n}\n\nconst SUBGRID_CLASS = {\n 2: \"row-span-2 grid content-start grid-rows-subgrid\",\n 3: \"row-span-3 grid content-start grid-rows-subgrid\",\n} as const\n\nexport const DashboardCard = forwardRef<HTMLDivElement, DashboardCardProps>(\n ({ className, subgrid, size = \"default\", ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"dashboard-card\"\n data-size={size}\n className={cn(\n \"group rounded-xl border bg-card shadow-[var(--shadow-card)] px-1 py-1 text-card-foreground\",\n subgrid && SUBGRID_CLASS[subgrid],\n className,\n )}\n {...props}\n />\n ),\n)\nDashboardCard.displayName = \"DashboardCard\"\n\nexport interface DashboardCardHeaderProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const DashboardCardHeader = forwardRef<HTMLDivElement, DashboardCardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"dashboard-card-header\"\n className={cn(\"flex flex-row items-start justify-between gap-4 px-3 py-3 group-data-[size=sm]:px-2 group-data-[size=sm]:py-2\", className)}\n {...props}\n />\n ),\n)\nDashboardCardHeader.displayName = \"DashboardCardHeader\"\n\nexport interface DashboardCardTitleProps extends HTMLAttributes<HTMLHeadingElement> {}\n\nexport const DashboardCardTitle = forwardRef<HTMLHeadingElement, DashboardCardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n data-slot=\"dashboard-card-title\"\n className={cn(\"text-sm leading-none font-semibold tracking-tight\", className)}\n {...props}\n />\n ),\n)\nDashboardCardTitle.displayName = \"DashboardCardTitle\"\n\nexport interface DashboardCardDescriptionProps extends HTMLAttributes<HTMLParagraphElement> {}\n\nexport const DashboardCardDescription = forwardRef<\n HTMLParagraphElement,\n DashboardCardDescriptionProps\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"dashboard-card-description\"\n className={cn(\"text-xs text-muted-foreground\", className)}\n {...props}\n />\n))\nDashboardCardDescription.displayName = \"DashboardCardDescription\"\n\nexport interface DashboardCardActionProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const DashboardCardAction = forwardRef<HTMLDivElement, DashboardCardActionProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"dashboard-card-action\"\n className={cn(\"ml-auto shrink-0\", className)}\n {...props}\n />\n ),\n)\nDashboardCardAction.displayName = \"DashboardCardAction\"\n\nexport interface DashboardCardContentProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const DashboardCardContent = forwardRef<HTMLDivElement, DashboardCardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"dashboard-card-content\" className={cn(\"p-3 group-data-[size=sm]:p-2\", className)} {...props} />\n ),\n)\nDashboardCardContent.displayName = \"DashboardCardContent\"\n\nexport interface DashboardCardFooterProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const DashboardCardFooter = forwardRef<HTMLDivElement, DashboardCardFooterProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"dashboard-card-footer\"\n className={cn(\"flex items-center px-3 py-1.5 group-data-[size=sm]:px-2\", className)}\n {...props}\n />\n ),\n)\nDashboardCardFooter.displayName = \"DashboardCardFooter\"\n\nexport interface DashboardCardSkeletonProps {\n className?: string\n}\n\nexport function DashboardCardSkeleton({ className }: DashboardCardSkeletonProps) {\n return (\n <div\n data-slot=\"dashboard-card-skeleton\"\n className={cn(\"rounded-xl border bg-card p-6 shadow-[var(--shadow-card)]\", className)}\n >\n <div className=\"flex items-start justify-between gap-4 pb-4\">\n <Skeleton className=\"h-5 w-32\" />\n <Skeleton className=\"h-8 w-8 rounded-md\" />\n </div>\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"mt-2 h-4 w-3/4\" />\n </div>\n )\n}\n\nexport interface DashboardCardPresetProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"title\">,\n Pick<DashboardCardProps, \"subgrid\" | \"size\"> {\n title?: ReactNode\n description?: ReactNode\n actions?: ReactNode\n footer?: ReactNode\n headerClassName?: string\n contentClassName?: string\n footerClassName?: string\n}\n\nexport function DashboardCardPreset({\n title,\n description,\n actions,\n footer,\n children,\n headerClassName,\n contentClassName,\n footerClassName,\n className,\n subgrid,\n ...props\n}: DashboardCardPresetProps) {\n // Inside SampleData the card shows the mark in its header, and the parts inside it do not repeat it.\n const sample = useSampleMark()\n const hasHeader = title || description || actions || sample\n return (\n <DashboardCard className={className} subgrid={subgrid} {...props}>\n <SampleClaim>\n {hasHeader && (\n <DashboardCardHeader className={cn(subgrid && \"row-start-1\", headerClassName)}>\n {(title || description) && (\n <div>\n {title && <DashboardCardTitle>{title}</DashboardCardTitle>}\n {description && <DashboardCardDescription>{description}</DashboardCardDescription>}\n </div>\n )}\n {(actions || sample) && (\n <DashboardCardAction className={cn(sample && actions && \"flex items-center gap-2\")}>\n {sample && <SampleBadge label={sample.label} />}\n {actions}\n </DashboardCardAction>\n )}\n </DashboardCardHeader>\n )}\n {children && (\n <DashboardCardContent className={cn(subgrid && \"row-start-2\", contentClassName)}>\n {children}\n </DashboardCardContent>\n )}\n {footer && (\n <DashboardCardFooter className={cn(subgrid === 3 && \"row-start-3\", footerClassName)}>\n {footer}\n </DashboardCardFooter>\n )}\n </SampleClaim>\n </DashboardCard>\n )\n}\n","/**\n * Chart theming — reads the design tokens off the document and turns them into\n * an ECharts theme object.\n *\n * Canvas can't resolve CSS variables *while painting*, which is why series\n * colours can't just be `var(--chart-1)`. It can resolve them once, up front:\n * `getComputedStyle` returns the substituted value, and that value is handed to\n * `echarts.init` as a theme. Every colour is normalized to `rgb()`/`#rrggbb`\n * first — zrender's own colour parser only understands hex/`rgb()`/`hsl()`.\n * Canvas still paints an `oklch()` series, but every colour zrender derives from\n * it comes out empty: the hover emphasis lifts the fill, can't parse it, and the\n * hovered bar disappears. A `fillStyle` round-trip is not enough on its own —\n * current Chrome serializes `oklch()` back as `oklch()` — so a colour that comes\n * back in any other form is painted onto the canvas and read back as a pixel.\n */\nimport { createContext, useCallback, useEffect, useRef, useState, type ForwardedRef } from \"react\"\n\nimport type { ChartTone } from \"./types\"\n\n/**\n * The colour of the folded「その他」series / slice / row. The ONLY place this\n * grey is defined — every chart takes it from here. It is the most subdued\n * colour in a chart, not the darkest: the theme's `--neutral` mixed halfway into\n * `--background`, so it recedes in light and dark alike (and brand themes follow\n * it). `--neutral-subtle` alone sits too close to the background to read as a\n * slice. Canvas charts resolve it through `resolveChartColors`.\n */\nexport const CHART_OTHER_COLOR = \"color-mix(in oklab, var(--neutral) 50%, var(--background))\"\n\n/**\n * True inside `ChartFrame`. The frame's plot area carries the chart's single\n * `role=\"img\"` and label, so `EChart` drops its own when it sees this.\n */\nexport const ChartFrameContext = createContext(false)\n\n/** Series palette, in order. Missing tokens are skipped, not defaulted. */\nconst SERIES_TOKENS = [\"--chart-1\", \"--chart-2\", \"--chart-3\", \"--chart-4\", \"--chart-5\"] as const\n\nexport interface ChartTokens {\n /** Resolved `--chart-1..5`, in order. */\n series: string[]\n /** Body text: titles and the default `textStyle`. */\n foreground: string | null\n /** Secondary text: axis labels, legend, subtitles. */\n mutedForeground: string | null\n /** Axis lines, ticks, split lines, tooltip border. */\n border: string | null\n /** Tooltip surface. */\n popover: string | null\n /** Tooltip text. */\n popoverForeground: string | null\n}\n\nlet normalizeContext: CanvasRenderingContext2D | null | undefined\n\n/** The forms `fillStyle` serializes legacy colours to, and zrender can parse. */\nconst ZRENDER_COLOR_RE = /^(?:#[0-9a-f]{6}|rgba?\\()/i\n\n/**\n * Serialize a CSS colour into a canvas-safe form, or `null` if the browser\n * rejects it. Assigning an invalid value to `fillStyle` is a no-op, so the same\n * input is written over two different known colours: agreeing results mean the\n * value parsed, differing ones mean it was dropped.\n */\nfunction toCanvasColor(value: string): string | null {\n const raw = value.trim()\n if (!raw) return null\n if (normalizeContext === undefined) {\n const canvas = document.createElement(\"canvas\")\n canvas.width = 1\n canvas.height = 1\n normalizeContext = canvas.getContext(\"2d\", { willReadFrequently: true })\n }\n const ctx = normalizeContext\n if (!ctx) return raw\n ctx.fillStyle = \"#000000\"\n ctx.fillStyle = raw\n const onBlack = ctx.fillStyle\n ctx.fillStyle = \"#ffffff\"\n ctx.fillStyle = raw\n if (onBlack !== ctx.fillStyle || typeof onBlack !== \"string\") return null\n if (ZRENDER_COLOR_RE.test(onBlack)) return onBlack\n // Still `oklch()` / `lab()` / `color(...)`: paint it and read the pixel back.\n // Wide-gamut colours clip to sRGB, which is all zrender can express anyway.\n ctx.clearRect(0, 0, 1, 1)\n ctx.fillRect(0, 0, 1, 1)\n const [r = 0, g = 0, b = 0, a = 0] = ctx.getImageData(0, 0, 1, 1).data\n return a === 255\n ? `rgb(${r}, ${g}, ${b})`\n : `rgba(${r}, ${g}, ${b}, ${Math.round((a / 255) * 1000) / 1000})`\n}\n\n/**\n * Read the chart tokens off `el` (the document root by default — tokens live on\n * `:root` and inherit). Returns `null` outside the browser so callers fall back\n * to plain ECharts defaults.\n */\nexport function readChartTokens(el?: Element | null): ChartTokens | null {\n if (typeof document === \"undefined\") return null\n const target = el ?? document.documentElement\n if (!target) return null\n const styles = getComputedStyle(target)\n const read = (name: string) => toCanvasColor(styles.getPropertyValue(name))\n const series: string[] = []\n for (const token of SERIES_TOKENS) {\n const color = read(token)\n if (color) series.push(color)\n }\n return {\n series,\n foreground: read(\"--foreground\"),\n mutedForeground: read(\"--muted-foreground\"),\n border: read(\"--border\"),\n popover: read(\"--popover\"),\n popoverForeground: read(\"--popover-foreground\"),\n }\n}\n\n/** Structural equality, so a theme toggle that changes nothing doesn't re-init. */\nexport function sameChartTokens(a: ChartTokens | null, b: ChartTokens | null): boolean {\n if (a === b) return true\n if (!a || !b) return false\n return (\n a.series.length === b.series.length &&\n a.series.every((color, i) => color === b.series[i]) &&\n a.foreground === b.foreground &&\n a.mutedForeground === b.mutedForeground &&\n a.border === b.border &&\n a.popover === b.popover &&\n a.popoverForeground === b.popoverForeground\n )\n}\n\n/**\n * Watch everything that can change the resolved tokens and call `onChange` when\n * something might have. It only ever says \"re-read\" — the caller compares with\n * `sameChartTokens` and decides whether anything actually moved. Returns a\n * disposer.\n *\n * Two sources, not one:\n * - light/dark flips, which land as `class` / `data-theme` (or an inline\n * `style`) on `<html>`/`<body>`, or as an OS preference change\n * - stylesheet changes. In dev, editing `styles.css` rewrites the injected\n * `<style>` in `<head>` and touches nothing else, so watching the theme\n * attributes alone leaves the chart painted in the previous palette until a\n * reload — the tokens in the DOM are new, the canvas is not.\n */\nexport function watchChartTokens(onChange: () => void): () => void {\n if (typeof document === \"undefined\") return () => {}\n // Style edits arrive as bursts of mutations; coalesce them into one read, and\n // take it after the next frame so a swapped stylesheet has been applied.\n let frame = 0\n const schedule = () => {\n if (frame) return\n frame = requestAnimationFrame(() => {\n frame = 0\n onChange()\n })\n }\n\n const themeObserver = new MutationObserver(schedule)\n const attributeFilter = [\"class\", \"style\", \"data-theme\"]\n themeObserver.observe(document.documentElement, { attributes: true, attributeFilter })\n if (document.body) themeObserver.observe(document.body, { attributes: true, attributeFilter })\n\n const styleObserver = new MutationObserver(schedule)\n if (document.head) {\n styleObserver.observe(document.head, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: [\"href\", \"media\", \"disabled\"],\n })\n }\n\n // A swapped `<link>` only applies once the sheet has loaded, after its mutation.\n const onLoad = (event: Event) => {\n if (event.target instanceof HTMLLinkElement) schedule()\n }\n document.addEventListener(\"load\", onLoad, true)\n\n const media = window.matchMedia(\"(prefers-color-scheme: dark)\")\n media.addEventListener(\"change\", schedule)\n\n return () => {\n if (frame) cancelAnimationFrame(frame)\n themeObserver.disconnect()\n styleObserver.disconnect()\n document.removeEventListener(\"load\", onLoad, true)\n media.removeEventListener(\"change\", schedule)\n }\n}\n\n/** Shared shape for the four axis types ECharts themes address separately. */\nfunction axisTheme(tokens: ChartTokens, splitLine: boolean) {\n const line = tokens.border ?? undefined\n return {\n axisLine: { show: false },\n axisTick: { show: false },\n axisLabel: { show: true, color: tokens.mutedForeground ?? undefined, fontSize: 12 },\n // Faint horizontal rules only: the border colour at low opacity.\n splitLine: { show: splitLine, lineStyle: { color: line ? [line] : undefined, opacity: 0.5, width: 1 } },\n splitArea: { show: false },\n }\n}\n\n/**\n * Build the ECharts theme. `option.color` still wins over `theme.color`, so an\n * app that sets its own palette keeps it.\n */\nexport function buildChartTheme(tokens: ChartTokens): Record<string, unknown> {\n const text = tokens.foreground ?? undefined\n const muted = tokens.mutedForeground ?? undefined\n const line = tokens.border ?? undefined\n return {\n // Let the page background show through: charts sit on cards, not on a canvas.\n backgroundColor: \"transparent\",\n ...(tokens.series.length > 0 ? { color: tokens.series } : {}),\n textStyle: { color: text },\n title: { textStyle: { color: text }, subtextStyle: { color: muted } },\n legend: { textStyle: { color: muted } },\n categoryAxis: axisTheme(tokens, false),\n valueAxis: axisTheme(tokens, true),\n logAxis: axisTheme(tokens, true),\n timeAxis: axisTheme(tokens, true),\n tooltip: {\n // ECharts' default 0.4s transform lags the tooltip ~300ms behind the cursor.\n transitionDuration: 0,\n backgroundColor: tokens.popover ?? undefined,\n borderColor: line,\n borderWidth: 1,\n padding: [8, 12],\n // Rounded card with a soft shadow; in dark mode the shadow barely shows, so the border carries the edge.\n extraCssText: \"border-radius:8px;box-shadow:var(--shadow-card, 0 4px 12px rgb(0 0 0 / 0.08));\",\n textStyle: { color: tokens.popoverForeground ?? undefined, fontSize: 12 },\n axisPointer: { lineStyle: { color: line }, crossStyle: { color: line } },\n },\n }\n}\n\n/**\n * The resolved tokens, kept current: re-read whenever `watchChartTokens` says\n * they may have moved, and only replaced when a value actually changed. For\n * components that build an ECharts option from token colours themselves (the\n * typed charts), so their palette follows light/dark like `EChart`'s theme.\n */\nexport function useChartTokens(): ChartTokens | null {\n const [tokens, setTokens] = useState<ChartTokens | null>(() => readChartTokens())\n // Compared here, not inside a `setTokens` updater: an updater that reads the DOM is\n // replayed by React on every rebase and returns a fresh object each time, so the state\n // never settles (\"Maximum update depth exceeded\" once the tokens change after mount).\n const tokensRef = useRef(tokens)\n useEffect(() => {\n const sync = () => {\n const next = readChartTokens()\n if (sameChartTokens(tokensRef.current, next)) return\n tokensRef.current = next\n setTokens(next)\n }\n sync()\n return watchChartTokens(sync)\n }, [])\n return tokens\n}\n\nconst SERIES_TOKEN_NAME_RE = /^chart-([1-5])$/\nconst TONE_NAME_RE = /^(?:positive|warning|negative|neutral|info)(?:-fill)?$/\nconst CSS_VAR_RE = /^var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*(.+))?\\)$/\nconst EMBEDDED_VAR_RE = /var\\(\\s*(--[\\w-]+)\\s*\\)/g\n\n/**\n * Turn chart colours into canvas-safe strings. `\"chart-1\"`〜`\"chart-5\"` come from\n * the resolved series tokens; `\"positive\"` / `\"warning\"` / `\"negative\"` / `\"neutral\"` (and the area\n * variants `\"positive-fill\"`, …) are read off the document root (`--positive`, …); `var(--token)` is read off the document root; any\n * other CSS colour is normalized like the tokens are. A colour that can't be\n * resolved comes back as `\"\"`, which ECharts treats as \"use the palette\".\n */\nexport function resolveChartColors(colors: readonly string[], tokens: ChartTokens | null): string[] {\n return colors.map((color) => {\n const token = SERIES_TOKEN_NAME_RE.exec(color.trim())\n if (token) return tokens?.series[Number(token[1]) - 1] ?? \"\"\n // Meaning colours are the theme tokens of the same name: same path as `var(--positive)`.\n if (TONE_NAME_RE.test(color.trim())) {\n if (typeof document === \"undefined\") return \"\"\n return toCanvasColor(getComputedStyle(document.documentElement).getPropertyValue(`--${color.trim()}`)) ?? \"\"\n }\n if (typeof document === \"undefined\") return color\n let value = color.trim()\n const cssVar = CSS_VAR_RE.exec(value)\n const styles = getComputedStyle(document.documentElement)\n if (cssVar) {\n value = styles.getPropertyValue(cssVar[1]!).trim() || (cssVar[2] ?? \"\").trim()\n } else if (value.includes(\"var(\")) {\n // A colour function over tokens (`color-mix(… var(--muted-foreground) …)`):\n // substitute the tokens, then let the canvas resolve the rest.\n value = value.replace(EMBEDDED_VAR_RE, (_, name: string) => styles.getPropertyValue(name).trim())\n }\n return toCanvasColor(value) ?? \"\"\n })\n}\n\n/** Every meaning colour resolved for the canvas (`\"\"` when it can't be resolved). */\nexport function resolveToneColors(tokens: ChartTokens | null): Record<ChartTone, string> {\n const [positive = \"\", warning = \"\", negative = \"\", neutral = \"\"] = resolveChartColors(\n [\"positive\", \"warning\", \"negative\", \"neutral\"],\n tokens,\n )\n return { positive, warning, negative, neutral }\n}\n\n/** The area (`--<tone>-fill`) colours of every meaning tone, resolved for the canvas (`\"\"` when it can't be resolved). */\nexport function resolveFillColors(tokens: ChartTokens | null): Record<ChartTone, string> {\n const [positive = \"\", warning = \"\", negative = \"\", neutral = \"\"] = resolveChartColors(\n [\"positive-fill\", \"warning-fill\", \"negative-fill\", \"neutral-fill\"],\n tokens,\n )\n return { positive, warning, negative, neutral }\n}\n\nconst TRANSPARENT_RE = /^(?:transparent|rgba\\([^)]*,\\s*0(?:\\.0+)?\\))$/i\n\n/**\n * The colour the chart is painted on: the first opaque `background-color` up\n * from `el` (a card, the page), else `--background`. Canvas-safe, or `null`\n * outside the browser.\n */\nexport function readChartSurface(el: Element | null): string | null {\n if (typeof document === \"undefined\") return null\n for (let node: Element | null = el; node; node = node.parentElement) {\n const bg = getComputedStyle(node).backgroundColor.trim()\n if (bg && !TRANSPARENT_RE.test(bg)) {\n const color = toCanvasColor(bg)\n if (color) return color\n }\n }\n return toCanvasColor(getComputedStyle(document.documentElement).getPropertyValue(\"--background\"))\n}\n\n/** Widths are bucketed so a resize only rebuilds the option when the label budget can change. */\nconst WIDTH_BUCKET = 40\n\n/**\n * The surface colour behind a chart (see `readChartSurface`), re-read when the\n * tokens move (light/dark), and the plot's width (rounded down to 40px;\n * `undefined` until measured). Returns a ref for the plot that also feeds the\n * component's forwarded ref.\n */\nexport function useChartSurface<E extends Element>(\n forwarded: ForwardedRef<E>,\n tokens: ChartTokens | null,\n): { ref: (el: E | null) => void; surface: string | undefined; width: number | undefined } {\n const [node, setNode] = useState<E | null>(null)\n const [surface, setSurface] = useState<string | undefined>(undefined)\n const [width, setWidth] = useState<number | undefined>(undefined)\n const ref = useCallback(\n (el: E | null) => {\n setNode(el)\n if (typeof forwarded === \"function\") forwarded(el)\n else if (forwarded) forwarded.current = el\n },\n [forwarded],\n )\n useEffect(() => {\n if (!node) return\n setSurface(readChartSurface(node) ?? undefined)\n }, [node, tokens])\n useEffect(() => {\n if (!node || typeof ResizeObserver === \"undefined\") return\n const update = (w: number) => setWidth(Math.floor(w / WIDTH_BUCKET) * WIDTH_BUCKET)\n update(node.getBoundingClientRect().width)\n const observer = new ResizeObserver((entries) => update(entries[0]?.contentRect.width ?? 0))\n observer.observe(node)\n return () => observer.disconnect()\n }, [node])\n return { ref, surface, width }\n}\n","\"use client\"\n\n/**\n * ChartFrame — the frame every typed chart renders in: an optional title and a\n * one-sentence summary above a plot area of fixed height. The plot is labelled\n * by the title and described by the summary, so a screen reader hears what the\n * chart says, not just that there is one.\n *\n * The plot area is the frame's one `role=\"img\"` (`EChart` inside it drops its\n * own); `dataTable` adds the numbers as a visually-hidden table beside it, so a\n * screen reader can read the values the canvas only draws.\n *\n * The plot area keeps its height in every state: while loading it shows a\n * skeleton shaped like the final chart, and with no data it says so (and offers\n * one action) instead of drawing empty axes.\n */\nimport { forwardRef, useId, type HTMLAttributes, type ReactNode } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { ChartFrameContext } from \"../lib/chart-theme\"\nimport type { ChartDataTable } from \"../lib/chart-utils\"\nimport type { ChartEmptyState } from \"../lib/types\"\n\n/** The shape the loading skeleton takes, matching the chart it stands in for. */\nexport type ChartSkeletonVariant = \"line\" | \"area\" | \"bar\" | \"donut\" | \"list\"\n\n/** The plot height of every typed chart unless `height` says otherwise (px). */\nexport const DEFAULT_CHART_HEIGHT = 288\n\nconst DEFAULT_EMPTY_TITLE = \"表示できるデータがありません\"\n\nexport interface ChartFrameProps extends Omit<HTMLAttributes<HTMLElement>, \"title\" | \"children\"> {\n /** グラフの見出し。プロット領域の `aria-labelledby` になる。 */\n title?: string\n /** 1 文の要約。見出しの下に出し、プロット領域の `aria-describedby` になる。 */\n summary?: string\n /** 読み込み中。`variant` の形のスケルトンを同じ高さで出す。 */\n isLoading?: boolean\n /** データが無い。高さを保ったまま `emptyState` を出す。 */\n isEmpty?: boolean\n emptyState?: ChartEmptyState\n /** プロット領域の高さ。数値は px。既定 288。 */\n height?: number | string\n /** スケルトンの形。既定 `\"line\"`。 */\n variant?: ChartSkeletonVariant\n /** 見出しが無いときのプロット領域のラベル。 */\n ariaLabel?: string\n /**\n * プロット領域の役割。既定 `\"img\"`(canvas のグラフ)。行がボタンやリンクになる\n * HTML のグラフ(BarList・FunnelSteps)は `\"group\"` にして、中身を読ませる。\n */\n plotRole?: \"img\" | \"group\"\n /** 値の表。画面には出さず(`sr-only`)、スクリーンリーダー向けに図の中に置く。`chartDataTable` で作る。 */\n dataTable?: ChartDataTable\n /** プロット(チャート本体)。読み込み中・空のときは描かない。 */\n children?: ReactNode\n}\n\n/**\n * The frame. `ref` points at the plot area (the element with the fixed height),\n * `className` / other attributes go to the outer `<figure>`.\n */\nexport const ChartFrame = forwardRef<HTMLDivElement, ChartFrameProps>(function ChartFrame(\n {\n title,\n summary,\n isLoading = false,\n isEmpty = false,\n emptyState,\n height = DEFAULT_CHART_HEIGHT,\n variant = \"line\",\n ariaLabel,\n plotRole = \"img\",\n dataTable,\n className,\n children,\n ...props\n },\n ref,\n) {\n const id = useId()\n const titleId = title ? `${id}-title` : undefined\n const summaryId = summary ? `${id}-summary` : undefined\n const state = isLoading ? \"loading\" : isEmpty ? \"empty\" : \"ready\"\n\n return (\n <figure data-slot=\"chart-frame\" className={cn(\"m-0 flex w-full min-w-0 flex-col gap-3\", className)} {...props}>\n {(title || summary) && (\n <figcaption data-slot=\"chart-frame-header\" className=\"flex flex-col gap-1\">\n {title && (\n <h3 id={titleId} data-slot=\"chart-frame-title\" className=\"text-sm leading-none font-medium\">\n {title}\n </h3>\n )}\n {summary && (\n <p id={summaryId} data-slot=\"chart-frame-summary\" className=\"text-sm text-muted-foreground\">\n {summary}\n </p>\n )}\n </figcaption>\n )}\n <div\n ref={ref}\n data-slot=\"chart-frame-body\"\n data-state={state}\n role={state === \"ready\" ? plotRole : \"group\"}\n aria-label={titleId ? undefined : ariaLabel}\n aria-labelledby={titleId}\n aria-describedby={summaryId}\n aria-busy={isLoading || undefined}\n className=\"relative w-full min-w-0\"\n style={{ height: typeof height === \"number\" ? `${height}px` : height }}\n >\n {state === \"loading\" ? (\n <ChartSkeleton variant={variant} />\n ) : state === \"empty\" ? (\n <ChartEmpty {...emptyState} />\n ) : (\n <ChartFrameContext.Provider value>{children}</ChartFrameContext.Provider>\n )}\n </div>\n {state === \"ready\" && dataTable && dataTable.rows.length > 0 && (\n <ChartDataTableView table={dataTable} fallbackCaption={title ?? ariaLabel} />\n )}\n </figure>\n )\n})\nChartFrame.displayName = \"ChartFrame\"\n\n/* ---------------------------------------------------------------- skeleton */\n\nconst BAR_HEIGHTS = [58, 74, 46, 88, 64, 80, 52]\nconst LIST_WIDTHS = [92, 76, 64, 48, 36]\nconst LINE_POINTS = \"0,70 16,58 33,62 50,40 66,46 83,28 100,34\"\n\nfunction ChartSkeleton({ variant }: { variant: ChartSkeletonVariant }) {\n const pulse = \"animate-pulse motion-reduce:animate-none\"\n return (\n <div data-slot=\"chart-skeleton\" data-variant={variant} className=\"absolute inset-0 flex flex-col gap-3\">\n <div aria-hidden=\"true\" className=\"contents\">\n {variant === \"list\" ? (\n <div className={cn(\"flex flex-1 flex-col justify-around\", pulse)}>\n {LIST_WIDTHS.map((w) => (\n <div key={w} className=\"flex items-center gap-3\">\n <div className=\"h-5 rounded-sm bg-muted\" style={{ width: `${w}%` }} />\n </div>\n ))}\n </div>\n ) : variant === \"donut\" ? (\n <div className={cn(\"flex flex-1 items-center justify-center\", pulse)}>\n <svg viewBox=\"0 0 100 100\" className=\"h-full max-h-full w-auto text-muted\">\n <circle cx=\"50\" cy=\"50\" r=\"40\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"14\" />\n </svg>\n </div>\n ) : variant === \"bar\" ? (\n <div className={cn(\"flex flex-1 items-end gap-3 px-1\", pulse)}>\n {BAR_HEIGHTS.map((h, i) => (\n <div key={i} className=\"flex-1 rounded-t-sm bg-muted\" style={{ height: `${h}%` }} />\n ))}\n </div>\n ) : (\n // A soft muted silhouette only — no stroke, no baseline, nothing that reads as a data line.\n <div className={cn(\"relative flex-1\", pulse)}>\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" className=\"absolute inset-0 h-full w-full text-muted\">\n <polygon points={`${LINE_POINTS} 100,100 0,100`} fill=\"currentColor\" opacity={variant === \"area\" ? 0.8 : 0.5} />\n </svg>\n </div>\n )}\n </div>\n <span className=\"sr-only\">読み込み中</span>\n </div>\n )\n}\n\n/* --------------------------------------------------------------- data table */\n\nfunction ChartDataTableView({ table, fallbackCaption }: { table: ChartDataTable; fallbackCaption?: string }) {\n const caption = table.caption ?? fallbackCaption\n // The wrapper is the visually-hidden box: `sr-only` on the <table> itself still\n // lets table auto-layout give it a real width, which overflows narrow pages.\n return (\n <div data-slot=\"chart-frame-table-wrapper\" className=\"sr-only\">\n <table data-slot=\"chart-frame-table\">\n {caption && <caption>{caption}</caption>}\n <thead>\n <tr>\n {table.columns.map((column, i) => (\n <th key={i} scope=\"col\">\n {column}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {table.rows.map((row, r) => (\n <tr key={r}>\n {row.map((cell, c) =>\n c === 0 ? (\n <th key={c} scope=\"row\">\n {cell}\n </th>\n ) : (\n <td key={c}>{cell}</td>\n ),\n )}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n/* ------------------------------------------------------------------- empty */\n\nfunction ChartEmpty({ title, description, action }: ChartEmptyState) {\n return (\n <div\n data-slot=\"chart-empty\"\n className=\"absolute inset-0 flex flex-col items-center justify-center gap-1 rounded-md border border-dashed border-border p-6 text-center\"\n >\n <p className=\"text-sm font-medium text-balance\">{title ?? DEFAULT_EMPTY_TITLE}</p>\n {description && <p className=\"max-w-prose text-sm text-balance text-muted-foreground\">{description}</p>}\n {action && <div className=\"mt-3\">{action}</div>}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * EChart — a thin Apache ECharts wrapper. It owns the canvas lifecycle (init,\n * resize, dispose), forwards `option` and event handlers, drives the loading\n * spinner, and can copy/download the chart as a PNG.\n *\n * Colours follow the design tokens: `--chart-1..5` become the series palette,\n * and the text/border/popover tokens style axes, legend and tooltip. They're\n * resolved once at init (see `chart-theme.ts`) and re-read whenever they can\n * have changed — a light/dark flip, or a stylesheet swap such as editing\n * `styles.css` while the dev server is running. `theme` opts out entirely;\n * `option.color` overrides just the palette and keeps the rest.\n *\n * Pitfall: the canvas can't read CSS. A colour written into the option as\n * `\"var(--chart-1)\"`, `\"chart-1\"` or `\"oklch(…)\"` paints black (or nothing).\n * Leave colours out and the tokens apply; when you must set one yourself, pass\n * it through `useResolvedChartColors` and use the result:\n *\n * @example\n * const [accent] = useResolvedChartColors([\"chart-2\"])\n * const option = { series: [{ type: \"line\", data, lineStyle: { color: accent } }] }\n * return <EChart option={option} />\n *\n * Updates merge instead of replacing (`replaceMerge` on every component type in\n * play), so series with a stable `id` transition to their new values while\n * anything dropped from the option is still removed. With\n * `prefers-reduced-motion: reduce` every animation is off.\n *\n * ECharts is loaded modularly (`echarts/core`): only the bar / line / pie series (and `custom`, which draws\n * the per-bar target marker),\n * the components the typed charts emit and the canvas renderer are registered\n * below. To draw anything else with `<EChart>` (scatter, funnel, dataZoom, …),\n * register it once in your own code:\n *\n * @example\n * import { use } from \"echarts/core\"\n * import { ScatterChart } from \"echarts/charts\"\n * use([ScatterChart])\n */\nimport { forwardRef, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\"\nimport { init, use } from \"echarts/core\"\nimport { BarChart, CustomChart, LineChart, PieChart } from \"echarts/charts\"\nimport {\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n MarkPointComponent,\n TooltipComponent,\n} from \"echarts/components\"\nimport { CanvasRenderer } from \"echarts/renderers\"\nimport type { ECharts, EChartsOption } from \"echarts\"\nimport { Check, Copy, Download } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"../ui/button\"\nimport type { ChartActionsOptions } from \"../lib/types\"\nimport {\n buildChartTheme,\n ChartFrameContext,\n resolveChartColors,\n useChartTokens,\n readChartTokens,\n sameChartTokens,\n watchChartTokens,\n type ChartTokens,\n} from \"../lib/chart-theme\"\n\n// What the typed charts (Bar / Line / Area / Donut) emit. Other series and\n// components are the consumer's to `use()` — see the note at the top.\nuse([\n BarChart,\n CustomChart,\n LineChart,\n PieChart,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n MarkPointComponent,\n TooltipComponent,\n CanvasRenderer,\n])\n\nexport interface EChartProps {\n /**\n * ECharts のオプション。\n *\n * 型推論を効かせるため、必ず `EChartsOption` を annotation するか\n * `satisfies EChartsOption` を付けること。付けないと `type: \"category\"` などの\n * literal が `string` に拡張され、ビルドが失敗する。\n *\n * @example\n * import type { EChartsOption } from \"@/components/echart\"\n *\n * const option: EChartsOption = {\n * xAxis: { type: \"category\", data: [\"A\", \"B\"] },\n * yAxis: { type: \"value\" },\n * series: [{ type: \"bar\", data: [1, 2] }],\n * }\n * <EChart option={option} />\n */\n option: EChartsOption\n /**\n * チャートの高さ。数値は px、文字列は CSS 値(例: `\"50vh\"`)として扱う。\n *\n * 省略した場合は外側ラッパーに `h-[400px]` がデフォルトで当たるが、`className` に\n * `h-full` や `h-[360px]` などの高さクラスを渡せばそちらが優先される\n * (`h-full` を使う場合は親要素に確定した高さが必要)。\n * `height` と `className` の高さを両方指定した場合は `height`(インライン style)が勝つ。\n */\n height?: string | number\n loading?: boolean\n /**\n * `echarts.init` にそのまま渡すテーマ(名前または登録済みテーマオブジェクト)。\n *\n * 渡すとデザイントークン追従は**完全に無効**になり、明暗の切り替えにも追従しなく\n * なる。系列色だけ変えたいなら `option.color` を使う ― option はテーマより優先\n * されるので、軸・凡例・ツールチップのトークン追従は残る。\n */\n theme?: string | object\n onEvents?: Record<string, (params: unknown) => void>\n ariaLabel?: string\n className?: string\n /**\n * true にするとチャート右上に PNG コピー / ダウンロードボタンを表示する。\n * `exportHeader` があれば PNG の上にその見出しを含める(`{ includeTitle: false }` で含めない)。\n */\n actions?: boolean | ChartActionsOptions\n /** ダウンロード時のファイル名(拡張子含む)。省略時は \"chart.png\" */\n fileName?: string\n /**\n * PNG の上に含める見出しと要約。型付きグラフは自分の `title` / `summary` を渡す。\n * 自分で `ChartFrame` を組むときも同じものを渡すと、保存した画像だけで何のグラフか分かる。\n */\n exportHeader?: ChartExportHeader\n}\n\n/** The heading a saved PNG carries above the plot. */\nexport interface ChartExportHeader {\n title?: string\n summary?: string\n}\n\nconst HEADER_PAD_X = 16\nconst HEADER_PAD_TOP = 16\nconst HEADER_PAD_BOTTOM = 12\nconst HEADER_LINE_HEIGHT = 20\nconst HEADER_GAP = 4\nconst HEADER_FONT_SIZE = 14\n\nexport interface ChartExportHeaderLine {\n text: string\n kind: \"title\" | \"summary\"\n}\n\n/**\n * Break `text` into lines no wider than `maxWidth` (px, via `measure`), character\n * by character so Japanese wraps without spaces. Always at least one line for\n * non-empty text; a single over-wide character still gets its own line.\n */\nexport function wrapChartText(text: string, maxWidth: number, measure: (text: string) => number): string[] {\n const lines: string[] = []\n let line = \"\"\n for (const ch of text) {\n if (ch === \"\\n\") {\n lines.push(line)\n line = \"\"\n continue\n }\n if (line !== \"\" && measure(line + ch) > maxWidth) {\n lines.push(line)\n line = ch.trim() === \"\" ? \"\" : ch\n } else {\n line += ch\n }\n }\n if (line !== \"\" || lines.length === 0) lines.push(line)\n return lines.filter((l, i) => l !== \"\" || i < lines.length - 1)\n}\n\n/**\n * The lines and total height (CSS px) of the PNG's heading band for a plot\n * `width` px wide. `measure` takes (text, kind) and returns its width in px.\n * No title and no summary → no band (`height` 0).\n */\nexport function chartExportHeaderLayout(\n header: ChartExportHeader | undefined,\n width: number,\n measure: (text: string, kind: \"title\" | \"summary\") => number,\n): { lines: ChartExportHeaderLine[]; height: number } {\n const title = header?.title?.trim()\n const summary = header?.summary?.trim()\n if (!title && !summary) return { lines: [], height: 0 }\n const room = Math.max(40, width - HEADER_PAD_X * 2)\n const lines: ChartExportHeaderLine[] = [\n ...(title ? wrapChartText(title, room, (t) => measure(t, \"title\")).map((text) => ({ text, kind: \"title\" as const })) : []),\n ...(summary ? wrapChartText(summary, room, (t) => measure(t, \"summary\")).map((text) => ({ text, kind: \"summary\" as const })) : []),\n ]\n const gap = title && summary ? HEADER_GAP : 0\n return { lines, height: HEADER_PAD_TOP + lines.length * HEADER_LINE_HEIGHT + gap + HEADER_PAD_BOTTOM }\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => resolve(image)\n image.onerror = () => reject(new Error(\"PNG の読み込みに失敗しました\"))\n image.src = src\n })\n}\n\n/** Draw a heading band (title in foreground, summary muted) above the exported plot and return the new PNG. */\nasync function pngWithHeader(\n dataUrl: string,\n header: ChartExportHeader,\n look: { background: string; color: string; mutedColor: string; fontFamily: string },\n pixelRatio: number,\n): Promise<string> {\n const image = await loadImage(dataUrl)\n const width = image.width / pixelRatio\n const plotHeight = image.height / pixelRatio\n const canvas = document.createElement(\"canvas\")\n const ctx = canvas.getContext(\"2d\")\n if (!ctx) return dataUrl\n const font = (kind: \"title\" | \"summary\") => `${kind === \"title\" ? 500 : 400} ${HEADER_FONT_SIZE}px ${look.fontFamily}`\n ctx.font = font(\"title\")\n const layout = chartExportHeaderLayout(header, width, (text, kind) => {\n ctx.font = font(kind)\n return ctx.measureText(text).width\n })\n if (layout.height === 0) return dataUrl\n canvas.width = Math.round(image.width)\n canvas.height = Math.round((layout.height + plotHeight) * pixelRatio)\n ctx.scale(pixelRatio, pixelRatio)\n ctx.fillStyle = look.background\n ctx.fillRect(0, 0, width, layout.height + plotHeight)\n ctx.textBaseline = \"middle\"\n let y = HEADER_PAD_TOP\n let previous: \"title\" | \"summary\" | null = null\n for (const line of layout.lines) {\n if (previous === \"title\" && line.kind === \"summary\") y += HEADER_GAP\n ctx.font = font(line.kind)\n ctx.fillStyle = line.kind === \"title\" ? look.color : look.mutedColor\n ctx.fillText(line.text, HEADER_PAD_X, y + HEADER_LINE_HEIGHT / 2)\n y += HEADER_LINE_HEIGHT\n previous = line.kind\n }\n ctx.drawImage(image, 0, layout.height, width, plotHeight)\n return canvas.toDataURL(\"image/png\")\n}\n\n/**\n * Canvas-safe versions of theme colours, kept current across light/dark.\n * Takes `\"chart-1\"`〜`\"chart-5\"`, `\"var(--token)\"` or any CSS colour; one that\n * can't be resolved comes back as `\"\"` (ECharts then uses the palette).\n * Use it whenever a colour goes into a raw `EChart` option by hand.\n *\n * @example\n * const [line, band] = useResolvedChartColors([\"chart-1\", \"var(--muted-foreground)\"])\n */\nexport function useResolvedChartColors(colors: readonly string[]): string[] {\n const tokens = useChartTokens()\n const key = colors.join(\"\\u0000\")\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `key` stands for the array's contents\n return useMemo(() => resolveChartColors(colors, tokens), [key, tokens])\n}\n\ntype EChartsEventHandler = (params: unknown) => void\n\n/**\n * ECharts component main types. Listed in `replaceMerge`, a type keeps only the\n * components whose `id` matches (merged, so they can transition) and drops the\n * rest — including every one of them when the new option no longer has the type.\n */\nconst COMPONENT_MAIN_TYPES = new Set([\n \"title\", \"legend\", \"grid\", \"xAxis\", \"yAxis\", \"polar\", \"radiusAxis\", \"angleAxis\", \"radar\",\n \"dataZoom\", \"visualMap\", \"tooltip\", \"axisPointer\", \"toolbox\", \"brush\", \"geo\", \"parallel\",\n \"parallelAxis\", \"singleAxis\", \"graphic\", \"calendar\", \"dataset\", \"series\", \"matrix\", \"thumbnail\",\n])\n\nexport interface EChartSetOptionOpts {\n notMerge: boolean\n replaceMerge?: string[]\n lazyUpdate: boolean\n}\n\n/**\n * How to apply `next` after `prev`: the first option and timeline / media\n * options replace everything; otherwise merge, replacing every component type\n * either option uses so nothing stale survives.\n */\nexport function echartSetOptionOpts(prev: EChartsOption | null, next: EChartsOption): EChartSetOptionOpts {\n const special = (o: EChartsOption) => \"timeline\" in o || \"baseOption\" in o || \"options\" in o || \"media\" in o\n if (!prev || special(prev) || special(next)) return { notMerge: true, lazyUpdate: true }\n const types = new Set<string>()\n for (const key of [...Object.keys(prev), ...Object.keys(next)]) if (COMPONENT_MAIN_TYPES.has(key)) types.add(key)\n return { notMerge: false, replaceMerge: [...types], lazyUpdate: true }\n}\n\n/** `option` as applied: reduced motion forces `animation: false`; otherwise animation stays explicit so it can flip back. */\nexport function withMotionPreference(option: EChartsOption, reducedMotion: boolean): EChartsOption {\n return { ...option, animation: reducedMotion ? false : (option.animation ?? true) }\n}\n\nconst REDUCED_MOTION_QUERY = \"(prefers-reduced-motion: reduce)\"\n\n/** `prefers-reduced-motion: reduce`, kept current. `false` on the server. */\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(\n () => typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(REDUCED_MOTION_QUERY).matches,\n )\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return\n const media = window.matchMedia(REDUCED_MOTION_QUERY)\n const sync = () => setReduced(media.matches)\n sync()\n media.addEventListener(\"change\", sync)\n return () => media.removeEventListener(\"change\", sync)\n }, [])\n return reduced\n}\n\nexport const EChart = forwardRef<HTMLDivElement, EChartProps>(function EChart(\n {\n option,\n height,\n loading = false,\n theme,\n onEvents,\n ariaLabel,\n className,\n actions = false,\n fileName = \"chart.png\",\n exportHeader,\n },\n ref,\n) {\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [instance, setInstance] = useState<ECharts | null>(null)\n const [copied, setCopied] = useState(false)\n // 初回はレンダー前に読めるので、マウント直後の作り直しが起きない\n const [tokens, setTokens] = useState<ChartTokens | null>(() => readChartTokens())\n const reducedMotion = usePrefersReducedMotion()\n // What the current instance last received, to pick the merge mode of the next update.\n const appliedRef = useRef<EChartsOption | null>(null)\n\n // 明暗の切り替えとスタイルシートの差し替え(dev で styles.css を書き換えたときなど)を\n // 拾ってトークンを読み直す ― 何を見張るかは `watchChartTokens` 側が持つ。値が変わら\n // ないときは state を更新せず、再 init を防ぐ。比較は updater 関数の中ではなく ref で行う:\n // DOM を読む updater は React に何度も再生され、そのたびに新しいオブジェクトを返して\n // 再描画が止まらなくなる(変数を後から当てた直後に Maximum update depth exceeded)。\n const tokensRef = useRef(tokens)\n useEffect(() => {\n if (theme !== undefined) return\n const sync = () => {\n const next = readChartTokens()\n if (sameChartTokens(tokensRef.current, next)) return\n tokensRef.current = next\n setTokens(next)\n }\n sync()\n return watchChartTokens(sync)\n }, [theme])\n\n const autoTheme = useMemo(() => (tokens ? buildChartTheme(tokens) : undefined), [tokens])\n const resolvedTheme = theme ?? autoTheme\n\n // init / re-init: ECharts はテーマの差し替えに対応しないので、テーマが変わったら\n // インスタンスを破棄して作り直す(トークンが実際に変わったときだけここに来る)\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n const inst = init(container, resolvedTheme, { renderer: \"canvas\" })\n appliedRef.current = null\n // `data-rendering` stays on until the (animated) paint is done, so anything\n // capturing the page — printing a document — can wait for real pixels.\n container.dataset.rendering = \"\"\n inst.on(\"finished\", () => {\n delete container.dataset.rendering\n })\n setInstance(inst)\n\n // At most one resize per frame (the sidebar animates the width).\n let frame = 0\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n if (!inst.isDisposed()) inst.resize()\n })\n })\n observer.observe(container)\n\n return () => {\n observer.disconnect()\n cancelAnimationFrame(frame)\n inst.dispose()\n }\n }, [resolvedTheme])\n\n useEffect(() => {\n if (!instance) return\n if (containerRef.current) containerRef.current.dataset.rendering = \"\"\n const next = withMotionPreference(option, reducedMotion)\n instance.setOption(next, echartSetOptionOpts(appliedRef.current, next))\n appliedRef.current = next\n }, [instance, option, reducedMotion])\n\n useEffect(() => {\n if (!instance) return\n if (loading) instance.showLoading()\n else instance.hideLoading()\n }, [instance, loading])\n\n useEffect(() => {\n if (!instance || !onEvents) return\n const entries = Object.entries(onEvents)\n for (const [event, handler] of entries) {\n instance.on(event, handler as EChartsEventHandler)\n }\n return () => {\n if (instance.isDisposed()) return\n for (const [event, handler] of entries) {\n instance.off(event, handler as EChartsEventHandler)\n }\n }\n }, [instance, onEvents])\n\n const includeTitle = typeof actions === \"object\" ? (actions.includeTitle ?? true) : true\n const getPngDataUrl = useCallback(async (): Promise<string | null> => {\n if (!instance) return null\n // Export over the nearest opaque background (card, then page) so the PNG\n // matches what is on screen in dark too. Computed styles resolve to rgb(a),\n // so this stays canvas-safe whatever the token.\n let backgroundColor = \"#ffffff\"\n for (let el: HTMLElement | null = containerRef.current; el; el = el.parentElement) {\n const bg = getComputedStyle(el).backgroundColor\n if (bg && bg !== \"rgba(0, 0, 0, 0)\" && bg !== \"transparent\") {\n backgroundColor = bg\n break\n }\n }\n const pixelRatio = 2\n const dataUrl = instance.getDataURL({ type: \"png\", pixelRatio, backgroundColor })\n if (!includeTitle || !exportHeader || !(exportHeader.title || exportHeader.summary) || !containerRef.current) return dataUrl\n try {\n const style = getComputedStyle(containerRef.current)\n return await pngWithHeader(\n dataUrl,\n exportHeader,\n { background: backgroundColor, color: style.color, mutedColor: tokens?.mutedForeground ?? style.color, fontFamily: style.fontFamily },\n pixelRatio,\n )\n } catch {\n return dataUrl\n }\n }, [instance, includeTitle, exportHeader, tokens])\n\n const handleCopy = useCallback(async () => {\n const dataUrl = await getPngDataUrl()\n if (!dataUrl) return\n try {\n const blob = await (await fetch(dataUrl)).blob()\n await navigator.clipboard.write([new ClipboardItem({ \"image/png\": blob })])\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // ClipboardItem 未対応ブラウザでは silent fail\n }\n }, [getPngDataUrl])\n\n const handleDownload = useCallback(async () => {\n const dataUrl = await getPngDataUrl()\n if (!dataUrl) return\n const link = document.createElement(\"a\")\n link.href = dataUrl\n link.download = fileName\n link.click()\n }, [getPngDataUrl, fileName])\n\n // 高さの解決: height prop を渡した場合はインライン style が勝つ。未指定なら\n // h-[400px] をデフォルトで当て、className の高さクラスに後勝ちさせる。\n const inFrame = useContext(ChartFrameContext)\n const styleHeight =\n height == null ? undefined : typeof height === \"number\" ? `${height}px` : height\n\n return (\n <div\n ref={ref}\n data-slot=\"echart\"\n className={cn(\"group relative w-full\", height == null && \"h-[400px]\", className)}\n style={styleHeight != null ? { height: styleHeight } : undefined}\n >\n {/* `role=\"img\"` wraps the canvas only, so the action buttons stay reachable. Inside a ChartFrame the plot area is the one image. */}\n <div\n ref={containerRef}\n data-slot=\"echart-canvas\"\n className=\"h-full w-full\"\n role={inFrame ? undefined : \"img\"}\n aria-label={inFrame ? undefined : (ariaLabel ?? \"チャート\")}\n />\n {actions && (\n <div\n data-slot=\"echart-actions\"\n className=\"absolute top-2 right-2 z-10 flex gap-1 pointer-events-none opacity-0 transition-opacity group-hover:pointer-events-auto group-hover:opacity-100 focus-within:pointer-events-auto focus-within:opacity-100 [@media(hover:none)]:pointer-events-auto [@media(hover:none)]:opacity-100\"\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleCopy}\n aria-label={copied ? \"コピーしました\" : \"PNG をクリップボードにコピー\"}\n >\n {copied ? <Check className=\"size-4\" /> : <Copy className=\"size-4\" />}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={handleDownload}\n aria-label=\"PNG をダウンロード\"\n >\n <Download className=\"size-4\" />\n </Button>\n </div>\n )}\n </div>\n )\n})\nEChart.displayName = \"EChart\"\n\nexport type { EChartsOption } from \"echarts\"\n","/**\n * Chart helpers shared by the typed charts — colour tokens, number handling and\n * the layout maths of the Tailwind/SVG charts (BarList, CategoryBar,\n * ProgressCircle, Tracker). Pure and DOM-free, so it can be unit-tested; kept\n * internal and inlined into each `vantage add ui` copy.\n */\nimport { DEFAULT_LOCALE, EMPTY_VALUE, formatValue, toValueFormatter, type ValueFormat } from \"./format\"\nimport type { ChartColor, ChartColors, ChartSeriesColor, ChartTone, ValueFormatter } from \"./types\"\n\nconst ROOT_PROP_KEYS = new Set([\"id\", \"style\", \"role\", \"tabIndex\", \"lang\", \"hidden\"])\nconst ROOT_PROP_PREFIX_RE = /^(data|aria)-/\n\n/**\n * The attributes of a typed chart's leftover props that belong on its root\n * element: `id` / `style` / `role` / `tabIndex` / `lang` / `hidden`, `data-*` and `aria-*`.\n * An allowlist, so a chart's own (or deprecated, ignored) props never reach the DOM.\n */\nexport function chartRootProps(rest: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(rest)) {\n if (value !== undefined && (ROOT_PROP_KEYS.has(key) || ROOT_PROP_PREFIX_RE.test(key))) out[key] = value\n }\n return out\n}\n\n/** The series tokens, in palette order — the default `colors` of every typed chart. */\nexport const DEFAULT_CHART_COLORS: readonly ChartColor[] = [\n \"chart-1\",\n \"chart-2\",\n \"chart-3\",\n \"chart-4\",\n \"chart-5\",\n]\n\nconst TOKEN_NAME_RE = /^chart-[1-5]$/\n\n/** The meaning colours; each is a theme token of the same name (`--positive`, …). */\nexport const CHART_TONES: readonly ChartTone[] = [\"positive\", \"warning\", \"negative\", \"neutral\"]\n\n/** Whether `color` is a meaning colour (`\"positive\"` / `\"warning\"` / `\"negative\"` / `\"neutral\"`). */\nexport function isChartTone(color: string): color is ChartTone {\n return (CHART_TONES as readonly string[]).includes(color.trim())\n}\n\n/**\n * A chart colour as a CSS value: `\"chart-2\"` → `var(--chart-2)` (so it follows\n * light/dark on its own), anything else passes through unchanged.\n */\nexport function chartColorToCss(color: ChartColor): string {\n const value = color.trim()\n return TOKEN_NAME_RE.test(value) || isChartTone(value) ? `var(--${value})` : value\n}\n\n/**\n * A chart colour for an AREA (bar, slice, segment, ring): like `chartColorToCss`, but a meaning\n * colour resolves to its area token (`\"positive\"` → `var(--positive-fill)`), which keeps the same\n * lightness step from the page in light and dark. `--positive` etc. are for text and icons.\n */\nexport function chartFillToCss(color: ChartColor): string {\n const value = color.trim()\n return isChartTone(value) ? `var(--${value}-fill)` : chartColorToCss(color)\n}\n\n/** The colour name to resolve for an area: a meaning colour becomes its `-fill` token (`\"positive\"` → `\"positive-fill\"`), the rest is unchanged. */\nexport function chartFillName(color: ChartColor): ChartColor {\n const value = color.trim()\n return isChartTone(value) ? `${value}-fill` : color\n}\n\n/** The `i`-th colour, cycling through `colors` (the token palette when empty). */\nexport function chartColorAt(colors: readonly ChartColor[] | undefined, i: number): ChartColor {\n const palette = colors && colors.length > 0 ? colors : DEFAULT_CHART_COLORS\n return palette[i % palette.length]!\n}\n\n/** `colors` extended (by cycling) to exactly `count` entries. */\nexport function chartColorsFor(colors: readonly ChartColor[] | undefined, count: number): ChartColor[] {\n return Array.from({ length: count }, (_, i) => chartColorAt(colors, i))\n}\n\n/** A translucent version of a CSS colour (works for `var(--…)` too). */\nexport function tintCss(cssColor: string, percent: number): string {\n return `color-mix(in oklab, ${cssColor} ${percent}%, transparent)`\n}\n\nconst numberFormat = new Intl.NumberFormat(\"ja-JP\", { maximumFractionDigits: 2 })\n\n/** Default `valueFormatter`: grouped digits, up to two decimals (`1,234.5`). */\nexport const defaultValueFormatter: ValueFormatter = (value) => numberFormat.format(value)\n\n/**\n * The formatter a chart actually uses: an explicit `valueFormatter` wins, else\n * `format` (default `\"compact\"`, so ¥1億 / 9.2万 on axes) via `toValueFormatter`.\n */\nexport function resolveValueFormatter(\n valueFormatter: ValueFormatter | undefined,\n format: ValueFormat | undefined,\n locale?: string,\n): ValueFormatter {\n return valueFormatter ?? toValueFormatter(format, locale)\n}\n\n/**\n * The formatter of value-axis ticks and on-plot labels: an explicit\n * `valueFormatter` wins; else `\"compact\"` / `\"number\"` / `\"currency\"` read in\n * the short form (`1億`, `¥1億`, `¥4,520万` — a tick of `¥100,000,000` is\n * too wide to read), and `\"percent\"` / `\"multiple\"` as `format` says. The short\n * form goes through `formatValue` (compact notation, `digits` / `unit` dropped),\n * so an axis tick and a KPI / tooltip of the same `format` always print the same\n * currency sign and grouping.\n */\nexport function resolveAxisFormatter(\n valueFormatter: ValueFormatter | undefined,\n format: ValueFormat | undefined,\n locale: string = DEFAULT_LOCALE,\n): ValueFormatter {\n if (valueFormatter) return valueFormatter\n const spec = format === undefined ? { type: \"compact\" as const } : typeof format === \"string\" ? { type: format } : format\n if (spec.type !== \"compact\" && spec.type !== \"number\" && spec.type !== \"currency\") return toValueFormatter(format, locale)\n const currency = \"currency\" in spec ? spec.currency : undefined\n const short: ValueFormat =\n spec.type === \"currency\" ? { type: \"currency\", currency, notation: \"compact\" } : { type: \"compact\" }\n return (value) => formatValue(value, short, locale)\n}\n\n/** The unit words of a ja number (`1.2万` / `3.4億` / `1兆`) and their sizes, largest first. */\nconst JA_UNITS = [\n { char: \"兆\", size: 1e12 },\n { char: \"億\", size: 1e8 },\n { char: \"万\", size: 1e4 },\n] as const\n\nconst JA_NUMBER_TOKEN_RE = /\\d[\\d,]*(?:\\.\\d+)?(?:兆|億|万)?/\n\n/**\n * The value-axis tick formatter for an axis whose largest tick is `top`: every tick reads in the unit of\n * that largest tick, so 万 and 億 never mix on one axis (`¥0.5億` / `¥1億` / `¥1.5億`, not `¥5,000万` / `¥1億`).\n * Only the ja short forms (`compact` / `number` / `currency`, no `valueFormatter`) have units to align;\n * any other format — and an axis whose largest tick is under 1万 — keeps `resolveAxisFormatter`'s output as it is.\n */\nexport function resolveAxisTickFormatter(\n valueFormatter: ValueFormatter | undefined,\n format: ValueFormat | undefined,\n locale: string = DEFAULT_LOCALE,\n): (top: number) => ValueFormatter {\n const base = resolveAxisFormatter(valueFormatter, format, locale)\n const spec = format === undefined ? { type: \"compact\" as const } : typeof format === \"string\" ? { type: format } : format\n const aligns =\n !valueFormatter && locale.toLowerCase().startsWith(\"ja\") && (spec.type === \"compact\" || spec.type === \"number\" || spec.type === \"currency\")\n if (!aligns) return () => base\n const number = new Intl.NumberFormat(locale, { maximumFractionDigits: 3 })\n return (top) => {\n const unit = JA_UNITS.find((u) => Math.abs(top) >= u.size)\n if (!unit) return base\n return (value) => {\n const text = base(value)\n if (value === 0 || !Number.isFinite(value)) return text\n const scaled = `${number.format(Math.abs(value) / unit.size)}${unit.char}`\n return text.replace(JA_NUMBER_TOKEN_RE, () => scaled)\n }\n }\n}\n\n/**\n * A data cell as a number, or `null` for a gap. Numeric strings count — SQL\n * `DECIMAL` / `BIGINT` columns usually arrive as strings.\n */\nexport function toChartNumber(value: unknown): number | null {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null\n if (typeof value === \"bigint\") return Number(value)\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\n/** Clamp `value` into `[min, max]`. */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\n/* ------------------------------------------------------------ aggregation */\n\n/** How many categories a chart colours individually; the rest fold into「その他」. */\nexport const MAX_CHART_SERIES = 5\n\n/** The series name the folded categories get. */\nexport const OTHER_SERIES_LABEL = \"その他\"\n\nexport interface AggregatedItems<Item extends { name: string; value: number }> {\n /** The `n` largest items, in their given order. All items when there are `n` or fewer. */\n top: Item[]\n /** The items folded into `other`, in their given order. */\n rest: Item[]\n /** The folded remainder, or `null` when nothing was folded. */\n other: { name: string; value: number } | null\n}\n\n/**\n * Keep the `n` largest items (by value; ties keep the earlier one) in their\n * given order and fold the rest into one `otherLabel` item. Shared by every\n * chart that caps its categories (Area / Line / Bar series, Donut slices,\n * BarList rows).\n */\nexport function aggregateTopN<Item extends { name: string; value: number }>(\n items: readonly Item[],\n n: number = MAX_CHART_SERIES,\n otherLabel: string = OTHER_SERIES_LABEL,\n): AggregatedItems<Item> {\n if (items.length <= n) return { top: [...items], rest: [], other: null }\n const ranked = items\n .map((item, i) => ({ item, i }))\n .sort((a, b) => b.item.value - a.item.value || a.i - b.i)\n const keep = new Set(ranked.slice(0, n).map((r) => r.i))\n const top = items.filter((_, i) => keep.has(i))\n const rest = items.filter((_, i) => !keep.has(i))\n return { top, rest, other: { name: otherLabel, value: rest.reduce((sum, item) => sum + item.value, 0) } }\n}\n\nexport interface AggregatedSeries {\n /** Rows to draw: the input rows, plus an `otherCategory` column when categories were folded. */\n data: Record<string, unknown>[]\n /** Series to draw: the kept categories in their given order, then `otherCategory`. */\n categories: string[]\n /** The folded series' name, or `null`. */\n otherCategory: string | null\n}\n\n/**\n * Cap a cartesian chart at `n` series: rank the categories by the sum of their\n * values, keep the top `n` and add a per-row sum of the rest as `otherLabel`.\n */\nexport function aggregateSeries(\n data: readonly Record<string, unknown>[],\n categories: readonly string[],\n n: number = MAX_CHART_SERIES,\n otherLabel: string = OTHER_SERIES_LABEL,\n): AggregatedSeries {\n const totals = categories.map((name) => ({\n name,\n value: data.reduce((sum, row) => sum + (toChartNumber(row[name]) ?? 0), 0),\n }))\n const { top, rest, other } = aggregateTopN(totals, n, otherLabel)\n if (!other) return { data: [...data], categories: [...categories], otherCategory: null }\n const folded = rest.map((item) => item.name)\n return {\n data: data.map((row) => {\n let sum: number | null = null\n for (const name of folded) {\n const v = toChartNumber(row[name])\n if (v !== null) sum = (sum ?? 0) + v\n }\n return { ...row, [other.name]: sum }\n }),\n categories: [...top.map((item) => item.name), other.name],\n otherCategory: other.name,\n }\n}\n\n/**\n * `aggregateSeries` that never folds `keep` (a comparison series) into「その他」: the others are capped\n * at `n` as usual and `keep` is appended last, so it is drawn on top of the cap and never takes the first slot.\n */\nexport function aggregateSeriesKeeping(\n data: readonly Record<string, unknown>[],\n categories: readonly string[],\n keep: string | undefined,\n n: number = MAX_CHART_SERIES,\n): AggregatedSeries {\n if (keep === undefined || !categories.includes(keep)) return aggregateSeries(data, categories, n)\n const aggregated = aggregateSeries(\n data,\n categories.filter((c) => c !== keep),\n n,\n )\n return { ...aggregated, categories: [...aggregated.categories, keep] }\n}\n\n/**\n * `seriesColorsFor` for a chart with a comparison series: the comparison takes no `--chart-*` token (the\n * builder paints it in muted grey; its slot here is `\"\"`), and the others are assigned as if it were absent,\n * so a main series keeps its colour whether or not a comparison is drawn.\n */\nexport function seriesColorsWithComparison(\n categories: readonly string[],\n colors: ChartColors | undefined,\n otherColor: string,\n otherCategory: string | null,\n allCategories: readonly string[],\n comparison: string | undefined,\n): string[] {\n if (comparison === undefined || !categories.includes(comparison)) {\n return seriesColorsFor(categories, colors, otherColor, otherCategory, allCategories)\n }\n const main = categories.filter((c) => c !== comparison)\n const mainColors = seriesColorsFor(\n main,\n colors,\n otherColor,\n otherCategory,\n allCategories.filter((c) => c !== comparison),\n )\n return categories.map((c) => (c === comparison ? \"\" : (mainColors[main.indexOf(c)] ?? \"\")))\n}\n\n/**\n * Colour per drawn series: the record's token for that category, else the\n * array's token at the category's position in `allCategories` (cycled), else\n * the token palette by drawn position. `otherCategory` — and a category the\n * data itself names「その他」(`OTHER_SERIES_LABEL`) — always gets `otherColor`.\n */\nexport function seriesColorsFor(\n categories: readonly string[],\n colors: ChartColors | undefined,\n otherColor: string,\n otherCategory: string | null = null,\n allCategories: readonly string[] = categories,\n): string[] {\n const list = Array.isArray(colors) ? (colors as ChartSeriesColor[]) : undefined\n const record = !Array.isArray(colors) && colors ? (colors as Partial<Record<string, ChartSeriesColor>>) : undefined\n return categories.map((category, i) => {\n if ((otherCategory !== null && category === otherCategory) || category === OTHER_SERIES_LABEL) return otherColor\n const fromRecord = record?.[category]\n if (fromRecord) return fromRecord\n if (list && list.length > 0) {\n const at = allCategories.indexOf(category)\n return list[(at === -1 ? i : at) % list.length]!\n }\n return DEFAULT_CHART_COLORS[i % DEFAULT_CHART_COLORS.length]!\n })\n}\n\n/* ------------------------------------------------------------------ Donut */\n\n/** One drawn donut slice, largest first. */\nexport interface DonutSlice {\n name: string\n /** Negative and missing values count as 0. */\n value: number\n /** A chart token (`\"chart-1\"`…), or `otherColor` for the folded slice. */\n color: string\n /** The folded「その他」slice. */\n isOther: boolean\n /** The input row, or a synthesized `{ [index]: \"その他\", [value]: sum }` for the folded slice. */\n row: Record<string, unknown>\n}\n\nexport interface DonutSlicesConfig {\n /** Label column. */\n index: string\n /** Value column. */\n value: string\n /** Slice colours by rank (cycled). Default: the token palette in order. */\n colors?: readonly ChartSeriesColor[]\n /** How many slices are drawn individually; the rest fold into「その他」. Default 5. */\n maxSlices?: number\n /** Colour of the folded slice (pass `CHART_OTHER_COLOR`). */\n otherColor: string\n otherLabel?: string\n}\n\n/**\n * Donut slices: sorted by value (largest first, ties keep input order), the\n * `maxSlices` largest kept and coloured by rank in fixed token order, the rest\n * summed into one「その他」slice in `otherColor`.\n */\nexport function donutSlices(\n data: readonly Record<string, unknown>[],\n { index, value, colors, maxSlices = MAX_CHART_SERIES, otherColor, otherLabel = OTHER_SERIES_LABEL }: DonutSlicesConfig,\n): DonutSlice[] {\n const items = data\n .map((row, i) => {\n const n = toChartNumber(row[value])\n return { name: String(row[index] ?? \"\"), value: n !== null && n > 0 ? n : 0, row, i }\n })\n .sort((a, b) => b.value - a.value || a.i - b.i)\n const { top, other } = aggregateTopN(items, Math.max(1, maxSlices), otherLabel)\n const palette = colors && colors.length > 0 ? colors : DEFAULT_CHART_COLORS\n const slices: DonutSlice[] = top.map((item, rank) => ({\n name: item.name,\n value: item.value,\n color: palette[rank % palette.length]!,\n isOther: false,\n row: item.row,\n }))\n if (other) {\n slices.push({\n name: other.name,\n value: other.value,\n color: otherColor,\n isOther: true,\n row: { [index]: other.name, [value]: other.value },\n })\n }\n return slices\n}\n\n/* ---------------------------------------------------------------- BarList */\n\nexport type BarListSortOrder = \"ascending\" | \"descending\" | \"none\"\n\n/** Sort a copy of the rows by value; `\"none\"` keeps the given order. */\nexport function sortBarListData<T extends { value: number }>(data: readonly T[], sortOrder: BarListSortOrder): T[] {\n const rows = [...data]\n if (sortOrder === \"ascending\") rows.sort((a, b) => a.value - b.value)\n else if (sortOrder === \"descending\") rows.sort((a, b) => b.value - a.value)\n return rows\n}\n\n/** BarList-only settings. */\nexport interface BarListOptions {\n /** 並べ順。既定 `\"descending\"`(大きい順)。`\"none\"` は渡した順。「その他」は常に最後。 */\n sortOrder?: BarListSortOrder\n /** 個別に出す行の数。超えた分は合計して「その他」の 1 行にまとめる。既定 5。 */\n maxItems?: number\n /** まとめた行のラベル。既定「その他」。 */\n otherLabel?: string\n /** 順位に入れず、常に「その他」へ足す行の名前。例 `[\"(not set)\", \"Unassigned\"]`。 */\n exclude?: readonly string[]\n /** 値の横に構成比(「その他」も含めた全行の合計に対する割合。整数 %)を添える。例「¥8,240万 · 43%」。既定 `false`。 */\n showShare?: boolean\n}\n\n/** One drawn BarList row. */\nexport interface BarListRow<Row = Record<string, unknown>> {\n /** React key: the row's `key`, else its name (`\"__other\"` for the folded row). */\n key: string\n name: string\n value: number\n /** Only for real rows; the folded row never links. */\n href?: string\n /** Legacy per-row colour (`BarListItem.color`). */\n color?: ChartColor\n /** The folded「その他」row. */\n isOther: boolean\n /** The input row (`null` for the folded row). */\n row: Row | null\n}\n\nexport interface BarListRowsConfig extends BarListOptions {\n /** Name column. Default `\"name\"`. */\n index?: string\n /** Value column. Default `\"value\"`. */\n category?: string\n}\n\n/**\n * The rows a BarList draws: read name / value (numeric strings count, gaps are\n * 0), keep the `maxItems` largest (via `aggregateTopN`), sort them, and append\n * the folded remainder as one「その他」row. Rows named in `exclude` skip the\n * ranking and are always added to「その他」.\n */\nexport function barListRows<Row extends object>(\n data: readonly Row[],\n { index = \"name\", category = \"value\", sortOrder = \"descending\", maxItems = MAX_CHART_SERIES, otherLabel = OTHER_SERIES_LABEL, exclude }: BarListRowsConfig = {},\n): BarListRow<Row>[] {\n const items = data.map((row): BarListRow<Row> => {\n const cells = row as Record<string, unknown>\n const name = String(cells[index] ?? \"\")\n return {\n key: typeof cells.key === \"string\" ? cells.key : name,\n name,\n value: toChartNumber(cells[category]) ?? 0,\n href: typeof cells.href === \"string\" ? cells.href : undefined,\n color: typeof cells.color === \"string\" ? cells.color : undefined,\n isOther: false,\n row,\n }\n })\n const excluded = new Set(exclude ?? [])\n const ranked = excluded.size > 0 ? items.filter((item) => !excluded.has(item.name)) : items\n const outside = excluded.size > 0 ? items.filter((item) => excluded.has(item.name)) : []\n const { top, other } = aggregateTopN(ranked, Math.max(0, maxItems), otherLabel)\n const rows = sortBarListData(top, sortOrder)\n if (other || outside.length > 0) {\n const value = (other?.value ?? 0) + outside.reduce((sum, item) => sum + item.value, 0)\n rows.push({ key: \"__other\", name: otherLabel, value, isOther: true, row: null })\n }\n return rows\n}\n\n/** Bar widths in percent of the largest value (at least a sliver for non-zero values). */\nexport function barListWidths(values: readonly number[]): number[] {\n const max = Math.max(0, ...values)\n if (max === 0) return values.map(() => 0)\n return values.map((v) => (v <= 0 ? 0 : Math.max(1, (v / max) * 100)))\n}\n\n/**\n * How strongly the BarList bars are painted: every row the same tint of the bar\n * colour (rank is the bar's length, not its weight). A tint over transparent, so\n * it sits on the card in light and dark; it must stay visible against the card\n * while the label printed over the bar keeps its contrast (see `tests/contrast.test.ts`).\n */\nexport const BAR_LIST_TINT = 45\n/** 「その他」: a tint of the other colour, so it is the palest fill in the list (light and dark). */\nexport const BAR_LIST_OTHER_TINT = 30\n\n/**\n * The fill of each BarList row: all real rows in the same tint of `color`\n * (`BAR_LIST_TINT`), the folded「その他」row in a tint of `otherColor`\n * (`BAR_LIST_OTHER_TINT`) — the palest fill, a remainder never outweighs a\n * ranked row. A legacy per-row `color` (or a threshold tone) replaces `color`\n * for that row. A tint, not the solid token, so the label printed over the bar\n * keeps its contrast.\n */\nexport function barListFills(\n rows: readonly Pick<BarListRow, \"isOther\" | \"color\">[],\n color: ChartColor,\n otherColor: string,\n): string[] {\n return rows.map((row) =>\n row.isOther ? tintCss(otherColor, BAR_LIST_OTHER_TINT) : tintCss(chartColorToCss(row.color ?? color), BAR_LIST_TINT),\n )\n}\n\n/** A row's share of `total` as text: whole percent (fixed, no decimals), `<1%` for a sliver, `0%` for nothing. */\nexport function barListShareText(value: number, total: number): string {\n const v = Number.isFinite(value) && value > 0 ? value : 0\n if (total <= 0 || v === 0) return \"0%\"\n const pct = (v / total) * 100\n return pct < 1 ? \"<1%\" : `${Math.round(pct)}%`\n}\n\n/**\n * The text at the end of each BarList row: the formatted value and, with\n * `showShare`, its share of the total of all drawn rows (including「その他」,\n * so the shares are of the whole list): `value` and `share` apart (the share is\n * drawn muted), `text` as one string (「¥8,240万 · 43%」).\n */\nexport function barListValueTexts(\n values: readonly number[],\n formatter: ValueFormatter,\n showShare = false,\n): { value: string; share?: string; text: string }[] {\n const total = values.reduce((sum, v) => sum + (Number.isFinite(v) && v > 0 ? v : 0), 0)\n return values.map((v) => {\n const value = formatter(v)\n if (!showShare) return { value, text: value }\n const share = barListShareText(v, total)\n return { value, share, text: `${value} · ${share}` }\n })\n}\n\n/* -------------------------------------------------------------- DataTable */\n\n/** The visually-hidden table `ChartFrame` renders next to the plot (`dataTable`). */\nexport interface ChartDataTable {\n /** 表の見出し(`<caption>`)。 */\n caption?: string\n /** 列見出し。先頭がラベル列。 */\n columns: string[]\n /** 行。セルは書式済みの文字列。 */\n rows: string[][]\n}\n\n/**\n * The chart's numbers as a table, for screen readers: one row per data row, the\n * `index` cell then each category through `formatter` (gaps → `—`). `labels`\n * renames column keys for the header (`{ sessions: \"セッション\" }`); `indexName` is the first column's header when `labels` has none for `index` (e.g. 「項目」, instead of the raw key).\n */\nexport function chartDataTable(\n data: readonly Record<string, unknown>[],\n index: string,\n categories: readonly string[],\n formatter: ValueFormatter,\n labels?: Readonly<Record<string, string>>,\n indexName?: string,\n): ChartDataTable {\n const label = (key: string) => labels?.[key] ?? key\n return {\n columns: [labels?.[index] ?? indexName ?? index, ...categories.map(label)],\n rows: data.map((row) => [\n String(row[index] ?? \"\"),\n ...categories.map((key) => {\n const n = toChartNumber(row[key])\n return n === null ? EMPTY_VALUE : formatter(n)\n }),\n ]),\n }\n}\n\n/* ------------------------------------------------------------ CategoryBar */\n\nexport interface CategoryBarSegment {\n /** Width in percent of the whole bar. */\n width: number\n /** Where the segment starts, in percent. */\n start: number\n /** The running total at the segment's end — what its right-hand label shows. */\n end: number\n}\n\n/** Lay the values side by side; negative values count as zero. */\nexport function categoryBarSegments(values: readonly number[]): CategoryBarSegment[] {\n const clean = values.map((v) => (Number.isFinite(v) && v > 0 ? v : 0))\n const total = clean.reduce((sum, v) => sum + v, 0)\n let running = 0\n return clean.map((v) => {\n const start = total === 0 ? 0 : (running / total) * 100\n running += v\n return { width: total === 0 ? 0 : (v / total) * 100, start, end: running }\n })\n}\n\nexport interface CategoryBarLabel {\n /** Position in percent of the bar. */\n position: number\n /** The running total printed there. */\n value: number\n}\n\n/**\n * Tick labels under the bar: `0` at the start, then the running total at each\n * segment's end. A label closer than `minGap` percent to the one before is\n * dropped so narrow segments don't print on top of each other — except the\n * last one (the total), which replaces its neighbour instead. With a\n * `markerPosition`, an inner label closer than `minGap` to the marker is dropped\n * too — the marker sits right under it and the two read as one crowded spot.\n */\nexport function categoryBarLabels(values: readonly number[], minGap = 8, markerPosition?: number): CategoryBarLabel[] {\n const segments = categoryBarSegments(values).filter((s) => s.width > 0)\n if (segments.length === 0) return []\n const labels: CategoryBarLabel[] = [{ position: 0, value: 0 }]\n segments.forEach((s, i) => {\n const label = { position: s.start + s.width, value: s.end }\n const prev = labels[labels.length - 1]!\n if (label.position - prev.position >= minGap) labels.push(label)\n else if (i === segments.length - 1 && labels.length > 1) labels[labels.length - 1] = label\n })\n if (markerPosition === undefined || !Number.isFinite(markerPosition)) return labels\n return labels.filter(\n (label, i) => i === 0 || i === labels.length - 1 || Math.abs(label.position - markerPosition) >= minGap,\n )\n}\n\n/**\n * `labels` thinned to what fits side by side on a bar `width` px wide, given each label's printed text\n * (`texts`, same order): a label that would touch the one before is dropped — except the last (the\n * total), which replaces its neighbour instead. The first sits at the left edge, the last at the right\n * edge, the rest centred on their position. The width is a rough estimate (full-width characters 12 px,\n * the rest 7 px at 12 px type).\n */\nexport function categoryBarFitLabels(\n labels: readonly CategoryBarLabel[],\n texts: readonly string[],\n width: number,\n gap = 8,\n): CategoryBarLabel[] {\n const textWidth = (text: string) => {\n let w = 0\n for (const ch of text) w += /[\\u3000-\\u9fff\\uff00-\\uffef]/.test(ch) ? 12 : 7\n return w\n }\n const extent = (label: CategoryBarLabel, text: string): [number, number] => {\n const w = textWidth(text)\n if (label.position <= 0) return [0, w]\n if (label.position >= 100) return [width - w, width]\n const center = (label.position / 100) * width\n return [center - w / 2, center + w / 2]\n }\n const kept: { label: CategoryBarLabel; extent: [number, number] }[] = []\n labels.forEach((label, i) => {\n const here = extent(label, texts[i] ?? \"\")\n const touches = () => kept.length > 0 && kept[kept.length - 1]!.extent[1] + gap > here[0]\n if (i === labels.length - 1) while (kept.length > 1 && touches()) kept.pop()\n else if (touches()) return\n kept.push({ label, extent: here })\n })\n return kept.map((k) => k.label)\n}\n\n/** Marker position in percent of the bar, clamped to its ends. */\nexport function categoryBarMarkerPosition(value: number, values: readonly number[]): number {\n const total = values.reduce((sum, v) => sum + (Number.isFinite(v) && v > 0 ? v : 0), 0)\n if (total === 0) return 0\n return clamp((value / total) * 100, 0, 100)\n}\n\n/** Index of the segment the marker sits on (the last one for a value past the end). */\nexport function categoryBarMarkerSegment(value: number, values: readonly number[]): number {\n const segments = categoryBarSegments(values)\n const index = segments.findIndex((s) => s.width > 0 && value <= s.end)\n if (index !== -1) return index\n for (let i = segments.length - 1; i >= 0; i--) if (segments[i]!.width > 0) return i\n return 0\n}\n\n/* --------------------------------------------------------- ProgressCircle */\n\nexport interface ProgressCircleGeometry {\n /** SVG width/height. */\n size: number\n /** Radius of the stroke's centre line. */\n normalizedRadius: number\n circumference: number\n /** `stroke-dashoffset` for the value arc. */\n offset: number\n /** The value as a fraction of `max`, clamped to `[0, 1]`. */\n ratio: number\n}\n\nexport function progressCircleGeometry(\n value: number,\n max: number,\n radius: number,\n strokeWidth: number,\n): ProgressCircleGeometry {\n const ratio = max > 0 && Number.isFinite(value) ? clamp(value / max, 0, 1) : 0\n const normalizedRadius = Math.max(0, radius - strokeWidth / 2)\n const circumference = 2 * Math.PI * normalizedRadius\n return { size: radius * 2, normalizedRadius, circumference, offset: circumference * (1 - ratio), ratio }\n}\n\n/* ---------------------------------------------------------------- summary */\n\nexport interface ChartSummaryInput {\n data: readonly Record<string, unknown>[]\n /** The x-axis key. */\n index: string\n /** Series keys; the first one is described. */\n categories: readonly string[]\n /** Title of the chart, put in front when given. */\n title?: string\n /** Same as the chart's `format` (default `\"compact\"`). */\n format?: ValueFormat\n /** Wins over `format`. */\n valueFormatter?: ValueFormatter\n}\n\n/**\n * One-sentence summary built from the rows, for `summary=\"auto\"`:\n * 「<title>: 最新 <index> は <値>、前の点より増加/減少/横ばい」. The direction is\n * computed from the last two non-empty points of the first series — never\n * written by hand, so it cannot contradict the data. `undefined` when there is\n * no usable point.\n */\nexport function buildChartSummary(input: ChartSummaryInput): string | undefined {\n const key = input.categories[0]\n if (key === undefined) return undefined\n const points: { label: string; value: number }[] = []\n for (const row of input.data) {\n const raw = row[key]\n const value = raw === null || raw === undefined || raw === \"\" ? NaN : Number(raw)\n if (Number.isFinite(value)) points.push({ label: String(row[input.index] ?? \"\"), value })\n }\n const latest = points[points.length - 1]\n if (!latest) return undefined\n const text = input.valueFormatter ?? toValueFormatter(input.format ?? \"compact\")\n const prev = points[points.length - 2]\n const direction = !prev ? \"\" : latest.value > prev.value ? \"、前の点より増加\" : latest.value < prev.value ? \"、前の点より減少\" : \"、前の点と横ばい\"\n const head = input.title ? `${input.title}: ` : \"\"\n return `${head}最新 ${latest.label} は ${text(latest.value)}${direction}`\n}\n\n/**\n * `summary=\"auto\"` for a donut: 「<title>: 最大は <名前>(<構成比>)」 from the slices\n * (largest first). `undefined` when there is nothing to describe.\n */\nexport function buildShareSummary(\n slices: readonly { name: string; value: number }[],\n title?: string,\n): string | undefined {\n const total = slices.reduce((sum, s) => sum + s.value, 0)\n const top = slices[0]\n if (!top || total <= 0) return undefined\n const share = `${Math.round((top.value / total) * 1000) / 10}%`\n return `${title ? `${title}: ` : \"\"}最大は ${top.name}(${share})`\n}\n","/**\n * Period-over-period / target comparison for KPIs. A rate is only produced when\n * the baseline is a non-zero number; small moves inside the neutral band read\n * as flat, and polarity decides whether up is good or bad.\n *\n * Labels follow Japanese business usage and come from the grain of the period:\n * a monthly KPI compares \"前月比\" / \"前年同月比\", a quarterly one \"前四半期比\" /\n * \"前年同期比\". Without a grain the label is the generic \"前期比\".\n *\n * A running total of a period still in progress (年初来・月初来 = YTD / MTD) sets\n * `toDate: true`: a `prior-year` baseline is then the same stretch of the prior year,\n * and the label is always \"前年同期比\" (never \"前年比\", which would mean a whole year\n * against a whole year), whatever the grain.\n *\n * Any other baseline is `vs: \"custom\"` with a `label` (\"昨日比\"). The baseline of\n * the previous-actual line is derived from that label (\"昨日\"), so the badge and\n * the line never name different things.\n */\nimport { DEFAULT_LOCALE, formatDelta, formatKind, formatPoints, formatValue, type ValueFormat } from \"./format\"\nimport type { ChartThreshold, ChartTone } from \"./types\"\n\nexport type ComparisonKind = \"prior-period\" | \"prior-year\" | \"target\" | \"custom\"\n\n/**\n * 増減の良し悪しの向き。`\"neutral\"` は増減どちらでも sentiment を neutral にする(例: 在庫数)。\n * @example polarity=\"neutral\"\n */\nexport type Polarity = \"higher-is-better\" | \"lower-is-better\" | \"neutral\"\n\n/** Length of the period a value covers. */\nexport type PeriodGrain = \"day\" | \"week\" | \"month\" | \"quarter\" | \"year\"\n\ninterface ComparisonBase {\n previous: number | null | undefined\n /** Grain of the period, which picks the label: `\"month\"` → \"前月比\" / \"前年同月比\". */\n grain?: PeriodGrain\n /**\n * The value is a running total of the period so far (年初来・月初来), not a closed period.\n * With `vs: \"prior-year\"` the label is \"前年同期比\" (the same stretch of last year) whatever the `grain`.\n * Leave it off for a closed period: a full year against the prior year is \"前年比\".\n */\n toDate?: boolean\n}\n\nexport type Comparison =\n | (ComparisonBase & {\n vs: Exclude<ComparisonKind, \"custom\">\n /** The badge's full name (\"先週比\"). Overrides the derived label; the previous-actual line takes its name from it too. */\n label?: string\n })\n | (ComparisonBase & {\n /** Any other baseline (\"昨日\", \"先週の同じ曜日\"): the `label` names it. */\n vs: \"custom\"\n /** The badge's full name: `\"昨日比\"` / `\"先週の同じ曜日比\"`. The previous-actual line drops one trailing \"比\" (\"昨日 617\"). */\n label: string\n })\n\n/** Labels used when the grain is unknown. A `custom` comparison always brings its own `label`. */\nexport const COMPARISON_LABELS: Record<Exclude<ComparisonKind, \"custom\">, string> = {\n \"prior-period\": \"前期比\",\n \"prior-year\": \"前年同期比\",\n target: \"目標比\",\n}\n\n/** The baseline each comparison is made against, by grain (\"前月\", \"前年同月\"). */\nconst BASELINE_NOUNS: Record<Exclude<ComparisonKind, \"target\" | \"custom\">, Record<PeriodGrain | \"unknown\", string>> = {\n \"prior-period\": {\n day: \"前日\",\n week: \"前週\",\n month: \"前月\",\n quarter: \"前四半期\",\n year: \"前年\",\n unknown: \"前期\",\n },\n \"prior-year\": {\n day: \"前年同日\",\n week: \"前年同週\",\n month: \"前年同月\",\n quarter: \"前年同期\",\n year: \"前年\",\n unknown: \"前年同期\",\n },\n}\n\n/**\n * What the previous value is called: \"前月\" / \"前年同月\" / \"目標\"; with a `label`, that label minus one trailing \"比\" (\"昨日比\" → \"昨日\").\n * `toDate` (a running total such as YTD) turns a `prior-year` baseline into \"前年同期\" whatever the grain.\n */\nexport function comparisonBaseline(vs: ComparisonKind, grain?: PeriodGrain, label?: string, toDate?: boolean): string {\n const named = label?.trim()\n if (named) return named.length > 1 && named.endsWith(\"比\") ? named.slice(0, -1) : named\n if (vs === \"custom\") return \"比較対象\"\n if (vs === \"target\") return \"目標\"\n if (vs === \"prior-year\" && toDate) return BASELINE_NOUNS[\"prior-year\"].unknown\n return BASELINE_NOUNS[vs][grain ?? \"unknown\"]\n}\n\n/**\n * The comparison label: \"前月比\" for `(\"prior-period\", \"month\")`, \"前期比\" without a grain; a given `label` as is.\n * A running total (`toDate`) against the prior year is \"前年同期比\", not \"前年比\".\n */\nexport function comparisonLabel(vs: ComparisonKind, grain?: PeriodGrain, label?: string, toDate?: boolean): string {\n return label?.trim() ? label : `${comparisonBaseline(vs, grain, undefined, toDate)}比`\n}\n\nexport type DeltaDirection = \"up\" | \"down\" | \"flat\" | \"none\"\n\nexport type DeltaSentiment = \"positive\" | \"negative\" | \"neutral\"\n\nexport interface ComparisonResult {\n current: number | null\n previous: number | null\n /** `current − previous` in the metric's own unit (a ratio difference for a rate). `null` when either is missing. */\n difference: number | null\n /** `difference / |previous|`. `null` when it cannot be computed (missing values or a zero baseline). */\n ratio: number | null\n direction: DeltaDirection\n sentiment: DeltaSentiment\n label: string\n vs: ComparisonKind\n}\n\nexport interface ComparisonOptions {\n polarity?: Polarity\n /** Absolute ratio below which the change reads as flat (0.01 = 1%). Default 0.01. */\n neutralBand?: number\n}\n\nconst toNumber = (v: number | null | undefined): number | null =>\n v === null || v === undefined || Number.isNaN(v) ? null : v\n\nexport function computeComparison(\n current: number | null | undefined,\n comparison: Comparison,\n options?: ComparisonOptions,\n): ComparisonResult {\n const polarity = options?.polarity ?? \"higher-is-better\"\n const neutralBand = options?.neutralBand ?? 0.01\n const cur = toNumber(current)\n const prev = toNumber(comparison.previous)\n const label = comparisonLabel(comparison.vs, comparison.grain, comparison.label, comparison.toDate)\n\n const difference = cur !== null && prev !== null ? cur - prev : null\n const ratio = difference !== null && prev !== null && prev !== 0 ? difference / Math.abs(prev) : null\n\n let direction: DeltaDirection\n if (ratio === null) direction = \"none\"\n else if (Math.abs(ratio) < neutralBand) direction = \"flat\"\n else direction = ratio > 0 ? \"up\" : \"down\"\n\n let sentiment: DeltaSentiment = \"neutral\"\n if (polarity === \"neutral\") sentiment = \"neutral\"\n else if (direction === \"up\") sentiment = polarity === \"higher-is-better\" ? \"positive\" : \"negative\"\n else if (direction === \"down\") sentiment = polarity === \"higher-is-better\" ? \"negative\" : \"positive\"\n\n return { current: cur, previous: prev, difference, ratio, direction, sentiment, label, vs: comparison.vs }\n}\n\n/**\n * How a change is expressed: `\"relative\"` = change rate (\"+12.4%\"), `\"points\"` =\n * difference of two rates in percentage points (\"−0.5pt\"), `\"difference\"` =\n * absolute difference in the metric's own format (\"+¥530万\"; pass `format` to `formatChange`).\n */\nexport type ChangeDisplay = \"relative\" | \"points\" | \"difference\"\n\n/** `\"points\"` for a `percent` metric (a rate), else `\"relative\"`. */\nexport function defaultChangeDisplay(format: ValueFormat | undefined): ChangeDisplay {\n return formatKind(format) === \"percent\" ? \"points\" : \"relative\"\n}\n\n/**\n * The change as shown next to a KPI: \"+12.4%\" (relative) or \"−0.5pt\" (points).\n * Returns `null` when the values cannot be compared.\n *\n * @param digits - Fixed fraction digits of the change, for `\"relative\"` and `\"points\"`\n * (not `\"difference\"`, which follows `format`). Default `PERCENT_DIGITS` (1), so\n * \"+14.0%\" and \"+11.9%\" line up. Pass the same count to every card in a group.\n */\nexport function formatChange(\n result: ComparisonResult,\n display: ChangeDisplay = \"relative\",\n locale: string = DEFAULT_LOCALE,\n /** `\"difference\"` 表示で使う値の format。例: `\"currency\"`。 */\n format?: ValueFormat,\n /** `\"relative\"` / `\"points\"` 表示の小数桁数(固定)。例: `2` → \"+0.14pt\"。未指定は 1 桁。 */\n digits?: number,\n): string | null {\n if (result.direction === \"none\") return null\n if (display === \"difference\") return result.difference === null ? null : formatDelta(result.difference, format, locale)\n if (display === \"points\")\n return result.difference === null ? null : formatPoints(result.difference, locale, digits === undefined ? undefined : { digits })\n return result.ratio === null ? null : formatDelta(result.ratio, digits === undefined ? \"percent\" : { type: \"percent\", digits }, locale)\n}\n\n/**\n * The size of the change with **no sign**, for a sentence or a screen-reader text that\n * already says the direction with a verb (\"0.5pt 下がりました\", \"前月比 12.4% 減少\"): a signed\n * \"−0.5pt 下がりました\" negates twice. Same arguments as `formatChange`; `null` when the\n * values cannot be compared.\n */\nexport function formatChangeAmount(\n result: ComparisonResult,\n display: ChangeDisplay = \"relative\",\n locale: string = DEFAULT_LOCALE,\n format?: ValueFormat,\n digits?: number,\n): string | null {\n if (result.direction === \"none\") return null\n if (display === \"difference\")\n return result.difference === null ? null : formatValue(Math.abs(result.difference), format, locale)\n if (display === \"points\")\n return result.difference === null\n ? null\n : formatPoints(result.difference, locale, { signDisplay: \"never\", ...(digits === undefined ? {} : { digits }) })\n return result.ratio === null\n ? null\n : formatValue(Math.abs(result.ratio), digits === undefined ? \"percent\" : { type: \"percent\", digits }, locale)\n}\n\n/* -------------------------------------------------------------- thresholds */\n\n/**\n * The tone of the first threshold rule `value` falls in, or `undefined` (a value\n * no rule matches keeps the normal colour). A rule matches when every bound it\n * carries holds: `value < lt`, `value <= lte`, `value > gt`, `value >= gte`\n * (`gt` / `lte` are the strict-inclusive counterparts, so「10% 超」is `gt: 10`).\n * Rules are tried in array order and the first match wins — put the strict rule\n * first (`gt: 10` before `gt: 7`). A rule with no bound never matches. Gaps (`null`) match nothing.\n */\nexport function toneForValue(value: number | null | undefined, thresholds: readonly ChartThreshold[] | undefined): ChartTone | undefined {\n if (value === null || value === undefined || !Number.isFinite(value) || !thresholds) return undefined\n for (const rule of thresholds) {\n if (rule.lt === undefined && rule.lte === undefined && rule.gt === undefined && rule.gte === undefined) continue\n if (rule.lt !== undefined && !(value < rule.lt)) continue\n if (rule.lte !== undefined && !(value <= rule.lte)) continue\n if (rule.gt !== undefined && !(value > rule.gt)) continue\n if (rule.gte !== undefined && !(value >= rule.gte)) continue\n return rule.tone\n }\n return undefined\n}\n","/**\n * ECharts option builders behind the typed charts (AreaChart, BarChart,\n * LineChart, DonutChart). They turn the Tremor-style props — `data` rows, an\n * `index` key and `categories` — into an `EChartsOption` for `EChart`, which\n * keeps owning the canvas and the token theme.\n *\n * Pure functions of their input: colours arrive already resolved to\n * canvas-safe strings (`resolveChartColors` in `chart-theme.ts`), so everything\n * here is unit-testable without a DOM. Internal; inlined into each copy.\n */\nimport { useMemo, useRef, useState, type ReactNode } from \"react\"\n\nimport type { EChartsOption } from \"../charts/echart\"\nimport { computeComparison, defaultChangeDisplay, formatChange, toneForValue, type ComparisonKind, type PeriodGrain } from \"./comparison\"\nimport { DEFAULT_LOCALE, EMPTY_VALUE, type ValueFormat } from \"./format\"\nimport type {\n ChartThreshold,\n ChartTone,\n ChartAnnotation,\n ChartCommonProps,\n ChartEventPayload,\n ChartForecast,\n ChartForecastRow,\n ChartHighlight,\n NumericKeys,\n} from \"./types\"\n\nexport type CartesianChartKind = \"area\" | \"bar\" | \"line\"\nexport type CartesianStackType = \"default\" | \"stacked\" | \"percent\"\nexport type CartesianCurveType = \"linear\" | \"smooth\" | \"step\"\nexport type AreaFill = \"gradient\" | \"solid\" | \"none\"\nexport type BarLayout = \"horizontal\" | \"vertical\"\n\n/** AreaChart-only settings. */\nexport interface AreaChartOptions {\n /** `\"stacked\"` は積み上げ、`\"percent\"` は各点の合計を 100% にした積み上げ。既定 `\"default\"`。 */\n type?: CartesianStackType\n /** 線の形。既定 `\"linear\"`。 */\n curveType?: CartesianCurveType\n /** 面の塗り。既定 `\"gradient\"`。 */\n fill?: AreaFill\n /** 値の欠けた点(`null` など)をまたいで線をつなぐ。既定 `false`。 */\n connectNulls?: boolean\n}\n\n/** LineChart-only settings. */\nexport interface LineChartOptions {\n /** 線の形。既定 `\"linear\"`。 */\n curveType?: CartesianCurveType\n /** 値の欠けた点(`null` など)をまたいで線をつなぐ。既定 `false`。 */\n connectNulls?: boolean\n /** 値軸を 0 からではなくデータの範囲に合わせる。既定 `false`(0 起点)。最小の目盛ラベルは先頭の x ラベルと重なるので出さない(グリッド線は残る)。 */\n fitToData?: boolean\n /**\n * 目標線(`target`)のラベルの置き場所。`\"start\"`(既定)は線の左端の上(最大・最新の強調と近いときは下)。\n * `\"end\"` は線の右端の上。`\"legend\"` は凡例だけに出し、線の上には出さない(線の周りが混み合うとき)。\n * 目標の呼び名は、どれを選んでも凡例に出る。\n */\n targetLabelPosition?: LineTargetLabelPosition\n}\n\n/** Where a line chart prints its target label: at the line's left end, its right end, or in the legend only. */\nexport type LineTargetLabelPosition = \"start\" | \"end\" | \"legend\"\n\n/** BarChart-only settings. */\nexport interface BarChartOptions<T extends Record<string, unknown> = Record<string, unknown>> {\n /** `\"stacked\"` は積み上げ、`\"percent\"` は各カテゴリの合計を 100% にした積み上げ。既定 `\"default\"`(横並び)。 */\n type?: CartesianStackType\n /**\n * 棒の向き。既定 `\"horizontal\"`(カテゴリが横に並ぶ縦棒)。`\"vertical\"` はカテゴリを\n * 縦に並べた横棒で、ラベルの長いランキングに向く(先頭の行が一番上)。\n */\n layout?: BarLayout\n /** カテゴリ間の隙間(`\"20%\"` や px)。省略時は ECharts の既定。 */\n barCategoryGap?: string | number\n /**\n * 値が 0 の棒に「0」の値ラベルを付ける。棒が描かれない 0 が「データなし」に見えるのを防ぐ\n * (在庫 0・件数 0 など)。積み上げでは付けない。0 以外の棒の見た目は変わらない。既定 `true`。\n */\n showZeroValues?: boolean\n /**\n * 棒ごとの目標値が入った `data` の列名(行ごとの目標。店舗別の月次目標など)。各棒に短い目標マーカーを\n * 引き、ツールチップに「目標 … (達成率 …%)」を足す。凡例に目標の呼び名(`targetLabel`、既定「目標」)が出る。\n * 1 系列の棒と積み上げ(達成率は合計に対して)で使える。横並びの複数系列と 100% 積み上げでは描かない。\n * 値が欠けた(null・0 以下の)行はマーカーを引かない。\n *\n * 優先順位: `targetKey` を渡すと 1 本の目標線 `target` は描かない(`targetLabel` はマーカーの呼び名として使う)。\n * 値による色分け `thresholds` とは併用できる(色は棒、マーカーは目標)。値軸は最大の目標を含む。\n * 例: `barOptions={{ targetKey: \"月次目標\" }}`\n */\n targetKey?: NumericKeys<T>\n /**\n * 横棒(`layout: \"vertical\"`)の 1 系列で伝えたい 1 本。`index` の値で渡す(例 `\"東京店\"`)。\n * 横棒は淡い色(`--chart-1` の薄い塗り)が既定で、この 1 本だけ濃い色(系列色そのまま)になる。省略すると全部が淡い色。\n * 縦棒・複数系列・積み上げでは効かない(色は変わらない)。意味色の `thresholds` に当たった棒はそちらの色が優先。\n * 例: `barOptions={{ layout: \"vertical\", highlight: \"東京店\" }}`\n */\n highlight?: string | number\n}\n\n/** Props every cartesian typed chart (Area / Bar / Line) shares. */\nexport interface CartesianChartBaseProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends ChartCommonProps<T> {\n /**\n * 最大値と最新値に値ラベルを付ける(最初の系列だけ・系列が 2 つ以下のときだけ・最大 2 つ)。\n * 100% 積み上げの面グラフでは、最初の系列(一番下の帯)の最初と最新の比率(「24%」「31%」)を帯の中に付ける。\n * 既定は Line / Area が `\"auto\"`、Bar は `index` が日付・年月・年のときだけ `\"auto\"`。\n */\n highlight?: ChartHighlight\n /**\n * ここから先は確定前(速報)の点。index の値で渡す(例 `\"2026-09\"`)。薄い色・点線(棒は薄い塗りと破線の縁)で\n * 描き、凡例・ツールチップに `provisionalLabel` を出す。線・面は確定の最終点とつなぐ。`forecast`(予測)とは別物。\n * 例: `provisionalFrom=\"2026-09\"`\n */\n provisionalFrom?: string | number\n /** 速報の呼び名(凡例・ツールチップ)。既定「速報」。例: `provisionalLabel=\"暫定\"` */\n provisionalLabel?: string\n /**\n * グラフが言っていることの 1 文要約(自由文)。`\"auto\"` なら data から機械的に組む\n * (「<見出し>: 最新 <index値> は <値>、前の点より増加/減少」。向きは最新 2 点の値で決まる)。\n * 増減の向きを文に書くなら `\"auto\"` を使うか data から作る — 手書きの向きは data とずれて誤る。\n * 省略時は要約なし(既存どおり)。例: `summary=\"auto\"`\n */\n summary?: string | \"auto\"\n /** 目標値。点線の水平線で示し、値軸は必ずこの値を含む。棒ごとの目標(`barOptions.targetKey`)を渡したときは描かない。 */\n target?: number\n /** 目標線のラベル。既定「目標 <書式化した値>」。`barOptions.targetKey` のときはマーカーの呼び名(既定「目標」)。 */\n targetLabel?: string\n /**\n * 任意の位置への注記(縦の線、または `to` で区間の帯)。折れ線・面・縦の棒(`barOptions.layout` が既定のとき)で使え、\n * 横棒では描かない。`at` / `to` は `index` の値。色は中立で、ツールチップにも文言が出る。例:\n * `annotations={[{ at: \"2026-04\", label: \"料金改定\" }, { at: \"2026-08\", to: \"2026-09\", label: \"キャンペーン\" }]}`\n */\n annotations?: ChartAnnotation[]\n /** 凡例を出す。既定 `true`。 */\n showLegend?: boolean\n /** ホバー時のツールチップを出す。既定 `true`。 */\n showTooltip?: boolean\n /** 値軸の目盛り線を出す。既定 `true`。 */\n showGridLines?: boolean\n showXAxis?: boolean\n showYAxis?: boolean\n /** x 軸のラベルを最初と最後だけにする。 */\n startEndOnly?: boolean\n /** y 軸ラベルの幅(px)。並べた複数グラフのプロット領域を揃えたいときに固定する。 */\n yAxisWidth?: number\n /**\n * 値軸の下限。Bar / Area は常に 0 起点なので、0 以下の値だけ有効(負の値の下に余白を取る。正の値は無視)。\n * Line は指定した値から始める。データが下限を下回るときは軸を広げる(切り詰めない)。\n * 並べて比べる複数のグラフには同じ値を渡して軸をそろえる。\n */\n minValue?: number\n /**\n * 値軸の上限(横棒は横軸)。データが上限を超えるときは軸を広げる(切り詰めない)。\n * 並べて比べる複数のグラフには同じ値を渡して軸をそろえる。\n */\n maxValue?: number\n /** @deprecated `lineOptions.fitToData` を使う。Bar / Area では無視される(常に 0 起点)。 */\n autoMinValue?: boolean\n /** `false` で値軸の目盛りを整数に限る。 */\n allowDecimals?: boolean\n xAxisLabel?: string\n yAxisLabel?: string\n /**\n * 点(棒)のクリックで呼ばれる。クリックした行に `eventType` / `categoryClicked` を\n * 足して渡し、同じ点をもう一度クリックすると `null`。渡すと選択以外が薄くなる。\n */\n onValueChange?: (value: ChartEventPayload) => void\n /** @deprecated `isLoading` を使う。 */\n loading?: boolean\n}\n\n/** The point a user clicked, used to dim everything else. */\nexport interface ChartActivePoint {\n category: string\n index: number\n}\n\n/** The forecast as the builder takes it: untyped keys, already validated by the component's props. */\nexport type CartesianForecastConfig = Omit<ChartForecast, \"category\"> & { category?: string }\n\n/** The comparison series as the builder takes it (see `ChartComparison`); `label` names the baseline for `vs: \"custom\"`. */\nexport interface CartesianComparisonConfig {\n /** One of `categories`; drawn as a thin muted line, outside the `--chart-*` order. */\n category: string\n vs: ComparisonKind\n label?: string\n}\n\nexport interface CartesianChartConfig {\n kind: CartesianChartKind\n data: readonly Record<string, unknown>[]\n index: string\n categories: readonly string[]\n /** Resolved series colours, by category position. `\"\"`/missing → theme palette. */\n palette: readonly string[]\n /** Display names for `index` values and category names (axis, legend, tooltip). Missing keys show as they are. */\n labels?: Readonly<Record<string, string>>\n /** Bar only, not stacked: colour each bar by its value (first matching rule wins). With several series (side by side) a bar that matches takes the tone as its fill and keeps its series colour as the edge. */\n thresholds?: readonly ChartThreshold[]\n /** Resolved colour of each tone (`resolveChartColors`); a tone missing here keeps the series colour. */\n toneColors?: Partial<Record<ChartTone, string>>\n /** Tooltip values. */\n valueFormatter: (value: number) => string\n /** Value-axis ticks, highlight and target labels (short form, e.g. ¥1億). Default `valueFormatter`. */\n axisFormatter?: (value: number) => string\n /**\n * The value-axis tick formatter for an axis whose largest tick is the given number (`resolveAxisTickFormatter`):\n * all ticks read in one unit (¥0.5億 / ¥1億). Default: `axisFormatter` for every tick.\n */\n axisTicks?: (top: number) => (value: number) => string\n /** Locale of the time-axis labels. Default `\"ja-JP\"`. */\n locale?: string\n type?: CartesianStackType\n /** Bar only. `\"vertical\"` lays the categories down the y axis (horizontal bars). */\n layout?: BarLayout\n curveType?: CartesianCurveType\n fill?: AreaFill\n connectNulls?: boolean\n showLegend?: boolean\n showTooltip?: boolean\n showGridLines?: boolean\n showXAxis?: boolean\n showYAxis?: boolean\n startEndOnly?: boolean\n yAxisWidth?: number\n /** Bar / Area: only a value ≤ 0 takes effect (they start at 0). Line: the axis' start. The axis widens to the data. */\n minValue?: number\n /** The axis' top; the axis widens to the data. */\n maxValue?: number\n /** Line only: legacy alias of `fitToData`. */\n autoMinValue?: boolean\n /** Line only: let the value axis follow the data instead of starting at 0. */\n fitToData?: boolean\n allowDecimals?: boolean\n xAxisLabel?: string\n yAxisLabel?: string\n barCategoryGap?: string | number\n /** Always draw the line/area points (needed to click them). */\n showDots?: boolean\n active?: ChartActivePoint | null\n /** Default: `\"auto\"` for line/area, for bar only when `index` holds dates. */\n highlight?: ChartHighlight\n /** Bar only: the index value of the one horizontal bar drawn in the full colour (`BarChartOptions.highlight`). */\n barHighlight?: string | number\n target?: number\n targetLabel?: string\n /** Line only: where the target label sits (see `LineChartOptions.targetLabelPosition`). Default `\"start\"`. */\n targetLabelPosition?: LineTargetLabelPosition\n /** Bar only: a data column holding each bar's target (see `BarChartOptions.targetKey`). */\n targetKey?: string\n /** Notes at an index value or over a range (vertical bars, line, area). */\n annotations?: readonly ChartAnnotation[]\n /** Bar only, not stacked: label bars whose value is 0 with「0」(default true). */\n showZeroValues?: boolean\n /** Line / Area only; ignored for bar and for percent stacking. */\n forecast?: CartesianForecastConfig\n /**\n * Line / Area only; ignored for bar and for percent stacking. The series `category` is drawn as a muted 1.5px solid line\n * (no markers, no fill, outside a stack) and the first other series' tooltip row gets its difference from it.\n */\n comparison?: CartesianComparisonConfig\n /** The `format` of the values, for the comparison's difference in the tooltip (percent → points). Default: relative change. */\n comparisonFormat?: ValueFormat\n /** Index value of the first provisional point (see `CartesianChartBaseProps.provisionalFrom`). */\n provisionalFrom?: string | number\n provisionalLabel?: string\n /** The PNG action buttons are shown (top right): the legend keeps clear of them. */\n reserveActions?: boolean\n /** Colour of the target / forecast guide lines (resolved muted text). */\n guideColor?: string\n /**\n * The surface the chart sits on (resolved). Highlight labels get it as a\n * backdrop, so a guide line passing behind them never runs through the text.\n */\n labelBackground?: string\n /** Colour of the highlight labels (resolved foreground). */\n labelColor?: string\n /**\n * The plot's width in px, when known. Sets how many time labels fit, how many value ticks a\n * horizontal bar chart carries, and drops the max highlight when it would print over the latest one.\n */\n plotWidth?: number\n /** The plot's height in px (the `height` prop), when known: under 200 the value axis carries 3 intervals, else 4–5. */\n plotHeight?: number\n reducedMotion?: boolean\n /** Deep-merged onto the generated option last. */\n chartOptions?: EChartsOption\n}\n\n/* ----------------------------------------------------------------- motion */\n\n/**\n * The typed charts' motion: no entrance animation, a short ease on updates so a\n * filter change reads as a change. Reduced motion turns animation off.\n */\nexport function chartMotion(reducedMotion: boolean): EChartsOption {\n if (reducedMotion) return { animation: false }\n return { animation: true, animationDuration: 0, animationDurationUpdate: 300, animationEasingUpdate: \"cubicOut\" }\n}\n\n/* ----------------------------------------------------------------- merge */\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\n/**\n * Deep-merge `override` onto `base` without mutating either: plain objects merge\n * key by key, arrays merge by position (so `series: [{ … }]` tweaks the first\n * series), anything else in `override` replaces. `undefined` keeps the base.\n */\nexport function mergeChartOptions<T>(base: T, override: unknown): T {\n if (override === undefined) return base\n if (Array.isArray(override)) {\n if (!Array.isArray(base)) return override as T\n const length = Math.max(base.length, override.length)\n return Array.from({ length }, (_, i) => (i < override.length ? mergeChartOptions(base[i], override[i]) : base[i])) as T\n }\n if (isPlainRecord(override) && isPlainRecord(base)) {\n const out: Record<string, unknown> = { ...base }\n for (const key of Object.keys(override)) out[key] = mergeChartOptions(base[key], override[key])\n return out as T\n }\n return override as T\n}\n\n/* -------------------------------------------------------------- highlight */\n\nconst TIME_INDEX_RE =\n /^\\d{4}(?:[-/]\\d{1,2}(?:[-/]\\d{1,2}(?:[T ]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:?\\d{2})?)?)?)?$/\n\n/**\n * Whether the x values look like time: ISO dates / date-times, `YYYY-MM`,\n * `YYYY`, or `Date` objects. Blank cells are ignored; nothing at all → `false`.\n */\nexport function isTimeIndex(values: readonly unknown[]): boolean {\n const present = values.filter((v) => v !== null && v !== undefined && v !== \"\")\n if (present.length === 0) return false\n return present.every((v) =>\n v instanceof Date ? !Number.isNaN(v.getTime()) : typeof v === \"string\" && TIME_INDEX_RE.test(v.trim()),\n )\n}\n\n/* -------------------------------------------------------------- time axis */\n\ntype TimeGranularity = \"year\" | \"month\" | \"day\"\n\ninterface ParsedTime {\n year: number\n /** 1–12. */\n month: number\n day: number\n}\n\nconst TIME_PARTS_RE = /^(\\d{4})(?:[-/](\\d{1,2})(?:[-/](\\d{1,2}))?)?$/\n\n/**\n * The x values as calendar dates, with the finest granularity they carry — or\n * `null` when any value is not a plain year / month / date (date-times with a\n * clock part stay as they are: one label per hour would need its own format).\n */\nfunction parseTimeIndex(values: readonly unknown[]): { granularity: TimeGranularity; times: (ParsedTime | null)[] } | null {\n if (!isTimeIndex(values)) return null\n const ranks: readonly TimeGranularity[] = [\"year\", \"month\", \"day\"]\n let rank = 0\n const finer = (g: TimeGranularity) => {\n rank = Math.max(rank, ranks.indexOf(g))\n }\n const times: (ParsedTime | null)[] = []\n for (const v of values) {\n if (v === null || v === undefined || v === \"\") {\n times.push(null)\n continue\n }\n if (v instanceof Date) {\n if (v.getHours() !== 0 || v.getMinutes() !== 0 || v.getSeconds() !== 0) return null\n finer(v.getDate() === 1 ? \"month\" : \"day\")\n times.push({ year: v.getFullYear(), month: v.getMonth() + 1, day: v.getDate() })\n continue\n }\n const text = String(v).trim()\n // A trailing midnight (`2025-09-01T00:00:00Z`) is still a date; any other time of day is not.\n const date = text.replace(/[T ]00:00(?::00(?:\\.0+)?)?(?:Z|[+-]\\d{2}:?\\d{2})?$/, \"\")\n const m = TIME_PARTS_RE.exec(date)\n if (!m) return null\n finer(m[3] !== undefined ? \"day\" : m[2] !== undefined ? \"month\" : \"year\")\n times.push({ year: Number(m[1]), month: Number(m[2] ?? 1), day: Number(m[3] ?? 1) })\n }\n // Date objects on the 1st read as months only when every value falls on a 1st.\n if (rank === 1 && values.some((v) => v instanceof Date) && times.some((t) => t !== null && t.day !== 1)) rank = 2\n return { granularity: ranks[rank]!, times }\n}\n\nconst timeFormatCache = new Map<string, Intl.DateTimeFormat>()\n\nfunction timeFormat(locale: string, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n const key = `${locale}|${JSON.stringify(options)}`\n let format = timeFormatCache.get(key)\n if (!format) {\n format = new Intl.DateTimeFormat(locale, options)\n timeFormatCache.set(key, format)\n }\n return format\n}\n\nconst toDate = (t: ParsedTime) => new Date(t.year, t.month - 1, t.day)\n\n/** How many x labels a time axis shows at most (the step is picked so the labels never crowd). */\nexport const TIME_AXIS_MAX_LABELS = 6\n\n/** Calendar-friendly label steps per granularity (every 3 months, every week …). */\nconst TIME_AXIS_STEPS: Record<TimeGranularity, readonly number[]> = {\n year: [1, 2, 5, 10, 20, 50, 100],\n month: [1, 2, 3, 4, 6, 12, 24, 36, 60, 120],\n day: [1, 2, 7, 14, 28, 56, 91, 182, 364],\n}\n\n/**\n * Every how many points a time axis prints a label: the smallest calendar step\n * (1, 2, 3, 4, 6, 12 months; 1, 2, 7, 14 days; …) that keeps the labels at or\n * under `maxLabels`. Deterministic, so the year-change label is never skipped by\n * ECharts' own overlap thinning. `null` when the values are not dates.\n */\nexport function timeAxisLabelStep(values: readonly unknown[], maxLabels: number = TIME_AXIS_MAX_LABELS): number | null {\n const parsed = parseTimeIndex(values)\n if (!parsed) return null\n const count = values.length\n const max = Math.max(1, maxLabels)\n const steps = TIME_AXIS_STEPS[parsed.granularity]\n return steps.find((step) => Math.ceil(count / step) <= max) ?? Math.ceil(count / max)\n}\n\n/**\n * Category-axis labels for time-like x values, in `locale`: monthly data reads\n * `4月`, with the year (`2025年1月`) on the first shown label and on any shown\n * label whose year differs from the previous *shown* one; daily data reads\n * `4/1` (`2025/4/1` likewise); yearly data `2025年`. `shown(i)` says which\n * labels the axis prints (default: all) — hidden ones never carry the year.\n * `null` when the values are not dates — the axis then shows them as they are.\n */\nexport function timeAxisLabels(\n values: readonly unknown[],\n locale: string = DEFAULT_LOCALE,\n shown: (i: number) => boolean = () => true,\n): string[] | null {\n const parsed = parseTimeIndex(values)\n if (!parsed) return null\n const { granularity, times } = parsed\n let prevYear: number | null = null\n return times.map((t, i) => {\n if (t === null) return String(values[i] ?? \"\")\n const visible = shown(i)\n const withYear = visible && (prevYear === null || t.year !== prevYear)\n if (visible) prevYear = t.year\n const options: Intl.DateTimeFormatOptions =\n granularity === \"year\"\n ? { year: \"numeric\" }\n : granularity === \"month\"\n ? withYear\n ? { year: \"numeric\", month: \"short\" }\n : { month: \"short\" }\n : withYear\n ? { year: \"numeric\", month: \"numeric\", day: \"numeric\" }\n : { month: \"numeric\", day: \"numeric\" }\n return timeFormat(locale, options).format(toDate(t))\n })\n}\n\n/** The tooltip titles for time-like x values (`2025年9月`, `2025年9月1日`), or `null` when they are not dates. */\nexport function timeTooltipLabels(values: readonly unknown[], locale: string = DEFAULT_LOCALE): string[] | null {\n const parsed = parseTimeIndex(values)\n if (!parsed) return null\n const options: Intl.DateTimeFormatOptions =\n parsed.granularity === \"year\"\n ? { year: \"numeric\" }\n : parsed.granularity === \"month\"\n ? { year: \"numeric\", month: \"long\" }\n : { year: \"numeric\", month: \"long\", day: \"numeric\" }\n return parsed.times.map((t, i) => (t === null ? String(values[i] ?? \"\") : timeFormat(locale, options).format(toDate(t))))\n}\n\nexport interface HighlightPoint {\n kind: \"max\" | \"latest\" | \"start\"\n index: number\n value: number\n}\n\n/**\n * The points `highlight=\"auto\"` labels on one series: the latest (last\n * non-null) point, and the maximum unless it *is* the latest or sits next to it\n * (`|i - latest| ≤ 1`, the labels would collide) — at most 2, max first.\n */\nexport function pickHighlightPoints(values: readonly (number | null)[]): HighlightPoint[] {\n let latest = -1\n for (let i = values.length - 1; i >= 0; i--) {\n if (values[i] !== null && values[i] !== undefined) {\n latest = i\n break\n }\n }\n if (latest === -1) return []\n const latestValue = values[latest]!\n let max = -1\n values.forEach((v, i) => {\n if (v !== null && v !== undefined && (max === -1 || v > values[max]!)) max = i\n })\n const latestPoint: HighlightPoint = { kind: \"latest\", index: latest, value: latestValue }\n if (max === -1 || max === latest || latestValue >= values[max]! || Math.abs(max - latest) <= 1) return [latestPoint]\n return [{ kind: \"max\", index: max, value: values[max]! }, latestPoint]\n}\n\n/**\n * The points a 100% stacked area labels: the first and the latest (last\n * non-null) share of one band — \"24% → 31%\" is the claim such a chart makes.\n */\nexport function pickShareHighlightPoints(values: readonly (number | null)[]): HighlightPoint[] {\n const first = values.findIndex((v) => v !== null && v !== undefined)\n if (first === -1) return []\n let latest = first\n for (let i = values.length - 1; i > first; i--) {\n if (values[i] !== null && values[i] !== undefined) {\n latest = i\n break\n }\n }\n const latestPoint: HighlightPoint = { kind: \"latest\", index: latest, value: values[latest]! }\n return latest === first ? [latestPoint] : [{ kind: \"start\", index: first, value: values[first]! }, latestPoint]\n}\n\n/** Whether a chart of `kind` labels its highlights by default. */\nexport function defaultChartHighlight(\n kind: CartesianChartKind,\n data: readonly Record<string, unknown>[],\n index: string,\n): ChartHighlight {\n if (kind !== \"bar\") return \"auto\"\n return isTimeIndex(data.map((row) => row[index])) ? \"auto\" : \"none\"\n}\n\n/* ---------------------------------------------------------------- helpers */\n\n/** Same coercion as `toChartNumber` in chart-utils (kept local: inlined modules can't import each other). */\nfunction cellNumber(value: unknown): number | null {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null\n if (typeof value === \"bigint\") return Number(value)\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const n = Number(value)\n return Number.isFinite(n) ? n : null\n }\n return null\n}\n\n/**\n * Series values per category. `\"percent\"` turns each row into shares of that\n * row's total (0–100); a row whose total is 0 stays at 0.\n */\nexport function cartesianSeriesValues(\n data: readonly Record<string, unknown>[],\n categories: readonly string[],\n type: CartesianStackType = \"default\",\n): (number | null)[][] {\n const raw = categories.map((category) => data.map((row) => cellNumber(row[category])))\n if (type !== \"percent\") return raw\n return raw.map((values) =>\n values.map((value, i) => {\n if (value === null) return null\n const total = categories.reduce((sum, _, k) => sum + Math.abs(raw[k]![i] ?? 0), 0)\n return total === 0 ? 0 : (Math.abs(value) / total) * 100\n }),\n )\n}\n\n/** A colour with alpha, for gradient stops. Understands `#rgb`, `#rrggbb`, `rgb()`/`rgba()`. */\nexport function withAlpha(color: string, alpha: number): string {\n const hex = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(color.trim())\n if (hex) {\n const h = hex[1]!\n const full = h.length === 3 ? h.replace(/./g, (c) => c + c) : h\n const n = Number.parseInt(full, 16)\n return `rgba(${(n >> 16) & 255}, ${(n >> 8) & 255}, ${n & 255}, ${alpha})`\n }\n const rgb = /^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i.exec(color.trim())\n if (rgb) return `rgba(${rgb[1]}, ${rgb[2]}, ${rgb[3]}, ${alpha})`\n return color\n}\n\nconst HTML_ESCAPES: Record<string, string> = { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" }\n\nexport function escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (c) => HTML_ESCAPES[c]!)\n}\n\nexport interface TooltipRow {\n name: string\n color: string\n value: number | null\n /** Percent stacking: the row's share of its point's total (0–100). */\n share?: number\n /** A muted line right under the row (a comparison's difference). */\n note?: string\n}\n\nconst shareFormat = new Intl.NumberFormat(DEFAULT_LOCALE, { maximumFractionDigits: 1 })\nconst formatShare = (share: number) => `${shareFormat.format(share)}%`\n\n/** The tooltip body: a title, then one `● name value` row per series, then muted one-line `notes` (target, annotation). */\nexport function tooltipHtml(\n title: string,\n rows: readonly TooltipRow[],\n valueFormatter: (value: number) => string,\n notes: readonly string[] = [],\n): string {\n const lines = rows.map(\n (row) =>\n `<div style=\"display:flex;align-items:center;gap:8px;line-height:20px\">` +\n `<span style=\"display:inline-block;width:8px;height:8px;border-radius:9999px;background:${escapeHtml(row.color)}\"></span>` +\n `<span style=\"flex:1;opacity:.8\">${escapeHtml(row.name)}</span>` +\n `<span style=\"font-weight:600;font-variant-numeric:tabular-nums;margin-left:12px\">${\n row.value === null ? EMPTY_VALUE : escapeHtml(valueFormatter(row.value))\n }${\n row.share === undefined ? \"\" : `<span style=\"opacity:.6;margin-left:4px\">(${escapeHtml(formatShare(row.share))})</span>`\n }</span></div>` +\n (row.note === undefined\n ? \"\"\n : `<div style=\"padding-left:16px;line-height:18px;font-size:12px;opacity:.7;font-variant-numeric:tabular-nums\">${escapeHtml(row.note)}</div>`),\n )\n const noteLines = notes.map(\n (note) => `<div style=\"margin-top:4px;line-height:18px;font-size:12px;opacity:.7\">${escapeHtml(note)}</div>`,\n )\n return `<div style=\"font-weight:500;margin-bottom:4px\">${escapeHtml(title)}</div>${lines.join(\"\")}${noteLines.join(\"\")}`\n}\n\n/* ------------------------------------------------- per-bar targets / notes */\n\n/** Default name of the per-bar target marker (legend, tooltip). */\nexport const BAR_TARGET_LABEL = \"目標\"\n\n/** How far (px) the target marker reaches past each side of its bar. */\nconst TARGET_MARKER_OVERHANG = 4\n\n/**\n * The `renderItem` of the per-bar target marker: a 2px tick across the bar. Its length\n * is the bar's own width as ECharts lays it out (`api.barLayout`, one column — a single\n * series or a stack) plus a little overhang; without that it falls back to the\n * category band times `barHalfWidth`.\n */\nexport function targetMarkerRenderer(horizontalBars: boolean, barCategoryGap: string | number | undefined, color: string | undefined) {\n type Api = {\n value(dim: number): number\n coord(value: number[]): number[]\n size(value: number[]): number[]\n barLayout?(opt: { count: number; barCategoryGap?: string | number }): { width: number }[]\n }\n return (_params: unknown, api: Api) => {\n const [x = 0, y = 0] = api.coord([api.value(0), api.value(1)])\n const band = Math.abs(horizontalBars ? (api.size([0, 1])[1] ?? 0) : (api.size([1, 0])[0] ?? 0))\n const barWidth = api.barLayout?.({ count: 1, barCategoryGap })?.[0]?.width\n const length = (barWidth && barWidth > 0 ? barWidth : band * 2 * barHalfWidth(barCategoryGap)) + TARGET_MARKER_OVERHANG * 2\n return {\n type: \"line\",\n silent: true,\n shape: horizontalBars\n ? { x1: x, y1: y - length / 2, x2: x, y2: y + length / 2 }\n : { x1: x - length / 2, y1: y, x2: x + length / 2, y2: y },\n style: { stroke: color, lineWidth: 2, lineCap: \"butt\" },\n }\n }\n}\n\n/**\n * Each row's target from the `targetKey` column. A missing, non-numeric or\n * non-positive cell is `null` (no marker for that bar).\n */\nexport function barTargetValues(data: readonly Record<string, unknown>[], targetKey: string): (number | null)[] {\n return data.map((row) => {\n const value = cellNumber(row[targetKey])\n return value !== null && value > 0 ? value : null\n })\n}\n\n/** `value` as a share of `target` in percent; `null` without a value or a positive target. */\nexport function achievementRate(value: number | null | undefined, target: number | null | undefined): number | null {\n if (value === null || value === undefined || target === null || target === undefined || !(target > 0)) return null\n return (value / target) * 100\n}\n\n/** The tooltip line of a bar with a target: 「目標 ¥1,200万(達成率 85.3%)」. `null` without a target. */\nexport function barTargetNote(\n label: string,\n value: number | null,\n target: number | null,\n valueFormatter: (value: number) => string,\n): string | null {\n if (target === null) return null\n const rate = achievementRate(value, target)\n return `${label} ${valueFormatter(target)}${rate === null ? \"\" : `(達成率 ${formatShare(rate)})`}`\n}\n\n/** Half the width of a bar in category-axis units, from `barCategoryGap` (`\"20%\"`; a px gap or none → ECharts' 20%). */\nexport function barHalfWidth(barCategoryGap?: string | number): number {\n const gap = typeof barCategoryGap === \"string\" && /^\\d+(\\.\\d+)?%$/.test(barCategoryGap.trim()) ? parseFloat(barCategoryGap) / 100 : 0.2\n return 0.5 / (1 + gap)\n}\n\n/** An annotation placed on the category axis: positions are indexes into the x labels. */\nexport interface ResolvedAnnotation {\n from: number\n /** Set for a range (`to` after `from`); a single position leaves it out. */\n to?: number\n label: string\n}\n\n/**\n * Place annotations on the x labels by `String(value)` equality. An annotation\n * whose `at` is not an `index` value is dropped; `to` before `at` swaps them; a\n * `to` that is unknown or equal to `at` makes it a single position.\n */\nexport function resolveAnnotations(\n annotations: readonly ChartAnnotation[] | undefined,\n indexValues: readonly unknown[],\n): ResolvedAnnotation[] {\n if (!annotations?.length) return []\n const position = new Map<string, number>()\n indexValues.forEach((value, i) => {\n const key = String(value ?? \"\")\n if (!position.has(key)) position.set(key, i)\n })\n const out: ResolvedAnnotation[] = []\n for (const note of annotations) {\n const from = position.get(String(note.at))\n if (from === undefined || !note.label) continue\n const end = note.to === undefined ? undefined : position.get(String(note.to))\n if (end === undefined || end === from) out.push({ from, label: note.label })\n else out.push({ from: Math.min(from, end), to: Math.max(from, end), label: note.label })\n }\n return out\n}\n\n/** Gap (px) under which two neighbouring vertical labels (12px text) would print over each other. */\nconst ANNOTATION_LABEL_GAP = 16\n/** Assumed spacing (px) between two index positions when the plot's width is unknown. */\nconst ANNOTATION_ASSUMED_GAP = 40\n\n/**\n * Which end of its line each single-position annotation's label sits on. Labels\n * run along the line; neighbours closer than a label's height alternate between\n * the top and the bottom end, so they never print over one another. `lines` are\n * the annotation positions (index units) in any order; the result follows that order.\n */\nexport function annotationLabelEnds(lines: readonly number[], pointGap: number | null): (\"top\" | \"bottom\")[] {\n const gap = pointGap ?? ANNOTATION_ASSUMED_GAP\n const order = lines.map((at, i) => ({ at, i })).sort((a, b) => a.at - b.at || a.i - b.i)\n const ends: (\"top\" | \"bottom\")[] = Array(lines.length).fill(\"top\")\n for (let k = 1; k < order.length; k++) {\n const prev = order[k - 1]!\n const cur = order[k]!\n if ((cur.at - prev.at) * gap < ANNOTATION_LABEL_GAP) ends[cur.i] = ends[prev.i] === \"top\" ? \"bottom\" : \"top\"\n }\n return ends\n}\n\ninterface AxisTooltipParam {\n seriesId?: string\n seriesName?: string\n dataIndex?: number\n color?: unknown\n}\n\nconst DIMMED = 0.3\n\n\n/** Series ids. Ours are stable across updates so ECharts can transition them; `__` marks the helpers. */\nconst SERIES_ID_PREFIX = \"series:\"\nconst FORECAST_SERIES_ID = \"__forecast\"\nconst PROVISIONAL_SERIES_PREFIX = \"__provisional:\"\n/** Provisional points are drawn at this opacity (lines, areas, bars). */\nconst PROVISIONAL_OPACITY = 0.55\n/** Horizontal bars (one series, not stacked) are painted at this share of the series colour; the highlighted bar is solid. Same tint as BarList. */\nconst LIGHT_BAR_ALPHA = 0.7\nconst FORECAST_BAND_BASE_ID = \"__forecast-band-base\"\nconst FORECAST_BAND_RANGE_ID = \"__forecast-band-range\"\nconst OVERLAY_SERIES_ID = \"__overlay\"\nconst TARGET_MARKER_SERIES_ID = \"__target-marker\"\nconst TARGET_LEGEND_SERIES_ID = \"__target-legend\"\n/** A flat tick (8×8 legend box, aspect kept): the per-bar target's legend icon. */\nconst TARGET_LEGEND_ICON = \"path://M0,0 L100,0 L100,24 L0,24 Z\"\n\nconst DEFAULT_FORECAST_LABEL = \"予測\"\n\n/** The label at the top of a forecast's boundary line: the forecast's name (as in the legend) and an arrow toward the forecast side. */\nexport function forecastBoundaryText(label: string = DEFAULT_FORECAST_LABEL): string {\n return `${label} →`\n}\n\n/** A comparison series: a thin, muted, solid line with no markers (60% of `--muted-foreground`). */\nexport const COMPARISON_LINE_WIDTH = 1.5\nexport const COMPARISON_OPACITY = 0.6\n/** Target line: 1px dotted. Forecast: 2px dashed. Different widths *and* patterns, so the two never read as one. */\nexport const TARGET_LINE_DASH = [2, 3]\nexport const FORECAST_LINE_DASH = [6, 4]\n/** Legend icons for the two (8×8 box, aspect kept): a row of dots / of dashes in the line's own proportions. */\nconst TARGET_DOTTED_ICON = \"path://M0,0 L12,0 L12,10 L0,10 Z M30,0 L42,0 L42,10 L30,10 Z M60,0 L72,0 L72,10 L60,10 Z M88,0 L100,0 L100,10 L88,10 Z\"\nconst FORECAST_DASHED_ICON = \"path://M0,0 L42,0 L42,24 L0,24 Z M58,0 L100,0 L100,24 L58,24 Z\"\n\n/** The forecast band's fill opacity: on a dark surface it needs more to show against the background. */\nexport const FORECAST_BAND_ALPHA_LIGHT = 0.15\nexport const FORECAST_BAND_ALPHA_DARK = 0.22\n\n/** Whether a resolved surface colour (`#rrggbb` / `rgb()`) is dark (relative luminance under 0.4). `false` when it can't be read. */\nexport function isDarkSurface(color: string | undefined): boolean {\n if (!color) return false\n const hex = /^#([0-9a-f]{6})$/i.exec(color.trim())\n const rgb = /^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i.exec(color.trim())\n let channels: number[]\n if (hex) {\n const n = Number.parseInt(hex[1]!, 16)\n channels = [(n >> 16) & 255, (n >> 8) & 255, n & 255]\n } else if (rgb) channels = [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])]\n else return false\n const [r, g, b] = channels.map((c) => {\n const v = c / 255\n return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4\n }) as [number, number, number]\n return 0.2126 * r + 0.7152 * g + 0.0722 * b < 0.4\n}\n\nexport interface AxisExtent {\n min: number\n max: number\n}\n\n/** The label of a stack's total (highlight and tooltip). */\nexport const STACK_TOTAL_LABEL = \"合計\"\n\n/** Per point, the sum of the stacked series; `null` where every series is missing. */\nexport function stackTotalsOf(values: readonly (readonly (number | null)[])[]): (number | null)[] {\n const length = Math.max(0, ...values.map((v) => v.length))\n return Array.from({ length }, (_, i) => {\n let total: number | null = null\n for (const series of values) {\n const v = series[i]\n if (v !== null && v !== undefined) total = (total ?? 0) + v\n }\n return total\n })\n}\n\nconst LEGEND_LINE_HEIGHT = 24\n/** A rough width budget per legend line (px): a narrow card fits about this much. */\nconst LEGEND_LINE_BUDGET = 320\n\n/** How many lines the plain legend takes, estimated from its labels (12px text + 8px dot + gaps). */\nfunction legendLines(items: readonly string[], plotWidth?: number, reserve = 0): number {\n const width = items.reduce((sum, name) => sum + [...name].length * 12 + 8 + 5 + 16, 0)\n const budget = Math.max(80, (plotWidth ? Math.min(LEGEND_LINE_BUDGET, plotWidth) : LEGEND_LINE_BUDGET) - reserve)\n return Math.min(3, Math.max(1, Math.ceil(width / budget)))\n}\n\n/** Width (px) kept free at the legend's right for the PNG action buttons (two 32px buttons + gaps). */\nconst ACTIONS_RESERVE = 80\n\n/** Room (px) one time label (`2026年1月`) needs, gap included. */\nconst TIME_LABEL_WIDTH = 80\n/** Room (px) one highlight label (`¥6,240万`) needs, gap included. */\nconst HIGHLIGHT_LABEL_WIDTH = 96\n\n/** A highlight this close under the target (share of the larger of the two) can reach its label. */\nconst TARGET_NEAR_SHARE = 0.12\n/** Under this plot width (px) a target label that would run into the latest value's label is dropped from the line. */\nconst TARGET_LABEL_NARROW_WIDTH = 480\n/** A typical value-axis label column (`¥8,000万`), px. */\nconst Y_AXIS_ESTIMATE = 72\n/** Breathing room between two labels, px — the estimate is rough. */\nconst LABEL_SLACK = 24\n\n/** Rough width (px) of 12px text: full-width characters 12, the rest 7. */\nexport function estimateTextWidth(text: string): number {\n let w = 0\n for (const ch of text) w += /[\\u3000-\\u9fff\\uff00-\\uffef]/.test(ch) ? 12 : 7\n return w\n}\n\n/**\n * How many intervals a horizontal value axis (a horizontal bar chart's x) can carry in `plot` px\n * without its tick labels touching: each tick takes the widest of `samples` (the axis' end labels\n * printed) plus a gap. At least 1, at most 5 (ECharts' default, which it rounds to a tidy step).\n */\nexport function valueAxisSplitNumber(plot: number, samples: readonly string[]): number {\n const widest = samples.reduce((m, t) => Math.max(m, estimateTextWidth(t)), 0)\n return Math.max(1, Math.min(5, Math.floor(plot / (widest + LABEL_SLACK))))\n}\n\n/** Room (px) above a vertical bar chart's plot for the label of an annotation band. */\nconst BAND_LABEL_ROOM = 18\n\n/** The grid's right margin on a line / area chart (px): the last x label hangs past the plot. */\nconst LINE_RIGHT_MARGIN = 32\n\n/** Room (px) above the plot for a forecast's boundary label (「予測 →」). */\nconst FORECAST_LABEL_ROOM = 18\n\n/**\n * Which side of the forecast boundary line the flat boundary label reads from: `\"left\"` starts at the line and runs\n * over the forecast side; `\"right\"` ends at the line and runs over the actuals, when the forecast side (the room right\n * of the line, grid margin included) is narrower than the text, so it never runs off the chart.\n * `forecastSpan` is `null` when the width is unknown.\n */\nexport function forecastLabelAlign(forecastSpan: number | null, text: string = forecastBoundaryText()): \"left\" | \"right\" {\n return forecastSpan !== null && forecastSpan >= estimateTextWidth(text) + 8 ? \"left\" : \"right\"\n}\n\n/** ECharts' \"nice\" tick step for a raw step (1 / 2 / 3 / 5 × 10ⁿ, rounded): the same rule its value axis uses. */\nfunction niceStep(raw: number): number {\n if (!(raw > 0) || !Number.isFinite(raw)) return 1\n const exp10 = 10 ** Math.floor(Math.log10(raw))\n const f = raw / exp10\n return (f < 1.5 ? 1 : f < 2.5 ? 2 : f < 4 ? 3 : f < 7 ? 5 : 10) * exp10\n}\n\n/**\n * The largest tick (by size) a value axis over `[lo, hi]` will carry once ECharts has niced its ends — the number\n * that decides the unit the ticks read in (`resolveAxisTickFormatter`). `max`, when fixed, is the axis' top as is.\n */\nexport function estimateAxisTop(lo: number, hi: number, splitNumber: number, max?: number): number {\n const top = Math.max(Math.abs(lo), Math.abs(hi))\n if (!(top > 0)) return 0\n const step = niceStep((hi - lo) / splitNumber)\n const niceHi = max !== undefined && max >= hi ? max : Math.ceil(hi / step) * step\n const niceLo = Math.floor(lo / step) * step\n return Math.max(Math.abs(niceHi), Math.abs(niceLo))\n}\n\n/** Plot heights (px) under this carry 3 value intervals, not 4–5. */\nconst SHORT_PLOT_HEIGHT = 200\n/** Plot heights under this carry 4 value intervals; taller ones 5. */\nconst TALL_PLOT_HEIGHT = 300\n/** The plot height assumed when it isn't known (the charts' default `height`). */\nconst ASSUMED_PLOT_HEIGHT = 288\n\n/** How many intervals a vertical value axis carries: 3 under 200px of plot height, 4 under 300px, else 5. */\nexport function valueAxisSplitCount(plotHeight: number = ASSUMED_PLOT_HEIGHT): number {\n return plotHeight < SHORT_PLOT_HEIGHT ? 3 : plotHeight < TALL_PLOT_HEIGHT ? 4 : 5\n}\n\n/** The grain of time-like x values (`\"month\"` for `2026-04`), or `null` when they aren't plain years / months / days. */\nexport function indexGrain(values: readonly unknown[]): PeriodGrain | null {\n const parsed = parseTimeIndex(values)\n return parsed ? parsed.granularity : null\n}\n\n/**\n * The tooltip line under the main series' row when a comparison series is drawn: the arrow, the signed change and the\n * comparison's name, as `Delta` writes it (\"↑ +12.4% 前年同月比\"; a minus is U+2212). \"比較なし 前年同月比\" when\n * either value is missing or the baseline is 0.\n */\nexport function comparisonNote(\n current: number | null,\n previous: number | null,\n comparison: Pick<CartesianComparisonConfig, \"vs\" | \"label\">,\n grain?: PeriodGrain,\n format?: ValueFormat,\n locale: string = DEFAULT_LOCALE,\n): string {\n const result = computeComparison(\n current,\n comparison.vs === \"custom\"\n ? { previous, vs: \"custom\", label: comparison.label ?? \"\", grain }\n : { previous, vs: comparison.vs, label: comparison.label, grain },\n )\n const text = formatChange(result, defaultChangeDisplay(format), locale, format)\n if (text === null) return `比較なし ${result.label}`\n const arrow = result.direction === \"up\" ? \"↑\" : result.direction === \"down\" ? \"↓\" : \"→\"\n return `${arrow} ${text.replace(/^-/, \"−\")} ${result.label}`\n}\n\n/** Bars and areas start at 0: the length / area *is* the value. */\nconst zeroBasedMin = (extent: AxisExtent) => Math.min(0, extent.min)\n\n/**\n * A value axis' `min` / `max` from the limits a caller asked for, so that charts shown side by side can share one scale.\n * A limit never cuts the data: when the data runs past it, the axis widens to the data (`max(maxValue, data max)`).\n * `zeroBased` (bars, areas, waterfall): the axis always reaches 0, so a `minValue` above 0 is ignored and only a\n * negative one (room below 0) takes effect. Without a limit asked for, that edge is `undefined` (ECharts' own choice)\n * — except a zero-based `min`, which is always given.\n */\nexport function valueAxisLimits(\n limits: { minValue?: number; maxValue?: number },\n zeroBased: boolean,\n): { min: ((extent: AxisExtent) => number) | undefined; max: ((extent: AxisExtent) => number) | undefined } {\n const lo = Number.isFinite(limits.minValue) ? limits.minValue : undefined\n const hi = Number.isFinite(limits.maxValue) ? limits.maxValue : undefined\n return {\n min: zeroBased\n ? (extent) => Math.min(0, lo ?? 0, extent.min)\n : lo === undefined\n ? undefined\n : (extent) => Math.min(lo, extent.min),\n max: hi === undefined ? undefined : (extent) => Math.max(hi, extent.max),\n }\n}\n\nexport function buildCartesianOption(cfg: CartesianChartConfig): EChartsOption {\n const {\n kind,\n data,\n index,\n categories,\n palette,\n labels: nameLabels,\n thresholds,\n toneColors,\n valueFormatter,\n axisFormatter = valueFormatter,\n locale = DEFAULT_LOCALE,\n type = \"default\",\n layout = \"horizontal\",\n curveType = \"linear\",\n fill = \"gradient\",\n connectNulls = false,\n showLegend = true,\n showTooltip = true,\n showGridLines = true,\n showXAxis = true,\n showYAxis = true,\n startEndOnly = false,\n yAxisWidth,\n minValue,\n maxValue,\n autoMinValue = false,\n fitToData,\n allowDecimals = true,\n xAxisLabel,\n yAxisLabel,\n barCategoryGap,\n showDots = false,\n active = null,\n target,\n targetLabel,\n targetLabelPosition = \"start\",\n targetKey,\n showZeroValues = true,\n guideColor,\n labelBackground,\n labelColor,\n plotWidth,\n plotHeight,\n reducedMotion = false,\n chartOptions,\n reserveActions = false,\n } = cfg\n const provisionalLabel = cfg.provisionalLabel ?? DEFAULT_PROVISIONAL_LABEL\n\n const stacked = kind !== \"line\" && type !== \"default\"\n const percent = kind !== \"line\" && type === \"percent\"\n const horizontalBars = kind === \"bar\" && layout === \"vertical\"\n /*\n * -- comparison: a plain line, outside the stack and the palette. Never with bars or a 100% stack\n * (shares of a total have no \"last year\" line).\n */\n const comparison = kind !== \"bar\" && !percent ? cfg.comparison : undefined\n const compIdx = comparison ? categories.indexOf(comparison.category) : -1\n /** Positions of the series that are not the comparison: the stack, the highlight and the forecast read these. */\n const mainIdx = categories.map((_, i) => i).filter((i) => i !== compIdx)\n const seriesType = kind === \"line\" ? \"default\" : type\n const values = (() => {\n if (compIdx === -1) return cartesianSeriesValues(data, categories, seriesType)\n const main = cartesianSeriesValues(data, mainIdx.map((i) => categories[i]!), seriesType)\n const compared = cartesianSeriesValues(data, [categories[compIdx]!], \"default\")[0]!\n return categories.map((_, i) => (i === compIdx ? compared : main[mainIdx.indexOf(i)]!))\n })()\n const comparisonColor = guideColor ? withAlpha(guideColor, COMPARISON_OPACITY) : undefined\n\n /* -- x labels: the actual rows, then the forecast rows that extend them */\n const labels = data.map((row) => String(row[index] ?? \"\"))\n const rawIndex: unknown[] = data.map((row) => row[index])\n const lastActual = labels.length - 1\n // First provisional point (-1: none). Looked up among the actual rows only; unrelated to `forecast`.\n const provStart = categories.length > 0 ? provisionalStart(rawIndex, cfg.provisionalFrom) : -1\n const forecast =\n kind !== \"bar\" && !percent && cfg.forecast && cfg.forecast.data.length > 0 && data.length > 0 && categories.length > 0\n ? cfg.forecast\n : undefined\n const forecastAt: number[] = []\n if (forecast) {\n const position = new Map(labels.map((label, i) => [label, i]))\n for (const row of forecast.data) {\n const label = String(row[index] ?? \"\")\n let at = position.get(label)\n if (at === undefined || at <= lastActual) {\n // A forecast row never overwrites an actual point; repeated labels append.\n at = labels.length\n labels.push(label)\n rawIndex.push(row[index])\n position.set(label, at)\n }\n forecastAt.push(at)\n }\n }\n const pad = (series: (number | null)[]) =>\n series.length < labels.length ? [...series, ...Array<null>(labels.length - series.length).fill(null)] : series\n const last = labels.length - 1\n /*\n * -- time-like x values read as dates in the locale (`4月`, `2026年1月`), at a\n * fixed calendar step so the year-change label is never thinned away.\n */\n const timeStep = startEndOnly\n ? null\n : timeAxisLabelStep(\n rawIndex,\n plotWidth ? Math.max(2, Math.min(TIME_AXIS_MAX_LABELS, Math.floor(plotWidth / TIME_LABEL_WIDTH))) : undefined,\n )\n // Plain (non-date) x labels of a line chart: thinned to every n-th so they never touch, never rotated.\n const plainStep = (() => {\n if (kind !== \"line\" || startEndOnly || timeStep !== null || !plotWidth || labels.length < 3) return 1\n const widest = Math.max(...labels.map((l) => estimateTextWidth(nameLabels && hasLabel(nameLabels, l) ? labelOf(l, nameLabels) : l)))\n const plot = Math.max(1, plotWidth - (showYAxis ? (yAxisWidth ?? Y_AXIS_ESTIMATE) : 0) - LINE_RIGHT_MARGIN)\n return Math.max(1, Math.ceil(((widest + 12) * (labels.length - 1)) / plot))\n })()\n const shownLabel = startEndOnly\n ? (i: number) => i === 0 || i === last\n : timeStep !== null\n ? (i: number) => i % timeStep === 0\n : plainStep > 1\n ? (i: number) => i % plainStep === 0\n : null\n const timeLabels = timeAxisLabels(rawIndex, locale, shownLabel ?? undefined)\n const compGrain = comparison ? (indexGrain(rawIndex.slice(0, lastActual + 1)) ?? undefined) : undefined\n const tooltipTitles = (timeTooltipLabels(rawIndex, locale) ?? labels).map((title, i) =>\n nameLabels ? (hasLabel(nameLabels, labels[i] ?? \"\") ? labelOf(labels[i] ?? \"\", nameLabels) : title) : title,\n )\n\n /*\n * -- highlight: max + latest. Normal stacking labels the stack's total (on the\n * top layer); otherwise the first series, ≤ 2 series. A 100% stacked area\n * labels the first series' (the bottom band's) first and latest share inside\n * the band; a 100% stacked bar labels nothing.\n */\n const highlight = cfg.highlight ?? defaultChartHighlight(kind, data, index)\n const stackTotals = stacked && !percent ? stackTotalsOf(mainIdx.map((i) => values[i]!)) : null\n const highlightSeries = (stackTotals ? mainIdx[mainIdx.length - 1] : mainIdx[0]) ?? 0\n const shareHighlight = percent && kind === \"area\"\n const picked =\n highlight !== \"auto\" || mainIdx.length === 0 || (percent && !shareHighlight)\n ? []\n : shareHighlight\n ? categories.length <= 2\n ? pickShareHighlightPoints(values[0] ?? [])\n : []\n : stackTotals\n ? pickHighlightPoints(stackTotals)\n : mainIdx.length <= 2\n ? pickHighlightPoints(values[highlightSeries] ?? [])\n : []\n // On a narrow plot the max and the latest label would print over each other: keep the latest.\n const pointGap = plotWidth && labels.length > 1 ? plotWidth / (kind === \"bar\" ? labels.length : labels.length - 1) : null\n const highlightPoints =\n picked.length === 2 && pointGap !== null && Math.abs(picked[1]!.index - picked[0]!.index) * pointGap < HIGHLIGHT_LABEL_WIDTH\n ? [picked[1]!]\n : picked\n\n /*\n * Points (and the outer bars) sit at the plot's edges: pull the first / last\n * label inward so it isn't clipped. A label on the forecast boundary sits left\n * of the boundary line instead of across it.\n */\n const boundaryIndex = kind !== \"bar\" && !percent && cfg.forecast && cfg.forecast.data.length > 0 ? lastActual : -1\n const edgeAlign = (i: number) =>\n horizontalBars || labels.length < 2\n ? undefined\n : i === boundaryIndex && i !== last\n ? { align: \"right\" as const, offset: [-6, 0] }\n : i === last\n ? { align: \"right\" as const, ...(kind === \"bar\" ? { offset: [8, 0] } : {}) }\n : i === 0\n ? { align: \"left\" as const, ...(kind === \"bar\" ? { offset: [-8, 0] } : {}) }\n : undefined\n\n /*\n * The target label sits at the plot's start (left), above its line, so it stays clear of the latest value's label at\n * the right end. Near the label (horizontally, estimated from `plotWidth`) a line / area highlight just under the\n * target prints below its point, and one just over it moves the target label under the line instead. On a plot\n * narrower than 480px, when the *latest* point's label would still run into the target label, the target label leaves\n * the line altogether — the legend names the target.\n */\n // `barOptions.targetKey` (a target per bar) takes over from the single `target` line.\n const perBarTarget = kind === \"bar\" && Boolean(targetKey)\n const hasTarget = !perBarTarget && target !== undefined && Number.isFinite(target)\n const targetText = hasTarget ? (targetLabel ?? `目標 ${axisFormatter(target)}`) : \"\"\n const highlightText = (value: number) =>\n shareHighlight ? `${Math.round(value)}%` : `${stackTotals ? `${STACK_TOTAL_LABEL} ` : \"\"}${axisFormatter(value)}`\n /** Whether `p`'s label sits within the target's value band and under the target label (at the right end). */\n const nearTargetLabel = (p: HighlightPoint, side: \"under\" | \"over\") => {\n if (!hasTarget || !plotWidth || kind === \"bar\" || labels.length < 2) return false\n if (side === \"under\" ? p.value > target : p.value <= target) return false\n const scale = Math.max(Math.abs(target), ...highlightPoints.map((h) => Math.abs(h.value)))\n if (scale === 0 || Math.abs(target - p.value) / scale > TARGET_NEAR_SHARE) return false\n const plot = Math.max(1, plotWidth - (showYAxis ? (yAxisWidth ?? Y_AXIS_ESTIMATE) : 0) - 32)\n const x = (p.index / (labels.length - 1)) * plot\n const w = estimateTextWidth(highlightText(p.value)) + 8\n const align = edgeAlign(p.index)?.align\n const left = align === \"right\" ? x - w - 6 : align === \"left\" ? x : x - w / 2\n return left < estimateTextWidth(targetText) + 8 + LABEL_SLACK\n }\n const hideTargetLabel =\n (kind === \"line\" && targetLabelPosition === \"legend\") ||\n !shareHighlight &&\n plotWidth !== undefined &&\n plotWidth < TARGET_LABEL_NARROW_WIDTH &&\n highlightPoints.some((p) => p.index === labels.length - 1 && (nearTargetLabel(p, \"under\") || nearTargetLabel(p, \"over\")))\n const below = (p: HighlightPoint) => !shareHighlight && !hideTargetLabel && nearTargetLabel(p, \"under\")\n const targetLabelBelow = !shareHighlight && !hideTargetLabel && highlightPoints.some((p) => nearTargetLabel(p, \"over\"))\n\n // One series (or a stack, against its total) can be compared to a target; grouped series and 100% stacks cannot.\n const barTargets: (number | null)[] | null =\n perBarTarget && targetKey && !percent && (stacked || categories.length === 1) ? barTargetValues(data, targetKey) : null\n const barTargetName = targetLabel ?? BAR_TARGET_LABEL\n const barTargetColor = labelColor ?? guideColor\n\n const markPointFor = (c: number, color: string | undefined) =>\n c === highlightSeries && highlightPoints.length > 0\n ? {\n silent: true,\n symbol: \"circle\",\n symbolSize: kind === \"bar\" ? 0 : 7,\n itemStyle: { color, borderColor: \"transparent\" },\n label: {\n show: true,\n position: horizontalBars ? (\"right\" as const) : (\"top\" as const),\n distance: 6,\n fontSize: 12,\n fontWeight: 500,\n color: labelColor,\n ...(labelBackground ? { backgroundColor: labelBackground, padding: [2, 4], borderRadius: 2 } : {}),\n formatter: (p: { value?: unknown }) => highlightText(Number(p.value)),\n },\n data: highlightPoints.map((p) => {\n // Below the point; on the forecast boundary, on the forecast side (the actual line comes in from the left).\n const label = shareHighlight\n ? // Inside the bottom band, under its upper edge: the label reads as that band's share.\n { ...edgeAlign(p.index), position: \"bottom\" as const }\n : below(p)\n ? p.index === boundaryIndex && p.index !== last\n ? { position: \"bottom\" as const, align: \"left\" as const, offset: [6, 0] }\n : { ...edgeAlign(p.index), position: \"bottom\" as const }\n : edgeAlign(p.index)\n return {\n name: p.kind,\n value: p.value,\n coord: horizontalBars ? [p.value, p.index] : [p.index, p.value],\n ...(label ? { label } : {}),\n }\n }),\n }\n : undefined\n\n // Threshold colours: bars side by side (one series or several). A stacked segment is a part, not a level to judge, so stacks keep their series colours.\n const byValue = kind === \"bar\" && !stacked && Boolean(thresholds?.length)\n const multiSeries = categories.length > 1\n // Horizontal bars of one series read light; only the highlighted bar is solid (the one the page is about).\n const lightBars = kind === \"bar\" && horizontalBars && !stacked && !multiSeries\n const series: Record<string, unknown>[] = categories.map((category, c) => {\n const solid = palette[c] || undefined\n const color = lightBars && solid ? withAlpha(solid, LIGHT_BAR_ALPHA) : solid\n const dimSeries = active !== null && active.category !== category\n const seriesData = pad(values[c]!)\n if (kind === \"bar\") {\n const rounded = horizontalBars ? [0, 4, 4, 0] : [4, 4, 0, 0]\n // Stacked: only the topmost segment is rounded.\n const radius = stacked && c !== categories.length - 1 ? 0 : rounded\n return {\n id: SERIES_ID_PREFIX + category,\n type: \"bar\" as const,\n name: category,\n stack: stacked ? \"total\" : undefined,\n barCategoryGap,\n itemStyle: { color, borderRadius: radius },\n markPoint: markPointFor(c, solid),\n markLine: undefined,\n data: seriesData.map((value, i) => {\n const tone = byValue ? toneForValue(value, thresholds) : undefined\n const toneColor = tone ? toneColors?.[tone] || undefined : undefined\n const isHighlight = lightBars && cfg.barHighlight !== undefined && String(rawIndex[i]) === String(cfg.barHighlight)\n const dimmed = active !== null && !(active.category === category && active.index === i)\n // Provisional bars: lighter fill and a dashed edge, never the solid look of a confirmed bar.\n const provisional = provStart !== -1 && i >= provStart && i <= lastActual\n const zeroLabel =\n showZeroValues && !stacked && value === 0\n ? {\n show: true,\n position: horizontalBars ? (\"right\" as const) : (\"top\" as const),\n distance: 4,\n fontSize: 12,\n color: labelColor,\n formatter: () => axisFormatter(0),\n }\n : undefined\n if (!dimmed && !toneColor && !isHighlight && !provisional && !zeroLabel) return value\n return {\n value,\n ...(zeroLabel ? { label: zeroLabel } : {}),\n itemStyle: {\n ...(isHighlight && solid ? { color: solid } : {}),\n ...(toneColor ? { color: toneColor } : {}),\n // Several series: the series colour stays on the edge so the legend still points at the bar.\n ...(toneColor && multiSeries && color && !provisional ? { borderColor: color, borderWidth: 2 } : {}),\n ...(provisional ? { opacity: PROVISIONAL_OPACITY, borderColor: toneColor ?? color, borderWidth: 1, borderType: \"dashed\" as const } : {}),\n ...(dimmed ? { opacity: DIMMED } : {}),\n },\n }\n }),\n }\n }\n if (c === compIdx) {\n // The comparison: thin, muted, solid, no markers, no fill, never stacked — behind the main series.\n return {\n id: SERIES_ID_PREFIX + category,\n type: \"line\" as const,\n name: category,\n z: 1,\n smooth: curveType === \"smooth\",\n step: curveType === \"step\" ? (\"middle\" as const) : undefined,\n connectNulls,\n symbol: \"none\",\n showSymbol: false,\n lineStyle: { width: COMPARISON_LINE_WIDTH, type: \"solid\" as const, color: comparisonColor, opacity: dimSeries ? DIMMED : 1 },\n itemStyle: { color: comparisonColor, opacity: dimSeries ? DIMMED : 1 },\n areaStyle: undefined,\n markPoint: undefined,\n markLine: undefined,\n data: seriesData,\n }\n }\n const areaStyle =\n kind !== \"area\" || fill === \"none\"\n ? undefined\n : fill === \"solid\" || !color\n ? { opacity: fill === \"solid\" ? 0.3 : 0.2 }\n : {\n color: {\n type: \"linear\" as const,\n x: 0,\n y: 0,\n x2: 0,\n y2: 1,\n colorStops: [\n { offset: 0, color: withAlpha(color, 0.28) },\n { offset: 1, color: withAlpha(color, 0) },\n ],\n },\n }\n return {\n id: SERIES_ID_PREFIX + category,\n type: \"line\" as const,\n name: category,\n stack: stacked ? \"total\" : undefined,\n smooth: curveType === \"smooth\",\n step: curveType === \"step\" ? (\"middle\" as const) : undefined,\n connectNulls,\n symbol: \"circle\",\n symbolSize: 6,\n showSymbol: showDots || data.length === 1,\n // 100% stacked: the top band's upper edge is the 100% line, not a value — drawn, it reads as「this band = 100%」.\n lineStyle:\n percent && c === categories.length - 1\n ? { width: 0, color, opacity: 0 }\n : { width: 2, color, opacity: dimSeries ? DIMMED : 1 },\n itemStyle: { color, opacity: dimSeries ? DIMMED : 1 },\n areaStyle: areaStyle && dimSeries ? { ...areaStyle, opacity: DIMMED * 0.3 } : areaStyle,\n markPoint: markPointFor(c, color),\n markLine: undefined,\n data: provStart === -1 ? seriesData : splitProvisional(seriesData, provStart).confirmed,\n }\n })\n\n /* -- provisional: a dashed, lighter continuation of every series from `provStart`, joined to the last confirmed point */\n if (kind !== \"bar\" && provStart !== -1) {\n categories.forEach((category, c) => {\n // The comparison is not provisional: it keeps its own line to the end.\n if (c === compIdx) return\n const color = palette[c] || undefined\n const dimSeries = active !== null && active.category !== category\n const solid = series[c] as { areaStyle?: { opacity?: number } }\n const opacity = (dimSeries ? DIMMED : 1) * PROVISIONAL_OPACITY\n series.push({\n id: PROVISIONAL_SERIES_PREFIX + category,\n type: \"line\" as const,\n name: provisionalLabel,\n // Its own stack: the joint point repeats the confirmed value and must not pile onto it.\n stack: stacked ? \"provisional\" : undefined,\n smooth: curveType === \"smooth\",\n step: curveType === \"step\" ? (\"middle\" as const) : undefined,\n connectNulls: false,\n symbol: \"circle\",\n symbolSize: 6,\n showSymbol: showDots || data.length === 1,\n lineStyle:\n percent && c === categories.length - 1\n ? { width: 0, color, opacity: 0 }\n : { width: 2, type: \"dashed\" as const, color, opacity },\n itemStyle: { color, opacity },\n areaStyle: solid.areaStyle ? { ...solid.areaStyle, opacity: (solid.areaStyle.opacity ?? 1) * PROVISIONAL_OPACITY } : undefined,\n markPoint: undefined,\n markLine: undefined,\n data: splitProvisional(pad(values[c]!), provStart).provisional,\n })\n })\n }\n // A bar legend entry for the provisional style (an empty line series: it takes no bar slot).\n if (kind === \"bar\" && provStart !== -1) {\n series.push({\n id: PROVISIONAL_SERIES_PREFIX + \"legend\",\n type: \"line\" as const,\n name: provisionalLabel,\n silent: true,\n symbol: \"none\",\n showSymbol: false,\n tooltip: { show: false },\n legendHoverLink: false,\n lineStyle: { opacity: 0 },\n itemStyle: { color: palette[0] || undefined, opacity: PROVISIONAL_OPACITY },\n markPoint: undefined,\n markLine: undefined,\n data: [],\n })\n }\n\n /* -- forecast: dashed continuation (+ optional band) of one series */\n const forecastLabel = forecast?.label ?? DEFAULT_FORECAST_LABEL\n const forecastBandAlpha = isDarkSurface(labelBackground) ? FORECAST_BAND_ALPHA_DARK : FORECAST_BAND_ALPHA_LIGHT\n const forecastValues: (number | null)[] = []\n if (forecast) {\n const category =\n forecast.category !== undefined && categories.includes(forecast.category) && forecast.category !== comparison?.category\n ? forecast.category\n : categories[mainIdx[0] ?? 0]!\n const c = categories.indexOf(category)\n const color = palette[c] || undefined\n const actual = values[c]!\n let start = -1\n for (let i = actual.length - 1; i >= 0; i--) {\n if (actual[i] !== null) {\n start = i\n break\n }\n }\n const line: (number | null)[] = Array<null>(labels.length).fill(null)\n const lower: (number | null)[] = Array<null>(labels.length).fill(null)\n const range: (number | null)[] = Array<null>(labels.length).fill(null)\n if (start !== -1) {\n line[start] = actual[start]!\n lower[start] = actual[start]!\n range[start] = 0\n }\n let hasBand = false\n forecast.data.forEach((row: ChartForecastRow, k) => {\n const at = forecastAt[k]!\n line[at] = cellNumber(row.value)\n const lo = cellNumber(row.lower)\n const hi = cellNumber(row.upper)\n if (lo !== null && hi !== null) {\n hasBand = true\n lower[at] = Math.min(lo, hi)\n range[at] = Math.abs(hi - lo)\n }\n })\n forecastValues.push(...line)\n const helper = {\n type: \"line\" as const,\n silent: true,\n symbol: \"none\",\n showSymbol: false,\n connectNulls: true,\n tooltip: { show: false },\n legendHoverLink: false,\n emphasis: { disabled: true },\n markPoint: undefined,\n markLine: undefined,\n }\n if (hasBand) {\n series.push(\n {\n ...helper,\n id: FORECAST_BAND_BASE_ID,\n name: FORECAST_BAND_BASE_ID,\n stack: FORECAST_BAND_BASE_ID,\n lineStyle: { opacity: 0 },\n areaStyle: undefined,\n data: lower,\n },\n {\n ...helper,\n id: FORECAST_BAND_RANGE_ID,\n name: FORECAST_BAND_RANGE_ID,\n stack: FORECAST_BAND_BASE_ID,\n lineStyle: { opacity: 0 },\n areaStyle: color ? { color: withAlpha(color, forecastBandAlpha), opacity: 1 } : { opacity: forecastBandAlpha },\n data: range,\n },\n )\n }\n series.push({\n ...helper,\n id: FORECAST_SERIES_ID,\n name: forecastLabel,\n silent: false,\n tooltip: undefined,\n emphasis: undefined,\n smooth: curveType === \"smooth\",\n // Always dashed (2px, 6-4) and lighter — a forecast must never read as a measurement, nor as the 1px dotted target.\n lineStyle: { width: 2, type: FORECAST_LINE_DASH, color, opacity: 0.7 },\n itemStyle: { color, opacity: 0.7 },\n areaStyle: undefined,\n data: line,\n })\n }\n\n /* -- overlay: target line, forecast boundary, and the extent that keeps the target on the axis */\n /**\n * Horizontal bars: the target line is vertical and its label lies flat above the plot, centred\n * on the line — unless that would run past the plot's right (or left) edge, e.g. a target near\n * the axis max on a narrow chart; then it hangs to the line's left (right) instead. The axis max\n * is estimated from the data (ECharts rounds it up, which only moves the line left of the guess).\n */\n const horizontalTargetAlign = ((): \"left\" | \"center\" | \"right\" => {\n if (!horizontalBars || !hasTarget) return \"center\"\n const totals = labels.map((_, i) =>\n stacked\n ? values.reduce((sum, v) => sum + Math.max(0, v[i] ?? 0), 0)\n : Math.max(0, ...values.map((v) => v[i] ?? 0)),\n )\n const top = percent ? 100 : (maxValue ?? Math.max(target, ...totals))\n if (!(top > 0)) return \"center\"\n const ratio = Math.min(1, Math.max(0, target / top))\n const half = (estimateTextWidth(targetText) + 8) / 2\n if (!plotWidth) return ratio > 0.85 ? \"right\" : ratio < 0.15 ? \"left\" : \"center\"\n const right = highlightPoints.length > 0 ? 64 : 16\n const categoryColumn = showYAxis ? (yAxisWidth ?? Math.min(160, Math.max(0, ...labels.map(estimateTextWidth)))) + 8 : 0\n const plot = Math.max(1, plotWidth - categoryColumn - right - 4)\n const at = ratio * plot\n if (plot - at + right < half) return \"right\"\n if (at + categoryColumn < half) return \"left\"\n return \"center\"\n })()\n const markLines: unknown[] = []\n const markAreas: unknown[] = []\n if (hasTarget && target !== undefined) {\n markLines.push({\n name: \"target\",\n [horizontalBars ? \"xAxis\" : \"yAxis\"]: target,\n // 1px dotted — the forecast is 2px dashed, so the two never read as one line.\n lineStyle: { type: TARGET_LINE_DASH, width: 1, color: guideColor },\n label: {\n show: !hideTargetLabel,\n // The start (left) of the line, above it — under it when a highlight sits just above the target there.\n // Horizontal bars: the line is vertical, so the label goes flat above its top end, outside the plot (no rotation, clear of the bars).\n // The category axis is inverted there (first row on top), so the line runs top → bottom and its top end is the *start*.\n position: horizontalBars\n ? \"start\"\n : kind === \"line\" && targetLabelPosition === \"end\"\n ? \"insideEndTop\"\n : targetLabelBelow\n ? \"insideStartBottom\"\n : \"insideStartTop\",\n ...(horizontalBars ? { rotate: 0, align: horizontalTargetAlign, verticalAlign: \"bottom\" as const, distance: 4 } : {}),\n color: guideColor,\n formatter: targetText,\n },\n })\n }\n if (forecast) {\n const forecastSpan =\n plotWidth && labels.length > 1\n ? (Math.max(1, plotWidth - (showYAxis ? (yAxisWidth ?? Y_AXIS_ESTIMATE) : 0) - LINE_RIGHT_MARGIN) / (labels.length - 1)) *\n (labels.length - 1 - lastActual) +\n LINE_RIGHT_MARGIN\n : null\n markLines.push({\n name: \"forecast-boundary\",\n xAxis: lastActual,\n lineStyle: { type: \"dashed\", width: 1, color: guideColor },\n // Flat (text-xs, muted), just above the plot's top edge at the top of the line (`grid.top` makes the room; the legend\n // sits above that): along the line at its foot it ran into the x axis labels on a narrow chart.\n label: {\n show: true,\n position: \"end\",\n rotate: 0,\n align: forecastLabelAlign(forecastSpan, forecastBoundaryText(forecastLabel)),\n verticalAlign: \"bottom\" as const,\n distance: 4,\n fontSize: 12,\n color: guideColor,\n formatter: forecastBoundaryText(forecastLabel),\n },\n })\n }\n /* -- annotations: a thin neutral line, or a faint band for a range, on the category axis (vertical layouts only) */\n const notes = horizontalBars ? [] : resolveAnnotations(cfg.annotations, rawIndex)\n const noteGap = plotWidth && labels.length > 1 ? plotWidth / (kind === \"bar\" ? labels.length : labels.length - 1) : null\n if (notes.length > 0) {\n const singles = notes.filter((n) => n.to === undefined)\n const ends = annotationLabelEnds(singles.map((n) => n.from), noteGap)\n const background = labelBackground ? { backgroundColor: labelBackground, padding: [1, 3], borderRadius: 2 } : {}\n singles.forEach((note, k) => {\n markLines.push({\n name: `annotation:${note.label}`,\n xAxis: note.from,\n lineStyle: { type: \"solid\", width: 1, color: guideColor },\n // Along the line, at the top (the legend sits above the plot) or at its foot when a neighbour is close.\n label: {\n show: true,\n position: ends[k] === \"top\" ? \"insideEndTop\" : \"insideStartBottom\",\n color: guideColor,\n ...background,\n formatter: note.label,\n },\n })\n })\n const over = kind === \"bar\" ? 0.5 : 0\n for (const note of notes) {\n if (note.to === undefined) continue\n const widthPx = noteGap === null ? null : (note.to - note.from + (kind === \"bar\" ? 1 : 0)) * noteGap\n const fits = widthPx === null ? [...note.label].length <= 6 : estimateTextWidth(note.label) + 8 <= widthPx\n markAreas.push([\n {\n name: note.label,\n xAxis: note.from - over,\n itemStyle: { color: guideColor ? withAlpha(guideColor, 0.12) : undefined },\n // The band's foot (bars: just above the plot — inside, the text would run into the value label of a tall bar,\n // and `grid.top` makes the room); a band narrower than its text reads the text upright along the band instead.\n label: {\n show: true,\n position: kind === \"bar\" ? \"top\" : fits ? \"insideBottom\" : \"inside\",\n rotate: fits ? 0 : 90,\n color: guideColor,\n fontSize: 12,\n formatter: note.label,\n },\n },\n { xAxis: note.to + over },\n ])\n }\n }\n // The target is a legend entry too (an empty line series carries the name): the line may lose its label on a narrow plot.\n if (hasTarget) {\n series.push({\n id: TARGET_LEGEND_SERIES_ID,\n type: \"line\" as const,\n name: targetText,\n silent: true,\n symbol: \"none\",\n showSymbol: false,\n tooltip: { show: false },\n legendHoverLink: false,\n emphasis: { disabled: true },\n lineStyle: { opacity: 0 },\n itemStyle: { color: guideColor },\n markPoint: undefined,\n markLine: undefined,\n data: [],\n })\n }\n if (markLines.length > 0 || markAreas.length > 0) {\n series.push({\n id: OVERLAY_SERIES_ID,\n name: OVERLAY_SERIES_ID,\n type: \"line\" as const,\n silent: true,\n symbol: \"none\",\n showSymbol: false,\n tooltip: { show: false },\n legendHoverLink: false,\n emphasis: { disabled: true },\n lineStyle: { opacity: 0 },\n itemStyle: { color: guideColor },\n // A single invisible point at the target, so the value axis always reaches it.\n data: labels.map((_, i) => (i === 0 && hasTarget && target !== undefined ? target : null)),\n markPoint: undefined,\n // `precision`: ECharts rounds a mark line's value to 2 decimals by default (a 0.035 target would land on 0.04 — off a fitted axis,\n // where the line is then dropped). `z` keeps the guide lines above the series' own lines.\n markLine: markLines.length > 0 ? { silent: true, symbol: \"none\", animation: false, precision: 20, z: 6, data: markLines } : undefined,\n markArea: markAreas.length > 0 ? { silent: true, animation: false, data: markAreas } : undefined,\n })\n }\n /*\n * -- per-bar targets: a short marker across each bar at its target. A custom\n * series (the marker's length follows the bar's width, in px, whatever the chart's\n * size) whose data also keeps the value axis reaching the largest target. It is\n * the legend's entry too: the marker is named, with a tick as its icon.\n */\n if (barTargets) {\n series.push({\n id: TARGET_MARKER_SERIES_ID,\n type: \"custom\" as const,\n name: barTargetName,\n silent: true,\n animation: false,\n z: 5,\n tooltip: { show: false },\n legendHoverLink: false,\n emphasis: { disabled: true },\n itemStyle: { color: barTargetColor },\n encode: { x: 0, y: 1 },\n data: barTargets.flatMap((value, i) => (value === null ? [] : [horizontalBars ? [value, i] : [i, value]])),\n renderItem: targetMarkerRenderer(horizontalBars, barCategoryGap, barTargetColor),\n })\n }\n\n const categoryAxis = {\n id: horizontalBars ? \"y\" : \"x\",\n type: \"category\" as const,\n data: labels,\n show: horizontalBars ? showYAxis : showXAxis,\n boundaryGap: kind === \"bar\",\n inverse: horizontalBars,\n axisTick: { show: false },\n axisLabel: {\n hideOverlap: true,\n rotate: kind === \"line\" ? 0 : undefined,\n interval: shownLabel ?? (\"auto\" as const),\n formatter:\n timeLabels || nameLabels\n ? (value: string, i: number) => {\n const time = timeLabels?.[i]\n if (time === \"\") return \"\"\n return hasLabel(nameLabels, value) ? labelOf(value, nameLabels) : (time ?? value)\n }\n : undefined,\n width: horizontalBars ? yAxisWidth : undefined,\n overflow: horizontalBars && yAxisWidth != null ? (\"truncate\" as const) : undefined,\n },\n name: horizontalBars ? yAxisLabel : xAxisLabel,\n nameLocation: \"middle\" as const,\n nameGap: horizontalBars ? (yAxisWidth ?? 48) + 8 : 28,\n }\n const fit = kind === \"line\" && (fitToData ?? autoMinValue)\n // A horizontal bar chart's value ticks run along the (narrow) width: as many as fit side by side.\n const valueSplitNumber = (() => {\n if (!horizontalBars || !plotWidth) return undefined\n const top = percent\n ? 100\n : (maxValue ?? Math.max(0, ...(stacked ? stackTotalsOf(values) : values.flat()).map((v) => v ?? 0)))\n const categoryColumn = showYAxis ? (yAxisWidth ?? Math.min(160, Math.max(0, ...labels.map(estimateTextWidth)))) + 8 : 0\n const plot = plotWidth - categoryColumn - (highlightPoints.length > 0 ? 64 : 16) - 4\n const text = percent ? (v: number) => `${v}%` : (v: number) => axisFormatter(v)\n return valueAxisSplitNumber(plot, [text(0), text(top)])\n })()\n const limits = valueAxisLimits({ minValue, maxValue }, kind !== \"line\")\n // Vertical value axes carry 3 intervals on a short plot, else 4–5 (a horizontal bar chart's follows its width, above).\n const splitNumber = horizontalBars ? valueSplitNumber : valueAxisSplitCount(plotHeight)\n /*\n * Ticks read in one unit — the unit of the axis' largest tick (¥0.5億 / ¥1億, never ¥5,000万 beside ¥1億). The largest\n * tick is estimated from the data the way ECharts nices its ends.\n */\n const tickFormatter = (() => {\n if (!cfg.axisTicks || percent) return axisFormatter\n const extentValues: number[] = []\n const addAll = (list: readonly (number | null)[]) => {\n for (const v of list) if (v !== null && Number.isFinite(v)) extentValues.push(v)\n }\n if (stackTotals) addAll(stackTotals)\n else values.forEach(addAll)\n addAll(forecastValues)\n if (forecast) addAll(forecast.data.flatMap((row) => [cellNumber(row.lower), cellNumber(row.upper)]))\n if (barTargets) addAll(barTargets)\n if (hasTarget && target !== undefined) extentValues.push(target)\n if (maxValue !== undefined && Number.isFinite(maxValue)) extentValues.push(maxValue)\n if (minValue !== undefined && Number.isFinite(minValue)) extentValues.push(minValue)\n if (extentValues.length === 0) return axisFormatter\n const zeroBased = kind !== \"line\" || !fit\n const hi = Math.max(...extentValues, zeroBased ? 0 : -Infinity)\n const lo = Math.min(...extentValues, zeroBased ? 0 : Infinity)\n return cfg.axisTicks(estimateAxisTop(lo, hi, splitNumber ?? 5, maxValue !== undefined && Number.isFinite(maxValue) ? maxValue : undefined))\n })()\n const valueAxis = {\n id: horizontalBars ? \"x\" : \"y\",\n type: \"value\" as const,\n show: horizontalBars ? showXAxis : showYAxis,\n // Bars and areas always start at 0 (a positive `minValue` can't lift them, a negative one makes room below);\n // lines do too unless asked to fit the data. A limit never cuts the data: the axis widens to it.\n min: percent ? 0 : kind === \"line\" ? (minValue === undefined ? (fit ? undefined : zeroBasedMin) : limits.min) : limits.min,\n max: percent ? 100 : limits.max,\n scale: fit && minValue == null,\n splitNumber,\n minInterval: allowDecimals ? undefined : 1,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: { show: showGridLines },\n axisLabel: {\n formatter: percent ? (v: number) => `${v}%` : (v: number) => tickFormatter(v),\n // Fitted to the data: the lowest tick would print over the first x label at the bottom left. The gridline stays.\n showMinLabel: fit && minValue == null && !horizontalBars ? false : undefined,\n // Horizontal: ticks that would still touch on a narrow plot are dropped.\n hideOverlap: horizontalBars ? true : undefined,\n // A fixed width lines up side-by-side plots, but a value tick is never cut: the grid contains it.\n width: horizontalBars ? undefined : yAxisWidth,\n },\n name: horizontalBars ? xAxisLabel : yAxisLabel,\n nameLocation: \"middle\" as const,\n nameGap: horizontalBars ? 28 : (yAxisWidth ?? 48) + 8,\n }\n\n const legendItems = [\n ...categories,\n ...(forecast ? [forecastLabel] : []),\n ...(provStart !== -1 ? [provisionalLabel] : []),\n ...(barTargets ? [barTargetName] : []),\n ...(hasTarget ? [targetText] : []),\n ]\n const option = {\n ...chartMotion(reducedMotion),\n legend: {\n show: showLegend,\n top: 0,\n right: reserveActions ? ACTIONS_RESERVE : 0,\n // Plain wraps onto a second line at narrow widths instead of hiding items behind arrows.\n type: \"plain\",\n icon: \"circle\",\n itemWidth: 8,\n itemHeight: 8,\n itemGap: 16,\n // The target marker is a tick, not a dot.\n // The target is a row of dots and the forecast a row of dashes — their lines' patterns — and a per-bar target a tick.\n data: legendItems.map((name) =>\n barTargets && name === barTargetName\n ? { name, icon: TARGET_LEGEND_ICON }\n : forecast && name === forecastLabel\n ? { name, icon: FORECAST_DASHED_ICON }\n : hasTarget && name === targetText\n ? { name, icon: TARGET_DOTTED_ICON }\n : name,\n ),\n formatter: nameLabels ? (name: string) => labelOf(name, nameLabels) : undefined,\n },\n grid: {\n top:\n (showLegend ? 12 + LEGEND_LINE_HEIGHT * legendLines(legendItems, plotWidth, reserveActions ? ACTIONS_RESERVE : 0) : 12) +\n // The flat target label of a horizontal bar chart sits above the plot.\n (horizontalBars && hasTarget ? 18 : 0) +\n // The label of a band over bars sits above the plot's top edge.\n (kind === \"bar\" && notes.some((n) => n.to !== undefined) ? BAND_LABEL_ROOM : 0) +\n // The boundary label of a forecast sits above the plot's top edge too.\n (forecast ? FORECAST_LABEL_ROOM : 0),\n // Lines start and end on the outermost ticks, so the last x label (and an edge\n // highlight) hangs past the plot; a horizontal bar's highlight sits past its end.\n right: horizontalBars ? (highlightPoints.length > 0 ? 64 : 16) : kind === \"bar\" ? 16 : LINE_RIGHT_MARGIN,\n bottom: xAxisLabel ? 24 : 4,\n left: yAxisLabel ? 24 : 4,\n containLabel: true,\n },\n tooltip: {\n show: showTooltip,\n trigger: \"axis\",\n axisPointer: { type: kind === \"bar\" ? \"shadow\" : \"line\" },\n formatter: (params: unknown) => {\n const list = (Array.isArray(params) ? params : [params]) as AxisTooltipParam[]\n const i = list[0]?.dataIndex ?? 0\n const row = i <= lastActual ? (data[i] ?? {}) : {}\n const rows: TooltipRow[] = []\n // The main series' difference from the comparison: one muted line under its row.\n const primary = mainIdx[0]\n const noteFor = (at: number): { note?: string } => {\n if (!comparison || compIdx === -1 || at !== primary || i > lastActual) return {}\n return {\n note: comparisonNote(\n cellNumber(row[categories[at]!]),\n cellNumber(row[comparison.category]),\n comparison,\n compGrain,\n cfg.comparisonFormat,\n locale,\n ),\n }\n }\n const shares = percent ? cartesianSeriesValues(i <= lastActual ? [row] : [], categories, \"percent\") : null\n for (const p of list) {\n const color = typeof p.color === \"string\" ? p.color : \"currentColor\"\n if (p.seriesId === FORECAST_SERIES_ID) {\n // At and before the boundary the forecast repeats the actual value.\n if (i > lastActual) rows.push({ name: p.seriesName ?? forecastLabel, color, value: forecastValues[i] ?? null })\n continue\n }\n if (p.seriesId?.startsWith(\"__\")) continue\n if (i > lastActual) continue\n const name = p.seriesName ?? \"\"\n const at = categories.indexOf(name)\n const share = shares && at !== -1 ? (shares[at]![0] ?? undefined) : undefined\n rows.push({\n name: labelOf(name, nameLabels),\n color: at === compIdx ? (comparisonColor ?? color) : color,\n value: cellNumber(row[name]),\n ...(share !== undefined ? { share } : {}),\n ...(at !== -1 ? noteFor(at) : {}),\n })\n }\n if (stackTotals && i <= lastActual && rows.length > 1) {\n rows.push({ name: STACK_TOTAL_LABEL, color: \"transparent\", value: stackTotals[i] ?? null })\n }\n const provisional = provStart !== -1 && i >= provStart && i <= lastActual\n if (provisional) {\n // The confirmed series are empty here: rows come from the data, under a 「速報」 title.\n rows.length = 0\n categories.forEach((name, at) => {\n const share = shares ? (shares[at]![0] ?? undefined) : undefined\n rows.push({\n name,\n color: at === compIdx ? (comparisonColor ?? \"currentColor\") : palette[at] || \"currentColor\",\n value: cellNumber(row[name]),\n ...(share !== undefined ? { share } : {}),\n ...noteFor(at),\n })\n })\n if (stackTotals && rows.length > 1) rows.push({ name: STACK_TOTAL_LABEL, color: \"transparent\", value: stackTotals[i] ?? null })\n }\n const title = tooltipTitles[i] ?? labels[i] ?? \"\"\n const lines: string[] = []\n if (barTargets && i <= lastActual) {\n const total = stackTotals ? (stackTotals[i] ?? null) : (values[0]?.[i] ?? null)\n const note = barTargetNote(barTargetName, total, barTargets[i] ?? null, valueFormatter)\n if (note) lines.push(note)\n }\n for (const note of notes) {\n if (note.to === undefined ? note.from === i : note.from <= i && i <= note.to) lines.push(note.label)\n }\n return tooltipHtml(provisional ? `${title}(${provisionalLabel})` : title, rows, valueFormatter, lines)\n },\n },\n xAxis: horizontalBars ? valueAxis : categoryAxis,\n yAxis: horizontalBars ? categoryAxis : valueAxis,\n series,\n }\n return mergeChartOptions(option as EChartsOption, chartOptions)\n}\n\n/* ------------------------------------------------------------------ donut */\n\nexport type DonutVariant = \"donut\" | \"pie\"\n\n/** What the donut prints in its hole (`donutOptions.centerLabel`). */\nexport type DonutCenterLabel = \"none\" | \"total\" | \"top\"\n\n/**\n * The center of the donut as one of the three built-ins or a custom node.\n * Default `\"none\"`; the legacy `showLabel` (`false` → none, an explicit `true` →\n * total, the old default) and `label` (a custom node) still win over the default.\n */\nexport function resolveDonutCenter(\n centerLabel: DonutChartOptions[\"centerLabel\"],\n { showLabel, label }: { showLabel?: boolean; label?: ReactNode } = {},\n): { kind: DonutCenterLabel } | { kind: \"custom\"; node: ReactNode } {\n if (showLabel === false) return { kind: \"none\" }\n if (centerLabel === \"none\") return { kind: \"none\" }\n if (centerLabel === \"total\") return { kind: \"total\" }\n if (centerLabel === \"top\") return { kind: \"top\" }\n if (centerLabel !== undefined && centerLabel !== null && centerLabel !== false) return { kind: \"custom\", node: centerLabel }\n if (label !== undefined && label !== null && label !== false) return { kind: \"custom\", node: label }\n return { kind: showLabel === true ? \"total\" : \"none\" }\n}\n\n/** Below this plot width (px) the outside labels can't fit beside the ring. */\nexport const DONUT_OUTSIDE_LABEL_MIN_WIDTH = 440\n\n/**\n * How many slices get an outside label. A share is printed once: the legend\n * carries every slice's share, so with a legend there are no outside labels;\n * without one the 2 largest are labelled when the plot is wide enough\n * (`plotWidth` `null` = not measured yet → labelled).\n */\nexport function donutOutsideLabelCount(plotWidth: number | null, showLegend: boolean): number {\n if (showLegend) return 0\n return plotWidth !== null && plotWidth < DONUT_OUTSIDE_LABEL_MIN_WIDTH ? 0 : DONUT_OUTSIDE_LABELS\n}\n\n/** The `\"top\"` center: the largest real slice's name (`label`) and share (`amount`); `null` when there is none. */\nexport function donutTopText(\n slices: readonly DonutOptionSlice[],\n labels?: Readonly<Record<string, string>>,\n): { label: string; amount: string } | null {\n const total = slices.reduce((sum, s) => sum + sliceValue(s.value), 0)\n const top = [...slices].filter((s) => !s.isOther && sliceValue(s.value) > 0).sort((a, b) => sliceValue(b.value) - sliceValue(a.value))[0]\n return top ? { label: labelOf(top.name, labels), amount: donutShareText(top.value, total) } : null\n}\n\n/** DonutChart-only settings. */\nexport interface DonutChartOptions {\n /** `\"donut\"`(中央に穴とラベル)か `\"pie\"`。既定 `\"donut\"`。 */\n variant?: DonutVariant\n /** @deprecated `centerLabel` を使う。`false` は `centerLabel: \"none\"` と同じ。`true` を明示すると `\"total\"` 扱い(以前の既定)。 */\n showLabel?: boolean\n /**\n * 穴の中央に出すもの。`\"none\"`(既定。何も出さない。合計は KPI と重複しがち)/ `\"total\"`(「合計」と\n * 合計を書式化した値。`totalLabel` / `unit` を添える)/ `\"top\"`(最大の切片の名前と構成比)。\n * それ以外のノードを渡すとそのまま中央に置く。donut のみ。\n */\n centerLabel?: DonutCenterLabel | ReactNode\n /** 中央ラベルの見出し(何の合計か)。既定「合計」。 */\n totalLabel?: string\n /** 中央ラベルの合計に添える単位(`\"セッション\"` → 「9.2万 セッション」)。 */\n unit?: string\n /** 凡例(名前と構成比、大きい順)を出す。広いときは右、狭いときは下。既定 `true`。構成比は凡例だけが持つ(凡例を消すと、広いときだけ大きい 2 切片に外ラベルで名前と構成比が出る)。 */\n showLegend?: boolean\n /** 個別に描く切片の数。超えた分は大きさ順の残りを「その他」1 切片にまとめる。既定 5。 */\n maxSlices?: number\n}\n\n/** A slice as the builder takes it: already sorted, folded and coloured (see `donutSlices`). */\nexport interface DonutOptionSlice {\n name: string\n value: number\n /** The folded「その他」slice: never labelled outside. */\n isOther?: boolean\n}\n\n/** How many of the largest slices get an outside label (「自然検索 41%」) by default. */\nexport const DONUT_OUTSIDE_LABELS = 2\n\nconst DEFAULT_TOTAL_LABEL = \"合計\"\n\nconst sliceValue = (value: number) => (Number.isFinite(value) && value > 0 ? value : 0)\n\n/** A slice's share of `total` as text: whole percent, `<1%` for a sliver, `0%` for nothing. */\nexport function donutShareText(value: number, total: number): string {\n const v = sliceValue(value)\n if (total <= 0 || v === 0) return \"0%\"\n const pct = (v / total) * 100\n return pct < 1 ? \"<1%\" : `${Math.round(pct)}%`\n}\n\n/** One legend row: name, share text and the slice's position (for its colour). */\nexport interface DonutLegendItem {\n name: string\n value: number\n share: string\n isOther: boolean\n /** Index into the slices / palette. */\n slice: number\n}\n\n/**\n * The donut legend: every slice with its share, largest first, the folded\n * 「その他」 last (it is a remainder, not a rank).\n */\nexport function donutLegendItems(slices: readonly DonutOptionSlice[]): DonutLegendItem[] {\n const total = slices.reduce((sum, s) => sum + sliceValue(s.value), 0)\n return slices\n .map((s, slice) => ({ name: s.name, value: sliceValue(s.value), share: donutShareText(s.value, total), isOther: Boolean(s.isOther), slice }))\n .sort((a, b) => Number(a.isOther) - Number(b.isOther) || b.value - a.value || a.slice - b.slice)\n}\n\n/**\n * The default center label: what is totalled (「合計」), the formatted total\n * (`amount`, the big line), the unit (a small line under it) and both as one\n * string (`value`, 「9.2万 セッション」).\n */\nexport function donutCenterText(\n total: number,\n valueFormatter: (value: number) => string,\n { totalLabel = DEFAULT_TOTAL_LABEL, unit }: { totalLabel?: string; unit?: string } = {},\n): { label: string; value: string; amount: string; unit?: string } {\n const amount = valueFormatter(total)\n return { label: totalLabel, value: unit ? `${amount} ${unit}` : amount, amount, ...(unit ? { unit } : {}) }\n}\n\n/** The ring's inner radius, in percent of the plot's shorter side / 2 — with and without outside labels. */\nconst DONUT_INNER_WITH_LABELS = 50\nconst DONUT_INNER_PLAIN = 72\n\n/**\n * The hole's diameter as a fraction of the plot's shorter side (ECharts reads a\n * `%` radius against half of it), so an HTML center label can be sized to fit.\n */\nexport function donutHoleRatio(withOutsideLabels: boolean): number {\n return (withOutsideLabels ? DONUT_INNER_WITH_LABELS : DONUT_INNER_PLAIN) / 100\n}\n\nexport interface DonutChartConfig {\n /** Slices in draw order (largest first, 「その他」 last). */\n slices: readonly DonutOptionSlice[]\n /** Resolved slice colours, by slice position. `\"\"`/missing → theme palette. */\n palette: readonly string[]\n /** Display names for slice names (tooltip, outside labels). Missing keys show as they are. */\n labels?: Readonly<Record<string, string>>\n valueFormatter: (value: number) => string\n /** The value column's name, shown in the tooltip row. */\n valueName?: string\n variant?: DonutVariant\n showTooltip?: boolean\n /** How many of the largest (non-「その他」) slices get an outside label. Default `DONUT_OUTSIDE_LABELS` (2); 0 = none. */\n outsideLabels?: number\n /** Name of the selected slice; the others are dimmed. */\n active?: string | null\n /** Colour of the outside labels (resolved foreground). Default: the theme's text colour. */\n labelColor?: string\n reducedMotion?: boolean\n /** Deep-merged onto the generated option last. */\n chartOptions?: EChartsOption\n}\n\n/** Sum of the `value` column, ignoring gaps and negative cells. */\nexport function donutTotal(data: readonly Record<string, unknown>[], value: string): number {\n return data.reduce((sum, row) => {\n const n = cellNumber(row[value])\n return n !== null && n > 0 ? sum + n : sum\n }, 0)\n}\n\ninterface ItemTooltipParam {\n name?: string\n value?: unknown\n percent?: number\n color?: unknown\n}\n\n/**\n * The donut / pie option. Only the `outsideLabels` largest slices carry an\n * outside label (name + share); the legend, center label and tooltip carry the\n * rest. No entrance animation, a short ease on updates.\n */\nexport function buildDonutOption(cfg: DonutChartConfig): EChartsOption {\n const {\n slices,\n palette,\n labels: nameLabels,\n valueFormatter,\n valueName = \"\",\n variant = \"donut\",\n showTooltip = true,\n outsideLabels = DONUT_OUTSIDE_LABELS,\n active = null,\n labelColor,\n reducedMotion = false,\n chartOptions,\n } = cfg\n const total = slices.reduce((sum, s) => sum + sliceValue(s.value), 0)\n // The largest real slices, by value (the slices arrive sorted, but don't rely on it).\n const labelled = new Set(\n slices\n .map((s, i) => ({ i, v: sliceValue(s.value), other: Boolean(s.isOther) }))\n .filter((s) => !s.other && s.v > 0)\n .sort((a, b) => b.v - a.v || a.i - b.i)\n .slice(0, Math.max(0, outsideLabels))\n .map((s) => s.i),\n )\n const withLabels = labelled.size > 0\n // Room for the outside labels: the ring shrinks inside the plot.\n const outer = withLabels ? \"70%\" : \"100%\"\n const option = {\n ...chartMotion(reducedMotion),\n tooltip: {\n show: showTooltip,\n trigger: \"item\",\n formatter: (params: unknown) => {\n const p = params as ItemTooltipParam\n const n = cellNumber(p.value)\n const share = typeof p.percent === \"number\" ? ` (${p.percent.toFixed(1)}%)` : \"\"\n return tooltipHtml(\n `${labelOf(p.name ?? \"\", nameLabels)}${share}`,\n [{ name: valueName, color: typeof p.color === \"string\" ? p.color : \"currentColor\", value: n }],\n valueFormatter,\n )\n },\n },\n series: [\n {\n id: \"slices\",\n type: \"pie\",\n radius: variant === \"donut\" ? [`${donutHoleRatio(withLabels) * 100}%`, outer] : [0, outer],\n center: [\"50%\", \"50%\"],\n avoidLabelOverlap: true,\n // Plain text: no outline / shadow, which reads as a halo on a dark surface.\n label: {\n show: false,\n position: \"outside\",\n color: labelColor,\n textBorderWidth: 0,\n textBorderColor: \"transparent\",\n textShadowBlur: 0,\n textShadowColor: \"transparent\",\n },\n labelLine: { show: false, length: 8, length2: 8 },\n // A hairline gap between slices instead of a border — no background colour to match.\n padAngle: slices.length > 1 ? 1 : 0,\n itemStyle: { borderRadius: variant === \"donut\" ? 2 : 0 },\n emphasis: { scale: true, scaleSize: 4 },\n data: slices.map((slice, i) => ({\n name: slice.name,\n value: sliceValue(slice.value),\n itemStyle: { color: palette[i] || undefined, opacity: active !== null && active !== slice.name ? DIMMED : 1 },\n ...(labelled.has(i)\n ? {\n label: { show: true, formatter: () => `${labelOf(slice.name, nameLabels)} ${donutShareText(slice.value, total)}` },\n labelLine: { show: true },\n }\n : {}),\n })),\n },\n ],\n }\n return mergeChartOptions(option as EChartsOption, chartOptions)\n}\n\n/* -------------------------------------------------------------- selection */\n\n/** Toggle: clicking the active point again clears the selection. */\nexport function nextChartSelection(\n current: ChartActivePoint | null,\n category: string,\n index: number,\n): ChartActivePoint | null {\n return current && current.category === category && current.index === index ? null : { category, index }\n}\n\n/** What `onValueChange` receives: the clicked row plus what was clicked (ours win over row keys). */\nexport function chartSelectionPayload(\n selection: ChartActivePoint | null,\n data: readonly Record<string, unknown>[],\n eventType: NonNullable<ChartEventPayload>[\"eventType\"],\n): ChartEventPayload {\n if (!selection) return null\n return { ...data[selection.index], eventType, categoryClicked: selection.category }\n}\n\ninterface ChartClickParams {\n componentType?: string\n seriesName?: string\n name?: string\n dataIndex?: number\n}\n\n/**\n * Click-to-select for the typed charts: the `onEvents` to hand `EChart`, and\n * the active point to dim the rest with. Inert (no handler, nothing active)\n * without `onValueChange`.\n */\nexport function useChartSelection(\n data: readonly Record<string, unknown>[],\n onValueChange: ((value: ChartEventPayload) => void) | undefined,\n eventType: NonNullable<ChartEventPayload>[\"eventType\"],\n): { active: ChartActivePoint | null; onEvents: Record<string, (params: unknown) => void> | undefined } {\n const [active, setActive] = useState<ChartActivePoint | null>(null)\n // Handlers read the latest props without re-subscribing on every render.\n const latest = useRef({ data, onValueChange, active })\n latest.current = { data, onValueChange, active }\n const interactive = onValueChange !== undefined\n const onEvents = useMemo(() => {\n if (!interactive) return undefined\n return {\n click: (raw: unknown) => {\n const p = raw as ChartClickParams\n if (p.componentType !== \"series\" || typeof p.dataIndex !== \"number\") return\n const category = eventType === \"slice\" ? (p.name ?? \"\") : (p.seriesName ?? \"\")\n const next = nextChartSelection(latest.current.active, category, p.dataIndex)\n latest.current.active = next\n setActive(next)\n latest.current.onValueChange?.(chartSelectionPayload(next, latest.current.data, eventType))\n },\n }\n }, [interactive, eventType])\n return { active: interactive ? active : null, onEvents }\n}\n\n/**\n * Display name for `key`: `labels[key]` when present, else `key` itself.\n * (Own keys only, so `\"constructor\"` is not looked up on the prototype.)\n */\nexport function labelOf(key: string, labels?: Readonly<Record<string, string>>): string {\n return hasLabel(labels, key) ? labels![key]! : key\n}\n\n/** `data` with each row's `index` cell replaced by its display name (rows are copied, not mutated). */\nexport function labelRows<Row extends Record<string, unknown>>(\n data: readonly Row[],\n index: string,\n labels?: Readonly<Record<string, string>>,\n): Row[] {\n if (!labels) return data as Row[]\n return data.map((row) => ({ ...row, [index]: labelOf(String(row[index] ?? \"\"), labels) }))\n}\n\n/** Whether `labels` renames `key` (own keys only). */\nexport function hasLabel(labels: Readonly<Record<string, string>> | undefined, key: string): boolean {\n return Boolean(labels) && Object.prototype.hasOwnProperty.call(labels, key)\n}\n\n/* ------------------------------------------------------------ provisional */\n\n/** The default label for points that are not final yet. */\nexport const DEFAULT_PROVISIONAL_LABEL = \"速報\"\n\n/**\n * Position of the first provisional point: the first entry of `indexValues`\n * that equals `from` (compared as text, so `\"2026-09\"` and a Date-less string\n * key both work). `-1` when `from` is unset or not among the values — the chart\n * then draws everything as confirmed.\n */\nexport function provisionalStart(indexValues: readonly unknown[], from: string | number | undefined | null): number {\n if (from === undefined || from === null) return -1\n const key = String(from)\n return indexValues.findIndex((value) => String(value ?? \"\") === key)\n}\n\n/**\n * Split one series at `start` (see `provisionalStart`). `confirmed` keeps the\n * points before `start`; `provisional` keeps `start` onward plus the last\n * confirmed point, so the dashed line joins the solid one. `start <= 0` or\n * `-1` leaves nothing to join (all provisional / none provisional).\n */\nexport function splitProvisional(\n values: readonly (number | null)[],\n start: number,\n): { confirmed: (number | null)[]; provisional: (number | null)[] } {\n if (start < 0) return { confirmed: [...values], provisional: values.map(() => null) }\n return {\n confirmed: values.map((v, i) => (i < start ? v : null)),\n provisional: values.map((v, i) => (i >= Math.max(0, start - 1) ? v : null)),\n }\n}\n\n","\"use client\"\n\n/**\n * AreaChart — a typed area chart over `EChart`: pass rows, the x-axis key\n * (`index`) and the series keys (`categories`) instead of an ECharts option.\n * Colours are the `--chart-1..5` tokens in fixed order (more than 5 series fold\n * into「その他」) and follow light/dark. The value axis always starts at 0.\n * Renders inside `ChartFrame` (title, summary, loading skeleton, empty state).\n * Reach for `chartOptions` — or `EChart` itself — only when this API lacks something.\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface, useChartTokens } from \"../lib/chart-theme\"\nimport {\n chartRootProps,\n aggregateSeriesKeeping,\n buildChartSummary,\n chartDataTable,\n resolveAxisFormatter,\n resolveAxisTickFormatter,\n resolveValueFormatter,\n seriesColorsWithComparison,\n} from \"../lib/chart-utils\"\nimport {\n buildCartesianOption,\n timeTooltipLabels,\n useChartSelection,\n type AreaChartOptions,\n type AreaFill,\n type CartesianChartBaseProps,\n type CartesianCurveType,\n type CartesianStackType,\n labelRows,\n} from \"../lib/chart-options\"\nimport type { ChartComparison, ChartForecast, NumericKeys } from \"../lib/types\"\n\nexport interface AreaChartProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends CartesianChartBaseProps<T> {\n /** 面グラフ固有の設定(積み上げ・線の形・塗り・欠損の扱い)。同名のフラットな props より優先。 */\n areaOptions?: AreaChartOptions\n /** 予測。最初の系列(または `forecast.category`)の続きを点線と薄い帯で描く。 */\n forecast?: ChartForecast<T>\n /**\n * 比較系列。`categories` のうち 1 つを「前年」「計画」などの比較の線にする(`vs` は KpiCard と同じ語彙)。\n * 比較系列は `--chart-*` を使わず、細い(1.5px)灰色の実線でマーカーなし・塗りなし。主系列の色は比較の有無で変わらない。\n * ツールチップは最初の主系列の行に「↑ +12.4% 前年同月比」を添え、比較系列の行は値のみ。\n * 例: `comparison={{ category: \"前年\", vs: \"prior-year\" }}`\n */\n comparison?: ChartComparison<NumericKeys<T>>\n /** @deprecated `areaOptions.type` を使う。 */\n type?: CartesianStackType\n /** @deprecated `areaOptions.curveType` を使う。 */\n curveType?: CartesianCurveType\n /** @deprecated `areaOptions.fill` を使う。 */\n fill?: AreaFill\n /** @deprecated `areaOptions.connectNulls` を使う。 */\n connectNulls?: boolean\n}\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction AreaChartImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n index,\n categories = NO_ROWS,\n colors,\n labels,\n valueFormatter,\n format,\n title,\n summary,\n actions,\n fileName,\n provisionalFrom,\n provisionalLabel,\n isLoading,\n loading,\n emptyState,\n height,\n chartOptions,\n areaOptions,\n forecast,\n comparison,\n highlight,\n target,\n targetLabel,\n annotations,\n type,\n curveType,\n fill,\n connectNulls,\n showLegend = true,\n showTooltip = true,\n showGridLines = true,\n showXAxis = true,\n showYAxis = true,\n startEndOnly = false,\n yAxisWidth,\n maxValue,\n allowDecimals = true,\n xAxisLabel,\n yAxisLabel,\n onValueChange,\n ariaLabel,\n className,\n ...rest\n }: AreaChartProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const tokens = useChartTokens()\n // Highlight labels are backed by the surface the chart sits on (a card, the page).\n const { ref: frameRef, surface, width: plotWidth } = useChartSurface(ref, tokens)\n // Ticks and on-plot labels read short (¥1億); the tooltip reads the value as `format` says.\n const tooltipFormatter = useMemo(() => resolveValueFormatter(valueFormatter, format), [valueFormatter, format])\n const axisFormatter = useMemo(() => resolveAxisFormatter(valueFormatter, format), [valueFormatter, format])\n // Ticks share one unit — the largest tick's (¥0.5億 / ¥1億).\n const axisTicks = useMemo(() => resolveAxisTickFormatter(valueFormatter, format), [valueFormatter, format])\n // The comparison series is kept out of the「その他」fold and out of the `--chart-*` order.\n const comparisonCategory = comparison && categories.includes(comparison.category) ? comparison.category : undefined\n const comparisonConfig = comparisonCategory === undefined ? undefined : comparison\n const series = useMemo(() => aggregateSeriesKeeping(data, categories, comparisonCategory), [data, categories, comparisonCategory])\n const palette = useMemo(\n () =>\n resolveChartColors(\n seriesColorsWithComparison(series.categories, colors, CHART_OTHER_COLOR, series.otherCategory, categories, comparisonCategory),\n tokens,\n ),\n [series, colors, categories, comparisonCategory, tokens],\n )\n const { active, onEvents } = useChartSelection(series.data, onValueChange, \"dot\")\n const stackType = areaOptions?.type ?? type ?? \"default\"\n const curve = areaOptions?.curveType ?? curveType ?? \"linear\"\n const areaFill = areaOptions?.fill ?? fill ?? \"gradient\"\n const joinNulls = areaOptions?.connectNulls ?? connectNulls ?? false\n const option = useMemo(\n () =>\n buildCartesianOption({\n kind: \"area\",\n data: series.data,\n index,\n categories: series.categories,\n palette,\n labels,\n valueFormatter: tooltipFormatter,\n axisFormatter,\n axisTicks,\n type: stackType,\n curveType: curve,\n fill: areaFill,\n connectNulls: joinNulls,\n showLegend,\n showTooltip,\n showGridLines,\n showXAxis,\n showYAxis,\n startEndOnly,\n yAxisWidth,\n maxValue,\n allowDecimals,\n xAxisLabel,\n yAxisLabel,\n showDots: onValueChange !== undefined,\n active,\n highlight,\n target,\n targetLabel,\n annotations,\n forecast,\n comparison: comparisonConfig,\n comparisonFormat: format,\n provisionalFrom,\n provisionalLabel,\n reserveActions: Boolean(actions),\n guideColor: tokens?.mutedForeground ?? undefined,\n labelBackground: surface,\n labelColor: tokens?.foreground ?? undefined,\n plotWidth,\n plotHeight: typeof height === \"number\" ? height : undefined,\n chartOptions,\n }),\n [\n series, index, palette, labels, tooltipFormatter, axisFormatter, axisTicks, stackType, curve, areaFill, joinNulls,\n showLegend, showTooltip, showGridLines, showXAxis, showYAxis, startEndOnly, yAxisWidth,\n maxValue, allowDecimals, xAxisLabel, yAxisLabel, onValueChange, active,\n provisionalFrom, provisionalLabel, actions, highlight, target, targetLabel, annotations, forecast, comparisonConfig, format, height, tokens, surface, plotWidth, chartOptions,\n ],\n )\n // The screen-reader table: exact values (tooltip format), dates read as dates, 「その他」 as its own column.\n const dataTable = useMemo(() => {\n const table = chartDataTable(labelRows(series.data, index, labels), index, series.categories, tooltipFormatter, labels, \"項目\")\n const times = timeTooltipLabels(series.data.map((row) => row[index]))\n return times ? { ...table, rows: table.rows.map((row, i) => [times[i] ?? row[0] ?? \"\", ...row.slice(1)]) } : table\n }, [series, index, tooltipFormatter, labels])\n const label = ariaLabel ?? `${categories.join(\"・\")}の面グラフ`\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildChartSummary({ data, index, categories, title, format, valueFormatter }) : summary),\n [summary, data, index, categories, title, format, valueFormatter],\n )\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? loading ?? false}\n isEmpty={data.length === 0}\n emptyState={emptyState}\n height={height}\n variant=\"area\"\n ariaLabel={label}\n className={className}\n dataTable={dataTable}\n >\n <EChart option={option} onEvents={onEvents} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary: resolvedSummary }} />\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `index` / `categories` / `colors` keys are checked against `data`. */\nexport const AreaChart = forwardRef(AreaChartImpl as (props: AreaChartProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: AreaChartProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nAreaChart.displayName = \"AreaChart\"\n","\"use client\"\n\n/**\n * BarChart — a typed bar chart over `EChart`: pass rows, the category key\n * (`index`) and the series keys (`categories`) instead of an ECharts option.\n * Grouped, stacked or 100%-stacked; vertical or horizontal bars. Colours are the\n * `--chart-1..5` tokens in fixed order (more than 5 series fold into「その他」)\n * and follow light/dark. The value axis always starts at 0. A horizontal bar chart of one\n * series (`barOptions.layout: \"vertical\"`) is a light tint by default, like BarList; `barOptions.highlight`\n * names the one bar the page is about, drawn in the full colour.\n * Renders inside `ChartFrame` (title, summary, loading skeleton, empty state).\n * Reach for `chartOptions` — or `EChart` itself — only when this API lacks something.\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { CHART_OTHER_COLOR, resolveChartColors, resolveFillColors, useChartSurface, useChartTokens } from \"../lib/chart-theme\"\nimport { chartFillName, chartRootProps, aggregateSeries, buildChartSummary, chartDataTable, resolveAxisFormatter, resolveAxisTickFormatter, resolveValueFormatter, seriesColorsFor } from \"../lib/chart-utils\"\nimport {\n buildCartesianOption,\n timeTooltipLabels,\n useChartSelection,\n type BarChartOptions,\n type BarLayout,\n type CartesianChartBaseProps,\n type CartesianStackType,\n labelRows,\n} from \"../lib/chart-options\"\nimport type { ChartThreshold } from \"../lib/types\"\n\nexport interface BarChartProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends CartesianChartBaseProps<T> {\n /** 棒グラフ固有の設定(積み上げ・向き・カテゴリ間の隙間)。同名のフラットな props より優先。予測は持たない。 */\n barOptions?: BarChartOptions<T>\n /**\n * 棒を値で色分けする(上から順に最初に当たった規則の意味色。棒の面なので文字用の `--<tone>` ではなく面用の `--<tone>-fill` で塗る。どれにも当たらない棒は通常色)。\n * 規則は `lt`(未満)・`lte`(以下)・`gt`(より大きい)・`gte`(以上)。複数系列(横並び)では系列ごとの棒に効き、当たった棒は意味色で塗って縁に系列色を残す(凡例と結べる)。\n * 積み上げでは無視(一部分の値は良し悪しを判定する量ではないため。系列色のまま)。\n * 例 `[{ gt: 2, tone: \"negative\" }, { gt: 1.5, tone: \"warning\" }]`(2 超は赤、1.5 超は黄)\n */\n thresholds?: ChartThreshold[]\n /** @deprecated `barOptions.type` を使う。 */\n type?: CartesianStackType\n /** @deprecated `barOptions.layout` を使う。 */\n layout?: BarLayout\n /** @deprecated `barOptions.barCategoryGap` を使う。 */\n barCategoryGap?: string | number\n}\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction BarChartImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n index,\n categories = NO_ROWS,\n colors,\n labels,\n valueFormatter,\n format,\n title,\n summary,\n actions,\n fileName,\n provisionalFrom,\n provisionalLabel,\n isLoading,\n loading,\n emptyState,\n height,\n chartOptions,\n barOptions,\n thresholds,\n highlight,\n target,\n targetLabel,\n annotations,\n type,\n layout,\n barCategoryGap,\n showLegend = true,\n showTooltip = true,\n showGridLines = true,\n showXAxis = true,\n showYAxis = true,\n startEndOnly = false,\n yAxisWidth,\n maxValue,\n allowDecimals = true,\n xAxisLabel,\n yAxisLabel,\n onValueChange,\n ariaLabel,\n className,\n ...rest\n }: BarChartProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const tokens = useChartTokens()\n // Highlight labels are backed by the surface the chart sits on (a card, the page).\n const { ref: frameRef, surface, width: plotWidth } = useChartSurface(ref, tokens)\n // Ticks and on-plot labels read short (¥1億); the tooltip reads the value as `format` says.\n const tooltipFormatter = useMemo(() => resolveValueFormatter(valueFormatter, format), [valueFormatter, format])\n const axisFormatter = useMemo(() => resolveAxisFormatter(valueFormatter, format), [valueFormatter, format])\n // Ticks share one unit — the largest tick's (¥0.5億 / ¥1億).\n const axisTicks = useMemo(() => resolveAxisTickFormatter(valueFormatter, format), [valueFormatter, format])\n const series = useMemo(() => aggregateSeries(data, categories), [data, categories])\n const palette = useMemo(\n () =>\n resolveChartColors(\n // Meaning colours on bars are AREA colours (`warning` -> `--warning-fill`), the same as the thresholds' and a legend's.\n seriesColorsFor(series.categories, colors, CHART_OTHER_COLOR, series.otherCategory, categories).map(chartFillName),\n tokens,\n ),\n [series, colors, categories, tokens],\n )\n // Resolved only when thresholds are given: they colour a single series of bars by value.\n const toneColors = useMemo(() => (thresholds?.length ? resolveFillColors(tokens) : undefined), [thresholds, tokens])\n const { active, onEvents } = useChartSelection(series.data, onValueChange, \"bar\")\n const stackType = barOptions?.type ?? type ?? \"default\"\n const barLayout = barOptions?.layout ?? layout ?? \"horizontal\"\n const gap = barOptions?.barCategoryGap ?? barCategoryGap\n const showZeroValues = barOptions?.showZeroValues ?? true\n const option = useMemo(\n () =>\n buildCartesianOption({\n kind: \"bar\",\n data: series.data,\n index,\n categories: series.categories,\n palette,\n labels,\n thresholds,\n toneColors,\n valueFormatter: tooltipFormatter,\n axisFormatter,\n axisTicks,\n type: stackType,\n layout: barLayout,\n barCategoryGap: gap,\n showZeroValues,\n showLegend,\n showTooltip,\n showGridLines,\n showXAxis,\n showYAxis,\n startEndOnly,\n yAxisWidth,\n maxValue,\n allowDecimals,\n xAxisLabel,\n yAxisLabel,\n active,\n highlight,\n provisionalFrom,\n provisionalLabel,\n reserveActions: Boolean(actions),\n target,\n targetLabel,\n targetKey: barOptions?.targetKey,\n barHighlight: barOptions?.highlight,\n annotations,\n guideColor: tokens?.mutedForeground ?? undefined,\n labelBackground: surface,\n labelColor: tokens?.foreground ?? undefined,\n plotWidth,\n plotHeight: typeof height === \"number\" ? height : undefined,\n chartOptions,\n }),\n [\n series, index, palette, labels, thresholds, toneColors, tooltipFormatter, axisFormatter, axisTicks, stackType, barLayout, gap, showZeroValues,\n showLegend, showTooltip, showGridLines, showXAxis, showYAxis, startEndOnly, yAxisWidth,\n maxValue, allowDecimals, xAxisLabel, yAxisLabel, active,\n provisionalFrom, provisionalLabel, actions, highlight, target, targetLabel, barOptions?.targetKey, barOptions?.highlight, annotations, height, tokens, surface, plotWidth, chartOptions,\n ],\n )\n // The screen-reader table: exact values (tooltip format), dates read as dates, 「その他」 as its own column.\n const dataTable = useMemo(() => {\n const table = chartDataTable(labelRows(series.data, index, labels), index, series.categories, tooltipFormatter, labels, \"項目\")\n const times = timeTooltipLabels(series.data.map((row) => row[index]))\n return times ? { ...table, rows: table.rows.map((row, i) => [times[i] ?? row[0] ?? \"\", ...row.slice(1)]) } : table\n }, [series, index, tooltipFormatter, labels])\n const label = ariaLabel ?? `${categories.join(\"・\")}の棒グラフ`\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildChartSummary({ data, index, categories, title, format, valueFormatter }) : summary),\n [summary, data, index, categories, title, format, valueFormatter],\n )\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? loading ?? false}\n isEmpty={data.length === 0}\n emptyState={emptyState}\n height={height}\n variant=\"bar\"\n ariaLabel={label}\n className={className}\n dataTable={dataTable}\n >\n <EChart option={option} onEvents={onEvents} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary: resolvedSummary }} />\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `index` / `categories` / `colors` keys are checked against `data`. */\nexport const BarChart = forwardRef(BarChartImpl as (props: BarChartProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: BarChartProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nBarChart.displayName = \"BarChart\"\n","\"use client\"\n\n/**\n * LineChart — a typed line chart over `EChart`: pass rows, the x-axis key\n * (`index`) and the series keys (`categories`) instead of an ECharts option.\n * Colours are the `--chart-1..5` tokens in fixed order (more than 5 series fold\n * into「その他」) and follow light/dark. The value axis starts at 0 unless\n * `lineOptions.fitToData`.\n * Renders inside `ChartFrame` (title, summary, loading skeleton, empty state).\n * Reach for `chartOptions` — or `EChart` itself — only when this API lacks something.\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface, useChartTokens } from \"../lib/chart-theme\"\nimport {\n chartRootProps,\n aggregateSeriesKeeping,\n buildChartSummary,\n chartDataTable,\n resolveAxisFormatter,\n resolveAxisTickFormatter,\n resolveValueFormatter,\n seriesColorsWithComparison,\n} from \"../lib/chart-utils\"\nimport {\n buildCartesianOption,\n timeTooltipLabels,\n useChartSelection,\n type CartesianChartBaseProps,\n type CartesianCurveType,\n type LineChartOptions,\n labelRows,\n} from \"../lib/chart-options\"\nimport type { ChartComparison, ChartForecast, NumericKeys } from \"../lib/types\"\n\nexport interface LineChartProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends CartesianChartBaseProps<T> {\n /** 折れ線固有の設定(線の形・欠損の扱い・値軸をデータに合わせるか・目標ラベルの位置 `targetLabelPosition`)。同名のフラットな props より優先。 */\n lineOptions?: LineChartOptions\n /** 予測。最初の系列(または `forecast.category`)の続きを点線と薄い帯で描く。 */\n forecast?: ChartForecast<T>\n /**\n * 比較系列。`categories` のうち 1 つを「前年」「計画」などの比較の線にする(`vs` は KpiCard と同じ語彙)。\n * 比較系列は `--chart-*` を使わず、細い(1.5px)灰色の実線でマーカーなし。主系列の色は比較の有無で変わらない。\n * ツールチップは最初の主系列の行に「↑ +12.4% 前年同月比」を添え、比較系列の行は値のみ。\n * 例: `comparison={{ category: \"前年\", vs: \"prior-year\" }}`\n */\n comparison?: ChartComparison<NumericKeys<T>>\n /** @deprecated `lineOptions.curveType` を使う。 */\n curveType?: CartesianCurveType\n /** @deprecated `lineOptions.connectNulls` を使う。 */\n connectNulls?: boolean\n}\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction LineChartImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n index,\n categories = NO_ROWS,\n colors,\n labels,\n valueFormatter,\n format,\n title,\n summary,\n actions,\n fileName,\n provisionalFrom,\n provisionalLabel,\n isLoading,\n loading,\n emptyState,\n height,\n chartOptions,\n lineOptions,\n forecast,\n comparison,\n highlight,\n target,\n targetLabel,\n annotations,\n curveType,\n connectNulls,\n showLegend = true,\n showTooltip = true,\n showGridLines = true,\n showXAxis = true,\n showYAxis = true,\n startEndOnly = false,\n yAxisWidth,\n minValue,\n maxValue,\n autoMinValue,\n allowDecimals = true,\n xAxisLabel,\n yAxisLabel,\n onValueChange,\n ariaLabel,\n className,\n ...rest\n }: LineChartProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const tokens = useChartTokens()\n // Highlight labels are backed by the surface the chart sits on (a card, the page).\n const { ref: frameRef, surface, width: plotWidth } = useChartSurface(ref, tokens)\n // Ticks and on-plot labels read short (¥1億); the tooltip reads the value as `format` says.\n const tooltipFormatter = useMemo(() => resolveValueFormatter(valueFormatter, format), [valueFormatter, format])\n const axisFormatter = useMemo(() => resolveAxisFormatter(valueFormatter, format), [valueFormatter, format])\n // Ticks share one unit — the largest tick's (¥0.5億 / ¥1億).\n const axisTicks = useMemo(() => resolveAxisTickFormatter(valueFormatter, format), [valueFormatter, format])\n // The comparison series is kept out of the「その他」fold and out of the `--chart-*` order.\n const comparisonCategory = comparison && categories.includes(comparison.category) ? comparison.category : undefined\n const comparisonConfig = comparisonCategory === undefined ? undefined : comparison\n const series = useMemo(() => aggregateSeriesKeeping(data, categories, comparisonCategory), [data, categories, comparisonCategory])\n const palette = useMemo(\n () =>\n resolveChartColors(\n seriesColorsWithComparison(series.categories, colors, CHART_OTHER_COLOR, series.otherCategory, categories, comparisonCategory),\n tokens,\n ),\n [series, colors, categories, comparisonCategory, tokens],\n )\n const { active, onEvents } = useChartSelection(series.data, onValueChange, \"dot\")\n const curve = lineOptions?.curveType ?? curveType ?? \"linear\"\n const joinNulls = lineOptions?.connectNulls ?? connectNulls ?? false\n const fitToData = lineOptions?.fitToData ?? autoMinValue ?? false\n const targetLabelPosition = lineOptions?.targetLabelPosition\n const option = useMemo(\n () =>\n buildCartesianOption({\n kind: \"line\",\n data: series.data,\n index,\n categories: series.categories,\n palette,\n labels,\n valueFormatter: tooltipFormatter,\n axisFormatter,\n axisTicks,\n curveType: curve,\n connectNulls: joinNulls,\n showLegend,\n showTooltip,\n showGridLines,\n showXAxis,\n showYAxis,\n startEndOnly,\n yAxisWidth,\n minValue,\n maxValue,\n fitToData,\n allowDecimals,\n xAxisLabel,\n yAxisLabel,\n showDots: onValueChange !== undefined,\n active,\n highlight,\n target,\n targetLabel,\n targetLabelPosition,\n annotations,\n forecast,\n comparison: comparisonConfig,\n comparisonFormat: format,\n provisionalFrom,\n provisionalLabel,\n reserveActions: Boolean(actions),\n guideColor: tokens?.mutedForeground ?? undefined,\n labelBackground: surface,\n labelColor: tokens?.foreground ?? undefined,\n plotWidth,\n plotHeight: typeof height === \"number\" ? height : undefined,\n chartOptions,\n }),\n [\n series, index, palette, labels, tooltipFormatter, axisFormatter, axisTicks, curve, joinNulls, fitToData, minValue,\n showLegend, showTooltip, showGridLines, showXAxis, showYAxis, startEndOnly, yAxisWidth,\n maxValue, allowDecimals, xAxisLabel, yAxisLabel, onValueChange, active,\n provisionalFrom, provisionalLabel, actions, highlight, target, targetLabel, targetLabelPosition, annotations, forecast, comparisonConfig, format, height, tokens, surface, plotWidth, chartOptions,\n ],\n )\n // The screen-reader table: exact values (tooltip format), dates read as dates, 「その他」 as its own column.\n const dataTable = useMemo(() => {\n const table = chartDataTable(labelRows(series.data, index, labels), index, series.categories, tooltipFormatter, labels, \"項目\")\n const times = timeTooltipLabels(series.data.map((row) => row[index]))\n return times ? { ...table, rows: table.rows.map((row, i) => [times[i] ?? row[0] ?? \"\", ...row.slice(1)]) } : table\n }, [series, index, tooltipFormatter, labels])\n const label = ariaLabel ?? `${categories.join(\"・\")}の折れ線グラフ`\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildChartSummary({ data, index, categories, title, format, valueFormatter }) : summary),\n [summary, data, index, categories, title, format, valueFormatter],\n )\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? loading ?? false}\n isEmpty={data.length === 0}\n emptyState={emptyState}\n height={height}\n variant=\"line\"\n ariaLabel={label}\n className={className}\n dataTable={dataTable}\n >\n <EChart option={option} onEvents={onEvents} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary: resolvedSummary }} />\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `index` / `categories` / `colors` keys are checked against `data`. */\nexport const LineChart = forwardRef(LineChartImpl as (props: LineChartProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: LineChartProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nLineChart.displayName = \"LineChart\"\n","\"use client\"\n\n/**\n * DonutChart — a typed donut / pie chart over `EChart`: pass rows, the label\n * key (`index`) and the value key (`categories: [valueKey]`). Slices are sorted\n * largest first and coloured with the `--chart-1..5` tokens in fixed order;\n * more than 5 fold into one「その他」slice. The hole is empty by default (the\n * total usually repeats a KPI); `donutOptions.centerLabel` picks `\"total\"`\n * (「合計」+ the formatted total, plus `unit`), `\"top\"` (the largest slice and its\n * share) or a custom node — plain HTML over the canvas, so it takes the page's\n * type and colours. A share is printed once: the HTML legend lists every slice\n * with its share, right of the ring when there is room, below it otherwise, and\n * with the legend there are no outside labels (without it, a plot at least\n * `DONUT_OUTSIDE_LABEL_MIN_WIDTH` wide labels its 2 largest slices).\n * Renders inside `ChartFrame` (title, summary, loading skeleton, empty state,\n * and a visually-hidden table of the slices).\n */\nimport { forwardRef, useEffect, useMemo, useState, type ForwardedRef, type ReactElement, type ReactNode, type Ref } from \"react\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartTokens } from \"../lib/chart-theme\"\nimport { chartRootProps, buildShareSummary, chartFillName, chartFillToCss, chartDataTable, donutSlices, resolveValueFormatter } from \"../lib/chart-utils\"\nimport {\n buildDonutOption,\n donutCenterText,\n donutHoleRatio,\n donutLegendItems,\n donutOutsideLabelCount,\n donutTopText,\n resolveDonutCenter,\n useChartSelection,\n type DonutChartOptions,\n type DonutVariant,\n labelOf,\n} from \"../lib/chart-options\"\nimport type { ChartCommonProps, ChartEventPayload, ChartSeriesColor } from \"../lib/types\"\n\nexport interface DonutChartProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends Omit<ChartCommonProps<T>, \"index\" | \"categories\" | \"colors\"> {\n /** 切片の名前に使う列名。 */\n index?: keyof T & string\n /** 切片の大きさに使う列名を 1 つだけ入れた配列(`[\"売上\"]`)。2 つ以上渡しても最初の 1 つだけを使う。 */\n categories?: (keyof T & string)[]\n /** 切片の色(大きい順)。`\"chart-1\"`〜`\"chart-5\"` か意味色(`\"positive\"` など。面用の `--<tone>-fill` で塗る)。省略時はトークン順。「その他」は常に灰色。 */\n colors?: ChartSeriesColor[]\n /** 切片の名前(`index` の値)→ 表示名。凡例・ツールチップ・外ラベル・データ表に反映。例 `{ organic: \"自然検索\" }`。無いキーはそのまま。データ表の列名を直すには、`index` と値のキーも渡す(`{ source: \"流入元\", sessions: \"セッション\" }`。既定は「項目」「値」)。 */\n labels?: Record<string, string>\n /** ドーナツ固有の設定(形・中央に出すもの `centerLabel`・凡例・切片の上限)。同名のフラットな props より優先。 */\n donutOptions?: DonutChartOptions\n /**\n * グラフが言っていることの 1 文要約(自由文)。`\"auto\"` なら slices から「<見出し>: 最大は <名前>(<構成比>)」を組む。\n * 順位や構成比を文に書くなら `\"auto\"` を使うか data から作る。省略時は要約なし。例: `summary=\"auto\"`\n */\n summary?: string | \"auto\"\n showTooltip?: boolean\n /** 切片のクリックで呼ばれる。同じ切片をもう一度クリックすると `null`。渡すと選択以外が薄くなる。 */\n onValueChange?: (value: ChartEventPayload) => void\n /** @deprecated `index` を使う。 */\n category?: keyof T & string\n /** @deprecated `categories={[value]}` を使う。 */\n value?: keyof T & string\n /** @deprecated `donutOptions.variant` を使う。 */\n variant?: DonutVariant\n /** @deprecated `donutOptions.centerLabel` を使う。 */\n label?: ReactNode\n /** @deprecated `donutOptions.centerLabel`(`\"none\"` で消す)を使う。 */\n showLabel?: boolean\n /** @deprecated `isLoading` を使う。 */\n loading?: boolean\n}\n\n/** The element's width, kept current (`null` until measured). */\nfunction useElementWidth(): [(el: HTMLDivElement | null) => void, number | null] {\n const [node, setNode] = useState<HTMLDivElement | null>(null)\n const [width, setWidth] = useState<number | null>(null)\n useEffect(() => {\n if (!node || typeof ResizeObserver === \"undefined\") return\n setWidth(node.getBoundingClientRect().width)\n const observer = new ResizeObserver((entries) => setWidth(entries[0]?.contentRect.width ?? null))\n observer.observe(node)\n return () => observer.disconnect()\n }, [node])\n return [setNode, width]\n}\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction DonutChartImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n index,\n categories,\n colors,\n labels,\n format,\n valueFormatter: valueFormatterProp,\n title,\n summary,\n actions,\n fileName,\n isLoading,\n loading,\n emptyState,\n height,\n chartOptions,\n donutOptions,\n showTooltip = true,\n onValueChange,\n category,\n value,\n variant,\n label,\n showLabel,\n ariaLabel,\n className,\n ...rest\n }: DonutChartProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const labelKey: string = index ?? category ?? \"\"\n const valueKey: string = categories?.[0] ?? value ?? \"\"\n const shape = donutOptions?.variant ?? variant ?? \"donut\"\n const center = resolveDonutCenter(donutOptions?.centerLabel, { showLabel: donutOptions?.showLabel ?? showLabel, label })\n const maxSlices = donutOptions?.maxSlices\n const showLegend = donutOptions?.showLegend ?? true\n const valueFormatter = useMemo(() => resolveValueFormatter(valueFormatterProp, format), [valueFormatterProp, format])\n\n const tokens = useChartTokens()\n const slices = useMemo(\n () => donutSlices(data, { index: labelKey, value: valueKey, colors, maxSlices, otherColor: CHART_OTHER_COLOR }),\n [data, labelKey, valueKey, colors, maxSlices],\n )\n const palette = useMemo(() => resolveChartColors(slices.map((s) => chartFillName(s.color)), tokens), [slices, tokens])\n const rows = useMemo(() => slices.map((s) => s.row), [slices])\n const { active, onEvents } = useChartSelection(rows, onValueChange, \"slice\")\n const [plotRef, plotWidth] = useElementWidth()\n // The legend carries every share, so outside labels (name + share) only stand in for it when it is hidden.\n const outsideLabels = donutOutsideLabelCount(plotWidth, showLegend)\n const holeRatio = donutHoleRatio(outsideLabels > 0)\n const option = useMemo(\n () =>\n buildDonutOption({\n slices,\n palette,\n labels,\n valueFormatter,\n valueName: valueKey,\n variant: shape,\n showTooltip,\n outsideLabels,\n active: active?.category ?? null,\n labelColor: tokens?.foreground ?? undefined,\n chartOptions,\n }),\n [slices, palette, labels, valueFormatter, valueKey, shape, showTooltip, outsideLabels, active, tokens, chartOptions],\n )\n const total = slices.reduce((sum, s) => sum + s.value, 0)\n const legend = useMemo(() => donutLegendItems(slices), [slices])\n // Sized off the hole (cqmin of the plot): the small caption above, the big figure, the unit small below.\n const hole = holeRatio * 100\n const captionStyle = { fontSize: `clamp(10px, ${hole * 0.1}cqmin, 14px)` }\n const figureStyle = { fontSize: `clamp(14px, ${hole * 0.22}cqmin, 32px)` }\n const caption = (label: string, amount: string, unit?: string) => (\n <span className=\"flex flex-col items-center gap-[0.15em] whitespace-nowrap\">\n <span className=\"max-w-full truncate font-normal text-muted-foreground\" style={captionStyle}>\n {label}\n </span>\n <span className=\"leading-none\" style={figureStyle}>\n {amount}\n </span>\n {unit && (\n <span className=\"font-normal text-muted-foreground\" style={captionStyle}>\n {unit}\n </span>\n )}\n </span>\n )\n let centerLabel: ReactNode = null\n if (center.kind === \"custom\") centerLabel = center.node\n else if (center.kind === \"total\") {\n const text = donutCenterText(total, valueFormatter, { totalLabel: donutOptions?.totalLabel, unit: donutOptions?.unit })\n centerLabel = caption(text.label, text.amount, text.unit)\n } else if (center.kind === \"top\") {\n const top = donutTopText(slices, labels)\n centerLabel = top && caption(top.label, top.amount)\n }\n // Built from the slices (names and shares), not the column keys.\n const a11yLabel =\n ariaLabel ?? `構成比のドーナツグラフ(${legend.map((item) => `${labelOf(item.name, labels)} ${item.share}`).join(\"、\")})`\n const dataTable = useMemo(\n () =>\n chartDataTable(\n // Fixed keys, so `labels` (which renames the rows) cannot collide with the column names.\n rows.map((row) => ({ name: labelOf(String(row[labelKey] ?? \"\"), labels), value: row[valueKey] })),\n \"name\",\n [\"value\"],\n valueFormatter,\n { name: labels?.[labelKey] ?? \"項目\", value: labels?.[valueKey] ?? \"値\" },\n ),\n [rows, labelKey, valueKey, valueFormatter, labels],\n )\n\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildShareSummary(slices, title) : summary),\n [summary, slices, title],\n )\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={ref}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? loading ?? false}\n isEmpty={data.length === 0}\n emptyState={emptyState}\n height={height}\n variant=\"donut\"\n ariaLabel={a11yLabel}\n dataTable={dataTable}\n className={className}\n >\n <div data-slot=\"donut-chart\" className=\"@container/donut h-full w-full\">\n <div className=\"flex h-full w-full flex-col gap-3 @md/donut:flex-row @md/donut:items-center\">\n {/* A size container, so the center label can be sized in `cqmin` against the ring. */}\n <div ref={plotRef} className=\"relative min-h-0 min-w-0 flex-1 @md/donut:h-full\" style={{ containerType: \"size\" }}>\n <EChart option={option} onEvents={onEvents} height=\"100%\" ariaLabel={a11yLabel} actions={actions} fileName={fileName} exportHeader={{ title, summary: resolvedSummary }} />\n {shape === \"donut\" && centerLabel !== null && centerLabel !== false && (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n {/* A box inscribed in the hole: never wider than the ring's inside, text never wraps mid-word. */}\n <div\n data-slot=\"donut-chart-label\"\n className=\"flex items-center justify-center overflow-hidden text-center leading-tight font-semibold whitespace-nowrap text-foreground tabular-nums\"\n style={{ width: `${hole * 0.78}cqmin`, height: `${hole * 0.78}cqmin` }}\n >\n {centerLabel}\n </div>\n </div>\n )}\n </div>\n {showLegend && legend.length > 0 && (\n <ul\n data-slot=\"donut-chart-legend\"\n className=\"flex shrink-0 flex-wrap gap-x-4 gap-y-1 text-xs @md/donut:w-44 @md/donut:flex-col @md/donut:flex-nowrap\"\n >\n {legend.map((item) => (\n <li key={item.slice} data-slot=\"donut-chart-legend-item\" className=\"flex min-w-0 items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"size-2.5 shrink-0 rounded-[2px]\"\n style={{ background: chartFillToCss(slices[item.slice]!.color) }}\n />\n <span className=\"min-w-0 truncate text-muted-foreground\">{labelOf(item.name, labels)}</span>\n <span className=\"ml-auto pl-2 font-medium text-foreground tabular-nums\">{item.share}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `index` / `categories` keys are checked against `data`. */\nexport const DonutChart = forwardRef(DonutChartImpl as (props: DonutChartProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: DonutChartProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nDonutChart.displayName = \"DonutChart\"\n","\"use client\"\n\n/**\n * BarList — a ranked list of horizontal bars with the value at the end of each\n * row: top pages, sales by store, error counts by type. Plain HTML/CSS (no\n * ECharts), so it stays cheap inside cards and follows the theme natively.\n *\n * Pass rows plus the name key (`index`) and the value key (`categories: [valueKey]`),\n * or the legacy `{ name, value, href?, color? }` items. More than\n * `barListOptions.maxItems` (5) rows fold into one「その他」row; rows named in\n * `barListOptions.exclude` always do (outside the ranking). Every row is\n * painted the same light tint of the colour (rank is the bar's length; `highlight` names the one\n * row drawn in the full colour),「その他」\n * in the subdued other colour; `barListOptions.showShare` adds each row's share\n * of the total after its value (「¥8,240万 · 43%」). Always renders in `ChartFrame` (title, summary,\n * loading / empty states, a visually-hidden table); the list is as tall as its rows.\n */\nimport {\n forwardRef,\n useEffect,\n useState,\n type ComponentProps,\n type ForwardedRef,\n type ReactElement,\n type Ref,\n} from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { ChartFrame } from \"./chart-frame\"\nimport { CHART_OTHER_COLOR } from \"../lib/chart-theme\"\nimport {\n barListFills,\n chartFillToCss,\n barListRows,\n barListValueTexts,\n barListWidths,\n chartDataTable,\n MAX_CHART_SERIES,\n resolveValueFormatter,\n type BarListOptions,\n type BarListSortOrder,\n} from \"../lib/chart-utils\"\nimport { labelOf } from \"../lib/chart-options\"\nimport { toneForValue } from \"../lib/comparison\"\nimport type { ChartColor, ChartCommonProps, ChartSeriesColor, ChartThreshold } from \"../lib/types\"\n\nexport interface BarListItem {\n /** React の key。省略時は `name`。 */\n key?: string\n /** 行のラベル(バーの上に出る)。 */\n name: string\n value: number\n /** 渡すとラベルがリンクになる。 */\n href?: string\n /** @deprecated この行だけ色を変える。`colors` を使う(行ごとの色は持たない)。 */\n color?: ChartColor\n}\n\nexport interface BarListProps<T extends object = BarListItem>\n extends Omit<ComponentProps<\"div\">, \"children\" | \"title\" | \"color\">,\n Pick<ChartCommonProps, \"format\" | \"valueFormatter\" | \"title\" | \"summary\" | \"isLoading\" | \"emptyState\"> {\n /** 行の配列。`index` / `categories` を省くと `{ name, value, href? }` の形として読む。 */\n data: T[]\n /** 行の名前に使う列名。既定 `\"name\"`。 */\n index?: keyof T & string\n /** 値に使う列名を 1 つだけ入れた配列(`[\"売上\"]`)。最初の 1 つだけを使う。既定 `[\"value\"]`。 */\n categories?: (keyof T & string)[]\n /** バーの色(`\"chart-1\"`〜`\"chart-5\"` か意味色、最初の 1 つだけを使う)。既定 `\"chart-1\"`。全行を同じ淡い色で塗る(順位はバーの長さで読む)。 */\n colors?: ChartSeriesColor | ChartSeriesColor[]\n /** 行の名前(`index` の値)→ 表示名。行のラベル・データ表に反映。例 `{ tokyo: \"東京店\" }`。無いキーはそのまま。データ表の列名を直すには、列のキーも渡す(`{ store: \"店舗\", sales: \"売上\" }`。既定は「項目」「値」)。 */\n labels?: Record<string, string>\n /** 行の値で意味色に塗り分ける(最初に当たった規則。どれにも当たらない行は通常色)。例 `[{ lt: 40, tone: \"negative\" }, { lt: 70, tone: \"warning\" }]` */\n thresholds?: ChartThreshold[]\n /** 伝えたい 1 行。`index` の値(行の名前。例 `\"東京店\"`)で渡す。行は淡い色が既定で、この 1 行だけ濃い色(`colors` の色そのまま)になる。省略すると全部が淡い色。「その他」は選べない。 */\n highlight?: string\n /** BarList 固有の設定(並べ順・行数の上限・「その他」のラベル・順位から外す行 `exclude`・値の横の構成比 `showShare`)。同名のフラットな props より優先。 */\n barListOptions?: BarListOptions\n /** 渡すと行がボタンになり、クリックした行を受け取る(「その他」の行は押せない)。 */\n onValueChange?: (item: T) => void\n /**\n * 行の並べ順(`\"descending\"` / `\"ascending\"` / `\"none\"`)。既定 `\"descending\"`。\n * @deprecated `barListOptions.sortOrder` を使う(両方あれば `barListOptions` が優先)。\n */\n sortOrder?: BarListSortOrder\n /** @deprecated `colors` を使う。 */\n color?: ChartColor\n /** @deprecated マウント時にバーを伸ばす。入場アニメーションは既定で持たない。 */\n showAnimation?: boolean\n /** @deprecated `valueFormatter` か `format` を使う。 */\n formatValue?: (value: number) => string\n ariaLabel?: string\n}\n\n/** Row height (h-8) + gap (space-y-1.5): the skeleton / empty height for `n` rows. */\nconst listHeight = (n: number) => n * 32 + Math.max(0, n - 1) * 6\n\nconst isExternal = (href: string) => /^https?:\\/\\//.test(href)\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction BarListImpl<T extends object>(\n {\n data = NO_ROWS,\n index,\n categories,\n colors,\n labels,\n thresholds,\n highlight,\n format,\n valueFormatter,\n formatValue,\n title,\n summary,\n isLoading = false,\n emptyState,\n barListOptions,\n sortOrder,\n color,\n showAnimation = false,\n onValueChange,\n ariaLabel,\n className,\n ...props\n }: BarListProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const [mounted, setMounted] = useState(!showAnimation)\n useEffect(() => {\n if (!showAnimation) return\n const frame = requestAnimationFrame(() => setMounted(true))\n return () => cancelAnimationFrame(frame)\n }, [showAnimation])\n\n const maxItems = barListOptions?.maxItems ?? MAX_CHART_SERIES\n const token = Array.isArray(colors) ? colors[0] : colors\n const barColor = token ?? color ?? \"chart-1\"\n\n const formatter = resolveValueFormatter(valueFormatter ?? formatValue, format)\n const baseRows = barListRows(data, {\n index,\n category: categories?.[0],\n sortOrder: barListOptions?.sortOrder ?? sortOrder ?? \"descending\",\n maxItems,\n otherLabel: barListOptions?.otherLabel,\n exclude: barListOptions?.exclude,\n })\n const rows = baseRows.map((row) => {\n if (row.isOther) return row\n const tone = toneForValue(row.value, thresholds)\n return { ...row, name: labelOf(row.name, labels), ...(tone ? { color: tone } : {}) }\n })\n const widths = barListWidths(rows.map((row) => row.value))\n const fills = barListFills(rows, barColor, CHART_OTHER_COLOR).map((fill, i) =>\n highlight !== undefined && !rows[i]!.isOther && baseRows[i]!.name === highlight ? chartFillToCss(rows[i]!.color ?? barColor) : fill,\n )\n const valueTexts = barListValueTexts(rows.map((row) => row.value), formatter, barListOptions?.showShare ?? false)\n const ready = !isLoading && data.length > 0\n const dataTable = chartDataTable(\n rows.map((row) => ({ name: row.name, value: row.value })),\n \"name\",\n [\"value\"],\n formatter,\n { name: (index && labels?.[index]) || \"項目\", value: (categories?.[0] && labels?.[categories[0]]) || \"値\" },\n )\n\n const list = (\n <div data-slot=\"bar-list\" className=\"flex justify-between gap-6 text-sm\" {...props}>\n <div className=\"relative min-w-0 flex-1 space-y-1.5\">\n {rows.map((row, i) => {\n const fill = fills[i]\n const label =\n row.href && !row.isOther && !(onValueChange && row.row) ? (\n <a\n href={row.href}\n target={isExternal(row.href) ? \"_blank\" : undefined}\n rel={isExternal(row.href) ? \"noreferrer\" : undefined}\n onClick={(event) => event.stopPropagation()}\n className=\"truncate hover:underline\"\n >\n {row.name}\n </a>\n ) : (\n <span className=\"truncate\">{row.name}</span>\n )\n const content = (\n <>\n <span\n aria-hidden=\"true\"\n data-slot=\"bar-list-bar\"\n className=\"absolute inset-y-0 left-0 rounded-sm transition-[width] duration-300 ease-out motion-reduce:transition-none\"\n style={{ width: `${mounted ? widths[i] : 0}%`, background: fill }}\n />\n <span className=\"relative flex min-w-0 items-center px-2 text-foreground\">{label}</span>\n </>\n )\n const rowClass = \"relative flex h-8 w-full items-center rounded-sm\"\n return onValueChange && row.row ? (\n <button\n key={row.key}\n type=\"button\"\n data-slot=\"bar-list-row\"\n onClick={() => onValueChange(row.row as T)}\n className={cn(\n rowClass,\n \"text-left outline-none hover:bg-muted/60 focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n {content}\n </button>\n ) : (\n <div key={row.key} data-slot=\"bar-list-row\" data-other={row.isOther || undefined} className={rowClass}>\n {content}\n </div>\n )\n })}\n </div>\n <div className=\"shrink-0 space-y-1.5 text-right\">\n {rows.map((row, i) => (\n <div key={row.key} className=\"flex h-8 items-center justify-end font-medium text-foreground tabular-nums\">\n {valueTexts[i]!.value}\n {valueTexts[i]!.share && (\n <span data-slot=\"bar-list-share\" className=\"font-normal whitespace-pre text-muted-foreground\">\n {\" · \"}\n {valueTexts[i]!.share}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n )\n\n return (\n <ChartFrame\n ref={ref}\n title={title}\n summary={summary}\n isLoading={isLoading}\n isEmpty={data.length === 0}\n emptyState={emptyState}\n // Loading / empty keep the height of the rows to come; the list itself is as tall as its rows.\n height={ready ? \"auto\" : listHeight(Math.max(1, Math.min(maxItems, MAX_CHART_SERIES)))}\n variant=\"list\"\n ariaLabel={ariaLabel}\n plotRole=\"group\"\n dataTable={dataTable}\n className={className}\n >\n {list}\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `index` / `categories` keys are checked against `data`. */\nexport const BarList = forwardRef(BarListImpl as (props: BarListProps<object>, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends object = BarListItem,\n>(\n props: BarListProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nBarList.displayName = \"BarList\"\n","\"use client\"\n\n/**\n * CategoryBar — one bar split into coloured segments by `values`, with the\n * running totals underneath and an optional marker: a score against bands\n * (要改善 / 標準 / 良好), budget consumption, a share breakdown. Plain HTML/CSS.\n */\nimport { forwardRef, useMemo, type ComponentProps } from \"react\"\n\nimport { useChartSurface } from \"../lib/chart-theme\"\nimport { cn } from \"../lib/utils\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\"\nimport {\n categoryBarFitLabels,\n categoryBarLabels,\n categoryBarMarkerPosition,\n categoryBarMarkerSegment,\n categoryBarSegments,\n chartColorAt,\n chartFillToCss,\n resolveAxisFormatter,\n} from \"../lib/chart-utils\"\nimport type { ValueFormat } from \"../lib/format\"\nimport type { ChartColor, ValueFormatter } from \"../lib/types\"\n\nexport interface CategoryBarMarker {\n /** マーカーの位置(`values` の合計と同じ尺度)。 */\n value: number\n /** ホバーで出す説明。 */\n tooltip?: string\n /** 位置の変化をアニメーションする。既定 `false`(`prefers-reduced-motion` では常に無効)。 */\n showAnimation?: boolean\n}\n\nexport interface CategoryBarProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n /** 各区間の幅(相対値)。合計が 100 である必要はない。負の値は 0 扱い。 */\n values: number[]\n /** 区間の色(順に対応)。`\"chart-1\"`〜`\"chart-5\"`・意味色(`\"positive\"` など。面用の `--<tone>-fill` で塗る)・CSS カラー。省略時はトークン順。 */\n colors?: ChartColor[]\n marker?: CategoryBarMarker\n /** バーの上に区切りの累計値を出す。既定 `true`。 */\n showLabels?: boolean\n /**\n * 区切りの数値の書式(`\"compact\"` / `\"currency\"` / `{ type, currency }`)。他のグラフの\n * 軸と同じ短縮形で出す(`\"currency\"` → `¥780万`)。既定 `\"compact\"`。\n */\n format?: ValueFormat\n /** 書式を関数で直接渡す逃げ道。`format` より優先する。 */\n valueFormatter?: ValueFormatter\n}\n\n/** Values not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nexport const CategoryBar = forwardRef<HTMLDivElement, CategoryBarProps>(function CategoryBar(\n { values = NO_ROWS, colors, marker, showLabels = true, format, valueFormatter: valueFormatterProp, className, ...props },\n forwardedRef,\n) {\n // The bar's width thins the running totals that would print over each other.\n const { ref, width } = useChartSurface(forwardedRef, null)\n const valueFormatter = useMemo(() => resolveAxisFormatter(valueFormatterProp, format), [valueFormatterProp, format])\n const segments = categoryBarSegments(values)\n const markerPosition = marker ? categoryBarMarkerPosition(marker.value, values) : 0\n const allLabels = showLabels ? categoryBarLabels(values, undefined, marker ? markerPosition : undefined) : []\n const labels = width\n ? categoryBarFitLabels(allLabels, allLabels.map((label) => valueFormatter(label.value)), width)\n : allLabels\n const markerColor = marker ? chartFillToCss(chartColorAt(colors, categoryBarMarkerSegment(marker.value, values))) : \"\"\n\n const markerDot = (\n <span\n className=\"block h-4 w-1 rounded-full ring-2 ring-background\"\n style={{ background: markerColor }}\n />\n )\n\n return (\n <div ref={ref} data-slot=\"category-bar\" className={cn(\"w-full\", className)} {...props}>\n {showLabels && labels.length > 0 && (\n <div data-slot=\"category-bar-labels\" className=\"relative mb-2 h-4 text-xs text-muted-foreground tabular-nums\">\n {labels.map((label, i) => (\n <span\n key={i}\n className={cn(\n \"absolute top-0\",\n label.position <= 0 ? \"left-0\" : label.position >= 100 ? \"right-0\" : \"-translate-x-1/2\",\n )}\n style={label.position > 0 && label.position < 100 ? { left: `${label.position}%` } : undefined}\n >\n {valueFormatter(label.value)}\n </span>\n ))}\n </div>\n )}\n <div className=\"relative flex h-2 w-full items-center\">\n <div className=\"flex h-full w-full gap-0.5 overflow-hidden rounded-full\">\n {segments.map((segment, i) =>\n segment.width > 0 ? (\n <span\n key={i}\n data-slot=\"category-bar-segment\"\n className=\"h-full\"\n style={{ flex: `${segment.width} 1 0%`, background: chartFillToCss(chartColorAt(colors, i)) }}\n />\n ) : null,\n )}\n </div>\n {marker && (\n <div\n data-slot=\"category-bar-marker\"\n className={cn(\n \"absolute -translate-x-1/2\",\n marker.showAnimation && \"transition-[left] duration-700 ease-out motion-reduce:transition-none\",\n )}\n style={{ left: `${markerPosition}%` }}\n >\n {marker.tooltip ? (\n <Tooltip>\n <TooltipTrigger render={<span aria-label={marker.tooltip} className=\"block py-1\" />}>\n {markerDot}\n </TooltipTrigger>\n <TooltipContent>{marker.tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n markerDot\n )}\n </div>\n )}\n </div>\n </div>\n )\n})\nCategoryBar.displayName = \"CategoryBar\"\n","\"use client\"\n\n/**\n * ProgressCircle — a ring that fills to `value / max`, with anything you pass\n * as children in the middle (usually the percentage). Plain SVG, coloured by\n * a chart token, so a row of them in KPI tiles stays light.\n */\nimport { forwardRef, useEffect, useState, type ComponentProps } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { chartFillToCss, progressCircleGeometry, tintCss } from \"../lib/chart-utils\"\nimport type { ChartColor } from \"../lib/types\"\n\nexport interface ProgressCircleProps extends ComponentProps<\"div\"> {\n /** 現在値。`0`〜`max` に丸める。 */\n value?: number\n /** 満タンの値。既定 `100`。 */\n max?: number\n /** 外側の半径(px)。既定 `32`(64px 四方)。 */\n radius?: number\n /** 線の太さ(px)。既定 `6`。 */\n strokeWidth?: number\n /** 色。`\"chart-1\"`〜`\"chart-5\"`・意味色(`\"positive\"` など。面用の `--<tone>-fill` で塗る)・CSS カラー。既定 `\"chart-1\"`。地のリングは同じ色を淡くしたもの。 */\n color?: ChartColor\n /** マウント時と値の変化をアニメーションする。既定 `false`(`prefers-reduced-motion` では常に無効)。 */\n showAnimation?: boolean\n}\n\nexport const ProgressCircle = forwardRef<HTMLDivElement, ProgressCircleProps>(function ProgressCircle(\n {\n value = 0,\n max = 100,\n radius = 32,\n strokeWidth = 6,\n color = \"chart-1\",\n showAnimation = false,\n className,\n children,\n ...props\n },\n ref,\n) {\n const [mounted, setMounted] = useState(!showAnimation)\n useEffect(() => {\n if (!showAnimation) return\n const frame = requestAnimationFrame(() => setMounted(true))\n return () => cancelAnimationFrame(frame)\n }, [showAnimation])\n\n const { size, normalizedRadius, circumference, offset, ratio } = progressCircleGeometry(value, max, radius, strokeWidth)\n const css = chartFillToCss(color)\n\n return (\n <div\n ref={ref}\n data-slot=\"progress-circle\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n className={cn(\"relative inline-flex shrink-0 items-center justify-center\", className)}\n style={{ width: size, height: size }}\n {...props}\n >\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} className=\"-rotate-90\" aria-hidden=\"true\">\n <circle\n cx={radius}\n cy={radius}\n r={normalizedRadius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n style={{ stroke: tintCss(css, 20) }}\n />\n {ratio > 0 && (\n <circle\n data-slot=\"progress-circle-value\"\n cx={radius}\n cy={radius}\n r={normalizedRadius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={`${circumference} ${circumference}`}\n strokeDashoffset={mounted ? offset : circumference}\n className={cn(showAnimation && \"transition-[stroke-dashoffset] duration-700 ease-out motion-reduce:transition-none\")}\n style={{ stroke: css }}\n />\n )}\n </svg>\n {children != null && (\n <div className=\"absolute inset-0 flex items-center justify-center text-sm font-medium text-foreground tabular-nums\">\n {children}\n </div>\n )}\n </div>\n )\n})\nProgressCircle.displayName = \"ProgressCircle\"\n","\"use client\"\n\n/**\n * Tracker — a row of small blocks, one per period, each coloured by status:\n * uptime per day, batch-job results, daily target hit/miss. Hover a block to\n * see its tooltip. Plain HTML/CSS. Block colours are AREA colours: the meaning names\n * (`\"positive\"` / `\"negative\"` / `\"warning\"` / `\"info\"`) resolve to the `--<tone>-fill`\n * tokens (same strength in light and dark), not the text colours `--<tone>`. The colour\n * never carries the meaning alone: put the date and the state in `tooltip`\n * (also the block's accessible name).\n */\nimport { forwardRef, type ComponentProps } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\"\nimport { chartFillToCss } from \"../lib/chart-utils\"\nimport type { ChartColor } from \"../lib/types\"\n\nexport interface TrackerBlock {\n /** React の key。省略時は位置。 */\n key?: string | number\n /** ブロックの色。`\"positive\"` / `\"negative\"` / `\"warning\"` / `\"info\"`(面用の `--<tone>-fill`)、`\"chart-1\"`〜`\"chart-5\"`、CSS カラー。省略時は `defaultColor`。 */\n color?: ChartColor\n /** ホバーで出す説明。日付と状態・件数を入れる(例: `\"10/12 失敗 3 件\"`)。ブロックの accessible name にもなる。 */\n tooltip?: string\n}\n\nexport interface TrackerProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n data: TrackerBlock[]\n /** `color` の無いブロックの色。既定は muted-foreground を淡くした灰色。 */\n defaultColor?: ChartColor\n /** ホバー中のブロックを薄くする。既定 `true`。 */\n hoverEffect?: boolean\n}\n\nconst DEFAULT_BLOCK_COLOR = \"color-mix(in oklab, var(--muted-foreground) 35%, transparent)\"\n\n/** A block colour as CSS: the meaning names are the area (`-fill`) tokens, anything else as for the other charts. */\nfunction blockColorToCss(color: ChartColor): string {\n return chartFillToCss(color)\n}\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nexport const Tracker = forwardRef<HTMLDivElement, TrackerProps>(function Tracker(\n { data = NO_ROWS, defaultColor, hoverEffect = true, className, ...props },\n ref,\n) {\n const fallback = defaultColor ? blockColorToCss(defaultColor) : DEFAULT_BLOCK_COLOR\n return (\n <div ref={ref} data-slot=\"tracker\" className={cn(\"flex h-6 w-full gap-0.5\", className)} {...props}>\n {data.map((block, i) => {\n const blockClass = cn(\n \"h-full min-w-0 flex-1 rounded-[2px]\",\n hoverEffect && \"transition-opacity hover:opacity-60 motion-reduce:transition-none\",\n )\n const style = { background: block.color ? blockColorToCss(block.color) : fallback }\n return block.tooltip ? (\n <Tooltip key={block.key ?? i}>\n <TooltipTrigger\n delay={0}\n render={<div data-slot=\"tracker-block\" role=\"img\" tabIndex={0} aria-label={block.tooltip} className={blockClass} style={style} />}\n />\n <TooltipContent>{block.tooltip}</TooltipContent>\n </Tooltip>\n ) : (\n <div key={block.key ?? i} data-slot=\"tracker-block\" className={blockClass} style={style} />\n )\n })}\n </div>\n )\n})\nTracker.displayName = \"Tracker\"\n","\"use client\"\n\n/**\n * WaterfallChart — a typed waterfall chart over `EChart`: pass the steps as rows,\n * the name key (`index`) and the amount key (`categories: [valueKey]`) instead of\n * an ECharts option. 売上 → 原価 → 粗利 の内訳、前期からの増減要因。\n *\n * Each row is a step that moves the running total by its value; rows named in\n * `totals` are totals — a bar from 0 to the running total (or to their own value\n * when they carry one). The bars are a stacked bar chart over a transparent base,\n * so the value axis always starts at 0. Increase / decrease bars use the\n * area tokens (`--positive-fill` / `--negative-fill`, swapped by `polarity`), totals are\n * `--chart-1`; every step also prints its signed amount (+ / -), so the colour is\n * never the only carrier of the direction. Missing values (null) draw no bar and read「—」.\n * `mode=\"delta\"` draws only the moves: the axis is the cumulative change from 0 (the start),\n * totals are not bars (their numbers go in a note above the plot), so a small change against\n * a large total is not a hairline on a tall axis; the axis still starts at 0 and can go negative.\n * A closing「純増」bar (the net change, `--chart-1`, signed) is appended in `delta`. Value-axis ticks carry no \"+\" in\n * both modes; the sign is on the bar labels only.\n * Renders inside `ChartFrame` (title, summary, loading skeleton, empty state, and\n * a visually-hidden table of the steps).\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\nimport { use } from \"echarts/core\"\nimport { GraphicComponent } from \"echarts/components\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { resolveChartColors, resolveFillColors, useChartSurface, useChartTokens } from \"../lib/chart-theme\"\nimport {\n chartMotion,\n escapeHtml,\n estimateTextWidth,\n labelOf,\n mergeChartOptions,\n valueAxisLimits,\n withAlpha,\n} from \"../lib/chart-options\"\nimport { chartRootProps, resolveAxisFormatter, resolveValueFormatter, toChartNumber, type ChartDataTable } from \"../lib/chart-utils\"\nimport type { Polarity } from \"../lib/comparison\"\nimport { EMPTY_VALUE, MINUS_SIGN } from \"../lib/format\"\nimport type { ChartCommonProps, NumericKeys, ValueFormatter } from \"../lib/types\"\n\n// The delta note is a `graphic` text, which `EChart` does not register for the other charts.\nuse([GraphicComponent])\n\n/**\n * `\"total\"`: 合計の段を 0 からの棒として描く(既定)。`\"delta\"`: 増減の段だけを描く(開始を 0 とした累計増減の軸)。\n */\nexport type WaterfallMode = \"total\" | \"delta\"\n\nexport interface WaterfallChartProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends Omit<ChartCommonProps<T>, \"index\" | \"categories\" | \"colors\" | \"summary\"> {\n /** 段の名前に使う列名。行の並びがそのままグラフの左から右の順。 */\n index: keyof T & string\n /** 増減額(合計の行は合計値)の列名を 1 つだけ入れた配列(`[\"金額\"]`)。2 つ以上渡しても最初の 1 つだけを使う。値は number か数値文字列。 */\n categories: NumericKeys<T>[]\n /**\n * 合計の段にする行の `index` の値(例 `[\"売上\", \"粗利\"]`)。合計の段は 0 から累計まで届く棒で、色は `--chart-1`。\n * 合計の行の値が null なら直前までの累計になる(計算に任せるのが確実)。値があればその値が合計になり、以降の累計はそこから続く。\n * 最初の段が増減の行なら 0 から始まる。`mode=\"delta\"` では棒にならず、先頭の行が「開始」、末尾の行が「終了」の注記になる。\n */\n totals?: string[]\n /**\n * 増えるのが良いか。`\"higher-is-better\"`(既定)は増加が `--positive-fill`・減少が `--negative-fill`(棒用の面のトークン)。\n * 解約数のように増えて悪い指標は `\"lower-is-better\"` で色が入れ替わる。`\"neutral\"` は増減とも `--neutral-fill`(符号は付く)。\n */\n polarity?: Polarity\n /**\n * 描き方。`\"total\"`(既定)は合計の段を 0 からの棒で描く。\n * `\"delta\"` は開始を 0 とした累計増減の軸で増減の段だけを描き、`totals` の行は棒にせず、\n * 開始・終了の値は図の上の注記(と要約・データ表)に出し、末尾に「純増」棒(増減の合計。`--chart-1`、符号つき)を足す。値軸の目盛に `+` は付かない。合計に対して増減が小さい(目安: 総額の 5% 未満)ときに使う。\n * 軸は 0 起点のまま(累計が負になる段も 0 の下に描く)。例 `mode=\"delta\"`\n */\n mode?: WaterfallMode\n /** 段の名前(`index` の値)→ 表示名。軸・ツールチップ・データ表に反映。例 `{ cogs: \"売上原価\" }`。無いキーはそのまま。データ表の先頭列名を直すには `index` のキーも渡す(既定は「項目」)。 */\n labels?: Record<string, string>\n /**\n * 縦軸の下限。軸は常に 0 を含むので、0 以下の値だけ有効(累計が負になる段の下に余白を取る。正の値は無視)。\n * データが下限を下回るときは軸を広げる(切り詰めない)。`mode=\"total\"` / `\"delta\"` の両方で効く。\n * 部署別などを並べて比べるときは、全部のグラフに同じ `minValue` / `maxValue` を渡して縦軸をそろえる。\n */\n minValue?: number\n /**\n * 縦軸の上限。データが上限を超えるときは軸を広げる(切り詰めない)。`mode=\"total\"` / `\"delta\"` の両方で効く。\n * 並べて比べるときは、全部のグラフに同じ `minValue` / `maxValue` を渡して縦軸をそろえる。\n */\n maxValue?: number\n /** y 軸ラベルの幅(px)。並べた複数グラフのプロット領域を揃えたいときに固定する。 */\n yAxisWidth?: number\n /** 各棒に符号つきの増減額(合計は累計)を書く。既定 `true`。 */\n showValues?: boolean\n /** ホバー時のツールチップ(増減と累計)を出す。既定 `true`。 */\n showTooltip?: boolean\n /**\n * グラフが言っていることの 1 文要約(自由文)。`\"auto\"` なら steps から「<見出し>: <最初> <値> → <最後> <値>。最大の増加は …、最大の減少は …」を組む(`mode=\"delta\"` は「<開始> <値> → <終了> <値>(<増減>)」)。\n * 省略時は要約なし。例: `summary=\"auto\"`\n */\n summary?: string | \"auto\"\n /** 見出しが無いときのプロット領域の読み上げ名。省略時は「<金額の列>のウォーターフォールチャート」。 */\n ariaLabel?: string\n}\n\n/* ------------------------------------------------------------------ model */\n\nexport type WaterfallKind = \"total\" | \"increase\" | \"decrease\" | \"flat\" | \"gap\"\n\nexport interface WaterfallStep {\n name: string\n kind: WaterfallKind\n /** A step's signed change, a total's value. `null` for a gap. */\n value: number | null\n /** The running total before this step (a total starts at 0). */\n start: number\n /** The running total after this step. */\n end: number\n row: Record<string, unknown>\n}\n\n/**\n * Rows → steps. A row named in `totals` is a total: it spans 0 → its own value,\n * or 0 → the running total when the value is missing. Every other row moves the\n * running total by its value; a missing value moves nothing (a gap).\n */\nexport function waterfallSteps(\n data: readonly Record<string, unknown>[],\n config: { index: string; value: string; totals?: readonly string[]; mode?: WaterfallMode },\n): WaterfallStep[] {\n const totals = new Set(config.totals ?? [])\n const delta = config.mode === \"delta\"\n let running = 0\n // `delta`: totals are not steps (they neither draw nor move the running change), so only the moves remain.\n const steps = (delta ? data.filter((row) => !totals.has(String(row[config.index] ?? \"\"))) : data).map((row) => {\n const name = String(row[config.index] ?? \"\")\n const n = config.value ? toChartNumber(row[config.value]) : null\n if (totals.has(name)) {\n const end = n ?? running\n running = end\n return { name, kind: \"total\" as const, value: end, start: 0, end, row }\n }\n if (n === null) return { name, kind: \"gap\" as const, value: null, start: running, end: running, row }\n const start = running\n running = start + n\n return { name, kind: n > 0 ? (\"increase\" as const) : n < 0 ? (\"decrease\" as const) : (\"flat\" as const), value: n, start, end: running, row }\n })\n // `delta`: the net change closes the plot as a total bar from 0 (series colour 1), so the moves add up to something.\n if (delta && steps.some((s) => s.kind !== \"gap\")) {\n steps.push({ name: DELTA_TOTAL_NAME, kind: \"total\", value: running, start: 0, end: running, row: {} })\n }\n return steps\n}\n\n/** The name of the net-change bar that `mode=\"delta\"` appends. */\nexport const DELTA_TOTAL_NAME = \"純増\"\n\n/** What `mode=\"delta\"` leaves out of the bars: the opening / closing totals and the net change of the moves. */\nexport interface WaterfallDeltaEnds {\n /** The first total row when it comes before every move (its value, `null` when the row carries none). */\n opening: { name: string; value: number | null } | null\n /** The last total row when it comes after every move; a missing value is the opening plus the net change. */\n closing: { name: string; value: number | null } | null\n /** The sum of every move (the cumulative change at the last step). */\n net: number\n}\n\n/** `mode=\"delta\"`: the opening / closing totals and the net change, read from the rows (`totals` rows are not bars there). */\nexport function waterfallDeltaEnds(\n data: readonly Record<string, unknown>[],\n config: { index: string; value: string; totals?: readonly string[] },\n): WaterfallDeltaEnds {\n const totals = new Set(config.totals ?? [])\n const kinds = data.map((row) => totals.has(String(row[config.index] ?? \"\")))\n const firstMove = kinds.indexOf(false)\n const lastMove = kinds.lastIndexOf(false)\n const valueAt = (i: number) => (config.value ? toChartNumber(data[i]![config.value]) : null)\n const nameAt = (i: number) => String(data[i]![config.index] ?? \"\")\n const net = data.reduce((sum, row, i) => (kinds[i] ? sum : sum + (toChartNumber(row[config.value]) ?? 0)), 0)\n const openingAt = kinds.indexOf(true)\n const closingAt = kinds.lastIndexOf(true)\n const opening =\n openingAt !== -1 && (firstMove === -1 || openingAt < firstMove) ? { name: nameAt(openingAt), value: valueAt(openingAt) } : null\n const closingRow =\n closingAt !== -1 && closingAt !== openingAt && (lastMove === -1 || closingAt > lastMove)\n ? { name: nameAt(closingAt), value: valueAt(closingAt) }\n : null\n const closing =\n closingRow && closingRow.value === null && opening?.value != null ? { ...closingRow, value: opening.value + net } : closingRow\n return { opening, closing, net }\n}\n\n/** The note above a delta plot: `前期 ¥2.2億 → 当期 ¥2.2億(+¥130万)`; without the totals' values, the net change alone. */\nexport function waterfallDeltaNote(ends: WaterfallDeltaEnds, formatter: ValueFormatter, labels?: Record<string, string>): string {\n const net = signedText(ends.net, formatter)\n const { opening, closing } = ends\n const side = (e: { name: string; value: number | null } | null) => (e && e.value !== null ? `${labelOf(e.name, labels)} ${formatter(e.value)}` : null)\n const from = side(opening)\n const to = side(closing)\n if (from && to) return `${from} → ${to}(${net})`\n if (from) return `${from} から ${net}`\n if (to) return `${to}(${net})`\n return `増減の合計 ${net}`\n}\n\nexport interface WaterfallStack {\n /** The transparent base under each bar (0 when the bar starts at the axis or crosses it). */\n base: number[]\n /** The part of each bar above 0. */\n pos: number[]\n /** The part of each bar below 0 (≤ 0). */\n neg: number[]\n /** Which series carries the step's value label. */\n labelOn: (\"pos\" | \"neg\")[]\n}\n\n/**\n * Steps → the three stacked series (base, above 0, below 0). Positive and negative\n * values stack separately in ECharts, so a bar entirely in the negative needs its\n * base there too, and a bar crossing 0 has no base and a part on each side.\n */\nexport function waterfallStack(steps: readonly WaterfallStep[]): WaterfallStack {\n const base: number[] = []\n const pos: number[] = []\n const neg: number[] = []\n const labelOn: (\"pos\" | \"neg\")[] = []\n for (const step of steps) {\n if (step.kind === \"gap\") {\n base.push(0)\n pos.push(0)\n neg.push(0)\n labelOn.push(\"pos\")\n continue\n }\n const from = step.kind === \"total\" ? 0 : step.start\n const lo = Math.min(from, step.end)\n const hi = Math.max(from, step.end)\n if (lo >= 0) {\n base.push(lo)\n pos.push(hi - lo)\n neg.push(0)\n labelOn.push(\"pos\")\n } else if (hi <= 0) {\n base.push(hi)\n pos.push(0)\n neg.push(lo - hi)\n labelOn.push(\"neg\")\n } else {\n base.push(0)\n pos.push(hi)\n neg.push(lo)\n labelOn.push(\"pos\")\n }\n }\n return { base, pos, neg, labelOn }\n}\n\n/** The colour role of a step: totals are series colour 1, steps follow `polarity` (neutral: both directions grey). */\nexport function waterfallTone(kind: WaterfallKind, polarity: Polarity = \"higher-is-better\"): \"total\" | \"positive\" | \"negative\" | \"neutral\" {\n if (kind === \"total\") return \"total\"\n if (kind === \"gap\" || kind === \"flat\" || polarity === \"neutral\") return \"neutral\"\n const up = kind === \"increase\"\n return up === (polarity === \"higher-is-better\") ? \"positive\" : \"negative\"\n}\n\n/** `+600` / `−600` (U+2212) through `formatter`; zero has no sign. */\nexport function signedText(value: number, formatter: ValueFormatter): string {\n if (value > 0) return `+${formatter(value)}`\n if (value < 0) return `${MINUS_SIGN}${formatter(-value)}`\n return formatter(0)\n}\n\n/** The text on a step's bar: a signed change, a total as is, 「—」 for a gap. */\nexport function waterfallStepText(step: WaterfallStep, formatter: ValueFormatter, delta = false): string {\n if (step.value === null) return EMPTY_VALUE\n // `delta`: the closing total is the net change, so it carries a sign like the moves it sums.\n return step.kind === \"total\" && !delta ? formatter(step.value) : signedText(step.value, formatter)\n}\n\n/** `summary=\"auto\"`: first → last level and the largest increase / decrease. `undefined` with no usable step. */\nexport function buildWaterfallSummary(\n steps: readonly WaterfallStep[],\n formatter: ValueFormatter,\n title?: string,\n labels?: Record<string, string>,\n delta?: WaterfallDeltaEnds,\n): string | undefined {\n const real = steps.filter((s) => s.kind !== \"gap\")\n const first = real[0]\n const last = real[real.length - 1]\n if (!first || !last) return undefined\n const name = (s: WaterfallStep) => labelOf(s.name, labels)\n const head = title ? `${title}: ` : \"\"\n // A first step starts at 0, so its end is its value; a total's end is the total. `delta`: the note (totals and net change) instead.\n const parts = [\n delta\n ? waterfallDeltaNote(delta, formatter, labels)\n : real.length === 1\n ? `${name(first)} ${formatter(first.end)}`\n : `${name(first)} ${formatter(first.end)} → ${name(last)} ${formatter(last.end)}`,\n ]\n let up: WaterfallStep | undefined\n let down: WaterfallStep | undefined\n for (const s of real) {\n if (s.kind === \"increase\" && (!up || s.value! > up.value!)) up = s\n if (s.kind === \"decrease\" && (!down || s.value! < down.value!)) down = s\n }\n if (up) parts.push(`最大の増加は ${name(up)}(${signedText(up.value!, formatter)})`)\n if (down) parts.push(`最大の減少は ${name(down)}(${signedText(down.value!, formatter)})`)\n return `${head}${parts.join(\"。\")}`\n}\n\n/** The screen-reader table: one row per step with its change and the running total. */\nexport function waterfallDataTable(\n steps: readonly WaterfallStep[],\n names: { index: string; value: string },\n formatter: ValueFormatter,\n labels?: Record<string, string>,\n delta?: WaterfallDeltaEnds,\n): ChartDataTable {\n const label = (key: string) => labelOf(key, labels)\n const rows = steps.map((s) => [\n label(s.name),\n s.kind === \"total\" ? (delta ? DELTA_TOTAL_NAME : \"合計\") : s.value === null ? EMPTY_VALUE : signedText(s.value, formatter),\n s.kind === \"gap\" ? EMPTY_VALUE : delta ? signedText(s.end, formatter) : formatter(s.end),\n ])\n // `delta`: the totals are not bars, so the opening / closing values are rows of their own (they are not in `steps`).\n const end = (e: WaterfallDeltaEnds[\"opening\"], role: string) =>\n e && e.value !== null ? [[label(e.name), role, formatter(e.value)]] : []\n return {\n columns: [labels?.[names.index] ?? \"項目\", \"増減\", delta ? \"累計増減\" : \"累計\"],\n rows: delta ? [...end(delta.opening, \"開始\"), ...rows, ...end(delta.closing, \"終了\")] : rows,\n }\n}\n\n/* ----------------------------------------------------------------- option */\n\nexport interface WaterfallOptionConfig {\n steps: readonly WaterfallStep[]\n /** Resolved (canvas-safe) colours; `\"\"` leaves the theme palette. */\n colors: { total: string; positive: string; negative: string; neutral: string }\n polarity?: Polarity\n labels?: Record<string, string>\n /** Tooltip and value labels. */\n valueFormatter: ValueFormatter\n /** Value-axis ticks (short form). */\n axisFormatter?: ValueFormatter\n showValues?: boolean\n showTooltip?: boolean\n labelColor?: string\n /** The plot's width (px), when known: every step name is shown (wrapped into its share, or tilted when narrow) and value labels that would collide are thinned. */\n plotWidth?: number | null\n chartOptions?: EChartsOption\n /** Value-axis limits (see `WaterfallChartProps`): the axis always reaches 0 and widens to the data. */\n minValue?: number\n maxValue?: number\n /** The value axis' label width (px); fixes the plot's left edge so stacked charts line up. */\n yAxisWidth?: number\n /** `\"delta\"`: only the moves are bars, the axis is the signed cumulative change, and `deltaNote` prints above the plot. */\n mode?: WaterfallMode\n /** `mode=\"delta\"`: the note printed above the plot (opening → closing and the net change), and the signed value axis. */\n deltaNote?: string\n /** Text colour for the note (the muted token). */\n noteColor?: string\n /** Colour of the 1px line joining the bars' tops (the border token). `undefined` draws no connector. */\n connectorColor?: string\n}\n\n/** The bar fills 45% of its category band. ECharts reads `barCategoryGap` as a share of the band (not of the bar), so the gap is the other 55%; a gap over 100% leaves the bar at its 1px minimum. */\nconst WATERFALL_BAR_SHARE = 0.45\nconst WATERFALL_BAR_GAP = `${Math.round((1 - WATERFALL_BAR_SHARE) * 100)}%`\n\n/** The area tokens one step lighter: the same colour at 75% over the surface (light and dark alike). */\nexport function waterfallSoftFill(color: string): string {\n return color ? withAlpha(color, 0.75) : color\n}\n\n/**\n * The 1px lines that join the tops of consecutive bars: [step index, level] per link. A link needs two real bars\n * that meet at the same level (a gap, or a total whose own value breaks the running level, is not joined).\n */\nexport function waterfallConnectors(steps: readonly WaterfallStep[]): [number, number][] {\n const links: [number, number][] = []\n for (let i = 0; i < steps.length - 1; i++) {\n const a = steps[i]!\n const b = steps[i + 1]!\n if (a.kind === \"gap\" || b.kind === \"gap\") continue\n const meets = b.kind === \"total\" ? b.end === a.end : b.start === a.end\n if (meets) links.push([i, a.end])\n }\n return links\n}\n\n/** The value-tick column and the grid's left / right margins, px: what the steps do not get of the plot's width. */\nconst WATERFALL_GUTTER = 60 + 20\n\n/** The width (px) each step gets: the plot less the tick column and margins, shared by the steps. */\nexport function stepSlotWidth(plotWidth: number, steps: number): number {\n return Math.max(1, Math.floor((plotWidth - WATERFALL_GUTTER) / Math.max(1, steps)))\n}\n\n/** Below this slot (px) a step name no longer wraps into a readable column (under 3 full-width characters): it is tilted instead. */\nconst STEP_LABEL_MIN_SLOT = 44\n\n/** Width (px) for a step's axis label: its slot less a gap. */\nexport function stepLabelWidth(plotWidth: number, steps: number): number {\n return Math.max(24, stepSlotWidth(plotWidth, steps) - 8)\n}\n\n/**\n * How the step names sit on the axis at a plot width: wrapped into the step's slot when it fits a few\n * characters, otherwise tilted (and not wrapped) so every name stays readable and none is dropped.\n */\nexport function stepLabelLayout(plotWidth: number, steps: number): { width: number; rotate: 0 } | { rotate: 45 } {\n return stepSlotWidth(plotWidth, steps) >= STEP_LABEL_MIN_SLOT\n ? { width: stepLabelWidth(plotWidth, steps), rotate: 0 }\n : { rotate: 45 }\n}\n\n/**\n * Which steps print their value on the bar at a plot width. Every label stays when they fit side by side;\n * on a narrow plot the neighbours that would print over each other are dropped (the tooltip and the table still\n * carry them): totals first, then the largest moves, each kept only if it clears the labels already kept.\n * A decrease is never dropped: its label sits under its bar (away from the increases' labels above), and a decrease\n * that would touch the previous decrease's label steps down a line (see `buildWaterfallOption`).\n * `plotWidth` unknown → all shown.\n */\nexport function waterfallValueLabelPlan(\n steps: readonly WaterfallStep[],\n texts: readonly string[],\n plotWidth?: number | null,\n): boolean[] {\n const show = steps.map((s) => s.kind !== \"gap\")\n if (!plotWidth) return show\n const slot = stepSlotWidth(plotWidth, steps.length)\n const kept: { center: number; half: number }[] = []\n const order = steps\n .map((_, i) => i)\n .filter((i) => show[i])\n .sort((a, b) => {\n const rank = (i: number) => (steps[i]!.kind === \"total\" ? 0 : 1)\n return rank(a) - rank(b) || Math.abs(steps[b]!.value ?? 0) - Math.abs(steps[a]!.value ?? 0) || a - b\n })\n for (const i of order) {\n // Labels above a bar and labels under a bar never meet, so only the same side competes; decreases stay.\n if (steps[i]!.kind === \"decrease\") continue\n const center = (i + 0.5) * slot\n const half = (estimateTextWidth(texts[i] ?? \"\") + 6) / 2\n if (kept.some((k) => Math.abs(k.center - center) < k.half + half)) show[i] = false\n else kept.push({ center, half })\n }\n return show\n}\n\n/** Gap (px) between a decrease label and the bar it hangs under; a stepped-down label adds one line. */\nconst DECREASE_LABEL_DISTANCE = 4\nconst DECREASE_LABEL_LINE = 14\n\n/**\n * Where each decrease prints its value: under its bar (`\"bottom\"`), or — when the bar ends on the axis, where the step\n * names are — above it (`\"top\"`). `lineDown` steps a label that would touch the previous decrease's label down one line.\n */\nexport function waterfallDecreaseLabels(\n steps: readonly WaterfallStep[],\n texts: readonly string[],\n plotWidth?: number | null,\n): { position: \"top\" | \"bottom\"; lineDown: boolean }[] {\n const top = Math.max(1, ...steps.map((s) => Math.abs(s.end)), ...steps.map((s) => Math.abs(s.start)))\n const slot = plotWidth ? stepSlotWidth(plotWidth, steps.length) : null\n let prev: { index: number; half: number; down: boolean } | null = null\n return steps.map((step, i) => {\n if (step.kind !== \"decrease\") return { position: \"top\", lineDown: false }\n const lo = Math.min(step.start, step.end)\n // A bar whose foot is within 8% of the axis' span of the 0 line has no room under it.\n const position = lo >= 0 && lo / top < 0.08 ? (\"top\" as const) : (\"bottom\" as const)\n const half = (estimateTextWidth(texts[i] ?? \"\") + 6) / 2\n let lineDown = false\n if (slot && position === \"bottom\" && prev && (i - prev.index) * slot < prev.half + half) lineDown = !prev.down\n prev = position === \"bottom\" ? { index: i, half, down: lineDown } : prev\n return { position, lineDown }\n })\n}\n\n/** The `renderItem` of the connectors: a 1px line from the right edge of one bar to the left edge of the next, at the level they share. */\nexport function waterfallConnectorRenderer(color: string | undefined) {\n type Api = { value(dim: number): number; coord(value: number[]): number[]; size(value: number[]): number[] }\n return (_params: unknown, api: Api) => {\n const [x = 0, y = 0] = api.coord([api.value(0), api.value(1)])\n const band = Math.abs(api.size([1, 0])[0] ?? 0)\n const half = (band * WATERFALL_BAR_SHARE) / 2\n // Snap to the pixel grid so the 1px line stays crisp.\n const at = Math.round(y) + 0.5\n return {\n type: \"line\" as const,\n silent: true,\n shape: { x1: x + half, y1: at, x2: x + band - half, y2: at },\n style: { stroke: color, lineWidth: 1, fill: \"none\" },\n }\n }\n}\n\nconst ROW_STYLE = \"display:flex;align-items:center;gap:8px;line-height:20px\"\n\n/** The ECharts option: a transparent base plus the part above and below 0, coloured per step. */\nexport function buildWaterfallOption(config: WaterfallOptionConfig): EChartsOption {\n const { steps, colors, polarity, labels, valueFormatter, showValues = true, showTooltip = true } = config\n const delta = config.mode === \"delta\"\n const axisFormatter = config.axisFormatter ?? valueFormatter\n const noteWidth = config.plotWidth ? Math.max(120, config.plotWidth - 16) : undefined\n const noteLines = delta && config.deltaNote ? Math.min(3, noteWidth ? Math.ceil(estimateTextWidth(config.deltaNote) / noteWidth) : 1) : 0\n const gridTop = 28 + (noteLines > 0 ? 6 + noteLines * 16 : 0)\n const hasNegative = delta && steps.some((s) => s.kind !== \"gap\" && Math.min(s.start, s.end) < 0)\n const stack = waterfallStack(steps)\n const stepTexts = steps.map((step) => waterfallStepText(step, valueFormatter, delta))\n const valueShown = waterfallValueLabelPlan(steps, stepTexts, config.plotWidth)\n const decreaseLabels = waterfallDecreaseLabels(steps, stepTexts, config.plotWidth)\n // A decrease prints under its bar (on the below-0 part when the bar reaches below 0); every other step above its bar.\n const labelSeries = (step: WaterfallStep, i: number): \"pos\" | \"neg\" =>\n step.kind === \"decrease\" && Math.min(step.start, step.end) < 0 ? \"neg\" : stack.labelOn[i]!\n const colorOf = (step: WaterfallStep) => colors[waterfallTone(step.kind, polarity)] || undefined\n const series = (id: \"pos\" | \"neg\") => ({\n id,\n type: \"bar\" as const,\n stack: \"waterfall\",\n barCategoryGap: WATERFALL_BAR_GAP,\n data: steps.map((step, i) => {\n const decrease = decreaseLabels[i]!\n const isDecrease = step.kind === \"decrease\"\n return {\n value: stack[id][i],\n itemStyle: { color: colorOf(step), borderRadius: 2 },\n label: {\n show: showValues && valueShown[i] === true && labelSeries(step, i) === id,\n position: isDecrease ? decrease.position : id === \"pos\" ? (\"top\" as const) : (\"bottom\" as const),\n distance: isDecrease && decrease.position === \"bottom\" ? DECREASE_LABEL_DISTANCE + (decrease.lineDown ? DECREASE_LABEL_LINE : 0) : undefined,\n formatter: () => waterfallStepText(step, valueFormatter, delta),\n },\n }\n }),\n label: { show: false, color: config.labelColor, fontVariantNumeric: \"tabular-nums\" },\n // The 0 line is the start: with moves below it, draw it once on the first series so the two sides read as gain / loss.\n ...(hasNegative && id === \"pos\"\n ? {\n markLine: {\n silent: true,\n symbol: \"none\",\n animation: false,\n label: { show: false },\n lineStyle: { type: \"solid\" as const, width: 1, color: config.noteColor, opacity: 0.6 },\n data: [{ yAxis: 0 }],\n },\n }\n : {}),\n })\n const limits = valueAxisLimits({ minValue: config.minValue, maxValue: config.maxValue }, true)\n const option = {\n ...chartMotion(false),\n legend: { show: false },\n grid: { top: gridTop, right: 16, bottom: 4, left: 4, containLabel: true },\n ...(noteLines > 0\n ? {\n graphic: [\n {\n type: \"text\" as const,\n left: 4,\n top: 0,\n silent: true,\n style: { text: config.deltaNote, fill: config.noteColor, fontSize: 12, lineHeight: 16, ...(noteWidth ? { width: noteWidth, overflow: \"break\" as const } : {}) },\n },\n ],\n }\n : {}),\n tooltip: {\n show: showTooltip,\n trigger: \"axis\",\n axisPointer: { type: \"shadow\" },\n formatter: (params: unknown) => {\n const list = (Array.isArray(params) ? params : [params]) as { dataIndex?: number }[]\n const step = steps[list[0]?.dataIndex ?? 0]\n if (!step) return \"\"\n const color = escapeHtml(colorOf(step) ?? \"currentColor\")\n const line = (name: string, text: string) =>\n `<div style=\"${ROW_STYLE}\"><span style=\"display:inline-block;width:8px;height:8px;border-radius:9999px;background:${color}\"></span>` +\n `<span style=\"flex:1;opacity:.8\">${escapeHtml(name)}</span>` +\n `<span style=\"font-weight:500;font-variant-numeric:tabular-nums;margin-left:12px\">${escapeHtml(text)}</span></div>`\n const rows =\n step.kind === \"total\"\n ? line(delta ? DELTA_TOTAL_NAME : \"合計\", delta ? signedText(step.end, valueFormatter) : valueFormatter(step.end))\n : line(\"増減\", waterfallStepText(step, valueFormatter)) +\n (step.kind === \"gap\" ? \"\" : delta ? line(\"累計増減\", signedText(step.end, valueFormatter)) : line(\"累計\", valueFormatter(step.end)))\n return `<div style=\"font-weight:500;margin-bottom:4px\">${escapeHtml(labelOf(step.name, labels))}</div>${rows}`\n },\n },\n xAxis: {\n type: \"category\" as const,\n data: steps.map((s) => s.name),\n axisTick: { show: false },\n // A negative cumulative change draws below 0: the names stay at the bottom edge, not on the 0 line.\n ...(hasNegative ? { axisLine: { onZero: false } } : {}),\n // Every step name stays (a dropped name makes a bar unreadable): wrapped into the step's share of the\n // plot, or tilted when the share is too narrow to wrap into.\n axisLabel: {\n interval: 0,\n hideOverlap: false,\n formatter: (value: string) => labelOf(value, labels),\n ...(config.plotWidth ? { ...stepLabelLayout(config.plotWidth, steps.length), overflow: \"break\" as const } : {}),\n },\n },\n yAxis: {\n type: \"value\" as const,\n ...(config.minValue !== undefined || config.maxValue !== undefined ? limits : {}),\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: { show: true },\n axisLabel: {\n // Ticks are unsigned: the sign belongs to the bar labels, not the axis.\n formatter: (v: number) => axisFormatter(v),\n // A fixed width lines up side-by-side plots, but a value tick is never cut: the grid contains it.\n width: config.yAxisWidth,\n },\n },\n series: [\n {\n id: \"base\",\n type: \"bar\" as const,\n stack: \"waterfall\",\n silent: true,\n barCategoryGap: WATERFALL_BAR_GAP,\n itemStyle: { color: \"transparent\", borderColor: \"transparent\" },\n emphasis: { disabled: true },\n data: stack.base,\n },\n series(\"pos\"),\n series(\"neg\"),\n {\n id: \"connectors\",\n type: \"custom\" as const,\n silent: true,\n z: 1,\n tooltip: { show: false },\n emphasis: { disabled: true },\n // Every link is [step index, level]; the value axis already reaches each level (they are the bars' own ends).\n encode: { x: 0, y: 1 },\n data: waterfallConnectors(steps),\n renderItem: waterfallConnectorRenderer(config.connectorColor),\n },\n ],\n }\n return mergeChartOptions(option as EChartsOption, config.chartOptions)\n}\n\n/* -------------------------------------------------------------- component */\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction WaterfallChartImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n index,\n categories = NO_ROWS,\n totals,\n mode = \"total\",\n polarity = \"higher-is-better\",\n labels,\n format,\n valueFormatter: valueFormatterProp,\n showValues = true,\n showTooltip = true,\n title,\n summary,\n actions,\n fileName,\n isLoading,\n emptyState,\n height,\n chartOptions,\n minValue,\n maxValue,\n yAxisWidth,\n ariaLabel,\n className,\n ...rest\n }: WaterfallChartProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const valueKey: string = categories[0] ?? \"\"\n const tokens = useChartTokens()\n const { ref: frameRef, width: plotWidth } = useChartSurface(ref, tokens)\n // Value labels and the tooltip read in full (as `format` says); ticks read short.\n const valueFormatter = useMemo(() => resolveValueFormatter(valueFormatterProp, format), [valueFormatterProp, format])\n const axisFormatter = useMemo(() => resolveAxisFormatter(valueFormatterProp, format), [valueFormatterProp, format])\n const steps = useMemo(() => waterfallSteps(data, { index, value: valueKey, totals, mode }), [data, index, valueKey, totals, mode])\n const ends = useMemo(() => (mode === \"delta\" ? waterfallDeltaEnds(data, { index, value: valueKey, totals }) : undefined), [data, index, valueKey, totals, mode])\n const deltaNote = useMemo(() => (ends ? waterfallDeltaNote(ends, valueFormatter, labels) : undefined), [ends, valueFormatter, labels])\n const colors = useMemo(() => {\n const fills = resolveFillColors(tokens)\n const [total = \"\"] = resolveChartColors([\"chart-1\"], tokens)\n // The area tokens one step lighter, so the bars stay quieter than the numbers on them.\n return {\n total,\n positive: waterfallSoftFill(fills.positive),\n negative: waterfallSoftFill(fills.negative),\n neutral: waterfallSoftFill(fills.neutral),\n }\n }, [tokens])\n const option = useMemo(\n () =>\n buildWaterfallOption({\n steps,\n colors,\n polarity,\n labels,\n valueFormatter,\n axisFormatter,\n showValues,\n showTooltip,\n labelColor: tokens?.foreground ?? undefined,\n noteColor: tokens?.mutedForeground ?? undefined,\n connectorColor: tokens?.border ?? undefined,\n mode,\n deltaNote,\n plotWidth,\n chartOptions,\n minValue,\n maxValue,\n yAxisWidth,\n }),\n [steps, colors, polarity, labels, valueFormatter, axisFormatter, showValues, showTooltip, tokens, mode, deltaNote, plotWidth, chartOptions, minValue, maxValue, yAxisWidth],\n )\n const dataTable = useMemo(\n () => waterfallDataTable(steps, { index, value: valueKey }, valueFormatter, labels, ends),\n [steps, index, valueKey, valueFormatter, labels, ends],\n )\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildWaterfallSummary(steps, valueFormatter, title, labels, ends) : summary),\n [summary, steps, valueFormatter, title, labels, ends],\n )\n const label = ariaLabel ?? `${labelOf(valueKey, labels) || \"増減\"}のウォーターフォールチャート`\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? false}\n isEmpty={data.length === 0}\n emptyState={emptyState}\n height={height}\n variant=\"bar\"\n ariaLabel={label}\n className={className}\n dataTable={dataTable}\n >\n <EChart option={option} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary: resolvedSummary }} />\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `index` / `categories` keys are checked against `data`. */\nexport const WaterfallChart = forwardRef(WaterfallChartImpl as (props: WaterfallChartProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: WaterfallChartProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nWaterfallChart.displayName = \"WaterfallChart\"\n","\"use client\"\n\n/**\n * ScatterChart — a typed scatter / bubble chart over `EChart`: pass rows and the\n * two numeric column keys for the axes (`x` / `y`) instead of an ECharts option.\n * 広告費 × 売上、客単価 × 購入頻度 のように 2 つの数値の関係と外れ値を見る。\n *\n * `size` turns the dots into bubbles (area proportional to the value, from 0),\n * `series` splits the dots into series coloured with the `--chart-1..5` tokens in\n * fixed order (more than 5 fold into one grey「その他」series), `index` names each\n * dot in the tooltip. Both axes fit the data by default — a scatter is read by\n * position, not by length, so it does not start at 0 (`fitToData={false}` does).\n * Rows whose x or y is missing are left out. `labelKey` prints each dot's name beside it (dots whose\n * labels would collide are thinned, never overprinted; on a narrow plot (under 480px) only the 2 highest dots are\n * named, each label turned inward so it stays inside the plot, the legend moves under the plot and the y axis carries\n * 3 intervals), `referenceLines` draws neutral guide lines at\n * fixed x / y values, `highlight` brings some series forward and fades the rest. Renders inside `ChartFrame` (title,\n * summary, loading skeleton, empty state, and a visually-hidden table of the dots).\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\nimport { use } from \"echarts/core\"\nimport { ScatterChart as EScatterChart } from \"echarts/charts\"\nimport { GraphicComponent } from \"echarts/components\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface, useChartTokens } from \"../lib/chart-theme\"\nimport { chartMotion, escapeHtml, estimateTextWidth, labelOf, mergeChartOptions } from \"../lib/chart-options\"\nimport {\n OTHER_SERIES_LABEL,\n MAX_CHART_SERIES,\n chartFillName,\n chartRootProps,\n resolveAxisFormatter,\n resolveValueFormatter,\n seriesColorsFor,\n toChartNumber,\n type ChartDataTable,\n} from \"../lib/chart-utils\"\nimport { EMPTY_VALUE, type ValueFormat } from \"../lib/format\"\nimport type { ChartCommonProps, ChartEmptyState, ChartSeriesColor, NumericKeys, ValueFormatter } from \"../lib/types\"\n\n// The scatter series is this part's own (`EChart` registers bar / line / pie); `graphic` carries the series heading.\nuse([EScatterChart, GraphicComponent])\n\n/** 散布図に引く基準線 1 本(`x` なら縦線、`y` なら横線)。中立色の破線で、点の色とは混ざらない。 */\nexport interface ScatterReferenceLine {\n /** `\"x\"` は横軸の値に縦線、`\"y\"` は縦軸の値に横線を引く。 */\n axis: \"x\" | \"y\"\n /** 線を引く位置(軸の値そのまま。`format` が percent の列でも、列と同じ単位の数値を渡す)。軸の範囲に収まらないときは軸が線まで広がる。 */\n value: number\n /** 線の脇に書く短い名前(「目標 25%」)。省略すると線だけ。 */\n label?: string\n}\n\nexport interface ScatterChartProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends Omit<ChartCommonProps<T>, \"index\" | \"categories\" | \"colors\" | \"summary\" | \"labels\" | \"format\" | \"valueFormatter\"> {\n /** 行の配列。1 行 = 1 つの点。数値の列は number か数値文字列。x か y が数値でない行は描かない。 */\n data: T[]\n /** 横軸に使う数値の列名。例 `\"adSpend\"`。 */\n x: NumericKeys<T>\n /** 縦軸に使う数値の列名。例 `\"revenue\"`。 */\n y: NumericKeys<T>\n /** 点の大きさ(面積)に使う数値の列名。渡すとバブルチャートになる。0 を基準に面積が比例し、null・0 以下は最小の大きさ。ツールチップに値が出る。 */\n size?: NumericKeys<T>\n /** 点の名前に使う列名(店舗名・キャンペーン名など)。ツールチップの見出しとデータ表の先頭列になる。 */\n index?: keyof T & string\n /**\n * 点の脇に書く文字の列名(店舗名など)。重なる点のラベルは自動で間引く(ホバーのツールチップには常に出る)。\n * `index` が無いときはツールチップの見出しとデータ表の名前にもなる。`highlight` を使うと、強調しない系列のラベルは出さない。\n */\n labelKey?: keyof T & string\n /** 系列分けに使う列名(`\"channel\"` など)。値ごとに色を分け、凡例を出す。6 つ以上は点の多い 5 つ +「その他」(灰色)にまとまる。 */\n series?: keyof T & string\n /** 凡例の見出し(「店の規模」)。`series` があって凡例が出るときだけ、凡例の左に小さく書く。 */\n seriesLabel?: string\n /**\n * 前面に出す系列(`series` 列の値。`\"退職\"` か `[\"退職\", \"休職\"]`)。指定した系列は不透明で手前に、指定外は薄く背面に描く。\n * 数が多い点の中に埋もれる少数の系列を見せたいときに使う。値が系列に一つも当たらないときは強調しない。\n */\n highlight?: string | string[]\n /**\n * 基準線(目標・平均・しきい値)。`axis: \"x\" | \"y\"` と軸の値で縦線・横線を引く。例 `[{ axis: \"y\", value: 25, label: \"粗利率 25%\" }]`\n * 色は中立色(点の系列色とは別)。線は点の下に敷かず、軸の範囲を線まで広げる。\n */\n referenceLines?: ScatterReferenceLine[]\n /** 系列色(`\"chart-1\"`〜`\"chart-5\"` か意味色)。配列は系列の出現順、record は系列名ごと。省略時はトークン順。「その他」は常に灰色。 */\n colors?: ChartSeriesColor[] | Partial<Record<string, ChartSeriesColor>>\n /** 列名・系列の値 → 表示名(軸のタイトル・凡例・ツールチップ・データ表に反映)。例 `{ adSpend: \"広告費\", revenue: \"売上\" }`。無いキーはそのまま。データ表の列名の既定は「名前」「系列」「横軸」「縦軸」「大きさ」で、直すには各キーを渡す。 */\n labels?: Record<string, string>\n /** 数値の書式。x・y・size の既定の書式(`\"compact\"` など。`{ type: \"number\", unit: \"件\" }` も可)。軸ごとに変えるなら `xFormat` / `yFormat` / `sizeFormat`。既定 `\"compact\"`。 */\n format?: ValueFormat\n /** 横軸と x の値の書式。`format` より優先。 */\n xFormat?: ValueFormat\n /** 縦軸と y の値の書式。`format` より優先。 */\n yFormat?: ValueFormat\n /** `size` の値の書式(ツールチップ・データ表)。`format` より優先。 */\n sizeFormat?: ValueFormat\n /** 書式を関数で直接渡す逃げ道。x・y・size すべてに使われ、`format` 系より優先する。 */\n valueFormatter?: ValueFormatter\n /**\n * 縦軸(y)の下限。散布図は 0 起点にしないので、指定した値から始める。データが下限を下回るときは軸を広げる(切り詰めない)。\n * 並べて比べる複数の散布図には同じ `minValue` / `maxValue` と `xMinValue` / `xMaxValue` を渡して軸をそろえる。\n */\n minValue?: number\n /** 縦軸(y)の上限。データが上限を超えるときは軸を広げる(切り詰めない)。並べて比べるときは同じ値を渡す。 */\n maxValue?: number\n /** 横軸(x)の下限。データが下限を下回るときは軸を広げる。並べて比べるときは同じ値を渡す。 */\n xMinValue?: number\n /** 横軸(x)の上限。データが上限を超えるときは軸を広げる。並べて比べるときは同じ値を渡す。 */\n xMaxValue?: number\n /** 両軸をデータの範囲に合わせる。既定 `true`(散布図は位置で読むので 0 起点にしない)。`false` で両軸を 0 から始める。 */\n fitToData?: boolean\n /** 凡例(系列が 2 つ以上のときだけ)を出す。既定 `true`。 */\n showLegend?: boolean\n /** ホバー時のツールチップを出す。既定 `true`。 */\n showTooltip?: boolean\n /**\n * グラフが言っていることの 1 文要約(自由文)。`\"auto\"` なら「<見出し>: <点の数>点。<y の列> が最大なのは <名前>(<値>)」を組む(`index` が無いときは最大値だけ)。\n * 省略時は要約なし。例: `summary=\"auto\"`\n */\n summary?: string | \"auto\"\n /** `data` が空(または描ける点が無い)ときの表示。 */\n emptyState?: ChartEmptyState\n /** 見出しが無いときのプロット領域の読み上げ名。省略時は「<y の列>×<x の列>の散布図」。 */\n ariaLabel?: string\n}\n\n/* ------------------------------------------------------------------ model */\n\nexport interface ScatterPoint {\n x: number\n y: number\n /** `null` when there is no size column or the cell is missing. */\n size: number | null\n /** The point's name (`index` column), or `\"\"`. */\n name: string\n /** The series value from the `series` column, or `\"\"`. */\n series: string\n /** The `labelKey` text printed beside the dot (`\"\"` / absent without a `labelKey` column). */\n label?: string\n row: Record<string, unknown>\n}\n\n/** Rows → points. A row whose x or y is not a number is left out. */\nexport function scatterPoints(\n data: readonly Record<string, unknown>[],\n config: { x: string; y: string; size?: string; index?: string; series?: string; labelKey?: string },\n): ScatterPoint[] {\n const points: ScatterPoint[] = []\n for (const row of data) {\n const x = toChartNumber(row[config.x])\n const y = toChartNumber(row[config.y])\n if (x === null || y === null) continue\n points.push({\n x,\n y,\n size: config.size ? toChartNumber(row[config.size]) : null,\n // Without an `index` column the label column names the dot too (tooltip, table).\n name: config.index ? String(row[config.index] ?? \"\") : config.labelKey ? String(row[config.labelKey] ?? \"\") : \"\",\n series: config.series ? String(row[config.series] ?? \"\") : \"\",\n label: config.labelKey ? String(row[config.labelKey] ?? \"\") : \"\",\n row,\n })\n }\n return points\n}\n\nexport interface ScatterSeries {\n /** The series name (the `series` value, or「その他」for the folded series). `\"\"` without a `series` column. */\n name: string\n isOther: boolean\n points: ScatterPoint[]\n}\n\n/**\n * Points → series. Series keep their order of first appearance (that order is the\n * colour order). More than `max` of them: the `max` with the most points are kept\n * and the rest fold into one trailing「その他」series.\n */\nexport function scatterSeries(points: readonly ScatterPoint[], max: number = MAX_CHART_SERIES): ScatterSeries[] {\n const order: string[] = []\n const counts = new Map<string, number>()\n for (const p of points) {\n if (!counts.has(p.series)) order.push(p.series)\n counts.set(p.series, (counts.get(p.series) ?? 0) + 1)\n }\n if (order.length <= Math.max(1, max)) {\n return order.map((name) => ({ name, isOther: false, points: points.filter((p) => p.series === name) }))\n }\n const ranked = order.map((name, at) => ({ name, at, n: counts.get(name) ?? 0 })).sort((a, b) => b.n - a.n || a.at - b.at)\n const kept = new Set(ranked.slice(0, Math.max(1, max)).map((r) => r.name))\n const result: ScatterSeries[] = order\n .filter((name) => kept.has(name))\n .map((name) => ({ name, isOther: false, points: points.filter((p) => p.series === name) }))\n result.push({ name: OTHER_SERIES_LABEL, isOther: true, points: points.filter((p) => !kept.has(p.series)) })\n return result\n}\n\n/** The opacity of a series that is not brought forward by `highlight`. */\nexport const SCATTER_FADED_OPACITY = 0.2\n\n/** Dot diameter without a size column, and the bubble range (px) with one. */\nexport const SCATTER_DOT_SIZE = 10\nexport const SCATTER_MIN_BUBBLE = 8\nexport const SCATTER_MAX_BUBBLE = 40\n\n/**\n * Bubble diameter (px) for a size value: the area is proportional to the value\n * from 0 (so the diameter goes with its square root), the largest value gets\n * `SCATTER_MAX_BUBBLE`. A missing, zero or negative value gets the minimum.\n */\nexport function scatterBubbleSize(value: number | null | undefined, max: number): number {\n if (value === null || value === undefined || !(value > 0) || !(max > 0)) return SCATTER_MIN_BUBBLE\n return Math.max(SCATTER_MIN_BUBBLE, SCATTER_MAX_BUBBLE * Math.sqrt(Math.min(1, value / max)))\n}\n\n/** The point's tooltip title: its name, else its series. */\nfunction pointTitle(point: ScatterPoint, labels?: Record<string, string>): string {\n return labelOf(point.name || point.series, labels)\n}\n\n/** `summary=\"auto\"`: the point count and the highest y. `undefined` with no points. */\nexport function buildScatterSummary(\n points: readonly ScatterPoint[],\n yName: string,\n yFormatter: ValueFormatter,\n title?: string,\n labels?: Record<string, string>,\n): string | undefined {\n if (points.length === 0) return undefined\n let best = points[0]!\n for (const p of points) if (p.y > best.y) best = p\n const head = title ? `${title}: ` : \"\"\n const who = best.name ? `${labelOf(best.name, labels)}(${yFormatter(best.y)})` : yFormatter(best.y)\n return `${head}${points.length}点。${labelOf(yName, labels)}が最大なのは ${who}`\n}\n\n/** Cap of the screen-reader table (a scatter can hold thousands of dots). */\nexport const SCATTER_TABLE_MAX_ROWS = 100\n\n/** The screen-reader table: one row per dot (the first `SCATTER_TABLE_MAX_ROWS`). */\nexport function scatterDataTable(\n points: readonly ScatterPoint[],\n config: {\n x: string\n y: string\n size?: string\n index?: string\n series?: string\n formatters: { x: ValueFormatter; y: ValueFormatter; size: ValueFormatter }\n labels?: Record<string, string>\n referenceLines?: readonly ScatterReferenceLine[]\n },\n): ChartDataTable {\n const label = (key: string) => labelOf(key, config.labels)\n // Column headers: the caller's `labels`, else a plain Japanese name (not the data key).\n const column = (key: string, fallback: string) => config.labels?.[key] ?? fallback\n const columns = [\n ...(config.index ? [column(config.index, \"名前\")] : []),\n ...(config.series ? [column(config.series, \"系列\")] : []),\n column(config.x, \"横軸\"),\n column(config.y, \"縦軸\"),\n ...(config.size ? [column(config.size, \"大きさ\")] : []),\n ]\n const shown = points.slice(0, SCATTER_TABLE_MAX_ROWS)\n const rows = shown.map((p, i) => {\n const cells = [\n ...(config.index ? [label(p.name)] : []),\n ...(config.series ? [label(p.series)] : []),\n config.formatters.x(p.x),\n config.formatters.y(p.y),\n ...(config.size ? [p.size === null ? EMPTY_VALUE : config.formatters.size(p.size)] : []),\n ]\n // The first column is the row header; without an `index` column, number the dots.\n return config.index ? cells : [String(i + 1), ...cells]\n })\n const base = points.length > shown.length ? `${label(config.y)}×${label(config.x)}(先頭 ${shown.length} 点)` : `${label(config.y)}×${label(config.x)}`\n // The guide lines carry information the dots do not: read them out with the table.\n const guides = (config.referenceLines ?? []).map((line) => {\n const key = line.axis === \"x\" ? config.x : config.y\n const text = config.formatters[line.axis](line.value)\n return line.label ? `${line.label}(${label(key)} ${text})` : `${label(key)} ${text}`\n })\n return {\n caption: guides.length > 0 ? `${base}。基準線: ${guides.join(\"、\")}` : base,\n columns: config.index ? columns : [\"#\", ...columns],\n rows,\n }\n}\n\n/* ----------------------------------------------------------------- option */\n\nexport interface ScatterOptionConfig {\n series: readonly ScatterSeries[]\n /** One resolved (canvas-safe) colour per series; `\"\"` leaves the theme palette. */\n palette: readonly string[]\n x: string\n y: string\n size?: string\n /** The `series` column, to name the series in a tooltip that is titled by the point's name. */\n seriesKey?: string\n labels?: Record<string, string>\n formatters: { x: ValueFormatter; y: ValueFormatter; size: ValueFormatter }\n axisFormatters: { x: ValueFormatter; y: ValueFormatter }\n fitToData?: boolean\n showLegend?: boolean\n showTooltip?: boolean\n /** Heading before the legend (the `series` column's meaning). */\n seriesLabel?: string\n /** Series names brought forward; the rest fade and sit behind. Names that match no series are ignored. */\n highlight?: readonly string[]\n /** Neutral guide lines; the axes widen to include them. */\n referenceLines?: readonly ScatterReferenceLine[]\n /** Print `ScatterPoint.label` beside the dots (overlapping labels are thinned). */\n showPointLabels?: boolean\n /** Text colours (resolved tokens): point labels in the foreground, guide lines and the heading muted. */\n textColors?: { label?: string; muted?: string }\n /** Make room under the legend for the PNG buttons. */\n reserveActions?: boolean\n /** The plot's width (px), when known: the x ticks are thinned to as many as fit side by side. */\n plotWidth?: number | null\n chartOptions?: EChartsOption\n /** Axis limits (see `ScatterChartProps`): `minValue` / `maxValue` are y's, `xMinValue` / `xMaxValue` x's. The axis widens to the data. */\n minValue?: number\n maxValue?: number\n xMinValue?: number\n xMaxValue?: number\n}\n\n/** Under this plot width (px) the chart is \"narrow\": 2 point labels at most (inward), the legend under the plot, fewer y ticks. */\nexport const SCATTER_NARROW_WIDTH = 480\n/** Most point labels printed on a narrow plot. */\nexport const SCATTER_NARROW_MAX_LABELS = 2\n/** Intervals on the y axis of a narrow plot (ECharts' own default is 5). */\nconst SCATTER_NARROW_Y_SPLIT = 3\n\n/**\n * The dots that keep their name on a narrow plot: the `SCATTER_NARROW_MAX_LABELS` highest ones (by y) that have a\n * label, among the series that are in front. Returns `\"series index:point index\"` keys.\n */\nexport function scatterNarrowLabelKeys(series: readonly ScatterSeries[], isFront: (s: ScatterSeries) => boolean): Set<string> {\n const labelled = series.flatMap((s, si) => (isFront(s) ? s.points.map((p, pi) => ({ key: `${si}:${pi}`, y: p.y, label: p.label })) : []))\n return new Set(\n labelled\n .filter((p) => Boolean(p.label))\n .sort((a, b) => b.y - a.y)\n .slice(0, SCATTER_NARROW_MAX_LABELS)\n .map((p) => p.key),\n )\n}\n\n/** The grid's left and right margins (px) and the gap kept between two x tick labels. */\nconst SCATTER_GRID_X = 48\nconst X_TICK_GAP = 36\n\n/**\n * How many x-axis intervals fit in `plotWidth` (px) without the tick labels touching: the plot is its width less\n * the grid margins and the y tick column, each tick takes the widest label (`xSamples`, the axis' extent printed)\n * plus a gap. At least 1, at most 6 (ECharts' own default is 5, and rounds to a tidy step either way).\n */\nexport function scatterXSplitNumber(plotWidth: number, xSamples: readonly string[], ySamples: readonly string[]): number {\n const widest = (texts: readonly string[]) => texts.reduce((m, t) => Math.max(m, estimateTextWidth(t)), 0)\n const plot = plotWidth - SCATTER_GRID_X - (widest(ySamples) + 8)\n return Math.max(1, Math.min(6, Math.floor(plot / (widest(xSamples) + X_TICK_GAP))))\n}\n\nconst ROW_STYLE = \"display:flex;align-items:center;gap:8px;line-height:20px\"\n\n/** The ECharts option: one scatter series per `ScatterSeries`, value axes titled with the column names. */\nexport function buildScatterOption(config: ScatterOptionConfig): EChartsOption {\n const { series, palette, labels, formatters, fitToData = true, showTooltip = true } = config\n const multi = series.length > 1\n const narrow = Boolean(config.plotWidth && config.plotWidth < SCATTER_NARROW_WIDTH)\n const showLegend = (config.showLegend ?? true) && multi\n const maxSize = config.size\n ? series.reduce((m, s) => s.points.reduce((mm, p) => Math.max(mm, p.size ?? 0), m), 0)\n : 0\n const names = series.map((s) => (s.name === \"\" ? labelOf(config.y, labels) : labelOf(s.name, labels)))\n const extent = (pick: (p: ScatterPoint) => number) => {\n const values = series.flatMap((s) => s.points.map(pick))\n return values.length > 0 ? [Math.min(...values), Math.max(...values)] : []\n }\n const sample = (values: number[], fmt: ValueFormatter) => values.map((v) => fmt(v))\n const splitNumber = config.plotWidth\n ? scatterXSplitNumber(\n config.plotWidth,\n sample(extent((p) => p.x), config.axisFormatters.x),\n sample(extent((p) => p.y), config.axisFormatters.y),\n )\n : undefined\n const guides = (config.referenceLines ?? []).filter((line) => Number.isFinite(line.value))\n const guideValues = (type: \"x\" | \"y\") => guides.filter((line) => line.axis === type).map((line) => line.value)\n // A guide line outside the data's range still has to be on the plot: only then is that edge of the axis set, a little past\n // the line (a guide inside the data's range leaves ECharts' own tidy ticks alone).\n const bound = (type: \"x\" | \"y\", edge: \"min\" | \"max\") => {\n const at = guideValues(type)\n const [lo, hi] = extent((p) => p[type])\n if (at.length === 0 || lo === undefined || hi === undefined) return {}\n const target = edge === \"min\" ? Math.min(...at) : Math.max(...at)\n if (edge === \"min\" ? target >= lo : target <= hi) return {}\n const span = Math.max(hi - lo, Math.abs(target - (edge === \"min\" ? hi : lo)))\n const pad = span * 0.08\n return { [edge]: edge === \"min\" ? target - pad : target + pad }\n }\n const highlighted = new Set((config.highlight ?? []).filter((name) => series.some((s) => s.name === name)))\n const emphasized = highlighted.size > 0\n const headingWidth = config.seriesLabel && showLegend ? estimateTextWidth(config.seriesLabel) + 12 : 0\n // The y axis name sits left of the tick labels: its gap grows with the widest tick label, so a short one (「40」) does\n // not leave the rotated name outside the plot's left edge (the grid's 24 px margin is where the labels start).\n const yTickWidth = sample(extent((p) => p.y), config.axisFormatters.y).reduce((m, t) => Math.max(m, estimateTextWidth(t)), 0)\n const yNameGap = yTickWidth + 20\n // A limit asked for (`minValue` …) and the edge a guide line needs: the axis reaches whichever is further out, and the data.\n const requested = { x: { min: config.xMinValue, max: config.xMaxValue }, y: { min: config.minValue, max: config.maxValue } }\n const limit = (type: \"x\" | \"y\", edge: \"min\" | \"max\") => {\n const guide = bound(type, edge)[edge]\n const asked = requested[type][edge]\n if (asked === undefined || !Number.isFinite(asked)) return bound(type, edge)\n const at = [guide, asked].filter((v): v is number => v !== undefined)\n return edge === \"min\"\n ? { min: (extent: { min: number; max: number }) => Math.min(...at, extent.min) }\n : { max: (extent: { min: number; max: number }) => Math.max(...at, extent.max) }\n }\n const axis = (key: string, axisFormatter: ValueFormatter, type: \"x\" | \"y\") => ({\n type: \"value\" as const,\n scale: fitToData,\n ...limit(type, \"min\"),\n ...limit(type, \"max\"),\n // Few ticks on a narrow plot, and any that would still touch are dropped.\n ...(type === \"x\" && splitNumber ? { splitNumber } : {}),\n ...(type === \"y\" && narrow ? { splitNumber: SCATTER_NARROW_Y_SPLIT } : {}),\n name: labelOf(key, labels),\n nameLocation: \"middle\" as const,\n nameGap: type === \"x\" ? 28 : yNameGap,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: { show: true },\n axisLabel: { formatter: (v: number) => axisFormatter(v), ...(type === \"x\" ? { hideOverlap: true } : {}) },\n })\n // A narrow plot wraps the legend onto more lines: the grid starts below the last one, so the top y tick never sits under it.\n const legendLineCount = (() => {\n if (!showLegend || !config.plotWidth) return 1\n const room = Math.max(80, config.plotWidth - headingWidth - (config.reserveActions ? 72 : 0))\n const need = names.reduce((sum, name) => sum + estimateTextWidth(name) + 8 + 5 + 16, 0)\n return Math.min(3, Math.max(1, Math.ceil(need / room)))\n })()\n // Narrow: the legend sits under the plot (the top stays free for the dots and the PNG buttons).\n const legendBelow = narrow && showLegend\n const xs = extent((p) => p.x)\n const keptLabels = narrow && config.showPointLabels ? scatterNarrowLabelKeys(series, (s) => !emphasized || highlighted.has(s.name)) : null\n const option = {\n ...chartMotion(false),\n legend: {\n show: showLegend,\n ...(legendBelow ? { bottom: 0 } : { top: 0 }),\n // With a heading the legend reads from the left, after it; otherwise it sits at the right edge.\n ...(headingWidth > 0 ? { left: headingWidth } : legendBelow ? { left: 0 } : { right: config.reserveActions ? 72 : 0 }),\n type: \"plain\",\n icon: \"circle\",\n itemWidth: 8,\n itemHeight: 8,\n itemGap: 16,\n data: names,\n },\n // A vertical guide's name sits above the plot's top edge: keep that line free.\n grid: {\n top:\n (showLegend && !legendBelow ? 12 + 24 * legendLineCount : 12) +\n (guides.some((line) => line.axis === \"x\" && line.label) && (!showLegend || legendBelow) ? 14 : 0),\n right: 24,\n bottom: legendBelow ? 24 + 24 * legendLineCount : 24,\n left: 24,\n containLabel: true,\n },\n ...(headingWidth > 0\n ? {\n graphic: [\n {\n type: \"text\" as const,\n left: 0,\n ...(legendBelow ? { bottom: 4 } : { top: 2 }),\n silent: true,\n style: { text: config.seriesLabel, fill: config.textColors?.muted, fontSize: 12 },\n },\n ],\n }\n : {}),\n tooltip: {\n show: showTooltip,\n trigger: \"item\",\n formatter: (params: unknown) => {\n const p = (params as { data?: { point?: ScatterPoint }; color?: unknown }).data?.point\n if (!p) return \"\"\n const color = escapeHtml(typeof (params as { color?: unknown }).color === \"string\" ? ((params as { color: string }).color) : \"currentColor\")\n const line = (name: string, text: string, dot = false) =>\n `<div style=\"${ROW_STYLE}\">` +\n (dot ? `<span style=\"display:inline-block;width:8px;height:8px;border-radius:9999px;background:${color}\"></span>` : \"\") +\n `<span style=\"flex:1;opacity:.8\">${escapeHtml(name)}</span>` +\n `<span style=\"font-weight:500;font-variant-numeric:tabular-nums;margin-left:12px\">${escapeHtml(text)}</span></div>`\n const title = pointTitle(p, labels)\n const rows = [\n ...(p.name && p.series && config.seriesKey ? [line(labelOf(config.seriesKey, labels), labelOf(p.series, labels), true)] : []),\n line(labelOf(config.x, labels), formatters.x(p.x), !(p.name && p.series && config.seriesKey)),\n line(labelOf(config.y, labels), formatters.y(p.y)),\n ...(config.size ? [line(labelOf(config.size, labels), p.size === null ? EMPTY_VALUE : formatters.size(p.size))] : []),\n ]\n return `${title ? `<div style=\"font-weight:500;margin-bottom:4px\">${escapeHtml(title)}</div>` : \"\"}${rows.join(\"\")}`\n },\n },\n xAxis: axis(config.x, config.axisFormatters.x, \"x\"),\n yAxis: axis(config.y, config.axisFormatters.y, \"y\"),\n series: series.map((s, i) => {\n const front = !emphasized || highlighted.has(s.name)\n return {\n id: `series:${s.name}`,\n name: names[i],\n type: \"scatter\" as const,\n // Brought-forward series draw above the rest (and later), the others stay behind.\n z: front && emphasized ? 3 : 2,\n symbolSize: config.size\n ? (value: unknown) => scatterBubbleSize(Array.isArray(value) ? (value[2] as number | null) : null, maxSize)\n : SCATTER_DOT_SIZE,\n itemStyle: { color: palette[i] || undefined, opacity: !front ? SCATTER_FADED_OPACITY : config.size ? 0.7 : emphasized ? 1 : 0.85 },\n emphasis: { focus: \"self\" as const, scale: 1.1 },\n ...(config.showPointLabels && front\n ? {\n label: {\n show: keptLabels === null,\n position: \"right\" as const,\n distance: 6,\n fontSize: 11,\n color: config.textColors?.label,\n // Plain text: an outline / shadow reads as a halo on a dark surface.\n textBorderWidth: 0,\n textShadowBlur: 0,\n formatter: (p: { data?: { point?: ScatterPoint } }) => p.data?.point?.label ?? \"\",\n },\n labelLayout: { hideOverlap: true, moveOverlap: \"shiftY\" as const },\n }\n : {}),\n // The guide lines hang off the first series (a markLine belongs to one).\n ...(i === 0 && guides.length > 0\n ? {\n markLine: {\n silent: true,\n symbol: \"none\",\n animation: false,\n // ECharts rounds a mark line's value to 2 decimals unless told otherwise.\n precision: 20,\n lineStyle: { type: \"dashed\" as const, width: 1, color: config.textColors?.muted },\n data: guides.map((line) => ({\n ...(line.axis === \"x\" ? { xAxis: line.value } : { yAxis: line.value }),\n label: {\n show: Boolean(line.label),\n formatter: line.label ?? \"\",\n position: line.axis === \"x\" ? (\"end\" as const) : (\"insideEndTop\" as const),\n color: config.textColors?.muted,\n fontSize: 11,\n },\n })),\n },\n }\n : {}),\n data: s.points.map((point, pi) => ({\n value: [point.x, point.y, point.size],\n point,\n // Narrow: only the kept dots are named, and the name turns inward so it stays inside the plot.\n ...(keptLabels && config.showPointLabels && front && keptLabels.has(`${i}:${pi}`)\n ? { label: { show: true, position: xs.length === 2 && point.x > (xs[0]! + xs[1]!) / 2 ? (\"left\" as const) : (\"right\" as const) } }\n : {}),\n })),\n }\n }),\n }\n return mergeChartOptions(option as EChartsOption, config.chartOptions)\n}\n\n/** The colours of the series, in order — the same function `Legend` uses, so the two always match. */\nexport function scatterSeriesColors(\n series: readonly ScatterSeries[],\n colors: ScatterChartProps[\"colors\"],\n): string[] {\n const other = series.find((s) => s.isOther)?.name ?? null\n return seriesColorsFor(\n series.map((s) => s.name),\n colors,\n CHART_OTHER_COLOR,\n other,\n )\n}\n\n/* -------------------------------------------------------------- component */\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction ScatterChartImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n x,\n y,\n size,\n index,\n labelKey,\n series: seriesKey,\n seriesLabel,\n highlight,\n referenceLines,\n colors,\n labels,\n format,\n xFormat,\n yFormat,\n sizeFormat,\n valueFormatter,\n fitToData = true,\n showLegend = true,\n showTooltip = true,\n title,\n summary,\n actions,\n fileName,\n isLoading,\n emptyState,\n height,\n chartOptions,\n minValue,\n maxValue,\n xMinValue,\n xMaxValue,\n ariaLabel,\n className,\n ...rest\n }: ScatterChartProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const tokens = useChartTokens()\n const { ref: frameRef, width: plotWidth } = useChartSurface(ref, tokens)\n // Tooltips and the table read in full; axis ticks read short.\n const formatters = useMemo(\n () => ({\n x: resolveValueFormatter(valueFormatter, xFormat ?? format),\n y: resolveValueFormatter(valueFormatter, yFormat ?? format),\n size: resolveValueFormatter(valueFormatter, sizeFormat ?? format),\n }),\n [valueFormatter, xFormat, yFormat, sizeFormat, format],\n )\n const axisFormatters = useMemo(\n () => ({\n x: resolveAxisFormatter(valueFormatter, xFormat ?? format),\n y: resolveAxisFormatter(valueFormatter, yFormat ?? format),\n }),\n [valueFormatter, xFormat, yFormat, format],\n )\n const points = useMemo(\n () => scatterPoints(data, { x, y, size, index, series: seriesKey, labelKey }),\n [data, x, y, size, index, seriesKey, labelKey],\n )\n const series = useMemo(() => scatterSeries(points), [points])\n const palette = useMemo(\n () => resolveChartColors(scatterSeriesColors(series, colors).map(chartFillName), tokens),\n [series, colors, tokens],\n )\n const highlightList = useMemo(() => (highlight === undefined ? undefined : Array.isArray(highlight) ? highlight : [highlight]), [highlight])\n const option = useMemo(\n () =>\n buildScatterOption({\n series,\n palette,\n x,\n y,\n size,\n seriesKey,\n seriesLabel,\n highlight: highlightList,\n referenceLines,\n showPointLabels: Boolean(labelKey),\n textColors: { label: tokens?.foreground ?? undefined, muted: tokens?.mutedForeground ?? undefined },\n labels,\n formatters,\n axisFormatters,\n fitToData,\n showLegend,\n showTooltip,\n reserveActions: Boolean(actions),\n plotWidth,\n chartOptions,\n minValue,\n maxValue,\n xMinValue,\n xMaxValue,\n }),\n [series, palette, x, y, size, seriesKey, seriesLabel, highlightList, referenceLines, labelKey, tokens, labels, formatters, axisFormatters, fitToData, showLegend, showTooltip, actions, plotWidth, chartOptions, minValue, maxValue, xMinValue, xMaxValue],\n )\n const dataTable = useMemo(\n () => scatterDataTable(points, { x, y, size, index: index ?? labelKey, series: seriesKey, formatters, labels, referenceLines }),\n [points, x, y, size, index, labelKey, seriesKey, formatters, labels, referenceLines],\n )\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildScatterSummary(points, y, formatters.y, title, labels) : summary),\n [summary, points, y, formatters, title, labels],\n )\n const label = ariaLabel ?? `${labelOf(y, labels)}×${labelOf(x, labels)}の散布図`\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? false}\n isEmpty={points.length === 0}\n emptyState={emptyState}\n height={height}\n variant=\"line\"\n ariaLabel={label}\n className={className}\n dataTable={dataTable}\n >\n <EChart option={option} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary: resolvedSummary }} />\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `x` / `y` / `size` / `index` / `series` keys are checked against `data`. */\nexport const ScatterChart = forwardRef(ScatterChartImpl as (props: ScatterChartProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: ScatterChartProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nScatterChart.displayName = \"ScatterChart\"\n","\"use client\"\n\n/**\n * Legend — a standalone chart legend as plain HTML, for sharing one legend between\n * several charts: turn each chart's own legend off (`showLegend={false}`) and put\n * one `Legend` beside or under them. It looks like the legend of `DonutChart`\n * (a rounded square swatch and the name, muted) and takes the same `categories` /\n * `colors` / `labels` as the typed charts. Colours are assigned by the same function\n * the charts use (`seriesColorsFor`): the `--chart-1..5` tokens in fixed order unless\n * `colors` says otherwise, 「その他」 grey — so a legend set next to a chart always\n * shows that chart's colours. A meaning colour (`\"warning\"` …) is the AREA colour the bars are painted in\n * (`--warning-fill`), never the text colour `--warning`. No chart, canvas or SVG is involved.\n */\nimport { forwardRef } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { CHART_OTHER_COLOR } from \"../lib/chart-theme\"\nimport { chartFillToCss, seriesColorsFor } from \"../lib/chart-utils\"\nimport { labelOf } from \"../lib/chart-options\"\nimport type { ChartSeriesColor } from \"../lib/types\"\n\nexport interface LegendProps {\n /** 凡例に並べる系列名。並び順が配色の順(グラフの `categories` と同じものを渡す)。6 つ以上はグラフ側で「その他」にまとまるので、凡例も 5 つ +「その他」で渡す。 */\n categories: string[]\n /** 系列色(`\"chart-1\"`〜`\"chart-5\"` か意味色)。配列は系列の順、record は系列名ごと。グラフに渡した `colors` と同じものを渡す。省略時はトークン順。「その他」は常に灰色。 */\n colors?: ChartSeriesColor[] | Partial<Record<string, ChartSeriesColor>>\n /** 系列名 → 表示名。グラフの `labels` と同じものを渡す。例 `{ sales: \"売上\" }`。無いキーはそのまま。 */\n labels?: Record<string, string>\n /** 並べ方。`\"horizontal\"`(既定。折り返す横並び)か `\"vertical\"`(縦並び)。 */\n layout?: \"horizontal\" | \"vertical\"\n /** 凡例の読み上げ名。省略時は「凡例」。 */\n ariaLabel?: string\n className?: string\n}\n\n/**\n * The CSS colour of each category, in order — what the charts draw them in. The same\n * `seriesColorsFor` the typed charts call, so a `Legend` and a chart cannot disagree.\n */\nexport function legendColors(\n categories: readonly string[],\n colors?: LegendProps[\"colors\"],\n): string[] {\n return seriesColorsFor(categories, colors, CHART_OTHER_COLOR).map((color) => chartFillToCss(color))\n}\n\n/** Plain-HTML legend. Renders nothing for an empty `categories`. */\nexport const Legend = forwardRef<HTMLUListElement, LegendProps>(function Legend(\n { categories, colors, labels, layout = \"horizontal\", ariaLabel = \"凡例\", className },\n ref,\n) {\n if (categories.length === 0) return null\n const swatches = legendColors(categories, colors)\n return (\n <ul\n ref={ref}\n data-slot=\"legend\"\n data-layout={layout}\n aria-label={ariaLabel}\n className={cn(\"m-0 flex list-none gap-x-4 gap-y-1 p-0 text-xs\", layout === \"vertical\" ? \"flex-col\" : \"flex-row flex-wrap\", className)}\n >\n {categories.map((category, i) => (\n <li key={category} data-slot=\"legend-item\" className=\"flex min-w-0 items-center gap-1.5\">\n <span aria-hidden=\"true\" className=\"size-2.5 shrink-0 rounded-[2px]\" style={{ background: swatches[i] }} />\n <span className=\"min-w-0 truncate text-muted-foreground\">{labelOf(category, labels)}</span>\n </li>\n ))}\n </ul>\n )\n})\nLegend.displayName = \"Legend\"\n","\"use client\"\n\n/**\n * FunnelSteps — proportional bars for a conversion funnel. Bars are sized\n * against the first step, so pass the steps in descending order. Set\n * `showConversion` to print the step-to-step rate between them; the lowest\n * rate is then the only one emphasised (in the `--negative` colour). Pass\n * `comparison` (`{ values, label? }`: the prior period's value per step) to print each rate's change in\n * pt and emphasise the rate that fell the most instead. Every bar\n * is the one primary colour (`--chart-1`) — the steps are one quantity, not\n * categories — painted as the same light tint BarList uses; `highlight` names the one step the\n * page is about, drawn in the full colour. A non-zero step always keeps a visible sliver.\n * Always renders in `ChartFrame` (title, summary, loading / empty states, a\n * visually-hidden table).\n */\nimport {\n forwardRef,\n Fragment,\n useEffect,\n useState,\n type ComponentProps,\n type ForwardedRef,\n type KeyboardEvent,\n type ReactElement,\n type Ref,\n} from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\nimport { ChartFrame } from \"./chart-frame\"\nimport { BAR_LIST_TINT, chartDataTable, resolveValueFormatter, tintCss, toChartNumber } from \"../lib/chart-utils\"\nimport { labelOf } from \"../lib/chart-options\"\nimport { formatPoints, type ValueFormat } from \"../lib/format\"\nimport type { ChartColorToken, ChartCommonProps } from \"../lib/types\"\n\nexport interface FunnelStep {\n /** ステップのラベル(例: \"ページビュー\") */\n label: string\n /** このステップの数値 */\n value: number\n /** @deprecated Tailwind bg カラークラス(例: \"bg-chart-1\")。`colors` を使う。未指定時は `bg-chart-1` */\n color?: string\n /** クリック時のハンドラ */\n onClick?: () => void\n}\n\n/** Every step is the same quantity narrowing down: one colour, not a palette. */\nconst DEFAULT_TOKEN: ChartColorToken = \"chart-1\"\n\n/** The smallest bar (percent of the first step) a non-zero step is drawn at, so it stays visible. */\nexport const FUNNEL_MIN_BAR_PERCENT = 4\n\nexport const funnelStepsVariants = cva(\"flex w-full\", {\n variants: {\n size: {\n sm: \"\",\n md: \"\",\n lg: \"\",\n },\n direction: {\n vertical: \"flex-col\",\n horizontal: \"flex-row\",\n },\n },\n compoundVariants: [\n { direction: \"vertical\", size: \"sm\", className: \"gap-1\" },\n { direction: \"vertical\", size: \"md\", className: \"gap-1.5\" },\n { direction: \"vertical\", size: \"lg\", className: \"gap-2\" },\n { direction: \"horizontal\", size: \"sm\", className: \"gap-2\" },\n { direction: \"horizontal\", size: \"md\", className: \"gap-3\" },\n { direction: \"horizontal\", size: \"lg\", className: \"gap-4\" },\n ],\n defaultVariants: {\n size: \"md\",\n direction: \"vertical\",\n },\n})\n\nconst funnelBarVariants = cva(\"rounded-sm transition-[width] ease-out motion-reduce:transition-none\", {\n variants: {\n size: {\n sm: \"h-6\",\n md: \"h-8\",\n lg: \"h-10\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n})\n\nconst funnelBarContainerHorizontalVariants = cva(\n \"relative flex w-full items-end overflow-hidden rounded-sm bg-muted\",\n {\n variants: {\n size: {\n sm: \"h-20\",\n md: \"h-28\",\n lg: \"h-36\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n },\n)\n\nconst funnelLabelVariants = cva(\"flex w-full items-center justify-between text-muted-foreground\", {\n variants: {\n size: {\n sm: \"text-xs\",\n md: \"text-sm\",\n lg: \"text-sm\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n})\n\nconst funnelConversionVariants = cva(\"flex items-center text-muted-foreground\", {\n variants: {\n size: {\n sm: \"text-[10px]\",\n md: \"text-xs\",\n lg: \"text-xs\",\n },\n direction: {\n vertical: \"justify-end\",\n horizontal: \"shrink-0 justify-center self-center\",\n },\n },\n compoundVariants: [\n { direction: \"vertical\", size: \"sm\", className: \"py-0\" },\n { direction: \"vertical\", size: \"md\", className: \"py-0.5\" },\n { direction: \"vertical\", size: \"lg\", className: \"py-0.5\" },\n ],\n defaultVariants: {\n size: \"md\",\n direction: \"vertical\",\n },\n})\n\nexport interface FunnelStepsProps<T extends object = FunnelStep>\n extends Omit<ComponentProps<\"div\">, \"title\" | \"color\">,\n Pick<ChartCommonProps, \"format\" | \"valueFormatter\" | \"title\" | \"summary\" | \"isLoading\" | \"emptyState\">,\n VariantProps<typeof funnelStepsVariants> {\n /** ファネルステップの配列(先頭が最大幅)。`index` / `categories` を省くと `{ label, value }` の形として読む。 */\n data: T[]\n /** ステップのラベルに使う列名。既定 `\"label\"`。 */\n index?: keyof T & string\n /** 値に使う列名を 1 つだけ入れた配列(`[\"件数\"]`)。最初の 1 つだけを使う。既定 `[\"value\"]`。 */\n categories?: (keyof T & string)[]\n /** 段の色(`\"chart-1\"`〜`\"chart-5\"`、段の順に繰り返す)。省略時はすべて `\"chart-1\"`(段は同じ量の絞り込みなので 1 色)。 */\n colors?: ChartColorToken[]\n /** ステップの名前(`index` の値)→ 表示名。ラベル・データ表に反映。例 `{ visit: \"訪問\" }`。無いキーはそのまま。データ表の列名を直すには、列のキーも渡す(`{ label: \"工程\", value: \"人数\" }`。既定は「ステップ」「値」)。 */\n labels?: Record<string, string>\n /** 伝えたい 1 段。`index` の値(ステップ名。例 `\"購入\"`)で渡す。段は淡い色が既定で、この 1 段だけ濃い色(`colors` の色そのまま)になる。省略すると全部が淡い色。 */\n highlight?: string\n /** ステップ間のコンバージョン率を表示する */\n showConversion?: boolean\n /** 前期の各段の値(`data` と同じ順)。渡すと転換率の横に前期比(pt)を出し、最も下がった率を強調する。`label` は列見出し・注記の名前(既定「前期」)。KpiCard の `comparison` と同じ形。例 `comparison={{ values: [231_400, 1_210, 402] }}` */\n comparison?: { values: readonly (number | null)[]; label?: string }\n /** @deprecated `valueFormatter` か `format` を使う。 */\n formatValue?: (value: number) => string\n /** マウント時のエントリアニメーションを有効にする。既定 `false`。 */\n animate?: boolean\n ariaLabel?: string\n}\n\n\n/**\n * The value formatter a FunnelSteps uses: `valueFormatter`, else the deprecated\n * `formatValue`, else `format` (default `\"compact\"`) like every other chart.\n */\nexport function resolveFunnelFormatter(\n valueFormatter: ((value: number) => string) | undefined,\n formatValue: ((value: number) => string) | undefined,\n format?: ValueFormat,\n): (value: number) => string {\n return resolveValueFormatter(valueFormatter ?? formatValue, format)\n}\n\n/**\n * The step reached by the lowest step-to-step conversion (index of the later\n * step), or `-1` with fewer than 3 steps (nothing to compare) or no rate.\n */\nexport function lowestConversionStep(values: readonly number[]): number {\n if (values.length < 3) return -1\n let lowest = -1\n let lowestRate = Infinity\n for (let i = 1; i < values.length; i++) {\n const prev = values[i - 1]!\n if (prev <= 0) continue\n const rate = values[i]! / prev\n if (rate < lowestRate) {\n lowestRate = rate\n lowest = i\n }\n }\n return lowest\n}\n\n/**\n * The step reached by the step-to-step conversion that fell the most against\n * `previous` (index of the later step), or `-1` when no rate fell or nothing\n * can be compared (a missing or zero earlier step in either period).\n */\nexport function worstChangeStep(values: readonly number[], previous: readonly (number | null)[]): number {\n let worst = -1\n let worstChange = 0\n for (let i = 1; i < values.length; i++) {\n const change = conversionChange(values, previous, i)\n if (change !== null && change < worstChange) {\n worstChange = change\n worst = i\n }\n }\n return worst\n}\n\n/** This period's rate into step `i` minus the previous period's (a ratio difference), or `null`. */\nfunction conversionChange(values: readonly number[], previous: readonly (number | null)[], i: number): number | null {\n const prevFrom = previous[i - 1]\n const prevTo = previous[i]\n const from = values[i - 1]\n const to = values[i]\n if (from === undefined || to === undefined || from <= 0) return null\n if (prevFrom === null || prevFrom === undefined || prevTo === null || prevTo === undefined || prevFrom <= 0) return null\n return to / from - prevTo / prevFrom\n}\n\ninterface FunnelRow {\n label: string\n value: number\n /** The unmapped step name (`index` value), what `highlight` is matched against. */\n name: string\n /** The bar colour as CSS (a `--chart-N` token). */\n css: string\n /** Deprecated per-step Tailwind bg class: painted as given (no tint). */\n colorClass?: string\n onClick?: () => void\n}\n\n/** Read label / value (numeric strings count, gaps are 0) and the bar colour of each step. */\nfunction funnelRows(\n data: readonly object[],\n index: string,\n category: string,\n colors: readonly ChartColorToken[] | undefined,\n): FunnelRow[] {\n return data.map((row, i) => {\n const cells = row as Record<string, unknown>\n const token = colors && colors.length > 0 ? colors[i % colors.length]! : undefined\n return {\n label: String(cells[index] ?? \"\"),\n name: String(cells[index] ?? \"\"),\n value: toChartNumber(cells[category]) ?? 0,\n css: `var(--${token ?? DEFAULT_TOKEN})`,\n colorClass: typeof cells.color === \"string\" ? cells.color : undefined,\n onClick: typeof cells.onClick === \"function\" ? (cells.onClick as () => void) : undefined,\n }\n })\n}\n\nfunction computeConversionRate(current: number, previous: number): string {\n if (previous === 0) return \"--\"\n return `${((current / previous) * 100).toFixed(1)}%`\n}\n\n/** Label row + bar per step (vertical) or column (horizontal): the skeleton / empty height. */\nconst FRAME_HEIGHT = { sm: 4 * 48, md: 4 * 58, lg: 4 * 68 } as const\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction FunnelStepsImpl<T extends object>(\n {\n data = NO_ROWS,\n index = \"label\" as keyof T & string,\n categories,\n colors,\n labels,\n highlight,\n format: valueFormat,\n valueFormatter,\n title,\n summary,\n isLoading = false,\n emptyState,\n showConversion = false,\n comparison,\n formatValue,\n animate = false,\n size = \"md\",\n direction = \"vertical\",\n ariaLabel,\n className,\n ...props\n }: FunnelStepsProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const [mounted, setMounted] = useState(false)\n const isHorizontal = direction === \"horizontal\"\n const format = resolveFunnelFormatter(valueFormatter, formatValue, valueFormat)\n\n useEffect(() => {\n if (animate) setMounted(true)\n }, [animate])\n\n const ready = !isLoading && data.length > 0\n const steps = funnelRows(data, index, categories?.[0] ?? \"value\", colors).map((step) => ({\n ...step,\n label: labelOf(step.label, labels),\n }))\n const maxValue = steps.length > 0 ? steps[0]!.value : 0\n const values = steps.map((s) => s.value)\n // `comparison` puts the rates on screen too.\n const previous = comparison?.values\n const comparisonLabel = comparison?.label ?? \"前期\"\n const showRates = showConversion || previous !== undefined\n // Only with the rates on screen: the step behind the weakest rate (or, with `comparison`,\n // the rate that fell the most) is the one to look at.\n const focus = !showRates ? -1 : previous ? worstChangeStep(values, previous) : lowestConversionStep(values)\n const dataTable = chartDataTable(\n steps.map((step, i) => ({ label: step.label, value: step.value, previous: previous?.[i] ?? null })),\n \"label\",\n previous ? [\"value\", \"previous\"] : [\"value\"],\n format,\n { label: labels?.[index] ?? \"ステップ\", value: (categories?.[0] && labels?.[categories[0]]) || \"値\", previous: comparisonLabel },\n )\n\n const list = (\n <div data-slot=\"funnel-steps\" role=\"list\" className={funnelStepsVariants({ size, direction })} {...props}>\n {steps.map((step, index) => {\n const percentage = maxValue > 0 ? (step.value / maxValue) * 100 : 0\n // Keep a visible sliver for non-zero steps that would shrink to a few px.\n const barSize = step.value > 0 && percentage < FUNNEL_MIN_BAR_PERCENT ? FUNNEL_MIN_BAR_PERCENT : percentage\n // Light by default (BarList's tint); the highlighted step is the full colour. A legacy bg class is painted as given.\n const solid = highlight !== undefined && step.name === highlight\n const paint = step.colorClass ? undefined : solid ? step.css : tintCss(step.css, BAR_LIST_TINT)\n const isClickable = !!step.onClick\n\n const barInteractionProps = isClickable\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n onClick: step.onClick,\n onKeyDown: (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n step.onClick?.()\n }\n },\n }\n : {}\n\n const barInteractionClasses = isClickable\n ? \"cursor-pointer hover:brightness-110 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none\"\n : undefined\n\n return (\n <Fragment key={index}>\n {isHorizontal ? (\n <div\n role=\"listitem\"\n className=\"flex min-w-0 flex-1 flex-col items-center gap-1\"\n aria-label={`${step.label}: ${format(step.value)}`}\n >\n <span\n data-slot=\"funnel-value\"\n className={cn(\n \"text-muted-foreground tabular-nums\",\n size === \"sm\" ? \"text-xs\" : \"text-sm\",\n )}\n >\n {format(step.value)}\n </span>\n <div className={funnelBarContainerHorizontalVariants({ size })}>\n <div\n {...barInteractionProps}\n className={cn(\n \"w-full rounded-sm transition-[height] ease-out motion-reduce:transition-none\",\n step.colorClass,\n barInteractionClasses,\n )}\n style={{\n background: paint,\n height: animate ? (mounted ? `${barSize}%` : \"0%\") : `${barSize}%`,\n transitionDuration: \"0.5s\",\n transitionDelay: animate ? `${index * 0.08}s` : undefined,\n }}\n />\n </div>\n <span\n className={cn(\n \"w-full truncate text-center text-muted-foreground\",\n size === \"sm\" ? \"text-[10px]\" : \"text-xs\",\n )}\n >\n {step.label}\n </span>\n </div>\n ) : (\n <div role=\"listitem\" aria-label={`${step.label}: ${format(step.value)}`}>\n <div className={funnelLabelVariants({ size })}>\n <span className=\"truncate\">{step.label}</span>\n <span data-slot=\"funnel-value\" className=\"tabular-nums\">\n {format(step.value)}\n </span>\n </div>\n <div className=\"relative w-full overflow-hidden rounded-sm bg-muted\">\n <div\n {...barInteractionProps}\n className={cn(funnelBarVariants({ size }), step.colorClass, barInteractionClasses)}\n style={{\n background: paint,\n width: animate ? (mounted ? `${barSize}%` : \"0%\") : `${barSize}%`,\n transitionDuration: \"0.5s\",\n transitionDelay: animate ? `${index * 0.08}s` : undefined,\n }}\n />\n </div>\n </div>\n )}\n {showRates && index < steps.length - 1 && (\n <div className={funnelConversionVariants({ size, direction })} aria-hidden=\"true\">\n <span\n data-focus={index + 1 === focus || undefined}\n className={cn(index + 1 === focus && \"font-medium text-negative\")}\n >\n → {computeConversionRate(steps[index + 1]!.value, step.value)}\n {previous && (\n <span data-slot=\"funnel-change\" className=\"ml-1 tabular-nums\">\n ({comparisonLabel}比 {formatPoints(conversionChange(values, previous, index + 1))})\n </span>\n )}\n </span>\n </div>\n )}\n </Fragment>\n )\n })}\n </div>\n )\n\n return (\n <ChartFrame\n ref={ref}\n title={title}\n summary={summary}\n isLoading={isLoading}\n isEmpty={data.length === 0}\n emptyState={emptyState}\n // Loading / empty keep a fixed height; the steps themselves are as tall as they are.\n height={ready ? \"auto\" : FRAME_HEIGHT[size ?? \"md\"]}\n variant=\"list\"\n ariaLabel={ariaLabel ?? \"ファネル\"}\n plotRole=\"group\"\n dataTable={dataTable}\n className={className}\n >\n {list}\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `index` / `categories` keys are checked against `data`. */\nexport const FunnelSteps = forwardRef(\n FunnelStepsImpl as (props: FunnelStepsProps<object>, ref: ForwardedRef<HTMLDivElement>) => ReactElement,\n) as (<T extends object = FunnelStep>(props: FunnelStepsProps<T> & { ref?: Ref<HTMLDivElement> }) => ReactElement) & {\n displayName?: string\n}\nFunnelSteps.displayName = \"FunnelSteps\"\n","\"use client\"\n\n/**\n * Heatmap — a typed heatmap over `EChart`: pass rows, the column keys for the\n * x axis / y axis (`x` / `y`) and the number to shade by (`value`) instead of an\n * ECharts option. Cohort retention (週 × コホート), weekday × hour counts, …\n *\n * Shading is a single-colour ramp (light → dark) of one theme colour\n * (`--chart-1` by default; `tone` moves it to another series token or a meaning\n * colour) and follows light/dark. A cell with no value (null / missing row) is left\n * unpainted (transparent, no text), never shaded like 0; the tooltip and the table say「—」.\n * The shading range is the data's min–max unless `scale` fixes it. The ramp's lowest end is the tone mixed 20% into\n * the surface (`color-mix(in oklch, var(--chart-1) 20%, var(--card))`), so the lowest cell never melts into the\n * background in dark mode; the legend's gradient starts at the same colour.\n * Renders inside `ChartFrame` (title, summary, loading skeleton, empty state)\n * with the numbers as a screen-reader table.\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\nimport { use } from \"echarts/core\"\nimport { HeatmapChart } from \"echarts/charts\"\nimport { VisualMapComponent } from \"echarts/components\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { resolveChartColors, useChartSurface, useChartTokens, type ChartTokens } from \"../lib/chart-theme\"\nimport { chartRootProps, resolveValueFormatter, toChartNumber, type ChartDataTable } from \"../lib/chart-utils\"\nimport { EMPTY_VALUE, type ValueFormat } from \"../lib/format\"\nimport type { ChartActionsOptions, ChartEmptyState, ChartRootAttributes, ChartSeriesColor, ValueFormatter } from \"../lib/types\"\n\n// HeatmapChart and the (hidden) visual map that shades the cells are this part's own.\nuse([HeatmapChart, VisualMapComponent])\n\n/** The lightest end of the ramp is this share of the tone colour mixed into the surface; the darkest end is the colour itself. */\nexport const HEATMAP_FLOOR_SHARE = 0.2\n/** Cells at or above this share of the ramp get the surface colour as text (dark cell), below it the foreground. */\nexport const HEATMAP_LIGHT_TEXT_FROM = 0.55\n\n/** Columns of `T` that hold numbers (null / undefined allowed for gaps); untyped rows keep every key. */\ntype NumericColumn<T> = {\n [K in keyof T]-?: unknown extends T[K] ? K : T[K] extends number | bigint | null | undefined ? K : never\n}[keyof T] &\n string\n\nexport interface HeatmapProps<T extends Record<string, unknown> = Record<string, unknown>> extends ChartRootAttributes {\n /** 行の配列。1 行 = 1 マス(x と y の組)。同じ組が複数あれば後の行が勝つ。値は number か数値文字列。 */\n data: T[]\n /** 横軸(列)に使う列名。例 `\"hour\"`・`\"week\"`。 */\n x: keyof T & string\n /** 縦軸(行)に使う列名。例 `\"weekday\"`・`\"cohort\"`。先頭の行が一番上。 */\n y: keyof T & string\n /** マスの濃さを決める数値の列名。null・欠損・数値でない値のマスは塗らない(0 とは別。ツールチップとデータ表は「—」)。 */\n value: NumericColumn<T>\n /** 横軸の並び順(と表示するマス)。省略時は `data` の出現順。ここに無い x の行は描かない。 */\n xLabels?: string[]\n /** 縦軸の並び順(と表示するマス)。省略時は `data` の出現順。ここに無い y の行は描かない。 */\n yLabels?: string[]\n /**\n * 列名・軸の値 → 表示名(軸・ツールチップ・データ表に反映)。\n * 例 `{ mon: \"月曜\", value: \"件数\", breached: \"SLA 未達\" }`。無いキーはそのまま。データ表の先頭列名は `y` のキーを渡すと直る(既定は「項目」)。\n */\n labels?: Record<string, string>\n /** 数値の書式(`\"number\"` / `\"percent\"` / `{ type: \"number\", unit: \"件\" }` など)。マス内・ツールチップ・データ表で同じ書式。既定 `\"number\"`。 */\n format?: ValueFormat\n /** 書式を関数で直接渡す逃げ道。`format` より優先する。 */\n valueFormatter?: ValueFormatter\n /**\n * 濃淡の色。`\"chart-1\"`〜`\"chart-5\"` か意味色(`\"positive\"` / `\"warning\"` / `\"negative\"` / `\"neutral\"`)。\n * 薄い → 濃いの単色グラデーション(レインボーにしない)。既定 `\"chart-1\"`。\n */\n tone?: ChartSeriesColor\n /**\n * 濃さの固定スケール。省略時はデータの最小〜最大(自動)。比べたい上限・下限が決まっているときだけ渡す。`min` 以下が最も薄く、`max` 以上が最も濃い(範囲外の値は端に丸める)。凡例の両端もこの値になる。\n * 継続率(0〜100)なら `{ min: 0, max: 100 }`。片方だけでもよく、省略した側はデータの最小・最大。\n * `minValue` / `maxValue` より優先する。\n */\n scale?: { min?: number; max?: number }\n /** @deprecated `scale={{ min }}` を使う。濃さの下限(この値以下が最も薄い)。 */\n minValue?: number\n /** @deprecated `scale={{ max }}` を使う。濃さの上限(この値以上が最も濃い)。 */\n maxValue?: number\n /** マスの中に値を書く(`format` どおり)。既定 `false`。 */\n showValues?: boolean\n /** 凡例(薄い → 濃いの帯と両端の値)を出す。既定 `true`。 */\n showLegend?: boolean\n /** ホバーでツールチップを出す。既定 `true`。 */\n showTooltip?: boolean\n /**\n * ツールチップとデータ表に添える列(同じ行の別の数値)。例 `[\"breached\"]` →「月曜 9時台 電話 12件・SLA 未達 2件」の「SLA 未達 2件」。\n * 列名の表示は `labels`、値は `format`(単位つきの書式なら同じ単位)で出る。\n */\n details?: NumericColumn<T>[]\n /**\n * この列が真(`true` / 0 でない数)の行のマスに、注意色(`--negative`)の枠を付ける。\n * 例 SLA 未達が集中したマス。色だけでなく枠の太さでも区別でき、ツールチップに「要注意」と出る。\n */\n flag?: keyof T & string\n /** グラフの見出し。 */\n title?: string\n /** グラフが言っていることの 1 文要約。`\"auto\"` で最大のマスから自動生成。 */\n summary?: string | \"auto\"\n /** 読み込み中。最終形と同じ高さのスケルトンを出す。 */\n isLoading?: boolean\n /** `data` が空のときの表示。 */\n emptyState?: ChartEmptyState\n /** プロット領域の高さ(px)。既定 288。 */\n height?: number\n /** 生成した EChartsOption に最後に深くマージする逃げ道。 */\n chartOptions?: EChartsOption\n /** グラフ右上に PNG 保存/コピーのボタンを出す。見出しがあれば PNG の上に含める(`{ includeTitle: false }` で含めない)。 */\n actions?: boolean | ChartActionsOptions\n /** PNG 保存時のファイル名(拡張子つき)。 */\n fileName?: string\n className?: string\n /** スクリーンリーダー向けのラベル。省略時は `<yの列>×<xの列>のヒートマップ`。 */\n ariaLabel?: string\n}\n\n/* ------------------------------------------------------------------ model */\n\nexport interface HeatmapCell {\n /** Index into `xs`. */\n xi: number\n /** Index into `ys`. */\n yi: number\n /** `null` for a gap. */\n value: number | null\n flagged: boolean\n row: Record<string, unknown> | null\n}\n\nexport interface HeatmapModel {\n xs: string[]\n ys: string[]\n /** One per grid position (`xs.length * ys.length`), row-major by y. */\n cells: HeatmapCell[]\n min: number\n max: number\n hasGap: boolean\n}\n\nfunction truthy(raw: unknown): boolean {\n if (typeof raw === \"number\") return raw !== 0 && !Number.isNaN(raw)\n return raw === true || raw === \"true\"\n}\n\n/** Rows → the grid: axes in order, one cell per (x, y) with `null` for gaps, and the shading range. */\nexport function buildHeatmapModel(config: {\n data: readonly Record<string, unknown>[]\n x: string\n y: string\n value: string\n xLabels?: readonly string[]\n yLabels?: readonly string[]\n flag?: string\n scale?: { min?: number; max?: number }\n /** @deprecated Use `scale`. */\n minValue?: number\n /** @deprecated Use `scale`. */\n maxValue?: number\n}): HeatmapModel {\n const { data, x, y, value, flag } = config\n const order = (key: string, given: readonly string[] | undefined) => {\n if (given) return [...given]\n const seen: string[] = []\n for (const row of data) {\n const k = String(row[key] ?? \"\")\n if (!seen.includes(k)) seen.push(k)\n }\n return seen\n }\n const xs = order(x, config.xLabels)\n const ys = order(y, config.yLabels)\n const byCell = new Map<string, Record<string, unknown>>()\n for (const row of data) byCell.set(`${String(row[x] ?? \"\")}\\u0000${String(row[y] ?? \"\")}`, row)\n const cells: HeatmapCell[] = []\n let lo = Infinity\n let hi = -Infinity\n let hasGap = false\n ys.forEach((yk, yi) =>\n xs.forEach((xk, xi) => {\n const row = byCell.get(`${xk}\\u0000${yk}`) ?? null\n const n = row ? toChartNumber(row[value]) : null\n if (n === null) hasGap = true\n else {\n lo = Math.min(lo, n)\n hi = Math.max(hi, n)\n }\n cells.push({ xi, yi, value: n, flagged: !!(row && flag && truthy(row[flag])), row })\n }),\n )\n const min = config.scale?.min ?? config.minValue ?? (Number.isFinite(lo) ? lo : 0)\n let max = config.scale?.max ?? config.maxValue ?? (Number.isFinite(hi) ? hi : 1)\n if (max <= min) max = min + 1\n return { xs, ys, cells, min, max, hasGap }\n}\n\n/** The share (0–1) of the ramp a value sits at. */\nexport function heatmapRatio(value: number, min: number, max: number): number {\n return max > min ? Math.min(1, Math.max(0, (value - min) / (max - min))) : 1\n}\n\n/** A canvas-safe colour (`#rrggbb` / `rgb()` / `rgba()`) at `alpha`; anything else comes back unchanged. */\nexport function withAlpha(color: string, alpha: number): string {\n const hex = /^#([0-9a-f]{6})$/i.exec(color.trim())\n if (hex) {\n const n = parseInt(hex[1]!, 16)\n return `rgba(${(n >> 16) & 255}, ${(n >> 8) & 255}, ${n & 255}, ${alpha})`\n }\n const rgb = /^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i.exec(color.trim())\n return rgb ? `rgba(${rgb[1]}, ${rgb[2]}, ${rgb[3]}, ${alpha})` : color\n}\n\n/** `#rrggbb` / `rgb()` / `rgba()` → [r, g, b] (0–255), or null. */\nfunction parseRgb(color: string): [number, number, number] | null {\n const hex = /^#([0-9a-f]{6})$/i.exec(color.trim())\n if (hex) {\n const n = parseInt(hex[1]!, 16)\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255]\n }\n const rgb = /^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i.exec(color.trim())\n return rgb ? [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])] : null\n}\n\nconst toLinear = (c: number) => ((c /= 255) <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4)\nconst fromLinear = (c: number) => Math.round(255 * Math.min(1, Math.max(0, c <= 0.0031308 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055)))\n\nfunction toOklab([r, g, b]: [number, number, number]): [number, number, number] {\n const [lr, lg, lb] = [toLinear(r), toLinear(g), toLinear(b)]\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb)\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb)\n const t = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb)\n return [0.2104542553 * l + 0.793617785 * m - 0.0040720468 * t, 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * t, 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * t]\n}\n\nfunction fromOklab([L, a, b]: [number, number, number]): string {\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3\n const t = (L - 0.0894841775 * a - 1.291485548 * b) ** 3\n const rgb = [4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * t, -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * t, -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * t]\n return `rgb(${rgb.map(fromLinear).join(\", \")})`\n}\n\n/**\n * `share` of `color` mixed into `surface` — the canvas form of `color-mix(in oklch, <color> 20%, <surface>)`. The\n * surface is a neutral, so its hue is powerless and the oklch mix is the straight line in Oklab. An unreadable\n * colour falls back to `color` at `share` opacity.\n */\nexport function mixIntoSurface(color: string, surface: string | undefined, share: number): string {\n const c = parseRgb(color)\n const s = surface ? parseRgb(surface) : null\n if (!c || !s) return withAlpha(color, share)\n const [c1, c2] = [toOklab(c), toOklab(s)]\n return fromOklab([0, 1, 2].map((i) => c2[i]! + (c1[i]! - c2[i]!) * share) as [number, number, number])\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[c]!)\n}\n\n/** Rough width (px) of 12px text: full-width characters 12, the rest 7 (as `chart-options` estimates it; kept local, like `escapeHtml`, so this part inlines on its own). */\nfunction estimateTextWidth(text: string): number {\n let w = 0\n for (const ch of text) w += /[\\u3000-\\u9fff\\uff00-\\uffef]/.test(ch) ? 12 : 7\n return w\n}\n\n/** The grid's left and right margins (px), and the room a cell's text needs beside its edges. */\nconst HEATMAP_GRID_X = 16\nconst HEATMAP_CELL_PADDING = 4\n/** `plotWidth` is floored to a 40 px bucket (`useChartSurface`): the true width is half a bucket more on average. */\nconst HEATMAP_BUCKET_MID = 20\n\n/**\n * The font size (px) of the numbers inside the cells at a plot width: 12 when the widest text fits a cell,\n * 10 when only the smaller size does, `null` (no numbers: the shade and the tooltip carry them) when neither.\n * Cells are the plot — its width less the margins and the row-name column — shared by the columns.\n */\nexport function heatmapCellFontSize(\n plotWidth: number,\n columns: number,\n rowNames: readonly string[],\n texts: readonly string[],\n): 12 | 10 | null {\n const widest = (items: readonly string[]) => items.reduce((m, t) => Math.max(m, estimateTextWidth(t)), 0)\n const cell = (plotWidth + HEATMAP_BUCKET_MID - HEATMAP_GRID_X - (widest(rowNames) + 8)) / Math.max(1, columns)\n const text = widest(texts)\n if (text + HEATMAP_CELL_PADDING <= cell) return 12\n return (text * 10) / 12 + HEATMAP_CELL_PADDING <= cell ? 10 : null\n}\n\nexport interface HeatmapOptionConfig {\n model: HeatmapModel\n x: string\n y: string\n value: string\n /** Resolved (canvas-safe) tone colour; `\"\"` leaves it to the theme palette. */\n color: string\n /** Resolved colour of the flag outline. */\n flagColor: string\n /** Resolved muted colour, for the missing-value cells and the axis. */\n mutedColor: string\n /** The colour the chart sits on (a card): the ramp's lowest end mixes the tone into it. */\n surfaceColor?: string\n /** Text on a dark cell / on a light cell. */\n darkCellText: string\n lightCellText: string\n labels?: Record<string, string>\n valueFormatter: ValueFormatter\n details?: readonly string[]\n showValues: boolean\n showTooltip: boolean\n /** The plot's width (px), when known: the numbers shrink (or go) when the cells are too narrow for them. */\n plotWidth?: number | null\n chartOptions?: EChartsOption\n}\n\n/**\n * The ECharts option: a shaded series (visual map, hidden), a grey series for gaps, category axes.\n * ECharts requires every heatmap series to be bound to a visual map (it throws「Heatmap must use with\n * visualMap」otherwise) and skips cells whose value is not a number, so the gap series gets its own\n * hidden visual map with a single grey and carries a placeholder `0` as its value (the label and the\n * tooltip read「—」from the cell, never the placeholder).\n */\nexport function buildHeatmapOption(config: HeatmapOptionConfig): EChartsOption {\n const { model, labels, valueFormatter } = config\n const label = (key: string) => labels?.[key] ?? key\n const present = model.cells.filter((c) => c.value !== null)\n const missing = model.cells.filter((c) => c.value === null)\n const base = config.color || \"#6366f1\"\n const range = [mixIntoSurface(base, config.surfaceColor, HEATMAP_FLOOR_SHARE), base]\n const gapColor = \"rgba(0, 0, 0, 0)\"\n const flagged = (cell: HeatmapCell) =>\n cell.flagged ? { borderColor: config.flagColor, borderWidth: 3, borderType: \"solid\" as const } : { borderColor: \"transparent\", borderWidth: 1 }\n\n const tooltip = (cell: HeatmapCell): string => {\n const head = `${escapeHtml(label(model.ys[cell.yi]!))} ${escapeHtml(label(model.xs[cell.xi]!))}`\n const main = cell.value === null ? EMPTY_VALUE : escapeHtml(valueFormatter(cell.value))\n const extras = (config.details ?? [])\n .map((key) => {\n const n = cell.row ? toChartNumber(cell.row[key]) : null\n return `${escapeHtml(label(key))} ${n === null ? EMPTY_VALUE : escapeHtml(valueFormatter(n))}`\n })\n .join(\"・\")\n const flag = cell.flagged ? \"・要注意\" : \"\"\n return `${head} ${main}${extras ? `・${extras}` : \"\"}${flag}`\n }\n\n const cellFont = config.plotWidth\n ? heatmapCellFontSize(\n config.plotWidth,\n model.xs.length,\n model.ys.map(label),\n model.cells.flatMap((cell) => (cell.value === null ? [] : [valueFormatter(cell.value)])),\n )\n : 12\n const point = (cell: HeatmapCell) => ({ value: [cell.xi, cell.yi, cell.value], cell })\n const option: EChartsOption = {\n animation: false,\n tooltip: config.showTooltip\n ? { trigger: \"item\", formatter: (p: unknown) => tooltip((p as { data: { cell: HeatmapCell } }).data.cell) }\n : { show: false },\n grid: { left: 8, right: 8, top: 8, bottom: 8, containLabel: true },\n xAxis: {\n type: \"category\",\n data: model.xs,\n splitArea: { show: false },\n axisTick: { show: false },\n axisLine: { show: false },\n axisLabel: { formatter: (v: string) => label(v), hideOverlap: true },\n },\n yAxis: {\n type: \"category\",\n data: model.ys,\n inverse: true,\n splitArea: { show: false },\n axisTick: { show: false },\n axisLine: { show: false },\n axisLabel: { formatter: (v: string) => label(v) },\n },\n visualMap: [\n {\n type: \"continuous\",\n show: false,\n min: model.min,\n max: model.max,\n dimension: 2,\n seriesIndex: 0,\n inRange: { color: range },\n outOfRange: { color: range },\n },\n {\n type: \"continuous\",\n show: false,\n min: 0,\n max: 1,\n dimension: 2,\n seriesIndex: 1,\n inRange: { color: [gapColor, gapColor] },\n outOfRange: { color: [gapColor, gapColor] },\n },\n ],\n series: [\n {\n id: \"values\",\n type: \"heatmap\",\n data: present.map((cell) => ({\n ...point(cell),\n itemStyle: flagged(cell),\n label: {\n color:\n heatmapRatio(cell.value as number, model.min, model.max) >= HEATMAP_LIGHT_TEXT_FROM\n ? config.darkCellText\n : config.lightCellText,\n },\n })),\n label: {\n show: config.showValues && cellFont !== null,\n fontSize: cellFont ?? 12,\n formatter: (p: unknown) => valueFormatter((p as { value: [number, number, number] }).value[2]),\n },\n itemStyle: { borderColor: \"transparent\", borderWidth: 1, borderRadius: 2 },\n emphasis: { itemStyle: { borderColor: config.lightCellText, borderWidth: 2 } },\n z: 2,\n },\n {\n id: \"gaps\",\n type: \"heatmap\",\n data: missing.map((cell) => ({ value: [cell.xi, cell.yi, 0], cell, itemStyle: flagged(cell) })),\n label: { show: false },\n itemStyle: {\n color: gapColor,\n borderColor: \"transparent\",\n borderWidth: 1,\n borderRadius: 2,\n },\n emphasis: { disabled: true },\n z: 1,\n },\n ],\n }\n return config.chartOptions ? mergeDeep(option as Record<string, unknown>, config.chartOptions as Record<string, unknown>) as EChartsOption : option\n}\n\nfunction mergeDeep(a: Record<string, unknown>, b: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...a }\n for (const [k, v] of Object.entries(b)) {\n const cur = out[k]\n out[k] =\n v && cur && typeof v === \"object\" && typeof cur === \"object\" && !Array.isArray(v) && !Array.isArray(cur)\n ? mergeDeep(cur as Record<string, unknown>, v as Record<string, unknown>)\n : v\n }\n return out\n}\n\n/** The screen-reader table: one row per y, one column per x; gaps read「—」. */\nexport function heatmapDataTable(\n model: HeatmapModel,\n names: { x: string; y: string },\n formatter: ValueFormatter,\n labels?: Record<string, string>,\n): ChartDataTable {\n const label = (key: string) => labels?.[key] ?? key\n const rows = model.ys.map((yk, yi) => [\n label(yk),\n ...model.xs.map((_, xi) => {\n const v = model.cells[yi * model.xs.length + xi]?.value\n return v === null || v === undefined ? EMPTY_VALUE : formatter(v)\n }),\n ])\n return { caption: `${label(names.y)}×${label(names.x)}`, columns: [labels?.[names.y] ?? \"項目\", ...model.xs.map(label)], rows }\n}\n\n/** `summary=\"auto\"`: the strongest cell, e.g. 「最大は 月曜 9時台 の 12件」. `undefined` with no usable cell. */\nexport function buildHeatmapSummary(model: HeatmapModel, formatter: ValueFormatter, title?: string, labels?: Record<string, string>): string | undefined {\n let best: HeatmapCell | undefined\n for (const cell of model.cells) if (cell.value !== null && (!best || cell.value > (best.value as number))) best = cell\n if (!best) return undefined\n const label = (key: string) => labels?.[key] ?? key\n const head = title ? `${title}: ` : \"\"\n return `${head}最大は ${label(model.ys[best.yi]!)} ${label(model.xs[best.xi]!)} の ${formatter(best.value as number)}`\n}\n\n/* -------------------------------------------------------------- component */\n\nfunction colorsFor(tokens: ChartTokens | null, tone: string) {\n const [color = \"\", flag = \"\", muted = \"\"] = resolveChartColors([tone, \"negative\", \"var(--muted-foreground)\"], tokens)\n return { color, flag, muted }\n}\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction HeatmapImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n x,\n y,\n value,\n xLabels,\n yLabels,\n labels,\n format,\n valueFormatter,\n tone = \"chart-1\",\n scale,\n minValue,\n maxValue,\n showValues = false,\n showLegend = true,\n showTooltip = true,\n details,\n flag,\n title,\n summary,\n isLoading,\n emptyState,\n height,\n chartOptions,\n actions,\n fileName,\n className,\n ariaLabel,\n ...rest\n }: HeatmapProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const tokens = useChartTokens()\n const { ref: frameRef, surface, width: plotWidth } = useChartSurface(ref, tokens)\n const formatter = useMemo(() => resolveValueFormatter(valueFormatter, format ?? \"number\"), [valueFormatter, format])\n const model = useMemo(\n () => buildHeatmapModel({ data, x, y, value, xLabels, yLabels, flag, scale, minValue, maxValue }),\n [data, x, y, value, xLabels, yLabels, flag, scale?.min, scale?.max, minValue, maxValue],\n )\n const colors = useMemo(() => colorsFor(tokens, tone), [tokens, tone])\n const option = useMemo(\n () =>\n buildHeatmapOption({\n model,\n x,\n y,\n value,\n color: colors.color,\n flagColor: colors.flag,\n mutedColor: colors.muted,\n surfaceColor: surface ?? undefined,\n darkCellText: surface ?? \"#ffffff\",\n lightCellText: tokens?.foreground ?? \"\",\n labels,\n valueFormatter: formatter,\n details: details as string[] | undefined,\n showValues,\n showTooltip,\n plotWidth,\n chartOptions,\n }),\n [model, x, y, value, colors, surface, tokens, labels, formatter, details, showValues, showTooltip, plotWidth, chartOptions],\n )\n const dataTable = useMemo(() => heatmapDataTable(model, { x, y }, formatter, labels), [model, x, y, formatter, labels])\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildHeatmapSummary(model, formatter, title, labels) : summary),\n [summary, model, formatter, title, labels],\n )\n const label = ariaLabel ?? `${labels?.[y] ?? y}×${labels?.[x] ?? x}のヒートマップ`\n const legend = showLegend ? (\n <HeatmapLegend model={model} formatter={formatter} tone={tone} />\n ) : null\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? false}\n isEmpty={data.length === 0}\n emptyState={emptyState}\n height={height}\n variant=\"bar\"\n ariaLabel={label}\n className={className}\n dataTable={dataTable}\n >\n <div className=\"flex h-full w-full flex-col gap-2\">\n <div className=\"min-h-0 flex-1\">\n <EChart option={option} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary: resolvedSummary }} />\n </div>\n {legend}\n </div>\n </ChartFrame>\n )\n}\n\nfunction HeatmapLegend({\n model,\n formatter,\n tone,\n}: {\n model: HeatmapModel\n formatter: ValueFormatter\n tone: string\n}) {\n const ramp = `linear-gradient(to right, color-mix(in oklch, var(--${tone}) ${HEATMAP_FLOOR_SHARE * 100}%, var(--card)), var(--${tone}))`\n return (\n <div data-slot=\"heatmap-legend\" className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground tabular-nums\">\n <span className=\"flex items-center gap-2\">\n <span>{formatter(model.min)}</span>\n <span aria-hidden className=\"h-2 w-24 rounded-sm\" style={{ backgroundImage: ramp }} />\n <span>{formatter(model.max)}</span>\n </span>\n </div>\n )\n}\n\n/** Generic over the row type, so `x` / `y` / `value` keys are checked against `data`. */\nexport const Heatmap = forwardRef(HeatmapImpl as (props: HeatmapProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: HeatmapProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nHeatmap.displayName = \"Heatmap\"\n","\"use client\"\n\n/**\n * Sparkline — an inline trend micro-chart. Deliberately *not* an `EChart`: a\n * sparkline sits inside table cells and KPI tiles by the dozen, where one\n * ECharts instance per cell would be wasteful. This renders a single stateless\n * `<svg>` instead, so hundreds of them stay cheap.\n */\nimport { forwardRef, useEffect, useState, type SVGAttributes } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport type { ChartHighlight } from \"../lib/types\"\n\nexport type SparklineVariant = \"line\" | \"bar\"\n\nexport interface SparklineDataPoint {\n value: number\n label?: string\n}\n\nexport interface SparklineProps extends SVGAttributes<SVGSVGElement> {\n data: SparklineDataPoint[]\n variant?: SparklineVariant\n height?: number\n /** Tailwind text-colour class; drives both stroke and fill via `currentColor`. */\n color?: string\n area?: boolean\n /** マウント時に線を引く / 棒を伸ばす。既定 `false`(`prefers-reduced-motion` では常に無効)。 */\n animate?: boolean\n /**\n * 点の強調(Tufte 流)。`\"auto\"` は最新・最大・最小の 3 点だけに小さな点を打つ\n * (最新は系列の色、最大・最小は muted)。`\"latest\"` は最新の 1 点だけ、`\"none\"` は線だけ。`variant=\"line\"` のときだけ効く。既定 `\"auto\"`。\n */\n highlight?: ChartHighlight | \"latest\"\n /** 指定すると `role=\"img\"` で読み上げ対象にする。省略時は装飾として `aria-hidden`。 */\n \"aria-label\"?: string\n className?: string\n}\n\nconst VB_WIDTH = 100\n\n/** Map raw values onto SVG y-coordinates (inverted, padded). */\nfunction normalizeData(values: number[], height: number, vPad = 2): number[] {\n const min = Math.min(...values)\n const max = Math.max(...values)\n const range = max - min\n const drawHeight = height - vPad * 2\n if (range === 0) return values.map(() => vPad + drawHeight / 2)\n return values.map((v) => height - vPad - ((v - min) / range) * drawHeight)\n}\n\nfunction buildLinePath(ys: number[]): string {\n if (ys.length === 0) return \"\"\n const step = ys.length > 1 ? VB_WIDTH / (ys.length - 1) : 0\n return ys\n .map((y, i) => `${i === 0 ? \"M\" : \"L\"}${(i * step).toFixed(2)},${y.toFixed(2)}`)\n .join(\" \")\n}\n\nfunction buildAreaPath(ys: number[], height: number): string {\n if (ys.length === 0) return \"\"\n const step = ys.length > 1 ? VB_WIDTH / (ys.length - 1) : 0\n const lastX = ((ys.length - 1) * step).toFixed(2)\n return `${buildLinePath(ys)} L${lastX},${height} L0,${height} Z`\n}\n\nexport type SparklinePointKind = \"latest\" | \"max\" | \"min\"\n\nexport interface SparklinePoint {\n kind: SparklinePointKind\n index: number\n}\n\n/**\n * The points a Tufte-style sparkline marks: the latest, the max and the min.\n * A point that is both latest and max/min is drawn once, as `latest`; a flat\n * series marks only the latest. Ties pick the most recent occurrence.\n */\nexport function sparklineHighlightPoints(values: number[]): SparklinePoint[] {\n if (values.length === 0) return []\n const last = values.length - 1\n const points: SparklinePoint[] = [{ kind: \"latest\", index: last }]\n let maxI = 0\n let minI = 0\n let max = values[0] as number\n let min = max\n values.forEach((v, i) => {\n if (v >= max) [max, maxI] = [v, i]\n if (v <= min) [min, minI] = [v, i]\n })\n const latest = values[last] as number\n if (max === min) return points\n if (max !== latest) points.push({ kind: \"max\", index: maxI })\n if (min !== latest) points.push({ kind: \"min\", index: minI })\n return points\n}\n\ninterface BarRect {\n x: number\n y: number\n w: number\n h: number\n}\n\nfunction buildBarRects(ys: number[], height: number, gap = 1): BarRect[] {\n const barW = Math.max(1, VB_WIDTH / ys.length - gap)\n return ys.map((y, i) => ({ x: i * (barW + gap), y, w: barW, h: height - y }))\n}\n\n/** Rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nexport const Sparkline = forwardRef<SVGSVGElement, SparklineProps>(function Sparkline(\n {\n data = NO_ROWS,\n variant = \"line\",\n height = 40,\n color = \"text-chart-1\",\n area = false,\n animate = false,\n highlight = \"auto\",\n \"aria-label\": ariaLabel,\n className,\n ...props\n },\n ref,\n) {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n if (animate) setMounted(true)\n }, [animate])\n\n if (data.length === 0) return null\n\n const values = data.map((d) => d.value)\n const ys = normalizeData(values, height)\n const step = ys.length > 1 ? VB_WIDTH / (ys.length - 1) : 0\n const points =\n variant !== \"line\"\n ? []\n : highlight === \"auto\"\n ? sparklineHighlightPoints(values)\n : highlight === \"latest\"\n ? [{ kind: \"latest\" as const, index: values.length - 1 }]\n : []\n\n return (\n <svg\n ref={ref}\n data-slot=\"sparkline\"\n viewBox={`0 0 ${VB_WIDTH} ${height}`}\n preserveAspectRatio=\"none\"\n width=\"100%\"\n height={height}\n role={ariaLabel ? \"img\" : undefined}\n aria-label={ariaLabel}\n aria-hidden={ariaLabel ? undefined : true}\n className={cn(\"overflow-visible\", className)}\n {...props}\n >\n {variant === \"line\" && (\n <>\n {area && (\n <path\n d={buildAreaPath(ys, height)}\n strokeWidth={0}\n className={cn(\"fill-current opacity-15\", color)}\n />\n )}\n <path\n d={buildLinePath(ys)}\n fill=\"none\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n pathLength={animate ? 1 : undefined}\n strokeDasharray={animate ? 1 : undefined}\n strokeDashoffset={animate ? (mounted ? 0 : 1) : undefined}\n className={cn(\"stroke-current\", animate && \"motion-reduce:transition-none!\", color)}\n style={animate ? { transition: \"stroke-dashoffset 0.6s ease-in-out\" } : undefined}\n />\n {/* A zero-length round-capped stroke with a non-scaling width stays a\n circle even though the viewBox stretches (`preserveAspectRatio=\"none\"`). */}\n {points.map((p) => {\n const x = (p.index * step).toFixed(2)\n const y = (ys[p.index] ?? 0).toFixed(2)\n return (\n <path\n key={p.kind}\n data-slot=\"sparkline-point\"\n data-point={p.kind}\n d={`M${x},${y} L${x},${y}`}\n fill=\"none\"\n strokeWidth={p.kind === \"latest\" ? 5 : 4}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n className={cn(\"stroke-current\", p.kind === \"latest\" ? color : \"text-muted-foreground\")}\n />\n )\n })}\n </>\n )}\n\n {variant === \"bar\" &&\n buildBarRects(ys, height).map((rect, i) => (\n <rect\n key={i}\n x={rect.x}\n y={animate ? (mounted ? rect.y : height) : rect.y}\n width={rect.w}\n height={animate ? (mounted ? rect.h : 0) : rect.h}\n rx={0.5}\n className={cn(\"fill-current\", animate && \"motion-reduce:transition-none!\", color)}\n style={\n animate\n ? {\n transition: `height 0.4s ease-out ${i * 0.02}s, y 0.4s ease-out ${i * 0.02}s`,\n }\n : undefined\n }\n />\n ))}\n </svg>\n )\n})\nSparkline.displayName = \"Sparkline\"\n","\"use client\"\n\n/**\n * DataTable — a compound table over TanStack Table. `<DataTable>` owns the\n * table instance and publishes it on context; the toolbar, body, pagination and\n * column-visibility parts read from that context, so a page composes only the\n * pieces it wants. `DataTablePreset` assembles the usual arrangement.\n *\n * Every piece of state (sorting, filters, pagination, selection, visibility) is\n * optionally controlled: pass the value plus its `on…Change` to drive it from\n * outside, or omit both and the table keeps it internally.\n */\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type SetStateAction,\n} from \"react\"\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type Column,\n type ColumnDef,\n type ColumnFiltersState,\n type OnChangeFn,\n type PaginationState,\n type RowData,\n type RowSelectionState,\n type SortingState,\n type Table as TanstackTable,\n type TableMeta,\n type VisibilityState,\n} from \"@tanstack/react-table\"\nimport {\n ArrowDown,\n ArrowUp,\n ArrowUpDown,\n CircleCheck,\n CircleX,\n Columns3,\n Download,\n Minus,\n Search,\n TriangleAlert,\n type LucideIcon,\n} from \"lucide-react\"\n\nimport { Sparkline } from \"../charts/sparkline\"\nimport { toneForValue } from \"../lib/comparison\"\nimport { EMPTY_VALUE, formatDate, formatValue, type DateStyle, type ValueFormat } from \"../lib/format\"\nimport type { ChartThreshold, ChartTone } from \"../lib/types\"\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"../ui/button\"\nimport { Checkbox } from \"../ui/checkbox\"\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { Input } from \"../ui/input\"\nimport { Skeleton } from \"../ui/skeleton\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\"\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"../ui/table\"\n\n/* ------------------------------------------------------------------- types */\n\ndeclare module \"@tanstack/react-table\" {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface ColumnMeta<TData extends RowData, TValue> {\n /**\n * Classes put on the column's header and body cells — e.g.\n * `\"hidden md:table-cell\"` to drop a column on narrow screens.\n */\n className?: string\n /**\n * 列の数値書式。`cell` を持たない列だけに効き、右寄せ・tabular-nums で描く。\n * 行ごとに通貨が変わるときは関数で行を受ける。CSV の「表示」値にも使われる。\n *\n * @example\n * meta: { format: \"currency\" }\n * meta: { format: (row) => ({ type: \"currency\", currency: row.currency, notation: \"standard\" }) }\n */\n format?: ValueFormat | ((row: TData) => ValueFormat)\n /**\n * 日付の列の書式(`formatDate` の `style`)。`cell` を持たない列だけに効く。左寄せ・tabular-nums で描き、\n * 値は `Date`・エポックミリ秒・日付文字列(`\"2026-10-20\"`、ISO 8601)。CSV の「表示」値にも使われる。\n * `format`(数値)とは併用しない。\n *\n * @example\n * meta: { dateFormat: \"date\" }\n * meta: { dateFormat: \"datetime\", nullLabel: \"未更新\" }\n */\n dateFormat?: DateStyle\n /**\n * `dateFormat` の列の日時を出すタイムゾーン(IANA 名。例 `\"Asia/Tokyo\"`)。既定は実行環境(ブラウザ)のタイムゾーン。\n * サーバーとブラウザで表示が食い違う(SSR)なら固定する。`dateFormat` の列だけに効き、CSV の「表示」値にも同じ値を使う。\n * `\"2026-10-20\"` のような日付だけの文字列は、どのタイムゾーンでもその暦日のまま。\n *\n * @example\n * meta: { dateFormat: \"datetime\", timeZone: \"Asia/Tokyo\" }\n */\n timeZone?: string\n /**\n * 値が無いときの表示。既定 `\"—\"`。null / undefined(数値は NaN も)に効き、文字列の列では空文字 `\"\"` も値なしとして扱う。\n * `format` / `dateFormat` を持つ列と、書式なしの文字列の列に効く。`cell` を自前で書いた列には効かない(`cell` の中で扱う)。\n * CSV の「表示」値は、書式付き・日付の列だけ `nullLabel` で書き、書式なしの文字列の列は空欄のまま。\n *\n * @example\n * meta: { format: \"number\", nullLabel: \"未集計\" }\n * meta: { nullLabel: \"未設定\" } // 書式なしの文字列の列\n */\n nullLabel?: string\n /**\n * 値の範囲でセルを意味色に塗り分ける規則(最初に当たった規則。どれにも当たらない値は通常色)。\n * `cell` を持たない列だけに効き、BarChart / BarList の `thresholds` と同じ型・同じ判定。\n * 色だけに頼らず、色に応じた記号(○ / △ / × / −)を値の前に添える。CSV は生の値のまま。\n *\n * @example\n * meta: { format: { type: \"percent\", divisor: 100 }, thresholds: [{ lt: 40, tone: \"negative\" }, { lt: 70, tone: \"warning\" }] }\n */\n thresholds?: ChartThreshold[]\n /**\n * 狭い幅で列を隠す順。数が小さい列から隠れる(表の置き場の幅が 1 は 640px 未満、2 は 520px 未満、3 は 400px 未満)。\n * 書かない列と 4 以上の列は、どの幅でも出す(部署名・離職率のような肝心の列に使う)。\n * 画面の幅ではなく、表を置いた場所の幅(コンテナ幅)で決まる。隠した列は DOM にも読み上げにも出ず、CSV の出力には含まれる。\n *\n * @example\n * meta: { format: \"number\", priority: 1 } // 幅が足りないときに最初に隠す\n */\n priority?: number\n /**\n * true にすると、増減(`Delta`)など「直前の列の値との比較」を表示する列になる。表の置き場が 320px 未満に狭まると、\n * この列は隠れる代わりに、直前の列(値の列)のセルの下に同じ内容を小さく(text-xs)積んで出す。比較は消えない。\n * `priority` で隠す順は最後(どの列よりも後)になり、この列の `priority` は無視される。直前の列も `priority` に関わらず残る。\n * 列の `cell` に `<Delta variant=\"inline\" … />` を書く。直前に列が無いときは積まず、通常の列として出す。CSV には通常の列として含まれる。\n *\n * @example\n * { accessorKey: \"revenue\", header: \"売上\", meta: { format: \"currency\" } },\n * { id: \"revenueDelta\", header: \"前月比\", meta: { comparison: true }, cell: ({ row }) => <Delta variant=\"inline\" value={row.original.revenue} comparison={{ previous: row.original.prev, vs: \"prior-period\", grain: \"month\" }} /> }\n */\n comparison?: boolean\n /**\n * 列の寄せ。見出し(ソートボタンを含む)とセルの両方に効く。既定は、`format` / `thresholds` の列と\n * `comparison` の列(増減 `Delta`)が `\"right\"`、それ以外は `\"left\"`。右寄せの列は tabular-nums で描く。\n *\n * @example\n * meta: { align: \"right\" }\n */\n align?: \"left\" | \"right\"\n }\n}\n\n/* ------------------------------------------------------------ cell formatting */\n\n/** Resolve a column's `meta.format` for one row. */\nfunction resolveFormat<TData>(\n format: ValueFormat | ((row: TData) => ValueFormat) | undefined,\n row: TData,\n): ValueFormat | undefined {\n return typeof format === \"function\" ? format(row) : format\n}\n\n/** 値なし: null / undefined / NaN / 空文字。 */\nfunction isMissingCell(value: unknown): boolean {\n return value === null || value === undefined || value === \"\" || (typeof value === \"number\" && Number.isNaN(value))\n}\n\n/**\n * Display string of a column's value (`meta.format` / `meta.dateFormat` / plain);\n * a missing value renders as `nullLabel` (default `—`).\n */\nfunction formatCellText<TData>(\n value: unknown,\n row: TData,\n meta: { format?: ValueFormat | ((row: TData) => ValueFormat); dateFormat?: DateStyle; timeZone?: string; nullLabel?: string },\n): string {\n if (isMissingCell(value)) return meta.nullLabel ?? EMPTY_VALUE\n if (meta.dateFormat && (value instanceof Date || typeof value === \"string\" || typeof value === \"number\")) {\n const text = formatDate(value, meta.dateFormat, undefined, { timeZone: meta.timeZone })\n return text === EMPTY_VALUE ? String(value) : text\n }\n if (typeof value !== \"number\") return String(value)\n return formatValue(value, resolveFormat(meta.format, row))\n}\n\n/** 意味色ごとの記号と色クラス。Tailwind が拾えるよう、クラスはリテラルで書く。 */\nconst THRESHOLD_TONE_STYLES: Record<ChartTone, { Icon: LucideIcon; text: string; label: string }> = {\n positive: { Icon: CircleCheck, text: \"text-positive\", label: \"良好\" },\n warning: { Icon: TriangleAlert, text: \"text-warning\", label: \"注意\" },\n negative: { Icon: CircleX, text: \"text-negative\", label: \"要対応\" },\n neutral: { Icon: Minus, text: \"text-neutral\", label: \"中立\" },\n}\n\n/** `meta.thresholds` 列のセル。当たった規則の意味色と記号を値に添える(当たらなければ値だけ)。 */\nfunction ThresholdCell({ value, text, thresholds }: { value: unknown; text: string; thresholds: ChartThreshold[] }) {\n const tone = typeof value === \"number\" ? toneForValue(value, thresholds) : undefined\n if (!tone) return <div className=\"text-right tabular-nums\">{text}</div>\n const { Icon, text: toneClass, label } = THRESHOLD_TONE_STYLES[tone]\n return (\n <div\n data-slot=\"data-table-threshold-cell\"\n data-tone={tone}\n className={cn(\"flex items-center justify-end gap-1.5 tabular-nums\", toneClass)}\n >\n <Icon className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />\n <span>{text}</span>\n <span className=\"sr-only\">({label})</span>\n </div>\n )\n}\n\ninterface DataTableContextValue<TData> {\n table: TanstackTable<TData>\n selectedRows: TData[]\n hasSelection: boolean\n globalFilter: string\n setGlobalFilter: OnChangeFn<string>\n enableFiltering: boolean\n enablePagination: boolean\n enableRowSelection: boolean\n visibleColumnCount: number\n isLoading: boolean\n}\n\n/**\n * @template TData 行データ型\n * @template TValue セル値の型 (省略時は任意)\n */\nexport interface DataTableProps<TData, TValue> {\n /**\n * TanStack Table の列定義配列。\n *\n * `ColumnDef<TData, TValue>[]` を annotation するか配列リテラルに\n * `satisfies ColumnDef<TData>[]` を付けないと、`accessorKey` などの\n * literal が `string` に拡張され型エラーになる。\n *\n * @example\n * import { DataTable, type ColumnDef } from \"@/components/data-table\"\n * // Vantage: import { DataTable, type ColumnDef } from \"@squadbase/vantage/components\"\n *\n * const columns: ColumnDef<User>[] = [\n * { accessorKey: \"id\", header: \"ID\" },\n * { accessorKey: \"name\", header: \"名前\" },\n * ]\n * <DataTable columns={columns} data={users}>...</DataTable>\n */\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n\n // Sorting\n enableSorting?: boolean\n sorting?: SortingState\n onSortingChange?: OnChangeFn<SortingState>\n\n // Filtering\n enableFiltering?: boolean\n columnFilters?: ColumnFiltersState\n onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>\n globalFilter?: string\n onGlobalFilterChange?: OnChangeFn<string>\n\n // Pagination\n enablePagination?: boolean\n pagination?: PaginationState\n onPaginationChange?: OnChangeFn<PaginationState>\n /**\n * サーバー側ページング時の総ページ数。指定すると manualPagination になる。\n *\n * @example\n * <DataTable pageCount={data.pageCount} … />\n */\n pageCount?: number\n /**\n * サーバー側ページング時の総件数。指定すると manualPagination になり、ページ数は\n * `rowCount / pageSize` から導かれ、「N件中」もこの値を使う(`pageCount` を同時に渡せばそちらが優先)。\n *\n * @example\n * <DataTable rowCount={1240} pagination={pagination} onPaginationChange={setPagination} … />\n */\n rowCount?: number\n /**\n * true にすると絞り込みを表では行わず、`data` をそのまま使う(サーバー側で絞り込む)。\n *\n * @example\n * <DataTable manualFiltering globalFilter={q} onGlobalFilterChange={setQ} … />\n */\n manualFiltering?: boolean\n /**\n * true にすると並べ替えを表では行わず、`data` の順をそのまま使う(サーバー側で並べ替える)。\n *\n * @example\n * <DataTable manualSorting sorting={sorting} onSortingChange={setSorting} … />\n */\n manualSorting?: boolean\n /**\n * 読み込み中。Content はスケルトン行、Pagination のボタンは無効、表は aria-busy になる。\n *\n * @example\n * <DataTable isLoading={query.isFetching} … />\n */\n isLoading?: boolean\n\n // Row selection\n enableRowSelection?: boolean\n rowSelection?: RowSelectionState\n onRowSelectionChange?: OnChangeFn<RowSelectionState>\n\n // Column visibility\n columnVisibility?: VisibilityState\n onColumnVisibilityChange?: OnChangeFn<VisibilityState>\n\n /**\n * TanStack Table の `meta`。表全体で共有する値(行を更新する関数など)を渡し、列定義の `cell` から\n * `table.options.meta` で読む。列ごとの書式は列定義の `meta.format` に書く(こちらではない)。\n *\n * @example\n * <DataTable meta={{ updateRow: (id, patch) => mutate({ id, patch }) }} … />\n */\n meta?: TableMeta<TData>\n className?: string\n\n /** Required — the parts to render (toolbar, content, pagination). */\n children: ReactNode\n}\n\nexport interface DataTableToolbarProps extends HTMLAttributes<HTMLDivElement> {\n showSearch?: boolean\n toolbar?: ReactNode\n bulkActions?: (selectedRows: unknown[]) => ReactNode\n}\n\nexport interface DataTableContentProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport interface DataTableExportProps {\n /**\n * 保存するファイル名。既定 `\"export.csv\"`。\n *\n * @example\n * <DataTableExport fileName=\"sales-2025.csv\" />\n */\n fileName?: string\n /**\n * `\"display\"`(既定)は `meta.format` どおりの表示文字列、`\"raw\"` は生の値を書き出す。\n *\n * @example\n * <DataTableExport values=\"raw\" />\n */\n values?: CsvValues\n /**\n * `\"filtered\"`(既定)は並べ替え・絞り込み後の全ページ、`\"page\"` は表示中のページだけ。\n *\n * @example\n * <DataTableExport scope=\"page\" />\n */\n scope?: CsvScope\n /** ボタンの文言。既定 `\"CSV を書き出す\"`。 */\n children?: ReactNode\n className?: string\n}\n\nexport interface DataTablePaginationProps extends HTMLAttributes<HTMLDivElement> {\n pageSizeOptions?: number[]\n}\n\nexport interface DataTableColumnVisibilityProps {\n /** 列 ID をキーとしたラベルマップ。ヘッダーが文字列でない列のラベルを指定する */\n columnLabels?: Record<string, string>\n className?: string\n}\n\n/** The preset takes every `DataTable` prop except `children`, plus a few slots. */\nexport type DataTablePresetProps<TData, TValue> = Omit<\n DataTableProps<TData, TValue>,\n \"children\"\n> & {\n enableColumnVisibility?: boolean\n columnLabels?: Record<string, string>\n /**\n * true にすると toolbar に CSV 書き出しボタン(`DataTableExport`)を置く。既定 false。\n *\n * @example\n * <DataTablePreset exportable … />\n */\n exportable?: boolean\n /**\n * `exportable` のときの保存ファイル名。既定 `\"export.csv\"`。\n *\n * @example\n * <DataTablePreset exportable exportFileName=\"sales.csv\" … />\n */\n exportFileName?: string\n\n /** Extension slots */\n toolbar?: ReactNode\n bulkActions?: (selectedRows: TData[]) => ReactNode\n}\n\n/* ------------------------------------------------------------------ helper */\n\n/** Use the controlled value when one is given, else keep it in local state. */\nfunction useControlledState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: OnChangeFn<T>,\n): [T, OnChangeFn<T>] {\n const [internalValue, setInternalValue] = useState<T>(defaultValue)\n\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : internalValue\n\n const setValue: OnChangeFn<T> = useCallback(\n (updaterOrValue) => {\n onChange?.(updaterOrValue)\n if (!isControlled) {\n setInternalValue(updaterOrValue as SetStateAction<T>)\n }\n },\n [onChange, isControlled],\n )\n\n return [value, setValue]\n}\n\n/* ----------------------------------------------------------------- context */\n\nconst DataTableContext = createContext<DataTableContextValue<unknown> | null>(null)\n\nexport function useDataTable<TData>(): DataTableContextValue<TData> {\n const ctx = useContext(DataTableContext)\n if (!ctx) throw new Error(\"useDataTable must be used inside <DataTable>\")\n return ctx as DataTableContextValue<TData>\n}\n\n/* -------------------------------------------------------------------- root */\n\n/** Columns / rows not given yet (a draft fills props in steps): draw the empty state, keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nexport function DataTable<TData, TValue>({\n columns = NO_ROWS,\n data = NO_ROWS,\n enableSorting = true,\n sorting: sortingProp,\n onSortingChange,\n enableFiltering = false,\n columnFilters: columnFiltersProp,\n onColumnFiltersChange,\n globalFilter: globalFilterProp,\n onGlobalFilterChange,\n enablePagination = false,\n pagination: paginationProp,\n onPaginationChange,\n pageCount,\n rowCount,\n manualFiltering,\n manualSorting,\n isLoading = false,\n enableRowSelection = false,\n rowSelection: rowSelectionProp,\n onRowSelectionChange,\n columnVisibility: columnVisibilityProp,\n onColumnVisibilityChange,\n meta,\n className,\n children,\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = useControlledState<SortingState>(sortingProp, [], onSortingChange)\n\n const [columnFilters, setColumnFilters] = useControlledState<ColumnFiltersState>(\n columnFiltersProp,\n [],\n onColumnFiltersChange,\n )\n\n const [globalFilter, setGlobalFilter] = useControlledState<string>(\n globalFilterProp,\n \"\",\n onGlobalFilterChange,\n )\n\n const [rowSelection, setRowSelection] = useControlledState<RowSelectionState>(\n rowSelectionProp,\n {},\n onRowSelectionChange,\n )\n\n const [columnVisibility, setColumnVisibility] = useControlledState<VisibilityState>(\n columnVisibilityProp,\n {},\n onColumnVisibilityChange,\n )\n\n const [pagination, setPagination] = useControlledState<PaginationState>(\n paginationProp,\n { pageIndex: 0, pageSize: 10 },\n onPaginationChange,\n )\n\n // Row selection prepends a checkbox column that the caller never declares.\n const allColumns = useMemo<ColumnDef<TData, TValue>[]>(() => {\n // A column with `meta.format` / `meta.thresholds` and no `cell` gets a formatted, right-aligned\n // cell; thresholds add the tone colour plus a symbol. `meta.dateFormat` gives a left-aligned date.\n // A plain accessor column (no `cell`) shows `nullLabel` / `—` for a missing value.\n const formatted = columns.map((column) => {\n const meta = column.meta\n if (column.cell !== undefined) return column\n const hasAccessor = \"accessorKey\" in column || \"accessorFn\" in column\n if (!(meta?.format || meta?.thresholds || meta?.dateFormat) && !hasAccessor) return column\n const thresholds = meta?.thresholds\n const aligned = Boolean(meta?.format || thresholds)\n return {\n ...column,\n cell: ({ row, getValue }) => {\n const value = getValue()\n const text = formatCellText(value, row.original, meta ?? {})\n if (thresholds) return <ThresholdCell value={value} text={text} thresholds={thresholds} />\n if (aligned) return <div className=\"text-right tabular-nums\">{text}</div>\n if (meta?.dateFormat) return <span className=\"tabular-nums\">{text}</span>\n return text\n },\n } as ColumnDef<TData, TValue>\n })\n if (!enableRowSelection) return formatted\n\n const selectionColumn: ColumnDef<TData, TValue> = {\n id: \"_select\",\n header: ({ table }) => (\n <Checkbox\n checked={table.getIsAllPageRowsSelected()}\n indeterminate={table.getIsSomePageRowsSelected()}\n onCheckedChange={(checked) => table.toggleAllPageRowsSelected(checked)}\n aria-label=\"全て選択\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(checked) => row.toggleSelected(checked)}\n aria-label=\"行を選択\"\n />\n ),\n enableSorting: false,\n enableHiding: false,\n }\n\n return [selectionColumn, ...formatted]\n }, [columns, enableRowSelection])\n\n // TanStack's own `autoResetPageIndex` queues `resetPageIndex()` from inside a render-time memo, which\n // can fire before the component has mounted (\"Can't perform a React state update on a component that\n // hasn't mounted yet\"). Turn it off and send the page back to 1 from an effect instead, so it only\n // runs after mount and only when the sort / filter / data actually changed.\n const autoResetPage = enablePagination && pageCount === undefined && rowCount === undefined\n const resetKey = useRef<readonly unknown[] | null>(null)\n useEffect(() => {\n const next = [data, sorting, columnFilters, globalFilter]\n const prev = resetKey.current\n resetKey.current = next\n if (!autoResetPage || prev === null) return\n if (prev.every((value, i) => value === next[i])) return\n setPagination((old) => (old.pageIndex === 0 ? old : { ...old, pageIndex: 0 }))\n }, [autoResetPage, data, sorting, columnFilters, globalFilter, setPagination])\n\n const table = useReactTable({\n autoResetPageIndex: false,\n data,\n columns: allColumns,\n state: {\n sorting,\n columnFilters,\n globalFilter,\n rowSelection,\n columnVisibility,\n ...(enablePagination ? { pagination } : {}),\n },\n enableSorting,\n enableRowSelection,\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onGlobalFilterChange: setGlobalFilter,\n onRowSelectionChange: setRowSelection,\n onColumnVisibilityChange: setColumnVisibility,\n ...(enablePagination ? { onPaginationChange: setPagination } : {}),\n ...(pageCount !== undefined || rowCount !== undefined\n ? { pageCount, rowCount, manualPagination: true }\n : {}),\n ...(manualFiltering ? { manualFiltering: true } : {}),\n ...(manualSorting ? { manualSorting: true } : {}),\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n ...(enablePagination ? { getPaginationRowModel: getPaginationRowModel() } : {}),\n meta,\n })\n\n const selectedRows = useMemo(\n () => table.getFilteredSelectedRowModel().rows.map((row) => row.original),\n // `table` is a stable reference, so the selection state is the real input.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [rowSelection, data],\n )\n\n const hasSelection = selectedRows.length > 0\n\n const contextValue = useMemo<DataTableContextValue<TData>>(\n () => ({\n table,\n selectedRows,\n hasSelection,\n globalFilter,\n setGlobalFilter,\n enableFiltering,\n enablePagination,\n enableRowSelection,\n visibleColumnCount: allColumns.length,\n isLoading,\n }),\n // `useReactTable` returns the same object every render, so each piece of\n // table state has to be tracked explicitly to re-render the consumers.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n table,\n selectedRows,\n hasSelection,\n globalFilter,\n setGlobalFilter,\n enableFiltering,\n enablePagination,\n enableRowSelection,\n allColumns.length,\n isLoading,\n rowCount,\n sorting,\n columnFilters,\n columnVisibility,\n pagination,\n rowSelection,\n ],\n )\n\n return (\n <DataTableContext.Provider value={contextValue as DataTableContextValue<unknown>}>\n <div data-slot=\"data-table\" aria-busy={isLoading || undefined} className={cn(\"space-y-4\", className)}>\n {children}\n </div>\n </DataTableContext.Provider>\n )\n}\nDataTable.displayName = \"DataTable\"\n\n/* ------------------------------------------------------ sparkline column */\n\n/** Fewest points a row needs for a trend (one point has no direction). */\nconst SPARKLINE_MIN_POINTS = 2\n\nexport interface SparklineColumnOptions<TData> {\n /** 列 ID(CSV・列の表示切り替えで使う)。 */\n id: string\n /** 見出し。 */\n header: string\n /**\n * 行の数列を返す(古い順。例: 直近 8 週の売上)。null / undefined / 2 点未満の行は「—」。\n * NaN などの有限でない値は取り除いてから数える。\n */\n values: (row: TData) => readonly (number | null | undefined)[] | null | undefined\n /** スクリーンリーダー向けの数値の書式(`meta.format` と同じ語彙)。既定は `\"number\"`。 */\n format?: ValueFormat\n}\n\n/**\n * 行の数列をセルの小さなトレンド(Sparkline)にする列。色は `--chart-1` 固定、軸・ツールチップ・ラベルなし。\n * 図は読み上げず、同じセルの sr-only に「N 点、最初 → 最後、最小、最大」を書式付きで添える。\n * 数列の並べ替えは意味が無いので無効。DataTable 本体の props は増やさず、`columns` に置くだけで使う。\n *\n * @example\n * const columns: ColumnDef<Store>[] = [\n * { accessorKey: \"store\", header: \"店舗\" },\n * sparklineColumn<Store>({ id: \"trend\", header: \"直近 8 週\", values: (r) => r.weekly, format: \"currency\" }),\n * ]\n */\nexport function sparklineColumn<TData>({\n id,\n header,\n values,\n format = \"number\",\n}: SparklineColumnOptions<TData>): ColumnDef<TData, unknown> {\n return {\n id,\n header,\n accessorFn: (row) => values(row) ?? null,\n enableSorting: false,\n cell: ({ getValue }) => {\n const raw = getValue() as readonly (number | null | undefined)[] | null\n const series = (raw ?? []).filter((v): v is number => typeof v === \"number\" && Number.isFinite(v))\n if (series.length < SPARKLINE_MIN_POINTS) return <span className=\"text-muted-foreground\">{EMPTY_VALUE}</span>\n const f = (v: number) => formatValue(v, format)\n const first = series[0] as number\n const last = series[series.length - 1] as number\n return (\n <div data-slot=\"data-table-sparkline-cell\" className=\"flex h-5 items-center\">\n <div aria-hidden=\"true\" className=\"h-5 w-24 shrink-0\">\n <Sparkline data={series.map((value) => ({ value }))} height={20} />\n </div>\n <span className=\"sr-only\">\n {series.length}点の推移、{f(first)}から{f(last)}、最小{f(Math.min(...series))}、最大{f(Math.max(...series))}\n </span>\n </div>\n )\n },\n }\n}\n\n/* ----------------------------------------------------------------- toolbar */\n\nexport const DataTableToolbar = forwardRef<HTMLDivElement, DataTableToolbarProps>(\n ({ showSearch, toolbar, bulkActions, className, ...props }, ref) => {\n const { globalFilter, setGlobalFilter, hasSelection, selectedRows, enableFiltering } =\n useDataTable()\n\n const showSearchEffective = showSearch ?? enableFiltering\n\n const hasContent = showSearchEffective || toolbar != null || (hasSelection && bulkActions != null)\n\n if (!hasContent) return null\n\n return (\n <div\n ref={ref}\n data-slot=\"data-table-toolbar\"\n className={cn(\"flex flex-wrap items-center gap-2\", className)}\n {...props}\n >\n {showSearchEffective && (\n <div className=\"relative\">\n <Search className=\"absolute top-2.5 left-2.5 size-4 text-muted-foreground\" />\n <Input\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n className=\"max-w-sm pl-8\"\n />\n </div>\n )}\n {toolbar}\n {hasSelection && bulkActions && (\n <div className=\"ml-auto flex items-center gap-2\">{bulkActions(selectedRows)}</div>\n )}\n </div>\n )\n },\n)\nDataTableToolbar.displayName = \"DataTableToolbar\"\n\n/* ----------------------------------------------------------------- content */\n\n/**\n * `meta.priority` → the classes that hide the column below a container width (`@container` on the content wrapper).\n * The class strings are literals so Tailwind picks them up.\n */\nconst PRIORITY_CLASS: Record<number, string> = {\n 1: \"hidden @min-[640px]:table-cell\",\n 2: \"hidden @min-[520px]:table-cell\",\n 3: \"hidden @min-[400px]:table-cell\",\n}\n\n/**\n * A `meta.comparison` column is the last tier: it stays as its own column down to 320px, below which it is hidden and its\n * content is stacked under the value cell instead (`COMPARISON_STACK_CLASS`, visible only below the same width).\n */\nconst COMPARISON_CLASS = \"hidden @min-[320px]:table-cell\"\nconst COMPARISON_STACK_CLASS = \"@min-[320px]:hidden\"\n\n/** A column's hide-on-narrow classes: none without a priority (or at 4 and above), the lowest tier for anything below 1. */\nexport function priorityClassName(priority: number | undefined): string | undefined {\n if (priority === undefined || !Number.isFinite(priority) || priority >= 4) return undefined\n return PRIORITY_CLASS[Math.max(1, Math.floor(priority))]\n}\n\ntype CellMeta = {\n className?: string\n format?: unknown\n thresholds?: unknown\n priority?: number\n comparison?: boolean\n align?: \"left\" | \"right\"\n}\n\n/** `meta.align` wins; otherwise numeric columns (`format` / `thresholds`) and Delta (`comparison`) columns are right-aligned, header included. */\nfunction isRightAligned(meta: CellMeta | undefined): boolean {\n if (meta?.align) return meta.align === \"right\"\n return Boolean(meta?.format || meta?.thresholds || meta?.comparison)\n}\n\n/**\n * A column that carries a stacked comparison (`isHost`) never hides, and a comparison column ignores its own\n * `priority` and takes the last tier.\n */\nfunction columnClassName(meta: CellMeta | undefined, options: { isComparison?: boolean; isHost?: boolean } = {}) {\n const tier = options.isComparison\n ? COMPARISON_CLASS\n : options.isHost\n ? undefined\n : priorityClassName(meta?.priority)\n return cn(tier, meta?.className, isRightAligned(meta) ? \"text-right tabular-nums\" : undefined) || undefined\n}\n\n/**\n * Pair every `meta.comparison` column with the visible column right before it (the value it compares).\n * A comparison column with nothing before it stays an ordinary column.\n */\nfunction pairComparisons<TData>(columns: Column<TData, unknown>[]) {\n const comparisonOf = new Map<string, Column<TData, unknown>>() // host column id → its comparison column\n const comparisonIds = new Set<string>()\n columns.forEach((column, i) => {\n if (i > 0 && column.columnDef.meta?.comparison && !columns[i - 1]!.columnDef.meta?.comparison) {\n comparisonOf.set(columns[i - 1]!.id, column)\n comparisonIds.add(column.id)\n }\n })\n return { comparisonOf, comparisonIds }\n}\n\nconst SORT_ICON_CLASS = \"size-4 shrink-0\"\n\n/** The sort icon: always shown on the sorted column, only on hover / keyboard focus on the others. */\nfunction SortIcon({ sorted }: { sorted: false | \"asc\" | \"desc\" }) {\n if (sorted === \"asc\") return <ArrowUp className={SORT_ICON_CLASS} aria-hidden=\"true\" />\n if (sorted === \"desc\") return <ArrowDown className={SORT_ICON_CLASS} aria-hidden=\"true\" />\n return (\n <ArrowUpDown\n className={cn(\n SORT_ICON_CLASS,\n \"text-muted-foreground opacity-0 group-hover/sort:opacity-100 group-focus-visible/sort:opacity-100\",\n )}\n aria-hidden=\"true\"\n />\n )\n}\n\nexport const DataTableContent = forwardRef<HTMLDivElement, DataTableContentProps>(\n ({ className, ...props }, ref) => {\n const { table, visibleColumnCount, isLoading, enablePagination } = useDataTable()\n const { comparisonOf, comparisonIds } = pairComparisons(table.getVisibleLeafColumns())\n\n return (\n <div\n ref={ref}\n data-slot=\"data-table-content\"\n aria-busy={isLoading || undefined}\n className={cn(\"@container overflow-x-auto\", className)}\n {...props}\n >\n <Table className=\"[&_th:first-child]:pl-0 [&_td:first-child]:pl-0 [&_th:last-child]:pr-0 [&_td:last-child]:pr-0\">\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const column = header.column\n const meta = column.columnDef.meta\n const sorted = column.getIsSorted()\n const canSort = column.getCanSort()\n const label = header.isPlaceholder ? null : flexRender(column.columnDef.header, header.getContext())\n return (\n <TableHead\n key={header.id}\n className={columnClassName(meta, {\n isComparison: comparisonIds.has(column.id),\n isHost: comparisonOf.has(column.id),\n })}\n aria-sort={\n canSort && !header.isPlaceholder\n ? sorted === \"asc\"\n ? \"ascending\"\n : sorted === \"desc\"\n ? \"descending\"\n : \"none\"\n : undefined\n }\n >\n {header.isPlaceholder ? null : canSort ? (\n <button\n type=\"button\"\n className={cn(\n \"group/sort relative items-center gap-1 rounded leading-5 after:absolute after:inset-x-0 after:top-1/2 after:h-6 after:-translate-y-1/2 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:outline-none\",\n isRightAligned(meta) ? \"flex w-full justify-end\" : \"inline-flex\",\n )}\n onClick={column.getToggleSortingHandler()}\n >\n {isRightAligned(meta) && <SortIcon sorted={sorted} />}\n {label}\n {!isRightAligned(meta) && <SortIcon sorted={sorted} />}\n </button>\n ) : (\n label\n )}\n </TableHead>\n )\n })}\n </TableRow>\n ))}\n </TableHeader>\n\n <TableBody>\n {isLoading ? (\n Array.from({ length: enablePagination ? table.getState().pagination.pageSize : 5 }).map(\n (_, i) => (\n <TableRow key={i} data-slot=\"data-table-skeleton-row\">\n {Array.from({ length: visibleColumnCount }).map((__, j) => (\n <TableCell key={j}>\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ),\n )\n ) : table.getRowModel().rows.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow key={row.id} data-state={row.getIsSelected() ? \"selected\" : undefined}>\n {row.getVisibleCells().map((cell) => {\n const meta = cell.column.columnDef.meta\n const comparisonColumn = comparisonOf.get(cell.column.id)\n const comparisonCell = comparisonColumn\n ? row.getVisibleCells().find((c) => c.column.id === comparisonColumn.id)\n : undefined\n return (\n <TableCell\n key={cell.id}\n className={columnClassName(meta, {\n isComparison: comparisonIds.has(cell.column.id),\n isHost: comparisonOf.has(cell.column.id),\n })}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n {comparisonCell && (\n <div\n data-slot=\"data-table-stacked-comparison\"\n className={cn(\n COMPARISON_STACK_CLASS,\n \"mt-0.5 text-xs [&_[data-slot=delta]]:text-xs\",\n isRightAligned(meta) ? \"text-right\" : undefined,\n )}\n >\n {flexRender(comparisonCell.column.columnDef.cell, comparisonCell.getContext())}\n </div>\n )}\n </TableCell>\n )\n })}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={visibleColumnCount}\n className=\"h-24 text-center text-muted-foreground\"\n >\n データがありません\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n )\n },\n)\nDataTableContent.displayName = \"DataTableContent\"\n\n/* -------------------------------------------------------------- pagination */\n\nexport const DataTablePagination = forwardRef<HTMLDivElement, DataTablePaginationProps>(\n ({ pageSizeOptions = [10, 20, 50], className, ...props }, ref) => {\n const { table, isLoading } = useDataTable()\n\n const totalRows =\n table.options.rowCount !== undefined\n ? table.getRowCount()\n : table.getFilteredRowModel().rows.length\n const currentPageSize = table.getState().pagination.pageSize\n const currentPageIndex = table.getState().pagination.pageIndex\n const rangeStart = currentPageIndex * currentPageSize + 1\n const rangeEnd = Math.min((currentPageIndex + 1) * currentPageSize, totalRows)\n // One list feeds both the menu and `items`, so the trigger shows \"10件\"\n // rather than the raw \"10\" under Base UI's SelectValue.\n const pageSizeItems = pageSizeOptions.map((size) => ({\n value: String(size),\n label: `${size}件`,\n }))\n\n return (\n <div\n ref={ref}\n data-slot=\"data-table-pagination\"\n aria-busy={isLoading || undefined}\n className={cn(\"flex flex-wrap items-center justify-between gap-4\", className)}\n {...props}\n >\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <span>\n {totalRows}件中 {rangeStart} - {rangeEnd} を表示\n </span>\n <Select\n items={pageSizeItems}\n value={String(currentPageSize)}\n onValueChange={(value) => table.setPageSize(Number(value))}\n >\n <SelectTrigger size=\"sm\" className=\"w-[80px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeItems.map((item) => (\n <SelectItem key={item.value} value={item.value}>\n {item.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.firstPage()}\n disabled={isLoading || !table.getCanPreviousPage()}\n >\n 最初\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={isLoading || !table.getCanPreviousPage()}\n >\n 前へ\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={isLoading || !table.getCanNextPage()}\n >\n 次へ\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.lastPage()}\n disabled={isLoading || !table.getCanNextPage()}\n >\n 最後\n </Button>\n </div>\n </div>\n )\n },\n)\nDataTablePagination.displayName = \"DataTablePagination\"\n\n/* ------------------------------------------------------- column visibility */\n\nexport const DataTableColumnVisibility = forwardRef<\n HTMLButtonElement,\n DataTableColumnVisibilityProps\n>(({ columnLabels, className }, ref) => {\n const { table } = useDataTable()\n\n const hideableColumns = table.getAllColumns().filter((column) => column.getCanHide())\n\n if (hideableColumns.length === 0) return null\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n ref={ref}\n render={<Button variant=\"outline\" size=\"sm\" className={cn(className)} />}\n data-slot=\"data-table-column-visibility\"\n aria-label=\"表示する列\"\n >\n <Columns3 className=\"size-4\" aria-hidden=\"true\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-[10rem]\">\n {hideableColumns.map((column) => {\n const label =\n columnLabels?.[column.id] ??\n (typeof column.columnDef.header === \"string\" ? column.columnDef.header : column.id)\n return (\n <DropdownMenuCheckboxItem\n key={column.id}\n checked={column.getIsVisible()}\n onCheckedChange={(checked) => column.toggleVisibility(checked)}\n >\n {label}\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n})\nDataTableColumnVisibility.displayName = \"DataTableColumnVisibility\"\n\n/* ------------------------------------------------------------------ export */\n\nexport type CsvCell = string | number | null | undefined\nexport type CsvValues = \"display\" | \"raw\"\nexport type CsvScope = \"filtered\" | \"page\"\n\n// A signed number with an optional short currency / unit (\"-¥1,200\", \"+530万\", \"-12.5%\").\nconst SIGNED_NUMBER = /^[+-]\\s?[^\\d\\s=+\\-@]{0,3}\\d[\\d,.]*[^\\d\\s=+\\-@]{0,4}$/\n\n/**\n * CSV 文字列を作る純関数(RFC 4180: CRLF、`,` `\"` 改行を含む欄は `\"` で囲み `\"` は二重化)。\n * 既定で BOM 付き UTF-8(Excel で文字化けしない)。`guardFormulas` が true の間、先頭が\n * `= + - @` の文字列欄には `'` を付けて数式として実行されないようにする(数値と符号付きの数値表記は除く)。\n *\n * @example\n * toCsv([\"月\", \"売上\"], [[\"2025-01\", 1200], [\"2025-02\", null]])\n * // \"\\uFEFF月,売上\\r\\n2025-01,1200\\r\\n2025-02,\"\n */\nexport function toCsv(\n header: string[],\n rows: CsvCell[][],\n options: { bom?: boolean; guardFormulas?: boolean } = {},\n): string {\n const { bom = true, guardFormulas = false } = options\n const field = (cell: CsvCell, guard: boolean): string => {\n let text = cell === null || cell === undefined ? \"\" : String(cell)\n if (guard && typeof cell === \"string\" && /^[=+\\-@]/.test(text) && !SIGNED_NUMBER.test(text)) {\n text = `'${text}`\n }\n return /[\",\\r\\n]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text\n }\n const lines = [\n header.map((h) => field(h, false)).join(\",\"),\n ...rows.map((row) => row.map((cell) => field(cell, guardFormulas)).join(\",\")),\n ]\n return (bom ? \"\\uFEFF\" : \"\") + lines.join(\"\\r\\n\")\n}\n\n/**\n * 表の現在の状態から CSV を作る。行は画面と同じ並べ替え・絞り込み後の順、列は表示中の列のみ。\n *\n * @example\n * const csv = tableToCsv(table, { values: \"raw\", scope: \"page\" })\n */\nexport function tableToCsv<TData>(\n table: TanstackTable<TData>,\n { values = \"display\", scope = \"filtered\" }: { values?: CsvValues; scope?: CsvScope } = {},\n): string {\n const columns = table.getVisibleLeafColumns().filter((column) => column.id !== \"_select\")\n const rows = scope === \"page\" ? table.getRowModel().rows : table.getSortedRowModel().rows\n const header = columns.map((column) =>\n typeof column.columnDef.header === \"string\" ? column.columnDef.header : column.id,\n )\n const body = rows.map((row) =>\n columns.map((column): CsvCell => {\n const value = row.getValue(column.id)\n const meta = column.columnDef.meta\n if (values === \"display\" && (meta?.format || meta?.dateFormat)) return formatCellText(value, row.original, meta)\n if (value === null || value === undefined) return \"\"\n if (typeof value === \"number\" || typeof value === \"string\") return value\n if (value instanceof Date) return value.toISOString()\n return String(value)\n }),\n )\n return toCsv(header, body, { guardFormulas: values === \"display\" })\n}\n\n/** toolbar に置く CSV 書き出しボタン。`useDataTable()` の table から画面と同じ順・同じ集合を書き出す。 */\nexport function DataTableExport({\n fileName = \"export.csv\",\n values = \"display\",\n scope = \"filtered\",\n children = \"CSV を書き出す\",\n className,\n}: DataTableExportProps) {\n const { table, isLoading } = useDataTable()\n\n const onClick = () => {\n const csv = tableToCsv(table, { values, scope })\n const url = URL.createObjectURL(new Blob([csv], { type: \"text/csv;charset=utf-8\" }))\n const a = document.createElement(\"a\")\n a.href = url\n a.download = fileName\n a.click()\n URL.revokeObjectURL(url)\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className={className}\n data-slot=\"data-table-export\"\n onClick={onClick}\n disabled={isLoading}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n {children}\n </Button>\n )\n}\nDataTableExport.displayName = \"DataTableExport\"\n\n/* ------------------------------------------------------------------ preset */\n\n/** The usual arrangement — toolbar, body and pagination — in one component. */\nexport function DataTablePreset<TData, TValue>({\n enableColumnVisibility = false,\n columnLabels,\n exportable = false,\n exportFileName,\n toolbar,\n bulkActions,\n ...tableProps\n}: DataTablePresetProps<TData, TValue>) {\n const toolbarSlot =\n toolbar || enableColumnVisibility || exportable ? (\n <>\n {toolbar}\n {exportable && <DataTableExport fileName={exportFileName} />}\n {enableColumnVisibility && <DataTableColumnVisibility columnLabels={columnLabels} />}\n </>\n ) : undefined\n\n return (\n <DataTable<TData, TValue> {...tableProps}>\n <DataTableToolbar\n showSearch={tableProps.enableFiltering}\n toolbar={toolbarSlot}\n bulkActions={bulkActions as ((selectedRows: unknown[]) => ReactNode) | undefined}\n />\n <DataTableContent />\n {tableProps.enablePagination && <DataTablePagination />}\n </DataTable>\n )\n}\nDataTablePreset.displayName = \"DataTablePreset\"\n\nexport type {\n ColumnDef,\n ColumnFiltersState,\n PaginationState,\n RowSelectionState,\n SortingState,\n VisibilityState,\n} from \"@tanstack/react-table\"\n","\"use client\"\n\n/**\n * FilterBar — a compound filter row. `<FilterBar>` holds the (always\n * controlled) filter values on context; the select, multi-select, active-chip\n * and clear parts read and update them. `FilterBarPreset` builds the whole row\n * from a `FilterConfig[]`.\n */\nimport {\n createContext,\n forwardRef,\n useContext,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\"\nimport { ChevronDown, X } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { Button } from \"../ui/button\"\nimport { Checkbox } from \"../ui/checkbox\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../ui/select\"\nimport type { FilterConfig, FilterOption, FilterValues } from \"../lib/types\"\n\n/* --------------------------------------------------------------- context */\n\ninterface FilterBarContextValue {\n /** Current filter values (controlled from outside) */\n value: FilterValues\n /** Notify the parent of a value change */\n onChange: (next: FilterValues) => void\n /** Optional clear callback — undefined means no clear button */\n onClear?: () => void\n}\n\nconst FilterBarContext = createContext<FilterBarContextValue | null>(null)\n\nfunction useFilterBar(): FilterBarContextValue {\n const ctx = useContext(FilterBarContext)\n if (!ctx) throw new Error(\"useFilterBar must be used within <FilterBar>\")\n return ctx\n}\n\n/* ------------------------------------------------------------------ root */\n\nexport interface FilterBarProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n value: FilterValues\n onChange: (values: FilterValues) => void\n onClear?: () => void\n className?: string\n children?: ReactNode\n}\n\nexport const FilterBar = forwardRef<HTMLDivElement, FilterBarProps>(\n ({ value, onChange, onClear, className, children, ...props }, ref) => (\n <FilterBarContext.Provider value={{ value, onChange, onClear }}>\n <div\n ref={ref}\n role=\"search\"\n aria-label=\"フィルター\"\n data-slot=\"filter-bar\"\n className={cn(\"flex flex-wrap items-center gap-2\", className)}\n {...props}\n >\n {children}\n </div>\n </FilterBarContext.Provider>\n ),\n)\nFilterBar.displayName = \"FilterBar\"\n\n/* ---------------------------------------------------------------- select */\n\nexport interface FilterBarSelectProps {\n filterKey: string\n label: string\n options: FilterOption[]\n placeholder?: string\n /**\n * 渡すと、選択肢の先頭に「絞り込まない」項目をこの文言で足す(例: `\"すべて\"`)。選ぶとこのキーを値から外す(`undefined`)ので、\n * アクティブチップにも出ない。絞り込んでいないときのトリガーは `placeholder`(既定は `label`)のまま。既定は足さない。\n * @example allLabel=\"すべて\"\n */\n allLabel?: string\n className?: string\n}\n\n/** 「すべて」項目の値。実際の選択肢の値と衝突しない内部用の印で、`onChange` には渡らない。 */\nconst ALL_VALUE = \"__squadkit_all__\"\n\nexport function FilterBarSelect({\n filterKey,\n label,\n options,\n placeholder,\n allLabel,\n className,\n}: FilterBarSelectProps) {\n const { value, onChange } = useFilterBar()\n const hasAll = allLabel !== undefined\n const items = hasAll ? [{ value: ALL_VALUE, label: allLabel }, ...options] : options\n const current = value[filterKey] as string | undefined\n\n // Base UI reports `null` when the selection is cleared — drop the key so\n // \"no filter\" reads as absent rather than as an empty string. \"すべて\" does the same.\n const handleChange = (selected: string | null) =>\n onChange({ ...value, [filterKey]: selected === null || selected === ALL_VALUE ? undefined : selected })\n\n return (\n <Select\n // FilterOption is already `{ value, label }` — Base UI uses it to show the\n // label (not the raw value) in the trigger.\n items={items}\n value={current ?? \"\"}\n onValueChange={handleChange}\n >\n <SelectTrigger size=\"sm\" aria-label={label} data-slot=\"filter-bar-select\" className={className}>\n <SelectValue placeholder={placeholder ?? label} />\n </SelectTrigger>\n <SelectContent>\n {hasAll && <SelectItem value={ALL_VALUE}>{allLabel}</SelectItem>}\n {options.map((option) => (\n <SelectItem key={option.value} value={option.value} disabled={option.disabled}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n}\nFilterBarSelect.displayName = \"FilterBarSelect\"\n\n/* ---------------------------------------------------------- multi-select */\n\nexport interface FilterBarMultiSelectProps {\n filterKey: string\n label: string\n options: FilterOption[]\n placeholder?: string\n className?: string\n}\n\nexport function FilterBarMultiSelect({\n filterKey,\n label,\n options,\n placeholder,\n className,\n}: FilterBarMultiSelectProps) {\n const { value, onChange } = useFilterBar()\n const selected = (value[filterKey] as string[] | undefined) ?? []\n\n const handleToggle = (option: string) => {\n const next = selected.includes(option)\n ? selected.filter((v) => v !== option)\n : [...selected, option]\n // Drop the key entirely when nothing is left, so \"no filter\" reads as absent.\n onChange({ ...value, [filterKey]: next.length > 0 ? next : undefined })\n }\n\n return (\n <Popover>\n <PopoverTrigger\n render={<Button variant=\"outline\" size=\"sm\" className={cn(\"h-8 gap-1\", className)} />}\n aria-label={`${placeholder ?? label}${selected.length > 0 ? ` (${selected.length}件選択中)` : \"\"}`}\n data-slot=\"filter-bar-multi-select\"\n >\n {placeholder ?? label}\n {selected.length > 0 && (\n <Badge variant=\"secondary\" className=\"ml-1 px-1.5 py-0 text-xs\">\n {selected.length}\n </Badge>\n )}\n <ChevronDown className=\"size-3.5 opacity-50\" aria-hidden=\"true\" />\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-56 p-2\">\n <div className=\"flex flex-col gap-1\" role=\"group\" aria-label={label}>\n {options.map((option) => (\n <label\n key={option.value}\n className=\"flex cursor-pointer items-center gap-2 rounded-sm px-2 py-1.5 text-sm hover:bg-accent\"\n >\n <Checkbox\n checked={selected.includes(option.value)}\n disabled={option.disabled}\n onCheckedChange={() => handleToggle(option.value)}\n />\n {option.label}\n </label>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )\n}\nFilterBarMultiSelect.displayName = \"FilterBarMultiSelect\"\n\n/* ---------------------------------------------------------- active chips */\n\nexport interface FilterBarActiveChipsProps {\n /** Filter configs used to resolve option labels. Without them, raw values show. */\n filters?: FilterConfig[]\n className?: string\n}\n\ninterface ActiveChip {\n key: string\n filterLabel: string\n optionLabel: string\n optionValue?: string\n isMulti: boolean\n}\n\nexport function FilterBarActiveChips({ filters, className }: FilterBarActiveChipsProps) {\n const { value, onChange } = useFilterBar()\n\n const getActiveChips = (): ActiveChip[] => {\n const chips: ActiveChip[] = []\n\n const pushRaw = (key: string, v: string | string[]) => {\n if (typeof v === \"string\") {\n chips.push({ key, filterLabel: key, optionLabel: v, isMulti: false })\n } else {\n for (const val of v) {\n chips.push({ key, filterLabel: key, optionLabel: val, optionValue: val, isMulti: true })\n }\n }\n }\n\n for (const [key, v] of Object.entries(value)) {\n if (v === undefined || v === \"\") continue\n\n const filter = filters?.find((f) => f.key === key)\n if (!filter) {\n pushRaw(key, v)\n continue\n }\n\n if (filter.type === \"select\" && typeof v === \"string\") {\n const option = filter.options?.find((o) => o.value === v)\n chips.push({\n key,\n filterLabel: filter.label,\n optionLabel: option?.label ?? v,\n isMulti: false,\n })\n } else if (filter.type === \"multi-select\" && Array.isArray(v)) {\n for (const val of v) {\n const option = filter.options?.find((o) => o.value === val)\n chips.push({\n key,\n filterLabel: filter.label,\n optionLabel: option?.label ?? val,\n optionValue: val,\n isMulti: true,\n })\n }\n }\n }\n\n return chips\n }\n\n const handleRemoveFilter = (key: string, optionValue?: string) => {\n if (optionValue !== undefined) {\n const current = (value[key] as string[] | undefined) ?? []\n const next = current.filter((v) => v !== optionValue)\n onChange({ ...value, [key]: next.length > 0 ? next : undefined })\n } else {\n onChange({ ...value, [key]: undefined })\n }\n }\n\n const activeChips = getActiveChips()\n\n if (activeChips.length === 0) return null\n\n return (\n <>\n {activeChips.map((chip) => (\n <Badge\n key={`${chip.key}-${chip.optionValue ?? \"single\"}`}\n variant=\"secondary\"\n className={cn(\"gap-1 pr-1\", className)}\n data-slot=\"filter-bar-chip\"\n >\n <span className=\"text-xs text-muted-foreground\">{chip.filterLabel}:</span>\n {chip.optionLabel}\n <button\n type=\"button\"\n className=\"ml-0.5 rounded-full p-0.5 hover:bg-muted-foreground/20\"\n onClick={() => handleRemoveFilter(chip.key, chip.optionValue)}\n aria-label={`${chip.filterLabel}: ${chip.optionLabel} を削除`}\n >\n <X className=\"size-3\" aria-hidden=\"true\" />\n </button>\n </Badge>\n ))}\n </>\n )\n}\nFilterBarActiveChips.displayName = \"FilterBarActiveChips\"\n\n/* ----------------------------------------------------------- clear button */\n\nexport interface FilterBarClearButtonProps {\n /** Override the button label. Defaults to \"クリア\". */\n label?: string\n className?: string\n}\n\nexport function FilterBarClearButton({ label = \"クリア\", className }: FilterBarClearButtonProps) {\n const { value, onClear } = useFilterBar()\n const hasActiveFilters = Object.values(value).some((v) =>\n Array.isArray(v) ? v.length > 0 : v !== undefined && v !== \"\",\n )\n if (!hasActiveFilters || !onClear) return null\n\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\"h-7 px-2 text-xs\", className)}\n onClick={onClear}\n aria-label=\"すべてのフィルターをクリア\"\n data-slot=\"filter-bar-clear-button\"\n >\n {label}\n </Button>\n )\n}\nFilterBarClearButton.displayName = \"FilterBarClearButton\"\n\n/* ------------------------------------------------------------------ preset */\n\nexport interface FilterBarPresetProps {\n filters: FilterConfig[]\n value: FilterValues\n onChange: (values: FilterValues) => void\n onClear?: () => void\n className?: string\n}\n\n/** Not given yet (a draft fills props in steps): render empty, keep the same value between renders. */\nconst NO_FILTERS: never[] = []\nconst NO_FILTER_VALUES: FilterValues = {}\n\n/** The whole row built from a `FilterConfig[]`. */\nexport function FilterBarPreset({\n filters = NO_FILTERS,\n value = NO_FILTER_VALUES,\n onChange,\n onClear,\n className,\n}: FilterBarPresetProps) {\n return (\n <FilterBar value={value} onChange={onChange} onClear={onClear} className={className}>\n {filters.map((filter) => {\n if (filter.type === \"select\") {\n return (\n <FilterBarSelect\n key={filter.key}\n filterKey={filter.key}\n label={filter.label}\n placeholder={filter.placeholder}\n allLabel={filter.allLabel}\n options={filter.options ?? []}\n />\n )\n }\n if (filter.type === \"multi-select\") {\n return (\n <FilterBarMultiSelect\n key={filter.key}\n filterKey={filter.key}\n label={filter.label}\n placeholder={filter.placeholder}\n options={filter.options ?? []}\n />\n )\n }\n return null\n })}\n <FilterBarActiveChips filters={filters} />\n {onClear && <FilterBarClearButton />}\n </FilterBar>\n )\n}\nFilterBarPreset.displayName = \"FilterBarPreset\"\n","\"use client\"\n\n/**\n * DateRangePicker — a range calendar in a popover with quick presets down the\n * side. On mobile the presets stack above a single month; on desktop they sit\n * beside a two-month view.\n */\nimport { forwardRef, useCallback, useMemo, useState } from \"react\"\nimport { CalendarIcon } from \"lucide-react\"\nimport {\n addMonths,\n endOfDay,\n endOfMonth,\n endOfWeek,\n format,\n isSameDay,\n startOfDay,\n startOfMonth,\n startOfWeek,\n subDays,\n subMonths,\n subWeeks,\n} from \"date-fns\"\nimport { ja } from \"date-fns/locale\"\nimport type { DateRange as RdpDateRange } from \"react-day-picker\"\n\nimport { cn } from \"../lib/utils\"\nimport { useIsMobile } from \"../hooks/use-mobile\"\nimport { Button } from \"../ui/button\"\nimport { Calendar } from \"../ui/calendar\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\"\nimport type { DateRange, PresetItem } from \"../lib/types\"\n\n/** 会計年度の開始月の既定(4 月始まり)。 */\nexport const DEFAULT_FISCAL_YEAR_START_MONTH = 4\n\n/**\n * ラベルの言語の既定(英語)。他部品の `DEFAULT_LOCALE`(ja-JP)とは違い、この部品だけ英語を既定にしている。\n * 従来のプリセットが英語で、既存の利用者の見た目を変えないため。日本語にするなら `locale=\"ja-JP\"` を渡す。\n */\nexport const DEFAULT_DATE_PICKER_LOCALE = \"en-US\"\n\n/** 1〜12 の整数だけを開始月として受け、それ以外は既定の 4 月に戻す。 */\nexport function normalizeFiscalYearStartMonth(month: number | undefined): number {\n return typeof month === \"number\" && Number.isInteger(month) && month >= 1 && month <= 12\n ? month\n : DEFAULT_FISCAL_YEAR_START_MONTH\n}\n\n/**\n * `date` を含む年度(または年度基準の四半期)の全期間。`offset` で前後にずらす(`-1` が前の年度/四半期)。\n * 年度は `fiscalYearStartMonth`(1-12)の 1 日に始まり 12 か月続く。四半期は年度の初日から 3 か月ごと。\n *\n * @example\n * // 4 月始まりで 2026-02-10 は 2025 年度(2025-04-01〜2026-03-31)\n * fiscalPeriodRange(new Date(2026, 1, 10), { unit: \"year\", fiscalYearStartMonth: 4 })\n */\nexport function fiscalPeriodRange(\n date: Date,\n { unit, fiscalYearStartMonth, offset = 0 }: { unit: \"year\" | \"quarter\"; fiscalYearStartMonth?: number; offset?: number },\n): { from: Date; to: Date } {\n const startMonth = normalizeFiscalYearStartMonth(fiscalYearStartMonth)\n const length = unit === \"year\" ? 12 : 3\n const sinceYearStart = (date.getMonth() - (startMonth - 1) + 12) % 12\n const into = unit === \"year\" ? sinceYearStart : sinceYearStart % 3\n const periodStart = addMonths(startOfMonth(subMonths(date, into)), offset * length)\n return { from: periodStart, to: endOfMonth(addMonths(periodStart, length - 1)) }\n}\n\nconst PRESET_LABELS = {\n ja: {\n today: \"今日\",\n yesterday: \"昨日\",\n last7: \"過去 7 日間\",\n last14: \"過去 14 日間\",\n last28: \"過去 28 日間\",\n last30: \"過去 30 日間\",\n last90: \"過去 90 日間\",\n thisWeek: \"今週\",\n lastWeek: \"先週\",\n thisMonth: \"今月\",\n lastMonth: \"先月\",\n thisQuarter: \"今四半期\",\n lastQuarter: \"前四半期\",\n thisFiscalYear: \"今年度\",\n lastFiscalYear: \"前年度\",\n },\n en: {\n today: \"Today\",\n yesterday: \"Yesterday\",\n last7: \"Last 7 days\",\n last14: \"Last 14 days\",\n last28: \"Last 28 days\",\n last30: \"Last 30 days\",\n last90: \"Last 90 days\",\n thisWeek: \"This week\",\n lastWeek: \"Last week\",\n thisMonth: \"This month\",\n lastMonth: \"Last month\",\n thisQuarter: \"This quarter\",\n lastQuarter: \"Last quarter\",\n thisFiscalYear: \"This fiscal year\",\n lastFiscalYear: \"Last fiscal year\",\n },\n} as const\n\nconst isJapanese = (locale: string) => locale.toLowerCase().startsWith(\"ja\")\n\n/** 週の始まり(月曜)。日本のビジネス慣習に合わせ、「今週」「先週」はどの locale でも月曜始まり。 */\nconst WEEK_OPTIONS = { weekStartsOn: 1 } as const\n\n/** カレンダーに渡す date-fns の locale。`ja*` なら日本語、それ以外は react-day-picker の既定(英語)。 */\nconst calendarLocale = (locale: string) => (isJapanese(locale) ? ja : undefined)\n\n/**\n * 既定のプリセット一覧を作る。ラベルは `locale`(`ja*` なら日本語、それ以外は英語)、\n * 「今四半期」「前四半期」「今年度」「前年度」は `fiscalYearStartMonth` を基準にする。\n * 「今〜」は期の初日から今日まで、「前〜」「先月」「先週」は前の期の全期間。週は月曜始まり。`getValue` は押した時点の日付で計算する。\n *\n * @example\n * createDatePresets({ locale: \"ja-JP\", fiscalYearStartMonth: 4 })\n */\nexport function createDatePresets({\n locale = DEFAULT_DATE_PICKER_LOCALE,\n fiscalYearStartMonth = DEFAULT_FISCAL_YEAR_START_MONTH,\n now = () => new Date(),\n}: { locale?: string; fiscalYearStartMonth?: number; now?: () => Date } = {}): PresetItem[] {\n const t = PRESET_LABELS[isJapanese(locale) ? \"ja\" : \"en\"]\n const startMonth = normalizeFiscalYearStartMonth(fiscalYearStartMonth)\n const lastDays = (days: number) => () => {\n const today = now()\n return { from: startOfDay(subDays(today, days - 1)), to: endOfDay(today) }\n }\n const toDate = (unit: \"year\" | \"quarter\") => () => {\n const today = now()\n return {\n from: fiscalPeriodRange(today, { unit, fiscalYearStartMonth: startMonth }).from,\n to: endOfDay(today),\n }\n }\n const previous = (unit: \"year\" | \"quarter\") => () =>\n fiscalPeriodRange(now(), { unit, fiscalYearStartMonth: startMonth, offset: -1 })\n return [\n { label: t.today, getValue: lastDays(1) },\n {\n label: t.yesterday,\n getValue: () => {\n const yesterday = subDays(now(), 1)\n return { from: startOfDay(yesterday), to: endOfDay(yesterday) }\n },\n },\n { label: t.last7, getValue: lastDays(7) },\n { label: t.last14, getValue: lastDays(14) },\n { label: t.last28, getValue: lastDays(28) },\n { label: t.last30, getValue: lastDays(30) },\n { label: t.last90, getValue: lastDays(90) },\n {\n label: t.thisWeek,\n getValue: () => {\n const today = now()\n return { from: startOfWeek(today, WEEK_OPTIONS), to: endOfDay(today) }\n },\n },\n {\n label: t.lastWeek,\n getValue: () => {\n const lastWeek = subWeeks(now(), 1)\n return { from: startOfWeek(lastWeek, WEEK_OPTIONS), to: endOfWeek(lastWeek, WEEK_OPTIONS) }\n },\n },\n {\n label: t.thisMonth,\n getValue: () => {\n const today = now()\n return { from: startOfMonth(today), to: endOfDay(today) }\n },\n },\n {\n label: t.lastMonth,\n getValue: () => {\n const lastMonth = subMonths(now(), 1)\n return { from: startOfMonth(lastMonth), to: endOfMonth(lastMonth) }\n },\n },\n { label: t.thisQuarter, getValue: toDate(\"quarter\") },\n { label: t.lastQuarter, getValue: previous(\"quarter\") },\n { label: t.thisFiscalYear, getValue: toDate(\"year\") },\n { label: t.lastFiscalYear, getValue: previous(\"year\") },\n ]\n}\n\n/**\n * `value` と日単位で同じ範囲を返す最初のプリセットを探す(無ければ `undefined`)。`getValue` は呼んだ時点の日付で計算される。\n * 「今日」と「今週」が月曜に重なるときなど、複数が一致したら並びの早いほうを返す。\n */\nexport function findMatchingPreset(presets: PresetItem[], value: DateRange | undefined): PresetItem | undefined {\n const { from, to } = value ?? {}\n if (!from || !to) return undefined\n return presets.find((preset) => {\n const range = preset.getValue()\n return range.from != null && range.to != null && isSameDay(range.from, from) && isSameDay(range.to, to)\n })\n}\n\n/** 既定のプリセット(英語・4 月始まり)。`locale` / `fiscalYearStartMonth` を変えるなら `createDatePresets` か DateRangePicker の同名 props。 */\nexport const defaultPresets: PresetItem[] = createDatePresets()\n\nexport interface DateRangePickerProps {\n /**\n * 選択中の日付範囲。型はこの部品独自の `DateRange`。\n * react-day-picker の `DateRange` とは別物なので注意 — そちらが必要なら\n * このファイルの末尾で re-export している `RdpDateRange` を使う。\n *\n * @example\n * import { DateRangePicker, type DateRange } from \"@/components/date-range-picker\"\n * // Vantage: import { DateRangePicker, type DateRange } from \"@squadbase/vantage/components\"\n *\n * const [range, setRange] = useState<DateRange | undefined>()\n * <DateRangePicker value={range} onChange={setRange} />\n */\n value?: DateRange\n onChange?: (range: DateRange) => void\n /**\n * ショートカットの一覧。指定すると `locale` / `fiscalYearStartMonth` による既定の一覧の代わりに使う。\n *\n * @example\n * presets={[{ label: \"直近 10 日\", getValue: () => ({ from: subDays(new Date(), 9), to: new Date() }) }]}\n */\n presets?: PresetItem[]\n showPresets?: boolean\n /**\n * プリセットのラベルとカレンダーの月名・曜日の言語。`ja*` なら日本語、それ以外は英語。既定 `\"en-US\"`(英語)。\n * 他部品の既定は ja-JP だが、この部品は従来のプリセットが英語だったので既存の見た目を保つため英語を既定にしている。\n *\n * @example\n * <DateRangePicker locale=\"ja-JP\" />\n */\n locale?: string\n /**\n * 年度の開始月(1-12)。「今年度」「前年度」と、年度基準の「今四半期」「前四半期」の区切りになる。既定 `4`(4 月始まり)。\n * 範囲外・整数でない値は 4 として扱う。\n *\n * @example\n * <DateRangePicker fiscalYearStartMonth={1} />\n */\n fiscalYearStartMonth?: number\n maxDate?: Date\n minDate?: Date\n placeholder?: string\n disabled?: boolean\n className?: string\n align?: \"start\" | \"center\" | \"end\"\n}\n\nexport const DateRangePicker = forwardRef<HTMLDivElement, DateRangePickerProps>(\n function DateRangePicker(\n {\n value,\n onChange,\n presets: presetsProp,\n showPresets = true,\n locale = DEFAULT_DATE_PICKER_LOCALE,\n fiscalYearStartMonth = DEFAULT_FISCAL_YEAR_START_MONTH,\n maxDate,\n minDate,\n placeholder = \"期間を選択\",\n disabled = false,\n className,\n align = \"start\",\n },\n ref,\n ) {\n const [open, setOpen] = useState(false)\n const isMobile = useIsMobile()\n const presets = useMemo(\n () => presetsProp ?? createDatePresets({ locale, fiscalYearStartMonth }),\n [presetsProp, locale, fiscalYearStartMonth],\n )\n\n const handleCalendarSelect = useCallback(\n (range: RdpDateRange | undefined) => {\n onChange?.({ from: range?.from, to: range?.to })\n },\n [onChange],\n )\n\n const handlePresetClick = useCallback(\n (preset: PresetItem) => {\n onChange?.(preset.getValue())\n setOpen(false)\n },\n [onChange],\n )\n\n const formatDateRange = () => {\n if (!value?.from) return placeholder\n if (!value.to) return format(value.from, \"yyyy/MM/dd\")\n return `${format(value.from, \"yyyy/MM/dd\")} - ${format(value.to, \"yyyy/MM/dd\")}`\n }\n // 選んだ期間がプリセットの結果と一致するときは、日付の前にそのプリセット名を出す。\n const selectedPreset = findMatchingPreset(presets, value)\n const presetLabel = selectedPreset?.label\n\n // 開いたとき、右の月が終了月・左がその前月になるよう、表示月(左の月)を決める。1 か月表示(モバイル)は終了月。\n const endMonth = value?.to ?? value?.from\n const defaultMonth = endMonth ? (isMobile ? endMonth : subMonths(endMonth, 1)) : undefined\n\n const calendarSelected: RdpDateRange | undefined = value?.from\n ? { from: value.from, to: value.to ?? undefined }\n : undefined\n\n return (\n <div ref={ref} data-slot=\"date-range-picker\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-auto justify-start text-left font-normal\",\n !value?.from && \"text-muted-foreground\",\n className,\n )}\n />\n }\n aria-label={presetLabel ? `${presetLabel} ${formatDateRange()}` : formatDateRange()}\n aria-expanded={open}\n >\n <CalendarIcon className=\"size-4\" aria-hidden=\"true\" />\n {presetLabel ? (\n <>\n <span>{presetLabel}</span>\n <span className=\"text-muted-foreground\">{formatDateRange()}</span>\n </>\n ) : (\n <span>{formatDateRange()}</span>\n )}\n </PopoverTrigger>\n <PopoverContent\n align={align}\n className={cn(\"w-auto gap-0 p-0\", isMobile ? \"flex-col\" : \"flex-row\")}\n >\n {showPresets && (\n <div className={cn(\"flex flex-col gap-1 p-3\", isMobile ? \"border-b\" : \"border-r\")}>\n {presets.map((preset) => (\n <Button\n key={preset.label}\n variant=\"ghost\"\n size=\"sm\"\n aria-pressed={selectedPreset === preset}\n className={cn(\n \"justify-start text-xs\",\n selectedPreset === preset && \"bg-primary/10 text-primary hover:bg-primary/15 hover:text-primary\",\n )}\n onClick={() => handlePresetClick(preset)}\n >\n {preset.label}\n </Button>\n ))}\n </div>\n )}\n <div className=\"p-3\">\n <Calendar\n key={`${open}-${isMobile}`}\n mode=\"range\"\n defaultMonth={defaultMonth}\n locale={calendarLocale(locale)}\n weekStartsOn={isJapanese(locale) ? 1 : undefined}\n numberOfMonths={isMobile ? 1 : 2}\n selected={calendarSelected}\n onSelect={handleCalendarSelect}\n disabled={(date) => {\n if (maxDate && date > maxDate) return true\n if (minDate && date < minDate) return true\n return false\n }}\n />\n </div>\n </PopoverContent>\n </Popover>\n </div>\n )\n },\n)\nDateRangePicker.displayName = \"DateRangePicker\"\n\nexport type { DateRange as RdpDateRange } from \"react-day-picker\"\n","\"use client\"\n\n/**\n * SegmentedControl — a single-select row of buttons over `ToggleGroup`. Base\n * UI's toggle group is multi-value by default, so this wrapper narrows it to\n * one value and refuses to deselect the active segment.\n */\nimport { forwardRef } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { ToggleGroup, ToggleGroupItem } from \"../ui/toggle-group\"\nimport type { SegmentOption } from \"../lib/types\"\n\nconst iconSizes = {\n sm: \"size-3.5\",\n default: \"size-4\",\n lg: \"size-5\",\n} as const\n\nexport interface SegmentedControlProps {\n options: SegmentOption[]\n value: string\n onChange: (value: string) => void\n size?: keyof typeof iconSizes\n fullWidth?: boolean\n ariaLabel?: string\n className?: string\n}\n\n/** Not given yet (a draft fills props in steps): render empty, keep the same value between renders. */\nconst NO_OPTIONS: never[] = []\n\nexport const SegmentedControl = forwardRef<HTMLDivElement, SegmentedControlProps>(\n function SegmentedControl(\n { options = NO_OPTIONS, value, onChange, size = \"default\", fullWidth = false, ariaLabel, className },\n ref,\n ) {\n return (\n <ToggleGroup\n ref={ref}\n data-slot=\"segmented-control\"\n value={[value]}\n onValueChange={(next) => {\n // Base UI reports the full pressed set; keep the newly added segment\n // and ignore the empty set so the control never loses its selection.\n const picked = next.find((item) => item !== value) ?? next[0]\n if (typeof picked === \"string\") onChange(picked)\n }}\n variant=\"outline\"\n size={size}\n spacing={0}\n aria-label={ariaLabel}\n className={cn(fullWidth && \"w-full\", className)}\n >\n {options.map((option) => {\n const Icon = option.icon\n return (\n <ToggleGroupItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n aria-label={option.label}\n className={cn(fullWidth && \"flex-1\")}\n >\n {Icon && <Icon className={iconSizes[size]} aria-hidden=\"true\" />}\n {option.label}\n </ToggleGroupItem>\n )\n })}\n </ToggleGroup>\n )\n },\n)\nSegmentedControl.displayName = \"SegmentedControl\"\n","/**\n * Shared data shapes for the composite dashboard components. Kept in one place\n * so filters, metrics and date pickers agree on the same vocabulary.\n */\nimport type { ComponentType, HTMLAttributes, ReactNode } from \"react\"\nimport type { EChartsOption } from \"echarts\"\nimport type { ValueFormat } from \"./format\"\n\n/* ---------------------------------------------------------------- filters */\n\nexport interface FilterOption {\n label: string\n value: string\n count?: number\n disabled?: boolean\n}\n\nexport type FilterType = \"select\" | \"multi-select\" | \"date-range\" | \"search\"\n\nexport interface FilterConfig {\n /** Unique key for this filter */\n key: string\n /** Display label */\n label: string\n /** Filter input type */\n type: FilterType\n /** Available options (for select/multi-select) */\n options?: FilterOption[]\n /** Placeholder text */\n placeholder?: string\n /** `select` のみ。渡すと先頭に「絞り込まない」項目をこの文言で足す(例: `\"すべて\"`)。 */\n allLabel?: string\n /** Default value */\n defaultValue?: string | string[]\n}\n\nexport type FilterValues = Record<string, string | string[] | undefined>\n\nexport interface SegmentOption {\n label: string\n value: string\n icon?: ComponentType<{ className?: string }>\n disabled?: boolean\n}\n\n/* ------------------------------------------------------------------ dates */\n\nexport interface DateRange {\n from: Date | undefined\n to: Date | undefined\n}\n\nexport interface PresetItem {\n label: string\n getValue: () => DateRange\n}\n\n/* ---------------------------------------------------------------- metrics */\n\nexport type TrendDirection = \"up\" | \"down\" | \"neutral\"\n\nexport type MetricVariant = \"default\" | \"primary\" | \"accent\" | \"muted\"\n\nexport interface MetricItem {\n /** Unique identifier for the metric */\n id: string\n /** Display label for the metric */\n label: string\n /** Current value (formatted string or number) */\n value: string | number\n /** Optional unit suffix (e.g. \"円\", \"%\", \"件\") */\n unit?: string\n /** Trend direction */\n trend?: TrendDirection\n /** Trend change value */\n trendValue?: number\n /** Optional description or subtitle */\n description?: string\n /** Whether higher values are positive (default: true) */\n positiveIsGood?: boolean\n /** Visual emphasis variant */\n variant?: MetricVariant\n}\n\n/* ------------------------------------------------------------- navigation */\n\nexport interface NavItem {\n /** Display label */\n label: string\n /** Route path or URL */\n href: string\n /** Icon component (e.g. a `lucide-react` icon) */\n icon?: ComponentType<{ className?: string }>\n /** Whether this item is currently active */\n isActive?: boolean\n /** Whether this item is disabled */\n disabled?: boolean\n /** Optional badge text (e.g. notification count) */\n badge?: string\n /** Nested child items */\n children?: NavItem[]\n}\n\nexport interface NavGroup {\n /** Group label */\n label?: string\n /** Items in this group */\n items: NavItem[]\n}\n\n/* ----------------------------------------------------------------- select */\n\nexport interface SelectOption {\n value: string\n label: string\n disabled?: boolean\n icon?: ComponentType<{ className?: string }>\n description?: ReactNode\n}\n\nexport interface SelectOptionGroup {\n label: string\n options: SelectOption[]\n}\n\nexport type SelectOptions = SelectOption[] | SelectOptionGroup[]\n\nexport function isGroupedOptions(options: SelectOptions): options is SelectOptionGroup[] {\n return options.length > 0 && \"options\" in options[0]!\n}\n\nexport function flattenOptions(options: SelectOptions): SelectOption[] {\n if (isGroupedOptions(options)) {\n return options.flatMap((group) => group.options)\n }\n return options\n}\n\n/* ----------------------------------------------------------------- charts */\n\n/**\n * A chart colour: one of the theme's series tokens (`\"chart-1\"`〜`\"chart-5\"`,\n * which follow light/dark) or any CSS colour (`\"#16a34a\"`, `\"var(--destructive)\"`).\n * Not a Tailwind class — the ECharts-based charts paint on a canvas.\n */\nexport type ChartColor = \"chart-1\" | \"chart-2\" | \"chart-3\" | \"chart-4\" | \"chart-5\" | (string & {})\n\n/** Formats a value for tooltips, axes and labels (e.g. `(v) => \\`¥${v.toLocaleString()}\\``). */\nexport type ValueFormatter = (value: number) => string\n\n/** What a typed chart reports through `onValueChange`; `null` when the selection is cleared. */\nexport type ChartEventPayload = {\n /** What was clicked: a bar, a line/area point, or a donut slice. */\n eventType: \"bar\" | \"dot\" | \"slice\"\n /** The series (`categories` entry) or slice name that was clicked. */\n categoryClicked: string\n /** The clicked row of `data`, spread in. */\n [key: string]: unknown\n} | null\n\n/** The theme's series tokens — the only colours a typed chart's `colors` accepts. Fixed order. */\nexport type ChartColorToken = \"chart-1\" | \"chart-2\" | \"chart-3\" | \"chart-4\" | \"chart-5\"\n\n/**\n * 意味色。`\"positive\"`(良い)・`\"warning\"`(注意)・`\"negative\"`(悪い)・`\"neutral\"`(中立)。\n * テーマの `--positive` / `--warning` / `--negative` / `--neutral` に解決され、light/dark に追従する。\n */\nexport type ChartTone = \"positive\" | \"warning\" | \"negative\" | \"neutral\"\n\n/** A typed chart's series colour: a series token or a meaning colour (`ChartTone`). */\nexport type ChartSeriesColor = ChartColorToken | ChartTone\n\n/**\n * Series colours for a typed chart: tokens / meaning colours by series position\n * (cycled), or a record from category to colour (unlisted categories keep their\n * positional token).\n */\nexport type ChartColors<T extends Record<string, unknown> = Record<string, unknown>> =\n | ChartSeriesColor[]\n | Partial<Record<keyof T & string, ChartSeriesColor>>\n\n/**\n * 値の範囲で棒・セルの色(意味色)を決める 1 つの規則。`lt`(未満)・`lte`(以下)・`gt`(より大きい)・`gte`(以上)を\n * 1 つ以上書く。複数書いたら全部を満たす値だけが当たる(`gte: 40, lt: 70` なら `40 <= 値 < 70`)。\n * 規則は配列の上から順に見て、**最初に当たった規則**の意味色になる(どれにも当たらない値は通常色)。\n * そのため厳しい規則(`gt: 10`)を先に、ゆるい規則(`gt: 7`)を後に書く。条件が 1 つも無い規則は当たらない。\n * 例 `[{ gt: 10, tone: \"negative\" }, { gt: 7, tone: \"warning\" }]`(10 超は赤、7 超は黄)\n */\nexport interface ChartThreshold {\n /** この値未満に当たる。 */\n lt?: number\n /** この値以下に当たる。 */\n lte?: number\n /** この値より大きいときに当たる(「10% 超で赤」)。 */\n gt?: number\n /** この値以上に当たる。 */\n gte?: number\n tone: ChartTone\n}\n\n/** What an empty chart says instead of a blank plot. The frame keeps its height. */\nexport interface ChartEmptyState {\n /** 既定「表示できるデータがありません」。 */\n title?: string\n description?: string\n /** 1 つだけ置ける操作(「期間を広げる」ボタンなど)。 */\n action?: ReactNode\n}\n\n/** `\"auto\"`: label the max and latest point of the first series (≤ 2 series only). */\nexport type ChartHighlight = \"auto\" | \"none\"\n\n/** A forecast row: the same `index` key as `data`, plus the predicted value and an optional range. */\nexport type ChartForecastRow = Record<string, unknown> & {\n value: number | null\n lower?: number\n upper?: number\n}\n\n/**\n * Forecast continuing one series (Line / Area). Always drawn as a 2px dashed, lighter\n * line starting at the last actual point, with a boundary line labelled 「予測 →」\n * (the same word as the legend) — there is no way to draw it solid.\n */\nexport interface ChartForecast<T extends Record<string, unknown> = Record<string, unknown>> {\n /** 予測の行。`index` の列は実績と同じキーで持つ。 */\n data: ChartForecastRow[]\n /** 予測が続ける系列。既定 `categories[0]`(比較系列は除く)。 */\n category?: keyof T & string\n /** 凡例・ツールチップ・境目の縦線の上端に出す名前。既定「予測」(境目では「予測 →」と矢印が付く)。 */\n label?: string\n}\n\n/**\n * The series a Line / Area chart compares the others against (last year, the plan…): `category`\n * is one of `categories`, `vs` says what it is (the same enum as `KpiCard`'s `comparison.vs`).\n * It is drawn as a thin muted line with no markers and no `--chart-*` colour, and the tooltip adds\n * the main series' difference from it (\"↑ +12.4% 前年同月比\"). Colour, width and wording are not props.\n * With `vs: \"custom\"` the `label` names the baseline (\"昨日比\"); for the other `vs` it is optional.\n */\nexport type ChartComparison<K extends string = string> = { category: K } & (\n | { vs: \"prior-period\" | \"prior-year\" | \"target\"; label?: string }\n | { vs: \"custom\"; label: string }\n)\n\n/**\n * 任意の位置への注記(折れ線・面・縦の棒)。`at` は `index` の値(例 `\"2026-04\"`)。`to` を足すと\n * `at`〜`to` の区間(薄い帯)、無ければ `at` の位置の縦線。色は中立(意味色は使わない)で、\n * `index` に無い値の注記は描かない。例 `{ at: \"2026-04\", label: \"料金改定\" }`、\n * `{ at: \"2026-08\", to: \"2026-09\", label: \"キャンペーン\" }`\n */\nexport interface ChartAnnotation {\n /** 注記の位置(区間なら始点)。`index` 列の値と同じ形で渡す。 */\n at: string | number\n /** 注記の文言(短く。事実の記述だけ)。 */\n label: string\n /** 区間の終点(`index` の値)。省略すると `at` の縦線。 */\n to?: string | number\n}\n\n/**\n * `actions` に渡せる PNG 操作の設定。`actions={true}` は `{}` と同じ。\n */\nexport interface ChartActionsOptions {\n /**\n * 保存・コピーする PNG に、グラフの見出し(`title`)と要約(`summary`)を画像の上に含める。\n * 見出しが無いグラフでは何も変わらない。既定 `true`(画像だけ切り出されても何のグラフか分かるように)。\n * 図だけが欲しいときは `false`。\n */\n includeTitle?: boolean\n}\n\n/**\n * 型付きグラフのルート要素(`<figure>`)へ渡る属性。`data-*` と `aria-*` も渡る(型は不要)。\n * 最小限だけ型に出す。`className` / `ariaLabel` は別に持つ。\n */\nexport type ChartRootAttributes = Pick<HTMLAttributes<HTMLElement>, \"id\" | \"style\" | \"role\" | \"tabIndex\" | \"lang\" | \"hidden\">\n\n/**\n * Columns of `T` whose values are numbers (null / undefined allowed for gaps).\n * `categories` only accepts these, so a text column like `\"month\"` is a type error.\n * Untyped rows (`unknown` / `any` values, e.g. `Record<string, unknown>`) keep every key.\n */\nexport type NumericKeys<T> = {\n [K in keyof T]-?: unknown extends T[K] ? K : T[K] extends number | bigint | null | undefined ? K : never\n}[keyof T] &\n string\n\n/** Props every typed chart shares. Per-type differences live in `areaOptions` / `lineOptions` / `barOptions`. */\nexport interface ChartCommonProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends ChartRootAttributes {\n /** 行の配列。1 行 = x 軸の 1 点。数値の列は number か数値文字列(SQL の DECIMAL など)。 */\n data: T[]\n /** x 軸(カテゴリ軸)に使う列名。 */\n index: keyof T & string\n /** 系列として描く列名。並び順が凡例と配色の順になる。6 つ以上は合計の大きい 5 つ +「その他」にまとめる。 */\n categories: NumericKeys<T>[]\n /** 系列色(`\"chart-1\"`〜`\"chart-5\"` か意味色 `\"positive\"` / `\"warning\"` / `\"negative\"` / `\"neutral\"`)。配列は系列の順、record は系列名ごと。省略時はトークン順。 */\n colors?: ChartColors<T>\n /**\n * index の値・系列名 → 表示名(軸・凡例・ツールチップ・データ表に反映)。例 `{ jan: \"1月\", sales: \"売上\" }`。無いキーはそのまま。\n */\n labels?: Record<string, string>\n /**\n * 数値の書式(`\"compact\"` / `\"number\"` / `\"currency\"` / `\"percent\"` / `\"multiple\"` / `\"duration\"`、\n * または `{ type, digits, currency, notation, unit, divisor, durationUnit }`)。例 `format={{ type: \"number\", unit: \"件\" }}`。\n * 軸は短縮、ツールチップも同じ書式。KPI 系の `format` と同じ値を渡せる。既定 `\"compact\"`。\n */\n format?: ValueFormat\n /** 書式を関数で直接渡す逃げ道。`format` より優先する(互換のために残す)。 */\n valueFormatter?: ValueFormatter\n /** グラフの見出し。 */\n title?: string\n /** グラフが言っていることの 1 文要約。見出しの下に出し、グラフの `aria-describedby` になる。 */\n summary?: string\n /** 読み込み中。最終形と同じ形・高さのスケルトンを出す。 */\n isLoading?: boolean\n /** `data` が空のときの表示。 */\n emptyState?: ChartEmptyState\n /**\n * プロット領域の高さ(px)。既定 288。\n * 文字列(CSS の長さ)は互換のために受けるだけで非推奨 — 数値(px)で渡す。\n */\n height?: number | string\n /** 生成した EChartsOption に最後に深くマージする逃げ道。 */\n chartOptions?: EChartsOption\n /**\n * グラフ右上に PNG 保存/コピーのボタンを出す(ホバー時。凡例とは重ならない)。既定 `false`。\n * 見出し(`title` / `summary`)があれば PNG の上に含める。含めないなら `actions={{ includeTitle: false }}`。\n * 例: `actions`\n */\n actions?: boolean | ChartActionsOptions\n /** PNG 保存時のファイル名(拡張子つき)。`actions` と使う。既定 `\"chart.png\"`。例: `fileName=\"monthly-sales.png\"` */\n fileName?: string\n className?: string\n ariaLabel?: string\n}\n","\"use client\"\n\n/**\n * Internal building blocks shared by SearchableSelect and MultiSelect — the two\n * combobox variants differ only in their trigger and in single- vs multi-value\n * selection, so the Command list and the removable ×-affordance live here.\n * Not part of the public surface; both consumers import it with `.js`.\n */\nimport type { KeyboardEvent, MouseEvent } from \"react\"\nimport { CheckIcon, LoaderIcon, XIcon } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../ui/command\"\nimport { isGroupedOptions, type SelectOption, type SelectOptions } from \"../lib/types\"\n\nexport interface OptionCommandListProps {\n options: SelectOptions\n /** Whether the given option value is currently selected (drives the check). */\n isSelected: (value: string) => boolean\n onSelect: (value: string) => void\n /** Take filtering over yourself (server-side search); turns off built-in filter. */\n onSearch?: (query: string) => void\n isLoading: boolean\n searchPlaceholder: string\n emptyText: string\n}\n\n/** The searchable list body — flat or grouped, with loading and empty states. */\nexport function OptionCommandList({\n options,\n isSelected,\n onSelect,\n onSearch,\n isLoading,\n searchPlaceholder,\n emptyText,\n}: OptionCommandListProps) {\n const renderOptions = (items: SelectOption[]) =>\n items.map((option) => (\n <CommandItem\n key={option.value}\n value={option.value}\n keywords={[option.label]}\n disabled={option.disabled}\n onSelect={onSelect}\n >\n {option.icon && <option.icon className=\"size-4 shrink-0\" />}\n <span className=\"flex-1 truncate\">\n {option.label}\n {option.description && (\n <span className=\"ml-2 text-xs text-muted-foreground\">{option.description}</span>\n )}\n </span>\n <CheckIcon\n className={cn(\"size-4 shrink-0\", isSelected(option.value) ? \"opacity-100\" : \"opacity-0\")}\n />\n </CommandItem>\n ))\n\n return (\n <Command shouldFilter={!onSearch}>\n <CommandInput placeholder={searchPlaceholder} onValueChange={onSearch} />\n <CommandList>\n {isLoading ? (\n <div className=\"flex items-center justify-center py-6\">\n <LoaderIcon className=\"size-4 animate-spin text-muted-foreground\" />\n </div>\n ) : (\n <>\n <CommandEmpty>{emptyText}</CommandEmpty>\n {isGroupedOptions(options)\n ? options.map((group) => (\n <CommandGroup key={group.label} heading={group.label}>\n {renderOptions(group.options)}\n </CommandGroup>\n ))\n : renderOptions(options)}\n </>\n )}\n </CommandList>\n </Command>\n )\n}\n\nexport interface RemoveButtonProps {\n label: string\n /** Runs on click and on Enter/Space; propagation is stopped for you. */\n onRemove: () => void\n /** Override the X icon size (default `size-3.5`). */\n iconClassName?: string\n}\n\n/** The keyboard-accessible ×-affordance inside a badge or trigger. */\nexport function RemoveButton({ label, onRemove, iconClassName }: RemoveButtonProps) {\n const handle = (e: MouseEvent | KeyboardEvent) => {\n e.stopPropagation()\n onRemove()\n }\n return (\n <span\n role=\"button\"\n tabIndex={0}\n aria-label={label}\n className=\"rounded-sm opacity-50 hover:opacity-100 focus-visible:ring-1 focus-visible:ring-ring focus-visible:outline-none\"\n onClick={handle}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") handle(e)\n }}\n >\n <XIcon className={cn(\"size-3.5\", iconClassName)} />\n </span>\n )\n}\n","\"use client\"\n\n/**\n * SearchableSelect — a single-select combobox with a filter box. Filtering runs\n * client-side over the given options; pass `onSearch` to take it over yourself\n * (server-side search), which turns the built-in filter off.\n */\nimport { forwardRef, useMemo, useState } from \"react\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Button } from \"../ui/button\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\"\nimport { OptionCommandList, RemoveButton } from \"./option-command\"\nimport { flattenOptions, type SelectOptions } from \"../lib/types\"\n\nexport interface SearchableSelectProps {\n options: SelectOptions\n value?: string\n onChange?: (value: string | undefined) => void\n onSearch?: (query: string) => void\n placeholder?: string\n searchPlaceholder?: string\n emptyText?: string\n isLoading?: boolean\n disabled?: boolean\n clearable?: boolean\n className?: string\n}\n\n/** Not given yet (a draft fills props in steps): render empty, keep the same value between renders. */\nconst NO_OPTIONS: never[] = []\n\nexport const SearchableSelect = forwardRef<HTMLDivElement, SearchableSelectProps>(\n function SearchableSelect(\n {\n options = NO_OPTIONS,\n value,\n onChange,\n onSearch,\n placeholder = \"選択してください\",\n searchPlaceholder = \"検索...\",\n emptyText = \"見つかりませんでした\",\n isLoading = false,\n disabled = false,\n clearable = true,\n className,\n },\n ref,\n ) {\n const [open, setOpen] = useState(false)\n\n const allOptions = useMemo(() => flattenOptions(options), [options])\n const selectedOption = useMemo(\n () => allOptions.find((opt) => opt.value === value),\n [allOptions, value],\n )\n\n function handleSelect(selectedValue: string) {\n onChange?.(selectedValue === value ? undefined : selectedValue)\n setOpen(false)\n }\n\n return (\n <div ref={ref} data-slot=\"searchable-select\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <Button\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-between font-normal\",\n !selectedOption && \"text-muted-foreground\",\n className,\n )}\n />\n }\n role=\"combobox\"\n aria-expanded={open}\n >\n <span className=\"truncate\">{selectedOption ? selectedOption.label : placeholder}</span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {clearable && value && (\n <RemoveButton label=\"クリア\" onRemove={() => onChange?.(undefined)} />\n )}\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </span>\n </PopoverTrigger>\n <PopoverContent className=\"w-(--anchor-width) p-0\" align=\"start\">\n <OptionCommandList\n options={options}\n isSelected={(v) => value === v}\n onSelect={handleSelect}\n onSearch={onSearch}\n isLoading={isLoading}\n searchPlaceholder={searchPlaceholder}\n emptyText={emptyText}\n />\n </PopoverContent>\n </Popover>\n </div>\n )\n },\n)\nSearchableSelect.displayName = \"SearchableSelect\"\n","\"use client\"\n\n/**\n * MultiSelect — a multi-value combobox that shows the selection as removable\n * badges. Past `maxCount` badges the rest collapse into a \"+N件\" counter.\n * Pass `onSearch` to take filtering over yourself (server-side search).\n */\nimport { forwardRef, useId, useMemo, useState } from \"react\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\"\nimport { OptionCommandList, RemoveButton } from \"./option-command\"\nimport { flattenOptions, type SelectOptions } from \"../lib/types\"\n\nexport interface MultiSelectProps {\n options: SelectOptions\n value: string[]\n onChange?: (value: string[]) => void\n onSearch?: (query: string) => void\n maxCount?: number\n placeholder?: string\n searchPlaceholder?: string\n emptyText?: string\n isLoading?: boolean\n disabled?: boolean\n className?: string\n}\n\n/** Not given yet (a draft fills props in steps): render empty, keep the same value between renders. */\nconst NO_OPTIONS: never[] = []\nconst NO_VALUES: string[] = []\n\nexport const MultiSelect = forwardRef<HTMLDivElement, MultiSelectProps>(function MultiSelect(\n {\n options = NO_OPTIONS,\n value = NO_VALUES,\n onChange,\n onSearch,\n maxCount = 3,\n placeholder = \"選択してください\",\n searchPlaceholder = \"検索...\",\n emptyText = \"見つかりませんでした\",\n isLoading = false,\n disabled = false,\n className,\n },\n ref,\n) {\n const [open, setOpen] = useState(false)\n const listId = useId()\n\n const allOptions = useMemo(() => flattenOptions(options), [options])\n const selectedOptions = useMemo(\n () => allOptions.filter((opt) => value.includes(opt.value)),\n [allOptions, value],\n )\n\n function handleSelect(selectedValue: string) {\n if (value.includes(selectedValue)) {\n onChange?.(value.filter((v) => v !== selectedValue))\n } else {\n onChange?.([...value, selectedValue])\n }\n }\n\n const visibleBadges = selectedOptions.slice(0, maxCount)\n const overflowCount = selectedOptions.length - maxCount\n\n return (\n <div ref={ref} data-slot=\"multi-select\">\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listId}\n disabled={disabled}\n className={cn(\n \"inline-flex min-h-9 w-full items-center justify-between gap-2 rounded-md border bg-background px-3 py-1.5 text-sm shadow-xs transition-[color,background-color,border-color,box-shadow] outline-none hover:bg-accent hover:text-accent-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n className,\n )}\n >\n <span className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1\">\n {selectedOptions.length === 0 ? (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n ) : (\n <>\n {visibleBadges.map((option) => (\n <Badge key={option.value} variant=\"secondary\" className=\"shrink-0 gap-1 pr-1\">\n <span className=\"max-w-[120px] truncate\">{option.label}</span>\n <RemoveButton\n label={`${option.label}を削除`}\n onRemove={() => onChange?.(value.filter((v) => v !== option.value))}\n iconClassName=\"size-3\"\n />\n </Badge>\n ))}\n {overflowCount > 0 && (\n <Badge variant=\"secondary\" className=\"shrink-0\">\n +{overflowCount}件\n </Badge>\n )}\n </>\n )}\n </span>\n <ChevronDownIcon className=\"size-4 shrink-0 opacity-50\" />\n </PopoverTrigger>\n <PopoverContent id={listId} className=\"w-(--anchor-width) p-0\" align=\"start\">\n <OptionCommandList\n options={options}\n isSelected={(v) => value.includes(v)}\n onSelect={handleSelect}\n onSearch={onSearch}\n isLoading={isLoading}\n searchPlaceholder={searchPlaceholder}\n emptyText={emptyText}\n />\n </PopoverContent>\n </Popover>\n </div>\n )\n})\nMultiSelect.displayName = \"MultiSelect\"\n","\"use client\"\n\n/**\n * MetricValue / MetricUnit — the large number in a dashboard tile and its\n * trailing unit, sized as a pair so the unit stays subordinate at every size.\n *\n * @deprecated KPI の数字は KpiCard を使う。KpiCard は書式(`format`、単位は\n * `{ type: \"number\", unit: \"社\" }`)・比較ラベル・増減を値から計算するので、\n * 手書きの数字と TrendIndicator の組み合わせのように食い違わない。\n */\nimport { forwardRef, type HTMLAttributes } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nexport const metricValueVariants = cva(\"font-medium tracking-tight\", {\n variants: {\n size: {\n sm: \"text-base\",\n md: \"text-2xl\",\n lg: \"text-3xl\",\n xl: \"text-4xl\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n})\n\nexport interface MetricValueProps\n extends HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof metricValueVariants> {}\n\n/** @deprecated KPI の数字は KpiCard を使う。 */\nexport const MetricValue = forwardRef<HTMLDivElement, MetricValueProps>(\n ({ className, size, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"metric-value\"\n className={cn(\"my-4\", metricValueVariants({ size }), className)}\n {...props}\n />\n ),\n)\nMetricValue.displayName = \"MetricValue\"\n\nexport interface MetricUnitProps extends HTMLAttributes<HTMLSpanElement> {}\n\n/** @deprecated KPI の単位は KpiCard の `format`(`{ type: \"number\", unit: \"社\" }`)で付ける。 */\nexport const MetricUnit = forwardRef<HTMLSpanElement, MetricUnitProps>(\n ({ className, ...props }, ref) => (\n <span\n ref={ref}\n data-slot=\"metric-unit\"\n className={cn(\"text-sm font-normal text-muted-foreground\", className)}\n {...props}\n />\n ),\n)\nMetricUnit.displayName = \"MetricUnit\"\n","/**\n * Lightweight KPI insights: progress toward a target (with a simple linear pace\n * projection) and \"highest / lowest in N periods\" record detection. No statistics.\n *\n * Both follow `polarity`: for a lower-is-better metric (churn, cost) the target\n * is met at or below it, and the record is the lowest value, never the highest.\n */\nimport type { PeriodGrain, Polarity } from \"./comparison\"\n\nexport interface KpiPeriod {\n start: Date | string | number\n end: Date | string | number\n}\n\nexport interface TargetProgress {\n target: number\n /**\n * Distance left to the target, never negative: `target − current` when higher\n * is better, `current − target` when lower is better. 0 once achieved.\n */\n remaining: number\n /** Whether the current value meets the target (≥ for higher-is-better, ≤ for lower-is-better). */\n achieved: boolean\n /**\n * How far the target is met, as a ratio: `current / target` when higher is\n * better, `target / current` when lower is better (1 = exactly on target).\n */\n achievement: number\n /** achievement / elapsed when the period is in progress, else null. Higher-is-better only. */\n projected: number | null\n /** Fraction of the period elapsed at `now`, or null without a valid period. */\n elapsed: number | null\n}\n\nconst isFiniteNumber = (v: number | null | undefined): v is number => typeof v === \"number\" && Number.isFinite(v)\n\nconst toTime = (v: Date | string | number): number => (v instanceof Date ? v.getTime() : new Date(v).getTime())\n\nexport function computeTargetProgress(\n current: number | null | undefined,\n target: number | null | undefined,\n options?: { period?: KpiPeriod; now?: Date | number; polarity?: Polarity },\n): TargetProgress | null {\n if (!isFiniteNumber(current) || !isFiniteNumber(target) || target === 0) return null\n const lower = options?.polarity === \"lower-is-better\"\n let elapsed: number | null = null\n if (options?.period) {\n const start = toTime(options.period.start)\n const end = toTime(options.period.end)\n const now = toTime(options.now ?? Date.now())\n if (Number.isFinite(start) && Number.isFinite(end) && Number.isFinite(now) && end > start) {\n elapsed = (now - start) / (end - start)\n }\n }\n if (lower) {\n const achieved = current <= target\n const achievement = current > 0 ? target / current : 1\n return { target, remaining: Math.max(current - target, 0), achieved, achievement, projected: null, elapsed }\n }\n const achievement = current / target\n const projected = elapsed !== null && elapsed > 0 && elapsed < 1 ? achievement / elapsed : null\n return {\n target,\n remaining: Math.max(target - current, 0),\n achieved: current >= target,\n achievement,\n projected,\n elapsed,\n }\n}\n\n/** @deprecated Use `PeriodGrain` (same values). */\nexport type HistoryGrain = PeriodGrain\n\nconst DAY_MS = 24 * 60 * 60 * 1000\n\n/**\n * The grain of a period from its length: ~1 day, 7 days, 28–31 days, 89–92 days\n * or 365–366 days. Anything else (a custom range) returns undefined.\n */\nexport function inferPeriodGrain(period: KpiPeriod | null | undefined): PeriodGrain | undefined {\n if (!period) return undefined\n const days = (toTime(period.end) - toTime(period.start)) / DAY_MS\n if (!Number.isFinite(days)) return undefined\n // Allow an hour of slack for daylight-saving shifts.\n const near = (min: number, max: number) => days >= min - 1 / 24 && days <= max + 1 / 24\n if (near(1, 1)) return \"day\"\n if (near(7, 7)) return \"week\"\n if (near(28, 31)) return \"month\"\n if (near(89, 92)) return \"quarter\"\n if (near(365, 366)) return \"year\"\n return undefined\n}\n\nexport interface RecordInsight {\n span: number\n grain: PeriodGrain\n /** \"highest\" for higher-is-better, \"lowest\" for lower-is-better. */\n kind: \"highest\" | \"lowest\"\n label: string\n}\n\n/** Fewer finite points than this never yields a record. */\nexport const RECORD_MIN_POINTS = 6\n\nconst GRAIN_UNITS: Record<PeriodGrain, string> = {\n day: \"日\",\n week: \"週\",\n month: \"か月\",\n quarter: \"四半期\",\n year: \"年\",\n}\n\n/**\n * The latest point is a record when it beats every earlier finite point:\n * strictly highest for higher-is-better, strictly lowest for lower-is-better.\n */\nexport function detectRecord(\n history: ReadonlyArray<number | null | undefined> | null | undefined,\n grain: PeriodGrain = \"month\",\n polarity: Polarity = \"higher-is-better\",\n): RecordInsight | null {\n if (!history) return null\n const points = history.filter(isFiniteNumber)\n if (points.length < RECORD_MIN_POINTS) return null\n const latest = points[points.length - 1]!\n const lower = polarity === \"lower-is-better\"\n const beats = (v: number) => (lower ? latest < v : latest > v)\n if (!points.slice(0, -1).every(beats)) return null\n const span = points.length\n return {\n span,\n grain,\n kind: lower ? \"lowest\" : \"highest\",\n label: `過去 ${span} ${GRAIN_UNITS[grain]}で${lower ? \"最低\" : \"最高\"}`,\n }\n}\n","\"use client\"\n\n/**\n * Delta — the change of a value against a comparison, rendered as arrow + signed\n * change + comparison label (\"↑ +12.4% 前月比\") on one line.\n *\n * Direction, rate, colour and wording are all derived here from `value` and\n * `comparison` (via `computeComparison`); none of them can be passed in, so they\n * cannot contradict each other. Colour is never the only signal: the arrow and\n * the sign always accompany it. Set `polarity=\"lower-is-better\"` for metrics\n * where a rise is bad (churn, error rate).\n *\n * - A flat change (inside `neutralBand`) uses a right arrow (→), never a minus-like dash, so it cannot\n * read as \"− +0.19pt\".\n * - The label comes from `comparison.vs` and `comparison.grain`: a monthly\n * `prior-period` reads \"前月比\", `prior-year` \"前年同月比\".\n * - Pass the metric's `format`: a `percent` metric (a rate) shows the difference\n * in percentage points (\"−0.5pt\") instead of a relative change (\"−19.2%\"). A minus is\n * always U+2212, and the digits of a relative change / points are fixed (default 1:\n * \"+14.0%\" beside \"+11.9%\"); `digits` sets the same count for every card in a group.\n * - A running total (YTD / MTD) sets `comparison.toDate`: `prior-year` then reads\n * \"前年同期比\" instead of \"前年比\" whatever the grain.\n * - When the values cannot be compared (a null value, no previous one), it shows a single muted\n * \"—\" with no arrow (and the label, so \"— 前年同月比\" says which comparison is missing). The\n * screen-reader text says \"比較できません\".\n *\n * @example\n * import { Delta } from \"@/components/delta\"\n * // Vantage: import { Delta } from \"@squadbase/vantage/components\"\n *\n * <Delta value={48_200_000} comparison={{ previous: 42_900_000, vs: \"prior-period\", grain: \"month\" }} />\n * <Delta value={0.021} format=\"percent\" polarity=\"lower-is-better\"\n * comparison={{ previous: 0.026, vs: \"prior-year\", grain: \"month\" }} />\n */\nimport { forwardRef, type HTMLAttributes } from \"react\"\nimport { ArrowDown, ArrowRight, ArrowUp } from \"lucide-react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\nimport {\n computeComparison,\n defaultChangeDisplay,\n formatChange,\n formatChangeAmount,\n type ChangeDisplay,\n type Comparison,\n type ComparisonResult,\n type Polarity,\n} from \"../lib/comparison\"\nimport { DEFAULT_LOCALE, EMPTY_VALUE, type ValueFormat } from \"../lib/format\"\n\nconst deltaVariants = cva(\n \"inline-flex w-fit shrink-0 items-center gap-1 font-medium whitespace-nowrap tabular-nums\",\n {\n variants: {\n variant: {\n badge: \"h-5 rounded-4xl px-2 py-0.5 text-xs font-semibold [&>svg]:size-3\",\n inline: \"text-sm [&>svg]:size-3.5\",\n },\n sentiment: {\n positive: \"text-positive\",\n negative: \"text-negative\",\n neutral: \"text-neutral\",\n },\n },\n compoundVariants: [\n { variant: \"badge\", sentiment: \"positive\", className: \"bg-positive-subtle\" },\n { variant: \"badge\", sentiment: \"negative\", className: \"bg-negative-subtle\" },\n { variant: \"badge\", sentiment: \"neutral\", className: \"bg-neutral-subtle\" },\n ],\n defaultVariants: {\n variant: \"badge\",\n sentiment: \"neutral\",\n },\n },\n)\n\nexport interface DeltaProps\n extends\n Omit<HTMLAttributes<HTMLSpanElement>, \"children\">,\n Pick<VariantProps<typeof deltaVariants>, \"variant\"> {\n /** The current value. The previous one comes from `comparison`. */\n value: number | null | undefined\n /** What the value is compared against. Required so the delta always carries its label. */\n comparison: Comparison\n /** Whether a rise is good. Default `\"higher-is-better\"`. */\n polarity?: Polarity\n /** Absolute ratio below which the change reads as flat (0.01 = 1%). Default 0.01. */\n neutralBand?: number\n /** Format of the metric itself; a `percent` metric shows its change in points. */\n format?: ValueFormat\n /**\n * `\"relative\"` (\"+12.4%\"), `\"points\"` (\"-0.5pt\") or `\"difference\"` (the absolute difference in the\n * metric's own `format`, \"+¥530万\"). Default: points for a `percent` format, else relative.\n */\n change?: ChangeDisplay\n /**\n * 変化(`\"relative\"` の率・`\"points\"` の pt)の小数桁数。固定で、末尾の 0 も出す。例: `digits={2}` → \"+0.14pt\"。\n * 同じカード群で桁がばらつかないよう、全部に同じ値を渡す。未指定は 1 桁(\"+14.0%\")。`\"points\"` は未指定のとき `format.digits` に従う。\n */\n digits?: number\n /** Locale for the change. Default `\"ja-JP\"`. */\n locale?: string\n /** Show the comparison label (\"前月比\") after the change. Default true. */\n showLabel?: boolean\n}\n\n/** Text shown when the values cannot be compared (no previous value, or a zero baseline): the same \"—\" as every missing value. */\nexport const DELTA_NOT_COMPARABLE = EMPTY_VALUE\n\n/**\n * Screen-reader text, e.g. \"前月比 12.4% 増加\" / \"前月比 0.5 ポイント 減少\" / \"前月比 横ばい\" / \"前月比 比較できません\".\n * The amount carries no sign, since the verb already says the direction (\"−0.5 ポイント 減少\" would negate twice).\n */\nexport function deltaAriaLabel(\n result: ComparisonResult,\n locale: string = DEFAULT_LOCALE,\n change: ChangeDisplay = \"relative\",\n format?: ValueFormat,\n digits?: number,\n): string {\n const { label, direction, ratio } = result\n if (direction === \"none\" || ratio === null) return `${label} 比較できません`\n if (direction === \"flat\") return `${label} 横ばい`\n const amount = formatChangeAmount(result, change, locale, format, digits)\n if (amount === null) return `${label} 比較できません`\n return `${label} ${change === \"points\" ? amount.replace(/pt$/, \" ポイント\") : amount} ${direction === \"up\" ? \"増加\" : \"減少\"}`\n}\n\nexport const Delta = forwardRef<HTMLSpanElement, DeltaProps>(\n (\n {\n value,\n comparison,\n polarity,\n neutralBand,\n format,\n change,\n digits,\n locale = DEFAULT_LOCALE,\n showLabel = true,\n variant = \"badge\",\n className,\n ...props\n },\n ref,\n ) => {\n // Nothing to compare against yet (a draft fills props in steps).\n if (!comparison) return null\n const result = computeComparison(value, comparison, { polarity, neutralBand })\n const display = change ?? defaultChangeDisplay(format)\n const formatDigits = typeof format === \"object\" && format !== null && \"digits\" in format ? format.digits : undefined\n const changeDigits = display === \"points\" ? (digits ?? formatDigits) : digits\n const comparable = result.direction !== \"none\"\n const Icon = result.direction === \"up\" ? ArrowUp : result.direction === \"down\" ? ArrowDown : ArrowRight\n const text = formatChange(result, display, locale, format, changeDigits)\n\n return (\n <span\n ref={ref}\n role=\"img\"\n data-slot=\"delta\"\n data-direction={result.direction}\n data-sentiment={result.sentiment}\n aria-label={deltaAriaLabel(result, locale, display, format, changeDigits)}\n className={cn(\n deltaVariants({ variant, sentiment: result.sentiment }),\n !comparable && \"text-muted-foreground\",\n className,\n )}\n {...props}\n >\n {comparable && <Icon aria-hidden=\"true\" />}\n <span aria-hidden=\"true\">{text ?? DELTA_NOT_COMPARABLE}</span>\n {showLabel && (\n <span aria-hidden=\"true\" className=\"font-normal text-muted-foreground\">\n {result.label}\n </span>\n )}\n </span>\n )\n },\n)\nDelta.displayName = \"Delta\"\n\nexport { deltaVariants }\n","\"use client\"\n\n/**\n * KpiCard — one metric in five tiers, following shadcn dashboard-01 SectionCards:\n *\n * 1. label (CardDescription, muted)\n * 2. value (CardTitle, tabular-nums; text-4xl once the card is ≥ 320px wide (a comparison label is ~180px, so narrower cards would overlap the value))\n * 3. delta (CardAction: arrow + sign + colour + comparison label — `Delta`)\n * 4. previous actual (\"前月 ¥4,290万\"; on by default, `showPrevious={false}` hides it)\n * 5. conclusion (`summary`: a *template* whose placeholders the card fills)\n *\n * with optional extras: a target bar under the value (a 6px straight bar — actual\n * in `--chart-1`, the pace projection in `--chart-1/30` (`/45` in dark: 1.33:1 → 1.6:1 against the track, as light has), a 1px tick at the target —\n * and one line \"目標の 49%・このペースなら 98%\"), then in the footer a record badge\n * from `history`, the data source footnote, the last update time and, with ≥ 6\n * points of `history`, an axis-less sparkline (`showHistory={false}` hides it).\n *\n * Everything derivable is computed here — direction, rate, colour, remaining,\n * achievement, projection, record — so no two props can disagree. Pass enums and\n * numbers only. `history` is the series ending at the current period: its last\n * point should equal `value`.\n *\n * - **Cards in a row line up by subgrid, not by fixed heights.** The card spans two rows of its\n * parent grid (`row-span-2` + `grid-template-rows: subgrid`): row 1 is the body (label, value,\n * delta, previous actual, target bar), row 2 the footer. Cards placed directly in one grid\n * (`grid grid-cols-2 lg:grid-cols-4 gap-4`) therefore share the value baseline and the footer's\n * top edge, and the sparkline sits at the footer's bottom. Outside such a grid the card is a\n * plain grid of the same two rows. The label is one line (truncated, full text in `title`).\n * When the card is narrower than 250px the delta moves from the right of the value to\n * under it (container query, no prop).\n * - **Nothing empty is drawn.** A card with no summary, record badge, target line, source,\n * update time or sparkline has no footer in the DOM; there is no placeholder for the target\n * bar either. No `h-*` / `min-h-*` is used to line cards up.\n * - **`size=\"sm\"`** is for two cards side by side in a narrow place (a Sheet): one step smaller\n * value and padding, and no sparkline.\n * - **`source` is at most two lines** (`line-clamp-2`, full text in `title`).\n * - **Labels follow the grain.** The grain is `comparison.grain`, else\n * `historyGrain`, else inferred from `period`; a monthly card reads \"前月比\" /\n * \"前年同月比\" and projects to \"月末\". Without any of them it reads \"前期比\".\n * Any other baseline is `vs: \"custom\"` with a `label` (\"昨日比\"); the previous\n * line takes its name from it (\"昨日 617\"), the same way a `label` on any `vs` does.\n * - **Two or more comparisons sit under the value**, not beside it, so the value\n * keeps its place and its width whatever the card holds.\n * - **Polarity drives everything.** With `polarity=\"lower-is-better\"` the target\n * is met at or below it, and the record badge marks the lowest value.\n * - **Rates change in points.** With a `percent` format the delta and\n * `{difference}` are in percentage points (\"-0.5pt\"); `change=\"relative\"` opts\n * back into the change rate. The target line follows: \"目標 95% まであと 2.8pt\"\n * instead of a ratio of rates (\"97.1% 達成\"); `targetDisplay=\"achievement\"` opts back.\n * - **The value has a fixed size.** It never shrinks to fit: a long value wraps its\n * 速報 badge instead of truncating, so neighbouring cards keep one baseline.\n * - **A summary longer than 2 lines is clamped** (full text in `title`), so keep it to one fact.\n *\n * Summary placeholders: `{value}` `{delta}` `{difference}` `{previous}` `{label}`\n * `{target}` `{achievement}` `{remaining}`. Unknown placeholders are left as-is.\n * If a placeholder's value is missing (e.g. no previous period), the whole\n * sentence is replaced with \"前月の実績がないため、比較できません。\" — or dropped\n * when there is no comparison — so \"—\" never lands inside a sentence. Write the\n * sentence around them and never put numbers in the template itself.\n *\n * The summary says one fact *beyond* the comparison — composition, target, record,\n * rate. A template made only of `{delta}` / `{difference}` repeats what the badge\n * and the previous actual already say, so it logs a dev warning (once).\n *\n * @example\n * import { KpiCard } from \"@/components/kpi-card\"\n * // Vantage: import { KpiCard } from \"@squadbase/vantage/components\"\n *\n * <KpiCard\n * label=\"売上(今月)\"\n * value={48_200_000}\n * format=\"currency\"\n * comparison={{ previous: 42_900_000, vs: \"prior-period\" }}\n * summary=\"{label}は前月から {difference}({delta})伸びています。\"\n * target={60_000_000}\n * period={{ start: \"2026-10-01\", end: \"2026-11-01\" }}\n * />\n */\nimport type { ComponentProps } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport {\n comparisonBaseline,\n computeComparison,\n defaultChangeDisplay,\n formatChange,\n type ChangeDisplay,\n type Comparison,\n type PeriodGrain,\n type Polarity,\n} from \"../lib/comparison\"\nimport { DEFAULT_LOCALE, EMPTY_VALUE, formatDate, formatDatesInText, formatDelta, formatKind, formatPoints, formatValue, type ValueFormat } from \"../lib/format\"\nimport { computeTargetProgress, detectRecord, inferPeriodGrain, type KpiPeriod } from \"../lib/insights\"\nimport { formatRelativeTime } from \"../lib/relative-time\"\nimport { Sparkline } from \"../charts/sparkline\"\nimport { Badge } from \"../ui/badge\"\nimport { Card, CardAction, CardDescription, CardFooter, CardHeader, CardTitle } from \"../ui/card\"\nimport { Skeleton } from \"../ui/skeleton\"\nimport { Delta } from \"./delta\"\nimport { SampleBadge, useSampleMark } from \"./sample-data\"\n\nexport interface KpiCardSource {\n /** Period the data covers (e.g. \"2023-04 以降\"). ISO year-months / dates in it are written by the card (\"2023年4月 以降\"). */\n period?: string\n /** Number of rows aggregated; formatted by the card (\"48,210件から集計\"). */\n count?: number\n /**\n * 集計から除いた行数。出典の脚注に「12件を除外」と添える(ja 以外は「12 excluded」)。0 や負の値は出さない。\n * 除外の理由(テスト用アカウント、欠損など)は `note` に書く。\n * @example source={{ count: 48_210, excluded: 12, note: \"テスト用アカウントを除外\" }}\n */\n excluded?: number\n /** Data source name (e.g. \"Snowflake\"). */\n name?: string\n /** 換算・税抜などの脚注。フッターに出す。例: `note: \"税抜、1 ドル=150 円で換算\"`。数字を使う説明は summary ではなくここへ。 */\n note?: string\n}\n\nexport interface KpiCardProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n /** Metric name (tier 1). */\n label: string\n /** Current value (tier 2). null / undefined renders \"—\". */\n value: number | null | undefined\n /**\n * Value format, also used for previous / target / remaining. Default `\"compact\"`.\n * `\"currency\"` is JPY in 万・億; `\"percent\"` takes a ratio (0.021 → 2.1%) and\n * switches the delta to points. See `formatValue` for the full table.\n */\n format?: ValueFormat\n /** Default `\"ja-JP\"`. */\n locale?: string\n /**\n * What the value is compared against; drives the delta (tier 3) and previous line (tier 4).\n * 前期・前年・目標以外は `vs: \"custom\"` + `label`(バッジの呼び名。末尾の「比」を外した語が前期実績行の呼び名になる)。\n * @example comparison={{ previous: 617, vs: \"custom\", label: \"昨日比\" }}\n */\n comparison?: Comparison\n /**\n * 前年比と前月比など、複数の比較を併記する。先頭だけが前期実績行と summary に使われ、2 つ目以降は Delta 行のみ。`comparison` も渡したらそれが先頭。バッジは値の下に並ぶ。\n * @example comparisons={[{ previous: 4_290, vs: \"prior-period\", grain: \"month\" }, { previous: 3_900, vs: \"prior-year\", grain: \"month\" }]} / comparisons={[{ previous: 617, vs: \"custom\", label: \"昨日比\" }, { previous: 590, vs: \"custom\", label: \"先週の同じ曜日比\" }]}\n */\n comparisons?: Comparison[]\n /**\n * 確定前の値。値の隣に「速報」バッジを出し、目標の「達成」を言い切らず、最高記録の判定も出さない。\n * @example provisional / provisional={{ label: \"暫定\" }}\n */\n provisional?: boolean | { label?: string }\n /** Whether a rise is good. Default `\"higher-is-better\"`. `\"neutral\"` never colours the change and skips the target and record logic. */\n polarity?: Polarity\n /** `\"relative\"` (\"+12.4%\"), `\"points\"` (\"-0.5pt\") or `\"difference\"` (\"+¥530万\", in `format`). Default: points for a `percent` format, else relative. */\n change?: ChangeDisplay\n /** Absolute ratio below which the change reads as flat. Default 0.01. */\n neutralBand?: number\n /** Show the previous actual (\"前月 400\"). Default true; needs `comparison`. */\n showPrevious?: boolean\n /** Conclusion sentence template (tier 5); see the placeholders above. */\n summary?: string\n /**\n * Target for the current period. Under the value it adds a 6px bar (actual, the pace\n * projection, a tick at the target) and one line \"目標の 49%・このペースなら 98%\"\n * (the projection only while `period` is in progress). With `polarity=\"lower-is-better\"`\n * or a rate target (points) there is no bar: \"目標 … まであと …\" in the footer.\n */\n target?: number\n /**\n * 目標行・見込み行での目標の呼び名。既定「目標」。予算・計画・ノルマなど業務の言葉に合わせる。\n * @example targetLabel=\"予算\" // 予算まであと ¥2,934万(98.1% 達成)\n */\n targetLabel?: string\n /**\n * 目標に対する進み具合の出し方。`\"achievement\"` は達成率(現在値 ÷ 目標。「98.1% 達成」)、`\"points\"` は目標との差(「あと 2.8pt」)。\n * 既定は `format` から決まる: `percent`(率)は `\"points\"`(率を率で割った達成度は読めない)、それ以外は `\"achievement\"`。\n * `\"points\"` のとき `{achievement}` は目標との符号付きの差(\"-2.8pt\")になり、見込み行は出ない。\n */\n targetDisplay?: \"achievement\" | \"points\"\n /** Current period; with `target`, adds a pace projection while the period is in progress. */\n period?: KpiPeriod\n /** Series ending at the current period (last point = `value`); adds a record badge. */\n history?: ReadonlyArray<number | null | undefined>\n /** Grain of `history` (and of the comparison labels). Default: inferred from `period`, else `\"month\"` for the record. */\n historyGrain?: PeriodGrain\n /**\n * `history` が 6 点以上あるとき、フッター末尾に軸なしのスパークライン(高さ 32px・`--chart-1`・最新点だけドット)を出す。既定 true。\n * 推移を出したくないカードは `showHistory={false}`(記録バッジは `history` があれば出る)。\n * @example showHistory={false}\n */\n showHistory?: boolean\n /** Data source footnote. */\n source?: KpiCardSource\n /** When the data was last refreshed: \"3 分前に更新\". 出し方は `updatedAtDisplay`。 */\n updatedAt?: Date | string | number\n /**\n * `updatedAt` の出し方。`\"relative\"`(既定)は「3 分前に更新」、`\"absolute\"` は「2026/10/20 14:30 に更新」、\n * `\"both\"` は「2026/10/20 14:30 に更新(3 分前)」。絶対時刻は実行環境のタイムゾーンで出す(`timeZone` で固定できる)。\n * 画面を印刷・スクリーンショットで残すなら、時間が経っても読める `\"absolute\"` か `\"both\"`。\n * @example updatedAtDisplay=\"absolute\"\n */\n updatedAtDisplay?: \"relative\" | \"absolute\" | \"both\"\n /**\n * `updatedAt` の絶対時刻(`updatedAtDisplay` が `\"absolute\"` / `\"both\"`)を出すタイムゾーン(IANA 名。例 `\"Asia/Tokyo\"`)。\n * 既定は実行環境(ブラウザ)のタイムゾーン。サーバーとブラウザで表示が食い違う(SSR)なら固定する。「3 分前」には影響しない。\n * @example updatedAtDisplay=\"absolute\" timeZone=\"Asia/Tokyo\"\n */\n timeZone?: string\n /** Reference time for the projection and relative time (for deterministic rendering). */\n now?: Date | number\n /** Render a skeleton with the final shape instead of the values. */\n isLoading?: boolean\n /**\n * `\"sm\"` は Sheet の中など狭い場所で 2 枚を横に並べるときの小さいサイズ。値の文字と余白が一段小さくなり、スパークラインは出さない。既定 `\"default\"`。\n * @example size=\"sm\"\n */\n size?: \"default\" | \"sm\"\n}\n\n/** Points of `history` from which the footer shows a sparkline (the same bar as the record badge). */\nconst SPARKLINE_MIN_POINTS = 6\n\n/** Height of the footer sparkline, in px. */\nconst SPARKLINE_HEIGHT = 32\n\n/**\n * The delta sits right of the value once the card is ≥ 320px wide (a comparison label is ~180px, so narrower cards would overlap the value) (the shadcn\n * `CardAction` slot) and drops under the value below that — a container query,\n * so a narrow card needs no prop.\n */\nconst DELTA_PLACEMENT =\n \"col-start-1 row-span-1 row-start-3 justify-self-start @[288px]/card:col-start-2 @[288px]/card:row-span-2 @[288px]/card:row-start-1 @[288px]/card:justify-self-end\"\n\n/**\n * The header is the size container (`@container/card`), not the card: a container sets layout containment, which turns the\n * card's `grid-rows-subgrid` into a plain grid and the rows stop lining up. Its content box is the card minus both paddings\n * (32px; 24px for `sm`), so 218px / 288px here are the 250px / 320px card widths. It also owns the gap above the footer.\n */\nconst HEADER_CLASS = \"@container/card pb-(--card-spacing)\"\n\nconst PLACEHOLDER = /\\{(\\w+)\\}/g\n\nconst isJapanese = (locale: string) => locale.toLowerCase().startsWith(\"ja\")\n\nconst isMissing = (v: string | null | undefined) => v === null || v === undefined || v === \"\"\n\n/**\n * Fill `{name}` placeholders from `values`. Unknown names stay as written.\n *\n * Without `fallback`, a known name whose value is null / undefined / empty\n * becomes \"—\". With `fallback`, any such missing value replaces the whole\n * sentence with `fallback` (which may be null to drop it).\n */\nexport function fillKpiTemplate(template: string, values: Readonly<Record<string, string | null | undefined>>): string\nexport function fillKpiTemplate(\n template: string,\n values: Readonly<Record<string, string | null | undefined>>,\n fallback: string | null,\n): string | null\nexport function fillKpiTemplate(\n template: string,\n values: Readonly<Record<string, string | null | undefined>>,\n fallback?: string | null,\n): string | null {\n let missing = false\n const filled = template.replace(PLACEHOLDER, (match, name: string) => {\n if (!Object.prototype.hasOwnProperty.call(values, name)) return match\n const v = values[name]\n if (isMissing(v)) {\n missing = true\n return EMPTY_VALUE\n }\n return v as string\n })\n return missing && fallback !== undefined ? fallback : filled\n}\n\nconst SHALLOW_SUMMARY_PLACEHOLDERS = new Set([\"delta\", \"difference\"])\n\nlet shallowSummaryWarned = false\n\n/** @internal Lets tests observe the once-only dev warning again. */\nexport function resetKpiSummaryWarning() {\n shallowSummaryWarned = false\n}\n\n/** True when every placeholder is `{delta}` / `{difference}` — the template only restates the badge. */\nfunction isShallowSummary(template: string): boolean {\n const names = Array.from(template.matchAll(PLACEHOLDER), (m) => m[1] as string)\n return names.length > 0 && names.every((n) => SHALLOW_SUMMARY_PLACEHOLDERS.has(n))\n}\n\n// Bundlers replace `process.env.NODE_ENV` textually; a browser without that define has no `process`.\ndeclare const process: { env: { NODE_ENV?: string } }\n\nfunction isProduction(): boolean {\n try {\n return process.env.NODE_ENV === \"production\"\n } catch {\n return true\n }\n}\n\nfunction warnShallowSummary(template: string) {\n if (shallowSummaryWarned || isProduction() || !isShallowSummary(template)) return\n shallowSummaryWarned = true\n console.warn(\n `[KpiCard] summary=\"${template}\" only repeats the delta badge and the previous actual. Say one fact beyond the comparison — composition, target, record or rate (e.g. \"{label}は目標の {achievement} まで来ています。\").`,\n )\n}\n\nexport function KpiCard({\n label,\n value,\n format,\n locale = DEFAULT_LOCALE,\n comparison: comparisonProp,\n comparisons,\n provisional,\n polarity,\n change,\n neutralBand,\n showPrevious = true,\n summary,\n target,\n targetLabel = \"目標\",\n targetDisplay,\n period,\n history,\n historyGrain,\n showHistory = true,\n source,\n updatedAt,\n updatedAtDisplay = \"relative\",\n timeZone,\n now,\n isLoading = false,\n size = \"default\",\n className,\n ...props\n}: KpiCardProps) {\n const allComparisons = [...(comparisonProp ? [comparisonProp] : []), ...(comparisons ?? [])]\n const comparison = allComparisons[0]\n const isProvisional = provisional !== undefined && provisional !== false\n const provisionalLabel = typeof provisional === \"object\" && provisional.label ? provisional.label : \"速報\"\n const sample = useSampleMark()\n const neutral = polarity === \"neutral\"\n const hasPrevious = comparison !== undefined && showPrevious\n // Two or more badges would squeeze the value from the right; they get their own row under it instead.\n const stacked = allComparisons.length > 1\n const hasTarget = target !== undefined\n const grain = comparison?.grain ?? historyGrain ?? inferPeriodGrain(period)\n const record = isProvisional || neutral ? null : detectRecord(history, historyGrain ?? grain, polarity)\n const sourceParts = source\n ? [\n source.period !== undefined ? formatDatesInText(source.period, locale) : undefined,\n source.count !== undefined ? `${formatValue(source.count, \"number\", locale)}件から集計` : undefined,\n source.excluded !== undefined && Number.isFinite(source.excluded) && source.excluded > 0\n ? isJapanese(locale)\n ? `${formatValue(source.excluded, \"number\", locale)}件を除外`\n : `${formatValue(source.excluded, \"number\", locale)} excluded`\n : undefined,\n source.name,\n source.note,\n ].filter((p): p is string => typeof p === \"string\" && p !== \"\")\n : []\n const hasUpdated = updatedAt !== undefined\n const historyPoints = (history ?? []).filter((v): v is number => typeof v === \"number\" && Number.isFinite(v))\n const small = size === \"sm\"\n const showSparkline = !small && showHistory && historyPoints.length >= SPARKLINE_MIN_POINTS\n const isRate = formatKind(format) === \"percent\"\n const byPoints = (targetDisplay ?? (isRate ? \"points\" : \"achievement\")) === \"points\"\n const lower = polarity === \"lower-is-better\"\n // The bar reads \"how far toward the target\"; a rate (points) or a lower-is-better target has no such fill.\n const targetBar = hasTarget && !neutral && !byPoints && !lower\n if (summary !== undefined) warnShallowSummary(summary)\n // Two rows of the parent grid (body, footer), shared by subgrid; a plain two-row grid when standalone.\n const cardClass = cn(\"row-span-2 grid content-start gap-y-0 grid-rows-subgrid\", className)\n const valueSize = small ? \"text-xl @[218px]/card:text-2xl\" : \"text-2xl @[218px]/card:text-4xl\"\n\n if (isLoading) {\n return (\n <Card\n data-slot=\"kpi-card\"\n data-loading=\"\"\n aria-busy=\"true\"\n size={size}\n className={cardClass}\n {...props}\n >\n <CardHeader className={HEADER_CLASS}>\n <CardDescription className=\"col-start-1\">\n <span className=\"sr-only\">{label}</span>\n <Skeleton aria-hidden=\"true\" className=\"h-5 w-24\" />\n </CardDescription>\n <CardTitle className=\"col-start-1 flex items-center gap-2\">\n <Skeleton aria-hidden=\"true\" className={small ? \"h-7 w-28 @[218px]/card:h-8\" : \"h-8 w-32 @[218px]/card:h-9\"} />\n {/* The mark stays while loading, so the header does not shift when the values arrive. */}\n {sample && <SampleBadge label={sample.label} />}\n </CardTitle>\n {comparison &&\n (stacked ? (\n <div className=\"flex flex-wrap gap-1\">\n {allComparisons.map((_, i) => (\n <Skeleton key={i} aria-hidden=\"true\" className=\"h-5 w-24 rounded-4xl\" />\n ))}\n </div>\n ) : (\n <CardAction className={DELTA_PLACEMENT}>\n <Skeleton aria-hidden=\"true\" className=\"h-5 w-24 rounded-4xl\" />\n </CardAction>\n ))}\n {hasPrevious && <Skeleton aria-hidden=\"true\" className=\"h-5 w-16\" />}\n {targetBar ? (\n <div className=\"col-span-full mt-1 flex flex-col gap-1.5\">\n <Skeleton aria-hidden=\"true\" className=\"h-2 w-full rounded-full\" />\n <Skeleton aria-hidden=\"true\" className=\"h-5 w-3/5\" />\n </div>\n ) : null}\n </CardHeader>\n {(summary || record || (hasTarget && !targetBar) || sourceParts.length > 0 || hasUpdated || showSparkline) && (\n <CardFooter className=\"flex-col items-start gap-1.5 text-sm\">\n {summary && <Skeleton aria-hidden=\"true\" className=\"h-5 w-4/5\" />}\n {record && <Skeleton aria-hidden=\"true\" className=\"h-5 w-28 rounded-4xl\" />}\n {hasTarget && !targetBar && <Skeleton aria-hidden=\"true\" className=\"h-5 w-3/5\" />}\n {sourceParts.length > 0 && <Skeleton aria-hidden=\"true\" className=\"h-4 w-3/4\" />}\n {hasUpdated && <Skeleton aria-hidden=\"true\" className=\"h-4 w-20\" />}\n {showSparkline && <Skeleton aria-hidden=\"true\" className=\"mt-auto h-8 w-full\" />}\n </CardFooter>\n )}\n </Card>\n )\n }\n\n const fmt = (v: number | null | undefined) => formatValue(v, format, locale)\n /** An unsigned distance in the metric's unit — points for a rate. */\n const fmtDistance = (v: number) => (isRate ? formatPoints(v, locale, { signDisplay: \"never\" }) : fmt(v))\n const pct = (v: number) => formatValue(v, { type: \"percent\", digits: 0 }, locale)\n const tl = targetLabel\n const display = change ?? defaultChangeDisplay(format)\n // Value digits only carry over to a change in points; a relative change keeps its own fixed digits.\n const digits =\n display === \"points\" && typeof format === \"object\" && format !== null && \"digits\" in format ? format.digits : undefined\n const graded = comparison ? { ...comparison, grain } : undefined\n const result = graded ? computeComparison(value, graded, { polarity, neutralBand }) : null\n const baseline = graded ? comparisonBaseline(graded.vs, grain, graded.label, graded.toDate) : null\n const progress = hasTarget && !neutral ? computeTargetProgress(value, target, { period, now, polarity }) : null\n // A linear pace only makes sense for an accumulating total, not for a rate.\n const projectedValue =\n !isRate && !byPoints && progress?.projected != null && progress.elapsed ? (value as number) / progress.elapsed : null\n\n const summaryText = summary\n ? fillKpiTemplate(\n summary,\n {\n value: fmt(value),\n label,\n delta: result ? formatChange(result, display, locale, format, digits) : null,\n difference:\n result?.difference != null\n ? isRate\n ? formatPoints(result.difference, locale)\n : formatDelta(result.difference, format, locale)\n : null,\n previous: result?.previous != null ? fmt(result.previous) : null,\n target: hasTarget ? fmt(target) : null,\n achievement: progress\n ? byPoints\n ? formatPoints((value as number) - (target as number), locale)\n : pct(progress.achievement)\n : null,\n remaining: progress ? fmtDistance(progress.remaining) : null,\n },\n result && result.direction === \"none\" && baseline ? `${baseline}の実績がないため、比較できません。` : null,\n )\n : null\n\n // Target bar: actual, the pace projection and a tick at the target on one scale.\n const bar = targetBar && progress ? progressBar() : null\n\n function progressBar() {\n const actual = Math.max(value as number, 0)\n const projected = projectedValue !== null && projectedValue > actual ? projectedValue : actual\n const scale = Math.max(target as number, actual, projected)\n const at = (v: number) => (scale > 0 ? (v / scale) * 100 : 0)\n const parts = [`${tl}の ${pct(progress!.achievement)}`]\n if (projectedValue !== null && progress!.projected != null)\n parts.push(`このペースなら ${formatValue(progress!.projected, { type: \"percent\", digits: 0 }, locale)}`)\n return {\n actualAt: at(actual),\n projectedAt: at(projected),\n targetAt: at(target as number),\n lead: parts[0] as string,\n pace: parts[1] ?? null,\n }\n }\n\n let targetText: string | null = null\n if (hasTarget && !bar) {\n if (!progress) targetText = `${tl} ${fmt(target)}`\n else if (isProvisional)\n targetText = progress.achieved\n ? byPoints\n ? `${tl} ${fmt(target)} に到達(確定前)`\n : `${tl} ${fmt(target)} に対して現時点 ${pct(progress.achievement)}(確定前)`\n : byPoints\n ? `${tl} ${fmt(target)} まであと ${fmtDistance(progress.remaining)}(確定前)`\n : `${tl}まであと ${fmtDistance(progress.remaining)}(現時点 ${pct(progress.achievement)}・確定前)`\n else if (lower)\n targetText = progress.achieved\n ? `${tl} ${fmt(target)} を達成`\n : `${tl} ${fmt(target)} まであと ${fmtDistance(progress.remaining)}`\n else if (byPoints)\n targetText = progress.achieved\n ? `${tl} ${fmt(target)} に到達`\n : `${tl} ${fmt(target)} まであと ${fmtDistance(progress.remaining)}`\n else\n targetText = progress.achieved\n ? `${tl} ${fmt(target)} に到達(${pct(progress.achievement)} 達成)`\n : `${tl}まであと ${fmtDistance(progress.remaining)}(${pct(progress.achievement)} 達成)`\n }\n\n const hasFooter =\n Boolean(summaryText) || record !== null || Boolean(targetText) || sourceParts.length > 0 || hasUpdated || showSparkline\n\n const deltas = allComparisons.map((c, i) => (\n <Delta\n key={i}\n value={value}\n comparison={i === 0 ? (graded ?? c) : { ...c, grain: c.grain ?? grain }}\n polarity={polarity}\n neutralBand={neutralBand}\n format={format}\n change={display}\n digits={digits}\n locale={locale}\n />\n ))\n\n return (\n <Card data-slot=\"kpi-card\" size={size} className={cardClass} {...props}>\n <CardHeader className={HEADER_CLASS}>\n <CardDescription data-slot=\"kpi-card-label\" title={label} className=\"col-start-1 min-w-0 truncate text-[13px] font-medium text-muted-foreground\">\n {label}\n </CardDescription>\n <CardTitle\n data-slot=\"kpi-card-value\"\n title={fmt(value)}\n className={cn(\n \"col-start-1 flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 font-semibold tracking-tight tabular-nums\",\n // Fixed size: the step follows the card width only, never the length of the value.\n valueSize,\n )}\n >\n <span className=\"whitespace-nowrap\">{fmt(value)}</span>\n {isProvisional && (\n <Badge data-slot=\"kpi-card-provisional\" variant=\"outline\" className=\"align-middle\">\n {provisionalLabel}\n </Badge>\n )}\n {sample && <SampleBadge label={sample.label} />}\n </CardTitle>\n {comparison &&\n (stacked ? (\n <div data-slot=\"kpi-card-comparisons\" className=\"flex flex-wrap items-center gap-1\">\n {deltas}\n </div>\n ) : (\n <CardAction className={DELTA_PLACEMENT}>{deltas}</CardAction>\n ))}\n {hasPrevious && comparison && (\n <div data-slot=\"kpi-card-previous\" className=\"col-span-full text-sm text-muted-foreground tabular-nums\">\n {result?.previous != null ? `${baseline} ${fmt(result.previous)}` : `${baseline}の実績なし`}\n </div>\n )}\n {bar && progress && (\n <div data-slot=\"kpi-card-target-progress\" className=\"col-span-full mt-1 flex min-w-0 flex-col gap-1.5\">\n <div\n data-slot=\"kpi-card-target-bar\"\n role=\"progressbar\"\n aria-label={`${tl}に対する進捗`}\n aria-valuemin={0}\n aria-valuemax={target}\n aria-valuenow={Math.min(Math.max(value as number, 0), target as number)}\n aria-valuetext={`${tl} ${fmt(target)} に対して ${fmt(value)}(${pct(progress.achievement)})`}\n className=\"relative h-2 w-full overflow-hidden rounded-full bg-muted\"\n >\n <div className=\"absolute inset-y-0 left-0 bg-chart-1\" style={{ width: `${bar.actualAt}%` }} />\n {bar.projectedAt > bar.actualAt && (\n <div\n data-slot=\"kpi-card-target-bar-projection\"\n className=\"absolute inset-y-0 bg-chart-1/30 dark:bg-chart-1/45\"\n style={{ left: `${bar.actualAt}%`, width: `${bar.projectedAt - bar.actualAt}%` }}\n />\n )}\n <div\n data-slot=\"kpi-card-target-bar-tick\"\n className=\"absolute inset-y-0 w-px bg-foreground\"\n style={{ left: `${bar.targetAt}%`, transform: bar.targetAt >= 100 ? \"translateX(-1px)\" : undefined }}\n />\n </div>\n <p\n data-slot=\"kpi-card-target\"\n title={[bar.lead, bar.pace].filter(Boolean).join(\"・\")}\n className=\"truncate text-sm text-muted-foreground tabular-nums\"\n >\n {bar.lead}\n {bar.pace && (\n <>\n ・<span data-slot=\"kpi-card-projection\" data-estimate=\"\">{bar.pace}</span>\n </>\n )}\n {isProvisional && \"(確定前)\"}\n </p>\n </div>\n )}\n </CardHeader>\n {hasFooter && (\n <CardFooter className=\"flex-col items-start gap-1.5 text-sm\">\n {summaryText && (\n <p data-slot=\"kpi-card-summary\" title={summaryText} className=\"line-clamp-2 font-medium tabular-nums\">\n {summaryText}\n </p>\n )}\n {record && (\n <Badge data-slot=\"kpi-card-record\" variant=\"outline\">\n {record.label}\n </Badge>\n )}\n {targetText && (\n <p data-slot=\"kpi-card-target\" className=\"text-muted-foreground tabular-nums\">\n {targetText}\n </p>\n )}\n {sourceParts.length > 0 && (\n <p\n data-slot=\"kpi-card-source\"\n title={sourceParts.join(\"・\")}\n className=\"line-clamp-2 w-full text-xs text-muted-foreground tabular-nums\"\n >\n {sourceParts.join(\"・\")}\n </p>\n )}\n {hasUpdated && (\n <p data-slot=\"kpi-card-updated\" className=\"text-xs text-muted-foreground\">\n {updatedAtText(updatedAt, updatedAtDisplay, locale, now, timeZone)}\n </p>\n )}\n {showSparkline && (\n // mt-auto: the footers of a row are as tall as the tallest, so the sparklines share one bottom edge.\n <div data-slot=\"kpi-card-history\" className=\"mt-auto w-full pt-2 text-chart-1\">\n <Sparkline\n data={historyPoints.map((v) => ({ value: v }))}\n height={SPARKLINE_HEIGHT}\n color=\"text-chart-1\"\n highlight=\"latest\"\n aria-label={`${label}の推移(直近 ${historyPoints.length} 点)`}\n />\n </div>\n )}\n </CardFooter>\n )}\n </Card>\n )\n}\n\n/** 「3 分前に更新」「2026/10/20 14:30 に更新」「2026/10/20 14:30 に更新(3 分前)」。 */\nfunction updatedAtText(\n updatedAt: Date | string | number,\n display: \"relative\" | \"absolute\" | \"both\",\n locale: string,\n now: Date | number | undefined,\n timeZone?: string,\n): string {\n const relative = formatRelativeTime(updatedAt, { now, locale })\n if (display === \"relative\") return `${relative}に更新`\n const absolute = formatDate(updatedAt, \"datetime\", locale, { timeZone })\n return display === \"absolute\" ? `${absolute} に更新` : `${absolute} に更新(${relative})`\n}\n","\"use client\"\n\n/**\n * TrendIndicator — an arrow plus percentage change. Colour tracks *sentiment*,\n * not direction: set `positiveIsGood={false}` for metrics where going up is bad\n * (churn, error rate) and a rise renders as negative.\n *\n * @deprecated 新規は Delta を使う。value/direction を別々に受けるため食い違える(C4)。\n */\nimport { forwardRef } from \"react\"\nimport { ArrowDown, ArrowUp, Minus } from \"lucide-react\"\nimport { cva } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\nimport type { TrendDirection } from \"../lib/types\"\n\nconst trendIndicatorVariants = cva(\"inline-flex items-center gap-0.5 text-sm font-medium\", {\n variants: {\n sentiment: {\n positive: \"text-chart-1\",\n negative: \"text-primary\",\n neutral: \"text-muted-foreground\",\n },\n },\n defaultVariants: {\n sentiment: \"neutral\",\n },\n})\n\n/**\n * @deprecated 新規は Delta を使う。value/direction を別々に受けるため食い違える(C4)。\n */\nexport interface TrendIndicatorProps {\n value: number\n direction: TrendDirection\n positiveIsGood?: boolean\n className?: string\n}\n\n/**\n * Arrow plus percentage change.\n *\n * @deprecated 新規は Delta を使う。value/direction を別々に受けるため食い違える(C4)。\n */\nexport const TrendIndicator = forwardRef<HTMLSpanElement, TrendIndicatorProps>(\n ({ value, direction, positiveIsGood = true, className }, ref) => {\n const isGood = direction === \"neutral\" ? null : (direction === \"up\") === positiveIsGood\n const sentiment = isGood === null ? \"neutral\" : isGood ? \"positive\" : \"negative\"\n\n const Icon = direction === \"up\" ? ArrowUp : direction === \"down\" ? ArrowDown : Minus\n\n const ariaLabel =\n direction === \"neutral\"\n ? `変化なし ${value}%`\n : direction === \"up\"\n ? `${value}% 増加`\n : `${value}% 減少`\n\n return (\n <span\n ref={ref}\n data-slot=\"trend-indicator\"\n className={cn(trendIndicatorVariants({ sentiment }), className)}\n aria-label={ariaLabel}\n >\n <Icon className=\"size-3.5\" aria-hidden=\"true\" />\n <span>{value}%</span>\n </span>\n )\n },\n)\nTrendIndicator.displayName = \"TrendIndicator\"\n","\"use client\"\n\n/**\n * StatusBadge — a dot-plus-label badge for row/record status. Statuses map to a\n * tone through `defaultColorMap`; pass `colorMap` to extend or override it.\n *\n * Tones are the theme's semantic tokens — `positive` | `negative` | `warning` |\n * `info` | `neutral` — drawn as a `--<tone>` dot and text on a `--<tone>-subtle`\n * background. The legacy colour names `green` / `red` / `yellow` / `blue` /\n * `gray` are still accepted and map to positive / negative / warning / info /\n * neutral. Unknown statuses and tones fall back to `neutral`.\n *\n * The default label comes from `STATUS_VOCABULARY` (one table of status, 日本語ラベル and tone), so the same\n * state is worded the same everywhere (Tracker legends import it too):\n *\n * | status | ラベル | 色調 |\n * |---|---|---|\n * | `success` | 正常 | positive |\n * | `partial` | 一部失敗 | warning |\n * | `failed` | 失敗 | negative |\n * | `delayed` | 遅延 | warning |\n * | `running` | 実行中 | info |\n * | `stopped` | 停止中 | neutral |\n * | `active` / `inactive` | 有効 / 無効 | positive / neutral |\n * | `warning` / `error` / `pending` | 警告 / エラー / 保留中 | warning / negative / info |\n */\nimport { forwardRef } from \"react\"\n\nimport { cn } from \"../lib/utils\"\nimport { Badge } from \"../ui/badge\"\n\ntype StatusTone = \"positive\" | \"negative\" | \"warning\" | \"info\" | \"neutral\"\n\n/**\n * 状態の語彙の正本: status → 日本語ラベルと色調。StatusBadge の既定の表示と、Tracker の凡例など\n * 同じ状態を語る他の場所が、同じ語を使うためにここから参照する。\n */\nexport const STATUS_VOCABULARY = {\n success: { label: \"正常\", tone: \"positive\" },\n partial: { label: \"一部失敗\", tone: \"warning\" },\n failed: { label: \"失敗\", tone: \"negative\" },\n delayed: { label: \"遅延\", tone: \"warning\" },\n running: { label: \"実行中\", tone: \"info\" },\n stopped: { label: \"停止中\", tone: \"neutral\" },\n active: { label: \"有効\", tone: \"positive\" },\n inactive: { label: \"無効\", tone: \"neutral\" },\n warning: { label: \"警告\", tone: \"warning\" },\n error: { label: \"エラー\", tone: \"negative\" },\n pending: { label: \"保留中\", tone: \"info\" },\n} as const satisfies Record<string, { label: string; tone: StatusTone }>\n\nexport type StatusKey = keyof typeof STATUS_VOCABULARY\n\n/** 状態の日本語ラベル。語彙に無い status は渡された文字列のまま返す。 */\nexport function statusLabel(status: string): string {\n return Object.hasOwn(STATUS_VOCABULARY, status) ? STATUS_VOCABULARY[status as StatusKey].label : status\n}\n\nconst defaultColorMap: Record<string, string> = Object.fromEntries(\n Object.entries(STATUS_VOCABULARY).map(([key, { tone }]) => [key, tone]),\n)\n\n/** Legacy colour names → tones. */\nconst legacyColorTones: Record<string, StatusTone> = {\n green: \"positive\",\n gray: \"neutral\",\n yellow: \"warning\",\n red: \"negative\",\n blue: \"info\",\n}\n\n/**\n * One literal class set per tone — Tailwind only emits classes it can see\n * literally in the source.\n */\nconst toneStyles: Record<StatusTone, { dot: string; bg: string; text: string }> = {\n positive: { dot: \"bg-positive\", bg: \"bg-positive-subtle\", text: \"text-positive\" },\n negative: { dot: \"bg-negative\", bg: \"bg-negative-subtle\", text: \"text-negative\" },\n warning: { dot: \"bg-warning\", bg: \"bg-warning-subtle\", text: \"text-warning\" },\n info: { dot: \"bg-info\", bg: \"bg-info-subtle\", text: \"text-info\" },\n neutral: { dot: \"bg-neutral\", bg: \"bg-neutral-subtle\", text: \"text-neutral\" },\n}\n\nconst resolveTone = (color: string | undefined): StatusTone => {\n if (color === undefined) return \"neutral\"\n if (Object.hasOwn(toneStyles, color)) return color as StatusTone\n return legacyColorTones[color] ?? \"neutral\"\n}\n\nexport interface StatusBadgeProps {\n status: string\n label?: string\n /** status → tone (`positive` | `negative` | `warning` | `info` | `neutral`) or legacy colour name. */\n colorMap?: Partial<Record<string, string>>\n className?: string\n}\n\nexport const StatusBadge = forwardRef<HTMLSpanElement, StatusBadgeProps>(function StatusBadge(\n { status, label, colorMap, className },\n ref,\n) {\n const mergedColorMap = { ...defaultColorMap, ...colorMap }\n const style = toneStyles[resolveTone(mergedColorMap[status])]\n const displayLabel = label ?? statusLabel(status)\n\n return (\n <Badge\n ref={ref}\n data-slot=\"status-badge\"\n variant=\"outline\"\n className={cn(\"gap-1.5 border-transparent\", style.bg, style.text, className)}\n aria-label={displayLabel}\n >\n <span className={cn(\"inline-block size-2 rounded-full\", style.dot)} aria-hidden=\"true\" />\n {displayLabel}\n </Badge>\n )\n})\nStatusBadge.displayName = \"StatusBadge\"\n","\"use client\"\n\n/**\n * Placeholder — marks sample (not-yet-real) data on a template screen.\n *\n * Renders an inline `<span>`, so it is safe inside headings and descriptions\n * (unlike `Skeleton`, which is a block `<div>`). The `animate-pulse` + muted\n * styling signals \"this is placeholder data — swap in your real values\".\n * Override size/weight through `className` (e.g. `text-2xl font-bold`).\n *\n * For one value in running text or a heading. When the values of whole parts or cards are a\n * sample (a draft before its data is wired), wrap them in `SampleData` instead; do not use both\n * on the same value.\n */\nimport { forwardRef, type HTMLAttributes } from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nexport interface PlaceholderProps extends HTMLAttributes<HTMLSpanElement> {}\n\nexport const Placeholder = forwardRef<HTMLSpanElement, PlaceholderProps>(function Placeholder(\n { className, ...props },\n ref,\n) {\n return (\n <span\n ref={ref}\n data-slot=\"placeholder\"\n className={cn(\"inline-block animate-pulse motion-reduce:animate-none text-muted-foreground\", className)}\n {...props}\n />\n )\n})\nPlaceholder.displayName = \"Placeholder\"\n"]}