@font-face{font-family:Roboto;font-weight:300;font-style:normal;font-display:swap;src:url(/assets/Roboto-Light-Dwz7nuwl.ttf) format("truetype")}@font-face{font-family:Roboto;font-weight:400;font-style:normal;font-display:swap;src:url(/assets/Roboto-Regular-CmjnF39D.ttf) format("truetype")}@font-face{font-family:Roboto;font-weight:500;font-style:normal;font-display:swap;src:url(/assets/Roboto-Medium-BzTpVR6v.ttf) format("truetype")}@font-face{font-family:Roboto;font-weight:700;font-style:normal;font-display:swap;src:url(/assets/Roboto-Bold-0vjaqapF.ttf) format("truetype")}@font-face{font-family:Roboto;font-weight:900;font-style:normal;font-display:swap;src:url(/assets/Roboto-Black-ClahXRed.ttf) format("truetype")}:root{--brand: #e30613;--brand-dark: #b91c1c;--brand-text: #e30613;--brand-soft: #fdeae3;--night: #111827;--bg: #fff0ee;--bg-neutral: #f9fafb;--surface: #ffffff;--line: #f0e3e0;--text: #241a18;--muted: #8a8581;--ok: #2e9e6b;--ok-bg: #e6f4ec;--warn: #ef7c1a;--warn-bg: #fdf1e3;--err: #b71c1c;--err-bg: #fdeae7;--info: #1565c0;--solar: #f5a623;--grid: #4a90e2;--violet: #7a5af8;--heat: #f4511e;--shadow-card: 0 10px 26px -16px rgba(120, 40, 30, .08), 0 2px 6px -3px rgba(120, 40, 30, .1);--radius-sm: 8px;--radius: 12px;--radius-lg: 18px;--tap: 44px;--control: 52px;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 24px;--space-6: 32px;--font-ui: Roboto, system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono: "JetBrains Mono", "Cascadia Code", Consolas, monospace;--type-display-size: 72px;--type-display-weight: 700;--type-display-line: 1.25;--type-headline-size: 60px;--type-headline-weight: 700;--type-headline-line: 1.25;--type-title-size: 22px;--type-title-weight: 700;--type-title-line: 1.25;--type-h2-size: 18px;--type-h2-weight: 700;--type-h2-line: 1.3;--type-body-size: 16px;--type-body-weight: 400;--type-body-line: 1.5;--type-button-size: 16px;--type-button-weight: 600;--type-button-line: 1.25;--type-small-size: 13px;--type-small-weight: 400;--type-small-line: 1.4;--type-label-size: 12px;--type-label-weight: 700;--type-label-line: 1.2;--type-metric-size: 44px;--type-metric-weight: 300;--type-metric-line: 1.1;color-scheme:light}:root[data-skin=site]{--brand-soft: #fee2e2;--bg: #ffffff;--bg-neutral: #f9fafb;--line: #e5e7eb;--text: #1f2937;--muted: #6b7280;--radius-sm: 4px;--radius: 8px;--radius-lg: 16px;--shadow-card: 0 1px 3px rgba(0, 0, 0, .1), 0 1px 2px rgba(0, 0, 0, .06)}:root[data-theme=dark]{--brand: #e30613;--brand-dark: #ff6b63;--brand-text: #ff6b63;--brand-soft: #3a1c18;--night: #111827;--bg: #121212;--bg-neutral: #1c1c1e;--surface: #2a2a2d;--line: #3a3a3e;--text: #f2f2f2;--muted: #a0a0a5;--ok: #4cc38a;--ok-bg: #12301f;--warn: #f0a860;--warn-bg: #33240f;--err: #f07a6b;--err-bg: #3a1814;--info: #64a8f0;--solar: #f5a623;--grid: #6aa8f0;--violet: #9b8afb;--heat: #ff7043;--shadow-card: 0 2px 8px rgba(0, 0, 0, .5);color-scheme:dark}:root{--dim: color-mix(in srgb, var(--muted) 55%, var(--surface))}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font-ui);font-size:var(--type-small-size);line-height:var(--type-small-line);background:var(--bg);color:var(--text);height:100dvh;display:flex;flex-direction:column;overflow:hidden}#app{display:flex;flex-direction:column;height:100%;overflow:hidden}.unsupported{display:flex;align-items:center;justify-content:center;width:100%;height:100vh;text-align:center;line-height:2;color:var(--err);background:var(--bg)}.unsupported__icon{font-size:2rem}.unsupported h2{font-size:var(--type-h2-size)}.unsupported p{color:var(--muted)}*{scrollbar-width:thin;scrollbar-color:var(--dim) transparent}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--dim);border-radius:2px}.conn-bar{display:flex;align-items:center;justify-content:space-between;padding:10px 20px;background:var(--bg);border-bottom:1px solid var(--line);flex-shrink:0;gap:16px;flex-wrap:wrap}.conn-bar__left{display:flex;align-items:center;gap:16px}.logo-img{height:32px;width:auto;display:block}.logo{font-size:var(--type-title-size);font-weight:900;letter-spacing:-.02em;line-height:1.05;color:var(--text)}.logo-accent{color:var(--brand-text)}.app-version{font-family:var(--font-mono);font-size:var(--type-label-size);color:var(--muted);align-self:flex-end;padding-bottom:1px}.status{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:var(--type-small-size)}.status__dot{width:8px;height:8px;border-radius:50%;background:var(--dim);flex-shrink:0;transition:background .3s,box-shadow .3s}.status__dot--on{background:var(--ok);box-shadow:0 0 6px var(--ok);animation:blink 2.5s infinite}@keyframes blink{0%,to{opacity:1}50%{opacity:.55}}.conn-bar__controls{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap}.ctrl-label{display:flex;flex-direction:column;gap:3px;font-size:var(--type-label-size);font-weight:var(--type-label-weight);color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.ctrl-label select,.ctrl-label input[type=number]{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);color:var(--text);font-family:inherit;font-size:var(--type-small-size);font-weight:400;text-transform:none;letter-spacing:normal;padding:5px 8px;outline:none;transition:border-color .2s}.ctrl-label input[type=number]{width:82px;font-family:var(--font-mono)}.ctrl-label select:focus,.ctrl-label input:focus{border-color:var(--brand)}.ctrl-label select:focus-visible,.ctrl-label input:focus-visible{outline:2px solid var(--brand);outline-offset:1px}.port-section{display:flex;align-items:center;gap:8px}.port-label-text{font-size:var(--type-label-size);font-weight:700;color:var(--brand-text);white-space:nowrap}.vdivider{width:1px;height:28px;background:var(--line);align-self:flex-end;margin-bottom:1px}.btn{border:none;border-radius:var(--radius);padding:6px 14px;font-family:inherit;font-size:var(--type-small-size);font-weight:600;cursor:pointer;color:var(--brand-text);background:var(--brand-soft);transition:background .15s,opacity .15s,transform .1s;white-space:nowrap;line-height:1.4}.btn:hover:not(:disabled){background:color-mix(in srgb,var(--brand) 14%,var(--brand-soft))}.btn:focus-visible{outline:2px solid var(--brand);outline-offset:2px}.btn:active:not(:disabled){transform:scale(.97)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn--primary{background:var(--brand);color:#fff}.btn--primary:hover:not(:disabled){background:var(--brand-dark)}.btn--danger{background:var(--err-bg);color:var(--err)}.btn--danger:hover:not(:disabled){background:color-mix(in srgb,var(--err) 14%,var(--err-bg))}.btn--success{background:var(--ok-bg);color:var(--ok)}.btn--success:hover:not(:disabled){background:color-mix(in srgb,var(--ok) 14%,var(--ok-bg))}.btn--warning{background:var(--warn-bg);color:var(--warn)}.btn--warning:hover:not(:disabled){background:color-mix(in srgb,var(--warn) 14%,var(--warn-bg))}.btn--outline{background:transparent;border:1px solid var(--line);color:var(--text)}.btn--outline:hover:not(:disabled){background:transparent;border-color:var(--brand);color:var(--brand-text)}.btn--sm{padding:4px 10px;font-size:var(--type-label-size)}.flex-gap{display:flex;gap:6px}.theme-btn{background:transparent;border:1px solid var(--line);border-radius:var(--radius);color:var(--muted);font-size:var(--type-body-size);width:32px;height:32px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border-color .2s,color .2s,background .2s;flex-shrink:0;line-height:1}.theme-btn:hover{border-color:var(--brand);color:var(--brand-text)}.theme-btn:focus-visible{outline:2px solid var(--brand);outline-offset:2px}.scan-bar{width:100%;display:flex;align-items:center;gap:8px;padding:6px 0 2px;flex-wrap:wrap;border-top:1px solid var(--line);margin-top:6px}.scan-bar__status{font-size:var(--type-label-size);color:var(--muted);white-space:nowrap;flex-shrink:0}.scan-bar__results{display:flex;gap:6px;flex-wrap:wrap}.scan-badge{font-family:var(--font-mono);font-size:var(--type-label-size);font-weight:700;padding:2px 10px;border-radius:999px;border:1px solid var(--brand);background:var(--brand-soft);color:var(--brand-text);cursor:pointer;transition:background .15s,color .15s;white-space:nowrap}.scan-badge:hover{background:var(--brand);color:#fff}.app-main{display:grid;grid-template-columns:20fr 30fr 25fr 25fr;gap:10px;padding:10px;flex:1;min-height:0;overflow:hidden}.col{display:flex;flex-direction:column;gap:10px;min-height:0;overflow:hidden}.panel{background:var(--surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);display:flex;flex-direction:column;overflow:hidden}.panel__header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:6px;padding:9px 14px;border-bottom:1px solid var(--line);flex-shrink:0}.panel__title{display:flex;align-items:center;gap:6px;font-size:var(--type-label-size);font-weight:var(--type-label-weight);text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}.panel__icon{font-size:var(--type-body-size)}.panel__badge{font-size:var(--type-label-size);font-weight:600;padding:1px 8px;border-radius:999px;background:var(--brand-soft);color:var(--brand-text)}.panel__placeholder{flex:1;display:flex;align-items:center;justify-content:center;color:var(--dim);font-size:var(--type-small-size);padding:20px;text-align:center}.relay-panel{flex:1;min-height:0;overflow-y:auto}.relay-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;padding:14px;flex:1}.relay-card{background:var(--bg-neutral);border:2px solid var(--line);border-radius:var(--radius);padding:14px 10px 10px;display:flex;flex-direction:column;align-items:center;gap:6px;transition:border-color .25s,background .25s}.relay-card--on{border-color:var(--ok);background:var(--ok-bg)}.relay-card__led{width:18px;height:18px;border-radius:50%;background:var(--dim);transition:background .25s,box-shadow .25s}.relay-card--on .relay-card__led{background:var(--ok);box-shadow:0 0 10px var(--ok)}.relay-card__name{font-size:var(--type-label-size);color:var(--muted);text-transform:uppercase;letter-spacing:.06em;text-align:center}.relay-card__state{font-size:var(--type-body-size);font-weight:700;color:var(--dim);letter-spacing:.04em}.relay-card--on .relay-card__state{color:var(--ok)}.relay-btns{display:flex;gap:4px;width:100%;margin-top:2px}.relay-btn{flex:1;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--muted);font-family:inherit;font-size:var(--type-label-size);font-weight:700;padding:5px 4px;cursor:pointer;transition:border-color .15s,color .15s,background .15s;letter-spacing:.04em}.relay-btn:hover:not(:disabled){border-color:var(--brand);color:var(--brand-text)}.relay-btn:focus-visible{outline:2px solid var(--brand);outline-offset:1px}.relay-btn:disabled{opacity:.5;cursor:not-allowed}.relay-btn--on.relay-btn--active{border-color:var(--ok);color:var(--ok);background:var(--ok-bg)}.relay-btn--off.relay-btn--active{border-color:var(--err);color:var(--err);background:var(--err-bg)}.relay-override{font-size:var(--type-label-size);font-weight:700;letter-spacing:.04em;padding:2px 6px;border-radius:999px;background:var(--surface);color:var(--muted);border:1px solid var(--line)}.relay-override--active{background:var(--err-bg);color:var(--err);border-color:var(--err)}.relay-owner{font-size:var(--type-label-size);font-weight:600;color:var(--muted)}.relay-owner--linked{color:var(--info)}.relay-btn--owned{border-color:var(--info);color:var(--info);opacity:.5}.panel__subheader{display:flex;align-items:center;gap:6px;padding:6px 14px 4px;font-size:var(--type-label-size);font-weight:var(--type-label-weight);color:var(--muted);text-transform:uppercase;letter-spacing:.06em;border-top:1px solid var(--line);margin-top:4px}.relay-grid--qx{padding-top:8px}.di-panel{flex-shrink:0}.di-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;padding:10px}.di-item{background:var(--bg-neutral);border:1px solid var(--line);border-radius:var(--radius-sm);padding:8px 6px;display:flex;flex-direction:column;align-items:center;gap:4px;transition:border-color .2s,background .2s}.di-item--active{border-color:var(--grid);background:color-mix(in srgb,var(--grid) 12%,var(--surface))}.di-item__led{width:10px;height:10px;border-radius:50%;background:var(--dim);transition:background .2s,box-shadow .2s}.di-item--active .di-item__led{background:var(--grid);box-shadow:0 0 7px var(--grid)}.di-item__name{font-size:var(--type-label-size);color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.di-item__val{font-family:var(--font-mono);font-size:var(--type-small-size);font-weight:700;color:var(--dim)}.di-item--active .di-item__val{color:var(--info)}.analog-panel{flex:1;min-height:0}.analog-list{flex:1;overflow-y:auto;display:flex;flex-direction:column}.analog-row{display:grid;grid-template-columns:130px 1fr 110px;align-items:center;gap:10px;padding:9px 14px;border-bottom:1px solid var(--line)}.analog-row:last-child{border-bottom:none}.analog-row__meta{display:flex;align-items:baseline;gap:5px;min-width:0}.analog-row__name{font-size:var(--type-label-size);color:var(--muted);text-transform:uppercase;letter-spacing:.05em}.analog-row__val{font-family:var(--font-mono);font-size:var(--type-body-size);font-weight:700;color:var(--text)}.analog-row__unit{font-size:var(--type-label-size);color:var(--muted)}.analog-row__phys{font-family:var(--font-mono);font-size:var(--type-small-size);font-weight:600;color:var(--info);margin-left:auto;white-space:nowrap}.analog-row__bar-wrap{height:7px;background:var(--bg-neutral);border:1px solid var(--line);border-radius:999px;overflow:hidden}.analog-row__bar-fill{height:100%;background:var(--grid);border-radius:999px;transition:width .3s ease}.analog-row__chart-wrap{height:48px}#app>.log-panel{flex-shrink:0;height:170px;margin:0 10px 10px}.log-controls{display:flex;align-items:center;gap:12px}.toggle-lbl{display:flex;align-items:center;gap:4px;font-size:var(--type-label-size);color:var(--muted);cursor:pointer;-webkit-user-select:none;user-select:none}.toggle-lbl input[type=checkbox]{accent-color:var(--brand);cursor:pointer}.log-list{flex:1;overflow-y:auto;padding:6px 12px;font-family:var(--font-mono);font-size:var(--type-label-size);line-height:1.5}.log-row{white-space:nowrap}.log-row--tx{color:var(--info)}.log-row--rx{color:var(--ok)}.log-row--info{color:var(--muted)}.log-row--error{color:var(--err)}.bl-panel{flex-shrink:0}.bl-body{display:flex;flex-direction:column;gap:10px;padding:12px 14px}.bl-row{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap}.bl-actions{display:flex;gap:6px;flex-wrap:wrap;align-items:center}.bl-file-wrap{display:flex;align-items:center;gap:8px;margin-top:3px}.bl-filename{font-family:var(--font-mono);font-size:var(--type-label-size);color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:140px}.bl-comm-badge{display:inline-block;font-size:var(--type-label-size);font-weight:700;padding:2px 8px;border-radius:999px;border:1px solid var(--brand);color:var(--brand-text);background:var(--brand-soft);white-space:nowrap;margin-top:6px}.bl-eep-badge{display:inline-block;font-size:var(--type-label-size);font-weight:700;padding:2px 8px;border-radius:999px;border:1px solid var(--ok);color:var(--ok);background:var(--ok-bg);white-space:nowrap;margin-top:6px}.bl-eep-optional{font-size:var(--type-label-size);font-weight:400;color:var(--muted);margin-left:4px}.bl-versions{display:flex;align-items:center;gap:10px;padding:6px 10px;background:var(--bg-neutral);border:1px solid var(--line);border-radius:var(--radius-sm)}.bl-ver-item{display:flex;align-items:baseline;gap:6px}.bl-ver-label{font-size:var(--type-label-size);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}.bl-ver-value{font-family:var(--font-mono);font-size:var(--type-small-size);font-weight:700;color:var(--text)}.bl-ver-sep{width:1px;height:16px;background:var(--line);flex-shrink:0}.bl-progress{display:flex;flex-direction:column;gap:5px}.bl-progress-bar{height:8px;background:var(--bg-neutral);border:1px solid var(--line);border-radius:999px;overflow:hidden}.bl-progress-fill{height:100%;width:0%;background:var(--warn);border-radius:999px;transition:width .2s ease}.bl-status{font-size:var(--type-label-size);color:var(--muted)}.bl-log{max-height:90px;overflow-y:auto;font-family:var(--font-mono);font-size:var(--type-label-size);line-height:1.5;color:var(--muted);border-top:1px solid var(--line);padding-top:6px}.bl-log-row{white-space:nowrap}.bl-log-row--info{color:var(--muted)}.bl-log-row--ok{color:var(--ok)}.bl-log-row--err{color:var(--err)}.param-panel{flex:1;min-height:0}.param-header-actions{display:flex;gap:6px}.param-body{flex:1;overflow-y:auto;display:flex;flex-direction:column}.param-row{display:flex;align-items:center;gap:8px;padding:8px 14px;border-bottom:1px solid var(--line);transition:background .2s}.param-row:last-child{border-bottom:none}.param-row--modified{background:var(--warn-bg)}.param-row__name{width:112px;flex-shrink:0;font-size:var(--type-label-size);color:var(--text);white-space:nowrap}.param-row__card{width:72px;flex-shrink:0;font-size:var(--type-label-size);color:var(--muted);white-space:nowrap}.param-toggle{position:relative;display:inline-flex;align-items:center;cursor:pointer;flex-shrink:0}.param-toggle input{position:absolute;opacity:0;width:0;height:0}.param-toggle__track{width:36px;height:18px;background:var(--dim);border-radius:9px;position:relative;transition:background .2s}.param-toggle__track:after{content:"";position:absolute;width:12px;height:12px;background:var(--surface);border-radius:50%;top:3px;left:3px;transition:transform .2s,background .2s}.param-toggle input:checked+.param-toggle__track{background:var(--brand)}.param-toggle input:checked+.param-toggle__track:after{transform:translate(18px);background:#fff}.param-toggle input:focus-visible+.param-toggle__track{outline:2px solid var(--brand);outline-offset:2px}.param-number{width:70px;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-sm);color:var(--text);font-family:var(--font-mono);font-size:var(--type-small-size);padding:3px 6px;outline:none;transition:border-color .2s;flex-shrink:0}.param-number:focus{border-color:var(--brand)}.param-number:focus-visible{outline:2px solid var(--brand);outline-offset:1px}.param-modified-dot{width:7px;height:7px;border-radius:50%;background:var(--warn);flex-shrink:0;margin-left:auto;visibility:hidden}.param-status{display:block;font-size:var(--type-label-size);color:var(--muted);padding:6px 14px;border-top:1px solid var(--line)}.param-hint-icon{display:inline-flex;align-items:center;justify-content:center;width:13px;height:13px;border-radius:50%;background:var(--muted);color:var(--surface);font-size:.58rem;font-style:italic;font-weight:700;cursor:help;margin-left:4px;flex-shrink:0;vertical-align:middle;position:relative}.param-hint-icon:after{content:attr(data-hint);position:absolute;left:18px;top:50%;transform:translateY(-50%);background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-sm);padding:7px 11px;font-family:var(--font-ui);font-size:var(--type-label-size);font-style:normal;font-weight:400;color:var(--text);white-space:pre-line;min-width:160px;max-width:280px;z-index:200;pointer-events:none;opacity:0;transition:opacity .15s;box-shadow:var(--shadow-card);line-height:1.5}.param-hint-icon:hover:after{opacity:1}
