oilverse-api / frontend /src /index.css
孙家明
deploy: OilVerse for HuggingFace (Node.js 18 fix)
fab9847
Raw
History Blame Contribute Delete
3.5 kB
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Noto+Sans+SC:wght@400;500;700&family=JetBrains+Mono:wght@400;500;600&display=swap');
:root {
--bg: #060b18;
--surface: #0d1525;
--card: rgba(22,33,55,.65);
--card-solid: #162137;
--border: rgba(56,80,130,.35);
--border-hover: rgba(59,130,246,.4);
--text: #e8ecf4;
--muted: #7b8ba8;
--accent: #4f8ff7;
--accent-glow: rgba(79,143,247,.12);
--accent-bright: #6da3ff;
--green: #22c55e;
--green-glow: rgba(34,197,94,.12);
--yellow: #eab308;
--yellow-glow: rgba(234,179,8,.1);
--red: #f43f5e;
--red-glow: rgba(244,63,94,.1);
--orange: #f97316;
--purple: #a855f7;
--purple-glow: rgba(168,85,247,.12);
--cyan: #06b6d4;
/* Shadows */
--shadow-sm: 0 1px 3px rgba(0,0,0,.3), 0 1px 2px rgba(0,0,0,.2);
--shadow-md: 0 4px 14px rgba(0,0,0,.35), 0 2px 6px rgba(0,0,0,.2);
--shadow-lg: 0 8px 30px rgba(0,0,0,.4), 0 4px 12px rgba(0,0,0,.25);
--shadow-glow: 0 0 20px rgba(79,143,247,.08), 0 4px 14px rgba(0,0,0,.3);
/* Blur */
--blur: blur(12px);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', 'Noto Sans SC', system-ui, -apple-system, sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
background-image:
radial-gradient(ellipse 80% 60% at 50% 0%, rgba(79,143,247,.04) 0%, transparent 60%),
radial-gradient(ellipse 60% 50% at 80% 100%, rgba(168,85,247,.03) 0%, transparent 50%);
background-attachment: fixed;
}
/* ── Scrollbar ── */
::-webkit-scrollbar { width: 5px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, rgba(79,143,247,.3), rgba(168,85,247,.2));
border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover { background: rgba(79,143,247,.5); }
/* ── Recharts tooltip ── */
.recharts-default-tooltip {
background: var(--card-solid) !important;
border: 1px solid var(--border) !important;
border-radius: 10px !important;
box-shadow: var(--shadow-md) !important;
backdrop-filter: var(--blur) !important;
}
/* ── Selection ── */
::selection {
background: rgba(79,143,247,.28);
color: var(--text);
}
/* ── Stat Card (reusable) ── */
.stat-card {
background: var(--card);
backdrop-filter: var(--blur);
border: 1px solid var(--border);
border-radius: 14px;
padding: 18px 20px;
transition: all .3s cubic-bezier(.4,0,.2,1);
position: relative;
overflow: hidden;
}
.stat-card::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(79,143,247,.04) 0%, transparent 60%);
opacity: 0;
transition: opacity .3s;
}
.stat-card:hover {
border-color: var(--border-hover);
box-shadow: var(--shadow-glow);
transform: translateY(-1px);
}
.stat-card:hover::before { opacity: 1; }
.stat-label {
font-size: .7rem;
text-transform: uppercase;
letter-spacing: 1.5px;
color: var(--muted);
font-weight: 600;
}
.stat-value {
font-size: 1.6rem;
font-weight: 800;
margin: 6px 0 4px;
background: linear-gradient(135deg, var(--text) 30%, var(--accent-bright));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.stat-sub {
font-size: .7rem;
color: var(--muted);
}
/* ── Monospace for code/numbers ── */
code, .mono {
font-family: 'JetBrains Mono', 'Fira Code', monospace;
}