:root{--text:#9ca3af;--text-h:#f3f4f6;--bg:#16171d;--border:#2e303a;--code-bg:#1f2028;--accent:#c084fc;--accent-bg:#c084fc26;--accent-border:#c084fc80;color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased;font-family:system-ui,Segoe UI,Roboto,sans-serif;font-size:16px;line-height:1.5}*,:before,:after{box-sizing:border-box}body{margin:0}#root{min-height:100svh}h1,h2,h3{color:var(--text-h);margin:0;font-weight:600}p{margin:0}code{background:var(--code-bg);color:var(--text-h);border-radius:4px;padding:2px 6px;font-family:ui-monospace,Consolas,monospace;font-size:.88em}.app{max-width:900px;margin:0 auto;padding:0 1.5rem 4rem}.app-header{border-bottom:1px solid var(--border);margin-bottom:2rem;padding:2.5rem 0 1.5rem}.header-top{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:1rem;display:flex}.app-header h1{color:var(--accent);margin:0 0 .25rem;font-size:2rem}.subtitle{color:var(--text-2,#888);margin:0;font-size:.95rem}.ollama-status{color:var(--text-2,#888);align-items:center;gap:.5rem;padding-top:.4rem;font-size:.82rem;display:flex}.status-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}.dot-checking{background:#888;animation:1s infinite pulse}.dot-ok{background:#4caf50}.dot-err{background:#ff4d4d}@keyframes pulse{0%,to{opacity:1}50%{opacity:.3}}.app-main{flex-direction:column;gap:1.5rem;display:flex}.card{border:1px solid var(--border);border-radius:10px;padding:1.5rem}.card h2{margin:0 0 1.25rem;font-size:1.1rem}.config-grid{grid-template-columns:1fr 1fr;gap:1rem;display:grid}.config-grid label{color:var(--text-2,#aaa);flex-direction:column;gap:.4rem;font-size:.88rem;display:flex}.config-grid select,.config-grid input,.config-grid textarea{border:1px solid var(--border);background:var(--bg,#1a1a1a);color:var(--text-h,#eee);resize:vertical;border-radius:6px;padding:.5rem .75rem;font-family:inherit;font-size:.95rem}.config-grid select:focus,.config-grid input:focus,.config-grid textarea:focus{outline:2px solid var(--accent);outline-offset:1px}.full-width{grid-column:1/-1}.optional{color:var(--text-2,#666);font-size:.8rem}.attack-header{justify-content:space-between;align-items:center;margin-bottom:1.25rem;display:flex}.attack-header h2{margin:0}.badge{background:var(--accent-bg,#2d1b4e);color:var(--accent);border-radius:12px;margin-left:.5rem;padding:1px 10px;font-size:.82rem;display:inline-block}.bulk-btns{gap:.5rem;display:flex}.btn-ghost{border:1px solid var(--border);color:var(--text-h,#eee);cursor:pointer;background:0 0;border-radius:6px;padding:.3rem .8rem;font-size:.85rem}.btn-ghost:hover{border-color:var(--accent);color:var(--accent)}.category-group{margin-bottom:1.25rem}.category-title{cursor:pointer;align-items:center;gap:.5rem;margin-bottom:.6rem;font-size:.93rem;font-weight:600;display:flex}.attack-list{flex-direction:column;gap:.4rem;padding-left:1.5rem;display:flex}.attack-item{cursor:pointer;align-items:center;gap:.6rem;padding:.25rem 0;font-size:.9rem;display:flex}.attack-name{flex:1}.severity-badge{text-transform:uppercase;letter-spacing:.04em;border-radius:10px;padding:2px 8px;font-size:.72rem;font-weight:700}.sev-high{color:#ff6b6b;background:#3d0f0f}.sev-medium{color:#ffab40;background:#3d2a0f}.sev-low{color:#81c784;background:#1a2e1a}.btn-primary{background:var(--accent,#aa3bff);color:#fff;cursor:pointer;border:none;border-radius:8px;padding:.75rem 2rem;font-size:1rem;font-weight:600;transition:opacity .2s}.btn-primary:hover:not(:disabled){opacity:.85}.btn-primary:disabled{opacity:.5;cursor:not-allowed}.run-btn{align-self:flex-start}.info-box{color:#ccc;background:#1a1a00;border:1px solid #444;border-radius:8px;margin-top:1rem;padding:.75rem 1rem;font-size:.88rem}.info-box code{color:#ffeb3b;background:#2a2a00;border-radius:4px;padding:1px 6px;font-family:monospace}.error-box{color:#ff8a8a;background:#1f0000;border:1px solid #ff4d4d;border-radius:8px;padding:.75rem 1rem;font-size:.9rem}.backend-down pre{color:#ffb3b3;background:#2a0000;border-radius:5px;margin:.5rem 0;padding:.5rem .75rem;font-size:.82rem}.backend-down .btn-ghost{color:#ff8a8a;border-color:#ff4d4d;margin-top:.5rem}.results-summary{flex-wrap:wrap;gap:.75rem;margin-bottom:1.25rem;display:flex}.summary-pill{border-radius:20px;padding:.3rem 1rem;font-size:.85rem;font-weight:600}.pill-vuln{color:#ff6b6b;background:#2a0000}.pill-safe{color:#66bb6a;background:#0a1f0a}.pill-uncertain{color:#ffab40;background:#1f1500}.results-list{flex-direction:column;gap:.75rem;display:flex}.result-item{border:1px solid var(--border);border-radius:8px;overflow:hidden}.result-summary{cursor:pointer;background:var(--bg-2,#111);flex-wrap:wrap;align-items:center;gap:.75rem;padding:.75rem 1rem;list-style:none;display:flex}.result-summary::-webkit-details-marker{display:none}.result-name{flex:1;min-width:150px;font-weight:600}.result-category{color:var(--text-2,#888);font-size:.82rem}.result-status{margin-left:auto;font-size:.85rem;font-weight:700}.result-body{border-top:1px solid var(--border);padding:1rem}.result-reason{color:var(--text-2,#aaa);margin:0 0 1rem;font-size:.88rem}.result-cols{grid-template-columns:1fr 1fr;gap:1rem;display:grid}.col-label{text-transform:uppercase;letter-spacing:.06em;color:var(--text-2,#888);margin:0 0 .4rem;font-size:.78rem}.result-text{background:var(--bg,#0d0d0d);border:1px solid var(--border);white-space:pre-wrap;word-break:break-word;max-height:250px;color:var(--text-h,#eee);border-radius:6px;margin:0;padding:.75rem;font-family:Fira Code,Cascadia Code,monospace;font-size:.82rem;overflow-y:auto}.progress-track{background:var(--bg,#0d0d0d);border:1px solid var(--border);border-radius:3px;height:6px;margin-bottom:1rem;overflow:hidden}.progress-fill{background:var(--accent,#aa3bff);border-radius:3px;height:100%;transition:width .3s}.log-panel{background:var(--bg,#0d0d0d);border:1px solid var(--border);border-radius:6px;max-height:220px;padding:.75rem;font-family:Fira Code,Cascadia Code,monospace;font-size:.78rem;line-height:1.6;overflow-y:auto}.log-line{color:var(--text-2,#9a9a9a);white-space:pre-wrap;word-break:break-word}.log-line:last-of-type{color:var(--text-h,#eee)}@media (width<=640px){.config-grid,.result-cols{grid-template-columns:1fr}}
