:root {
  /* ---------------------------------------------------------------
     SOLVOTIX-PALETT (delt med portalen - se AGENTS.md i repo-roten og
     /home/boggi/project_gone/frontend/frontend/AGENTS.md §4).

     Verdiene under er lagret som MELLOMROMSDELTE RGB-TRIPLER, ikke hex,
     slik at gjennomsiktige varianter kan skrives
        rgb(var(--sx-logo) / .12)
     i stedet for en ny hardkodet rgba(...). Det betyr at hele temaet
     kan byttes ved a endre denne ene blokken - ingen andre linjer.

     REGEL: legg aldri inn en ny rå hex- eller rgba()-verdi lenger nede
     i filen. Bruk et token herfra, eller legg til et nytt token her.
     ------------------------------------------------------------- */
  --sx-bg-deep:     0 8 32;      /* #000820  Background deep      */
  --sx-bg-midnight: 0 24 56;     /* #001838  Background midnight  */
  --sx-surface:     16 48 80;    /* #103050  Surface navy         */
  --sx-card:        24 64 104;   /* #184068  Card blue            */
  --sx-divider:     42 74 104;   /* #2A4A68  Divider slate        */
  --sx-logo:        8 120 140;   /* #08788C  Logo primary         */
  --sx-orange:      240 120 0;   /* #F07800  Accent orange        */
  --sx-action:      16 104 240;  /* #1068F0  Action blue          */
  --sx-green:       0 160 88;    /* #00A058  Success green        */
  --sx-text:        248 248 248; /* #F8F8F8  Text / off-white     */
  --sx-text-2:      97 107 115;  /* #616B73  Secondary text       */
  --sx-danger:      239 68 68;   /* #EF4444  Danger (fra portalens styles.css --danger) */
  --sx-accent-alt:  8 120 140;   /* Laering/simulering-aksent. Paletten har ingen
                                    lilla, sa denne foelger logo-primaer. */
  --sx-white:       255 255 255;
  --sx-black:       0 0 0;

  /* Kort - nøyaktig samme oppskrift som portalens gateways-side, se
     frontend/src/app/system/gateways/gateways.component.css. */
  --card-bg:
    radial-gradient(circle at 18% 12%, rgb(var(--sx-divider) / .22) 0%, rgb(var(--sx-divider) / .08) 32%, transparent 58%),
    linear-gradient(145deg, rgb(var(--sx-card) / .28) 0%, rgb(var(--sx-bg-midnight) / .38) 48%, rgb(var(--sx-bg-deep) / .54) 100%),
    rgb(var(--sx-bg-midnight));
  --card-border: 1px solid rgb(var(--sx-divider) / .85);
  --shadow-1: 0 10px 20px rgb(var(--sx-black) / .35), 0 2px 6px rgb(var(--sx-black) / .35);

  /* Prisniva-rampe (5 steg). Monoton i lyshet-sa-kulør, og oransje/rod
     er fortsatt skillbare fra gronn ved rod-gronn-fargeblindhet.
     NORMAL er en lysnet divider-slate: rå #2A4A68 blir for mork for en
     tynn stolpe pa #000820. DETTE er eneste kilde til prisfargene -
     app.js leser de samme variablene via theme(), sa de to kan ikke
     lenger komme i utakt.

     MERK: disse er ferdig utregnede rgb()-verdier, ikke color-mix().
     getComputedStyle() loeser IKKE opp color-mix() i en custom property
     (den returnerer selve teksten "color-mix(...)"), og canvas i app.js
     leser nettopp disse via theme() - en color-mix() her ville gitt
     usynlige stolper i prisgrafen. Utregningen star i kommentaren bak
     hver verdi. */
  --level-very-cheap:     rgb(var(--sx-green));
  --level-cheap:          rgb(112 200 160);  /* 55% #00A058 + 45% #F8F8F8 */
  --level-normal:         rgb(104 126 147);  /* 70% #2A4A68 + 30% #F8F8F8 */
  --level-expensive:      rgb(var(--sx-orange));
  --level-very-expensive: rgb(var(--sx-danger));

  /* Graf-/canvas-farger. Canvas kan ikke lese CSS-variabler selv, sa
     app.js henter disse en gang via theme() - legg nye graffarger her,
     ikke som literal i app.js. */
  --chart-grid:           rgb(var(--sx-white) / .06);
  --chart-now:            rgb(var(--sx-text) / .35);
  --chart-preheat-fill:   rgb(var(--sx-orange) / .28);
  --chart-preheat-stroke: rgb(var(--sx-orange) / .7);

  /* De 15 opprinnelige fargenavnene beholdes UENDRET som navn - hele
     filen (~500 var()-referanser) peker fortsatt hit. Bare verdiene er
     byttet til Solvotix-paletten over, sa temaskiftet er denne blokken
     pluss --sx-*-blokken, ingenting annet. */
  --bg: rgb(var(--sx-bg-deep));
  --bg-panel: rgb(var(--sx-bg-midnight));
  --bg-panel-2: rgb(var(--sx-surface));
  --border: rgb(var(--sx-divider) / .85);
  --border-glow: rgb(var(--sx-logo));
  --cyan: rgb(var(--sx-logo));
  --cyan-soft: rgb(92 165 178);   /* 65% logo-primaer + 35% tekst */
  --green: rgb(var(--sx-green));
  --blue: rgb(var(--sx-action));
  --amber: rgb(var(--sx-orange));
  --red: rgb(var(--sx-danger));
  --purple: rgb(var(--sx-accent-alt));
  --text: rgb(var(--sx-text));
  /* --text-muted brukes til ekte brodtekst. Palettens #616B73 gir bare
     ~3.1:1 mot #000820 og stryker pa WCAG AA, sa den brukes til det den
     faktisk er - dekorativ/tertiaer tekst (--text-dim) - mens
     --text-muted er palettens egen tekstfarge nedtonet (~10:1). */
  --text-muted: rgb(var(--sx-text) / .72);
  --text-dim: rgb(var(--sx-text-2));
  --radius: 16px;

  /* ---------------------------------------------------------------
     GUI-redesign, steg 1 (avtalt med brukeren 28.08.2026) - nye
     design-tokens. Alt over denne linjen er UENDRET (samme
     fargenavn/verdier som for redesignet) - ingenting som allerede
     brukes noe sted i filen er fjernet eller endret her, sa dagens
     utseende er 100% likt for disse nye tokenene tas i bruk et sted.

     Hensikt: gi senere steg (romkort, faner, bunnnavigasjon o.l.) et
     konsistent, gjenbrukbart sett a bygge pa i stedet for nye,
     hardkodede tall - i tråd med "Design system"-kravet i planen.

     Avstands-skala (spacing) - brukes til padding/gap/margin. ---- */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-7: 32px;
  --space-8: 40px;

  /* Hjørne-avrunding - --radius (16px) over er allerede "standard
     kort"-verdien og beholdes uendret som sådan; disse tre er nye
     navn for de andre avrundingene som allerede brukes spredt i
     filen (10-14px sma kort/rader, 999px piller), sa nytt innhold
     kan referere et NAVN i stedet for et nytt magisk tall. */
  --radius-sm: 10px;
  --radius-md: 14px;
  --radius-lg: 20px;
  --radius-pill: 999px;

  /* Type-skala - samme skrifttype som i dag (Segoe UI-stakken,
     definert på body under), bare navngitte størrelser i stedet for
     spredte tall. */
  --font-family: "Segoe UI", -apple-system, BlinkMacSystemFont, Roboto, Arial, sans-serif;
  --font-xs: 11px;
  --font-sm: 12.5px;
  --font-base: 14px;
  --font-md: 16px;
  --font-lg: 20px;
  --font-xl: 28px;
  --font-2xl: 40px;

  /* Mobil-first brytpunkter (dokumentert her som fasit-verdier - CSS
     støtter ikke var() inne i @media selv, så disse skrives ut som
     tallverdier direkte i hver @media-regel, men skal alltid matche
     tallene under):
       --bp-phone:  480px  (liten mobil)
       --bp-tablet: 768px  (nettbrett / stor mobil liggende)
       --bp-desktop:1024px (skrivebord)
     Eksisterende brytpunkter i filen (980px/720px) beholdes uendret
     - de brukes fortsatt av dagens layout. Nye komponenter i senere
     steg bruker 480/768/1024. */
}

* { box-sizing: border-box; }

/* Global sikring: en senere klasse-regel (f.eks. "display: flex") kan
   ellers "vinne" over den native [hidden]-attributten pa lik
   spesifisitet - se ogsa .modal-backdrop[hidden] under. */
[hidden] { display: none !important; }

html, body {
  margin: 0;
  padding: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-family);
}

body {
  background-image:
    radial-gradient(ellipse 900px 500px at 15% -10%, rgb(var(--sx-logo) / .08), transparent),
    radial-gradient(ellipse 700px 500px at 100% 10%, rgb(var(--sx-green) / .06), transparent);
  min-height: 100vh;
}

button { font-family: inherit; }

/* ---------- Header ---------- */
.topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 28px;
  border-bottom: 1px solid var(--border);
  background: rgb(var(--sx-bg-deep) / .85);
  backdrop-filter: blur(6px);
  position: sticky;
  top: 0;
  z-index: 10;
}

.brand { display: flex; align-items: center; gap: 12px; }
.brand-logo { width: 38px; height: 38px; border-radius: 9px; }
.brand-name { font-weight: 700; letter-spacing: 3px; font-size: 15px; color: var(--text); }
.brand-sub { font-weight: 500; letter-spacing: 3px; font-size: 10px; color: var(--cyan); margin-top: 1px; }

.topbar-right { display: flex; align-items: center; gap: 10px; }

.pill {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 6px 12px;
  border-radius: 999px;
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  font-size: 12px;
  color: var(--text-muted);
  white-space: nowrap;
}
.pill-toggle { cursor: pointer; color: var(--text); }
.pill-toggle:hover { border-color: var(--border-glow); }

.dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.dot-muted { background: var(--text-dim); }
.dot-green { background: var(--green); box-shadow: 0 0 8px var(--green); }
.dot-amber { background: var(--amber); box-shadow: 0 0 8px var(--amber); }
.dot-red { background: var(--red); box-shadow: 0 0 8px var(--red); }
.dot-cyan { background: var(--cyan); box-shadow: 0 0 8px var(--cyan); }

.icon-btn {
  width: 34px;
  height: 34px;
  border-radius: 10px;
  border: 1px solid var(--border);
  background: var(--bg-panel-2);
  color: var(--text-muted);
  cursor: pointer;
  font-size: 16px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.icon-btn:hover { color: var(--cyan); border-color: var(--border-glow); }

/* ---------- Hovednavigasjon (GUI-redesign steg 2, 28.08.2026) ----------
   Samme <nav id="mainNav"> element bade pa desktop og mobil - kun
   CSS-en under (media query pa 767px) flytter den fra en vanlig
   fanerad rett under toppfeltet til en fast bunn-navigasjon pa mobil,
   slik referansebildet viser. Ren visning/navigering - ingen styring. */
.main-nav {
  display: flex;
  gap: var(--space-2);
  padding: var(--space-3) 28px;
  border-bottom: 1px solid var(--border);
  background: rgb(var(--sx-bg-deep) / .6);
}
.main-nav .nav-btn {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-4);
  border-radius: var(--radius-pill);
  border: 1px solid transparent;
  background: transparent;
  color: var(--text-muted);
  font-size: var(--font-sm);
  font-weight: 700;
  letter-spacing: 0.5px;
  cursor: pointer;
}
.main-nav .nav-btn:hover { color: var(--text); }
.main-nav .nav-btn.active {
  background: rgb(var(--sx-logo) / .12);
  color: var(--cyan);
  border-color: rgb(var(--sx-logo) / .35);
}
.main-nav .nav-icon { font-size: var(--font-md); line-height: 1; }

@media (max-width: 767px) {
  .main-nav {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 50;
    justify-content: space-around;
    gap: 0;
    padding: var(--space-2) var(--space-1) calc(var(--space-2) + env(safe-area-inset-bottom, 0px));
    background: rgb(var(--sx-bg-deep) / .96);
    backdrop-filter: blur(10px);
    border-top: 1px solid var(--border);
    border-bottom: none;
  }
  .main-nav .nav-btn {
    flex: 1;
    flex-direction: column;
    gap: 3px;
    padding: var(--space-2) var(--space-1);
    border-radius: var(--radius-sm);
    font-size: 10.5px;
    letter-spacing: 0.2px;
  }
  /* Sorg for at den faste bunn-navigasjonen aldri dekker innhold nederst
     pa siden (f.eks. siste romkort eller lagre-knappen i Innstillinger). */
  #app { padding-bottom: 88px; }
}

/* ---------- Sider (Hjem/Energi/Enheter/Innstillinger) ----------
   [hidden] (global regel ovenst i filen) styrer hvilken side som vises -
   showPage() i app.js setter kun .hidden pa disse fire. Ingen egen
   layout-regel trengs utover det i dette steget. */
.page { }

/* ---------- Layout ---------- */
#app { padding: 24px 28px 60px; max-width: 1280px; margin: 0 auto; }

.banner {
  background: rgb(var(--sx-orange) / .12);
  border: 1px solid rgb(var(--sx-orange) / .4);
  color: var(--amber);
  padding: 10px 16px;
  border-radius: 10px;
  font-size: 13px;
  margin-bottom: 18px;
}
.banner-paused {
  background: rgb(var(--sx-danger) / .12);
  border-color: rgb(var(--sx-danger) / .4);
  color: var(--red);
  font-weight: 600;
}

.grid-top {
  display: grid;
  grid-template-columns: 1.1fr 1fr 1fr;
  gap: 18px;
  margin-bottom: 18px;
}

@media (max-width: 980px) {
  .grid-top { grid-template-columns: 1fr; }
}

/* Samme kortoppskrift som portalens gateways-side - se --card-bg i
   :root og AGENTS.md §5. Alle kortflater i appen skal bruke denne. */
.card {
  background: var(--card-bg);
  border: var(--card-border);
  border-radius: var(--radius);
  box-shadow: var(--shadow-1);
  padding: 20px;
  margin-bottom: 18px;
}
.grid-top .card { margin-bottom: 0; }

.card-title {
  font-size: 12px;
  letter-spacing: 2px;
  color: var(--text-muted);
  font-weight: 600;
  margin-bottom: 14px;
  display: flex;
  align-items: center;
  gap: 8px;
}

