전략평가 화면 수정

This commit is contained in:
Macbook
2026-06-12 18:13:25 +09:00
parent b560b9de5c
commit a3f0584e72
13 changed files with 742 additions and 106 deletions
@@ -5,6 +5,9 @@ import { coerceFiniteNumber } from '../../utils/safeFormat';
interface Props {
metrics: ConditionMetric[];
/** 전략평가 등 — 고정 높이 컴팩트 목록 */
listClassName?: string;
scrollWrap?: boolean;
}
const IconMismatch = () => (
@@ -33,13 +36,16 @@ const IconMatch = () => (
</svg>
);
const VirtualConditionList: React.FC<Props> = ({ metrics }) => {
const VirtualConditionList: React.FC<Props> = ({ metrics, listClassName = '', scrollWrap = false }) => {
if (metrics.length === 0) {
return <p className="vtd-heat-list-empty vtd-muted"> </p>;
}
return (
<ul className="vtd-heat-list" aria-label="전략 지표 매치율">
const list = (
<ul
className={['vtd-heat-list', listClassName].filter(Boolean).join(' ')}
aria-label="전략 지표 매치율"
>
{metrics.map(({ row, status, matchRate }) => {
const tier = resolveHeatTier(matchRate, status);
const pct = Math.min(100, Math.max(0, coerceFiniteNumber(matchRate) ?? 0));
@@ -68,6 +74,12 @@ const VirtualConditionList: React.FC<Props> = ({ metrics }) => {
})}
</ul>
);
if (scrollWrap) {
return <div className="seval-heat-list-scroll">{list}</div>;
}
return list;
};
export default VirtualConditionList;
@@ -19,6 +19,8 @@ interface Props {
backendMatchRate?: number | null;
/** DSL 전체 Rule 충족 — 헤드라인 일치율·신호등 우선 */
overallMet?: boolean | null;
/** 전략평가 — 지표 목록 고정 높이·스크롤 */
compactIndicatorList?: boolean;
className?: string;
panelClassName?: string;
}
@@ -28,6 +30,7 @@ const VirtualSignalMatchVisual: React.FC<Props> = ({
title,
backendMatchRate,
overallMet,
compactIndicatorList = false,
className = '',
panelClassName = '',
}) => {
@@ -60,7 +63,11 @@ const VirtualSignalMatchVisual: React.FC<Props> = ({
<VirtualSignalEqualizer matchRate={matchRate} />
</div>
<div className="vtd-sig-visual-pane vtd-sig-visual-heat">
<VirtualConditionList metrics={metrics} />
<VirtualConditionList
metrics={metrics}
listClassName={compactIndicatorList ? 'vtd-heat-list--seval-compact' : ''}
scrollWrap={compactIndicatorList}
/>
</div>
<div className="vtd-sig-visual-pane vtd-sig-visual-light">
<div ref={lightRef} className="vtd-sig-light-rail">