:root{--bg: #ffffff;--bg-elev: #fafafa;--ink: #0a0a0a;--ink-muted: #5a5a5a;--line: #e6e6e6;--line-strong: #111111;--accent: #1a73e8;--good: #137333;--warn: #b06000;--bad: #b3261e;--chip-bg: #f1f3f4;--shadow: 0 1px 2px rgba(0, 0, 0, .06), 0 4px 12px rgba(0, 0, 0, .04);--radius: 10px;--radius-sm: 6px;font-family:Google Sans Text,Google Sans,Product Sans,Roboto,system-ui,-apple-system,Segoe UI,sans-serif}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--ink);font-family:inherit;font-size:14px;-webkit-font-smoothing:antialiased}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}button,input,select,textarea{font-family:inherit;font-size:14px;color:inherit}button{background:var(--ink);color:#fff;border:1px solid var(--ink);padding:10px 18px;border-radius:var(--radius-sm);cursor:pointer;font-weight:500;transition:opacity .15s ease}button:hover{opacity:.85}button:disabled{opacity:.4;cursor:not-allowed}button.secondary{background:#fff;color:var(--ink);border:1px solid var(--line-strong)}button.ghost{background:transparent;color:var(--ink);border:1px solid var(--line)}button.icon-btn{display:inline-flex;align-items:center;justify-content:center;padding:0;width:38px;height:38px}button.icon-btn .spinner{width:16px;height:16px}input[type=text],input[type=number],textarea,select{background:#fff;border:1px solid var(--line);border-radius:var(--radius-sm);padding:10px 12px;width:100%;outline:none;transition:border-color .15s ease}input:focus,textarea:focus,select:focus{border-color:var(--ink)}textarea{min-height:200px;resize:vertical;font-family:Google Sans Mono,ui-monospace,monospace}.app{min-height:100%;display:flex;flex-direction:column}.nav{display:flex;align-items:center;gap:24px;padding:16px 32px;border-bottom:1px solid var(--line);background:#fff;position:sticky;top:0;z-index:10}.nav .brand{font-weight:700;letter-spacing:-.02em;font-size:18px;color:var(--ink);display:flex;align-items:center;gap:8px}.nav .brand .dot{width:10px;height:10px;border-radius:50%;background:var(--ink);display:inline-block}.nav .links{display:flex;gap:4px;margin-left:auto}.nav .links a{color:var(--ink-muted);padding:8px 14px;border-radius:var(--radius-sm);font-weight:500}.nav .links a.active{color:var(--ink);background:var(--chip-bg)}.container{max-width:1200px;margin:0 auto;padding:32px;width:100%}h1{font-size:28px;font-weight:700;margin:0 0 8px;letter-spacing:-.02em}h2{font-size:18px;font-weight:500;margin:0 0 12px}.subtitle{color:var(--ink-muted);margin:0 0 24px}.card{background:var(--bg-elev);border:1px solid var(--line);border-radius:var(--radius);padding:24px}.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:20px}@media (max-width: 800px){.grid-2{grid-template-columns:1fr}}.row{display:flex;gap:12px;align-items:center}.row.gap-sm{gap:8px}.row.wrap{flex-wrap:wrap}.spacer{flex:1}.label{font-weight:500;font-size:13px;color:var(--ink-muted);margin-bottom:6px;display:block;text-transform:uppercase;letter-spacing:.04em}.dropzone{border:1.5px dashed var(--line-strong);border-radius:var(--radius);padding:16px;background:#fff;text-align:center;margin-bottom:12px;cursor:pointer;transition:background .15s ease}.dropzone:hover{background:var(--chip-bg)}.dropzone .file-name{font-weight:500}.chip{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;font-size:12px;font-weight:500;background:var(--chip-bg);color:var(--ink)}.chip.good{background:#e6f4ea;color:var(--good)}.chip.warn{background:#fef7e0;color:var(--warn)}.chip.bad{background:#fce8e6;color:var(--bad)}.chip.ink{background:var(--ink);color:#fff}table{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}th,td{text-align:left;padding:12px 14px;border-bottom:1px solid var(--line);vertical-align:top}th{font-weight:500;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-muted);background:var(--bg-elev)}tr:last-child td{border-bottom:none}tr.unmatched td{background:#fffbe6}.toolbar{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}.muted{color:var(--ink-muted)}.mono{font-family:Google Sans Mono,ui-monospace,monospace;font-size:13px}.empty{text-align:center;padding:48px;color:var(--ink-muted);border:1.5px dashed var(--line);border-radius:var(--radius)}.dash{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}@media (max-width: 900px){.dash{grid-template-columns:repeat(2,1fr)}}.kpi{background:var(--bg-elev);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px}.kpi-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-muted);font-weight:500}.kpi-value{font-size:28px;font-weight:700;letter-spacing:-.02em;margin-top:4px;color:var(--ink)}.kpi-sub-inline{font-size:14px;color:var(--ink-muted);font-weight:400}.kpi-sub{font-size:12px;color:var(--ink-muted);margin-top:4px}.kpi-bar{height:4px;background:var(--line);border-radius:2px;margin-top:8px;overflow:hidden}.kpi-bar>span{display:block;height:100%;background:var(--ink);transition:width .2s ease}.bucket-row{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:20px}.bucket{background:#fff;color:var(--ink);border:1px solid var(--line);border-radius:var(--radius-sm);padding:8px 12px;display:flex;flex-direction:column;gap:4px;min-width:96px;cursor:pointer;transition:border-color .15s ease,background .15s ease;font-weight:400}.bucket:hover{border-color:var(--ink);background:var(--chip-bg)}.bucket.active{border-color:var(--ink);background:var(--ink);color:#fff}.bucket.active .bucket-bar{background:#fff3}.bucket.active .bucket-bar>span{background:#fff}.bucket-label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:500;color:inherit;opacity:.85}.bucket-count{font-size:18px;font-weight:700;letter-spacing:-.02em}.bucket-bar{height:3px;background:var(--line);border-radius:2px;overflow:hidden;margin-top:2px}.bucket-bar>span{display:block;height:100%;background:var(--ink)}.bucket.good:not(.active) .bucket-bar>span{background:var(--good)}.bucket.warn:not(.active) .bucket-bar>span{background:var(--warn)}.bucket.bad:not(.active) .bucket-bar>span{background:var(--bad)}th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}th.sortable:hover{color:var(--ink)}.sort-glyph{margin-left:4px;font-size:11px}.spinner{width:14px;height:14px;border-radius:50%;border:2px solid var(--line);border-top-color:var(--ink);display:inline-block;animation:spin .7s linear infinite;vertical-align:middle}@keyframes spin{to{transform:rotate(360deg)}}
