DomesticSummary.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import './domestic-summary.scss';
  2. import { moveDir, formatFlucRate, formatIndexClose } from '@/types/worldIndex';
  3. import { type DomesticIndexRow, formatIndexChange } from '@/types/domesticSummary';
  4. import Sparkline from './Sparkline';
  5. // 국내·글로벌 증시 요약 — 코스피/코스닥/KOSPI200 + S&P500/나스닥 카드.
  6. // 지수값·전일비·등락률 + 카드 하단 스파크라인. 등락색 --price-up/down(상승 적/하락 청).
  7. type Props = {
  8. rows: DomesticIndexRow[];
  9. };
  10. const ARROW = { up: '▲', down: '▼', flat: '–' } as const;
  11. export default function DomesticSummary({ rows }: Props)
  12. {
  13. if (rows.length === 0) {
  14. return null;
  15. }
  16. return (
  17. <section className='dsum' aria-label='국내·글로벌 증시 요약'>
  18. <div className='dsum__grid'>
  19. {rows.map((row) => {
  20. const dir = moveDir(row.flucRateBp);
  21. return (
  22. <div key={row.key} className='dsum__card'>
  23. <div className='dsum__name'>{row.name}</div>
  24. <div className='dsum__price'>
  25. <span className={`dsum__value dsum__value--${dir}`}>{formatIndexClose(row.close)}</span>
  26. <span className={`dsum__chg dsum__chg--${dir}`}>
  27. <i className='dsum__arrow' aria-hidden='true'>{ARROW[dir]}</i>
  28. {formatIndexChange(row.changeVal)}
  29. <em className='dsum__rate'>{formatFlucRate(row.flucRateBp)}</em>
  30. </span>
  31. </div>
  32. <div className='dsum__spark'>
  33. <Sparkline data={row.spark} dir={dir} />
  34. </div>
  35. </div>
  36. );
  37. })}
  38. </div>
  39. </section>
  40. );
  41. }