/* Delt design for eksamensløsninger. Tokens speiler css/index.css (samme navy/slate,
   samme system-ui-stack) men holdt nøytralt/dokument-aktig — ikke hero-stilen fra
   hovedsiden. Brukes av alle fag/perioder via eksamen-render.js, ikke kopiert per sett. */

:root {
  --ink: #0f172a;
  --ink-soft: #334155;
  --subtext: #64748b;
  --paper: #ffffff;
  --paper-muted: #f8fafc;
  --line: #e2e8f0;
  --brand-blue: #235580;  /* dominerende blå i RubenMatte-logoen (images/logo-light.svg) */
  --underline: rgba(51, 65, 85, 0.45);  /* svarstreker: dempet slate, ikke solid --ink */
}

/* Mørkmodus -- samme palett som hovedsidens [data-theme="dark"] i css/index.css
   (--bg/--text/--border der ~ --paper/--ink/--line her), så de to delene av
   nettstedet ser like ut. Arver kun valget (samme localStorage-nøkkel, lest av
   THEME_INIT_SCRIPT i render-html.js) -- ingen egen toggle-pille her, se PLAN-k. */
[data-theme="dark"] {
  --ink: #f1f5f9;
  --ink-soft: #cbd5e1;
  --subtext: #94a3b8;
  --paper: #0f172a;
  --paper-muted: #1e293b;
  --line: #334155;
  --underline: rgba(203, 213, 225, 0.45);
}

