DomesticSummary.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import './domestic-summary.scss';
  2. import { moveDir, formatFlucRate, formatIndexClose } from '@/types/worldIndex';
  3. import { type DomesticIndexRow, formatIndexChange, formatCount } from '@/types/domesticSummary';
  4. // 국내 증시 요약 — 코스피/코스닥/KOSPI200 카드. 지수값·전일비·등락률 + 등락종목수(코스피/코스닥만).
  5. // (투자자별 순매수·베이시스는 미지원으로 제외)
  6. type Props = {
  7. rows: DomesticIndexRow[];
  8. };
  9. const ARROW = { up: '▲', down: '▼', flat: '–' } as const;
  10. export default function DomesticSummary({ rows }: Props)
  11. {
  12. if (rows.length === 0) {
  13. return null;
  14. }
  15. return (
  16. <section className='dsum' aria-label='국내 증시 요약'>
  17. <div className='dsum__grid'>
  18. {rows.map((row) => {
  19. const dir = moveDir(row.flucRateBp);
  20. const hasBreadth = row.advances !== null && row.advances !== undefined;
  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. {hasBreadth && (
  33. <div className='dsum__breadth'>
  34. <span className='dsum__b'>상한 <em className='dsum__b--up'>{formatCount(row.limitUp)}</em></span>
  35. <span className='dsum__b'>상승 <em className='dsum__b--up'>{formatCount(row.advances)}</em></span>
  36. <span className='dsum__b'>보합 <em>{formatCount(row.unchanged)}</em></span>
  37. <span className='dsum__b'>하락 <em className='dsum__b--down'>{formatCount(row.declines)}</em></span>
  38. <span className='dsum__b'>하한 <em className='dsum__b--down'>{formatCount(row.limitDown)}</em></span>
  39. </div>
  40. )}
  41. </div>
  42. );
  43. })}
  44. </div>
  45. </section>
  46. );
  47. }