/* ═══ 0. TEMALAGRET (f.d. static/theme.css) ══════════════════════════
   2026-09-03: static/theme.css slogs in har och filen flyttades till
   docs/theme.css (raderas aldrig). Bas.html laddade forut
   theme.css → theme.js → casters.css; nu bara theme.js → casters.css.

   INGENTING ÄR OMSKRIVET. Avsnittet ar theme.css ORDAGRANT, inklistrat FORE
   allt annat i filen — exakt den plats den hade i kaskaden forut. Darmed ar
   bade ljust och morkt lage bit for bit oforandrat: casters.css avsnitt 1-18
   ligger fortfarande EFTER temalagret och vinner dar de krockar, precis som
   avsnitt 17 ("FORETRADE FRAMFOR TEMALAGRET") beskriver.

   VAD LAGRET FORTFARANDE GOR (matt 2026-09-03, computed styles i Chromium):
   av 47 dark-variabler i lagret skriver casters.css over 24 med egna varden
   (bl.a. --navy, som ar LJUS TEXT har och en MORK YTA i casters-paletten).
   23 lever vidare och anvands av mallarna: --white --border --text --ink2
   --ink3 --brand-yta --line3 --yta2 --yta6 --ton-gron2 --ton-rod --ton-gul2
   --ton-varm --ton-varm2 --txt-gron --txt-gron2 --txt-rod --txt-rod2
   --txt-orange --txt-amber --txt-amber2 --txt-bla --navy2. Dartill lever
   .temavaljare (knappen theme.js ritar), placeholder-fargerna och
   :root{--card:#fff}-skyddsnatet. Lagret ar alltsa INTE dod kod.

   NASTA STEG (inte gjort har): plocka bort de 24 overskrivna variablerna och
   de regler avsnitt 17 redan tar tillbaka. Det ar en beteendeandring och
   kraver egen matning — den har ronden flyttade bara filen.

   static/theme.js AR KVAR som egen fil: den satter data-theme i <head> fore
   forsta malningen och ritar temavaljaren. CSS kan inte gora nagot av det.
   ═════════════════════════════════════════════════════════════════════════════ */

/* theme.css — mörkt läge för Skattklart (Boss 2026-08-26: "vi måste ha ett dark mode").
 *
 * VARFÖR SÅ HÄR: sajten har ingen bas-mall — 15 mallar bär varsin kopia av samma
 * palett i ett eget :root. Den här filen skriver över paletten från ETT ställe.
 * `html[data-theme="dark"]` har specificitet (0,1,1) mot :root (0,1,0) och vinner
 * därför oavsett i vilken ordning filen laddas.
 *
 * KNUTEN: --navy används till två motsatta saker — textfärg (107 ggr) och bakgrund
 * (54 ggr, 31 unika selektorer). CSS kan inte skilja dem åt via variabeln. Därför:
 * --navy blir LJUS här (så alla 107 textställen blir läsbara), och de selektorer
 * som använder navy som BAKGRUND får en explicit mörk yta längre ner.
 * Läggs mörkt läge till på fler sidor är det den listan som ska växa.
 */

/* ── Skyddsnat for ljust lage (2026-09-02) ─────────────────────────────────
 * Tre mallar tappar ett semikolon i sin egen :root — trial.html rad 33,
 * annan-plattform.html rad 33, plattform.html rad 32 och
 * admin_plattformar.html rad 13 skriver "--red:#dc2626 --card:#fff;".
 * Uppmatt i Chrome: --card blir da ALDRIG definierad i ljust lage (tom
 * strang), sa varje background:var(--card) ar ogiltig och korten blir
 * GENOMSKINLIGA — texten hamnar pa den gra sidbakgrunden i stallet for pa
 * vitt och tappar 2 steg kontrast. Morkt lage raddas av att blocket nedan
 * definierar --card, sa buggen syns bara i ljust lage.
 * Den har raden ar ett SKYDDSNAT, inte fixen: alla 14 mallar som deklarerar
 * --card sjalva satter #fff, och deras egna :root ligger senare i kaskaden
 * med samma specificitet -> de vinner och ingenting rors. Bara de mallar
 * dar deklarationen ar trasig faller tillbaka hit. Den riktiga fixen ar
 * semikolonet i mallen. (dashboard/404/500 laddar inte den har filen.) */
