diff --git a/app/static/index.html b/app/static/index.html index f8d1459..2968edc 100644 --- a/app/static/index.html +++ b/app/static/index.html @@ -99,693 +99,153 @@ position: fixed; top: 1rem; right: 1rem; - background: #28a745; + background: #27ae60; color: white; border: none; - padding: 0.75rem 1rem; - border-radius: 4px; + padding: 0.75rem 1.5rem; + border-radius: 6px; cursor: pointer; - font-size: 0.9rem; font-weight: 500; - z-index: 100; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + z-index: 1001; transition: background 0.3s ease; } .export-button:hover { - background: #218838; + background: #229954; } - /* Export Modal Styles */ - .form-group { - margin-bottom: 1rem; - } - - .form-group label { - display: block; - margin-bottom: 0.5rem; - font-weight: 500; - color: #333; - } - - .form-group select, - .form-group input { - width: 100%; - padding: 0.5rem; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 0.9rem; - } - - .checkbox-group { - display: flex; - flex-direction: column; - gap: 0.5rem; - margin-bottom: 1.5rem; - } - - .checkbox-group label { - display: flex; - align-items: center; - gap: 0.5rem; - font-weight: normal; - margin-bottom: 0; - } - - .modal-actions { - display: flex; - gap: 1rem; - justify-content: flex-end; - margin-top: 1.5rem; - } - - .time-range-selector { - display: flex; - gap: 0.5rem; - margin-bottom: 1rem; - padding: 1rem; - background: #f8f9fa; - border-radius: 0.5rem; - } - - .time-range-btn { - padding: 0.5rem 1rem; - border: 1px solid #ddd; + /* Header */ + .header { background: white; - border-radius: 0.25rem; - cursor: pointer; - transition: all 0.2s; + padding: 2rem; + border-bottom: 1px solid #e0e0e0; + box-shadow: 0 2px 4px rgba(0,0,0,0.1); } - .time-range-btn:hover { - background: #e9ecef; + .header h1 { + font-size: 2rem; + font-weight: 700; + color: #2c3e50; + margin-bottom: 0.5rem; } - .time-range-btn.active { - background: #007bff; - color: white; - border-color: #007bff; - } - - .page-header { - padding: 0 1rem; - } - - .container { - max-width: 1200px; - margin: 0 auto; + /* Content */ + .content { padding: 2rem; } + /* Cards */ .card { background: white; border-radius: 8px; padding: 1.5rem; margin-bottom: 1.5rem; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + box-shadow: 0 2px 8px rgba(0,0,0,0.1); + border: 1px solid #e0e0e0; } .card h2 { - color: #cc0000; + font-size: 1.5rem; + font-weight: 600; + color: #2c3e50; margin-bottom: 1rem; - font-size: 1.3rem; } - .stats-grid { + .card h3 { + font-size: 1.2rem; + font-weight: 600; + color: #34495e; + margin-bottom: 0.75rem; + } + + /* Metrics Grid */ + .metrics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-bottom: 2rem; } - .stat-card { - background: white; + .metric-card { + background: #f8f9fa; padding: 1.5rem; border-radius: 8px; text-align: center; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + border-left: 4px solid #3498db; } - .stat-number { + .metric-value { font-size: 2rem; - font-weight: bold; - color: #cc0000; - } - - .stat-label { - color: #666; - margin-top: 0.5rem; - } - - .btn { - background: #cc0000; - color: white; - border: none; - padding: 0.75rem 1.5rem; - border-radius: 4px; - cursor: pointer; - font-size: 1rem; - transition: background-color 0.2s; - } - - .btn:hover { - background: #8b0000; - } - - .btn:disabled { - background: #ccc; - cursor: not-allowed; - } - - .btn-secondary { - background: #6c757d; - } - - .btn-secondary:hover { - background: #545b62; - } - - .loading { - text-align: center; - padding: 2rem; - color: #666; - } - - .error { - background: #f8d7da; - color: #721c24; - padding: 1rem; - border-radius: 4px; - margin: 1rem 0; - } - - .success { - background: #d4edda; - color: #155724; - padding: 1rem; - border-radius: 4px; - margin: 1rem 0; - } - - .validation-item { - padding: 1rem; - border-left: 4px solid #ccc; - margin: 0.75rem 0; - background: #f8f9fa; - border-radius: 6px; - border: 1px solid #dee2e6; - } - - .validation-item.error { - border-left-color: #dc3545; - background: #f8d7da; - } - - .validation-item.warning { - border-left-color: #ffc107; - background: #fff3cd; - } - - .validation-item.critical { - border-left-color: #dc3545; - background: #f8d7da; - font-weight: bold; - } - - .validation-header { - font-weight: bold; + font-weight: 700; + color: #2c3e50; margin-bottom: 0.5rem; } - .validation-message { - color: #666; - margin-bottom: 0.5rem; - } - - .validation-recommendation { - font-style: italic; - color: #007bff; - } - - .export-section { - display: flex; - gap: 1rem; - align-items: center; - flex-wrap: wrap; - } - - .export-section select, - .export-section input { - padding: 0.5rem; - border: 1px solid #ddd; - border-radius: 4px; - } - - .table { - width: 100%; - border-collapse: collapse; - margin-top: 1rem; - } - - .table th, - .table td { - padding: 0.75rem; - text-align: left; - border-bottom: 1px solid #ddd; - } - - .table th { - background: #f8f9fa; - font-weight: 600; - } - - .severity-badge { - padding: 0.25rem 0.5rem; - border-radius: 12px; - font-size: 0.8rem; - font-weight: bold; - } - - .severity-error { - background: #f8d7da; - color: #721c24; - } - - .severity-warning { - background: #fff3cd; - color: #856404; - } - - .severity-critical { - background: #f8d7da; - color: #721c24; - } - - .hidden { - display: none; - } - - /* Accordion Styles */ - .accordion { - border: 1px solid #ddd; - border-radius: 8px; - margin-bottom: 1rem; - overflow: visible; - } - - .accordion-header { - background: #f8f9fa; - padding: 1rem 1.5rem; - cursor: pointer; - display: flex; - align-items: center; - border-bottom: 1px solid #ddd; - transition: all 0.2s; - position: relative; - gap: 1rem; - } - - .accordion-title { - flex: 0 0 auto; - font-weight: 600; - font-size: 1.1rem; - color: #333; - min-width: 0; - } - - .accordion-stats { - display: flex; - gap: 1rem; - align-items: center; - flex: 0 0 auto; - margin-left: auto; - } - - .accordion-stat { + .metric-label { font-size: 0.9rem; + color: #7f8c8d; font-weight: 500; - white-space: nowrap; - text-align: right; } - .accordion-arrow { - font-size: 1.2rem; - transition: transform 0.3s ease; - color: #6c757d; - flex: 0 0 auto; - margin-left: 0.5rem; + .metric-card.warning { + border-left-color: #f39c12; } - .accordion-header:hover { - background: #e9ecef; + .metric-card.error { + border-left-color: #e74c3c; } - .accordion-header.active .accordion-arrow { - transform: rotate(90deg); + .metric-card.success { + border-left-color: #27ae60; } - .accordion-header.active { - background: #495057; - color: white; - } - - .accordion-title { - font-weight: 600; - font-size: 1.1rem; - } - - .accordion-stats { + /* Status Overview */ + .status-overview { display: flex; + align-items: center; gap: 1rem; - font-size: 0.9rem; - } - - .accordion-actions { - display: flex; - align-items: center; - gap: 0.5rem; - } - - .accordion-stat { - background: rgba(255,255,255,0.2); - padding: 0.25rem 0.5rem; - border-radius: 4px; - } - - .accordion-content { - padding: 1rem 1.5rem; - max-height: 0; - overflow: hidden; - transition: max-height 0.3s ease; - background: white; - border-top: 1px solid #dee2e6; - } - - .accordion-content.active { - max-height: none; - overflow: visible; - padding: 1rem 1.5rem; - } - - /* Garantir que o conteΓΊdo nΓ£o seja cortado */ - .accordion-content .validation-item:last-child { - margin-bottom: 0; - } - - .accordion-content .historical-validation:last-child { - margin-bottom: 0; - } - - .pod-list { - padding: 1rem 1.5rem; - } - - .pod-item { - background: #f8f9fa; - border: 1px solid #e9ecef; - border-radius: 6px; - padding: 1rem; - margin-bottom: 0.5rem; - } - - .pod-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 0.5rem; - } - - .pod-name { - font-weight: 600; - color: #cc0000; - } - - .pod-validations-count { - background: #6c757d; - color: white; - padding: 0.25rem 0.5rem; - border-radius: 12px; - font-size: 0.8rem; - } - - .deployment-list { - padding: 1rem 1.5rem; - } - - .deployment-item { - background: #f8f9fa; - border: 1px solid #dee2e6; - border-radius: 8px; - margin-bottom: 1rem; - overflow: hidden; - } - - .deployment-header { - background: #e3f2fd; - padding: 1rem; - display: flex; - justify-content: space-between; - align-items: center; - border-bottom: 1px solid #dee2e6; - } - - .deployment-title { - font-weight: bold; - color: #1976d2; - font-size: 1.1rem; - } - - .deployment-stats { - display: flex; - gap: 1rem; - align-items: center; - } - - .deployment-stat { - font-size: 0.9rem; - color: #666; - } - - .deployment-actions { - display: flex; - align-items: center; - gap: 0.5rem; - } - - .validation-list { - margin-top: 0.5rem; - } - - .validation-item { - padding: 0.75rem; - border-left: 4px solid #ccc; - margin: 0.25rem 0; - background: white; - border-radius: 4px; - } - - .validation-item.error { - border-left-color: #dc3545; - } - - .validation-item.warning { - border-left-color: #ffc107; - } - - .validation-item.critical { - border-left-color: #dc3545; - font-weight: bold; - } - - /* Pagination Styles */ - .pagination { - display: flex; - justify-content: center; - align-items: center; - gap: 0.5rem; - margin: 2rem 0; - } - - .pagination button { - padding: 0.5rem 1rem; - border: 1px solid #ddd; - background: white; - cursor: pointer; - border-radius: 4px; - transition: all 0.2s; - } - - .pagination button:hover:not(:disabled) { - background: #f8f9fa; - } - - .pagination button:disabled { - background: #f8f9fa; - color: #6c757d; - cursor: not-allowed; - } - - /* Historical Analysis Styles */ - .historical-summary { - background: #f8f9fa; - border: 1px solid #dee2e6; - border-radius: 8px; - padding: 1rem; - margin-bottom: 1rem; - } - - .historical-summary h3 { - margin: 0 0 1rem 0; - color: #495057; - } - - .historical-stats { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 1rem; - } - - .historical-stat { - background: white; - padding: 0.75rem; - border-radius: 6px; - border-left: 4px solid #007bff; - } - - .historical-stat h4 { - margin: 0 0 0.5rem 0; - font-size: 0.9rem; - color: #6c757d; - } - - .historical-stat .value { - font-size: 1.5rem; - font-weight: bold; - color: #007bff; - } - - .historical-validation { - background: #fff3cd; - border: 1px solid #ffeaa7; - border-radius: 6px; - padding: 1rem; - margin-bottom: 0.75rem; - } - - .historical-validation.error { - background: #f8d7da; - border-color: #f5c6cb; - } - - .historical-validation.warning { - background: #fff3cd; - border-color: #ffeaa7; - } - - .historical-validation.info { - background: #d1ecf1; - border-color: #bee5eb; - } - - .historical-validation.critical { - background: #f8d7da; - border-color: #f5c6cb; - border-left: 4px solid #dc3545; - } - - .pagination button.active { - background: #cc0000; - color: white; - border-color: #cc0000; - } - - .pagination-info { - color: #666; - font-size: 0.9rem; - } - - /* Modal Styles */ - .modal { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - z-index: 1000; - display: none; - align-items: center; - justify-content: center; - } - - .modal.show { - display: flex; - } - - .modal-content { - background: white; - border-radius: 8px; - max-width: 800px; - width: 90%; - max-height: 80vh; - overflow-y: auto; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - } - - .modal-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 1rem 1.5rem; - border-bottom: 1px solid #dee2e6; - background: #f8f9fa; - } - - .modal-header h2 { - margin: 0; - color: #cc0000; - } - - .modal-close { - background: none; - border: none; - font-size: 1.5rem; - cursor: pointer; - color: #6c757d; - padding: 0; - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; - } - - .modal-close:hover { - color: #dc3545; - } - - .modal-body { + margin-bottom: 2rem; padding: 1.5rem; + background: #f8f9fa; + border-radius: 8px; + } + + .status-icon { + font-size: 3rem; + } + + .status-content h3 { + margin-bottom: 0.5rem; + font-size: 1.5rem; + } + + .status-content p { + color: #7f8c8d; + font-size: 1rem; + } + + /* Problem Summary Table */ + .problem-summary { + margin-bottom: 2rem; } - /* Filters */ .filters { display: flex; gap: 1rem; margin-bottom: 1rem; - flex-wrap: wrap; align-items: center; + flex-wrap: wrap; } .filter-group { display: flex; - flex-direction: column; - gap: 0.25rem; + align-items: center; + gap: 0.5rem; } .filter-group label { - font-size: 0.9rem; - color: #666; + font-weight: 500; + color: #34495e; } .filter-group select, @@ -793,473 +253,211 @@ padding: 0.5rem; border: 1px solid #ddd; border-radius: 4px; + font-size: 0.9rem; } - .checkbox-label { - display: flex !important; - flex-direction: row !important; + .filter-checkbox { + display: flex; align-items: center; gap: 0.5rem; - cursor: pointer; } - .checkbox-label input[type="checkbox"] { - margin: 0; - width: auto; + .filter-checkbox input[type="checkbox"] { + width: 16px; + height: 16px; } - /* Cluster Health Dashboard Styles */ - .cluster-health-section { - background: #f8f9fa; - color: #333; - padding: 2rem; - border-radius: 8px; - border-left: 4px solid #28a745; - margin-bottom: 2rem; - display: flex; - justify-content: space-between; - align-items: center; - } - - .health-status { - display: flex; - align-items: center; - gap: 1rem; - } - - .health-indicator { - font-size: 3rem; - animation: pulse 2s infinite; - } - - @keyframes pulse { - 0% { transform: scale(1); } - 50% { transform: scale(1.1); } - 100% { transform: scale(1); } - } - - .health-text h3 { - margin: 0; - font-size: 1.5rem; - font-weight: 600; - } - - .health-text p { - margin: 0.5rem 0 0 0; - color: #666; - } - - .health-metrics { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 2rem; - } - - .metric { - text-align: center; - } - - .metric-label { - display: block; - font-size: 0.9rem; - color: #666; - margin-bottom: 0.5rem; - } - - .metric-value { - display: block; - font-size: 1.5rem; - font-weight: 700; - } - - .metric-value.critical { - color: #ff6b6b; - } - - .resource-overview { - margin-bottom: 2rem; - } - - .resource-grid { - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 1.5rem; - margin-top: 1rem; - } - - .resource-card { - background: #f8f9fa; - padding: 1.5rem; - border-radius: 8px; - border-left: 4px solid #007bff; - } - - .resource-card h4 { - margin: 0 0 1rem 0; - color: #333; - } - - .resource-bar { - background: #e9ecef; - height: 8px; + .apply-filters-btn { + background: #3498db; + color: white; + border: none; + padding: 0.5rem 1rem; border-radius: 4px; - overflow: hidden; - margin-bottom: 0.5rem; - } - - .resource-fill { - height: 100%; - background: linear-gradient(90deg, #28a745, #ffc107, #dc3545); - transition: width 0.3s ease; - } - - .resource-text { - display: flex; - justify-content: space-between; - font-size: 0.9rem; - color: #666; - } - - .top-consumers { - margin-bottom: 2rem; - } - - .consumers-list { - display: grid; - gap: 0.5rem; - margin-top: 1rem; - } - - .consumer-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: 1rem; - background: #f8f9fa; - border-radius: 6px; - border-left: 4px solid #007bff; - } - - .consumer-info { - display: flex; - align-items: center; - gap: 1rem; - } - - .consumer-rank { - font-weight: 700; - color: #007bff; - } - - .consumer-name { - font-weight: 600; - } - - .consumer-namespace { - color: #666; - font-size: 0.9rem; - } - - .consumer-resources { - text-align: right; - font-size: 0.9rem; - } - - .qos-distribution { - margin-bottom: 2rem; - } - - .qos-stats { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 1rem; - margin-top: 1rem; - } - - .qos-stat { - padding: 1rem; - border-radius: 6px; - text-align: center; - } - - .qos-stat.guaranteed { - background: #d4edda; - border: 1px solid #c3e6cb; - } - - .qos-stat.burstable { - background: #fff3cd; - border: 1px solid #ffeaa7; - } - - .qos-stat.besteffort { - background: #f8d7da; - border: 1px solid #f5c6cb; - } - - .qos-label { - display: block; - font-weight: 600; - margin-bottom: 0.5rem; - } - - .qos-value { - display: block; - font-size: 1.5rem; - font-weight: 700; - } - - .resource-analysis-section { - margin-top: 2rem; - padding-top: 2rem; - border-top: 2px solid #e9ecef; - } - - /* Help Icon Styles */ - .help-icon { cursor: pointer; - color: #007bff; - font-size: 1.2rem; - margin-left: 0.5rem; - transition: color 0.2s ease; - } - - .help-icon:hover { - color: #0056b3; - } - - .help-icon-small { - cursor: pointer; - color: #007bff; - font-size: 0.9rem; - margin-left: 0.3rem; - transition: color 0.2s ease; - } - - .help-icon-small:hover { - color: #0056b3; - } - - /* Help Modal Styles */ - .help-modal-content { - max-width: 600px; - } - - .help-content { - line-height: 1.6; - } - - .help-content h3 { - color: #007bff; - margin: 1.5rem 0 1rem 0; - font-size: 1.2rem; - } - - .help-content h4 { - color: #333; - margin: 1rem 0 0.5rem 0; - font-size: 1.1rem; - } - - .help-content p { - margin: 0.5rem 0; - color: #555; - } - - .help-content ul { - margin: 0.5rem 0; - padding-left: 1.5rem; - } - - .help-content li { - margin: 0.3rem 0; - color: #555; - } - - .help-content .highlight { - background: #fff3cd; - padding: 0.2rem 0.4rem; - border-radius: 3px; font-weight: 500; + transition: background 0.3s ease; } - .help-content .warning { - background: #f8d7da; - padding: 0.2rem 0.4rem; - border-radius: 3px; - font-weight: 500; + .apply-filters-btn:hover { + background: #2980b9; } - .help-content .success { - background: #d4edda; - padding: 0.2rem 0.4rem; - border-radius: 3px; - font-weight: 500; - } - - /* Smart Recommendations Styles */ - .validation-details { - display: flex; - gap: 1rem; - margin: 0.5rem 0; - flex-wrap: wrap; - } - - .detail-item { - font-size: 0.9rem; - color: #666; - } - - .implementation-steps { - margin: 1rem 0; - padding: 1rem; - background: #f8f9fa; - border-radius: 6px; - border-left: 4px solid #007bff; - } - - .implementation-steps ol { - margin: 0.5rem 0 0 1rem; - } - - .implementation-steps li { - margin: 0.25rem 0; - } - - .kubectl-commands { - margin: 1rem 0; - padding: 1rem; - background: #f8f9fa; - border-radius: 6px; - border-left: 4px solid #28a745; - } - - .kubectl-commands pre { - margin: 0.5rem 0 0 0; - background: #2d3748; - color: #e2e8f0; - padding: 0.75rem; - border-radius: 4px; + /* Table Styles */ + .table-container { overflow-x: auto; - font-size: 0.85rem; + border-radius: 8px; + border: 1px solid #e0e0e0; } - .vpa-yaml { - margin: 1rem 0; - padding: 1rem; + table { + width: 100%; + border-collapse: collapse; + background: white; + } + + th { background: #f8f9fa; - border-radius: 6px; - border-left: 4px solid #ffc107; - } - - .vpa-yaml pre { - margin: 0.5rem 0 0 0; - background: #2d3748; - color: #e2e8f0; - padding: 0.75rem; - border-radius: 4px; - overflow-x: auto; - font-size: 0.85rem; - } - - /* Workload Categories Styles */ - .workload-list { - padding: 1rem 0; - } - - .workload-item { - background: #f8f9fa; - border: 1px solid #e9ecef; - border-radius: 6px; padding: 1rem; - margin-bottom: 0.75rem; - } - - .workload-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 0.5rem; - } - - .workload-name { + text-align: left; font-weight: 600; - color: #cc0000; - font-size: 1.1rem; + color: #2c3e50; + border-bottom: 2px solid #e0e0e0; } - .workload-namespace { - color: #666; - font-size: 0.9rem; + td { + padding: 1rem; + border-bottom: 1px solid #f0f0f0; } - .workload-details { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 0.75rem; + tr:hover { + background: #f8f9fa; } - .workload-stat { - font-size: 0.9rem; - } - - .badge { - padding: 0.25rem 0.5rem; + /* Severity Badges */ + .severity-badge { + padding: 0.25rem 0.75rem; border-radius: 12px; font-size: 0.8rem; - font-weight: bold; + font-weight: 600; text-transform: uppercase; } - .badge.success { - background: #d4edda; - color: #155724; + .severity-critical { + background: #ffebee; + color: #c62828; } - .badge.info { - background: #d1ecf1; - color: #0c5460; + .severity-error { + background: #ffebee; + color: #d32f2f; } - .badge.warning { - background: #fff3cd; - color: #856404; + .severity-warning { + background: #fff3e0; + color: #f57c00; } - .badge.error { - background: #f8d7da; - color: #721c24; - } - - .badge.critical { - background: #f8d7da; - color: #721c24; - font-weight: bold; - } - - /* Severity Info */ .severity-info { - background: #d1ecf1; - color: #0c5460; + background: #e3f2fd; + color: #1976d2; } - .severity-badge.severity-info { - background: #d1ecf1; - color: #0c5460; + /* Action Buttons */ + .action-buttons { + display: flex; + gap: 0.5rem; } + .btn { + padding: 0.5rem 1rem; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 0.9rem; + font-weight: 500; + transition: all 0.3s ease; + text-decoration: none; + display: inline-flex; + align-items: center; + gap: 0.5rem; + } + + .btn-primary { + background: #3498db; + color: white; + } + + .btn-primary:hover { + background: #2980b9; + } + + .btn-success { + background: #27ae60; + color: white; + } + + .btn-success:hover { + background: #229954; + } + + .btn-warning { + background: #f39c12; + color: white; + } + + .btn-warning:hover { + background: #e67e22; + } + + .btn-sm { + padding: 0.25rem 0.75rem; + font-size: 0.8rem; + } + + /* Quick Actions */ + .quick-actions { + display: flex; + gap: 1rem; + margin-top: 2rem; + flex-wrap: wrap; + } + + .quick-action-btn { + background: #34495e; + color: white; + border: none; + padding: 1rem 1.5rem; + border-radius: 8px; + cursor: pointer; + font-weight: 500; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 0.75rem; + } + + .quick-action-btn:hover { + background: #2c3e50; + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0,0,0,0.15); + } + + /* Loading States */ + .loading { + text-align: center; + padding: 2rem; + color: #7f8c8d; + } + + .loading::after { + content: ''; + display: inline-block; + width: 20px; + height: 20px; + border: 2px solid #f3f3f3; + border-top: 2px solid #3498db; + border-radius: 50%; + animation: spin 1s linear infinite; + margin-left: 0.5rem; + } + + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } + + /* Responsive */ @media (max-width: 768px) { - .container { - padding: 1rem; + .sidebar { + transform: translateX(-100%); } - - .stats-grid { - grid-template-columns: 1fr; + + .main-content { + margin-left: 0; } - - .export-section { - flex-direction: column; - align-items: stretch; + + .metrics-grid { + grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); } .filters { @@ -1267,377 +465,32 @@ align-items: stretch; } - .accordion-stats { + .quick-actions { flex-direction: column; - gap: 0.25rem; } - - .pod-header { - flex-direction: column; - align-items: flex-start; - gap: 0.5rem; - } - } - - /* Simplified View Styles */ - .view-mode-toggle { - display: flex; - gap: 0.5rem; - margin-bottom: 2rem; - padding: 0.5rem; - background: #f8f9fa; - border-radius: 8px; - } - - .mode-btn { - padding: 0.75rem 1.5rem; - border: 2px solid #e9ecef; - background: white; - color: #6c757d; - border-radius: 6px; - cursor: pointer; - font-weight: 500; - transition: all 0.2s ease; - } - - .mode-btn.active { - background: #007bff; - color: white; - border-color: #007bff; - } - - .mode-btn:hover:not(.active) { - background: #f8f9fa; - border-color: #007bff; - color: #007bff; - } - - .health-summary { - margin-bottom: 2rem; - } - - .summary-stats { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); - gap: 1rem; - } - - .stat-card { - display: flex; - align-items: center; - padding: 1rem; - border-radius: 8px; - border: 2px solid; - background: white; - } - - .stat-card.excellent { - border-color: #28a745; - background: #f8fff9; - } - - .stat-card.good { - border-color: #28a745; - background: #f8fff9; - } - - .stat-card.medium { - border-color: #ffc107; - background: #fffdf5; - } - - .stat-card.poor { - border-color: #fd7e14; - background: #fff8f5; - } - - .stat-card.critical { - border-color: #dc3545; - background: #fff5f5; - } - - .stat-icon { - font-size: 2rem; - margin-right: 1rem; - } - - .stat-content { - flex: 1; - } - - .stat-number { - font-size: 2rem; - font-weight: 700; - line-height: 1; - } - - .stat-label { - font-size: 0.9rem; - color: #6c757d; - margin-top: 0.25rem; - } - - .pod-cards-container { - display: grid; - gap: 1rem; - } - - .pod-health-card { - background: white; - border: 2px solid #e9ecef; - border-radius: 12px; - padding: 1.5rem; - transition: all 0.2s ease; - } - - .pod-health-card:hover { - box-shadow: 0 4px 12px rgba(0,0,0,0.1); - transform: translateY(-2px); - } - - .pod-health-card.excellent { - border-color: #28a745; - } - - .pod-health-card.good { - border-color: #28a745; - } - - .pod-health-card.medium { - border-color: #ffc107; - } - - .pod-health-card.poor { - border-color: #fd7e14; - } - - .pod-health-card.critical { - border-color: #dc3545; - } - - .pod-header { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 1rem; - } - - .pod-name { - font-size: 1.2rem; - font-weight: 600; - color: #333; - } - - .pod-namespace { - font-size: 0.9rem; - color: #6c757d; - margin-top: 0.25rem; - } - - .health-score { - display: flex; - align-items: center; - gap: 0.5rem; - } - - .health-score-value { - font-size: 1.5rem; - font-weight: 700; - } - - .health-status { - font-size: 0.9rem; - color: #6c757d; - } - - .resource-display { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 1rem; - margin-bottom: 1rem; - } - - .resource-item { - display: flex; - align-items: center; - gap: 0.5rem; - } - - .resource-icon { - font-size: 1.2rem; - } - - .resource-text { - flex: 1; - } - - .resource-label { - font-size: 0.9rem; - color: #6c757d; - margin-bottom: 0.25rem; - } - - .resource-value { - font-size: 1rem; - font-weight: 500; - } - - .pod-actions { - display: flex; - gap: 0.5rem; - margin-top: 1rem; - } - - .action-btn { - padding: 0.5rem 1rem; - border: 1px solid #007bff; - background: white; - color: #007bff; - border-radius: 6px; - cursor: pointer; - font-size: 0.9rem; - transition: all 0.2s ease; - } - - .action-btn:hover { - background: #007bff; - color: white; - } - - .action-btn.primary { - background: #007bff; - color: white; - } - - .action-btn.primary:hover { - background: #0056b3; - } - - .technical-details { - margin-top: 2rem; - } - - .technical-details.hidden { - display: none; - } - - .technical-card { - background: white; - border: 1px solid #e9ecef; - border-radius: 8px; - padding: 1.5rem; - margin-bottom: 1rem; - } - - .technical-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 1rem; - padding-bottom: 0.5rem; - border-bottom: 1px solid #e9ecef; - } - - .validation-groups { - display: grid; - gap: 1rem; - } - - .validation-group { - padding: 1rem; - border-radius: 6px; - border-left: 4px solid; - } - - .validation-group.critical { - background: #fff5f5; - border-left-color: #dc3545; - } - - .validation-group.warning { - background: #fffdf5; - border-left-color: #ffc107; - } - - .validation-group.info { - background: #f8f9fa; - border-left-color: #6c757d; - } - - .validation-group-title { - font-weight: 600; - margin-bottom: 0.5rem; - } - - .validation-list { - list-style: none; - padding: 0; - } - - .validation-item { - padding: 0.5rem 0; - border-bottom: 1px solid #e9ecef; - } - - .validation-item:last-child { - border-bottom: none; - } - - .oc-command { - background: #f8f9fa; - border: 1px solid #e9ecef; - border-radius: 4px; - padding: 0.75rem; - font-family: 'Courier New', monospace; - font-size: 0.9rem; - margin-top: 0.5rem; - word-break: break-all; - } - - .copy-btn { - background: #28a745; - color: white; - border: none; - padding: 0.25rem 0.5rem; - border-radius: 4px; - cursor: pointer; - font-size: 0.8rem; - margin-left: 0.5rem; - } - - .copy-btn:hover { - background: #218838; }
-