:root{
  --bg:#0f1720; --panel:#18222e; --line:#26333f; --fg:#e7eef5; --mut:#8ea3b5;
  --accent:#37c0a8; --accent2:#2b8cff; --danger:#e5484d; --ok:#3ecf8e; --warn:#f5a623;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;height:100%}
body{background:var(--bg);color:var(--fg);font-family:system-ui,"Noto Sans KR",sans-serif;
  padding:12px;max-width:1100px;margin:0 auto;user-select:none}
header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}
h1{font-size:20px;margin:0}h1 span{color:var(--mut);font-weight:400;font-size:15px}
h2{font-size:14px;margin:0 0 10px;color:var(--mut);letter-spacing:.03em}
.status{padding:6px 12px;border-radius:999px;font-size:13px;font-weight:600;border:1px solid var(--line)}
.status.off{color:var(--mut)} .status.ok{color:#04140e;background:var(--ok)}
.status.err{color:#fff;background:var(--danger)} .status.pending{color:#04140e;background:var(--warn)}
.status.off{background:#111a22}

.conn{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px;margin-bottom:12px}
.conn .row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:8px}
.conn .row:last-child{margin-bottom:0}
.conn label{font-size:12px;color:var(--mut);min-width:110px}
input[type=text],select{background:#0c141c;border:1px solid var(--line);color:var(--fg);
  padding:9px 11px;border-radius:8px;font-size:14px;flex:1;min-width:120px}
.btn{background:var(--accent2);color:#fff;border:0;border-radius:9px;padding:11px 15px;
  font-size:14px;font-weight:600;cursor:pointer}
.btn:active{transform:translateY(1px)} .btn.ghost{background:#222f3c;color:var(--fg)}
.btn.danger{background:var(--danger)} .btn:disabled{opacity:.4}
.btn.led.active{background:var(--warn);color:#04140e}

main{display:grid;grid-template-columns:1.3fr 1fr;gap:12px}
.panel{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px}
.panel.drive{grid-row:span 2}

.dpad{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);
  gap:10px;aspect-ratio:1;max-width:340px;margin:0 auto 14px}
.pad{font-size:26px;border:0;border-radius:14px;background:#243342;color:var(--fg);cursor:pointer;touch-action:none}
.pad.up{grid-area:1/2} .pad.left{grid-area:2/1} .pad.stop{grid-area:2/2;background:#33210f;color:var(--warn)}
.pad.right{grid-area:2/3} .pad.down{grid-area:3/2}
.pad.pressed{background:var(--accent);color:#04140e}
.pad.stop:active{background:var(--danger);color:#fff}

.slider{margin-top:10px}.slider label{font-size:13px;color:var(--mut)}.slider b{color:var(--fg)}
input[type=range]{width:100%;accent-color:var(--accent)}

.btngrid{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.btngrid .btn{flex:1;min-width:64px;padding:14px 8px}
.snd{background:#3a2b52}

.dotgrid{display:grid;grid-template-columns:repeat(8,1fr);gap:4px;max-width:280px;margin:0 auto 10px;aspect-ratio:1}
.dot{background:#0c141c;border:1px solid var(--line);border-radius:4px;aspect-ratio:1;cursor:pointer}
.dot.on{background:var(--accent);border-color:var(--accent)}

.sgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}
.s{background:#0c141c;border:1px solid var(--line);border-radius:8px;padding:8px 10px;display:flex;justify-content:space-between}
.s span{color:var(--mut);font-size:12px}.s b{font-variant-numeric:tabular-nums}

.hidden{display:none}
footer{margin-top:14px;color:var(--mut);font-size:12px;text-align:center}
footer a{color:var(--accent)}
@media(max-width:720px){main{grid-template-columns:1fr}.panel.drive{grid-row:auto}}