/* ---------- Pris na ---------- */
.price-now { font-size: 40px; font-weight: 700; color: var(--text); line-height: 1; }
.price-level {
  display: inline-block;
  margin-top: 8px;
  padding: 4px 12px;
  border-radius: 999px;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 1px;
  background: rgb(var(--sx-logo) / .12);
  color: var(--cyan);
}
.price-level.level-EXPENSIVE, .price-level.level-VERY_EXPENSIVE {
  background: rgb(var(--sx-orange) / .15);
  color: var(--amber);
}
.price-level.level-VERY_CHEAP, .price-level.level-CHEAP {
  background: rgb(var(--sx-green) / .15);
  color: var(--green);
}
.price-substats { margin-top: 18px; display: grid; grid-template-columns: 1fr 1fr; gap: 12px 18px; }
.price-substats .label, .savings-grid .label { display: block; font-size: 11px; color: var(--text-dim); }
.price-substats .value, .savings-grid .value { display: block; font-size: 15px; font-weight: 600; margin-top: 2px; }

/* ---------- Agent ---------- */
.agent-status-row { display: flex; align-items: center; gap: 10px; }
.agent-dot { width: 11px; height: 11px; border-radius: 50%; background: var(--text-dim); }
.agent-dot.status-preheat { background: var(--amber); box-shadow: 0 0 10px var(--amber); }
.agent-dot.status-reduce { background: var(--blue); box-shadow: 0 0 10px var(--blue); }
.agent-dot.status-normal { background: var(--green); box-shadow: 0 0 10px var(--green); }
.agent-dot.status-skip { background: var(--text-dim); }
.agent-dot.status-manual { background: var(--purple); box-shadow: 0 0 10px var(--purple); }
.agent-status { font-size: 18px; font-weight: 700; letter-spacing: 0.5px; }
.agent-reason { margin-top: 10px; font-size: 13px; color: var(--text-muted); line-height: 1.5; }
.agent-next { margin-top: 10px; font-size: 12px; color: var(--cyan); }

/* ---------- Besparelse ---------- */
.info-dot {
  position: relative;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  color: var(--text-dim);
  font-size: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: help;
}
.info-dot::before { content: "i"; font-size: 10px; font-style: italic; color: var(--text-muted); }
.info-dot .tooltip {
  display: none;
  position: absolute;
  top: 20px;
  left: 0;
  width: 260px;
  background: rgb(var(--sx-bg-midnight));
  border: 1px solid var(--border-glow);
  border-radius: 10px;
  padding: 12px;
  font-size: 12px;
  line-height: 1.5;
  color: var(--text-muted);
  z-index: 20;
  box-shadow: 0 8px 24px rgb(var(--sx-black) / .5);
}
.info-dot:hover .tooltip, .info-dot:focus .tooltip { display: block; }

.savings-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px 18px; }
.savings-value { color: var(--green); font-size: 17px; }

/* ---------- Vær (MET Norway) ---------- */
.card-weather { padding-bottom: 16px; }
.weather-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px 18px; }
.weather-grid .label { display: block; font-size: 11px; color: var(--text-dim); }
.weather-grid .value { display: block; font-size: 20px; font-weight: 600; margin-top: 2px; color: var(--cyan-soft); }
.weather-source { margin-top: 14px; font-size: 11px; color: var(--text-dim); }
.weather-error {
  margin-top: 12px;
  padding: 8px 10px;
  border-radius: 8px;
  background: rgb(var(--sx-orange) / .12);
  border: 1px solid rgb(var(--sx-orange) / .4);
  color: var(--amber);
  font-size: 12px;
}
@media (max-width: 720px) {
  .weather-grid { grid-template-columns: 1fr 1fr; }
}

/* ---------- Chart ---------- */
.card-chart canvas { width: 100%; display: block; }
.chart-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  margin-top: 14px;
  font-size: 11px;
  color: var(--text-muted);
}
.chart-legend span { display: inline-flex; align-items: center; gap: 6px; }
.legend-sep { width: 1px; height: 12px; background: var(--border); }
.swatch { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }
.swatch-vcheap { background: var(--level-very-cheap); }
.swatch-cheap { background: var(--level-cheap); }
.swatch-normal { background: var(--level-normal); }
.swatch-expensive { background: var(--level-expensive); }
.swatch-vexpensive { background: var(--level-very-expensive); }

/* LIVE CONTROL-merket. Appens mest sikkerhetskritiske merkelapp -
   den skal ha en ekte stilregel, ikke en inline-stil i app.js. */
.mock-badge-live { background: rgb(var(--sx-danger) / .18); color: var(--red); }
.swatch-now { background: var(--cyan); }
.swatch-preheat { background: rgb(var(--sx-orange) / .35); border: 1px solid var(--amber); }

/* ---------- Soner ---------- */
.zones-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 16px;
}
.zone-card {
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 18px;
}
.zone-name { font-weight: 700; font-size: 14px; letter-spacing: 1px; margin-bottom: 14px; }
.zone-readings { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 16px; margin-bottom: 14px; }
.zone-readings .label { display: block; font-size: 11px; color: var(--text-dim); }
.zone-readings .value { display: block; font-size: 17px; font-weight: 600; margin-top: 2px; }
.zone-status-badge {
  display: inline-block;
  padding: 4px 10px;
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.5px;
  margin-bottom: 10px;
}
.zone-status-badge.status-preheat { background: rgb(var(--sx-orange) / .15); color: var(--amber); }
.zone-status-badge.status-reduce { background: rgb(var(--sx-action) / .15); color: var(--blue); }
.zone-status-badge.status-normal { background: rgb(var(--sx-green) / .15); color: var(--green); }
.zone-status-badge.status-skip { background: rgb(var(--sx-text-2) / .12); color: var(--text-muted); }
.zone-status-badge.status-manual { background: rgb(var(--sx-accent-alt) / .15); color: var(--purple); }
.zone-reason { font-size: 12.5px; color: var(--text-muted); line-height: 1.5; margin-bottom: 10px; }
.zone-meta { font-size: 11px; color: var(--text-dim); }

/* ---------- Manuell PA/AV per sone ---------- */
.zone-power-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 10px 12px;
  margin-bottom: 12px;
  background: rgb(var(--sx-white) / .03);
  border: 1px solid var(--border);
  border-radius: 10px;
}
.power-status { display: flex; align-items: center; gap: 8px; font-size: 12px; font-weight: 700; letter-spacing: 0.5px; }
.power-dot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; }
.power-dot.power-on { background: var(--green); box-shadow: 0 0 8px var(--green); }
.power-dot.power-off { background: var(--text-dim); }
.power-buttons { display: flex; gap: 6px; }
.btn-power {
  padding: 5px 12px;
  border-radius: 8px;
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text-muted);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.5px;
  cursor: pointer;
}
.btn-power:hover:not(:disabled) { border-color: var(--border-glow); color: var(--text); }
.btn-power:disabled { opacity: 0.4; cursor: default; }
.btn-power-on:not(:disabled) { color: var(--green); border-color: rgb(var(--sx-green) / .4); }
.btn-power-off:not(:disabled) { color: var(--amber); border-color: rgb(var(--sx-orange) / .4); }

/* ---------- Manuelt setpoint / MANUAL OVERRIDE per sone ---------- */
.zone-mode-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-bottom: 12px;
  font-size: 11.5px;
}
.zone-mode-label { font-weight: 700; letter-spacing: 0.5px; color: var(--text-muted); }
.zone-mode-label.mode-manual { color: var(--purple); }
.zone-mode-detail { color: var(--text-dim); }
.zone-room-assoc {
  color: var(--text-dim);
  background: rgb(var(--sx-white) / .05);
  border-radius: 999px;
  padding: 2px 9px;
  font-weight: 600;
}
.zone-setpoint-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
}
.zone-setpoint-label { font-size: 11px; color: var(--text-dim); flex-basis: 100%; }
.zone-setpoint-input {
  width: 80px;
  padding: 6px 8px;
  border-radius: 8px;
  border: 1px solid var(--border);
  background: var(--bg-panel);
  color: var(--text);
  font-size: 13px;
}
.zone-setpoint-duration {
  padding: 6px 8px;
  border-radius: 8px;
  border: 1px solid var(--border);
  background: var(--bg-panel);
  color: var(--text-muted);
  font-size: 11.5px;
}
.btn-setpoint-set, .btn-resume-auto {
  padding: 6px 12px;
  border-radius: 8px;
  border: 1px solid var(--border);
  background: transparent;
  color: var(--cyan-soft);
  border-color: rgb(var(--sx-logo) / .4);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.5px;
  cursor: pointer;
}
.btn-setpoint-set:hover:not(:disabled), .btn-resume-auto:hover { border-color: var(--border-glow); filter: brightness(1.1); }
.btn-setpoint-set:disabled { opacity: 0.4; cursor: default; }
.btn-resume-auto { color: var(--purple); border-color: rgb(var(--sx-accent-alt) / .4); }
.zone-setpoint-error {
  color: var(--red);
  font-size: 11.5px;
  margin-bottom: 10px;
}
.mock-badge {
  display: inline-block;
  font-size: 10px;
  padding: 2px 7px;
  border-radius: 999px;
  background: rgb(var(--sx-orange) / .15);
  color: var(--amber);
  margin-left: 6px;
  vertical-align: middle;
}
/* PREHEATING EXECUTION / SETPOINT CONTROL V1 (03.09.2026) - minimal,
   additiv styling for AUTOMATISK STYRING-seksjonen i rom-kortet (se
   app.js sin preheatExecutionHtml). Gjenbruker .mock-badge sin
   grunnform, kun fargevariantene under er nye. */
.mock-badge.mode-live { background: rgb(var(--sx-danger) / .18); color: var(--red); }
.mock-badge.mode-shadow { background: rgb(var(--sx-logo) / .12); color: var(--cyan); }
.mock-badge.mode-off { background: rgb(var(--sx-text-2) / .16); color: var(--text-muted); }
.room-card-preheat-execution {
  margin-bottom: 10px;
  padding: 8px 10px;
  border-radius: 8px;
  background: rgb(var(--sx-white) / .03);
  font-size: 12px;
}
.room-card-preheat-execution-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
.room-card-preheat-execution-title { font-weight: 600; color: var(--text-muted); font-size: 10.5px; letter-spacing: 0.03em; }
.room-card-preheat-execution-body { color: var(--text-muted); line-height: 1.6; }
.room-card-preheat-execution-actions { display: flex; gap: 6px; margin-top: 6px; }

/* ---------- Modals ---------- */
.modal-backdrop {
  position: fixed;
  inset: 0;
  background: rgb(var(--sx-bg-deep) / .72);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 100;
  padding: 20px;
}
.modal-backdrop[hidden] {
  display: none;
}
.modal {
  background: var(--card-bg);
  border: 1px solid var(--border-glow);
  border-radius: var(--radius);
  padding: 26px;
  width: 100%;
  max-width: 460px;
  box-shadow: 0 20px 60px rgb(var(--sx-black) / .6);
}
.modal-settings { max-width: 560px; max-height: 86vh; overflow-y: auto; }
.modal-log { max-width: 640px; max-height: 86vh; overflow-y: auto; }
.log-list { display: flex; flex-direction: column; gap: 8px; margin-top: 10px; }
.log-row {
  display: flex;
  flex-direction: column;
  gap: 3px;
  padding: 10px 12px;
  background: rgb(var(--sx-white) / .03);
  border: 1px solid var(--border);
  border-radius: 10px;
}
.log-row-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 11px; }
.log-source {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 999px;
  font-weight: 700;
  letter-spacing: 0.5px;
}
.log-source-user { background: rgb(var(--sx-green) / .15); color: var(--green); }
.log-source-agent { background: rgb(var(--sx-logo) / .15); color: var(--cyan); }
.log-zone { color: var(--text-muted); font-weight: 600; }
.log-time { color: var(--text-dim); margin-left: auto; }
.log-detail { font-size: 12.5px; color: var(--text-muted); line-height: 1.5; }
.activity-card { max-width: 920px; }
.activity-filter-chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 18px 0 14px; }
.activity-filter-chips .chip-btn.active { background: rgb(var(--sx-logo) / .12); border-color: rgb(var(--sx-logo) / .4); color: var(--cyan); }
.activity-timeline { gap: 10px; }
.activity-event { position: relative; padding: 14px 16px 14px 20px; }
.activity-event::before { content: ''; position: absolute; left: 8px; top: 19px; width: 4px; height: 4px; border-radius: 50%; background: var(--cyan); box-shadow: 0 0 8px rgb(var(--sx-logo) / .7); }
.activity-event .log-time { margin-left: 0; }
.activity-event .log-zone { margin-right: auto; }
.activity-event-title { color: var(--text); font-size: 13px; font-weight: 700; }
.activity-reason { padding-top: 5px; color: var(--text-dim); font-size: 11.5px; }
.modal-title { font-size: 16px; font-weight: 700; margin-bottom: 12px; }
.modal p { color: var(--text-muted); font-size: 13.5px; line-height: 1.55; }
.modal-note { color: var(--amber) !important; }
.modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; }

.btn {
  padding: 9px 18px;
  border-radius: 10px;
  border: 1px solid var(--border);
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
}
.btn-ghost { background: transparent; color: var(--text-muted); }
.btn-ghost:hover { color: var(--text); border-color: var(--border-glow); }
.btn-primary { background: var(--cyan); color: rgb(var(--sx-bg-deep)); border-color: var(--cyan); }
.btn-primary:hover { filter: brightness(1.08); }
.btn-danger { background: var(--amber); color: rgb(var(--sx-bg-deep)); border-color: var(--amber); }
/* Destruktiv "ghost"-knapp - erstatter to identiske inline-stiler som
   la i index.html (Nullstill installasjon / Fjern varmekilde). */
.btn-ghost-danger { border-color: rgb(var(--sx-danger) / .4); color: var(--red); }
.btn-ghost-danger:hover { border-color: var(--red); background: rgb(var(--sx-danger) / .12); }
.btn-danger:hover { filter: brightness(1.08); }

.settings-section {
  border-top: 1px solid var(--border);
  padding-top: 16px;
  margin-top: 16px;
}
.settings-section:first-of-type { border-top: none; padding-top: 0; margin-top: 0; }
.field { display: flex; align-items: center; justify-content: space-between; gap: 14px; margin-bottom: 12px; font-size: 13px; color: var(--text-muted); }
.field span:first-child { flex: 1; }
.field input[type="number"], .field select {
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  color: var(--text);
  border-radius: 8px;
  padding: 6px 10px;
  width: 120px;
  font-size: 13px;
}
.field input[type="text"], .field input[type="password"], .field input[type="email"] {
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  color: var(--text);
  border-radius: 8px;
  padding: 7px 10px;
  width: 100%;
  max-width: 320px;
  font-size: 13px;
}
.field input[type="checkbox"] { width: 18px; height: 18px; accent-color: var(--cyan); }

