:root{
  --violet:#5b4fe0; --violet-deep:#4338c4; --violet-soft:#efeefc; --lilac:#f5f4fc;
  --skyblue:#4f8cf5; --sky-soft:#e7f0ff; --grey:#eceef5; --grey-2:#f6f7fb;
  --line:#dcdcee; --ink:#2a2740; --muted:#7d7a93;
  --yellow:#ffe23a; --green:#5bd08a; --warn:#e0a400; --bad:#ef6f53;
  --shadow:0 18px 50px rgba(60,50,120,.18);
}
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{
  font-family:"IBM Plex Sans",system-ui,sans-serif;color:var(--ink);
  background:
    radial-gradient(820px 540px at 10% -8%, #ece9fb 0%, transparent 60%),
    radial-gradient(680px 480px at 112% 118%, #e3eeff 0%, transparent 55%),
    #f3f2fa;
  display:grid;place-items:center;padding:26px;min-height:100%;
}
.grow{flex:1}
.app{width:min(1080px,100%);background:#fff;border:1px solid var(--line);
  border-radius:14px;box-shadow:var(--shadow);overflow:hidden}

.titlebar{display:flex;align-items:center;gap:10px;padding:9px 13px;
  background:linear-gradient(180deg,#f3f1fd,#e9e7fa);border-bottom:1px solid var(--line)}
.logo-chip{font-family:"IBM Plex Mono",monospace;font-weight:600;color:#fff;
  letter-spacing:.5px;background:var(--violet);padding:4px 14px;border-radius:7px;
  box-shadow:0 4px 12px rgba(91,79,224,.35)}
.winbtn{color:#8b88a8;width:30px;text-align:center;cursor:pointer;border-radius:6px;user-select:none}
.winbtn:hover{background:#ddd9f3}
.winbtn.close:hover{background:#ef5f53;color:#fff}
.home-link{font-family:"IBM Plex Mono",monospace;font-size:12px;font-weight:600;
  color:var(--violet-deep);text-decoration:none;padding:3px 9px;border-radius:6px;
  background:var(--violet-soft);border:1px solid var(--line);transition:.14s}
.home-link:hover{background:#ddd9f3;border-color:var(--violet)}

.config{display:grid;grid-template-columns:1.25fr 1fr;gap:18px;padding:16px 18px;background:var(--lilac)}
.cfg-row{display:flex;align-items:center;gap:12px;margin-bottom:10px}
.cfg-row label{min-width:96px;color:var(--muted);font-size:13px;font-weight:600}
.callout{font-family:"IBM Plex Mono",monospace;font-size:12.5px;color:#241f00;
  padding:6px 10px;border-radius:7px;flex:1;line-height:1.3;border:1px solid rgba(0,0,0,.12)}
.callout.yellow{background:#fff0a8}
.callout.green{background:#c9f5d8;color:#0b3a1f}
.seg{display:flex;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:#fff}
.seg button{background:transparent;color:var(--muted);border:0;padding:7px 14px;cursor:pointer;
  font-family:inherit;font-weight:600;font-size:13px;transition:.15s}
.seg button.active{background:var(--violet);color:#fff}
.toggles{gap:22px}
.chk,.num{display:flex;align-items:center;gap:7px;color:var(--muted);font-size:13px;font-weight:600}
.num input{width:58px;background:#fff;border:1px solid var(--line);color:var(--ink);
  border-radius:6px;padding:4px 6px;font-family:"IBM Plex Mono",monospace}
input[type=checkbox]{accent-color:var(--violet);width:15px;height:15px}

.list{margin:0 16px;border:1px solid var(--line);border-radius:10px;overflow:hidden}
.list-head,.row{display:grid;grid-template-columns:1fr 90px 1.2fr 150px;align-items:center;padding:9px 14px;gap:8px}
.list-head{background:var(--violet);color:#fff;font-weight:600;font-size:12px;letter-spacing:.4px;text-transform:uppercase}
.list-body{min-height:230px;max-height:340px;overflow:auto;background:#fff}
.row{border-bottom:1px solid var(--grey);font-size:13.5px}
.row:nth-child(odd){background:var(--grey-2)}
.row .fn{font-family:"IBM Plex Mono",monospace;display:flex;align-items:center;gap:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.row .sz,.row .fo{color:var(--muted);font-size:12.5px}
.tag{font-size:11px;font-weight:700;padding:1px 8px;border-radius:20px;letter-spacing:.3px}
.tag.online{background:var(--violet-soft);color:var(--violet-deep)}
.tag.offline{background:var(--sky-soft);color:#1d5bc0}
.tag.pdf{background:#fdeccc;color:#8a5a00}
.status{font-weight:700;font-size:12.5px;padding:4px 10px;border-radius:7px;text-align:center}
.status.solved{background:#dcf6e6;color:#0d6e3a}
.status.check{background:var(--yellow);color:#4a3f00}
.status.noaccess{background:#fde0d7;color:#9c3a23}
.status.pending{background:var(--grey);color:var(--muted)}
.empty{padding:80px 20px;text-align:center;color:var(--muted);font-size:14px}

.stats{display:flex;align-items:center;gap:10px;padding:14px 16px;flex-wrap:wrap}
.stat{background:var(--violet-soft);border:1px solid var(--line);border-radius:10px;
  padding:8px 14px;min-width:104px;display:flex;flex-direction:column;gap:2px}
.stat .k{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.4px;font-weight:600}
.stat .v{font-family:"IBM Plex Mono",monospace;font-size:18px;font-weight:600;color:var(--violet-deep)}
.stat .v.warn{color:var(--warn)}
.stat.highlight-on-dev.dev{background:var(--yellow);border-color:#d6b800}
.stat.highlight-on-dev.dev .k{color:#5a4d00}
.stat.highlight-on-dev.dev .v{color:#241f00}
.ppi-verdict .v{font-size:13px;font-family:"IBM Plex Sans"}

.actions{display:flex;align-items:center;gap:12px;padding:14px 16px 8px;border-top:1px solid var(--line)}
.brandbox{display:flex;flex-direction:column;border:1.5px solid var(--violet);border-radius:9px;
  padding:8px 16px;background:var(--violet-soft)}
.brand-l,.brand-r{font-family:"IBM Plex Mono",monospace;color:var(--violet-deep);font-weight:600;font-size:14px;text-align:center}
a.brand-l{text-decoration:none}
a.brand-l:hover{text-decoration:underline}
.btn{background:#fff;color:var(--ink);border:1px solid var(--line);border-radius:8px;
  padding:9px 16px;font-family:inherit;font-weight:600;font-size:13.5px;cursor:pointer;transition:.14s}
.btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 6px 16px rgba(60,50,120,.18);border-color:#c4c2e6}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn.run{background:var(--violet);border-color:var(--violet-deep);color:#fff;min-width:150px}
.btn.run.ready{animation:pulse 1.6s ease-in-out infinite}
.btn.primary{background:var(--green);border-color:#3fb56e;color:#063318}
.btn.ghost{background:#fff;color:var(--violet-deep);border-color:var(--violet)}
.btn.small{padding:7px 16px}
.stack{display:flex;flex-direction:column;gap:6px}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(91,79,224,.45)}50%{box-shadow:0 0 0 6px rgba(91,79,224,0)}}
.copyright{text-align:center;color:var(--violet-deep);font-weight:600;font-size:13px;padding:6px 0 16px}
.copyright a{color:inherit;text-decoration:none}
.copyright a:hover{text-decoration:underline}

.toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);
  background:#fff;border:1px solid var(--line);color:var(--ink);padding:12px 18px;
  border-radius:10px;box-shadow:var(--shadow);font-size:13.5px;max-width:80vw}
.toast.bad{border-color:var(--bad);color:#9c3a23}
.toast.busy::after{content:"";display:inline-block;width:12px;height:12px;margin-left:8px;
  border:2px solid var(--violet);border-top-color:transparent;border-radius:50%;
  vertical-align:-2px;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
@media(max-width:720px){.config{grid-template-columns:1fr}
  .list-head,.row{grid-template-columns:1fr 70px 110px}.col-folder,.row .fo{display:none}}

/* ── preflight panel ── */
.preflight{margin:14px 16px 0;border:1px solid var(--line);border-radius:11px;
  background:var(--grey-2);padding:12px 14px}
.pf-head{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.pf-badge{font-size:11px;font-weight:700;letter-spacing:.5px;padding:3px 10px;border-radius:20px;
  background:var(--grey);color:var(--muted)}
.pf-badge.ok{background:#dcf6e6;color:#0d6e3a}
.pf-badge.warn{background:var(--yellow);color:#4a3f00}
.pf-summary{font-size:13.5px;font-weight:600;color:var(--ink)}
.pf-maps{display:flex;flex-wrap:wrap;gap:8px 16px;margin-bottom:9px}
.pf-map{font-size:12px;color:var(--muted)}
.pf-map b{color:var(--violet-deep);font-weight:600}
.pf-issues{display:flex;flex-wrap:wrap;gap:7px}
.chip{font-size:11.5px;font-weight:600;padding:3px 10px;border-radius:7px;
  background:var(--grey);color:var(--ink);font-family:"IBM Plex Mono",monospace}
.chip.warn{background:var(--yellow);color:#4a3f00}
.chip.info{background:var(--sky-soft);color:#1d5bc0}
.chip.ok{background:#dcf6e6;color:#0d6e3a}
.chip.more{background:var(--violet-soft);color:var(--violet-deep)}
