Newer
Older
client_dwatch / components / ui / StatCard.tsx
import styles from "./StatCard.module.css";

/**
 * ◎○△×のような判定色ではなく KPI の意味合い(成功/警告/失敗/参考値)を表す色分け。
 * `color` ではなく `tone` という名前にしているのは、呼び出し側が生の色コードを
 * 直書きできないようにするため(CLAUDE.md §9: 色はテーマ変数経由で指定する)。
 *
 * ★`mt`(中立)★: 良し悪しを示さない数(例: ダッシュボードの「結果待ち」。D-173)。
 *   新しい色は足さず、既存の控えめな文字色(`--tx-m` / `--tx-d`)だけを使う。
 */
export type StatTone = "ok" | "wn" | "ng" | "ac" | "mt";

interface StatCardProps {
  /** 表示する値。数値の文字列化・丸めは呼び出し側(lib/judge の displayRate 等)の責務 */
  value: string;
  label: string;
  sub?: string;
  tone: StatTone;
  onClick?: () => void;
}

/**
 * モックの Num 相当の統計カード。
 * ダッシュボード(F-01)と レポート(F-04)の KPI 4列で共用するため、
 * 画面固有のロジック(何のカードか等)は持たせない。
 */
export function StatCard({ value, label, sub, tone, onClick }: StatCardProps) {
  return (
    <div
      className={`${styles.card} ${styles[tone]} ${onClick ? styles.clickable : ""}`}
      onClick={onClick}
    >
      <div className={styles.label}>{label}</div>
      <div className={styles.value}>{value}</div>
      {sub && <div className={styles.sub}>{sub}</div>}
    </div>
  );
}