/* ── 전략 평가 — btd-page 레이아웃 위 보조 스타일 ─────────────────────────── */ /* ── 좌측 패널 접기 ───────────────────────────────────────────────────────── */ .seval-left-wrap { display: flex; flex-direction: row; align-items: stretch; flex-shrink: 0; min-height: 0; height: 100%; position: relative; z-index: 8; } .seval-left-sidebar { width: 0; flex: 0 0 0; min-width: 0; max-width: 0; padding: 0; border-right: none; overflow: hidden; transition: width 0.22s cubic-bezier(0.4, 0, 0.2, 1), flex-basis 0.22s cubic-bezier(0.4, 0, 0.2, 1), max-width 0.22s cubic-bezier(0.4, 0, 0.2, 1); } .seval-left-sidebar--open { width: var(--seval-left-width, 380px); flex: 0 0 var(--seval-left-width, 380px); max-width: var(--seval-left-width, 380px); padding: 10px 8px; border-right: 1px solid var(--btd-divider, var(--se-border)); } .seval-left-wrap .se-panel-handle { align-self: center; flex-shrink: 0; position: relative; z-index: 20; width: 16px; height: 56px; border: 1px solid var(--se-border); color: var(--se-text-muted); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.15s, color 0.15s, box-shadow 0.15s, border-color 0.15s; padding: 0; background: transparent; } .seval-left-wrap .se-panel-handle--left { margin-left: -1px; background: var(--se-bg-elevated, var(--bg2)); border-left: none; border-radius: 0 8px 8px 0; box-shadow: 2px 0 10px rgba(0, 0, 0, 0.35); } .seval-left-wrap .se-panel-handle--left:hover { color: var(--se-text); background: var(--se-bg-muted, var(--bg3)); box-shadow: 3px 0 14px rgba(0, 0, 0, 0.45); } .seval-left-wrap--open .se-panel-handle--left, .seval-left-wrap .se-panel-handle--left.se-panel-handle--open { border-color: color-mix(in srgb, var(--se-accent, #3d9be9) 30%, var(--se-border)); } .seval-main--left-collapsed { flex: 1; min-width: 0; } .seval-left-panel { height: 100%; } .seval-main-content { flex: 1; min-height: 0; display: flex; flex-direction: column; padding: 8px 10px; } .seval-main-content .seval-chart { flex: 1; min-height: 0; } .seval-chart { display: flex; flex-direction: column; min-height: 0; } .seval-chart-body { flex: 1; min-height: 0; } .seval-chart-toolbar { flex-shrink: 0; display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 10px; border-bottom: 1px solid var(--btd-divider, var(--se-border)); background: var(--se-header-bg, var(--se-bg-elevated)); } .seval-chart-toolbar-run { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0; flex: 1; } .seval-chart-strategy-select { flex: 1 1 140px; max-width: 220px; min-width: 120px; } .seval-chart-bar-time { display: inline-flex; align-items: center; gap: 6px; font-size: 0.68rem; color: var(--btd-gold, var(--se-gold)); padding: 4px 8px; border-radius: 6px; border: 1px solid color-mix(in srgb, var(--btd-gold, var(--se-gold)) 35%, var(--se-border)); background: color-mix(in srgb, var(--btd-gold, var(--se-gold)) 8%, transparent); white-space: nowrap; } .seval-chart-bar-time--loading { border-color: color-mix(in srgb, var(--se-accent, #3d9be9) 45%, var(--se-border)); color: var(--se-text-muted); } .seval-chart-bar-spinner { flex-shrink: 0; } .seval-chart-hint { font-size: 0.66rem; color: var(--se-text-muted); white-space: nowrap; } /* btd-analysis-canvas-wrap--live: tv-chart-wrap 높이 (backtestDashboard.css) */ .seval-chart-signal-count { font-size: 0.66rem; font-weight: 600; color: #3fb950; white-space: nowrap; } .seval-chart-backtest-busy { font-size: 0.66rem; color: var(--se-text-muted); white-space: nowrap; } .seval-chart-status { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 0.8rem; color: var(--se-text-muted); } .seval-chart-status--error { color: #f85149; } .seval-chart-bottom-toolbar { flex-shrink: 0; display: flex; align-items: center; justify-content: center; gap: 8px; padding: 8px 10px; border-top: 1px solid var(--btd-divider, var(--se-border)); background: var(--se-header-bg, var(--se-bg-elevated)); } .seval-chart-nav--step { min-width: 88px; } .seval-chart-bottom-divider { width: 1px; height: 20px; background: var(--btd-divider, var(--se-border)); } .seval-chart-count { font-size: 0.68rem; color: var(--se-text-muted); font-variant-numeric: tabular-nums; } /* ── 세로 선택바 ─────────────────────────────────────────────────────────── */ .seval-bar-selector-layer { position: absolute; inset: 0; pointer-events: none; z-index: 24; } .seval-bar-selector { position: absolute; pointer-events: auto; touch-action: none; cursor: grab; border-radius: 4px; overflow: hidden; background: linear-gradient( 180deg, rgba(212, 160, 23, 0.04) 0%, rgba(255, 193, 37, 0.18) 45%, rgba(212, 160, 23, 0.22) 50%, rgba(255, 193, 37, 0.18) 55%, rgba(212, 160, 23, 0.04) 100% ); border: 1px solid rgba(212, 160, 23, 0.28); box-shadow: inset 0 0 28px rgba(255, 193, 37, 0.12), 0 0 18px rgba(212, 160, 23, 0.08); transition: box-shadow 0.15s, border-color 0.15s; } .seval-bar-selector:hover { border-color: rgba(212, 160, 23, 0.45); } .seval-bar-selector--dragging { cursor: grabbing; border-color: rgba(255, 193, 37, 0.55); } .seval-bar-selector__shine { position: absolute; inset: 0; background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.06) 50%, transparent 100%); pointer-events: none; } .seval-bar-selector__handle { position: absolute; top: 8px; bottom: 8px; left: 50%; width: 2px; transform: translateX(-50%); border-radius: 1px; background: linear-gradient(180deg, rgba(255, 193, 37, 0.15) 0%, rgba(255, 193, 37, 0.65) 50%, rgba(255, 193, 37, 0.15) 100%); pointer-events: none; } .seval-bar-selector__label { position: absolute; top: 6px; left: 50%; transform: translateX(-50%); padding: 2px 6px; border-radius: 4px; font-size: 0.62rem; font-weight: 600; white-space: nowrap; color: #ffe082; background: rgba(13, 17, 23, 0.72); border: 1px solid rgba(212, 160, 23, 0.35); pointer-events: none; } /* ── 우측 시그널 패널 ───────────────────────────────────────────────────── */ .seval-right-panel { display: flex; flex-direction: column; min-height: 0; } .seval-signal-head { flex-shrink: 0; display: flex; align-items: center; gap: 8px; padding: 4px 4px 8px; font-size: 0.72rem; font-weight: 700; color: var(--se-text-muted); } .seval-signal-market { color: var(--se-text); } .seval-live-dot { width: 8px; height: 8px; border-radius: 50%; background: #3fb950; box-shadow: 0 0 8px #3fb950; } .seval-live-dot--loading { background: var(--se-accent, #3d9be9); box-shadow: 0 0 8px color-mix(in srgb, var(--se-accent, #3d9be9) 55%, transparent); animation: seval-live-pulse 0.9s ease-in-out infinite; } .seval-live-label { margin-left: auto; font-size: 0.68rem; font-weight: 600; color: #3fb950; } .seval-live-label--loading { color: var(--se-accent, #3d9be9); } @keyframes seval-live-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.55; transform: scale(0.88); } } .seval-signal-body { position: relative; flex: 1; min-height: 0; display: flex; flex-direction: column; } .seval-eval-loading { position: absolute; inset: 0; z-index: 6; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; background: color-mix(in srgb, var(--se-bg, #0d1117) 78%, transparent); backdrop-filter: blur(2px); pointer-events: none; } .seval-eval-loading-spinner { width: 18px; height: 18px; border-width: 2px; color: var(--se-accent, #3d9be9); } .seval-eval-loading-text { font-size: 0.72rem; font-weight: 600; color: var(--se-text-muted); } .seval-signal-panel { flex: 1; min-height: 0; overflow-y: auto; padding: 0 2px; } .seval-signal-panel--loading { opacity: 0.42; pointer-events: none; user-select: none; } .seval-eval-error { margin: 0 4px 8px; font-size: 0.72rem; color: #f85149; } .seval-signal-footer { flex-shrink: 0; display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 4px 4px; border-top: 1px solid var(--btd-divider, var(--se-border)); font-size: 0.68rem; color: var(--se-text-muted); } .seval-strategy-chip { max-width: 55%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 4px 8px; border-radius: 999px; border: 1px solid var(--btd-divider, var(--se-border)); background: var(--btd-surface, var(--se-input-bg)); color: var(--se-text); } .seval-right-panel .vtd-sig-panel-wrap { height: auto; } /* ── 전략설정 탭 ─────────────────────────────────────────────────────────── */ .seval-settings-tab { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; } .seval-settings-head { flex-shrink: 0; padding: 4px 2px 8px; } .seval-settings-strategy { margin: 0; font-size: 0.78rem; font-weight: 700; color: var(--se-text); } .seval-settings-hint { margin: 4px 0 0; font-size: 0.64rem; line-height: 1.35; color: var(--se-text-muted); } .seval-settings-list { flex: 1; min-height: 0; overflow-y: auto; padding: 0 2px 8px; } .seval-settings-card { margin-bottom: 6px; border-radius: 8px; border: 1px solid var(--btd-divider, var(--se-border)); background: var(--btd-surface, var(--se-palette-card-bg)); overflow: hidden; } .seval-settings-card--open { border-color: color-mix(in srgb, var(--btd-gold, var(--se-gold)) 30%, var(--se-border)); } .seval-settings-card-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; width: 100%; padding: 10px; border: none; background: transparent; color: var(--se-text); cursor: pointer; text-align: left; } .seval-settings-card-title { font-size: 0.76rem; font-weight: 600; } .seval-settings-card-type { font-size: 0.62rem; color: var(--se-text-muted); } .seval-settings-card-body { padding: 0 6px 10px; border-top: 1px solid var(--btd-divider, var(--se-border)); } .seval-settings-card-body .ism-row { padding: 6px 4px; } .seval-settings-reset-type { margin-top: 4px; padding: 4px 8px; border: none; background: transparent; color: var(--se-text-muted); font-size: 0.66rem; cursor: pointer; text-decoration: underline; } .seval-settings-actions { flex-shrink: 0; display: flex; gap: 8px; padding: 8px 2px 4px; border-top: 1px solid var(--btd-divider, var(--se-border)); } .seval-settings-save, .seval-settings-reset { flex: 1; padding: 9px 10px; border-radius: 8px; font-size: 0.74rem; font-weight: 600; cursor: pointer; } .seval-settings-save { border: 1px solid color-mix(in srgb, var(--btd-gold, var(--se-gold)) 45%, var(--se-border)); background: color-mix(in srgb, var(--btd-gold, var(--se-gold)) 12%, var(--se-input-bg)); color: var(--btd-gold, var(--se-gold)); } .seval-settings-save:disabled, .seval-settings-reset:disabled { opacity: 0.45; cursor: not-allowed; } .seval-settings-reset { border: 1px solid var(--btd-divider, var(--se-border)); background: var(--btd-surface, var(--se-input-bg)); color: var(--se-text-muted); } @media (max-width: 960px) { .seval-chart-hint { display: none; } }