:root{--bg: #F5F6F4;--surface: #FFFFFF;--surface-sunken:#EFF1EE;--ink: #12141C;--ink-soft: #565B6B;--ink-faint: #8B90A0;--border: #E2E4E0;--border-strong: #CBCED0;--primary: #2F4B7C;--primary-ink: #1D2F52;--primary-soft: #E9EEF8;--rail-us: #2F4B7C;--rail-client: #A9782E;--rail-blocked: #B23B3B;--rail-done: #2F7D5B;--rail-neutral: #9AA0AE;--status-on-track-bg: #E7F3EC;--status-on-track-fg: #226B4A;--status-attention-bg:#FBF0DD;--status-attention-fg: #8C6218;--status-blocked-bg: #FBE9E7;--status-blocked-fg: #A23A2E;--status-at-risk-bg: #F6E1DE;--status-at-risk-fg: #8C2E23;--font-display: "Fraunces", Georgia, serif;--font-body: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;--font-mono: "JetBrains Mono", ui-monospace, monospace;--radius-sm: 6px;--radius-md: 10px;--radius-lg: 16px;--shadow-sm: 0 1px 2px rgba(18,20,28,.06);--shadow-md: 0 4px 16px rgba(18,20,28,.08)}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font-body);font-size:14px;-webkit-font-smoothing:antialiased}h1,h2,h3{font-family:var(--font-display);font-weight:600;margin:0;letter-spacing:-.01em}a{color:inherit}button{font-family:inherit}::selection{background:var(--primary-soft)}:focus-visible{outline:2px solid var(--primary);outline-offset:2px}.shell{display:flex;min-height:100vh}.sidebar{width:220px;flex-shrink:0;background:var(--surface);border-right:1px solid var(--border);padding:20px 14px;display:flex;flex-direction:column;gap:24px}.brand{font-family:var(--font-display);font-size:19px;font-weight:600;color:var(--ink);padding:0 8px}.brand .dot{color:var(--primary)}.nav{display:flex;flex-direction:column;gap:2px}.nav a{text-decoration:none;color:var(--ink-soft);font-size:13.5px;font-weight:500;padding:8px 10px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:space-between}.nav a:hover{background:var(--surface-sunken);color:var(--ink)}.nav a.active{background:var(--primary-soft);color:var(--primary-ink)}.nav .badge{font-family:var(--font-mono);font-size:11px;background:var(--surface-sunken);color:var(--ink-soft);padding:1px 6px;border-radius:20px}.nav a.active .badge{background:#fff;color:var(--primary-ink)}.main{flex:1;min-width:0}.topbar{height:60px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;padding:0 28px;background:var(--surface)}.content{padding:28px;max-width:1180px}.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;margin-bottom:28px}.kpi{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:14px 16px}.kpi-clickable{cursor:pointer;transition:border-color .12s ease,transform .12s ease}.kpi-clickable:hover{border-color:var(--primary);transform:translateY(-1px)}.kpi .n{font-family:var(--font-display);font-size:28px;font-weight:600;line-height:1}.kpi .label{font-size:12px;color:var(--ink-soft);margin-top:6px}.kpi.warn .n{color:var(--rail-blocked)}.section-title{font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-soft);margin:30px 0 12px}.section-title:first-child{margin-top:0}.rail-card{display:flex;align-items:center;gap:14px;background:var(--surface);border:1px solid var(--border);border-left:4px solid var(--rail-neutral);border-radius:var(--radius-md);padding:12px 16px;margin-bottom:8px}.rail-card.rail-us{border-left-color:var(--rail-us)}.rail-card.rail-client{border-left-color:var(--rail-client)}.rail-card.rail-blocked{border-left-color:var(--rail-blocked)}.rail-card.rail-done{border-left-color:var(--rail-done)}.rail-card .title{font-weight:500;font-size:13.5px}.rail-card .meta{font-size:12px;color:var(--ink-soft);margin-top:2px}.rail-card .spacer{flex:1}.rail-card .waiting{font-family:var(--font-mono);font-size:12px;color:var(--rail-client);white-space:nowrap}.chip{font-size:11.5px;font-weight:600;padding:3px 9px;border-radius:20px;white-space:nowrap}.chip.on_track,.chip.completed{background:var(--status-on-track-bg);color:var(--status-on-track-fg)}.chip.attention_required{background:var(--status-attention-bg);color:var(--status-attention-fg)}.chip.blocked{background:var(--status-blocked-bg);color:var(--status-blocked-fg)}.chip.at_risk{background:var(--status-at-risk-bg);color:var(--status-at-risk-fg)}.btn{font-size:13px;font-weight:600;padding:7px 14px;border-radius:var(--radius-sm);border:1px solid var(--border-strong);background:var(--surface);color:var(--ink);cursor:pointer}.btn:hover{background:var(--surface-sunken)}.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}.btn.primary:hover{background:var(--primary-ink)}.btn.ghost{border-color:transparent}.btn.sm{padding:4px 10px;font-size:12px}.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:16px}.card .name{font-weight:600;font-size:14.5px}.card .sub{font-size:12px;color:var(--ink-soft);margin-top:2px}.card .stats{display:flex;gap:14px;margin-top:12px;font-size:12px;color:var(--ink-soft)}.card .stats b{color:var(--ink);font-family:var(--font-mono)}.list-row{display:flex;align-items:center;gap:12px;padding:10px 4px;border-bottom:1px solid var(--border);font-size:13px}.list-row:last-child{border-bottom:none}.login-wrap{display:flex;align-items:center;justify-content:center;min-height:100vh;background:var(--bg)}.login-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg);padding:36px;width:340px;box-shadow:var(--shadow-md)}.login-card h1{font-size:22px;margin-bottom:6px}.login-card p{color:var(--ink-soft);font-size:13px;margin:0 0 22px}.field{margin-bottom:14px}.field label{display:block;font-size:12px;color:var(--ink-soft);margin-bottom:5px}.field input{width:100%;padding:9px 11px;border-radius:var(--radius-sm);border:1px solid var(--border-strong);font-size:14px;font-family:inherit}.error-msg{color:var(--rail-blocked);font-size:12.5px;margin-top:10px}.empty-state{color:var(--ink-faint);font-size:13px;padding:20px 0}.loading{color:var(--ink-faint);font-size:13px;padding:40px 0;text-align:center}.fab{position:fixed;bottom:24px;right:24px;width:52px;height:52px;border-radius:50%;background:var(--primary);color:#fff;border:none;font-size:26px;line-height:1;cursor:pointer;box-shadow:var(--shadow-md);display:flex;align-items:center;justify-content:center;z-index:15}.fab:hover{background:var(--primary-ink)}select{color:var(--ink)}.portal-shell{min-height:100vh;background:var(--bg);padding-bottom:76px}.portal-topbar{padding:18px 18px 14px;background:var(--surface);border-bottom:1px solid var(--border)}.portal-topbar .greeting{font-family:var(--font-display);font-size:19px;font-weight:600}.portal-topbar .sub{font-size:12.5px;color:var(--ink-soft);margin-top:2px}.portal-content{padding:18px 16px 8px;max-width:480px;margin:0 auto}.portal-attn-banner{background:var(--primary);color:#fff;border-radius:var(--radius-md);padding:14px 16px;margin-bottom:20px;font-size:14px;font-weight:600}.portal-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:14px 16px;margin-bottom:10px}.portal-card .title{font-weight:600;font-size:14px}.portal-card .meta{font-size:12px;color:var(--ink-soft);margin-top:3px}.portal-tabbar{position:fixed;bottom:0;left:0;right:0;display:flex;background:var(--surface);border-top:1px solid var(--border);padding:6px 8px calc(6px + env(safe-area-inset-bottom));z-index:10}.portal-tabbar a{flex:1;text-align:center;text-decoration:none;color:var(--ink-faint);font-size:11px;font-weight:600;padding:8px 4px;border-radius:var(--radius-sm);display:flex;flex-direction:column;align-items:center;gap:3px}.portal-tabbar a.active{color:var(--primary);background:var(--primary-soft)}.portal-tabbar .icon{font-size:18px}.portal-tabbar .count{position:relative;top:-1px;background:var(--rail-blocked);color:#fff;border-radius:20px;font-size:9.5px;padding:1px 5px;margin-left:3px}.progress-bar-track{background:var(--surface-sunken);border-radius:20px;height:6px;overflow:hidden;margin-top:8px}.progress-bar-fill{height:100%;background:var(--primary)}
