diff --git a/src/pages/stock/Stock.css b/src/pages/stock/Stock.css index 76e4afe..885adf0 100644 --- a/src/pages/stock/Stock.css +++ b/src/pages/stock/Stock.css @@ -901,6 +901,22 @@ font-style: italic; } +.pf-nxt-badge { + display: inline-block; + margin-left: 6px; + padding: 1px 6px; + border-radius: 4px; + border: 1px solid rgba(139, 92, 246, 0.45); + background: rgba(139, 92, 246, 0.12); + color: #c4b5fd; + font-size: 10px; + font-weight: 600; + letter-spacing: 0.04em; + vertical-align: middle; + cursor: help; + white-space: nowrap; +} + .pf-edit-row { grid-column: 1 / -1; display: grid; diff --git a/src/pages/stock/components/PortfolioTab.jsx b/src/pages/stock/components/PortfolioTab.jsx index 43c016e..2104fad 100644 --- a/src/pages/stock/components/PortfolioTab.jsx +++ b/src/pages/stock/components/PortfolioTab.jsx @@ -6,6 +6,26 @@ import { } from 'recharts'; import { formatNumber, formatPercent, toNumeric, profitColorClass, numFitClass } from '../stockUtils'; +const formatPriceTime = (iso) => { + if (!iso) return ''; + const d = new Date(iso); + if (Number.isNaN(d.getTime())) return ''; + return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`; +}; + +const PriceSessionBadge = ({ session, asOf }) => { + if (session !== 'NXT_AFTER' && session !== 'NXT_PRE') return null; + const isPre = session === 'NXT_PRE'; + const label = isPre ? 'NXT 프리' : 'NXT'; + const desc = isPre ? 'NXT 프리마켓 거래가' : 'NXT 야간거래 (15:30~20:00)'; + const time = formatPriceTime(asOf); + return ( + + {label} + + ); +}; + const PortfolioTab = ({ pf, asset, handleSell, handleSaveSnapshot }) => ( <> {pf.portfolioError ? ( @@ -527,6 +547,10 @@ const PortfolioTab = ({ pf, asset, handleSell, handleSaveSnapshot }) => ( {item.current_price != null ? formatNumber(item.current_price) : '조회 실패'} +