/* 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; }