.dry-live-inline { display: inline-flex; gap: 8px; }
.chip-btn {
  padding: 6px 12px;
  border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--bg-panel-2);
  color: var(--text-muted);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.5px;
  cursor: pointer;
}
.chip-btn[data-active="true"] { background: rgb(var(--sx-green) / .15); color: var(--green); border-color: rgb(var(--sx-green) / .4); }
#setLiveBtn[data-active="true"] { background: rgb(var(--sx-orange) / .15); color: var(--amber); border-color: rgb(var(--sx-orange) / .4); }

.settings-zone-block { background: var(--bg-panel-2); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; margin-bottom: 10px; }
.settings-zone-block .zone-name { margin-bottom: 8px; font-size: 13px; }

.settings-note { font-size: 11.5px; color: var(--text-dim); margin-top: 14px; }
.settings-section-title { font-size: 13px; font-weight: 700; color: var(--text); margin-bottom: 4px; }
.settings-heating-note { margin: 0 0 12px; }
.settings-heating-sources { display: grid; gap: 8px; }
.settings-heating-source-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 10px 12px;
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: 9px;
}
.settings-heating-source-main,
.settings-heating-source-meta { display: flex; flex-direction: column; gap: 3px; }
.settings-heating-source-main strong,
.settings-heating-source-meta strong { color: var(--text); font-size: 12.5px; }
.settings-heating-source-main span,
.settings-heating-source-meta span { color: var(--text-dim); font-size: 11px; }
.settings-heating-source-meta { text-align: right; }
.settings-heating-empty { margin: 0; color: var(--text-dim); font-size: 12px; }
.settings-heating-total {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  margin-top: 10px;
  padding-top: 12px;
  border-top: 1px solid var(--border);
  color: var(--text-muted);
  font-size: 13px;
}
.settings-heating-total strong { color: var(--cyan-soft); }
@media (max-width: 560px) {
  .settings-heating-source-row { align-items: flex-start; }
  .settings-heating-source-meta { max-width: 48%; }
}

/* ---------- Footer / kildehenvisning ---------- */
.page-footer {
  margin-top: 26px;
  padding-top: 18px;
  border-top: 1px solid var(--border);
  display: flex;
  justify-content: center;
}
.page-footer p { margin: 0; }
.page-footer img { display: block; border-radius: 6px; opacity: 0.9; }
.page-footer img:hover { opacity: 1; }
.settings-error {
  margin-top: 12px;
  padding: 10px 12px;
  border-radius: 8px;
  background: rgb(var(--sx-danger) / .12);
  border: 1px solid rgb(var(--sx-danger) / .4);
  color: var(--red);
  font-size: 12.5px;
}

/* ---------- First-run setup-veiviser ---------- */
.wizard {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}
.wizard-card {
  background: var(--card-bg);
  border: 1px solid var(--border-glow);
  border-radius: var(--radius);
  padding: 32px;
  width: 100%;
  max-width: 620px;
  box-shadow: 0 20px 60px rgb(var(--sx-black) / .6);
}
.wizard-title { font-size: 20px; font-weight: 700; margin-bottom: 8px; }
.wizard-intro { color: var(--text-muted); font-size: 13.5px; line-height: 1.55; margin-bottom: 22px; }
.wizard-step { margin-bottom: 20px; }
.wizard-actions { display: flex; align-items: center; gap: 14px; margin-top: 6px; }
.wizard-actions.wizard-final { margin-top: 24px; }
.wizard-status { font-size: 13px; font-weight: 700; color: var(--green); }
.wizard-error {
  margin-top: 10px;
  padding: 10px 12px;
  border-radius: 8px;
  background: rgb(var(--sx-danger) / .12);
  border: 1px solid rgb(var(--sx-danger) / .4);
  color: var(--red);
  font-size: 12.5px;
}
.wizard-substep-title { font-size: 13px; font-weight: 700; color: var(--text-muted); margin-bottom: 10px; }
.wizard-zones-list { display: flex; flex-direction: column; gap: 8px; }
.wizard-zone-row {
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 10px 12px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px;
}
.wizard-zone-check-label { display: flex; align-items: center; gap: 8px; font-size: 13px; }
.wizard-zone-check-label input[type="checkbox"] { width: 18px; height: 18px; accent-color: var(--cyan); }
.wizard-zone-targets { display: flex; gap: 10px; font-size: 11px; color: var(--text-dim); }
.wizard-zone-targets label { display: flex; align-items: center; gap: 4px; }
.wizard-zone-targets input {
  width: 56px;
  background: var(--bg-panel);
  border: 1px solid var(--border);
  color: var(--text);
  border-radius: 6px;
  padding: 4px 6px;
  font-size: 12px;
}
.wizard-empty { color: var(--text-dim); font-size: 13px; }
.wizard-note { margin-top: 20px; font-size: 11.5px; color: var(--text-dim); }

/* ---------- Rom-admin (fase 3, neste generasjons varmestyring) ---------- */
.modal-rooms { max-width: 640px; max-height: 88vh; overflow-y: auto; }
.rooms-warning {
  background: rgb(var(--sx-orange) / .12);
  border: 1px solid rgb(var(--sx-orange) / .4);
  color: var(--amber);
  padding: 10px 12px;
  border-radius: 10px;
  font-size: 12.5px;
  line-height: 1.5;
  margin-bottom: 18px;
}
.rooms-section {
  border-top: 1px solid var(--border);
  padding-top: 16px;
  margin-top: 16px;
}
.rooms-section:first-of-type { border-top: none; padding-top: 0; margin-top: 0; }
.rooms-section-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 12px;
}
.rooms-section-title {
  font-size: 12px;
  letter-spacing: 2px;
  color: var(--text-muted);
  font-weight: 600;
}
.btn-small { padding: 6px 12px; font-size: 11.5px; }
.rooms-sync-error {
  margin-bottom: 12px;
  padding: 10px 12px;
  border-radius: 8px;
  background: rgb(var(--sx-danger) / .12);
  border: 1px solid rgb(var(--sx-danger) / .4);
  color: var(--red);
  font-size: 12.5px;
}

/* Enhetsliste (GUI-redesign steg 6 - filter-chips pa ENHETER-siden) */
.device-filter-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 14px; }
.devices-list { display: flex; flex-direction: column; gap: 8px; }
.device-row {
  display: grid;
  grid-template-columns: minmax(260px, 1fr) minmax(230px, 300px) 130px 110px;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  background: rgb(var(--sx-white) / .03);
  border: 1px solid var(--border);
  border-radius: 10px;
}
.device-info { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.device-name { font-size: 13px; font-weight: 600; color: var(--text); }
.device-caps { display: flex; flex-wrap: wrap; gap: 6px; }
.cap-badge {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.3px;
  background: rgb(var(--sx-logo) / .12);
  color: var(--cyan);
}
.device-assignment { font-size: 11px; color: var(--text-dim); white-space: nowrap; }
.device-assignment.assigned { color: var(--green); }
.device-online-status { display: flex; justify-content: flex-start; align-items: center; gap: 6px; flex-wrap: wrap; }
/* Hotellsimulering i Enheter (02.09.2026) - simulerte rader (se
   renderSimulatedDeviceRow i app.js). Egen, litt dempet bakgrunn/kant sa
   de er lette a skille fra ekte Solvotix-enheter pa avstand, i tillegg
   til selve SIMULERT-badgen (gjenbruker .simulation-badge). */
.device-row-simulated { background: rgb(var(--sx-logo) / .04); border-style: dashed; }
.device-sim-value { font-size: 12px; font-weight: 700; color: var(--text); }
.device-sim-thermal { font-size: 10.5px; color: var(--text-dim); margin-top: 2px; }
.device-delete-btn {
  justify-self: end;
  min-width: 104px;
  background: rgb(var(--sx-surface));
  border-color: rgb(var(--sx-logo) / .55);
  color: var(--cyan);
}
.device-delete-btn:hover {
  background: rgb(var(--sx-logo) / .1);
  border-color: var(--cyan);
  color: var(--cyan-soft);
}

@media (max-width: 720px) {
  .device-row { grid-template-columns: minmax(0, 1fr) auto; align-items: start; }
  .device-info { grid-column: 1 / -1; }
  .device-assignment { grid-column: 1; white-space: normal; }
  .device-online-status { grid-column: 2; }
  .device-delete-btn { grid-column: 2; }
}

/* Romliste */
.rooms-list { display: flex; flex-direction: column; gap: 12px; }
.room-card {
  position: relative;
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 16px;
}
.room-card-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 10px;
  flex-wrap: wrap;
}
.room-card-name { font-weight: 700; font-size: 14px; letter-spacing: 0.5px; }
.room-card-mode {
  display: inline-block;
  padding: 3px 10px;
  border-radius: 999px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.5px;
}
.room-card-mode.mode-thermostat { background: rgb(var(--sx-green) / .15); color: var(--green); }
.room-card-mode.mode-relay_hysteresis { background: rgb(var(--sx-accent-alt) / .15); color: var(--purple); }

/* Hotel-only Settings: Room-admin er fortsatt komplett, men starter
   kompakt slik at Location og Solvotix-integrasjoner aldri havner under
   en lang liste med hotellrom. House får ingen av disse klassene. */
.hotel-room-admin-toggle {
  display: block;
  margin: -38px 0 16px auto;
}
.hotel-room-admin.hotel-room-admin-collapsed .rooms-section,
.hotel-room-admin.hotel-room-admin-collapsed > .modal-actions {
  display: none;
}
.room-origin-badge {
  border: 1px solid var(--border);
  border-radius: 999px;
  color: var(--text-dim);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .05em;
  padding: 3px 8px;
  text-transform: uppercase;
}
.room-origin-synced {
  border-color: rgb(var(--sx-logo) / .28);
  color: var(--cyan);
}
.room-card-inactive { color: var(--text-dim); font-size: 10.5px; margin-left: 4px; }
.room-card-buttons { display: flex; gap: 6px; margin-left: auto; }
.room-card-meta { font-size: 12px; color: var(--text-muted); line-height: 1.6; margin-bottom: 10px; }
.room-card-meta strong { color: var(--text); font-weight: 600; }
.room-card-control-state { margin-bottom: 10px; }
.room-card-assign { display: flex; flex-direction: column; gap: 8px; }
.room-card-assign-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 12px; }
.room-card-assign-label { color: var(--text-dim); flex-basis: 100%; font-size: 11px; }
.room-card-assign select {
  background: var(--bg-panel);
  border: 1px solid var(--border);
  color: var(--text);
  border-radius: 8px;
  padding: 6px 8px;
  font-size: 12px;
  flex: 1;
  min-width: 140px;
}
.room-assigned-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  border-radius: 999px;
  background: rgb(var(--sx-white) / .05);
  border: 1px solid var(--border);
  font-size: 11.5px;
  color: var(--text);
}
.room-assigned-chip button {
  background: none;
  border: none;
  color: var(--text-dim);
  cursor: pointer;
  font-size: 13px;
  line-height: 1;
  padding: 0;
}
.room-assigned-chip button:hover { color: var(--red); }
/* Fase "Stue/gang som én termisk sone" (28.08.2026) - "Sett som primær"
   er en VALG-handling, ikke en fjern-handling - skal ikke se ut som
   "slett" (rod hover), se .room-assigned-chip button:hover over. */
.room-assigned-chip .set-primary-sensor-btn {
  text-decoration: underline;
  font-size: 10.5px;
  color: var(--text-dim);
}
.room-assigned-chip .set-primary-sensor-btn:hover { color: var(--blue); }
.room-card-error {
  color: var(--red);
  font-size: 11.5px;
  margin-top: 8px;
}

/* Nytt-rom skjema */
.room-form {
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 16px;
  margin-bottom: 14px;
}
.room-form-title { font-size: 13px; font-weight: 700; color: var(--text-muted); margin-bottom: 12px; }
.room-form-error {
  color: var(--red);
  font-size: 12px;
  margin-top: 10px;
}

/* Fase 2B (27.08.2026, "bygnings-/lokasjonsmodell") - adressesok-
   forslagsliste (Kartverket-treff) i Lokasjon-skjemaet. */
.loc-search-results {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin: -6px 0 14px 0;
  max-height: 220px;
  overflow-y: auto;
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 6px;
  background: var(--bg-panel);
}
.loc-search-result-btn {
  text-align: left;
  background: transparent;
  border: none;
  color: var(--text);
  font-size: 12.5px;
  padding: 8px 10px;
  border-radius: 8px;
  cursor: pointer;
}
.loc-search-result-btn:hover { background: var(--bg-panel-2); }
.loc-map-link {
  display: inline-block;
  font-size: 12px;
  color: var(--blue);
  margin-top: -6px;
  margin-bottom: 14px;
  text-decoration: none;
}
.loc-map-link:hover { text-decoration: underline; }
.location-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(250px, 320px);
  gap: 22px;
  align-items: stretch;
  cursor: default;
}
.location-card-info { display: flex; min-width: 0; flex-direction: column; }
.location-card-heading { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.location-card-address { margin-top: 12px; color: var(--text-muted); font-size: 13px; line-height: 1.5; }
.location-building-type { width: fit-content; margin-top: 10px; padding: 4px 9px; border-radius: var(--radius-pill); background: rgb(var(--sx-logo) / .1); color: var(--cyan); font-size: 10.5px; font-weight: 700; }
.location-card-actions { display: flex; gap: 8px; margin-top: auto; padding-top: 18px; }
.location-map-wrap { overflow: hidden; min-height: 180px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--bg); }
.location-map { display: block; width: 100%; height: 100%; min-height: 180px; border: 0; filter: invert(92%) hue-rotate(180deg) brightness(.72) contrast(1.08) saturate(.7); }
.location-map-fallback { display: flex; min-height: 180px; align-items: center; justify-content: center; border: 1px dashed var(--border); border-radius: var(--radius-md); background: rgb(var(--sx-text-2) / .04); color: var(--text-dim); font-size: 12px; }
@media (max-width: 720px) {
  .location-card { grid-template-columns: 1fr; }
  .location-map-wrap,
  .location-map,
  .location-map-fallback { min-height: 190px; }
}

/* ---------- Rom (forhandsvisning) pa hovedskjermen - gjenbruker
   .zone-card/.zone-name/.zone-readings/.zone-meta bevisst, sa kortet
   ser konsistent ut med VARMESONER over. Eneste nye her er
   status-setup-fargen pa badgen, sa den ALDRI kan forveksles med en
   ekte PREHEAT/REDUCE/HOLD-status. ---------- */
