"use client"; // 종목 페이지 상단 가격 헤더. // 표시: 종목명 / (코드·시장) / 현재가 / 전일대비 + 우측에 sparkline. // 한국 거래소 관행대로 상승=빨강, 하락=파랑. import { Sparkline } from "./Sparkline"; type Props = { name: string; code: string; market: string; current: number | null; prev: number | null; asOf?: string | null; // 헤더 우측 sparkline 용 종가 시계열 (오래된 → 최신 순). 비어 있으면 미표시. series?: number[]; // social-proof — "오늘 N명이 봤어요" 배지. null/0 이면 숨김. viewsToday?: number | null; // 오늘(또는 마지막 봉) 흐름 요약. page.tsx 에서 ohlcv 끝부분으로 계산해 전달. // null 이면 strip 자체를 숨김 (데이터 없음 + 레이아웃 jitter 방지). flow?: { open: number; high: number; low: number; volume: number } | null; }; // 거래량 한국식 단위 (억/만) — StockChart 의 fmtKVolume 과 같은 규칙. 둘 다 작아서 // 별도 모듈로 빼지 않고 사용처에 인라인 유지. function fmtVolume(n: number): string { if (!Number.isFinite(n) || n <= 0) return "-"; if (n >= 1e8) return `${(n / 1e8).toFixed(1)}억`; if (n >= 1e4) return `${(n / 1e4).toFixed(1)}만`; return n.toLocaleString(); } export function PriceHero({ name, code, market, current, prev, asOf, series, viewsToday, flow, }: Props) { const change = current != null && prev != null ? current - prev : null; const pct = change != null && prev ? (change / prev) * 100 : null; const tone = change == null || change === 0 ? "text-zinc-400" : change > 0 ? "text-rose-400" : "text-sky-400"; const arrow = change == null || change === 0 ? "—" : change > 0 ? "▲" : "▼"; return (
{code} · {market}

{name}

{current != null ? current.toLocaleString() : "-"} {change != null && pct != null && ( {arrow} {Math.abs(change).toLocaleString()}{" "} ({pct >= 0 ? "+" : ""} {pct.toFixed(2)}%) )}
{asOf && 기준 {asOf}} {viewsToday != null && viewsToday > 0 && ( 오늘 {viewsToday.toLocaleString()} 명이 봤어요 )}
{flow && ( // 오늘의 흐름 요약 — 시/고/저/거래량 4-KPI mini strip. 차트 hover 없이도 진입 즉시 보임. // 고/저 가격 자체에는 색을 칠하지 않음 (양수/음수 의미가 없으므로 톤이 거짓 신호가 됨). // 대신 라벨만 sky-300(저) / rose-300(고) 으로 살짝 칠해 직관 보조.
시{" "} {flow.open.toLocaleString()} {" "} {flow.high.toLocaleString()} {" "} {flow.low.toLocaleString()} 거래량{" "} {fmtVolume(flow.volume)}
)}
{series && series.length >= 2 && ( )}
); }