:root{--bg: #0c1222;--surface: #131b2e;--surface-elevated: #1a2438;--border: #2a3754;--text: #e8edf7;--text-muted: #8b9ab8;--accent: #3b82f6;--accent-hover: #2563eb;--success: #22c55e;--warning: #eab308;--danger: #ef4444;--radius: 12px;--font: "Be Vietnam Pro", system-ui, sans-serif}*,*:before,*:after{box-sizing:border-box}html,body{margin:0;min-height:100%;font-family:var(--font);background:radial-gradient(ellipse 120% 80% at 50% -20%,#1e3a5f 0%,var(--bg) 55%);color:var(--text);line-height:1.5}#root{min-height:100vh}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}button{font-family:inherit;cursor:pointer}input,select{font-family:inherit}.app-shell{max-width:1040px;margin:0 auto;padding:2rem 1.25rem 4rem}.app-header{margin-bottom:2rem}.app-header h1{margin:0 0 .35rem;font-size:1.75rem;font-weight:700;letter-spacing:-.02em}.app-header p{margin:0;color:var(--text-muted);font-size:.95rem}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:1.25rem 1.35rem;margin-bottom:1.25rem;box-shadow:0 8px 32px #00000040}.card h2{margin:0 0 1rem;font-size:1.05rem;font-weight:600;color:var(--text)}.form-row{display:flex;flex-direction:column;gap:.35rem;margin-bottom:1rem}.form-row label{font-size:.85rem;font-weight:500;color:var(--text-muted)}.form-row input[type=text],.form-row input[type=file]{padding:.6rem .75rem;border-radius:8px;border:1px solid var(--border);background:var(--surface-elevated);color:var(--text);font-size:.95rem}.form-row input[type=file]{padding:.5rem}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.65rem 1.25rem;border-radius:8px;border:none;font-size:.95rem;font-weight:600;transition:background .15s,transform .1s}.btn:disabled{opacity:.55;cursor:not-allowed}.btn-primary{background:var(--accent);color:#fff}.btn-primary:hover:not(:disabled){background:var(--accent-hover)}.btn-secondary{background:var(--surface-elevated);color:var(--text);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){background:#243049}.btn-ghost{background:transparent;color:var(--accent);padding:.35rem .65rem}.status-line{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem 1.25rem;margin-bottom:1rem}.badge{display:inline-block;padding:.25rem .65rem;border-radius:999px;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.badge-pending{background:#eab30833;color:#facc15}.badge-processing{background:#3b82f633;color:#93c5fd}.badge-done{background:#22c55e33;color:#86efac}.badge-failed{background:#ef444433;color:#fca5a5}.progress-meta{font-size:.9rem;color:var(--text-muted)}.progress-meta strong{color:var(--text);font-weight:600}.bar{height:8px;background:var(--surface-elevated);border-radius:999px;overflow:hidden;margin-top:.5rem}.bar-fill{height:100%;background:linear-gradient(90deg,var(--accent),#60a5fa);border-radius:999px;transition:width .35s ease}.table-wrap{overflow-x:auto;margin:0 -.35rem}table.data{width:100%;border-collapse:collapse;font-size:.85rem}table.data th,table.data td{padding:.6rem .65rem;text-align:left;border-bottom:1px solid var(--border);vertical-align:top}table.data th{color:var(--text-muted);font-weight:600;white-space:nowrap}table.data tr:hover td{background:#ffffff05}.pager{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-top:1rem;flex-wrap:wrap}.pager span{font-size:.85rem;color:var(--text-muted)}.alert{padding:.75rem 1rem;border-radius:8px;font-size:.9rem;margin-bottom:1rem}.alert-error{background:#ef44441f;border:1px solid rgba(239,68,68,.35);color:#fecaca}.alert-info{background:#3b82f61a;border:1px solid rgba(59,130,246,.3);color:#bfdbfe}.mono{font-family:ui-monospace,Cascadia Code,monospace;font-size:.8rem;word-break:break-all}.inline-actions{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center}.lookup-row{display:flex;flex-wrap:wrap;gap:.5rem;align-items:flex-end;margin-bottom:1rem}.lookup-row input{flex:1;min-width:200px;padding:.6rem .75rem;border-radius:8px;border:1px solid var(--border);background:var(--surface-elevated);color:var(--text)}