.rooms-preview-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 16px;
}
.rooms-preview-note { font-size: 12px; color: var(--text-dim); margin-top: -4px; margin-bottom: 14px; }
.zone-status-badge.status-setup { background: rgb(var(--sx-accent-alt) / .15); color: var(--purple); }

/* ---------- Rom-redesign (26.08.2026) - romkortenes ekte statusState
   fra /api/dashboard, se ACTION_CLASS-mønsteret over. "heating" og
   "heating_source_offline"/"sensor_offline" er de eneste HELT NYE
   fargene her - resten gjenbrukes fra status-normal/status-manual/
   status-setup. ---------- */
.zone-status-badge.status-heating { background: rgb(var(--sx-orange) / .15); color: var(--amber); }
.zone-status-badge.status-sensor-offline,
.zone-status-badge.status-heating-source-offline { background: rgb(var(--sx-danger) / .15); color: var(--red); }
.zone-status-badge.status-configuration-required { background: rgb(var(--sx-accent-alt) / .15); color: var(--purple); }

/* Selve romkortet kan na apnes (klikk hvor som helst utenom knapper/felt
   inni det) for a se Rom-siden (Climate/Sensors/Heating sources/Energy/
   Learning/Settings). Selve PA/AV- og setpoint-knappene er upavirket -
   se openRoomDetailIfNotInteractive i app.js. */
.zone-card.zone-card-openable { cursor: pointer; }
.zone-card.zone-card-openable:hover { border-color: var(--border-glow); }
.zone-card-summary-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  font-size: 12px;
  color: var(--text-muted);
  padding-top: 10px;
  margin-top: 4px;
  border-top: 1px solid var(--border);
  margin-bottom: 10px;
}
.zone-card-open-hint { font-size: 11px; color: var(--text-dim); text-align: right; margin-top: -4px; margin-bottom: 10px; }

/* Forenklet kort for rom som mangler sensor/varmekilde/mål-temperatur
   ennå (statusState 'configuration_required') - vises i SAMME rutenett
   som ekte rom/varmesone-kort (#zonesGrid), men med stiplet kant og
   ingen knapper, sa det aldri kan forveksles med et ekte, styrbart kort.
   Klikk apner likevel Rom-siden, slik at oppsettet kan fullfores der. */
.zone-card.zone-card-config-required { border-style: dashed; opacity: 0.88; }

/* ---------- Romside (Room Detail-modalen) ---------- */
.modal-room-detail { max-width: 820px; max-height: 88vh; overflow-y: auto; }
.room-detail-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 18px;
}
.room-detail-title { font-size: 20px; font-weight: 700; margin-bottom: 6px; }

/* Faner inne på Rom-siden (GUI-redesign steg 3, 28.08.2026) - Oversikt/
   Sensorer/Varmekilder/Læring/Innstillinger. Gjenbruker samme visuelle
   sprak (pille-form, cyan aktiv-farge) som hovednavigasjonens
   .nav-btn/.active fra steg 2, men er en egen, mindre fanerad inne i
   Rom-modalen - horisontal og skrollbar pa smale skjermer i stedet for
   fast bunn-navigasjon (den er reservert for hovednavigasjonen). Ren
   visning/navigering - showRoomDetailTab() i app.js styrer kun hvilket
   .room-detail-tab-panel som er synlig. */
.room-detail-tabs {
  display: flex;
  gap: var(--space-2);
  overflow-x: auto;
  padding-bottom: var(--space-2);
  margin-bottom: var(--space-4);
  border-bottom: 1px solid var(--border);
}
.room-detail-tab-btn {
  flex-shrink: 0;
  padding: var(--space-2) var(--space-4);
  border-radius: var(--radius-pill);
  border: 1px solid transparent;
  background: transparent;
  color: var(--text-muted);
  font-size: var(--font-sm);
  font-weight: 700;
  letter-spacing: 0.3px;
  cursor: pointer;
}
.room-detail-tab-btn:hover { color: var(--text); }
.room-detail-tab-btn.active {
  background: rgb(var(--sx-logo) / .12);
  color: var(--cyan);
  border-color: rgb(var(--sx-logo) / .35);
}

/* Stor aktuell temperatur øverst i Oversikt-fanen (brukerens spec:
   "stor aktuell temperatur"). Gjenbruker samme størrelse som Hjem-
   sidens STRØMPRIS NÅ-tall (--font-2xl) for et konsistent, "premium"
   uttrykk pa tvers av sidene - se design-system-kravet i planen. */
.room-detail-temp-hero {
  display: flex;
  align-items: baseline;
  gap: var(--space-3);
  margin-bottom: var(--space-2);
  flex-wrap: wrap;
}
.room-detail-temp-now { font-size: var(--font-2xl); font-weight: 700; color: var(--text); line-height: 1; }
.room-detail-temp-target { font-size: var(--font-sm); color: var(--text-muted); }
.room-detail-agent-reason { font-size: 12.5px; color: var(--text-muted); line-height: 1.5; margin-bottom: 14px; }
.room-detail-section {
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 16px;
  margin-bottom: 14px;
}
.room-detail-section-title {
  font-size: 11.5px;
  letter-spacing: 1.5px;
  color: var(--text-muted);
  font-weight: 700;
  margin-bottom: 12px;
}
.room-detail-section-title-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
.room-detail-section-title-row .room-detail-section-title { margin-bottom: 0; }
.room-detail-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
  gap: 14px 18px;
}
.room-detail-grid .label { display: block; font-size: 11px; color: var(--text-dim); }
.room-detail-grid .value { display: block; font-size: 17px; font-weight: 600; margin-top: 3px; }
.thermal-learning-intro {
  margin: 0 0 18px;
  max-width: 680px;
  color: var(--text-muted);
  font-size: 12.5px;
  line-height: 1.55;
}
.thermal-learning-status-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 7px;
  color: var(--text-dim);
  font-size: 11.5px;
}
.thermal-learning-status { font-weight: 700; }
.thermal-learning-status.status-empty { color: var(--text-muted); }
.thermal-learning-status.status-learning { color: var(--cyan); }
.thermal-learning-status.status-learned { color: var(--green); }
.thermal-learning-progress {
  height: 7px;
  margin-bottom: 20px;
  overflow: hidden;
  border-radius: var(--radius-pill);
  background: var(--border);
}
.thermal-learning-progress-fill {
  height: 100%;
  border-radius: inherit;
  background: linear-gradient(90deg, var(--cyan), var(--green));
  transition: width 0.2s ease;
}
.thermal-learning-grid {
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  padding-top: 16px;
  border-top: 1px solid var(--border);
}
.thermal-learning-grid .value { font-size: 14px; }
.room-detail-list { display: flex; flex-direction: column; gap: 8px; }
.room-detail-sensor-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 10px 12px;
  background: rgb(var(--sx-white) / .03);
  border: 1px solid var(--border);
  border-radius: 10px;
  font-size: 13px;
  flex-wrap: wrap;
}
.room-detail-empty { font-size: 12.5px; color: var(--text-dim); }
.room-detail-error { color: var(--red); font-size: 12px; margin-top: 8px; }
.room-detail-sensor-row-right { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* "Legg til sensor"-modal (28.08.2026) - kandidatlisten er en enkel,
   radio-basert valgliste (ikke en <select>) fordi brukeren skal se
   navn + online-status + temperatur for HVER kandidat samtidig, ikke
   bare navnet. Samme visuelle sprak som .room-detail-sensor-row over. */
.modal-sensor-picker { max-width: 480px; }
.room-detail-sensor-picker-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; max-height: 40vh; overflow-y: auto; }
.room-detail-sensor-picker-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  background: rgb(var(--sx-white) / .03);
  border: 1px solid var(--border);
  border-radius: 10px;
  font-size: 13px;
  cursor: pointer;
}
.room-detail-sensor-picker-row:hover { border-color: var(--border-glow); }
.room-detail-sensor-picker-row:has(input:checked) { border-color: var(--cyan); background: rgb(var(--sx-logo) / .07); }
.room-detail-sensor-picker-row input[type="radio"] { accent-color: var(--cyan); flex-shrink: 0; }
.room-detail-sensor-picker-name { flex: 1; font-weight: 600; }
.room-detail-sensor-picker-temp { color: var(--text-muted); font-size: 12.5px; }

/* ---------- Varmekilde-kort inne pa Romsiden ---------- */
.heating-source-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 12px;
}
.heating-source-card {
  background: var(--bg-panel);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 13px;
  cursor: pointer;
}
.heating-source-card:hover { border-color: var(--border-glow); }
.heating-source-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; }
.heating-source-card-name { font-size: 13px; font-weight: 700; }
.heating-source-tag {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.3px;
  flex-shrink: 0;
}
.heating-source-tag.tag-floor { background: rgb(var(--sx-green) / .15); color: var(--green); }
.heating-source-tag.tag-panel { background: rgb(var(--sx-accent-alt) / .15); color: var(--purple); }
.heating-source-tag.tag-oppgitt { background: rgb(var(--sx-logo) / .15); color: var(--cyan-soft); }
.heating-source-tag.tag-estimert { background: rgb(var(--sx-orange) / .15); color: var(--amber); }
/* Fase R3 (27.08.2026, "flere varmekilder per rom") - skiller en
   tilleggs-/supplement-varmekilde (panelovn i et TERMOSTAT-rom, se
   supplementHeating.ts) visuelt fra bade den primære varmekabelen
   (tag-floor) og en panelovn i et rent relé-rom (tag-panel). */
.heating-source-tag.tag-supplement { background: rgb(var(--sx-action) / .15); color: var(--blue); }
.heating-source-card-meta { font-size: 11.5px; color: var(--text-dim); margin: 8px 0; }
.heating-source-card-bottom {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-top: 9px;
  border-top: 1px solid var(--border);
  font-size: 11px;
}
.heating-source-card-kwh { margin-top: 8px; font-size: 11.5px; color: var(--text-muted); }
.heating-source-offline-note { color: var(--red); }

/* ---------- Varmekilde-konfigurasjon (modal-heating-source) ---------- */
.modal-heating-source { max-width: 480px; }

/* ---------- Energihistorikk pa Romsiden (Fase 8-9, 26.08.2026) ---------- */
.room-detail-history-divider {
  font-size: 10.5px;
  letter-spacing: 1.5px;
  color: var(--text-dim);
  font-weight: 700;
  margin: 16px 0 10px;
  padding-top: 14px;
  border-top: 1px solid var(--border);
}
#rdEnergyHistoryChart { width: 100%; height: 110px; margin-top: 10px; }
.room-detail-history-caption { font-size: 11px; color: var(--text-dim); margin-top: 6px; }

/* =======================================================================
   GUI-redesign steg 4 (28.08.2026) - HJEM bygget om til et moderne,
   kundevendt dashboard etter referansebildet brukeren la ved. Layout/
   proporsjoner/spacing/typografi følger referansen; ALL DATA kommer fra
   eksisterende API-er (ingen ny backend). Se rapporten i samtalen for
   nøyaktig hvilke elementer som er tilpasset/utelatt pga manglende ekte
   data. Gjenbruker eksisterende design-tokens (--bg/--bg-panel/--cyan
   osv. øverst i filen) - ingen ny fargepalett.
   ======================================================================= */

/* ---------- Ikoner (enkle, konsistente outline-ikoner, Lucide-stil) ----
   Tegnet som inline SVG i app.js (se ICONS/renderIcon) - ingen ekstern
   ikonpakke/CDN, sa appen fungerer helt uten internett. stroke="currentColor"
   gjør at .nav-icon sin "color" styrer fargen (hvit/grå normalt, teal for
   aktiv/valgt status - se .main-nav .nav-btn.active og .home-meta-item). */
.nav-icon, .icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  flex: none;
  color: var(--text-muted);
}
.nav-icon svg, .icon svg { width: 100%; height: 100%; display: block; }
.main-nav .nav-btn.active .nav-icon { color: var(--cyan); }
.icon-sm { width: 15px; height: 15px; }
.icon-lg { width: 28px; height: 28px; }

/* ---------- Hjem: header ---------- */
.home-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 14px;
  margin-bottom: 20px;
}
.home-header-title h1 {
  font-size: var(--font-xl);
  font-weight: 700;
  margin: 0;
  letter-spacing: 0.3px;
}
.home-location, .home-location-switcher {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-top: 4px;
  color: var(--text-muted);
  font-size: 13px;
}
.home-location .nav-icon, .home-location-switcher .nav-icon { color: var(--cyan); }
.home-location-select {
  background: transparent;
  border: none;
  color: var(--text-muted);
  font-size: 13px;
  font-family: inherit;
  padding: 2px 4px;
  border-radius: var(--radius-sm, 6px);
  cursor: pointer;
}
.home-location-select:hover, .home-location-select:focus {
  background: var(--bg-panel);
  color: var(--text);
  outline: none;
}
.home-location-select option { background: var(--bg-panel); color: var(--text); }
.home-header-meta { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
.home-meta-item { display: flex; align-items: center; gap: 8px; color: var(--text-muted); }
.home-meta-item .nav-icon { color: var(--text-dim); }
.home-meta-value { display: block; font-size: 14px; font-weight: 700; color: var(--text); line-height: 1.25; }
.home-meta-label { display: block; font-size: 10.5px; color: var(--text-dim); }

/* ---------- Hjem: strømpris-strip (kompakt, referansebilde) ---------- */
.price-strip {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 20px;
  background: linear-gradient(180deg, var(--bg-panel) 0%, var(--bg-panel-2) 100%);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 18px 22px;
  margin-bottom: 22px;
}
.price-strip-main { flex: 1 1 220px; min-width: 200px; }
.price-strip-label { font-size: 11px; letter-spacing: 1.5px; color: var(--text-dim); font-weight: 700; margin-bottom: 8px; }
.price-strip-value-row { display: flex; align-items: baseline; gap: 12px; }
.price-strip-value { font-size: 32px; font-weight: 700; color: var(--text); line-height: 1; }
.price-sparkline { width: 100%; max-width: 260px; height: 40px; display: block; margin-top: 8px; }
.price-strip-periods { display: flex; gap: 28px; flex-wrap: wrap; }
.price-strip-period { display: flex; align-items: center; gap: 8px; }
.price-strip-period .nav-icon { color: var(--text-dim); }
@media (max-width: 720px) {
  .price-strip { flex-direction: column; align-items: stretch; }
  .price-strip-periods { justify-content: space-between; gap: 16px; }
}

/* ---------- Hjem: kompakt profilmetadata for valgt Location ---------- */
.location-profile { margin-bottom: 18px; padding: 12px 0 0; }
.location-profile-facts { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; color: var(--text-muted); font-size: 12px; }
.location-profile-facts > span:not(:first-child)::before { content: '·'; margin-right: 12px; color: var(--text-dim); }
.building-type-badge {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 5px 10px;
  border-radius: var(--radius-pill);
  background: rgb(var(--sx-logo) / .12);
  color: var(--cyan);
}
/* HOTELLPROFIL FASE 2 (31.08.2026) - "PMS/booking-status" (krav 9): grønn
   nar bookingdata faktisk er synkronisert, gul kun nar det aldri er
   gjort - se renderHomeLocationProfile() i app.js. */
.hotel-pms-state { color: var(--green); font-weight: 600; }
.hotel-pms-state.is-disconnected { color: var(--amber); }
.simulation-badge { display: inline-flex; align-items: center; width: fit-content; padding: 3px 8px; border: 1px solid rgb(var(--sx-logo) / .32); border-radius: var(--radius-pill); background: rgb(var(--sx-logo) / .1); color: var(--cyan); font-size: 9.5px; font-weight: 750; letter-spacing: .7px; }
/* HOTELLPROFIL FASE 1 (30.08.2026) - "Synkroniser rom fra Solvotix"-raden, kun synlig for buildingType='hotel' (se app.js renderHomeLocationProfile). */
.location-profile-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 10px; }
@media (max-width: 720px) {
  .location-profile { padding-top: 10px; }
}

