:root{--bg:#f5f7fb;--card:#fff;--text:#102a43;--muted:#627d98;--line:#d9e2ec;--ok:#2f855a;--warn:#b7791f;--err:#c53030;--todo:#3b82f6;--doing:#7c3aed;--blocked:#ef4444;--done:#059669}*{box-sizing:border-box}body,html{margin:0;padding:0;background:radial-gradient(circle at 20% 0,#e6f0ff 0,var(--bg) 35%);color:var(--text);font-family:IBM Plex Sans,Segoe UI,sans-serif}a{color:inherit;text-decoration:none}.container{max-width:1200px;margin:0 auto;padding:24px}.card{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px;box-shadow:0 8px 20px rgba(16,42,67,.06)}.grid{display:grid;grid-gap:16px;gap:16px}.grid.cols-3{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.kpi{font-size:28px;font-weight:700;margin-top:8px}.muted{color:var(--muted);font-size:13px}.badge{display:inline-flex;align-items:center;border-radius:999px;padding:4px 10px;font-size:12px;font-weight:600}.badge.todo{background:color-mix(in srgb,var(--todo) 18%,#fff);color:var(--todo)}.badge.doing{background:color-mix(in srgb,var(--doing) 18%,#fff);color:var(--doing)}.badge.blocked{background:color-mix(in srgb,var(--blocked) 16%,#fff);color:var(--blocked)}.badge.done{background:color-mix(in srgb,var(--done) 16%,#fff);color:var(--done)}.badge.ok{background:color-mix(in srgb,var(--ok) 16%,#fff);color:var(--ok)}.badge.failed,.badge.missed{background:color-mix(in srgb,var(--err) 16%,#fff);color:var(--err)}.table{width:100%;border-collapse:collapse}.table td,.table th{border-bottom:1px solid var(--line);text-align:left;padding:10px 8px;font-size:14px}.nav{display:flex;gap:10px;margin-bottom:20px}.nav a{border:1px solid var(--line);border-radius:8px;padding:8px 12px;background:#fff}.kanban{display:grid;grid-gap:14px;gap:14px;grid-template-columns:repeat(4,minmax(220px,1fr))}@media (max-width:1024px){.kanban{grid-template-columns:repeat(2,minmax(220px,1fr))}}@media (max-width:640px){.kanban{grid-template-columns:1fr}}.button,.input,.select{border:1px solid var(--line);border-radius:8px;height:36px;padding:0 10px;background:#fff}.button{cursor:pointer;font-weight:600}.row{display:flex;gap:10px;flex-wrap:wrap}.space-top{margin-top:14px}