:root{--bg: #f4f5f7;--card: #ffffff;--ink: #15181d;--ink-2: #5b6370;--line: #d9dde3;--grid: #e7eaee;--tint: #eef1f5;--accent: #2f7de1;--good: #1f8f55;--warn: #b7791f;--bad: #c8322f;--radius: 12px;--tap: 48px;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:var(--ink);background:var(--bg)}@media (prefers-color-scheme: dark){:root{--bg: #0f1216;--card: #181c22;--ink: #e8ebef;--ink-2: #9aa3af;--line: #2c333c;--grid: #232930;--tint: #20262d;--accent: #5b9cf0;--good: #3fbf7f;--warn: #e0a84a;--bad: #f06461}}*{box-sizing:border-box}body{margin:0;min-height:100vh;background:var(--bg)}button,input,select{font:inherit;color:inherit}button{min-height:var(--tap);padding:0 16px;border-radius:10px;border:1px solid var(--line);background:var(--card);cursor:pointer}button:hover:not(:disabled){border-color:var(--ink-2)}button:disabled{opacity:.5;cursor:default}button.primary{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}input,select{min-height:var(--tap);padding:0 12px;border-radius:10px;border:1px solid var(--line);background:var(--card);min-width:0}:focus-visible{outline:3px solid var(--accent);outline-offset:2px}.topbar{position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:16px;flex-wrap:wrap;padding:12px 20px;background:var(--card);border-bottom:1px solid var(--line)}.brand{display:flex;flex-direction:column;line-height:1.2}.brand strong{font-size:18px}.brand .sub{color:var(--ink-2);font-size:13px}.chips{display:flex;gap:8px;flex-wrap:wrap;flex:1}.chip{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border-radius:999px;font-size:14px;background:var(--tint)}.chip[data-state=no-reply],.chip[data-state=disconnected]{background:color-mix(in srgb,var(--bad) 15%,transparent)}.dot{width:12px;height:12px;border-radius:50%;background:var(--dev, var(--accent));flex:none}.stop-all{background:var(--bad);border-color:var(--bad);color:#fff;font-weight:800;letter-spacing:.05em;min-width:140px;min-height:52px}.banner{margin:16px 20px 0;padding:12px 16px;border-radius:var(--radius);background:color-mix(in srgb,var(--warn) 18%,var(--card))}main{padding:20px;display:grid;gap:20px}.devices{display:grid;gap:12px}.section-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}.section-head h2{margin:0;font-size:16px}.section-head .hint{margin:0}.panels{display:flex;flex-direction:column;gap:12px}.panel{position:relative;background:var(--card);border:1px solid var(--line);border-left:6px solid var(--dev, var(--accent));border-radius:var(--radius);padding:14px 16px;display:grid;grid-template-columns:minmax(210px,250px) minmax(0,1.3fr) minmax(0,1.2fr) minmax(150px,190px);gap:16px 20px;align-items:center;transition:box-shadow .15s,opacity .15s}.panel>header{display:grid;grid-template-columns:32px minmax(0,1fr) auto;align-items:center;gap:4px 8px;align-self:start}.panel.dragging{opacity:.6;box-shadow:0 10px 30px #0003}.panel.drop-before{box-shadow:0 -4px 0 0 var(--accent)}.panel.drop-after{box-shadow:0 4px 0 0 var(--accent)}.handle{border:none;background:transparent;min-width:32px;padding:0;font-size:20px;color:var(--ink-2);cursor:grab;touch-action:none}.handle:active{cursor:grabbing}.dev-title{display:flex;flex-direction:column;flex:1;min-width:0}.dev-label{font-weight:700;font-size:18px}.dev-model{color:var(--ink-2);font-size:13px}.status{padding:4px 12px;border-radius:999px;font-weight:600;font-size:14px;background:var(--tint);grid-column:2;grid-row:2;justify-self:start}.status[data-state=heating]{background:color-mix(in srgb,var(--warn) 22%,transparent)}.status[data-state=at-temp],.status[data-state=stirring]{background:color-mix(in srgb,var(--good) 20%,transparent)}.status[data-state=no-reply],.status[data-state=disconnected]{background:color-mix(in srgb,var(--bad) 20%,transparent)}.panel>header .menu{grid-column:3;grid-row:1}.menu{position:relative}.menu summary{list-style:none;cursor:pointer;width:var(--tap);height:var(--tap);display:grid;place-items:center;border-radius:10px;font-size:22px}.menu summary::-webkit-details-marker{display:none}.menu summary:hover{background:var(--tint)}.menu-items{position:absolute;right:0;top:calc(var(--tap) + 4px);z-index:30;display:grid;min-width:200px;padding:6px;background:var(--card);border:1px solid var(--line);border-radius:10px;box-shadow:0 8px 24px #00000026}.menu-items button{border:none;text-align:left}.menu-items button:hover{background:var(--tint)}.danger-text{color:var(--bad)}.tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:8px}.tile{background:var(--tint);border-radius:10px;padding:8px 12px;display:flex;flex-direction:column;gap:2px}.tile-label{font-size:13px;color:var(--ink-2)}.tile-value{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums}.tile.primary .tile-value{font-size:32px}.setpoints{display:grid;gap:10px}.sp-row{display:grid;grid-template-columns:96px 1fr;gap:2px 10px;align-items:center}.sp-row label{font-weight:600}.sp-input{display:flex;gap:8px;align-items:center}.sp-input input{width:100px;font-variant-numeric:tabular-nums}.unit{color:var(--ink-2);min-width:32px}.sp-read{grid-column:2;font-size:13px;color:var(--ink-2)}.sp-read[data-state=pending]{color:var(--warn);font-weight:600}.switches{display:grid;gap:8px}.switch{font-weight:600}.switch[aria-pressed=true]{background:var(--good);border-color:var(--good);color:#fff}.offline{display:none}.panel.is-offline .tiles,.panel.is-offline .setpoints,.panel.is-offline .switches{opacity:.35;pointer-events:none}.panel.is-offline .offline{grid-column:1 / -1;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border-radius:10px;background:color-mix(in srgb,var(--bad) 12%,transparent)}.offline p{margin:0}.panel.is-missing{grid-template-columns:minmax(210px,250px) 1fr auto}.panel.is-missing p{margin:0;color:var(--ink-2)}.add-tile{min-height:64px;border:2px dashed var(--line);border-radius:var(--radius);display:flex;align-items:center;justify-content:center;gap:10px;color:var(--ink-2);font-weight:600;font-size:16px;background:transparent}.add-tile .plus{font-size:28px;line-height:1}.add-tile:hover{color:var(--ink);border-color:var(--ink-2)}@media (max-width: 1100px){.panel{grid-template-columns:1fr 1fr}.panel>header{grid-column:1 / -1}}.chart-tools{display:flex;gap:12px;flex-wrap:wrap;align-items:center;justify-content:space-between;margin-bottom:8px}.seg{display:inline-flex;border:1px solid var(--line);border-radius:10px;overflow:hidden}.seg button{border:none;border-radius:0;min-height:40px;padding:0 14px}.seg button+button{border-left:1px solid var(--line)}.seg button[aria-pressed=true]{background:var(--ink);color:var(--bg);font-weight:600}.lane-filter{display:flex;gap:6px;flex-wrap:wrap}.lane-toggle{min-height:40px;display:inline-flex;align-items:center;gap:8px;border-radius:999px}.lane-toggle[aria-pressed=false]{opacity:.5}.lane-toggle[aria-pressed=false] .dot{background:transparent;border:2px solid var(--dev)}.lanes{display:grid}.lane{border-top:1px solid var(--line);padding-top:8px;margin-top:4px}.lane:first-child{border-top:none;margin-top:0}.lane-head{display:flex;align-items:center;gap:10px 14px;flex-wrap:wrap}.lane-name{display:inline-flex;align-items:center;gap:8px;font-weight:700;min-width:140px}.lane-chips{display:flex;gap:6px;flex-wrap:wrap}.ch-chip{min-height:34px;padding:0 10px;border-radius:999px;font-size:13px;display:inline-flex;align-items:center;gap:6px}.ch-chip .swatch{width:16px;height:0;border-top:3px solid var(--c)}.ch-chip.sp .swatch{border-top-style:dashed}.ch-chip .chip-val{font-variant-numeric:tabular-nums;color:var(--ink-2)}.ch-chip[aria-pressed=false]{opacity:.45}.ch-chip[aria-pressed=false] .swatch{border-top-color:var(--ink-2)}.lane-plot{min-height:40px}.empty.small{padding:12px 0;text-align:left}.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:16px}.card h2{margin:0 0 4px;font-size:16px}.hint{color:var(--ink-2);font-size:13px;margin:0 0 8px}.chart{width:100%}.chart .empty{color:var(--ink-2);padding:40px 0;text-align:center}.uplot{font-family:inherit}.u-legend{font-size:13px;color:var(--ink)}.runbar{position:sticky;bottom:0;z-index:9;display:flex;gap:12px;align-items:center;flex-wrap:wrap;padding:12px 20px;background:var(--card);border-top:1px solid var(--line)}.rec{font-weight:700}.rec.on{background:var(--bad);border-color:var(--bad);color:#fff}.rec-state{color:var(--ink-2);font-variant-numeric:tabular-nums}.note-form{display:flex;gap:8px;flex:1;min-width:260px}.note-form input{flex:1}.log-card{margin:0 20px 100px}.log-card summary{cursor:pointer;font-weight:600;min-height:32px}.log{list-style:none;padding:0;margin:8px 0 0;max-height:320px;overflow:auto;font-size:13px;font-family:ui-monospace,Menlo,monospace}.log li{padding:3px 0;border-bottom:1px solid var(--grid)}.log li.error{color:var(--bad)}.log time{color:var(--ink-2)}.dlg{border:none;border-radius:16px;padding:0;width:min(560px,calc(100vw - 32px));background:var(--card);color:var(--ink)}.dlg::backdrop{background:#00000073}.dlg-head{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 0 20px}.dlg-head h2{font-size:18px;margin:0}.icon{border:none;min-width:var(--tap);padding:0}.form,.terminal{display:grid;gap:14px;padding:16px 20px 20px}.form label{display:grid;gap:6px;font-weight:600;font-size:14px}.form label.check{display:flex;align-items:center;gap:8px;font-weight:400}.form label.check input{min-height:auto;width:20px;height:20px}.actions{display:flex;gap:8px;justify-content:flex-end;flex-wrap:wrap}.error-text{color:var(--bad);margin:0;min-height:1em}.error-text:empty{display:none}.probe-details summary{cursor:pointer;font-size:14px}.probe-details pre{margin:8px 0 0;padding:10px;border-radius:10px;background:var(--tint);font-size:12px;white-space:pre-wrap;word-break:break-all}.quick{display:flex;flex-wrap:wrap;gap:6px}.quick button{min-height:36px;padding:0 10px;font-family:ui-monospace,Menlo,monospace;font-size:13px}.term-out{height:240px;overflow:auto;margin:0;padding:10px;border-radius:10px;background:var(--tint);font-size:13px}.term-out .rx{color:var(--good)}.term-out .err{color:var(--bad)}.term-form{display:flex;gap:8px}.term-form input{flex:1;font-family:ui-monospace,Menlo,monospace;text-transform:uppercase}#toast{position:fixed;left:50%;bottom:90px;transform:translate(-50%,20px);padding:12px 18px;border-radius:10px;background:var(--ink);color:var(--bg);opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:50;max-width:calc(100vw - 32px)}#toast.show{opacity:1;transform:translate(-50%)}#toast.error{background:var(--bad);color:#fff}@media (max-width: 640px){main{padding:12px}.topbar{padding:10px 12px}.stop-all{width:100%;order:3}.panel{grid-template-columns:1fr}.log-card{margin:0 12px 140px}}.uplot,.uplot *,.uplot *:before,.uplot *:after{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5;width:min-content}.u-title{text-align:center;font-size:18px;font-weight:700}.u-wrap{position:relative;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;position:relative;width:100%;height:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{vertical-align:middle;display:inline-block}.u-legend .u-marker{width:1em;height:1em;margin-right:4px;background-clip:padding-box!important}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:#00000012;position:absolute;pointer-events:none}.u-cursor-x,.u-cursor-y{position:absolute;left:0;top:0;pointer-events:none;will-change:transform}.u-hz .u-cursor-x,.u-vt .u-cursor-y{height:100%;border-right:1px dashed #607D8B}.u-hz .u-cursor-y,.u-vt .u-cursor-x{width:100%;border-bottom:1px dashed #607D8B}.u-cursor-pt{position:absolute;top:0;left:0;border-radius:50%;border:0 solid;pointer-events:none;will-change:transform;background-clip:padding-box!important}.u-axis.u-off,.u-select.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-cursor-pt.u-off{display:none}
