/* ============================================================
   BaseTools — fælles stilark (design-tokens + basiskomponenter)
   Version 1.57 — TABELLER PAA TELEFONEN (22. september 2026,
   BASETOOLS_AFSAETNING_TABELLER_TELEFON.md v1.0). KUN nye regler i
   regelfamilien TABELLER PAA TELEFONEN nederst; ingen gammel regel
   roert, :root uroert, ingen ny variabel.

   Version 1.56 — TOPBJAELKENS MENU (21. september 2026,
   BASETOOLS_AFSAETNING_TOPBJAELKE.md v1.0). »Forside« og »Rundvisning«
   i bt_top() og ☰ paa telefonen. KUN nye regler i regelfamilien
   TOPBJÆLKENS MENU nederst; .bt-o-top { … } og :root er urørte.

   Version 1.55 — RUNDVISNINGEN (21. september 2026,
   BASETOOLS_AFSAETNING_RUNDVISNING.md v1.1). KUN nye .bt-o-rv-*-regler
   til public/rundvisning.php, samlet i regelfamilien RUNDVISNINGEN
   nederst i filen. Ingen gammel regel roert, :root uroert, ingen ny
   variabel.

   Version 1.54 — FORSIDENS REVISION (20. september 2026, Mikaels
   oplaeg). ÉN additiv regel: .bt-o-modulkort + p { margin-top:
   var(--bt-rum-4) } — en linje lige under kortene stod klods op ad
   dem (maalt i Chromium: 0 px luft). Rammer KUN et afsnit direkte
   efter kortene: to steder paa forsiden, nul paa /affiliate (maalt
   20/9). :root uroert, ingen ny farve, ingen gammel regel roert.

   Version 1.53 — TOPBJAELKEN STAAR FAST (20. september 2026, M5
   commit 7, BASETOOLS_AFSAETNING_AFFILIATE.md 16.12 — Mikaels oenske
   ved accepten: alle offentlige sider, ikke kun /affiliate). ÉN regel
   roert: .bt-o-top faar position: sticky, top: 0 og z-index: 900
   (samme lag som appens .bt-top-app). ÉN additiv regel: .bt-o-top ~
   [id] { scroll-margin-top: 40px } — bjaelken er 67 px paa pc og 94 px
   paa mobil, men html { scroll-padding-top } giver kun 64 px, saa et
   spring til #kunderne og #opret-formular lagde overskriften under
   bjaelken (maalt i Chromium 20/9: 3 og 31 px). 64 + 40 = 104 px.
   Mikaels valg 20/9. :root uroert, ingen ny farve.

   Version 1.52 — VILKAARENE (19. september 2026, partnervilkaarene 1.1,
   BASETOOLS_AFSAETNING_AFFILIATE.md afsnit 15 — Mikael ved
   kontrolpunktet: bredere blok, mindre skrift). TO additive regler,
   ingen gammel regel roert, :root uroert: .bt-vilkaar-side (accept-
   siden 960 px i stedet for .bt-smal) og .bt-vilkaar (vilkaarsteksten
   i --bt-fs-lille med strammere luft). Se regelfamilien VILKAARENE
   nederst i filen.

   Version 1.51 — ANKERSPRING PAA PC (18. september 2026,
   BASETOOLS_AFSAETNING_KOMIGANG_LINKS.md). ÉN additiv regel:
   html { scroll-padding-top: 64px; } i pc-blokken i regelfamilien
   FARVELEVERANCEN. Topbjaelken staar fast paa pc siden v1.50, men
   reglen fandtes kun paa mobil — et spring til #klinikprofil lagde
   overskriften under bjaelken (maalt i Chromium: 24,6 px fra toppen,
   bjaelken slutter ved 60).

   Version 1.50 — FARVELEVERANCEN (18. september 2026,
   BASETOOLS_TEGNING_FARVER.html v1.0). SEKS additive regler, ingen
   gammel regel roert, :root uroert, ingen ny farvevaerdi:
   .bt-kort-betaling (groen) · .bt-kort-refundering (roed) ·
   .bt-kort-komigang (blaa) · topbjaelken .bt-top-app staar fast paa
   pc, og menuen rykker ned under den · .bt-offentlig .bt-o-felt-fejl
   giver nu den roede kant, stilarket lovede. Se regelfamilien
   FARVELEVERANCEN nederst i filen.

   Version 1.49 — PARTNERSYSTEMET (16. september 2026, P1 commit 4,
   BASETOOLS_AFSAETNING_AFFILIATE.md v1.2, afsnit 4 »Stilarket«).
   FIRE additive regler, ingen gammel regel roert, :root uroert:
   body.bt-partner (»Stoevet blaa« paa de otte interne farvenavne —
   Admins partnerskaerme, F2) · .bt-badge-advarsel · .bt-flueben
   input[type="radio"] · .bt-tabel-taet. Se regelfamilien
   PARTNERSYSTEMET nederst i filen. Farverne er temaet »Stoevet
   blaa« fra .bt-offentlig.bt-tema-blaa, maalt og kontrastregnet i
   tegningens del 1, afsnit 7 — ingen ny farvevaerdi.

   Version 1.48 — MENUEN (16. september 2026, BASETOOLS_AFSAETNING_MENU.md).
   Menuen staar fast paa pc, mens man ruller, og er 224 px bred, saa
   intet menupunkt brydes. Paa mobil er striben erstattet af ☰ Menu i en
   topbjaelke, der staar fast. Se regelfamilien MENUEN nederst i filen.
   Én eksisterende regel er roert (.bt-sidenav: 200 -> 224 px), og
   mobilblokkens stribe er slettet. :root er uroert, ingen ny farve.

   Version 1.47 — HJAELPEBJAELKEN (15. september 2026, commit 3).
   ÉN ny additiv regelfamilie: .bt-hjaelp-maerke og det, der hører
   til det — »?« i kortets hjørne og den faste bjælke i bunden, som
   det folder ud. INGEN eksisterende regel er roert, :root er uroert,
   og der er ingen ny farveværdi. Se regelfamiliens egen kommentar
   nederst i filen.

   Version 1.46 — HJAELPESIDEN KAN LAESES (14. september 2026,
   hjaelpeteksten). ÉN ny regelfamilie: .bt-hjaelp og
   .bt-hjaelp-krop. INGEN eksisterende regel er roert, :root er
   uroert, og der hentes intet udefra.
   🔴 HVORFOR DEN KOM: foerste udgave af hjaelpesiden brugte kun
   eksisterende klasser, som afsaetningen foreskrev. Mikael saa paa
   resultatet 14/9: manualens 97 KB proesa loeb i ca. 800 px brede
   linjer, og alt vejede det samme, fordi teksten bruger fed 684
   gange. Hans ord: »saa kedeligt som et worddokument skrevet af en
   100-aarig professor«. En hjaelpeside ER laesning — linjelaengde
   er ikke pynt, det er om teksten kan laeses.
   ⚠️ REGLERNE RAMMER KUN INDE I .bt-hjaelp. Ingen anden skaerm i
   huset kan se dem.
   ⚠️ LAESEBREDDEN LIGGER PAA KROPPEN, IKKE PAA KORTET: laa den paa
   <details>, ville de fjorten sammenfoldede linjer blive smallere
   end kortet, de staar i.

   🔴 ANDEN RUNDE SAMME DAG — Mikael saa igen: »der er MEGET tekst
   der ned ad og ingen farver til at fastholde liv i siden«. Tre ting
   kom til, og INGEN af dem er pynt:
   · .bt-hjaelp-gor — manualens »Saadan goer du«-afsnit. Der er 69 af
     dem, og tekstens egen regel siger, at hvert afsnit skal slutte
     med, hvordan man goer. Det er DET, en kunde leder efter, naar
     hun er koert fast. Nu er de husets orange og kan ses, mens man
     ruller — man behoever ikke laese alt for at finde dem.
   · .bt-hjaelp-nr — sidetallet som et maerke, saa de fjorten linjer
     har et fast holdepunkt i venstre kant.
   · code inde i hjaelpen. Huset stylede den ikke i forvejen, og
     manualen bruger den 19 gange til adresser som basetools.dk/book.
   ⚠️ FARVERNE ER HUSETS EGNE. Ingen ny vaerdi, :root er uroert.

   Version 1.45 — HOLDENE FOLDES IND (7. september 2026,
   holdtilmeldingen). Fire nye OFFENTLIGE regler: .bt-o-hold >
   summary (+ :focus-visible), .bt-o-hold-navn og .bt-o-hold-fakta.
   Den offentlige holdside viste hvert hold udfoldet med alle sine
   datoer; med fem hold skulle Kunde B scrolle laenge for at finde
   det, hun kom efter. Nu er holdene <details>, og hele <summary> er
   udfoldningen — navn, pris, antal gange og foerste dato.
   REN HTML, INGEN JAVASCRIPT, ingen nye farver, ingen nye tokens.
   ⚠️ ÉT HOLD STAAR FOLDET UD: med ét hold er der intet at overskue.

   Version 1.44 — VALG AF TILMELDINGSFORM (7. september 2026,
   holdtilmeldingen). TRE nye interne regler: .bt-tilmeldingsvalg,
   .bt-tilmeldingsvalg-et og .bt-tilmeldingsvalg-navn.
   🔴 EN FJERDE, -aktiv, BLEV SKREVET OG FJERNET IGEN SAMME DAG: den
   farvede det valgte kort, men farven kom fra serveren og kendte kun
   den GEMTE vaerdi, mens radioknappen fulgte klikket. De to pegede
   paa hver sit kort. Radioknappen viser valget selv.
   Kunde A's tre valg af, hvordan et hold
   maa tilmeldes, tegnes som stablede kort med en rigtig radioknap i
   hvert. Hvert kort baerer navn OG forklaring, fordi valget ellers
   ikke kan traeffes uden at gaette.
   INGEN NYE FARVER OG INGEN NYE TOKENS — kant, aktiv baggrund og
   afstande er husets egne. Reglerne er INTERNE.

   Version 1.43 — HERO'EN I TO SPALTER PAA PC (6. september
   2026). En min-width-regel; telefonen er uroert.
   Version 1.42 — LOEFTESTRIBEN (6. september 2026). Én ny
   regel-familie: .bt-o-loefter. :root er urørt, intet hentes udefra.
   Version 1.41 — FODEN CENTRERES (6. september 2026, fod-rettelsen).
   Én ny regel: .bt-offentlig .bt-o-fod. Foden arvede brødtekstens
   læselængde på 62 tegn og lå derfor i venstre kant med sin egen
   tekst centreret inde i en for smal kasse. Ingen eksisterende
   regel er rørt, :root er urørt, og der hentes intet udefra.
   Version 1.40 — SKÆRMBILLEDERNE PÅ SALGSSIDEN (5. september 2026,
   designleverancen commit 4). Tre klasser: bt-o-skaerm (rammen om
   et skærmbillede), bt-o-skaerm-telefon (telefonen, der ikke må
   strækkes ud over sine egne 390 px) og bt-o-medie (tekst ved
   siden af et billede, én spalte under 900 px). :root er urørt,
   og der hentes intet udefra — de fire billeder er filer i huset.
   Version 1.39 — SALGSSIDENS BÅND OG PRISKORT (5. september 2026,
   designleverancen commit 3). Forsiden gik fra fire ens kort til
   otte bånd med skiftende bund, og prislisten fra en strakt tabel
   til fire kort. Klasserne bor under bt-o-baand-, bt-o-modulkort-
   og bt-o-priskort-. :root er urørt, intet hentes udefra, og
   .bt-o-side og .bt-o-blok er IKKE rørt — kundens bookingside og
   de tre juridiske sider bruger dem uændret.
   Version 1.38 — TOPBJÆLKEN PÅ DE OFFENTLIGE SIDER (5. september
   2026, designleverancen commit 2b). Fem nye klasser under bt-o-top-.
   :root er urørt, og der hentes intet udefra.
   Version 1.37 — LOGOET ERSTATTER BOGSTAVET (5. september 2026,
   designleverancen commit 2a). `.bt-logo` var et B tegnet i CSS:
   en orange 32×32-flade med et navy bogstav centreret i. Den er nu
   en ramme om `public/img/logo.svg`, husets rigtige mærke. Reglen
   beholder sin plads i det INTERNE lag, fordi den bruges af
   app.php og login.php — begge uden for lag 2. :root er urørt, og
   der hentes intet udefra: SVG'en er en fil i huset.
   ⚠️ MÆRKET ER IKKE KVADRATISK. Konturen er 562×380, altså 1,48:1,
   så bredden er `auto` og højden styrer. En fast 32×32 ville
   klemme det sammen.
   Version 1.36 — HUSKELISTEN »KOM GODT I GANG« (5. september 2026).
   Et nyt afsnit med fem klasser under bt-kig-. Ingen eksisterende
   regel er rørt, og :root er urørt: farverne kommer fra de tokens,
   der allerede findes. Listen er bevidst bygget uden ikoner og uden
   JavaScript — et flueben og en tom cirkel er tegn, ikke billeder.
   Version 1.35 — »MANGLER«-KORTET FÅR SAMME BREDDE SOM DAGEN
   (3. september 2026, dashboardleverancen del 3). Kortet viser de
   samme linjer og den samme klasseliste som »I dag« og bærer det
   samme arbejde — så det får den samme dobbelte spaltebredde over
   800 px. Ingen andre regler er rørt: linjen, gruppen, klasselisten
   og deltagerkortet er allerede skrevet uden binding til ét kort.
   Version 1.34 — ARTEN BÆRES AF FLADEN (2. september 2026, Mikaels
   tredje gennemsyn: »kan vi ikke bruge baggrundsfarver til at
   fortælle hvad der er tider og hvad der er hold - det er meget
   kompakt«).
   En tid står på kortets egen hvide flade. Et hold står på en let
   tonet flade og bærer en farvet venstrekant. Det koster INGEN
   plads — ingen mærkater, ingen ekstra ord — og forskellen ses,
   før man har læst noget.
   §23 ER HOLDT: farven er ikke ENESTE bærer. Handlingskolonnen
   siger det samme — en tid har en rulleliste, et hold har
   »Deltagere« — og fladen lægger sig ovenpå som en genvej for
   øjet, ikke som den eneste oplysning.
   OG DET LØSER OVERBLIKKET: når et hold foldes ud, bliver hele
   blokken — linje, deltagere og Gem-knap — ÉT tonet område. Man
   kan se, hvor holdet slutter, og hvor dagen fortsætter. Før løb
   seks deltagerlinjer sammen med resten af dagen, og man mistede
   den af syne, mens man markerede.
   LINJERNE ER STRAMMET: mindre luft og et tyndere skel, så fire
   aftaler fylder en fjerdedel af skærmen i stedet for en halv.
   ⚠️ ET FUND, DER KUN KUNNE SES I BROWSEREN (mønster 15): med TO
   hold foldet ud stod de som ét langt tonet felt, delt af en
   hårstreg — og så var fladen holdt op med at fortælle noget. En
   udfoldet gruppe har derfor luft over og under og den orange kant
   hele vejen rundt. Kilden var korrekt begge gange; billedet var
   det ikke.

   Version 1.33 — dagens liste får FASTE KOLONNER (2. september 2026,
   efter Mikaels anden gennemsyn: »det blev faktisk ikke meget bedre
   ... det er stadig uoverskueligt«).
   v1.32 rettede ORDENE og FARVERNE, men ikke STRUKTUREN, og det var
   strukturen, der var galt: linjen var en flexlinje med ombrydning,
   så styringen hoppede fra højre kant ned på sin egen linje, så snart
   navnet blev langt nok. To linjer i træk så forskellige ud, og øjet
   kunne ikke løbe ned ad en kolonne.
   NU ER LINJEN ET GITTER MED TRE FASTE KOLONNER: tid · hvad ·
   handling. Rullelisterne står i én lodret kolonne uanset navnenes
   længde. Under 640 px falder gitteret til én kolonne og stabler —
   dér ER en telefon.
   OG HOLDLINJEN ER SELV UDFOLDNINGEN: <summary> er hele linjen, så
   »Deltagere« står i handlingskolonnen i stedet for som en løsreven
   linje under. Det fjerner et element pr. hold og gør forskellen på
   en tid og et hold til noget, man SER i kolonnen. Derfor er
   mærkaterne »Tid« og »Hold« fjernet igen: strukturen siger det nu,
   og to mærkater på hver linje var støj, ikke oplysning.
   DELTAGEREN ER ÉN LINJE, ikke to: navn og pris til venstre, de tre
   valg til højre. Klasselisten gik fra tolv linjers højde til seks.

   Version 1.32 — forsiden kan LÆSES (2. september 2026, efter
   Mikaels gennemsyn af del 1 og 2): »det er ikke til at se forskel
   på om det er en massage eller et hold, der er alm skrift og fed
   skrift, men det gavner ikke rigtig.«
   TRE RETTELSER, hver med sin grund:
   1) KLOKKESLÆTTET får fast bredde og tabulartal, så tiderne flugter
      lodret. Før stod de i fed og skubbede navnet ud på skæve pladser.
   2) NAVNET bærer vægten i stedet. Det er det, man leder efter, når
      man scanner sin dag — ikke minuttallet.
   3) ARTEN står som et MÆRKAT MED ET ORD — »Tid« eller »Hold«. Aldrig
      som farve alene: §23's regel om, at status bæres af farve OG
      form, gælder også her, og en farvet stribe ville være ulæselig
      for en farveblind.
   OG DEN VIGTIGSTE: »IKKE MARKERET« ER IKKE LÆNGERE FREMHÆVET.
   Den stod med accentflade på hver eneste deltager, så en helt
   umarkeret liste skreg af orange — og fladen sagde »dette er valgt
   og i orden«, mens ordet betyder »jeg har ikke taget stilling«.
   Nu er den ubesluttede tilstand ROLIG, og hvert kryds, man sætter,
   springer frem: mødt på grøn statusflade, ikke mødt på accentflade.
   Begge bærer BÅDE flade, kant og ord.

   Version 1.31 — forsidens klasseliste (2. september 2026,
   dashboardleverancen del 2): et holds deltagere foldes ud under
   aftalelinjen, hver med tre valg og én fælles Gem-knap.
   PÅ EN TELEFON ER DET EN ANDEN SITUATION, og det er hele grunden
   til blokken: man står med mobilen i hånden VED holdet, ikke ved
   skrivebordet bagefter. Under 600 px bliver hver deltager sit eget
   kort med tre lige brede knapper, store nok til en tommelfinger, og
   Gem-knappen klæber til bunden af skærmen, mens listen er åben — ved
   otte deltagere skal man ellers scrolle ned for at finde den, og
   optællingen skal kunne ses samtidig med, at man trykker.
   position: sticky er den eneste virkelig nye byggeklods i hele
   leverancen; resten er stabling, som huset gør i forvejen.
   VALGENE ER RADIOKNAPPER, ikke knapper: tre gensidigt udelukkende
   valg ER en radiogruppe, og så virker tastatur og skærmlæser af sig
   selv. De TEGNES som knapper.

   Version 1.30 — forsidens aftalelinje (2. september 2026,
   dashboardleverancen del 1): dagens aftaler bærer nu tekst,
   rulleliste og knap på samme linje. På et skrivebord står de tre
   dele ved siden af hinanden; under 600 px stables de, og styringen
   får hele bredden — en rulleliste og en knap ved siden af et navn
   kan ikke være på 340 px uden at blive for små at ramme.
   REGLERNE ER INTERNE og står i den interne del af filen, ALDRIG på
   :root og aldrig under .bt-offentlig. dev/verificer_lag2.py måler
   netop den grænse: en intern regel, der lækker ud på de offentlige
   sider, ville bryde lag 2-fundamentets scoping.
   BRYDEPUNKTET 600 px ER HUSETS EGET og bruges i forvejen af lag 2.

   Version 1.29 — CTA-knappens kant (30. august 2026): husets
   vigtigste knap — »+ Opret kontakt«, »+ Opret postering«, »Opret
   sag« — havde ingen kant, og fladen alene bærer ikke UI-kravet på
   3:1: ren orange #FF6A0B er 2,87:1 mod et hvidt kort og 2,67:1 mod
   sidefladen #F5F7FA, hvor knappen ofte står, fordi den ligger OVER
   listens kort.
   FYLDET ER IKKE ÆNDRET, og det er et valg: ren orange er husets
   accent, og en mørkere flade ville flytte hele farveholdningen på
   hver eneste skærm. I stedet bærer KANTEN kravet — nøjagtig samme
   greb som .bt-btn-sekundaer har brugt siden v1.25, og med et token,
   der findes i forvejen: --bt-orange-dark #B84800. Ingen ny farve.
   MÅLT i Chromium 30/8 af dev/maal_knapper.py på Firmaer-siden:
   kanten giver 4,93:1 mod sidefladen, hvor fyldet giver 2,67:1.
   Mod hvid (5,30:1) og mod #FFE9D9 (4,52:1) er tallene REGNET ud af
   farverne og ikke aflæst på en skærm — begge er dog så langt over
   3:1, at et par hundrededele ikke ændrer noget.
   BREDDEN ER 1,5 px som sekundærens, så de to ikke driver fra
   hinanden. ⚠️ Bemærk, at Chromium rapporterer 1px som computed
   border-width ved DPR 1 — det gør den også for sekundæren, og det
   er afrunding til hele billedpunkter, ikke en fejl i reglen.
   ⚠️ KANTEN GØR KNAPPEN HØJERE: »+ Opret firma« gik fra 42 px til
   44 px, målt. Det rører spørgsmålet om, hvorvidt 44 px skal være et
   krav for knaphøjder — men det AFGØR det ikke; her flyttes ét tal,
   og beslutningen står stadig åben.

   Version 1.28 — knapperne har fået deres farve (29. august 2026):
   Seks knapper i tre filer stod som nøgen .bt-btn uden modifier og
   fik derfor browserens standardflade — 1,07:1 mod sidefladen mod
   projektets UI-krav på 3:1. De har nu -primaer eller -sekundaer,
   og der er kommet en regel for en slået fra knap; se den ved
   .bt-btn-sekundaer nedenfor. Målt af dev/maal_knapper.py.

   Version 1.27 — gruppeoverskrifterne skærpet (29. august 2026):
   v1.26's overskrifter var for stille. De brugte --bt-text-muted
   (5,95:1) og forsvandt mellem menupunkterne, som er navy og fede.
   Nu navy (15,36:1), en hårfin linje OVER hver gruppe og mere luft.
   Blå (--bt-info) blev overvejet og fravalgt: den farve betyder
   allerede »infobesked«, og en strukturel etiket må ikke låne en
   semantisk farve. Adskillelsen kommer fra FORM og ikke kun kulør.

   Version 1.26 — menuens grupper (29. august 2026, B1): ÉN ny regel,
   .bt-nav-gruppe. Menuen var én flad liste, hvor arbejdsområder og
   kontoindstillinger stod side om side; nu står de under hver sin
   dæmpede overskrift. Ingen ny farve og ingen ny afstand — reglen
   bruger --bt-text-muted (5,95:1) og de eksisterende rum-variable.
   Overskriften er en ETIKET og ikke et link: den har ingen hover,
   ingen fokusring og ingen aktiv-tilstand.

   Version 1.25 — lag 3-UX, leverance 2 (27. august 2026): TO
   ændringer. (a) .bt-btn-sekundaer får accentfladen #FFE9D9 som
   fyld — Mikaels valg 26/8, forslag B af tre. Knappen havde før
   kortets EGEN farve og var derfor usynlig som flade; kun kanten
   skilte den ud. KANTEN BLIVER STÅENDE, og det er ikke pynt:
   MÅLT i Chromium 27/8 er fyldet 1,17:1 mod kortfladen og bærer
   altså ikke UI-kravet alene — det gør kanten #8A94A8 med
   3,05:1, uændret. Navy tekst på det nye fyld er 13,10:1.
   Ændringen rører ALLE interne skærme, 14 filer.
   (b) .bt-post-* — posteringsformularens gitter med faste
   kolonner. .bt-ferie-form er URØRT: den bruges seks steder i
   fem filer, og posteringsformularen har fået sin egen klasse,
   så baseline ikke skæres i.

   Version 1.24 — hero-fotoet (20. august 2026, Trin 44): én ny
   regel, .bt-o-hero-foto. Fotoet gives som CSS-variablen
   --bt-hero-foto (inline på hero'en fra b.php), og temafarven
   lægger sig over som slør. SLØRETS 75 % ER MÅLT, IKKE VALGT
   (20/8-2026): tekstkontrasten mod blandingen af accent-fladen og
   et VILKÅRLIGT foto (værste fald: helt hvidt og helt sort) er
   beregnet for alle syv temaer — grænsen 4,5:1 rammes ved 72 %, og
   75 % holder 5,11:1 i værste fald (aften-temaet over hvidt foto).
   Browsere uden color-mix ignorerer hele reglen og viser hero'en
   som i dag — designet afhænger aldrig af fotoet.

   Version 1.23 — salgssagen (16. august 2026, leverance 3): fire
   badges til sagens tilstande (forfalden, vundet, tabt, henlagt).
   Ingen ny farve — alle fire genbruger paletpar, der allerede er i
   brug, og hver tilstand bæres af farve OG tekst. Kontrasten er
   ARVET, ikke genmålt i en browser: verificer_lag2.py måler kun
   .bt-offentlig, og de interne skærme har aldrig været målt den vej
   (mønster 15). En femte regel, .bt-sag-gruppe, blev skrevet og
   fjernet igen samme dag — se stedet, hvor den stod.

   Version 1.22 — klientforløbet (15. august 2026, leverance 2): de
   seks bt-status-* for salgsflowet er afløst af tre bt-klient-* for
   klientforløbet — aktiv, afsluttet og ikke klient. Farverne er de
   samme paletflader; kun betydningen er skiftet, fordi det er
   klientforholdet og ikke salgstrinnet, listen viser.

   Version 1.21 — beskedernes ikon (14. august 2026): tegnet står nu
   HØJRESTILLET i en fast kolonne, så afstanden til teksten er ens for
   alle fire beskedtyper. MÅLT før: 21,5 px ved »!«, 22,5 ved »i«, men
   kun 13,0 ved »✓« og »✕« — fordi tegnene er 5,7/4,7 px mod 14,3 px
   brede, mens ikonet stod venstrestillet og teksten altid samme sted.
   Udråbstegnet hang derfor løsrevet fra sin egen sætning. MÅLT efter:
   6,8 px for alle fire.

   Version 1.20 — mobil og tilgængelighed (13. august 2026): kalenderens
   celler holder 44 px i bredden på smalle skærme, brede tabeller ruller
   i deres eget kort i stedet for at skubbe hele siden, undermenuen
   bliver vandret sammen med hovedmenuen, og .bt-kun-oplaest giver
   skærmlæsere rigtig tekst i stedet for aria-label på et <span>.
   Alle fire er MÅLT i Chromium ved 360/390/414/430 px — se hver regel.

   Version 1.19 — lag 2 (august 2026): holdsidens fulde afholdelse
   (.bt-o-valgkort-lukket). Samme princip som kalenderens lukkede
   dag: tilstanden bæres af BÅDE form og ord — stiplet kant, dæmpet
   tekst, ingen markør, og elementet er et <span>, ikke et <a>, så
   der ikke kan trykkes forgæves. Teksten »Kan ikke vælges« står ved
   siden af mærkatet, så beskeden aldrig hviler på farve alene (§23,
   forbudsregel 3). Ingen ny farve — genbruger de tokens, kortet og
   mærkaterne allerede bruger.
   Version 1.18 — lag 2 (august 2026): månedskalenderen på
   bookingsidens trin 2 (.bt-o-kal-*). Tre dagtilstande, hver
   båret af BÅDE flade og form: ledig = kortflade med kant og
   et <a>, lukket/optaget = sideflade uden kant og UDEN link
   (kan ikke klikkes forgæves). Designets tredje tilstand
   »valgt« er IKKE bygget: trinnet foldes sammen i samme
   øjeblik en dato vælges, så ingen dag kan stå som valgt —
   en regel, der aldrig kan rammes, står ikke i filen.
   Ingen ny farve — MÅLT 11/8-2026 i alle syv temaer: dæmpet
   tekst på sidefladen 5,51-8,10:1, kanten mod kortfladen
   3,05-3,67:1.
   Version 1.17 — lag 2 (august 2026): .bt-o-besked bruger normalt
   tekstflow med absolut placeret ikon — display:flex gjorde hvert
   inline-element til et flex-item og indsatte mellemrum i teksten.
   Version 1.16 — lag 2 (august 2026): .bt-o-hero-alene — hero'en
   som sidens midte, når profilen ellers er tom.
   Version 1.15 — lag 2-UX (august 2026): tokens, syv temaer og
   komponentklasser til de OFFENTLIGE sider (b.php, book.php,
   hold.php, opret.php) — ALT scopet under .bt-offentlig.
   :root og de interne skærme er urørte.
   Version 1.14 — Trin 22 (august 2026): undermenu i sidemenuen
   (.bt-subnav) — modulernes undersider er altid synlige.
   Version 1.13 — Trin 12 (august 2026): fluebensfelt (.bt-flueben)
   til aflysningsvilkårene — boks og tekst på samme linje.
   Version 1.12 — Trin 11 (august 2026): økonomi (sumtal, aktiv
   årsrække) og statusskift-formular i kalenderen.
   Version 1.11 — Trin 20 (august 2026): notattype-badges
   (journal/notat på kontaktens notatliste).
   Version 1.10 — Trin 9 (august 2026): kalender for Kunde A
   (ugegrid, dagceller, bookingstatus-badges, oversigtsfaner).
   Version 1.9 — Trin 8 (august 2026): offentlig bookingside
   (valgliste, tidsslots). Redesignes i Fase 4 (§23, lag 2).
   Version 1.8 — Trin 18 (august 2026): sammenklappelig sektion
   (bt-detaljer) til inaktive ydelser.
   Version 1.7 — Trin 17 (august 2026): farezone (GDPR-sletning)
   og printregler til dataudtrækket.
   Version 1.6 — Trin 7 (august 2026): åbningstidstabel og
   ferieformular (booking-indstillinger).
   Version 1.5 — Trin 16 (august 2026): textarea og notatkort
   (journalen) tilføjet.
   Version 1.4 — Trin 6 (august 2026): select-felter (statusflow
   og statusfilter) stylet som inputfelter.
   Version 1.3 — Trin 5 (august 2026): feltfejl og smalle
   formularkort tilføjet.
   Version 1.2 — Trin 4 (august 2026): værktøjslinje, statusbadges
   for CRM-statusflowet og paginering tilføjet.
   Version 1.1 — Trin 3 (august 2026): shell-layout og sidemenu
   tilføjet (bt-shell, bt-sidenav, bt-indhold, bt-kort-grid).
   Version 1.0 — Trin 2 (august 2026)

   PALETTEN ER LÅST og alle kontrasttal er BEREGNEDE (6/8-2026):
   - Navy på hvid: 15,36:1  |  Orange på navy: 5,35:1
   - Navy tekst på orange: 5,35:1  |  Orange på hvid: 2,87:1 = FORBUDT
   - Mørk orange på hvid: 5,30:1 (links/fokus)
   Regler: ren orange (#FF6A0B) må ALDRIG stå som tekst, link eller
   ikon på lys baggrund. CTA-knapper er orange flade med NAVY tekst.
   Status bæres altid af farve OG form/tekst — aldrig farve alene.
   ============================================================ */

