/* labdb — Lab Data API admin UI * Quiet Luxury / Maison Dark theme * Copyright (c) 2026 Charles KWON OhJun */ :root { --bg-primary: #080808; --bg-secondary: #121210; --bg-tertiary: #1c1a18; --bg-hover: rgba(255, 248, 240, 0.04); --text-primary: #e8e4df; --text-secondary: #a8a39d; --text-tertiary: #6a6560; --text-inverse: #080808; --accent: #c9a96e; --accent-hover: #d4b87a; --accent-light: rgba(201, 169, 110, 0.08); --border: rgba(255, 248, 240, 0.06); --border-light: rgba(255, 248, 240, 0.04); --status-active: #22c55e; --status-pending: #eab308; --status-error: #ef4444; --status-muted: #71717a; --r-sm: 8px; --r-md: 12px; --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; --sp-5: 20px; --sp-6: 24px; --sp-8: 32px; --sp-10: 40px; } * { box-sizing: border-box; -webkit-tap-highlight-color: transparent; } html, body { margin: 0; padding: 0; } body { background: var(--bg-primary); color: var(--text-primary); font-family: -apple-system, "Segoe UI", "Helvetica Neue", "Noto Sans", sans-serif; font-size: 14px; -webkit-font-smoothing: antialiased; min-height: 100dvh; } a { color: inherit; text-decoration: none; } a:hover { color: var(--accent); } .hidden { display: none !important; } /* ── Header ─────────────────────────── */ .header { display: flex; align-items: center; gap: var(--sp-4); padding: 0 var(--sp-6); min-height: 56px; background: rgba(8,8,8,0.85); backdrop-filter: saturate(140%) blur(20px); -webkit-backdrop-filter: saturate(140%) blur(20px); border-bottom: 1px solid var(--border); position: sticky; top: 0; z-index: 50; padding-top: env(safe-area-inset-top); } .header h1 { font-size: 16px; font-weight: 500; margin: 0; letter-spacing: -0.01em; } .header .subtitle { font-size: 11px; color: var(--text-tertiary); margin-top: -2px; letter-spacing: 0.04em; text-transform: uppercase; } .header-spacer { flex: 1; } .header-actions { display: flex; align-items: center; gap: var(--sp-2); } /* ── Layout ─────────────────────────── */ .container { max-width: 1400px; margin: 0 auto; padding: var(--sp-6); } .container-sm { max-width: 480px; margin: 80px auto; padding: var(--sp-6); } /* ── Cards ─────────────────────────── */ .card { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--r-md); overflow: hidden; } .card-padded { padding: var(--sp-6); } /* ── Stats grid ─────────────────────── */ .stats-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--sp-4); margin-bottom: var(--sp-6); } .stat-card { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--sp-5); } .stat-label { font-size: 10px; color: var(--accent); text-transform: uppercase; letter-spacing: 0.12em; margin-bottom: var(--sp-2); } .stat-value { font-size: 28px; font-weight: 500; letter-spacing: -0.02em; } @media (max-width: 768px) { .stats-grid { grid-template-columns: repeat(2, 1fr); } .container { padding: var(--sp-4); } } /* ── Tabs ─────────────────────────── */ .tabs { display: flex; gap: var(--sp-2); border-bottom: 1px solid var(--border); margin-bottom: var(--sp-5); } .tab { padding: var(--sp-3) var(--sp-4); background: none; border: none; color: var(--text-tertiary); cursor: pointer; font-size: 13px; border-bottom: 2px solid transparent; margin-bottom: -1px; } .tab.active { color: var(--accent); border-bottom-color: var(--accent); } /* ── Tables ─────────────────────────── */ .table-wrap { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--r-md); overflow: hidden; } table { width: 100%; border-collapse: collapse; font-size: 13px; } thead th { background: var(--bg-tertiary); color: var(--accent); font-weight: 500; text-align: left; padding: var(--sp-3) var(--sp-4); font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; border-bottom: 1px solid var(--border); } tbody td { padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid var(--border-light); } tbody tr:hover { background: var(--bg-hover); } tbody tr:last-child td { border-bottom: none; } .text-mono { font-family: "JetBrains Mono", "SF Mono", Menlo, monospace; font-size: 12px; } .text-meta { color: var(--text-tertiary); font-size: 12px; } .text-right { text-align: right; } /* ── Badges ─────────────────────────── */ .badge { display: inline-block; padding: 3px 10px; font-size: 10px; font-weight: 500; border-radius: 100px; text-transform: uppercase; letter-spacing: 0.06em; } .badge-active { background: rgba(34,197,94,0.12); color: var(--status-active); } .badge-completed { background: rgba(201,169,110,0.12); color: var(--accent); } .badge-aborted { background: rgba(239,68,68,0.12); color: var(--status-error); } .badge-muted { background: rgba(113,113,122,0.12); color: var(--status-muted); } /* ── Buttons ─────────────────────────── */ .btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 16px; background: var(--bg-tertiary); color: var(--text-primary); border: 1px solid var(--border); border-radius: var(--r-sm); font-size: 13px; font-weight: 500; cursor: pointer; transition: all 0.15s ease; font-family: inherit; min-height: 36px; } .btn:hover { background: var(--bg-hover); border-color: var(--accent); } .btn-primary { background: var(--accent); color: var(--text-inverse); border-color: var(--accent); } .btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); } .btn-ghost { background: none; border: none; } .btn-sm { padding: 4px 10px; font-size: 12px; min-height: 28px; } /* ── Forms ─────────────────────────── */ .form-group { margin-bottom: var(--sp-4); } .form-group label { display: block; font-size: 11px; color: var(--accent); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 6px; } .form-group input, .form-group select, .form-group textarea { width: 100%; padding: 12px var(--sp-4); background: var(--bg-tertiary); color: var(--text-primary); border: 1px solid var(--border); border-radius: var(--r-sm); font-size: 16px; /* prevent iOS zoom */ font-family: inherit; outline: none; } .form-group input:focus { border-color: var(--accent); } .form-row { display: flex; gap: var(--sp-3); align-items: center; } /* ── Search ─────────────────────────── */ .search-box { display: flex; align-items: center; background: var(--bg-tertiary); border: 1px solid var(--border); border-radius: var(--r-sm); padding: 0 var(--sp-3); max-width: 300px; width: 100%; } .search-box input { background: none; border: none; outline: none; color: var(--text-primary); padding: 8px 0; width: 100%; font-size: 14px; } /* ── Login ─────────────────────────── */ .login-card { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--sp-8); } .login-card h1 { margin: 0 0 var(--sp-2); font-size: 22px; font-weight: 500; letter-spacing: -0.01em; text-align: center; } .login-card .subtitle { text-align: center; color: var(--text-tertiary); font-size: 12px; margin-bottom: var(--sp-6); letter-spacing: 0.06em; text-transform: uppercase; } .error-msg { background: rgba(239,68,68,0.1); color: var(--status-error); padding: 10px 14px; border-radius: var(--r-sm); font-size: 13px; margin-bottom: var(--sp-4); } /* ── Footer ─────────────────────────── */ .footer { text-align: center; color: var(--text-tertiary); font-size: 11px; padding: var(--sp-6); } /* ── Page header ───────────────────── */ .page-header { display: flex; align-items: center; gap: var(--sp-4); margin-bottom: var(--sp-5); } .page-header h2 { font-size: 18px; font-weight: 500; margin: 0; }