"use client"; /** * 통계 카드 서브타입 컴포넌트 * * 상태별 건수 표시 (대기/진행/완료 등) * 각 카테고리별 색상 및 링크 지원 */ import React from "react"; import type { DashboardItem } from "../../types"; import { TEXT_ALIGN_CLASSES } from "../../types"; import { abbreviateNumber } from "../utils/formula"; // ===== Props ===== export interface StatCardProps { item: DashboardItem; /** 카테고리별 건수 맵 (카테고리 label -> 건수) */ categoryData: Record; } // ===== 기본 색상 팔레트 ===== const DEFAULT_STAT_COLORS = [ "#6366f1", // indigo "#f59e0b", // amber "#10b981", // emerald "#ef4444", // rose "#8b5cf6", // violet ]; // ===== 메인 컴포넌트 ===== export function StatCardComponent({ item, categoryData }: StatCardProps) { const { visibility, statConfig, itemStyle } = item; const categories = statConfig?.categories ?? []; const total = Object.values(categoryData).reduce((sum, v) => sum + v, 0); // 라벨 정렬만 사용자 설정 const labelAlignClass = TEXT_ALIGN_CLASSES[itemStyle?.labelAlign ?? "center"]; return (
{/* 라벨 - 사용자 정렬 적용 */} {visibility.showLabel && (

{item.label}

)} {/* 총합 - @container 반응형 */} {visibility.showValue && (

{abbreviateNumber(total)}

)} {/* 카테고리별 건수 */}
{categories.map((cat, index) => { const count = categoryData[cat.label] ?? 0; const color = cat.color ?? DEFAULT_STAT_COLORS[index % DEFAULT_STAT_COLORS.length]; return (
{/* 색상 점 */} {/* 라벨 + 건수 */} {cat.label} {abbreviateNumber(count)}
); })}
{/* 보조 라벨 (단위 등) */} {visibility.showSubLabel && (

{visibility.showUnit && item.kpiConfig?.unit ? `단위: ${item.kpiConfig.unit}` : ""}

)}
); }