/* SEJR IDENTITY + SEJR UI — FLADGJORT FOR DASHBOARDET. GENERERET af
 * scripts/byg-identitet.mjs. RET ALDRIG HER: ret kilden i "SEJR IDENTITY"
 * og kør generatoren igen. En kopi der redigeres ved siden af sin kilde,
 * er en kopi der lyver næste gang kilden ændrer sig.
 *
 * Kilde:      kits/ui/react/sejr-ui-komplet.css og dens @import-kæde
 * Filer:      45
 * Aktiver:    49 (skrift og gravureplader, i ./aktiver/)
 *
 * Indlæsningsrækkefølgen er kildens egen: farve, skrift, bevægelse, kit.
 * Se kilder.json for hver fils sha256, så drift kan måles og ikke huskes.
 */
/* SEJR UI — ét importpunkt for React-laget.
 *
 * INDLÆSNINGSRÆKKEFØLGEN ER IKKE VALGFRI. Den står i sejr-ui.css's eget
 * hoved: identiteten (farve, skrift, bevægelse) skal ligge FØR kittet.
 * Mangler identiteten, fejler kitlaget stille — var() falder tilbage til
 * ingenting, og fladerne bliver gennemsigtige.
 */

/* ─── fundament/02-farve/sejr-farver.css ─── */
/* SEJR — farver. Fundamentet, ikke systemet.
 *
 * Udtrukket 16. august 2026 fra 02-COLOR/tokens/sejr-colors.css i SEJR BRAND.
 * Den fil har 145 unikke tokens over 434 linjer. Denne har det der ikke kan
 * undværes. Hver værdi er KOPIERET, ikke skrevet efter hukommelsen — det er
 * netop dét der har fået farver til at drive fra hinanden før.
 *
 * Reglen der holder resten sammen: FARVE ER FUNKTION.
 * Crimson er handlingen. Grøn er penge der kommer ind. Alt andet er grund,
 * blæk og grå. En farve uden en opgave hører ikke til her.
 *
 * ─── OG DEN REGEL DER BINDER HÅRDEST ──────────────────────────────────────
 *
 *   FARVE ER BEKRÆFTELSE. ALDRIG SELVE SIGNALET.
 *
 * Båret hertil fra SEJR BRAND 17. august 2026, hvor den blev fundet ved
 * måling og så blev efterladt i arkivet. Målt PÅ NÆRVÆRENDE palet, ikke
 * skrevet af — de gamle tal beskrev tokens der ikke findes mere:
 *
 *   --fn-success mod --fn-info    dE 4,5 på dag · 6,3 på nat  (tritanopi)
 *   --money-in   mod --fn-success dE 9,0 på dag               (deuteranopi)
 *
 * «Gennemført» og «til orientering» er altså den SAMME FARVE for en bruger
 * med tritanopi. Det er ikke en fejl i paletten der kan rettes: rød, grøn og
 * neutral adskiller sig ikke under dikromasi ved læsbar kontrast. Det er
 * øjet, ikke værdierne.
 *
 * Derfor, bindende og uden undtagelse:
 *   · Hvert beløb bærer sit fortegn. + og − , ikke grøn og rød.
 *   · Hver tilstand bærer et ORD. «Afvist», ikke en rød prik.
 *   · Hver serie i et diagram bærer sin etiket eller sin egen signatur.
 *   · Farven må bekræfte det, ordet allerede har sagt. Aldrig bære det alene.
 *
 * Seriefarverne nedenfor er den ene undtagelse der bekræfter reglen: de er
 * søgt frem netop for at overleve alle tre former for farveblindhed, og selv
 * dér skal en etiket kunne findes.
 */

:root {
  /* ---- grunde ------------------------------------------------------------
     To flader, og valget mellem dem er ikke smag: lyset er arbejdet, mørket
     er beslutningen. Paper er produktets og dokumenternes grund; Ink er
     marketing, film og de øjeblikke hvor der skal træffes et valg. */
  --ink:        #0F1419;
  --ink-2:      #1A2028;   /* løftet flade PÅ ink — modaler, ark, skuffer */
  --paper:      #FAFAF7;
  --cream:      #F2F1ED;   /* papir med varme: dokumenter, tryk, kortbagsider */

  /* ---- accenten ----------------------------------------------------------
     ÉN farve, ét job: handlingen, krydsningen, afregningen. Ét sted pr.
     skærm. Crimson som dekoration er ikke tilladt — i det øjeblik den pynter,
     holder den op med at betyde noget.

     ROLLERNE ER MÅLT, IKKE VALGT EFTER NAVN. Rettet 17. august 2026:

       #C1213F  hvile.   Papirtekst ovenpå 5,65:1. Bærer selv tekst på papir.
       #911C36  hover og tryk PÅ PAPIR. Papirtekst ovenpå 8,29:1 — kontrasten
                BLIVER BEDRE når man rører den. Det er hele pointen: en
                tilstand må aldrig gøre en knap sværere at læse.
       #5C1124  dybeste flade på papir. Papirtekst 12,87:1.
       #DC3D58  crimson dér hvor grunden er mørk — tekst, streg, ikon.
                Måler 4,28:1 på ink mod fuld crimsons 3,14:1.

     #DC3D58 hed før «hover». Det var forkert: som FLADE bærer den kun
     papirtekst med 4,14:1, altså under AA. En knap må ikke falde under AA i
     det øjeblik markøren rammer den, så hover går NEDAD i skalaen, ikke opad.
     #5C1124 hed før «på ink, hvor fuld crimson blænder». Også forkert —
     crimson blænder ikke på ink, den forsvinder (3,14:1), og #5C1124 måler
     1,38:1 dér. Den hører på papir. */
  --crimson:        #C1213F;
  --crimson-bright: #DC3D58;   /* crimson på MØRK grund — se nedenfor */
  --crimson-shade:  #911C36;   /* hover OG tryk på papir — se nedenfor */
  --crimson-deep:   #5C1124;   /* dybeste crimson-flade på PAPIR */

  /* ---- handlingens gradient ---------------------------------------------
     Besluttet af Morris 15. september 2026: «a main color that was always
     gradient … our main crimson for actions». Retningen er vandret, fra
     crimson mod lys, læseretningen. Lyset er bygget af paletten alene
     (crimson, bright, paper blandet), så ingen ny farve kommer ind.

     MÅLT samme dag: en flade må højst gå 73 % fra crimson mod bright
     (#D53551, 4,51:1) hvis der står et paper-ord på den. Bright som flade
     bærer kun 4,14:1, bright+25 % paper 2,97:1. Ordets sidste bogstav står
     ved ~88 % af en knaps bredde og ved ~45 % af en stor flade. Derfor
     SKALERES LYSET TIL PLADSEN: hvor langt det når, afhænger af hvor meget
     plads der er til højre for ordet. Tre grader, én retning:
       · --handling-flade   knappen, 36 px. Crimson til 40 %, kanten når
                            91 % mod bright. Ordets sidste bogstav 4,5:1.
       · --handling-lille   tælling og prik. Crimson til bright; cifret står
                            i midten på 4,9:1.
       · --handling-stor    den ene store crimson-flade en side må have.
                            Crimson til 20 %, kanten når bright+25 % paper.
                            Ordet slutter ved 45 %, dér måler den 5,2:1.
     Hover og tryk er stadig flade shade (8,29:1) — gradienten er hvile.
     Den rører ikke ordmærket, app-ikonet, Morgenen eller tekst i crimson;
     de er flade. Efterprøvet på skitser/skaerme/02–04. */
  --handling-flade: linear-gradient(90deg, var(--crimson) 0%, var(--crimson) 40%, color-mix(in srgb, var(--crimson-bright) 91%, var(--crimson)) 100%);
  --handling-lille: linear-gradient(90deg, var(--crimson) 0%, var(--crimson-bright) 100%);
  --handling-stor:  linear-gradient(90deg, var(--crimson) 0%, var(--crimson) 20%, color-mix(in srgb, var(--crimson-bright) 75%, var(--paper)) 100%);

  /* ---- makkeren: porcelæn ------------------------------------------------
     Besluttet af Morris 12. september 2026, efter «SEJR fra bunden»: ét par
     med låst forhold, som IKEA er blåt med gult ét sted. Porcelæn er grunden
     (terminalens hus, kortet, vinduesmærkets inderside), crimson er lakken
     (seglet, den ene knap, ringen). Forholdet ændrer sig aldrig.

     TO REGLER, SOM ER HELE PARRET:
       · Crimson er lakken, aldrig grunden. Aldrig større end et segl. Så
         betyder rødt aldrig minus, for et segl er aldrig en saldo.
       · Porcelæn optræder aldrig uden seglet. Uden det er den en lyseblå
         flise som seks andre danske mærker; med det er den den eneste på
         hylden med et rødt mærke.

     MÅLT 12. september 2026 (WCAG, mod #C1213F, #0F1419, #FAFAF7):
       #C2D2E2  porcelæn.      crimson-segl 3,83:1 · blæk som tekst 12,00:1 ·
                               som lys på ink 12,00:1. Til alt der støbes og
                               trykkes: køligere og gråere, som glasuren, så
                               den ikke bliver babyblå på plast.
       #C6D9EE  porcelæn-lys.  crimson-segl 4,09:1 · blæk 12,84:1. Varmere;
                               til skærm, hvor lyset alligevel er koldt.
     Fire andre makkere blev målt og forkastet: guld, sand og skovgrøn i
     deres første grader lod seglet forsvinde (1,61–2,65:1); i lysere grader
     bestod de, men kun porcelæn er uejet i dansk betaling.

     PÅ NAT vender parret: grunden er ink, porcelæn er lyset (datoen, chippen,
     den aktive fane, ikonerne), og crimson er stadig kun lakken, i
     --crimson-bright. Grønt er stadig penge ind. */
  --porcelaen:      #C2D2E2;
  --porcelaen-lys:  #C6D9EE;

  /* ---- penge -------------------------------------------------------------
     Et beløb har en retning. Ind er grøn, ud er neutral — ikke rød, for
     penge der forlader kontoen er ikke en fejl. Rød er forbeholdt fejl. */
  --money-in:   #056153;
  --money-out:  #0F1419;

  /* ---- tilstand ----------------------------------------------------------
     Mørke, mættede toner der bærer tekst på Paper. De er IKKE pengefarver:
     «det gik galt» og «pengene gik ud» er to forskellige beskeder, og de må
     aldrig dele et token. */
  --fn-danger:  #7A001F;
  --fn-warning: #563D02;
  --fn-success: #03493E;
  --fn-info:    #004660;

  /* ---- tilstandsflader ---------------------------------------------------
     Tilføjet 16. august 2026, efter måling.
     Fire apps havde skrevet Tailwinds standardblå #2563EB ind i deres egen
     globals.css. Målt lå den 68-78 ΔE fra --fn-info. Det var ikke sjusk: de
     manglede en FLADE at lægge en tilstand på. --fn-info kunne allerede bære
     tekst på papir og fungere som massiv fyld med papirtekst, men der fandtes
     ikke noget at lægge bag et badge eller et banner, så de opfandt det.

     Svaret er ikke en lysere blå — det ville kollidere med at crimson er
     handlingen, ét sted pr. skærm. Svaret er en flade i tilstandens EGEN
     kulør, som tilstandens egen tekstfarve kan stå på.

     Udledt i HSL så kuløren overlever, ikke blandet mod papir (det giver grå).
     Målt i samme rækkefølge som tokens står nedenfor —
     danger / warning / success / info: 9,41 / 9,12 / 9,41 / 9,05:1.
     (Stod før som 9,05/9,41/9,12/9,41, hvilket var de samme fire tal i
     en anden rækkefølge end de tokens de beskrev. Rettet 17. august 2026.) */
  --fn-danger-flade:  #F8E5EA;
  --fn-warning-flade: #F8F2E5;
  --fn-success-flade: #E5F8F5;
  --fn-info-flade:    #E5F3F8;

  /* ---- seriefarver til diagrammer ----------------------------------------
     Tilføjet 17. august 2026, fordi hullet var målbart: Recharts er
     afhængighed i tre apps, og to projekter havde allerede opfundet deres
     egne (--chart-1…5, --viz-*). Én af dem, #C92351, lå 8,8 ΔE fra crimson —
     en dataserie der lignede handlingen.

     I et diagram ER farven funktionen: den er det eneste der binder en kurve
     til sin etiket. Derfor bryder disse ikke med «farve er funktion» — de er
     det eneste sted hvor kulør bærer identitet frem for tilstand.

     SEKS, og ikke flere. Ud over seks kan man ikke længere holde en signatur
     og en kurve sammen i hovedet; da skal der grupperes, ikke tilføjes farve.

     Hver farve er valgt af en søgning under fire begrænsninger på én gang:
       · mindst 3:1 mod sin grund
       · mindst 25 ΔE fra HVER af brandets egne farver, 32 fra crimson —
         en serie må aldrig kunne forveksles med handlingen eller en tilstand
       · mindst 40° kulørafstand indbyrdes, så etiketterne kan matches
       · adskillelige for normalt syn OG protanopi, deuteranopi og tritanopi.
         Målt værste tilfælde: 20,0 ΔE (protanopi).

     Lysheden trapper 30 → 58 i L*, med mindst 4,8 mellem trinene. Det er
     ikke æstetik: et kontoudtog bliver printet, og i gråtone er lysheden
     det eneste der er tilbage. */
  --serie-1: #55387F;   /* L* 30 · violet     · 8,89:1 mod paper */
  --serie-2: #0D682E;   /* L* 38 · skovgrøn   · 6,61:1 */
  --serie-3: #9D4971;   /* L* 43 · hindbær    · 5,54:1 */
  --serie-4: #7C741E;   /* L* 48 · oliven     · 4,59:1 */
  --serie-5: #0F84CD;   /* L* 53 · blå        · 3,86:1 */
  --serie-6: #B18167;   /* L* 58 · ler        · 3,24:1 */

  /* ---- den neutrale skala, på Paper --------------------------------------
     Tolv trin fra papir til blæk. Alt grå i grænsefladen kommer herfra;
     der findes ikke en trettende. */
  --n-1:  #FAFAF7;  --n-2:  #ECECE9;  --n-3:  #D9D9D6;  --n-4:  #C5C5C2;
  --n-5:  #AFAFAC;  --n-6:  #96989A;  --n-7:  #808284;  --n-8:  #686B6D;
  --n-9:  #515457;  --n-10: #3A3E42;  --n-11: #24282D;  --n-12: #0F1419;

  /* ---- hårstreg og hover -------------------------------------------------
     En kant er blæk ved lav alpha, aldrig en grå værdi: så følger den
     grunden i stedet for at ligge oven på den. */
  --hair:  rgba(15, 20, 25, .08);
  --hover: rgba(15, 20, 25, .03);
}

/* ---- den neutrale skala, på Ink ------------------------------------------
   Samme tolv trin, vendt om. Et ophøjet felt på nat TRÆDER OP ad skalaen i
   stedet for at kaste en skygge — en skygge kan ikke ses på mørk grund. */
[data-ground="nat"], .nat {
  --n-1:  #0F1419;  --n-2:  #191E22;  --n-3:  #282B2F;  --n-4:  #383B3E;
  --n-5:  #4B4D50;  --n-6:  #5F6163;  --n-7:  #757779;  --n-8:  #8E8E8C;
  --n-9:  #A7A7A4;  --n-10: #C1C1BF;  --n-11: #DDDDDA;  --n-12: #FAFAF7;

  --hair:  rgba(250, 250, 247, .12);
  --hover: rgba(250, 250, 247, .06);

  /* Penge og tilstand SKAL skifte værdi her, ikke bare arves. Målt mod Ink:
     dagsværdierne ligger på 1,63-2,50:1 og er ulæselige; disse på 6,32-10,49:1.
     Et token der beholder sin dagsværdi på nat er en tilgængelighedsfejl der
     ikke ses før nogen prøver at læse den. */
  --money-in:   #34A893;
  /* handlingens gradient på nat: bright er hvilen, lyset er bright mod paper */
  --handling-flade: linear-gradient(90deg, var(--crimson-bright) 0%, var(--crimson-bright) 40%, color-mix(in srgb, var(--crimson-bright) 80%, var(--paper)) 100%);
  --handling-lille: linear-gradient(90deg, var(--crimson-bright) 0%, color-mix(in srgb, var(--crimson-bright) 75%, var(--paper)) 100%);
  --handling-stor:  linear-gradient(90deg, var(--crimson-bright) 0%, var(--crimson-bright) 20%, color-mix(in srgb, var(--crimson-bright) 55%, var(--paper)) 100%);
  /* Penge UD er brødtekstens blæk, ikke en farve — og brødtekstens blæk
     vender med grunden. Uden denne linje beholdt --money-out sin dagsværdi
     #0F1419 og stod ink-på-ink: målt 1,00:1, altså usynlig. Hvert eneste
     hævet beløb forsvandt i mørk tilstand. Fanget og rettet 17. august 2026 —
     præcis den fejl advarslen ovenfor beskriver. */
  --money-out:  #FAFAF7;
  --fn-danger:  #FFA3A6;
  --fn-warning: #E3BE78;
  --fn-success: #72D4BE;
  --fn-info:    #7CCCF6;

  /* Tilstandsfladerne vender med. Samme kulør, lav lyshed i stedet for høj,
     så nattens lyse tilstandsfarve kan stå på den.
     Målt: 8,91 / 8,44 / 8,22 / 8,67:1. */
  --fn-danger-flade:  #321314;
  --fn-warning-flade: #2F2616;
  --fn-success-flade: #182D28;
  --fn-info-flade:    #132732;

  /* Serierne beholder deres kulør og bliver løftet, ikke byttet om: en kurve
     skal være den samme kurve når skærmen skifter grund. På ink kræver 3:1 at
     L* ≥ 43,4, så dagens mørke toner kan ikke gå igen.
     Målt værste tilfælde: 22,3 ΔE (tritanopi). Kontrast 3,84-12,48:1. */
  --serie-1: #726AAA;   /* L* 48 ·  3,84:1 mod ink */
  --serie-2: #379A69;   /* L* 57 ·  5,28:1 */
  --serie-3: #C589AD;   /* L* 64 ·  6,66:1 */
  --serie-4: #ADB360;   /* L* 71 ·  8,28:1 */
  --serie-5: #9ABCFD;   /* L* 76 ·  9,68:1 */
  --serie-6: #F2CDB3;   /* L* 85 · 12,48:1 */

  /* Crimson bliver stående: #C1213F måler 3,14:1 på Ink og bærer derfor ikke
     tekst dér -- den er en FLADE på nat (knap, streg, prik), ikke en skrift.
     Skal der stå crimson tekst på mørk grund, er svaret et lysere token, ikke
     en større skriftgrad. */
}



/* ─── fundament/03-skrift/sejr-typografi.css ─── */
/* SEJR — typografi. Söhne fra Klim, og en skala der ikke kan forhandles.
 *
 * Udtrukket 16. august 2026 fra 03-TYPOGRAPHY/tokens/sejr-type.css. Værdierne
 * er kopieret, ikke skrevet af hukommelsen.
 *
 * TO REGLER BÆRER RESTEN:
 *   1. Et pengetal står ALTID i mono, med tnum og zero slået til. Ellers
 *      skifter cifrene bredde mellem to opdateringer, og en kolonne tal
 *      hopper. Et beløb er ikke brødtekst.
 *   2. Et pengetal er aldrig mindre end brødtekst. Gulvet er 11 px for al
 *      type overhovedet; et beløb starter ved 14.
 *
 * OM GULVET, RETTET 17. AUGUST 2026: filen sagde før at 11 px «er et lovkrav
 * for betalingstjenester i EU». Det passer ikke. WCAG 2.1 AA — som EN 301 549
 * indarbejder, og som EU's tilgængelighedsdirektiv (2019/882) kræver af
 * betalingstjenester — stiller INTET krav om en mindste skriftstørrelse. Den
 * stiller krav om at tekst kan forstørres 200 % (1.4.4) og om tekstafstand
 * (1.4.12). 11 px er SEJRs eget gulv, og det er et godt gulv — men det er
 * vores beslutning, ikke lovens. En brandbog der citerer en lov der ikke
 * findes, bliver citeret videre.
 *
 * Söhne er licenseret fra Klim Type Foundry. Se fonts/LICENSE.md før filerne
 * lægges på et nyt domæne — licensen tæller domæner, ikke projekter.
 */

@font-face{font-family:'Söhne';src:url("/identitet/aktiver/soehne-buch.woff2") format('woff2');font-weight:400;font-style:normal;font-display:swap}
@font-face{font-family:'Söhne';src:url("/identitet/aktiver/soehne-kraftig.woff2") format('woff2');font-weight:500;font-style:normal;font-display:swap}
@font-face{font-family:'Söhne Breit';src:url("/identitet/aktiver/soehne-breit-halbfett.woff2") format('woff2');font-weight:600;font-style:normal;font-display:swap}
@font-face{font-family:'Söhne Mono';src:url("/identitet/aktiver/soehne-mono-buch.woff2") format('woff2');font-weight:400;font-style:normal;font-display:swap}

:root {
  /* ---- snit --------------------------------------------------------------
     Tre familier, ikke flere. Breit er KUN til display og ordmærke; bruges
     den til brødtekst, forsvinder forskellen på en overskrift og en sætning. */
  --font-sans:  'Söhne', -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
  --font-breit: 'Söhne Breit', 'Söhne', sans-serif;
  --font-mono:  'Söhne Mono', ui-monospace, SFMono-Regular, monospace;

  /* ---- skala -------------------------------------------------------------
     NI trin. Der var ti indtil 17. august 2026, og faren viste sig at være
     den modsatte af den filen vogtede mod: den advarede mod et ellevte trin,
     men problemet lå i bunden. 11 · 12 · 13 · 14 er fire trin inden for 3 px
     (forhold 1,077-1,091) — for tæt til at vælges bevidst, og derfor valgt
     tilfældigt. Kittet brugte de fire nederste 18 gange og de to øverste nul.

     12 px er derfor væk. Billedtekst og hjælpetekst bruger nu 13, altså ét
     trin STØRRE — færre valg og bedre læsbarhed på én gang.

     Hvert trin har ét job. Er du i tvivl om hvilket, mangler der hierarki i
     designet, ikke en værdi her. */
  --fs-meta:    11px;   --lh-meta:    1.4;   /* KUN versal-etiketter, med spor */
  --fs-body-s:  13px;   --lh-body-s:  1.5;   /* tætte flader, tabelceller, hjælpetekst */
  --fs-body:    14px;   --lh-body:    1.5;
  --fs-lead:    16px;   --lh-lead:    1.45;
  --fs-title:   20px;   --lh-title:   1.25;
  --fs-h3:      26px;   --lh-h3:      1.15;
  --fs-h2:      34px;   --lh-h2:      1.15;
  --fs-h1:      44px;   --lh-h1:      1.05;
  --fs-display: 60px;   --lh-display: 1.05;

  /* ---- spor --------------------------------------------------------------
     Tilføjet 17. august 2026. Uden dem opfandt hver komponent sin egen: der
     lå seks forskellige værdier i UI-kittet, og .06em stod skrevet på to
     måder, så de ikke engang faldt sammen.

     Sporet følger graden omvendt: små versaler skal spredes for at kunne
     læses, store grader skal strammes for ikke at falde fra hinanden. */
  --spor-etiket:  .06em;    /* VERSAL-ETIKETTER på 11-13 px */
  --spor-brod:    0;        /* brødtekst rører man ikke */
  --spor-titel:  -.01em;    /* 20-34 px */
  --spor-display:-.015em;   /* 44-60 px */

  /* ---- mål ---------------------------------------------------------------
     Linjelængde. Stod ingen steder før, så hver side gættede.
     65 tegn er hvor øjet finder næste linje uden at lede. Tabeller og
     talkolonner er undtaget — de læses lodret, ikke i linjer. */
  --maal-brod:  65ch;
  --maal-kort:  48ch;

  /* ---- vægte -------------------------------------------------------------
     Tre. Söhne har flere; brandet bruger disse. */
  --fw-body:    400;
  --fw-medium:  500;
  --fw-display: 600;

  /* ---- tal ---------------------------------------------------------------
     Ikke en stilart. En regel. */
  --num-font:     var(--font-mono);
  --num-features: "tnum" 1, "zero" 1;
}

/* Ingen forfalskede snit. Mangler en vægt eller et kursiv, tegner browseren
   det selv ved at skråstille eller fortykke — og et syntetisk halvfedt Söhne
   ligner næsten det rigtige. Næsten er værre end forkert: det opdages ikke.
   Med denne fejler et manglende snit synligt i stedet for stille. */
:where(html) { font-synthesis: none; }

/* Et beløb sættes med denne, ikke med en klasse der ligner den. */
.belob, [data-belob] {
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  font-size: max(14px, 1em);   /* aldrig under brødtekst */
}



/* ─── fundament/07-bevaegelse/sejr-bevaegelse.css ─── */
/* SEJR IDENTITY — bevægelse.
 *
 * Skrevet 16. august 2026 som en del af SEJR UI. Flyttet i fundamentet
 * 17. august 2026: bevægelse er ikke skåret til én modtager. Terminalen,
 * websitet og en film står på de samme regler, og et kit må ikke eje noget
 * andre kits skal bruge.
 *
 * REGLEN: BEVÆGELSE ER BESKED, IKKE UDSMYKNING.
 * En overgang må kun findes hvis den svarer på et spørgsmål brugeren ellers
 * ville stille: hvor kom det fra, hvor gik det hen, hvad hører sammen. Kan
 * animationen fjernes uden at nogen bliver i tvivl om noget, skulle den ikke
 * have været der.
 *
 * OG DEN VIGTIGSTE: ET BELØB ANIMERER ALDRIG SIN VÆRDI.
 * Et tal der tæller op til saldoen er legetøj. I det sekund det ruller, viser
 * skærmen et beløb der ikke er sandt — og en handelsdrivende der skimmer
 * kolonnen aflæser et forkert tal. Beløbet skifter i ét spring, eller lader
 * være.
 */

:root {
  /* ---- varighed ----------------------------------------------------------
     Fire trin. Jo større fladen er, jo længere må den om at komme frem —
     et ark på 600px der åbner på 120ms læses som et glimt, ikke en bevægelse. */
  --tid-1: 120ms;   /* tilstand: hover, fokus, tryk */
  --tid-2: 180ms;   /* små ting ind/ud: chip, tooltip, række */
  --tid-3: 240ms;   /* ark, dialog, skuffe */
  --tid-4: 320ms;   /* sideskift, stor flade */

  /* ---- kurver ------------------------------------------------------------
     Noget der kommer FREM bremser op (ease-ud). Noget der forsvinder tager
     fart (ease-ind) — det skal ikke bede om opmærksomhed på vej ud.
     Ingen fjedre, intet overshoot: penge må ikke hoppe. */
  --ease-ud:  cubic-bezier(.2, 0, 0, 1);
  --ease-ind: cubic-bezier(.4, 0, 1, 1);
  --ease-std: cubic-bezier(.3, 0, .2, 1);

  /* ---- færdige overgange -------------------------------------------------
     Brug disse frem for at sætte varighed og kurve hver for sig. */
  --overgang-tilstand: var(--tid-1) var(--ease-std);
  --overgang-ind:      var(--tid-3) var(--ease-ud);
  --overgang-ud:       var(--tid-2) var(--ease-ind);

  /* ── De lange tider, 2. september 2026 ──────────────────────────────────
     Kom til da kittet fik levende plader og en tæller. De er ikke overgange
     — de er TEMPI, og de er langsomme med vilje: en plade der drejer på 90
     sekunder, kan man ikke SE bevæge sig, kun se at den er anderledes hver
     gang man kigger. Det er forskellen på en tekstur og en animation.

     Tælleren er 900 ms, fordi et beløb der tælles op på 320 ms er et
     lotteri: øjet skal kunne følge med, og kurven skal bremse ind i tallet. */
  --tid-taeller:        900ms;
  --tempo-omdrejning:   90s;
  --tempo-drift:        60s;
}

/* Respekter systemvalget. Dette er ikke en venlighed — for nogen udløser
   bevægelse kvalme og svimmelhed, og en betalingsapp er ikke et sted man kan
   vælge at forlade.

   REGLEN: DET DER FLYTTER SIG, STOPPER. DET DER SKIFTER FARVE, BLIVER.
   Reduceret bevægelse er ikke en ringere udgave af grænsefladen — det er den
   samme grænseflade, hvor kun bevægelsen er taget ud. En knap der ikke
   kvitterer for et tryk er i stykker, ikke tilgængelig.

   RETTET 17. AUGUST 2026. Blokken satte før `transition-duration: 1ms` på
   `*` med !important. Den ramte ALT — også farveskiftet på en knap. Filen
   holdt `--tid-1` på 120ms og skrev i kommentaren at tilstandsskift beholder
   en anelse tid; målt i Chrome med reduceret bevægelse var den faktiske
   varighed 1 ms. Kommentaren beskrev en hensigt, ikke koden.

   Nu begrænses `transition-property` i stedet: kun farve og gennemsigtighed
   må overgå, og de gør det på --tid-1. Alt der har med sted, størrelse eller
   form at gøre — transform, height, top — er ikke på listen og springer
   derfor. Det er samme svar, men uden at slå kvitteringen ihjel. */
@media (prefers-reduced-motion: reduce) {
  :root {
    --tid-2: var(--tid-1);
    --tid-3: var(--tid-1);
    --tid-4: var(--tid-1);
    --overgang-ind: var(--tid-1) var(--ease-std);
    --overgang-ud:  var(--tid-1) var(--ease-std);
  }
  *, *::before, *::after {
    animation-duration: 1ms !important;
    animation-iteration-count: 1 !important;
    scroll-behavior: auto !important;
    /* Hvidliste, ikke sortliste: en ny egenskab der kan flytte noget, er
       udelukket som udgangspunkt i stedet for at skulle huskes. */
    transition-property: color, background-color, border-color, outline-color,
                         box-shadow, fill, stroke, opacity !important;
    transition-duration: var(--tid-1) !important;
  }
}



/* ─── kits/ui/sejr-ui.css ─── */
/* SEJR UI — ét importpunkt.
 *
 * Version 3.0.0 · 22. august 2026 · lag ovenpå SEJR IDENTITY.
 *
 * 22. august 2026: materialet kom til. Lysfaldet er læst ud af app-ikonet,
 * den delte skala ud af instrument-pladen, skraveringskoden ud af hatch-
 * fliserne. Indtil da var kittet korrekt og uden kendetegn — det kunne have
 * været et hvilket som helst systems.
 *
 * ─── INDLÆSNINGSRÆKKEFØLGEN ER IKKE VALGFRI ────────────────────────────────
 *
 *   1. sejr-farver.css      (SEJR IDENTITY / fundament/02-farve)
 *   2. sejr-typografi.css   (SEJR IDENTITY / fundament/03-skrift)
 *   3. sejr-bevaegelse.css  (SEJR IDENTITY / fundament/07-bevaegelse)
 *   4. denne fil
 *
 * SEJR UI definerer INGEN farver, INGEN skriftgrader og INGEN varigheder.
 * Den definerer rum, radius, flader, løft og glas — og giver de rå tokens fra
 * identiteten semantiske navne. Bevægelsen lå her indtil 17. august 2026 og
 * hører i fundamentet: terminalen og websitet står på de samme kurver. Findes en værdi begge steder, driver de fra
 * hinanden; det er ikke en hypotese, det er målt i seks apps 16. august 2026.
 *
 * Mangler identiteten, fejler dette lag stille: var() falder tilbage til
 * ingenting, og fladerne bliver gennemsigtige. Det er med vilje synligt.
 */


/* ─── kits/ui/01-tokens/sejr-rum.css ─── */
/* SEJR UI — rum og radius. Laget OVENPÅ fundamentet.
 *
 * Skrevet 16. august 2026. Denne fil definerer INGEN farver og INGEN
 * skriftgrader — de kommer fra SEJR IDENTITY og må ikke gentages her.
 * Gentages en værdi to steder, driver de fra hinanden. Det er ikke en teori:
 * seks apps har allerede gjort det, målt samme dag som denne fil blev skrevet.
 *
 * REGLEN DER BÆRER RESTEN: RUMMET ER 4-GITTERET.
 * Hvert eneste mellemrum i grænsefladen er et multiplum af 4. Ikke fordi 4 er
 * magisk, men fordi et gitter kun virker hvis der ikke findes undtagelser —
 * én 5'er, og resten af skærmen står skævt uden at nogen kan se hvorfor.
 */

:root {
  /* ---- rum ---------------------------------------------------------------
     Tolv trin. Under 8 er det detaljer inde i en komponent; over 32 er det
     afstand MELLEM ting. Mangler du et trin imellem, mangler du hierarki —
     samme svar som skriftskalaen giver i fundament/03-skrift. */
  --rum-0:   0;
  --rum-1:   2px;   /* hårfin: ikon mod tekst, optisk justering */
  --rum-2:   4px;   /* gitterets grundenhed */
  --rum-3:   8px;   /* inde i en kontrol */
  --rum-4:  12px;   /* tæt indhold, tabelceller */
  --rum-5:  16px;   /* standard: kortets indre luft */
  --rum-6:  20px;
  --rum-7:  24px;   /* mellem beslægtede blokke */
  --rum-8:  32px;   /* mellem sektioner */
  --rum-9:  40px;
  --rum-10: 48px;   /* mellem hovedområder */
  --rum-11: 64px;
  --rum-12: 80px;   /* sidens yderste luft */

  /* ---- radius ------------------------------------------------------------
     Radius er ikke pynt — den siger hvor stor fladen er. Små ting får små
     hjørner. En 4px radius på et ark og en 4px radius på en chip får arket
     til at ligne en fejl.

     Tokenet hedder --hjorne-* og ikke --radius-*, fordi Tailwind v4 ejer
     --radius-namespacet i @theme. Kaldte vi dem det samme, ville mapningen
     blive selvrefererende (--radius-1: var(--radius-1)) og CSS ville smide
     hele erklæringen væk — stille, uden fejl nogen steder. */
  /* V4, 27. august 2026 — HJØRNELOVEN. Morris: kittet lignede alle
     andres, og en del af hvorfor var hjørnerne: 10-14 px runder er
     app-plastik. Husets forbillede er kortet — ISO-hjørnet er 3,71 % af
     kortets bredde, præcist, ikke blødt — og aktiebrevets ramme. Skalaen
     er strammet tilsvarende. OG: pillen (--hjorne-fuld) er forbeholdt
     ting der GEOMETRISK er runde — kontaktens knap, prikken, avataren,
     chippens kryds. Aldrig knapper, badges eller vælgere: en pille er
     de andres formsprog. */
  --hjorne-1:    3px;   /* chip, badge, farveprøve */
  --hjorne-2:    5px;   /* input, tæt knap */
  --hjorne-3:    6px;   /* knap, indre kort */
  --hjorne-4:    8px;   /* kort */
  --hjorne-5:   12px;   /* ark, panel */
  --hjorne-6:   16px;   /* stor flade, fuldskærmsark */
  --hjorne-fuld: 999px; /* KUN geometrisk rundt: kontaktknap, prik, avatar */

  /* Mærket er undtagelsen: app-ikonets squircle er rx=115 på 512 = 22,46 %.
     Skal noget gengive ikonets form, bruges FORHOLDET, ikke en fast px-værdi —
     ellers holder formen kun i én størrelse. */
  --hjorne-maerke: 22.46%;

  /* ---- kontrolhøjder -----------------------------------------------------
     Én skala for hvor høj en klikbar ting er. Densiteten herunder skifter
     hvilken der gælder; komponenter refererer ALTID --kontrol-h, aldrig et tal. */
  --kontrol-h-s:  32px;
  --kontrol-h-m:  40px;
  --kontrol-h-l:  48px;

  /* ---- densitet: komfortabel (standard) ----------------------------------
     Kontorbrug, mus og tastatur. Erhvervskontoen sidder her. */
  --kontrol-h:      var(--kontrol-h-m);
  --kontrol-px:     var(--rum-5);
  --kontrol-gap:    var(--rum-3);
  --raekke-h:       44px;          /* tabelrække */
  --felt-px:        var(--rum-4);
  --touch-min:      var(--kontrol-h-m);
}

/* ---- densitet: kompakt ---------------------------------------------------
   Datatunge skærme — depotlister, afstemning, lange tabeller. Teksten bliver
   IKKE mindre; kun luften omkring den. 11px-gulvet i fundament/03-skrift er et
   lovkrav for betalingstjenester i EU, ikke en anbefaling, og densitet er
   ingen undtagelse. */
[data-taethed="kompakt"], .taethed-kompakt {
  --kontrol-h:   var(--kontrol-h-s);
  --kontrol-px:  var(--rum-4);
  --kontrol-gap: var(--rum-2);
  --raekke-h:    36px;
  --felt-px:     var(--rum-3);
}

/* ---- densitet: berøring --------------------------------------------------
   POS, terminal, telefon i hånden. 48px er gulvet for et mål der rammes med
   en finger — ikke 44, fordi en POS betjenes i fart, ofte skævt, nogle gange
   med handske. Alt klikbart SKAL opfylde --touch-min her. */
[data-taethed="beroring"], .taethed-beroring {
  --kontrol-h:   var(--kontrol-h-l);
  --kontrol-px:  var(--rum-6);
  --kontrol-gap: var(--rum-4);
  --raekke-h:    56px;
  --felt-px:     var(--rum-5);
  --touch-min:   var(--kontrol-h-l);
}

/* ══ KUN OPLÆST ═════════════════════════════════════════════════════════════
   Tekst der findes for skærmlæseren og ikke for øjet.

   Den kom ind 23. august 2026 sammen med beslutningen om `÷`: en skærmlæser
   udtaler `÷` som «divided by», så «÷ 186.000 kr.» bliver læst op som et
   REGNESTYKKE og ikke som et beløb. Glyffen er præsentation; ordet er
   oplysningen, og de skal derfor stå hver for sig:

     <span aria-hidden="true">÷ </span><span class="kun-oplaest">minus </span>

   `clip-path` frem for `clip`, og 1×1 px frem for 0×0: et element uden
   udstrækning springes over af nogle skærmlæsere. `white-space: nowrap`
   forhindrer at et langt ord ombrydes til en usynlig spalte der alligevel
   skubber til layoutet. */
.kun-oplaest {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}



/* ─── kits/ui/02-materiale/sejr-flader.css ─── */
/* SEJR UI — flader, tekstroller og løft.
 *
 * Skrevet 16. august 2026. Kræver at sejr-farver.css er indlæst FØRST.
 *
 * DENNE FIL DEFINERER INGEN FARVEVÆRDIER. Ikke én hex. Alt herunder peger på
 * --n-1 … --n-12 fra fundament/02-farve/sejr-farver.css.
 *
 * ─── HVORFOR SELEKTOREN ER SÅ MÆRKELIG ─────────────────────────────────────
 *
 * Man skulle tro at dette var nok:
 *
 *     :root { --flade: var(--n-1); }
 *
 * Det er det ikke, og fejlen er stille. En custom property opløser sin var()
 * DÉR HVOR ERKLÆRINGEN STÅR — ikke dér hvor den bruges. Står --flade kun på
 * :root, bliver den regnet ud mod rodens --n-1 (#FAFAF7) én gang, og det
 * FÆRDIGE resultat arves nedad. Når identiteten så sætter --n-1: #0F1419 på
 * [data-ground="nat"], kører vores erklæring aldrig igen. Fladen bliver hvid
 * på nat, uden en eneste fejlmeddelelse nogen steder.
 *
 * Målt 16. august 2026: præcis dét skete. Derfor gentages selektorlisten fra
 * identiteten herunder, så erklæringen kører igen på nat-elementet og
 * opløses mod nat-elementets egen --n-1.
 *
 * Ændrer identiteten sin nat-selektor, SKAL denne liste følge med.
 */

:root,
[data-ground="nat"],
.nat {
  /* ---- flader ------------------------------------------------------------
     Tre trin. Grunden, den løftede flade, og den nedsænkede.
     Dag: #FAFAF7 → #ECECE9 → #D9D9D6.   Nat: #0F1419 → #191E22 → #282B2F. */
  --flade:        var(--n-1);   /* sidens grund */
  --flade-2:      var(--n-2);   /* kort, panel, række der er løftet */
  --flade-3:      var(--n-3);   /* nedsænket: input-brønd, tom tilstand */

  /* ---- tekstroller -------------------------------------------------------
     Målt 16. august 2026 mod --flade og --flade-2, i begge grunde.
     Tallene står her fordi de er regnet, ikke skønnet. */
  --tekst:        var(--n-12);  /* 17,70:1 / 15,64:1 — brødtekst, tal, titler */
  --tekst-2:      var(--n-9);   /*  7,29:1 /  6,44:1 — sekundært, etiketter   */
  --tekst-3:      var(--n-8);   /*  5,13:1 /  4,53:1 — tertiært. GULVET.      */

  /* --n-7 er MED VILJE ikke en tekstrolle. Den måler 3,69:1 på dag og 4,12:1
     på nat — under AA's 4,5:1 for brødtekst. Den må bruges til ikoner,
     skillelinjer og dekorativ grafik, aldrig til noget der skal læses.
     SEJR er en betalingstjeneste; tilgængelighed er et lovkrav her, ikke smag. */
  --dekor:        var(--n-7);

  /* ---- kanter ------------------------------------------------------------
     Fra identiteten: blæk ved lav alpha, så kanten følger grunden i stedet
     for at ligge oven på den. Vender selv med på nat. */
  --kant:         var(--hair);
  --kant-staerk:  var(--n-4);
  --flade-hover:  var(--hover);

  /* ---- handling ----------------------------------------------------------
     Crimson måler 5,65:1 på papir og 3,14:1 på ink. Derfor: på dag bærer den
     tekst, på nat er den en FLADE — knap, streg, prik — aldrig en skrift.
     Skal der stå crimson tekst på mørk grund, er svaret --crimson-bright,
     ikke en større skriftgrad. */
  --handling:        var(--crimson);
  /* Hover går NEDAD i skalaen, ikke opad. --crimson-bright bærer kun
     papirtekst med 4,14:1 som flade — under AA. Med --crimson-shade stiger
     kontrasten til 8,29:1 når man rører knappen, og --crimson-deep til
     12,87:1 når man trykker. En tilstand må aldrig gøre en knap sværere at
     læse. Rettet 17. august 2026; se rollelisten i sejr-farver.css. */
  --handling-hover:  var(--crimson-shade);
  --handling-tryk:   var(--crimson-deep);
  --paa-handling:    var(--paper);   /* tekst PÅ en crimson flade */
}

/* ---- V4, 27. august 2026: PAPIRET FIK SIN VARME --------------------------
 *
 * Morris: kittet lignede alle andres. En del af hvorfor var fladerne — den
 * løftede flade var kold grå (--n-2), mens identiteten hele tiden har haft
 * CREAM: «papir med varme: dokumenter, tryk, kortbagsider». Et kort i
 * appen ER husets dokument, så det står nu på dokumentpapir.
 *
 * Kun papir-grunden skifter. Nat gen-erklærer sine egne trin — det er
 * arvefælden fra filens top: uden gen-erklæringen ville nat arve papirets
 * FÆRDIGT opløste cream og male natkort lyse, stille, uden fejl.
 *
 * Målt: --tekst (#0F1419) på cream (#F2F1ED) er 16,38:1; --tekst-3 (#686B6D)
 * er 4,75:1 — begge over gulvet fra rollelisten ovenfor. */
:root {
  --flade-2: var(--cream);
  --flade-3: var(--n-2);
}
[data-ground="nat"],
.nat {
  --flade-2: var(--n-2);
  --flade-3: var(--n-3);
}

/* ---- husets flade: porcelæn --------------------------------------------
 *
 * Skrevet 14. september 2026. Porcelæn kom i fundamentet 12. september som
 * crimsons makker, og indtil i dag fandtes den ikke på nogen skærm: kittets
 * flader var tre gråtoner, og appen var grå med én crimson knap.
 *
 * ROLLEN: den ene flade pr. skærm der er SEJR's. Saldoblokken på hjem. Den
 * nyeste af de små sejre. Første dag. Ikke en anden gråtone, og ikke en
 * flade man må bruge hvor som helst: én pr. skærm, ellers er den ingen.
 *
 * PARRET: crimson bliver hvor den er, som handlingen. Morris, samme dag:
 * «porcelæn og crimson skal kunne eksistere på samme tid». De må gerne stå
 * i samme synsfelt; de må ikke stå på samme flade. Crimson på porcelæn
 * måler 3,2:1 og bærer ikke tekst.
 *
 * TEKSTEN PÅ DEN ER BLÆK, også på nat. Det er ikonets logik: blæk på
 * porcelæn. Derfor sætter .flade-hus sine egne tekstroller, så en komponent
 * inde i den ikke arver nattens lyse tekst og forsvinder. Målt: blæk på
 * porcelæn 12,0:1, på porcelæn-lys 12,8:1. */
:root,
[data-ground="nat"],
.nat {
  --flade-hus:  var(--porcelaen);
  --tekst-hus:  var(--ink);
}
[data-ground="nat"],
.nat {
  --flade-hus:  var(--porcelaen-lys);
}
.flade-hus {
  background-color: var(--flade-hus);
  color: var(--tekst-hus);
  --flade:        var(--flade-hus);
  --flade-2:      var(--flade-hus);
  --flade-3:      color-mix(in srgb, var(--tekst-hus) 8%, var(--flade-hus));
  --tekst:        var(--tekst-hus);
  --tekst-2:      color-mix(in srgb, var(--tekst-hus) 78%, var(--flade-hus));
  --tekst-3:      color-mix(in srgb, var(--tekst-hus) 64%, var(--flade-hus));
  --kant:         color-mix(in srgb, var(--tekst-hus) 18%, transparent);
  --kant-staerk:  color-mix(in srgb, var(--tekst-hus) 34%, transparent);
  --dekor:        color-mix(in srgb, var(--tekst-hus) 55%, var(--flade-hus));
  /* Kortets varme og lys er tegnet til gråt; på husets flade er der intet at
     varme. Lysfaldet bliver, for det er materialets lov. */
  --kort-varme:   none;
  --kort-lys:     none;
  --kort-kant-top: var(--kant);
  --kort-kant-bund: var(--kant);
}

/* ---- grunden skal males, også når den skifter midt på siden --------------
 *
 * FUNDET 22. august 2026, af `eksempler.html`.
 *
 * `sejr-ui.css` maler grunden på :where(html). Det er nok så længe hele siden
 * har samme grund. Men et ark der viser en natskærm midt i en dagsside —
 * eller en app der lader ét panel være mørkt — sætter [data-ground="nat"] på
 * en BEHOLDER, og så skete der indtil nu dette:
 *
 *   · --flade og --tekst fik rigtigt nok nattens værdier på beholderen,
 *   · men beholderens egen `color` var allerede arvet fra <body>, hvor
 *     var(--tekst) var opløst mod dagens --n-12. Altså blæk.
 *
 * Komponenterne skjulte fejlen, fordi næsten alle sætter deres egen farve.
 * Det der IKKE gør — alt der bygger på currentColor — blev usynligt: den
 * delte skala stod mørk på mørk grund og forsvandt sporløst.
 *
 * Derfor maler krogen sig selv. :where() giver den nul vægt, så enhver
 * komponent stadig vinder over den.
 */
:where([data-ground="nat"], .nat, [data-ground="dag"], .dag) {
  color: var(--tekst);
}

/* MEN ALDRIG PAA RODEN, og det er ikke en detalje.
 *
 * FUNDET 23. august 2026, i hq-sejr-co. Den satte krogen paa <html> for at
 * vende hele paletten -- helt efter bogen -- og Boersen-tapetet forsvandt.
 *
 * Mekanikken er en af de faa i CSS hvor rodelementet opfoerer sig anderledes
 * end alt andet:
 *
 *   Har <html> INGEN baggrund, propagerer <body>'s til laerredet, og body
 *   maler saa ingen kasse selv. Et element med `z-index: -10` inde i body
 *   ligger dermed oven paa laerredet og ses.
 *
 *   Faar <html> en baggrund, gaar DEN til laerredet -- og body maler nu sin
 *   egen som en ugennemsigtig kasse. Negative z-index males FOER body's
 *   baggrund i maleraekkefoelgen, saa tapetet forsvinder under den.
 *
 * Maalt i browseren: uden krogen er html transparent og body #0F1419; med
 * krogen er html #FAFAF7 OG body #0F1419. Ingen fejl, ingen advarsel, bare
 * et billede der er vaek.
 *
 * Roden males derfor af `sejr-ui.css`' egen `:where(html)`-regel, som en app
 * kan lade vaere med at hente hvis den selv maler grunden. Krogen paa roden
 * skal stadig vende TOKENS -- det goer den i sejr-farver.css -- og teksten,
 * som ovenfor. Bare ikke baggrunden.
 *
 * `:where(:not(html))` og ikke `:not(html)`: uden det ydre :where() vejer
 * selektoren (0,0,1), og hele pointen med denne blok er at den vejer nul, saa
 * enhver komponent stadig vinder over den. */
:where([data-ground="nat"], .nat, [data-ground="dag"], .dag):where(:not(html)) {
  background-color: var(--flade);
}

/* ---- løft: dag -----------------------------------------------------------
   Papir kan bære en skygge. Fire trin, alle med samme lysretning: lyset
   kommer ovenfra, så skyggen falder nedad.

   6. SEPTEMBER 2026: SKYGGEN BLEV TIL TRE LAG, OG DEN BLEV TIL BLÆK.
   Morris, med kataloget åbent lige efter at knappen fik dybde: fladerne
   var det næste der var fladt. Den gamle skygge var ét blødt lag ved
   5–8 %, og på cream mod papir — hvor kortet er MØRKERE end grunden — læses
   det som en plet, ikke som noget der ligger oven på bordet. Nu har hvert
   løft tre lag med hver sin opgave: en kontaktskygge på 1 px der holder
   kanten skarp, en nær skygge der giver fladen tykkelse, og en blød der
   løfter den fra grunden. Det er den opbygning glasset har haft siden
   16. august; kortet fik den aldrig.

   Og blækket kommer nu fra --ink gennem color-mix, ikke som rgba() skrevet
   i hånden. Mappens regel er at intet hex står her; denne blok var den ene
   af to der brød den. Den anden var glasset, rettet samme dag.

   Blokken står på :root ALENE — modsat farverne ovenfor. --ink og --paper
   vender ikke om på nat, så der er intet at gen-opløse; nat-blokken herunder
   erstatter værdierne helt, fordi det er en anden fysik. */
:root {
  --loft-1: 0 1px 1px color-mix(in srgb, var(--ink) 6%, transparent),
            0 1px 3px color-mix(in srgb, var(--ink) 5%, transparent);
  --loft-2: 0 1px 1px color-mix(in srgb, var(--ink) 6%, transparent),
            0 3px 6px -2px color-mix(in srgb, var(--ink) 7%, transparent),
            0 12px 24px -12px color-mix(in srgb, var(--ink) 14%, transparent);
  --loft-3: 0 1px 2px color-mix(in srgb, var(--ink) 7%, transparent),
            0 6px 12px -4px color-mix(in srgb, var(--ink) 9%, transparent),
            0 20px 40px -16px color-mix(in srgb, var(--ink) 18%, transparent);
  --loft-4: 0 2px 4px color-mix(in srgb, var(--ink) 7%, transparent),
            0 12px 24px -8px color-mix(in srgb, var(--ink) 12%, transparent),
            0 32px 64px -20px color-mix(in srgb, var(--ink) 24%, transparent);
  --saenket: inset 0 1px 2px color-mix(in srgb, var(--ink) 8%, transparent),
             inset 0 0 0 1px color-mix(in srgb, var(--ink) 4%, transparent);
}

/* ---- løft: nat -----------------------------------------------------------
   "En skygge kan ikke ses på mørk grund" står ordret i sejr-farver.css, og
   det er derfor denne blok findes: løft er IKKE en omvendt værdi, det er en
   anden fysik. På nat kommer dybden af to ting — en tynd lysstribe i
   OVERKANTEN, hvor lyset ville ramme en hævet kant, og en rigtig mørk skygge
   under, der forankrer fladen. Fladen træder desuden op ad gråskalaen, præcis
   som identiteten foreskriver.

   Her er gentagelsen ægte: værdierne er andre, ikke bare omvendte. Skyggen
   var rent sort til 6. september 2026; nu er den --ink, husets eget mørke,
   fem procentpoint tættere for at veje det samme. */
[data-ground="nat"], .nat {
  --loft-1: inset 0 1px 0 color-mix(in srgb, var(--paper) 7%, transparent),
            0 1px 2px color-mix(in srgb, var(--ink) 45%, transparent);
  --loft-2: inset 0 1px 0 color-mix(in srgb, var(--paper) 7%, transparent),
            0 1px 2px color-mix(in srgb, var(--ink) 40%, transparent),
            0 8px 20px -10px color-mix(in srgb, var(--ink) 65%, transparent);
  --loft-3: inset 0 1px 0 color-mix(in srgb, var(--paper) 7%, transparent),
            0 2px 4px color-mix(in srgb, var(--ink) 45%, transparent),
            0 18px 36px -14px color-mix(in srgb, var(--ink) 70%, transparent);
  --loft-4: inset 0 1px 0 color-mix(in srgb, var(--paper) 9%, transparent),
            0 4px 8px color-mix(in srgb, var(--ink) 50%, transparent),
            0 32px 64px -20px color-mix(in srgb, var(--ink) 75%, transparent);
  --saenket: inset 0 2px 5px color-mix(in srgb, var(--ink) 60%, transparent),
             inset 0 -1px 0 color-mix(in srgb, var(--paper) 7%, transparent);
}

/* ---- fokus ---------------------------------------------------------------
   Én fokusring for hele systemet. Den skal kunne ses på begge grunde og oven
   på både flade og glas, derfor to lag: en mørk/lys kerne og en ydre ring i
   grundens egen farve, så den aldrig forsvinder ind i det den ligger på.
   Fjern aldrig outline uden at sætte noget i stedet — tastaturbrug er den
   eneste vej gennem appen for nogle brugere.

   Samme selektorliste som farverne ovenfor, og af præcis samme grund: ringen
   er bygget af --flade og --tekst, så den skal erklæres igen på nat for at
   blive opløst mod nat-værdierne. */
:root,
[data-ground="nat"],
.nat {
  --fokus-ring: 0 0 0 2px var(--flade), 0 0 0 4px var(--tekst);

  /* Sløret bag et ark. Altid blæk, også på nat — et slør er fravær af lys,
     ikke en flade der skal vende om. Det er et token og ikke en rgba() gemt
     nede i en komponent, så der findes ét sted at ændre det. */
  --slor: color-mix(in srgb, var(--ink) 55%, transparent);
}
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
  outline: none;
  box-shadow: var(--fokus-ring);
  border-radius: var(--hjorne-2);
}



/* ─── kits/ui/02-materiale/sejr-lys.css ─── */
/* SEJR UI — lysfaldet. Materialeloven, læst ud af mærket.
 *
 * Skrevet 22. august 2026.
 *
 * ─── HVOR DEN KOMMER FRA ───────────────────────────────────────────────────
 *
 * Den er ikke opfundet til lejligheden. Den står allerede i
 * `fundament/01-maerke/sejr-icon.svg`, som blev valgt 16. august 2026:
 *
 *     <linearGradient id="lit" x1="0" y1="0" x2="0" y2="1">
 *       <stop offset="0"    stop-color="#FAFAF7" stop-opacity="0.13"/>
 *       <stop offset="0.55" stop-color="#FAFAF7" stop-opacity="0"/>
 *
 * Altså: lyset kommer OVENFRA, i papir, ved lav alpha, og er væk ved 55 %.
 * Intet reflekspunkt. Ingen bevel. Intet korn. Ikonet er hele materialeloven
 * skrevet ned i fire linjer, og indtil nu var appen ikke lavet af det samme.
 *
 * ─── HVORFOR DAGEN OGSÅ HAR ET LYSFALD (fra 6. september 2026) ─────────
 *
 * Indtil 6. september 2026 var `--lysfald` `none` på dag, med argumentet at
 * papir løftes med skygge alene. Det holdt så længe den løftede flade var
 * LYSERE end grunden. Men siden V4 (27. august) står kortet på cream, og
 * cream er mørkere end papir: et kort uden lys i overkanten læses som en
 * plet i bordet, ikke som noget der ligger oven på det. Morris så det med
 * kataloget åbent, lige efter at knappen havde fået sin dybde.
 *
 * Dagens lysfald er derfor det samme fald som nattens, men i papir mod
 * cream: en hårstreg på 1 px i overkanten hvor lyset rammer — det ikonet
 * kalder `lit` — og et fald der er væk ved 55 %. Stadig intet reflekspunkt,
 * ingen bevel. Fordi det ligger i LYSFALDET og ikke i løftet, rammer det
 * kun de flader der er lavet af papir: tooltip'en, tabellens
 * handlingslinje og betalingskortet er blæk, bruger `--loft-*` uden
 * lysfald (kortet omdefinerer sit eget), og får ingen hvid streg.
 *
 * En komponent skriver stadig
 *
 *     background-image: var(--lysfald);
 *
 * ÉN gang, uden en grundselektor, og får det rigtige begge steder.
 *
 * ─── HVORFOR DER IKKE STÅR EN FARVE I FILEN ────────────────────────────────
 *
 * Reglen for denne mappe er at der ikke skrives hex her. `sejr-glas.css`
 * brød den med rgba(250,250,247,…) skrevet i hånden fra 16. august til
 * 6. september 2026: papir stod to steder, og to steder driver. Her — og
 * nu også dér — er det løst med color-mix, så papiret bliver ved med at komme
 * fra `--paper` i identiteten. Ændres papiret, følger lyset med.
 */

:root {
  /* Dag: papir mod cream. Hårstregen først, så faldet. */
  --lysfald: linear-gradient(
      180deg,
      color-mix(in srgb, var(--paper) 90%, transparent) 0,
      color-mix(in srgb, var(--paper) 90%, transparent) 1px,
      color-mix(in srgb, var(--paper) 55%, transparent) 1px,
      color-mix(in srgb, var(--paper) 0%,  transparent) 55%);
  --lysfald-svag: linear-gradient(
      180deg,
      color-mix(in srgb, var(--paper) 30%, transparent) 0%,
      color-mix(in srgb, var(--paper) 0%,  transparent) 55%);

  /* Den lyse hårstreg som KANT — bruges hvor en flade ikke har et lysfald
     at lægge den i. På dag er det den stærkere blækkant. */
  --kant-lyst:    var(--kant-staerk);
}

/* Samme selektorliste som resten af mappen, og af samme grund: en custom
   property opløser sin var() dér hvor erklæringen står. --kant-lyst peger på
   --kant-staerk → --n-4, som vender om på nat; stod erklæringen kun på :root,
   ville nattens værdi blive dagens. Se hovedet af sejr-flader.css. */
[data-ground="nat"],
.nat {
  /* 11,5 % og ikke ikonets 13 %: ikonet er 512 px og ses som ét objekt, en
     flade er 400-1200 px bred og ses ved siden af tre andre. Faldet til nul
     ved 55 % er uændret — det er DÉT der gør at fladen ser krum ud i stedet
     for at se ud som om den har en lysere kant limet på. */
  --lysfald: linear-gradient(
      180deg,
      color-mix(in srgb, var(--paper) 11.5%, transparent) 0%,
      color-mix(in srgb, var(--paper) 0%,    transparent) 55%);

  /* Til flader der ligger LAVERE end grunden — en nedsænket brønd, en graf
     der er baggrund for noget andet. Mindre lys, samme fald. */
  --lysfald-svag: linear-gradient(
      180deg,
      color-mix(in srgb, var(--paper) 6%, transparent) 0%,
      color-mix(in srgb, var(--paper) 0%, transparent) 55%);

  --kant-lyst: color-mix(in srgb, var(--paper) 20%, transparent);
}

/* ---- fladen som materiale ------------------------------------------------
   En klasse for det der ikke er en komponent: en vilkårlig flade der skal
   være lavet af det samme som resten. Komponenterne bruger `--lysfald`
   direkte og har ikke brug for denne. */
.flade-lys {
  background-color: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant);
  border-radius: var(--hjorne-4);
}
.flade-lys-dyb {
  background-color: var(--flade);
  background-image: var(--lysfald-svag);
}



/* ─── kits/ui/02-materiale/sejr-skala.css ─── */
/* SEJR UI — den delte skala. Husets kendetegn i grænsefladen.
 *
 * Skrevet 22. august 2026.
 *
 * ─── HVAD DEN ER, OG HVOR DEN KOMMER FRA ───────────────────────────────────
 *
 * En grundlinje med en stregning pr. enhed og hver femte ført helt igennem.
 * Den er ikke tegnet til lejligheden: det er den lineære del af
 * `instrument()` i `fundament/05-gravure/byg-gravure.py` — «graferens rette
 * akse, som en korde inde i limben».
 *
 * `fundament/09-dataviz/SEJR-Dataviz.md` regel 6 siger allerede med ord hvad
 * den betyder: «aksen er en delt skala, ikke et gitter. Et fuldt gitter
 * lægger streger hen over dataene, en skala står ved siden af og lader fladen
 * være.» Her får den sætning en form, og formen bliver husets kendetegn:
 * under overskriften, langs kortets underkant, under tabellen, som grafens
 * akse. Fladen er MÅLT, ikke bare en firkant.
 *
 * ─── HVORFOR DEN ER REN CSS OG IKKE EN GENERERET SVG ───────────────────────
 *
 * Første udkast lagde den ind som to data-URI'er — én i blæk, én i papir —
 * skrevet af en generator. Det virkede, og det var forkert af tre grunde:
 * farven blev bagt ind (og denne mappe skriver ingen farver), skalaen kunne
 * ikke arve `currentColor` fra det den lå i, og der skulle en generator til
 * for tre gradienter.
 *
 * Her er den tre baggrundslag: hovedstregningerne, de små, og grundlinjen.
 * Alle tre i `currentColor`, så skalaen tager farve efter det den ligger i og
 * vender med på nat af sig selv.
 *
 * ─── HVOR DEN ALDRIG MÅ LIGGE ──────────────────────────────────────────────
 *
 * Ikke hen over et beløb og ikke hen over en postering. Det er den samme lov
 * som for gravuren i `fundament/05-gravure`: mønstret parterer sig OMKRING
 * tallet og lader midten være. Skalaen er en KANT — over, under eller ved
 * siden af — aldrig en grund.
 */

:root {
  --skala-h:       13px;   /* båndets højde */
  --skala-delt:    10px;   /* afstand mellem to små stregninger */
  --skala-styrke:  .34;    /* dagens: blæk på papir tåler lidt mere */
}
[data-ground="nat"],
.nat {
  /* Nat: en lys streg på mørk grund lyser optisk mere end den måler.
     Samme forhold som stregvægten i gravuren — se `--gk` i byg-gravure.py. */
  --skala-styrke: .30;
}

.skala {
  height: var(--skala-h);
  opacity: var(--skala-styrke);
  flex: none;

  /* Tre lag, alle bundstillede: hoved, små, grundlinje.
     Lagenes indbyrdes vægt er de samme tre tal som pladen tegner med
     (0,7 / 0,35 / 0,55) — ellers er det ikke den samme skala, det er bare
     nogle streger. */
  background-repeat: no-repeat;
  background-position: left bottom;
  background-size:
      100% calc(var(--skala-h) * .72),
      100% calc(var(--skala-h) * .34),
      100% 1px;
  background-image:
      repeating-linear-gradient(90deg,
          color-mix(in srgb, currentColor 70%, transparent) 0 1px,
          transparent 1px calc(var(--skala-delt) * 5)),
      repeating-linear-gradient(90deg,
          color-mix(in srgb, currentColor 35%, transparent) 0 1px,
          transparent 1px var(--skala-delt)),
      linear-gradient(
          color-mix(in srgb, currentColor 55%, transparent),
          color-mix(in srgb, currentColor 55%, transparent));
}

/* Stregningerne peger NEDAD. Til en skala der ligger OVER indholdet — under
   en overskrift, over en tabel — så tænderne vender ind mod det de måler.
   Kun positionen skifter: lagene og deres højder er de samme tre, ellers er
   det ikke den samme skala vendt om, det er en anden skala. */
.skala-ned { background-position: left top; }

/* Kortets fod: skalaen ført helt ud til kanten, uanset kortets polstring.
   Læg den som SIDSTE barn i kortet. */
.skala-fod {
  margin-left:  calc(var(--rum-6) * -1);
  margin-right: calc(var(--rum-6) * -1);
  margin-top:   var(--rum-5);
  opacity: calc(var(--skala-styrke) * .72);
}

/* Svagere udgave — når skalaen er ren rytme og ikke skal ses som en akse. */
.skala-svag { opacity: calc(var(--skala-styrke) * .6); }

/* Reduceret gennemsigtighed betyder ikke reduceret mønster, men en skala der
   er så svag at den flimrer, er værre end ingen. */
@media (prefers-contrast: more) {
  :root, [data-ground="nat"], .nat { --skala-styrke: .55; }
}



/* ─── kits/ui/02-materiale/sejr-skravering.css ─── */
/* SEJR UI — skraveringskoden som maske. GENERERET.
 *
 * ██ RET ALDRIG DENNE FIL I HÅNDEN. Ret `byg-ui.py` og kør den igen.
 *
 * Fliserne er læst ud af `fundament/05-gravure/byg-gravure.py` og lagt ind
 * som masker, ikke som billeder: mærket tager farve efter det det ligger i,
 * via `background-color: currentColor`. Der står derfor ikke én farve i
 * filen — heller ikke selvom den er genereret.
 *
 * DEN LOV MÆRKET FINDES FOR:
 *   Farve er bekræftelse, aldrig selve signalet. Cirka hver tolvte mand ser
 *   rød og grøn ens, og `--fn-success` og `--fn-info` ligger 4,5 ΔE fra
 *   hinanden under tritanopi. En skravering er ikke en farve — den overlever
 *   dikromasi, gråtone, en fotokopi og en fax.
 *
 *   Men skraveringen står ALDRIG alene heller. Rækkefølgen er:
 *   ord først, så farve, så skravering. Tre bærere af samme besked.
 */

.kode {
  display: inline-block;
  width: 16px;
  height: 16px;
  border-radius: var(--hjorne-1);
  flex: none;

  /* Farven kommer fra det mærket ligger i. Ikke fra denne fil. */
  background-color: currentColor;

  mask-repeat: repeat;
  mask-size: 8px 8px;
  mask-position: center;
}

/* INGEN -webkit-maskepræfiks, og det er et valg.
   Kittet bruger allerede color-mix() i `sejr-lys.css` og `sejr-skala.css`,
   og Tailwind v4 — som seks af syv apps kører — sætter selv gulvet ved
   Safari 16.4. Umaskeret `mask-image` har været i Safari siden 15.4, altså
   under det gulv. Præfikset ville fordoble filen (hver data-URI skrevet to
   gange) for browsere der alligevel ikke kan køre resten af kittet.

   Uden maskestøtte falder mærket tilbage til en fyldt firkant i tilstandens
   egen farve. Så er koden væk, men ordet og farven står stadig — og de var
   de to første bærere alligevel. Aldrig et halvt resultat. */
@supports not (mask-image: none) {
  .kode { opacity: .55; }
}

/* lodret    — --fn-danger  · kategori 1 */
.kode-lodret {
  mask-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDgiIGZpbGw9Im5vbmUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNNC4wMCAtMC41MEw0LjAwIDguNTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjAuOTYiIG9wYWNpdHk9IjAuNyIgc3R5bGU9Ii0tdzowLjk2O3N0cm9rZS13aWR0aDpjYWxjKHZhcigtLXcpICogdmFyKC0tZ2ssIDEpKSIvPjwvc3ZnPg==);
}

/* vandret   — --fn-info    · kategori 2 */
.kode-vandret {
  mask-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDgiIGZpbGw9Im5vbmUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNLTAuNTAgNC4wMEw4LjUwIDQuMDAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjAuOTYiIG9wYWNpdHk9IjAuNyIgc3R5bGU9Ii0tdzowLjk2O3N0cm9rZS13aWR0aDpjYWxjKHZhcigtLXcpICogdmFyKC0tZ2ssIDEpKSIvPjwvc3ZnPg==);
}

/* diagonal  — --fn-success · --money-in · kategori 3 */
.kode-diagonal {
  mask-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDgiIGZpbGw9Im5vbmUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNLTAuNTAgOC41MEw4LjUwIC0wLjUwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjk2IiBvcGFjaXR5PSIwLjciIHN0eWxlPSItLXc6MC45NjtzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48cGF0aCBkPSJNLTguNTAgOC41MEwwLjUwIC0wLjUwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjk2IiBvcGFjaXR5PSIwLjciIHN0eWxlPSItLXc6MC45NjtzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48cGF0aCBkPSJNNy41MCA4LjUwTDE2LjUwIC0wLjUwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjk2IiBvcGFjaXR5PSIwLjciIHN0eWxlPSItLXc6MC45NjtzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48L3N2Zz4=);
}

/* stippel   — --fn-warning · kategori 4 */
.kode-stippel {
  mask-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDgiIGZpbGw9Im5vbmUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNMS41NSAyLjAwQTAuNDUgMC40NSAwIDEgMCAyLjQ1IDIuMDBBMC40NSAwLjQ1IDAgMSAwIDEuNTUgMi4wMFoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjAuOTYiIG9wYWNpdHk9IjAuODUiIHN0eWxlPSItLXc6MC45NjtzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48cGF0aCBkPSJNNS41NSA2LjAwQTAuNDUgMC40NSAwIDEgMCA2LjQ1IDYuMDBBMC40NSAwLjQ1IDAgMSAwIDUuNTUgNi4wMFoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjAuOTYiIG9wYWNpdHk9IjAuODUiIHN0eWxlPSItLXc6MC45NjtzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48L3N2Zz4=);
}

/* modsat    — kategori 5 */
.kode-modsat {
  mask-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDgiIGZpbGw9Im5vbmUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNLTAuNTAgLTAuNTBMOC41MCA4LjUwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjk2IiBvcGFjaXR5PSIwLjciIHN0eWxlPSItLXc6MC45NjtzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48cGF0aCBkPSJNLTguNTAgLTAuNTBMMC41MCA4LjUwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjk2IiBvcGFjaXR5PSIwLjciIHN0eWxlPSItLXc6MC45NjtzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48cGF0aCBkPSJNNy41MCAtMC41MEwxNi41MCA4LjUwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjk2IiBvcGFjaXR5PSIwLjciIHN0eWxlPSItLXc6MC45NjtzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48L3N2Zz4=);
}

/* kryds     — kategori 6 */
.kode-kryds {
  mask-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4IDgiIGZpbGw9Im5vbmUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNNC4wMCAtMC41MEw0LjAwIDguNTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjAuOTYiIG9wYWNpdHk9IjAuNyIgc3R5bGU9Ii0tdzowLjk2O3N0cm9rZS13aWR0aDpjYWxjKHZhcigtLXcpICogdmFyKC0tZ2ssIDEpKSIvPjxwYXRoIGQ9Ik0tMC41MCA0LjAwTDguNTAgNC4wMCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMC45NiIgb3BhY2l0eT0iMC43IiBzdHlsZT0iLS13OjAuOTY7c3Ryb2tlLXdpZHRoOmNhbGModmFyKC0tdykgKiB2YXIoLS1naywgMSkpIi8+PC9zdmc+);
}

/* ---- båndet på betalingskortet -------------------------------------------
   `baand`-pladen: flettede sinusbånd, frøet med husets eget navn. Den ligger
   i SIN EGEN BANE på kortet og aldrig bag cifrene — første udkast førte den
   tværs gennem kortnummeret, hvilket er præcis det pladereglen forbyder:
   mønstret parterer sig omkring tallet og lader midten være.

   Også her en maske, så båndet tager kortets egen tekstfarve. */
.gravure-baand {
  height: 30px;
  background-color: currentColor;
  opacity: .34;
  mask-repeat: repeat-x;
  mask-size: 600px 30px;

  mask-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgMzAiIGZpbGw9Im5vbmUiIGFyaWEtaGlkZGVuPSJ0cnVlIj48cGF0aCBkPSJNMC4wMCAxNi43M0wzLjc1IDE5LjczTDcuNTAgMjIuMTlMMTEuMjUgMjMuNzhMMTUuMDAgMjQuMzFMMTguNzUgMjMuNjdMMjIuNTAgMjEuOTVMMjYuMjUgMTkuMzRMMzAuMDAgMTYuMTZMMzMuNzUgMTIuODBMMzcuNTAgOS42N0w0MS4yNSA3LjE3TDQ1LjAwIDUuNjNMNDguNzUgNS4yM0w1Mi41MCA2LjA1TDU2LjI1IDcuOThMNjAuMDAgMTAuODFMNjMuNzUgMTQuMThMNjcuNTAgMTcuNjdMNzEuMjUgMjAuODZMNzUuMDAgMjMuMzRMNzguNzUgMjQuNzlMODIuNTAgMjUuMDRMODYuMjUgMjQuMDRMOTAuMDAgMjEuOTJMOTMuNzUgMTguOTNMOTcuNTAgMTUuNDRMMTAxLjI1IDExLjg5TDEwNS4wMCA4LjcyTDEwOC43NSA2LjMzTDExMi41MCA1LjAwTDExNi4yNSA0LjkyTDEyMC4wMCA2LjA4TDEyMy43NSA4LjM1TDEyNy41MCAxMS40NEwxMzEuMjUgMTQuOTZMMTM1LjAwIDE4LjQ4TDEzOC43NSAyMS41NUwxNDIuNTAgMjMuODFMMTQ2LjI1IDI0Ljk2TDE1MC4wMCAyNC44OEwxNTMuNzUgMjMuNThMMTU3LjUwIDIxLjIzTDE2MS4yNSAxOC4xMkwxNjUuMDAgMTQuNjVMMTY4Ljc1IDExLjI1TDE3Mi41MCA4LjM0TDE3Ni4yNSA2LjI3TDE4MC4wMCA1LjMwTDE4My43NSA1LjU0TDE4Ny41MCA2Ljk0TDE5MS4yNSA5LjMxTDE5NS4wMCAxMi4zN0wxOTguNzUgMTUuNzFMMjAyLjUwIDE4LjkyTDIwNi4yNSAyMS42MkwyMTAuMDAgMjMuNDZMMjEzLjc1IDI0LjI0TDIxNy41MCAyMy44N0wyMjEuMjUgMjIuNDJMMjI1LjAwIDIwLjA3TDIyOC43NSAxNy4xNEwyMzIuNTAgMTMuOThMMjM2LjI1IDExLjAwTDI0MC4wMCA4LjU2TDI0My43NSA2Ljk0TDI0Ny41MCA2LjM0TDI1MS4yNSA2LjgyTDI1NS4wMCA4LjI5TDI1OC43NSAxMC41NkwyNjIuNTAgMTMuMzNMMjY2LjI1IDE2LjI3TDI3MC4wMCAxOS4wMEwyNzMuNzUgMjEuMTlMMjc3LjUwIDIyLjU4TDI4MS4yNSAyMy4wMkwyODUuMDAgMjIuNDdMMjg4Ljc1IDIxLjAxTDI5Mi41MCAxOC44NEwyOTYuMjUgMTYuMjRMMzAwLjAwIDEzLjUzTDMwMy43NSAxMS4wNUwzMDcuNTAgOS4wOUwzMTEuMjUgNy45MEwzMTUuMDAgNy41OUwzMTguNzUgOC4xOUwzMjIuNTAgOS42MkwzMjYuMjUgMTEuNjlMMzMwLjAwIDE0LjEzTDMzMy43NSAxNi42NEwzMzcuNTAgMTguOTFMMzQxLjI1IDIwLjY3TDM0NS4wMCAyMS43MUwzNDguNzUgMjEuOTFMMzUyLjUwIDIxLjI3TDM1Ni4yNSAxOS44NkwzNjAuMDAgMTcuODdMMzYzLjc1IDE1LjU2TDM2Ny41MCAxMy4yMEwzNzEuMjUgMTEuMDhMMzc1LjAwIDkuNDdMMzc4Ljc1IDguNTRMMzgyLjUwIDguNDJMMzg2LjI1IDkuMTFMMzkwLjAwIDEwLjUxTDM5My43NSAxMi40NkwzOTcuNTAgMTQuNzJMNDAxLjI1IDE3LjAwTDQwNS4wMCAxOS4wM0w0MDguNzUgMjAuNTVMNDEyLjUwIDIxLjQwTDQxNi4yNSAyMS40NUw0MjAuMDAgMjAuNzFMNDIzLjc1IDE5LjI3TDQyNy41MCAxNy4yOUw0MzEuMjUgMTUuMDNMNDM1LjAwIDEyLjc1TDQzOC43NSAxMC43NEw0NDIuNTAgOS4yNEw0NDYuMjUgOC40NUw0NTAuMDAgOC40Nkw0NTMuNzUgOS4yOEw0NTcuNTAgMTAuODJMNDYxLjI1IDEyLjg5TDQ2NS4wMCAxNS4yNEw0NjguNzUgMTcuNTlMNDcyLjUwIDE5LjY0TDQ3Ni4yNSAyMS4xNUw0ODAuMDAgMjEuOTFMNDgzLjc1IDIxLjgyTDQ4Ny41MCAyMC44OEw0OTEuMjUgMTkuMjBMNDk1LjAwIDE2Ljk3TDQ5OC43NSAxNC40Nkw1MDIuNTAgMTEuOThMNTA2LjI1IDkuODRMNTEwLjAwIDguMzBMNTEzLjc1IDcuNTdMNTE3LjUwIDcuNzZMNTIxLjI1IDguODVMNTI1LjAwIDEwLjczTDUyOC43NSAxMy4xN0w1MzIuNTAgMTUuODhMNTM2LjI1IDE4LjU0TDU0MC4wMCAyMC44MEw1NDMuNzUgMjIuMzdMNTQ3LjUwIDIzLjA1TDU1MS4yNSAyMi43NUw1NTUuMDAgMjEuNDZMNTU4Ljc1IDE5LjM1TDU2Mi41MCAxNi42Nkw1NjYuMjUgMTMuNzJMNTcwLjAwIDEwLjg4TDU3My43NSA4LjUxTDU3Ny41MCA2LjkxTDU4MS4yNSA2LjI5TDU4NS4wMCA2Ljc1TDU4OC43NSA4LjI1TDU5Mi41MCAxMC42MUw1OTYuMjUgMTMuNTZMNjAwLjAwIDE2LjczIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjciIG9wYWNpdHk9IjAuOCIgc3R5bGU9Ii0tdzowLjc7c3Ryb2tlLXdpZHRoOmNhbGModmFyKC0tdykgKiB2YXIoLS1naywgMSkpIi8+PHBhdGggZD0iTTAuMDAgMTMuMjdMMy43NSAxMC4yNkw3LjUwIDcuODFMMTEuMjUgNi4yMUwxNS4wMCA1LjY5TDE4Ljc1IDYuMzNMMjIuNTAgOC4wNUwyNi4yNSAxMC42NkwzMC4wMCAxMy44NEwzMy43NSAxNy4yMUwzNy41MCAyMC4zM0w0MS4yNSAyMi44M0w0NS4wMCAyNC4zN0w0OC43NSAyNC43N0w1Mi41MCAyMy45NUw1Ni4yNSAyMi4wMUw2MC4wMCAxOS4xOUw2My43NSAxNS44Mkw2Ny41MCAxMi4zMkw3MS4yNSA5LjE0TDc1LjAwIDYuNjZMNzguNzUgNS4yMUw4Mi41MCA0Ljk2TDg2LjI1IDUuOTZMOTAuMDAgOC4wOEw5My43NSAxMS4wOEw5Ny41MCAxNC41NkwxMDEuMjUgMTguMTFMMTA1LjAwIDIxLjI4TDEwOC43NSAyMy42OEwxMTIuNTAgMjUuMDBMMTE2LjI1IDI1LjA4TDEyMC4wMCAyMy45MUwxMjMuNzUgMjEuNjVMMTI3LjUwIDE4LjU2TDEzMS4yNSAxNS4wNEwxMzUuMDAgMTEuNTJMMTM4Ljc1IDguNDVMMTQyLjUwIDYuMTlMMTQ2LjI1IDUuMDRMMTUwLjAwIDUuMTJMMTUzLjc1IDYuNDJMMTU3LjUwIDguNzhMMTYxLjI1IDExLjg4TDE2NS4wMCAxNS4zNUwxNjguNzUgMTguNzVMMTcyLjUwIDIxLjY2TDE3Ni4yNSAyMy43M0wxODAuMDAgMjQuNzBMMTgzLjc1IDI0LjQ2TDE4Ny41MCAyMy4wNkwxOTEuMjUgMjAuNjhMMTk1LjAwIDE3LjYzTDE5OC43NSAxNC4yOUwyMDIuNTAgMTEuMDdMMjA2LjI1IDguMzhMMjEwLjAwIDYuNTRMMjEzLjc1IDUuNzZMMjE3LjUwIDYuMTNMMjIxLjI1IDcuNThMMjI1LjAwIDkuOTNMMjI4Ljc1IDEyLjg2TDIzMi41MCAxNi4wMkwyMzYuMjUgMTkuMDBMMjQwLjAwIDIxLjQ0TDI0My43NSAyMy4wNkwyNDcuNTAgMjMuNjZMMjUxLjI1IDIzLjE4TDI1NS4wMCAyMS43MUwyNTguNzUgMTkuNDRMMjYyLjUwIDE2LjY3TDI2Ni4yNSAxMy43M0wyNzAuMDAgMTEuMDBMMjczLjc1IDguODFMMjc3LjUwIDcuNDJMMjgxLjI1IDYuOThMMjg1LjAwIDcuNTNMMjg4Ljc1IDguOTlMMjkyLjUwIDExLjE2TDI5Ni4yNSAxMy43NkwzMDAuMDAgMTYuNDdMMzAzLjc1IDE4Ljk1TDMwNy41MCAyMC45MUwzMTEuMjUgMjIuMTBMMzE1LjAwIDIyLjQxTDMxOC43NSAyMS44MUwzMjIuNTAgMjAuMzhMMzI2LjI1IDE4LjMxTDMzMC4wMCAxNS44N0wzMzMuNzUgMTMuMzZMMzM3LjUwIDExLjA5TDM0MS4yNSA5LjMzTDM0NS4wMCA4LjI5TDM0OC43NSA4LjA5TDM1Mi41MCA4LjczTDM1Ni4yNSAxMC4xNEwzNjAuMDAgMTIuMTNMMzYzLjc1IDE0LjQ0TDM2Ny41MCAxNi44MEwzNzEuMjUgMTguOTJMMzc1LjAwIDIwLjUzTDM3OC43NSAyMS40NkwzODIuNTAgMjEuNThMMzg2LjI1IDIwLjg5TDM5MC4wMCAxOS40OUwzOTMuNzUgMTcuNTRMMzk3LjUwIDE1LjI4TDQwMS4yNSAxMy4wMEw0MDUuMDAgMTAuOTdMNDA4Ljc1IDkuNDVMNDEyLjUwIDguNjBMNDE2LjI1IDguNTVMNDIwLjAwIDkuMjlMNDIzLjc1IDEwLjczTDQyNy41MCAxMi43MUw0MzEuMjUgMTQuOThMNDM1LjAwIDE3LjI1TDQzOC43NSAxOS4yNkw0NDIuNTAgMjAuNzZMNDQ2LjI1IDIxLjU1TDQ1MC4wMCAyMS41NEw0NTMuNzUgMjAuNzJMNDU3LjUwIDE5LjE4TDQ2MS4yNSAxNy4xMUw0NjUuMDAgMTQuNzZMNDY4Ljc1IDEyLjQxTDQ3Mi41MCAxMC4zNkw0NzYuMjUgOC44NUw0ODAuMDAgOC4wOUw0ODMuNzUgOC4xOEw0ODcuNTAgOS4xMkw0OTEuMjUgMTAuODBMNDk1LjAwIDEzLjAzTDQ5OC43NSAxNS41NEw1MDIuNTAgMTguMDJMNTA2LjI1IDIwLjE3TDUxMC4wMCAyMS43MEw1MTMuNzUgMjIuNDNMNTE3LjUwIDIyLjI0TDUyMS4yNSAyMS4xNUw1MjUuMDAgMTkuMjdMNTI4Ljc1IDE2LjgzTDUzMi41MCAxNC4xMUw1MzYuMjUgMTEuNDZMNTQwLjAwIDkuMjBMNTQzLjc1IDcuNjNMNTQ3LjUwIDYuOTRMNTUxLjI1IDcuMjVMNTU1LjAwIDguNTRMNTU4Ljc1IDEwLjY1TDU2Mi41MCAxMy4zNEw1NjYuMjUgMTYuMjlMNTcwLjAwIDE5LjEyTDU3My43NSAyMS40OUw1NzcuNTAgMjMuMDlMNTgxLjI1IDIzLjcxTDU4NS4wMCAyMy4yNUw1ODguNzUgMjEuNzVMNTkyLjUwIDE5LjM5TDU5Ni4yNSAxNi40NEw2MDAuMDAgMTMuMjciIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjAuNyIgb3BhY2l0eT0iMC44IiBzdHlsZT0iLS13OjAuNztzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48cGF0aCBkPSJNMC4wMCAyMS42OUwzLjc1IDIzLjk0TDcuNTAgMjUuMDlMMTEuMjUgMjQuOThMMTUuMDAgMjMuNjRMMTguNzUgMjEuMjNMMjIuNTAgMTguMDVMMjYuMjUgMTQuNTBMMzAuMDAgMTEuMDFMMzMuNzUgOC4wM0wzNy41MCA1LjkyTDQxLjI1IDQuOTRMNDUuMDAgNS4yMEw0OC43NSA2LjY4TDUyLjUwIDkuMThMNTYuMjUgMTIuMzhMNjAuMDAgMTUuODhMNjMuNzUgMTkuMjZMNjcuNTAgMjIuMDhMNzEuMjUgMjQuMDBMNzUuMDAgMjQuODBMNzguNzUgMjQuMzlMODIuNTAgMjIuODJMODYuMjUgMjAuMzBMOTAuMDAgMTcuMTVMOTMuNzUgMTMuNzhMOTcuNTAgMTAuNTlMMTAxLjI1IDcuOThMMTA1LjAwIDYuMjdMMTA4Ljc1IDUuNjVMMTEyLjUwIDYuMTlMMTE2LjI1IDcuODFMMTIwLjAwIDEwLjI5TDEyMy43NSAxMy4zMUwxMjcuNTAgMTYuNTBMMTMxLjI1IDE5LjQ2TDEzNS4wMCAyMS44MkwxMzguNzUgMjMuMzFMMTQyLjUwIDIzLjc2TDE0Ni4yNSAyMy4xMkwxNTAuMDAgMjEuNDlMMTUzLjc1IDE5LjEwTDE1Ny41MCAxNi4yNEwxNjEuMjUgMTMuMjhMMTY1LjAwIDEwLjU4TDE2OC43NSA4LjQ3TDE3Mi41MCA3LjE5TDE3Ni4yNSA2LjkwTDE4MC4wMCA3LjYwTDE4My43NSA5LjIwTDE4Ny41MCAxMS40OEwxOTEuMjUgMTQuMTZMMTk1LjAwIDE2Ljg5TDE5OC43NSAxOS4zNEwyMDIuNTAgMjEuMjJMMjA2LjI1IDIyLjMwTDIxMC4wMCAyMi40N0wyMTMuNzUgMjEuNzJMMjE3LjUwIDIwLjE2TDIyMS4yNSAxNy45OUwyMjUuMDAgMTUuNTBMMjI4Ljc1IDEyLjk4TDIzMi41MCAxMC43NEwyMzYuMjUgOS4wNkwyNDAuMDAgOC4xNEwyNDMuNzUgOC4wN0wyNDcuNTAgOC44NEwyNTEuMjUgMTAuMzdMMjU1LjAwIDEyLjQ0TDI1OC43NSAxNC44MEwyNjIuNTAgMTcuMTZMMjY2LjI1IDE5LjIzTDI3MC4wMCAyMC43NkwyNzMuNzUgMjEuNTdMMjc3LjUwIDIxLjU2TDI4MS4yNSAyMC43NUwyODUuMDAgMTkuMjRMMjg4Ljc1IDE3LjIyTDI5Mi41MCAxNC45M0wyOTYuMjUgMTIuNjdMMzAwLjAwIDEwLjcwTDMwMy43NSA5LjI2TDMwNy41MCA4LjU0TDMxMS4yNSA4LjYxTDMxNS4wMCA5LjQ3TDMxOC43NSAxMS4wMUwzMjIuNTAgMTMuMDRMMzI2LjI1IDE1LjMyTDMzMC4wMCAxNy41N0wzMzMuNzUgMTkuNTFMMzM3LjUwIDIwLjkwTDM0MS4yNSAyMS41N0wzNDUuMDAgMjEuNDNMMzQ4Ljc1IDIwLjUwTDM1Mi41MCAxOC44N0wzNTYuMjUgMTYuNzZMMzYwLjAwIDE0LjQwTDM2My43NSAxMi4xMEwzNjcuNTAgMTAuMTNMMzcxLjI1IDguNzRMMzc1LjAwIDguMTJMMzc4Ljc1IDguMzNMMzgyLjUwIDkuMzhMMzg2LjI1IDExLjE1TDM5MC4wMCAxMy40MUwzOTMuNzUgMTUuOTFMMzk3LjUwIDE4LjMzTDQwMS4yNSAyMC4zOEw0MDUuMDAgMjEuNzlMNDA4Ljc1IDIyLjM3TDQxMi41MCAyMi4wNUw0MTYuMjUgMjAuODRMNDIwLjAwIDE4Ljg5TDQyMy43NSAxNi40MUw0MjcuNTAgMTMuNzJMNDMxLjI1IDExLjE0TDQzNS4wMCA4Ljk5TDQzOC43NSA3LjU2TDQ0Mi41MCA3LjAzTDQ0Ni4yNSA3LjQ4TDQ1MC4wMCA4Ljg4TDQ1My43NSAxMS4wN0w0NTcuNTAgMTMuNzlMNDYxLjI1IDE2LjcxTDQ2NS4wMCAxOS40Nkw0NjguNzUgMjEuNzFMNDcyLjUwIDIzLjE1TDQ3Ni4yNSAyMy42MUw0ODAuMDAgMjIuOTlMNDgzLjc1IDIxLjM3TDQ4Ny41MCAxOC45M0w0OTEuMjUgMTUuOTZMNDk1LjAwIDEyLjgyTDQ5OC43NSA5LjkxTDUwMi41MCA3LjU4TDUwNi4yNSA2LjE1TDUxMC4wMCA1LjgxTDUxMy43NSA2LjYwTDUxNy41MCA4LjQ1TDUyMS4yNSAxMS4xNEw1MjUuMDAgMTQuMzVMNTI4Ljc1IDE3LjY4TDUzMi41MCAyMC43MUw1MzYuMjUgMjMuMDdMNTQwLjAwIDI0LjQ0TDU0My43NSAyNC42Nkw1NDcuNTAgMjMuNjdMNTUxLjI1IDIxLjYwTDU1NS4wMCAxOC42OUw1NTguNzUgMTUuMjlMNTYyLjUwIDExLjgzTDU2Ni4yNSA4Ljc0TDU3MC4wMCA2LjQxTDU3My43NSA1LjEzTDU3Ny41MCA1LjA3TDU4MS4yNSA2LjI0TDU4NS4wMCA4LjUwTDU4OC43NSAxMS41OUw1OTIuNTAgMTUuMTBMNTk2LjI1IDE4LjYyTDYwMC4wMCAyMS42OSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMC43IiBvcGFjaXR5PSIwLjgiIHN0eWxlPSItLXc6MC43O3N0cm9rZS13aWR0aDpjYWxjKHZhcigtLXcpICogdmFyKC0tZ2ssIDEpKSIvPjxwYXRoIGQ9Ik0wLjAwIDcuOTBMMy43NSA1LjgxTDcuNTAgNC44NUwxMS4yNSA1LjE1TDE1LjAwIDYuNjZMMTguNzUgOS4yMUwyMi41MCAxMi40N0wyNi4yNSAxNi4wM0wzMC4wMCAxOS40NUwzMy43NSAyMi4zMUwzNy41MCAyNC4yNUw0MS4yNSAyNS4wNEw0NS4wMCAyNC41OEw0OC43NSAyMi45NUw1Mi41MCAyMC4zNEw1Ni4yNSAxNy4wOUw2MC4wMCAxMy42MUw2My43NSAxMC4zM0w2Ny41MCA3LjY1TDcxLjI1IDUuOTFMNzUuMDAgNS4zMEw3OC43NSA1Ljg5TDgyLjUwIDcuNjBMODYuMjUgMTAuMjBMOTAuMDAgMTMuMzdMOTMuNzUgMTYuNjlMOTcuNTAgMTkuNzdMMTAxLjI1IDIyLjIyTDEwNS4wMCAyMy43NUwxMDguNzUgMjQuMThMMTEyLjUwIDIzLjQ4TDExNi4yNSAyMS43NUwxMjAuMDAgMTkuMjFMMTIzLjc1IDE2LjE5TDEyNy41MCAxMy4wN0wxMzEuMjUgMTAuMjRMMTM1LjAwIDguMDRMMTM4Ljc1IDYuNzJMMTQyLjUwIDYuNDVMMTQ2LjI1IDcuMjNMMTUwLjAwIDguOTVMMTUzLjc1IDExLjM4TDE1Ny41MCAxNC4yMkwxNjEuMjUgMTcuMTBMMTY1LjAwIDE5LjY4TDE2OC43NSAyMS42M0wxNzIuNTAgMjIuNzRMMTc2LjI1IDIyLjg4TDE4MC4wMCAyMi4wNUwxODMuNzUgMjAuMzdMMTg3LjUwIDE4LjA3TDE5MS4yNSAxNS40MkwxOTUuMDAgMTIuNzdMMTk4Ljc1IDEwLjQ0TDIwMi41MCA4LjcxTDIwNi4yNSA3Ljc3TDIxMC4wMCA3Ljc0TDIxMy43NSA4LjYwTDIxNy41MCAxMC4yM0wyMjEuMjUgMTIuNDFMMjI1LjAwIDE0Ljg5TDIyOC43NSAxNy4zNEwyMzIuNTAgMTkuNDZMMjM2LjI1IDIxLjAyTDI0MC4wMCAyMS44MUwyNDMuNzUgMjEuNzZMMjQ3LjUwIDIwLjg4TDI1MS4yNSAxOS4yOUwyNTUuMDAgMTcuMTlMMjU4Ljc1IDE0Ljg0TDI2Mi41MCAxMi41NEwyNjYuMjUgMTAuNTZMMjcwLjAwIDkuMTRMMjczLjc1IDguNDVMMjc3LjUwIDguNTZMMjgxLjI1IDkuNDdMMjg1LjAwIDExLjA2TDI4OC43NSAxMy4xMkwyOTIuNTAgMTUuNDFMMjk2LjI1IDE3LjY0TDMwMC4wMCAxOS41NEwzMDMuNzUgMjAuODhMMzA3LjUwIDIxLjUwTDMxMS4yNSAyMS4zMkwzMTUuMDAgMjAuMzVMMzE4Ljc1IDE4LjczTDMyMi41MCAxNi42M0wzMjYuMjUgMTQuMzNMMzMwLjAwIDEyLjEwTDMzMy43NSAxMC4yMUwzMzcuNTAgOC45MEwzNDEuMjUgOC4zNEwzNDUuMDAgOC41OUwzNDguNzUgOS42NUwzNTIuNTAgMTEuMzdMMzU2LjI1IDEzLjU3TDM2MC4wMCAxNS45NkwzNjMuNzUgMTguMjdMMzY3LjUwIDIwLjIwTDM3MS4yNSAyMS41MUwzNzUuMDAgMjIuMDJMMzc4Ljc1IDIxLjY4TDM4Mi41MCAyMC40OUwzODYuMjUgMTguNjFMMzkwLjAwIDE2LjI1TDM5My43NSAxMy42OUwzOTcuNTAgMTEuMjZMNDAxLjI1IDkuMjVMNDA1LjAwIDcuOTNMNDA4Ljc1IDcuNDZMNDEyLjUwIDcuOTNMNDE2LjI1IDkuMjhMNDIwLjAwIDExLjM4TDQyMy43NSAxMy45Nkw0MjcuNTAgMTYuNzJMNDMxLjI1IDE5LjMxTDQzNS4wMCAyMS40MUw0MzguNzUgMjIuNzVMNDQyLjUwIDIzLjE1TDQ0Ni4yNSAyMi41M0w0NTAuMDAgMjAuOTdMNDUzLjc1IDE4LjYzTDQ1Ny41MCAxNS44MEw0NjEuMjUgMTIuODJMNDY1LjAwIDEwLjA2TDQ2OC43NSA3Ljg3TDQ3Mi41MCA2LjU0TDQ3Ni4yNSA2LjI0TDQ4MC4wMCA3LjAzTDQ4My43NSA4LjgyTDQ4Ny41MCAxMS40Mkw0OTEuMjUgMTQuNTBMNDk1LjAwIDE3LjY5TDQ5OC43NSAyMC41OEw1MDIuNTAgMjIuODNMNTA2LjI1IDI0LjEyTDUxMC4wMCAyNC4zMEw1MTMuNzUgMjMuMzJMNTE3LjUwIDIxLjI5TDUyMS4yNSAxOC40NUw1MjUuMDAgMTUuMTVMNTI4Ljc1IDExLjgwTDUzMi41MCA4LjgxTDUzNi4yNSA2LjU1TDU0MC4wMCA1LjMzTDU0My43NSA1LjMwTDU0Ny41MCA2LjQ4TDU1MS4yNSA4LjcyTDU1NS4wMCAxMS43N0w1NTguNzUgMTUuMjNMNTYyLjUwIDE4LjY5TDU2Ni4yNSAyMS43MUw1NzAuMDAgMjMuOTJMNTczLjc1IDI1LjAyTDU3Ny41MCAyNC44OUw1ODEuMjUgMjMuNTNMNTg1LjAwIDIxLjExTDU4OC43NSAxNy45Mkw1OTIuNTAgMTQuMzZMNTk2LjI1IDEwLjg4TDYwMC4wMCA3LjkwIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjciIG9wYWNpdHk9IjAuOCIgc3R5bGU9Ii0tdzowLjc7c3Ryb2tlLXdpZHRoOmNhbGModmFyKC0tdykgKiB2YXIoLS1naywgMSkpIi8+PHBhdGggZD0iTTAuMDAgMjMuOTNMMy43NSAyNC41OUw3LjUwIDI0LjA2TDExLjI1IDIyLjQzTDE1LjAwIDE5Ljg5TDE4Ljc1IDE2Ljc5TDIyLjUwIDEzLjUwTDI2LjI1IDEwLjQ1TDMwLjAwIDcuOTlMMzMuNzUgNi40M0wzNy41MCA1Ljk1TDQxLjI1IDYuNThMNDUuMDAgOC4yNUw0OC43NSAxMC43MUw1Mi41MCAxMy42Nkw1Ni4yNSAxNi43NEw2MC4wMCAxOS41NEw2My43NSAyMS43NUw2Ny41MCAyMy4wOUw3MS4yNSAyMy40MUw3NS4wMCAyMi43MEw3OC43NSAyMS4wNUw4Mi41MCAxOC42OUw4Ni4yNSAxNS45Mkw5MC4wMCAxMy4wOEw5My43NSAxMC41M0w5Ny41MCA4LjU3TDEwMS4yNSA3LjQ0TDEwNS4wMCA3LjI1TDEwOC43NSA4LjAxTDExMi41MCA5LjYyTDExNi4yNSAxMS44NkwxMjAuMDAgMTQuNDRMMTIzLjc1IDE3LjA1TDEyNy41MCAxOS4zN0wxMzEuMjUgMjEuMTFMMTM1LjAwIDIyLjA4TDEzOC43NSAyMi4xNkwxNDIuNTAgMjEuMzdMMTQ2LjI1IDE5LjgwTDE1MC4wMCAxNy42N0wxNTMuNzUgMTUuMjRMMTU3LjUwIDEyLjgyTDE2MS4yNSAxMC43MEwxNjUuMDAgOS4xM0wxNjguNzUgOC4zMEwxNzIuNTAgOC4zMEwxNzYuMjUgOS4xMkwxODAuMDAgMTAuNjZMMTgzLjc1IDEyLjcxTDE4Ny41MCAxNS4wM0wxOTEuMjUgMTcuMzJMMTk1LjAwIDE5LjMyTDE5OC43NSAyMC43N0wyMDIuNTAgMjEuNTBMMjA2LjI1IDIxLjQzTDIxMC4wMCAyMC41N0wyMTMuNzUgMTkuMDNMMjE3LjUwIDE2Ljk5TDIyMS4yNSAxNC43MkwyMjUuMDAgMTIuNDhMMjI4Ljc1IDEwLjU1TDIzMi41MCA5LjE2TDIzNi4yNSA4LjUwTDI0MC4wMCA4LjYzTDI0My43NSA5LjU2TDI0Ny41MCAxMS4xNUwyNTEuMjUgMTMuMjRMMjU1LjAwIDE1LjU1TDI1OC43NSAxNy44MUwyNjIuNTAgMTkuNzRMMjY2LjI1IDIxLjEwTDI3MC4wMCAyMS43MkwyNzMuNzUgMjEuNTFMMjc3LjUwIDIwLjQ5TDI4MS4yNSAxOC43OEwyODUuMDAgMTYuNThMMjg4Ljc1IDE0LjE2TDI5Mi41MCAxMS44MUwyOTYuMjUgOS44MkwzMDAuMDAgOC40NUwzMDMuNzUgNy44N0wzMDcuNTAgOC4xOEwzMTEuMjUgOS4zM0wzMTUuMDAgMTEuMjFMMzE4Ljc1IDEzLjYwTDMyMi41MCAxNi4xOUwzMjYuMjUgMTguNjhMMzMwLjAwIDIwLjc2TDMzMy43NSAyMi4xNUwzMzcuNTAgMjIuNjhMMzQxLjI1IDIyLjI1TDM0NS4wMCAyMC45MkwzNDguNzUgMTguODJMMzUyLjUwIDE2LjIxTDM1Ni4yNSAxMy40MEwzNjAuMDAgMTAuNzRMMzYzLjc1IDguNTdMMzY3LjUwIDcuMTZMMzcxLjI1IDYuNzBMMzc1LjAwIDcuMjdMMzc4Ljc1IDguODJMMzgyLjUwIDExLjE2TDM4Ni4yNSAxNC4wM0wzOTAuMDAgMTcuMDZMMzkzLjc1IDE5Ljg5TDM5Ny41MCAyMi4xNUw0MDEuMjUgMjMuNTVMNDA1LjAwIDIzLjkyTDQwOC43NSAyMy4xN0w0MTIuNTAgMjEuMzlMNDE2LjI1IDE4Ljc5TDQyMC4wMCAxNS42OEw0MjMuNzUgMTIuNDRMNDI3LjUwIDkuNDhMNDMxLjI1IDcuMTZMNDM1LjAwIDUuODBMNDM4Ljc1IDUuNTZMNDQyLjUwIDYuNDlMNDQ2LjI1IDguNTBMNDUwLjAwIDExLjM0TDQ1My43NSAxNC42Nkw0NTcuNTAgMTguMDZMNDYxLjI1IDIxLjExTDQ2NS4wMCAyMy40M0w0NjguNzUgMjQuNzJMNDcyLjUwIDI0LjgxTDQ3Ni4yNSAyMy42OEw0ODAuMDAgMjEuNDdMNDgzLjc1IDE4LjQzTDQ4Ny41MCAxNC45Nkw0OTEuMjUgMTEuNDdMNDk1LjAwIDguNDBMNDk4Ljc1IDYuMTRMNTAyLjUwIDQuOTdMNTA2LjI1IDUuMDRMNTEwLjAwIDYuMzRMNTEzLjc1IDguNzNMNTE3LjUwIDExLjg5TDUyMS4yNSAxNS40NEw1MjUuMDAgMTguOTRMNTI4Ljc1IDIxLjk1TDUzMi41MCAyNC4xMEw1MzYuMjUgMjUuMTJMNTQwLjAwIDI0Ljg4TDU0My43NSAyMy40Mkw1NDcuNTAgMjAuOTNMNTUxLjI1IDE3LjcxTDU1NS4wMCAxNC4xNkw1NTguNzUgMTAuNzRMNTYyLjUwIDcuODZMNTY2LjI1IDUuODhMNTcwLjAwIDUuMDNMNTczLjc1IDUuNDNMNTc3LjUwIDcuMDBMNTgxLjI1IDkuNTVMNTg1LjAwIDEyLjc0TDU4OC43NSAxNi4xOUw1OTIuNTAgMTkuNDZMNTk2LjI1IDIyLjE1TDYwMC4wMCAyMy45MyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMC43IiBvcGFjaXR5PSIwLjgiIHN0eWxlPSItLXc6MC43O3N0cm9rZS13aWR0aDpjYWxjKHZhcigtLXcpICogdmFyKC0tZ2ssIDEpKSIvPjxwYXRoIGQ9Ik0wLjAwIDYuMzBMMy43NSA1LjI0TDcuNTAgNS40MEwxMS4yNSA2Ljc0TDE1LjAwIDkuMDhMMTguNzUgMTIuMTNMMjIuNTAgMTUuNTFMMjYuMjUgMTguNzhMMzAuMDAgMjEuNTVMMzMuNzUgMjMuNDlMMzcuNTAgMjQuMzVMNDEuMjUgMjQuMDVMNDUuMDAgMjIuNjVMNDguNzUgMjAuMzJMNTIuNTAgMTcuMzdMNTYuMjUgMTQuMTdMNjAuMDAgMTEuMTFMNjMuNzUgOC41OEw2Ny41MCA2Ljg4TDcxLjI1IDYuMjBMNzUuMDAgNi42Mkw3OC43NSA4LjA1TDgyLjUwIDEwLjMyTDg2LjI1IDEzLjEyTDkwLjAwIDE2LjExTDkzLjc1IDE4LjkxTDk3LjUwIDIxLjE4TDEwMS4yNSAyMi42NkwxMDUuMDAgMjMuMTdMMTA4Ljc1IDIyLjY3TDExMi41MCAyMS4yNEwxMTYuMjUgMTkuMDdMMTIwLjAwIDE2LjQzTDEyMy43NSAxMy42N0wxMjcuNTAgMTEuMTJMMTMxLjI1IDkuMDlMMTM1LjAwIDcuODJMMTM4Ljc1IDcuNDVMMTQyLjUwIDguMDFMMTQ2LjI1IDkuNDJMMTUwLjAwIDExLjQ5TDE1My43NSAxMy45NUwxNTcuNTAgMTYuNTFMMTYxLjI1IDE4Ljg0TDE2NS4wMCAyMC42NkwxNjguNzUgMjEuNzZMMTcyLjUwIDIyLjAyTDE3Ni4yNSAyMS40MUwxODAuMDAgMjAuMDNMMTgzLjc1IDE4LjA1TDE4Ny41MCAxNS43MUwxOTEuMjUgMTMuMzJMMTk1LjAwIDExLjE2TDE5OC43NSA5LjUwTDIwMi41MCA4LjUyTDIwNi4yNSA4LjM1TDIxMC4wMCA5LjAwTDIxMy43NSAxMC4zOEwyMTcuNTAgMTIuMzJMMjIxLjI1IDE0LjU3TDIyNS4wMCAxNi44N0wyMjguNzUgMTguOTJMMjMyLjUwIDIwLjQ5TDIzNi4yNSAyMS4zN0wyNDAuMDAgMjEuNDdMMjQzLjc1IDIwLjc4TDI0Ny41MCAxOS4zN0wyNTEuMjUgMTcuNDJMMjU1LjAwIDE1LjE3TDI1OC43NSAxMi44OUwyNjIuNTAgMTAuODdMMjY2LjI1IDkuMzVMMjcwLjAwIDguNTJMMjczLjc1IDguNDhMMjc3LjUwIDkuMjZMMjgxLjI1IDEwLjc0TDI4NS4wMCAxMi43N0wyODguNzUgMTUuMDlMMjkyLjUwIDE3LjQyTDI5Ni4yNSAxOS40OEwzMDAuMDAgMjEuMDBMMzAzLjc1IDIxLjc5TDMwNy41MCAyMS43NkwzMTEuMjUgMjAuODhMMzE1LjAwIDE5LjI2TDMxOC43NSAxNy4wOUwzMjIuNTAgMTQuNjNMMzI2LjI1IDEyLjE3TDMzMC4wMCAxMC4wNEwzMzMuNzUgOC40OEwzMzcuNTAgNy43MUwzNDEuMjUgNy44NEwzNDUuMDAgOC44NkwzNDguNzUgMTAuNjdMMzUyLjUwIDEzLjA0TDM1Ni4yNSAxNS43MEwzNjAuMDAgMTguMzJMMzYzLjc1IDIwLjU3TDM2Ny41MCAyMi4xN0wzNzEuMjUgMjIuOTBMMzc1LjAwIDIyLjY1TDM3OC43NSAyMS40NUwzODIuNTAgMTkuNDJMMzg2LjI1IDE2LjgxTDM5MC4wMCAxMy45MkwzOTMuNzUgMTEuMTFMMzk3LjUwIDguNzVMNDAxLjI1IDcuMTJMNDA1LjAwIDYuNDVMNDA4Ljc1IDYuODNMNDEyLjUwIDguMjRMNDE2LjI1IDEwLjUyTDQyMC4wMCAxMy4zOUw0MjMuNzUgMTYuNTFMNDI3LjUwIDE5LjQ5TDQzMS4yNSAyMS45Nkw0MzUuMDAgMjMuNTlMNDM4Ljc1IDI0LjE4TDQ0Mi41MCAyMy42M0w0NDYuMjUgMjEuOTlMNDUwLjAwIDE5LjQ3TDQ1My43NSAxNi4zNUw0NTcuNTAgMTMuMDNMNDYxLjI1IDkuOTFMNDY1LjAwIDcuMzlMNDY4Ljc1IDUuNzlMNDcyLjUwIDUuMzJMNDc2LjI1IDYuMDVMNDgwLjAwIDcuOTBMNDgzLjc1IDEwLjY1TDQ4Ny41MCAxMy45N0w0OTEuMjUgMTcuNDRMNDk1LjAwIDIwLjY0TDQ5OC43NSAyMy4xNkw1MDIuNTAgMjQuNjhMNTA2LjI1IDI1LjAxTDUxMC4wMCAyNC4xMEw1MTMuNzUgMjIuMDVMNTE3LjUwIDE5LjExTDUyMS4yNSAxNS42Nkw1MjUuMDAgMTIuMTFMNTI4Ljc1IDguOTFMNTMyLjUwIDYuNDZMNTM2LjI1IDUuMDZMNTQwLjAwIDQuODlMNTQzLjc1IDUuOTdMNTQ3LjUwIDguMThMNTUxLjI1IDExLjIzTDU1NS4wMCAxNC43NEw1NTguNzUgMTguMjhMNTYyLjUwIDIxLjQwTDU2Ni4yNSAyMy43M0w1NzAuMDAgMjQuOTdMNTczLjc1IDI0Ljk3TDU3Ny41MCAyMy43NEw1ODEuMjUgMjEuNDRMNTg1LjAwIDE4LjM1TDU4OC43NSAxNC44N0w1OTIuNTAgMTEuNDJMNTk2LjI1IDguNDRMNjAwLjAwIDYuMzAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjAuNyIgb3BhY2l0eT0iMC44IiBzdHlsZT0iLS13OjAuNztzdHJva2Utd2lkdGg6Y2FsYyh2YXIoLS13KSAqIHZhcigtLWdrLCAxKSkiLz48cGF0aCBkPSJNMC4wMCAyMi43N0wzLjc1IDIxLjg0TDcuNTAgMjAuMDlMMTEuMjUgMTcuNzVMMTUuMDAgMTUuMTFMMTguNzUgMTIuNTBMMjIuNTAgMTAuMjVMMjYuMjUgOC42MUwzMC4wMCA3Ljc4TDMzLjc1IDcuODVMMzcuNTAgOC43OUw0MS4yNSAxMC40OUw0NS4wMCAxMi43MEw0OC43NSAxNS4xN0w1Mi41MCAxNy41OEw1Ni4yNSAxOS42NUw2MC4wMCAyMS4xMUw2My43NSAyMS44MUw2Ny41MCAyMS42Nkw3MS4yNSAyMC43MEw3NS4wMCAxOS4wNUw3OC43NSAxNi45Mkw4Mi41MCAxNC41N0w4Ni4yNSAxMi4zMEw5MC4wMCAxMC4zOEw5My43NSA5LjA0TDk3LjUwIDguNDRMMTAxLjI1IDguNjVMMTA1LjAwIDkuNjRMMTA4Ljc1IDExLjI4TDExMi41MCAxMy4zOEwxMTYuMjUgMTUuNjdMMTIwLjAwIDE3Ljg4TDEyMy43NSAxOS43M0wxMjcuNTAgMjEuMDBMMTMxLjI1IDIxLjUzTDEzNS4wMCAyMS4yNUwxMzguNzUgMjAuMjFMMTQyLjUwIDE4LjUxTDE0Ni4yNSAxNi4zOEwxNTAuMDAgMTQuMDZMMTUzLjc1IDExLjg1TDE1Ny41MCAxMC4wMUwxNjEuMjUgOC43N0wxNjUuMDAgOC4zMEwxNjguNzUgOC42NUwxNzIuNTAgOS43OUwxNzYuMjUgMTEuNTlMMTgwLjAwIDEzLjgzTDE4My43NSAxNi4yNEwxODcuNTAgMTguNTNMMTkxLjI1IDIwLjQyTDE5NS4wMCAyMS42NUwxOTguNzUgMjIuMDhMMjAyLjUwIDIxLjYzTDIwNi4yNSAyMC4zNUwyMTAuMDAgMTguMzhMMjEzLjc1IDE1Ljk3TDIxNy41MCAxMy4zOUwyMjEuMjUgMTAuOTdMMjI1LjAwIDkuMDFMMjI4Ljc1IDcuNzdMMjMyLjUwIDcuNDBMMjM2LjI1IDcuOThMMjQwLjAwIDkuNDRMMjQzLjc1IDExLjYyTDI0Ny41MCAxNC4yN0wyNTEuMjUgMTcuMDVMMjU1LjAwIDE5LjYyTDI1OC43NSAyMS42NkwyNjIuNTAgMjIuOTFMMjY2LjI1IDIzLjE5TDI3MC4wMCAyMi40NkwyNzMuNzUgMjAuNzhMMjc3LjUwIDE4LjM1TDI4MS4yNSAxNS40NkwyODUuMDAgMTIuNDZMMjg4Ljc1IDkuNzNMMjkyLjUwIDcuNjJMMjk2LjI1IDYuMzlMMzAwLjAwIDYuMjFMMzAzLjc1IDcuMTNMMzA3LjUwIDkuMDRMMzExLjI1IDExLjczTDMxNS4wMCAxNC44NkwzMTguNzUgMTguMDZMMzIyLjUwIDIwLjkyTDMyNi4yNSAyMy4wOEwzMzAuMDAgMjQuMjZMMzMzLjc1IDI0LjMwTDMzNy41MCAyMy4xOUwzNDEuMjUgMjEuMDRMMzQ1LjAwIDE4LjExTDM0OC43NSAxNC43NkwzNTIuNTAgMTEuNDFMMzU2LjI1IDguNDdMMzYwLjAwIDYuMzJMMzYzLjc1IDUuMjNMMzY3LjUwIDUuMzRMMzcxLjI1IDYuNjZMMzc1LjAwIDkuMDJMMzc4Ljc1IDEyLjE0TDM4Mi41MCAxNS42NEwzODYuMjUgMTkuMDhMMzkwLjAwIDIyLjAzTDM5My43NSAyNC4xMkwzOTcuNTAgMjUuMDlMNDAxLjI1IDI0LjgxTDQwNS4wMCAyMy4zMUw0MDguNzUgMjAuNzhMNDEyLjUwIDE3LjUzTDQxNi4yNSAxMy45NUw0MjAuMDAgMTAuNTBMNDIzLjc1IDcuNjFMNDI3LjUwIDUuNjRMNDMxLjI1IDQuODJMNDM1LjAwIDUuMjdMNDM4Ljc1IDYuOTJMNDQyLjUwIDkuNTZMNDQ2LjI1IDEyLjg3TDQ1MC4wMCAxNi40NEw0NTMuNzUgMTkuODFMNDU3LjUwIDIyLjU3TDQ2MS4yNSAyNC4zOEw0NjUuMDAgMjUuMDJMNDY4Ljc1IDI0LjQyTDQ3Mi41MCAyMi42N0w0NzYuMjUgMTkuOTdMNDgwLjAwIDE2LjY5TDQ4My43NSAxMy4yMkw0ODcuNTAgMTAuMDFMNDkxLjI1IDcuNDNMNDk1LjAwIDUuODJMNDk4Ljc1IDUuMzVMNTAyLjUwIDYuMDhMNTA2LjI1IDcuOTBMNTEwLjAwIDEwLjU3TDUxMy43NSAxMy43NUw1MTcuNTAgMTcuMDVMNTIxLjI1IDIwLjA2TDUyNS4wMCAyMi40MEw1MjguNzUgMjMuODBMNTMyLjUwIDI0LjEwTDUzNi4yNSAyMy4yN0w1NDAuMDAgMjEuNDVMNTQzLjc1IDE4Ljg1TDU0Ny41MCAxNS44Mkw1NTEuMjUgMTIuNzRMNTU1LjAwIDkuOTlMNTU4Ljc1IDcuODlMNTYyLjUwIDYuNzBMNTY2LjI1IDYuNTVMNTcwLjAwIDcuNDRMNTczLjc1IDkuMjRMNTc3LjUwIDExLjcyTDU4MS4yNSAxNC41Nkw1ODUuMDAgMTcuNDBMNTg4Ljc1IDE5LjkwTDU5Mi41MCAyMS43NUw1OTYuMjUgMjIuNzRMNjAwLjAwIDIyLjc3IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjciIG9wYWNpdHk9IjAuOCIgc3R5bGU9Ii0tdzowLjc7c3Ryb2tlLXdpZHRoOmNhbGModmFyKC0tdykgKiB2YXIoLS1naywgMSkpIi8+PHBhdGggZD0iTTAuMDAgNy40NkwzLjc1IDguNDlMNy41MCAxMC4yOUwxMS4yNSAxMi42NUwxNS4wMCAxNS4yNUwxOC43NSAxNy43OEwyMi41MCAxOS45M0wyNi4yNSAyMS40NEwzMC4wMCAyMi4xM0wzMy43NSAyMS45NEwzNy41MCAyMC45MUw0MS4yNSAxOS4xNkw0NS4wMCAxNi45M0w0OC43NSAxNC40OUw1Mi41MCAxMi4xNUw1Ni4yNSAxMC4xOEw2MC4wMCA4LjgzTDYzLjc1IDguMjVMNjcuNTAgOC41MUw3MS4yNSA5LjU1TDc1LjAwIDExLjI2TDc4Ljc1IDEzLjQxTDgyLjUwIDE1Ljc0TDg2LjI1IDE3Ljk3TDkwLjAwIDE5LjgxTDkzLjc1IDIxLjA1TDk3LjUwIDIxLjU1TDEwMS4yNSAyMS4yM0wxMDUuMDAgMjAuMTVMMTA4Ljc1IDE4LjQ0TDExMi41MCAxNi4zMUwxMTYuMjUgMTQuMDFMMTIwLjAwIDExLjg0TDEyMy43NSAxMC4wNUwxMjcuNTAgOC44N0wxMzEuMjUgOC40NEwxMzUuMDAgOC44MkwxMzguNzUgOS45NkwxNDIuNTAgMTEuNzRMMTQ2LjI1IDEzLjkzTDE1MC4wMCAxNi4yNkwxNTMuNzUgMTguNDZMMTU3LjUwIDIwLjI1TDE2MS4yNSAyMS40MUwxNjUuMDAgMjEuNzhMMTY4Ljc1IDIxLjMyTDE3Mi41MCAyMC4wN0wxNzYuMjUgMTguMTdMMTgwLjAwIDE1Ljg2TDE4My43NSAxMy40MEwxODcuNTAgMTEuMTFMMTkxLjI1IDkuMjhMMTk1LjAwIDguMTJMMTk4Ljc1IDcuODFMMjAyLjUwIDguMzhMMjA2LjI1IDkuNzlMMjEwLjAwIDExLjg3TDIxMy43NSAxNC4zOEwyMTcuNTAgMTcuMDBMMjIxLjI1IDE5LjQyTDIyNS4wMCAyMS4zM0wyMjguNzUgMjIuNDlMMjMyLjUwIDIyLjczTDIzNi4yNSAyMi4wMUwyNDAuMDAgMjAuNDBMMjQzLjc1IDE4LjEwTDI0Ny41MCAxNS4zNkwyNTEuMjUgMTIuNTNMMjU1LjAwIDkuOTZMMjU4Ljc1IDcuOTdMMjYyLjUwIDYuODNMMjY2LjI1IDYuNjhMMjcwLjAwIDcuNTdMMjczLjc1IDkuNDFMMjc3LjUwIDExLjk3TDI4MS4yNSAxNC45NUwyODUuMDAgMTcuOTlMMjg4Ljc1IDIwLjcxTDI5Mi41MCAyMi43NUwyOTYuMjUgMjMuODZMMzAwLjAwIDIzLjg4TDMwMy43NSAyMi44MEwzMDcuNTAgMjAuNzJMMzExLjI1IDE3LjkwTDMxNS4wMCAxNC42OUwzMTguNzUgMTEuNDZMMzIyLjUwIDguNjRMMzI2LjI1IDYuNTdMMzMwLjAwIDUuNTNMMzMzLjc1IDUuNjZMMzM3LjUwIDYuOTVMMzQxLjI1IDkuMjZMMzQ1LjAwIDEyLjMwTDM0OC43NSAxNS43MkwzNTIuNTAgMTkuMDdMMzU2LjI1IDIxLjk1TDM2MC4wMCAyMy45OUwzNjMuNzUgMjQuOTJMMzY3LjUwIDI0LjYzTDM3MS4yNSAyMy4xNEwzNzUuMDAgMjAuNjNMMzc4Ljc1IDE3LjQxTDM4Mi41MCAxMy44N0wzODYuMjUgMTAuNDVMMzkwLjAwIDcuNTlMMzkzLjc1IDUuNjNMMzk3LjUwIDQuODRMNDAxLjI1IDUuMzBMNDA1LjAwIDYuOTZMNDA4Ljc1IDkuNjJMNDEyLjUwIDEyLjk2TDQxNi4yNSAxNi41NEw0MjAuMDAgMTkuOTNMNDIzLjc1IDIyLjcxTDQyNy41MCAyNC41M0w0MzEuMjUgMjUuMTdMNDM1LjAwIDI0LjU1TDQzOC43NSAyMi43NEw0NDIuNTAgMTkuOTlMNDQ2LjI1IDE2LjYzTDQ1MC4wMCAxMy4wOUw0NTMuNzUgOS44MEw0NTcuNTAgNy4xN0w0NjEuMjUgNS41M0w0NjUuMDAgNS4wN0w0NjguNzUgNS44M0w0NzIuNTAgNy43Mkw0NzYuMjUgMTAuNTBMNDgwLjAwIDEzLjgwTDQ4My43NSAxNy4yMkw0ODcuNTAgMjAuMzNMNDkxLjI1IDIyLjc2TDQ5NS4wMCAyNC4yMEw0OTguNzUgMjQuNDlMNTAyLjUwIDIzLjYxTDUwNi4yNSAyMS42OEw1MTAuMDAgMTguOTZMNTEzLjc1IDE1Ljc4TDUxNy41MCAxMi41NUw1MjEuMjUgOS42Nkw1MjUuMDAgNy40N0w1MjguNzUgNi4yNEw1MzIuNTAgNi4xMUw1MzYuMjUgNy4wNkw1NDAuMDAgOC45OEw1NDMuNzUgMTEuNjFMNTQ3LjUwIDE0LjYxTDU1MS4yNSAxNy42MUw1NTUuMDAgMjAuMjRMNTU4Ljc1IDIyLjE5TDU2Mi41MCAyMy4yMUw1NjYuMjUgMjMuMjJMNTcwLjAwIDIyLjIxTDU3My43NSAyMC4zNEw1NzcuNTAgMTcuODRMNTgxLjI1IDE1LjA0TDU4NS4wMCAxMi4yOUw1ODguNzUgOS45MUw1OTIuNTAgOC4yMEw1OTYuMjUgNy4zNUw2MDAuMDAgNy40NiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMC43IiBvcGFjaXR5PSIwLjgiIHN0eWxlPSItLXc6MC43O3N0cm9rZS13aWR0aDpjYWxjKHZhcigtLXcpICogdmFyKC0tZ2ssIDEpKSIvPjxwYXRoIGQ9Ik0wLjAwIDE5LjkyTDMuNzUgMTguMTFMNy41MCAxNS45M0wxMS4yNSAxMy42NEwxNS4wMCAxMS41MUwxOC43NSA5LjgxTDIyLjUwIDguNzVMMjYuMjUgOC40NkwzMC4wMCA4Ljk4TDMzLjc1IDEwLjIzTDM3LjUwIDEyLjA5TDQxLjI1IDE0LjMxTDQ1LjAwIDE2LjY0TDQ4Ljc1IDE4Ljc4TDUyLjUwIDIwLjQ2TDU2LjI1IDIxLjQ5TDYwLjAwIDIxLjcyTDYzLjc1IDIxLjEyTDY3LjUwIDE5Ljc2TDcxLjI1IDE3Ljc5TDc1LjAwIDE1LjQ1TDc4Ljc1IDEzLjAyTDgyLjUwIDEwLjgxTDg2LjI1IDkuMDhMOTAuMDAgOC4wN0w5My43NSA3LjkxTDk3LjUwIDguNjJMMTAxLjI1IDEwLjE0TDEwNS4wMCAxMi4yOUwxMDguNzUgMTQuODFMMTEyLjUwIDE3LjQwTDExNi4yNSAxOS43M0wxMjAuMDAgMjEuNTFMMTIzLjc1IDIyLjUxTDEyNy41MCAyMi42MEwxMzEuMjUgMjEuNzNMMTM1LjAwIDIwLjAxTDEzOC43NSAxNy42NEwxNDIuNTAgMTQuODlMMTQ2LjI1IDEyLjExTDE1MC4wMCA5LjY0TDE1My43NSA3Ljc5TDE1Ny41MCA2LjgxTDE2MS4yNSA2Ljg0TDE2NS4wMCA3Ljg5TDE2OC43NSA5Ljg0TDE3Mi41MCAxMi40N0wxNzYuMjUgMTUuNDZMMTgwLjAwIDE4LjQ0TDE4My43NSAyMS4wNEwxODcuNTAgMjIuOTNMMTkxLjI1IDIzLjg2TDE5NS4wMCAyMy43MEwxOTguNzUgMjIuNDVMMjAyLjUwIDIwLjI1TDIwNi4yNSAxNy4zN0wyMTAuMDAgMTQuMTVMMjEzLjc1IDEwLjk5TDIxNy41MCA4LjI5TDIyMS4yNSA2LjM5TDIyNS4wMCA1LjU0TDIyOC43NSA1Ljg1TDIzMi41MCA3LjMyTDIzNi4yNSA5Ljc1TDI0MC4wMCAxMi44N0wyNDMuNzUgMTYuMjhMMjQ3LjUwIDE5LjU3TDI1MS4yNSAyMi4zMkwyNTUuMDAgMjQuMThMMjU4Ljc1IDI0LjkyTDI2Mi41MCAyNC40MkwyNjYuMjUgMjIuNzZMMjcwLjAwIDIwLjEyTDI3My43NSAxNi44MkwyNzcuNTAgMTMuMjlMMjgxLjI1IDkuOTRMMjg1LjAwIDcuMjFMMjg4Ljc1IDUuNDRMMjkyLjUwIDQuODRMMjk2LjI1IDUuNTBMMzAwLjAwIDcuMzVMMzAzLjc1IDEwLjE0TDMwNy41MCAxMy41NEwzMTEuMjUgMTcuMTNMMzE1LjAwIDIwLjQ1TDMxOC43NSAyMy4wOUwzMjIuNTAgMjQuNzNMMzI2LjI1IDI1LjE3TDMzMC4wMCAyNC4zNEwzMzMuNzUgMjIuMzZMMzM3LjUwIDE5LjQ4TDM0MS4yNSAxNi4wNUwzNDUuMDAgMTIuNTFMMzQ4Ljc1IDkuMjlMMzUyLjUwIDYuODBMMzU2LjI1IDUuMzNMMzYwLjAwIDUuMDdMMzYzLjc1IDYuMDNMMzY3LjUwIDguMTBMMzcxLjI1IDExLjAwTDM3NS4wMCAxNC4zN0wzNzguNzUgMTcuNzhMMzgyLjUwIDIwLjgzTDM4Ni4yNSAyMy4xMkwzOTAuMDAgMjQuMzlMMzkzLjc1IDI0LjQ5TDM5Ny41MCAyMy40Mkw0MDEuMjUgMjEuMzJMNDA1LjAwIDE4LjQ4TDQwOC43NSAxNS4yNEw0MTIuNTAgMTIuMDFMNDE2LjI1IDkuMTlMNDIwLjAwIDcuMTNMNDIzLjc1IDYuMDZMNDI3LjUwIDYuMTFMNDMxLjI1IDcuMjVMNDM1LjAwIDkuMzNMNDM4Ljc1IDEyLjA2TDQ0Mi41MCAxNS4xMkw0NDYuMjUgMTguMTFMNDUwLjAwIDIwLjY4TDQ1My43NSAyMi41MEw0NTcuNTAgMjMuMzdMNDYxLjI1IDIzLjIwTDQ2NS4wMCAyMi4wM0w0NjguNzUgMjAuMDFMNDcyLjUwIDE3LjQyTDQ3Ni4yNSAxNC41N0w0ODAuMDAgMTEuODNMNDgzLjc1IDkuNTJMNDg3LjUwIDcuOTJMNDkxLjI1IDcuMjNMNDk1LjAwIDcuNDlMNDk4Ljc1IDguNjdMNTAyLjUwIDEwLjYxTDUwNi4yNSAxMy4wNUw1MTAuMDAgMTUuNjlMNTEzLjc1IDE4LjIwTDUxNy41MCAyMC4yOEw1MjEuMjUgMjEuNjdMNTI1LjAwIDIyLjIzTDUyOC43NSAyMS44OUw1MzIuNTAgMjAuNzFMNTM2LjI1IDE4Ljg1TDU0MC4wMCAxNi41NUw1NDMuNzUgMTQuMDhMNTQ3LjUwIDExLjc3TDU1MS4yNSA5Ljg4TDU1NS4wMCA4LjY0TDU1OC43NSA4LjE5TDU2Mi41MCA4LjU5TDU2Ni4yNSA5Ljc3TDU3MC4wMCAxMS41OEw1NzMuNzUgMTMuNzlMNTc3LjUwIDE2LjEzTDU4MS4yNSAxOC4zMkw1ODUuMDAgMjAuMDhMNTg4Ljc1IDIxLjIxTDU5Mi41MCAyMS41N0w1OTYuMjUgMjEuMTJMNjAwLjAwIDE5LjkyIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjciIG9wYWNpdHk9IjAuOCIgc3R5bGU9Ii0tdzowLjc7c3Ryb2tlLXdpZHRoOmNhbGModmFyKC0tdykgKiB2YXIoLS1naywgMSkpIi8+PHBhdGggZD0iTTAuMDAgOS4zMUwzLjc1IDEwLjkxTDcuNTAgMTMuMDBMMTEuMjUgMTUuMzJMMTUuMDAgMTcuNThMMTguNzUgMTkuNTFMMjIuNTAgMjAuODhMMjYuMjUgMjEuNTJMMzAuMDAgMjEuMzVMMzMuNzUgMjAuNDBMMzcuNTAgMTguNzlMNDEuMjUgMTYuNzJMNDUuMDAgMTQuNDNMNDguNzUgMTIuMjFMNTIuNTAgMTAuMzRMNTYuMjUgOS4wM0w2MC4wMCA4LjQ2TDYzLjc1IDguNjlMNjcuNTAgOS43MUw3MS4yNSAxMS4zOEw3NS4wMCAxMy41MUw3OC43NSAxNS44NEw4Mi41MCAxOC4wOEw4Ni4yNSAxOS45N0w5MC4wMCAyMS4yNUw5My43NSAyMS43N0w5Ny41MCAyMS40NkwxMDEuMjUgMjAuMzVMMTA1LjAwIDE4LjU1TDEwOC43NSAxNi4zMEwxMTIuNTAgMTMuODVMMTE2LjI1IDExLjUxTDEyMC4wMCA5LjU3TDEyMy43NSA4LjI4TDEyNy41MCA3LjgwTDEzMS4yNSA4LjIyTDEzNS4wMCA5LjQ4TDEzOC43NSAxMS40NUwxNDIuNTAgMTMuOTBMMTQ2LjI1IDE2LjUzTDE1MC4wMCAxOS4wMUwxNTMuNzUgMjEuMDNMMTU3LjUwIDIyLjMzTDE2MS4yNSAyMi43NUwxNjUuMDAgMjIuMjBMMTY4Ljc1IDIwLjc1TDE3Mi41MCAxOC41NkwxNzYuMjUgMTUuODhMMTgwLjAwIDEzLjA0TDE4My43NSAxMC40MEwxODcuNTAgOC4yOEwxOTEuMjUgNi45N0wxOTUuMDAgNi42NEwxOTguNzUgNy4zNEwyMDIuNTAgOS4wMUwyMDYuMjUgMTEuNDZMMjEwLjAwIDE0LjM5TDIxMy43NSAxNy40NUwyMTcuNTAgMjAuMjVMMjIxLjI1IDIyLjQ0TDIyNS4wMCAyMy43M0wyMjguNzUgMjMuOTZMMjMyLjUwIDIzLjA3TDIzNi4yNSAyMS4xNkwyNDAuMDAgMTguNDZMMjQzLjc1IDE1LjI4TDI0Ny41MCAxMi4wM0wyNTEuMjUgOS4xMUwyNTUuMDAgNi44OEwyNTguNzUgNS42NEwyNjIuNTAgNS41NUwyNjYuMjUgNi42NEwyNzAuMDAgOC43N0wyNzMuNzUgMTEuNzFMMjc3LjUwIDE1LjA4TDI4MS4yNSAxOC40OEwyODUuMDAgMjEuNDdMMjg4Ljc1IDIzLjY5TDI5Mi41MCAyNC44NEwyOTYuMjUgMjQuNzdMMzAwLjAwIDIzLjQ5TDMwMy43NSAyMS4xNUwzMDcuNTAgMTguMDNMMzExLjI1IDE0LjUyTDMxNS4wMCAxMS4wNUwzMTguNzUgOC4wNUwzMjIuNTAgNS45MUwzMjYuMjUgNC44OUwzMzAuMDAgNS4xMkwzMzMuNzUgNi41OEwzMzcuNTAgOS4wOEwzNDEuMjUgMTIuMzJMMzQ1LjAwIDE1Ljg5TDM0OC43NSAxOS4zNUwzNTIuNTAgMjIuMjdMMzU2LjI1IDI0LjI4TDM2MC4wMCAyNS4xNUwzNjMuNzUgMjQuNzVMMzY3LjUwIDIzLjE1TDM3MS4yNSAyMC41NUwzNzUuMDAgMTcuMjdMMzc4Ljc1IDEzLjczTDM4Mi41MCAxMC4zNkwzODYuMjUgNy41OUwzOTAuMDAgNS43NEwzOTMuNzUgNS4wNUwzOTcuNTAgNS42MEw0MDEuMjUgNy4zMEw0MDUuMDAgOS45NEw0MDguNzUgMTMuMTdMNDEyLjUwIDE2LjYxTDQxNi4yNSAxOS44MUw0MjAuMDAgMjIuMzhMNDIzLjc1IDI0LjAyTDQyNy41MCAyNC41M0w0MzEuMjUgMjMuODZMNDM1LjAwIDIyLjExTDQzOC43NSAxOS41MEw0NDIuNTAgMTYuMzdMNDQ2LjI1IDEzLjEyTDQ1MC4wMCAxMC4xNEw0NTMuNzUgNy44MEw0NTcuNTAgNi4zOEw0NjEuMjUgNi4wNEw0NjUuMDAgNi44MUw0NjguNzUgOC41N0w0NzIuNTAgMTEuMDlMNDc2LjI1IDE0LjA1TDQ4MC4wMCAxNy4wOEw0ODMuNzUgMTkuODFMNDg3LjUwIDIxLjkwTDQ5MS4yNSAyMy4xMUw0OTUuMDAgMjMuMzBMNDk4Ljc1IDIyLjQ3TDUwMi41MCAyMC43NEw1MDYuMjUgMTguMzNMNTEwLjAwIDE1LjU2TDUxMy43NSAxMi43N0w1MTcuNTAgMTAuMzBMNTIxLjI1IDguNDVMNTI1LjAwIDcuNDNMNTI4Ljc1IDcuMzZMNTMyLjUwIDguMjNMNTM2LjI1IDkuOTFMNTQwLjAwIDEyLjE5TDU0My43NSAxNC43N0w1NDcuNTAgMTcuMzRMNTUxLjI1IDE5LjU4TDU1NS4wMCAyMS4yMkw1NTguNzUgMjIuMDhMNTYyLjUwIDIyLjA1TDU2Ni4yNSAyMS4xNkw1NzAuMDAgMTkuNTNMNTczLjc1IDE3LjM2TDU3Ny41MCAxNC45NEw1ODEuMjUgMTIuNTVMNTg1LjAwIDEwLjUwTDU4OC43NSA5LjAyTDU5Mi41MCA4LjI5TDU5Ni4yNSA4LjM5TDYwMC4wMCA5LjMxIiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjciIG9wYWNpdHk9IjAuOCIgc3R5bGU9Ii0tdzowLjc7c3Ryb2tlLXdpZHRoOmNhbGModmFyKC0tdykgKiB2YXIoLS1naywgMSkpIi8+PHBhdGggZD0iTTAuMDAgMTcuMTZMMy43NSAxNC42MEw3LjUwIDEyLjA1TDExLjI1IDkuODJMMTUuMDAgOC4yMEwxOC43NSA3LjQwTDIyLjUwIDcuNTNMMjYuMjUgOC42MEwzMC4wMCAxMC40OEwzMy43NSAxMi45NkwzNy41MCAxNS43NEw0MS4yNSAxOC40OEw0NS4wMCAyMC44M0w0OC43NSAyMi41MEw1Mi41MCAyMy4yNkw1Ni4yNSAyMy4wMEw2MC4wMCAyMS43NEw2My43NSAxOS42MUw2Ny41MCAxNi44OEw3MS4yNSAxMy44Nkw3NS4wMCAxMC45NEw3OC43NSA4LjQ3TDgyLjUwIDYuNzhMODYuMjUgNi4wOUw5MC4wMCA2LjUwTDkzLjc1IDcuOTdMOTcuNTAgMTAuMzVMMTAxLjI1IDEzLjM0TDEwNS4wMCAxNi41OEwxMDguNzUgMTkuNjZMMTEyLjUwIDIyLjIxTDExNi4yNSAyMy44OUwxMjAuMDAgMjQuNDhMMTIzLjc1IDIzLjkwTDEyNy41MCAyMi4yMUwxMzEuMjUgMTkuNTlMMTM1LjAwIDE2LjM4TDEzOC43NSAxMi45NkwxNDIuNTAgOS43NkwxNDYuMjUgNy4xOUwxNTAuMDAgNS41NkwxNTMuNzUgNS4xMEwxNTcuNTAgNS44NkwxNjEuMjUgNy43NkwxNjUuMDAgMTAuNThMMTY4Ljc1IDEzLjk2TDE3Mi41MCAxNy40OUwxNzYuMjUgMjAuNzNMMTgwLjAwIDIzLjI4TDE4My43NSAyNC44MEwxODcuNTAgMjUuMTJMMTkxLjI1IDI0LjE4TDE5NS4wMCAyMi4xMEwxOTguNzUgMTkuMTNMMjAyLjUwIDE1LjY1TDIwNi4yNSAxMi4wOUwyMTAuMDAgOC44OUwyMTMuNzUgNi40NEwyMTcuNTAgNS4wNkwyMjEuMjUgNC45MUwyMjUuMDAgNi4wMUwyMjguNzUgOC4yMkwyMzIuNTAgMTEuMjZMMjM2LjI1IDE0Ljc1TDI0MC4wMCAxOC4yNkwyNDMuNzUgMjEuMzVMMjQ3LjUwIDIzLjYzTDI1MS4yNSAyNC44NEwyNTUuMDAgMjQuODNMMjU4Ljc1IDIzLjYwTDI2Mi41MCAyMS4zMkwyNjYuMjUgMTguMjhMMjcwLjAwIDE0Ljg2TDI3My43NSAxMS40OUwyNzcuNTAgOC41OEwyODEuMjUgNi40OUwyODUuMDAgNS40N0wyODguNzUgNS42NEwyOTIuNTAgNi45NkwyOTYuMjUgOS4yNUwzMDAuMDAgMTIuMjJMMzAzLjc1IDE1LjUwTDMwNy41MCAxOC42N0wzMTEuMjUgMjEuMzVMMzE1LjAwIDIzLjIxTDMxOC43NSAyNC4wNEwzMjIuNTAgMjMuNzRMMzI2LjI1IDIyLjM3TDMzMC4wMCAyMC4xMkwzMzMuNzUgMTcuMjdMMzM3LjUwIDE0LjE5TDM0MS4yNSAxMS4yNkwzNDUuMDAgOC44M0wzNDguNzUgNy4yMUwzNTIuNTAgNi41NkwzNTYuMjUgNi45NkwzNjAuMDAgOC4zNUwzNjMuNzUgMTAuNTJMMzY3LjUwIDEzLjIxTDM3MS4yNSAxNi4wN0wzNzUuMDAgMTguNzVMMzc4Ljc1IDIwLjkyTDM4Mi41MCAyMi4zM0wzODYuMjUgMjIuODFMMzkwLjAwIDIyLjMzTDM5My43NSAyMC45NkwzOTcuNTAgMTguODhMNDAxLjI1IDE2LjM3TDQwNS4wMCAxMy43Mkw0MDguNzUgMTEuMjhMNDEyLjUwIDkuMzRMNDE2LjI1IDguMTJMNDIwLjAwIDcuNzZMNDIzLjc1IDguMjlMNDI3LjUwIDkuNjRMNDMxLjI1IDExLjYzTDQzNS4wMCAxNC4wMEw0MzguNzUgMTYuNDZMNDQyLjUwIDE4LjcxTDQ0Ni4yNSAyMC40N0w0NTAuMDAgMjEuNTRMNDUzLjc1IDIxLjgwTDQ1Ny41MCAyMS4yMkw0NjEuMjUgMTkuODhMNDY1LjAwIDE3Ljk2TDQ2OC43NSAxNS42OUw0NzIuNTAgMTMuMzZMNDc2LjI1IDExLjI0TDQ4MC4wMCA5LjYwTDQ4My43NSA4LjY0TDQ4Ny41MCA4LjQ2TDQ5MS4yNSA5LjA5TDQ5NS4wMCAxMC40NEw0OTguNzUgMTIuMzVMNTAyLjUwIDE0LjU4TDUwNi4yNSAxNi44Nkw1MTAuMDAgMTguOTFMNTEzLjc1IDIwLjQ4TDUxNy41MCAyMS4zOEw1MjEuMjUgMjEuNDlMNTI1LjAwIDIwLjgwTDUyOC43NSAxOS4zOUw1MzIuNTAgMTcuNDRMNTM2LjI1IDE1LjE3TDU0MC4wMCAxMi44Nkw1NDMuNzUgMTAuODBMNTQ3LjUwIDkuMjVMNTUxLjI1IDguMzlMNTU1LjAwIDguMzVMNTU4Ljc1IDkuMTNMNTYyLjUwIDEwLjY0TDU2Ni4yNSAxMi43Mkw1NzAuMDAgMTUuMTBMNTczLjc1IDE3LjUwTDU3Ny41MCAxOS42Mkw1ODEuMjUgMjEuMjBMNTg1LjAwIDIyLjAzTDU4OC43NSAyMi4wMEw1OTIuNTAgMjEuMDlMNTk2LjI1IDE5LjQyTDYwMC4wMCAxNy4xNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMC43IiBvcGFjaXR5PSIwLjgiIHN0eWxlPSItLXc6MC43O3N0cm9rZS13aWR0aDpjYWxjKHZhcigtLXcpICogdmFyKC0tZ2ssIDEpKSIvPjxwYXRoIGQ9Ik0wLjAwIDEzLjA5TDMuNzUgMTUuNzFMNy41MCAxOC4yOUwxMS4yNSAyMC41MEwxNS4wMCAyMi4wNkwxOC43NSAyMi43N0wyMi41MCAyMi41MkwyNi4yNSAyMS4zM0wzMC4wMCAxOS4zM0wzMy43NSAxNi43NkwzNy41MCAxMy45MUw0MS4yNSAxMS4xNkw0NS4wMCA4LjgzTDQ4Ljc1IDcuMjNMNTIuNTAgNi41OEw1Ni4yNSA2Ljk2TDYwLjAwIDguMzZMNjMuNzUgMTAuNjFMNjcuNTAgMTMuNDRMNzEuMjUgMTYuNTFMNzUuMDAgMTkuNDVMNzguNzUgMjEuODhMODIuNTAgMjMuNDhMODYuMjUgMjQuMDVMOTAuMDAgMjMuNTFMOTMuNzUgMjEuODlMOTcuNTAgMTkuMzlMMTAxLjI1IDE2LjMxTDEwNS4wMCAxMy4wMkwxMDguNzUgOS45NEwxMTIuNTAgNy40NUwxMTYuMjUgNS44N0wxMjAuMDAgNS40MUwxMjMuNzUgNi4xNEwxMjcuNTAgNy45OEwxMzEuMjUgMTAuNzFMMTM1LjAwIDE0LjAxTDEzOC43NSAxNy40NUwxNDIuNTAgMjAuNjJMMTQ2LjI1IDIzLjEyTDE1MC4wMCAyNC42M0wxNTMuNzUgMjQuOTVMMTU3LjUwIDI0LjA0TDE2MS4yNSAyMS45OUwxNjUuMDAgMTkuMDdMMTY4Ljc1IDE1LjYzTDE3Mi41MCAxMi4wOUwxNzYuMjUgOC45MEwxODAuMDAgNi40NkwxODMuNzUgNS4wN0wxODcuNTAgNC45MUwxOTEuMjUgNS45OUwxOTUuMDAgOC4yMEwxOTguNzUgMTEuMjVMMjAyLjUwIDE0Ljc2TDIwNi4yNSAxOC4zMUwyMTAuMDAgMjEuNDRMMjEzLjc1IDIzLjc2TDIxNy41MCAyNS4wMEwyMjEuMjUgMjUuMDBMMjI1LjAwIDIzLjc2TDIyOC43NSAyMS40NEwyMzIuNTAgMTguMzRMMjM2LjI1IDE0Ljg0TDI0MC4wMCAxMS4zN0wyNDMuNzUgOC4zOEwyNDcuNTAgNi4yMkwyNTEuMjUgNS4xNkwyNTUuMDAgNS4zM0wyNTguNzUgNi42OEwyNjIuNTAgOS4wNUwyNjYuMjUgMTIuMTNMMjcwLjAwIDE1LjU0TDI3My43NSAxOC44NUwyNzcuNTAgMjEuNjRMMjgxLjI1IDIzLjU5TDI4NS4wMCAyNC40NkwyODguNzUgMjQuMTZMMjkyLjUwIDIyLjczTDI5Ni4yNSAyMC4zNkwzMDAuMDAgMTcuMzdMMzAzLjc1IDE0LjEzTDMwNy41MCAxMS4wNEwzMTEuMjUgOC40OEwzMTUuMDAgNi43NkwzMTguNzUgNi4wN0wzMjIuNTAgNi41MEwzMjYuMjUgNy45NkwzMzAuMDAgMTAuMjdMMzMzLjc1IDEzLjExTDMzNy41MCAxNi4xNUwzNDEuMjUgMTguOTlMMzQ1LjAwIDIxLjMwTDM0OC43NSAyMi43OUwzNTIuNTAgMjMuMzBMMzU2LjI1IDIyLjc5TDM2MC4wMCAyMS4zM0wzNjMuNzUgMTkuMTFMMzY3LjUwIDE2LjQ0TDM3MS4yNSAxMy42M0wzNzUuMDAgMTEuMDRMMzc4Ljc1IDguOThMMzgyLjUwIDcuNzBMMzg2LjI1IDcuMzNMMzkwLjAwIDcuOTFMMzkzLjc1IDkuMzVMMzk3LjUwIDExLjQ1TDQwMS4yNSAxMy45Nkw0MDUuMDAgMTYuNTVMNDA4Ljc1IDE4LjkxTDQxMi41MCAyMC43Nkw0MTYuMjUgMjEuODZMNDIwLjAwIDIyLjEyTDQyMy43NSAyMS40OUw0MjcuNTAgMjAuMDhMNDMxLjI1IDE4LjA3TDQzNS4wMCAxNS43MEw0MzguNzUgMTMuMjhMNDQyLjUwIDExLjExTDQ0Ni4yNSA5LjQzTDQ1MC4wMCA4LjQ2TDQ1My43NSA4LjMwTDQ1Ny41MCA4Ljk2TDQ2MS4yNSAxMC4zNkw0NjUuMDAgMTIuMzJMNDY4Ljc1IDE0LjU5TDQ3Mi41MCAxNi44OUw0NzYuMjUgMTguOTVMNDgwLjAwIDIwLjUyTDQ4My43NSAyMS40MEw0ODcuNTAgMjEuNDhMNDkxLjI1IDIwLjc3TDQ5NS4wMCAxOS4zNUw0OTguNzUgMTcuNDBMNTAyLjUwIDE1LjE1TDUwNi4yNSAxMi44OEw1MTAuMDAgMTAuODdMNTEzLjc1IDkuMzZMNTE3LjUwIDguNTVMNTIxLjI1IDguNTJMNTI1LjAwIDkuMzBMNTI4Ljc1IDEwLjc5TDUzMi41MCAxMi44MEw1MzYuMjUgMTUuMTFMNTQwLjAwIDE3LjQyTDU0My43NSAxOS40NUw1NDcuNTAgMjAuOTVMNTUxLjI1IDIxLjcyTDU1NS4wMCAyMS42OEw1NTguNzUgMjAuODBMNTYyLjUwIDE5LjE5TDU2Ni4yNSAxNy4wNEw1NzAuMDAgMTQuNjFMNTczLjc1IDEyLjE5TDU3Ny41MCAxMC4wOUw1ODEuMjUgOC41N0w1ODUuMDAgNy44Mkw1ODguNzUgNy45NUw1OTIuNTAgOC45N0w1OTYuMjUgMTAuNzVMNjAwLjAwIDEzLjA5IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIwLjciIG9wYWNpdHk9IjAuOCIgc3R5bGU9Ii0tdzowLjc7c3Ryb2tlLXdpZHRoOmNhbGModmFyKC0tdykgKiB2YXIoLS1naywgMSkpIi8+PC9zdmc+);
}

   /* GENERERET af byg-ui.py */

/* ─── kits/ui/02-materiale/sejr-illustration.css ─── */
/* SEJR UI — illustrationerne. GENERERET.
 *
 * ██ RET ALDRIG DENNE FIL I HÅNDEN. Ret `byg-ui.py` og kør den igen.
 *
 * SEJR har ingen stregtegninger og skal ikke have nogen. En tom tilstand
 * tegnet med en glad figur er et andet firmas sprog, og den ville være det
 * eneste i hele systemet der ikke var målt.
 *
 * Til gengæld ligger der tyve plader i fundamentet med BETYDNING i sig —
 * valgt og begrundet i §05. Betydningen er ikke opfundet her.
 *
 * EN ILLUSTRATION ER ALDRIG BESKEDEN. Pladen står over en overskrift og en
 * sætning der siger hvad man gør. Samme lov som farve og skravering: pladen
 * bekræfter det, ordet allerede har sagt. En bro alene fortæller ingen at de
 * skal knytte deres bank til kontoen.
 *
 * ─── HVORFOR PLADERNE ER FILER OG SKRAVERINGEN ER DATA-URI'ER ─────────────
 *
 * Skraveringsfliserne er 370 bytes og gentages i hvert eneste tilstandsmærke
 * på skærmen; de hører i CSS'en. Pladerne er 12-36 kB hver, og lagt ind som
 * data-URI'er blev denne fil 175 kB — båret af hver app, også dem der aldrig
 * viser en tom tilstand.
 *
 * De ligger derfor som filer i `./illustration/`, INDE i pakken, så en
 * relativ URL overlever at nogen bundler kittet. Samme svar som
 * terminal-kittet giver: små ting bages ind, store ting leveres ved siden af.
 *
 * Filerne er KOPIER, tegnet af den samme plade som fundamentet tegner. De må
 * aldrig rettes i hånden: `proev-alt.py` bygger dem igen og fælder hvis en
 * kopi er drevet fra sin kilde.
 */

.gravure {
  display: block;
  background-color: currentColor;
  opacity: .38;
  mask-repeat: no-repeat;
  mask-position: center;
  mask-size: contain;
}

/* Pladen er tegning, ikke tekst. Bærer den betydning i en bestemt
   sammenhæng, skal den have et rigtigt navn i markup — role="img" og
   aria-label — og oplysningen skal ALLIGEVEL stå som tekst på samme flade.
   Uden label er den dekoration og skal være aria-hidden. */
@supports not (mask-image: none) {
  .gravure { display: none; }
}

/* rosette     — The seal itself. Signature moments and locked prospects. */
.gravure-rosette {
  aspect-ratio: 200 / 200;
  mask-image: url("/identitet/aktiver/gravure-rosette.svg");
}

/* baand       — The note edge. Card faces, price rules, section seams. */
.gravure-baand {
  aspect-ratio: 600 / 28;
  mask-image: url("/identitet/aktiver/gravure-baand.svg");
}

/* hjoerne     — The certificate corner. Onboarding, card order, anything that is a proof. */
.gravure-hjoerne {
  aspect-ratio: 160 / 160;
  mask-image: url("/identitet/aktiver/gravure-hjoerne.svg");
}

/* segl        — The stamp. Where a file becomes a document. */
.gravure-segl {
  aspect-ratio: 180 / 180;
  mask-image: url("/identitet/aktiver/gravure-segl.svg");
}

/* krans       — Laurel. The result: granted, opened, on its way. */
.gravure-krans {
  aspect-ratio: 190 / 190;
  mask-image: url("/identitet/aktiver/gravure-krans.svg");
}

/* bro         — The crossing. Payments and transfers. */
.gravure-bro {
  aspect-ratio: 380 / 190;
  mask-image: url("/identitet/aktiver/gravure-bro.svg");
}

/* akser       — Wheat. The overview — what grows. */
.gravure-akser {
  aspect-ratio: 170 / 170;
  mask-image: url("/identitet/aktiver/gravure-akser.svg");
}

/* lineal      — The ledger ruling. Statements, books, any reckoning. */
.gravure-lineal {
  aspect-ratio: 420 / 260;
  mask-image: url("/identitet/aktiver/gravure-lineal.svg");
}

/* kartouche   — The figure's setting. Where the balance lives. */
.gravure-kartouche {
  aspect-ratio: 340 / 150;
  mask-image: url("/identitet/aktiver/gravure-kartouche.svg");
}

/* instrument  — The graduated scale. How SEJR draws a chart. */
.gravure-instrument {
  aspect-ratio: 320 / 108;
  mask-image: url("/identitet/aktiver/gravure-instrument.svg");
}

/* lagt-papir  — The laid ground. Letterhead, section fields, empty states. */
.gravure-lagt-papir {
  aspect-ratio: 300 / 200;
  mask-image: url("/identitet/aktiver/gravure-lagt-papir.svg");
}

/* vaev        — The cross-ply tint. Large empty ground only. */
.gravure-vaev {
  aspect-ratio: 300 / 200;
  mask-image: url("/identitet/aktiver/gravure-vaev.svg");
}

/* marmor      — Nonpareil marbling. The one organic plate. Print only. */
.gravure-marmor {
  aspect-ratio: 300 / 200;
  mask-image: url("/identitet/aktiver/gravure-marmor.svg");
}

/* port        — The gateway. Openness - a bank that lets you in. */
.gravure-port {
  aspect-ratio: 300 / 210;
  mask-image: url("/identitet/aktiver/gravure-port.svg");
}

/* genstand    — The balance scale. Fair measure, which is what settlement is. */
.gravure-genstand {
  aspect-ratio: 300 / 170;
  mask-image: url("/identitet/aktiver/gravure-genstand.svg");
}

/* hatch       — The hatch code. Colour without colour, on every plate. */
.gravure-hatch {
  aspect-ratio: 400 / 78;
  mask-image: url("/identitet/aktiver/gravure-hatch.svg");
}

/* kant        — The running edge that meets the corner without a seam. */
.gravure-kant {
  aspect-ratio: 300 / 300;
  mask-image: url("/identitet/aktiver/gravure-kant.svg");
}

/* mikro       — The legal furniture. True registration only, never security. */
.gravure-mikro {
  aspect-ratio: 420 / 130;
  mask-image: url("/identitet/aktiver/gravure-mikro.svg");
}

/* annullering — The cancellation. The one plate allowed over content. */
.gravure-annullering {
  aspect-ratio: 420 / 190;
  mask-image: url("/identitet/aktiver/gravure-annullering.svg");
}

/* vandmaerke  — The watermark. A density change in the same material. */
.gravure-vandmaerke {
  aspect-ratio: 420 / 200;
  mask-image: url("/identitet/aktiver/gravure-vandmaerke.svg");
}

/* boelge      — The wave underprint. The restless ground every old note carries. */
.gravure-boelge {
  aspect-ratio: 420 / 200;
  mask-image: url("/identitet/aktiver/gravure-boelge.svg");
}

/* spiro       — Engine turning proper. The lathe's own closed line. */
.gravure-spiro {
  aspect-ratio: 220 / 220;
  mask-image: url("/identitet/aktiver/gravure-spiro.svg");
}

/* boers       — The Exchange, 1625. Trade's own house, dragon spire and all. */
.gravure-boers {
  aspect-ratio: 380 / 240;
  mask-image: url("/identitet/aktiver/gravure-boers.svg");
}

/* skib        — The merchant full-rigger. What carried Danish trade. */
.gravure-skib {
  aspect-ratio: 300 / 220;
  mask-image: url("/identitet/aktiver/gravure-skib.svg");
}

/* palae       — Erichsens Palae, 1799. A trade fortune's house on Holmens Kanal. */
.gravure-palae {
  aspect-ratio: 300 / 230;
  mask-image: url("/identitet/aktiver/gravure-palae.svg");
}

/* moent       — Svend Tveskaeg's coin, 995. The first to bear king and country. */
.gravure-moent {
  aspect-ratio: 160 / 160;
  mask-image: url("/identitet/aktiver/gravure-moent.svg");
}

/* merkur      — The caduceus. Trade's own emblem, the Exchange's own god. */
.gravure-merkur {
  aspect-ratio: 140 / 220;
  mask-image: url("/identitet/aktiver/gravure-merkur.svg");
}

/* rundetaarn  — The Round Tower, 1642. Science over the trading city. */
.gravure-rundetaarn {
  aspect-ratio: 160 / 260;
  mask-image: url("/identitet/aktiver/gravure-rundetaarn.svg");
}

/* kronborg    — Kronborg, 1585. The Sound Toll's castle - money history itself. */
.gravure-kronborg {
  aspect-ratio: 380 / 200;
  mask-image: url("/identitet/aktiver/gravure-kronborg.svg");
}

/* opgoerelse  — The itemised bill. A closed reckoning, not an open book. */
.gravure-opgoerelse {
  aspect-ratio: 420 / 200;
  mask-image: url("/identitet/aktiver/gravure-opgoerelse.svg");
}

/* deling      — The fee in three. Two parts that are not ours, one that is. */
.gravure-deling {
  aspect-ratio: 340 / 150;
  mask-image: url("/identitet/aktiver/gravure-deling.svg");
}

/* fjerdedel   — VAT as a quarter, true by construction rather than by claim. */
.gravure-fjerdedel {
  aspect-ratio: 240 / 200;
  mask-image: url("/identitet/aktiver/gravure-fjerdedel.svg");
}

/* register    — The lookup. Someone else's register, and the entry found. */
.gravure-register {
  aspect-ratio: 300 / 180;
  mask-image: url("/identitet/aktiver/gravure-register.svg");
}

/* tydning     — The key. The line as printed, and what it means. */
.gravure-tydning {
  aspect-ratio: 320 / 190;
  mask-image: url("/identitet/aktiver/gravure-tydning.svg");
}

/* kaede       — The IBAN chain, and the one link that carries the check. */
.gravure-kaede {
  aspect-ratio: 400 / 140;
  mask-image: url("/identitet/aktiver/gravure-kaede.svg");
}

/* skilt       — The hung board. The one tool that ends as paper in a window. */
.gravure-skilt {
  aspect-ratio: 260 / 210;
  mask-image: url("/identitet/aktiver/gravure-skilt.svg");
}

/* indfatning  — The medallion rim. The milled ring that sets chaos as a coin. */
.gravure-indfatning {
  aspect-ratio: 240 / 240;
  mask-image: url("/identitet/aktiver/gravure-indfatning.svg");
}

/* marmorkirken — Marmorkirken, 1894. Tietgen's dome - the ruin finance finished. */
.gravure-marmorkirken {
  aspect-ratio: 260 / 240;
  mask-image: url("/identitet/aktiver/gravure-marmorkirken.svg");
}

/* telegraf    — Great Northern's mast, 1869. Tietgen wired Denmark to the world. */
.gravure-telegraf {
  aspect-ratio: 300 / 220;
  mask-image: url("/identitet/aktiver/gravure-telegraf.svg");
}

/* dampskib    — The DFDS steamer, 1866. Tietgen's steam succeeding sail. */
.gravure-dampskib {
  aspect-ratio: 300 / 200;
  mask-image: url("/identitet/aktiver/gravure-dampskib.svg");
}

/* ringbaand   — The calm medallion band. A wreath, not weather. */
.gravure-ringbaand {
  aspect-ratio: 240 / 240;
  mask-image: url("/identitet/aktiver/gravure-ringbaand.svg");
}

/* engangs     — Paid once. One field at the start, and the band goes quiet. */
.gravure-engangs {
  aspect-ratio: 340 / 150;
  mask-image: url("/identitet/aktiver/gravure-engangs.svg");
}

/* tilbagevendende — Every month. The same field, again, and off the edge. */
.gravure-tilbagevendende {
  aspect-ratio: 340 / 150;
  mask-image: url("/identitet/aktiver/gravure-tilbagevendende.svg");
}

/* trin        — The tier rising, and crossing the flat line it overtakes. */
.gravure-trin {
  aspect-ratio: 340 / 150;
  mask-image: url("/identitet/aktiver/gravure-trin.svg");
}

/* GENERERET af byg-ui.py */

/* ─── kits/ui/02-materiale/sejr-venter.css ─── */
/* SEJR UI — det der venter. Skelettet, mens tallet er på vej.
 *
 * Skrevet 22. august 2026.
 *
 * ─── DEN ENE REGEL DER GØR DET FARLIGT ─────────────────────────────────────
 *
 * ET SKELET VISER ALDRIG ET TAL. Ikke et gråt tal, ikke et udtonet tal, ikke
 * «0,00» mens det rigtige hentes. Et beløb der står på skærmen bliver læst,
 * også når det er lyst, og en handelsdrivende der ser 0,00 i et halvt sekund
 * har set noget der ikke er sandt.
 *
 * Det er den samme lov som «et beløb animerer aldrig sin værdi», og den er
 * skrappere her: en optælling er i det mindste ærlig om at være i gang. Et
 * bleget tal ligner et resultat.
 *
 * Derfor har `.venter` `color: transparent` — tekst inde i den forsvinder,
 * selvom nogen skriver et tal ind i markup ved et uheld. Det er ikke pynt;
 * det er en spærre.
 *
 * ─── OG SÅ EN TIL ─────────────────────────────────────────────────────────
 *
 * SKELETTET HAR SAMME FORM SOM DET DER KOMMER. Er beløbet 116 px bredt, er
 * bjælken 116 px bred. Ellers hopper hele fladen når indholdet lander, og et
 * hop er den dyreste bevægelse der findes — den flytter det man var ved at
 * læse.
 *
 * ─── BRUG ──────────────────────────────────────────────────────────────────
 *
 *   <div class="liste-belob venter" aria-hidden="true">18.240,50</div>
 *
 * Beholderen skal bære `aria-busy="true"`, og der skal være et
 * `aria-live`-område der siger til når indholdet er landet. Et skelet er
 * usynligt for en skærmlæser — for den er der bare ingenting, i ubestemt tid.
 */

.venter {
  color: transparent !important;   /* spærren. Se hovedet. */
  background-color: var(--flade-3);
  border-radius: var(--hjorne-1);
  border-color: transparent;
  box-shadow: none;
  user-select: none;
  pointer-events: none;

  /* Strejfet af lys. Det er materialeloven igen — lyset kommer ovenfra og
     bevæger sig hen over fladen, ikke en farve der pulserer. */
  background-image: linear-gradient(
      100deg,
      transparent 30%,
      color-mix(in srgb, var(--tekst) 7%, transparent) 50%,
      transparent 70%);
  background-size: 220% 100%;
  background-repeat: no-repeat;
  animation: venter-strejf 1.4s var(--ease-std) infinite;
}

@keyframes venter-strejf {
  from { background-position: 120% 0; }
  to   { background-position: -20% 0; }
}

/* En linje tekst der venter. Højden er linjehøjden, ikke et tal. */
.venter-linje {
  height: 1em;
  display: block;
}
.venter-linje + .venter-linje { margin-top: var(--rum-2); }
/* Sidste linje i et afsnit er kortere, som en rigtig sidste linje. */
.venter-linje:last-child { width: 62%; }

/* Et rundt mærke — avatar, initialer, ikon. */
.venter-mrk { border-radius: var(--hjorne-3); }

/* ---- reduceret bevægelse -------------------------------------------------
   Strejfet slås fra, men fladen bliver. Et skelet uden bevægelse er stadig
   et skelet; et skelet der forsvinder er en tom skærm.
   `fundament/07-bevaegelse` slår ikke denne animation fra af sig selv — den
   fil hvidlister hvad der må overleve, og en uendelig animation hører ikke
   på den liste. Derfor står den her. */
@media (prefers-reduced-motion: reduce) {
  .venter {
    animation: none;
    background-image: none;
  }
}

/* ---- den optagne kontrol -------------------------------------------------
   Skelettet ovenfor er til INDHOLD der endnu ikke er kommet. En knap man
   lige har trykket på er noget andet: fladen er der, handlingen er i gang,
   og brugeren skal se at systemet arbejder uden at knappen forsvinder.

   Huset havde ikke den tilstand. Det blev fundet 29. august 2026 ved at
   rulle kittet ud i dashboardet, hvor 31 filer hentede lucides `Loader2`
   ind — ikke af dovenskab, men fordi der ikke var noget at hente her.

   `ic-spinner` er husets bue; .snurrer får den til at dreje. Ordet skal
   stadig med: en knap der arbejder siger det oplæst, ikke kun visuelt. */
.snurrer {
  animation: snurrer 900ms linear infinite;
  transform-origin: 50% 50%;
}

@keyframes snurrer {
  to { transform: rotate(360deg); }
}

/* Samme begrundelse som skelettet ovenfor: uendelige animationer står
   ikke på bevægelsesfilens hvidliste, så de slås fra her. Buen bliver
   stående — den er stadig et tegn på at noget er i gang. */
@media (prefers-reduced-motion: reduce) {
  .snurrer { animation: none; }
}



/* ─── kits/ui/02-materiale/sejr-glas.css ─── */
/* SEJR UI — glas.
 *
 * Skrevet 16. august 2026, efter at materialet blev prøvet af på skærm og
 * ikke bare antaget.
 *
 * HVAD GLAS ER: en flade der lader grunden skinne igennem, sløret. Intet andet.
 * Den er lavet af nøjagtig to farver — --ink og --paper — ved lav alpha. Der
 * kommer ingen tredje farve ind i glasset. Nogensinde.
 *
 * DEN REGEL DER AFGØR OM DET VIRKER: GLAS SKAL HAVE NOGET BAG SIG.
 * Et sløret panel over en ensfarvet flade er ikke glas — det er en lysere
 * firkant, og det ser ud som en fejl. Ligger der ikke indhold, gradient eller
 * struktur bagved, skal fladen være massiv (.flade-massiv) i stedet. Dette er
 * ikke en smagssag; det blev prøvet, og den ensfarvede udgave så ud som en plet.
 */

/* 6. SEPTEMBER 2026: PAPIRET OG BLÆKKET KOMMER FRA TOKENS. Fra 16. august
   stod rgba(250,250,247,…) og rgba(15,20,25,…) skrevet i hånden herunder —
   den ældste udgave i mappen og en lille løgn i tre uger: papiret stod to
   steder, og to steder driver. Nu color-mix af --paper og --ink, som resten
   af materialet. Dagens to skygger er samtidig sat et par procentpoint op
   (10→12, 20→26), i samme runde som kortet fik sine tre lag — glasset er
   heltekortet på forsiden, og det skal ikke ligge fladere end panelerne
   under det. Nattens sorte blev til --ink, fem procentpoint tættere. */
:root {
  /* Glassets slør. 22px er nok til at indhold bag bliver ulæseligt (så det
     ikke konkurrerer med teksten foran) uden at fladen mister fornemmelsen af
     at der ER noget bagved. */
  --glas-blur: 22px;
  --glas-maetning: 1.4;

  /* ---- glas på papir -----------------------------------------------------
     Rettet 16. august 2026: første udgave slørede BLÆK ind over papiret, og
     resultatet var mørkere end sin omgivelse. En flade der er mørkere end
     grunden læses ikke som glas — den læses som en plet. Det var også præcis
     den fejl der gjorde de første tilstandsflader grå.

     Mælkeglas er lysere end det, det ligger på. Derfor er glasset nu PAPIR
     på begge grunde; forskellen er kun hvad man ser det imod. Definitionen
     kommer så fra to ting papir ikke selv kan give: en tynd mørk hårstreg
     hele vejen rundt, og en rigtig skygge under. Uden dem flyder en lys
     flade ud i en lys grund. */
  --glas-1:            color-mix(in srgb, var(--paper) 78%, transparent);
  --glas-2:            color-mix(in srgb, var(--paper) 52%, transparent);
  --glas-kant:         color-mix(in srgb, var(--ink) 14%, transparent);
  --glas-kant-top:     color-mix(in srgb, var(--paper) 92%, transparent);  /* lyset rammer overkanten */
  --glas-rand:         color-mix(in srgb, var(--paper) 92%, transparent);
  --glas-skygge-naer:  color-mix(in srgb, var(--ink) 12%, transparent);     /* kontaktskygge, holder kanten skarp */
  --glas-skygge:       color-mix(in srgb, var(--ink) 26%, transparent);     /* løftet, det der får den til at svæve */
}

/* ---- glas på ink ---------------------------------------------------------
   Papiret er sløret, og kraftigere: på mørk grund skal der mere lys til før
   fladen overhovedet aflæses som en flade. Overkanten er lysest — det er dér
   lyset ville ramme. */
[data-ground="nat"] , .nat {
  --glas-1:            color-mix(in srgb, var(--paper) 10%, transparent);
  --glas-2:            color-mix(in srgb, var(--paper) 3%, transparent);
  --glas-kant:         color-mix(in srgb, var(--paper) 16%, transparent);
  --glas-kant-top:     color-mix(in srgb, var(--paper) 30%, transparent);
  --glas-rand:         color-mix(in srgb, var(--paper) 10%, transparent);
  --glas-skygge-naer:  color-mix(in srgb, var(--ink) 45%, transparent);
  --glas-skygge:       color-mix(in srgb, var(--ink) 60%, transparent);
}

/* ---- selve fladen --------------------------------------------------------
   Én klasse. Radius og polstring kommer udefra — glas er et materiale, ikke
   en komponent. */
.glas {
  background: linear-gradient(160deg, var(--glas-1), var(--glas-2));
  border: 1px solid var(--glas-kant);
  border-top-color: var(--glas-kant-top);
  /* Tre lag: randlys i overkanten, en tæt kontaktskygge der holder kanten
     skarp, og en blød skygge der løfter fladen fra grunden. Den tætte er
     det der gør forskellen på lys grund — uden den flyder mælkeglas ud i
     papir. */
  box-shadow: inset 0 1px 0 var(--glas-rand),
              0 1px 2px var(--glas-skygge-naer),
              0 20px 44px -18px var(--glas-skygge);
}

@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .glas {
    -webkit-backdrop-filter: blur(var(--glas-blur)) saturate(var(--glas-maetning));
    backdrop-filter: blur(var(--glas-blur)) saturate(var(--glas-maetning));
  }
}

/* Browsere uden backdrop-filter får en massiv flade i stedet for et
   gennemsigtigt panel man ikke kan læse hen over. Aldrig et halvt resultat. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .glas { background: var(--flade-2); }
}

/* ---- massiv flade --------------------------------------------------------
   Samme form og løft, ingen gennemsigtighed. Brug den når der ikke er noget
   bag glasset — og altid når teksten SKAL kunne læses uanset hvad der ligger
   under. */
.flade-massiv {
  background: var(--flade-2);
  border: 1px solid var(--kant);
  box-shadow: var(--loft-2);
}

/* ---- POS og berøring: glasset slås fra -----------------------------------
   Dette er den vigtigste blok i filen.
   En POS står på en disk under loftlys, ofte med sollys fra siden, og bliver
   aflæst på et halvt sekund af en der har travlt. Gennemsigtighed koster
   kontrast, og kontrasten er allerede brugt på at teksten skal kunne læses
   skævt fra og i blænding. Derfor: i berøringstæthed er glas massivt.

   Glasset er en æstetik. At kunne se beløbet er et krav. Når de to er i
   konflikt, vinder beløbet.

   Fire selektorer, ikke to: tætheden kan stå på en FORFADER (typisk <html> i
   en POS-app) eller på SELVE glasfladen. Skrives kun descendant-varianten,
   virker <div class="glas" data-taethed="beroring"> ikke — glasset bliver
   stående gennemsigtigt på netop den skærm hvor det ikke må. Målt og fanget
   af selvtest.html 16. august 2026. */
[data-taethed="beroring"] .glas,
[data-taethed="beroring"].glas,
.taethed-beroring .glas,
.taethed-beroring.glas {
  background: var(--flade-2);
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  border-color: var(--kant-staerk);
  box-shadow: var(--loft-2);
}

/* Samme hensyn, brugerens eget valg: nogle systemer beder om mindre
   gennemsigtighed af hensyn til læsbarhed. Det respekteres. */
@media (prefers-reduced-transparency: reduce) {
  .glas {
    background: var(--flade-2);
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
  }
}



/* ─── kits/ui/02-materiale/sejr-gloed.css ─── */
/* SEJR UI — glød og de levende plader.
 *
 * Skrevet 2. september 2026, den dag reglerne for kittet blev ophævet.
 *
 * ─── HVORFOR DEN FINDES ────────────────────────────────────────────────────
 *
 * Morris' beslutning: kittet skal STÅ UD. Ikke ved at ligne noget nyt, men
 * ved at det materiale ingen andre har — gravurerne, seglet, guillochen —
 * får lov at bevæge sig. Indtil i dag lå pladerne stille bag en tom
 * tilstand, og glasset var pensioneret «fordi det blev til støj». Det er
 * vendt om: en flade må gløde, en plade må dreje, og et segl må stemple.
 *
 * Det der IKKE er vendt om: farverne. Hver glød er et af husets tokens ved
 * lav alpha. Der står ingen hex i denne fil, og `proev-alt.py` fælder hvis
 * der kommer en.
 *
 * ─── GLØDEN ────────────────────────────────────────────────────────────────
 *
 * En glød er lys der kommer INDEFRA en flade — modsat lysfaldet, der kommer
 * ovenfra. På nat er den synlig; på dag er den næsten ingenting, for papir
 * lyser ikke. Det er samme fysik som `--lysfald`: én egenskab, to grunde,
 * og komponenten behøver ikke vide hvilken.
 *
 * ─── DE LEVENDE PLADER ─────────────────────────────────────────────────────
 *
 * `spiro` og `ringbaand` er lukkede, koncentriske figurer — de kan dreje
 * uendeligt uden at nogen kan se hvor de begyndte. `boelge` er et bånd —
 * det kan drive sidelæns. `segl` drejer kun når man rører det.
 *
 * Tempoet er LANGSOMT. 90 sekunder for én omdrejning: man skal ikke kunne
 * se det bevæge sig, man skal kunne se at det er anderledes hver gang man
 * kigger. Det er forskellen på en tekstur og en animation.
 *
 * `prefers-reduced-motion` standser alt. En plade der står stille, er
 * stadig en plade.
 */

:root {
  /* Gløden: husets farver ved lav alpha. Dag er svag, fordi papir ikke lyser. */
  --gloed:         color-mix(in srgb, var(--paper) 0%, transparent);
  --gloed-crimson: color-mix(in srgb, var(--crimson) 10%, transparent);
  --gloed-succes:  color-mix(in srgb, var(--fn-success) 10%, transparent);
  --gloed-radius:  60%;
  /* Den levende plades styrke: hvor tydelig grunden bag en flade er. */
  --plade-levende-alpha: .07;
}

[data-ground="nat"],
.nat {
  --gloed:         color-mix(in srgb, var(--paper) 7%, transparent);
  --gloed-crimson: color-mix(in srgb, var(--crimson) 22%, transparent);
  --gloed-succes:  color-mix(in srgb, var(--fn-success) 22%, transparent);
  --plade-levende-alpha: .10;
}

/* ─── .gloed · en flade der lyser indefra ───────────────────────────────── */
.gloed {
  position: relative;
  isolation: isolate;
}
.gloed::before {
  content: "";
  position: absolute;
  inset: -20%;
  z-index: -1;
  pointer-events: none;
  background: radial-gradient(circle at 50% 30%, var(--gloed) 0%, transparent var(--gloed-radius));
}
.gloed-crimson::before { background: radial-gradient(circle at 50% 30%, var(--gloed-crimson) 0%, transparent var(--gloed-radius)); }
.gloed-succes::before  { background: radial-gradient(circle at 50% 30%, var(--gloed-succes)  0%, transparent var(--gloed-radius)); }

/* ─── .gravure-levende · en plade der drejer bag en flade ───────────────────
   Lægges på et .gravure-element der ligger ABSOLUT bag indholdet. Selve
   masken kommer fra .gravure-spiro / -ringbaand / -segl. */
.gravure-levende {
  position: absolute;
  pointer-events: none;
  opacity: var(--plade-levende-alpha);
  animation: gravure-drej var(--tempo-omdrejning) linear infinite;
  will-change: transform;
}
.gravure-levende--modsat { animation-direction: reverse; }
@keyframes gravure-drej {
  from { transform: rotate(0turn); }
  to   { transform: rotate(1turn); }
}

/* ─── .gravure-drift · båndet der driver sidelæns ────────────────────────── */
.gravure-drift {
  position: absolute;
  pointer-events: none;
  opacity: var(--plade-levende-alpha);
  mask-repeat: repeat-x;
  mask-size: auto 100%;
  animation: gravure-glid var(--tempo-drift) linear infinite;
}
@keyframes gravure-glid {
  from { mask-position: 0 0; }
  to   { mask-position: 420px 0; }   /* én flise af boelge-pladen */
}

/* ─── Seglet drejer kun når man rører det ────────────────────────────────── */
.gravure-segl.gravure-roer {
  transition: transform var(--tid-4) var(--ease-std);
}
.gravure-segl.gravure-roer:hover {
  transform: rotate(12deg);
}

/* ─── Fladen der har en levende grund ────────────────────────────────────────
   Beholderen: klipper pladen, så den ikke stikker ud af kortet. */
.levende {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}
.levende > .gravure-levende,
.levende > .gravure-drift {
  z-index: 0;
}
.levende > :not(.gravure-levende):not(.gravure-drift) {
  position: relative;
  z-index: 1;
}

@media (prefers-reduced-motion: reduce) {
  .gravure-levende,
  .gravure-drift {
    animation: none;
  }
  .gravure-segl.gravure-roer:hover {
    transform: none;
  }
}

       /* gløden og de levende plader, 2. sept. 2026 */

/* ─── kits/ui/02-materiale/sejr-segl.css ─── */
/* SEJR UI — det personlige segl.
 *
 * Skrevet 2. september 2026.
 *
 * Seglet er tegnet af matematik og frøet med en streng, og strengen er
 * HANS: partnerens id, kundens id. Ét segl, hans, ingen andens, det samme i
 * al fremtid. Det står som §Sejrsfølelsens punkt 2 — «en ting man kan være
 * stolt af, fordi den ikke kunne købes» — og indtil i dag var det kun en
 * sætning. Nu er det en avatar, et hoved på en side, et stempel på en
 * opgørelse.
 *
 * SVG'en tegnes INLINE af `Segl.tsx` (den samme algoritme som
 * `byg-gravure.py`, FNV-1a ind i mulberry32, så et segl regnet her og et
 * segl regnet dér er det samme segl). Denne fil giver den kun størrelse,
 * farve og de tre roller.
 *
 * Stregerne er `currentColor`, så seglet tager farve efter det det står i.
 * Det er hele pointen med en maske frem for en tegning: et segl på en
 * crimson knap er crimson-hvidt, et segl på papir er blæk.
 */

.segl {
  display: inline-block;
  inline-size: var(--segl-str, 40px);
  block-size: var(--segl-str, 40px);
  color: currentColor;
  flex: none;
  /* Stregvægten er tegnet til 180 px. Under 48 px bliver de fem indre
     ringe til gråt; kompensationen tykner dem, så de stadig kan læses. */
  --gk: 1;
}
.segl svg {
  display: block;
  inline-size: 100%;
  block-size: 100%;
  overflow: visible;
}

/* ─── Tre roller ─────────────────────────────────────────────────────────── */

/* Avataren. Sidder hvor initialerne sad. På en handlingsflade er den papir. */
.segl-avatar {
  --segl-str: 28px;
  /* Tegningen er 180 enheder; ved 28 px er én enhed 0,155 px. Stregen på
     0,65 skal ganges med ~6 for at blive en pixel — under det er seglet
     en grå tåge, målt i dokken 5. september 2026. */
  --gk: 6;
  border-radius: 50%;
  padding: 2px;
  background: var(--flade-3);
  color: var(--tekst);
}
/* De tre inderste lappede ringe (sti 6–8) forsvinder ved 28 px: fem ringe
   på 24 px er ét gråt felt. Tænderne, de to ringe og de to yderste lapper
   er stadig HANS segl — de bærer alle tallene frøet gav. */
.segl-avatar path:nth-child(n + 6) {
  display: none;
}
/* Sidder seglet i en knap, kvitterer fladen bag det for musen — som enhver
   anden knap i huset. Tegningen selv rører sig ikke. */
:is(button, a):hover > .segl-avatar:not(.paa-handling) {
  background: var(--flade-hover);
}
.segl-avatar {
  transition: background var(--tid-1) var(--ease-std), color var(--tid-1) var(--ease-std);
}
.segl-avatar.paa-handling {
  background: var(--handling);
  color: var(--paa-handling);
}

/* Hovedet. Stort, på partnerens egen side, gerne med en glød bag. */
.segl-hoved {
  --segl-str: clamp(96px, 14vw, 160px);
  --gk: 1.8;
  color: var(--tekst);
  opacity: .92;
}

/* Stemplet. Det der lander på en opgørelse. Sætter selv sin hældning,
   for et stempel der står lige, er et logo — et der hælder, er blevet SAT. */
.segl-stempel {
  --segl-str: 56px;
  --gk: 2.6;
  color: var(--crimson);
  transform: rotate(-8deg);
  opacity: .9;
  mix-blend-mode: multiply;
}
[data-ground="nat"] .segl-stempel,
.nat .segl-stempel {
  mix-blend-mode: screen;
  color: var(--crimson-bright);
}

        /* det personlige segl */

/* ─── kits/ui/02-materiale/sejr-maerke.css ─── */
/* SEJR UI — mærket i en grænseflade.
 *
 * §01: ordmærket er fire bogstaver i ét snit; app-ikonet er mærket med sit
 * eget lys. Kittet tegner ingen af dem — de kommer som SVG fra
 * fundament/01-maerke gennem `react/src/maerke-kilde.ts` (GENERERET af
 * byg-ui.py). Her står kun hvordan de sidder.
 *
 * ORDMÆRKET TAGER FARVE EFTER DET DET STÅR I. `fill="currentColor"`, så
 * `.maerke` på blæk er papir og på papir er blæk — uden en klasse pr. grund.
 * Vil man have det FAST — på et fotografi, på crimson — bruger man
 * `.maerke-ink` eller `.maerke-paper`, og så er det en beslutning.
 */
.maerke {
  display: inline-block;
  color: var(--tekst);
  line-height: 0;
  flex: none;
}
.maerke svg {
  display: block;
  block-size: var(--maerke-h, 24px);
  inline-size: auto;
}
.maerke-ink   { color: var(--ink); }
.maerke-paper { color: var(--paper); }

/* Frizonen. §01: mindst højden af «S» hele vejen rundt. Klassen sætter den
   som polstring, så et mærke i en bjælke aldrig rører kanten. */
.maerke-frizone {
  padding: calc(var(--maerke-h, 24px) * .5);
}

/* App-ikonet. Hjørnet er mærkets eget forhold (`--hjorne-maerke`, 22,46 %),
   ikke en af skalaens. Det er den ene form i kittet der ikke følger
   hjørneloven, og det er fordi den kom før loven. */
.maerke-ikon {
  display: inline-block;
  inline-size: var(--maerke-ikon-str, 48px);
  block-size: var(--maerke-ikon-str, 48px);
  border-radius: var(--hjorne-maerke);
  overflow: hidden;
  line-height: 0;
  flex: none;
}
.maerke-ikon svg {
  display: block;
  inline-size: 100%;
  block-size: 100%;
}

/* Mærket i en bjælke: ordmærket og en undertitel i mono-versaler, som i
   dashboardets sidebjælke. Undertitlen er produktet, ikke et slogan. */
.maerke-linje {
  display: inline-flex;
  flex-direction: column;
  gap: var(--rum-1);
}
.maerke-under {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-3);
}

      /* §01 i kittet: ordmærke og app-ikon, 5. sept. 2026 */

/* ─── kits/ui/02-materiale/sejr-farve.css ─── */
/* SEJR UI — farveprøven.
 *
 * Til kataloget og dokumentationen: en flade med et tokennavn og den
 * VÆRDI browseren faktisk giver det. Værdien læses af komponenten med
 * getComputedStyle, aldrig skrevet ind — «måle, ikke huske» gælder også
 * for en prøve der kun viser. Skriver nogen en hex her, er det den fejl
 * hele mappen findes for.
 */
.farve-proeve {
  display: inline-grid;
  grid-template-rows: auto auto auto;
  gap: var(--rum-2);
  inline-size: 9rem;
}
.farve-proeve-flade {
  block-size: var(--rum-10);
  border-radius: var(--hjorne-3);
  border: 1px solid var(--kant);
  box-shadow: var(--saenket);
  /* Farven sættes som `--proeve` på elementet af den der bruger klassen. */
  background: var(--proeve);
}
.farve-proeve-navn {
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  color: var(--tekst);
}
.farve-proeve-vaerdi {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--tekst-3);
  text-transform: uppercase;
}
/* Kontrasten mod grunden, når komponenten regner den. Under 4,5 markeres
   ikke med rød — tallet står der, og det er nok. */
.farve-proeve-kontrast {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-variant-numeric: tabular-nums;
  color: var(--tekst-3);
}
.farve-raekke {
  display: flex;
  flex-wrap: wrap;
  gap: var(--rum-5);
}

       /* §02: farveprøven, til kataloget */

/* ─── kits/ui/02-materiale/sejr-skrift.css ─── */
/* SEJR UI — skriften som klasser.
 *
 * §03 ejer snittene og skalaen: `--font-sans`, `--font-breit`, `--font-mono`,
 * `--fs-*`, `--lh-*`, `--spor-*`. Denne fil skriver INGEN skriftgrad —
 * hver klasse peger på et token — og findes fordi apperne ellers sætter
 * `text-2xl font-medium tracking-tight` i hånden på hver overskrift, og
 * så drev de fra hinanden. Målt i dashboardet 5. september 2026: fire
 * forskellige overskriftsstørrelser til det samme niveau.
 *
 * Hierarkiet er størrelse OG snit: display og payoff står i Breit, titler
 * i Sans, etiketter i Mono-versaler, tal i Mono. Man skal kunne læse
 * niveauet uden at måle det.
 */

/* ---- de store ------------------------------------------------------------ */
.display {
  font-family: var(--font-breit);
  font-size: var(--fs-display);
  font-weight: var(--fw-display);
  letter-spacing: var(--spor-display);
  line-height: 1.02;
  color: var(--tekst);
}
.overskrift-1 {
  font-family: var(--font-sans);
  font-size: var(--fs-h1);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-titel);
  line-height: 1.08;
  color: var(--tekst);
}
.overskrift-2 {
  font-family: var(--font-sans);
  font-size: var(--fs-h2);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-titel);
  line-height: 1.12;
  color: var(--tekst);
}
.overskrift-3 {
  font-family: var(--font-sans);
  font-size: var(--fs-h3);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-titel);
  line-height: 1.2;
  color: var(--tekst);
}
.titel {
  font-family: var(--font-sans);
  font-size: var(--fs-title);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-titel);
  line-height: 1.3;
  color: var(--tekst);
}

/* Payoff'en. §06: «Fra salg til saldo». Breit, som display, men ikke
   størrelsen — den er en sætning, ikke et tal. */
.payoff {
  font-family: var(--font-breit);
  font-size: var(--fs-lead);
  font-weight: var(--fw-display);
  letter-spacing: var(--spor-titel);
  color: var(--tekst);
}

/* ---- løbende tekst ------------------------------------------------------- */
.lead {
  font-size: var(--fs-lead);
  line-height: var(--lh-body, 1.5);
  color: var(--tekst-2);
  max-inline-size: var(--maal-brod);
}
.brod {
  font-size: var(--fs-body);
  line-height: var(--lh-body, 1.5);
  color: var(--tekst);
  max-inline-size: var(--maal-brod);
}
.meta {
  font-size: var(--fs-meta);
  line-height: 1.4;
  color: var(--tekst-3);
}
/* Etiketten — ét sprog overalt (V4): mono-versaler med spor. Samme som
   feltets etiket, tabellens hoved og nøgletallets etiket. */
.etiket {
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  font-weight: var(--fw-body);
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--tekst-2);
}
/* Tallet. §03: et pengetal står i mono og er aldrig mindre end brødtekst.
   Tabulære cifre og gennemstreget nul, så kolonner står og 0 ikke er O. */
.tal {
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  font-variant-numeric: tabular-nums slashed-zero;
}

/* ---- prosa --------------------------------------------------------------- */
/* Et stykke løbende tekst med sine egne afsnit, lister og links: hjælpe-
   sider, vilkår, en artikel. Målet er brødtekstens (65 ch); linjerne
   bliver ellers for lange på en bred skærm. Links er understreget — en
   farve alene er ikke et signal (§02), og i prosa er der ingen anden
   bærer. */
.prosa {
  font-size: var(--fs-body);
  line-height: var(--lh-body, 1.55);
  color: var(--tekst);
  max-inline-size: var(--maal-brod);
}
.prosa > * + * { margin-block-start: var(--rum-5); }
.prosa h2 { font-size: var(--fs-h3); font-weight: var(--fw-medium); letter-spacing: var(--spor-titel); line-height: 1.2; margin-block-start: var(--rum-9); }
.prosa h3 { font-size: var(--fs-title); font-weight: var(--fw-medium); line-height: 1.3; margin-block-start: var(--rum-8); }
.prosa p  { margin-block-start: var(--rum-5); }
.prosa ul, .prosa ol { padding-inline-start: 1.4em; }
.prosa li + li { margin-block-start: var(--rum-2); }
.prosa a {
  color: inherit;
  text-decoration: underline;
  text-decoration-color: var(--dekor);
  text-underline-offset: .15em;
  transition: text-decoration-color var(--overgang-tilstand);
}
.prosa a:hover { text-decoration-color: currentColor; }
.prosa strong { font-weight: var(--fw-medium); }
.prosa code {
  font-family: var(--font-mono);
  font-size: .92em;
  padding: .05em .35em;
  border-radius: var(--hjorne-1);
  background: var(--flade-3);
}
.prosa blockquote {
  margin-inline: 0;
  padding-inline-start: var(--rum-5);
  border-inline-start: 2px solid var(--kant-staerk);
  color: var(--tekst-2);
}
.prosa hr {
  border: 0;
  border-top: 1px solid var(--kant);
  margin-block: var(--rum-8);
}
/* Prosaens tal er også tal. */
.prosa table { font-variant-numeric: tabular-nums; }

/* ---- hjælpere ------------------------------------------------------------ */
.trunker {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.linjer-2, .linjer-3 {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.linjer-2 { -webkit-line-clamp: 2; }
.linjer-3 { -webkit-line-clamp: 3; }

      /* §03: skriften som klasser */

/* ─── kits/ui/02-materiale/sejr-ikon.css ─── */
/* SEJR UI — ikonerne i en grænseflade.
 *
 * §04: 126 ikoner, tegnet i to optiske størrelser (16 og 24) og leveret
 * som to sprites. Kittet tegner ingen ikoner. Det giver dem en plads:
 * størrelsen følger skriften de står i (1em), farven følger teksten
 * (currentColor), og de sidder på skriftlinjen som et bogstav.
 *
 * Spriten lægges ind ÉN gang pr. side med `.ikon-sprite` (React: <IkonSprite/>),
 * og hvert ikon er et <use href="#ic-…">. Ingen inline-kopier af stierne:
 * et ikon der er kopieret ind i en komponent, er et ikon der ikke følger
 * med når huset tegner det om.
 */
.ikon {
  display: inline-block;
  inline-size: 1em;
  block-size: 1em;
  vertical-align: -.125em;
  flex: none;
  color: inherit;
  fill: currentColor;
  overflow: visible;
}
/* De to optiske størrelser. `.ikon` uden nogen af dem følger skriften. */
.ikon-16 { font-size: 16px; }
.ikon-24 { font-size: 24px; }

/* Ikonet i en kontrol: knappens og feltets ikon står i `--kontrol-gap`
   afstand fra teksten, og et ikon alene i en kvadratisk knap er 1.25em. */
.knap > .ikon,
.felt-input-omslag > .ikon,
.menu-punkt > .ikon,
.nav-punkt > .ikon { flex: none; }
.knap-ikon > .ikon { font-size: 1.25em; }

/* Ikonet der bærer betydning alene — uden tekst ved siden af — skal have
   et navn (role="img" + aria-label). Uden er det pynt og aria-hidden. Det
   afgøres i markup, ikke her. */

/* Spriten selv: til stede i dokumentet, aldrig i layoutet. */
.ikon-sprite {
  position: absolute;
  inline-size: 0;
  block-size: 0;
  overflow: hidden;
}

/* Et ikon der markerer en tilstand — i en badge, en notits, en liste —
   får tilstandens farve fra det det står i, aldrig sin egen. Rækkefølgen
   er stadig ord, farve, skravering (§02); ikonet er en fjerde bærer og
   erstatter ingen af de tre. */
.ikon-ind     { color: var(--fn-success); }
.ikon-advarsel{ color: var(--fn-warning); }
.ikon-fejl    { color: var(--fn-danger); }
.ikon-info    { color: var(--fn-info); }

        /* §04: ikonernes plads */

/* ─── kits/ui/02-materiale/sejr-billede.css ─── */
/* SEJR UI — billedet.
 *
 * §08 i kittets sprog. Fundamentets `sejr-foto.css` er kilden til reglerne;
 * her står de igen med kittets tokens, så en app ikke skal importere to
 * lag for at vise et fotografi. De tre der binder:
 *
 *   1. Sorte partier løftes mod blæk, ikke klemmes til sort. På nat ligger
 *      et blæklag i `lighten` over billedet — et GULV, ikke en tone. Alt
 *      under blæk løftes til blæk, alt over står uberørt. (Reglen stod i
 *      prosa i syv dage uden at være i koden; se §08.)
 *   2. Aldrig crimson på et fotografi. Ikke som ramme, ikke som tekst.
 *      `byg-visuel.py` afviser en crimson-værdi i behandlingsfilen.
 *   3. Aldrig tal eller data på et fotografi. Et beløb kræver en flade.
 *
 * Behandlingen følger grunden af sig selv, på `[data-ground="nat"]` — ingen
 * modifierklasse nogen skal huske.
 */
.billede {
  position: relative;
  display: block;
  overflow: hidden;
  margin: 0;
  border-radius: var(--hjorne-4);
  background: var(--flade-3);
  isolation: isolate;
}
.billede > img,
.billede > video {
  display: block;
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  /* Dæmpet, aldrig overmættet. Et kameras standard er den modsatte vej. */
  filter: saturate(.96) contrast(1.01);
}

/* Formatet. Billedet fylder rammen; rammen bestemmer formen. */
.billede-3-2  { aspect-ratio: 3 / 2; }
.billede-4-3  { aspect-ratio: 4 / 3; }
.billede-16-9 { aspect-ratio: 16 / 9; }
.billede-1-1  { aspect-ratio: 1 / 1; }
.billede-rund { aspect-ratio: 1 / 1; border-radius: var(--hjorne-fuld); }

/* Nat: gulvet og det svage fald mod bunden, så en undertekst kan stå. */
[data-ground="nat"] .billede > img,
.nat .billede > img {
  filter: brightness(.86) contrast(1.05) saturate(.9);
}
[data-ground="nat"] .billede::before,
.nat .billede::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background: var(--ink);
  mix-blend-mode: lighten;
}
[data-ground="nat"] .billede::after,
.nat .billede::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  background: linear-gradient(0deg,
    color-mix(in srgb, var(--ink) 34%, transparent) 0%,
    color-mix(in srgb, var(--ink) 10%, transparent) 55%);
}

/* Tekst OVER billedet — en overskrift, aldrig et tal. Billedet dæmpes
   mere, og teksten står i papir. To regler (dag og nat) med samme vægt
   som nat-reglen, ellers taber varianten til den på mørk grund — målt
   24. august 2026 i fundamentet. */
.billede-tekst > img,
[data-ground="nat"] .billede-tekst > img,
.nat .billede-tekst > img {
  filter: brightness(.72) contrast(1.04) saturate(.86);
}
.billede-tekst > .billede-over {
  position: absolute;
  inset-inline: 0;
  inset-block-end: 0;
  z-index: 3;
  padding: var(--rum-6);
  color: var(--paper);
  font-size: var(--fs-title);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-titel);
  line-height: 1.25;
  text-shadow: 0 1px 2px color-mix(in srgb, var(--ink) 40%, transparent);
}

/* Underteksten. Under billedet, ikke på det. Meta-størrelse, dæmpet. */
.billede-figur { margin: 0; }
.billede-figur > .billede-under {
  margin-block-start: var(--rum-3);
  font-size: var(--fs-body-s);
  line-height: 1.4;
  color: var(--tekst-3);
}

/* Pladsholderen mens billedet henter: fladen, ikke et ikon. Samme
   rolige grå som vente-skelettet. */
.billede-venter > img { opacity: 0; }
.billede-venter { background: var(--flade-3); }

     /* §08: billedet med behandlingen */

/* ─── kits/ui/02-materiale/sejr-genstand.css ─── */
/* SEJR UI — genstanden i tre dimensioner.
 *
 * §10: husets ting, gengivet i tre dimensioner. Ikke en 3D-stil — de
 * genstande SEJR faktisk har. I kittet er det kortet: `.betalingskort` med
 * en for- og bagside, lagt i et rum med perspektiv, så det kan vippes og
 * vendes. Kortet i `fundament/10-objekt/kortet.html` er den fulde motor
 * (partikelsky, lys); dette er den udgave en app kan bære uden WebGL.
 *
 * Bevægelsen er §07's: vippet på `--tid-4` med ease-ud, ingen fjedre,
 * intet overshoot. Penge må ikke hoppe — heller ikke et kort. Reduceret
 * bevægelse: kortet står stille, og vendes uden overgang.
 */
.genstand {
  display: inline-block;
  perspective: 1200px;
  perspective-origin: 50% 40%;
}
.genstand-krop {
  position: relative;
  transform-style: preserve-3d;
  transition: transform var(--tid-4) var(--ease-ud);
  will-change: transform;
}
/* Vippet: musen over rummet vipper genstanden lidt. Det er nok til at
   den læses som en TING og ikke som et billede af en. */
.genstand-vip:hover > .genstand-krop {
  transform: rotateY(-14deg) rotateX(6deg);
}
.genstand-forside,
.genstand-bagside {
  backface-visibility: hidden;
  border-radius: inherit;
}
.genstand-bagside {
  position: absolute;
  inset: 0;
  transform: rotateY(180deg);
}
/* Vendt: bagsiden frem. */
.genstand.er-vendt > .genstand-krop {
  transform: rotateY(180deg);
}
.genstand.er-vendt.genstand-vip:hover > .genstand-krop {
  transform: rotateY(194deg) rotateX(6deg);
}
/* Skyggen ligger på gulvet, ikke på kortet: den bliver mørkere og
   kortere når kortet vipper mod én. */
.genstand-krop::after {
  content: "";
  position: absolute;
  inset: 8% 4% -6% 4%;
  z-index: -1;
  border-radius: inherit;
  background: color-mix(in srgb, var(--ink) 28%, transparent);
  filter: blur(18px);
  transform: translateZ(-40px);
  transition: opacity var(--tid-4) var(--ease-ud);
  opacity: .7;
}
.genstand-vip:hover > .genstand-krop::after { opacity: .9; }

/* Kan genstanden vendes, er den en knap. Fokus som alt andet i huset. */
.genstand-knap {
  appearance: none;
  border: 0;
  padding: 0;
  background: none;
  cursor: pointer;
  border-radius: inherit;
}
.genstand-knap:focus-visible {
  outline: 2px solid var(--fokus-ring);
  outline-offset: 4px;
}

@media (prefers-reduced-motion: reduce) {
  .genstand-krop { transition: none; }
  .genstand-vip:hover > .genstand-krop { transform: none; }
  .genstand.er-vendt.genstand-vip:hover > .genstand-krop { transform: rotateY(180deg); }
}

    /* §10: genstanden i tre dimensioner */

/* ─── kits/ui/02-materiale/sejr-lyd.css ─── */
/* SEJR UI — lyden i en grænseflade.
 *
 * §11: fire klange, hver på et af husets tempi, adskilt på ANTAL SLAG og
 * ikke på tonehøjde — det overlever høretab, en larmende butik og en
 * telefonhøjttaler. Kittet afspiller dem gennem `react/src/lyd.ts`, og
 * denne fil giver de to ting der kan ses: kontakten der slår lyden til og
 * fra, og klangen tegnet som det den er — slag på en tidslinje.
 *
 * Kontakten er en knap med `aria-pressed`, ikke en checkbox: lyden slår
 * til med det samme (se felt-kittets skel mellem kontakt og afkrydsning).
 */
.lydknap {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-2);
}
.lydknap[aria-pressed="false"] { color: var(--tekst-3); }
.lydknap[aria-pressed="false"] .ikon { opacity: .6; }

/* Klangen, tegnet. Hvert slag er en flade hvis bredde er slagets varighed:
   `--klang-ms` sættes af komponenten, læst ud af husets tempi — ikke
   skrevet af. 1 ms = 0,5 px, så --tid-4 (320 ms) er 160 px. To slag med
   --tid-1 imellem er `afvist`, og man kan se forskellen uden at høre den. */
.klang {
  display: inline-grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: var(--rum-4);
  min-inline-size: 18rem;
  padding: var(--rum-3) var(--rum-4);
  border-radius: var(--hjorne-4);
  background: var(--flade-2);
  border: 1px solid var(--kant);
}
.klang-navn {
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-2);
  min-inline-size: 9ch;
}
.klang-linje {
  display: flex;
  align-items: center;
  block-size: var(--rum-6);
  gap: 0;
}
.klang-slag {
  block-size: 100%;
  inline-size: calc(var(--klang-ms, 180) * .5px);
  border-radius: var(--hjorne-1);
  background: var(--tekst);
  /* Anslaget: kanten er skarp, halen dør ud. Samme figur som lyden. */
  mask-image: linear-gradient(90deg, var(--ink) 0 12%, transparent 100%);
}
/* To slag: det andet begynder hvor det foerste slutter (afvist: 120 + 120
   = 240 ms = --tid-3). Mellemrummet er kun til at kunne taelle dem. */
.klang-slag + .klang-slag {
  margin-inline-start: max(var(--rum-1), calc(var(--klang-pause, 0) * .5px));
}
/* Saldoens klang ligger en oktav nede — tegnet en anelse lavere. */
.klang-dyb .klang-slag { transform: translateY(15%); opacity: .85; }
.klang-meta {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-variant-numeric: tabular-nums;
  color: var(--tekst-3);
  white-space: nowrap;
}
/* Mens den spiller: slaget lyser op på --tid-1 og falder på klangens egen
   varighed. Farven er ikke et signal; det er ordet i navnet. */
.klang.spiller .klang-slag {
  animation: klang-anslag var(--tid-1) var(--ease-ud);
}
@keyframes klang-anslag {
  from { background: var(--tekst-3); }
  to   { background: var(--tekst); }
}

         /* §11: lydknappen og klangen */

/* ─── kits/ui/03-komponenter/sejr-knap.css ─── */
/* SEJR UI — knapper.
 *
 * Ingen tal i denne fil er skrevet frit. Højde kommer fra --kontrol-h,
 * polstring fra --kontrol-px, hjørner fra --hjorne-*. Skift tætheden, og
 * knappen følger med uden at der rettes en linje her.
 *
 * DEN REGEL DER STYRER HVILKEN VARIANT DER BRUGES:
 * Crimson er handlingen — ÉT sted pr. skærm. Derfor findes .knap-primaer i
 * ental på en skærm. Er der to primære knapper, er der ingen primær knap;
 * så er der bare to røde ting, og brugeren skal selv gætte hvad der haster.
 * Alt andet er .knap-sekundaer eller .knap-stille.
 */

/* Knappen der arbejder. Låst, buen drejer, teksten står. Knappen
   skifter ikke bredde: buen tager pladsen fra polstringen, ikke fra ordet.
   Set hos Primer og Polaris, 5. september 2026 — de gør det samme. */
.knap[data-arbejder] {
  cursor: progress;
  opacity: .8;
}
.knap[data-arbejder]:disabled { opacity: .8; }
.knap-bue { font-size: 1em; margin-inline-start: calc(-1 * var(--rum-1)); }

.knap {
  /* form */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--kontrol-gap);
  min-height: var(--kontrol-h);
  padding: 0 var(--kontrol-px);
  border-radius: var(--hjorne-3);
  border: 1px solid transparent;

  /* skrift — 500 fordi en knap er en etiket, ikke brødtekst */
  font-family: var(--font-sans);
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  line-height: 1;
  white-space: nowrap;
  text-decoration: none;

  cursor: pointer;
  position: relative;
  transition: background-color var(--overgang-tilstand),
              border-color var(--overgang-tilstand),
              color var(--overgang-tilstand),
              box-shadow var(--overgang-tilstand),
              transform var(--overgang-tilstand);
}
/* Fokus: ringen er husets, to px uden for kanten, aldrig inde i fladen. */
.knap:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px var(--flade), 0 0 0 4px var(--fokus-ring);
}
/* Trykket: knappen går ét skridt ned. Hover løfter den ét skridt op.
   Det er hele bevægelsen — ingen fjeder, intet overshoot. */
.knap:active { transform: translateY(0); }

/* Primær — handlingen. Crimson bærer papirtekst på begge grunde, fordi
   fladen er den samme uanset grund: det er en crimson knap, ikke en lys
   eller mørk knap. */
/* Lysfaldet ligger PÅ fladen, ikke i stedet for den: background-color bærer
   kuløren, background-image bærer lyset. Skrives `background:` som shorthand,
   nulstiller den image-laget, og knappen bliver flad igen. Se sejr-lys.css —
   på dag er --lysfald `none`, så linjen er gratis dér. */
/* DYBDEN, 6. september 2026 (Morris: «make them more premium — give it
   more depth»). Knappen er en ting med en overside og en underside, som
   kortet og sedlen: en lyskant øverst (papir i lav alpha), en mørk
   underkant (blæk i lav alpha), og en skygge der er handlingens egen
   farve — ikke grå. Alt er color-mix af husets tokens; ingen ny farve. */
.knap-primaer {
  background-color: var(--handling);
  background-image: linear-gradient(180deg,
    color-mix(in srgb, var(--paper) 18%, transparent) 0%,
    color-mix(in srgb, var(--paper) 4%, transparent) 45%,
    color-mix(in srgb, var(--ink) 12%, transparent) 100%);
  color: var(--paa-handling);
  border-color: color-mix(in srgb, var(--ink) 22%, var(--handling));
  text-shadow: 0 1px 0 color-mix(in srgb, var(--ink) 22%, transparent);
  box-shadow:
    inset 0 1px 0 color-mix(in srgb, var(--paper) 26%, transparent),
    inset 0 -1px 0 color-mix(in srgb, var(--ink) 22%, transparent),
    0 1px 2px color-mix(in srgb, var(--ink) 22%, transparent),
    0 6px 14px -6px color-mix(in srgb, var(--handling) 60%, transparent);
}
.knap-primaer:hover {
  background-color: var(--handling-hover);
  transform: translateY(-1px);
  box-shadow:
    inset 0 1px 0 color-mix(in srgb, var(--paper) 30%, transparent),
    inset 0 -1px 0 color-mix(in srgb, var(--ink) 22%, transparent),
    0 2px 4px color-mix(in srgb, var(--ink) 22%, transparent),
    0 10px 20px -8px color-mix(in srgb, var(--handling) 70%, transparent);
}
.knap-primaer:active {
  background-color: var(--handling-tryk);
  background-image: none;
  transform: translateY(0);
  box-shadow:
    inset 0 2px 4px color-mix(in srgb, var(--ink) 35%, transparent),
    0 1px 1px color-mix(in srgb, var(--ink) 15%, transparent);
}

/* Sekundær — den almindelige. Kant og tekst i grundens egen blæk. */
/* Sekundær: papir med en løftet flade. Lyskanten øverst er papir, den
   nedre skygge er blæk — samme materiale som kortet i V4. På dag er den
   ikke længere gennemsigtig: en knap uden flade har ingen dybde. */
.knap-sekundaer {
  background-color: var(--flade-2);
  background-image: linear-gradient(180deg,
    color-mix(in srgb, var(--paper) 60%, transparent) 0%,
    color-mix(in srgb, var(--paper) 0%, transparent) 60%);
  color: var(--tekst);
  border-color: var(--kant-staerk);
  box-shadow:
    inset 0 1px 0 color-mix(in srgb, var(--paper) 80%, transparent),
    0 1px 2px color-mix(in srgb, var(--ink) 8%, transparent),
    0 1px 0 color-mix(in srgb, var(--ink) 5%, transparent);
}
/* På nat får den en flade at fange lyset på. På dag ville en grå flade gøre
   den sekundære knap tungere end den primære, så dér bliver den transparent.
   --hover er identitetens eget lave alpha, ikke et nyt tal. */
[data-ground="nat"] .knap-sekundaer,
.nat .knap-sekundaer {
  background-color: var(--hover);
  background-image: linear-gradient(180deg,
    color-mix(in srgb, var(--paper) 9%, transparent) 0%,
    color-mix(in srgb, var(--paper) 0%, transparent) 60%);
  border-color: var(--kant-lyst);
  box-shadow:
    inset 0 1px 0 color-mix(in srgb, var(--paper) 12%, transparent),
    0 1px 2px color-mix(in srgb, var(--ink) 50%, transparent);
}
.knap-sekundaer:hover {
  background-color: var(--flade-hover);
  border-color: var(--tekst-3);
  transform: translateY(-1px);
  box-shadow:
    inset 0 1px 0 color-mix(in srgb, var(--paper) 80%, transparent),
    0 2px 4px color-mix(in srgb, var(--ink) 10%, transparent),
    0 6px 12px -6px color-mix(in srgb, var(--ink) 18%, transparent);
}
.knap-sekundaer:active {
  background-color: var(--flade-3);
  background-image: none;
  transform: translateY(0);
  box-shadow: var(--saenket);
}

/* Stille — til det tredje valg, og til værktøjslinjer hvor en kant ville
   larme. Ingen ramme før den røres. */
.knap-stille {
  background: transparent;
  color: var(--tekst-2);
}
.knap-stille:hover  { background: var(--flade-hover); color: var(--tekst); }
.knap-stille:active { background: var(--flade-3); box-shadow: var(--saenket); }

/* Farlig — kun til noget der sletter eller ikke kan fortrydes.
   Ikke "annullér"; annullér er .knap-stille. */
.knap-farlig {
  background: transparent;
  color: var(--fn-danger);
  border-color: currentColor;
}
.knap-farlig:hover {
  background: var(--fn-danger-flade);
  transform: translateY(-1px);
  box-shadow: 0 2px 6px -2px color-mix(in srgb, var(--fn-danger) 35%, transparent);
}
.knap-farlig:active { transform: translateY(0); box-shadow: var(--saenket); }

/* På glas: knappen skal kunne ses uden at slå hul i materialet. */
.glas .knap-sekundaer { border-color: var(--glas-kant); }

.knap:disabled,
.knap[aria-disabled="true"] {
  opacity: .45;
  cursor: not-allowed;
  pointer-events: none;
  box-shadow: none;
  transform: none;
}

/* Fuld bredde — på telefon og i POS er det normalen, ikke undtagelsen. */
.knap-bred { width: 100%; }

/* Ikonknap: kvadratisk, og den SKAL have et tilgængeligt navn i markup
   (aria-label), ellers er den usynlig for skærmlæsere. */
.knap-ikon {
  padding: 0;
  width: var(--kontrol-h);
  min-width: var(--kontrol-h);
}



/* ─── kits/ui/03-komponenter/sejr-felt.css ─── */
/* SEJR UI — felter.
 *
 * Et felt er fire ting der hører sammen: etiket, kontrol, hjælpetekst og fejl.
 * De ligger i én .felt-blok, så afstanden mellem dem er systemets, ikke den
 * enkelte skærms.
 *
 * TILGÆNGELIGHED ER IKKE VALGFRI HER:
 *   · <label for> skal pege på inputtets id. En etiket der bare står ovenover
 *     findes ikke for en skærmlæser.
 *   · Fejl markeres med aria-invalid="true" OG aria-describedby til
 *     fejlteksten. Rød kant alene er usynlig for den der ikke ser farve.
 *   · Etiketten er 12px, ikke 11px. 11px er gulvet for al tekst; en etiket
 *     man skal læse hver gang bør ikke ligge på gulvet.
 */

/* ─── BRØNDEN, 6. september 2026 ─────────────────────────────────────────
 *
 * Morris, med kataloget åbent efter knappen og fladerne: felterne var
 * tomme rektangler. Et felt er det modsatte af en knap — knappen er
 * hævet, feltet er en FORDYBNING i fladen, dér man skriver. Så det får
 * knappens materiale med omvendt fortegn: en indvendig skygge i
 * overkanten hvor fladen kaster skygge ned i brønden, og en lys læbe
 * under, hvor lyset rammer kanten af hullet. Samme lys ovenfra som
 * ikonets `lit`, samme blæk og papir gennem color-mix.
 *
 * I FOKUS ER FELTET DET ENESTE PÅ SKÆRMEN DER SKER NOGET I, og huset
 * markerer det med sin egen farve: en hårstreg i crimson og en blød
 * ring uden om. På nat er crimson en flade, ikke en skrift (3,14:1), og
 * en ring er en flade — så den må. Fejl bruger samme opbygning i
 * fn-danger, så et felt der er galt ikke også er fokuseret i rødt og
 * crimson på én gang.
 *
 * FUNDET SAMME DAG: den gamle fokusring var
 *     color-mix(in srgb, var(--fokus-ring) 35%, transparent)
 * og --fokus-ring er en box-shadow-LISTE, ikke en farve. Erklæringen var
 * ugyldig i sin helhed, og felter, vælgelister, talfelt og kodefelt har
 * kun haft en kantfarve som fokus siden 5. september. Ingen fejl nogen
 * steder — CSS kasserer stille. Tokens herunder er lister, og de bruges
 * som lister.
 *
 * Alle fem (felt, kontrol, talfelt, kodefelt, søgefeltet i tabellen) står
 * på de samme tre tokens. Ændres brønden, ændres den ét sted. */
:root {
  --felt-dybde: inset 0 1px 2px color-mix(in srgb, var(--ink) 9%, transparent),
                0 1px 0 color-mix(in srgb, var(--paper) 85%, transparent);
  --felt-fokus: 0 0 0 1px var(--handling),
                0 0 0 4px color-mix(in srgb, var(--handling) 18%, transparent);
  --felt-fokus-fejl: 0 0 0 1px var(--fn-danger),
                     0 0 0 4px color-mix(in srgb, var(--fn-danger) 18%, transparent);
}
[data-ground="nat"],
.nat {
  --felt-dybde: inset 0 1px 2px color-mix(in srgb, var(--ink) 55%, transparent),
                0 1px 0 color-mix(in srgb, var(--paper) 4%, transparent);
  --felt-fokus: 0 0 0 1px var(--handling),
                0 0 0 4px color-mix(in srgb, var(--handling) 28%, transparent);
  --felt-fokus-fejl: 0 0 0 1px var(--fn-danger),
                     0 0 0 4px color-mix(in srgb, var(--fn-danger) 28%, transparent);
}

.felt {
  display: flex;
  flex-direction: column;
  gap: var(--rum-2);
}

/* V4: etiketten taler REGISTRATUR — mono, versaler, spatieret — samme
   sprog som tabellens hoved, noegletallets etiket og prisarkets
   kolonner. Foer talte formularerne sans og resten af pengefladerne
   mono; nu er etiketten ét sprog overalt. 12px-loven holdes: versaler
   i mono ved 12 px maaler stoerre end sans lowercase ved 12. */
.felt-etiket {
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  font-weight: var(--fw-regular, 400);
  text-transform: uppercase;
  color: var(--tekst-2);
  letter-spacing: .07em;
}

/* Selve kontrollen. Gælder input, select og textarea, så de tre aldrig
   kommer til at se forskellige ud ved et uheld. */
.felt-input,
.felt select,
.felt textarea {
  width: 100%;
  min-height: var(--kontrol-h);
  padding: 0 var(--felt-px);
  border-radius: var(--hjorne-2);
  border: 1px solid var(--kant-staerk);
  background: var(--flade);
  box-shadow: var(--felt-dybde);
  color: var(--tekst);
  font-family: var(--font-sans);
  font-size: var(--fs-body);
  transition: border-color var(--overgang-tilstand),
              box-shadow var(--overgang-tilstand),
              background-color var(--overgang-tilstand);
}
.felt-input:focus-visible,
.felt select:focus-visible,
.felt textarea:focus-visible {
  outline: none;
  border-color: var(--handling);
  box-shadow: var(--felt-dybde), var(--felt-fokus);
}

.felt textarea {
  padding: var(--rum-3) var(--felt-px);
  min-height: calc(var(--kontrol-h) * 2.2);
  line-height: var(--lh-body);
  resize: vertical;
}

.felt-input::placeholder,
.felt textarea::placeholder {
  color: var(--dekor);   /* dekor må ikke bære betydning — se nedenfor */
}

.felt-input:hover,
.felt select:hover,
.felt textarea:hover { border-color: var(--dekor); }

/* Et beløbsfelt. Mono, tnum, højrestillet — et tal man taster skal stå som
   et tal man læser. */
.felt-belob {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums slashed-zero;
  font-size: max(14px, 1em);
  text-align: right;
}

/* Hjælpetekst: hvad feltet vil have, FØR det går galt. En hjælpetekst der
   først dukker op som fejl, kom for sent. */
.felt-hjaelp {
  font-size: var(--fs-body-s);
  color: var(--tekst-3);
}

/* Fejl. Teksten siger hvad der er galt OG hvad man gør ved det — aldrig bare
   "ugyldig værdi". */
.felt-fejl {
  font-size: var(--fs-body-s);
  color: var(--fn-danger);
  display: flex;
  gap: var(--rum-2);
  align-items: flex-start;
}

.felt-input[aria-invalid="true"],
.felt select[aria-invalid="true"],
.felt textarea[aria-invalid="true"] {
  border-color: var(--fn-danger);
  background: var(--fn-danger-flade);
}
.felt-input[aria-invalid="true"]:focus-visible,
.felt select[aria-invalid="true"]:focus-visible,
.felt textarea[aria-invalid="true"]:focus-visible {
  border-color: var(--fn-danger);
  box-shadow: var(--felt-dybde), var(--felt-fokus-fejl);
}

/* ---- hylsteret: enhed og præfiks ------------------------------------------
   «kr.» til højre i et beløbsfelt, «+45» til venstre i et telefonfelt. De
   står INDE i brønden, i mono og dæmpet, og de er ikke en del af værdien:
   feltet sender stadig kun tallet. Tilføjet 6. september 2026 — et
   beløbsfelt uden sin enhed er et tal man skal gætte enheden på. */
.felt-hylster {
  position: relative;
  display: flex;
  align-items: center;
}
.felt-hylster > .felt-input { flex: 1; }
.felt-praefiks,
.felt-enhed {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  pointer-events: none;
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  color: var(--tekst-3);
  white-space: nowrap;
}
.felt-praefiks { inset-inline-start: var(--felt-px); }
.felt-enhed    { inset-inline-end: var(--felt-px); }
.felt-hylster > .felt-input.har-praefiks { padding-inline-start: calc(var(--felt-px) + var(--praefiks-bredde, 3ch) + var(--rum-2)); }
.felt-hylster > .felt-input.har-enhed    { padding-inline-end:   calc(var(--felt-px) + var(--enhed-bredde, 3ch) + var(--rum-2)); }

/* Deaktiveret ser nedsænket ud, ikke bare blegt — så det er tydeligt at
   feltet findes, men ikke kan bruges nu. */
.felt-input:disabled,
.felt select:disabled,
.felt textarea:disabled {
  background: var(--flade-3);
  color: var(--tekst-3);
  cursor: not-allowed;
  box-shadow: var(--saenket);
}

/* Påkrævet-mærket. Farve alene er ikke nok, så det er et tegn. */
.felt-etiket[data-paakraevet]::after {
  content: " *";
  color: var(--fn-danger);
}

/* ══ afkrydsning og radio ═══════════════════════════════════════════════════
   Tilføjet 22. august 2026. De manglede, og det betyder at hver app har
   tegnet sine egne — præcis den mekanisme der gav 565 fremmede farver.

   `accent-color` gør arbejdet i stedet for en skjult input og en tegnet
   firkant. Det er ikke dovenskab: browserens egen kontrol kommer med
   tastaturbetjening, skærmlæserunderstøttelse, `indeterminate` og
   højkontrasttilstand gratis, og en hjemmelavet erstatning skal genopfinde
   dem alle fire — og gør det sjældent færdigt.

   ETIKETTEN ER MÅLET. `<label>` omslutter kontrollen, så hele linjen kan
   klikkes. Et 16 px kryds er ikke et rimeligt mål for en finger. */
.felt-valg {
  display: flex;
  align-items: flex-start;
  gap: var(--rum-3);
  min-height: var(--kontrol-h);
  padding: var(--rum-2) 0;
  cursor: pointer;
  font-size: var(--fs-body);
  color: var(--tekst);
}
.felt-valg input[type="checkbox"],
.felt-valg input[type="radio"] {
  accent-color: var(--handling);
  width: var(--rum-5);
  height: var(--rum-5);
  margin: 0;
  flex: none;
  /* Optisk linjeføring: kontrollen midtstilles på FØRSTE linje i etiketten,
     ikke på hele blokken. En to-linjers etiket med krydset i midten ligner
     et kryds der hører til begge linjer og ingen af dem. */
  margin-top: calc((1em * var(--lh-body) - var(--rum-5)) / 2);
}
.felt-valg-under {
  display: block;
  font-size: var(--fs-body-s);
  color: var(--tekst-3);
  margin-top: 2px;
}
.felt-valg:has(input:disabled) { color: var(--tekst-3); cursor: not-allowed; }

/* En gruppe valg SKAL ligge i <fieldset> med <legend>. Uden det er der ingen
   der får at vide hvad de fire radioknapper er et valg imellem. */
.felt-gruppe {
  border: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--rum-1);
}
.felt-gruppe > legend {
  padding: 0;
  margin-bottom: var(--rum-2);
  font-size: var(--fs-body-s);
  font-weight: var(--fw-medium);
  color: var(--tekst-2);
  letter-spacing: var(--spor-etiket);
}

/* ══ kontakten ══════════════════════════════════════════════════════════════
   En kontakt er IKKE en afkrydsning. Forskellen er ikke kosmetisk:

     afkrydsning  et valg der gemmes når man trykker Gem.
     kontakt      en indstilling der træder i kraft med det samme.

   Bruges en kontakt til noget der først gælder efter Gem, tror folk det
   allerede er slået til. Det er den fejl der får nogen til at sende en
   afregning de troede var sat på pause.

   Den er en <button role="switch">, ikke en checkbox: en kontakt der virker
   straks er en handling, og aria-checked på en knap siger det rigtige. */
.kontakt {
  /* Sporets højde. Den vokser med tætheden, men langt mindre end kontrollen
     gør — en kontakt der er 48 px høj ligner en knap, ikke en kontakt. */
  --kontakt-h: var(--rum-6);

  position: relative;
  flex: none;
  padding: 0;
  border: none;
  background: transparent;
  cursor: pointer;

  /* MÅLET er kontrolhøjden; SPORET er --kontakt-h. De to er ikke det samme,
     og det er hele grunden til at sporet er et pseudoelement.

     Første udgave tegnede sporet på selve knappen. I berøringstæthed sætter
     `sejr-ui.css` min-height: 48px på ALT klikbart — og så blev en 36 × 20
     kontakt til en 36 × 48 crimson klat med en hvid prik i midten. Fanget af
     `eksempler.html` 22. august 2026, på POS-skærmen. */
  width: calc(var(--kontakt-h) * 1.8);
  height: var(--kontrol-h);
}

/* sporet */
.kontakt::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  height: var(--kontakt-h);
  transform: translateY(-50%);
  border: 1px solid var(--kant-staerk);
  border-radius: var(--hjorne-fuld);
  background: var(--flade-3);
  transition: background-color var(--overgang-tilstand),
              border-color var(--overgang-tilstand);
}

/* knappen i sporet */
.kontakt::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 2px;
  width: calc(var(--kontakt-h) - 6px);
  height: calc(var(--kontakt-h) - 6px);
  border-radius: var(--hjorne-fuld);
  background: var(--flade);
  box-shadow: var(--loft-1);
  transform: translateY(-50%);
  transition: transform var(--overgang-tilstand);
}

.kontakt[aria-checked="true"]::before {
  background: var(--handling);
  border-color: var(--handling);
}
.kontakt[aria-checked="true"]::after {
  transform: translateY(-50%) translateX(calc(var(--kontakt-h) * .8));
}
.kontakt:disabled { opacity: .45; cursor: not-allowed; }

/* Berøring: sporet vokser, men kun et trin. Målet er stadig --kontrol-h. */
[data-taethed="beroring"] .kontakt,
.taethed-beroring .kontakt { --kontakt-h: var(--rum-7); }

/* Kontakten i en linje med sin etiket. Etiketten står FØRST og kontakten til
   højre — man læser hvad man slår til, før man slår det til. */
.felt-kontakt {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rum-5);
  min-height: var(--kontrol-h);
}



/* ─── kits/ui/03-komponenter/sejr-formular.css ─── */
/* SEJR UI — formularen, hele vejen rundt.
 *
 * `sejr-felt.css` er feltet: etiket, kontrol, hjælp, fejl, afkrydsning,
 * radio, kontakt. Denne fil er de kontroller der kræver OPFØRSEL ud over
 * browserens — og opførslen er Base UI's (MIT): vælgeliste, kombo, skyder,
 * talfelt, kodefelt, filfelt, afkrydsning med ubestemt tilstand. Plus
 * formularens egen bygning: rækker, afsnit og fod.
 *
 * Alle kontroller står på feltets mål: `--kontrol-h`, `--felt-px`,
 * `--hjorne-2`, `--kant-staerk`. En vælgeliste der er 2 px højere end
 * feltet ved siden af, er en fejl man ser på hver eneste formular.
 */

/* ---- den fælles kontrolflade -------------------------------------------- */
.kontrol {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-3);
  inline-size: 100%;
  min-block-size: var(--kontrol-h);
  padding: 0 var(--felt-px);
  border-radius: var(--hjorne-2);
  border: 1px solid var(--kant-staerk);
  background: var(--flade);
  box-shadow: var(--felt-dybde);   /* brønden — se sejr-felt.css, 6. sep. 2026 */
  color: var(--tekst);
  font: inherit;
  font-size: var(--fs-body);
  text-align: start;
  cursor: default;
  transition: border-color var(--overgang-tilstand), box-shadow var(--overgang-tilstand);
}
.kontrol:hover { border-color: var(--dekor); }
.kontrol:focus-visible,
.kontrol:focus-within,
.kontrol[data-popup-open] {
  outline: none;
  border-color: var(--handling);
  box-shadow: var(--felt-dybde), var(--felt-fokus);
}
.kontrol[data-disabled],
.kontrol:disabled {
  background: var(--flade-3);
  color: var(--tekst-3);
  cursor: not-allowed;
  box-shadow: var(--saenket);
}
.kontrol[aria-invalid="true"],
.kontrol[data-invalid] {
  border-color: var(--fn-danger);
  background: var(--fn-danger-flade);
}
.kontrol[aria-invalid="true"]:focus-within,
.kontrol[data-invalid]:focus-within {
  border-color: var(--fn-danger);
  box-shadow: var(--felt-dybde), var(--felt-fokus-fejl);
}
.kontrol-ikon {
  flex: none;
  color: var(--tekst-3);
  font-size: 16px;
}
.kontrol > input {
  flex: 1;
  min-inline-size: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  outline: none;
}
.kontrol > input::placeholder { color: var(--dekor); }
/* Knapper inde i kontrollen — ryd, åbn — er ikke knapper i husets forstand;
   de er en del af feltet og arver dets flade. */
.kontrol > button {
  display: inline-grid;
  place-items: center;
  flex: none;
  padding: 0;
  border: 0;
  background: none;
  color: var(--tekst-3);
  font: inherit;
  cursor: pointer;
  border-radius: var(--hjorne-1);
}
.kontrol > button:hover { color: var(--tekst); }
.kontrol > button:focus-visible { outline: 2px solid var(--tekst); outline-offset: 1px; }   /* var --fokus-ring: en skyggeliste, ugyldig som farve */

/* ---- vælgelisten ---------------------------------------------------------- */
/* En liste man vælger ÉT af. Under fem valg er det en `.vaelger`
   (segmenteret) eller radioknapper — man skal kunne se alle valgene.
   Fra fem og op er det en vælgeliste. */
/* Vaelgelisten er en `.kontrol` med denne klasse oveni (komponenten sætter begge). */
.vaelgliste { inline-size: 100%; }
.vaelgliste-vaerdi {
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.vaelgliste-vaerdi[data-placeholder] { color: var(--tekst-3); }
.vaelgliste-pil {
  flex: none;
  color: var(--tekst-3);
  transition: transform var(--overgang-tilstand);
}
.vaelgliste[data-popup-open] .vaelgliste-pil { transform: rotate(180deg); }

/* Listen der åbner. Samme lag som menuen — flade-2, lysfald, løft-3. */
.vaelgliste-liste,
.kombo-liste {
  z-index: 62;
  min-inline-size: var(--anchor-width);
  max-block-size: min(20rem, var(--available-height));
  overflow: auto;
  padding: var(--rum-2);
  border-radius: var(--hjorne-4);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant-lyst, var(--kant));
  box-shadow: var(--loft-3);
  color: var(--tekst);
  transform-origin: var(--transform-origin);
  transition: opacity var(--tid-2) var(--ease-ud), scale var(--tid-2) var(--ease-ud);
}
.vaelgliste-liste[data-starting-style],
.vaelgliste-liste[data-ending-style],
.kombo-liste[data-starting-style],
.kombo-liste[data-ending-style] {
  opacity: 0;
  scale: .97;
}
.vaelgliste-punkt,
.kombo-punkt {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: var(--rum-3);
  padding: var(--rum-2) var(--rum-3);
  min-block-size: calc(var(--kontrol-h) - var(--rum-2));
  border-radius: var(--hjorne-3);
  cursor: default;
  outline: none;
  transition: background var(--tid-1) var(--ease-std);
}
.vaelgliste-punkt[data-highlighted],
.kombo-punkt[data-highlighted] { background: var(--flade-hover); }
.vaelgliste-punkt[data-selected],
.kombo-punkt[data-selected] { font-weight: var(--fw-medium); }
.vaelgliste-punkt[data-disabled],
.kombo-punkt[data-disabled] { color: var(--tekst-3); }
.vaelgliste-flueben,
.kombo-flueben { color: var(--tekst-2); font-size: 16px; }
.vaelgliste-gruppe {
  padding: var(--rum-3) var(--rum-3) var(--rum-1);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-3);
}
.vaelgliste-streg {
  block-size: 1px;
  margin: var(--rum-2) var(--rum-1);
  background: var(--kant);
}

/* ---- komboen -------------------------------------------------------------- */
/* Et felt man skriver i, og en liste der indsnævres. Til kunder, CVR-opslag,
   posteringer — alt hvor listen er for lang til at rulle i. */
.kombo { position: relative; }
.kombo-tom {
  padding: var(--rum-4) var(--rum-3);
  font-size: var(--fs-body-s);
  color: var(--tekst-3);
}
.kombo-ryd {
  flex: none;
  display: inline-grid;
  place-items: center;
  inline-size: var(--rum-7);
  block-size: var(--rum-7);
  border: 0;
  border-radius: var(--hjorne-fuld);
  background: none;
  color: var(--tekst-3);
  cursor: pointer;
}
.kombo-ryd:hover { background: var(--flade-3); color: var(--tekst); }
/* Flere valgte: chips inde i feltet. Feltet vokser med dem. */
.kombo-chips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--rum-2);
  flex: 1;
  padding-block: var(--rum-2);
}
.kombo-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-1);
  padding: 0 var(--rum-2) 0 var(--rum-3);
  block-size: calc(var(--kontrol-h) - var(--rum-4));
  border-radius: var(--hjorne-2);
  background: var(--flade-3);
  font-size: var(--fs-body-s);
}
.kombo-chip[data-highlighted] { background: var(--flade-hover); }
.kombo-chip-fjern {
  display: inline-grid;
  place-items: center;
  inline-size: var(--rum-6);
  block-size: var(--rum-6);
  border: 0;
  border-radius: var(--hjorne-fuld);
  background: none;
  color: var(--tekst-3);
  cursor: pointer;
}
.kombo-chip-fjern:hover { color: var(--tekst); }
.kombo-chips > input { flex: 1; min-inline-size: 6ch; }

/* ---- skyderen ------------------------------------------------------------- */
/* Et tal man vælger ved at trække. Sporet er måleren's (§09 instrument):
   udslaget i tekst, ikke crimson — crimson er en handling. Knoppen er
   geometrisk rund og må derfor bruge --hjorne-fuld. */
.skyder {
  display: grid;
  gap: var(--rum-2);
}
.skyder-hoved {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
}
.skyder-vaerdi {
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  font-size: var(--fs-body);
  color: var(--tekst);
}
.skyder-kontrol {
  display: flex;
  align-items: center;
  block-size: var(--kontrol-h);
  touch-action: none;
}
.skyder-spor {
  position: relative;
  inline-size: 100%;
  block-size: 4px;
  border-radius: var(--hjorne-1);
  background: var(--kant);
}
.skyder-udslag {
  position: absolute;
  block-size: 100%;
  border-radius: inherit;
  background: var(--tekst);
}
.skyder-knop {
  inline-size: var(--rum-6);
  block-size: var(--rum-6);
  border-radius: var(--hjorne-fuld);
  background: var(--flade-2);
  border: 1px solid var(--kant-staerk);
  box-shadow: var(--loft-1);
  transition: box-shadow var(--overgang-tilstand);
}
.skyder-knop:focus-visible,
.skyder-knop[data-dragging] {
  outline: none;
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--fokus-ring) 35%, transparent), var(--loft-1);
}
.skyder[data-disabled] .skyder-udslag { background: var(--tekst-3); }
.skyder[data-disabled] .skyder-knop { cursor: not-allowed; }
/* Stoppene under sporet, når skyderen har faste trin. Mono, meta. */
.skyder-stop {
  display: flex;
  justify-content: space-between;
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--tekst-3);
}

/* ---- talfeltet ------------------------------------------------------------ */
/* Et tal med minus og plus. Til antal, aldrig til et beløb — et beløb
   skrives, det klikkes ikke op. Tallet i mono, tabulært. */
.talfelt {
  display: inline-flex;
  align-items: stretch;
  inline-size: 100%;
  min-block-size: var(--kontrol-h);
  border-radius: var(--hjorne-2);
  border: 1px solid var(--kant-staerk);
  background: var(--flade);
  box-shadow: var(--felt-dybde);
  overflow: hidden;
  transition: border-color var(--overgang-tilstand), box-shadow var(--overgang-tilstand);
}
.talfelt:hover { border-color: var(--dekor); }
.talfelt:focus-within {
  border-color: var(--handling);
  box-shadow: var(--felt-dybde), var(--felt-fokus);
}
.talfelt-knap {
  flex: none;
  inline-size: var(--kontrol-h);
  border: 0;
  background: var(--flade-2);
  color: var(--tekst-2);
  cursor: pointer;
  display: grid;
  place-items: center;
  transition: background var(--tid-1) var(--ease-std);
}
.talfelt-knap:hover { background: var(--flade-hover); color: var(--tekst); }
.talfelt-knap:disabled { color: var(--tekst-3); cursor: not-allowed; background: var(--flade-3); }
.talfelt-knap:first-child { border-inline-end: 1px solid var(--kant); }
.talfelt-knap:last-child  { border-inline-start: 1px solid var(--kant); }
.talfelt-input {
  flex: 1;
  min-inline-size: 4ch;
  border: 0;
  background: none;
  text-align: center;
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  font-size: var(--fs-body);
  color: var(--tekst);
  outline: none;
}

/* ---- kodefeltet ----------------------------------------------------------- */
/* Seks tegn hver for sig: MitID-koden, en SMS-kode. Hver celle er et
   felt, så indtastning, indsæt og tilbage virker som folk forventer. */
.kodefelt {
  display: inline-flex;
  gap: var(--rum-2);
}
.kodefelt-tegn {
  inline-size: calc(var(--kontrol-h) * .9);
  block-size: calc(var(--kontrol-h) * 1.1);
  padding: 0;
  text-align: center;
  border-radius: var(--hjorne-2);
  border: 1px solid var(--kant-staerk);
  background: var(--flade);
  box-shadow: var(--felt-dybde);
  color: var(--tekst);
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  font-size: var(--fs-title);
  transition: border-color var(--overgang-tilstand), box-shadow var(--overgang-tilstand);
}
.kodefelt-tegn:focus-visible {
  outline: none;
  border-color: var(--handling);
  box-shadow: var(--felt-dybde), var(--felt-fokus);
}
.kodefelt[data-invalid] .kodefelt-tegn { border-color: var(--fn-danger); background: var(--fn-danger-flade); }
/* Skillet efter tredje tegn: koden læses som to grupper. */
.kodefelt-tegn:nth-child(3) { margin-inline-end: var(--rum-3); }

/* ---- datofeltet ----------------------------------------------------------- */
/* Browserens egen datovælger — tastatur, oplæser og telefonens hjul følger
   med, og en hjemmelavet kalender skal genopfinde alle tre. Feltet står i
   mono, som alle tal. */
.datofelt {
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
}
.datofelt::-webkit-calendar-picker-indicator {
  opacity: .55;
  cursor: pointer;
}
.datofelt::-webkit-calendar-picker-indicator:hover { opacity: 1; }

/* ---- filfeltet ------------------------------------------------------------ */
/* En zone man slipper filer i, med en knap for dem der ikke trækker.
   Zonen er stiplet, som et felt der venter på indhold — ikke en flade. */
.filfelt {
  display: grid;
  gap: var(--rum-3);
}
.filfelt-zone {
  display: grid;
  justify-items: center;
  gap: var(--rum-2);
  padding: var(--rum-7) var(--rum-5);
  border-radius: var(--hjorne-4);
  border: 1px dashed var(--kant-staerk);
  background: var(--flade-2);
  color: var(--tekst-2);
  text-align: center;
  cursor: pointer;
  transition: border-color var(--overgang-tilstand), background var(--overgang-tilstand);
}
.filfelt-zone:hover,
.filfelt-zone:focus-within { border-color: var(--tekst-2); }
.filfelt-zone.er-over {
  border-style: solid;
  border-color: var(--tekst);
  background: var(--flade-hover);
}
.filfelt-zone > .ikon { font-size: 24px; color: var(--tekst-3); }
.filfelt-tekst { font-size: var(--fs-body); }
.filfelt-tekst strong { font-weight: var(--fw-medium); color: var(--tekst); }
.filfelt-hjaelp { font-size: var(--fs-body-s); color: var(--tekst-3); }
.filfelt-zone > input { position: absolute; inline-size: 1px; block-size: 1px; opacity: 0; }
.filfelt-liste { display: grid; gap: var(--rum-2); }
.filfelt-fil {
  display: grid;
  grid-template-columns: auto 1fr auto auto;
  align-items: center;
  gap: var(--rum-3);
  padding: var(--rum-2) var(--rum-3);
  border-radius: var(--hjorne-3);
  background: var(--flade-2);
  border: 1px solid var(--kant);
  font-size: var(--fs-body-s);
}
.filfelt-fil > .ikon { color: var(--tekst-3); }
.filfelt-navn { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.filfelt-str { font-family: var(--font-mono); color: var(--tekst-3); }

/* ---- afkrydsningen med ubestemt tilstand ---------------------------------- */
/* Feltets native afkrydsning (`.felt-valg`) er stadig standarden. Denne er
   til hovedet i en tabel: «alle / nogle / ingen» — den tredje tilstand kan
   browseren kun vise med JavaScript, og så er det Base UI's. */
.afkrydsning {
  display: inline-grid;
  place-items: center;
  inline-size: var(--rum-5);
  block-size: var(--rum-5);
  padding: 0;
  border-radius: var(--hjorne-1);
  border: 1px solid var(--kant-staerk);
  background: var(--flade);
  color: var(--paa-handling);
  cursor: pointer;
  transition: background var(--overgang-tilstand), border-color var(--overgang-tilstand);
}
.afkrydsning:hover { border-color: var(--dekor); }
.afkrydsning:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--fokus-ring) 35%, transparent);
}
.afkrydsning[data-checked],
.afkrydsning[data-indeterminate] {
  background: var(--handling);
  border-color: var(--handling);
}
.afkrydsning[data-disabled] { background: var(--flade-3); cursor: not-allowed; }
.afkrydsning-maerke { display: none; font-size: 12px; line-height: 0; }
.afkrydsning[data-checked] .afkrydsning-maerke,
.afkrydsning[data-indeterminate] .afkrydsning-maerke { display: block; }

/* ---- formularens bygning -------------------------------------------------- */
/* Rækken: felter ved siden af hinanden på en bred skærm, under hinanden på
   en smal. Kolonnerne er lige brede; et felt der skal være smallere
   (postnummer) får `.formular-smal`. */
.formular {
  display: grid;
  gap: var(--rum-6);
}
.formular-raekke {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: var(--rum-5);
  align-items: start;
}
.formular-raekke > .formular-smal { max-inline-size: 10rem; }
/* Afsnittet: en legend i etiketsproget og et par linjer om hvad afsnittet
   er til — så en lang formular kan læses som kapitler. */
.formular-afsnit {
  border: 0;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--rum-5);
}
.formular-afsnit > legend {
  padding: 0;
  margin-block-end: var(--rum-2);
  font-size: var(--fs-title);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-titel);
  color: var(--tekst);
}
.formular-afsnit-tekst {
  margin: calc(-1 * var(--rum-3)) 0 0;
  font-size: var(--fs-body-s);
  color: var(--tekst-2);
  max-inline-size: var(--maal-brod);
}
.formular-afsnit + .formular-afsnit {
  padding-block-start: var(--rum-6);
  border-block-start: 1px solid var(--kant);
}
/* Foden: den fremadrettede handling til højre, den eneste primære. */
.formular-fod {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: var(--rum-3);
  padding-block-start: var(--rum-5);
  border-block-start: 1px solid var(--kant);
}
.formular-fod > .formular-note {
  margin-inline-end: auto;
  font-size: var(--fs-body-s);
  color: var(--tekst-3);
}

  /* vælgeliste, kombo, skyder, talfelt, kodefelt, filfelt — på Base UI, 5. sept. 2026 */

/* ─── kits/ui/03-komponenter/sejr-badge.css ─── */
/* SEJR UI — badges, chips og statusmærker.
 *
 * Det er HER tilstandsfladerne fra 16. august 2026 tjener deres plads. Før de
 * fandtes, havde fire apps skrevet Tailwinds #2563EB ind i deres egen CSS,
 * fordi der ikke var noget at lægge bag et informationsmærke. Nu er der.
 *
 * FARVE ALENE SIGER INGENTING. Cirka hver tolvte mand ser rød og grøn ens.
 * Et badge skal derfor altid have en ORDLYD der bærer beskeden — "Afvist",
 * ikke en rød prik. Farven bekræfter det ordet allerede har sagt.
 */

.badge {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-2);
  padding: var(--rum-1) var(--rum-3);
  /* V4: badgen er et MAERKE — et stempelfelt, ikke en pille. Hjørneloven
     i sejr-rum.css. Prikken og chippens kryds er stadig runde: de ER det. */
  border-radius: var(--hjorne-1);
  border: 1px solid transparent;

  font-family: var(--font-sans);
  font-size: var(--fs-body-s);   /* 12px — over gulvet, læsbart i en tabel */
  font-weight: var(--fw-medium);
  line-height: 1.35;
  white-space: nowrap;
}

/* Neutral — "kladde", "ingen status". Standarden. */
.badge-neutral {
  background: var(--flade-3);
  color: var(--tekst-2);
}

/* De fire tilstande. Tekstfarven er tilstandens egen; fladen er dens
   pendant. Målt 8,22-9,41:1 i begge grunde — se sejr-farver.css. */
.badge-info    { background: var(--fn-info-flade);    color: var(--fn-info); }
.badge-succes  { background: var(--fn-success-flade); color: var(--fn-success); }
.badge-advarsel{ background: var(--fn-warning-flade); color: var(--fn-warning); }
.badge-fejl    { background: var(--fn-danger-flade);  color: var(--fn-danger); }

/* Penge har retning, ikke tilstand. Et hævet beløb er ikke en fejl, så det
   får aldrig .badge-fejl. */
.badge-ind { background: var(--fn-success-flade); color: var(--money-in); }
.badge-ud  { background: var(--flade-3);          color: var(--tekst-2); }

/* ---- skraveringsmærket ---------------------------------------------------
   Tredje bærer af den samme besked. Rækkefølgen er: ORDET først, så farven,
   så skraveringen. Et badge uden ordlyd er stadig forkert — koden gør det
   ikke lovligt at lade et mærke være en farvet firkant.

   Hvorfor koden overhovedet er her: `--fn-success` og `--fn-info` ligger
   4,5 ΔE fra hinanden under tritanopi, altså kan de være samme farve for
   nogen. En skravering overlever dikromasi, gråtone, en fotokopi og en fax.
   Arterne og deres tilstande står i `fundament/09-dataviz/SEJR-Dataviz.md`;
   selve maskerne genereres af `byg-ui.py`.

   Målet er 14px og ikke .kode's egne 16: mærket står i en 12px etiket, og et
   16px felt gør badget højere end sin egen skrift. Flisen skaleres med, så
   koden vejer det samme relativt. */
.badge .kode {
  width: 14px;
  height: 14px;
  mask-size: 7px 7px;
}

/* Omrids i stedet for flade. Til mærker der står PÅ et kort eller i en
   liste, hvor en fyldt flade ville lægge sig som en klat oven i materialet.
   Tilstandsfarven bærer både tekst, kant og kode — den er allerede målt som
   TEKSTfarve i paletten, så den holder på begge grunde.
   I en tabel bruges den fyldte udgave: dér er mærket det eneste farvede, og
   fladen hjælper med at finde kolonnen. */
.badge-omrids {
  background: transparent;
  border-color: currentColor;
}

/* Prikken foran teksten. Dekoration der GENTAGER ordet — den må aldrig stå
   alene som eneste bærer af beskeden. Har mærket en kode, er prikken
   overflødig: to dekorationer der siger det samme er én for meget. */
.badge .prik {
  width: 6px;
  height: 6px;
  border-radius: var(--hjorne-fuld);
  background: currentColor;
  flex: none;
}

/* Chip — et badge man kan fjerne igen. Højere, med plads til et kryds. */
.chip {
  min-height: var(--kontrol-h-s);
  padding: 0 var(--rum-3);
  gap: var(--rum-3);
  background: var(--flade-2);
  color: var(--tekst);
  border-color: var(--kant);
}
/* Eksplicit mål, så ×'et ikke arver en generel knaphøjde og sprænger chippen.
   Det vokser med i berøringstæthed, hvor fingeren skal ramme det. */
.chip button {
  border: none;
  background: transparent;
  color: var(--tekst-3);
  cursor: pointer;
  line-height: 1;
  width: var(--rum-6);
  height: var(--rum-6);
  min-height: 0;
  padding: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--hjorne-fuld);
  flex: none;
}
[data-taethed="beroring"] .chip button,
.taethed-beroring .chip button { width: var(--rum-8); height: var(--rum-8); }
.chip button:hover { color: var(--tekst); background: var(--flade-hover); }

/* Tælleren — antal ulæste, antal poster. Mono, så to- og trecifrede tal ikke
   får mærket til at hoppe i bredden. */
.badge-tal {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  min-width: 20px;
  justify-content: center;
  padding: var(--rum-1) var(--rum-2);
  background: var(--handling);
  color: var(--paa-handling);
}



/* ─── kits/ui/03-komponenter/sejr-vaelger.css ─── */
/* SEJR UI — vælgeren. Et valg mellem få ting, hvor alle skal kunne ses.
 *
 * Skrevet 22. august 2026.
 *
 * ─── HVORFOR DEN BLEV EN KOMPONENT ─────────────────────────────────────────
 *
 * Den fandtes allerede. `komponenter.html` havde skrevet sin egen i sidens
 * eget stilark for at kunne skifte grund og tæthed, og den lå der fra
 * 16. august 2026. En kontrol der er håndlavet ét sted bliver håndlavet igen
 * det næste sted, og så har systemet to vælgere der ligner hinanden næsten.
 *
 * ─── HVORNÅR DEN ER DET RIGTIGE ────────────────────────────────────────────
 *
 * To til fire valg, hvor det hjælper at SE de fravalgte: dag/nat,
 * måned/kvartal/år, alle/indgående/udgående. Er der flere end fire, eller
 * er mulighederne ikke lige gode, er svaret en <select> — en vælger med syv
 * knapper er en værktøjslinje der har glemt hvad den handler om.
 *
 * ─── TILGÆNGELIGHED ────────────────────────────────────────────────────────
 *
 * Knapperne bærer `aria-pressed`, og gruppen har `role="group"` med et
 * `aria-label`. Uden dem er det fire knapper uden sammenhæng, og den valgte
 * er kun valgt visuelt.
 */

.vaelger {
  display: inline-flex;
  gap: 2px;
  padding: 3px;
  /* V4: vaelgeren er en SKINNE, ikke en kapsel — hjørneloven. */
  border-radius: var(--hjorne-2);
  border: 1px solid var(--kant-staerk);
  background: var(--flade-2);
  background-image: var(--lysfald);
}

.vaelger button {
  border: none;
  background: transparent;
  color: var(--tekst-2);
  cursor: pointer;

  min-height: calc(var(--kontrol-h) - var(--rum-3));
  padding: 0 var(--rum-4);
  border-radius: var(--hjorne-1);

  font-family: var(--font-sans);
  font-size: var(--fs-body-s);
  font-weight: var(--fw-medium);
  white-space: nowrap;

  transition: background-color var(--overgang-tilstand),
              color var(--overgang-tilstand);
}
.vaelger button:hover { color: var(--tekst); }

/* Den valgte. Den er LØFTET ud af sporet, ikke farvet — crimson er
   handlingen, ét sted pr. skærm, og et filter er ikke en handling. */
.vaelger button[aria-pressed="true"] {
  background-color: var(--flade);
  background-image: var(--lysfald);
  color: var(--tekst);
  box-shadow: var(--loft-1);
}

/* Mono-udgaven — til tal og koder, hvor bredden ikke må hoppe når valget
   skifter. Måned/kvartal/år, 1D/1U/1M/1Å. */
.vaelger-tal button {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
}

.vaelger button:disabled {
  opacity: .45;
  cursor: not-allowed;
}

/* Fuld bredde — på telefon fylder vælgeren linjen ud, så hvert mål er
   større. Den arver --touch-min fra tætheden af sig selv. */
.vaelger-bred { display: flex; }
.vaelger-bred button { flex: 1; }



/* ─── kits/ui/03-komponenter/sejr-kort.css ─── */
/* SEJR UI — kort, ark og navigation. Fladerne man lægger tingene på.
 *
 * Et kort er ikke en kasse med en skygge. Det er en påstand om at det
 * indeni hører sammen. Er der ikke noget der binder indholdet, skal der
 * ikke være et kort — så er der bare en ramme om tilfældigheder.
 */

/* ---- kort ---------------------------------------------------------------- */
/* Kun form og rytme her — INGEN flade. Se hvorfor lige nedenfor. */
.kort {
  display: flex;
  flex-direction: column;
  gap: var(--rum-5);
  padding: var(--rum-6);
  border-radius: var(--hjorne-4);
}

/* V4: INDFATNINGEN — aktiebrevets dobbelte hårlinje som kortklasse.
   Additiv: ingen eksisterende klasse ændrer betydning, og React-laget
   kender den ikke og behøver ikke at kende den. Læg den på det kort der
   bærer skærmens påstand — nøgletallet, en kvittering, et dokument — og
   aldrig på alle kort: en indfatning om alt er en indfatning om intet.
   Den indre linje ligger 5px inde, som dokumenternes ramme, og tegner
   med --kant så den vender med på nat af sig selv. */
/* V4: DOKUMENTET — kortvarianten til det der ER en kvittering, et
   uddrag, et brev. Indfatningens dobbelte haarlinje plus en apparat-
   linje i bunden, som de trykte dokumenters registratur. Grunden er
   --flade-2: paa papir er det cream (dokumentpapiret), paa nat den
   loeftede flade — nat laaner ikke papirets varme. Bruges som
   class="kort kort-dokument". */
.kort-dokument {
  position: relative;
  background: var(--flade-2);
  border: 1px solid var(--kant);
}
.kort-dokument::before {
  content: "";
  position: absolute;
  inset: 5px;
  border: 1px solid var(--kant);
  border-radius: calc(var(--hjorne-4) - 4px);
  pointer-events: none;
}
/* apparatlinjen — mono, daempet, haarlinje over. Indholdet er
   dokumentets eget: nummer, dato, side. */
.kort-apparat {
  display: flex;
  justify-content: space-between;
  gap: var(--rum-5);
  margin-top: var(--rum-4);
  padding-top: var(--rum-4);
  border-top: 1px solid var(--kant);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: .06em;
  color: var(--tekst-3);
}

.kort-stik {
  position: relative;
}
.kort-stik::before {
  content: "";
  position: absolute;
  inset: 5px;
  border: 1px solid var(--kant);
  border-radius: calc(var(--hjorne-4) - 4px);
  pointer-events: none;
}

/* Den massive udgave. Bemærk :not(.glas) — det er ikke pedanteri.
   Skrev man i stedet `.kort { background: … }` og derefter nulstillede med
   `.kort.glas { background: none }`, ville man SLÅ GLASSET IHJEL: .kort.glas
   vejer (0,2,0) og .glas kun (0,1,0), så nulstillingen vinder over selve
   materialet. Tilbage er kun sløringen, og et slør uden kulør, kant og
   randlys ligner ingenting.
   Præcis dét skete 16. august 2026. Med :not(.glas) er de to udgaver
   gensidigt udelukkende, og de kommer aldrig til at slås. */
/* ─── 6. SEPTEMBER 2026, ANDEN RUNDE: KORTET ER ET TRYKT DOKUMENT ──────────
 *
 * Morris så første runde (tre lag skygge, lyskant) og sagde nej: korrekt,
 * men ikke særegent — «STANDS OUT from the REST». Skygger har alle. Det
 * andre IKKE har, ligger i fundamentet: gravure, hårlinjer, dokumentpapir.
 * Så kortet holder op med at være en kasse med skygge og bliver det huset
 * altid har sagt det var — et trykt stykke papir:
 *
 *   · KANTEN ER EN GRADIENT, ikke en streg. Lys i overkanten, mørk i
 *     underkanten, som en kant der er belyst ovenfra. Det er teknikken
 *     med to background-lag (padding-box + border-box) over en gennem-
 *     sigtig border; ingen ekstra element, og radius følger med.
 *   · LYSET FALDER IND FRA ØVERSTE VENSTRE HJØRNE som et blødt, radialt
 *     fald i papir — ikke kun en stribe langs toppen. Fladen ser ud som
 *     om den ligger i et rum med et vindue.
 *   · HELTEN FÅR CERTIFIKATETS UDSTYR: den dobbelte hårlinje 5 px inde
 *     (aktiebrevets indfatning), gravurepladen «hjoerne» — «the
 *     certificate corner» — i to modstående hjørner, og en varme af
 *     crimson i det ene hjørne, hvor seglet ville sidde. Pladens yderste
 *     bølgelinje ligger på 5,3 px ved 96 px, så den MØDER den indre
 *     hårlinje i stedet for at ligge ved siden af den. Det er ikke
 *     tilfældigt; det er derfor hjørnet er 96 px.
 *
 * Alt er stadig tokens og color-mix. Ingen ny farve. Ingen ny plade. */
:root,
[data-ground="nat"],
.nat {
  --kort-kant-top:  color-mix(in srgb, var(--ink) 9%,  transparent);
  --kort-kant-bund: color-mix(in srgb, var(--ink) 22%, transparent);
  --kort-lys: radial-gradient(140% 90% at 0% 0%,
      color-mix(in srgb, var(--paper) 85%, transparent) 0%,
      color-mix(in srgb, var(--paper) 0%,  transparent) 60%);
  --kort-varme: radial-gradient(70% 90% at 100% 0%,
      var(--gloed-crimson) 0%,
      color-mix(in srgb, var(--crimson) 0%, transparent) 70%);
  --kort-hjoerne-alpha: .55;
}
[data-ground="nat"],
.nat {
  --kort-kant-top:  color-mix(in srgb, var(--paper) 22%, transparent);
  --kort-kant-bund: color-mix(in srgb, var(--paper) 5%,  transparent);
  --kort-lys: radial-gradient(140% 90% at 0% 0%,
      color-mix(in srgb, var(--paper) 6%, transparent) 0%,
      color-mix(in srgb, var(--paper) 0%, transparent) 60%);
  --kort-hjoerne-alpha: .40;
}

.kort:not(.glas) {
  position: relative;
  border: 1px solid transparent;
  background-color: transparent;
  background-image:
    var(--lysfald),
    var(--kort-lys),
    linear-gradient(var(--flade-2), var(--flade-2)),
    linear-gradient(180deg, var(--kort-kant-top), var(--kort-kant-bund));
  background-origin: padding-box, padding-box, padding-box, border-box;
  background-clip:   padding-box, padding-box, padding-box, border-box;
  box-shadow: var(--loft-2);
}
/* Den tætte udgave. Tilføjet 23. august 2026 af samme grund som
   `.noegletal-lille`: et kort med 20 px luft er rigtigt når det står alene
   på en side, og forkert når otte af dem deler et vindue på 900 px.

   KUN LUFTEN OG RADIUS SKIFTER. Fladen, lysfaldet, kanten og løftet er de
   samme — ellers er det ikke det samme kort tættere, det er et andet kort. */
.kort-taet {
  gap: var(--rum-3);
  padding: var(--rum-4);
  border-radius: var(--hjorne-3);
}

/* ---- 6. september 2026: TRE HØJDER ---------------------------------------
   Morris, efter knappen fik dybde: fladerne var det næste. Et kort havde
   én højde, og alt på en skærm stod i den — nøgletallet og fodnoten lige
   langt fra bordet. Nu er der tre:

     .kort-broend   under bordet   nedsænket: --flade-3, --saenket og det
                                   svage lysfald. Til det der er baggrund
                                   for noget andet — en liste inde i et
                                   kort, en graf, en brønd.
     .kort          på bordet      som før. Løft 2, nu i tre lag.
     .kort-helt     over bordet    ÉT pr. skærm: det kort skærmen handler
                                   om. Løft 3, større radius, mere luft.
                                   To helte er ingen helt, af samme grund
                                   som der kun er én primær knap.

   Og et kort man kan klikke på, siger det med kroppen: .kort-klik løfter
   sig én pixel under musen og sætter sig når man trykker — knappens
   bevægelse, ingen fjeder (§07). Sæt selv onClick, tabindex og rolle;
   klassen gør kun det man kan se. */
.kort-helt {
  position: relative;
  padding: var(--rum-7);
  border-radius: var(--hjorne-5);
}
.kort-helt:not(.glas) {
  box-shadow: var(--loft-3);
  background-image:
    var(--lysfald),
    var(--kort-varme),
    var(--kort-lys),
    linear-gradient(var(--flade-2), var(--flade-2)),
    linear-gradient(180deg, var(--kort-kant-top), var(--kort-kant-bund));
  background-origin: padding-box, padding-box, padding-box, padding-box, border-box;
  background-clip:   padding-box, padding-box, padding-box, padding-box, border-box;
}
/* Indfatningen: aktiebrevets dobbelte hårlinje, 5 px inde. ::after og ikke
   ::before, fordi .gloed allerede ejer ::before på den samme flade. */
.kort-helt::after {
  content: "";
  position: absolute;
  inset: 5px;
  border: 1px solid var(--kant);
  border-radius: calc(var(--hjorne-5) - 4px);
  pointer-events: none;
}
/* Hjørnerne: pladen «hjoerne», i tekstfarven, to modstående. Markup:
     <span class="gravure gravure-hjoerne kort-hjoerne" aria-hidden="true"></span>
     <span class="gravure gravure-hjoerne kort-hjoerne" data-hjoerne="nederst" aria-hidden="true"></span>
   96 px, så pladens yderste linje møder indfatningen. Øverst til HØJRE
   og nederst til VENSTRE, spejlet — titlen står øverst til venstre, og
   et ornament under en titel er et ornament der slås. */
.kort-hjoerne,
.levende > .kort-hjoerne.kort-hjoerne {
  position: absolute;
  inset: 0 0 auto auto;
  inline-size: 96px;
  block-size: 96px;
  color: var(--tekst);
  opacity: var(--kort-hjoerne-alpha);
  transform: scaleX(-1);
  pointer-events: none;
  z-index: 0;
}
.kort-hjoerne[data-hjoerne="nederst"],
.levende > .kort-hjoerne.kort-hjoerne[data-hjoerne="nederst"] {
  inset: auto auto 0 0;
  transform: scaleY(-1);
}

.kort-broend,
.kort.kort-broend {
  padding: var(--rum-4);
  border-radius: var(--hjorne-3);
  background-color: var(--flade-3);
  background-image: var(--lysfald-svag);
  border: 1px solid var(--kant);
  box-shadow: var(--saenket);
}

.kort-klik {
  cursor: pointer;
  transition: box-shadow var(--overgang-tilstand),
              transform var(--overgang-tilstand),
              border-color var(--overgang-tilstand);
}
.kort-klik:hover {
  transform: translateY(-1px);
  box-shadow: var(--loft-3);
  border-color: var(--kant-staerk);
}
.kort-klik:active {
  transform: translateY(0);
  box-shadow: var(--loft-1);
}
.kort-klik:focus-visible {
  outline: none;
  box-shadow: var(--loft-2), var(--fokus-ring);
}

/* Nat: kanten er dér lyset rammer — det gør gradientkanten nu af sig selv,
   lys i toppen og næsten væk i bunden. Den gamle border-top-color-regel er
   udgået 6. september 2026. */

.kort-hoved {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--rum-4);
}
.kort-titel {
  font-size: var(--fs-title);
  font-weight: var(--fw-medium);
  line-height: var(--lh-title);
  margin: 0;
  color: var(--tekst);
}
.kort-under {
  font-size: var(--fs-body-s);
  color: var(--tekst-2);
  margin: 0;
}
.kort-fod {
  display: flex;
  gap: var(--rum-3);
  align-items: center;
  padding-top: var(--rum-5);
  border-top: 1px solid var(--kant);
}

/* Et beløb der er kortets hovedbesked. Mono, stort, men aldrig så stort at
   det holder op med at være aflæseligt i en kolonne ved siden af et andet. */
.kort-belob {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums slashed-zero;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  letter-spacing:var(--spor-titel);
  color: var(--tekst);
}
.kort-belob .enhed {
  font-size: var(--fs-lead);
  color: var(--tekst-3);
  margin-left: var(--rum-2);
}

/* ---- ark / dialog -------------------------------------------------------- */
.ark-lag {
  position: fixed;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--rum-6);
  background: var(--slor);
  z-index: 100;
}

/* Denne linje er ikke valgfri, og den er ikke pynt.
   `hidden` slår display fra via browserens egen stilark — men den regel har
   næsten ingen specificitet, så ENHVER klasse med `display` slår den. Uden
   linjen her bliver .ark-lag[hidden] stående som en fastlåst mørk skærm over
   hele siden, og resten af appen kan ikke ses eller klikkes.
   Fanget 16. august 2026, på demoens egen forside. */
.ark-lag[hidden] { display: none; }

.ark {
  width: 100%;
  max-width: 420px;
  display: flex;
  flex-direction: column;
  gap: var(--rum-5);
  padding: var(--rum-7);
  border-radius: var(--hjorne-5);
  background-color: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant);
  box-shadow: var(--loft-4);
}
.ark-titel {
  font-size: var(--fs-h3);
  line-height: var(--lh-h3);
  font-weight: var(--fw-medium);
  margin: 0;
}
.ark-tekst {
  font-size: var(--fs-body);
  color: var(--tekst-2);
  margin: 0;
}
/* Knapperne i et ark: den handling der fører fremad står til HØJRE, og den
   er den eneste primære. Annullér er stille — den skal kunne findes, ikke
   konkurrere. */
.ark-handlinger {
  display: flex;
  gap: var(--rum-3);
  justify-content: flex-end;
}
.ark-handlinger .knap { flex: 1; }

@media (max-width: 520px) {
  /* På telefon lægger arket sig i bunden — dér hvor tommelfingeren er. */
  .ark-lag { align-items: flex-end; padding: 0; }
  .ark {
    max-width: none;
    border-radius: var(--hjorne-5) var(--hjorne-5) 0 0;
    padding-bottom: var(--rum-8);
  }
}

/* ---- navigation ---------------------------------------------------------- */
.nav {
  display: flex;
  align-items: center;
  gap: var(--rum-2);
  padding: var(--rum-3);
  border-radius: var(--hjorne-5);
}
/* Samme :not(.glas)-regel som kortet, og af samme grund. */
.nav:not(.glas) {
  background-color: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant);
  box-shadow: var(--loft-2);
}

.nav-punkt {
  display: flex;
  align-items: center;
  gap: var(--rum-3);
  min-height: var(--kontrol-h);
  padding: 0 var(--kontrol-px);
  border-radius: var(--hjorne-3);
  font-size: var(--fs-body-s);
  font-weight: var(--fw-medium);
  color: var(--tekst-2);
  text-decoration: none;
  white-space: nowrap;
  transition: background-color var(--overgang-tilstand),
              color var(--overgang-tilstand);
}
.nav-punkt:hover { background: var(--flade-hover); color: var(--tekst); }

/* Den aktive side. aria-current="page" SKAL sættes i markup — den visuelle
   fremhævning alene fortæller ikke en skærmlæser hvor man er. */
.nav-punkt[aria-current="page"] {
  background: var(--flade-3);
  color: var(--tekst);
  /* V4: linjesprogets anker — en 2px streg i tekstfarven langs bunden,
     som skalaens hovedstregning. Fladen alene sagde «valgt» med tryk;
     stregen siger det med husets eget sprog, og den vender med paa nat
     fordi den er currentColor. */
  box-shadow: inset 0 -2px 0 0 currentColor;
}

/* Bundnavigation til telefon og POS. Punkterne fordeles, og hvert af dem
   opfylder --touch-min af sig selv. */
.nav-bund {
  justify-content: space-around;
  padding: var(--rum-2) var(--rum-3);
}
.nav-bund .nav-punkt {
  flex-direction: column;
  gap: var(--rum-1);
  font-size: var(--fs-meta);
  padding: var(--rum-2) var(--rum-3);
  min-width: var(--touch-min);
}



/* ─── kits/ui/03-komponenter/sejr-betalingskort.css ─── */
/* SEJR UI — betalingskortet.
 *
 * Skrevet 22. august 2026.
 *
 * Ikke en flade man lægger noget på: en GENSTAND. SEJR udsteder kort, og et
 * kit uden husets tydeligste genstand mangler noget — kortet er det eneste i
 * hele systemet kunden får i hånden.
 *
 * ─── TRE TING DER IKKE ER SMAG ─────────────────────────────────────────────
 *
 * 1. KORTET ER ALTID NAT. Det er blæk uanset hvilken grund siden står på,
 *    fordi det ikke er en del af siden — det er et billede af en fysisk ting.
 *    Derfor omdefinerer det `--lysfald` lokalt: materialeloven skal gælde på
 *    kortet også når den er slået fra på siden omkring det.
 *
 * 2. HJØRNET ER FYSISK, IKKE ET TOKEN. ISO/IEC 7810 ID-1: 85,60 × 53,98 mm
 *    med 3,18 mm hjørneradius. Det er 3,71 % af bredden og 5,89 % af højden,
 *    og skrevet sådan holder formen i enhver størrelse. Et `--hjorne-*`-token
 *    ville være rigtigt i én størrelse og forkert i alle andre.
 *
 * 3. INGEN SIKKERHEDSELEMENTER. Ingen latent skrift, intet hologram, ingen
 *    mikrotekst der PÅSTÅR at være en sikkerhedsfunktion. De specificeres af
 *    udsteder og kortordning, ikke af et designsystem, og en efterligning på
 *    en attrap er værre end ingenting: den lærer folk at stole på et mærke
 *    der ikke betyder noget.
 *
 * ─── BÅNDET ────────────────────────────────────────────────────────────────
 *
 * `.gravure-baand` kommer fra `02-materiale/sejr-skravering.css` og er
 * genereret af `baand`-pladen. Den ligger i SIN EGEN BANE og aldrig bag
 * cifrene. Første udkast førte den tværs gennem kortnummeret, og det er
 * præcis det pladereglen forbyder: mønstret parterer sig omkring tallet og
 * lader midten være. Et kortnummer er desuden en identifikator og ikke et
 * beløb — bag et BELØB må der aldrig ligge gravure overhovedet.
 */

.betalingskort {
  /* Kortet er sin egen grund. Lyset skal falde her uanset siden. */
  --lysfald: linear-gradient(
      180deg,
      color-mix(in srgb, var(--paper) 11.5%, transparent) 0%,
      color-mix(in srgb, var(--paper) 0%,    transparent) 55%);

  position: relative;
  aspect-ratio: 85.6 / 53.98;
  border-radius: 3.71% / 5.89%;
  overflow: hidden;

  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: var(--rum-6);

  background-color: var(--ink);
  background-image: var(--lysfald);
  color: var(--paper);
  border: 1px solid color-mix(in srgb, var(--paper) 20%, transparent);
  box-shadow: var(--loft-3);
}

/* Rækken øverst: mærket til venstre, kortets art til højre. */
.betalingskort-top {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--rum-4);
}
.betalingskort-top img,
.betalingskort-top svg { height: 19px; display: block; }

.betalingskort-art {
  font-family: var(--font-sans);
  font-size: var(--fs-meta);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: color-mix(in srgb, var(--paper) 55%, transparent);
}

/* Båndets bane: ført helt ud til kanten, med luft over og under. */
.betalingskort .gravure-baand {
  margin-left: calc(var(--rum-6) * -1);
  margin-right: calc(var(--rum-6) * -1);
}

/* Kortnummeret. Mono med tabulære cifre af samme grund som overalt ellers:
   fire grupper på fire skal stå i samme bredde hver gang. Sporet er lidt
   åbnet, fordi et præget nummer læses ét ciffer ad gangen. */
.betalingskort-nummer {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums slashed-zero;
  font-size: var(--fs-lead);
  letter-spacing: .13em;
  white-space: nowrap;
}

.betalingskort-bund {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--rum-4);
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  letter-spacing: .06em;
  color: color-mix(in srgb, var(--paper) 62%, transparent);
}

/* Kortet i en liste eller en vælger — samme genstand, mindre. Polstringen
   følger med, så forholdene holder. */
.betalingskort-lille {
  padding: var(--rum-5);
}
.betalingskort-lille .betalingskort-nummer { font-size: var(--fs-body); }
.betalingskort-lille .gravure-baand {
  margin-left: calc(var(--rum-5) * -1);
  margin-right: calc(var(--rum-5) * -1);
  height: 22px;
  mask-size: 440px 22px;
}

/* Spærret kort. ORDET siger det; dæmpningen bekræfter kun.
   `filter: grayscale(1)` stod her først og var ren staffage: kortet er blæk
   og papir og har ingen kulør at tage fra det. På nat gjorde den ingenting,
   og på dag var det opaciteten der gjorde arbejdet. Væk med den.

   Et spærret kort SKAL bære sin status som tekst — i `.betalingskort-art`
   eller som et badge på fladen. En dæmpet firkant er ikke en besked, og på
   nat er en dæmpet mørk flade næsten ikke engang en forskel. */
.betalingskort[data-spaerret] { opacity: .5; }

/* ---- bagsiden -------------------------------------------------------------
   Magnetstriben øverst, som ISO/IEC 7811 lægger den: 5,5 mm fra kanten,
   12,7 mm høj — her som andele af kortets højde. Underskriftsfeltet er
   papir, kontrolcifrene står i mono til højre i det. Nederst udstederen i
   mikroskrift. Ingen kortnumre: de står på forsiden. */
.betalingskort-bagside {
  justify-content: flex-start;
  gap: var(--rum-4);
  padding-inline: 0;
  padding-block-start: 10%;
}
.betalingskort-magnet {
  block-size: 23.5%;
  background: color-mix(in srgb, var(--ink) 85%, var(--paper));
  border-block: 1px solid color-mix(in srgb, var(--paper) 10%, transparent);
}
.betalingskort-strimmel {
  display: flex;
  align-items: center;
  margin-inline: var(--rum-6) 22%;
  block-size: 14%;
  background: var(--cream, var(--paper));
  border-radius: 2px;
}
.betalingskort-underskrift {
  flex: 1;
  block-size: 100%;
  background: repeating-linear-gradient(90deg, transparent 0 6px, color-mix(in srgb, var(--ink) 18%, transparent) 6px 7px);
  border-start-start-radius: 2px;
  border-end-start-radius: 2px;
}
.betalingskort-cvc {
  padding-inline: var(--rum-3);
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  letter-spacing: .2em;
  color: var(--ink);
}
.betalingskort-udsteder {
  margin-block-start: auto;
  padding: 0 var(--rum-6) var(--rum-5);
  display: grid;
  gap: 2px;
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: .04em;
  color: color-mix(in srgb, var(--paper) 55%, transparent);
}
.betalingskort-lille .betalingskort-udsteder span:last-child { display: none; }



/* ─── kits/ui/03-komponenter/sejr-noegletal.css ─── */
/* SEJR UI — nøgletallet. Det ene tal en skærm handler om.
 *
 * Skrevet 22. august 2026.
 *
 * En saldo er ikke en overskrift, og den er ikke brødtekst. Den er skærmens
 * påstand, og alt andet på fladen står i forhold til den. Derfor er den en
 * komponent og ikke en klasse man sætter på en <h1>.
 *
 * ─── FIRE TING DER IKKE ER SMAG ────────────────────────────────────────────
 *
 * 1. ØREN ER MINDRE END KRONERNE, MEN DEN ER DER. En handelsdrivende der
 *    afstemmer, afstemmer på øren. At skjule dem for at få tallet til at se
 *    roligt ud er at gemme det eneste ciffer der afgør om bogen stemmer.
 *
 * 2. TALLET ANIMERER ALDRIG SIN VÆRDI. Et tal der tæller op viser et beløb
 *    der ikke er sandt, hele vejen op. Skifter saldoen, skifter den i ét
 *    spring. Reglen står i `fundament/07-bevaegelse` og gælder hele huset.
 *
 * 3. INGEN GRAVURE BAG DET. Ikke skalaen, ikke en plade, ikke en tekstur.
 *    Skal tallet have en indfatning, parterer mønstret sig omkring det —
 *    derfor ligger `.skala-fod` UNDER blokken og aldrig bagved.
 *
 * 4. MONO OG tnum, altid. To saldi under hinanden skal flugte i enerne, også
 *    når den ene er sekscifret og den anden er trecifret.
 */

.noegletal {
  display: flex;
  flex-direction: column;
  gap: var(--rum-3);
}

.noegletal-etiket {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--rum-4);

  font-size: var(--fs-body-s);
  font-weight: var(--fw-medium);
  color: var(--tekst-2);
  letter-spacing: var(--spor-etiket);
}
/* Kontonummer, IBAN, referencen. Sekundær, i mono, aldrig eneste sted en
   oplysning står. */
.noegletal-ref {
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  font-weight: var(--fw-body);
  color: var(--tekst-3);
  letter-spacing: 0;
}

.noegletal-vaerdi {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums slashed-zero;
  font-feature-settings: "tnum" 1, "zero" 1;
  font-size: var(--fs-h2);
  line-height: var(--lh-h2);
  letter-spacing: var(--spor-titel);
  color: var(--tekst);
}
/* Stor udgave — skærmens eneste tal. Én pr. skærm, af samme grund som der er
   én primær knap: to påstande der begge råber er ingen påstand. */
.noegletal-stor .noegletal-vaerdi {
  font-size: var(--fs-h1);
  line-height: var(--lh-h1);
  letter-spacing: var(--spor-display);
}

/* ── LILLE UDGAVE ─────────────────────────────────────────────────────────
   Tilføjet 23. august 2026, fundet af HQ's Finance- og Acquiring-vinduer.

   Filens eget hoved siger at nøgletallet er «det ene tal en skærm handler
   om», og `--fs-h2` er skåret til netop det. Men et dashboard viser fire til
   otte tal ved siden af hinanden i et vindue på 900 px, og dér er 34 px ikke
   en påstand — det er en kollision.

   Manglede den udgave, byggede hver app sin egen kasse i stedet. Det er
   præcis dét der skete: HQ havde `sunken bg-field px-2.5 py-1.5` gentaget
   over tyve vinduer, og dermed husets farver uden husets ting.

   `.noegletal-stor` fandtes i forvejen. Det her er den anden ende af samme
   skala, og de tre udgør nu en trappe: lille · almindelig · stor.

   REGLERNE ÆNDRER SIG IKKE. Øren er der stadig, tallet animerer stadig
   aldrig sin værdi, og der er stadig ingen gravure bagved. Kun graden. */
.noegletal-lille {
  gap: var(--rum-2);
}
.noegletal-lille .noegletal-etiket {
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-3);
}
.noegletal-lille .noegletal-vaerdi {
  font-size: var(--fs-lead);
  line-height: var(--lh-lead);
  letter-spacing: var(--spor-brod);   /* 16 px er ikke en titel */
}
.noegletal-lille .noegletal-under {
  font-size: var(--fs-meta);
  color: var(--tekst-3);
}

/* TYPEGULVET SKAL OVERLEVE DEN LILLE UDGAVE — og gjorde det ikke.
   `--noegletal-enhed` er `.26em` og `--noegletal-oere` er `.5em`. Begge er
   skåret til `--fs-h2` på 34 px, hvor de bliver 9 og 17 px. På `--fs-lead`
   bliver de **4 og 8 px**. Målt i HQ's Analytics-vindue 23. august 2026:
   procenttegnet efter «54» var fire pixels højt.

   En em-brøk er rigtig så længe grundtallet er stort. Bliver grundtallet
   lille nok, holder brøken op med at være en proportion og bliver en fejl.
   Derfor står de to i ABSOLUTTE grader her — og `--fs-meta` er præcis
   gulvet, så de ikke kan gå under det igen.

   11 px ved siden af 16 px er stadig et tydeligt trin. Enheden løftes ikke
   op på skulderen ved den grad: et hævet 11-px-tegn ved et 16-px-tal ser ud
   som en fodnote, ikke som en enhed. */
.noegletal-lille .noegletal-enhed {
  font-size: var(--fs-meta);
  vertical-align: baseline;
  margin-left: .3em;
}
.noegletal-lille .noegletal-oere {
  font-size: var(--fs-meta);
}

/* Øren. Mindre, dæmpet — men aldrig væk. */
.noegletal-oere {
  font-size: .5em;
  color: var(--tekst-2);
}
/* Valutaen. Den er en etiket, ikke en del af tallet, så den står i versaler
   med spor og løftet op på tallets skulder. */
.noegletal-enhed {
  font-size: .26em;
  color: var(--tekst-3);
  letter-spacing: var(--spor-etiket);
  margin-left: .35em;
  vertical-align: .42em;
}

.noegletal-under {
  font-size: var(--fs-body-s);
  color: var(--tekst-2);
}
/* Retningen på det der er på vej ind. Ind er grøn, ud er neutral — penge der
   forlader kontoen er ikke en fejl. */
.noegletal-under .ind { color: var(--money-in); }
.noegletal-under .ud  { color: var(--tekst); }

/* Et negativt nøgletal. Fortegnet gør arbejdet; farven bekræfter kun, og kun
   når der FAKTISK er noget galt — en måned med underskud er ikke en fejl. */
.noegletal[data-tilstand="fejl"] .noegletal-vaerdi { color: var(--fn-danger); }



/* ─── kits/ui/03-komponenter/sejr-maaler.css ─── */
/* SEJR UI — måleren. Instrumentprincippet gjort til en kontrol.
 *
 * Skrevet 22. august 2026. Omskrevet samme dag — se «Hvad der var galt».
 *
 * ─── HVORNÅR DEN MÅ BRUGES ─────────────────────────────────────────────────
 *
 * KUN når noget faktisk MÅLES eller FØLGES: hvor meget af en kreditramme der
 * er brugt, hvor langt en afstemning er nået, hvor tæt man er på et mål.
 * Én værdi op mod ét kendt maksimum.
 *
 * IKKE til at gøre et tal mere levende. Ikke som pynt ved siden af en
 * overskrift. Og ikke til en FORDELING — tre kategorier der summer til en
 * helhed er en andelsgraf (§09), ikke tre målere. Forskellen er ikke
 * kosmetisk: en måler siger «du er her, og dér er grænsen». En fordeling
 * siger «sådan fordeler det sig», og der findes ingen grænse at nærme sig.
 *
 * Det var fejlen i første udgaves eksempelskærm: «Andel af omsætning» stod
 * som tre målere. Intet maksimum, intet at nærme sig, ingen grænse. Det var
 * en graf i en målers tøj.
 *
 * ─── HVAD DER VAR GALT MED FØRSTE UDGAVE ───────────────────────────────────
 *
 * Skalaen lå som et selvstændigt bånd UNDER sporet. Det er ikke et
 * instrument — det er en bjælke med en lineal ved siden af, og øjet skal
 * selv forlænge bjælkens ende ned til stregningerne for at aflæse noget.
 *
 * På en rigtig limbe er graderingen skåret NED I selve båndet, og viseren
 * står oven på den. Sådan er den nu: stregningerne ligger i sporet og
 * fortsætter hen over udslaget. Aflæsningen sker ét sted.
 *
 * ─── HVORDAN STREGNINGERNE OVERLEVER UDSLAGET ──────────────────────────────
 *
 * To lag, ikke ét. Sporets eget lag er i blæk og ses på den TOMME del;
 * udslagets lag er i grundens farve og ses på den FYLDTE. Begge har samme
 * deling og samme udgangspunkt — sporets venstre kant — så de er én ubrudt
 * skala, selvom de er tegnet to gange.
 *
 * Alternativet var mix-blend-mode. Det virker indtil nogen lægger måleren på
 * en flade med sin egen blanding, og så er der ingen der kan se hvorfor
 * stregningerne forsvandt.
 *
 * ─── TRE REGLER ────────────────────────────────────────────────────────────
 *
 * 1. TALLET STÅR SOM TEKST. Altid. En bjælke er en bekræftelse, aldrig
 *    kilden — samme lov som farve, skravering og gravure.
 *
 * 2. ÉN MÅLING FÅR INGEN FARVE. Der er intet at skelne fra, og en farve uden
 *    et valg bag sig er dekoration. Ink på papir, papir på ink. §09 regel 3.
 *
 * 3. FARVE FØRST NÅR DER ER SKET NOGET, og aldrig alene: `data-tilstand`
 *    sætter farven, og ordet står i `.maaler-note`.
 *
 * ─── BRUG ──────────────────────────────────────────────────────────────────
 *
 *   <div class="maaler" style="--vaerdi:.62; --graense:.80">
 *     <div class="maaler-hoved">
 *       <span>Brugt af kreditramme</span>
 *       <span class="maaler-vaerdi">31.000 / 50.000</span>
 *     </div>
 *     <div class="maaler-spor" role="meter" aria-valuenow="62"
 *          aria-valuemin="0" aria-valuemax="100"
 *          aria-label="Brugt af kreditramme">
 *       <div class="maaler-fyld"></div>
 *       <span class="maaler-graense"></span>   <!-- udelades hvis ingen -->
 *     </div>
 *     <p class="maaler-note">Stregen er der hvor renten begynder.</p>
 *   </div>
 *
 * `--vaerdi` og `--graense` er 0-1. role="meter" og aria-value* SKAL sættes
 * på sporet: en bjælke uden dem findes ikke for en skærmlæser.
 */

.maaler {
  --vaerdi: 0;
  --graense: 1;
  /* Ingen farve som standard. Se regel 2. */
  --fyld: var(--tekst);

  /* Sporets højde og graderingens deling. Sporet SKAL være højt nok til at
     en hovedstregning og en lille kan skelnes — under 16 px er de den samme
     streg, og så er det ikke en skala længere. */
  --maaler-h: var(--rum-6);
  --maaler-delt: 10px;

  display: flex;
  flex-direction: column;
  gap: var(--rum-3);
}

.maaler-hoved {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--rum-4);
  font-size: var(--fs-body-s);
  color: var(--tekst-2);
}
/* Aflæsningen. Mono og tnum, så den ikke hopper i bredden når den ændrer sig
   — en måler der flytter sin egen etiket er svær at holde øje med. */
.maaler-vaerdi {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums slashed-zero;
  color: var(--tekst);
}

/* ---- sporet: båndet med graderingen skåret i ---------------------------- */
.maaler-spor {
  position: relative;
  height: var(--maaler-h);
  border-radius: var(--hjorne-1);
  background: var(--flade-3);
  overflow: hidden;
}

/* Graderingen på den TOMME del. Stregningerne rejser sig fra bunden, og hver
   femte går helt igennem — nøjagtig samme deling som `.skala`, så en måler
   og en akse på samme skærm ikke er to forskellige skalaer. */
.maaler-spor::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background-repeat: no-repeat;
  background-position: left bottom;
  background-size: 100% 100%, 100% 34%;
  background-image:
      repeating-linear-gradient(90deg,
          color-mix(in srgb, var(--tekst) 55%, transparent) 0 1px,
          transparent 1px calc(var(--maaler-delt) * 5)),
      repeating-linear-gradient(90deg,
          color-mix(in srgb, var(--tekst) 32%, transparent) 0 1px,
          transparent 1px var(--maaler-delt));
}

/* ---- udslaget ----------------------------------------------------------- */
.maaler-fyld {
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: calc(var(--vaerdi) * 100%);
  background: var(--fyld);
  overflow: hidden;
  /* Bjælken må gerne tegne sig selv ÉN gang ved ankomst. Den må ikke tælle
     op undervejs af samme grund som et beløb ikke må: hele vejen op viser
     den et tal der ikke er sandt. Derfor er det bredden der animerer, og
     `.maaler-vaerdi` skifter i ét spring. */
  transition: width var(--overgang-ind);
}

/* Graderingen fortsætter hen over udslaget, i grundens farve.
   BREDDEN ER SPORETS, IKKE UDSLAGETS. Lagde man den i udslagets egen bredde,
   ville gradienten skalere med værdien: ved 62 % ville de fem tættere
   stregninger ligge et andet sted end sporets egne, og skalaen ville knække
   præcis dér hvor man aflæser den. Derfor 100 % / --vaerdi, og udslagets
   `overflow: hidden` klipper resten. */
.maaler-fyld::after {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: calc(100% / var(--vaerdi));
  pointer-events: none;
  background-repeat: no-repeat;
  background-position: left bottom;
  background-size: 100% 100%, 100% 34%;
  background-image:
      repeating-linear-gradient(90deg,
          color-mix(in srgb, var(--flade) 82%, transparent) 0 1px,
          transparent 1px calc(var(--maaler-delt) * 5)),
      repeating-linear-gradient(90deg,
          color-mix(in srgb, var(--flade) 50%, transparent) 0 1px,
          transparent 1px var(--maaler-delt));
}

/* Grænsen — kreditrammen, målet, det aftalte overtræk. En streg på tværs,
   ikke en farve: grænsen er et STED, ikke en stemning.

   Den er et rigtigt element og ikke et ::after på sporet. Et pseudoelement
   ville skulle vide om `--graense` er sat, og det kan CSS ikke spørge om
   uden at selektere på style-attributtens tekst — en selektor der virker
   indtil nogen sætter variablen et andet sted. Er der ingen grænse, står
   elementet der ikke. */
.maaler-graense {
  position: absolute;
  top: 0;
  bottom: 0;
  left: calc(var(--graense) * 100%);
  width: 1px;
  margin-left: -.5px;
  /* Én kraftig streg med en ren luft på hver side. Første udgave var en
     2 px lys streg med en mørk ring om — den læstes som «||», altså som to
     hovedstregninger, netop dér hvor der er flest stregninger i forvejen.
     En grænse skal kunne kendes fra en gradering på et halvt blik. */
  background: var(--tekst);
  box-shadow: -1px 0 0 var(--flade), 1px 0 0 var(--flade);
  z-index: 1;
}

.maaler-note {
  font-size: var(--fs-body-s);
  color: var(--tekst-2);
}

/* ---- tilstande -----------------------------------------------------------
   Farven kommer FØRST når noget er sket, og den kommer aldrig alene: der
   skal stå et ord i `.maaler-note`. En rød bjælke uden en sætning fortæller
   ikke nogen hvad de skal gøre. */
.maaler[data-tilstand="advarsel"] { --fyld: var(--fn-warning); }
.maaler[data-tilstand="advarsel"] .maaler-note { color: var(--fn-warning); }
.maaler[data-tilstand="fejl"]     { --fyld: var(--fn-danger); }
.maaler[data-tilstand="fejl"]     .maaler-note { color: var(--fn-danger); }
/* Penge på vej ind er ikke en tilstand der skal advares om. */
.maaler[data-tilstand="ind"]      { --fyld: var(--money-in); }

/* ---- tæthed --------------------------------------------------------------
   I kompakt bliver sporet lavere og delingen tættere — men aldrig lavere end
   16 px. Under det kan en hovedstregning og en lille ikke skelnes, og så er
   graderingen kun støj. Det er grunden til at der ikke findes en mindre. */
[data-taethed="kompakt"] .maaler,
.taethed-kompakt .maaler {
  --maaler-h: 16px;
  --maaler-delt: 8px;
}
[data-taethed="beroring"] .maaler,
.taethed-beroring .maaler {
  --maaler-h: var(--rum-7);
  --maaler-delt: 12px;
}

/* `.maaler-serie` fandtes indtil 22. august 2026 og er FJERNET.
   Den var lavet til «Andel af omsætning» — altså til præcis den brug der
   ikke er en måling. En stak målere er i øvrigt bare målere i en flex-kolonne;
   klassen tilføjede en afstand og en invitation til at bruge komponenten
   forkert. */



/* ─── kits/ui/03-komponenter/sejr-liste.css ─── */
/* SEJR UI — listen. Tabellen, når skærmen er for smal til en tabel.
 *
 * Skrevet 22. august 2026.
 *
 * ─── HVORFOR DEN IKKE BARE ER EN TABEL MED FÆRRE KOLONNER ──────────────────
 *
 * En tabel læses NEDAD i kolonner: øjet sammenligner to beløb uden at læse
 * dem. Det virker fordi enerne står under enerne. På 380 px er der ikke
 * plads til fire kolonner, og en tabel der er skrumpet ind til to er ikke en
 * tabel længere — den er en liste der har mistet sin overskrift.
 *
 * Så hellere skifte komponent. Listen har ÉT talfelt, højrestillet, og alt
 * andet til venstre. Kolonnen med beløb flugter stadig; det er den eneste af
 * tabellens egenskaber der er værd at redde på en telefon.
 *
 * ─── DEN REGEL DER AFGØR OM DEN VIRKER ─────────────────────────────────────
 *
 * BELØBSKOLONNEN HAR FAST BREDDE. Lader man den vokse med indholdet, hopper
 * højrekanten mellem rækkerne, og så er der ingen kolonne — der er bare
 * nogle tal der tilfældigvis står til højre. `--liste-tal` er bredden, og
 * den sættes ÉT sted pr. liste, ikke pr. række.
 */

.liste {
  --liste-tal: 116px;
  display: flex;
  flex-direction: column;
}

.liste-rk {
  display: grid;
  grid-template-columns: auto 1fr auto var(--liste-tal);
  align-items: center;
  gap: var(--rum-4);
  min-height: var(--raekke-h);
  padding: var(--rum-3) var(--rum-5);
  color: inherit;
  text-decoration: none;
}
.liste-rk + .liste-rk { border-top: 1px solid var(--kant); }

/* En række der kan klikkes skal se ud som om den kan klikkes — og den skal
   være et <a> eller en <button>, ikke en <div> med onclick. */
.liste-rk[href],
.liste-rk[role="button"] { cursor: pointer; }
.liste-rk[href]:hover,
.liste-rk[role="button"]:hover { background: var(--flade-hover); }

/* Mærket til venstre: initialer, et ikon, et logo. Aldrig eneste bærer af
   hvem rækken handler om — navnet står ved siden af. */
.liste-mrk {
  width: var(--rum-8);
  height: var(--rum-8);
  border-radius: var(--hjorne-3);
  border: 1px solid var(--kant);
  background: var(--flade-3);
  color: var(--tekst-2);

  display: flex;
  align-items: center;
  justify-content: center;
  flex: none;

  font-size: var(--fs-body-s);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
}

/* display:block, ikke arvet fra elementet. Rækken er ofte et <a>, og så er
   titel og underlinje <span>'er — inline, altså på samme linje. Første
   render af listen viste «Nordea Erhverv Overførsel · 14.02» som én sætning.
   En komponent må ikke afhænge af hvilket element nogen valgte. */
.liste-titel {
  display: block;
  font-size: var(--fs-body);
  color: var(--tekst);
}
/* Dato, kategori, reference. Samme regel som i tabellen: må aldrig være det
   eneste sted en vigtig oplysning står. */
.liste-under {
  display: block;
  font-size: var(--fs-body-s);
  color: var(--tekst-3);
  margin-top: 2px;
}

.liste-belob {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums slashed-zero;
  font-size: var(--fs-body);
  text-align: right;
  color: var(--tekst);
  white-space: nowrap;
}
.liste-belob.ind { color: var(--money-in); }
.liste-belob.ud  { color: var(--tekst); }

/* Overskrift mellem grupper — «I dag», «31. juli». Klæbende, så man altid
   kan se hvilken dag man er nede i. */
.liste-skel {
  position: sticky;
  top: 0;
  z-index: 1;
  padding: var(--rum-3) var(--rum-5);
  background: var(--flade-2);
  border-bottom: 1px solid var(--kant);

  font-size: var(--fs-meta);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-3);
}

/* ---- smal skærm ----------------------------------------------------------
   Under 480 px ryger tilstandsmærket ned under titlen i stedet for at spise
   af beløbskolonnen. Beløbet beholder sin bredde; det er dét der skal
   flugte. */
@media (max-width: 480px) {
  .liste-rk {
    grid-template-columns: auto 1fr var(--liste-tal);
    row-gap: var(--rum-2);
  }
  .liste-rk .badge {
    grid-column: 2 / 3;
    justify-self: start;
  }
}



/* ─── kits/ui/03-komponenter/sejr-graf.css ─── */
/* SEJR UI — grafen.
 *
 * Skrevet 22. august 2026.
 *
 * ─── HVORFOR DEN FLYTTEDE HERIND ───────────────────────────────────────────
 *
 * Kittet sagde indtil i dag at grafer hørte i en app: «reglerne står i
 * fundament/09-dataviz; kittet leverer skalaen og skraveringen, som grafen
 * bygges af.» Det var forkert, og fejlen er den samme som gav 568 fremmede
 * farveværdier: leverer man ingredienser og ikke retten, laver hvert køkken
 * sin egen ret.
 *
 * §09 har reglerne. `byg-dataviz.py` har fire eksempler. Der var bare intet
 * en app kunne hente — og et dashboard tegner grafer på dag ét.
 *
 * ─── HVORFOR DET IKKE ER EN DUBLET AF byg-dataviz.py ───────────────────────
 *
 * Gravuren er skrevet to gange (Python og TypeScript) og holdes i takt af
 * `proev-aekvivalens.py`, fordi den SAMME plade skal se ens ud i tryk og i
 * produkt. En graf er ikke sådan: dataene er andre, bredden er en andens, og
 * højden kommer af beholderen. Der er ingen geometri at holde identisk.
 *
 * `byg-dataviz.py` tegner PRØVEARKET til §09. Denne fil er den udgave apps
 * bruger. De to skal ligne hinanden som familie, ikke som kopi — og det der
 * binder dem, er ikke en ækvivalensprøve, men de ti regler. Dem prøver
 * `selvtest.html` komponenten på.
 *
 * ─── DE TI REGLER, OG HVOR DE STÅR I FILEN ─────────────────────────────────
 *
 *  1 nullinjen obligatorisk ved negative      → `.graf-felt[data-nul]::after`
 *  2 penge ud er neutral, ikke rød            → `.graf-stroem .ned .stang`
 *  3 én serie får ingen farve                 → `--stang: var(--tekst)`
 *  4 kategorier bærer farve OG skravering     → `.andel-del > .kode`
 *  5 højst seks kategorier                    → `--serie-1…6`, se selvtest
 *  6 aksen er en delt skala, ikke et gitter   → `.graf-akse`
 *  7 ingen gravure i en graf                  → intet `.gravure*` her
 *  8 tal i mono, tabulære, negative med ÷     → `.graf-tal`
 *  9 en tom graf beholder sin akse            → `.tom-graf` i sejr-tom.css
 * 10 et beløb animerer aldrig sin værdi       → `.stang` animerer HØJDEN
 *
 * ─── FIRE TYPER, OG DER ER IKKE FLERE ──────────────────────────────────────
 *
 *   søjler   én størrelse over tid
 *   strøm    penge ind mod penge ud. To retninger, ikke kategorier
 *   andel    kategorier der summer til en helhed. Højst seks
 *   tom      ingen data. Det er også en tilstand, og den tegnes
 *
 * Har du brug for en femte, er spørgsmålet næsten altid stillet forkert. Et
 * cirkeldiagram findes ikke her: det beder øjet om at sammenligne vinkler,
 * og det kan øjet ikke.
 */

.graf {
  --graf-h: 120px;      /* feltets højde, ikke hele grafens */
  --graf-n: 6;          /* antal søjler — aksen deler sig efter det */
  --top: 1;             /* største positive værdi */
  --bund: 0;            /* største negative værdi, som positivt tal */
  --stang: var(--tekst);
  --stang-b: 56px;      /* størstebredde på én søjle — se `.stang` */

  display: flex;
  flex-direction: column;
  gap: var(--rum-4);
}

.graf-hoved {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--rum-4);
  font-size: var(--fs-body-s);
  color: var(--tekst-2);
}

/* Regel 8. Samme lov som overalt: mono, tabulære cifre, skråstreget nul.
   `÷` FOR NEGATIVE BELØB — ET VALG, IKKE EN REGEL.

   Her stod «dansk bogholderitradition», og det var sagt for skråsikkert.
   Efterprøvet 23. august 2026, fordi nogen spurgte «er du sikker?»:

   TRADITIONEN FINDES. `÷` blev virkelig brugt som minustegn i Danmark og
   Norge. Wikipedias artikel om obelus siger det ligeud — brugen fortsatte
   «in some parts of Europe (including Norway and, until fairly recently,
   Denmark)».

   REGLEN FINDES IKKE. Der er ingen bestemmelse i bogføringsloven eller
   årsregnskabsloven om hvilket tegn et negativt tal sættes med. Dansk
   regnskabspraksis bruger minus eller parentes; parentes er ligefrem den
   indstilling regnskabsprogrammer tilbyder. Og «until fairly recently»
   betyder at `÷` er på vej UD i Danmark, ikke at det er standarden.

   SEJR VÆLGER `÷` ALLIGEVEL, og af den grund resten af huset er bygget på:
   det er den danske pengeform, ikke den internationale. Samme valg som
   guillochen og kroneseddel-pladerne. Men det står som et VALG med et navn
   på, ikke som en regel man overholder.

   OG DET KOSTER NOGET, SÅ PRISEN BETALES. En skærmlæser udtaler `÷` som
   «divided by». Et fortegn er en oplysning, ikke en dekoration — så
   glyffen er PRÆSENTATION, og ordet «minus» skal stå i markup ved siden af
   den. Et beløb der læses op som «divided by 186.000 kroner» er ikke et
   beløb, det er et regnestykke.

   Tegnet sættes i markup, ikke af CSS — af samme grund. */
.graf-tal {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums slashed-zero;
  color: var(--tekst);
}

/* ══ SØJLER ═════════════════════════════════════════════════════════════════
   Feltet er et gitter med én kolonne pr. søjle. Højden kommer af `--graf-h`
   og ikke af indholdet, så to grafer ved siden af hinanden kan sammenlignes. */
.graf-felt {
  position: relative;
  height: var(--graf-h);
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  gap: var(--rum-3);
}

.soejle {
  display: flex;
  flex-direction: column;
  height: 100%;
}

/* Feltet deles i to efter forholdet mellem største positive og største
   negative værdi. Er der ingen negative, er `--bund` 0, og den nederste
   halvdel bliver 0 % høj — altså væk, uden en undtagelse i CSS. */
.soejle-op {
  height: calc(var(--top) / (var(--top) + var(--bund)) * 100%);
  display: flex;
  align-items: flex-end;
}
.soejle-ned {
  height: calc(var(--bund) / (var(--top) + var(--bund)) * 100%);
  display: flex;
  align-items: flex-start;
}

/* EN SØJLE HAR EN STØRSTEBREDDE, og den fandtes ikke før 23. august 2026.
   Feltet er `grid-auto-columns: 1fr`, så søjlerne deler bredden ligeligt.
   I kittets eget prøveark stod seks søjler på ~350 px og blev ~50 px brede,
   og det så rigtigt ud. Målt i HQ's Finance-vindue: otte søjler på 1.300 px
   blev 160 px brede — og med `--rum-3` imellem sig stødte de sammen til ét
   sort bånd. Nullinjen forsvandt bag dem, og regel 1 var dermed brudt af
   geometri frem for af en manglende regel.

   Det er ikke Finances fejl at rette. Denne fil siger selv i sit hoved
   hvorfor grafen flyttede herind: «leverer man ingredienser og ikke retten,
   laver hvert køkken sin egen ret.» En størstebredde er en del af retten.

   56 px er ikke smag: det er den bredde prøvearket allerede tegnede med, og
   det eneste tal der ikke ændrer hvordan kittets egne eksempler ser ud. */
.stang {
  position: relative;
  width: 100%;
  max-width: var(--stang-b);
  margin-inline: auto;
  background: var(--stang);
  /* Regel 10. Søjlen må tegne sig selv ÉN gang ved ankomst — det er højden
     der animerer. Tallet ved siden af skifter i ét spring, for et tal der
     tæller op viser et beløb der ikke er sandt hele vejen op. */
  transition: height var(--overgang-ind);
}
.soejle-op  .stang { border-radius: 2px 2px 0 0; }
.soejle-ned .stang { border-radius: 0 0 2px 2px; }

/* `max()` gør fortegnet til geometri uden en gren i CSS: den positive del er
   0 når værdien er negativ, og omvendt. `--v` er den rå værdi, med fortegn. */
.soejle-op  .stang { height: calc(max(0, var(--v)) / var(--top) * 100%); }
.soejle-ned .stang { height: calc(max(0, -1 * var(--v)) / var(--bund) * 100%); }

/* Regel 1. NULLINJEN ER OBLIGATORISK når bare én værdi er negativ. Uden den
   læses en negativ søjle som en kort positiv, og det er den værste fejl en
   økonomisk graf kan lave.

   Den tegnes KRAFTIGERE end skalaen: fuld `--tekst` mod skalaens .30. */
.graf-felt[data-nul]::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: calc(var(--bund) / (var(--top) + var(--bund)) * 100%);
  height: 1px;
  background: var(--tekst);
  pointer-events: none;
}

/* Regel 6. Aksen er en DELT SKALA, ikke et gitter: et fuldt gitter lægger
   streger hen over dataene, en skala står ved siden af og lader fladen være.
   Delingen følger søjlerne — en hovedstregning ved hver kolonne, fem små
   imellem — så stregningen står dér hvor tallet står. */
.graf-akse {
  --skala-delt: calc(100% / (var(--graf-n) * 5));
}

.graf-mrkr {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  gap: var(--rum-3);
  margin-top: var(--rum-2);
}
.graf-mrk {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--tekst-3);
  text-align: center;
}

/* ── strøm: penge ind mod penge ud ─────────────────────────────────────────
   To retninger, ikke kategorier. Derfor deler den mekanik med søjlerne og
   har ikke sin egen.

   REGEL 2: PENGE UD ER NEUTRAL, IKKE RØD. Rød er forbeholdt noget der er
   gået galt. En måned med underskud er ikke en fejl, og `--money-out` er
   neutral med vilje.

   Regel 4 gælder også her, og §09's tabel siger hvordan: `--money-in` bærer
   `diagonal`, `--money-out` bærer `blank`. Ind har altså en skravering, ud
   har ingen — og det er selv en forskel man kan se i gråtone. */
.graf-stroem .soejle-op  .stang { background: var(--money-in); }
.graf-stroem .soejle-ned .stang { background: var(--money-out); }

/* Skraveringen oven på en fyldt søjle, i grundens farve — samme greb som i
   måleren, så en flade og en søjle ikke bærer koden på to måder. */
.stang > .kode {
  position: absolute;
  inset: 0;
  width: auto;
  height: auto;
  border-radius: inherit;
  color: var(--flade);
  opacity: .45;
}

/* ══ ANDEL ══════════════════════════════════════════════════════════════════
   Kategorier der summer til en helhed. `--d` er andelen i procent.

   REGEL 5: HØJST SEKS. Paletten har seks seriefarver der er målt mod
   hinanden under alle fire synstyper. Er der flere i dataene, samles halen
   som «Øvrige» — en syvende farve ville være valgt på smag, ikke målt. */
.andel {
  display: flex;
  height: var(--rum-6);
  border-radius: var(--hjorne-1);
  overflow: hidden;
}
.andel-del {
  position: relative;
  width: calc(var(--d) * 1%);
  background: var(--farve, var(--tekst));
}

/* Regel 4. KATEGORIER BÆRER FARVE OG SKRAVERING. `--fn-success` og
   `--fn-info` ligger 4,5 ΔE fra hinanden under tritanopi; to serier kan
   altså være den samme farve for nogen. En skravering er ikke en farve —
   den overlever dikromasi, gråtone, en fotokopi og en fax. */
.andel-del > .kode {
  position: absolute;
  inset: 0;
  width: auto;
  height: auto;
  border-radius: 0;
  color: var(--flade);
  opacity: .42;
}

/* Signaturen. Prøven på om koblingen holder: mærket i signaturen skal bære
   SAMME farve og SAMME skravering som sit felt, og ordet står ved siden af.
   Tre bærere af den samme besked. */
.graf-tegn {
  display: flex;
  flex-wrap: wrap;
  gap: var(--rum-3) var(--rum-6);
  margin: 0;
  padding: 0;
  list-style: none;
  font-size: var(--fs-body-s);
}
.graf-tegn li {
  display: flex;
  align-items: center;
  gap: var(--rum-3);
  color: var(--tekst-2);
}
.graf-tegn .kode {
  color: var(--farve, var(--tekst));
  /* Rammen gør et lyst felt synligt på papir uden at lægge en farve til. */
  box-shadow: inset 0 0 0 1px color-mix(in srgb, currentColor 55%, transparent);
}
.graf-tegn .graf-tal { color: var(--tekst); }

/* ══ EN SERIE FÅR INGEN FARVE ═══════════════════════════════════════════════
   Regel 3, skrevet som standard frem for som en note: `--stang` er
   `--tekst`, altså ink på papir og papir på ink. Der er intet at skelne
   FRA i en enkelt serie, og en farve uden et valg bag sig er dekoration.

   Skal en søjlegraf alligevel farves — fordi den skal genkendes et andet
   sted — sættes `--stang` eksplicit, og så følger skraveringen med. */

/* ══ REGEL 7: INGEN GRAVURE I EN GRAF ═══════════════════════════════════════
   Ikke bag søjlerne, ikke som grund. Det er ikke en regel om betydning, men
   om læsbarhed: en handelsdrivende der stemmer sine bøger klokken 23 skal
   ikke læse gennem en tekstur.

   Der er derfor ingen `.gravure`-klasse i denne fil, og der må ikke sættes
   en indeni en `.graf`. Skalaen er en KANT under feltet — ikke en grund. */
.graf .gravure,
.graf [class*="gravure-"] {
  display: none !important;
}

/* ── tæthed ──────────────────────────────────────────────────────────────── */
[data-taethed="kompakt"] .graf,
.taethed-kompakt .graf { --graf-h: 88px; }
[data-taethed="beroring"] .graf,
.taethed-beroring .graf { --graf-h: 148px; --stang-b: 72px; }



/* ─── kits/ui/03-komponenter/sejr-tabel.css ─── */
/* SEJR UI — tabeller.
 *
 * Det her er den vigtigste komponent i systemet. En handelsdrivende sidder i
 * en tabel i otte timer; alt andet er noget man kigger på undervejs.
 *
 * TRE REGLER, OG DE ER ALLE SAMMEN OM TAL:
 *
 * 1. TAL STÅR TIL HØJRE. Så flugter enerne under enerne, tierne under
 *    tierne, og øjet kan sammenligne to beløb uden at læse dem.
 *
 * 2. TAL STÅR I MONO MED tnum. Uden det skifter cifrene bredde mellem to
 *    opdateringer, og kolonnen hopper mens man læser den.
 *
 * 3. RÆKKEHØJDEN KOMMER FRA TÆTHEDEN, ikke fra indholdet. En tabel hvor
 *    rækkerne har forskellig højde kan ikke skimmes.
 */

.tabel-ramme {
  /* Vandret rul hører til HER, ikke på siden. En tabel der skubber hele
     dokumentet sidelæns er en fejl, ikke et layout. */
  overflow-x: auto;
  border-radius: var(--hjorne-4);
  border: 1px solid var(--kant);
  background: var(--flade-2);
}

.tabel {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--fs-body-s);
}

.tabel thead th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--flade-2);

  text-align: left;
  /* V4: hovedet taler registratur — mono, som feltets etiket og
     noegletallets. Én stemme for alle etiketter i systemet. */
  font-family: var(--font-mono);
  font-size: var(--fs-meta);        /* 11px — gulvet. Kun til overskrifter. */
  font-weight: var(--fw-regular, 400);
  letter-spacing: .07em;
  text-transform: uppercase;
  color: var(--tekst-3);

  padding: var(--rum-3) var(--rum-4);
  border-bottom: 1px solid var(--kant-staerk);
  white-space: nowrap;
}

.tabel tbody td {
  height: var(--raekke-h);
  padding: 0 var(--rum-4);
  border-bottom: 1px solid var(--kant);
  color: var(--tekst);
  vertical-align: middle;
}

.tabel tbody tr:last-child td { border-bottom: none; }
.tabel tbody tr:hover td { background: var(--flade-hover); }

/* Talkolonner. Sæt .tal på BÅDE th og td, ellers står overskriften ikke over
   sine egne tal. */
.tabel .tal {
  text-align: right;
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums slashed-zero;
}
.tabel thead th.tal { text-align: right; }

/* Sekundær information i en celle — kontonummer under navnet, dato under
   posteringen. Må aldrig være det eneste sted en vigtig oplysning står. */
.tabel .under {
  display: block;
  font-size: var(--fs-meta);
  color: var(--tekst-3);
  margin-top: 2px;
}

/* Retning på et beløb. Ind er grøn; ud er neutral blæk — penge der forlader
   kontoen er ikke en fejl. Fortegnet gør arbejdet, farven bekræfter. */
.tabel .ind { color: var(--money-in); }
.tabel .ud  { color: var(--tekst); }

/* Markeret række — valgt, ikke fremhævet af systemet. */
.tabel tbody tr[aria-selected="true"] td { background: var(--fn-info-flade); }

/* En række der kan klikkes skal se ud som om den kan klikkes. */
.tabel tbody tr[data-klikbar] { cursor: pointer; }

/* Tom tilstand. Siger hvad man kan gøre, ikke bare at der ikke er noget. */
.tabel-tom {
  padding: var(--rum-10) var(--rum-6);
  text-align: center;
  color: var(--tekst-2);
  font-size: var(--fs-body-s);
}

/* I kompakt tæthed strammes polstringen med; rækkehøjden klarer --raekke-h
   allerede selv. */
[data-taethed="kompakt"] .tabel tbody td,
.taethed-kompakt .tabel tbody td { padding: 0 var(--rum-3); }



/* ─── kits/ui/03-komponenter/sejr-tom.css ─── */
/* SEJR UI — den tomme tilstand.
 *
 * Skrevet 22. august 2026.
 *
 * ─── HVORFOR SEJR IKKE HAR STREGTEGNINGER ──────────────────────────────────
 *
 * En tom tilstand med en venlig figur, en kasse med et smilende ansigt, en
 * papirflyver — det er et andet firmas sprog, og det ville være det eneste i
 * hele systemet der ikke var målt. Vi har ingen illustrationsstil, og vi skal
 * ikke opfinde én til fire skærme hvor der ikke er sket noget endnu.
 *
 * Til gengæld ligger der tyve plader i fundamentet med BETYDNING i sig, valgt
 * og begrundet i §05. En port er åbenhed. En bro er forbindelse. En krans er
 * det opnåede. Akserne er en flade der endnu ikke har tal i sig. Det er
 * præcis de fire ting en tom tilstand kan handle om.
 *
 * ─── DEN REGEL DER BÆRER DET ───────────────────────────────────────────────
 *
 * PLADEN ER ALDRIG BESKEDEN. Den står over en overskrift og en sætning der
 * siger hvad man gør — og en knap, hvis der er noget at gøre. En bro
 * fortæller ingen at de skal knytte deres bank til kontoen.
 *
 * Det er den samme lov som farve, skravering og gravure lever under:
 * mønstret bekræfter det, ordet allerede har sagt.
 *
 * ─── OG EN TOM GRAF BEHOLDER SIN AKSE ──────────────────────────────────────
 *
 * §09 regel 9. En tom firkant med «ingen data» er en fejl der ligner en fejl.
 * Aksen bliver stående, så det er tydeligt at grafen virker og at der bare
 * ikke er sket noget endnu. Derfor `.tom-graf`, som beholder skalaen.
 */

.tom {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: var(--rum-5);
  padding: var(--rum-11) var(--rum-7);
  max-width: 46ch;
  margin-inline: auto;
}

/* NÅR DEN TOMME TILSTAND *ER* HELE RUDEN.
   Tilføjet 23. august 2026, fundet i HQ's Mail-vindue.

   `.tom` har fast topmargen — rigtigt når den ligger inde i et kort eller
   under en tabel, hvor den skal begynde dér hvor indholdet ville have
   begyndt. Men når den er den eneste ting i en rude på 760 px, hænger den
   i den øverste tredjedel med fem hundrede pixel tomrum under sig. Målt:
   pladen lå på y = 310 i en rude der løb til 1.100.

   En tom tilstand der ikke er centreret, ser ud som om noget mangler
   nedenunder — hvilket er præcis den aflæsning den findes for at undgå.

   `min-height` og ikke `height`: er teksten længere end ruden, skal den
   have lov at vokse og rulle, ikke blive klippet. */
.tom-fyld {
  min-height: 100%;
  justify-content: center;
  padding-block: var(--rum-7);
}

/* Pladen. Dæmpet, fordi den er en baggrund for en sætning og ikke en plakat.
   Bredden er den eneste værdi der sættes — højden følger af pladens eget
   sideforhold, som `sejr-illustration.css` kender. */
/* V4: 0.30 var for beskeden selv for en baggrund — pladerne var naesten
   usynlige paa papir, og en gravure ingen kan se bekraefter ingenting.
   0.55 er maalt som «synlig men rolig»: pladen laeses, saetningen vinder. */
.tom .gravure {
  width: 164px;
  opacity: .55;
}

.tom-titel {
  font-size: var(--fs-title);
  font-weight: var(--fw-medium);
  line-height: var(--lh-title);
  letter-spacing: var(--spor-titel);
  color: var(--tekst);
  margin: 0;
}

/* Sætningen siger hvad man GØR, ikke bare at der ikke er noget. «Der er
   ingen posteringer» er en konstatering; «Din første afregning lander
   dagen efter dit første salg» er en besked. */
.tom-tekst {
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  color: var(--tekst-2);
  margin: 0;
}

.tom-handling {
  display: flex;
  gap: var(--rum-3);
  margin-top: var(--rum-2);
}

/* Tæt udgave — inde i et kort eller en tabel, hvor der ikke er en halv
   skærm at give væk. */
.tom-taet {
  padding: var(--rum-8) var(--rum-6);
  gap: var(--rum-4);
}
.tom-taet .gravure { width: 84px; }
.tom-taet .tom-titel { font-size: var(--fs-lead); }

/* ---- den tomme graf ------------------------------------------------------
   Aksen bliver stående. Læg `.skala` under, og sætningen ovenpå. */
.tom-graf {
  display: flex;
  flex-direction: column;
  gap: var(--rum-4);
}
.tom-graf .tom {
  padding: var(--rum-8) var(--rum-6) var(--rum-5);
}



/* ─── kits/ui/03-komponenter/sejr-lag.css ─── */
/* SEJR UI — lagene: dialog, popover, værktøjstip, menu.
 *
 * Skrevet 2. september 2026.
 *
 * ─── OPFØRSLEN ER BASE UI'S, UDSEENDET ER HUSETS ───────────────────────────
 *
 * Et lag er det sværeste at få rigtigt: fokusfælde, Escape, klik udenfor,
 * skærmlæser-annoncering, at det kommer OVEN PÅ og ikke UNDER. Det er
 * løst én gang, ordentligt, i Base UI (MIT, af de folk der byggede Radix),
 * og det er dét vi stjæler — opførslen. Udseendet stjæler vi ikke: Base UI
 * har intet udseende. Det er hele grunden til at det er valgt.
 *
 * Base UI sætter data-attributter i stedet for klasser. Vi styler dem:
 *
 *   [data-open]            laget er åbent
 *   [data-starting-style]  første frame — animér HERFRA
 *   [data-ending-style]    sidste frame — animér HERTIL
 *   [data-highlighted]     menupunktet under markøren
 *   [data-side="top"]      hvilken side et popover landede på
 *
 * Så ind- og udtoning er ren CSS på §07's kurver, og React-laget skal ikke
 * vide noget om timing. Det er samme greb som resten af kittet: laget
 * bærer klasser, CSS'en bærer meningen.
 */

/* ─── Bagtæppet ──────────────────────────────────────────────────────────── */
.lag-bagtaeppe {
  position: fixed;
  inset: 0;
  z-index: 60;
  background: color-mix(in srgb, var(--ink) 38%, transparent);
  backdrop-filter: blur(6px);
  transition: opacity var(--tid-3) var(--ease-std);
}
[data-ground="nat"] .lag-bagtaeppe,
.nat .lag-bagtaeppe {
  background: color-mix(in srgb, var(--ink) 62%, transparent);
}
.lag-bagtaeppe[data-starting-style],
.lag-bagtaeppe[data-ending-style] {
  opacity: 0;
}

/* ─── Dialogen ───────────────────────────────────────────────────────────── */
.dialog {
  position: fixed;
  inset-inline: 0;
  top: 50%;
  z-index: 61;
  margin-inline: auto;
  inline-size: min(calc(100% - 2 * var(--rum-5)), var(--dialog-bredde, 34rem));
  max-block-size: calc(100dvh - 2 * var(--rum-5));
  overflow: auto;
  translate: 0 -50%;
  padding: var(--rum-6);
  border-radius: var(--hjorne-5);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant-lyst);
  box-shadow: var(--loft-4);
  color: var(--tekst);
  transition:
    opacity   var(--tid-3) var(--ease-ud),
    translate var(--tid-3) var(--ease-ud),
    scale     var(--tid-3) var(--ease-ud);
}
.dialog[data-starting-style],
.dialog[data-ending-style] {
  opacity: 0;
  scale: .97;
  translate: 0 calc(-50% + 8px);
}
.dialog[data-ending-style] {
  transition-duration: var(--tid-2);
  transition-timing-function: var(--ease-ind);
}
.dialog-titel {
  font-family: var(--font-breit);
  font-size: var(--fs-h3);
  font-weight: 600;
  letter-spacing: -.02em;
  margin: 0 0 var(--rum-2);
}
.dialog-tekst {
  color: var(--tekst-2);
  margin: 0 0 var(--rum-5);
}
.dialog-fod {
  display: flex;
  justify-content: flex-end;
  gap: var(--rum-3);
  margin-block-start: var(--rum-5);
}
.dialog-luk {
  position: absolute;
  top: var(--rum-4);
  right: var(--rum-4);
}

/* Arket — dialogen der kommer fra kanten, til det der er en side i sig selv. */
.ark-lag {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 61;
  inline-size: min(100%, var(--ark-bredde, 28rem));
  overflow: auto;
  padding: var(--rum-6);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border-inline-start: 1px solid var(--kant-lyst);
  box-shadow: var(--loft-4);
  transition: translate var(--tid-3) var(--ease-ud);
}
.ark-lag[data-starting-style],
.ark-lag[data-ending-style] {
  translate: 100% 0;
}

/* ─── Popover og menu ────────────────────────────────────────────────────── */
.popover,
.menu {
  z-index: 62;
  min-inline-size: 12rem;
  padding: var(--rum-2);
  border-radius: var(--hjorne-4);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant-lyst);
  box-shadow: var(--loft-3);
  color: var(--tekst);
  transform-origin: var(--transform-origin);
  transition:
    opacity var(--tid-2) var(--ease-ud),
    scale   var(--tid-2) var(--ease-ud);
}
.popover[data-starting-style],
.popover[data-ending-style],
.menu[data-starting-style],
.menu[data-ending-style] {
  opacity: 0;
  scale: .96;
}
.popover { padding: var(--rum-4); }

.menu-punkt {
  display: flex;
  align-items: center;
  gap: var(--rum-3);
  inline-size: 100%;
  padding: var(--rum-2) var(--rum-3);
  border-radius: var(--hjorne-3);
  font: inherit;
  color: var(--tekst);
  background: none;
  border: 0;
  text-align: start;
  cursor: default;
  outline: none;
  transition: background var(--tid-1) var(--ease-std);
}
.menu-punkt[data-highlighted] {
  background: var(--flade-hover);
}
.menu-punkt[data-disabled] {
  color: var(--tekst-3);
}
.menu-punkt.er-farlig[data-highlighted] {
  background: color-mix(in srgb, var(--fn-danger) 10%, transparent);
  color: var(--fn-danger);
}
.menu-streg {
  block-size: 1px;
  margin: var(--rum-2) calc(-1 * var(--rum-2));
  background: var(--kant);
}
.menu-gruppe {
  padding: var(--rum-2) var(--rum-3) var(--rum-1);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--tekst-3);
}

/* ─── Værktøjstippet ─────────────────────────────────────────────────────── */
.tip {
  z-index: 63;
  max-inline-size: 28ch;
  padding: var(--rum-2) var(--rum-3);
  border-radius: var(--hjorne-3);
  background: var(--ink);
  color: var(--paper);
  font-size: var(--fs-body-s);
  line-height: 1.4;
  box-shadow: var(--loft-2);
  transform-origin: var(--transform-origin);
  transition:
    opacity var(--tid-1) var(--ease-std),
    scale   var(--tid-1) var(--ease-std);
}
[data-ground="nat"] .tip,
.nat .tip {
  background: var(--flade-3);
  color: var(--tekst);
  border: 1px solid var(--kant-lyst);
}
.tip[data-starting-style],
.tip[data-ending-style] {
  opacity: 0;
  scale: .94;
}

@media (prefers-reduced-motion: reduce) {
  .lag-bagtaeppe, .dialog, .ark-lag, .popover, .menu, .tip {
    transition-duration: 1ms;
  }
}

       /* dialog, popover, tip, menu — på Base UI */

/* ─── kits/ui/03-komponenter/sejr-faneblade.css ─── */
/* SEJR UI — fanebladene.
 *
 * Skrevet 2. september 2026. Opførslen er Base UI's Tabs — piletaster,
 * roving tabindex, aria-selected. Udseendet er husets: en række navne på
 * en streg, og ét crimson-mærke under det valgte.
 *
 * Mærket GLIDER mellem fanerne i stedet for at hoppe. Base UI giver
 * `--active-tab-left` og `--active-tab-width` på indikatoren, så CSS'en
 * kan flytte den uden at React måler noget.
 */

.faneblade {
  display: flex;
  flex-direction: column;
  gap: var(--rum-5);
}
.faneblade-liste {
  position: relative;
  display: flex;
  gap: var(--rum-5);
  border-block-end: 1px solid var(--kant);
  overflow-x: auto;
  scrollbar-width: none;
}
.faneblade-liste::-webkit-scrollbar { display: none; }

.fane {
  flex: none;
  padding: var(--rum-3) 0 var(--rum-3);
  border: 0;
  background: none;
  font: inherit;
  font-weight: 500;
  color: var(--tekst-2);
  cursor: pointer;
  outline: none;
  white-space: nowrap;
  transition: color var(--tid-1) var(--ease-std);
}
.fane:hover { color: var(--tekst); }
.fane[data-active] { color: var(--tekst); }
.fane:focus-visible {
  box-shadow: 0 0 0 2px var(--fokus-ring);
  border-radius: var(--hjorne-2);
}
.fane[data-disabled] { color: var(--tekst-3); cursor: default; }

/* Tal i fanen — «Kunder 11». Mono, dæmpet, aldrig fed. */
.fane-tal {
  margin-inline-start: var(--rum-2);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--tekst-3);
  font-variant-numeric: tabular-nums;
}

/* Indikatoren: crimson, to pixel, glider. */
.fane-maerke {
  position: absolute;
  bottom: -1px;
  left: 0;
  block-size: 2px;
  inline-size: var(--active-tab-width, 0);
  translate: var(--active-tab-left, 0) 0;
  background: var(--crimson);
  border-radius: 1px;
  transition:
    translate    var(--tid-3) var(--ease-ud),
    inline-size  var(--tid-3) var(--ease-ud);
}

.fane-indhold {
  outline: none;
}
.fane-indhold[data-starting-style] {
  opacity: 0;
  translate: 0 4px;
}
.fane-indhold {
  transition:
    opacity   var(--tid-2) var(--ease-ud),
    translate var(--tid-2) var(--ease-ud);
}

@media (prefers-reduced-motion: reduce) {
  .fane, .fane-maerke, .fane-indhold { transition: none; }
}

 /* faneblade — på Base UI */

/* ─── kits/ui/03-komponenter/sejr-ceremoni.css ─── */
/* SEJR UI — ceremonien: tælleren, stemplet, kransen, milepælen.
 *
 * Skrevet 2. september 2026, den dag «én gang, og så er den væk igen» blev
 * til et SYSTEM.
 *
 * ─── HVAD DER ÆNDREDE SIG ──────────────────────────────────────────────────
 *
 * §Sejrsfølelsen sagde: ceremoni, sjældent nok til at betyde noget. Det
 * holder stadig som TONE — men det var blevet til en undskyldning for ikke
 * at bygge den overhovedet. Der var ingen komponent til at fejre noget, og
 * så blev intet fejret. Nu er der fire, og de deler ét sprog:
 *
 *   tælleren     tallet der tæller op til det det er. Beløbet er påstanden.
 *   stemplet     seglet der lander på opgørelsen — med lyden `afregnet`.
 *   kransen      laurbærret der folder sig ud. Trinnet, den første kunde.
 *   milepælen    kortet der siger HVAD der skete, og hvornår.
 *
 * ─── LYD OG BEVÆGELSE DELER TAL ────────────────────────────────────────────
 *
 * §07's fire varigheder er §11's fire lyde: 120, 180, 240, 320 ms. Det er
 * ikke et tilfælde, det er målt ud af lydfilerne. Så stemplet lander på
 * `--tid-4` = 320 ms = `sejr-afregnet.wav`, og øjet og øret er enige om
 * hvornår det skete. En ceremoni der SES før den HØRES, er to hændelser.
 *
 * Tælleren er den ene undtagelse: et beløb der tælles op på 320 ms, er et
 * lotteri. 900 ms lader øjet følge med, og kurven er `--ease-ud`, så det
 * bremser ind i det rigtige tal i stedet for at ramme det.
 */

/* ─── Tælleren ───────────────────────────────────────────────────────────── */
.taeller {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}
.taeller-vaerdi {
  display: inline-block;
  min-inline-size: 1ch;
}
/* Cifrene glider på plads, ikke ind fra siden: en indtægt kommer ikke fra
   venstre, den kommer FREM. */
.taeller.er-i-gang .taeller-vaerdi {
  animation: taeller-frem var(--tid-3) var(--ease-ud) backwards;
}
@keyframes taeller-frem {
  from { opacity: .35; transform: translateY(.12em); filter: blur(1px); }
  to   { opacity: 1;   transform: none;               filter: none; }
}

/* ─── Stemplet ───────────────────────────────────────────────────────────── */
.stempel {
  position: relative;
  display: inline-grid;
  place-items: center;
  --stempel-str: 72px;
  inline-size: var(--stempel-str);
  block-size: var(--stempel-str);
}
.stempel .segl {
  --segl-str: var(--stempel-str);
}
/* Landingen. Kommer fra 1,6× og 0 opacitet, rammer ved 320 ms med et lille
   overshoot, og lægger sig. Det er dét øjeblik lyden hører til. */
.stempel.er-sat .segl {
  animation: stempel-land var(--tid-4) var(--ease-ud) both;
}
@keyframes stempel-land {
  0%   { transform: rotate(-8deg) scale(1.6); opacity: 0; }
  70%  { transform: rotate(-8deg) scale(.96); opacity: 1; }
  100% { transform: rotate(-8deg) scale(1);   opacity: .9; }
}
/* Trykket i papiret. En kort ring der udvider sig og forsvinder — spor af
   at noget ramte. */
.stempel.er-sat::after {
  content: "";
  position: absolute;
  inset: 12%;
  border-radius: 50%;
  border: 1.5px solid currentColor;
  color: var(--crimson);
  opacity: 0;
  animation: stempel-tryk var(--tid-4) var(--ease-ud) var(--tid-2) both;
  pointer-events: none;
}
@keyframes stempel-tryk {
  0%   { transform: scale(.6); opacity: .6; }
  100% { transform: scale(1.5); opacity: 0; }
}

/* ─── Kransen ────────────────────────────────────────────────────────────── */
.krans {
  position: relative;
  display: inline-block;
  --krans-str: 120px;
  inline-size: var(--krans-str);
  block-size: var(--krans-str);
  color: var(--tekst);
}
.krans .gravure {
  inline-size: 100%;
  block-size: 100%;
  opacity: .85;
}
/* Folder sig ud fra midten: to halvdele der åbner som et laurbær gør. */
.krans.er-vist .gravure {
  animation: krans-fold var(--tid-4) var(--ease-ud) both;
}
@keyframes krans-fold {
  from { clip-path: inset(0 50% 0 50%); opacity: 0; transform: scale(.92); }
  to   { clip-path: inset(0 0 0 0);     opacity: .85; transform: none; }
}

/* ─── Milepælen ──────────────────────────────────────────────────────────── */
.milepael {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--rum-4);
  align-items: center;
  padding: var(--rum-5) var(--rum-5);
  border-radius: var(--hjorne-4);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant);
  box-shadow: var(--loft-1);
}
.milepael-figur {
  inline-size: 56px;
  block-size: 56px;
  display: grid;
  place-items: center;
  color: var(--tekst-2);
}
.milepael-figur { overflow: hidden; }
/* Pladen fylder bredden, og højden følger dens eget format: en bred
   plade (instrumentet, 320×108) blev ellers 166 px bred i en 56 px-figur
   og lå hen over teksten — set i mockuppen 6. september 2026. */
.milepael-figur .gravure {
  inline-size: 100%;
  block-size: auto;
  max-block-size: 100%;
  /* Pladens grundopacitet (0,38) er tegnet til en tom tilstand på 200 px.
     På 44 px bliver den til en grå plet; her skal den kunne læses. */
  opacity: .9;
  color: var(--tekst);
}
.milepael-hvad {
  font-weight: 600;
  color: var(--tekst);
  letter-spacing: -.01em;
}
.milepael-hvornaar {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--tekst-3);
  margin-block-start: .15rem;
}
/* Den nyeste milepæl gløder crimson — én ad gangen. */
/* Den nyeste sejr står på husets flade, porcelæn, ikke i en crimson ramme.
   Rettet 14. september 2026: crimson er handlingen, og en sejr er ikke en
   handling. Med rammen stod der tre crimson ting på hjem (knappen,
   ceremonien, milepælen), og «ét crimson-signal pr. skærm» var brudt af
   kittet selv. Tekstrollerne følger med fra .flade-hus. */
.milepael.er-ny {
  background-color: var(--flade-hus);
  background-image: var(--lysfald);
  border-color: transparent;
  box-shadow: none;
  color: var(--tekst-hus);
  --tekst:   var(--tekst-hus);
  --tekst-2: color-mix(in srgb, var(--tekst-hus) 78%, var(--flade-hus));
}
.milepael.er-ny .milepael-figur,
.milepael.er-ny .milepael-figur .gravure { color: var(--tekst-hus); }

/* ─── Ceremonien ─────────────────────────────────────────────────────────────
   Beholderen der viser stempel + tæller + tekst ÉN gang for én hændelse. Den
   ligger inde i fladen, ikke som et overlay: en ceremoni der dækker skærmen,
   spærrer for arbejdet, og arbejdet er dét den fejrer. */
.ceremoni {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: var(--rum-5);
  align-items: center;
  padding: var(--rum-6);
  border-radius: var(--hjorne-5);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid color-mix(in srgb, var(--crimson) 35%, var(--kant));
  box-shadow: var(--loft-2);
  animation: fade-op var(--tid-3) var(--ease-ud) both;
}
.ceremoni-etiket {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--tekst-3);
}
.ceremoni-belob {
  font-family: var(--font-breit);
  font-size: clamp(1.8rem, 3vw, 2.6rem);
  font-weight: 600;
  letter-spacing: -.03em;
  line-height: 1;
  color: var(--tekst);
  margin-block: .2rem .35rem;
}
.ceremoni-tekst {
  color: var(--tekst-2);
  max-inline-size: 44ch;
}
.ceremoni-luk {
  grid-column: 3;
  align-self: start;
  justify-self: end;
  align-self: start;
}
@keyframes fade-op {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .taeller.er-i-gang .taeller-vaerdi,
  .stempel.er-sat .segl,
  .stempel.er-sat::after,
  .krans.er-vist .gravure,
  .ceremoni {
    animation: none;
  }
  .stempel.er-sat::after { display: none; }
}

  /* tælleren, stemplet, kransen, milepælen */

/* ─── kits/ui/03-komponenter/sejr-besked.css ─── */
/* SEJR UI — beskederne.
 *
 * Fire måder at sige noget på, i stigende vægt:
 *
 *   besked   kommer og går. Nederst til højre, forsvinder selv. «Gemt.»
 *            Aldrig noget man SKAL læse — det der skal læses, står i fladen.
 *   notits   står i fladen, ved det den handler om. «Kontoen mangler IBAN.»
 *   banner   øverst, hele bredden, indtil nogen lukker den. Ét ad gangen.
 *            «Worldline afregner først den 6.»
 *   fejlside hele skærmen. Der er ikke noget andet at vise.
 *
 * Alle fire bærer tilstanden tre gange (§02): ordet, farven, skraveringen.
 * Farven er `--fn-*`, skraveringen er `.kode-*` fra sejr-skravering.css.
 * Rød er fejl, ikke «penge ud» — en måned med underskud er en notits i
 * neutral, aldrig i fejl.
 */

/* ---- besked (toast) ------------------------------------------------------- */
.besked-omraade {
  position: fixed;
  inset-block-end: var(--rum-6);
  inset-inline-end: var(--rum-6);
  z-index: 70;
  display: flex;
  flex-direction: column;
  gap: var(--rum-3);
  inline-size: min(24rem, calc(100vw - 2 * var(--rum-6)));
}
.besked {
  position: relative;
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: var(--rum-3);
  align-items: start;
  padding: var(--rum-4) var(--rum-4) var(--rum-4) var(--rum-5);
  border-radius: var(--hjorne-4);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant-lyst, var(--kant));
  box-shadow: var(--loft-3);
  color: var(--tekst);
  font-size: var(--fs-body-s);
  transition: opacity var(--tid-3) var(--ease-ud), translate var(--tid-3) var(--ease-ud);
}
.besked[data-starting-style] { opacity: 0; translate: 0 var(--rum-4); }
.besked[data-ending-style]   { opacity: 0; translate: var(--rum-6) 0; transition-duration: var(--tid-2); transition-timing-function: var(--ease-ind); }
/* Stakken: den ældste bag den nyeste, lidt mindre. Base UI sætter
   --toast-index; kittet viser tre og skjuler resten. */
.besked[data-expanded="false"] { pointer-events: none; }
.besked-maerke {
  inline-size: 3px;
  align-self: stretch;
  border-radius: var(--hjorne-1);
  background: var(--tekst-3);
  margin-inline-start: calc(-1 * var(--rum-3));
}
.besked[data-type="ind"]      .besked-maerke { background: var(--fn-success); }
.besked[data-type="advarsel"] .besked-maerke { background: var(--fn-warning); }
.besked[data-type="fejl"]     .besked-maerke { background: var(--fn-danger); }
.besked[data-type="info"]     .besked-maerke { background: var(--fn-info); }
/* Den der venter: buen ved siden af mærket, og mærket i dæmpet tekst. */
.besked-bue { font-size: 16px; color: var(--tekst-2); margin-block-start: 1px; }
.besked[data-type="venter"] { grid-template-columns: auto auto 1fr auto; }
/* Stakken bag den forreste: mindre og lavere, på Base UI's egne tal. */
.besked { z-index: calc(1000 - var(--toast-index, 0)); }
.besked-omraade:not([data-expanded]) .besked[data-behind] {
  scale: calc(1 - var(--toast-index, 0) * .04);
  translate: 0 calc(var(--toast-index, 0) * -6px);
}
.besked-omraade:not([data-expanded]) .besked[data-behind] > * { visibility: hidden; }
.besked-krop { display: grid; gap: var(--rum-1); min-inline-size: 0; }
.besked-titel { font-weight: var(--fw-medium); color: var(--tekst); }
.besked-tekst { color: var(--tekst-2); line-height: 1.4; }
.besked-handling {
  justify-self: start;
  margin-block-start: var(--rum-2);
}
.besked-luk { margin: calc(-1 * var(--rum-2)) calc(-1 * var(--rum-2)) 0 0; }

/* ---- notits (inline) ------------------------------------------------------ */
.notits {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: var(--rum-3);
  align-items: start;
  padding: var(--rum-4) var(--rum-5);
  border-radius: var(--hjorne-4);
  background: var(--flade-2);
  border: 1px solid var(--kant);
  border-inline-start: 3px solid var(--tekst-3);
  color: var(--tekst);
  font-size: var(--fs-body-s);
}
.notits > .ikon { font-size: 16px; margin-block-start: 2px; color: var(--tekst-2); }
.notits > .kode { margin-block-start: 3px; }
.notits-krop { display: grid; gap: var(--rum-1); min-inline-size: 0; }
.notits-titel { font-weight: var(--fw-medium); }
.notits-tekst { color: var(--tekst-2); line-height: 1.45; max-inline-size: var(--maal-brod); }
.notits-handling { margin-block-start: var(--rum-2); display: flex; gap: var(--rum-2); }
.notits-luk { margin: calc(-1 * var(--rum-2)) calc(-1 * var(--rum-3)) 0 0; }
.notits-info     { background: var(--fn-info-flade);    border-inline-start-color: var(--fn-info); }
.notits-succes   { background: var(--fn-success-flade); border-inline-start-color: var(--fn-success); }
.notits-advarsel { background: var(--fn-warning-flade); border-inline-start-color: var(--fn-warning); }
.notits-fejl     { background: var(--fn-danger-flade);  border-inline-start-color: var(--fn-danger); }
.notits-info     > .ikon, .notits-info     > .kode { color: var(--fn-info); }
.notits-succes   > .ikon, .notits-succes   > .kode { color: var(--fn-success); }
.notits-advarsel > .ikon, .notits-advarsel > .kode { color: var(--fn-warning); }
.notits-fejl     > .ikon, .notits-fejl     > .kode { color: var(--fn-danger); }

/* ---- banner --------------------------------------------------------------- */
.banner {
  display: flex;
  align-items: center;
  gap: var(--rum-4);
  padding: var(--rum-3) var(--rum-6);
  background: var(--ink);
  color: var(--paper);
  font-size: var(--fs-body-s);
}
.banner > .ikon { font-size: 16px; flex: none; }
.banner > .kode { flex: none; color: var(--paper); }
.banner-tekst { flex: 1; min-inline-size: 0; }
.banner-tekst strong { font-weight: var(--fw-medium); }
.banner-handling {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: .15em;
  white-space: nowrap;
}
.banner-luk { color: inherit; opacity: .7; }
.banner-luk:hover { opacity: 1; }
/* Advarslen står på advarslens FLADE med en streg i advarslens farve —
   ikke på fuld farve. En hel bjælke i fn-warning blev en mudret stribe
   (målt 5. september 2026), og en advarsel er ikke en alarm. */
.banner-advarsel { background: var(--fn-warning-flade); color: var(--tekst); border-block-end: 1px solid var(--fn-warning); }
.banner-advarsel > .kode { color: var(--fn-warning); }
.banner-fejl { background: var(--fn-danger); color: var(--paper); }
[data-ground="nat"] .banner, .nat .banner { background: var(--flade-3); color: var(--tekst); }

/* ---- fremdrift (progress) ------------------------------------------------- */
/* Noget der er i gang og har en ende: en upload, en import, en
   synkronisering. Ikke en måler — måleren viser en VÆRDI mod et maksimum,
   fremdriften viser tid der går. Tallet i mono, sporet i tekst. */
.fremdrift { display: grid; gap: var(--rum-2); }
.fremdrift-hoved {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--rum-4);
}
.fremdrift-etiket { font-size: var(--fs-body-s); color: var(--tekst-2); }
.fremdrift-vaerdi {
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  font-size: var(--fs-body-s);
  color: var(--tekst);
}
.fremdrift-spor {
  position: relative;
  block-size: 4px;
  border-radius: var(--hjorne-1);
  background: var(--kant);
  overflow: hidden;
}
.fremdrift-udslag {
  block-size: 100%;
  border-radius: inherit;
  background: var(--tekst);
  transition: inline-size var(--tid-3) var(--ease-ud);
}
/* Ubestemt: et stykke der løber. Standser i reduceret bevægelse og bliver
   til en stiplet linje — man kan stadig se at noget er i gang. */
.fremdrift[data-indeterminate] .fremdrift-udslag {
  inline-size: 30%;
  animation: fremdrift-loeb 1.6s var(--ease-std) infinite;
}
@keyframes fremdrift-loeb {
  from { translate: -100% 0; }
  to   { translate: 340% 0; }
}
@media (prefers-reduced-motion: reduce) {
  .fremdrift[data-indeterminate] .fremdrift-udslag {
    animation: none;
    inline-size: 100%;
    background: repeating-linear-gradient(90deg, var(--tekst) 0 6px, transparent 6px 12px);
  }
}
.fremdrift[data-complete] .fremdrift-udslag { background: var(--fn-success); }

/* ---- fejlside ------------------------------------------------------------- */
/* Hele skærmen. Pladen over ordene, som en tom tilstand — og ordene siger
   hvad man gør: gå tilbage, prøv igen, skriv til os. Fejlkoden i mono,
   lille; den er til os, ikke til dem. */
.fejlside {
  min-block-size: 100dvh;
  display: grid;
  place-content: center;
  justify-items: center;
  gap: var(--rum-4);
  padding: var(--rum-10) var(--rum-6);
  text-align: center;
  background: var(--flade);
  color: var(--tekst);
}
.fejlside > .gravure {
  inline-size: min(60vw, 280px);
  aspect-ratio: 300 / 210;
  opacity: .55;
  margin-block-end: var(--rum-4);
}
.fejlside-kode {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
  color: var(--tekst-3);
}
.fejlside-titel {
  font-size: var(--fs-h2);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-titel);
  line-height: 1.12;
  max-inline-size: 22ch;
}
.fejlside-tekst {
  font-size: var(--fs-lead);
  color: var(--tekst-2);
  max-inline-size: var(--maal-kort);
  line-height: 1.5;
}
.fejlside-handlinger {
  display: flex;
  gap: var(--rum-3);
  margin-block-start: var(--rum-4);
}

    /* besked, notits, banner, fremdrift, fejlside */

/* ─── kits/ui/03-komponenter/sejr-navigation.css ─── */
/* SEJR UI — navigationen.
 *
 * Det der får én fra ét sted til et andet, og det der folder ud og ind:
 * brødkrummer, sidetal, trin, kommandopaletten, kontekstmenuen,
 * harmonikaen, sammenfoldet, skuffen, værktøjslinjen, adskilleren og
 * rullen. Opførslen er Base UI's hvor der ER opførsel (harmonika,
 * sammenfold, skuffe, værktøjslinje, rulle, kontekstmenu); resten er
 * markup og aria.
 *
 * Det aktive punkt siges med linjesprogets anker (V4): 2 px i currentColor,
 * som navigationens punkt og fanebladenes mærke. Aldrig med crimson —
 * crimson er en handling, ikke et sted.
 */

/* ---- brødkrummer ---------------------------------------------------------- */
.broedkrummer {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--rum-2);
  margin: 0;
  padding: 0;
  list-style: none;
  font-size: var(--fs-body-s);
  color: var(--tekst-3);
}
.broedkrumme { display: inline-flex; align-items: center; gap: var(--rum-2); }
.broedkrumme > a {
  color: var(--tekst-2);
  text-decoration: none;
  border-radius: var(--hjorne-1);
  transition: color var(--overgang-tilstand);
}
.broedkrumme > a:hover { color: var(--tekst); text-decoration: underline; text-underline-offset: .15em; }
.broedkrumme > a:focus-visible { outline: 2px solid var(--fokus-ring); outline-offset: 2px; }
.broedkrumme[aria-current] { color: var(--tekst); font-weight: var(--fw-medium); }
.broedkrumme-skille { color: var(--dekor); font-size: 12px; }

/* ---- sidetal -------------------------------------------------------------- */
/* Side 2 af 9. Tallet i mono; knapperne er husets stille knapper. Der
   vises højst syv sider, og de manglende er en prik — ikke tre. */
.sidetal {
  display: flex;
  align-items: center;
  gap: var(--rum-2);
}
.sidetal-tekst {
  margin-inline-end: auto;
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  font-variant-numeric: tabular-nums;
  color: var(--tekst-3);
}
.sidetal-knap {
  min-inline-size: var(--kontrol-h);
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
}
.sidetal-knap.er-valgt {
  position: relative;
  color: var(--tekst);
  font-weight: var(--fw-medium);
}
.sidetal-knap.er-valgt::after {
  content: "";
  position: absolute;
  inset-inline: var(--rum-3);
  inset-block-end: 2px;
  block-size: 2px;
  background: currentColor;
}
.sidetal-hul { inline-size: var(--rum-5); text-align: center; color: var(--dekor); }

/* ---- trin (stepper) ------------------------------------------------------- */
/* Hvor langt man er i noget med flere sider: opret dig, bestil, opgør.
   Færdige trin er fyldte, det aktive har ankeret, de kommende er hule.
   Ingen medaljer — et fremdriftsspor, som en professionel læser på ét blik. */
.trin {
  display: flex;
  margin: 0;
  padding: 0;
  list-style: none;
  counter-reset: trin;
}
.trin-punkt {
  position: relative;
  flex: 1;
  display: grid;
  justify-items: center;
  gap: var(--rum-2);
  padding-block-end: var(--rum-3);
  color: var(--tekst-3);
  font-size: var(--fs-body-s);
  text-align: center;
}
.trin-punkt::before {
  content: "";
  position: absolute;
  inset-inline-start: 50%;
  inset-inline-end: -50%;
  inset-block-start: calc(var(--rum-6) / 2);
  block-size: 1px;
  background: var(--kant-staerk);
  translate: 0 -50%;
}
.trin-punkt:last-child::before { display: none; }
.trin-nummer {
  position: relative;
  z-index: 1;
  display: grid;
  place-items: center;
  inline-size: var(--rum-6);
  block-size: var(--rum-6);
  border-radius: var(--hjorne-fuld);
  border: 1px solid var(--kant-staerk);
  background: var(--flade);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--tekst-2);
}
.trin-navn { max-inline-size: 12ch; line-height: 1.25; }
.trin-punkt.er-faerdig { color: var(--tekst-2); }
.trin-punkt.er-faerdig .trin-nummer { background: var(--tekst); border-color: var(--tekst); color: var(--flade); }
.trin-punkt.er-faerdig::before { background: var(--tekst); }
.trin-punkt.er-aktiv { color: var(--tekst); font-weight: var(--fw-medium); }
.trin-punkt.er-aktiv .trin-nummer { border-color: var(--tekst); color: var(--tekst); box-shadow: 0 0 0 3px color-mix(in srgb, var(--tekst) 12%, transparent); }
/* Lodret, til en sidebjælke i en lang formular. */
.trin-lodret { flex-direction: column; }
.trin-lodret .trin-punkt { grid-template-columns: auto 1fr; justify-items: start; text-align: start; padding-block-end: var(--rum-5); }
.trin-lodret .trin-punkt::before { inset-inline: auto; inset-inline-start: calc(var(--rum-6) / 2); inset-block: var(--rum-6) 0; inline-size: 1px; block-size: auto; translate: -50% 0; }
.trin-lodret .trin-navn { max-inline-size: none; }

/* ---- kommandopaletten ----------------------------------------------------- */
/* ⌘K. Ét felt, alt man kan gøre. Kunder, sider, handlinger — grupperet,
   med genvejen til højre i mono. Ligger i en dialog, så fokus og Escape
   er Base UI's. */
.kommandopalet {
  position: fixed;
  inset-inline: 0;
  inset-block-start: 12vh;
  z-index: 61;
  margin-inline: auto;
  inline-size: min(calc(100% - 2 * var(--rum-5)), 38rem);
  max-block-size: 70vh;
  display: grid;
  grid-template-rows: auto 1fr;
  border-radius: var(--hjorne-5);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant-lyst, var(--kant));
  box-shadow: var(--loft-4);
  color: var(--tekst);
  overflow: hidden;
  transition: opacity var(--tid-2) var(--ease-ud), scale var(--tid-2) var(--ease-ud);
}
.kommandopalet[data-starting-style],
.kommandopalet[data-ending-style] { opacity: 0; scale: .98; }
.kommandopalet-felt {
  display: flex;
  align-items: center;
  gap: var(--rum-3);
  padding: var(--rum-3) var(--rum-5);
  border-block-end: 1px solid var(--kant);
}
.kommandopalet-felt > .ikon { color: var(--tekst-3); font-size: 18px; }
.kommandopalet-input {
  flex: 1;
  min-block-size: var(--kontrol-h-m);
  border: 0;
  background: none;
  color: var(--tekst);
  font: inherit;
  font-size: var(--fs-lead);
  outline: none;
}
.kommandopalet-input::placeholder { color: var(--dekor); }
.kommandopalet-liste {
  overflow: auto;
  padding: var(--rum-2);
  margin: 0;
  list-style: none;
}
.kommandopalet-gruppe {
  padding: var(--rum-3) var(--rum-3) var(--rum-1);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-3);
}
.kommandopalet-punkt {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: var(--rum-3);
  padding: var(--rum-2) var(--rum-3);
  min-block-size: var(--kontrol-h);
  border-radius: var(--hjorne-3);
  cursor: default;
  color: var(--tekst);
}
.kommandopalet-punkt > .ikon { color: var(--tekst-3); font-size: 16px; }
.kommandopalet-punkt[aria-selected="true"] { background: var(--flade-hover); }
.kommandopalet-punkt-under { display: block; font-size: var(--fs-body-s); color: var(--tekst-3); }
.kommandopalet-genvej {
  display: inline-flex;
  gap: var(--rum-1);
}
.kommandopalet-genvej kbd,
.tast {
  display: inline-grid;
  place-items: center;
  min-inline-size: 1.6em;
  padding: 0 .4em;
  block-size: 1.6em;
  border-radius: var(--hjorne-1);
  border: 1px solid var(--kant-staerk);
  border-block-end-width: 2px;
  background: var(--flade);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--tekst-2);
}
.kommandopalet-tom {
  padding: var(--rum-8) var(--rum-5);
  text-align: center;
  color: var(--tekst-3);
  font-size: var(--fs-body-s);
}
.kommandopalet-fod {
  display: flex;
  gap: var(--rum-5);
  padding: var(--rum-2) var(--rum-5);
  border-block-start: 1px solid var(--kant);
  font-size: var(--fs-meta);
  color: var(--tekst-3);
}

/* ---- harmonika (accordion) ------------------------------------------------ */
/* Spørgsmål og svar, vilkår i afsnit, en lang indstillingsside. Ét åbent
   ad gangen som standard. Højden animeres på Base UI's egen variabel. */
.harmonika { display: grid; border-block-start: 1px solid var(--kant); }
.harmonika-punkt { border-block-end: 1px solid var(--kant); }
.harmonika-hoved { margin: 0; }
.harmonika-knap {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rum-4);
  inline-size: 100%;
  padding: var(--rum-4) 0;
  border: 0;
  background: none;
  color: var(--tekst);
  font: inherit;
  font-size: var(--fs-body);
  font-weight: var(--fw-medium);
  text-align: start;
  cursor: pointer;
  border-radius: var(--hjorne-2);
}
.harmonika-knap:focus-visible { outline: 2px solid var(--fokus-ring); outline-offset: 2px; }
.harmonika-pil { flex: none; color: var(--tekst-3); transition: transform var(--tid-2) var(--ease-std); }
.harmonika-knap[data-panel-open] .harmonika-pil { transform: rotate(180deg); }
.harmonika-indhold {
  overflow: hidden;
  block-size: var(--accordion-panel-height);
  transition: block-size var(--tid-3) var(--ease-ud);
  color: var(--tekst-2);
  font-size: var(--fs-body);
  line-height: var(--lh-body, 1.5);
}
.harmonika-indhold[data-starting-style],
.harmonika-indhold[data-ending-style] { block-size: 0; }
.harmonika-indhold > * { padding-block-end: var(--rum-5); max-inline-size: var(--maal-brod); }

/* ---- sammenfold (collapsible) --------------------------------------------- */
.sammenfold { display: grid; }
.sammenfold-knap {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-2);
  padding: var(--rum-2) 0;
  border: 0;
  background: none;
  color: var(--tekst-2);
  font: inherit;
  font-size: var(--fs-body-s);
  cursor: pointer;
  border-radius: var(--hjorne-2);
}
.sammenfold-knap:hover { color: var(--tekst); }
.sammenfold-knap:focus-visible { outline: 2px solid var(--fokus-ring); outline-offset: 2px; }
.sammenfold-knap .ikon { transition: transform var(--tid-2) var(--ease-std); }
.sammenfold-knap[data-panel-open] .ikon { transform: rotate(90deg); }
.sammenfold-indhold {
  overflow: hidden;
  block-size: var(--collapsible-panel-height);
  transition: block-size var(--tid-3) var(--ease-ud);
}
.sammenfold-indhold[data-starting-style],
.sammenfold-indhold[data-ending-style] { block-size: 0; }

/* ---- skuffen (drawer) ----------------------------------------------------- */
/* Fra siden på en bred skærm, fra bunden på en smal. Til det der hører
   til én række uden at forlade listen: kundekortet, en postering. Arket
   (`.ark-lag`) er beslutningen; skuffen er detaljen. Swipe er Base UI's. */
.skuffe-lag {
  position: fixed;
  inset: 0;
  z-index: 60;
  background: color-mix(in srgb, var(--ink) 40%, transparent);
  backdrop-filter: blur(6px);
  transition: opacity var(--tid-3) var(--ease-ud);
}
.skuffe-lag[data-starting-style],
.skuffe-lag[data-ending-style] { opacity: 0; }
.skuffe-visning { position: fixed; inset: 0; z-index: 61; pointer-events: none; }
.skuffe {
  position: fixed;
  inset-block: 0;
  inset-inline-end: 0;
  z-index: 61;
  pointer-events: auto;
  inline-size: min(100%, var(--skuffe-bredde, 30rem));
  display: grid;
  grid-template-rows: auto 1fr auto;
  background: var(--flade-2);
  background-image: var(--lysfald);
  border-inline-start: 1px solid var(--kant-lyst, var(--kant));
  box-shadow: var(--loft-4);
  color: var(--tekst);
  transition: translate var(--tid-3) var(--ease-ud);
}
.skuffe[data-starting-style],
.skuffe[data-ending-style] { translate: 100% 0; transition-timing-function: var(--ease-ind); transition-duration: var(--tid-2); }
.skuffe-hoved {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--rum-4);
  padding: var(--rum-5) var(--rum-6);
  border-block-end: 1px solid var(--kant);
}
.skuffe-titel {
  margin: 0;
  font-size: var(--fs-title);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-titel);
}
.skuffe-tekst { margin: var(--rum-1) 0 0; font-size: var(--fs-body-s); color: var(--tekst-2); }
.skuffe-krop { overflow: auto; padding: var(--rum-6); }
.skuffe-fod {
  display: flex;
  justify-content: flex-end;
  gap: var(--rum-3);
  padding: var(--rum-4) var(--rum-6);
  border-block-start: 1px solid var(--kant);
}
.skuffe-haandtag { display: none; }
@media (max-width: 640px) {
  .skuffe {
    inset: auto 0 0 0;
    inline-size: 100%;
    max-block-size: 88dvh;
    border-inline-start: 0;
    border-block-start: 1px solid var(--kant-lyst, var(--kant));
    border-start-start-radius: var(--hjorne-6);
    border-start-end-radius: var(--hjorne-6);
  }
  .skuffe[data-starting-style],
  .skuffe[data-ending-style] { translate: 0 100%; }
  .skuffe-haandtag {
    display: block;
    justify-self: center;
    inline-size: var(--rum-9);
    block-size: 4px;
    margin-block: var(--rum-3) calc(-1 * var(--rum-3));
    border-radius: var(--hjorne-fuld);
    background: var(--kant-staerk);
  }
}

/* ---- værktøjslinjen ------------------------------------------------------- */
.vaerktoejslinje {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-1);
  padding: var(--rum-1);
  border-radius: var(--hjorne-3);
  background: var(--flade-2);
  border: 1px solid var(--kant);
}
.vaerktoejslinje-gruppe { display: inline-flex; gap: var(--rum-1); }
.vaerktoejslinje-streg { inline-size: 1px; align-self: stretch; margin: var(--rum-1) var(--rum-2); background: var(--kant); }
.vaerktoejslinje .knap[data-pressed],
.vaerktoejslinje .knap[aria-pressed="true"] { background: var(--flade-hover); color: var(--tekst); }

/* ---- adskilleren ---------------------------------------------------------- */
.adskiller {
  display: flex;
  align-items: center;
  gap: var(--rum-4);
  margin: var(--rum-6) 0;
  border: 0;
  color: var(--tekst-3);
  font-size: var(--fs-meta);
  font-family: var(--font-mono);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
}
.adskiller::before,
.adskiller::after { content: ""; flex: 1; block-size: 1px; background: var(--kant); }
.adskiller:empty::after { display: none; }
.adskiller-lodret { inline-size: 1px; align-self: stretch; margin: 0 var(--rum-3); background: var(--kant); }

/* ---- rullen (scroll area) ------------------------------------------------- */
/* En liste med sin egen rulle, og en bjælke der kun er der mens man
   ruller. Tabeller der er bredere end skærmen, lange menuer. */
.rulle { position: relative; overflow: hidden; }
.rulle-visning { block-size: 100%; overflow: auto; overscroll-behavior: contain; scrollbar-width: none; }
.rulle-visning::-webkit-scrollbar { display: none; }
.rulle-bjaelke {
  position: absolute;
  display: flex;
  justify-content: center;
  background: transparent;
  opacity: 0;
  transition: opacity var(--tid-2) var(--ease-std);
}
.rulle-bjaelke[data-orientation="vertical"]   { inset-block: var(--rum-1); inset-inline-end: var(--rum-1); inline-size: 6px; }
.rulle-bjaelke[data-orientation="horizontal"] { inset-inline: var(--rum-1); inset-block-end: var(--rum-1); block-size: 6px; flex-direction: column; }
.rulle-bjaelke[data-hovering],
.rulle-bjaelke[data-scrolling] { opacity: 1; }
.rulle-tommel { inline-size: 100%; block-size: 100%; border-radius: var(--hjorne-fuld); background: color-mix(in srgb, var(--tekst) 35%, transparent); }

 /* brødkrummer, sidetal, trin, kommandopalet, harmonika, skuffe, rulle */

/* ─── kits/ui/03-komponenter/sejr-tidslinje.css ─── */
/* SEJR UI — dataens små former.
 *
 * Tabellen, listen, nøgletallet, måleren og grafen er de store. Det her er
 * de små, der står imellem dem:
 *
 *   tidslinje        hvad der skete, hvornår, af hvem. Logbogen.
 *   statusstribe     fire-fem tal på én linje, hver med sin tilstand.
 *   definitionsliste nøgle og værdi. Kundekortets stamdata.
 *   delta            ændringen: pil, tal, og aldrig rød for «ned».
 *   gnist            den lille kurve (sparkline) uden akser — med
 *                    nullinje når bare én værdi er negativ (§09).
 *
 * Alle tal i mono og tabulære. §09's love gælder også de små.
 */

/* ---- tidslinjen ----------------------------------------------------------- */
.tidslinje {
  position: relative;
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: var(--rum-5);
}
.tidslinje::before {
  content: "";
  position: absolute;
  inset-block: var(--rum-2);
  inset-inline-start: calc(var(--rum-3) - .5px);
  inline-size: 1px;
  background: var(--kant);
}
.tidslinje-punkt {
  position: relative;
  display: grid;
  grid-template-columns: var(--rum-6) 1fr;
  gap: var(--rum-3);
  align-items: start;
}
.tidslinje-prik {
  position: relative;
  z-index: 1;
  inline-size: var(--rum-3);
  block-size: var(--rum-3);
  margin: 5px var(--rum-2) 0;
  border-radius: var(--hjorne-fuld);
  background: var(--flade);
  border: 1px solid var(--kant-staerk);
}
.tidslinje-punkt.er-nu .tidslinje-prik { background: var(--tekst); border-color: var(--tekst); box-shadow: 0 0 0 3px color-mix(in srgb, var(--tekst) 12%, transparent); }
.tidslinje-punkt.er-fejl .tidslinje-prik { border-color: var(--fn-danger); background: var(--fn-danger-flade); }
.tidslinje-punkt.er-succes .tidslinje-prik { border-color: var(--fn-success); background: var(--fn-success-flade); }
.tidslinje-krop { display: grid; gap: var(--rum-1); min-inline-size: 0; }
.tidslinje-hvad { font-size: var(--fs-body); color: var(--tekst); }
.tidslinje-hvad strong { font-weight: var(--fw-medium); }
.tidslinje-meta {
  display: flex;
  gap: var(--rum-2);
  font-size: var(--fs-body-s);
  color: var(--tekst-3);
}
.tidslinje-tid {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
}
.tidslinje-hvem::before { content: "·"; margin-inline-end: var(--rum-2); }
.tidslinje-detalje {
  margin-block-start: var(--rum-2);
  padding: var(--rum-3) var(--rum-4);
  border-radius: var(--hjorne-3);
  background: var(--flade-2);
  border: 1px solid var(--kant);
  font-size: var(--fs-body-s);
  color: var(--tekst-2);
}

/* ---- statusstriben -------------------------------------------------------- */
.statusstribe {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: 1fr;
  border-radius: var(--hjorne-4);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant);
  box-shadow: var(--loft-1);   /* 6. sep. 2026: den ligger på bordet, den er ikke tegnet i det */
  overflow: hidden;
}
.statusstribe-punkt {
  display: grid;
  gap: var(--rum-1);
  padding: var(--rum-4) var(--rum-5);
  text-decoration: none;
  color: inherit;
}
.statusstribe-punkt + .statusstribe-punkt { border-inline-start: 1px solid var(--kant); }
a.statusstribe-punkt:hover { background: var(--flade-hover); }
/* Et punkt der er et link siger det først når man holder over: pilen i
   navnets linje, i mono, som en genvej og ikke som en knap. */
a.statusstribe-punkt .statusstribe-navn::after { content: "→"; margin-inline-start: auto; opacity: 0; transition: opacity var(--overgang-tilstand); }
a.statusstribe-punkt:hover .statusstribe-navn::after { opacity: 1; }
.statusstribe-navn {
  display: flex;
  align-items: center;
  gap: var(--rum-2);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-3);
}
.statusstribe-tal {
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  font-size: var(--fs-title);
  font-weight: var(--fw-medium);
  color: var(--tekst);
}
.statusstribe-under { font-size: var(--fs-body-s); color: var(--tekst-2); }
@media (max-width: 640px) {
  .statusstribe { grid-auto-flow: row; grid-template-columns: 1fr 1fr; }
  .statusstribe-punkt + .statusstribe-punkt { border-inline-start: 0; }
  .statusstribe-punkt:nth-child(even) { border-inline-start: 1px solid var(--kant); }
  .statusstribe-punkt:nth-child(n + 3) { border-block-start: 1px solid var(--kant); }
}

/* ---- definitionslisten ---------------------------------------------------- */
.definitionsliste {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: var(--rum-3) var(--rum-6);
  margin: 0;
  font-size: var(--fs-body);
}
.definitionsliste > dt {
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-2);
  padding-block-start: 1px;
}
.definitionsliste > dd { margin: 0; color: var(--tekst); min-inline-size: 0; overflow-wrap: anywhere; }
.definitionsliste > dd.tal { text-align: start; }
/* Lodret: nøglen over værdien, til et smalt kort. */
.definitionsliste-lodret { grid-template-columns: 1fr; gap: var(--rum-1); }
.definitionsliste-lodret > dd { margin-block-end: var(--rum-3); }
/* Med streger mellem rækkerne, til kundekortet. */
.definitionsliste-streger > dt,
.definitionsliste-streger > dd { padding-block: var(--rum-3); border-block-end: 1px solid var(--kant); }
.definitionsliste-streger { gap: 0 var(--rum-6); }

/* ---- deltaet -------------------------------------------------------------- */
/* Ændringen siden sidst. Pilen er retningen, tallet er størrelsen, og
   farven kommer KUN når komponenten får at vide om ændringen er god —
   for «ned» er ikke rød af sig selv. En måned med mindre udgifter er ned
   og godt. */
.delta {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-1);
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  font-size: var(--fs-body-s);
  color: var(--tekst-2);
  white-space: nowrap;
}
.delta > .ikon { font-size: 14px; }
.delta-god     { color: var(--fn-success); }
.delta-daarlig { color: var(--fn-danger); }
.delta-flad    { color: var(--tekst-3); }
.delta-siden   { color: var(--tekst-3); font-family: var(--font-sans); margin-inline-start: var(--rum-1); }

/* ---- gnisten (sparkline) -------------------------------------------------- */
.gnist {
  display: inline-block;
  inline-size: var(--gnist-b, 6rem);
  block-size: var(--gnist-h, 1.6em);
  vertical-align: middle;
  color: var(--tekst-2);
  overflow: visible;
}
.gnist-linje { fill: none; stroke: currentColor; stroke-width: 1.5; stroke-linejoin: round; stroke-linecap: round; }
.gnist-flade { fill: currentColor; opacity: .08; }
.gnist-nul { stroke: var(--tekst-3); stroke-width: 1; stroke-dasharray: 2 3; }
.gnist-prik { fill: currentColor; }



/* ─── kits/ui/03-komponenter/sejr-datatabel.css ─── */
/* SEJR UI — datatabellen.
 *
 * `sejr-tabel.css` er tabellen: hoved i mono-versaler, tal til højre,
 * rækker på `--raekke-h`. Denne fil er det de professionelle lægger oven
 * på den, og som hver app ellers bygger forfra — set i shadcn's data-table
 * og Shopifys IndexTable, 5. september 2026:
 *
 *   sortering     hovedet er en knap, `aria-sort` siger retningen,
 *                 pilen viser den. Kun én kolonne ad gangen.
 *   valg          en afkrydsning pr. række, én i hovedet med tre
 *                 tilstande, og en HANDLINGSBJÆLKE der kommer frem når
 *                 noget er valgt — «3 valgt · Send · Slet».
 *   værktøj       linjen over tabellen: søg, filtre som chips, antal,
 *                 handlinger. Ét sted, samme rækkefølge overalt.
 *   venter        rækker af skelet mens data hentes. Aldrig et tal.
 *   sidetal       under tabellen, når listen ikke kan rulles i ét stykke.
 *
 * Reglerne fra §09 gælder stadig: penge ud er neutral, `÷` med ordet
 * «minus» ved siden af, og et beløb animerer aldrig.
 */

/* ---- værktøjslinjen over tabellen ---------------------------------------- */
.tabel-vaerktoej {
  display: flex;
  align-items: center;
  gap: var(--rum-3);
  flex-wrap: wrap;
  padding-block-end: var(--rum-4);
}
.tabel-vaerktoej > .kontrol { inline-size: min(100%, 20rem); }
.tabel-antal {
  margin-inline-start: auto;
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  font-variant-numeric: tabular-nums;
  color: var(--tekst-3);
  white-space: nowrap;
}
.tabel-handlinger { display: flex; gap: var(--rum-2); }

/* Filtre som chips. Et aktivt filter er en chip med sin værdi og et kryds;
   «Filtrér» åbner en popover med resten. Aldrig en række af vælgelister —
   dem husker ingen hvad står på. */
.filterchips { display: flex; gap: var(--rum-2); flex-wrap: wrap; }
.filterchip {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-2);
  min-block-size: calc(var(--kontrol-h) - var(--rum-3));
  padding: 0 var(--rum-2) 0 var(--rum-3);
  border-radius: var(--hjorne-2);
  border: 1px dashed var(--kant-staerk);
  background: transparent;
  color: var(--tekst-2);
  font: inherit;
  font-size: var(--fs-body-s);
  cursor: pointer;
  transition: border-color var(--overgang-tilstand), background var(--overgang-tilstand);
}
.filterchip:hover { border-color: var(--tekst-2); }
.filterchip.er-aktiv {
  border-style: solid;
  background: var(--flade-3);
  color: var(--tekst);
}
.filterchip-vaerdi { font-weight: var(--fw-medium); }
.filterchip-fjern {
  display: inline-grid;
  place-items: center;
  inline-size: var(--rum-6);
  block-size: var(--rum-6);
  border: 0;
  border-radius: var(--hjorne-fuld);
  background: none;
  color: var(--tekst-3);
  cursor: pointer;
}
.filterchip-fjern:hover { color: var(--tekst); background: var(--flade-hover); }

/* ---- sortering ------------------------------------------------------------ */
.tabel-sorter {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-1);
  margin: calc(-1 * var(--rum-1)) calc(-1 * var(--rum-2));
  padding: var(--rum-1) var(--rum-2);
  border: 0;
  border-radius: var(--hjorne-2);
  background: none;
  color: inherit;
  font: inherit;
  letter-spacing: inherit;
  text-transform: inherit;
  cursor: pointer;
}
.tabel-sorter:hover { color: var(--tekst); background: var(--flade-hover); }
.tabel-sorter:focus-visible { outline: 2px solid var(--fokus-ring); outline-offset: 1px; }
.tabel-sorter > .ikon { font-size: 12px; opacity: 0; transition: opacity var(--overgang-tilstand), transform var(--overgang-tilstand); }
.tabel-sorter:hover > .ikon { opacity: .5; }
th[aria-sort] .tabel-sorter { color: var(--tekst); }
th[aria-sort] .tabel-sorter > .ikon { opacity: 1; }
th[aria-sort="descending"] .tabel-sorter > .ikon { transform: rotate(180deg); }
.tabel thead th.tal .tabel-sorter { flex-direction: row-reverse; }

/* ---- valg ----------------------------------------------------------------- */
.tabel th.tabel-valg,
.tabel td.tabel-valg {
  inline-size: var(--rum-9);
  padding-inline: var(--rum-4) 0;
}
.tabel td.tabel-valg .afkrydsning { vertical-align: middle; }

/* Handlingsbjælken. Kommer frem nederst i rammen når noget er valgt, over
   rækkerne, i blæk — det er én flade med det man kan gøre med valget, og
   den forsvinder når valget gør. */
.handlingsbjaelke {
  position: sticky;
  inset-block-end: 0;
  z-index: 2;
  display: flex;
  align-items: center;
  gap: var(--rum-3);
  margin: var(--rum-3);
  padding: var(--rum-2) var(--rum-2) var(--rum-2) var(--rum-5);
  border-radius: var(--hjorne-4);
  background: var(--ink);
  color: var(--paper);
  box-shadow: var(--loft-3);
  font-size: var(--fs-body-s);
  transition: opacity var(--tid-2) var(--ease-ud), translate var(--tid-2) var(--ease-ud);
}
.handlingsbjaelke[data-starting-style] { opacity: 0; translate: 0 var(--rum-3); }
.handlingsbjaelke-antal {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  margin-inline-end: var(--rum-2);
}
.handlingsbjaelke .knap-stille { color: var(--paper); }
.handlingsbjaelke .knap-stille:hover { background: color-mix(in srgb, var(--paper) 10%, transparent); }
.handlingsbjaelke .knap-sekundaer { color: var(--paper); border-color: color-mix(in srgb, var(--paper) 30%, transparent); }
.handlingsbjaelke .knap-farlig { color: var(--paper); }
.handlingsbjaelke-ryd { margin-inline-start: auto; }
[data-ground="nat"] .handlingsbjaelke, .nat .handlingsbjaelke { background: var(--flade-3); color: var(--tekst); }
[data-ground="nat"] .handlingsbjaelke .knap-stille, .nat .handlingsbjaelke .knap-stille { color: var(--tekst); }

/* ---- venter --------------------------------------------------------------- */
.tabel tbody tr.tabel-venter td { pointer-events: none; }
.tabel-venter .venter-linje { inline-size: 60%; }
.tabel-venter td.tal .venter-linje { inline-size: 40%; margin-inline-start: auto; }

/* ---- rækkens handling ----------------------------------------------------- */
/* Menuen i rækkens højre kant: tre prikker, kun synlig ved hover og fokus,
   så tabellen ikke er et gitter af knapper. */
.tabel td.tabel-raekke-handling { inline-size: var(--rum-9); padding-inline: 0 var(--rum-3); text-align: end; }
.tabel-raekke-handling .knap { opacity: 0; transition: opacity var(--overgang-tilstand); }
.tabel tbody tr:hover .tabel-raekke-handling .knap,
.tabel tbody tr:focus-within .tabel-raekke-handling .knap,
.tabel-raekke-handling .knap[data-popup-open] { opacity: 1; }

/* Sidetal under rammen. */
.tabel-fod { display: flex; justify-content: flex-end; padding-block-start: var(--rum-4); }
.tabel-fod .sidetal { inline-size: 100%; }

  /* sortering, valg, handlingsbjælke, værktøj, 5. sept. 2026 */

/* ─── kits/ui/03-komponenter/sejr-oversigt.css ─── */
/* SEJR UI — oversigtens småting.
 *
 * Det et finansdashboard består af mellem tabellerne, set hos dem der
 * bygger sådan nogle for andre (Tremor, Vercel, Linear, GitHub), 5.
 * september 2026 — og skåret til huset:
 *
 *   soejleliste    en liste med en vandret søjle pr. række. «Top ti kunder».
 *   sporing        en stribe af dage, hver med sin tilstand. Afregningsdage.
 *   periodevaelger måned · kvartal · år, frem og tilbage. Ét sted på siden.
 *   kopier         en værdi man kan kopiere — CVR, IBAN, reference.
 *   seglraekke     tre segl der overlapper: dem der er på sagen.
 *   tid            et tidspunkt: «3 dage siden», hele datoen i title.
 *   forhaandsvisning  kortet der kommer når man holder over et navn.
 *
 * §09 gælder: søjlerne er tekstfarve og skravering, aldrig crimson;
 * sporingens tilstande bærer skraveringskoden; intet tal animerer.
 */

/* ---- søjlelisten ---------------------------------------------------------- */
.soejleliste { display: grid; gap: var(--rum-2); margin: 0; padding: 0; list-style: none; }
.soejleliste-raekke {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: var(--rum-1) var(--rum-4);
  align-items: center;
  font-size: var(--fs-body-s);
}
.soejleliste-navn {
  grid-column: 1;
  grid-row: 1;
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: var(--rum-2);
  min-block-size: var(--rum-7);
  padding-inline: var(--rum-3);
  color: var(--tekst);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.soejleliste-soejle {
  grid-column: 1;
  grid-row: 1;
  block-size: var(--rum-7);
  inline-size: var(--andel);
  border-radius: var(--hjorne-2);
  background: color-mix(in srgb, var(--tekst) 10%, transparent);
  transition: inline-size var(--tid-3) var(--ease-ud);
}
.soejleliste-raekke.er-fremhaevet .soejleliste-soejle { background: color-mix(in srgb, var(--tekst) 18%, transparent); }
.soejleliste-tal {
  grid-column: 2;
  grid-row: 1;
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  color: var(--tekst);
  white-space: nowrap;
}
a.soejleliste-navn { text-decoration: none; }
a.soejleliste-navn:hover { text-decoration: underline; text-underline-offset: .15em; }

/* ---- sporingen ------------------------------------------------------------ */
/* En stribe af felter, ét pr. dag (eller time, eller batch). Tilstanden
   bæres af farven OG skraveringskoden, som alt andet i huset. Det tomme
   felt er «ingen data», ikke «fejl». */
.sporing { display: grid; gap: var(--rum-2); }
.sporing-stribe { display: flex; gap: 2px; }
.sporing-felt {
  flex: 1;
  block-size: var(--rum-6);
  min-inline-size: 3px;
  border-radius: 2px;
  background: var(--flade-3);
  color: var(--tekst-3);
  transition: transform var(--overgang-tilstand);
}
.sporing-felt:hover { transform: scaleY(1.2); }
.sporing-felt.er-ok       { background: var(--fn-success); }
.sporing-felt.er-advarsel { background: var(--fn-warning); }
.sporing-felt.er-fejl     { background: var(--fn-danger); }
.sporing-felt.er-info     { background: var(--fn-info); }
/* Uden farve skelnes tilstandene på HØJDE: fejl er fuld, advarsel er
   trekvart, ok er halv, ingen data er en streg. Samme greb som
   skraveringen: en form der overlever gråtone. */
.sporing-felt.er-ok       { block-size: 55%; align-self: end; }
.sporing-felt.er-advarsel { block-size: 78%; align-self: end; }
.sporing-felt.er-info     { block-size: 55%; align-self: end; }
.sporing-felt:not([class*="er-"]) { block-size: 3px; align-self: end; }
.sporing-stribe { align-items: end; block-size: var(--rum-6); }
.sporing-fod {
  display: flex;
  justify-content: space-between;
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--tekst-3);
}
.sporing-signatur { display: flex; gap: var(--rum-4); font-size: var(--fs-meta); color: var(--tekst-3); }
.sporing-signatur > span { display: inline-flex; align-items: center; gap: var(--rum-1); }
.sporing-signatur i { display: inline-block; inline-size: 10px; block-size: 10px; border-radius: 2px; }

/* ---- periodevælgeren ------------------------------------------------------ */
.periodevaelger {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-2);
}
.periodevaelger-navn {
  min-inline-size: 11ch;
  text-align: center;
  font-family: var(--num-font);
  font-feature-settings: var(--num-features);
  font-size: var(--fs-body);
  color: var(--tekst);
}
.periodevaelger .vaelger { margin-inline-start: var(--rum-3); }

/* ---- kopier --------------------------------------------------------------- */
.kopier {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-2);
  max-inline-size: 100%;
  padding: 0 var(--rum-1) 0 var(--rum-3);
  min-block-size: calc(var(--kontrol-h) - var(--rum-3));
  border-radius: var(--hjorne-2);
  border: 1px solid var(--kant);
  background: var(--flade-2);
  font-family: var(--font-mono);
  font-size: var(--fs-body-s);
  font-variant-numeric: tabular-nums;
  color: var(--tekst);
}
.kopier-vaerdi { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kopier-knap {
  display: inline-grid;
  place-items: center;
  inline-size: var(--rum-7);
  block-size: var(--rum-7);
  border: 0;
  border-radius: var(--hjorne-1);
  background: none;
  color: var(--tekst-3);
  cursor: pointer;
}
.kopier-knap:hover { color: var(--tekst); background: var(--flade-hover); }
.kopier-knap:focus-visible { outline: 2px solid var(--fokus-ring); }
.kopier.er-kopieret .kopier-knap { color: var(--fn-success); }
.kopier-inline { border: 0; background: none; padding: 0; min-block-size: 0; font: inherit; }

/* ---- seglrækken ----------------------------------------------------------- */
.seglraekke { display: inline-flex; align-items: center; }
.seglraekke > .segl { margin-inline-start: calc(-1 * var(--rum-2)); box-shadow: 0 0 0 2px var(--flade); }
.seglraekke > .segl:first-child { margin-inline-start: 0; }
.seglraekke-flere {
  display: inline-grid;
  place-items: center;
  inline-size: 28px;
  block-size: 28px;
  margin-inline-start: calc(-1 * var(--rum-2));
  border-radius: var(--hjorne-fuld);
  background: var(--flade-3);
  box-shadow: 0 0 0 2px var(--flade);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--tekst-2);
}

/* ---- tid ------------------------------------------------------------------ */
.tid {
  font-variant-numeric: tabular-nums;
  text-decoration: underline dotted var(--dekor);
  text-underline-offset: .2em;
  cursor: help;
}

/* ---- forhåndsvisningen ---------------------------------------------------- */
.forhaandsvisning {
  z-index: 63;
  inline-size: min(22rem, calc(100vw - 2 * var(--rum-5)));
  padding: var(--rum-5);
  border-radius: var(--hjorne-4);
  background: var(--flade-2);
  background-image: var(--lysfald);
  border: 1px solid var(--kant-lyst, var(--kant));
  box-shadow: var(--loft-3);
  color: var(--tekst);
  font-size: var(--fs-body-s);
  transform-origin: var(--transform-origin);
  transition: opacity var(--tid-2) var(--ease-ud), scale var(--tid-2) var(--ease-ud);
}
.forhaandsvisning[data-starting-style],
.forhaandsvisning[data-ending-style] { opacity: 0; scale: .97; }
.forhaandsvisning-udloeser {
  color: inherit;
  text-decoration: underline dotted var(--dekor);
  text-underline-offset: .2em;
}
.forhaandsvisning-hoved { display: flex; align-items: center; gap: var(--rum-3); margin-block-end: var(--rum-3); }
.forhaandsvisning-titel { font-weight: var(--fw-medium); font-size: var(--fs-body); }

   /* søjleliste, sporing, periodevælger, kopiér, seglrække, tid, forhåndsvisning */  /* tidslinje, statusstribe, definitionsliste, delta, gnist */

/* ─── kits/ui/04-layout/sejr-skal.css ─── */
/* SEJR UI — skallen. Det en skærm står i.
 *
 * Indtil 5. september 2026 byggede hver app sin egen skal: sidebjælke,
 * dok, sidehoved, beholder — og de var fire forskellige. Det er den samme
 * fejl som med farverne, i større: det man ser FØRST på hver eneste skærm
 * var det eneste der ikke kom fra kittet.
 *
 *   skal          gitteret: sidebjælke til venstre, hovedet til højre
 *   sidebjaelke   blæk, mærket øverst, navigationen, brugeren nederst
 *   dok           bjælken over indholdet: søg, dato, besked, segl
 *   sidehoved     sidens titel, en linje og handlingerne
 *   sektion       et afsnit på siden med sin egen titel
 *   beholder      indholdets mål — 72 rem, eller 48 rem til prosa
 *   gitter, stak, raekke   rum imellem ting, i husets trin
 *
 * Alt her er rum og struktur. Ingen komponent; komponenterne står i det.
 */

/* ---- skallen -------------------------------------------------------------- */
.skal {
  --skal-side: 15rem;
  --skal-maal: 72rem;
  display: grid;
  grid-template-columns: var(--skal-side) 1fr;
  min-block-size: 100dvh;
  background: var(--flade);
  color: var(--tekst);
}
.skal-side {
  position: sticky;
  inset-block-start: 0;
  block-size: 100dvh;
  overflow: hidden auto;
}
.skal-hoved {
  display: grid;
  grid-template-rows: auto 1fr;
  min-inline-size: 0;
}
.skal-indhold {
  inline-size: 100%;
  max-inline-size: var(--skal-maal);
  margin-inline: auto;
  padding: var(--rum-7) var(--rum-6) var(--rum-11);
}
/* Smal sidebjælke (⌘B): kun ikoner, 3,5 rem. Teksten er der stadig for
   oplæseren; øjet får den som tip. Tallet bliver en prik. */
.skal[data-smal] { --skal-side: 3.5rem; }
.skal[data-smal] .sidebjaelke-top { padding-inline: var(--rum-3); justify-content: center; }
.skal[data-smal] .sidebjaelke-top .maerke-under,
.skal[data-smal] .sidebjaelke-navn-tekst,
.skal[data-smal] .sidebjaelke-afsnit,
.skal[data-smal] .sidebjaelke-bruger,
.skal[data-smal] .sidebjaelke-fod .knap:not(.knap-ikon) { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); }
.skal[data-smal] .sidebjaelke-top .maerke svg { block-size: 16px; }
.skal[data-smal] .sidebjaelke-punkt { justify-content: center; padding: 0; }
.skal[data-smal] .sidebjaelke-punkt > .ikon { font-size: 18px; }
.skal[data-smal] .sidebjaelke-tal {
  position: absolute;
  inset-block-start: 6px;
  inset-inline-end: 6px;
  inline-size: 6px;
  block-size: 6px;
  margin: 0;
  border-radius: var(--hjorne-fuld);
  background: var(--paper);
  font-size: 0;
}
.skal[data-smal] .sidebjaelke-fod { padding-inline: var(--rum-3); justify-items: center; }
.skal-smalknap { transition: transform var(--tid-2) var(--ease-std); }
.skal[data-smal] .skal-smalknap { transform: rotate(180deg); }
@media (max-width: 900px) { .skal-smalknap { display: none; } }

/* Smal skærm: sidebjælken bliver en skuffe, og der kommer en menuknap i dokken. */
.skal-mobilknap { display: none; }
@media (max-width: 900px) {
  .skal { grid-template-columns: 1fr; }
  .skal-side { display: none; }
  .skal-side.er-aaben {
    display: block;
    position: fixed;
    inset: 0 auto 0 0;
    z-index: 61;
    inline-size: min(85vw, var(--skal-side));
    box-shadow: var(--loft-4);
  }
  .skal-mobilknap { display: inline-flex; }
  .skal-indhold { padding: var(--rum-5) var(--rum-4) var(--rum-10); }
}

/* ---- sidebjælken ---------------------------------------------------------- */
/* Blæk. Fast, stille — ingen glasfrostning (pensioneret 29. august 2026).
   Mærket i papir øverst, navigationen, og brugeren nederst. Det aktive
   punkt bærer linjesprogets anker. */
.sidebjaelke {
  display: grid;
  grid-template-rows: auto 1fr auto;
  min-block-size: 100%;
  background: var(--ink);
  color: var(--paper);
}
.sidebjaelke-top {
  display: flex;
  align-items: center;
  padding: var(--rum-6) var(--rum-6) var(--rum-5);
}
.sidebjaelke-top .maerke { color: var(--paper); }
.sidebjaelke-top .maerke-under { color: color-mix(in srgb, var(--paper) 55%, transparent); }
.sidebjaelke-nav {
  display: grid;
  align-content: start;
  gap: var(--rum-1);
  padding: var(--rum-2) var(--rum-3);
  overflow: auto;
}
.sidebjaelke-afsnit {
  padding: var(--rum-5) var(--rum-3) var(--rum-2);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: color-mix(in srgb, var(--paper) 45%, transparent);
}
.sidebjaelke-punkt {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--rum-3);
  min-block-size: var(--kontrol-h);
  padding: 0 var(--rum-3);
  border-radius: var(--hjorne-3);
  color: color-mix(in srgb, var(--paper) 72%, transparent);
  font-size: var(--fs-body);
  text-decoration: none;
  transition: background var(--overgang-tilstand), color var(--overgang-tilstand);
}
.sidebjaelke-punkt:hover { background: color-mix(in srgb, var(--paper) 8%, transparent); color: var(--paper); }
.sidebjaelke-punkt:focus-visible { outline: 2px solid var(--paper); outline-offset: -2px; }
.sidebjaelke-punkt[aria-current="page"] {
  background: color-mix(in srgb, var(--paper) 12%, transparent);
  color: var(--paper);
  font-weight: var(--fw-medium);
}
.sidebjaelke-punkt[aria-current="page"]::before {
  content: "";
  position: absolute;
  inset-inline-start: 0;
  inset-block: var(--rum-3);
  inline-size: 2px;
  background: currentColor;
  border-radius: var(--hjorne-1);
}
.sidebjaelke-punkt > .ikon { font-size: 16px; opacity: .85; }
.sidebjaelke-tal {
  margin-inline-start: auto;
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-variant-numeric: tabular-nums;
  color: color-mix(in srgb, var(--paper) 60%, transparent);
}
.sidebjaelke-fod {
  display: grid;
  gap: var(--rum-3);
  padding: var(--rum-5) var(--rum-6);
  border-block-start: 1px solid color-mix(in srgb, var(--paper) 10%, transparent);
}
.sidebjaelke-bruger { display: grid; gap: 2px; min-inline-size: 0; }
.sidebjaelke-navn { font-size: var(--fs-body-s); font-weight: var(--fw-medium); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sidebjaelke-mail { font-size: var(--fs-meta); color: color-mix(in srgb, var(--paper) 45%, transparent); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sidebjaelke-fod .knap-stille { color: color-mix(in srgb, var(--paper) 72%, transparent); }
.sidebjaelke-fod .knap-stille:hover { color: var(--paper); background: color-mix(in srgb, var(--paper) 8%, transparent); }

/* ---- dokken --------------------------------------------------------------- */
/* Bjælken over indholdet. Klæber i toppen; søgningen i midten er en
   pille, det eneste sted i huset der er en pille — fordi den er ét felt og
   ikke en knap. Dato i mono, besked, segl. */
.dok {
  position: sticky;
  inset-block-start: 0;
  z-index: 40;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--rum-3);
  padding: var(--rum-3) var(--rum-6);
  background: color-mix(in srgb, var(--flade) 85%, transparent);
  backdrop-filter: blur(10px);
  border-block-end: 1px solid var(--kant);
}
.dok-pille {
  display: flex;
  align-items: center;
  gap: var(--rum-3);
  inline-size: min(100%, 34rem);
  min-block-size: var(--kontrol-h);
  padding: 0 var(--rum-3) 0 var(--rum-4);
  border-radius: var(--hjorne-fuld);
  background: var(--flade-2);
  border: 1px solid var(--kant);
  box-shadow: var(--loft-1);
}
.dok-soeg {
  flex: 1;
  display: flex;
  align-items: center;
  gap: var(--rum-2);
  min-inline-size: 0;
  color: var(--tekst-3);
  font-size: var(--fs-body-s);
  border: 0;
  background: none;
  text-align: start;
  cursor: text;
}
.dok-soeg > .ikon { font-size: 16px; }
.dok-soeg > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dok-dato {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-3);
  white-space: nowrap;
}
.dok-skille { inline-size: 1px; block-size: var(--rum-5); background: var(--kant-staerk); }
.dok-prik {
  position: relative;
}
.dok-prik::after {
  content: "";
  position: absolute;
  inset-block-start: 6px;
  inset-inline-end: 6px;
  inline-size: 7px;
  block-size: 7px;
  border-radius: var(--hjorne-fuld);
  background: var(--fn-success);
  box-shadow: 0 0 0 2px var(--flade-2);
}
@media (max-width: 900px) {
  .dok { justify-content: space-between; padding-inline: var(--rum-4); }
  .dok-dato { display: none; }
}

/* ---- sidehovedet ---------------------------------------------------------- */
.sidehoved { margin-block-end: var(--rum-7); }
.sidehoved-linje {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--rum-5);
  flex-wrap: wrap;
}
.sidehoved-tilbage {
  display: inline-flex;
  align-items: center;
  gap: var(--rum-1);
  margin-block-end: var(--rum-2);
  font-size: var(--fs-body-s);
  color: var(--tekst-2);
  text-decoration: none;
}
.sidehoved-tilbage:hover { color: var(--tekst); text-decoration: underline; text-underline-offset: .15em; }
.sidehoved-titellinje { display: flex; align-items: center; gap: var(--rum-3); }
.sidehoved-figur { display: inline-flex; flex: none; }
.sidehoved-ved { display: inline-flex; align-items: center; }
/* Med undernavigation: fanebladene sidder i hovedets underkant, og hovedet
   har ingen egen afstand — fanens mærke er stregen. */
.sidehoved-nav { margin-block-start: var(--rum-5); }
.sidehoved-med-nav { margin-block-end: var(--rum-6); }
.sidehoved-nav .faneblade-liste { margin-block-end: 0; }
.sidehoved-tekster { display: grid; gap: var(--rum-1); min-inline-size: 0; }
.sidehoved-over {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  letter-spacing: var(--spor-etiket);
  text-transform: uppercase;
  color: var(--tekst-3);
}
.sidehoved-titel {
  margin: 0;
  font-size: var(--fs-h3);
  font-weight: var(--fw-medium);
  letter-spacing: var(--spor-titel);
  line-height: 1.15;
}
.sidehoved-tekst { margin: 0; font-size: var(--fs-body); color: var(--tekst-2); max-inline-size: var(--maal-brod); }
.sidehoved-handlinger { display: flex; gap: var(--rum-3); flex: none; }

/* ---- sektionen ------------------------------------------------------------ */
.sektion { display: grid; gap: var(--rum-4); }
.sektion + .sektion { margin-block-start: var(--rum-8); }
.sektion-hoved {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--rum-4);
}
.sektion-titel { margin: 0; font-size: var(--fs-title); font-weight: var(--fw-medium); letter-spacing: var(--spor-titel); }
.sektion-tekst { margin: 0; font-size: var(--fs-body-s); color: var(--tekst-2); }
.sektion-handling { flex: none; }

/* ---- beholderen, gitteret, stakken ---------------------------------------- */
.beholder { inline-size: 100%; max-inline-size: var(--skal-maal, 72rem); margin-inline: auto; }
.beholder-smal { max-inline-size: 48rem; }
.gitter {
  display: grid;
  gap: var(--gitter-rum, var(--rum-5));
  grid-template-columns: repeat(auto-fit, minmax(var(--gitter-min, 16rem), 1fr));
}
.gitter-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.gitter-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.gitter-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 900px) { .gitter-3, .gitter-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .gitter-2, .gitter-3, .gitter-4 { grid-template-columns: minmax(0, 1fr); } }
.stak { display: flex; flex-direction: column; gap: var(--stak-rum, var(--rum-4)); }
.raekke { display: flex; align-items: center; gap: var(--raekke-rum, var(--rum-3)); flex-wrap: wrap; }
.raekke-mellem { justify-content: space-between; }
.raekke-hoejre { justify-content: flex-end; }
.rum-2 { --stak-rum: var(--rum-2); --raekke-rum: var(--rum-2); --gitter-rum: var(--rum-2); }
.rum-3 { --stak-rum: var(--rum-3); --raekke-rum: var(--rum-3); --gitter-rum: var(--rum-3); }
.rum-4 { --stak-rum: var(--rum-4); --raekke-rum: var(--rum-4); --gitter-rum: var(--rum-4); }
.rum-5 { --stak-rum: var(--rum-5); --raekke-rum: var(--rum-5); --gitter-rum: var(--rum-5); }
.rum-6 { --stak-rum: var(--rum-6); --raekke-rum: var(--rum-6); --gitter-rum: var(--rum-6); }
.rum-8 { --stak-rum: var(--rum-8); --raekke-rum: var(--rum-8); --gitter-rum: var(--rum-8); }

             /* skal, sidebjælke, dok, sidehoved, sektion, gitter, stak, 5. sept. 2026 */

/* ─── Tailwind v4 ───────────────────────────────────────────────────────────
 *
 * Seks af syv apps kører Tailwind v4. Blokken herunder gør tokens til
 * utilities: bg-flade, text-tekst-2, p-rum-5, rounded-radius-4, osv.
 *
 * Den skal være `@theme inline` og ikke `@theme`. Almindelig @theme skriver
 * den OPLØSTE værdi ind — så ville bg-flade blive låst til #FAFAF7 og holde
 * op med at vende om på [data-ground="nat"]. `inline` beholder var()-kæden,
 * så temaskiftet stadig virker. Skift den aldrig tilbage.
 *
 * Bruger appen ikke Tailwind (sejr-com kører Svelte + Vite), gør blokken
 * ingen skade — den er bare ubrugte custom properties.
 */
@theme inline {
  /* flader og tekst */
  --color-flade:          var(--flade);
  --color-flade-2:        var(--flade-2);
  --color-flade-3:        var(--flade-3);
  --color-tekst:          var(--tekst);
  --color-tekst-2:        var(--tekst-2);
  --color-tekst-3:        var(--tekst-3);
  --color-dekor:          var(--dekor);
  --color-kant:           var(--kant);
  --color-kant-staerk:    var(--kant-staerk);

  /* handling */
  --color-handling:       var(--handling);
  --color-handling-hover: var(--handling-hover);
  --color-handling-tryk:  var(--handling-tryk);
  --color-paa-handling:   var(--paa-handling);

  /* penge og tilstand — rå fra identiteten, så de vender med på nat */
  --color-money-in:       var(--money-in);
  --color-money-out:      var(--money-out);
  --color-fn-danger:      var(--fn-danger);
  --color-fn-warning:     var(--fn-warning);
  --color-fn-success:     var(--fn-success);
  --color-fn-info:        var(--fn-info);

  /* seriefarver — kun til diagrammer. Recharts tager dem som
     stroke="var(--serie-1)"; utilities findes for akser og etiketter. */
  --color-serie-1: var(--serie-1);  --color-serie-2: var(--serie-2);
  --color-serie-3: var(--serie-3);  --color-serie-4: var(--serie-4);
  --color-serie-5: var(--serie-5);  --color-serie-6: var(--serie-6);

  /* tilstandsflader — tilføjet identiteten 16. august 2026 */
  --color-fn-danger-flade:  var(--fn-danger-flade);
  --color-fn-warning-flade: var(--fn-warning-flade);
  --color-fn-success-flade: var(--fn-success-flade);
  --color-fn-info-flade:    var(--fn-info-flade);

  /* rum */
  --spacing-rum-1:  var(--rum-1);   --spacing-rum-2:  var(--rum-2);
  --spacing-rum-3:  var(--rum-3);   --spacing-rum-4:  var(--rum-4);
  --spacing-rum-5:  var(--rum-5);   --spacing-rum-6:  var(--rum-6);
  --spacing-rum-7:  var(--rum-7);   --spacing-rum-8:  var(--rum-8);
  --spacing-rum-9:  var(--rum-9);   --spacing-rum-10: var(--rum-10);
  --spacing-rum-11: var(--rum-11);  --spacing-rum-12: var(--rum-12);

  /* radius — kilden hedder --hjorne-*, målet --radius-*. De må IKKE hedde det
     samme: --radius-1: var(--radius-1) er selvrefererende, og CSS kasserer
     erklæringen uden at sige noget. */
  --radius-1: var(--hjorne-1);  --radius-2: var(--hjorne-2);
  --radius-3: var(--hjorne-3);  --radius-4: var(--hjorne-4);
  --radius-5: var(--hjorne-5);  --radius-6: var(--hjorne-6);

  /* løft */
  --shadow-loft-1: var(--loft-1);  --shadow-loft-2: var(--loft-2);
  --shadow-loft-3: var(--loft-3);  --shadow-loft-4: var(--loft-4);

  /* Skrift mappes MED VILJE ikke her. Identiteten definerer allerede
     --font-sans, --font-breit og --font-mono i :root, og Tailwinds
     font-namespace er også --font-*. En mapping ville blive selvrefererende
     på samme måde som radius. Brug var(--font-mono) direkte i CSS, eller
     tilføj din egen alias i appen hvis du vil have en font-* utility. */
}

/* ─── grundlag ──────────────────────────────────────────────────────────────
 * Det mindst mulige. Ikke en reset — apps har deres egen. Kun de tre ting der
 * ellers bliver glemt i hver eneste app, og som brandet faktisk afhænger af.
 */

/* Grunden skal males eksplicit. Gør den ikke det, arver siden browserens
   hvide, og #FFFFFF findes ikke i paletten — papir er #FAFAF7. */
:where(html) {
  background: var(--flade);
  color: var(--tekst);
}

/* ET BELØB. Reglen står i fundament/03-skrift og gentages her fordi det er den der
   oftest bliver overtrådt: mono, tnum, zero, og aldrig mindre end brødtekst.
   Uden tnum skifter cifrene bredde, og en talkolonne hopper mellem to
   opdateringer. Uden zero kan et nul forveksles med et O i en kontonummer. */
:where(.belob, [data-belob]) {
  font-family: var(--font-mono);
  font-feature-settings: "tnum" 1, "zero" 1;
  font-variant-numeric: tabular-nums slashed-zero;
  font-size: max(14px, 1em);
}

/* Penge har retning. Ind er grøn, ud er neutral — ikke rød. Penge der
   forlader kontoen er ikke en fejl, og rød er forbeholdt noget der gik galt. */
:where([data-retning="ind"])  { color: var(--money-in); }
:where([data-retning="ud"])   { color: var(--money-out); }

/* Alt klikbart skal kunne rammes — men KUN i berøringstæthed.
   Første udgave lagde min-height på hver eneste knap i alle tætheder. Det
   pustede små kontroller op: chippens ×-knap blev 40px høj og gjorde chippen
   42px i stedet for 32. Målt 16. august 2026.
   WCAG 2.5.8 kræver 24×24 som AA; 48px er et POS-krav, ikke et generelt et.
   Komponenter sætter selv deres højde via --kontrol-h. */
[data-taethed="beroring"] :where(button, [role="button"], a[href], input[type="submit"]),
.taethed-beroring :where(button, [role="button"], a[href], input[type="submit"]) {
  min-height: var(--touch-min);
}

/* Boksmodellen. Hver app sætter border-box (Tailwinds preflight gør det),
   og komponenterne er målt under den. Kataloget har ingen preflight, og
   5. september 2026 løb skallen 48 px ud til højre af præcis den grund.
   Reglen står derfor her, én gang, for alt kittet tegner. */
*, *::before, *::after { box-sizing: border-box; }



/* ─── GRUNDLAGET SIDEN STÅR PÅ ──────────────────────────────────────────────
 *
 * Kittet sætter med vilje ingen skrift på <body>: det er et LAG, og værten
 * bestemmer selv sit dokument. Begge kittets egne prøvesider — komponenter.html
 * og eksempler.html — sætter derfor blokken her selv.
 *
 * Men når stilarket ER sidens stilark, som det er i en import til
 * claude.ai/design, findes der ingen vært til at sætte den. Og så arver alt
 * der ikke selv sætter en skrift — .kort-titel, .kort-under, .tom-titel,
 * .liste-titel, .ark-tekst — browserens standard, altså en SERIF.
 *
 * Målt 27. august 2026: knapper og beløb stod i Söhne, mens hver eneste
 * overskrift på et kort stod i Times. Kortene så «næsten rigtige» ud, og det
 * er præcis den slags fejl der ikke bliver opdaget.
 *
 * Blokken er skrevet af efter komponenter.html. Der er ikke opfundet en værdi.
 */
body {
  background: var(--flade);
  color: var(--tekst);
  font-family: var(--font-sans);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  margin: 0;
  -webkit-font-smoothing: antialiased;
}

/* `Grund` skifter tokens på sig selv — men en ø der skifter grund skal også
 * MALE den, ellers står nat-tokens på en papirflade. */
.sejr-grund {
  background: var(--flade);
  color: var(--tekst);
}
