hardiksood21
feat: new MetabolID UI design and manual download button
edd4f75
Raw
History Blame Contribute Delete
11.2 kB
:root {
--bg: #F7F5F0;
--surface: #FFFFFF;
--border: #E2DDD6;
--ink: #1A1714;
--ink2: #6B6560;
--accent: #C8410A;
--accent-l: #F2E8E3;
--green: #1A6B3A;
--green-l: #E3F0E9;
--blue: #1A4A8A;
--blue-l: #E3EBF7;
--r: 8px;
--mono: 'IBM Plex Mono', monospace;
--serif: 'Fraunces', Georgia, serif;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: var(--bg);
color: var(--ink);
font-family: var(--mono);
font-size: 14px;
min-height: 100vh;
}
/* Subtle graph-paper background */
body::before {
content: '';
position: fixed; inset: 0;
background-image:
linear-gradient(var(--border) 1px, transparent 1px),
linear-gradient(90deg, var(--border) 1px, transparent 1px);
background-size: 32px 32px;
opacity: 0.35;
pointer-events: none;
z-index: -1;
}
.page {
position: relative;
max-width: 1280px;
margin: 0 auto;
padding: 3rem 2rem 4rem;
}
/* Two-column layout */
.layout {
display: grid;
grid-template-columns: 1fr 300px;
gap: 2rem;
align-items: start;
}
@media (max-width: 900px) {
.layout { grid-template-columns: 1fr; }
}
.main-col { min-width: 0; }
/* Sidebar references */
.sidebar {
position: sticky;
top: 2rem;
}
.sidebar-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--r);
padding: 1.2rem 1.4rem;
font-size: 11px;
color: var(--ink2);
line-height: 1.8;
}
.sidebar-card strong {
display: block;
font-size: 10px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--ink);
margin-bottom: 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--border);
}
.sidebar-card p { margin-bottom: 0.75rem; }
.sidebar-card p:last-child { margin-bottom: 0; }
.sidebar-card a { color: var(--ink2); }
.sidebar-card em { font-style: italic; }
/* ── Header ─────────────────────────────────────── */
header {
margin-bottom: 2.5rem;
border-bottom: 2px solid var(--ink);
padding-bottom: 1.5rem;
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 1rem;
animation: fadeDown 0.5s ease both;
}
@media (max-width: 600px) {
header { flex-direction: column; align-items: flex-start; }
.header-meta { text-align: left; }
}
.title-block h1 {
font-family: var(--serif);
font-size: 3rem;
font-weight: 700;
line-height: 1;
letter-spacing: -0.02em;
color: var(--ink);
}
.title-block h1 span { color: var(--accent); font-style: italic; }
.title-block p {
margin-top: 0.4rem;
font-size: 11px;
color: var(--ink2);
letter-spacing: 0.08em;
text-transform: uppercase;
}
.header-meta {
text-align: right;
font-size: 11px;
color: var(--ink2);
line-height: 1.9;
}
.version-badge {
display: inline-block;
background: var(--ink);
color: var(--bg);
padding: 2px 8px;
border-radius: 3px;
font-size: 10px;
letter-spacing: 0.1em;
font-weight: 500;
}
/* ── Section label ───────────────────────────────── */
.section-label {
font-size: 10px;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--ink2);
margin-bottom: 0.75rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.section-label::after {
content: '';
flex: 1;
height: 1px;
background: var(--border);
}
/* ── Card ────────────────────────────────────────── */
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--r);
padding: 1.5rem;
margin-bottom: 1rem;
animation: fadeUp 0.4s ease both;
}
.card:nth-child(2) { animation-delay: 0.06s; }
.card:nth-child(3) { animation-delay: 0.12s; }
.card:nth-child(4) { animation-delay: 0.18s; }
/* ── Mode tabs ───────────────────────────────────── */
.mode-tabs {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.5rem;
margin-bottom: 1.25rem;
}
@media (max-width: 500px) { .mode-tabs { grid-template-columns: 1fr; } }
.tab-btn {
padding: 0.7rem 1rem;
border: 1.5px solid var(--border);
border-radius: 6px;
background: transparent;
color: var(--ink2);
font-family: var(--mono);
font-size: 12px;
cursor: pointer;
transition: all 0.15s;
text-align: left;
line-height: 1.5;
}
.tab-btn strong { display: block; color: var(--ink); font-size: 13px; margin-bottom: 0.2rem; }
.tab-btn:hover { border-color: var(--ink); color: var(--ink); }
.tab-btn.active {
border-color: var(--accent);
background: var(--accent-l);
color: var(--accent);
}
.tab-btn.active strong { color: var(--accent); }
/* ── Input panels ────────────────────────────────── */
/* Drop zone */
.drop-zone {
border: 2px dashed var(--border);
border-radius: var(--r);
padding: 2.5rem 1.5rem;
text-align: center;
cursor: pointer;
position: relative;
transition: all 0.15s;
}
.drop-zone:hover, .drop-zone.drag-active {
border-color: var(--accent);
background: var(--accent-l);
}
.drop-zone input[type="file"] {
position: absolute; inset: 0;
opacity: 0; cursor: pointer;
width: 100%; height: 100%;
}
.drop-icon { font-size: 2rem; margin-bottom: 0.5rem; }
.drop-text { font-size: 12px; color: var(--ink2); line-height: 1.7; }
.drop-text strong { color: var(--ink); }
.file-chosen {
margin-top: 0.75rem;
font-size: 12px;
color: var(--green);
font-weight: 500;
}
/* Drive input */
.drive-input-wrap { display: flex; gap: 0.5rem; align-items: stretch; }
.drive-input-wrap input[type="text"] {
flex: 1;
background: var(--bg);
border: 1.5px solid var(--border);
border-radius: 6px;
padding: 0.65rem 0.9rem;
font-family: var(--mono);
font-size: 12px;
color: var(--ink);
outline: none;
transition: border-color 0.15s;
}
.drive-input-wrap input[type="text"]:focus { border-color: var(--accent); }
.drive-hint {
font-size: 11px;
color: var(--ink2);
margin-top: 0.5rem;
line-height: 1.7;
}
.drive-hint a { color: var(--blue); }
/* ── Parameters ──────────────────────────────────── */
.param-grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 0.75rem;
}
@media (max-width: 600px) { .param-grid { grid-template-columns: 1fr 1fr; } }
.param-item label {
display: block;
font-size: 10px;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--ink2);
margin-bottom: 0.35rem;
}
.param-item input {
width: 100%;
background: var(--bg);
border: 1.5px solid var(--border);
border-radius: 6px;
padding: 0.55rem 0.75rem;
font-family: var(--mono);
font-size: 13px;
color: var(--ink);
outline: none;
transition: border-color 0.15s;
}
.param-item input:focus { border-color: var(--accent); }
.param-hint { font-size: 10px; color: var(--ink2); margin-top: 0.2rem; }
/* ── Buttons ─────────────────────────────────────── */
.btn-run {
width: 100%;
padding: 0.9rem;
background: var(--ink);
color: var(--bg);
border: none;
border-radius: var(--r);
font-family: var(--mono);
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.15s;
letter-spacing: 0.04em;
margin-top: 0.5rem;
}
.btn-run:hover:not(:disabled) {
background: var(--accent);
transform: translateY(-1px);
box-shadow: 0 4px 16px rgba(200,65,10,0.2);
}
.btn-run:disabled { opacity: 0.4; cursor: not-allowed; transform: none; }
.btn-download {
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
width: 100%;
padding: 0.85rem;
background: var(--green-l);
color: var(--green);
border: 1.5px solid var(--green);
border-radius: var(--r);
font-family: var(--mono);
font-size: 13px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
transition: all 0.15s;
}
.btn-download:hover {
background: var(--green);
color: white;
transform: translateY(-1px);
}
.btn-secondary {
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0.5rem 0.8rem;
background: var(--surface);
color: var(--ink);
border: 1px solid var(--border);
border-radius: 6px;
font-family: var(--mono);
font-size: 12px;
cursor: pointer;
transition: all 0.15s;
}
.btn-secondary:hover {
border-color: var(--ink);
}
/* ── Progress & Error ────────────────────────────── */
.progress-meta {
display: flex;
justify-content: space-between;
font-size: 11px;
color: var(--ink2);
margin-bottom: 0.5rem;
}
.log-box {
background: var(--ink);
color: #C8C4BE;
border-radius: 6px;
padding: 1rem;
font-size: 11px;
line-height: 1.8;
max-height: 180px;
overflow-y: auto;
margin-top: 0.75rem;
white-space: pre-wrap;
word-break: break-all;
}
.alert-error {
background: rgba(235, 87, 87, 0.1);
border: 1px solid rgba(235, 87, 87, 0.3);
color: #EB5757;
padding: 1rem;
border-radius: var(--r);
font-size: 12px;
margin-bottom: 1rem;
}
.alert-warning {
background: rgba(251, 191, 36, 0.1);
border: 1px solid rgba(251, 191, 36, 0.3);
color: #d97706;
padding: 1rem;
border-radius: var(--r);
font-size: 12px;
margin-bottom: 1rem;
}
/* ── Results ─────────────────────────────────────── */
.stats-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.75rem;
margin-bottom: 1rem;
}
.stat-box {
background: var(--bg);
border: 1px solid var(--border);
border-radius: var(--r);
padding: 0.9rem 1rem;
text-align: center;
}
.stat-val {
font-family: var(--serif);
font-size: 2rem;
font-weight: 700;
color: var(--accent);
line-height: 1;
}
.stat-label {
font-size: 10px;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--ink2);
margin-top: 0.3rem;
}
/* ── Animations ──────────────────────────────────── */
@keyframes fadeUp { from { opacity:0; transform:translateY(12px); } to { opacity:1; transform:translateY(0); } }
@keyframes fadeDown { from { opacity:0; transform:translateY(-8px); } to { opacity:1; transform:translateY(0); } }
/* ── Scrollbar ───────────────────────────────────── */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: var(--bg); }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
/* Loader */
.loader {
display: inline-block;
width: 16px;
height: 16px;
border: 2px solid rgba(255, 255, 255, 0.3);
border-radius: 50%;
border-top-color: white;
animation: spin 1s ease-in-out infinite;
margin-right: 8px;
vertical-align: middle;
}
@keyframes spin { to { transform: rotate(360deg); } }