/* ============================================================
   Power House Danmark — designsystem (Lærkes redesign)
   Bygget 2026-07-08. Genbrugeligt token-baseret system, så de
   19 andre sider kan arve farver/typografi/spacing.

   Struktur:
   1. Design tokens (:root)
   2. Reset + base
   3. Typografi
   4. Genbrugelige komponenter (container, knapper, placeholder)
   5. Forside-sektioner (.ph-*), oppefra og ned
   6. Responsivt
   ============================================================ */

/* ============================================================
   0. WEBFONTE — SELF-HOSTED, ALDRIG FRA ET CDN
   ------------------------------------------------------------
   Lærkes valg (7. august 2026):
     Power House   Barlow (brødtekst) + Inter (display)
     Power Studio  Humble Nostalgia (overskrifter) + Barlow (brødtekst,
                   knapper) — HN mangler stadig, se CLAUDE.md

   ⛔ TILFØJ ALDRIG ET <link> TIL fonts.googleapis.com ELLER rsms.me.
   Det er ikke en performance-detalje, det er GDPR — se ⛔-sektionen i
   CLAUDE.md. Filerne hentes med `python hent-fonte.py`, som også
   verificerer at hvert tegn sitet bruger, findes i fonten.

   ⚠️ FILERNE ER SUBSETTET til latinsk skrift. Det er lovligt her, fordi
   hverken Barlow eller Inter har "Reserved Font Name" — det gælder IKKE
   OFL-fonte generelt. OFL-Barlow.txt og OFL-Inter.txt ligger ved siden
   af filerne; dét er licensopfyldelsen og må ikke slettes.

   ⚠️ `font-display:swap` er et bevidst valg: teksten vises straks i
   fallback og skifter når fonten er hentet. Alternativet (`block`)
   giver usynlig tekst i op til 3 sekunder, hvilket er værre på en side
   hvor folk leder efter åbningstider.
   ============================================================ */
@font-face{
  font-family:"Barlow"; font-style:normal; font-weight:300; font-display:swap;
  src:url("../assets/fonts/barlow-300.woff2") format("woff2");
}
@font-face{
  font-family:"Barlow"; font-style:normal; font-weight:400; font-display:swap;
  src:url("../assets/fonts/barlow-400.woff2") format("woff2");
}
@font-face{
  font-family:"Barlow"; font-style:italic; font-weight:400; font-display:swap;
  src:url("../assets/fonts/barlow-400-italic.woff2") format("woff2");
}
@font-face{
  font-family:"Barlow"; font-style:normal; font-weight:600; font-display:swap;
  src:url("../assets/fonts/barlow-600.woff2") format("woff2");
}
@font-face{
  font-family:"Barlow"; font-style:normal; font-weight:700; font-display:swap;
  src:url("../assets/fonts/barlow-700.woff2") format("woff2");
}
@font-face{
  font-family:"Barlow"; font-style:normal; font-weight:800; font-display:swap;
  src:url("../assets/fonts/barlow-800.woff2") format("woff2");
}
/* Inter er VARIABEL — én fil dækker 100-900, derfor vægt-INTERVALLET her.
   Skriver man en enkelt vægt, holder browseren op med at bruge aksen. */
@font-face{
  font-family:"Inter"; font-style:normal; font-weight:100 900; font-display:swap;
  src:url("../assets/fonts/inter-var.woff2") format("woff2");
}

/* ✅ HUMBLE NOSTALGIA — Power Studios overskrifter. AKTIV 9. august 2026.
   De tre betingelser der stod her som blokerende, er alle indfriet: webfont-
   licensen er købt, æøå er bekræftet, og filerne ligger i assets/fonts/.

   ⛔ FAMILIEN HAR KUN REGULAR OG ÆGTE KURSIV — INGEN BOLD.
   Sæt ALDRIG font-weight over 400 på noget der bruger `--ps-font`. Browseren
   ville syntetisere en fed ved at fortykke konturerne, og det er grimt på en
   stram serif. Skal der fed skrift på en Studio-side, bruges BARLOW — den er
   allerede brødteksten og knapperne dér, så stakken findes i forvejen.

   ⛔ DEN ER KOMMERCIEL — DER LIGGER INGEN LICENSFIL VED SIDEN AF, OG DET ER
   IKKE EN FORGLEMMELSE. Barlow og Inter har `OFL-*.txt`, fordi det ER deres
   licensopfyldelse. Humble Nostalgia er et køb (Arterfak Project); kvitteringen
   er dokumentationen, ikke en tekstfil i repoet. Læg derfor ikke en OFL-fil
   her — den ville være direkte forkert.

   ⛔ OG DEN SUBSETTES IKKE, i modsætning til de to andre. Mange kommercielle
   EULA'er forbyder MODIFIKATION af fontfilen, selv når web-brug er tilladt.
   At fjerne glyffer er utvivlsomt en modifikation; at skifte container fra
   woff til woff2 er den mindst mulige ændring der overhovedet skal til.
   Alle 348/347 glyffer er urørte. Se hent-fonte.py.

   ⚠️ U+00A0 (no-break space) FINDES IKKE I FONTEN, og det er efterprøvet
   harmløst: ombrydning afgøres af tegnet i layout-motoren, ikke af fonten, og
   `&nbsp;` bruges kun i index.html, som sætter Barlow. Se BLOEDE_MANGLER i
   hent-fonte.py.

   ⚠️ Georgia bliver stående i `--ps-font` (§1) som reserve under indlæsning.
   ⚠️ 25,2 + 24,4 KB, og de hentes kun på sider der faktisk sætter --ps-font. */
@font-face{
  font-family:"Humble Nostalgia"; font-style:normal; font-weight:400; font-display:swap;
  src:url("../assets/fonts/humble-nostalgia-400.woff2") format("woff2");
}
@font-face{
  font-family:"Humble Nostalgia"; font-style:italic; font-weight:400; font-display:swap;
  src:url("../assets/fonts/humble-nostalgia-400-italic.woff2") format("woff2");
}

/* ---------- 1. DESIGN TOKENS ---------- */
:root{
  /* Farver — Lærkes OFFICIELLE brandpalet (2026-07-24) */
  --ph-blue:        #182263;   /* marineblå — bånd (tæller-bar, app-sektion) */
  --ph-blue-dark:   #101740;   /* mørkere navy til hover */
  --ph-black:       #191C1A;   /* mørk logo-stribe + footer + tekst */
  --ph-offwhite:    #EFEFED;   /* lyse sektioner (NB: palet-arkets #2E2113 er en fejl) */
  --ph-white:       #FFFFFF;
  /* Aliaser brugt i sektions-reglerne nedenfor */
  --ph-dark:        var(--ph-black);
  --ph-bg:          var(--ph-offwhite);
  --ph-surface:     #FFFFFF;
  --ph-ink:         var(--ph-black); /* tekst på lys baggrund */
  --ph-muted:       #5C5E63;   /* dæmpet tekst på lys (≥4.5:1 på offwhite) */
  --ph-on-dark:     rgba(255,255,255,0.75); /* dæmpet tekst på navy/mørk */
  --ph-line:        #DADAD8;
  /* Burgermenuen har sine EGNE to farver, målt i Lærkes Burgermenu.png.
     ⚠️ --ph-menu-dark er IKKE --ph-black (#191C1A): den måler #172627, altså en
     koldere, grønligere sort. Bekræft med Lærke om det er med vilje, eller om
     menuen skal bruge brand-sort. Navy-kortet i menuen måler #171F64 mod vores
     --ph-blue #182263 — 3 niveauer, altså reelt samme farve, så den genbruges. */
  --ph-menu-dark:   #172627;
  --ph-live:        #EE1527;   /* LIVE-badgens røde */
  /* Power Studios terrakotta. Målt til PRÆCIS #C6733F to uafhængige steder —
     Jobs.png's Studio-kort og hele båndet bag niveau-kortene på Power Studio
     underside — så det er en rigtig brandfarve, ikke en tilfældig nuance.
     ⚠️ Hvid tekst på den giver 3,4:1, altså under AA (4,5) for normal tekst.
     Den bærer 18px-teksten i Jobs-kortet i kraft af at være stor og fed nok
     til 3:1-reglen; brug den ikke til mindre tekst uden at måle igen. */
  --ph-orange:      #C6733F;

  /* Typografi — LÆRKES RIGTIGE FONTE, self-hostede (§0 øverst i filen).
     ⚠️ Fallback-stakken er ikke pynt: mellem sidens første maling og at
     woff2'en er hentet, sætter browseren teksten i den første tilgængelige
     font i stakken (font-display:swap). Systemstakken står derfor bagved,
     så et fejlet fontkald giver en almindelig side og ikke Times New Roman. */
  --ph-font-body: "Barlow", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --ph-font-display: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;

  /* ⚠️ POWER STUDIOS SERIF LIGGER I :root, IKKE UNDER body.ps — flyttet
     7. august 2026. Den stod scopet sammen med --ps-terra/--ps-ink/--ps-lys,
     men jobs.html har et Power Studio-KORT uden at være en Studio-side, og
     dér fandtes tokenet så ikke.

     ⛔ DET SVÆKKER IKKE BRAND-ADSKILLELSEN, og skub den ikke tilbage i den
     tro at det gør. FARVERNE er stadig scopet til body.ps — det er dem der
     ikke må smitte af. En font-stak i :root gør ingenting af sig selv; den
     virker kun dér hvor en regel udtrykkeligt beder om den, og det gør
     præcis to steder uden for Studio: Jobs-kortet og ingen andre.

     ✅ FONTEN ER INDE 9. august 2026 — Georgia er nu kun reserve under
     indlæsning. Se ⛔-noten ved @font-face i §0.

     ⛔ HVER ENESTE REGEL DER SÆTTER --ps-font, SÆTTER OGSÅ font-weight:400.
     Det ser overflødigt ud og er det ikke: fonten har KUN Regular, og en
     arvet fed vægt får browseren til at SYNTETISERE en — den fortykker
     konturerne, og det er grimt på en stram serif.

     ⚠️ OG DET ER IKKE TEORETISK. Målt 9. august 2026, før rettelsen: otte
     elementer stod til syntetisk fed, fordi de arvede 700 fra browserens
     standard for h1/h3 — værst holdplanens sidetitel i 42px.
     ⚠️ `.ps-linje` er det lærerige tilfælde: den er et <p> på
     power-studio.html (vægt 400, ingen fejl) og et <h1> på holdplan.html
     (vægt 700, fejl). SAMME KLASSE, forskellig arv. Man kan altså ikke
     læse sig til det i CSS'en — det skal måles på siderne.

     ⛔ SKAL DER FED SKRIFT PÅ EN STUDIO-SIDE, BRUGES BARLOW. Den er allerede
     brødtekst og knapper dér, så stakken findes i forvejen. Sæt aldrig
     font-weight over 400 på noget der bruger --ps-font. */
  --ps-font:"Humble Nostalgia", Georgia, 'Times New Roman', 'Iowan Old Style', serif;

  /* Spacing-skala */
  --ph-s1: 6px;  --ph-s2: 12px; --ph-s3: 18px; --ph-s4: 24px;
  --ph-s5: 36px; --ph-s6: 52px; --ph-s7: 72px; --ph-s8: 100px;

  /* Radius */
  --ph-radius: 14px;
  --ph-radius-lg: 22px;
  --ph-radius-pill: 999px;

  /* Layout */
  --ph-max: 1200px;
  --ph-gutter: 24px;

  /* ⛔ SIDEHOVEDETS VENSTREKANT — ÉT TAL TIL ALLE FEM KONTEKSTER.
     Forsiden, type B, Power Studios hero, type A's mørke bjælke OG selve
     menuen hænger alle på den her. Det er dét der gør, at burgeren står
     samme sted før og efter et klik, og ens fra side til side (Lærke,
     7. august 2026).

     ⚠️ DEN SKAL VÆRE EN VARIABEL, IKKE ET TAL SKREVET FEM STEDER. Da den var
     skrevet ud, stod venstrekanten på 28 / 32 / 47 / 66 / 43,6 alt efter
     side, og burgeren hoppede op til 90,6px. Vigtigere endnu: der ligger en
     `@media (max-width:860px)`-regel på .ph-bhero__top LÆNGERE NEDE i filen
     end mobilrettelserne, så en padding-shorthand dér ville overskrive en
     venstrekant sat tidligere. Med en variabel er rækkefølgen ligegyldig —
     media queries ændrer kun VÆRDIEN, ikke hvem der vinder kaskaden.
     Se lærdommen i CLAUDE.md om at en media query ikke hæver specificitet.

     ⚠️ Ændrer du den, flytter BÅDE logo og burger på hver eneste side. */
  --ph-hoved-x: 28px;

  /* Delt "wide" content-bredde. Proportional (% af sidebredden) OP TIL 1500px
     sidebredde, derefter FROSSET på 1500px-værdien. Bruges af trial-striben,
     tæller-bjælken, kort-rækken, app-sektionen og footeren, så deres kanter
     flugter lodret ned gennem siden (logo-marqueen er bevidst kant-til-kant).
     95.5vw = House 59.2 + gap 2.2 + Studio 34.1; cap = 95.5% af 1500px.
     GODKENDT af Lærke 25. juli 2026 — loftet er ikke længere foreløbigt. */
  --ph-wide: min(95.5vw, 1432.5px);

  /* Logo-marqueen. ⛔ VARIGHEDEN SÆTTES AF JS SIDEN 11. AUGUST 2026 — den her
     er kun FALLBACK, hvis scriptet ikke kører. Skru derfor IKKE her for at
     ændre farten; knappen er `PH_MARQUEE_PX_PR_S` i js/main.js.

     Hvorfor: keyframen flytter sporet `-100%/3`, altså en ANDEL af sporets
     bredde. Sporet krymper med gap'et, så gruppen går fra 1428,5px ved 1366
     til 993,7px ved 375 — mens en fast varighed står stille. Målt: 35,71 px/s
     på desktop mod 24,84 på telefon, altså 30,4% langsommere netop dér hvor
     der er mindst plads. En fast tid over en variabel afstand ER en variabel
     hastighed.
     De 40s er præcis rigtige ved 1366 (Lærkes godkendte fart), så fallbacken
     rammer desktop uændret. */
  --ph-marquee-duration: 40s;
  /* ⚠️ GULVET ER 18px, IKKE 36 — sænket 7. august 2026 fordi "nogle logoer er
     halve" på mobil. Årsagen var ikke marqueen, men clamp'ens gulv: 4,5vw
     rammer 36px allerede ved 800px bredde, så gap'et holder op med at skalere
     og bliver relativt dobbelt så bredt på en telefon (9,6% af viewporten ved
     375px mod 4,5% på desktop). Med et logo-pitch på 117px var der kun plads
     til 3,2 logoer ad gangen, og to af dem er altid skåret af kant-til-kant-
     striben — altså 63% halve mod 21% ved 1366px.

     Målt antal synlige logoer efter ændringen: 3,2 / 3,8 / 5,8 / 6,6 / 7,4 /
     9,6 ved 320 / 375 / 640 / 768 / 900 / 1366px — glat og monotont, ingen
     spids. Se ⛔-sektionen i CLAUDE.md om at teste responsive formler på
     MELLEMbredder; det er samme clamp-gulv-mønster.

     ⛔ GØR IKKE LOGOERNE MINDRE I STEDET. max-width/max-height er Lærkes
     optiske skala, og et skift i en @media giver et trin i forløbet hen over
     grænsen — netop den spids reglen forbyder. Gap'et alene er det rene greb.
     ⚠️ Sømmen er upåvirket: alle tre grupper får samme gap, så -100%/3 er
     stadig præcis én gruppe. Efterregnet til 0,00px ved 15 bredder. */
  --ph-marquee-gap: clamp(18px, 4.5vw, 72px);

  /* Samlet højde af de tre striber under heroen (trial + brands + counters).
     Måles og sættes af js/main.js, så heroen kan fylde resten af skærmen. */
  --ph-stripes-h: 0px;
}

/* ---------- 2. RESET + BASE ---------- */
*{ box-sizing:border-box; margin:0; padding:0; }
html{ -webkit-text-size-adjust:100%; }
body{
  font-family:var(--ph-font-body);
  color:var(--ph-ink);
  background:var(--ph-bg);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
}
img,video{ max-width:100%; display:block; }
a{ color:inherit; text-decoration:none; }
button{ font:inherit; cursor:pointer; }

.skip-link{
  position:absolute; left:-999px; top:0; z-index:200;
  background:var(--ph-ink); color:#fff; padding:10px 16px;
}
.skip-link:focus{ left:12px; top:12px; }
:focus-visible{ outline:2px solid var(--ph-blue); outline-offset:2px; }
.ph-visually-hidden{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;
}

/* ---------- 3. TYPOGRAFI ---------- */
.ph-display{
  font-family:var(--ph-font-display);
  font-weight:800; line-height:1.0; letter-spacing:-0.01em;
  text-transform:uppercase;
}
h1,h2,h3{ line-height:1.1; }

/* ---------- 4. GENBRUGELIGE KOMPONENTER ---------- */
.ph-container{ max-width:var(--ph-max); margin:0 auto; padding:0 var(--ph-gutter); width:100%; }