:root {
    /* Brandfarver */
    --bt-navy:         #1C243C;   /* brødtekst, primær knap, mørke flader */
    --bt-orange:       #FF6A0B;   /* accent: på navy, eller flade m. navy tekst */
    --bt-orange-dark:  #B84800;   /* links, fokusring, orange tekst på lyst (5,30:1) */
    --bt-orange-bg:    #FFE9D9;   /* bleg accentflade (navy tekst: 13,10:1) */

    /* Neutrale */
    --bt-bg:           #F5F7FA;   /* sidebaggrund */
    --bt-card:         #FFFFFF;   /* kort og paneler */
    --bt-border:       #D8DEE4;   /* dekorative skillelinjer — IKKE inputfelter */
    --bt-border-input: #8A94A8;   /* inputkanter (3,05:1 — opfylder UI-kravet) */
    --bt-text:         #1C243C;
    --bt-text-muted:   #5A6478;   /* dæmpet tekst (5,95:1) */

    /* Status: tekstfarve (>=4,5:1 på hvid) + bleg flade (navy tekst >=12:1) */
    --bt-success:      #1D7A46;   --bt-success-bg: #E4F3EA;
    --bt-warning:      #8A5800;   --bt-warning-bg: #FCF0DC;
    --bt-error:        #B3261E;   --bt-error-bg:   #FBE7E5;
    --bt-info:         #1B5FAF;   --bt-info-bg:    #E4EEFA;

    /* Typografi-skala og afstande */
    --bt-font:      system-ui, -apple-system, "Segoe UI", sans-serif;
    --bt-fs-lille:  0.85rem;
    --bt-fs-normal: 0.95rem;
    --bt-fs-stor:   1.15rem;
    --bt-fs-h1:     1.35rem;
    --bt-rum-1: 0.25rem;
    --bt-rum-2: 0.5rem;
    --bt-rum-3: 1rem;
    --bt-rum-4: 1.5rem;
    --bt-radius: 8px;
}

/* ---------- grundlag ---------- */
* { box-sizing: border-box; }

body {
    font-family: var(--bt-font);
    font-size: var(--bt-fs-normal);
    margin: 0;
    background: var(--bt-bg);
    color: var(--bt-text);
    overflow-wrap: break-word;   /* lange ord/URL'er må aldrig sprænge layoutet */
    line-height: 1.5;
}

h1 { font-size: var(--bt-fs-h1); margin: 0 0 var(--bt-rum-3); }
h2 { font-size: var(--bt-fs-stor); margin: 0 0 var(--bt-rum-2); }

a { color: var(--bt-orange-dark); text-decoration: underline; text-underline-offset: 2px; }
a:hover { color: var(--bt-navy); }

/* ---------- topbjælke ---------- */
.bt-top {
    background: var(--bt-navy);
    color: #fff;
    padding: var(--bt-rum-3) var(--bt-rum-4);
    display: flex;
    align-items: center;
    gap: var(--bt-rum-2);
}
.bt-top a { color: #fff; }
/* HUSETS MÆRKE. Stod som et B i CSS indtil v1.37 — en orange flade
   med et navy bogstav. Nu er det logo.svg, som er orange paa
   gennemsigtig bund og derfor staar direkte paa den navy topbjaelke
   uden en flade under sig. Hoejden styrer; bredden foelger med,
   fordi konturen er 1,48:1 og ikke kvadratisk.                    */
.bt-logo {
    height: 28px; width: auto;
    display: block;
    flex: none;
}
.bt-top .bt-accent { color: var(--bt-orange); }  /* orange tekst KUN på navy */

/* ---------- layout ---------- */
.bt-main   { max-width: 960px; margin: var(--bt-rum-4) auto; padding: 0 var(--bt-rum-3); }
.bt-smal   { max-width: 420px; }
.bt-kort {
    background: var(--bt-card);
    border: 1px solid var(--bt-border);
    border-radius: 10px;
    padding: var(--bt-rum-4);
    margin-bottom: var(--bt-rum-3);
}

/* ---------- knapper ---------- */
.bt-btn {
    display: inline-block;
    border: 0;
    border-radius: var(--bt-radius);
    padding: 0.6rem 1.1rem;
    font-size: var(--bt-fs-normal);
    font-family: var(--bt-font);
    font-weight: 600;
    cursor: pointer;
    text-decoration: none;
}
.bt-btn-primaer   { background: var(--bt-navy);   color: #fff; }
.bt-btn-cta       { background: var(--bt-orange); color: var(--bt-navy); border: 1.5px solid var(--bt-orange-dark); }  /* ALDRIG hvid tekst her · KANTEN bærer UI-kravet, se v1.29 */
.bt-btn-sekundaer { background: var(--bt-orange-bg); color: var(--bt-navy); border: 1.5px solid var(--bt-border-input); }

/* En SLÅET FRA knap — tilføjet 29/8-2026.
   HVORFOR DEN ER NØDVENDIG: .bt-btn sætter hverken baggrund eller
   tekstfarve, så en knap uden modifier fik browserens standardflade,
   og browseren dæmpede den SELV med alfa, når den var slået fra
   (målt: rgba(16,16,16,0.3)). I samme leverance fik alle knapper en
   modifier — og dermed en rigtig baggrund, som overskriver netop den
   dæmpning. Uden reglen her ville en knap, man IKKE kan trykke på,
   se ud som en, man kan. Systemets eneste slåede fra knapper er
   profilsidens to flytteknapper.
   FORMEN ER HUSETS EGEN: .bt-offentlig .bt-o-btn[disabled] har brugt
   opacity .55 siden lag 2. Samme tal her, så de to sider af huset
   ikke driver fra hinanden.
   aria-disabled er med, fordi en knap tegnet som <a> ikke kan bære
   attributten disabled. */
.bt-btn[disabled],
.bt-btn[aria-disabled="true"] {
    opacity: .55;
    cursor: not-allowed;
}
.bt-btn:focus-visible,
input:focus-visible { outline: 3px solid var(--bt-orange-dark); outline-offset: 1px; }

/* ---------- formularer ---------- */
.bt-felt { margin-bottom: var(--bt-rum-3); }
.bt-felt label { display: block; font-weight: 600; margin-bottom: var(--bt-rum-1); }
.bt-felt input,
.bt-felt select,
.bt-felt textarea {
    width: 100%;
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: 0.55rem 0.7rem;
    font-size: var(--bt-fs-normal);
    font-family: var(--bt-font);
    background: var(--bt-card);
    color: var(--bt-text);
}
.bt-felt textarea { resize: vertical; min-height: 90px; }

/* Fluebensfelt (Trin 12): checkbox og tekst på SAMME linje.
   .bt-felt strækker inputs til 100 % bredde — det giver en boks,
   der svæver alene midt i kortet. Her låses boksen til fast mål
   og lægges på linje med teksten. */
.bt-flueben label {
    display: flex;
    align-items: center;
    gap: var(--bt-rum-1);
    margin-bottom: 0;
}
.bt-flueben input[type="checkbox"] {
    width: 1.1rem;
    height: 1.1rem;
    margin: 0;
    flex: none;
}
select:focus-visible,
textarea:focus-visible { outline: 3px solid var(--bt-orange-dark); outline-offset: 1px; }

/* ---------- booking-indstillinger (Trin 7) ---------- */
.bt-tid-tabel input[type="time"] {
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: 0.35rem 0.5rem;
    font-size: var(--bt-fs-normal);
    font-family: var(--bt-font);
}
.bt-tid-tabel input[type="checkbox"] { width: 1.1rem; height: 1.1rem; }
.bt-ferie-form {
    display: flex;
    gap: var(--bt-rum-3);
    align-items: flex-end;
    flex-wrap: wrap;
    margin-bottom: var(--bt-rum-3);
}
.bt-ferie-form .bt-felt { margin-bottom: 0; }
.bt-ferie-form input[type="date"] {
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: 0.45rem 0.6rem;
    font-size: var(--bt-fs-normal);
    font-family: var(--bt-font);
}

/* ---------- posteringsformularen (lag 3-UX, leverance 2) ----------
   FASTE kolonner, ikke en flex-række med max-width/min-width pr.
   felt. Den gamle .bt-ferie-form ombrød forskelligt ved hver
   vinduesbredde, fordi hvert felt havde sit eget mål — det var
   årsagen til Mikaels note »felterne hopper rundt« (10/8, §23).
   To kolonner fra 640 px, én under. .bt-post-bred lægger et felt
   over begge kolonner. */
.bt-post-typer {
    display: flex;
    flex-wrap: wrap;
    gap: var(--bt-rum-2);
    margin-bottom: var(--bt-rum-3);
}
.bt-post-gitter {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--bt-rum-3);
    align-items: start;
    margin-bottom: var(--bt-rum-3);
}
.bt-post-gitter .bt-felt { margin-bottom: 0; }
.bt-post-gitter input[type="text"],
.bt-post-gitter input[type="date"],
.bt-post-gitter select {
    width: 100%;
    box-sizing: border-box;
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: 0.45rem 0.6rem;
    font-size: var(--bt-fs-normal);
    font-family: var(--bt-font);
}
.bt-post-gruppe {
    border: 1.5px solid var(--bt-border);
    border-radius: var(--bt-radius);
    padding: var(--bt-rum-3);
    margin: 0;
}
.bt-post-gruppe legend {
    padding: 0 var(--bt-rum-2);
    font-weight: 600;
}
.bt-post-gitter-indre {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--bt-rum-3);
}
@media (min-width: 640px) {
    .bt-post-gitter,
    .bt-post-gitter-indre { grid-template-columns: 1fr 1fr; }
    .bt-post-bred,
    .bt-post-gruppe,
    .bt-post-knap { grid-column: 1 / -1; }
}

