/* ==========================================================================
   TEMA — lyst og mørkt

   HVORDAN DET HENGER SAMMEN

   nordiva.css ER det lyse temaet. Den er kopiert fra kreatørportalen, og den
   flaten er lys av natur. Dette laget definerer to ting:

     1. et sett FLATETOKENS som begge temaene fyller med hver sine verdier
     2. de mørke verdiene, under :root[data-tema="mork"]

   Grunnen til at det finnes egne flatetokens: første utgave hadde
   rgba(255,255,255,.06) og lignende spredt utover tjue regler. Det virker i
   mørkt tema og blir usynlig i lyst — hvit gjennomsiktighet på hvit flate er
   ingenting. Nå peker hver regel på et token, og temaet avgjør verdien.

   VALGET LAGRES PER NETTLESER, ikke per konto. En som jobber lyst på kontoret
   og mørkt hjemme skal ikke måtte velge om for hver maskin. Se assets/tema.js.

   Uten et lagret valg følger vi systemet, slik alt annet på maskinen gjør.
   ========================================================================== */

/* ==========================================================================
   «hidden» SKAL BETY SKJULT

   Standardregelen for hidden er «display: none», men den taper mot enhver
   annen display-regel. «.btn { display: inline-flex }» gjør at en knapp med
   hidden fortsatt vises — og da står det knapper på skjermen som ikke gjør
   noe når man trykker.

   Denne fella har bitt i dette prosjektet minst ni ganger: valgraden,
   knapperaden, søkekrysset, bolkoverskriften, visningsruta, redigeringen,
   tilbakestill-knappen, fakturastripa, og til slutt «Send til redigereren»
   og WhatsApp-knappen. Hver gang ble den lappet med en ny regel for akkurat
   det elementet.

   Dette er lappen som gjelder alt. De ni enkeltreglene er fjernet.
   ========================================================================== */
[hidden] { display: none !important; }


/* --- LYST: standardverdiene ---------------------------------------------
   Fargene er nordiva.css sine egne. Her navngis bare flatene den bruker, så
   det mørke temaet har noe å bytte ut. */
:root {
  --flate-topp:         rgba(255, 255, 255, .82);
  --flate-meny:         #FFFFFF;
  --flate-meny2:        #FFFFFF;
  --flate-kort:         #FFFFFF;
  --flate-klippkort:    #FFFFFF;
  --flate-bilde:        var(--lodd-flate-3);
  --flate-felt:         #FFFFFF;
  --flate-felt-fokus:   #FFFFFF;
  --flate-knapp:        #FFFFFF;
  --flate-knapp-hover:  var(--lodd-flate-2);
  --flate-svak:         var(--lodd-flate-2);
  --flate-hover:        var(--lodd-flate-3);
  --flate-valgrad:      rgba(255, 255, 255, .95);
  --kant-kort:          var(--line);
  --ink-svak:           var(--lodd-ink-3);

  /* Merkelappene på miniatyrbildene ligger OVER et bilde, ikke over flaten.
     De skal være mørke i begge temaer — hvit tekst på lys plate forsvinner
     mot et lyst klipp. */
  --flate-krukke:       rgba(6, 11, 30, .78);
  --flate-krukke-hover: rgba(6, 11, 30, .92);

  /* Bølgene bak innloggingen. På lys flate må de være mørkere enn bakgrunnen,
     ikke lysere — ellers forsvinner de helt. */
  --bolge-grunn: rgba(14, 27, 77, .10);
  --bolge-lys:   #2A54CF;
  --bolge-glod:  rgba(47, 91, 216, .38);
}

/* --- MØRKT --------------------------------------------------------------- */
:root[data-tema="mork"] {
  /* ===== PALETTEN KOMMER FRA LODD =====================================
     27. september 2026. Portalen og OS-et så ut som to produkter, og det var
     ikke en tilfeldighet: de hadde hvert sitt variabelsett, og de hadde
     drevet fra hverandre. Papiret her var varmt (#F7F6F4, rødt høyest og
     blått lavest) mens OS-ets var nøytralt.

     Nå lastes assets/lodd-tokens.css FØR denne fila. Den har bare verdiene
     fra Lodd, ingen komponentregler, så ingenting kan kollidere med
     nordiva.css. De navnene Lodd og portalen deler, er tatt ut her, slik at
     Lodds verdi står. De navnene bare portalen har, PEKER på et Lodd-token i
     stedet for å gjenta en verdi.

     Regelen videre: en farge skrives ett sted. Skal noe endres, endres det i
     lodd.css i nordiva-os, og del-lodd.sh tar det hit. ================== */

  /* --paper, --line, --ink og --brand er tatt ut: Lodd har dem, med de samme
     navnene, og lodd-tokens.css lastes foer denne fila. --ink var alt
     identisk (#E9EEFB), og det samme var --brand (#4C7DFF). */
  --card:      var(--flate);
  --brand-myk: rgb(var(--brand-rgb) / .14);
  /* Disse tre staar i nordiva.css, som er en laast kopi og lastes ETTER
     lodd-tokens.css. Derfor kan de ikke bare tas ut her: de maa PEKES, og
     tema.css lastes sist. Se lag-tokenfil.py i nordiva-os. */
  --paper: var(--lodd-paper);
  --ink:   var(--lodd-ink);
  --line:  var(--lodd-line);

  --line-mork: var(--line-2);
  --ink-soft:  var(--ink-2);
  --ink-svak:  var(--ink-3);

  /* --brand-mork er IKKE --brand-hover. Portalens er moerkere enn merket,
     Lodds er lysere. Samme jobb, motsatt retning i lyst tema, saa den staar
     som portalens egen til noen har sett paa hva den faktisk brukes til. */
  --brand-mork: #3A66E0;

  /* De lyse statusbakgrunnene fra kreatørportalen blir lysende flekker på
     mørk flate. Her bærer fargen teksten, og bakgrunnen er bare et hint. */
  --green:  #5FD99B;  --green-bg:  rgba(95, 217, 155, .13);  --green-line:  rgba(95, 217, 155, .32);
  --red:    #FF8B8B;  --red-bg:    rgba(255, 139, 139, .13); --red-line:    rgba(255, 139, 139, .32);
  --amber:  #F2C46B;  --amber-bg:  rgba(242, 196, 107, .13); --amber-line:  rgba(242, 196, 107, .32);
  --violet: #A9B6FF;  --violet-bg: rgba(169, 182, 255, .13); --violet-line: rgba(169, 182, 255, .32);

  --shadow:     0 1px 2px rgba(0,0,0,.4), 0 18px 44px rgba(0,0,0,.38);
  --shadow-lav: 0 1px 2px rgba(0,0,0,.35), 0 6px 18px rgba(0,0,0,.3);

  --flate-topp:        var(--lodd-paper);
  --flate-meny:        var(--lodd-flate);
  --flate-meny2:       var(--lodd-flate);
  --flate-kort:        var(--lodd-flate);
  --flate-klippkort:   var(--lodd-flate-2);
  --flate-bilde:       var(--lodd-skjerm);
  --flate-felt:        rgba(255, 255, 255, .045);
  --flate-felt-fokus:  rgba(255, 255, 255, .075);
  --flate-knapp:       rgba(255, 255, 255, .06);
  --flate-knapp-hover: rgba(255, 255, 255, .10);
  --flate-svak:        rgba(255, 255, 255, .05);
  --flate-hover:       rgba(255, 255, 255, .09);
  --flate-valgrad:     rgba(14, 27, 77, .93);
  --kant-kort:         var(--lodd-line);

  --bolge-grunn: rgba(120, 160, 255, .11);
  --bolge-lys:   #9CC0FF;
  --bolge-glod:  rgba(96, 145, 255, .75);
}

/* --- bare i mørkt --------------------------------------------------------
   Lyset i bakgrunnen og den snudde logoen hører til det mørke temaet alene.
   To myke skjær som ligger fast i vinduet, så flaten får dybde uten at noe
   beveger seg mens man jobber. */
:root[data-tema="mork"] body {
  background:
    radial-gradient(1100px 620px at 12% -8%,  rgba(76, 125, 255, .20), transparent 62%),
    radial-gradient(900px  520px at 92% 108%, rgba(76, 125, 255, .11), transparent 60%),
    var(--paper);
  background-attachment: fixed;
}

/* Logoen er marineblå og forsvinner mot marineblått. I lyst tema står den som
   den er — der er den riktig fra før. */
:root[data-tema="mork"] .logo,
:root[data-tema="mork"] .loginlogo { filter: brightness(0) invert(1); }

:root[data-tema="mork"] select { color-scheme: dark; }

/* --- flater som var hvite ------------------------------------------------- */

.topplinje {
  background: var(--flate-topp);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--line);
}

.sidemeny, .bunnmeny, .ark .arkinnhold {
  background: var(--flate-meny);
  border: 1px solid var(--line);
}

.bunnmeny { backdrop-filter: blur(14px); }

/* Tekstfargen på knappene fulgte ikke med da menyen fikk temaets flate.
   nordiva.css gir dem hvit tekst for den blå pilla, og i lyst tema ble det
   hvitt på hvitt: bare det valgte punktet var synlig. Oppdaget 11. september
   2026 i forhåndsvisningen av adminpanelet på telefon. */
.bunnmeny button { color: var(--ink-soft); }

/* Valgt punkt i menyen. Merkefargen som svakt felt, ikke som fyll — et fylt
   punkt i en meny drar blikket vekk fra innholdet det peker på. */
.sidemeny button[aria-current="true"],
.bunnmeny button[aria-current="true"] {
  background: var(--brand-myk);
  color: var(--ink);
}
.sidemeny button:hover, .bunnmeny button:hover { background: var(--flate-svak); }

/* --- felt ----------------------------------------------------------------- */

input, select, textarea {
  background: var(--flate-felt);
  border-color: var(--line);
  color: var(--ink);
}
input:focus, select:focus, textarea:focus {
  border-color: var(--brand);
  background: var(--flate-felt-fokus);
  outline: none;
  box-shadow: 0 0 0 3px rgb(var(--brand-rgb) / .18);
}
input::placeholder, textarea::placeholder { color: var(--ink-svak); }

/* Her sto «select { color-scheme: dark }» uten noen betingelse. Det er en
   rest fra da mørkt var det eneste temaet: i lyst tema fikk man en mørk
   nedtrekksliste midt i en lys side. Regelen finnes allerede lenger oppe,
   riktig avgrenset til [data-tema="mork"]. */

/* --- knapper --------------------------------------------------------------- */

.btn.rolig {
  background: var(--flate-knapp);
  border-color: var(--line);
  color: var(--ink);
}
.btn.rolig:hover {
  background: var(--flate-knapp-hover);
  border-color: var(--line-mork);
}

/* --- kort og striper ------------------------------------------------------- */

.kort, .oppdragskort, .varsel {
  background: var(--flate-kort);
  border: 1px solid var(--line);
}
.oppdragskort:hover { border-color: var(--brand); background: rgb(var(--brand-rgb) / .07); }

.stripe { border-color: var(--line); }

/* Videoruta skal være svart, ikke grå. Alt annet enn svart rundt et klipp
   forskyver hvordan man leser bildet. */
.videoramme { background: #000; border: 1px solid var(--line); }
.videoramme .mangler { color: var(--ink-soft); }

/* --- småting --------------------------------------------------------------- */

.merkepille {
  background: var(--brand-myk);
  color: var(--ink);
  border: 1px solid rgb(var(--brand-rgb) / .3);
}
.brukerchip { background: var(--flate-svak); border: 1px solid var(--line); }
.brukerchip:hover { background: var(--flate-hover); }
.initialer { background: var(--brand); color: #fff; }
.meny2 { background: var(--flate-meny2); border: 1px solid var(--line-mork); }
.meny2 button:hover { background: var(--flate-knapp); }

.tomstat { color: var(--ink-soft); }
.tomstat .ikon svg { opacity: .55; }

.loginbunn, .hint { color: var(--ink-soft); }
.loginskille:before, .loginskille:after { background: var(--line); }

a { color: var(--brand); }
code { background: var(--flate-felt-fokus); color: var(--ink); padding: 2px 6px; border-radius: var(--r-2); }

/* ==========================================================================
   BØLGENE BAK INNLOGGINGEN
   ========================================================================== */

.bolger {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: 0;
  pointer-events: none;
  /* Ligger i #login, som skjules når man er innlogget. Bølgene forsvinner
     dermed av seg selv idet arbeidsflaten åpnes — ingen egen regel for det. */
}

/* Kortet må ligge over.

   «.loginside { z-index: 1 }» var ikke nok. Bølgene er «position: fixed» med
   «z-index: 0», altså et POSISJONERT element, mens kortet var statisk.
   Posisjonerte elementer males over statiske uansett rekkefølge i koden, så
   linjene la seg oppå innloggingen og gjorde teksten urolig å lese.

   Kortet må derfor selv være posisjonert for å komme over. */
.loginside { position: relative; z-index: 1; }
/* Lyslaget ligger paa z-index 0, som bolgene. Kortet maa over begge. */
.loginkort { position: relative; z-index: 2; }
.loginbunn, .loginsprak { position: relative; z-index: 2; }

.bolger .grunn use {
  fill: none;
  stroke: var(--bolge-grunn);
  stroke-width: 1.1;
}

/* LYSET, OG HVORFOR DET IKKE LIGGER I SVG-EN

   Foerste utgave hadde lyspunktene som streker inne i SVG-en, animert med
   «stroke-dashoffset». Det var feil verktoey, og det lot seg ikke redde med
   finjustering. «stroke-dashoffset» er MALING: fjorten baner maatte tegnes
   fullstendig om for hvert bilde. Vi halverte geometrien, smalnet gloeden og
   kuttet fra seksten striper til sju, og det hakket fortsatt, fordi
   omtegningen i seg selv var problemet.

   «transform» males ikke. Skjermkortet flytter et ferdig tegnet lag, og
   koster like lite enten laget er lite og blekt eller stort og glodende.
   Derfor kan lyset her vaere saa langt og saa kraftig som det skal, uten at
   det merkes.

   Slik henger det sammen:

     .bolger        seksten svake linjer i SVG. Tegnes EN gang. Ingen animasjon.
     .bolgelys      et lag med maske formet som de samme seksten linjene.
     .skimmer       tre myke lysflekker inni. De glir; maska klipper dem til
                    traadene. Lys som beveger seg langs linjene, uten at en
                    eneste linje tegnes om.

   Alle tre starter samtidig. Ingen forsinkelser, altsaa ingen striper som
   tennes ovenfra og nedover etter tur. -------------------------------- */

.bolgelys {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
  contain: layout paint style;

  -webkit-mask-image: url(bolger-maske.svg?v=1);
          mask-image: url(bolger-maske.svg?v=1);
  -webkit-mask-size: cover;      mask-size: cover;
  -webkit-mask-position: center; mask-position: center;
  -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat;

  /* Tones inn naar siden er tegnet. Se tema.js. */
  opacity: 0;
  transition: opacity 1.2s ease;
}
.igang .bolgelys { opacity: 1; }

/* BOELGENE

   Tre smale lysbaand som gaar tvers over. Tre valg gjoer at det leses som en
   boelge og ikke som at bakgrunnen blinker:

   SMALE, IKKE BREDE. Foerste utgave var 46, 62 og 38 prosent brede. De
   overlappet hverandre og dekket hele flata samtidig, saa alt lyste likt og
   ingenting saa ut til aa bevege seg. Et baand maa vaere smalere enn flata
   for at man skal se at det passerer.

   LINEAER FART. «ease-in-out» bremser inn og ut ved hver ende. Det leses som
   at noe dukker opp og forsvinner igjen. En boelge holder farten.

   INGEN FELLES PULS. Foer laa det en egen «puste» oppaa som tok hele laget
   fra 45 til 100 prosent styrke. Da lyste og sluknet hele bakgrunnen i takt,
   uansett hvor baandene befant seg. Det var akkurat det som poppet. Lyset
   varierer naa bare fordi baandet flytter seg.

   NEGATIV FORSINKELSE er ikke en detalj: den starter animasjonen et stykke
   uti. Uten den ville alle tre staatt til venstre i det siden aapner, og saa
   krysset skjermen i flokk. Med den ligger de spredt fra foerste bilde. */
.skimmer {
  position: absolute;
  top: -50%;
  height: 200%;
  left: 0;
  background: radial-gradient(closest-side,
              var(--bolge-lys) 0%,
              var(--bolge-glod) 45%,
              transparent 78%);
  will-change: transform;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
}

.skimmer.en  { width: 24%; animation-name: boelge1; animation-duration: 15s; animation-delay:  0s; }
.skimmer.to  { width: 32%; animation-name: boelge2; animation-duration: 23s; animation-delay: -9s; }
.skimmer.tre { width: 19%; animation-name: boelge3; animation-duration: 19s; animation-delay: -14s; }

/* Forskyvningen er i prosent av BAANDETS egen bredde, ikke skjermens. Et
   baand paa 24 prosent maa derfor flytte seg rundt 420 prosent for aa krysse
   hele flata, og litt til i hver ende saa det gaar helt ut av bildet foer det
   begynner paa nytt. Da er hoppet ved omstart usynlig.

   Den lille hellingen foelger baandet linjene ligger i, saa lyset kommer paa
   skraa slik boelgene gjoer. */
@keyframes boelge1 {
  from { transform: translate3d(-120%, -5%, 0) rotate(-5deg); }
  to   { transform: translate3d(540%,   5%, 0) rotate(-5deg); }
}
@keyframes boelge2 {
  from { transform: translate3d(-120%,  6%, 0) rotate(-7deg); }
  to   { transform: translate3d(430%,  -4%, 0) rotate(-7deg); }
}
@keyframes boelge3 {
  from { transform: translate3d(-120%, -8%, 0) rotate(-4deg); }
  to   { transform: translate3d(660%,   8%, 0) rotate(-4deg); }
}

/* Uten maskestoette ville lysflekkene ligget som store blaa skyer over hele
   siden i stedet for aa foelge traadene. Da er det bedre aa la vaere. */
@supports not ((-webkit-mask-image: url(x)) or (mask-image: url(x))) {
  .bolgelys { display: none; }
}

/* Den som har slaatt av bevegelse i systemet skal ikke faa den likevel.
   Traadene staar da opplyst og stille. */
@media (prefers-reduced-motion: reduce) {
  .skimmer { animation: none; }
  .skimmer.en  { transform: translate3d(120%, 0, 0); }
  .skimmer.to  { transform: translate3d(200%, 0, 0); }
  .skimmer.tre { transform: translate3d(380%, 0, 0); }
}

/* ==========================================================================
   KLIPPSØKET — bygget som Drives rutenett

   Målt fra et skjermbilde av Drive, ikke skjønnsmessig lignet:

     kolonner        6 på 1445 px innholdsbredde
     kortbredde      223 px
     kolonneavstand  23 px, radavstand 26 px
     topplinje       37 px, med filmikon og navn
     bilde           211 x 176 px, altså forholdet 6:5
     innrykk         6 px rundt bildet, inne i kortet

   DET AVGJØRENDE ER LIK HØYDE PÅ ALLE KORT. Første utgave lot hvert kort
   beholde klippets eget sideforhold, og et rutenett der 16:9 og 1:1 står ved
   siden av hverandre blir ujevnt. Drive beskjærer i stedet alt til samme
   ramme, og det er derfor øyet kan skanne nedover i rette linjer.

   Formatet går ikke tapt av beskjæringen — det står som merkelapp på bildet.
   ========================================================================== */

.klippnett {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));
  column-gap: 23px;
  row-gap: 26px;
}

.innhold .klippkort {
  /* MÅ være relative. .klippknapper er absolutt plassert og er SØSKEN av
     .klippbilde, ikke barn av den. Uten dette fester knappene seg til nærmeste
     posisjonerte forelder lenger opp i treet, og havner et vilkårlig sted på
     siden — synlig som en løs grå strek nederst på noen kort. */
  position: relative;
  display: block;
  padding: 0 6px 6px;
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  /* Løftet et hakk over --card. I Drive står hvite kort mot lys grå bakgrunn
     og leses som atskilte fliser; mørkeblått på mørkeblått gjør at rutenettet
     flyter sammen til én flate. Litt lysere kort og en synligere kant gir
     samme skille uten å bryte med paletten. */
  background: var(--flate-klippkort);
  border: 1px solid var(--kant-kort);
  border-radius: var(--r-3);
  transition: border-color .13s ease, background .13s ease;
}
.innhold .klippkort + .klippkort { margin-top: 0; }
a.klippkort:hover { border-color: var(--brand); background: rgb(var(--brand-rgb) / .1); }

/* Topplinja: filmikon og navn, som i Drive. Fast høyde, så kortene står i
   linje selv når teksten er kort. */
.klipptopp {
  display: flex;
  align-items: center;
  gap: 8px;
  height: 37px;
  padding: 0 4px;
  font-size: var(--t-3);
  color: var(--ink);
}
.klipptopp svg { width: 16px; height: 16px; flex: none; color: #E5484D; }
.klipptopp span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* 6:5, som målt. object-fit cover beskjærer, slik Drive gjør. */
.klippbilde {
  position: relative;
  display: block;
  aspect-ratio: 6 / 5;
  background: var(--flate-bilde);
  border-radius: var(--r-2);
  overflow: hidden;
}
.klippbilde img { width: 100%; height: 100%; object-fit: cover; display: block; }

.klippformat, .klipptid {
  position: absolute;
  background: rgba(0,0,0,.7);
  color: #fff;
  font-size: var(--t-1);
  padding: 2px 6px;
  border-radius: var(--r-2);
  line-height: 1.4;
}
.klippformat { left: 6px; top: 6px; letter-spacing: .02em; }
.klipptid { right: 6px; bottom: 6px; font-variant-numeric: tabular-nums; }

/* GAMMEL MODELL. Rød kant rundt hele kortet — i et rutenett man skanner raskt
   må advarselen leses som en form, ikke som tekst man rekker å overse. */
.innhold .klippkort.gammel { border-color: var(--red); }
.innhold .klippkort.gammel .klippbilde { box-shadow: inset 0 0 0 2px var(--red); }
.klippgammel {
  position: absolute;
  left: 6px; bottom: 6px;
  background: var(--red);
  color: #fff;
  font-size: var(--t-1);
  font-weight: 600;
  padding: 2px 6px;
  border-radius: var(--r-2);
}

.filterknapp.valgt {
  background: var(--brand);
  border-color: var(--brand);
  color: #fff;
}

/* Ordforslagene. Vises mens man skriver, forsvinner når ordet er ferdig.
   Tallet bak er antall klipp — det gjør valget for deg når to ord ligner. */
.forslagsrad {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 10px 0 0;
}
.forslagsrad:empty { margin: 0; }

/* Forslagene er hint, ikke handlinger. De sto like store som filterknappene
   over dem og konkurrerte om oppmerksomheten — nå leses de som det de er. */
.btn.forslag {
  padding: 3px 10px;
  font-size: var(--t-2);
  min-height: 0;
  border-radius: 999px;
  font-weight: 500;
}
.forslagtall {
  opacity: .45;
  font-size: var(--t-2);
  font-variant-numeric: tabular-nums;
  margin-left: 3px;
}
.forslagsrad { gap: 5px; margin-top: 8px; }

/* --- valg og nedlasting ------------------------------------------------- */

/* Knappene ligger over bildet og kommer fram når musa er på kortet. På
   berøringsskjerm finnes ingen hover, så der står de alltid synlige — en
   knapp man ikke kan få øye på er ingen knapp. */
/* ALLTID SYNLIGE.

   Første utgave viste dem bare ved hover. Det er ryddig, og det er feil: en
   nedlastingsknapp man må lete etter med musa er en knapp folk ikke vet
   finnes — og på berøringsskjerm finnes hover ikke i det hele tatt.

   De er dempet til man er borti kortet, så de ikke konkurrerer med bildet. */
.klippknapper {
  position: absolute;
  right: 12px;
  top: 43px;
  display: flex;
  gap: 5px;
  opacity: .82;
  transition: opacity .12s ease;
}
.klippkort:hover .klippknapper,
.klippkort:focus-within .klippknapper,
.klippkort.valgt .klippknapper { opacity: 1; }

.kruk {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px; height: 28px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  cursor: pointer;
  background: var(--flate-krukke);
  color: #fff;
  backdrop-filter: blur(6px);
}
.kruk:hover { background: var(--flate-krukke-hover); }
.kruk svg { width: 15px; height: 15px; }
.kruk.velg.pa { background: var(--brand); }

/* Valgt kort: full ramme i merkefargen, så man ser hva som er plukket ut når
   man scroller nedover i et rutenett med seksti kort. */
.innhold .klippkort.valgt {
  border-color: var(--brand);
  box-shadow: 0 0 0 1px var(--brand);
}

/* Handlingslinja. Klistrer seg til toppen når man scroller, ellers må man
   tilbake opp for å laste ned det man nettopp valgte lenger nede. */
/* hidden MÅ vinne over display:flex.

   Dette er fella fra kreatørprosjektets STATUS.md, og den tok oss her også:
   «Vis større»-knappen ble skjult med hidden, men .storknapp satte
   display:block, og en eksplisitt display slår hidden-attributtet. Knappen
   ble stående synlig uten å gjøre noe.

   Her sto handlingslinja framme med «Last ned» og «Fjern valg» før noe var
   valgt i det hele tatt. */

.valgrad {
  position: sticky;
  top: 8px;
  z-index: 5;
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin: 0 0 14px;
  padding: 11px 14px;
  background: var(--flate-valgrad);
  backdrop-filter: blur(10px);
  border: 1px solid var(--brand);
  border-radius: var(--r-2);
}
.valgrad > span:first-child { font-weight: 600; margin-right: auto; }
.valgrad .btn { padding: 8px 15px; font-size: var(--t-4); }

/* KLIPPSKJERMEN BRUKER HELE BREDDEN

   Alle andre skjermer har en lesespalte med tak, og det er riktig: brødtekst
   som går over hele en bred skjerm er tung å lese, fordi øyet mister linja på
   vei tilbake til venstre.

   Et rutenett med miniatyrbilder har ikke det problemet. Der er taket bare
   bortkastet plass — man ser fire klipp der det var rom for åtte. Drive
   bruker hele vinduet, og det er hele grunnen til at man finner fram i det.

   Derfor: taket bort, og la kolonnene fylle det som finnes. */
#skjerm-klipp .wrap { max-width: none; }

/* Samme felle, samme sted: .knapperad er også display:flex, så «Vis flere»-
   knappen ville stått framme selv når alt var vist. */

/* --- søkefeltet ----------------------------------------------------------
   nordiva.css gir width:100% til text, email, tel, url og date — men ikke til
   type=search. Derfor sto feltet som en liten boks på 150 px i stedet for å
   fylle kortet. Her settes det eksplisitt.

   Feltet er dessuten den viktigste kontrollen på hele skjermen: 844 klipp
   finnes ikke ved å bla. Det skal se ut som et søkefelt på avstand. */
.sokefelt {
  position: relative;
  display: flex;
  align-items: center;
}
.sokefelt .sokikon {
  position: absolute;
  left: 20px;
  width: 21px; height: 21px;
  color: var(--ink-soft);
  pointer-events: none;
}
.innhold .sokefelt input[type=search] {
  width: 100%;
  font: inherit;
  font-size: var(--t-5);
  min-height: 58px;
  padding: 16px 52px 16px 52px;
  border: 1.5px solid var(--line);
  border-radius: 999px;
  background: var(--flate-svak);
  color: var(--ink);
  -webkit-appearance: none;
  appearance: none;
}
.innhold .sokefelt input[type=search]::-webkit-search-cancel-button { display: none; }
.innhold .sokefelt input[type=search]:focus {
  border-color: var(--brand);
  background: var(--flate-felt-fokus);
  outline: none;
  box-shadow: 0 0 0 4px rgb(var(--brand-rgb) / .16);
}
.sokstryk {
  position: absolute;
  right: 14px;
  width: 30px; height: 30px;
  border: 0; border-radius: 50%;
  background: var(--flate-hover);
  color: var(--ink);
  /* Sentreres med flex, ikke med line-height: 1. Det siste virker for ett
     tegn, men arver nedover og gjør enhver tekst inni knappen uleselig. */
  display: inline-flex; align-items: center; justify-content: center;
  font-size: var(--t-6);
  cursor: pointer;
}
.sokstryk:hover { background: var(--flate-hover); }

.skjultetikett {
  position: absolute; width: 1px; height: 1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}

.velgerad { align-items: center; margin: 0; }

/* Søkeblokka tok over 400 px før første klipp kom til syne. Den er et verktøy,
   ikke innholdet — klippene skal begynne høyt oppe på skjermen. */
#skjerm-klipp .kort { padding: 16px 18px; }
#skjerm-klipp .kort .knapperad { margin: 12px 0 0; gap: 8px; }
#skjerm-klipp .kort .knapperad .btn { padding: 9px 16px; font-size: var(--t-4); }
#skjerm-klipp h1 { margin-bottom: 4px; }
#skjerm-klipp .lead { margin-bottom: 14px; }
#klipp-teller { margin: 14px 0 10px; }

/* ==========================================================================
   INNHOLDET FORANKRES TIL VENSTRE

   nordiva.css sentrerer lesespalta med «margin: 0 auto». Det er riktig for
   kreatørportalen, som er en side man LESER: en spalte midt på skjermen med
   luft rundt er behagelig for løpende tekst.

   Dette er et adminpanel. Her ligger det en meny til venstre, og da leses
   sentrert innhold som «halvveis plassert» — overskriften starter fem hundre
   piksler fra menyen, med tomrom på begge sider og ingen tydelig venstrekant.

   Drive, Shopify og Linear gjør alle det samme: innholdet begynner der menyen
   slutter. Øyet får én venstrekant å forholde seg til nedover hele siden.

   Taket beholdes, men litt høyere enn 740: skjemaer og vurderingskort tåler
   mer bredde enn brødtekst gjør.
   ========================================================================== */

.innhold .wrap {
  margin-left: 0;
  margin-right: auto;
  max-width: 980px;
}

/* Tomme tilstander sentrerte seg i spalta og havnet dermed enda lenger til
   høyre. De hører til venstre som alt annet, og de trenger ikke halve skjermen
   i høyde heller. */
.innhold .tomstat {
  text-align: left;
  align-items: flex-start;
  padding: 26px 0;
  max-width: 46em;
}
.innhold .tomstat .ikon { margin-left: 0; }

/* Klippskjermen er unntaket: der er det et rutenett, og det skal ha alt. */
#skjerm-klipp .wrap { max-width: none; }

/* .rad settes til display:block et sted i nordiva.css, og da faller
   statuslappen ned under teksten i stedet for å stå til høyre. Vi setter den
   eksplisitt for kortene i adminflaten framfor å lete etter regelen som vant —
   den kan endre seg neste gang designsystemet oppdateres. */
.innhold .kort > .rad,
.innhold .stripe > .rad {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  padding: 0;
  flex-wrap: wrap;
}
.innhold .kort > .rad > .venstre { flex: 1 1 260px; min-width: 0; }
.innhold .kort > .rad > .hoyre { flex: 0 0 auto; text-align: right; }

/* --- dra for å velge ------------------------------------------------------ */

.dragramme {
  position: fixed;
  z-index: 40;
  pointer-events: none;
  background: rgb(var(--brand-rgb) / .16);
  border: 1px solid var(--brand);
  border-radius: var(--r-1);
}

/* Mens man drar skal ingenting markeres som tekst, og musepekeren skal ikke
   bytte til «lenke» over hvert kort den passerer. */
body.drar, body.drar * {
  user-select: none;
  -webkit-user-select: none;
  cursor: crosshair !important;
}

/* Hjelpeteksten under filtrene forklarer de tre måtene. */

/* «Vis flere» klemte seg inntil siste rad, venstrestilt under et halvtomt
   rutenett. Den er en avslutning på lista og hører midt under den, med luft
   nok til at den ikke leses som enda et kort. */
#klipp-mer-rad {
  justify-content: center;
  margin: 30px 0 8px;
}
#klipp-mer-rad .btn { padding: 12px 28px; }

/* --- bunnlinje ------------------------------------------------------------
   Én rolig linje som avslutter siden. Uten den slutter innholdet bare midt i
   ingenting, og en lang liste ser ut som den er kuttet av. */
.appbunn {
  /* Samme innrykk som .wrap, så bunnlinja står i linje med overskriftene
     over. Uten det starter den 24 px lenger til venstre enn alt annet, og
     hele siden mister venstrekanten sin helt nederst. */
  margin: var(--luft-5) 0 0;
  padding: 22px 24px 30px;
  max-width: 980px;
  border-top: 1px solid var(--line);
  color: var(--ink-soft);
  font-size: var(--t-3);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px 18px;
}
.appbunn a { color: var(--ink-soft); text-decoration: underline; }
.appbunn a:hover { color: var(--brand); }
/* «prikk» er tellermerket i menyen — et gult pilleformet tall. Bunnlinjas
   skilletegn lånte samme klasse, og arvet dermed en farge og en form det
   ikke skulle hatt. Skilletegnet heter «skille» nå, og er dessuten skjult
   for skjermlesere: det er tegnsetting, ikke innhold. */
.appbunn .skille { opacity: .4; }

/* --- topplinja i hjørnene -------------------------------------------------
   .wrap.bred sentrerer med maksbredde, og på en bred skjerm havnet logoen
   flere hundre piksler inn fra venstre kant mens brukerchipen sto like langt
   inn fra høyre. Det leses som at linja «flyter» midt på skjermen.

   En topplinje er ramme, ikke innhold. Den skal spenne hele vinduet, med
   logoen i venstre hjørne og brukeren i høyre — slik Drive, Shopify og alt
   annet med en toppmeny gjør det. */
.topplinje .wrap {
  max-width: none;
  padding-left: 22px;
  padding-right: 22px;
}

/* «Vis flere» sto tett inntil siste rad med klipp. Den avslutter lista og
   trenger tydelig avstand oppover, ellers leses den nesten som enda et kort. */
#klipp-mer-rad {
  justify-content: center;
  margin: 54px 0 10px;
}

/* --- temabryteren ---------------------------------------------------------
   En rund knapp i topplinja, som hos TIHLDE. Sola vises i mørkt tema (trykk
   for lys), månen i lyst. Ikonet viser hva du får, ikke hva du har — det er
   den tolkningen folk gjetter på først.

   Den ligger til venstre for brukerchipen, fordi den hører til flaten og ikke
   til kontoen. Valget lagres i nettleseren, ikke på kontoen: en som jobber
   lyst på kontoret og mørkt hjemme skal slippe å velge om hver gang. */
.temabryter {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px; height: 38px;
  border-radius: 50%;
  border: 1px solid var(--line);
  background: var(--flate-svak);
  color: var(--ink);
  cursor: pointer;
  padding: 0;
  margin-right: 10px;
}
.temabryter:hover { background: var(--flate-hover); }
.temabryter svg { width: 18px; height: 18px; }
.temabryter .sol { display: none; }
:root[data-tema="mork"] .temabryter .sol  { display: block; }
:root[data-tema="mork"] .temabryter .mane { display: none; }

/* --- folk ----------------------------------------------------------------
   Kortet er én rad: bilde, tekst, status. Samme geometri uansett hvor mye som
   står i midten, så bunnlinja ikke danser nedover lista. */

.innhold .personkort {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 16px 20px;
}

.persontekst {
  display: flex;
  flex-direction: column;
  gap: 1px;
  flex: 1;
  min-width: 0;
}
.personnavn { font-weight: 600; font-size: var(--t-5); }
.persontekst .hint { margin: 0; font-size: var(--t-3); }

.personhoyre {
  display: flex;
  align-items: center;
  gap: 16px;
  flex: none;
}

/* Initialen som profilbilde. Fargen utledes av e-postadressen, så samme
   person får samme farge hver gang — det er den som gjør at øyet kjenner
   igjen raden før det har lest noe. */
.personmerke {
  display: flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 40px; height: 40px;
  border-radius: 50%;
  color: #fff;
  font-weight: 700;
  font-size: var(--t-5);
}

/* Invitasjonsfeltene på én linje. Tre korte felt under hverandre gjorde
   skjemaet dobbelt så høyt som det trengte. */
.feltrad { display: flex; flex-wrap: wrap; gap: 14px; }
.feltrad .felt { flex: 1 1 220px; margin: 0; }
.feltrad .felt.smal { flex: 0 1 190px; }

/* EN FELTRAD MÅ HA PUST UNDER SEG

   «.feltrad .felt { margin: 0 }» over fjerner margen på feltene, fordi radens
   gap tar over INNENFOR raden. Men gap gjelder ikke UNDER raden.

   Regelen som ga den margen sto scopet til «.oppdragskjema», og
   invitasjonsskjemaet er ikke det. Resultatet var null piksler mellom
   telefonhintet og «Send invitasjon»-knappen. Målt til 0 px.

   Her gjelder den for alle feltrader. Den siste i en beholder trenger den
   ikke, for da tar beholderens egen bunn over. */
.feltrad { margin-bottom: var(--luft-3); }
.feltrad:last-child { margin-bottom: 0; }

/* --- bolker og tomme tilstander -------------------------------------------
   En bolkoverskrift må leses som en ny del av siden, ikke som enda en linje
   tekst. Litt luft over, en tynn strek, og mindre skrift enn h1.

   Den tomme tilstanden lå løs mellom knappen og neste bolk, uten ramme rundt.
   Nå står den i en stiplet flate: den ser ut som en plass som venter på
   innhold, ikke som noe som falt ut av layouten. */
.innhold h2.bolk {
  margin: var(--luft-4) 0 var(--luft-2);
  padding-top: var(--luft-2);
  border-top: 1px solid var(--line);
  font-size: var(--t-5);
  letter-spacing: .01em;
  color: var(--ink-soft);
  text-transform: uppercase;
}

.innhold .tomstat {
  text-align: left;
  align-items: flex-start;
  padding: 30px 24px;
  max-width: none;
  border: 1px dashed var(--line-mork);
  border-radius: var(--r-3);
  background: var(--flate-svak);
}
.innhold .tomstat .ikon { margin-left: 0; }
.innhold .tomstat p { max-width: 46ch; }

/* --- lys modus: det som trengte en hånd -----------------------------------
   Merkepillen og brukerchipen i topplinja hadde nok kontrast mot mørk flate,
   men ble nesten usynlige mot lys. */
:root[data-tema="lys"] .merkepille {
  background: var(--brand);
  color: #fff;
  border-color: transparent;
}
:root[data-tema="lys"] .brukerchip { border-color: var(--line-mork); }
:root[data-tema="lys"] .sidemeny,
:root[data-tema="lys"] .bunnmeny { box-shadow: var(--shadow-lav); }
:root[data-tema="lys"] .topplinje { border-bottom-color: var(--line-mork); }

/* Kortene trenger en synlig kant på lys flate — hvitt på nesten hvitt
   forsvinner, motsatt problem av det mørke temaet hadde. */
:root[data-tema="lys"] .innhold .kort,
:root[data-tema="lys"] .innhold .klippkort { border-color: var(--line-mork); }

/* ==========================================================================
   FORHÅNDSVISNINGEN
   ========================================================================== */

.visrute {
  position: fixed;
  inset: 0;
  z-index: 60;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 28px;
}

/* Bakteppet demper flaten bak uten å svartlegge den — man skal fortsatt se at
   rutenettet ligger der, så det er tydelig at dette er et lag og ikke en ny
   side. Klikk her lukker. */
.visbakgrunn {
  position: absolute;
  inset: 0;
  background: rgba(3, 6, 18, .74);
  backdrop-filter: blur(3px);
}

.viskort {
  position: relative;
  display: flex;
  flex-direction: column;
  width: min(1000px, 100%);
  max-height: 100%;
  background: var(--card);
  border: 1px solid var(--line-mork);
  border-radius: var(--r-3);
  box-shadow: var(--shadow);
  overflow: hidden;
}

.vistopp {
  display: flex;
  align-items: flex-start;
  gap: 16px;
  padding: 18px 22px;
  border-bottom: 1px solid var(--line);
}
.vistekst { flex: 1; min-width: 0; }
.vistopp h2 { margin: 0 0 3px; font-size: var(--t-5); line-height: 1.35; }
.vistopp h2::first-letter { text-transform: uppercase; }
.vistopp .hint { margin: 0; font-size: var(--t-3); }
.vislukk { flex: none; width: 34px; height: 34px; }

/* Svart bak spilleren. Alt annet enn svart rundt et klipp forskyver hvordan
   man leser bildet — samme grunn som at redigeringsprogrammer er mørke. */
.visfilm {
  background: #000;
  aspect-ratio: 16 / 9;
  max-height: 62vh;
  display: flex;
  align-items: center;
  justify-content: center;
}
.visfilm iframe { width: 100%; height: 100%; border: 0; display: block; }

/* Vaar egen spiller erstattet Drives innebygde. «contain» fordi katalogen
   har baade 16:9, 1:1 og staaende klipp, mens ruta er 16:9. Uten den ville
   et staaende klipp blitt beskaaret paa midten. */
.visfilm video {
  width: 100%; height: 100%; display: block;
  object-fit: contain; background: #000;
}
.visfilm .hint { color: var(--ink-soft); margin: 0; padding: 20px; }

.visbunn {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 16px 22px;
  border-top: 1px solid var(--line);
  flex-wrap: wrap;
}
.visbunn .btn { padding: 10px 18px; font-size: var(--t-4); }
.visbunn .btn:disabled { opacity: .4; cursor: default; }
.visteller { margin: 0 auto 0 6px; font-variant-numeric: tabular-nums; }

/* Ingen scrolling bak ruta. Uten dette ruller rutenettet under fingeren mens
   man ser på en video, og man mister plassen sin i lista. */
body.viser { overflow: hidden; }

/* Kortet er en <button> nå, ikke en <a>. Nettleserens egen knappestil må bort. */
.innhold button.klippkort {
  font: inherit;
  color: inherit;
  text-align: left;
  cursor: pointer;
}

/* Adminens rettefelt i forhåndsvisningen. Ligger mellom spilleren og
   handlingene, med en tydelig skillelinje — det er en annen slags handling
   enn å laste ned, og skal ikke forveksles med den. */
.visredigering {
  padding: 16px 22px;
  border-top: 1px solid var(--line);
  background: var(--flate-svak);
}
.visredigering .felt { margin: 0 0 12px; }
.visredigering label { font-size: var(--t-3); margin-bottom: 6px; }
.visredigering textarea { min-height: 0; font-size: var(--t-4); padding: 10px 14px; }
.visredigering .hint { margin: 6px 0 0; font-size: var(--t-3); }
.visredigering .knapperad { margin: 0; align-items: center; gap: 10px; }
.visredigering .btn { padding: 8px 16px; font-size: var(--t-3); }
#vis-lagret { margin: 0; }

/* --- bunnlinja holder seg nederst ------------------------------------------
   Bunnlinja lå et halvt vindu for langt nede på korte sider, og på hver
   eneste side kunne man rulle sytti piksler på noe som skulle fylt skjermen.

   Årsaken var ikke bunnlinja. .appramme har «min-height: 100vh» fra 900 px og
   opp, og topplinja ligger OVER den, ikke inni. Dokumentet ble derfor alltid
   ett vindu PLUSS topplinjas høyde — nøyaktig de sytti pikslene.

   Fristelsen er å trekke fra en høyde: «calc(100vh - 71px)». Det tallet er
   løgn i det øyeblikket topplinja endrer skriftstørrelse, får en knapp til,
   eller brytes over to linjer på en smal skjerm. Vi lar heller flex regne det
   ut: #ramme fyller vinduet, .appramme tar det som er igjen etter topplinja,
   og bunnlinja skyves ned med «margin-top: auto». Ingen høyde å måle,
   ingenting å holde i synk.
   -------------------------------------------------------------------------- */
#ramme {
  display: flex;
  flex-direction: column;
  min-height: 100dvh;
}
#ramme > .appramme { flex: 1 0 auto; }

/* Under 900 px er .appramme en vanlig blokk, og en blokk strekker ikke barnet
   sitt. Over 900 px er den et rutenett, og der strekker radene seg av seg selv
   — men da må «min-height: 100vh» vekk, ellers er vi tilbake til ett vindu
   pluss topplinja. */
@media (max-width: 899.98px) {
  #ramme > .appramme { display: flex; flex-direction: column; }
}
@media (min-width: 900px) {
  #ramme > .appramme { min-height: 0; }
}

.innhold {
  display: flex;
  flex-direction: column;
  flex: 1 0 auto;
  min-width: 0;
}
.innhold > .skjerm.pa { flex: 1 0 auto; }
.innhold > .appbunn { margin-top: auto; }

/* Skjermene har 110 px bunnluft for å komme klar av den flytende bunnmenyen.
   Menyen finnes bare på smal skjerm; på bred sto de 110 pikslene igjen som et
   tomrom mellom innholdet og bunnlinja. */
@media (min-width: 821px) {
  .innhold > .skjerm { padding-bottom: var(--luft-5); }
}


/* ==========================================================================
   TIL FAKTURERING — linjelista

   Beløp leses nedover, ikke bortover. Derfor står de høyrestilt i én kolonne
   med «tabular-nums», så sifrene får samme bredde og tusenskillene havner
   rett over hverandre. Med vanlige tall gjør ikke 1-tallet det, og en kolonne
   med kroner ser skjev ut uten at man ser hvorfor.
   ========================================================================== */

.sumtall {
  font-size: var(--t-8);
  font-weight: 700;
  letter-spacing: -.01em;
  font-variant-numeric: tabular-nums;
  margin: 0 0 var(--luft-2);
  color: var(--ink);
}

.honorarliste {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--line);
}

.honorarlinje {
  display: grid;
  grid-template-columns: 2.2rem minmax(0, 1fr) auto;
  align-items: baseline;
  /* Under 520 px flyttes beløpet til egen rad. Med null radavstand la det
     seg da inntil tittelen over. */
  gap: 4px 14px;
  padding: 13px 0;
  border-bottom: 1px solid var(--line);
}

.honorarlinje .nr {
  font-size: var(--t-3);
  font-variant-numeric: tabular-nums;
  color: var(--ink-svak);
}

.honorarlinje .tittel { min-width: 0; color: var(--ink); }

.honorarlinje .belop {
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  white-space: nowrap;
  color: var(--ink);
}

/* Ikke godkjent ennå. Dempet, ikke skjult — hun skal se hva som er på vei
   uten å tro at det kan faktureres. */
.honorarlinje.dempet .tittel,
.honorarlinje.dempet .belop { color: var(--ink-soft); font-weight: 500; }

@media (max-width: 520px) {
  .honorarlinje {
    grid-template-columns: 2.2rem minmax(0, 1fr);
    row-gap: 2px;
  }
  .honorarlinje .belop { grid-column: 2; }
}

/* --- oppdragskortet -------------------------------------------------------
   Tre linjer under tittelen, hver med sin jobb: hva oppdraget er (format,
   lengde, honorar), og hvor det står. De sto tidligere klemt sammen i én
   «.hint», og da var det ikke til å se hva som var hva.
   -------------------------------------------------------------------------- */
.kortmeta {
  margin: 6px 0 0;
  font-size: var(--t-4);
  color: var(--ink-soft);
  font-variant-numeric: tabular-nums;
}
.kortmeta .skille { opacity: .6; margin: 0 3px; }

.kortstatus {
  margin: 12px 0 0;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px 10px;
}
.kortstatus .hint { margin: 0; }

/* «Velg alle som vises» og tipset i valgraden. Begge er sekundære: de skal
   kunne finnes, ikke konkurrere med filtrene over eller «Last ned» ved siden. */
#klipp-velg-alle { padding: 0; margin: 0; font-size: var(--t-4); }
.valgrad-tips { margin: 0; color: var(--ink-svak); }

@media (max-width: 560px) {
  /* På smal skjerm er valgraden allerede full av knapper. Tipset gjelder en
     musebevegelse som ikke finnes på berøring, og går derfor ut. */
  .valgrad-tips { display: none; }
}

/* Knappen og hjelpeteksten sto på samme linje og løp sammen til én setning:
   «Velg alle som vises (6) Dra over klippene for å velge flere ...». Hjelpen
   har fått sin egen linje. */
#klipp-velg-alle { display: inline-block; }
#klipp-hjelp { margin: 10px 0 0; line-height: 1.55; }
#klipp-hjelp b { color: var(--ink); font-weight: 600; }

/* ==========================================================================
   NAVIGASJONEN I MELLOMROMMET — 821 til 899 piksler

   nordiva.css skjuler knappene i sidemenyen fra 899 px og nedover, og viser
   bunnmenyen fra 820 px og nedover. Mellom de to tallene ligger et bånd på
   79 piksler der INGEN av delene vises: en halvbred nettleser på en laptop,
   en iPad på tvers. Der sto redigereren igjen uten en eneste vei mellom
   fanene, og med en tom hvit stripe der menyen skulle vært — den viste bare
   ordet «OPPDRAG» og ellers ingenting.

   nordiva.css er en ordrett kopi fra kreatørportalen og rettes ikke her (se
   README). Båndet lukkes derfor herfra: i mellomrommet legger vi menyen som
   en vannrett rad. Sidemenyen ER allerede en rad der — nordiva.css setter
   «flex-direction: row» — den mangler bare knappene og formen på dem.
   ========================================================================== */

@media (min-width: 821px) and (max-width: 899px) {
  .sidemeny > button {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    font: inherit;
    font-size: var(--t-4);
    font-weight: 600;
    padding: 9px 14px;
    border: 1px solid transparent;
    border-radius: 999px;
    background: none;
    color: var(--ink-soft);
    cursor: pointer;
  }
  .sidemeny > button:hover { background: var(--flate-svak); color: var(--ink); }
  .sidemeny > button[aria-current="true"] {
    background: var(--brand-myk);
    border-color: var(--brand);
    color: var(--ink);
  }
  .sidemeny .menytittel {
    /* Overskriften «OPPDRAG» over en vannrett rad er bare støy. */
    display: none;
  }
  .sidemeny { gap: 6px; }

  /* Kantstreken til venstre for valgt punkt flukter med kanten av en
     LODDRETT meny. I en vannrett rad står den igjen som en løs blå strek
     ute i margen. nordiva.css slår den av på samme vis inne i Shopify,
     der menyen også er en rad. */
  .sidemeny > button[aria-current="true"]::before { display: none; }

  /* Telleren skyves ellers helt ut til høyre av «margin-left: auto», som
     er riktig i en loddrett meny og feil i en rad. */
  .sidemeny > button .prikk { margin-left: 2px; }
}

/* Under 821 px overtar bunnmenyen, og da er stripa igjen tom. Den ble
   stående som en hvit boks på 65 piksler med ordet «OPPDRAG» i — det ser ut
   som noe som ikke ble ferdig lastet. */
@media (max-width: 820px) {
  #ramme > .appramme > .sidemeny { display: none; }
}

/* Videoruta uten video. Ramma holder 9:16 fordi den vanligvis inneholder et
   stående klipp — men når det ikke ligger noe der, ble beskjeden «Ingen video
   her ennå» stående midt i et halvt hundre piksler høyt svart felt. Tomrommet
   sier ingenting, og det ser ut som noe som aldri ble ferdig lastet. Uten
   video har ramma bare den høyden teksten trenger. */
/* Ramma uten film. Regelen sto paa «:not(:has(iframe))» fra den gang
   forhaandsvisningen VAR et Drive-iframe. Etter at spilleren ble vaar egen
   fantes det ingen iframe noe sted, og da traff den hver eneste video: alle
   ble stiplede tomme ruter. Nå ser den etter det den faktisk gjelder. */
.videoramme:has(.mangler) {
  aspect-ratio: auto;
  min-height: 0;
  background: var(--flate-svak);
  border-style: dashed;
}
.videoramme:has(.mangler) .mangler {
  position: static;
  inset: auto;
  padding: 26px 22px;
  color: var(--ink-soft);
}
.videoramme:has(.mangler) .mangler b { color: var(--ink); }

/* ==========================================================================
   FAKTURERING

   Samme grep som linjelista på redigererens egen side: beløp høyrestilt i én
   kolonne med «tabular-nums», så tusenskillene står rett over hverandre.
   Her er linja i tillegg en avkryssingsboks, fordi én faktura dekker flere
   oppdrag og de skal kunne merkes i én bevegelse.
   ========================================================================== */

.fakturakort + .fakturakort { margin-top: var(--luft-3); }

.fakturatopp {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 4px 16px;
  margin: 0 0 var(--luft-2);
}
.fakturatopp h2 { margin: 0; }

.fakturasum {
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--amber);
  white-space: nowrap;
}
.fakturasum.ferdig { color: var(--ink-svak); font-weight: 500; }

.fakturaliste {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--line);
}

.fakturalinje {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  /* Under 520 px flyttes beløpet til egen rad — se mediespørringen under.
     Med null radavstand la det seg da inntil tittelen. */
  gap: 4px 12px;
  padding: 8px 8px;
  margin: 0 -8px;
  border-bottom: 1px solid var(--line);
  border-radius: var(--r-2);
}
/* Uten avkryssingsboks mangler første kolonne. Da skal ikke tittelen henge
   igjen i kolonne to med et tomt felt foran seg. */
.fakturalinje > .tittel:first-child { grid-column: 1 / 3; }

.fakturalinje input[type=checkbox] {
  width: 18px;
  height: 18px;
  accent-color: var(--brand);
  cursor: pointer;
  margin: 0;
}

/* Etiketten er klikkflaten. Uten polstringen her er det bare de 18 pikslene
   i avkryssingsboksen som treffer, og da bommer man på en liste man skal
   gjennom raskt. */
.fakturalinje .tittel {
  min-width: 0;
  padding: 9px 0;
  color: var(--ink);
  cursor: pointer;
}
.fakturalinje span.tittel { cursor: default; }
.fakturalinje .nr {
  font-variant-numeric: tabular-nums;
  color: var(--ink-svak);
  margin-right: 4px;
}
.fakturalinje .belop {
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  white-space: nowrap;
  color: var(--ink);
}
.fakturalinje.valgt { background: var(--brand-myk); }

/* Historikken er sammenslått. Den skal kunne slås opp i, ikke leses hver dag. */
.fakturahistorikk { margin: var(--luft-2) 0 0; }
.fakturahistorikk > summary {
  cursor: pointer;
  color: var(--ink-soft);
  font-size: var(--t-4);
  padding: 8px 0;
  font-variant-numeric: tabular-nums;
}
.fakturahistorikk > summary:hover { color: var(--ink); }
.fakturabunt { margin: var(--luft-2) 0 0; }
.fakturabunthode {
  display: flex;
  align-items: baseline;
  gap: 8px;
  margin: 0 0 2px;
  font-size: var(--t-4);
}
.fakturabunthode .belop { margin-left: auto; font-variant-numeric: tabular-nums; }
.fakturabunt .fakturaliste { border-top: 0; }
.fakturabunt .tilbake { padding: 8px 0 0; font-size: var(--t-4); }

/* Handlingsstripa nederst. Her er «.stripe» brukt til det den faktisk er:
   en fast rad med en handling i, ikke en linje i en liste. */
#fakturastripe input[type=date] {
  /* Uten en basis her sluker datofeltet hele bredden og skyver knappene ned
     på sin egen rad. Fakturanummeret er det som trenger plass; datoen har en
     kjent, fast lengde. */
  flex: 0 1 180px;
  min-height: 44px;
  padding: 10px 14px;
  font: inherit;
  font-size: var(--t-4);
  border-radius: var(--r-2);
  border: 1px solid rgba(255, 255, 255, .45);
  background: rgba(255, 255, 255, .12);
  color: #fff;
  color-scheme: dark;
}
#faktura-sum { font-variant-numeric: tabular-nums; opacity: .85; }
#fakturastripe input[type=text] { flex: 1 1 200px; }

@media (max-width: 560px) {
  .fakturatopp { flex-direction: column; align-items: flex-start; }
}

/* Språkbryteren. Samme form og vekt som temabryteren ved siden av — de gjør
   samme slags jobb, og skal se ut som ett par, ikke som to påfunn. */
.sprakbryter {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 38px;
  height: 38px;
  padding: 0 10px;
  border-radius: 999px;
  border: 1px solid var(--line);
  background: var(--flate-knapp);
  color: var(--ink-soft);
  font: inherit;
  font-size: var(--t-2);
  font-weight: 700;
  letter-spacing: .06em;
  cursor: pointer;
}
.sprakbryter:hover { color: var(--ink); border-color: var(--brand); }

/* Versjonene under et oppdrag. Samme opprydding som på faktureringssiden:
   de sto i «.stripe», som er handlingsstripa — sticky, merkefarget, hvit
   tekst — og hver versjon ble derfor en blå slabb med usynlig dato. */
.versjonslinje {
  padding: 12px 0;
  border-bottom: 1px solid var(--line);
}
.versjonslinje:last-child { border-bottom: 0; padding-bottom: 0; }
.versjonslinje > p { margin: 0; }
.versjonslinje > p + p { margin-top: 6px; }

/* Slippflatene i oppdragsskjemaet er lavere enn ellers.

   De sto med full polstring og fylte en tredjedel av skjermen hver. En
   slippflate skal vaere lett aa treffe, ikke stor aa se paa: det er filene
   under som er innholdet. Klikkflata paa knappen er urort. */
.oppdragskjema .slippflate { padding: var(--luft-2) var(--luft-2); }
.oppdragskjema .slippflate .slipptekst { margin: 0 0 2px; font-size: var(--t-5); }
.oppdragskjema .slippflate .hint { margin: 0 0 10px; }

.slippflate.smal { padding: var(--luft-2); }
.slippflate.smal .slipptekst { font-size: var(--t-5); }

/* «Eller skriv det inn her» hoerer til feltet UNDER seg, ikke over. Derfor
   staar den tett paa tekstfeltet og med luft over.

   KLASSEN ALENE HOLDT IKKE. «.felt .hint» lenger nede i fila veier tyngre
   (0,2,0 mot 0,1,0) og satte margin-top til 6 px og bunnen til 0. Lufta over
   forsvant, og teksten klistret seg til slippflata. Målt til 0 px mellom dem.

   Derfor står klassen sammen med «.felt .hint» her, saa den vinner. */
.felt .hint.scriptalternativ,
.scriptalternativ {
  margin: var(--luft-3) 0 8px;
  color: var(--ink-soft);
}

/* ==========================================================================
   FORMATVELGEREN

   Formatet sto som et fritt tekstfelt, og da blir det «9:16» én gang og
   «9x16» den neste. Nå er det fem knapper, og figuren i hver av dem har
   nøyaktig det formatet den beskriver. Høyden er fast, bredden følger
   forholdet, så en stående figur ER smal og høy.
   ========================================================================== */

.formatvalg {
  /* Rutenett, ikke flex.

     Med flex og «flex: 1 1 96px» ble det fjerde kortet siste paa raden, og
     det femte laa alene og VOKSTE til full bredde. Figuren stod da langt til
     venstre i et kort paa 900 piksler.

     «auto-fill» holder sporene selv om de er tomme. Det femte kortet blir
     like bredt som de fire over, og ingenting strekker seg. */
  display: grid;
  /* 84, ikke 96. Kolonnen i skjemaet er rundt 490 bred, og fem spor paa 96
     med fire mellomrom trenger 520. Da falt det femte kortet ned paa egen
     rad. Med 84 er behovet 460, og alle fem staar paa én linje. */
  grid-template-columns: repeat(auto-fill, minmax(84px, 1fr));
  gap: 10px;
}

/* Kortet er ogsaa et rutenett, med «justify-items: center». Da er BEGGE
   deler sentrert, figuren og teksten, uten at det avhenger av hvor bred
   figurboksen tilfeldigvis er. Det var nettopp det som gikk galt: boksen laa
   til venstre, og formen var sentrert inni den. */
/* «.formatvalg .formatkort», ikke bare «.formatkort».

   nordiva.css har «.felt label { display: block; font-weight: 600; margin }».
   Kortet ER en <label> inne i et <div class="felt">, saa den regelen traff,
   og den er mer bestemt (0,1,1) enn «.formatkort» (0,1,0). Resultatet var at
   kortet aldri ble et rutenett i det hele tatt: «gap: 12px» gjorde ingenting,
   figuren laa klistret til tallet, og hvert kort hadde en marg under seg som
   ingen hadde bedt om.

   Dette er den samme fella som staar i CLAUDE.md om spesifisitet. To klasser
   slaar én klasse pluss ett element. */
.formatvalg .formatkort {
  display: grid;
  justify-items: center;
  align-content: center;
  gap: 12px;
  text-align: center;
  min-height: 54px;
  padding: 16px 10px;
  border: 1.5px solid var(--line);
  border-radius: var(--r-2);
  background: var(--flate-felt);
  cursor: pointer;
  transition: border-color .15s ease, background .15s ease;
  /* Arvet fra «.felt label». Vekten hoerer til tallet, ikke hele kortet,
     og margen er rutenettets jobb. */
  font-weight: 400;
  margin: 0;
}
.formatvalg .formatkort:hover { border-color: var(--brand); }

/* Radioknappen er der for tastatur og skjermleser, men skal ikke ses. Selve
   kortet ER knappen. «display: none» ville tatt den ut av tabrekkefolgen. */
.formatkort input {
  position: absolute;
  opacity: 0;
  width: 1px;
  height: 1px;
  pointer-events: none;
}
.formatkort:has(input:checked) {
  border-color: var(--brand);
  background: color-mix(in srgb, var(--brand) 12%, transparent);
}
.formatkort:has(input:focus-visible) { outline: 2px solid var(--brand); outline-offset: 2px; }

/* FIGUREN

   Tre forsok bommet foer denne. Fast hoeyde med fri bredde ga 15 mot 46
   piksler. Samme boks med ulik hoeyde inni ga fem forskjellige overkanter.
   Og sist: riktig form, men boksen laa ikke sentrert i kortet.

   Naa er boksen 44 x 24 i alle fem, sentrert av rutenettet over, og hver
   form er noeyaktig 24 hoy. Da staar de paa samme linje bade oppe og nede,
   og det eneste som skiller dem er bredden, som ER formatet. */
.formatfigur {
  display: grid;
  place-items: center;
  width: 44px;
  height: 24px;
  opacity: .7;
}
.formatfigur::before {
  content: "";
  display: block;
  height: 24px;
  border: 1.5px solid currentColor;
  border-radius: var(--r-1);
}
.formatfigur.staaende::before { width: 14px; }   /* 9:16 av 24 */
.formatfigur.firefem::before  { width: 19px; }   /* 4:5  av 24 */
.formatfigur.kvadrat::before  { width: 24px; }   /* 1:1        */
.formatfigur.liggende::before { width: 43px; }   /* 16:9 av 24 */

.formatkort:has(input:checked) .formatfigur { opacity: 1; color: var(--brand); }

.formattekst { display: grid; gap: 2px; line-height: 1.4; }
.formattekst b { font-size: var(--t-4); }

/* Tre klasser dypt med vilje. «.oppdragskjema .hint» gir 8 px topp og
   linjeavstand 1.6, og den staar SENERE i fila. */
.formatkort .formattekst .hint {
  margin: 0;
  font-size: var(--t-2);
  line-height: 1.4;
}

/* Etiketten over velgeren er ikke en <label>, for det finnes ikke ett felt å
   peke på. Den skal likevel se ut som alle andre etiketter. */
.felt > .etikett {
  display: block;
  font-weight: 600;
  color: var(--ink);
  margin-bottom: 10px;
}

/* Det frie feltet står under valgene, ikke ved siden av. */
#o-format[hidden] { display: none !important; }
.formatvalg + input[type=text] { margin-top: 12px; }

/* ==========================================================================
   PUBLISERINGSKORTET

   Feltene ligger i to kolonner naar det er plass. Annonseteksten og lenken
   spenner over begge: den ene fordi den er lang, den andre fordi en avkortet
   adresse er umulig aa kontrollere.
   ========================================================================== */

.publiserkort .annonseskjema {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  column-gap: var(--luft-4);
  row-gap: var(--luft-2);
  margin-top: var(--luft-3);
}
@media (min-width: 760px) {
  .publiserkort .annonseskjema {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  }
}
.publiserkort .annonseskjema .skjemabredt { grid-column: 1 / -1; }
.publiserkort .annonseskjema .felt { margin-bottom: 0; }
.publiserkort .knapperad { margin-top: var(--luft-3); }

/* --------------------------------------------------------------------------
   VELG ÉN VARIANT AV TRE

   En levering er som regel tre varianter av samme annonse, og de skal ut som
   TRE annonser hos Meta. Her sto det ett skjema per LEVERING, og da kunne man
   bare legge ut den ene fila leveringen tilfeldigvis pekte paa. De to andre
   laa i mappa uten en vei ut.

   Variantene ligger som knapper med hvert sitt stillbilde. Man trykker paa
   en, skjemaet aapner seg for nettopp den, og de andre blir staaende.
   -------------------------------------------------------------------------- */

.variantvalg {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: var(--luft-2);
  margin-top: var(--luft-2);
}
.variantvalg.enkel { grid-template-columns: minmax(0, 200px); }

.variantvalgkort {
  display: block;
  width: 100%;
  padding: 10px;
  text-align: left;
  color: inherit;
  font: inherit;
  background: var(--flate-knapp);
  border: 1px solid var(--line);
  border-radius: var(--r-2);
  cursor: pointer;
  transition: border-color .15s, background .15s;
}
.variantvalgkort:hover:not(:disabled) {
  border-color: var(--brand);
  background: var(--flate-knapp-hover);
}
.variantvalgkort.valgt {
  border-color: var(--brand);
  box-shadow: inset 0 0 0 1px var(--brand);
}
/* Lagt ut er ikke «i veien», det er ferdig. Da skal den staa rolig, og ikke
   se ut som en knapp man glemte aa trykke paa. */
.variantvalgkort.ute { opacity: .55; cursor: default; }

.variantbilde {
  display: block;
  aspect-ratio: 1 / 1;
  margin-bottom: 8px;
  background: #000;
  border-radius: var(--r-3);
  overflow: hidden;
}
.variantbilde img { display: block; width: 100%; height: 100%; object-fit: contain; }

/* Drive lager miniatyren i sitt eget tempo, og en fersk opplasting har ikke
   faatt en ennaa. Uten dette staar et brukket bilde med kryss der stillbildet
   skal komme. */
.variantbilde.tom { background: var(--flate-bilde); }
.variantbilde.tom img { display: none; }

.variantetikett {
  display: block;
  font-weight: 600;
  font-size: var(--t-4);
  line-height: 1.4;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.variantstatus {
  display: block;
  font-size: var(--t-2);
  line-height: 1.5;
  color: var(--ink-soft);
  font-variant-numeric: tabular-nums;
}
.variantvalgkort.valgt .variantstatus { color: var(--brand); font-weight: 600; }

/* Klippet baerer ikke noen av numrene vi reserverte. Det skal ses paa ruta,
   ikke oppdages i Ads Manager et halvt aar senere. Gult og ikke roedt: det er
   verdt et blikk, ikke en sperre. Noen ganger er det helt riktig, som naar en
   gammel vinner legges ut paa nytt. */
.variantvalgkort.unummerert .variantstatus { color: var(--amber); font-weight: 600; }

/* Setningen som forklarer at man skal trykke. Den staar der skjemaet ellers
   ville staatt, saa kortet ikke slutter i ingenting. */
.velglinje { margin: var(--luft-2) 0 0; }

/* Skjemaet for den ene varianten. Det ligger inne i leveringskortet naa, og
   trenger en strek over seg for ikke aa leses som en del av raden over. */
.publiserjobb .publiserkort {
  margin-top: var(--luft-2);
  padding-top: var(--luft-2);
  border-top: 1px solid var(--line);
}
.publiserkort .skjematopp {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}
.publiserkort .skjematopp h4 { margin: 0; font-size: var(--t-5); line-height: 1.35; }
.publiserkort .skjematopp .hint { margin: 2px 0 0; }
.publiserkort .skjematopp .tilbake { margin: 0; }

/* ==========================================================================
   SPILLEREN OG DET STORE VINDUET

   Videoen ligger i ramma med «contain», ikke «cover». Beskjaering ville
   skjult nettopp det man skal se etter: at klippet er levert i formatet som
   ble bestilt. Ramma har maalet fra oppdraget, saa en liggende film paa et
   staaende oppdrag legger seg som en stripe midt i ruta.
   ========================================================================== */

/* Mens plakaten lages. En svart rute uten forklaring leses som en oedelagt
   video; en rute som sier hva den venter paa, leses som en tilstand. */
.videoramme.venter::after {
  content: 'Forhåndsvisning lages ...';
  position: absolute;
  inset: auto 0 0 0;
  padding: 8px 10px;
  font-size: var(--t-1);
  text-align: center;
  color: rgba(255, 255, 255, .65);
  background: linear-gradient(transparent, rgba(4, 7, 20, .75));
  pointer-events: none;
  z-index: 1;
}

.videoramme video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
  background: #000;
  display: block;
}

/* Hele ruta er knappen. Den ligger over stillbildet, er gjennomsiktig til
   man er borti den, og har spillmerket midt i. Ruta i kortet er ikke en
   spiller: den er en doer inn til den store. */
.filmapne {
  position: absolute;
  inset: 0;
  z-index: 2;
  display: grid;
  place-items: center;
  border: 0;
  padding: 0;
  cursor: pointer;
  background: transparent;
  transition: background .15s ease;
}
.filmapne:hover, .filmapne:focus-visible { background: rgba(4, 7, 20, .3); }
.filmapne:focus-visible { outline: 2px solid var(--brand); outline-offset: -2px; }

.spillmerke {
  width: 54px;
  height: 54px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  color: #fff;
  background: rgba(8, 12, 30, .55);
  backdrop-filter: blur(6px);
  padding-left: 3px;               /* trekanten er optisk venstretung */
  transition: transform .15s ease, background .15s ease;
}
.filmapne:hover .spillmerke { transform: scale(1.07); background: rgba(8, 12, 30, .78); }

.filmrute { position: fixed; inset: 0; z-index: 120; display: grid; place-items: center; }
.filmbakgrunn { position: absolute; inset: 0; background: rgba(4, 7, 20, .88); }
.filmkort {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: 12px;
  width: min(96vw, 1100px);
  max-height: 92vh;
}
.filmtopp { display: flex; align-items: center; gap: 12px; color: #fff; }

/* Filmen til venstre, punktene til hoeyre. Under 900 px legger de seg over
   hverandre: paa en telefon er to kolonner to halve kolonner. */
.filmflate { display: grid; gap: 14px; min-height: 0; }
.filmkort.medlogg .filmflate { grid-template-columns: minmax(0, 1fr) 380px; }
@media (max-width: 900px) {
  .filmkort.medlogg .filmflate { grid-template-columns: minmax(0, 1fr); }
}
.filmvideo { min-width: 0; display: flex; flex-direction: column; }
.filmnavn { flex: 1 1 auto; min-width: 0; }
.filmnavn b {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.filmnavn .hint { color: rgba(255, 255, 255, .62); }
.filmlukk {
  flex: 0 0 auto;
  width: 38px;
  height: 38px;
  display: grid;
  place-items: center;
  border: 0;
  border-radius: var(--r-3);
  cursor: pointer;
  color: #fff;
  background: rgba(255, 255, 255, .1);
}
.filmlukk:hover { background: rgba(255, 255, 255, .2); }
/* Filmen bestemmer selv hvor bred den blir. En staaende annonse skal ikke
   strekkes ut til vindusbredde bare fordi vinduet er bredt. */
.filmkort video {
  max-width: 100%;
  max-height: calc(92vh - 62px);
  margin: 0 auto;
  border-radius: var(--r-3);
  background: #000;
  display: block;
}
.filmkort.medlogg video { max-height: calc(92vh - 110px); }

/* Merkestripa under filmen. Ett punkt per kommentar, plassert der i filmen
   den gjelder. Da ser man hvor tyngden ligger foer man har lest et ord. */
/* Merkestripa. Prikker sa at det var noe der, men ikke hva eller hvor mange.
   Nummererte merker gjoer at man kan si «punkt 2» til hverandre, og man ser
   paa et blikk om det er to eller ni ting som gjenstaar. */
.filmstripe {
  position: relative;
  height: 34px;
  margin-top: 10px;
  border-radius: var(--r-2);
  background: rgba(255, 255, 255, .09);
  border: 1px solid rgba(255, 255, 255, .12);
}
.stripepunkt {
  position: absolute;
  top: 4px;
  width: 24px;
  height: 24px;
  margin-left: -12px;
  padding: 0;
  /* Flex, ikke grid. «text-align» arves som «left» her, og med grid la tallet
     seg i kanten av knappen i stedet for midt i. Maalt: med flex lander det
     paa x=9 med bredde 6 i en knapp paa 24, altsaa midt i. */
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  border: 2px solid rgba(4, 7, 20, .6);
  border-radius: 50%;
  cursor: pointer;
  font: inherit;
  font-size: var(--t-1);
  font-weight: 700;
  color: #fff;
  background: var(--brand);
  transition: transform .12s ease;
}
.stripepunkt.fikset { background: #34a853; }
.stripepunkt:hover, .stripepunkt:focus-visible { transform: scale(1.18); z-index: 2; }

/* Samme nummer i lista som paa stripa, saa de to peker paa det samme. */
.loggnr {
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  border-radius: 50%;
  font-size: var(--t-1);
  font-weight: 700;
  color: #fff;
  background: var(--brand);
}
.loggpunkt.fikset .loggnr { background: #34a853; }

/* --- punktlista ---------------------------------------------------------- */

.filmlogg {
  display: flex;
  flex-direction: column;
  min-height: 0;
  gap: 10px;
  padding: 14px;
  border-radius: var(--r-3);
  background: var(--flate-kort, rgba(255, 255, 255, .06));
  border: 1px solid rgba(255, 255, 255, .12);
  color: #fff;
}
.filmlogg h3 { margin: 0; font-size: var(--t-4); }
.filmlogg .hint { color: rgba(255, 255, 255, .6); }
.loggliste { flex: 1 1 auto; overflow-y: auto; min-height: 90px; }

/* Tidskode og navn paa én linje, teksten paa full bredde under. Teksten laa
   foer i en kolonne ved siden av tidskoden, og da ble en setning paa mer enn
   fem ord en smal remse med ett ord per linje. */
.loggpunkt {
  padding: 10px 0;
  border-bottom: 1px solid rgba(255, 255, 255, .1);
}
.loggtopp { display: flex; align-items: center; gap: 8px; }
.loggforfatter {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: var(--t-2);
  color: rgba(255, 255, 255, .6);
}
.loggpunkt.fikset { opacity: .55; }
.loggpunkt.fikset .loggtekst { text-decoration: line-through; }

/* Tidskoden ER lenka. Den er det man leter etter i lista, og den er det
   eneste stedet det er naturlig aa trykke for aa komme dit. */
.loggtidkode {
  align-self: start;
  padding: 3px 8px;
  border: 0;
  border-radius: var(--r-2);
  cursor: pointer;
  font: inherit;
  font-variant-numeric: tabular-nums;
  font-weight: 700;
  color: #fff;
  background: rgb(var(--brand-rgb) / .35);
}
.loggtidkode:hover { background: rgb(var(--brand-rgb) / .6); }
.loggtekst {
  margin: 7px 0 6px;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
/* AVHUKINGEN MAA KUNNE ANGRES, OG SE UT SOM DET

   Foer var dette en avkryssingsboks. Huket av, med gjennomstreket tekst, saa
   den ut som noe endelig, og det var ikke opplagt at man kunne trykke igjen.
   Trykker man feil, skal veien tilbake vaere synlig, ikke gjettet.

   Naa er det en knapp som bytter tekst: «Merk som fikset» eller «Fikset», med
   «Angre» ved siden av naar den staar paa. */
.fiksetrad { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.fiksetknapp {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 5px 12px;
  border-radius: 999px;
  border: 1px solid rgba(255, 255, 255, .22);
  background: none;
  color: rgba(255, 255, 255, .72);
  cursor: pointer;
  font: inherit;
  font-size: var(--t-2);
  font-weight: 600;
}
.fiksetknapp:hover { border-color: rgba(255, 255, 255, .45); color: #fff; }
.fiksetknapp.pa {
  border-color: rgba(52, 168, 83, .55);
  background: rgba(52, 168, 83, .18);
  color: #7ee2a0;
}
.angreknapp {
  border: 0;
  background: none;
  padding: 0;
  cursor: pointer;
  font: inherit;
  font-size: var(--t-2);
  color: rgba(255, 255, 255, .55);
  text-decoration: underline;
}
.angreknapp:hover { color: #fff; }
/* Krysset sentreres med grid, ikke med line-height. Luftsjekken har rett i
   at 1 er for tett, og den skiller ikke paa brodtekst og ett tegn i en
   knapp — som den ikke boer, for det er akkurat slik unntakene brer seg. */
.loggslett {
  display: grid;
  place-items: center;
  width: 22px;
  height: 22px;
  border: 0;
  background: none;
  cursor: pointer;
  font-size: var(--t-5);
  color: rgba(255, 255, 255, .5);
}
.loggslett:hover { color: #fff; }

.loggskjema { flex: 0 0 auto; }

/* «Gjelder alle variantene». Naar bare hooken skiller de tre, gjelder de
   fleste punktene alle sammen. */
.allevarianter {
  display: flex;
  align-items: center;
  gap: 7px;
  margin-bottom: 8px;
  font-size: var(--t-2);
  color: rgba(255, 255, 255, .7);
  cursor: pointer;
}
.allemerke {
  flex: 0 0 auto;
  padding: 2px 7px;
  border-radius: var(--r-2);
  font-size: var(--t-1);
  font-weight: 700;
  color: #fff;
  background: rgba(52, 168, 83, .35);
}
.loggfelt {
  width: 100%;
  padding: 9px 11px;
  border-radius: var(--r-3);
  border: 1px solid rgba(255, 255, 255, .2);
  background: rgba(4, 7, 20, .45);
  color: #fff;
  font: inherit;
  resize: vertical;
}
.loggfelt::placeholder { color: rgba(255, 255, 255, .45); }
.loggbunn {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-top: 8px;
}
.loggtid { font-variant-numeric: tabular-nums; font-weight: 700; }
.loggfeil:empty { display: none; }

/* Avgjoerelsen, i samme rute som filmen. Streken over er ikke pynt: det som
   staar under er det som sendes, og det skal ikke leses som en fortsettelse
   av kommentarfeltet. */
.filmvurder {
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid rgba(255, 255, 255, .16);
}
.filmvurder label { display: block; margin-bottom: 6px; font-weight: 600; }
.filmvurder .knapperad { margin-top: 10px; gap: 8px; flex-wrap: wrap; }
.vurderfeil:empty { display: none; }

/* Ett tall per klipp, saa hun ser hvilken variant punktene gjelder foer hun
   aapner noe. */
.punktmerke { margin: 2px 0 0; font-weight: 600; }
.punktlinje.gjenstaar { color: var(--ink); font-weight: 600; }

/* Neste steg. Punktene sier hva som er galt; denne sier hva man gjoer med
   dem. Uten den staar man med en huskeliste og ingen doer videre. */
.nesteSteg {
  margin-top: var(--luft-3);
  padding-top: var(--luft-2);
  border-top: 1px solid var(--line);
}
.nesteord { margin: 0 0 10px; font-weight: 600; }

/* Tidligere versjoner. Historikken slettes ikke, den legges sammen: etter tre
   runder er skjermen ni videoer lang, og den som gjelder drukner. */
.tidligere { margin: var(--luft-2) 0 var(--luft-4); }
.tidligereliste { margin-top: var(--luft-3); }
.gammelversjon { opacity: .82; }
.gammelversjon .videoramme { max-width: 150px; }

/* «Lever» laa klistret inntil boksen under. Overskriften og det foerste
   elementet i et kort er to ting, ikke ett. */
#leverkort h2 { margin-bottom: var(--luft-3); }
#lever-versjon { margin: 0 0 var(--luft-3); }
#lever-hint { margin: 0 0 var(--luft-2); }

/* Annonsenavnene paa oppdraget. De skal kunne leses av og skrives inn i en
   eksportdialog uten aa bomme paa et siffer, derfor tabulaertall og luft. */
.annonsenavn .navnrekke { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0 0; }
.navnlapp {
  padding: 4px 10px;
  border-radius: var(--r-2);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  background: var(--brand-myk, rgb(var(--brand-rgb) / .16));
  border: 1px solid rgb(var(--brand-rgb) / .3);
}

/* ==========================================================================
   ANNONSEBIBLIOTEKET

   En hylle, ikke en liste. Man leter etter en annonse man HUSKER, og man
   husker den som et bilde, ikke som en rad med tekst. Derfor stillbildet
   foerst og navnet under.
   ========================================================================== */

.annonsehylle {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: var(--luft-3);
}

.annonsekort {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 10px;
  text-align: left;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
  cursor: pointer;
  background: var(--flate-kort, transparent);
  color: inherit;
  font: inherit;
  transition: border-color .15s ease, transform .15s ease;
}
.annonsekort:hover { border-color: var(--brand); transform: translateY(-2px); }
.annonsekort:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }

.annonseplakat {
  display: block;
  width: 100%;
  border-radius: var(--r-3);
  overflow: hidden;
  background: #000;
}
.annonseplakat img { width: 100%; height: 100%; object-fit: cover; display: block; }

.annonsenavn { font-weight: 700; }
.annonsekort .hint { margin: 0; }
.annonsebunn {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-top: 2px;
}

#bibliotek-innhold h2 { margin: var(--luft-4) 0 var(--luft-2); font-size: var(--t-5); }
#bibliotek-tilbake { margin-bottom: var(--luft-3); }

/* Filradene. Voiceover spilles her, dokumenter aapnes her. Å maatte innom
   nedlastingsmappa for aa hoere om det er riktig opptak er tre klikk for noe
   som tar tre sekunder. */
.arkivfiler { display: flex; flex-direction: column; gap: 10px; }
.arkivfil {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px 14px;
  padding: 12px 14px;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
}
.arkivnavn { flex: 1 1 220px; min-width: 0; }
.arkivnavn b {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.arkivnavn .hint { display: block; }
.arkivfil audio { flex: 1 1 260px; max-width: 100%; height: 36px; }

.pdfrute { flex: 1 1 100%; }
/* ==========================================================================
   INSPIRASJON

   Notatet er innholdet, ikke bildet. Derfor staar det med vanlig broedtekst
   og ikke som en bildetekst: det er den setningen redigereren faktisk leser.
   ========================================================================== */

/* Skjemaet i to kolonner. Ti felt under hverandre i en smal spalte er en
   skjermhoeyde med tomrom ved siden av, og da scroller man for aa lete etter
   noe som hadde faatt plass. */
/* Disse to skjermene er rutenett, ikke tekstsider. Den vanlige ramma paa
   740 piksler er riktig for noe man LESER; her er det noe man fyller ut og
   blar i, og da er halve vinduet tomrom til hoeyre. */
#skjerm-inspirasjon > .wrap,
#skjerm-bibliotek > .wrap { max-width: 1440px; }

.inspskjema {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--luft-3);
  align-items: start;
}
.inspskjema .felt { margin: 0; }
.inspskjema .bredt { grid-column: 1 / -1; }
/* Notatet er det lengste feltet og det viktigste. Det faar to av tre
   kolonner, saa en setning paa tjue ord ikke blir fem linjer. */
.inspskjema .toblokker { grid-column: span 2; }
.inspsidekolonne { display: flex; flex-direction: column; gap: var(--luft-2); }

@media (max-width: 1100px) {
  .inspskjema { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .inspskjema .toblokker { grid-column: span 2; }
}
@media (max-width: 760px) {
  .inspskjema { grid-template-columns: minmax(0, 1fr); }
  .inspskjema .toblokker { grid-column: span 1; }
}

/* Feltet og knappen paa samme linje. Sto knappen i en «opplastrad», fikk den
   sin egen ramme rundt seg og la seg UNDER feltet, og da saa lenkefeltet ut
   som en boks med to ting i. */
.lenkerad {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
}
.lenkerad input { flex: 1 1 260px; min-width: 0; }
.lenkerad .btn { flex: 0 0 auto; }
.lenkerad .hint { margin: 0; flex: 1 1 160px; min-width: 0; }

/* KLASSENAVNENE HETER «ref», IKKE «insp»

   nordiva.css har allerede en «.inspkort»-komponent fra kreatoerportalen, med
   blant annet «.inspkort img { width:100% }». Den er ett klassenavn pluss ett
   element og slaar en enkel klasse paa spesifisitet, saa merkelogoen ble
   tegnet i full kortbredde. Samme feiltype som formatkortene hadde.

   Loesningen er ikke !important, det er et navn som ikke kolliderer. */

/* Filterlinja over hylla. Merkene som knapper med antall, og ett soekefelt.
   Soeket ser i notatet og stikkordene, ikke bare i tittelen: det er der man
   har skrevet HVA man liker, og det er det man husker. */
/* ==========================================================================
   VARSLER

   Bjella er det eneste stedet som sier «her venter noe». Uten den maa hun
   lete, og det man maa lete etter, finner man for sent.
   ========================================================================== */

.varsler { position: relative; }
.bjelle {
  position: relative;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid var(--line);
  background: var(--flate-svak);
  color: var(--ink-soft);
  cursor: pointer;
}
.bjelle:hover { color: var(--ink); border-color: var(--brand); }

/* Ikonet hadde ingen stoerrelse. «N.ikon» gir en svg uten width og height,
   saa den arvet, og i en tom span ble den null. Bjella var en tom ring. */
#bjelleikon { display: block; line-height: 0; }
#bjelleikon svg { width: 20px; height: 20px; display: block; }

/* Venter det noe, skal bjella se ut som den vet det. Gul ramme, gul strek,
   og et tall som ikke kan forveksles med pynt. */
.bjelle.har {
  color: #f0b849;
  border-color: rgba(214, 158, 46, .65);
  background: rgba(214, 158, 46, .12);
}

.bjelletall {
  position: absolute;
  top: -3px;
  right: -3px;
  min-width: 19px;
  height: 19px;
  padding: 0 5px;
  border-radius: var(--r-3);
  display: grid;
  place-items: center;
  font-size: var(--t-1);
  font-weight: 700;
  color: #fff;
  background: #d69e2e;
  font-variant-numeric: tabular-nums;
}

.varselmeny {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: 60;
  width: min(320px, 86vw);
  padding: 6px;
  text-align: left;
}
.varselrad {
  display: block;
  width: 100%;
  padding: 10px 12px;
  border: 0;
  border-radius: var(--r-3);
  text-align: left;
  cursor: pointer;
  background: none;
  color: inherit;
  font: inherit;
}
.varselrad:hover { background: var(--flate-knapp); }
.varseltittel { display: block; font-weight: 600; margin-bottom: 2px; }
.varselrad .hint { margin: 0; }
.varseltom, .varselbunn { margin: 0; padding: 12px; color: var(--ink-soft); }
.varselbunn { border-top: 1px solid var(--line); margin-top: 4px; }

/* Konfetti. Bittelitt, én gang. Rene transformasjoner, ingen omtegning av
   layout, og «pointer-events: none» saa den aldri staar i veien for et trykk. */
.konfetti {
  position: fixed;
  inset: 0;
  z-index: 200;
  pointer-events: none;
  overflow: hidden;
}
.konfetti i {
  position: absolute;
  top: -14px;
  width: 9px;
  height: 14px;
  border-radius: var(--r-1);
  animation-name: konfettifall;
  animation-timing-function: cubic-bezier(.25, .6, .4, 1);
  animation-fill-mode: forwards;
}
@keyframes konfettifall {
  0%   { transform: translate3d(0, 0, 0) rotate(0deg); opacity: 1; }
  100% { transform: translate3d(0, 105vh, 0) rotate(620deg); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) { .konfetti { display: none; } }

/* Filterlinja laa klistret opp under overskriftsraden, og soekefeltet var
   hoeyrestilt rett under «Legg til referanse». To hoeyrestilte elementer over
   hverandre uten luft leses som ett rot, ikke som to rader.

   Naa staar merkene og soeket sammen til venstre, med luft over. Da er det
   ingenting som konkurrerer med knappen om den hoeyre kanten. */
.reffilter {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  flex-wrap: wrap;
  gap: var(--luft-2);
  margin-top: var(--luft-3);
  margin-bottom: var(--luft-3);
}
.merkechips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 7px 14px;
  border-radius: 999px;
  border: 1px solid var(--line);
  background: var(--flate-svak);
  color: var(--ink-soft);
  cursor: pointer;
  font: inherit;
  font-size: var(--t-3);
  font-weight: 600;
}
.chip span {
  font-variant-numeric: tabular-nums;
  font-weight: 400;
  opacity: .7;
}
.chip:hover { border-color: var(--brand); color: var(--ink); }
.chip.valgt {
  background: var(--brand);
  border-color: var(--brand);
  color: #fff;
}
.chip.valgt span { opacity: .85; }

.refsok {
  flex: 0 1 260px;
  min-width: 170px;
  padding: 9px 13px;
  border-radius: var(--r-2);
  border: 1px solid var(--line);
  background: var(--flate-felt);
  color: var(--ink);
  font: inherit;
}

/* Foerste merkegruppe rett under filterlinja trenger ikke toppmargen sin. */
.reffilter + .merkegruppe { margin-top: 0; }

.merkegruppe { margin-top: var(--luft-4); }
.merkegruppe + .merkegruppe { margin-top: var(--luft-5); }

/* Logo og navn i en linje over hylla. Det er dette som gjoer en lang rekke
   kort til noe man kan bla i: du leter etter et MERKE, ikke etter et kort. */
.merkelinje {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: var(--luft-3);
  padding-bottom: 12px;
  border-bottom: 1px solid var(--line);
}
.merkelinje b { font-size: var(--t-5); }
.merkelinje .hint { margin: 0; }
.merkelogo {
  width: 30px;
  height: 30px;
  flex: 0 0 30px;
  border-radius: 50%;
  object-fit: cover;
  background: var(--flate-svak);
}
.merkelogo.tom { border: 1px dashed var(--line); }

/* Fire i bredden paa et vanlig skjermbilde. Med tre ble hvert kort 384 brede
   og bildet 480 hoeyt, og fire referanser fylte to skjermhoeyder. En hylle
   skal kunne overskues. */
.refhylle {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: var(--luft-3);
}
.refkort {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
  overflow: hidden;
}
/* HVORFOR IKKE «max-height» HER

   Ramma hadde sideforhold 9:16 OG et hoeydetak paa 320 piksler. Naar taket
   slo inn, ble boksen nesten kvadratisk, og den staaende videoen la seg med
   «contain» som en smal stripe i midten med svarte felt paa hver side. Det
   saa ut som et lavopploeselig bilde, men det var ramma som loey.

   Her er kortene en hylle man blar i, ikke en formatkontroll. Da er et fast
   sideforhold og «cover» riktig: alle kortene blir like hoeye, og bildet
   fyller ruta. Hele klippet ser du uansett i vinduet. */
.refkort .videoramme {
  max-width: none;
  width: 100%;
  aspect-ratio: 4 / 5;
  border: 0;
  border-radius: 0;
  border-bottom: 1px solid var(--line);
}
.refkort .videoramme video { object-fit: cover; }
.refkort .videoramme .filmapne { background: rgba(4, 7, 20, .12); }
.refbilde { display: block; background: #000; border-bottom: 1px solid var(--line); }
.refbilde img { width: 100%; display: block; max-height: 260px; object-fit: cover; }

/* Luft mellom delene. Tittel, notat, tallinje, stikkord og knapper er fem
   ulike ting, og uten avstand leses de som én blokk tekst. */
.refinnhold { padding: 16px 16px 18px; display: flex; flex-direction: column; gap: 12px; }
.refinnhold h3 { margin: 0; font-size: var(--t-4); }
.refnotat { margin: 0; }
.refinnhold > .hint { margin: 0; }
.refstikkord { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; }
.refinnhold .knapperad { margin-top: 4px; gap: 8px; flex-wrap: wrap; }

.stikk {
  padding: 3px 9px;
  border-radius: 999px;
  font-size: var(--t-2);
  color: var(--ink-soft);
  background: var(--flate-svak);
  border: 1px solid var(--line);
}

/* Overskrift og knapp paa samme linje, saa «Legg til referanse» staar der man
   ser etter den og ikke nederst under et skjema. */
.skjermtopp {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--luft-3);
  flex-wrap: wrap;
}
.skjermtopp h1 { margin: 0; }
/* Knappen er hoeyere enn overskriften. Uten dette starter neste rad rett
   under overskriftens underkant, altsaa inni knappen. */
.skjermtopp { align-items: center; margin-bottom: var(--luft-2); }
#insp-skjemaboks { margin-top: var(--luft-3); }

/* Framdriften naar en referansefil lastes opp. */
.opplastlinje {
  height: 6px;
  margin-top: 8px;
  border-radius: var(--r-1);
  overflow: hidden;
  background: var(--flate-svak);
}
.opplastlinje span {
  display: block;
  height: 100%;
  width: 0;
  border-radius: var(--r-1);
  background: var(--brand);
  transition: width .2s ease;
}

.pdfrute iframe {
  width: 100%;
  height: 70vh;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
  background: #fff;
}

/* Filmen paa redigererens egne kort. Smalere enn hos admin: her er den en
   inngang til punktene, ikke selve vurderingen. */
.leveransefilm { margin-top: var(--luft-2); }
.leveransefilm .videoramme { max-width: 190px; }
.punktlinje { margin: 8px 0 0; }
.punktlinje:empty { display: none; }

/* ==========================================================================
   VURDERINGSKORTET

   Videoen laa klistret inntil «Skriv til redigereren», og de to leses da som
   én blokk. De er to helt ulike ting: den ene ser man paa, den andre skriver
   man i. Luft mellom dem er ikke pynt, det er skillet.
   ========================================================================== */

.leveransefiler { margin: var(--luft-3) 0 var(--luft-4); }
.leveransefiler .videoramme { margin: 0; }

.variantlinje {
  margin: 0 0 var(--luft-2);
  font-weight: 600;
  color: var(--ink-soft);
}

/* Variantene ved siden av hverandre naar det er plass. Tre staaende klipp
   under hverandre er tre skjermhoeyder for én vurdering. */
.variantrad {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: var(--luft-2);
  align-items: start;
}
.variantrad.enkel { grid-template-columns: minmax(0, 260px); }
.variantrad .variant .videoramme { margin: 0 0 8px; max-width: none; }
.variantrad .variant .variantnavn,
.variantrad .variant .hint {
  margin: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.variantrad .variant .variantnavn { font-weight: 600; font-size: var(--t-3); }

/* Formatet som ble bestilt, ved siden av statusen. Det er det man
   sammenligner filmen med, saa det skal staa der man ser paa filmen. */
.formatlapp { font-variant-numeric: tabular-nums; }

/* «advarsel» og «liten» ble brukt i markupen uten aa finnes her. De gjorde
   ingenting, og en klasse som ikke gjoer noe er verre enn ingen klasse: den
   ser ut som at noe er tatt hensyn til. */
.varsel.advarsel {
  background: rgba(214, 158, 46, .12);
  border: 1px solid rgba(214, 158, 46, .38);
}
.btn.liten { padding: 7px 14px; font-size: var(--t-3); }

/* Feltet skal staa fritt fra videoen over og fra knappene under. */
#skjerm-leveringer .vurderfelt { margin-bottom: var(--luft-3); }
#skjerm-leveringer .kort .knapperad { margin-top: var(--luft-3); }
#skjerm-leveringer .kort { padding: var(--luft-3); margin-bottom: var(--luft-3); }
#skjerm-leveringer .kort h3 { margin: 0 0 10px; }

/* ==========================================================================
   OPPLASTINGSRADEN

   Raden sto som «.stripe» (den blå handlingslinja) og stolpen hadde stil bare
   under «.filliste», som ikke er forelderen her. Ingen av delene traff.
   Egen komponent, uten avhengighet til noe over seg.
   ========================================================================== */

.opplastrad {
  padding: 14px 16px;
  margin-top: 12px;
  border: 1px solid var(--line);
  border-radius: var(--r-2);
  background: var(--flate-felt);
}
.opplasttopp {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--luft-2);
  margin-bottom: 10px;
}
.opplastnavn { min-width: 0; }
.opplastnavn b { font-weight: 600; }
.opplastnavn .hint { margin-left: 6px; }

/* Tabulartall: prosenten hopper fra 9 til 10 uten at linja rykker. */
.opplaststatus {
  flex: none;
  font-size: var(--t-4);
  font-weight: 600;
  color: var(--ink-soft);
  font-variant-numeric: tabular-nums;
}

.opplaststolpe {
  height: 8px;
  border-radius: 999px;
  background: var(--line);
  overflow: hidden;
}
.opplaststolpe i {
  display: block;
  height: 100%;
  width: 0;
  border-radius: 999px;
  background: var(--brand);
  transition: width .25s ease;
}

/* Mens den gaar: en svak bevegelse oppaa bredden. Uten den ser en fil som
   staar paa 38 prosent i tjue sekunder ut som at noe har hengt seg. */
.opplastrad.gaar .opplaststolpe i {
  background: linear-gradient(90deg,
    var(--brand) 0%,
    color-mix(in srgb, var(--brand) 55%, white) 50%,
    var(--brand) 100%);
  background-size: 200% 100%;
  animation: opplastpuls 1.4s linear infinite;
}
@keyframes opplastpuls { to { background-position: -200% 0; } }

/* KANT, IKKE FLATE. 28. september 2026. Raden lå på --green-bg og --red-bg,
   altså farge brukt som svak flate bak en hel rad. Farge er informasjon her,
   og en rad som er ferdig eller feilet er en tilstand, ikke en pynt. Kanten
   går samtidig fra --green-line til --green: uten fyllet bak ville hårstreken
   i den bleke varianten vært svakere enn det den erstattet, og da hadde
   signalet blitt borte i stedet for å bli renere. Stolpen og statusteksten
   bærer den samme fargen fra før. */
.opplastrad.ferdig { border-color: var(--green); }
.opplastrad.ferdig .opplaststolpe i { background: var(--green); animation: none; }
.opplastrad.ferdig .opplaststatus { color: var(--green); }

.opplastrad.feilet { border-color: var(--red); }
.opplastrad.feilet .opplaststolpe i { background: var(--red); animation: none; }
.opplastrad.feilet .opplaststatus { color: var(--red); }

@media (prefers-reduced-motion: reduce) {
  .opplastrad.gaar .opplaststolpe i { animation: none; }
}

/* TEKSTFORSLAGENE

   Tre utkast, ikke en fasit. Brødteksten vises med linjeskiftene den faktisk
   har, for det er slik den kommer til å stå i feeden, og en tekst man leser
   som én klump gir ikke noe inntrykk av rytmen. */
.tekstforslag { margin-top: var(--luft-3); }
.forslagkort {
  border: 1px solid var(--line);
  border-radius: var(--r-2);
  padding: var(--luft-2);
  margin-bottom: var(--luft-2);
  background: var(--flate-svak);
}
.forslagkort .brodtekst {
  white-space: pre-wrap;
  margin: 0 0 var(--luft-2);
  line-height: 1.65;
}
.forslagkort .hint { margin: 0 0 6px; }
.forslagkort .tilbake { margin-top: 6px; }

/* Kommandoen i «ikke koblet»-boksen skal kunne merkes og kopieres, og se ut
   som noe man limer i en terminal. */
/* Banneret skal vaere rolig, men ikke saa svakt at det leses som utgraaet.
   Litt mer fylde, samme farge. */
#publiser-kobling {
  background: rgb(var(--brand-rgb) / .16);
  border-color: rgb(var(--brand-rgb) / .34);
}
#lever-versjon {
  background: rgb(var(--brand-rgb) / .16);
  border-color: rgb(var(--brand-rgb) / .34);
}

#publiser-kobling code {
  display: inline-block;
  margin-top: 8px;
  padding: 6px 10px;
  border-radius: var(--r-2);
  background: var(--flate-felt);
  font-size: var(--t-3);
  user-select: all;
}

/* ==========================================================================
   DIALOGEN

   Erstatter window.prompt og window.confirm. De så ut som nettleseren og
   ikke som appen, skrev «på video.nordiva.no står det» over teksten, og
   kunne verken ha etikett, hjelpetekst eller feilmelding. Femogtyve av dem
   lå spredt i appen.
   ========================================================================== */

.dialogrute {
  position: fixed;
  inset: 0;
  /* Over filmvinduet (120). En bekreftelse som havner BAK det den spoer om,
     er en bekreftelse ingen kan svare paa. */
  z-index: 140;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--luft-3);
}
.dialogbakgrunn {
  position: absolute;
  inset: 0;
  background: rgba(4, 10, 28, .62);
  backdrop-filter: blur(2px);
}
.dialogkort {
  position: relative;
  z-index: 1;
  width: min(460px, 100%);
  max-height: calc(100dvh - 2 * var(--luft-3));
  overflow: auto;
  background: var(--flate-kort);
  border: 1px solid var(--line);
  border-radius: 18px;
  box-shadow: 0 24px 60px rgba(0, 0, 0, .45);
  padding: var(--luft-3);
}
.dialogkort h2 { margin: 0 0 var(--luft-2); font-size: var(--t-5); }

/* Forklaringen står fritt fra feltet under. Klistret den seg til etiketten,
   ville de to lest som én setning. */
.dialogkort .dialogtekst {
  margin: 0 0 var(--luft-3);
  color: var(--ink-soft);
  line-height: 1.6;
}
.dialogkort .felt { margin-bottom: var(--luft-2); }
/* Tekstmalen på oppdraget. Prøven er en container, så teksten kan få
   størrelsen sin i cqw: 31 px i en 1080 bred ramme blir like stor andel av
   prøven som av videoen. */
.tekstmal .valg + .valg {
  margin-top: var(--luft-3);
  padding-top: var(--luft-3);
  border-top: 2px solid rgba(128, 128, 128, 0.3);
}
/* Valget («Med boks») er overskriften; stilene under det («Undertekst»)
   er mindre, så hierarkiet synes uten å lese. */
.tekstmal .valg > h3 { font-size: var(--t-5); margin: 0 0 4px; }
.tekstmal .stilnavn { font-weight: 600; margin: var(--luft-2) 0 4px; }
.tekstmallinje { margin: var(--luft-2) 0 0; line-height: 1.5; color: var(--ink-soft); }
/* Ett valg om gangen: to knapper, den valgte fylt. */
.tekstvalg { display: flex; flex-wrap: wrap; gap: 8px; margin: var(--luft-2) 0 var(--luft-2); }
.tekstvalg .btn[aria-pressed="true"] { background: var(--brand, #4b6bfb); border-color: transparent; color: #fff; }
.tekstmal .valg > .hint { margin: 0 0 var(--luft-2); }

/* Kortlinjene og skissen av rammen side om side. */
.tekstmal .stilrad { display: flex; gap: var(--luft-2); align-items: flex-start; }
.tekstmal .stilkort { flex: 1; margin: 0; padding-left: 1.1em; line-height: 1.55; }
.tekstmal .stilkort li + li { margin-top: 4px; }
.rammeskisse {
  flex: none;
  width: 56px;
  position: relative;
  overflow: hidden;
  border-radius: var(--r-2);
  background: #2d3036;
  border: 1px solid rgba(128, 128, 128, 0.45);
}
.rammeskisse .sone { position: absolute; left: 0; right: 0; background: rgba(255, 90, 90, 0.22); }
.rammeskisse .linje {
  position: absolute;
  left: 22%;
  right: 22%;
  height: 3px;
  border-radius: var(--r-1);
  background: #fff;
  transform: translateY(-50%);
}
.rammeskisse .linje.medboks { height: 7px; background: rgba(255, 255, 255, 0.85); }

/* Detaljene og tipsene er sammenslått, som fakturahistorikken: de skal
   kunne slås opp i, ikke leses hver gang. */
.tekstdetaljer { margin: var(--luft-2) 0 0; }
.tekstdetaljer > summary { cursor: pointer; font-size: var(--t-4); }
.tekstdetaljer.tips { margin-top: var(--luft-3); }

/* Scriptregisteret: detaljene åpnes inne i kortet. */
.scriptdetalj { margin-top: var(--luft-2); padding-top: var(--luft-2); border-top: 1px solid rgba(128, 128, 128, 0.25); }
.scriptdetalj textarea { min-height: 120px; }
.scriptdetalj h4 { margin: var(--luft-2) 0 8px; }
.scriptdetalj .enkelliste { list-style: none; margin: 0 0 var(--luft-2); padding: 0; }
/* Knappen «Fjern» har full klikkflate og gir raden høyden. Margen fra
   li i nordiva.css tas bort, ellers blir hver fil en tom halv skjerm. */
.scriptdetalj .enkelliste li {
  display: flex;
  gap: 10px;
  align-items: center;
  margin: 0;
  border-bottom: 1px solid rgba(128, 128, 128, 0.15);
  line-height: 1.45;
}
.scriptdetalj .enkelliste li .navn { flex: 1; overflow-wrap: anywhere; }
.scriptdetalj .enkelliste li .hint { margin: 0; }

.tekstmal .stil + .stil {
  margin-top: var(--luft-3);
  padding-top: var(--luft-3);
  border-top: 1px solid rgba(128, 128, 128, 0.25);
}
.tekstmal .stilprove {
  container-type: inline-size;
  aspect-ratio: 16 / 4;
  display: flex;
  align-items: flex-end;
  justify-content: center;
  padding-bottom: 5%;
  margin: var(--luft-2) 0;
  border-radius: var(--r-3);
  overflow: hidden;
  background: linear-gradient(135deg, #767b83, #2d3036 55%, #b8a78c);
}
.tekstmal .stilprove span { line-height: 1.4; padding: 0.15em 0.45em; }
.tekstmal .verdier {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 8px var(--luft-2);
  margin: var(--luft-2) 0 0;
}
.tekstmal .verdier dt { color: var(--ink-soft); }
.tekstmal .verdier dd { margin: 0; line-height: 1.5; }
.tekstmal .regler { margin: var(--luft-3) 0 0; padding-left: 1.2em; color: var(--ink-soft); line-height: 1.5; }

/* Punktene i en dialog som fjerner noe: hva som forsvinner, ett per linje. */
.dialogkort .dialogliste {
  margin: calc(-1 * var(--luft-2)) 0 var(--luft-3);
  padding-left: 1.2em;
  color: var(--ink-soft);
  line-height: 1.5;
}
.dialogkort .dialogliste li + li { margin-top: 6px; }
.dialogkort .feilmelding:empty { display: none; }
.dialogkort .knapperad { margin-top: var(--luft-3); gap: 12px; }

/* En knapp som sletter skal ikke se ut som en som lagrer. */
/* Rød tone, ikke rød flate. I mørkt tema er --red en lys rosa, og hvit
   tekst oppå den er uleselig. Tonen sier «pass på» i begge temaer. */
.btn.farlig {
  background: var(--red-bg);
  border-color: var(--red-line);
  color: var(--red);
}
.btn.farlig:hover { border-color: var(--red); }

/* En enhet som kan låse opp kontoen, på profilsiden.

   Navnet står over datoen, og «Fjern» ligger på egen side av raden. Samme
   form som versjonslinja over: en strek mellom hver, ingen strek etter den
   siste. En liste som slutter med en strek ser ut som om noe mangler under. */
.profilenhet {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--luft-2);
  padding: 14px 0;
  border-bottom: 1px solid var(--line);
}
.profilenhet:last-child { border-bottom: 0; }
.profilenhet .enhettekst { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.profilenhet .enhetnavn { font-weight: 600; color: var(--ink); }
.profilenhet .hint { margin: 0; }

/* Kortene på profilsiden er skjemaer. Overskriften inni må stå fri fra
   feltet under, ellers leses den som en etikett til feltet. */
#skjerm-profil .kort { margin-bottom: var(--luft-4); }
#skjerm-profil .kort h2 { margin: 0 0 var(--luft-2); }
#skjerm-profil .kort h2 + .hint { margin: calc(-1 * var(--luft-2) + 4px) 0 var(--luft-3); }
#skjerm-profil .felt + h2 { margin-top: var(--luft-4); }

/* Låst felt skal SE låst ut. Et felt som ser redigerbart ut men ikke tar imot
   noe, leses som at siden er i stykker. */
#skjerm-profil input[readonly] {
  background: var(--flate);
  color: var(--ink-soft);
  cursor: not-allowed;
}

/* Språkvalget på innloggingssida. Dempet — den som fikk riktig språk fra
   nettleseren skal ikke måtte forholde seg til det. */
.loginsprak { margin: 10px 0 0; text-align: center; }
.loginsprak .tilbake { padding: 6px 0; font-size: var(--t-4); font-weight: 500; }

/* ==========================================================================
   OPPDRAGSSKJEMAET — to kolonner

   Det lå som én smal stripe midt på en bred skjerm, og krevde rulling for
   noe som får plass på én skjerm. Voiceoveren står i høyre kolonne fordi
   den er hovedsaken: det er den ene tingen vi faktisk leverer over.
   ========================================================================== */

.oppdragskjema {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--luft-3) var(--luft-4);
  align-items: start;
}
.oppdragskjema .skjemabredt { grid-column: 1 / -1; }

/* Tre kolonner når det er plass: hva og hvem . scriptet . voiceover.
   Da ser man hele oppdraget uten aa rulle, som er hele poenget.

   BRYTES ETTER SKJEMAETS BREDDE, IKKE VINDUETS.

   Dette sto foerst som @media. Det var feil maal: mellom vinduskanten og
   skjemaet ligger en sidemeny paa 366 px og kortpolstring paa 88. Paa en
   vanlig laptop paa 1440 ga @media (min-width: 1180px) tre kolonner i et
   skjema som bare hadde 940 px aa dele paa, og hver kolonne ble 269 px.
   Da brakk «Oensket levering» over to linjer og datofeltet viste «dd.mm...».

   @container spoer elementet selv hvor bredt DET er. Da spiller det ingen
   rolle om sidemenyen finnes, om kortet faar mer polstring senere, eller om
   skjemaet en dag brukes et annet sted. Nettlesere uten stoette faar én
   kolonne, som er den samme utgaven mobil faar. */
#oppdragsskjema { container-type: inline-size; }

@container (min-width: 1180px) {
  .oppdragskjema {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr) minmax(0, 1fr);
  }
}

/* Mellom 700 og 1180: to kolonner.

   Voiceoveren laa i full bredde UNDER de to andre. Da ble skjemaet like
   langt som om det var én kolonne, bare med en bred, tom stripe ved siden
   av. Naa staar oppdragsfeltene til venstre i hele hoyden, og scriptet og
   voiceoveren stables til hoyre. Samme innhold, nesten halve hoyden. */
@container (min-width: 700px) and (max-width: 1179.98px) {
  .oppdragskjema { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  /* Foerste barn er et skjult felt, saa kolonnene er barn 2, 3 og 4. */
  .oppdragskjema > .skjemakolonne:nth-child(2) { grid-column: 1; grid-row: 1 / span 2; }
  .oppdragskjema > .skjemakolonne:nth-child(3) { grid-column: 2; grid-row: 1; }
  .oppdragskjema > .skjemakolonne:nth-child(4) { grid-column: 2; grid-row: 2; }
}

/* Scriptfeltet fyller høyden i kolonnen sin, i stedet for å ha et fast
   antall rader som enten er for lite eller etterlater tomrom. */
.hoyfelt { display: flex; flex-direction: column; }
.hoyfelt textarea { flex: 1 1 auto; min-height: 320px; resize: vertical; }

.feltrad {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  /* RADAVSTANDEN MÅ IKKE VÆRE NULL.
     Her sto «gap: 0 var(--luft-2)». Sammen med «.feltrad .felt { margin: 0 }»
     ga det null piksler mellom bunnen av ett felt og etiketten til det
     neste — «Tildelt» og «Ønsket levering» klistret seg sammen. */
  gap: var(--luft-3) var(--luft-2);
}
@media (max-width: 560px) {
  .feltrad { grid-template-columns: minmax(0, 1fr); }
}

/* --- slippflata for voiceover --------------------------------------------
   Låst til oppdraget er lagret. Grunnen er ikke pirk: filene må ha en mappe
   å ligge i, og mappa navngis etter jobbnummeret — som ikke finnes før
   raden er opprettet. Å laste opp til ingensteds er verre enn å vente. */
.slippflate {
  border: 1.5px dashed var(--line);
  border-radius: var(--r-2);
  padding: var(--luft-3) var(--luft-2);
  text-align: center;
  background: var(--flate-svak);
  transition: border-color .15s, background .15s;
}
.slippflate .slipptekst { margin: 0 0 4px; color: var(--ink); }
.slippflate .hint { margin: 0 0 12px; }
.slippflate.over {
  border-color: var(--brand);
  background: var(--brand-myk);
}
.slippflate[data-laast="ja"] { opacity: .55; }
.slippflate[data-laast="ja"] .slipptekst { color: var(--ink-soft); }

@media (prefers-reduced-motion: reduce) {
  .slippflate { transition: none; }
}

/* --- fillista ------------------------------------------------------------- */
.oppdragsfil {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto auto;
  align-items: center;
  /* Radavstanden må ikke være null: avspilleren legger seg på egen rad
     under navnet, og uten gap klistrer den seg til linja over. */
  gap: 8px 10px;
  padding: 11px 0;
  border-bottom: 1px solid var(--line);
}
.oppdragsfil:first-child { border-top: 1px solid var(--line); margin-top: 12px; }

/* Lydspilleren er nettleserens egen og kan ikke stiles innvendig, men hoyden
   kan settes. Standard er rundt 54 px; 40 holder for aa spille av og spole,
   og med to lydfiler og et dokument sparer det en halv skjermhoyde. */
.oppdragsfil audio { height: 40px; }
.oppdragsfil .merke {
  font-size: var(--t-1);
  font-weight: 700;
  letter-spacing: .08em;
  padding: 2px 7px;
  border-radius: var(--r-1);
  background: var(--brand-myk);
  color: var(--ink);
}
.oppdragsfil .navn { min-width: 0; overflow: hidden; text-overflow: ellipsis;
                     white-space: nowrap; }
.oppdragsfil .storrelse { font-size: var(--t-3); color: var(--ink-svak);
                          font-variant-numeric: tabular-nums; white-space: nowrap; }
.oppdragsfil audio { grid-column: 1 / -1; width: 100%; margin-top: 6px; height: 32px; }

/* Voiceover-filene på et oppdrag. Spilles av her, ikke i Drive — samme
   begrunnelse som forhåndsvisningen av klippene har. */
.lydfil { padding: 10px 0; border-bottom: 1px solid var(--line); }
.lydfil:last-child { border-bottom: 0; padding-bottom: 0; }
.lydfil .lydtopp {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--luft-2);
  margin-bottom: 6px;
}
.lydfil .navn { margin: 0; font-weight: 600; min-width: 0; }
.lydfil audio { width: 100%; height: 34px; display: block; }
.lydfil .tilbake { padding: 2px 0; font-size: var(--t-4); flex: none; }

/* ==========================================================================
   LEVERINGEN

   Sida var to og en halv skjermhoeyde for én levering. Det meste av det var
   luft rundt ting, ikke ting. Slippsonen alene var 283 piksler.
   ========================================================================== */

/* En tom feilmelding tok 27 piksler paa hver eneste skjerm den sto paa,
   og sa ingenting. */
.feilmelding:empty { display: none; }

#leverkort .slippsone { padding: 18px 20px; }
#leverkort .slippikon { margin-bottom: 10px; }
#leverkort .slippsone .hint { margin: 4px 0 10px; }
#leverkort .slipptittel { margin: 0; }

/* Scriptet leses, ikke skummes. Litt luftigere linjeavstand enn brødteksten,
   og en venstrekant som skiller det fra det som er kommentarer om det. */
.scripttekst {
  line-height: 1.75;
  border-left: 3px solid var(--brand-myk);
  padding-left: var(--luft-2);
  white-space: pre-wrap;
}

/* --- opptjeningsoversikten -------------------------------------------------
   «Klart å fakturere» står størst med vilje: det er den ene linja som sier
   «du har penger å hente nå». Resten er kontekst rundt det.
   -------------------------------------------------------------------------- */
.opptjening .sumtall { font-size: 2.6rem; margin-bottom: var(--luft-3); }

.tall-rad {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: var(--luft-2);
  border-top: 1px solid var(--line);
  padding-top: var(--luft-2);
}
.tallboks { display: flex; flex-direction: column; gap: 2px; }
.tallboks .verdi {
  font-size: var(--t-6); font-weight: 700;
  font-variant-numeric: tabular-nums; color: var(--ink);
}
.tallboks .etikett { font-size: var(--t-3); color: var(--ink-soft); }

/* nordiva.css setter bredden på en liste av input-typer, og «number» og
   «date» står ikke i den. Honorarfeltet ble derfor stående som en liten
   stump ved siden av felt i full bredde. Samme felle som traff søkefeltet
   tidligere — regelen er skrevet som en hviteliste, og en hviteliste
   glemmer alltid noe. */
.oppdragskjema input[type=number],
.oppdragskjema input[type=date],
.oppdragskjema input[type=text],
.oppdragskjema select,
.oppdragskjema textarea { width: 100%; }

/* Oppdragsskjemaet trenger mer enn taket på 980 px.

   «.innhold .wrap» setter det taket fordi brødtekst blir uleselig i lange
   linjer. Et skjema er ikke brødtekst: her betyr bredde at man ser hele
   oppdraget uten å rulle, og det var hele grunnen til å dele det i kolonner.

   Bare denne skjermen får unntaket. Vurderingskortene og oversiktene har
   fortsatt godt av taket. */
#skjerm-oppdrag .wrap.bred { max-width: min(1500px, 100%); }

/* Oppdragsskjermen er den ene siden der målet er at ALT skal ses uten å
   rulle. Bunnluften som gir de andre skjermene pusterom, er her de siste
   pikslene som skyver knapperaden under folden. */
#skjerm-oppdrag { padding-bottom: var(--luft-3); }
#skjerm-oppdrag .oppdragskjema .knapperad { margin-bottom: 0; }

/* Tredje kolonne var den høyeste og bestemte dermed hele sidehøyden.
   Slippflata og «Noe spesielt» er strammet inn til de akkurat rommer det de
   skal — resten var luft som kostet en rullefelt. */
#skjerm-oppdrag .slippflate { padding: var(--luft-2) var(--luft-2); }
#skjerm-oppdrag .slippflate .hint { margin-bottom: 9px; }
#skjerm-oppdrag #o-brief { min-height: 96px; }
#skjerm-oppdrag .hoyfelt textarea { min-height: 280px; }

/* ==========================================================================
   LUFT — felles regler, ikke pynt per skjema

   Det som gikk galt: hjelpetekster og etiketter havnet inntil hverandre, og
   siden så rotete ut selv om hvert enkelt element var riktig. Årsaken var
   alltid den samme — en avstand satt til null ett sted, eller en marg
   fjernet uten at noe erstattet den.

   Reglene under gjelder ALT vi lager. De står her, ikke i hvert skjema, så
   nye felt arver dem uten at noen må huske dem. Se ogsaa CLAUDE.md.
   ========================================================================== */

/* En hjelpetekst hører til feltet OVER seg. Delt CSS gir den 28 px på toppen,
   som binder den til det neste feltet i stedet — feil element. */
.felt .hint,
.slippflate .hint,
.oppdragskjema .hint {
  margin-top: 6px;
  margin-bottom: 0;
  line-height: 1.55;
}

/* Ingen feltgruppe uten pust under seg. «.feltrad .felt { margin: 0 }» i den
   delte fila fjerner margen, og da må rutenettets gap ta over — ellers blir
   det null. */
.oppdragskjema .felt { margin-bottom: var(--luft-3); }

/* To .feltrad etter hverandre er to SØSKEN. Avstanden mellom dem er margen
   deres, ikke rutenettets gap — gap gjelder bare innenfor én av dem.
   Her sto «margin-bottom: 0», og da lå «Tildelt»-feltet og
   «Ønsket levering»-etiketten med null piksler mellom seg. */
.oppdragskjema .feltrad { margin-bottom: var(--luft-3); }

/* Feltene INNI en rad har derimot ingen egen marg — der tar gap over. */
.oppdragskjema .feltrad .felt { margin-bottom: 0; }

/* En etikett skal aldri klistre seg til elementet over. */
.oppdragskjema label { margin-bottom: 8px; }

/* Knapper som står ved siden av hverandre trenger plass å bli truffet på,
   ikke bare plass å stå på. */
.oppdragskjema .knapperad { gap: 12px; margin-top: var(--luft-3); }

/* Kolonnene i skjemaet trenger luft mellom seg, ikke bare mellom feltene. */
.oppdragskjema { column-gap: var(--luft-4); }

/* ==========================================================================
   SKJEMAFELT — én regel for alle typer

   nordiva.css lister opp input-typene som skal ha polstring og høyde:
   text, email, tel, password, url, date. En hviteliste glemmer alltid noe,
   og her har den glemt to ganger:

     type="search"  fikk ikke bredde  (søkefeltet i klippene)
     type="number"  fikk verken polstring, høyde eller ramme  (honoraret)

   Honorarfeltet sto derfor som en tynn stripe ved siden av felt på 54 px.
   Dette snur regelen: alle inputs får samme behandling, unntatt de som
   åpenbart ikke er tekstfelt.
   ========================================================================== */

/* :where() og ikke :not() i kjede.

   Første utgave brukte fem :not([type=...]) etter hverandre. :not() teller
   med spesifisiteten til det den inneholder, så regelen fikk (0,6,1) og slo
   søkefeltets egen regel på (0,3,1). Resultatet: søkefeltet mistet
   venstrepolstringen sin, og forstørrelsesglasset la seg oppå teksten.

   :where() teller null. Regelen under er (0,1,1) og taper mot alt som er
   skrevet med hensikt for et bestemt felt, som den skal. */
.innhold input:not(:where([type=checkbox], [type=radio], [type=file], [type=hidden], [type=range])),
.innhold select,
.innhold textarea {
  font: inherit;
  font-size: var(--t-5);
  width: 100%;
  padding: 15px 18px;
  min-height: 54px;
  border: 1.5px solid var(--line);
  border-radius: var(--r-2);
  background: var(--flate-felt);
  color: var(--ink);
}

/* ==========================================================================
   LUFT I SKJEMAER — mer enn det som «går an»

   Et skjema der alt akkurat får plass leses som trangt selv når ingenting
   overlapper. Disse verdiene er satt for at det skal se rolig ut, ikke for
   at det skal gå opp.
   ========================================================================== */

/* Kortet er bredt her; da tåler det — og trenger — mer polstring enn de
   smale kortene på de andre skjermene. */
/* «.innhold .kort» setter 20/22 px, som passer et smalt kort. Dette er
   1400 px bredt — der leses samme polstring som at innholdet er presset
   mot kanten. */
#skjerm-oppdrag .kort { padding: var(--luft-4) var(--luft-4) var(--luft-3); }

/* Overskriften i kortet skal ikke klistre seg til første etikett. */
#oppdragsskjema #skjema-tittel { margin: 0 0 var(--luft-3); }

.oppdragskjema {
  column-gap: var(--luft-5);
  row-gap: var(--luft-3);
}
.oppdragskjema .felt { margin-bottom: var(--luft-4); }
.oppdragskjema .feltrad { margin-bottom: var(--luft-4); }
.oppdragskjema .feltrad .felt { margin-bottom: 0; }
.oppdragskjema .feltrad { row-gap: var(--luft-4); }

/* Etiketten trenger å stå fri fra feltet sitt, ikke ligge oppå det. */
.oppdragskjema label { margin-bottom: 10px; }

/* Hjelpeteksten hører til feltet over, men skal ikke klebe seg til det. */
.oppdragskjema .hint { margin-top: 8px; line-height: 1.6; }

/* Knapperaden er siste element. Den trenger tydelig avstand opp, så den
   leses som «her er du ferdig» og ikke som enda et felt. */
.oppdragskjema .knapperad { margin-top: var(--luft-4); gap: 14px; }

/* --- e-postruta før utsending ---------------------------------------------
   Teksten går til et menneske som skal jobbe for oss. Da skal et menneske ha
   lest den, og kunne endre den. Malen er et utgangspunkt, ikke en fasit.
   -------------------------------------------------------------------------- */
.epostrute {
  border: 1px solid var(--brand);
  border-radius: var(--r-2);
  background: var(--brand-myk);
  padding: var(--luft-3);
  margin: var(--luft-3) 0 0;
}
.epostrute h3 { margin: 0 0 var(--luft-2); }
.epostrute textarea { min-height: 260px; line-height: 1.65; }
.epostrute .knapperad { margin-top: var(--luft-2); margin-bottom: 0; }

/* Filer valgt før lagring. De ligger i kø, ikke i Drive ennå — merket sier
   det, så ingen tror de er lastet opp. */
.oppdragsfil.ventende { opacity: .72; }
.oppdragsfil.ventende .merke { background: var(--flate-svak); color: var(--ink-soft); }
.oppdragsfil.ventende .hint { margin: 0; grid-column: 1 / -1; }

/* En låst knapp skal se låst ut, ikke ødelagt. */
.btn:disabled, [aria-disabled="true"] { opacity: .45; pointer-events: none; }

/* Linja som fyller seg under en fil som lastes opp. Prosenten står ved siden
   av: en stripe alene sier «det skjer noe», et tall sier hvor langt. */
.oppdragsfil.laster .framdrift {
  grid-column: 1 / -1;
  height: 4px;
  border-radius: var(--r-1);
  background: var(--flate-svak);
  overflow: hidden;
  margin-top: 8px;
}
.oppdragsfil.laster .framdrift i {
  display: block;
  height: 100%;
  background: var(--brand);
  transition: width .15s linear;
}
.oppdragsfil.laster .merke { background: var(--brand); color: #fff; }

@media (prefers-reduced-motion: reduce) {
  .oppdragsfil.laster .framdrift i { transition: none; }
}

/* En knapp som sletter skal ikke se ut som en som lagrer. Rød først når man
   holder over: den skal være rolig i lista og tydelig i det man sikter. */
.tilbake.farlig { color: var(--ink-soft); }
.tilbake.farlig:hover { color: var(--red); }

/* --- kolonneoverskrifter i oppdragsskjemaet -------------------------------
   Skjemaet er tre deler av samme ting: hva som skal lages, hva som skal
   leses, og hva vi sender over. Uten overskrifter leses de tre kolonnene som
   én lang liste felt satt ved siden av hverandre.

   Streken under binder kolonnen sammen visuelt, så øyet ser tre bolker og
   ikke ni løse felt.
   -------------------------------------------------------------------------- */
.kolonnetittel {
  margin: 0 0 var(--luft-3);
  padding-bottom: 10px;
  border-bottom: 1px solid var(--line);
  font-size: var(--t-2);
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--ink-soft);
}

/* Feltene i en rad skal stå på samme grunnlinje selv når det ene har
   hjelpetekst og det andre ikke. Uten dette hopper etikettene i neste rad. */
.oppdragskjema .feltrad { align-items: start; }

/* Hjelpetekstene i de smale kolonnene brekker lett over flere linjer og gjør
   kanten ujevn. De er kortet ned, men taket her hindrer at en fremtidig
   lengre tekst river opp oppsettet igjen. */
.oppdragskjema .feltrad .hint {
  font-size: var(--t-3);
  line-height: 1.5;
}

/* Scriptboksen strekker seg til bunnen av raden.
   Kolonnene har ulik naturlig høyde: feltene til venstre er mange, scriptet
   er ett felt. Uten dette endte de tre kolonnene i en trapp, og under
   scriptboksen ble det et tomrom som ser ut som noe mangler. Scriptet er
   tekstfeltet man faktisk vil ha stort, så det er det som får plassen. */
.skjemakolonne { display: flex; flex-direction: column; }
.oppdragskjema > .skjemakolonne:nth-child(3) { align-self: stretch; }
.skjemakolonne > .hoyfelt { flex: 1 1 auto; }

/* ------------------------------------------------------------- DRIFT ---
   Helsesjekken, aktiviteten og feilloggen i admin, og «Det vi har
   registrert» i profilen. Lister med luft mellom radene: en lang logg uten
   den leses som én blokk. */
.aktivitetsliste,
.helseliste {
  list-style: none;
  margin: var(--luft-2) 0 0;
  padding: 0;
  display: grid;
  row-gap: var(--luft-1);
}
.aktivitetsliste li { line-height: 1.5; overflow-wrap: anywhere; }
.aktivitetstid {
  color: var(--ink-soft);
  font-variant-numeric: tabular-nums;
  margin-right: var(--luft-1);
}
.feildetalj {
  display: block;
  margin-top: 8px;
  color: var(--ink-soft);
  font-size: .875em;
  line-height: 1.5;
  overflow-wrap: anywhere;
}
.helseliste li {
  display: flex;
  align-items: flex-start;
  column-gap: var(--luft-1);
  line-height: 1.5;
}
.helseliste .lapp { flex: none; }
.helsepunkt { display: block; line-height: 1.5; }
.drifttopp {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  column-gap: var(--luft-2);
  row-gap: var(--luft-1);
}
.tabellrulle { overflow-x: auto; margin-top: var(--luft-2); }
.drifttabell { width: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; }
.drifttabell th,
.drifttabell td {
  text-align: left;
  vertical-align: top;
  padding: var(--luft-1);
  border-bottom: 1px solid var(--line);
  line-height: 1.5;
}
.drifttabell th { font-weight: 600; color: var(--ink-soft); white-space: nowrap; }
.klippliste {
  margin: var(--luft-2) 0 0;
  padding-left: var(--luft-3);
  display: grid;
  row-gap: var(--luft-1);
}
.klippliste li { line-height: 1.5; overflow-wrap: anywhere; }
#skjerm-drift .kort + .kort { margin-top: var(--luft-3); }
#skjerm-drift h3 { margin: var(--luft-3) 0 0; }
#helse-banner { padding-top: var(--luft-2); }

/* Adminpanelet har åtte faner. nordiva.css deler bredden likt og kutter
   teksten, og åtte knapper på en telefon ble «Op…», «Ma…» og «Dr…». Her
   får hver knapp plassen teksten trenger, og menyen dras sidelengs. Den
   valgte fanen rulles fram av gaaTil() i admin.js. */
@media (max-width: 820px) {
  .bunnmeny.rullbar {
    overflow-x: auto;
    justify-content: flex-start;
    scrollbar-width: none;
    overscroll-behavior-x: contain;
  }
  .bunnmeny.rullbar::-webkit-scrollbar { display: none; }
  .bunnmeny.rullbar button {
    flex: 0 0 auto;
    padding-left: var(--luft-2);
    padding-right: var(--luft-2);
  }
}

/* Portalen har fem faner, og de skal stå i bredden, ikke dras. Delt likt
   fikk hver knapp 52 px til teksten på en 375 px skjerm, og «Oppdrag» alene
   trenger 57. Her deler knappene fortsatt likt, men ingen blir smalere enn
   sin egen tekst: et kort ord gir fra seg plassen det ikke bruker.

   Kortformene i ordliste.js er valgt så alle fem står i bredden ned til
   360 px i begge språk. Er skjermen smalere, tar .rullbar over og menyen
   dras, i stedet for å kutte ordene med «…». Grunnbredden er klikkflaten,
   så «Jobs» aldri blir smalere enn 44 px. Den står som tall og ikke som
   var(--luft-4): variabelen krymper til 36 px på telefon (nordiva.css), og
   da ble «Klipp» 41 px bred på 320 px. Polstringen på 4 px er gulvet for
   en knapp med lang tekst; er det plass, får den mer. Med nordiva.css sine
   6 px ble det 5 px for lite til norsk på 360 px. */
@media (max-width: 820px) {
  .bunnmeny.rullbar.fyll button {
    flex: 1 0 44px;
    min-width: max-content;
    padding-left: 4px;
    padding-right: 4px;
  }
}


/* --- Ad Library-video som har gått ut -------------------------------------
   Meta holder adressen ute i omtrent fire dager. Kortet sier det rett ut, og
   spilleren viser en forklaring i stedet for å snurre på 0:00. */
.refutlopt {
  margin: 0 0 var(--luft-2);
  font-size: var(--t-4);
  color: var(--ink-soft);
}
.filmutlopt {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: 240px;
  padding: 40px 24px;
  text-align: center;
  color: #fff;
}
.filmutlopt span { max-width: 44ch; opacity: .78; }

/* --- teamet (12. september 2026) ------------------------------------------
   Siden heter Team, ikke Videoredigerere: voiceover-artistene står her også.
   Kortet viser hvem, hva de gjør og hvordan de nås. Knappene for å endre
   ligger bak «Innstillinger» og åpner seg som en egen rad under kortet. */
.innhold .personkort { flex-wrap: wrap; }
.innhold .personkort.av .personmerke,
.innhold .personkort.av .persontekst { opacity: .6; }
.bolktall { margin-left: 6px; font-weight: 500; opacity: .7; }
.personstat {
  font-size: var(--t-3);
  line-height: 1.4;
  color: var(--ink-soft);
  text-align: right;
}
.personvalg {
  flex: 1 0 100%;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding-top: var(--luft-3);
  border-top: 1px solid var(--line);
}
.personvalg[hidden] { display: none; }
.personvalgknapp.apen { background: var(--flate-hover); }
.personmerke.tom {
  background: var(--flate-svak);
  color: var(--ink-soft);
  border: 1px dashed var(--line-mork);
}
@media (max-width: 640px) {
  .innhold .personkort { align-items: flex-start; }
  .personhoyre {
    flex: 1 0 100%;
    flex-wrap: wrap;
    row-gap: var(--luft-2);
    justify-content: flex-start;
    padding-left: 56px;
  }
  .personstat { text-align: left; white-space: nowrap; }
  /* Knappene i kortet strekkes ikke til full bredde, slik andre knapper
     gjør på mobil. Seks knapper under hverandre ble en hel skjerm. */
  .innhold .personkort .personhoyre .btn,
  .innhold .personkort .personvalg .btn { width: auto; flex: none; }
}

/* --- inspirasjon: alle i én rekke, merket på kortet, og AI-analysen ---------
   Under «Alle» står kortene i én hylle, og merket står på hvert kort i
   stedet for som overskrift over en rad. */
.refmerke {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0;
  font-size: var(--t-3);
}
.refmerke b { font-weight: 600; }
.merkelogo.liten { width: 22px; height: 22px; flex: 0 0 22px; }
.stikk.egen { color: var(--ink); background: var(--flate-hover); }

.refanalyser { width: 100%; justify-content: center; }
.refanalyser-igjen { align-self: flex-start; font-size: var(--t-3); }
.refanalysestatus { margin: 0; font-size: var(--t-3); }
.refanalysestatus[hidden] { display: none; }
.refanalyse {
  padding: 10px 12px;
  border: 1px solid var(--line);
  border-radius: var(--r-2);
  background: var(--flate-svak);
}
.refanalyse > summary { cursor: pointer; font-weight: 600; font-size: var(--t-4); }
.refanalyse[open] > summary { margin-bottom: var(--luft-2); }
.refanalyse-kort { margin: 0 0 var(--luft-2); font-weight: 600; font-size: var(--t-4); line-height: 1.45; }
.refanalyse-fakta { margin: 0 0 var(--luft-2); font-size: var(--t-3); color: var(--ink-soft); }
.refanalyse-punkter,
.refanalyse-gjor ul {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin: 0;
  padding-left: 18px;
  font-size: var(--t-3);
  line-height: 1.45;
}
.refanalyse-maalt {
  padding: 1px 6px;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
  font-size: var(--t-2);
  color: var(--ink-soft);
}
.refanalyse-gjor { margin-top: var(--luft-2); font-size: var(--t-3); }
.refanalyse-gjor b { display: block; margin-bottom: 4px; }
.refanalyse .hint { margin: var(--luft-2) 0 0; font-size: var(--t-2); }

/* --- testvisning --------------------------------------------------------------
   Linja øverst når admin ser portalen som testbrukeren. Den skal ikke kunne
   forveksles med portalen selv, derfor merkefargen over hele bredden. */
.meny2 button[hidden] { display: none; }
.visningslinje {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px 16px;
  padding: 10px 20px;
  background: var(--brand);
  color: #fff;
  font-size: var(--t-4);
  line-height: 1.4;
}
.visningslinje b { margin-right: 8px; }
.visningsknapper { display: flex; flex-wrap: wrap; gap: 8px; }
.visningslinje .btn.rolig { background: rgba(255, 255, 255, .14); color: #fff; border-color: rgba(255, 255, 255, .35); }
.visningslinje .btn.pil { background: #fff; color: var(--brand); }

/* --- Drift (omskrevet 12. september 2026) -----------------------------------
   Hele bredden. Øverst tallene man vil vite, så hvem som har vært inne og
   grafen på venstre side, helsesjekken og oppdragene til høyre, og
   driftsloggen under. Tabellene ligger under «Mer detaljer». */
/* (tak fjernet 21. sep 2026: admin bruker hele skjermen, se .adminramme nederst) */
.driftfliser {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  gap: var(--luft-3);
  margin: var(--luft-3) 0;
}
.driftvarsel { grid-column: 1 / -1; }
.driftflis {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 18px 20px;
  border: 1px solid var(--kant-kort);
  border-radius: var(--r-3);
  background: var(--flate-kort);
}
.flistall { font-size: var(--t-8); font-weight: 700; line-height: 1.4; font-variant-numeric: tabular-nums; }
.flistall small { font-size: var(--t-5); font-weight: 500; color: var(--ink-soft); }
.flisnavn { font-weight: 600; }
.flisunder { font-size: var(--t-3); color: var(--ink-soft); }
.driftflis.ok .flistall { color: var(--green); }
/* KANT, IKKE FLATE. 28. september 2026. Flisa er et helt kort, og den lå på
   --red-bg: farge som svak flate. Kanten går fra --red-line til --red av
   samme grunn som på opplastraden: uten fyllet må hårstreken bære
   tilstanden alene. Tallet er rødt fra før. */
.driftflis.feil { border-color: var(--red); }
.driftflis.feil .flistall { color: var(--red); }

.driftrutenett {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
  gap: var(--luft-3);
  align-items: start;
}
.driftrutenett .hel { grid-column: 1 / -1; }
.driftkolonne { display: grid; gap: var(--luft-3); align-content: start; min-width: 0; }
#skjerm-drift .driftrutenett .kort + .kort { margin-top: 0; }
@media (max-width: 1000px) { .driftrutenett { grid-template-columns: minmax(0, 1fr); } }
.driftkort h2 { margin: 0; }
.driftkort .drifttopp { margin-bottom: var(--luft-2); }

/* Posten ut. Én rad per brev: hva slags brev, til hvem, når, og hva som
   skjedde med det. Kolonnene faller til to på smal skjerm. */
.postliste { list-style: none; margin: 0; padding: 0; display: grid; row-gap: var(--luft-2); }
.postrad {
  display: grid;
  grid-template-columns: minmax(130px, 1fr) minmax(140px, 1.4fr) 130px minmax(150px, 1.2fr);
  align-items: center;
  column-gap: var(--luft-2);
  padding-bottom: var(--luft-2);
  border-bottom: 1px solid var(--line);
  line-height: 1.5;
}
.postrad:last-child { border-bottom: 0; }
.postslag, .posthvem, .poststatus { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.postslag { font-weight: 600; }
.posthvem b, .posthvem .hint, .postslag .hint { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.posttid { color: var(--ink-soft); font-size: var(--t-4); }
.poststatus { align-items: flex-start; }
.poststatus .hint { white-space: normal; }
@media (max-width: 720px) {
  .postrad { grid-template-columns: 1fr auto; row-gap: 4px; }
  .posttid { grid-column: 2; text-align: right; }
}

.driftpersoner { list-style: none; margin: 0; padding: 0; display: grid; row-gap: var(--luft-2); }
.driftperson {
  display: grid;
  grid-template-columns: 40px minmax(120px, 1fr) minmax(120px, 1fr) 92px minmax(150px, 1.3fr) 14px;
  align-items: center;
  column-gap: var(--luft-2);
  padding-bottom: var(--luft-2);
  border-bottom: 1px solid var(--line);
}
.driftperson:last-child { border-bottom: 0; }
.driftperson.av { opacity: .6; }
.drifthvem,
.driftsist { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.drifthvem .hint,
.driftsist .hint { margin: 0; font-size: var(--t-3); }
.driftkart { display: grid; grid-template-columns: repeat(30, minmax(0, 1fr)); gap: 2px; min-width: 0; }
.driftkart i { display: block; height: 20px; border-radius: var(--r-1); background: var(--flate-hover); }
.driftkart i.n1 { background: var(--brand); opacity: .35; }
.driftkart i.n2 { background: var(--brand); opacity: .65; }
.driftkart i.n3 { background: var(--brand); }
.driftkartforklaring { margin: var(--luft-2) 0 0; font-size: var(--t-3); }
@media (max-width: 760px) {
  .driftperson { grid-template-columns: 40px minmax(0, 1fr); row-gap: var(--luft-1); }
  .driftsist,
  .driftklipp,
  .driftkart { grid-column: 2; }
  .driftpil { display: none; }
  .driftkart { grid-template-columns: repeat(30, minmax(0, 1fr)); }
}

.grafvalg { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: var(--luft-2); }
.driftgraf svg { display: block; width: 100%; height: auto; }
/* Startsida bruker hele skjermen. 1200 px (standard for .wrap.bred) ga en
   halvtom side på en vanlig skjerm, og alt sto under hverandre. */
/* (tak fjernet 21. sep 2026: admin bruker hele skjermen, se .adminramme nederst) */
.ovrutenett {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--luft-3);
  /* Kortene i en rad strekkes til samme høyde. Da får raden rette kanter i
     stedet for et hull under det korteste kortet. */
  align-items: stretch;
  margin-top: var(--luft-3);
}
.ovrutenett > .kort { min-width: 0; display: flex; flex-direction: column; }
.ovrutenett > .hel { grid-column: 1 / -1; }
/* Folkene: redigererne og stemmene side om side når det er plass. */
.ovfolk { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 640px), 1fr)); gap: var(--luft-3); }
/* Rader som bare viser tall, uten noe å klikke på. */
.vtabell-rad.stille { cursor: default; min-height: 56px; }
.vtabell-rad.stille:hover { background: none; }
.ovkode { flex: none; min-width: 52px; font-weight: 700; font-variant-numeric: tabular-nums; }
/* Fire statusbokser i én rad når kortet er bredt nok, ellers to og to. */
.prodmaal.fire { grid-template-columns: repeat(auto-fit, minmax(min(100%, 120px), 1fr)); }
@media (max-width: 1100px) {
  .ovrutenett { grid-template-columns: minmax(0, 1fr); }
}

/* --- Oversikt (startsida) --------------------------------------------
   Køen «Venter på deg» og tidslinja «Det som skjedde». Radene i køen er
   knapper som tar deg rett til fanen der arbeidet ligger, derfor minst
   44 px høye (sjekk-luft.mjs). */
.okoliste { list-style: none; margin: 0; padding: 0; display: grid; row-gap: 8px; }
.okorad {
  display: grid;
  grid-template-columns: 52px minmax(0, 1fr) 20px;
  align-items: center;
  column-gap: var(--luft-2);
  width: 100%;
  min-height: 56px;
  padding: 10px 14px;
  border: 1px solid var(--kant-kort);
  border-radius: var(--r-3);
  background: var(--flate-kort);
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
  line-height: 1.5;
}
.okorad:hover { border-color: var(--brand); }
.okotall {
  font-size: var(--t-7); font-weight: 700; line-height: 1.4;
  font-variant-numeric: tabular-nums; text-align: center;
}
.okorad.haster .okotall { color: var(--red); }
.okorad.vent .okotall { color: var(--amber); }
.okotekst { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.okotekst b { font-weight: 600; }
.okotekst span { color: var(--ink-soft); font-size: var(--t-4); }
.okopil { color: var(--ink-soft); justify-self: end; }
.okotomt { display: flex; align-items: center; gap: 10px; color: var(--ink-soft); line-height: 1.6; }

.ovlogg { list-style: none; margin: 0; padding: 0; display: grid; row-gap: var(--luft-2); }
.ovlinje { margin: var(--luft-2) 0 0; line-height: 1.6; }
.ovlinje .merlenke { margin-left: 4px; }
.ovferskhet { margin: var(--luft-2) 0 0; line-height: 1.6; }
#ov-ytelse .prodgruppe { margin-top: var(--luft-3); }

.prodgruppe {
  margin: 0 0 var(--luft-2);
  font-size: var(--t-3);
  font-weight: 700;
  letter-spacing: 1.4px;
  text-transform: uppercase;
  color: var(--ink-soft);
  line-height: 1.5;
}
#ov-stemmer .prodgruppe { margin-top: var(--luft-3); }

.ovlogg li {
  display: grid;
  grid-template-columns: 140px minmax(0, 1fr) auto;
  align-items: baseline;
  column-gap: var(--luft-2);
  padding-bottom: var(--luft-2);
  border-bottom: 1px solid var(--line);
  line-height: 1.6;
}
.ovlogg li:last-child { border-bottom: 0; }
.ovlogg time { color: var(--ink-soft); font-size: var(--t-4); white-space: nowrap; }
.ovlogg .ovhva { min-width: 0; }
.ovlogg .ovhva small { display: block; color: var(--ink-soft); line-height: 1.5; }
@media (max-width: 720px) {
  .ovlogg li { grid-template-columns: 1fr auto; row-gap: 4px; }
  .ovlogg time { grid-column: 1 / -1; }
}

/* --- Produksjon ------------------------------------------------------
   Fanen som svarer på hvor mye vi lager, hvem som laget det, og hvordan det
   går med det. Tallene er admin sine; redigererne ser dem aldri. */
/* KANT, IKKE FLATE. 28. september 2026. Samme sak som .driftflis.feil: et
   helt kort skal ikke ligge på en farget flate. */
.driftflis.ny { border-color: var(--amber); }
.driftflis.ny .flistall { color: var(--amber); }

.grafnokkel {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  color: var(--ink-soft); font-size: var(--t-4); line-height: 1.5;
  margin-bottom: var(--luft-2);
}
.nokkelprikk {
  width: 12px; height: 12px; border-radius: var(--r-1); background: var(--brand);
  display: inline-block; margin-left: 10px;
}
.grafnokkel .nokkelprikk:first-child { margin-left: 0; }
.nokkelprikk.lys { background: var(--brand); opacity: .4; }
.nokkelprikk.lyd { background: var(--green); }
.grafstolpe.lyd { fill: var(--green); }
/* Stablet søyle: video nederst i merkefargen, bilde over i grønt. */
.nokkelprikk.bilde, .grafstolpe.bilde { background: var(--green); fill: var(--green); }
.nokkelprikk.annet, .grafstolpe.annet { background: var(--ink-soft); fill: var(--ink-soft); }
.graftall { font-weight: 700; fill: var(--ink); }

.prodfolk { list-style: none; margin: 0; padding: 0; display: grid; row-gap: var(--luft-3); }
.prodperson {
  display: grid; row-gap: var(--luft-2);
  padding-bottom: var(--luft-3); border-bottom: 1px solid var(--line);
}
.prodperson:last-child { border-bottom: 0; padding-bottom: 0; }
.prodnavn { display: flex; align-items: center; gap: 12px; min-width: 0; }
.prodnavn > span:last-child { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.prodmaal {
  display: grid; gap: var(--luft-2);
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
.prodtall {
  display: flex; flex-direction: column; gap: 2px;
  padding: 12px 14px; border: 1px solid var(--kant-kort); border-radius: var(--r-3);
  background: var(--flate-kort); min-width: 0;
}
.prodtall b { font-size: var(--t-7); line-height: 1.4; font-variant-numeric: tabular-nums; }
.prodtall span { color: var(--ink-soft); font-size: var(--t-4); line-height: 1.5; }
.prodtall small { color: var(--ink-soft); font-size: var(--t-3); line-height: 1.5; opacity: .85; }
.prodbeste { margin: 0; color: var(--ink-soft); line-height: 1.6; }

.prodfilter { margin-bottom: var(--luft-2); }
.prodannonser { list-style: none; margin: 0; padding: 0; display: grid; row-gap: var(--luft-2); }
.prodannonse {
  display: grid;
  grid-template-columns: 70px minmax(140px, 1fr) 120px minmax(120px, auto);
  align-items: center; column-gap: var(--luft-2);
  padding-bottom: var(--luft-2); border-bottom: 1px solid var(--line);
  line-height: 1.5;
}
.prodannonse:last-child { border-bottom: 0; }
.prodnr { font-weight: 700; font-variant-numeric: tabular-nums; }
.prodtittel, .prodroas { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.prodtittel b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.prodroas b { font-variant-numeric: tabular-nums; }
.prodroas .hint { white-space: nowrap; }
.prodstatus { justify-self: start; }
@media (max-width: 720px) {
  .prodannonse { grid-template-columns: 60px 1fr auto; row-gap: 6px; }
  .prodstatus { grid-column: 2 / -1; }
}

.grafstolpe { fill: var(--brand); }
.grafstolpe.idag { fill: var(--green); }
.grafgrid { stroke: var(--line); stroke-width: 1; }
.grafakse { fill: var(--ink-soft); font-size: var(--t-3); font-family: inherit; }

.helserutenett {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 10px 14px;
}
.helserutenett li { display: flex; align-items: flex-start; gap: 8px; font-size: var(--t-4); line-height: 1.4; }
/* KANT, IKKE FLATE. 28. september 2026. Raden lå på --red-bg uten kant i det
   hele tatt, altså farge som ren flate. Nå bærer hårstreken den, og prikken
   til venstre er rød fra før. */
.helserutenett li.feil { grid-column: 1 / -1; padding: 8px 10px; border: 1px solid var(--red); border-radius: var(--r-2); }
.helseprikk { flex: none; width: 9px; height: 9px; margin-top: 6px; border-radius: 50%; background: var(--green); }
.helserutenett li.feil .helseprikk { background: var(--red); }
.helsemelding { display: block; color: var(--ink-soft); font-size: var(--t-3); }

.oppdragsflyt { list-style: none; margin: 0; padding: 0; display: grid; row-gap: var(--luft-2); }
.oppdragsflyt > li { display: grid; row-gap: 8px; padding-bottom: var(--luft-2); border-bottom: 1px solid var(--line); }
.oppdragsflyt > li:last-child { border-bottom: 0; }
.flytnavn { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; font-size: var(--t-4); }
.flytnavn .hint { margin: 0; font-size: var(--t-3); }
.flytsteg { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
.flytsteg li { display: flex; flex-direction: column; gap: 5px; font-size: var(--t-3); color: var(--ink-soft); }
.flytsteg li.gjort { color: var(--ink); }
.flytprikk { height: 6px; border-radius: var(--r-1); background: var(--flate-hover); }
.flytsteg li.gjort .flytprikk { background: var(--green); }
.flyttekst small { display: block; color: var(--ink-soft); }

.dl-filter { display: flex; flex-wrap: wrap; gap: 8px; }
#skjerm-drift .dl-dag {
  margin: var(--luft-3) 0 var(--luft-1);
  font-size: var(--t-3);
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
#skjerm-drift .dl-dag:first-child { margin-top: 0; }
.dl-liste { list-style: none; margin: 0; padding: 0; display: grid; row-gap: 6px; }
.dl-liste li {
  display: grid;
  grid-template-columns: 48px 10px minmax(0, 1fr);
  column-gap: 10px;
  align-items: baseline;
  line-height: 1.5;
}
.dl-tid { color: var(--ink-soft); font-size: var(--t-3); font-variant-numeric: tabular-nums; }
.dl-prikk { width: 8px; height: 8px; border-radius: 50%; background: var(--ink-svak); }
.dl-liste .dl-feil .dl-prikk { background: var(--red); }
.dl-liste .dl-feil .dl-tekst { color: var(--red); }
.dl-liste .dl-innlogging .dl-prikk { background: var(--brand); }
.dl-liste .dl-levering .dl-prikk { background: var(--green); }
.dl-liste .dl-nedlasting .dl-prikk { background: var(--violet); }
.driftmer > summary { cursor: pointer; font-weight: 600; }
.driftmer[open] > summary { margin-bottom: var(--luft-2); }

/* --- Ressurser (12. september 2026, tettere samme kveld) -----------------------
   Én tett rad per spor, med en lydbølge som fylles mens sporet spiller. Mest
   brukt står øverst. Ikonene står som et rutenett. */
.ressursvalg { margin: var(--luft-3) 0 var(--luft-2); }
.ressursfilter .refsok { flex: 1 1 300px; max-width: 420px; }
.mestbrukt { margin-bottom: var(--luft-3); }
.mestbrukt h2,
.ressurshele { margin: 0; font-size: var(--t-5); }
.ressurshele { margin-top: var(--luft-3); }
.ressursliste { list-style: none; margin: var(--luft-2) 0 0; padding: 0; display: grid; row-gap: 6px; }
.ressursrad {
  display: grid;
  grid-template-columns: 36px minmax(150px, 1.1fr) minmax(120px, 1.5fr) minmax(0, auto) 44px 40px;
  align-items: center;
  column-gap: 14px;
  row-gap: 6px;
  padding: 8px 12px;
  border: 1px solid var(--kant-kort);
  border-radius: var(--r-2);
  background: var(--flate-kort);
}
.ressursrad.spiller { border-color: var(--brand); }
.ressursspill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: var(--brand);
  color: #fff;
  cursor: pointer;
}
.ressursspill svg { width: 16px; height: 16px; }
.ressurstekst { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ressurstekst b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--t-4); }
.ressurstekst .hint { margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--t-3); }
.bolge { display: block; height: 32px; min-width: 0; cursor: pointer; }
.bolge.tom { cursor: default; }
.bolge svg { display: block; width: 100%; height: 100%; }
.bolge rect { fill: var(--line-mork); }
.bolge rect.fylt { fill: var(--brand); }
.ressursrad:hover .bolge rect:not(.fylt) { fill: var(--ink-svak); }
.ressursmerker { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; }
.stikk.tempo { font-variant-numeric: tabular-nums; }
.stikk.brukt { color: var(--green); border-color: var(--green-line); background: var(--green-bg); }
.ressurstid { font-size: var(--t-3); color: var(--ink-soft); font-variant-numeric: tabular-nums; text-align: right; }
.ressurslast {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--r-3);
  color: var(--ink);
  background: var(--flate-hover);
}
.ressurslast:hover { background: var(--flate-knapp-hover); }
.ressurslast svg { width: 18px; height: 18px; }
@media (max-width: 900px) {
  .ressursrad { grid-template-columns: 36px minmax(0, 1fr) 44px 40px; }
  .bolge { grid-column: 1 / -1; grid-row: 2; }
  .ressursmerker { display: none; }
}
.ikonhylle {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
  gap: var(--luft-2);
  margin-top: var(--luft-2);
}
.ikonflis {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding: 14px;
  border: 1px solid var(--kant-kort);
  border-radius: var(--r-3);
  background: var(--flate-kort);
  text-align: center;
}
.ikonbilde { display: flex; align-items: center; justify-content: center; width: 72px; height: 72px; border-radius: var(--r-3); background: #fff; }
.ikonbilde img { max-width: 56px; max-height: 56px; object-fit: contain; }
.ikonnavn { font-size: var(--t-3); overflow-wrap: anywhere; }

/* --- loggen til én person (12. september 2026) --------------------------------
   Personradene på Drift åpner et panel fra høyre med klippene de har lastet
   ned og det de har gjort. Samme lag som videovinduet. */
.driftperson[data-personlogg] { cursor: pointer; padding: 10px 8px; border-radius: var(--r-2); }
.driftperson[data-personlogg]:hover { background: var(--flate-svak); }
.driftperson[data-personlogg]:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.driftklipp { display: flex; flex-direction: column; gap: 2px; }
.driftklipp b { font-size: var(--t-5); font-variant-numeric: tabular-nums; }
.driftklipp .hint { margin: 0; font-size: var(--t-3); }
.driftpil { color: var(--ink-soft); font-size: var(--t-6); }
.dl-klikk { cursor: pointer; border-radius: var(--r-2); }
.dl-klikk:hover { background: var(--flate-svak); }
.dl-klikk:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }

.loggskuff { position: fixed; inset: 0; z-index: 120; display: flex; justify-content: flex-end; }
.loggskuff-bakgrunn { position: absolute; inset: 0; background: rgba(4, 7, 20, .6); }
.loggskuff-panel {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: var(--luft-3);
  width: min(560px, 100%);
  height: 100%;
  overflow-y: auto;
  padding: var(--luft-3);
  border-left: 1px solid var(--kant-kort);
  background: var(--flate-klippkort);
  box-shadow: var(--shadow);
}
.loggskuff-topp { display: flex; align-items: center; gap: 12px; }
.loggskuff-navn { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.loggskuff-navn h2 { margin: 0; font-size: var(--t-6); }
.loggskuff-navn .hint { margin: 0; }
.loggskuff-lukk {
  flex: none;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border: 0;
  border-radius: var(--r-3);
  background: var(--flate-hover);
  color: var(--ink);
  cursor: pointer;
}
.minifliser { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.miniflis { display: flex; flex-direction: column; gap: 2px; padding: 12px 14px; border: 1px solid var(--line); border-radius: var(--r-2); }
.miniflis b { font-size: var(--t-6); font-variant-numeric: tabular-nums; }
.miniflis span { font-size: var(--t-3); color: var(--ink-soft); }
.loggskuff-bolk h3 { margin: 0; }
.loggskuff-bolk .drifttopp { margin-bottom: var(--luft-2); }
.loggskuff-bolk .refsok { width: 100%; max-width: none; margin-bottom: var(--luft-2); }
.klipplogg { list-style: none; margin: 0; padding: 0; display: grid; row-gap: 6px; }
.klipplogg li {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 12px;
  row-gap: 2px;
  padding: 8px 10px;
  border-radius: var(--r-2);
  background: var(--flate-svak);
  line-height: 1.4;
}
.klipplogg li.klipplogg-tom { display: block; }
.klipplogg-navn { overflow-wrap: anywhere; }
.klipplogg-tall { font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
.klipplogg .hint { grid-column: 1 / -1; margin: 0; font-size: var(--t-2); }
.loggskuff .dl-dag {
  margin: var(--luft-2) 0 var(--luft-1);
  font-size: var(--t-3);
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.loggskuff-innhold { display: flex; flex-direction: column; gap: var(--luft-3); }
/* Samlenedlastingens klipp: en enkel lenke, ikke boksen andre sammenfoldede
   felt har. */
.loggskuff .arkivklipp { margin-top: 4px; padding: 0; border: 0; background: none; box-shadow: none; font-size: var(--t-3); }
.loggskuff .arkivklipp summary { padding: 0; cursor: pointer; color: var(--brand); font-weight: 500; }
.loggskuff .arkivklipp summary::after { content: none; }
.arkivklipp ul { margin: 4px 0 0; padding-left: 18px; }

/* --- inspirasjonen: små kort og ett stort vindu (12. september 2026) ----------
   Kortet er et bilde, merket, tittelen og to linjer av notatet. Et trykk
   åpner vinduet: videoen til venstre, alt om referansen til høyre. */
.refkort.lite { cursor: pointer; transition: border-color .15s ease; }
.refkort.lite:hover { border-color: var(--brand); }
.refkort.lite:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.refkort.lite .refinnhold { gap: 8px; padding: 14px 14px 16px; }
.refplakat {
  position: relative;
  display: block;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  border-bottom: 1px solid var(--line);
  background: #05091c;
}
.refplakat img { display: block; width: 100%; height: 100%; object-fit: cover; }
.refplakat .spillmerke { position: absolute; left: 50%; top: 50%; margin: -27px 0 0 -27px; }
.refkort.lite:hover .spillmerke { transform: scale(1.07); background: rgba(8, 12, 30, .78); }
.refnotat.avkortet {
  display: -webkit-box;
  overflow: hidden;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  color: var(--ink-soft);
  font-size: var(--t-4);
  line-height: 1.45;
}
.refmerker { display: flex; flex-wrap: wrap; gap: 6px; }
.stikk.ai { color: var(--brand); border-color: var(--brand); background: var(--brand-myk); }
.stikk.advarsel { color: var(--amber); border-color: var(--amber-line); background: var(--amber-bg); }

.refvindukort { width: min(96vw, 1240px); }
.refvinduflate { grid-template-columns: minmax(0, 1fr) 420px; }
.refvindubilde { display: block; max-width: 100%; max-height: calc(92vh - 62px); margin: 0 auto; border-radius: var(--r-3); }
.refvinduinfo {
  display: flex;
  flex-direction: column;
  gap: 14px;
  min-height: 0;
  max-height: calc(92vh - 62px);
  overflow-y: auto;
  padding: 20px;
  border-radius: var(--r-3);
  background: var(--flate-klippkort);
  color: var(--ink);
}
.refvinduinfo h2 { margin: 0; font-size: var(--t-6); }
.refvinduinfo .refnotat { margin: 0; line-height: 1.5; }
.refvinduinfo .knapperad { flex-wrap: wrap; gap: 8px; margin: 0; }
@media (max-width: 900px) {
  .refvindukort { max-height: 94vh; overflow-y: auto; }
  .refvinduflate { grid-template-columns: minmax(0, 1fr); }
  .refvinduinfo { max-height: none; }
}

/* --- kjeden på Script (13. september 2026) -------------------------------------
   Voiceover, video og publisert som tre trinn på hvert script. Samme
   trinnform som oppdragsflyten på Drift, med fire farger på streken. */
.flytsteg.kjede { gap: 12px; margin-top: var(--luft-2); }
.flytsteg.kjede li { font-size: var(--t-3); }
.kjedenavn { font-size: var(--t-2); letter-spacing: .04em; text-transform: uppercase; color: var(--ink-soft); }
.kjedeverdi { color: var(--ink); line-height: 1.45; }
.flytsteg.kjede small { color: var(--ink-soft); font-size: var(--t-3); }
.kjede-ferdig .flytprikk { background: var(--green); }
.kjede-venter .flytprikk { background: var(--amber); }
.kjede-gang .flytprikk { background: var(--brand); }
.kjede-tom .flytprikk { background: var(--flate-hover); }
.kjede-tom .kjedeverdi { color: var(--ink-soft); }
@media (max-width: 720px) { .flytsteg.kjede { grid-template-columns: minmax(0, 1fr); } }

/* --- vurderingen: varianter, punkter med klipp, og klippvelgeren (13. sep 2026) --- */
.filmvarianter {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
  border-bottom: 1px solid rgba(255, 255, 255, .1);
}
.filmvariant {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 36px;
  padding: 6px 14px;
  border: 1px solid rgba(255, 255, 255, .22);
  border-radius: 999px;
  background: rgba(255, 255, 255, .06);
  color: #fff;
  font: inherit;
  font-size: var(--t-3);
  cursor: pointer;
}
.filmvariant.valgt { border-color: var(--brand); background: var(--brand); }
.filmvariant-hake { display: none; font-weight: 700; }
.filmvariant.sett .filmvariant-hake { display: inline; }
.filmneste {
  margin-left: auto;
  min-height: 36px;
  padding: 6px 14px;
  border: 0;
  border-radius: 999px;
  background: rgba(255, 255, 255, .14);
  color: #fff;
  font: inherit;
  font-size: var(--t-3);
  font-weight: 600;
  cursor: pointer;
}
.vurdertittel { margin: 0 0 6px; font-weight: 600; font-size: var(--t-4); }
.vurderstatus { margin: 8px 0; font-size: var(--t-3); line-height: 1.45; color: var(--amber); }
.filmvurder .btn:disabled { opacity: .45; cursor: not-allowed; }
.vurdergjennom { align-items: center; gap: 12px; flex-wrap: wrap; }
.vurdergjennom .hint { margin: 0; }

.loggendre {
  display: grid;
  place-items: center;
  width: 28px;
  height: 28px;
  margin-left: auto;
  border: 0;
  border-radius: var(--r-2);
  background: transparent;
  color: rgba(255, 255, 255, .6);
  cursor: pointer;
}
.loggendre:hover { color: #fff; background: rgba(255, 255, 255, .1); }
.loggendre + .loggslett { margin-left: 0; }
.loggendring { display: flex; flex-direction: column; gap: 8px; margin-top: 6px; }
.loggendring .knapperad { gap: 8px; flex-wrap: wrap; margin: 0; }
.klipplenke {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  max-width: 100%;
  margin-top: 6px;
  padding: 5px 10px;
  border: 1px solid var(--brand);
  border-radius: var(--r-2);
  background: rgba(255, 255, 255, .06);
  color: #fff;
  font: inherit;
  font-size: var(--t-3);
  text-align: left;
  cursor: pointer;
}
.klipplenke span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.loggklipp,
.loggklippvalg { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 6px 0; }
.loggklipp[hidden] { display: none; }

.klippvelger { position: fixed; inset: 0; z-index: 140; display: grid; place-items: center; }
.klippvelger-bakgrunn { position: absolute; inset: 0; background: rgba(4, 7, 20, .7); }
/* Klippvelgeren (omskrevet 16. sep 2026): kortene til venstre, forhåndsvisningen
   til høyre, og hele panelet har fast høyde så bare lista ruller. */
.klippvelger-panel {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: 14px;
  width: min(96vw, 1320px);
  height: min(90vh, 920px);
  padding: 20px;
  border-radius: 16px;
  background: var(--flate-meny2);
  color: var(--ink);
  box-shadow: var(--shadow);
}
.klippvelger-topp { display: flex; align-items: center; gap: 10px 14px; flex-wrap: wrap; }
.klippvelger-topp h2 { margin: 0; font-size: var(--t-5); }
.klippvelger-sok { flex: 1 1 280px; max-width: none; }
.klippvelger-gammel { display: inline-flex; align-items: center; gap: 8px; min-height: 44px; font-size: var(--t-4); color: var(--ink-soft); cursor: pointer; }
.klippvelger-hoved { flex: 1 1 auto; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) minmax(300px, 400px); gap: 18px; }
.klippvelger-venstre { display: flex; flex-direction: column; gap: 10px; min-height: 0; }
.klippvelger-antall { margin: 0; }
.klippvelger-liste {
  flex: 1 1 auto;
  min-height: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  align-content: start;
  gap: 12px;
  overflow-y: auto;
  overflow-x: hidden;
  padding-right: 4px;
}
.klippvelger-forhand {
  min-height: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 14px;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
  line-height: 1.5;
}
.klippvelger-forhand video { width: 100%; max-height: 56vh; border-radius: var(--r-3); background: #000; }
.klippvelger-forhandtittel { overflow-wrap: anywhere; }
.klippvelger-forhand .btn { align-self: stretch; justify-content: center; }
.klippvelger-tomforhand { margin: auto 0; display: flex; flex-direction: column; gap: 6px; text-align: center; padding: var(--luft-3) var(--luft-1); }
.klippvelger-flere, .klippvelger-ingen { grid-column: 1 / -1; justify-self: center; }

.klippvalg { position: relative; min-width: 0; display: flex; flex-direction: column; gap: 8px; padding: 8px; border: 1px solid var(--line); border-radius: var(--r-3); }
.klippvalg.gammel { border-color: var(--amber-line, var(--amber)); }
.klippvalg.aktiv { border-color: var(--brand); box-shadow: inset 0 0 0 1px var(--brand); }
.klippvalg-se {
  display: flex; flex-direction: column; gap: 8px; min-width: 0;
  padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; border-radius: var(--r-2);
}
.klippvalg-se:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.klippvalg-bilde { position: relative; display: block; aspect-ratio: 16 / 9; overflow: hidden; border-radius: var(--r-2); background: #05091c; }
.klippvalg-bilde img { display: block; width: 100%; height: 100%; object-fit: cover; transition: transform .2s ease; }
.klippvalg-se:hover .klippvalg-bilde img { transform: scale(1.03); }
.klippvalg-lengde, .klippvalg-format, .klippvalg-gammelmerke {
  position: absolute; padding: 2px 7px; border-radius: var(--r-2); font-size: var(--t-2); font-weight: 600; line-height: 1.4;
  background: rgba(4, 7, 20, .72); color: #fff; font-variant-numeric: tabular-nums;
}
.klippvalg-lengde { right: 6px; bottom: 6px; }
.klippvalg-format { left: 6px; bottom: 6px; }
.klippvalg-gammelmerke { left: 6px; top: 6px; background: var(--amber); color: #1d1400; }
.klippvalg-tekst { display: flex; flex-direction: column; gap: 3px; min-width: 0; font-size: var(--t-3); line-height: 1.4; }
.klippvalg-tekst b { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; overflow-wrap: anywhere; }
.klippvalg-mappe { font-size: var(--t-2); color: var(--ink-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.klippvalg-velg { align-self: flex-start; }
.klippvalg.laster { pointer-events: none; }
.klippvalg.laster .klippvalg-bilde, .klippvalg-strek { background: var(--flate-svak); animation: klippLaster 1.2s ease-in-out infinite alternate; }
.klippvalg-strek { display: block; height: 10px; border-radius: var(--r-2); }
.klippvalg-strek.kort { width: 60%; }
@keyframes klippLaster { from { opacity: .45; } to { opacity: .9; } }
@media (prefers-reduced-motion: reduce) { .klippvalg.laster .klippvalg-bilde, .klippvalg-strek { animation: none; } .klippvalg-bilde img { transition: none; } }
@media (max-width: 900px) {
  .klippvelger-panel { height: 94vh; padding: 14px; }
  .klippvelger-hoved { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); }
  .klippvelger-forhand { order: -1; max-height: 46vh; }
  .klippvelger-forhand:not(.har) { display: none; }
  .klippvelger-liste { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
}

/* Med variantlinja og den samlede avgjørelsen ble høyre kolonne for høy, og
   punktlista klemt ned til ett punkt. Nå ruller kolonnen som helhet, og lista
   har en fast minste og største høyde. */
.filmvarianter { flex: 0 0 auto; }
.filmkort.medlogg .filmflate { flex: 1 1 auto; }
.filmkort.medlogg .filmlogg { overflow-y: auto; }
.filmkort.medlogg .loggliste { flex: 0 0 auto; min-height: 140px; max-height: 42vh; }

/* --- «Ferdig vurdert» (13. sep 2026) ------------------------------------------
   Radene sto som «.stripe», den blå handlingslinja, og navnet, lappen og
   «Vurder på nytt» forsvant i merkefargen. Nå en rolig rad per levering. */
#vurdert-historikk { display: flex; flex-direction: column; gap: 10px; }
.vurdertrad {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px 20px;
  padding: 14px 18px;
  border: 1px solid var(--line);
  border-radius: var(--r-2);
  background: var(--flate-felt);
}
.vurdertrad-tekst { display: flex; flex-direction: column; gap: 3px; flex: 1 1 260px; min-width: 0; }
.vurdertrad-tekst b { font-weight: 600; color: var(--ink); line-height: 1.4; }
.vurdertrad-tekst .hint { margin: 0; font-size: var(--t-3); line-height: 1.4; }
.vurdertrad-valg { display: flex; align-items: center; gap: 14px; flex: 0 0 auto; }

/* --- Hos redigereren for endring (13. sep 2026) --------------------------------
   Sendt tilbake med punkter er ikke det samme som ferdig vurdert. Lilla kant,
   en rolig puls i lappen, og hvor langt redigereren har kommet. */
#underendring { display: flex; flex-direction: column; gap: 10px; }
#underendring-bolk > .hint { margin: -4px 0 14px; line-height: 1.45; }
.levende-prikk {
  display: inline-block;
  width: 8px;
  height: 8px;
  margin-right: 7px;
  border-radius: 50%;
  background: currentColor;
  vertical-align: 1px;
  animation: endringspuls 1.8s ease-in-out infinite;
}
@keyframes endringspuls { 0%, 100% { opacity: 1; } 50% { opacity: .3; } }
@media (prefers-reduced-motion: reduce) { .levende-prikk { animation: none; } }

/* --- Kortet for en levering under endring, større (13. sep 2026) ---------------
   Tittelen stort, fremdriften som tall og linje, hele beskjeden, og punktene
   ved siden av. Skjermen er bred nok til det; Til vurdering følger Drift. */
/* (tak fjernet 21. sep 2026: admin bruker hele skjermen, se .adminramme nederst) */
.endringskort {
  display: flex;
  flex-direction: column;
  gap: 20px;
  padding: 24px 26px;
  border: 1px solid var(--line);
  border-left: 4px solid var(--violet);
  border-radius: var(--r-2);
  background: var(--flate-felt);
}
.endringskort-topp {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 14px 24px;
}
.endringskort-navn { flex: 1 1 320px; min-width: 0; }
.endringskort-navn .eyebrow { margin: 0 0 6px; }
.endringskort-navn h3 { margin: 0 0 6px; font-size: var(--t-6); line-height: 1.3; }
.endringskort-navn .hint { margin: 0; line-height: 1.45; }
.endringskort-valg { display: flex; align-items: center; flex-wrap: wrap; gap: 14px; }
.endringskort-valg .lapp { padding: 6px 14px; font-size: var(--t-4); }
.endringskort-flate {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  gap: 22px 32px;
}
@media (max-width: 900px) { .endringskort-flate { grid-template-columns: minmax(0, 1fr); } }
.endringskort-status { display: flex; flex-direction: column; gap: 18px; min-width: 0; }
.etikett {
  margin: 0 0 8px;
  font-size: var(--t-2);
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.endringsframdrift { display: flex; flex-direction: column; gap: 10px; }
.endringsframdrift .etikett { margin-bottom: 0; }
.endringsframdrift .hint { margin: 0; line-height: 1.45; }
.framdrift-tall { display: flex; align-items: baseline; gap: 10px; }
.framdrift-tall b { font-size: var(--t-8); font-weight: 700; line-height: 1.4; color: var(--ink); font-variant-numeric: tabular-nums; }
.framdrift-tall span { font-size: var(--t-5); line-height: 1.4; color: var(--ink-soft); }
.framdriftstolpe {
  display: block;
  width: 100%;
  height: 10px;
  overflow: hidden;
  border-radius: var(--r-2);
  background: var(--line);
}
.framdriftstolpe > span { display: block; height: 100%; border-radius: var(--r-2); background: var(--violet); }
.endringsbeskjed {
  padding: 16px 18px;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
}
.endringsbeskjed p:last-child { margin: 0; line-height: 1.55; white-space: pre-wrap; }
.endringskort-punkter { min-width: 0; }
.endringspunkter { display: flex; flex-direction: column; gap: 8px; margin: 0; padding: 0; list-style: none; }
.endringspunkt {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 14px;
  width: 100%;
  min-height: 48px;
  padding: 10px 14px;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
  background: transparent;
  color: var(--ink);
  font: inherit;
  text-align: left;
}
button.endringspunkt { cursor: pointer; }
button.endringspunkt:hover { border-color: var(--violet); background: var(--brand-myk); }
.endringspunkt-tid { font-weight: 700; color: var(--violet); font-variant-numeric: tabular-nums; }
.endringspunkt-tekst { overflow: hidden; line-height: 1.45; white-space: nowrap; text-overflow: ellipsis; }
.endringspunkt-merke { font-size: var(--t-3); line-height: 1.4; white-space: nowrap; color: var(--ink-soft); }
.endringspunkter li.fikset .endringspunkt-tekst { color: var(--ink-soft); text-decoration: line-through; }
.endringspunkter li.fikset .endringspunkt-merke { color: var(--green); }
.endringspunkter-flere { margin: 10px 0 0; }

/* --- Flere leveringer under endring: kompakte kort i rutenett (13. sep 2026) --- */
#underendring.mange {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 540px), 1fr));
  align-items: start;
  gap: 16px;
}
.endringskort.kompakt { gap: 16px; padding: 20px 22px; }
.endringskort.kompakt .endringskort-navn { flex-basis: 220px; }
.endringskort.kompakt .endringskort-navn h3 { font-size: var(--t-6); }
.endringskort.kompakt .framdrift-tall b { font-size: var(--t-7); }
.endringskort-mer summary {
  display: flex;
  align-items: center;
  gap: 8px;
  min-height: 44px;
  font-weight: 600;
  line-height: 1.4;
  color: var(--brand);
  list-style: none;
  cursor: pointer;
}
.endringskort-mer summary::-webkit-details-marker { display: none; }
.endringskort-mer summary::after { content: '\25BE'; transition: transform .2s ease; }
.endringskort-mer[open] summary::after { transform: rotate(180deg); }
.endringskort-merinnhold { display: flex; flex-direction: column; gap: 16px; padding-top: 8px; }

/* --- Testbrukeren på Team-siden (13. sep 2026) ---------------------------------
   Eget felt med stiplet kant, så det ikke leses som en del av teamet. */
.testpanel {
  margin-bottom: var(--luft-3);
  padding: 18px 20px;
  border: 1px dashed var(--line);
  border-radius: var(--r-2);
  background: var(--flate-felt);
}
.testpanel-topp {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 14px 24px;
  margin-bottom: 14px;
}
.testpanel-tekst { flex: 1 1 300px; min-width: 0; }
.testpanel-tekst .etikett { margin-bottom: 4px; }
.testpanel-tittel { margin: 0 0 4px; font-size: var(--t-5); line-height: 1.4; }
.testpanel-tekst .hint { margin: 0; line-height: 1.45; }
.testpanel-valg { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; }
.rollebryter {
  display: inline-flex;
  gap: 4px;
  padding: 4px;
  border: 1px solid var(--line);
  border-radius: 999px;
}
.rollevalg {
  min-height: 44px;
  padding: 8px 18px;
  border: 0;
  border-radius: 999px;
  background: transparent;
  color: var(--ink-soft);
  font: inherit;
  font-weight: 600;
  line-height: 1.4;
  cursor: pointer;
}
.rollevalg:hover { color: var(--ink); }
.rollevalg.valgt { background: var(--brand); color: #fff; }
.rollevalg:disabled { opacity: .6; cursor: progress; }

/* --- Video eller voiceover, og voiceover-biblioteket (13. sep 2026) ------------- */
.oppdragstype { display: flex; align-items: center; flex-wrap: wrap; gap: 10px 18px; margin-bottom: var(--luft-3); }
.oppdragstype .hint { margin: 0; flex: 1 1 280px; line-height: 1.45; }
/* To kolonner etter skjemaets bredde, som resten av oppdragsskjemaet. Reglene
   som plasserer video-skjemaets kolonner etter nummer, gjelder ikke her. */
@container (min-width: 700px) {
  .oppdragskjema.lydskjema { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}
.oppdragskjema.lydskjema > .skjemakolonne:nth-child(n) { grid-column: auto; grid-row: auto; }
.lydflyt {
  padding: 14px 16px;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
}
.lydflyt ol { display: flex; flex-direction: column; gap: 6px; margin: 0; padding-left: 20px; line-height: 1.5; color: var(--ink-soft); }
.voicesok { width: 100%; margin: 6px 0 8px; }
.voicevalg {
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-height: 360px;
  margin-top: 6px;
  padding-right: 4px;
  overflow-y: auto;
}
.voicekort {
  display: flex;
  flex-direction: column;
  gap: 4px;
  width: 100%;
  min-height: 56px;
  padding: 10px 14px;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
  background: transparent;
  color: var(--ink);
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.voicekort:hover { border-color: var(--brand); }
.voicekort.valgt { border-color: var(--brand); background: var(--brand-myk); box-shadow: inset 0 0 0 1px var(--brand); }
.voicekort-topp { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.voicekort-topp b { font-weight: 600; line-height: 1.4; }
/* Nummer og status på én linje, tittelen under med hele bredden. Lappen
   brytes ned på egen linje hvis kortet er smalt, i stedet for å stikke ut. */
.voicekort-hode { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 6px 10px; min-width: 0; }
.voicekort-nr { font-size: var(--t-3); font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-soft); line-height: 1.4; }
.voicekort-hode .lapp { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.voicekort-tittel { font-weight: 600; line-height: 1.4; overflow-wrap: anywhere; }
/* Dansk voiceover: et tydelig merke ved nummeret (21. september 2026). */
.sprakmerke {
  display: inline-block; margin-left: 4px; padding: 1px 7px; border-radius: 999px;
  background: #C8102E; color: #fff; font-size: var(--t-1); font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase; vertical-align: 1px; line-height: 1.5;
}
.voicekort .hint { margin: 0; font-size: var(--t-3); line-height: 1.45; }
.voicefiler { margin-top: 10px; padding: 12px 14px; border: 1px solid var(--line); border-radius: var(--r-3); }
.voicefiler ul { margin: 0; padding-left: 18px; line-height: 1.55; }
#o-bestillvoice { margin-top: 8px; }
.lydoppdragkort .eyebrow, .lydkort .eyebrow { margin-bottom: 4px; }

/* --- Filmvinduet: større og roligere (13. sep 2026) ----------------------------
   Vinduet med punkter får nesten hele skjermen og en fast, mørk flate, så siden
   bak ikke skinner gjennom. Tidslinja er høyere og merkene større; merker som
   ligger tett, legger seg i rader (felles.js, tegnStripe). */
.filmbakgrunn { background: rgba(4, 7, 20, .95); }
.filmkort.medlogg {
  width: min(97vw, 1600px);
  height: 94vh;
  max-height: 94vh;
  padding: 18px 22px 20px;
  border: 1px solid rgba(255, 255, 255, .08);
  border-radius: 18px;
  background: #0a0f24;
  box-shadow: 0 24px 80px rgba(0, 0, 0, .5);
}
.filmkort.medlogg .filmflate { grid-template-columns: minmax(0, 1fr) 460px; gap: 20px; min-height: 0; }
.filmkort.medlogg .filmvideo { min-height: 0; }
.filmkort.medlogg video { max-height: calc(94vh - 270px); }
.filmkort.medlogg .filmlogg { background: #111735; }
.filmkort .filmstripe { margin-top: 12px; background: rgba(255, 255, 255, .06); }
.stripepunkt { width: 30px; height: 30px; margin-left: -15px; font-size: var(--t-3); }
.filmkort.medlogg .loggliste { max-height: 48vh; }
.filmkort.bareles .loggliste { flex: 1 1 auto; max-height: none; }
.loggskjema {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding-top: 12px;
  border-top: 1px solid rgba(255, 255, 255, .12);
}
.loggskjematopp { display: flex; align-items: baseline; gap: 8px; }
.loggskjematopp .etikett { margin: 0; color: rgba(255, 255, 255, .6); }
.loggskjematopp .loggtid { font-size: var(--t-5); color: #fff; }
.loggbunn { flex-wrap: wrap; margin-top: 0; }
.loggknapper { display: flex; align-items: center; gap: 8px; margin-left: auto; }
.loggbunn .allevarianter { margin: 0; }
@media (max-width: 900px) {
  .filmkort.medlogg .filmflate { grid-template-columns: minmax(0, 1fr); }
  .filmkort.medlogg { height: auto; overflow-y: auto; padding: 14px; }
  .filmkort.medlogg video { max-height: 50vh; }
}

/* Lista tar plassen som er igjen og ruller selv. Da står skjemaet og
   avgjørelsen under synlige, i stedet for at de kuttes i bunnen av vinduet. */
.filmkort.medlogg .loggliste { flex: 1 1 auto; min-height: 140px; max-height: none; }

/* --- Tidslinja i én rad (13. sep 2026) ---------------------------------------
   Knappene i én rad øverst, et tynt spor nederst med en strek på nøyaktig
   sekund, og en linje mellom. Fast høyde og aldri egen rullefelt. Erstatter
   radene fra i sted (felles.js, tegnStripe). */
.filmkort .filmstripe {
  flex: 0 0 auto;
  height: 64px;
  overflow: visible;
  margin-top: 12px;
  border-radius: var(--r-3);
  background: rgba(255, 255, 255, .05);
  border: 1px solid rgba(255, 255, 255, .1);
}
.stripespor {
  position: absolute;
  left: 16px;
  right: 16px;
  bottom: 14px;
  height: 4px;
  border-radius: var(--r-1);
  background: rgba(255, 255, 255, .16);
  pointer-events: none;
}
.stripelinjer { position: absolute; inset: 0; overflow: visible; pointer-events: none; }
.stripelinjer line { stroke: rgba(255, 255, 255, .32); stroke-width: 1.5; }
.stripetikk {
  position: absolute;
  bottom: 10px;
  width: 3px;
  height: 12px;
  margin-left: -1.5px;
  border-radius: var(--r-1);
  background: var(--brand);
  pointer-events: none;
}
.stripetikk.fikset { background: #34a853; }
.stripehode {
  position: absolute;
  bottom: 7px;
  width: 2px;
  height: 18px;
  margin-left: -1px;
  border-radius: var(--r-1);
  background: #fff;
  opacity: .85;
  pointer-events: none;
}
.stripepunkt { top: 6px; width: 28px; height: 28px; margin-left: -14px; font-size: var(--t-2); }

/* nordiva.css har en annen komponent med samme navn (videokort i rad), som
   gjør stripa til en rullende flex-rad og hvert barn til et blått kort.
   For tidslinja i filmvinduet nulles det ut her. */
.filmkort .filmstripe { display: block; padding: 0; }
.filmkort .filmstripe > .stripeinnhold,
.filmkort .filmstripe > .stripeinnhold:hover {
  position: absolute;
  inset: 0;
  display: block;
  flex: none;
  aspect-ratio: auto;
  width: auto;
  height: auto;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  overflow: visible;
  cursor: default;
}

/* --- Flytlinja på Oppdrag (13. sep 2026) ---------------------------------------
   To spor, voiceover og video, med antall per steg. Erstatter «1 åpne av 2». */
.flytlinje { display: flex; flex-direction: column; gap: 10px; margin: 6px 0 var(--luft-3); }
.flytspor { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 14px; }
.flytspor-navn {
  flex: 0 0 96px;
  font-size: var(--t-2);
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.flytknapp-rad { display: flex; flex-wrap: wrap; gap: 8px; }
.flytknapp {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 44px;
  padding: 6px 14px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--flate-felt);
  color: var(--ink);
  font: inherit;
  font-size: var(--t-4);
  line-height: 1.4;
  cursor: pointer;
}
.flytknapp b { font-size: var(--t-5); font-variant-numeric: tabular-nums; }
.flytknapp:hover:not(:disabled) { border-color: var(--brand); }
.flytknapp.valgt { border-color: var(--brand); background: var(--brand); color: #fff; }
.flytknapp.tom { opacity: .5; cursor: default; }
.flytbro { margin: 0 0 0 110px; font-size: var(--t-4); line-height: 1.45; color: var(--ink-soft); }
.flytbro b { color: var(--green); font-size: var(--t-5); }
.flytnull { align-self: flex-start; }

/* --- Video-skjemaet i tre steg (13. sep 2026) ------------------------------------
   Stablet i naturlig rekkefølge: voiceover og script, oppdraget, vedlegg og
   utsending. Kolonnene i HTML-en står i en annen rekkefølge; «order» flytter dem. */
#oppdragform { grid-template-columns: minmax(0, 1fr); gap: 18px; }
#oppdragform > .skjemakolonne:nth-child(n) {
  grid-column: 1 / -1;
  grid-row: auto;
  padding: 18px 20px;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
}
#oppdragform > .skjemakolonne:nth-child(3) { order: 1; }
#oppdragform > .skjemakolonne:nth-child(2) { order: 2; }
#oppdragform > .skjemakolonne:nth-child(4) { order: 3; }
#oppdragform > .skjemabredt { order: 4; }
#oppdragform .voicevalg { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 8px; max-height: none; overflow: visible; }
.voiceingen { grid-column: 1 / -1; margin: 4px 0 0; }
.voiceopptatt { grid-column: 1 / -1; margin-top: 6px; }
.voiceopptatt summary {
  display: flex;
  align-items: center;
  min-height: 44px;
  font-weight: 600;
  line-height: 1.4;
  color: var(--ink-soft);
  cursor: pointer;
}
.voiceopptatt-liste { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 10px; margin-top: 8px; }
.voiceopptatt-liste .voicekort { gap: 6px; padding: 12px 14px; }
.voicekort.opptatt { cursor: default; opacity: .85; }
.voicekort.opptatt:hover { border-color: var(--line); }
.voicekort.opptatt .tilbake { align-self: flex-start; }
.scriptselv { margin-top: 12px; }
.scriptselv summary {
  display: flex;
  align-items: center;
  min-height: 44px;
  font-weight: 600;
  line-height: 1.4;
  color: var(--brand);
  cursor: pointer;
}
.scriptselv-innhold { display: flex; flex-direction: column; gap: 14px; margin-top: 8px; }
.scriptselv .hoyfelt textarea { min-height: 160px; }
@container (min-width: 900px) {
  #oppdragform > .skjemakolonne:nth-child(2) {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    column-gap: 24px;
    align-items: start;
  }
  #oppdragform > .skjemakolonne:nth-child(2) > .kolonnetittel,
  #oppdragform > .skjemakolonne:nth-child(2) > .felt:last-child { grid-column: 1 / -1; }
  #oppdragform > .skjemakolonne:nth-child(4) {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    column-gap: 24px;
    align-items: start;
  }
  #oppdragform > .skjemakolonne:nth-child(4) > .kolonnetittel { grid-column: 1 / -1; }
  .scriptselv-innhold { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px 24px; }
}

/* --- Voiceover-skjemaet i tre steg (13. sep 2026) ------------------------------- */
#lydform { grid-template-columns: minmax(0, 1fr); gap: 18px; }
.lydsteg { padding: 18px 20px; border: 1px solid var(--line); border-radius: var(--r-3); }
.lydsteg-rad { display: grid; grid-template-columns: minmax(0, 1fr); gap: 16px 24px; align-items: start; }
@container (min-width: 800px) {
  .lydsteg-rad { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .lydsteg-rad.tre { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.lyddokliste { margin: 6px 0 12px; padding-left: 18px; line-height: 1.55; }
#l-dokslipp { margin-top: 6px; }
#l-dokslipp.over { border-color: var(--brand); }
#l-standard { margin-left: 6px; }

/* Tre kolonner i «2 · Oppdraget» først når det er plass til formatkortene på
   én rad og serie og varianter side om side; ellers to. */
@container (min-width: 1300px) {
  #oppdragform > .skjemakolonne:nth-child(2) { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* «Noe spesielt?» står ofte tomt; det skal ikke ta en tredjedel av steget. */
#oppdragform #o-brief { height: 110px; min-height: 90px; }

/* --- Oppdragene på Drift, som en kjede av steg (14. sep 2026) ------------------
   Sirkler med linje mellom: grønn hake når steget er gjort, markert ring på
   det som står for tur (lilla når leveringen er sendt tilbake). */
.dflyt { display: flex; flex-direction: column; margin: 0; padding: 0; list-style: none; }
.dflyt-oppdrag { padding: 14px 0 16px; border-bottom: 1px solid var(--line); }
.dflyt-oppdrag:first-child { padding-top: 0; }
.dflyt-oppdrag:last-child { padding-bottom: 0; border-bottom: 0; }
.dflyt-topp { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.dflyt-navn { min-width: 0; font-size: var(--t-4); line-height: 1.4; }
.dflyt-hvem { margin: 2px 0 12px; font-size: var(--t-3); line-height: 1.4; }
.dflyt-steg { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); margin: 0; padding: 0; list-style: none; }
.dflyt-steg li {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  font-size: var(--t-3);
  line-height: 1.4;
  text-align: center;
  color: var(--ink-soft);
}
.dflyt-steg li::before {
  content: '';
  position: absolute;
  top: 10px;
  right: 50%;
  width: 100%;
  height: 2px;
  background: var(--line);
}
.dflyt-steg li:first-child::before { display: none; }
.dflyt-steg li.gjort::before { background: var(--green); }
.dflyt-sirkel {
  position: relative;
  z-index: 1;
  display: grid;
  place-items: center;
  width: 22px;
  height: 22px;
  border: 2px solid var(--line);
  border-radius: 50%;
  background: var(--flate-felt);
  color: #fff;
  font-size: var(--t-2);
  font-weight: 700;
}
.dflyt-steg li.gjort,
.dflyt-steg li.naa { color: var(--ink); }
.dflyt-steg li.gjort .dflyt-sirkel { border-color: var(--green); background: var(--green); }
.dflyt-steg li.naa .dflyt-sirkel { border-color: var(--amber); box-shadow: 0 0 0 4px rgba(245, 180, 60, .18); }
.dflyt-steg li.naa.endre .dflyt-sirkel { border-color: var(--violet); box-shadow: 0 0 0 4px rgba(150, 120, 255, .2); }
.dflyt-steg li.naa.nei .dflyt-sirkel { border-color: var(--red); box-shadow: none; }
.dflyt-tekst small { display: block; margin-top: 2px; font-size: var(--t-2); line-height: 1.4; color: var(--ink-soft); font-variant-numeric: tabular-nums; }
.dflyt-steg li.naa .dflyt-tekst small { color: var(--amber); }
.dflyt-steg li.naa.endre .dflyt-tekst small { color: var(--violet); }

/* --- Flytlinja som én tabell (14. sep 2026) -------------------------------------
   To rader, voiceover og video, med de samme seks kolonnene. Tomme celler er
   dempet; tall over null får farge. Erstatter pillene fra i går (.flytknapp). */
.flytlinje { margin: 6px 0 var(--luft-3); }
.flytkort { overflow-x: auto; border: 1px solid var(--line); border-radius: var(--r-3); background: var(--flate-felt); }
.flytrad { display: grid; grid-template-columns: 112px repeat(6, minmax(100px, 1fr)); min-width: 740px; }
.flytrad + .flytrad { border-top: 1px solid var(--line); }
.flytrad-navn {
  display: flex;
  align-items: center;
  padding: 0 16px;
  font-size: var(--t-2);
  font-weight: 700;
  line-height: 1.4;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ink-soft);
}
.flytcelle {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: 2px;
  min-height: 64px;
  padding: 10px 16px;
  border: 0;
  border-left: 1px solid var(--line);
  border-radius: 0;
  background: transparent;
  color: var(--ink);
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.flytcelle b { font-size: var(--t-6); font-weight: 700; line-height: 1.4; font-variant-numeric: tabular-nums; }
.flytcelle span { font-size: var(--t-3); line-height: 1.4; color: var(--ink-soft); }
.flytrad > .flytcelle + .flytcelle::before {
  content: '\203A';
  position: absolute;
  top: 50%;
  left: -6px;
  padding: 0 2px;
  font-size: var(--t-3);
  line-height: 1.4;
  color: var(--ink-soft);
  background: var(--flate-felt);
  transform: translateY(-50%);
}
.flytcelle.tom,
.flytcelle.info { cursor: default; }
.flytcelle.tom b,
.flytcelle.tom span { opacity: .45; }
button.flytcelle:not(.tom):hover { background: var(--brand-myk); }
.flytcelle.t-arbeid b { color: var(--brand); }
.flytcelle.t-vurdering b { color: var(--amber); }
.flytcelle.t-endring b { color: var(--violet); }
.flytcelle.t-godkjent b { color: var(--green); }
.flytcelle.valgt { background: var(--brand-myk); box-shadow: inset 0 0 0 2px var(--brand); }
.flytekstra { margin: 8px 0 0; font-size: var(--t-3); line-height: 1.45; color: var(--ink-soft); }

/* --- Teamet i tall (14. sep 2026) ----------------------------------------------
   Fire tall i én rad i stedet for en setning. Cellene er de samme som i
   flytlinja på Oppdrag (.flytcelle). */
.teamtall {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  margin: 6px 0 var(--luft-3);
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: var(--r-3);
  background: var(--flate-felt);
}
.teamtall > .flytcelle:first-child { border-left: 0; }
@media (max-width: 640px) {
  .teamtall { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .teamtall > .flytcelle:nth-child(3) { border-left: 0; }
  .teamtall > .flytcelle:nth-child(n+3) { border-top: 1px solid var(--line); }
}

/* --- Referansene i stemmeportalen (14. sep 2026) -------------------------------- */
.refplass { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; margin-left: 6px; }

/* På stemmenes fakturaside er «nr» et scriptnavn («Pro Script 5»), ikke et kort oppdragsnummer. */
#skjerm-honorar .honorarlinje .nr { flex: 0 0 auto; min-width: 7.5em; white-space: nowrap; }

/* Oversikten over referansene under Script i admin. */
#stemmeref-oversikt { margin-top: 32px; }
#stemmeref-oversikt > .hint { margin: 0 0 14px; }

/* Leveringen (14. sep 2026): «Fjern» ved siden av statusen på hver fil. */
.opplasthoyre { display: inline-flex; align-items: center; gap: 12px; flex: none; }

/* Forhåndshentingen av videoene til vurdering (14. sep 2026). */
.forhandlinje { margin: 0 0 10px; line-height: 1.5; }
.forhandlinje.klar { color: var(--green); }

/* Publisering (15. sep 2026): «Ny …» ved hvert tekstfelt med tre
   alternativer, og «Samme tekst som i …» når en annen variant har tekst. */
.feltlabel { display: flex; align-items: center; justify-content: space-between; gap: 6px 12px; flex-wrap: wrap; }
.feltalternativer { display: grid; gap: 8px; margin-top: 10px; }
.altvalg {
  text-align: left; white-space: pre-line; line-height: 1.5; padding: 10px 14px; min-height: 44px;
  border: 1px solid var(--line); border-radius: var(--r-2); background: var(--flate-felt);
  color: inherit; font: inherit; cursor: pointer;
}
.altvalg:hover, .altvalg:focus-visible { border-color: var(--brand); }
.sammetekst { display: flex; align-items: center; gap: 10px; min-height: 44px; cursor: pointer; }

/* Referansene som rader (15. sep 2026). Theodor syntes kortene var rotete:
   én hvit spiller per fil, og hull mellom kort i ulik høyde. Nå er hvert sett
   én rad, bygd som ressursradene: rund knapp for hele settet, tittel med
   måned og antall, og ett merke per klipp. Spolelinja vises bare på settet
   som spiller. Radene tegnes av N.refSettHtml i felles.js. */
.refsett { list-style: none; margin: var(--luft-2) 0 0; padding: 0; display: grid; row-gap: 6px; }
.refsettrad {
  display: grid;
  grid-template-columns: 36px minmax(160px, 240px) minmax(0, 1fr) auto;
  grid-template-areas:
    "spill tekst klipp endre"
    ".     fram  fram  fram"
    ".     notat notat notat"
    ".     admin admin admin";
  align-items: center;
  column-gap: 14px;
  margin: 0;
  padding: 8px 12px;
  border: 1px solid var(--kant-kort);
  border-radius: var(--r-2);
  background: var(--flate-kort);
}
.refsettrad.spiller { border-color: var(--brand); }
.refsettrad > .ressursspill { grid-area: spill; }
.refsett-tekst { grid-area: tekst; }
.refklipp { grid-area: klipp; display: flex; flex-wrap: wrap; gap: 6px; min-width: 0; }
.refklippknapp { gap: 6px; min-height: 32px; max-width: 100%; padding: 5px 12px; }
.refklippknapp svg { width: 11px; height: 11px; flex: none; }
.refklippknapp span { opacity: 1; font-weight: 600; font-variant-numeric: normal; min-width: 0; overflow-wrap: anywhere; text-align: left; }
.refsett-endre { grid-area: endre; }
/* Spolelinja med tiden bak, på egen rad under klippene. Streken er 6 px,
   men trykkflaten er høyere. */
.refsett-status { grid-area: fram; display: flex; align-items: center; gap: 12px; margin-top: 4px; }
.refsett-status[hidden] { display: none; }
.refsett-status.feil .refsett-tid { color: var(--amber); }
.refsett-fram { flex: 1 1 auto; display: block; padding: 9px 0; cursor: pointer; border-radius: var(--r-1); }
.refsett-fram[hidden] { display: none; }
.refsett-fram:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.refsett-spor { display: block; height: 6px; border-radius: var(--r-1); background: var(--line); overflow: hidden; }
.refsett-spor > span { display: block; width: 0; height: 100%; background: var(--brand); }
.refsett-tid { flex: none; white-space: nowrap; }
.refsett-notater {
  grid-area: notat; list-style: none; margin: 6px 0 0; padding: 0; display: grid; gap: 2px;
  font-size: var(--t-3); line-height: 1.5; color: var(--ink-soft);
}
.refsett-notater b { color: var(--ink); font-weight: 600; }
.refsett-admin { grid-area: admin; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--line); }
/* Knappene på en rad (godkjenning av en voiceover, 22. september 2026). De
   står i samme spalte som «Endre»: en rad har aldri begge deler. */
.refsett-ekstra { grid-area: endre; display: inline-flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.refsett-ekstra .btn { margin: 0; padding: 8px 16px; font-size: var(--t-4); line-height: 1.4; }
.refsett-ekstra .tilbake { margin: 0; font-size: var(--t-4); line-height: 1.4; }
.refsett-filer { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.refsett-filer li, .refsett-notater li { margin: 0; }
.refsett-filer .tilbake, .refsett-endre { margin: 0; padding: 4px 0; font-size: var(--t-4); }
.refsett-filer li { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 4px 12px; font-size: var(--t-4); }
.refsett-knapper { display: inline-flex; flex-wrap: wrap; gap: 6px 10px; }
@media (max-width: 700px) {
  .refsettrad {
    grid-template-columns: 36px minmax(0, 1fr);
    grid-template-areas:
      "spill tekst"
      ".     klipp"
      ".     fram"
      ".     notat"
      ".     endre"
      ".     admin";
  }
  .refklipp { margin-top: 8px; gap: 8px; }
  /* Trykkflater på 44 px på telefon, som resten av portalen. */
  .refklippknapp { min-height: 44px; padding: 8px 14px; }
  .refsett-endre { justify-self: start; margin-top: 6px; }
  .refsett-filer .tilbake, .refsett-endre { min-height: 44px; display: inline-flex; align-items: center; }
}

/* Voiceover til vurdering, samlet per stemme (22. september 2026). Ett kort
   per stemme, én rad per script, og briefen skjult bak en linje fordi den er
   den samme på alle. Se tegnLydvurdering i admin.js. */
.lydgruppe .refsett { margin-top: var(--luft-2); }
/* Scriptnavnet får plass til å brytes: «Pro Script 9 · Sprø salat på dag fem»
   ble kuttet midt i ordet i den smale spalten. */
.lydgruppe .refsettrad { grid-template-columns: 36px minmax(200px, 300px) minmax(0, 1fr) auto; }
.lydgruppe .refsett-tekst b { white-space: normal; overflow-wrap: anywhere; }
.lydbrief { margin: var(--luft-3) 0; }
.lydbrief > summary {
  cursor: pointer; font-size: var(--t-4); line-height: 1.5; color: var(--ink-soft);
  padding: 12px 16px; min-height: 44px; display: flex; align-items: center;
  border-radius: var(--r-2); background: var(--flate-kort); border: 1px solid var(--kant-kort);
}
.lydbrief > summary:hover { color: var(--ink); }
.lydbrief[open] > summary { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
.lydbrief[open] > .scripttekst {
  margin: 0; padding: 14px 16px 16px; border: 1px solid var(--kant-kort); border-top: 0;
  border-radius: 0 0 var(--r-2) var(--r-2); background: var(--flate-kort);
}

/* Hookene i en nedtrekksmeny: fem filer på én linje i stedet for fem merker
   som bryter over tre rader (22. september 2026). */
.hookmeny { position: relative; display: inline-block; }
.hookmeny > summary {
  cursor: pointer; list-style: none; gap: 8px; min-height: 32px; padding: 5px 12px;
  display: inline-flex; align-items: center; line-height: 1.4;
}
.hookmeny > summary::-webkit-details-marker { display: none; }
.hookmeny > summary::after {
  content: ""; width: 7px; height: 7px; flex: none; margin-left: 2px;
  border-right: 2px solid currentColor; border-bottom: 2px solid currentColor;
  transform: rotate(45deg) translate(-2px, -2px);
}
.hookmeny[open] > summary::after { transform: rotate(-135deg) translate(-2px, -2px); }
.hookmeny[open] > summary { border-color: var(--brand); }
.hookliste {
  position: absolute; z-index: 30; top: calc(100% + 6px); left: 0; min-width: 190px;
  display: grid; gap: 6px; padding: 10px; border: 1px solid var(--kant-kort);
  border-radius: var(--r-2); background: var(--flate-meny2);
  box-shadow: 0 12px 32px rgba(0, 0, 0, .28);
}
.hookliste .refklippknapp { justify-content: flex-start; width: 100%; }
.lydbrief > summary:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.lydbrief[open] > summary { color: var(--ink); }
.lydbrief .scripttekst { margin-top: 6px; }
@media (max-width: 700px) {
  .refsett-ekstra { margin-top: 8px; }
  .hookmeny > summary { min-height: 44px; padding: 8px 14px; }
  .hookliste { position: static; min-width: 0; margin-top: 8px; box-shadow: none; }
  .refsett-ekstra .btn, .refsett-ekstra .tilbake { min-height: 44px; display: inline-flex; align-items: center; }
}

/* Bryteren for testoppdrag (24. september 2026). */
.bryterlinje { display: flex; align-items: center; gap: 10px; min-height: 44px; cursor: pointer; line-height: 1.5; }
.bryterlinje input { width: 20px; height: 20px; accent-color: var(--brand); cursor: pointer; }

/* Oppdragene som rader (22. september 2026). Kortene tok en tredels skjerm
   hver. Nå står tittel, redigerer, tid, framdrift og knappene på én linje,
   med samme oppførsel som de andre listene: kolonner på bred skjerm, stablet
   med etikett foran verdien på smal. */
.opptabell { display: grid; row-gap: 8px; container-type: inline-size; }
.opptabell-hode, .opprad {
  display: grid;
  grid-template-columns: minmax(180px, 2.2fr) minmax(120px, 1.2fr) minmax(110px, 1fr) minmax(120px, 1.1fr) auto;
  column-gap: 16px; align-items: center;
}
.opptabell-hode {
  padding: 0 14px; font-size: var(--t-2); letter-spacing: .06em; text-transform: uppercase;
  color: var(--ink-soft); line-height: 1.6;
}
.opprad {
  padding: 12px 14px; border: 1px solid var(--kant-kort); border-radius: var(--r-2);
  background: var(--flate-kort);
}
.oppcelle { display: flex; flex-direction: column; gap: 2px; min-width: 0; line-height: 1.5; }
.oppcelle small { color: var(--ink-soft); font-size: var(--t-3); line-height: 1.5; overflow-wrap: anywhere; }
.oppcelle small.oppvarsel { color: var(--amber); }
.oppnavn b { overflow-wrap: anywhere; }
.opphandling { flex-direction: row; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 6px 12px; }
.opphandling .tilbake { margin: 0; font-size: var(--t-4); line-height: 1.5; }
@container (max-width: 860px) {
  .opptabell-hode { display: none; }
  .opprad { grid-template-columns: minmax(0, 1fr); row-gap: 8px; }
  .oppcelle[data-etikett]::before {
    content: attr(data-etikett); font-size: var(--t-2); letter-spacing: .06em;
    text-transform: uppercase; color: var(--ink-soft); line-height: 1.6;
  }
  .opphandling { justify-content: flex-start; }
  .opphandling .tilbake { min-height: 44px; display: inline-flex; align-items: center; }
}

/* Filnavnet på klippet oppskriften peker på (22. september 2026), så hun
   kan søke det opp i biblioteket uten å gjette. */
.klippnavn {
  display: inline-block; margin-top: 2px; padding: 2px 8px; border-radius: var(--r-2);
  background: var(--flate-kort); border: 1px solid var(--kant-kort);
  font-size: var(--t-3); line-height: 1.5; overflow-wrap: anywhere;
}

/* Pulsen på Vinnere (22. september 2026): hva som kjører akkurat nå. */
.pulsnaa { margin-bottom: var(--luft-3); }
.pulstrend { display: block; font-variant-numeric: tabular-nums; line-height: 1.5; }
.pulstrend.opp { color: var(--green); }
.pulstrend.ned { color: var(--amber); }
.pulstrend.flat { color: var(--ink-soft); }
.pulssmaa { margin: var(--luft-3) 0; }

/* --- Studio og Kunnskap i Script-fanen (16. september 2026) ------------- */
#studio-brief { min-height: 110px; }
.studiokonsept { padding: var(--luft-2) 0; border-top: 1px solid var(--line); }
.studiokonsept:first-child { padding-top: 0; border-top: 0; }
.studiokonsept h3 { margin: 4px 0 6px; }
.studiokonsept h4, .studiodetalj h4 { margin: var(--luft-2) 0 8px; font-size: var(--t-4); }
.studiohooks { margin: 0; padding-left: 1.4em; display: grid; gap: 8px; line-height: 1.55; }
.studioliste { margin: 0; padding-left: 1.2em; display: grid; gap: 6px; line-height: 1.55; }
.studiotekst { white-space: pre-wrap; line-height: 1.6; margin: 0; }
/* En lenke limt inn i bestillingen eller i kildene brytes, i stedet for å
   renne ut av kortet og gi sida sidelengs rulling på mobil. */
.studiotekst, .studioliste li, .studiodl dd, .studioraad-linje { overflow-wrap: anywhere; }
.studiodl { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 6px 16px; margin: 0; line-height: 1.55; }
.studiodl dt { font-weight: 600; }
.studiodl dd { margin: 0; }
.studiodetalj { margin-top: var(--luft-1); }
/* Tommel på hele runden: én linje under arkene. */
.studiovurdering { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 14px; margin-top: var(--luft-3); }
.studiovurdering .etikett { margin: 0; }
.studiovurdering .filterrad { margin: 0; }
.studiovurdering input { flex: 1 1 220px; width: auto; min-width: 0; margin: 0; }
.studiovurdering .knapperad { margin: 0; }
.studiovurdering .tilbake { margin: 0 0 0 auto; padding: 4px 0; }
.studiorunde-hode { display: grid; gap: 4px; margin: 0 0 var(--luft-2); }
.studiorunde-hode .eyebrow { margin: 0; }
.studiobrief { color: var(--ink-soft); max-width: 75ch; }
.studiologg .studiologgrad, .kunnskapsrad {
  display: flex; flex-wrap: wrap; gap: 8px 16px; align-items: center; justify-content: space-between;
  padding: 12px 0; border-top: 1px solid var(--line);
}
.studiologg .studiologgrad:first-child, .kunnskapsrad:first-child { border-top: 0; padding-top: 0; }
.studiologgrad .venstre, .kunnskapsrad .venstre { flex: 1 1 280px; min-width: 0; }
.studiologgrad .venstre p { margin: 2px 0 0; line-height: 1.5; }
.studiologgrad .hoyre, .kunnskapsrad .hoyre { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.kunnskapsrad .venstre p { margin: 2px 0 0; }
.kunnskapsgruppe { margin: var(--luft-3) 0 var(--luft-1); font-size: var(--t-5); }
.kunnskapsredigering { flex: 1 1 100%; }
.kunnskapsredigering textarea { min-height: 360px; line-height: 1.55; font-size: var(--t-4); }
label.bryter { display: inline-flex; align-items: center; gap: 8px; min-height: 44px; cursor: pointer; font-size: var(--t-4); }
@media (max-width: 600px) {
  .studiodl { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .studiodl dd { margin-bottom: 8px; }
}

/* --- Oppskriften, husreglene og skolen hos redigereren (16. sep 2026) ---- */
.oppskriftkort h2 { margin: 6px 0 8px; }
.oppskriftkort h3, .skolekort h3 { margin: var(--luft-2) 0 8px; font-size: var(--t-5); }
.oppskriftliste { margin: 0; padding-left: 1.2em; display: grid; gap: 8px; line-height: 1.55; }
.oppskriftdetaljer { margin-top: var(--luft-2); }
.oppskriftdetaljer summary, .husregelkort summary { cursor: pointer; min-height: 44px; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; line-height: 1.5; }
.oppskriftdetaljer .oppskriftliste, .husregelkort .oppskriftliste { margin-top: 8px; }
.oppskriftverdier { margin-top: var(--luft-2); }
.sjekkliste { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.sjekkliste label { display: flex; align-items: flex-start; gap: 10px; min-height: 44px; padding: 8px 0; line-height: 1.5; cursor: pointer; }
.sjekkliste input { margin-top: 3px; flex: none; }
.skolekort h2 { margin: 6px 0 8px; }
.skolekort p { line-height: 1.6; }
.oppskriftadmin { margin-top: var(--luft-3); padding-top: var(--luft-2); border-top: 1px solid var(--line); display: grid; gap: 10px; }
.oppskriftadmin .felt { margin: 0; }
.oppskriftforhand { margin-top: var(--luft-1); padding: var(--luft-2); border: 1px solid var(--line); border-radius: var(--r-3); }
.oppskriftforhand h3 { margin: 0 0 8px; }
.oppskriftforhand h4 { margin: var(--luft-2) 0 8px; }

/* --- Studio: bredere flate, logg ved siden av, kompakt grunnlag (16. sep) - */
/* Studio bruker hele bredden (18. sep 2026): tre ark i bredden og lista til
   høyre, i stedet for en smal stripe og tomrom til høyre på store skjermer. */
#skjerm-script[data-visning="studio"] .wrap.bred { max-width: none; }
.studiogrunnlag { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; margin: 0 0 var(--luft-2); line-height: 1.5; }
.studiogrunnlag .etikett { margin: 0; }
.studiotall { font-size: var(--t-4); color: var(--ink-soft); }
.studiotall b { color: var(--ink); font-weight: 700; }
.studiooppsett { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--luft-3); align-items: start; }
/* Lista står ved siden av først når hovedfeltet har plass til tre ark. Under
   det står den under, og arkene får hele bredden. */
@media (min-width: 1360px) {
  .studiooppsett { grid-template-columns: minmax(0, 1fr) 300px; }
  .studiologgkolonne { position: sticky; top: 84px; max-height: calc(100vh - 110px); overflow-y: auto; padding-right: 4px; }
}
.studioskjema h2 { margin: 0 0 var(--luft-2); }
/* Skjemaet i to kolonner når hovedfeltet er bredt: modus til venstre,
   bestillingen og knappen til høyre. Da starter arkene høyere opp. */
.studiohoved { container-type: inline-size; min-width: 0; }
@container (min-width: 900px) {
  .studioskjema {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.25fr); column-gap: var(--luft-3); align-items: start;
    grid-template-areas: "tittel tittel" "modus brief" "hjelp brief" "bygg brief" "feil handling" "status status";
  }
  .studioskjema > h2 { grid-area: tittel; }
  .studioskjema > #studio-modus { grid-area: modus; }
  .studioskjema > #studio-modushjelp { grid-area: hjelp; }
  .studioskjema > #studio-byggfelt { grid-area: bygg; }
  .studioskjema > #studio-brieffelt { grid-area: brief; margin: 0; }
  .studioskjema > #studio-feil { grid-area: feil; }
  .studioskjema > .studiohandling { grid-area: handling; }
  .studioskjema > #studio-status { grid-area: status; }
}
.innhold #studio-resultat > h2.bolk { margin-top: var(--luft-3); }
.studioskjema #studio-modus { margin-bottom: 6px; }
.studioskjema #studio-brief { min-height: 88px; }
.studiohandling { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 12px 20px; margin-top: 4px; }
.studioantall { display: grid; gap: 6px; }
.studioantall .etikett { margin: 0; }
.antallvalg { margin: 0; gap: 6px; }
.antallvalg button { min-width: 44px; min-height: 44px; justify-content: center; padding: 8px 12px; }
@media (min-width: 1700px) {
  .studiooppsett { grid-template-columns: minmax(0, 1fr) 380px; }
}
.studiologgkolonne .bolk { margin-top: 0; }
.studiologgkolonne > .hint { margin: 0 0 10px; }
.studiologg { padding: 6px 0; }
.studiologg .studiologgrad {
  display: flex; flex-wrap: nowrap; justify-content: flex-start; align-items: center; gap: 12px; width: 100%; text-align: left;
  font: inherit; color: inherit; background: none; border: 0; border-top: 1px solid var(--line);
  padding: 12px 16px; min-height: 44px; cursor: pointer; border-radius: 0;
}
.studiologg .studiologgrad:first-child { border-top: 0; padding-top: 12px; }
.innhold .kort.studiologg { padding: 6px 0; }
.studiologgrad .eyebrow { margin: 0; }
.studiologgrad.aktiv { background: var(--flate-svak); }
.studiologgrad.aktiv .studiologgtekst { font-weight: 600; }
.studiologgrad[aria-busy="true"] { opacity: .6; cursor: progress; }
.innhold .studiologgkolonne h2.bolk.forst { margin-top: 0; padding-top: 0; border-top: 0; }
.studiologgdel { margin-top: var(--luft-2); }
.studioantallmerke {
  display: inline-block; min-width: 1.7em; margin-left: 6px; padding: 1px 8px; border-radius: 999px;
  background: var(--flate-svak); color: var(--ink); font-size: var(--t-3); text-align: center; letter-spacing: 0; vertical-align: 1px;
}
.studioantallmerke:empty { display: none; }
.studiosenere-kort { color: var(--ink-soft); font-size: var(--t-4); line-height: 1.45; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.studiosenere-tom { margin: 0 0 var(--luft-2); }
/* Stripa «Studio leser»: tallene, merknaden og lenka på én linje. */
.studiogrunnlag .hint, .studiogrunnlag .tilbake { margin: 0; }
.studiogrunnlag .tilbake { padding: 4px 0; }
.studioskjema #studio-modushjelp { margin: 0 0 var(--luft-2); }
@media (max-width: 400px) {
  .antallvalg { gap: 4px; }
  .antallvalg button { min-width: 40px; padding: 8px 10px; }
}
.studiologg .studiologgrad:hover { background: var(--flate-hover, rgba(128, 128, 128, .08)); }
.studiologg .studiologgrad:focus-visible { outline: 2px solid var(--brand); outline-offset: -2px; }
/* Grunnlaget 0, ikke auto: med auto ble teksten så bred som hele raden, og
   pila (›) havnet alene på linja under. */
.studiologgrad .venstre { flex: 1 1 0; min-width: 0; display: grid; gap: 4px; }
.studiologgtekst { line-height: 1.5; overflow-wrap: anywhere; }
.studiologglapper { display: flex; flex-wrap: wrap; gap: 6px; }
.studiologgrad .pil { flex: none; font-size: var(--t-6); color: var(--ink-soft); }
.lydtekst { margin-top: 8px; }
.lydtekst summary { cursor: pointer; min-height: 44px; display: flex; align-items: center; line-height: 1.5; }
.lydtekst .studiotekst { max-height: 260px; overflow-y: auto; padding: 10px 12px; border: 1px solid var(--line); border-radius: var(--r-3); font-size: var(--t-4); }

/* --- Vinnere (16. sep 2026) --------------------------------------------------
   Én rad per konsept, som knapp: miniatyr, hvem, status, krympet ROAS med
   intervallstrek, og forbruket de første 60 dagene. Streken går fra ROAS 0
   til 5, med break-even og vinnergrensen som tynne merker. På smal skjerm
   flyttes status, ROAS og forbruk under navnet. */
/* (tak fjernet 21. sep 2026: admin bruker hele skjermen, se .adminramme nederst) */
#skjerm-vinnere #vinnere-visning { margin-bottom: var(--luft-1); }
.vinnerdata { margin: 0 0 var(--luft-2); line-height: 1.5; }
.vinnerfliser { margin-top: var(--luft-2); }
.vinnerrutenett { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--luft-3); align-items: start; margin-top: var(--luft-3); }
@media (min-width: 1100px) { .vinnerrutenett { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); } }
#skjerm-vinnere .vinnerrutenett .kort + .kort { margin-top: 0; }
.vinnerkort h2 { margin: 0 0 var(--luft-1); }
.vinnerkort h3 { margin: var(--luft-2) 0 8px; font-size: var(--t-5); }
.vinnerhint { margin: 0 0 var(--luft-1); line-height: 1.5; }
.vinnerliste { display: grid; row-gap: 2px; container-type: inline-size; }
.kort.vinnerliste { padding-top: 8px; padding-bottom: 8px; }

.vinnerbilde { width: 52px; height: 52px; border-radius: var(--r-2); object-fit: cover; background: var(--flate-svak); display: block; }
.vinnerhvem { display: grid; row-gap: 2px; min-width: 0; line-height: 1.45; }
.vinnerhvem b { overflow-wrap: anywhere; }
.vinnerekstra { font-size: var(--t-3); color: var(--ink-soft); }
.vinnerroas, .vinnerforbruk { display: grid; row-gap: 4px; justify-items: end; text-align: right; font-variant-numeric: tabular-nums; line-height: 1.4; }
.vinnerroas small, .vinnerforbruk small { font-size: var(--t-2); color: var(--ink-soft); font-weight: 500; }
.vinnertall b { font-size: var(--t-5); }

.roasstrek { position: relative; display: block; width: 100%; height: 12px; }
.roasstrek::before { content: ""; position: absolute; left: 0; right: 0; top: 5px; height: 2px; border-radius: var(--r-1); background: var(--line); }
.roasstrek i { position: absolute; display: block; }
.roasbe, .roasvinner { top: 1px; width: 1px; height: 10px; background: var(--ink-soft); opacity: .55; }
.roasvinner { background: var(--green); opacity: .9; }
.roasspenn { top: 4px; height: 4px; border-radius: var(--r-1); background: var(--brand); opacity: .35; }
.roaspunkt { top: 2px; width: 8px; height: 8px; margin-left: -4px; border-radius: 50%; background: var(--brand); }

/* --- Tabellene under Vinnere (16. sep 2026) ----------------------------------
   Én linje per konsept, kolonnenavn én gang øverst, grupper under hverandre.
   Kolonnene følger antallet i --vkol. Blir lista smal, stables cellene med
   etiketten foran. */
.vseksjon { margin-top: var(--luft-3); }
#skjerm-vinnere .vseksjon + .vseksjon { margin-top: var(--luft-2); }
.vseksjon-topp { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 4px 18px; margin-bottom: var(--luft-1); }
.vseksjon-topp h2 { margin: 0; }
.vseksjon-topp .hint { margin: 0; line-height: 1.5; }
.vingenendring { margin: var(--luft-2) 0 0; }
.vtom { margin: 0; }
.vtabell { container-type: inline-size; display: grid; }
.vtabell-hode, .vtabell-rad {
  display: grid;
  grid-template-columns: minmax(220px, 2.4fr) repeat(var(--vkol), minmax(100px, 1fr)) 14px;
  column-gap: 18px;
  align-items: center;
}
.vtabell-hode { padding: 0 10px 8px; border-bottom: 1px solid var(--line); font-size: var(--t-2); font-weight: 600; letter-spacing: .02em; color: var(--ink-soft); }
.vtabell-hode .tall { text-align: right; }
.vtabell-rad {
  width: 100%;
  min-height: 60px;
  padding: 8px 10px;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  background: none;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.vtabell-rad:last-of-type { border-bottom: 0; }
.vtabell-rad:hover { background: var(--flate-hover, rgba(128, 128, 128, .08)); }
.vtabell-rad:focus-visible { outline: 2px solid var(--brand); outline-offset: -2px; }
.vkonsept { display: flex; align-items: center; gap: 12px; min-width: 0; }
.vbilde { flex: none; width: 40px; height: 40px; border-radius: var(--r-2); object-fit: cover; background: var(--flate-svak); display: block; }
.vnavn { display: grid; row-gap: 1px; min-width: 0; line-height: 1.4; }
.vnavn b, .vnavn small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vnavn small { font-size: var(--t-2); color: var(--ink-soft); }
.vcelle { display: grid; row-gap: 1px; min-width: 0; line-height: 1.4; font-variant-numeric: tabular-nums; }
.vcelle.tall { justify-items: end; text-align: right; }
.vcelle small { font-size: var(--t-2); color: var(--ink-soft); }
.vcelle .lapp { justify-self: start; white-space: nowrap; }
.vtabell-rad .pil { font-size: var(--t-6); color: var(--ink-soft); }
.vtabell-flere { justify-self: start; margin: var(--luft-1) 10px 0; }
@container (max-width: 700px) {
  .vtabell-hode { display: none; }
  .vtabell-rad { grid-template-columns: minmax(0, 1fr) auto; row-gap: 6px; padding: 12px 6px; }
  .vtabell-rad .vkonsept { grid-column: 1 / -1; }
  .vtabell-rad .vcelle { grid-column: 1 / -1; grid-template-columns: auto auto; justify-content: space-between; align-items: baseline; column-gap: 12px; text-align: right; }
  .vtabell-rad .vcelle::before { content: attr(data-etikett); grid-row: 1 / span 2; font-size: var(--t-3); color: var(--ink-soft); text-align: left; }
  .vtabell-rad .vcelle > * { grid-column: 2; }
  .vtabell-rad .vcelle .lapp { justify-self: end; }
  .vtabell-rad .pil { display: none; }
}

/* Flisene øverst er knapper som hopper til sin gruppe. */
.vinnerflis { font: inherit; color: inherit; text-align: left; cursor: pointer; }
.vinnerflis:hover { border-color: var(--brand); }
.vinnerflis:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.vinnerflis:not([data-vinnerhopp]) { cursor: default; }
.vinnerflis:not([data-vinnerhopp]):hover { border-color: var(--kant-kort); }

.vinnerfilter { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: var(--luft-1) var(--luft-3); margin-bottom: var(--luft-1); }
.vinnerfilter .filterrad { margin: 0; }
.vinnersok { flex: 0 1 320px; margin: 0; }
#vinnere-status { margin: var(--luft-1) 0 var(--luft-2); }
.vinnerantall { margin: 0 0 var(--luft-1); }
.vinnerforklaring { margin-top: var(--luft-3); }
.vinnerforklaring summary { cursor: pointer; min-height: 44px; display: flex; align-items: center; font-weight: 600; line-height: 1.5; }
.vinnerforklaring p { line-height: 1.6; }
.vinnerforklaring h3 { margin: var(--luft-2) 0 8px; font-size: var(--t-5); }

.vinnertabell td.tall, .vinnertabell th.tall { text-align: right; }
.vinnertabell td.tall b { display: block; }
.vinnertabell td small { display: block; font-size: var(--t-2); color: var(--ink-soft); }
.vinnertabell tr.umoden td { color: var(--ink-soft); }
.ukestolpe { display: block; width: 120px; max-width: 100%; height: 6px; margin: 6px 0 4px; border-radius: var(--r-1); background: var(--flate-svak); }
.ukestolpe i { display: block; height: 100%; border-radius: var(--r-1); background: var(--brand); opacity: .6; }

.vinnertilbake { margin: 0 0 var(--luft-2); }
.vinnerdetalj .eyebrow { margin: 0 0 6px; }
.vinnertopp { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; }
.vinnertopp h2 { margin: 0; }
.vinnersetning { max-width: 72ch; margin: var(--luft-2) 0; line-height: 1.6; }
.vinnernokler { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: var(--luft-2); margin: var(--luft-2) 0; }
.vinnernokkel { display: grid; row-gap: 2px; padding: 12px 14px; border: 1px solid var(--line); border-radius: var(--r-3); font-variant-numeric: tabular-nums; line-height: 1.45; }
.vinnernokkel b { font-size: var(--t-6); }
.vinnernokkel small { font-size: var(--t-3); color: var(--ink-soft); }
.vinnerannonse { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto; align-items: center; column-gap: var(--luft-2); row-gap: 8px; padding: 10px 0; border-top: 1px solid var(--line); }
.vinnerannonse:first-child { border-top: 0; }
@container (max-width: 480px) {
  .vinnerannonse { grid-template-columns: 52px minmax(0, 1fr); }
  .vinnerannonse .vinnerforbruk { grid-column: 2; justify-items: start; text-align: left; }
}

/* --- Kunder under Vinnere (16. sep 2026) ---------------------------------------
   Tabeller med andel av forbruket som stolpe, andel av kjøpene og krympet ROAS
   med intervallstrek, og en søylegraf for tid på døgnet der høyden er
   forbruket og fargen sier om timen er under break-even eller over vinnergrensen. */
.kundefunn { margin-top: var(--luft-2); }
.kundefunn h2 { margin: 0 0 var(--luft-1); }
.kundetabell th[scope="row"] { font-weight: 600; white-space: nowrap; }
.kundetabell td.tall, .kundetabell th.tall { text-align: right; }
.kundetabell td small { display: block; font-size: var(--t-2); color: var(--ink-soft); line-height: 1.4; }
.kundetabell + .tabellrulle { margin-top: var(--luft-2); }
.kundeandel { display: grid; row-gap: 4px; min-width: 120px; }
.andelstolpe { display: block; width: 120px; max-width: 100%; height: 6px; border-radius: var(--r-1); background: var(--flate-svak); }
.andelstolpe i { display: block; height: 100%; border-radius: var(--r-1); background: var(--brand); opacity: .6; }
.kunderoas { min-width: 150px; }
.kunderoas .roasstrek { width: 140px; margin-top: 4px; }
.kundedetaljer { margin-top: var(--luft-2); }
.kundedetaljer summary { cursor: pointer; min-height: 44px; display: flex; align-items: center; font-weight: 600; line-height: 1.5; }

.timegraf {
  display: grid;
  grid-template-columns: repeat(24, minmax(0, 1fr));
  column-gap: 3px;
  align-items: end;
  height: 180px;
  margin: var(--luft-2) 0 var(--luft-1);
}
.timesoyle { position: relative; display: flex; flex-direction: column; justify-content: flex-end; align-items: stretch; height: 100%; min-width: 0; }
.timesoyle i { display: block; width: 100%; border-radius: var(--r-1) var(--r-1) 0 0; background: var(--brand); opacity: .55; }
.timesoyle i.under { background: var(--red); opacity: .8; }
.timesoyle i.over { background: var(--green); opacity: .8; }
.timesoyle i.tom { background: var(--flate-svak); }
.timeroas { font-size: var(--t-1); line-height: 1.4; text-align: center; color: var(--ink-soft); font-variant-numeric: tabular-nums; margin-bottom: 2px; overflow: hidden; }
.timenavn { font-size: var(--t-2); line-height: 1.4; text-align: center; color: var(--ink-soft); height: 1.4em; margin-top: 4px; font-variant-numeric: tabular-nums; }
@media (max-width: 600px) { .timeroas { display: none; } .timegraf { height: 140px; column-gap: 2px; } }
.studiogrep { margin: 10px 0 0; gap: 8px; }

/* --- Punkter med klipp (16. sep 2026) ---------------------------------------
   Luft mellom teksten, klippet og «Merk som fikset», som lå klistret sammen.
   Og et kamera på punktet på tidslinja når det er lagt ved et klipp. */
.loggpunkt { padding: 14px 0; }
.loggpunkt > .klipplenke { margin: 4px 0 0; }
.loggpunkt > .fiksetrad { margin-top: 12px; }
.stripeklipp {
  position: absolute;
  top: -8px;
  right: -11px;
  width: 21px;
  height: 21px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--amber);
  color: #1d1400;
  border: 2px solid rgba(4, 7, 20, .8);
  pointer-events: none;
}

/* --- Manusene i Studio som dokumenter (17. sep 2026) --------------------------
   Samme utseende som PDF-ene til Pro Script 4 til 6: hvitt A4-ark, Arial, fet
   tittel og fete overskrifter, luft mellom avsnittene. Arket er papir, så det
   er hvitt i begge temaer. Skriften er i cqw (bredden på arket), så det lille
   arket er en ekte miniatyr av det store. */
#studio-resultat { container-type: inline-size; }
.studioark-rad { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--luft-3) var(--luft-2); margin-top: var(--luft-3); }
@container (min-width: 420px) { .studioark-rad { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@container (min-width: 600px) { .studioark-rad { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
/* Valget synes på arket: gått for og lagret har en ring, valgt bort er tonet ned. */
.studioark-kort[data-status="valgt"] .studioark { box-shadow: 0 0 0 2px var(--green-line), 0 10px 30px rgba(4, 7, 20, .28); }
.studioark-kort[data-status="senere"] .studioark { box-shadow: 0 0 0 2px var(--violet-line), 0 10px 30px rgba(4, 7, 20, .28); }
.studioark-kort[data-status="bort"] .studioark { opacity: .45; }
.studioark-kort[data-status="bort"] .studioark:hover { opacity: .8; }
.studiobort { display: grid; gap: 8px; padding: 12px; border: 1px solid var(--line); border-radius: var(--r-3); background: var(--flate-svak); }
.studiobort[hidden] { display: none; }
.studiobort .etikett { margin: 0; }
.studiobort input { margin: 0; }
.studiogrunner { margin: 0; gap: 6px; }
.studiogrunner button { font-size: var(--t-3); padding: 6px 10px; min-height: 36px; }
.studiobort .knapperad { margin: 0; gap: 12px; align-items: center; }
.studiobort .tilbake { margin: 0; padding: 4px 0; }
.studioark-kort { display: flex; flex-direction: column; gap: 12px; min-width: 0; }
.studioark {
  position: relative; display: block; width: 100%; border: 1px solid var(--line); border-radius: var(--r-2);
  box-shadow: 0 10px 30px rgba(4, 7, 20, .28); transition: transform .15s ease, box-shadow .15s ease;
}
.studioark:hover { transform: translateY(-3px); box-shadow: 0 16px 40px rgba(4, 7, 20, .36); }
.studioark-apne { position: absolute; inset: 0; width: 100%; height: 100%; padding: 0; border: 0; border-radius: var(--r-2); background: none; cursor: pointer; }
.studioark-apne:focus-visible { outline: 2px solid var(--brand); outline-offset: 3px; }
@media (prefers-reduced-motion: reduce) { .studioark { transition: none; } .studioark:hover { transform: none; } }
.manusark {
  container-type: inline-size;
  display: block;
  width: 100%;
  box-sizing: border-box;
  aspect-ratio: 210 / 297;
  overflow: hidden;
  border-radius: var(--r-2);
  background: #fff;
  color: #111;
  font-family: Arial, Helvetica, sans-serif;
  text-align: left;
  position: relative;
}
/* Margene ligger på et indre lag: cqw på arket selv ville målt mot noe
   utenfor arket, og da ble innholdet presset til null bredde. */
.manusark-side { padding: 11cqw 12cqw; }
.manusark h1 { margin: 0 0 3.2cqw; font-size: 3.6cqw; line-height: 1.3; font-weight: 700; color: #111; }
.manusark h2 { margin: 3.4cqw 0 1.8cqw; font-size: 2.2cqw; line-height: 1.3; font-weight: 700; color: #111; }
.manusark p { margin: 0 0 1.9cqw; font-size: 1.95cqw; line-height: 1.45; color: #111; }
/* Det lille arket tones ut nederst, så det ser ut som en side som fortsetter. */
.studioark .manusark::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 18%; background: linear-gradient(rgba(255, 255, 255, 0), #fff); }
.manusark.stor { aspect-ratio: auto; overflow: visible; }
/* Det store arket har en nedre OG en øvre grense for skriften. På en telefon
   er arket 300 px bredt, og 1,95 % av det er 6 px: uleselig, og umulig å
   skrive i. Etter at vinduet ble bredere (20. sep 2026) slo det motsatte inn:
   på et ark på 1 200 px ble brødteksten 23 px og margene 130 px, og da fikk
   man plutselig færre linjer på skjermen enn før. Nå vokser skriften med arket
   til den er stor nok, og stopper der. */
.manusark.stor .manusark-side { padding: clamp(22px, 11cqw, 56px) clamp(20px, 12cqw, 64px); }
.manusark.stor h1 { font-size: clamp(20px, 3.6cqw, 32px); margin-bottom: clamp(14px, 3.2cqw, 22px); }
.manusark.stor h2 { font-size: clamp(15px, 2.2cqw, 21px); margin: clamp(16px, 3.4cqw, 26px) 0 clamp(8px, 1.8cqw, 12px); }
.manusark.stor p, .manusark.stor .manusfelt { font-size: clamp(15px, 1.95cqw, 19px); }
.manusark.stor p { margin-bottom: clamp(9px, 1.9cqw, 14px); }
/* En kolonne som strekkes til kortets bredde. Før var dette et grid med
   auto-spor, og det sporet ble så bredt som den bredeste lappen, fordi lapper
   ikke brytes (white-space: nowrap i nordiva.css). En lang vinkel gjorde
   sporet 440 px i et kort på 256, og teksten og knappene rant inn i
   nabokortene og over lista til høyre (18. sep 2026).
   Kolonnen fyller kortet i høyden, og knappene skyves til bunnen, så de står
   på samme høyde på alle tre kortene også når ett mangler en lapp. */
.studioark-info { flex: 1 1 auto; display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.studioark-info .eyebrow { margin: 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.studioark-info h3 { margin: 0; overflow-wrap: anywhere; }
.studioark-lapper { display: flex; flex-wrap: wrap; gap: 6px; min-width: 0; }
.studioark-lapper .lapp { max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
.studioark-lapper:empty { display: none; }
/* Knappene fyller raden. Er det ikke plass til begge, får hver sin hele rad,
   i stedet for én knapp alene med et hull ved siden av. */
.studioark-info .knapperad { margin: auto 0 0; padding-top: 4px; gap: 8px; flex-wrap: wrap; }
.studioark-info .knapperad .btn { flex: 1 1 auto; justify-content: center; }
/* Én linje om konseptet, aldri mer enn tre linjer på kortet. */
.studioark-kortsagt { margin: 0; color: var(--ink-soft); font-size: var(--t-4); line-height: 1.5; overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }

/* Rådet over arkene: én setning, og utfordringen bak en skuff. */
.studioraad { margin-top: var(--luft-2); padding: 12px 14px; border: 1px solid var(--line); border-radius: var(--r-3); background: var(--flate-svak); }
.studioraad-linje { margin: 0; line-height: 1.55; }
.studioraad-merke { display: inline-block; margin-right: 8px; padding: 2px 8px; border-radius: 999px; background: var(--brand); color: #fff; font-size: var(--t-2); font-weight: 600; letter-spacing: .02em; vertical-align: 1px; }
/* «Vis mer» i Studio er en lenke med en pil, ikke den store boksen som
   details får ellers i portalen (nordiva.css, laget for spørsmål og svar). */
details.studiomer { background: none; border: 0; border-radius: 0; margin: 0; }
details.studiomer > summary { cursor: pointer; min-height: 36px; padding: 0; display: inline-flex; align-items: center; gap: 6px; font-weight: 600; font-size: var(--t-4); line-height: 1.5; color: var(--ink-soft); }
details.studiomer > summary:hover { color: var(--ink); }
details.studiomer > summary::after, details.studiomer[open] > summary::after { content: '\25BE'; margin: 0; font-size: var(--t-3); color: inherit; transition: transform .2s ease; }
details.studiomer[open] > summary::after { transform: rotate(180deg); }
details.studiomer[open] > summary { padding-bottom: 0; margin-bottom: 6px; }
@media (prefers-reduced-motion: reduce) { details.studiomer > summary::after { transition: none; } }
.studioraad .studiomer { margin-top: 4px; }
.studiosjekk > summary { cursor: pointer; min-height: 36px; padding: 0; display: flex; align-items: center; gap: 8px; font-weight: 600; line-height: 1.5; }
details.studiosjekk > summary::after, details.studiosjekk[open] > summary::after { content: '\25BE'; margin-left: auto; font-size: var(--t-3); color: inherit; transition: transform .2s ease; }
details.studiosjekk[open] > summary::after { transform: rotate(180deg); }
details.studiosjekk[open] > summary { padding-bottom: 0; }
.manusvindu-kort { margin: 0; font-size: var(--t-5); line-height: 1.5; }
/* Skriv om med Studio (19. sep 2026): boksen øverst i panelet, samtalen,
   forslaget med gammel og ny tekst, og linjene det gjelder i arket. */
.studiohjelp { display: grid; gap: 8px; padding: 12px; border: 1px solid var(--line); border-radius: var(--r-3); background: var(--flate-svak); }
.studiohjelp-tittel { margin: 0; font-weight: 600; }
.studiohjelp .hint, .studiohjelp .feilmelding { margin: 0; }
.studiohjelp-markert { margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; font-size: var(--t-4); color: var(--brand); }
.studiohjelp-markert .tilbake { margin: 0; padding: 2px 0; font-size: var(--t-3); }
.studiohjelp textarea { margin: 0; min-height: 64px; font-size: var(--t-4); line-height: 1.45; }
.studiohjelp-snarveier { margin: 0; gap: 6px; }
.studiohjelp-snarveier button { font-size: var(--t-3); padding: 5px 10px; min-height: 32px; }
.studiohjelp .knapperad { margin: 0; gap: 10px; align-items: center; }
.studiohjelp .knapperad .tilbake { margin: 0; padding: 4px 0; }
.studiohjelp-tur { display: grid; gap: 4px; font-size: var(--t-4); line-height: 1.45; }
.studiohjelp-du { margin: 0; justify-self: end; max-width: 90%; padding: 6px 10px; border-radius: var(--r-3); background: var(--flate-knapp); overflow-wrap: anywhere; }
.studiohjelp-studio { margin: 0; color: var(--ink-soft); overflow-wrap: anywhere; }
.studiohjelp-forslag { display: grid; gap: 8px; }
.omskrivrad { display: grid; gap: 4px; padding: 10px 12px; border-radius: var(--r-3); background: var(--flate-knapp); font-size: var(--t-4); line-height: 1.55; overflow-wrap: anywhere; }
.omskrivrad del { color: var(--ink-soft); text-decoration: line-through; }
.omskrivrad ins { text-decoration: none; color: var(--ink); font-weight: 500; }
.omskrivrad ins.slettes { color: var(--red); font-weight: 400; }
/* CHATTEN UNDER ARKET (19. sep 2026): som i vanlig Claude. Boblene over,
   skrivefeltet nederst, og arket over dem ruller for seg. */
.manusvindu-venstre { min-height: 0; display: flex; flex-direction: column; gap: 10px; }
.manusvindu-venstre > .manusvindu-arkflate {
  flex: 1 1 auto; min-height: 50%;
  transition: min-height .18s ease, flex-basis .18s ease;
}
/* Nær-modus: mens man skriver i chatten, er det samtalen som skal ha plassen.
   Arket blir stående som en påminnelse om hva man snakker om, og ruller som
   før. Ett klikk i arket setter det tilbake. */
.manusvindu-venstre.chatfokus > .manusvindu-arkflate { flex: 0 1 36%; min-height: 0; }
.manusvindu-venstre.chatfokus .studiochat-logg { max-height: min(62vh, 780px); }
@media (prefers-reduced-motion: reduce) {
  .manusvindu-venstre > .manusvindu-arkflate { transition: none; }
}
/* Blir det trangt, er det samtalen som ruller, ikke arket som krymper. */
.studiochat { flex: 0 1 auto; min-height: 0; display: flex; flex-direction: column; gap: 10px; width: min(100%, 1180px); margin: 0 auto; }
/* Halve vinduet til samtalen når den er lang. Den var 34vh og føltes trang:
   tre meldinger fylte den, og man leste gjennom et kikkhull. */
.studiochat-logg { flex: 0 1 auto; min-height: 0; max-height: min(48vh, 620px); overflow-y: auto; display: grid; align-content: start; gap: 10px; padding: 2px 6px; }
.studiochat-inn { flex: none; }
.chatboble { max-width: 88%; padding: 11px 15px; border-radius: 16px; font-size: var(--t-5); line-height: 1.55; overflow-wrap: anywhere; }
.chatboble p { margin: 0; }
.chatboble.du { justify-self: end; background: var(--brand); color: #fff; border-bottom-right-radius: 5px; }
.chatboble.studio { justify-self: start; background: var(--flate-knapp); color: var(--ink); border: 1px solid var(--line); border-bottom-left-radius: 5px; }
.chatboble.feil { color: var(--red); }
.chatboble .lapp { margin-left: 4px; vertical-align: 1px; }

/* Spørsmålet tilbake, og alternativene Studio ber deg velge mellom. */
.chatsporsmaal {
  margin: var(--luft-2) 0 0;
  padding-left: 12px;
  border-left: 2px solid var(--brand);
  line-height: 1.6;
  font-weight: 600;
}
/* Alternativene sto på én linje med grepet klemt inn mellom teksten og
   knappen, og med tre av dem ble det en vegg. Nå er hvert alternativ et kort:
   linja du kan sette inn øverst, og under den hva slags grep det er, med
   knappen ytterst. Nummeret gjør at man kan si «ta nummer to». */
/* Analysen av et ferdig manus, i scriptdetaljen. */
.analysekort { margin: 0 0 var(--luft-2); font-size: var(--t-5); line-height: 1.55; }
[data-scriptanalyse] .etikett { margin-top: var(--luft-2); }
[data-scriptanalyse] .studioliste li { line-height: 1.6; }

.chatalter { display: grid; gap: 10px; margin-top: var(--luft-2); }
.chatalt {
  display: grid;
  gap: 8px;
  padding: 12px 14px;
  border: 1px solid var(--kant-kort);
  border-radius: var(--r-3);
  background: var(--flate-svak);
}
.chatalttekst { margin: 0; line-height: 1.6; }
.chatalttall {
  display: inline-grid;
  place-items: center;
  width: 20px;
  height: 20px;
  margin-right: 8px;
  border-radius: var(--r-2);
  background: var(--flate-knapp);
  color: var(--ink-soft);
  font-size: var(--t-2);
  font-weight: 700;
  line-height: 1.4;
  vertical-align: 2px;
}
.chataltfot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px; }
.chataltfot .hint { min-width: 0; }
.chatalt .btn { flex: none; }
.chataltnote { margin: 0; }
.forslagsboble { display: grid; gap: 8px; max-width: 94%; }
.forslagsboble .omskrivrad { background: var(--flate-svak); }
.forslagsboble .knapperad { margin: 2px 0 0; gap: 10px; align-items: center; }
.forslagsboble .knapperad .tilbake { margin: 0; padding: 4px 0; }
.chatboble.skriver { color: var(--ink-soft); }
.prikker { display: inline-flex; gap: 3px; margin-left: 6px; vertical-align: middle; }
.prikker i { width: 5px; height: 5px; border-radius: 50%; background: currentColor; opacity: .35; animation: chatprikk 1.2s infinite ease-in-out; }
.prikker i:nth-child(2) { animation-delay: .2s; }
.prikker i:nth-child(3) { animation-delay: .4s; }
@keyframes chatprikk { 0%, 80%, 100% { opacity: .25; } 40% { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .prikker i { animation: none; opacity: .6; } }
.studiochat-inn { display: grid; gap: 6px; }
/* Flere script i samme voiceover-runde: én lapp per valgt script. */
.lydvalgte { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; }
.lydvalgte:empty { margin-top: 0; }
.lydvalgtlapp {
  display: inline-flex; align-items: center; gap: 2px;
  padding: 4px 4px 4px 12px; border-radius: 999px;
  background: var(--flate-knapp); border: 1px solid var(--line); color: var(--ink);
  font-size: var(--t-4); white-space: nowrap;
}

/* Føringene som gjelder videre, over skrivefeltet. De er ikke en markering:
   de står til Theodor fjerner dem, og de sendes med i hver melding. */
.studiochat-foringer { margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: var(--t-4); }
.foringlapp {
  display: inline-flex; align-items: center; gap: 2px;
  padding: 4px 4px 4px 12px; border-radius: 999px;
  background: var(--amber-bg); border: 1px solid var(--amber-line); color: var(--amber);
}
.foringlapp .studiochat-fjern { color: var(--amber); }

/* Bryteren for nettsøk, og kildene den fant. */
.soklapp { border-color: var(--brand) !important; color: var(--brand) !important; }
.soklapp.valgt { background: var(--brand) !important; color: #fff !important; }
.chatkilder { margin-top: var(--luft-2); }
.chatkilder ul { margin: 4px 0 0; padding-left: 1.2em; display: grid; gap: 4px; line-height: 1.6; }
.chatkilder a { color: var(--brand); overflow-wrap: anywhere; }

/* Markeringen: én lapp per linje, hver med sitt eget kryss, så man kan ta
   bort «Hook 2» uten å miste «Hook 1» og «Body 4». Med cmd-klikk kan linjene
   ligge hvor som helst i manuset, og da kan lista bli lang: den brytes. */
.studiochat-markert { margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: var(--t-4); }
.markertord { color: var(--ink-soft); }
.markertlinje {
  display: inline-flex; align-items: center; gap: 2px;
  padding: 4px 4px 4px 12px; border-radius: 999px;
  background: var(--flate-knapp); border: 1px solid var(--line); color: var(--brand);
  white-space: nowrap;
}
.studiochat-markert .tilbake { margin: 0; padding: 4px 6px; font-size: var(--t-3); }
.studiochat-fjern { width: 22px; height: 22px; display: grid; place-items: center; border: 0; border-radius: 50%; background: none; color: var(--ink-soft); cursor: pointer; font-size: var(--t-5); }
.studiochat-fjern:hover { background: var(--flate-knapp-hover); color: var(--ink); }
.studiochat-felt { display: flex; align-items: flex-end; gap: 8px; padding: 7px 7px 7px 16px; border: 1px solid var(--line); border-radius: 22px; background: var(--flate-knapp); }
.studiochat-felt:focus-within { border-color: var(--brand); }
.studiochat-felt textarea {
  flex: 1 1 auto; min-width: 0; min-height: 28px; max-height: 200px; margin: 0; padding: 9px 0; border: 0; border-radius: 0;
  background: none; box-shadow: none; outline: none; resize: none; color: var(--ink); font: inherit; font-size: var(--t-5); line-height: 1.55;
}
.studiochat-send { flex: none; width: 38px; height: 38px; display: grid; place-items: center; border: 0; border-radius: 50%; background: var(--brand); color: #fff; cursor: pointer; }
.studiochat-send:hover { filter: brightness(1.08); }
.studiochat-send:disabled { opacity: .45; cursor: default; filter: none; }
.studiochat-send:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.studiochat-snarveier { display: flex; flex-wrap: wrap; gap: 6px; }
.studiochat-snarveier button { padding: 7px 14px; min-height: 34px; border: 1px solid var(--line); border-radius: 999px; background: none; color: var(--ink-soft); font: inherit; font-size: var(--t-4); cursor: pointer; }
.studiochat-snarveier button:hover { color: var(--ink); background: var(--flate-knapp-hover); }
/* Linjene et forslag eller en markering gjelder. Arket er hvitt i begge temaer. */
.manusark.redigerbar .manusfelt > .omskrivmaal { background: #FFF4D6; box-shadow: 0 0 0 .5cqw #FFF4D6; border-radius: .4cqw; }
/* Radene i panelet (18. sep 2026): navnet, starten på teksten og en pil på
   én linje. Resten kommer når raden åpnes. Overstyrer den store boksen som
   details får ellers i portalen (nordiva.css). */
/* Luft og ramme (19. sep 2026): «kort sagt» i egen boks, radene samlet i
   én ramme med mer plass i hver rad. */
.manusvindu-om { row-gap: 14px; }
.manusvindu-kortboks { display: grid; gap: 6px; padding: 14px 16px; border: 1px solid var(--line); border-radius: var(--r-3); background: var(--flate-svak); }
.manusvindu-kortboks .etikett, .manusvindu-omtittel { margin: 0; }
.manusvindu-kortboks .manusvindu-kort { font-size: var(--t-5); line-height: 1.55; }
.manusvindu-omtittel { margin-top: 4px; }
.omliste { display: grid; border: 1px solid var(--line); border-radius: var(--r-3); overflow: hidden; }
details.omrad { background: none; border: 0; border-bottom: 1px solid var(--line); border-radius: 0; margin: 0; }
details.omrad:last-child { border-bottom: 0; }
details.omrad[open] { background: var(--flate-svak); }
details.omrad > summary {
  display: grid; grid-template-columns: 96px minmax(0, 1fr) auto; align-items: center; gap: 12px;
  min-height: 48px; padding: 10px 14px; cursor: pointer; font-size: var(--t-4); line-height: 1.4; list-style: none;
}
details.omrad > summary::-webkit-details-marker { display: none; }
details.omrad > summary::after, details.omrad[open] > summary::after {
  content: '\25BE'; margin: 0; font-size: var(--t-3); color: var(--ink-soft); transition: transform .2s ease;
}
details.omrad[open] > summary::after { transform: rotate(180deg); }
details.omrad[open] > summary { padding-bottom: 4px; }
details.omrad > summary:hover .omnavn { color: var(--brand); }
details.omrad > summary:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; border-radius: var(--r-2); }
.omnavn { font-weight: 600; color: var(--ink); }
.omforhand { min-width: 0; color: var(--ink-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
details.omrad[open] .omforhand { visibility: hidden; }
details.omrad.advarsel .omnavn, details.omrad.advarsel .omforhand { color: var(--amber); }
.omtekst { padding: 0 14px 14px; line-height: 1.6; overflow-wrap: anywhere; }
.omtekst .studiotekst { margin: 0; }
.omtekst .studioliste { margin: 0; padding-left: 1.1em; }
@media (prefers-reduced-motion: reduce) { details.omrad > summary::after { transition: none; } }

.manusvindu { position: fixed; inset: 0; z-index: 150; display: grid; place-items: center; }
.manusvindu-bakgrunn { position: absolute; inset: 0; background: rgba(4, 7, 20, .72); }
.manusvindu-panel {
  position: relative; z-index: 1; display: flex; flex-direction: column; gap: 14px;
  width: min(97vw, 1720px); height: min(95vh, 1240px); padding: 18px 22px;
  border-radius: 16px; background: var(--flate-meny2); color: var(--ink); box-shadow: var(--shadow);
}
/* Lukkeknappen står fast øverst til høyre, med farge fra temaet. Den lånte
   før .filmlukk, som er hvit for den mørke filmruta, og ble usynlig på hvitt. */
.manusvindu-lukk {
  position: absolute; top: 14px; right: 14px; z-index: 2; width: 38px; height: 38px; display: grid; place-items: center;
  border: 1px solid var(--line); border-radius: var(--r-3); background: var(--flate-knapp); color: var(--ink); cursor: pointer;
}
.manusvindu-lukk:hover { background: var(--flate-knapp-hover); }
.manusvindu-lukk:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.manusvindu-topp { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px 16px; padding-right: 52px; min-height: 40px; }
.manusvindu-bla { flex: none; display: inline-flex; align-items: center; gap: 2px; padding: 2px; border: 1px solid var(--line); border-radius: 999px; }
.manusvindu-teller { min-width: 3.4em; text-align: center; font-size: var(--t-3); color: var(--ink-soft); font-variant-numeric: tabular-nums; }
/* Små runde ikonknapper: bla og skriv ut. */
.manusvindu-ikon { flex: none; width: 34px; height: 34px; display: grid; place-items: center; border: 0; border-radius: 50%; background: none; color: var(--ink); cursor: pointer; }
.manusvindu-ikon:hover:not(:disabled) { background: var(--flate-knapp-hover); }
.manusvindu-ikon:disabled { opacity: .35; cursor: default; }
.manusvindu-ikon:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.manusvindu-knapper .manusvindu-ikon { border: 1px solid var(--line); width: 44px; height: 44px; }
/* Knappene i toppen: 44 px høye (minste klikkflate i portalen), og med
   mindre luft på sidene enn en vanlig .btn, så raden ikke blir tung. */
.manusvindu-knapper .btn { min-height: 44px; padding: 6px 16px; gap: 6px; }
.manusvindu-navn { flex: 1 1 220px; display: grid; grid-template-columns: minmax(0, 1fr); row-gap: 2px; min-width: 0; }
.manusvindu-tittel b { font-size: var(--t-5); }
.manusvindu-navn .eyebrow { margin: 0; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.manusvindu-tittel { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; }
.manusvindu-knapper { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-left: auto; }
@media (max-width: 520px) {
  .manusvindu-knapper .btn { width: auto; flex: 1 1 auto; min-height: 44px; }
}
/* Linja over arket: at det kan skrives i, og om det er lagret. */
.manusvindu-redigerlinje { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 14px; width: min(100%, 820px); margin: 10px auto 0; font-size: var(--t-3); }
.manusvindu-redigerlinje .hint { margin: 0; }
.manusvindu-lagret { color: var(--ink-soft); }
.manusvindu-lagret.feil { color: var(--red); }
.manusvindu-redigerlinje .tilbake { margin: 0 0 0 auto; padding: 4px 0; font-size: var(--t-3); }
/* Arket som kan skrives i. Papiret er hvitt i begge temaer, så fargene her
   er faste som resten av arket. Feltet viser at det kan skrives i når
   musa er over, og tydelig når markøren står der. */
.manusark.redigerbar { caret-color: #4C7DFF; }
.manusark.redigerbar .manusfelt { display: block; font-size: clamp(15px, 1.95cqw, 19px); line-height: 1.5; border-radius: .6cqw; outline: none; cursor: text; transition: background-color .15s ease, box-shadow .15s ease; }
.manusark.redigerbar .manustittel { display: inline; font-size: inherit; line-height: inherit; }
.manusark.redigerbar .manusfelt:hover { background: #F4F6FC; box-shadow: 0 0 0 .6cqw #F4F6FC; }
.manusark.redigerbar .manusfelt:focus { background: #F4F6FC; box-shadow: 0 0 0 .6cqw #F4F6FC, 0 0 0 .85cqw rgba(76, 125, 255, .5); }
@media (prefers-reduced-motion: reduce) { .manusark.redigerbar .manusfelt { transition: none; } }
.manusvindu-hoved { flex: 1 1 auto; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr) minmax(280px, 380px); gap: 20px; }
/* Linja over arket og arket under. Arket fyller resten av høyden, så en kort
   tekst ser ut som en hel side. Før var det min-height: 100 % av flaten, og
   da ble arket like høyt som flaten pluss linja over, og rant ut nederst. */
.manusvindu-arkflate { min-height: 0; overflow-y: auto; padding: 4px 12px 24px; border-radius: var(--r-3); background: var(--flate-svak); display: flex; flex-direction: column; }
.manusvindu-arkflate .manusark.stor { flex: 1 0 auto; }
.manusvindu-arkflate .manusark { width: min(100%, 820px); margin: 12px auto 0; box-shadow: 0 10px 30px rgba(4, 7, 20, .25); }
.manusvindu-om { min-height: 0; overflow-y: auto; display: grid; grid-template-columns: minmax(0, 1fr); align-content: start; row-gap: 10px; line-height: 1.5; padding-right: 4px; }
.manusvindu-om h3 { margin: var(--luft-1) 0 0; font-size: var(--t-5); }
.manusvindu-om .varsel { margin: 0; }
@media (max-width: 900px) {
  .manusvindu-panel { height: 96vh; padding: 14px; }
  /* Radene er så høye som innholdet. Med min-height 0 fra den brede
     utgaven krympet arket-raden, og panelet under la seg oppå arket. */
  .manusvindu-hoved { grid-template-columns: minmax(0, 1fr); grid-auto-rows: max-content; overflow-y: auto; }
  .manusvindu-arkflate, .manusvindu-om, .manusvindu-venstre { overflow: visible; min-height: auto; }
}


/* ==========================================================================
   HELE SKJERMEN I ADMIN (21. september 2026)

   Theodor sitter ved en stor skjerm, og admin sluttet på 1200 til 1600 px
   med en tom stripe på høyre side. Hver fane hadde sitt eget tak, satt ett
   og ett etter hvert som noen klaget. Nå har admin ingen tak: innholdet går
   fra menyen til høyre kant, med marger som vokser med skjermen.

   Bare i admin (.adminramme). Redigererportalen deler noen av skjermene
   (#skjerm-oppdrag, #skjerm-klipp) og beholder sine egne bredder.

   Rutenett som bruker auto-fit og minmax legger på kolonner av seg selv når
   det blir plass. Løpende tekst får fortsatt en lesbar linjelengde. */
.adminramme .skjerm .wrap,
.adminramme .skjerm .wrap.bred,
.adminramme #skjerm-oppdrag .wrap.bred,
.adminramme #skjerm-klipp .wrap {
  max-width: none;
  padding-left: clamp(16px, 2.2vw, 48px);
  padding-right: clamp(16px, 2.2vw, 48px);
}
/* Ingressen og forklarende avsnitt blir ikke én linje på 2 400 px. */
.adminramme .skjerm .lead { max-width: 80ch; }

/* Oversiktens tabeller (21. september 2026) har tre til fem tallkolonner og
   holder seg som tabell helt ned til 480 px. Grensen på 700 px er laget for
   Vinnere-tabellen med mange kolonner: på Oversikten stablet den et
   halvbredt kort i én kolonne på en vanlig skjerm, med «ROAS», «Forbruk» og
   «Status» på hver sin linje. */
@container (max-width: 700px) {
  .vtabell.ovtabell .vtabell-hode { display: grid; }
  .vtabell.ovtabell .vtabell-hode,
  .vtabell.ovtabell .vtabell-rad {
    grid-template-columns: minmax(150px, 2fr) repeat(var(--vkol), minmax(64px, 1fr)) 0;
    column-gap: 12px;
  }
  .vtabell.ovtabell .vtabell-rad { padding: 8px 6px; }
  .vtabell.ovtabell .vtabell-rad .vkonsept,
  .vtabell.ovtabell .vtabell-rad .vcelle { grid-column: auto; }
  .vtabell.ovtabell .vtabell-rad .vcelle { display: grid; grid-template-columns: none; justify-content: normal; text-align: left; }
  .vtabell.ovtabell .vtabell-rad .vcelle.tall { justify-items: end; text-align: right; }
  .vtabell.ovtabell .vtabell-rad .vcelle::before { content: none; }
  .vtabell.ovtabell .vtabell-rad .vcelle > * { grid-column: auto; }
  .vtabell.ovtabell .vtabell-rad .vcelle .lapp { justify-self: start; }
}
@container (max-width: 480px) {
  .vtabell.ovtabell .vtabell-hode { display: none; }
  .vtabell.ovtabell .vtabell-rad { grid-template-columns: minmax(0, 1fr) auto; row-gap: 6px; padding: 12px 6px; }
  .vtabell.ovtabell .vtabell-rad .vkonsept { grid-column: 1 / -1; }
  .vtabell.ovtabell .vtabell-rad .vcelle {
    grid-column: 1 / -1; grid-template-columns: auto auto; justify-content: space-between;
    align-items: baseline; column-gap: 12px; text-align: right;
  }
  .vtabell.ovtabell .vtabell-rad .vcelle::before {
    content: attr(data-etikett); grid-row: 1 / span 2; font-size: var(--t-3); color: var(--ink-soft); text-align: left;
  }
  .vtabell.ovtabell .vtabell-rad .vcelle > * { grid-column: 2; }
  .vtabell.ovtabell .vtabell-rad .vcelle .lapp { justify-self: end; }
}

/* ==========================================================================
   HELE SKJERMEN FOR TEAMET (21. september 2026)

   Redigererportalen og stemmeportalen sluttet på 740 px (.wrap) eller
   1 200 px (.wrap.bred), og på en stor skjerm sto to tredeler tomt. Nå
   bruker de hele bredden, som admin, med marger som vokser med skjermen.

   Det som skal LESES holder en lesbar linjelengde (ingressen, profilskjemaet).
   Det som er LISTER blir et rutenett som legger på kolonner når det er plass.
   Og sidene der man både leser og jobber (ett oppdrag, ett lydoppdrag) får
   to kolonner på en stor skjerm: det du skal lese til venstre, det du skal
   gjøre til høyre. */
.teamramme .skjerm .wrap,
.teamramme .skjerm .wrap.bred {
  max-width: none;
  padding-left: clamp(16px, 2.4vw, 56px);
  padding-right: clamp(16px, 2.4vw, 56px);
}
.teamramme .skjerm .lead { max-width: 80ch; }

/* Oppdragene og lydoppdragene: kort i et rutenett, ikke en lang søyle. */
.teamramme #oppdragsliste,
.teamramme #stemmeliste {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 440px), 1fr));
  gap: 14px;
  align-items: stretch;
}
.teamramme #oppdragsliste > .kort,
.teamramme #stemmeliste > .kort { margin: 0; }
.teamramme #oppdragsliste > .varsel,
.teamramme #stemmeliste > .varsel { grid-column: 1 / -1; }

/* Ett oppdrag, eller ett lydoppdrag: to kolonner fra 1 300 px. Kortene
   beholder sin egen avstand under seg, så kolonnene er vanlige stabler. */
.oppdrag-les, .oppdrag-jobb, .lyd-les, .lyd-jobb { min-width: 0; }
@media (min-width: 1300px) {
  .oppdrag-to, .lyd-to {
    display: grid;
    grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
    column-gap: var(--luft-4, 32px);
    align-items: start;
  }
}
/* På en veldig bred skjerm får lesesiden ikke linjer på 1 400 px. */
@media (min-width: 2200px) {
  .oppdrag-to, .lyd-to { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}

/* Profilen er et skjema: det blir ikke bedre av å være 2 000 px bredt. */
.teamramme #skjerm-profil .wrap > * { max-width: 820px; }

/* Skolen: leksjonene i et rutenett. Honoraret: en linjeliste, så den får
   ikke beløp 1 800 px unna oppdragsnummeret. */
.teamramme #skolen-liste {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 520px), 1fr));
  gap: 14px;
  align-items: start;
}
.teamramme #skolen-liste > .kort { margin: 0; }
.teamramme #skjerm-honorar .wrap > * { max-width: 1100px; }


/* ==========================================================================
   LODD (25. september 2026)

   HVORFOR DETTE LAGET FINNES

   Grunnlaget vårt er nordiva.css, som er kopiert fra kreatørportalen. Femten
   kommentarer der sier rett ut at formspråket er hentet fra et annet produkt:
   radiusen er 20px «fordi Trybe ligger rundt 20 til 24», knappen er en pille
   med pil, og skyggen på 38px stemples på alt som er en flate. Det er et
   markedsføringsstilark, og det er riktig der. Men adminpanelet og
   redigererportalen er arbeidsbord med tabeller, videolister og lydspillere,
   og et arbeidsbord skal se ut som et instrument.

   Tre ting skiller en flate som virker tegnet fra en som virker generert:

     1. SKALAER MED TRINN. Før dette fantes det rundt 50 skriftstørrelser,
        186 avrundinger og gap i femten ulike verdier. Ingenting rimte med
        noe. Her er det åtte skrifttrinn, tre radiuser og åtte lufttrinn, og
        ingenting imellom.

     2. KANT I STEDET FOR SKYGGE. Ni kort med 38 pikslers uskarp skygge under
        hverandre blir en myk grøt uten kanter. Nå bærer en hårstrek
        strukturen, og skygge er forbeholdt det som faktisk flyter over noe
        annet: meny, dialog, innloggingskortet. Har noe skygge, ligger det
        over noe.

     3. EN SKRIFT SOM TÅLER SMÅ STØRRELSER. Montserrat er en geometrisk
        displayskrift. I 12 og 13 piksler blir den svak, null og stor O
        skilles dårlig, og den står i hver eneste tabell vi har. Geist er
        tegnet for verktøyflater, og Geist Mono gjør at tall og tidskoder
        står i lodd uten triks.

   INGEN KLASSENAVN ER RØRT. Alt her er tokenverdier og overstyringer, så
   ingen av de 1556 class-strengene i JavaScript kan slutte å treffe.
   ========================================================================== */

:root {
  /* --- Skriftene. Tre familier, ikke flere. -----------------------------
     Serifen er en display, ikke en brødtekst: sidetittel og det ene store
     tallet, aldri i en tabell og aldri under 22px. En serif i en ellers
     teknisk flate er det billigste grepet mot å se generert ut, fordi
     standarden nesten alltid er ren grotesk hele veien. */
  --font-ui:      'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  --font-mono:    'Geist Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  --font-display: 'Instrument Serif', Georgia, 'Times New Roman', serif;

  /* --- Skrifttrappen. Åtte trinn, ingenting imellom. --------------------
     28. september 2026: trappen var definert her, men brukt 17 av 535
     steder. Resten sto i rem med to desimaler, og 1rem er 16px uansett hva
     body står i, så «.9rem» var 14,4px og ingen kunne si hvorfor akkurat
     den. 251 av dem er byttet til nærmeste trinn.

     UAVGJORT RUNDES OPP. 1rem ligger nøyaktig mellom --t-4 og --t-5, og
     14px mellom --t-3 og --t-4. Driften her har alltid gått mot for tett,
     aldri mot for stort (se hele Luft-kapitlet i CLAUDE.md), så en uavgjort
     skal falle på lesbarhet.

     LINJEHØYDENE ER IKKE RØRT. Hvert trinn har en --t-N-h som hører til,
     men de fleste reglene arver linjehøyden sin, og de som setter den selv
     setter den uten enhet. sjekk-luft.mjs leser nettopp enhetsløse verdier
     og stopper utrullingen under 1.4. Byttes de til var(--t-N-h), blir den
     vakta blind i samme slengen, og det er ikke en bieffekt av en
     opprydding: det er en egen avgjørelse som må tas med vakta i hånden. */
  --t-1: 11px;  --t-1-h: 16px;   /* etiketten, i mono og versaler */
  --t-2: 12px;  --t-2-h: 18px;   /* metadata, tidskode, filnavn */
  --t-3: 13px;  --t-3-h: 20px;   /* tabellkropp og tett liste */
  --t-4: 15px;  --t-4-h: 22px;   /* standard grensesnitt, felt og knapp */
  --t-5: 17px;  --t-5-h: 26px;   /* løpende tekst: brief og oppskrift */
  --t-6: 20px;  --t-6-h: 26px;   /* h3 og korttittel */
  --t-7: 26px;  --t-7-h: 32px;   /* h2 og seksjon */
  --t-8: 34px;  --t-8-h: 40px;   /* h1, i serif */

  /* --- Luft INNE i komponenter. ----------------------------------------
     --luft-1 til --luft-5 er den YTRE rytmen mellom seksjoner. Denne
     skalaen gjelder innsiden, der frihånden har rådd: gap 8px 60 ganger,
     6px 42 ganger, 10px 34 ganger, 2px 27 ganger. */
  --s-1: 2px;  --s-2: 4px;  --s-3: 8px;  --s-4: 12px;
  --s-5: 16px; --s-6: 24px; --s-7: 32px; --s-8: 48px;

  /* --- Den ytre rytmen peker på de samme trinnene. ----------------------
     28. september 2026. --luft-1 til --luft-5 var definert TO ganger med
     ULIKE verdier: nordiva.css ga 10, 18, 28, 44, 80, og redigering.css ga
     9, 16, 25, 39, 70. personvern.html laster ikke redigering.css, så det
     samme navnet betydde 10px der og 9px på alle de andre sidene. Ett navn
     som betyr to ting er ikke en skala, det er to.

     Ingen av de to filene kan rettes: nordiva.css er en låst kopi, og
     innstrammingen i redigering.css er et bevisst valg med en begrunnelse
     som står der. Derfor peker de her, i arket som lastes sist og som
     derfor vinner over begge.

     Trinnet er det nærmeste for BEGGE de gamle verdiene, ikke bare den ene:
     10 og 9 til --s-3, 18 og 16 til --s-5, 28 og 25 til --s-6. Ingen av dem
     flytter seg mer enn 2px på noen side.

     --luft-4 og --luft-5 står med vilje IKKE her. Nærmeste trinn til 39 er
     32, og til 70 er 48. Begge er langt nok unna til at oppdragsskjemaet og
     tokolonnene ville sett synlig annerledes ut, og det er et utseendevalg
     og ikke et mekanisk. De to lever videre dobbelt til valget er tatt. */
  --luft-1: var(--s-3);
  --luft-2: var(--s-5);
  --luft-3: var(--s-6);

  /* --- Form. Tre radiuser. ---------------------------------------------
     20px på alt som er et kort er den mest gjenkjennelige mal-radiusen som
     finnes. Pillen overlever bare der noe faktisk er en sirkel.

     28. september 2026: de tre sto som 10px, 6px og 3px, altså de samme
     tallene som Lodds --r-3, --r-2 og --r-1 skrevet en gang til. En verdi
     som er gjentatt er en verdi som kan drive fra kilden uten at noen ser
     det. Nå peker de. Navnene blir stående fordi nordiva.css er en låst
     kopi som bruker dem 84 steder, og den kan bare nås gjennom navnet.
     Våre egne regler bruker --r-1 til --r-3 direkte.

     Samme dag ble 142 frie radiuser byttet til nærmeste trinn. To valg der
     er ikke opplagte, og står derfor her:

     8px ligger nøyaktig midt mellom 6 og 10, og ble --r-2. Det mindre
     trinnet er valgt fordi de fleste 8-erne satt på et bilde eller en
     kontroll INNE i et kort, og et barn som er rundere enn forelderen ser
     ut som en feil selv når begge tallene er lovlige.

     .chip, .stikk, .fiksetknapp, .filmvariant og .filmneste sto på 20px,
     som er mer enn halve høyden deres. Nettleseren skalerer da radiusen ned
     til nøyaktig halve høyden, altså en pille. De er skrevet som 999px, som
     tegner nøyaktig det samme, i stedet for å bli tvunget ned på 10px som
     ville endret formen. */
  --radius-card:  var(--r-3);
  --radius-el:    var(--r-2);
  --radius-liten: var(--r-1);

  /* --- Tid. Ingenting i arbeidsflaten varer over 200 ms. ----------------
     Sju frihåndsverdier fra .12s til 1.2s ble til tre. To naboelementer som
     reagerer på 130 og 150 millisekunder merkes ikke bevisst, men flaten
     føles upresis. */
  --tid-1: 90ms;  --tid-2: 140ms;  --tid-3: 180ms;
  --kurve: cubic-bezier(.2, 0, 0, 1);

  /* --- Merkevaren som komponenter, ikke som hex. ------------------------
     Uten dette ble gjennomsiktig merkefarge skrevet som rgba(76,125,255,…)
     sytten steder, og den blå du møtte i LYST tema var ikke marineblåen vår,
     men standardblåen alle rammeverk har. */
  /* ===== PALETTEN KOMMER FRA LODD =====================================
     27. september 2026. Portalen og OS-et så ut som to produkter, og det var
     ikke en tilfeldighet: de hadde hvert sitt variabelsett, og de hadde
     drevet fra hverandre. Papiret her var varmt (#F7F6F4, rødt høyest og
     blått lavest) mens OS-ets var nøytralt.

     Nå lastes assets/lodd-tokens.css FØR denne fila. Den har bare verdiene
     fra Lodd, ingen komponentregler, så ingenting kan kollidere med
     nordiva.css. De navnene Lodd og portalen deler, er tatt ut her, slik at
     Lodds verdi står. De navnene bare portalen har, PEKER på et Lodd-token i
     stedet for å gjenta en verdi.

     Regelen videre: en farge skrives ett sted. Skal noe endres, endres det i
     lodd.css i nordiva-os, og del-lodd.sh tar det hit. ================== */

  /* Det varme papiret er borte. Theodor 27. september: «naar det foerst skal
     vaere lyst kan det ikke vaere blaatt brukersnitt», og det samme gjelder
     varmt: oeyet bruker en nesten hvit flate som sin egen hvitreferanse, og
     alt som ikke er noeytralt der ser ut som en feilkalibrert skjerm. Lodds
     lyse noeytraler har lik R, G og B.

     --brand, --brand-rgb, --brand-hover, --paper, --line og --ink er tatt ut:
     Lodd har dem med de samme navnene. */
  --brand-myk: rgb(var(--brand-rgb) / .06);
  /* Disse tre staar i nordiva.css, som er en laast kopi og lastes ETTER
     lodd-tokens.css. Derfor kan de ikke bare tas ut her: de maa PEKES, og
     tema.css lastes sist. Se lag-tokenfil.py i nordiva-os. */
  --paper: var(--lodd-paper);
  --ink:   var(--lodd-ink);
  --line:  var(--lodd-line);

  --card:      var(--flate);
  --line-mork: var(--line-2);
  --ink-sterk: var(--ink);
  --ink-soft:  var(--ink-2);
  --ink-svak:  var(--ink-3);

  /* --- Skygge blir relieff. --------------------------------------------
     En lys innerstrek øverst gjør at en flate leses som presset ned i
     papiret i stedet for å sveve over det. Ekte skygge er flyttet til
     --skygge-over, og brukes bare på meny, dialog og innlogging. */
  --shadow:      inset 0 1px 0 rgb(255 255 255 / .70);
  --shadow-lav:  inset 0 1px 0 rgb(255 255 255 / .70);
  --skygge-over: 0 1px 2px rgb(14 27 77 / .08), 0 8px 24px rgb(14 27 77 / .12);

  /* Glasset i topplinja var det gamle varme papiret (#F7F6F4). Nå Lodds. */
  --flate-topp:        color-mix(in srgb, var(--lodd-paper) 86%, transparent);
  --flate-meny:        #FFFFFF;
  --flate-meny2:       #FFFFFF;
  --flate-kort:        #FFFFFF;
  --flate-klippkort:   #FFFFFF;
  /* DE VARME FLATENE SOM BLE IGJEN. Rettet 28. september 2026.

     Da paletten ble koblet til Lodd dagen foer, ble de sju hovednoeytralene
     tatt: papir, kort, blekk, strek. Fem sto igjen, og det var de man faktisk
     ser i bruk: begge hover-flatene, den svake flata og kortkanten. De var
     varme (#EDEBE7 har roedt hoeyest og blaatt lavest), saa hver gang
     musepekeren gikk over en rad, kom det et beige glimt i et noeytralt
     skall.

     Det ble funnet av en kartlegging, ikke av at noen saa det, og det er
     nettopp poenget med aa telle i stedet for aa se: fem verdier av tolv sto
     igjen etter en jobb som ble meldt ferdig. */
  --flate-bilde:       var(--flate-3);
  --flate-felt:        var(--flate);
  --flate-felt-fokus:  var(--flate);
  --flate-knapp:       var(--flate);
  --flate-knapp-hover: var(--flate-2);
  --flate-svak:        var(--flate-2);
  --flate-hover:       var(--flate-3);
  --flate-valgrad:     rgb(255 255 255 / .96);
  --kant-kort:         var(--line-2);
}

/* Det mørke temaet er allerede ekte fargearbeid, med begrunnelser som står
   øverst i denne fila. Det som endres her er formen, ikke fargene. */
:root[data-tema="mork"] {
  --brand-rgb:   76 125 255;
  --brand-hover: #6A92FF;
  --line:        rgb(255 255 255 / .09);
  --line-mork:   rgb(255 255 255 / .16);
  --ink-svak:    #8A93AC;
  --shadow:      inset 0 1px 0 rgb(255 255 255 / .045);
  --shadow-lav:  inset 0 1px 0 rgb(255 255 255 / .045);
  --skygge-over: 0 1px 2px rgb(0 0 0 / .45), 0 8px 24px rgb(0 0 0 / .38);
}


/* --- Skriften i bruk ------------------------------------------------------ */

body { font-family: var(--font-ui); letter-spacing: 0; }

/* Sidetittelen er det ene stedet serifen slipper til på en listeskjerm. */
.innhold h1, .loginkort h1 {
  font-family: var(--font-display);
  font-weight: 400;
  letter-spacing: 0;
}
.innhold h1 { font-size: var(--t-8); line-height: 1.18; }
.innhold h2 { font-size: var(--t-7); line-height: 1.25; font-weight: 600; letter-spacing: -.01em; }
.innhold h3 { font-size: var(--t-6); line-height: 1.3;  font-weight: 600; letter-spacing: -.005em; }

/* Admin tåler tettere informasjon enn kreatørflatene. Det sto som en
   husregel i grunnlaget og som et helt tetthetspass i nordiva.css, men
   klassen body.tett settes aldri noe sted, så passet har aldri kjørt. Her
   er den delen som faktisk trengs, hengt på rammen i stedet. */
.adminramme .innhold { font-size: var(--t-4); line-height: var(--t-4-h); }
.teamramme  .innhold { font-size: var(--t-5); line-height: var(--t-5-h); }

.innhold .lead {
  font-size: var(--t-5);
  line-height: var(--t-5-h);
  color: var(--ink-soft);
  max-width: 68ch;
}

/* Den lille versal-etiketten var tegnet på nytt 31 ganger, med åtte
   størrelser og elleve sperringer. Én definisjon, i mono og i grått, så den
   leses som maskinstemt marginalia og ikke som den fargede mal-eyebrowen. */
.eyebrow {
  font-family: var(--font-mono);
  font-size: var(--t-1);
  line-height: var(--t-1-h);
  font-weight: 500;
  letter-spacing: .06em;
  color: var(--ink-soft);
  margin: 0 0 var(--s-3);
}

/* Tall er maskinelle verdier. Mono gir kolonner som står i lodd uten triks,
   og forteller at verdien er eksakt. */
.tall, .sumtall, .loggtidkode { font-family: var(--font-mono); }

/* Det store tallet satt i en linjeboks 40 prosent høyere enn sifrene, og det
   er grunnen til at flisene på Oversikt ser tomme ut. */
.flistall {
  font-family: var(--font-mono);
  font-size: var(--t-7);
  font-weight: 500;
  line-height: 1.12;
  letter-spacing: -.02em;
}
.flistall small { font-family: var(--font-ui); font-size: var(--t-3); font-weight: 400; }

/* Hjelpeteksten er den mest brukte klassen vi har, og den arvet 25px
   toppmarg fra et markedsføringsstilark. 35 regler i denne fila gjorde ikke
   annet enn å nullstille den igjen, hver for seg. */
.innhold .hint { margin-top: var(--s-3); }


/* --- Kant i stedet for skygge --------------------------------------------- */

/* Disse fire flyter faktisk over noe annet, og bare de. */
.brukermeny .meny2,
.dialogkort,
.manusvindu-panel,
.loginkort { box-shadow: var(--skygge-over); }

/* Kortet som løfter seg og får større skygge på hover er den mest
   gjenkjennelige mal-bevegelsen som finnes, og den bryter husregelen øverst
   i nordiva.css. Hover er nå ett trinn i flateskalaen. */
.annonsekort:hover,
.studioark:hover {
  transform: none;
  box-shadow: var(--shadow);
  background: var(--flate-hover);
}


/* --- Knappene ------------------------------------------------------------- */

/* Knappen var målt opp på nytt åtte ganger uten navn, i tillegg til .handling
   som et helt parallelt primitiv. Gulvet på 44px står: tetthet hentes fra
   skrift, linjeavstand og kanter, aldri fra å krympe trykkflater. */
.btn {
  min-height: 44px;
  padding: 0 18px;
  border-radius: var(--r-2);
  border-width: 1px;
  font-size: var(--t-4);
  font-weight: 600;
  letter-spacing: 0;
  transition: background var(--tid-1) var(--kurve), border-color var(--tid-1) var(--kurve);
}
.btn.rolig { background: var(--flate-knapp); border-color: var(--line-mork); box-shadow: var(--shadow); }
.btn:active { transform: scale(.985); }

/* Pila på primærhandlingen er et markedsføringsgrep fra et annet produkt.
   En knapp i et verktøy sier hva som skjer, den peker ikke videre. */
.btn.pil:after { content: none; }

.handling {
  min-height: 44px;
  border-radius: var(--r-2);
  border-width: 1px;
  font-size: var(--t-3);
}

.innhold input, .innhold select, .innhold textarea,
.loginkort input { border-radius: var(--r-2); font-family: inherit; }

/* DØD SIDEN 28. SEPTEMBER 2026. Lodd-bolken nederst i fila setter .lapp til
   --lodd-r-3 med samme spesifisitet og står sist, så linja under gjør
   ingenting. Den blir stående som spor: valget er statuspillens radius, ikke
   den lille knappens, og begrunnelsen står ved regelen nederst. Skal den
   snus, snus den der og ikke her. */
.lapp { border-radius: var(--r-1); }

/* Tidskoden i loggen sto med hvit tekst på merkefargen i 35 prosent. Det
   virker på mørk flate og blir uleselig på lys. */
.loggtidkode { color: var(--brand); background: rgb(var(--brand-rgb) / .12); }
.loggtidkode:hover { background: rgb(var(--brand-rgb) / .2); }
:root[data-tema="mork"] .loggtidkode { color: #fff; }


/* --- Luften på smal skjerm ------------------------------------------------
   nordiva.css komprimerer --luft-4 og --luft-5 under 820px, men
   redigering.css setter de samme tokenene ubetinget på :root og lastes
   etterpå, så komprimeringen har aldri vært i drift. Her står den der den
   faktisk vinner. */
@media (max-width: 820px) {
  :root { --luft-4: 34px; --luft-5: 56px; }
}
@media (max-width: 520px) {
  body { font-size: 16px; }
}

/* Sidemenyen er satt opp som et eget kort med 20px hjørner i grunnlaget.
   Den er den største flaten på skjermen, så den avgjør hvor rund hele
   appen ser ut. */
.appramme.luftig .sidemeny { border-radius: var(--r-3); }

/* KNAPPETEKSTEN I MØRKT TEMA

   Merkefargen ble løftet til #4C7DFF fordi marineblå på marineblå er en
   usynlig knapp. Den er riktig, men hvit tekst på den gir 3,7 mot 1, og
   under 4,5 blir en knappetekst sliten å lese. Samme blå med mørk tekst gir
   5,1. Knappen beholder altså fargen, det er blekket som snus. */
:root[data-tema="mork"] .btn { color: #0A0F1F; }
:root[data-tema="mork"] .btn:hover {
  color: #0A0F1F;
  background: var(--brand-hover);
  border-color: var(--brand-hover);
}
:root[data-tema="mork"] .btn.rolig,
:root[data-tema="mork"] .btn.rolig:hover { color: var(--brand); }

/* ==========================================================================
   LODD, RUNDE 1B (25. september 2026)

   Etter at trinn 1 var ute, sto det igjen fire steder der en komponent
   fortsatt bar kreatørportalens møbler. Alle fire er samme feil: en flate
   som er tegnet som et kort, i en sammenheng der den er en rad.
   ========================================================================== */

/* OPPDRAGSTABELLEN VAR FIRE KORT, IKKE FIRE RADER

   Hver rad hadde egen ramme, egen radius og egen flate, med åtte piksler
   mellom. Da må øyet finne venstrekanten på nytt for hver rad, og fire
   oppdrag ser ut som fire saker i stedet for én liste. Nå deler de flate,
   og en hårstrek skiller dem. */
.opptabell { row-gap: 2px; }
.opprad {
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  background: none;
  padding: var(--s-4) var(--s-5);
}
.opptabell-hode {
  font-family: var(--font-mono);
  font-size: var(--t-1);
  line-height: var(--t-1-h);
  font-weight: 500;
  letter-spacing: .06em;
  padding-bottom: var(--s-3);
  border-bottom: 1px solid var(--line-mork);
}
.oppcelle small { font-size: var(--t-2); }

/* Radhandlingene sto i merkefargen på hver eneste rad. Fire oppdrag ganger
   tre handlinger er tolv blå ord på skjermen, og da roper listen like høyt
   som den ene tingen du faktisk skal gjøre. Fargen kommer på hover. */
.opphandling .tilbake {
  color: var(--ink-soft);
  font-weight: 500;
  font-size: var(--t-3);
  text-decoration: none;
}
.opphandling .tilbake:hover { color: var(--brand); text-decoration: none; }
.opphandling .tilbake.farlig:hover { color: var(--red); }

/* RØRET ØVERST

   Tallene er hovedsaken, og de sto i grensesnittskriften med en linjeboks
   40 prosent høyere enn sifrene. Chevronen mellom cellene er hentet fra
   samme sted som pila på knappen; kanten skiller dem allerede. */
.flytkort { border-radius: var(--r-3); }
.flytrad-navn {
  font-family: var(--font-mono);
  font-size: var(--t-1);
  font-weight: 500;
  letter-spacing: .06em;
}
.flytcelle { min-height: 56px; padding: var(--s-4) var(--s-5); }
.flytcelle b {
  font-family: var(--font-mono);
  font-size: var(--t-6);
  font-weight: 500;
  line-height: 1.2;
  letter-spacing: -.01em;
}
.flytcelle span { font-size: var(--t-2); line-height: var(--t-2-h); }
.flytrad > .flytcelle + .flytcelle::before { content: none; }

/* «FERDIGE OG AVLYSTE» VAR ET SPØRSMÅL OG SVAR

   Den er en vanlig <details>, og details i grunnlaget er tegnet for
   spørsmål og svar på en markedsføringsside: egen flate, egen ramme og et
   stort pluss i merkefargen. I en liste over oppdrag er den bare en linje
   du kan folde ut. */
.ferdigeoppdrag {
  background: none;
  border: 0;
  border-top: 1px solid var(--line);
  border-radius: 0;
  margin: var(--s-5) 0 0;
}
.ferdigeoppdrag > summary { padding: 0 var(--s-2); font-size: var(--t-3); }
.ferdigeoppdrag > summary:after {
  font-size: var(--t-5);
  font-weight: 400;
  color: var(--ink-soft);
}

/* Hover i menyen lå så nær valgt tilstand at to punkter så valgt ut
   samtidig. Valgt er merkefargen, hover er bare et hint om at noe skjer. */
:root[data-tema="mork"] .sidemeny button:hover,
:root[data-tema="mork"] .bunnmeny button:hover { background: rgb(255 255 255 / .035); }

/* ==========================================================================
   TRYKKFØLELSE. Lagt til 28. september 2026.

   Theodor: «farten og klikkene skal være smooth og brukervennlig.»

   Målt i portalen før dette, innlogget, med 163 knapper på skjermen:
     104 av 163 hadde ingen :active. Ingen trykkfølelse i det hele tatt.
     0 av 163 hadde touch-action: manipulation, som gir 300 ms forsinkelse
       på berøring mens nettleseren venter på et dobbelttrykk.
     Blinkeflaten på trykk sto på rgba(0, 0, 0, .18).

   Blinkeflaten er det tydeligste «dette er en nettside»-signalet som finnes,
   og den kommer oppå det vi selv tegner. Den slås av her, og da MÅ noe annet
   svare på trykket, ellers har vi fjernet den eneste tilbakemeldingen.

   Står nederst i tema.css med vilje: nordiva.css er en låst kopi fra
   kreatørportalen og skal ikke endres. tema.css lastes sist og vinner.
   ========================================================================== */

html {
  -webkit-tap-highlight-color: transparent;
  /* Ingen oppblåsing av skrift i landskap på telefon. */
  -webkit-text-size-adjust: 100%;
}

/* touch-action: manipulation sier at elementet aldri dobbelttrykk-zoomer, og
   da slipper nettleseren å vente. user-select fordi et langt trykk på en
   knapp skal ikke markere teksten i den: native knapper gjør ikke det.
   IKKE på body: adresser, ordrenumre og feilmeldinger skal kunne kopieres. */
button,
a.btn,
[role="button"],
.fane,
summary {
  touch-action: manipulation;
  user-select: none;
  -webkit-user-select: none;
}

/* Oppdragskortet får touch-action, men IKKE user-select: none. Det er et
   kort med oppdragstittel, frist og honorar, og en frilanser skal kunne
   markere og kopiere tittelen. En knapp er en kontroll; et kort er innhold
   som også kan trykkes, og de to skal ikke behandles likt. */
.oppdragskort { touch-action: manipulation; }

/* SVARET PÅ TRYKKET. 0.97 er nok til å kjennes og lite nok til at ingenting
   flytter på naboen. 110 ms og ease-out: det skal skje mens fingeren er
   nede, ikke etterpå.

   Bare transform og opacity, som hopper over layout og maling og går på
   skjermkortet. En knapp som trykkes hundre ganger om dagen skal ikke koste
   en omregning av siden. */
button:active,
a.btn:active,
[role="button"]:active,
.fane:active,
.oppdragskort:active,
summary:active {
  transform: scale(0.97);
}

button,
a.btn,
[role="button"],
.fane,
summary {
  transition: transform 110ms cubic-bezier(0.23, 1, 0.32, 1);
}

/* En knapp som er av, skal ikke svare på trykk: da later den som den gjorde
   noe. Samme for en som holder på. */
button:disabled:active,
button[aria-busy="true"]:active,
[role="button"][aria-disabled="true"]:active {
  transform: none;
}

/* Den som har slått av bevegelse, skal fortsatt få vite at trykket kom fram.
   Da er det farge som svarer, ikke bevegelse. */
@media (prefers-reduced-motion: reduce) {
  button,
  a.btn,
  [role="button"],
  .fane,
  .oppdragskort,
  summary { transition: none; }
  button:active,
  a.btn:active,
  [role="button"]:active,
  .fane:active,
  .oppdragskort:active,
  summary:active { transform: none; opacity: 0.7; }
}

/* ==========================================================================
   FILMVINDUET FØLGER TEMAET. 28. september 2026.

   Theodor viste vurderingsvinduet i lyst tema: skallet var lyst, vinduet var
   mørkt. Årsaken sto ett sted: .filmkort.medlogg hadde background: #0a0f24
   skrevet rett inn, og 29 regler inni var hvitt glass, rgba(255,255,255,…)
   og color: #fff, stemt mot akkurat den mørke fargen. De virker bare på
   mørk bunn. Ingen av dem gikk gjennom et token, så paletten som ble koblet
   til Lodd dagen før, nådde dem aldri.

   TO SLAG, OG SKILLET ER HELE POENGET:

   Følger temaet: kortet og alt som ligger på det. Tittel, lukkeknapp,
   variantfanene, tidslinja under filmen, kommentarpanelet, feltene og
   knappene. Lodds --flate-2 i mørkt tema er nesten nøyaktig samme farge som
   det hvite glasset ga på #0a0f24, så mørkt tema er tilnærmet uendret og
   lyst tema blir riktig.

   Blir mørkt i begge: selve videoen. En video vises best på mørk bunn uansett
   tema, og svarte kanter rundt en film på lyst papir ser ut som et hull.
   Derfor får <video> sin egen bunn i --lodd-skjerm, og IKKE .filmvideo, som
   også holder tidslinja. Bakteppet bak vinduet og mørkningen oppå
   videobildene står også som de var: de dimmer, og det skal de gjøre i
   begge temaer.

   Står nederst med vilje: flere av reglene bor i nordiva.css, som er låst.
   Lik spesifisitet, og tema.css lastes sist.
   ========================================================================== */

/* Videoen: mørk scene i begge temaer. */
.filmvideo video {
  background: var(--lodd-skjerm);
  border-radius: var(--lodd-r-2);
}

/* Kortet. 18 px var en av seks radiuser for langt fra skalaen. */
.filmkort.medlogg {
  background: var(--lodd-flate);
  border: 1px solid var(--lodd-line);
  border-radius: var(--lodd-r-3);
}

.filmtopp { color: var(--lodd-ink); }
.filmnavn .hint { color: var(--lodd-ink-3); }

/* Lukkeknappen var 38 px, målt på telefon 28. september. Den er den
   viktigste knappen i vinduet der, og minstekravet for en trykkflate er 44. */
.filmlukk {
  color: var(--lodd-ink);
  background: var(--lodd-flate-2);
  min-width: 44px;
  min-height: 44px;
}
@media (hover: hover) and (pointer: fine) {
  .filmlukk:hover { background: var(--lodd-flate-3); }
}

/* Variantfanene øverst. */
.filmvarianter { border-bottom: 1px solid var(--lodd-line); }
.filmvariant {
  border: 1px solid var(--lodd-line-2);
  background: var(--lodd-flate-2);
  color: var(--lodd-ink);
}
.filmneste { background: var(--lodd-flate-3); color: var(--lodd-ink); }

/* Tidslinja under filmen, med ett merke per kommentar. */
.filmstripe,
.filmkort .filmstripe {
  background: var(--lodd-flate-2);
  border: 1px solid var(--lodd-line);
}
.filmstripe > * { color: var(--lodd-ink); }
.filmstripe .merket2 { color: var(--lodd-ink-3); }

/* Kommentarpanelet.

   .filmkort.medlogg .filmlogg hadde en EGEN mørk bunn, #111735, tre klasser
   dyp og derfor sterkere enn .filmlogg over. Den ble ikke med i første runde,
   fordi jeg lette etter hvitt glass og #0a0f24 og ikke etter enhver mørk
   farge. Målt i nettleseren: kortet ble hvitt, panelet sto igjen mørkt, og
   overskriften «Kommentarer» fikk for lav kontrast mot det. Funnet 28.
   september ved å måle, og deretter feid etter ALLE mørke bunner i
   filmfamilien: denne var den eneste som sto igjen. */
.filmlogg { border: 1px solid var(--lodd-line); color: var(--lodd-ink); }
.filmkort.medlogg .filmlogg { background: var(--lodd-flate-2); }
.filmlogg .hint { color: var(--lodd-ink-3); }
.loggpunkt { border-bottom: 1px solid var(--lodd-line); }
.loggtidkode,
.loggskjematopp .loggtid { color: var(--lodd-ink); }
.loggforfatter,
.loggskjematopp .etikett { color: var(--lodd-ink-3); }

.loggslett,
.loggendre { color: var(--lodd-ink-3); }
@media (hover: hover) and (pointer: fine) {
  .loggslett:hover { color: var(--lodd-ink); }
  .loggendre:hover { color: var(--lodd-ink); background: var(--lodd-flate-2); }
}

/* Feltene der man skriver. Før: mørk flate med hvit tekst, altså et mørkt
   hull midt i et lyst kort. */
.loggfelt {
  border: 1px solid var(--lodd-line-2);
  background: var(--lodd-flate);
  color: var(--lodd-ink);
}
.loggfelt::placeholder { color: var(--lodd-ink-3); }

.loggskjema { border-top: 1px solid var(--lodd-line); }
.filmvurder { border-top: 1px solid var(--lodd-line); }

/* Kommentarspalten var fast 380 px. Mellom 900 og rundt 1300 px, som er
   akkurat bredden rammen har inne i skallet med begge menyene åpne, klemte
   det filmen i stedet for å gi seg selv. Nå gir spalten seg ned til 280. */
.filmkort.medlogg .filmflate {
  grid-template-columns: minmax(0, 1fr) clamp(260px, 32vw, 380px);
}

/* SMALT VINDU (Theodors skjermbilde 28. september, rammen i OS-et er rundt
   835 px). Under 900 px ble filmen og loggen stablet, men kortet beholdt
   fast høyde. Da presset raden seg sammen, loggen la seg over filmen og
   skrivefeltet havnet under kanten. To regler nå:

   1. Side om side ned til 720 px. En kvadratisk film trenger ikke mer enn
      rundt 440 px i bredden når høyden uansett er det som begrenser den.
   2. Under 720 px ruller hele kortet som én flate. Filmen får en fast
      andel av høyden, og loggen står i sin naturlige høyde under, uten
      egen rullefelt inni. Én rulling, ikke bokser i bokser. */
@media (max-width: 900px) {
  /* Den gamle 900-regelen satte høyden til auto og filmen til 50vh. Side om
     side trenger kortet fast høyde, ellers presses radene. */
  .filmkort.medlogg { height: 94vh; overflow: hidden; padding: 14px 16px 16px; }
  .filmkort.medlogg .filmflate { grid-template-columns: minmax(0, 1fr) clamp(240px, 36vw, 320px); gap: 14px; }
  .filmkort.medlogg video { max-height: calc(94vh - 250px); }
}
@media (max-width: 720px) {
  .filmkort.medlogg {
    height: auto;
    max-height: 94svh;
    overflow-y: auto;
    overscroll-behavior: contain;
  }
  .filmkort.medlogg .filmflate {
    flex: none;
    grid-template-columns: minmax(0, 1fr);
  }
  .filmkort.medlogg video { max-height: 48svh; }
  .filmkort.medlogg .filmlogg { overflow: visible; }
  .filmkort.medlogg .loggliste { flex: none; max-height: none; overflow: visible; }
}

/* Variantknappene viser bare det som skiller dem (kortVariantnavn i
   felles.js), så tre varianter får plass på én linje også i et smalt vindu.
   Blir det likevel for trangt, brytes raden, og «Neste variant» står til
   høyre på linja den havner på. */
.filmvariant { flex: none; white-space: nowrap; }
.filmneste { flex: none; white-space: nowrap; }

/* Den valgte varianten står på merkefargen, og blekket må følge med. */
.filmvariant.valgt {
  border-color: var(--lodd-brand);
  background: var(--lodd-brand);
  color: var(--lodd-brand-blekk);
}

/* ==========================================================================
   LOGGEN, BAKTEPPENE OG SKJERMENE FØLGER LODD (28. september 2026)

   Filmvinduet ble rettet først, men da var loggen tom. Med punkter i loggen
   kom resten fram: «Gjelder alle variantene», «Angre» og «Fikset» var hvit
   og lysegrønn tekst, laget for et mørkt kort. I lyst tema forsvant de.

   Bakteppene bak vinduene sto på seks ulike mørke verdier fra .6 til .95.
   Lodd har ett: --teppe, det samme i begge temaer, fordi det som ligger
   over skal løftes fram uansett. Flaten bak video og bilder er --skjerm,
   mørk i begge, så et klipp bedømmes på sin egen eksponering.
   ========================================================================== */
.ark,
.skuff,
.visningsrute,
.visbakgrunn,
.dialogbakgrunn,
.filmbakgrunn,
.klippvelger-bakgrunn,
.loggskuff-bakgrunn,
.manusvindu-bakgrunn { background: var(--lodd-teppe); }

.videoramme,
.videoramme video,
.storvideo,
.visfilm,
.visfilm video,
.variantbilde,
.annonseplakat,
.refbilde,
.refplakat,
.klippvalg-bilde,
.klippvelger-forhand video,
.filmkort video,
.rammeskisse { background: var(--lodd-skjerm); }

/* Vinduet legger seg over med den samme skyggen som andre overlegg i Lodd,
   ikke en egen, tyngre. */
.filmkort.medlogg { box-shadow: var(--lodd-over); }

.allevarianter { color: var(--lodd-ink-2); }
.allemerke { background: var(--lodd-gronn); color: var(--lodd-flate); }

.angreknapp { color: var(--lodd-ink-3); }
.fiksetknapp { border: 1px solid var(--lodd-line-2); color: var(--lodd-ink-2); }
.fiksetknapp.pa { border-color: var(--lodd-gronn); background: none; color: var(--lodd-gronn); }
@media (hover: hover) and (pointer: fine) {
  .angreknapp:hover { color: var(--lodd-ink); }
  .fiksetknapp:hover { border-color: var(--lodd-line-3); color: var(--lodd-ink); }
  .filmlukk:hover { background: var(--lodd-flate-3); }
}

/* Nummeret er en fylt prikk: merkefargen med blekket som hører til den, og
   grønn med flatefargen når punktet er fikset. */
.loggnr,
.stripepunkt { background: var(--lodd-brand); color: var(--lodd-brand-blekk); }
.loggpunkt.fikset .loggnr,
.stripepunkt.fikset,
.stripetikk.fikset { background: var(--lodd-gronn); color: var(--lodd-flate); }
.stripespor { background: var(--lodd-line-2); }

/* Lenken til klippet hadde hvit tekst på en kant i merkefargen. */
.klipplenke { background: var(--lodd-flate-2); color: var(--lodd-brand-tekst); }

/* Slett og endre er 22 og 28 px. Med mus holder det, med finger ikke. */
@media (pointer: coarse) {
  .loggslett,
  .loggendre { min-width: 44px; min-height: 44px; }
}

/* Knappeblekket i mørkt tema snus for hele .btn, og den regelen er sterkere
   enn fargen en variant setter selv. «Avvis» fikk mørk tekst på mørk rød
   tone, og blå flate når man holdt over. Variantene som har egen farge, må
   si det i mørkt tema også. */
:root[data-tema="mork"] .btn.farlig,
:root[data-tema="mork"] .btn.farlig:hover {
  color: var(--red);
  background: var(--red-bg);
}
:root[data-tema="mork"] .btn.farlig { border-color: var(--red-line); }
:root[data-tema="mork"] .btn.farlig:hover { border-color: var(--red); }

/* «Se som»-linja står på merkefargen. Der skal knappene være lyse. */
:root[data-tema="mork"] .visningslinje .btn.rolig,
:root[data-tema="mork"] .visningslinje .btn.rolig:hover { color: var(--lodd-brand-blekk); }

/* Et vindu som legger seg over, må være helt. Kortflaten i mørkt tema er
   3,5 % hvitt, laget for kort som ligger på siden. Over teppet skinte
   siden bak gjennom dialogen. */
.dialogkort { background: var(--lodd-flate); }

/* ==========================================================================
   BLEKKET PÅ MERKEFARGEN I MØRKT TEMA (28. september 2026)

   Merkefargen er #4C7DFF i mørkt tema, og hvit tekst på den gir 3,7 mot 1.
   Knappene fikk mørkt blekk 25. september, men alt det andre som er fylt
   med merkefargen (valgte chips, initialene, segmentene, egne chatbobler,
   send-knappen) sto igjen med hvitt. Målt i alle tolv fanene 28. september.
   Samme regel som Lodd: på merkefargen står --brand-blekk. */
:root[data-tema="mork"] :is(
  .handling.primar, .portalnav button[aria-current="true"],
  .segment button[aria-current="true"], .filterrad button[aria-pressed="true"],
  .initialer, .profilbilde, .minibilde, .prat-melding.min p, .innboks-teller,
  .soylevelg.pa, .filterknapp.valgt, .chip.valgt, .oppdragsfil.laster .merke,
  .ressursspill, .rollevalg.valgt, .flytknapp.valgt, .studioraad-merke,
  .chatboble.du, .soklapp.valgt, .studiochat-send
),
:root[data-tema="mork"] :is(
  .segment button[aria-current="true"], .filterrad button[aria-pressed="true"],
  .chip.valgt, .filterknapp.valgt, .rollevalg.valgt, .flytknapp.valgt,
  .soklapp.valgt, .chatboble.du
) * { color: var(--lodd-brand-blekk); }

/* Initialen på en person står på en av Lodds seks personfarger, med
   blekket som hører til, som i OS-et. */
.personmerke { color: var(--lodd-brand-blekk); }

/* Varslene i grunnlaget har faste lyse flater (#FCEFEE og #EAF7EF). I
   mørkt tema ble teksten lys på lys rosa: «Vi fikk ikke lest vinnerne» var
   ikke til å lese. Tonen følger nå temaet, som resten av statusfargene. */
.varsel.feil { background: var(--red-bg); border-color: var(--red-line); }
.varsel.ok { background: var(--green-bg); border-color: var(--green-line); }

/* Haken i et fullført steg står på grønt. */
.dflyt-steg li.gjort .dflyt-sirkel { color: var(--lodd-flate); }

/* Tabellen over konseptene stables under 700 px, men over det var
   minimumsbreddene 220 + 100 per kolonne. Med fem kolonner ble det 862 px,
   og mellom 700 og 862 gjorde tabellen hele siden bredere enn vinduet (målt
   på 835 px, rammen i OS-et). Nå passer den ned til bruddpunktet, og ruller
   i seg selv i stedet for å dra siden med seg om den likevel blir for bred. */
.vtabell { overflow-x: auto; }
.vtabell-hode, .vtabell-rad {
  grid-template-columns: minmax(150px, 2.4fr) repeat(var(--vkol), minmax(76px, 1fr)) 14px;
  column-gap: 14px;
}

/* ÉN RULLING I LOGGEN (28. september 2026)
   Spalten har tre deler: kommentarene, skjemaet for et nytt punkt og
   avgjørelsen. Lista rullet i en egen boks på minst 140 px, og hele spalten
   rullet i tillegg, så man fikk to rullefelt inni hverandre og så én
   kommentar om gangen. Nå står lista i full høyde og spalten ruller som én.
   Skjemaet står fast nederst mens man blar i kommentarene, fordi det er det
   man bruker hele tiden. Avgjørelsen ligger under og kommer når man ruller
   dit. Under 720 px er det kortet som ruller, og skjemaet står fast der. */
.filmkort.medlogg .filmlogg { overflow-y: auto; overscroll-behavior: contain; }
.filmkort.medlogg .loggliste { flex: none; min-height: 0; max-height: none; overflow: visible; }
.filmkort.medlogg .loggskjema {
  position: sticky;
  /* Spalten har 14 px luft i bunnen. Står skjemaet på 0, ruller teksten
     forbi i den stripa under det. */
  bottom: -14px;
  z-index: 1;
  margin: 0 -14px;
  padding: 12px 14px 14px;
  background: var(--lodd-flate-2);
}
/* På telefon ruller kortet, og et skjema som står fast nederst ville dekket
   tidslinja under filmen. Der står det i vanlig flyt under kommentarene. */
@media (max-width: 720px) {
  .filmkort.medlogg .filmlogg { overflow: visible; }
  .filmkort.medlogg .loggskjema { position: static; margin: 0; padding: 12px 0 0; }
}
/* Tre linjer, ikke 140 px. Grunnarket gir hvert tekstfelt minst 140 px, og
   i en spalte på 300 px tok de to feltene plassen fra kommentarene man
   leser. Tre linjer er det plassholderteksten trenger i den bredden. */
.filmkort.medlogg .loggskjema > .loggfelt,
.filmkort.medlogg .vurderfelt {
  min-height: 0;
  height: calc(3lh + 18px);
}

/* TIDSLINJA SKAL SES (28. september 2026)
   Theodor: «Linjen for tidslinjen er fortsatt ikke helt tydelig.» Sporet var
   den lyseste kanten, streken for «nå» var hvit med 85 % dekning på lys
   flate, og linjene opp til punktene var hvite. Nå: sporet i den mørkeste
   kanten, den avspilte delen fylt med merkefargen, og «nå» som en mørk strek
   i blekkfargen, så den skiller seg fra merkene for kommentarene. Blått her
   betyr noe: det er hvor langt i filmen man har kommet. */
.filmkort .stripespor { height: 4px; background: var(--lodd-line-3); }
.filmkort .stripefyll {
  position: absolute;
  left: 16px;
  bottom: 14px;
  width: 0;
  height: 4px;
  border-radius: var(--lodd-r-1);
  background: var(--lodd-brand);
  pointer-events: none;
}
.filmkort .stripehode {
  bottom: 6px;
  width: 3px;
  height: 20px;
  margin-left: -1.5px;
  background: var(--lodd-ink);
  opacity: 1;
}
/* Merkene for kommentarene får en ring i flatefargen, så de ikke flyter ut
   i den blå fyllingen. */
.filmkort .stripetikk { box-shadow: 0 0 0 2px var(--lodd-flate-2); }
.filmkort .stripelinjer line { stroke: var(--lodd-line-3); }

/* ==========================================================================
   SKRIFT, KNAPPER OG SMÅ KOMPONENTER MOT LODD (28. september 2026)

   Theodor: «tekstene, fonten og knappene her inne på video systemet følger
   ikke praksisen for resten av OS systemet.» Målingen av alle tolv fanene og
   filmvinduet ga 534 frie skriftstørrelser, 247 linjehøyder satt som
   forholdstall og 73 regler på en vekt vi ikke laster. Denne blokka tar
   skriften, knappene og de små komponentene. Farge brukt som svak flate, de
   frie radiusene og de frie fargeverdiene står igjen som egne runder i
   helhetskartet.

   Planen: docs/helhet/spes-typografi-video.md i nordiva-os.

   Tre selektorer fra planen er utelatt her, fordi klassen ikke finnes i
   admin.html eller i noen av JS-filene: .visningsrute, .prodnr og
   .flytspor-navn. De står bare i CSS, og ingenting lager dem.
   ========================================================================== */

/* 1. VINDUENE ARVER FEIL GRUNNVERDI.
   felles.js:682 fester filmruta og dialogene på document.body, ikke i
   <main class="innhold">. Da treffer de aldri grunnregelen for innholdet og
   arver redigering.css:23, altså 17px med linjehøyde 1,65 = 28,05. Denne ene
   regelen retter 20 av de 25 avvikene i vurderingsvinduet. */
.filmrute,
.dialogkort,
.klippvelger,
.manusvindu,
.loggskuff,
.refvindukort {
  font-size: var(--lodd-t-4);
  line-height: var(--lodd-t-4-h);
}

/* 2. OVERSKRIFTENE.
   h1 sto på 1.18 og ga 40,12 i stedet for 40. h2 sto ett trinn for høyt: 26
   der Lodd har 20. Bolkhodet og produktgruppa var versaler i
   grensesnittskriften, og helhetskartet er tydelig: navnet på en del av
   skjermen er en overskrift, ikke en versaletikett. Dagskillet i Drift er
   derimot et kort kategorinavn som gjentar seg nedover en liste, og det er
   nettopp margetiketten, altså mono på elleve. */
.innhold h1,
.loginkort h1 { line-height: var(--lodd-t-8-h); }

.innhold h2 {
  font-size: var(--lodd-t-6);
  line-height: var(--lodd-t-6-h);
  letter-spacing: -.005em;
}
.innhold h3 { line-height: var(--lodd-t-6-h); }

.innhold h2.bolk,
.innhold h3.prodgruppe {
  font-size: var(--lodd-t-6);
  line-height: var(--lodd-t-6-h);
  font-weight: 600;
  letter-spacing: -.005em;
  text-transform: none;
  /* Farge: en overskrift står i blekk, ikke i dempet blekk. Ingen
     mørk-tema-regel treffer disse to. */
  color: var(--lodd-ink);
}
.bolktall {
  font-family: var(--lodd-font-mono);
  font-size: var(--lodd-t-3);
  font-weight: 400;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0;
  text-transform: none;
  color: var(--lodd-ink-3);
  opacity: 1;
}

#skjerm-drift .dl-dag,
.loggskuff .dl-dag {
  font-family: var(--lodd-font-mono);
  font-size: var(--lodd-t-1);
  line-height: var(--lodd-t-1-h);
  font-weight: 500;
  letter-spacing: .06em;
  color: var(--lodd-ink-3);
}

.filmlogg h3 {
  font-size: var(--lodd-t-6);
  line-height: var(--lodd-t-6-h);
  font-weight: 600;
  letter-spacing: -.005em;
}

/* 3. KNAPPEN ER ETT PRIMITIV MED TO ROLLER.
   Den rolige knappen arvet primærknappens 15px og vekt 600, og de samme to
   knappene var målt opp på nytt fire ganger med fire sett tall: 0 18px,
   7px 14px, 12px 28px og 9px 16px. Lodd skiller dem på 13 mot 15 og 500 mot
   600, og padding kommer fra luftskalaen. De to ID-reglene er skrevet av her
   fordi de vinner over en klasse uansett rekkefølge. Gulvet 44px står. */
.btn {
  min-height: 44px;
  padding: 0 var(--lodd-s-5);
  border-radius: var(--lodd-r-2);
  font-size: var(--lodd-t-4);
  line-height: var(--lodd-t-4-h);
  font-weight: 600;
}
.btn.rolig,
.btn.liten {
  padding: 0 var(--lodd-s-4);
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
  font-weight: 500;
}
#klipp-mer-rad .btn { min-height: 44px; padding: 0 var(--lodd-s-5); }
#klipp-mer-rad .btn.rolig { padding: 0 var(--lodd-s-4); font-size: var(--lodd-t-3); }
#skjerm-klipp .kort .knapperad .btn { padding: 0 var(--lodd-s-5); font-size: var(--lodd-t-4); }
#skjerm-klipp .kort .knapperad .btn.rolig { padding: 0 var(--lodd-s-4); font-size: var(--lodd-t-3); }

/* Trykket. .985 er under en piksel på en knapp på 44, og da er det ingen
   tilbakemelding, bare en linje kode som later som. */
.btn:active { transform: scale(.97); }

/* 4. RADHANDLINGENE, 120 FOREKOMSTER.
   «Endre», «Avlys» og «Fjern» er den nakne knappen: ingen flate, ingen kant,
   blekk som demper seg. Størrelsen og vekten ble rettet i september, men
   linjehøyden 1.5 lenger opp i fila ble aldri slått, så 13px fikk 19,5. Og
   44px-gulvet lå inne i en containerspørring, så på bred skjerm var
   trykkflata under gulvet. Padding blir stående på 0 til sidene: .opphandling
   har alt gap 6px 12px, og 120 radhandlinger med 12px på hver side gjør de
   bredeste oppdragsradene 72 piksler bredere. */
.opphandling .tilbake {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  border-radius: var(--lodd-r-2);
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
  font-weight: 500;
}
/* «Se hele dommen» og «Åpne Studio» står MIDT I et avsnitt, ikke i en rad med
   handlinger: admin.js legger dem inne i <p class="ovlinje">. .merlenke er
   inline-flex fra nordiva.css:211, altså en inline-boks, og et gulv på 44px
   her løfter hele linja i avsnittet fra 22 til 44. Det ble et synlig hull på
   Oversikt. Gulvet ligger derfor i det usynlige laget lenger ned, slik Lodd
   gjør det med ikonknappen, og avsnittet beholder rytmen sin.

   Polstringen går samtidig til 0. 6px over og under er ikke et trinn i
   luftskalaen, og den alene gjorde linja 32px der resten av avsnittet står
   på 22. Tre av de fire forekomstene står inne i et avsnitt
   (admin.js:11124, :11200, :11205); den fjerde står alene etter en liste og
   blir bare tettere. */
.merlenke {
  position: relative;
  padding: 0;
  border-radius: var(--lodd-r-2);
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
  font-weight: 500;
}

/* 5. KNAPPENE I FILMVINDUET.
   Pilleformen er forbeholdt merker, ikke handlinger. Variantknappene, «Neste
   variant», «Merk som fikset» og lenken til klippet hadde alle 999px eller
   sin egen radius, og tre av dem sto under 44px. De tre minste får gulvet på
   berøring, slik lukkeknappen og slett-knappen alt gjør lenger opp i fila. */
.filmvariant,
.filmneste {
  min-height: 44px;
  padding: 0 var(--lodd-s-4);
  border-radius: var(--lodd-r-2);
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
}
.filmvariant { font-weight: 500; }
/* .filmvariant står alt på inline-flex med align-items lenger opp i fila.
   .filmneste gjør ikke det, den er en bar knapp. Med padding 0 over og under
   og et gulv på 44 måtte den få den samme sentreringen, ellers ville
   «Neste variant» lagt seg i toppen av knappen. */
.filmneste {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-weight: 600;
}
.filmlukk { border-radius: var(--lodd-r-2); }
.fiksetknapp,
.klipplenke {
  padding: 0 var(--lodd-s-4);
  border-radius: var(--lodd-r-2);
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
  font-weight: 500;
}
.angreknapp {
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
}

/* 6. CHIPS OG SEGMENTER.
   To komponenter med samme jobb og to former: .chip på Oversikt og Drift, og
   .filterrad button på Script og Vinnere. Begge blir den rolige knappen.
   Planen hadde bare .innhold her. «Ikke denne»-grunnene står i en .filterrad
   inne i manusvinduet også, og det vinduet henges på document.body
   (admin.js:7651), så .innhold nådde dem aldri. Derfor står vinduet ved
   siden av, med samme spesifisitet.
   Vekten endrer seg ikke når noe velges: det er flata som sier hva som er
   valgt, ikke tykkelsen. Farge settes ikke her, så mørk-tema-regelen på
   blekket over merkefargen lenger opp i fila fortsatt vinner. */
.chip,
.innhold .filterrad button,
.manusvindu .filterrad button {
  min-height: 44px;
  padding: 0 var(--lodd-s-4);
  border-radius: var(--lodd-r-2);
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
  font-weight: 500;
}
.innhold .filterrad button[aria-pressed="true"],
.manusvindu .filterrad button[aria-pressed="true"] { font-weight: 500; }

/* 7. STATUSLAPPEN, 56 FOREKOMSTER PÅ TO FANER.
   Den mest brukte komponenten i portalen, og gal på seks akser: størrelse,
   linjehøyde, vekt, sperring, padding og radius. Den tonede flata står igjen
   med vilje: å flytte statusfargen fra flata til blekket er en fargeendring
   på 56 elementer i to temaer, og den hører til fargerunden.

   Tre rettinger 28. september, etter gjennomlesningen:

   inline-flex slo ut text-overflow: ellipsis. Prikkene virker bare i en
   blokkbeholder; i en flex-beholder blir teksten et anonymt flex-element, og
   da blir et langt statusnavn hardklippet midt i en bokstav. To regler er
   bygget på at ellipsen virker: .voicekort-hode .lapp og .studioark-lapper
   .lapp. Derfor inline-block, som den var før, og høyden fra polstringen:
   4 + 18 + 4 pluss 1px kant i hver ende blir de 28 min-height alt ber om.

   Polstringen var 4px til sidene på et element med kant og tonet flate, så
   teksten sto nesten inntil kanten. Alle de andre små komponentene i denne
   bolken står på --lodd-s-4, og lappen gjør det nå også.

   Radiusen: fila hadde alt svart på dette på tema.css:6428 med --r-1, og den
   linja er død nå. Det er --lodd-r-3 som gjelder, fordi Lodds rolle her er
   statuspillen og ikke den lille knappen. Står det i kommentaren, snur ikke
   neste runde det igjen. */
.lapp,
.endringskort-valg .lapp {
  display: inline-block;
  min-height: 28px;
  padding: var(--lodd-s-2) var(--lodd-s-4);
  border-radius: var(--lodd-r-3);
  font-size: var(--lodd-t-2);
  line-height: var(--lodd-t-2-h);
  font-weight: 400;
  letter-spacing: 0;
}

/* 8. ETIKETTEN.
   Den riktige definisjonen har ligget i fila hele tiden, som .eyebrow, og de
   to har aldri vært koblet sammen. Etiketten over et felt er noe annet: det
   er en label, og label er i grensesnittskriften på tretten uten versaler.
   Farge settes her fordi rollen krever dempet blekk, og ingen
   mørk-tema-regel treffer .etikett. */
.etikett {
  font-family: var(--lodd-font-mono);
  font-size: var(--lodd-t-1);
  line-height: var(--lodd-t-1-h);
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--lodd-ink-3);
}
.tallboks .etikett {
  font-size: var(--lodd-t-1);
  line-height: var(--lodd-t-1-h);
  color: var(--lodd-ink-3);
}
.felt > .etikett {
  font-family: var(--lodd-font-ui);
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: var(--lodd-ink-2);
}

/* 9. HJELPETEKSTEN.
   Grunnverdien på portalens mest brukte hjelpetekst er aldri rettet: .92rem
   fra nordiva.css:434 gir 14,72, den eneste 14,72 i hele systemet. Reglene
   som setter .hint lokalt til t-3 eller t-2 blir overflødige når
   grunnverdien er riktig. Nettleserens egen small-regel ga 12,5 på de åtte
   som ikke har noen CSS-regel i det hele tatt; en ren elementselektor her
   taper mot hver eneste klasseregel og rører derfor bare dem. */
.hint {
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
}
small {
  font-size: var(--lodd-t-2);
  line-height: var(--lodd-t-2-h);
}

/* 10. VEKT 700 FINNES IKKE.
   Vi laster Geist i 400, 500 og 600, og Geist Mono i 400 og 500. Alt som står
   på 700 er syntetisk fet: nettleseren fortykker 600-kuttet selv, og det er
   en annen bokstavform enn resten av flata. Første regel tar alt ned til 600.
   Andre regel setter de som er etiketter eller maskinelle verdier til 500,
   der rollen sier det. */
.sumtall, .sprakbryter, .allemerke, .navnlapp, .annonsenavn,
.bjelletall, .oppdragsfil .merke, .tallboks .verdi, .graftall,
.filmvariant-hake, .framdrift-tall b, .voicekort-nr, .dflyt-sirkel,
.studiotall b, .manusark h1, .manusark h2, .chatalttall, .varsel b,
.tomstat b, .okotall, .loggtid, .loggtidkode, .personmerke,
.brukerchip .initialer, .kolonnetittel, .ovkode, .sprakmerke,
.endringspunkt-tid, .loggnr { font-weight: 600; }

/* .stripepunkt sto i lista over, og det var galt: punktet er mono, og vi
   laster Geist Mono i 400 og 500. 600 ville blitt syntetisk fet, altså
   nøyaktig det denne bolken er skrevet for å fjerne. Telleren i Lodd står
   på 500, og det gjør punktet nå også. */
.sumtall, .kolonnetittel, .ovkode, .sprakmerke, .stripepunkt,
.endringspunkt-tid, .loggnr, .loggtidkode, .personmerke,
.brukerchip .initialer { font-weight: 500; }

.loggtid { font-weight: 400; }
.flisnavn { font-weight: 500; }

/* .tall sto i bolken over, men den var aldri på 700: nordiva.css:346 gir den
   600. Tallcellene i en tabellkropp skal stå på 400, men hodelinja skal ikke
   deles i to. Hodet i Vinnere har «Konsept» som en ren span (600 arvet fra
   .vtabell-hode) og hver tallkolonne som span.tall, og et direkte treff slår
   alltid arvet vekt. Uten linja under sto halve hodelinja halvfet. */
.tall { font-weight: 400; }
.vtabell-hode .tall { font-weight: 600; }

/* 11. DET MASKINELLE ER MONO.
   Et tall, et klokkeslett, en tidskode, en initial: alt maskinelt er mono med
   tabular-nums, og ingenting annet er mono. Initialene sto i
   grensesnittskriften på 12,8 og 17, tidskoden i loggen på 17 som er
   løpetekstens trinn og ikke tidens. */
.brukerchip .initialer,
.personmerke,
.loggnr,
.stripepunkt,
.loggtid {
  font-family: var(--lodd-font-mono);
  font-variant-numeric: tabular-nums;
}
.brukerchip .initialer,
.personmerke {
  font-size: var(--lodd-t-2);
  line-height: var(--lodd-t-2-h);
}
.brukerchip .navn2 {
  font-size: var(--lodd-t-4);
  line-height: var(--lodd-t-4-h);
  font-weight: 500;
}
.loggnr { font-size: var(--lodd-t-1); line-height: var(--lodd-t-1-h); }
.stripepunkt { font-size: var(--lodd-t-2); }
.loggtid { font-size: var(--lodd-t-2); line-height: var(--lodd-t-2-h); }
.loggtidkode { font-size: var(--lodd-t-3); line-height: var(--lodd-t-3-h); }

/* 12. LINJEHØYDENE SOM ER FORHOLDSTALL.
   Lodd parer hver størrelse med en fast pikselhøyde. Portalen bruker 1.4,
   1.45, 1.5, 1.55, 1.6 og 1.65, og da lander nesten ingenting på rutenettet.
   Her står de som faktisk synes på skjermen i dag, gruppert etter trinnet de
   hører til. Resten av de 247 tas gruppevis etterpå. */
.flytrad-navn, .klippformat, .klipptid { line-height: var(--lodd-t-1-h); }

.dflyt-tekst small { line-height: var(--lodd-t-2-h); }

.prodtall small, .dl-liste li, .dl-tid, .vurderstatus,
.personstat { line-height: var(--lodd-t-3-h); }

.oppcelle, .oppcelle small, .bryterlinje, .prodtall span, .vnavn, .vcelle,
.dflyt-navn, .dflyt-hvem, .okotomt, .ovlinje,
.vurdertittel { line-height: var(--lodd-t-4-h); }

.flytcelle b { line-height: var(--lodd-t-6-h); }

.flistall, .prodtall b, .okotall { line-height: var(--lodd-t-7-h); }

/* Den eneste em-baserte størrelsen i tema.css, 0,875 av forelderens 15. */
.feildetalj { font-size: var(--lodd-t-3); line-height: var(--lodd-t-3-h); }

/* Varselet og den tomme tilstanden kommer rett fra markedsføringsarket, i rem
   og med 1.6. Begge er brødtekst. */
.varsel, .tomstat b, .tomstat p {
  font-size: var(--lodd-t-4);
  line-height: var(--lodd-t-4-h);
}

/* 13. FELTENE.
   Feltet står på 17px i Lodd og ikke på 15, og grunnen er skrevet ned: iOS
   Safari zoomer inn på et felt med skrift under 16px og zoomer ikke ut igjen.
   Søkefeltet i Klipp hadde riktig skrift, men var 14 piksler for høyt og i
   pilleform. Tekstfeltet i loggen hadde padding 9px 11px og radius 10, to
   tall som ikke finnes i noen skala. Et textarea med null vertikal padding
   klemmer første linje mot kanten, derfor 8px over og under. */
.innhold .sokefelt input[type=search] {
  min-height: 44px;
  padding: 0 var(--lodd-s-8);
  border-radius: var(--lodd-r-2);
  line-height: var(--lodd-t-5-h);
}
.loggfelt,
.vurderfelt {
  padding: var(--lodd-s-3) var(--lodd-s-4);
  border-radius: var(--lodd-r-2);
  font-size: var(--lodd-t-5);
  line-height: var(--lodd-t-5-h);
}

/* 14. FOKUSRINGEN.
   --lodd-fokus peker videre på --flate og --brand-rgb uten prefiks. De to er
   riktige i portalen i dag, men et system som senere flytter sine egne
   --flate ville fått en fokusring med feil indre linje uten at noe sa fra.
   Derfor er skyggen skrevet ut med de prefiksede tokenene. Mørkt tema har
   .45 i stedet for .38, og den regelen må stå etter og være sterkere. */
.btn:focus-visible,
.chip:focus-visible,
.innhold .filterrad button:focus-visible,
.manusvindu .filterrad button:focus-visible,
.opphandling .tilbake:focus-visible,
.merlenke:focus-visible,
.filmvariant:focus-visible,
.filmneste:focus-visible,
.fiksetknapp:focus-visible,
.klipplenke:focus-visible,
.angreknapp:focus-visible,
.loggtidkode:focus-visible {
  outline: none;
  border-radius: var(--lodd-r-2);
  box-shadow: 0 0 0 1px var(--lodd-flate), 0 0 0 3px rgb(var(--lodd-brand-rgb) / .38);
}
:root[data-tema="mork"] :is(
  .btn, .chip, .innhold .filterrad button, .manusvindu .filterrad button,
  .opphandling .tilbake, .merlenke,
  .filmvariant, .filmneste, .fiksetknapp, .klipplenke, .angreknapp,
  .loggtidkode
):focus-visible {
  box-shadow: 0 0 0 1px var(--lodd-flate), 0 0 0 3px rgb(var(--lodd-brand-rgb) / .45);
}

/* 15. GULVET PÅ BERØRING.
   Fire trykkflater kan ikke være 44px med mus uten å ødelegge det de står i:
   «Angre» er understreket tekst inne i en kommentar, tidskoden er en lenke i
   en linje med navn og dato, og punktet på tidslinja sitter på et spor på
   fire piksler. Lodds svar er ikonknappens: ruta beholder sin størrelse, og
   et usynlig lag rundt gir 44 på berøring. Samme mønster som .loggslett og
   .loggendre lenger opp i fila.

   Merk: planen ba om «position: relative» på .stripepunkt. Den står alt på
   «position: absolute» lenger opp, fordi den plasseres langs tidslinja.
   Relative ville tatt den ut av tidslinja. Absolute er allerede en
   inneholdende blokk for ::after, så laget virker uten den linja. */
@media (pointer: coarse) {
  .fiksetknapp,
  .klipplenke,
  .angreknapp,
  .loggtidkode { min-height: 44px; }
  /* Punktet er 24 gange 24 i grunnen, og inset -8px ga 40, ikke 44. Et fast
     lag på 44 gange 44 midtstilt treffer gulvet uansett hvilken av de tre
     størrelsene punktet står i (24, 28 i smal og 30 i bred spørring).
     ::after er ledig her; på .merlenke er den opptatt av pilen i
     nordiva.css:213, og derfor står laget der som ::before. */
  .stripepunkt::after {
    content: '';
    position: absolute;
    left: 50%;
    top: 50%;
    width: 44px;
    height: 44px;
    transform: translate(-50%, -50%);
  }
  /* Lenken er bred og lav, så laget følger bredden og gir bare høyden. */
  .merlenke::before {
    content: '';
    position: absolute;
    left: 0;
    right: 0;
    top: 50%;
    height: 44px;
    transform: translateY(-50%);
  }
}

/* ==========================================================================
   ETTERSLEPET FRA GJENNOMLESNINGEN (28. september 2026)

   Bolkene over ble lest gjennom av motlesere etter at de var skrevet. Åtte av
   funnene handlet om det samme: en regel i bolken har spesifisitet (0,1,0)
   eller (0,1,1), og en eldre regel lenger opp i fila har (0,2,0), (0,3,0)
   eller en ID, og vinner derfor uansett hvor langt ned den nye står. En
   grunnverdi som ikke når fram er ikke en grunnverdi. Her er de skrevet av,
   med den samme spesifisiteten som den som vant.

   Fire funn til ble rettet der de sto, inne i bolkene over: vekten på
   .stripepunkt, gulvet på .merlenke, laget på .stripepunkt::after og de tre
   på .lapp. De står forklart på stedet.
   ========================================================================== */

/* A. TIDSPUNKTET I LOGGSKJEMAET.
   Punkt 11 ga .loggtid 12px/18px, men den eneste .loggtid som finnes lages av
   felles.js:736, og den står inne i <div class="loggskjematopp"> fra linja
   over. tema.css:4696 er .loggskjematopp .loggtid på (0,2,0) og vant på
   størrelsen, så resultatet ble 17px tekst i en linjeboks på 18px. Nå står
   hele paret på den samme spesifisiteten. */
.loggskjematopp .loggtid {
  font-size: var(--lodd-t-2);
  line-height: var(--lodd-t-2-h);
}

/* B. OVERSKRIFTENE I VINDUENE.
   Punkt 1 satte grunnverdien på selve vinduet, men en overskrift arver ikke
   fra forelderen når den har sin egen regel: nordiva.css:58 gir h1, h2 og h3
   vekt 700 og linjehøyde 1,25. Det er nøyaktig de to tingene punkt 10 og
   punkt 12 skulle telle til null, og ingen av de fire vinduene står inne i
   .innhold, så .innhold h2 nådde dem aldri. Alle fire er vindu-titler, og
   Lodds rolle for den er t-6.

   .manusvindu-om h3 sto i lista fra motleseren og er utelatt her, av samme
   grunn som .visningsrute, .prodnr og .flytspor-navn øverst i blokka:
   tema.css:5950 finnes, men ingenting i admin.js lager en h3 der. */
.dialogkort h2,
.klippvelger-topp h2,
.loggskuff-navn h2,
.refvinduinfo h2 {
  font-size: var(--lodd-t-6);
  line-height: var(--lodd-t-6-h);
  font-weight: 600;
  letter-spacing: -.005em;
}

/* C. OVERSKRIFTEN I ANNONSEBIBLIOTEKET.
   admin.js:4617 lager h2-ene inne i #bibliotek-innhold, som ligger i
   <main class="innhold">. tema.css:2217 er en ID-regel på (1,0,1) og slår
   .innhold h2 fra punkt 2, så de sto igjen på 17px i en linjeboks på 26. */
#bibliotek-innhold h2 {
  font-size: var(--lodd-t-6);
  line-height: var(--lodd-t-6-h);
}

/* D. LINJEHØYDEN PÅ HJELPETEKSTEN.
   Punkt 9 rettet grunnstørrelsen til 13px, men elleve etterkommerregler
   setter linjehøyden som forholdstall og veier tyngre enn .hint alene. Med
   13px ga de 18,2 / 18,85 / 19,5 / 20,15 / 20,8 px i stedet for 20. Det er
   ikke sjeldne tilfeller: felles.js:1807 lager en .hint inne i .felt i hver
   eneste dialog med et felt, og admin.html har 53 .felt. Beholderne står her
   med sin egen spesifisitet, så paret 13/20 holder overalt. */
.felt .hint,
.slippflate .hint,
.oppdragskjema .hint,
.oppdragskjema .feltrad .hint,
.vseksjon-topp .hint,
.voicekort .hint,
.vurdertrad-tekst .hint,
.formatkort .formattekst .hint,
.endringskort-navn .hint,
.endringsframdrift .hint,
.testpanel-tekst .hint,
.oppdragstype .hint,
#underendring-bolk > .hint { line-height: var(--lodd-t-3-h); }

/* E. LABEL.
   Hele rollen var glemt. Tabellen i planen dekker .felt > .etikett og
   .tallboks .etikett, men ikke <label>, som er det elementet Lodd faktisk
   kaller label. nordiva.css:397 gir den 16px, linjehøyde 24px og vekt 600:
   16 finnes ikke i åttetrinnsskalaen, og 24 står på lista over linjehøyder
   som skal telles til null. Omfanget er 49 label i admin.html, 22 i admin.js
   og 3 i felles.js.

   .gruppe > legend står i den samme regelen i nordiva.css, men verken
   <legend> eller class="gruppe" finnes i portalen, så den er utelatt.

   Innloggingen er romsligere med vilje (redigering.css:72). Den regelen har
   samme spesifisitet som denne, (0,1,1), og tema.css lastes ETTER
   redigering.css, så uten linja under hadde innloggingen krympet fra 17 til
   13. Størrelsen skrives derfor tilbake her, mens vekten og blekket følger
   label-rollen som alle andre. */
.felt label {
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
  font-weight: 500;
  color: var(--lodd-ink-2);
}
.loginkort label {
  font-size: var(--lodd-t-5);
  line-height: var(--lodd-t-5-h);
}

/* F. SØKEFELTET I KLIPPVELGEREN OG LOGGSKUFFEN.
   .refsok har font: inherit og ingen egen størrelse. Før punkt 1 arvet den
   17px fra redigering.css:23, fordi klippvelgeren henges på document.body.
   Punkt 1 satte vinduet til 15px, og da falt feltet med det, under
   16px-grensen. Grunnen til at den grensen finnes står i punkt 13: iOS
   Safari zoomer inn på et felt med skrift under 16px og zoomer ikke ut
   igjen. Feltet får samme form som .loggfelt fikk der. */
.refsok {
  min-height: 44px;
  padding: 0 var(--lodd-s-4);
  border-radius: var(--lodd-r-2);
  font-size: var(--lodd-t-5);
  line-height: var(--lodd-t-5-h);
}

/* G. BRUKERRADEN I TOPPLINJA.
   Punkt 11 tok .initialer og .navn2, men ikke selve knappen. Den er en
   button, og den sto igjen i pilleform 999px på 48px høyde. Pilleformen er
   forbeholdt merker, ikke handlinger, og raden blir stående i OS: nordiva.css
   :2792 skjuler bare .topplinje .venstre og temabryteren. */
.brukerchip {
  min-height: 44px;
  padding: 0 var(--lodd-s-3) 0 var(--lodd-s-1);
  border-radius: var(--lodd-r-2);
  font-size: var(--lodd-t-4);
  line-height: var(--lodd-t-4-h);
}

/* H. KNAPPENE SOM ER MÅLT OPP PÅ NYTT I EN BEHOLDER.
   Punkt 3 skrev av de to ID-reglene, men ikke disse fem på (0,2,0). De ga
   knappen fem sett polstring som ikke finnes i luftskalaen, og én linjehøyde
   til: 15 gange 1,4 er 21. Den siste står for seg selv, fordi den er den
   lille knappen og skal ha vekt 500 og ikke 600. */
.valgrad .btn,
.visbunn .btn,
.refsett-ekstra .btn,
.manusvindu-knapper .btn {
  padding: 0 var(--lodd-s-5);
  line-height: var(--lodd-t-4-h);
}
.visredigering .btn {
  padding: 0 var(--lodd-s-4);
  font-size: var(--lodd-t-3);
  line-height: var(--lodd-t-3-h);
  font-weight: 500;
}

/* ==========================================================================
   FUNNET AV NETTLESERPRØVEN (28. september 2026)
   prove-ui.sh målte dette på fem bredder og i begge temaer. Hver regel står
   med kravet i docs/onsker.md den oppfyller.
   ========================================================================== */

/* Ø7 og Ø2. Den rolige knappen er blekk på flaten med en grå kant, som
   .knapp.rolig i Lodd. Før var teksten merkefargen, og i mørkt tema ga det
   3,8 til 4,1 i kontrast («Link til klipp», «Avbryt», filtrene i Klipp).
   Knapper på merkefargen (neste-kortet, fakturastripa, «Se som»-linja) har
   egne regler og røres ikke. */
.btn.rolig {
  background: var(--lodd-flate);
  border-color: var(--lodd-line-2);
  color: var(--lodd-ink);
}
:root[data-tema="mork"] .btn.rolig:not(.neste .btn, .stripe .btn, .visningslinje .btn),
:root[data-tema="mork"] .btn.rolig:not(.neste .btn, .stripe .btn, .visningslinje .btn):hover { color: var(--lodd-ink); }
@media (hover: hover) and (pointer: fine) {
  .btn.rolig:not(.neste .btn, .stripe .btn, .visningslinje .btn):hover {
    background: var(--lodd-flate-3);
    border-color: var(--lodd-line-3);
  }
}

/* TOPPLINJA I OS-ET (28. september 2026)
   Linja sto igjen halv i OS-et av to grunner (se nordiva.css, «TOPPLINJA
   BLIR STÅENDE, MEN BARE HALVE»): «Logg ut» her var den eneste veien ut av
   portalens egen innlogging, og «Se som» fantes ingen andre steder. Nå
   logger OS-et ut modulene selv (os.js, loggUtRammene, og lytteren i
   admin.js), og «Åpne portalen som …» står på Team. Da er linja bare en
   kopi av skallets, og den skjøv sidetittelen 100 px ned. Theodor: «"Oversikt"
   er for tett oppe mot kanten», og omvendt her. Utenfor OS-et står den. */
body.i-os .topplinje { display: none; }

/* Ø8. «Gjelder alle variantene» var en boks på 13 px med tekst på 20 px
   ved siden av. På berøring er hele raden trykkflaten, 44 px høy, og boksen
   er 20 px så den ses under fingeren. Funnet av nettleserprøven på 760 px. */
@media (pointer: coarse) {
  .allevarianter { min-height: 44px; }
  .allevarianter input { width: 20px; height: 20px; }
}

/* Ø11. Tittelen står like langt ned i OS-et som på OS-ets egne skjermer.
   Skallet sender avstanden (32 px over 900 px vindusbredde, 24 under) i
   tema-beskjeden, og tema.js legger den i --os-topp. Rammen kan ikke selv
   vite vinduets bredde. Uten beskjed: 24. Rammens egen luft over
   (.appramme.luftig, 22 px) og skjermens toppluft fra grunnarket (34 px
   under 900) er tatt bort i OS-et, så det bare er én avstand. */
body.i-os .appramme.luftig { padding-top: 0; }
body.i-os .skjerm,
body.i-os .appramme.luftig .skjerm { padding-top: var(--os-topp, var(--lodd-s-6)); }

/* Ø8. Trykkflaten til «Gjelder alle variantene» går også 12 px til venstre
   for boksen, så en finger midt på boksen treffer innenfor 44 px. */
@media (pointer: coarse) {
  .allevarianter { padding-left: var(--lodd-s-4); margin-left: calc(-1 * var(--lodd-s-4)); }
}

/* Ø2. De siste størrelsene utenfor Lodds skala, funnet av nettleserprøven
   28. september 2026. De tre første vises bare når admin er åpnet alene;
   i OS-et er topplinja og sidemenyen skjult. Verdiene er OS-ets egne:
   menyknappene 15 px som i OS-menyen, menytittelen som gruppeetikettene
   der (Geist Mono 11 px, versaler), og resten 13 px med vekt 500. */
.sidemeny button { font-size: var(--lodd-t-4); line-height: var(--lodd-t-4-h); }
.sidemeny .menytittel {
  font-family: var(--lodd-font-mono);
  font-size: var(--lodd-t-1);
  line-height: var(--lodd-t-1-h);
  font-weight: 500;
  letter-spacing: .06em;
  text-transform: uppercase;
}
/* Grunnarket har .topplinje .merkepille og .sidemeny .menytittel, så
   velgerne må være like sterke. */
.topplinje .merkepille { font-size: var(--lodd-t-3); line-height: var(--lodd-t-3-h); font-weight: 500; }
/* «1 avlyst» og de andre tekstknappene som ikke står i en rad med
   handlinger: samme mål som radhandlingene. */
.tilbake { font-size: var(--lodd-t-3); line-height: var(--lodd-t-3-h); font-weight: 500; }

/* SETT MED ØYNENE, IKKE MÅLT (28. september 2026)
   To ting i skjermbildene fra nettleserprøven som ingen krav fanget:

   Bunnlinja (firmanavn, org.nr og e-post) sto nederst i video inne i OS-et.
   OS-ets egne skjermer har ingen, og kreatørportalen skjuler sin der
   (bro.css, .panelbunn). Utenfor OS-et står den.

   Det mørke temaet hadde to blå skjær over flaten (radial-gradient). OS-ets
   mørke tema er en flat, mørk flate, og blått skal bare stå der det betyr
   noe. Nå er det Lodds papir, som i OS-et. */
body.i-os .appbunn { display: none; }
:root[data-tema="mork"] body { background: var(--lodd-paper); }

/* Tilbudet om Face ID eller Touch ID (#passkeytilbud) sto inne i OS-et.
   Der er det OS-et som logger inn, og nettleseren lar ikke en innebygd side
   lage en nøkkel. Skjules også her, fordi skallet kan bekrefte seg etter at
   tilbudet er vist. */
body.i-os #passkeytilbud { display: none; }

/* INGEN INNLOGGING NÅR OS-ET ÅPNER SIDEN (30. september 2026)
   Theodor så ventekortet, med logo i et kort som på innloggingen, i et par
   sekunder hver gang Video ble åpnet fra OS-et. os-venter.js setter
   venter-os i hodet, før første maling, og da er ventingen en tom flate i
   OS-ets bakgrunnsfarge. admin.js tar klassen bort når siden er klar, eller
   når innloggingen ikke kom, og da står kortet med en melding. */
html.venter-os #skjerm-venter .loginside { display: none; }
html.venter-os body { background: var(--lodd-paper); }

/* FANENE INNE PÅ EN SIDE (1. oktober 2026, spes-inndeling.md 3 og 9)
   Adminmenyen gikk fra tolv deler til fem. Det som ble slått sammen, står
   som faner på siden: Oppdrag, Script og Materiale i Produksjon, Folk og
   Honorar i Team. Rada tegnes av Lodds faner.js, og utseendet er Lodds
   .faner, skrevet her med Lodds tokens fordi admin.html ikke laster
   lodd.css: den ville kollidert med nordiva.css, som er låst. Endres
   .faner i lodd.css, endres dette likt.
   Rolig som Shopify og Asana: navnet i ink-3, den valgte i ink og 500 med
   en strek under, og hårstreken under hele rada. Rada ruller sidelengs på
   telefon og brekker aldri.
   nordiva.css har en eldre .faner fra adminpanelets første faner
   (.faner button med 3 px strek, 50 px høyde og brekking). Den er låst, så
   reglene her er skrevet som .faner .fane, som veier mer enn .faner
   button, og nullstiller det den satte. */
.faner {
  display: flex;
  flex-wrap: nowrap;
  align-items: stretch;
  gap: var(--lodd-s-5);
  margin: var(--lodd-s-4) 0 var(--lodd-s-6);
  border-bottom: 1px solid var(--lodd-line);
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: none;
}
.faner::-webkit-scrollbar { display: none; }
.faner:empty { display: none; }
.faner .fane {
  font: inherit;
  font-weight: 400;
  font-size: var(--lodd-t-4);
  display: inline-flex;
  align-items: center;
  gap: var(--lodd-s-2);
  flex: 0 0 auto;
  min-height: var(--lodd-menypunkt);
  padding: 0;
  margin-bottom: -1px;
  border: 0;
  border-bottom: var(--lodd-fane-strek) solid transparent;
  border-radius: 0;
  background: none;
  color: var(--lodd-ink-3);
  white-space: nowrap;
  cursor: pointer;
}
@media (hover: hover) and (pointer: fine) {
  .faner .fane:hover { color: var(--lodd-ink); }
}
.faner .fane[aria-selected="true"] { color: var(--lodd-ink); font-weight: 500; border-bottom-color: var(--lodd-ink); }
.faner .fane:focus-visible { outline: none; box-shadow: var(--lodd-fokus); border-radius: var(--lodd-r-1); }
@media (hover: none), (pointer: coarse) {
  .faner .fane { min-height: 44px; }
}
.faner .fane .tall {
  min-width: 20px;
  height: 20px;
  padding: 0 var(--lodd-s-2);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  background: var(--lodd-flate-3);
  font-family: var(--lodd-font-mono);
  font-size: var(--lodd-t-2);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  color: var(--lodd-ink-3);
}
.faner .fane .tall.venter { background: var(--lodd-amber-svak); color: var(--lodd-amber); }

/* Det som flyttet til Nordiva OS 1. oktober 2026 (Vinnere,
   Annonsebibliotek, Inspirasjon og Drift) står nederst i menyen under sin
   egen overskrift når portalen åpnes alene, så handlingene som bor her
   fortsatt kan nås. Inne i OS-et er hele menyen skjult, og flatekartet
   hopper over dem (deleneVaare i admin.js). */
.sidemeny .menytittel[data-os="flyttet"] { margin-top: var(--lodd-s-6); }

/* SIDETITTELEN I DESIGN VERSJON 2 (1. oktober 2026). Lodd fra retning B
   (nordiva-os/docs/helhet/spes-design-v2.md) setter sidetittelen i Geist
   26/600, og --h1-font kom hit med lodd-tokens.css 30. september. OS-ets
   skjermer har den, og Video inne i OS-et skal se ut som resten
   (sidetittel-kravet i prover/ui/scenarier.mjs, Ø11). Bare i admin:
   portalen til redigererne og voiceoverne endres ikke i dette steget. */
.adminramme .innhold h1 {
  font-family: var(--h1-font, var(--lodd-font-ui));
  font-weight: 600;
  font-size: var(--lodd-t-7);
  line-height: var(--lodd-t-7-h);
  letter-spacing: -.01em;
}
/* Overskriften og knappen i samme rad (Inspirasjon og de andre med
   .skjermtopp). Med tittelen på 26/32 sto den sentrert mot en knapp på 44
   og havnet 6 px for langt ned. Nå står tittelen øverst, og knappen
   trekkes opp halve forskjellen, så de to fortsatt har samme midtlinje. */
.adminramme .skjermtopp { align-items: flex-start; }
.adminramme .skjermtopp > .btn { margin-top: calc((var(--lodd-t-7-h) - var(--lodd-finger)) / 2); }

/* Klipplenken i et kommentarpunkt. Lodd fra retning B gjorde --flate-2
   lysere i mørkt (#1A2238), og den blå lenketeksten falt til 4,27 mot
   kravet 4,5 (Ø7). I mørkt står teksten i blekk; den blå kanten sier
   fortsatt at det er en lenke. */
:root[data-tema="mork"] .klipplenke { color: var(--lodd-ink); }
