:root{
  --bg:#0e1116; --panel:#171c24; --panel2:#1e242e; --line:#2a323d; --ink:#eef2f7;
  --muted:#93a1b2; --accent:#3ea6ff; --good:#37d67a; --warn:#ffb020; --bad:#ff5470;
  --radius:14px; font-family:-apple-system,"Segoe UI",system-ui,Roboto,Arial,sans-serif;
}
*{box-sizing:border-box} html,body{margin:0}
body{background:var(--bg);color:var(--ink);-webkit-font-smoothing:antialiased;padding-bottom:78px}
.boot{padding:80px 20px;text-align:center;color:var(--muted)}
a{color:var(--accent)}

/* login */
.login{max-width:360px;margin:12vh auto;padding:28px;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius)}
.login h1{margin:0 0 4px;font-size:1.5rem}
.login p{margin:0 0 20px;color:var(--muted);font-size:.9rem}
.login input{width:100%;padding:13px;margin-bottom:12px;border-radius:10px;border:1px solid var(--line);background:var(--panel2);color:var(--ink);font-size:1rem}
.login button,.btn{width:100%;padding:13px;border:0;border-radius:10px;background:var(--accent);color:#04121f;font-weight:700;font-size:1rem;cursor:pointer}
.err{color:var(--bad);font-size:.85rem;min-height:1.2em}
.demo-box{margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}
.demo-h{font-size:.8rem;color:var(--muted);margin-bottom:10px;text-align:center}
.demo-btn{display:flex;justify-content:space-between;align-items:center;width:100%;background:var(--panel2);border:1px solid var(--line);color:var(--ink);border-radius:10px;padding:11px 14px;margin-bottom:8px;cursor:pointer;font-size:.9rem;text-align:left}
.demo-btn:hover{border-color:var(--accent)}
.demo-btn b{font-weight:700}.demo-btn span{color:var(--muted);font-size:.78rem;font-family:var(--mono,monospace)}
.demo-link{display:block;text-align:center;margin-top:6px;color:var(--accent);text-decoration:none;font-size:.88rem}

/* header */
header{position:sticky;top:0;z-index:5;background:rgba(14,17,22,.92);backdrop-filter:blur(8px);border-bottom:1px solid var(--line);padding:14px 18px;display:flex;align-items:center;gap:12px}
header .logo{font-weight:800;letter-spacing:-.01em}
header .logo b{color:var(--accent)}
header .mode{margin-left:auto;font-size:.8rem;color:var(--muted);background:var(--panel2);padding:6px 12px;border-radius:20px;border:1px solid var(--line)}
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px;background:var(--good);vertical-align:middle}
.dot.off{background:var(--bad)} .dot.warn{background:var(--warn)} .dot.unknown{background:var(--muted)}

main{max-width:900px;margin:0 auto;padding:16px}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:16px}
.card h3{margin:0 0 10px;font-size:1rem}
.section-title{margin:22px 4px 10px;font-size:.8rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}

/* stat tiles */
.stat{display:flex;flex-direction:column;gap:2px}
.stat .n{font-size:1.7rem;font-weight:800}
.stat .l{font-size:.75rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}

/* scene + quick buttons */
.chips{display:flex;gap:10px;flex-wrap:wrap}
.chip{background:var(--panel2);border:1px solid var(--line);border-radius:12px;padding:12px 16px;cursor:pointer;font-size:.95rem;display:flex;align-items:center;gap:8px;color:var(--ink)}
.chip:active{transform:scale(.97)}
.chip .ic{font-size:1.2rem}