/* ---------- offentlig bookingside (Trin 8) ---------- */
.bt-book-main { max-width: 720px; }
.bt-book h2 { margin-top: var(--bt-rum-4); }
.bt-valgliste { display: grid; gap: var(--bt-rum-2); grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); }
.bt-valg {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: var(--bt-rum-2) var(--bt-rum-3);
    text-decoration: none;
    color: var(--bt-navy);
    background: var(--bt-card);
}
.bt-valg:hover { background: var(--bt-bg); color: var(--bt-navy); }
.bt-valg-aktiv { border-color: var(--bt-orange); background: var(--bt-orange-bg); }
.bt-valg-navn { font-weight: 600; }
.bt-slots { display: flex; flex-wrap: wrap; gap: var(--bt-rum-2); }
.bt-slot {
    display: inline-block;
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: 0.4rem 0.7rem;
    text-decoration: none;
    font-weight: 600;
    color: var(--bt-navy);
    background: var(--bt-card);
}
.bt-slot:hover { background: var(--bt-bg); color: var(--bt-navy); }
.bt-slot-aktiv { border-color: var(--bt-orange); background: var(--bt-orange-bg); }
.bt-book-fod { text-align: center; margin: var(--bt-rum-4) 0; }

/* ---------- kalender for Kunde A (Trin 9) ----------
   I dag markeres med form (kraftig kant) OG tekst "(i dag)" —
   aldrig farve alene. Aflyste bookinger markeres med gennemstregning
   OG dæmpet farve. */
.bt-uge-vaerktoej {
    display: flex;
    align-items: center;
    gap: var(--bt-rum-2);
    flex-wrap: wrap;
    margin-bottom: var(--bt-rum-3);
}
.bt-uge-grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: var(--bt-rum-2);
}
.bt-dag {
    background: var(--bt-card);
    border: 1px solid var(--bt-border);
    border-radius: var(--bt-radius);
    padding: var(--bt-rum-2);
    min-height: 110px;
    min-width: 0;                        /* lange navne må ikke sprænge griddet */
}
.bt-dag-lukket { background: var(--bt-bg); }
.bt-dag-idag   { border: 2px solid var(--bt-orange); }   /* + tekst "(i dag)" */
.bt-dag-valgt  { background: var(--bt-orange-bg); }
.bt-dag-hoved {
    display: block;
    font-weight: 600;
    color: var(--bt-navy);
    text-decoration: none;
    margin-bottom: var(--bt-rum-1);
}
.bt-dag-hoved:hover { text-decoration: underline; color: var(--bt-navy); }
.bt-dag-hoved:focus-visible { outline: 3px solid var(--bt-orange-dark); outline-offset: 1px; }
.bt-dag-idag-tekst { color: var(--bt-orange-dark); font-size: var(--bt-fs-lille); }
.bt-dag-booking {
    display: block;
    font-size: var(--bt-fs-lille);
    border-left: 3px solid var(--bt-info);
    padding-left: 0.4rem;
    margin: 0.35rem 0;
    overflow-wrap: anywhere;
}
.bt-dag-booking-aflyst {
    border-left-color: var(--bt-border-input);
    color: var(--bt-text-muted);
    text-decoration: line-through;
}
.bt-fane-aktiv {                          /* aktiv fane i oversigten */
    display: inline-block;
    padding: 0.6rem 1.1rem;
    border-radius: var(--bt-radius);
    background: var(--bt-navy);
    color: #fff;
    font-weight: 600;
}
@media (max-width: 768px) {
    /* smalle skærme: ugen vises som én kolonne, dagene under hinanden */
    .bt-uge-grid { grid-template-columns: 1fr; }
    .bt-dag { min-height: 0; }
}

/* ---------- bookingstatus-badges (Trin 9) ----------
   Status bæres af farve OG tekst — aldrig farve alene. */
