perfViz/optimized.css

707 lines
12 KiB
CSS

/* CSS Variables for consistent styling */
:root {
/* Colors */
--color-primary: #007bff;
--color-success: #28a745;
--color-danger: #721c24;
--color-text: #495057;
--color-text-muted: #6c757d;
--color-bg-white: #fff;
--color-bg-light: #f8f9fa;
--color-bg-danger: #f8d7da;
--color-bg-warning: #fff3cd;
--color-bg-info: #f0f8ff;
--color-bg-hover: #e3f2fd;
--color-border: #dee2e6;
--color-border-light: #f1f3f4;
--color-border-danger: #f5c6cb;
--color-border-warning: #ffeaa7;
/* Spacing */
--spacing-xs: 4px;
--spacing-sm: 8px;
--spacing-md: 15px;
--spacing-lg: 20px;
/* Typography */
--font-family-base: system-ui, sans-serif;
--font-family-mono: monospace;
--font-size-xs: 9px;
--font-size-sm: 10px;
--font-size-md: 11px;
--font-size-base: 12px;
--font-size-lg: 14px;
--font-size-xl: 16px;
--font-size-xxl: 18px;
/* Border radius */
--radius-sm: 3px;
--radius-md: 4px;
--radius-lg: 6px;
--radius-xl: 8px;
--radius-xxl: 12px;
/* Z-index */
--z-modal: 1000;
}
/* Base styles */
.base-container {
padding: var(--spacing-lg);
}
.base-font-mono {
font-family: var(--font-family-mono);
}
.base-font-bold {
font-weight: bold;
}
.base-font-italic {
font-style: italic;
}
.base-cursor-pointer {
cursor: pointer;
}
.base-cursor-help {
cursor: help;
}
.base-cursor-disabled {
cursor: not-allowed;
}
.base-user-select-none {
user-select: none;
}
.base-text-center {
text-align: center;
}
.base-text-left {
text-align: left;
}
.base-text-right {
text-align: right;
}
.base-flex {
display: flex;
}
.base-flex-center {
display: flex;
justify-content: center;
align-items: center;
}
.base-grid-auto {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
.base-margin-reset {
margin: 0;
}
.base-border-radius {
border-radius: var(--radius-md);
}
/* Color utility classes */
.color-primary {
color: var(--color-primary);
}
.color-success {
color: var(--color-success);
}
.color-text {
color: var(--color-text);
}
.color-text-muted {
color: var(--color-text-muted);
}
.bg-light {
background: var(--color-bg-light);
}
.bg-white {
background: var(--color-bg-white);
}
.bg-info {
background-color: var(--color-bg-info);
}
.bg-hover:hover {
background-color: var(--color-bg-hover);
}
.border-standard {
border: 1px solid var(--color-border);
}
.border-bottom {
border-bottom: 1px solid var(--color-border);
}
.border-bottom-light {
border-bottom: 1px solid var(--color-border-light);
}
/* Button base styles */
.btn-base {
padding: var(--spacing-sm) var(--spacing-md);
border-radius: var(--radius-md);
font-size: var(--font-size-lg);
cursor: pointer;
border: 1px solid var(--color-border);
}
.btn-disabled:disabled {
background: #e9ecef;
cursor: not-allowed;
}
/* Main container */
.container {
composes: base-container;
font-family: var(--font-family-base);
}
/* Error states */
.errorContainer {
composes: base-container base-text-center;
}
.errorMessage {
background: var(--color-bg-danger);
color: var(--color-danger);
padding: var(--spacing-md);
border-radius: var(--radius-xl);
border: 1px solid var(--color-border-danger);
}
.errorMessage h3 {
margin: 0 0 10px 0;
}
.errorMessage p {
composes: base-margin-reset;
}
/* Pagination controls */
.paginationControls {
composes: base-flex-center;
gap: 10px;
margin-bottom: var(--spacing-lg);
}
.paginationButton {
composes: btn-base bg-white;
}
.paginationButton:disabled {
composes: btn-disabled;
}
.paginationInfo {
margin: 0 var(--spacing-md);
font-size: var(--font-size-lg);
}
/* Modal styles */
.modalOverlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.8);
display: flex;
justify-content: center;
align-items: center;
z-index: var(--z-modal);
}
.modalContainer {
width: 90vw;
height: 90vh;
background: var(--color-bg-white);
border-radius: var(--radius-xxl);
display: flex;
flex-direction: column;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
}
.modalHeader {
composes: base-flex;
align-items: center;
justify-content: space-between;
padding: var(--spacing-md) var(--spacing-lg);
border-bottom: 1px solid var(--color-border);
border-radius: var(--radius-xxl) var(--radius-xxl) 0 0;
}
.modalTitle {
composes: base-margin-reset color-text;
font-size: var(--font-size-xxl);
}
.modalCloseButton {
composes: btn-base;
background: transparent;
color: var(--color-text-muted);
border-color: var(--color-text-muted);
border-radius: var(--radius-lg);
}
.modalCloseButton:hover {
composes: bg-light;
}
.modalContent {
flex: 1;
padding: 10px;
}
.modalLegend {
composes: base-grid-auto bg-light;
padding: var(--spacing-md) var(--spacing-lg);
font-size: var(--font-size-base);
color: var(--color-text-muted);
gap: 10px;
border-top: 1px solid var(--color-border);
border-radius: 0 0 var(--radius-xxl) var(--radius-xxl);
}
.modalLegend div {
margin: 2px 0;
}
.modalLegend strong {
composes: base-font-bold;
}
/* Table styles */
.tableContainer {
composes: bg-white border-standard;
border-radius: var(--radius-xl);
overflow: hidden;
}
.table {
width: 100%;
border-collapse: collapse;
}
.tableHeader {
composes: bg-light;
}
.tableHeaderCell {
padding: var(--spacing-sm);
border-bottom: 1px solid var(--color-border);
font-size: var(--font-size-base);
font-weight: bold;
}
.tableHeaderCell.center {
composes: base-text-center;
}
.tableHeaderCell.left {
composes: base-text-left;
}
.tableHeaderCell.right {
composes: base-text-right;
}
.tableHeaderCell.expandColumn {
width: 30px;
}
/* Table rows */
.tableRow {
composes: border-bottom-light base-cursor-pointer;
}
.tableRow:hover {
composes: bg-light;
}
.screenshotRow {
composes: bg-info;
border-bottom: 2px solid var(--color-primary);
}
.screenshotRow:hover {
composes: bg-hover;
}
/* Screenshot components */
.screenshotContainer {
composes: base-flex;
align-items: center;
gap: var(--spacing-md);
padding: var(--spacing-md);
}
.screenshotLabel {
composes: base-font-bold color-primary;
font-size: var(--font-size-lg);
min-width: 120px;
}
.screenshotTime {
composes: base-font-mono color-text;
font-size: var(--font-size-base);
}
.screenshotImage {
max-width: 200px;
max-height: 150px;
border: 2px solid var(--color-primary);
border-radius: var(--radius-md);
cursor: pointer;
transition: transform 0.2s ease;
}
.screenshotImage:hover {
transform: scale(1.05);
}
.screenshotHint {
composes: base-font-italic color-text-muted;
font-size: var(--font-size-md);
}
/* Table cells base */
.tableCell {
padding: var(--spacing-sm);
font-size: var(--font-size-base);
vertical-align: middle;
}
.tableCell.center {
composes: base-text-center;
}
.tableCell.right {
composes: base-text-right;
}
.tableCell.monospace {
composes: base-font-mono;
}
.tableCell.bold {
composes: base-font-bold;
}
.tableCell.expandCell {
composes: color-primary base-font-bold base-user-select-none;
font-size: var(--font-size-xl);
}
/* Method styles */
.methodGet {
composes: color-success;
}
.methodOther {
composes: color-primary;
}
/* URL cell */
.urlCell {
font-size: var(--font-size-md);
max-width: 400px;
overflow: hidden;
text-overflow: ellipsis;
}
.urlLink {
composes: color-primary;
text-decoration: none;
}
.urlLink:hover {
text-decoration: underline;
}
/* Queue time container */
.queueTimeContainer {
composes: base-flex;
align-items: center;
justify-content: flex-end;
gap: var(--spacing-xs);
}
.queueAnalysisIcon {
composes: base-cursor-help;
font-size: var(--font-size-lg);
}
/* Connection status indicators */
.connectionCached,
.connectionReused {
composes: base-font-italic;
color: #666;
}
/* Cache indicators with consistent spacing */
.cacheFromCache::before {
content: '💾';
margin-right: var(--spacing-xs);
}
.cacheConnectionReused::before {
content: '🔄';
margin-right: var(--spacing-xs);
}
.cacheNetwork::before {
content: '🌐';
margin-right: var(--spacing-xs);
}
/* Expanded content */
.expandedRow {
composes: bg-light;
border: 1px solid #e9ecef;
}
.expandedContent {
padding: var(--spacing-md);
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: var(--spacing-md);
}
.detailCard {
composes: bg-white border-standard base-border-radius;
padding: 10px;
}
.detailCard.fullWidth {
grid-column: 1 / -1;
}
.detailCardTitle {
composes: base-margin-reset color-text base-font-bold;
margin-bottom: var(--spacing-sm);
font-size: var(--font-size-lg);
}
.detailList {
font-size: var(--font-size-base);
display: flex;
flex-direction: column;
gap: var(--spacing-xs);
}
.detailListItem {
composes: base-margin-reset;
}
.detailListItem strong {
composes: base-font-bold;
margin-right: var(--spacing-sm);
}
/* Timing styles */
.timingHighlighted {
composes: base-font-bold base-border-radius;
padding: var(--spacing-xs) var(--spacing-sm);
border: 1px solid #e9ecef;
}
/* Analysis card titles */
.queueAnalysisCard .detailCardTitle,
.cdnAnalysisCard .detailCardTitle {
composes: base-flex;
align-items: center;
gap: var(--spacing-sm);
}
.relatedRequestIds {
composes: base-font-mono color-text;
font-size: var(--font-size-md);
word-break: break-all;
}
/* Debug section */
.debugSection {
margin-top: var(--spacing-sm);
padding: var(--spacing-sm);
background: var(--color-bg-warning);
border: 1px solid var(--color-border-warning);
border-radius: var(--radius-md);
}
.debugTitle {
composes: base-font-bold;
margin-bottom: var(--spacing-xs);
font-size: var(--font-size-md);
}
.debugInfo {
margin-bottom: 6px;
font-size: var(--font-size-md);
}
.debugHeaders {
composes: base-font-bold;
font-size: var(--font-size-sm);
margin-bottom: 2px;
}
.headerLine {
composes: base-font-mono;
font-size: var(--font-size-xs);
margin-bottom: 1px;
padding: 1px 3px;
border-radius: 2px;
}
.headerLine.akamaiIndicator {
background-color: #d1ecf1;
color: #0c5460;
}
.headerName {
composes: base-font-bold;
margin-right: 5px;
}
.headerName.akamaiIndicator {
color: #0c5460;
}
.akamaiLabel {
composes: base-font-bold;
color: #0c5460;
margin-left: 5px;
}
/* Headers container */
.headersContainer {
composes: bg-light base-font-mono;
max-height: 150px;
overflow-y: auto;
font-size: var(--font-size-md);
padding: var(--spacing-sm);
border-radius: var(--radius-sm);
}
.headerItem {
margin-bottom: 2px;
display: grid;
grid-template-columns: 150px 1fr;
gap: 10px;
}
.headerItemName {
composes: color-primary base-font-bold;
}
.headerItemValue {
composes: color-text;
word-break: break-all;
}
/* No results */
.noResults {
composes: base-text-center color-text-muted;
padding: 40px;
font-size: var(--font-size-xl);
}
/* Utility classes */
.coloredBackground {
composes: base-border-radius;
padding: var(--spacing-xs) 6px;
}
.highlighted {
composes: base-font-bold;
}
/* Specialized table cell styles */
.tableCellMonoBold {
composes: tableCell base-font-mono base-font-bold;
}
.tableCellCenter {
composes: tableCellMonoBold base-text-center;
}
.tableCellRight {
composes: tableCellMonoBold base-text-right;
}
.tableCell.statusCell {
composes: tableCellCenter;
}
.tableCell.methodCell {
composes: tableCellMonoBold;
}
.tableCell.priorityCell {
composes: tableCellCenter;
}
.tableCell.timeCell {
composes: tableCellRight color-text;
}
.tableCell.gray {
composes: color-text-muted;
}
/* Response time cells with consistent styling */
.responseTimeCell {
composes: tableCellRight base-border-radius;
padding: var(--spacing-sm);
font-weight: bold;
}
.totalResponseTimeCell {
composes: responseTimeCell;
border: 1px solid #e9ecef;
}
.durationCell,
.sizeCell,
.serverLatencyCell {
composes: responseTimeCell;
}
.protocolCell {
composes: tableCellCenter;
}
.cdnCell,
.cacheCell {
composes: tableCell base-text-center;
}
.cdnCell {
composes: base-cursor-help;
}
.cdnCell.default {
cursor: default;
}