/* ---------- Hjem: seksjonstittel (ROM/HURTIGHANDLINGER) ---------- */
.home-section { margin-bottom: 22px; }
.home-section-title { font-size: 12px; letter-spacing: 2px; color: var(--text-muted); font-weight: 600; margin-bottom: 14px; }

/* ---------- Hjem: rom-kort (kompakte, klikkbare - erstatter .zone-card
   PÅ HJEM. .zone-card selv beholdes uendret - brukes fortsatt inne i
   Room Detail sine egne lister et par steder). ---------- */
.rooms-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 16px;
}
.room-card {
  background: linear-gradient(180deg, var(--bg-panel) 0%, var(--bg-panel-2) 100%);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 20px;
  cursor: pointer;
  transition: border-color 0.15s ease;
}
.room-card:hover { border-color: var(--border-glow); }
.room-card-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; margin-bottom: 14px; }
.room-card-name { font-size: 13.5px; font-weight: 700; letter-spacing: 0.4px; color: var(--text); }
.room-card-mode-badge {
  flex: none;
  padding: 3px 9px;
  border-radius: var(--radius-pill);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.6px;
  background: rgb(var(--sx-text-2) / .12);
  color: var(--text-muted);
}
.room-card-mode-badge.mode-live { background: rgb(var(--sx-green) / .15); color: var(--green); }
.room-card-mode-badge.mode-shadow { background: rgb(var(--sx-logo) / .12); color: var(--cyan); }
.room-card-temp-now { font-size: var(--font-2xl); font-weight: 700; color: var(--text); line-height: 1; }
.room-card-temp-target { display: block; margin-top: 6px; font-size: 13px; color: var(--text-muted); }
.room-card-status-row { display: flex; align-items: center; gap: 7px; margin: 14px 0 6px; font-size: 12.5px; font-weight: 600; }
.room-card-status-row .icon { width: 16px; height: 16px; }
.room-card-status-row.status-heating, .room-card-status-row.status-preheat { color: var(--amber); }
.room-card-status-row.status-reduce { color: var(--blue); }
.room-card-status-row.status-normal { color: var(--green); }
.room-card-status-row.status-manual { color: var(--purple); }
.room-card-status-row.status-warning { color: var(--red); }
.room-card-status-row.status-muted { color: var(--text-dim); }
.room-card-meta-row {
  display: flex;
  align-items: center;
  gap: 14px;
  flex-wrap: wrap;
  font-size: 11.5px;
  color: var(--text-dim);
  padding-top: 10px;
  border-top: 1px solid var(--border);
}
.room-card-meta-row span { display: inline-flex; align-items: center; gap: 5px; }
.room-card-meta-row .icon { width: 14px; height: 14px; }
.room-card-meta-row .meta-warning { color: var(--red); }
.room-card-learning-bar-wrap { margin-top: 12px; }
.room-card-learning-label { font-size: 10.5px; color: var(--text-dim); margin-bottom: 5px; display: flex; justify-content: space-between; }
.room-card-learning-bar { height: 5px; border-radius: 999px; background: var(--border); overflow: hidden; }
.room-card-learning-bar-fill { height: 100%; background: var(--cyan); border-radius: 999px; }
.room-card-thermostat-product {
  position: absolute;
  z-index: 1;
  top: 58px;
  right: 18px;
  width: 64px;
  height: auto;
  object-fit: contain;
  object-position: center;
  pointer-events: none;
}
.room-card-panel-heater-product {
  position: absolute;
  z-index: 1;
  top: 62px;
  right: 15px;
  width: 94px;
  height: auto;
  object-fit: contain;
  object-position: center;
  pointer-events: none;
}
.room-card.has-heating-product .room-card-temp-now,
.room-card.has-heating-product .room-card-temp-target,
.room-card.has-heating-product .room-card-status-row { max-width: calc(100% - 104px); }
@media (max-width: 420px) {
  .room-card-thermostat-product { width: 58px; top: 60px; right: 14px; }
  .room-card-panel-heater-product { width: 82px; top: 64px; right: 12px; }
  .room-card.has-heating-product .room-card-temp-now,
  .room-card.has-heating-product .room-card-temp-target,
  .room-card.has-heating-product .room-card-status-row { max-width: calc(100% - 90px); }
}
.hotel-floor-group { grid-column: 1 / -1; min-width: 0; }
.hotel-floor-title { margin: 2px 0 10px; color: var(--text-muted); font-size: 11px; font-weight: 700; letter-spacing: 1.4px; }
.hotel-floor-grid { margin: 0; }
.room-card-hotel { min-height: 286px; }
.hotel-room-heading { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 14px; }
.hotel-floor-badge {
  flex: 0 0 auto;
  padding: 4px 8px;
  border-radius: var(--radius-pill);
  background: rgb(var(--sx-logo) / .1);
  color: var(--cyan);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .5px;
}
.hotel-booking-status {
  display: inline-flex;
  width: fit-content;
  margin: 14px 0 8px;
  padding: 5px 9px;
  border-radius: var(--radius-pill);
  background: rgb(var(--sx-green) / .12);
  color: var(--green);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .45px;
}
.hotel-booking-status.is-disconnected { background: rgb(var(--sx-orange) / .11); color: var(--amber); }
.hotel-temperature-line { color: var(--text-muted); font-size: 12px; line-height: 1.55; }
.hotel-stay-dates { display: grid; gap: 4px; margin-top: 10px; color: var(--text-dim); font-size: 11px; }
.hotel-stay-dates strong { color: var(--text-muted); font-weight: 600; }
.room-card.room-card-config-required { border-style: dashed; opacity: 0.9; }
.room-card-inactive-badge { font-size: 10px; color: var(--text-dim); }

/* ---------- Hjem: Energi i dag / Sammenligning (ærlig tom tilstand -
   se brukerens eksplisitte instruks om å ikke finne på data). ---------- */
.home-columns { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; margin-bottom: 22px; }
@media (max-width: 720px) { .home-columns { grid-template-columns: 1fr; } }
.energy-placeholder {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: 10px;
  padding: 26px 10px;
  color: var(--text-dim);
}
.energy-placeholder .nav-icon { width: 26px; height: 26px; color: var(--text-dim); }
.energy-placeholder p { margin: 0; font-size: 12.5px; line-height: 1.5; max-width: 260px; }
.energy-placeholder.has-data { align-items: stretch; justify-content: flex-start; text-align: left; padding: 12px 2px 2px; }
.energy-estimate-badge { width: fit-content; padding: 4px 8px; border-radius: var(--radius-pill); background: rgb(var(--sx-logo) / .12); color: var(--cyan); font-size: 10px; font-weight: 700; letter-spacing: .8px; }
.energy-estimate-value { color: var(--text); font-size: 28px; font-weight: 700; line-height: 1.2; }
.energy-estimate-lines { display: grid; gap: 5px; color: var(--text-muted); font-size: 12px; }
.energy-estimate-lines span { display: flex; justify-content: space-between; gap: 12px; }
.energy-estimate-lines strong { color: var(--text); font-weight: 600; }
.energy-measurement-breakdown { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; margin-top: 8px; padding-top: 10px; border-top: 1px solid var(--border); }
.energy-measurement-breakdown span { min-width: 0; padding: 7px; border-radius: var(--radius-sm); background: rgb(var(--sx-text-2) / .06); color: var(--text-dim); font-size: 10.5px; }
.energy-measurement-breakdown span.is-active { background: rgb(var(--sx-logo) / .08); color: var(--text); }
.energy-measurement-breakdown small,
.energy-comparison-grid small { display: block; margin-bottom: 4px; color: var(--text-dim); font-size: 9.5px; text-transform: uppercase; letter-spacing: .45px; }
.energy-comparison-title { color: var(--cyan); font-size: 10.5px; font-weight: 700; letter-spacing: .7px; }
.energy-comparison-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.energy-comparison-grid span { padding: 10px; border-radius: var(--radius-sm); background: rgb(var(--sx-text-2) / .06); color: var(--text); font-size: 15px; font-weight: 600; }
.energy-comparison-grid strong { display: block; margin-top: 5px; color: var(--text-muted); font-size: 11px; font-weight: 600; }
.energy-comparison-delta { display: flex; justify-content: space-between; gap: 12px; color: var(--text-muted); font-size: 13px; font-weight: 600; }
.energy-comparison-delta strong { color: var(--cyan); }
.energy-comparison-sources { color: var(--text-muted); font-size: 11px; }
.energy-comparison-future { padding-top: 9px; border-top: 1px solid var(--border); color: var(--text-dim); font-size: 10.5px; }
@media (max-width: 420px) { .energy-measurement-breakdown { grid-template-columns: 1fr; } }
.card-forecast canvas { width: 100%; display: block; }

/* ---------- Hjem: Hurtighandlinger ---------- */
.quick-actions-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 14px;
}
.quick-action-card {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 8px;
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: 16px;
  color: var(--text);
  font-family: inherit;
  text-align: left;
  cursor: pointer;
}
.quick-action-card:hover { border-color: var(--border-glow); }
.quick-action-card .nav-icon { width: 22px; height: 22px; color: var(--cyan); }
.quick-action-title { font-size: 12.5px; font-weight: 700; }
.quick-action-sub { font-size: 11px; color: var(--text-dim); }
.modal-quick-room-picker { max-width: 460px; }
.quick-room-picker-list { display: flex; flex-direction: column; gap: 8px; }
.quick-room-picker-row {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 13px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: var(--bg-panel-2);
  color: var(--text);
  font: inherit;
  font-weight: 600;
  text-align: left;
  cursor: pointer;
}
.quick-room-picker-row:hover { border-color: var(--border-glow); }
.quick-room-picker-target { color: var(--text-muted); font-size: 12px; font-weight: 400; white-space: nowrap; }
@media (max-width: 480px) {
  .quick-room-picker-row { align-items: flex-start; }
}

/* ---------- Room Detail: manuell styring (FLYTTET hit fra Hjem, se
   renderRoomDetailControls/renderRoomDetailZoneControls i app.js) ------- */
.room-detail-control-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
.zone-control-block {
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: 14px;
  margin-bottom: 12px;
}
.zone-control-block-title { font-size: 12px; font-weight: 700; margin-bottom: 10px; }

/* ---------- Onboarding-forside (Hjem, ingen Location finnes) og
   installasjonsveiviser (29.08.2026) - se homeOnboardingState/
   installWizardBackdrop i index.html og installWizard*-funksjonene i
   app.js. Gjenbruker eksisterende design-tokens (--bg-panel, --cyan,
   --border-glow osv.), ingen ny fargepalett. ---------- */
.onboarding-hero {
  min-height: calc(100vh - 100px);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}
.onboarding-hero-card {
  background: var(--bg-panel);
  border: 1px solid var(--border-glow);
  border-radius: var(--radius);
  padding: 40px 32px;
  width: 100%;
  max-width: 420px;
  text-align: center;
}
.onboarding-hero-icon { width: 40px; height: 40px; color: var(--cyan); margin-bottom: 14px; }
.onboarding-hero-title { font-size: 13px; font-weight: 700; letter-spacing: 1.5px; color: var(--text-dim); margin-bottom: 10px; }
.onboarding-hero-sub { font-size: 20px; font-weight: 700; margin-bottom: 12px; }
.onboarding-hero-text { color: var(--text-muted); font-size: 13.5px; line-height: 1.55; margin-bottom: 22px; }
.btn-large { padding: 12px 26px; font-size: 14px; }

