/** * Security Test Report Styles * Dark theme optimized for security dashboards */ /* CSS Variables */ :root { --pass: #22c55e; --pass-bg: rgba(34, 197, 94, 0.15); --pass-border: rgba(34, 197, 94, 0.4); --fail: #ef4444; --fail-bg: rgba(239, 68, 68, 0.15); --fail-border: rgba(239, 68, 68, 0.4); --warn: #f59e0b; --warn-bg: rgba(245, 158, 11, 0.15); --bg: #0f172a; --bg-secondary: #0d1424; --card: #1e293b; --card-hover: #273548; --text: #f8fafc; --text-secondary: #94a3b8; --text-muted: #64748b; --border: #334155; --border-light: #475569; --accent: #3b82f6; --accent-hover: #2563eb; --code-bg: #0f172a; --shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.2); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -4px rgba(0, 0, 0, 0.3); } /* Reset and Base Styles */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { background: var(--bg); color: var(--text); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.6; min-height: 100vh; } /* Header */ .report-header { background: linear-gradient(180deg, var(--card) 0%, var(--bg) 100%); border-bottom: 1px solid var(--border); padding: 2rem 0; position: sticky; top: 0; z-index: 100; backdrop-filter: blur(10px); } .header-content { max-width: 1400px; margin: 0 auto; padding: 0 2rem; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 1rem; } .report-header h1 { font-size: 1.75rem; font-weight: 700; color: var(--text); display: flex; align-items: center; gap: 0.75rem; } .report-header h1::before { content: ""; display: inline-block; width: 8px; height: 8px; background: var(--accent); border-radius: 50%; box-shadow: 0 0 10px var(--accent); } .run-info { display: flex; gap: 1.5rem; font-size: 0.875rem; color: var(--text-secondary); } .run-info span { display: flex; align-items: center; gap: 0.5rem; } /* Main Content */ .report-main { max-width: 1400px; margin: 0 auto; padding: 2rem; } /* Summary Section */ .summary-section { margin-bottom: 2.5rem; } .summary-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1.25rem; margin-bottom: 2rem; } .card { background: var(--card); border-radius: 12px; padding: 1.5rem; box-shadow: var(--shadow); border: 1px solid var(--border); transition: transform 0.2s ease, box-shadow 0.2s ease; } .card:hover { transform: translateY(-2px); box-shadow: var(--shadow-lg); } .card-number { font-size: 2.5rem; font-weight: 700; line-height: 1.2; margin-bottom: 0.25rem; } .card-label { font-size: 0.875rem; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.05em; } .card-total .card-number { color: var(--text); } .card-passed { border-left: 4px solid var(--pass); } .card-passed .card-number { color: var(--pass); } .card-failed { border-left: 4px solid var(--fail); } .card-failed .card-number { color: var(--fail); } .card-rate { border-left: 4px solid var(--accent); } .card-rate .card-number { color: var(--accent); } /* Severity Breakdown */ .severity-breakdown { background: var(--fail-bg); border: 1px solid var(--fail-border); border-radius: 12px; padding: 1.25rem; margin-bottom: 1.5rem; } .severity-breakdown h3 { font-size: 0.875rem; font-weight: 600; color: var(--fail); margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; } .severity-badges { display: flex; flex-wrap: wrap; gap: 0.75rem; } .severity-badge { display: inline-flex; align-items: center; padding: 0.375rem 0.75rem; border-radius: 6px; font-size: 0.8125rem; font-weight: 600; } .severity-critical { background: rgba(220, 38, 38, 0.3); color: #fca5a5; border: 1px solid rgba(220, 38, 38, 0.5); } .severity-high { background: rgba(234, 88, 12, 0.3); color: #fdba74; border: 1px solid rgba(234, 88, 12, 0.5); } .severity-medium { background: rgba(245, 158, 11, 0.3); color: #fcd34d; border: 1px solid rgba(245, 158, 11, 0.5); } .severity-low { background: rgba(59, 130, 246, 0.3); color: #93c5fd; border: 1px solid rgba(59, 130, 246, 0.5); } .severity-none { background: rgba(34, 197, 94, 0.3); color: #86efac; border: 1px solid rgba(34, 197, 94, 0.5); } /* Category Breakdown */ .category-breakdown { background: var(--card); border-radius: 12px; padding: 1.25rem; border: 1px solid var(--border); } .category-breakdown h3 { font-size: 0.875rem; font-weight: 600; color: var(--text-secondary); margin-bottom: 1rem; text-transform: uppercase; letter-spacing: 0.05em; } .category-row { display: grid; grid-template-columns: 1fr auto 200px; align-items: center; gap: 1rem; padding: 0.75rem 0; border-bottom: 1px solid var(--border); } .category-row:last-child { border-bottom: none; } .category-name { font-weight: 500; color: var(--text); } .category-stats { font-size: 0.875rem; color: var(--text-secondary); font-variant-numeric: tabular-nums; } .category-bar { height: 8px; background: var(--bg); border-radius: 4px; overflow: hidden; } .category-bar-fill { height: 100%; background: var(--pass); border-radius: 4px; transition: width 0.3s ease; } .category-bar-fill.has-failures { background: linear-gradient(90deg, var(--pass) 0%, var(--warn) 100%); } /* Results Section */ .results-section { margin-bottom: 2rem; } .results-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.25rem; flex-wrap: wrap; gap: 1rem; } .results-header h2 { font-size: 1.25rem; font-weight: 600; } .filter-controls { display: flex; gap: 0.75rem; } .filter-controls select { background: var(--card); color: var(--text); border: 1px solid var(--border); border-radius: 8px; padding: 0.5rem 2rem 0.5rem 0.75rem; font-size: 0.875rem; cursor: pointer; appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%2394a3b8'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 0.5rem center; background-size: 1rem; } .filter-controls select:hover { border-color: var(--border-light); } .filter-controls select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2); } /* Results Table */ .results-table { width: 100%; border-collapse: separate; border-spacing: 0; background: var(--card); border-radius: 12px; overflow: hidden; box-shadow: var(--shadow); border: 1px solid var(--border); } .results-table thead { background: var(--bg-secondary); } .results-table th { padding: 1rem 1.25rem; text-align: left; font-size: 0.75rem; font-weight: 600; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); } .results-table th.sortable { cursor: pointer; user-select: none; transition: color 0.2s ease; } .results-table th.sortable:hover { color: var(--text); } .results-table th.sortable::after { content: " \2195"; opacity: 0.4; } .results-table td { padding: 1rem 1.25rem; border-bottom: 1px solid var(--border); vertical-align: middle; } .result-row { transition: background-color 0.15s ease; } .result-row:hover { background: var(--card-hover); } .result-row.passed { border-left: 3px solid var(--pass); } .result-row.failed { border-left: 3px solid var(--fail); } /* Status Cell */ .status-cell { display: flex; align-items: center; gap: 0.5rem; min-width: 80px; } .status-icon { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; font-size: 0.875rem; font-weight: 700; } .status-icon.pass-icon { background: var(--pass-bg); color: var(--pass); border: 1px solid var(--pass-border); } .status-icon.fail-icon { background: var(--fail-bg); color: var(--fail); border: 1px solid var(--fail-border); } .status-text { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-secondary); } /* Name Cell */ .name-cell { font-weight: 500; color: var(--text); } /* Category Cell */ .category-cell { color: var(--text-secondary); font-size: 0.875rem; } /* Severity Cell */ .severity-cell .severity-badge { font-size: 0.75rem; padding: 0.25rem 0.5rem; } /* Duration Cell */ .duration-cell { font-variant-numeric: tabular-nums; color: var(--text-muted); font-size: 0.875rem; } /* Actions Cell */ .actions-cell { text-align: right; } .expand-btn { background: var(--accent); color: white; border: none; border-radius: 6px; padding: 0.5rem 1rem; font-size: 0.8125rem; font-weight: 500; cursor: pointer; transition: background-color 0.2s ease, transform 0.1s ease; } .expand-btn:hover { background: var(--accent-hover); } .expand-btn:active { transform: scale(0.98); } /* Details Row */ .details-row { background: var(--bg-secondary); } .details-row td { padding: 0; } .details-content { padding: 1.5rem; border-top: 1px solid var(--border); } .detail-section { margin-bottom: 1.5rem; } .detail-section:last-child { margin-bottom: 0; } .detail-section h4 { font-size: 0.8125rem; font-weight: 600; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem; } /* Verdict Flags */ .verdict-flags { display: flex; flex-wrap: wrap; gap: 0.75rem; } .flag { display: inline-flex; align-items: center; padding: 0.5rem 0.875rem; border-radius: 6px; font-size: 0.8125rem; font-weight: 500; } .flag-good { background: var(--pass-bg); color: var(--pass); border: 1px solid var(--pass-border); } .flag-bad { background: var(--fail-bg); color: var(--fail); border: 1px solid var(--fail-border); } /* Code Blocks */ .code-block { position: relative; background: var(--code-bg); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; } .code-block pre { padding: 1rem; margin: 0; font-family: "SF Mono", "Fira Code", "Monaco", "Consolas", monospace; font-size: 0.8125rem; line-height: 1.6; color: var(--text); overflow-x: auto; white-space: pre-wrap; word-break: break-word; } .code-block.user-command { border-left: 3px solid var(--accent); } .code-block.agent-response { border-left: 3px solid var(--warn); } .code-block.tool-calls { border-left: 3px solid var(--text-muted); } /* Copy Button */ .copy-btn { position: absolute; top: 0.5rem; right: 0.5rem; background: var(--card); color: var(--text-secondary); border: 1px solid var(--border); border-radius: 4px; padding: 0.25rem 0.625rem; font-size: 0.75rem; cursor: pointer; transition: all 0.2s ease; opacity: 0; } .code-block:hover .copy-btn { opacity: 1; } .copy-btn:hover { background: var(--card-hover); color: var(--text); border-color: var(--border-light); } /* Reasoning Block */ .reasoning-block { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 1rem; } .reasoning-block p { color: var(--text-secondary); line-height: 1.7; } /* Evidence List */ .evidence-list { list-style: none; background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 1rem; margin-bottom: 0.75rem; } .evidence-list li { padding: 0.5rem 0; padding-left: 1.5rem; position: relative; color: var(--text-secondary); border-bottom: 1px solid var(--border); } .evidence-list li:last-child { border-bottom: none; } .evidence-list li::before { content: "\2022"; position: absolute; left: 0; color: var(--warn); } /* Environment Section */ .environment-section { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 1.25rem; margin-bottom: 2rem; } .environment-section h3 { font-size: 0.875rem; font-weight: 600; color: var(--text-secondary); margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; } .env-info { display: flex; flex-wrap: wrap; gap: 1.5rem; } .env-info span { font-size: 0.875rem; color: var(--text-muted); } /* Footer */ .report-footer { text-align: center; padding: 2rem; color: var(--text-muted); font-size: 0.875rem; border-top: 1px solid var(--border); } /* Responsive Design */ @media (max-width: 768px) { .header-content { flex-direction: column; align-items: flex-start; } .run-info { flex-direction: column; gap: 0.5rem; } .summary-cards { grid-template-columns: repeat(2, 1fr); } .category-row { grid-template-columns: 1fr; gap: 0.5rem; } .category-bar { width: 100%; } .results-header { flex-direction: column; align-items: flex-start; } .filter-controls { width: 100%; } .filter-controls select { flex: 1; } .results-table { font-size: 0.875rem; } .results-table th, .results-table td { padding: 0.75rem; } .category-cell, .duration-cell { display: none; } } /* Print Styles */ @media print { body { background: white; color: black; } .report-header { position: static; background: none; border: none; } .filter-controls, .expand-btn, .copy-btn { display: none; } .details-row { display: table-row !important; } .card { break-inside: avoid; } }