:root{--bg: #0f172a;--bg-elevated: #1e293b;--bg-card: #1e293b;--surface: #1e293b;--surface-hover: #334155;--border: #334155;--text: #f1f5f9;--text-muted: #94a3b8;--accent: #38bdf8;--accent-hover: #7dd3fc;--success: #34d399;--warning: #fbbf24;--danger: #f87171;--radius: 12px;--radius-sm: 8px;--shadow: 0 4px 24px rgba(0, 0, 0, .25);--font: "Inter", system-ui, -apple-system, sans-serif}*,*:before,*:after{box-sizing:border-box}body{margin:0;font-family:var(--font);background:var(--bg);color:var(--text);line-height:1.5;-webkit-font-smoothing:antialiased}a{color:var(--accent);text-decoration:none}a:hover{color:var(--accent-hover);text-decoration:underline}.auth-container{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:1.5rem;background:linear-gradient(160deg,#0f172a,#1e293b,#0f172a)}.auth-card{width:100%;max-width:400px;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:2rem;box-shadow:var(--shadow)}.auth-card h1{margin:0 0 1.5rem;font-size:1.5rem;font-weight:600;letter-spacing:-.02em}.auth-card label{display:block;font-size:.875rem;font-weight:500;color:var(--text-muted);margin-bottom:.5rem}.auth-card input{width:100%;padding:.75rem 1rem;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg);color:var(--text);font-size:1rem;margin-bottom:1.25rem;transition:border-color .15s}.auth-card input::placeholder{color:var(--text-muted)}.auth-card input:focus{outline:none;border-color:var(--accent)}.auth-card button[type=submit]{width:100%;padding:.75rem 1.25rem;border-radius:var(--radius-sm);border:none;background:var(--accent);color:#0f172a;font-weight:600;font-size:1rem;cursor:pointer;margin-top:.25rem;transition:background .15s}.auth-card button[type=submit]:hover:not(:disabled){background:var(--accent-hover)}.auth-card button[type=submit]:disabled{opacity:.7;cursor:not-allowed}.error{color:var(--danger);font-size:.875rem;margin-top:.5rem;padding:.5rem 0}.layout{min-height:100vh;display:flex;flex-direction:column;background:var(--bg)}.header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1rem;padding:1rem 1.5rem;background:var(--bg-elevated);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:50}.header h1{margin:0;font-size:1.25rem;font-weight:600;letter-spacing:-.02em}.header-brand{display:flex;align-items:center;gap:.75rem;min-height:2.5rem}.header-brand__text{color:var(--text);font-size:2rem;font-weight:700;line-height:1;white-space:nowrap}.header-brand__logo{height:2.5rem;width:auto;max-width:8rem;object-fit:contain;display:block}.header nav{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.header nav a,.header nav .nav-btn{padding:.5rem .75rem;border-radius:var(--radius-sm);font-size:.875rem;font-weight:500;color:var(--text-muted);transition:color .15s,background .15s}.header nav a:hover{color:var(--text);background:#ffffff0f;text-decoration:none}.header select{padding:.5rem .75rem;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg);color:var(--text);font-size:.875rem}.header .btn-logout{padding:.5rem 1rem;border-radius:var(--radius-sm);border:1px solid var(--border);background:transparent;color:var(--text-muted);font-size:.875rem;cursor:pointer;transition:border-color .15s,color .15s}.header .btn-logout:hover{border-color:var(--danger);color:var(--danger)}.content{padding:1.5rem;flex:1;max-width:1400px;width:100%;margin:0 auto}.alert{padding:.75rem 1rem;border-radius:var(--radius-sm);margin-bottom:1rem;font-size:.875rem}.alert-success{background:#34d39926;border:1px solid rgba(52,211,153,.4);color:var(--success)}.alert-error{background:#f8717126;border:1px solid rgba(248,113,113,.4);color:var(--danger, #f87171)}.toolbar{display:flex;align-items:center;gap:1rem;margin-bottom:1.5rem;flex-wrap:wrap}.btn-primary{padding:.5rem 1rem;border-radius:var(--radius-sm);border:none;background:var(--accent);color:#0f172a;font-weight:500;font-size:.875rem;cursor:pointer;transition:background .15s}.btn-primary:hover{background:var(--accent-hover)}.btn-secondary{padding:.5rem 1rem;border-radius:var(--radius-sm);border:1px solid var(--border);background:transparent;color:var(--text);font-size:.875rem;cursor:pointer;transition:border-color .15s,background .15s}.btn-secondary:hover{background:#ffffff0d;border-color:var(--text-muted)}.view-toggle{display:flex;align-items:center;gap:0;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}.view-toggle__btn{padding:.4rem .75rem;font-size:.8125rem;font-weight:500;background:transparent;border:none;color:var(--text-muted);cursor:pointer;transition:background .15s,color .15s}.view-toggle__btn:hover{color:var(--text);background:#ffffff0d}.view-toggle__btn--active{background:var(--accent);color:var(--bg)}.view-toggle__btn+.view-toggle__btn{border-left:1px solid var(--border)}.devices-table-wrap{overflow-x:auto;padding:0}.devices-table{width:100%;border-collapse:collapse;font-size:.875rem}.devices-table th,.devices-table td{padding:.6rem .75rem;text-align:left;border-bottom:1px solid var(--border)}.devices-table th{font-weight:600;color:var(--text-muted);font-size:.75rem;text-transform:uppercase;letter-spacing:.03em}.devices-table__row:hover td{background:#ffffff08}.devices-table__name{font-weight:500;min-width:120px}.devices-table__topic{font-family:ui-monospace,monospace;font-size:.8125rem;color:var(--text-muted);max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.devices-table__site{min-width:100px}.devices-table__unassigned{color:var(--warning);font-weight:500}.devices-table__status{display:inline-block;padding:.2rem .5rem;border-radius:999px;font-size:.75rem;font-weight:500}.devices-table__status--online{background:#34d39933;color:var(--success)}.devices-table__status--offline{background:#f8717133;color:var(--danger)}.devices-table__power{display:flex;align-items:center}.devices-table__power-btn{padding:.25rem .5rem;font-size:.75rem;font-weight:600;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg-elevated);color:var(--text-muted);cursor:pointer;min-width:2.5rem;transition:background .15s,color .15s,border-color .15s}.devices-table__power-btn:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.devices-table__power-btn--on{background:#34d39933;border-color:var(--success);color:var(--success)}.devices-table__power-btn:disabled{opacity:.6;cursor:not-allowed}.devices-table__fw{font-size:.8125rem;color:var(--text-muted)}.devices-table__col-open{width:1%;white-space:nowrap;padding-left:.5rem}.devices-table__open-link{font-size:.875rem;font-weight:500;color:var(--accent);text-decoration:none;padding:.25rem .5rem;border-radius:var(--radius-sm);background:#38bdf826}.devices-table__open-link:hover{background:#38bdf840;color:var(--accent-hover);text-decoration:underline}.devices-table__col-select{width:2.5rem;padding-right:.5rem;vertical-align:middle}.devices-table__col-select input,.devices-table__row,.devices-table__row[role=button]{cursor:pointer}.devices-table__row .devices-table__name-link{text-decoration:none;color:inherit}.devices-table__row:hover .devices-table__name-link{color:var(--accent);text-decoration:underline}.devices-table__row--selected td{background:#38bdf81f}.devices-table__row--selected:hover td{background:#38bdf82e}.selection-panel{margin-top:1.25rem}.selection-panel__header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem;margin-bottom:1rem}.selection-panel__title{font-weight:600;font-size:1rem}.selection-panel__tabs{display:flex;flex-wrap:wrap;gap:.25rem;margin-bottom:1rem;border-bottom:1px solid var(--border);padding-bottom:.5rem}.selection-panel__tab{padding:.4rem .75rem;font-size:.8125rem;font-weight:500;background:transparent;border:none;border-radius:var(--radius-sm);color:var(--text-muted);cursor:pointer;transition:background .15s,color .15s}.selection-panel__tab:hover{color:var(--text);background:#ffffff0d}.selection-panel__tab--active{background:#38bdf833;color:var(--accent)}.selection-panel__content{min-height:80px}.selection-panel__list{list-style:none;margin:0;padding:0}.selection-panel__list li{padding:.35rem 0;border-bottom:1px solid var(--border);font-size:.875rem}.selection-panel__list li:last-child{border-bottom:none}.selection-panel__meta{color:var(--text-muted);font-size:.8125rem;margin-left:.25rem}.selection-panel__status{margin-left:.5rem;font-size:.75rem;font-weight:500}.selection-panel__status--on{color:var(--success)}.selection-panel__status--off{color:var(--danger)}.selection-panel__form label{display:block;font-size:.875rem;color:var(--text-muted);margin-bottom:.25rem}.device-detail__back{margin-bottom:.75rem}.device-detail__back a{color:var(--text-muted);font-size:.875rem}.device-detail__header{margin-bottom:1.25rem}.device-detail__title{margin:0 0 .25rem;font-size:1.5rem;font-weight:600}.device-detail__meta{margin:0 0 1rem;font-size:.875rem;color:var(--text-muted)}.device-detail__tabs{display:flex;flex-wrap:wrap;gap:.25rem;border-bottom:1px solid var(--border);padding-bottom:.5rem}.device-detail__tab{padding:.5rem .75rem;font-size:.875rem;font-weight:500;background:transparent;border:none;border-radius:var(--radius-sm);color:var(--text-muted);cursor:pointer;transition:background .15s,color .15s}.device-detail__tab:hover{color:var(--text);background:#ffffff0d}.device-detail__tab--active{background:#38bdf833;color:var(--accent)}.device-detail__panel{margin-top:1rem}.device-detail__overview .device-detail__card{max-width:20rem}.device-detail__overview .power-metrics{max-width:36rem}.power-metrics__header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:.5rem}.power-metrics__header h3{margin:0}.power-metrics__grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));gap:.75rem 1.5rem}.power-metrics__item{display:flex;flex-direction:column;gap:.15rem}.power-metrics__label{font-size:.8125rem;color:var(--text-muted)}.power-metrics__value{font-size:1rem;font-weight:500;font-variant-numeric:tabular-nums}.voltage-alert,.voltage-alert-summary{border:1px solid var(--border);border-radius:var(--radius-sm);padding:.75rem .9rem;margin-bottom:.9rem}.voltage-alert--high,.power-chart__log-row--high td{background:#f871711f;color:#fca5a5}.voltage-alert--low,.power-chart__log-row--low td{background:#f59e0b1f;color:#fcd34d}.voltage-alert-summary{margin-bottom:0}.device-detail__status{display:inline-block;padding:.25rem .5rem;border-radius:999px;font-size:.8125rem;font-weight:500}.device-detail__status--on{background:#34d39933;color:var(--success)}.device-detail__status--off{background:#f8717133;color:var(--danger)}.device-detail__power-btn{padding:.25rem .6rem;font-size:.875rem;font-weight:600;border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--bg-elevated);color:var(--text-muted);cursor:pointer}.device-detail__power-btn--on{background:#34d39933;border-color:var(--success);color:var(--success)}.power-chart__heading{margin:0 0 1rem;font-size:1.125rem}.power-chart__controls{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.5rem}.power-chart__controls label{display:flex;align-items:center;font-size:.875rem;color:var(--text-muted)}.power-chart__title{margin-bottom:.5rem;font-size:1rem}.power-chart__metric-block,.power-chart__log{margin-top:1.5rem}.power-chart__log-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:.75rem}.power-chart__log-header h4{margin:0}.power-chart__log-header span{color:var(--text-muted);font-size:.875rem}.power-chart__log-table-wrap{overflow-x:auto}.power-chart__log-table{width:100%;border-collapse:collapse;font-size:.875rem}.power-chart__log-table th,.power-chart__log-table td{padding:.65rem .5rem;border-bottom:1px solid var(--border);text-align:left;white-space:nowrap}.power-chart__log-table th{color:var(--text-muted);font-weight:600}.power-chart__log-table td{font-variant-numeric:tabular-nums}.power-chart__log-row--high td,.power-chart__log-row--low td{border-bottom-color:#ffffff14}.devices-table__name-link,.device-card__name-link{color:inherit;text-decoration:none;font-weight:inherit}.devices-table__name-link:hover,.device-card__name-link:hover{color:var(--accent);text-decoration:underline}.grid{display:grid;gap:1.25rem;grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}.card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:1.25rem;box-shadow:var(--shadow);transition:border-color .15s}.card:hover{border-color:#38bdf84d}.card h2{margin:0 0 .5rem;font-size:1.125rem;font-weight:600;letter-spacing:-.01em}.card-meta{font-size:.8125rem;color:var(--text-muted);margin-bottom:1rem}.badge{display:inline-flex;align-items:center;padding:.25rem .5rem;border-radius:999px;font-size:.75rem;font-weight:500}.badge-online{background:#34d39933;color:var(--success)}.badge-offline{background:#f8717133;color:var(--danger)}.badge-provisioned{background:#6366f133;color:var(--accent)}.card-topic{font-size:.75rem;color:var(--text-muted)}.badge-power-on{color:var(--success);font-weight:600}.badge-power-off{color:var(--text-muted);font-weight:500}.card-actions{margin-top:1rem;display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.card .btn-toggle{padding:.5rem 1rem;border-radius:var(--radius-sm);border:none;font-weight:500;font-size:.875rem;cursor:pointer;transition:opacity .15s}.card .btn-toggle:disabled{opacity:.6;cursor:not-allowed}.card .btn-toggle.on{background:var(--success);color:#0f172a}.card .btn-toggle.off{background:var(--bg-elevated);color:var(--text);border:1px solid var(--border)}.card-footer{margin-top:1rem;padding-top:1rem;border-top:1px solid var(--border);font-size:.8125rem;color:var(--text-muted)}.card-footer a{display:inline-block;margin-top:.25rem}.empty-state{text-align:center;padding:3rem 2rem;background:var(--bg-card);border:1px dashed var(--border);border-radius:var(--radius);color:var(--text-muted)}.empty-state p{margin:0 0 1rem;font-size:1rem}.empty-state .empty-state-title{font-size:1.125rem;font-weight:500;color:var(--text);margin-bottom:.5rem}.on{color:var(--success);font-weight:600}.off{color:var(--text-muted);font-weight:500}.device-card{position:relative;transition:box-shadow .3s ease,transform .2s ease,border-color .2s}.device-card:hover{box-shadow:0 12px 40px #00000059}.device-card--selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.device-card__header{display:flex;justify-content:space-between;align-items:flex-start;gap:.75rem;margin-bottom:.75rem}.device-card__select{flex-shrink:0;margin-right:.5rem;padding-top:.15rem}.device-card__select input{cursor:pointer;width:1.1rem;height:1.1rem}.device-card__title-block{min-width:0;flex:1}.device-card__name{margin:0 0 .25rem;font-size:1.125rem;font-weight:700;color:var(--text);letter-spacing:-.02em}.device-card__location{margin:0;font-size:.8125rem;color:var(--text-muted)}.device-card__location--unassigned{color:var(--warning);font-weight:500}.device-card__topic{margin:.25rem 0 0;font-size:.75rem;color:var(--text-muted);opacity:.9}.device-card__fw{margin-left:.5rem;padding:.05rem .4rem;border-radius:999px;font-size:.65rem;background:#94a3b833;color:var(--text-muted)}.device-card__badges{display:flex;align-items:center;gap:.35rem;flex-shrink:0}.device-card__status{padding:.2rem .5rem;border-radius:999px;font-size:.7rem;font-weight:600}.device-card__status--icon{padding:.15rem .4rem;display:flex;align-items:center;justify-content:center}.device-card__status-icon{display:inline-block;font-size:.8rem;line-height:1}.device-card__status-icon--wifi:before{content:"📶"}.device-card__status-icon--power:before{content:"⏻"}.device-card__status--online,.device-card__status--power-on{background:#34d39940;color:var(--success);animation:heartbeat 2s ease-in-out infinite}.device-card__status--offline,.device-card__status--power-off{background:#f8717138;color:var(--danger, #ef4444)}@keyframes heartbeat{0%,to{opacity:1}50%{opacity:.85}}.device-card__energy{margin-bottom:1rem}.device-card__energy-row{display:flex;gap:1rem;font-size:.8125rem;color:var(--text-muted)}.device-card__energy-item--power{color:var(--accent);font-weight:600}.device-card__switch-row{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem}.device-card__toggle-wrap{position:relative;display:inline-block;width:48px;height:26px;padding:0;border:none;background:none;cursor:pointer}.device-card__toggle-wrap:disabled{cursor:not-allowed;opacity:.7}.device-card__toggle-slider{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--bg-elevated);border:1px solid var(--border);border-radius:999px;transition:background .25s ease,border-color .25s ease}.device-card__toggle-slider:before{content:"";position:absolute;width:20px;height:20px;left:2px;top:2px;background:var(--text-muted);border-radius:50%;transition:transform .25s ease}.device-card__toggle-slider--on{background:var(--success);border-color:var(--success)}.device-card__toggle-slider--on:before{transform:translate(22px);background:#fff}.device-card__power-label{font-size:.875rem;font-weight:600;color:var(--text)}.device-card__sparkline{margin-bottom:.5rem}.device-card__sparkline .sparkline{display:block}.device-card__last-updated{margin:0 0 .75rem;font-size:.7rem;color:var(--text-muted)}.device-card__footer{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem;padding-top:.75rem;border-top:1px solid var(--border)}.device-card__quick-actions{display:flex;flex-wrap:wrap;gap:.35rem}.device-card__action-btn{padding:.25rem .5rem;font-size:.75rem;background:transparent;color:var(--text-muted);border:1px solid transparent;border-radius:var(--radius-sm);cursor:pointer;transition:color .15s,background .15s}.device-card__action-btn:hover{color:var(--accent);background:#38bdf81a}.device-card__action-link{text-decoration:none}.device-card__context-wrap{position:relative}.device-card__context-trigger{width:28px;height:28px;padding:0;font-size:1.25rem;line-height:1;background:transparent;border:none;color:var(--text-muted);cursor:pointer;border-radius:var(--radius-sm);transition:background .15s,color .15s}.device-card__context-trigger:hover{background:var(--bg-elevated);color:var(--text)}.device-card__context-menu{position:absolute;right:0;top:100%;margin-top:.25rem;min-width:160px;padding:.35rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow);z-index:10}.device-card__context-menu button,.device-card__context-menu a{display:block;width:100%;padding:.5rem .75rem;font-size:.8125rem;text-align:left;background:none;border:none;color:var(--text);cursor:pointer;border-radius:4px;text-decoration:none}.device-card__context-menu button:hover,.device-card__context-menu a:hover{background:#38bdf826;color:var(--accent)}.device-card__tooltip-info{margin-top:.5rem;font-size:.7rem;color:var(--text-muted);display:flex;gap:1rem}.toolbar-search{flex:1;min-width:160px;max-width:280px;padding:.5rem .75rem;font-size:.875rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text)}.toolbar-search::placeholder{color:var(--text-muted)}.toolbar-filters{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.toolbar-filter-select{padding:.5rem .75rem;font-size:.875rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text)}.bulk-actions-bar{display:flex;align-items:center;gap:.75rem;padding:.5rem 0;flex-wrap:wrap}.bulk-actions-bar .btn-primary{margin:0}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:100;padding:1rem;animation:fadeIn .2s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.modal{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:1.5rem;min-width:280px;max-width:420px;box-shadow:0 20px 60px #0006;animation:slideUp .25s ease}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.modal h3{margin:0 0 1rem;font-size:1.125rem}.modal-actions{display:flex;gap:.75rem;justify-content:flex-end;margin-top:1.25rem}.device-card-wrapper{position:relative}.device-card-bulk-check{position:absolute;top:.75rem;right:.75rem;z-index:2}.device-card-bulk-check input{width:1rem;height:1rem;cursor:pointer}.tenant-select-card{color:var(--text)}.tenant-select-card .tenant-select-card__name{color:var(--text);font-weight:700;font-size:1.125rem;letter-spacing:.02em}@media(max-width:640px){.content{padding:1rem}.header{padding:.75rem 1rem}.device-card__header{flex-direction:column;align-items:flex-start}.toolbar{flex-wrap:wrap}.toolbar-search{max-width:none}}
