모의투자, 백테스팅 레이아웃 수정

This commit is contained in:
Macbook
2026-05-24 20:13:21 +09:00
parent 958b813f3b
commit af230a4233
23 changed files with 2394 additions and 782 deletions
+310 -92
View File
@@ -1,67 +1,296 @@
/* 모의투자 대시보드 (ptd-) — 전체 화면 고정 레이아웃, 앱 테마 변수 연동 */
.ptd-page {
/* 모의투자 — 좌측 패널·우측 탭·성과 지표 하단선 정렬 */
.bps-page .bps-main {
padding: 0 10px 10px 0;
box-sizing: border-box;
}
.bps-page .bps-right {
border: 1px solid var(--se-panel-card-border);
border-radius: 14px;
box-shadow: var(--se-panel-card-shadow), inset 0 1px 0 color-mix(in srgb, var(--se-text) 4%, transparent);
}
.bps-page .bps-footer {
margin: 0 12px 0;
}
.bps-center-content .ptd-center-fill {
height: 100%;
min-height: 0;
display: flex;
flex-direction: column;
}
.bps-center-content .ptd-chart-card {
flex: 1;
min-height: 0;
height: 100%;
border: 1px solid var(--se-border);
background: var(--se-panel-card-bg);
padding: 0;
overflow: hidden;
}
/* 중앙 — 캔들 + 보조지표 (실시간 차트 레이아웃) */
.ptd-analysis-chart {
flex: 1;
min-height: 0;
height: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
}
.ptd-analysis-chart .ptd-main-pane {
flex: 1.55;
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
.ptd-analysis-chart .ptd-sub-panes {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
border-top: 1px solid var(--sep);
overflow: hidden;
}
.ptd-analysis-chart .ptd-chart-wrap {
flex: 1;
min-height: 0;
padding: 8px 10px 0;
}
.ptd-analysis-chart .ptd-chart-canvas {
flex: 1;
min-height: 120px;
max-height: none;
}
.ptd-ind-stack {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow-y: auto;
}
.ptd-ind-row {
flex: 1;
min-height: 72px;
display: flex;
flex-direction: column;
padding: 4px 10px 6px;
border-bottom: 1px solid var(--sep);
background: color-mix(in srgb, var(--bg3) 80%, transparent);
}
.ptd-ind-row:last-child { border-bottom: none; }
.ptd-ind-row .ptd-ind-svg {
flex: 1;
min-height: 48px;
width: 100%;
}
/* 좌·우 상하단 카드 분리 */
.ptd-split-panel {
flex: 1;
min-height: 0;
height: 100%;
display: flex;
flex-direction: column;
gap: 8px;
}
.bps-panel-body--tabs {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
.bps-panel-body--tabs > .ptd-split-panel--left,
.bps-right-body > .ptd-right-body > .ptd-split-panel--right {
flex: 1;
min-height: 0;
}
.ptd-split-card {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
border: 1px solid var(--se-border, var(--border));
border-radius: 10px;
background: color-mix(in srgb, var(--se-bg-elevated, var(--bg2)) 88%, transparent);
box-shadow: inset 0 1px 0 color-mix(in srgb, var(--se-text, var(--text)) 4%, transparent);
}
.ptd-split-card-head {
flex-shrink: 0;
padding: 8px 10px;
font-size: 11px;
font-weight: 700;
color: var(--text2, var(--se-text-muted));
border-bottom: 1px solid var(--sep, var(--se-border));
}
.ptd-split-card-body {
flex: 1;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
padding: 8px 10px;
display: flex;
flex-direction: column;
gap: 8px;
}
.ptd-split-panel--right .ptd-split-card-body .ptd-ob--section {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
border: none;
background: transparent;
}
.ptd-split-panel--right .ptd-split-card-body .ptd-ob--section .ptd-ob-body {
flex: 1;
min-height: 0;
max-height: none;
overflow-y: auto;
}
.ptd-split-panel--right .ptd-order-card,
.ptd-split-panel--right .top-panel {
background: transparent;
}
.ptd-tabs--in-card {
border-bottom: none;
margin: -4px -2px 0;
}
.ptd-asset-inline {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 8px;
padding-bottom: 4px;
border-bottom: 1px solid var(--sep);
}
.ptd-asset-total--sm {
padding: 0;
font-size: 16px;
}
.ptd-asset-ret--sm {
padding: 0;
font-size: 14px;
}
/* 좌측 전략·설정 탭 */
.ptd-left-tab {
display: flex;
flex-direction: column;
gap: 10px;
}
.ptd-left-section {
display: flex;
flex-direction: column;
gap: 8px;
}
.ptd-left-section-title {
font-size: 11px;
font-weight: 700;
color: var(--text2);
padding-bottom: 4px;
border-bottom: 1px solid var(--sep);
}
.ptd-left-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
font-size: 11px;
color: var(--text2);
}
.ptd-left-field {
display: flex;
flex-direction: column;
gap: 4px;
font-size: 10px;
color: var(--text3);
}
.ptd-left-select,
.ptd-left-input {
width: 100%;
padding: 6px 8px;
border-radius: 8px;
border: 1px solid var(--border);
background: var(--bg3);
color: var(--text);
font-size: 11px;
}
.ptd-left-hint {
margin: 0;
font-size: 10px;
color: var(--accent);
}
.ptd-left-status {
margin: 0;
font-size: 10px;
color: var(--text3);
padding: 6px 8px;
border-radius: 8px;
background: var(--bg3);
}
.ptd-left-status--on {
color: #22c55e;
background: rgba(34, 197, 94, 0.1);
}
.ptd-left-reset {
width: 100%;
margin-top: 4px;
}
.bps-right-body .ptd-right-body {
flex: 1;
min-height: 0;
overflow: hidden;
display: flex;
flex-direction: column;
background: var(--bg);
color: var(--text);
padding: 8px 12px 10px;
font-family: var(--font, 'Noto Sans KR', sans-serif);
}
.ptd-page--loading {
display: flex;
align-items: center;
justify-content: center;
min-height: 320px;
color: var(--text2);
gap: 0;
padding: 0;
}
.ptd-topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 8px;
flex-shrink: 0;
}
.ptd-title { margin: 0; font-size: 18px; font-weight: 800; color: var(--text); }
.ptd-topbar-actions { display: flex; gap: 8px; flex-shrink: 0; }
.ptd-btn {
padding: 6px 10px;
border-radius: 8px;
border: 1px solid var(--border);
background: var(--bg2);
color: var(--text);
font-size: 11px;
cursor: pointer;
}
.ptd-btn:hover { background: var(--bg3); }
.ptd-btn--danger { border-color: rgba(239,68,68,0.4); color: #ef4444; }
.ptd-banner {
padding: 8px 10px;
border-radius: 8px;
margin-bottom: 8px;
font-size: 11px;
flex-shrink: 0;
}
.ptd-banner--warn {
background: rgba(251,191,36,0.1);
border: 1px solid rgba(251,191,36,0.3);
color: #fbbf24;
.bps-right-body .ptd-right-body > * {
flex: 1;
min-height: 0;
}
.ptd-metrics {
margin-bottom: 8px;
flex-shrink: 0;
.bps-right-body .ptd-right-body > .ptd-split-panel {
gap: 8px;
}
.ptd-metrics-grid {
.bps-footer .ptd-metrics-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 8px;
}
.bps-page .ptd-metric,
.se-page .ptd-metric {
background: color-mix(in srgb, var(--se-bg-elevated) 88%, transparent);
border-color: var(--se-border);
}
.bps-page .ptd-card,
.se-page .ptd-card {
background: color-mix(in srgb, var(--se-bg-elevated) 88%, transparent);
border-color: var(--se-border);
}
.bps-page .up,
.se-page .up { color: var(--se-up, #22c55e); }
.bps-page .down,
.se-page .down { color: var(--se-down, #ef4444); }
@media (max-width: 1200px) {
.bps-footer .ptd-metrics-grid { grid-template-columns: repeat(2, 1fr); }
}
/* legacy layout removed — shell handles page structure */
.ptd-metric {
display: flex;
align-items: flex-start;
@@ -78,28 +307,6 @@
.ptd-metric--up .ptd-metric-value { color: #22c55e; }
.ptd-metric--down .ptd-metric-value { color: #ef4444; }
.ptd-main {
display: grid;
grid-template-columns: minmax(220px, 260px) minmax(0, 1fr) minmax(250px, 280px);
gap: 10px;
flex: 1;
min-height: 0;
overflow: hidden;
}
.ptd-col {
display: flex;
flex-direction: column;
gap: 8px;
min-height: 0;
overflow: hidden;
}
.ptd-col--left {
overflow-y: auto;
overflow-x: hidden;
}
.ptd-col--center { min-width: 0; }
.ptd-col--right { min-width: 0; }
.ptd-card {
background: var(--bg2);
border: 1px solid var(--border);
@@ -300,23 +507,30 @@
.ptd-right-body {
flex: 1;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
overflow: hidden;
display: flex;
flex-direction: column;
gap: 8px;
padding: 8px;
gap: 0;
padding: 0;
}
.ptd-right-body > .ptd-ob--fill {
flex: 1;
min-height: 0;
margin: -8px;
margin: 0;
border: none;
border-radius: 0;
}
.ptd-order-card { flex-shrink: 0; border: none; background: transparent; }
.ptd-order-card .ptd-order-stack { padding: 0 4px 4px; }
.ptd-order-card {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow-y: auto;
border: none;
background: transparent;
}
.ptd-order-card .ptd-order-stack { padding: 0 4px 4px; flex: 1; }
.ptd-order-card .top-panel { padding: 4px 2px; background: transparent; }
.ptd-order-card .top-field { margin-bottom: 4px; }
.ptd-order-card .top-submit--buy { background: #22c55e !important; border-color: #22c55e !important; }
@@ -397,6 +611,23 @@
border: none;
background: transparent;
}
.ptd-history-card--tab {
flex: 1;
min-height: 0;
overflow: hidden;
margin: 0;
padding: 0;
}
.ptd-history-card--tab .ptd-table {
flex: 1;
min-height: 0;
display: block;
overflow-y: auto;
}
.bps-right-body > .ptd-right-body > .ptd-history-card--tab {
margin: 0;
padding: 0;
}
.ptd-history-card .ptd-table-wrap,
.ptd-history-card .ptd-table {
flex: 1;
@@ -425,16 +656,3 @@
}
.ptd-status--done { background: rgba(34,197,94,0.15); color: #22c55e; }
.ptd-page .up { color: #22c55e; }
.ptd-page .down { color: #ef4444; }
@media (max-width: 1200px) {
.ptd-page { overflow-y: auto; }
.ptd-main {
grid-template-columns: 1fr;
overflow: visible;
min-height: auto;
}
.ptd-metrics-grid { grid-template-columns: repeat(2, 1fr); }
.ptd-col--left { overflow: visible; }
}