@squadbase/vantage 0.7.1-dev1.6a89964 → 0.7.1-dev1.9737835

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../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/charts/chart-frame.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/paired-chart.tsx","../../squadkit/registry/lib/distribution.ts","../../squadkit/registry/charts/histogram-chart.tsx","../../squadkit/registry/charts/box-plot-chart.tsx","../../squadkit/registry/components/status-badge.tsx","../../squadkit/registry/components/attention-list.tsx","../../squadkit/registry/charts/combo-chart.tsx","../../squadkit/registry/lib/forecast.ts","../../squadkit/registry/charts/forecast-chart.tsx","../../squadkit/registry/lib/color-ramp.ts","../../squadkit/registry/lib/geo.ts","../../squadkit/registry/charts/filled-map.tsx","../../squadkit/registry/charts/symbol-map.tsx","../../squadkit/registry/charts/treemap.tsx","../../squadkit/registry/components/data-table.tsx","../../squadkit/registry/components/pivot-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/placeholder.tsx","../src/runtime/draft-chart.tsx"],"names":["relative","forwardRef","jsx","jsxs","TEXT","label","ChartFrame","cell","percent","toDate","forecast","series","text","useState","useMemo","loading","NO_ROWS","useEffect","formatValue","Fragment","CategoryBar","ProgressCircle","Tracker","useRef","use","EScatterChart","GraphicComponent","textOf","ROW_STYLE","extent","Legend","cva","comparisonLabel","index","withAlpha","escapeHtml","estimateTextWidth","HistogramChart","BoxPlotChart","StatusBadge","niceStep","DEFAULT_CHART_HEIGHT","mergeDeep","q","option","rows","parseRgb","toLinear","fromLinear","toOklab","fromOklab","mixIntoSurface","loaded","colorsFor","MAX_CATEGORIES","useCallback","createContext","useContext","meta","table","_","useText","DateRangePicker","formatDateRange","SegmentedControl","NO_OPTIONS","SearchableSelect","NO_VALUES","MultiSelect","useId","ChevronDownIcon","achievement","DAY_MS","ArrowUp","ArrowDown","absolute","Minus","Placeholder"],"mappings":"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","file":"chunk-YJQCB3UP.js","sourcesContent":["/**\n * \"3 分前\" / \"3 minutes ago\" style relative timestamps via `Intl.RelativeTimeFormat`, picking the\n * largest unit whose magnitude is at least one. Without a `locale`, the page's (`<html lang>`, else `\"en-US\"`).\n */\nimport { EMPTY_VALUE } from \"./format\"\nimport { resolveLocale } from \"./locale\"\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(resolveLocale(options?.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 \"Updated 23 minutes ago\" (ja: \"23 分前に更新\"); `\"absolute-first\"` reads\n * \"Updated 16:41 (23 minutes ago)\" (ja: \"16:41 更新(23 分前)\") (the date is added when it is not today).\n * The language and date format follow the page (`<html lang>`).\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 { useLocale } from \"../hooks/use-locale\"\nimport { EMPTY_VALUE, formatDate } from \"../lib/format\"\nimport { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: {\n justNow: \"たった今\",\n relative: (relative: string) => `${relative}に更新`,\n absoluteFirst: (shown: string, relative: string) => `${shown} 更新(${relative})`,\n },\n en: {\n justNow: \"just now\",\n relative: (relative: string) => `Updated ${relative}`,\n absoluteFirst: (shown: string, relative: string) => `Updated ${shown} (${relative})`,\n },\n}\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, locale: string): string {\n if (now - at < REFRESH_MS && now - at > -REFRESH_MS) return TEXT[uiLanguage(locale)].justNow\n return formatRelativeTime(at, { now, locale })\n}\n\n/** \"2026/10/20 16:41 JST\" */\nfunction absolute(at: number, locale: string, timeZone?: string): string | undefined {\n if (!Number.isFinite(at)) return undefined\n const zone = new Intl.DateTimeFormat(locale, { timeZone, timeZoneName: \"short\" })\n .formatToParts(at)\n .find((part) => part.type === \"timeZoneName\")?.value\n const text = formatDate(at, \"datetime\", locale, { timeZone })\n return zone ? `${text} ${zone}` : text\n}\n\nfunction label(at: number, now: number, variant: \"relative\" | \"absolute-first\", locale: string, timeZone?: string): string {\n if (!Number.isFinite(at) || !Number.isFinite(now)) return EMPTY_VALUE\n const t = TEXT[uiLanguage(locale)]\n if (variant === \"relative\") {\n return now - at < REFRESH_MS && now - at > -REFRESH_MS\n ? uiLanguage(locale) === \"ja\"\n ? t.justNow\n : t.relative(t.justNow)\n : t.relative(relative(at, now, locale))\n }\n const today = formatDate(at, \"date\", locale, { timeZone }) === formatDate(now, \"date\", locale, { timeZone })\n const when = formatDate(at, \"datetime\", locale, { timeZone })\n // \"2026/10/20 16:41\" -> time only when it is today (the time is always the last 5 characters: hourCycle h23).\n const shown = today ? when.slice(-5) : when\n return t.absoluteFirst(shown, relative(at, now, locale))\n}\n\nexport const UpdatedAt = forwardRef<HTMLTimeElement, UpdatedAtProps>(\n ({ at, variant = \"relative\", timeZone, prefix, now, className }, ref) => {\n const locale = useLocale()\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, locale, timeZone) : undefined\n const classes = cn(\"text-sm text-muted-foreground tabular-nums\", className)\n const text = ready ? `${prefix ?? \"\"}${label(atMs, clock, variant, locale, 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 outermost frame of a page; every other part goes inside it.\n *\n * It is 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 { useLocale } from \"../hooks/use-locale\"\nimport { formatDateRange, EMPTY_VALUE } from \"../lib/format\"\nimport { uiLanguage } from \"../lib/locale\"\nimport { cn } from \"../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { UpdatedAt, type UpdatedAtProps } from \"./updated-at\"\n\nexport interface PageShellProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** The page heading. When given, the header (title and `description`) and the content area are drawn for you; `children` go in the content area. */\n title?: string\n /** One line under the title. Used only with `title`. */\n description?: string\n}\n\nexport const PageShell = forwardRef<HTMLDivElement, PageShellProps>(\n ({ className, title, description, children, ...props }, ref) => (\n <div ref={ref} data-slot=\"page-shell\" className={cn(\"flex flex-col\", className)} {...props}>\n {title === undefined ? (\n children\n ) : (\n <>\n <PageShellHeader>\n <PageShellHeading>\n <PageShellTitle>{title}</PageShellTitle>\n {description ? <PageShellDescription>{description}</PageShellDescription> : null}\n </PageShellHeading>\n </PageShellHeader>\n <PageShellContent>{children}</PageShellContent>\n </>\n )}\n </div>\n ),\n)\nPageShell.displayName = \"PageShell\"\n\nconst SOURCE_PREFIX = { ja: \"出典:\", en: \"Source: \" }\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 \"Source: ○○\" (ja: \"出典:○○\") 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 locale = useLocale()\n const periodText = period ? formatDateRange(period.start, period.end, { timeZone, locale }) : 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-4 px-6 pt-8\", 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 text-muted-foreground\">\n {SOURCE_PREFIX[uiLanguage(locale)]}\n {source}\n </Badge>\n ) : null}\n {periodText && periodText !== EMPTY_VALUE ? (\n <Badge variant=\"outline\" className=\"tabular-nums text-muted-foreground\">\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-semibold 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/20 dark:border-positive/25 bg-positive-subtle [&>svg]:text-positive\",\n negative: \"border-negative/20 dark:border-negative/25 bg-negative-subtle [&>svg]:text-negative\",\n warning: \"border-warning/20 dark:border-warning/25 bg-warning-subtle [&>svg]:text-warning\",\n info: \"border-info/20 dark:border-info/25 bg-info-subtle [&>svg]:text-info\",\n neutral: \"border-neutral/20 dark:border-neutral/25 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 min-w-0 flex-1 flex-col gap-6 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 { useLocale } from \"../hooks/use-locale\"\nimport { uiLanguage } from \"../lib/locale\"\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\nconst PAGE_PLACEHOLDER = { ja: \"ページを選択\", en: \"Select a page\" }\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 const placeholder = PAGE_PLACEHOLDER[uiLanguage(useLocale())]\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={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-base font-semibold tracking-tight\",\n h3: \"text-base 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 { useLocale } from \"../hooks/use-locale\"\nimport { uiLanguage } from \"../lib/locale\"\nimport { cn } from \"../lib/utils\"\nimport { Badge } from \"../ui/badge\"\n\nconst TEXT = {\n ja: { label: \"見本の値\", title: \"実データにまだつながっていない見本の値です\" },\n en: { label: \"Sample data\", title: \"Sample values, not connected to real data yet\" },\n}\n\n/**\n * The mark's wording in English (the fallback language). Without a `label`, the mark follows the page's\n * language (`<html lang>`): ja reads「見本の値」.\n */\nexport const DEFAULT_SAMPLE_LABEL = TEXT.en.label\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 /** 印の文言。既定はページの言語で「見本の値」(英語は \"Sample data\")。 */\n label?: string\n}\n\nexport function SampleBadge({ label, className, ...props }: SampleBadgeProps) {\n const t = TEXT[uiLanguage(useLocale())]\n return (\n <Badge\n data-slot=\"sample-badge\"\n title={t.title}\n className={cn(\"border-warning/20 dark:border-warning/25 bg-warning-subtle text-warning align-middle\", className)}\n {...props}\n >\n {label ?? t.label}\n </Badge>\n )\n}\n\nexport interface SampleDataProps {\n /** 印の文言。既定はページの言語で「見本の値」(英語は \"Sample data\")。 */\n label?: string\n children?: ReactNode\n}\n\nexport function SampleData({ label, children }: SampleDataProps) {\n const shown = label ?? TEXT[uiLanguage(useLocale())].label\n // A stable value, so the cards inside do not re-render when only the parent does.\n const state = useMemo(() => ({ label: shown }), [shown])\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 * DashboardCardPreset — a card (title, description, action, content) for one tile that holds a chart, ranking or table; not for a single KPI, since `KpiCard` is itself a card.\n *\n * `DashboardCard` is 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 min-w-0 grid-cols-1 content-start grid-rows-subgrid\",\n 3: \"row-span-3 grid min-w-0 grid-cols-1 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-snug 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 leading-normal 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","\"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 { useLocale } from \"../hooks/use-locale\"\nimport { ChartFrameContext } from \"../lib/chart-theme\"\nimport { uiLanguage } from \"../lib/locale\"\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 TEXT = {\n ja: { emptyTitle: \"表示できるデータがありません\", loading: \"読み込み中\" },\n en: { emptyTitle: \"No data to display\", loading: \"Loading\" },\n}\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 footnote?: string\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 footnote,\n className,\n children,\n ...props\n },\n ref,\n) {\n const id = useId()\n const t = TEXT[uiLanguage(useLocale())]\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-snug font-semibold\">\n {title}\n </h3>\n )}\n {summary && (\n <p id={summaryId} data-slot=\"chart-frame-summary\" className=\"text-sm leading-relaxed 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} loadingText={t.loading} />\n ) : state === \"empty\" ? (\n <ChartEmpty {...emptyState} defaultTitle={t.emptyTitle} />\n ) : (\n <ChartFrameContext.Provider value>{children}</ChartFrameContext.Provider>\n )}\n </div>\n {footnote && (\n <p data-slot=\"chart-frame-footnote\" className=\"text-xs leading-snug text-muted-foreground\">\n {footnote}\n </p>\n )}\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, loadingText }: { variant: ChartSkeletonVariant; loadingText: string }) {\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\">{loadingText}</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, defaultTitle }: ChartEmptyState & { defaultTitle: string }) {\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 ?? defaultTitle}</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","/**\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 { EMPTY_VALUE, formatValue, toValueFormatter, type ValueFormat } from \"./format\"\nimport { resolveLocale, uiLanguage, type UiLanguage } from \"./locale\"\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 localeArg?: string,\n): ValueFormatter {\n if (valueFormatter) return valueFormatter\n const locale = resolveLocale(localeArg)\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\ninterface CompactUnit {\n token: string\n size: number\n}\n\nconst compactUnitCache = new Map<string, CompactUnit[] | null>()\n\n/**\n * The compact-notation unit words of a locale and their sizes, largest first: `兆` / `億` / `万` in ja,\n * `T` / `B` / `M` / `K` in en. `null` when the locale's compact form puts anything between the number and its\n * word (`1,5 Mio.`), where a token cannot be swapped in place.\n */\nfunction compactUnits(locale: string): CompactUnit[] | null {\n const cached = compactUnitCache.get(locale)\n if (cached !== undefined) return cached\n let units: CompactUnit[] | null = []\n try {\n const compact = new Intl.NumberFormat(locale, { notation: \"compact\" })\n const seen = new Set<string>()\n for (let exp = 3; exp <= 15; exp++) {\n const parts = compact.formatToParts(10 ** exp)\n const at = parts.findIndex((p) => p.type === \"compact\")\n if (at === -1) continue\n if (parts[at - 1]?.type !== \"integer\" || at !== parts.length - 1) {\n units = null\n break\n }\n const token = parts[at]!.value\n if (seen.has(token)) continue\n seen.add(token)\n units.push({ token, size: 10 ** exp })\n }\n } catch {\n units = null\n }\n const sorted = units && units.length > 0 ? units.sort((a, b) => b.size - a.size) : null\n compactUnitCache.set(locale, sorted)\n return sorted\n}\n\nconst escapeRegExp = (text: string) => text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\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 units never mix on one axis (`¥0.5億` / `¥1億` / `¥1.5億`, not `¥5,000万` / `¥1億`;\n * `$0.5M` / `$1M` / `$1.5M`, not `$500K` / `$1M`). Only the short forms (`compact` / `number` / `currency`,\n * no `valueFormatter`) have units to align; any other format — an axis whose largest tick is under the smallest\n * unit (1万 / 1K), or a locale whose compact form cannot be aligned in place — keeps `resolveAxisFormatter`'s output as it is.\n */\nexport function resolveAxisTickFormatter(\n valueFormatter: ValueFormatter | undefined,\n format: ValueFormat | undefined,\n localeArg?: string,\n): (top: number) => ValueFormatter {\n const locale = resolveLocale(localeArg)\n const base = resolveAxisFormatter(valueFormatter, format, locale)\n const spec = format === undefined ? { type: \"compact\" as const } : typeof format === \"string\" ? { type: format } : format\n const units = !valueFormatter && (spec.type === \"compact\" || spec.type === \"number\" || spec.type === \"currency\") ? compactUnits(locale) : null\n if (!units) return () => base\n const number = new Intl.NumberFormat(locale, { maximumFractionDigits: 3 })\n const numberToken = new RegExp(`\\\\d[\\\\d,]*(?:\\\\.\\\\d+)?(?:${units.map((u) => escapeRegExp(u.token)).join(\"|\")})?`)\n return (top) => {\n const unit = 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.token}`\n return text.replace(numberToken, () => 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, by language. */\nexport const OTHER_SERIES_LABELS: Record<UiLanguage, string> = { ja: \"その他\", en: \"Other\" }\n\n/** The series name the folded categories get in `locale` (\"Other\" / \"その他\"). Default the page's locale (`<html lang>`). */\nexport function otherSeriesLabel(locale?: string): string {\n return OTHER_SERIES_LABELS[uiLanguage(resolveLocale(locale))]\n}\n\nconst OTHER_NAMES = new Set(Object.values(OTHER_SERIES_LABELS))\n\n/** Whether a category / row is the \"other\" bucket by name (「その他」 or \"Other\", whatever the page language). */\nexport function isOtherName(name: string | null | undefined): boolean {\n return typeof name === \"string\" && OTHER_NAMES.has(name)\n}\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 = otherSeriesLabel(),\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 = otherSeriesLabel(),\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 otherLabel: string = otherSeriesLabel(),\n): AggregatedSeries {\n if (keep === undefined || !categories.includes(keep)) return aggregateSeries(data, categories, n, otherLabel)\n const aggregated = aggregateSeries(\n data,\n categories.filter((c) => c !== keep),\n n,\n otherLabel,\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\" (`OTHER_SERIES_LABELS`) — 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) || isOtherName(category)) 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 = otherSeriesLabel() }: 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 // A row the data itself names「その他」/ \"Other\" is the same remainder: grey, like the folded slice.\n color: isOtherName(item.name) ? otherColor : 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 = otherSeriesLabel(), 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 (and a row the data names「その他」/ \"Other\") 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\"> & { name?: string })[],\n color: ChartColor,\n otherColor: string,\n): string[] {\n return rows.map((row) =>\n row.isOther || isOtherName(row.name)\n ? tintCss(otherColor, BAR_LIST_OTHER_TINT)\n : 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 /** Language of the sentence. Default the page's locale (`<html lang>`). */\n locale?: string\n}\n\nconst SUMMARY_TEXT = {\n ja: {\n up: \"、前の点より増加\",\n down: \"、前の点より減少\",\n flat: \"、前の点と横ばい\",\n latest: (label: string, value: string) => `最新 ${label} は ${value}`,\n top: (name: string, share: string) => `最大は ${name}(${share})`,\n },\n en: {\n up: \", up from the previous point\",\n down: \", down from the previous point\",\n flat: \", flat from the previous point\",\n latest: (label: string, value: string) => `Latest ${label}: ${value}`,\n top: (name: string, share: string) => `Largest: ${name} (${share})`,\n },\n}\n\n/**\n * One-sentence summary built from the rows, for `summary=\"auto\"`:\n * 「<title>: 最新 <index> は <値>、前の点より増加/減少/横ばい」(\"<title>: Latest <index>: <value>, up from the previous point\"). 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 locale = resolveLocale(input.locale)\n const t = SUMMARY_TEXT[uiLanguage(locale)]\n const text = input.valueFormatter ?? toValueFormatter(input.format ?? \"compact\", locale)\n const prev = points[points.length - 2]\n const direction = !prev ? \"\" : latest.value > prev.value ? t.up : latest.value < prev.value ? t.down : t.flat\n const head = input.title ? `${input.title}: ` : \"\"\n return `${head}${t.latest(latest.label, text(latest.value))}${direction}`\n}\n\n/**\n * `summary=\"auto\"` for a donut: 「<title>: 最大は <名前>(<構成比>)」(\"<title>: Largest: <name> (<share>)\") from the slices\n * (largest first). `undefined` when there is nothing to describe. `locale` picks the language; default the page's.\n */\nexport function buildShareSummary(\n slices: readonly { name: string; value: number }[],\n title?: string,\n locale?: 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}: ` : \"\"}${SUMMARY_TEXT[uiLanguage(resolveLocale(locale))].top(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 come from the grain of the period, in the locale's language (`<html lang>` unless a\n * `locale` is passed): a monthly KPI compares \"vs. prior month\" / \"vs. same month last year\"\n * (ja: \"前月比\" / \"前年同月比\"), a quarterly one \"前四半期比\" / \"前年同期比\" in ja. Without a\n * grain the label is the generic \"vs. prior period\" (ja: \"前期比\").\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 { formatDelta, formatKind, formatPoints, formatValue, type ValueFormat } from \"./format\"\nimport { resolveLocale, uiLanguage, type UiLanguage } from \"./locale\"\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/**\n * Labels used when the grain is unknown, in English (the fallback language). A `custom` comparison always brings\n * its own `label`. The parts pick the language from `<html lang>` (`comparisonLabel`): ja reads \"前期比\" / \"前年同期比\" / \"目標比\".\n */\nexport const COMPARISON_LABELS: Record<Exclude<ComparisonKind, \"custom\">, string> = {\n \"prior-period\": \"vs. prior period\",\n \"prior-year\": \"vs. same period last year\",\n target: \"vs. target\",\n}\n\ntype BaselineNouns = Record<Exclude<ComparisonKind, \"target\" | \"custom\">, Record<PeriodGrain | \"unknown\", string>> & {\n target: string\n custom: string\n}\n\n/** The baseline each comparison is made against, by grain (\"prior month\", \"same month last year\"). */\nconst BASELINE_NOUNS: Record<UiLanguage, BaselineNouns> = {\n ja: {\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 target: \"目標\",\n custom: \"比較対象\",\n },\n en: {\n \"prior-period\": {\n day: \"prior day\",\n week: \"prior week\",\n month: \"prior month\",\n quarter: \"prior quarter\",\n year: \"prior year\",\n unknown: \"prior period\",\n },\n \"prior-year\": {\n day: \"same day last year\",\n week: \"same week last year\",\n month: \"same month last year\",\n quarter: \"same quarter last year\",\n year: \"prior year\",\n unknown: \"same period last year\",\n },\n target: \"target\",\n custom: \"baseline\",\n },\n}\n\n/** The badge's name from a baseline noun: \"前月比\" / \"vs. prior month\". */\nconst LABEL_OF: Record<UiLanguage, (baseline: string) => string> = {\n ja: (baseline) => `${baseline}比`,\n en: (baseline) => `vs. ${baseline}`,\n}\n\n/** A given badge name minus its comparison word: \"昨日比\" → \"昨日\", \"vs. yesterday\" → \"yesterday\". */\nfunction baselineOfLabel(named: string, language: UiLanguage): string {\n if (named.length > 1 && named.endsWith(\"比\")) return named.slice(0, -1)\n if (language === \"en\") {\n const stripped = named.replace(/^vs\\.?\\s+/i, \"\")\n if (stripped) return stripped\n }\n return named\n}\n\n/**\n * What the previous value is called: \"prior month\" / \"same month last year\" / \"target\" (ja: \"前月\" / \"前年同月\" / \"目標\");\n * with a `label`, that label minus its comparison word (\"昨日比\" → \"昨日\", \"vs. yesterday\" → \"yesterday\").\n * `toDate` (a running total such as YTD) turns a `prior-year` baseline into \"same period last year\" (ja: \"前年同期\") whatever the grain.\n * `locale` picks the language; default the page's (`<html lang>`).\n */\nexport function comparisonBaseline(\n vs: ComparisonKind,\n grain?: PeriodGrain,\n label?: string,\n toDate?: boolean,\n locale?: string,\n): string {\n const language = uiLanguage(resolveLocale(locale))\n const nouns = BASELINE_NOUNS[language]\n const named = label?.trim()\n if (named) return baselineOfLabel(named, language)\n if (vs === \"target\") return nouns.target\n if (vs === \"prior-year\" && toDate) return nouns[\"prior-year\"].unknown\n // an unknown `vs` reads like \"custom\" rather than throwing\n if (vs !== \"prior-year\" && vs !== \"prior-period\") return nouns.custom\n return nouns[vs][grain ?? \"unknown\"]\n}\n\n/**\n * The comparison label: \"vs. prior month\" (ja: \"前月比\") for `(\"prior-period\", \"month\")`, \"vs. prior period\" (ja: \"前期比\")\n * without a grain; a given `label` as is. A running total (`toDate`) against the prior year is \"vs. same period last year\"\n * (ja: \"前年同期比\"), not \"vs. prior year\" (ja: \"前年比\"). `locale` picks the language; default the page's (`<html lang>`).\n */\nexport function comparisonLabel(vs: ComparisonKind, grain?: PeriodGrain, label?: string, toDate?: boolean, locale?: string): string {\n if (label?.trim()) return label\n const resolved = resolveLocale(locale)\n return LABEL_OF[uiLanguage(resolved)](comparisonBaseline(vs, grain, undefined, toDate, resolved))\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 /** Locale of the derived `label`. Default the page's (`<html lang>`). */\n locale?: string\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, options?.locale)\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,\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,\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 { resolveLocale, uiLanguage, type UiLanguage } from \"./locale\"\nimport type {\n ChartThreshold,\n ChartTone,\n ChartAnnotation,\n ChartCommonProps,\n ChartEventPayload,\n ChartForecast,\n ChartForecastRow,\n ChartHighlight,\n NumericKeys,\n} from \"./types\"\n\n/** The built-in words of the option builders, by language. */\nconst CHART_TEXT = {\n ja: {\n target: \"目標\",\n forecast: \"予測\",\n total: \"合計\",\n provisional: \"速報\",\n noComparison: \"比較なし\",\n share: (share: string) => `(${share})`,\n targetRate: (rate: string) => `(達成率 ${rate})`,\n provisionalTitle: (title: string, label: string) => `${title}(${label})`,\n },\n en: {\n target: \"Target\",\n forecast: \"Forecast\",\n total: \"Total\",\n provisional: \"Preliminary\",\n noComparison: \"No comparison\",\n share: (share: string) => ` (${share})`,\n targetRate: (rate: string) => ` (${rate} achieved)`,\n provisionalTitle: (title: string, label: string) => `${title} (${label})`,\n },\n} satisfies Record<UiLanguage, unknown>\n\nconst chartText = (locale?: string) => CHART_TEXT[uiLanguage(resolveLocale(locale))]\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 and the built-in words (total, target, forecast). Default the page's (`<html lang>`). */\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/** Under this plot width (px) the axis, legend and labels switch to their compact form. */\nconst NARROW_PLOT_WIDTH = 400\n/** The most x labels a narrow plot shows (a 262px plot reads 4 at most). */\nconst NARROW_TIME_AXIS_MAX_LABELS = 4\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 localeArg?: string,\n shown: (i: number) => boolean = () => true,\n): string[] | null {\n const parsed = parseTimeIndex(values)\n if (!parsed) return null\n const locale = resolveLocale(localeArg)\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[], localeArg?: string): string[] | null {\n const parsed = parseTimeIndex(values)\n if (!parsed) return null\n const locale = resolveLocale(localeArg)\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 locale?: string,\n): string {\n const t = chartText(locale)\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(t.share(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) in `locale`: \"Target\" / 「目標」. Default the page's locale. */\nexport function barTargetLabel(locale?: string): string {\n return chartText(locale).target\n}\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%)」 / \"Target $12M (85.3% achieved)\". `null` without a target. */\nexport function barTargetNote(\n label: string,\n value: number | null,\n target: number | null,\n valueFormatter: (value: number) => string,\n locale?: string,\n): string | null {\n if (target === null) return null\n const rate = achievementRate(value, target)\n return `${label} ${valueFormatter(target)}${rate === null ? \"\" : chartText(locale).targetRate(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\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.\n * Without a `label`, \"Forecast\" / 「予測」 in `locale` (default the page's).\n */\nexport function forecastBoundaryText(label?: string, locale?: string): string {\n return `${label ?? chartText(locale).forecast} →`\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) in `locale`: \"Total\" / 「合計」. Default the page's locale. */\nexport function stackTotalLabel(locale?: string): string {\n return chartText(locale).total\n}\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 // A narrow plot has no room for the PNG buttons beside the legend: they move off its line, so no reserve.\n const narrow = plotWidth !== undefined && plotWidth < NARROW_PLOT_WIDTH\n const budget = Math.max(80, (plotWidth ? (narrow ? plotWidth : Math.min(LEGEND_LINE_BUDGET, plotWidth)) : LEGEND_LINE_BUDGET) - (narrow ? 0 : 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% vs. same month last year\" / \"↑ +12.4% 前年同月比\"; a minus is U+2212).\n * \"No comparison vs. same month last year\" / \"比較なし 前年同月比\" when 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 localeArg?: string,\n): string {\n const locale = resolveLocale(localeArg)\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 { locale },\n )\n const text = formatChange(result, defaultChangeDisplay(format), locale, format)\n if (text === null) return `${chartText(locale).noComparison} ${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 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 locale = resolveLocale(cfg.locale)\n const text = chartText(locale)\n const provisionalLabel = cfg.provisionalLabel ?? text.provisional\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\n ? Math.max(\n 2,\n Math.min(\n plotWidth < NARROW_PLOT_WIDTH ? NARROW_TIME_AXIS_MAX_LABELS : TIME_AXIS_MAX_LABELS,\n Math.floor(plotWidth / TIME_LABEL_WIDTH),\n ),\n )\n : 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 // By default only the latest value is labelled; an explicit `highlight` keeps its max + latest.\n const latestOnly = cfg.highlight === undefined && !shareHighlight && picked.length === 2\n const highlightPoints =\n latestOnly\n ? [picked[1]!]\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 ?? `${text.target} ${axisFormatter(target)}`) : \"\"\n const highlightText = (value: number) =>\n shareHighlight ? `${Math.round(value)}%` : `${stackTotals ? `${text.total} ` : \"\"}${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 ?? text.target\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 // Hovering a series fades the others (not for a stack, where the bands read together).\n emphasis: stacked ? undefined : { focus: \"series\" as const },\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 ?? text.forecast\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 // Narrow: left-aligned and wrapping above the plot, so nothing is cut off at the right edge.\n ...(plotWidth !== undefined && plotWidth < NARROW_PLOT_WIDTH\n ? { left: 0, right: 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 // Rows follow the legend order (categories first), not ECharts' own series order.\n const legendRank = (p: AxisTooltipParam) => {\n const at = categories.indexOf(p.seriesName ?? \"\")\n return at === -1 ? categories.length : at\n }\n for (const p of [...list].sort((a, b) => legendRank(a) - legendRank(b))) {\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: text.total, 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: text.total, 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, locale)\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 ? text.provisionalTitle(title, provisionalLabel) : title, rows, valueFormatter, lines, locale)\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 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 (「合計」 / \"Total\" in `locale`, default the page's), 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, unit, locale }: { totalLabel?: string; unit?: string; locale?: string } = {},\n): { label: string; value: string; amount: string; unit?: string } {\n totalLabel ??= chartText(locale).total\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, in `locale`: \"Preliminary\" / 「速報」. Default the page's locale. */\nexport function defaultProvisionalLabel(locale?: string): string {\n return chartText(locale).provisional\n}\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 { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface } from \"../lib/chart-theme\"\nimport {\n chartRootProps,\n aggregateSeriesKeeping,\n buildChartSummary,\n chartDataTable,\n resolveAxisFormatter,\n resolveAxisTickFormatter,\n resolveValueFormatter,\n seriesColorsWithComparison,\n otherSeriesLabel,\n} from \"../lib/chart-utils\"\nimport { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: { item: \"項目\", chart: (categories: readonly string[]) => `${categories.join(\"・\")}の面グラフ` },\n en: { item: \"Item\", chart: (categories: readonly string[]) => `Area chart of ${categories.join(\", \")}` },\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 // Highlight labels are backed by the surface the chart sits on (a card, the page).\n const { ref: frameRef, surface, width: plotWidth, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n // Ticks and on-plot labels read short (¥1億); the tooltip reads the value as `format` says.\n const tooltipFormatter = useMemo(() => resolveValueFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n const axisFormatter = useMemo(() => resolveAxisFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n // Ticks share one unit — the largest tick's (¥0.5億 / ¥1億).\n const axisTicks = useMemo(() => resolveAxisTickFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\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(\n () => aggregateSeriesKeeping(data, categories, comparisonCategory, undefined, otherSeriesLabel(locale)),\n [data, categories, comparisonCategory, locale],\n )\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 locale,\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, locale,\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, t.item)\n const times = timeTooltipLabels(series.data.map((row) => row[index]), locale)\n return times ? { ...table, rows: table.rows.map((row, i) => [times[i] ?? row[0] ?? \"\", ...row.slice(1)]) } : table\n }, [series, index, tooltipFormatter, labels, t, locale])\n const label = ariaLabel ?? t.chart(categories)\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildChartSummary({ data, index, categories, title, format, valueFormatter, locale }) : summary),\n [summary, data, index, categories, title, format, valueFormatter, locale],\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 { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR, resolveChartColors, resolveFillColors, useChartSurface } from \"../lib/chart-theme\"\nimport { chartFillName, chartRootProps, aggregateSeries, buildChartSummary, chartDataTable, resolveAxisFormatter, resolveAxisTickFormatter, resolveValueFormatter, seriesColorsFor, otherSeriesLabel } from \"../lib/chart-utils\"\nimport { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: { item: \"項目\", chart: (categories: readonly string[]) => `${categories.join(\"・\")}の棒グラフ` },\n en: { item: \"Item\", chart: (categories: readonly string[]) => `Bar chart of ${categories.join(\", \")}` },\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 // Highlight labels are backed by the surface the chart sits on (a card, the page).\n const { ref: frameRef, surface, width: plotWidth, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n // Ticks and on-plot labels read short (¥1億); the tooltip reads the value as `format` says.\n const tooltipFormatter = useMemo(() => resolveValueFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n const axisFormatter = useMemo(() => resolveAxisFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n // Ticks share one unit — the largest tick's (¥0.5億 / ¥1億).\n const axisTicks = useMemo(() => resolveAxisTickFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n const series = useMemo(() => aggregateSeries(data, categories, undefined, otherSeriesLabel(locale)), [data, categories, locale])\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 locale,\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, locale,\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, t.item)\n const times = timeTooltipLabels(series.data.map((row) => row[index]), locale)\n return times ? { ...table, rows: table.rows.map((row, i) => [times[i] ?? row[0] ?? \"\", ...row.slice(1)]) } : table\n }, [series, index, tooltipFormatter, labels, t, locale])\n const label = ariaLabel ?? t.chart(categories)\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildChartSummary({ data, index, categories, title, format, valueFormatter, locale }) : summary),\n [summary, data, index, categories, title, format, valueFormatter, locale],\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 { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface } from \"../lib/chart-theme\"\nimport {\n chartRootProps,\n aggregateSeriesKeeping,\n buildChartSummary,\n chartDataTable,\n resolveAxisFormatter,\n resolveAxisTickFormatter,\n resolveValueFormatter,\n seriesColorsWithComparison,\n otherSeriesLabel,\n} from \"../lib/chart-utils\"\nimport { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: { item: \"項目\", chart: (categories: readonly string[]) => `${categories.join(\"・\")}の折れ線グラフ` },\n en: { item: \"Item\", chart: (categories: readonly string[]) => `Line chart of ${categories.join(\", \")}` },\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 // Highlight labels are backed by the surface the chart sits on (a card, the page).\n const { ref: frameRef, surface, width: plotWidth, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n // Ticks and on-plot labels read short (¥1億); the tooltip reads the value as `format` says.\n const tooltipFormatter = useMemo(() => resolveValueFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n const axisFormatter = useMemo(() => resolveAxisFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n // Ticks share one unit — the largest tick's (¥0.5億 / ¥1億).\n const axisTicks = useMemo(() => resolveAxisTickFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\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(\n () => aggregateSeriesKeeping(data, categories, comparisonCategory, undefined, otherSeriesLabel(locale)),\n [data, categories, comparisonCategory, locale],\n )\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 locale,\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, locale,\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, t.item)\n const times = timeTooltipLabels(series.data.map((row) => row[index]), locale)\n return times ? { ...table, rows: table.rows.map((row, i) => [times[i] ?? row[0] ?? \"\", ...row.slice(1)]) } : table\n }, [series, index, tooltipFormatter, labels, t, locale])\n const label = ariaLabel ?? t.chart(categories)\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildChartSummary({ data, index, categories, title, format, valueFormatter, locale }) : summary),\n [summary, data, index, categories, title, format, valueFormatter, locale],\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 { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface } from \"../lib/chart-theme\"\nimport {\n chartRootProps,\n buildShareSummary,\n chartFillName,\n chartFillToCss,\n chartDataTable,\n donutSlices,\n otherSeriesLabel,\n resolveValueFormatter,\n} 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 { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: { item: \"項目\", value: \"値\", chart: (shares: readonly string[]) => `構成比のドーナツグラフ(${shares.join(\"、\")})` },\n en: { item: \"Item\", value: \"Value\", chart: (shares: readonly string[]) => `Donut chart of shares (${shares.join(\", \")})` },\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 locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n const valueFormatter = useMemo(() => resolveValueFormatter(valueFormatterProp, format, locale), [valueFormatterProp, format, locale])\n\n const { ref: frameRef, tokens } = useChartSurface(ref)\n const slices = useMemo(\n () =>\n donutSlices(data, { index: labelKey, value: valueKey, colors, maxSlices, otherColor: CHART_OTHER_COLOR, otherLabel: otherSeriesLabel(locale) }),\n [data, labelKey, valueKey, colors, maxSlices, locale],\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, locale })\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 = ariaLabel ?? t.chart(legend.map((item) => `${labelOf(item.name, labels)} ${item.share}`))\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] ?? t.item, value: labels?.[valueKey] ?? t.value },\n ),\n [rows, labelKey, valueKey, valueFormatter, labels, t],\n )\n\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildShareSummary(slices, title, locale) : summary),\n [summary, slices, title, locale],\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=\"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 { useLocale } from \"../hooks/use-locale\"\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 otherSeriesLabel,\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 { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: { item: \"項目\", value: \"値\" },\n en: { item: \"Item\", value: \"Value\" },\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 locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\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, locale)\n const baseRows = barListRows(data, {\n index,\n category: categories?.[0],\n sortOrder: barListOptions?.sortOrder ?? sortOrder ?? \"descending\",\n maxItems,\n otherLabel: barListOptions?.otherLabel ?? otherSeriesLabel(locale),\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]) || t.item, value: (categories?.[0] && labels?.[categories[0]]) || t.value },\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 { useLocale } from \"../hooks/use-locale\"\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 locale = useLocale()\n const valueFormatter = useMemo(() => resolveAxisFormatter(valueFormatterProp, format, locale), [valueFormatterProp, format, locale])\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`; put no parts inside it, only text (usually\n * the percentage) as children in the middle. 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, useCallback, useRef, 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 containerRef = useRef<HTMLDivElement>(null)\n const setRef = useCallback((node: HTMLDivElement | null) => {\n containerRef.current = node\n if (typeof ref === \"function\") return ref(node)\n if (ref) ref.current = node\n }, [ref])\n const fallback = defaultColor ? blockColorToCss(defaultColor) : DEFAULT_BLOCK_COLOR\n return (\n <div ref={setRef} 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 container={containerRef}>{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 { useLocale } from \"../hooks/use-locale\"\nimport { resolveChartColors, resolveFillColors, useChartSurface } 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 { resolveLocale, uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: {\n net: \"純増\",\n total: \"合計\",\n change: \"増減\",\n cumulative: \"累計\",\n cumulativeChange: \"累計増減\",\n item: \"項目\",\n start: \"開始\",\n end: \"終了\",\n fromTo: (from: string, to: string, net: string) => `${from} → ${to}(${net})`,\n from: (from: string, net: string) => `${from} から ${net}`,\n to: (to: string, net: string) => `${to}(${net})`,\n netOnly: (net: string) => `増減の合計 ${net}`,\n increase: (name: string, value: string) => `最大の増加は ${name}(${value})`,\n decrease: (name: string, value: string) => `最大の減少は ${name}(${value})`,\n sentenceJoin: \"。\",\n chart: (label: string) => `${label}のウォーターフォールチャート`,\n },\n en: {\n net: \"Net change\",\n total: \"Total\",\n change: \"Change\",\n cumulative: \"Cumulative\",\n cumulativeChange: \"Cumulative change\",\n item: \"Item\",\n start: \"Start\",\n end: \"End\",\n fromTo: (from: string, to: string, net: string) => `${from} → ${to} (${net})`,\n from: (from: string, net: string) => `${net} from ${from}`,\n to: (to: string, net: string) => `${to} (${net})`,\n netOnly: (net: string) => `Net change ${net}`,\n increase: (name: string, value: string) => `Largest increase: ${name} (${value})`,\n decrease: (name: string, value: string) => `Largest decrease: ${name} (${value})`,\n sentenceJoin: \". \",\n chart: (label: string) => `Waterfall chart of ${label}`,\n },\n}\n\nconst textOf = (locale?: string) => TEXT[uiLanguage(resolveLocale(locale))]\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; locale?: string },\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: deltaTotalName(config.locale), 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, in `locale` (\"Net change\" / 「純増」). Default the page's locale. */\nexport function deltaTotalName(locale?: string): string {\n return textOf(locale).net\n}\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(\n ends: WaterfallDeltaEnds,\n formatter: ValueFormatter,\n labels?: Record<string, string>,\n locale?: string,\n): string {\n const t = textOf(locale)\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 t.fromTo(from, to, net)\n if (from) return t.from(from, net)\n if (to) return t.to(to, net)\n return t.netOnly(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 locale?: string,\n): string | undefined {\n const t = textOf(locale)\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, locale)\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(t.increase(name(up), signedText(up.value!, formatter)))\n if (down) parts.push(t.decrease(name(down), signedText(down.value!, formatter)))\n return `${head}${parts.join(t.sentenceJoin)}`\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 locale?: string,\n): ChartDataTable {\n const t = textOf(locale)\n const label = (key: string) => labelOf(key, labels)\n const rows = steps.map((s) => [\n label(s.name),\n s.kind === \"total\" ? (delta ? t.net : t.total) : 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] ?? t.item, t.change, delta ? t.cumulativeChange : t.cumulative],\n rows: delta ? [...end(delta.opening, t.start), ...rows, ...end(delta.closing, t.end)] : 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 /** Language of the tooltip. Default the page's locale (`<html lang>`). */\n locale?: 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 t = textOf(config.locale)\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 ? t.net : t.total, delta ? signedText(step.end, valueFormatter) : valueFormatter(step.end))\n : line(t.change, waterfallStepText(step, valueFormatter)) +\n (step.kind === \"gap\"\n ? \"\"\n : delta\n ? line(t.cumulativeChange, signedText(step.end, valueFormatter))\n : line(t.cumulative, 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 { ref: frameRef, width: plotWidth, tokens } = useChartSurface(ref)\n // Value labels and the tooltip read in full (as `format` says); ticks read short.\n const locale = useLocale()\n const valueFormatter = useMemo(() => resolveValueFormatter(valueFormatterProp, format, locale), [valueFormatterProp, format, locale])\n const axisFormatter = useMemo(() => resolveAxisFormatter(valueFormatterProp, format, locale), [valueFormatterProp, format, locale])\n const steps = useMemo(\n () => waterfallSteps(data, { index, value: valueKey, totals, mode, locale }),\n [data, index, valueKey, totals, mode, locale],\n )\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, locale) : undefined), [ends, valueFormatter, labels, locale])\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 locale,\n }),\n [steps, colors, polarity, labels, valueFormatter, axisFormatter, showValues, showTooltip, tokens, mode, deltaNote, plotWidth, chartOptions, minValue, maxValue, yAxisWidth, locale],\n )\n const dataTable = useMemo(\n () => waterfallDataTable(steps, { index, value: valueKey }, valueFormatter, labels, ends, locale),\n [steps, index, valueKey, valueFormatter, labels, ends, locale],\n )\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildWaterfallSummary(steps, valueFormatter, title, labels, ends, locale) : summary),\n [summary, steps, valueFormatter, title, labels, ends, locale],\n )\n const t = textOf(locale)\n const label = ariaLabel ?? t.chart(labelOf(valueKey, labels) || t.change.toLowerCase())\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 { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface } from \"../lib/chart-theme\"\nimport { chartMotion, escapeHtml, estimateTextWidth, labelOf, mergeChartOptions } from \"../lib/chart-options\"\nimport {\n MAX_CHART_SERIES,\n otherSeriesLabel,\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 { resolveLocale, uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: {\n who: (name: string, value: string) => `${name}(${value})`,\n summary: (count: number, y: string, who: string) => `${count}点。${y}が最大なのは ${who}`,\n name: \"名前\",\n series: \"系列\",\n x: \"横軸\",\n y: \"縦軸\",\n size: \"大きさ\",\n pair: (y: string, x: string) => `${y}×${x}`,\n first: (pair: string, count: number) => `${pair}(先頭 ${count} 点)`,\n guide: (label: string, axis: string, value: string) => `${label}(${axis} ${value})`,\n caption: (base: string, guides: readonly string[]) => `${base}。基準線: ${guides.join(\"、\")}`,\n chart: (y: string, x: string) => `${y}×${x}の散布図`,\n },\n en: {\n who: (name: string, value: string) => `${name} (${value})`,\n summary: (count: number, y: string, who: string) => `${count === 1 ? \"1 point\" : `${count} points`}. Highest ${y}: ${who}`,\n name: \"Name\",\n series: \"Series\",\n x: \"X\",\n y: \"Y\",\n size: \"Size\",\n pair: (y: string, x: string) => `${y} × ${x}`,\n first: (pair: string, count: number) => `${pair} (first ${count} points)`,\n guide: (label: string, axis: string, value: string) => `${label} (${axis} ${value})`,\n caption: (base: string, guides: readonly string[]) => `${base}. Reference lines: ${guides.join(\", \")}`,\n chart: (y: string, x: string) => `Scatter plot of ${y} × ${x}`,\n },\n}\n\nconst textOf = (locale?: string) => TEXT[uiLanguage(resolveLocale(locale))]\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(\n points: readonly ScatterPoint[],\n max: number = MAX_CHART_SERIES,\n otherLabel: string = otherSeriesLabel(),\n): 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: otherLabel, 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. `locale` picks the language; default the page's. */\nexport function buildScatterSummary(\n points: readonly ScatterPoint[],\n yName: string,\n yFormatter: ValueFormatter,\n title?: string,\n labels?: Record<string, string>,\n locale?: string,\n): string | undefined {\n if (points.length === 0) return undefined\n const t = textOf(locale)\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 ? t.who(labelOf(best.name, labels), yFormatter(best.y)) : yFormatter(best.y)\n return `${head}${t.summary(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 /** Language of the headers and caption. Default the page's locale (`<html lang>`). */\n locale?: string\n },\n): ChartDataTable {\n const t = textOf(config.locale)\n const label = (key: string) => labelOf(key, config.labels)\n // Column headers: the caller's `labels`, else a plain 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, t.name)] : []),\n ...(config.series ? [column(config.series, t.series)] : []),\n column(config.x, t.x),\n column(config.y, t.y),\n ...(config.size ? [column(config.size, t.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 pair = t.pair(label(config.y), label(config.x))\n const base = points.length > shown.length ? t.first(pair, shown.length) : pair\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 ? t.guide(line.label, label(key), text) : `${label(key)} ${text}`\n })\n return {\n caption: guides.length > 0 ? t.caption(base, guides) : 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 { ref: frameRef, width: plotWidth, tokens } = useChartSurface(ref)\n const locale = useLocale()\n // Tooltips and the table read in full; axis ticks read short.\n const formatters = useMemo(\n () => ({\n x: resolveValueFormatter(valueFormatter, xFormat ?? format, locale),\n y: resolveValueFormatter(valueFormatter, yFormat ?? format, locale),\n size: resolveValueFormatter(valueFormatter, sizeFormat ?? format, locale),\n }),\n [valueFormatter, xFormat, yFormat, sizeFormat, format, locale],\n )\n const axisFormatters = useMemo(\n () => ({\n x: resolveAxisFormatter(valueFormatter, xFormat ?? format, locale),\n y: resolveAxisFormatter(valueFormatter, yFormat ?? format, locale),\n }),\n [valueFormatter, xFormat, yFormat, format, locale],\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, undefined, otherSeriesLabel(locale)), [points, locale])\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, locale }),\n [points, x, y, size, index, labelKey, seriesKey, formatters, labels, referenceLines, locale],\n )\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildScatterSummary(points, y, formatters.y, title, labels, locale) : summary),\n [summary, points, y, formatters, title, labels, locale],\n )\n const label = ariaLabel ?? textOf(locale).chart(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 { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR } from \"../lib/chart-theme\"\nimport { chartFillToCss, seriesColorsFor } from \"../lib/chart-utils\"\nimport { labelOf } from \"../lib/chart-options\"\nimport { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: { legend: \"凡例\" },\n en: { legend: \"Legend\" },\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 const t = TEXT[uiLanguage(useLocale())]\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 ?? t.legend}\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; put no parts inside it. 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 { useLocale } from \"../hooks/use-locale\"\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 { uiLanguage } from \"../lib/locale\"\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 locale?: string,\n): (value: number) => string {\n return resolveValueFormatter(valueFormatter ?? formatValue, format, locale)\n}\n\nconst TEXT = {\n ja: {\n step: \"ステップ\",\n value: \"値\",\n previous: \"前期\",\n previousHeader: \"前期\",\n change: (label: string, points: string) => `(${label}比 ${points})`,\n funnel: \"ファネル\",\n },\n en: {\n step: \"Step\",\n value: \"Value\",\n previous: \"prior period\",\n previousHeader: \"Prior period\",\n change: (label: string, points: string) => `(vs. ${label} ${points})`,\n funnel: \"Funnel\",\n },\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 locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n const format = resolveFunnelFormatter(valueFormatter, formatValue, valueFormat, locale)\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 ?? t.previous\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 {\n label: labels?.[index] ?? t.step,\n value: (categories?.[0] && labels?.[categories[0]]) || t.value,\n previous: comparison?.label ?? t.previousHeader,\n },\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 {t.change(comparisonLabel, formatPoints(conversionChange(values, previous, index + 1), locale))}\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 ?? t.funnel}\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 { useLocale } from \"../hooks/use-locale\"\nimport { resolveChartColors, useChartSurface, 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 { resolveLocale, uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: {\n join: \"・\",\n flagged: \"要注意\",\n item: \"項目\",\n top: (y: string, x: string, value: string) => `最大は ${y} ${x} の ${value}`,\n chart: (y: string, x: string) => `${y}×${x}のヒートマップ`,\n },\n en: {\n join: \", \",\n flagged: \"Needs attention\",\n item: \"Item\",\n top: (y: string, x: string, value: string) => `Highest: ${y} ${x} (${value})`,\n chart: (y: string, x: string) => `Heatmap of ${y} × ${x}`,\n },\n}\n\nconst textOf = (locale?: string) => TEXT[uiLanguage(resolveLocale(locale))]\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 /** Language of the tooltip. Default the page's locale (`<html lang>`). */\n locale?: string\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 t = textOf(config.locale)\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(t.join)\n const flag = cell.flagged ? `${t.join}${t.flagged}` : \"\"\n return `${head} ${main}${extras ? `${t.join}${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 locale?: 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] ?? textOf(locale).item, ...model.xs.map(label)], rows }\n}\n\n/**\n * `summary=\"auto\"`: the strongest cell, e.g. 「最大は 月曜 9時台 の 12件」 / \"Highest: Mon 9am (12)\". `undefined` with no usable cell.\n * `locale` picks the language; default the page's (`<html lang>`).\n */\nexport function buildHeatmapSummary(\n model: HeatmapModel,\n formatter: ValueFormatter,\n title?: string,\n labels?: Record<string, string>,\n locale?: string,\n): 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}${textOf(locale).top(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 { ref: frameRef, surface, width: plotWidth, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const formatter = useMemo(() => resolveValueFormatter(valueFormatter, format ?? \"number\", locale), [valueFormatter, format, locale])\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 locale,\n }),\n [model, x, y, value, colors, surface, tokens, labels, formatter, details, showValues, showTooltip, plotWidth, chartOptions, locale],\n )\n const dataTable = useMemo(() => heatmapDataTable(model, { x, y }, formatter, labels, locale), [model, x, y, formatter, labels, locale])\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildHeatmapSummary(model, formatter, title, labels, locale) : summary),\n [summary, model, formatter, title, labels, locale],\n )\n const label = ariaLabel ?? textOf(locale).chart(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 * PairedChart — 量(棒)と率・単価(線)を、同じ期間軸の上下 2 段で見せる型付きグラフ(`DashboardCardPreset` の中に置く)。\n * 二重 Y 軸は持たない: 上段が棒の値軸、下段が線の値軸で、横軸(期間)とツールチップの位置は\n * 1 つの ECharts の中で揃っている(ホバーすると同じ期間の棒と線の値が 1 枚のツールチップに出る)。\n * 段ごとに `format`(件数・金額・%)を持ち、率を分子・分母から計算することはしない(呼び元が値を渡す)。\n * 棒は 0 起点。色は `--chart-1..5` を固定順(棒 → 線の順に続く)で使い、ライト/ダークに追従する。\n * `ChartFrame` の中に描く(見出し・要約・読み込み中・空表示)。\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface } from \"../lib/chart-theme\"\nimport {\n DEFAULT_CHART_COLORS,\n chartDataTable,\n chartRootProps,\n resolveAxisFormatter,\n resolveAxisTickFormatter,\n resolveValueFormatter,\n seriesColorsFor,\n} from \"../lib/chart-utils\"\nimport {\n buildCartesianOption,\n labelOf,\n labelRows,\n mergeChartOptions,\n timeTooltipLabels,\n tooltipHtml,\n type TooltipRow,\n} from \"../lib/chart-options\"\nimport type { CartesianStackType } from \"../lib/chart-options\"\nimport type { ChartCommonProps, ChartColors, NumericKeys, ValueFormatter } from \"../lib/types\"\nimport type { ValueFormat } from \"../lib/format\"\nimport { uiLanguage } from \"../lib/locale\"\n\nconst TEXT = {\n ja: { item: \"項目\", chart: (keys: readonly string[]) => `${keys.join(\"・\")}の推移(上段 棒、下段 線)` },\n en: { item: \"Item\", chart: (keys: readonly string[]) => `Trend of ${keys.join(\", \")} (bars on top, line below)` },\n}\n\n/** 1 段ぶんの設定。 */\nexport interface PairedPanel<T extends Record<string, unknown> = Record<string, unknown>> {\n /** この段に描く系列の列。 */\n categories: NumericKeys<T>[]\n /** 系列の色。省略時は `--chart-1..5` を固定順(上段の続きから下段)。 */\n colors?: ChartColors<T>\n /** 値の書式(件数 `number`・金額 `currency`・率 `percent` など)。`percent` は比率(0.124 → 12.4%)を渡す。 */\n format?: ValueFormat\n /** `format` で足りないときの自前の書式。 */\n valueFormatter?: ValueFormatter\n /** 値軸の見出し(「売上」「客単価」など)。 */\n yAxisLabel?: string\n /** 値軸の上限。データが超えるときは軸を広げる。 */\n maxValue?: number\n}\n\nexport interface PairedChartProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends Pick<\n ChartCommonProps<T>,\n \"data\" | \"index\" | \"labels\" | \"title\" | \"summary\" | \"isLoading\" | \"emptyState\" | \"chartOptions\" | \"actions\" | \"fileName\" | \"className\" | \"ariaLabel\"\n > {\n /** 上段。量を棒で。`type` は BarChart と同じ(`stacked` で積み上げ)。 */\n bars: PairedPanel<T> & { type?: CartesianStackType }\n // `fitToData` は LineChart では `lineOptions.fitToData`。段の設定に平らに置くため、ここでは直下に持つ。\n /** 下段。率・単価を線で。`fitToData` で値軸をデータに合わせる(率が狭い幅で動くとき)。 */\n line: PairedPanel<T> & { fitToData?: boolean; minValue?: number }\n /** 全体の高さ(px)。既定 400。 */\n height?: number\n /** 上段:下段の高さの比。既定 `[3, 2]`。 */\n heightRatio?: [number, number]\n /** 値軸ラベルの幅(px)。2 段の左端を揃える。既定 64。 */\n yAxisWidth?: number\n showLegend?: boolean\n showTooltip?: boolean\n}\n\nconst NO_ROWS: never[] = []\nconst NO_KEYS: never[] = []\nconst PANEL_GAP = 20\nconst LEGEND_LINE = 24\nconst DEFAULT_HEIGHT = 400\nconst DEFAULT_Y_AXIS_WIDTH = 64\n\ntype AnyRecord = Record<string, any>\n\n/** 配色: 棒の続きから線へ。`colors` を渡した段はそれに従う。 */\nexport function pairedPalette(\n barKeys: readonly string[],\n lineKeys: readonly string[],\n barColors: ChartColors | undefined,\n lineColors: ChartColors | undefined,\n): { bars: string[]; line: string[] } {\n const bars = seriesColorsFor(barKeys, barColors, CHART_OTHER_COLOR)\n const line = lineColors\n ? seriesColorsFor(lineKeys, lineColors, CHART_OTHER_COLOR)\n : lineKeys.map((_, i) => DEFAULT_CHART_COLORS[(barKeys.length + i) % DEFAULT_CHART_COLORS.length]!)\n return { bars, line }\n}\n\nexport interface PairedOptionConfig {\n data: readonly Record<string, unknown>[]\n index: string\n labels?: Record<string, string>\n barKeys: readonly string[]\n lineKeys: readonly string[]\n barPalette: readonly string[]\n linePalette: readonly string[]\n barFormatter: ValueFormatter\n lineFormatter: ValueFormatter\n barAxis: ValueFormatter\n lineAxis: ValueFormatter\n barTicks?: (top: number) => ValueFormatter\n lineTicks?: (top: number) => ValueFormatter\n type?: CartesianStackType\n fitToData?: boolean\n barAxisLabel?: string\n lineAxisLabel?: string\n barMax?: number\n lineMax?: number\n lineMin?: number\n height: number\n heightRatio: [number, number]\n yAxisWidth: number\n showLegend: boolean\n showTooltip: boolean\n reserveActions?: boolean\n plotWidth?: number\n guideColor?: string\n chartOptions?: EChartsOption\n /** 時間軸のラベル・ツールチップの言語。既定はページのロケール(`<html lang>`)。 */\n locale?: string\n}\n\n/** 棒と線の `buildCartesianOption` を 1 つの option(2 つの grid・共有の横軸・連動するツールチップ)に合成する。 */\nexport function buildPairedOption(cfg: PairedOptionConfig): EChartsOption {\n const { data, index, labels, barKeys, lineKeys, height, heightRatio, yAxisWidth, showLegend, showTooltip } = cfg\n const legendNames = [...barKeys, ...lineKeys]\n const legendWidth = legendNames.reduce((sum, name) => sum + [...(labels?.[name] ?? name)].length * 12 + 29, 0)\n const budget = Math.max(80, Math.min(cfg.plotWidth ?? 720, 720) - (cfg.reserveActions ? 80 : 0))\n const legendRows = showLegend ? Math.min(3, Math.max(1, Math.ceil(legendWidth / budget))) : 0\n const top = (showLegend ? 12 + LEGEND_LINE * legendRows : 12) + 4\n const room = Math.max(120, height - top - PANEL_GAP)\n const [a, b] = heightRatio\n const upper = Math.round((room * a) / (a + b))\n const common = {\n data,\n index,\n labels,\n showLegend: false,\n showTooltip: false,\n highlight: \"none\" as const,\n yAxisWidth,\n reducedMotion: false,\n locale: cfg.locale,\n }\n const barOpt = buildCartesianOption({\n ...common,\n kind: \"bar\",\n categories: barKeys,\n palette: cfg.barPalette,\n valueFormatter: cfg.barFormatter,\n axisFormatter: cfg.barAxis,\n axisTicks: cfg.barTicks,\n type: cfg.type,\n showXAxis: false,\n yAxisLabel: cfg.barAxisLabel,\n maxValue: cfg.barMax,\n plotWidth: cfg.plotWidth,\n plotHeight: upper,\n }) as AnyRecord\n const lineOpt = buildCartesianOption({\n ...common,\n kind: \"line\",\n categories: lineKeys,\n palette: cfg.linePalette,\n valueFormatter: cfg.lineFormatter,\n axisFormatter: cfg.lineAxis,\n axisTicks: cfg.lineTicks,\n fitToData: cfg.fitToData,\n showXAxis: true,\n yAxisLabel: cfg.lineAxisLabel,\n minValue: cfg.lineMin,\n maxValue: cfg.lineMax,\n guideColor: cfg.guideColor,\n plotWidth: cfg.plotWidth,\n plotHeight: room - upper,\n }) as AnyRecord\n\n const times = timeTooltipLabels(data.map((row) => row[index]), cfg.locale)\n const titles = labelRows(data, index, labels).map((row, i) => String(times?.[i] ?? row[index] ?? \"\"))\n const cell = (row: Record<string, unknown>, key: string): number | null => {\n const v = row[key]\n const n = typeof v === \"number\" ? v : typeof v === \"string\" && v.trim() !== \"\" ? Number(v) : NaN\n return Number.isFinite(n) ? n : null\n }\n const rowsOf = (row: Record<string, unknown>, keys: readonly string[], palette: readonly string[]): TooltipRow[] =>\n keys.map((key, i) => ({ name: labelOf(key, labels), color: palette[i] || \"currentColor\", value: cell(row, key) }))\n // 1 枚のツールチップ: 見出しは 1 回、棒の行 → 線の行(段ごとの書式)。\n const emptyTitle = tooltipHtml(\"\", [], String, [], cfg.locale)\n const tooltipFormatter = (params: unknown) => {\n const list = (Array.isArray(params) ? params : [params]) as { dataIndex?: number }[]\n const i = list[0]?.dataIndex ?? 0\n const row = data[i] ?? {}\n const upperHtml = tooltipHtml(titles[i] ?? \"\", rowsOf(row, barKeys, cfg.barPalette), cfg.barFormatter, [], cfg.locale)\n const lowerHtml = tooltipHtml(\"\", rowsOf(row, lineKeys, cfg.linePalette), cfg.lineFormatter, [], cfg.locale).slice(emptyTitle.length)\n return `${upperHtml}${lowerHtml}`\n }\n\n // 2 つの option はどちらも軸 id が \"x\" / \"y\" なので、合成前に段ごとに別 id にする(ECharts は id 重複でエラー)。\n const lineX = { ...lineOpt.xAxis, id: \"x-line\", gridIndex: 1, boundaryGap: true }\n const barX = { ...barOpt.xAxis, id: \"x-bars\", gridIndex: 0, show: true, axisLine: { show: false }, axisLabel: { show: false } }\n const gridLeft = barOpt.grid.left ?? 4\n const right = 16\n\n const option: AnyRecord = {\n ...barOpt,\n legend: { ...barOpt.legend, show: showLegend, data: legendNames, right: cfg.reserveActions ? 80 : 0 },\n grid: [\n { top, height: upper, left: gridLeft, right, containLabel: true },\n { top: top + upper + PANEL_GAP, bottom: 4, left: gridLeft, right, containLabel: true },\n ],\n xAxis: [barX, lineX],\n yAxis: [\n { ...barOpt.yAxis, id: \"y-bars\", gridIndex: 0 },\n { ...lineOpt.yAxis, id: \"y-line\", gridIndex: 1 },\n ],\n series: [\n ...(barOpt.series as AnyRecord[]).map((s) => ({ ...s, xAxisIndex: 0, yAxisIndex: 0 })),\n ...(lineOpt.series as AnyRecord[]).map((s) => ({ ...s, xAxisIndex: 1, yAxisIndex: 1 })),\n ],\n tooltip: {\n ...barOpt.tooltip,\n show: showTooltip,\n trigger: \"axis\",\n axisPointer: { type: \"line\", link: [{ xAxisIndex: \"all\" }] },\n formatter: tooltipFormatter,\n },\n axisPointer: { link: [{ xAxisIndex: \"all\" }] },\n }\n return mergeChartOptions(option as EChartsOption, cfg.chartOptions)\n}\n\nfunction PairedChartImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n index,\n labels,\n bars,\n line,\n title,\n summary,\n actions,\n fileName,\n isLoading,\n emptyState,\n height = DEFAULT_HEIGHT,\n heightRatio = [3, 2],\n yAxisWidth = DEFAULT_Y_AXIS_WIDTH,\n showLegend = true,\n showTooltip = true,\n chartOptions,\n ariaLabel,\n className,\n ...rest\n }: PairedChartProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const { ref: frameRef, width: plotWidth, tokens } = useChartSurface(ref)\n const barKeys = (bars?.categories ?? NO_KEYS) as string[]\n const lineKeys = (line?.categories ?? NO_KEYS) as string[]\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n const barFormatter = useMemo(() => resolveValueFormatter(bars?.valueFormatter, bars?.format, locale), [bars?.valueFormatter, bars?.format, locale])\n const lineFormatter = useMemo(() => resolveValueFormatter(line?.valueFormatter, line?.format, locale), [line?.valueFormatter, line?.format, locale])\n const barAxis = useMemo(() => resolveAxisFormatter(bars?.valueFormatter, bars?.format, locale), [bars?.valueFormatter, bars?.format, locale])\n const lineAxis = useMemo(() => resolveAxisFormatter(line?.valueFormatter, line?.format, locale), [line?.valueFormatter, line?.format, locale])\n const barTicks = useMemo(() => resolveAxisTickFormatter(bars?.valueFormatter, bars?.format, locale), [bars?.valueFormatter, bars?.format, locale])\n const lineTicks = useMemo(() => resolveAxisTickFormatter(line?.valueFormatter, line?.format, locale), [line?.valueFormatter, line?.format, locale])\n const palette = useMemo(() => {\n const p = pairedPalette(barKeys, lineKeys, bars?.colors as ChartColors | undefined, line?.colors as ChartColors | undefined)\n return { bars: resolveChartColors(p.bars, tokens), line: resolveChartColors(p.line, tokens) }\n }, [barKeys, lineKeys, bars?.colors, line?.colors, tokens])\n const option = useMemo(\n () =>\n buildPairedOption({\n data,\n index,\n labels,\n barKeys,\n lineKeys,\n barPalette: palette.bars,\n linePalette: palette.line,\n barFormatter,\n lineFormatter,\n barAxis,\n lineAxis,\n barTicks,\n lineTicks,\n type: bars?.type,\n fitToData: line?.fitToData,\n barAxisLabel: bars?.yAxisLabel,\n lineAxisLabel: line?.yAxisLabel,\n barMax: bars?.maxValue,\n lineMax: line?.maxValue,\n lineMin: line?.minValue,\n height,\n heightRatio,\n yAxisWidth,\n showLegend,\n showTooltip,\n reserveActions: Boolean(actions),\n plotWidth,\n guideColor: tokens?.mutedForeground ?? undefined,\n chartOptions,\n locale,\n }),\n [\n data, index, labels, barKeys, lineKeys, palette, barFormatter, lineFormatter, barAxis, lineAxis, barTicks, lineTicks,\n bars?.type, bars?.yAxisLabel, bars?.maxValue, line?.fitToData, line?.yAxisLabel, line?.maxValue, line?.minValue,\n height, heightRatio, yAxisWidth, showLegend, showTooltip, actions, plotWidth, tokens, chartOptions, locale,\n ],\n )\n // スクリーンリーダー向けの値の表: 棒の列 → 線の列(段ごとの書式)。\n const dataTable = useMemo(() => {\n const upper = chartDataTable(labelRows(data, index, labels), index, barKeys, barFormatter, labels, t.item)\n const lower = chartDataTable(labelRows(data, index, labels), index, lineKeys, lineFormatter, labels, t.item)\n const times = timeTooltipLabels(data.map((row) => row[index]), locale)\n return {\n ...upper,\n columns: [...upper.columns, ...lower.columns.slice(1)],\n rows: upper.rows.map((r, i) => [times?.[i] ?? r[0] ?? \"\", ...r.slice(1), ...(lower.rows[i] ?? []).slice(1)]),\n }\n }, [data, index, labels, barKeys, lineKeys, barFormatter, lineFormatter, t, locale])\n const label = ariaLabel ?? t.chart([...barKeys, ...lineKeys])\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={summary === \"auto\" ? undefined : summary}\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: summary === \"auto\" ? undefined : summary }} />\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `index` / `categories` / `colors` keys are checked against `data`. */\nexport const PairedChart = forwardRef(PairedChartImpl as (props: PairedChartProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: PairedChartProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nPairedChart.displayName = \"PairedChart\"\n","/**\n * 分布の集計(ヒストグラムの階級分け・箱ひげの四分位)の純関数。\n * 生の値の配列を受け、number でない値(null・NaN・数値にならない文字列)は数えずに捨てる。\n */\n\n/** 値を数にする。number・数値文字列だけ通し、それ以外(null・NaN・∞)は `null`。 */\nfunction toFinite(value: unknown): number | null {\n const n = typeof value === \"number\" ? value : typeof value === \"string\" && value.trim() !== \"\" ? Number(value) : NaN\n return Number.isFinite(n) ? n : null\n}\n\n/** 数にできる値だけを昇順で返す。 */\nexport function sortedNumbers(values: readonly unknown[]): number[] {\n const out: number[] = []\n for (const v of values) {\n const n = toFinite(v)\n if (n !== null) out.push(n)\n }\n return out.sort((a, b) => a - b)\n}\n\n/**\n * 昇順の配列の分位点(線形補間。Excel の QUARTILE.INC・numpy の既定と同じ)。`p` は 0〜1。空配列は `null`。\n */\nexport function quantile(sorted: readonly number[], p: number): number | null {\n if (sorted.length === 0) return null\n const pos = (sorted.length - 1) * Math.min(1, Math.max(0, p))\n const lo = Math.floor(pos)\n const hi = Math.ceil(pos)\n return sorted[lo]! + (sorted[hi]! - sorted[lo]!) * (pos - lo)\n}\n\nexport interface BoxStats {\n /** 数えた値の個数。 */\n count: number\n /** 最小・最大(外れ値を含む)。 */\n min: number\n max: number\n q1: number\n median: number\n q3: number\n /** ひげの下端・上端: 柵(Q1−k×IQR / Q3+k×IQR)の内側にある最小・最大の実測値。 */\n whiskerLow: number\n whiskerHigh: number\n /** 柵の外側の値(昇順)。 */\n outliers: number[]\n}\n\n/**\n * 値の配列 → 箱ひげの統計。ひげは四分位範囲(IQR)の `whisker` 倍(既定 1.5)の柵の内側にある実測値まで、\n * その外側は外れ値。数にできる値が無ければ `null`。\n */\nexport function boxStats(values: readonly unknown[], whisker = 1.5): BoxStats | null {\n const sorted = sortedNumbers(values)\n if (sorted.length === 0) return null\n const q1 = quantile(sorted, 0.25)!\n const median = quantile(sorted, 0.5)!\n const q3 = quantile(sorted, 0.75)!\n const reach = Math.max(0, whisker) * (q3 - q1)\n const low = q1 - reach\n const high = q3 + reach\n const inside = sorted.filter((v) => v >= low && v <= high)\n return {\n count: sorted.length,\n min: sorted[0]!,\n max: sorted[sorted.length - 1]!,\n q1,\n median,\n q3,\n whiskerLow: inside[0] ?? q1,\n whiskerHigh: inside[inside.length - 1] ?? q3,\n outliers: sorted.filter((v) => v < low || v > high),\n }\n}\n\nexport interface HistogramBin {\n /** 階級の下端(以上)・上端(未満。最後の階級だけ上端を含む)。 */\n from: number\n to: number\n /** 階級に入った個数。 */\n count: number\n /** 上限超えをまとめた階級(`from` = 上限、`to` = 実測の最大。幅は他と違う)。 */\n overflow: boolean\n}\n\nexport interface HistogramBinsConfig {\n /** 階級の幅。省略すると値の範囲から区切りのよい数(1・2・2.5・5 × 10^n)を選ぶ。 */\n binWidth?: number\n /** 階級の始まり。省略は幅の倍数に切り下げた最小値。 */\n start?: number\n /** 上限。これ以上の値は 1 つの「上限超え」階級にまとめる。省略するとまとめない。 */\n max?: number\n}\n\n/** 範囲 `span` を 10 本ほどの階級に分ける、区切りのよい幅。 */\nexport function niceBinWidth(span: number, target = 10): number {\n if (!(span > 0) || !Number.isFinite(span)) return 1\n const raw = span / target\n const pow = 10 ** Math.floor(Math.log10(raw))\n const f = raw / pow\n return (f <= 1 ? 1 : f <= 2 ? 2 : f <= 2.5 ? 2.5 : f <= 5 ? 5 : 10) * pow\n}\n\n/** 階級数の上限(上限超えの階級を除く)。幅が細かすぎて超えるときは、幅を広げて収める。 */\nexport const MAX_BINS = 200\n\n/** 小数の誤差(0.1 を 3 回足すなど)を、幅の桁に合わせて丸める。固定桁だと微小な幅が 0 に潰れて前に進まない。 */\nfunction tidy(n: number, step: number): number {\n const digits = Math.min(100, Math.max(0, Math.ceil(-Math.log10(step)) + 6))\n const rounded = Number(n.toFixed(digits))\n return Number.isFinite(rounded) ? rounded : n\n}\n\n/**\n * 値の配列 → 階級ごとの個数。値が 1 つも無ければ `[]`。\n * `max` を指定すると、`start` から `max` までを幅で刻み(割り切れない端は最後の階級を短くする)、`max` 以上の値を末尾の上限超え階級にまとめる。\n * 個数が 0 の階級も省かない(間が空いていることが分布の事実のため)。上限超えは 0 件なら作らない。\n * 階級は添字から数える(`MAX_BINS` 本まで)ので、どんな値でも必ず有限回で終わる。幅が細かすぎて `MAX_BINS` を超えるときは幅を広げる。\n */\nexport function histogramBins(values: readonly unknown[], config: HistogramBinsConfig = {}): HistogramBin[] {\n const sorted = sortedNumbers(values)\n if (sorted.length === 0) return []\n const width = config.binWidth !== undefined && Number.isFinite(config.binWidth) && config.binWidth > 0 ? config.binWidth : null\n const lo = sorted[0]!\n const hi = sorted[sorted.length - 1]!\n const cap = config.max !== undefined && Number.isFinite(config.max) ? config.max : null\n const end = cap !== null ? cap : hi\n const first = config.start !== undefined && Number.isFinite(config.start) ? config.start : null\n let step = width ?? niceBinWidth((cap !== null ? Math.min(hi, cap) : hi) - (first ?? lo))\n const start = first ?? tidy(Math.floor(lo / step) * step, step)\n const countFor = (w: number) => Math.ceil((end - start) / w - 1e-9)\n // 範囲が空(全部が上限以上など)でも、上限超えの階級だけは作る。上限なしなら最低 1 本は作る。\n if (countFor(step) > MAX_BINS) step = niceBinWidth(end - start, MAX_BINS)\n const n = Math.min(MAX_BINS, Math.max(cap === null ? 1 : 0, countFor(step)))\n const bins: HistogramBin[] = []\n for (let i = 0; i < n; i++) {\n const from = i === 0 ? start : bins[i - 1]!.to\n let to = tidy(start + (i + 1) * step, step)\n if (!(to > from)) to = start + (i + 1) * step\n if (cap !== null) to = Math.min(to, cap)\n bins.push({ from, to, count: 0, overflow: false })\n }\n const inRange = cap === null ? sorted : sorted.filter((v) => v < cap)\n const over = cap === null ? [] : sorted.filter((v) => v >= cap)\n for (const v of inRange) {\n if (v < start || bins.length === 0) continue\n const i = Math.min(bins.length - 1, Math.floor((v - start) / step + 1e-9))\n bins[i]!.count += 1\n }\n if (over.length > 0) bins.push({ from: cap!, to: Math.max(hi, cap!), count: over.length, overflow: true })\n return bins\n}\n","\"use client\"\n\n/**\n * HistogramChart — a typed histogram over `EChart`: pass the raw values (`values`) and, if you want, the class width\n * (`binWidth`), the start and an upper limit (`max`) instead of an ECharts option. 解決までの日数、残業時間、勤続年数。\n *\n * The classes are counted by `histogramBins` (a pure function): `[from, to)` with a width picked for you when omitted.\n * Values at or above `max` fold into one「<max>以上」class (drawn in the neutral fill, so a pile at the limit reads as\n * \"the rest\", not as one more class). `threshold` draws a line at a value (SLA, a legal limit) and says how many values\n * sit above it. Bars are gap-less, start at 0 and use `--chart-1`; the tooltip carries the count and its share.\n * Renders inside `ChartFrame` (title, summary, loading skeleton, empty state and a visually-hidden table of the classes).\n */\nimport { forwardRef, useMemo, type ForwardedRef } from \"react\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { useLocale } from \"../hooks/use-locale\"\nimport { resolveChartColors, resolveFillColors, useChartSurface } from \"../lib/chart-theme\"\nimport { chartMotion, escapeHtml, mergeChartOptions } from \"../lib/chart-options\"\nimport { chartRootProps, resolveValueFormatter, type ChartDataTable } from \"../lib/chart-utils\"\nimport { histogramBins, sortedNumbers, type HistogramBin } from \"../lib/distribution\"\nimport { toValueFormatter } from \"../lib/format\"\nimport { resolveLocale, uiLanguage } from \"../lib/locale\"\nimport type { ChartCommonProps, ValueFormatter } from \"../lib/types\"\n\nexport interface HistogramThreshold {\n /** 線を引く値(例 SLA の 3 日)。 */\n value: number\n /** 線の名前(例「SLA」)。ツールチップ・要約・データ表の注記に出る。 */\n label?: string\n}\n\nexport interface HistogramChartProps\n extends Omit<ChartCommonProps, \"data\" | \"index\" | \"categories\" | \"colors\" | \"labels\" | \"summary\"> {\n /** 生の値の配列。number か数値文字列。null・数にならない値は数えない。 */\n values: unknown[]\n /** 階級の幅。省略すると値の範囲から区切りのよい幅(1・2・2.5・5 × 10^n)を選ぶ。 */\n binWidth?: number\n /** 階級の始まり。省略は幅の倍数に切り下げた最小値。 */\n start?: number\n /** 上限。この値以上は 1 つの「<上限>以上」階級にまとめる。省略するとまとめない。 */\n max?: number\n /** しきい値の線(任意)。階級の途中にも引ける。 */\n threshold?: HistogramThreshold\n /** 件数の単位。既定は日本語のページで「件」、それ以外は単位なし。 */\n countUnit?: string\n /** 横軸の値の名前(データ表の先頭列)。既定「値」。例「解決日数」 */\n valueLabel?: string\n /** 1 文要約(自由文)。`\"auto\"` なら件数・最頻の階級・しきい値超えの割合を組む。省略時は要約なし。 */\n summary?: string | \"auto\"\n /** ホバー時のツールチップを出す。既定 `true`。 */\n showTooltip?: boolean\n}\n\n/* ------------------------------------------------------------------ model */\n\nconst TEXT = {\n ja: {\n countUnit: \"件\",\n atOrAbove: (from: string) => `${from}以上`,\n range: (from: string, to: string) => `${from}〜${to}`,\n count: (n: number, unit: string) => `${n}${unit}`,\n countHeader: (unit: string) => `${unit}数`,\n share: \"構成比\",\n value: \"値\",\n valueInSentence: \"値\",\n threshold: \"しきい値\",\n peak: (total: number, bin: string, count: number, unit: string) => `${total}${unit}のうち最も多いのは ${bin}(${count}${unit})`,\n overThreshold: (name: string, value: string, count: string, share: string) => `${name}(${value})以上は ${count}(${share})`,\n sentenceJoin: \"。\",\n chart: (label: string) => `${label}のヒストグラム`,\n },\n en: {\n countUnit: \"\",\n atOrAbove: (from: string) => `${from}+`,\n range: (from: string, to: string) => `${from}–${to}`,\n count: (n: number, unit: string) => (unit ? `${n} ${unit}` : `${n}`),\n countHeader: () => \"Count\",\n share: \"Share\",\n value: \"Value\",\n valueInSentence: \"values\",\n threshold: \"Threshold\",\n peak: (total: number, bin: string, count: number, unit: string) => `Most common: ${bin} (${unit ? `${count} ${unit}` : count} of ${total})`,\n overThreshold: (name: string, value: string, count: string, share: string) => `At or above ${name} (${value}): ${count} (${share})`,\n sentenceJoin: \". \",\n chart: (label: string) => `Histogram of ${label}`,\n },\n}\n\nconst textOf = (locale?: string) => TEXT[uiLanguage(resolveLocale(locale))]\n\n/** 階級の名前。`10〜15`、上限超えは `30以上`。 */\nexport function binLabel(bin: HistogramBin, formatter: ValueFormatter, locale?: string): string {\n const t = textOf(locale)\n return bin.overflow ? t.atOrAbove(formatter(bin.from)) : t.range(formatter(bin.from), formatter(bin.to))\n}\n\n/** しきい値が来る位置を階級の添字(小数。階級の左端 = 添字 − 0.5)で返す。範囲の外は `null`。 */\nexport function thresholdPosition(bins: readonly HistogramBin[], value: number): number | null {\n const lastIndex = bins.length - 1\n const i = bins.findIndex((b, k) => (k === lastIndex ? value >= b.from && (b.overflow || value <= b.to) : value >= b.from && value < b.to))\n const bin = bins[i]\n if (!bin) return null\n return bin.overflow ? i - 0.5 : i - 0.5 + (value - bin.from) / (bin.to - bin.from)\n}\n\n/**\n * しきい値以上の値の個数。`from` を渡すと、それ未満の値は数えない(階級に入らない値は合計にも入らないので、\n * 分母と同じ母集団に揃えるため。`histogramBins` の `start`)。\n */\nexport function countAtOrAbove(values: readonly unknown[], value: number, from = -Infinity): number {\n return sortedNumbers(values).filter((v) => v >= value && v >= from).length\n}\n\nconst percent = (n: number, total: number) => (total === 0 ? \"0%\" : `${Math.round((n / total) * 100)}%`)\n\n/** `summary=\"auto\"`: 件数・最頻の階級・しきい値以上の割合。値が無ければ `undefined`。 */\nexport function buildHistogramSummary(\n bins: readonly HistogramBin[],\n formatter: ValueFormatter,\n config: { total: number; countUnit: string; atOrAbove?: number; threshold?: HistogramThreshold; locale?: string },\n): string | undefined {\n if (bins.length === 0 || config.total === 0) return undefined\n const t = textOf(config.locale)\n const count = (n: number) => t.count(n, config.countUnit)\n const peak = bins.reduce((a, b) => (b.count > a.count ? b : a))\n const parts = [t.peak(config.total, binLabel(peak, formatter, config.locale), peak.count, config.countUnit)]\n if (config.threshold && config.atOrAbove !== undefined) {\n const name = config.threshold.label ?? t.threshold\n parts.push(t.overThreshold(name, formatter(config.threshold.value), count(config.atOrAbove), percent(config.atOrAbove, config.total)))\n }\n return parts.join(t.sentenceJoin)\n}\n\n/** The screen-reader table: one row per class. */\nexport function histogramDataTable(\n bins: readonly HistogramBin[],\n formatter: ValueFormatter,\n config: { total: number; countUnit: string; valueLabel?: string; locale?: string },\n): ChartDataTable {\n const t = textOf(config.locale)\n return {\n columns: [config.valueLabel ?? t.value, t.countHeader(config.countUnit), t.share],\n rows: bins.map((b) => [binLabel(b, formatter, config.locale), `${b.count}`, percent(b.count, config.total)]),\n }\n}\n\n/* ----------------------------------------------------------------- option */\n\n/** しきい値を `[階級の添字, 0, 階級の中での位置(左端 -0.5 〜 右端 0.5)]` にする。 */\nfunction thresholdPoint(bins: readonly HistogramBin[], value: number): [number, number, number] {\n const pos = thresholdPosition(bins, value) ?? 0\n const index = Math.min(bins.length - 1, Math.max(0, Math.round(pos)))\n return [index, 0, pos - index]\n}\n\n/**\n * しきい値の縦線(破線)と名前。カテゴリ軸は小数の添字を整数に丸めるので、markLine ではなく custom series にして、\n * 階級の中心の座標 + 階級の幅 × 位置で描く(階級の途中・境界にも正しく引ける)。\n */\nexport function thresholdRenderer(style: { text: string; lineColor?: string; labelColor?: string }) {\n type Api = { value(dim: number): number; coord(value: number[]): number[]; size(value: number[]): number[] }\n type Params = { coordSys: { x: number; y: number; width: number; height: number } }\n return (params: Params, api: Api) => {\n const { x: gx, y: gy, width, height } = params.coordSys\n const band = Math.abs(api.size([1, 0])[0] ?? 0)\n const x = (api.coord([api.value(0), 0])[0] ?? 0) + api.value(2) * band\n const nearRight = x > gx + width * 0.7\n return {\n type: \"group\" as const,\n children: [\n {\n type: \"line\" as const,\n shape: { x1: x, y1: gy, x2: x, y2: gy + height },\n style: { stroke: style.lineColor || \"#888\", lineWidth: 1.5, lineDash: [4, 4], fill: \"none\" },\n },\n {\n type: \"text\" as const,\n style: {\n text: style.text,\n x,\n y: gy - 4,\n fill: style.labelColor || \"#888\",\n textAlign: nearRight ? (\"right\" as const) : (\"left\" as const),\n textVerticalAlign: \"bottom\" as const,\n },\n },\n ],\n }\n }\n}\n\n\nexport interface HistogramOptionConfig {\n bins: readonly HistogramBin[]\n total: number\n /** Resolved (canvas-safe) colours; `\"\"` leaves the theme palette. */\n colors: { bar: string; overflow: string }\n /** Class names and tooltip values (full form). */\n valueFormatter: ValueFormatter\n countUnit?: string\n threshold?: HistogramThreshold\n showTooltip?: boolean\n labelColor?: string\n lineColor?: string\n chartOptions?: EChartsOption\n /** Language of the class names, tooltip and threshold label. Default the page's locale (`<html lang>`). */\n locale?: string\n}\n\nconst ROW_STYLE = \"display:flex;align-items:center;gap:8px;line-height:20px\"\n\n/** The ECharts option: gap-less bars over the classes, the overflow class in the neutral fill, an optional threshold line. */\nexport function buildHistogramOption(config: HistogramOptionConfig): EChartsOption {\n const { locale } = config\n const t = textOf(locale)\n const { bins, total, colors, valueFormatter, threshold, showTooltip = true, countUnit = t.countUnit } = config\n const pos = threshold ? thresholdPosition(bins, threshold.value) : null\n const option = {\n ...chartMotion(false),\n legend: { show: false },\n grid: { top: pos === null ? 16 : 28, right: 16, bottom: 4, left: 4, containLabel: true },\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; seriesId?: string }[]\n const bin = bins[(list.find((p) => p.seriesId === \"count\") ?? list[0])?.dataIndex ?? 0]\n if (!bin) return \"\"\n const color = escapeHtml((bin.overflow ? colors.overflow : colors.bar) || \"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 return (\n `<div style=\"font-weight:500;margin-bottom:4px\">${escapeHtml(binLabel(bin, valueFormatter, locale))}</div>` +\n line(t.countHeader(countUnit), t.count(bin.count, countUnit)) +\n line(t.share, percent(bin.count, total))\n )\n },\n },\n xAxis: {\n type: \"category\" as const,\n data: bins.map((b) => binLabel(b, valueFormatter, locale)),\n axisTick: { show: false },\n axisLabel: { hideOverlap: true },\n },\n yAxis: {\n type: \"value\" as const,\n minInterval: 1,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: { show: true },\n },\n series: [\n {\n id: \"count\",\n type: \"bar\" as const,\n barCategoryGap: \"6%\",\n data: bins.map((b) => ({\n value: b.count,\n itemStyle: { color: (b.overflow ? colors.overflow : colors.bar) || undefined, borderRadius: [2, 2, 0, 0] },\n })),\n label: { show: false, color: config.labelColor, fontVariantNumeric: \"tabular-nums\" },\n },\n ...(threshold && pos !== null\n ? [\n {\n id: \"threshold\",\n type: \"custom\" as const,\n silent: true,\n z: 10,\n animation: false,\n tooltip: { show: false },\n encode: { x: 0, y: 1 },\n // [階級の添字, 0(y の位置は使わない), 階級の中での位置(左端 -0.5 〜 右端 0.5)]\n data: [thresholdPoint(bins, threshold.value)],\n renderItem: thresholdRenderer({\n text: `${threshold.label ?? t.threshold} ${valueFormatter(threshold.value)}`,\n lineColor: config.lineColor,\n labelColor: config.labelColor,\n }),\n },\n ]\n : []),\n ],\n }\n return mergeChartOptions(option as EChartsOption, config.chartOptions)\n}\n\n/* -------------------------------------------------------------- component */\n\nconst NO_VALUES: never[] = []\n\nexport const HistogramChart = forwardRef(function HistogramChart(\n {\n values = NO_VALUES,\n binWidth,\n start,\n max,\n threshold,\n countUnit: countUnitProp,\n valueLabel,\n format,\n valueFormatter: valueFormatterProp,\n showTooltip = true,\n title,\n summary,\n actions,\n fileName,\n isLoading,\n emptyState,\n height,\n chartOptions,\n ariaLabel,\n className,\n ...rest\n }: HistogramChartProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const { ref: frameRef, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n const countUnit = countUnitProp ?? t.countUnit\n // Class names read in full (`10〜15日`); the format default is a plain number, not the compact form.\n const valueFormatter = useMemo(\n () => (valueFormatterProp ?? (format === undefined ? toValueFormatter(\"number\", locale) : resolveValueFormatter(undefined, format, locale))),\n [valueFormatterProp, format, locale],\n )\n const bins = useMemo(() => histogramBins(values, { binWidth, start, max }), [values, binWidth, start, max])\n const total = useMemo(() => bins.reduce((sum, b) => sum + b.count, 0), [bins])\n const colors = useMemo(() => {\n const [bar = \"\"] = resolveChartColors([\"chart-1\"], tokens)\n return { bar, overflow: resolveFillColors(tokens).neutral }\n }, [tokens])\n const option = useMemo(\n () =>\n buildHistogramOption({\n bins,\n total,\n colors,\n valueFormatter,\n countUnit,\n threshold,\n showTooltip,\n labelColor: tokens?.foreground ?? undefined,\n lineColor: tokens?.mutedForeground ?? undefined,\n chartOptions,\n locale,\n }),\n [bins, total, colors, valueFormatter, countUnit, threshold, showTooltip, tokens, chartOptions, locale],\n )\n const dataTable = useMemo(\n () => histogramDataTable(bins, valueFormatter, { total, countUnit, valueLabel, locale }),\n [bins, valueFormatter, total, countUnit, valueLabel, locale],\n )\n const resolvedSummary = useMemo(\n () =>\n summary === \"auto\"\n ? buildHistogramSummary(bins, valueFormatter, {\n total,\n countUnit,\n threshold,\n atOrAbove: threshold ? countAtOrAbove(values, threshold.value, bins[0]?.from) : undefined,\n locale,\n })\n : summary,\n [summary, bins, valueFormatter, total, countUnit, threshold, values, locale],\n )\n const label = ariaLabel ?? t.chart(valueLabel ?? t.valueInSentence)\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? false}\n isEmpty={bins.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})\nHistogramChart.displayName = \"HistogramChart\"\n\n","\"use client\"\n\n/**\n * BoxPlotChart — a typed box plot over `EChart`: pass one group per box (`{ name, values }`, raw values) instead of an\n * ECharts option. チームごとの残業時間、拠点ごとの解決日数。\n *\n * Each group is summarised by `boxStats` (a pure function): the box spans Q1–Q3 with the median line, the whiskers reach the\n * furthest value inside `whisker` × IQR (default 1.5) and anything beyond is an outlier dot. Quartiles are linearly\n * interpolated (Excel's QUARTILE.INC). The boxes are drawn with a `custom` series (already registered by `EChart`), a\n * light `--chart-1` fill with a solid outline; the tooltip prints n, the quartiles, the whiskers and the outliers, so the\n * colour is never the only carrier. A group with no usable value is kept on the axis and reads「—」.\n * Renders inside `ChartFrame` (title, summary, loading skeleton, empty state and a visually-hidden table of the statistics).\n */\nimport { forwardRef, useMemo, type ForwardedRef } from \"react\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { useLocale } from \"../hooks/use-locale\"\nimport { resolveChartColors, useChartSurface } from \"../lib/chart-theme\"\nimport { chartMotion, escapeHtml, mergeChartOptions, withAlpha } from \"../lib/chart-options\"\nimport { chartRootProps, resolveValueFormatter, type ChartDataTable } from \"../lib/chart-utils\"\nimport { boxStats, type BoxStats } from \"../lib/distribution\"\nimport { EMPTY_VALUE } from \"../lib/format\"\nimport { resolveLocale, uiLanguage } from \"../lib/locale\"\nimport type { ChartCommonProps, ValueFormatter } from \"../lib/types\"\n\nexport interface BoxPlotGroup {\n /** 箱の名前(横軸)。 */\n name: string\n /** 生の値の配列。number か数値文字列。null・数にならない値は数えない。 */\n values: unknown[]\n}\n\nexport interface BoxPlotChartProps extends Omit<ChartCommonProps, \"data\" | \"index\" | \"categories\" | \"colors\" | \"labels\" | \"summary\"> {\n /** 群ごとの値。並びがそのまま左から右の順。 */\n groups: BoxPlotGroup[]\n /** ひげの長さ(四分位範囲の何倍までを外れ値にしないか)。既定 1.5。 */\n whisker?: number\n /** 値(縦軸)の名前。ツールチップとデータ表に出る。既定「値」。例「残業時間」 */\n valueLabel?: string\n /** 1 文要約(自由文)。`\"auto\"` なら中央値が最大・最小の群と外れ値の数を組む。省略時は要約なし。 */\n summary?: string | \"auto\"\n /** ホバー時のツールチップを出す。既定 `true`。 */\n showTooltip?: boolean\n}\n\n/* ------------------------------------------------------------------ model */\n\nconst TEXT = {\n ja: {\n value: \"値\",\n valueInSentence: \"値\",\n medianOf: (name: string, label: string, median: string) => `${name}の${label}の中央値は ${median}`,\n medianRange: (label: string, top: string, topMedian: string, low: string, lowMedian: string) =>\n `${label}の中央値が最も高いのは ${top}(${topMedian})、最も低いのは ${low}(${lowMedian})`,\n outliers: (n: number) => `外れ値は ${n} 件`,\n sentenceJoin: \"。\",\n columns: [\"群\", \"件数\", \"最小(ひげ)\", \"第1四分位\", \"中央値\", \"第3四分位\", \"最大(ひげ)\", \"外れ値\"],\n listJoin: \"、\",\n none: \"なし\",\n tooltipTitle: (name: string, label: string, count: number) => `${name}(${label}・${count}件)`,\n max: \"最大(ひげ)\",\n q3: \"第3四分位\",\n median: \"中央値\",\n q1: \"第1四分位\",\n min: \"最小(ひげ)\",\n outlierRow: \"外れ値\",\n chart: (label: string) => `${label}の箱ひげ図`,\n },\n en: {\n value: \"Value\",\n valueInSentence: \"value\",\n medianOf: (name: string, label: string, median: string) => `Median ${label} for ${name}: ${median}`,\n medianRange: (label: string, top: string, topMedian: string, low: string, lowMedian: string) =>\n `Highest median ${label}: ${top} (${topMedian}); lowest: ${low} (${lowMedian})`,\n outliers: (n: number) => (n === 1 ? \"1 outlier\" : `${n} outliers`),\n sentenceJoin: \". \",\n columns: [\"Group\", \"Count\", \"Min (whisker)\", \"Q1\", \"Median\", \"Q3\", \"Max (whisker)\", \"Outliers\"],\n listJoin: \", \",\n none: \"None\",\n tooltipTitle: (name: string, label: string, count: number) => `${name} (${label}, n=${count})`,\n max: \"Max (whisker)\",\n q3: \"Q3\",\n median: \"Median\",\n q1: \"Q1\",\n min: \"Min (whisker)\",\n outlierRow: \"Outliers\",\n chart: (label: string) => `Box plot of ${label}`,\n },\n}\n\nconst textOf = (locale?: string) => TEXT[uiLanguage(resolveLocale(locale))]\n\nexport interface BoxPlotEntry {\n name: string\n stats: BoxStats | null\n}\n\n/** Groups → one entry each, in order. */\nexport function boxPlotEntries(groups: readonly BoxPlotGroup[], whisker?: number): BoxPlotEntry[] {\n return groups.map((g) => ({ name: g.name, stats: boxStats(g.values, whisker) }))\n}\n\n/**\n * `summary=\"auto\"`: the groups with the highest / lowest median and the outlier count. `undefined` with no usable group.\n * `locale` picks the language; default the page's (`<html lang>`).\n */\nexport function buildBoxPlotSummary(\n entries: readonly BoxPlotEntry[],\n formatter: ValueFormatter,\n valueLabel?: string,\n locale?: string,\n): string | undefined {\n const t = textOf(locale)\n const label = valueLabel ?? t.valueInSentence\n const real = entries.filter((e): e is BoxPlotEntry & { stats: BoxStats } => e.stats !== null)\n if (real.length === 0) return undefined\n const top = real.reduce((a, b) => (b.stats.median > a.stats.median ? b : a))\n const low = real.reduce((a, b) => (b.stats.median < a.stats.median ? b : a))\n const parts = [\n real.length === 1\n ? t.medianOf(top.name, label, formatter(top.stats.median))\n : t.medianRange(label, top.name, formatter(top.stats.median), low.name, formatter(low.stats.median)),\n ]\n const outliers = real.reduce((sum, e) => sum + e.stats.outliers.length, 0)\n if (outliers > 0) parts.push(t.outliers(outliers))\n return parts.join(t.sentenceJoin)\n}\n\n/** The screen-reader table: one row per group with n, the quartiles, the whisker ends and the outliers. */\nexport function boxPlotDataTable(entries: readonly BoxPlotEntry[], formatter: ValueFormatter, locale?: string): ChartDataTable {\n const t = textOf(locale)\n const f = (n: number | undefined) => (n === undefined ? EMPTY_VALUE : formatter(n))\n return {\n columns: [...t.columns],\n rows: entries.map(({ name, stats: s }) => [\n name,\n s ? `${s.count}` : EMPTY_VALUE,\n f(s?.whiskerLow),\n f(s?.q1),\n f(s?.median),\n f(s?.q3),\n f(s?.whiskerHigh),\n s ? (s.outliers.length > 0 ? s.outliers.map(formatter).join(t.listJoin) : t.none) : EMPTY_VALUE,\n ]),\n }\n}\n\n/* ----------------------------------------------------------------- option */\n\nexport interface BoxPlotOptionConfig {\n entries: readonly BoxPlotEntry[]\n /** Resolved (canvas-safe) colour of the boxes; `\"\"` leaves the theme palette. */\n color: string\n valueFormatter: ValueFormatter\n axisFormatter?: ValueFormatter\n valueLabel?: string\n showTooltip?: boolean\n labelColor?: string\n chartOptions?: EChartsOption\n /** Language of the tooltip. Default the page's locale (`<html lang>`). */\n locale?: string\n}\n\nconst ROW_STYLE = \"display:flex;align-items:center;gap:8px;line-height:20px\"\n\n/** Fraction of a category band the box fills. */\nconst BOX_SHARE = 0.4\n\n/** The `renderItem` of the boxes: whiskers with end caps, the box, the median line and the outlier dots. */\n/** `outliers` は元の群の順(空の群も含む)。描く箱は `api.value(0)` の群の添字で引く(空の群を除いても、ずれない)。 */\nexport function boxPlotRenderer(color: string, outliers: readonly (readonly number[])[]) {\n type Api = { value(dim: number): number; coord(value: number[]): number[]; size(value: number[]): number[] }\n return (_params: unknown, api: Api) => {\n const x = api.coord([api.value(0), api.value(3)])[0] ?? 0\n const y = (dim: number) => api.coord([api.value(0), api.value(dim)])[1] ?? 0\n const band = Math.abs(api.size([1, 0])[0] ?? 0)\n const half = (band * BOX_SHARE) / 2\n const cap = half / 2\n const [yLow, yQ1, yMed, yQ3, yHigh] = [y(1), y(2), y(3), y(4), y(5)] as [number, number, number, number, number]\n const stroke = { stroke: color, lineWidth: 1.5, fill: \"none\" }\n const line = (x1: number, y1: number, x2: number, y2: number) => ({ type: \"line\" as const, shape: { x1, y1, x2, y2 }, style: stroke })\n return {\n type: \"group\" as const,\n children: [\n line(x, yHigh, x, yQ3),\n line(x, yQ1, x, yLow),\n line(x - cap, yHigh, x + cap, yHigh),\n line(x - cap, yLow, x + cap, yLow),\n {\n type: \"rect\" as const,\n shape: { x: x - half, y: Math.min(yQ3, yQ1), width: half * 2, height: Math.abs(yQ1 - yQ3), r: 2 },\n style: { fill: withAlpha(color, 0.25), stroke: color, lineWidth: 1.5 },\n },\n line(x - half, yMed, x + half, yMed),\n ...(outliers[api.value(0)] ?? []).map((v) => ({\n type: \"circle\" as const,\n shape: { cx: x, cy: api.coord([api.value(0), v])[1] ?? 0, r: 3 },\n style: { fill: \"transparent\", stroke: color, lineWidth: 1.5 },\n })),\n ],\n }\n }\n}\n\n/** The ECharts option: one `custom` series, a box per group. Groups with no value draw nothing. */\nexport function buildBoxPlotOption(config: BoxPlotOptionConfig): EChartsOption {\n const t = textOf(config.locale)\n const { entries, valueFormatter, showTooltip = true, valueLabel = t.value } = config\n const axisFormatter = config.axisFormatter ?? valueFormatter\n const color = config.color || \"#888\"\n // [index, whisker low, Q1, median, Q3, whisker high, min, max]: the last two stretch the value axis over the outliers.\n const data = entries.flatMap((e, i) => (e.stats ? [[i, e.stats.whiskerLow, e.stats.q1, e.stats.median, e.stats.q3, e.stats.whiskerHigh, e.stats.min, e.stats.max]] : []))\n const entryAt = (i: number) => entries[i]\n const option = {\n ...chartMotion(false),\n legend: { show: false },\n grid: { top: 16, right: 16, bottom: 4, left: 4, containLabel: true },\n tooltip: {\n show: showTooltip,\n trigger: \"item\",\n formatter: (params: unknown) => {\n const entry = entryAt((params as { value?: number[] }).value?.[0] ?? -1)\n const s = entry?.stats\n if (!entry || !s) return \"\"\n const line = (name: string, text: string) =>\n `<div style=\"${ROW_STYLE}\"><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 return (\n `<div style=\"font-weight:500;margin-bottom:4px\">${escapeHtml(t.tooltipTitle(entry.name, valueLabel, s.count))}</div>` +\n line(t.max, valueFormatter(s.whiskerHigh)) +\n line(t.q3, valueFormatter(s.q3)) +\n line(t.median, valueFormatter(s.median)) +\n line(t.q1, valueFormatter(s.q1)) +\n line(t.min, valueFormatter(s.whiskerLow)) +\n (s.outliers.length > 0 ? line(t.outlierRow, s.outliers.map(valueFormatter).join(t.listJoin)) : \"\")\n )\n },\n },\n xAxis: { type: \"category\" as const, data: entries.map((e) => e.name), axisTick: { show: false }, axisLabel: { interval: 0, hideOverlap: false } },\n yAxis: {\n type: \"value\" as const,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: { show: true },\n axisLabel: { formatter: (v: number) => axisFormatter(v) },\n },\n series: [\n {\n id: \"box\",\n type: \"custom\" as const,\n encode: { x: 0, y: [1, 2, 3, 4, 5, 6, 7] },\n data,\n renderItem: boxPlotRenderer(color, entries.map((e) => e.stats?.outliers ?? [])),\n },\n ],\n }\n return mergeChartOptions(option as EChartsOption, config.chartOptions)\n}\n\n/* -------------------------------------------------------------- component */\n\nconst NO_GROUPS: never[] = []\n\nexport const BoxPlotChart = forwardRef(function BoxPlotChart(\n {\n groups = NO_GROUPS,\n whisker,\n valueLabel,\n format,\n valueFormatter: valueFormatterProp,\n showTooltip = true,\n title,\n summary,\n actions,\n fileName,\n isLoading,\n emptyState,\n height,\n chartOptions,\n ariaLabel,\n className,\n ...rest\n }: BoxPlotChartProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const { ref: frameRef, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n const valueFormatter = useMemo(() => resolveValueFormatter(valueFormatterProp, format, locale), [valueFormatterProp, format, locale])\n const entries = useMemo(() => boxPlotEntries(groups, whisker), [groups, whisker])\n const [color = \"\"] = useMemo(() => resolveChartColors([\"chart-1\"], tokens), [tokens])\n const option = useMemo(\n () => buildBoxPlotOption({ entries, color, valueFormatter, valueLabel, showTooltip, labelColor: tokens?.foreground ?? undefined, chartOptions, locale }),\n [entries, color, valueFormatter, valueLabel, showTooltip, tokens, chartOptions, locale],\n )\n const dataTable = useMemo(() => boxPlotDataTable(entries, valueFormatter, locale), [entries, valueFormatter, locale])\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildBoxPlotSummary(entries, valueFormatter, valueLabel, locale) : summary),\n [summary, entries, valueFormatter, valueLabel, locale],\n )\n const label = ariaLabel ?? t.chart(valueLabel ?? t.valueInSentence)\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? false}\n isEmpty={entries.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})\nBoxPlotChart.displayName = \"BoxPlotChart\"\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, label and tone; the label follows the\n * page's language, `<html lang>`), so the same state is worded the same everywhere (Tracker legends import it too):\n *\n * | status | ラベル(ja / en) | 色調 |\n * |---|---|---|\n * | `success` | 正常 / Healthy | positive |\n * | `partial` | 一部失敗 / Partially failed | warning |\n * | `failed` | 失敗 / Failed | negative |\n * | `delayed` | 遅延 / Delayed | warning |\n * | `running` | 実行中 / Running | info |\n * | `stopped` | 停止中 / Stopped | neutral |\n * | `active` / `inactive` | 有効 / 無効、Active / Inactive | positive / neutral |\n * | `warning` / `error` / `pending` | 警告 / エラー / 保留中、Warning / Error / Pending | warning / negative / info |\n */\nimport { forwardRef } from \"react\"\n\nimport { useLocale } from \"../hooks/use-locale\"\nimport { resolveLocale, uiLanguage } from \"../lib/locale\"\nimport { cn } from \"../lib/utils\"\nimport { Badge } from \"../ui/badge\"\n\ntype StatusTone = \"positive\" | \"negative\" | \"warning\" | \"info\" | \"neutral\"\n\nconst STATUS_LABELS = {\n ja: {\n success: \"正常\",\n partial: \"一部失敗\",\n failed: \"失敗\",\n delayed: \"遅延\",\n running: \"実行中\",\n stopped: \"停止中\",\n active: \"有効\",\n inactive: \"無効\",\n warning: \"警告\",\n error: \"エラー\",\n pending: \"保留中\",\n },\n en: {\n success: \"Healthy\",\n partial: \"Partially failed\",\n failed: \"Failed\",\n delayed: \"Delayed\",\n running: \"Running\",\n stopped: \"Stopped\",\n active: \"Active\",\n inactive: \"Inactive\",\n warning: \"Warning\",\n error: \"Error\",\n pending: \"Pending\",\n },\n} as const\n\n/**\n * 状態の語彙の正本: status → ラベルと色調。StatusBadge の既定の表示と、Tracker の凡例など\n * 同じ状態を語る他の場所が、同じ語を使うためにここから参照する。`label` は英語(フォールバック)で、\n * ページの言語に合わせた語は `statusLabel(status, locale)` で引く。\n */\nexport const STATUS_VOCABULARY = {\n success: { label: STATUS_LABELS.en.success, tone: \"positive\" },\n partial: { label: STATUS_LABELS.en.partial, tone: \"warning\" },\n failed: { label: STATUS_LABELS.en.failed, tone: \"negative\" },\n delayed: { label: STATUS_LABELS.en.delayed, tone: \"warning\" },\n running: { label: STATUS_LABELS.en.running, tone: \"info\" },\n stopped: { label: STATUS_LABELS.en.stopped, tone: \"neutral\" },\n active: { label: STATUS_LABELS.en.active, tone: \"positive\" },\n inactive: { label: STATUS_LABELS.en.inactive, tone: \"neutral\" },\n warning: { label: STATUS_LABELS.en.warning, tone: \"warning\" },\n error: { label: STATUS_LABELS.en.error, tone: \"negative\" },\n pending: { label: STATUS_LABELS.en.pending, tone: \"info\" },\n} as const satisfies Record<string, { label: string; tone: StatusTone }>\n\nexport type StatusKey = keyof typeof STATUS_VOCABULARY\n\n/** 状態のラベル(`locale` の言語。既定はページのロケール)。語彙に無い status は渡された文字列のまま返す。 */\nexport function statusLabel(status: string, locale?: string): string {\n return Object.hasOwn(STATUS_VOCABULARY, status) ? STATUS_LABELS[uiLanguage(resolveLocale(locale))][status as StatusKey] : 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; border: string }> = {\n positive: { dot: \"bg-positive\", bg: \"bg-positive-subtle\", text: \"text-positive\", border: \"border-positive/20 dark:border-positive/25\" },\n negative: { dot: \"bg-negative\", bg: \"bg-negative-subtle\", text: \"text-negative\", border: \"border-negative/20 dark:border-negative/25\" },\n warning: { dot: \"bg-warning\", bg: \"bg-warning-subtle\", text: \"text-warning\", border: \"border-warning/20 dark:border-warning/25\" },\n info: { dot: \"bg-info\", bg: \"bg-info-subtle\", text: \"text-info\", border: \"border-info/20 dark:border-info/25\" },\n neutral: { dot: \"bg-neutral\", bg: \"bg-neutral-subtle\", text: \"text-neutral\", border: \"border-neutral/20 dark:border-neutral/25\" },\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 locale = useLocale()\n const mergedColorMap = { ...defaultColorMap, ...colorMap }\n const style = toneStyles[resolveTone(mergedColorMap[status])]\n const displayLabel = label ?? statusLabel(status, locale)\n\n return (\n <Badge\n ref={ref}\n data-slot=\"status-badge\"\n variant=\"outline\"\n className={cn(\"gap-1.5 rounded-md\", style.border, style.bg, style.text, className)}\n aria-label={displayLabel}\n >\n <span className={cn(\"inline-block size-1.5 rounded-full\", style.dot)} aria-hidden=\"true\" />\n {displayLabel}\n </Badge>\n )\n})\nStatusBadge.displayName = \"StatusBadge\"\n","\"use client\"\n\n/**\n * AttentionList — 期日超過・期限間近・リスク・滞留に当たる行を上に寄せ、理由と次の一手を添えて並べる要対応一覧。\n * 判定は `judgeAttention`(純関数)が行い、部品は並べ替えと描画だけをする。区分の文言としきい値\n * (`dueSoonDays` / `staleDays`)は props で渡す。業務の意味(請求・商談・契約など)は呼び元が決める。\n *\n * - 区分は 1 行に 1 つ。複数に当たるときは 期日超過 > リスク > 期限間近 > 滞留 の順で強いほうを採る。\n * - 並びは区分の強さ、同じ区分では日数の大きい(遅れている・止まっている)行が先。日数が同じなら元の順。\n * - 区分の色は StatusBadge の意味色(negative / warning / info)。色だけでなく区分名と日数の文で伝える。\n * - 判定に当たらない行は既定で出さない(`includeUnflagged` で末尾に出す)。当たる行がなければ Empty を出す。\n * - 行の項目は関数(`getDueDate` など)か列名(`dueDateKey` など)で渡す。列名は JSON で書けるので、下書きはこちらを使う。\n * 両方あれば関数が先。どちらも無ければ、期日・動き・リスクは「無い」として判定せず、行の ID は行の順番、見出しは空になる。\n * - 行を押すと `onRowClick(row)` を呼ぶ。渡さなければ押せない行(button ではなく li)になる。\n *\n * @example\n * import { AttentionList } from \"@/components/attention-list\"\n * // Vantage: import { AttentionList } from \"@squadbase/vantage/components\"\n *\n * <AttentionList\n * rows={receivables}\n * asOf=\"2026-10-23\"\n * dueSoonDays={7}\n * getRowId={(r) => r.id}\n * getTitle={(r) => r.customer}\n * getDueDate={(r) => r.dueDate}\n * getNextAction={(r) => r.nextAction}\n * onRowClick={(r) => openDetail(r.id)}\n * />\n */\nimport { differenceInCalendarDays, parseISO } from \"date-fns\"\nimport { useMemo, type HTMLAttributes, type ReactNode } from \"react\"\n\nimport { useLocale } from \"../hooks/use-locale\"\nimport { formatDate } from \"../lib/format\"\nimport { resolveLocale, uiLanguage, type UiLanguage } from \"../lib/locale\"\nimport { cn } from \"../lib/utils\"\nimport { Empty } from \"../ui/states\"\nimport { StatusBadge } from \"./status-badge\"\n\nexport type AttentionKind = \"overdue\" | \"risk\" | \"dueSoon\" | \"stale\"\n\n/** 強い順。並びと、複数に当たったときの採用に使う。 */\nconst KIND_ORDER: readonly AttentionKind[] = [\"overdue\", \"risk\", \"dueSoon\", \"stale\"]\n\nconst KIND_TONES: Record<AttentionKind, string> = {\n overdue: \"negative\",\n risk: \"negative\",\n dueSoon: \"warning\",\n stale: \"info\",\n}\n\nconst daysEn = (n: number) => (n === 1 ? \"1 day\" : `${n} days`)\n\nconst TEXT = {\n ja: {\n labels: { overdue: \"期日超過\", risk: \"リスク\", dueSoon: \"期限間近\", stale: \"滞留\" } as Record<AttentionKind, string>,\n overdue: (days: number) => `期日を ${days} 日過ぎています`,\n dueToday: \"期日は今日です\",\n dueIn: (days: number) => `期日まであと ${days} 日です`,\n stale: (days: number) => `${days} 日間動きがありません`,\n empty: \"対応が必要な項目はありません\",\n due: \"期日\",\n nextAction: \"次の一手: \",\n },\n en: {\n labels: { overdue: \"Overdue\", risk: \"At risk\", dueSoon: \"Due soon\", stale: \"Stalled\" } as Record<AttentionKind, string>,\n overdue: (days: number) => `${daysEn(days)} overdue`,\n dueToday: \"Due today\",\n dueIn: (days: number) => `Due in ${daysEn(days)}`,\n stale: (days: number) => `No activity for ${daysEn(days)}`,\n empty: \"Nothing needs attention\",\n due: \"Due\",\n nextAction: \"Next step: \",\n },\n} satisfies Record<UiLanguage, unknown>\n\n/** The category names in English (the fallback language). The list picks the page's language (`<html lang>`); ja reads 期日超過 / リスク / 期限間近 / 滞留. */\nexport const DEFAULT_ATTENTION_LABELS: Record<AttentionKind, string> = TEXT.en.labels\n\n/** The category names in `locale`'s language (default the page's, `<html lang>`). */\nexport function attentionLabels(locale?: string): Record<AttentionKind, string> {\n return TEXT[uiLanguage(resolveLocale(locale))].labels\n}\n\ntype DateInput = Date | string | null | undefined\n\nexport interface AttentionJudgement {\n kind: AttentionKind\n /**\n * overdue: 期日を過ぎた日数(1 以上)/ dueSoon: 期日までの日数(0 = 当日)/\n * stale: 最終の動きからの日数/ risk: 0。\n */\n days: number\n}\n\nexport interface JudgeAttentionInput {\n /** 期日。無ければ期日の判定(超過・間近)はしない。 */\n dueDate?: DateInput\n /** 最後に動きがあった日。無ければ滞留の判定はしない。 */\n lastActivityAt?: DateInput\n /** 呼び元がリスクと判定した行。 */\n risk?: boolean\n /** 基準日。必ず渡す(部品の内で「今日」を決めない)。 */\n asOf: Date | string\n /** 期日の何日前から「期限間近」にするか。当日を含み、この日数ちょうども含む。既定 7。 */\n dueSoonDays?: number\n /** 何日動きがなければ「滞留」にするか。この日数ちょうどから滞留。未指定なら滞留は判定しない。 */\n staleDays?: number\n}\n\nfunction toDate(value: DateInput): Date | null {\n if (value === null || value === undefined || value === \"\") return null\n const date = typeof value === \"string\" ? parseISO(value) : value\n return Number.isFinite(date.getTime()) ? date : null\n}\n\n/**\n * 1 行が要対応かを判定する。当たらなければ `null`。日数は暦日(時刻は無視)で数える。\n * 期日の当日は「超過」ではなく「期限間近(0 日)」。\n */\nexport function judgeAttention(input: JudgeAttentionInput): AttentionJudgement | null {\n const asOf = toDate(input.asOf)\n if (!asOf) return null\n const dueSoonDays = input.dueSoonDays ?? 7\n\n const due = toDate(input.dueDate)\n if (due) {\n const untilDue = differenceInCalendarDays(due, asOf)\n if (untilDue < 0) return { kind: \"overdue\", days: -untilDue }\n }\n if (input.risk) return { kind: \"risk\", days: 0 }\n if (due) {\n const untilDue = differenceInCalendarDays(due, asOf)\n if (untilDue <= dueSoonDays) return { kind: \"dueSoon\", days: untilDue }\n }\n const last = toDate(input.lastActivityAt)\n if (last && input.staleDays !== undefined) {\n const idle = differenceInCalendarDays(asOf, last)\n if (idle >= input.staleDays) return { kind: \"stale\", days: idle }\n }\n return null\n}\n\n/** 区分の強さ → 日数の大きい順(dueSoon は期日が近い順)。同順位は 0 を返し、元の順を保つ。 */\nexport function compareAttention(a: AttentionJudgement | null, b: AttentionJudgement | null): number {\n if (!a || !b) return a ? -1 : b ? 1 : 0\n const byKind = KIND_ORDER.indexOf(a.kind) - KIND_ORDER.indexOf(b.kind)\n if (byKind !== 0) return byKind\n return a.kind === \"dueSoon\" ? a.days - b.days : b.days - a.days\n}\n\nfunction defaultReason(j: AttentionJudgement, labels: Record<AttentionKind, string>, t: (typeof TEXT)[UiLanguage]): string {\n switch (j.kind) {\n case \"overdue\":\n return t.overdue(j.days)\n case \"dueSoon\":\n return j.days === 0 ? t.dueToday : t.dueIn(j.days)\n case \"stale\":\n return t.stale(j.days)\n case \"risk\":\n return labels.risk\n }\n}\n\nexport interface AttentionListProps<T> {\n rows: T[]\n /** 基準日(`\"2026-10-23\"` か Date)。 */\n asOf: Date | string\n /** 期日の何日前から「期限間近」にするか。既定 7。 */\n dueSoonDays?: number\n /** この日数動きがなければ「滞留」。未指定なら滞留は判定しない。 */\n staleDays?: number\n /** 区分名の差し替え(例: `{ overdue: \"入金遅れ\" }`)。 */\n labels?: Partial<Record<AttentionKind, string>>\n /** 行の ID。省略時は `idKey` の列、それも無ければ行の順番。 */\n getRowId?: (row: T) => string\n /** 行の見出し(顧客名・案件名など)。省略時は `titleKey` の列、それも無ければ空。 */\n getTitle?: (row: T) => ReactNode\n getDueDate?: (row: T) => DateInput\n getLastActivityAt?: (row: T) => DateInput\n /** リスクと判定する行。期日・滞留より先に出す。 */\n isRisk?: (row: T) => boolean\n /** 行の ID の列名(JSON で書ける `getRowId`)。 */\n idKey?: string\n /** 見出しの列名(JSON で書ける `getTitle`)。 */\n titleKey?: string\n /** 期日の列名(JSON で書ける `getDueDate`)。値は `\"2026-10-23\"` 形式の日付か Date。 */\n dueDateKey?: string\n /** 最後に動きがあった日の列名(JSON で書ける `getLastActivityAt`)。 */\n lastActivityAtKey?: string\n /** リスクの列名(JSON で書ける `isRisk`)。値が真の行をリストにする。 */\n riskKey?: string\n /** 次の一手の列名(JSON で書ける `getNextAction`)。値が空の行には添えない。 */\n nextActionKey?: string\n /** 理由の文。省略すると区分と日数から作る。 */\n getReason?: (row: T, judgement: AttentionJudgement) => ReactNode\n /** 次の一手。判定に当たる行に添える。 */\n getNextAction?: (row: T, judgement: AttentionJudgement) => ReactNode\n /** 見出しの右に出す補足(金額・担当者など)。 */\n getMeta?: (row: T) => ReactNode\n /** 行を押したとき。渡すと行が button になる。 */\n onRowClick?: (row: T) => void\n /** 判定に当たらない行も末尾に出す。既定 false。 */\n includeUnflagged?: boolean\n /** 該当なしのときの見出し・説明。 */\n emptyTitle?: string\n emptyDescription?: string\n className?: string\n}\n\nfunction cell(row: unknown, key: string | undefined): unknown {\n if (!key || row === null || typeof row !== \"object\") return undefined\n return (row as Record<string, unknown>)[key]\n}\n\nfunction asDateInput(value: unknown): DateInput {\n return typeof value === \"string\" || value instanceof Date ? value : undefined\n}\n\nfunction asNode(value: unknown): ReactNode {\n return typeof value === \"string\" || typeof value === \"number\" ? value : null\n}\n\nexport function AttentionList<T>({\n rows,\n asOf,\n dueSoonDays,\n staleDays,\n labels,\n getRowId,\n getTitle,\n getDueDate,\n getLastActivityAt,\n isRisk,\n idKey,\n titleKey,\n dueDateKey,\n lastActivityAtKey,\n riskKey,\n nextActionKey,\n getReason,\n getNextAction,\n getMeta,\n onRowClick,\n includeUnflagged = false,\n emptyTitle,\n emptyDescription,\n className,\n ...rest\n}: AttentionListProps<T> & Omit<HTMLAttributes<HTMLUListElement>, keyof AttentionListProps<T>>) {\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n const mergedLabels = useMemo(() => ({ ...t.labels, ...labels }), [t, labels])\n const colorMap = KIND_TONES\n const dueOf = (row: T) => (getDueDate ? getDueDate(row) : asDateInput(cell(row, dueDateKey)))\n const nextActionOf = (row: T, j: AttentionJudgement): ReactNode =>\n getNextAction ? getNextAction(row, j) : asNode(cell(row, nextActionKey))\n\n // アクセサは呼び元の判定そのものなので、rows が同じ参照でも毎回かけ直す(メモ化すると古い判定が残る)\n const items = (rows ?? [])\n .map((row, index) => ({\n row,\n index,\n judgement: judgeAttention({\n dueDate: dueOf(row),\n lastActivityAt: getLastActivityAt ? getLastActivityAt(row) : asDateInput(cell(row, lastActivityAtKey)),\n risk: isRisk ? isRisk(row) : Boolean(cell(row, riskKey)),\n asOf,\n dueSoonDays,\n staleDays,\n }),\n }))\n .filter((item) => includeUnflagged || item.judgement)\n .sort((a, b) => compareAttention(a.judgement, b.judgement) || a.index - b.index)\n\n if (items.length === 0) {\n return <Empty title={emptyTitle ?? t.empty} description={emptyDescription} className={className} />\n }\n\n return (\n <ul data-slot=\"attention-list\" className={cn(\"divide-y divide-border\", className)} {...rest}>\n {items.map(({ row, index, judgement }) => {\n const due = dueOf(row)\n const body = (\n <>\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1\">\n {judgement && (\n <StatusBadge status={judgement.kind} label={mergedLabels[judgement.kind]} colorMap={colorMap} />\n )}\n <span className=\"min-w-0 font-medium\">{getTitle ? getTitle(row) : asNode(cell(row, titleKey))}</span>\n {getMeta && <span className=\"text-sm tabular-nums text-muted-foreground\">{getMeta(row)}</span>}\n {due ? (\n <span className=\"ml-auto text-sm tabular-nums text-muted-foreground\">\n {t.due} {formatDate(due, \"date\", locale)}\n </span>\n ) : null}\n </div>\n {judgement && (\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {getReason ? getReason(row, judgement) : defaultReason(judgement, mergedLabels, t)}\n </p>\n )}\n {judgement && (getNextAction || nextActionKey) && nextActionOf(row, judgement) ? (\n <p className=\"mt-1 text-sm\">\n <span className=\"text-muted-foreground\">{t.nextAction}</span>\n {nextActionOf(row, judgement)}\n </p>\n ) : null}\n </>\n )\n return (\n <li key={getRowId ? getRowId(row) : String(cell(row, idKey) ?? index)} data-slot=\"attention-list-row\">\n {onRowClick ? (\n <button\n type=\"button\"\n onClick={() => onRowClick(row)}\n className=\"block w-full px-3 py-3 text-left transition-colors hover:bg-muted/50 focus-visible:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {body}\n </button>\n ) : (\n <div className=\"px-3 py-3\">{body}</div>\n )}\n </li>\n )\n })}\n </ul>\n )\n}\nAttentionList.displayName = \"AttentionList\"\n","\"use client\"\n\n/**\n * ComboChart — bars, lines and areas on one category / time axis, with up to two value axes (left and right); use it only to migrate a Tableau dual-axis sheet, and use `PairedChart` for a new dashboard.\n *\n * It exists to reproduce a Tableau dual-axis sheet faithfully (a Pareto: sales as bars, the cumulative share as a\n * line on the right). For a new dashboard prefer PairedChart, which stacks the two measures in panels over a\n * shared axis instead of reading two scales off one plot.\n *\n * Each value axis starts at 0 (bars always do; a negative value extends the axis below it), carries its own format\n * (`format` left, `rightFormat` right), and never repeats a tick label: the tick step widens until every label on\n * the axis reads differently. Only the left axis draws grid lines. `referenceLines` draw dashed lines on either axis.\n * Clicking a bar or a point calls `onSelect` with its row.\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { useLocale } from \"../hooks/use-locale\"\nimport { resolveChartColors, useChartSurface, type ChartTokens } from \"../lib/chart-theme\"\nimport {\n chartRootProps,\n DEFAULT_CHART_COLORS,\n resolveAxisTickFormatter,\n resolveValueFormatter,\n toChartNumber,\n type ChartDataTable,\n} from \"../lib/chart-utils\"\nimport { EMPTY_VALUE, type ValueFormat } from \"../lib/format\"\nimport { resolveLocale, uiLanguage } from \"../lib/locale\"\nimport type { ChartActionsOptions, ChartEmptyState, ChartRootAttributes, ChartSeriesColor, ValueFormatter } from \"../lib/types\"\n\nexport type ComboSeriesType = \"bar\" | \"line\" | \"area\"\nexport type ComboAxis = \"left\" | \"right\"\n\n/** One measure of a ComboChart. */\nexport interface ComboSeries<K extends string = string> {\n /** 値の列名。 */\n key: K\n /** 描き方。`\"bar\"`(棒)・`\"line\"`(線)・`\"area\"`(面)。 */\n type: ComboSeriesType\n /** どちらの値の軸で読むか。既定 `\"left\"`。`\"right\"` の系列が 1 つでもあると右軸を出す。 */\n axis?: ComboAxis\n /** 凡例・ツールチップの表示名。省略時は `labels[key]`、無ければ列名。 */\n label?: string\n /** 色。`\"chart-1\"`〜`\"chart-5\"` か意味色。省略時は系列の順にトークン色。 */\n color?: ChartSeriesColor\n}\n\n/** A dashed horizontal (vertical with `layout=\"vertical\"`) line at a value of one axis. */\nexport interface ComboReferenceLine {\n /** 線を引く値。 */\n value: number\n /** どちらの軸の値か。既定 `\"left\"`。 */\n axis?: ComboAxis\n /** 線のラベル。省略時は軸の書式で値を書く。 */\n label?: string\n}\n\nexport interface ComboChartProps<T extends Record<string, unknown> = Record<string, unknown>> extends ChartRootAttributes {\n /** 行の配列。1 行 = カテゴリ軸の 1 つの値(集計済み)。 */\n data: T[]\n /** カテゴリ軸(横軸)の列名。例 `\"month\"`・`\"product\"`。行の順に並ぶ。 */\n index: keyof T & string\n /** 描く系列。`{ key, type: \"bar\" | \"line\" | \"area\", axis?: \"left\" | \"right\", label? }` の配列。描く順(後ろほど手前)。 */\n series: ComboSeries<keyof T & string>[]\n /** 左軸(と左軸の系列のツールチップ・データ表)の書式。既定 `\"compact\"` 相当の短い表記。 */\n format?: ValueFormat\n /** 右軸の書式。例 パレート図の累積比なら `\"percent\"`。省略時は `format`。 */\n rightFormat?: ValueFormat\n /** 列名・カテゴリの値 → 表示名。 */\n labels?: Record<string, string>\n /** 参照線(目標・平均など)。`{ value, axis?, label? }` の配列。 */\n referenceLines?: ComboReferenceLine[]\n /** 同じ軸の棒どうし・面どうしを積み上げる。既定 `false`(棒は横に並べる)。 */\n stacked?: boolean\n /** `\"vertical\"` でカテゴリを縦軸に並べる(横棒)。左軸は下、右軸は上になる。既定 `\"horizontal\"`。 */\n layout?: \"horizontal\" | \"vertical\"\n /** 凡例を出す。既定 `true`(系列が 2 つ以上のとき)。 */\n showLegend?: boolean\n /** ホバーでツールチップを出す。既定 `true`。 */\n showTooltip?: boolean\n /** 棒・点のクリック。その行を受け取る(フィルターの操作に使う)。 */\n onSelect?: (row: T) => void\n /** グラフの見出し。 */\n title?: string\n /** グラフが言っていることの 1 文要約。 */\n summary?: string\n /** 読み込み中。最終形と同じ高さのスケルトンを出す。 */\n isLoading?: boolean\n /** `data` が空のときの表示。 */\n emptyState?: ChartEmptyState\n /** プロット領域の高さ(px)。既定 288。 */\n height?: number\n /** 生成した EChartsOption に最後に深くマージする逃げ道。 */\n chartOptions?: EChartsOption\n /** グラフ右上に PNG 保存/コピーのボタンを出す。 */\n actions?: boolean | ChartActionsOptions\n /** PNG 保存時のファイル名(拡張子つき)。 */\n fileName?: string\n className?: string\n /** スクリーンリーダー向けのラベル。 */\n ariaLabel?: string\n}\n\n/* ------------------------------------------------------------------ model */\n\n/** ECharts' \"nice\" step for a raw step: 1 / 2 / 3 / 5 × 10ⁿ (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\nconst round = (n: number) => Number(n.toPrecision(12))\n\nexport interface ComboAxisScale {\n min: number\n max: number\n interval: number\n /** The tick label formatter (one unit across the axis). */\n tick: ValueFormatter\n}\n\n/**\n * The scale of one value axis over `[lo, hi]`: always includes 0, ends on whole steps, and widens the step until\n * no two tick labels read the same (`¥1M, ¥1M, ¥2M` from a step of 0.5M in a compact format becomes 1M steps).\n */\nexport function comboAxisScale(lo: number, hi: number, splitNumber: number, ticks: (top: number) => ValueFormatter): ComboAxisScale {\n let low = Math.min(0, Number.isFinite(lo) ? lo : 0)\n let high = Math.max(0, Number.isFinite(hi) ? hi : 0)\n if (high <= low) high = low + 1\n let step = niceStep((high - low) / Math.max(1, splitNumber))\n for (let attempt = 0; ; attempt++) {\n const min = round(Math.floor(low / step) * step)\n const max = round(Math.ceil(high / step) * step)\n const tick = ticks(Math.max(Math.abs(min), Math.abs(max)))\n const count = Math.round((max - min) / step)\n const labels = Array.from({ length: count + 1 }, (_, i) => tick(round(min + i * step)))\n if (new Set(labels).size === labels.length || attempt >= 6) return { min, max, interval: step, tick }\n step = niceStep(step * 2)\n }\n}\n\n/** The plot height (px) when `height` is not given (ChartFrame's default). */\nconst DEFAULT_CHART_HEIGHT = 288\n\n/** How many intervals a value axis carries at a plot height: 3 under 200px, 4 under 300px, else 5. */\nconst splitCountFor = (height: number) => (height < 200 ? 3 : height < 300 ? 4 : 5)\n\nfunction escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[c]!)\n}\n\nconst TEXT = {\n ja: { item: \"項目\", chart: \"複合グラフ\" },\n en: { item: \"Item\", chart: \"Combination chart\" },\n}\nconst textOf = (locale?: string) => TEXT[uiLanguage(resolveLocale(locale))]\n\nexport interface ComboChartOptionConfig {\n data: readonly Record<string, unknown>[]\n index: string\n series: readonly ComboSeries[]\n /** Resolved (canvas-safe) colour per series; `\"\"` leaves the theme palette. */\n palette: readonly string[]\n /** Resolved colour of the reference lines. */\n referenceColor: string\n labels?: Record<string, string>\n formatters: Record<ComboAxis, ValueFormatter>\n ticks: Record<ComboAxis, (top: number) => ValueFormatter>\n referenceLines?: readonly ComboReferenceLine[]\n stacked?: boolean\n layout?: \"horizontal\" | \"vertical\"\n showLegend?: boolean\n showTooltip?: boolean\n plotHeight?: number\n chartOptions?: EChartsOption\n}\n\nconst axisOf = (s: { axis?: ComboAxis }): ComboAxis => (s.axis === \"right\" ? \"right\" : \"left\")\n\n/** The series a ComboChart can draw: entries with a key and a known type. */\nexport function comboSeriesList(series: unknown): ComboSeries[] {\n if (!Array.isArray(series)) return []\n return series.filter(\n (s): s is ComboSeries => !!s && typeof s === \"object\" && typeof (s as ComboSeries).key === \"string\" && [\"bar\", \"line\", \"area\"].includes((s as ComboSeries).type),\n )\n}\n\nexport function buildComboChartOption(config: ComboChartOptionConfig): EChartsOption {\n const { data, index, labels, formatters } = config\n const series = comboSeriesList(config.series)\n const label = (key: string) => labels?.[key] ?? key\n const seriesName = (s: ComboSeries) => s.label ?? label(s.key)\n const vertical = config.layout === \"vertical\"\n const categories = data.map((row) => String(row?.[index] ?? \"\"))\n const values = series.map((s) => data.map((row) => toChartNumber(row?.[s.key])))\n const hasRight = series.some((s) => axisOf(s) === \"right\")\n const axes: ComboAxis[] = hasRight ? [\"left\", \"right\"] : [\"left\"]\n\n // Each axis' extent: its series (stacked bars / areas by their running sums), and its reference lines.\n const extent = (axis: ComboAxis): [number, number] => {\n let [lo, hi] = [0, 0]\n const add = (v: number | null) => {\n if (v !== null && Number.isFinite(v)) [lo, hi] = [Math.min(lo, v), Math.max(hi, v)]\n }\n const stacks = new Map<string, { pos: number[]; neg: number[] }>()\n series.forEach((s, i) => {\n if (axisOf(s) !== axis) return\n if (config.stacked && s.type !== \"line\") {\n const stack = stacks.get(s.type) ?? { pos: data.map(() => 0), neg: data.map(() => 0) }\n values[i]!.forEach((v, j) => {\n if (v === null) return\n if (v >= 0) stack.pos[j]! += v\n else stack.neg[j]! += v\n })\n stacks.set(s.type, stack)\n } else values[i]!.forEach(add)\n })\n for (const stack of stacks.values()) [...stack.pos, ...stack.neg].forEach(add)\n for (const ref of config.referenceLines ?? []) if (axisOf(ref) === axis) add(toChartNumber(ref.value))\n return [lo, hi]\n }\n const split = splitCountFor(config.plotHeight ?? DEFAULT_CHART_HEIGHT)\n const scales = Object.fromEntries(axes.map((axis) => [axis, comboAxisScale(...extent(axis), split, config.ticks[axis])])) as Record<ComboAxis, ComboAxisScale>\n\n const valueAxes = axes.map((axis) => ({\n type: \"value\" as const,\n position: vertical ? (axis === \"left\" ? (\"bottom\" as const) : (\"top\" as const)) : axis,\n min: scales[axis].min,\n max: scales[axis].max,\n interval: scales[axis].interval,\n axisLine: { show: false },\n axisTick: { show: false },\n splitLine: { show: axis === \"left\" },\n axisLabel: { formatter: (v: number) => scales[axis].tick(v), hideOverlap: vertical ? true : undefined },\n }))\n const categoryAxis = {\n type: \"category\" as const,\n data: categories,\n inverse: vertical,\n axisTick: { show: false },\n axisLabel: { formatter: (v: string) => label(v), hideOverlap: true },\n }\n\n const axisIndex = (s: { axis?: ComboAxis }) => (axisOf(s) === \"right\" ? 1 : 0)\n const drawn = series.map((s, i) => {\n const color = config.palette[i] || undefined\n const common = {\n id: `series-${i}`,\n name: seriesName(s),\n data: values[i],\n [vertical ? \"xAxisIndex\" : \"yAxisIndex\"]: axisIndex(s),\n emphasis: { focus: \"none\" as const },\n }\n if (s.type === \"bar\")\n return {\n ...common,\n type: \"bar\" as const,\n stack: config.stacked ? `bar-${axisOf(s)}` : undefined,\n barMaxWidth: 40,\n itemStyle: { color, borderRadius: vertical ? [0, 2, 2, 0] : [2, 2, 0, 0] },\n }\n return {\n ...common,\n type: \"line\" as const,\n stack: config.stacked && s.type === \"area\" ? `area-${axisOf(s)}` : undefined,\n symbol: \"circle\",\n symbolSize: 6,\n showSymbol: data.length <= 24,\n connectNulls: false,\n lineStyle: { width: 2, color },\n itemStyle: { color },\n areaStyle: s.type === \"area\" ? { color, opacity: 0.18 } : undefined,\n z: 3,\n }\n })\n const references = axes.flatMap((axis) => {\n const lines = (config.referenceLines ?? []).filter((r) => axisOf(r) === axis && toChartNumber(r.value) !== null)\n if (lines.length === 0) return []\n return [\n {\n id: `reference-${axis}`,\n type: \"line\" as const,\n data: data.map(() => null),\n [vertical ? \"xAxisIndex\" : \"yAxisIndex\"]: axis === \"right\" ? 1 : 0,\n silent: true,\n symbol: \"none\",\n tooltip: { show: false },\n markLine: {\n silent: true,\n symbol: \"none\",\n lineStyle: { type: \"dashed\" as const, color: config.referenceColor || undefined, width: 1 },\n label: { position: \"insideEndTop\" as const, color: config.referenceColor || undefined },\n data: lines.map((r) => ({\n [vertical ? \"xAxis\" : \"yAxis\"]: toChartNumber(r.value),\n label: { formatter: r.label ?? config.formatters[axis](toChartNumber(r.value) as number) },\n })),\n },\n },\n ]\n })\n\n const showLegend = (config.showLegend ?? true) && series.length > 1\n const tooltip = (params: unknown): string => {\n const items = (Array.isArray(params) ? params : [params]) as { seriesIndex: number; dataIndex: number; marker?: string }[]\n const first = items[0]\n if (!first) return \"\"\n const head = escapeHtml(label(categories[first.dataIndex] ?? \"\"))\n const lines = items\n .filter((p) => p.seriesIndex < series.length)\n .map((p) => {\n const s = series[p.seriesIndex]!\n const v = values[p.seriesIndex]![p.dataIndex]\n return `${p.marker ?? \"\"}${escapeHtml(seriesName(s))} ${v === null || v === undefined ? EMPTY_VALUE : escapeHtml(formatters[axisOf(s)](v))}`\n })\n return [head, ...lines].join(\"<br/>\")\n }\n const option: EChartsOption = {\n animation: false,\n legend: { show: showLegend, top: 0, left: 0, data: series.map(seriesName) },\n tooltip: config.showTooltip === false ? { show: false } : { trigger: \"axis\", axisPointer: { type: \"shadow\" }, formatter: tooltip },\n grid: { left: 8, right: 8, top: showLegend ? 36 : 12, bottom: 8, containLabel: true },\n xAxis: vertical ? valueAxes : categoryAxis,\n yAxis: vertical ? categoryAxis : valueAxes,\n series: [...drawn, ...references] as never,\n }\n return config.chartOptions\n ? (mergeDeep(option as Record<string, unknown>, config.chartOptions as Record<string, unknown>) as EChartsOption)\n : 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 category, one column per series, each in its axis' format. */\nexport function comboChartDataTable(\n data: readonly Record<string, unknown>[],\n index: string,\n series: readonly ComboSeries[],\n formatters: Record<ComboAxis, ValueFormatter>,\n labels?: Record<string, string>,\n locale?: string,\n): ChartDataTable {\n const list = comboSeriesList(series)\n const label = (key: string) => labels?.[key] ?? key\n return {\n columns: [labels?.[index] ?? textOf(locale).item, ...list.map((s) => s.label ?? label(s.key))],\n rows: data.map((row) => [\n label(String(row?.[index] ?? \"\")),\n ...list.map((s) => {\n const n = toChartNumber(row?.[s.key])\n return n === null ? EMPTY_VALUE : formatters[axisOf(s)](n)\n }),\n ]),\n }\n}\n\n/* -------------------------------------------------------------- component */\n\n/** Rows / series not given yet (a draft fills props in steps): keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nfunction ComboChartImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n index,\n series = NO_ROWS,\n format,\n rightFormat,\n labels,\n referenceLines,\n stacked = false,\n layout = \"horizontal\",\n showLegend = true,\n showTooltip = true,\n onSelect,\n title,\n summary,\n isLoading,\n emptyState,\n height,\n chartOptions,\n actions,\n fileName,\n className,\n ariaLabel,\n ...rest\n }: ComboChartProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const rows = Array.isArray(data) ? data : NO_ROWS\n const list = useMemo(() => comboSeriesList(series), [series])\n const { ref: frameRef, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const formatters = useMemo(\n () => ({ left: resolveValueFormatter(undefined, format, locale), right: resolveValueFormatter(undefined, rightFormat ?? format, locale) }),\n [format, rightFormat, locale],\n )\n const ticks = useMemo(\n () => ({ left: resolveAxisTickFormatter(undefined, format, locale), right: resolveAxisTickFormatter(undefined, rightFormat ?? format, locale) }),\n [format, rightFormat, locale],\n )\n const palette = useMemo(() => resolveColors(tokens, list), [tokens, list])\n const option = useMemo(\n () =>\n buildComboChartOption({\n data: rows,\n index,\n series: list,\n palette: palette.series,\n referenceColor: palette.reference,\n labels,\n formatters,\n ticks,\n referenceLines,\n stacked,\n layout,\n showLegend,\n showTooltip,\n plotHeight: height,\n chartOptions,\n }),\n [rows, index, list, palette, labels, formatters, ticks, referenceLines, stacked, layout, showLegend, showTooltip, height, chartOptions],\n )\n const onEvents = useMemo(\n () =>\n onSelect\n ? {\n click: (params: unknown) => {\n const p = params as { componentType?: string; seriesIndex?: number; dataIndex?: number }\n if (p.componentType !== \"series\" || (p.seriesIndex ?? Infinity) >= list.length) return\n const row = rows[p.dataIndex ?? -1]\n if (row) onSelect(row)\n },\n }\n : undefined,\n [onSelect, rows, list.length],\n )\n const dataTable = useMemo(() => comboChartDataTable(rows, index, list, formatters, labels, locale), [rows, index, list, formatters, labels, locale])\n const label = ariaLabel ?? textOf(locale).chart\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={summary}\n isLoading={isLoading ?? false}\n isEmpty={rows.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 }} />\n </ChartFrame>\n )\n}\n\nfunction resolveColors(tokens: ChartTokens | null, series: readonly ComboSeries[]) {\n const resolved = resolveChartColors(\n [\"var(--muted-foreground)\", ...series.map((s, i) => s.color ?? DEFAULT_CHART_COLORS[i % DEFAULT_CHART_COLORS.length]!)],\n tokens,\n )\n return { reference: resolved[0] ?? \"\", series: resolved.slice(1) }\n}\n\n/** Generic over the row type, so `index` and the series keys are checked against `data`. */\nexport const ComboChart = forwardRef(ComboChartImpl as (props: ComboChartProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: ComboChartProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nComboChart.displayName = \"ComboChart\"\n","/**\n * 等間隔の 1 系列に対する指数平滑法(ETS、誤差は加法)の予測。依存なしの純関数で、同じ入力には同じ出力を返す(乱数を使わない)。\n *\n * - モデルは トレンド(なし / 加法)× 季節(なし / 加法 / 乗法)。乗法トレンドは扱わず、加法トレンドとして当てはめる\n * (`model.trend` には実際に当てはめた `\"additive\"` が入る)。乗法トレンドの予測区間は閉じた式が無く、決定的に出せないため。\n * - 平滑化係数(α・β・γ)と初期の水準・傾きは、1 期先予測の残差平方和の最小化(誤差が加法なので最尤と同じ)を\n * Nelder–Mead で解く。範囲は 0 < α < 1、0 < β < α、0 < γ < 1 − α。初期の季節成分は古典的分解(最初の数季節の移動平均)で決める。\n * - `\"auto\"` は当てはめられる組み合わせをすべて当て、AICc が最小のものを選ぶ(Tableau も最大 8 モデルから AIC で選ぶ)。\n * - 予測区間は ETS(A,·,·) の分散の式(Hyndman ほか 2008 / fpp の表)で、点予測 ± z·σ·√(分散の倍率)。σ は残差から。\n * 乗法の季節は閉じた式が無いので、2 期先以降の項に季節指数の 2 乗を掛ける近似にしている。\n * - Tableau はパラメータの推定方法を公開していないため、同じモデルを選んでも値は一致しない(近似値として扱う)。\n */\n\n/** トレンド・季節の指定。`\"auto\"` は当てはめられる候補から AICc で選ぶ。 */\nexport type ForecastComponent = \"none\" | \"additive\" | \"multiplicative\" | \"auto\"\n\n/** 実際に当てはめた成分。 */\nexport type ForecastFittedComponent = \"none\" | \"additive\" | \"multiplicative\"\n\nexport interface ForecastOptions {\n /** トレンド。既定 `\"auto\"`。`\"multiplicative\"` は加法トレンドとして当てはめる。 */\n trend?: ForecastComponent\n /** 季節。既定 `\"auto\"`。`seasonLength` が 1 以下か、点が 2 季節分に満たないときは季節なしに落とす。 */\n season?: ForecastComponent\n /** 1 季節の期数(月次 12・四半期 4・曜日 7)。省略か 1 で季節なし。 */\n seasonLength?: number\n /**\n * 予測する期数。既定は季節ありなら 1 季節分(`seasonLength`)、なければ当てはめた点の 4 分の 1(1〜12 期)。\n * 末尾の除外期(`ignoreLast` と末尾の欠損)はこれとは別に予測する。\n */\n horizon?: number\n /** 予測区間の信頼水準(0〜1)。既定 0.95。 */\n confidence?: number\n /** 末尾から除外する期数(締まっていない期)。当てはめに使わず、予測する側に回す。既定 0。 */\n ignoreLast?: number\n}\n\nexport interface ForecastModel {\n trend: \"none\" | \"additive\"\n season: ForecastFittedComponent\n /** 水準の平滑化係数。 */\n alpha: number\n /** 傾きの平滑化係数(誤差修正形。0 < β < α)。トレンドありのときだけ。 */\n beta?: number\n /** 季節の平滑化係数(0 < γ < 1 − α)。季節ありのときだけ。 */\n gamma?: number\n /** 季節の期数。季節ありのときだけ。 */\n seasonLength?: number\n}\n\nexport interface ForecastPoint {\n value: number\n lower: number\n upper: number\n}\n\nexport interface ForecastResult {\n model: ForecastModel\n /** 当てはめに使った点の数。 */\n fitted: number\n /** `values` の中で、当てはめた最後の点の次の位置。`points[k]` は `values[end + k]` の期(配列の外なら、その先の期)。 */\n end: number\n /** 1 期先予測の誤差の標準偏差(残差から)。 */\n sigma: number\n /** 予測。当てはめた最後の点の次の期から、末尾の除外期 + `horizon` 期分。 */\n points: ForecastPoint[]\n}\n\n/** 季節なしで当てはめるのに要る最少の点数。季節ありは 2 季節分。 */\nexport const FORECAST_MIN_POINTS = 5\n/** 当てはめに使う最大の点数(これより長い系列は直近だけを使う。描画のたびに計算するので上限を置く)。 */\nexport const FORECAST_MAX_FIT_POINTS = 1000\n\n/* ------------------------------------------------------------ 標準正規分布 */\n\n/** 標準正規分布の分位点(Acklam の有理近似。相対誤差 1.15e-9 程度)。 */\nexport function inverseNormal(p: number): number {\n if (!(p > 0 && p < 1)) return p <= 0 ? -Infinity : Infinity\n const a = [-3.969683028665376e1, 2.209460984245205e2, -2.759285104469687e2, 1.38357751867269e2, -3.066479806614716e1, 2.506628277459239]\n const b = [-5.447609879822406e1, 1.615858368580409e2, -1.556989798598866e2, 6.680131188771972e1, -1.328068155288572e1]\n const c = [-7.784894002430293e-3, -3.223964580411365e-1, -2.400758277161838, -2.549732539343734, 4.374664141464968, 2.938163982698783]\n const d = [7.784695709041462e-3, 3.224671290700398e-1, 2.445134137142996, 3.754408661907416]\n const low = 0.02425\n if (p < low) {\n const q = Math.sqrt(-2 * Math.log(p))\n return (((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) / ((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1)\n }\n if (p > 1 - low) {\n const q = Math.sqrt(-2 * Math.log(1 - p))\n return -(((((c[0]! * q + c[1]!) * q + c[2]!) * q + c[3]!) * q + c[4]!) * q + c[5]!) / ((((d[0]! * q + d[1]!) * q + d[2]!) * q + d[3]!) * q + 1)\n }\n const q = p - 0.5\n const r = q * q\n return (\n ((((((a[0]! * r + a[1]!) * r + a[2]!) * r + a[3]!) * r + a[4]!) * r + a[5]!) * q) /\n (((((b[0]! * r + b[1]!) * r + b[2]!) * r + b[3]!) * r + b[4]!) * r + 1)\n )\n}\n\n/* ------------------------------------------------------------ Nelder–Mead */\n\n/** 制約なしの Nelder–Mead(決定的。初期単体は各軸に `step` だけずらした点)。 */\nfunction nelderMead(f: (x: number[]) => number, start: number[], step: number, maxEvals: number): { x: number[]; fx: number } {\n const dim = start.length\n const simplex: { x: number[]; fx: number }[] = [{ x: start.slice(), fx: f(start) }]\n for (let i = 0; i < dim; i++) {\n const x = start.slice()\n x[i] = x[i]! + step\n simplex.push({ x, fx: f(x) })\n }\n let evals = dim + 1\n const combine = (a: number[], b: number[], t: number) => a.map((v, i) => v + t * (b[i]! - v))\n while (evals < maxEvals) {\n simplex.sort((p, q) => p.fx - q.fx)\n const best = simplex[0]!\n const worst = simplex[dim]!\n const spread = Math.abs(worst.fx - best.fx)\n if (spread <= 1e-10 * (Math.abs(best.fx) + 1e-20)) break\n const centroid = new Array<number>(dim).fill(0)\n for (let i = 0; i < dim; i++) for (let j = 0; j < dim; j++) centroid[j]! += simplex[i]!.x[j]! / dim\n // 反射・拡大・収縮・縮小(係数は標準の 1 / 2 / 0.5 / 0.5)\n const reflected = combine(centroid, worst.x, -1)\n const fr = f(reflected)\n evals++\n if (fr < best.fx) {\n const expanded = combine(centroid, worst.x, -2)\n const fe = f(expanded)\n evals++\n simplex[dim] = fe < fr ? { x: expanded, fx: fe } : { x: reflected, fx: fr }\n continue\n }\n if (fr < simplex[dim - 1]!.fx) {\n simplex[dim] = { x: reflected, fx: fr }\n continue\n }\n const outside = fr < worst.fx\n const contracted = outside ? combine(centroid, reflected, 0.5) : combine(centroid, worst.x, 0.5)\n const fc = f(contracted)\n evals++\n if (fc < (outside ? fr : worst.fx)) {\n simplex[dim] = { x: contracted, fx: fc }\n continue\n }\n for (let i = 1; i <= dim; i++) {\n const x = combine(best.x, simplex[i]!.x, 0.5)\n simplex[i] = { x, fx: f(x) }\n evals++\n }\n }\n simplex.sort((p, q) => p.fx - q.fx)\n return simplex[0]!\n}\n\n/* ------------------------------------------------------------ ETS */\n\ninterface Spec {\n trend: \"none\" | \"additive\"\n season: ForecastFittedComponent\n m: number\n}\n\ninterface Params {\n alpha: number\n beta: number\n gamma: number\n l0: number\n b0: number\n s0: readonly number[]\n}\n\ninterface RunResult {\n sse: number\n level: number\n slope: number\n /** 季節成分。位置 t の季節は `season[t % m]`。 */\n season: number[]\n}\n\n/** 状態空間形(誤差は加法)で 1 期先予測を回し、残差平方和と最後の状態を返す。発散・不正な値は `null`。 */\nfunction run(y: readonly number[], spec: Spec, p: Params): RunResult | null {\n let l = p.l0\n let b = spec.trend === \"additive\" ? p.b0 : 0\n const s = spec.season === \"none\" ? [] : p.s0.slice()\n const mult = spec.season === \"multiplicative\"\n let sse = 0\n for (let t = 0; t < y.length; t++) {\n const j = t % spec.m\n const base = l + b\n const sj = spec.season === \"none\" ? (mult ? 1 : 0) : s[j]!\n if (mult && (sj <= 0 || base <= 0)) return null\n const yhat = mult ? base * sj : base + sj\n const e = y[t]! - yhat\n if (!Number.isFinite(e)) return null\n sse += e * e\n if (mult) {\n l = base + (p.alpha * e) / sj\n if (spec.trend === \"additive\") b = b + (p.beta * e) / sj\n s[j] = sj + (p.gamma * e) / base\n } else {\n l = base + p.alpha * e\n if (spec.trend === \"additive\") b = b + p.beta * e\n if (spec.season === \"additive\") s[j] = sj + p.gamma * e\n }\n }\n return Number.isFinite(sse) ? { sse, level: l, slope: b, season: s } : null\n}\n\n/** 初期の季節成分(古典的分解: 最初の最大 3 季節に中心化移動平均を当て、季節位置ごとの比・差の平均を正規化)。 */\nfunction initialSeason(y: readonly number[], m: number, mult: boolean): number[] {\n const len = Math.min(Math.floor(y.length / m), 3) * m\n const half = Math.floor(m / 2)\n const sums = new Array<number>(m).fill(0)\n const counts = new Array<number>(m).fill(0)\n for (let t = half; t < len - half; t++) {\n let trend: number\n if (m % 2 === 0) {\n let sum = 0.5 * y[t - half]! + 0.5 * y[t + half]!\n for (let k = t - half + 1; k < t + half; k++) sum += y[k]!\n trend = sum / m\n } else {\n let sum = 0\n for (let k = t - half; k <= t + half; k++) sum += y[k]!\n trend = sum / m\n }\n if (mult && trend <= 0) continue\n sums[t % m]! += mult ? y[t]! / trend : y[t]! - trend\n counts[t % m]!++\n }\n const raw = sums.map((v, j) => (counts[j]! > 0 ? v / counts[j]! : mult ? 1 : 0))\n const mean = raw.reduce((a, v) => a + v, 0) / m\n return mult ? raw.map((v) => (mean > 0 ? v / mean : 1)) : raw.map((v) => v - mean)\n}\n\n/** 最小二乗の直線(切片は t = 0)。 */\nfunction linearFit(z: readonly number[]): { intercept: number; slope: number } {\n const n = z.length\n if (n < 2) return { intercept: z[0] ?? 0, slope: 0 }\n const mt = (n - 1) / 2\n const mz = z.reduce((a, v) => a + v, 0) / n\n let num = 0\n let den = 0\n z.forEach((v, t) => {\n num += (t - mt) * (v - mz)\n den += (t - mt) * (t - mt)\n })\n const slope = den === 0 ? 0 : num / den\n return { intercept: mz - slope * mt, slope }\n}\n\nconst logistic = (x: number) => 1 / (1 + Math.exp(-x))\nconst logit = (p: number) => Math.log(p / (1 - p))\n/** 係数を境界から離す幅(0 や α ちょうどにしない)。 */\nconst EDGE = 1e-4\n\ninterface Fit {\n spec: Spec\n params: Params\n state: RunResult\n /** 推定したパラメータの数(σ を含む)。 */\n k: number\n aicc: number\n}\n\n/** 1 つのモデルを当てはめる。当てはめられないときは `null`。 */\nfunction fitModel(y: readonly number[], spec: Spec): Fit | null {\n const n = y.length\n const { m } = spec\n const seasonal = spec.season !== \"none\"\n const mult = spec.season === \"multiplicative\"\n const s0 = seasonal ? initialSeason(y, m, mult) : []\n const adjusted = y.map((v, t) => (!seasonal ? v : mult ? v / s0[t % m]! : v - s0[t % m]!))\n const head = adjusted.slice(0, seasonal ? Math.min(n, Math.max(2 * m, 10)) : Math.min(n, 10))\n const line = linearFit(head)\n const trend = spec.trend === \"additive\"\n // l0・b0 は t = −1 の状態(最初の予測 l0 + b0 が直線の t = 0 の値になる)\n const l0Init = trend ? line.intercept - line.slope : head.slice(0, Math.min(head.length, 4)).reduce((a, v) => a + v, 0) / Math.min(head.length, 4)\n const b0Init = trend ? line.slope : 0\n const mean = y.reduce((a, v) => a + v, 0) / n\n const sd = Math.sqrt(y.reduce((a, v) => a + (v - mean) * (v - mean), 0) / n)\n const scale = Math.max(sd, Math.abs(mean) * 1e-3, 1e-9)\n\n // 探索の変数: [α のロジット, (β/α のロジット), (γ/(1−α) のロジット), l0 のずれ, (b0 のずれ)]\n const decode = (x: readonly number[]): Params => {\n let i = 0\n const alpha = EDGE + (1 - 2 * EDGE) * logistic(x[i++]!)\n const beta = trend ? alpha * (EDGE + (1 - 2 * EDGE) * logistic(x[i++]!)) : 0\n const gamma = seasonal ? (1 - alpha) * (EDGE + (1 - 2 * EDGE) * logistic(x[i++]!)) : 0\n const l0 = l0Init + x[i++]! * scale\n const b0 = trend ? b0Init + x[i++]! * scale * 0.1 : 0\n return { alpha, beta, gamma, l0, b0, s0 }\n }\n const objective = (x: number[]) => run(y, spec, decode(x))?.sse ?? Infinity\n const starts: [number, number, number][] = [\n [0.2, 0.1, 0.1],\n [0.5, 0.3, 0.3],\n [0.05, 0.5, 0.05],\n ]\n let best: { x: number[]; fx: number } | null = null\n for (const [a, b, g] of starts) {\n const x0 = [logit(a), ...(trend ? [logit(b)] : []), ...(seasonal ? [logit(g)] : []), 0, ...(trend ? [0] : [])]\n let found = nelderMead(objective, x0, 1, 300 * x0.length)\n // 1 回だけ最良点から単体を作り直す(早すぎる収束を避ける)\n found = nelderMead(objective, found.x, 0.25, 200 * x0.length)\n if (best === null || found.fx < best.fx) best = found\n }\n if (best === null || !Number.isFinite(best.fx)) return null\n const params = decode(best.x)\n const state = run(y, spec, params)\n if (!state) return null\n const k = 2 + (trend ? 2 : 0) + (seasonal ? 1 + (m - 1) : 0)\n const sse = Math.max(state.sse, 1e-12 * Math.max(1, mean * mean) * n)\n const aic = n * Math.log(sse / n) + 2 * k\n const aicc = n - k - 1 > 0 ? aic + (2 * k * (k + 1)) / (n - k - 1) : Infinity\n return { spec, params, state, k, aicc }\n}\n\n/** h 期先の予測誤差の分散の倍率(σ² に掛ける)。 */\nfunction varianceMultiplier(fit: Fit, h: number, seasonIndex: number): number {\n const { alpha: a, beta: b, gamma: g } = fit.params\n const { m } = fit.spec\n const trend = fit.spec.trend === \"additive\"\n const seasonal = fit.spec.season !== \"none\"\n const k = Math.floor((h - 1) / m)\n let extra = trend ? (h - 1) * (a * a + a * b * h + (b * b * h * (2 * h - 1)) / 6) : (h - 1) * a * a\n if (seasonal) extra += trend ? g * k * (2 * a + g + b * m * (k + 1)) : g * k * (2 * a + g)\n // 乗法の季節: 2 期先以降に伝わる誤差は季節指数の比で伸び縮みするので、その 2 乗を掛ける(近似)\n if (fit.spec.season === \"multiplicative\") extra *= seasonIndex * seasonIndex\n return 1 + extra\n}\n\n/**\n * 等間隔の 1 系列を指数平滑法で予測する。\n *\n * - 有限でない値(NaN・±∞)は、先頭は飛ばし、途中は前後から線形補間し、末尾は「まだ観測していない期」として予測する側に回す。\n * - 当てはめられる点が `FORECAST_MIN_POINTS`(5)未満なら `null`。季節ありは 2 季節分(`2 × seasonLength`)が要り、\n * 足りなければ季節なしに落とす。乗法の季節は全点が正のときだけ候補にする(指定されていても、正でない値があれば加法に落とす)。\n * - 長い系列は直近 `FORECAST_MAX_FIT_POINTS` 点だけで当てはめる。\n */\nexport function forecast(values: readonly number[], options: ForecastOptions = {}): ForecastResult | null {\n const finite = (v: number | null | undefined): v is number => typeof v === \"number\" && Number.isFinite(v)\n let first = 0\n while (first < values.length && !finite(values[first])) first++\n let last = values.length - 1\n while (last >= first && !finite(values[last])) last--\n if (last < first) return null\n const ignore = Math.max(0, Math.floor(options.ignoreLast ?? 0))\n const end = last + 1 - ignore\n let start = first\n if (end - start > FORECAST_MAX_FIT_POINTS) start = end - FORECAST_MAX_FIT_POINTS\n if (end - start < FORECAST_MIN_POINTS) return null\n\n // 途中の欠けは前後の観測から線形補間\n const y: number[] = []\n for (let t = start; t < end; t++) {\n const v = values[t]\n if (finite(v)) {\n y.push(v)\n continue\n }\n let lo = t - 1\n while (lo >= start && !finite(values[lo])) lo--\n let hi = t + 1\n while (hi < end && !finite(values[hi])) hi++\n const a = lo >= start ? values[lo]! : undefined\n const b = hi < end ? values[hi]! : undefined\n y.push(a !== undefined && b !== undefined ? a + ((b - a) * (t - lo)) / (hi - lo) : (a ?? b ?? 0))\n }\n const n = y.length\n\n const m = Math.max(1, Math.floor(options.seasonLength ?? 1))\n const seasonOption = options.season ?? \"auto\"\n const trendOption = options.trend ?? \"auto\"\n const canSeason = m > 1 && n >= 2 * m && seasonOption !== \"none\"\n const positive = y.every((v) => v > 0)\n const seasons: ForecastFittedComponent[] = !canSeason\n ? [\"none\"]\n : seasonOption === \"additive\"\n ? [\"additive\"]\n : seasonOption === \"multiplicative\"\n ? [positive ? \"multiplicative\" : \"additive\"]\n : positive\n ? [\"none\", \"additive\", \"multiplicative\"]\n : [\"none\", \"additive\"]\n const trends: (\"none\" | \"additive\")[] = trendOption === \"none\" ? [\"none\"] : trendOption === \"auto\" ? [\"none\", \"additive\"] : [\"additive\"]\n\n let chosen: Fit | null = null\n for (const trend of trends) {\n for (const season of seasons) {\n const fit = fitModel(y, { trend, season, m: season === \"none\" ? 1 : m })\n if (!fit) continue\n if (chosen === null || fit.aicc < chosen.aicc || (!Number.isFinite(chosen.aicc) && fit.k < chosen.k)) chosen = fit\n }\n }\n if (!chosen) return null\n\n const dof = n - (chosen.k - 1)\n const sigma = Math.sqrt(chosen.state.sse / (dof >= 1 ? dof : n))\n const confidence = options.confidence !== undefined && options.confidence > 0 && options.confidence < 1 ? options.confidence : 0.95\n const z = inverseNormal(1 - (1 - confidence) / 2)\n const horizon =\n options.horizon !== undefined && Number.isFinite(options.horizon)\n ? Math.max(0, Math.floor(options.horizon))\n : m > 1\n ? m\n : Math.min(12, Math.max(1, Math.round(n / 4)))\n const steps = values.length - end + horizon\n const { spec, state } = chosen\n const points: ForecastPoint[] = []\n for (let h = 1; h <= steps; h++) {\n const base = state.level + h * state.slope\n const s = spec.season === \"none\" ? undefined : state.season[(n - 1 + h) % spec.m]!\n const value = s === undefined ? base : spec.season === \"multiplicative\" ? base * s : base + s\n const half = z * sigma * Math.sqrt(varianceMultiplier(chosen, h, s ?? 1))\n points.push({ value, lower: value - half, upper: value + half })\n }\n const { alpha, beta, gamma } = chosen.params\n return {\n model: {\n trend: spec.trend,\n season: spec.season,\n alpha,\n ...(spec.trend === \"additive\" ? { beta } : {}),\n ...(spec.season !== \"none\" ? { gamma, seasonLength: spec.m } : {}),\n },\n fitted: n,\n end,\n sigma,\n points,\n }\n}\n","\"use client\"\n\n/**\n * ForecastChart — a time-series line chart that continues each series with an exponential-smoothing forecast (dashed line and shaded prediction interval) computed from `data` at render time; place it inside `DashboardCardPreset`, and use it to migrate a Tableau forecast sheet.\n *\n * Pass the rows, the date column (`x`), the value column (`y`) and optionally a column that splits the rows into\n * series (`series`, e.g. a segment). Rows that fall in the same period and series are summed. The forecast is\n * recomputed on every change of the inputs (never stored or fetched) with the model family in `forecast`\n * (trend / season, `\"auto\"` picks the lowest AICc), so it is an approximation: a fixed note under the plot always\n * says so (name the source tool with `forecastSource`; `forecastNote` only adds to it). A series with too few points draws its actuals only.\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface } from \"../lib/chart-theme\"\nimport {\n aggregateTopN,\n chartDataTable,\n chartRootProps,\n otherSeriesLabel,\n resolveAxisFormatter,\n resolveAxisTickFormatter,\n resolveValueFormatter,\n seriesColorsFor,\n toChartNumber,\n} from \"../lib/chart-utils\"\nimport {\n buildCartesianOption,\n FORECAST_BAND_ALPHA_DARK,\n FORECAST_BAND_ALPHA_LIGHT,\n FORECAST_LINE_DASH,\n forecastBoundaryText,\n forecastLabelAlign,\n isDarkSurface,\n mergeChartOptions,\n timeTooltipLabels,\n tooltipHtml,\n withAlpha,\n type TooltipRow,\n} from \"../lib/chart-options\"\nimport { forecast, type ForecastComponent, type ForecastOptions, type ForecastResult } from \"../lib/forecast\"\nimport { uiLanguage } from \"../lib/locale\"\nimport type { ChartColors, ChartCommonProps } from \"../lib/types\"\n\nexport type { ForecastComponent, ForecastOptions }\n\n/** 予測の 1 期の長さ。未来の日付を進める単位。 */\nexport type ForecastPeriod = \"day\" | \"week\" | \"month\" | \"quarter\" | \"year\"\n\nexport interface ForecastChartProps<T extends Record<string, unknown> = Record<string, unknown>>\n extends Omit<ChartCommonProps<T>, \"index\" | \"categories\" | \"colors\"> {\n /** 日付の列名。ISO の日付・年月(`\"2026-01\"`)・年・`Date` を受ける。 */\n x: keyof T & string\n /** 値の列名。number か数値文字列。 */\n y: keyof T & string\n /** 系列に分ける列名(セグメントなど)。省略時は 1 系列。6 つ以上は合計の大きい 5 つ +「その他」にまとめる。 */\n series?: keyof T & string\n /** 1 期の長さ。省略時は日付の間隔から推定する。同じ期に入る行は合計する。 */\n period?: ForecastPeriod\n /**\n * 予測の設定(トレンド・季節・季節の長さ・期数・信頼水準・末尾の除外期)。`seasonLength` を省略すると `period` から\n * 決める(月 12・四半期 4・週 52・日 7・年は季節なし)。例: `forecast={{ trend: \"additive\", season: \"additive\", horizon: 12 }}`\n */\n forecast?: ForecastOptions\n /** 凡例・ツールチップ・境目の縦線に出す予測の呼び名。既定は表示言語の「予測」/ \"Forecast\"。 */\n forecastLabel?: string\n /**\n * 予測の元になったツール(`\"Tableau\"` など)。プロットの下の注記に「〈ツール〉の予測値とは一致しない」と名前で出す。\n * 注記そのもの(近似であること)は部品が必ず出し、置き換えられない。\n */\n forecastSource?: string\n /** 注記のあとに足す補足(集計の範囲など)。近似の注記を置き換えるものではない。 */\n forecastNote?: string\n /** 系列色。配列は系列の順、record は系列名ごと。省略時はトークン順。 */\n colors?: ChartColors\n /** 凡例・ツールチップを出す。既定 `true`。 */\n showLegend?: boolean\n showTooltip?: boolean\n /** 値軸の目盛り線を出す。既定 `true`。 */\n showGridLines?: boolean\n showXAxis?: boolean\n showYAxis?: boolean\n /** y 軸ラベルの幅(px)。 */\n yAxisWidth?: number\n /** 値軸の下限・上限(データ・予測区間がはみ出すときは軸を広げる)。 */\n minValue?: number\n maxValue?: number\n /** 値軸を 0 からではなくデータに合わせる。既定 `false`。 */\n fitToData?: boolean\n xAxisLabel?: string\n yAxisLabel?: string\n}\n\nconst TEXT = {\n ja: {\n forecast: \"予測\",\n note: (source?: string) =>\n source ? `予測は指数平滑法による近似値です。${source} の予測値とは一致しません。` : \"予測は指数平滑法による近似値です。元のツールの予測値とは一致しません。\",\n interval: (pct: string, lo: string, hi: string) => `${pct} 予測区間 ${lo}〜${hi}`,\n chart: (names: readonly string[]) => `${names.join(\"・\")}の実績と予測の折れ線グラフ`,\n item: \"期間\",\n },\n en: {\n forecast: \"Forecast\",\n note: (source?: string) =>\n `Forecast is an approximation (exponential smoothing); values do not match ${source ? `${source}'s` : \"the source tool's\"} forecast.`,\n interval: (pct: string, lo: string, hi: string) => `${pct} interval ${lo} – ${hi}`,\n chart: (names: readonly string[]) => `Line chart of actuals and forecast for ${names.join(\", \")}`,\n item: \"Period\",\n },\n}\n\n/** 凡例の予測の印(線の模様と同じ破線)。 */\nconst LEGEND_DASHED_ICON = \"path://M0,0 L42,0 L42,24 L0,24 Z M58,0 L100,0 L100,24 L58,24 Z\"\n/** 境目のラベルのためにプロットの上に空ける高さ(px)。 */\nconst BOUNDARY_LABEL_ROOM = 18\n/** 描く期数の上限(日次で何十年分も来たときに、直近だけを描く)。 */\nconst MAX_PERIODS = 5000\nconst DAY_MS = 86_400_000\n\nconst NO_ROWS: never[] = []\n\n/* ------------------------------------------------------------ 日付と期 */\n\ninterface ParsedDate {\n y: number\n m: number\n d: number\n /** 値が持っていた細かさ。 */\n precision: \"year\" | \"month\" | \"day\"\n}\n\nconst DATE_RE = /^(\\d{4})(?:[-/](\\d{1,2})(?:[-/](\\d{1,2}))?)?(?:[T ].*)?$/\nconst QUARTER_RE = /^(\\d{4})[-\\s]?Q([1-4])$/i\n\nfunction parseDate(value: unknown): ParsedDate | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : { y: value.getFullYear(), m: value.getMonth() + 1, d: value.getDate(), precision: \"day\" }\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n if (Number.isInteger(value) && value >= 1000 && value <= 9999) return { y: value, m: 1, d: 1, precision: \"year\" }\n return parseDate(new Date(value))\n }\n if (typeof value !== \"string\") return null\n const text = value.trim()\n const q = QUARTER_RE.exec(text)\n if (q) return { y: Number(q[1]), m: (Number(q[2]) - 1) * 3 + 1, d: 1, precision: \"month\" }\n const m = DATE_RE.exec(text)\n if (m) {\n const month = m[2] === undefined ? 1 : Number(m[2])\n const day = m[3] === undefined ? 1 : Number(m[3])\n if (month < 1 || month > 12 || day < 1 || day > 31) return null\n return { y: Number(m[1]), m: month, d: day, precision: m[3] !== undefined ? \"day\" : m[2] !== undefined ? \"month\" : \"year\" }\n }\n if (text === \"\") return null\n const parsed = new Date(text)\n return Number.isNaN(parsed.getTime()) ? null : parseDate(parsed)\n}\n\nconst dayOrdinal = (p: ParsedDate) => Math.round(Date.UTC(p.y, p.m - 1, p.d) / DAY_MS)\n\n/** 期の通し番号(年・四半期・月は暦の通し番号、日・週は 1970-01-01 からの日数)。 */\nfunction ordinal(p: ParsedDate, period: ForecastPeriod): number {\n switch (period) {\n case \"year\":\n return p.y\n case \"quarter\":\n return p.y * 4 + Math.floor((p.m - 1) / 3)\n case \"month\":\n return p.y * 12 + (p.m - 1)\n default:\n return dayOrdinal(p)\n }\n}\n\nconst pad2 = (n: number) => String(n).padStart(2, \"0\")\n\n/** 期の通し番号を x 軸の値にする(年 `\"2026\"`、四半期・月 `\"2026-04\"`、日・週 `\"2026-04-06\"`)。 */\nfunction ordinalLabel(o: number, period: ForecastPeriod): string {\n if (period === \"year\") return String(o)\n if (period === \"quarter\") return `${Math.floor(o / 4)}-${pad2((o % 4) * 3 + 1)}`\n if (period === \"month\") return `${Math.floor(o / 12)}-${pad2((o % 12) + 1)}`\n const d = new Date(o * DAY_MS)\n return `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`\n}\n\n/** 期の長さを日付の間隔(中央値)から推定する。 */\nfunction inferPeriod(dates: readonly ParsedDate[]): ForecastPeriod {\n if (dates.every((d) => d.precision === \"year\")) return \"year\"\n const coarse = dates.every((d) => d.precision !== \"day\")\n const keys = [...new Set(dates.map((d) => (coarse ? ordinal(d, \"month\") : dayOrdinal(d))))].sort((a, b) => a - b)\n const gaps = keys.slice(1).map((k, i) => k - keys[i]!).sort((a, b) => a - b)\n const gap = gaps.length === 0 ? (coarse ? 1 : 1) : gaps[Math.floor(gaps.length / 2)]!\n if (coarse) return gap >= 12 ? \"year\" : gap >= 3 ? \"quarter\" : \"month\"\n return gap >= 360 ? \"year\" : gap >= 85 ? \"quarter\" : gap >= 28 ? \"month\" : gap >= 7 ? \"week\" : \"day\"\n}\n\nconst SEASON_LENGTH: Record<ForecastPeriod, number> = { day: 7, week: 52, month: 12, quarter: 4, year: 1 }\n\n/* ------------------------------------------------------------ 系列と予測 */\n\ninterface ForecastModelOutput {\n /** x 軸の値(実績の期 → 予測だけの期)。 */\n labels: string[]\n /** 実績の期の数(この先は予測だけ)。 */\n actualCount: number\n names: string[]\n otherName: string | null\n /** 系列ごとの実績(期の位置ごと。欠けは null)。 */\n actual: (number | null)[][]\n /** 系列ごとの予測(期の位置ごと。予測の無い位置は null)。 */\n predicted: ({ value: number; lower: number; upper: number } | null)[][]\n /** 系列ごとの、当てはめた最後の点の位置(予測なしは -1)。 */\n fittedEnd: number[]\n results: (ForecastResult | null)[]\n}\n\nfunction buildForecastModel(\n data: readonly Record<string, unknown>[],\n x: string | undefined,\n y: string | undefined,\n seriesKey: string | undefined,\n period: ForecastPeriod | undefined,\n options: ForecastOptions | undefined,\n singleName: string,\n otherLabel: string,\n): ForecastModelOutput | null {\n if (!x || !y || !Array.isArray(data)) return null\n const points: { date: ParsedDate; name: string; value: number }[] = []\n for (const row of data) {\n if (!row || typeof row !== \"object\") continue\n const date = parseDate(row[x])\n const value = toChartNumber(row[y])\n if (!date || value === null) continue\n const raw = seriesKey ? row[seriesKey] : singleName\n const name = raw === null || raw === undefined || raw === \"\" ? \"—\" : String(raw)\n points.push({ date, name, value })\n }\n if (points.length === 0) return null\n const grain = period ?? inferPeriod(points.map((p) => p.date))\n const step = grain === \"week\" ? 7 : 1\n const keyed = points.map((p) => ({ ...p, key: ordinal(p.date, grain) }))\n let min = Math.min(...keyed.map((p) => p.key))\n const max = Math.max(...keyed.map((p) => p.key))\n if ((max - min) / step + 1 > MAX_PERIODS) min = max - (MAX_PERIODS - 1) * step\n const count = Math.floor((max - min) / step) + 1\n const slot = (key: number) => Math.floor((key - min) / step)\n\n // 系列ごとに期へ合計する(登場順)\n const sums = new Map<string, (number | null)[]>()\n for (const p of keyed) {\n const at = slot(p.key)\n if (at < 0) continue\n let list = sums.get(p.name)\n if (!list) {\n list = Array<number | null>(count).fill(null)\n sums.set(p.name, list)\n }\n list[at] = (list[at] ?? 0) + p.value\n }\n const all = [...sums.keys()]\n const totals = all.map((name) => ({ name, value: sums.get(name)!.reduce<number>((a, v) => a + (v ?? 0), 0) }))\n const { top, rest, other } = aggregateTopN(totals, undefined, otherLabel)\n const names = top.map((t) => t.name)\n const actual = names.map((n) => sums.get(n)!)\n if (other) {\n const folded = Array<number | null>(count).fill(null)\n for (const r of rest) sums.get(r.name)!.forEach((v, i) => (v === null ? undefined : (folded[i] = (folded[i] ?? 0) + v)))\n names.push(other.name)\n actual.push(folded)\n }\n\n const resolved: ForecastOptions = { ...options, seasonLength: options?.seasonLength ?? SEASON_LENGTH[grain] }\n const results = actual.map((values) => {\n try {\n return forecast(values.map((v) => (v === null ? NaN : v)), resolved)\n } catch {\n return null\n }\n })\n const length = Math.max(count, ...results.map((r) => (r ? r.end + r.points.length : 0)))\n const labels = Array.from({ length }, (_, i) => ordinalLabel(min + i * step, grain))\n const predicted = results.map((r) => {\n const out: ({ value: number; lower: number; upper: number } | null)[] = Array(length).fill(null)\n r?.points.forEach((p, k) => (out[r.end + k] = p))\n return out\n })\n return {\n labels,\n actualCount: count,\n names,\n otherName: other ? other.name : null,\n actual: actual.map((list) => [...list, ...Array<null>(length - count).fill(null)]),\n predicted,\n fittedEnd: results.map((r) => (r ? r.end - 1 : -1)),\n results,\n }\n}\n\nconst FORECAST_ID = \"__forecast:\"\nconst BAND_BASE_ID = \"__forecast-band-base:\"\nconst BAND_RANGE_ID = \"__forecast-band-range:\"\n\ninterface AxisParam {\n seriesId?: string\n seriesName?: string\n dataIndex?: number\n}\n\nfunction ForecastChartImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n x,\n y,\n series: seriesKey,\n period,\n forecast,\n forecastLabel,\n forecastSource,\n forecastNote,\n colors,\n labels,\n valueFormatter,\n format,\n title,\n summary,\n actions,\n fileName,\n isLoading,\n emptyState,\n height,\n chartOptions,\n showLegend = true,\n showTooltip = true,\n showGridLines = true,\n showXAxis = true,\n showYAxis = true,\n yAxisWidth,\n minValue,\n maxValue,\n fitToData = false,\n xAxisLabel,\n yAxisLabel,\n ariaLabel,\n className,\n ...rest\n }: ForecastChartProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const { ref: frameRef, surface, width: plotWidth, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\n const fcLabel = forecastLabel ?? t.forecast\n const tooltipFormatter = useMemo(() => resolveValueFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n const axisFormatter = useMemo(() => resolveAxisFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n const axisTicks = useMemo(() => resolveAxisTickFormatter(valueFormatter, format, locale), [valueFormatter, format, locale])\n const singleName = labels?.[y] ?? y ?? \"\"\n // 入力が変わるたびに予測し直す(保存も取得もしない)\n const model = useMemo(\n () => buildForecastModel(data, x, y, seriesKey, period, forecast, singleName, otherSeriesLabel(locale)),\n // forecast はオブジェクトリテラルで渡されることが多いので中身で比べる\n [data, x, y, seriesKey, period, JSON.stringify(forecast ?? null), singleName, locale],\n )\n const palette = useMemo(\n () => (model ? resolveChartColors(seriesColorsFor(model.names, colors, CHART_OTHER_COLOR, model.otherName), tokens) : []),\n [model, colors, tokens],\n )\n\n const option = useMemo((): EChartsOption | null => {\n if (!model) return null\n const index = \"__period\"\n const rows = model.labels.map((label, i) => {\n const row: Record<string, unknown> = { [index]: label }\n model.names.forEach((name, c) => (row[name] = model.actual[c]![i]))\n return row\n })\n const base = buildCartesianOption({\n kind: \"line\",\n data: rows,\n index,\n categories: model.names,\n palette,\n valueFormatter: tooltipFormatter,\n axisFormatter,\n axisTicks,\n curveType: \"linear\",\n connectNulls: false,\n showLegend,\n showTooltip,\n showGridLines,\n showXAxis,\n showYAxis,\n startEndOnly: false,\n yAxisWidth,\n minValue,\n maxValue,\n fitToData,\n allowDecimals: true,\n xAxisLabel,\n yAxisLabel,\n showDots: false,\n active: null,\n highlight: \"none\",\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 locale,\n }) as Record<string, unknown>\n\n const bandAlpha = isDarkSurface(surface) ? FORECAST_BAND_ALPHA_DARK : FORECAST_BAND_ALPHA_LIGHT\n const helper = {\n type: \"line\" as const,\n symbol: \"none\",\n showSymbol: false,\n connectNulls: true,\n legendHoverLink: false,\n emphasis: { disabled: true },\n }\n const lines: Record<string, unknown>[] = []\n const bands: Record<string, unknown>[] = []\n model.names.forEach((name, c) => {\n const start = model.fittedEnd[c]!\n if (start < 0) return\n const color = palette[c] || undefined\n const predicted = model.predicted[c]!\n const startValue = model.actual[c]![start] ?? null\n const line = predicted.map((p, i) => (i === start ? startValue : (p?.value ?? null)))\n const lower = predicted.map((p, i) => (i === start ? startValue : p ? Math.min(p.lower, p.upper) : null))\n const range = predicted.map((p, i) => (i === start ? (startValue === null ? null : 0) : p ? Math.abs(p.upper - p.lower) : null))\n lines.push({\n ...helper,\n id: FORECAST_ID + name,\n name: fcLabel,\n z: 3,\n lineStyle: { width: 2, type: FORECAST_LINE_DASH, color, opacity: 0.7 },\n itemStyle: { color, opacity: 0.7 },\n data: line,\n })\n // 帯は下端(透明)の上に幅を積む。凡例の「予測」で線と一緒に消えるよう、名前は予測と同じにする\n bands.push(\n { ...helper, id: BAND_BASE_ID + name, name: fcLabel, silent: true, z: 1, stack: BAND_BASE_ID + name, tooltip: { show: false }, lineStyle: { opacity: 0 }, itemStyle: { color }, data: lower },\n {\n ...helper,\n id: BAND_RANGE_ID + name,\n name: fcLabel,\n silent: true,\n z: 1,\n stack: BAND_BASE_ID + name,\n tooltip: { show: false },\n lineStyle: { opacity: 0 },\n itemStyle: { color },\n areaStyle: color ? { color: withAlpha(color, bandAlpha), opacity: 1 } : { opacity: bandAlpha },\n data: range,\n },\n )\n })\n if (lines.length === 0) return mergeChartOptions(base as EChartsOption, chartOptions)\n\n // 境目の縦線: 予測が始まる点(系列のうち最も後ろ)\n const boundary = Math.max(...model.fittedEnd)\n const total = model.labels.length\n const span = plotWidth && total > 1 ? ((plotWidth - 64) / (total - 1)) * (total - 1 - boundary) : null\n const boundaryText = forecastBoundaryText(fcLabel)\n lines[0] = {\n ...lines[0],\n markLine: {\n silent: true,\n symbol: \"none\",\n animation: false,\n data: [\n {\n name: \"forecast-boundary\",\n xAxis: boundary,\n lineStyle: { type: \"dashed\", width: 1, color: tokens?.mutedForeground ?? undefined },\n label: {\n show: true,\n position: \"end\",\n rotate: 0,\n align: forecastLabelAlign(span, boundaryText),\n verticalAlign: \"bottom\",\n distance: 4,\n fontSize: 12,\n color: tokens?.mutedForeground ?? undefined,\n formatter: boundaryText,\n },\n },\n ],\n },\n }\n\n const legend = base.legend as { data?: unknown[] } | undefined\n const grid = base.grid as { top?: number } | undefined\n const times = timeTooltipLabels(model.labels, locale)\n const pct = `${Math.round((forecast?.confidence && forecast.confidence > 0 && forecast.confidence < 1 ? forecast.confidence : 0.95) * 100)}%`\n const option = {\n ...base,\n legend: legend ? { ...legend, data: [...(legend.data ?? []), { name: fcLabel, icon: LEGEND_DASHED_ICON }] } : legend,\n grid: grid ? { ...grid, top: (grid.top ?? 12) + BOUNDARY_LABEL_ROOM } : grid,\n tooltip: {\n ...(base.tooltip as Record<string, unknown>),\n formatter: (params: unknown) => {\n const list = (Array.isArray(params) ? params : [params]) as AxisParam[]\n const i = list[0]?.dataIndex ?? 0\n // 凡例で隠した系列はツールチップにも出さない(実績の系列 id は \"series:<名前>\")\n const shown = new Set(list.map((p) => p.seriesId ?? \"\"))\n const visible = (id: string) => list.length === 0 || shown.has(id)\n const rows: TooltipRow[] = []\n model.names.forEach((name, c) => {\n const color = palette[c] || \"currentColor\"\n const value = model.actual[c]![i] ?? null\n if (value !== null && visible(`series:${name}`)) rows.push({ name, color, value })\n const p = model.predicted[c]![i]\n if (p && visible(FORECAST_ID + name)) {\n rows.push({\n name: model.names.length > 1 ? `${name} · ${fcLabel}` : fcLabel,\n color,\n value: p.value,\n note: t.interval(pct, tooltipFormatter(Math.min(p.lower, p.upper)), tooltipFormatter(Math.max(p.lower, p.upper))),\n })\n }\n })\n return tooltipHtml(times?.[i] ?? model.labels[i] ?? \"\", rows, tooltipFormatter, [], locale)\n },\n },\n series: [...((base.series as unknown[]) ?? []), ...lines, ...bands],\n }\n return mergeChartOptions(option as EChartsOption, chartOptions)\n }, [\n model, palette, tooltipFormatter, axisFormatter, axisTicks, showLegend, showTooltip, showGridLines, showXAxis, showYAxis,\n yAxisWidth, minValue, maxValue, fitToData, xAxisLabel, yAxisLabel, actions, tokens, surface, plotWidth, height, locale,\n fcLabel, forecast?.confidence, t, chartOptions,\n ])\n\n // スクリーンリーダー向けの表: 期・系列ごとの実績・予測\n const dataTable = useMemo(() => {\n if (!model) return undefined\n const forecastColumns = model.names.map((name) => `${name} (${fcLabel})`)\n const rows = model.labels.map((label, i) => {\n const row: Record<string, unknown> = { period: label }\n model.names.forEach((name, c) => {\n row[name] = model.actual[c]![i]\n row[forecastColumns[c]!] = model.predicted[c]![i]?.value ?? null\n })\n return row\n })\n const columns = model.names.flatMap((name, c) => (model.fittedEnd[c]! >= 0 ? [name, forecastColumns[c]!] : [name]))\n const table = chartDataTable(rows, \"period\", columns, tooltipFormatter, undefined, t.item)\n const times = timeTooltipLabels(model.labels, locale)\n return times ? { ...table, rows: table.rows.map((row, i) => [times[i] ?? row[0] ?? \"\", ...row.slice(1)]) } : table\n }, [model, fcLabel, tooltipFormatter, t, locale])\n\n const label = ariaLabel ?? t.chart(model?.names ?? [singleName])\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={summary}\n isLoading={isLoading ?? false}\n isEmpty={!model || !option}\n emptyState={emptyState}\n height={height}\n variant=\"line\"\n ariaLabel={label}\n className={className}\n dataTable={dataTable}\n footnote={[t.note(forecastSource), forecastNote].filter(Boolean).join(\" \")}\n >\n {option && (\n <EChart option={option} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary }} />\n )}\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so `x` / `y` / `series` are checked against `data`. */\nexport const ForecastChart = forwardRef(ForecastChartImpl as (props: ForecastChartProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: ForecastChartProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nForecastChart.displayName = \"ForecastChart\"\n","/**\n * The single-hue ramp the canvas charts shade by (FilledMap, SymbolMap, Treemap): the tone mixed into the surface\n * it sits on, from 20% (the lowest value) to 100% (the highest). The same ramp as Heatmap's, computed per value so\n * no visual map is needed. Pure and DOM-free; canvas-safe colours in, `rgb()` out (internal chart helper).\n */\n\n/** The lightest end of the ramp is this share of the tone mixed into the surface; the darkest end is the tone itself. */\nexport const RAMP_FLOOR_SHARE = 0.2\n/** At or above this share of the ramp a mark is dark: text on it takes the surface colour, below it the foreground. */\nexport const RAMP_LIGHT_TEXT_FROM = 0.55\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/** A canvas-safe colour at `alpha`; anything unreadable comes back unchanged. */\nfunction withAlpha(color: string, alpha: number): string {\n const c = parseRgb(color)\n return c ? `rgba(${c[0]}, ${c[1]}, ${c[2]}, ${alpha})` : color\n}\n\n/**\n * `share` (0–1) of `color` mixed into `surface` — the canvas form of `color-mix(in oklch, <color> N%, <surface>)`.\n * An unreadable 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\n/** Where a value sits on a `[min, max]` ramp (0–1, clamped). A flat range reads as the top. */\nexport function rampRatio(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/** The ramp colour at `ratio` (0 = the floor, 20% of the tone; 1 = the tone itself). */\nexport function rampColor(color: string, surface: string | undefined, ratio: number): string {\n return mixIntoSurface(color, surface, RAMP_FLOOR_SHARE + (1 - RAMP_FLOOR_SHARE) * Math.min(1, Math.max(0, ratio)))\n}\n\n/** The CSS gradient of the ramp for an HTML legend (`tone` is a token name such as `\"chart-1\"`). */\nexport function rampGradientCss(tone: string): string {\n return `linear-gradient(to right, color-mix(in oklch, var(--${tone}) ${RAMP_FLOOR_SHARE * 100}%, var(--card)), var(--${tone}))`\n}\n","/**\n * The map boundaries behind FilledMap and SymbolMap (internal chart helper): their types, the matching of a data\n * value (a name or a code, in Japanese or English) to a region, picking the map that fits the data, and loading a\n * map on demand. The boundaries (Natural Earth, public domain; `geo-japan.ts` / `geo-us.ts` / `geo-world.ts`,\n * written by `scripts/gen-geo.mjs`) are ~430 KB together, so they are only imported when a map renders.\n */\nimport { useEffect, useMemo, useState } from \"react\"\nimport { registerMap } from \"echarts/core\"\n\n/** The maps the parts draw. */\nexport type GeoMapName = \"japan\" | \"us\" | \"world\"\n\nexport interface GeoFeatureProperties {\n /** ISO 3166: `JP-13`, `US-CA`, or alpha-3 for countries (`JPN`). */\n code: string\n /** English name (`Tokyo`, `Kyōto Prefecture`, `California`). */\n name: string\n /** Japanese name (`東京都`, `カリフォルニア州`). */\n name_ja: string\n /** Countries only: ISO 3166-1 alpha-2 (`JP`), where one exists. */\n alpha2?: string\n}\n\nexport type GeoGeometry =\n | { type: \"Polygon\"; coordinates: number[][][] }\n | { type: \"MultiPolygon\"; coordinates: number[][][][] }\n\nexport interface GeoFeature {\n type: \"Feature\"\n properties: GeoFeatureProperties\n geometry: GeoGeometry\n}\n\n/** A GeoJSON FeatureCollection whose features carry `code` / `name` / `name_ja`. */\nexport interface GeoCollection {\n type: \"FeatureCollection\"\n features: GeoFeature[]\n}\n\n/** Every map, in the order a tie in `detectGeoMap` is broken (the most specific first). */\nexport const GEO_MAPS: readonly GeoMapName[] = [\"japan\", \"us\", \"world\"]\n\n/** The name the map is registered under in ECharts (`registerMap`). Its regions are keyed by `code`. */\nexport const geoMapKey = (name: GeoMapName) => `squadkit-${name}`\n\n/** Default width / height ratio correction of the plate carrée maps, so mid-latitudes don't look stretched. */\nexport const GEO_ASPECT_SCALE: Record<GeoMapName, number> = { japan: 0.8, us: 0.8, world: 0.75 }\n\n/* ---------------------------------------------------------------- matching */\n\n/** Case-, width- and accent-insensitive form of a name or code, without spaces and punctuation. */\nfunction fold(text: string): string {\n return text\n .normalize(\"NFKC\")\n .normalize(\"NFD\")\n .replace(/[̀-ͯ]/g, \"\")\n .normalize(\"NFC\")\n .toLowerCase()\n .trim()\n}\n\nconst SEPARATORS = /[\\s.,'’`\"()_\\-‐・・]/g\nconst squash = (text: string) => text.replace(SEPARATORS, \"\")\n\n/** The keys a data value is looked up by: as written, and without a region suffix (都・府・県・州, \"Prefecture\", \"-ken\"…). */\nexport function regionKeys(raw: unknown): string[] {\n if (raw === null || raw === undefined) return []\n const text = fold(String(raw))\n if (!text) return []\n const keys = [squash(text)]\n const stripped = text\n .replace(/[\\s-]+(prefecture|pref|ken|fu|to|state)$/, \"\")\n .replace(/^(state of|the)\\s+/, \"\")\n .replace(/(?<=..)(都|府|県|州)$/, \"\")\n if (stripped !== text) keys.push(squash(stripped))\n // A bare number is a JIS prefecture code (1–47; \"13\", \"01\").\n if (/^\\d{1,2}$/.test(text)) keys.push(`jp${text.padStart(2, \"0\")}`)\n return [...new Set(keys.filter(Boolean))]\n}\n\n/** Extra names some data uses for a region. */\nconst ALIASES: Record<string, string[]> = {\n \"US-DC\": [\"District of Columbia\", \"Washington DC\", \"Washington, D.C.\", \"ワシントンDC\", \"コロンビア特別区\"],\n USA: [\"United States\", \"US\", \"USA\", \"America\", \"米国\", \"アメリカ\"],\n GBR: [\"UK\", \"Great Britain\", \"Britain\", \"英国\"],\n KOR: [\"Korea\", \"Republic of Korea\", \"Korea, Republic of\", \"韓国\"],\n PRK: [\"DPRK\", \"北朝鮮\"],\n CHN: [\"China\", \"中国\"],\n TWN: [\"TW\", \"台湾\"],\n RUS: [\"Russian Federation\"],\n CZE: [\"Czechia\"],\n VNM: [\"Viet Nam\"],\n CIV: [\"Côte d'Ivoire\"],\n SWZ: [\"Swaziland\"],\n MKD: [\"Macedonia\"],\n COD: [\"DR Congo\", \"Congo-Kinshasa\"],\n COG: [\"Congo\", \"Congo-Brazzaville\"],\n}\n\n/** Names that would collide with another region's: Natural Earth calls DC \"Washington\", which is the state. */\nconst SKIP_NAME = new Set([\"US-DC\"])\n\n/** Region lookup of one map: every key a feature answers to → its code. The first feature to claim a key keeps it. */\nexport interface GeoIndex {\n map: GeoMapName\n byKey: Map<string, string>\n byCode: Map<string, GeoFeatureProperties>\n}\n\nconst indexCache = new WeakMap<GeoCollection, GeoIndex>()\n\nexport function buildGeoIndex(map: GeoMapName, collection: GeoCollection): GeoIndex {\n const cached = indexCache.get(collection)\n if (cached) return cached\n const byKey = new Map<string, string>()\n const byCode = new Map<string, GeoFeatureProperties>()\n const add = (key: unknown, code: string) => {\n for (const k of regionKeys(key)) if (!byKey.has(k)) byKey.set(k, code)\n }\n // Codes first, so a name never shadows a code (US \"IN\" is Indiana, not a name).\n for (const { properties: p } of collection.features) {\n byCode.set(p.code, p)\n add(p.code, p.code)\n const short = p.code.split(\"-\")[1]\n if (short) add(short, p.code)\n if (p.alpha2) add(p.alpha2, p.code)\n if (map === \"japan\" && short) add(String(Number(short)), p.code)\n }\n for (const { properties: p } of collection.features) {\n if (!SKIP_NAME.has(p.code)) add(p.name, p.code)\n add(p.name_ja, p.code)\n for (const alias of ALIASES[p.code] ?? []) add(alias, p.code)\n }\n const index = { map, byKey, byCode }\n indexCache.set(collection, index)\n return index\n}\n\n/** The region code a data value names in this map, or `null`. */\nexport function matchRegion(index: GeoIndex, raw: unknown): string | null {\n for (const key of regionKeys(raw)) {\n const code = index.byKey.get(key)\n if (code) return code\n }\n return null\n}\n\n/** The display name of a region in the page's language. */\nexport function regionName(properties: GeoFeatureProperties, language: \"ja\" | \"en\"): string {\n return language === \"ja\" && properties.name_ja ? properties.name_ja : properties.name.replace(/ Prefecture$/, \"\")\n}\n\n/**\n * The map whose regions the most distinct values name (`\"auto\"`). Ties go to the more specific map\n * (Japan, then the US, then the world). `null` when no value matches any loaded map.\n */\nexport function detectGeoMap(values: readonly unknown[], loaded: Partial<Record<GeoMapName, GeoCollection>>): GeoMapName | null {\n const distinct = [...new Set(values.filter((v) => v !== null && v !== undefined && String(v).trim() !== \"\").map(String))]\n let best: GeoMapName | null = null\n let bestCount = 0\n for (const map of GEO_MAPS) {\n const collection = loaded[map]\n if (!collection) continue\n const index = buildGeoIndex(map, collection)\n const count = distinct.filter((v) => matchRegion(index, v) !== null).length\n if (count > bestCount) [best, bestCount] = [map, count]\n }\n return best\n}\n\n/* -------------------------------------------------------------- positions */\n\n/** Rough lon/lat boxes for picking a basemap from points: [west, south, east, north]. */\nconst BOUNDS: Record<Exclude<GeoMapName, \"world\">, [number, number, number, number]> = {\n japan: [122, 20, 154, 46.5],\n us: [-180, 18, -65, 72],\n}\n\n/** The basemap that holds every point (`\"auto\"` in SymbolMap): Japan, else the US, else the world. */\nexport function detectBasemap(points: readonly (readonly [number, number])[]): GeoMapName {\n if (points.length === 0) return \"world\"\n for (const map of [\"japan\", \"us\"] as const) {\n const [w, s, e, n] = BOUNDS[map]\n if (points.every(([lon, lat]) => lon >= w && lon <= e && lat >= s && lat <= n)) return map\n }\n return \"world\"\n}\n\n/**\n * The US map draws Alaska (scaled down) and Hawaii as insets below the lower 48, like an Albers USA map.\n * A point in either state moves with it; every other point is unchanged.\n */\nconst US_INSETS: { box: [number, number, number, number]; center: [number, number]; to: [number, number]; scale: number }[] = [\n // Alaska (the Aleutians stop short of the antimeridian in this data).\n { box: [-180, 51, -129.5, 72], center: [-149, 63], to: [-117, 25.5], scale: 0.35 },\n // Hawaii.\n { box: [-161, 18.5, -154.5, 22.5], center: [-157.5, 20.5], to: [-106, 25.5], scale: 1 },\n]\n\nexport function insetUsPoint(lon: number, lat: number): [number, number] {\n for (const inset of US_INSETS) {\n const [w, s, e, n] = inset.box\n if (lon >= w && lon <= e && lat >= s && lat <= n) {\n return [inset.to[0] + (lon - inset.center[0]) * inset.scale, inset.to[1] + (lat - inset.center[1]) * inset.scale]\n }\n }\n return [lon, lat]\n}\n\nfunction insetUs(collection: GeoCollection): GeoCollection {\n const moveRing = (ring: number[][]) => ring.map(([lon, lat]) => insetUsPoint(lon!, lat!))\n return {\n type: \"FeatureCollection\",\n features: collection.features.map((f) => {\n if (f.properties.code !== \"US-AK\" && f.properties.code !== \"US-HI\") return f\n const g = f.geometry\n const geometry: GeoGeometry =\n g.type === \"Polygon\"\n ? { type: \"Polygon\", coordinates: g.coordinates.map(moveRing) }\n : { type: \"MultiPolygon\", coordinates: g.coordinates.map((poly) => poly.map(moveRing)) }\n return { ...f, geometry }\n }),\n }\n}\n\n/* ----------------------------------------------------------------- loading */\n\nconst loading = new Map<GeoMapName, Promise<GeoCollection>>()\nconst loaded = new Map<GeoMapName, GeoCollection>()\n\n/** A map already loaded (and registered with ECharts), or `undefined`. */\nexport function loadedGeoMap(name: GeoMapName): GeoCollection | undefined {\n return loaded.get(name)\n}\n\n/**\n * Load a map's boundaries (once) and register them with ECharts as `geoMapKey(name)`, regions keyed by `code`.\n * The boundary modules are dynamic imports, so a bundler splits them out of the page until a map renders.\n */\nexport function loadGeoMap(name: GeoMapName): Promise<GeoCollection> {\n const pending = loading.get(name)\n if (pending) return pending\n const promise = (\n name === \"japan\"\n ? import(\"./geo-japan\").then((m) => m.JAPAN_PREFECTURES)\n : name === \"us\"\n ? import(\"./geo-us\").then((m) => insetUs(m.US_STATES))\n : import(\"./geo-world\").then((m) => m.WORLD_COUNTRIES)\n ).then((collection) => {\n registerMap(geoMapKey(name), collection as unknown as Parameters<typeof registerMap>[1])\n loaded.set(name, collection)\n return collection\n })\n promise.catch(() => loading.delete(name))\n loading.set(name, promise)\n return promise\n}\n\n/**\n * Load the map for `values` (`\"auto\"`: the one whose regions they name most). Japan and the US are tried first;\n * the world map is loaded only when neither covers at least half of the distinct values.\n */\nexport async function loadGeoMapFor(values: readonly unknown[], map: GeoMapName | \"auto\"): Promise<{ name: GeoMapName; collection: GeoCollection }> {\n if (map !== \"auto\") return { name: map, collection: await loadGeoMap(map) }\n const distinct = [...new Set(values.filter((v) => v !== null && v !== undefined).map(String))]\n const [japan, us] = await Promise.all([loadGeoMap(\"japan\"), loadGeoMap(\"us\")])\n const local: Record<\"japan\" | \"us\", GeoCollection> = { japan, us }\n const pick = detectGeoMap(distinct, local) as \"japan\" | \"us\" | null\n if (pick) {\n const index = buildGeoIndex(pick, local[pick])\n const matched = distinct.filter((v) => matchRegion(index, v) !== null).length\n if (matched * 2 >= distinct.length) return { name: pick, collection: local[pick] }\n }\n const world = await loadGeoMap(\"world\")\n const name = detectGeoMap(distinct, { ...local, world }) ?? \"world\"\n return { name, collection: name === \"world\" ? world : local[name] }\n}\n\n/** The loaded map for the values, or `null` until it has loaded (or when it fails to). Re-resolves when the values change. */\nexport function useGeoMap(values: readonly unknown[], map: GeoMapName | \"auto\"): { name: GeoMapName; collection: GeoCollection } | null {\n const key = useMemo(() => [...new Set(values.map((v) => (v === null || v === undefined ? \"\" : String(v))))].join(\"\\u0000\"), [values])\n const [state, setState] = useState<{ key: string; result: { name: GeoMapName; collection: GeoCollection } } | null>(null)\n const wanted = `${map}\\u0001${key}`\n useEffect(() => {\n let alive = true\n loadGeoMapFor(key ? key.split(\"\\u0000\") : [], map).then(\n (result) => alive && setState({ key: wanted, result }),\n () => {},\n )\n return () => {\n alive = false\n }\n }, [wanted])\n if (state?.key === wanted) return state.result\n // Already loaded for a fixed map: no need to wait a render.\n const ready = map !== \"auto\" ? loadedGeoMap(map) : undefined\n return ready && map !== \"auto\" ? { name: map, collection: ready } : null\n}\n","\"use client\"\n\n/**\n * FilledMap — a choropleth: each region (Japanese prefecture, US state or country) shaded by a number. Pass rows,\n * the column naming the region and the number to shade by instead of an ECharts option.\n *\n * Regions are matched by name or code, in Japanese or English: 「東京都」「東京」「Tokyo」「JP-13」「13」,\n * 「California」「CA」「US-CA」, 「Japan」「JPN」「JP」 (case, width and accents don't matter: \"Ōita\" = \"Oita\").\n * `map=\"auto\"` (default) picks the map whose regions the most rows name. A row that names no region is not drawn;\n * it is listed in the screen-reader table instead.\n *\n * Shading is a single-colour ramp of one theme colour (`tone`, `--chart-1` by default) like Heatmap: the lowest\n * value is the tone mixed 20% into the surface, the highest the tone itself, never a rainbow. A region with no row\n * (or a null value) is grey. `selected` dims the other regions; clicking a region calls `onSelect` (a filter action).\n * The boundaries (Natural Earth, public domain) load on demand, so the part shows its skeleton for a moment the first time.\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\nimport { use } from \"echarts/core\"\nimport { MapChart } from \"echarts/charts\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { useLocale } from \"../hooks/use-locale\"\nimport { resolveChartColors, useChartSurface, type ChartTokens } from \"../lib/chart-theme\"\nimport { chartRootProps, resolveValueFormatter, toChartNumber, type ChartDataTable } from \"../lib/chart-utils\"\nimport { mixIntoSurface, rampColor, rampGradientCss, rampRatio } from \"../lib/color-ramp\"\nimport { EMPTY_VALUE, type ValueFormat } from \"../lib/format\"\nimport {\n buildGeoIndex,\n GEO_ASPECT_SCALE,\n geoMapKey,\n matchRegion,\n regionName,\n useGeoMap,\n type GeoCollection,\n type GeoMapName,\n} from \"../lib/geo\"\nimport { resolveLocale, uiLanguage } from \"../lib/locale\"\nimport type { ChartActionsOptions, ChartEmptyState, ChartRootAttributes, ChartSeriesColor, ValueFormatter } from \"../lib/types\"\n\n// The map series is this part's own.\nuse([MapChart])\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 type FilledMapName = GeoMapName | \"auto\"\n\nexport interface FilledMapProps<T extends Record<string, unknown> = Record<string, unknown>> extends ChartRootAttributes {\n /** 行の配列。1 行 = 1 地域。同じ地域が複数あれば後の行が勝つ。値は number か数値文字列。 */\n data: T[]\n /** 地域を表す列名。都道府県名(「東京都」「東京」「Tokyo」)・州名・国名か、コード(`JP-13`・`13`・`CA`・`US-CA`・`JPN`・`JP`)。 */\n region: keyof T & string\n /** 塗りの濃さを決める数値の列名。null・欠損の地域は灰色(0 とは別)。 */\n value: NumericColumn<T>\n /** 描く地図。`\"japan\"`(都道府県)・`\"us\"`(州)・`\"world\"`(国)。既定 `\"auto\"`(地域の列の値が最も多く当たる地図)。 */\n map?: FilledMapName\n /** 列名・地域の値 → 表示名(ツールチップ・データ表)。例 `{ sales: \"売上\" }`。 */\n labels?: Record<string, string>\n /** 数値の書式(`\"number\"` / `\"currency\"` / `\"percent\"` / `{ type: \"number\", unit: \"件\" }` など)。既定 `\"number\"`。 */\n format?: ValueFormat\n /** 書式を関数で直接渡す逃げ道。`format` より優先する。 */\n valueFormatter?: ValueFormatter\n /** 濃淡の色。`\"chart-1\"`〜`\"chart-5\"` か意味色。薄い → 濃いの単色(レインボーにしない)。既定 `\"chart-1\"`。 */\n tone?: ChartSeriesColor\n /** 濃さの固定スケール。省略時はデータの最小〜最大。範囲外の値は端に丸める。 */\n scale?: { min?: number; max?: number }\n /** 凡例(薄い → 濃いの帯と両端の値)を出す。既定 `true`。 */\n showLegend?: boolean\n /** ホバーでツールチップを出す。既定 `true`。 */\n showTooltip?: boolean\n /** ツールチップとデータ表に添える列(同じ行の別の値)。数値は `format`、それ以外は文字のまま。 */\n details?: (keyof T & string)[]\n /** 選択中の地域(`region` 列の値。名前・コードのどの書き方でもよい)。渡すと、それ以外の地域を薄くする。 */\n selected?: string[]\n /** 地域のクリック。`region` 列の値と、その行を受け取る(フィルターの操作に使う)。データの無い地域では呼ばない。 */\n onSelect?: (region: string, row: T) => void\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 保存/コピーのボタンを出す。 */\n actions?: boolean | ChartActionsOptions\n /** PNG 保存時のファイル名(拡張子つき)。 */\n fileName?: string\n className?: string\n /** スクリーンリーダー向けのラベル。省略時は `<valueの列>の地図`。 */\n ariaLabel?: string\n}\n\n/* ------------------------------------------------------------------ model */\n\nexport interface FilledMapRegion {\n code: string\n /** The row's region value as written (what `onSelect` receives), or `null` without a row. */\n key: string | null\n /** Display name: `labels[key]` when given, else the map's name in the page's language (「東京都」 for \"13\"). */\n name: string\n value: number | null\n row: Record<string, unknown> | null\n}\n\nexport interface FilledMapModel {\n map: GeoMapName\n /** One per region of the map, in the map's order. */\n regions: FilledMapRegion[]\n /** Rows whose region names nothing on the map. */\n unmatched: Record<string, unknown>[]\n /** Codes of the regions `selected` names; `null` when nothing is selected. */\n selectedCodes: Set<string> | null\n min: number\n max: number\n}\n\n/** Rows → one entry per region of the map (with `null` where no row names it), the rows left over, and the range. */\nexport function buildFilledMapModel(config: {\n data: readonly Record<string, unknown>[]\n region: string\n value: string\n map: GeoMapName\n collection: GeoCollection\n scale?: { min?: number; max?: number }\n labels?: Record<string, string>\n /** Regions to keep at full strength (any form a region value can take); the rest are dimmed. */\n selected?: readonly unknown[]\n locale?: string\n}): FilledMapModel {\n const { data, region, value, map, collection } = config\n const language = uiLanguage(resolveLocale(config.locale))\n const index = buildGeoIndex(map, collection)\n const byCode = new Map<string, Record<string, unknown>>()\n const unmatched: Record<string, unknown>[] = []\n for (const row of data) {\n if (!row || typeof row !== \"object\") continue\n const code = matchRegion(index, row[region])\n if (code) byCode.set(code, row)\n else unmatched.push(row)\n }\n let lo = Infinity\n let hi = -Infinity\n const regions = collection.features.map(({ properties }) => {\n const row = byCode.get(properties.code) ?? null\n const n = row ? toChartNumber(row[value]) : null\n if (n !== null) [lo, hi] = [Math.min(lo, n), Math.max(hi, n)]\n const key = row ? String(row[region]) : null\n return { code: properties.code, key, name: (key !== null ? config.labels?.[key] : undefined) ?? regionName(properties, language), value: n, row }\n })\n const min = config.scale?.min ?? (Number.isFinite(lo) ? lo : 0)\n let max = config.scale?.max ?? (Number.isFinite(hi) ? hi : 1)\n if (max <= min) max = min + 1\n const selectedCodes =\n config.selected && config.selected.length > 0\n ? new Set(config.selected.map((v) => matchRegion(index, v)).filter((c): c is string => c !== null))\n : null\n return { map, regions, unmatched, selectedCodes, min, max }\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[c]!)\n}\n\nconst TEXT = {\n ja: {\n join: \"・\",\n region: \"地域\",\n notOnMap: \"(地図に無い)\",\n top: (name: string, value: string) => `最大は ${name} の ${value}`,\n chart: (value: string) => `${value}の地図`,\n },\n en: {\n join: \", \",\n region: \"Region\",\n notOnMap: \" (not on the map)\",\n top: (name: string, value: string) => `Highest: ${name} (${value})`,\n chart: (value: string) => `Map of ${value}`,\n },\n}\n\nconst textOf = (locale?: string) => TEXT[uiLanguage(resolveLocale(locale))]\n\n/** A detail cell: numbers through the formatter, anything else as text. */\nfunction detailText(raw: unknown, formatter: ValueFormatter): string {\n if (raw === null || raw === undefined || raw === \"\") return EMPTY_VALUE\n const n = typeof raw === \"string\" ? null : toChartNumber(raw)\n return n === null ? String(raw) : formatter(n)\n}\n\nexport interface FilledMapOptionConfig {\n model: FilledMapModel\n value: string\n /** Resolved (canvas-safe) tone colour. */\n color: string\n /** The colour the map sits on (a card): the ramp mixes into it, and regions are outlined in it. */\n surfaceColor?: string\n /** Fill of a region without a value. */\n emptyColor: string\n /** Outline of the hovered region. */\n hoverColor: string\n labels?: Record<string, string>\n valueFormatter: ValueFormatter\n details?: readonly string[]\n showTooltip: boolean\n chartOptions?: EChartsOption\n locale?: string\n}\n\n/** The ECharts option: one map series, each region's fill computed on the ramp (no visual map). */\nexport function buildFilledMapOption(config: FilledMapOptionConfig): EChartsOption {\n const { model, labels, valueFormatter } = config\n const t = textOf(config.locale)\n const label = (key: string) => labels?.[key] ?? key\n const base = config.color || \"#6366f1\"\n const border = config.surfaceColor ?? \"#ffffff\"\n const dimmed = (r: FilledMapRegion) => model.selectedCodes !== null && !model.selectedCodes.has(r.code)\n\n const tooltip = (r: FilledMapRegion): string => {\n const head = `${escapeHtml(r.name)} ${r.value === null ? EMPTY_VALUE : escapeHtml(valueFormatter(r.value))}`\n const extras = (config.details ?? [])\n .map((key) => `${escapeHtml(label(key))} ${escapeHtml(detailText(r.row?.[key], valueFormatter))}`)\n .join(t.join)\n return extras ? `${head}${t.join}${extras}` : head\n }\n\n const option: EChartsOption = {\n animation: false,\n tooltip: config.showTooltip\n ? { trigger: \"item\", formatter: (p: unknown) => tooltip((p as { data: { region: FilledMapRegion } }).data.region) }\n : { show: false },\n series: [\n {\n id: \"regions\",\n type: \"map\",\n map: geoMapKey(model.map),\n nameProperty: \"code\",\n aspectScale: GEO_ASPECT_SCALE[model.map],\n roam: false,\n selectedMode: false,\n left: 8,\n right: 8,\n top: 8,\n bottom: 8,\n label: { show: false },\n itemStyle: { areaColor: config.emptyColor, borderColor: border, borderWidth: 0.6 },\n emphasis: { label: { show: false }, itemStyle: { borderColor: config.hoverColor, borderWidth: 1.2 } },\n data: model.regions.map((r) => {\n const fill = r.value === null ? config.emptyColor : rampColor(base, config.surfaceColor, rampRatio(r.value, model.min, model.max))\n const areaColor = dimmed(r) ? mixIntoSurface(fill, config.surfaceColor, 0.3) : fill\n return {\n name: r.code,\n value: r.value ?? undefined,\n region: r,\n itemStyle: { areaColor },\n emphasis: { itemStyle: { areaColor } },\n }\n }),\n } as never,\n ],\n }\n return config.chartOptions\n ? (mergeDeep(option as Record<string, unknown>, config.chartOptions as Record<string, unknown>) as EChartsOption)\n : 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: the regions with a row, then the rows that name no region on the map. */\nexport function filledMapDataTable(\n model: FilledMapModel,\n names: { region: string; value: string },\n formatter: ValueFormatter,\n details: readonly string[] = [],\n labels?: Record<string, string>,\n locale?: string,\n): ChartDataTable {\n const t = textOf(locale)\n const label = (key: string) => labels?.[key] ?? key\n const cells = (row: Record<string, unknown> | null, value: number | null) => [\n value === null ? EMPTY_VALUE : formatter(value),\n ...details.map((key) => detailText(row?.[key], formatter)),\n ]\n const rows = [\n ...model.regions.filter((r) => r.row !== null).map((r) => [r.name, ...cells(r.row, r.value)]),\n ...model.unmatched.map((row) => [`${label(String(row[names.region] ?? EMPTY_VALUE))}${t.notOnMap}`, ...cells(row, toChartNumber(row[names.value]))]),\n ]\n return { columns: [labels?.[names.region] ?? t.region, label(names.value), ...details.map(label)], rows }\n}\n\n/** `summary=\"auto\"`: the region with the highest value. `undefined` with none. */\nexport function buildFilledMapSummary(model: FilledMapModel, formatter: ValueFormatter, title?: string, locale?: string): string | undefined {\n let best: FilledMapRegion | undefined\n for (const r of model.regions) if (r.value !== null && (!best || r.value > (best.value as number))) best = r\n if (!best) return undefined\n return `${title ? `${title}: ` : \"\"}${textOf(locale).top(best.name, formatter(best.value as number))}`\n}\n\n/* -------------------------------------------------------------- component */\n\nfunction colorsFor(tokens: ChartTokens | null, tone: string) {\n const [color = \"\", empty = \"\", hover = \"\"] = resolveChartColors([tone, \"var(--muted)\", \"var(--foreground)\"], tokens)\n return { color, empty, hover }\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 FilledMapImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n region,\n value,\n map = \"auto\",\n labels,\n format,\n valueFormatter,\n tone = \"chart-1\",\n scale,\n showLegend = true,\n showTooltip = true,\n details,\n selected,\n onSelect,\n title,\n summary,\n isLoading,\n emptyState,\n height,\n chartOptions,\n actions,\n fileName,\n className,\n ariaLabel,\n ...rest\n }: FilledMapProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const rows = Array.isArray(data) ? data : NO_ROWS\n const { ref: frameRef, surface, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const formatter = useMemo(() => resolveValueFormatter(valueFormatter, format ?? \"number\", locale), [valueFormatter, format, locale])\n const regionValues = useMemo(() => rows.map((row) => (row && typeof row === \"object\" ? row[region] : undefined)), [rows, region])\n const geo = useGeoMap(regionValues, map)\n const model = useMemo(\n () => (geo ? buildFilledMapModel({ data: rows, region, value, map: geo.name, collection: geo.collection, scale, labels, selected, locale }) : null),\n [geo, rows, region, value, scale?.min, scale?.max, labels, selected, locale],\n )\n const colors = useMemo(() => colorsFor(tokens, tone), [tokens, tone])\n const option = useMemo(\n () =>\n model\n ? buildFilledMapOption({\n model,\n value,\n color: colors.color,\n surfaceColor: surface ?? undefined,\n emptyColor: colors.empty || \"rgba(128, 128, 128, 0.15)\",\n hoverColor: colors.hover || \"#000000\",\n labels,\n valueFormatter: formatter,\n details: details as string[] | undefined,\n showTooltip,\n chartOptions,\n locale,\n })\n : null,\n [model, value, colors, surface, labels, formatter, details, showTooltip, chartOptions, locale],\n )\n const onEvents = useMemo(\n () =>\n onSelect\n ? {\n click: (params: unknown) => {\n const r = (params as { data?: { region?: FilledMapRegion } }).data?.region\n if (r?.row) onSelect(String(r.row[region]), r.row as T)\n },\n }\n : undefined,\n [onSelect, region],\n )\n const dataTable = useMemo(\n () => (model ? filledMapDataTable(model, { region, value }, formatter, details as string[] | undefined, labels, locale) : undefined),\n [model, region, value, formatter, details, labels, locale],\n )\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? (model ? buildFilledMapSummary(model, formatter, title, locale) : undefined) : summary),\n [summary, model, formatter, title, locale],\n )\n const label = ariaLabel ?? textOf(locale).chart(labels?.[value] ?? value ?? \"\")\n const isEmpty = rows.length === 0\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={(isLoading ?? false) || (!isEmpty && !option)}\n isEmpty={isEmpty}\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 {option && (\n <EChart option={option} onEvents={onEvents} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary: resolvedSummary }} />\n )}\n </div>\n {showLegend && model ? <RampLegend min={model.min} max={model.max} formatter={formatter} tone={tone} /> : null}\n </div>\n </ChartFrame>\n )\n}\n\nfunction RampLegend({ min, max, formatter, tone }: { min: number; max: number; formatter: ValueFormatter; tone: string }) {\n return (\n <div data-slot=\"filled-map-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(min)}</span>\n <span aria-hidden className=\"h-2 w-24 rounded-sm\" style={{ backgroundImage: rampGradientCss(tone) }} />\n <span>{formatter(max)}</span>\n </span>\n </div>\n )\n}\n\n/** Generic over the row type, so `region` / `value` keys are checked against `data`. */\nexport const FilledMap = forwardRef(FilledMapImpl as (props: FilledMapProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: FilledMapProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nFilledMap.displayName = \"FilledMap\"\n","\"use client\"\n\n/**\n * SymbolMap — points at latitude / longitude over a faint boundary basemap (Japan's prefectures, US states or the\n * countries of the world). Pass rows and the two coordinate columns instead of an ECharts option.\n *\n * `size` scales each symbol's area by a number; `color` colours it by a number (a single-hue ramp of `tone`, like\n * Heatmap) or by a category (`--chart-1..5` in order of appearance, the 6th category on as「その他」/ \"Other\").\n * `basemap=\"auto\"` (default) picks the smallest map holding every point. A row without usable coordinates is not\n * drawn; it is listed in the screen-reader table instead. `selected` dims the other points; clicking a point calls\n * `onSelect` (a filter action). The boundaries (Natural Earth, public domain) load on demand.\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 { GeoComponent } from \"echarts/components\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { Legend } from \"./legend\"\nimport { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface, type ChartTokens } from \"../lib/chart-theme\"\nimport { chartRootProps, DEFAULT_CHART_COLORS, otherSeriesLabel, resolveValueFormatter, toChartNumber, type ChartDataTable } from \"../lib/chart-utils\"\nimport { mixIntoSurface, rampColor, rampGradientCss, rampRatio } from \"../lib/color-ramp\"\nimport { EMPTY_VALUE, type ValueFormat } from \"../lib/format\"\nimport { detectBasemap, GEO_ASPECT_SCALE, geoMapKey, insetUsPoint, useGeoMap, type GeoMapName } from \"../lib/geo\"\nimport { resolveLocale, uiLanguage } from \"../lib/locale\"\nimport type { ChartActionsOptions, ChartEmptyState, ChartRootAttributes, ChartSeriesColor, ValueFormatter } from \"../lib/types\"\n\n// The geo coordinate system (the basemap) and the scatter series are this part's own.\nuse([EScatterChart, GeoComponent])\n\n/** Smallest and largest symbol diameter (px) when `size` is given; the symbol's area follows the value. */\nexport const SYMBOL_MAP_MIN_SIZE = 6\nexport const SYMBOL_MAP_MAX_SIZE = 36\n/** Symbol diameter (px) without `size`. */\nexport const SYMBOL_MAP_DEFAULT_SIZE = 10\n/** Categories coloured `--chart-1..5`; the rest share the「その他」grey. */\nconst MAX_CATEGORIES = 5\n\nexport type SymbolMapBasemap = GeoMapName | \"auto\"\n\nexport interface SymbolMapProps<T extends Record<string, unknown> = Record<string, unknown>> extends ChartRootAttributes {\n /** 行の配列。1 行 = 1 点。 */\n data: T[]\n /** 緯度の列名(-90〜90。数値か数値文字列)。 */\n latitude: keyof T & string\n /** 経度の列名(-180〜180。数値か数値文字列)。 */\n longitude: keyof T & string\n /** 点の名前の列名(ツールチップ・データ表・`selected` の照合に使う)。 */\n name?: keyof T & string\n /** 点の大きさ(面積)を決める数値の列名。省略時は同じ大きさ。 */\n size?: keyof T & string\n /** 点の色を決める列名。数値なら `tone` の単色の濃淡、文字ならカテゴリ色(`--chart-1..5` の出現順、6 つ目以降は「その他」)。 */\n color?: keyof T & string\n /** 背景の地図。`\"japan\"`・`\"us\"`・`\"world\"`。既定 `\"auto\"`(全部の点が入る最も狭い地図)。 */\n basemap?: SymbolMapBasemap\n /** 列名 → 表示名(ツールチップ・凡例・データ表)。 */\n labels?: Record<string, string>\n /** 数値の書式(`color` の数値と、`sizeFormat` が無いときの `size`)。既定 `\"number\"`。 */\n format?: ValueFormat\n /** `size` の値の書式。省略時は `format`。 */\n sizeFormat?: ValueFormat\n /** 数値の `color` の濃淡の色。`\"chart-1\"`〜`\"chart-5\"` か意味色。既定 `\"chart-1\"`。 */\n tone?: ChartSeriesColor\n /** 凡例(数値の色なら濃淡の帯、カテゴリなら色の一覧)を出す。既定 `true`。 */\n showLegend?: boolean\n /** ホバーでツールチップを出す。既定 `true`。 */\n showTooltip?: boolean\n /** ツールチップとデータ表に添える列。 */\n details?: (keyof T & string)[]\n /** 選択中の点(`name` 列の値)。渡すと、それ以外の点を薄くする。 */\n selected?: string[]\n /** 点のクリック。その行を受け取る(フィルターの操作に使う)。 */\n onSelect?: (row: T) => void\n /** グラフの見出し。 */\n title?: string\n /** グラフが言っていることの 1 文要約。 */\n summary?: string\n /** 読み込み中。最終形と同じ高さのスケルトンを出す。 */\n isLoading?: boolean\n /** `data` が空のときの表示。 */\n emptyState?: ChartEmptyState\n /** プロット領域の高さ(px)。既定 288。 */\n height?: number\n /** 生成した EChartsOption に最後に深くマージする逃げ道。 */\n chartOptions?: EChartsOption\n /** グラフ右上に PNG 保存/コピーのボタンを出す。 */\n actions?: boolean | ChartActionsOptions\n /** PNG 保存時のファイル名(拡張子つき)。 */\n fileName?: string\n className?: string\n /** スクリーンリーダー向けのラベル。 */\n ariaLabel?: string\n}\n\n/* ------------------------------------------------------------------ model */\n\nexport interface SymbolMapPoint {\n lon: number\n lat: number\n name: string | null\n size: number | null\n /** Numeric colour value (numeric `color`). */\n shade: number | null\n /** Category (categorical `color`), as text. */\n category: string | null\n row: Record<string, unknown>\n}\n\nexport interface SymbolMapModel {\n points: SymbolMapPoint[]\n /** Rows without usable coordinates. */\n unplotted: Record<string, unknown>[]\n colorMode: \"none\" | \"numeric\" | \"category\"\n /** Categories in order of appearance (categorical colour). */\n categories: string[]\n shadeMin: number\n shadeMax: number\n sizeMax: number\n}\n\nconst isBlank = (v: unknown) => v === null || v === undefined || (typeof v === \"string\" && v.trim() === \"\")\n\nexport function buildSymbolMapModel(config: {\n data: readonly Record<string, unknown>[]\n latitude: string\n longitude: string\n name?: string\n size?: string\n color?: string\n}): SymbolMapModel {\n const { data, latitude, longitude, name, size, color } = config\n const rows = data.filter((row) => row && typeof row === \"object\")\n const colorValues = color ? rows.map((row) => row[color]).filter((v) => !isBlank(v)) : []\n const colorMode = !color || colorValues.length === 0 ? \"none\" : colorValues.every((v) => toChartNumber(v) !== null) ? \"numeric\" : \"category\"\n const points: SymbolMapPoint[] = []\n const unplotted: Record<string, unknown>[] = []\n const categories: string[] = []\n let [lo, hi, sizeMax] = [Infinity, -Infinity, 0]\n for (const row of rows) {\n const lat = toChartNumber(row[latitude])\n const lon = toChartNumber(row[longitude])\n if (lat === null || lon === null || Math.abs(lat) > 90 || Math.abs(lon) > 180) {\n unplotted.push(row)\n continue\n }\n const s = size ? toChartNumber(row[size]) : null\n if (s !== null && s > sizeMax) sizeMax = s\n const shade = colorMode === \"numeric\" ? toChartNumber(row[color!]) : null\n if (shade !== null) [lo, hi] = [Math.min(lo, shade), Math.max(hi, shade)]\n const category = colorMode === \"category\" && !isBlank(row[color!]) ? String(row[color!]) : null\n if (category !== null && !categories.includes(category)) categories.push(category)\n points.push({ lon, lat, name: name && !isBlank(row[name]) ? String(row[name]) : null, size: s, shade, category, row })\n }\n const shadeMin = Number.isFinite(lo) ? lo : 0\n let shadeMax = Number.isFinite(hi) ? hi : 1\n if (shadeMax <= shadeMin) shadeMax = shadeMin + 1\n return { points, unplotted, colorMode, categories, shadeMin, shadeMax, sizeMax }\n}\n\n/** A symbol's diameter (px): its area is proportional to the value; zero, negative and missing values are the smallest. */\nexport function symbolMapSize(value: number | null, max: number, hasSize: boolean): number {\n if (!hasSize) return SYMBOL_MAP_DEFAULT_SIZE\n if (value === null || value <= 0 || !(max > 0)) return SYMBOL_MAP_MIN_SIZE\n return SYMBOL_MAP_MIN_SIZE + (SYMBOL_MAP_MAX_SIZE - SYMBOL_MAP_MIN_SIZE) * Math.sqrt(Math.min(1, value / max))\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[c]!)\n}\n\nconst TEXT = {\n ja: {\n join: \"・\",\n point: \"地点\",\n latitude: \"緯度\",\n longitude: \"経度\",\n notPlotted: \"(座標なし)\",\n chart: \"地点の地図\",\n },\n en: {\n join: \", \",\n point: \"Point\",\n latitude: \"Latitude\",\n longitude: \"Longitude\",\n notPlotted: \" (no coordinates)\",\n chart: \"Map of points\",\n },\n}\n\nconst textOf = (locale?: string) => TEXT[uiLanguage(resolveLocale(locale))]\n\nconst coordText = (n: number | null) => (n === null ? EMPTY_VALUE : n.toFixed(4).replace(/\\.?0+$/, \"\"))\n\nexport interface SymbolMapOptionConfig {\n model: SymbolMapModel\n basemap: GeoMapName\n size?: string\n color?: string\n /** Resolved colour of the ramp (numeric colour) — and of every point without `color`. */\n toneColor: string\n /** Resolved colours of the categories, in order (the 6th on: the「その他」grey). */\n categoryColors: readonly string[]\n surfaceColor?: string\n /** Basemap fill and outline. */\n landColor: string\n borderColor: string\n labels?: Record<string, string>\n valueFormatter: ValueFormatter\n sizeFormatter: ValueFormatter\n details?: readonly string[]\n selected?: readonly string[]\n showTooltip: boolean\n chartOptions?: EChartsOption\n locale?: string\n}\n\nexport function buildSymbolMapOption(config: SymbolMapOptionConfig): EChartsOption {\n const { model, labels, valueFormatter, sizeFormatter } = config\n const label = (key: string) => labels?.[key] ?? key\n const base = config.toneColor || \"#6366f1\"\n const selected = config.selected && config.selected.length > 0 ? new Set(config.selected.map(String)) : null\n const fillOf = (p: SymbolMapPoint): string => {\n if (model.colorMode === \"numeric\") return p.shade === null ? config.landColor : rampColor(base, config.surfaceColor, rampRatio(p.shade, model.shadeMin, model.shadeMax))\n if (model.colorMode === \"category\") {\n const at = p.category === null ? -1 : model.categories.indexOf(p.category)\n return at === -1 ? config.categoryColors[MAX_CATEGORIES] ?? base : (config.categoryColors[Math.min(at, MAX_CATEGORIES)] ?? base)\n }\n return base\n }\n const tooltip = (p: SymbolMapPoint): string => {\n const lines = [escapeHtml(p.name ?? `${coordText(p.lat)}, ${coordText(p.lon)}`)]\n if (config.size) lines.push(`${escapeHtml(label(config.size))} ${p.size === null ? EMPTY_VALUE : escapeHtml(sizeFormatter(p.size))}`)\n if (config.color && config.color !== config.size)\n lines.push(`${escapeHtml(label(config.color))} ${model.colorMode === \"numeric\" ? (p.shade === null ? EMPTY_VALUE : escapeHtml(valueFormatter(p.shade))) : escapeHtml(label(p.category ?? EMPTY_VALUE))}`)\n for (const key of config.details ?? []) lines.push(`${escapeHtml(label(key))} ${escapeHtml(cellText(p.row[key], valueFormatter))}`)\n return lines.join(\"<br/>\")\n }\n // Big symbols first, so small ones stay on top and can be hovered.\n const order = [...model.points].sort((a, b) => (b.size ?? 0) - (a.size ?? 0))\n const option: EChartsOption = {\n animation: false,\n tooltip: config.showTooltip\n ? { trigger: \"item\", formatter: (p: unknown) => tooltip((p as { data: { point: SymbolMapPoint } }).data.point) }\n : { show: false },\n geo: {\n map: geoMapKey(config.basemap),\n silent: true,\n roam: false,\n aspectScale: GEO_ASPECT_SCALE[config.basemap],\n left: 8,\n right: 8,\n top: 8,\n bottom: 8,\n label: { show: false },\n itemStyle: { areaColor: config.landColor, borderColor: config.borderColor, borderWidth: 0.6 },\n emphasis: { disabled: true },\n } as never,\n series: [\n {\n id: \"points\",\n type: \"scatter\",\n coordinateSystem: \"geo\",\n data: order.map((p) => {\n const [x, y] = config.basemap === \"us\" ? insetUsPoint(p.lon, p.lat) : [p.lon, p.lat]\n const fill = fillOf(p)\n const dim = selected !== null && !(p.name !== null && selected.has(p.name))\n return {\n value: [x, y],\n point: p,\n symbolSize: symbolMapSize(p.size, model.sizeMax, !!config.size),\n itemStyle: { color: dim ? mixIntoSurface(fill, config.surfaceColor, 0.3) : fill, opacity: dim ? 1 : 0.85 },\n }\n }),\n itemStyle: { borderColor: config.surfaceColor ?? \"#ffffff\", borderWidth: 1 },\n emphasis: { scale: false, itemStyle: { opacity: 1, borderColor: config.borderColor, borderWidth: 1.5 } },\n },\n ],\n }\n return config.chartOptions\n ? (mergeDeep(option as Record<string, unknown>, config.chartOptions as Record<string, unknown>) as EChartsOption)\n : option\n}\n\nfunction cellText(raw: unknown, formatter: ValueFormatter): string {\n if (isBlank(raw)) return EMPTY_VALUE\n const n = typeof raw === \"string\" ? null : toChartNumber(raw)\n return n === null ? String(raw) : formatter(n)\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 point (the ones without coordinates last, marked). */\nexport function symbolMapDataTable(\n model: SymbolMapModel,\n names: { latitude: string; longitude: string; name?: string; size?: string; color?: string },\n formatters: { value: ValueFormatter; size: ValueFormatter },\n details: readonly string[] = [],\n labels?: Record<string, string>,\n locale?: string,\n): ChartDataTable {\n const t = textOf(locale)\n const label = (key: string) => labels?.[key] ?? key\n const extra = [names.size, names.color].filter((k): k is string => !!k && k !== names.latitude && k !== names.longitude)\n const keys = [...new Set([...extra, ...details])]\n const rowCells = (row: Record<string, unknown>) =>\n keys.map((key) => (key === names.size ? cellText(row[key], formatters.size) : key === names.color && model.colorMode === \"category\" ? (isBlank(row[key]) ? EMPTY_VALUE : label(String(row[key]))) : cellText(row[key], formatters.value)))\n const nameOf = (row: Record<string, unknown>) => (names.name && !isBlank(row[names.name]) ? String(row[names.name]) : EMPTY_VALUE)\n const rows = [\n ...model.points.map((p) => [nameOf(p.row), coordText(p.lat), coordText(p.lon), ...rowCells(p.row)]),\n ...model.unplotted.map((row) => [\n `${nameOf(row)}${t.notPlotted}`,\n coordText(toChartNumber(row[names.latitude])),\n coordText(toChartNumber(row[names.longitude])),\n ...rowCells(row),\n ]),\n ]\n return {\n columns: [names.name ? label(names.name) : t.point, labels?.[names.latitude] ?? t.latitude, labels?.[names.longitude] ?? t.longitude, ...keys.map(label)],\n rows,\n }\n}\n\n/* -------------------------------------------------------------- component */\n\nfunction colorsFor(tokens: ChartTokens | null, tone: string) {\n const resolved = resolveChartColors([tone, \"var(--muted)\", \"var(--border)\", ...DEFAULT_CHART_COLORS, CHART_OTHER_COLOR], tokens)\n const [toneColor = \"\", land = \"\", border = \"\"] = resolved\n return { toneColor, land, border, categories: resolved.slice(3) }\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 SymbolMapImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n latitude,\n longitude,\n name,\n size,\n color,\n basemap = \"auto\",\n labels,\n format,\n sizeFormat,\n tone = \"chart-1\",\n showLegend = true,\n showTooltip = true,\n details,\n selected,\n onSelect,\n title,\n summary,\n isLoading,\n emptyState,\n height,\n chartOptions,\n actions,\n fileName,\n className,\n ariaLabel,\n ...rest\n }: SymbolMapProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const rows = Array.isArray(data) ? data : NO_ROWS\n const { ref: frameRef, surface, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const formatter = useMemo(() => resolveValueFormatter(undefined, format ?? \"number\", locale), [format, locale])\n const sizeFormatter = useMemo(() => resolveValueFormatter(undefined, sizeFormat ?? format ?? \"number\", locale), [sizeFormat, format, locale])\n const model = useMemo(() => buildSymbolMapModel({ data: rows, latitude, longitude, name, size, color }), [rows, latitude, longitude, name, size, color])\n const resolvedBasemap = useMemo(\n () => (basemap === \"auto\" ? detectBasemap(model.points.map((p) => [p.lon, p.lat] as const)) : basemap),\n [basemap, model],\n )\n const geo = useGeoMap(NO_ROWS, resolvedBasemap)\n const colors = useMemo(() => colorsFor(tokens, tone), [tokens, tone])\n const option = useMemo(\n () =>\n geo\n ? buildSymbolMapOption({\n model,\n basemap: geo.name,\n size,\n color,\n toneColor: colors.toneColor,\n categoryColors: colors.categories,\n surfaceColor: surface ?? undefined,\n landColor: colors.land || \"rgba(128, 128, 128, 0.15)\",\n borderColor: colors.border || \"rgba(128, 128, 128, 0.4)\",\n labels,\n valueFormatter: formatter,\n sizeFormatter,\n details: details as string[] | undefined,\n selected,\n showTooltip,\n chartOptions,\n locale,\n })\n : null,\n [geo, model, size, color, colors, surface, labels, formatter, sizeFormatter, details, selected, showTooltip, chartOptions, locale],\n )\n const onEvents = useMemo(\n () =>\n onSelect\n ? {\n click: (params: unknown) => {\n const p = (params as { data?: { point?: SymbolMapPoint } }).data?.point\n if (p) onSelect(p.row as T)\n },\n }\n : undefined,\n [onSelect],\n )\n const dataTable = useMemo(\n () => symbolMapDataTable(model, { latitude, longitude, name, size, color }, { value: formatter, size: sizeFormatter }, details as string[] | undefined, labels, locale),\n [model, latitude, longitude, name, size, color, formatter, sizeFormatter, details, labels, locale],\n )\n const label = ariaLabel ?? textOf(locale).chart\n const isEmpty = rows.length === 0\n const legendCategories =\n model.categories.length > MAX_CATEGORIES ? [...model.categories.slice(0, MAX_CATEGORIES), otherSeriesLabel(locale)] : model.categories\n const legend = !showLegend ? null : model.colorMode === \"numeric\" ? (\n <div data-slot=\"symbol-map-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 {color && <span>{labels?.[color] ?? color}</span>}\n <span>{formatter(model.shadeMin)}</span>\n <span aria-hidden className=\"h-2 w-24 rounded-sm\" style={{ backgroundImage: rampGradientCss(tone) }} />\n <span>{formatter(model.shadeMax)}</span>\n </span>\n </div>\n ) : model.colorMode === \"category\" ? (\n <Legend categories={legendCategories} labels={labels} />\n ) : null\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={summary}\n isLoading={(isLoading ?? false) || (!isEmpty && !option)}\n isEmpty={isEmpty}\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 {option && (\n <EChart option={option} onEvents={onEvents} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary }} />\n )}\n </div>\n {legend}\n </div>\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so the column keys are checked against `data`. */\nexport const SymbolMap = forwardRef(SymbolMapImpl as (props: SymbolMapProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: SymbolMapProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nSymbolMap.displayName = \"SymbolMap\"\n","\"use client\"\n\n/**\n * Treemap — parts of a whole as nested rectangles whose areas are the values.\n * Pass rows, the leaf column (`index`),\n * optionally a parent column (`group`, for two levels) and the number (`value`) instead of an ECharts option.\n *\n * Colour is categorical by `group` (or by `index` without one): `--chart-1..5` for the largest five, the rest the\n * 「その他」grey. A numeric `color` column shades each tile on a single-hue ramp of `tone` instead (like Heatmap).\n * Each tile carries its name and value when it fits. Values that are zero, negative or missing take no area; they\n * stay in the screen-reader table. Clicking a tile calls `onSelect` with its row.\n */\nimport { forwardRef, useMemo, type ForwardedRef, type ReactElement, type Ref } from \"react\"\nimport { use } from \"echarts/core\"\nimport { TreemapChart } from \"echarts/charts\"\nimport type { EChartsOption } from \"echarts\"\n\nimport { ChartFrame } from \"./chart-frame\"\nimport { EChart } from \"./echart\"\nimport { Legend } from \"./legend\"\nimport { useLocale } from \"../hooks/use-locale\"\nimport { CHART_OTHER_COLOR, resolveChartColors, useChartSurface, type ChartTokens } from \"../lib/chart-theme\"\nimport { chartRootProps, DEFAULT_CHART_COLORS, otherSeriesLabel, resolveValueFormatter, toChartNumber, type ChartDataTable } from \"../lib/chart-utils\"\nimport { RAMP_LIGHT_TEXT_FROM, rampColor, rampGradientCss, rampRatio } from \"../lib/color-ramp\"\nimport { EMPTY_VALUE, formatValue, type ValueFormat } from \"../lib/format\"\nimport { resolveLocale, uiLanguage } from \"../lib/locale\"\nimport type { ChartActionsOptions, ChartEmptyState, ChartRootAttributes, ChartSeriesColor, ValueFormatter } from \"../lib/types\"\n\n// The treemap series is this part's own.\nuse([TreemapChart])\n\n/** Categories coloured `--chart-1..5` (largest first); the rest share the「その他」grey. */\nconst MAX_CATEGORIES = 5\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 TreemapProps<T extends Record<string, unknown> = Record<string, unknown>> extends ChartRootAttributes {\n /** 行の配列。1 行 = 1 タイル(集計済みの値)。 */\n data: T[]\n /** タイル(葉)の名前の列名。例 `\"product\"`。 */\n index: keyof T & string\n /** 親の列名(2 階層にする)。例 `\"category\"`。省略時は 1 階層。 */\n group?: keyof T & string\n /** タイルの面積を決める数値の列名。0 以下・欠損の行は面積を持たない(データ表には残る)。 */\n value: NumericColumn<T>\n /** タイルの色を決める数値の列名(`tone` の単色の濃淡)。省略時は `group`(無ければ `index`)ごとのカテゴリ色。 */\n color?: NumericColumn<T>\n /** 列名・値 → 表示名(タイル・ツールチップ・凡例・データ表)。 */\n labels?: Record<string, string>\n /** `value` の書式。既定 `\"number\"`。 */\n format?: ValueFormat\n /** `color` の値の書式。省略時は `format`。 */\n colorFormat?: ValueFormat\n /** 書式を関数で直接渡す逃げ道(`value`)。`format` より優先する。 */\n valueFormatter?: ValueFormatter\n /** 数値の `color` の濃淡の色。既定 `\"chart-1\"`。 */\n tone?: ChartSeriesColor\n /** 凡例(カテゴリ色なら色の一覧、数値の色なら濃淡の帯)を出す。既定 `true`(カテゴリ色は `group` があるときだけ)。 */\n showLegend?: boolean\n /** ホバーでツールチップを出す。既定 `true`。 */\n showTooltip?: boolean\n /** タイルのクリック。その行を受け取る(フィルターの操作に使う)。 */\n onSelect?: (row: T) => void\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 保存/コピーのボタンを出す。 */\n actions?: boolean | ChartActionsOptions\n /** PNG 保存時のファイル名(拡張子つき)。 */\n fileName?: string\n className?: string\n /** スクリーンリーダー向けのラベル。 */\n ariaLabel?: string\n}\n\n/* ------------------------------------------------------------------ model */\n\nexport interface TreemapLeaf {\n name: string\n group: string | null\n value: number | null\n shade: number | null\n row: Record<string, unknown>\n}\n\nexport interface TreemapModel {\n /** Every row, in data order. */\n leaves: TreemapLeaf[]\n /** Leaves that take area (value > 0), grouped; groups and leaves largest first. */\n groups: { name: string | null; total: number; leaves: TreemapLeaf[] }[]\n /** The colour categories (groups, or leaves without a group), largest first. */\n categories: string[]\n total: number\n shadeMin: number\n shadeMax: number\n}\n\nexport function buildTreemapModel(config: {\n data: readonly Record<string, unknown>[]\n index: string\n group?: string\n value: string\n color?: string\n}): TreemapModel {\n const { data, index, group, value, color } = config\n const leaves: TreemapLeaf[] = []\n let [lo, hi] = [Infinity, -Infinity]\n for (const row of data) {\n if (!row || typeof row !== \"object\") continue\n const shade = color ? toChartNumber(row[color]) : null\n if (shade !== null) [lo, hi] = [Math.min(lo, shade), Math.max(hi, shade)]\n leaves.push({\n name: String(row[index] ?? EMPTY_VALUE),\n group: group ? String(row[group] ?? EMPTY_VALUE) : null,\n value: toChartNumber(row[value]),\n shade,\n row,\n })\n }\n const byGroup = new Map<string | null, TreemapLeaf[]>()\n for (const leaf of leaves) {\n if (leaf.value === null || leaf.value <= 0) continue\n const list = byGroup.get(leaf.group) ?? []\n list.push(leaf)\n byGroup.set(leaf.group, list)\n }\n const groups = [...byGroup.entries()]\n .map(([name, list]) => ({ name, total: list.reduce((s, l) => s + (l.value as number), 0), leaves: [...list].sort((a, b) => (b.value as number) - (a.value as number)) }))\n .sort((a, b) => b.total - a.total)\n const total = groups.reduce((s, g) => s + g.total, 0)\n const categories = group\n ? groups.map((g) => g.name as string)\n : [...new Set(groups.flatMap((g) => g.leaves.map((l) => l.name)))]\n const shadeMin = Number.isFinite(lo) ? lo : 0\n let shadeMax = Number.isFinite(hi) ? hi : 1\n if (shadeMax <= shadeMin) shadeMax = shadeMin + 1\n return { leaves, groups, categories, total, shadeMin, shadeMax }\n}\n\nfunction escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[c]!)\n}\n\nconst TEXT = {\n ja: {\n join: \"・\",\n item: \"項目\",\n group: \"グループ\",\n share: \"構成比\",\n top: (name: string, share: string) => `最大は ${name}(全体の ${share})`,\n chart: (value: string) => `${value}のツリーマップ`,\n },\n en: {\n join: \", \",\n item: \"Item\",\n group: \"Group\",\n share: \"Share\",\n top: (name: string, share: string) => `Largest: ${name} (${share} of the total)`,\n chart: (value: string) => `Treemap of ${value}`,\n },\n}\n\nconst textOf = (locale?: string) => TEXT[uiLanguage(resolveLocale(locale))]\n\nexport interface TreemapOptionConfig {\n model: TreemapModel\n hasGroup: boolean\n colorMode: \"category\" | \"numeric\"\n /** Resolved ramp colour (numeric). */\n toneColor: string\n /** Resolved category colours in order; the entry after the fifth is the「その他」grey. */\n categoryColors: readonly string[]\n surfaceColor?: string\n /** Text on a light tile. */\n foregroundColor: string\n labels?: Record<string, string>\n valueFormatter: ValueFormatter\n colorFormatter: ValueFormatter\n colorKey?: string\n showTooltip: boolean\n chartOptions?: EChartsOption\n locale?: string\n}\n\nexport function buildTreemapOption(config: TreemapOptionConfig): EChartsOption {\n const { model, labels, valueFormatter } = config\n const t = textOf(config.locale)\n const label = (key: string) => labels?.[key] ?? key\n const surface = config.surfaceColor ?? \"#ffffff\"\n const base = config.toneColor || \"#6366f1\"\n const categoryColor = (name: string) => {\n const at = model.categories.indexOf(name)\n return config.categoryColors[at === -1 ? MAX_CATEGORIES : Math.min(at, MAX_CATEGORIES)] ?? base\n }\n const share = (v: number) => formatValue(model.total > 0 ? v / model.total : 0, \"percent\", config.locale)\n const leafNode = (leaf: TreemapLeaf) => {\n let fill: string\n let dark = true\n if (config.colorMode === \"numeric\") {\n const ratio = leaf.shade === null ? 0 : rampRatio(leaf.shade, model.shadeMin, model.shadeMax)\n fill = rampColor(base, config.surfaceColor, ratio)\n dark = ratio >= RAMP_LIGHT_TEXT_FROM\n } else fill = categoryColor(config.hasGroup ? (leaf.group as string) : leaf.name)\n return {\n name: label(leaf.name),\n value: leaf.value as number,\n leaf,\n itemStyle: { color: fill },\n label: { color: dark ? surface : config.foregroundColor },\n }\n }\n const tooltip = (leaf: TreemapLeaf | undefined, name: string, value: number): string => {\n const head = leaf?.group != null ? `${escapeHtml(label(leaf.group))} / ${escapeHtml(name)}` : escapeHtml(name)\n const parts = [`${head} ${escapeHtml(valueFormatter(value))}`, `${t.share} ${escapeHtml(share(value))}`]\n if (leaf && config.colorKey && config.colorMode === \"numeric\")\n parts.push(`${escapeHtml(label(config.colorKey))} ${leaf.shade === null ? EMPTY_VALUE : escapeHtml(config.colorFormatter(leaf.shade))}`)\n return parts.join(t.join)\n }\n const data = config.hasGroup\n ? model.groups.map((g) => ({\n name: label(g.name as string),\n value: g.total,\n itemStyle: { color: config.colorMode === \"numeric\" ? config.foregroundColor : categoryColor(g.name as string) },\n children: g.leaves.map(leafNode),\n }))\n : model.groups.flatMap((g) => g.leaves.map(leafNode))\n const option: EChartsOption = {\n animation: false,\n tooltip: config.showTooltip\n ? {\n trigger: \"item\",\n formatter: (p: unknown) => {\n const d = p as { name: string; value: number; data: { leaf?: TreemapLeaf } }\n return tooltip(d.data?.leaf, d.name, Number(d.value))\n },\n }\n : { show: false },\n series: [\n {\n id: \"tiles\",\n type: \"treemap\",\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n roam: false,\n nodeClick: false,\n breadcrumb: { show: false },\n squareRatio: 0.5 * (1 + Math.sqrt(5)),\n label: {\n show: true,\n position: \"insideTopLeft\",\n overflow: \"truncate\",\n lineHeight: 16,\n formatter: (p: unknown) => {\n const d = p as { name: string; value: number }\n return `${d.name}\\n${valueFormatter(Number(d.value))}`\n },\n },\n upperLabel: { show: config.hasGroup, height: 20, color: surface, fontWeight: 600 },\n itemStyle: { borderColor: surface, borderWidth: 1, gapWidth: 1 },\n emphasis: { disabled: true },\n levels: config.hasGroup\n ? [{ itemStyle: { borderColor: surface, borderWidth: 2, gapWidth: 2 } }, { itemStyle: { borderColor: surface, borderWidth: 0, gapWidth: 1 } }]\n : [{ itemStyle: { borderColor: surface, borderWidth: 0, gapWidth: 1 } }],\n data,\n } as never,\n ],\n }\n return config.chartOptions\n ? (mergeDeep(option as Record<string, unknown>, config.chartOptions as Record<string, unknown>) as EChartsOption)\n : 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: every row (in data order), with its share of the total. */\nexport function treemapDataTable(\n model: TreemapModel,\n names: { index: string; group?: string; value: string; color?: string },\n formatters: { value: ValueFormatter; color: ValueFormatter },\n labels?: Record<string, string>,\n locale?: string,\n): ChartDataTable {\n const t = textOf(locale)\n const label = (key: string) => labels?.[key] ?? key\n const share = (v: number | null) => (v === null || v <= 0 || model.total <= 0 ? EMPTY_VALUE : formatValue(v / model.total, \"percent\", locale))\n return {\n columns: [\n ...(names.group ? [labels?.[names.group] ?? t.group] : []),\n labels?.[names.index] ?? t.item,\n label(names.value),\n t.share,\n ...(names.color && names.color !== names.value ? [label(names.color)] : []),\n ],\n rows: model.leaves.map((leaf) => [\n ...(names.group ? [label(leaf.group ?? EMPTY_VALUE)] : []),\n label(leaf.name),\n leaf.value === null ? EMPTY_VALUE : formatters.value(leaf.value),\n share(leaf.value),\n ...(names.color && names.color !== names.value ? [leaf.shade === null ? EMPTY_VALUE : formatters.color(leaf.shade)] : []),\n ]),\n }\n}\n\n/** `summary=\"auto\"`: the largest tile and its share. */\nexport function buildTreemapSummary(model: TreemapModel, title?: string, labels?: Record<string, string>, locale?: string): string | undefined {\n let best: TreemapLeaf | undefined\n for (const g of model.groups) for (const l of g.leaves) if (!best || (l.value as number) > (best.value as number)) best = l\n if (!best || model.total <= 0) return undefined\n return `${title ? `${title}: ` : \"\"}${textOf(locale).top(labels?.[best.name] ?? best.name, formatValue((best.value as number) / model.total, \"percent\", locale))}`\n}\n\n/* -------------------------------------------------------------- component */\n\nfunction colorsFor(tokens: ChartTokens | null, tone: string) {\n const resolved = resolveChartColors([tone, \"var(--foreground)\", ...DEFAULT_CHART_COLORS, CHART_OTHER_COLOR], tokens)\n const [toneColor = \"\", foreground = \"\"] = resolved\n return { toneColor, foreground, categories: resolved.slice(2) }\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 TreemapImpl<T extends Record<string, unknown>>(\n {\n data = NO_ROWS,\n index,\n group,\n value,\n color,\n labels,\n format,\n colorFormat,\n valueFormatter,\n tone = \"chart-1\",\n showLegend = true,\n showTooltip = true,\n onSelect,\n title,\n summary,\n isLoading,\n emptyState,\n height,\n chartOptions,\n actions,\n fileName,\n className,\n ariaLabel,\n ...rest\n }: TreemapProps<T>,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n const rows = Array.isArray(data) ? data : NO_ROWS\n const { ref: frameRef, surface, tokens } = useChartSurface(ref)\n const locale = useLocale()\n const formatter = useMemo(() => resolveValueFormatter(valueFormatter, format ?? \"number\", locale), [valueFormatter, format, locale])\n const colorFormatter = useMemo(() => resolveValueFormatter(undefined, colorFormat ?? format ?? \"number\", locale), [colorFormat, format, locale])\n const model = useMemo(() => buildTreemapModel({ data: rows, index, group, value, color }), [rows, index, group, value, color])\n const colorMode = color ? \"numeric\" : \"category\"\n const colors = useMemo(() => colorsFor(tokens, tone), [tokens, tone])\n const option = useMemo(\n () =>\n buildTreemapOption({\n model,\n hasGroup: !!group,\n colorMode,\n toneColor: colors.toneColor,\n categoryColors: colors.categories,\n surfaceColor: surface ?? undefined,\n foregroundColor: colors.foreground || tokens?.foreground || \"#111111\",\n labels,\n valueFormatter: formatter,\n colorFormatter,\n colorKey: color,\n showTooltip,\n chartOptions,\n locale,\n }),\n [model, group, colorMode, colors, surface, tokens, labels, formatter, colorFormatter, color, showTooltip, chartOptions, locale],\n )\n const onEvents = useMemo(\n () =>\n onSelect\n ? {\n click: (params: unknown) => {\n const leaf = (params as { data?: { leaf?: TreemapLeaf } }).data?.leaf\n if (leaf) onSelect(leaf.row as T)\n },\n }\n : undefined,\n [onSelect],\n )\n const dataTable = useMemo(\n () => treemapDataTable(model, { index, group, value, color }, { value: formatter, color: colorFormatter }, labels, locale),\n [model, index, group, value, color, formatter, colorFormatter, labels, locale],\n )\n const resolvedSummary = useMemo(\n () => (summary === \"auto\" ? buildTreemapSummary(model, title, labels, locale) : summary),\n [summary, model, title, labels, locale],\n )\n const label = ariaLabel ?? textOf(locale).chart(labels?.[value] ?? value ?? \"\")\n const legendCategories =\n model.categories.length > MAX_CATEGORIES ? [...model.categories.slice(0, MAX_CATEGORIES), otherSeriesLabel(locale)] : model.categories\n const legend = !showLegend ? null : colorMode === \"numeric\" ? (\n <div data-slot=\"treemap-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 {color && <span>{labels?.[color] ?? color}</span>}\n <span>{colorFormatter(model.shadeMin)}</span>\n <span aria-hidden className=\"h-2 w-24 rounded-sm\" style={{ backgroundImage: rampGradientCss(tone) }} />\n <span>{colorFormatter(model.shadeMax)}</span>\n </span>\n </div>\n ) : group ? (\n <Legend categories={legendCategories} labels={labels} />\n ) : null\n return (\n <ChartFrame\n {...chartRootProps(rest)}\n ref={frameRef}\n title={title}\n summary={resolvedSummary}\n isLoading={isLoading ?? false}\n isEmpty={rows.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} onEvents={onEvents} height=\"100%\" ariaLabel={label} actions={actions} fileName={fileName} exportHeader={{ title, summary: resolvedSummary }} />\n </div>\n {legend}\n </div>\n </ChartFrame>\n )\n}\n\n/** Generic over the row type, so the column keys are checked against `data`. */\nexport const Treemap = forwardRef(TreemapImpl as (props: TreemapProps, ref: ForwardedRef<HTMLDivElement>) => ReactElement) as (<\n T extends Record<string, unknown>,\n>(\n props: TreemapProps<T> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement) & { displayName?: string }\nTreemap.displayName = \"Treemap\"\n","\"use client\"\n\n/**\n * DataTablePreset — a table (toolbar, body, pagination) over TanStack Table.\n *\n * `DataTable` is the compound form: `<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 { useLocale } from \"../hooks/use-locale\"\nimport { EMPTY_VALUE, formatDate, formatValue, type DateStyle, type ValueFormat } from \"../lib/format\"\nimport { resolveLocale, uiLanguage, type UiLanguage } from \"../lib/locale\"\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/* ------------------------------------------------------------ wording */\n\nconst TEXT = {\n ja: {\n tones: { positive: \"良好\", warning: \"注意\", negative: \"要対応\", neutral: \"中立\" } as Record<ChartTone, string>,\n toneNote: (label: string) => `(${label})`,\n selectAll: \"全て選択\",\n selectRow: \"行を選択\",\n trend: (points: number, first: string, last: string, min: string, max: string) =>\n `${points}点の推移、${first}から${last}、最小${min}、最大${max}`,\n noData: \"データがありません\",\n pageSize: (size: number) => `${size}件`,\n range: (total: number, start: number, end: number) => `${total}件中 ${start} - ${end} を表示`,\n first: \"最初\",\n previous: \"前へ\",\n next: \"次へ\",\n last: \"最後\",\n columns: \"表示する列\",\n exportCsv: \"CSV を書き出す\",\n },\n en: {\n tones: { positive: \"Good\", warning: \"Caution\", negative: \"Needs action\", neutral: \"Neutral\" } as Record<ChartTone, string>,\n toneNote: (label: string) => ` (${label})`,\n selectAll: \"Select all\",\n selectRow: \"Select row\",\n trend: (points: number, first: string, last: string, min: string, max: string) =>\n `Trend over ${points} points: ${first} to ${last}, min ${min}, max ${max}`,\n noData: \"No results.\",\n pageSize: (size: number) => `${size} / page`,\n range: (total: number, start: number, end: number) => `Showing ${start}–${end} of ${total}`,\n first: \"First\",\n previous: \"Previous\",\n next: \"Next\",\n last: \"Last\",\n columns: \"Columns\",\n exportCsv: \"Export CSV\",\n },\n} satisfies Record<UiLanguage, unknown>\n\nconst useText = () => TEXT[uiLanguage(useLocale())]\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 locale: 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, locale, { 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), locale)\n}\n\n/** 意味色ごとの記号と色クラス。Tailwind が拾えるよう、クラスはリテラルで書く。 */\nconst THRESHOLD_TONE_STYLES: Record<ChartTone, { Icon: LucideIcon; text: string }> = {\n positive: { Icon: CircleCheck, text: \"text-positive\" },\n warning: { Icon: TriangleAlert, text: \"text-warning\" },\n negative: { Icon: CircleX, text: \"text-negative\" },\n neutral: { Icon: Minus, text: \"text-neutral\" },\n}\n\n/** `meta.thresholds` 列のセル。当たった規則の意味色と記号を値に添える(当たらなければ値だけ)。 */\nfunction ThresholdCell({ value, text, thresholds }: { value: unknown; text: string; thresholds: ChartThreshold[] }) {\n const t = useText()\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 } = THRESHOLD_TONE_STYLES[tone]\n const label = t.tones[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\">{t.toneNote(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 を書き出す\"`(英語は `\"Export 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 locale = useLocale()\n const t = TEXT[uiLanguage(locale)]\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 ?? {}, locale)\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={t.selectAll}\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(checked) => row.toggleSelected(checked)}\n aria-label={t.selectRow}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n }\n\n return [selectionColumn, ...formatted]\n }, [columns, enableRowSelection, locale, t])\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 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 <SparklineSummary series={series} format={format} />\n </div>\n )\n },\n }\n}\n\n/** The sparkline cell's screen-reader text, in the page's language. */\nfunction SparklineSummary({ series, format }: { series: number[]; format: ValueFormat }) {\n const locale = useLocale()\n const f = (v: number) => formatValue(v, format, locale)\n const first = series[0] as number\n const last = series[series.length - 1] as number\n return (\n <span className=\"sr-only\">\n {TEXT[uiLanguage(locale)].trend(series.length, f(first), f(last), f(Math.min(...series)), f(Math.max(...series)))}\n </span>\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 t = useText()\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 {t.noData}\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 const t = useText()\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 / page\" (ja: \"10件\")\n // rather than the raw \"10\" under Base UI's SelectValue.\n const pageSizeItems = pageSizeOptions.map((size) => ({\n value: String(size),\n label: t.pageSize(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>{t.range(totalRows, rangeStart, rangeEnd)}</span>\n <Select\n items={pageSizeItems}\n value={String(currentPageSize)}\n onValueChange={(value) => table.setPageSize(Number(value))}\n >\n <SelectTrigger size=\"sm\" className=\"min-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 {t.first}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.previousPage()}\n disabled={isLoading || !table.getCanPreviousPage()}\n >\n {t.previous}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.nextPage()}\n disabled={isLoading || !table.getCanNextPage()}\n >\n {t.next}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => table.lastPage()}\n disabled={isLoading || !table.getCanNextPage()}\n >\n {t.last}\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 const t = useText()\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={t.columns}\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 * `\"display\"` の書式のロケールは `locale`(既定はページのロケール、`<html lang>`)。\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\", locale: localeArg }: { values?: CsvValues; scope?: CsvScope; locale?: string } = {},\n): string {\n const locale = resolveLocale(localeArg)\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, locale)\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,\n className,\n}: DataTableExportProps) {\n const { table, isLoading } = useDataTable()\n const locale = useLocale()\n\n const onClick = () => {\n const csv = tableToCsv(table, { values, scope, locale })\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 ?? TEXT[uiLanguage(locale)].exportCsv}\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 * PivotTable — a crosstab of already-aggregated rows.\n * Row dimensions down the side (nested, with merged header\n * cells), column dimensions across the top, and one or more measures in the cells (several measures become\n * sub-columns). The part does not aggregate: it only places each row in its cell, and when two rows land in the\n * same cell the later one wins.\n *\n * `highlight` shades the cells by value on a single-hue ramp (Tableau's highlight table): `true` shades every\n * measure (each on its own range), a measure name shades that one only. Numbers are right-aligned in `tabular-nums`,\n * a missing value reads「—」. The header stays visible while the table scrolls inside its box; a wide table scrolls\n * sideways inside the card. Clicking a cell calls `onSelect` with its row.\n */\nimport { useMemo, type CSSProperties } from \"react\"\n\nimport { ChartFrame } from \"../charts/chart-frame\"\nimport { TableBody, TableCell, TableHead, TableHeader, TableRow } from \"../ui/table\"\nimport { useLocale } from \"../hooks/use-locale\"\nimport { cn } from \"../lib/utils\"\nimport { toChartNumber } from \"../lib/chart-utils\"\nimport { EMPTY_VALUE, formatValue, type ValueFormat } from \"../lib/format\"\nimport { resolveLocale, uiLanguage } from \"../lib/locale\"\nimport type { ChartEmptyState, ChartSeriesColor } from \"../lib/types\"\n\n/** The lightest shade is this share of the tone mixed into the card; the darkest is the tone itself. */\nconst FLOOR_SHARE = 0.2\n/** The box height (px) while loading or empty (ChartFrame's default plot height). */\nconst DEFAULT_CHART_HEIGHT = 288\n/** From this share of the range up, a cell is dark and its text takes the card colour. */\nconst LIGHT_TEXT_FROM = 0.55\n\nexport interface PivotTableProps<T extends Record<string, unknown> = Record<string, unknown>> {\n /** 集計済みの行の配列。1 行 = 1 マス(行の次元 × 列の次元の組)。同じ組が複数あれば後の行が勝つ(合計はしない)。 */\n data: T[]\n /** 行の次元の列名(左から入れ子)。例 `[\"region\", \"category\"]`。空なら 1 行。 */\n rows: (keyof T & string)[]\n /** 列の次元の列名(上から入れ子)。例 `[\"year\"]`。空なら列の見出しは値の名前だけ。 */\n columns: (keyof T & string)[]\n /** マスに出す数値の列名。2 つ以上なら列の次元ごとに小列に分かれる。 */\n values: (keyof T & string)[]\n /** 値ごとの書式。例 `{ sales: \"currency\", margin: \"percent\" }`。無い値は `\"number\"`。 */\n formats?: Partial<Record<string, ValueFormat>>\n /** 列名・次元の値 → 表示名(見出しに反映)。 */\n labels?: Record<string, string>\n /** 値でマスを塗る(ハイライト表)。`true` で全部の値(値ごとに最小〜最大)、値の列名でその値だけ。既定 `false`。 */\n highlight?: boolean | string\n /** 塗りの色。`\"chart-1\"`〜`\"chart-5\"` か意味色。薄い → 濃いの単色。既定 `\"chart-1\"`。 */\n tone?: ChartSeriesColor\n /** マスのクリック。そのマスの行を受け取る(フィルターの操作に使う)。値の無いマスでは呼ばない。 */\n onSelect?: (row: T) => void\n /** 表の見出し。 */\n title?: string\n /** 表が言っていることの 1 文要約。 */\n summary?: string\n /** 読み込み中。スケルトンを出す。 */\n isLoading?: boolean\n /** `data` が空のときの表示。 */\n emptyState?: ChartEmptyState\n /** 表の箱の最大の高さ(px)。超えると箱の中で縦にスクロールし、見出しは上に残る。既定 480。 */\n maxHeight?: number\n className?: string\n /** スクリーンリーダー向けのラベル。省略時は見出し。 */\n ariaLabel?: string\n}\n\n/* ------------------------------------------------------------------ model */\n\nexport interface PivotModel {\n /** Distinct row-dimension tuples, in data order. One empty tuple when there are no row dimensions. */\n rowKeys: string[][]\n /** Distinct column-dimension tuples, in data order. One empty tuple when there are no column dimensions. */\n colKeys: string[][]\n /** Cell → its row (the last row naming that cell). */\n cells: Map<string, Record<string, unknown>>\n /** Each value's range over the placed cells. */\n ranges: Record<string, { min: number; max: number }>\n}\n\nconst dimText = (v: unknown) => (v === null || v === undefined || v === \"\" ? EMPTY_VALUE : String(v))\nexport const pivotCellKey = (rowKey: readonly string[], colKey: readonly string[]) => `${rowKey.join(\"\\u0001\")}\\u0000${colKey.join(\"\\u0001\")}`\n\nexport function buildPivotModel(config: {\n data: readonly Record<string, unknown>[]\n rows: readonly string[]\n columns: readonly string[]\n values: readonly string[]\n}): PivotModel {\n const { data, rows, columns, values } = config\n const rowKeys = new Map<string, string[]>()\n const colKeys = new Map<string, string[]>()\n const cells = new Map<string, Record<string, unknown>>()\n for (const row of data) {\n if (!row || typeof row !== \"object\") continue\n const rk = rows.map((d) => dimText(row[d]))\n const ck = columns.map((d) => dimText(row[d]))\n const rId = rk.join(\"\\u0001\")\n const cId = ck.join(\"\\u0001\")\n if (!rowKeys.has(rId)) rowKeys.set(rId, rk)\n if (!colKeys.has(cId)) colKeys.set(cId, ck)\n cells.set(pivotCellKey(rk, ck), row)\n }\n const ranges: Record<string, { min: number; max: number }> = {}\n for (const value of values) {\n let [lo, hi] = [Infinity, -Infinity]\n for (const row of cells.values()) {\n const n = toChartNumber(row[value])\n if (n !== null) [lo, hi] = [Math.min(lo, n), Math.max(hi, n)]\n }\n ranges[value] = { min: Number.isFinite(lo) ? lo : 0, max: Number.isFinite(hi) ? hi : 0 }\n }\n return {\n rowKeys: rowKeys.size > 0 ? [...rowKeys.values()] : [rows.map(() => EMPTY_VALUE)],\n colKeys: colKeys.size > 0 ? [...colKeys.values()] : [columns.map(() => EMPTY_VALUE)],\n cells,\n ranges,\n }\n}\n\n/** A header cell spanning consecutive keys that share the same prefix up to `level`. */\nexport interface PivotSpan {\n text: string\n /** Index of the first key it covers. */\n start: number\n span: number\n}\n\n/** The merged header cells of one level: runs of consecutive keys with the same prefix (levels 0…`level`). */\nexport function pivotSpans(keys: readonly (readonly string[])[], level: number): PivotSpan[] {\n const out: PivotSpan[] = []\n const prefix = (k: readonly string[]) => k.slice(0, level + 1).join(\"\\u0001\")\n keys.forEach((key, i) => {\n const last = out[out.length - 1]\n if (last && prefix(keys[last.start]!) === prefix(key)) last.span++\n else out.push({ text: key[level] ?? \"\", start: i, span: 1 })\n })\n return out\n}\n\nconst TEXT = {\n ja: { table: \"ピボット表\" },\n en: { table: \"Pivot table\" },\n}\n\n/* -------------------------------------------------------------- component */\n\n/** Rows not given yet (a draft fills props in steps): keep the same array between renders. */\nconst NO_ROWS: never[] = []\n\nconst asList = (v: unknown): string[] => (Array.isArray(v) ? v.filter((x): x is string => typeof x === \"string\") : [])\n\nexport function PivotTable<T extends Record<string, unknown>>({\n data = NO_ROWS,\n rows: rowDims,\n columns: colDims,\n values: valueKeys,\n formats,\n labels,\n highlight = false,\n tone = \"chart-1\",\n onSelect,\n title,\n summary,\n isLoading,\n emptyState,\n maxHeight = 480,\n className,\n ariaLabel,\n}: PivotTableProps<T>) {\n const locale = useLocale()\n const t = TEXT[uiLanguage(resolveLocale(locale))]\n const dataRows = Array.isArray(data) ? data : NO_ROWS\n const rows = useMemo(() => asList(rowDims), [rowDims])\n const columns = useMemo(() => asList(colDims), [colDims])\n const values = useMemo(() => asList(valueKeys), [valueKeys])\n const model = useMemo(() => buildPivotModel({ data: dataRows, rows, columns, values }), [dataRows, rows, columns, values])\n const label = (key: string) => labels?.[key] ?? key\n const R = rows.length\n const C = columns.length\n const V = values.length\n const valueRow = V > 1 || C === 0\n const H = C + (valueRow ? 1 : 0)\n const shaded = (value: string) => highlight === true || highlight === value\n const isEmpty = dataRows.length === 0\n const ready = !isLoading && !isEmpty\n\n const cellStyle = (value: string, n: number | null): CSSProperties | undefined => {\n if (n === null || !shaded(value)) return undefined\n const { min, max } = model.ranges[value] ?? { min: 0, max: 0 }\n const ratio = max > min ? Math.min(1, Math.max(0, (n - min) / (max - min))) : 1\n const share = Math.round((FLOOR_SHARE + (1 - FLOOR_SHARE) * ratio) * 100)\n return {\n backgroundColor: `color-mix(in oklch, var(--${tone}) ${share}%, var(--card))`,\n color: ratio >= LIGHT_TEXT_FROM ? \"var(--card)\" : undefined,\n }\n }\n\n const headerRows = Array.from({ length: H }, (_, h) => {\n const lead =\n h === H - 1\n ? rows.map((d, level) => (\n <TableHead key={`dim-${d}`} scope=\"col\" className={cn(level === 0 && \"pl-0\")}>\n {label(d)}\n </TableHead>\n ))\n : h === 0 && R > 0\n ? [<TableHead key=\"corner\" colSpan={R} rowSpan={H - 1} aria-hidden=\"true\" />]\n : []\n const cells =\n h < C\n ? pivotSpans(model.colKeys, h).map((s) => (\n <TableHead key={`c-${h}-${s.start}`} scope=\"colgroup\" colSpan={s.span * Math.max(1, V)} className=\"text-right\">\n {label(s.text)}\n </TableHead>\n ))\n : model.colKeys.flatMap((_, ci) =>\n values.map((v) => (\n <TableHead key={`v-${ci}-${v}`} scope=\"col\" className=\"text-right\">\n {label(v)}\n </TableHead>\n )),\n )\n return (\n <TableRow key={`h-${h}`} className=\"hover:bg-transparent\">\n {lead}\n {cells}\n </TableRow>\n )\n })\n\n const rowSpans = rows.map((_, level) => new Map(pivotSpans(model.rowKeys, level).map((s) => [s.start, s.span])))\n\n const body = model.rowKeys.map((rk, ri) => (\n <TableRow key={`r-${ri}`}>\n {rows.map((d, level) => {\n const span = rowSpans[level]!.get(ri)\n if (span === undefined) return null\n return (\n <TableHead key={`rh-${d}`} scope={span > 1 ? \"rowgroup\" : \"row\"} rowSpan={span} className={cn(\"align-top font-medium text-foreground\", level === 0 && \"pl-0\")}>\n {label(rk[level] ?? \"\")}\n </TableHead>\n )\n })}\n {model.colKeys.flatMap((ck, ci) =>\n values.map((v) => {\n const row = model.cells.get(pivotCellKey(rk, ck))\n const n = row ? toChartNumber(row[v]) : null\n const text = formatValue(n, formats?.[v] ?? \"number\", locale)\n return (\n <TableCell key={`c-${ci}-${v}`} className=\"text-right tabular-nums\" style={cellStyle(v, n)}>\n {onSelect && row ? (\n <button type=\"button\" className=\"w-full cursor-pointer text-right tabular-nums\" onClick={() => onSelect(row as T)}>\n {text}\n </button>\n ) : (\n text\n )}\n </TableCell>\n )\n }),\n )}\n </TableRow>\n ))\n\n return (\n <ChartFrame\n title={title}\n summary={summary}\n isLoading={isLoading ?? false}\n isEmpty={isEmpty}\n emptyState={emptyState}\n height={ready ? \"auto\" : DEFAULT_CHART_HEIGHT}\n variant=\"list\"\n plotRole=\"group\"\n ariaLabel={ariaLabel ?? title ?? t.table}\n className={className}\n >\n <div data-slot=\"pivot-table\" className=\"relative w-full overflow-auto\" style={{ maxHeight }}>\n <table data-slot=\"table\" aria-label={ariaLabel ?? title ?? t.table} className=\"w-full caption-bottom text-sm\">\n <TableHeader className=\"sticky top-0 z-10 bg-card\">{headerRows}</TableHeader>\n <TableBody>{body}</TableBody>\n </table>\n </div>\n </ChartFrame>\n )\n}\n","\"use client\"\n\n/**\n * FilterBarPreset — a whole filter row built from a `FilterConfig[]`, placed at the top of a page or section.\n *\n * `FilterBar` is the compound form: `<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 { useLocale } from \"../hooks/use-locale\"\nimport { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: {\n filters: \"フィルター\",\n selected: (count: number) => ` (${count}件選択中)`,\n remove: (filter: string, option: string) => `${filter}: ${option} を削除`,\n clear: \"クリア\",\n clearAll: \"すべてのフィルターをクリア\",\n },\n en: {\n filters: \"Filters\",\n selected: (count: number) => ` (${count} selected)`,\n remove: (filter: string, option: string) => `Remove ${filter}: ${option}`,\n clear: \"Clear\",\n clearAll: \"Clear all filters\",\n },\n}\n\nconst useText = () => TEXT[uiLanguage(useLocale())]\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 const t = useText()\n return (\n <FilterBarContext.Provider value={{ value, onChange, onClear }}>\n <div\n ref={ref}\n role=\"search\"\n aria-label={t.filters}\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 },\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 t = useText()\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 ? t.selected(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 const t = useText()\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={t.remove(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 \"Clear\" (ja: \"クリア\"). */\n label?: string\n className?: string\n}\n\nexport function FilterBarClearButton({ label, className }: FilterBarClearButtonProps) {\n const { value, onClear } = useFilterBar()\n const t = useText()\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={t.clearAll}\n data-slot=\"filter-bar-clear-button\"\n >\n {label ?? t.clear}\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. The labels, the date format, the fiscal year start and the\n * first day of the week follow the page (`<html lang>`) unless `locale` is given.\n */\nimport { forwardRef, useCallback, useMemo, useState } from \"react\"\nimport { CalendarIcon } from \"lucide-react\"\nimport {\n addMonths,\n endOfDay,\n endOfMonth,\n endOfWeek,\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 { useLocale } from \"../hooks/use-locale\"\nimport { formatDate } from \"../lib/format\"\nimport { defaultFiscalYearStartMonth, FALLBACK_LOCALE, resolveLocale, uiLanguage, weekStartsOn } from \"../lib/locale\"\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/**\n * 会計年度の開始月のフォールバック(1 月始まり)。ロケールから決まる既定は `defaultFiscalYearStartMonth`\n * (`<html lang>` が ja なら 4 月、それ以外は 1 月)。\n */\nexport const DEFAULT_FISCAL_YEAR_START_MONTH = 1\n\n/** ラベルの言語のフォールバック(英語)。`locale` を渡さなければ、ほかの部品と同じくページの `<html lang>` に従う。 */\nexport const DEFAULT_DATE_PICKER_LOCALE = FALLBACK_LOCALE\n\n/**\n * 1〜12 の整数だけを開始月として受け、それ以外は `locale` の既定(ja は 4 月、それ以外は 1 月)に戻す。\n * `locale` の既定はページのロケール(`<html lang>`)。\n */\nexport function normalizeFiscalYearStartMonth(month: number | undefined, locale?: string): number {\n return typeof month === \"number\" && Number.isInteger(month) && month >= 1 && month <= 12\n ? month\n : defaultFiscalYearStartMonth(locale)\n}\n\n/**\n * `date` を含む年度(または年度基準の四半期)の全期間。`offset` で前後にずらす(`-1` が前の年度/四半期)。\n * 年度は `fiscalYearStartMonth`(1-12)の 1 日に始まり 12 か月続く。四半期は年度の初日から 3 か月ごと。\n * `fiscalYearStartMonth` を省くと `locale`(既定はページのロケール)の既定(ja は 4 月、それ以外は 1 月)。\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 {\n unit,\n fiscalYearStartMonth,\n offset = 0,\n locale,\n }: { unit: \"year\" | \"quarter\"; fiscalYearStartMonth?: number; offset?: number; locale?: string },\n): { from: Date; to: Date } {\n const startMonth = normalizeFiscalYearStartMonth(fiscalYearStartMonth, locale)\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 TEXT = {\n ja: { placeholder: \"期間を選択\", rangeSeparator: \" - \" },\n en: { placeholder: \"Pick a date range\", rangeSeparator: \" – \" },\n}\n\n/** カレンダーに渡す date-fns の locale。`ja*` なら日本語、それ以外は react-day-picker の既定(英語)。 */\nconst calendarLocale = (locale: string) => (uiLanguage(locale) === \"ja\" ? ja : undefined)\n\n/**\n * 既定のプリセット一覧を作る。ラベルは `locale`(`ja*` なら日本語、それ以外は英語)、\n * 「今四半期」「前四半期」「今年度」「前年度」は `fiscalYearStartMonth`(省くと ja は 4 月、それ以外は 1 月)を基準にする。\n * 「今〜」は期の初日から今日まで、「前〜」「先月」「先週」は前の期の全期間。週の始まりは `locale` の慣習\n * (ja は月曜、`en-US` は日曜、`en-GB` は月曜。`weekStartsOn`)。`getValue` は押した時点の日付で計算する。\n * `locale` の既定はページのロケール(`<html lang>`、無ければ `\"en-US\"`)。\n *\n * @example\n * createDatePresets({ locale: \"ja-JP\", fiscalYearStartMonth: 4 })\n */\nexport function createDatePresets({\n locale: localeArg,\n fiscalYearStartMonth,\n now = () => new Date(),\n}: { locale?: string; fiscalYearStartMonth?: number; now?: () => Date } = {}): PresetItem[] {\n const locale = resolveLocale(localeArg)\n const t = PRESET_LABELS[uiLanguage(locale)]\n const startMonth = normalizeFiscalYearStartMonth(fiscalYearStartMonth, locale)\n const WEEK_OPTIONS = { weekStartsOn: weekStartsOn(locale) }\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/**\n * フォールバック(`en-US`:英語・1 月始まり・日曜始まり)のプリセット。DateRangePicker は `presets` を渡さなければ\n * ページのロケールからプリセットを作るので、これを渡す必要はない。`locale` / `fiscalYearStartMonth` を変えるなら\n * `createDatePresets` か DateRangePicker の同名 props。\n */\nexport const defaultPresets: PresetItem[] = createDatePresets({ locale: FALLBACK_LOCALE })\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*` なら日本語、それ以外は英語。\n * 既定はページのロケール(`<html lang>`、無ければ `\"en-US\"`)。\n *\n * @example\n * <DateRangePicker locale=\"ja-JP\" />\n */\n locale?: string\n /**\n * 年度の開始月(1-12)。「今年度」「前年度」と、年度基準の「今四半期」「前四半期」の区切りになる。\n * 既定はロケールで決まる(ja は `4`、それ以外は `1`)。範囲外・整数でない値はその既定として扱う。\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: localeProp,\n fiscalYearStartMonth,\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 locale = useLocale(localeProp)\n const t = TEXT[uiLanguage(locale)]\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 ?? t.placeholder\n if (!value.to) return formatDate(value.from, \"date\", locale)\n return `${formatDate(value.from, \"date\", locale)}${t.rangeSeparator}${formatDate(value.to, \"date\", locale)}`\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={weekStartsOn(locale)}\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 { useLocale } from \"../hooks/use-locale\"\nimport { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: { placeholder: \"選択してください\", search: \"検索...\", empty: \"見つかりませんでした\", clear: \"クリア\" },\n en: { placeholder: \"Select an option\", search: \"Search...\", empty: \"No results found.\", clear: \"Clear\" },\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 const t = TEXT[uiLanguage(useLocale())]\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 ?? t.placeholder)}</span>\n <span className=\"flex shrink-0 items-center gap-1\">\n {clearable && value && (\n <RemoveButton label={t.clear} 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 ?? t.search}\n emptyText={emptyText ?? t.empty}\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 more\" (ja: \"+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 { useLocale } from \"../hooks/use-locale\"\nimport { uiLanguage } from \"../lib/locale\"\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\nconst TEXT = {\n ja: {\n placeholder: \"選択してください\",\n search: \"検索...\",\n empty: \"見つかりませんでした\",\n remove: (label: string) => `${label}を削除`,\n more: (count: number) => `+${count}件`,\n },\n en: {\n placeholder: \"Select options\",\n search: \"Search...\",\n empty: \"No results found.\",\n remove: (label: string) => `Remove ${label}`,\n more: (count: number) => `+${count} more`,\n },\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 const t = TEXT[uiLanguage(useLocale())]\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 ?? t.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={t.remove(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 {t.more(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 ?? t.search}\n emptyText={emptyText ?? t.empty}\n />\n </PopoverContent>\n </Popover>\n </div>\n )\n})\nMultiSelect.displayName = \"MultiSelect\"\n","\"use client\"\n\n/**\n * MetricValue — the large number in a dashboard tile (with `MetricUnit`, 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\"\nimport { resolveLocale, uiLanguage, type UiLanguage } from \"./locale\"\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 RECORD_TEXT: Record<UiLanguage, (span: number, grain: PeriodGrain, lower: boolean) => string> = {\n ja: (span, grain, lower) => {\n const units: Record<PeriodGrain, string> = { day: \"日\", week: \"週\", month: \"か月\", quarter: \"四半期\", year: \"年\" }\n return `過去 ${span} ${units[grain]}で${lower ? \"最低\" : \"最高\"}`\n },\n en: (span, grain, lower) => {\n const units: Record<PeriodGrain, string> = { day: \"days\", week: \"weeks\", month: \"months\", quarter: \"quarters\", year: \"years\" }\n return `${lower ? \"Lowest\" : \"Highest\"} in ${span} ${units[grain]}`\n },\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 * `locale` picks the language of `label` (\"Highest in 12 months\" / \"過去 12 か月で最高\"); default the page's (`<html lang>`).\n */\nexport function detectRecord(\n history: ReadonlyArray<number | null | undefined> | null | undefined,\n grain: PeriodGrain = \"month\",\n polarity: Polarity = \"higher-is-better\",\n locale?: string,\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: RECORD_TEXT[uiLanguage(resolveLocale(locale))](span, grain, lower),\n }\n}\n","\"use client\"\n\n/**\n * Delta — the change of a value against a comparison, as arrow + signed change + comparison label on one line; it is not a card, so place it beside a value.\n *\n * It renders as arrow + signed\n * change + comparison label (\"↑ +12.4% vs. prior month\"; ja: \"↑ +12.4% 前月比\") on one line, in the page's\n * language (`<html lang>`) unless `locale` is given.\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 `betterWhen=\"down\"` 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\" betterWhen=\"down\"\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 { useLocale } from \"../hooks/use-locale\"\nimport { resolveLocale, uiLanguage } from \"../lib/locale\"\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 { 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-md border px-2 py-0.5 text-xs font-medium [&>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: \"border-positive/20 bg-positive-subtle dark:border-positive/25\" },\n { variant: \"badge\", sentiment: \"negative\", className: \"border-negative/20 bg-negative-subtle dark:border-negative/25\" },\n { variant: \"badge\", sentiment: \"neutral\", className: \"border-neutral/20 bg-neutral-subtle dark:border-neutral/25\" },\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 /** Which direction is good: `\"up\"` (default) or `\"down\"` (churn, error rate). Wins over `polarity`. */\n betterWhen?: \"up\" | \"down\"\n /** @deprecated Older name of `betterWhen` (`\"higher-is-better\"` / `\"lower-is-better\"`); `\"neutral\"` is only reachable here. `betterWhen` wins if both are given. */\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 and its label. Default: the page's (`<html lang>`, else `\"en-US\"`). */\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\nconst ARIA_TEXT = {\n ja: {\n none: (label: string) => `${label} 比較できません`,\n flat: (label: string) => `${label} 横ばい`,\n points: \" ポイント\",\n change: (label: string, amount: string, up: boolean) => `${label} ${amount} ${up ? \"増加\" : \"減少\"}`,\n },\n en: {\n none: (label: string) => `${label}: not comparable`,\n flat: (label: string) => `Flat ${label}`,\n points: \" points\",\n change: (label: string, amount: string, up: boolean) => `${up ? \"Up\" : \"Down\"} ${amount} ${label}`,\n },\n}\n\n/**\n * Screen-reader text, e.g. \"Up 12.4% vs. prior month\" / \"Down 0.5 points vs. prior month\" / \"Flat vs. prior month\" /\n * \"vs. prior month: not comparable\" (ja: \"前月比 12.4% 増加\" / \"前月比 0.5 ポイント 減少\" / \"前月比 横ばい\" / \"前月比 比較できません\").\n * The amount carries no sign, since the verb already says the direction (\"−0.5 ポイント 減少\" would negate twice).\n * `locale` defaults to the page's (`<html lang>`).\n */\nexport function deltaAriaLabel(\n result: ComparisonResult,\n locale?: string,\n change: ChangeDisplay = \"relative\",\n format?: ValueFormat,\n digits?: number,\n): string {\n const resolved = resolveLocale(locale)\n const t = ARIA_TEXT[uiLanguage(resolved)]\n const { label, direction, ratio } = result\n if (direction === \"none\" || ratio === null) return t.none(label)\n if (direction === \"flat\") return t.flat(label)\n const amount = formatChangeAmount(result, change, resolved, format, digits)\n if (amount === null) return t.none(label)\n return t.change(label, change === \"points\" ? amount.replace(/pt$/, t.points) : amount, direction === \"up\")\n}\n\nexport const Delta = forwardRef<HTMLSpanElement, DeltaProps>(\n (\n {\n value,\n comparison,\n betterWhen,\n polarity,\n neutralBand,\n format,\n change,\n digits,\n locale: localeProp,\n showLabel = true,\n variant = \"badge\",\n className,\n ...props\n },\n ref,\n ) => {\n const locale = useLocale(localeProp)\n // Nothing to compare against yet (a draft fills props in steps).\n if (!comparison) return null\n const result = computeComparison(value, comparison, {\n polarity: betterWhen ? (betterWhen === \"down\" ? \"lower-is-better\" : \"higher-is-better\") : polarity,\n neutralBand,\n locale,\n })\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 as a card of its own (label, value, delta, target, history), so do not put it in `DashboardCardPreset`.\n *\n * 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 * - **`betterWhen` drives everything.** With `betterWhen=\"down\"` 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 { useLocale } from \"../hooks/use-locale\"\nimport { EMPTY_VALUE, formatDate, formatDatesInText, formatDelta, formatKind, formatPoints, formatValue, type ValueFormat } from \"../lib/format\"\nimport { computeTargetProgress, detectRecord, inferPeriodGrain, type KpiPeriod } from \"../lib/insights\"\nimport { uiLanguage, type UiLanguage } from \"../lib/locale\"\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 万・億 on a ja page (USD in K・M・B otherwise); `\"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 /** Locale of the numbers and the built-in wording. Default: the page's (`<html lang>`, else `\"en-US\"`). */\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 /** Which direction is good: `\"up\"` (default) or `\"down\"` (churn, error rate). Wins over `polarity`. */\n betterWhen?: \"up\" | \"down\"\n /** @deprecated Older name of `betterWhen` (`\"higher-is-better\"` / `\"lower-is-better\"`). `\"neutral\"` (never colours the change, skips the target and record logic) is only reachable here. `betterWhen` wins if both are given. */\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 `betterWhen=\"down\"`\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/** A value this long (a huge standard-notation currency) may wrap between digit groups, and its delta then moves under it so the number gets the full row. Ordinary values stay on one line beside the delta. */\nconst LONG_VALUE_CHARS = 10\nconst DELTA_UNDER_PLACEMENT = \"col-start-1 row-span-1 row-start-3 justify-self-start\"\n// No grey footer band: value, comparison and notes share one surface, 8px apart (the footer only keeps its subgrid row).\nconst KPI_FOOTER_CLASS = \"flex-col items-start gap-2 rounded-none border-t-0 bg-transparent pt-0 text-sm\"\n\nconst PLACEHOLDER = /\\{(\\w+)\\}/g\n\nconst TEXT = {\n ja: {\n target: \"目標\",\n provisional: \"速報\",\n joiner: \"・\",\n countFrom: (count: string) => `${count}件から集計`,\n excluded: (count: string) => `${count}件を除外`,\n noBaseline: (baseline: string) => `${baseline}の実績がないため、比較できません。`,\n previous: (baseline: string, value: string) => `${baseline} ${value}`,\n noPrevious: (baseline: string) => `${baseline}の実績なし`,\n barLead: (tl: string, pct: string) => `${tl}の ${pct}`,\n pace: (pct: string) => `このペースなら ${pct}`,\n provisionalSuffix: \"(確定前)\",\n provisionalReached: (tl: string, target: string) => `${tl} ${target} に到達(確定前)`,\n provisionalSoFar: (tl: string, target: string, pct: string) => `${tl} ${target} に対して現時点 ${pct}(確定前)`,\n provisionalToGo: (tl: string, target: string, distance: string) => `${tl} ${target} まであと ${distance}(確定前)`,\n provisionalToGoRate: (tl: string, distance: string, pct: string) => `${tl}まであと ${distance}(現時点 ${pct}・確定前)`,\n met: (tl: string, target: string) => `${tl} ${target} を達成`,\n toGo: (tl: string, target: string, distance: string) => `${tl} ${target} まであと ${distance}`,\n reached: (tl: string, target: string) => `${tl} ${target} に到達`,\n reachedRate: (tl: string, target: string, pct: string) => `${tl} ${target} に到達(${pct} 達成)`,\n toGoRate: (tl: string, distance: string, pct: string) => `${tl}まであと ${distance}(${pct} 達成)`,\n progressLabel: (tl: string) => `${tl}に対する進捗`,\n progressValue: (tl: string, target: string, value: string, pct: string) => `${tl} ${target} に対して ${value}(${pct})`,\n history: (label: string, points: number) => `${label}の推移(直近 ${points} 点)`,\n updatedRelative: (relative: string) => `${relative}に更新`,\n updatedAbsolute: (absolute: string) => `${absolute} に更新`,\n updatedBoth: (absolute: string, relative: string) => `${absolute} に更新(${relative})`,\n summaryExample: \"{label}は目標の {achievement} まで来ています。\",\n },\n en: {\n target: \"Target\",\n provisional: \"Preliminary\",\n joiner: \" · \",\n countFrom: (count: string) => `Based on ${count} records`,\n excluded: (count: string) => `${count} excluded`,\n noBaseline: (baseline: string) => `No ${baseline} data to compare against.`,\n previous: (baseline: string, value: string) => `${capitalize(baseline)}: ${value}`,\n noPrevious: (baseline: string) => `No ${baseline} data`,\n barLead: (tl: string, pct: string) => `${tl}: ${pct}`,\n pace: (pct: string) => `On pace for ${pct}`,\n provisionalSuffix: \" (preliminary)\",\n provisionalReached: (tl: string, target: string) => `${tl} ${target}: reached (preliminary)`,\n provisionalSoFar: (tl: string, target: string, pct: string) => `${tl} ${target}: ${pct} so far (preliminary)`,\n provisionalToGo: (tl: string, target: string, distance: string) => `${tl} ${target}: ${distance} to go (preliminary)`,\n provisionalToGoRate: (tl: string, distance: string, pct: string) => `${tl}: ${distance} to go (${pct} so far, preliminary)`,\n met: (tl: string, target: string) => `${tl} ${target}: met`,\n toGo: (tl: string, target: string, distance: string) => `${tl} ${target}: ${distance} to go`,\n reached: (tl: string, target: string) => `${tl} ${target}: reached`,\n reachedRate: (tl: string, target: string, pct: string) => `${tl} ${target}: reached (${pct} achieved)`,\n toGoRate: (tl: string, distance: string, pct: string) => `${tl}: ${distance} to go (${pct} achieved)`,\n progressLabel: (tl: string) => `Progress toward ${tl}`,\n progressValue: (tl: string, target: string, value: string, pct: string) => `${value} of ${tl} ${target} (${pct})`,\n history: (label: string, points: number) => `${label} trend (last ${points} points)`,\n updatedRelative: (relative: string) => `Updated ${relative}`,\n updatedAbsolute: (absolute: string) => `Updated ${absolute}`,\n updatedBoth: (absolute: string, relative: string) => `Updated ${absolute} (${relative})`,\n summaryExample: \"{label} is at {achievement} of target.\",\n },\n} satisfies Record<UiLanguage, unknown>\n\ntype KpiText = (typeof TEXT)[UiLanguage]\n\nfunction capitalize(text: string): string {\n return text.charAt(0).toUpperCase() + text.slice(1)\n}\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, t: KpiText) {\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. \"${t.summaryExample}\").`,\n )\n}\n\n/** Splits formatted text after each thousands separator so a huge standard-notation value wraps between digit groups instead of clipping. The text itself is unchanged. */\nfunction digitGroups(text: string): string[] {\n return text.match(/[^,,]*[,,]|[^,,]+$/g) ?? [text]\n}\n\nexport function KpiCard({\n label,\n value,\n format,\n locale: localeProp,\n comparison: comparisonProp,\n comparisons,\n provisional,\n betterWhen,\n polarity: polarityProp,\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 locale = useLocale(localeProp)\n const t = TEXT[uiLanguage(locale)]\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 : t.provisional\n const sample = useSampleMark()\n // `betterWhen` is the documented name and wins over the older `polarity`.\n const polarity: Polarity | undefined = betterWhen ? (betterWhen === \"down\" ? \"lower-is-better\" : \"higher-is-better\") : polarityProp\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, locale)\n const sourceParts = source\n ? [\n source.period !== undefined ? formatDatesInText(source.period, locale) : undefined,\n source.count !== undefined ? t.countFrom(formatValue(source.count, \"number\", locale)) : undefined,\n source.excluded !== undefined && Number.isFinite(source.excluded) && source.excluded > 0\n ? t.excluded(formatValue(source.excluded, \"number\", locale))\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, t)\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={KPI_FOOTER_CLASS}>\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 ?? t.target\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, locale }) : null\n const baseline = graded ? comparisonBaseline(graded.vs, grain, graded.label, graded.toDate, locale) : 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 ? t.noBaseline(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 = [t.barLead(tl, pct(progress!.achievement))]\n if (projectedValue !== null && progress!.projected != null)\n parts.push(t.pace(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 ? t.provisionalReached(tl, fmt(target))\n : t.provisionalSoFar(tl, fmt(target), pct(progress.achievement))\n : byPoints\n ? t.provisionalToGo(tl, fmt(target), fmtDistance(progress.remaining))\n : t.provisionalToGoRate(tl, fmtDistance(progress.remaining), pct(progress.achievement))\n else if (lower)\n targetText = progress.achieved\n ? t.met(tl, fmt(target))\n : t.toGo(tl, fmt(target), fmtDistance(progress.remaining))\n else if (byPoints)\n targetText = progress.achieved\n ? t.reached(tl, fmt(target))\n : t.toGo(tl, fmt(target), fmtDistance(progress.remaining))\n else\n targetText = progress.achieved\n ? t.reachedRate(tl, fmt(target), pct(progress.achievement))\n : t.toGoRate(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 const valueText = fmt(value)\n const longValue = valueText.length > LONG_VALUE_CHARS\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] leading-snug font-medium text-muted-foreground\">\n {label}\n </CardDescription>\n <CardTitle\n data-slot=\"kpi-card-value\"\n title={valueText}\n className={cn(\n \"col-start-1 flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 leading-none 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 data-slot=\"kpi-card-value-text\" className={longValue ? \"min-w-0 break-words\" : \"whitespace-nowrap\"}>\n {longValue\n ? digitGroups(valueText).map((group, i) => (\n <span key={i} className=\"whitespace-nowrap\">\n {group}\n <wbr />\n </span>\n ))\n : valueText}\n </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={longValue ? DELTA_UNDER_PLACEMENT : 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 ? t.previous(baseline ?? \"\", fmt(result.previous)) : t.noPrevious(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={t.progressLabel(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={t.progressValue(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(t.joiner)}\n className=\"truncate text-sm text-muted-foreground tabular-nums\"\n >\n {bar.lead}\n {bar.pace && (\n <>\n {t.joiner}\n <span data-slot=\"kpi-card-projection\" data-estimate=\"\">{bar.pace}</span>\n </>\n )}\n {isProvisional && t.provisionalSuffix}\n </p>\n </div>\n )}\n </CardHeader>\n {hasFooter && (\n <CardFooter className={KPI_FOOTER_CLASS}>\n {summaryText && (\n <p data-slot=\"kpi-card-summary\" title={summaryText} className=\"line-clamp-2 text-sm leading-relaxed text-muted-foreground 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(t.joiner)}\n className=\"line-clamp-2 w-full text-xs leading-normal text-muted-foreground tabular-nums\"\n >\n {sourceParts.join(t.joiner)}\n </p>\n )}\n {hasUpdated && (\n <p data-slot=\"kpi-card-updated\" className=\"text-xs leading-normal text-muted-foreground\">\n {updatedAtText(updatedAt, updatedAtDisplay, locale, t, 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={t.history(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 分前)」(英語は \"Updated 3 minutes ago\" など)。 */\nfunction updatedAtText(\n updatedAt: Date | string | number,\n display: \"relative\" | \"absolute\" | \"both\",\n locale: string,\n t: KpiText,\n now: Date | number | undefined,\n timeZone?: string,\n): string {\n const relative = formatRelativeTime(updatedAt, { now, locale })\n if (display === \"relative\") return t.updatedRelative(relative)\n const absolute = formatDate(updatedAt, \"datetime\", locale, { timeZone })\n return display === \"absolute\" ? t.updatedAbsolute(absolute) : t.updatedBoth(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 { useLocale } from \"../hooks/use-locale\"\nimport { uiLanguage } from \"../lib/locale\"\nimport { cn } from \"../lib/utils\"\nimport type { TrendDirection } from \"../lib/types\"\n\nconst TEXT = {\n ja: {\n flat: (value: number) => `変化なし ${value}%`,\n up: (value: number) => `${value}% 増加`,\n down: (value: number) => `${value}% 減少`,\n },\n en: {\n flat: (value: number) => `No change ${value}%`,\n up: (value: number) => `Up ${value}%`,\n down: (value: number) => `Down ${value}%`,\n },\n}\n\nconst trendIndicatorVariants = cva(\"inline-flex items-center gap-0.5 text-sm font-medium\", {\n variants: {\n sentiment: {\n positive: \"text-positive\",\n negative: \"text-negative\",\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 t = TEXT[uiLanguage(useLocale())]\n const ariaLabel = direction === \"neutral\" ? t.flat(value) : direction === \"up\" ? t.up(value) : t.down(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 * 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","import { useInsertionEffect, useLayoutEffect, useRef, type ReactElement } from \"react\"\n\nexport interface DraftChartProps {\n /** The proposed chart: one card (e.g. `DashboardCardPreset`), as it would sit in the page. */\n children: ReactElement\n}\n\n/**\n * A chart proposed to the page that nobody has accepted yet. Accepting it removes the\n * `<DraftChart>` tags and keeps the child; removing it deletes the whole element. Both are\n * source edits made outside the framework — this component only decides what each build shows.\n *\n * - `vantage build` (published dashboards): renders nothing, so viewers never see a proposal.\n * - `vantage dev` (the editor preview): renders the child faded under the page background, and\n * marks the child's root element with `data-sq-draft` so the editor can find it and draw its\n * own controls over it. The component itself draws no buttons or text.\n */\nexport function DraftChart({ children }: DraftChartProps) {\n // Vite replaces `import.meta.env.DEV` with a literal in the app's build, so the preview below\n // drops out of published bundles — read it here, not through a variable, or the env object is\n // inlined and the preview stays in. `import.meta.env` is typed in the app's generated\n // .vantage/types, not here.\n if (!(import.meta as unknown as { env: { DEV?: boolean } }).env.DEV) return null\n return <DraftChartPreview>{children}</DraftChartPreview>\n}\n\nconst STYLE_ID = \"vantage-draft-chart\"\n\n// Keyed on the attribute rather than classes on the child: a part's `className` belongs to the\n// part (React rewrites it on re-render), while an attribute it does not set survives.\n// In `components` so the child's own utilities win — a sticky or absolute card keeps its\n// position. `isolation` keeps the overlay's z-index inside the card (it must not climb over a\n// sticky page header); `inset: -1px` reaches over the card's 1px border.\nconst DRAFT_CSS = `@layer components {\n [data-sq-draft] {\n position: relative;\n isolation: isolate;\n }\n [data-sq-draft]::after {\n content: \"\";\n position: absolute;\n inset: -1px;\n z-index: 2147483647;\n border-radius: inherit;\n background-color: var(--background);\n opacity: 0.75;\n pointer-events: none;\n transition: opacity 200ms ease;\n }\n [data-sq-draft]:hover::after {\n opacity: 0;\n }\n @media (prefers-reduced-motion: reduce) {\n [data-sq-draft]::after {\n transition: none;\n }\n }\n}`\n\nfunction DraftChartPreview({ children }: DraftChartProps) {\n const ref = useRef<HTMLDivElement>(null)\n\n useInsertionEffect(() => {\n let style = document.getElementById(STYLE_ID)\n if (!style) {\n style = document.createElement(\"style\")\n style.id = STYLE_ID\n document.head.appendChild(style)\n }\n if (style.textContent !== DRAFT_CSS) style.textContent = DRAFT_CSS\n }, [])\n\n useLayoutEffect(() => {\n const wrapper = ref.current\n if (!wrapper) return\n let marked: Element | null = null\n const mark = () => {\n const root = wrapper.firstElementChild\n if (root === marked) return\n marked?.removeAttribute(\"data-sq-draft\")\n root?.setAttribute(\"data-sq-draft\", \"\")\n marked = root\n }\n mark()\n // The child can swap its root element without this component re-rendering (a loading\n // state that renders a different element); the observer follows it before the next paint.\n const observer = new MutationObserver(mark)\n observer.observe(wrapper, { childList: true })\n return () => {\n observer.disconnect()\n marked?.removeAttribute(\"data-sq-draft\")\n }\n }, [])\n\n // `display: contents`: no box of its own, so the child stays a direct grid / flex item of the\n // page (column spans, subgrid rows) exactly as without the wrapper.\n return (\n <div ref={ref} data-slot=\"draft-chart\" style={{ display: \"contents\" }}>\n {children}\n </div>\n )\n}\n"]}