[data-theme="dark"] .status-pill--utkast { background: #453a12; color: #fde68a; }
[data-theme="dark"] .status-pill--ferdig { background: #0f3321; color: #86efac; }

[data-theme="dark"] .answer-underline .final-answer .katex {
  background: rgba(147, 197, 253, 0.15);
}
/* Rene-tekst-svar (render-html.js sin extractBareText -- ingen ekte matte, kun
   \text{}-prosa) har ingen .katex-barn å style, men skal ha samme uthevingsfarge
   som når verdien ER matte. :not(:has(...)) hindrer dobbel bakgrunn der .katex
   fortsatt finnes (tallsvar). */
[data-theme="dark"] .answer-underline .final-answer:not(:has(.katex)) {
  background: rgba(147, 197, 253, 0.15);
}

/* KaTeX bygger feilmeldinger med en inline style="color:#cc0000" (parse-feil,
   throwOnError:false) -- CSS kan ikke style et element den ikke selv skrev inline
   style på uten !important. */
[data-theme="dark"] .katex-error { color: #ff6b6b !important; }

/* Uten dette blåser en bred display-formel ut .wrap og hele body sin bredde på
   smale skjermer (KaTeX rendrer alltid til full uttrykksbredde, uavhengig av
   containerens plass) -- symptomet var siden så ut til å "kutte av"/zoome ut på
   mobil. Skop selve formelen til å scrolle vannrett, ikke resten av siden.
   .katex-scroll settes KUN av JS (NAV_INIT_SCRIPT i render-html.js) på formler som
   faktisk overflower -- overflow-x:auto ubetinget på ALLE formler viste seg å gi
   synlige scroll-piler selv på trivielt smale formler som "K_1" i enkelte
   nettlesere/OS-oppsett (Rubens skjermbilde 2026-08-09, 10trinn-v25) siden en
   overflow:auto-boks kan få skallet sitt tegnet uansett faktisk overflow. Betinget
   klasse løser det uten å miste selve fiksen for de formlene som ER for brede. */
/* Samme problem finnes for INLINE formler: KaTeX rendrer \text{...} med &nbsp;
   mellom ordene (bevarer eksakt avstand), så en lang tekstfrase inni inline-math
   (f.eks. en hel understreket konklusjonssetning, STIL.md §10) kan aldri brytes av
   nettleseren. overflow har ingen effekt på display:inline (CSS-spec), derfor
   inline-block her -- korteste vanlige formel ser identisk ut, kun de sjeldne
   brede tilfellene (katex-scroll-klassen) får sin egen vannrette scroll i stedet
   for å sprenge siden. KUN på skjerm -- .katex-display.katex-scroll MÅ også stå
   inni denne @media screen-blokken (ikke toppnivå): en toppnivå-regel har samme
   spesifisitet (0,2,0) som @media print sitt "overflow: visible" lenger ned, og
   cascade avgjøres per-egenskap uavhengig av rekkefølge -- print-blokken taper da
   uansett hvor i filen den står. overflow-x:auto i selve PDF-en er akkurat feilen
   print-kommentarene under advarer mot (Chrome baker scroll-pil-glyfer inn i
   Page.printToPDF). vertical-align:middle ville også endret baseline på all
   inline-matte i eksporten -- ingen grunn til å røre print-utseendet for et
   mobil-skjerm-problem. */
@media screen {
  .katex-display.katex-scroll { overflow-x: auto; overflow-y: hidden; scrollbar-width: thin; }
  .katex-display.katex-scroll::-webkit-scrollbar { height: 6px; }
  .katex { display: inline-block; max-width: 100%; vertical-align: middle; scrollbar-width: thin; }
  .katex.katex-scroll { overflow-x: auto; overflow-y: hidden; }
  .katex.katex-scroll::-webkit-scrollbar { height: 6px; }
  /* KaTeX sin egen .katex-display > .katex { display: block } (0,2,0) slår regelen
     over (0,1,0) for display-formlenes indre boks, men max-width fra regelen over
     gjelder likevel (egne CSS-egenskaper, egen kamp om spesifisitet) -- nullstiller
     den indre boksen eksplisitt slik at .katex-display alltid er den ENE ytterste
     scroll-containeren når begge trenger å scrolle (JS legger uansett aldri
     katex-scroll på en formel som er barn av .katex-display, se render-html.js). */
  .katex-display .katex { max-width: none; overflow: visible; display: block; }
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, Noto Sans, Arial, sans-serif;
  line-height: 1.6;
}

.wrap {
  max-width: 720px;
  margin: 0 auto;
  padding: 40px 20px 90px;
}

/* ── Topbar/footer-chrome ── Portert fra hovedsidens index.html sin topbar/footer
   2026-08-08 (Rubens eksplisitte krav: "skal være lik navbar som på rubenmatte.no"),
   erstatter den slanke PLAN-k-varianten fra runde 2. Egen dark-mode-pille (ikke bare
   arvet fra forsiden) fordi de fleste besøkende lander direkte på en løsningsside via
   delt lenke og aldri har satt localStorage-verdien selv. Bruker eksamen.css sine
   egne tokens (--ink/--subtext/--paper/--line osv.) i stedet for hovedsidens
   --text/--bg/--border -- samme visuelle resultat, men mørkmodus følger med gratis
   via de eksisterende [data-theme="dark"]-omdefinisjonene øverst i filen, uten en
   egen andre runde @media/[data-theme]-overstyring for hver ny klasse. Brytpunkt
   860px matcher hovedsidens (`main .navlinks`/`.burger-btn`). */
/* Eksakte hex-verdier fra hovedsidens .topbar (css/index.css), ikke --paper-muted --
   hovedsiden hardkoder disse uavhengig av --bg/--muted-tokens (#0f172a i mørk modus,
   ikke --paper-muted #1e293b), avviket var synlig lysere bar i mørk modus (Rubens
   skjermbilde 2026-08-09). */
.doc-topbar {
  position: sticky;
  top: 0;
  z-index: 20;
  background: #f1f5f9;
  backdrop-filter: blur(10px);
  border-bottom: 1px solid #dde4ed;
}
[data-theme="dark"] .doc-topbar { background: #0f172a; border-bottom-color: #1e2d3d; }
.doc-topbar .wrap { max-width: 1060px; padding: 6px 20px; }
.doc-nav { display: flex; align-items: center; justify-content: space-between; gap: 14px; position: relative; }
.doc-brand { display: flex; align-items: center; text-decoration: none; }
.doc-brand img { height: 60px; width: auto; display: block; }
@media (max-width: 859px) { .doc-brand img { height: 52px; } }
@media (max-width: 420px) { .doc-brand img { height: 44px; } }
@media (max-width: 370px) { .doc-brand img { height: 38px; } }

.doc-navlinks { display: none; align-items: center; gap: 48px; }
@media (min-width: 860px) { .doc-navlinks { display: flex; } }
.doc-navitem { position: relative; }

/* Usynlig "bro" som dekker luften mellom trigger og dropdown -- se
   forklaring i css/index.css sin .navitem::after. */
.doc-navitem::after {
  content: "";
  position: absolute;
  top: 100%;
  left: -4px;
  min-width: 200px;
  height: 14px;
}

.doc-navlink-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font: inherit;
  font-size: 15px;
  color: var(--subtext);
  background: none;
  border: none;
  padding: 6px 2px;
  border-radius: 8px;
  cursor: pointer;
  transition: color 0.18s ease;
}
.doc-navlink-btn:hover,
.doc-navitem.open > .doc-navlink-btn { color: var(--ink); }

.doc-navlink-btn::after {
  content: "";
  position: absolute;
  left: 2px;
  right: 2px;
  bottom: -6px;
  height: 2px;
  background: var(--ink);
  border-radius: 999px;
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.18s ease;
}
[data-theme="dark"] .doc-navlink-btn::after { background: var(--paper); }
.doc-navlink-btn:hover::after,
.doc-navitem.open > .doc-navlink-btn::after { transform: scaleX(1); }

.doc-navlink-chev { width: 8px; height: 8px; opacity: 0.55; transition: transform 0.2s ease, opacity 0.18s ease; }
.doc-navlink-btn:hover .doc-navlink-chev,
.doc-navitem.open .doc-navlink-chev { opacity: 0.9; }
.doc-navitem.open .doc-navlink-chev { transform: rotate(180deg); }

.doc-nav-dropdown {
  position: absolute;
  top: calc(100% + 14px);
  left: -4px;
  min-width: 200px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: 16px;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06), 0 16px 32px -8px rgba(15, 23, 42, 0.16);
  padding: 8px;
  opacity: 0;
  visibility: hidden;
  transform: translateY(-6px) scale(0.98);
  transform-origin: top left;
  transition: opacity 0.16s ease, transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), visibility 0.16s ease;
  z-index: 30;
}
.doc-nav-dropdown::before {
  content: "";
  position: absolute;
  top: -5px;
  left: 20px;
  width: 10px;
  height: 10px;
  background: var(--paper);
  border-left: 1px solid var(--line);
  border-top: 1px solid var(--line);
  border-radius: 3px 0 0 0;
  transform: rotate(45deg);
}
.doc-navitem.open .doc-nav-dropdown,
.doc-navitem:hover .doc-nav-dropdown,
.doc-navitem:focus-within .doc-nav-dropdown { opacity: 1; visibility: visible; transform: translateY(0) scale(1); }

.doc-nav-dropdown a {
  position: relative;
  display: block;
  padding: 10px 14px 10px 18px;
  border-radius: 10px;
  color: var(--subtext);
  font-size: 13px;
  font-weight: 500;
  text-decoration: none;
  transition: color 0.15s ease, padding-left 0.15s ease;
}
.doc-nav-dropdown a::before {
  content: "";
  position: absolute;
  left: 5px;
  top: 50%;
  width: 3px;
  height: 0;
  background: var(--ink);
  opacity: 0.5;
  border-radius: 999px;
  transform: translateY(-50%);
  transition: height 0.15s ease;
}
.doc-nav-dropdown a:hover { color: var(--ink); padding-left: 22px; }
.doc-nav-dropdown a:hover::before { height: 60%; }
[data-theme="dark"] .doc-nav-dropdown a:hover { background: rgba(255, 255, 255, 0.06); }

/* To-lags høyreside, akkurat som hovedsiden: .doc-mobile-nav-right (språk+tema+
   burger) under 860px, .doc-navcta (språk+tema+SMS/E-post/PDF/Book) fra 860px. */
.doc-mobile-nav-right { display: flex; align-items: center; gap: 6px; }
@media (min-width: 860px) { .doc-mobile-nav-right { display: none; } }

.doc-navcta { display: none; align-items: center; gap: 8px; flex-wrap: wrap; justify-content: flex-end; flex-shrink: 0; }
.doc-navcta a.btn { padding: 8px 11px; }
@media (min-width: 860px) { .doc-navcta { display: flex; } }

/* Eksakte hex-verdier fra hovedsidens .btn (css/index.css), ikke --paper/--paper-muted
   -- hovedsiden hardkoder disse uavhengig av sine egne --bg/--muted-tokens (#fff i lys,
   ikke --muted #f6f7f9), så en token-basert tilnærming ga en synlig, om enn liten,
   fargeforskjell (Rubens skjermbilde 2026-08-09: "ulike ... farger"). */
.doc-topbar a.btn {
  border: 1px solid var(--line);
  background: #fff;
  color: var(--ink);
  padding: 10px 14px;
  border-radius: 14px;
  font-size: 13px;
  font-weight: 600;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
.doc-topbar a.btn:hover { background: #fafafa; border-color: rgba(15, 23, 42, 0.18); }
[data-theme="dark"] .doc-topbar a.btn { background: #1e293b; border-color: #334155; }
[data-theme="dark"] .doc-topbar a.btn:hover { background: #263447; border-color: #475569; }
.doc-topbar a.btn.primary { background: var(--ink); color: var(--paper); border-color: var(--ink); }
/* IKKE var(--paper)/var(--ink) her -- mørkmodus-primærknappen på hovedsiden er
   bevisst INVERTERT (lys bakgrunn/mørk tekst, skiller seg ut fra den mørke baren),
   ikke bare tokens byttet om. Testet i browser 2026-08-09: forrige var(--paper)/
   var(--ink)-versjon ga lys tekst PÅ .cta sin lyse gradient -- usynlig knapp. */
[data-theme="dark"] .doc-topbar a.btn.primary { background: #f1f5f9; color: #0f172a; border-color: #f1f5f9; }
.doc-topbar a.btn.primary:hover { opacity: 0.9; }
[data-theme="dark"] .doc-topbar a.btn.primary:hover { background: #e2e8f0; border-color: #e2e8f0; opacity: 1; }
/* Book-knappens "trykkbare" cta-look, portert fra hovedsidens .btn.primary.cta.
   Shimmer-animasjonen (::before, hover-transform) er bevisst utelatt -- statisk
   glow/gradient er nok til visuell parity, uten å duplisere hele hover-koreografien. */
.doc-topbar a.btn.primary.cta {
  background: linear-gradient(180deg, #111827, #0f172a);
  box-shadow: 0 14px 34px rgba(15, 23, 42, 0.18);
}
[data-theme="dark"] .doc-topbar a.btn.primary.cta {
  background: linear-gradient(180deg, #e2e8f0, #f1f5f9);
}
.doc-topbar a.btn.primary.cta:hover { opacity: 1; box-shadow: 0 18px 50px rgba(15, 23, 42, 0.26); }

/* Samme regel som hovedsiden (css/index.css): på midtbredde blir ikke-primære
   knapper (SMS/E-post) ikon-only i stedet for å forsvinne helt. */
.doc-navcta a.btn .btn-icon { display: none; width: 15px; height: 15px; flex: none; }
@media (min-width: 860px) and (max-width: 1099px) {
  .doc-navcta a.btn:not(.primary) { padding: 10px; width: 36px; }
  .doc-navcta a.btn:not(.primary) .btn-txt { display: none; }
  .doc-navcta a.btn:not(.primary) .btn-icon { display: block; }
}

.doc-lang-toggle { display: flex; background: var(--paper-muted); border-radius: 7px; padding: 2px; gap: 1px; flex-shrink: 0; }
.doc-lang-toggle a { font-size: 11px; font-weight: 600; padding: 3px 8px; border-radius: 5px; color: var(--subtext); text-decoration: none; }
.doc-lang-toggle a.active { background: var(--paper) !important; color: var(--ink) !important; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); }
.doc-lang-toggle a:hover:not(.active) { color: var(--ink); }
.doc-lang-toggle-desktop { display: none; }
@media (min-width: 860px) { .doc-lang-toggle-desktop { display: flex; } }

/* Tilbake-vei til hub + PDF-nedlasting -- Rubens ønske 2026-08-09, bevisst utenfor
   selve navbaren (som skal forbli strukturelt identisk med hovedsidens). PDF-knappen
   flyttet hit fra .doc-navcta/burger-meny 2026-08-09 (advisor-vurdering: den brøt
   "helt lik navbar"-kravet). */
.doc-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 1em;
}
.doc-back-link {
  font-size: 13px;
  color: var(--subtext);
  text-decoration: none;
}
.doc-back-link:hover { color: var(--ink); }
.doc-pdf-link {
  font-size: 13px;
  font-weight: 600;
  color: var(--ink);
  text-decoration: none;
  border: 1px solid var(--line);
  border-radius: 10px;
  padding: 6px 12px;
  flex-shrink: 0;
}
.doc-pdf-link:hover { background: var(--paper-muted); }

.doc-burger-btn {
  display: none;
  flex-direction: column;
  gap: 4px;
  align-items: center;
  justify-content: center;
  background: none;
  border: none;
  padding: 6px;
  cursor: pointer;
  border-radius: 8px;
  color: var(--ink);
  width: 32px;
  height: 32px;
  flex-shrink: 0;
}
.doc-burger-btn span {
  display: block;
  width: 18px;
  height: 2px;
  background: currentColor;
  border-radius: 2px;
  transition: transform 0.22s ease, opacity 0.22s ease;
}
.doc-burger-btn.open span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.doc-burger-btn.open span:nth-child(2) { opacity: 0; transform: scaleX(0); }
.doc-burger-btn.open span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }
@media (max-width: 859px) { .doc-burger-btn { display: flex; } }

.doc-burger-menu {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  background: var(--paper);
  border-bottom: 1px solid var(--line);
  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12);
  z-index: 18;
}
.doc-burger-menu.open { display: block; }
.doc-burger-link {
  display: flex;
  align-items: center;
  padding: 14px 20px;
  font-size: 15px;
  font-weight: 600;
  color: var(--ink);
  text-decoration: none;
  border-bottom: 1px solid var(--line);
}
.doc-burger-link:last-child { border-bottom: none; }
.doc-burger-link:hover { background: var(--paper-muted); }
@media (min-width: 860px) { .doc-burger-menu { display: none !important; } }

.doc-theme-pill {
  display: flex;
  border-radius: 7px;
  padding: 2px;
  gap: 1px;
  cursor: pointer;
  flex-shrink: 0;
  background: #475569;
  border: none;
  user-select: none;
}
.doc-theme-pill:focus-visible { box-shadow: 0 0 0 3px rgba(15, 23, 42, 0.15); }
[data-theme="dark"] .doc-theme-pill { background: #cbd5e1; }
.doc-theme-pill-knob,
.doc-theme-pill-icon {
  width: 26px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 5px;
  font-size: 13px;
  line-height: 1;
}
.doc-theme-pill-knob { background: #f1f5f9; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12); font-size: 0; }
[data-theme="dark"] .doc-theme-pill-knob { background: #1e293b; }

.doc-footer-site {
  border-top: 1px solid var(--line);
  margin-top: 30px;
  padding: 24px 0 30px;
}
.doc-footer-site .wrap { max-width: 1060px; padding: 0 20px; }

.doc-footer-grid { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 1.75rem; margin-bottom: 1.5rem; }
@media (max-width: 980px) { .doc-footer-grid { grid-template-columns: 1fr 1fr; gap: 1.5rem; } }

.doc-footer-col-label {
  font-size: 11px;
  font-weight: 700;
  color: var(--subtext);
  letter-spacing: 0.07em;
  text-transform: uppercase;
  margin-bottom: 10px;
}
.doc-footer-link { display: block; font-size: 13px; color: var(--subtext); padding: 3px 0; text-decoration: none; }
.doc-footer-link:hover { color: var(--ink); }
.doc-footer-contact-link { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--subtext); padding: 3px 0; text-decoration: none; }
.doc-footer-contact-link:hover { color: var(--ink); }
.doc-footer-contact-icon {
  width: 20px;
  height: 20px;
  border-radius: 6px;
  border: 1px solid var(--line);
  display: grid;
  place-items: center;
  font-size: 10px;
  flex-shrink: 0;
}
.doc-footer-book-btn {
  margin-top: 10px;
  padding: 7px 13px;
  font-size: 12px;
  display: inline-block;
  border-radius: 14px;
  background: var(--ink);
  color: var(--paper);
  text-decoration: none;
  font-weight: 600;
}
.doc-footer-copy { padding-top: 1rem; border-top: 1px solid var(--line); font-size: 12px; color: var(--subtext); }
.doc-footer-link-soon { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--subtext); padding: 3px 0; opacity: 0.7; }
.doc-footer-badge-soon { font-size: 9px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--subtext); border: 1px solid var(--line); border-radius: 999px; padding: 1px 6px; }

/* #watermark er kun ment for print (se @media print under, som posisjonerer/skjuler
   den som et usynlig full-side-vannmerke). Uten denne var den fullstendig ustylet på
   skjerm -- en SVG uten bredde/høyde faller tilbake til nettleserens standardstørrelse
   og viste en rå bit av det flislagte mønsteret øverst til venstre på hver side. */
#watermark { display: none; }

/* ── Intern forhåndsvisnings-banner (kun preview, fjernes i print) ── */
.preview-banner {
  background: var(--paper-muted);
  border: 1px solid var(--line);
  border-radius: 12px;
  padding: 10px 16px;
  font-size: 13px;
  color: var(--subtext);
  margin-bottom: 28px;
}

/* ── Dokumentheader: logo og H1 side om side i én rad (flyttet inn hit av
   eksamen-render.js), ikke logo alene over tittelen -- det ga en tom
   luft-bane mellom logo og tittel som en større logo bare ville forverret. */
.doc-header {
  display: flex;
  align-items: center;
  gap: 18px;
  margin-bottom: 1.4em;
}

.doc-header h1 { margin: 0; }

/* order+margin-left:auto (not row-reverse) so h1/status-pill keep their own relative
   order on the left, only the logo hops to the far right edge. */
.brand-logo { height: 52px; width: auto; display: block; flex-shrink: 0; order: 1; margin-left: auto; }
.brand-icon { height: 26px; width: auto; flex-shrink: 0; display: block; }

/* Logo/favicon lys/mørk-bytte -- samme .logo-light/.logo-dark-mønster som hovedsidens
   css/index.css, drevet av samme [data-theme]-attributt. .brand-logo har to <img> i
   render-html.js sin header (én lys, én mørk); footer sin .brand-icon-crop likeså
   (størrelsen på begge der styres allerede av .brand-icon-crop img over).
   `.brand-icon-crop img.logo-dark` (0,2,1) MÅ være mer spesifikk enn `.brand-icon-crop img`
   over (0,1,1) -- `img.logo-dark` alene var en cascade-order-avhengig tie som tapte for
   `.brand-icon-crop img { display: block }` og viste begge favicon-variantene samtidig i
   footeren (funnet i skjermbilde 2026-08-08: to R-logoer side om side). Samme fallgruve
   gjelder `.doc-brand img` i topbaren (PLAN-k runde 2), derfor med i samme lister. */
.brand-logo.logo-dark,
.brand-icon-crop img.logo-dark,
.doc-brand img.logo-dark { display: none; }
[data-theme="dark"] .brand-logo.logo-light,
[data-theme="dark"] .brand-icon-crop img.logo-light,
[data-theme="dark"] .doc-brand img.logo-light { display: none; }
[data-theme="dark"] .brand-logo.logo-dark,
[data-theme="dark"] .brand-icon-crop img.logo-dark,
[data-theme="dark"] .doc-brand img.logo-dark  { display: block; }

/* Samme lys/mørk-bytte for vanlige INNHOLDSBILDER (GeoGebra/Excalidraw-skjermbilder
   satt inn av render-html.js sin dark-variant-logikk) -- reglene over dekker kun
   logo/favicon-elementer, aldri #content img, så begge varianter har stått synlige
   samtidig hele tiden (Rubens skjermbilde 2026-08-08: samme graf dobbelt). */
#content img.logo-dark { display: none; }
[data-theme="dark"] #content img.logo-light { display: none; }
[data-theme="dark"] #content img.logo-dark { display: block; }

/* .doc-topbar (PLAN-k runde 2) dekker nå samme behov på skjerm -- .doc-header sin
   logo er redundant der, men beholdes i selve PDF-en som dokumentbranding (samme
   resonnement som watermarken: chrome rundt dokumentet vs. selve dokumentet). Samme
   spesifisitet (0,3,0) som lys/mørk-reglene over, plassert etter dem, for å slå
   begge uansett aktivt tema. */
@media screen {
  [data-theme="dark"] .doc-header .brand-logo.logo-dark,
  .doc-header .brand-logo.logo-light { display: none; }
}

.status-pill {
  display: inline-flex;
  align-items: center;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.02em;
  padding: 3px 9px;
  border-radius: 999px;
}

.status-pill--utkast { background: #fef3c7; color: #92400e; }
.status-pill--ferdig { background: #dcfce7; color: #166534; }

/* ── Innhold ── */
#content { opacity: 0; transition: opacity .15s; }

/* Forsøk på å dempe KaTeX-glyfer (=, ⟹ osv.) der øvre linje rendres tydelig tykkere
   enn nedre -- observert på skjerm, trolig subpixel-hinting ved ikke-heltalls
   skjerm-/nettleser-skalering snarere enn noe denne fila styrer direkte. Ingen garanti
   for at dette faktisk løser det på alle oppsett -- si fra om det ikke hjelper. */
.katex { -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; }

h1, h2, h3 { line-height: 1.3; }
h2 {
  margin-top: 2.2em;
  padding-bottom: 6px;
  border-bottom: 1px solid var(--line);
  letter-spacing: -0.01em;
  color: var(--ink);
}
h3 { margin-top: 1.8em; color: var(--ink); }
hr { border: none; border-top: 1px solid var(--line); margin: 2.5em 0; }

table { border-collapse: collapse; width: 100%; margin: 1em 0; }
th, td { border: 1px solid var(--line); padding: 6px 10px; text-align: left; }
/* .table-scroll wrapper satt inn av render-html.js -- samme rotårsak/løsning som
   .katex-display over (bred tabell blåser ut sidebredden på mobil). KUN skjerm:
   uscopet overflow-x her ville lekket inn i PDF-eksporten på nøyaktig samme måte
   som den tidligere KaTeX-print-lekkasjen (scroll-glyfer bakt inn i Page.printToPDF). */
@media screen {
  .table-scroll { overflow-x: auto; scrollbar-width: thin; margin: 1em 0; }
  .table-scroll::-webkit-scrollbar { height: 6px; }
  .table-scroll table { margin: 0; }
}

/* Scoped to #content: the header/footer logos are their own elements (.brand-logo /
   .brand-icon) and must NOT pick up this border — bare `img` would box them too. */
#content img { max-width: 100%; height: auto; border-radius: 8px; border: 1px solid var(--line); margin: 0.5em 0; }

code { background: var(--paper-muted); padding: 1px 5px; border-radius: 4px; font-size: 0.9em; }
pre { background: var(--paper-muted); padding: 12px 16px; border-radius: 8px; overflow-x: auto; }
pre code { background: none; padding: 0; }
pre.hljs { border-radius: 8px; }

/* overflow-x:auto forces the CSS overflow spec to compute overflow-y as auto too
   (a 'visible' axis can't coexist with a non-visible one) -- the exact footgun
   already documented and fixed for @media print below, but never fixed here for
   screen. Result: tall stacked fractions (dfrac) that poke a sub-pixel or two past
   their own line box register as "vertical overflow", so a real (if needless)
   vertical scrollbar with scroll-arrow glyphs shows up on nearly every formula.
   Small vertical padding absorbs that stray sub-pixel overflow so overflow-y:hidden
   doesn't visibly clip real content -- only the horizontal axis actually needs to
   scroll, for equations wider than the column. */
.katex-display { margin: 0.6em 0; padding: 4px 0; overflow-x: auto; overflow-y: hidden; }

/* Sluttsvar (STIL.md §10) = dobbel understreking. KaTeX's egen \underline gir to
   linjer som ligger for tett til å leses som "dobbel" (se PLAN.md "Funn fra steg 2"),
   så eksamen-render.js stripper begge \underline og markerer i stedet elementet med
   .final-answer — her tegner vi den doble streken med `border-bottom: 3px double`,
   som er den eneste innebygde måten å få to parallelle linjer med et ekte, synlig
   mellomrom. 3px er minimum for at `double` faktisk rendrer to streker og ikke én.
   KaTeX nullstiller font-weight til 400 på .katex (via sin `font:`-snarvei), så bold
   trenger en regel spesifikk nok til å slå .katex, ikke bare arvet <strong>. */
/* Markør-bakgrunn (tusj-i-bok-effekt) gjelder KUN tekstsvaret -- verdien slik den
   gjentas i selve konklusjonssetningen (.answer-underline, under). Et svar som står
   alene inni regnestykket (div.final-answer, lenger ned) eller som et mellomledd i en
   likningskjede (eksamen-render.js sin colorizeInnerFinalAnswers) er "regnestykket",
   ikke "teksten", og skal ikke ha farge -- kun én enkel strek, samme visuelle vekt som
   et vanlig \underline{}-mellomresultat (STIL.md §10). Bruker-ønske 2026-07-23: to
   streker + farge kun på svaret slik det står skrevet ut i ord. */
.answer-underline .final-answer .katex {
  background: rgba(35, 85, 128, 0.15);
  padding: 0.05em 0.3em;
  border-radius: 3px;
  -webkit-box-decoration-break: clone;
          box-decoration-break: clone;
}
.answer-underline .final-answer:not(:has(.katex)) {
  background: rgba(35, 85, 128, 0.15);
  padding: 0.05em 0.3em;
  border-radius: 3px;
  -webkit-box-decoration-break: clone;
          box-decoration-break: clone;
}
/* Hele konklusjonssetningen får dobbel understreking (bruker-ønske: to streker under
   HELE sluttsetningen, ikke bare verdien). Tegnet som to background-gradient-linjer på
   det inline <strong>-elementet (eksamen-render.js tagger det .answer-underline).
   Hvorfor ikke text-decoration: den hopper over KaTeX-matematikk (.katex er inline-block,
   atomær → dekorasjonen tegnes verken på den eller dens inline-block-barn), så verdien
   ble stående uten strek. En bakgrunn på <strong> tegnes derimot kontinuerlig bak BÅDE
   tekst og matematikk, og box-decoration-break:clone gjentar den på hver linje når
   setningen brytes. Posisjonert fra bunnen av <strong>-ens egen tekstboks (ikke fra
   KaTeX-boksen), så strekene ligger på samme høyde gjennom hele setningen. */
/* Lysere/gjennomsiktig strekfarge (--underline, halvtransparent slate) i stedet for
   full --ink -- to solide sorte streker tok for mye plass og kolliderte visuelt med
   formler rett over/under svaret (sett i H25 opg. 7 del 1). Fortsatt to streker, bare
   mindre dominerende. */
.answer-underline {
  background-image:
    linear-gradient(var(--underline), var(--underline)),
    linear-gradient(var(--underline), var(--underline));
  background-repeat: no-repeat;
  background-size: 100% 1px;
  background-position: 0 100%, 0 calc(100% - 3px);
  -webkit-box-decoration-break: clone;
          box-decoration-break: clone;
  padding-bottom: 3px;
}
/* Display-mode final answer (div, eget katex-display block-barn): ikke en del av en
   setning — står alene på egen linje, så en border-bottom flukter fint her. En <span>
   kan ikke gyldig wrappe et block-barn, derfor <div> (velges i eksamen-render.js).
   display:table krymper boksen til formelen og sentrerer den. Enkel strek, ikke dobbel
   -- dette ER regnestykket (aldri inni en .answer-underline-setning, se over), så
   samme "ingen farge, én linje"-regel som det kjedede mellomsvar-tilfellet i JS. */
div.final-answer {
  display: table;
  margin: 0.6em auto;
  border-bottom: 2px solid var(--underline);
  padding-bottom: 2px;
}
/* display:table gir en kort/normal formel en fin shrink-wrap-og-senter-boks (derfor
   valgt fremfor block), MEN CSS-tabellers auto-bredde-algoritme respekterer verken
   max-width eller min-width for et overflow:auto-barn -- den bruker innholdets
   fulle min-content-bredde uansett, en annen fallgruve enn (men i familie med)
   .doc-header sin flex-logo-bug tidligere i filen. En bred formel (821px målt på
   10trinn-v25) blåste dermed ut selve wrapperen, ikke bare formelen inni, selv om
   .katex-display sin egen overflow-x:auto/katex-scroll fungerte korrekt isolert
   (Rubens skjermbilde 2026-08-09). Løsning: for KUN de brede tilfellene (markert av
   samme markWideKatex() som already styler selve scrollen) byttes hele boksen til
   vanlig block -- som fint respekterer max-width -- i stedet for table. Sentrering
   går tapt for disse få, men de trenger uansett hele bredden for å ha noe å
   scrolle innenfor. */
div.final-answer:has(.katex-scroll) { display: block; max-width: 100%; }
div.final-answer .katex-display { margin: 0; }

/* favicon-icon-light.svg is now a tight square crop of just the "R" mark (viewBox
   "399.7 29 230 230") -- the crop math this rule used to need (for an older version
   that shared a 1001x264 canvas with the full wordmark) is stale and was cutting the
   top off the icon against the current file. Plain height-based sizing is enough. */
.brand-icon-crop { display: inline-flex; flex-shrink: 0; }
.brand-icon-crop img { height: 26px; width: auto; display: block; }

/* ── Footer (skjerm) ── */
.doc-footer {
  margin-top: 60px;
  padding-top: 18px;
  border-top: 1px solid var(--line);
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--subtext);
}

.doc-footer .brand-icon-crop { opacity: 0.7; }

/* Copyright-linjen gjentatt inne i #content selv (se render-html.js) -- .doc-footer
   over er en søsken-node av #content og følger ikke med hvis noen select-all/
   copy-paster selve løsningsteksten. Hensikten er KUN copy-paste-vern, ikke å vises
   fram -- usynliggjort på skjerm (fortsatt i DOM-en og markerbar/kopierbar) siden den
   rett over/under .doc-footer så ut som samme linje gjentatt (Rubens skjermbilde
   2026-08-08: "fortsatt double"). Klassisk sr-only-mønster, ikke display:none (som
   ville fjernet den fra tekstmarkering også). Kun @media screen -- printet/PDF-en
   beholder linjen synlig som før (urørt her, ikke del av dagens rapporterte problem). */
@media screen {
  .inline-copyright {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    margin: 0;
  }
}

/* ── Print ── */
/* Margins now come from pdf_export.py's CDP Page.printToPDF call (marginTop/
   Bottom/Left/Right), not this rule -- see that script's docstring for why:
   a position:fixed footer (the old .print-footer, removed below) is painted
   over the content box and Chromium never reserves real pagination space for
   it, so a page that filled all the way to the bottom margin would collide
   with it. CDP's footerTemplate reserves a genuine page-margin box instead,
   which a CSS-only @page rule can't do. Kept minimal here so it can't fight
   the CDP-supplied margins.
   Tried adding an explicit `margin: 15mm` here (2026-08-04) to close the
   native-print pagination gap vs. the CDP export -- confirmed no effect in
   either Chrome or Edge's interactive print dialog (sheet count unchanged,
   CSS verified served correctly). Chromium's interactive print UI ignores
   @page margin entirely; only its headless printToPDF path (CDP) honors it.
   Not fixable from CSS -- reverted. */
@page { size: A4; }

@media print {
  /* PDF-eksporten/print skal alltid være lys, uansett hva data-theme står på --
     en bruker som printer fra nettleseren sin i mørkmodus skal likevel få en lys
     PDF (STIL/PLAN-k). Re-erklærer :root sine lysverdier på selve [data-theme="dark"]
     -- høyere specificity enn :root, så den slår den uansett attributtverdi. */
  [data-theme="dark"] {
    --ink: #0f172a;
    --ink-soft: #334155;
    --subtext: #64748b;
    --paper: #ffffff;
    --paper-muted: #f8fafc;
    --line: #e2e8f0;
    --underline: rgba(51, 65, 85, 0.45);
  }
  [data-theme="dark"] .status-pill--utkast { background: #fef3c7; color: #92400e; }
  [data-theme="dark"] .status-pill--ferdig { background: #dcfce7; color: #166534; }
  [data-theme="dark"] .answer-underline .final-answer .katex { background: rgba(35, 85, 128, 0.15); }
  [data-theme="dark"] .answer-underline .final-answer:not(:has(.katex)) { background: rgba(35, 85, 128, 0.15); }
  [data-theme="dark"] .katex-error { color: #cc0000 !important; }
  [data-theme="dark"] .brand-logo.logo-light,
  [data-theme="dark"] .brand-icon-crop img.logo-light,
  [data-theme="dark"] .doc-brand img.logo-light { display: block; }
  [data-theme="dark"] .brand-logo.logo-dark,
  [data-theme="dark"] .brand-icon-crop img.logo-dark,
  [data-theme="dark"] .doc-brand img.logo-dark  { display: none; }
  [data-theme="dark"] #content img.logo-light { display: block; }
  [data-theme="dark"] #content img.logo-dark { display: none; }

  /* Topbar/footer-chrome (PLAN-k runde 2) er navigasjon, ikke del av selve
     løsningsdokumentet -- samme resonnement som .preview-banner rett under.
     .doc-actions (back-link + PDF-nedlastingslenke, 2026-08-09) er samme
     kategori -- en lenke til PDF-en fra INNI selve PDF-en er meningsløs. */
  .doc-topbar, .doc-footer-site, .doc-actions { display: none; }

  .preview-banner { display: none; }
  /* Rely on @page margin instead of .wrap's screen padding (40px/20px), which would
     otherwise stack on top of it and push content in twice as far. No extra bottom
     clearance needed now that the footer lives in its own reserved margin box
     (CDP footerTemplate) instead of overlaying content. */
  .wrap { padding: 0; max-width: none; }
  /* Draft-tracking chrome, useful on screen during review, noise in the deliverable. */
  .status-pill { display: none; }
  .internal-note { display: none; }
  /* .doc-footer sits once at the natural end of the content flow (screen-only
     design); on the last printed page that lands right next to .print-footer's
     fixed copy, duplicating the copyright line. .print-footer already repeats
     on every page including the last, so the flow one is pure redundancy here. */
  .doc-footer { display: none; }

  /* overflow-x:auto paired with overflow-y:visible doesn't stay "visible" — the
     CSS overflow spec force-changes a 'visible' axis to 'auto' whenever the other
     axis isn't 'visible', so tall stacked fractions silently got a real (if
     needless) vertical scrollbar, which Chrome's print-to-pdf renders as actual
     up/down scroll-arrow glyphs baked into the page. Print can't scroll anyway —
     drop both axes to visible so nothing overflow-related renders at all. */
  .katex-display { overflow: visible; break-inside: avoid-page; }
  /* Keeps a task heading from being stranded alone at the bottom of a page —
     part of the "one line spills onto the next page" complaint. Deliberately
     NOT extended to table/#content img/.final-answer: re-tested under the
     new CDP footerTemplate (2026-07-22, Runde 4) on the assumption that the
     old position:fixed-footer revert reason no longer applied -- it doesn't
     collide with the footer anymore, but a katex-display formula right
     before the table (Oppgave 7 Del 2, "65*20=1300") lost almost all its
     rendered content (only a stray underline fragment survived) on the page
     that got split, an even worse failure than the original overlap. Reverted
     -- this narrower pair (formulas + heading orphans) is still the safe
     subset. */
  h2, h3 { break-after: avoid-page; }
  /* TEST 2026-07-22 (Runde 5, ikke permanent): tighter table density to see if
     it closes the ~12pt gap that pushes Oppgave 7 Del 2's table onto page 11. */
  table { font-size: 0.92em; margin: 0.6em 0; }
  th, td { padding: 3px 8px; line-height: 1.2; }
  /* A lead-in sentence ending in ":" (tagged .lead-in by eksamen-render.js —
     this needs the paragraph's actual text, which CSS selectors can't read)
     shouldn't be left stranded alone at the bottom of a page while whatever
     it introduces gets pushed to the next one. Tried a structural version of
     this first (p:has(+ .katex-display), p:has(+ table)) but the actual
     collision found on page 8 ("Setter inn i overflateformelen:") is
     followed by three more plain paragraphs before a table, not directly by
     a katex-display or table — the text-content rule catches that case too,
     the structural one didn't. */
  .lead-in { break-after: avoid-page; }

  /* Tiled copyright watermark -- makes a partial screenshot of a solution less
     useful to redistribute. #watermark itself is built once in eksamen-render.js
     (no per-set HTML change needed) but only painted here, under @media print,
     since Chrome's printToPDF/print-to-pdf emulates print media -- so it shows up
     in every PDF export without ever appearing in the normal browser preview.
     Rendered as an inline SVG <pattern> (built in eksamen-render.js), not a CSS
     background-image: verified via direct pixel inspection of CDP-exported PDFs
     that Page.printToPDF silently drops ANY background-image (SVG or raster,
     with printBackground:true, with -webkit-print-color-adjust/print-color-adjust:
     exact) while background-color survives fine. An inline <pattern>/<image> is
     ordinary SVG content, not a CSS background, and renders correctly -- confirmed
     against the same export pipeline the logo already proves works (it paints as
     real vector paths in the exported PDF).

     Rotation lives on the SVG <pattern> itself (patternTransform, set in
     eksamen-render.js), NOT as a CSS transform on this fixed element: a CSS
     transform: rotate() on a large position:fixed element containing this
     pattern made Page.printToPDF paint every tile twice at a slight offset
     (a visible double-exposure ghost per tile) -- reproduced even in a
     minimal isolated test page, so it's the CSS-transform+fixed+print
     combination at fault, not page content. Moving the rotation inside the
     SVG's own coordinate system (same rendering path as the header logo,
     already proven clean) fixed it; inset can go back to 0 since a rotated
     pattern still fills the rect without needing the old -25% overscan. */
  #watermark {
    display: block;
    position: fixed;
    inset: 0;
    pointer-events: none;
    opacity: 0.05;
  }
  #watermark svg { width: 100%; height: 100%; display: block; }
}