.modal-install-wizard { max-width: 720px; max-height: 90vh; overflow-y: auto; display: flex; flex-direction: column; }
.install-wizard-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px; }
.install-wizard-header .modal-title { margin-bottom: 0; }
.install-wizard-steps {
  display: flex;
  gap: 6px;
  overflow-x: auto;
  padding: 4px 0 14px;
  margin-bottom: 14px;
  border-bottom: 1px solid var(--border);
}
.install-wizard-step-pill {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border-radius: var(--radius-pill, 999px);
  border: 1px solid var(--border);
  background: transparent;
  color: var(--text-dim);
  font-size: 11.5px;
  font-weight: 700;
  white-space: nowrap;
}
.install-wizard-step-pill .step-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: var(--bg-panel-2);
  font-size: 10px;
}
.install-wizard-step-pill.current { color: var(--cyan); border-color: rgb(var(--sx-logo) / .4); background: rgb(var(--sx-logo) / .1); }
.install-wizard-step-pill.done { color: var(--text); }
.install-wizard-step-pill.done .step-num { background: var(--green); color: rgb(var(--sx-bg-deep)); }
.install-wizard-body { flex: 1; }
.install-wizard-step-title { font-size: 15px; font-weight: 700; margin-bottom: 4px; }
.install-wizard-step-intro { color: var(--text-muted); font-size: 13px; line-height: 1.5; margin-bottom: 16px; }
.install-wizard-room-tabs { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 16px; }
.install-wizard-room-tab {
  padding: 7px 14px;
  border-radius: var(--radius-pill, 999px);
  border: 1px solid var(--border);
  background: var(--bg-panel-2);
  color: var(--text-muted);
  font-size: 12.5px;
  font-weight: 600;
  cursor: pointer;
}
.install-wizard-room-tab.active { color: var(--cyan); border-color: rgb(var(--sx-logo) / .4); background: rgb(var(--sx-logo) / .12); }
.install-wizard-room-list { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }
.install-wizard-room-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 10px 12px;
  font-size: 13px;
}
.install-wizard-device-group { margin-bottom: 14px; }
.install-wizard-device-group-title { font-size: 11px; font-weight: 700; color: var(--text-dim); letter-spacing: 0.5px; margin-bottom: 6px; }
.readiness-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  border-radius: var(--radius-pill, 999px);
  font-size: 11.5px;
  font-weight: 700;
}
.readiness-badge.ready { background: rgb(var(--sx-green) / .15); color: var(--green); }
.readiness-badge.missing { background: rgb(var(--sx-orange) / .15); color: var(--amber); }
.readiness-reasons { margin: 8px 0 0; padding-left: 18px; font-size: 12.5px; color: var(--text-muted); line-height: 1.6; }
.control-status-badge { display: inline-block; padding: 3px 9px; border-radius: var(--radius-pill, 999px); font-size: 10.5px; font-weight: 700; letter-spacing: 0.3px; }
.control-status-shadow { background: var(--bg-panel-2); color: var(--text-muted); }
.control-status-live { background: rgb(var(--sx-danger) / .18); color: var(--red); }
.control-status-configured { background: rgb(var(--sx-orange) / .15); color: var(--amber); }
.install-wizard-summary-room {
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 14px;
  margin-bottom: 12px;
}
.install-wizard-summary-room-title { font-size: 14px; font-weight: 700; margin-bottom: 6px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.install-wizard-summary-line { font-size: 12.5px; color: var(--text-muted); line-height: 1.7; }

/* =======================================================================
   HOTELLPROFIL FASE 2 (31.08.2026) - hotel-tile-dashbord + Rom-side +
   Integrasjoner. ALT under gjelder KUN elementer som app.js viser når
   buildingType='hotel' (se syncHotelDashboardVisibility()/
   updateHotelNavVisibility()) - boligprofilens egne klasser (.room-card,
   .price-strip, .home-columns m.fl.) er IKKE endret noe sted her.
   ======================================================================= */

/* ---------- Hjem: tile-dashbordets verktøylinje + grid (krav 5/6) ---------- */
.hotel-tile-toolbar { display: flex; justify-content: flex-end; gap: 8px; margin-bottom: 12px; }
.hotel-tile-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 150px;
  gap: 16px;
  margin-bottom: 22px;
  align-items: stretch;
  position: relative;
}
@media (max-width: 900px) { .hotel-tile-grid { grid-template-columns: repeat(2, 1fr); grid-auto-rows: minmax(150px, auto); } }
@media (max-width: 520px) { .hotel-tile-grid { grid-template-columns: 1fr; grid-auto-rows: auto; } }

.hotel-tile {
  position: relative;
  background: linear-gradient(180deg, var(--bg-panel) 0%, var(--bg-panel-2) 100%);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 16px 18px;
  min-width: 0;
  min-height: 0;
  overflow: hidden;
  grid-column: calc(var(--tile-x) + 1) / span var(--tile-w);
  grid-row: calc(var(--tile-y) + 1) / span var(--tile-h);
  transition: grid-column-start 120ms ease, grid-row-start 120ms ease, opacity 120ms ease;
  container-type: inline-size;
}
@media (max-width: 900px) {
  .hotel-tile { grid-column: auto / span min(2, var(--tile-w)); grid-row: auto / span var(--tile-h); }
}
@media (max-width: 520px) {
  .hotel-tile { grid-column: 1; grid-row: auto; }
}
.hotel-tile-grid.is-edit-mode .hotel-tile { border-style: dashed; border-color: var(--border-glow); }
.hotel-tile.is-dragging { opacity: 0.45; }
.hotel-tile.is-resizing { z-index: 4; box-shadow: 0 0 0 1px rgb(var(--sx-logo) / .25), 0 14px 38px rgb(var(--sx-black) / .28); }
.hotel-tile.is-hidden-tile { opacity: 0.5; grid-column: auto / span 1; grid-row: auto; }
.hotel-tile-placeholder {
  pointer-events: none;
  border: 1px dashed var(--cyan);
  border-radius: var(--radius);
  background: rgb(var(--sx-logo) / .08);
  grid-column: calc(var(--tile-x) + 1) / span var(--tile-w);
  grid-row: calc(var(--tile-y) + 1) / span var(--tile-h);
}
.hotel-tile-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 12px; flex-wrap: wrap; }
.hotel-tile-title { font-size: 12px; letter-spacing: 1.5px; color: var(--text-muted); font-weight: 700; text-transform: uppercase; }
.hotel-tile-controls { display: flex; align-items: center; gap: 6px; }
.hotel-tile-btn {
  padding: 4px 9px;
  border-radius: var(--radius-pill);
  border: 1px solid var(--border);
  background: var(--bg-panel-2);
  color: var(--text-muted);
  font-size: 10.5px;
  font-weight: 700;
  cursor: pointer;
}
.hotel-tile-btn:hover { color: var(--text); border-color: var(--border-glow); }
.hotel-tile-drag-handle { display: inline-flex; color: var(--text-dim); cursor: grab; }
.hotel-tile-drag-handle .icon { width: 16px; height: 16px; }
.hotel-tile-body { min-height: 24px; min-width: 0; height: calc(100% - 34px); overflow: hidden; }
.hotel-tile-empty { color: var(--text-dim); font-size: 12.5px; line-height: 1.5; margin: 0; }
.hotel-tile-note { color: var(--amber); font-size: 11px; margin: 10px 0 0; }

/* Usynlige resize-soner langs hele kanten. Finnes kun i edit mode fordi
   app.js bare renderer dem da. Hjørnene ligger over kantsonene. */
.hotel-tile-resize-handle { position: absolute; z-index: 8; user-select: none; touch-action: none; }
.hotel-tile-resize-handle.resize-n { top: 0; left: 10px; right: 10px; height: 8px; cursor: ns-resize; }
.hotel-tile-resize-handle.resize-s { bottom: 0; left: 10px; right: 10px; height: 8px; cursor: ns-resize; }
.hotel-tile-resize-handle.resize-e { top: 10px; right: 0; bottom: 10px; width: 8px; cursor: ew-resize; }
.hotel-tile-resize-handle.resize-w { top: 10px; left: 0; bottom: 10px; width: 8px; cursor: ew-resize; }
.hotel-tile-resize-handle.resize-ne { top: 0; right: 0; width: 14px; height: 14px; cursor: nesw-resize; }
.hotel-tile-resize-handle.resize-se { right: 0; bottom: 0; width: 14px; height: 14px; cursor: nwse-resize; }
.hotel-tile-resize-handle.resize-sw { left: 0; bottom: 0; width: 14px; height: 14px; cursor: nesw-resize; }
.hotel-tile-resize-handle.resize-nw { top: 0; left: 0; width: 14px; height: 14px; cursor: nwse-resize; }
@media (max-width: 900px) { .hotel-tile-resize-handle { display: none; } }

/* Gjenbrukte hus-elementer (price-strip/energy/comparison) MONTERES inn i
   en tile-body (ren DOM-flytting, se mountExistingElementInTile()) - de
   beholder sin egen .card/.price-strip-styling andre steder, men skal
   IKKE se ut som en "boks i en boks" her - tile-en ER allerede kortet. */
.hotel-tile-body > .price-strip,
.hotel-tile-body > .card-energy-today,
.hotel-tile-body > .card-comparison {
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  border-radius: 0;
  max-width: 100%;
  height: 100%;
  overflow: hidden;
}

.hotel-tile-body canvas { max-width: 100%; }
.hotel-tile[data-tile-w="1"] .price-now-value { font-size: clamp(20px, 2.2vw, 30px); }
.hotel-tile[data-tile-w="2"] .price-now-value { font-size: clamp(26px, 3vw, 38px); }
.hotel-tile[data-tile-h="1"] .hotel-tile-note { display: none; }

/* ---------- Hjem: HOTELLSTATUS-tile ---------- */
.hotel-status-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(64px, 1fr)); gap: 12px; }
.hotel-tile[data-tile-w="2"] .hotel-status-grid { grid-template-columns: repeat(3, minmax(64px, 1fr)); row-gap: 14px; }
.hotel-tile[data-tile-w="3"] .hotel-status-grid,
.hotel-tile[data-tile-w="4"] .hotel-status-grid { grid-template-columns: repeat(5, minmax(64px, 1fr)); }
.hotel-status-figure { display: flex; flex-direction: column; gap: 2px; }
.hotel-status-figure strong { font-size: 22px; font-weight: 700; color: var(--text); line-height: 1; }
.hotel-status-figure span { font-size: 10.5px; color: var(--text-dim); letter-spacing: 0.3px; }

