diff --git a/web/static/css/cairn.css b/web/static/css/cairn.css index 8a76387..16f6924 100644 --- a/web/static/css/cairn.css +++ b/web/static/css/cairn.css @@ -1,18 +1,26 @@ +@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;600;700&family=Fira+Code:wght@400;500&display=swap'); + :root { - --bg: #0f1117; - --bg-surface: #1a1d27; - --bg-hover: #242836; - --border: #2a2e3d; - --text: #e1e4ed; - --text-muted: #8b90a0; - --accent: #6c8cff; - --accent-hover: #8ba4ff; - --danger: #ff6b6b; - --warning: #ffd666; - --success: #69db7c; - --sidebar-width: 220px; - --radius: 6px; - --font-mono: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace; + --bg: #0a0709; + --bg-surface: #151015; + --bg-hover: #1f1520; + --border: #2d1a28; + --border-glow: #4a1530; + --text: #d4c5cc; + --text-muted: #7a6670; + --accent: #e83050; + --accent-hover: #ff4d6a; + --accent-glow: rgba(232, 48, 80, 0.4); + --accent-glow-soft: rgba(232, 48, 80, 0.15); + --danger: #ff3344; + --warning: #c4943a; + --success: #4a8c5c; + --bone: #c4b5a0; + --bone-dim: #7a6e5f; + --sidebar-width: 240px; + --radius: 4px; + --font-heading: 'Cinzel', 'Georgia', serif; + --font-mono: 'Fira Code', 'SF Mono', 'Cascadia Code', monospace; } * { margin: 0; padding: 0; box-sizing: border-box; } @@ -35,23 +43,71 @@ body { top: 0; bottom: 0; overflow-y: auto; + box-shadow: 2px 0 20px rgba(0, 0, 0, 0.5); } -.sidebar-header { padding: 0 1.25rem 1.5rem; } -.logo { font-size: 1.25rem; font-weight: 700; color: var(--accent); } - -.nav-links { list-style: none; } -.nav-links a { +.sidebar-header { + padding: 0 1.25rem 1rem; + border-bottom: 1px solid var(--border); + margin-bottom: 0.5rem; +} +.logo { + font-family: var(--font-heading); + font-size: 1.5rem; + font-weight: 700; + color: var(--accent); + text-shadow: 0 0 20px var(--accent-glow), 0 0 40px rgba(232, 48, 80, 0.2); + letter-spacing: 0.15em; + text-transform: uppercase; +} +.logo-skull { display: block; + font-size: 2rem; + line-height: 1; + margin-bottom: 0.25rem; + filter: drop-shadow(0 0 8px var(--accent-glow)); +} + +.nav-links { list-style: none; padding-top: 0.5rem; } +.nav-links li { position: relative; } +.nav-links a { + display: flex; + align-items: center; + gap: 0.75rem; padding: 0.625rem 1.25rem; color: var(--text-muted); text-decoration: none; - font-size: 0.875rem; - transition: all 0.15s; + font-size: 0.85rem; + transition: all 0.2s; + border-left: 2px solid transparent; } .nav-links a:hover { - color: var(--text); + color: var(--accent-hover); background: var(--bg-hover); + border-left-color: var(--accent); + text-shadow: 0 0 12px var(--accent-glow); +} +.nav-icon { + font-size: 1rem; + width: 1.5rem; + text-align: center; + filter: grayscale(0.3); +} + +.sidebar-divider { + border: none; + border-top: 1px solid var(--border); + margin: 0.75rem 1.25rem; +} + +.sidebar-footer { + padding: 1rem 1.25rem; + margin-top: auto; + border-top: 1px solid var(--border); + font-size: 0.7rem; + color: var(--bone-dim); + font-family: var(--font-heading); + letter-spacing: 0.08em; } /* Main content */ @@ -67,7 +123,13 @@ body { padding-bottom: 1rem; border-bottom: 1px solid var(--border); } -.page-header h2 { font-size: 1.5rem; font-weight: 600; } +.page-header h2 { + font-family: var(--font-heading); + font-size: 1.35rem; + font-weight: 600; + color: var(--bone); + letter-spacing: 0.06em; +} /* Stats */ .stats-row { @@ -84,9 +146,28 @@ body { display: flex; flex-direction: column; min-width: 160px; + position: relative; + overflow: hidden; + transition: border-color 0.3s, box-shadow 0.3s; +} +.stat-card:hover { + border-color: var(--border-glow); + box-shadow: 0 0 15px var(--accent-glow-soft), inset 0 0 15px rgba(232, 48, 80, 0.05); +} +.stat-value { + font-family: var(--font-heading); + font-size: 2rem; + font-weight: 700; + color: var(--accent); + text-shadow: 0 0 15px var(--accent-glow); +} +.stat-label { + font-size: 0.75rem; + color: var(--text-muted); + margin-top: 0.25rem; + text-transform: uppercase; + letter-spacing: 0.08em; } -.stat-value { font-size: 2rem; font-weight: 700; color: var(--accent); } -.stat-label { font-size: 0.8rem; color: var(--text-muted); margin-top: 0.25rem; } /* Tables */ .table { @@ -97,18 +178,22 @@ body { .table th { text-align: left; padding: 0.75rem 1rem; - border-bottom: 2px solid var(--border); - color: var(--text-muted); - font-weight: 500; - font-size: 0.75rem; + border-bottom: 2px solid var(--border-glow); + color: var(--bone-dim); + font-family: var(--font-heading); + font-weight: 600; + font-size: 0.7rem; text-transform: uppercase; - letter-spacing: 0.05em; + letter-spacing: 0.1em; } .table td { padding: 0.75rem 1rem; border-bottom: 1px solid var(--border); } -.table tr:hover td { background: var(--bg-hover); } +.table tr:hover td { + background: var(--bg-hover); + box-shadow: inset 2px 0 0 var(--accent); +} /* Badges */ .badge { @@ -118,26 +203,52 @@ body { font-size: 0.75rem; font-weight: 600; font-family: var(--font-mono); + border: 1px solid transparent; +} +.badge-coredump { + background: rgba(255, 51, 68, 0.12); + color: var(--danger); + border-color: rgba(255, 51, 68, 0.25); + text-shadow: 0 0 8px rgba(255, 51, 68, 0.3); +} +.badge-fuzz { + background: rgba(74, 140, 92, 0.12); + color: var(--success); + border-color: rgba(74, 140, 92, 0.25); +} +.badge-sanitizer { + background: rgba(196, 148, 58, 0.12); + color: var(--warning); + border-color: rgba(196, 148, 58, 0.25); +} +.badge-simulation { + background: rgba(232, 48, 80, 0.1); + color: var(--accent-hover); + border-color: rgba(232, 48, 80, 0.2); } -.badge-coredump { background: #3b2a2a; color: var(--danger); } -.badge-fuzz { background: #2a3b2a; color: var(--success); } -.badge-sanitizer { background: #3b3b2a; color: var(--warning); } -.badge-simulation { background: #2a2a3b; color: var(--accent); } /* Buttons */ .btn { display: inline-block; padding: 0.5rem 1rem; background: var(--bg-surface); - color: var(--text); + color: var(--bone); border: 1px solid var(--border); border-radius: var(--radius); - font-size: 0.875rem; + font-size: 0.85rem; text-decoration: none; cursor: pointer; - transition: all 0.15s; + transition: all 0.2s; + font-family: var(--font-heading); + letter-spacing: 0.04em; +} +.btn:hover { + background: var(--bg-hover); + border-color: var(--accent); + color: var(--accent-hover); + box-shadow: 0 0 12px var(--accent-glow-soft); + text-shadow: 0 0 8px var(--accent-glow); } -.btn:hover { background: var(--bg-hover); border-color: var(--accent); } .btn-sm { padding: 0.25rem 0.625rem; font-size: 0.8rem; } /* Code */ @@ -147,11 +258,13 @@ code { background: var(--bg-hover); padding: 0.15rem 0.35rem; border-radius: 3px; + color: var(--accent-hover); } .code-block { background: var(--bg-surface); border: 1px solid var(--border); + border-left: 3px solid var(--accent); border-radius: var(--radius); padding: 1rem; overflow-x: auto; @@ -160,6 +273,7 @@ code { line-height: 1.6; white-space: pre-wrap; word-break: break-all; + box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.3); } /* Detail pages */ @@ -182,13 +296,18 @@ code { border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem; + transition: border-color 0.3s; +} +.detail-item:hover { + border-color: var(--border-glow); } .detail-item label { display: block; - font-size: 0.75rem; - color: var(--text-muted); + font-family: var(--font-heading); + font-size: 0.7rem; + color: var(--bone-dim); text-transform: uppercase; - letter-spacing: 0.05em; + letter-spacing: 0.08em; margin-bottom: 0.375rem; } @@ -196,7 +315,13 @@ code { /* Sections */ .section { margin-bottom: 2rem; } -.section h3 { margin-bottom: 0.75rem; font-size: 1rem; } +.section h3 { + margin-bottom: 0.75rem; + font-family: var(--font-heading); + font-size: 1rem; + color: var(--bone); + letter-spacing: 0.04em; +} /* Utilities */ .empty-state { @@ -204,6 +329,7 @@ code { padding: 3rem; text-align: center; font-size: 0.9rem; + font-style: italic; } .toolbar { @@ -223,12 +349,30 @@ code { } /* Status badges */ -.badge-status-open { background: #3b2a2a; color: var(--danger); } -.badge-status-resolved { background: #2a3b2a; color: var(--success); } +.badge-status-open { + background: rgba(255, 51, 68, 0.12); + color: var(--danger); + border-color: rgba(255, 51, 68, 0.25); + text-shadow: 0 0 8px rgba(255, 51, 68, 0.4); +} +.badge-status-resolved { + background: rgba(74, 140, 92, 0.12); + color: var(--success); + border-color: rgba(74, 140, 92, 0.25); +} /* Campaign badges */ -.badge-campaign-running { background: #2a2a3b; color: var(--accent); } -.badge-campaign-finished { background: #2a3b2a; color: var(--success); } +.badge-campaign-running { + background: rgba(232, 48, 80, 0.1); + color: var(--accent-hover); + border-color: rgba(232, 48, 80, 0.2); + text-shadow: 0 0 8px var(--accent-glow); +} +.badge-campaign-finished { + background: rgba(74, 140, 92, 0.12); + color: var(--success); + border-color: rgba(74, 140, 92, 0.25); +} /* Search */ .search-form { @@ -244,16 +388,20 @@ code { border-radius: var(--radius); color: var(--text); font-size: 0.9rem; + transition: all 0.2s; } .search-input:focus { outline: none; border-color: var(--accent); + box-shadow: 0 0 12px var(--accent-glow-soft); } /* Crash group detail */ .crashgroup-title { + font-family: var(--font-heading); font-size: 1.25rem; margin-bottom: 1.5rem; + color: var(--bone); } /* Regression */ @@ -263,7 +411,27 @@ code { align-items: flex-end; } .form-group { display: flex; flex-direction: column; gap: 0.375rem; flex: 1; } -.form-group label { font-size: 0.75rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; } +.form-group label { + font-family: var(--font-heading); + font-size: 0.7rem; + color: var(--bone-dim); + text-transform: uppercase; + letter-spacing: 0.08em; +} +.form-group input { + padding: 0.625rem 1rem; + background: var(--bg-surface); + border: 1px solid var(--border); + border-radius: var(--radius); + color: var(--text); + font-size: 0.9rem; + transition: all 0.2s; +} +.form-group input:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 12px var(--accent-glow-soft); +} .regression-result { border: 1px solid var(--border); @@ -272,9 +440,33 @@ code { margin-top: 1.5rem; } .regression-pass { border-color: var(--success); } -.regression-fail { border-color: var(--danger); } -.regression-verdict { font-size: 1.1rem; margin-bottom: 1rem; } -.regression-fail .regression-verdict { color: var(--danger); } +.regression-fail { + border-color: var(--danger); + box-shadow: 0 0 20px rgba(255, 51, 68, 0.15); +} +.regression-verdict { + font-family: var(--font-heading); + font-size: 1.1rem; + margin-bottom: 1rem; + letter-spacing: 0.04em; +} +.regression-fail .regression-verdict { + color: var(--danger); + text-shadow: 0 0 15px rgba(255, 51, 68, 0.4); +} .regression-pass .regression-verdict { color: var(--success); } .fingerprint-list { list-style: none; padding: 0; } .fingerprint-list li { padding: 0.375rem 0; } + +/* Links */ +a { color: var(--accent); transition: all 0.2s; } +a:hover { + color: var(--accent-hover); + text-shadow: 0 0 8px var(--accent-glow); +} + +/* Scrollbar */ +::-webkit-scrollbar { width: 8px; height: 8px; } +::-webkit-scrollbar-track { background: var(--bg); } +::-webkit-scrollbar-thumb { background: var(--border-glow); border-radius: 4px; } +::-webkit-scrollbar-thumb:hover { background: var(--accent); } diff --git a/web/templates/layout.html b/web/templates/layout.html index bab6275..ef8d554 100644 --- a/web/templates/layout.html +++ b/web/templates/layout.html @@ -9,17 +9,20 @@