- 예측 오버레이: 라인 시리즈 3개 (median/q10/q90) 를 단일 캔들 시리즈 하나로 합쳤다. 합성 OHLC: open=직전 close, close=point_close, high=ci_high, low=ci_low. 옅은 색 (up #fda4af / down #93c5fd) 으로 실 캔들과 시각 톤은 같고 명도만 낮춰 "어우러지되 미래"임이 보이게. - 예측 프리셋 단순화: 단기/중기/장기 + 직접입력 다 떼고 15일/30일/1년 3개로. 백엔드 horizon cap 30 → 252 로 확장 (1년 = 240 거래일). - PriceHero: 종목명/현재가/등락 큰 글씨 헤더. KR 관례대로 상승=빨강, 하락=파랑. - PeriodTabs: 1일/1주/1달/3달/1년/5년/최대 7탭. 기존 interval+days 이중 컨트롤 제거. 5년·최대 는 자동으로 주봉/월봉으로 폴백. - 차트 본체 캔들 색조도 KR 관례 (적/청) 로 통일. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
"use client";
|
|
|
|
import type { ChartInterval } from "../lib/api";
|
|
|
|
// 7-탭 기간 셀렉터. 각 탭이 (interval, days) 쌍으로 풀린다.
|
|
// 1D 만 10분봉, 5Y/MAX 는 자동으로 주봉/월봉 사용 (포인트 수 폭주 방지).
|
|
|
|
export type Period = "1D" | "1W" | "1M" | "3M" | "1Y" | "5Y" | "ALL";
|
|
|
|
type PeriodSpec = { id: Period; label: string; interval: ChartInterval; days: number };
|
|
|
|
const PERIODS: PeriodSpec[] = [
|
|
{ id: "1D", label: "1일", interval: "10m", days: 1 },
|
|
{ id: "1W", label: "1주", interval: "1d", days: 7 },
|
|
{ id: "1M", label: "1달", interval: "1d", days: 30 },
|
|
{ id: "3M", label: "3달", interval: "1d", days: 90 },
|
|
{ id: "1Y", label: "1년", interval: "1d", days: 365 },
|
|
{ id: "5Y", label: "5년", interval: "1w", days: 365 * 5 },
|
|
{ id: "ALL", label: "최대", interval: "1mo", days: 365 * 20 },
|
|
];
|
|
|
|
export function periodSpec(id: Period): PeriodSpec {
|
|
return PERIODS.find((p) => p.id === id) ?? PERIODS[2];
|
|
}
|
|
|
|
type Props = {
|
|
value: Period;
|
|
onChange: (id: Period, interval: ChartInterval, days: number) => void;
|
|
};
|
|
|
|
export function PeriodTabs({ value, onChange }: Props) {
|
|
return (
|
|
<div className="inline-flex rounded-full border border-zinc-800 bg-zinc-900 p-1 text-xs">
|
|
{PERIODS.map((p) => {
|
|
const active = value === p.id;
|
|
return (
|
|
<button
|
|
key={p.id}
|
|
onClick={() => onChange(p.id, p.interval, p.days)}
|
|
className={
|
|
active
|
|
? "rounded-full bg-zinc-700 px-3 py-1 font-medium text-zinc-50"
|
|
: "rounded-full px-3 py-1 text-zinc-400 hover:text-zinc-100"
|
|
}
|
|
>
|
|
{p.label}
|
|
</button>
|
|
);
|
|
})}
|
|
</div>
|
|
);
|
|
}
|