*{box-sizing:border-box;caret-color:transparent}html,body,.wrap,.card,.release,.row,.step,h1,h2,h3,p,small,span,div,label{user-select:none;cursor:default}input,textarea{user-select:text;cursor:text;caret-color:auto}select,button{user-select:none;caret-color:transparent}body{margin:0;background:#061426;color:#f2f7ff;font-family:"Segoe UI",Arial,sans-serif;min-height:100vh}.wrap{max-width:900px;margin:28px auto;padding:0 20px}.card{background:#0d2746;border:1px solid #235b88;border-radius:20px;padding:28px;margin:18px 0}h1,h2{margin:0 0 12px}p,small{color:#b8cbe2}.steps{display:flex;gap:18px}.step{flex:1;padding:14px;background:#0a1f37;border-radius:14px}.btn,button{border:0;border-radius:12px;padding:12px 20px;font-weight:700;background:linear-gradient(90deg,#20b5ed,#4267ff);color:white;cursor:pointer}button:disabled{opacity:.45;cursor:not-allowed}.secondary{background:#1b3a5c}.bad{background:#8b2940}.ok{background:#147c61}input,select,textarea{width:100%;padding:12px 14px;border-radius:10px;border:1px solid #2f5f87;background:#081d33;color:white;margin:6px 0 12px;caret-color:auto}.release,.row{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:14px;margin:9px 0;border:1px solid #28597f;border-radius:14px;background:#09213a}.release.sel{outline:2px solid #3ca4ff}.release small{display:block;margin-top:5px}.modal,.busyOverlay{display:none;position:fixed;inset:0;background:#020a13c9;align-items:center;justify-content:center;z-index:30}.modal.show,.busyOverlay.show{display:flex}.dialog{width:min(460px,90vw);background:#102c4d;border:1px solid #3675a5;border-radius:22px;padding:30px;text-align:center}.spinner{width:44px;height:44px;border:4px solid #24496b;border-top-color:#39bfff;border-radius:50%;animation:s 1s linear infinite;margin:0 auto 18px}@keyframes s{to{transform:rotate(360deg)}}.top{display:flex;justify-content:space-between;align-items:center}.tag{font-size:12px;letter-spacing:3px;color:#39c7ff}body.busy{pointer-events:none}body.busy .busyOverlay{pointer-events:auto}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}@media(max-width:700px){.grid2,.steps{grid-template-columns:1fr;display:block}.step{margin:8px 0}}
.inlineState{margin-top:12px;min-height:20px;color:#b8cbe2;font-size:14px}.okText{color:#77e6b8}.warnText{color:#ffd27a}.badText{color:#ff9aa9}.progressBox{margin:18px 0}.progressTrack{height:14px;background:#071a2f;border:1px solid #28597f;border-radius:999px;overflow:hidden}.progressBar{height:100%;width:0;background:linear-gradient(90deg,#20b5ed,#4267ff);transition:width .12s linear}.progressText{margin-top:9px;color:#d8e9fb;font-weight:700;font-variant-numeric:tabular-nums}.modal{z-index:50}.busyOverlay{z-index:40}

/* v1.0.3 customer UX */
.busyOverlay{pointer-events:none}.busyOverlay.show{pointer-events:auto}.modal.show{pointer-events:auto}
.release{position:relative;transition:transform .18s ease,border-color .18s ease,background .18s ease,box-shadow .18s ease}
.release:hover{transform:translateY(-1px)}
.release.sel{outline:none;border-color:#48c7ff;background:#10335a;box-shadow:0 0 0 2px rgba(72,199,255,.22),0 0 22px rgba(32,181,237,.18);animation:selectedPulse 1.35s ease-in-out infinite}
.release.sel button{background:linear-gradient(90deg,#16c7a4,#20b5ed);transform:scale(1.03)}
@keyframes selectedPulse{0%,100%{box-shadow:0 0 0 2px rgba(72,199,255,.18),0 0 14px rgba(32,181,237,.12)}50%{box-shadow:0 0 0 3px rgba(72,199,255,.32),0 0 28px rgba(32,181,237,.25)}}
.portDialog{width:min(560px,92vw)}.portList{display:grid;gap:10px;margin:18px 0}.portChoice{width:100%;text-align:left;background:#0a2038;border:1px solid #2c638f;padding:14px 16px}.portChoice:hover{border-color:#42c3ff;background:#10345a}.portChoice small{display:block;margin-top:5px}.portActions{display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
.connectionLost{color:#ffb4bf}

/* v1.0.6 explicit port selection + firmware metadata */
.portChoice.selected{border-color:#48c7ff;background:#103d67;box-shadow:0 0 0 2px rgba(72,199,255,.22),0 0 18px rgba(32,181,237,.16)}
.currentFwBox{margin-top:16px;padding:14px 16px;border:1px solid #2c638f;border-radius:14px;background:#09213a;display:grid;grid-template-columns:auto 1fr;gap:4px 14px;align-items:baseline}
.currentFwBox[hidden]{display:none}.currentFwBox>span{color:#b8cbe2}.currentFwBox>strong{font-size:18px;color:#fff}.currentFwBox>small{grid-column:2;color:#b8cbe2}.currentFwHint{grid-column:1/-1;margin-top:4px;font-size:13px}

/* v1.0.7 workflow state */
.step{position:relative;overflow:hidden;transition:background .28s ease,border-color .28s ease,box-shadow .28s ease,transform .28s ease;border:1px solid transparent}
.step.active{background:#103b64;border-color:#35bfff;box-shadow:0 0 0 1px #35bfff55,0 0 22px #2fbaff22;animation:stepPulse 1.35s ease-in-out infinite}
.step.success{background:#0d5b49;border-color:#27d8a0;box-shadow:0 0 18px #27d8a02b}
.step.error{background:#6d2337;border-color:#ff6682;box-shadow:0 0 18px #ff66822b}
.step.success::after{content:'✓';float:right;font-weight:900;color:#7fffd5}
.step.error::after{content:'✕';float:right;font-weight:900;color:#ff9caf}
@keyframes stepPulse{0%,100%{transform:translateY(0);filter:brightness(1)}50%{transform:translateY(-1px);filter:brightness(1.12)}}
.currentFwHint{display:none!important}
