Sparkline.tsx 912 B

123456789101112131415161718192021222324252627282930313233
  1. // 미니 막대 스파크라인 — 시계열 값 배열을 최대값 대비 비율 높이 막대로 표시 (RSC, 순수 표시).
  2. // 차트 라이브러리 없이 SCSS(.market__spark) 만으로 렌더. null 은 0 높이.
  3. interface Props {
  4. values: (number|null)[];
  5. label?: string;
  6. }
  7. export default function Sparkline({ values, label }: Props)
  8. {
  9. const nums = values.map(v => (v === null || v === undefined ? 0 : v));
  10. const max = Math.max(...nums, 0);
  11. if (nums.length === 0 || max === 0) {
  12. return <div className='market__spark-empty'>추이 데이터 없음</div>;
  13. }
  14. return (
  15. <div className='market__spark' role='img' aria-label={label ?? '값 추이'}>
  16. {nums.map((v, index) => {
  17. const height = Math.max((v / max) * 100, v > 0 ? 4 : 0);
  18. return (
  19. <span
  20. key={index}
  21. className='market__spark-bar'
  22. style={{ height: `${height}%` }}
  23. />
  24. );
  25. })}
  26. </div>
  27. );
  28. }