feat: 보유종목 행도 NXT/KRX 텍스트 → 거래가능 초록점 (미리보기와 동일)

- _render_holding_row: px badge를 px-dot 초록점으로 통일. 활성 시장 판정(mark)은
  OHLC 미니테이블 컬럼 강조(active_market)용으로만 남겨 OHLC 표시는 그대로 유지
- 더 이상 쓰이지 않는 .px-mark/.px-nxt/.px-krx CSS 제거, CSS 주석 갱신
- 라이브 owner 패널 27개 보유행 전부 초록점 확인

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hyowons
2026-06-15 11:38:39 +09:00
parent 904ae5c415
commit ef477d878c
+12 -10
View File
@@ -2665,15 +2665,20 @@ def _render_holding_row(r: dict, total_value: int, show_day_change: bool = False
f'<dt>당일 등락</dt><dd class="num"><span class="{dcls} rt-daychange">{dsign}{day_change:,}' f'<dt>당일 등락</dt><dd class="num"><span class="{dcls} rt-daychange">{dsign}{day_change:,}'
f'({dsign}{day_change_pct:.2f}%)</span></dd>' f'({dsign}{day_change_pct:.2f}%)</span></dd>'
) )
# 가격 출처 마크 — cur_price 가 어느 시장 응답 가격과 일치하는지로 판정. # 활성 시장 판정 — OHLC 미니테이블 컬럼 강조용(active_market). cur_price 가 어느 시장 가격과 일치하는지.
# NXT 미거래 종목(ohlc_nxt 빈 dict 또는 NXT price==KRX price)은 KRX 마크.
nxt_p = (r.get('ohlc_nxt') or {}).get('price', 0) nxt_p = (r.get('ohlc_nxt') or {}).get('price', 0)
krx_p = (r.get('ohlc_krx') or {}).get('price', 0) krx_p = (r.get('ohlc_krx') or {}).get('price', 0)
if nxt_p and nxt_p == price and nxt_p != krx_p: mark = 'NXT' if (nxt_p and nxt_p == price and nxt_p != krx_p) else 'KRX'
mark = 'NXT' # 거래가능 표시 — 지금 거래시간이면 초록점, 아니면 점 없음. (미리보기 행과 동일 규칙)
# 정규장: KRX+NXT 모두 거래 → 초록점 / NXT 시간대: NXT 거래종목(ohlc_nxt 가격 살아있음)만 / 장외·휴장·주말: 점 없음
_phase = _market_phase_state()['phase']
if _phase == 'regular':
_tradable = True
elif _phase == 'nxt':
_tradable = bool(nxt_p)
else: else:
mark = 'KRX' _tradable = False
mark_html = f'<span class="px-mark px-{mark.lower()}">{mark}</span>' mark_html = '<span class="px-dot tradable" title="지금 거래 가능"></span>' if _tradable else ''
# OHLC mini-table — ka10095 NX/NXT batch 결과를 각 컬럼에 분리 표시. 활성 시장만 밝게. # OHLC mini-table — ka10095 NX/NXT batch 결과를 각 컬럼에 분리 표시. 활성 시장만 밝게.
# _nxt_inactive 마커는 stock_portfolio_report의 NX 응답 기반 판정이라 ETF처럼 NXT 정상거래 종목도 # _nxt_inactive 마커는 stock_portfolio_report의 NX 응답 기반 판정이라 ETF처럼 NXT 정상거래 종목도
@@ -4257,12 +4262,9 @@ details.row + .section-label { margin-top: 14px; padding-top: 24px; border-top-c
.ohlc-mini.ohlc-dual .ohlc-cell.ohlc-dim .ohlc-price { color: #5a5e69; } .ohlc-mini.ohlc-dual .ohlc-cell.ohlc-dim .ohlc-price { color: #5a5e69; }
.ohlc-mini.ohlc-dual .ohlc-cell.ohlc-dim .ohlc-pct { color: #5a5e69 !important; } .ohlc-mini.ohlc-dual .ohlc-cell.ohlc-dim .ohlc-pct { color: #5a5e69 !important; }
.ohlc-mini.ohlc-dual .ohlc-cell-empty.ohlc-dim { color: #3a3e48; } .ohlc-mini.ohlc-dual .ohlc-cell-empty.ohlc-dim { color: #3a3e48; }
/* 미리보기 현재가 왼쪽 출처 마크 NXT(파랑톤) / KRX(회색톤). 어두운 채도로 보조 정보 강조 X. */ /* 현재가 왼쪽 거래가능 표시 지금 거래시간이면 초록점, 아니면 없음. (미리보기·보유 공용) */
.px-dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; margin-right: 5px; vertical-align: 1px; } .px-dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; margin-right: 5px; vertical-align: 1px; }
.px-dot.tradable { background: #2ecc71; box-shadow: 0 0 4px rgba(46,204,113,0.6); } .px-dot.tradable { background: #2ecc71; box-shadow: 0 0 4px rgba(46,204,113,0.6); }
.px-mark { font-size: 8px; font-weight: 600; margin-right: 4px; padding: 1px 3px; border-radius: 2px; background: #14171f; vertical-align: 2px; letter-spacing: 0.3px; }
.px-mark.px-nxt { color: #2d5a8a; }
.px-mark.px-krx { color: #4a4e58; }
.dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex: none; box-shadow: 0 0 6px currentColor; } .dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; flex: none; box-shadow: 0 0 6px currentColor; }
.dot-1 { background: #f5d423; color: rgba(245,212,35,0.5); } .dot-1 { background: #f5d423; color: rgba(245,212,35,0.5); }