:root{color-scheme:light dark;--bg:#edf3f2;--panel:#fff;--panel-soft:#f4f8f7;--text:#17312d;--muted:#687c78;--line:#d9e5e2;--accent:#177a6b;--accent-dark:#106356;--danger:#b93d35;--shadow:0 12px 30px rgba(24,64,57,.09)}*{box-sizing:border-box}body{margin:0;min-width:320px;background:linear-gradient(145deg,#e5f0ed 0%,var(--bg) 45%,#f4f7f6 100%);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif}.site-header,main{max-width:1200px;margin:0 auto}.site-header{padding:2.4rem 1.25rem 1.4rem;display:flex;align-items:flex-end;justify-content:space-between;gap:1rem}.brand{display:flex;flex-direction:column;color:var(--text);text-decoration:none}.brand-title{font-size:clamp(2.25rem,5vw,3.7rem);font-weight:800;letter-spacing:-.055em;line-height:1}.eyebrow,.section-kicker,.panel-kicker{margin:0 0 .45rem;color:var(--accent);font-size:.72rem;font-weight:800;letter-spacing:.14em;text-transform:uppercase}.mode-button,.button{display:inline-flex;align-items:center;justify-content:center;min-height:40px;border:1px solid transparent;border-radius:9px;padding:.62rem .9rem;font:700 .88rem/1.1 inherit;text-decoration:none;cursor:pointer;transition:background .15s,border-color .15s,transform .15s}.mode-button{border-color:var(--line);background:rgba(255,255,255,.65);color:var(--accent-dark)}.mode-button:hover,.button-secondary:hover{border-color:var(--accent);transform:translateY(-1px)}main{padding:0 1.25rem 3.5rem}.breadcrumbs{display:flex;align-items:center;gap:.55rem;margin:.35rem 0 1.25rem;color:var(--muted);font-size:.78rem}.breadcrumbs a{color:var(--accent);text-decoration:none}.page-header{margin-bottom:1.4rem}.page-header h2{margin:0;font-size:clamp(2rem,4vw,3rem);letter-spacing:-.045em}.page-header p:not(.section-kicker){max-width:720px;margin:.55rem 0 0;color:var(--muted);line-height:1.6}.page-header-row{display:flex;justify-content:space-between;align-items:flex-end;gap:1rem}.admin-card-grid,.device-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,280px),1fr));gap:1rem}.admin-nav-card{position:relative;display:flex;min-height:185px;flex-direction:column;justify-content:flex-end;gap:.5rem;padding:1.35rem;border:1px solid rgba(23,122,107,.15);border-radius:18px;background:var(--panel);box-shadow:var(--shadow);color:var(--text);text-decoration:none;transition:transform .15s,border-color .15s}.admin-nav-card:hover{transform:translateY(-2px);border-color:var(--accent)}.admin-card-index{position:absolute;top:1.25rem;right:1.25rem;color:var(--accent);font-size:.72rem;font-weight:800;letter-spacing:.12em}.admin-nav-card strong{font-size:1.35rem}.admin-nav-card>span:last-child{color:var(--muted);line-height:1.5}.admin-panel,.table-card,.card{border:1px solid rgba(23,122,107,.13);border-radius:18px;background:var(--panel);box-shadow:var(--shadow)}.admin-panel{padding:1.25rem}.panel-heading{margin-bottom:1rem}.panel-heading h3{margin:0;font-size:1.15rem}.panel-heading>p:not(.panel-kicker){margin:.45rem 0 0;color:var(--muted);line-height:1.5}.table-card{overflow:hidden}.table-wrap{overflow:auto}.admin-table{width:100%;min-width:960px;border-collapse:collapse}.admin-table th,.admin-table td{padding:.82rem .9rem;border-bottom:1px solid var(--line);text-align:left;vertical-align:middle}.admin-table th{background:var(--panel-soft);color:var(--muted);font-size:.7rem;letter-spacing:.08em;text-transform:uppercase}.admin-table tbody tr:last-child td{border-bottom:0}.admin-table tbody tr:hover{background:rgba(23,122,107,.035)}.action-cell{text-align:right!important}.status-pill{display:inline-flex;border-radius:999px;padding:.28rem .52rem;font-size:.73rem;font-weight:700}.status-pill.is-on{background:#dff3eb;color:#126557}.status-pill.is-off{background:#ecefed;color:#68716e}.button-primary{background:var(--accent);color:#fff}.button-primary:hover{background:var(--accent-dark);transform:translateY(-1px)}.button-secondary{border-color:var(--line);background:var(--panel-soft);color:var(--text)}.button-danger{background:var(--danger);color:#fff}.button-danger:hover{background:#922f29}.button-compact{min-height:34px;padding:.45rem .68rem;font-size:.8rem}.device-edit-layout{display:grid;grid-template-columns:minmax(300px,390px) minmax(0,1fr);gap:1rem;align-items:start}.form-stack{display:grid;gap:1rem}.field-grid{display:grid;gap:1rem}.field{display:grid;gap:.42rem;color:var(--text);font-size:.84rem;font-weight:700}.field input,.field select{width:100%;min-height:42px;border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--text);padding:.65rem .72rem;font:inherit}.field input:focus,.field select:focus{outline:2px solid rgba(23,122,107,.2);border-color:var(--accent)}.toggle-grid{display:grid;gap:.8rem}.toggle-card{display:grid;grid-template-columns:20px 1fr;align-items:start;gap:.75rem;padding:.85rem;border:1px solid var(--line);border-radius:10px;background:var(--panel-soft);cursor:pointer}.toggle-card input{width:17px;height:17px;margin:.12rem 0 0;accent-color:var(--accent)}.toggle-card span{display:grid;gap:.2rem}.toggle-card strong{font-size:.88rem}.toggle-card small{color:var(--muted);font-size:.75rem;line-height:1.4}.toggle-card-inline{margin-bottom:1rem}.location-status{margin:.2rem 0 .9rem;color:var(--muted);line-height:1.5}.form-actions{display:flex;justify-content:flex-end;gap:.65rem}.plan-panel{padding:.85rem}.plan-panel .panel-heading{padding:.4rem .4rem 0}.plan{cursor:crosshair}.plan img{display:block;width:100%;height:auto}.marker{position:absolute;width:18px;height:18px;border:4px solid #fff;border-radius:50%;background:#d94841;box-shadow:0 2px 8px rgba(0,0,0,.35);transform:translate(-50%,-50%)}.danger-zone{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-top:1rem;padding:1.15rem 1.25rem;border:1px solid rgba(185,61,53,.5);border-radius:16px;background:rgba(185,61,53,.055)}.danger-zone h3{margin:0;color:var(--danger)}.danger-zone p:not(.panel-kicker){max-width:760px;margin:.4rem 0 0;color:var(--muted);line-height:1.5}.settings-layout{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem}.settings-layout>.admin-panel:last-of-type{grid-column:1/-1}.settings-actions{grid-column:1/-1}.notice{padding:.8rem 1rem;border:1px solid rgba(23,122,107,.3);border-radius:10px;background:#dff3eb;color:#126557}.card{padding:1.1rem}.card h2{margin:0}.readings{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.65rem;margin:1rem 0}.reading{padding:.75rem;border-radius:14px;background:var(--panel-soft)}.muted,.card small{color:var(--muted)}@media(max-width:820px){.device-edit-layout,.settings-layout{grid-template-columns:1fr}.settings-layout>.admin-panel:last-of-type,.settings-actions{grid-column:auto}.page-header-row,.danger-zone{align-items:flex-start;flex-direction:column}.site-header{align-items:flex-start;flex-direction:column}.form-actions{justify-content:flex-start}}@media(prefers-color-scheme:dark){:root{--bg:#0e1715;--panel:#16211f;--panel-soft:#1d2b28;--text:#e9f3f0;--muted:#9aada8;--line:#2a3b37;--accent:#54c8b0;--accent-dark:#40ab95;--shadow:0 12px 30px rgba(0,0,0,.25)}body{background:linear-gradient(145deg,#101d1a,#0e1715)}.mode-button{background:rgba(22,33,31,.8)}.status-pill.is-on{background:#193a31;color:#71d6bd}.status-pill.is-off{background:#2b3230;color:#adb8b5}.notice{background:#193a31;color:#71d6bd}}


.inline-toggle{display:inline;margin:0}.status-toggle{border:1px solid transparent;font:inherit;cursor:pointer;transition:transform .15s,border-color .15s}.status-toggle:hover{transform:translateY(-1px);border-color:var(--accent)}.status-toggle:focus-visible{outline:2px solid rgba(23,122,107,.35);outline-offset:2px}


.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.status-toggle:disabled{cursor:wait;opacity:.65}.status-toggle.is-updating{transform:none}


/* Floor-plan dashboard */
.dashboard-shell{display:grid;gap:1rem}.dashboard-heading{display:flex;align-items:flex-end;justify-content:space-between;gap:1rem;margin-bottom:.3rem}.dashboard-heading h2{margin:0;font-size:clamp(2rem,4vw,3rem);letter-spacing:-.045em}.dashboard-heading p:not(.section-kicker){margin:.5rem 0 0;color:var(--muted)}.dashboard-refresh{display:flex;align-items:center;gap:.75rem;color:var(--muted);font-size:.8rem}.floor-dashboard{display:grid;grid-template-columns:minmax(0,1fr) minmax(230px,300px);gap:1rem;align-items:start}.floor-card,.dashboard-panel{border:1px solid rgba(23,122,107,.13);border-radius:18px;background:var(--panel);box-shadow:var(--shadow)}.floor-card{padding:.85rem}.floor-stage{padding:24px;border-radius:13px;overflow:visible;background:linear-gradient(145deg,#e7f0ed,#f6f8f7)}.floor-canvas{position:relative;width:100%;line-height:0}.floor-canvas>img{display:block;width:100%;height:auto}.admin-floor-stage{margin-top:.25rem}.marker-layer,.leader-layer{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}.leader-layer{overflow:visible}.leader-layer line{stroke:var(--accent-dark);stroke-width:1.5;stroke-dasharray:3 3;opacity:.55;vector-effect:non-scaling-stroke}.sensor-marker{position:absolute;z-index:2;display:grid;grid-template-columns:1fr;min-width:62px;padding:.42rem .5rem;border:2px solid rgba(255,255,255,.95);border-radius:12px;background:rgba(23,49,45,.92);color:#fff;box-shadow:0 5px 14px rgba(20,55,49,.28);font:inherit;line-height:1;pointer-events:auto;cursor:pointer;transition:left .2s,top .2s,transform .18s,box-shadow .15s}.sensor-marker:hover,.sensor-marker:focus-visible{z-index:5;box-shadow:0 7px 20px rgba(20,55,49,.42);outline:3px solid rgba(23,122,107,.25);outline-offset:2px}.marker-reading{display:block;text-align:center;white-space:nowrap}.marker-temperature{font-size:1rem;font-weight:800}.marker-humidity{margin-top:.25rem;color:#cfe8e2;font-size:.72rem;font-weight:700}.dashboard-aside{display:grid;gap:1rem}.dashboard-panel{padding:1rem}.dashboard-help p{margin:.55rem 0;color:var(--muted);font-size:.82rem;line-height:1.45}.dashboard-help strong{color:var(--text)}.unplaced-list{display:grid;gap:.55rem}.unplaced-device{display:flex;justify-content:space-between;gap:.75rem;padding:.65rem .7rem;border:1px solid var(--line);border-radius:10px;background:var(--panel-soft);font-size:.8rem}.unplaced-device span{color:var(--muted);white-space:nowrap}@media(max-width:900px){.floor-dashboard{grid-template-columns:1fr}.dashboard-aside{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:640px){.dashboard-heading{align-items:flex-start;flex-direction:column}.dashboard-refresh{width:100%;justify-content:space-between}.dashboard-aside{grid-template-columns:1fr}.sensor-marker{min-width:54px;padding:.34rem .4rem}.marker-temperature{font-size:.88rem}.marker-humidity{font-size:.66rem}}


@media(max-width:640px){.floor-stage{padding:12px}}


/* Dashboard phase 2: linked device list and marker states */
.sensor-marker.is-ambient{background:rgba(23,49,45,.94)}
.sensor-marker.is-local{background:rgba(74,74,92,.94)}
.sensor-marker.is-linked,.sensor-marker.is-selected{z-index:6;box-shadow:0 0 0 4px rgba(84,200,176,.28),0 8px 22px rgba(20,55,49,.46);outline:2px solid var(--accent);outline-offset:2px}
.sensor-marker.is-selected{box-shadow:0 0 0 5px rgba(84,200,176,.38),0 8px 24px rgba(20,55,49,.5)}
.device-list-panel .panel-heading{margin-bottom:.7rem}.dashboard-device-list{display:grid;gap:.5rem}.dashboard-device-row{display:flex;width:100%;align-items:center;justify-content:space-between;gap:.75rem;padding:.7rem;border:1px solid var(--line);border-radius:11px;background:var(--panel-soft);color:var(--text);font:inherit;text-align:left;cursor:pointer;transition:border-color .15s,background .15s,transform .15s,box-shadow .15s}.dashboard-device-row:hover,.dashboard-device-row:focus-visible,.dashboard-device-row.is-linked{border-color:var(--accent);background:rgba(23,122,107,.08);outline:none;transform:translateY(-1px)}.dashboard-device-row.is-selected{border-color:var(--accent);background:rgba(23,122,107,.13);box-shadow:0 0 0 2px rgba(23,122,107,.15)}.device-list-identity{display:flex;min-width:0;align-items:center;gap:.62rem}.device-list-identity>span:last-child{display:grid;min-width:0;gap:.18rem}.device-list-identity strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.82rem}.device-list-identity small{color:var(--muted);font-size:.68rem}.device-kind-dot{display:inline-block;flex:0 0 auto;width:10px;height:10px;border-radius:50%;vertical-align:middle;margin-right:.28rem}.device-kind-dot.is-ambient{background:var(--accent)}.device-kind-dot.is-local{background:#72758d}.device-list-readings{display:grid;flex:0 0 auto;grid-template-columns:auto auto;align-items:baseline;gap:.45rem}.device-list-readings strong{font-size:.9rem}.device-list-readings span{color:var(--muted);font-size:.75rem}
@media(max-width:900px){.device-list-panel{grid-column:1/-1}.dashboard-device-list{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:640px){.dashboard-device-list{grid-template-columns:1fr}}

/* Dashboard phase 3: selected-device details */
.device-detail-panel[hidden]{display:none}.device-detail-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;margin-bottom:.85rem}.device-detail-heading h3{margin:0;font-size:1.2rem}.detail-close{display:grid;place-items:center;width:32px;height:32px;border:1px solid var(--line);border-radius:50%;background:var(--panel-soft);color:var(--text);font:700 1.25rem/1 inherit;cursor:pointer}.detail-close:hover,.detail-close:focus-visible{border-color:var(--accent);outline:2px solid rgba(23,122,107,.2);outline-offset:2px}.detail-summary{display:flex;align-items:center;gap:.35rem;font-size:.78rem}.detail-identity{margin:.5rem 0 0;color:var(--muted);font-size:.75rem;line-height:1.45}.detail-readings{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.5rem;margin-top:.9rem}.detail-reading{display:grid;gap:.22rem;padding:.65rem;border-radius:10px;background:var(--panel-soft)}.detail-reading span{color:var(--muted);font-size:.68rem;text-transform:capitalize}.detail-reading strong{font-size:.94rem}.detail-empty{grid-column:1/-1;margin:0;color:var(--muted);font-size:.8rem}.detail-observed{display:flex;justify-content:space-between;gap:.75rem;margin:.85rem 0 0;padding-top:.75rem;border-top:1px solid var(--line);font-size:.7rem}.detail-observed span{color:var(--muted);text-align:right}
@media(max-width:900px){.device-detail-panel{grid-column:1/-1}.detail-readings{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:640px){.detail-readings{grid-template-columns:repeat(2,minmax(0,1fr))}}


/* Dashboard phase 3.1: prioritised details and revised desktop layout */
.floor-column{display:grid;gap:1rem;align-content:start}.dashboard-key{padding:.75rem 1rem}.dashboard-key .panel-kicker{margin-bottom:.5rem}.marker-key-items{display:flex;flex-wrap:wrap;align-items:center;gap:.45rem 1.25rem;color:var(--muted);font-size:.74rem;line-height:1.35}.marker-key-items strong{color:var(--text)}.marker-key-items span{white-space:nowrap}.marker-key-items .device-kind-dot{margin-right:.32rem}.detail-summary{justify-content:space-between;gap:.75rem}.detail-summary>span:first-child{display:flex;align-items:center;gap:.35rem}.device-status-strip{display:flex;align-items:center;gap:.65rem}.device-status{display:inline-grid;place-items:center;min-width:24px;height:24px;color:var(--muted);cursor:help}.battery-icon{position:relative;display:block;width:20px;height:11px;border:2px solid currentColor;border-radius:2px}.battery-icon:before{content:"";position:absolute;left:2px;top:2px;bottom:2px;width:calc((100% - 4px) * var(--battery) / 100%);max-width:calc(100% - 4px);background:var(--accent)}.battery-icon:after{content:"";position:absolute;right:-5px;top:2px;width:3px;height:5px;border-radius:0 1px 1px 0;background:currentColor}.signal-icon{display:flex;align-items:flex-end;gap:2px;width:20px;height:14px}.signal-icon b{display:block;width:3px;border-radius:1px;background:var(--line)}.signal-icon b:nth-child(1){height:4px}.signal-icon b:nth-child(2){height:7px}.signal-icon b:nth-child(3){height:10px}.signal-icon b:nth-child(4){height:13px}.signal-icon[data-strength="1"] b:nth-child(-n+1),.signal-icon[data-strength="2"] b:nth-child(-n+2),.signal-icon[data-strength="3"] b:nth-child(-n+3),.signal-icon[data-strength="4"] b:nth-child(-n+4){background:var(--accent)}.detail-reading-temperature,.detail-reading-humidity{background:rgba(23,122,107,.1)}
@media(max-width:900px){.floor-column{display:contents}.dashboard-key{order:2}.dashboard-aside{order:3}.device-list-panel{grid-column:auto}.device-detail-panel{grid-column:auto}.dashboard-key{grid-column:1/-1}.marker-key-items{gap:.45rem 1rem}}
@media(max-width:640px){.marker-key-items{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}.marker-key-items span{white-space:normal}}


/* Dashboard phase 3.2: compact viewport layout and bounded device list */
@media(min-width:901px){
  body:not(:has(.breadcrumbs)) .site-header{padding-top:1.15rem;padding-bottom:.7rem}
  body:not(:has(.breadcrumbs)) .brand-title{font-size:clamp(2rem,4vw,3rem)}
  body:not(:has(.breadcrumbs)) main{padding-bottom:1.5rem}
  .dashboard-shell{gap:.7rem}
  .dashboard-heading{margin-bottom:0;align-items:flex-end}
  .dashboard-heading h2{font-size:clamp(1.8rem,3vw,2.4rem)}
  .dashboard-heading p:not(.section-kicker){margin-top:.3rem;font-size:.86rem}
  .floor-dashboard{grid-template-columns:minmax(0,1fr) minmax(300px,340px);gap:.85rem}
  .dashboard-aside{gap:.85rem}
  .device-list-panel{display:flex;min-height:0;max-height:430px;flex-direction:column}
  .device-list-panel .panel-heading{flex:0 0 auto}
  .dashboard-device-list{min-height:0;overflow-y:auto;overscroll-behavior:contain;padding-right:.25rem;scrollbar-gutter:stable}
  .dashboard-device-row{padding:.58rem .65rem}
  .device-detail-panel{order:-1}
}
@media(min-width:901px) and (max-height:850px){
  body:not(:has(.breadcrumbs)) .site-header{padding-top:.75rem;padding-bottom:.45rem}
  body:not(:has(.breadcrumbs)) .brand-title{font-size:2.35rem}
  .dashboard-heading h2{font-size:1.9rem}
  .dashboard-heading p:not(.section-kicker){font-size:.8rem}
  .device-list-panel{max-height:340px}
  .floor-stage{padding:16px}
}
@media(max-width:900px){.device-list-panel{max-height:none}.dashboard-device-list{overflow:visible}.device-detail-panel{order:initial}}

/* Dashboard phase 3.3: taller bounded device list */
@media(min-width:901px){.device-list-panel{max-height:520px}}
@media(min-width:901px) and (max-height:850px){.device-list-panel{max-height:430px}}