/* ---------- Hjem: operative temperatur-/varmestatus-tiles ---------- */
.hotel-operational-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(88px, 1fr));
  gap: 12px 16px;
  align-content: start;
}
.hotel-operational-kpi { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.hotel-operational-kpi strong { color: var(--text); font-size: 20px; line-height: 1; white-space: nowrap; }
.hotel-operational-kpi.primary strong { color: var(--cyan-soft); font-size: 24px; }
.hotel-operational-kpi span { color: var(--text-dim); font-size: 10.5px; line-height: 1.25; }
.hotel-operational-empty { color: var(--text-muted); font-size: 14px; font-weight: 650; margin-top: 3px; }
.hotel-operational-coverage, .hotel-operational-note { color: var(--text-dim); font-size: 11.5px; line-height: 1.45; margin: 8px 0 0; }
.hotel-operational-note { grid-column: 1 / -1; margin-top: 0; }
.hotel-tile[data-tile-w="2"][data-tile-h="1"] .hotel-operational-kpi.extended { display: none; }
.hotel-tile[data-tile-w="2"] .hotel-operational-grid { grid-template-columns: repeat(2, minmax(88px, 1fr)); }
.hotel-tile[data-tile-w="3"] .hotel-operational-grid { grid-template-columns: repeat(3, minmax(88px, 1fr)); }
.hotel-tile[data-tile-w="4"] .hotel-operational-grid { grid-template-columns: repeat(4, minmax(88px, 1fr)); }

/* ---------- Visuelt driftsspråk: temperatur + varme ---------- */
.hotel-visual-status { display: grid; grid-template-columns: minmax(108px, .72fr) minmax(0, 1.45fr); gap: 18px; align-items: center; height: 100%; }
.hotel-gauge { position: relative; width: min(100%, 142px); aspect-ratio: 1; margin-inline: auto; }
.hotel-gauge svg { width: 100%; height: 100%; transform: rotate(-90deg); overflow: visible; }
.hotel-gauge circle { fill: none; stroke-width: 8; }
.hotel-gauge .gauge-track { stroke: var(--border); }
.hotel-gauge .gauge-value { stroke: var(--green); stroke-linecap: round; stroke-dasharray: var(--gauge-progress) 100; transition: stroke-dasharray .45s ease; }
.hotel-gauge-label { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; }
.hotel-gauge-label strong { color: var(--text); font-size: clamp(20px, 4cqw, 30px); line-height: 1; }
.hotel-gauge-label span { color: var(--text-dim); font-size: 10px; margin-top: 5px; }
.hotel-visual-details { min-width: 0; }
.hotel-extremes { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; padding-bottom: 10px; border-bottom: 1px solid var(--border); }
.hotel-extremes span { min-width: 0; }
.hotel-extremes strong { color: var(--text); display: block; font-size: 16px; }
.hotel-extremes small { color: var(--text-dim); display: block; font-size: 10px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hotel-temperature-counts { display: flex; gap: 14px; flex-wrap: wrap; margin: 10px 0; font-size: 10.5px; color: var(--text-dim); }
.hotel-temperature-counts strong { font-size: 15px; margin-right: 3px; }
.hotel-temperature-counts .is-good strong { color: var(--green); }
.hotel-temperature-counts .is-cold strong { color: var(--blue); }
.hotel-temperature-counts .is-warm strong { color: var(--red); }
.hotel-coverage-line { display: flex; justify-content: space-between; gap: 10px; color: var(--text-dim); font-size: 10px; }
.hotel-coverage-line strong { color: var(--cyan-soft); }
.hotel-coverage-track { height: 5px; background: var(--border); border-radius: var(--radius-pill); overflow: hidden; margin-top: 6px; }
.hotel-coverage-track span { display: block; height: 100%; border-radius: inherit; background: linear-gradient(90deg, var(--cyan), var(--green)); transition: width .45s ease; }
.hotel-heating-gauge .heat-segment { stroke-width: 8; stroke-linecap: butt; }
.hotel-heating-gauge .is-heating { stroke: var(--amber); stroke-dasharray: var(--heat) 100; }
.hotel-heating-gauge .is-off { stroke: var(--text-dim); stroke-dasharray: var(--off) 100; stroke-dashoffset: calc(-1 * var(--heat)); }
.hotel-heating-gauge .is-error { stroke: var(--red); stroke-dasharray: var(--error) 100; stroke-dashoffset: calc(-1 * (var(--heat) + var(--off))); }
.heating-legend { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 12px; color: var(--text-dim); font-size: 11px; }
.heating-legend > span { display: flex; align-items: center; gap: 6px; }
.heating-legend i, .thermal-state-counts i { width: 7px; height: 7px; border-radius: 50%; background: var(--text-dim); flex: none; }
.heating-legend .is-heating i { background: var(--amber); }
.heating-legend .is-error i { background: var(--red); }
.heating-legend .is-unknown i { background: var(--blue); }
.heating-legend strong { color: var(--text); font-size: 15px; }
.hotel-heating-summary { grid-column: 1 / -1; border-top: 1px solid var(--border); padding-top: 9px; }
.hotel-heating-summary strong { color: var(--cyan-soft); }
.hotel-active-power { grid-column: 1 / -1; display: flex; align-items: baseline; gap: 7px; }
.hotel-active-power strong { color: var(--text); font-size: 18px; }.hotel-active-power span { color: var(--text-dim); font-size: 10px; }

/* ---------- Termisk batteri – aggregert hotel read-model ---------- */
.thermal-battery-layout { display: grid; grid-template-columns: minmax(170px, 1.35fr) 88px minmax(120px, 1fr); align-items: center; gap: 16px; height: 100%; }
.thermal-floor-visual svg { width: 100%; max-height: 190px; overflow: visible; filter: drop-shadow(0 14px 12px rgb(var(--sx-black) / .28)); }
.thermal-slab-top { fill: url(#hotelFloorTop); stroke: var(--border-glow); stroke-width: 1; }
.thermal-slab-layer { fill: rgb(var(--sx-surface)); stroke: var(--border); }
.thermal-mass { fill: rgb(var(--sx-card)); stroke: var(--border); }
.thermal-cable { fill: none; stroke: var(--amber); stroke-width: 3; stroke-linecap: round; filter: drop-shadow(0 0 5px rgb(var(--sx-orange) / .55)); }
.thermal-battery-layout:not(.is-charging) .thermal-cable, .thermal-battery-layout.is-unknown .thermal-cable { stroke: var(--text-dim); filter: none; }
.thermal-simulation-badge { position: absolute; top: 14px; right: 16px; z-index: 2; }
.thermal-battery { position: relative; height: 142px; border: 2px solid var(--border-glow); border-radius: 18px; overflow: visible; background: rgb(var(--sx-bg-deep) / .72); box-shadow: inset 0 0 18px rgb(var(--sx-logo) / .08); }
.thermal-battery-cap { position: absolute; top: -10px; left: 27%; width: 46%; height: 9px; border: 2px solid var(--border-glow); border-bottom: 0; border-radius: 7px 7px 0 0; }
.thermal-battery-fill { position: absolute; inset: auto 5px 5px; height: calc(var(--battery-level) - 10px); max-height: calc(100% - 10px); min-height: 0; border-radius: 11px; background: linear-gradient(0deg, var(--green), rgb(var(--sx-green) / .45)); transition: height .55s ease; }
.thermal-battery > div { position: absolute; inset: 0; z-index: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; text-shadow: 0 1px 4px var(--bg); }
.thermal-battery strong { color: var(--text); font-size: 24px; }.thermal-battery small { color: var(--text-muted); font-size: 8.5px; max-width: 70px; text-transform: uppercase; }
.thermal-battery-layout.is-unknown .thermal-battery { border-color: var(--border); }.thermal-battery-layout.is-unknown .thermal-battery-fill { display: none; }
.thermal-battery-empty { color: var(--text-muted); font-size: 13px; font-weight: 650; line-height: 1.5; margin: 0; }.thermal-battery-empty span { color: var(--text-dim); font-size: 11px; font-weight: 400; }
.thermal-state-counts { display: grid; gap: 7px; color: var(--text-dim); font-size: 10.5px; }.thermal-state-counts span { display: flex; align-items: center; gap: 6px; }.thermal-state-counts strong { color: var(--text); font-size: 14px; }.thermal-state-counts .is-charge { background: var(--green); }.thermal-state-counts .is-hold { background: var(--blue); }.thermal-state-counts .is-discharge { background: var(--amber); }.thermal-state-counts .is-low { background: var(--red); }

@container (max-width: 410px) {
  .hotel-visual-status { grid-template-columns: 104px minmax(0, 1fr); gap: 10px; }
  .hotel-extremes { grid-template-columns: 1fr; gap: 5px; }
  .hotel-temperature-counts { gap: 8px; }
  .thermal-battery-layout { grid-template-columns: 1fr 70px; }
  .thermal-battery-copy { grid-column: 1 / -1; }
  .thermal-battery { height: 112px; }
}
@container (max-width: 290px) {
  .hotel-visual-status { grid-template-columns: 1fr; }
  .hotel-gauge { width: 92px; }
  .hotel-visual-details { text-align: center; }
  .hotel-extremes, .hotel-temperature-counts, .heating-legend > span, .hotel-heating-summary { display: none; }
  .thermal-floor-visual { display: none; }
  .thermal-battery-layout { grid-template-columns: 68px 1fr; }
  .thermal-battery-copy { grid-column: auto; }
}

/* ---------- TEMPERATURSTATUS - redesign 02.09.2026 (KUN denne tile-en,
   se renderHotelTemperatureStatusTile()/computeHotelTemperatureStatus()
   i app.js). Gjenbruker BEVISST de delte .hotel-gauge/.hotel-visual-
   status/.hotel-visual-details/.hotel-extremes/.hotel-temperature-counts-
   klassene og de to @container-bruddpunktene rett over (samme visuelle
   språk og samme skjule-oppførsel som VARMESTATUS-tile-en, som fortsatt
   bruker dem helt uendret) - alt NYTT under bruker enten en helt egen
   klasse (.temp-gauge-label, .temp-status-*) eller er scopet under
   .temp-status-grid/[data-tile-h="1"], slik at ingenting her kan påvirke
   noen annen tile eller selve grid-/resize-motoren. ---------- */
.temp-gauge-label { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 1px; padding: 6px; }
.temp-gauge-label strong { color: var(--text); font-size: clamp(18px, 5.2cqw, 28px); line-height: 1; }
.temp-gauge-label .temp-gauge-sub { color: var(--text-muted); font-size: clamp(9px, 2.6cqw, 11px); font-weight: 600; }
.temp-gauge-label .temp-gauge-caption { color: var(--text-dim); font-size: clamp(7.5px, 2cqw, 9px); font-weight: 700; letter-spacing: .6px; text-transform: uppercase; margin-top: 2px; }

.temp-status-details { display: flex; flex-direction: column; gap: 9px; min-width: 0; }
.temp-status-average-value { display: flex; align-items: baseline; gap: 8px; }
.temp-status-average-value strong { color: var(--text); font-size: 20px; line-height: 1; }
.temp-status-average-value span { color: var(--text-dim); font-size: 10.5px; letter-spacing: .3px; }
.temp-status-average-value.secondary { padding-bottom: 9px; border-bottom: 1px solid var(--border); }
.temp-status-coverage { color: var(--text-dim); font-size: 10px; line-height: 1.4; margin: 0; }

.temp-status-notarget { display: flex; flex-direction: column; gap: 6px; height: 100%; justify-content: center; }
.temp-status-notarget .temp-status-average-value strong { font-size: 26px; }
.temp-status-notarget .hotel-operational-note { margin: 0; }
.temp-status-notarget .temp-status-coverage { margin-top: 2px; }

/* Kompakt visning ved tile-høyde 1 rad (~84px innhold - se
   .hotel-tile-body/.hotel-tile-grid sin grid-auto-rows). Prioritert
   nedvalg per spec: %-tallet og "N av M" i selve ringen beholdes alltid,
   snittet vises som kompakt sekundærtall, kaldest/varmest + statustall +
   dekningstekst SKJULES (ikke klippes) - de har lavest prioritet. Løser
   den rapporterte klippingen nederst i tile-en direkte, i stedet for å
   stole på .hotel-tile-body { overflow:hidden }. */
.hotel-tile[data-tile-h="1"] .temp-status-grid { grid-template-columns: 64px minmax(0, 1fr); gap: 12px; }
/* overflow:hidden her er BEVISST: uten den bruker nettleseren ringens
   3-linjers innhold (%, "N av M", "INNENFOR MÅL") til å presse selve
   ringboksen høyere enn width:64px/aspect-ratio:1 tilsier (CSS sin
   automatiske min-størrelse for aspect-ratio-bokser med synlig overflow) -
   uten denne ville ringen selv blitt noen px høyere enn bred. Scopet KUN
   til [data-tile-h="1"] .temp-status-grid .hotel-gauge - påvirker ikke
   Varmestatus-tile-en (samme .hotel-gauge, men uten denne selektoren)
   eller noen annen tilstand. */
.hotel-tile[data-tile-h="1"] .temp-status-grid .hotel-gauge { width: 64px; overflow: hidden; }
/* Teksten inni ringen (.temp-gauge-label strong/sub/caption) bruker
   ellers `cqw`-baserte størrelser relativt til HELE tile-ens bredde
   (via container-type:inline-size på .hotel-tile) - riktig når selve
   ringen også skalerer med tile-bredden. I h=1-kompakt-modus er ringen
   derimot LÅST til en fast 64px diameter uansett hvor bred selve
   tile-en er (se regelen over) - på en bred, men kort (h=1) tile ville
   teksten da bli mye større enn de 64 pikslene har plass til, og
   klippes av overflow:hidden på selve ringen (sett live av bruker:
   "INNENFOR MÅL" klippet av nederst). Løsning: faste, små pikselverdier
   her i stedet for cqw, dimensjonert til å ha god plass i en 64px
   sirkel uansett tile-bredde. */
.hotel-tile[data-tile-h="1"] .temp-status-grid .temp-gauge-label { padding: 3px; gap: 0; }
.hotel-tile[data-tile-h="1"] .temp-status-grid .temp-gauge-label strong { font-size: 15px; }
.hotel-tile[data-tile-h="1"] .temp-status-grid .temp-gauge-label .temp-gauge-sub { font-size: 8px; }
.hotel-tile[data-tile-h="1"] .temp-status-grid .temp-gauge-label .temp-gauge-caption { font-size: 6px; margin-top: 1px; letter-spacing: .4px; }
/* Kompenserer for et EKSISTERENDE avvik i den delte .hotel-tile-body
   { height: calc(100% - 34px) }-regelen (uendret av oss, brukes av alle
   tiles): den antar en fast tittel-høyde på 34px, mens denne tile-ens
   faktiske header (uten "Tilpass"-knapper i visningsmodus) kun er ca.
   26px. Ved normal fast rad-høyde (grid-auto-rows:150px) er dette 8px-
   avviket usynlig (rikelig med slakk) - men ved smal bredde (<520px)
   bytter .hotel-tile-grid til grid-auto-rows:auto (egen, allerede
   eksisterende regel), og da blir raden nøyaktig innholdsdrevet: de
   samme 8px forsvinner reelt og klipper innholdet nederst. Denne
   paddingen "forhåndsbetaler" nøyaktig det avviket FØR klippingen
   inntreffer, slik at selve ringen/teksten aldri klippes - scopet
   utelukkende til denne tile-ens kompakte h=1-visning. */
.hotel-tile[data-tile-h="1"] .temp-status-grid { padding-bottom: 10px; }
.hotel-tile[data-tile-h="1"] .temp-status-details { justify-content: center; height: 100%; gap: 2px; }
.hotel-tile[data-tile-h="1"] .temp-status-details .temp-status-average-value.secondary { border-bottom: none; padding-bottom: 0; }
.hotel-tile[data-tile-h="1"] .temp-status-details .temp-status-average-value strong { font-size: 16px; }
.hotel-tile[data-tile-h="1"] .hotel-extremes,
.hotel-tile[data-tile-h="1"] .hotel-temperature-counts,
.hotel-tile[data-tile-h="1"] .temp-status-coverage { display: none; }
.hotel-tile[data-tile-h="1"] .temp-status-notarget { gap: 3px; }
.hotel-tile[data-tile-h="1"] .temp-status-notarget .temp-status-average-value strong { font-size: 20px; }

/* Smalest bredde - fjerner "N av M"-underteksten inni selve ringen (den
   fulle prosenten og "INNENFOR MÅL"-teksten beholdes alltid, øverst
   prioritert per spec). Faller ellers tilbake på de delte 410px/290px-
   bruddpunktene over, som allerede skjuler kaldest/varmest + statustall
   for denne tile-en (samme klassenavn som Varmestatus-tile-en deler). */
@container (max-width: 230px) {
  .temp-gauge-label .temp-gauge-sub { display: none; }
}
@container (max-width: 290px) {
  .temp-status-details { text-align: center; }
  .temp-status-average-value { justify-content: center; }
}

/* ---------- Hjem: KREVER OPPMERKSOMHET-tile ---------- */
.hotel-attention-list { display: flex; flex-direction: column; gap: 8px; height: 100%; overflow-y: auto; overscroll-behavior: contain; padding-right: 3px; }
.hotel-attention-list {
  scrollbar-width: thin;
  scrollbar-color: var(--border-glow) transparent;
}
.hotel-attention-list::-webkit-scrollbar { width: 5px; height: 5px; }
.hotel-attention-list::-webkit-scrollbar-track { background: transparent; }
.hotel-attention-list::-webkit-scrollbar-thumb {
  background: var(--border-glow);
  border-radius: var(--radius-pill);
}
.hotel-attention-list::-webkit-scrollbar-thumb:hover { background: var(--cyan); }
.hotel-attention-list::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
.hotel-tile[data-tile-h="1"] .hotel-attention-list { gap: 6px; }
.hotel-tile[data-tile-h="1"] .hotel-attention-row { padding-block: 6px; }
.hotel-attention-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  width: 100%;
  text-align: left;
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 8px 12px;
  color: var(--text);
  font-size: 12.5px;
  font-weight: 600;
  cursor: pointer;
}
.hotel-attention-row:hover { border-color: var(--border-glow); }
.hotel-attention-reason { color: var(--red); font-size: 11px; font-weight: 600; text-align: right; }

/* ---------- Hjem: THERMAL LEARNING-tile ---------- */
.hotel-learning-summary, .hotel-learning-empty { display: grid; grid-template-columns: 74px 1fr; align-items: center; gap: 16px; font-size: 12.5px; color: var(--text-muted); }
.hotel-learning-copy { min-width: 0; }.hotel-learning-copy > strong { color: var(--text); }
.hotel-learning-empty strong { color: var(--text); font-size: 14px; }.hotel-learning-empty p { color: var(--text-dim); font-size: 11px; margin: 4px 0 0; }
.learning-orbit { position: relative; width: 68px; aspect-ratio: 1; border: 1px solid var(--border-glow); border-radius: 45% 55% 52% 48%; box-shadow: inset 0 0 20px rgb(var(--sx-logo) / .08); }
.learning-orbit::before, .learning-orbit::after, .learning-orbit span { content: ''; position: absolute; border: 1px solid var(--cyan); border-radius: 50%; opacity: .55; }
.learning-orbit::before { inset: 12px 5px; transform: rotate(35deg); }.learning-orbit::after { inset: 5px 16px; transform: rotate(-25deg); }.learning-orbit span { inset: 21px; background: rgb(var(--sx-green) / .18); border-color: var(--green); }
.hotel-learning-breakdown { display: flex; gap: 16px; color: var(--text-dim); font-size: 11.5px; }
.hotel-learning-breakdown strong { color: var(--cyan-soft); font-size: 13px; }

/* ---------- Hjem: FORVARMING-tile (Booking-based Preheating v1, 03.09.2026) ---------- */
.hotel-preheat-summary { font-size: 12.5px; color: var(--text-muted); }
.hotel-preheat-summary p { margin: 0 0 4px; }
.hotel-preheat-summary strong { color: var(--text); font-size: 13.5px; }
.hotel-preheat-highlight { margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--border); font-size: 12px; color: var(--text-muted); cursor: pointer; }
.hotel-preheat-highlight strong { color: var(--text); }
.hotel-preheat-highlight p { margin: 3px 0 0; }
.hotel-preheat-highlight:hover { color: var(--text); }

@media (prefers-reduced-motion: reduce) {
  .hotel-gauge .gauge-value, .hotel-coverage-track span, .thermal-battery-fill { transition: none; }
}

/* ---------- ROM-siden (krav 3/4) ---------- */
.rom-page-toolbar-card { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.rom-page-toolbar { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; flex: 1 1 auto; }
.rom-search-field {
  display: flex;
  align-items: center;
  gap: 8px;
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  padding: 8px 14px;
  flex: 1 1 220px;
  max-width: 340px;
}
.rom-search-field .icon-sm { width: 15px; height: 15px; color: var(--text-dim); flex: none; }
.rom-search-field input {
  border: none;
  background: transparent;
  color: var(--text);
  font-size: 13px;
  outline: none;
  width: 100%;
}
.rom-status-filters { display: flex; gap: 8px; flex-wrap: wrap; }
.rom-status-filters .chip-btn.active { background: rgb(var(--sx-green) / .15); color: var(--green); border-color: rgb(var(--sx-green) / .4); }
.rom-page-count { color: var(--text-dim); font-size: 12px; white-space: nowrap; }

.rom-list-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 14px;
}
.room-list-card {
  background: var(--bg-panel-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  padding: 14px;
  cursor: pointer;
  transition: border-color 0.15s ease;
}
.room-list-card:hover { border-color: var(--border-glow); }
.room-list-card-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 10px; }
.room-list-card-badges { display: inline-flex; align-items: center; justify-content: flex-end; gap: 6px; flex-wrap: wrap; }
.room-list-card-name { font-size: 12.5px; font-weight: 700; letter-spacing: 0.3px; color: var(--text); }
.room-list-status-badge { padding: 3px 8px; border-radius: var(--radius-pill); font-size: 9.5px; font-weight: 700; letter-spacing: 0.4px; background: rgb(var(--sx-text-2) / .12); color: var(--text-muted); }
.room-list-status-badge.status-innsjekket, .room-list-card.status-innsjekket .room-list-status-badge { background: rgb(var(--sx-green) / .15); color: var(--green); }
.room-list-status-badge.status-ankomst_i_dag, .room-list-card.status-ankomst_i_dag .room-list-status-badge { background: rgb(var(--sx-logo) / .15); color: var(--cyan); }
.room-list-status-badge.status-booket, .room-list-card.status-booket .room-list-status-badge { background: rgb(var(--sx-accent-alt) / .15); color: var(--purple); }
.room-list-status-badge.status-ledig, .room-list-card.status-ledig .room-list-status-badge { background: rgb(var(--sx-text-2) / .12); color: var(--text-muted); }
.room-list-status-badge.status-avvik, .room-list-card.status-avvik .room-list-status-badge { background: rgb(var(--sx-danger) / .15); color: var(--red); }
.room-list-status-badge.status-ukjent, .room-list-card.status-ukjent .room-list-status-badge { background: rgb(var(--sx-orange) / .15); color: var(--amber); }
/* IKKE KONFIGURERT (02.09.2026, tredje runde) - bevisst NØYTRAL, blågrå
   (samme farge som selve badge-standarden over og "Ledig") - ALDRI rød,
   siden dette ikke er en driftsfeil, kun manglende oppsett ennå. Skrevet
   eksplisitt her (i stedet for å stole stille på fallback-standarden)
   slik at intensjonen er tydelig og ikke knyttes til default-regelen ved
   et uhell senere. */
.room-list-status-badge.status-ikke_konfigurert, .room-list-card.status-ikke_konfigurert .room-list-status-badge { background: rgb(var(--sx-text-2) / .12); color: var(--text-muted); }
.room-list-card-temps { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 8px; }
.room-list-card-temp-now { font-size: 20px; font-weight: 700; color: var(--text); }
.room-list-card-target { font-size: 11px; color: var(--text-muted); }
.room-list-card-row { display: flex; align-items: center; gap: 6px; font-size: 11.5px; font-weight: 600; margin-bottom: 8px; }
.room-list-card-row .icon { width: 14px; height: 14px; }
.room-list-card-row.status-heating, .room-list-card-row.status-preheat { color: var(--amber); }
.room-list-card-row.status-reduce { color: var(--blue); }
.room-list-card-row.status-normal { color: var(--green); }
.room-list-card-row.status-manual { color: var(--purple); }
.room-list-card-row.status-warning { color: var(--red); }
.room-list-card-row.status-muted { color: var(--text-dim); }
.room-list-card-dates { display: flex; flex-direction: column; gap: 2px; color: var(--text-dim); font-size: 10.5px; margin-bottom: 6px; }
.room-list-card-learning { color: var(--text-dim); font-size: 10.5px; }
.room-list-card-thermal { margin-top: 7px; padding-top: 7px; border-top: 1px solid var(--border); color: var(--text-dim); font-size: 10.5px; }.room-list-card-thermal strong { color: var(--cyan-soft); }

/* ---------- Innstillinger -> Integrasjoner (krav 10) ---------- */
.integration-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  padding: 10px 0;
  border-top: 1px solid var(--border);
}
.integration-row:first-of-type { border-top: none; }
.integration-row-main { display: flex; flex-direction: column; gap: 2px; }
.integration-row-title { font-size: 13px; font-weight: 700; color: var(--text); }
.integration-row-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.integration-counts { display: flex; gap: 20px; margin-top: 12px; font-size: 12.5px; color: var(--text-muted); }
.integration-counts strong { color: var(--cyan-soft); font-size: 15px; }


/* ---------------------------------------------------------------------
   Innloggingsside (login.html). Gjenbruker .wizard/.wizard-card-rammen
   sa paaloggingen ser ut som resten av appen, ikke som et fremmedelement.
   --------------------------------------------------------------------- */
.login-card { max-width: 420px; }
.login-card .field { flex-direction: column; align-items: stretch; gap: var(--space-1); margin-bottom: var(--space-4); }
.login-card .field input { max-width: none; }
.login-brand { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-6); }
.login-logo { width: 44px; height: 44px; border-radius: var(--radius-sm); }
.login-brand-name { font-size: var(--font-md); font-weight: 700; letter-spacing: 2px; color: var(--text); }
.login-brand-sub { font-size: var(--font-xs); letter-spacing: 2px; color: var(--cyan); }
.login-card h2 { margin: 0 0 var(--space-2); font-size: var(--font-lg); color: var(--text); }
.login-actions { display: flex; flex-direction: column; gap: var(--space-2); margin-top: var(--space-5); }
.login-actions .btn { width: 100%; justify-content: center; }
.login-error {
  background: rgb(var(--sx-danger) / .12);
  border: 1px solid rgb(var(--sx-danger) / .4);
  color: var(--red);
  border-radius: var(--radius-sm);
  padding: var(--space-3);
  margin-bottom: var(--space-4);
  font-size: var(--font-sm);
}
.login-hint { margin-top: var(--space-5); font-size: var(--font-sm); color: var(--text-muted); }
.login-hint a { color: var(--cyan); text-decoration: none; }
.login-hint a:hover { text-decoration: underline; }