.bt-status-booket      { background: var(--bt-info-bg);    color: var(--bt-info); }
.bt-status-gennemfoert { background: var(--bt-success-bg); color: var(--bt-success); }
.bt-status-udeblevet   { background: var(--bt-warning-bg); color: var(--bt-warning); }
.bt-status-aflyst      { background: #EEF0F4;              color: var(--bt-text-muted); }

/* ---------- sammenklappelig sektion (Trin 18: inaktive ydelser) ---------- */
.bt-detaljer { margin-top: var(--bt-rum-3); }
.bt-detaljer summary {
    cursor: pointer;
    font-weight: 600;
    color: var(--bt-text-muted);
    padding: var(--bt-rum-2) 0;
}
.bt-detaljer summary:hover { color: var(--bt-navy); }
.bt-detaljer summary:focus-visible { outline: 3px solid var(--bt-orange-dark); outline-offset: 1px; }
.bt-detaljer[open] summary { color: var(--bt-navy); }

/* ---------- GDPR: farezone og print (Trin 17) ---------- */
.bt-farezone {
    border: 1.5px solid var(--bt-error);
    border-radius: var(--bt-radius);
    background: var(--bt-error-bg);
    padding: var(--bt-rum-3);
    margin-top: var(--bt-rum-3);
}
.bt-farezone h3 { margin: 0 0 var(--bt-rum-2); color: var(--bt-error); font-size: var(--bt-fs-normal); }
.bt-btn-fare { background: var(--bt-error); color: #fff; }   /* hvid på #B3261E: over 4,5:1 */
.bt-farezone input[type="checkbox"] { width: 1.05rem; height: 1.05rem; }

@media print {
    /* Dataudtrækket printes rent: kun indholdet, ingen navigation */
    .bt-top, .bt-sidenav, .bt-print-skjul { display: none !important; }
    .bt-shell, .bt-indhold { display: block; padding: 0; margin: 0; max-width: none; }
    body { background: #fff; }
    .bt-kort { border: 1px solid #999; break-inside: avoid; }
}

/* ---------- økonomi (Trin 11) ----------
   Fortegn bæres af tegn (+/−) OG farve — aldrig farve alene. */
.bt-sum {
    font-size: var(--bt-fs-stor);
    font-weight: 700;
    margin: 0 0 var(--bt-rum-1);
}
.bt-sum-plus  { color: var(--bt-success); }   /* 5,35:1 på hvid */
.bt-sum-minus { color: var(--bt-error); }     /* 6,54:1 på hvid */
.bt-raekke-aktiv td { background: var(--bt-orange-bg); }

/* statusskift i kalenderens dagsdetaljer (Trin 11) */
.bt-statusskift {
    display: flex;
    gap: 0.35rem;
    align-items: center;
}
.bt-statusskift select {
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: 0.35rem 0.5rem;
    font-size: var(--bt-fs-lille);
    font-family: var(--bt-font);
    background: var(--bt-card);
    color: var(--bt-text);
}
.bt-statusskift .bt-btn {
    padding: 0.35rem 0.7rem;
    font-size: var(--bt-fs-lille);
}

/* ---------- notattype-badges (Trin 20) ----------
   Type bæres af farve OG tekst — aldrig farve alene. */
.bt-notattype-journal { background: var(--bt-info-bg);   color: var(--bt-info); }
.bt-notattype-notat   { background: var(--bt-orange-bg); color: var(--bt-navy); }

/* ---------- notater/journal (Trin 16) ---------- */
.bt-notat {
    border-top: 1px solid var(--bt-border);
    padding: var(--bt-rum-2) 0;
    margin-top: var(--bt-rum-2);
}
.bt-notat-dato {
    color: var(--bt-text-muted);
    font-size: var(--bt-fs-lille);
    font-weight: 600;
    margin: 0 0 var(--bt-rum-1);
}
.bt-notat-tekst { margin: 0; white-space: normal; }

/* Statusfilter i værktøjslinjen (Trin 6) */
.bt-vaerktoej select {
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: 0.55rem 0.7rem;
    font-size: var(--bt-fs-normal);
    font-family: var(--bt-font);
    background: var(--bt-card);
    color: var(--bt-text);
}

/* ---------- beskeder (farve + symbol + tekst — aldrig farve alene) ---------- */
.bt-besked {
    border-radius: var(--bt-radius);
    padding: 0.6rem 0.8rem;
    margin: var(--bt-rum-2) 0;
    font-size: var(--bt-fs-lille);
}
.bt-besked b { white-space: nowrap; }
/* Undtagelsen (23/9-2026): en lang fed saetning skal kunne bryde, ellers
   bliver siden bredere end telefonen (Konto og data, 452 px ved 390). */
.bt-besked b.bt-bryd { white-space: normal; }
.bt-besked-ok      { background: var(--bt-success-bg); } .bt-besked-ok b      { color: var(--bt-success); }
.bt-besked-advarsel{ background: var(--bt-warning-bg); } .bt-besked-advarsel b{ color: var(--bt-warning); }
.bt-besked-fejl    { background: var(--bt-error-bg); }   .bt-besked-fejl b    { color: var(--bt-error); }
.bt-besked-info    { background: var(--bt-info-bg); }    .bt-besked-info b    { color: var(--bt-info); }

/* ---------- badges (moduler, status) ---------- */
.bt-badge {
    display: inline-flex; align-items: center; gap: 0.35rem;
    border-radius: 999px;
    padding: 0.2rem 0.65rem;
    font-size: var(--bt-fs-lille);
    font-weight: 600;
}
.bt-badge-aktiv   { background: var(--bt-success-bg); color: var(--bt-success); }
.bt-badge-inaktiv { background: #EEF0F4; color: var(--bt-text-muted); }

/* ---------- tabeller ---------- */
.bt-tabel { border-collapse: collapse; width: 100%; font-size: var(--bt-fs-normal); }
.bt-tabel th, .bt-tabel td { text-align: left; padding: 0.5rem 0.6rem; border-bottom: 1px solid var(--bt-border); }
.bt-tabel th { background: var(--bt-bg); }
@media (max-width: 768px) {
    .bt-tabel { font-size: var(--bt-fs-lille); }
    .bt-tabel th, .bt-tabel td { padding: 0.35rem 0.4rem; }
}

.bt-daempet { color: var(--bt-text-muted); font-size: var(--bt-fs-lille); }

/* ---------- tekst kun for skærmlæsere ----------
   MÅLT 13. august 2026: aria-label på et <span> UDEN rolle eksponeres
   ikke af VoiceOver og TalkBack — de læser elementets tekstindhold.
   Kalenderens lukkede dage stod med aria-label="18. august — ingen
   ledige tider" og blev læst op som bare »18«. Rigtig tekst, gemt for
   øjet men ikke for oplæsningen, virker i alle skærmlæsere.
   På et <a> eller en <button> virker aria-label derimod fint — de har
   en rolle og et tilgængeligt navn. */
.bt-kun-oplaest {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

/* ---------- shell-layout (Trin 3): sidemenu + indhold ---------- */
.bt-shell {
    display: flex;
    align-items: stretch;
    max-width: 1160px;
    margin: 0 auto;
    min-height: calc(100vh - 64px);   /* topbjælken fylder ca. 64px */
}

.bt-sidenav {
    flex: none;
    width: 224px;   /* 200 -> 224 px 16/9-2026: ved 200 px broed »Omsætningsgrænsen«,
                       »Tal til selvangivelsen« og »Booking og ydelser« over to linjer */
    padding: var(--bt-rum-3) 0;
    border-right: 1px solid var(--bt-border);
    background: var(--bt-card);
}
.bt-sidenav a {
    display: block;
    padding: 0.55rem var(--bt-rum-3);
    color: var(--bt-navy);
    text-decoration: none;
    font-weight: 600;
    border-left: 4px solid transparent;   /* aktiv markeres med form OG farve */
}
.bt-sidenav a:hover { background: var(--bt-bg); color: var(--bt-navy); }
.bt-sidenav a.bt-nav-aktiv {
    background: var(--bt-orange-bg);           /* navy på accentflade: 13,10:1 */
    border-left-color: var(--bt-orange);       /* dekorativ kant — ikke tekst */
}
.bt-sidenav a:focus-visible { outline: 3px solid var(--bt-orange-dark); outline-offset: -3px; }

/* Menuens gruppeoverskrifter (B1, 28/8-2026 · skærpet 29/8).
   FØRSTE UDGAVE VAR FOR STILLE. Den brugte --bt-text-muted (5,95:1)
   og forsvandt i mængden mellem menupunkterne, som er navy og fede.
   Mikael 29/8: forskellen skal være tydelig.

   RETTET TIL NAVY (15,36:1) PLUS EN HÅRFIN LINJE PLUS MERE LUFT.
   Blå (--bt-info, 6,36:1) blev overvejet og fravalgt: den farve
   betyder allerede »infobesked« i paletten, og en strukturel etiket
   må ikke låne en semantisk farve — så siger paletten to ting med
   én kulør. Adskillelsen kommer nu fra FORM (linje + luft) og ikke
   kun fra farve, og det holder også for en farveblind.

   Linjen står OVER overskriften, ikke under: den skiller gruppen fra
   den FORRIGE. Derfor har den første gruppe hverken linje eller
   topluft — en streg øverst i menuen ligner en fejl. */
.bt-nav-gruppe {
    margin: var(--bt-rum-4) 0 var(--bt-rum-2);
    padding: var(--bt-rum-3) var(--bt-rum-3) 0;
    border-top: 1px solid var(--bt-border);
    font-size: 0.74rem;
    font-weight: 700;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--bt-navy);
}
.bt-nav-gruppe:first-child {
    margin-top: 0;
    padding-top: 0;
    border-top: 0;
}

/* Undermenu (Trin 22): modulernes undersider vises ALTID, så brugeren
   kan se, hvad der findes, uden at scrolle eller kende systemet.
   Indrykket, lettere vægt og mindre skrift — samme aktiv-markering
   (form OG farve) som hovedpunkterne. */
.bt-subnav a {
    display: block;
    padding: 0.3rem var(--bt-rum-3) 0.3rem calc(var(--bt-rum-3) + 1rem);
    color: var(--bt-navy);
    text-decoration: none;
    font-weight: 400;
    font-size: var(--bt-fs-lille);
    border-left: 4px solid transparent;
}
.bt-subnav a:hover { background: var(--bt-bg); color: var(--bt-navy); }
.bt-subnav a.bt-nav-aktiv {
    background: var(--bt-orange-bg);           /* navy på accentflade: 13,10:1 */
    border-left-color: var(--bt-orange);       /* dekorativ kant — ikke tekst */
}
.bt-subnav a:focus-visible { outline: 3px solid var(--bt-orange-dark); outline-offset: -3px; }

.bt-indhold {
    flex: 1;
    min-width: 0;                     /* lange ord må ikke sprænge layoutet */
    padding: var(--bt-rum-4) var(--bt-rum-4);
}

/* Modulkort på dashboardet */
.bt-kort-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    gap: var(--bt-rum-3);
    margin-bottom: var(--bt-rum-3);
}
.bt-modulkort { margin-bottom: 0; }

/* ---------- formularfejl og smalle kort (Trin 5) ---------- */
.bt-feltfejl {
    color: var(--bt-error);            /* 6,54:1 på hvid */
    font-size: var(--bt-fs-lille);
    font-weight: 600;
    margin: var(--bt-rum-1) 0 0;
}
.bt-felt input[aria-invalid="true"] { border-color: var(--bt-error); }
.bt-smal-kort { max-width: 560px; }

/* ---------- valg af tilmeldingsform (holdtilmeldingen, 7/9-2026) ----------
   TRE GENSIDIGT UDELUKKENDE VALG ER EN RADIOGRUPPE, og de TEGNES som
   kort. Samme greb som dashboardets deltagerliste: markeringen er en
   rigtig <input type="radio">, saa tastatur og skaermlaeser virker af
   sig selv — kortet er kun det, oejet ser.

   ⚠️ HVERT VALG BAERER TO LINJER: navnet, og forklaringen af hvad
   kunden faktisk kommer til at se. Forklaringen er ikke pynt — den
   er hele grunden til, at Kunde A kan vaelge rigtigt uden at gaette.
   Derfor har den plads, og derfor stables kortene i stedet for at
   staa ved siden af hinanden.

   INGEN NYE FARVER: kanten, den aktive baggrund og afstandene er
   husets egne tokens. Reglen er INTERN og staar aldrig paa :root
   eller under .bt-offentlig — dev/verificer_lag2.py maaler netop
   den graense. */
.bt-tilmeldingsvalg {
    display: grid;
    gap: var(--bt-rum-2);
    margin-bottom: var(--bt-rum-3);
}
.bt-tilmeldingsvalg-et {
    display: flex;
    align-items: flex-start;
    gap: var(--bt-rum-2);
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: var(--bt-rum-3);
    background: var(--bt-card);
    cursor: pointer;
}
.bt-tilmeldingsvalg-et:hover { background: var(--bt-bg); }
.bt-tilmeldingsvalg-et input[type="radio"] {
    margin: 0.15rem 0 0;
    flex: 0 0 auto;
}
.bt-tilmeldingsvalg-et > span {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}
.bt-tilmeldingsvalg-navn { font-weight: 600; }
/* ⚠️ DER ER INGEN »AKTIV«-REGEL, OG DET ER MED VILJE. En farvet
   markering af det valgte kort kan kun saettes af SERVEREN, og saa
   kender den kun den GEMTE vaerdi — den ville staa paa ét kort,
   mens radioknappen stod paa et andet, lige indtil der blev gemt.
   Radioknappen viser valget; den behoever ingen hjaelp. */

/* ---------- værktøjslinje over lister (Trin 4) ---------- */
.bt-vaerktoej {
    display: flex;
    align-items: center;
    gap: var(--bt-rum-3);
    flex-wrap: wrap;
    margin-bottom: var(--bt-rum-3);
}
.bt-vaerktoej form {
    display: flex;
    gap: var(--bt-rum-2);
    flex: 1;
    min-width: 240px;
    max-width: 460px;
}
.bt-vaerktoej input[type="search"] {
    flex: 1;
    min-width: 0;
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    padding: 0.55rem 0.7rem;
    font-size: var(--bt-fs-normal);
    font-family: var(--bt-font);
}

/* ---------- badges for klientforløbet (leverance 2) ----------
   Afløser de seks bt-status-* fra Trin 4, som farvelagde salgsflowet
   (Lead, Tilbud sendt, Tabt ...) på behandlingsklienter. Der er nu
   tre tilstande, og de tre dækker alle rækker i kontaktlisten.
   Status bæres af farve OG tekst — aldrig farve alene. Alle
   kombinationer er blege statusflader med mørk tekst fra paletten. */
.bt-klient-aktiv     { background: var(--bt-success-bg); color: var(--bt-success); }
.bt-klient-afsluttet { background: #EEF0F4;              color: var(--bt-text-muted); }
.bt-klient-ingen     { background: var(--bt-info-bg);    color: var(--bt-navy); }

/* ---------- badges for salgssagen (leverance 3) ----------
   Samme form og samme paletpar som klientforløbets badges ovenfor —
   ingen ny farve er indført. Tilstanden bæres af farve OG tekst:
   mærkatet siger »Forfalden«, »vundet«, »tabt« eller »henlagt«, så
   beskeden aldrig hviler på farve alene (§23, forbudsregel 3).
   .bt-sag-forfalden bruger fejlparret, som beskedkomponenten
   (.bt-besked-fejl b) allerede bruger — kontrasten er dermed arvet
   fra et par, der står i paletten, ikke et nyt, der er skønnet.
   FORBEHOLD (mønster 15): kontrasten er IKKE genmålt som computed
   style i en browser. dev/verificer_lag2.py måler kun .bt-offentlig,
   så de interne skærme har aldrig været målt den vej. Skal de måles,
   er det lag 3-UX' arbejde — og så måles hele det interne stilark,
   ikke kun disse fire linjer. */
.bt-sag-forfalden { background: var(--bt-error-bg);   color: var(--bt-error); }
.bt-sag-vundet    { background: var(--bt-success-bg); color: var(--bt-success); }
.bt-sag-tabt      { background: #EEF0F4;              color: var(--bt-text-muted); }
.bt-sag-henlagt   { background: var(--bt-info-bg);    color: var(--bt-navy); }

/* Her stod .bt-sag-gruppe — en dæmpet skillelinje over sagslistens
   udaterede sager. Reglen er FJERNET 16/8-2026 sammen med selve
   rækken: den brød tabellens grammatik, hvor hver række svarer på
   Hvem · Hvad skal der ske · Hvornår, og svarede selv på ingenting.
   Rækken siger det allerede med to streger. En CSS-regel, ingen
   markup bruger, er død kode og fjernes samme dag som sin bruger. */

/* ---------- paginering (Trin 4) ---------- */
.bt-paginering {
    display: flex;
    align-items: center;
    gap: var(--bt-rum-2);
    flex-wrap: wrap;
    margin: var(--bt-rum-3) 0;
    font-size: var(--bt-fs-lille);
}
.bt-paginering a,
.bt-paginering .bt-side-aktiv {
    display: inline-block;
    padding: 0.25rem 0.6rem;
    border-radius: var(--bt-radius);
    text-decoration: none;
    font-weight: 600;
}
.bt-paginering a { color: var(--bt-navy); border: 1px solid var(--bt-border-input); background: var(--bt-card); }
.bt-paginering a:hover { background: var(--bt-bg); }
.bt-paginering .bt-side-aktiv { background: var(--bt-navy); color: #fff; }
.bt-paginering .bt-daempet { margin-left: auto; }

/* Smalle skærme. Menuen var indtil v1.48 en vandret stribe her (2.775 px
   bred ved 390 px skærm, målt 16/9-2026). Den er erstattet af ☰ Menu —
   se regelfamilien MENUEN nederst i filen. */
@media (max-width: 768px) {
    .bt-shell { display: block; }
    .bt-indhold { padding: var(--bt-rum-3); }

    /* Brede tabeller må ikke skubbe HELE siden til siden. MÅLT 13. august
       2026 i Chromium ved 360 px vindue: kontaktlisten fyldte 614 px,
       økonomioversigten 573 px og kalenderen 446 px — så topbjælke, menu
       og indhold kunne alle skubbes vandret. Kortet får nu sin egen
       rulning, og resten af siden står stille. */
    .bt-kort { overflow-x: auto; }
}

/* ------------------------------------------------------------
   KOM GODT I GANG (v1.36) — huskelisten på forsiden

   Listen skal kunne skimmes: et mærke, en linje, og under den en
   dæmpet forklaring på HVOR man gør det. Et klaret punkt bliver
   stående, men træder tilbage — en liste, der bliver kortere,
   ser til sidst tilfældig ud, og kunden mister kvitteringen for
   det, hun lige gjorde.

   ⚠️ FARVEN ER ALDRIG ALENE. Et klaret punkt bærer BÅDE et
   flueben og en dæmpet tekst; et manglende bærer en tom cirkel og
   et link. Samme regel som beskederne længere oppe i filen.
   ------------------------------------------------------------ */

.bt-kig-gruppe {
    margin: var(--bt-rum-3) 0 var(--bt-rum-1);
    font-size: var(--bt-fs-lille);
    font-weight: 700;
    color: var(--bt-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}

.bt-kig {
    list-style: none;
    margin: 0;
    padding: 0;
}

.bt-kig li {
    display: flex;
    gap: var(--bt-rum-2);
    align-items: baseline;
    padding: 0.45rem 0;
    border-top: 1px solid var(--bt-border);
}

.bt-kig li:first-child { border-top: 0; }

.bt-kig-mrk {
    flex: 0 0 1.1rem;
    text-align: center;
    font-weight: 700;
}

.bt-kig-klaret .bt-kig-mrk { color: var(--bt-success); }
.bt-kig-klaret .bt-kig-txt { color: var(--bt-text-muted); }
.bt-kig-mangler .bt-kig-mrk { color: var(--bt-border-input); }
.bt-kig-mangler .bt-kig-txt a { font-weight: 600; }

.bt-kig-hvor {
    display: block;
    color: var(--bt-text-muted);
    font-size: var(--bt-fs-lille);
}

.bt-kig-fod {
    display: flex;
    flex-wrap: wrap;
    gap: var(--bt-rum-3);
    align-items: center;
    justify-content: space-between;
    margin-top: var(--bt-rum-3);
    padding-top: var(--bt-rum-2);
    border-top: 1px solid var(--bt-border);
}

.bt-kig-optael { font-weight: 600; }

.bt-kig-skjulform { margin: 0; }

/* Skjul-knappen er en handling, man tager ÉN gang og sjældent —
   den skal kunne findes, men ikke trække blikket fra listen. */
.bt-kig-skjul {
    padding: 0.35rem 0.8rem;
    font-size: var(--bt-fs-lille);
}

/* ------------------------------------------------------------
   DAGENS LISTE (v1.33) — tre faste kolonner: tid · hvad · handling
   ------------------------------------------------------------ */
.bt-aftale {
    display: grid;
    grid-template-columns: auto 1fr auto;
    align-items: center;
    column-gap: var(--bt-rum-3);
    row-gap: var(--bt-rum-1);
    /* Strammet i v1.34: mindre luft, så dagen kan ses i ét blik */
    padding: 0.4rem var(--bt-rum-2);
    border-bottom: 1px solid var(--bt-border);
    border-left: 3px solid transparent;
}

/* ARTEN BÆRES AF FLADEN (v1.34). En TID står på kortets hvide
   flade og har en gennemsigtig venstrekant. Et HOLD står på den
   lyse accentflade med en orange kant — samme farve, huset bruger
   til »noget, der kan foldes ud og handles på«.
   Fladen ligger på HELE gruppen, ikke kun på linjen: når holdet er
   foldet ud, er linje, deltagere og Gem-knap ét sammenhængende
   område, og man kan se, hvor holdet slutter og dagen fortsætter. */
.bt-aftale-gruppe {
    border-bottom: 1px solid var(--bt-border);
    border-left: 3px solid var(--bt-orange);
    background: var(--bt-orange-bg);
}
.bt-aftale-gruppe > .bt-aftale {
    border-bottom: 0;
    border-left: 0;
    background: transparent;
}
.bt-aftale-gruppe[open] > .bt-aftale {
    border-bottom: 1px solid rgba(28, 36, 60, .10);
}
/* EN UDFOLDET GRUPPE ER EN BLOK, IKKE EN LINJE (v1.34).
   Målt i browseren 2/9: med to hold foldet ud stod de som ÉT langt
   tonet felt, kun delt af en hårstreg — og så er fladen holdt op med
   at fortælle, hvor holdet slutter. Luft over og under, og den
   orange kant hele vejen rundt om blokken, gør slutningen synlig
   uden at tilføje en eneste ny farve. */
.bt-aftale-gruppe[open] {
    margin: var(--bt-rum-2) 0;
    border-top: 1px solid var(--bt-orange);
    border-bottom-color: var(--bt-orange);
}

/* Fast bredde + tabulartal: tiderne flugter lodret, så dagen kan
   scannes i én bevægelse ned ad venstre kant. */
.bt-aftale-tid {
    min-width: 5.6rem;
    font-variant-numeric: tabular-nums;
    color: var(--bt-text-muted);
    white-space: nowrap;
}
/* Navnet bærer vægten — det er dét, man leder efter */
.bt-aftale-hvad  { min-width: 0; }
.bt-aftale-navn  { font-weight: 600; }
/* Detaljen brækker ALDRIG midt over — »150,00 kr.« må ikke blive til
   »150,00« og »kr.« på hver sin linje. Er der ikke plads, flytter hele
   detaljen ned som én enhed, og linjen bliver to etager i stedet for
   at se brækket ud. Målt i browseren 2/9. */
.bt-aftale-hvad .bt-daempet { margin-left: 0.4rem; white-space: nowrap; }

/* Handlingen ligger ALTID i samme kolonne, uanset navnets længde.
   Det var netop dét, den forrige udgave ikke kunne. */
.bt-aftale-handling { justify-self: end; white-space: nowrap; }

/* Holdlinjen ER udfoldningen. Trekanten er husets egen, ikke
   browserens standardmarkør — den skal stå i handlingskolonnen. */
.bt-aftale-gruppe > summary { cursor: pointer; list-style: none; }
.bt-aftale-gruppe > summary::-webkit-details-marker { display: none; }
.bt-aftale-folde::after { content: " \25B8"; }
.bt-aftale-gruppe[open] > summary .bt-aftale-folde::after { content: " \25BE"; }
.bt-aftale-folde { color: var(--bt-orange-dark); font-weight: 600; }
.bt-aftale-gruppe > summary:focus-visible {
    outline: 2px solid var(--bt-orange-dark);
    outline-offset: -2px;
}

@media (max-width: 640px) {
    /* Én kolonne: tid og navn øverst, styringen i fuld bredde under.
       En rulleliste og en knap ved siden af et navn kan ikke være på
       340 px uden at blive for små at ramme. */
    .bt-aftale { grid-template-columns: 1fr; }
    .bt-aftale-handling { justify-self: stretch; }
    .bt-aftale-handling select { flex: 1 1 auto; min-width: 0; }
}

/* ------------------------------------------------------------
   FORSIDENS KLASSELISTE (v1.31, omlagt i v1.33)
   ------------------------------------------------------------ */

/* Kalenderkortet får DOBBELT SPALTEBREDDE på en bred skærm.
   Grunden er målt: .bt-kort-grid er auto-fill med minmax(230px, 1fr),
   så kortet blev ~280 px bredt i et 1280 px vindue — mens to
   tredjedele af siden stod tom. En udfoldet klasseliste kan ikke være
   der. De øvrige kort er lister af korte linjer og har det fint i én
   spalte; dette ene bærer dagens arbejde. */
@media (min-width: 800px) {
    #forside-kalender,
    #forside-mangler { grid-column: span 2; }   /* v1.35: kortet også */
    /* v1.35: to dobbeltbrede kort efter hinanden efterlod et TOMT felt
       til højre for det første — målt i Chromium ved 1280 px, 3/9. Med
       dense udfyldes hullet af det næste enkeltspaltede kort (Økonomi
       eller Opfølgninger). Uden »Mangler«-kortet er der ingen huller,
       og rækkefølgen er som før. */
    .bt-kort-grid { grid-auto-flow: dense; }
}

.bt-klasseliste { padding: var(--bt-rum-2); }
.bt-klasseliste-fod { margin: var(--bt-rum-2) 0 0 0; }

/* DELTAGEREN ER ÉN LINJE (v1.33): navn og pris til venstre, de tre
   valg til højre. Før var det to linjer i en kasse med kant, og seks
   deltagere fyldte mere end hele resten af dagen. */
.bt-deltagerkort {
    display: grid;
    grid-template-columns: 1fr auto;
    align-items: center;
    column-gap: var(--bt-rum-3);
    row-gap: var(--bt-rum-1);
    padding: 0.3rem 0;
    border-bottom: 1px solid rgba(28, 36, 60, .10);
}
.bt-deltagerkort:last-of-type { border-bottom: 0; }
.bt-deltagerkort-navn { min-width: 0; }
.bt-deltager-navn { font-weight: 600; }
.bt-deltagerkort-navn .bt-daempet { margin-left: 0.4rem; white-space: nowrap; }

/* Tre gensidigt udelukkende valg. Radioknappen selv skjules for
   ØJET, men ikke for skærmlæseren og ikke for tastaturet: den
   beholder sin plads i fokusrækkefølgen, og :focus-visible tegner
   ringen på etiketten i stedet. */
.bt-deltagerkort-valg { display: flex; gap: var(--bt-rum-1); justify-self: end; }
.bt-deltagerkort-valg label {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    /* HVID flade, ikke gennemsigtig: knappen skal kunne ses som en
       knap OVENPÅ holdets tonede område, ikke smelte ind i det */
    padding: 0.3rem 0.6rem;
    border: 1.5px solid var(--bt-border-input);
    border-radius: var(--bt-radius);
    background: var(--bt-card);
    font-size: var(--bt-fs-lille);
    cursor: pointer;
    white-space: nowrap;
}
.bt-deltagerkort-valg input[type="radio"] {
    position: absolute;
    opacity: 0;
    width: 1px;
    height: 1px;
}
/* DET VALGTE BÆRES AF BÅDE FLADE, KANT OG ORD — aldrig farve alene
   (§23). Og de tre tilstande er IKKE lige meget:
     · »Mødt« og »Ikke mødt« er BESLUTNINGER og springer frem
     · »Ikke markeret« er fraværet af en beslutning og skal være
       ROLIG — ellers skriger en urørt liste af farve, og fladen
       lover en afklaring, der ikke er truffet
   Grøn er husets statusfarve og skifter aldrig med temaet. */
.bt-deltagerkort-valg label:has(input:checked) {
    border-color: var(--bt-navy);
    font-weight: 600;
}
.bt-deltagerkort-valg label:has(input[value="1"]:checked) {
    background: var(--bt-success-bg);
    color: var(--bt-success);
    border-color: var(--bt-success);
}
.bt-deltagerkort-valg label:has(input[value="0"]:checked) {
    background: var(--bt-orange-bg);
}
.bt-deltagerkort-valg label:has(input[value=""]:checked) {
    background: #EEF0F4;
    color: var(--bt-text-muted);
    border-color: var(--bt-border-input);
    font-weight: 400;
}
.bt-deltagerkort-valg label:has(input:focus-visible) {
    outline: 2px solid var(--bt-orange-dark);
    outline-offset: 2px;
}

.bt-klasseliste-bund {
    display: flex;
    align-items: center;
    gap: var(--bt-rum-3);
    flex-wrap: wrap;
    padding: var(--bt-rum-3) 0 0 0;
}

@media (max-width: 640px) {
    /* Hvert menneske sit eget kort: navn øverst, de tre valg under i
       fuld bredde, tre lige brede. flex: 1 1 0 — 0-basis, så »Ikke
       markeret« ikke gør sin egen knap bredest. */
    .bt-deltagerkort { grid-template-columns: 1fr; }
    .bt-deltagerkort-valg { justify-self: stretch; width: 100%; }
    .bt-deltagerkort-valg label { flex: 1 1 0; }

    /* Den klæbende Gem-knap: den bliver stående i bunden af skærmen,
       mens listen er åben, så optællingen og knappen ses samtidig. */
    .bt-klasseliste-bund {
        position: sticky;
        bottom: 0;
        background: var(--bt-orange-bg);
        border-top: 1px solid var(--bt-border);
        padding: var(--bt-rum-2);
        margin: 0 calc(-1 * var(--bt-rum-2));
        flex-direction: column;
        align-items: stretch;
        gap: var(--bt-rum-1);
    }
    .bt-klasseliste-bund .bt-btn { width: 100%; }
}

/* Klæber ikke for den, der har bedt om mindre bevægelse — sticky er
   ikke en animation, men et element, der flytter sig under fingeren */
@media (prefers-reduced-motion: reduce) {
    .bt-klasseliste-bund { position: static; }
}

/* ============================================================
   LAG 2-UX — DE OFFENTLIGE SIDER (august 2026)
   Gælder b.php (profil), book.php (tidsbooking), hold.php og
   opret.php (tilmelding). Oversat fra designleverancen af 11/8.

   SCOPING ER BEVIDST (§23): lag 2-tokens defineres på
   .bt-offentlig — ALDRIG på :root. Grunden er målt: designets
   rumskala (6/12/18/28 px) afviger fra systemets (0,25/0,5/1/
   1,5 rem = 4/8/16/24 px), som bruges 48 steder af de INTERNE
   skærme. En global ændring ville flytte afstande på dashboard,
   kontaktliste, kalender, økonomi og admin uden at være bestilt.
   Den interne palet forbliver låst; temaerne rører kun de
   offentlige sider.

   TEMAER: et tema udskifter KUN otte tokens (tekst, CTA,
   CTA-tekst, link, accentflade, baggrund, dæmpet, inputkant —
   samt kortfladen i det mørke tema). Layout, typografi, runding
   og komponenter er identiske på tværs af temaer.
   Statusfarverne (grøn/gul/rød/blå) skifter ALDRIG med temaet —
   fejl og bekræftelser skal betyde det samme overalt.

   KONTRAST: alle tal er GENBEREGNET fra hex-værdierne herunder
   (11/8-2026), ikke afskrevet — 91 målinger på tværs af de syv
   temaer, nul under kravet (4,5:1 tekst / 3:1 UI). Kontrollen
   ligger i dev/verificer_lag2.py og køres igen ved ændringer.
   To fund, som designfilerne ikke gjorde eksplicitte:
   1) --bt-cta-tekst er NØDVENDIG. I de seks lyse temaer er den
      = tekstfarven, men i aftentemaet er tekstfarven lys: uden
      egen token ville CTA-knappen få 1,99:1 (lys tekst på orange)
      = brud på forbudsregel 2. Med #14181F: 7,59:1.
   3) SPECIFICITET: knapper og valgkort renderes ofte som <a>, og
      .bt-offentlig a (0,1,1) slaar en ren klasse (0,1,0). Uden
      præfikset .bt-offentlig fik CTA-knappen linkfarven — MÅLT i
      browseren: orange tekst på orange flade, og i aftentemaet lys
      tekst på orange = brud på forbudsregel 2. Derfor er de
      selektorer præfikset. Kontrollen måler nu computed style, ikke
      kun at reglen står i filen.
   2) Standardtemaets inputkant #8A94A8 holder 3,05:1 mod HVID,
      men kun 2,84:1 mod sidefladen #F5F7FA. Derfor REGEL:
      inputfelter ligger altid på kortfladen (.bt-o-blok), aldrig
      direkte på sidefladen. De øvrige seks temaer klarer begge.
   ============================================================ */

.bt-offentlig {
    /* --- farveroller (udskiftes af temaet) --- */
    --bt-navy:           #1C243C;   /* tekstfarve */
    --bt-orange:         #FF6A0B;   /* CTA-flade */
    --bt-cta-tekst:      #1C243C;   /* tekst PÅ CTA-fladen */
    --bt-orange-mork:    #B84800;   /* links, fokusring, valgt kant */
    --bt-accent-flade:   #FFE9D9;   /* bleg fremhævning */
    --bt-bg:             #F5F7FA;   /* sideflade */
    --bt-kort:           #FFFFFF;   /* kort og blokke */
    --bt-tekst-daempet:  #5A6478;   /* sekundær tekst */
    --bt-kant-input:     #8A94A8;   /* formularkanter */

    /* --- status: SAMME i alle syv temaer ---
       Statusfarver er de eneste farver, der bærer information, og
       må derfor aldrig skifte med klinikkens farvevalg. De står
       eksplicit her (ikke arvet fra :root), så blokken er
       selvbærende, og temablokkene rører dem aldrig.             */
    --bt-success:        #1D7A46;   --bt-success-flade: #E4F3EA;
    --bt-warning:        #8A5800;   --bt-warning-flade: #FCF0DC;
    --bt-error:          #B3261E;   --bt-error-flade:   #FBE7E5;
    --bt-info:           #1B5FAF;   --bt-info-flade:    #E4EEFA;

    /* --- fast på tværs af temaer --- */
    --bt-tekst:      var(--bt-navy);
    --bt-kant:       rgba(28, 36, 60, .12);
    --bt-skygge:     0 1px 2px rgba(28, 36, 60, .05);
    --bt-fokus:      3px solid var(--bt-orange-mork);
    --bt-maal-tekst: 62ch;
    --bt-tap-min:    48px;

    /* --- typografi (px: designets skala, ikke systemets rem) --- */
    --bt-skrift:  -apple-system, BlinkMacSystemFont, "Segoe UI",
                  Roboto, "Helvetica Neue", Arial, sans-serif;
    --bt-txt-sm:   15px;
    --bt-txt:      17px;
    --bt-txt-lead: 20px;
    --bt-h3:       24px;
    --bt-h2:       29px;
    --bt-h1:       clamp(35px, 4.4vw, 44px);

    /* --- rum og runding (overskriver :root INDEN FOR dette scope) --- */
    --bt-rum-1:  6px;
    --bt-rum-2: 12px;
    --bt-rum-3: 18px;
    --bt-rum-4: 28px;
    --bt-rum-5: 44px;
    --bt-rund-felt: 10px;
    --bt-rund-btn:  12px;
    --bt-rund-kort: 16px;
    --bt-rund-blok: 20px;
}

/* ---------- de seks temaer ud over standard ----------
   Rækkefølgen af tokens er ens i alle blokke, så temaerne kan
   sammenlignes linje for linje. Kortfladen står kun i det mørke
   tema, hvor den afviger fra hvid.                              */

.bt-offentlig.bt-tema-groen {
    --bt-navy:          #1E3A2F;
    --bt-orange:        #86C9A5;
    --bt-cta-tekst:     #1E3A2F;
    --bt-orange-mork:   #1F6B45;
    --bt-accent-flade:  #E2F0E7;
    --bt-bg:            #F4F8F5;
    --bt-tekst-daempet: #57685E;
    --bt-kant-input:    #7F9187;
}

.bt-offentlig.bt-tema-terracotta {
    --bt-navy:          #3A211B;
    --bt-orange:        #F0A184;
    --bt-cta-tekst:     #3A211B;
    --bt-orange-mork:   #A6432A;
    --bt-accent-flade:  #FBE7DF;
    --bt-bg:            #FAF6F4;
    --bt-tekst-daempet: #6E5A54;
    --bt-kant-input:    #9B8881;
}

.bt-offentlig.bt-tema-blaa {
    --bt-navy:          #1B2E3F;
    --bt-orange:        #7FB6D9;
    --bt-cta-tekst:     #1B2E3F;
    --bt-orange-mork:   #1C5B85;
    --bt-accent-flade:  #E3EEF5;
    --bt-bg:            #F4F7FA;
    --bt-tekst-daempet: #566573;
    --bt-kant-input:    #82919F;
}

.bt-offentlig.bt-tema-lavendel {
    --bt-navy:          #2B2440;
    --bt-orange:        #B9A5E3;
    --bt-cta-tekst:     #2B2440;
    --bt-orange-mork:   #5D3FA8;
    --bt-accent-flade:  #EDE7F8;
    --bt-bg:            #F7F5FB;
    --bt-tekst-daempet: #635C78;
    --bt-kant-input:    #908AA3;
}

.bt-offentlig.bt-tema-sand {
    --bt-navy:          #33302A;
    --bt-orange:        #E3C08A;
    --bt-cta-tekst:     #33302A;
    --bt-orange-mork:   #7A5C15;
    --bt-accent-flade:  #F3EADA;
    --bt-bg:            #FAF8F4;
    --bt-tekst-daempet: #6B6459;
    --bt-kant-input:    #96907F;
}

/* Mørkt tema: omvendt lyshedsskala. Eneste tema med egen
   kortflade — og eneste tema hvor CTA-teksten IKKE er
   tekstfarven (se fund 1 i hovedet).                            */
.bt-offentlig.bt-tema-aften {
    --bt-navy:          #E8EDF2;
    --bt-orange:        #FF8A3D;
    --bt-cta-tekst:     #14181F;
    --bt-orange-mork:   #FFB27A;
    --bt-accent-flade:  #26303C;
    --bt-bg:            #14181F;
    --bt-kort:          #1C222B;
    --bt-tekst-daempet: #A6B0BC;
    --bt-kant-input:    #6E7A8A;
    --bt-kant:          rgba(232, 237, 242, .14);
    --bt-skygge:        0 1px 2px rgba(0, 0, 0, .3);
}

/* ---------- grundlag ---------- */

.bt-offentlig {
    margin: 0;
    padding: 0;
    font-family: var(--bt-skrift);
    font-size: var(--bt-txt);
    line-height: 1.6;
    color: var(--bt-tekst);
    background: var(--bt-bg);
    -webkit-text-size-adjust: 100%;
}

.bt-offentlig *,
.bt-offentlig *::before,
.bt-offentlig *::after { box-sizing: border-box; }

.bt-offentlig :focus-visible {
    outline: var(--bt-fokus);
    outline-offset: 2px;
    border-radius: 4px;
}

.bt-offentlig a {
    color: var(--bt-orange-mork);
    text-underline-offset: 3px;
}
.bt-offentlig a:hover { text-decoration: none; }

/* ---------- sidelayout ---------- */

.bt-o-side {
    max-width: 720px;
    margin: 0 auto;
    padding: var(--bt-rum-4) var(--bt-rum-3) var(--bt-rum-5);
    display: flex;
    flex-direction: column;
    gap: var(--bt-rum-3);
}

/* Blokkene er selvstændige — rækkefølgen kan ombyttes uden at
   layoutet knækker (designprincip: blok-layout).                */
.bt-o-blok {
    background: var(--bt-kort);
    border: 1px solid var(--bt-kant);
    border-radius: var(--bt-rund-blok);
    box-shadow: var(--bt-skygge);
    padding: var(--bt-rum-4);
}

.bt-o-blok > :first-child { margin-top: 0; }
.bt-o-blok > :last-child  { margin-bottom: 0; }

/* Hero: samme blok, men accentfladen som baggrund */
.bt-o-hero {
    background: var(--bt-accent-flade);
    border-color: transparent;
}

/* Trin 44: valgfrit foto BAG hero'en. Temafarvens slør ligger over
   fotoet — 75 % er MÅLT (se version 1.24 i hovedet), så teksten
   holder mindst 5,11:1 mod et vilkårligt foto i alle syv temaer.
   Fotoet kommer som --bt-hero-foto (inline style fra b.php); uden
   variablen sættes klassen slet ikke. */
.bt-o-hero-foto {
    background-image:
        linear-gradient(
            color-mix(in srgb, var(--bt-accent-flade) 75%, transparent),
            color-mix(in srgb, var(--bt-accent-flade) 75%, transparent)),
        var(--bt-hero-foto);
    background-size: cover;
    background-position: center;
}

/* Er hero'en alene på siden (en næsten tom profil), bliver den sidens
   midte i stedet for en indledning: centreret, med mere luft. Designets
   pointe er at SKIFTE MÅL frem for at fylde ud. */
.bt-o-hero-alene {
    text-align: center;
    padding: var(--bt-rum-5) var(--bt-rum-4);
}
.bt-o-hero-alene p { margin-left: auto; margin-right: auto; }
.bt-o-hero-alene .bt-o-knapper { justify-content: center; }

/* ---------- typografi ---------- */

.bt-offentlig h1,
.bt-offentlig h2,
.bt-offentlig h3 {
    line-height: 1.25;
    margin: 0 0 var(--bt-rum-2);
    font-weight: 700;
}
.bt-offentlig h1 { font-size: var(--bt-h1); letter-spacing: -0.01em; }
.bt-offentlig h2 { font-size: var(--bt-h2); }
.bt-offentlig h3 { font-size: var(--bt-h3); }

.bt-offentlig p { margin: 0 0 var(--bt-rum-2); max-width: var(--bt-maal-tekst); }

.bt-o-lead    { font-size: var(--bt-txt-lead); }
.bt-o-sm      { font-size: var(--bt-txt-sm); }
.bt-o-daempet { color: var(--bt-tekst-daempet); }

/* ---------- knapper ----------
   CTA-reglen er ens i alle temaer: lys accentflade med den mørke
   tekstfarve ovenpå og en kant i den mørke accent. Ingen knap har
   lys tekst på kulørt flade.                                     */

.bt-o-knapper {
    display: flex;
    flex-wrap: wrap;
    gap: var(--bt-rum-2);
    align-items: center;
}

.bt-offentlig .bt-o-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--bt-rum-1);
    min-height: var(--bt-tap-min);
    padding: var(--bt-rum-2) var(--bt-rum-4);
    border-radius: var(--bt-rund-btn);
    border: 2px solid transparent;
    font: inherit;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
    background: none;
    color: var(--bt-tekst);
}

.bt-offentlig .bt-o-btn-cta {
    background: var(--bt-orange);
    border-color: var(--bt-orange-mork);
    color: var(--bt-cta-tekst);
}
.bt-offentlig .bt-o-btn-cta:hover { filter: brightness(0.96); }

.bt-offentlig .bt-o-btn-sek {
    background: var(--bt-kort);
    border-color: var(--bt-kant-input);
    color: var(--bt-tekst);
}
.bt-offentlig .bt-o-btn-sek:hover { background: var(--bt-accent-flade); }

.bt-offentlig .bt-o-btn-tekst {
    min-height: auto;
    padding: var(--bt-rum-1) 0;
    color: var(--bt-orange-mork);
    text-decoration: underline;
}

.bt-offentlig .bt-o-btn[disabled],
.bt-offentlig .bt-o-btn[aria-disabled="true"] {
    opacity: .55;
    cursor: not-allowed;
}

/* ---------- formularer ----------
   Labels OVER feltet. Felter ligger altid på kortfladen — se
   fund 2 i hovedet (standardtemaets kant holder ikke 3:1 mod
   sidefladen).                                                   */

.bt-o-felt {
    display: block;
    margin-bottom: var(--bt-rum-3);
}

.bt-o-label {
    display: block;
    margin-bottom: var(--bt-rum-1);
    font-weight: 600;
}

.bt-o-input,
.bt-offentlig input[type="text"],
.bt-offentlig input[type="email"],
.bt-offentlig input[type="tel"],
.bt-offentlig input[type="password"],
.bt-offentlig input[type="date"],
.bt-offentlig select,
.bt-offentlig textarea {
    width: 100%;
    min-height: var(--bt-tap-min);
    padding: var(--bt-rum-2);
    font: inherit;
    color: var(--bt-tekst);
    background: var(--bt-kort);
    border: 1px solid var(--bt-kant-input);
    border-radius: var(--bt-rund-felt);
}

.bt-offentlig textarea { min-height: calc(var(--bt-tap-min) * 2); resize: vertical; }

.bt-o-hjaelp {
    display: block;
    margin-top: var(--bt-rum-1);
    font-size: var(--bt-txt-sm);
    color: var(--bt-tekst-daempet);
}

/* Fejl bæres af tekst OG farve OG kant — aldrig farve alene */
.bt-o-fejl {
    display: block;
    margin-top: var(--bt-rum-1);
    font-size: var(--bt-txt-sm);
    font-weight: 600;
    color: var(--bt-error);
}
.bt-o-felt-fejl .bt-o-input,
.bt-o-felt-fejl input,
.bt-o-felt-fejl select,
.bt-o-felt-fejl textarea { border-color: var(--bt-error); border-width: 2px; }

.bt-o-flueben {
    display: flex;
    align-items: flex-start;
    gap: var(--bt-rum-2);
    padding: var(--bt-rum-2) 0;
}
.bt-o-flueben input[type="checkbox"] {
    width: 22px;
    height: 22px;
    margin: 2px 0 0;
    flex: 0 0 auto;
    accent-color: var(--bt-orange-mork);
}

/* ---------- valgbare kort og knapper ----------
   Bruges til ydelsesvalg, datoer, tider, hold og modulvalg.
   Det valgte bæres af kant + flade + tekst (aria-pressed /
   .bt-o-valgt), aldrig af farve alene.                           */

.bt-o-valg {
    display: grid;
    gap: var(--bt-rum-2);
}
.bt-o-valg-2 { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }

/* ---------- holdene foldes ind (holdtilmeldingen, 7/9-2026) ----------
   REN HTML: <details>/<summary>. Browseren folder selv, tastatur og
   skaermlaeser virker af sig selv, og der er intet, proeverne ikke
   kan se. Huset bruger allerede grebet paa Opsaetning → Booking og
   ydelser (.bt-detaljer) og paa dashboardets aftalelinjer.

   HELE LINJEN ER UDFOLDNINGEN — samme regel som dashboardets
   holdlinjer. Et separat »vis mere«-link ville vaere et element mere
   pr. hold, og oejet skal kunne loebe ned ad en kolonne.

   ⚠️ INGEN NYE FARVER OG INGEN NYE TOKENS. Trekanten er browserens
   egen: den kender selv aaben og lukket, og en hjemmelavet ville
   skulle vedligeholdes i to tilstande.
   Reglerne er OFFENTLIGE (.bt-offentlig) — de maa aldrig laekke ind
   paa Kunde A's sider, og dev/verificer_lag2.py maaler den graense. */
.bt-offentlig .bt-o-hold > summary {
    cursor: pointer;
    padding: var(--bt-rum-2) 0;
    border-radius: var(--bt-radius);
}
.bt-offentlig .bt-o-hold > summary:focus-visible {
    outline: 3px solid var(--bt-orange-dark);
    outline-offset: 2px;
}
.bt-offentlig .bt-o-hold-tekst {
    display: inline-block;
    vertical-align: top;
}
.bt-offentlig .bt-o-hold-navn {
    display: block;
    font-size: var(--bt-fs-stor);
    font-weight: 700;
    color: var(--bt-navy);
}
.bt-offentlig .bt-o-hold-fakta {
    display: block;
    color: var(--bt-text-muted);
    font-size: var(--bt-fs-lille);
}

.bt-offentlig .bt-o-valgkort {
    display: block;
    width: 100%;
    text-align: left;
    min-height: var(--bt-tap-min);
    padding: var(--bt-rum-3);
    font: inherit;
    color: var(--bt-tekst);
    background: var(--bt-kort);
    border: 2px solid var(--bt-kant-input);
    border-radius: var(--bt-rund-kort);
    cursor: pointer;
    text-decoration: none;
}
.bt-offentlig .bt-o-valgkort:hover { border-color: var(--bt-orange-mork); }

.bt-offentlig .bt-o-valgt {
    border-color: var(--bt-orange-mork);
    background: var(--bt-accent-flade);
}

/* Fuldt booket afholdelse (holdsiden, lag 2): et <span>, ikke et <a>.
   Stiplet kant + dæmpet tekst + ordene »Kan ikke vælges« — tre
   signaler, hvoraf ingen er farve. Kortet bliver stående, så
   programmet ser fyldt ud, men det kan ikke klikkes. */
.bt-offentlig .bt-o-valgkort-lukket {
    border-style: dashed;
    color: var(--bt-tekst-daempet);
    cursor: default;
    /* Fladen er BEVIDST kortfladen, ikke sidefladen. Første udkast
       satte background: var(--bt-bg) for at dæmpe kortet — MÅLT i
       Chromium 12/8-2026: kanten faldt da til 2,84:1 i standardtemaet
       (kravet er 3:1). Det er nøjagtig den fælde, §23 allerede har
       skrevet ned for formularfelter: inputkanten holder mod hvid,
       men ikke mod #F5F7FA. Reglen gælder alt med inputkant, ikke kun
       felter. Tilstanden bæres i stedet af stiplet kant + dæmpet
       tekst + ordene »Kan ikke vælges«. */
}
.bt-offentlig .bt-o-valgkort-lukket:hover { border-color: var(--bt-kant-input); }

.bt-offentlig .bt-o-valgkort[disabled],
.bt-offentlig .bt-o-valgkort[aria-disabled="true"] {
    opacity: .6;
    cursor: not-allowed;
    border-style: dashed;
}

/* Tidsknapper: tæt grid af små, tappable knapper */
.bt-o-tider {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
    gap: var(--bt-rum-2);
}
.bt-offentlig .bt-o-tider .bt-o-valgkort {
    text-align: center;
    padding: var(--bt-rum-2);
}

/* ---------- linjelister (ydelser, åbningstider, kvittering) ---------- */

.bt-o-liste {
    list-style: none;
    margin: 0;
    padding: 0;
}
.bt-o-liste > li {
    display: flex;
    flex-wrap: wrap;
    gap: var(--bt-rum-2);
    justify-content: space-between;
    align-items: baseline;
    padding: var(--bt-rum-2) 0;
    border-bottom: 1px solid var(--bt-kant);
}
.bt-o-liste > li:last-child { border-bottom: 0; }
.bt-o-liste-navn  { font-weight: 600; }
.bt-o-liste-vaerdi { color: var(--bt-tekst-daempet); white-space: nowrap; }

/* ---------- beskeder (farve + symbol + tekst) ----------
   Statusfarverne er de samme i alle syv temaer.                  */

/* Ikonet ligger ABSOLUT, ikke som flex-item. Med display:flex bliver
   hver tekstnode og hvert inline-element til sit eget anonyme
   flex-item, og gap'et skyder dem fra hinanden — »<strong>x</strong>.«
   blev til »x .« med et mellemrum foran punktummet (målt 11/8-2026).
   Almindeligt tekstflow med plads til ikonet holder markup intakt. */
.bt-o-besked {
    position: relative;
    padding: var(--bt-rum-3);
    padding-left: calc(var(--bt-rum-3) + 1.5em);
    border-radius: var(--bt-rund-felt);
    border: 1px solid;
    margin-bottom: var(--bt-rum-3);
}

/* Ikonet står i en fast kolonne og HØJRESTILLET i den. Grunden er målt
   14/8-2026: de fire tegn er vidt forskelligt brede — »✓« og »✕« fylder
   14,3 px, »!« kun 5,7 og »i« 4,7. Med et venstrestillet ikon og en fast
   tekststart blev hullet derfor 13 px ved de brede tegn og 21-22 px ved
   de smalle, så udråbstegnet hang løsrevet fra sin egen sætning.
   Højrestillet slutter alle fire tegn samme sted, og afstanden til
   teksten er 6,8 px uanset hvilken besked det er. */
.bt-o-besked::before {
    position: absolute;
    left: var(--bt-rum-3);
    top: var(--bt-rum-3);
    width: 1.1em;
    text-align: right;
    font-weight: 700;
}

.bt-o-besked-ok       { color: var(--bt-success); background: var(--bt-success-flade); border-color: var(--bt-success); }
.bt-o-besked-ok::before      { content: "✓"; }
.bt-o-besked-advarsel { color: var(--bt-warning); background: var(--bt-warning-flade); border-color: var(--bt-warning); }
.bt-o-besked-advarsel::before { content: "!"; }
.bt-o-besked-fejl     { color: var(--bt-error); background: var(--bt-error-flade); border-color: var(--bt-error); }
.bt-o-besked-fejl::before    { content: "✕"; }
.bt-o-besked-info     { color: var(--bt-info); background: var(--bt-info-flade); border-color: var(--bt-info); }
.bt-o-besked-info::before    { content: "i"; }

/* ---------- mærkater (fuldt booket, gratis, ledige pladser) ---------- */

.bt-o-maerkat {
    display: inline-flex;
    align-items: center;
    gap: var(--bt-rum-1);
    padding: 2px var(--bt-rum-2);
    border-radius: 999px;
    font-size: var(--bt-txt-sm);
    font-weight: 600;
    border: 1px solid var(--bt-kant-input);
    color: var(--bt-tekst);
    background: var(--bt-kort);
}
.bt-o-maerkat-ok    { color: var(--bt-success); background: var(--bt-success-flade); border-color: var(--bt-success); }
.bt-o-maerkat-lukket { color: var(--bt-warning); background: var(--bt-warning-flade); border-color: var(--bt-warning); }

/* ---------- trinindikator (bookingsidens firetrinsflow) ---------- */

.bt-o-trin {
    list-style: none;
    display: flex;
    flex-wrap: wrap;
    gap: var(--bt-rum-2);
    margin: 0 0 var(--bt-rum-3);
    padding: 0;
    font-size: var(--bt-txt-sm);
    color: var(--bt-tekst-daempet);
}
.bt-o-trin > li {
    display: flex;
    align-items: center;
    gap: var(--bt-rum-1);
}
.bt-o-trin > li + li::before { content: "›"; margin-right: var(--bt-rum-1); }
.bt-o-trin-aktiv { color: var(--bt-tekst); font-weight: 700; }
.bt-o-trin-klaret::after { content: " ✓"; }

/* ---------- tom tilstand og sidefod ---------- */

.bt-o-tom {
    color: var(--bt-tekst-daempet);
    font-style: normal;
}

/* FODEN MAA IKKE ARVE LAESELAENGDEN.
   Foden er et <p>, og reglen for brødtekst på de offentlige sider
   giver hvert afsnit en læselængde på 62 tegn og nul sidemargen.
   Den vejer én klasse plus ét elementnavn og slår derfor fodens
   egen ene klasse — på bredden OG på margenen. Målt i drift
   6/9-2026: foden lå 501 px bred i venstre kant med 728 px tomt
   til højre på forsiden, og dens egen luft opad blev regnet til
   0 px. Denne regel vejer to klasser og giver foden begge dele
   tilbage. Login har ikke .bt-offentlig på <body> og har derfor
   altid stået rigtigt — den røres ikke. */
.bt-offentlig .bt-o-fod {
    max-width: none;
    margin-top: var(--bt-rum-4);
}

.bt-o-fod {
    margin-top: var(--bt-rum-4);
    padding-top: var(--bt-rum-3);
    border-top: 1px solid var(--bt-kant);
    font-size: var(--bt-txt-sm);
    color: var(--bt-tekst-daempet);
    text-align: center;
}

/* ---------- månedskalender (bookingsidens trin 2) ----------
   Designets pointe: en optaget dag er IKKE en knap. Man kan
   derfor ikke klikke forgæves, og forskellen bæres af form
   (link vs. ikke-link) og ikke kun af farve (§23).
   Cellen er 52 px høj — over --bt-tap-min på 48. */

.bt-o-kal-top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--bt-rum-2);
    margin-bottom: var(--bt-rum-3);
}
.bt-o-kal-maaned {
    font-weight: 700;
    font-size: var(--bt-txt-lead);
    text-align: center;
    flex: 1 1 auto;
}

.bt-o-kal-gitter {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: var(--bt-rum-1);
}

.bt-o-kal-ugedag {
    text-align: center;
    font-size: var(--bt-txt-sm);
    font-weight: 600;
    color: var(--bt-tekst-daempet);
    padding-bottom: var(--bt-rum-1);
}

/* Fælles form for alle celler — kun fladen og kanten skifter */
.bt-offentlig .bt-o-kal-dag,
.bt-offentlig .bt-o-kal-lukket,
.bt-offentlig .bt-o-kal-blank {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 52px;
    border-radius: var(--bt-rund-felt);
    font: inherit;
    font-variant-numeric: tabular-nums;
}

/* LEDIG: kortflade, kant og et rigtigt link */
.bt-offentlig .bt-o-kal-dag {
    background: var(--bt-kort);
    border: 1px solid var(--bt-kant-input);
    color: var(--bt-tekst);
    font-weight: 600;
    text-decoration: none;
}
.bt-offentlig .bt-o-kal-dag:hover { border-color: var(--bt-orange-mork); }

/* LUKKET/OPTAGET: sidefladen, ingen kant, intet link */
.bt-offentlig .bt-o-kal-lukket {
    background: var(--bt-bg);
    border: 1px solid transparent;
    color: var(--bt-tekst-daempet);
}

/* Blanke celler før den 1. og efter den sidste */
.bt-offentlig .bt-o-kal-blank { background: none; border: 1px solid transparent; }

/* Tegnforklaring: hver tilstand med sin egen prøve OG sin tekst */
.bt-o-kal-tegn {
    display: flex;
    flex-wrap: wrap;
    gap: var(--bt-rum-3);
    margin-top: var(--bt-rum-3);
    font-size: var(--bt-txt-sm);
    color: var(--bt-tekst-daempet);
}
.bt-o-kal-tegn > span { display: inline-flex; align-items: center; gap: var(--bt-rum-1); }
.bt-o-kal-proeve {
    width: 18px;
    height: 18px;
    border-radius: 5px;
    flex: 0 0 auto;
}
.bt-o-kal-proeve-ledig  { background: var(--bt-kort); border: 1px solid var(--bt-kant-input); }
.bt-o-kal-proeve-lukket { background: var(--bt-bg); border: 1px solid transparent; }

/* ---------- mobil ---------- */

@media (max-width: 600px) {
    .bt-o-side  { padding: var(--bt-rum-3) var(--bt-rum-2) var(--bt-rum-4); }
    .bt-o-blok  { padding: var(--bt-rum-3); border-radius: var(--bt-rund-kort); }
    .bt-o-knapper .bt-o-btn { width: 100%; }
    /* Kalenderen bliver smallere. HØJDEN holdes på --bt-tap-min (48 px);
       BREDDEN er en anden sag og håndteres i blokken nedenfor. */
    .bt-offentlig .bt-o-kal-dag,
    .bt-offentlig .bt-o-kal-lukket,
    .bt-offentlig .bt-o-kal-blank { min-height: var(--bt-tap-min); }
    .bt-o-kal-gitter { gap: 4px; }
}

/* Kalenderens BREDDE på smalle skærme.

   MÅLT 13. august 2026 i Chromium (computed layout, mønster 15) FØR
   denne regel: cellen var 39,1 px bred ved 360 px vindue, 43,4 ved 390,
   46,8 ved 414 og 49,1 ved 430. Højden var 48 px hele vejen. De to
   mest udbredte telefonbredder lå altså under WCAG's 44 px — og den
   tidligere kommentar i blokken ovenfor påstod, at 48 px var gulvet.
   Den påstand gjaldt kun højden (mønster 22: en kommentar er ikke en
   måling).

   --bt-tap-min på 48 px kan IKKE holdes i bredden: syv celler à 48 px
   plus seks mellemrum kræver 348 px, og hele skærmen er 360. Reglen
   sigter derfor mod 44 px, som er kravet: gitteret bryder ud af
   blokkens polstring og strammer mellemrummet fra 4 til 2 px.
   Ugedagsrækken ligger i samme gitter og følger med af sig selv. */
@media (max-width: 430px) {
    .bt-o-kal-gitter {
        gap: 2px;
        margin-left:  calc(2px - var(--bt-rum-3));
        margin-right: calc(2px - var(--bt-rum-3));
    }
}

/* ---------- bevægelse ---------- */

@media (prefers-reduced-motion: reduce) {
    .bt-offentlig *,
    .bt-offentlig *::before,
    .bt-offentlig *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
        scroll-behavior: auto !important;
    }
}

/* ---------- topbjælken på BaseTools' egne offentlige sider ----------
   NY i v1.38 (5. september 2026, designleverancen commit 2b).

   ⚠️ HVORFOR IKKE .bt-top, SOM APPEN BRUGER: test_lag2_opret.sh og
   test_lag2_hold.sh måler BEGGE, at »gammel bt-top er væk« fra de
   offentlige sider. Den interne bjælke blev bevidst fjernet, da lag 2
   blev bygget, og den må ikke tilbage ad bagvejen.

   🔴 OG HVORFOR HVER REGEL HAR TO KLASSER: filens eget hoved
   dokumenterer fælden — .bt-offentlig a har specificitet (0,1,1) og
   SLÅR en ren klasse (0,1,0). En .bt-o-top-link alene ville få
   linkfarven i stedet for hvid. Derfor .bt-o-top .bt-o-top-link,
   som er (0,2,0).

   Bjælken er navy ligesom foden: hovedet og bunden rammer siden ind. */

.bt-o-top {
    display: flex;
    align-items: center;
    gap: var(--bt-rum-3);
    padding: var(--bt-rum-1) var(--bt-rum-3);
    background: var(--bt-navy);
    /* v1.53 (M5 c7): bjaelken staar fast, naar man ruller — paa ALLE
       offentlige sider. z-index 900 som appens .bt-top-app, saa
       indhold med egen position ikke laegger sig ovenpaa. */
    position: sticky;
    top: 0;
    z-index: 900;
}
/* v1.53 (M5 c7): et spring til et anker paa en offentlig side maa ikke
   ende under den faste bjaelke. html's scroll-padding-top (64 px) +
   denne margin (40 px) = 104 px >= bjaelkens 94,4 px paa mobil og
   67,2 px paa pc. Knapperne brydes over to linjer paa mobil — derfor
   de 94 px (Mikael 20/9: lad bjaelken vaere).
   ⚠️ IKKE .bt-offentlig [id]: book.php, hold.php og b.php baerer
   ogsaa .bt-offentlig, men har ingen .bt-o-top. Soeskendevaelgeren
   rammer kun det, der staar EFTER bjaelken i <body> — maalt 20/9:
   alle id'er paa de seks sider med bjaelken, ingen udenfor. */
.bt-o-top ~ [id],
.bt-o-top ~ * [id] { scroll-margin-top: 40px; }
.bt-o-top .bt-o-top-maerke {
    display: flex;
    align-items: center;
    gap: var(--bt-rum-2);
    color: #FFFFFF;
    text-decoration: none;
    font-weight: 700;
}
.bt-o-top .bt-o-top-hoejre {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: var(--bt-rum-3);
}
.bt-o-top .bt-o-top-link {
    color: #FFFFFF;
    text-decoration: none;
}
.bt-o-top .bt-o-top-link:hover { text-decoration: underline; }

/* 🔴 KNAPPEN RØRER IKKE SIN HØJDE. Første udgave satte min-height
   til 36px for at gøre bjælken smal — men --bt-tap-min er 48px, og
   det er det mindste, en finger kan ramme sikkert. En bjælke, der
   ser pænere ud, er ikke en grund til at gøre et trykfelt mindre.
   Bjælken bliver smal ved at have MINDRE LUFT om knappen i stedet:
   se .bt-o-top's padding ovenfor. Kun bredden strammes her.        */
.bt-o-top .bt-o-btn {
    padding-left: var(--bt-rum-3);
    padding-right: var(--bt-rum-3);
}

/* ---------- salgssidens bånd og priskort (v1.39) -------------------
   🔴 KUN FORSIDEN BRUGER DEM. .bt-o-side (720 px) og .bt-o-blok deles
   med kundens bookingside, book.php, hold.php, opret.php og de tre
   juridiske sider — de er IKKE rørt. Salgssiden har sine egne.

   RYTMEN: navy → hvid → accent → hvid → accent → hvid → navy → navy.
   Hvid og #F5F7FA kan man ikke se forskel på; accentfladen kan man.
   Hovedet og foden er mørke, så siden bliver rammet ind.

   ⚠️ HVER REGEL, DER SÆTTER EN LINKFARVE, HAR TO KLASSER. Filens
   hoved dokumenterer fælden: .bt-offentlig a er (0,1,1) og slår en
   ren klasse (0,1,0).                                             */

.bt-o-salg { display: block; }

.bt-o-baand { padding: var(--bt-rum-5) var(--bt-rum-3); }
.bt-o-baand-ind { max-width: 1080px; margin: 0 auto; }

.bt-o-baand-hvid   { background: var(--bt-kort); }
.bt-o-baand-accent { background: var(--bt-accent-flade); }
.bt-o-baand-navy   { background: var(--bt-navy); color: #FFFFFF; }

.bt-o-baand-navy h1,
.bt-o-baand-navy h2,
.bt-o-baand-navy strong { color: #FFFFFF; }
.bt-o-baand-navy .bt-o-lead,
.bt-o-baand-navy .bt-o-sm { color: #C6CCD8; }
.bt-o-baand-navy .bt-o-fod { color: #C6CCD8; border-top-color: rgba(255,255,255,.18); }
.bt-o-baand-navy .bt-o-fod a { color: #FFB37A; }

/* 🔴 TEKSTKNAPPEN PÅ EN MØRK FLADE. .bt-o-btn-tekst er bygget til en
   LYS bund, hvor --bt-orange-mork (#B84800) giver 5,30:1. På navy
   giver den 2,90:1 — MÅLT 5/9-2026 i en browser — og kravet til
   brødtekst er 4,5:1. En klasse, der er rigtig ét sted, er ikke
   automatisk rigtig et andet.                                     */
.bt-o-baand-navy .bt-o-btn-tekst { color: #FFB37A; }

.bt-o-baand-fod { padding-top: var(--bt-rum-4); padding-bottom: var(--bt-rum-4); }

.bt-o-etiket {
    display: inline-block;
    margin: 0 0 var(--bt-rum-2);
    padding: 3px 10px;
    border-radius: 99px;
    background: var(--bt-navy);
    color: #FFFFFF;
    font-size: var(--bt-txt-sm);
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
}
.bt-o-baand-accent .bt-o-etiket { background: var(--bt-orange-mork); }

/* de fire moduler som kort, to og to */
.bt-o-modulkort {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--bt-rum-3);
    margin-top: var(--bt-rum-3);
}
.bt-o-modulkort .bt-o-modulkort-et {
    background: var(--bt-kort);
    border: 1px solid var(--bt-kant);
    border-radius: var(--bt-rund-blok);
    padding: var(--bt-rum-3);
}
.bt-o-modulkort .bt-o-modulkort-et b { display: block; margin-bottom: var(--bt-rum-1); }
/* v1.54: en linje lige under kortene faar luft (forsidens revision
   20/9-2026 — »Start med ét modul …« og »BaseTools skal passe ind …«
   stod med 0 px afstand til kortene). */
.bt-o-modulkort + p { margin-top: var(--bt-rum-4); }

/* prisen som fire kort — se begrundelsen i index.php */
.bt-o-priskort {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--bt-rum-3);
    margin: var(--bt-rum-4) 0;
}
.bt-o-priskort .bt-o-priskort-et {
    display: flex;
    flex-direction: column;
    background: var(--bt-kort);
    border: 1px solid var(--bt-kant);
    border-radius: var(--bt-rund-blok);
    padding: var(--bt-rum-3);
}
.bt-o-priskort .bt-o-priskort-fuld {
    border: 2px solid var(--bt-orange);
    box-shadow: 0 2px 10px rgba(255, 106, 11, .14);
}
.bt-o-priskort .bt-o-priskort-antal {
    font-size: var(--bt-txt-sm);
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--bt-tekst-daempet);
    margin-bottom: var(--bt-rum-2);
}
.bt-o-priskort .bt-o-priskort-md { font-size: 1.9rem; font-weight: 800; line-height: 1; }
.bt-o-priskort .bt-o-priskort-md span { font-size: var(--bt-txt-sm); font-weight: 600; }
.bt-o-priskort .bt-o-priskort-inkl {
    font-size: var(--bt-txt-sm);
    color: var(--bt-tekst-daempet);
    margin-top: 4px;
}
.bt-o-priskort .bt-o-priskort-aar {
    margin-top: var(--bt-rum-3);
    padding-top: var(--bt-rum-2);
    border-top: 1px solid var(--bt-kant);
    font-weight: 700;
}
.bt-o-priskort .bt-o-priskort-spar {
    align-self: flex-start;
    margin-top: var(--bt-rum-2);
    padding: 3px 9px;
    border-radius: 99px;
    background: var(--bt-accent-flade);
    color: var(--bt-orange-mork);
    font-size: var(--bt-txt-sm);
    font-weight: 700;
}

/* ---------- skærmbilleder på salgssiden (v1.40) ---------- */

/* 🔴 width: auto, IKKE 100%. Målt 5/9-2026: med width:100% blev
   holdlisten og regnskabet — begge 760 px brede — strakt til
   båndets 1104 px og blev synligt uskarpe. Et skærmbillede må
   aldrig vises større end sine egne pixels. max-width holder det
   inden for båndet på en smal skærm. */
.bt-o-skaerm {
    display: block;
    width: auto;
    max-width: 100%;
    height: auto;
    margin-top: var(--bt-rum-4);
    border: 1px solid var(--bt-kant);
    border-radius: var(--bt-rund-kort);
    background: var(--bt-kort);
    box-shadow: var(--bt-skygge);
}

/* Dashboardet står på det navy bånd, hvor husets egen kantfarve —
   en mørk, gennemsigtig — bliver usynlig. To klasser, så reglen
   vinder over den ene ovenfor. */
.bt-o-baand-navy .bt-o-skaerm { border-color: rgba(255, 255, 255, .18); }

/* 🔴 TELEFONEN MÅ IKKE STRÆKKES. Billedet ER 390 px bredt; gøres
   det bredere, bliver skriften i det uskarp, og en uskarp skærm på
   en salgsside ligner et uskarpt produkt. */
.bt-o-skaerm-telefon {
    max-width: 300px;
    margin-left: auto;
    margin-right: auto;
}

/* Tekst ved siden af et billede. Én spalte som udgangspunkt —
   to først, når der er plads til dem begge. */
.bt-o-medie { display: grid; gap: var(--bt-rum-4); }

@media (min-width: 900px) {
    /* start, ikke center: teksten skal begynde oeverst ved siden af
       billedet. Med center stod overskriften 230 px nede og lod
       hjoernet oeverst til venstre staa tomt — maalt 5/9-2026. */
    .bt-o-medie { grid-template-columns: 1.4fr 1fr; align-items: start; }
    .bt-o-medie .bt-o-skaerm { margin-top: 0; }
}

/* ---------- hero'en i to spalter på PC (v1.43) ----------
   MÅLT 6/9-2026: hero'en var 1552 px høj på 1440x900 = 1,72
   skærmfulde og 32 % af hele siden, fordi dashboardbilledet stod
   i fuld båndbredde og blev 1080x1170 px. På telefonen skrumper
   det til 354x383 (6 % af siden) — problemet findes KUN på PC.
   Derfor er reglen i en min-width-forespørgsel: telefonen røres
   ikke, og den virker som den er. */
@media (min-width: 900px) {
    /* 🔴 --bt-rum-6 FINDES IKKE. Huset har kun rum-1 til rum-5, og
       en gap paa en ukendt variabel bliver NUL — derfor stod de to
       spalter klods op ad hinanden. Maalt 6/9-2026. rum-5 er 44 px. */
    .bt-o-hero-to {
        display: grid;
        grid-template-columns: 1fr 1fr;
        gap: var(--bt-rum-5);
        align-items: start;
    }
    /* Toppen skal flugte: overskriften og billedet begynder samme
       sted. Med align-items: center stod teksten sænket i forhold
       til billedet. */
    .bt-o-hero-to .bt-o-hero-tekst > :first-child { margin-top: 0; }
    .bt-o-hero-to .bt-o-skaerm-hero { margin-top: 0; }
}

/* ---------- løftestriben (v1.42) ----------
   Fem korte løfter, samlet ét sted i prisbåndet. De stod før spredt
   som brødtekst i tre forskellige bånd; den, der skimmer siden,
   kunne ikke finde dem. Striben er en STRIBE inde i bånd 6 og IKKE
   et nyt bånd — et nyt bånd ville vende J3, J3b og J3c. */
.bt-o-loefter {
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    margin: var(--bt-rum-5) 0 var(--bt-rum-4);
    border: 1px solid var(--bt-kant);
    border-radius: var(--bt-rund-kort);
    background: var(--bt-kort);
    overflow: hidden;
}
.bt-o-loefter .bt-o-loefter-et {
    padding: var(--bt-rum-4) var(--bt-rum-3);
    border-right: 1px solid var(--bt-kant);
}
.bt-o-loefter .bt-o-loefter-et:last-child { border-right: 0; }
.bt-o-loefter .bt-o-loefter-et b { display: block; margin-bottom: 3px; }

@media (max-width: 900px) {
    .bt-o-priskort { grid-template-columns: 1fr 1fr; }
    .bt-o-loefter  { grid-template-columns: 1fr 1fr; }
    .bt-o-loefter .bt-o-loefter-et { border-right: 0; border-bottom: 1px solid var(--bt-kant); }
    .bt-o-modulkort { grid-template-columns: 1fr; }
}
@media (max-width: 520px) {
    .bt-o-priskort { grid-template-columns: 1fr; }
    .bt-o-baand   { padding: var(--bt-rum-4) var(--bt-rum-3); }
}

/* ---------- print (kvittering) ---------- */

@media print {
    .bt-offentlig { background: #FFFFFF; }
    .bt-o-blok    { box-shadow: none; border-color: #8A94A8; }
    .bt-o-btn, .bt-o-trin { display: none; }
    .bt-o-top     { display: none; }   /* v1.38 — en bjælke hører ikke på papir */
}

/* ============================================================
   HJÆLPESIDEN (v1.46, 14. september 2026)
   app/modules/hjaelp/hjaelp.php · ÉN familie, rent additiv.
   ============================================================ */

/* Læsebredde. 68 tegn er den brede ende af det læsbare; manualen
   er lange forklaringer, ikke etiketter. */
.bt-hjaelp-krop > p,
.bt-hjaelp-krop > ul,
.bt-hjaelp-krop > ol,
.bt-hjaelp-krop > h3   { max-width: 68ch; }

/* Rytme: en tynd streg over hver underoverskrift. Manualen har 100
   af dem, og uden en skillelinje flyder afsnittene sammen — teksten
   bruger fed 684 gange, så fed alene kan ikke bære hierarkiet. */
.bt-hjaelp-krop h3 {
    font-size: 1.05rem;
    margin: var(--bt-rum-4) 0 var(--bt-rum-2);
    padding-top: var(--bt-rum-2);
    border-top: 1px solid var(--bt-border);
}
.bt-hjaelp-krop h3:first-child {
    border-top: 0;
    padding-top: 0;
    margin-top: var(--bt-rum-2);
}

/* Sidens egen linje er en overskrift, ikke en dæmpet etikette.
   .bt-detaljer gør summary dæmpet grå — her er den titlen. */
.bt-hjaelp > summary { font-size: var(--bt-fs-stor); color: var(--bt-navy); }
.bt-hjaelp[open] > summary {
    border-bottom: 1px solid var(--bt-border);
    padding-bottom: var(--bt-rum-2);
    margin-bottom: var(--bt-rum-3);
}

/* Modulkravet øverst er ikke en bisætning — det afgør, om resten af
   afsnittet overhovedet gælder læseren. Derfor normal tekststørrelse,
   ikke .bt-besked's lille. */
.bt-hjaelp-krop > .bt-besked {
    max-width: 68ch;
    font-size: var(--bt-fs-normal);
    padding: var(--bt-rum-2) var(--bt-rum-3);
}

/* Tabellen på side 3 skal kunne rulles på en telefon. */
.bt-hjaelp-krop table { border-collapse: collapse; margin: var(--bt-rum-3) 0; }
.bt-hjaelp-krop th,
.bt-hjaelp-krop td {
    text-align: left;
    padding: var(--bt-rum-2) var(--bt-rum-3);
    border-bottom: 1px solid var(--bt-border);
    vertical-align: top;
}
.bt-hjaelp-krop th { background: var(--bt-bg); font-size: var(--bt-fs-lille); }

/* --- anden runde: farve paa det, laeseren leder efter ----------- */

/* »Sådan gør du« — 69 steder. Manualens rygrad, ikke en bisætning. */
.bt-hjaelp-krop > p.bt-hjaelp-gor {
    max-width: 68ch;
    background: var(--bt-orange-bg);
    border-left: 4px solid var(--bt-orange);
    border-radius: 0 var(--bt-radius) var(--bt-radius) 0;
    padding: var(--bt-rum-2) var(--bt-rum-3);
    margin: var(--bt-rum-3) 0;
}
/* ⚠️ LEDEORDET BÆRER FARVEN, IKKE HELE AFSNITTET: resten er
   navy brødtekst, så trinnene kan læses. */
.bt-hjaelp-krop > p.bt-hjaelp-gor > strong:first-child { color: var(--bt-orange-dark); }

/* Sidetallet som mærke — et fast holdepunkt i venstre kant. */
.bt-hjaelp-nr {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.75rem;
    height: 1.75rem;
    margin-right: var(--bt-rum-2);
    border-radius: var(--bt-radius);
    background: var(--bt-orange);
    color: var(--bt-navy);
    font-size: var(--bt-fs-lille);
    font-weight: 700;
}
.bt-hjaelp > summary { display: flex; align-items: center; }

/* Adresser og feltnavne. Huset stylede ikke <code> i forvejen. */
.bt-hjaelp-krop code {
    background: var(--bt-bg);
    border: 1px solid var(--bt-border);
    border-radius: 4px;
    padding: 0.05rem 0.35rem;
    font-size: 0.9em;
}

/* ============================================================
   HJÆLPEBJÆLKEN (v1.47 — 15. september 2026, hjælpebjælken commit 3)
   Afsætning: BASETOOLS_AFSAETNING_HJAELPEBJAELKE.md v1.0.
   Tegning:   BASETOOLS_TEGNING_HJAELPEPANEL.html v2.0.
   Mærket tegnes af app/modules/hjaelp/bjaelke.php.

   🔴 MÆRKET ER ET <details>, OG BJÆLKEN ER DETS INDHOLD. Browseren
   folder ud uden at hente siden, så intet, kunden har skrevet, går
   tabt. name="bt-hjaelp" giver én åben ad gangen. NUL JAVASCRIPT.

   ⚠️ HØJDEN BOR ÉT STED PÅ MÆRKET (--bt-hjaelp-hoejde) — og ét
   sted til: pladsen i bunden af indholdet længere nede, som ikke
   kan arve en variabel fra et barn. De to navngiver hinanden.
   Variablen er defineret på .bt-hjaelp-maerke selv og ikke i :root,
   som ikke røres (mønster 190: en udefineret variabel fejler TAVST).

   ⚠️ »✕ Luk« ER MÆRKET SELV. Et <details> lukkes kun af sit eget
   <summary>. Mens bjælken er åben, skifter mærket fra »?« til
   »✕ Luk« og ligger fast i bjælkens øverste højre hjørne.
   ============================================================ */
.bt-hjaelp-maerke {
    --bt-hjaelp-hoejde: min(40vh, 24rem);
    float: right;
    margin: 0 0 var(--bt-rum-1) var(--bt-rum-2);
}
.bt-hjaelp-maerke > summary {
    list-style: none;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1.6rem;
    height: 1.6rem;
    padding: 0 0.4rem;
    border: 1.5px solid var(--bt-orange-dark);
    border-radius: 999px;
    background: var(--bt-card);
    color: var(--bt-orange-dark);
    font-size: var(--bt-fs-lille);
    font-weight: 700;
    line-height: 1;
}
.bt-hjaelp-maerke > summary::-webkit-details-marker { display: none; }
.bt-hjaelp-maerke > summary:focus-visible {
    outline: 3px solid var(--bt-orange-dark);
    outline-offset: 2px;
}
.bt-hjaelp-luk-tegn { display: none; }
.bt-hjaelp-maerke[open] .bt-hjaelp-sp-tegn { display: none; }
.bt-hjaelp-maerke[open] .bt-hjaelp-luk-tegn { display: inline; }
.bt-hjaelp-maerke[open] > summary {
    position: fixed;
    right: var(--bt-rum-4);
    bottom: calc(var(--bt-hjaelp-hoejde) - 2.3rem);
    z-index: 1001;
    background: var(--bt-orange-bg);
}

.bt-hjaelp-bjaelke {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1000;
    height: var(--bt-hjaelp-hoejde);
    overflow-y: auto;
    padding: var(--bt-rum-2) var(--bt-rum-4) var(--bt-rum-3);
    background: var(--bt-card);
    border-top: 3px solid var(--bt-orange);
    box-shadow: 0 -6px 16px rgba(28, 36, 60, .12);
    color: var(--bt-text);
    font-size: var(--bt-fs-normal);
    font-weight: 400;
    text-align: left;
}
.bt-hjaelp-hoved {
    margin: 0 0 var(--bt-rum-2);
    padding-right: 6rem;          /* plads til »✕ Luk« */
    font-weight: 600;
}
.bt-hjaelp-hoved strong { color: var(--bt-orange-dark); }
.bt-hjaelp-bjaelke > .bt-hjaelp-krop > h3:first-child { margin-top: 0; }
.bt-hjaelp-driller {
    max-width: 68ch;
    margin-top: var(--bt-rum-3);
    padding-top: var(--bt-rum-2);
    border-top: 1px solid var(--bt-border);
}
.bt-hjaelp-etiket {
    margin: 0 0 var(--bt-rum-1);
    color: var(--bt-text-muted);
    font-size: var(--bt-fs-lille);
    font-weight: 600;
    letter-spacing: .05em;
    text-transform: uppercase;
}
.bt-hjaelp-sp {
    margin-bottom: var(--bt-rum-2);
    padding: var(--bt-rum-2) var(--bt-rum-3);
    background: var(--bt-bg);
    border: 1px solid var(--bt-border);
    border-radius: var(--bt-radius);
}
.bt-hjaelp-sp > summary { cursor: pointer; font-weight: 600; }
.bt-hjaelp-hele { margin: var(--bt-rum-3) 0 0; font-weight: 600; }

/* Plads i bunden af indholdet, mens en bjælke er åben, så den ikke
   dækker det nederste kort. ⚠️ SAMME HØJDE som --bt-hjaelp-hoejde
   på .bt-hjaelp-maerke ovenfor — et forældreled kan ikke arve en
   variabel fra sit barn, så tallet står to steder. */
.bt-indhold:has(.bt-hjaelp-maerke[open]) { padding-bottom: min(40vh, 24rem); }


/* ============================================================
   MENUEN (v1.48, 16. september 2026)
   Afsætning: BASETOOLS_AFSAETNING_MENU.md v1.0
   Tegning:   BASETOOLS_TEGNING_MENU.html v1.2

   PC (over 768 px): menuen staar fast i venstre side, mens siden
   ruller — topbjaelken ruller vaek som foer (Mikaels valg A). Menuen
   er taettere end foer og faar sin egen rullebjaelke, naar den er
   hoejere end vinduet; en skygge i bunden viser, at der er mere.
   Maalt 16/9: alle fire moduler giver 677 px, Admin 717 px.

   MOBIL (768 px og under): topbjaelken staar fast og har ☰ Menu.
   Kliniknavnet og »Log ud« skjules i bjaelken (Mikaels valg) — »Log
   ud« staar i stedet nederst i menuen, som folder ud over siden.

   🔴 KOBLINGEN ER »#bt-menu-knap:checked ~ .bt-shell .bt-sidenav« OG
   IKKE :has(). En browser uden :has() ville aldrig kunne aabne menuen,
   og saa var programmet ubrugeligt paa den telefon. ~ virker overalt,
   men kraever, at feltet staar FOER .bt-shell i public/app.php.
   dev/test_menu_baseline.sh C1 og C2 vogter valget; B1 vogter pladsen.

   ⚠️ REGLERNE RAMMER .bt-top-app — IKKE .bt-top. login.php, nulstil.php
   og bekraeft_email.php bruger ogsaa .bt-top og skal ikke aendres (C6).

   ⚠️ 56 PX STAAR TO STEDER: topbjaelkens hoejde paa mobil og menuens
   top. Rettes det ene, skal det andet foelge med.
   ============================================================ */
.bt-menu-knap {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: 0;
    opacity: 0;
    pointer-events: none;
}
.bt-menu-knap-label { display: none; }
/* ⚠️ .bt-sidenav FORAN ER NØDVENDIGT: .bt-sidenav a { display: block }
   vejer mere end en enkelt klasse, og uden det stod »Log ud« i menuen
   paa pc. Fundet af dev/maal_menu.py P3 16/9-2026, foer levering. */
.bt-sidenav .bt-nav-logud { display: none; }
.bt-top-logud { margin-left: auto; }

@media (min-width: 769px) {
    .bt-shell .bt-sidenav {
        position: sticky;
        top: 0;
        align-self: flex-start;
        height: 100vh;
        overflow-y: auto;
        box-sizing: border-box;
        padding: var(--bt-rum-2) 0;
        /* Skyggen: to hvide flader, der ruller MED indholdet, dækker to
           skygger, der står stille. Er der mere at rulle, er skyggen i
           bunden synlig. Navy med gennemsigtighed — ingen ny farve. */
        background:
            linear-gradient(var(--bt-card) 30%, rgba(255, 255, 255, 0)) center top,
            linear-gradient(rgba(255, 255, 255, 0), var(--bt-card) 70%) center bottom,
            radial-gradient(farthest-side at 50% 0, rgba(28, 36, 60, .28), rgba(28, 36, 60, 0)) center top,
            radial-gradient(farthest-side at 50% 100%, rgba(28, 36, 60, .28), rgba(28, 36, 60, 0)) center bottom;
        background-color: var(--bt-card);
        background-repeat: no-repeat;
        background-size: 100% 48px, 100% 48px, 100% 16px, 100% 16px;
        background-attachment: local, local, scroll, scroll;
    }
    .bt-shell .bt-sidenav a { padding: 0.32rem var(--bt-rum-3); }
    .bt-shell .bt-nav-gruppe { margin: 0.6rem 0 0.2rem; padding: 0.5rem var(--bt-rum-3) 0; }
    .bt-shell .bt-nav-gruppe:first-child { margin-top: 0; padding-top: 0; }
}

@media (max-width: 768px) {
    .bt-top-app {
        position: sticky;
        top: 0;
        z-index: 900;
        height: 56px;
        box-sizing: border-box;
        padding: 0 var(--bt-rum-3);
    }
    .bt-top-navn,
    .bt-top-logud { display: none; }
    .bt-menu-knap-label {
        display: inline-flex;
        align-items: center;
        gap: var(--bt-rum-2);
        margin-left: auto;
        padding: 6px 12px;
        border: 1px solid rgba(255, 255, 255, .45);
        border-radius: var(--bt-radius);
        color: #fff;
        font-weight: 700;
        cursor: pointer;
    }
    .bt-burger { display: inline-flex; flex-direction: column; gap: 4px; }
    .bt-burger span { display: block; width: 18px; height: 2px; background: #fff; }
    .bt-menu-knap:focus-visible ~ .bt-top-app .bt-menu-knap-label {
        outline: 3px solid var(--bt-orange);
        outline-offset: 2px;
    }
    .bt-shell .bt-sidenav {
        display: none;
        position: fixed;
        top: 56px;
        left: 0;
        right: 0;
        bottom: 0;
        width: auto;
        overflow-y: auto;
        z-index: 899;
        padding: var(--bt-rum-2) 0 var(--bt-rum-4);
        border-right: 0;
        background: var(--bt-card);
    }
    #bt-menu-knap:checked ~ .bt-shell .bt-sidenav { display: block; }
    /* Kun en bekvemmelighed: siden bag staar stille, mens menuen er
       aaben. En browser uden :has() ruller siden bag — menuen virker. */
    body:has(#bt-menu-knap:checked) { overflow: hidden; }
    .bt-shell .bt-sidenav a { padding: 0.7rem var(--bt-rum-3); }
    .bt-shell .bt-sidenav .bt-nav-logud {
        display: block;
        margin-top: var(--bt-rum-3);
        border-top: 1px solid var(--bt-border);
    }
    /* Et spring til et anker maa ikke ende under den faste bjaelke. */
    html { scroll-padding-top: 64px; }
}

@media print {
    .bt-menu-knap,
    .bt-menu-knap-label,
    .bt-nav-logud { display: none !important; }
}

/* ============================================================
   PARTNERSYSTEMET (v1.49, 16. september 2026 — P1 commit 4)
   Afsætning:    BASETOOLS_AFSAETNING_AFFILIATE.md v1.2, afsnit 4
   Beslutninger: BASETOOLS_AFFILIATE_OPLAEG_OG_BESLUTNINGER.md v1.4
                 (D1, D2, F2)
   Tegninger:    BASETOOLS_TEGNING_PARTNERUNIVERS.html v1.1 (afsnit 7)
                 og _DEL2.html v1.1 (afsnit 10)

   FIRE REGLER, ALLE ADDITIVE. Ingen eksisterende regel er roert.

   body.bt-partner — »Stoevet blaa« lagt paa de OTTE interne
   farvenavne, som de interne skaerme bruger. Temaerne under
   .bt-offentlig bruger en ANDEN navnefamilie (--bt-orange-mork,
   --bt-accent-flade …) og rammer ikke de interne skaerme; derfor
   defineres vaerdierne her igen paa de interne navne. Vaerdierne ER
   temaet »Stoevet blaa« (.bt-offentlig.bt-tema-blaa) — ingen ny
   farve, og kontrasten er regnet i tegningens del 1, afsnit 7:
   links #1C5B85 paa hvidt 7,28:1 · knaptekst 6,36:1 · inputkant
   3,23:1. Navnene hedder stadig »orange«, selv om vaerdien er blaa
   (notesbogen 16/9) — at omdoebe dem ville roere hele stilarket.
   Klassen saettes af public/app.php, naar registrets post har
   'blaa' => true (Admins partnerskaerme), og i P2 af partnerens
   eget univers. Maalt som computed style i tegningens del 2:
   topbjaelke #1B2E3F · navnet i bjaelken #7FB6D9 · aktiv menuflade
   #E3EEF5 · links #1C5B85.

   .bt-badge-advarsel — husets maerker havde kun to farver (aktiv
   groen, inaktiv graa). Partnersystemet har brug for en tredje:
   »Flyttet til …« paa Admins side og »Tilbagefoert« og »Ikke
   laengere din kunde« hos partneren. Advarselsfarven findes i
   :root allerede (--bt-warning, 4,5:1 paa sin flade).

   .bt-flueben input[type="radio"] — huset havde kun en regel for
   afkrydsning; en radioknap i samme struktur svaevede over teksten
   (notesbogen 16/9). Momsstatus ved opret partner og momsvalget ved
   Registrér betaling (commit 5) er radiogrupper.

   .bt-tabel-taet — tabeller med syv-otte kolonner loeb ud af
   kortet ved 1280 px (udbetalingskoerslen, partnerens
   udbetalinger). Taettere celler og 0,88 rem skrift holder dem
   inde i kortet; paa mobil ruller kortet stadig sidelaens som alle
   tabeller (.bt-kort { overflow-x: auto }).

   Vogtet af dev/test_partner_baseline.sh D4-D8.
   ============================================================ */
body.bt-partner {
    --bt-navy:         #1B2E3F;
    --bt-orange:       #7FB6D9;
    --bt-orange-dark:  #1C5B85;
    --bt-orange-bg:    #E3EEF5;
    --bt-bg:           #F4F7FA;
    --bt-text:         #1B2E3F;
    --bt-text-muted:   #566573;
    --bt-border-input: #82919F;
    background: var(--bt-bg);
    color: var(--bt-text);
}
.bt-badge-advarsel { background: var(--bt-warning-bg); color: var(--bt-warning); }
.bt-flueben input[type="radio"] {
    width: 1.1rem;
    height: 1.1rem;
    margin: 0;
    flex: none;
}
.bt-tabel-taet th, .bt-tabel-taet td { padding: 0.45rem 0.5rem; font-size: 0.88rem; }

/* ============================================================
   FARVELEVERANCEN (v1.50, 18/9-2026) — forlaeg:
   BASETOOLS_TEGNING_FARVER.html v1.0.

   Kortenes farve viser, hvad man arbejder med. Mikael ramte
   »Registrér betaling« i stedet for »Registrér refundering« ved
   P2's kontrolpunkt; de to kort stod under hinanden og lignede
   hinanden. »Kom godt i gang« er blaa, fordi det ikke er en del af
   det generelle system — gul er optaget af proeveperiode-bjaelken
   lige over, groen betyder »klaret«, roed betyder fejl. Kontrasten
   er regnet i tegningens afsnit 6 (links 4,5:1 paa alle tre flader).

   ⚠️ 60 PX STAAR TO STEDER: topbjaelkens hoejde paa pc og menuens
   top her — og scroll-padding-top paa 64 px (v1.51) skal vaere mindst
   bjaelkens hoejde. Rettes det ene, skal det andet foelge med — samme greb
   som 56 px paa mobil i regelfamilien MENUEN.

   .bt-offentlig .bt-o-felt-fejl input — .bt-offentlig
   input[type="text"] (0,2,1) slog fejlreglen (0,2,0), saa kanten var
   graa. Denne regel har samme vaegt og staar SENERE, og vinder
   derfor. Maalt i Chromium paa opret.php (tegningens afsnit 4).
   ============================================================ */
.bt-kort.bt-kort-betaling    { background: var(--bt-success-bg); border-color: var(--bt-success); }
.bt-kort.bt-kort-refundering { background: var(--bt-error-bg);   border-color: var(--bt-error); }
.bt-kort.bt-kort-komigang    { background: var(--bt-info-bg);    border-color: var(--bt-info); }
@media (min-width: 769px) {
    .bt-top-app {
        position: sticky;
        top: 0;
        z-index: 900;
        height: 60px;
        box-sizing: border-box;
    }
    .bt-shell .bt-sidenav { top: 60px; height: calc(100vh - 60px); }
    /* v1.51: et spring til et anker maa ikke ende under den faste
       bjaelke — samme regel som paa mobil (64 >= bjaelkens 60 px).
       Vogtet af dev/maal_menu.py F5. */
    html { scroll-padding-top: 64px; }
}
.bt-offentlig .bt-o-felt-fejl input,
.bt-offentlig .bt-o-felt-fejl select,
.bt-offentlig .bt-o-felt-fejl textarea { border-color: var(--bt-error); border-width: 2px; }

/* ============================================================
   VILKÅRENE (v1.52, 19. september 2026 — Mikael ved kontrolpunktet
   for partnervilkårene 1.1: bredere blok, mindre skrift, kortere side).
   TO additive regler, ingen gammel regel rørt, :root urørt:
   .bt-vilkaar-side — accept-siden (partner.php ?side=vilkaar) får
   bredden fra .bt-main i stedet for .bt-smal (420 px).
   .bt-vilkaar — selve vilkårsteksten (på accept-siden og på Vilkår i
   menuen): skriften er --bt-fs-lille, og luften mellem afsnit,
   overskrifter og lister er strammet op.
   ============================================================ */
.bt-vilkaar-side { max-width: 960px; }
.bt-vilkaar { font-size: var(--bt-fs-lille); line-height: 1.5; }
.bt-vilkaar p  { margin: 0 0 0.5rem; }
.bt-vilkaar h3 { font-size: 0.95rem; margin: 1.1rem 0 0.35rem; }
.bt-vilkaar h4 { font-size: 0.9rem;  margin: 0.8rem 0 0.3rem; }
.bt-vilkaar ul { margin: 0.2rem 0 0.6rem; padding-left: 1.3rem; }
.bt-vilkaar li { margin: 0 0 0.1rem; }

/* ============================================================
   RUNDVISNINGEN (v1.55, 21. september 2026 —
   BASETOOLS_AFSAETNING_RUNDVISNING.md v1.1, tegningen
   BASETOOLS_TEGNING_RUNDVISNING.html v1.0). Siden public/rundvisning.php.
   KUN nye .bt-o-rv-*-klasser, ingen gammel regel roert, ingen ny
   variabel. Farverne er husets tokens plus de flader, tegningen
   viste (graa scene, fersken bag telefonen, vinduets graa top).
   🔴 ORDENE FOR ET LAAGT LAG OVER SIDEN MAA IKKE STAA I DENNE FIL —
   test_komigang G2 og test_hjaelpebjaelke B8 taeller dem. Det store
   billede hedder derfor »lys« her.
   UDEN JAVASCRIPT staar alle trin under hinanden i fuld laengde.
   Scriptet saetter .bt-o-rv-js paa rammen og viser ét trin ad gangen.
   🔴 INGEN RULLEKASSER (Mikael ved kontrolpunktet 21/9): et billede
   med sin egen rullebjaelke fangede musehjulet, saa siden ikke kunne
   rulles. Med script beskaeres billedet fra toppen, og et klik viser
   hele skaermen i »lys«. Hjulet ruller altid siden.
   Kapitelfanerne staar fast under topbjaelken, saa de ikke forsvinder,
   naar man ruller. 67 px er bjaelkens hoejde paa pc (maalt 21/9); den
   vokser, naar linkene brydes, saa scriptet saetter top ud fra den
   maalte hoejde.
   ============================================================ */

/* kapitelfanerne lige over rundvisningen */
.bt-o-rv-faner {
    position: sticky; top: 67px; z-index: 5;
    display: flex; flex-wrap: wrap; gap: var(--bt-rum-2);
    margin: 0 0 var(--bt-rum-4); padding: var(--bt-rum-2) 0;
    background: var(--bt-kort); border-bottom: 1px solid var(--bt-kant);
}
.bt-offentlig .bt-o-rv-fane {
    display: inline-flex; align-items: center; gap: 8px;
    min-height: var(--bt-tap-min); padding: 0 var(--bt-rum-3);
    border-radius: 999px; border: 1.5px solid var(--bt-kant-input);
    background: var(--bt-kort); color: var(--bt-tekst);
    font-weight: 600; text-decoration: none;
}
.bt-offentlig .bt-o-rv-fane:hover { background: var(--bt-accent-flade); }
.bt-offentlig .bt-o-rv-fane[aria-current="true"] {
    background: var(--bt-navy); border-color: var(--bt-navy); color: #FFFFFF;
}
.bt-o-rv-fane .bt-o-rv-tal { font-size: 13px; font-weight: 500; opacity: .75; }

.bt-o-rv-trin {
    display: grid; gap: var(--bt-rum-4); align-items: start;
    margin-bottom: var(--bt-rum-5);
    scroll-margin-top: 150px;
}
.bt-o-rv-js .bt-o-rv-trin { margin-bottom: 0; }
.bt-o-rv-js .bt-o-rv-trin:not(.bt-o-rv-nu) { display: none; }
.bt-o-rv-js .bt-o-rv-nu { animation: bt-o-rv-ind .35s ease; }
@keyframes bt-o-rv-ind { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@media (min-width: 980px) {
    .bt-o-rv-trin { grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr); }
}

.bt-o-rv-scene {
    position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center;
    min-height: 300px; overflow: hidden;
    padding: var(--bt-rum-4);
    border-radius: var(--bt-rund-blok);
    background: linear-gradient(160deg, #EEF1F6, #E3E8F0);
}
.bt-o-rv-scene-telefon { background: linear-gradient(160deg, #FFE9D9, #FFD9BF); }

/* browservinduet om app-billederne */
.bt-o-rv-vindue {
    width: 100%; overflow: hidden; background: #FFFFFF;
    border: 1px solid var(--bt-kant); border-radius: 12px;
    box-shadow: 0 18px 40px -18px rgba(28, 36, 60, .35), 0 2px 6px rgba(28, 36, 60, .08);
}
.bt-o-rv-vindue-top {
    display: flex; align-items: center; gap: 6px; padding: 9px 12px;
    background: #F0F2F6; border-bottom: 1px solid var(--bt-kant);
}
.bt-o-rv-vindue-top i { display: block; width: 10px; height: 10px; border-radius: 50%; background: #D3D8E0; }
.bt-o-rv-adr {
    flex: 1; margin-left: 10px; padding: 3px 10px; border-radius: 6px;
    background: #FFFFFF; font-size: 12px; color: var(--bt-tekst-daempet);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.bt-o-rv-vindue-krop { position: relative; }
.bt-o-rv-vindue-krop img,
.bt-o-rv-telefon-skaerm img { display: block; width: 100%; height: auto; }

/* telefonrammen om telefonbillederne */
.bt-o-rv-telefon {
    width: 290px; max-width: 78%; padding: 12px; border-radius: 42px;
    background: var(--bt-navy); box-shadow: 0 24px 50px -20px rgba(28, 36, 60, .55);
}
.bt-o-rv-telefon-skaerm { position: relative; overflow: hidden; border-radius: 31px; background: var(--bt-bg); }
.bt-o-rv-hak {
    position: absolute; top: 8px; left: 50%; transform: translateX(-50%); z-index: 2;
    width: 84px; height: 22px; border-radius: 12px; background: var(--bt-navy);
}

/* MED SCRIPT: beskaaret fra toppen, en blid toning forneden, og et
   klik viser hele skaermen. Ingen overflow: auto — hjulet skal
   altid rulle siden. */
.bt-o-rv-js .bt-o-rv-vindue-krop { max-height: min(520px, 60vh); overflow: hidden; }
.bt-o-rv-js .bt-o-rv-telefon-skaerm { height: min(540px, 64vh); }
.bt-o-rv-js .bt-o-rv-vindue-krop::after,
.bt-o-rv-js .bt-o-rv-telefon-skaerm::after {
    content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 72px;
    background: linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, .95));
    pointer-events: none;
}
.bt-o-rv-js .bt-o-rv-vindue-krop,
.bt-o-rv-js .bt-o-rv-telefon-skaerm { cursor: zoom-in; }
.bt-offentlig .bt-o-rv-hele {
    margin-top: var(--bt-rum-3); min-height: 40px; padding: 6px var(--bt-rum-3);
    font-size: var(--bt-txt-sm);
}
.bt-o-rv-hele[hidden] { display: none; }

/* forklaringen */
.bt-o-rv-forklaring {
    display: flex; flex-direction: column; gap: var(--bt-rum-2);
    padding: var(--bt-rum-4); background: var(--bt-kort);
    border: 1px solid var(--bt-kant); border-radius: var(--bt-rund-blok); box-shadow: var(--bt-skygge);
}
.bt-o-rv-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--bt-rum-2); }
.bt-o-rv-chip {
    display: inline-block; padding: 3px 10px; border-radius: 999px;
    background: var(--bt-accent-flade); color: var(--bt-navy);
    font-size: 13px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
}
.bt-o-rv-taeller { font-size: var(--bt-txt-sm); color: var(--bt-tekst-daempet); }
.bt-offentlig .bt-o-rv-forklaring h2 { margin: var(--bt-rum-1) 0 0; }
.bt-o-rv-forklaring ul { margin: 0; padding-left: 1.2em; }
.bt-o-rv-forklaring li { margin: 2px 0; }
.bt-o-rv-nav { display: flex; gap: var(--bt-rum-2); margin-top: auto; padding-top: var(--bt-rum-3); }
.bt-o-rv-nav .bt-o-btn { flex: 1; }
/* [hidden] ville ellers tabe til display: flex ovenfor — uden script
   skal knapperne vaere vaek. */
.bt-o-rv-nav[hidden] { display: none; }
.bt-o-rv-fremdrift { height: 4px; margin-top: var(--bt-rum-2); overflow: hidden; border-radius: 4px; background: #E3E8F0; }
.bt-o-rv-fremdrift span { display: block; height: 100%; background: var(--bt-orange); }
.bt-o-rv-tastehint { font-size: 13px; color: var(--bt-tekst-daempet); }
.bt-o-rv-tastehint kbd {
    padding: 0 5px; border: 1px solid var(--bt-kant-input); border-bottom-width: 2px;
    border-radius: 5px; background: #FFFFFF; font-family: inherit; font-size: 12px;
}

/* miniaturerne, grupperet pr. kapitel */
.bt-o-rv-miniaturer { margin-top: var(--bt-rum-4); }
.bt-o-rv-gruppe { margin-bottom: var(--bt-rum-3); }
.bt-offentlig .bt-o-rv-gruppe h3 {
    margin-bottom: var(--bt-rum-1); font-size: var(--bt-txt-sm);
    text-transform: uppercase; letter-spacing: .06em; color: var(--bt-tekst-daempet);
}
.bt-o-rv-raekke { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--bt-rum-2); }
.bt-o-rv-mini {
    display: flex; flex-direction: column; gap: 6px; padding: 8px; text-align: left;
    background: var(--bt-kort); border: 2px solid var(--bt-kant); border-radius: var(--bt-rund-kort);
    color: var(--bt-tekst); font: inherit; cursor: pointer;
}
.bt-o-rv-mini:hover { border-color: var(--bt-kant-input); }
.bt-o-rv-mini[aria-current="true"] { border-color: var(--bt-orange-mork); box-shadow: 0 0 0 3px var(--bt-accent-flade); }
.bt-o-rv-mini-billede {
    height: 84px; border-radius: 9px; border: 1px solid var(--bt-kant);
    background: #EEF1F6 center top / cover no-repeat;
}
.bt-o-rv-mini-navn { font-size: 14px; font-weight: 600; line-height: 1.3; }

/* de tre løfter og afslutningen */
.bt-o-rv-loefter { display: grid; gap: var(--bt-rum-3); margin-top: var(--bt-rum-4); }
@media (min-width: 800px) { .bt-o-rv-loefter { grid-template-columns: repeat(3, 1fr); } }
.bt-o-rv-loefte { padding: var(--bt-rum-4); background: var(--bt-kort); border: 1px solid var(--bt-kant); border-radius: var(--bt-rund-kort); }
.bt-o-rv-ikon {
    display: flex; align-items: center; justify-content: center;
    width: 44px; height: 44px; margin-bottom: var(--bt-rum-2);
    border-radius: 12px; background: var(--bt-navy);
}
.bt-o-rv-ikon svg {
    width: 24px; height: 24px; fill: none; stroke: var(--bt-orange);
    stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
}
.bt-o-rv-afslut { text-align: center; }
.bt-offentlig .bt-o-rv-afslut p { margin-left: auto; margin-right: auto; }
.bt-o-rv-afslut .bt-o-knapper { justify-content: center; }
.bt-o-rv-demonote {
    margin-top: var(--bt-rum-4); padding-top: var(--bt-rum-3);
    border-top: 1px solid rgba(255, 255, 255, .18);
    font-size: 14px; color: #C6CCD8; text-align: center;
}
.bt-offentlig .bt-o-rv-demonote p { margin: 0 auto 4px; }

/* hele skaermen — et klik paa billedet */
.bt-o-rv-lys { position: fixed; inset: 0; z-index: 950; display: none; flex-direction: column; background: rgba(20, 26, 44, .92); }
.bt-o-rv-lys[open] { display: flex; }
.bt-o-rv-lys-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 16px; color: #FFFFFF; }
.bt-o-rv-lys-top strong { font-size: 16px; }
.bt-o-rv-lys-luk {
    min-width: var(--bt-tap-min); min-height: var(--bt-tap-min); padding: 0 16px;
    border: 1.5px solid rgba(255, 255, 255, .4); border-radius: var(--bt-rund-btn);
    background: transparent; color: #FFFFFF; font: inherit; font-weight: 600; cursor: pointer;
}
.bt-o-rv-lys-krop { flex: 1; overflow: auto; padding: 0 16px 16px; -webkit-overflow-scrolling: touch; }
.bt-o-rv-lys-krop img {
    display: block; margin: 0 auto; max-width: none; height: auto;
    width: min(1400px, max(100%, 760px)); border-radius: 10px; background: #FFFFFF;
}
/* Telefonbilledet er tegnet i dobbelt opløsning: 780 px = 390 px
   skaerm. Det vises i sin egen bredde og strækkes ikke. */
.bt-o-rv-lys-telefon .bt-o-rv-lys-krop img { width: min(100%, 390px); max-width: 100%; }

@media (max-width: 600px) {
    .bt-o-rv-scene { padding: var(--bt-rum-3) 12px; }
    .bt-o-rv-js .bt-o-rv-vindue-krop { max-height: 380px; }
    .bt-o-rv-js .bt-o-rv-telefon-skaerm { height: 460px; }
    /* Paa telefonen skal de tre faner staa paa ÉN linje (maalt 21/9:
       med antallet brød de i to og tog 216 px af skaermen). */
    .bt-o-rv-faner { flex-wrap: nowrap; gap: var(--bt-rum-1); }
    .bt-offentlig .bt-o-rv-fane { flex: 1 1 0; justify-content: center; min-width: 0; padding: 0 6px; font-size: var(--bt-txt-sm); }
    .bt-o-rv-fane .bt-o-rv-tal { display: none; }
}
@media (prefers-reduced-motion: reduce) {
    .bt-o-rv-js .bt-o-rv-nu { animation: none; }
}

/* ============================================================
   TOPBJÆLKENS MENU (v1.56, 21. september 2026 —
   BASETOOLS_AFSAETNING_TOPBJAELKE.md v1.0, Mikael T1-T3).
   bt_top() har nu »Forside« og »Rundvisning« (BT_TOP_SIDER i
   app/core/helpers.php). KUN nye regler, ingen gammel regel roert:
   reglen .bt-o-top { … } er urørt (test_partner_m5 A19 og H2).
   PC: linkene staar i bjaelken, CTA-knappen til hoejre.
   TELEFON (768 px og under): maerket · CTA · ☰ Menu. Et tryk paa ☰
   folder linkene ud under bjaelken. Samme greb som appens menu:
   ».bt-o-menu-knap:checked ~ .bt-o-top-hoejre« — ingen JavaScript,
   ingen :has(), og feltet staar FOER <nav> i bt_top().
   ============================================================ */
.bt-o-menu-knap {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: 0;
    opacity: 0;
    pointer-events: none;
}
.bt-o-menu-knap-label { display: none; }
/* Den side, man staar paa: en orange streg under linket. */
.bt-o-top .bt-o-top-side[aria-current="page"] {
    text-decoration: underline;
    text-decoration-color: var(--bt-orange);
    text-decoration-thickness: 2px;
    text-underline-offset: 6px;
}

@media (max-width: 768px) {
    .bt-o-top { flex-wrap: wrap; }
    .bt-o-top > .bt-o-btn-cta { margin-left: auto; }
    .bt-o-top .bt-o-top-hoejre {
        display: none;
        order: 5;
        flex-basis: 100%;
        flex-direction: column;
        align-items: stretch;
        gap: 0;
        margin-left: 0;
        padding: 4px 0 8px;
        border-top: 1px solid rgba(255, 255, 255, .18);
    }
    .bt-o-menu-knap:checked ~ .bt-o-top-hoejre { display: flex; }
    .bt-o-top .bt-o-top-hoejre .bt-o-top-link {
        display: flex;
        align-items: center;
        min-height: var(--bt-tap-min);
        padding: 0 4px;
    }
    .bt-o-top .bt-o-menu-knap-label {
        display: inline-flex;
        align-items: center;
        gap: 8px;
        min-height: var(--bt-tap-min);
        padding: 0 12px;
        border: 1.5px solid rgba(255, 255, 255, .4);
        border-radius: var(--bt-rund-btn);
        color: #FFFFFF;
        font-weight: 600;
        cursor: pointer;
    }
    .bt-o-menu-knap:focus-visible ~ .bt-o-menu-knap-label { outline: var(--bt-fokus); outline-offset: 2px; }
    .bt-o-burger { display: inline-flex; flex-direction: column; gap: 4px; }
    .bt-o-burger span { display: block; width: 18px; height: 2px; border-radius: 1px; background: #FFFFFF; }
}
@media (max-width: 600px) {
    /* Paa telefonen skal maerke, CTA og ☰ staa paa ÉN linje (maalt
       21/9: med husets luft var de 463 px brede og broed ved 390).
       Ordet »Menu« skjules visuelt, men etiketten beholder det som
       sit navn (font-size: 0, ikke display: none). */
    .bt-o-top { gap: var(--bt-rum-2); padding-left: 12px; padding-right: 12px; }
    .bt-o-top .bt-o-btn { padding-left: 12px; padding-right: 12px; }
    .bt-o-top .bt-o-menu-knap-label { font-size: 0; gap: 0; }
}
@media (max-width: 340px) {
    /* Den smalleste telefon (320 px): maerke 138 + CTA 124 + ☰ 44 +
       luft = 354 px, maalt 21/9. Ordet »BaseTools« skjules visuelt;
       linket beholder det som sit navn (font-size: 0). */
    .bt-o-top .bt-o-top-maerke span { font-size: 0; }
    .bt-o-top .bt-o-top-maerke { gap: 0; }
}

/* ============================================================
   TABELLER PAA TELEFONEN (v1.57, 22/9-2026) — forlaeg:
   BASETOOLS_TEGNING_TABELLER_TELEFON.html v1.0, Mikaels valg
   »B for lister, A for resten«.

   A · Alle kort under 769 px: en skygge i kanten, saa laenge der
       er mere at stryge til (kortet ruller allerede sidelaens,
       se .bt-kort { overflow-x: auto } ovenfor). Teknikken er fire
       baggrunde: to hvide »daekker« der ruller MED indholdet
       (local) og to skygger, der staar fast (scroll). Tekst i
       cellerne brydes som foer.
   B · .bt-tabel-liste under 769 px: hver raekke bliver et lille
       kort; etiketten er cellens data-label. En celle uden
       data-label (knapper) faar ingen etiket. Ugeoverskriften i
       holdoverblikket (<th colspan>) staar som en overskrift.
   C · Kontakter (commit 3): .bt-soeg-telefon giver soegefeltet sin
       egen linje og skjuler antallet under 769 px. Posteringernes
       sidste celle har etiketten »Rettes« (ellers stod »automatisk«
       som en loes linje). Versionen forbliver 1.57 — commit 1-3 er
       een leverance, der endnu ikke er deployet.
   D · Deltagerlisten (23/9-2026): Holdbooking -> Deltagere bruger
       samme .bt-tabel-liste; .bt-deltager-knapper goer knapperne
       store paa telefon. Stadig 1.57 — ikke deployet endnu.

   Vogtet af dev/test_tabeller_telefon_baseline.sh.
   ============================================================ */
@media (max-width: 768px) {
    .bt-kort {
        background:
            linear-gradient(to right, var(--bt-card) 30%, transparent) 0 0 / 28px 100% no-repeat local,
            linear-gradient(to left, var(--bt-card) 30%, transparent) 100% 0 / 28px 100% no-repeat local,
            radial-gradient(farthest-side at 0 50%, rgba(27, 46, 63, .28), transparent) 0 0 / 12px 100% no-repeat scroll,
            radial-gradient(farthest-side at 100% 50%, rgba(27, 46, 63, .28), transparent) 100% 0 / 12px 100% no-repeat scroll,
            var(--bt-card);
    }
    .bt-tabel-liste thead { display: none; }
    /* Kort uden overskrift (Kontakter): »?« staar ellers oven i foerste raekke. */
    .bt-hjaelp-maerke + .bt-tabel-liste { margin-top: 2.2rem; }
    .bt-tabel-liste,
    .bt-tabel-liste tbody { display: block; width: 100%; }
    .bt-tabel-liste tr {
        display: block;
        border: 1px solid var(--bt-border);
        border-radius: 10px;
        padding: 0.4rem 0.6rem;
        margin: 0 0 0.5rem;
    }
    .bt-tabel-liste tr:has(> th[colspan]) { border: 0; padding: 0.6rem 0 0.2rem; margin: 0; }
    .bt-tabel-liste th[colspan] { display: block; background: none; border: 0; padding: 0; }
    .bt-tabel-liste td {
        display: block;
        border: 0;
        padding: 0.2rem 0;
        overflow-wrap: anywhere;
    }
    .bt-tabel-liste td[data-label] { position: relative; padding-left: 7rem; }
    .bt-tabel-liste td[data-label]::before {
        content: attr(data-label);
        position: absolute;
        left: 0;
        width: 6.5rem;
        color: var(--bt-text-muted);
    }
    /* C · Kontakter (commit 3, kontrolpunktet 23/9, Mikaels valg C):
           soegefeltet faar sin egen linje, og antallet skjules — ellers
           er feltet 24 px bredt ved 390 px, ogsaa naar der soeges. */
    .bt-soeg-telefon form { flex-wrap: wrap; }
    .bt-soeg-telefon input[type="search"] { flex: 1 1 100%; }
    .bt-soeg-telefon .bt-soeg-antal { display: none; }
    /* D · Deltagerlisten (23/9-2026): knapperne fylder kortets bredde,
           saa »Mødt« kan rammes med en finger. */
    .bt-deltager-knapper form { display: flex !important; flex-wrap: wrap; gap: var(--bt-rum-2); }
    .bt-deltager-knapper .bt-btn { flex: 1 1 8rem; min-height: 44px; }
}