.ph-btn{
  display:inline-flex; align-items:center; justify-content:center;
  padding:13px 30px; border:none; border-radius:var(--ph-radius);
  background:var(--ph-ink); color:#fff; font-weight:700; font-size:0.95rem;
  letter-spacing:0.02em; transition:transform .2s ease, background-color .2s ease, box-shadow .2s ease;
}
.ph-btn:hover{ transform:translateY(-1px); box-shadow:0 8px 22px rgba(0,0,0,0.18); }
.ph-btn--pill{ border-radius:var(--ph-radius-pill); text-transform:uppercase; padding:13px 34px; }
.ph-btn--light{ background:#fff; color:var(--ph-ink); }
.ph-btn--blue{ background:var(--ph-blue); color:#fff; }

/* Ekstern-markør — sættes på links der FORLADER sitet og åbner et nyt faneblad
   (i praksis booking-systemet på goactivebooking.com).

   ⚠️ MARKERINGEN ER DOBBELT MED VILJE, fordi de to kanaler rammer hver sin bruger:
   pilen herunder er ren dekoration (aria-hidden), og beskeden til skærmlæsere
   ligger som .ph-visually-hidden-tekst inde i selve linket. Så bliver "åbner i nyt
   vindue" en del af linkets TILGÆNGELIGE NAVN — det annonceres altså sammen med
   navnet, i stedet for at brugeren først opdager det efter aktivering.

   ⚠️ `aria-hidden` PÅ SPANNET ER IKKE PYNT. Chrome regner ::before/::after-indhold
   MED i det tilgængelige navn, så uden den ville pilen blive læst højt som
   "pil mod nordøst" oven i den besked vi selv har skrevet. Glyffen ligger derfor
   i ::after OG spannet er skjult for tilgængelighedstræet.

   Glyffen står i CSS og ikke som tegn i markup'et, så den hverken kan markeres,
   kopieres med teksten eller fanges af en søgning på siden.

   ⚠️ KUN TIL ÉNLINJEDE FLADER (knapper). Forsøg ikke at sætte den inde i en
   flerlinjet overskrift: en inline-boks med vertical-align STRÆKKER linjeboksen,
   og da menukortets tekstblok er bundankret, skubber de ekstra 1,8px hele
   labelen opad — målt mod nabokortet, som ellers er millimeter-identisk.
   Forsøg på at neutralisere det med line-height:0 flytter til gengæld glyffen
   ned under grundlinjen, og vertical-align kan ikke løses lineært, fordi det at
   hæve boksen selv ændrer linjeboksen. Brug .ph-mcard--ext til mosaikkortene. */
.ph-ext{
  display:inline-block;
  margin-left:0.3em;
  /* Følger tekststørrelsen, så markøren skalerer med knappen den sidder i. */
  font-size:0.66em; font-weight:400;
  /* Løfter pilen op mod versalernes optiske midte i stedet for grundlinjen. */
  vertical-align:0.14em;
}
.ph-ext::after{ content:'\2197'; }

/* Tydelig placeholder til manglende assets (logo, QR, mockup, badges) */
.ph-ph{
  display:flex; align-items:center; justify-content:center; text-align:center;
  border:2px dashed rgba(120,120,130,0.55);
  background:repeating-linear-gradient(45deg, rgba(150,150,160,0.08) 0 10px, rgba(150,150,160,0.16) 10px 20px);
  color:var(--ph-muted); font-size:0.72rem; font-weight:600; letter-spacing:0.02em;
  padding:6px; border-radius:8px; line-height:1.25;
}
.ph-ph--on-dark{ color:rgba(255,255,255,0.75); border-color:rgba(255,255,255,0.35); }

/* Bokset wordmark-logo — Lærkes rigtige fil (assets/images/logo-power-house-*.webp).
   HØJDEN styrer størrelsen; bredden følger filens forhold. NB: forholdet er
   1,960:1, ikke Drive-filens 2,500:1 — de 2,5 er asymmetrisk transparent luft
   (1128px til venstre mod 799px til højre), som er trimmet væk i WebP'en.
   Pladsen var oprindeligt tegnet til ~1,82:1, så logoet bliver 8% bredere end
   den gamle tekst-placeholder; højden er uændret, så rytmen holder. */
.ph-logo{ display:inline-flex; }
.ph-logo img{ display:block; width:auto; height:54px; }
/* Over hero-videoen: samme drop-shadow-greb som burgeren, så den hvide boks
   også holder på lyse frames. */
.ph-logo--light img{ filter:drop-shadow(0 1px 5px rgba(0,0,0,0.45)); }
/* 41px = mockuppens logo (målt 80×41px, forhold 1,951 mod filens 1,959). */
.ph-footer__brand .ph-logo img{ height:41px; }

/* ---------- 5. FORSIDE-SEKTIONER ---------- */

/* 5.1 HERO — fylder skærmen MINUS de tre striber, så hero + striber er
   synlige samtidig ved load. --ph-stripes-h måles i js/main.js.
   Gulv (max/…) sikrer at heroen aldrig klemmes for lav på små skærme. */
.ph-hero{
  position:relative; overflow:hidden;
  min-height: calc(100vh - var(--ph-stripes-h));                  /* fallback */
  min-height: max(46svh, calc(100svh - var(--ph-stripes-h)));     /* svh + gulv */
}
/* ⚠️ max-width:none ER IKKE VALGFRI. Den globale reset på linje 93
   (`img,video{ max-width:100% }`) klemmer bredden tilbage til præcis 100%,
   mens HØJDEN slipper igennem — så overscanet virker lodret og fejler vandret.
   Elementet står på left:-2px, bliver 100% bredt i stedet for 100%+4px, og
   ender derfor 2px FØR containerens højre kant. Resultatet er en tynd stribe
   sidebaggrund langs højre side, som er lige præcis synlig nok til at ligne en
   video der ikke fylder ud. Målt på undersiden: video x −2..1349 i en
   container 0..1351. */
.ph-hero__video{
  position:absolute; inset:-2px; width:calc(100% + 4px); height:calc(100% + 4px);
  max-width:none;
  object-fit:cover; object-position:center; z-index:0;
}
.ph-hero__scrim{
  position:absolute; inset:0; z-index:1;
  background:linear-gradient(180deg, rgba(0,0,0,0.45) 0%, rgba(0,0,0,0.15) 30%, rgba(0,0,0,0.35) 100%);
}
/* ⚠️ VENSTRE PADDING ER 28px, IKKE 32 — og de 28 er IKKE et frit valg.
   Det er menuens egen venstrekant (.ph-menu__top, padding-left:28px), og
   dermed det ene tal der får sidens burger til at stå oven i menuens i stedet
   for at hoppe, når man trykker. Lærkes forside-mockup har logoboksen på x30,
   så de 28 ligger 2px fra hendes — nøjagtig lige så tæt som de gamle 32.
   Højre side er stadig 32, fordi QR-boksen hænger dér. */
.ph-hero__top{
  position:absolute; inset:0; z-index:2;
  display:flex; justify-content:space-between; align-items:flex-start;
  padding:28px 32px 28px var(--ph-hoved-x);
}
/* Fælles sidehoved-gruppe fra partials/header.html — logo over burger, altid
   øverst til venstre. Type A overskriver retningen; se §9. */
.ph-hoved{ display:flex; flex-direction:column; align-items:flex-start; gap:20px; }

/* ⛔ ÉN GEOMETRI TIL ALLE BURGERE — sidens og menuens. Rettet 7. august 2026.
   Tallene er menuens, målt i Lærkes Burgermenu.png: streger 53×5 med 6px
   imellem, øverste streg på x28/y31.

   ⚠️ FØR havde sidens burger sin EGEN geometri (46×40 med 8px padding og
   streger på 30×3), mens menuens havde 53×5. Da menuen er en fuldskærms-
   overlay der dækker sidens egen burger, så et klik derfor ud som om knappen
   HOPPEDE og voksede. Målt før rettelsen ved 1366px:

     kontekst        streger      spring til menuen
     forside         30×3 @x40    dx −12   dy −63,5
     type B          30×3 @x55    dx −27   dy −86,5
     type A          30×3 @x118,6 dx −90,6 dy +2

   ⛔ DE 8px PADDING VAR HELE GRUNDEN TIL AT BURGEREN IKKE FLUGTEDE MED LOGOET.
   Knappens boks stod ganske rigtigt i flugt, men stregerne sad 8px inde i den,
   og det er stregerne man ser. Lærkes forside-mockup har dem i flugt: logoboks
   x30, streger x32. Derfor padding:0 — og så ER knappens kant stregernes kant.

   ⚠️ SÆT IKKE PADDING PÅ IGEN for at gøre klikfeltet større. Brug i stedet et
   ::before-overlay, så trykfladen vokser uden at stregerne flytter sig. */
/* ⛔ IKONET ER LÆRKES MOSAIK SIDEN 10. AUGUST 2026 — OG DET ER KVADRATISK.
   Afløser de tre streger på 53×27. Mærket har blæk-bbox 432×432, altså
   forhold 1,00 mod burgerens 1,96: det er ikke en udskiftning af et billede
   i samme ramme, det er en anden FORM. Derfor 40×40 og ikke 53×27 — mases
   det ind i den gamle kasse, bliver felterne 12×6 i stedet for kvadrater.

   ⛔ 40px ER MÅLT, IKKE VALGT. Mosaikken er tre kolonner à 130 med 21px
   imellem (130·3 + 21·2 = 432). Ved 40px giver det felter på 12,04px med
   1,94px imellem — som læses rent. Ved burgerens gamle 27px ville de være
   8,1px med 1,3px imellem og flyde sammen på en telefon. Det var netop det,
   afvisningen 9. august handlede om; se ⛔-noten i CLAUDE.md.

   ⚠️ HEADEREN BLIVER IKKE MERE PRESSET I BREDDEN. 40 < 53, så ikonet er
   SMALLERE end det det afløser. Det er 13px højere, og dét er den eneste
   dimension der skal efterses — se målingerne af type A's tre-kolonne-gitter
   i CLAUDE.md.

   ⚠️ FARVEN KOMMER FRA `background-color`, IKKE FRA FILEN. SVG'en bruges som
   maske, hvor kun alfakanalen tæller, så ét mærke dækker både den mørke og
   den lyse flade — vi behøver ikke Lærkes to PNG'er. Samme mekanik som
   ti-*.svg. Skal burgeren en dag stå på en LYS flade, er det én regel:
   `background-color:var(--ph-black)`.
   ⚠️ `-webkit-mask` SKAL MED ved siden af `mask` — uden den falder ikonet
   bort på Safari før 15.4 og efterlader et tomt felt uden en konsolfejl.
   Samme fælde som handlings- og facilitetsikonerne. */
.ph-burger{
  display:block; width:40px; height:40px; padding:0; border:none;
  background-color:var(--ph-offwhite);
  -webkit-mask:url(../assets/icons/menu-mosaik.svg) center / contain no-repeat;
          mask:url(../assets/icons/menu-mosaik.svg) center / contain no-repeat;
  transition:opacity .2s ease;
  filter:drop-shadow(0 1px 4px rgba(0,0,0,0.5));
}
.ph-burger:hover{ opacity:.8; }
/* Trykfladen er større end ikonet, uden at ikonet flytter sig: 44×44 ramme
   centreret om de 40px, så knappen når Apples/WCAG's mål. ⚠️ Overlayet må
   IKKE bære baggrund — det ligger uden for masken og ville tegne en firkant. */
.ph-burger::before{
  content:""; position:absolute; left:-2px; right:-2px; top:-2px; bottom:-2px;
}
.ph-burger{ position:relative; }

.ph-hero__qr{ display:flex; flex-direction:column; align-items:center; gap:8px; }
.ph-qr__box{
  background:#fff; border-radius:10px; padding:12px; width:132px;
  display:flex; flex-direction:column; align-items:center; gap:8px;
  box-shadow:0 8px 24px rgba(0,0,0,0.25);
}
.ph-qr__label{ font-size:0.6rem; font-weight:800; letter-spacing:0.06em; text-transform:uppercase; text-align:center; color:var(--ph-ink); }
.ph-qr__code{ width:108px; height:108px; }
/* Mobil: QR erstattes af en "Hent appen"-knap (kan ikke scanne egen skærm) */
.ph-hero__app-link{ display:none; }

/* 5.2 TRIAL — lys stribe med Prøv Power */
.ph-trial{ background:var(--ph-bg); }
.ph-trial__inner{
  width:var(--ph-wide); max-width:none; margin:0 auto;   /* delt bredde → flugter med tællere/kort/app */
  display:flex; align-items:center; justify-content:center; gap:var(--ph-s4); flex-wrap:wrap;
  padding:18px 0;
}
.ph-trial__text{ font-size:0.98rem; font-weight:700; letter-spacing:0.06em; text-transform:uppercase; color:var(--ph-ink); }

/* 5.3 BRANDS — mørk logo-strip som uendelig marquee.

   Kant-til-kant (ingen container): logoerne glider ind og ud i skærmkanten,
   i stedet for at forsvinde ved en usynlig container-kant midt på skærmen.

   SØMLØST LOOP: sporet indeholder 3 identiske grupper og forskydes præcis
   calc(-100%/3) = én gruppes bredde. Når animationen springer tilbage til 0,
   står gruppe 2 dér hvor gruppe 1 lige stod → intet synligt hak.
   - Mellemrummet mellem grupperne ligger som padding-right PÅ gruppen (ikke
     som gap på sporet). En gap på sporet ville gøre -100%/3 forkert og give
     et spring ved hver ombrydning.
   - min-width:55vw pr. gruppe garanterer at de 2 synlige grupper altid dækker
     skærmen (110vw, dvs. 10% luft), så der aldrig opstår et tomt hul på meget
     brede skærme. Slår først til over ~2800px; på normale skærme er rækkens
     naturlige bredde større, så det har ingen effekt. */
.ph-brands{ background:var(--ph-dark); }
.ph-marquee{
  overflow:hidden;              /* mens den animerer: ingen manuel scroll */
  padding:18px 0;
}
.ph-marquee__track{
  display:flex; flex-wrap:nowrap; width:max-content;
  animation:ph-marquee-scroll var(--ph-marquee-duration) linear infinite;
  will-change:transform;
}
.ph-marquee__group{
  display:flex; flex-wrap:nowrap; align-items:center;
  flex:0 0 auto; min-width:55vw;
  gap:var(--ph-marquee-gap);
  padding-right:var(--ph-marquee-gap);
}
@keyframes ph-marquee-scroll{
  from{ transform:translateX(0); }
  to  { transform:translateX(calc(-100% / 3)); }
}
/* Pause når man peger på striben (og ved tastaturfokus i den).

   ⛔ GUARDEN ER IKKE VALGFRI — TILFØJET 7. august 2026, og det var årsagen til
   at marqueen "hakkede" på mobil. Uden `(hover:hover) and (pointer:fine)`
   sætter et tryk — eller bare en scroll-gestus hvor fingeren lander på striben
   — `:hover` på elementet, og den BLIVER siddende indtil man rører noget
   andet. Marqueen fryser altså og starter igen i tilfældige ryk. Det er ikke
   et animationsproblem; sømmen er efterregnet til 0,00px afvigelse ved 15
   bredder fra 320 til 3000px.

   ⚠️ Nøjagtig samme fælde er allerede dokumenteret for `.ph-fac`s dæmpning
   længere nede i filen ("sticky hover, hvor et tryk efterlader ét felt klart
   indtil man rører et andet"). Marqueen fik bare aldrig guarden. Tredje gang
   den slags rammer projektet — se ⛔-sektionerne i CLAUDE.md.

   ⚠️ `hover`/`pointer` beskriver ENHEDEN, ikke bredden. Den her sti kan derfor
   IKKE testes ved at gøre viewporten smal — heller ikke i en iframe. Slå
   blokken fra via CSSOM (`media.mediaText='not all'`) hvis den skal afprøves. */
@media (hover:hover) and (pointer:fine){
  .ph-marquee:hover .ph-marquee__track,
  .ph-marquee:focus-within .ph-marquee__track{ animation-play-state:paused; }
}

.ph-brand{
  flex:0 0 auto;
  width:auto; height:auto;
  max-height:34px; max-width:96px;   /* optisk højde, ikke pixel-højde: brede logoer
                                        (Eleiko/Life Fitness) bindes af bredden og bliver
                                        lavere; høje/smalle (Watson) bindes af højden. */
  object-fit:contain;
  opacity:0.92;
  /* Logoerne er allerede hvide PNG'er med transparens — INGEN filter/invert. */
}

/* 5.4 COUNTERS — blå bjælke med to tællere */
.ph-counters{ background:var(--ph-blue); color:#fff; }
.ph-counters__grid{
  width:var(--ph-wide); max-width:none; margin:0 auto;   /* delt bredde → flugter med kort/app */
  display:grid; grid-template-columns:1fr 1fr; gap:var(--ph-s5);
  padding:22px 0;
}
.ph-counter{ display:flex; align-items:center; gap:var(--ph-s4); }
/* ⛔ ORDDELING ER SLÅET FRA — ET BRANDNAVN MÅ ALDRIG BRÆKKES (8. august 2026).
   Her stod `hyphens:auto`, fordi "Reformerhold" (91,5px) ikke kunne være i en
   79px kolonne. Kuren var værre end sygdommen: Barlow delte ikke bare
   "Reformer-hold", den delte også "PO-WER STUDIO" midt i brandnavnet. Det er
   den slags man kun opdager ved at SE siden — koden så rigtig ud, og
   overflow-målingen var 0.

   ⛔ LØSNINGEN ER BREDDEN, IKKE DELINGEN. Kolonnen var 12ch = 78,8px, altså
   smallere end sit eget længste ord, mens der stod ~390px tom navy til højre
   for tallet. Der var aldrig pladsmangel.

   ⛔ OG BREDERE ER IKKE AUTOMATISK BEDRE — der er et LOFT. Målt i Barlow
   700/11,52px med 0,576px sperring:

     Reformerhold ............ 91,5   <- gulv: smallere, og ordet stikker ud
     Power Studio ............ 85,0
     Power House ............. 81,6
     Kg løftet i Power ...... 111,7   <- loft: bredere, og "Power House" deles
     Reformerhold i Power ... 141,5

   Fra 111,7px trækker browseren "Power" op på linjen før og efterlader
   "House i dag:" — altså præcis det brud vi lige har fjernet, bare et andet
   sted. Det brugbare interval er [91,5 ; 111,7). 100px ligger midt i og giver
   tre linjer i begge labels med begge brandnavne hele.

   ⚠️ px og ikke ch: `ch` måler cifferbredden "0", ikke ordbredder, og det var
   netop dét der lod kolonnen blive smallere end sit indhold uden at nogen så
   det. Graden er fast (0,72rem), så px er stabilt her.
   ⚠️ Markup'en har desuden hårde mellemrum i "Power&nbsp;House" og
   "Power&nbsp;Studio", så brandnavnene ikke KAN deles, uanset hvad der senere
   sker med bredden eller fonten. Fjern ikke det ene i tiltro til det andet —
   de dækker hver sin fejlkilde. */
.ph-counter__label{
  hyphens:none; -webkit-hyphens:none; overflow-wrap:normal;
  font-size:0.72rem; font-weight:700; letter-spacing:0.05em; text-transform:uppercase;
  color:rgba(255,255,255,0.85); max-width:100px; line-height:1.2;
}
.ph-counter__value{
  font-family:var(--ph-font-display); font-weight:800; font-size:clamp(1.8rem, 4vw, 2.8rem);
  letter-spacing:0.01em; font-variant-numeric:tabular-nums;
}

/* 5.5 SPLIT — to kort på lys baggrund.
   Proportioner målt i Lærkes mockup @1366px sidebredde:
   House  59.2×52.6vw (809×718px, forhold 1.13:1)
   Studio 34.1×52.6vw (466×718px, forhold 0.65:1)
   Begge kort er lige høje; House er markant bredere end Studio. Målene er
   i vw (procent af sidebredden), så de skalerer korrekt på alle skærme —
   derfor bryder grid'et ud af 1200px-containeren og centreres. */
.ph-split{ background:var(--ph-bg); padding:var(--ph-s6) 0; }
.ph-split__grid{
  width:var(--ph-wide); max-width:none; margin:0 auto; padding:0;   /* delt bredde, centreret */
  display:grid;
  grid-template-columns:59.2fr 34.1fr;       /* House : Studio (fylder --ph-wide) */
  gap:min(2.2vw, 33px);                       /* frys gap ved 1500px */
}
.ph-card{
  position:relative; overflow:hidden; border-radius:var(--ph-radius-lg);
  height:min(52.6vw, 789px); min-height:0;   /* lige høje; frys ved 1500px (789px) */
  display:flex; flex-direction:column; justify-content:space-between;
  padding:var(--ph-s5); color:#fff;
  background-size:cover; background-position:center; background-color:#333;
}
/* Baggrundsvideo i kortet. Lagdeling er EKSPLICIT (0/1/2) i stedet for at
   læne sig på DOM-rækkefølge: video i bunden, scrim over den, tekst øverst. */
.ph-card__video{
  position:absolute; inset:0; width:100%; height:100%;
  object-fit:cover; object-position:center; z-index:0;
  pointer-events:none;
}
/* Scrimmen er kraftigere i bunden end en stillbilled-scrim behøver: teksten
   skal kunne læses oven på LEVENDE video, hvor lyse partier bevæger sig ind
   og ud under den. Stoppet ved 72% holder hele tekstblokken mørk, ikke kun
   de nederste par pixels. */
.ph-card::after{
  content:""; position:absolute; inset:0; z-index:1;
  /* Formen er målt frem, ikke gættet. Scrimmen har to opgaver, som trækker hver
     sin vej: holde brødteksten læsbar oven på levende video, OG ikke gøre kortet
     mørkere end nødvendigt. Løsningen er at lade midten være næsten klar og
     samle mørket dér hvor teksten faktisk står (fra ~56% og ned).
     Målt på de faktiske tekstlinjer (ikke hele kortbredden) og med korrekt
     object-fit:cover-beskæring: overskrift og brødtekst lander på 5.9-7.0:1,
     mod 5.4-6.4:1 med den tidligere, samlet mørkere kurve — altså både lysere
     kort og bedre kontrast. Gns. alfa 0.36 mod 0.43 før. */
  background:linear-gradient(180deg,
    rgba(0,0,0,0.30) 0%,
    rgba(0,0,0,0.05) 40%,
    rgba(0,0,0,0.12) 56%,
    rgba(0,0,0,0.74) 78%,
    rgba(0,0,0,0.95) 100%);
}
.ph-card__logo, .ph-card__body{ position:relative; z-index:2; }
/* Kort-logoet står øverst, hvor scrimmen er lysest, og rammer 1.4-1.8:1 mod de
   lyseste frames — langt under AA. At gøre toppen mørk nok (alfa ~0.67) ville
   fjerne hele lysheds-gevinsten, så i stedet får teksten sin egen skygge, præcis
   som heroens header gør over videoen. */
.ph-card__logo{
  text-shadow:0 1px 3px rgba(0,0,0,0.55), 0 2px 14px rgba(0,0,0,0.65);
}
.ph-card__logo{ font-family:var(--ph-font-display); text-transform:uppercase; line-height:0.92; }
.ph-card__logo .thin{ display:block; font-weight:400; font-size:1.9rem; letter-spacing:0.02em; }
.ph-card__logo .bold{ display:block; font-weight:800; font-size:3.1rem; letter-spacing:-0.01em; }
/* ⛔ DEN NEGATIVE MARGIN OPHÆVER EN SYNTETISK KURSIV — FJERN DEN IKKE SOM
   "et mystisk tal". Inter har INGEN kursiv fil (assets/fonts/inter-var.woff2
   har kun akserne opsz og wght, italicAngle 0), så browseren syntetiserer
   kursiven ved at SKÆRE de oprette glyffer 14° om grundlinjen.
   "Studio" begynder med et RUNDT S, hvis venstrigste blæk ligger ~8-11px OVER
   grundlinjen — præcis dér hvor skæringen forskyder mest. Målt: skæringen
   alene flytter S'ets venstre ink +2,50px til højre, så STUDIO stod 2,00px
   inde under POWER. "House" rammes ikke, fordi H'ets venstrigste punkt ligger
   PÅ grundlinjen, hvor skæringen er nul — derfor er House-kortet rigtigt uden
   nogen korrektion, og derfor må denne regel kun ramme .italic.
   VÆRDIEN ER SWEEPET FREM, IKKE REGNET. Målt ink-afvigelse (STUDIO minus
   POWER) ved 49,6px, hvor House-kortets +0,125px er facit for "rigtigt":

       0em      +1,875   <- fejlen Lærke så
       −0,03em  +0,387
       −0,04em  −0,100   <- VALGT, 0,225px fra referencen
       −0,05em  −0,600
       −0,06em  −1,100

   ⚠️ −0,05em blev overvejet og fravalgt. Den ophæver skæringens fulde
   2,5px og lander dermed dér hvor den OPRETTE S ville ligge (−0,5px), altså
   med et rundt bogstavs optiske overskydning. Det er teoretisk pænere, men
   det er ikke dét House-kortet gør — og House er referencen for hvad der
   ser rigtigt ud. −0,04em rammer den bedst.
   ⛔ em, IKKE px: forskydningen er glyf-metrik gange grad, så en px-værdi
   ville skride lydløst, hvis logoet en dag bliver responsivt.
   ⛔ TALLET ER KALIBRERET TIL BOGSTAVET "S". Ændres ordet, skal det måles om.
   ⛔ KOMMER DER EN ÆGTE INTER-KURSIV, SKAL DEN HER VÆK. En rigtig kursiv har
   designede sidebearings, og så bliver korrektionen en ny fejl 2,5px den
   anden vej.
   ⚠️ MÅL INK, IKKE BOKS. Boksene flugter allerede på 0,000px på BEGGE kort —
   en fejlsøgning med getBoundingClientRect() konkluderer at alt er i orden.
   Fjerde gang den fælde rammer projektet.
   ⏳ Kun målt i Chromium (skew 13,99° = Skias standard). WebKit kan skråne
   anderledes; efterse på en iPhone. */
.ph-card__logo .italic{ font-style:italic; margin-left:-0.04em; }
.ph-card__body h3{ font-size:1.15rem; text-transform:uppercase; letter-spacing:0.02em; margin-bottom:var(--ph-s2); }
.ph-card__body p{ font-size:0.95rem; color:rgba(255,255,255,0.9); max-width:46ch; }

/* Klikbart kort (7. august 2026, Lærke) — Power House → power-house.html,
   Power Studio → power-studio.html.

   ⛔ GIV DET IKKE EN SYNLIG KNAP. Lærkes design har ingen, og et kort med
   en knap oven på videoen er en anden komposition end den hun har tegnet.
   Prisen er at HELE affordancen skal ligge i hover og fokus — nøjagtig samme
   situation som centerkortene på power-house.html, og løsningen er bevidst
   den samme, så de to steder ikke opfører sig forskelligt:

     løft        translateY(-4px)
     skygge      0 18px 40px
     videozoom   scale(1.03)
     understreg  kortets h3

   Fire samtidige signaler, så det også virker for den der ikke ser farve
   eller bevægelse. ⚠️ Rør ikke det ene uden at tage stilling til de tre
   andre — det er redundansen der er pointen. */
/* ⚠️ INGEN `color:inherit` HER. `.ph-card` sætter selv `color:#fff`, og en
   `color:inherit` på modifieren har samme specificitet men står senere — så
   den vinder og trækker korttekstens farve ned til sidens mørke `--ph-ink`.
   Resultatet er mørk tekst oven på en mørk video. Fanget ved at måle
   `getComputedStyle(kort).color` efter ændringen, ikke ved at kigge.
   `text-decoration:none` er derimod nødvendig — den fjerner <a>-understregningen
   fra brødteksten, så understregningen kun optræder som hover-signal på h3. */
.ph-card--link{ text-decoration:none; }
.ph-card--link .ph-card__video{ transition:transform .32s ease; }
.ph-card--link{ transition:transform .22s ease, box-shadow .22s ease; }
.ph-card--link:hover,
.ph-card--link:focus-visible{
  transform:translateY(-4px);
  box-shadow:0 18px 40px rgba(16,23,64,0.34);
}
.ph-card--link:hover .ph-card__video,
.ph-card--link:focus-visible .ph-card__video{ transform:scale(1.03); }
.ph-card--link:hover .ph-card__body h3,
.ph-card--link:focus-visible .ph-card__body h3{ text-decoration:underline; text-underline-offset:4px; }
/* ⚠️ Fokusrammen ligger UDEN FOR kortet på sidens offwhite bund og skal derfor
   have kontrast mod OFFWHITE — ikke mod kortets mørke video. Brand-sort giver
   14,6:1. Samme begrundelse som .ph-centre--link. */
.ph-card--link:focus-visible{
  outline:3px solid var(--ph-black); outline-offset:3px;
}
@media (prefers-reduced-motion: reduce){
  /* Skygge og understregning BLIVER — de er ikke bevægelse, og de bærer
     affordancen når løft og zoom slås fra. */
  .ph-card--link,
  .ph-card--link .ph-card__video{ transition:none; }
  .ph-card--link:hover,
  .ph-card--link:focus-visible{ transform:none; }
  .ph-card--link:hover .ph-card__video,
  .ph-card--link:focus-visible .ph-card__video{ transform:none; }
}

/* 5.6 GALLERY — mørk sektion, tre center-billeder i 3D-perspektiv.
   Mål (Lærkes mockup @1366): sektion 30.3vw (414px) · billedrække 24.7vw høj
   (338px) og 78.6vw bred (1073px) · hvert billede 26.2×24.7vw (358×338px,
   ~1.06:1, næsten kvadratisk) · ~38px luft over/under.
   NB: eksplicit vw-height overstyrer <img>'ens height-attribut (ellers tvang
   height="800" rækken op i 800px). 3D-transforms er rent visuelle og påvirker
   IKKE rækkens layout-mål, så proportionerne holder. */
/* ⛔ SEKTIONEN SKAL VÆRE 414px @1366 — MOCKUPPENS MÅL (Lærke, 10. august 2026).
   Ønsket var at app-modulet og karosellen skulle matche i størrelse. Målt i
   `Power house hjemmeside - Forside.png`: karosel-båndet er y1787..2200 =
   **414px**, app-sektionen y2201..2607 = **407px** — altså 7px fra hinanden.
   Hos os var app-sektionen allerede 407, mens karosellen kun var 353.
   ⛔ DET VAR DERFOR KAROSELLEN DER SKULLE VOKSE, IKKE APP-MODULET DER SKULLE
   SKRUMPE. `--ph-app-h` er den variabel BEGGE telefoners størrelse OG
   placering er udtrykt som brøkdele af; en nedskalering af app-sektionen
   ville have krympet telefongruppen 13% og revet den numerisk løste
   placering fra 10. august op. Rejs det ikke igen.

   ⚠️ PADDINGEN VAR ALLEREDE RIGTIG. Mockuppens bånd er 414 = 338 (billedrække)
   + 2 × 38 (padding), og 2,78vw ER de 38px. Hele forskellen lå i rækkens
   højde, som var 277. Rør derfor ikke paddingen for at justere højden —
   det er billedhøjden i .ph-gallery__item der styrer den. */
.ph-gallery{ background:var(--ph-dark); padding:min(2.78vw, 41.7px) 0; overflow:hidden; }

/* Scroll-containeren. Native scroll (ikke et JS-karusel-bibliotek), så touch
   får systemets egen scroll-fysik og momentum.
   - Er der plads til alle tre, er der intet at scrolle, og der kan hverken
     swipes eller trækkes. Bevægelsen aktiverer sig selv når indholdet er
     bredere end skærmen. Det følger af overflow-x:auto — ingen JS involveret.
   - overflow-y SKAL sættes eksplicit til hidden: sætter man kun overflow-x,
     beregner browseren overflow-y til auto, og billedernes box-shadow ville
     så give en lodret scrollbar.
   - padding-block giver skyggen plads inde i scroll-boksen; det negative
     margin-block trækker layoutet tilbage, så sektionens højde er uændret.
     Uden det ville overflow-y:hidden klippe skyggen af ved billedkanten. */
.ph-gallery__viewport{
  /* ⚠️ KAROSELLEN GÅR IKKE KANT-TIL-KANT. Den fylder de midterste 63% af
     sidebredden med sektionens baggrund synlig i begge sider. Det er dét der
     gør, at den læses som en cylinder: billederne når at bøje væk og forsvinde
     rundt om tromlen, i stedet for at blive klippet brat af skærmkanten.
     Måles i Lærkes EVO-reference. Frys ved 1500px som resten af designet.

     ⛔ HELE KAROSELLEN ER SKALERET ×1,22 DEN 10. AUGUST 2026 (Lærke), så
     sektionen rammer mockuppens 414px. Se ⛔-noten ved .ph-gallery.
     ⚠️ Viewport, billeder og rækkens padding er skaleret MED SAMME FAKTOR.
     Det er dét, der gør ændringen sikker: cylinderens form er defineret af
     to DIMENSIONSLØSE konstanter i js/main.js (STEP_ANGLE og
     PERSPEKTIV_FAKTOR), og perspektivet sættes af JS til 2,75 × den MÅLTE
     pitch. Skalerer man alt ens, er buen per konstruktion uændret — kun
     større. Skalerer man kun billederne, ændrer forholdet pitch/viewport sig,
     og så skifter både antallet af synlige billeder og buens udtryk. */
  width:min(76.86vw, 1152.9px); margin-inline:auto;
  overflow-x:auto; overflow-y:hidden;
  padding-block:40px; margin-block:-40px;
  /* INGEN scroll-snap. Den var 'proximity' (aldrig 'mandatory'), men selv proximity
     korrigerer landingspunktet og klipper udglidningen kort. En cylinder skal glide
     frit ud, ikke lande på et bestemt billede — derfor er snap droppet helt. */
  scroll-behavior:auto;              /* SKAL være auto: loop-springet i js/main.js
                                        forskyder scrollLeft én sætbredde, og med
                                        smooth ville springet blive animeret og synligt */
  -webkit-overflow-scrolling:touch;
  scrollbar-width:none;              /* skjult, men fuldt funktionel */

  /* ÉT FÆLLES FORSVINDINGSPUNKT for hele cylinderen.
     Perspektivet hører hjemme HER — ikke på billederne og ikke på rækken.
     - På billederne fik hvert billede sit eget forsvindingspunkt i sin egen
       midte. Så bliver det en flade der hælder, ikke en bue.
     - På rækken flytter origin sig med rækkens bredde (3370px+), så punktet
       havner langt uden for skærmen og ødelægger de fjerne billeder.
     Viewporten er derimod altid skærmbred, så 50% er præcis skærmens midte —
     og den bliver dér mens indholdet scroller forbi. Det er definitionen på
     en roterende cylinder set forfra.

     VÆRDIEN sættes af js/main.js til 2.75 × den MÅLTE afstand mellem to
     billeder (pitch). Den faktor er valgt så det yderste synlige billede
     forkortes til 72% af midterbilledets højde — Lærkes reference-mål.
     Perspektivet skal følge skærmbredden: en fast px-værdi er ca. én
     skærmbredde på desktop men 3-4 skærmbredder på en telefon, altså nærmest
     ortografisk, og så er cylinderen flad igen. Værdien nedenfor er kun
     fallback uden JS. ⚠️ Skaleret ×1,22 sammen med resten 10. august 2026. */
  perspective:min(76.86vw, 1152.9px);
  perspective-origin:50% 50%;
}
.ph-gallery__viewport::-webkit-scrollbar{ display:none; }
/* Grab-markøren vises KUN når der faktisk er noget at trække i (sættes af js/main.js) */
.ph-gallery__viewport.is-draggable{ cursor:grab; }
.ph-gallery__viewport.is-dragging{ cursor:grabbing; user-select:none; }

.ph-gallery__row{
  max-width:none;
  display:flex; align-items:center; justify-content:center;
  gap:20px;                /* Lærkes mål: ~20px luft mellem billederne */
  /* preserve-3d lader viewportens perspective nå HELE vejen ned til billederne.
     Uden den fladtrykker rækken sine børn, og så er der intet 3D at projicere.
     INGEN perspective her — den hører på viewporten, se ovenfor. */
  transform-style:preserve-3d;
  min-width:min-content;   /* centreret når der er plads, bredere end viewport når ikke */
  /* Halv viewport minus et halvt billede: så står billede 1 præcis centreret ved
     scrollLeft:0 (fallback uden JS). Med JS regnes startpositionen eksplicit.
     50% er af viewportens indre bredde, ikke af sidebredden. */
  padding-inline:calc(50% - min(26.22vw, 393.3px) / 2);
}
/* Wrapperen bærer LAYOUT og transformeres ALDRIG — den er målepunktet.
   js/main.js læser wrapperens getBoundingClientRect() og roterer det INDRE
   billede. Måling og anvendelse er dermed i samme referenceramme per
   konstruktion — uanset hvad iOS gør ved scroll-koordinaterne. Transformér
   den ikke: så måler man sin egen effekt og får et feedback-loop. */
.ph-gallery__item{
  flex:0 0 auto;
  /* Lærkes mål: midterbilledet er 26.22% af sidebredden, forhold 1.06
     (26.22 / 1.06 = 24.74). ALLE billeder har samme layoutstørrelse hele vejen
     rundt — kun rotationen og perspektivet får dem til at se smallere ud mod
     kanterne. Frys ved 1500px som resten.
     ⚠️ Var 21.5/20.28 indtil 10. august 2026. Højden er dét, der styrer
     sektionens 414px: 24.74vw = 338px @1366, plus 2 × 38px padding. Ændres
     højden, flytter sektionshøjden sig med — og så matcher den ikke længere
     app-modulet. Forholdet 1,06 er Lærkes og skal følge med bredden. */
  width:min(26.22vw, 393.3px); height:min(24.74vw, 371.1px);
  /* preserve-3d OGSÅ her: 3D-kæden er viewport(perspective) → række → wrapper →
     billede, og HVERT mellemled fladtrykker som standard (transform-style:flat).
     Uden denne linje gengives billederne ortografisk — ren cos-formindskelse,
     intet fælles forsvindingspunkt. Målt: perspektiv-trækket var 0px uden, og
     debug-feltet meldte korrekt FLADT. Wrapperen forbliver selv utransformeret
     og er stadig et rent målepunkt. */
  transform-style:preserve-3d;
}
/* ⚠️ SELEKTOREN ER STRUKTUREL, IKKE EN KLASSE — ændret 7. august 2026 så et nyt
   karusel-billede kun kræver ÉT nyt element og ingen klasser at holde styr på.
   `.ph-gallery__img` er væk fra markup'en; billedet er altid wrapperens eneste
   barn, og js/main.js har aldrig brugt klassenavne (den går på row.children og
   firstElementChild), så der er intet der kan komme ud af sync. */
.ph-gallery__item > img{
  display:block; width:100%; height:100%;
  object-fit:cover; border-radius:16px;
  box-shadow:0 24px 50px rgba(0,0,0,0.55);
  -webkit-user-drag:none; user-select:none;
  cursor:zoom-in;
}

/* 5.6b LIGHTBOX — klik på et karosel-billede åbner det stort.
   Bygges af js/main.js; uden JS findes den slet ikke (og et klik gør intet). */
.ph-lightbox{
  position:fixed; inset:0; z-index:120;
  display:flex; align-items:center; justify-content:center;
  background:rgba(10,10,12,0.94);
  /* Sluger browserens egne gestus, så swipe til siden/ned er vores.
     Siden bag er alligevel scroll-låst, så der er intet at panorere. */
  touch-action:none;
  animation:ph-lb-ind .18s ease-out;
}
@keyframes ph-lb-ind{ from{ opacity:0 } to{ opacity:1 } }
.ph-lightbox[hidden]{ display:none; }

/* Så stort som muligt UDEN beskæring.
   Boksen får FASTE mål og billedet `object-fit:contain`, så det skaleres op til
   at fylde og indpasses med korrekt forhold.
   To varianter der IKKE virker, begge afprøvet:
   - kun `max-width/max-height`: billedet vokser ikke, det bliver bare loftet, og
     et 456px-billede står i naturlig størrelse midt på en tom skærm.
   - `width` sat + `height:auto` + `max-height`: browseren klamper højden UDEN at
     bevare forholdet — målt 1257×697 (forhold 1,80) på et 1,06-billede.
   ⚠️ Kilderne er kun 455×768-udsnit fra et lavopløst ark, så billedet opskaleres
   ~2,7× og bliver blødt. Se CLAUDE.md — Lærkes originaler skal være mindst
   1600px på den lange led. */
.ph-lightbox__img{
  width:min(92vw, 1600px); height:82vh;
  object-fit:contain;
  -webkit-user-drag:none; user-select:none;
}

.ph-lightbox__knap{
  position:absolute; z-index:1;
  display:flex; align-items:center; justify-content:center;
  border:none; border-radius:var(--ph-radius-pill);
  background:rgba(255,255,255,0.12); color:#fff;
  font-family:var(--ph-font-body); line-height:1;
  transition:background-color .15s ease, transform .15s ease;
}
.ph-lightbox__knap:hover{ background:rgba(255,255,255,0.24); }
.ph-lightbox__knap:active{ transform:scale(0.94); }
.ph-lightbox__luk{ top:18px; right:18px; width:46px; height:46px; font-size:1.7rem; }
.ph-lightbox__pil{ top:50%; margin-top:-27px; width:54px; height:54px; font-size:2rem; }
.ph-lightbox__pil--v{ left:18px; }
.ph-lightbox__pil--h{ right:18px; }

.ph-lightbox__taeller{
  position:absolute; left:0; right:0; bottom:22px;
  text-align:center; color:rgba(255,255,255,0.85);
  font-size:0.85rem; font-weight:700; letter-spacing:0.08em;
  font-variant-numeric:tabular-nums;
}

@media (max-width:640px){
  /* Pilene ville dække billedet på en telefon — dér bladrer man ved at swipe. */
  .ph-lightbox__pil{ display:none; }
  .ph-lightbox__img{ max-width:94vw; max-height:74vh; }
  .ph-lightbox__luk{ top:12px; right:12px; }
}
@media (prefers-reduced-motion: reduce){
  .ph-lightbox{ animation:none; }
  .ph-lightbox__knap:active{ transform:none; }
}
/* Alle tre bærer deres EGEN perspective() — de må ikke læne sig på rækkens.
   Med 3 billeder faldt rækkens midte sammen med skærmens, så rækkens
   perspective-origin lå bag midterbilledet og translateZ pegede lige mod
   beskueren. Med 12 billeder er rækken 4588px bred, origin ligger langt til
   højre, og translateZ forskød `--c` 40px sidelæns. Med perspective() i
   elementets eget transform er origin dets egen midte, og udtrykket giver
   nøjagtig samme gengivelse som Lærkes godkendte layout — uanset rækkebredde. */
/* Fallback uden JS. INGEN egen perspective() — den kommer nu fra viewporten,
   og en ekstra her ville give dobbelt projektion.

   ⛔ MØNSTERET ER `:nth-child`, IKKE KLASSER — ændret 7. august 2026.
   Før stod der `--l` / `--c` / `--r` på hvert billede, gentaget i grupper af
   tre hele vejen ned gennem markup'en. Det betød at man ikke bare kunne
   TILFØJE et billede: man skulle også vide hvilken af de tre klasser der stod
   for tur, og en fejl dér var usynlig indtil nogen slog JavaScript fra.
   Nu udleder CSS'en selv positionen i trioen, og markup'en er ren.

   ⚠️ DE HER TRE REGLER SES KUN UDEN JAVASCRIPT. js/main.js skriver en inline
   `style.transform` på hvert billede (linje ~777), regnet ud af wrapperens
   MÅLTE position, og en inline style slår enhver klasse eller nth-child.
   Reglerne er altså ikke "det karusellen ser ud som" — de er det statiske
   udgangspunkt for den der ikke kører JS.

   ⚠️ Klonerne tælles med i nth-child, og det er rigtigt: JS lægger et helt
   sæt foran og bagved, så 3n-rytmen fortsætter ubrudt gennem alle tre sæt,
   præcis som da klasserne stod i markup'en. */
.ph-gallery__item:nth-child(3n+1) > img{ transform:rotateY(18deg) scale(0.92); }
.ph-gallery__item:nth-child(3n+2) > img{ transform:translateZ(40px) scale(1.04); }
.ph-gallery__item:nth-child(3n+3) > img{ transform:rotateY(-18deg) scale(0.92); }

/* 5.7 APP — blå sektion. Højde ≈30% af sidebredden (Lærkes 407px @ 1366px = 29.8%).
   ⚠️ ALLE mål herunder er skrevet af Lærkes mockup, målt ved 1366px sidebredde, og
   omsat til vw (px/1366) så kompositionen skalerer. Sektionen er y2201–2607 i
   mockuppen; lokale y-tal nedenfor er derfor mockup-y minus 2201.
   ⚠️ Telefonen stikker IKKE længere op over sektionen — den starter 17px INDE i den
   og løber ud gennem UNDERkanten, hvor .ph-app{overflow:hidden} klipper den. */
.ph-app{ background:var(--ph-blue); color:#fff; overflow:hidden; }
.ph-app__grid{
  width:var(--ph-wide); max-width:none; margin:0 auto; padding:0;   /* delt bredde → flugter med kort/tællere */
  position:relative;                 /* referenceramme for de to absolut placerede blokke */
  /* ⛔ SEKTIONSHØJDEN ER ET TOKEN, FORDI TELEFONEN HÆNGER PÅ DEN (7. aug. 2026).
     Før stod højden her som et tal, mens telefonen var sat i rå vw — to
     skaleringer i samme sektion, der divergerede. Se .ph-app__phone-wrap. */
  --ph-app-h: clamp(300px, 29.8vw, 520px);
  height:var(--ph-app-h);
}

/* Tekst + badges: BUNDANKRET, så badge-rækkens underkant står 55px over sektionens
   (mockup y2553 af 2607). Derfra giver linjehøjde + mellemrum teksten dens ink-top
   ved mockuppens y2448 = 247px nede = 60,7% af sektionshøjden.
   x-inset 59,25px = mockuppens x90 minus containerens venstre kant (30,75px @1366).
   ⚠️ Målt fra CONTAINEREN, ikke fra sidekanten: browserens 15px scrollbar flytter
   --ph-wide 7,7px til venstre, og indholdet skal flytte med, så app-sektionen bliver
   ved at flugte med tæller-bjælken og footeren. Absolutte x-tal rammer derfor
   mockuppen på pixlen først når scrollbaren er væk — se CLAUDE.md. */
.ph-app__text{
  position:absolute; left:4.338vw; bottom:4.026vw;   /* 59,25px / 55px @1366 */
  max-width:none;
}
/* 21px @1366 → ink-højden bliver præcis mockuppens 21px, og sætningen står på ÉN
   linje (503,9px). ⚠️ max-width:34ch stod her før og brød den i to. */
.ph-app__text p{ font-size:clamp(1rem, 1.537vw, 23px); margin-bottom:1.700vw; }

/* Badges SIDE OM SIDE — aldrig stablet. 58px høje og 32px imellem giver præcis
   mockuppens 189 + 32 + 193 = x90→x502, fordi badge-filerne har samme forhold
   (207/64 og 212/64). ⚠️ nowrap: med wrap + den gamle 34ch-brede tekstkolonne
   ombrød de til to rækker. */
.ph-app__badges{ display:flex; flex-wrap:nowrap; gap:2.343vw; align-items:center; }
.ph-app__badge{ display:inline-flex; transition:opacity .2s ease; }
.ph-app__badge:hover{ opacity:.85; }
/* ⛔ DE TO BADGES HAR IKKE SAMME CSS-HØJDE — OG DET ER MED VILJE (7. aug. 2026).
   Det ser ud som en fejl i koden og er det modsatte. Årsagen er at de to
   officielle filer bærer deres frizone forskelligt, målt i filerne selv:

     Apple  app-store-da.svg   viewBox 119,66×40   artwork = HELE lærredet
     Google google-play-da.png 646×250, ink 646×192, altså 29px gennemsigtig
                               top og bund og 0px i siderne

   Sætter man begge på 58px, bliver Googles PILLE kun 58×192/250 = 44,5px —
   altså 23% mindre end Apples. Det bryder Googles egen regel om at deres badge
   skal være mindst lige så stor som de øvrige. Fejlen er usynlig i koden,
   fordi der ville stå 58 begge steder.

   Derfor: Apple får højden direkte, Google får den skaleret med 250/192, og
   den negative margin trækker den ekstra lærredshøjde ud af LAYOUTET igen.
   ⚠️ Den negative margin er ikke kosmetik: badge-rækken er bundankret, og dens
   underkant er målt til 55px over sektionens (mockup y2553 af 2607). Uden den
   ville rækken vokse til 75,5px og skubbe hele den målte komposition.

   ⚠️ Frizonen (¼ af badgehøjden = 14,5px @58) er efterregnet: gap 2.343vw =
   32px @1366 dækker de 29px der kræves mellem dem. Hverken Apples eller den
   danske Google-fil har vandret frizone indbygget, så luften ud til
   naboelementerne skal komme fra CSS. */
.ph-app__badge img{ height:clamp(44px, 4.246vw, 64px); width:auto; display:block; }
.ph-app__badge--google img{
  height:calc(clamp(44px, 4.246vw, 64px) * 250 / 192);
  margin-block:calc(clamp(44px, 4.246vw, 64px) * -29 / 192);
}

/* ⚠️ MOCKUPPENS x749..1194 ER TELEFONENS SYNLIGE SILHUET — ikke elementets bredde
   og ikke det roterede rektangels bbox. To ting skubber dem fra hinanden:
   telefonens hjørner er afrundede, så de yderste pixels ligger inde i rektanglet,
   OG sektionen klipper de nederste ~420px væk — netop dér hvor den roterede
   venstre kant stikker længst ud. Målt på samme element: 446px rektangel-bbox mod
   kun 381px synlig. Den synlige bredde vokser derfor SUB-lineært med elementets,
   og der findes ingen lukket formel.
   ⛔ REGN DEN IKKE UD — LØS DEN NUMERISK. Værdierne herunder er fundet ved at
   rendere headless ved 1366px og måle silhuetten i PNG'ens pixels (3 iterationer,
   scratchpad/solve2.py). Samme lære som karosellen: mål, gæt ikke.
   Ændres vinklen, bredden eller sektionshøjden, skal de løses forfra.

   ⚠️ DE 254px ER LÆRKES ENKELTE TELEFON — ikke hele telefongruppen. Mockuppen har
   TO telefoner: en bagside fra x749 til sømmen ved ~x940, og forsiden fra x940 til
   x1194. Bruger man gruppens fulde 446px til vores ene telefon, bliver den 1,75×
   for bred. Vi viser derfor kun forsidens felt, og venstre side står tom, indtil
   bagside-renderen er skaffet fra Lærke (se CLAUDE.md). */
/* ⛔ MÅLENE HÆNGER PÅ SEKTIONEN, IKKE PÅ VIEWPORTEN — lagt om 7. august 2026.
   Før stod her `left:67.496vw; top:1.611vw; width:16.520vw`, altså rå vw, mens
   ALT andet i sektionen var klampet: bredden af `--ph-wide` (fryser ved 1500px
   viewport) og højden af `clamp(300px, 29.8vw, 520px)` (klampet under 1007px og
   over 1745px). Tre skaleringer der divergerede, og kun zonen 1007-1745px var
   rigtig. Målt før: telefonen fyldte 55,4% af sektionshøjden dér, men 47,4% ved
   860px og 81,3% ved 2560px — og fra 1705px stak den ud over containerens højre
   kant, så den ikke længere flugtede med tællerbjælke, kort og footer.

   ⚠️ Det er mellembredde-fælden fra CLAUDE.md i en ny variant: 1366 var rigtig,
   og BÅDE 900 og 1920 var forkerte. Nu er forholdet konstant, fordi de tre mål
   deler samme to klampede kilder:
     left   % af `--ph-wide`      (containerens egen bredde)
     top    brøkdel af `--ph-app-h`
     width  brøkdel af `--ph-app-h`
   Fryser containeren, fryser telefonen med.

   ⛔ TOPPEN ER FLYTTET FRA MOCKUPPENS y17 TIL y30 (Jonas, 7. august 2026).
   De 17px var TELEFONGRUPPENS top, ikke forsidens. Mockuppen har to telefoner,
   og en segmentanalyse række for række viser at kun bagsiden findes ved y18-29;
   forsiden dukker først op ved y30. Da man i juli målte gruppens omrids, blev
   gruppens toppunkt tilskrevet den ene telefon der blev bygget.
   ⚠️ Telefonen bliver derfor ~3 procentpoint mere klippet af sektionens
   underkant. Det er tilsigtet — mockuppen er facit.

   ⚠️ Brøkerne er afledt af de gamle, numerisk løste værdier ved 1366px, så
   silhuetten står uændret bredt (254px) og på samme x. Kun y er flyttet:
     left   891,3 / 1304,5 = 68,32%
     top    (22,0 + 13,0) / 407,1 = 8,598%
     width  225,7 / 407,1 = 55,44%
   ⛔ Ændres vinklen eller den synlige bredde, skal silhuetten løses NUMERISK
   forfra — se ⛔-sektionen om at mockup-mål på et roteret billede er
   silhuettens, ikke elementets. */
.ph-app__phone-wrap{
  position:absolute;
  left:68.32%;                              /* af --ph-wide → silhuet x940..1194 */
  top:calc(var(--ph-app-h) * 0.08598);      /* 35,0px @1366 → silhuet-top y30 */
  width:calc(var(--ph-app-h) * 0.5544);     /* 225,7px @1366 → 254px SYNLIG bredde */
}

/* Telefon-mockup: Lærkes EGEN render, nøglet fri af den hvide bund og lagt ind som
   ét WebP med alfa. Der er INGEN CSS-ramme — metalkant, bezel og hjørneradius
   sidder i billedet.
   ⚠️ `filter:drop-shadow`, IKKE `box-shadow`: box-shadow følger elementets
   RETTANGEL og ville tegne en firkantet skygge rundt om en telefonformet billedfil.
   drop-shadow følger alfakanalen og lægger sig derfor om selve telefonen. Nu hvor
   billedet er roteret, gælder det dobbelt.

   ⚠️ BREDDEN PÅ WRAPPEREN ER ELEMENTETS, IKKE DEN SYNLIGE — se målingerne dér.
   Ændres vinklen, holder de tre faktorer ikke længere; mål dem forfra på et
   headless-render frem for at regne dem ud. */
.ph-app__phone{
  position:static; margin:0; display:block; width:100%; height:auto;
  /* 5,32°, toppen mod HØJRE. ⚠️ IKKE de 10,00° som Lærkes rå "skrå"-render måler —
     hun har modroteret den ~4,7° i selve kompositionen, så mockuppen står på 5,32°
     (Jonas' linjefit på forreste telefons højre kant: −0,0932 px/række, residual
     0,41px over 320 rækker). Målet er mockuppen, ikke kildefilen. */
  transform:rotate(5.32deg);
  transform-origin:50% 50%;         /* = bbox-midten, som wrapperen er placeret på */
  filter:drop-shadow(0 10px 26px rgba(0,0,0,0.34)) drop-shadow(0 2px 6px rgba(0,0,0,0.26));
}

/* ⛔ BAGSIDETELEFONEN — mockuppens VENSTRE telefon, indsat 10. august 2026.
   Feltet x749..940 stod tomt siden 26. juli, fordi renderen var for lille.
   Jonas har besluttet at den bruges som den er; se CLAUDE.md for hvad det
   koster og hvad der skal skiftes, hvis der kommer en større eksport.

   ⛔ DEN ER ROTERET 6,59° — IKKE FORSIDENS 5,32°. Lærke har vippet de to
   telefoner forskelligt, og det er MÅLT i mockuppen, ikke antaget: et
   linjefit på bagsidens venstre kant giver −0,1156 px/række (residual
   0,38px over 340 rækker) mod forsidens −0,0929. Samme metode reproducerer
   forsidens 5,31° mod CLAUDE.md's 5,32, så metoden er valideret.
   ⚠️ Sætter man dem ens, hælder de to telefoner synligt forskelligt fra
   mockuppen — det er dén slags der ser "næsten rigtigt" ud.

   ⚠️ KILDEN ER EN FLAD RENDER, MOCKUPPENS ER EN PERSPEKTIVISK. Målt på
   kameratrekanten: kilden 72,0/78,6/78,7 mod mockuppens 52,2/57,4/71,3.
   Det er altså ikke samme render, og en pixelmatch er derfor ikke mulig.
   Rotationen og placeringen er mockuppens; dybden er det ikke.

   ⛔ TALLENE ER LØST NUMERISK PÅ SILHUETTEN, ikke regnet ud. Et roteret,
   afrundet motiv har en silhuet der hverken er elementets boks eller det
   roterede rektangels bbox — se ⛔-sektionen i CLAUDE.md. Ret dem aldrig
   analytisk; render headless, mål alfakanalen, gentag. */
.ph-app__phone-wrap--bag{
  left:56.79%;                              /* af --ph-wide → silhuettens venstre kant rammer x749 ved sektionsbunden */
  top:calc(var(--ph-app-h) * 0.0597);       /* → silhuet-top y18, altså 12px over forsidens y30 */
  width:calc(var(--ph-app-h) * 0.5528);     /* 225,0px @1366 — samme telefonstørrelse som forsiden */
}
.ph-app__phone--bag{
  transform:rotate(6.59deg);
  /* ⚠️ Svagere skygge end forsidens: den ligger BAG og skal ikke tage
     opmærksomhed fra skærmen ved siden af. */
  filter:drop-shadow(0 8px 20px rgba(0,0,0,0.30));
}

/* 5.8 FOOTER — målt i Lærkes mockup (y2608..2707) og ramt.
   ⚠️ BAGGRUNDEN ER OFFWHITE, IKKE HVID, OG DER ER INGEN KANTLINJE. I mockuppen er
   footeren altså ikke en selvstændig flade oven på siden — den ER sidens baggrund,
   og navy-sektionens underkant er hele adskillelsen. Målt: y2607 er navy, y2608 er
   #EFEFED, uden en pixel imellem. En `border-top` ville tegne en streg dér som
   mockuppen ikke har. (Stod som `--ph-surface` + 1px `--ph-line` indtil 26. juli.) */
.ph-footer{ background:var(--ph-offwhite); }
.ph-footer__inner{
  width:var(--ph-wide); max-width:none; margin:0 auto;   /* delt bredde → flugter med trial/tællere/kort/app */
  display:flex; align-items:center; justify-content:space-between; gap:var(--ph-s4); flex-wrap:wrap;
  /* 29,5px + logoets 41px + 29,5px = mockuppens 100px båndhøjde. Faste px, ikke vw:
     båndet er 100px i mockuppen, og en vw-værdi ville gøre det højere på brede
     skærme og dermed modsige målet. */
  padding:29.5px 0;
}
/* Brand-blokken måler 206px i mockuppen (x26..231): tekst 103px + gap 23 + logo 80.
   ⚠️ Det var TEKSTEN der var for lille — vores logo var faktisk større end
   mockuppens (48px mod 41px). 20px rammer både tekstens 103px bredde OG dens 20px
   ink-højde; to uafhængige mål peger på samme tal.
   ⚠️ Farven er `--ph-ink`, ikke `--ph-muted`: mockuppens tekst måler rgb(26,28,25),
   altså brand-sort. Med den gamle dæmpede grå ville forstørrelsen til 20px have
   gjort afvigelsen tydelig. */
/* ⚠️ 18px, IKKE mockuppens 20 — sænket 7. august 2026 på Lærkes anmodning
   ("Powered by må gerne være en anelse mindre"). Det er en bevidst afvigelse
   fra et MÅLT mockup-tal: hendes tekst er 103px bred med ink-højde 20, og de
   20px ramte begge dele på én gang. Ved 18px bliver den ~90px.
   Nyere instruks slår ældre måling — men skriv det ikke om til 20 igen i den
   tro at mockuppen er facit. */
.ph-footer__brand{
  display:flex; align-items:center; gap:23px;
  font-size:18px; color:var(--ph-ink);
}
/* Sociale ikoner — skåret ud af Lærkes "Sociale medie ikoner til bundfunnel.jpeg"
   og nøglet fri, så de har alfa (assets/icons/social-*.webp).

   ⚠️ ALLE SEKS LIGGER PÅ DET SAMME KVADRATISKE LÆRRED (342px kilde → 96px fil) i
   samme skala. Derfor giver ÉN css-størrelse præcis mockuppens indbyrdes
   størrelsesforskelle af sig selv: 32,5 / 33,0 / 34,6 / 32,5 / 34,0 / 33,8 px mod
   mockuppens målte 32 / 32 / 34 / 32 / 34 / 34. Lærke har nemlig placeret dem i
   ensartet SKALA, ikke ensartet højde — det ses på at hendes højder er 33/33/34/
   33/34/34, altså netop de små forskelle ikonerne har i arket. Sætter man i stedet
   en fast fælles højde, forsvinder de forskelle.
   ⚠️ Ikonernes lyse partier er UDSTANSNINGER — gennemsigtige, ikke hvid maling. De
   tager altså footerens farve. Se CLAUDE.md.
   Luften er sat så rækkens samlede bredde bliver mockuppens 236px.

   ⛔ TAPMÅLET ER 44px HØJT — OG DET KOSTER IKKE ÉN PIXEL LAYOUT (8. aug. 2026).
   Linket var før nøjagtig lige så stort som ikonet: 21×21px på mobil, altså et
   mål man skal ramme med en fingerspids. Nu bærer <a>'et en padding op til
   44px, og en NEGATIV margin af samme størrelse trækker den ud af layoutet
   igen. Ikonet vokser ikke, rækken vokser ikke, og footerens højde er uændret
   — det tomme felt over og under ikonerne bliver bare klikbart. Der er 22px
   footer-padding i hver ende på mobil, så de 11,5px overhæng rammer intet.

   ⛔ VANDRET KAN 44px IKKE LADE SIG GØRE, OG DET ER ARITMETIK — IKKE DOVENSKAB.
   Seks mål à 44px er 264px alene. Mockuppens ikonrække er 236px, og på en
   375px telefon skal rækken desuden dele pladsen med brand-blokkens 130px:
   264 + 130 = 394 > 375. Selv kant til kant uden luft går det ikke op. Vi
   tager derfor al den bredde der ER, ved at lægge luften mellem ikonerne INDE
   i linket i stedet for i `gap` — samme visuelle afstand, men mellemrummet er
   nu en del af nabomålet frem for dødt felt.

   ⚠️ Første og sidste link får en negativ margin på en halv luft, så rækkens
   ydre kanter står præcis hvor de stod. Uden den ville rækken blive én luft
   bredere, og de 236px — som er et MÅLT mockup-tal — ville skride.

   ⚠️ Tokens frem for gentagne clamps: padding-block regnes ud FRA ikonstørrelsen
   (44 − ikon)/2, så de to tal ikke kan drifte fra hinanden. Ændrer man
   --ph-social-ikon, følger tapmålet med af sig selv. */
.ph-social{
  --ph-social-ikon:clamp(28px, 2.540vw, 38px);   /* 34,7px @1366 = mockuppens mål */
  --ph-social-luft:clamp(5px, 0.430vw, 7px);
  display:flex; align-items:center; gap:0;
}
.ph-social a{
  display:flex; align-items:center; justify-content:center;   /* ingen plade bag: ikonet ER formen */
  padding-block:calc((44px - var(--ph-social-ikon)) / 2);
  margin-block:calc((44px - var(--ph-social-ikon)) / -2);
  padding-inline:calc(var(--ph-social-luft) / 2);
  transition:transform .2s ease, opacity .2s ease;
}
.ph-social a:first-child{ margin-inline-start:calc(var(--ph-social-luft) / -2); }
.ph-social a:last-child{ margin-inline-end:calc(var(--ph-social-luft) / -2); }
.ph-social a:hover{ transform:translateY(-2px); opacity:.7; }
.ph-social img{
  width:var(--ph-social-ikon);
  height:var(--ph-social-ikon);
  display:block;
}

/* ---------- 6. FULLSCREEN MENU + MODAL (genbrug) ---------- */
/* BURGERMENU — Lærkes Burgermenu.png (1366×1541), målt op felt for felt.
   Gitteret: indhold 1073px bredt (78,55vw) centreret, 4 kolonner à 251px,
   4 rækker à 280px, gap 23px. Header 116px, footer fra y1305.
   ⚠️ DESIGNET ER 1541px HØJT, altså højere end viewporten — menuen SKAL scrolle
   internt. Derfor `overflow-y:auto` her og `min-height:100%` på __inner, og derfor
   låses sidens egen scroll (se js/main.js). */
.ph-menu{
  position:fixed; inset:0; z-index:120;
  background:var(--ph-menu-dark); color:var(--ph-offwhite);
  overflow-y:auto; -webkit-overflow-scrolling:touch;
  overscroll-behavior:contain;      /* rul ikke siden bagved når menuen er i bund */
}
.ph-menu[hidden]{ display:none; }
.ph-menu__inner{ min-height:100%; display:flex; flex-direction:column; }

/* ---- Blød åbning/luk -------------------------------------------------------
   ⚠️ `hidden` kan ikke animeres (`display:none`), så tilstanden styres af klassen
   `.is-aaben`: JS fjerner `hidden`, tvinger et reflow så startstilstanden er
   gældende, og sætter så klassen. Ved luk fjernes klassen, og `hidden` sættes først
   når overgangen er kørt (se js/main.js).
   ⚠️ BAGGRUNDEN FADER, INDHOLDET FLYTTER SIG — ikke omvendt. Lægger man
   translateY på selve .ph-menu (som er fixed inset:0), glider den mørke flade væk
   fra skærmkanten og efterlader en stribe af siden bagved.
   Kortene kommer ind med et KEYFRAME, ikke en transition: de har allerede en
   transition på transform til hover, og et stagger-delay på den ville forsinke
   hover-løftet med op til 176ms. */
.ph-menu{
  opacity:0;
  pointer-events:none;
  transition:opacity 280ms ease-out;
}
.ph-menu.is-aaben{ opacity:1; pointer-events:auto; }
.ph-menu__inner{
  transform:translateY(14px);
  transition:transform 300ms cubic-bezier(.16,.84,.44,1);
}
.ph-menu.is-aaben .ph-menu__inner{ transform:none; }
/* Luk må gerne være kvikkere end åbning. */
.ph-menu:not(.is-aaben){ transition-duration:190ms; }
.ph-menu:not(.is-aaben) .ph-menu__inner{ transition-duration:190ms; }

@keyframes ph-menu-kort-ind{
  from{ opacity:0; transform:translateY(10px); }
  to{ opacity:1; transform:none; }
}
.ph-menu.is-aaben .ph-menu__grid > *{
  animation:ph-menu-kort-ind 240ms cubic-bezier(.16,.84,.44,1) both;
}
/* Diskret stagger: 16ms pr. kort, så det sidste starter 176ms inde og hele
   sekvensen er ovre efter ~416ms. Mere end det, og man venter på menuen. */
.ph-menu.is-aaben .ph-menu__grid > :nth-child(1){ animation-delay:0ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(2){ animation-delay:16ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(3){ animation-delay:32ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(4){ animation-delay:48ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(5){ animation-delay:64ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(6){ animation-delay:80ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(7){ animation-delay:96ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(8){ animation-delay:112ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(9){ animation-delay:128ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(10){ animation-delay:144ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(11){ animation-delay:160ms; }
.ph-menu.is-aaben .ph-menu__grid > :nth-child(12){ animation-delay:176ms; }

@media (prefers-reduced-motion: reduce){
  /* Ingen bevægelse: menuen er der bare. JS springer også sin luk-forsinkelse. */
  .ph-menu, .ph-menu__inner, .ph-menu .ph-menu__grid > *{
    transition:none !important; animation:none !important;
  }
  .ph-menu.is-aaben .ph-menu__grid > *{ opacity:1; transform:none; }
  .ph-menu__inner{ transform:none; }
}

/* Header: 116px høj, burgeren 28px inde og 31px ned — samme greb som i heroen, så
   knappen bliver liggende hvor den var, og menuen lukkes ved at trykke igen. */
/* ⛔ MENUENS HEADER BÆRER NU OGSÅ VEJEN HJEM (Lærke, 10. august 2026).
   Menuen havde ingen synlig vej til forsiden: logoet i menuens FOOTER linker
   hjem, men det står y1436 i en menu på 1541px med 900px viewport — altså
   536px under folden, og over 1000px under på mobil. Vejen fandtes, men
   ingen kunne se den.

   ⚠️ LOGOET ER LAGT DÉR HVOR DET STÅR PÅ ALLE ANDRE SIDER — øverst til
   venstre. I menuen var den plads optaget af burgeren alene, så netop den
   konvention brød sammen dér hvor brugeren kigger først. Nu står de på række,
   som i undersidetype A.

   ⛔ BURGEREN FLYTTER SIG IKKE. Den bliver på var(--ph-hoved-x) = x28, fordi
   nul vandret spring mellem sidens og menuens burger var en hel rettelse
   7. august. Derfor `align-items:flex-start` og ikke `center`: med `center`
   ville burgeren falde 8,5px ned i den 116px høje bjælke. Logoet centreres
   i stedet mod burgeren med sin egen margin. */
.ph-menu__top{
  height:116px; flex:0 0 auto; padding:31px 0 0 var(--ph-hoved-x);
  display:flex; align-items:flex-start; gap:16px;
}
/* (40 − 34) / 2 = 3px, så logoets midte lander på burgerens midte. */
.ph-menu__hjem{ flex:0 0 auto; margin-top:3px; }
/* ⚠️ `max-width:none` ER IKKE VALGFRI. Den globale reset på linje 93
   (`img,video{max-width:100%}`) klemmer et logo så snart det ligger i noget
   der kan blive smalt — den har ødelagt type A's logo én gang og begge
   heroers overscan én gang. Højden styrer, bredden følger. */
.ph-menu__hjem img{ display:block; height:34px; width:auto; max-width:none; }
/* Menuens burger deler nu geometri med sidens — se den fælles .ph-burger i §5.1.
   Det eneste særlige her er at slagskyggen skal væk: den findes for at bære
   knappen over hero-VIDEOEN, og på menuens flade sorte er den bare snavs.

   ⛔ `.ph-burger--sub` ER FJERNET 7. august 2026. Den var defineret til præcis
   dette formål — "deler mål og farve med menuens egen, så knappen står PRÆCIS
   samme sted før og efter menuen åbnes" — men blev ALDRIG sat på i markup'en:
   partials/header.html skrev `class="ph-burger"`, og ingen af de 22 sider
   nævnte varianten. Reglen løste altså aldrig det problem den var skrevet til.
   Nu ligger geometrien i .ph-burger selv, så der ikke er to steder at drifte
   fra hinanden. Genindfør ikke en variant der kun gentager basen. */
.ph-burger--menu{ filter:none; }

.ph-menu__grid{
  width:78.55vw; max-width:1300px; margin:0 auto;
  display:grid;
  grid-template-columns:repeat(4, 1fr);
  grid-auto-rows:min(20.5vw, 340px);      /* 280px @1366 — følger kolonnebredden, så kortenes forhold holder */
  gap:1.684vw;                            /* 23px @1366 */
}
/* Placeringen er EKSPLICIT. Auto-placement giver et andet resultat, så snart der
   både er række- og kolonne-spænd i spil (kortet i kolonne 4 lander i række 3 i
   stedet for række 1), og gitteret ville så ikke længere være Lærkes. */
.ph-menu__grid > :nth-child(1){ grid-area:1 / 1 / 3 / 2; }   /* navy, høj: række 1-2 */
.ph-menu__grid > :nth-child(2){ grid-area:1 / 2 / 2 / 4; }   /* bred: kolonne 2-3 */
.ph-menu__grid > :nth-child(3){ grid-area:2 / 2 / 3 / 3; }
.ph-menu__grid > :nth-child(4){ grid-area:2 / 3 / 3 / 4; }
.ph-menu__grid > :nth-child(5){ grid-area:1 / 4 / 3 / 5; }   /* høj */
.ph-menu__grid > :nth-child(6){ grid-area:3 / 1 / 4 / 2; }
.ph-menu__grid > :nth-child(7){ grid-area:3 / 2 / 4 / 4; }   /* bred */
.ph-menu__grid > :nth-child(8){ grid-area:3 / 4 / 4 / 5; }
.ph-menu__grid > :nth-child(9){ grid-area:4 / 1 / 5 / 2; }
.ph-menu__grid > :nth-child(10){ grid-area:4 / 2 / 5 / 3; }
.ph-menu__grid > :nth-child(11){ grid-area:4 / 3 / 5 / 4; }
.ph-menu__grid > :nth-child(12){ grid-area:4 / 4 / 5 / 5; }

.ph-mcard{
  position:relative; overflow:hidden;
  border-radius:34px;                     /* målt 30-38 afhængigt af tærskel */
  background:var(--ph-offwhite); color:var(--ph-ink);
  display:flex; align-items:flex-end;     /* teksten sidder i BUNDEN */
  transition:transform .18s ease, box-shadow .18s ease;
}
.ph-mcard:hover{ transform:translateY(-3px); box-shadow:0 10px 28px rgba(0,0,0,0.28); }
/* ⚠️ Navy-kortet har SKARPE hjørner i designet — målt r=0 mod de øvriges ~34. */
.ph-mcard--navy{ background:var(--ph-blue); color:#fff; border-radius:0; }

/* Billedlaget. Tomt indtil Lærke leverer baggrundsbillederne; kortets flade viser
   igennem. Scrimmen ligger klar, så teksten holder kontrast med det samme. */
.ph-mcard__media{ position:absolute; inset:0; z-index:0; background:50% 50%/cover no-repeat; }
.ph-mcard__txt{
  position:relative; z-index:2;
  width:100%;
  /* 31px bund og 11px gap er MÅLT frem, ikke designets rå tal: designets 35px er
     fra overskriftens INK-bund til kortkanten, og linjeboksen rækker ~9px længere
     ned end inken. Samme for gappet, hvor både label og overskrift har leading. */
  padding:0 26px 31px;
  /* ⚠️ Gappet er 7px, ikke 16. Designets 16px er mellem label-INKENS bund og
     overskriftens cap-top, og begge linjebokse har leading udenom. Mål det med et
     VERSAL-ord: gør man det med "Og", trækker g'ets descender ink-bunden ned og man
     retter et problem der ikke findes (det skete her, og gappet blev sat 4px for stort). */
  display:flex; flex-direction:column; gap:7px;
}
/* Scrim kun under teksten, og kun når der ER et billede — uden billede ville en
   gradient lægge en grå sky på den ensfarvede flade. */
.ph-mcard__media[style]::after{
  content:''; position:absolute; inset:0;
  background:linear-gradient(to top, rgba(0,0,0,0.62) 0%, rgba(0,0,0,0.28) 34%, rgba(0,0,0,0) 62%);
}
.ph-mcard__media[style] ~ .ph-mcard__txt{ color:#fff; }

.ph-mcard__label{
  font-size:16px; line-height:1; text-transform:uppercase; letter-spacing:.02em;
}
/* 35px/36px vægt 300 rammer designet på tre uafhængige mål: "FIRMA" bliver 94,8px
   bred (designet 95), "MEDLEM" 132,9 (133), og cap-højden 25px (25). Det bekræfter
   samtidig at designets skrift IKKE er kondenseret — --ph-font-display (Arial
   Narrow) skulle op på 37-38px og gav så cap 26-27. Derfor body-stakken her. */
.ph-mcard__title{
  font-size:35px; line-height:36px; font-weight:300;
  text-transform:uppercase;
  /* Ingen text-wrap:balance — linjebrudene sidder som <br> i markup'et, se dér. */
}

/* "+" — 25px cirkel, 22px fra toppen, 25px fra højre. Dekorativ: hele kortet er linket.
   ⛔ GEOMETRIEN LIGGER I FIRE TOKENS, fordi de eksterne kort har EN CIRKEL MERE
   (se .ph-mcard__ext nedenfor) og skal flugte med denne på pixlen. Skrives
   tallene direkte i begge regler, skrider de fra hinanden den dag nogen ændrer
   mobil-varianten — samme begrundelse som --ph-hoved-x, der samlede fem
   sidehoveders venstrekant ét sted. Mobil ændrer KUN tokens, ikke reglerne. */
.ph-mcard{ --mc-cirkel:25px; --mc-top:22px; --mc-hoejre:25px; --mc-luft:10px; }
.ph-mcard__plus{
  position:absolute; z-index:3;
  top:var(--mc-top); right:var(--mc-hoejre);
  width:var(--mc-cirkel); height:var(--mc-cirkel); border-radius:50%;
  background:var(--ph-menu-dark);
}
.ph-mcard__plus::before, .ph-mcard__plus::after{
  content:''; position:absolute; top:50%; left:50%;
  background:var(--ph-offwhite); border-radius:1px;
}
.ph-mcard__plus::before{ width:13px; height:2.5px; transform:translate(-50%,-50%); }
.ph-mcard__plus::after{ width:2.5px; height:13px; transform:translate(-50%,-50%); }
.ph-mcard--navy .ph-mcard__plus{ background:var(--ph-offwhite); }
.ph-mcard--navy .ph-mcard__plus::before,
.ph-mcard--navy .ph-mcard__plus::after{ background:var(--ph-blue); }

/* EKSTERNT KORT — TO CIRKLER: pilen til VENSTRE for plusset.
   ⛔ LAGT OM 11. AUGUST 2026 (Jonas). Indtil da BYTTEDE `.ph-mcard--ext`
   plussets to streger ud med en ↗ i samme cirkel — altså havde de to
   eksterne kort (Merch og Bliv medlem) INTET plus. Det var en bevidst
   konstruktion, ikke en fejl, men den lod de to kort sige det halve:

     · plusset er kortets AFFORDANCE — "her er noget at åbne"
     · pilen er en ADVARSEL — "du forlader sitet"

   Et eksternt kort har begge egenskaber. Samme argument som "+"-et på
   FIRMA AFTALE (26. juli): et manglende affordance på præcis nogle kort
   læses som en fejl frem for som en forskel.

   ⛔ PLUSSET BLIVER YDERST TIL HØJRE, hvor det står på de ti andre kort,
   og pilen kommer til VENSTRE for det. Så flytter det kendte element sig
   ikke en pixel, og kun det nye kommer til. Byt dem ikke om.

   ⚠️ DEN INLINE-PIL ER PRØVET OG FORKASTET — genopfind den ikke. En
   `.ph-ext` inde i overskriften strækker linjeboksen, og da tekstblokken er
   bundankret, skubbede den hele labelen 1,8px opad. `line-height:0` flytter
   glyffen ned under grundlinjen, og `vertical-align` kan ikke løses lineært.
   Begge cirkler er absolut placeret og kan derfor pr. konstruktion ikke
   flytte noget i tekstblokken.

   Begge er aria-hidden, så glyfferne aldrig havner i linkets navn; beskeden
   til skærmlæsere ligger som .ph-visually-hidden-tekst i selve kortet. */
.ph-mcard__ext{
  position:absolute; z-index:3;
  top:var(--mc-top);
  /* Plussets plads + plussets bredde + luften imellem. ⛔ Udtrykt i de SAMME
     tokens som plusset, så mobil kun skal ændre tokenet ét sted. */
  right:calc(var(--mc-hoejre) + var(--mc-cirkel) + var(--mc-luft));
  width:var(--mc-cirkel); height:var(--mc-cirkel); border-radius:50%;
  background:var(--ph-menu-dark);
  display:grid; place-items:center;
  /* Glyffen følger cirklen, så den ikke bliver for stor på mobil.
     17/25 = 0,68 er desktop-forholdet fra den gamle etcirkel-udgave. */
  font-size:calc(var(--mc-cirkel) * 0.68); line-height:1; font-weight:400;
  color:var(--ph-offwhite);
}
.ph-mcard__ext::before{ content:'\2197'; }
.ph-mcard--navy .ph-mcard__ext{ background:var(--ph-offwhite); color:var(--ph-blue); }

/* LIVE-badge: rød pille 93×29px, 22px fra venstre og 18px fra toppen — altså
   modsat plusset, som ligger til højre. */
.ph-mcard__live{
  position:absolute; top:18px; left:22px; z-index:3;
  height:29px; padding:0 16px;
  display:inline-flex; align-items:center; gap:9px;
  border-radius:var(--ph-radius-pill);
  background:var(--ph-live); color:#fff;
  /* 20px giver cap-højde 14 som i designet, og 16px padding + 9 gap + 13 prik
     bringer pillen op på designets 93px samlede bredde. */
  font-size:20px; font-weight:600; line-height:1; text-transform:uppercase;
}
.ph-mcard__live i{ width:13px; height:13px; border-radius:50%; background:#fff; }

/* ⛔ DET ER PRIKKEN DER BLINKER — IKKE HELE PILLEN (omlagt 10. august 2026).
   Lærke bad om at LIVE-ikonet skulle være "levende". Pulsen KØRTE — den var
   bare under tærsklen for at blive bemærket, og det er målt, ikke gættet:

     hele pillen dæmpet til 0,74 over den mørke card-flade
       -> kontrast mellem lys og mørk fase: 1,231:1
     den hvide prik dæmpet til 0,28 over den røde pille
       -> kontrast mellem lys og mørk fase: 3,30:1

   Samme slags bevægelse, **2,7 gange stærkere signal** — og på 6,2% af
   pillens areal i stedet for 100%. Det er dét, der gør den mere synlig UDEN
   at trække blikket: der er langt FÆRRE pixels i bevægelse end før.

   ⚠️ OG PILLEN STÅR NU HELT STILLE, hvilket er en gevinst i sig selv: ordet
   LIVE blev før dæmpet til 74% sammen med resten, altså en label der
   periodisk blev svagere at læse. Nu er teksten altid fuld, og pillen er
   altid præcis designets 93×29 — den gamle skala nedad (1 → 0,985) findes
   ikke længere, og dermed heller ikke risikoen for at nogen vender den opad.

   ⚠️ EN BLINKENDE PRIK ER DEN ETABLEREDE "LIVE"-KONVENTION (optageindikator),
   hvor en pille der ånder ikke betyder noget bestemt. Signalet er altså også
   blevet mere præcist, ikke bare kraftigere.

   ⚠️ KUN opacity og transform animeres. Begge komponeres af GPU'en uden layout
   eller paint; en puls på background-color eller box-shadow ville i stedet
   repainte hver frame — i en menu der i forvejen skal bære 12 kort med
   baggrundsbilleder.

   ⚠️ 1600ms, ikke 2400. Den gamle halvcyklus var 1200ms, altså så langsom at
   ændringen skete under opløsningen for "der sker noget". 800ms hver vej
   læses som et hjerteslag uden at flimre.
   ⛔ GÅ IKKE UNDER ~500ms HALVCYKLUS. Tre blink i sekundet nærmer sig
   WCAG 2.3.1's flash-grænse, og et hurtigt blink stjæler opmærksomhed fra de
   elleve andre kort — som var hele begrundelsen for den rolige puls i første
   omgang.

   Animationen koster intet når menuen er lukket: den er display:none via
   [hidden], og en skjult animation kører ikke. Den starter derfor altid forfra
   på fuld opacitet, når menuen åbnes. */
@keyframes ph-live-prik{
  0%, 100%{ opacity:1;   transform:scale(1); }
  50%     { opacity:.28; transform:scale(.82); }
}
.ph-mcard__live i{ animation:ph-live-prik 1600ms ease-in-out infinite; }

@media (prefers-reduced-motion: reduce){
  /* Helt stille — ikke bare langsommere. Prikken står på fuld opacitet i
     designets størrelse.
     ⛔ REGLEN SKAL PEGE PÅ PRIKKEN, IKKE PÅ PILLEN. Menuens egen
     reduced-motion-regel nulstiller kun `.ph-menu__grid > *` (altså kortene),
     og animation nedarves ikke — hverken til pillen eller videre til prikken.
     Stod der stadig `.ph-mcard__live` her, ville prikken blinke lystigt
     videre for en bruger der har bedt om ro. */
  .ph-mcard__live i{ animation:none; opacity:1; transform:none; }
}

/* Menuens footer: linkene VENSTRESTILLEDE (de er ikke centrerede i designet —
   målt x159..1007 i et 1366px lærred), logoet centreret nedenunder. */
.ph-menu__foot{
  width:78.55vw; max-width:1300px; margin:0 auto; flex:1 0 auto;
  padding:50px 0 56px;
  display:flex; flex-direction:column; align-items:center; gap:42px;
}
.ph-menu__links{ align-self:flex-start; display:flex; flex-wrap:wrap; gap:54px; }
.ph-menu__links a{
  color:var(--ph-offwhite); font-size:16px; text-transform:uppercase;
  letter-spacing:.03em; opacity:.88; transition:opacity .2s ease;
}
.ph-menu__links a:hover{ opacity:1; text-decoration:underline; }
.ph-menu__foot .ph-logo img{ height:63px; }   /* målt 122×63px i designet */

/* ⛔ .ph-modal ER FJERNET 9. august 2026 sammen med center-vælgeren (Jonas).
   Den stylede ÉN ting: modalen bag "Prøv Power", som nu linker direkte i
   booking-systemet. Reglerne er slettet frem for at stå ubrugte — samme
   disciplin som .ph-subhero 7. august og .ph-burger--sub.
   ⚠️ Var z-index:130, altså over menuens 120. Den plads er nu ledig; hvis en
   fremtidig overlejring skal ligge øverst, er det tallet at bruge. */

/* ---------- App-landing (app.html) ---------- */
.ph-applanding{
  background:var(--ph-bg); min-height:100svh; min-height:100vh;
  display:flex; align-items:center; justify-content:center; padding:24px; text-align:center;
}
.ph-applanding__inner{ max-width:520px; }
.ph-applanding h1{ font-size:1.7rem; margin-bottom:12px; }
.ph-applanding p{ color:var(--ph-muted); margin-bottom:24px; }
/* ⚠️ BEGGE HØJDER SKAL SÆTTES HER — ikke kun den fælles. app.html har sin egen
   badgehøjde, og en regel der kun rammer `.ph-app__badge img` lader Googles
   modifier stå tilbage med forsidens clamp: målt 56 mod 43px pille, altså
   præcis det regelbrud modifieren findes for at undgå. Fanget i et sweep, ikke
   ved at kigge. Forholdet 250/192 og de -29/192 er de samme som på forsiden —
   se den fulde begrundelse ved .ph-app__badge--google. */
.ph-applanding .ph-app__badge img{ height:56px; }
.ph-applanding .ph-app__badge--google img{
  height:calc(56px * 250 / 192);
  margin-block:calc(56px * -29 / 192);
}
/* ⛔ PANELET ER FJERNET 7. august 2026. Kommentaren sagde "badges er lavet til
   marineblå" — og det var netop problemet: de gamle filer var omfarvet til
   navy, hvilket bryder både Apples og Googles retningslinjer. De officielle
   badges er sorte med Apples grå kant, og de er designet til at ligge på en
   lys flade. Et navy panel bag dem ville skjule Apples kant, som eksplicit er
   "part of the badge artwork and should not be modified". */
.ph-applanding .ph-app__badges{
  display:inline-flex; gap:16px; justify-content:center; flex-wrap:wrap;
}

/* ---------- 7. RESPONSIVT ---------- */

/* BURGERMENUEN falder fra 4 til 2 kolonner ved 1000px og til 1 ved 640px.
   ⚠️ Den eksplicitte desktop-placering skal nulstilles med SAMME selektor-form
   (`.ph-menu__grid > :nth-child(n)`), ellers vinder specificiteten 0,2,0 over
   --tall/--wide og kortene bliver hængende i deres desktop-felter. Derfor er
   spænd-reglerne herunder også skrevet med `.ph-menu__grid >`. */
@media (max-width:1000px){
  .ph-menu__grid{
    width:auto; margin:0 var(--ph-gutter);
    grid-template-columns:repeat(2, 1fr);
    grid-auto-rows:minmax(160px, 34vw);
    gap:16px;
  }
  .ph-menu__grid > :nth-child(n){ grid-area:auto; }
  .ph-menu__grid > .ph-mcard--tall{ grid-row-end:span 2; }
  .ph-menu__grid > .ph-mcard--wide{ grid-column-end:span 2; }
  .ph-menu__foot{ width:auto; margin:0 var(--ph-gutter); }
  .ph-menu__links{ gap:24px 32px; }
  .ph-mcard__title{ font-size:clamp(22px, 3.6vw, 35px); line-height:1.04; }
}
/* ⚠️ MOBIL BEVARER MOSAIKKEN — i 2 kolonner, ikke 4, og ikke 1.
   En ægte 4-kolonne nedskalering blev målt og forkastet: ved 375px bliver kolonnen
   68,9-82,1px, og så ender overskriften på 9,6-11,4px og LABELS PÅ 4,4-5,2px med en
   cap-højde på 3-4 pixels. Teksten ville teknisk KUNNE være der (den bredeste
   titellinje, "PERSONLIG TRÆNING OG", fylder 106,7px i et 154,7px felt), men den
   ville ikke kunne læses, og mosaikkens virkning — de store rolige versaler —
   forsvinder. 1 kolonne var det modsatte problem: læsbart, men uden mosaik.
   2 kolonner giver 165,5px kolonner → overskrift 23,1px (cap 16) og label 12px,
   og der er stadig plads til 2 høje og 2 brede kort.
   Alle mål er afledt af kolonnebredden via --ph-mk, så designets proportioner
   holder: 35/251 = 0,1394 for overskriften, 26/251 = 0,1036 for padding osv. */
@media (max-width:640px){
  .ph-menu__grid{
    --ph-mk: calc((100vw - 44px) / 2);       /* kolonnebredden: 100vw − 2×16 margin − 12 gap, delt i to */
    width:auto; margin:0 16px; gap:12px;
    grid-template-columns:repeat(2, 1fr);
    grid-auto-rows:calc(var(--ph-mk) * 1.1155);   /* 280/251 — samme forhold som designets kort */
  }
  /* Mosaikken i 2 kolonner: 2 høje (BLIV MEDLEM, POWER STUDIO), 2 brede
     (PERSONLIG TRÆNING, FAQ OG KONTAKT), resten enkelte. Eksplicit som på desktop. */
  .ph-menu__grid > :nth-child(1){ grid-area:1 / 1 / 3 / 2; }   /* navy, høj */
  .ph-menu__grid > :nth-child(2){ grid-area:1 / 2 / 2 / 3; }
  .ph-menu__grid > :nth-child(3){ grid-area:2 / 2 / 3 / 3; }
  .ph-menu__grid > :nth-child(4){ grid-area:3 / 1 / 4 / 2; }
  .ph-menu__grid > :nth-child(5){ grid-area:3 / 2 / 5 / 3; }   /* høj */
  .ph-menu__grid > :nth-child(6){ grid-area:4 / 1 / 5 / 2; }
  .ph-menu__grid > :nth-child(7){ grid-area:5 / 1 / 6 / 3; }   /* bred */
  .ph-menu__grid > :nth-child(8){ grid-area:6 / 1 / 7 / 2; }
  .ph-menu__grid > :nth-child(9){ grid-area:6 / 2 / 7 / 3; }
  .ph-menu__grid > :nth-child(10){ grid-area:7 / 1 / 8 / 2; }
  .ph-menu__grid > :nth-child(11){ grid-area:7 / 2 / 8 / 3; }
  .ph-menu__grid > :nth-child(12){ grid-area:8 / 1 / 9 / 3; }  /* bred */

  .ph-mcard{ border-radius:calc(var(--ph-mk) * 0.1355); }        /* 34/251 */
  .ph-mcard__txt{
    padding:0 calc(var(--ph-mk) * 0.1036) calc(var(--ph-mk) * 0.1235);
    gap:calc(var(--ph-mk) * 0.0279);
  }
  .ph-mcard__title{
    font-size:clamp(18px, calc(var(--ph-mk) * 0.1394), 30px);
    line-height:1.03;
  }
  /* Labelen får et GULV på 12px. Ren proportional skalering ville give 10,5px, og
     så bliver cap-højden 7px — for lidt til versaler med tracking. */
  .ph-mcard__label{ font-size:clamp(12px, calc(var(--ph-mk) * 0.0637), 16px); }
  /* ⛔ KUN TOKENS. Både "+" og den eksterne pil hænger på dem, så de to
     cirkler ikke kan skride fra hinanden på mobil. Luften er 10/251 af
     kortbredden, altså samme forhold som på desktop. */
  .ph-mcard{
    --mc-cirkel:calc(var(--ph-mk) * 0.0996);
    --mc-top:calc(var(--ph-mk) * 0.0876);
    --mc-hoejre:calc(var(--ph-mk) * 0.0996);
    --mc-luft:calc(var(--ph-mk) * 0.0398);
  }
  .ph-mcard__plus::before{ width:calc(var(--ph-mk) * 0.0518); height:2px; }
  .ph-mcard__plus::after{ width:2px; height:calc(var(--ph-mk) * 0.0518); }
  .ph-mcard__live{
    height:calc(var(--ph-mk) * 0.1155); padding:0 calc(var(--ph-mk) * 0.0637);
    gap:calc(var(--ph-mk) * 0.0358); font-size:clamp(11px, calc(var(--ph-mk) * 0.0797), 20px);
    top:calc(var(--ph-mk) * 0.0717); left:calc(var(--ph-mk) * 0.0876);
  }
  .ph-mcard__live i{ width:calc(var(--ph-mk) * 0.0518); height:calc(var(--ph-mk) * 0.0518); }

  /* ⛔ Venstrekanten ændres ÉT sted for alle fem sidehoveder, ikke pr. regel. */
  :root{ --ph-hoved-x:20px; }
  .ph-menu__top{ height:84px; padding:24px 0 0 var(--ph-hoved-x); }
  /* ⛔ IKONET SKALERES IKKE NED PÅ MOBIL — OG DET ER HELE POINTEN MED 40px.
     Her stod før `width:44px; height:30px`, altså en mindre og bredere
     burger på telefon. Mosaikken må ikke følge med derned: ved 30px bliver
     felterne 9px med 1,5px imellem og flyder sammen — præcis den grund til
     at ikonet blev afvist 9. august. Den bliver 40×40 på alle bredder.

     ⚠️ SPRINGET MELLEM SIDENS OG MENUENS BURGER ER STADIG DÆKKET, fordi de
     to deler ÉN regel og altså ikke KAN drifte fra hinanden. Det var dét,
     den gamle note her handlede om. */
  .ph-menu__links{ align-self:center; justify-content:center; text-align:center; }
  .ph-menu__foot{ padding:34px 0 40px; gap:30px; }
  .ph-menu__foot .ph-logo img{ height:48px; }
}

@media (max-width:860px){
  /* Stakket: tilbage i den padded container (--ph-wide slås fra), kort flyder i højden */
  .ph-split__grid{ width:auto; max-width:var(--ph-max); padding:0 var(--ph-gutter); grid-template-columns:1fr; gap:var(--ph-s4); }
  .ph-card{ height:auto; min-height:420px; }
  /* Stakket app-sektion: HELE desktop-kompositionen rulles tilbage til almindeligt
     flow. Mockuppens absolutte mål gælder kun desktop, så både tekstblokken og
     telefonen skal ud af position:absolute igen.
     ⚠️ HISTORIK: app-sektionen havde kortvarigt sit EGET knækpunkt på 1000px, fordi
     teksten stødte ind i telefonen fra ca. 897px og ned (15px overlap ved 861px, kun
     2px luft ved 900px). Det skyldtes UDELUKKENDE at telefonen dengang var strakt
     til hele telefon-GRUPPENS 446px. Med Lærkes rigtige enkelt-telefon på 254px er
     der målt 233px luft ved 1001px og ~152px ved 861px, så sektionen er tilbage på
     sitets fælles 860px. Gøres telefonen bredere igen, skal luften måles forfra. */
  .ph-app__grid{ width:auto; max-width:var(--ph-max); padding:0 var(--ph-gutter); height:auto; }
  .ph-app__text{
    position:static; left:auto; bottom:auto;
    padding:var(--ph-s6) 0 0; max-width:none; text-align:center; margin:0 auto;
  }
  /* Her MÅ badges gerne ombryde — der er ikke plads til 2 × ~145px på en smal
     telefon. Gap'et sættes fast: 2,343vw ville kun være 9px ved 375px. */
  .ph-app__badges{ justify-content:center; flex-wrap:wrap; gap:12px; }
  /* Telefon i flow (ikke absolut), og LODRET — de 5,32° hører til desktop-
     kompositionen. Roteret ville bbox'en vokse i højden og blive klippet af
     .ph-app{overflow:hidden} i bunden. Samme 1320/1299 som før, så min()-værdien
     fortsat er telefonens KROP og ikke filens bredde. */
  .ph-app__phone-wrap{
    position:static; left:auto; top:auto; width:auto; transform:none;
    display:flex; justify-content:center;
  }
  /* ⛔ TELEFONEN SÆTTER HELE MODULETS HØJDE PÅ MOBIL (Lærke, 11. august 2026).
     Modulet målte 644,6px = 79,4% af en 812px skærm, og næsten alt kom herfra:
     tekst+badges er kun 125,7px, resten er telefonen (495px) plus dens 24px
     margin. At skrue på padding eller tekst ville derfor ikke flytte noget.
     Kroppen er sat ned fra 240 til 153px, hvilket giver 315px billedhøjde og et
     modul på ~465px = 57% af skærmen.
     ⚠️ De 1320/1299 er stadig telefonens KROP mod filens bredde — sideknapperne
     stikker ud, så min()-værdien skal ganges op for at ramme kroppen. Fjern
     ikke faktoren; så bliver telefonen 1,6% for smal. */
  .ph-app__phone{ transform:none; width:calc(min(153px,41vw) * 1320 / 1299); margin:24px auto 0; }
  /* ⛔ BAGSIDEN VISES IKKE PÅ MOBIL. To telefoner ved siden af hinanden er en
     DESKTOP-komposition: her står telefonen lodret, centreret og i flow, og en
     bagside ville enten stables under forsiden (meningsløst) eller klemme dem
     ned i ~120px hver. Mockuppen har heller ingen mobilvisning af parret.
     ⚠️ `display:none` og ikke blot skjult — ellers henter en telefon stadig
     filen. */
  .ph-app__phone-wrap--bag{ display:none; }
  .ph-counters__grid{ width:auto; max-width:var(--ph-max); padding:22px var(--ph-gutter); gap:var(--ph-s4); }
  .ph-trial__inner{ width:auto; max-width:var(--ph-max); padding:18px var(--ph-gutter); }
  .ph-footer__inner{ width:auto; max-width:var(--ph-max); padding:22px var(--ph-gutter); }
}

/* ⛔ MOBIL: TRIAL-STRIBEN OG FOOTEREN PÅ ÉN RÆKKE (7. august 2026, Lærke).
   Begge brød til to rækker, fordi indholdet er bredere end en telefon og
   `flex-wrap:wrap` så gjorde det eneste den kunne.

   ⚠️ ALLE MÅL HERUNDER ER FLYDENDE (vw med clamp), IKKE FASTE PR. BREAKPOINT.
   Det er bevidst: et fast tal ved 640px giver et TRIN hen over grænsen, og
   ⛔-sektionen i CLAUDE.md om mellembredder er netop skrevet efter tre gange
   hvor en formel var rigtig ved 375 og 1366 og i stykker ved 768. Med clamp
   vokser de glat fra 320 til 640, hvor de rammer deres desktop-værdier.

   Efterregnet ved 320 / 375 / 480 / 560 / 640px — ingen af dem wrapper, og
   ingen af dem har en spids i forløbet. */
@media (max-width:640px){
  /* --- TRIAL: teksten må gerne bryde til to linjer, men den skal stå VED
         SIDEN AF knappen, ikke over den. Det er dét der halverer højden.
         "med Prøv Power" skjules: det gentager knappen ordret, og de fire ord
         er præcis dem der ikke er plads til. */
  /* App-teksten skal stå på ÉN linje hele vejen ned til 320px.
     Sætningen fylder 322,9px ved 16px; pladsen er viewporten minus 47,8px
     gutter. Ved 400px og opefter går det op ved fuld 16px, derunder skal graden
     med ned.

     ⚠️ KOEFFICIENTEN ER 4.0vw OG IKKE 4.15, FORDI `vw` INDEHOLDER SCROLLBAREN.
     I et testharness (iframe i en desktop-browser) er den 15px bred, så
     indholdet får 360px mens vw regner med 375 — altså en grad der er sat til
     en bredere skærm end den teksten faktisk skal stå på. En rigtig telefon har
     ingen vedvarende scrollbar og er derfor det MILDE tilfælde. 4.0vw holder
     BEGGE veje; 4.15 holdt kun på telefonen og brød i harnesset. Se lærdommen
     om 100vw og scrollbaren i CLAUDE.md.

     Målt (pessimistisk, med scrollbar): 13,4 / 15,0 / 15,6 / 16 / 16px ved
     320 / 360 / 375 / 390 / 480 — én linje hele vejen, glat forløb, ingen
     spids. Cap-højden er 9,4px ved gulvet, altså langt over den 4px-grænse
     CLAUDE.md advarer om. */
  .ph-app__text p{ font-size:clamp(13px, 4vw, 16px); }

  .ph-trial__inner{ flex-wrap:nowrap; gap:clamp(10px, 3vw, 24px); align-items:center; }
  .ph-trial__text{ font-size:clamp(12px, 3.7vw, 15.68px); letter-spacing:0.04em; }
  .ph-trial__lang{ display:none; }
  .ph-trial .ph-btn--pill{ flex:0 0 auto; padding:clamp(10px, 3vw, 14px) clamp(14px, 4.4vw, 22px); font-size:clamp(12px, 3.6vw, 15.2px); }

  /* --- FOOTER: brand-blok og ikonrække på samme linje.
         ⚠️ Her afviger vi bevidst fra fire MÅLTE mockup-tal (logo 41px,
         gap 23px, tekst 20px, ikoner 34,7px). De er alle målt ved 1366px,
         hvor der er plads; på 320px er summen 396px i en port på 272. */
  .ph-footer__inner{ flex-wrap:nowrap; gap:clamp(8px, 3vw, 24px); }
  .ph-footer__brand{ gap:clamp(8px, 3vw, 23px); font-size:clamp(12px, 3.6vw, 18px); }
  .ph-footer__brand .ph-logo img{ height:clamp(24px, 7vw, 41px); }
  /* ⚠️ Kun de to TOKENS sættes her — reglerne for tapmål og luft står ét sted
     (§5.8) og regner selv videre. Sætter man `gap` eller `img{width}` direkte
     her igen, mister linket sin padding og tapmålet falder tilbage til
     ikonstørrelsen.
     ⚠️ Luften er hævet fra 1vw til 2vw, fordi den nu ER tapmål og ikke dødt
     felt: der stod ~41px ubrugt plads mellem ikonrækken og brand-blokken ved
     375px. Loftet på 8px og gulvet på 3px er sweepet mod 320-640 — se målingen
     i CLAUDE.md. */
  .ph-social{
    --ph-social-ikon:clamp(18px, 5.6vw, 28px);
    --ph-social-luft:clamp(3px, 2vw, 8px);
  }
}
@media (max-width:640px){
  /* Logo-striben: ingen særregler for mobil mere — marqueen holder den selv
     på én linje (nowrap) på alle bredder, inkl. iPhone og smallere. */
  .ph-counters__grid{ grid-template-columns:1fr; }
  .ph-counter{ justify-content:flex-start; }
  /* Karosellen stakkede før lodret på mobil og smed 3D-transformerne væk. Den
     forbliver nu vandret og swipes i stedet — ellers er der intet at swipe i.
     26.2vw ville give 98px billeder på en 375px-skærm, så de får en egen
     mobilstørrelse. Forholdet er det samme som på desktop: 72/68 = 1.06.
     NB: EKSPLICIT height, ikke aspect-ratio — `height="800"` på <img> ville
     ellers overstyre den og trække rækken op i 800px (samme fælde som 24. juli). */
  /* Desktops 21.5vw ville give 84px billeder på en 390px telefon — ubrugeligt.
     Mobil beholder derfor SAMME opbygning (karosellen smallere end skærmen, så
     cylinderens ender er synlige) men i større proportioner. Forholdet er det
     samme: 42 / 39.62 = 1.06. Der er ikke plads til tre fulde billeder på en
     telefon; her ses midterbilledet plus to halvt synlige naboer. */
  .ph-gallery__viewport{ width:88vw; }
  .ph-gallery__item{ width:42vw; height:39.62vw; }   /* wrapperen bærer størrelsen */
  .ph-gallery__row{ gap:12px; padding-inline:calc(50% - 21vw); }
  .ph-hero__top{ padding:20px; }
  .ph-hero__qr .ph-qr__box{ display:none; }   /* QR skjules helt på mobil */
  /* ⛔ MINDRE END SITETS ØVRIGE PILLEKNAPPER (Lærke, 11. august 2026).
     Knappen målte 158,8px = 42,4% af en 375px skærm, og 68 af de 159 var
     vandret padding — altså 43% luft om en tekst på kun 90,8px. Graden ned fra
     15,2 til 13,5px og paddingen fra 34 til 22px giver ~124px = 33%.
     ⛔ DEN LODRETTE PADDING BLIVER PÅ 12px, SÅ TAPMÅLET HOLDER 44px.
     Linjehøjden er 20,9px ved 13,5px skrift, så 20,9 + 2×12 = 44,9. Skru den
     ikke ned for at gøre knappen lavere — 44px er Apples tapmål, og det er
     hele grunden til at den ikke bare blev skaleret proportionalt. */
  .ph-hero__app-link{ display:inline-flex; font-size:13.5px; padding:12px 22px; }

  /* ⛔ MARQUEEN: SKÆR HØJDEN HÅRDT, BREDDEN KUN LIDT (11. august 2026).
     Tiden til at have set alle ti logoer var 17,3s ved 375px mod 2,2s på
     desktop — en partner man venter 17 sekunder på, bliver reelt ikke set.
     Gruppen skal derfor være smallere, og der er to knapper: logostørrelse
     og gap.

     ⛔ DE TO MÅ IKKE SKRUES SYMMETRISK NED, og det er hele pointen her.
     Logoerne deler sig i to grupper efter hvad der BINDER dem:
       · bundet af BREDDEN  — life-fitness, eleiko, sportsart (+ er-equipment,
         peak-pilates). Brede wordmarks; de har i forvejen sitets MINDSTE blæk
         (13,1 / 13,5 / 13,4px) og rammes kun af `max-width`.
       · bundet af HØJDEN   — de øvrige. De har 19,5-24,3px blæk, altså
         rigeligt, og rammes kun af `max-height`.
     At skære begge ens straffer præcis de tre der har mindst at give.
     Målt: symmetrisk 70/25/gap10 giver 9,0s med mindste blæk 9,5px, mens
     asymmetrisk 88/23/gap8 giver 8,5s med mindste blæk 10,3px — altså
     hurtigere OG større blæk. Derfor står max-width næsten stille (96→88)
     mens max-height skæres 32% (34→23).

     ⚠️ MÅL BLÆK, IKKE BOKS, hvis tallene skal efterprøves. Logo-PNG'erne har
     7,8-14,2% transparent luft pr. side, og deres blæk-andel af boksen svinger
     fra 44,7% (eleiko) til 71,4% (watson). En optælling på bokshøjde siger
     derfor intet om hvor stort mærket ser ud. Se ⛔-reglen i CLAUDE.md. */
  .ph-brand{ max-height:23px; max-width:88px; }
  :root{ --ph-marquee-gap:8px; }
}
@media (prefers-reduced-motion: reduce){
  /* Videoer erstattes af deres poster-billede — ikke af en flad farve.
     js/main.js afbryder desuden hentningen af hero-videoen, så den ikke
     downloades til ingen nytte, og lader kort-videoerne stå på poster. */
  .ph-hero__video{ display:none; }
  /* ⚠️ -v2, samme croppede fil som videoen bruger som poster. Glemmer man den
     her, ser ALLE reduced-motion-brugere stadig de sorte bjælker — og det er
     netop den gruppe der aldrig ser videoen og derfor aldrig opdager det. */
  .ph-hero{
    background:var(--ph-dark) url('../media/hero-poster-v2.webp') center/cover no-repeat;
  }
  .ph-card__video{ display:none; }   /* kortets background-image ER posteren */
  .ph-btn:hover,.ph-social a:hover{ transform:none; }

  /* ⛔ MARQUEEN OMBRYDER TIL FLERE RÆKKER — DEN SCROLLER IKKE (11. august 2026).
     Indtil da stod den stille som ÉN vandret stribe med en tynd scrollbar.
     Målt ved 375: `scrollWidth` 1024 i en 375px viewport, altså **649px — 6 af
     10 partnere — skjult bag en vandret scroll**, hvor kun 3 hele og 1 klippet
     logo var synlige. En scrollbar på 6px er en svag affordance på touch, hvor
     der ikke findes en musemarkør at se den med.

     ⚠️ Og det er værre end det, den erstatter: en bruger der har bedt om mindre
     bevægelse, får en løsning hvor 60% af indholdet kræver en gestus, ingen
     fortæller dem om. Reducér bevægelse må gerne koste bevægelsen — ikke
     indholdet.

     Med ombrydning er alle ti synlige på én gang, uden bevægelse og uden
     gestus. ⚠️ Duplikat-grupperne skjules stadig, så hvert logo kun står én
     gang; ellers ville der stå 30. */
  .ph-marquee__track{ animation:none; flex-wrap:wrap; width:auto; justify-content:center; }
  .ph-marquee__group[aria-hidden="true"]{ display:none; }
  /* ⛔ `flex:1 1 100%` ER DET DER FÅR DEN TIL AT OMBRYDE. Gruppen står ellers
     som `flex:0 0 auto` og beholder derfor sin naturlige 993px, uanset at
     sporet har `flex-wrap:wrap` — så indholdet overflowede stadig, og målingen
     viste 300px skjult bag scroll. Det er beholderen der skal give efter,
     ikke kun sporet der skal have lov at bryde. */
  .ph-marquee__group{
    padding-right:0; min-width:0;
    flex:1 1 100%; width:100%;
    flex-wrap:wrap; justify-content:center;
    row-gap:18px;
  }
  .ph-marquee{ overflow:hidden; padding-left:var(--ph-gutter); padding-right:var(--ph-gutter); }
}

/* ============================================================
   8. UNDERSIDER — designsystemet lagt oven på eksisterende markup
   Styler de gamle klasser (.site-header, .page-hero, .prose,
   .location-card, .price-card, .feature, .info-box, .site-footer …)
   med de nye brand-tokens. HTML-indhold + LocalBusiness-schema er urørt.
   ============================================================ */

.wrap{ max-width:var(--ph-max); margin:0 auto; padding:0 24px; width:100%; }

/* Knapper (undersider) */
.btn{
  display:inline-flex; align-items:center; justify-content:center;
  padding:13px 28px; border-radius:var(--ph-radius); font-weight:700; font-size:0.95rem;
  border:2px solid transparent;
  transition:transform .2s ease, background-color .2s ease, border-color .2s ease, box-shadow .2s ease, color .2s ease;
}
.btn-primary{ background:var(--ph-blue); color:#fff; }
.btn-primary:hover{ transform:translateY(-1px); box-shadow:0 8px 22px rgba(24,34,99,0.28); }
.btn-outline{ background:#fff; color:var(--ph-ink); border-color:var(--ph-line); }
.btn-outline:hover{ border-color:var(--ph-blue); color:var(--ph-blue); }
.btn-lg{ padding:15px 34px; font-size:1.02rem; }

/* Header — navy bar: burger venstre · logo center · CTA højre */
.site-header{ position:sticky; top:0; z-index:50; background:var(--ph-blue); }
.header-inner{
  display:grid; grid-template-columns:1fr auto 1fr; align-items:center;
  padding:14px 24px; max-width:var(--ph-max); margin:0 auto;
}
.site-header .logo{
  grid-column:2; justify-self:center; color:#fff;
  border:2px solid #fff; padding:5px 9px; border-radius:3px;
  font-family:var(--ph-font-display); font-weight:800; text-transform:uppercase;
  letter-spacing:0.04em; font-size:0.95rem;
}
.site-header .nav-toggle{
  grid-column:1; justify-self:start;
  display:flex; flex-direction:column; justify-content:center; gap:5px;
  width:42px; height:40px; padding:8px; background:none; border:none; cursor:pointer;
}
.site-header .nav-toggle span{ display:block; width:26px; height:2px; background:#fff; }
.site-header .header-cta{
  grid-column:3; justify-self:end; background:#fff; color:var(--ph-ink); border-color:#fff; white-space:nowrap;
}
.site-header .header-cta:hover{ background:var(--ph-offwhite); color:var(--ph-ink); box-shadow:none; transform:translateY(-1px); }

/* Fullscreen menu */
.menu-overlay{
  position:fixed; inset:0; z-index:120; background:rgba(22,23,27,0.97);
  display:flex; flex-direction:column; align-items:center; justify-content:center; padding:24px;
}
.menu-overlay[hidden]{ display:none; }
.menu-close{ position:absolute; top:18px; right:24px; background:none; border:none; color:#fff; font-size:2.4rem; line-height:1; cursor:pointer; }
.menu-nav{ display:flex; flex-direction:column; align-items:center; gap:4px; text-align:center; }
.menu-nav a{
  color:#fff; font-family:var(--ph-font-display); text-transform:uppercase; font-weight:800;
  font-size:clamp(1.4rem,4.5vw,2.1rem); padding:8px 12px; opacity:.85; transition:opacity .2s;
}
.menu-nav a:hover, .menu-nav a[aria-current="page"]{ opacity:1; }

/* Page-hero (titelområde) */
.page-hero{ background:var(--ph-offwhite); text-align:center; padding:56px 24px 40px; }
.page-hero .hero-inner{ max-width:760px; margin:0 auto; }
.page-hero .eyebrow{ text-transform:uppercase; letter-spacing:0.14em; font-size:0.74rem; font-weight:800; color:var(--ph-blue); margin-bottom:12px; }
.page-hero h1{
  font-family:var(--ph-font-display); text-transform:uppercase; font-weight:800;
  font-size:clamp(1.9rem,4.5vw,2.9rem); line-height:1.05; letter-spacing:-0.01em; color:var(--ph-ink); margin-bottom:14px;
}
.page-hero .hero-lead{ color:var(--ph-muted); font-size:1.08rem; max-width:56ch; margin:0 auto; }

/* Indhold / prose */
.content{ background:var(--ph-offwhite); padding:8px 24px 64px; }
.content .wrap{ max-width:820px; }
.prose .lead{ font-size:1.12rem; color:var(--ph-ink); margin-bottom:18px; }
.prose h2{ font-family:var(--ph-font-display); text-transform:uppercase; font-size:1.4rem; margin:36px 0 12px; color:var(--ph-ink); }
.prose h3{ font-size:1.08rem; font-weight:700; margin:26px 0 8px; color:var(--ph-ink); }
.prose p{ color:#3a3c40; margin-bottom:16px; }
.prose ul{ color:#3a3c40; margin:0 0 18px 1.2em; display:grid; gap:8px; }
.prose a{ color:var(--ph-blue); text-decoration:underline; }
.content-img{ width:100%; height:auto; display:block; border-radius:var(--ph-radius-lg); margin:6px 0 26px; }
.content-img.tall{ max-height:520px; object-fit:cover; }

/* Info-box · feature-strip · store-row (center-sider) */
.info-box{ background:#fff; border:1px solid var(--ph-line); border-radius:var(--ph-radius); padding:22px 24px; margin:22px 0; }
.info-box h3{ margin-top:0; font-size:1.02rem; text-transform:uppercase; letter-spacing:0.02em; }
.info-box p{ margin-bottom:6px; color:#3a3c40; }
.feature-strip{ display:grid; grid-template-columns:repeat(3,1fr); gap:14px; margin:28px 0; }
.feature{ background:var(--ph-blue); color:#fff; border-radius:var(--ph-radius); padding:20px; text-align:center; font-weight:700; font-size:0.95rem; }
.feature small{ display:block; font-weight:400; opacity:.85; margin-top:4px; }
.store-row{ display:flex; flex-wrap:wrap; gap:14px; margin:24px 0; }

/* Lokationer */
.locations{ background:var(--ph-offwhite); padding:16px 24px 64px; }
.location-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:18px; }
.location-card{
  background:#fff; border:1px solid var(--ph-line); border-radius:var(--ph-radius-lg);
  padding:26px; display:flex; flex-direction:column; gap:10px; transition:transform .2s, box-shadow .2s;
}
.location-card:hover{ transform:translateY(-3px); box-shadow:0 14px 32px rgba(0,0,0,0.10); }
.location-card h2{ font-family:var(--ph-font-display); text-transform:uppercase; font-size:1.2rem; }
.location-card .location-meta{ color:var(--ph-muted); font-size:0.92rem; }
.location-card .location-meta span{ display:block; }
.location-card .btn{ margin-top:auto; align-self:flex-start; }

/* Priser */
.pricing{ background:var(--ph-offwhite); padding:16px 24px 64px; }
.price-cat{ text-align:center; font-family:var(--ph-font-display); text-transform:uppercase; font-size:1.5rem; margin:52px 0 4px; color:var(--ph-ink); }
.price-cat.first{ margin-top:8px; }
.price-cat-sub{ text-align:center; color:var(--ph-muted); font-size:0.9rem; margin-bottom:22px; }
.price-grid{ display:grid; grid-template-columns:repeat(3,1fr); gap:18px; align-items:stretch; }
.price-card{
  background:#fff; border:1px solid var(--ph-line); border-radius:var(--ph-radius-lg);
  padding:30px 26px; text-align:center; display:flex; flex-direction:column; gap:12px;
}
.price-card.featured{ border:2px solid var(--ph-blue); }
.price-card h2{ font-size:1.1rem; text-transform:uppercase; }
.price-tag{ font-family:var(--ph-font-display); font-size:2.1rem; font-weight:800; color:var(--ph-blue); letter-spacing:-0.01em; }
.price-tag small{ font-size:0.9rem; font-weight:600; color:var(--ph-muted); }
.price-features{ list-style:none; color:var(--ph-muted); font-size:0.92rem; display:grid; gap:8px; }
.price-card .btn{ margin-top:auto; }
.price-note{ text-align:center; color:var(--ph-muted); font-size:0.82rem; margin-top:28px; }

/* Footer */
.site-footer{ background:#fff; border-top:1px solid var(--ph-line); padding-top:48px; }
.footer-grid{ display:flex; flex-wrap:wrap; gap:40px; justify-content:space-between; max-width:var(--ph-max); margin:0 auto; padding:0 24px 28px; }
.footer-logo{ font-family:var(--ph-font-display); text-transform:uppercase; font-weight:800; margin-bottom:10px; }
.footer-note{ color:var(--ph-muted); font-size:0.9rem; max-width:32ch; }
.footer-grid nav{ display:flex; flex-wrap:wrap; gap:10px 22px; max-width:520px; }
.footer-grid nav a{ font-size:0.9rem; color:var(--ph-muted); }
.footer-grid nav a:hover{ color:var(--ph-blue); }
.footer-bottom{ border-top:1px solid var(--ph-line); max-width:var(--ph-max); margin:0 auto; padding:18px 24px; font-size:0.8rem; color:var(--ph-muted); }

@media (max-width:860px){
  .location-grid, .feature-strip{ grid-template-columns:1fr; }
  .price-grid{ grid-template-columns:1fr; max-width:420px; margin:0 auto; }
}

/* ============================================================
   9. UNDERSIDE-SKABELON (Lærkes nye designs)
   Målt i Jobs.png, Medlemsfordele.png, Power House/Studio underside.png,
   alle 1366px brede. Der er TO sidetyper:
     TYPE A "indholdsside"  — 93px mørk bjælke m/ centreret titel + 251px
                              billedbånd. Jobs, Medlemsfordele, prose-siderne.
     TYPE B "brandside"     — ingen bjælke, 768px fuldbredde-hero m/ logo
                              ovenpå. Power House/Studio underside.
   Kun TYPE A er bygget her — B kommer med Power House-undersiden.
   ============================================================ */

/* 9.1 SIDEHOVED (type A) — 93px, menuens sorte, titel centreret på SIDEN.
   Faste px og ikke vw: bjælken er 93px i mockuppen, og en vw-værdi ville gøre
   den højere på brede skærme. Samme argument som footerens 100px.

   ⚠️ BURGEREN ER IKKE TEGNET I NOGEN AF DE FIRE MOCKUPS. Den er tilføjet, fordi
   undersiderne ellers er blindgyder — menuen er sitets eneste navigation.
   PROVISORISK, se CLAUDE.md.

   ⛔ TRE KOLONNER, IKKE EN ABSOLUT PLACERET GRUPPE (ændret 8. august 2026).
   Gruppen lå før `position:absolute`, netop så titlen kunne centreres i den
   FULDE bredde og ramme mockuppens x683. Det virkede på desktop og var i
   stykker på mobil: gruppen slutter ved x124,9, og en centreret titel lagde
   sig ind UNDER den. Målt ved 375 før rettelsen — husets-regler 12,5px,
   medlemsfordele 24,1px, content-og-kamera 37,6px og live-antal hele 124,9px,
   hvor titlen begyndte i x0 og løb tværs under både logo og burger.

   Gitteret er `1fr auto 1fr` med gruppen i kolonne 1 og titlen i kolonne 2.
   ⚠️ DESKTOP ER UÆNDRET: når der er plads, får de to 1fr-kolonner samme
   bredde, og titlen står derfor stadig centreret på SIDEN — mockuppens x683
   holder. Bliver pladsen for trang, kan kolonne 1 ikke krympe under gruppens
   bredde, så titlen skubbes en anelse ud af centrum i stedet for at lægge sig
   ovenpå. Det er den rigtige degradering: lidt skæv slår ulæselig.

   ⚠️ `min-height`, IKKE `height`. Bjælken skal kunne vokse, når en lang titel
   ombryder på en telefon. Med fast højde ville teksten bare løbe ud af
   bjælken. 93px er stadig mockuppens mål og rammes på alle normale titler.

   ⛔ RÆKKEN ER `row-reverse` — RET DEN IKKE TIL `row`. Markup'en i
   partials/header.html har logoet FØRST og burgeren bagefter, fordi forsiden
   og type B stabler dem i en søjle med logoet øverst. I type A skal burgeren
   derimod være det YDERSTE element til venstre, så den lander på x28 =
   menuens egen burger. Med almindelig `row` stod den på x118,6, altså
   90,6px fra menuens — det var langt sitets største burger-spring, og det er
   præcis dét Lærke har bedt om at få fjernet.
   Lodret: menuens streger står på y31..58 (midte 44,5), denne gruppes på
   y33..60 (midte 46,5). 2px — umærkeligt. */
.ph-subhead{
  position:relative;
  min-height:93px;
  background:var(--ph-menu-dark);
  display:grid; grid-template-columns:1fr auto 1fr;
  align-items:center; column-gap:14px;
  padding-block:10px;
}
.ph-subhead__title{
  grid-column:2; text-align:center;
  /* ⚠️ SIKKERHEDSNET, IKKE HOVEDLØSNINGEN. `min-width:0` lader titelkolonnen
     krympe under sin min-content, og `break-word` bryder som sidste udvej et
     ord, der alligevel ikke kan være der. Uden de to gav "MEDLEMSBETINGELSER"
     — ét ord uden brydepunkter — 36px vandret sideoverflow ved 320.
     Den PRIMÆRE løsning er den flydende grad i §7; det her er kun det, der
     sikrer at en fremtidig lang titel aldrig kan skubbe hele siden. */
  min-width:0; overflow-wrap:break-word;
  /* 25px giver ink-højde 18px = mockuppens cap. Løst ved at måle ink, ikke
     ved at regne på fontens metrikker.
     ⚠️ line-height 1,15 og ikke 1: titlen kan nu ombryde, og 1 klemmer to
     linjer sammen. Ink-højden er uændret 18, og med align-items:center
     står en enkelt linje præcis hvor den stod. */
  font-size:25px; font-weight:700; line-height:1.15;
  text-transform:uppercase; letter-spacing:0.01em;
  color:var(--ph-offwhite);
}
/* ⚠️ TYPE A LÆGGER GRUPPEN PÅ RÆKKE, ikke i søjle. Bjælken er 93px høj, og en
   søjle med logo + burger ville være ~110px. Logoet skrues samtidig ned til
   34px, så gruppen får luft i en 93px bjælke.
   ⚠️ Gruppen sidder nu i gitterets FØRSTE kolonne og er ikke længere absolut
   placeret — det er dét, der reserverer dens plads, så titlen ikke kan lægge
   sig ovenpå. Se begrundelsen ved .ph-subhead.
   ⛔ LOGOET BLIVER PÅ MOBIL (Jonas, 8. august 2026). Det var overvejet at
   skjule det under et knækpunkt for at give titlen ~45px mere i hver side,
   men logoet er brandet på en side hvor burgeren er det eneste andet
   element. Skjul det ikke. */
/* ⛔ `justify-self:start` ER IKKE VALGFRI — UDEN DEN FLYTTER BURGEREN SIG.
   Et gitter-element strækker sig som standard over hele sin kolonne, og
   kolonne 1 er `1fr`, altså bred. Kombineret med `row-reverse`, hvor
   flex-start er HØJRE kant, pakkes logo og burger så mod kolonnens højre
   side: målt på jobs @1366 stod burgeren på x502,9 i stedet for x28.
   ⚠️ Og fejlen er breddeafhængig — ved 375 med en lang titel klemmes
   kolonnen sammen om indholdet, og burgeren stod korrekt på x20. Den ville
   altså have set rigtig ud på telefonen og været 475px forkert på desktop.
   Med `justify-self:start` krymper elementet om sit indhold som før. */
.ph-subhead .ph-hoved{
  grid-column:1; justify-self:start;
  margin-left:var(--ph-hoved-x);
  flex-direction:row-reverse; align-items:center; gap:16px;
}
/* ⛔ GRUPPEN MÅ IKKE KRYMPE — OG `max-width:none` ER DET AFGØRENDE ORD.
   Da gruppen kom ind i gitteret, blev den et flex-element med plads-loft, og
   så krympede flex den for at give titlen luft. Den globale reset på linje 93
   (`img,video{max-width:100%}`) lod billedet følge med ned: målt blev logoet
   45×26 ved 375 og 18×26 ved 320, hvor det skal være 67×34. Præcis samme
   reset, der ødelagde overscan-reglerne på begge heroer 28. juli — den rammer
   hver gang et billede ligger i noget, der kan blive smalt.
   Med `flex:0 0 auto` + `max-width:none` er gruppens bredde nu kolonne 1's
   min-content, så det er TITLEN der ombryder i stedet for logoet der skrumper.
   Det er den rigtige rækkefølge: mærket er fast, teksten er elastisk. */
.ph-subhead .ph-hoved > *{ flex:0 0 auto; }
.ph-subhead .ph-hoved .ph-logo img{ height:34px; width:auto; max-width:none; }

/* 9.2 HEROBÅND (type A) — FJERNET 7. august 2026 på Lærkes anmodning.
   Båndet var 251px @1366 (18.375vw, frosset ved 1500px sidebredde som
   --ph-wide) og lå mellem den mørke titelbjælke og sidens indhold.

   ⛔ GENINDFØR DET IKKE UDEN AT SPØRGE. Det er fjernet fra ALLE elleve sider
   der havde det (live-antal, styrkeloft, medlemsfordele,
   fitness-til-virksomheder, jobs, kontakt, medlemsbetingelser, husets-regler,
   privatlivspolitik, cookiepolitik, content-og-kamera). Der er ingen side
   tilbage der bruger `.ph-subhero`, så reglen er slettet frem for at stå
   ubrugt — markup'en er væk i samme ombæring.

   ⚠️ Båndet var i forvejen en PLADSHOLDER hele vejen rundt: alle elleve sider
   viste det samme hårdt beskårne udsnit af `center-aarhus.webp`, opskaleret
   1,37×, fordi sitet ikke har ét eneste billede i båndets 5,4:1-format.
   TODO(jobs-hero) er dermed også bortfaldet.

   ⚠️ traenere.html havde ALDRIG et bånd og er derfor facit for hvordan
   overgangen ser ud: bjælke (93px) → sektionens egen padding → indhold. */

/* 9.3 JOBS — to kort side om side + en mail-linje.
   Mockuppen: kort 571x209 med 66px imellem, 24px radius, tekst centreret;
   kortenes overkant 37px inde i det offwhite felt; mail-linjens ink 46px under
   kortene og 34px over footer-logoet. */
.ph-jobs{ background:var(--ph-offwhite); padding:37px 0 0; }
.ph-jobs__cards{
  width:var(--ph-wide); max-width:none; margin:0 auto;
  display:grid; grid-template-columns:1fr 1fr; gap:66px;
}
/* Paddingen er løst NUMERISK mod mockuppens ink-afstande, ikke regnet ud af
   fontens metrikker: sæt en værdi, mål ink, ret. Se CLAUDE.md.

   ⚠️ MÅLT OM 7. AUGUST 2026, da Barlow afløste placeholder-fonten. Målene er
   samtidig læst forfra i Jobs.png i stedet for at hvile på den gamle note:

     kort-top → overskrift-ink-top          26px
     overskrift-ink-BUND → tekst-ink-top    25px
     tekstens ink-pitch                     26px
     sidste tekst-ink-bund → kortbund       48px  (hendes 4-linjers kort)
     overskriftens ink-højde                17px

   ⛔ DE 48px ER HENDES 4-LINJERS KORT — IKKE ET TAL VI HAR FUNDET PÅ.
   Mockuppens to kort er begge 209px høje, men har 4 og 5 tekstlinjer, så
   bundluften er henholdsvis 48 og 22px. Med Barlow er BEGGE vores kort på
   fire linjer (fonten er smallere end placeholderen, så Studio-teksten er
   gået fra fem til fire), og så er 48 præcis den værdi hun har tegnet for
   netop det tilfælde. Brug ikke 22 — det er femlinjers-kortets rest.

   ⚠️ Målt efter: A 26,5 · B 25,2 · C 48,4 · ink 17 · korthøjde 211 mod
   mockuppens 209. De halve pixels er afrunding til hele px i paddingen. */
.ph-jobcard{
  border-radius:24px;
  padding:23px 41px 47px;
  text-align:center;
  color:var(--ph-offwhite);
}
.ph-jobcard--house{ background:var(--ph-blue); }
.ph-jobcard--studio{ background:var(--ph-orange); }
/* ⚠️ 23px, IKKE 24 — ændret 7. august 2026 fordi FONTEN skiftede, ikke fordi
   designet gjorde. Målet er uændret Lærkes ink-højde på 17px; det var 24px
   der ramte den med placeholder-fonten, og Barlow sætter større ink ved samme
   grad, så 24px gav 18. Ved 23px er ink-højden målt til præcis 17.
   ⛔ JAG IKKE TALLET 24 TILBAGE — det er ink-højden der er målet, ikke graden.
   Overskrift og brødtekst ligger kun ét trin fra hinanden i Lærkes designs;
   hierarkiet er bevidst fladt. */
.ph-jobcard__title{
  font-size:23px; font-weight:700; line-height:1;
  text-transform:uppercase; letter-spacing:0.01em;
  margin-bottom:13px;                 /* 25px mellem overskrift-ink og tekst-ink */
}
/* ⚠️ INGEN max-width her. En ch-baseret bredde (49ch) klemte tekstspalten ned på
   441px mod mockuppens 488 og gav House-kortet en femte linje — kortet blev 25px
   for højt, altså præcis én linjeafstand. Målet er sat af PADDINGEN: mockuppens
   tekstspalte er 488 af kortets 571 = 85,5%, og 41px padding i hver side rammer
   det forhold af sig selv, uanset hvor bred --ph-wide gør kortet. */
.ph-jobcard__text{
  font-size:18px; line-height:26px;   /* 26px linjeafstand er målt i begge kort */
}
.ph-jobs__mail{
  text-align:center; font-size:18px; line-height:26px;
  padding:36px var(--ph-gutter) 0;   /* → 46px mellem kortbund og linjens ink */
}
/* ⚠️ INGEN UNDERSTREGNING (Lærke, 7. august 2026). Mail-linjen er sidens
   afsluttende udsagn og står alene og centreret — der er intet den kan
   forveksles med, så understregningen var støj frem for affordance.
   Hover og fokus bærer den nu i stedet, så den stadig er synligt klikbar for
   den der peger eller tabber. */
.ph-jobs__mail a{ text-decoration:none; }
.ph-jobs__mail a:hover{ text-decoration:underline; text-underline-offset:3px; }
.ph-jobs__mail a:focus-visible{
  outline:3px solid var(--ph-black); outline-offset:3px; border-radius:3px;
}

/* ⛔ JOBS-KORTENE BÆRER HVER SIT BRANDS SKRIFT (Lærke, 7. august 2026).
   Power House-kortet er navy og bruger sitets display-font (Inter);
   Power Studio-kortet er terrakotta og skal bruge Studios serif.
   Brødteksten i BEGGE er Barlow — det er Lærkes spec for begge brands.

   ⚠️ Det er DERFOR `--ps-font` er flyttet til :root (se §1). Den var scopet
   til `body.ps`, og jobs.html er ikke en Studio-side, så tokenet fandtes
   ikke her. Farverne er stadig scopet — det er kun skriftstakken der er
   fælles, og en font-stak kan ikke smitte af på et brand af sig selv. */
.ph-jobcard--studio .ph-jobcard__title{ font-family:var(--ps-font); font-weight:400; }
.ph-jobcard--house .ph-jobcard__title{ font-family:var(--ph-font-display); }

/* 9.4 FOOTER-VARIANT — undersiderne har KUN logoet, ikke forsidens
   "Powered by"-blok på 206px. Bekræftet i alle fire mockups.
   34px over og under logoet = mockuppens afstand fra logo til sidebund.

   ⚠️ `padding-block`, IKKE `padding:34px 0`. Denne regel står sidst i filen og
   har højere specificitet (0,2,0) end mobilreglen i §7, så en shorthand ville
   også nulstille dens vandrette gutter — målt: logoet klistrede til x0 og
   ikonrækken løb 0,2px ud over skærmkanten ved 375px. Med padding-block rører
   vi kun det lodrette og lader mobilens gutter stå. */
.ph-footer--sub .ph-footer__inner{ padding-block:34px; }

@media (max-width:860px){
  .ph-jobs__cards{ grid-template-columns:1fr; gap:22px; }
  .ph-jobcard{ padding:20px 24px 32px; }
  /* ⚠️ FLYDENDE GRAD, IKKE FAST 20px. Med gruppen fastholdt (logoet krymper
     ikke længere) er der ~181px tilbage til titlen ved 320, og
     "MEDLEMSBETINGELSER" fylder ~190px ved 20px — altså 36px sideoverflow.
     clamp'en tager de sidste par point af graden på de smalleste telefoner og
     lader den stå på 20px fra ~378px og op, hvor der er plads.
     ⚠️ Målt på 320/360/375/390/414/480/640/860 og på alle elleve type A-sider,
     jf. lærdommen om mellembredder. */
  .ph-subhead__title{ font-size:clamp(16px, 5.3vw, 20px); }
  /* ⚠️ Venstrekanten arves fra --ph-hoved-x og sættes IKKE her. Stod der
     `left:var(--ph-gutter)` (24px) som før, ville burgeren hoppe 4px når
     menuen åbnes — en rettelse der kun gælder desktop er ingen rettelse.
     Kun gap og logohøjde er mobil-specifikke. */
  .ph-subhead .ph-hoved{ gap:10px; }
  .ph-subhead .ph-hoved .ph-logo img{ height:26px; }
}

/* ============================================================
   10. UNDERSIDETYPE B — "brandside"
   Målt i Power House underside.png (1366×2277). Ingen mørk bjælke: siden
   åbner med et 768px fuldbredde-foto og logoet lagt ovenpå.
   Sektionerne herunder er skabelonens byggeklodser og skal genbruges af
   Power Studio-undersiden:
     .ph-bhero      hero m/ logo-overlay
     .ph-fac        vandret fotostribe m/ pil
     .ph-ctaband    farvet CTA-bånd m/ pilleknap + udsagn
     .ph-centres    kortgitter
   ============================================================ */

/* 10.1 HERO — 768px @1366 = 56,22vw. Gulvet på 360px sikrer at heroen ikke
   bliver en strimmel på mobil, hvor 56vw kun ville være 211px.

   ⚠️ LOFTET ER 1080px, IKKE 843. Det blev hævet 28. juli 2026, fordi de gamle
   843 (= 56,22% af 1500) frøs HØJDEN mens bredden blev ved med at vokse. Så
   voksede heroens forhold — 1,88 ved 1600, 2,26 ved 1920 — og eftersom videoen
   er 1,778, begyndte `cover` at beskære LODRET oven i vores egen zoom. Ved
   1920 var der 6 af loftets 329 rækker tilbage, og guldarmaturets lyseffekt var
   hele grunden til at skrue zoomen ned i første omgang.

   ⚠️ 56,22vw ER PRAKTISK TALT VIDEOENS EGET FORHOLD: 100/1,778 = 56,25. Det er
   ikke et tilfælde — Lærkes 768px ved 1366 ER 16:9, og hendes mockup er tegnet
   ved netop 1366. Hendes tal er altså ét punkt på kurven, ikke et loft, og
   formlen holder derfor heroen på videoens format hele vejen op.

   ⚠️ 1080 er valgt fordi det er VIDEOENS NATIVE HØJDE. Over det ville filen
   blive opskaleret, og der er derfor ingen kvalitet at hente ved at fortsætte.
   Prisen er at forholdet igen skrider over ~1920 (2560 giver 2,36), men det
   rammer nu kun de bredeste skærme i stedet for alt over 1500. */
/* ⚠️ HØJDEN LIGGER I EN VARIABEL, IKKE SOM ET TAL I REGLEN. Formlen herunder
   er Lærkes 16:9-format og gælder brandsiderne (Power House, Power Studio),
   men Hold plan er en BRUGSSIDE hvor en 768px hero ville skubbe hele skemaet
   under folden. Uden variablen ville den side være tvunget til at overskrive
   `height` direkte og dermed kopiere formlen — præcis den fælde
   --ph-bhero-zoom faldt i, se lærdommen om skjulte antagelser i CLAUDE.md. */
.ph-bhero{
  position:relative; overflow:hidden;
  --ph-bhero-h:clamp(360px, 56.22vw, 1080px);
  height:var(--ph-bhero-h);
}
.ph-bhero__img,
.ph-bhero__video{
  position:absolute; inset:-2px;        /* overscan: undgår hårfine kanter ved subpixel */
  width:calc(100% + 4px); height:calc(100% + 4px);
  max-width:none;                       /* se .ph-hero__video — uden den fejler overscanet vandret */
  object-fit:cover;
  /* Bunden er motivet: træningsgulvet med folk og maskiner. Når heroen ER bred
     nok til at beskære lodret (over ca. 1520px), skal det hele tages fra
     TOPPEN, altså loftet. */
  object-position:50% 100%;
  /* ⚠️ ZOOMEN ER IKKE PYNT — den er den eneste måde at flytte tyngdepunktet ned.
     object-position's Y-værdi er nemlig HELT UDEN VIRKNING under ~1520px:
     heroen er dér smallere end videoens 1,778, så cover fylder HØJDEN ud og
     beskærer i siderne i stedet. Målt lodret beskæring uden zoom: 0px ved 375,
     768, 1024, 1366 OG 1500 — først ved 1600 dukker der 47px op.
     Hele videoens højde var altså allerede synlig, og loftet fyldte ikke på
     grund af en beskæring, men fordi det er optagelsens eget udsnit.
     Med scale + transform-origin i bunden bliver den synlige del præcis 1/zoom
     af billedhøjden, målt fra bunden — og resten klippes af .ph-bhero's
     overflow:hidden. Prisen er vandret: bredden vokser med samme faktor. */
  /* 1,12 målt frem, ikke valgt på øjemål: guldarmaturets lyseffekt løber fra
     række 0 til 329 af videoens 1080 (målt som andelen af meget lyse pixels pr.
     række). Ved 1,12 klippes 116 af dem væk, så der står 213 tilbage — altså
     knap to tredjedele af loftet, og lyset læses stadig som en effekt.
     Gulvet (række ~600-1080) fylder til gengæld halvdelen af det synlige.
     Var 1,22, hvor kun 130 rækker loft var tilbage. */
  --ph-bhero-zoom:1.12;
  transform:scale(var(--ph-bhero-zoom));
  transform-origin:50% 100%;
}
/* Videoen er baggrund og må aldrig tage fokus eller ligge over logoet.
   .ph-bhero__top har z-index:2, scrimmen ligger imellem. */
.ph-bhero__video{ z-index:0; pointer-events:none; }
/* Scrim kun i toppen: logoet og burgeren skal holde på et lyst foto, men
   resten af billedet skal ikke mørknes unødigt. */
.ph-bhero__scrim{
  position:absolute; inset:0;
  background:linear-gradient(180deg, rgba(0,0,0,0.42) 0%, rgba(0,0,0,0) 34%);
}
/* Mockuppens logo står på x47/y42 — derfor padding, ikke --ph-wide.
   ⚠️ flex-start, ikke space-between: gruppen fra partials/header.html holder nu
   logo OG burger samlet i venstre side. Med space-between blev burgeren
   skubbet helt ud i højre kant, hvilket modsiger "øverst til venstre". */
/* ⚠️ VENSTRE PADDING FLYTTET 47 → 28px (7. august 2026, Lærkes ønske om at
   burgeren skal sidde ENS PLACERET PÅ ALLE SIDER). De 28 er menuens egen
   venstrekant, så burgeren nu står samme sted før og efter et klik.

   ⛔ DET ER DET ENESTE STED HVOR ET MÅLT MOCKUP-TAL ER OVERTRUMFET.
   `Power House underside.png` har logoboksen på x46/y43, og de 47 var målt
   direkte i den. Hendes nyere instruks vinder over den ældre måling — men det
   flytter logoet 19px til venstre på power-house.html og power-studio.html.
   ⚠️ Hendes type B-mockup har SLET INGEN burger, så der er intet i filen der
   fortæller hvad der skulle ske med logoet når en burger kom til.
   Vil hun have logoet tilbage på x47, er det dette ene tal — men så hopper
   burgeren 19px igen på netop de to sider. Spørg hende. */
.ph-bhero__top{
  position:absolute; inset:0; z-index:2;
  display:flex; justify-content:flex-start; align-items:flex-start;
  padding:42px 47px 42px var(--ph-hoved-x);
}
.ph-bhero__top .ph-logo img{ height:63px; }   /* målt 122×63 i mockuppen */

/* 10.2 FACILITETSSTRIBE — 7 fotos à 151×247, 28px imellem, rund pil til højre.
   Native scroll: vi overtager ikke fingeren, knappen skubber blot scrollen.
   ⚠️ overflow-y SKAL sættes eksplicit til hidden. Sætter man kun overflow-x,
   beregner browseren overflow-y til auto og der kommer en lodret scrollbar —
   samme fælde som karosellen på forsiden. */
.ph-fac{
  position:relative;                    /* ⚠️ .ph-fac__prev hænger på den — se dér */
  background:var(--ph-offwhite);
  padding:17px 0 20px;                  /* mockuppens luft over/under fotoerne */
  display:flex; align-items:center; gap:20px;
  padding-right:var(--ph-gutter);
}
.ph-fac__viewport{
  flex:1 1 auto; min-width:0;
  overflow-x:auto; overflow-y:hidden;
  scroll-snap-type:x proximity;
  /* ⚠️ SKAL matche rækkens padding-inline-start. scroll-snap-align:start måler
     fra scrollportens kant, så uden det her ligger første fotos snap-punkt 23px
     inde: en "tilbage til start" landede på 13,6 i stedet for 0, og første foto
     stod beskåret. */
  scroll-padding-left:clamp(12px, 1.54vw, 23px);
  scrollbar-width:none;
}
.ph-fac__viewport::-webkit-scrollbar{ display:none; }
.ph-fac__row{
  display:flex; gap:clamp(12px, 2.05vw, 31px); list-style:none;
  width:max-content; padding-left:clamp(12px, 1.54vw, 23px);
}
.ph-fac__item{ flex:0 0 auto; scroll-snap-align:start; }
/* ⚠️ RAMMEN KLIPPER — det er hele pointen i hover-zoomen: billedet vokser INDE
   i feltet, mens feltet selv beholder sine mål, så stribens rytme ikke rykker
   sig. Fjernes overflow:hidden, skubber det forstørrede billede ud over sine
   naboer. */
.ph-fac__item figure{
  position:relative; overflow:hidden; border-radius:4px;
  width:clamp(104px, 11.05vw, 166px);
  height:clamp(170px, 18.08vw, 271px);
}
.ph-fac__item img{ width:100%; height:100%; object-fit:cover; }

/* ⛔ DÆMPNINGEN OG ZOOMEN LIGGER BAG (hover:hover) and (pointer:fine) — og det
   er ikke en detalje. Uden den ville billederne stå PERMANENT dæmpede på
   telefon og tablet, hvor der ikke findes en mus til nogensinde at gøre dem
   klare igen. Dæmpning uden en vej tilbage er ikke en effekt, det er bare
   dårlige billeder. På touch vises de derfor klare og fuldt mættede fra start.
   Det fjerner samtidig "sticky hover", hvor et tryk efterlader ét felt klart
   indtil man rører et andet. */
@media (hover:hover) and (pointer:fine){
  .ph-fac__item img{
    filter:saturate(0.55) brightness(0.82);
    transition:transform .4s ease-out, filter .4s ease-out;
  }
  .ph-fac__item figure:hover img{
    filter:saturate(1) brightness(1);
    transform:scale(1.06);
  }
}
/* Labelen ligger PÅ fotoet med sin egen mørkning — ellers ville hvid tekst
   forsvinde på de lyse motiver (poseringslokalet er næsten hvidt).
   ⚠️ Den er SØSKENDE til billedet, ikke barn, netop for at stå stille under
   zoomen. z-index sikrer at den bliver liggende over det skalerede billede,
   som får sin egen stacking context af transformen. */
.ph-fac__item figcaption{
  position:absolute; inset:auto 0 0 0; z-index:1; padding:24px 10px 10px;
  background:linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,0.62) 100%);
  color:#fff; font-size:11px; font-weight:700; line-height:1.18;
  text-transform:uppercase; letter-spacing:0.02em;
}
/* "(kun i Odense)" på sauna-feltet. Dæmpet og uden fed, så det læses som en
   OPLYSNING om feltet og ikke som en del af facilitetens navn.
   ⚠️ Den skal blive stående. Striben læses som "det her får du i Power
   House", og et sauna-felt uden forbehold er et løfte der brydes i det
   øjeblik nogen kører til Aalborg efter det. */
.ph-fac__kun{ font-weight:400; opacity:0.82; letter-spacing:0.01em; }
/* Billederne er IKKE interaktive — ingen links, ingen knapper, intet tabstop og
   ingen lightbox. Betjeningen ligger i stedet på selve scroll-containeren, som
   er fokuserbar, så piletasterne bladrer. Fokusrammen skal derfor være tydelig:
   den er den eneste kvittering tastaturbrugeren får. */
.ph-fac__viewport:focus-visible{
  outline:3px solid var(--ph-black); outline-offset:3px; border-radius:4px;
}
.ph-fac__next, .ph-fac__prev{
  flex:0 0 auto; width:41px; height:41px; border-radius:50%;
  border:1.5px solid var(--ph-ink); background:var(--ph-offwhite); color:var(--ph-ink);
  display:grid; place-items:center; font-size:19px; line-height:1;
  transition:background-color .2s ease, color .2s ease, transform .2s ease;
}
.ph-fac__next:hover{ background:var(--ph-ink); color:var(--ph-offwhite); transform:scale(1.06); }
/* ⚠️ TILBAGE-PILEN LIGGER OVENPÅ, ikke i flowet. I flowet ville dens 41px + gap
   skubbe stribens venstre kant fra mockuppens x21 til ~x82 — og Lærkes design
   har kun ÉN pil, i højre side. Som overlay bevares hendes geometri præcis, og
   pilen findes kun i de øjeblikke hvor der faktisk er noget at bladre tilbage til.

   ⛔ KRÆVER position:relative PÅ .ph-fac. Uden den er der ingen positioneret
   forfader, og knappen falder tilbage på det initielle indeholdende blok —
   altså VIEWPORTEN. Så betyder top:50% "midt på skærmen" i stedet for "midt i
   striben", og pilen svæver et helt andet sted på siden. Målt før rettelsen:
   top 430px = halvdelen af vinduets 860, ikke stribens midte. */
.ph-fac__prev{
  position:absolute; z-index:2;
  left:clamp(12px, 1.54vw, 23px); top:50%;
  transform:translateY(-50%);
  box-shadow:0 2px 10px rgba(16,23,64,0.22);
}
/* ⚠️ Hover MÅ IKKE overskrive centreringen — transform er én egenskab, så
   translateY skal skrives med, ellers springer pilen ned. */
.ph-fac__prev:hover{
  background:var(--ph-ink); color:var(--ph-offwhite);
  transform:translateY(-50%) scale(1.06);
}

/* 10.3 CTA-BÅND — 103px, hvid pille 130×37 + to-linjers versal-udsagn. */
.ph-ctaband{ background:var(--ph-menu-dark); }
.ph-ctaband__inner{
  width:var(--ph-wide); max-width:none; margin:0 auto;
  min-height:103px; padding:18px 0;
  display:flex; align-items:center; justify-content:center; gap:53px;
  flex-wrap:wrap;
}
/* 130×37 målt i mockuppen. .ph-btn--pill's egen padding ville give 140×40. */
.ph-ctaband__knap{ flex:0 0 auto; padding:8px 17px; font-size:14px; }
/* 19px giver ink-højde 16 = mockuppens mål, og 28px linjeafstand er målt
   mellem de to linjer. */
.ph-ctaband__tekst{
  color:var(--ph-offwhite); font-size:19px; line-height:28px;
  text-transform:uppercase; letter-spacing:0.01em;
}

/* 10.4 CENTER-KORT — 3×2, mockuppen 394×474 med gap 51/24 og 19px padding.
   Fotoet er 356×200 = 1,78:1 og har 19px luft til top/venstre/højre. */
.ph-centres{ background:var(--ph-offwhite); padding:32px 0 40px; }
.ph-centres__grid{
  width:var(--ph-wide); max-width:none; margin:0 auto; list-style:none;
  display:grid; grid-template-columns:repeat(3, 1fr); gap:24px 51px;
}
.ph-centre{
  display:flex; flex-direction:column; height:100%;
  background:var(--ph-blue); color:var(--ph-offwhite);
  border-radius:24px; padding:19px 19px 33px;
  transition:transform .22s ease, box-shadow .22s ease;
}
.ph-centre__foto{
  display:block; overflow:hidden; border-radius:14px;
  aspect-ratio:356 / 200; margin-bottom:22px;
}
.ph-centre__foto img{ width:100%; height:100%; object-fit:cover; transition:transform .32s ease; }
/* 21px → ink 15 som mockuppen. Bynavnet er kursiv i designet (<em>). */
.ph-centre__navn{
  font-size:21px; font-weight:700; line-height:1.15;
  text-transform:uppercase; letter-spacing:0.01em;
}
.ph-centre__navn em{ font-style:italic; }
/* ⚠️ 18px, ikke de 20 som mockuppens ink-højde peger på. Ved 20px fylder
   "Vester Farimagsgade 29, 1606 København V" mere end kortets 362,8px og
   ombryder til to linjer — så bliver række 2 26px højere end række 1, og
   gitterets rytme falder fra hinanden. Alle seks adresser står på ÉN linje i
   Lærkes design, og placeholder-fonten er ~15% bredere end hendes (samme fund
   som ved Jobs). Prøv 20px igen når brand-fonten kommer. */
.ph-centre__adr{ font-size:18px; line-height:1.3; margin-top:4px; }
/* ---------- "FIND VEJ" ----------
   ⚠️ KLASSEN HEDDER `rute`, KNAPPEN HEDDER "Find vej". Den hed "Vis rute" da
   den blev bygget 9. august 2026 og blev omdøbt samme dag til Lærkes eget ord.
   Klassenavnet beskriver hvad linket GØR og er ikke fulgt med — bliv ikke
   forvirret over at de to er forskellige.

   ⛔ OG DER KOMMER INTET SYNLIGT KORT (Lærke, 9. august 2026). Hun vil kun
   have knappen. Byg ikke et statisk kortudsnit, og hent ikke kortfliser fra
   OpenStreetMap — det forslag er afvist, ikke udskudt.

   Placeret lige UNDER adressen, ikke i bunden ved Instagram-linket. Kortet
   har i forvejen tre ting under adressen (tider, facilitetsmarkører,
   Instagram), og to understregede links stablet i bunden ville læses som ét
   rodet blok. Her hører linket til dét, det handler om — adressen — og
   kortet får ingen ny bundzone.

   ⚠️ SAMME BEHANDLING SOM INSTAGRAM-LINKET, og det er en bevidst gentagelse:
   understreget FRA START (kortet er ellers ikke-interaktivt, så linket skal
   bære hele sin affordance selv — se ⛔-noten ovenfor), `align-self` så kun
   teksten er klikbar, og hverken `target="_blank"` eller ekstern-markering.
   De to links på samme kort må ikke opføre sig forskelligt.

   ⛔ INGEN EMBED, INGEN COOKIES. Linket er en almindelig URL til brugerens
   eget kort; sitet sætter fortsat nul cookies, og der skal intet samtykke
   til. Et Google Maps-EMBED ville rive hele det spørgsmål op — se
   ⛔-vurderingen under Status (7. august). */
.ph-centre__tid{
  font-size:15px; line-height:18px; margin-top:10px;
  color:rgba(255,255,255,0.82);
}
.ph-centre--studio .ph-centre__adr em{ font-style:italic; }

/* ---------- HANDLINGSRÆKKEN: FIND VEJ + INSTAGRAM ----------
   To runde ikoner, begge klikbare (Jonas, 9. august 2026). De afløser to
   understregede tekstlinjer, som stod hvert sit sted på kortet: "Find vej"
   under adressen og "Følg <by> på Instagram" i bunden.

   ⛔ DE ER SAMLET ÉT STED, OG DET ER EN ÆNDRING AF BEGRUNDELSEN FRA 9. AUGUST.
   Dengang lå rute-linket under adressen, fordi "to understregede links stablet
   i bunden ville læses som én rodet blok". Det argument gjaldt TEKST. To runde
   ikoner side om side læses derimod som én bevidst kontrolgruppe, og kortet
   får en klar orden: foto -> oplysninger -> handlinger. Et enligt ikon midt i
   tekststakken ville derimod bryde læsningen.

   `margin-top:auto` skubber rækken til bunden, så de fem kort får deres
   ikoner på linje uanset hvor meget tekst de har.

   ⚠️ IKONERNE ER SELVHOSTEDE SVG'ER i assets/icons/, tegnet efter samme
   mønster som facilitetsmarkørerne: SORT fyld, brugt som mask-image, hvor kun
   alfakanalen tæller. Farven kommer herfra. Ingen CDN — samme regel som fonte.
   ⚠️ `-webkit-mask` SKAL med ved siden af `mask`: uden den falder ikonet bort
   på Safari før 15.4, og der står så en tom cirkel UDEN en eneste konsolfejl. */
.ph-centre__handlinger{
  display:flex; gap:8px;
  margin-top:auto; padding-top:16px;
}
/* ⛔ 44×44 ER TAPMÅLET, IKKE IKONETS STØRRELSE. Samme rettelse som de sociale
   ikoner i footeren 8. august: mærket må gerne være lille, feltet omkring skal
   være stort. Her er ikonet 20px og feltet 44px, altså 4,8 gange arealet.
   ⚠️ Kortet er ellers IKKE interaktivt (se ⛔-noten om .ph-centre--link), så
   disse to skal bære hele deres affordance selv — derfor både en synlig kant,
   en fyldt flade og en tydelig fokusramme. */
.ph-centre__ikon{
  display:grid; place-items:center;
  width:44px; height:44px; flex:0 0 auto;
  border-radius:50%;
  border:1px solid rgba(239,239,237,0.34);
  background:rgba(239,239,237,0.10);
  transition:background-color .2s ease, border-color .2s ease;
}
.ph-centre__ikon::before{
  content:''; width:20px; height:20px;
  background:var(--ph-offwhite);
  -webkit-mask:var(--ph-ikon) center / contain no-repeat;
  mask:var(--ph-ikon) center / contain no-repeat;
}
.ph-centre__ikon:hover{
  background:rgba(239,239,237,0.22);
  border-color:rgba(239,239,237,0.62);
}
/* Fokusrammen ligger UDEN FOR cirklen på kortets navy, så den skal have
   kontrast mod navy — offwhite giver 14,5:1. */
.ph-centre__ikon:focus-visible{
  outline:3px solid var(--ph-offwhite); outline-offset:3px;
}
.ph-centre__ikon--rute { --ph-ikon:url("../assets/icons/ti-map-pin.svg"); }
.ph-centre__ikon--insta{ --ph-ikon:url("../assets/icons/ti-brand-instagram.svg"); }

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

/* ---------- FACILITETSMARKØRER PÅ CENTER-KORTENE ----------
   Variant 2, valgt af Jonas 9. august 2026: kortet viser BÅDE hvad centret
   har og hvad det mangler. (Udkast A — kun det centret har — var min
   anbefaling 7. august; den er dermed forkastet, rejs den ikke igen.)

   ⚠️ NAVNET ER `.ph-facmark`, IKKE `.ph-fac`. `.ph-fac` er den vandrette
   FACILITETSSTRIBE længere oppe på samme side, med sine egne 16 felter og sin
   egen scroll-mekanik. De to har intet med hinanden at gøre, og en selektor
   på `.ph-fac` rammer ikke `.ph-facmark` — men de ligner hinanden nok til at
   det er værd at skrive.

   ⛔ FRAVÆR BÆRES AF TRE SAMTIDIGE SIGNALER, og alle tre skal blive:
     1. FORMEN     — kryds i stedet for ikon
     2. FYLDET     — tom cirkel med kant, i stedet for fyldt offwhite
     3. TEKSTEN    — dæmpet farve og vægt 400 mod 500
   Farve alene ville falde bort for den der ikke skelner den dæmpede offwhite
   fra den fulde. Fjerner man ét af de tre, er markøren ikke længere
   tilgængelig — den ser bare stadig pæn ud, hvilket er værre.

   ⚠️ SKÆRMLÆSEREN FÅR DET OGSÅ. Ikonet er `aria-hidden` og bærer ingen
   betydning; listen har et `aria-label` med centrets navn, og de manglende
   faciliteter har en visuelt skjult "– findes ikke her". Uden den ville et
   fravær lyde nøjagtig som en tilstedeværelse. */
/* ⛔ TO KOLONNER — OG BEGRÆNSNINGEN ER KORTETS BREDDE, IKKE VIEWPORTENS.
   Målt 9. august 2026: "Fitness og cardio" ombryder til to linjer, så snart
   markørkolonnen kommer under ~143px, og så bliver rækken 34px mod 30.

   ⚠️ ET VIEWPORT-KNÆKPUNKT KAN IKKE FANGE DET, og det er ikke indlysende:
   kortet er smallest ved 1024px (tre kortkolonner -> 254px indhold), ikke på
   en telefon (én kortkolonne -> 281px). Fejlen ville altså ramme en DESKTOP-
   bredde og ikke mobilen — præcis den mellembredde-fælde CLAUDE.md advarer
   om, blot vendt om.

   ⛔ OG `auto-fit` + `minmax` ER HELLER IKKE SVARET, selv om det lyder rigtigt.
   Målt: det gav TRE kolonner ved 640px og ÉN ved 1024px. Det optimerer for
   hvad der kan være der, ikke for det design der er bestemt — og resultatet
   er et markørgitter der skifter form tre gange hen over bredderne.

   En container query spørger om præcis det rigtige: er DETTE KORT bredt nok
   til to kolonner? 306px = 2 x 143 + 20 gap.
   ⚠️ Standarden er to kolonner, og container query'en tager kun én VÆK. Så
   er designet stadig som bestemt, hvis en browser ikke kan container queries.
   ⚠️ DE 143px ER MÅLT: 30px ikon + 9px gap + 104px til den længste etiket ved
   14px. Skifter etiketten eller graden, skal tallet måles om. */
.ph-centre{ container-type:inline-size; }
.ph-facmarks{
  list-style:none; margin:14px 0 0; padding:0;
  display:grid; grid-template-columns:repeat(2, 1fr); gap:10px 20px;
}
@container (max-width: 305px){
  .ph-facmarks{ grid-template-columns:1fr; }
}
.ph-facmark{
  display:flex; align-items:center; gap:9px;
  font-size:14px; line-height:1.2;
}
.ph-facmark__ikon{
  position:relative; flex:0 0 auto;
  width:30px; height:30px; border-radius:50%;
  display:grid; place-items:center;
}

/* HAR — fyldt cirkel, navy ikon. Ikonet ligger som en MASKE, så farven
   styres af CSS og ikke af filen; SVG'erne er derfor tegnet i sort.
   ⚠️ `-webkit-mask` skal med: uden den falder ikonet bort på Safari før
   15.4, og så står der en tom offwhite cirkel uden nogen fejl i konsollen. */
/* ⛔ SELVE MASKE-KODEN STÅR ÉT STED — både tilstedeværelse og fravær bruger
   den samme ::before. Kun masken og farven skifter. Før 9. august 2026 var
   fraværs-krydset tegnet med TO pseudoelementer og en rotation; nu er det
   ti-x som maske, så alle seks former kommer fra samme sæt og har samme
   stregtykkelse. */
.ph-facmark__ikon::before{
  content:""; width:17px; height:17px;
  -webkit-mask:var(--ph-facmark-ikon) center / contain no-repeat;
          mask:var(--ph-facmark-ikon) center / contain no-repeat;
}
.ph-facmark--ja{ font-weight:500; }
.ph-facmark--ja .ph-facmark__ikon{ background:var(--ph-offwhite); }
.ph-facmark--ja .ph-facmark__ikon::before{ background:var(--ph-blue); }

/* MANGLER — tom cirkel med kant, kryds indeni, dæmpet tekst.
   ⚠️ MASKEN SÆTTES PÅ ::before OG IKKE PÅ `.ph-facmark--nej`. Sidstnævnte
   ville have samme specificitet (0,1,0) som `.ph-facmark--fitness`, og så
   afgjorde rækkefølgen i filen hvilket ikon der vandt — en fælde der først
   viser sig den dag nogen flytter en regel. På ::before er specificiteten
   højere, og krydset vinder uanset placering. */
.ph-facmark--nej{ font-weight:400; color:rgba(239,239,237,.45); }
.ph-facmark--nej .ph-facmark__ikon{ border:1px solid rgba(239,239,237,.30); }
.ph-facmark--nej .ph-facmark__ikon::before{
  --ph-facmark-ikon:url("../assets/icons/ti-x.svg");
  /* 14 og ikke 17: ti-x fylder hele sit viewBox, mens de fire facilitets-
     ikoner har luft omkring sig. Ved samme mål ville krydset se større ud
     end det det erstatter. */
  width:14px; height:14px;
  background:rgba(239,239,237,.45);
}

/* Hvilket ikon der maskes ind. ⚠️ Ét custom property pr. facilitet frem for
   fire regelsæt — så findes maske-koden ét sted, og en ny facilitet er én
   linje plus én fil.
   ⚠️ FILNAVNENE BEHOLDER ti-PRÆFIKSET, så det altid kan ses hvilket
   Tabler-ikon en fil er, og `python hent-ikoner.py` kan hente den samme igen
   ved navn. Hvad ikonet BRUGES til, står her — ikke i filnavnet. */
.ph-facmark--fitness { --ph-facmark-ikon:url("../assets/icons/ti-barbell.svg"); }
.ph-facmark--reformer{ --ph-facmark-ikon:url("../assets/icons/ti-stretching.svg"); }
.ph-facmark--posering{ --ph-facmark-ikon:url("../assets/icons/ti-camera.svg"); }
.ph-facmark--sauna   { --ph-facmark-ikon:url("../assets/icons/ti-flame.svg"); }
/* Studio-kortet har sit eget "læs mere" og skal ikke have to knapper i
   bunden — men det er også et link i forvejen, så det får intet her. */
/* Power Studio-kortets "læs mere" — designets eneste synlige knap. mt:auto
   skubber den til bunden, så den flugter uanset kortets højde. */
.ph-centre__mere{
  align-self:flex-end; margin-top:auto; margin-right:14px;
  background:var(--ph-offwhite); color:var(--ph-ink);
  border-radius:var(--ph-radius-pill); padding:9px 26px;
  font-size:14px; letter-spacing:0.04em; text-transform:uppercase;
  transition:transform .2s ease;
}

/* ⚠️ AFFORDANCEN HÆNGER PÅ --link OG KUN DER. Efter 28. juli 2026 er kun Power
   Studio-kortet et link; de fem center-kort er ren visning, fordi deres indhold
   nu står på selve kortet og der ikke er nogen underside at gå til.
   Et løft eller en zoom på et kort man ikke kan klikke, lover en handling der
   ikke findes — derfor er selektorerne snævret ind i stedet for at blive
   slettet: Power Studio-kortet har stadig ingen synlig knap ud over sit "læs
   mere", så de fire samtidige signaler (løft, skygge, fotozoom, understregning)
   bærer stadig hele affordancen dér. */
.ph-centre--link:hover{ transform:translateY(-4px); box-shadow:0 14px 34px rgba(16,23,64,0.34); }
.ph-centre--link:hover .ph-centre__foto img{ transform:scale(1.045); }
.ph-centre--link:hover .ph-centre__navn{ text-decoration:underline; text-underline-offset:4px; }
.ph-centre--link:hover .ph-centre__mere{ transform:translateY(-2px); }
/* Fokusrammen ligger UDEN FOR kortet på den offwhite bund, så den skal have
   kontrast mod offwhite — ikke mod kortets navy. Brand-sort giver 14,6:1. */
.ph-centre--link:focus-visible{
  outline:3px solid var(--ph-black); outline-offset:3px;
  transform:translateY(-4px); box-shadow:0 14px 34px rgba(16,23,64,0.34);
}
.ph-centre--link:focus-visible .ph-centre__navn{ text-decoration:underline; text-underline-offset:4px; }
/* Samme fire signaler til tastatur som til mus — ellers får den der tabber sig
   frem en svagere affordance end den der peger. */
.ph-centre--link:focus-visible .ph-centre__foto img{ transform:scale(1.045); }

@media (prefers-reduced-motion: reduce){
  /* Understregning og skygge bliver — de er ikke bevægelse, og de bærer
     affordancen når løft og zoom slås fra. */
  .ph-centre, .ph-centre__foto img, .ph-centre__mere,
  .ph-fac__next, .ph-fac__prev, .ph-fac__item img{ transition:none; }
  .ph-centre--link:hover, .ph-centre--link:focus-visible{ transform:none; }
  .ph-centre--link:hover .ph-centre__foto img{ transform:none; }
  .ph-centre--link:hover .ph-centre__mere{ transform:none; }
  .ph-fac__next:hover{ transform:none; }
  /* Stribens zoom OG dæmpning falder bort, og billederne vises klare. Uden
     filter-nulstillingen ville de stå dæmpede permanent, fordi den eneste vej
     til fuld mætning er en hover-overgang vi lige har slået fra.
     Selektorerne matcher hover-blokkens præcist og står senere i filen, så de
     vinder uden !important. */
  .ph-fac__item img{ filter:none; transform:none; }
  .ph-fac__item figure:hover img{ filter:none; transform:none; }
  /* ⚠️ IKKE transform:none på tilbage-pilen — dens transform BÆRER
     centreringen (translateY(-50%)), så en nulstilling ville flytte knappen
     ned i stedet for blot at fjerne bevægelse. Kun skaleringen skal væk. */
  .ph-fac__prev:hover{ transform:translateY(-50%); }

  /* Type B-heroens video erstattes af sin poster — samme greb som forsidens
     hero. Videoen skjules helt, så den ikke afspiller usynligt. */
  .ph-bhero__video{ display:none; }
  .ph-bhero{
    background:var(--ph-dark) url('../media/hero-power-house-poster.webp') center 42%/cover no-repeat;
  }
  /* ⛔ STUDIO SKAL HAVE SIN EGEN POSTER. Reglen ovenfor er skrevet dengang
     power-house.html var den eneste type B-side med video, og den hardkoder
     Power House' poster på .ph-bhero. Uden den her linje ville en bruger med
     "reducér bevægelse" få POWER HOUSE-heroen at se på en POWER STUDIO-side
     — altså det modsatte brand, præcis dér hvor de to skal holdes adskilt.
     Fanget 7. august 2026 da Studio-heroen blev video.
     ⚠️ Kommer der en tredje type B-side med video, skal den have sin egen
     linje her. Overvej i så fald at flytte posteren til en variabel. */
  .ps-hero{
    background:var(--ps-ink, var(--ph-dark)) url('../media/ps-hero-poster.webp') center 50%/cover no-repeat;
  }
}

@media (max-width:1000px){
  .ph-centres__grid{ grid-template-columns:repeat(2, 1fr); gap:24px 30px; }
}

/* ============================================================
   11. POWER STUDIO — eget formsprog oven på type B
   Målt i Power Studio underside.png (1366×1452).

   ⛔ TOKENS LIGGER I ET EGET NAVNERUM (--ps-*) OG SCOPES TIL body.ps.
   Power House' --ph-* overskrives ALDRIG. Power House og Power Studio er to
   adskilte kundetyper, og et token der lækkede fra den ene til den anden ville
   blande dem netop dér hvor de skal holdes fra hinanden. Fordi de er scopet
   til .ps, EKSISTERER de ikke engang på de øvrige sider.

   Blokkene genbruger type B's byggeklodser med modifikatorer:
     .ph-bhero                 → uændret, kun --ph-bhero-zoom nulstilles
     .ph-ctaband--studio       → offwhite, 146px, søjle m/ to piller
     .ph-fac--studio           → fotostribe 259×145, kant til kant, ingen pil
     .ps-kortbaand             → EGEN blok: terrakotta-bånd m/ tekstkort.
                                 Se noten dér om hvorfor den ikke er en ctaband.
   ============================================================ */
body.ps{
  --ps-terra:#C6733F;          /* målt i mockuppen: rgb(198,115,63) */
  --ps-ink:#191C1A;            /* pillens mørke: rgb(26,28,25) = brand-sort */
  --ps-lys:#EFEFED;
  /* ⏳ STAKKEN ER KLAR — FILEN MANGLER. Lærkes valg er "Humble Nostalgia"
     (7. august 2026) til Power Studios OVERSKRIFTER; brødtekst og alle
     knapper skal være Barlow, hvilket de allerede er, fordi de arver
     `--ph-font-body` og ikke sætter noget selv.

     Navnet står forrest i stakken nu, så der ikke skal røres CSS den dag
     filen kommer — Georgia bærer indtil da, og en font der ikke findes,
     springes bare over. ⚠️ Der er BEVIDST ingen `@font-face` endnu: en regel
     der peger på en fil vi ikke har, giver et 404 ved hver sidevisning.
     Skabelonen ligger klar i §0, udkommenteret.

     ⛔ KØB IKKE FØR TEGNSÆTTET ER BEKRÆFTET. Demoen har hverken æ, ø eller å,
     og ingen af de fire forhandlere oplyser sprogunderstøttelse for den
     fulde version. Og fonten har KUN ÉN VÆGT, så den kan ikke bære en rolle
     der bruger font-weight 700/800. Se ⛔-sektionen om fonte i CLAUDE.md.

     Alle mål nedenfor er ramt ved at måle INK-højde, ikke ved at gætte
     skriftstørrelser, så de holder når fonten skiftes — men de skal MÅLES
     OM, præcis som Jobs-kortene skulle da Barlow kom ind. */
}

/* ⚠️ ZOOMEN NULSTILLES. --ph-bhero-zoom:1.12 findes udelukkende for at flytte
   tyngdepunktet ned i Power House' hero-VIDEO, hvor loftet fyldte for meget.
   Studios hero er et andet motiv og skal ikke arve den beskæring. Det var
   byggeklodsens ene indbyggede antagelse — den er nu overstyrbar i stedet for
   kopieret ind i to sider. */
/* ⚠️ X ER 15%, IKKE 50% — OG DET ER KUN MOBIL DER MÆRKER DET.
   Billedet er 16:9 som heroen, så den vandrette beskæring er 1% ved 1366 og
   X-værdien flytter dér under 5px. Men ved 375 er heroen næsten kvadratisk,
   så cover viser kun 58,6% af bredden — og motivets ansigt ligger i venstre
   sjettedel. Ved 50% starter vinduet 20,7% inde og skærer hovedet HELT af, så
   heroen bliver en hovedløs torso; ved 15% starter det 6,2% inde, og ansigtet
   har luft uden at rækken af reformere i dybden går tabt. Målt på de faktiske
   pixels, ikke vurderet: object-position afbilder som X × (1 − synlig andel),
   ikke som X − andel/2. Regner man med det sidste, rammer man forbi. */
/* ⚠️ `object-position` ER 50% 50% IGEN — ændret 7. august 2026 sammen med at
   heroen blev video. De gamle 15% hørte til stillbilledet
   `ps-hero-midlertidig.webp`, hvor mobilens næsten kvadratiske hero kun viste
   58,6% af bredden og et centreret udsnit skar motivets hoved af. Den nye fil
   er croppet til sit bånd ved encoding, motivet ligger vandret centreret, og
   en 15%-forskydning ville nu trække udsnittet væk fra midten uden grund.

   ⚠️ `--ph-bhero-zoom:1` bliver stående. "Zoom" er allerede leveret af
   croppet — vi viser 37,5% af kildens højde i fuld bredde. En transform-zoom
   oveni ville kun beskære båndet yderligere, og båndet er valgt ved måling. */
.ps-hero .ph-bhero__img,
.ps-hero .ph-bhero__video{ --ph-bhero-zoom:1; object-position:50% 50%; }

/* 11.1 WORDMARK — Lærkes serif-mærke, 184px bredt @1366 (x66..249, y66..99).
   Filen er 4,987:1, så højden følger af bredden. */
.ps-wordmark{ display:block; }
.ps-wordmark img{ width:184px; height:auto; display:block; }
/* ⚠️ STUDIO HAR SIN EGEN INDRYKNING. Power House' hero sætter logoet på
   x47/y42 efter hendes House-mockup; Studios wordmark står på x66/y66 i
   hendes Studio-mockup. Det er håndsat pr. side hos Lærke, ikke et fælles
   grid — se noten i CLAUDE.md om at hendes indholdsbredder svinger 79px.

   ⛔ MEN VENSTREKANTEN ER NU 28px LIGESOM ALLE ANDRE SIDER (7. august 2026).
   Burgeren skal sidde ens på alle sider og ikke flytte sig når menuen åbnes,
   og menuen er FÆLLES for begge brands — dens burger står på x28 uanset
   hvilket brand man kom fra. Blev de 66 stående, ville burgeren hoppe 38px
   på netop Studio-siderne. De 66 gælder derfor stadig top/højre/bund, hvor
   de er hendes komposition, men ikke venstre, hvor de er navigation. */
.ps-hero .ph-bhero__top{ padding:66px 66px 66px var(--ph-hoved-x); }

/* 11.2 OFFWHITE-BÅND — 146px, centreret serif-linje + to piller.
   ⚠️ GENBRUGER .ph-ctaband. Power House' udgave er en RÆKKE (pille til venstre,
   udsagn til højre); Studios er en SØJLE (linje over to piller). Det er den
   eneste strukturelle forskel, og den koster én flex-direction. */
.ph-ctaband--studio{ background:var(--ps-lys); }
.ph-ctaband--studio .ph-ctaband__inner{
  flex-direction:column; gap:22px;        /* målt: tekstbund y820 → pilletop y842 */
  min-height:146px; padding:26px 0 31px;  /* målt: 768→798 ink, pillebund 878→913 */
}
/* 23px ink @1366 målt i mockuppen. Byens navne står i kursiv hos Lærke. */
.ps-linje{
  font-family:var(--ps-font); font-weight:400; font-size:26px; line-height:1.15;
  color:var(--ps-ink); text-align:center; margin:0;
}
.ps-linje em{ font-style:italic; }
.ps-piller{ display:flex; gap:13px; flex-wrap:wrap; justify-content:center; }

/* Power Studios egne profiler — mellem knapperne og niveauerne (Lærke,
   7. august 2026). Ligger på det OFFWHITE bånd, hvilket er hele grunden til at
   de eksisterende ikoner kan genbruges: de er nøglet som ÉN mørk farve
   (#1B2628) med gennemsigtige udstansninger, altså lavet til en lys flade.
   På terrakotta eller navy ville de være nærmest usynlige. */
.ps-social{
  display:flex; align-items:center; justify-content:center;
  gap:clamp(14px, 2vw, 26px); margin-top:14px; flex-wrap:wrap;
}
.ps-social__punkt{
  display:inline-flex; align-items:center; gap:8px;
  font-size:14px; letter-spacing:0.04em; text-transform:uppercase;
  color:var(--ps-ink); text-decoration:none;
}
.ps-social__punkt img{ width:22px; height:22px; display:block; }
/* Alle tre ER rigtige <a> siden 11. august 2026, og understregningen bærer
   affordancen — samme begrundelse som centerkortenes by-profiler: understreget
   fra START, ikke først ved hover, fordi hover ikke findes på touch.
   ⛔ Stregen bliver: Lærke afgjorde 11. august 2026 at sitets understregninger
   beholdes. Fjern den ikke — den er den ENESTE markering, jf. målingen af at
   intet link på sitet bruger farve (kontrast 1,00 mod omgivende tekst). */
a.ps-social__punkt{ text-decoration:underline; text-underline-offset:3px; }
a.ps-social__punkt:hover{ text-decoration-thickness:2px; }
a.ps-social__punkt:focus-visible{ outline:3px solid var(--ps-ink); outline-offset:3px; border-radius:4px; }

/* ⚠️ AFVENTER-TILSTANDEN ER FJERNET 10. august 2026, ikke glemt.
   `.ps-social--afventer` og `.ps-social__note` dæmpede de klikbare-udseende
   pladsholdere og satte et "Adresser afventer"-mærkat på dem. Med TikTok som
   rigtigt link findes der ingen pladsholder mere, og reglerne havde nul
   brugere — samme oprydning som `.ph-subhero` 7. august. Skal en kommende
   profil stå som pladsholder igen, er mønsteret i git. */
/* Begge piller er målt til 130×37 — samme mål som Power House' CTA-knap. */
.ps-pille{
  display:inline-flex; align-items:center; justify-content:center;
  min-width:130px; min-height:37px; padding:8px 17px;
  border-radius:var(--ph-radius-pill); border:none;
  font-size:14px; letter-spacing:0.04em; text-transform:uppercase;
  transition:transform .2s ease, box-shadow .2s ease, background-color .2s ease;
}
.ps-pille--moerk{ background:var(--ps-ink); color:#fff; }
.ps-pille--terra{ background:var(--ps-terra); color:#fff; }
.ps-pille:hover{ transform:translateY(-1px); box-shadow:0 8px 22px rgba(0,0,0,0.18); }
.ps-pille:focus-visible{ outline:3px solid var(--ps-ink); outline-offset:3px; }

/* 11.3 TERRAKOTTA-BÅND MED TEKSTKORT — 244px, kort 268×203, gap 35.

   ⚠️ DETTE ER IKKE EN .ph-ctaband, OG DET VAR DEN VIGTIGSTE ERKENDELSE VED AT
   BYGGE SIDEN. Et CTA-bånd er én pille plus ét udsagn. Det her er en VANDRET
   SCROLLER med fire tekstkort og en rund pileknap — altså strukturelt
   fotostriben, ikke CTA-båndet. Havde vi tvunget den ind i .ph-ctaband, skulle
   den have haft scroll, snap, målt spring og pilelogik lagt oveni en blok der
   ikke har nogen af delene.
   Den genbruger derfor stribe-MEKANIKKEN (data-ph-stribe i js/main.js) og har
   sit eget udseende. */
.ps-kortbaand{
  background:var(--ps-terra);
  padding:22px 0 19px;                  /* målt: bånd y914, kort y936..1138, bånd slut y1157 */
  display:flex; align-items:center; gap:20px;
  padding-right:var(--ph-gutter);
  position:relative;
}
.ps-kortbaand__port{
  flex:1 1 auto; min-width:0;
  overflow-x:auto; overflow-y:hidden;
  scroll-snap-type:x proximity;
  scroll-padding-left:clamp(12px, 1.61vw, 22px);
  scrollbar-width:none; -ms-overflow-style:none;
}
.ps-kortbaand__port::-webkit-scrollbar{ display:none; }
.ps-kortbaand__port:focus-visible{
  outline:3px solid var(--ps-ink); outline-offset:3px; border-radius:4px;
}
/* ⛔ `margin-inline:auto` CENTRERER KUN NÅR DER ER PLADS — og det er hele
   pointen (Lærke, 7. august 2026: "niveauerne skal centreres midt på skærmen,
   ikke venstrestilles. Er skærmen for smal, skal der kunne swipes").
   Med `width:max-content` gør auto-margener præcis det: er rækken smallere end
   porten, deles overskuddet ligeligt; er den bredere, kollapser de til 0 og
   rækken scroller fra sin egen start.

   ⛔ BRUG IKKE `justify-content:center` PÅ EN SCROLL-CONTAINER. Når indholdet
   er bredere end porten, lægger den overskuddet ligeligt i BEGGE ender — også
   den negative side — og så bliver de første kort uopnåelige, fordi man ikke
   kan scrolle til negativ offset. Auto-margener har ikke det problem.

   ⚠️ Paddingen skal være SYMMETRISK, ellers er "centreret" 22px forskudt. Den
   venstre er samtidig scroll-snap-kantens (se __port), så de to skal følges ad. */
.ps-kortbaand__row{
  display:flex; gap:clamp(14px, 2.56vw, 35px); list-style:none;
  width:max-content; margin-inline:auto;
  padding-right:clamp(12px, 1.61vw, 22px);
  padding-left:clamp(12px, 1.61vw, 22px);
}
.ps-kort{
  flex:0 0 auto; scroll-snap-align:start;
  width:clamp(228px, 19.62vw, 294px);   /* 268/1366 = 19,62% */
  min-height:clamp(180px, 14.86vw, 223px);
  background:var(--ps-lys); border-radius:26px;   /* radius målt til ~26px */
  padding:25px 18px 18px;               /* målt: korttop→overskrift-ink 28px, 18px i siderne */
  display:flex; flex-direction:column; gap:12px;
}
/* 12px ink målt på "NIVEAU 1". Versaler med tracking, serif. */
.ps-kort__titel{
  font-family:var(--ps-font); font-weight:400; font-size:17px; line-height:1;
  text-transform:uppercase; letter-spacing:0.06em;
  color:var(--ps-ink); margin:0;
}
/* ⚠️ 13,5px/19px ER MÅLT, IKKE VALGT. Lærkes brødtekst i kortet fylder
   y1000..1114 = 115px på 6 linjer, altså 19px linjeafstand. Med 14,5px/1,5
   (21,75px) blev kortet 231px højt mod mockuppens 203, og hele terrakotta-
   båndet 272 mod 244 — placeholder-serifen sætter bredere end hendes, samme
   fund som ved Jobs-kortene. Sæt linjeafstanden i px, ikke som faktor, så den
   overlever et fontskifte. */
.ps-kort__tekst{
  font-size:13.5px; line-height:19px; color:var(--ps-ink); margin:0;
}
/* Rund pileknap, målt 39×40 @x1258. Hvid kontur på terrakotta. */
.ps-kortbaand__next, .ps-kortbaand__prev{
  flex:0 0 auto; width:40px; height:40px; border-radius:50%;
  border:1.5px solid #fff; background:none; color:#fff;
  display:grid; place-items:center; font-size:17px; line-height:1;
  transition:background-color .2s ease, color .2s ease, transform .2s ease;
}
.ps-kortbaand__next:hover, .ps-kortbaand__prev:hover{
  background:#fff; color:var(--ps-terra); transform:scale(1.06);
}
/* Samme overlay-greb som fotostribens tilbage-pil — se .ph-fac__prev. */
.ps-kortbaand__prev{
  position:absolute; z-index:2; left:clamp(12px, 1.61vw, 22px); top:50%;
  transform:translateY(-50%);
  background:var(--ps-terra);
  box-shadow:0 2px 10px rgba(0,0,0,0.25);
}
.ps-kortbaand__prev:hover{ transform:translateY(-50%) scale(1.06); }

/* 11.4 FOTOSTRIBE — genbruger .ph-fac, men i Studios mål.
   ⚠️ Lærkes stribe er 259×145 LIGGENDE og går KANT TIL KANT (målt x0..1365),
   mod Power House' 151×247 stående med 21px indrykning. Og den har INGEN pil.
   Det er de tre eneste forskelle — mekanikken er identisk. */
.ph-fac--studio{ padding:25px 0 0; padding-right:0; gap:0; }
.ph-fac--studio .ph-fac__row{ gap:clamp(8px, 1.32vw, 18px); padding-left:0; }
.ph-fac--studio .ph-fac__viewport{ scroll-padding-left:0; }
.ph-fac--studio .ph-fac__item figure{
  width:clamp(150px, 18.96vw, 284px);    /* 259/1366 */
  height:clamp(84px, 10.61vw, 159px);    /* 145/1366 */
  border-radius:0;
}
/* Studios stribe har ingen labels i designet — kun fotos. */
.ph-fac--studio .ph-fac__item figcaption{ display:none; }

@media (max-width:900px){
  .ps-kortbaand{ padding-right:0; gap:0; }
  .ps-kortbaand__next, .ps-kortbaand__prev{ display:none; }
  .ps-kortbaand__row{
    gap:14px; padding-left:var(--ph-gutter); padding-right:var(--ph-gutter);
  }
  .ps-kort{ width:calc(100vw - var(--ph-gutter) - 52px); }
  .ps-linje{ font-size:21px; }
}
@media (prefers-reduced-motion: reduce){
  .ps-pille, .ps-kortbaand__next, .ps-kortbaand__prev{ transition:none; }
  .ps-pille:hover, .ps-kortbaand__next:hover{ transform:none; }
  /* ⚠️ Ikke transform:none — den bærer centreringen. Se .ph-fac__prev. */
  .ps-kortbaand__prev:hover{ transform:translateY(-50%); }
}

/* 10.2b FACILITETSSTRIBEN PÅ MOBIL — ingen pile, kant til kant, kig til højre.
   ⛔ display:none, IKKE visibility:hidden. Pilene skal ikke bare være usynlige,
   de må ikke optage plads: en 41px knap plus 20px gap åd en hel billedbredde,
   så der kun var plads til tre felter og et stort tomt hul i højre side.
   Betjeningen er ren native swipe — JS rører ikke scrollen her, og pilenes
   handlere findes ganske vist stadig, men knapperne kan ikke nås. */
@media (max-width:900px){
  .ph-fac__next, .ph-fac__prev{ display:none; }
  /* Kant til kant: uden dette stopper scrollporten inde i containeren, og
     billederne bliver klippet af en usynlig kant i stedet for at glide ud
     over skærmkanten. */
  .ph-fac{ padding-right:0; gap:0; }
  .ph-fac__row{
    gap:12px;
    padding-left:var(--ph-gutter);
    padding-right:var(--ph-gutter);
  }
  .ph-fac__viewport{ scroll-padding-left:var(--ph-gutter); }
  /* To hele felter + et kig på det tredje. Kiggets 26px er hele affordancen på
     touch, hvor der hverken er pil eller scrollbar at se: uden det ser striben
     ud som en afsluttet række på to billeder.
     Bredden er derfor REGNET, ikke sat: gutter + felt + gap + felt + kig = 100vw.
     Højden følger stribens 151:247 (= 1,636), så formatet er mockuppens. */
  /* ⛔ TRE FELTER PR. SKÆRM, IKKE TO (Lærke, 11. august 2026). Billedet skulle
     ned til ~2/3, og den rigtige måde er at ændre HVOR MANGE der er plads til —
     ikke at sætte en mindre bredde og lade resten af ligningen skride.

     Kigget er hele affordancen på touch: der er hverken pil eller scrollbar at
     se, så uden et glimt af næste felt ligner striben en afsluttet række. Det
     skal derfor blive på 26px, og bredden regnes ud fra dét:

         gutter + 3 × felt + 3 × gap + kig = 100vw

     ⚠️ TRE mellemrum, ikke to. Der er ét efter hvert af de tre felter — også
     mellem det tredje og kigget. Med to i ligningen landede kigget på 14px i
     stedet for 26, altså næsten halveret, og det er netop dét tal der ER
     affordancen. Fanget ved at måle kigget efter ændringen, ikke ved at læse
     formlen igennem.

     Ved 375px giver det felt = (375 − 24 − 36 − 26) / 3 = 96,3px, altså
     0,615 af de tidligere 156,6 — lidt under de ønskede 2/3, fordi kigget
     er holdt fast på sine 26px. Kigget vejer tungere end den sidste
     procentdel af nedskaleringen.
     ⚠️ Sætter man i stedet bredden til 2/3 og lader "to felter"-ligningen stå,
     bliver kigget 130px — altså et tredje felt der er næsten helt synligt, og
     så er det ikke længere et kig. Regn ligningen om, rør ikke kun bredden.
     ⚠️ figcaption BLIVER på 11px og skaleres IKKE med. Ved 2/3 ville den blive
     7,3px, hvilket er ulæseligt. Den fylder nu 47 af feltets 164px = 28,7%
     mod 18,4% før; det er tættere, men labelen er stadig hele feltets mening. */
  .ph-fac__item figure{
    --ph-fac-kig:26px;
    --ph-fac-gap:12px;
    --ph-fac-felt:calc((100vw - var(--ph-gutter) - 3 * var(--ph-fac-gap) - var(--ph-fac-kig)) / 3);
    width:var(--ph-fac-felt);
    height:calc(var(--ph-fac-felt) * 1.636);
  }
}
/* ⛔ UNDER 360px ER TRE FELTER FOR MANGE. Målt ved 320: tre felter giver 82px
   brede billeder, og da figcaption beholder sin faste 11px skrift og sin
   24/10/10-padding, æder labelen 54,4% af feltet — altså mere end halvdelen af
   billedet. Ved to felter er den 23,4%.
   ⚠️ Det er samme klasse som mellembredde-fælden, bare i den anden ende: en
   formel udledt ved 375 fortsætter bare med at regne ved 320. */
@media (max-width:359px){
  .ph-fac__item figure{
    --ph-fac-felt:calc((100vw - var(--ph-gutter) - 2 * var(--ph-fac-gap) - var(--ph-fac-kig)) / 2);
  }
}
@media (max-width:860px){
  /* ⚠️ Venstre er --ph-hoved-x, ikke gutteren: burgeren hører til navigationen
     og skal flugte med menuens, ikke med sidens indholdskant. */
  .ph-bhero__top{ padding:22px var(--ph-gutter) 22px var(--ph-hoved-x); }
  .ph-bhero__top .ph-logo img{ height:46px; }
  .ph-ctaband__inner{ gap:18px; text-align:center; flex-direction:column; }
  .ph-ctaband__tekst{ font-size:16px; line-height:24px; }
}
@media (max-width:640px){
  .ph-centres__grid{ grid-template-columns:1fr; }
}

/* ============================================================
   12. HOLD PLAN — Power Studios skemaside
   Bygget efter holdplan-udkast.html i Studios formsprog.

   ⛔ NAVNERUM: alt herunder er ps-*, ikke generiske navne.
   Udkastet brugte .card, .chip, .day, .book — navne der ville
   kollidere med hvad som helst der senere kom ind på sitet, og
   som ikke røber hvilket af de to brands de hører til. Samme
   grund som at --ps-* er scopet til body.ps.

   ⛔ INTET HERUNDER STYLER DATA. Skemaet tegnes af
   js/holdplan.js; CSS'en kender kun klasserne, aldrig et
   holdnavn eller et klokkeslæt.
   ============================================================ */

/* 12.1 LAV HERO — 380px mod brandsidernes 768.
   Hold plan er en brugsside: man kommer for at finde et tidspunkt. Med
   Lærkes 16:9-hero ville skemaet starte under folden på enhver bærbar.
   Højden sættes gennem --ph-bhero-h, så formlen ikke kopieres. */
.ps-hero--lav{ --ph-bhero-h:clamp(220px, 27.8vw, 380px); }
/* Wordmarkets 66px indrykning er sat efter en 768px hero. I en 380px hero
   bliver den for tung, og på mobil æder den halvdelen af højden.
   ⚠️ Venstre er fast 28px som alle andre sider — se noten ved .ps-hero
   ovenfor. Kun den lodrette luft må skalere med heroens højde. */
.ps-hero--lav .ph-bhero__top{ padding:clamp(20px, 3.2vw, 44px); padding-left:var(--ph-hoved-x); }

/* 12.2 INTRO — genbruger .ph-ctaband--studio; her med h1 og underlinje. */
.ps-intro .ph-ctaband__inner{ gap:14px; padding:34px 0 30px; }
.ps-intro__titel{ font-size:clamp(26px, 3.1vw, 42px); line-height:1.06; }
/* ⏳ UBRUGT SIDEN 7. august 2026 — underlinjen "Book din plads på reformeren…"
   er fjernet fra holdplan.html på Lærkes anmodning. Reglen bliver stående,
   fordi elementet kan sættes tilbage med én linje markup, og fordi den er den
   eneste definition af en underrubrik i Studios formsprog. Slet den, hvis der
   er gået et halvt år uden at nogen har savnet den. */
.ps-intro__under{
  margin:0 auto; max-width:46ch; text-align:center;
  font-size:15px; line-height:1.55; color:var(--ph-muted);
}
.ps-intro .ps-piller{ margin-top:8px; }

/* 12.3 VÆLGERE — center og holdtype. Begge rækker udledes af data i
   js/holdplan.js; derfor ingen min-height, som ville efterlade et hul når en
   holdtype forsvinder fra BRP.

   ⏳ CENTERVÆLGEREN ER FORELØBIG. Lærkes design har ingen — den blev først
   nødvendig da BRP viste reformer-hold i fire centre. Den låner filter-
   chippens formsprog frem for at være en ny komponent, netop så den kan
   tegnes om uden at røre andet. TODO(ps-centervaelger). */
.ps-vaelgere{
  display:flex; flex-direction:column; gap:12px;
  padding:26px 0 4px;
}
/* Labelen står til venstre for sin række og har fast bredde, så de to
   rækkers knapper flugter lodret i stedet for at forskyde hinanden. */
.ps-vaelg{ display:flex; align-items:baseline; gap:14px; flex-wrap:wrap; }
.ps-vaelg__navn{
  flex:0 0 auto; min-width:78px;
  font-size:11px; letter-spacing:0.16em; text-transform:uppercase;
  color:var(--ph-muted);
}
.ps-filtre{
  display:flex; gap:9px; flex-wrap:wrap;
  flex:1 1 auto; min-width:0;
}
.ps-chip{
  border:1px solid rgba(25,28,26,0.16); border-radius:var(--ph-radius-pill);
  background:none; color:var(--ps-ink);
  padding:8px 19px; font-size:13.5px; line-height:1.2; cursor:pointer;
  transition:background-color .2s ease, border-color .2s ease, color .2s ease;
}
.ps-chip:hover{ border-color:var(--ps-ink); }
/* aria-pressed ER tilstanden — ikke en klasse. Så kan markup og
   tilgængelighedstræ ikke komme ud af trit, og JS sætter kun ét attribut. */
.ps-chip[aria-pressed="true"]{
  background:var(--ps-ink); border-color:var(--ps-ink); color:var(--ps-lys);
}
.ps-chip:focus-visible{ outline:3px solid var(--ps-ink); outline-offset:3px; }

/* 12.4 UGESTRIMLEN — sidens signatur.
   Terrakotta-bånd med syv dagskort der scroller vandret. Hvert kort bærer en
   måler over dagens belægning, så presset kan aflæses FØR man vælger.

   ⚠️ Den genbruger stribe-mekanikken via data-ph-stribe (js/main.js) — ingen
   ny scroller. Opbygningen er bevidst identisk med .ps-kortbaand.
   ⛔ position:relative er IKKE valgfri: tilbage-pilen er et overlay, og uden
   en positioneret forfader falder den tilbage på viewporten, så top:50% bliver
   "midt på skærmen". Den fejl kostede en fejlfindingsrunde 28. juli 2026. */
.ps-uge{
  background:var(--ps-terra);
  padding:24px 0;
  display:flex; align-items:center; gap:20px;
  padding-right:var(--ph-gutter);
  position:relative;
  margin-top:26px;
}
.ps-uge__port{
  flex:1 1 auto; min-width:0;
  overflow-x:auto; overflow-y:hidden;
  scroll-snap-type:x proximity;
  scroll-padding-left:clamp(12px, 1.61vw, 22px);
  scrollbar-width:none; -ms-overflow-style:none;
}
.ps-uge__port::-webkit-scrollbar{ display:none; }
.ps-uge__port:focus-visible{
  outline:3px solid #fff; outline-offset:3px; border-radius:4px;
}
.ps-uge__row{
  display:flex; gap:clamp(10px, 1.03vw, 14px);
  width:max-content; padding-left:clamp(12px, 1.61vw, 22px); padding-block:2px;
}
.ps-dag{
  flex:0 0 auto; scroll-snap-align:start;
  width:clamp(138px, 11.13vw, 168px);
  background:#fff; border:none; border-radius:16px;
  padding:15px 17px 14px; text-align:left; color:var(--ps-ink); cursor:pointer;
  display:flex; flex-direction:column;
  transition:transform .25s ease, background-color .2s ease, color .2s ease;
}
.ps-dag:hover{ transform:translateY(-3px); }
.ps-dag[aria-pressed="true"]{ background:var(--ps-ink); color:var(--ps-lys); }
.ps-dag:focus-visible{ outline:3px solid #fff; outline-offset:3px; }
.ps-dag__ugedag{
  font-size:10.5px; letter-spacing:0.16em; text-transform:uppercase; opacity:.62;
}
.ps-dag__dato{
  font-family:var(--ps-font); font-weight:400; font-size:26px; line-height:1; margin-top:4px;
}
/* MÅLEREN. Sporet arver tekstfarven, så det virker i begge tilstande uden en
   egen farveregel; kun fyldet skifter. */
.ps-dag__maaler{
  display:block; height:3px; border-radius:2px;
  background:currentColor; opacity:.18; margin-top:13px; overflow:hidden;
}
.ps-dag__fyld{ display:block; height:100%; border-radius:2px; background:var(--ps-terra); }
/* På det mørke kort ville terrakotta mod nærsort være for svag en forskel. */
.ps-dag[aria-pressed="true"] .ps-dag__fyld{ background:var(--ps-lys); }
.ps-dag__tal{ font-size:11.5px; margin-top:8px; opacity:.62; }

.ps-uge__next, .ps-uge__prev{
  flex:0 0 auto; width:40px; height:40px; border-radius:50%;
  border:1.5px solid #fff; background:none; color:#fff; cursor:pointer;
  display:grid; place-items:center; font-size:17px; line-height:1;
  transition:background-color .2s ease, color .2s ease, transform .2s ease;
}
.ps-uge__next:hover, .ps-uge__prev:hover{
  background:#fff; color:var(--ps-terra); transform:scale(1.06);
}
.ps-uge__next:focus-visible, .ps-uge__prev:focus-visible{
  outline:3px solid #fff; outline-offset:3px;
}
.ps-uge__prev{
  position:absolute; z-index:2; left:clamp(12px, 1.61vw, 22px); top:50%;
  transform:translateY(-50%);
  background:var(--ps-terra); box-shadow:0 2px 10px rgba(0,0,0,0.25);
}
.ps-uge__prev:hover{ transform:translateY(-50%) scale(1.06); }

/* 12.5 SKEMA */
.ps-skema{ padding:34px 0 64px; }

/* ⏳ UBRUGT SIDEN 7. august 2026 — elementet er fjernet fra holdplan.html på
   Lærkes anmodning. ⚠️ GENHENTNINGEN KØRER STADIG; det er kun visningen der er
   væk, og js/holdplan.js opdaterer fortsat `sidstHentet` og `fejlIRaek`.
   Reglerne bliver derfor stående: linjen kan tændes igen med ét element, og
   både "gammel"-tilstanden og dens prik virker fra dag ét.

   Friskheds-linjen: "Opdateret 14:32". Diskret, men ikke skjult — den er det
   der gør "1 plads tilbage" til et ærligt udsagn frem for et absolut løfte.
   Tom indtil første hentning er i hus, derfor ingen min-height. */
.ps-friskhed{
  margin:0 0 14px; font-size:11.5px; letter-spacing:0.04em;
  color:var(--ph-muted); text-align:right;
}
/* ⚠️ FARVE ER IKKE ENESTE SIGNAL. Teksten skifter selv fra "Opdateret 14:32"
   til "Kunne ikke opdatere · tal fra 14:32", så beskeden står der også for
   den der ikke ser terrakottaen. Prikken er en tilføjelse, ikke bæreren. */
.ps-friskhed--gammel{ color:var(--ps-terra); }
.ps-friskhed--gammel::before{
  content:''; display:inline-block; width:6px; height:6px; border-radius:50%;
  background:currentColor; margin-right:7px; vertical-align:1px;
}
/* Dagens tre dele. Streg over, ikke under — så den sidste del ikke får en
   løs linje hængende under sig i bunden af listen. */
.ps-del{
  font-family:var(--ps-font); font-weight:400; font-size:14px; letter-spacing:0.18em;
  text-transform:uppercase; color:var(--ph-muted); margin:0;
  padding:24px 0 12px; border-top:1px solid rgba(25,28,26,0.14);
}
.ps-del:first-child{ border-top:0; padding-top:0; }

.ps-hold{
  background:#fff; border-radius:18px; padding:18px 22px; margin-bottom:10px;
  display:grid; grid-template-columns:86px 1fr auto auto; gap:20px;
  align-items:center;
  transition:transform .22s ease, box-shadow .22s ease;
}
.ps-hold:hover{ transform:translateY(-2px); box-shadow:0 10px 26px rgba(0,0,0,0.08); }
.ps-hold__tid{ font-family:var(--ps-font); font-weight:400; font-size:23px; line-height:1; }
.ps-hold__tid span{
  display:block; font-family:var(--ph-font-body); font-size:10.5px;
  letter-spacing:0.13em; color:var(--ph-muted); margin-top:6px;
}
.ps-hold__navn{
  font-family:var(--ps-font); font-weight:400; font-size:21px; line-height:1.1; margin:0;
  font-weight:400;
}
.ps-hold__meta{ font-size:13.5px; color:var(--ph-muted); margin:5px 0 0; }
.ps-hold__pladser{
  text-align:right; font-size:12.5px; color:var(--ph-muted);
  white-space:nowrap; line-height:1.3;
}
.ps-hold__pladser b{
  display:block; font-family:var(--ps-font); font-weight:400;
  font-size:20px; color:var(--ps-ink);
}
/* ⚠️ FARVE ER IKKE ENESTE SIGNAL. "2 pladser tilbage" står der i forvejen som
   tekst; terrakottaen fremhæver den, men bærer den ikke. En bruger der ikke
   ser farveforskellen mister derfor ingen oplysning. */
.ps-hold__pladser--faa b{ color:var(--ps-terra); }

.ps-book{
  background:var(--ps-terra); color:#fff; border-radius:var(--ph-radius-pill);
  padding:11px 25px; font-size:12.5px; letter-spacing:0.1em;
  text-transform:uppercase; white-space:nowrap; text-align:center;
  transition:transform .2s ease, box-shadow .2s ease;
}
.ps-book:hover{ transform:translateY(-1px); box-shadow:0 8px 22px rgba(0,0,0,0.18); }
.ps-book:focus-visible{ outline:3px solid var(--ps-ink); outline-offset:3px; }

/* Fuldt booket: kortet træder tilbage, men forsvinder ikke — tidspunktet er
   stadig en oplysning, og ventelisten er stadig en vej. */
.ps-hold--fuldt{ background:rgba(25,28,26,0.05); }
.ps-hold--fuldt .ps-hold__navn,
.ps-hold--fuldt .ps-hold__tid,
.ps-hold--fuldt .ps-hold__pladser b{ color:var(--ph-muted); }
.ps-book--vente{
  background:transparent; border:1px solid rgba(25,28,26,0.22); color:var(--ps-ink);
}
/* ⛔ BOOKING LUKKET ER IKKE ET LINK — det er et <span> fra JS'en.
   Er bookableLatest passeret, kan holdet ikke bookes, og så skal der ikke
   være noget at klikke på. Derfor ingen hover og ingen pegefinger: en knap
   der ser klikbar ud men ikke fører nogen steder, er et løfte der brydes. */
.ps-book--lukket{
  background:transparent; border:1px dashed rgba(25,28,26,0.28);
  color:var(--ph-muted); cursor:default;
}
.ps-book--lukket:hover{ transform:none; box-shadow:none; }

.ps-tom{
  font-size:15px; color:var(--ph-muted); margin:0; padding:18px 0 40px;
}
/* En fejlet hentning skal skille sig ud fra "ingen hold i dag" — det er to
   vidt forskellige beskeder, og de må ikke ligne hinanden. */
.ps-tom--fejl{
  color:var(--ps-ink); border-left:3px solid var(--ps-terra);
  padding-left:14px; margin:8px 0 24px;
}
.ps-noscript{ padding:26px var(--ph-gutter); text-align:center; }
.ps-noscript a{ color:var(--ps-ink); text-decoration:underline; }

@media (max-width:900px){
  /* Samme greb som stribens: pilene må ikke bare skjules, de må ikke fylde. */
  .ps-uge{ padding-right:0; gap:0; }
  .ps-uge__next, .ps-uge__prev{ display:none; }
  .ps-uge__row{
    padding-left:var(--ph-gutter); padding-right:var(--ph-gutter);
  }
}
@media (max-width:820px){
  /* Knappen får sin egen række, og pladsantallet flytter op under navnet —
     ellers klemmes fire kolonner sammen til ulæselighed. */
  .ps-hold{ grid-template-columns:68px 1fr; gap:10px 14px; padding:16px 18px; }
  .ps-hold__pladser{ grid-column:2; text-align:left; margin-top:2px; }
  .ps-hold__pladser b{ display:inline; font-size:15px; margin-right:5px; }
  .ps-book{ grid-column:1 / -1; padding:13px; }
  .ps-intro__titel{ font-size:26px; }
  /* Labelen over sin række i stedet for ved siden af: med to chip-rækker og
     en 78px label bliver der ellers kun ~250px til knapperne. */
  .ps-vaelg{ flex-direction:column; align-items:stretch; gap:7px; }
  .ps-vaelg__navn{ min-width:0; }
}
@media (prefers-reduced-motion: reduce){
  .ps-dag, .ps-hold, .ps-book, .ps-chip,
  .ps-uge__next, .ps-uge__prev{ transition:none; }
  .ps-dag:hover, .ps-hold:hover, .ps-book:hover, .ps-uge__next:hover{ transform:none; }
  /* ⚠️ Ikke transform:none — den bærer centreringen. Se .ph-fac__prev. */
  .ps-uge__prev:hover{ transform:translateY(-50%); }
}

/* ============================================================
   13. LIVE ANTAL — Power House' besøgstal
   Bygget efter Lærkes LIVE antal.png (1366×1077).

   ⛔ ph-*-NAVNERUM, IKKE ps-*. Siden viser alle fem Power
   House-centre inkl. Vejle — det er fitness-produktet, ikke
   Power Studio. Derfor navy og sans, ikke terrakotta og serif.

   Siden har to spor med hver sin visning: pladsholder-tallene
   (Lærkes design) og travlheds-mønsteret fra GANTNER.
   ============================================================ */

/* 13.1 PLADSHOLDER-BANNER — en del af SIDEN, ikke en kodekommentar.
   ⛔ Tallene nedenunder er Lærkes mockup-tal, ikke målinger, og et
   screenshot af siden skal bære forbeholdet med sig. Derfor er banneret
   synligt, farvet og står FØR tallene — ikke som en fodnote under dem. */
.ph-pladsholder{
  display:flex; flex-wrap:wrap; align-items:baseline; gap:6px;
  background:#FFF4E6; border-left:4px solid #C6733F;
  padding:14px 18px; margin:0 0 26px;
  font-size:14px; line-height:1.5; color:var(--ph-black);
  border-radius:0 6px 6px 0;
}
.ph-pladsholder strong{ font-weight:700; }
.ph-pladsholder a{ color:var(--ph-black); text-decoration:underline; }
.ph-pladsholder__pil::before{ content:'·'; opacity:.5; }

/* 13.2 INDTJEKNINGERNE — mockuppens liste.
   Tidsstemplet står øverst til venstre, listen centreret under.

   ⛔ OVERSKRIFTEN OG FORKLARINGEN ER TILFØJET 8. august 2026 OG SKAL BLIVE.
   Lærkes mockup har hverken overskrift eller forklaring — kun "Sidst
   opdateret" og listen. Men bjælketitlen er nu bare "Live antal", og tallet
   er INDTJEKNINGER i et 120-minutters vindue, ikke personer i huset. Uden de
   to linjer står der fem tal på en side, der hedder "live antal", og så
   læses de som antal mennesker. Det er den mest sandsynlige fejllæsning af
   hele siden — samme slags som travlheds-sporets normalisering. */
.ph-live{ background:var(--ph-offwhite); padding:34px 0 8px; }
.ph-live__titel{
  font-family:var(--ph-font-display); font-size:24px; letter-spacing:0.02em;
  text-transform:uppercase; font-weight:700;
  margin:0 0 10px; color:var(--ph-black);
}
.ph-live__forklaring{
  margin:0 0 24px; max-width:62ch;
  font-size:16px; line-height:24px; color:var(--ph-black);
}
.ph-live__fejl{ margin:0; font-size:16px; line-height:24px; color:var(--ph-muted); }
.ph-live__fejl a{ color:var(--ph-black); }
.ph-live__opdateret{
  margin:0 0 30px; font-size:15px; line-height:1.35; color:var(--ph-muted);
}
.ph-live__opdateret span{ color:var(--ph-black); }

/* Mockuppens rækker fylder ikke den fulde bredde: de står i en smallere
   midterspalte (x292..1075 af 1366 = 57,3%). */
.ph-live__liste{
  width:min(57.3%, 784px); margin:0 auto; max-width:100%;
}
.ph-live__row{
  display:flex; align-items:baseline; justify-content:space-between; gap:18px;
  padding:9px 0 7px; border-bottom:1px solid rgba(25,28,26,0.35);
}
.ph-live__navn{
  font-size:18px; letter-spacing:0.01em; text-transform:uppercase;
  color:var(--ph-black);
}
/* ⚠️ Tallet er tabular, så cifrene står i kolonne fra række til række.
   Uden det ville "86" og "166" få decimalpladserne til at danse. */
.ph-live__tal{
  font-size:34px; line-height:1; color:var(--ph-black);
  font-variant-numeric:tabular-nums;
}
/* ⛔ DEN STIPLEDE PLADSHOLDER-UNDERSTREGNING ER FJERNET 8. august 2026.
   `[data-la-pladsholder] .ph-live__tal` markerede tallene som ikke-målinger.
   Tallene ER målinger nu, JS'en sætter ikke længere attributten, og en regel
   der venter på en tilstand som ikke kan opstå, er kun til at misforstå.
   ⚠️ `.ph-pladsholder` selv bliver stående — medlemsfordele bruger banneret
   til sine 14 partnerfelter. */
.ph-live__slut{
  text-align:center; margin:38px 0 0; font-size:16px; color:var(--ph-black);
}

/* 13.3 TRAVLHED — det spor der bygger på rigtige tal. */
.ph-travl{ background:var(--ph-offwhite); padding:44px 0 60px; }
.ph-travl__titel{
  font-family:var(--ph-font-display); font-size:24px; letter-spacing:0.02em;
  text-transform:uppercase; margin:0 0 16px; color:var(--ph-black);
}
.ph-travl__forbehold{
  margin:0 0 26px; padding:0; list-style:none;
  display:grid; gap:9px;
  font-size:13.5px; line-height:1.5; color:var(--ph-muted);
  max-width:78ch;
}
.ph-travl__forbehold li{ padding-left:16px; position:relative; }
.ph-travl__forbehold li::before{
  content:''; position:absolute; left:0; top:8px;
  width:6px; height:6px; border-radius:50%; background:var(--ph-blue); opacity:.45;
}
.ph-travl__forbehold strong{ color:var(--ph-black); font-weight:600; }

.ph-travl__dage{ display:flex; gap:8px; flex-wrap:wrap; margin:0 0 28px; }
/* Genbruger chip-formsproget fra holdplanen, men i Power House' farver —
   de to brands deler mønster, ikke palet. */
.ph-chip{
  border:1px solid rgba(25,28,26,0.18); border-radius:var(--ph-radius-pill);
  background:none; color:var(--ph-black);
  padding:8px 18px; font-size:13.5px; line-height:1.2; cursor:pointer;
  transition:background-color .2s ease, border-color .2s ease, color .2s ease;
}
.ph-chip:hover{ border-color:var(--ph-blue); }
.ph-chip[aria-pressed="true"]{
  background:var(--ph-blue); border-color:var(--ph-blue); color:#fff;
}
.ph-chip:focus-visible{ outline:3px solid var(--ph-black); outline-offset:3px; }

.ph-travl__center{ margin:0 0 26px; }
.ph-travl__hoved{
  display:flex; align-items:baseline; justify-content:space-between;
  gap:14px; flex-wrap:wrap; margin:0 0 8px;
}
.ph-travl__navn{ font-size:16px; color:var(--ph-black); }
.ph-travl__spids{ font-size:12.5px; color:var(--ph-muted); }

/* Søjlerne. Højden sættes af --h, som JS regner som andel af CENTRETS
   eget uge-maks — se noten i js/live-antal.js om hvorfor nævneren ikke
   er dagens maks og ikke en fælles akse. */
.ph-travl__bars{
  display:grid; grid-auto-flow:column; grid-auto-columns:1fr;
  align-items:end; gap:3px; height:74px;
}
.ph-travl__bar{
  height:var(--h); min-height:2px;
  background:var(--ph-blue); border-radius:2px 2px 0 0; opacity:.72;
  transition:opacity .15s ease;
}
.ph-travl__bar:hover{ opacity:1; }
/* Timer uden indgange: en tynd grundlinje, så aksen ikke får huller. */
.ph-travl__bar--lukket{ background:rgba(25,28,26,0.16); opacity:1; }
/* ⚠️ DEN NUVÆRENDE TIME ER MARKERET MED FARVE **OG** KONTUR. Farve alene
   ville forsvinde for den der ikke skelner blå fra terrakotta, og markeringen
   er hele svaret på "er der frit lige nu". */
.ph-travl__bar--nu{
  background:#C6733F; opacity:1;
  box-shadow:0 0 0 2px rgba(25,28,26,0.55);
}
.ph-travl__akse{
  display:grid; grid-auto-flow:column; grid-auto-columns:1fr; gap:3px;
  margin-top:5px; font-size:10px; color:var(--ph-muted); text-align:center;
}
.ph-travl__kilde{
  margin:26px 0 0; font-size:12px; color:var(--ph-muted);
}
.ph-travl__fejl{ font-size:15px; color:var(--ph-black); }

@media (max-width:860px){
  .ph-live__liste{ width:100%; }
  .ph-live__navn{ font-size:15px; }
  .ph-live__tal{ font-size:27px; }
  .ph-travl__bars{ height:58px; gap:2px; }
  .ph-travl__akse{ gap:2px; font-size:9px; }
  .ph-travl__hoved{ gap:4px; }
}
@media (prefers-reduced-motion: reduce){
  .ph-chip, .ph-travl__bar{ transition:none; }
}

/* ============================================================
   14. PERSONLIGE TRÆNERE OG BEHANDLERE
   Bygget efter Lærkes "Personlige trænere og behandlere.png"
   (1366×1162) som undersidetype A.

   ⛔ DESIGNET SKELNER MELLEM DE TO GRUPPER, OG DET SKAL
   STRUKTUREN OGSÅ. Siden blandede dem før i ét gitter med en
   rolle-linje som eneste forskel. Trænere er høje portrætkort i
   en vandret scroller; behandlere er seks mindre, næsten
   kvadratiske kort i én række. Det er en reel forskel for den
   besøgende: man leder efter en behandler af en anden grund end
   efter en træner.
   ============================================================ */
.ph-folk{ background:var(--ph-offwhite); }
.ph-folk__sek{ position:relative; padding:34px 0 10px; }
/* ⛔ position:relative er IKKE valgfri — tilbage-pilen er et overlay, og uden
   en positioneret forfader falder den tilbage på viewporten, så top:50% bliver
   "midt på skærmen". Samme fælde som .ph-fac og .ps-uge. */
/* ⚠️ OVERSKRIFTERNE ER EN TILFØJELSE TIL LÆRKES DESIGN. Hendes mockup har
   ingen sektionsoverskrifter — forskellen mellem de to grupper ligger alene i
   kortstørrelsen. Men det er netop skellet mellem trænere og behandlere der
   er sidens pointe, og en besøgende der leder efter en behandler skal kunne
   se hvor de står. De er små og versale, så de ikke tager over. */
.ph-folk__titel{
  font-family:var(--ph-font-display); font-size:20px; letter-spacing:0.03em;
  text-transform:uppercase; color:var(--ph-black); margin:0 0 18px;
}
/* ⚠️ TITLEN FLUGTER MED SIN EGEN SEKTIONS INDHOLD, ikke med .ph-container.
   Trænerrækken starter ved gutteren og behandlergitteret ved --ph-wide; uden
   det her ville begge titler stå indrykket i forhold til deres egne kort. */
.ph-folk__sek > .ph-container{ max-width:none; }
.ph-folk__sek--be > .ph-container{ padding:0; }
.ph-folk__sek--be .ph-folk__titel{
  width:var(--ph-wide); max-width:none; margin-inline:auto;
}

/* 14.1 TRÆNER-SCROLLEREN — genbruger stribe-mekanikken via data-ph-stribe.
   Kortene er 264×418 (foto) med 24px imellem i mockuppen; fire er synlige. */
.ph-folk__port{
  overflow-x:auto; overflow-y:hidden;
  scroll-snap-type:x proximity;
  scroll-padding-left:var(--ph-gutter);
  scrollbar-width:none; -ms-overflow-style:none;
}
.ph-folk__port::-webkit-scrollbar{ display:none; }
.ph-folk__port:focus-visible{
  outline:3px solid var(--ph-black); outline-offset:-3px; border-radius:4px;
}
.ph-folk__row{
  display:flex; gap:clamp(12px, 1.76vw, 24px); list-style:none;
  width:max-content; padding:0 var(--ph-gutter);
}
.ph-folk__kort{
  flex:0 0 auto; scroll-snap-align:start;
  width:clamp(170px, 19.33vw, 290px);      /* 264/1366 */
}
/* ⚠️ KILDEBILLEDERNE ER KVADRATISKE, kortet er portræt (0,63). cover fylder
   derfor HØJDEN ud og beskærer kun VANDRET — den lodrette komposition er
   urørt, og hoveder kan ikke blive klippet af foroven. Motiverne står
   centreret i Lærkes filer, så 50% er rigtigt; skulle én person falde skævt,
   er det en enkelt object-position at sætte på netop det kort. */
.ph-folk__foto{
  display:block; width:100%;
  height:clamp(270px, 30.6vw, 459px);      /* 418/1366 */
  object-fit:cover; object-position:50% 50%;
  border-radius:4px; background:rgba(25,28,26,0.06);
}
.ph-folk__navn{
  margin:14px 0 0; font-size:15px; line-height:1.35; color:var(--ph-black);
}
/* Rollen står på samme linje som navnet i Lærkes design, men brydes frit —
   "Kristoffer Bangsgaard – Personlig træner" er for langt til én linje. */
.ph-folk__navn span{ white-space:nowrap; }
.ph-folk__rolle{ margin:2px 0 0; font-size:14px; color:var(--ph-black); }
.ph-folk__by{ margin:2px 0 0; font-size:14px; color:var(--ph-black); }
/* ✅ KONTAKTLINJEN ER NU RIGTIGE LINKS (7. august 2026). Den stod som et
   dæmpet, inaktivt <p> fordi vi ikke havde kontaktdata pr. person —
   `TODO(folk-kontakt)` er dermed lukket.

   ⚠️ DER ER HVERKEN MAILADRESSER ELLER TELEFONNUMRE. Live-siden har kun
   Instagram-handles og professionelle websites, altså offentlige faglige
   profiler. Det er værd at vide, hvis nogen senere spørger hvorfor der ikke
   er en mail-knap: den findes ikke som data.

   ⛔ RETTET 11. AUGUST 2026 — HER STOD EN PÅSTAND DER IKKE LÆNGERE ER SAND.
   Der stod: "TRE PERSONER HAR INGEN LINKS overhovedet (Nicolaj Heindorf,
   Ryan Harris, Alexander Regenberg). Deres linje er UDELADT HELT."
   Optalt i markup'en 11. august: ALLE 21 har mindst ét link. De tre navngivne
   har hver et Instagram-link. 37 links i alt — Instagram 19, Website 15,
   Klinik 2, Book tid 1 — og NUL tomme kontaktlinjer.
   ⚠️ Noten stod umiddelbart over selve reglen, altså det første en senere
   læser møder. Den slags forældede optælling er præcis dét CLAUDE.md advarer
   imod: "en optælling i denne fil er et øjebliksbillede — tæl efter før du
   planlægger efter den." Det gælder også en optælling i en CSS-kommentar.
   ⚠️ Hvis en person en dag IKKE har links, skal linjen udelades helt frem for
   at stå tom — en overskrift uden indhold ser ud som om siden er gået i
   stykker. Kortet bliver da 19px lavere, og gitteret og striben tåler det,
   fordi højden er sat af fotoet og ikke af tekstblokken. */
.ph-folk__kontakt{
  margin:6px 0 0; font-size:13px; letter-spacing:0.06em; text-transform:uppercase;
  display:flex; gap:12px; flex-wrap:wrap;
}
.ph-folk__kontakt a{
  color:var(--ph-black);
  text-decoration:underline; text-underline-offset:3px; text-decoration-thickness:1px;
}
/* Understreget FRA START, ikke først ved hover — kortene har ingen anden
   klikbar del, så der er intet der antyder at netop den linje kan trykkes,
   og hover findes ikke på touch. Samme begrundelse som centerkortenes
   by-profiler på power-house.html. */
.ph-folk__kontakt a:hover{ text-decoration-thickness:2px; }
.ph-folk__kontakt a:focus-visible{
  outline:3px solid var(--ph-black); outline-offset:3px; border-radius:3px;
}

/* Pileknapper — samme greb som fotostriben: overlay i hver side, så
   kortrækken bliver hvor mockuppen har den. */
.ph-folk__next, .ph-folk__prev{
  position:absolute; z-index:2; top:clamp(150px, 17vw, 260px);
  width:38px; height:38px; border-radius:50%;
  border:1.5px solid rgba(25,28,26,0.3); background:var(--ph-offwhite);
  color:var(--ph-black); cursor:pointer;
  display:grid; place-items:center; font-size:16px; line-height:1;
  transition:background-color .2s ease, color .2s ease, transform .2s ease;
}
.ph-folk__prev{ left:8px; }
.ph-folk__next{ right:8px; }
.ph-folk__next:hover, .ph-folk__prev:hover{
  background:var(--ph-black); color:#fff; transform:scale(1.06);
}
.ph-folk__next:focus-visible, .ph-folk__prev:focus-visible{
  outline:3px solid var(--ph-black); outline-offset:3px;
}

/* 14.2 BEHANDLER-GITTERET — seks kort i én række.
   Mockuppen: foto 199×196, 21px imellem, næsten kant til kant (x51..1350).
   ⚠️ auto-fit, ikke seks faste kolonner: kommer der en syvende behandler,
   ombryder rækken af sig selv i stedet for at klemme kortene. */
.ph-folk__sek--be{ padding-bottom:34px; }
/* ⚠️ --ph-wide, IKKE containerens 1200px. Lærkes behandlerrække går næsten
   kant til kant (x51..1350 = 1299px), mens .ph-container ville give 1155.
   --ph-wide er 95,5vw = 1304px ved 1366 og rammer altså både hendes mål og
   sitets fælles bredde — samme greb som tæller-bjælken og kort-rækken på
   forsiden. Se den lukkede --ph-wide-beslutning i CLAUDE.md. */
.ph-folk__gitter{
  width:var(--ph-wide); max-width:none; margin:0 auto;
  display:grid; gap:clamp(10px, 1.54vw, 21px);
  grid-template-columns:repeat(auto-fit, minmax(140px, 1fr));
  list-style:none; padding:0;
}
.ph-folk__kort--be{ width:auto; }
/* Kvadratisk kilde i et kvadratisk kort: her beskæres der intet. */
.ph-folk__kort--be .ph-folk__foto{
  height:auto; aspect-ratio:199 / 196;
}
.ph-folk__kort--be .ph-folk__navn{ margin-top:11px; font-size:14px; }
.ph-folk__kort--be .ph-folk__rolle,
.ph-folk__kort--be .ph-folk__by{ font-size:13px; }

@media (max-width:900px){
  /* Samme greb som de øvrige striber: pilene må ikke bare skjules, de må
     ikke fylde. Betjeningen er ren native swipe. */
  .ph-folk__next, .ph-folk__prev{ display:none; }
}
@media (max-width:860px){
  /* Samme fallback som tæller-bjælken og kort-rækken: under knækpunktet
     giver --ph-wide (95,5vw) for lidt luft i siderne, så gitteret falder
     tilbage på containerens bredde med rigtige guttere. */
  .ph-folk__sek--be > .ph-container{ padding:0 var(--ph-gutter); }
  .ph-folk__gitter,
  .ph-folk__sek--be .ph-folk__titel{
    width:auto; max-width:var(--ph-max);
  }
}
@media (max-width:640px){
  .ph-folk__gitter{ grid-template-columns:repeat(auto-fit, minmax(128px, 1fr)); }
  .ph-folk__titel{ font-size:17px; }
}
@media (prefers-reduced-motion: reduce){
  .ph-folk__next, .ph-folk__prev{ transition:none; }
  .ph-folk__next:hover, .ph-folk__prev:hover{ transform:none; }
}

/* ============================================================
   15. TEKSTSIDE (type A) — den lange, læsetunge underside
   Bygget 1. august 2026 efter FIRE af Lærkes mockups, ikke én:
   Privat politik.png (1366×2168), Cookie politik.png (2040),
   Husets regler.png (4371) og Medlemsbetingelser.png (7528).

   ⛔ DE FIRE ER PIXELIDENTISKE I SKALLEN — det er derfor der er ÉN
   blok her og ikke fire særtilfælde. Målt i alle fire:
       sidehoved   y0..92    = 93px  #172627   (= .ph-subhead)
       herobånd    y93..343  = 251px           (= .ph-subhero)
       tekstflade  fra y344  = navy #171F64, HVID tekst
       footer      navy, CENTRERET hvidt logo 121-122×62-63
   Ikke ét af de fire tal afviger. Skallen er altså tegnet, ikke
   improviseret pr. side.

   ⛔ FLADEN ER NAVY, IKKE OFFWHITE — og det er let at læse forkert.
   En nedskaleret visning af mockuppen ligner mørk tekst på lys bund;
   rå pixels siger det modsatte: 2,17 mio. px (23,31,100) mod 21 tusind
   (255,255,255). MÅL farven, betragt den ikke.
   (#171F64 mod vores --ph-blue #182263 er 3 niveauer = samme farve,
   præcis som menuens navy-kort — se CLAUDE.md.)

   ⚠️ TYPESKALAEN ER ET VALG, IKKE ET MÅL — de fire mockups er UENIGE:
       Privat            linjeafstand 25  ink 17
       Cookie                          30      21
       Husets regler                   32      21
       Medlemsbetingelser              33      22
   Der er 32% mellem yderpunkterne, så der findes ikke ét rigtigt tal
   at ramme. Samme situation som --ph-wide (indholdsbredder svinger
   79px mellem hendes sider). Vi bruger medianen — 20px/30px — ét sted
   for alle fem sider. Rejs det ikke som en fejl pr. side.
   ============================================================ */

.ph-tekst{
  /* ⚠️ Spaltemålet er den ENE knap at dreje på — og værdien er MÅLT
     frem, ikke valgt. Lærkes tekst løber næsten fuld bredde
     (x58..1281 = 1224px), hvilket er ca. 120 tegn pr. linje. Det er
     ikke typografi, det er indsat tekst i en fuldbredde-boks — se
     uenigheden i typeskalaen ovenfor. Ved den længde mister øjet
     linjen på tilbagespringet, og disse sider SKAL læses igennem.

     Sweep ved 1366 (målt på privatlivspolitikkens indledning):
         74ch  ->  624px, 60 tegn/linje, 48% af boksen, side 4452px
         98ch  ->  840px, 72 tegn/linje, 64% af boksen, side 3972px
     ⚠️ Tegn/linje afhænger af TEKSTEN: cookiepolitikkens kortere ord
     giver 92 på præcis samme 840px. Vi ligger altså i toppen af det
     læsbare interval (45-90) og lidt over på de tætteste afsnit —
     bevidst, for at komme så tæt på hendes fuldbredde-udtryk som
     læsbarheden tillader. De 74ch var første forsøg og gav en spalte
     på under halvdelen af fladen: pænere sat, men langt fra designet.
     Spalten fryser ved 839px fra 1024px og opefter.

     ⚠️ VENSTRE KANT ER URØRT og flugter med --ph-wide som alle andre
     sektioner; kun højre kant kommer ind. Bevidst afvigelse fra
     mockuppen — står i CLAUDE.md. */
  --ph-tekst-maal: 98ch;
  background:var(--ph-blue);
  color:var(--ph-offwhite);
  padding:38px 0 46px;   /* → første ink ~48px under fladens overkant, som målt */
}

/* Griddet gør to ting på én gang: holder brødteksten på spaltemålet
   OG lader en tabel bryde ud i fuld --ph-wide. Uden det ville
   cookietabellens fem kolonner skulle klemmes ned i 74ch. */
.ph-tekst__inder{
  width:var(--ph-wide); max-width:none; margin:0 auto;
  display:grid;
  grid-template-columns:minmax(0, var(--ph-tekst-maal)) minmax(0, 1fr);
}
.ph-tekst__inder > *{ grid-column:1; }
.ph-tekst__bred{ grid-column:1 / -1; }

/* 15.1 TYPOGRAFI
   ⚠️ HIERARKIET ER EN TILFØJELSE. Lærkes tekstsider er HELT flade —
   dokumenttitel, "1. Dataansvarlig" og brødtekst har nøjagtig samme
   størrelse og vægt, fordi teksten er indsat, ikke sat op. En
   privatlivspolitik på ti nummererede afsnit er ulæselig uden et
   holdepunkt, så afsnitsoverskrifterne har fået ét trin. Ét trin —
   ikke en ny typeskala; det flade udtryk er stadig Lærkes. */
.ph-tekst p,
.ph-tekst li,
.ph-tekst dd{ font-size:20px; line-height:30px; }
.ph-tekst p{ margin:0 0 15px; }        /* en halv linje — hendes tætte rytme bevares */

.ph-tekst h2{
  font-size:23px; font-weight:700; line-height:30px;
  margin:40px 0 8px;
}
.ph-tekst h3{
  font-size:20px; font-weight:600; line-height:30px;
  margin:24px 0 2px;
}
.ph-tekst > .ph-tekst__inder > :first-child,
.ph-tekst__inder > h2:first-child{ margin-top:0; }

/* Dokumenttitlen er IKKE en <h1> — den står allerede i den mørke
   bjælke øverst. To h1'er ville give siden to overskrifter der siger
   det samme. */
.ph-tekst__doktitel{
  font-size:23px; font-weight:700; line-height:30px;
  text-transform:uppercase; letter-spacing:.01em;
  margin:0 0 4px;
}
.ph-tekst__dato{ margin:0 0 22px; opacity:.82; }
/* Indledningen på husets-regler: en rigtig sætning, ikke et tidsstempel, så
   den har brødtekstens vægt og blot lidt mere luft under sig — som i
   mockuppen, hvor der står en tom linje mellem titel og indledning. */
.ph-tekst__lead{ margin:0 0 22px; }

/* Listerne er UDEN punkttegn, fordi Lærkes design ikke har nogen — men
   de er rigtige lister i markup'et, så en skærmlæser annoncerer
   "liste med 7 elementer" i stedet for syv løsrevne sætninger. */
.ph-tekst__liste{ list-style:none; padding:0; margin:0 0 15px; }
.ph-tekst__liste li + li{ margin-top:2px; }
.ph-tekst__liste strong{ font-weight:600; }

.ph-tekst a{
  color:var(--ph-offwhite);
  text-decoration:underline; text-underline-offset:3px;
}
.ph-tekst a:hover{ opacity:.75; }

/* 15.2 COOKIEDEKLARATIONEN — en rigtig TABEL
   ⚠️ I mockuppen er tabellen kollapset til løbende prosa
   ("Navn Udbyder Formål Udløb Type _ga Google Registrerer …"), fordi
   kolonnestrukturen gik tabt i en copy-paste fra Cookiebot. Den er
   genopbygget her; indholdet er uændret. */
.ph-tekst__tabelboks{
  overflow-x:auto;                     /* kun tabellen ruller — aldrig siden */
  margin:0 0 26px;
  -webkit-overflow-scrolling:touch;
}
.ph-tekst table{
  border-collapse:collapse;
  width:100%; min-width:720px;
  font-size:16px; line-height:23px;
  text-align:left;
}
.ph-tekst caption{
  text-align:left; font-weight:600; font-size:16px;
  padding:0 0 8px; opacity:.82;
}
.ph-tekst th,
.ph-tekst td{
  padding:9px 14px 9px 0;
  vertical-align:top;
  border-bottom:1px solid rgba(255,255,255,.16);
}
.ph-tekst thead th{
  font-weight:700;
  border-bottom-color:rgba(255,255,255,.45);
  white-space:nowrap;
}
.ph-tekst td:first-child{ font-weight:600; white-space:nowrap; }

/* 15.3 FOOTER PÅ EN MØRK SIDE — centreret logo, ingen sociale ikoner.
   ⚠️ IKONERNE ER IKKE GLEMT. De er nøglet som ÉN farve (#1B2628) med
   gennemsigtige udstansninger (se CLAUDE.md), så de er beregnet på en
   lys flade. På navy ville de være nærmest usynlige — og Lærke har da
   også udeladt dem i alle fire mørke mockups. Skal de med, kræver det
   et lyst ikonsæt, ikke en CSS-rettelse.
   Målt i mockuppene: logo 121-122×62-63 centreret, 87-96px navy under
   det. */
.ph-footer--moerk{ background:var(--ph-blue); }
.ph-footer--moerk .ph-footer__inner{
  justify-content:center;
  padding-block:56px 88px;
}
.ph-footer--moerk .ph-logo img{ height:63px; }

@media (max-width:860px){
  /* Samme fallback som tæller-bjælken, kort-rækken og folkegitteret:
     under knækpunktet giver --ph-wide (95,5vw) for lidt luft i siderne,
     så indholdet falder tilbage på containerbredden med rigtige guttere. */
  .ph-tekst__inder{
    width:auto; max-width:var(--ph-max);
    padding:0 var(--ph-gutter);
    grid-template-columns:minmax(0, 1fr);
  }
  .ph-tekst__bred{ grid-column:1; }
  .ph-tekst p,
  .ph-tekst li,
  .ph-tekst dd{ font-size:18px; line-height:27px; }
  .ph-tekst h2{ font-size:21px; line-height:28px; margin-top:32px; }
  .ph-tekst h3,
  .ph-tekst__doktitel{ font-size:18px; line-height:26px; }
  .ph-footer--moerk .ph-footer__inner{ padding-block:40px 56px; }
  .ph-footer--moerk .ph-logo img{ height:52px; }
}

/* 15.4 INDHOLDSFORTEGNELSE — kun på de lange tekstsider.
   ⚠️ EN TILFØJELSE TIL LÆRKES DESIGN, besluttet af Jonas 2. august 2026.
   Hendes mockups har ingen — men målt er Husets regler 6,6 skærmfulde og
   Medlemsbetingelser 12 (19 på mobil). Begge er OPSLAGSdokumenter: man
   kommer for at finde ét svar ("hvordan opsiger jeg?"), ikke for at læse
   forfra, og på mobil findes der ikke Ctrl+F.

   ⛔ KUN HOVEDAFSNIT (h2). Med h3 ville listerne blive 28 og 52 punkter —
   altså en mur i stedet for en genvej. Det er hele pointen med at den er
   kort nok til at overskue på én gang.

   To spalter, fordi 12-14 punkter i én søjle bliver et højt tårn der
   skubber selve teksten under folden. */
.ph-tekst__ifo{
  margin:0 0 34px;
  padding:20px 26px 22px;
  background:rgba(255,255,255,.055);
  border-left:3px solid rgba(255,255,255,.38);
  border-radius:0 8px 8px 0;
}
/* ⚠️ SELEKTORERNE ER SCOPET UNDER .ph-tekst MED VILJE. `.ph-tekst h2` er
   (0,1,1), så en løs `.ph-tekst__ifo-titel` (0,1,0) ville TABE på både
   font-size og margin — indholdsfortegnelsens overskrift ville stille og
   roligt blive et 23px afsnitshoved med 40px luft over. */
.ph-tekst .ph-tekst__ifo-titel{
  font-size:16px; font-weight:700; line-height:1;
  text-transform:uppercase; letter-spacing:.06em;
  margin:0 0 14px; opacity:.82;
}
.ph-tekst .ph-tekst__ifo-liste{
  list-style:none; margin:0; padding:0;
  columns:2; column-gap:34px;
}
.ph-tekst .ph-tekst__ifo-liste li{
  font-size:17px; line-height:27px;
  break-inside:avoid;          /* et punkt må ikke brækkes over to spalter */
}
.ph-tekst__ifo-liste a{ text-decoration:none; }
.ph-tekst__ifo-liste a:hover,
.ph-tekst__ifo-liste a:focus-visible{ text-decoration:underline; }

/* ⚠️ scroll-margin er IKKE kosmetik: uden den lander overskriften klinet op
   ad viewportens overkant, så man ikke kan se om man ramte rigtigt.

   ⛔ MEN DEN ER IKKE EN HEADERHØJDE. Der er INGEN sticky header på disse
   sider: `position:sticky` findes kun på `.site-header` (§8), altså netop
   den gamle undersidemarkup restylingen fjernede. `.ph-subhead` er
   `position:relative` og ruller væk med siden. Sætter man 93px her, får man
   et stort tomt hul over overskriften i stedet for at rydde en bjælke der
   ikke er der. 24px er luft, ikke kompensation.
   ⚠️ Får en tekstside en dag en sticky bjælke, SKAL tallet op — og så er
   det bjælkens højde plus luften. */
.ph-tekst h2[id]{ scroll-margin-top:24px; }
/* Fokus flyttes til overskriften ved et spring (se phInitIndhold), og et
   programmatisk fokuseret element må ikke tegne en ring det ikke selv
   inviterede til. :focus-visible holder ringen til tastaturbrug. */
.ph-tekst h2[id]:focus{ outline:none; }
.ph-tekst h2[id]:focus-visible{
  outline:3px solid var(--ph-orange); outline-offset:6px;
}

/* Springer man ind i 12 skærmfulde tekst, er "hvor landede jeg" det første
   spørgsmål. Markøren svarer på det uden at ændre typografien.
   ⚠️ Farve er ikke eneste signal — markøren er en form (en streg i
   venstremargenen), ikke en farvet tekst. */
.ph-tekst h2[id]:target{
  position:relative;
}
.ph-tekst h2[id]:target::before{
  content:''; position:absolute;
  left:-18px; top:.15em; bottom:.15em; width:4px;
  background:var(--ph-orange); border-radius:2px;
}

@media (max-width:860px){
  /* ⚠️ SAMME SCOPING SOM BASEREGLERNE — og det er ikke pedanteri.
     Basen er `.ph-tekst .ph-tekst__ifo-liste` (0,2,0); en løs
     `.ph-tekst__ifo-liste` her er (0,1,0) og TABER, uanset at den står
     senere i filen og inde i en media query. Målt før rettelsen: 375px
     viste stadig to spalter à ~140px, hvor overskrifterne brækkede i
     stumper. Media queries hæver ikke specificitet. */
  .ph-tekst .ph-tekst__ifo-liste{ columns:1; }
  .ph-tekst .ph-tekst__ifo-liste li{ font-size:16px; line-height:26px; }
  .ph-tekst .ph-tekst__ifo{ padding:16px 18px 18px; margin-bottom:26px; }
  .ph-tekst h2[id]:target::before{ left:-12px; }
}

/* ============================================================
   16. MEDLEMSFORDELE (undersidetype A)
   Bygget 2. august 2026 efter Lærkes Medlemsfordele.png (1366×1157).
   Alle mål er læst i filen, ikke skønnet.

       sidehoved      93px #172627        (= .ph-subhead)
       herobånd       y93..343 = 251px    (= .ph-subhero)
       indhold        offwhite fra y344
       kortrække      7 kort à 131×205, gap 19, pitch ~149,5
       pile           21×21 cirkler, x112 og x1233, centreret y870
       footer         logo 79×41 + ikonrække 240px  (= FOOTER-SUB)

   ⚠️ SIDEN HAR IKKE SIN EGEN BREDDE. Lærkes kortrække måler x169..1196 =
   1028px, men vi bruger --ph-wide som alle andre sektioner — det er den
   lukkede beslutning fra 27. juli. Kortene bliver derfor 17% større end i
   mockuppen, præcis som Jobs-kortene blev 619,5 mod hendes 571. Rejs det
   ikke som en fejl.
   ============================================================ */
.ph-fordele{ background:var(--ph-offwhite); padding:44px 0 0; }
.ph-fordele__inder{
  width:var(--ph-wide); max-width:none; margin:0 auto;
  text-align:center;
}

/* Indledningen er MINDRE end brødteksten i kolonnerne — målt, ikke valgt:
   ink 17 mod kolonnernes 20 ved samme skrift. Den læses som en manchet,
   ikke som et afsnit. */
/* ⚠️ 18/26, IKKE 16/24 — rettet 7. august 2026 (Lærke: "justér
   tekststørrelserne, så de stemmer indbyrdes"). Siden havde TO
   indledningsafsnit i to forskellige grader: dette på 16/24 og
   `.ph-fordele__intro2` på 18/26. To afsnit med samme rolle og samme
   placering skal have samme grad; forskellen læses som en fejl.
   18/26 er sitets brødtekstmål og bruges også på jobs, kontakt og
   firmasiden. */
.ph-fordele__intro{
  font-size:18px; line-height:26px;
  margin:0 auto 34px; max-width:64em;
}

/* 24px giver ink-højde 17px = mockuppens cap, samme tal som Jobs-kortenes
   overskrift. Hierarkiet er fladt hos Lærke — ét trin over brødteksten. */
.ph-fordele__titel{
  font-size:24px; font-weight:700; line-height:1;
  text-transform:uppercase; letter-spacing:.01em;
  margin:0 0 13px;
}
.ph-fordele__titel--sek{ margin-top:0; }

/* ⚠️ PARRET SPÆNDER IKKE --ph-wide, og det er en bevidst undtagelse.
   Lærkes to tekstblokke er en CENTRERET komposition, ikke en række der er
   justeret ud til kanterne: hun måler 476 + 87 + 486 = 1049px midt i en
   1366px side, med ~160px luft i hver side. Spredes de to kolonner ud over
   hele --ph-wide, havner deres centre 57px for langt ude (målt: 335/1016
   mod hendes 407/973 omregnet), og teksten bliver til to smalle striber
   langt fra hinanden.
   --ph-wide-beslutningen handler om SEKTIONERNES kanter, ikke om at tvinge
   hvert indre element ud i fuld bredde. Kortrækken nedenfor følger den
   fortsat. */
.ph-fordele__par{
  display:grid; grid-template-columns:1fr 1fr;
  gap:87px;                       /* målt mellem kolonnerne: x644..731 */
  max-width:1049px; margin:0 auto 46px;
}
.ph-fordele__koncept p{
  font-size:18px; line-height:26px;   /* pitch 26 målt i begge kolonner */
  margin:0;
}
.ph-fordele__intro2{
  font-size:18px; line-height:26px;
  margin:0 auto 26px; max-width:70em;
}

/* 16.1 PARTNERKORTENE — stribe-mekanikken med Lærkes eget udseende.
   ⛔ KOBLINGEN ER DATA-ATTRIBUTTER (data-ph-stribe/-port/-felt/-next/-prev),
   ikke klassenavne. JS'en må ikke vide hvilken side eller hvilket brand den
   betjener — se de tre lærdomme 28. juli. */
.ph-fordele__stribe{
  width:var(--ph-wide); max-width:none; margin:0 auto;
  display:flex; align-items:center; gap:20px;
  padding-bottom:56px;

  /* ⚠️ KORTBREDDEN ER REGNET, IKKE SAT: syv kort skal fylde porten præcis
     som i mockuppen, uanset hvor bred --ph-wide gør den. Sætter man et fast
     tal, passer det kun ved én skærmbredde.
     max() er gulvet — uden det bliver kortene 35px på en telefon, og så
     ruller striben i stedet, hvilket er den rigtige opførsel. */
  --mf-gap:19px;
  --mf-kort:max(150px, calc((var(--ph-wide) - 2 * 64px - 6 * var(--mf-gap)) / 7));
}
.ph-fordele__port{
  flex:1 1 auto; min-width:0;
  list-style:none; margin:0; padding:0;
  display:flex; gap:var(--mf-gap);
  overflow-x:auto; overflow-y:hidden;
  scroll-snap-type:x proximity;
  scroll-behavior:auto;              /* pilene animerer selv, se phInitStriber */
  scrollbar-width:none;
}
.ph-fordele__port::-webkit-scrollbar{ display:none; }
.ph-fordele__felt{
  flex:0 0 auto;
  width:var(--mf-kort);
  /* 131×205 i mockuppen = 0,639. Forholdet holdes, ikke pixeltallene. */
  aspect-ratio:131 / 205;
  scroll-snap-align:start;
}
/* Partneren: logofelt over navnet. ⏳ Logoet er en pladsholder (.ph-ph) indtil
   vi ved om vi må genpublicere partnernes mærker — se noten i markup'en.
   Navnet bærer informationen indtil da, og det er derfor det står UNDER
   feltet og ikke inde i det: en stribet firkant med tekst i ligner et
   ødelagt billede, en stribet firkant med en label under ligner en
   pladsholder. */
.ph-fordele__partner{
  display:flex; flex-direction:column; height:100%;
  color:var(--ph-ink); text-decoration:none;
}
/* ⛔ NAVYEN LIGGER HER, IKKE I BILLEDFILEN (9. august 2026).
   Lærkes logofiler er kvadratiske med hvidt mærke på HENDES navy #31387E.
   Mærket er nøglet fri, så filen kun bærer alfa, og fladen kommer herfra i
   sitets egen #182263. Det løser to ting på én gang: farven bliver den
   rigtige, og et KVADRATISK mærke kan sidde i et PORTRÆT-felt uden søm —
   det tomme bånd, en flise ville have efterladt, er bare mere navy.
   ⚠️ Skifter fladen farve en dag, er det denne ene linje. Rør ikke filerne. */
.ph-fordele__logo{
  flex:1 1 auto; min-height:0;
  display:grid; place-items:center;
  background:var(--ph-blue);
  border-radius:20px;               /* målt: 18px indryk 1px nede i hjørnet */
  overflow:hidden;
}
/* Mærket står i sin egen optiske størrelse inde i det kvadrat Lærke har sat
   det i — vi skalerer altså ikke hendes balance om. Bredden binder, fordi
   feltet er smallere end det er højt. */
.ph-fordele__logo img{
  display:block; width:100%; height:auto; max-height:100%;
  object-fit:contain;
}
.ph-fordele__pnavn{
  flex:0 0 auto; margin-top:8px;
  font-size:13px; line-height:16px; letter-spacing:0.02em;
  text-decoration:underline; text-underline-offset:3px; text-decoration-thickness:1px;
}
/* ⚠️ HVOR RABATTEN GÆLDER — tilføjet 9. august 2026 (Jonas). Uden den er
   halvdelen af listen irrelevant for enhver enkelt læser: et Vejle-medlem kan
   ikke se, at Café Cozy gælder netop dér.
   Dæmpet og under navnet, så det læses som en oplysning og ikke som en del af
   partnerens navn — samme greb som .ph-fac__kun ved saunaen. */
.ph-fordele__psted{
  flex:0 0 auto; margin-top:3px;
  font-size:12px; line-height:15px; color:var(--ph-muted);
  text-decoration:none;
}
.ph-fordele__partner:hover .ph-fordele__pnavn{ text-decoration-thickness:2px; }
.ph-fordele__partner:focus-visible{
  outline:3px solid var(--ph-black); outline-offset:3px; border-radius:4px;
}
.ph-fordele__felt .ph-ph{
  width:100%; height:100%;
  border-radius:20px;                /* målt: 18px indryk 1px nede i hjørnet */
}

/* Pilene: Lærkes er 21px cirkler. Knappen er 44px, så touch-målet holder
   anbefalingen — den synlige cirkel er inderst og uændret 21px. */
.ph-fordele__pil{
  flex:0 0 auto;
  width:44px; height:44px; padding:0;
  background:none; border:0; cursor:pointer;
  display:grid; place-items:center;
  color:var(--ph-ink);
}
.ph-fordele__pil > span{
  width:21px; height:21px; border-radius:50%;
  border:1px solid currentColor;
  display:grid; place-items:center;
  font-size:11px; line-height:1;
  transition:background-color .2s ease, color .2s ease, transform .2s ease;
}
.ph-fordele__pil:hover > span{
  background:var(--ph-ink); color:var(--ph-offwhite); transform:scale(1.08);
}

@media (max-width:860px){
  .ph-fordele__inder,
  .ph-fordele__stribe{
    width:auto; max-width:var(--ph-max);
    padding-left:var(--ph-gutter); padding-right:var(--ph-gutter);
  }
  .ph-fordele__par{ grid-template-columns:1fr; gap:34px; }
  .ph-fordele__titel{ font-size:20px; }
  /* Følger .ph-fordele__intro2 på mobil af samme grund som på desktop. */
  .ph-fordele__intro{ font-size:17px; line-height:25px; margin-bottom:26px; }
  .ph-fordele__koncept p,
  .ph-fordele__intro2{ font-size:17px; line-height:25px; }
  /* Samme greb som .ph-fac: pilene må ikke bare være usynlige — de må ikke
     fylde. Med visibility åd de to knapper plus gap en hel kortbredde.
     Betjeningen er ren native swipe. */
  .ph-fordele__pil{ display:none; }
  /* ⚠️ MELLEMBREDDERNE FÅR ET FAST KORT, ikke telefonens 2-op-formel.
     Den formel er et ANDET problems løsning: på 375px skal to kort plus et
     kig fylde skærmen, men på en 768px tablet giver præcis samme regel
     338×528px kort — altså plakater. Målt før rettelsen. Mellem 641 og 860
     er der plads til flere kort ved siden af hinanden, så et fast mål er
     rigtigt, og striben ruller. */
  .ph-fordele__stribe{ gap:0; --mf-kort:170px; }
}
@media (max-width:640px){
  /* To kort plus et kig (26px), så det er synligt at rækken fortsætter —
     samme regnestykke som .ph-fac, hvor kigget ER hele affordancen på touch:
     der er hverken pil eller scrollbar at se. */
  .ph-fordele__stribe{
    --mf-kort:calc((100vw - 2 * var(--ph-gutter) - var(--mf-gap) - 26px) / 2);
  }
}
@media (prefers-reduced-motion: reduce){
  .ph-fordele__pil > span{ transition:none; }
  .ph-fordele__pil:hover > span{ transform:none; }
}

/* ============================================================
   17. FIRMAAFTALER + FAQ/KONTAKT (undersidetype A)
   Bygget 2. august 2026 efter Firma aftale.png (1366×986) og
   FAQ og kontakt .png (1366×693).

   ⛔ DE TO SIDER ER IKKE ÉN BLOK — og det er efterprøvet, ikke antaget.
   De deler SKALLEN (93px bjælke + 251px herobånd + FOOTER-SUB), men den
   fandtes i forvejen og genbruges af sig selv gennem partials. Derudover
   deler de intet:
       Firma aftale   navy flade, ét CTA-udsagn, TRE offwhite kort
       FAQ og kontakt offwhite flade, centreret tekstblok, ingen kort
   Det er en anden situation end de fem tekstsider, som var pixelidentiske
   i skallen OG havde samme indholdsform. At presse disse to sammen ville
   være en falsk abstraktion. De ligger i samme sektion her, fordi de er
   bygget samme dag — ikke fordi de deler kode.
   ============================================================ */

/* 17.1 FIRMAAFTALER — navy flade med tre offwhite kort.
   Målt: flade fra y344, lead-linjens ink y378 (34px nede), kort y435..837
   (403px høje), radius 26. */
.ph-firma{ background:var(--ph-blue); color:var(--ph-offwhite); padding:34px 0 46px; }
.ph-firma__inder{ width:var(--ph-wide); max-width:none; margin:0 auto; text-align:center; }

/* ⚠️ INDLEDNINGEN ER BEHOLDT FRA DEN GAMLE SIDE, og det er en tilføjelse
   til Lærkes design. Hendes navy-flade har ÉN linje før kortene — CTA'en
   nedenfor — så en side med titlen "Fleksible firmaaftaler til
   virksomheder" ville åbne direkte med en e-mailadresse. Afsnittet er
   husets egen, allerede offentliggjorte tekst og indeholder det eneste
   sted på sitet hvor det B2B-mæssigt står at kæden er landsdækkende med
   fem byer. At slette indhold er en større afvigelse end at beholde det.
   Sig til, hvis den skal ud. */
.ph-firma__intro{
  font-size:18px; line-height:26px;
  margin:0 auto 22px; max-width:74em;
}
.ph-firma__lead{
  font-size:18px; line-height:26px;
  margin:0 auto 38px; max-width:74em;
}
.ph-firma__lead a{ font-weight:700; color:inherit; text-decoration:underline; text-underline-offset:3px; }

/* ⚠️ TRE LIGE KORT — mockuppens er 430 / 431 / 268 med gap 22 og 83.
   Det er håndplacering, ikke rytme: kort 3 har mindst tekst OG en stor
   tom bund, så bredden er sat efter indholdet frem for efter et gitter.
   Tre kort af samme slags i tre forskellige bredder læses som en fejl.
   Lige tredjedele holder desuden når teksten ændrer sig. */
.ph-firma__kort{
  display:grid; grid-template-columns:repeat(3, 1fr); gap:22px;
  text-align:center;
}
.ph-firmakort{
  background:var(--ph-offwhite); color:var(--ph-ink);
  border-radius:26px;                  /* målt i mockuppens hjørne */
  padding:29px 26px 32px;              /* 29 = kortets top til overskrift-ink */
  display:flex; flex-direction:column;
}
/* Kortteksten er MINDRE end sidens — målt, ikke valgt: kortenes ink er 16
   og pitch 22, mod sidens 20/26. Tre kort med meget tekst side om side
   kan ikke bære brødtekstens grad. Samme fund som Power Studios kort. */
.ph-firmakort__titel{
  font-size:17px; font-weight:700; line-height:22px;
  text-transform:uppercase; letter-spacing:.01em;
  margin:0 0 18px;
}
.ph-firmakort p{ font-size:15px; line-height:22px; margin:0 0 10px; }
.ph-firmakort ul{
  list-style:none; margin:0 0 10px; padding:0;
  font-size:15px; line-height:22px;
}
/* ⚠️ Punkttegnene er væk, fordi Lærkes kort ikke har nogen — hendes liste
   står som løbende linjer. Men det ER en liste i markup'en, så en
   skærmlæser annoncerer "liste med 3 elementer". */
.ph-firmakort__cta{
  margin-top:auto; padding-top:14px;
  font-size:15px; line-height:22px;
}
/* ⛔ INGEN UNDERSTREGNING — DET ER EN KNAP, IKKE ET TEKSTLINK (Lærke,
   10. august 2026). De tre CTA'er er `.ph-btn .ph-btn--light .ph-btn--pill`:
   pilleform, egen baggrund, egen padding og egen vægt. Affordancen ligger i
   knapformen, og en streg oveni er redundant.
   ⚠️ DET ER UNDTAGELSEN, IKKE REGLEN. Alle sitets øvrige understregede links
   måler kontrast 1,00 mod deres omgivende tekst — dér er stregen den ENESTE
   markering, og den skal blive. Se gennemgangen i CLAUDE.md. */
.ph-firmakort__cta a{ color:var(--ph-ink); text-decoration:none; }

/* 17.2 FAQ OG KONTAKT — offwhite flade, centreret tekst, ingen kort.
   Målt: overskrifts-ink y380 (36px under fladens top), cap 14 → 20px;
   brødtekst ink 20 / pitch 26 → 18px; alt centreret på x682,5. */
.ph-kontakt{ background:var(--ph-offwhite); padding:30px 0 46px; }
.ph-kontakt__inder{
  width:var(--ph-wide); max-width:none; margin:0 auto; text-align:center;
}
.ph-kontakt__titel{
  font-size:20px; font-weight:700; line-height:1;
  text-transform:uppercase; letter-spacing:.01em;
  margin:0 0 30px;
}
/* ⚠️ 17/27 OG ET MÅL PÅ 62ch — rettet 7. august 2026 (Lærke: "gør brødteksten
   en anelse mindre, eller del den anderledes op, så den ser naturligt
   placeret ud på både computer og telefon").

   ⛔ DET VAR IKKE GRADEN DER VAR PROBLEMET, DET VAR LINJELÆNGDEN. `max-width`
   stod på 64em = 1152px ved 18px, altså bredere end den centrerede spalte
   nogensinde bliver — så den bandt aldrig, og teksten løb i sidens fulde
   bredde. Målt før: 118 tegn pr. linje ved 1366px, mod de 45-90 der er
   læsbart. Det er dét der får den til at se "forkert placeret" ud, ikke
   skriftstørrelsen.
   `ch` frem for `em`: målet er tegn pr. linje, og `ch` er netop bredden af
   et nul i den aktuelle skrift — det følger med når fonten skifter.
   Graden er sat en anelse ned som hun bad om, og linjeafstanden en anelse op,
   fordi en kortere linje tåler mere luft. */
.ph-kontakt p{
  font-size:17px; line-height:27px;
  margin:0 auto 26px; max-width:62ch;
}
.ph-kontakt p:last-child{ margin-bottom:0; }
/* ⚠️ MAILADRESSEN ER UDEN STREG FRA START (Lærke, 10. august 2026), og den
   kommer ved hover. Det er sitets ENESTE tekstlink uden permanent markering,
   og det hviler på ét forhold: linkteksten ER adressen
   ("info@powerhousedanmark.dk"), introduceret af sætningen lige før — så
   indholdet identificerer sig selv, hvor et link på ordet "her" ikke ville.
   ⛔ BRUG DET IKKE SOM PRÆCEDENS FOR ANDRE LINKS. Kontrasten mod den
   omgivende tekst er 1,00, altså ingen farveforskel — for et link hvis tekst
   IKKE er en adresse, ville stregen være den eneste markering, og hover
   findes ikke på touch. Se gennemgangen af alle 79 i CLAUDE.md. */
.ph-kontakt a{ color:var(--ph-ink); text-decoration:none; }
.ph-kontakt a:hover{ text-decoration:underline; text-underline-offset:3px; }
.ph-kontakt a:focus-visible{ text-decoration:underline; text-underline-offset:3px; }

@media (max-width:860px){
  .ph-firma__inder, .ph-kontakt__inder{
    width:auto; max-width:var(--ph-max);
    padding-left:var(--ph-gutter); padding-right:var(--ph-gutter);
  }
  /* ⚠️ TO SPALTER, IKKE ÉN, helt ned til 640px. Én spalte ved 768 gav kort
     på 705px med 15px centreret tekst — ca. 88 tegn pr. linje, altså
     dobbelt så langt som kortformatet er tænkt til. Målt, ikke gættet.
     Kortenes lille grad forudsætter en smal spalte; bliver spalten bred,
     skal graden op, og så er det ikke et kort længere. */
  .ph-firma__kort{ grid-template-columns:repeat(2, 1fr); gap:18px; }
  .ph-firma__intro, .ph-firma__lead,
  .ph-kontakt p{ font-size:17px; line-height:25px; }
  .ph-kontakt__titel{ font-size:18px; margin-bottom:22px; }
  .ph-firmakort{ padding:24px 22px 26px; }
}
@media (max-width:640px){
  .ph-firma__kort{ grid-template-columns:1fr; }
}
@media (min-width:861px) and (max-width:1100px){
  /* Tre kort under 1100px giver spalter på ~330px, hvor de længste punkter
     brækker i tre linjer. To kort er mere læseligt end tre klemte. */
  .ph-firma__kort{ grid-template-columns:repeat(2, 1fr); }
}

/* 17.3 FAQ — står OVER kontaktblokken på samme side og samme offwhite flade.
   Bygget 9. august 2026 ud fra data/faq.json; markup'en genereres af build.py.

   ⛔ SPALTEN ER 62ch — SAMME MÅL SOM .ph-kontakt p, OG DET ER IKKE TILFÆLDIGT.
   De to blokke står lige over hinanden. Får FAQ'en sin egen bredde, læses de
   som to sider klistret sammen frem for én side.
   ⚠️ Målet er tegn pr. linje, derfor `ch` og ikke `px` — det følger med, hvis
   graden eller fonten ændrer sig.

   ⛔ OG DERFOR SÆTTER DE TRE SPALTE-BEHOLDERE `font-size:17px`, SELVOM DE
   IKKE SELV VISER TEKST. `ch` er bredden af et nul i ELEMENTETS EGEN skrift,
   så `62ch` på en beholder der arver 16px giver et andet tal end `62ch` på
   .ph-kontakt p, der står på 17px. Målt før rettelsen: 560px mod 596px —
   FAQ-spalten var 36px smallere end teksten lige under den, og de to
   venstrekanter stod 17,5px fra hinanden.
   ⚠️ Det er sikkert, fordi hvert eneste barn sætter sin egen grad (felt 17,
   spørgsmål 18, kategori 12, svar 17, status/knap 15, forslag 16/11). De 17px
   bruges KUN til at opløse `ch`. Tilføjes et barn uden egen font-size, arver
   det 17 — så sæt en grad på det.

   ⚠️ INGEN SKILLELINJE MELLEM DE TO BLOKKE. Lærkes design har ingen, og
   listens egen afsluttende hairline plus 74px luft og en centreret versaltitel
   adskiller dem rigeligt. */
.ph-faq{ background:var(--ph-offwhite); padding:34px 0 44px; }
.ph-faq__inder{
  width:var(--ph-wide); max-width:none; margin:0 auto;
  /* Kun titlen centreres — alt indhold stiller sig selv til venstre igen.
     Centreret brødtekst i en foldet liste er ulæselig. */
  text-align:center;
}
.ph-faq__titel{
  font-size:20px; font-weight:700; line-height:1;
  text-transform:uppercase; letter-spacing:.01em;
  margin:0 0 26px;
}

/* ---- søgefelt og knapper (indsat af js/faq.js) ---- */
.ph-faq__vaerktoej{ font-size:17px; max-width:62ch; margin:0 auto 20px; text-align:left; }
.ph-faq__vaerktoej:empty{ margin:0; }   /* uden JS er der intet — så heller ingen luft */

.ph-faq__felt{
  width:100%; box-sizing:border-box;
  font:inherit; font-size:17px; line-height:24px;
  padding:13px 16px;
  border:1px solid rgba(25,28,26,.28); border-radius:var(--ph-radius);
  background:#fff; color:var(--ph-ink);
  /* Safari giver type=search afrundede hjørner og egen skrift som standard. */
  -webkit-appearance:none; appearance:none;
}
.ph-faq__felt::placeholder{ color:var(--ph-muted); opacity:1; }

.ph-faq__raekke{
  display:flex; flex-wrap:wrap; gap:8px 18px;
  align-items:baseline; justify-content:space-between;
  margin-top:12px; min-height:22px;    /* holder højden når status er tom */
}
.ph-faq__status{ margin:0; font-size:15px; line-height:22px; color:var(--ph-muted); }
.ph-faq__vis{
  background:none; border:none; padding:0;
  font-size:15px; line-height:22px; font-weight:600; color:var(--ph-ink);
  text-decoration:underline; text-underline-offset:3px;
}
.ph-faq__vis:hover{ text-decoration-thickness:2px; }
.ph-faq__vis[hidden]{ display:none; }

/* ---- selve listen ---- */
.ph-faq__liste{
  list-style:none; margin:0 auto; padding:0;
  font-size:17px; max-width:62ch; text-align:left;
  /* flex, så søgningen kan sætte rækkefølgen med `order` frem for at flytte
     noder. At flytte en node ville lukke et åbent <details> og rive fokus ud
     af hænderne på den, der lige har foldet et svar ud. */
  display:flex; flex-direction:column;
  border-top:1px solid rgba(25,28,26,.16);
}
/* ⚠️ Hver post bærer sin egen bundlinje — IKKE :last-child. Med `order` er den
   visuelt sidste ikke den sidste i DOM'en, og skjulte poster ville efterlade
   linjen et vilkårligt sted. */
.ph-faq__post{ border-bottom:1px solid rgba(25,28,26,.16); }
/* Eksplicit, fordi et flex-barn ellers kan arve en display-værdi der slår
   [hidden] ihjel — og så ville søgningen ikke kunne skjule noget. */
.ph-faq__post[hidden]{ display:none; }

.ph-faq__d{ /* ingen egen boks — linjerne kommer fra <li> */ }
.ph-faq__sum{
  display:block; position:relative;
  padding:18px 42px 18px 0; cursor:pointer;
  list-style:none;                       /* fjerner trekanten i Firefox */
}
.ph-faq__sum::-webkit-details-marker{ display:none; }
.ph-faq__sum:focus-visible{ outline:2px solid var(--ph-blue); outline-offset:-2px; }

.ph-faq__kat{
  display:block; margin-bottom:5px;
  font-size:12px; line-height:16px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--ph-muted);
}
.ph-faq__sp{ display:block; font-size:18px; line-height:25px; font-weight:600; }

/* Foldemarkøren er tegnet af to kanter frem for en glyf, så den ikke afhænger
   af at en bestemt skrift har tegnet — og så den kan dreje blødt. */
.ph-faq__sum::after{
  content:''; position:absolute; right:8px; top:50%;
  width:9px; height:9px; margin-top:-7px;
  border-right:2px solid var(--ph-ink); border-bottom:2px solid var(--ph-ink);
  transform:rotate(45deg); transition:transform .2s ease;
}
.ph-faq__d[open] .ph-faq__sum::after{ transform:rotate(-135deg); margin-top:-2px; }

.ph-faq__svar{ padding:0 42px 20px 0; }
.ph-faq__svar p{ font-size:17px; line-height:26px; margin:0 0 16px; }
.ph-faq__svar p:last-child{ margin-bottom:0; }
/* ⛔ `overflow-wrap:anywhere` ER IKKE PYNT. Svarene indeholder URL'er på op til
   66 tegn, og i en 327px spalte på en telefon er der plads til ~38. Uden den
   skubber ét link hele siden vandret — præcis den fejl der ellers er nul af. */
.ph-faq__svar a{
  color:var(--ph-ink); text-decoration:underline; text-underline-offset:3px;
  overflow-wrap:anywhere;
}
.ph-faq__svar a:hover{ text-decoration-thickness:2px; }

/* ---- ingen fund ---- */
.ph-faq__intet{ font-size:17px; max-width:62ch; margin:14px auto 0; text-align:left; }
.ph-faq__intet[hidden]{ display:none; }
.ph-faq__intet-titel{ font-size:18px; line-height:26px; font-weight:600; margin:0 0 16px; }
.ph-faq__forslag{
  list-style:none; margin:0 0 20px; padding:0;
  display:grid; grid-template-columns:1fr 1fr; gap:10px;
}
.ph-faq__forslag-knap{
  display:block; width:100%; height:100%; text-align:left;
  background:#fff; border:1px solid rgba(25,28,26,.16);
  border-radius:var(--ph-radius); padding:12px 15px;
  font-size:16px; line-height:22px; font-weight:600; color:var(--ph-ink);
}
.ph-faq__forslag-knap:hover{ border-color:rgba(25,28,26,.42); }
.ph-faq__forslag-kat{
  display:block; margin-bottom:3px;
  font-size:11px; line-height:15px; font-weight:700;
  text-transform:uppercase; letter-spacing:.06em; color:var(--ph-muted);
}
.ph-faq__intet-mail{ font-size:17px; line-height:26px; margin:0; }
.ph-faq__intet-mail a{ color:var(--ph-ink); text-decoration:underline; text-underline-offset:3px; }

@media (max-width:860px){
  .ph-faq__inder{
    width:auto; max-width:var(--ph-max);
    padding-left:var(--ph-gutter); padding-right:var(--ph-gutter);
  }
  .ph-faq__sp{ font-size:17px; line-height:24px; }
  .ph-faq__svar p, .ph-faq__intet-mail{ font-size:17px; line-height:25px; }
}
@media (max-width:560px){
  /* To forslagskort under 560px giver spalter på ~145px, hvor et spørgsmål
     som "Jeg kan ikke komme ind — appen virker ikke" brækker i seks linjer.
     Én spalte er kortere at læse end to klemte. */
  .ph-faq__forslag{ grid-template-columns:1fr; }
}
@media (prefers-reduced-motion: reduce){
  .ph-faq__sum::after{ transition:none; }
}

/* 17.4 HJÆLPEKNAP OG FAQ-PANEL — sitets anden indgang til de samme spørgsmål.
   Markup i partials/hjaelp.html, adfærd i js/faq.js. Bygget 9. august 2026.

   ⛔ DEN MÅ IKKE LIGNE EN CHATBOT (Jonas). Derfor et spørgsmålstegn og ordet
   "Hjælp" — aldrig en taleboble. Farven er brandets navy, altså samme sprog
   som sitets øvrige knapper, ikke det grønne/blå cirkelikon en chatwidget
   bruger. Overskriften i panelet siger hvad det er, og underlinjen siger
   eksplicit at man ikke skriver til nogen.

   ⛔ Z-INDEX LIGGER UNDER MENUENS 120 OG MODALENS 130 — med vilje. Går noget
   galt, skal menuen vinde over hjælpeknappen, ikke omvendt. Knappen bliver
   desuden fjernet fra tabrækkefølgen når menuen er åben (.er-vaek), for ellers
   kunne man tabbe til en knap man ikke kan se. */
/* ⛔ HVID FLADE **OG** NAVY KANT — TO SEPARATORER, OG BEGGE SKAL BLIVE.
   Knappen var helt navy indtil 9. august 2026. Forsiden har en NAVY
   TÆLLERBJÆLKE, og den faste knap flyder hen over den, når man scroller —
   dér forsvandt den helt.

   Målt mod de tre flader knappen kan lande på:

                        hvid flade      navy flade (før)
     navy tællerbjælke    14,50:1  ✅      1,00:1  ⛔
     mørkt hero-foto      14,76:1  ✅      1,02:1  ⛔
     offwhite side         1,15:1  ⛔     12,60:1  ✅

   ⛔ INGEN ENKELT FARVE VIRKER PÅ ALLE TRE — og det er hele pointen med
   kanten. På navy og på foto er det den HVIDE FLADE der skiller knappen ud;
   på den offwhite side kan fladen ikke, og dér gør den 2px NAVY KANT
   arbejdet (12,60:1). De to dækker hver sin flade.
   ⚠️ Fjern derfor aldrig kanten som "pynt" — så er knappen usynlig på
   halvdelen af sitet. Og gør den aldrig navy igen uden først at holde den op
   mod tællerbjælken. */
.ph-hjaelp__knap{
  position:fixed; right:20px; bottom:20px; z-index:110;
  display:inline-flex; align-items:center; gap:10px;
  padding:11px 20px 11px 12px;
  border:2px solid var(--ph-blue); border-radius:var(--ph-radius-pill);
  background:#fff; color:var(--ph-blue);
  text-align:left;
  box-shadow:0 8px 24px rgba(16,23,64,.26);
}
.ph-hjaelp__knap:hover{ background:var(--ph-offwhite); }
.ph-hjaelp__knap:focus-visible{ outline:3px solid var(--ph-ink); outline-offset:3px; }
/* Spørgsmålstegnet i en FYLDT cirkel — på den lyse knap er det mærket der
   bærer genkendelsen, så det skal have fuld kontrast, ikke en svag tone. */
.ph-hjaelp__tegn{
  flex:0 0 auto;
  display:grid; place-items:center;
  width:28px; height:28px; border-radius:50%;
  background:var(--ph-blue); color:#fff;
  font-size:17px; font-weight:700; line-height:1;
}
.ph-hjaelp__ord b{
  display:block; font-size:15px; font-weight:700; line-height:19px;
}
/* ⛔ UNDERLINJEN ER DET DER FJERNER CHAT-TVIVLEN. "Se svar på de 30 vi oftest
   får" siger at der ligger færdige svar — ikke at nogen sidder og venter.
   Tallet sættes af build.py ud fra data/faq.json; se partials/hjaelp.html. */
.ph-hjaelp__ord small{
  display:block; font-size:12px; font-weight:400; line-height:16px;
  color:rgba(24,34,99,.78);
}
/* ⛔ TO SKJULETILSTANDE MED HVER SIN GRUND — slå dem ikke sammen.
   .er-skjult: footeren er i billedet. De seks sociale ikoner ligger præcis i
     nederste højre hjørne med 44px tapmål, og holdplanens Book-knapper samme
     sted; knappen ville dække dem. Målt på alle 16 sider.
   .er-vaek:   burgermenuen er åben og dækker skærmen.
   Begge bruger display:none, så knappen hverken kan klikkes eller tabbes. */
.ph-hjaelp__knap.er-skjult,
.ph-hjaelp__knap.er-vaek{ display:none; }

.ph-hjaelp[hidden]{ display:none; }
.ph-hjaelp{ position:fixed; inset:0; z-index:115; }
/* Bagtæppet gør modaliteten ægte og fanger klik udenfor. Let, fordi panelet
   er lille på desktop — det skal signalere "resten venter", ikke slukke siden. */
.ph-hjaelp__bagtaeppe{ position:absolute; inset:0; background:rgba(16,23,64,.28); }

.ph-hjaelp__panel{
  position:absolute; right:20px; bottom:20px;
  /* 460 og ikke 420: målt gav 420px kun 37 tegn pr. linje i svarteksten, og
     selv om en hjælpepanel-spalte gerne må være smallere end en sides, er 37
     under det læsbare. 460 giver 41-42 og er stadig et hjørnepanel — det
     dækker 25% af en 1366px skærm. */
  width:min(460px, calc(100vw - 40px));
  max-height:min(72vh, 660px);
  display:flex; flex-direction:column;
  background:var(--ph-offwhite); color:var(--ph-ink);
  border-radius:14px; box-shadow:0 18px 48px rgba(16,23,64,.34);
  overflow:hidden;
}
/* ⛔ INGEN ANIMATION (Jonas). Et panel der glider eller popper ind, trækker
   opmærksomhed til sig selv — og det er præcis dét en hjælpeknap ikke skal.
   Den vises, når man beder om den, og forsvinder når man lukker. */

.ph-hjaelp__top{
  display:flex; align-items:flex-start; justify-content:space-between; gap:12px;
  padding:18px 16px 0 20px;
}
.ph-hjaelp__titel{
  margin:0; font-size:18px; line-height:24px; font-weight:700;
}
.ph-hjaelp__luk{
  flex:0 0 auto; width:36px; height:36px; margin:-7px -6px 0 0;
  display:grid; place-items:center;
  background:none; border:none; border-radius:50%;
  font-size:26px; line-height:1; color:var(--ph-ink);
}
.ph-hjaelp__luk:hover{ background:rgba(25,28,26,.08); }
.ph-hjaelp__luk:focus-visible{ outline:2px solid var(--ph-blue); outline-offset:1px; }

/* Siger hvad panelet ER, før nogen når at skrive "hej kan I hjælpe". */
.ph-hjaelp__uddyb{
  margin:6px 20px 0; padding-bottom:14px;
  font-size:14px; line-height:20px; color:var(--ph-muted);
  border-bottom:1px solid rgba(25,28,26,.14);
}

.ph-hjaelp__krop{
  flex:1 1 auto; overflow-y:auto;
  padding:14px 20px 4px;
  font-size:17px;              /* opløser 62ch som i §17.3 — binder ikke her */
  -webkit-overflow-scrolling:touch;
}
/* Listen fylder panelets bredde; 62ch-loftet fra §17.3 er bredere end panelet
   og binder derfor aldrig. Kanten øverst kommer fra uddyb-linjen i stedet. */
.ph-hjaelp__krop .ph-faq__liste{ border-top:none; max-width:none; }
.ph-hjaelp__krop .ph-faq__vaerktoej{ max-width:none; margin-bottom:14px; }
.ph-hjaelp__krop .ph-faq__intet{ max-width:none; }
.ph-hjaelp__krop .ph-faq__sum{ padding:14px 34px 14px 0; }
.ph-hjaelp__krop .ph-faq__sp{ font-size:16px; line-height:23px; }
.ph-hjaelp__krop .ph-faq__svar{ padding:0 34px 16px 0; }
.ph-hjaelp__krop .ph-faq__svar p{ font-size:16px; line-height:24px; }
/* Ét forslag pr. række i panelet — to kolonner ville give ~170px spalter. */
.ph-hjaelp__krop .ph-faq__forslag{ grid-template-columns:1fr; }
.ph-hjaelp__fejl{ margin:0; font-size:16px; line-height:24px; }
.ph-hjaelp__fejl a{ color:var(--ph-ink); text-decoration:underline; text-underline-offset:3px; }

.ph-hjaelp__bund{
  flex:0 0 auto; padding:12px 20px 16px;
  border-top:1px solid rgba(25,28,26,.14);
}
.ph-hjaelp__bund a{
  font-size:15px; font-weight:600; color:var(--ph-ink);
  text-decoration:underline; text-underline-offset:3px;
}
.ph-hjaelp__bund a:hover{ text-decoration-thickness:2px; }

@media (max-width:640px){
  /* ⛔ PANELET FYLDER SKÆRMEN PÅ MOBIL (Jonas). Et lille hjørnepanel på en
     telefon giver hverken plads til søgefelt, liste og svar på én gang — og
     det ville efterlade en stribe side udenom, som man rammer i stedet for
     panelet. */
  .ph-hjaelp__panel{
    inset:0; right:auto; bottom:auto;
    width:100%; max-width:none; max-height:none; height:100%;
    border-radius:0;
  }
  .ph-hjaelp__bagtaeppe{ display:none; }   /* intet at se udenom */
  /* ⛔ UNDERLINJEN VÆK PÅ MOBIL — målt, ikke skønnet. Med den er knappen
     246px bred, altså 66% af en 375px skærm; uden den 198px. Overlinjen
     bærer stadig hele budskabet ("Har du et spørgsmål?"), så det der falder
     bort, er uddybningen — ikke betydningen.
     Samme greb som .ph-trial__lang på forsiden. */
  .ph-hjaelp__knap{ right:14px; bottom:14px; padding:10px 16px 10px 10px; }
  .ph-hjaelp__ord small{ display:none; }
}
   Bygget 2. august 2026 efter Lærkes Styrkeløft klub.png (1366×1262).

   ⚠️ SAMME MØNSTER SOM §17.1 — navy flade med offwhite kort — men med
   sine egne klasser. Det er REGLEN OM TRE: to forekomster er ikke nok til
   at abstrahere, og en fælles klasse ville skulle hedde noget der hverken
   er "firma" eller "klub" og dermed kræve at en netop committet side blev
   lagt om. Kommer der en TREDJE navy-kort-side, skal §17.1 og §18 slås
   sammen til én blok — og så er det den rigtige beslutning, ikke nu.

   Målt @1366: kort x52..682 (631px) og x732..1313 (582px), gap 49,
   rækken centreret på x682,5, radius 24-26, begge kort TOPstillede
   (venstre 713px høj, højre 388px).
   ============================================================ */
.ph-klub{ background:var(--ph-blue); color:var(--ph-offwhite); padding:34px 0 46px; }
.ph-klub__inder{ width:var(--ph-wide); max-width:none; margin:0 auto; }

/* ⚠️ KOLONNERNE ER BEVIDST ULIGE — modsat firmasidens tre.
   Lærkes er 631 og 582, altså 52/48 af rækken. Her er det IKKE
   håndplacering: de to kort har forskellige roller (venstre er
   beskrivelsen, højre er "hvad koster det, og hvordan melder jeg mig"),
   og venstre bærer cirka dobbelt så meget tekst. På firmasiden var de tre
   kort derimod ligeværdige, og dér blev de gjort lige brede. */
.ph-klub__kort{
  display:grid; grid-template-columns:1.08fr 1fr; gap:49px;
  align-items:start;                 /* topstillede — de er ikke lige høje */
}
.ph-klubkort{
  background:var(--ph-offwhite); color:var(--ph-ink);
  border-radius:26px;
  padding:28px 32px 32px;
}
/* 18px/26px = sidens brødtekst. Modsat firmasidens 15px, fordi der er TO
   kort her og ikke tre: spalten er 652px mod firmaets 420, og en smal
   grad i en bred spalte giver 80+ tegn pr. linje. Målt i mockuppen:
   ink 20-21, pitch 26-28. */
.ph-klubkort p{ font-size:18px; line-height:26px; margin:0 0 22px; }
.ph-klubkort p:last-child{ margin-bottom:0; }
.ph-klubkort ul{
  list-style:none; margin:0 0 22px; padding:0;
  font-size:18px; line-height:26px;
}
/* Lærkes punkter står med tankestreg, ikke bullet — gengivet med ::before,
   så tegnet ikke skal skrives ind i hvert <li> og dermed også bliver læst
   op af en skærmlæser. */
.ph-klubkort li{ padding-left:18px; position:relative; }
.ph-klubkort li::before{
  content:'–'; position:absolute; left:0; opacity:.8;
}
.ph-klubkort__titel{
  font-size:18px; font-weight:700; line-height:26px;
  margin:0 0 4px;
}
/* Højre kort er centreret, venstre venstrestillet — som i mockuppen. */
.ph-klubkort--hoejre{ text-align:center; }
.ph-klubkort__mail{ font-weight:700; }
.ph-klubkort__mail a{ color:var(--ph-ink); text-decoration:underline; text-underline-offset:3px; }
/* Den kursive linje er sidens gamle hero-lead. Lærke har flyttet den ned
   som afrunding i højre kort; den står derfor her og ikke øverst. */
.ph-klubkort__note{ font-style:italic; }

@media (max-width:860px){
  .ph-klub__inder{
    width:auto; max-width:var(--ph-max);
    padding-left:var(--ph-gutter); padding-right:var(--ph-gutter);
  }
  /* ⛔ ÉN SPALTE ER IKKE NOK — kortet skal også have et MÅL.
     Her stod der først, at én spalte var i orden fordi teksten er 18px og
     ikke firmakortenes 15px. Det holdt ikke: målt gav 768px et kort på
     705px med 76 tegn pr. linje, mod 46-57 ved alle andre bredder. Den
     større grad flytter grænsen, den fjerner den ikke.
     Med et loft på 600px bliver forløbet 33 (375) / 57 (640) / 60 (768)
     tegn — uden spids. Se den permanente lærdom om mellembredder. */
  .ph-klub__kort{ grid-template-columns:1fr; gap:18px; }
  .ph-klubkort{
    padding:24px 22px 26px;
    max-width:600px; margin-inline:auto;
  }
  .ph-klubkort p, .ph-klubkort ul{ font-size:17px; line-height:25px; }
}

/* ---------- 19. CONTENT OG KAMERA ---------- */
/* Lærkes design, målt i Content og kamera.png (1366×1079, fyldt med tekst
   7. august 2026 — den var tom indtil da).

   ⛔ OMVENDT AF §17.1 OG §18. De to er navy flade med offwhite kort; det her
   er offwhite flade med NAVY kort. Det er derfor en selvstændig blok og ikke
   en tredje bruger af firma/klub-mønsteret — "reglen om tre" gælder samme
   mønster, ikke dets spejlbillede. Kommer der en side mere med navy kort på
   offwhite, skal denne og .ph-centres (§10.4) ses efter sammen.

   MÅLT I MOCKUPPEN @1366:
     kort 1        x102..650  = 549 × 357
     kort 2        x715..1263 = 549 × 488   (topstillede, ulige høje)
     gap           64
     rækken        x102..1263 = 1162, centrum 682,5 mod sidens 683
     radius        ~6 (inset 6px ved kortets øverste række, 0 ved dy=5)
     top-padding   26  (kort-top -> overskriftens ink)
     overskrift    ink 16, versaler, centreret
     brødtekst     ink 15-17, pitch 25, én tom linje mellem afsnit (pitch 50)
     tekstspalte   87,6% af kortbredden -> 34px vandret padding
     bund-padding  26 (kort 1) / 32 (kort 2)
     henvisning    50px under kortene, centreret

   ⚠️ KORTENE ER BREDERE END MOCKUPPENS 549 — de spænder --ph-wide og bliver
   620,25px. Det følger den lukkede --ph-wide-beslutning: undersider bruger
   sitets fælles bredde, ikke deres egen mockups. Præcis samme afvigelse som
   Jobs-kortene (571 -> 619,5). Den vandrette padding er derfor sat som andelen
   6,2% af kortbredden og ikke som mockuppens 34px, så tekstspalten bevarer
   sine 87,6%. */
.ph-ck{ background:var(--ph-offwhite); padding:36px 0 50px; }
.ph-ck__grid{
  width:var(--ph-wide); max-width:none; margin:0 auto;
  display:grid; grid-template-columns:1fr 1fr; gap:64px;
  align-items:start;              /* topstillede — kort 2 er 131px højere */
}
.ph-ck__kort{
  background:var(--ph-blue); color:#fff;
  border-radius:6px;
  padding:26px 6.2% 26px;
  text-align:center;
}
/* 22px giver ink 16 = mockuppens. ⚠️ Jag ikke GRADEN hvis fonten skifter —
   målet er ink-højden, ligesom på Jobs-kortene. */
.ph-ck__titel{
  font-size:22px; line-height:1.2; font-weight:700;
  text-transform:uppercase; letter-spacing:0.01em;
  margin:0 0 24px;                /* 24 = overskrifts-ink til første tekst-ink */
}
/* Marginen er ÉN linje (25px), fordi mockuppens afstand mellem to afsnit er
   pitch 50 mod 25 inde i et afsnit. */
.ph-ck__kort p,
.ph-ck__liste{ font-size:17px; line-height:25px; margin:0 0 25px; }
.ph-ck__kort > *:last-child{ margin-bottom:0; }
/* Punkterne står uden markør og centreret i mockuppen. <ul> er beholdt for
   semantikkens skyld — det ER en liste, uanset at den ikke ser ud som en. */
.ph-ck__liste{ list-style:none; padding:0; }
.ph-ck__kort a{ color:#fff; text-decoration:underline; text-underline-offset:2px; }
.ph-ck__kort a:hover{ text-decoration-thickness:2px; }

.ph-ck__henvis{
  margin:50px auto 0; text-align:center;
  font-size:17px; line-height:25px; color:var(--ph-ink);
}
/* ⛔ UNDERSTREGNINGEN ER IKKE PYNT. Uden den arver de to links brødtekstens
   farve præcist — målt kontrast 1,0 mod den omgivende tekst, samme vægt,
   ingen understregning — altså et link der er umuligt at se. Lærkes egen
   linje har "her" som det klikbare og er lige så umarkeret i mockuppen; det
   er en fejl i designet, ikke et udtryk vi skal genskabe. Farve alene ville
   desuden ikke være nok (WCAG 1.4.1). */
.ph-ck__henvis a{ color:inherit; text-decoration:underline; text-underline-offset:2px; }
.ph-ck__henvis a:hover{ text-decoration-thickness:2px; }

@media (max-width:860px){
  /* Samme fallback som sitets øvrige sektioner: under knækpunktet giver
     --ph-wide for lidt luft i siderne. */
  .ph-ck__grid{
    width:auto; max-width:var(--ph-max);
    padding-inline:var(--ph-gutter); gap:24px;
  }
  .ph-ck__kort{ padding-inline:24px; }
}
@media (max-width:640px){
  /* ⛔ ÉN SPALTE KRÆVER ET LOFT — se den permanente lærdom om mellembredder.
     Uden max-width ville ét kort blive 592px bredt ved 640 med 17px tekst,
     altså den samme spids som styrkeløft-kortene havde ved 768. Loftet er
     600px som dér, hvor forløbet blev målt glat. */
  .ph-ck__grid{ grid-template-columns:1fr; }
  .ph-ck__kort{ max-width:600px; margin-inline:auto; width:100%; }
}