/* device tile */
.dev{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:14px}
.dev .top{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.dev .name{font-weight:600;font-size:.95rem}
.dev .type{font-size:.72rem;color:var(--muted);margin-left:auto}
.toggle{width:52px;height:30px;border-radius:20px;background:var(--panel2);border:1px solid var(--line);position:relative;cursor:pointer;flex:0 0 auto}
.toggle::after{content:"";position:absolute;top:3px;left:3px;width:22px;height:22px;border-radius:50%;background:var(--muted);transition:.15s}
.toggle.on{background:rgba(62,166,255,.25);border-color:var(--accent)}
.toggle.on::after{left:25px;background:var(--accent)}
input[type=range]{width:100%;accent-color:var(--accent)}
.row{display:flex;align-items:center;gap:10px;margin-top:8px}
.val{font-variant-numeric:tabular-nums;color:var(--muted);font-size:.85rem;min-width:44px;text-align:right}
.pill{font-size:.7rem;padding:2px 8px;border-radius:20px;border:1px solid var(--line);color:var(--muted)}
.pill.live{color:var(--good);border-color:rgba(55,214,122,.4)}
.mini{font-size:.8rem;color:var(--muted)}
.tvbtns{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.tvbtns button,.sbtn{background:var(--panel2);border:1px solid var(--line);color:var(--ink);border-radius:8px;padding:7px 10px;font-size:.8rem;cursor:pointer}

/* automations/logs */
.list{display:flex;flex-direction:column;gap:8px}
.li{display:flex;align-items:center;gap:10px;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:12px 14px}
.li .g{flex:1;min-width:0}
.li .g b{font-weight:600} .li .g div{font-size:.78rem;color:var(--muted)}
.log{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:.76rem;color:var(--muted);white-space:pre-wrap;word-break:break-word}

/* bottom nav */
nav{position:fixed;bottom:0;left:0;right:0;background:rgba(14,17,22,.96);backdrop-filter:blur(8px);border-top:1px solid var(--line);display:flex;justify-content:space-around;padding:8px 4px env(safe-area-inset-bottom)}
nav button{background:0;border:0;color:var(--muted);font-size:.68rem;display:flex;flex-direction:column;align-items:center;gap:3px;cursor:pointer;padding:6px 10px;flex:1}
nav button .ic{font-size:1.25rem}
nav button.active{color:var(--accent)}
.toast{position:fixed;bottom:86px;left:50%;transform:translateX(-50%);background:var(--panel2);border:1px solid var(--line);color:var(--ink);padding:10px 16px;border-radius:10px;font-size:.85rem;opacity:0;transition:.2s;pointer-events:none;z-index:20;max-width:90%}
.toast.show{opacity:1}

/* rule builder */
.rbin{width:100%;padding:10px;margin:6px 0;border-radius:8px;border:1px solid var(--line);background:var(--panel2);color:var(--ink);font-size:.95rem}
.rbsec{border:1px solid var(--line);border-radius:10px;padding:12px;margin:12px 0;background:var(--bg)}
.rblab{display:inline-block;font:700 .72rem/1 var(--mono,monospace);letter-spacing:.1em;color:var(--accent);background:rgba(62,166,255,.14);padding:5px 9px;border-radius:6px;margin-bottom:6px}
.rbrow{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.rbrow .rbin{flex:1;min-width:90px}
.rbrow .rbDel{flex:0 0 auto}

/* floor plan */
.fpwrap{position:relative;width:100%;aspect-ratio:16/10;background:var(--panel2) center/contain no-repeat;border:1px solid var(--line);border-radius:12px;overflow:hidden;touch-action:none}
.fpm{position:absolute;transform:translate(-50%,-50%);background:rgba(10,13,18,.82);border:1px solid var(--line);border-radius:20px;min-width:36px;height:36px;padding:0 9px;font-size:.95rem;cursor:pointer;color:var(--ink);display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,.4)}
.fpm:active{transform:translate(-50%,-50%) scale(.94)}

/* command / voice bar */
.cmdbar{display:flex;gap:8px;align-items:center;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:8px 8px 8px 14px;margin-bottom:6px}
.cmdbar input{flex:1;min-width:0;background:0;border:0;color:var(--ink);font-size:.95rem;outline:none}
.cmdbar button{background:var(--panel2);border:1px solid var(--line);color:var(--ink);border-radius:10px;width:40px;height:40px;font-size:1.1rem;cursor:pointer;flex:0 0 auto}
.cmdbar #cmdMic{color:var(--accent)}

/* announcement overlay */
.announce{position:fixed;inset:0;z-index:50;display:none;align-items:flex-start;justify-content:center;background:rgba(0,0,0,.5);padding-top:12vh}
.announce.show{display:flex}
.ann-card{background:var(--panel);border:1px solid var(--accent);border-radius:16px;padding:22px 26px;max-width:90%;text-align:center;box-shadow:0 20px 60px rgba(0,0,0,.5)}
.ann-h{font:700 .8rem/1 var(--mono,monospace);letter-spacing:.08em;color:var(--accent);text-transform:uppercase;margin-bottom:10px}
.ann-b{font-size:1.3rem;font-weight:600;margin-bottom:16px}

/* wall-panel / kiosk */
.panel{position:fixed;inset:0;background:radial-gradient(1200px 600px at 50% -10%,#182230,#0b0e13);display:flex;flex-direction:column;padding:5vh 6vw}
.pclock{text-align:center;margin-bottom:5vh}
.ptime{font:800 clamp(3rem,14vw,7rem)/1 var(--sans);letter-spacing:-.03em}
.pmode{color:var(--muted);font-size:1.1rem;margin-top:8px;text-transform:capitalize}
.pgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:18px;align-content:center;flex:1}
.ptile{background:var(--panel);border:1px solid var(--line);border-radius:20px;padding:26px 10px;font-size:1.1rem;color:var(--ink);cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:10px}
.ptile .pic{font-size:2.4rem}
.ptile.hit{border-color:var(--accent);background:rgba(62,166,255,.16)}
.pexit{position:fixed;top:16px;right:16px;width:44px;height:44px;border-radius:50%;background:var(--panel2);border:1px solid var(--line);color:var(--muted);font-size:1.1rem;cursor:pointer}
