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)
: '조회 실패'}
+