/* IoT · LoRaWAN */
.iot{display:flex;flex-direction:column;gap:16px;color:#10253b}
.iot h2,.iot h3{margin:0;color:#082945}.iot h2{font-size:22px;display:flex;align-items:center;gap:10px}.iot h3{font-size:15px;font-weight:800}
.iot p{margin:0}
.iot-tabs{display:flex;gap:4px;border-bottom:1px solid #d9e6ec;overflow-x:auto}
.iot-tabs button{height:40px;padding:0 16px;border:0;border-bottom:3px solid transparent;background:transparent;color:#4d6478;font:inherit;font-size:14px;font-weight:700;cursor:pointer;white-space:nowrap}
.iot-tabs button[aria-selected=true]{color:#082945;border-bottom-color:#00b5bb}
.iot-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.iot-head .ghost,.iot-head .primary{height:40px;font-weight:700;display:inline-flex;align-items:center;gap:8px}
.iot-gws{flex:1;display:flex;flex-direction:column;gap:3px;min-width:240px}
.iot-gw{display:flex;align-items:center;gap:8px;font-size:13px;color:#4d6478}.iot-gw b{color:#10253b}
.iot-gw i,.iot-dot{width:8px;height:8px;border-radius:50%;background:#1f9d6b;display:inline-block;flex-shrink:0}.iot-gw i.off,.iot-dot.off{background:#9aabba}
.iot-dot{margin-right:8px}
.iot-new{font-size:11px;font-weight:800;padding:2px 7px;border-radius:20px;background:#00b5bb;color:#062036}
.iot-title{flex:1;display:flex;flex-direction:column;gap:3px;min-width:200px}.iot-title span{font-size:13px;color:#4d6478}
.iot-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:12px}
.iot-kpi{background:#fff;border:1px solid #d9e6ec;border-radius:14px;padding:12px 16px;display:flex;flex-direction:column;gap:4px;min-width:0}
.iot-kpi span{font-size:12.5px;font-weight:700;color:#4d6478}.iot-kpi b{font-size:26px;font-weight:800;color:#082945;font-variant-numeric:tabular-nums}
.iot-kpi small{font-size:12px;font-weight:600;color:#4d6478;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.iot-kpi small.bad{color:#a12639}.iot-kpi small.warn{color:#8a5200}
.iot-chips{display:flex;gap:6px;flex-wrap:wrap;flex:1}
.iot-chips button{height:34px;padding:0 14px;border-radius:20px;border:1px solid #c9dbe3;background:#fff;color:#33495c;font:inherit;font-size:13px;font-weight:700;cursor:pointer}
.iot-chips button[aria-pressed=true]{background:#193966;border-color:#193966;color:#fff}
.iot-chips .iot-add{border-style:dashed;color:#00718a}
.iot-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:12px}
.iot-card{display:flex;flex-direction:column;gap:8px;padding:14px;border-radius:14px;background:#fff;border:1px solid #d9e6ec;text-align:left;font:inherit;color:inherit;cursor:pointer;min-height:180px}
.iot-card:hover{border-color:#9fc4d2;box-shadow:0 6px 18px rgba(8,41,69,.07)}.iot-card.alert{border:2px solid #e8a3ae}
.iot-ct{display:flex;align-items:center;gap:8px}.iot-cn{display:flex;flex-direction:column;flex:1;min-width:0}.iot-cn b{font-size:13.5px}.iot-cn small{font-size:11.5px;color:#5d7387;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.iot-ic{width:34px;height:34px;flex-shrink:0;border-radius:9px;display:grid;place-items:center;font-size:10px;font-weight:800;color:#fff}
.iot-pill{font-size:11px;font-weight:800;padding:2px 8px;border-radius:20px;white-space:nowrap;background:#eef3f6;color:#4d6478}.iot-pill.ok{background:#e3f6ed;color:#0d6b4a}.iot-pill.bad{background:#fdecee;color:#a12639}
.iot-big{display:flex;align-items:baseline;gap:6px}.iot-big b{font-size:30px;font-weight:800;color:#082945;font-variant-numeric:tabular-nums}.iot-big span{font-size:13px;color:#4d6478}
.iot-card.alert .iot-big b{color:#a12639}.iot-card.offline .iot-big b{color:#7a8fa0}
.iot-sec{font-size:12.5px;color:#33495c;min-height:18px}
.iot-cf{display:flex;gap:10px;padding-top:8px;border-top:1px solid #eef3f6;font-size:11.5px;color:#5d7387;margin-top:auto}.iot-cf .bad{color:#a12639;font-weight:700}.iot-seen{margin-left:auto}
.iot-empty{background:#fff;border:1px dashed #b9cfd9;border-radius:16px;padding:40px;display:flex;flex-direction:column;align-items:center;gap:10px;text-align:center}.iot-empty b{font-size:17px;color:#082945}.iot-empty p{color:#4d6478;max-width:460px}
.iot-muted{font-size:12.5px;color:#5d7387}
.iot-seg{display:flex;gap:4px;padding:4px;background:#fff;border:1px solid #d9e6ec;border-radius:11px}
.iot-seg button{height:30px;padding:0 12px;border:0;border-radius:8px;background:transparent;color:#33495c;font:inherit;font-size:12.5px;font-weight:700;cursor:pointer}
.iot-seg button[aria-pressed=true]{background:#193966;color:#fff}.iot-seg.sm{align-self:flex-start;background:#f3f8fa}
.iot-dgrid{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:16px}
.iot-dmain,.iot-dside{display:flex;flex-direction:column;gap:16px;min-width:0}
.iot-box{background:#fff;border:1px solid #d9e6ec;border-radius:14px;padding:16px;display:flex;flex-direction:column;gap:10px;min-width:0}
.iot-bh{display:flex;align-items:center;gap:10px;justify-content:space-between;flex-wrap:wrap}
.iot-chart{width:100%;height:auto;display:block}.iot-chart text{font-size:11px;fill:#6a8094}.iot-chart .g{stroke:#eef3f6}.iot-chart .iot-pk{font-size:11.5px;font-weight:700;fill:#a12639}
.iot-nochart{padding:40px 0;text-align:center}
.iot-ev{display:flex;align-items:center;gap:12px;padding:8px 0;border-top:1px solid #eef3f6;font-size:13px}
.iot-evt{width:90px;color:#5d7387;font-variant-numeric:tabular-nums;flex-shrink:0}.iot-ev .iot-pill{width:70px;text-align:center;flex-shrink:0}.iot-evx{flex:1;min-width:0}.iot-ev small{color:#5d7387}
.iot-ev img{width:64px;height:40px;object-fit:cover;border-radius:6px;display:block}
.iot-lim{display:flex;flex-direction:column;gap:8px}
.iot-lr{display:grid;grid-template-columns:1fr 72px 72px 34px;gap:6px;align-items:center;font-size:13px;color:#33495c}
.iot-lr input{height:34px;padding:0 8px;font-weight:700;text-align:right;width:100%}.iot-lr small{color:#5d7387}
.iot-lr2{display:flex;align-items:center;gap:6px;font-size:12.5px;color:#4d6478}.iot-lr2 input{height:32px;width:64px;padding:0 8px}
.iot-lr2.col{flex-direction:column;align-items:stretch}.iot-lr2.col input{width:100%}
.iot-lim .primary{align-self:flex-start}
.iot-cam{width:100%;aspect-ratio:16/9;object-fit:cover;border-radius:10px;background:#0b1c2c}
.iot-link{border:0;background:none;color:#00718a;font:inherit;font-size:12.5px;font-weight:700;cursor:pointer;padding:0}
.iot-dl{display:grid;grid-template-columns:90px 1fr;gap:6px 10px;margin:0;font-size:13px}.iot-dl dt{color:#5d7387}.iot-dl dd{margin:0;font-weight:600;font-variant-numeric:tabular-nums;word-break:break-word}
/* floor plan */
.iot-tools{display:flex;gap:8px;flex-wrap:wrap;align-items:center;padding:10px;background:#fff;border:1px solid #d9e6ec;border-radius:12px}
.iot-tools .ghost[aria-pressed=true]{background:#193966;color:#fff;border-color:#193966}
.iot-up{cursor:pointer;display:inline-flex;align-items:center}
.iot-hint{font-size:12.5px;color:#4d6478;margin-left:auto}
.iot-pwrap{display:grid;grid-template-columns:minmax(0,1fr);gap:16px}.iot-pwrap.editing{grid-template-columns:minmax(0,1fr) 250px}
.iot-plan{position:relative;width:100%;aspect-ratio:1/.6;background:#fff;border:1px solid #d9e6ec;border-radius:14px;overflow:hidden;touch-action:none;
  background-image:linear-gradient(#eef3f6 1px,transparent 1px),linear-gradient(90deg,#eef3f6 1px,transparent 1px);background-size:24px 24px}
.iot-plan img{position:absolute;inset:0;width:100%;height:100%;object-fit:fill;user-select:none;pointer-events:none}
.iot-plan svg{position:absolute;inset:0;width:100%;height:100%}
.iot-room rect{fill:rgba(0,181,187,.07);stroke:#193966;stroke-width:2.5;vector-effect:non-scaling-stroke}
.iot-room text{font-size:14px;font-weight:800;fill:#193966;letter-spacing:.02em;font-family:inherit;pointer-events:none}
.editing .iot-plan{cursor:crosshair}
#iotPins{position:absolute;inset:0;pointer-events:none}
.iot-pin{position:absolute;transform:translate(-50%,-50%);pointer-events:auto;display:flex;align-items:center;gap:6px;padding:4px 10px 4px 4px;border-radius:20px;border:2px solid #1f9d6b;background:#fff;box-shadow:0 4px 12px rgba(8,41,69,.18);font:inherit;cursor:pointer;white-space:nowrap}
.iot-pin i{width:14px;height:14px;border-radius:50%;background:#1f9d6b;flex-shrink:0}
.iot-pin span{display:flex;flex-direction:column;line-height:1.15;text-align:left}.iot-pin b{font-size:13px;color:#082945}.iot-pin small{font-size:10.5px;color:#5d7387;max-width:130px;overflow:hidden;text-overflow:ellipsis}
.iot-pin.alert{border-color:#c2364b}.iot-pin.alert i{background:#c2364b;animation:iotPulse 1.2s infinite}.iot-pin.alert b{color:#a12639}
.iot-pin.offline{border-color:#9aabba}.iot-pin.offline i{background:#9aabba}
.editing .iot-pin{cursor:grab}
@keyframes iotPulse{0%{box-shadow:0 0 0 0 rgba(194,54,75,.6)}100%{box-shadow:0 0 0 10px rgba(194,54,75,0)}}
@media (prefers-reduced-motion:reduce){.iot-pin.alert i{animation:none}}
.iot-free{background:#fff;border:1px solid #d9e6ec;border-radius:14px;padding:12px;display:flex;flex-direction:column;gap:6px;align-self:start;max-height:70vh;overflow:auto}
.iot-free button{display:flex;align-items:center;gap:8px;padding:6px;border:1px solid transparent;border-radius:10px;background:none;font:inherit;text-align:left;cursor:pointer}
.iot-free button[aria-pressed=true]{border-color:#00b5bb;background:#f0fbfb}.iot-free span{display:flex;flex-direction:column;min-width:0}.iot-free b{font-size:13px}.iot-free small{font-size:11.5px;color:#5d7387}
.iot-free .iot-ic{width:28px;height:28px;font-size:9px}
/* rules */
.iot-rgrid{display:grid;grid-template-columns:360px minmax(0,1fr);gap:16px;align-items:start}
.iot-rlist{display:flex;flex-direction:column;gap:10px}
.iot-rcard{display:flex;flex-direction:column;gap:6px;padding:14px;border-radius:14px;background:#fff;border:1px solid #d9e6ec;font:inherit;text-align:left;cursor:pointer;color:inherit}
.iot-rcard[aria-pressed=true]{border:2px solid #00b5bb;box-shadow:0 4px 14px rgba(8,41,69,.08)}
.iot-rcard>span{font-size:12.5px;color:#4d6478;line-height:1.45}.iot-rcard small{font-size:11.5px;color:#5d7387}
.iot-rh{display:flex;align-items:center;gap:8px}.iot-rh b{flex:1;font-size:14px;color:#10253b}
.iot-sw{width:34px;height:20px;border-radius:20px;background:#c9dbe3;position:relative;flex-shrink:0}.iot-sw:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff}
.iot-sw.on{background:#1f9d6b}.iot-sw.on:after{left:16px}
.iot-editor{gap:14px;padding:20px}
.iot-rname{display:flex;flex-direction:column;gap:5px;font-size:12.5px;font-weight:700;color:#4d6478}.iot-rname input{font-size:16px;font-weight:700}
.iot-blk{display:flex;gap:14px;align-items:flex-start}
.iot-tag{width:76px;flex-shrink:0;height:30px;border-radius:8px;display:grid;place-items:center;font-size:11.5px;font-weight:800;letter-spacing:.06em;color:#fff}
.iot-tag.when{background:#2f6fd1}.iot-tag.if{background:#c77a12}.iot-tag.then{background:#1f8a4c}
.iot-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13.5px;color:#10253b}
.iot-row input[type=number]{width:90px}.iot-row input[type=text]{flex:1;min-width:180px}
.iot-col{display:flex;flex-direction:column;gap:8px;flex:1;padding:10px 12px;border:1px solid #d9e6ec;border-radius:11px;background:#f8fbfc}
.iot-blk>.iot-row{flex:1;padding:10px 12px;border:1px solid #d9e6ec;border-radius:11px;background:#f8fbfc}
.iot-days{display:flex;gap:10px;flex-wrap:wrap;align-items:center;font-size:13px}.iot-days label{display:flex;gap:4px;align-items:center}
.iot-soon{color:#7a8fa0}
.iot-rfoot{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding-top:12px;border-top:1px solid #eef3f6}.iot-rfoot>span{flex:1}
/* connect */
.iot-cgrid{display:grid;grid-template-columns:minmax(0,460px) minmax(0,1fr);gap:16px;align-items:start}
.iot-gwbox{border:1px solid #d9e6ec;border-radius:12px;padding:12px;display:flex;flex-direction:column;gap:8px}
.iot-kv{display:grid;grid-template-columns:96px minmax(0,1fr) 40px;gap:8px;align-items:center;font-size:12.5px}.iot-kv span{font-weight:700;color:#4d6478}
.iot-kv code{padding:7px 9px;border-radius:8px;background:#f3f8fa;border:1px solid #d9e6ec;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.iot-how{font-size:13px;color:#33495c}.iot-how summary{cursor:pointer;font-weight:700;color:#00718a}.iot-how ol{padding-left:20px;display:flex;flex-direction:column;gap:6px;margin:10px 0 0}
.iot-tbl{width:100%}.iot-tbl td{font-size:12.5px;vertical-align:middle}.iot-tbl code{font-size:12px}
.iot-tbl .primary,.iot-ok{height:30px;padding:0 12px;font-weight:700;font-size:12.5px;border-radius:8px}
.iot-ok{border:1px solid #9fd8bd;background:#e3f6ed;color:#0d6b4a;cursor:pointer}
.iot-models small{font-size:11.5px;font-weight:800;letter-spacing:.06em;color:#6a8094}.iot-models div{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.iot-models span{font-size:12px;font-weight:700;padding:4px 10px;border-radius:20px;background:#eef3f6;color:#33495c}
/* menu chip */
#nav button[data-page=iot][data-g]{grid-template-columns:24px auto 1fr}
#nav button[data-page=iot][data-g]:has(.nav-badge){grid-template-columns:24px auto 1fr auto}
.nav-lora{justify-self:start;font-size:9.5px;font-weight:800;letter-spacing:.04em;padding:2px 6px;border-radius:20px;background:#e6f5f6;color:#00718a;line-height:1.2}
.shell.sidebar-collapsed .nav-lora{display:none}
.shell.sidebar-collapsed #nav button[data-page=iot][data-g]{grid-template-columns:1fr}
@media (max-width:1100px){.iot-dgrid,.iot-rgrid,.iot-cgrid,.iot-pwrap.editing{grid-template-columns:minmax(0,1fr)}}
@media (max-width:640px){.iot-big b{font-size:26px}.iot-ev{flex-wrap:wrap}.iot-evt{width:auto}.iot-blk{flex-direction:column;gap:6px}.iot-tbl{display:block;overflow-x:auto}.iot-pin small{display:none}}
.iot-cgrid{grid-template-columns:minmax(0,400px) minmax(0,1fr)}
.iot-tbl td,.iot-tbl th{white-space:nowrap}.iot-tbl td.iot-rd{white-space:normal;min-width:180px}
.iot-ok{white-space:nowrap}
@media (max-width:640px){.iot-gws{min-width:100%}.iot-gw{flex-wrap:wrap;column-gap:4px}.iot-head .primary,.iot-head .ghost{flex:1;justify-content:center}}
.iot-tbl{display:block;overflow-x:auto}
