:root{
  --ink:#0A2A57; --ink-2:#3B5C8A; --ink-3:#7391B8;
  --paper:#EDF3FC; --card:#FFFFFF; --line:#D3E1F3;
  --blue:#1668E3; --blue-deep:#0C4AAE; --blue-soft:#DEEAFB;
  --navy:#0A2A57; --navy-2:#0F4699; --ok:#1B9E6E; --warn:#D4761A; --err:#CE3B3B;
  --disp:'Space Grotesk',system-ui,sans-serif;
  --body:'Inter',system-ui,sans-serif;
  --mono:'JetBrains Mono',ui-monospace,monospace;
}
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:var(--body);background:var(--paper);color:var(--ink);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;overflow:hidden}
button,input,select{font:inherit;color:inherit}
button{border:none;background:none;cursor:pointer}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-thumb{background:#BCD0EA;border-radius:5px}

/* ---------- shell ---------- */
.app{display:grid;grid-template-rows:56px 1fr;height:100vh}
.top{display:flex;align-items:center;gap:14px;padding:0 16px;background:var(--navy);color:#fff}
/* Araç çubuğu tek satıra sığmadığında sarar. Sarmadan, 1241 px'lik
   sabit bir satır oluşuyordu ve 1180 px'lik ekranlarda bile yatay
   kaydırma çıkıyordu. */
@media(max-width:1240px){.top{flex-wrap:wrap;row-gap:6px;padding-top:6px;padding-bottom:6px}.top .grow{flex-basis:100%;height:0}}
.top .logo{display:flex;align-items:center;font-family:var(--disp);font-weight:700;font-size:16px;white-space:nowrap}
.top .sep{width:1px;height:26px;background:rgba(255,255,255,.16)}
.top .grow{flex:1}
.tbtn{display:inline-flex;align-items:center;gap:7px;padding:8px 14px;border-radius:9px;font-size:13.5px;font-weight:600;background:rgba(255,255,255,.1);color:#fff;white-space:nowrap;transition:background .15s}
.tbtn:hover{background:rgba(255,255,255,.2)}
.tbtn.pri{background:var(--blue)}
.tbtn.pri:hover{background:#1F76F5}
.tbtn:disabled{opacity:.4;cursor:not-allowed}
.tbtn svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.fname{font-family:var(--mono);font-size:12px;color:#9FBDE6;max-width:230px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.main{display:grid;grid-template-columns:296px 1fr 320px;overflow:hidden}
.pane{overflow-y:auto;background:var(--card);border-inline-end:1px solid var(--line)}
.pane.right{border-inline-end:none;border-inline-start:1px solid var(--line);display:flex;flex-direction:column}
.grp{border-bottom:1px solid var(--line)}
.grp>h3{font-family:var(--disp);font-size:12px;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-3);padding:14px 16px 9px}
.grp .bd{padding:0 16px 16px;display:flex;flex-direction:column;gap:11px}
label.f{display:block;font-size:12px;font-weight:600;color:var(--ink-2);margin-bottom:5px}
input[type=text],input[type=number],select{width:100%;padding:8px 10px;border:1.5px solid var(--line);border-radius:8px;background:#fff;font-size:13.5px}
input:focus,select:focus{outline:none;border-color:var(--blue)}
.row{display:flex;gap:9px}
.row>*{flex:1;min-width:0}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:9px 13px;border-radius:9px;font-size:13px;font-weight:600;border:1.5px solid var(--line);background:#fff;transition:border-color .15s,background .15s}
.btn:hover{border-color:var(--blue);color:var(--blue-deep)}
.btn.solid{background:var(--blue);border-color:var(--blue);color:#fff}
.btn.solid:hover{background:var(--blue-deep);color:#fff}
.btn.mini{padding:5px 9px;font-size:12px;border-radius:7px}
.hint{font-size:11.5px;color:var(--ink-3);line-height:1.45}
.seg{display:flex;border:1.5px solid var(--line);border-radius:9px;overflow:hidden}
.seg button{flex:1;padding:7px 4px;font-size:12.5px;font-weight:600;color:var(--ink-3)}
.seg button.on{background:var(--blue);color:#fff}

/* ---------- canvas ---------- */
.stage{position:relative;background:#F7FAFE;display:flex;flex-direction:column;overflow:hidden}
#bed{flex:1;width:100%;display:block;cursor:grab}
#bed.drag{cursor:grabbing}
.stage-bar{display:flex;align-items:center;gap:12px;padding:9px 14px;border-top:1px solid var(--line);background:#fff}
.stage-bar input[type=range]{flex:1;accent-color:var(--blue)}
.vmode{display:flex;border:1.5px solid var(--line);border-radius:8px;overflow:hidden;flex:0 0 auto}
.vmode button{padding:6px 12px;font-size:12.5px;font-weight:600;color:var(--ink-3)}
.vmode button.on{background:var(--blue);color:#fff}
.dims{display:grid;grid-template-columns:auto 1fr;gap:7px 10px;align-items:center}
.dims label{font-family:var(--mono);font-size:11px;color:var(--ink-3)}
.dimfacts{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--line);border:1px solid var(--line);border-radius:9px;overflow:hidden;margin-top:10px}
.dimfacts div{background:#fff;padding:7px 10px}
.dimfacts .k{font-family:var(--mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3)}
.dimfacts .v{font-family:var(--disp);font-weight:600;font-size:13.5px}
.plist{display:flex;flex-direction:column;gap:5px;max-height:150px;overflow-y:auto}
.pitem{display:flex;align-items:center;gap:8px;border:1.5px solid var(--line);border-radius:8px;padding:6px 9px;cursor:pointer;font-size:12.5px}
.pitem.on{border-color:var(--blue);background:var(--blue-soft)}
.pitem b{font-family:var(--mono);font-size:11px;color:var(--blue-deep);flex:0 0 auto}
.pitem span{flex:1;color:var(--ink-2);font-size:11.5px}
.pitem button{color:var(--ink-3);font-size:14px;line-height:1}
.pitem button:hover{color:var(--err)}
.warnbox{border-inline-start:3px solid var(--warn);background:#FFF7EE;border-radius:0 8px 8px 0;padding:9px 12px;font-size:12.5px;color:#8A5216;margin-top:9px}
.warnbox b{color:#6E4111}
.badge{font-family:var(--mono);font-size:11.5px;background:var(--blue-soft);color:var(--blue-deep);border-radius:6px;padding:3px 8px;white-space:nowrap}
.overlay-msg{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:14px;text-align:center;padding:28px;pointer-events:none}
.overlay-msg.hide{display:none}
.overlay-msg b{font-family:var(--disp);font-size:19px}
.overlay-msg span{color:var(--ink-2);max-width:44ch;font-size:13.5px}
.drop{position:absolute;inset:10px;border:2.5px dashed var(--blue);border-radius:16px;background:rgba(22,104,227,.07);display:none;align-items:center;justify-content:center;font-weight:700;color:var(--blue-deep);pointer-events:none}
.drop.on{display:flex}

/* ---------- stats / dosing ---------- */
.stats{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--line)}
.stats div{background:#fff;padding:10px 13px}
.stats .k{font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3)}
.stats .v{font-family:var(--disp);font-weight:600;font-size:15px;margin-top:2px}

.stops{display:flex;flex-direction:column;gap:7px}
.stop{display:flex;align-items:center;gap:8px;border:1.5px solid var(--line);border-radius:9px;padding:7px 9px}
.stop input[type=color]{width:30px;height:30px;padding:0;border:none;border-radius:7px;background:none;cursor:pointer;flex:0 0 auto}
.stop input[type=number]{width:66px;flex:0 0 auto}
.stop .hex{font-family:var(--mono);font-size:11.5px;color:var(--ink-3);flex:1;min-width:0}
.stop .x{color:var(--ink-3);font-size:16px;line-height:1;padding:2px 4px;flex:0 0 auto}
.stop .x:hover{color:var(--err)}

.dose{border:1.5px solid var(--line);border-radius:11px;overflow:hidden}
.dose-h{display:flex;align-items:center;gap:9px;padding:10px 12px;background:var(--blue-soft)}
.dose-h .sw{width:26px;height:26px;border-radius:7px;border:1px solid rgba(0,0,0,.12);flex:0 0 auto}
.dose-h b{font-family:var(--disp);font-size:14px}
.dose-h span{font-family:var(--mono);font-size:11px;color:var(--blue-deep);margin-inline-start:auto}
.tube{display:flex;align-items:center;gap:9px;padding:7px 12px;border-top:1px solid var(--line)}
.tube i{width:13px;height:13px;border-radius:4px;border:1px solid rgba(0,0,0,.14);flex:0 0 auto}
.tube .n{font-size:12.5px;font-weight:600;width:58px;flex:0 0 auto}
.tube .bar{flex:1;height:7px;border-radius:4px;background:#E8EFF9;overflow:hidden}
.tube .bar em{display:block;height:100%;border-radius:4px}
.tube .p{font-family:var(--mono);font-size:11.5px;width:56px;text-align:end;flex:0 0 auto;color:var(--ink-2)}

/* ---------- console ---------- */
.console{flex:1;min-height:150px;display:flex;flex-direction:column;border-top:1px solid var(--line);background:#07203F}
.console h4{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:#7FA6D8;padding:10px 13px 6px;display:flex;align-items:center;gap:8px}
.console h4 button{margin-inline-start:auto;color:#7FA6D8;font-size:11px;text-transform:none;letter-spacing:0}
.console h4 button:hover{color:#fff}
.log{flex:1;overflow-y:auto;padding:0 13px 12px;font-family:var(--mono);font-size:11.5px;line-height:1.7;color:#C8DCF6}
.log div{white-space:pre-wrap;word-break:break-word}
.log .t{color:#5A7FB0}
.log .ok{color:#5FD2A4}
.log .wr{color:#F0B15E}
.log .er{color:#F58989}
.log .c{color:#8FC0FF}

/* ---------- modal ---------- */
.modal{position:fixed;inset:0;z-index:100;background:rgba(10,42,87,.55);display:none;align-items:center;justify-content:center;padding:20px}
.modal.on{display:flex}
.sheet{background:#fff;border-radius:16px;max-width:660px;width:100%;max-height:86vh;overflow:auto;padding:26px}
.sheet h2{font-family:var(--disp);font-size:20px;margin-bottom:6px}
.sheet p{color:var(--ink-2);font-size:13.5px;margin-bottom:16px}
.sheet .close{position:sticky;top:0;float:right;font-size:20px;color:var(--ink-3);line-height:1}
#camView{width:100%;border-radius:12px;background:#07203F;aspect-ratio:16/9;object-fit:contain;display:block}
.conn{border:1.5px solid var(--line);border-radius:12px;padding:14px 15px;margin-bottom:12px}
.conn-h{display:flex;align-items:center;gap:10px;margin-bottom:6px}
.conn-h b{font-family:var(--disp);font-size:14.5px}
.conn-h span{margin-inline-start:auto;font-family:var(--mono);font-size:10.5px;padding:3px 8px;border-radius:6px;background:#EEF3FA;color:var(--ink-3)}
.conn-h .ok-tag,.conn-h span.yes{background:#DFF3EA;color:#12795A}
.conn-h span.no{background:#FBE6E6;color:#A93030}
.conn.live{border-color:var(--ok);box-shadow:0 0 0 3px rgba(22,135,196,.12)}
.bar-big{height:10px;border-radius:6px;background:#E4EDF9;overflow:hidden}
.ip{position:fixed;inset:0 0 0 auto;width:min(820px,100%);z-index:130;background:var(--paper);
  transform:translateX(101%);transition:transform .48s cubic-bezier(.62,0,.24,1);
  display:flex;flex-direction:column;box-shadow:-24px 0 60px -22px rgba(10,42,87,.45)}
.ip.on{transform:none}
.ip-head{display:flex;align-items:center;gap:12px;padding:16px 20px;background:var(--navy);color:#fff;flex:0 0 auto}
.ip-head b{font-family:var(--disp);font-size:17px;flex:1}
.ip-back{display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;color:#fff;font-size:13.5px;font-weight:600;
  background:rgba(255,255,255,.12);border-radius:9px;padding:8px 14px;transition:background .15s}
.ip-back:hover{background:rgba(255,255,255,.22)}
.ip-back svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
.ip-body{flex:1;overflow-y:auto;padding:26px 30px 60px}
.ip-body h3{font-family:var(--disp);font-size:20px;margin:30px 0 10px;scroll-margin-top:20px}
.ip-body h3:first-child{margin-top:0}
.ip-body h4{font-family:var(--disp);font-size:15px;margin:16px 0 6px}
.ip-body p{margin-bottom:10px;color:var(--ink-2);font-size:14.5px}
.ip-body ul{margin:0 0 12px 18px;color:var(--ink-2);font-size:14.5px}
.ip-body li{margin-bottom:5px}
.ip-body b{color:var(--ink)}
.ip-body table{width:100%;border-collapse:collapse;font-size:13px;margin:10px 0 16px}
.ip-body th,.ip-body td{border:1px solid var(--line);padding:7px 9px;text-align:start;vertical-align:top}
.ip-body th{background:var(--blue-soft);font-family:var(--mono);font-size:11px;text-transform:uppercase;letter-spacing:.05em}
.ip-body td.y{color:#12795A;font-weight:600}
.ip-body td.n{color:#A93030}
.pill{display:inline-block;font-family:var(--mono);font-size:11px;border-radius:6px;padding:2px 8px;background:var(--blue-soft);color:var(--blue-deep);margin-inline-end:6px}
.callout{border-inline-start:3px solid var(--blue);background:#fff;border-radius:0 10px 10px 0;padding:13px 16px;margin:14px 0}
.callout.warn{border-color:var(--warn);background:#FFF8F0}
.bar-big em{display:block;height:100%;width:0;background:var(--blue);border-radius:6px;transition:width .2s}
pre.code{background:#0B2E5E;color:#C8DCF6;border-radius:10px;padding:13px;font-family:var(--mono);font-size:11.5px;overflow:auto;margin:10px 0}
table.ds{width:100%;border-collapse:collapse;font-size:12.5px;margin-top:10px}
table.ds th,table.ds td{border:1px solid var(--line);padding:5px 8px;text-align:start}
table.ds th{background:var(--blue-soft);font-family:var(--mono);font-size:11px;text-transform:uppercase;letter-spacing:.05em}

@media(max-width:1180px){
  .main{grid-template-columns:260px 1fr}
  .pane.right{position:fixed;inset-block:56px 0;inset-inline-end:0;width:320px;z-index:60;box-shadow:-14px 0 40px -18px rgba(10,42,87,.4);transform:translateX(105%);transition:transform .3s}
  .pane.right.open{transform:none}
  .rtoggle{display:inline-flex!important}
}
.rtoggle{display:none}


/* ---- bağlantı durumu rozeti ---- */
.link-state{font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--line);
  background:var(--surface,#f4f5f7);color:var(--muted,#667);letter-spacing:.02em}
.link-state.connected{border-color:#1B9E6E;color:#1B9E6E}
.link-state.sending,.link-state.stopping{border-color:#E8801E;color:#E8801E}
.link-state.error{border-color:var(--err,#D9342B);color:var(--err,#D9342B)}
.link-state.connecting{opacity:.7}

/* ---- uzun süren işlem göstergesi ---- */
.job-box{display:flex;align-items:center;gap:10px;margin:8px 0 4px}
.job-track{flex:1;height:6px;border-radius:999px;background:var(--line);overflow:hidden}
.job-track em{display:block;height:100%;width:0;background:#1668E3;transition:width .15s linear}
body.busy{cursor:progress}

.warn-text{color:var(--warn,#E8801E)}


/* ---------- Dar ekran: Studio yerine açıklama ----------------------------
   Ölçüldü: 900 px'de tabla görünümü 640 px kalıyor ve çalışılabiliyor;
   320 px'de 60 px'e düşüyor, parça yerleştirilemiyor. Araç çubuğunu
   sardırmak yatay kaydırmayı bitirdi ama aracı kullanılabilir yapmadı.
   Bu yüzden alt sınırın altında arayüz gizlenir ve neden gizlendiği yazılır. */
.narrow-notice{display:none}

@media(max-width:899px){
  html,body{overflow:auto}
  .app{display:none}
  .narrow-notice{
    display:flex;align-items:center;justify-content:center;
    min-height:100dvh;padding:24px;background:var(--paper)
  }
  .narrow-card{max-width:32rem;text-align:left}
  .narrow-card h1{font-family:var(--disp);font-size:1.5rem;line-height:1.25;margin:0 0 .75rem}
  .narrow-card p{margin:0 0 .75rem;color:var(--ink);opacity:.85}
  .narrow-back{
    display:inline-block;margin-top:.5rem;padding:.6rem 1rem;
    border-radius:.5rem;background:var(--navy);color:#fff;text-decoration:none
  }
}