:root { --card: #fff; }

html[data-theme="dark"] {
  /* Ytor: sidbakgrund mörkast, kort ett steg ljusare så de lyfter */
  --light: #0f1420;          /* sidbakgrund */
  --bg:    #0b0f18;
  --card:  #161d2c;          /* kort/paneler */
  --white: #161d2c;
  --line:  #26304a;          /* ramar */
  --border:#26304a;

  /* Text. --navy är brödtextens färg i ljust läge → måste bli ljus här. */
  --navy:  #e8edf7;
  --text:  #e8edf7;
  --ink:   #e8edf7;
  --ink2:  #aab4cc;
  --ink3:  #7a849c;
  --mut:   #9aa4bc;          /* dämpad text — mörkare än brödtext, ljusare än ram */
  --mut2:  #7a8398;

  /* Accenter: guldet bär varumärket och funkar mot mörkt. Grönt/rött lyfts
     ett par steg — originalen (#0a7c55 / #c2410c) blir sotiga mot mörk bakgrund. */
  --gold:  #f0b429;
  --gold2: #d99e1e;
  --green: #34d399;
  --red:   #fb7185;

  /* Egen variabel: den mörka ytan som ERSÄTTER navy-som-bakgrund nedan. */
  --brand-yta: #1f2a44;

  color-scheme: dark;        /* ger mörka scrollbars, formkontroller, autofyll */
}

html[data-theme="dark"] body {
  background: var(--light);
  color: var(--navy);
}

/* ── Selektorer som använder navy som BAKGRUND ──────────────────────────────
 * Utan de här blir de ljusa fläckar, eftersom --navy nu är ljus.
 * dashboard.html (6 st):
 */
html[data-theme="dark"] .sidnav a.on,
html[data-theme="dark"] .btn-navy,
html[data-theme="dark"] .kpi-kort.mork,
html[data-theme="dark"] .fchip.on,
html[data-theme="dark"] .panel-topp,
html[data-theme="dark"] .matare i {
  background: var(--brand-yta);
}
/* Dessa sätter color:#fff hårdkodat i ljust läge — det håller mot --brand-yta,
 * men .kpi-kort.mork och .matare i ärver och behöver hjälp. */
html[data-theme="dark"] .kpi-kort.mork,
html[data-theme="dark"] .kpi-kort.mork * {
  color: #e8edf7;
}

/* Hårdkodat vitt som blir bländande mot mörk bakgrund */
html[data-theme="dark"] [style*="background:#fff"] {
  background: var(--card) !important;
}

/* ── Växlingsknappen (ritas av theme.js) ─────────────────────────────────── */
.temavaljare {
  position: fixed; right: 16px; bottom: 16px; z-index: 9999;
  width: 44px; height: 44px; border-radius: 50%;
  border: 1px solid var(--line); background: var(--card); color: var(--navy);
  font-size: 20px; line-height: 1; cursor: pointer;
  box-shadow: 0 2px 10px rgba(0,0,0,.18);
  display: flex; align-items: center; justify-content: center;
  transition: transform .15s ease;
}
.temavaljare:hover { transform: scale(1.08); }
.temavaljare:focus-visible { outline: 2px solid var(--gold); outline-offset: 2px; }
@media print { .temavaljare { display: none; } }

/* ── Hårdkodade färger som går förbi paletten ───────────────────────────────
 * 38 regler i dashboard.html sätter bakgrund direkt (#fff, #eef1f7, badge-toner)
 * i stället för via var(). Variabelbytet ovan når dem inte — de måste pekas ut.
 * Grupperade efter vilken yta de ska bli, inte efter var de råkar sitta.
 */

/* Kortytor — allt som var vitt */
html[data-theme="dark"] .sidnav,
html[data-theme="dark"] .sek-topp .sek-lank,
html[data-theme="dark"] .arvaljare,
html[data-theme="dark"] .btn-outline,
html[data-theme="dark"] .btn-fara,
html[data-theme="dark"] .todo-rad,
html[data-theme="dark"] .todo-klar,
html[data-theme="dark"] .fchip,
html[data-theme="dark"] .panel-fot,
html[data-theme="dark"] .modal,
html[data-theme="dark"] .dok,
html[data-theme="dark"] select,
html[data-theme="dark"] input[type=text],
html[data-theme="dark"] input[type=number],
html[data-theme="dark"] input[type=date],
html[data-theme="dark"] textarea {
  background: var(--card);
  color: var(--navy);
  border-color: var(--line);
}

/* Dämpade ytor — det som var ljusgrått (#eef1f7, #f2f5fb, #f8f9fd, #f0f2f8) */
html[data-theme="dark"] .sidnav a .n,
html[data-theme="dark"] .todo-ikon,
html[data-theme="dark"] .badge-kat,
html[data-theme="dark"] .badge-draft,
html[data-theme="dark"] .filbild,
html[data-theme="dark"] .filpdf,
html[data-theme="dark"] .tips-kort {
  background: #1e2637;
  color: var(--mut);
}

/* Hover-toner */
html[data-theme="dark"] tbody tr:hover td,
html[data-theme="dark"] .kvitto-rad:hover { background: #1c2434; }
html[data-theme="dark"] .btn-fara:hover   { background: #3a1f1c; }
html[data-theme="dark"] .dropzon:hover,
html[data-theme="dark"] .dropzon.over,
html[data-theme="dark"] .profil-chip input:checked + span { background: #2b2417; }
html[data-theme="dark"] .sidnav a:hover   { background: #1e2637; color: var(--navy); }

/* Statusbrickor: pastellerna blir mörka toner med ljus text */
html[data-theme="dark"] .badge-signed,
html[data-theme="dark"] .badge-ok,
html[data-theme="dark"] .chip-plan  { background: #14372a; color: #6ee7b7; }
html[data-theme="dark"] .badge-ready   { background: #3a3316; color: #fcd34d; }
html[data-theme="dark"] .badge-review  { background: #17304d; color: #93c5fd; }
html[data-theme="dark"] .badge-analyzing { background: #2c2450; color: #c4b5fd; }
html[data-theme="dark"] .badge-brist,
html[data-theme="dark"] .todo-rad.rod .todo-ikon { background: #3a1f1c; color: #fca5a5; }
html[data-theme="dark"] .todo-rad.gul .todo-ikon { background: #3a3316; color: #fcd34d; }
html[data-theme="dark"] .todo-rad.info .todo-ikon { background: #17304d; color: #93c5fd; }

/* Toppnaven: vit text på mörk brand-yta — den låg ljus och gjorde texten oläslig */
html[data-theme="dark"] .toppnav { background: var(--brand-yta); }
html[data-theme="dark"] .nav-link,
html[data-theme="dark"] .nav-namn-text { color: rgba(255,255,255,.86); }
html[data-theme="dark"] .nav-link:hover { color: #fff; }

/* Sidmenyn: --mut var för mörk mot kortytan (kontrast 2.5) */
html[data-theme="dark"] .sn-txt,
html[data-theme="dark"] .sn-ikon { color: #c3cbdd; }

/* ── Rättelser efter kontrastmätning ────────────────────────────────────────
 * Mätt, inte gissat: elementen nedan hade kontrast 1.0-1.6 mot sin bakgrund.
 */

/* Toppnaven är ett BART <nav> utan klass — mina .toppnav/.nav-wrap träffade inget.
 * Den använder background:var(--navy), som nu är ljus → hela navet blev ljust. */
html[data-theme="dark"] nav { background: var(--brand-yta); }

/* ── index.html (startsidan) — navy-som-BAKGRUND + guld ─────────────────────
 * Matt 2026-09-02, headless Chrome 1440x900, bakgrunder lasta ur renderade
 * pixlar (ringmedian). index.html anvander --navy som BAKGRUND pa 11 stallen.
 * Variabeln ar LJUS har, sa de blev ljusa ytor med vit/guld text ovanpa
 * (uppmatt 1,04-1,59:1). Ytorna pekas ut explicit — mallen ror vi inte.
 */
html[data-theme="dark"] .hero {
  background: linear-gradient(160deg, var(--brand-yta) 0%, #16203a 55%, var(--brand-yta) 100%);
}
html[data-theme="dark"] .hc-total,
html[data-theme="dark"] .step::before,
html[data-theme="dark"] .wiz-header,
html[data-theme="dark"] .btn-sv,
html[data-theme="dark"] .btn-next,
html[data-theme="dark"] .plan.featured,
html[data-theme="dark"] .btn-plan:hover,
html[data-theme="dark"] footer { background: var(--brand-yta); }
html[data-theme="dark"] .plan.featured,
html[data-theme="dark"] .btn-plan:hover { border-color: var(--brand-yta); }

/* Jamforelsetabellens Skattklart-kolumn: th via --navy, td hardkodat #f0f4ff */
html[data-theme="dark"] .cmp-table th.klaro-col {
  background: var(--brand-yta); border-bottom-color: var(--brand-yta);
}
html[data-theme="dark"] .cmp-table td.klaro-col {
  background: #1a2233;
  border-left-color: var(--brand-yta); border-right-color: var(--brand-yta);
}
html[data-theme="dark"] .cmp-table tr:last-child td.klaro-col { border-bottom-color: var(--brand-yta); }
html[data-theme="dark"] .cmp-table tr:hover td.klaro-col { background: #1e2740; }

/* Hardkodade ljusa harstreck i hero-kortet (#eee / #f0f0f0) */
html[data-theme="dark"] .hc-header,
html[data-theme="dark"] .hc-row { border-bottom-color: var(--line); }

/* Guldknappar pa startsidan satter color:var(--navy) → ljus text pa guld (1,59:1).
 * Samma fix som .btn-gold pa rad 198-201, men index.html har andra klassnamn. */
html[data-theme="dark"] .nav-cta,
html[data-theme="dark"] .btn-main,
html[data-theme="dark"] .btn-plan.featured { color: #1a2744; }

/* .eyebrow morknades i mallen (guld pa vitt = 2,37:1 i ljust lage). Mot mork
 * yta gar den at andra hallet — behall guldtonen har (7,11:1 mot --card). */
html[data-theme="dark"] .eyebrow { color: var(--gold2); }

/* "–" i jamforelsetabellen: mallen bar nu #636b7a for ljust lage. */
html[data-theme="dark"] .ccross { color: #8b93a5; }

/* "★ Bast"-brickan: --gold2 mot sin egen 15%-guldsloja pa brand-yta = 4,46:1.
 * Ljusare guld tar den over kravet (uppmatt 5,66:1). */
html[data-theme="dark"] .klaro-badge { color: var(--gold); }

/* Ordmarkets "klart" bar inline color:var(--gold). .logo * ovan satter #fff —
 * sla fast guldet igen sa det inte ats av en arvsregel. */
html[data-theme="dark"] .logo [style*="color:var(--gold)"],
html[data-theme="dark"] .wm [style*="color:var(--gold)"],
html[data-theme="dark"] .nav-logo [style*="color:var(--gold)"] { color: var(--gold); }

/* Onboarding-panelen: hårdkodat #fff (låg i en mediafråga och missades i svepet) */
html[data-theme="dark"] .onboarding,
html[data-theme="dark"] .profil-chip span { background: var(--card); }
html[data-theme="dark"] .profil-chip span { border-color: var(--line); }

/* Guld bär mörk text i BÅDA lägena — ljus text på guld ger kontrast 1.6 */
html[data-theme="dark"] .btn-gold,
html[data-theme="dark"] .btn-gold * { color: #1a2744; }

/* Logotypens andra halva ärvde --navy och försvann mot mörk bakgrund */
html[data-theme="dark"] .logo, html[data-theme="dark"] .logo * { color: #fff; }

/* KPI-underrader: --mut för svag mot kortytan */
html[data-theme="dark"] .kpi-sub { color: #b3bccf; }

/* Allt som ligger PÅ guld ska ha mörk text — mätt: ljus text på guld = 1.6.
 * OBS: sätt BARA color här. Ett tidigare försök hade `background-color: inherit`
 * på [class*="gold"] och åt knapparnas guldbakgrund — reglen ska aldrig röra
 * bakgrunden, bara texten ovanpå den. */
html[data-theme="dark"] .btn-gold,
html[data-theme="dark"] .btn-gold *,
html[data-theme="dark"] .chip-plan,
html[data-theme="dark"] .chip-plan * { color: #1a2744; }
html[data-theme="dark"] .chip-plan { background: var(--gold); }

/* DEMO-brickan sätter color:var(--navy) som INLINE-stil i mallen. Inline slår
 * all extern CSS — enda vägen utan att röra mallen är !important. Används här
 * medvetet och avgränsat: bara element som har guld som inline-bakgrund. */
/* 2026-09-02: selektorn var for bred. [style*="var(--gold)"] traffade aven
 * ordmarkets <span style="color:var(--gold)">klart</span> i 17 mallar och
 * malade det #1a2744 pa navyfargad nav (uppmatt 1,04:1). Nu bara bakgrund. */
html[data-theme="dark"] [style*="background:var(--gold)"],
html[data-theme="dark"] [style*="background: var(--gold)"] { color: #1a2744 !important; }

/* ── De nya variablerna i mörkt läge ────────────────────────────────────────
 * tools/temavariabler.py bytte 200 hårdkodade färger i 15 mallar mot var().
 * Ljust läge blev pixelidentiskt (8/8 sidor verifierade) eftersom varje ny
 * variabel fick den ersatta färgen som sitt ljusa värde. Här får de mörka.
 */
html[data-theme="dark"] {
  /* ramar */
  --line2: #26304a;  --line3: #2b3552;
  /* dämpade ytor — ljusast överst, alla mörkare än --card så de träder tillbaka */
  --yta1: #141a28;  --yta2: #161d2c;  --yta3: #1e2637;  --yta4: #1a2130;
  --yta5: #1c2434;  --yta6: #171e2d;  --yta7: #1a2231;  --yta8: #181f2e;
  /* statustoner: pastellerna blir mättade mörka */
  --ton-gron: #14372a;  --ton-gron2: #143026;
  --ton-rod:  #3a1f1c;  --ton-rod2:  #331b18;
  --ton-gul:  #3a3316;  --ton-gul2:  #332d14;
  --ton-varm: #2b2417;  --ton-varm2: #2e2718;
  --ton-bla:  #17304d;  --ton-lila:  #2c2450;
}
/* Text ovanpå statustonerna — pastellerna bar mörk text i ljust läge */
html[data-theme="dark"] .badge-signed, html[data-theme="dark"] .badge-ok,
html[data-theme="dark"] [class*="gron"] { color: #6ee7b7; }
html[data-theme="dark"] .badge-brist, html[data-theme="dark"] [class*="rod"] { color: #fca5a5; }

/* Textfärgerna (116 ersättningar, andra svepet) */
html[data-theme="dark"] {
  --txt-gron: #6ee7b7;  --txt-gron2: #4ade80;
  --txt-rod:  #fca5a5;  --txt-rod2:  #f87171;
  --txt-orange: #fdba74; --txt-amber: #fcd34d;  --txt-amber2: #fde68a;
  --txt-bla: #93c5fd;
}

/* ═══════════════════════════════════════════════════════════════════════════
 * 2026-09-02 — HELA SAJTEN I MORKT LAGE (Boss: "se over dark mode generellt")
 *
 * Baslinje fore detta avsnitt, matt med kontrast.js pa 13 sidor x 2 lagen plus
 * 6 admin-sidor: 822 element under sitt AA-krav i morkt lage, 415 i ljust.
 * Fyra rotorsaker tackte praktiskt taget allt:
 *   1) --navy som BAKGRUND pa selektorer som saknades i lapplistan ovan
 *      -> ljus platta med vit text (uppmatt 1,00-1,17:1).
 *   2) hardkodade ljuslages-farger i mallarnas egna <style> (#334 #556 #667
 *      #888 #aaa #166534 #92590a ...) som var()-bytet aldrig nar.
 *   3) guldknappar med color:var(--navy) -> ljus text pa guld (1,59:1).
 *   4) ljusa ytor satta som INLINE-stil, som bara en attributselektor nar.
 *
 * SPECIFICITET: mallarnas <style> ligger EFTER denna fil i kaskaden, sa varje
 * regel har maste ha HOGRE specificitet an mallens for att vinna. Darfor star
 * hela arvskedjan med (".term .short", inte ".short") pa flera stallen.
 *
 * RADERAT I SAMMA SVEP (bevisat dott mot alla 17 mallar, se kommentarer ovan):
 *   [style*="background: #fff"] (mellanslagsvarianten skrivs aldrig),
 *   img[src*="logo"], header, .nav-wrap, .chip-demo, .steg .bock,
 *   .steg li.klar .bock. Kvar med flit: .btn-gold * (skyddar framtida barn)
 *   och dashboard-selektorerna — dashboard.html laddar inte denna fil i dag,
 *   men krock-underlaget foreslar att den ska gora det i nasta etapp.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* --navy2 anvandes i 8 gradient-/ytdeklarationer men definierades ALDRIG har
 * -> var(--navy2) foll tillbaka pa mallens ljusa varde. */
html[data-theme="dark"] { --navy2: #3b4f86; }

/* ── ROT 1: --navy som BAKGRUND, de 16 som lapplistan ovan inte tackte ──────
 * trial (.sc-btn.active .run-btn .total-box .blankett-tag), demo (.run-btn
 * .loader-step.running .paywall), plattform (.slut, ol.steg li::before),
 * annan-plattform (ol.steg li::before), ordlista (.topp), moms (.step-n),
 * receipts (.dtype-pill.active), declaration (.sign-box), login (.dev-row
 * button), admin (button.primar / .knapp.primar). */
html[data-theme="dark"] button.primar,
html[data-theme="dark"] .knapp.primar,
html[data-theme="dark"] ol.steg li::before,
html[data-theme="dark"] .sign-box,
html[data-theme="dark"] .run-btn,
html[data-theme="dark"] .loader-step.running,
html[data-theme="dark"] .dev-row button,
html[data-theme="dark"] .step-n,
html[data-theme="dark"] button.topp,
html[data-theme="dark"] .slut,
html[data-theme="dark"] .dtype-pill.active,
html[data-theme="dark"] .sc-btn.active,
html[data-theme="dark"] .total-box,
html[data-theme="dark"] .blankett-tag {
  background: var(--brand-yta);
  border-color: var(--brand-yta);
}
/* .total-box satter INGEN color -> arvde --navy som text ovanpa --navy som
 * bakgrund, alltsa exakt samma farg (1,00:1). */
html[data-theme="dark"] .total-box,
html[data-theme="dark"] .total-box * { color: #e8edf7; }
html[data-theme="dark"] .paywall {
  background: linear-gradient(135deg, var(--brand-yta) 0%, #2d3f6b 100%);
}
/* Inaktiv huvudknapp pa /demo: #9aa5be med vit text = 2,47:1 i bada lagen. */
html[data-theme="dark"] .run-btn:disabled { background: #40506f; }
/* admin_statistik bygger staplarna i ett Jinja-macro:
 * <i style="height:N%;background:var(--navy)"> — mallen ror vi inte. */
html[data-theme="dark"] [style*="background:var(--navy)"] { background: var(--brand-yta) !important; }

/* ── ROT 3: guld bar MORK text i bada lagen ────────────────────────────────
 * Listan ovan (.nav-cta/.btn-main/.btn-gold) missade sidornas huvud-CTA:
 * waitlist .btn-submit, annan-plattform .knapp, intakter .cta,
 * plattform .hero-cta, demo .step-dot.active/.paywall-btn, declaration
 * .step.active. Alla matte 1,59:1.
 * OBS: admin.css anvander .knapp till sina VITA kortknappar — den tar tillbaka
 * sin egen textfarg i sitt eget morkerblock (admin.css laddas efter denna fil). */
html[data-theme="dark"] .btn-submit,
html[data-theme="dark"] .btn-submit *,
html[data-theme="dark"] .knapp,
html[data-theme="dark"] .cta,
html[data-theme="dark"] .cta *,
html[data-theme="dark"] .hero-cta,
html[data-theme="dark"] .hero-cta *,
html[data-theme="dark"] .step-dot.active,
html[data-theme="dark"] .paywall-btn,
html[data-theme="dark"] .step.active { color: #1a2744; }
html[data-theme="dark"] .step.done { color: var(--txt-gron); }

/* ── ROT 2a: hardkodad dampad text -> --mut (#9aa4bc) ──────────────────────
 * login (#666 x3), demo (#555/#888/#aaa), ordlista (#667), waitlist (#556),
 * intakter (#667), receipts (#666/#888/#aaa), moms (#556/#889),
 * konto (#556/#667/#99a), declaration (#888 x9). */
html[data-theme="dark"] .sub,
html[data-theme="dark"] .qr-label,
html[data-theme="dark"] #qr-label,
html[data-theme="dark"] #status,
html[data-theme="dark"] .test-chip,
html[data-theme="dark"] .step-label,
html[data-theme="dark"] .test-card-desc,
html[data-theme="dark"] .divider,
html[data-theme="dark"] .demo-notice,
html[data-theme="dark"] .hint,
html[data-theme="dark"] .empty,
html[data-theme="dark"] .tag,
html[data-theme="dark"] .receipt-moms,
html[data-theme="dark"] .receipt-date,
html[data-theme="dark"] .granska-hint,
html[data-theme="dark"] .summary-lbl,
html[data-theme="dark"] #doctype-hint,
html[data-theme="dark"] .plan-free,
html[data-theme="dark"] .scard-label,
html[data-theme="dark"] .kv-block label,
html[data-theme="dark"] .sats-table th,
html[data-theme="dark"] .post-tbl th,
html[data-theme="dark"] .sok-raknare,
html[data-theme="dark"] .kalla,
html[data-theme="dark"] .kallor,
html[data-theme="dark"] .tomt-utkast,
html[data-theme="dark"] .meta,
html[data-theme="dark"] .q-hint,
html[data-theme="dark"] .q-fields .fl,
html[data-theme="dark"] .q-grupp span,
html[data-theme="dark"] .q-summa span,
html[data-theme="dark"] .q-progress span,
html[data-theme="dark"] .agent-status,
html[data-theme="dark"] .avdrag-label,
html[data-theme="dark"] .row .k,
html[data-theme="dark"] #guide-toggle-label { color: var(--mut); }

/* ── ROT 2b: brodtextsnara -> --ink2 (#aab4cc) ─────────────────────────────── */
html[data-theme="dark"] .item-info,
html[data-theme="dark"] .progress,
html[data-theme="dark"] .quota .lbl,
html[data-theme="dark"] .quota .lbl span,
html[data-theme="dark"] .term p,
html[data-theme="dark"] .upload-text,
html[data-theme="dark"] #upload-progress,
html[data-theme="dark"] .receipt-desc,
html[data-theme="dark"] .dtype-pill { color: var(--ink2); }

/* ── ROT 2c: text som ska vara BRODTEXTLJUS (matte 1,36:1) ─────────────────
 * ordlista .short (24 st) och waitlist .bullets (hela saljargumentet) samt
 * momsguidens steg — alla #334 pa kortytan. */
html[data-theme="dark"] .term .short,
html[data-theme="dark"] .bullets li,
html[data-theme="dark"] .guide-steps li,
html[data-theme="dark"] .guide-steps .step-t,
html[data-theme="dark"] .guide-steps strong { color: var(--navy); }

/* Gront som lank/knapp: #1a7f4e ar for motta mot mork yta (3,36-3,67:1). */
html[data-theme="dark"] .term .mer,
html[data-theme="dark"] .term a,
html[data-theme="dark"] main a[href^="mailto"] { color: var(--txt-gron2); }

/* ── ROT 2d: statustoner — theme.css morknade BAKGRUNDEN men mallen bar kvar
 * den morka textfargen (#166534 #92590a #78350f #7a5b12 #dc2626 #1e40af). ── */
html[data-theme="dark"] .tag-skatt,
html[data-theme="dark"] .notis,
html[data-theme="dark"] .notis-gul,
html[data-theme="dark"] .obs { color: var(--txt-amber); }
html[data-theme="dark"] .notis { border-color: #4a3d18; }
html[data-theme="dark"] .notis .kalla { color: var(--txt-amber2); border-bottom-color: var(--txt-amber2); }
html[data-theme="dark"] .tag-fri,
html[data-theme="dark"] .tag-green,
html[data-theme="dark"] .plan-badge.plan-plus,
html[data-theme="dark"] .loader-step.done { color: var(--txt-gron); }
html[data-theme="dark"] .tag-red,
html[data-theme="dark"] .btn-danger,
html[data-theme="dark"] .notis-rod { color: var(--txt-rod); }
html[data-theme="dark"] .tag-blue { background: var(--ton-bla); color: var(--txt-bla); }
html[data-theme="dark"] .kv-netto.aterfa { background: var(--ton-gron); color: var(--txt-gron); }
html[data-theme="dark"] .kv-netto.betala { background: var(--ton-rod); color: var(--txt-rod); }
html[data-theme="dark"] #form-section .badge { color: var(--txt-amber); }

/* Hero-ingress: tre mallar kor vit .7 pa navy (3,56:1), demo kor #555 (2,11:1). */
html[data-theme="dark"] .hero p { color: #c3cbdd; }
/* Sidfoten pa plattform/annan-plattform: vit .4 = 3,56:1. (index.html har
 * ingen footer .wrap — den sidan ror vi inte.) */
html[data-theme="dark"] footer .wrap { color: rgba(255,255,255,.72); }
/* Brodsmulans skiljetecken drogs ned av opacity .55 -> 2,76:1. */
html[data-theme="dark"] .smulor .sep { opacity: 1; }

/* ── ROT 4: ljusa ytor och morka texter satta som INLINE-stil ──────────────
 * Inline slar all extern CSS -> !important, avgransat till exakta literaler.
 * declaration.html ensam har 16 st background:#f8f9fc + 4 st #f4f7ff; hela
 * dokumentguiden var vita kort med nastan vit text (1,10-1,12:1). */
html[data-theme="dark"] [style*="background:#f8f9fc"] { background: var(--yta3) !important; }
html[data-theme="dark"] [style*="background:#f4f7ff"] { background: var(--yta1) !important; }
html[data-theme="dark"] [style*="background:#f0f2f8"] { background: var(--yta1) !important; }
html[data-theme="dark"] [style*="background:#f6f8ff"] { background: var(--yta2) !important; }
html[data-theme="dark"] [style*="background:#fffbeb"] { background: var(--ton-varm2) !important; }
html[data-theme="dark"] [style*="background:#e0eaff"] { background: var(--ton-bla) !important; }
html[data-theme="dark"] [style*="background:#fee2e2"] { background: var(--ton-rod) !important; }
html[data-theme="dark"] [style*="background:#dcfce7"] { background: var(--ton-gron) !important; }

html[data-theme="dark"] [style*="color:#888"],
html[data-theme="dark"] [style*="color:#889"],
html[data-theme="dark"] [style*="color:#98a"],
html[data-theme="dark"] [style*="color:#99a"],
html[data-theme="dark"] [style*="color:#999"],
html[data-theme="dark"] [style*="color:#aaa"],
html[data-theme="dark"] [style*="color:#aab"],
html[data-theme="dark"] [style*="color:#666"],
html[data-theme="dark"] [style*="color:#667"],
html[data-theme="dark"] [style*="color:#7a819a"] { color: var(--mut) !important; }
html[data-theme="dark"] [style*="color:#444"],
html[data-theme="dark"] [style*="color:#555"] { color: var(--ink2) !important; }
html[data-theme="dark"] [style*="color:#166534"],
html[data-theme="dark"] [style*="color:#1a7f4e"] { color: var(--txt-gron2) !important; }
html[data-theme="dark"] [style*="color:#92764a"] { color: var(--txt-amber) !important; }
html[data-theme="dark"] [style*="color:#1e3a8a"] { color: var(--txt-bla) !important; }
html[data-theme="dark"] [style*="color:#c2410c"] { color: var(--txt-orange) !important; }
html[data-theme="dark"] [style*="color:#991b1b"],
html[data-theme="dark"] [style*="color:#dc2626"] { color: var(--txt-rod) !important; }
/* Radera-konto-knappen bar bade color och border-color inline. */
html[data-theme="dark"] [style*="color:#b91c1c"] {
  color: var(--txt-rod) !important; border-color: #5a2a2a !important;
}

/* ── Formfalt utan type-attribut ────────────────────────────────────────────
 * Listan ovan raknar upp input[type=text|number|date]. admin_anvandare/-koder
 * har <input id="q" name="q"> UTAN type — vit ruta med ljus text, det man
 * skriver blev osynligt. :not([type]) tacker alla framtida ocksa. */
html[data-theme="dark"] input:not([type]),
html[data-theme="dark"] input[type=email],
html[data-theme="dark"] input[type=search],
html[data-theme="dark"] input[type=tel],
html[data-theme="dark"] input[type=password] {
  background: var(--card); color: var(--navy); border-color: var(--line);
}

/* ── Platshallartext (::placeholder) ───────────────────────────────────────
 * theme.css satte ALDRIG placeholder-fargen. Faltens EGEN yta blev mork
 * (blocket ovan) men texten i dem behold Chromes UA-standard #757575, som
 * uppmattes till 3,66:1 mot --card #161d2c — under kravet 4,5.
 * Uppmatt 2026-09-02 pa 10 falt: ordlista #sok, konto #epost +
 * #kod-input, waitlist #wl-name + #wl-email, trial #materialInput,
 * annan-plattform #plattform/#land/#intaktsslag/#epost.
 * --mut (#9aa4bc) ar samma dampade ton som ovrig sekundartext och ger
 * 6,55:1 mot --card. opacity:1 behovs for Firefox, som annars sanker
 * placeholderns alfa och ater tappar kontrast. Bara morkt lage rors —
 * ljust lage far samma UA-farg som forut. dashboard.html laddar inte den
 * har filen och satter redan var(--dim) sjalv. */
html[data-theme="dark"] input::placeholder,
html[data-theme="dark"] textarea::placeholder {
  color: var(--mut); opacity: 1;
}

/* ── Ljusa harstreck (#eee / #f0f0f0 / #f4f5f8) ───────────────────────────── */
html[data-theme="dark"] .q,
html[data-theme="dark"] .step,
html[data-theme="dark"] .guide-steps li,
html[data-theme="dark"] .dev-section { border-color: var(--line); }
html[data-theme="dark"] .divider::before,
html[data-theme="dark"] .divider::after { background: var(--line); }

/* ── terms.js: tva ytor som ritas av JS, inte av mallarna ──────────────────
 * (1) #skv-tip far sin stil ur en <style> som JS lagger in — id-selektorn
 *     nedan har hogre specificitet, sa inget !important behovs. Rutan lag
 *     1,24:1 mot sidan bakom och las inte som en upphojd ruta.
 * (2) #skv-mode: nar sidan saknar <nav> (bara /login) faller pillen tillbaka
 *     pa en FLYTANDE variant med inline background:#fff -> solid vit pill,
 *     18,4:1 mot mork sida. Attributselektorn [style*="background:#fff"] kan
 *     ALDRIG na den: JS satter stilen via cssText och Chrome serialiserar
 *     attributet till "background: rgb(255, 255, 255);". Sidhuvudsvarianten
 *     (rgba(255,255,255,.12), 9,79:1) ar korrekt och ror vi inte — darfor
 *     "body >", som bara traffar den flytande. */
html[data-theme="dark"] #skv-tip {
  background: var(--card);
  border: 1px solid var(--line);
  box-shadow: 0 8px 24px rgba(0,0,0,.55);
}
html[data-theme="dark"] body > #skv-mode {
  background: var(--card) !important;
  border-color: var(--line) !important;
  color: var(--ink2) !important;
}

/* ── Kryssrutan pa /intakter betydde FEL sak i morkt lage ──────────────────
 * .chk{color:#fff} med genomskinlig ruta: i ljust lage ar bocken vit pa vitt
 * = osynlig, vilket ar MENINGEN. I morkt lage stod samma vita bock pa
 * kortytan med 16,85:1 -> alla 24 rader sag BOCKADE ut fran start, medan den
 * verkligt bockade raden (vit bock pa gront) bara hade 1,90:1. */
html[data-theme="dark"] .chk { color: transparent; }
html[data-theme="dark"] .item.on .chk { color: #08301f; }

/* ── Layout, galler BADA lagen ─────────────────────────────────────────────
 * .topp ("Till toppen") pa /ordlista och .temavaljare (ritas av theme.js,
 * definierad hogst upp i den har filen) delar ankare right:16px/bottom:16px.
 * Uppmatt overlapp 44x38 px; elementFromPoint i mitten gav temavaljaren, som
 * alltsa tackte knappens hogra tredjedel. Temavaljaren ar 44 px hog -> 44+12
 * px luft flyttar knappen precis over den. Kollisionen finns i BADA lagen,
 * darfor ingen [data-theme]-prefix. */
button.topp { bottom: 72px; }

/* ── admin_plattformar.html: statusbrickor och JS-satta ytor ────────────────
 * Sidan laddar theme.css men INTE admin.css — den bar en egen, halvkonverterad
 * palett. Tonerna gar via var() och morknar korrekt, men textfargerna star kvar
 * hardkodade: .status.ny mate 2,18:1 (mork brun text pa mork brun platta).
 * .granskad/.avvisad bar dessutom ljusa pasteller rakt i mallen. */
html[data-theme="dark"] .status.ny { color: var(--txt-amber); }
html[data-theme="dark"] .status.publicerad { color: var(--txt-bla); }
html[data-theme="dark"] .status.granskad { background: var(--ton-gron); color: var(--txt-gron); }
html[data-theme="dark"] .status.avvisad { background: var(--yta3); color: var(--mut); }

/* ── Inline-stilar satta av JS (serialiserad form) ─────────────────────────
 * Attributselektorerna langre upp traffar bara inline-stilar som star skrivna
 * i mallen. Satter JS stilen via el.style.cssText eller el.style.background
 * skriver Chrome om HELA style-attributet till sin egen form —
 * "background: rgb(255, 255, 255);" — och [style*="background:#fff"] matchar
 * da inte langre. Verifierat i webblasaren. Darfor samma lappar en gang till,
 * i den serialiserade formen. Galler bl.a. terms.js flytande lages-pill och
 * momssidans #obs-notis. */
html[data-theme="dark"] [style*="background: rgb(255, 255, 255)"] { background: var(--card) !important; }
html[data-theme="dark"] [style*="background: rgb(224, 234, 255)"] { background: var(--ton-bla) !important; }
html[data-theme="dark"] [style*="background: rgb(248, 249, 252)"] { background: var(--yta3) !important; }
html[data-theme="dark"] [style*="background: rgb(244, 247, 255)"] { background: var(--yta1) !important; }
html[data-theme="dark"] [style*="color: rgb(30, 58, 138)"] { color: var(--txt-bla) !important; }


/* ═══ SLUT PA TEMALAGRET — harunder borjar casters.css egen kod ═════════════ */

/* ═══════════════════════════════════════════════════════════════════════════
   Skattklart · casters.css — ETT formspråk för hela sajten.
   Etapp 3 (AUDIT-2026-09-02.md rad 208-226). Skapad 2026-09-02.

   VAD FILEN ÄR: den gemensamma delen av templates/dashboard.html:s <style>
   ("Casters Curse", mörk), lyft ORDAGRANT ur rad 34-260, 311-337, 435-445,
   502-516 och 574-623. Komponenterna är uppmätta och verifierade i mörkt läge
   (0 brott på 22 sidor) — de ska inte "förbättras" här, bara flyttas.

   VAD FILEN INTE ÄR: den ersätter INTE theme.css. Planen skrev en gång
   "mörkt alltid" och att theme.css skulle dö. Det gäller inte längre — sajten
   är genomgången i BÅDA lägena och båda fungerar (mörkt 0 brott på 22 sidor,
   ljust 69 kvar varav 24 avsiktliga). Temaväxlaren behålls. Därför:

     :root                     = LJUST läge  (de ljusa mallarnas uppmätta palett)
     html[data-theme="dark"]   = MÖRKT läge  (Casters-paletten, ordagrant)

   Samma mönster som theme.css redan använder, och av samma skäl:
   html[data-theme="dark"] har specificitet (0,1,1) mot :root (0,1,0).
   theme.js sätter attributet i <head> före första målningen; utan JS finns
   inget attribut och sidan blir ljus — samma beteende som i dag.

   LADDNINGSORDNING — LÄS DEN HÄR INNAN DU FLYTTAR EN <link>-RAD:
     1. /static/theme.css        (temalagret för ÄNNU EJ migrerade mallar)
     2. /static/casters.css      (den här filen)
     3. {% block stilar %}       (sidegen fil, t.ex. admin.css)
   theme.css patchar 24 selektorer med prefixet html[data-theme="dark"] och
   sätter bland annat `color: var(--navy)` på fält, paneler och pillerrad. I
   casters-paletten är --navy en mörk YTA (#1b2230), inte text — den regeln
   hade alltså gjort texten osynlig. Därför ligger casters.css EFTER theme.css,
   och sista avsnittet i filen ("Företräde framför temalagret") tar tillbaka
   exakt de selektorer som krockar, med matchande specificitet. Byter någon
   ordningen måste det avsnittet ses över.

   INGEN SIDSPECIFIK CSS HÄR. Kvittolistan, KPI-korten, att göra-raderna,
   uppladdningen, detaljpanelen, kvotmätaren, diagrammen och chatten bor kvar
   i sin egen mall — de delas av en eller två sidor, inte av tjugotvå.

   INTE HELLER LYFT: `.temavaljare{display:none!important}` ur dashboard.html.
   Den raden fanns för att dashboarden var mörk alltid. Temaväxlaren behålls
   nu, och theme.css äger knappens utseende.
   ═══════════════════════════════════════════════════════════════════════════ */


/* ═══ 1. PALETT — LJUST LÄGE ════════════════════════════════════════════════
   Utgångspunkten är de ljusa mallarnas nuvarande palett, uppmätt över 22
   mallars :root: --navy #1a2744 (14 mallar), --gold #f0b429 (14), --card #fff
   (10), --line2 #dde3f0 (8), --yta1 #f0f2f8 (8), --green #0a7c55 (8),
   --line3/--border #e0e4f0 (5), --yta2 #f6f8ff (5), --ink2 #4a5068 (5).
   Casters-namnen mappas på de värdena — ingen ny färg uppfinns.

   Två avsteg, båda mätbara:
   · --faint blir #626b7a (admin.css eget --ink3) i stället för mallarnas
     #9098b0. #9098b0 ger 2,88:1 mot vitt och bär th, kolumnrubriker och
     nyckeltalsetiketter — innehåll, inte dekor. #626b7a ger 5,90:1.
   · --line2 (den STARKARE ramen) blir #c7d2e8 (mallarnas --line-strak), inte
     #dde3f0. I den mörka paletten är --line2 ett steg starkare än --line;
     #dde3f0 är ljusare än #e0e4f0 och hade vänt hierarkin. */
:root {
  /* ytor: bg2 nedsänkt < bg < panel (kort) < panel2 (upphöjt) */
  --bg:#f0f2f8; --bg2:#f6f8ff; --panel:#ffffff; --panel2:#f6f8ff;
  --line:#e0e4f0; --line2:#c7d2e8;
  /* text */
  --ink:#1a2744; --dim:#4a5068; --faint:#626b7a;
  /* accenter — guld är enda handlingsfärgen, violett är märkesfärgen */
  --gold:#f0b429; --gold2:#d99e1e; --violet:#6d28d9;
  --green:#0a7c55; --red:#dc2626; --blue:#1e40af;
  --mork-txt:#140f02;              /* texten som alltid ligger PÅ guld */

  /* ── Ytor och toner som inte går att uttrycka i tokens ovan ───────────── */
  --nav-yta:#1a2744;               /* toppnaven: solid marinblå platta */
  --nav-ink:#ffffff;               /* logotyp/ordmärke i naven */
  --nav-lank:rgba(255,255,255,.8);
  --nav-lank-hov:#ffffff;
  --nav-line:rgba(255,255,255,.14);
  --nav-sig:var(--gold);           /* mono-signaturen under ordmärket */
  --sidnav-yta:rgba(255,255,255,.9);
  --panel2-hov:#eef1f8;            /* .btn-navy:hover */
  --gold-ljus:#f7c85a;             /* .btn-gold:hover, ljusare stopp */
  --falt-yta:#ffffff;              /* formulärfältets botten */
  --rad-hover:rgba(26,39,68,.045); /* tabellradens hover */
  --overlay:rgba(10,15,30,.5);     /* modalens bakgrund */
  --markering:rgba(240,180,41,.30);/* ::selection */
  --fokus:rgba(240,180,41,.45);    /* fokusringens fyllning */
  --glod-guld:rgba(240,180,41,.10);
  --glod-violett:rgba(109,40,217,.05);
  /* ramar till statusbrickorna — samma roll som mörkt lägets ~35 %-rgba */
  --kant-gron:#a7e3c4; --kant-gul:#f5d98a; --kant-bla:#b6d4f0;
  --kant-lila:#d6c9f2; --kant-rod:#f3c2c2;

  /* ── Alias: gamla namn → ljusa motsvarigheter (rör dem inte) ───────────
     Inline style="" i markup och JS refererar --navy, --card, --mut, --mut2,
     --yta*, --ton-* och --red. Byt aldrig namn på dem. I ljust läge är --navy
     både brödtext och mörk platta — precis som i de gamla mallarna. */
  --navy:#1a2744;
  --card:#ffffff;                  /* = --panel */
  --light:#f6f8ff;                 /* hover-yta, = --panel2 */
  --mut:#4a5068;                   /* = --dim, dämpad brödtext */
  --mut2:#5f6272;                  /* mikroetiketter */
  --yta1:#f0f2f8;  --yta3:#eef1f7; --yta4:#f2f4f8; --yta5:#fafbfe;
  --yta7:#f4f7ff;  --yta8:#f0f2f8;
  --ton-bla:#dbeafe;   --ton-gron:#dcfce7;
  --ton-gul:#fef3c7;   --ton-lila:#ede9fe;
  --ton-rod2:#fee2e2;
  color-scheme:light;

  /* ── Skalor: radie, skugga, mått, typsnitt (gäller BÅDA lägena) ────────
     Etapp 3 (b): i dag finns 16 distinkta border-radius-värden i mallarna och
     --r används på EN rad. Fyra steg räcker för allt vi ritar. --r var 16px i
     dashboard.html; modalen som läste den läser nu --r-lg och behåller alltså
     exakt sina 16px. */
  --r-sm:8px; --r:12px; --r-lg:16px; --r-pill:100px;
  --skugga-kort:0 2px 8px rgba(26,39,68,.06);
  --skugga-1:0 1px 2px rgba(26,39,68,.06);
  --skugga-2:0 6px 18px -8px rgba(26,39,68,.22);
  --skugga-3:0 24px 60px -20px rgba(26,39,68,.32);
  --navh:60px;                     /* toppnavens höjd. nav, .sidnav:s top och
                                      section-ankarens scroll-margin läser ALLA
                                      den här — annars glider de isär. */
  --sans:-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
  --mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;
}


/* ═══ 2. PALETT — MÖRKT LÄGE (Casters Curse) ════════════════════════════════
   Lyft ordagrant ur templates/dashboard.html rad 38-96. ENDA ändringen är
   selektorn: dashboard.html skrev `:root, html[data-theme="dark"],
   html[data-theme="light"]` för att tvinga mörkt oavsett tema. Här styr temat,
   alltså bara html[data-theme="dark"]. */
html[data-theme="dark"] {
  /* ytor: bg2 nedsänkt < bg < panel (kort) < panel2 (upphöjt) */
  --bg:#080a0f; --bg2:#0d1017; --panel:#12161f; --panel2:#171d28;
  --line:#1f2733; --line2:#2c3745;
  /* text. --faint bär 23 mono-versala 9,5px-etiketter: th, .kpi-kort h3 och
     .kvitto-huvud. Det är kolumnrubriker och nyckeltalsetiketter — INNEHÅLL,
     inte dekor — så de lyder 4,5:1. Uppmätt (renderade pixlar): #5d6a7d gav
     3,08-3,46:1. #7d8a9d ger 5,43:1 mot tabellytan --bg2 #0d1017, 5,17:1 mot
     --panel och 4,82:1 mot kpi-gradientens ljusaste stopp --panel2 #171d28
     (värsta fallet). */
  --ink:#EEF1F6; --dim:#93A0B2; --faint:#7d8a9d;
  /* accenter — guld är enda handlingsfärgen, violett är märkesfärgen */
  --gold:#F0C558; --gold2:#C99B3E; --violet:#9E80DC;
  --green:#57C08A; --red:#E96A5E; --blue:#5EA0DE;
  --mork-txt:#140f02;              /* texten som alltid ligger PÅ guld */

  /* ── Ytor och toner som inte går att uttrycka i tokens ovan ───────────── */
  --nav-yta:rgba(8,10,15,.86);     /* blurrad, kant i kant */
  --nav-ink:var(--ink);
  --nav-lank:var(--dim);
  --nav-lank-hov:var(--ink);
  --nav-line:var(--line);
  --nav-sig:var(--violet);
  --sidnav-yta:rgba(8,10,15,.82);
  --panel2-hov:#1e2634;
  --gold-ljus:#F6D278;
  --falt-yta:var(--bg2);
  --rad-hover:rgba(240,197,88,.06);
  --overlay:rgba(0,0,0,.7);
  --markering:rgba(240,197,88,.28);
  --fokus:rgba(240,197,88,.5);
  --glod-guld:rgba(240,197,88,.09);
  --glod-violett:rgba(158,128,220,.08);
  --kant-gron:rgba(87,192,138,.35); --kant-gul:rgba(240,197,88,.3);
  --kant-bla:rgba(94,160,222,.35);  --kant-lila:rgba(158,128,220,.35);
  --kant-rod:rgba(233,106,94,.35);

  /* ── Alias: gamla namn → mörka motsvarigheter (rör dem inte) ───────────── */
  --navy:#1b2230;                  /* YTA. Bär vit text, och guld bär den. */
  --card:#12161f;                  /* = --panel */
  --light:#171d28;                 /* hover-yta, = --panel2 */
  --mut:#93A0B2;                   /* = --dim, dämpad brödtext */
  --mut2:#8592A6;                  /* mikroetiketter, ljusare än --faint */
  --yta1:#0d1017;  --yta3:#171d28; --yta4:#1a2029; --yta5:#171d28;
  --yta7:#1b2230;  --yta8:#0d1017;
  --ton-bla:rgba(94,160,222,.14);  --ton-gron:rgba(87,192,138,.14);
  --ton-gul:rgba(240,197,88,.13);  --ton-lila:rgba(158,128,220,.15);
  --ton-rod2:rgba(233,106,94,.14);
  color-scheme:dark;               /* select-popup, scrollbar och autofyll mörka */

  /* Kortet är platt i mörkt läge: djup görs med ytfärg, inte skugga. */
  --skugga-kort:none;
  --skugga-1:0 2px 6px rgba(0,0,0,.4);
  --skugga-2:0 6px 18px -8px rgba(0,0,0,.55);
  --skugga-3:0 24px 60px -20px rgba(0,0,0,.8);
}


/* ═══ 3. GRUND ══════════════════════════════════════════════════════════════ */
* { box-sizing:border-box; margin:0; padding:0; }
/* clip, inte hidden: hidden gör html/body till scroll-container och då slutar
   position:sticky fungera (uppmätt: nav top -900 vid scrollY 900). clip klipper
   likadant men behåller stickyn — och pillerraden ÄR den klistrade raden. */
html, body { overflow-x:clip; }
html { scroll-behavior:smooth; -webkit-text-size-adjust:100%; }

/* Två nästan osynliga glow:ar — guld uppe till höger, violett uppe till
   vänster. De ska ANAS, inte synas. */
body {
  font-family:var(--sans); background:var(--bg); color:var(--ink);
  min-height:100vh; line-height:1.5; letter-spacing:-.01em;
  background-image:
    radial-gradient(80% 55% at 88% -12%,var(--glod-guld),transparent 55%),
    radial-gradient(60% 45% at 0% 2%,var(--glod-violett),transparent 55%);
  background-attachment:fixed;
}
::selection { background:var(--markering); }


/* ═══ 4. TOPPNAV ════════════════════════════════════════════════════════════
   Blurrad, kant i kant, hårlinje nedåt. Logotypens guldplatta (.lm) MÅSTE
   förbli guld — SVG-skölden i den har hårdkodat fill="#1a2744". */
nav { background:var(--nav-yta); backdrop-filter:blur(14px);
      border-bottom:1px solid var(--nav-line); padding:0 24px; display:flex;
      align-items:center; justify-content:space-between; height:var(--navh);
      position:sticky; top:0; z-index:60; }
.nav-logo { display:inline-flex; align-items:center; gap:9px; font-size:19px;
            font-weight:700; color:var(--nav-ink); letter-spacing:-.02em; text-decoration:none; }
.nav-logo .lm { width:28px; height:28px; background:var(--gold); color:var(--mork-txt);
                border-radius:var(--r-sm); display:flex; align-items:center; justify-content:center;
                font-weight:900; font-size:16px; flex-shrink:0;
                box-shadow:0 6px 18px -8px rgba(240,197,88,.7); }
.nav-right { display:flex; align-items:center; gap:16px; }
.nav-link { color:var(--nav-lank); text-decoration:none; font-size:13.5px; font-weight:600;
            white-space:nowrap; transition:color .16s; }
.nav-link:hover { color:var(--nav-lank-hov); }
/* PLUS/DEMO-bricka. DEMO har inline background:var(--gold);color:var(--navy). */
.chip-plan { background:var(--ton-gron); color:var(--green);
             border:1px solid var(--kant-gron); font-family:var(--mono);
             font-size:9.5px; font-weight:700; letter-spacing:.1em; text-transform:uppercase;
             padding:3px 10px; border-radius:20px; }


/* ═══ 5. MÄRKESRAD ══════════════════════════════════════════════════════════
   Förlagans .brand/.mark/.wm, inpassad i den 60px höga naven: sigillet 34px
   i stället för 46, ordmärket på en rad med mono-signaturen under. */
.brand { display:flex; align-items:center; justify-content:space-between;
         gap:16px; width:100%; min-width:0; }
.mark { display:flex; align-items:center; gap:11px; text-decoration:none;
        color:var(--nav-ink); min-width:0; }
.sigil { display:flex; align-items:center; justify-content:center; flex-shrink:0; }
/* Guldplattan är Skattklarts eget märke och stannar guld — men får förlagans
   mått och radie. Regeln ligger EFTER .nav-logo .lm ovan och vinner på ordning. */
.nav-logo .sigil.lm { width:34px; height:34px; border-radius:10px;
                      box-shadow:0 8px 22px -10px rgba(240,197,88,.65); }
.wm { display:block; min-width:0; }
.wm b { display:block; font-size:18px; font-weight:700; letter-spacing:-.02em;
        line-height:1; color:var(--nav-ink); }
.wm small { display:block; margin-top:4px; font-family:var(--mono); font-size:8.5px;
            letter-spacing:.3em; text-transform:uppercase; color:var(--nav-sig); }
.brandmeta { display:flex; align-items:center; justify-content:flex-end;
             gap:15px; min-width:0; }
.pill { flex-shrink:0; }


/* ═══ 6. LAYOUT ═════════════════════════════════════════════════════════════
   Sidomenyn har flyttat upp i toppen → EN kolumn, 1080px som förlagan.
   .wrap > *{min-width:0} måste vara kvar: utan den sätter pillerradens
   max-content kolumnbredden och hela sidan blir bredare än skärmen. */
.wrap { max-width:1080px; margin:0 auto; padding:22px 18px 90px;
        display:grid; grid-template-columns:1fr; gap:0; align-items:start; }
.wrap > * { min-width:0; }


/* ═══ 7. PILLERRADEN (.sidnav) ══════════════════════════════════════════════
   Samma element i samma ordning som förut (scrollspy mappar index mot
   sektionerna), men klistrad under toppnaven, blurrad och kant i kant.
   UPPMÄTT 2026-09-02 (1238x900): raden fick bara .wrap:s innehållsbredd
   (1044 px) fast naven är 1238 — nio piller kräver 1126 px, så '⚙ Konto &
   plan' kapades mitt i ordet ('Kont') och raden såg ut att sväva indragen
   under den kant-i-kant-lagda naven. margin-inline:calc(50% - 50vw) tar ut
   den till viewportkanten (html/body har overflow-x:clip som klipper bleed
   och behåller stickyn). padding 24px = samma indrag som nav (padding:0 24px),
   så första pillret hamnar i linje med logotypen. */
.sidnav { position:sticky; top:var(--navh); z-index:50; display:flex; gap:5px;
          overflow-x:auto; overscroll-behavior-x:contain;
          scrollbar-width:none; -ms-overflow-style:none;
          scroll-padding-inline:24px 40px;   /* tangentbord: fokuserat piller
                                                rullas in FÖRBI tonningen */
          margin:-6px calc(50% - 50vw) 20px; border-radius:0;
          /* Remsan gar ut i kanterna, men pillren ska sta i linje med
             innehallet (Boss 2026-09-04: menyn kandes vind mot den centrerade
             kolumnen). Marginalen ovan drar ut raden med calc(50% - 50vw);
             samma matt tillbaka som vansterpadding satter forsta pillret exakt
             pa .wrap:s innehallskant. Procenten raknas mot samma
             containing block i bada, sa de tar ut varandra pa pixeln aven med
             rullningslist. max() haller mobilen kvar pa 24 px. */
          padding:11px 24px 11px max(24px, calc(50vw - 50%));
          background:var(--sidnav-yta); backdrop-filter:blur(14px);
          border-bottom:1px solid var(--line); }
.sidnav::-webkit-scrollbar { display:none; }
/* Rullningslisten är dold, så överskottet måste synas på annat sätt: tonad
   högerkant + 24 px rullutrymme så sista pillret kan dras helt fritt från
   tonningen (uppmätt vid rullningens slut: 42,6 px kvar mot 36 px tonning).
   VERIFIERAT 2026-09-02: 1199 px → scrollWidth == clientWidth, ingen tonning;
   1198 px → tonning + 5 px överskott; första FAKTISKT kapade pillret först
   under 1174 px (24 + 1126 pillerlöpa + 24). Tonningen tänds alltså alltid
   före kapningen, och aldrig på Boss 1238 px-skärm. */
@media(max-width:1198px) {
  .sidnav { -webkit-mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent);
                    mask-image:linear-gradient(to right,#000 calc(100% - 36px),transparent); }
  .sidnav::after { content:""; flex:0 0 24px; }
}
.sidnav a { flex:0 0 auto; display:flex; align-items:center; gap:8px;
            padding:9px 14px; border-radius:11px; text-decoration:none;
            color:var(--dim); font-size:13.5px; font-weight:600;
            white-space:nowrap; letter-spacing:-.01em; transition:all .16s; }
.sidnav a:hover { background:var(--panel); color:var(--ink); }
/* Raden dras med tangentbord genom att tabba mellan pillren — då MÅSTE
   fokus synas, och scroll-padding-inline ovan håller det utanför tonningen. */
.sidnav a:focus-visible { outline:2px solid var(--gold); outline-offset:2px; }
/* .on sätts av scrollspy (JS) — den aktiva stilen MÅSTE hänga på just 'on'. */
.sidnav a.on { background:linear-gradient(150deg,var(--gold),var(--gold2));
               color:var(--mork-txt);
               box-shadow:0 6px 18px -7px rgba(240,197,88,.6); }
.sidnav a .n { margin-left:2px; font-family:var(--mono); font-size:10px; font-weight:700;
               background:var(--panel2); color:var(--dim); border-radius:20px; padding:1px 7px; }
.sidnav a.on .n { background:rgba(20,15,2,.18); color:var(--mork-txt); }
.sidnav .sn-ikon { width:16px; text-align:center; flex-shrink:0; }


/* ═══ 8. SEKTIONER & KORT ═══════════════════════════════════════════════════
   scroll-margin UPPMÄTT 2026-09-02: toppnav 60 + pillerrad 61,25 = klistrad
   botten 121,3 px (mobil 60 + 56,5 = 116,5). Gamla 126 gav bara 4,4 px luft;
   var(--navh) + 72 = 132 ger 10,7 px på desktop och 15,5 på mobil. Sänk
   aldrig — då hamnar ankarrubriken under pillerraden. */
section { scroll-margin-top:calc(var(--navh) + 72px); margin-bottom:30px; }
.sek-topp { display:flex; align-items:baseline; gap:12px; flex-wrap:wrap; margin-bottom:14px; }
.sek-topp h2 { font-size:18px; font-weight:700; letter-spacing:-.02em; }
/* Sitter på både <a> och <button> — måste funka på båda. */
.sek-topp .sek-lank { margin-left:auto; font-size:12.5px; font-weight:600; color:var(--dim);
                      text-decoration:none; border:1px solid var(--line2); border-radius:9px;
                      padding:5px 11px; background:var(--panel2); transition:all .18s; }
.sek-topp .sek-lank:hover { background:var(--panel); border-color:var(--gold2); color:var(--ink); }
/* Tva knappar i samma rubrikrad ("+ Rad utan kvitto" och "Importera bokforing"
   under Alla kvitton). Bara den FORSTA ska knuffas ut till hoger: tva
   auto-marginaler delar det lediga utrymmet mellan sig och hade lagt ett gap
   mitt emellan knapparna i stallet for att halla ihop dem. */
.sek-topp .sek-lank + .sek-lank { margin-left:0; }
/* Panelkortet: platt yta + exakt 1px ram. I mörkt läge ingen skugga alls
   (--skugga-kort:none) — djup görs med ytfärg. I ljust läge en hårfin skugga,
   annars försvinner det vita kortet i den ljusa sidbakgrunden. */
.card { background:var(--panel); border:1px solid var(--line); border-radius:14px;
        padding:18px 20px; box-shadow:var(--skugga-kort); transition:border-color .2s; }
.card + .card { margin-top:13px; }

h1 { font-size:25px; font-weight:700; letter-spacing:-.02em; }
.hej { display:flex; align-items:flex-end; gap:16px; flex-wrap:wrap; margin-bottom:6px; }
.hej p { color:var(--dim); font-size:13.5px; }

/* ── EN hjälptextklass (etapp 3 c) ─────────────────────────────────────────
   .forklaring är namnet för ALL förklarande text: den som ska kunna stängas av
   i proffsläge med en CSS-regel (avsnitt 14). .sek-hjalp ligger kvar som alias
   tills mallarna är migrerade — .notis-* är statusrutor, inte förklaringar,
   och hör INTE hit. */
.forklaring, .sek-topp .sek-hjalp { font-size:12.5px; color:var(--dim); line-height:1.6; }


/* ═══ 9. FORMULÄR ═══════════════════════════════════════════════════════════
   Mono-versal etikett över nedsänkt fält med guldfokus.
   AVSTEG från den ordagranna lyften: selektorlistan har utökats med
   input[type=email|search|tel|password] och input:not([type]). De typerna
   stylade dashboard.html aldrig (den har inga sådana fält), men login-,
   waitlist- och kontosidorna har dem — och theme.css sätter `color:var(--navy)`
   på dem i mörkt läge, vilket med casters-paletten hade gett osynlig text. */
.arvaljare { margin-left:auto; display:flex; align-items:center; gap:8px;
             background:var(--panel2); border:1px solid var(--line2);
             border-radius:11px; padding:6px 12px; }
.arvaljare label { font-family:var(--mono); font-size:10px; color:var(--dim);
                   font-weight:600; text-transform:uppercase; letter-spacing:.1em; }
.arvaljare select { border:none; background:transparent; font-weight:700; padding:2px 4px;
                    font-family:var(--mono); font-size:13px; color:var(--ink); }
select, textarea,
input:not([type]), input[type=text], input[type=number], input[type=date],
input[type=email], input[type=search], input[type=tel], input[type=password] {
  font-family:var(--sans); font-size:14px; color:var(--ink); background:var(--falt-yta);
  border:1px solid var(--line2); border-radius:9px; padding:10px 12px; }
select:focus, input:focus, textarea:focus {
  outline:2px solid var(--fokus); border-color:var(--gold); }
/* Platshållare är läsbar text (14px) och behåller den starkare tonen:
   --dim ger 7,2:1 mot --bg2, --faint 5,4:1. */
input::placeholder, textarea::placeholder { color:var(--dim); }
input[type=checkbox] { accent-color:var(--gold); }


/* ═══ 10. KNAPPAR ═══════════════════════════════════════════════════════════
   Guld bär ALLTID nästan svart text (--mork-txt), aldrig var(--navy). */
.btn { display:inline-flex; align-items:center; justify-content:center; gap:6px;
       padding:11px 18px; border:none; border-radius:10px; font-size:14px; font-weight:700;
       cursor:pointer; text-decoration:none; transition:.16s; font-family:var(--sans);
       letter-spacing:-.01em; }
.btn-gold { background:linear-gradient(150deg,var(--gold),var(--gold2)); color:var(--mork-txt);
            box-shadow:0 6px 18px -8px rgba(240,197,88,.55); }
.btn-gold:hover { background:linear-gradient(150deg,var(--gold-ljus),var(--gold)); }
/* Sekundärknapp (fd navy): upphöjd panel med ram, inte längre en mörk platta. */
.btn-navy { background:var(--panel2); color:var(--ink); border:1px solid var(--line2); }
.btn-navy:hover { background:var(--panel2-hov); border-color:var(--gold2); }
.btn-outline { background:var(--panel); border:1px solid var(--line2); color:var(--ink); }
.btn-outline:hover { background:var(--panel2); border-color:var(--gold2); }
.btn-sm { padding:7px 12px; font-size:12.5px; border-radius:9px; }
.btn-fara { background:var(--panel); border:1px solid var(--kant-rod); color:var(--red); }
.btn-fara:hover { background:var(--ton-rod2); }
.snabb { display:flex; gap:10px; flex-wrap:wrap; margin-bottom:22px; }


/* ═══ 11. TABELLER ══════════════════════════════════════════════════════════
   Mono-versala rubriker på nedsänkt yta, hårlinjer mellan raderna. */
table { width:100%; border-collapse:collapse; font-size:12.5px; }
th { text-align:left; font-family:var(--mono); font-size:9.5px; font-weight:600;
     color:var(--faint); text-transform:uppercase; letter-spacing:.1em;
     padding:12px; background:var(--bg2);
     border-bottom:1px solid var(--line); white-space:nowrap; }
td { padding:11px 12px; border-bottom:1px solid var(--line); font-size:13px; }
tr:last-child td { border-bottom:none; }
tbody tr:hover td { background:var(--rad-hover); }
td.hoger, th.hoger { text-align:right; font-variant-numeric:tabular-nums; }


/* ═══ 11 b. GRUPPSTAPLAR, TABELLOMSLAG & LEGEND ═════════════════════════════
   Ekonomiytan (dashboard.html #ekonomi, 2026-09-04). Fyra tillskott — allt
   annat i den ytan ritas med klasser som redan fanns.

   .hbar är förlagans gruppstapelrad (skatt/ekonomi-hub.html:88-91) portad på
   Skattklarts villkor: SPÅRET är .matare, som redan finns i dashboard.html med
   sina två lägens färger (--matare-spar) och sin cubic-bezier(.16,.9,.24,1)-
   övergång. Inget andra spårelement skapas — .hbar är etikettraden ovanför.
   Raden är ofta en <button> (klick filtrerar kvittolistan), därför nollas
   knappens egna font-, kant- och bakgrundsvärden här.

   .tblwrap MÅSTE finnas: en bred tabell utan omslag rullar HELA dokumentet i
   sidled. Det får ALDRIG "lösas" med overflow-x:hidden — avsnitt 3 sätter
   overflow-x:clip på html/body med flit, och hidden dödar pillerradens
   position:sticky (uppmätt: nav top −900 vid scrollY 900). table.rullbar
   (avsnitt 16) gäller bara under 600px och räcker inte.

   .legend ersätter de hårdkodade hexvärdena i dashboardens diagramlegend
   (#0a7c55/#e08a2e i inline style) — de gav 1,x:1 kontrast i ljust läge och
   fick tas tillbaka av fyra attributselektorer i mallen. Nu är det en klass.

   Railvarianterna heter rail-gron/rail-rod och INTE gron/rod: .gron och
   .rodtxt är textfärgsklasser i dashboard.html (0,1,0) och skulle ha färgat
   hela kortets ärvda text, inte bara railen. */
.hbar { display:block; width:100%; margin:0 0 11px; padding:0; border:0;
        background:none; color:inherit; font:inherit; text-align:left; }
.hbar:last-child { margin-bottom:0; }
.hbar[role=button], button.hbar { cursor:pointer; }
.hbar[role=button]:hover .top, button.hbar:hover .top { color:var(--ink); }
.hbar .top { display:flex; align-items:baseline; gap:12px; margin-bottom:5px;
             font-size:13px; font-weight:600; color:var(--dim); }
.hbar .top b { margin-left:auto; flex-shrink:0; color:var(--ink); font-weight:650;
               font-family:var(--mono); font-variant-numeric:tabular-nums;
               white-space:nowrap; }
/* Barnen ar <span>, inte <div>: en <button> far bara innehalla frasinnehall,
   och .hbar ar en knapp i kategoridelen. Sparet maste alltsa tvingas till
   block har — .matare satter hojd men inget display. */
.hbar .top, .hbar .matare { display:flex; }
.hbar .matare { display:block; }
/* Samma täthetsgrepp som avsnitt 15 (b): luften halveras, raden står kvar. */
html[data-lage="proffs"] .hbar { margin-bottom:7px; }
html[data-lage="proffs"] .hbar .top { margin-bottom:3px; font-size:12.5px; }

.tblwrap { overflow-x:auto; border:1px solid var(--line); border-radius:14px; }
.tblwrap th:first-child, .tblwrap td:first-child { padding-left:14px; }
.tblwrap th:last-child,  .tblwrap td:last-child  { padding-right:14px; }

.legend { display:flex; gap:7px 16px; flex-wrap:wrap; align-items:center;
          margin-top:10px; font-size:12px; color:var(--dim); }
.legend span { display:inline-flex; align-items:center; gap:6px; }
.legend i { width:10px; height:10px; border-radius:3px; flex-shrink:0;
            background:var(--dim); }
.legend i.in { background:var(--green); }
.legend i.ut { background:var(--gold); }

.kpi-kort.rail-gron::before { background:var(--green); }
.kpi-kort.rail-rod::before  { background:var(--red); }


/* ═══ 12. STATUSBRICKOR ═════════════════════════════════════════════════════
   Receptet från förlagans .tag: ~14 % fyllning, ~35 % ram, full accent på
   texten. badge-review och badge-analyzing skapas BARA via interpolationen
   badge-${d.status} i JS — får aldrig tas bort.

   VARNING: klassnamnet .badge är UPPTAGET av statusbrickan här. index.html,
   plattform.html, annan-plattform.html och admin_plattformar.html använder
   i dag .badge till en helt annan sak (ett guldpiller högst upp på sidan,
   "⚡ Nyhet"). De mallarna måste döpa om sitt piller (t.ex. .marke) INNAN de
   ärver bas.html — annars byter deras piller utseende. */
.badge { display:inline-block; padding:3px 9px; border-radius:20px; font-size:11px;
         font-weight:700; white-space:nowrap; border:1px solid transparent; }
.badge-draft     { background:var(--yta1);     color:var(--dim);    border-color:var(--line2); }
.badge-ready     { background:var(--ton-gul);  color:var(--gold);   border-color:var(--kant-gul); }
.badge-review    { background:var(--ton-bla);  color:var(--blue);   border-color:var(--kant-bla); }
.badge-signed    { background:var(--ton-gron); color:var(--green);  border-color:var(--kant-gron); }
.badge-analyzing { background:var(--ton-lila); color:var(--violet); border-color:var(--kant-lila); }
.badge-ok        { background:var(--ton-gron); color:var(--green);  border-color:var(--kant-gron); }
.badge-brist     { background:var(--ton-rod2); color:var(--red);    border-color:var(--kant-rod); }
.badge-kat       { background:var(--panel2);   color:var(--dim);    border-color:var(--line2); }


/* ═══ 13. MODALER ═══════════════════════════════════════════════════════════
   Klassen "open" sätts av JS på #modal och #bank-modal — låst namn. */
.modal-bg { display:none; position:fixed; inset:0; background:var(--overlay);
            z-index:130; align-items:center; justify-content:center; padding:16px; }
.modal-bg.open { display:flex; }
.modal { background:var(--panel); border:1px solid var(--line2); border-radius:var(--r-lg);
         padding:24px; max-width:480px; width:100%;
         box-shadow:var(--skugga-3); }
.modal h3 { font-size:19px; font-weight:700; letter-spacing:-.02em; margin-bottom:18px; }
.modal-btns { display:flex; gap:10px; justify-content:flex-end; margin-top:20px; }
/* .bred: flerstegsdialogen (importguiden i dashboard.html). Samma ruta, tre
   skillnader — bredare an 480px for att rymma en kolumntabell, rullbar i
   hojdled sa granskningssteget aldrig kan vaxa ur skarmen, och darfor med egen
   overflow. dvh-raden ar en uppgradering for de webblasare som kan den; vh
   ligger kvar under och galler i de ovriga. */
.modal.bred { max-width:720px; max-height:calc(100vh - 32px); overflow-y:auto; }
@supports (height:100dvh) { .modal.bred { max-height:calc(100dvh - 32px); } }


/* ═══ 14. SIDFOT ════════════════════════════════════════════════════════════ */
.fot { text-align:center; color:var(--dim); font-size:11px; margin-top:40px;
       line-height:1.8; font-family:var(--mono); border-top:1px solid var(--line);
       padding-top:18px; }


/* ═══ 15. LÄGESKROKEN — html[data-lage="proffs"] ════════════════════════════
   ETAPP 5 + 6 (2026-09-02). Kroken var TOM: Proffs såg ut exakt som Enkelt.
   Nu bär den det som BARA är utseende — ingenting mer.

   ARBETSFÖRDELNINGEN, en gång för alla:
     display:none HÄR      → text som bara FÖRKLARAR (.forklaring). Den är sann
                              i båda lägena; proffset har bara läst den förr.
     {% if funktioner %}    → expertytorna (SIE-export, SRU-validering,
                              analysförhandsvisning, rå-OCR). De ska inte
                              RENDERAS alls. Servern äger listan
                              (app.py:_funktioner): det som inte finns i
                              HTML:en kan ingen snubbla på, medan en
                              CSS-döljd yta ligger kvar i sidkällan och
                              fortfarande läses upp av skärmläsare.

   ENKELT LÄGE ÄR OFÖRÄNDRAT: varje regel nedan står bakom
   html[data-lage="proffs"] och kan aldrig matcha en enkel sida. `lage` är
   alltid 'enkelt' eller 'proffs' (app.py:_lage_for normaliserar), och utan
   session eller utan JS renderar servern 'enkelt' — attributet saknar aldrig
   värde, så selektorn kan inte träffa något däremellan.

   INGEN FÄRG ÄNDRAS HÄR. Reglerna rör display, padding och en font-size, så
   kontrastkvoterna är per definition identiska med enkelt läge. 13px →
   12,5px passerar heller ingen WCAG-gräns: "stor text" börjar först vid
   18,66px fet / 24px, alltså gäller 4,5:1 på båda sidor om bytet. */

/* (a) FÖRKLARINGARNA. .forklaring är ENDA klassen som får försvinna så här.
   .hint, .sek-hjalp och .q-hint bär på sina håll sakuppgifter — priser,
   kvoter, villkor, vad som händer om man klickar — och rörs INTE. Etapp 3
   döpte klassen; etapp 5 är först med att sätta den på riktig text
   (konto.html, declaration.html). Ordlistan använder den ALDRIG: den sidans
   brödtext är själva varan, och i proffsläge är den dessutom enda
   kvarvarande vägen till en förklaring (terms.js ritar inga tooltips där). */
html[data-lage="proffs"] .forklaring { display:none; }

/* Termprickarna. static/terms.js:init() hoppar över linkifieringen i
   proffsläge, så de ritas normalt aldrig. Regeln är för glappet: en UTLOGGAD
   besökare vars localStorage säger 'proffs' får sidan serverrenderad som
   'enkelt' (context_processorn kan inte veta bättre) och terms.js flyttar
   data-lage först därefter. Utan raden kunde en redan markerad term bli kvar
   prickad efter bytet. */
html[data-lage="proffs"] .skv-term { border-bottom:none; cursor:auto; }

/* (b) TÄTHETEN. Cellens luft halveras och lite till: 11px + rad + 11px blir
   5px + rad + 5px. UPPMÄTT i Chromium 2026-09-02 (1280px, en tabellrad med
   ett datum i): radhöjden går från 42px till 29px — 13px per rad, alltså
   ~650px mindre att rulla på en lista med 50 kvitton. Raden blir inte
   halverad: radavståndet i texten går inte att ta bort utan att texten
   slutar vara läsbar. Hårlinjen mellan raderna står också kvar — utan den
   blir en tät tabell obegriplig, inte tät. */
html[data-lage="proffs"] th { padding:6px 12px; }
html[data-lage="proffs"] td { padding:5px 12px; font-size:12.5px; }

/* Korten dras ihop i samma andetag. En tät tabell i ett luftigt kort ser
   trasig ut, inte tät — luften måste bort på båda ställena samtidigt. */
html[data-lage="proffs"] .card { padding:13px 15px; }
html[data-lage="proffs"] .card + .card { margin-top:9px; }
html[data-lage="proffs"] section { margin-bottom:20px; }
html[data-lage="proffs"] .sek-topp { margin-bottom:9px; }
html[data-lage="proffs"] .snabb { margin-bottom:15px; }
html[data-lage="proffs"] .hej { margin-bottom:3px; }

/* MOBILEN ÄR UNDANTAGET. AUDIT (f) mätte 171 av 329 tryckytor under 44px
   redan i enkelt läge; en halverad radhöjd där hade gjort tummen till
   problemet i stället för rullningen. Under 640px återställs därför
   tabellcellerna till enkelt läges mått. Korten står kvar täta — kortets
   padding är ingen tryckyta, och skillnaden mot avsnitt 16:s egna 15px
   under 600px är två pixlar. */
@media(max-width:640px) {
  html[data-lage="proffs"] th { padding:12px; }
  html[data-lage="proffs"] td { padding:11px 12px; font-size:13px; }
}


/* ═══ 16. MOBIL ═════════════════════════════════════════════════════════════
   Lyft ur dashboard.html rad 580-623, men BARA de gemensamma raderna.
   Sidspecifika brytpunkter (.kpi, .kvitto-rad, .todo-rad, .falt-par) ligger
   kvar i dashboard.html. */
@media(max-width:900px) {
  .wrap { padding:16px 14px 90px; }
  /* margin -14px, inte vw: under 900 px är .wrap redan full bredd, och
     -14px slipper den rullningslistbredd som 50vw räknar in. */
  .sidnav { top:var(--navh); margin:-10px -14px 16px; padding:10px 14px; }
  .sidnav a { padding:8px 12px; white-space:nowrap; font-size:13px; }
  .sidnav .sn-txt { display:inline; }
}
@media(max-width:600px) {
  nav { padding:0 12px; }
  /* Märkesraden: ordmärket krymper, mono-signaturen tas bort — annars
     trycker den ihop länkarna i den 60px höga naven. */
  .wm b { font-size:16px; }
  .wm small { display:none; }
  .nav-logo .sigil.lm { width:30px; height:30px; border-radius:9px; }
  .brand { gap:10px; }
  .brandmeta { gap:10px; }

  .nav-right { gap:10px; }
  .nav-right .nav-link { font-size:13px; }
  .nav-namn-text, .nav-doldmobil { display:none; }
  h1 { font-size:21px; }
  .hej { gap:10px; }
  .arvaljare { margin-left:0; }
  .snabb .btn { flex:1 1 46%; }
  .card { padding:15px; border-radius:12px; }
  table.rullbar { display:block; overflow-x:auto; white-space:nowrap; }
  .modal { padding:20px; }
}


/* ═══ 17. FÖRETRÄDE FRAMFÖR TEMALAGRET ══════════════════════════════════════
   theme.css laddas FÖRE den här filen och patchar 24 selektorer med prefixet
   html[data-theme="dark"] (specificitet 0,2,1 och uppåt). De patcharna skrevs
   för de gamla ljusa mallarna och pekar på den GAMLA paletten:
   `background: var(--card); color: var(--navy)`. I casters-paletten är --navy
   en mörk YTA (#1b2230) — texten hade blivit osynlig.

   Reglerna nedan har SAMMA prefix och samma specificitet som theme.css
   motsvarigheter och vinner på ordningen. Varje rad pekar ut vilken theme.css-
   regel den tar tillbaka. Migreras alla mallar bort från theme.css kan hela
   avsnittet — och <link>-raden till theme.css i bas.html — tas bort.

   theme.css-regler som INTE behöver motsvarighet, kontrollerat:
   · input/textarea::placeholder → color:var(--mut); --mut = --dim här. Rätt.
   · .sub/.hint/… → color:var(--mut). Rätt.
   · .logo/.wm/.nav-logo [style*="color:var(--gold)"] → color:var(--gold). Rätt.
   · footer .wrap → rör <footer>, inte .fot. Ingen casters-komponent. */

/* theme.css: `html[data-theme="dark"] nav { background: var(--brand-yta) }` */
html[data-theme="dark"] nav { background:var(--nav-yta); }

/* theme.css: `.nav-link, .nav-namn-text { color: rgba(255,255,255,.86) }` */
html[data-theme="dark"] .nav-link,
html[data-theme="dark"] .nav-namn-text { color:var(--nav-lank); }
html[data-theme="dark"] .nav-link:hover { color:var(--nav-lank-hov); }

/* theme.css: 16 selektorer → `background:var(--card); color:var(--navy);
   border-color:var(--line)`. Varje komponent får tillbaka sin egen yta. */
html[data-theme="dark"] .sidnav { background:var(--sidnav-yta); border-color:var(--line); }
html[data-theme="dark"] .sek-topp .sek-lank,
html[data-theme="dark"] .arvaljare { background:var(--panel2); color:var(--dim);
                                     border-color:var(--line2); }
html[data-theme="dark"] .sek-topp .sek-lank:hover { background:var(--panel); color:var(--ink);
                                                    border-color:var(--gold2); }
html[data-theme="dark"] .arvaljare select { background:transparent; color:var(--ink); }
html[data-theme="dark"] .btn-outline { background:var(--panel); color:var(--ink);
                                       border-color:var(--line2); }
html[data-theme="dark"] .btn-outline:hover { background:var(--panel2); border-color:var(--gold2); }
html[data-theme="dark"] .btn-fara { background:var(--panel); color:var(--red);
                                    border-color:var(--kant-rod); }
/* theme.css: `.btn-fara:hover { background:#3a1f1c }` */
html[data-theme="dark"] .btn-fara:hover { background:var(--ton-rod2); }
html[data-theme="dark"] .modal { background:var(--panel); color:var(--ink);
                                 border-color:var(--line2); }
html[data-theme="dark"] select,
html[data-theme="dark"] textarea,
html[data-theme="dark"] input:not([type]),
html[data-theme="dark"] input[type=text],
html[data-theme="dark"] input[type=number],
html[data-theme="dark"] input[type=date],
html[data-theme="dark"] input[type=email],
html[data-theme="dark"] input[type=search],
html[data-theme="dark"] input[type=tel],
html[data-theme="dark"] input[type=password] { background:var(--falt-yta); color:var(--ink);
                                               border-color:var(--line2); }

/* theme.css: `.sidnav a.on, .btn-navy, … { background: var(--brand-yta) }` */
html[data-theme="dark"] .sidnav a.on { background:linear-gradient(150deg,var(--gold),var(--gold2));
                                       color:var(--mork-txt); }
html[data-theme="dark"] .btn-navy { background:var(--panel2); color:var(--ink);
                                    border-color:var(--line2); }
html[data-theme="dark"] .btn-navy:hover { background:var(--panel2-hov); border-color:var(--gold2); }

/* theme.css: `.sidnav a:hover { background:#1e2637; color:var(--navy) }` */
html[data-theme="dark"] .sidnav a:hover { background:var(--panel); color:var(--ink); }

/* theme.css: `.sidnav a .n, .badge-kat, .badge-draft { background:#1e2637;
   color:var(--mut) }` — brickorna ska följa sin egen ton, inte en fast grå. */
html[data-theme="dark"] .sidnav a .n { background:var(--panel2); color:var(--dim); }
html[data-theme="dark"] .sidnav a.on .n { background:rgba(20,15,2,.18); color:var(--mork-txt); }
html[data-theme="dark"] .badge-kat { background:var(--panel2); color:var(--dim);
                                     border-color:var(--line2); }
html[data-theme="dark"] .badge-draft { background:var(--yta1); color:var(--dim);
                                       border-color:var(--line2); }

/* theme.css: `.badge-signed, .badge-ok, .chip-plan { background:#14372a;
   color:#6ee7b7 }` och två regler till som gör .chip-plan guldfylld. */
html[data-theme="dark"] .badge-signed,
html[data-theme="dark"] .badge-ok { background:var(--ton-gron); color:var(--green);
                                    border-color:var(--kant-gron); }
html[data-theme="dark"] .chip-plan,
html[data-theme="dark"] .chip-plan * { background:var(--ton-gron); color:var(--green); }
html[data-theme="dark"] .chip-plan { border-color:var(--kant-gron); }

/* theme.css: `.btn-gold, .btn-gold * { color:#1a2744 }` — guld bär --mork-txt. */
html[data-theme="dark"] .btn-gold,
html[data-theme="dark"] .btn-gold * { color:var(--mork-txt); }

/* theme.css: `tbody tr:hover td, .kvitto-rad:hover { background:#1c2434 }` */
html[data-theme="dark"] tbody tr:hover td { background:var(--rad-hover); }

/* ── Tillagt 2026-09-02 (etapp 3, verifieringen) ──────────────────────────
   Tre theme.css-regler saknade motsvarighet har. Alla tre pekar pa var(--navy)
   som TEXT; i casters morka palett ar --navy en YTA (#1b2230) och texten blev
   osynlig. Uppmatt i Chromium med data-theme inbakat i filen fore laddning
   (JS-satt attribut substituerar inte om var() i CSS-shorthands). */

/* theme.css:60 `html[data-theme="dark"] body{background:var(--light);
   color:var(--navy)}` (0,1,2) slar casters `body` (0,0,1). Uppmatt 1,06:1 pa
   de 8 mallar som inte bar en egen lokal takeback (admin x6 + 404 + 500):
   204 brott. De 12 ovriga migrerade mallarna satter samma sak lokalt och
   paverkas inte — deras egen regel ligger senare i kaskaden.
   background-COLOR, inte shorthand: theme.css shorthand har redan nollat
   body:s glow-gradienter, och en shorthand har hade last fast det. */
html[data-theme="dark"] body { background-color:var(--bg); color:var(--ink); }

/* theme.css:89 `.temavaljare{background:var(--card);color:var(--navy)}` — ingen
   dark-prefix, sa den galler bada lagena. Knappen ritas av theme.js pa VARJE
   sida utom dashboard.html (som doljer den). Uppmatt 1,14:1 i morkt lage pa
   10 sidor. Bara fargen behover tas tillbaka: --card ar --panel har och ramen
   ar ratt. Oskyddad av avsikt — i ljust lage ar --ink #1a2744, exakt det
   --navy ar, sa ljust lage ar oforandrat. */
.temavaljare { color:var(--ink); }

/* theme.css:441-450 (ROT 2c) `html[data-theme="dark"] .term .short, .bullets li,
   .guide-steps li, .guide-steps .step-t, .guide-steps strong{color:var(--navy)}`.
   Samma selektorer, samma specificitet, senare fil. Uppmatt 1,14:1: ordlista
   24 st (.short), waitlist 2 st (.bullets li, plus .skv-term som arver).
   moms .guide-steps hade en lokal takeback i mallen redan — den blir nu
   overflodig men gor ingen skada. */
html[data-theme="dark"] .term .short,
html[data-theme="dark"] .bullets li,
html[data-theme="dark"] .guide-steps li,
html[data-theme="dark"] .guide-steps .step-t,
html[data-theme="dark"] .guide-steps strong { color:var(--ink); }


/* ═══ 18. MÅLYTOR, FÄLTSTORLEK, SKIP-LÄNK, STATUSREGION OCH FOKUS ═══════════
   ETAPP 7, tillgänglighetsdelen (AUDIT-2026-09-02.md rad 293 + 366).
   Allt nedan är uppmätt i en 375px-rigg med riktig Chromium (Playwright),
   före och efter, på tio sidor: /, /login, /waitlist, /trial, /demo,
   /annan-plattform, /dashboard, /ordlista, /konto, /intakter.

   FÖRE:  268 tryckytor, 168 under 44px (63 %). 24 formulärfält, 22 under 16px.
   EFTER: 278 tryckytor (skip-länken tillkom på varje sida), 48 under 44px
          (17 %). 24 formulärfält, 0 under 16px.

   DE 48 SOM ÄR KVAR, klassade element för element i samma rigg:
     35  inline-länk mitt i löpande text  → WCAG 2.5.8 undantar inline-mål,
                                             och min-height biter inte på
                                             display:inline ändå.
      7  <label for> över sitt fält       → målytan som räknas är fältet, och
                                             det är 44px sedan (b).
      6  <div onclick> i dashboard.html   → varken tangentbordsnåbara eller
                                             mina filer. Rapporterat vidare.
      0  kontroller som en stilmall kan nå.

   Termspanen räknas INTE in i jämförelsen ovan. De fick role="button" i
   etapp 7 (static/terms.js) och dyker därmed upp som "tryckytor" i mätningen
   — 92 st, allihop inline mitt i löpande text, samma undantag som raden ovan.

   INGEN FÄRG ÄNDRAS I NÅGON KOMPONENT här. Det enda som får ny färg är
   fokusringen (som förut inte fanns) och den delade statusrutan (som förut
   bara fanns i dashboard.html). Kontrastmätningen är alltså orörd. */


/* ── (a) SKIP-LÄNK ─────────────────────────────────────────────────────────
   Första elementet i bas.html:s <body>. AUDIT-2026-09-02 räknade 13 fokusstopp
   före innehållet på dashboarden; eftermätt med riktiga Tab-tryckningar i
   390px-riggen blev det 9 (märkesrad, kontolänk, Logga ut, lägesväljaren,
   årsväljaren och fyra piller) — mobilnaven döljer fyra av desktoplänkarna.
   Med länken är det 1.
   Den syns bara vid fokus: den ligger ovanför vyn och åker ner när den tas
   emot. :focus, inte :focus-visible — musanvändare kan inte fokusera den ändå,
   och Safari sätter inte alltid :focus-visible på länkar. */
.hoppa { position:fixed; left:12px; top:-120px; z-index:200;
         display:inline-flex; align-items:center; min-height:44px; padding:0 18px;
         background:var(--gold); color:var(--mork-txt);
         border-radius:0 0 var(--r) var(--r); box-shadow:var(--skugga-2);
         font-family:var(--sans); font-size:14px; font-weight:700;
         letter-spacing:-.01em; text-decoration:none;
         transition:top .12s ease-out; }
.hoppa:focus { top:0; }
/* Målet får inte hamna under den klistrade toppnaven + pillerraden. Samma mått
   som section-ankarna i avsnitt 8. */
#innehall, main[tabindex] { scroll-margin-top:calc(var(--navh) + 72px); }
/* Fokusramen runt HELA innehållsblocket är brus — hoppet syns på att sidan
   rullar, och nästa Tab landar i innehållet. */
#innehall:focus, main[tabindex]:focus { outline:none; }


/* ── (b) MÅLYTOR OCH FÄLTSTORLEK UNDER 640px ───────────────────────────────
   Två skilda problem, samma brytpunkt.

   FÄLTEN: iOS Safari zoomar in vid fokus på varje fält med text under 16px och
   zoomar ALDRIG ut igen — resten av besöket får panoreras. Uppmätt: 22 av 24
   fält låg på 12,5–15px. Det är en funktionsbugg på en mobil-först-målgrupp,
   inte en smaksak.
   !important behövs för ett enda fält: #chat-input i dashboard.html bär
   font-size:13px i en inline style="", och inline slår varje selektor utom
   !important. Regeln är avsiktligt smal — en property, bara formulärfält,
   bara under 640px.

   MÅLYTORNA: WCAG 2.5.5 (AAA) vill ha 44×44px, 2.5.8 (AA) 24×24px med ett
   uttryckligt undantag för länkar INNE i löpande text. min-height biter bara på
   det som inte är display:inline — och det är precis rätt: en inline-länk mitt
   i en mening ska inte bli 44px hög, den faller under undantaget, och regeln
   kan därför inte råka bryta ett stycke. 120 av de 168 för små ytorna var
   block, flex eller inline-block och rättas här; resten står i rutan överst.

   align-items biter på det som redan är flex; align-content centrerar texten i
   block-boxar (Chrome 123+, Safari 17.4+). Ingen display ändras — att göra om
   en block-länk till inline-flex hade krympt varje helbred CTA till textbredd. */
@media (max-width:640px) {
  input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]),
  select, textarea { font-size:16px !important; }

  a[href], button, summary, select,
  input[type=file], input[type=submit], input[type=button], input[type=reset],
  input:not([type=hidden]):not([type=checkbox]):not([type=radio]),
  [role=button], [role=tab], [role=switch] {
    min-height:44px; align-items:center; align-content:center;
  }

  /* Kryssrutan har ingen text att växa runt — den ritas i sin egen storlek.
     24px = WCAG 2.5.8 (AA). Etapp 6:s markeringsruta är 17px och sitter i en
     26px-kolumn i proffsradens mobillayout (dashboard.html:874); 24 ryms,
     44 hade sprängt kolumnen. min-width slår width, så regeln biter utan
     !important. */
  input[type=checkbox], input[type=radio] { min-width:24px; min-height:24px; }

  /* Pillerraden kompenseras. 6+44+6 = 56px mot dagens 10+35,5+10 = 55,5px:
     radens TOTALHÖJD står stilla. Utan kompensationen växer den till 64px och
     dashboardens åtgärdsrad — klistrad på top:calc(var(--navh) + 58px),
     dashboard.html:868 — hamnar under pillerraden i stället för under den. */
  .sidnav { padding:6px 14px; }

  /* Etiketter är undantagna med flit. label[for] är en tryckyta i teorin, men
     målytan som räknas är fältet den pekar på — och det är 44px sedan raden
     ovan. En 44px hög etikett över ett 44px högt fält är bara ett tomrum. */
}


/* ── (c) DEN DELADE STATUSREGIONEN ─────────────────────────────────────────
   #sk-live är sajtens ENDA aria-live-region (bas.html). Den är osynlig och
   bara till för uppläsning; allt som ska annonseras går genom den.
   #notis är den SYNLIGA rutan. Etapp 5 skrev den i dashboard.html; den finns
   nu i basmallen så varje sida har den, och stilen nedan är dashboardens egen
   (rad 572-581) flyttad hit ordagrant. Dashboardens kopia ligger senare i
   kaskaden och vinner där — samma värden, ingen visuell skillnad.
   Skärmläsaruppläsningen sköts INTE av #notis: bas.html tar bort role/aria-live
   från den och speglar texten till #sk-live, så det aldrig blir två röster. */
.sk-dold { position:absolute; width:1px; height:1px; margin:-1px; padding:0;
           overflow:hidden; clip:rect(0 0 0 0); clip-path:inset(50%); border:0;
           white-space:nowrap; }
#notis { position:fixed; top:calc(var(--navh) + 12px); left:50%; transform:translateX(-50%);
         z-index:130; display:none; max-width:min(460px,calc(100vw - 24px));
         background:var(--panel2); color:var(--ink); border:1px solid var(--line2);
         border-left:3px solid var(--gold); border-radius:12px;
         padding:11px 15px; font-size:13px; line-height:1.5;
         box-shadow:var(--skugga-3); }
#notis.on { display:block; }
#notis.fel { border-left-color:var(--red); }
#notis.klar { border-left-color:var(--green); }
#notis .btn { margin-left:10px; vertical-align:middle; }
@media print { #notis, .hoppa { display:none !important; } }


/* ── (d) SYNLIG FOKUSMARKERING ─────────────────────────────────────────────
   Två lager: 2px solid var(--ink) + 5px halvgenomskinlig guldglöd.
   Guld ENSAMT räcker inte: #f0b429 mot vitt är 1,79:1 och WCAG 2.4.11 kräver
   3:1 mot omgivningen. --ink mot --panel är 14,5:1 i ljust läge och 15,2:1 i
   mörkt. Mönstret är inte nytt — terms.js flytande lägesknapp har redan exakt
   det sedan etapp 2.

   PREFIXET html:root:root ÄR AVSIKTLIGT, och det är UPPMÄTT — inte räknat i
   huvudet. En sitewide fokusmarkering måste vinna över sidornas egna
   `:focus`-regler, och de ligger i mallarnas <style> som laddas EFTER den här
   filen. Två verkliga motståndare, båda mätta 2026-09-02 med riktiga
   tangenttryckningar i Chromium:
     · dashboard.html:178 `.verktyg .sok:focus{outline:none}` = (0,3,1).
       Sökrutan stod helt utan fokusmarkering — bara en 1px guldram.
     · casters.css avsnitt 7 `.sidnav a:focus-visible` = (0,2,1), tidigare i
       samma fil och alltså vinnare på ordning vid lika specificitet.
   Första försöket `html …:focus-visible` gav (0,1,2) och förlorade mot båda.
   `html:root:root … :focus-visible` ger (0,3,2): två typselektorer (html +
   elementet) och tre pseudoklasser (:root, :root, :focus-visible). Det slår
   (0,3,1) och (0,3,0) utan ett enda !important. Samma element matchas två
   gånger — det är hela poängen och det kostar ingenting.

   Vill en sida ha en EGEN fokusmarkering får den gå över (0,3,2). Det ska
   kosta ett medvetet beslut, inte råka hända.

   :focus-visible, inte :focus: musklick ska inte rita ring. Avsnitt 9:s
   `input:focus{outline:2px solid var(--fokus)}` står kvar och gäller musfokus i
   fält; den här regeln lägger sig över den vid tangentbordsfokus. */
html:root:root a[href]:focus-visible, html:root:root button:focus-visible,
html:root:root summary:focus-visible, html:root:root select:focus-visible,
html:root:root input:focus-visible, html:root:root textarea:focus-visible,
html:root:root [tabindex]:focus-visible, html:root:root [role=button]:focus-visible,
html:root:root [role=tab]:focus-visible {
  outline:2px solid var(--ink); outline-offset:2px;
  box-shadow:0 0 0 5px var(--fokus);
}
/* Kryssrutan har ingen egen box-shadow att bygga på och sitter tätt intill
   raden — offset 1px så ringen inte äter grannens hårlinje. */
html:root:root input[type=checkbox]:focus-visible,
html:root:root input[type=radio]:focus-visible { outline-offset:1px; }
