
:root{--bg:#0a0f0d;--panel:#111815;--panel2:#18211d;--line:#2a3b32;--text:#eef7f0;--muted:#96aa9e;--green:#36d36b;--green2:#1f9f4c;--amber:#ffb436;--red:#ff5f57;--blue:#52a9ff;--shadow:0 18px 50px #0008}
*{box-sizing:border-box}html,body{margin:0;background:var(--bg);color:var(--text);font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}
body{min-height:100vh}.topbar{height:62px;display:flex;align-items:center;gap:18px;padding:0 18px;border-bottom:1px solid var(--line);background:#0e1512;position:sticky;top:0;z-index:20}
.logo{font-weight:900;letter-spacing:.3px}.logo b{color:var(--green)}.mode{font-size:12px;padding:7px 10px;border:1px solid #315541;border-radius:999px;color:#bfe8ca}.status{margin-left:auto;display:flex;gap:10px;align-items:center;font-size:12px;color:var(--muted)}
.dot{width:9px;height:9px;border-radius:50%;background:var(--amber);box-shadow:0 0 12px #ffb43688}.dot.ok{background:var(--green);box-shadow:0 0 12px #36d36b88}
.shell{display:grid;grid-template-columns:240px minmax(0,1fr);min-height:calc(100vh - 62px)}.sidebar{padding:16px 12px;border-right:1px solid var(--line);background:#0d1311;position:sticky;top:62px;height:calc(100vh - 62px);overflow:auto}
.navbtn{display:flex;width:100%;gap:11px;align-items:center;text-align:left;padding:12px 12px;margin:4px 0;border:1px solid transparent;border-radius:10px;background:transparent;color:#cad8cf;font-size:14px;cursor:pointer}.navbtn:hover,.navbtn.active{background:#17241d;border-color:#2c5539;color:white}.navbtn .ico{width:22px;text-align:center}.navgroup{font-size:10px;color:#668074;text-transform:uppercase;letter-spacing:1.4px;padding:16px 10px 5px}
.content{padding:22px;min-width:0}.screen{display:none}.screen.active{display:block}.hero{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:18px}.hero h1{font-size:26px;margin:0 0 6px}.hero p{margin:0;color:var(--muted);max-width:850px}
.badge{font-size:11px;border:1px solid #315541;color:#bfe8ca;padding:6px 9px;border-radius:999px;white-space:nowrap}
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:14px}.card{background:linear-gradient(180deg,#141e19,#101713);border:1px solid var(--line);border-radius:14px;padding:16px;box-shadow:0 10px 30px #0003}.c3{grid-column:span 3}.c4{grid-column:span 4}.c5{grid-column:span 5}.c6{grid-column:span 6}.c7{grid-column:span 7}.c8{grid-column:span 8}.c12{grid-column:span 12}
.kpi{font-size:32px;font-weight:900;margin-top:8px}.kpi small{font-size:13px;font-weight:600;color:var(--muted)}.label{font-size:11px;color:#789087;text-transform:uppercase;letter-spacing:1.2px}
input,select,textarea{width:100%;background:#0d1411;border:1px solid #304239;color:white;border-radius:9px;padding:11px 12px;outline:none;font:inherit}input:focus,select:focus,textarea:focus{border-color:#3eba67;box-shadow:0 0 0 3px #36d36b1a}textarea{min-height:95px;resize:vertical}
.formgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.formgrid .wide{grid-column:1/-1}.btn{border:0;border-radius:9px;padding:11px 14px;font-weight:800;cursor:pointer;background:var(--green);color:#06220f}.btn:hover{filter:brightness(1.06)}.btn.secondary{background:#1e2b25;color:#e7f3ea;border:1px solid #34493e}.btn.warn{background:var(--amber);color:#2b1b00}.btn.red{background:#3a1d1c;color:#ffb2ad;border:1px solid #6a2927}.btnrow{display:flex;gap:9px;flex-wrap:wrap;margin-top:12px}
.tablewrap{overflow:auto;border:1px solid var(--line);border-radius:11px}table{width:100%;border-collapse:collapse;min-width:720px}th,td{padding:10px 12px;border-bottom:1px solid #24332b;text-align:left;font-size:13px}th{color:#89a296;font-size:10px;text-transform:uppercase;letter-spacing:1px;background:#111a16;position:sticky;top:0}tr:last-child td{border-bottom:0}
.code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;color:#8dd7ff}.sev{display:inline-block;padding:4px 7px;border-radius:999px;font-size:10px;font-weight:800}.sev.green{background:#183d24;color:#75ee96}.sev.amber{background:#443218;color:#ffd073}.sev.red{background:#49211f;color:#ff938e}.muted{color:var(--muted)}.small{font-size:12px}.tiny{font-size:10px}
.scanbar{height:8px;background:#18231e;border-radius:999px;overflow:hidden;margin:12px 0}.scanbar span{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--green2),var(--green));transition:width .5s}
.result{border:1px solid #2b4435;background:#111a16;border-radius:12px;padding:14px;margin:10px 0}.result.top{border-color:#3ba85e;box-shadow:0 0 0 1px #3ba85e33}.result h3{margin:0 0 7px;font-size:17px}.rank{float:right;font-size:11px;color:#9dbaa8}.steps{counter-reset:s}.step{display:grid;grid-template-columns:34px 1fr auto;gap:10px;align-items:start;padding:12px 0;border-bottom:1px solid #223028}.step:last-child{border-bottom:0}.stepnum{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;background:#1f3428;color:#91f1a8;font-weight:900}.teststate{display:flex;gap:5px}.teststate button{font-size:10px;padding:6px 7px;border-radius:7px;border:1px solid #334b3d;background:#17221d;color:#c6d6cc;cursor:pointer}.teststate button.pass.active{background:#184b2a;color:#8af0a3}.teststate button.fail.active{background:#4b211f;color:#ff9c96}
.data-list{display:grid;grid-template-columns:1fr 1fr;gap:8px}.data-item{padding:11px;background:#0e1612;border:1px solid #26372f;border-radius:9px}.data-item strong{display:block;font-size:12px}.data-item input,.data-item select{margin-top:7px}
.alert{padding:12px 14px;border-radius:10px;border:1px solid #654c22;background:#2b2314;color:#ffd78d}.alert.red{border-color:#6b2b28;background:#2d1918;color:#ffaaa5}.alert.green{border-color:#285c38;background:#15281b;color:#9af3ad}
.source{font-size:11px;color:#86a593}.source a{color:#72bdff}.empty{padding:24px;text-align:center;color:#789087;border:1px dashed #304139;border-radius:12px}
.drawer{position:fixed;right:0;top:62px;bottom:0;width:min(440px,95vw);background:#101713;border-left:1px solid var(--line);box-shadow:-25px 0 60px #0007;z-index:50;transform:translateX(100%);transition:.25s;overflow:auto;padding:18px}.drawer.open{transform:none}.close{float:right;background:transparent;border:0;color:white;font-size:24px;cursor:pointer}
.gate{max-width:520px;margin:7vh auto;padding:26px;background:#121b17;border:1px solid #30483a;border-radius:18px;box-shadow:var(--shadow)}.gate h1{margin-top:0}.gate .logo{font-size:24px;margin-bottom:18px}.gate input{margin:8px 0}.gateMsg{min-height:20px;color:#ffb28c;font-size:12px}
.report{background:white;color:#111;padding:26px;border-radius:10px}.report h2{color:#146b37}.report table{min-width:0}.report th,.report td{border-color:#ddd;color:#222;background:white}
@media(max-width:1000px){.shell{grid-template-columns:82px minmax(0,1fr)}.sidebar{padding:12px 7px}.navbtn{display:block;text-align:center;padding:10px 3px;font-size:9px}.navbtn .ico{display:block;width:auto;font-size:18px;margin-bottom:4px}.navgroup{display:none}.c3,.c4,.c5,.c6,.c7,.c8{grid-column:span 6}}
@media(max-width:680px){.topbar{padding:0 10px}.mode{display:none}.status .small{display:none}.shell{display:block}.sidebar{position:fixed;left:0;right:0;bottom:0;top:auto;height:68px;z-index:30;display:flex;overflow-x:auto;border-right:0;border-top:1px solid var(--line);padding:4px;background:#0d1311}.navbtn{min-width:72px;margin:0 2px}.content{padding:14px 12px 82px}.hero{display:block}.badge{display:inline-block;margin-top:8px}.c3,.c4,.c5,.c6,.c7,.c8,.c12{grid-column:span 12}.formgrid{grid-template-columns:1fr}.data-list{grid-template-columns:1fr}}
@media print{.topbar,.sidebar,.btn,.btnrow,.no-print{display:none!important}.shell{display:block}.content{padding:0}.screen{display:none!important}#reportScreen{display:block!important}.report{box-shadow:none;border:0}.report *{color:#111!important}}

/* V5.1 Bluetooth dealer connector */
.ble-connected{border-color:#3fcf73!important;box-shadow:0 0 0 1px rgba(63,207,115,.25) inset}.ble-grid{display:grid;grid-template-columns:minmax(180px,1fr) 2fr auto;gap:8px;align-items:center}.ble-value{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:#cfe9ff}.ble-source{font-size:11px;color:#6faed8;text-transform:uppercase;letter-spacing:.06em}.gatt-service{margin:8px 0;border:1px solid #253a4d;border-radius:8px;padding:10px;background:#101c27}.gatt-char{display:grid;grid-template-columns:minmax(200px,1fr) 1fr;gap:12px;padding:7px 0;border-top:1px solid #203341}.gatt-char:first-child{border-top:0}.ble-pass{color:#66e28f}.ble-fail{color:#ff7b7b}.ble-warn{color:#ffc85c}
