@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-wght-normal-CkhJZR-_.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--cyan-1:#0ea5e9;--cyan-2:#06b6d4;--navy:#0f172a;--bg:oklch(97.5% .004 250);--bg-glow:oklch(90% .03 240/.6);--surface:oklch(100% 0 0/.85);--surface-solid:oklch(100% 0 0);--surface-2:oklch(96.5% .006 250);--text:oklch(20% .025 250);--text-muted:oklch(52% .02 250);--text-faint:oklch(65% .015 250);--border:oklch(91% .008 250);--primary:oklch(47% .2 250);--accent:oklch(60% .16 235);--accent-soft:oklch(60% .16 235/.12);--ring:oklch(55% .18 250);--floor:oklch(96.5% .004 250);--floor-hatch:oklch(82% .008 250);--floor-outdoor:oklch(98% .002 250/.7);--floor-active:oklch(95% .012 245);--floor-active-hover:oklch(93% .022 245);--floor-on:oklch(90% .05 238);--wall-top:oklch(100% 0 0);--wall-edge:oklch(84% .008 250);--wall-r:oklch(90% .006 250);--wall-l:oklch(84% .008 250);--house-shadow:oklch(35% .03 255/.2);--chip-border:transparent;--ok:oklch(62% .14 160);--warn:oklch(72% .15 70);--danger:oklch(58% .22 27);--shadow:0 1px 2px oklch(27% .1 250/.05), 0 4px 16px oklch(27% .1 250/.05);--radius:14px;--panel-w:400px;font-feature-settings:"cv11", "ss01";font-family:Inter Variable,Inter,system-ui,-apple-system,Segoe UI,sans-serif;line-height:1.45}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:oklch(13% .015 255);--bg-glow:oklch(30% .06 250/.35);--surface:oklch(17% .02 255/.85);--surface-solid:oklch(17% .02 255);--surface-2:oklch(21% .022 255);--text:oklch(94% .008 250);--text-muted:oklch(70% .015 250);--text-faint:oklch(55% .015 250);--border:oklch(27% .02 255);--primary:oklch(72% .13 245);--accent:oklch(72% .13 230);--accent-soft:oklch(72% .13 230/.14);--floor:oklch(23% .012 255);--floor-hatch:oklch(34% .015 255);--floor-outdoor:oklch(20% .01 255/.6);--floor-active:oklch(26% .02 250);--floor-active-hover:oklch(29% .035 248);--floor-on:oklch(35% .075 240);--wall-top:oklch(46% .012 255);--wall-edge:oklch(52% .012 255);--wall-r:oklch(34% .012 255);--wall-l:oklch(29% .012 255);--house-shadow:oklch(0% 0 0/.55);--chip-border:var(--border);--ok:oklch(74% .14 160);--warn:oklch(80% .14 75);--danger:oklch(70% .18 25);--shadow:0 1px 2px #0000004d, 0 8px 24px #00000040}}*,:before,:after{box-sizing:border-box}html,body,#root{min-height:100%;margin:0}body{background:radial-gradient(70rem 40rem at 50% -20%, var(--bg-glow), transparent 70%), var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;background-attachment:fixed}:focus-visible{outline:2px solid var(--ring);outline-offset:3px}*{scrollbar-width:thin;scrollbar-color:oklch(55% .18 250/.5) transparent}.app-root{min-height:100dvh}.glass{background:var(--surface);-webkit-backdrop-filter:blur(14px)saturate(160%);border:1px solid var(--border);box-shadow:var(--shadow)}.splash{min-height:100dvh;color:var(--text-muted);align-content:center;place-items:center;gap:16px;font-size:.9rem;display:grid}.splash img{opacity:.9;width:56px;height:56px}.layout{grid-template-rows:auto 1fr auto;min-height:100dvh;display:grid}.main{flex-direction:column;gap:14px;width:100%;max-width:1120px;margin:0 auto;padding:14px;display:flex}@media (width>=640px){.main{gap:20px;padding:24px}}@media (width>=1000px){.layout.has-panel{grid-template-columns:minmax(0, 1fr) var(--panel-w)}.layout.has-panel .header,.layout.has-panel .footer{grid-column:1/-1}}.header{z-index:5;box-shadow:none;border-width:0 0 1px;border-radius:0;justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;display:flex;position:sticky;top:0}@media (width>=640px){.header{padding:12px 24px}}.brand{align-items:center;gap:12px;min-width:0;display:flex}.brand__logo{flex:none;width:34px;height:34px}.brand__text{flex-direction:column;min-width:0;display:flex}.brand__name{letter-spacing:-.01em;font-size:.95rem;font-weight:650;line-height:1.2}.brand__name b{color:var(--primary);font-weight:650}.brand__property{color:var(--text-muted);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:.78rem;font-weight:500;overflow:hidden}.header__meta{align-items:center;gap:14px;font-size:.82rem;display:flex}.header__clock{font-variant-numeric:tabular-nums;font-size:.95rem;font-weight:600}.badge{border:1px solid var(--border);color:var(--text-muted);letter-spacing:.04em;text-transform:uppercase;border-radius:999px;padding:2px 8px;font-size:.72rem;font-weight:600}.btn{border:1px solid var(--primary);background:var(--primary);color:#fff;font:inherit;cursor:pointer;border-radius:8px;padding:7px 14px;font-weight:600}.btn--ghost{border-color:var(--border);color:var(--text);background:0 0;padding:5px 10px}.btn:hover{filter:brightness(1.08)}.btn--ghost:hover{filter:none;background:var(--surface-2)}.btn:focus-visible{outline:2px solid var(--ring);outline-offset:2px}.splash__error{justify-items:center;gap:12px;display:grid}.splash__error p{margin:0}.conn{color:var(--text-muted);white-space:nowrap;align-items:center;gap:7px;font-weight:500;display:inline-flex}.conn__dot{background:currentColor;border-radius:50%;width:7px;height:7px}.conn--connected .conn__dot{background:var(--ok)}.conn--reconnecting .conn__dot{background:var(--warn);animation:1s steps(2,start) infinite blink}.conn--offline{color:var(--danger)}@media (width<=479px){.conn__label{clip:rect(0 0 0 0);width:1px;height:1px;position:absolute;overflow:hidden}}.summary{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;display:grid}@media (width>=640px){.summary{gap:16px}}.kpi{border-radius:var(--radius);flex-direction:column;gap:4px;padding:12px 14px;display:flex}@media (width>=640px){.kpi{padding:16px 20px}}.kpi__label{color:var(--text-muted);align-items:center;gap:6px;font-size:.75rem;font-weight:500;display:flex}.kpi__label svg{color:var(--text-faint);flex:none}.kpi__value{letter-spacing:-.02em;font-variant-numeric:tabular-nums;font-size:clamp(1.15rem,.95rem + 1.2vw,1.75rem);font-weight:600;line-height:1.15}.kpi__unit{color:var(--text-muted);margin-left:3px;font-size:.55em;font-weight:500}.kpi--live.is-on .kpi__label svg{color:var(--accent)}.floorplan{border-radius:calc(var(--radius) + 2px);padding:16px 16px 8px}.floorplan__head{justify-content:space-between;align-items:baseline;gap:12px;margin:0 4px 4px;display:flex}.section-title{letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);margin:0;font-size:.75rem;font-weight:600}.floorplan__hint{color:var(--text-faint);font-size:.78rem}.floorplan__svg{width:100%;height:auto;max-height:72dvh;display:block}.house-shadow{fill:var(--house-shadow)}.floor{fill:var(--floor);stroke:none}.floor--outdoor{fill:var(--floor-outdoor);stroke:var(--floor-hatch);stroke-width:.8px;stroke-dasharray:2 3}.floor__hatch{stroke:var(--floor-hatch);stroke-width:1px}.floor--active{fill:var(--floor-active);cursor:pointer;outline:none;transition:fill .35s}.floor--active:hover{fill:var(--floor-active-hover)}.floor--active.is-on{fill:var(--floor-on)}.floor--active.is-selected,.floor--active:focus-visible{stroke:var(--ring);stroke-width:1.5px}.walls{pointer-events:none}.wall__top{fill:var(--wall-top)}.wall-tops-edge{fill:var(--wall-edge);stroke:var(--wall-edge);stroke-width:1px;stroke-linejoin:round}.wall__side--r{fill:var(--wall-r)}.wall__side--l{fill:var(--wall-l)}.labels{pointer-events:none}.label__name{fill:var(--text-muted);text-anchor:middle;dominant-baseline:middle;letter-spacing:.01em;font-size:10.5px;font-weight:500}.label--active .label__name{fill:var(--text);font-weight:600}.label:not(.label--active) .label__name{paint-order:stroke;stroke:var(--floor);stroke-width:3px;stroke-linejoin:round}.treads{pointer-events:none;fill:none;stroke:var(--wall-edge);stroke-width:.8px;stroke-linecap:round}.treads--above{stroke:var(--text-faint);stroke-width:.7px;stroke-dasharray:2.5 2}.chip{transform-box:fill-box;transform-origin:50%}@media (width<=639px){.label__name{font-size:19px}.label--compact{display:none}.chip{scale:1.6}.floorplan__hint{display:none}}.chip__bg{fill:var(--surface-solid);stroke:var(--chip-border)}.chip__dot{fill:var(--text-faint)}.chip__text{fill:var(--text);text-anchor:middle;dominant-baseline:middle;font-variant-numeric:tabular-nums;font-size:9.5px;font-weight:600}.panel{z-index:20;max-height:90dvh;padding:8px 16px max(20px, env(safe-area-inset-bottom));background:var(--surface-solid);border-top:1px solid var(--border);border-radius:20px 20px 0 0;animation:.25s cubic-bezier(.2,.8,.2,1) slide-up;position:fixed;inset:auto 0 0;overflow-y:auto;box-shadow:0 -12px 40px #00000040}.panel__grabber{background:var(--border);border-radius:2px;width:36px;height:4px;margin:0 auto 10px}.panel-backdrop{z-index:10;background:oklch(13% .015 255/.45);animation:.2s fade-in;position:fixed;inset:0}@media (width>=1000px){.panel{background:var(--surface);-webkit-backdrop-filter:blur(14px)saturate(160%);border:none;border-left:1px solid var(--border);max-height:calc(100dvh - 59px);box-shadow:none;border-radius:0;grid-area:2/2/4;align-self:start;padding:24px;animation:.25s cubic-bezier(.2,.8,.2,1) slide-in;position:sticky;top:59px}.panel__grabber,.panel-backdrop{display:none}}.panel__head{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:20px;display:flex}.panel__title{letter-spacing:-.02em;margin:0;font-size:1.35rem;font-weight:650}.panel__meta{color:var(--text-muted);margin:2px 0 0;font-size:.82rem}.icon-btn{border:1px solid var(--border);background:var(--surface-2);width:36px;height:36px;color:var(--text-muted);cursor:pointer;border-radius:10px;flex:none;place-items:center;transition:background .2s,color .2s;display:grid}.icon-btn:hover{background:var(--border);color:var(--text)}.device{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface-2);align-items:center;gap:12px;padding:14px;transition:border-color .3s,background .3s;display:flex}.device.is-on{background:var(--accent-soft);border-color:oklch(60% .16 235/.45)}.device__icon{background:var(--surface-solid);border:1px solid var(--border);width:38px;height:38px;color:var(--text-muted);border-radius:10px;flex:none;place-items:center;transition:color .3s;display:grid}.device.is-on .device__icon{color:var(--accent)}.device__text{flex-direction:column;flex:1;min-width:0;display:flex}.device__name{font-size:.95rem;font-weight:600}.device__status{color:var(--text-muted);font-size:.8rem}.device__status.is-error{color:var(--danger);font-weight:600}.device__meta{color:var(--text-faint);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:4px 12px;margin:8px 4px 18px;font-size:.72rem;display:flex}.wifi{white-space:nowrap;color:var(--text-muted);align-items:center;gap:6px;display:inline-flex}.wifi__bars rect{fill:var(--border)}.wifi--excellent .wifi__bars .is-lit,.wifi--good .wifi__bars .is-lit{fill:var(--ok)}.wifi--weak .wifi__bars .is-lit{fill:var(--warn)}.wifi--poor .wifi__bars .is-lit{fill:var(--danger)}.wifi--weak,.wifi--poor{color:var(--text);font-weight:600}.wifi__dbm{font-variant-numeric:tabular-nums;color:var(--text-faint);font-weight:400}.toggle{background:var(--border);cursor:pointer;border:none;border-radius:15px;flex:none;width:52px;height:30px;padding:0;transition:background .2s;position:relative}.toggle:disabled{cursor:not-allowed;opacity:.5}.toggle__thumb{background:#fff;border-radius:50%;width:24px;height:24px;transition:transform .2s cubic-bezier(.2,.8,.2,1);position:absolute;top:3px;left:3px;box-shadow:0 1px 3px #00000040}.toggle.is-on{background:var(--accent)}.toggle.is-on .toggle__thumb{transform:translate(22px)}.toggle.is-pending{opacity:.7}.toggle.is-pending .toggle__thumb{animation:.9s ease-in-out infinite pulse-thumb}.tiles{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-bottom:12px;display:grid}.tile{border:1px solid var(--border);background:var(--surface-solid);border-radius:12px;flex-direction:column;gap:4px;padding:12px 14px;display:flex}.tile__label{color:var(--text-muted);align-items:center;gap:6px;font-size:.75rem;font-weight:500;display:flex}.tile__icon{color:var(--text-faint);display:inline-flex}.tile__value{letter-spacing:-.02em;font-variant-numeric:tabular-nums;font-size:1.3rem;font-weight:600}.tile__unit{color:var(--text-muted);font-size:.8rem;font-weight:500}.chart{border:1px solid var(--border);background:var(--surface-solid);border-radius:12px;margin:0;padding:14px}.chart__head{justify-content:space-between;align-items:baseline;margin-bottom:10px;display:flex}.chart__title{font-size:.8rem;font-weight:600}.chart__peak{color:var(--text-muted);font-variant-numeric:tabular-nums;font-size:.72rem}.chart__svg{width:100%;height:120px;display:block}.chart__line{fill:none;stroke:var(--accent);stroke-width:1.75px;stroke-linejoin:round;vector-effect:non-scaling-stroke}.chart__area{fill:url(#chart-fill)}.chart__grid{stroke:var(--border);stroke-dasharray:3 5;vector-effect:non-scaling-stroke}.chart__axis{color:var(--text-faint);justify-content:space-between;margin-top:6px;font-size:.7rem;display:flex}.chart__message{text-align:center;color:var(--text-muted);margin:28px 0;font-size:.85rem}.dev{border-radius:var(--radius);box-shadow:none;border-style:dashed;padding:12px 16px}.dev__label{color:var(--text-muted);justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;font-size:.8rem;display:flex}.dev__badge{border:1px solid var(--border);letter-spacing:.08em;border-radius:5px;margin-right:8px;padding:1px 6px;font-size:.62rem;font-weight:700}.dev__label output{color:var(--text);font-variant-numeric:tabular-nums;font-weight:600}.dev input[type=range]{width:100%;accent-color:var(--accent)}.footer{padding:16px 16px max(16px, env(safe-area-inset-bottom));color:var(--text-faint);justify-content:center;align-items:center;gap:8px;font-size:.72rem;display:flex}.footer img{opacity:.85;width:16px;height:16px}@keyframes live{50%{opacity:.35}}@keyframes pulse-thumb{50%{transform:translate(11px)}}@keyframes blink{to{opacity:.3}}@keyframes slide-up{0%{transform:translateY(100%)}}@keyframes slide-in{0%{opacity:0;transform:translate(24px)}}@keyframes fade-in{0%{opacity:0}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.device-block+.device-block{border-top:1px solid var(--border);margin-top:22px;padding-top:20px}:root{--mode-cool:var(--accent);--mode-heat:oklch(68% .16 50);--mode-dry:oklch(65% .1 200);--mode-fan:oklch(62% .03 250)}.chip__dot.is-on{fill:var(--accent);animation:2s ease-in-out infinite live}.chip__dot.mode-heat{fill:var(--mode-heat)}.chip__dot.mode-dry{fill:var(--mode-dry)}.chip__dot.mode-fan_only{fill:var(--mode-fan)}.device.is-on.mode-heat{background:oklch(68% .16 50/.1);border-color:oklch(68% .16 50/.45)}.device.is-on.mode-heat .device__icon{color:var(--mode-heat)}.climate{flex-direction:column;gap:14px;margin-bottom:16px;transition:opacity .2s;display:flex}.climate.is-off .chips{opacity:.6}.thermostat{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface-solid);grid-template-columns:52px 1fr 52px;align-items:center;gap:8px;padding:10px;display:grid}.thermostat__btn{border:1px solid var(--border);background:var(--surface-2);height:52px;color:var(--text);font:inherit;cursor:pointer;border-radius:12px;font-size:1.5rem;font-weight:500;line-height:1;transition:background .15s}.thermostat__btn:hover:not(:disabled){background:var(--border)}.thermostat__btn:disabled{opacity:.4;cursor:not-allowed}.thermostat__value{flex-direction:column;align-items:center;display:flex}.thermostat__label{color:var(--text-muted);font-size:.72rem}.thermostat__temp{letter-spacing:-.03em;font-variant-numeric:tabular-nums;font-size:2.1rem;font-weight:600;line-height:1.1}.thermostat__unit{color:var(--text-muted);vertical-align:top;margin-left:2px;font-size:.5em;font-weight:500}.chips__label{color:var(--text-muted);margin:0 2px 6px;font-size:.72rem;font-weight:500;display:block}.chips__row{flex-wrap:wrap;gap:6px;display:flex}.chip-btn{border:1px solid var(--border);background:var(--surface-solid);min-height:34px;color:var(--text);font:inherit;cursor:pointer;border-radius:999px;padding:6px 12px;font-size:.8rem;font-weight:500;transition:background .15s,border-color .15s,color .15s}.chip-btn:hover:not(:disabled){border-color:var(--accent)}.chip-btn.is-active{background:var(--accent);border-color:var(--accent);color:#fff}.chip-btn:disabled{cursor:not-allowed}.ac__side--r{fill:oklch(93% .005 250)}.ac__side--l{fill:oklch(85% .008 250)}.ac__top{fill:oklch(98% .003 250);stroke:oklch(75% .01 250);stroke-width:.5px}.ac.is-on .ac__side--r,.ac.is-on .ac__side--l{fill:var(--accent)}.ac.is-on.mode-heat .ac__side--r,.ac.is-on.mode-heat .ac__side--l{fill:var(--mode-heat)}.ac__air path{fill:none;stroke:var(--accent);stroke-width:1.2px;stroke-linecap:round;opacity:.55;animation:2.4s ease-in-out infinite air}.ac.mode-heat .ac__air path{stroke:var(--mode-heat)}@keyframes air{50%{opacity:.15}}.splash__hint{max-width:32ch;color:var(--text-faint);text-align:center;font-size:.82rem}