/* Brukerbrikke i toppmenyen, med meny bak seg. Selve brikken viser hvem
   du er; logg ut og portallenken ligger i menyen, slik at toppmenyen ikke
   fylles opp av knapper man trykker paa en gang i uka. */
.topbar-user { position: relative; display: flex; align-items: center; }

/* Brikken viser to linjer: hvem du er, og hvilket bygg du styrer.
   To linjer i stedet for én lang tekst, sa begge faktisk er lesbare i
   den smale plassen toppmenyen gir. */
.user-chip { display: inline-flex; align-items: center; gap: var(--space-2); max-width: 260px; padding-top: 4px; padding-bottom: 4px; }
.user-chip-lines { display: flex; flex-direction: column; align-items: flex-start; min-width: 0; line-height: 1.25; }
.user-chip-tenant {
  font-size: 10px;
  color: var(--cyan);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 100%;
}
.user-avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  flex: 0 0 22px;
  border-radius: var(--radius-pill);
  background: rgb(var(--sx-logo) / .18);
  border: 1px solid rgb(var(--sx-logo) / .45);
  color: var(--cyan-soft);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .5px;
}
.user-chip-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: var(--font-xs);
  max-width: 100%;
}
.user-chip-caret { font-size: 9px; color: var(--text-dim); }
.user-chip[aria-expanded="true"] { border-color: var(--cyan); }

.user-menu {
  position: absolute;
  top: calc(100% + var(--space-2));
  right: 0;
  z-index: 60;
  min-width: 240px;
  background: var(--card-bg);
  border: var(--card-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-1);
  overflow: hidden;
}
.user-menu-head { padding: var(--space-4); border-bottom: 1px solid var(--border); }
.user-menu-name { font-size: var(--font-base); color: var(--text); font-weight: 600; word-break: break-word; }
.user-menu-email { font-size: var(--font-sm); color: var(--text-muted); margin-top: 2px; word-break: break-all; }
.user-menu-meta { font-size: var(--font-xs); color: var(--text-dim); margin-top: var(--space-2); }
.user-menu-items { padding: var(--space-2); display: flex; flex-direction: column; }
.user-menu-item {
  display: block;
  width: 100%;
  text-align: left;
  background: none;
  border: 0;
  border-radius: var(--radius-sm);
  padding: var(--space-3);
  font: inherit;
  font-size: var(--font-base);
  color: var(--text);
  text-decoration: none;
  cursor: pointer;
}
.user-menu-item:hover { background: rgb(var(--sx-logo) / .12); }
.user-menu-item-danger { color: var(--red); }
.user-menu-item-danger:hover { background: rgb(var(--sx-danger) / .12); }

/* Paa mobil er toppmenyen trang - la menyen falle innenfor skjermen. */
@media (max-width: 480px) {
  .user-chip { max-width: 120px; }
  .user-menu { min-width: 0; width: min(280px, calc(100vw - var(--space-6))); }
}


/* Tenant-listen i brukermenyen. Et bytte her endrer hvilket bygg agenten
   styrer, sa aktiv rad er tydelig markert og et bygg uten token er
   synlig merket i stedet for a vaere skjult. */
.user-menu-section { padding: var(--space-3) var(--space-2); border-bottom: 1px solid var(--border); }
.user-menu-label {
  font-size: var(--font-xs);
  letter-spacing: 1px;
  text-transform: uppercase;
  color: var(--text-dim);
  padding: 0 var(--space-2) var(--space-2);
}
.tenant-list { display: flex; flex-direction: column; max-height: 220px; overflow-y: auto; }
.tenant-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
  width: 100%;
  text-align: left;
  background: none;
  border: 0;
  border-radius: var(--radius-sm);
  padding: var(--space-2) var(--space-3);
  font: inherit;
  font-size: var(--font-base);
  color: var(--text);
  cursor: pointer;
}
.tenant-row:hover:not(:disabled) { background: rgb(var(--sx-logo) / .12); }
.tenant-row:disabled { cursor: default; }
.tenant-row-active { background: rgb(var(--sx-logo) / .1); }
.tenant-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tenant-status {
  flex: 0 0 auto;
  font-size: var(--font-xs);
  color: var(--text-dim);
  border: 1px solid var(--border);
  border-radius: var(--radius-pill);
  padding: 1px 8px;
}
.tenant-status-active { color: var(--cyan); border-color: rgb(var(--sx-logo) / .5); }
.user-menu-note {
  font-size: var(--font-xs);
  color: var(--text-dim);
  padding: var(--space-2) var(--space-3) 0;
}
.modal-text { font-size: var(--font-base); color: var(--text-muted); margin: 0 0 var(--space-3); }
.modal-text-warn { color: var(--amber); }

/* Hjelpetekst og bytte mellom automatisk/manuell tilkobling i veiviseren. */
/* Byggnavn er lange - .field select er 120px, som kutter dem midt i. */
.wizard-step .field select { width: auto; min-width: 220px; max-width: 320px; }

.wizard-hint { font-size: var(--font-sm); color: var(--text-muted); margin: var(--space-3) 0 0; }
.wizard-hint a { color: var(--cyan); text-decoration: none; }
.wizard-hint a:hover { text-decoration: underline; }

/* RETTET 06.09.2026 (se rapport onboarding) - Bolig/Hotell-valget i
   veiviserens Steg 1 (kun for en NY, ukonfigurert lokasjon), samme
   visuelle sprak som den radio-baserte sensor-plukkeren
   (.room-detail-sensor-picker-row) - store, tydelige valg fremfor en
   nedtrekksliste, siden dette er det aller forste, avgjorende valget
   i hele installasjonen. */
.wizard-building-type-choice { border: 0; padding: 0; margin: 0 0 var(--space-4); display: flex; flex-direction: column; gap: 8px; }
.wizard-building-type-choice legend { font-size: 13px; color: var(--text-muted); margin-bottom: 6px; padding: 0; }
.wizard-building-type-choice .radio-option {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
  background: rgb(var(--sx-white) / .03);
  border: 1px solid var(--border);
  border-radius: 10px;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
}
.wizard-building-type-choice .radio-option:hover { border-color: var(--border-glow); }
.wizard-building-type-choice .radio-option:has(input:checked) { border-color: var(--cyan); background: rgb(var(--sx-logo) / .07); }
.wizard-building-type-choice .radio-option input[type="radio"] { accent-color: var(--cyan); flex-shrink: 0; }

/* Valgt bygg i veiviseren - lest opp fra toppmenyen, ikke et nytt valg. */
.wizard-tenant-chosen strong { color: var(--text); font-size: var(--font-base); }

@media (max-width: 480px) {
  .user-chip { max-width: 150px; }
}

/* Byggvelger i veiviseren (steg 0). Store, tydelige rader - dette er
   valget som avgjor hvilket bygg hele installasjonen tilhorer. */
.tenant-picker { display: flex; flex-direction: column; gap: var(--space-2); margin: var(--space-4) 0; }
.tenant-pick-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  width: 100%;
  text-align: left;
  padding: var(--space-4);
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: rgb(var(--sx-surface) / .6);
  color: var(--text);
  font: inherit;
  font-size: var(--font-md);
  cursor: pointer;
}
.tenant-pick-row:hover:not(:disabled) { border-color: var(--cyan); background: rgb(var(--sx-logo) / .12); }
.tenant-pick-row:disabled { opacity: .5; cursor: default; }
.tenant-pick-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
