// ───────────────────────────────────────────────────────────── // D6 §5.1 — 고밀도 DataTable 스타일 (components/table/DataTable.tsx) // 원칙: 행 구분 하단 1px 선만(세로선·zebra 없음, nof1/monotaro), 숫자열 우측 정렬 + tabular-nums, // sticky thead, 밀도 3단(html[data-density] 변수: --row-h/--cell-fs/--cell-px), // 우선순위 낮은 열 mobile drop(data-priority='low'), 포인트 컬러는 등락에 미사용. // ───────────────────────────────────────────────────────────── .data-table { width: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; // caption — 기본 sr-only(접근성), captionVisible 시 표시 .data-table__caption { padding: var(--sp-3) 0; font-size: var(--fs-sm); color: var(--text-muted); text-align: left; caption-side: top; } .data-table__caption--sr { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; } thead th { position: sticky; top: 0; z-index: 1; height: var(--row-h); padding: 0 var(--cell-px); font-size: var(--cell-fs); font-weight: 600; color: var(--text-muted); background: var(--bg-elevated); border-bottom: 1px solid var(--border-strong); white-space: nowrap; } tbody td { height: var(--row-h); padding: 0 var(--cell-px); font-size: var(--cell-fs); color: var(--text-primary); border-bottom: 1px solid var(--border-light); white-space: nowrap; } // 정렬 (data-align) — 헤더/바디 공통 [data-align='left'] { text-align: left; } [data-align='right'] { text-align: right; } [data-align='center'] { text-align: center; } tbody tr:hover { background: var(--bg-subtle-hover); } .data-table__row--clickable { cursor: pointer; } // 정렬 가능 헤더 버튼 .data-table__sort { display: inline-flex; align-items: center; gap: var(--sp-2); padding: 0; font: inherit; color: inherit; background: none; border: none; cursor: pointer; &:hover { color: var(--text-secondary); } } .data-table__sort-icon { font-size: var(--fs-2xs); color: var(--text-muted); } // 이름/제목 셀 — 말줄임 (가변 폭) .data-table__cell--name { max-width: 0; width: 40%; } // 빈 상태 .data-table__empty { padding: var(--sp-7) var(--sp-5); font-size: var(--fs-base); color: var(--text-muted); text-align: center; } // 우선순위 낮은 열 mobile drop (<768px) @media (max-width: 767.98px) { [data-priority='low'] { display: none; } } } // ── 종목 셀 (StockRow) ── .stock-cell { display: flex; align-items: center; gap: var(--sp-3); min-height: var(--row-h); color: var(--text-primary); &:hover .stock-cell__name { text-decoration: underline; } &__name { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } &__code { flex: 0 0 auto; font-size: var(--fs-xs); color: var(--text-muted); font-variant-numeric: tabular-nums; } } // ── 게시글 셀 (PostRow) ── .post-cell { display: flex; align-items: center; gap: var(--sp-2); min-height: var(--row-h); color: var(--text-primary); &:hover .post-cell__subject { text-decoration: underline; } &__prefix { flex: 0 0 auto; color: var(--text-muted); } &__subject { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } &__comments { flex: 0 0 auto; font-size: var(--fs-xs); color: var(--az-accent); font-variant-numeric: tabular-nums; } } // ── 등락 표시 (PriceChange) — 색 + 부호 병행 (색맹 대응), 포인트 컬러 미사용 ── .price-change { display: inline-flex; align-items: baseline; gap: 2px; font-variant-numeric: tabular-nums; &__symbol { font-size: var(--fs-2xs); } &--up { color: var(--price-up); } &--down { color: var(--price-down); } &--flat { color: var(--price-flat); } } // 정렬/페이지 전환 중 목록 흐림 — useTransition isPending 동안(스켈레톤 플래시 없이 현재 데이터 유지) .data-table--pending { opacity: 0.55; transition: opacity 0.15s ease; pointer-events: none; }