/* 공통 스타일 - 모든 페이지에서 사용 */ /* 기본 레이아웃 */ body { margin: 0; padding: 0; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f5f5f5; } /* 컨테이너 */ .app-container { width: 100%; height: 100vh; display: flex; flex-direction: column; } .main-container { width: 100%; height: 100vh; display: flex; flex-direction: column; } .main-content { flex: 1; display: flex; overflow: hidden; } /* 헤더 */ .header-panel { background: white; padding: 15px 20px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); flex-shrink: 0; } /* 패널 */ .left-panel { background: white; display: flex; flex-direction: column; box-shadow: 2px 0 4px rgba(0,0,0,0.1); overflow: hidden; } .right-panel { flex: 1; position: relative; } .control-panel { position: absolute; background: rgba(255, 255, 255, 0.95); padding: 15px; border-radius: 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.2); z-index: 1000; } /* 카드 */ .metric-card { background: white; border-radius: 8px; padding: 20px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); margin-bottom: 20px; transition: transform 0.2s; } .metric-card:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0,0,0,0.15); } .stat-card { background: white; padding: 15px 20px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.15); text-align: center; } /* 통계 */ .stat-number { font-size: 1.8em; font-weight: bold; color: #007bff; margin: 5px 0; } .stat-label { color: #6c757d; font-size: 0.85em; text-transform: uppercase; letter-spacing: 0.5px; } .metric-value { font-size: 2.5rem; font-weight: bold; color: #007bff; } .metric-label { color: #6c757d; font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.5px; } /* 상태 표시 */ .status-normal { color: #28a745; } .status-warning { color: #ffc107; } .status-critical { color: #dc3545; } .status-badge { font-size: 0.875rem; padding: 0.25rem 0.5rem; border-radius: 4px; } .status-completed { background-color: #28a745; color: white; } .status-failed { background-color: #dc3545; color: white; } .status-started { background-color: #ffc107; color: black; } .status-stopped { background-color: #6c757d; color: white; } /* 로딩 */ .loading { text-align: center; padding: 50px; color: #6c757d; } .no-data { text-align: center; padding: 50px; color: #6c757d; } /* 에러 메시지 */ .error-message { background: #f8d7da; color: #721c24; padding: 12px; border-radius: 4px; margin: 20px 0; } /* 툴팁 */ .tooltip-popup { position: absolute; background: rgba(0, 0, 0, 0.9); color: white; padding: 10px 15px; border-radius: 6px; font-size: 0.85em; pointer-events: none; z-index: 9999; max-width: 300px; line-height: 1.4; box-shadow: 0 2px 8px rgba(0,0,0,0.3); } .tooltip-popup .tooltip-header { font-weight: 600; margin-bottom: 5px; color: #ffc107; } .tooltip-popup .tooltip-row { margin: 2px 0; } /* 차트 컨테이너 */ .chart-container { position: relative; height: 400px; margin-bottom: 20px; } /* 테이블 */ .table-container { max-height: 600px; overflow-y: auto; } .sticky-header th { position: sticky; top: 0; background: white; z-index: 10; } /* 스크롤바 스타일링 */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: #f1f1f1; } ::-webkit-scrollbar-thumb { background: #888; border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: #555; } /* 반응형 그리드 */ .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 15px; margin-bottom: 20px; } /* 버튼 그룹 */ .action-buttons { padding: 15px; border-bottom: 1px solid #e0e0e0; flex-shrink: 0; display: flex; gap: 10px; } /* 범례 */ .legend-panel { position: absolute; background: white; padding: 15px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.15); z-index: 1000; } .legend-title { font-weight: 600; margin-bottom: 10px; font-size: 0.9em; color: #333; } .legend-item { display: flex; align-items: center; margin-bottom: 6px; font-size: 0.85em; } .legend-color { width: 16px; height: 16px; border-radius: 3px; margin-right: 8px; flex-shrink: 0; } /* 유틸리티 클래스 */ .text-center { text-align: center; } .text-muted { color: #6c757d; } .mb-0 { margin-bottom: 0; } .mb-2 { margin-bottom: 0.5rem; } .mb-3 { margin-bottom: 1rem; } .mt-2 { margin-top: 0.5rem; } .w-100 { width: 100%; } .d-flex { display: flex; } .flex-1 { flex: 1; } .gap-2 { gap: 0.5rem; }