* { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f5f5f5; color: #333; line-height: 1.6; } header { background: #2c3e50; color: white; padding: 1rem 2rem; } header h1 { font-size: 1.5rem; font-weight: 600; } header p { font-size: 0.875rem; opacity: 0.8; } .header-domain { font-size: 0.9rem; font-weight: 400; opacity: 0.7; } main { max-width: 1400px; margin: 2rem auto; padding: 0 1rem; } /* Upload section */ .upload-area { border: 2px dashed #ccc; border-radius: 8px; padding: 3rem; text-align: center; background: white; transition: border-color 0.3s, background 0.3s; } .upload-area.dragover { border-color: #3498db; background: #ebf5fb; } .upload-area button { background: #3498db; color: white; border: none; padding: 0.75rem 1.5rem; border-radius: 4px; cursor: pointer; font-size: 1rem; margin: 1rem 0; } .upload-area button:hover { background: #2980b9; } .upload-area .hint { font-size: 0.8rem; color: #888; } #upload-status { margin-top: 1rem; text-align: center; padding: 0.5rem; } #upload-status.error { color: #e74c3c; } #upload-status.success { color: #27ae60; } /* Parsers info */ .parsers-info { margin-top: 1.5rem; text-align: center; } .parsers-title { font-size: 0.85rem; color: #666; margin-bottom: 0.5rem; } .parsers-list { display: flex; flex-wrap: wrap; gap: 0.5rem; justify-content: center; } .parser-item { display: inline-flex; align-items: center; gap: 0.5rem; background: #f8f9fa; padding: 0.4rem 0.8rem; border-radius: 4px; border: 1px solid #e0e0e0; } .parser-name { font-size: 0.85rem; color: #2c3e50; } .parser-version { font-size: 0.75rem; color: #888; background: #e8e8e8; padding: 0.1rem 0.4rem; border-radius: 3px; } /* Tabs */ .tabs { display: flex; border-bottom: 2px solid #ddd; margin-bottom: 1rem; flex-wrap: wrap; } .tab { padding: 0.75rem 1.5rem; background: none; border: none; cursor: pointer; font-size: 1rem; color: #666; border-bottom: 2px solid transparent; margin-bottom: -2px; } .tab:hover { color: #333; } .tab.active { color: #3498db; border-bottom-color: #3498db; } .tab-content { display: none; background: white; border-radius: 8px; padding: 1rem; } .tab-content.active { display: block; } /* Toolbar */ .toolbar { display: flex; gap: 1rem; margin-bottom: 1rem; align-items: center; flex-wrap: wrap; } .toolbar select, .toolbar button { padding: 0.5rem 1rem; border-radius: 4px; font-size: 0.875rem; } .toolbar select { border: 1px solid #ddd; } .toolbar button { background: #27ae60; color: white; border: none; cursor: pointer; } .toolbar button:hover { background: #219a52; } /* Tables */ table { width: 100%; border-collapse: collapse; } th, td { padding: 0.75rem; text-align: left; border-bottom: 1px solid #eee; } th { background: #f8f9fa; font-weight: 600; } tr:hover { background: #f8f9fa; } code { font-family: 'Monaco', 'Menlo', monospace; font-size: 0.85em; background: #f0f0f0; padding: 0.1em 0.3em; border-radius: 3px; } /* Severity badges */ .severity { padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; } .severity.critical { background: #e74c3c; color: white; } .severity.warning { background: #f39c12; color: white; } .severity.info { background: #3498db; color: white; } /* Category badges */ .category-badge { display: inline-block; padding: 0.2rem 0.5rem; border-radius: 4px; font-size: 0.75rem; font-weight: 500; background: #95a5a6; color: white; } .category-badge.board { background: #2c3e50; } .category-badge.cpu { background: #e74c3c; } .category-badge.memory { background: #3498db; } .category-badge.storage { background: #27ae60; } .category-badge.pcie { background: #e67e22; } .category-badge.network { background: #1abc9c; } .category-badge.psu { background: #f39c12; } .category-badge.fru { background: #9b59b6; } .category-badge.firmware { background: #34495e; } /* Toolbar label */ .toolbar-label { font-size: 0.875rem; color: #666; } /* Config sections */ .config-section { margin-bottom: 1.5rem; } .config-section h3 { font-size: 1rem; color: #2c3e50; margin-bottom: 0.5rem; border-bottom: 1px solid #eee; padding-bottom: 0.25rem; } /* Specification section */ .spec-section { background: #f8f9fa; border-radius: 8px; padding: 1rem; border-left: 4px solid #3498db; } .spec-list { list-style: none; margin: 0; padding: 0; } .spec-list li { padding: 0.4rem 0; border-bottom: 1px dashed #e0e0e0; } .spec-list li:last-child { border-bottom: none; } .spec-category { font-weight: 600; color: #2c3e50; min-width: 180px; display: inline-block; } .spec-qty { color: #666; font-weight: 500; } .card { background: #f8f9fa; padding: 1rem; border-radius: 4px; margin-bottom: 0.5rem; } /* Sensors */ .sensor-group { margin-bottom: 1.5rem; } .sensor-group h3 { font-size: 1rem; color: #2c3e50; margin-bottom: 0.75rem; } .sensor-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 0.5rem; } .sensor-card { display: flex; flex-direction: column; padding: 0.5rem 0.75rem; border-radius: 4px; background: #f8f9fa; border-left: 3px solid #27ae60; } .sensor-card.ok { border-left-color: #27ae60; } .sensor-card.warn { border-left-color: #f39c12; } .sensor-card.ns { border-left-color: #95a5a6; opacity: 0.6; } .sensor-name { font-size: 0.75rem; color: #666; } .sensor-value { font-size: 1rem; font-weight: 600; color: #2c3e50; } /* Footer */ footer { text-align: center; padding: 2rem; } .footer-buttons { display: flex; gap: 0.5rem; justify-content: center; flex-wrap: wrap; } .footer-info { margin-top: 1rem; font-size: 0.8rem; color: #666; } .footer-info a { color: #3498db; text-decoration: none; } .footer-info a:hover { text-decoration: underline; } #clear-btn { background: #e74c3c; color: white; border: none; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer; } #clear-btn:hover { background: #c0392b; } #restart-btn { background: #3498db; color: white; border: none; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer; } #restart-btn:hover { background: #2980b9; } #exit-btn { background: #95a5a6; color: white; border: none; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer; } #exit-btn:hover { background: #7f8c8d; } /* Utility */ .hidden { display: none !important; } .no-data { text-align: center; color: #888; padding: 2rem; } /* Server info header */ .server-info { background: #2c3e50; color: white; padding: 1rem 1.5rem; border-radius: 8px 8px 0 0; margin-bottom: 0; display: flex; gap: 2rem; flex-wrap: wrap; } .server-info-item { display: flex; align-items: center; gap: 0.5rem; } .server-info-label { opacity: 0.8; font-size: 0.875rem; } .server-info strong { font-size: 1.1rem; } .server-info code { background: rgba(255,255,255,0.15); padding: 0.2rem 0.5rem; border-radius: 4px; font-size: 1rem; } /* Configuration tabs */ .config-tabs { display: flex; flex-wrap: wrap; gap: 0.25rem; margin-bottom: 1rem; background: #f0f0f0; padding: 0.25rem; border-radius: 6px; } .config-tab { padding: 0.5rem 1rem; background: none; border: none; cursor: pointer; font-size: 0.875rem; color: #666; border-radius: 4px; transition: all 0.2s; } .config-tab:hover { color: #333; background: #e0e0e0; } .config-tab.active { color: white; background: #3498db; } .config-tab-content { display: none; } .config-tab-content.active { display: block; } .config-tab-content h3 { margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid #e0e0e0; color: #2c3e50; } /* Config tables */ .config-table { font-size: 0.875rem; } .config-table th { background: #2c3e50; color: white; font-weight: 500; padding: 0.5rem 0.75rem; white-space: nowrap; } .config-table td { padding: 0.5rem 0.75rem; vertical-align: middle; } .config-table tbody tr:nth-child(even) { background: #f8f9fa; } .config-table tbody tr:hover { background: #e8f4fc; } /* Memory table specific */ .memory-table .row-warning { background: #fff3cd !important; } .memory-table .row-warning:hover { background: #ffe8a1 !important; } .memory-table .present-yes { color: #27ae60; font-weight: bold; } .memory-table .present-no { color: #95a5a6; } .memory-table .status-warning { color: #e74c3c; font-weight: bold; } /* Section overview stats */ .memory-overview, .section-overview { display: flex; gap: 1rem; margin-bottom: 1rem; flex-wrap: wrap; } .stat-box { background: #f8f9fa; padding: 0.75rem 1.25rem; border-radius: 8px; text-align: center; border-left: 4px solid #3498db; min-width: 80px; } .stat-box.model-box { flex-grow: 1; text-align: left; border-left-color: #27ae60; } .stat-box.model-box .stat-value { font-size: 1rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .stat-value { display: block; font-size: 1.25rem; font-weight: bold; color: #2c3e50; } .stat-label { font-size: 0.7rem; color: #666; text-transform: uppercase; } /* Responsive */ @media (max-width: 768px) { .sensor-grid { grid-template-columns: repeat(2, 1fr); } table { font-size: 0.875rem; } th, td { padding: 0.5rem; } .config-tabs { flex-direction: column; } .config-tab { text-align: left; } .memory-overview { flex-direction: column; } .config-table { font-size: 0.75rem; } .config-table th, .config-table td { padding: 0.25rem 0.5rem; } } /* PCIe degraded link highlighting */ .pcie-degraded { color: #dc3545; font-weight: 600; } .pcie-max { color: #6c757d; font-size: 0.9em; }