/* ============ de schaal ============
   Eén schaal voor ruimte, tekstgrootte en leesbreedte (dagtaak 25-08, V-3).

   Waarom dit blok er staat: border-radius liep al netjes via `--r` en
   `--r-small` per thema, maar ruimte en tekstgrootte niet. Geteld op 25-08:
   24 verschillende lettergroottes, waarvan er ACHT een halve pixel droegen
   (9,5 / 10,5 / ... / 16,5) en gewoon naast elkaar bestonden, plus 28
   verschillende marge- en padding-waarden met losse getallen als 7, 9, 11,
   13, 15 en 17 die op geen enkel raster passen. Dat is geen ontwerp maar
   een geschiedenis: elk scherm dat ooit "net iets kleiner" moest, kreeg
   zijn eigen getal.

   De halve pixels zijn hiermee weg; ze zijn opgetrokken naar de
   dichtstbijzijnde hele stap. Nieuwe regels horen hieronder te kiezen en
   geen nieuw getal te verzinnen.

   AANVULLING 28-08 (D-1). Dit blok stond er wel, maar werd NUL keer
   gebruikt: `var(--sp-` en `var(--ts-` kwamen in het hele bestand niet voor,
   en ook in geen enkel sjabloon. Het was dus documentatie en geen regel, en
   dat is van buiten niet te onderscheiden van een regel die geldt. Erger:
   de zin hierboven dat de halve pixels weg waren, klopte alleen voor dit
   bestand -- er zaten er nog dertien als inline stijl in negen sjablonen en
   één in de clamp van `.pk-vraag`.

   Nu gebruikt het stijlblad de schaal echt: 139 lettergroottes en 127
   ruimtewaarden lopen erlangs. Alleen EXACTE treffers zijn omgezet, dus er
   is geen enkele gerenderde waarde veranderd; dat is nagerekend door de
   tokens terug te vertalen en het resultaat regel voor regel met de vorige
   versie te vergelijken. Waarden die niet op een stap vallen (22, 26, 36,
   44px) houden hun getal: een token verzinnen dat niet bestaat is erger dan
   een eerlijke uitzondering. Shorthands met meerdere waarden
   (`margin:12px 0 4px`) blijven ook staan -- daar leest een token slechter
   dan een getal, en leesbaarheid is het hele doel. */
:root{
  /* ruimte: 4 / 8 / 12 / 16 / 24 / 32 / 48 */
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;
  /* T-1 (31-08): --sp-5 en --sp-6 stonden hier en werden nul keer
     gebruikt, terwijl de rauwe waarde 22px zes keer als ruimte in
     precies dat bereik voorkwam. Een ladder met treden waar niemand
     op stapt, nodigt uit tot een eigen getal; dat is de fout die het
     bovenstaande commentaar al eens beschrijft. Nu lopen die zes
     plekken via de trede. */
  --sp-5:24px;--sp-6:32px;--sp-7:48px;
  /* tekst: van bijschrift tot paginakop */
  --ts-1:11px;--ts-2:12px;--ts-3:13px;--ts-4:14px;--ts-5:15px;
  --ts-6:16px;--ts-7:17px;--ts-8:20px;--ts-9:24px;
  /* De grote maten (04-09, P3-7): stonden zeven keer rauw in het bestand
     (26, 36 en 44 px). Op de schaal, zodat een wijziging één plek is. */
  --ts-10:26px;--ts-11:36px;--ts-12:44px;
  /* De vraagtekst heeft een eigen maat en dat is bewust (T-5/DO-5, 29-08
     avond). Hij schaalt met het scherm en past daarom niet op de vaste
     --ts-trap; wat er ontbrak was dat de drie getallen 19/21/25 kaal in het
     stijlblad stonden, terwijl dit het onderdeel is dat de deelnemer het
     vaakst ziet. Nu dragen ze een naam en staan ze bij de andere maten. */
  --ts-vraag-min:19px;--ts-vraag-max:25px;--ts-vraag-compact-max:21px;
  /* En één marge voor de vraagtekst, in plaats van zeven verschillende
     inline waarden verspreid over de sjablonen (16px, 18px, 12px, geen). */
  --sp-vraag:var(--sp-3);
  /* leesbreedte: twee, niet veertien. `--lees` voor lopende tekst,
     `--lees-breed` voor een inleiding of een brede kaart. */
  --lees:52ch;--lees-breed:60ch;
  /* De kaartbreedte stond 52 keer als vaste 640px in de sjablonen
     (14-09). Px schaalt niet mee als iemand zijn basislettergrootte
     vergroot, en juist dan is een leeskolom het hardst nodig. 40rem
     is bij de standaardgrootte exact diezelfde 640px, maar groeit
     mee. Bewust niet --lees-breed: 60ch is ruim smaller en zou 52
     schermen zichtbaar versmallen zonder dat iemand daarom vroeg. */
  --lees-kaart:40rem;
  /* Regelhoogte was als enige van de drie schalen nooit tot een trap
     gemaakt: elf losse waarden naast elkaar, terwijl tekstgrootte en
     ruimte dat wel zijn (14-09). Deze vier dekken de vier meest gebruikte
     waarden exact, zodat er niets van uiterlijk verandert: dertien van de
     eenentwintig declaraties lopen nu via een token. Wat overblijft is
     1.1, 1.15, 1.3, 1.4, 1.42, 1.45 en 1.75, elk een of twee keer. Die
     naar de dichtstbijzijnde trede trekken zou de regelafstand van die
     blokken zichtbaar wijzigen, en daar vroeg niemand om; een token per
     eenmalige waarde is geen schaal maar ruis. */
  --rh-strak:1;--rh-kop:1.2;--rh-tekst:1.5;--rh-ruim:1.55;
}

/* ============ basis ============ */
*{box-sizing:border-box}
/* Het hidden-attribuut wint altijd — ook van display:flex/inline op dezelfde
   elementen (welkomsttour-knoppen stapelden anders op elkaar). */
[hidden]{display:none!important}
html{-webkit-text-size-adjust:100%}
body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  font-size:var(--ts-6);line-height:var(--rh-ruim);min-height:100vh;
  /* clip i.p.v. hidden: geen scrollcontainer, dus position:sticky blijft werken */
  overflow-x:clip}
/* Brede inhoud (tabellen, spinnenweb) scrollt in z'n eigen bakje; de pagina
   zelf mag nooit horizontaal scrollen. */
.tabelscroll{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch;
  /* Een schaduw aan de kant waar nog tabel staat. Zonder dit ziet een brede
     tabel er op een telefoon compleet uit terwijl er het meeste buiten beeld
     staat: `table.tijdlijn` is 900px breed en de kaart op een toestel van
     320px is er 264, dus 636px ziet niemand. Precies het gat dat de kopbalk
     op 20-08 dichtte ("zonder de vervaging rechts leek de balk compleet").
     Hier geen `mask-image` zoals daar, want dat vervaagt ook een tabel die
     al helemaal is doorgeschoven. Dit is de oude truc met twee lagen: de
     dekkende laag in --card scrollt MEE (`local`) en schuift aan de rand
     waar niets meer staat over de schaduw heen, de schaduw zelf staat STIL
     (`scroll`). Geen JavaScript, en zonder JS werkt hij dus ook. */
  background:
    linear-gradient(to right,var(--card) 60%,transparent) left center / 34px 100% no-repeat local,
    linear-gradient(to left,var(--card) 60%,transparent) right center / 34px 100% no-repeat local,
    radial-gradient(farthest-side at 0 50%,color-mix(in srgb,var(--ink) 22%,transparent),transparent) left center / 12px 100% no-repeat scroll,
    radial-gradient(farthest-side at 100% 50%,color-mix(in srgb,var(--ink) 22%,transparent),transparent) right center / 12px 100% no-repeat scroll}
.tabelscroll:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.wrap{max-width:880px;margin:0 auto;padding:0 20px 60px;position:relative;z-index:1}
a{color:inherit}
/* Alleen voor schermlezers: uit beeld, maar wel voorgelezen en focusbaar. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* Sla de vaste kop over; onzichtbaar tot hij focus krijgt (WCAG 2.4.1). */
.skip-link{position:absolute;left:-9999px;top:0;z-index:100;
  background:var(--card);color:var(--ink);border:2px solid var(--accent);
  border-radius:0 0 var(--r-small) 0;padding:12px 18px;text-decoration:none;
  font-size:var(--ts-5)}
.skip-link:focus{left:0}
/* Elke afbeelding blijft binnen zijn kolom (02-09). Er was geen globale
   img-regel; de vier foto's op /fotos steunden alleen op het HTML-attribuut
   width en een max-width op de omhullende div. Svg's hebben die bescherming
   wel.
   VERPLAATST op 10-09 (dagelijkse ronde, P2): deze regel stond binnen
   `@media (max-width:700px)`, één niveau diep, en gold dus alleen op de
   telefoon -- precies omgekeerd aan wat het commentaar erboven beweerde.
   Boven 700px bestond de bescherming nog steeds niet. Nageteld met een
   accolade-teller op het commentaarvrije bestand. Nu staat hij waar hij
   hoort: bij de basis, vóór elke media-tak. */
img{max-width:100%;height:auto}
/* --rule-sterk in plaats van --rule (dagtaak 20-08): de rand is in rust het
   enige dat een invoerveld als vak herkenbaar maakt, en met --rule haalde
   hij 1,3-1,5:1 tegen veld en kaart (eis 3:1, WCAG 1.4.11). Zelfde correctie
   als .opt, .tabbar, .deelknop en .optkeuze label eerder kregen. */
input[type=text],input[type=password],input[type=email],input[type=number],input[type=tel],textarea,select{font:inherit;font-size:var(--ts-5);padding:10px 13px;
  border:1px solid var(--rule-sterk);background:var(--field);color:var(--ink);border-radius:var(--r-small);width:100%}
/* Een veld dat fout is, ziet er ook fout uit. Tot 17-09 stond hier niets:
   de sjablonen zetten netjes `aria-invalid="true"`, maar het stijlblad deed
   daar niets mee, dus een fout veld had exact dezelfde rand als een goed
   veld. Het foutblok eronder is wel duidelijk (4,67:1 tot 5,93:1), maar dat
   zegt WAT er mis is en niet WELK veld het is; op een formulier met twee
   velden is dat raden. De rand is een bedieningselement, dus de eis is 3:1;
   nagerekend --stop op --field: 5,47:1 (v), 7,55 (m), 5,33 (n), 6,50 (admin).
   Dikker dan de gewone rand, want kleur alleen mag nooit de enige drager
   zijn (WCAG 1.4.1) en niet iedereen ziet het verschil tussen twee tinten. */
input[aria-invalid="true"],textarea[aria-invalid="true"],select[aria-invalid="true"]{
  border-width:2px;border-color:var(--stop);padding:9px 12px}
textarea{resize:vertical;line-height:var(--rh-tekst)}
/* Meegroeiend tekstvak: de tekst blijft altijd in zijn geheel leesbaar —
   het vak wordt hoger in plaats van dat de zin wegscrolt. De hoogte zelf
   zet het script (base.html); deze regels zorgen dat er nooit een
   scrollbalk of afgeknipte regel verschijnt. */
textarea.groeit{resize:none;overflow:hidden;min-height:44px}

/* Denk-mee-blok onder de vraag: zichtbaar en uitnodigend, maar rustig
   genoeg om de vraag zelf niet te overstemmen. */
.denkmee{margin:18px auto 0;max-width:var(--lees);text-align:center;padding:14px 16px;
  border:1.5px dashed var(--accent);border-radius:var(--r);background:var(--field)}
.denkmee-kop{margin:0;font-weight:700;font-size:var(--ts-5);color:var(--ink)}
.denkmee-tekst{margin:6px 0 10px;font-size:var(--ts-4);color:var(--soft);line-height:var(--rh-tekst)}
@media (max-width:700px){.denkmee{margin-top:14px;padding:var(--sp-3)}}
/* "Deze vraag is me niet duidelijk" (10-08). Bewust klein en zacht: het mag
   niet concurreren met het beantwoorden van de vraag zelf, maar wel gevonden
   worden. De knop erft .linkknop en heeft daarmee al min-height:44px. */
.snapniet{margin:10px 0 0;text-align:center}
.snapniet-knop{font-size:var(--ts-3);color:var(--soft);text-decoration:underline;
  text-underline-offset:3px}
.snapniet-knop[aria-pressed="true"]{color:var(--ink);text-decoration:none;
  font-weight:600}
.snapniet-bevestiging{display:block;margin-top:var(--sp-1);font-size:var(--ts-3);
  color:var(--ink);max-width:var(--lees);margin-left:auto;margin-right:auto}

/* "Dit staat nog op slot" — zonder de tekst onleesbaar te maken (10-08).
   Hier stond `style="opacity:.55"` of `.75` om een vergrendelde regel te
   dempen. Dat dimt ook de tekst: --soft op wit is 5,5:1, maar door .55 heen
   nog 2,3:1, en op /samen bleef er van 4,5:1 nog 3,4:1 over. Juist de regel
   die uitlegt WAAROM iets op slot zit werd daarmee het slechtst leesbaar.
   Nu dempen we alleen wat versiering is: het icoon en de omlijsting. De
   tekst houdt zijn eigen, al doorgerekende kleur. */
.gedimd{color:var(--soft)}
/* De balk dimt NIET mee (dagtaak 29-08 avond, D-8). Toen dit blok op 10-08
   werd geschreven gold "we dempen alleen wat versiering is", en een balkje
   leek versiering. Dat is het hier niet: templates/samen_meer.html rendert
   binnen een gedimde rij een `<span class="dtrack mini" role="meter"
   aria-valuenow=...>` met de voortgang van een onderwerp dat nog op slot
   zit. Met opacity:.6 zakt de rand die dat vak herkenbaar maakt naar
   ongeveer 2,0-2,3:1, waar WCAG 1.4.11 voor een grafisch onderdeel 3:1
   vraagt -- en dat is precies het contrast dat elders in dit bestand met
   zorg op 3,60-4,62:1 is gezet. Wat een waarde draagt, dimt niet mee. */
.gedimd > [aria-hidden="true"]{opacity:.6}
.gedimd b, .gedimd strong{color:var(--ink)}

/* .zacht en .klein bestonden NERGENS in deze stylesheet, terwijl zeventien
   plekken in drie sjablonen ze wel gebruikten (defect P3-B, 12-08). Alleen
   `.chip.klein` en `.btn.klein` waren gedefinieerd; een kale `class="klein"`
   of `class="zacht"` deed dus niets, en tekst die gedempt en klein bedoeld
   was stond in volle broodtekst. Dezelfde kleur als .gedimd — die is al
   doorgerekend op AA — en één stap kleiner, niet meer, want onder de 14px
   wordt het op een telefoon onleesbaar. */
.zacht{color:var(--soft)}
.zacht b, .zacht strong{color:var(--ink)}
p.klein, span.klein, div.klein, li.klein{font-size:var(--ts-4);line-height:var(--rh-tekst)}

/* Werkt JavaScript, dan toont de tour één kaart tegelijk; zonder JS staan
   ze allemaal onder elkaar en zijn de stapknoppen weg (de submit-knoppen
   blijven, zodat niemand vastloopt). */
html.js .tour-kaart:not(.tour-actief){display:none}
html:not(.js) .alleen-js{display:none!important}
input:focus-visible,button:focus-visible,textarea:focus-visible,select:focus-visible,a:focus-visible{
  outline:2px solid var(--accent);outline-offset:2px}
/* Elementen die géén knop of link zijn maar zich wel zo gedragen (de
   omdraaibare praatkaart is een div met role="button") vielen buiten de regel
   hierboven en hadden dus geen zichtbare focus (review 07-08, WCAG 2.4.7). */
[tabindex="0"]:focus-visible,[role="button"]:focus-visible{
  outline:2px solid var(--accent);outline-offset:3px}
/* Placeholder-kleur expliciet vastleggen in plaats van aan de browser
   overlaten: --soft haalt in alle drie de thema's ruim 4,5:1 op --field. */
input::placeholder,textarea::placeholder{color:var(--soft);opacity:1}
button{font:inherit;cursor:pointer}

header.site{display:flex;justify-content:space-between;align-items:center;gap:var(--sp-4);
  padding:var(--sp-5) 0 16px;border-bottom:1px solid var(--rule);margin-bottom:26px}
.brand{font-family:var(--display);font-size:var(--ts-8);text-decoration:none;color:var(--ink);letter-spacing:.01em}
/* `position:relative` is hier geen opmaak maar een hek (D-18-09-18, 18-09).
   De nav schuift op een telefoon horizontaal binnen zichzelf (overflow-x
   auto, zie de media-regel verderop), en dat werkt voor alles wat gewoon
   meeschuift. Maar in de nav staan `.sr-only`-spans (de tekst bij de
   bericht- en feedbackstip), en die zijn `position:absolute` zonder eigen
   coordinaten. Was de nav niet zelf gepositioneerd, dan lag hun containing
   block hoger in de boom en KLIPTE de nav ze niet: het 1 bij 1 pixel grote
   vakje bleef op x=581 staan en rekte daarmee de hele pagina op.

   Gemeten op een telefoon van 390 px: het document was 582 px breed, dus
   elk ingelogd scherm schoof horizontaal. Niet de nav, de hele pagina. Met
   deze ene regel: 390. In de browser gemeten, niet beredeneerd. */
header.site nav{position:relative;display:flex;gap:var(--sp-4);align-items:center;font-size:var(--ts-4);color:var(--soft)}
header.site nav a{color:var(--soft);text-decoration:none;white-space:nowrap}
header.site nav a:hover{color:var(--ink)}
.taalopties{display:inline-flex;align-items:center;gap:var(--sp-1)}
.taalmenu .navknop,.brand{white-space:nowrap}
/* De 🌐-knop klapt het taalmenu open op smalle schermen. Op breed scherm is
   de lijst altijd zichtbaar en is de knop overbodig, dus verborgen. */
.taalbol{background:none;border:0;padding:var(--sp-1);font:inherit;font-size:var(--ts-5);
  line-height:var(--rh-strak);cursor:pointer;color:var(--soft);display:none}
.taalbol:focus-visible{outline:2px solid var(--accent);outline-offset:2px;
  border-radius:var(--r-small)}
/* Uitloggen is een POST: het mini-formulier in de nav oogt als de links ernaast. */
header.site nav form.navform{display:inline;margin:0}
header.site nav button.navknop{background:none;border:0;padding:0;font:inherit;
  color:var(--soft);cursor:pointer}
header.site nav button.navknop:hover{color:var(--ink)}
/* Knop die eruitziet als een gewone tekstlink (voor POST-acties in lopende tekst). */
form.inlineform{display:inline;margin:0}
/* padding + min-height: als tekstlink vormgegeven, maar wél een tikdoel.
   Gemeten op 08-08 bij 375px: de vijf "gezien"-knoppen op /samen waren 25px
   hoog, ruim onder de 44px die het project elders wél aanhoudt. */
button.linkknop{background:none;border:0;padding:11px 4px;min-height:44px;min-width:44px;justify-content:center;
  display:inline-flex;align-items:center;font:inherit;color:inherit;
  text-decoration:underline;cursor:pointer}
/* Chip die als link dienstdoet: dezelfde ondergrens. Stond eerder als
   inline `style="padding:3px 10px"` in samen.html en werd daarmee 26px. */
.chip.klein{min-height:44px;display:inline-flex;align-items:center;
  padding:0 10px}
.me{font-weight:600;color:var(--ink)}
footer.site{margin-top:var(--sp-7);padding-top:18px;border-top:1px solid var(--rule);
  font-size:var(--ts-3);color:var(--soft)}
/* Zelfde padding-truc als header.site nav a: de voettekstlink stond op 16px
   hoog (dagtaak 10-08). Inline-block, anders doet verticale padding niets. */
footer.site a{color:var(--soft);display:inline-block;padding:14px 2px}

/* ============ thema: vrouw ============ */
.theme-v{
  --display:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
  --bg1:#FFF6F7;--bg2:#FBEDF3;--card:#FFFFFF;--field:#FFFDFD;
  /* Contrast (review 05-08): --soft, --accent en --stop waren te licht voor
     WCAG AA op wit (4,27 / 3,38 / 3,91:1). Verdiept zonder de warme
     kleurindruk te verliezen: nu 4,6-4,9:1 voor secundaire tekst, knoppen
     en foutmeldingen. --accent-2/--glow blijven licht (vlakken, geen tekst). */
  --ink:#4A2E39;--soft:#875A6B;--bijschrift:#875A6B;--rule:#F0D9E1;
  /* Interactieve randen (antwoordknoppen, keuzepillen) moeten 3:1
     halen tegen het veldvlak; --rule alleen is daarvoor te licht.
     Zie review 06-08 (WCAG 1.4.11). */
  /* 58% en niet 52% (P2-3, 11-09). Eerdere rondes rekenden deze rand alleen
     door tegen --card, en daar haalde 52% de eis ruim. De voortgangsbalkjes op
     het vraagscherm zetten hem echter tegen --rule, en daar kwam hij uit op
     2,70 (theme-v) en 2,72 (theme-n) bij een eis van 3,0; tegen --glow op 2,95.
     Bij 58% wordt dat 3,09 en 3,13 tegen --rule, 3,38 tegen --glow, en tegen
     --card gaat hij van 3,60 naar 4,13. Alle vier de thema's halen de eis nu op
     alle drie de ondergronden, en geen enkel al goedgekeurd paar gaat erop
     achteruit. Nagerekend met de WCAG-luminantieformule, niet geschat. */
  --rule-sterk:color-mix(in srgb,var(--ink) 58%,var(--rule));
  --accent:#B94A70;--accent-2:#F5CBD9;--glow:#F9E3EB;
  /* --gray een tint dieper (was #A79098): de gestippelde rand van .tag.prive
     haalde 2,96:1 tegen de witte kaart, net onder de 3:1 voor een grafisch
     element (gemeten 08-08). Nu 3,42:1. */
  --sage:#7FA88B;--amber:#CE9B5C;--lav:#A98BC9;--stop:#A94A52;--gray:#998794;
  --stand-groen-rand:color-mix(in srgb,var(--sage) 70%,var(--ink));--stand-groen:color-mix(in srgb,var(--sage) 35%,var(--ink));
  --stand-rood-rand:color-mix(in srgb,var(--stop) 70%,var(--ink));--stand-rood:color-mix(in srgb,var(--stop) 35%,var(--ink));
  --r:22px;--r-small:14px;--shadow:0 10px 30px rgba(217,102,138,.10);
  background:linear-gradient(160deg,var(--bg1),var(--bg2) 60%,#F7EAF2);
  background-attachment:fixed;color:var(--ink)}
/* In dit thema is --card wit en --bg1 bijna wit (1,06:1), dus de rand is
   het enige verschil tussen kaart en pagina. Met --rule haalde die rand
   1,34:1 tegen wit, ver onder de 3:1 voor een betekenisdragende grens
   (P3 14-09). --rule-sterk is hier eerder juist voor ingevoerd. */
.theme-v .card{border:1px solid var(--rule-sterk)}

/* ============ thema: man ============ */
/* Harder gemaakt (besluit Jeroen 05-08): staalblauw accent in plaats van
   mauve, koelere grijzen, koperen highlights — strak en nuchter. */
.theme-m{
  --display:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
  --bg1:#E3E6E8;--bg2:#D8DCDF;--card:#F4F5F6;--field:#FFFFFF;
  --ink:#131E28;--soft:#43535E;--bijschrift:#43535E;--rule:#C2C9CE;
  --rule-sterk:color-mix(in srgb,var(--ink) 58%,var(--rule));
  --accent:#3A607A;--accent-2:#C3D3DE;--glow:#DFE9F0;
  --sage:#5F7A64;--amber:#A9743B;--lav:#6C6288;--stop:#8C3A3A;--gray:#727C84;
  --stand-groen-rand:color-mix(in srgb,var(--sage) 70%,var(--ink));--stand-groen:color-mix(in srgb,var(--sage) 35%,var(--ink));
  --stand-rood-rand:color-mix(in srgb,var(--stop) 70%,var(--ink));--stand-rood:color-mix(in srgb,var(--stop) 35%,var(--ink));
  --r:6px;--r-small:3px;--shadow:0 4px 14px rgba(19,30,40,.10);
  background:var(--bg1);color:var(--ink)}

/* ============ thema: neutraal (bezoekers, nog niet ingelogd) ============ */
/* Warm ivoor met diepgroen accent: uitnodigend zonder naar één kant te
   kleuren — de start- en loginpagina schrikken zo niemand af. */
.theme-n{
  --display:"Iowan Old Style","Palatino Linotype",Palatino,Georgia,serif;
  --bg1:#F7F5F0;--bg2:#EFEAE2;--card:#FFFFFF;--field:#FFFEFC;
  /* Zelfde contrastronde: --soft haalde 4,38:1 op de ivoren achtergrond en
     --accent had nauwelijks marge; beide een tint dieper. */
  --ink:#2E3230;--soft:#5F6B65;--bijschrift:#5F6B65;--rule:#DDD8CE;
  --rule-sterk:color-mix(in srgb,var(--ink) 58%,var(--rule));
  --accent:#3F6C5A;--accent-2:#CBDDD4;--glow:#E4EEE9;
  /* --stop een tint dieper (was #B05050): op de gemengde foutachtergrond
     haalde de oude waarde 4,48:1 waar 4,5 nodig is — als enige van de vier
     thema's. Nu 4,67:1 (gemeten 08-08). --gray een tint dieper om dezelfde
     reden: de gestippelde rand van .tag.prive zat op 2,96:1 (eis 3). */
  --sage:#7FA88B;--amber:#C08A4A;--lav:#8D82A8;--stop:#AA4E4E;--gray:#7F8580;
  --stand-groen-rand:color-mix(in srgb,var(--sage) 70%,var(--ink));--stand-groen:color-mix(in srgb,var(--sage) 35%,var(--ink));
  --stand-rood-rand:color-mix(in srgb,var(--stop) 70%,var(--ink));--stand-rood:color-mix(in srgb,var(--stop) 35%,var(--ink));
  --r:16px;--r-small:10px;--shadow:0 8px 24px rgba(46,50,48,.08);
  background:linear-gradient(160deg,var(--bg1),var(--bg2));
  background-attachment:fixed;color:var(--ink)}

/* ============ thema: admin ============ */
.theme-admin{
  --display:ui-sans-serif,system-ui,sans-serif;
  --bg1:#F4F5F7;--bg2:#E9EBEF;--card:#FFFFFF;--field:#FFFFFF;
  --ink:#1D2530;--soft:#5D6B7A;--bijschrift:#5D6B7A;--rule:#DDE2E8;
  --rule-sterk:color-mix(in srgb,var(--ink) 58%,var(--rule));
  --accent:#3D5A80;--accent-2:#C6D3E3;--glow:#E8EDF4;
  --sage:#4C8055;--amber:#A8752E;--lav:#6B5E96;--stop:#A03D3D;--gray:#7C858C;
  --stand-groen-rand:color-mix(in srgb,var(--sage) 70%,var(--ink));--stand-groen:color-mix(in srgb,var(--sage) 35%,var(--ink));
  --stand-rood-rand:color-mix(in srgb,var(--stop) 70%,var(--ink));--stand-rood:color-mix(in srgb,var(--stop) 35%,var(--ink));
  --r:10px;--r-small:6px;--shadow:0 2px 10px rgba(29,37,48,.06);
  background:var(--bg1);color:var(--ink)}

/* ============ zwevende hartjes ============ */
.hearts{position:fixed;inset:0;pointer-events:none;overflow:hidden;z-index:0}
.hearts span{position:absolute;bottom:-40px;font-size:var(--ts-9);
  color:var(--accent-2);opacity:0;
  animation:floatup linear infinite}
@keyframes floatup{
  0%{transform:translateY(0) rotate(0deg);opacity:0}
  12%{opacity:.35}
  85%{opacity:.18}
  100%{transform:translateY(-110vh) rotate(28deg);opacity:0}}
/* De zwevende merkjes dragen de zachte toon van de oude hartjes:
   CSS wint van het stroke-attribuut in de SVG. */
.hearts span svg path{stroke:var(--accent-2)}
.hearts span svg circle{fill:var(--accent-2)}
/* ============ het kloppende merk ============ */
/* Verzoek Jeroen 11-08: het hart met het deurtje mag af en toe bewegen
   zoals sommige oude hartjes deden. Spaarzaam gebruiken (logo.merk met
   klop=true): een klop is een accent, geen behang. */
svg.merk-klop{animation:merkklop 1.7s ease-in-out infinite;
  transform-origin:50% 55%}
@keyframes merkklop{
  0%,100%{transform:scale(1)}
  14%{transform:scale(1.13)}
  28%{transform:scale(1.02)}
  42%{transform:scale(1.09)}}
@media (prefers-reduced-motion:reduce){svg.merk-klop{animation:none}}
/* ============ het levende huis (fase 5) ============ */
/* De doorsnede is in de huisronde van 19-08 vervangen door de plattegrond in
   templates/huisbeeld.html, met een eigen aan-animatie op `.hs-schijn`
   (verderop in dit bestand). De regels die hier stonden hingen aan
   `.hs-doorsnede`, `.licht` en `.hs-tuin` — drie klassen die daarna in geen
   enkel sjabloon meer voorkwamen, dus ze deden niets. Weg (P3, 21-08).
   `@keyframes hs-erin` blijft: die wordt hieronder nog gebruikt door het
   meubelstuk van een ingerichte kamer. */
@keyframes hs-erin{from{opacity:0}to{opacity:1}}
/* De mist drijft heel licht — een kamer die nog ontdekt wil worden. */
.hs-mist svg g{animation:hs-mistdrift 7s ease-in-out infinite alternate}
@keyframes hs-mistdrift{from{transform:translateX(-1.2px)}
  to{transform:translateX(1.2px)}}
/* Stof dwarrelt heel traag — een kamer die om een nieuwe blik vraagt. */
.hs-stofjes{animation:hs-stofdrift 9s ease-in-out infinite alternate}
@keyframes hs-stofdrift{from{opacity:.45;transform:translateY(.6px)}
  to{opacity:.9;transform:translateY(-.9px)}}
@media (prefers-reduced-motion:reduce){.hs-stofjes{animation:none}}
/* De echo (5.27): zacht ingesprongen, zodat hij als terzijde leest. */
.hs-echo{border-left:2px solid var(--accent-2);padding-left:10px}
/* Een ingerichte kamer draagt warm licht en zijn eigen meubelstuk. */
.hs-kamer.ingericht{background:var(--glow);border-color:var(--accent)}
.hs-kamer .hs-meubel{margin-left:6px;display:inline-block;
  animation:hs-erin 1.2s ease both}
@media (prefers-reduced-motion:reduce){
  .hs-kamer .hs-meubel{animation:none}
  .hs-mist svg g{animation:none}
}
/* ============ beweging en onderbreking (ontwerpopdracht 01-09) ===========
   Gevraagd: meer interactie, pop-ups en bewegende onderdelen. Alles hier
   houdt zich aan twee randen die de rest van dit stijlblad ook al kent:

     * wie `prefers-reduced-motion` aan heeft, krijgt hetzelfde scherm zonder
       beweging. Niet een beetje minder: geen;
     * niets hangt af van JavaScript voor de INHOUD. Bewegen mag, verbergen
       niet. Een kaart die zonder script onzichtbaar blijft, is een kapotte
       pagina voor wie scripts blokkeert.

   Waarom een frequentiegrens bij de onderbreking en niet alleen mooie
   vormgeving: dit product ontleent zijn geloofwaardigheid aan rust. Eén kaart
   midden op het scherm per week is een gebeurtenis; drie per sessie maakt er
   een website van. De grens zit in de code (`onderbreking_van_de_week`), niet
   in de smaak van wie hem aanroept. */

/* De dagkaart komt binnen in plaats van er te staan. */
.komt-binnen{animation:binnenkomst .5s cubic-bezier(.22,.9,.3,1) both}
@keyframes binnenkomst{
  from{opacity:0;transform:translateY(14px) scale(.985)}
  to{opacity:1;transform:none}
}

/* De onthulling draait om. Twee vlakken op één plek; zonder script staat de
   achterkant er gewoon, want `.omslag` krijgt zijn hoogte van de inhoud. */
.omslag{position:relative;perspective:1200px}
.omslag .kant{backface-visibility:hidden;transition:transform .55s cubic-bezier(.3,.9,.3,1)}
.omslag.om .kant.voor{transform:rotateY(180deg)}
.omslag .kant.achter{position:absolute;inset:0;transform:rotateY(180deg)}
.omslag.om .kant.achter{transform:none}
/* Zonder JavaScript bestaat het omdraaien niet en staan beide kanten gewoon
   onder elkaar. Dat is minder mooi en even bruikbaar. */
html:not(.js) .omslag .kant.achter{position:static;transform:none;margin-top:var(--sp-3)}

/* Het zachte berichtje rechtsonder. Nooit modaal: het legt niets stil, het
   vangt geen focus, en het is weg te klikken. */
/* `bottom:76px` en niet 16: de zwevende feedbackknop staat rechtsonder op
   18px (op smal scherm 12px) en is 44px hoog. Een opduikmelding op 16px legde
   zich daar bovenop, en met z-index 60 tegen 20 won de melding. Dezelfde
   correctie die `#pwa-vraag` op 20-08 al kreeg, nu voor elke opduikmelding. */
.opduik{position:fixed;right:16px;bottom:76px;z-index:60;max-width:min(360px,calc(100vw - 32px));
  background:var(--card);border:1px solid var(--rule);border-radius:var(--r-small);
  box-shadow:var(--shadow);padding:var(--sp-3) var(--sp-4);
  animation:opduiken .45s cubic-bezier(.22,.9,.3,1) both}
/* P3-11 (15-09): ruimte voor de sluitknop, die absoluut in de hoek staat.
   Bij de langere vertalingen van laat_kicker kon de eerste tekstregel op
   320 px tot in het tikdoel van 44 px lopen. */
.opduik .kicker{padding-right:38px}
.opduik .weg{position:absolute;top:4px;right:4px}
@keyframes opduiken{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
@media (max-width:480px){.opduik{left:16px;right:16px;max-width:none}}

/* Het kiertje: één regel die zacht verschijnt onder de vraag die je net
   beantwoordde. Geen sprong, geen nieuw scherm. */
.kiertje{animation:kier .6s ease both;border-left:2px solid var(--accent-2);
  padding-left:var(--sp-3);margin-top:var(--sp-3)}
@keyframes kier{from{opacity:0;transform:translateX(-6px)}to{opacity:1;transform:none}}

/* De kamers van het huis reageren op aanwijzen én op toetsenbordfocus. Focus
   staat er met opzet bij: een effect dat alleen op hover zit, bestaat niet
   voor wie met het toetsenbord loopt. */
a.hs-raam,a.hs-kist{transition:filter .25s ease,opacity .25s ease}
a.hs-raam:hover,a.hs-raam:focus-visible,
a.hs-kist:hover,a.hs-kist:focus-visible{filter:brightness(1.08) saturate(1.1)}

@media (prefers-reduced-motion:reduce){
  .komt-binnen,.opduik,.kiertje{animation:none}
  .omslag .kant{transition:none}
  a.hs-raam,a.hs-kist{transition:none}
}

/* ============ telefoon ============ */
/* Zelfde pagina, andere maat: op een smal scherm moet de vraag mét knoppen in
   één oogopslag passen. Alles wat daarboven ruimte vrat wordt compact. */
/* De kopbalk knelt eerder dan de telefoon-drempel. Gemeten op 08-08: bij een
   venster van 716px liep de nav door tot x=796 en vielen FR, ES en 中文 buiten
   beeld — en omdat body op `overflow-x:clip` staat, komt er geen scrollbalk,
   dus die drie talen waren onbereikbaar met muis én met vinger. De band liep
   van 701px (waar de mobiele behandeling ophield) tot ongeveer 813px.
   De grens ligt nu op 880px: dat is de max-width van .wrap, dus daarboven
   kan de balk per definitie niet meer knellen. Het taalmenu klapt in dezelfde
   band achter de 🌐-knop, wat de balk 165px scheelt; de zijwaartse scroll met
   vervaging is het vangnet daaronder. */
/* De balk mag op ELKE breedte smelten, niet alleen op de telefoon (P1-3,
   11-09). Dit stond eerst binnen `@media (max-width:880px)`, en dat was net
   verkeerd: `.wrap` is zelf `max-width:880px`, dus boven die breedte groeit de
   kop niet mee terwijl de bescherming juist wegvalt. Tussen 881px en ongeveer
   1000px liep de nav daardoor buiten de kaart, en `body{overflow-x:clip}`
   maakte wat eraf viel onbereikbaar: geen scroll, geen toets, geen tik. Wat
   daar als eerste afviel was het taalmenu, want dat staat achteraan en is op
   brede schermen volledig uitgeklapt (zes talen, `.taalbol` is dan verborgen).

   Het stijlblad kende dit gat al: regel 1524 e.v. beschrijft precies dit
   gedrag voor de weergavenaam en repareerde het daar met `max-width:14ch`.
   Diezelfde redenering geldt hier, alleen dan voor de hele balk. */
header.site nav{flex-wrap:nowrap;overflow-x:auto;min-width:0;
  scrollbar-width:none;
  -webkit-mask-image:linear-gradient(90deg,#000 85%,transparent);
  mask-image:linear-gradient(90deg,#000 85%,transparent)}
header.site nav::-webkit-scrollbar{display:none}
header.site nav a,header.site nav .me{white-space:nowrap;flex:0 0 auto}

@media (max-width:880px){
  .taalbol{display:inline-flex;align-items:center;justify-content:center;
    min-width:44px;min-height:44px}
  .js .taalopties{display:none}
  .js .taalopties.open{display:inline-flex}
}

/* LET OP, DIT BLOK STAAT MIDDEN IN HET BESTAND (M-12-09-2, 12-09).
   Een regel hier heeft dezelfde specificiteit als dezelfde selector
   verderop zonder media-vraag, en bij gelijkspel wint de LAATSTE. Tien
   lettergroottes stonden hier daarom voor niets: h1, h2, h3, table,
   .banner, .illu-bij, .scene, .qtext, .aanmoediging en .stat .n kregen
   allemaal alsnog de bureaubladmaat. Het commentaar verderop beschreef
   zelfs uitgebreid een h3-reparatie die nooit is aangekomen.

   Het blok kan niet zomaar naar het eind: daar staan smallere
   media-vragen (480px) die juist NA deze horen te komen. Vandaar het
   voorvoegsel `html` op de tien getroffen regels, dat de specificiteit
   een punt verhoogt en de volgorde daarmee irrelevant maakt.

   Zet je hier een nieuwe regel neer: controleer of dezelfde selector
   verderop nog eens kaal voorkomt. tests/test_stijlcascade.py blok [6]
   doet dat sinds vandaag automatisch. */
@media (max-width:700px){
  /* Niets onder 13 pixels op een telefoon (dagelijkse ronde 10-09, P3-10).
     De twee onderste treden van de trap waren 11 en 12 pixels, en juist op
     de telefoon leunden negen regels erop: de navigatiebalk, de
     voortgangsbalk, de meta-chips, het bijschrift onder de tekening, het
     label boven het notitieveld, de voetregel onder de vraag, de tabellen,
     de kicker en de aslabels van het spinnenweb. Dat is precies de tekst
     die een lezer van tachtig niet meer haalt, en de tool is voor 18 tot 80.
     Eén plek verhogen in plaats van negen regels los: de trap zelf. De
     dragende maten (14 tot 16 pixels) blijven zoals ze waren, dus de
     bladspiegel verschuift niet -- alleen de bodem komt omhoog. */
  :root{--ts-1:13px;--ts-2:14px}
  .wrap{padding:0 12px 48px}
  header.site{padding:10px 0 8px;margin-bottom:10px}
  /* Kop op één regel: merknaam kleiner en nooit gebroken; de navitems wrappen
     niet maar scrollen zijwaarts binnen de nav zelf. Het taalmenu is op
     telefoon alleen het 🌐-icoon; een tik erop (focus) toont de talen —
     inclusief 中文, dat nergens verticaal mag breken. */
  .brand{font-size:var(--ts-5);white-space:nowrap;flex:0 0 auto}
  /* Scrollbare nav met een zichtbare hint: zonder de vervaging rechts
     leek de balk compleet terwijl 'uitloggen' en het taalmenu buiten
     beeld stonden (review 05-08). */
  header.site nav{gap:var(--sp-3);font-size:var(--ts-2);flex-wrap:nowrap;overflow-x:auto;
    min-width:0;scrollbar-width:none;
    -webkit-mask-image:linear-gradient(90deg,#000 85%,transparent);
    mask-image:linear-gradient(90deg,#000 85%,transparent)}
  header.site nav::-webkit-scrollbar{display:none}
  header.site nav a,header.site nav .me{white-space:nowrap;flex:0 0 auto}
  /* Ingeklapt achter de 🌐-knop. Eerder stond hier alleen :focus-within,
     maar niets in een display:none-tak kan focus krijgen — het menu ging
     dus voor niemand open (review 06-08). Nu doet een echte knop het werk;
     :focus-within blijft als vangnet staan. Zonder JS (html zonder .js)
     blijft de lijst uitgeklapt: taalwissel hangt nooit van JS af. */
  .taalbol{display:inline-flex;align-items:center;justify-content:center;
    min-width:44px;min-height:44px}
  .js .taalopties{display:none}
  /* Alleen .open, geen :focus-within: die hield het menu open zodra
     Escape de focus terugzette op de knop, waardoor sluiten niet
     werkte (review 06-08 avond). Zonder JS is de regel overbodig,
     want dan geldt .taalopties{display:inline-flex} gewoon. */
  .js .taalopties.open{display:inline-flex}
  .progress{padding:7px 12px;margin-bottom:10px;font-size:var(--ts-2)}
  /* Meta-chips samengevouwen tot één regel: zijwaarts scrollbaar, nooit een
     stapel die de vraag onder de vouw duwt. */
  /* Met dezelfde vervaging rechts als de nav hierboven, en om precies
     dezelfde reden (dagelijkse ronde 10-09, P2). Zonder die hint leek de rij
     compleet, terwijl er op 320px maar een of twee chips passen en er
     achter de rand nog vijf links stonden: de hal, verkennen, nog een vraag,
     de capsule en de deurtjes. Er was geen scrollbalk en geen fade, dus geen
     enkel signaal dat er meer was. */
  .spel{gap:var(--sp-2);margin-bottom:var(--sp-2);flex-wrap:nowrap;overflow-x:auto;
    scrollbar-width:none;
    -webkit-mask-image:linear-gradient(90deg,#000 88%,transparent);
    mask-image:linear-gradient(90deg,#000 88%,transparent)}
  .spel::-webkit-scrollbar{display:none}
  /* Een chip die alleen tekst is mag klein blijven; een chip die een LINK is
     of er een bevat, is een tikdoel en houdt de norm van 44 pixels aan. Dat
     gold al voor .chip.klein en voor een chip met een invoerveld, en viel
     alleen bij de kale a.chip weg (dagelijkse ronde 10-09, P2). */
  .chip{padding:4px 10px;font-size:var(--ts-2);flex:0 0 auto;white-space:nowrap}
  html .banner{padding:9px 12px;font-size:var(--ts-3);margin-bottom:10px}
  /* Hier stond `border-radius:14px`, en de review van 07-08 meldde dat het
     bewust harde man-thema (--r 6px) daardoor op de telefoon dezelfde zachte
     hoek zou krijgen als het vrouw-thema. In de browser nagemeten: dat
     gebeurde niet. Deze regel staat vóór de basisregel `.card` (regel ~233)
     en heeft dezelfde specificiteit, dus de latere `border-radius:var(--r)`
     won altijd. De declaratie deed dus niets en is weggehaald in plaats van
     "hersteld" — gemeten op 375px: v 22px, m 6px, n 16px, precies de
     themawaarden. */
  .card{padding:16px 16px;margin-bottom:var(--sp-3)}
  .illu{margin:0 0 8px}
  .illu svg{height:min(var(--illu-h,110px), 66px)}
  /* Bij meer dan vijf antwoordopties wint de vraag het van de tekening. */
  .veel-opties .illu svg{height:min(var(--illu-h,110px), 48px)}
  html .illu-bij{font-size:var(--ts-2);margin-top:2px}
  html .scene{font-size:var(--ts-5);margin-bottom:10px;padding-left:var(--sp-3)}
  html .qtext{font-size:var(--ts-8)}
  .opts{gap:var(--sp-2);margin:10px 0 4px;grid-template-columns:1fr 1fr}
  .opt{padding:8px 10px;font-size:var(--ts-3);text-align:center}
  .opt[data-v=prive]{grid-column:1 / -1}
  /* Een vijfpuntsschaal in twee kolommen laat de vijfde knop alleen achter,
     met een leeg vak ernaast. Dat raakt de drukste schermen van de tool: de
     vraag van vandaag, de eerste vraag op de startpagina en het scherm waar
     de antwoordlink uit de post op landt. `.choices3` loste dit al op met
     flex; dit doet hetzelfde voor het grid. */
  .opts .opt:last-child:nth-child(odd){grid-column:1 / -1}
  .care{font-size:var(--ts-3);padding:8px 11px;margin:8px 0 2px}
  .qfoot{font-size:var(--ts-2);margin-top:10px}
  html .aanmoediging{font-size:var(--ts-4);margin-bottom:var(--sp-2)}
  .panel{padding:var(--sp-3) var(--sp-4)}
  .statrow{gap:var(--sp-2)}
  .stat{padding:9px 12px;flex-basis:110px}
  html .stat .n{font-size:var(--ts-8)}
  html h1{font-size:var(--ts-9)}
  html h2{font-size:var(--ts-8)}
  /* h3 hoort hier ook (defect P2-G, 20-08). Deze media-regel zette
     h1 en h2 kleiner maar liet h3 op de basiswaarde van 20px staan;
     op een telefoon was een h3 dus GROTER dan de h2 erboven. Zeven
     schermen met beide niveaus lieten dat zien, verkennen.html met
     3 h2's en 29 h3's het duidelijkst. Dat het een week bleef
     liggen, kwam doordat de cascadebewaker niet media-bewust was;
     dat is sinds vandaag ook opgelost. */
  html h3{font-size:var(--ts-7)}
  /* En h4 erbij (D-18-09-8, 18-09). De regel hierboven zette h3 op 17px, maar
     h4 staat buiten elke media-regel al op 17px. Op de telefoon waren een kop
     en zijn eigen subkop dus exact even groot, terwijl de structuur (h3 boven
     h4, ouder en kind) een verschil belooft. Zichtbaar op waar_sta_ik.html,
     waar een h3 en een h4 in dezelfde kaart onder elkaar staan.
     Dezelfde fout als hierboven, een niveau verder: wie h3 meenam, vergat
     h4. tests/test_ronde_1809b.py blok [4] eist nu een dalende reeks op
     élke breedte, dus niet meer per niveau maar over de hele trap. */
  html h4{font-size:var(--ts-6)}
  .hearts span{font-size:var(--ts-6)}
  html table{font-size:var(--ts-2)}
  th,td{padding:6px 6px}
}
@media (prefers-reduced-motion:reduce){
  .hearts span{animation:none;display:none}
  *{transition:none!important;animation:none!important}}

/* ============ kaarten en koppen ============ */
.card{background:var(--card);border-radius:var(--r);box-shadow:var(--shadow);
  padding:var(--sp-6) var(--sp-6);margin-bottom:var(--sp-5);animation:rise .45s ease both}
@keyframes rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
.kicker{font-size:var(--ts-3);letter-spacing:.18em;text-transform:uppercase;color:var(--accent);font-weight:700}
/* "Wat is dit" (W-5, 08-09): het vraagteken naar Zo werkt het; 24px tikdoel. */
.uitleg-meer{display:inline-block;margin-left:6px;width:24px;height:24px;line-height:22px;text-align:center;border:1px solid var(--rule-sterk);border-radius:50%;font-size:var(--ts-3);text-decoration:none;vertical-align:middle}
/* Juridische pagina's (D-08-09b-7): honderd kale alinea's zonder
   leesbreedte liepen tot 880 px; dezelfde grens als .brief. */
.card.jur{max-width:var(--lees-breed)}
/* Het vraagteken "wat is dit" is 24 px groot en houdt dat formaat in de
   tekst; het tikdoel eromheen is 44 px (D-08-09b-12), onzichtbaar. */
.uitleg-meer{position:relative}
.uitleg-meer::after{content:"";position:absolute;inset:-10px}
/* De kop in een uitklapregel (D-08-09-13): tien keer uitgeschreven als
   inline-stijl, nu één klasse. */
.summary-kop{display:inline;margin:0;
  /* P3-13 (15-09): de kop van een heel blok erfde `text-transform:uppercase`
     en `color:var(--soft)` van .rt-groep, en oogde daardoor zwakker dan een
     subkop eronder. Dat is hierarchie op zijn kop. Het gedempte kapitaaltje
     blijft bestaan als klein label voor de kop (.kicker), niet als de kop
     zelf. */
  color:var(--ink);text-transform:none}
/* h3 hoorde hier niet bij en viel daardoor buiten het profielpaneel terug
   op de kale browserstijl: vet systeemfont tussen de serif-koppen
   (review 06-08). Nu één regel voor alle drie de niveaus. */
h1,h2,h3,h4{font-family:var(--display);font-weight:500;margin:8px 0 6px;line-height:1.15}
h1{font-size:clamp(var(--ts-10),5.5vw,38px)}
h2{font-size:var(--ts-9)}
h3{font-size:var(--ts-8)}
/* h4 hoorde hier niet bij (D-7, dagtaak 30-08). Het stijlblad
   kende het element helemaal niet, terwijl admin_match.html er
   een gebruikte en de vier eigenschappen met de hand had
   overgeschreven uit de regel hierboven, op de lettergrootte na.
   Die kop viel daardoor terug op de standaard van de browser. */
h4{font-size:var(--ts-7)}
/* Eén kleinere kopmaat in plaats van vier losse getallen (advies 21-08).
   `duo.html` zette 19px inline op een h2, `kiesblok.html` 18px, en
   `samen.html` twee keer 15px op een h3 — kleiner dan de lopende tekst
   eromheen. Vier plekken waar dezelfde bedoeling ("dit is een kop, maar een
   bescheiden") vier verschillende getallen kreeg. Wie er een vijfde bij
   zet, hoort deze klasse te gebruiken. */
h2.kop-klein{font-size:var(--ts-8)}
h3.kop-klein{font-size:var(--ts-7)}
.lede,.note-text{color:var(--soft);font-size:var(--ts-5);max-width:var(--lees-breed)}

/* ============ voortgang ============ */
.progress{position:sticky;top:0;z-index:5;background:var(--card);border-radius:0 0 var(--r-small) var(--r-small);
  box-shadow:var(--shadow);padding:10px 18px;display:flex;align-items:center;gap:var(--sp-4);
  font-size:var(--ts-3);color:var(--soft);margin-bottom:20px}
/* De balk is een UI-component en heeft dus 3:1 nodig (WCAG 1.4.11). Het lege
   vlak haalde 1,22:1 tegen de kaart en het begin van de vulling 1,19:1 tegen
   dat vlak — nagerekend in alle drie de thema's (review 07-08). Bij .dtrack
   staat er geen cijfer naast, dus daar is de balk het énige signaal.
   Een rand van 1px maakt het vlak zichtbaar, en de vulling begint niet meer
   op de lichtste tint. Nagerekend na de wijziging: 3,61 / 4,62 / 3,88 voor
   de rand en 3,11 / 3,86 / 3,60 voor de vulling (v / m / n). */
.track{flex:1;height:8px;background:var(--glow);border-radius:99px;position:relative;
  border:1px solid var(--rule-sterk);box-sizing:border-box}
.track .bar-fill{position:absolute;inset:0 auto 0 0;width:0;border-radius:99px;
  background:linear-gradient(90deg,color-mix(in srgb,var(--accent) 80%,var(--accent-2)),var(--accent));
  transition:width .7s cubic-bezier(.2,.8,.3,1)}
.track .pin{position:absolute;top:50%;translate:-50% -54%;font-size:var(--ts-5);
  transition:left .7s cubic-bezier(.2,.8,.3,1);filter:drop-shadow(0 1px 2px rgba(0,0,0,.15))}
.theme-v .track .pin{animation:pulse 1.8s ease-in-out infinite}
@keyframes pulse{0%,100%{scale:1}50%{scale:1.25}}
.pct{font-variant-numeric:tabular-nums;font-weight:700;color:var(--accent)}

/* ============ illustraties ============ */
.illu{display:flex;justify-content:center;margin:2px 0 16px;color:var(--accent);opacity:.9}
.illu svg{height:var(--illu-h,110px);width:auto;max-width:100%;overflow:visible}
.illu .d{stroke-dasharray:400;stroke-dashoffset:400;
  animation:trek 1.1s cubic-bezier(.3,.7,.3,1) forwards;
  animation-delay:calc(var(--i,0) * .11s)}
@keyframes trek{to{stroke-dashoffset:0}}
.illu .beat{transform-origin:center;transform-box:fill-box;
  animation:kloppen 1.9s ease-in-out infinite}
@keyframes kloppen{0%,100%{scale:1;opacity:.75}50%{scale:1.22;opacity:1}}
.illu .twinkle{animation:fonkel 2.6s ease-in-out infinite}
@keyframes fonkel{0%,100%{opacity:.25}50%{opacity:1}}
.illu .flicker{transform-origin:bottom;transform-box:fill-box;
  animation:flakker 1.5s ease-in-out infinite}
@keyframes flakker{0%,100%{scale:1 1;opacity:.85}35%{scale:.94 1.08;opacity:1}70%{scale:1.05 .96;opacity:.9}}
.illu .steam{stroke-dasharray:26;animation:damp 3.2s linear infinite;opacity:.5}
@keyframes damp{0%{stroke-dashoffset:26;opacity:0}30%{opacity:.55}100%{stroke-dashoffset:-26;opacity:0}}
.illu .rain{stroke-dasharray:6 10;animation:druppel 1.4s linear infinite}
@keyframes druppel{to{stroke-dashoffset:-16}}
.theme-v .illu{color:var(--accent)}
.theme-m .illu{color:var(--soft);opacity:.75}
.illu-bij{font-family:var(--display);font-style:italic;font-size:var(--ts-4);color:var(--soft);
  text-align:center;margin:6px 0 0;max-width:var(--lees);animation:rise .6s .5s ease both}

/* bewegingen voor de tekeningen van deel drie */
.illu .zwaai{animation:zwaai 3.4s ease-in-out infinite}
@keyframes zwaai{0%,100%{rotate:-4deg}50%{rotate:4deg}}
.illu .knipper{animation:knipper 2.1s ease-in-out infinite}
@keyframes knipper{0%,100%{opacity:.18}45%{opacity:1}}
.illu .drup{animation:drup 2.4s ease-in infinite;transform-box:fill-box}
@keyframes drup{0%{translate:0 -14px;opacity:0}25%{opacity:.8}100%{translate:0 12px;opacity:0}}
.illu .zand{animation:zand 4s ease-in-out infinite;transform-origin:top;transform-box:fill-box}
@keyframes zand{0%{scale:1 1}100%{scale:1 .25}}
.illu .golfje{stroke-dasharray:30;animation:golfje 1.8s linear infinite;opacity:.5}
@keyframes golfje{0%{stroke-dashoffset:30;opacity:0}40%{opacity:.6}100%{stroke-dashoffset:-30;opacity:0}}
.illu .glans{stroke-dasharray:40;stroke-dashoffset:40;animation:glans 3.6s ease-in-out infinite}
@keyframes glans{0%,70%{stroke-dashoffset:40}85%{stroke-dashoffset:0}100%{stroke-dashoffset:-40}}
.illu .knipoog{animation:knipoog 4.2s ease-in-out infinite;transform-origin:center;transform-box:fill-box}
@keyframes knipoog{0%,92%,100%{scale:1 1}96%{scale:1 .12}}
.illu .vlieg{animation:vlieg 3.2s ease-out infinite}
@keyframes vlieg{0%{translate:0 0;opacity:0}15%{opacity:.9}100%{translate:34px -30px;opacity:0}}

/* ============ spinnenweb ============ */
.radar{display:flex;flex-direction:column;align-items:center;gap:var(--sp-3);margin:6px 0 4px}
/* M-12-09-9 (12-09): hier stond alleen een HOOGTE met max-width:100%.
   De viewBox is vierkant, dus op een smal scherm knipte max-width de
   breedte terug naar de kaartbreedte (264px op 320px) terwijl de doos
   320 tot 340px hoog bleef: 56 tot 76px leegte onder het web, juist waar
   de ruimte al krap is. Nu stuurt de BREEDTE en volgt de hoogte de
   verhouding; op een breed scherm is de maat ongewijzigd. */
.radar svg{width:min(var(--radar-h,340px),100%);height:auto;aspect-ratio:1;color:var(--ink);overflow:visible}
.radar .aslabel{font-size:var(--ts-1);fill:var(--soft);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif}
/* D-18-09-9 (18-09): de rand stond op kaal var(--kleur), en voor de tweede
   persoon is dat --sage. In theme-v is dat #7FA88B tegen een witte kaart:
   2,67:1, terwijl een grafisch element dat betekenis draagt er 3 moet halen
   (WCAG 1.4.11). Datzelfde getal staat verderop in dit bestand al eens
   afgekeurd, bij de rand van de meldingen, en daar met --ink gemengd; de
   radar kreeg die correctie nooit. De VULLING mag kaal blijven: die staat
   op 16 procent dekking en draagt geen betekenis. */
.radar .vorm{fill:var(--kleur);fill-opacity:.16;
  stroke:color-mix(in srgb, var(--kleur) 65%, var(--ink));stroke-width:2;
  stroke-linejoin:round;transform-origin:150px 150px;
  animation:groei .9s cubic-bezier(.25,.9,.3,1) both;animation-delay:calc(var(--i) * .18s)}
@keyframes groei{from{scale:.15;opacity:0}to{scale:1;opacity:1}}
.radar .knoop{opacity:0;animation:opkomen .4s ease forwards;
  animation-delay:calc(.5s + var(--i) * .04s)}
@keyframes opkomen{to{opacity:1}}
.radar .knoop:hover{r:5.5}
.radar-legenda{display:flex;gap:var(--sp-4);flex-wrap:wrap;justify-content:center;
  font-size:var(--ts-3);color:var(--soft)}
/* De uitkomsten van het spinnenweb in gewone tekst (13-08): leesbaar voor
   een schermlezer én op papier, waar een lijstje het vaak wint van een web. */
.radar-lijst{list-style:none;padding:0;margin:12px 0 0;max-width:var(--lees);
  font-size:var(--ts-3);color:var(--soft)}
.radar-lijst li{display:flex;justify-content:space-between;gap:var(--sp-3);
  padding:3px 0;border-bottom:1px solid var(--rule)}
.radar-lijst li>*{min-width:0;overflow-wrap:anywhere}
.radar-as{color:var(--ink)}
/* Geen nowrap meer (02-09): hier staat een weergavenaam in, en die
   heeft geen tekenlimiet. Met `body{overflow-x:clip}` verdwijnt een
   overloop stil, zonder scrollbalk -- je ziet het niet gebeuren.
   Zelfde reparatie als eerder bij `.brief` en `header.site .me`. */
.radar-waarde{overflow-wrap:anywhere;margin-left:var(--sp-2)}
.radar-legenda span{display:flex;align-items:center;gap:var(--sp-2)}
.radar-legenda i{width:11px;height:11px;border-radius:3px;display:inline-block}

/* ============ spelelementen ============ */
.spel{display:flex;gap:var(--sp-3);flex-wrap:wrap;align-items:center;margin-bottom:var(--sp-4)}
.chip{display:inline-flex;align-items:center;gap:var(--sp-2);padding:7px 14px;border-radius:99px;
  background:var(--card);box-shadow:var(--shadow);font-size:var(--ts-3);color:var(--soft)}
/* Een chip die zelf iets bedient — een label met een vakje erin, zoals de
   voorkeurschips op /overzicht — is een tikdoel en valt onder dezelfde
   ondergrens als .chip.klein hierboven. Ze stonden op 31px (dagtaak 10-08):
   de correctie van destijds gold alleen voor chips die als link dienstdoen,
   en deze twaalf-per-pagina vielen daarbuiten. */
.chip:has(input){min-height:44px}
/* Een label met de keuzeknop erín ÍS het tikdoel, dus hoort het ook de maat
   te hebben (P2, 21-08). 48 van die labels staan verspreid over 23
   sjablonen; ze erfden alleen een lettergrootte en verder niets, en kwamen
   daarmee op ongeveer 20px uit — 55% onder de ondergrens die dit bestand
   zelf op drie plekken met naam noemt. `.optkeuze label` had de maat al,
   maar dáár staat de input als broer naast het label en niet erin; die
   variant wordt door deze regel dus niet geraakt.
   Waar een sjabloon zelf een `display` inline meegeeft wint die van de
   flex hieronder — het tikdoel wordt dan alsnog 44px hoog, alleen zonder
   de verticale centrering. Dat is de bedoeling: de maat is wat telt. */
/* `min-width` erbij op 29-08 (dagtaak, defect D-4). De hoogte stond er al,
   maar een label dat ALLEEN een vakje omsluit (zonder tekst ernaast) bleef
   zo'n 13 tot 16px breed -- de standaardmaat van de browser. Voor de labels
   die wél tekst dragen is deze regel een lege huls, want die zijn allang
   breder; hij raakt precies de kale gevallen. Zelfde redenering als bij de
   taalknoppen op 29-08 (B-2), waar de hoogte ook was doorgerekend en de
   breedte niet. */
label:has(> input[type=radio]),
label:has(> input[type=checkbox]){
  min-height:44px;min-width:44px;display:flex;align-items:center;
  gap:var(--sp-2)}
/* Een vakje zonder tekst midden in een regel (D-13-09-9, 13-09). Het hoort
   in een label, anders geldt de 44px-regel hierboven niet; maar met `flex`
   zou de rest van die regel eronder vallen. */
label.kiesvak{display:inline-flex;vertical-align:middle}
.chip b{color:var(--ink);font-variant-numeric:tabular-nums}
/* Amber is als tekstkleur te licht (2,5:1); de vlam blijft amber via het
   icoon, de tekst zelf leest in de inktkleur (review 05-08). */
.chip.vlam{color:var(--ink)}
/* En dat gold net zo goed voor `.em` erbinnen, die de correctie hierboven stil
   terugdraaide: kaal --amber op --card is 2,48:1 in theme-v, precies het getal
   dat drie regels hoger al werd afgekeurd. Dezelfde menging als het icoon
   hieronder, maar dieper, want dit is tekst (4,5:1) en geen grafisch element
   (3:1). Nagerekend op --card: 5,63:1 (v), 8,40 (m), 6,53 (n), 8,57 (admin),
   tegen 2,48 / 3,67 / 3,01 / 4,00 voor de kale amber die er stond. */
.chip.vlam .em{color:color-mix(in srgb,var(--amber) 45%,var(--ink))}
.chip.zondag{font-size:var(--ts-5);padding:9px 16px;
  border:1.5px solid color-mix(in srgb,var(--ink) 52%,var(--accent-2));
  background:linear-gradient(90deg,var(--glow),var(--card));color:var(--ink)}
.badge{display:inline-flex;align-items:center;gap:var(--sp-2);padding:9px 16px;border-radius:99px;
  background:linear-gradient(90deg,var(--glow),var(--card));
  /* Componentgrens: was 1,40-1,46:1 tegen de kaart, nu 3,81/4,34/3,87.
     Zelfde 52%-recept als --rule-sterk (review 07-08, WCAG 1.4.11). */
  border:1.5px solid color-mix(in srgb,var(--ink) 52%,var(--accent-2));
  font-size:var(--ts-4);font-weight:600;color:var(--ink);animation:pop .6s cubic-bezier(.2,1.5,.4,1) both}
.badge .em{font-size:var(--ts-7)}
.aanmoediging{font-family:var(--display);font-style:italic;font-size:var(--ts-6);color:var(--soft);
  text-align:center;margin:0 0 14px}

/* ============ meldingen ============ */
.banner{border-radius:var(--r-small);padding:12px 16px;margin-bottom:var(--sp-4);font-size:var(--ts-5);
  background:var(--glow);color:var(--ink);border:1px solid var(--rule);animation:rise .4s ease both}
.banner.milestone{background:linear-gradient(90deg,var(--glow),var(--card));
  /* D-13-09-3: was var(--accent-2), en dat is een vlakkleur (zie regel 224).
     Als rand haalde hij 1,11 tot 1,39:1 in de vier thema's tegen een eis van
     3,0. --rule-sterk geeft 3,64 tot 4,68:1. Zelfde reparatie als M-12-09-1. */
  border-color:var(--rule-sterk);font-weight:600}
.wink{display:flex;gap:var(--sp-3);align-items:flex-start;background:var(--glow);
  border-radius:var(--r);border-bottom-left-radius:var(--sp-1);padding:13px 17px;margin-bottom:var(--sp-4);
  font-size:var(--ts-5);color:var(--ink);animation:pop .5s cubic-bezier(.2,1.4,.4,1) both}
@keyframes pop{from{opacity:0;transform:scale(.85) translateY(6px)}to{opacity:1;transform:none}}
.wink .who{font-size:var(--ts-7)}
.wink .who .ico{width:19px;height:19px}

/* ============ de eerste-date-koffer (5.30) ============
   Ruim gezet: dit wordt op een telefoon gelezen terwijl er iemand tegenover
   je zit, en soms uitgeprint. Grote regelafstand, geen versiering. */
.kf-lijst{margin:14px 0 0;padding-left:1.3em;max-width:var(--lees)}
.kf-lijst li{margin:0 0 12px;line-height:var(--rh-ruim)}
@media print{
  .kf-lijst li{margin-bottom:var(--sp-4)}
  .btn, .kicker{display:none}
}

/* ============ de kist met twee sleutels (5.4) ============
   Open gaat de kist met licht, niet met beweging: een kist die openklapt
   trekt de aandacht naar de animatie in plaats van naar wat erin ligt. */
.kist2-open{background:linear-gradient(180deg,var(--glow),var(--card))}
.kist2-uit{margin-top:10px;display:grid;gap:var(--sp-2);max-width:420px}
.kist2-rij{display:flex;gap:var(--sp-3);align-items:baseline;
  padding:9px 12px;border-radius:var(--r-small);background:var(--card);
  border:1px solid var(--rule-sterk)}
.kist2-wie{flex:none;min-width:9ch;font-size:var(--ts-3);color:var(--soft)}

/* ============ de sleutelbos (5.3) ============
   Sleutels die niets openen, dus ook niets mogen opeisen: geen kader per
   sleutel, geen kolommen, gewoon een rustige lijst. */
.bos-lijst{list-style:none;margin:10px 0 0;padding:0;display:grid;gap:var(--sp-3)}
.bos-lijst li{display:flex;gap:var(--sp-3);align-items:flex-start}
.bos-ikoon{flex:none;color:var(--accent);opacity:.9;margin-top:1px}
.bos-lijst strong{font-weight:600}
.bos-sinds{font-size:var(--ts-3);color:var(--soft);margin-left:7px}
.bos-zin{display:block;font-size:var(--ts-4);color:var(--soft);max-width:var(--lees);
  margin-top:2px}

/* ============ eigen iconen ============
   Uit templates/iconen.html. Een emoji is een letter en gaat mee met de
   regelhoogte; een SVG is een blok en zakt zonder hulp naar de onderkant van
   de regel. Vandaar de vaste verschuiving in inline-context. In een
   flex-context (.chip, .wink, .care) doet align-items het werk al en zou
   vertical-align niets doen — het staat er alleen voor de rest.
   De lijn is iets lichter dan de tekst: bij gelijke sterkte trekt een icoon
   de aandacht wég van het woord ernaast, en het woord draagt de betekenis. */
.ico{vertical-align:-.19em;flex:none;opacity:.82}
.chip .ico,.care .ico{opacity:.78}
/* Het icoon stond op 2,5:1 in theme-v, tegen een eis van 3:1 voor een
   grafisch element (ronde 16-09, D-16). Precies dezelfde meting die amber
   hierboven als TEKSTkleur al afkeurde; het icoon is toen niet meegerekend.
   Donkerder gemengd met de inkt houdt de vlam amber en haalt de eis. */
.chip.vlam .ico{color:color-mix(in srgb,var(--amber) 72%,var(--ink));opacity:1}

/* ============ de vraag ============ */
.scene{font-family:var(--display);font-style:italic;font-size:var(--ts-7);color:var(--soft);
  border-left:3px solid var(--accent-2);padding:2px 0 2px 16px;margin:0 0 18px}
/* font-weight expliciet: .qtext is op de vraagpagina nu een h1, en de
   h1,h2-regel zou hem anders zwaarder zetten dan de <p>-varianten
   elders. Zo blijft het beeld overal exact gelijk. */
.qtext{font-size:clamp(var(--ts-vraag-min),3.6vw,var(--ts-vraag-max));font-family:var(--display);margin:var(--sp-vraag) 0 4px;line-height:1.3;font-weight:400}
/* Zelfkennis toont vijf vragen onder elkaar; die mogen kleiner dan één vraag
   op een eigen pagina, maar niet onder het minimum van .qtext zelf — daar
   stonden ze op 18px, kleiner dan de passieve recap elders (dagtaak 10-08). */
.qtext-compact{font-size:clamp(var(--ts-vraag-min),2.6vw,var(--ts-vraag-compact-max));padding:0}
/* Een paginakop die rustig mag ogen, zonder zijn niveau te verliezen. Stond
   als inline font-size:var(--ts-9) op registreren en de wachtwoordschermen, exact
   even zwaar als een h2 (dagtaak 10-08). */
.kop-kalm{font-size:clamp(var(--ts-9),4vw,30px)}
.care{display:flex;gap:var(--sp-2);margin:12px 0 4px;padding:11px 14px;border-radius:var(--r-small);
  background:var(--glow);font-size:var(--ts-4);color:var(--soft)}
.opts{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:var(--sp-3);margin:20px 0 6px}
/* De rand in rusttoestand is het enige signaal waar deze knop begint en
   eindigt; die moet 3:1 halen tegen het veldvlak (WCAG 1.4.11). Met --rule
   alleen was dat 1,30-1,67:1 in de vier thema's (review 06-08). */
.opt{padding:13px 16px;border:1.5px solid var(--rule-sterk);border-radius:var(--r-small);
  background:var(--field);color:var(--ink);font-size:var(--ts-5);text-align:left;
  min-height:44px;
  transition:transform .15s,box-shadow .15s,border-color .15s,background .15s}
.opt:hover{transform:translateY(-2px);box-shadow:var(--shadow);border-color:var(--accent)}
.opt:active{transform:scale(.97)}
/* De rand van de gekozen knop is een UI-component: die moet 3:1 halen
   tegen het veldvlak (WCAG 1.4.11). De kleurfamilie blijft, maar de rand
   wordt gemengd met de inktkleur zodat hij ook echt te zien is; de dikkere
   rand plus vet lettertype maken de keuze bovendien niet-kleurafhankelijk. */
.opt.sel{border-width:3px;font-weight:700}
.opt[data-v=ja].sel{border-color:color-mix(in srgb,var(--sage) 65%,var(--ink));background:color-mix(in srgb,var(--sage) 12%,var(--field))}
.opt[data-v=proberen].sel{border-color:color-mix(in srgb,var(--amber) 60%,var(--ink));background:color-mix(in srgb,var(--amber) 12%,var(--field))}
.opt[data-v=voorjou].sel{border-color:color-mix(in srgb,var(--lav) 65%,var(--ink));background:color-mix(in srgb,var(--lav) 12%,var(--field))}
.opt[data-v=lieverniet].sel{border-color:color-mix(in srgb,var(--gray) 60%,var(--ink));background:color-mix(in srgb,var(--gray) 12%,var(--field))}
.opt[data-v=grens].sel{border-color:var(--stop);background:color-mix(in srgb,var(--stop) 10%,var(--field))}
.opt[data-v=geenidee].sel,.opt[data-v=prive].sel{border-color:var(--ink)}
.opt[data-v=prive]{border-style:dashed;color:var(--soft)}
/* `.notefield` is sinds 29-08 avond (D-5) zélf een <label> en geen <div>.
   Reden: het opschrift stond ernáást in plaats van eromheen, zonder `for` en
   zonder `id`, en daardoor hadden 244 velden in het beheer geen toegankelijke
   naam. Ids waren geen optie -- deze blokken staan in {% for %}-lussen en
   zouden botsen. Het omhulsel een label maken lost dat op zonder ids en
   zonder de opmaak te veranderen: het opschrift is nu een <span>. Een label
   is van zichzelf inline, vandaar de expliciete display:block. */
.notefield{margin-top:14px;display:block}
/* Ook `> label`, sinds 10-09 (dagelijkse ronde, P2). Er zijn twee vormen in
   omloop: `<label class=notefield><span>opschrift</span><textarea>` (12 keer)
   en `<div class=notefield><label for=..>opschrift</label><input>` (65 keer).
   Beide zijn toegankelijk in orde -- de tweede heeft een echte `for` -- maar
   alleen de eerste kreeg de opmaak van een bijschrift. De tweede rendeerde
   op 16 pixels in --ink en las dus als lopende tekst, zonder de 5 pixels
   lucht. Geteld over de 200 momentopnamen: 245 met span, 164 met label.
   Zichtbaar op onder andere "Toelichting (mag leeg blijven)" bij de vraag en
   de drie opschriften op de uitnodiging. */
.notefield > span,.notefield > label{display:block;font-size:var(--ts-3);
  color:var(--soft);margin-bottom:5px}
.qfoot{display:flex;justify-content:space-between;align-items:center;margin-top:var(--sp-4);
  font-size:var(--ts-4);color:var(--soft);gap:var(--sp-3);flex-wrap:wrap}
.qfoot a{color:var(--soft)}
.opzij{font:inherit;font-size:var(--ts-3);background:transparent;border:1px dashed var(--rule-sterk);
  border-radius:99px;padding:6px 13px;color:var(--soft);cursor:pointer;
  min-height:44px;display:inline-flex;align-items:center}
.opzij:hover{border-color:var(--accent);color:var(--accent)}

/* ============ profielpaneel ============ */
.layout{display:grid;grid-template-columns:minmax(0,1fr) 270px;gap:var(--sp-5);align-items:start}
@media (max-width:820px){.layout{grid-template-columns:1fr}}
.panel{background:var(--card);border-radius:var(--r);box-shadow:var(--shadow);
  /* Op de ladder (P3-5, 20-09): 20px/22px stond op geen enkele trede,
     terwijl het vergelijkbare .card wel tokens gebruikt. */
  padding:var(--sp-5);position:sticky;top:64px;animation:rise .5s .1s ease both}
@media (max-width:820px){.panel{position:static}}
.panel h2,.panel h3{margin:0 0 4px;font-family:var(--display);font-size:var(--ts-7);font-weight:600}
.panel .sub{font-size:var(--ts-3);color:var(--soft);margin:0 0 14px}
.axis{margin:10px 0}
/* Deze rij zet twee stukken tekst tegenover elkaar: label links, waarde
   rechts. Er moeten twee dingen tegelijk waar blijven — hij mag niet
   overlopen, én die links-rechtsverhouding moet blijven staan.

   Ronde 5 zette er `flex-wrap:wrap` op. Dat loste het overlopen op en brak
   het andere: een flexregel met één item laat `justify-content:
   space-between` terugvallen op `flex-start` (vaste spec), dus zodra de rij
   echt afbrak stond de waarde niet meer rechts maar links. Ronde 6 vond dat
   met twee lenzen tegelijk.

   Zo hoort het: de rij blijft één regel, en het afbreken gebeurt BINNEN de
   twee kinderen. `min-width:0` laat een flex-kind kleiner worden dan zijn
   eigen inhoud, en `overflow-wrap:anywhere` laat de tekst daar dan breken.
   Allebei de eisen gehaald, en het hangt niet af van hoe lang een aslabel
   of een bijschrift toevallig is. */
.axis .lab{display:flex;justify-content:space-between;gap:var(--sp-3);
  font-size:var(--ts-3);margin-bottom:var(--sp-1);color:var(--soft)}
.axis .lab>*{min-width:0;overflow-wrap:anywhere}
.axis .lab b{color:var(--ink);font-weight:600}
/* Zie de toelichting bij .track hierboven: hier telt het zwaarder, want naast
   een .dtrack staat geen percentage — de lengte van de balk is alles. */
/* display:block erbij (P0 Jeroen 24-08: "ontbreekt hier iets in de
   weergave?"). De balk is op twee schermen een <span> die kaal in een
   tabelcel staat ("Per as" op /waar-sta-ik, en het communicatie-overzicht in
   beheer). Een inline element negeert zijn height en heeft nul breedte
   zonder inhoud: er bleef alleen de 1px-rand over, een verticaal streepje
   waar een gevulde balk hoorde. In de flex-kaarten (themas, huis) viel het
   nooit op, want een flexitem wordt vanzelf geblockificeerd -- precies
   waardoor deze fout maandenlang alleen in tabellen bestond. */
.dtrack{display:block;height:9px;background:var(--glow);border-radius:99px;
  position:relative;
  overflow:hidden;border:1px solid var(--rule-sterk);box-sizing:border-box}
.dtrack .bar-fill{position:absolute;inset:0 auto 0 0;width:0;border-radius:99px;
  background:linear-gradient(90deg,color-mix(in srgb,var(--accent) 80%,var(--accent-2)),var(--accent));
  transition:width .8s cubic-bezier(.2,.8,.3,1)}
/* Middenstreep: was 1,10–1,36:1, nu 3,16 / 4,41 / 3,50. */
.dtrack .mid{position:absolute;left:50%;top:-2px;bottom:-2px;width:1px;
  background:color-mix(in srgb,var(--ink) 55%,var(--rule))}
/* 14px, niet 13.5 (23-08, lens 4): .profline draagt de
   typebeschrijvingen, en dat is gewone leestekst en geen
   bijschrift. Zeventien plekken over vijf schermen. */
.profline{font-size:var(--ts-4);margin:10px 0;padding-left:var(--sp-3);border-left:2.5px solid var(--accent-2)}
/* Op de feest-kaart staat dit label op de --glow-kant van de gradiënt,
   en daar haalde kaal --accent maar 4,03:1 in theme-v (eis 4,5). Zelfde
   ink-mix als .briefje .wie; in de andere thema's neemt de marge alleen
   toe (review 06-08 avond). */
.profline b{display:block;font-size:var(--ts-2);letter-spacing:.06em;
  text-transform:uppercase;color:color-mix(in srgb,var(--ink) 20%,var(--accent))}
.empty-profile{font-size:var(--ts-3);color:var(--soft);font-style:italic}

/* ============ tussenstand / confetti ============ */
.confetti{position:relative;height:0}
.confetti i{position:absolute;top:-10px;font-style:normal;font-size:var(--ts-6);opacity:0;
  animation:fall 2.6s ease-in forwards}
@keyframes fall{
  0%{transform:translateY(-10px) rotate(0deg);opacity:0}
  10%{opacity:.9}
  100%{transform:translateY(46vh) rotate(320deg);opacity:0}}
.choices3{display:flex;gap:var(--sp-3);flex-wrap:wrap;margin:14px 0}
.choices3 .opt{flex:1 1 140px;text-align:center}

/* ============ brief ============ */
/* max-width erbij (dagtaak 10-08): de brief was het enige lange prozablok
   zonder leesbreedte-grens, terwijl .lede/.note-text op 60ch staan en de
   meeste pagina's zelfs op 52-58ch. Juist het langste en persoonlijkste stuk
   tekst liep op een breed scherm ruim voorbij de 75 tekens per regel. */
.brief{font-family:var(--display);font-size:var(--ts-7);line-height:1.75;margin-top:14px;
  max-width:var(--lees-breed);
  white-space:pre-line;border-left:3px solid var(--accent-2);padding-left:18px}

/* ============ schrijfhulp ============ */
.btnrij{display:flex;gap:var(--sp-3);align-items:center;flex-wrap:wrap;margin-top:10px}
/* Tikdoel minstens 44px hoog: dit is onder meer de 'Volgende'-knop op de
   vraagpagina, de meest aangeraakte knop van de site (review 06-08). */
.btn.klein{padding:8px 16px;font-size:var(--ts-4);min-height:44px;
  display:inline-flex;align-items:center;justify-content:center}
/* De uitgeschakelde knop, nagerekend op 12-09. Met `opacity:.45` kwam wit op
   accent uit op 1,91:1 (thema v), 2,09 (m), 1,97 (n) en 2,08 (admin), tegen
   een norm van 4,5. Dat is niet alleen een randgeval: `vraag.html` zet de
   knop Verder standaard uit zolang er geen antwoord is gekozen, dus dit is de
   toestand die een nieuwe bezoeker op elke vraagpagina als EERSTE ziet.

   Zelfde oplossing als bij `.gedimd`, `.tour-dot` en het scheidingsstipje in
   de taalkiezer: een vaste gemengde kleur in plaats van doorzichtigheid. Zo
   dimt de tekst niet mee met zijn eigen achtergrond. Nagerekend na de
   wijziging: 6,30 (v), 7,72 (m), 6,58 (n), 7,42 (admin). */
.btn:disabled{background:color-mix(in srgb,var(--accent) 45%,var(--card));
  color:var(--ink);opacity:1;cursor:not-allowed;transform:none;box-shadow:none}
.verzinstatus{font-size:var(--ts-3);color:var(--soft);font-style:italic}

/* Het scheidingsstipje in de taalkiezer (defect P3-C, 20-08). Stond met
   `opacity:.5` inline in base.html op 2,01 tot 2,22:1. Dezelfde les als bij
   .tour-dot: een kleur in plaats van doorschijnendheid. */
.taalpunt{color:color-mix(in srgb,var(--soft) 75%,var(--card))}

/* Afgehandelde meldingen in de beheerkant (punt O-5, 20-08). Rustiger dan de
   openstaande, maar zonder `opacity` op de tekst: dat bracht ze op 3,61:1.
   Een zachte achtergrond en een lichtere rand doen hetzelfde werk. */
.afgedaan{background:var(--bg2);border-color:var(--rule-sterk) !important}

/* Het luik voor deel drie op /overzicht (P0, 20-08). Rustig en duidelijk:
   het is geen waarschuwing en geen slot, alleen een tik die je zelf zet. */
.deel3-luik{margin-top:var(--sp-4);border:1px solid var(--rule);border-radius:var(--r);
  padding:12px 14px;background:var(--bg2)}
.deel3-luik>summary{cursor:pointer;font-weight:600;min-height:44px;
  display:flex;align-items:center}
.veldlabel{display:block;font-size:var(--ts-3);color:var(--soft);margin:13px 0 5px}

/* `.hint` bestond in geen enkele stijlregel (defect P3-A). Zeven sjablonen
   gebruiken hem voor een gedempte bijzin, en die tekst stond dus al die tijd
   in volle broodtekst. Stond op 13-08 al open en breidde zich daarna nog uit
   naar meenemen.html: een klasse zonder regel plant zich voort, want in het
   sjabloon ziet hij eruit alsof hij werkt. Zelfde bedoeling als `.zacht` en
   `.klein`: iets zachter en iets kleiner dan de tekst eromheen. */
.hint{display:block;font-size:var(--ts-4);color:var(--soft);max-width:var(--lees-breed)}

/* Een radiogroep hoort in een <fieldset> met een <legend>: alleen dan leest
   een schermlezer de vraag mee bij ÉLKE optie, in plaats van alleen de losse
   optietekst (defect P3-G, 20-08; zeven groepen misten dit). De
   browserstandaard geeft een fieldset een kader en eigen marges, en die
   horen hier niet: de groep staat al in een kaart.
   `min-width:0` is geen franje. Een fieldset heeft in de standaard een
   eigenzinnige minimale breedte die niet meekrimpt; zonder deze regel loopt
   een lange optietekst op een telefoon buiten beeld. */
fieldset.veldgroep{border:0;padding:0;margin:0;min-width:0}
fieldset.veldgroep>legend{display:block;padding:0;font-size:var(--ts-3);
  color:var(--soft);margin:13px 0 5px}

/* ============ mobiel: vraag past op één scherm ============ */
@media (max-width: 480px){
  header.site{padding:10px 0}
  .wrap{padding-left:var(--sp-3);padding-right:var(--sp-3)}
  .card{padding:16px 14px}
  .progress{padding:6px 0}
  .spel{margin-bottom:var(--sp-2)}
  .chip{padding:5px 10px;font-size:var(--ts-2)}
  .illu{margin:0 0 8px}
  .illu svg{height:min(var(--illu-h,104px), 62px)}
  .illu-bij{font-size:var(--ts-2);margin-top:3px}
  .kicker{font-size:var(--ts-1)}
  .qtext{font-size:var(--ts-7);margin:var(--sp-vraag) 0 var(--sp-2)}
  .scene{font-size:var(--ts-4);margin:4px 0 8px}
  .opts .opt{padding:8px 10px;font-size:var(--ts-3)}
  .aanmoediging{font-size:var(--ts-4);margin-bottom:var(--sp-2)}
  .panel{margin-top:14px}
}

/* ============ blokfeest ============ */
.card.feest{text-align:center;background:linear-gradient(170deg,var(--card),var(--glow))}
.badge.groot{font-size:var(--ts-6);padding:12px 22px;margin:6px 0 10px;
  animation:pop .7s cubic-bezier(.2,1.6,.4,1) both}
.badge.groot .em{font-size:var(--ts-9)}
.confetti.groot i{animation-duration:3.4s}

/* ============ beheertabs ============ */
.tabbar{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin-bottom:18px}
/* --rule-sterk in plaats van --rule: de rand van een níet-actieve tab is het
   enige randsignaal dat die tab heeft, en met --rule haalde hij 1,30:1 tegen
   de witte kaart (eis 3:1 voor een grafisch element; gemeten 08-08 in het
   beheerthema, dat tot die dag nooit was nagerekend). Met --rule-sterk:
   admin 4,00 · v 3,55 · n 3,87 · m 4,62. Dezelfde correctie kregen .opt,
   .track, .dtrack, .deelknop en .optkeuze label eerder al; op 20-08 volgden
   de invoervelden, .kiesblok-knop, .verkenkaart, .thema-mix .chip en
   .kist2-rij (tests/test_randcontrast.py rekent ze alle vijf na). */
/* min-height erbij (dagtaak 10-08): deze knoppen stonden op 41,7px, terwijl
   .opt, .deelknop, .optkeuze label, button.linkknop en details summary de
   44px-ondergrens allemaal wél droegen. */
.tabbar button{font:inherit;font-size:var(--ts-4);padding:9px 18px;border-radius:99px;
  border:1.5px solid var(--rule-sterk);background:var(--card);color:var(--soft);
  cursor:pointer;min-height:44px;display:inline-flex;align-items:center}
/* Eén "geselecteerd"-taal voor de drie pil-componenten (02-09). De tabbar,
   de optkeuze en de deelknop doen alle drie hetzelfde -- één pil uit
   meerdere kiezen -- en droegen drie verschillende combinaties van rand,
   achtergrond en gewicht (600/700/700, met of zonder --glow, één met een
   3px-rand). Twee knopsoorten die om dezelfde aandacht vragen verzwakken
   elkaar; nu zeggen ze het op dezelfde manier. */
.tabbar button.actief,
.optkeuze input:checked+label,
.deelknop.actief{border-color:var(--accent);background:var(--glow);
  color:var(--ink);font-weight:700}
/* Achter de js-guard (dagtaak 10-08): zonder JavaScript verborg deze regel
   vier van de vijf beheerpanelen zónder dat er een manier was om te wisselen —
   de tabknoppen zijn kale buttons met een klikhandler. Zonder JS staat nu
   simpelweg alles onder elkaar, wat voor een beheerscherm prima leest.
   Vergelijk .alleen-js hierboven, dat dit patroon al goed had. */
html.js [data-tab]{display:none}
html.js [data-tab].actief{display:block}

/* ============ knoppen ============ */
.btn{display:inline-block;padding:12px 24px;border-radius:99px;border:1.5px solid var(--accent);
  background:var(--accent);color:#fff;font-size:var(--ts-5);font-weight:600;text-decoration:none;
  transition:transform .15s,box-shadow .15s}
.btn:hover{transform:translateY(-2px);box-shadow:var(--shadow)}
.btn.ghost{background:transparent;color:var(--accent)}
.theme-m .btn,.theme-admin .btn{border-radius:var(--r-small)}

/* ============ login ============ */
.login-hero{max-width:430px;margin:6vh auto 0;text-align:center}
.login-hero .big{font-size:var(--ts-12);margin-bottom:6px;animation:pulse 2.4s ease-in-out infinite;display:inline-block}
.login-card{max-width:430px;margin:18px auto 0;text-align:left}
.login-card label{display:block;font-size:var(--ts-3);color:var(--soft);margin:12px 0 5px}
.login-card .btn{width:100%;margin-top:18px;text-align:center}
.error{background:color-mix(in srgb,var(--stop) 10%,var(--card));border:1px solid var(--stop);
  color:var(--stop);border-radius:var(--r-small);padding:10px 14px;font-size:var(--ts-4);margin-top:14px}

/* De tijdlijn op /admin/communicatie (13-09, opdracht Jeroen "leesbaar
   maken"). Zonder breedtes verdeelde de browser de zes kolommen gelijk, en
   dan werd "post van de site" drie regels hoog terwijl de kolom met de
   eigenlijke tekst een handbreed bleef. `.tabelscroll` eromheen schuift al
   horizontaal, dus een minimumbreedte kost niets: hij kiest schuiven boven
   samenknijpen. */
table.tijdlijn{min-width:900px;table-layout:fixed}
table.tijdlijn th:nth-child(1),table.tijdlijn td:nth-child(1){width:9.5em}
table.tijdlijn th:nth-child(2),table.tijdlijn td:nth-child(2){width:7em}
table.tijdlijn th:nth-child(3),table.tijdlijn td:nth-child(3){width:9em}
table.tijdlijn th:nth-child(4),table.tijdlijn td:nth-child(4){width:15em}
table.tijdlijn th:nth-child(6),table.tijdlijn td:nth-child(6){width:7em}
/* De kolom "Wat" krijgt wat overblijft; die draagt het onderwerp, de
   samenvatting en de volledige tekst. */
table.tijdlijn td:nth-child(5){min-width:26em}
/* Een adres heeft geen spaties om op af te breken en duwt de tabel anders
   breder dan zijn eigen kolom. */
table.tijdlijn td.wie{overflow-wrap:anywhere}

/* ============ tabellen (beheer) ============ */
table{border-collapse:collapse;width:100%;font-size:var(--ts-4)}
th,td{text-align:left;padding:8px 10px;border-bottom:1px solid var(--rule);vertical-align:top}
th{font-size:var(--ts-2);letter-spacing:.08em;text-transform:uppercase;color:var(--soft)}
tr:hover td{background:var(--glow)}
.num{font-variant-numeric:tabular-nums;text-align:right}
/* De varianten hieronder dekken alleen de BENOEMDE antwoorden. Een
   schaalvraag levert een getal (0, 1, 2, 3), en dat kwam tot 20-08 als
   `class="tag 3"` op het scherm: een klassenaam die met een cijfer begint kan
   CSS niet eens selecteren, dus die tags bleven kleurloos terwijl de benoemde
   antwoorden ernaast wél kleur kregen. 156 van de 196 tags in de snapshotset
   waren zo'n onbruikbare variant (defect P3-B). De bron geeft nu een lege
   klasse mee bij een schaalantwoord; dat is dezelfde kale tag, maar dan
   zonder verzonnen klassenaam. */
.tag{display:inline-block;padding:2px 9px;border-radius:99px;font-size:var(--ts-2);font-weight:600;
  background:var(--glow);color:var(--ink)}
.tag.ja{background:color-mix(in srgb,var(--sage) 18%,var(--card))}
.tag.grens{background:color-mix(in srgb,var(--stop) 16%,var(--card))}
.tag.lieverniet{background:color-mix(in srgb,var(--gray) 18%,var(--card))}
.tag.proberen{background:color-mix(in srgb,var(--amber) 18%,var(--card))}
.tag.voorjou{background:color-mix(in srgb,var(--lav) 18%,var(--card))}
.tag.prive{border:1px dashed var(--gray);background:transparent;color:var(--soft)}
details{margin:10px 0}
details summary{cursor:pointer;font-weight:600;padding:8px 0;
  min-height:44px;display:flex;align-items:center;gap:var(--sp-2)}
details summary:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
/* Een eigen uitklapteken (melding Jeroen 24-08: "hoe kan ik achterhalen wat
   er exact is verzonden?").
   Het antwoord was: klik op het onderwerp, daar staat de volledige tekst
   onder. Alleen zei niets dat je kon klikken. `display:flex` hierboven haalt
   namelijk het standaard driehoekje van de browser weg -- dat hangt aan de
   ::marker van een list-item, en die bestaat niet meer zodra summary flex
   wordt. De tekst was dus wel klikbaar en zag er niet klikbaar uit.
   Vandaar dit teken, dat meedraait bij openen. `flex:0 0 auto` houdt hem op
   maat als de kop lang is. */
details summary::before{content:"";flex:0 0 auto;width:0;height:0;
  border-left:5px solid currentColor;border-top:4px solid transparent;
  border-bottom:4px solid transparent;opacity:.7;
  transition:transform .15s ease}
details[open] summary::before{transform:rotate(90deg)}
/* Bij de twee plekken die hun eigen summary-opmaak hebben laten we het teken
   staan: ook daar is de vindbaarheid het punt. */
.grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--sp-4)}
/* Onder 480px is er binnen een kaart maar ~268px over, minder dan de
   minmax-ondergrens van 280px. Een grid-track krimpt niet onder die grens,
   dus stak de inhoud buiten de kaart — en body{overflow-x:clip} knipte dat
   weg in plaats van het scrollbaar te maken (review 06-08; dezelfde val als
   eerder bij het voortgangsbalkje). Op smal scherm dus één kolom. */
@media (max-width:480px){.grid2{grid-template-columns:1fr;gap:var(--sp-4)}}
.statrow{display:flex;gap:var(--sp-4);flex-wrap:wrap;margin:10px 0 4px}
.stat{flex:1 1 130px;background:var(--glow);border-radius:var(--r-small);padding:12px 16px}
.stat .n{font-family:var(--display);font-size:var(--ts-10);line-height:1.1}
.stat .l{font-size:var(--ts-2);color:var(--soft)}

/* ============ spellen en extra's ============ */
.badgegrid{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin-top:var(--sp-3)}
.optkeuze{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:10px 0 2px}
.optkeuze input{position:absolute;opacity:0;pointer-events:none}
.optkeuze label{padding:8px 15px;border:1.5px solid var(--rule-sterk);border-radius:99px;
  background:var(--field);color:var(--ink);font-size:var(--ts-4);cursor:pointer;
  min-height:44px;display:inline-flex;align-items:center;
  transition:border-color .15s,background .15s}
.optkeuze label:hover{border-color:var(--accent)}
/* De geselecteerde stand staat bij `.tabbar button.actief` (gedeelde regel). */
.optkeuze input:focus-visible+label{outline:2px solid var(--accent);outline-offset:2px}
/* Rand gemengd met --ink in plaats van kaal --sage: kaal haalde in theme-v
   en theme-n 2,67:1 tegen de kaart (eis 3). Nu ruim 4:1 (nagerekend 08-08). */
.okmsg{background:color-mix(in srgb,var(--sage) 12%,var(--card));
  border:1px solid color-mix(in srgb,var(--sage) 65%,var(--ink));
  border-radius:var(--r-small);padding:10px 14px;font-size:var(--ts-4);margin-bottom:14px}

/* ============ feedbackkanaal ============ */
/* Zwevende denk-mee-knop: een pil mét label in de accentkleur, zodat hij
   uitnodigt in plaats van wegvalt in de hoek (melding Jeroen 05-08). */
/* De installatiekaart (base.html #pwa-vraag) staat vast onderaan; onder
   900px schuift hij boven de denk-mee-knop uit (D-05-09-8), anders lag hij
   op 320, 375 en 768 px over die knop zolang hij open stond. */
#pwa-vraag{bottom:12px}
@media (max-width:900px){#pwa-vraag{bottom:76px}}
.feedback-knop{position:fixed;right:18px;bottom:18px;z-index:20;
  display:flex;align-items:center;gap:var(--sp-2);padding:12px 18px;
  border-radius:99px;background:var(--accent);color:#fff;
  border:1.5px solid var(--accent);box-shadow:var(--shadow);
  font-size:var(--ts-7);font-weight:600;text-decoration:none;
  transition:transform .15s,box-shadow .15s}
.feedback-knop:hover{transform:translateY(-2px);
  box-shadow:var(--shadow)}
.feedback-knop .fb-label{line-height:var(--rh-strak)}
.feedback-knop .dot{position:absolute;top:-3px;right:-3px;width:14px;height:14px;
  /* De terugval stond op #d99a2b, en die waarde hoort bij géén van de
     vier thema's (die hebben #CE9B5C / #A9743B / #C08A4A / #A8752E).
     Dode code zolang --amber altijd gezet is, maar het is een kleur
     die nooit tegen de echte paletten is doorgerekend (29-08, T-2).
     Een variabele die overal gedefinieerd is heeft geen terugval
     nodig; een terugval die niemand nakijkt is een tweede waarheid. */
  border-radius:50%;background:var(--amber);border:2px solid var(--card)}
/* Op de telefoon maakte de kleinere padding hem 41 pixels hoog: 10 + 10
   padding, 3 rand, 18 pictogram (het label staat op line-height:var(--rh-strak)). Boven
   700px kwam hij op 45 uit. Dat is de enige knop die op ELK deelnemersscherm
   staat, dus hij zakte overal onder de norm (dagelijkse ronde 10-09, P2).
   De padding blijft kleiner -- daar was hij voor -- en min-height houdt de
   norm; box-sizing staat globaal op border-box, dus de rand zit erin. */
@media (max-width:700px){.feedback-knop{padding:10px 14px;font-size:var(--ts-5);
  right:12px;bottom:12px;min-height:44px}}
/* Globale weg terug, bovenaan elke subpagina.
   Was een kale inline-block van 15px met geen padding: een regelbox van
   23 pixels hoog en ongeveer 50 breed, zonder eigen media-regel, dus ook op
   de telefoon 23 (dagelijkse ronde 10-09, P2). Dit is de weg terug op
   /alles, alle acht familiedeuren, de brieven, het rooster, de uitnodiging
   en de vraag zelf -- het meest gebruikte tikdoel dat er was, en het enige
   dat nog niet op 44 stond terwijl .opt, .opzij, .btn.klein, .linkknop,
   summary, .kiesblok-knop, .tabbar button en .chip dat allemaal wel doen.
   Inline-flex in plaats van inline-block, want min-height doet niets op een
   inline-block dat zijn hoogte uit de regelbox haalt. De negatieve
   linkermarge houdt de tekst op dezelfde plek als voorheen, zodat de
   bladspiegel niet verschuift. */
.terug-glob{display:inline-flex;align-items:center;min-height:44px;
  padding:0 10px;margin:2px 0 6px -10px;color:var(--soft);
  text-decoration:none;font-size:var(--ts-5)}
.terug-glob:hover{color:var(--accent)}
/* Ontdekkingskaart: regels mogen wrappen (anders werd het voortgangsbalkje
   met 'werk eraan'-link op mobiel afgeknipt door body{overflow-x:clip}). */
.ontdekking .axis{flex-wrap:wrap}
.dtrack.mini{width:96px;display:inline-block;margin:0;max-width:40vw}
/* Aanraakvlakken (review 05-08): navigatie- en antwoordlinks waren 19-39px
   hoog. De letters blijven even groot; alleen het klikbare vlak groeit. */
/* Specificiteit moet die van `header.site nav button.navknop{padding:0}`
   overtreffen, anders bleef de uitlog-knop 19px hoog (verificatie 05-08).
   14px boven+onder + 19px regelhoogte ≈ 47px aanraakvlak. */
/* :not(.taalbol) — anders wint deze regel (0,2,3) van
   .taalbol{display:none} (0,1,0) en staat de taalknop ook op breed
   scherm zichtbaar, terwijl de lijst daar al uitgeklapt is
   (review 06-08 avond). */
/* De BREEDTE was hier nooit uitgerekend (dagtaak 28-08 avond, B-2). De som
   hierboven gaat alleen over de hoogte en die klopt; horizontaal blijft er
   2+2px padding over plus de tekst zelf, en bij een taalcode van twee tekens
   op 14px is dat samen ongeveer 20 tot 22px. Minder dan de helft van de
   44px die elk ander tikdoel in dit bestand wél expliciet heeft gekregen;
   `min-width:44px` stond tot nu toe alleen bij .taalbol (regel 331 en 359).
   Het raakt de zes taalknoppen, die zonder JavaScript altijd openstaan en
   met JavaScript op elk scherm boven 880px. text-align houdt de letters
   gecentreerd in het bredere vlak, anders schuift het label naar links weg
   van waar iemand tikt. */
header.site nav a,
header.site nav button.navknop,
header.site nav form.navform button:not(.taalbol){display:inline-block;padding:14px 2px;
  min-width:44px;text-align:center}
/* Op ELKE breedte, niet alleen onder 700px (D-21-09-4, 21-09). Deze regel
   stond binnen een media-query en was de enige `td a`-regel in het hele
   stijlblad. Daarboven viel de klikbare hoogte terug op de regelhoogte van de
   tekst: 14px maal 1,5 is 21px, onder de WCAG 2.2 AA-vloer van 24px. Een
   tablet in portret (768px) is een aanraakscherm en viel daar net buiten.
   Op de muis kost dit niets; het raakt 29 sjablonen met .tabelscroll. */
.tabelscroll td a{display:inline-block;min-height:44px;padding:11px 0}
.navsamen{position:relative;white-space:nowrap}
.navdot{display:inline-block;width:8px;height:8px;border-radius:50%;
  background:var(--accent);margin-left:var(--sp-1);vertical-align:super}

/* ============ praatkaarten (hoofdstuk 2) ============ */
/* Zeven soorten, elk een kleurfamilie uit het thema. --pk kleurt rand, gloed,
   embleem en miniaturen; de rest van de kaart blijft in de kaartkleur. */
.soort-gunst{--pk:var(--amber)}
.soort-ontdek{--pk:var(--lav)}
.soort-verschil{--pk:var(--sage)}
.soort-parel{--pk:var(--accent)}
/* fantasie: verwant aan 'parel' maar dromeriger — accent richting lavendel.
   Oudere browsers zonder color-mix vallen terug op lavendel. */
.soort-fantasie{--pk:var(--lav)}
@supports (color: color-mix(in srgb, red 50%, blue)) {
  .soort-fantasie{--pk:color-mix(in srgb, var(--accent) 45%, var(--lav))}
}
/* vraag-terug: verwant aan 'ontdek' maar warmer — lavendel richting amber.
   Oudere browsers zonder color-mix vallen terug op lavendel. */
.soort-vraagterug{--pk:var(--lav)}
@supports (color: color-mix(in srgb, red 50%, blue)) {
  .soort-vraagterug{--pk:color-mix(in srgb, var(--lav) 55%, var(--amber))}
}
/* trioverschil: verwant aan 'zacht verschil' maar iets warmer — salie
   richting amber. Oudere browsers zonder color-mix vallen terug op salie. */
.soort-trioverschil{--pk:var(--sage)}
@supports (color: color-mix(in srgb, red 50%, blue)) {
  .soort-trioverschil{--pk:color-mix(in srgb, var(--sage) 60%, var(--amber))}
}
.soort-seizoen{--pk:var(--gray)}
/* --accent-2 is een licht vlakkleur; als 45%-tekstmix haalde deze badge
   maar 4,07:1 (theme-v) en 4,15:1 (theme-n). Minder vlakkleur, meer inkt:
   5,11-6,19:1 in alle thema's (review 06-08). */
.soort-onbekend{--pk:var(--accent-2)}
.soort-onbekend .pk-soortnaam,.soort-onbekend .pk-mini-kop{
  color:color-mix(in srgb,var(--accent-2) 35%,var(--ink))}
/* En het ICOON op diezelfde kaart (D-17-09-27, 18-09). De regel hierboven
   repareerde in augustus de tekstvarianten van deze kaart, met de meting
   erbij; `.pk-front .illu` bleef op de generieke 75%-mix staan en haalde
   daarmee 2,20:1 (thema n) tot 2,43:1 (beheer), tegen een eis van 3:1 voor
   een grafisch element dat betekenis draagt. Het viel nergens op omdat een
   kaart zonder vastgelegde soort alleen bij bewaarde kaarten uit een oudere
   versie voorkomt, en er dus geen in de snapshotset staat. */
.soort-onbekend .pk-front .illu{
  color:color-mix(in srgb,var(--accent-2) 35%,var(--ink))}

/* ============ welkomsttour ============ */
/* Geen opacity op de stippen (defect P3-D, 20-08). `opacity:.3` gaf 1,51 tot
   1,61:1 in de vier thema's, tegen een eis van 3:1 voor een grafisch object.
   Dit is de derde keer dat opacity als "even rustiger" bedoeld was en het
   contrast meenam; het middel dat alléén doet wat je bedoelt is een kleur.
   75% van --soft haalt 3,24 tot 3,93:1 in élk thema (nagerekend 20-08). */
.tour-dot{color:color-mix(in srgb,var(--soft) 75%,var(--card));font-size:var(--ts-1)}
.tour-dot.actief{opacity:1;color:var(--accent)}

.pk-toneel{display:flex;flex-direction:column;align-items:center;gap:var(--sp-4);margin-bottom:var(--sp-5)}
.pk-scene{display:flex;flex-direction:column;align-items:center;gap:var(--sp-3);width:100%}
.pk-scene.pk-weg{display:none}
.pk-scene.pk-uit .pk-kaart{animation:pk-strooi-uit .28s ease-in both}
.pk-scene.pk-in .pk-kaart{animation:pk-strooi-in .5s cubic-bezier(.2,1.2,.35,1) both}
@keyframes pk-strooi-uit{to{opacity:0;transform:translate(26px,12px) rotate(6deg)}}
@keyframes pk-strooi-in{from{opacity:0;transform:translate(-14px,-20px) rotate(-5deg) scale(.96)}
  to{opacity:1;transform:none}}

/* De kaart zelf: echte speelkaartverhouding 5:7, 3D-flip om de y-as. */
.pk-kaart{width:min(100%,340px);aspect-ratio:5/7;perspective:1400px;cursor:pointer;
  outline-offset:4px;border-radius:calc(var(--r-small) + 6px)}
.pk-inner{position:relative;width:100%;height:100%;transform-style:preserve-3d;
  transition:transform .65s cubic-bezier(.35,.1,.25,1)}
.pk-kaart.is-om .pk-inner{transform:rotateY(180deg)}
.pk-kaart.pk-direct .pk-inner{transition:none}
.pk-vlak{position:absolute;inset:0;backface-visibility:hidden;-webkit-backface-visibility:hidden;
  border-radius:calc(var(--r-small) + 6px);
  /* Mengen met --ink in plaats van --rule: 1,75 -> 4,78 (amber) en
     1,86 -> 5,36 (gray). De mini-kaartjes staan dicht op elkaar en de
     rand is het enige dat ze scheidt (review 07-08). */
  border:1.5px solid color-mix(in srgb,var(--pk,var(--accent)) 55%,var(--ink));
  box-shadow:var(--shadow);display:flex;flex-direction:column;align-items:center;
  padding:18px 18px 14px;overflow:hidden}
.pk-front{transform:rotateY(180deg);text-align:center;justify-content:flex-start;
  gap:var(--sp-2);overflow-y:auto;
  background:
    radial-gradient(120% 90% at 50% -20%,color-mix(in srgb,var(--pk,var(--accent)) 14%,transparent),transparent 60%),
    radial-gradient(140% 100% at 50% 120%,color-mix(in srgb,var(--pk,var(--accent)) 9%,transparent),transparent 55%),
    var(--card)}
.pk-front .illu{margin:2px 0 4px;color:color-mix(in srgb,var(--pk,var(--accent)) 75%,var(--ink));flex:0 0 auto}
.pk-soortnaam{font-size:var(--ts-1);letter-spacing:.16em;text-transform:uppercase;font-weight:700;
  /* 45% i.p.v. 70%: bij een lichte --pk (accent-2, amber) haalde het
     label anders geen 4,5:1 op de kaart (review 05-08). */
  color:color-mix(in srgb,var(--pk,var(--accent)) 45%,var(--ink))}
.pk-vraag{font-family:var(--display);font-size:clamp(var(--ts-7),2.6vw,var(--ts-8));line-height:1.42;
  margin:2px 0 auto;max-width:34ch}
.pk-voet{font-size:var(--ts-3);color:var(--soft);margin:10px 0 0;font-variant-numeric:tabular-nums}
.pk-hoek{position:absolute;font-size:var(--ts-3);opacity:.55;pointer-events:none}
.pk-hoek-lb{left:10px;top:8px}
.pk-hoek-ro{right:10px;bottom:8px;transform:rotate(180deg)}
.pk-beiden{margin-top:6px}

/* De rug: hartlijn-patroon in zuivere CSS plus het monogram. */
.pk-rug{justify-content:center;
  background:
    repeating-linear-gradient(45deg,color-mix(in srgb,var(--accent) 9%,transparent) 0 2px,transparent 2px 14px),
    repeating-linear-gradient(-45deg,color-mix(in srgb,var(--accent) 9%,transparent) 0 2px,transparent 2px 14px),
    linear-gradient(160deg,var(--glow),var(--card) 70%)}
.pk-rug-kader{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:var(--sp-2);width:78%;height:84%;border:1.5px solid color-mix(in srgb,var(--accent) 40%,var(--rule));
  border-radius:var(--r-small);outline:1px solid color-mix(in srgb,var(--accent) 22%,transparent);
  outline-offset:5px;background:color-mix(in srgb,var(--card) 82%,transparent)}
.pk-monogram{font-family:var(--display);font-size:var(--ts-12);color:var(--accent);letter-spacing:.04em}
.pk-hartlijn{width:64%;height:14px;
  background:radial-gradient(circle at 6px 5px,var(--accent-2) 3px,transparent 3.5px) 0 0/16px 14px repeat-x;
  -webkit-mask:linear-gradient(90deg,transparent,#000 20% 80%,transparent);
  mask:linear-gradient(90deg,transparent,#000 20% 80%,transparent)}
.pk-rug-sub{font-size:var(--ts-1);letter-spacing:.22em;text-transform:uppercase;color:var(--soft)}

/* Zonder JavaScript geen flip: de voorkant ligt dan gewoon open (de rug is
   pas zichtbaar als het script de pk-js-klasse zet). */
html:not(.pk-js) .pk-rug{display:none}
html:not(.pk-js) .pk-front{transform:none}
html:not(.pk-js) .pk-scene.pk-weg{display:flex}

.pk-acties{display:flex;gap:var(--sp-3);flex-wrap:wrap;justify-content:center;align-items:center}
.pk-voortgang,.pk-toets{margin:0;text-align:center}
/* Geen opacity: dit is functionele instructietekst, geen versiering. Met
   .75 zakte hij naar 3,2-3,9:1 (eis 4,5) in alle vier de thema's; met alleen
   --soft van .note-text haalt hij 5,46-7,29:1 (gemeten 08-08). */
.pk-toets{font-size:var(--ts-2)}
.pk-slot{margin:0;text-align:center}

/* Planken: miniaturen in de soortkleur, klikbaar voor groot. */
.pk-plank{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));
  gap:var(--sp-3);margin-top:var(--sp-3)}
.pk-mini{font:inherit;text-align:left;cursor:pointer;display:flex;flex-direction:column;
  gap:var(--sp-1);padding:10px 12px;border-radius:var(--r-small);color:var(--ink);
  border:1.5px solid color-mix(in srgb,var(--pk,var(--accent)) 55%,var(--ink));
  background:linear-gradient(165deg,color-mix(in srgb,var(--pk,var(--accent)) 10%,var(--card)),var(--card) 75%);
  transition:transform .15s,box-shadow .15s}
.pk-mini:hover{transform:translateY(-2px);box-shadow:var(--shadow)}
.pk-mini-kop{font-size:var(--ts-1);letter-spacing:.1em;text-transform:uppercase;font-weight:700;
  /* 45% i.p.v. 70%: bij een lichte --pk (accent-2, amber) haalde het
     label anders geen 4,5:1 op de kaart (review 05-08). */
  color:color-mix(in srgb,var(--pk,var(--accent)) 45%,var(--ink))}
.pk-mini-kop i{font-style:normal}
.pk-mini-tekst{font-size:var(--ts-3);line-height:1.4;display:-webkit-box;
  -webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.pk-mini-voet{font-size:var(--ts-1);color:var(--soft);margin-top:auto}
.pk-mini-beiden{box-shadow:0 0 0 2px color-mix(in srgb,var(--pk,var(--accent)) 30%,transparent)}
.pk-leeg{font-size:var(--ts-4);color:var(--soft);font-style:italic;margin:10px 0 0}

/* Miniatuur groot: dezelfde kaartstijl in een dialoog. */
.pk-dialoog{border:0;padding:0;background:transparent;max-width:min(92vw,380px);width:100%}
.pk-dialoog::backdrop{background:rgba(30,15,25,.45);backdrop-filter:blur(2px)}
.pk-dialoog-kaart{position:static;aspect-ratio:auto;min-height:0;text-align:center;
  gap:var(--sp-3);padding:26px var(--sp-5) 18px;overflow:visible}
.pk-dialoog-kaart .pk-vraag{margin:4px 0 6px}

/* Telefoon (≤700px). Aannames, narekenbaar: de wrap laat 12px per zijde
   (zie boven), dus de kaart krijgt hoogstens 100vw−24px breedte. Op het
   smalste gangbare scherm (320px) is dat 296px; verhouding 5:7 geeft dan
   ±414px hoogte. Compacte kop (±48px), knoppenrij (±44px), voortgang (±22px)
   en marges (±40px) samen ±154px: totaal ±568px, en dat past op elke
   viewport vanaf 568px logische hoogte (iPhone SE 1e gen. en alles daarna).
   Op bredere telefoons begrenst 320px kaartbreedte de hoogte tot 448px. */
@media (max-width:700px){
  .pk-intro{padding:12px 14px}
  .pk-intro .lede{font-size:var(--ts-4)}
  .pk-intro h1{margin:4px 0 2px}
  .pk-kaart{width:min(100%,320px)}
  .pk-vlak{padding:14px 14px 10px}
  .pk-vraag{font-size:var(--ts-6);max-width:none}
  .pk-monogram{font-size:var(--ts-11)}
  .pk-toets{display:none} /* geen toetsenbord op een telefoon */
  .pk-plank{grid-template-columns:repeat(auto-fill,minmax(132px,1fr))}
}

/* Minder beweging gevraagd: geen 3D-draai en geen strooi, maar een directe
   wissel (de globale reduced-motion-regel hierboven zet alle animaties en
   transities al uit; dit haalt ook de transform-flip zelf weg). */
@media (prefers-reduced-motion:reduce){
  .pk-inner{transform-style:flat}
  .pk-kaart.is-om .pk-inner{transform:none}
  .pk-vlak{backface-visibility:visible;-webkit-backface-visibility:visible}
  .pk-front{transform:none;opacity:0;pointer-events:none}
  .pk-kaart.is-om .pk-front{opacity:1;pointer-events:auto}
  .pk-kaart.is-om .pk-rug{opacity:0}
  /* zonder JavaScript is er geen flip: voorkant altijd tonen */
  html:not(.pk-js) .pk-front{opacity:1;pointer-events:auto}
}

/* ============ briefjes ============ */
.briefjes{display:flex;flex-direction:column;gap:var(--sp-2);margin-top:var(--sp-3);
  max-height:340px;overflow-y:auto;padding-right:var(--sp-1)}
.briefje{display:flex;flex-direction:column;max-width:78%;padding:8px 13px;
  border-radius:var(--r-small);font-size:var(--ts-4);background:var(--glow)}
.briefje.van-mij{align-self:flex-end;
  /* D-5 (dagtaak 30-08): stond op een kale --accent-2 en haalde
     1,40 tot 1,52:1 tegen de kaart, waar een betekenisdragende
     rand 3:1 vraagt. Dezelfde inkmenging als .opt, .track,
     .badge en de brugplank van 29-08; nagerekend 7,41 / 9,62 /
     8,54 / 10,22 over de vier thema's. */
  border:1px solid color-mix(in srgb,var(--accent) 55%,var(--ink));
  background:color-mix(in srgb,var(--accent) 9%,var(--card))}
.briefje.van-ander{align-self:flex-start;
  /* D-5: idem, 1,30 tot 1,53:1. Met --rule-sterk wordt het
     3,60 / 4,62 / 3,87 / 4,00. */
  border:1px solid var(--rule-sterk)}
/* 11px vet haalde als kaal --accent maar 4,03:1 op --glow in theme-v (eis
   4,5:1). Een vleugje inkt erdoor tilt alle vier de thema's over de grens
   (v 4,73 / m 6,51 / n 5,78 / admin 6,99) zonder kleurindruk te verliezen. */
.briefje .wie{font-size:var(--ts-2);font-weight:700;
  color:color-mix(in srgb,var(--ink) 18%,var(--accent))}
.briefje .tekst{white-space:pre-line;overflow-wrap:anywhere}
/* D-17-09-23 (18-09): dezelfde bescherming, maar als losse klasse.

   `.briefje .tekst` kreeg `overflow-wrap` op 13-08, nadat een lange URL de
   chatbubbel uitduwde. Drie plekken met precies dezelfde soort inhoud hadden
   hem niet: het afzenderadres in het postvak (een kaal adres tot 200 tekens,
   juist de categorie die daar hoort), de eigen getypte zinnen op /samen/meer,
   en de brieftekst in het cadeauboekje. Op een scherm met `overflow-x:clip`
   wordt zulke tekst stil afgekapt: de beheerder ziet dan niet meer van wie
   het bericht kwam, en dat is de hoofdfunctie van dat scherm.

   Een klasse in plaats van drie losse regels, zodat de vierde plek hem ook
   kan krijgen door hem op te schrijven. */
.breekbaar{overflow-wrap:anywhere}
/* P2-B (dagtaak 13-08): zonder woordafbreking liep een e-mailadres of
   URL de bubbel uit, en omdat body op overflow-x:clip staat verdween dat
   stuk tekst zonder scrollbalk. Geldt voor alle plekken waar iemand zelf
   tekst intypt of waar een lange naam kan staan. */
/* `.brief` staat er sinds 21-08 bij (P3): daar komt de tekst in die de
   deelnemer zelf typte letterlijk terug, precies zoals bij `.briefje .tekst`
   hierboven — en daar stond de reden al bij ("een e-mailadres of URL liep de
   bubbel uit"). Bij 320px is de kaart 268px breed; een ononderbroken reeks
   van ruim dertig tekens paste er niet meer in en werd door
   `overflow-x:clip` zonder scrollbalk afgeknipt. */
.note-text,.lede,.qtext,.tag,.chip,.kiesblok-note,.brief{overflow-wrap:anywhere}
/* M-12-09-6 (12-09): stond op --ts-1. Dat is 11px, en de ondergrens van
   13px wordt alleen BINNEN @media (max-width:700px) gezet (regel 474).
   Op tablet en bureaublad bleef dit dus 11px in de gedempte kleur, onder
   elk bericht. --ts-3 is 13px en wordt nergens herdefinieerd, dus nu
   overal gelijk. */
.briefje .tijd{font-size:var(--ts-3);color:var(--soft);margin-top:2px}

/* ============ waar sta ik ============ */
/* Eén groot getal als anker van de pagina: wat je hebt opgebouwd, niet wat
   er nog moet. De teller loopt op vanaf nul (script in de template). */
.wsi-groot{text-align:center;margin:var(--sp-5) 0 6px}
.wsi-getal{display:block;font-family:var(--display);
  font-size:clamp(48px,14vw,88px);line-height:var(--rh-strak);color:var(--accent);
  font-variant-numeric:tabular-nums}
.wsi-bij{display:block;font-size:var(--ts-5);color:var(--soft);margin-top:var(--sp-1)}

/* ============ ons gesprek ============ */
/* De vraag staat voorop; de antwoorden zitten achter een openklapper, zodat
   de kaart niet als scorekaart leest maar als gespreksonderwerp. */
.og-kaart{border-left:3px solid var(--accent-2)}
/* Tikdoel: als samenvouwknop moet dit 44px halen (gemeten 37px,
   review 06-08 avond). */
.og-open summary{font-size:var(--ts-4);color:var(--soft);font-weight:600;
  min-height:44px;display:flex;align-items:center}
.og-open[open] summary{margin-bottom:2px}

/* ============ dichtheidsmeter matchpool ============ */
.dichtheid{display:flex;gap:var(--sp-4);align-items:baseline;flex-wrap:wrap;
  padding:12px 14px;border-radius:var(--r-small);background:var(--glow);
  margin:12px 0}
.dichtheid .n{font-family:var(--display);font-size:var(--ts-10);line-height:var(--rh-strak);
  color:var(--accent);font-variant-numeric:tabular-nums}
.dichtheid .l{font-size:var(--ts-4);color:var(--soft)}

/* ============ deelkiezer op het antwoordenoverzicht ============ */
/* De hele lijst ineens was 180 KB HTML; nu één deel tegelijk. Gewone links,
   dus ook bruikbaar zonder JavaScript. */
.deelkiezer{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin:14px 0 4px}
.deelknop{display:inline-flex;flex-direction:column;align-items:center;
  min-height:44px;justify-content:center;padding:8px 16px;border-radius:99px;
  border:1.5px solid var(--rule-sterk);background:var(--field);
  color:var(--ink);text-decoration:none;font-size:var(--ts-4);line-height:var(--rh-kop)}
.deelknop small{color:var(--soft);font-size:var(--ts-2);font-variant-numeric:tabular-nums}
.deelknop:hover{border-color:var(--accent)}
/* De geselecteerde stand staat bij `.tabbar button.actief` (gedeelde regel).
   De 3px-rand die hier stond is bewust weg: hij was de enige van de drie en
   verschoof de knop een pixel bij het kiezen. */
/* Telcijfer op een actief tabblad: 4,03:1 in theme-v, eis 4,5. Zelfde
   recept als de eerder herstelde .profline b -> 4,81:1 (review 07-08). */
.deelknop.actief small{color:color-mix(in srgb,var(--ink) 20%,var(--accent))}

/* Aangekondigd onderhoud: opvallend genoeg om te lezen, rustig genoeg om
   niet te verontrusten. */
.banner.onderhoud{display:flex;gap:var(--sp-3);align-items:baseline;
  background:color-mix(in srgb,var(--amber) 18%,var(--card));
  /* Rand mengen met --ink in plaats van met --card: gemengd met de kaart
     bleef hij op 1,46-1,74:1 steken (eis 3) — een rand die zijn eigen eis
     niet haalt, terwijl juist dit de melding is die moet opvallen. */
  border:1px solid color-mix(in srgb,var(--amber) 55%,var(--ink))}

/* ============ spelgevoel ============ */
/* Ingetogen bevestiging, geen kermis: het product is warm en rustig, dus de
   interactie mag de vraag nooit overstemmen. Alles hieronder valt vanzelf
   stil bij prefers-reduced-motion (de globale regel hierboven zet elke
   animatie en transitie uit). */

/* De gekozen knop bevestigt zichzelf met één korte klop. */
.opt.net-gekozen{animation:klop .32s ease-out}
@keyframes klop{
  0%{transform:scale(1)}
  45%{transform:scale(1.035)}
  100%{transform:scale(1)}}

/* Bijna aan het eind van een blok: de balk krijgt een warme gloed. Dat is
   precies het moment waarop doorgaan het meest oplevert. */
.progress.bijna .track{box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 22%,transparent)}
.progress.bijna .track .bar-fill{animation:gloed 2.4s ease-in-out infinite}
@keyframes gloed{
  0%,100%{filter:brightness(1)}
  50%{filter:brightness(1.12)}}

/* Het antwoord van de ander vouwt open in plaats van er ineens te staan. */
.ruil-open{animation:ontvouw .5s ease both}
@keyframes ontvouw{
  from{opacity:0;transform:translateY(10px) scale(.985)}
  to{opacity:1;transform:none}}

/* Verzamelde badges reageren op aanraking: klein, maar het maakt de
   verzameling voelbaar. */
.badge{transition:transform .15s ease,box-shadow .15s ease}
.badge:hover{transform:translateY(-2px);box-shadow:var(--shadow)}

/* De statblokken op 'waar sta ik' idem. */
.stat{transition:transform .15s ease}
.stat:hover{transform:translateY(-2px)}

/* ============ lidmaatschap: de stappen ============ */
/* Genummerde tijdlijn op het betaalscherm (08-08). Links uitgelijnd binnen
   een gecentreerd blok: een genummerde lijst die zelf gecentreerd staat is
   niet te scannen, en juist scanbaarheid was hier het probleem. */
.lid-stappen{max-width:var(--lees);margin:10px auto 0;text-align:left}
.lid-stappen ol{margin:6px 0 0;padding-left:1.35em}
.lid-stappen li{margin-bottom:5px}
.lid-stappen li:last-child{margin-bottom:0}

/* Twee hulpklassen die inline stijlen vervangen die per tabelrij herhaald
   werden (review 08-08): 279x `width:180px` en 333x `color:var(--soft)` in
   één uitgerenderde pagina. De klassen doen precies hetzelfde, maar één keer
   in plaats van per cel — dat scheelt tientallen kilobytes op /overzicht en
   /admin/berichten zonder dat er iets aan de indeling verandert. */
.gedempt{color:var(--soft)}
col.kol-antwoord{width:180px}

/* Een weergavenaam heeft geen tekenlimiet, en boven 880px geldt de
   scrollbare nav niet meer. Een ongewoon lange naam zou de balk dan alsnog
   breder maken dan .wrap, en `body{overflow-x:clip}` maakt wat eraf valt
   onbereikbaar — hetzelfde defect als op 08-08, met een andere aanleiding.
   Een harde bovengrens met beletselteken sluit dat af. */
header.site .me{max-width:14ch;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;display:inline-block;vertical-align:bottom}

/* Standmeldingen op het beheerscherm (10-08). De tekst zegt zelf al wat de
   stand is ("in orde" / "let op" / "mis"); de kleur is versiering erbovenop,
   zodat dit ook zonder kleurwaarneming en zonder CSS te lezen blijft. */
.stand{display:inline-block;padding:2px 10px;border-radius:99px;
  font-size:var(--ts-3);font-weight:600;white-space:nowrap;
  border:1.5px solid var(--rule-sterk);color:var(--ink)}
/* Standkleuren via thematokens (V-10, 21-08). Hier stonden zes losse
   hexwaarden, terwijl de rest van dit bestand alles via variabelen doet en
   dat ook expliciet bewaakt. Gevolg: deze drie labels bleven in elk thema
   dezelfde kleur, ook in het beheerthema en het mannenthema waar de rest van
   het scherm anders is. De tokens hieronder staan per thema gedefinieerd en
   zijn gemengd uit --sage, --amber en --stop, die er al waren. */
.stand-groen{border-color:var(--stand-groen-rand);color:var(--stand-groen)}
.stand-rood{border-color:var(--stand-rood-rand);color:var(--stand-rood)}

/* De zachte por bij stilte (10-08). Bewust rustig: een zacht kader, geen
   waarschuwingskleur. Dit is een uitnodiging, geen aanmaning — en het staat
   op het scherm van iemand die zich misschien al afvraagt of het nog wat
   wordt. */
.por{margin-top:10px;padding:12px 14px;border:1px solid var(--rule);
  border-radius:var(--r);background:var(--card)}

/* Nieuw in deze versie van het portret (10-08). Zacht gemarkeerd: het moet
   opvallen dat het beeld is aangegroeid, zonder dat de tekst een
   markeerstift-oefening wordt. Ook zonder kleur blijft het leesbaar, en de
   regel eronder zegt in woorden hoeveel zinnen er bij kwamen. */
mark.beeld-nieuw{background:linear-gradient(transparent 62%,var(--accent-2) 62%);
  color:inherit;padding:0 1px;border-radius:2px}

/* Het keuzescherm van deel 3 (10-08). Grote, rustige knoppen: dit is een
   moment van zelf sturen, geen formulier dat je snel wegklikt. */
/* Groepskoppen in de deurenhal (02-09). Negentien kaarten onder een kop
   waren een inventaris; nu vier groepen. Klein, rustig, en met ruimte
   erboven zodat de groep leest als een alinea en niet als een streep. */
.rt-groep{font-size:var(--ts-3);color:var(--soft);margin:var(--sp-5) 0 var(--sp-2);
  font-weight:600;letter-spacing:.08em;text-transform:uppercase}
.rt-groep:first-child{margin-top:var(--sp-2)}
/* Dichtgeklapte groepen in de hal (05-09): de groepskop is nu een summary.
   Zelfde letter, wel een tikdoel van 44px en het pijltje als teken dat er
   iets onder zit. Wat je openzet onthoudt de browser (base.html). */
.rt-blok{margin-top:var(--sp-3)}
/* Geen display:list-item (D-06-09-2): dat haalt het browser-eigen driehoekje
   terug naast het eigen ::before-teken hierboven; twee tekens per kop. */
summary.rt-groep{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);cursor:pointer;
  min-height:44px;padding:10px 0;margin:0}
.rt-blok[open]>summary.rt-groep{margin-bottom:var(--sp-2)}
.hs-uitleg>summary{padding:8px 0;font-weight:600}
.kiesblok-rij{margin:0 0 10px}
/* Een variant achter een familiedeur, op /alles (dagelijkse ronde 10-09,
   P2). Familie en variant stonden daar als twee identieke rijen onder
   elkaar, terwijl de docstring van index_regels() zegt dat de familie
   vooraan staat en de varianten erachter. Een inspringing plus een lijntje
   langs de linkerkant maakt dat verschil zichtbaar zonder een tweede
   kaart of een tweede kop; de rij blijft een gewoon tikdoel van 44 pixels.
   Op de telefoon springt hij minder in: daar is de kolom 12 pixels van de
   rand af en telt elke pixel breedte. */
.kiesblok-onder{margin-left:18px;border-left:2px solid var(--rule)}
.kiesblok-onder .kiesblok-kop{font-size:var(--ts-6);font-weight:500}
@media (max-width:700px){.kiesblok-onder{margin-left:10px}}
.kiesblok-knop{display:block;width:100%;text-align:left;font:inherit;
  background:var(--card);border:1.5px solid var(--rule-sterk);border-radius:var(--r);
  padding:14px 16px;cursor:pointer;min-height:44px}
.kiesblok-knop:hover,.kiesblok-knop:focus-visible,.momentknop:hover,.momentknop:focus-visible{border-color:var(--accent)}
.kiesblok-knop.gekozen{border-color:var(--accent);border-width:2px}
/* Het momentkaartje (03-09): dezelfde kaart als .kiesblok-knop, eigen klasse omdat het
   geen inventaris is (tests/test_inventaris.py). */
.momentknop{display:block;width:100%;text-align:left;font:inherit;background:var(--card);
  border:1.5px solid var(--rule-sterk);border-radius:var(--r);padding:14px 16px;cursor:pointer;min-height:44px}
.kiesblok-kop{display:block;font-size:var(--ts-7);font-weight:600;color:var(--ink)}
.kiesblok-stand{display:block;font-size:var(--ts-4);color:var(--soft);margin:2px 0 8px}
.kiesblok-note{display:block;font-size:var(--ts-3);color:var(--soft);margin-top:var(--sp-2);
  max-width:var(--lees-breed)}
.kiesblok-knop .dtrack{display:block}

/* De drie delen als één strook: deel 3 is er zichtbaar één van drie, en je
   ziet dat er een einde aan zit. Dat was het halve probleem — niet het
   aantal vragen, maar dat je het einde niet kon zien. */
.delen{display:flex;gap:var(--sp-2);align-items:center;margin:0 0 10px}
.delen .deel{flex:1;min-width:0}
.delen .deel .lab{display:flex;justify-content:space-between;font-size:var(--ts-2);
  color:var(--soft);margin-bottom:2px}
/* Zelfde rand en dezelfde reden als bij .dagportie .balk hierboven: dit is
   exact dezelfde constructie en viel bij beide eerdere opschoonrondes buiten
   beeld, omdat er alleen naar de dagportie werd gekeken. Een deel dat nog op
   nul staat, is zonder rand niet van de kaart te onderscheiden -- en juist
   bij deze strook is het lege deel de helft van de boodschap. */
.delen .deel .balk{height:6px;border-radius:99px;background:var(--rule);
  overflow:hidden;border:1px solid var(--rule-sterk);box-sizing:border-box}
.delen .deel .balk span{display:block;height:100%;background:var(--accent)}
.delen .deel.hier .lab{color:var(--ink);font-weight:600}

/* Themakaarten (10-08). De mix over de drie delen staat als kleine pillen op
   de kaart: dat is precies wat een thema anders maakt dan een hoofdstuk. */
.thema-mix{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-2)}
.thema-mix .chip{font-size:var(--ts-2);padding:3px 9px;box-shadow:none;
  border:1px solid var(--rule-sterk)}
.kiesblok-knop[disabled]{opacity:1;cursor:default;border-style:dashed}
.kiesblok-knop[disabled] .kiesblok-kop{color:var(--soft)}

/* De dagportie: een zacht doel, geen plafond. Klein en rustig — hij mag
   nooit als een limiet lezen. */
.dagportie{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--ts-3);
  color:var(--soft);margin:0 0 8px}
/* De rand is de andere helft van B-1 (dagtaak 28-08 avond). De vulling was
   op de ochtendronde al goed gezet, maar het LEGE vlak stond nog kaal als
   --rule op --card: 1,34 (v) / 1,53 (m) / 1,42 (n) / 1,30 (admin) : 1, ver
   onder de 3:1 die WCAG 1.4.11 voor een voortgangsindicator vraagt. Zolang
   de balk leeg is, is dat vlak het énige wat er te zien valt; zonder rand
   staat er dus letterlijk niets. Met --rule-sterk wordt het
   3,60 / 4,62 / 3,87 / 4,00. Precies dezelfde ingreep die .track en .dtrack
   op 07-08 kregen, met een token dat al bestaat en geen nieuwe kleur.
   box-sizing hoort erbij, anders wordt de balk 2px hoger dan bedoeld. */
.dagportie .balk{flex:0 0 70px;height:5px;border-radius:99px;
  background:var(--rule);overflow:hidden;
  border:1px solid var(--rule-sterk);box-sizing:border-box}
/* Vulling met --accent en niet --accent-2 (dagtaak 28-08, B-1). Met de
   vlakkleur was de balk niet van zijn eigen rand te onderscheiden:
   nagerekend 1,09 / 1,09 / 1,00 / 1,17 : 1 in v/m/n/admin, tegen een eis
   van 3:1 voor een voortgangsindicator. Met --accent wordt dat
   3,68 / 4,00 / 4,22 / 5,42. De tussenweg color-mix(--accent 80%,
   --accent-2), zoals .track en .dtrack als verloopbegin gebruiken, haalt
   het NIET (2,84 / 2,84 / 3,00 / 3,79) -- vandaar puur --accent. */
.dagportie .balk span{display:block;height:100%;background:var(--accent)}

/* De vier bolletjes van de uitnodigingstrechter op /admin/accounts
   (dagtaak 28-08, A-1). Bewust geen kleurverschil als enige drager: gevuld
   tegen leeg is ook zonder kleur te zien, en elke bol draagt een aria-label
   met de stap in woorden. Rand met --rule-sterk, want --rule haalt de 3:1
   voor een niet-tekstueel element niet -- dezelfde les als B-1 hierboven. */
.trechterbol{display:inline-block;width:10px;height:10px;border-radius:50%;
  margin-right:var(--sp-1);border:1.5px solid var(--rule-sterk);background:transparent;
  vertical-align:middle}
.trechterbol.vol{background:var(--accent);border-color:var(--accent)}

/* Een rij waar jullie hetzelfde antwoordden (10-08). Zacht gemarkeerd; het
   vinkje in de cel doet het werk, de kleur is er alleen bij. */
tr.gelijk td{background:color-mix(in srgb, var(--accent-2) 22%, transparent)}

/* Het verkenscherm (12-08): de kaart van alle blokken, naar het model van de
   kaartenrasters die Jeroen aandroeg. Eén tekening per blok uit de eigen
   bibliotheek — geen emoji (K9). Twee kolommen op de telefoon zou de titels
   breken, dus daar één; vanaf 560px twee, vanaf 900px drie. */
.verkenrooster{display:grid;gap:var(--sp-3);margin-top:var(--sp-3);
  grid-template-columns:1fr}
@media (min-width:560px){.verkenrooster{grid-template-columns:1fr 1fr}}
@media (min-width:900px){.verkenrooster{grid-template-columns:1fr 1fr 1fr}}
.verkenkaart{background:var(--card);border:1px solid var(--rule-sterk);
  border-radius:var(--r);padding:16px 16px 14px;display:flex;
  flex-direction:column;box-shadow:var(--shadow)}
.verkenkaart h3{margin:6px 0 4px;font-size:var(--ts-7)}
.verkenkaart .note-text{margin:0 0 8px}
.verkenkaart .verken-stand{margin:auto 0 8px;font-size:var(--ts-4);
  color:var(--soft)}
.verken-illu{display:flex;justify-content:center;color:var(--accent)}
/* Een afgerond blok blijft gewoon leesbaar: dimmen zou precies de tekst
   raken die vertelt dát het af is (les C-7, 10-08). Alleen de rand viert. */
.verkenkaart.af{border-color:var(--accent)}
.verkenkaart.op-slot .verken-illu{color:var(--soft)}

/* --- Aandachtkader ------------------------------------------------------
   Vijf plekken zetten hun rand inline met var(--accent-2) (1,46:1) of
   var(--rule) (1,34:1) — precies de waarden die bij .badge en .opt al zijn
   afgekeurd, want een rand die je niet ziet omlijnt niets.

   Waarom dit blok ONDERAAN staat en waarom er twee selectors zijn (13-08,
   derde ronde): de eerste versie stond bovenin met alleen `.aandacht`
   (specificiteit 0,1,0). Op /overzicht en /waar-sta-ik staat de klasse op
   een `.card`, en `.theme-v .card` (0,2,0) wint daarvan altijd — dus in het
   vrouw-thema verdween de hele omlijning, én de padding en achtergrond,
   doordat `.card` verderop in het bestand staat. De fix was er, maar kwam
   nergens aan. `.card.aandacht` is óók 0,2,0; door dit blok ná alle
   thema-blokken te zetten wint het bij gelijke specificiteit.

   .aandacht        de gestreepte accentrand (~4,9:1 tegen de kaart)
   .aandacht-strak  doorgetrokken, in --rule-sterk (3,6 tot 6,7:1 per thema)
*/
.aandacht,.card.aandacht{border:1.5px dashed var(--accent);
  border-radius:var(--r);padding:12px 14px;background:var(--field)}
.aandacht-strak,.card.aandacht-strak{border-style:solid;
  border-color:var(--rule-sterk)}

/* Het scoreblok van het raadspel (13-08, derde ronde). Hier stond .badge:
   een pil met border-radius:99px, gemaakt voor het korte "100%" dat er
   vroeger in stond. De tekst is nu een hele zin ("jullie kwamen 3 van de 4
   keer op hetzelfde uit"), en die breekt op een smal scherm over twee of
   drie regels — dan vouwt de volle ronding zich om lopende tekst heen en
   komt het icoon scheef te staan. Zelfde warmte, maar met de gewone
   kaartronding en het icoon netjes bovenaan uitgelijnd. */
.scoreblok{display:flex;align-items:flex-start;gap:var(--sp-3);text-align:left;
  max-width:var(--lees);margin-left:auto;margin-right:auto;padding:12px 16px;
  border-radius:var(--r);font-size:var(--ts-6);line-height:1.45;
  background:linear-gradient(90deg,var(--glow),var(--card));
  border:1.5px solid var(--rule-sterk)}
.scoreblok-ik{flex:0 0 auto;line-height:var(--rh-strak)}
@media (max-width:480px){.scoreblok{padding:12px 14px;font-size:var(--ts-6)}}
/* Bijschrift onder een waarde. Hier stond `opacity:.85` (13-08, ronde 5):
   die mengt de tekstkleur met de achtergrond vóórdat het contrast telt, en
   bij 11,5px geldt 4,5:1 en niet de 3:1 van grote tekst. Gemeten zakte de
   duiding daardoor naar 4,02 (v) / 3,97 (n) / 3,93 (admin) — onder de norm.
   Een eigen token doet alleen wat het moet doen: iets zachter dan de
   hoofdtekst, met een contrast dat we één keer hebben uitgerekend.
   Tegen de kaart van DIT stijlblad: 5,67 (v) / 7,29 (m) / 5,56 (n) /
   5,46 (admin). In het boekje staat dezelfde kleur op papier en komt
   hij uit op 5,59 / 7,75 / 5,52 — die cijfers stonden hier eerst, uit
   het verkeerde bestand overgenomen (rechtgezet in ronde 6). */
.radar-duiding{display:block;font-size:var(--ts-2);color:var(--bijschrift);
  margin-top:1px}

/* === De doorsnee van het huis (14-08) ===================================
   Opdracht Jeroen: "maak het grafisch mooi, een mooi huis om in te wonen
   en te verkennen." Het beeld staat in templates/huisbeeld.html; hier
   staat alleen hoe het ademt.

   Drie regels waar niet vanaf geweken wordt:
     * geen enkele hardgecodeerde kleur — alles via de thematokens, zodat
       het huis in alle vier de thema's klopt;
     * elk raam is een link met een zichtbare focusring, dus het huis is
       ook met het toetsenbord te verkennen;
     * alle beweging gaat uit onder prefers-reduced-motion. Een huis dat
       beweegt terwijl iemand daarom heeft gevraagd is geen mooi huis. */
.hs-beeld{display:block;width:100%;height:auto;max-width:760px;
  margin:0 auto 4px;overflow:visible}
/* Onder 700px is de tekening geen navigatie meer (dagtaak 25-08, B-3).
   Nagerekend uit de viewBox (1000x760) en de padding van .wrap en .card: op
   320px is de schaal 0,268, en dan is een lantaarn 20 bij 25 pixels en een
   kamerraam 34 bij 26. De norm is 44 bij 44, en die is hier ook niet te
   halen: 44px vraagt 164 viewBox-eenheden per doel, en er staan 22 doelen
   naast elkaar in een tekening van 1000 breed. Ze zouden over elkaar heen
   vallen.
   Precies onder deze breedte staat sinds 21-08 al de kamerlijst, met gewone
   regels als tikdoel en dezelfde namen. Het zou dus een dubbele navigatie
   zijn, waarvan de ene helft te klein is om te raken en allebei de helften
   in de tabvolgorde staan. De tekening verdwijnt hier daarom; alle negentien
   adressen die erin zaten staan ook buiten de tekening op dit scherm. */
/* HERZIEN 10-09, op vraag van Jeroen: "klopt het dat je op de telefoon het
   daadwerkelijke huis niet ziet?" Het klopte, en de reden hierboven ging
   over TIKKEN en niet over ZIEN. Het huis is de kern van het product; wie
   het alleen op zijn telefoon opent, zag het nooit.
   De tekening staat er nu wel, maar als plaat: `pointer-events:none` haalt
   de tikdoelen weg die te klein zijn, en de kamerlijst eronder blijft het
   tikdoel met regels van 48 pixels. Met het toetsenbord blijven de ramen
   bereikbaar, en dat is winst en geen dubbele navigatie: er is niets dat
   kleiner is dan de norm en toch aangewezen wordt. */
.hint-klein{display:none}
@media (max-width:700px){
  .hs-beeld{display:block;pointer-events:none}
  .hint-groot{display:none}
  .hint-klein{display:block}
}
/* En dezelfde regel buiten de telefoonbreedte: een chip die een link is,
   is overal een tikdoel (dagelijkse ronde 10-09, P2). */
a.chip,.chip:has(a){min-height:44px;display:inline-flex;align-items:center}

.hs-raam,.hs-lantaarn,.hs-deur,.hs-brug,.hs-pad{cursor:pointer}
.hs-raam rect,.hs-deur rect,.hs-lantaarn path{transition:opacity .25s ease,
  stroke-width .2s ease}
.hs-raam:hover .hs-schijn,.hs-raam:focus-visible .hs-schijn{opacity:1}
.hs-raam:hover rect:not(.hs-schijn),.hs-deur:hover rect{stroke-width:3.5}
/* De focusring hoort óp het raam te vallen, niet op de hele svg. */
.hs-raam:focus-visible,.hs-lantaarn:focus-visible,.hs-deur:focus-visible,
.hs-brug:focus-visible,.hs-pad:focus-visible{outline:3px solid var(--accent);
  outline-offset:3px;border-radius:8px}

/* Het licht komt aan zoals licht aangaat: van onderaf, één kamer tegelijk.
   De vertraging staat per element in --hs-vertraag, zodat het huis zich
   vult in plaats van in één klap aanspringt. */
.hs-schijn{opacity:0;animation:hs-aan .9s ease forwards;
  animation-delay:var(--hs-vertraag,0ms)}
@keyframes hs-aan{from{opacity:0}to{opacity:.85}}
.hs-meubelstuk{opacity:0;animation:hs-meubel 1s ease forwards;
  animation-delay:calc(var(--hs-vertraag,0ms) + 260ms)}
@keyframes hs-meubel{from{opacity:0;transform:translateY(4px)}
  to{opacity:1;transform:translateY(0)}}
.hs-vlam{animation:hs-flakker 3.4s ease-in-out infinite}
@keyframes hs-flakker{0%,100%{opacity:.9;r:4}50%{opacity:1;r:4.6}}
.hs-rook{animation:hs-rook 7s ease-in-out infinite}
@keyframes hs-rook{0%{opacity:0;transform:translateY(6px)}
  35%{opacity:.85}100%{opacity:0;transform:translateY(-26px)}}
.hs-stof circle{animation:hs-dwarrel 6s ease-in-out infinite}
.hs-stof circle:nth-child(2){animation-delay:.9s}
.hs-stof circle:nth-child(3){animation-delay:1.9s}
.hs-stof circle:nth-child(4){animation-delay:2.7s}
@keyframes hs-dwarrel{0%,100%{transform:translateY(0);opacity:.55}
  50%{transform:translateY(-5px);opacity:.85}}
.hs-mistsliert{animation:hs-mist 9s ease-in-out infinite}
@keyframes hs-mist{0%,100%{opacity:.4;transform:translateX(0)}
  50%{opacity:.7;transform:translateX(5px)}}
.hs-plank{opacity:0;animation:hs-plank .7s ease forwards;
  animation-delay:var(--hs-vertraag,0ms)}
@keyframes hs-plank{from{opacity:0}to{opacity:1}}

/* Gevraagd is gevraagd: alles stil, en het licht staat gewoon aan. */
@media (prefers-reduced-motion:reduce){
  .hs-schijn,.hs-meubelstuk,.hs-vlam,.hs-rook,.hs-stof circle,
  .hs-mistsliert,.hs-plank{animation:none;opacity:.85;transform:none}
  .hs-meubelstuk,.hs-plank{opacity:1}
}

/* De kamerkaarten onder het huis zijn het doel van de ramen: een sprong
   erheen moet niet onder de vaste kop verdwijnen. */
.hs-kamer{scroll-margin-top:84px}

/* De plattegrond onder het huis: elke deur van de tool op zijn plek. */
.hs-groep{font-size:var(--ts-3);letter-spacing:.06em;text-transform:uppercase;
  color:var(--bijschrift);margin:16px 0 6px}
.hs-deuren{display:grid;gap:var(--sp-2);
  grid-template-columns:repeat(auto-fill,minmax(170px,1fr))}
.hs-deuren .kiesblok-knop{text-decoration:none}
/* Een lantaarn achter een gesloten deur is te zien, niet aan te raken. */
.hs-lantaarn.vast{cursor:default}

/* De kist op zolder: een gesloten luik blijft rustig, een volle kist mag
   even opvallen als hij bijna opengaat. */
.hs-kist{cursor:pointer}
.hs-kist rect{transition:stroke-width .2s ease}
.hs-kist:hover rect{stroke-width:3.5}

/* === Aanwijsbaarheid van het huis (14-08) ==============================
   Melding Jeroen: "als ik over het huis scroll krijg ik niet duidelijk wat
   ik ermee kan doen." Terecht — het huis was klikbaar zonder het te
   vertellen. Een handje als muisaanwijzer en één pixel randdikte zijn geen
   uitnodiging.

   Drie dingen, en geen vierde: de naam van de kamer verschijnt waar je
   wijst, het raam licht duidelijk op, en de rest van het huis geeft
   hetzelfde signaal. Twaalf namen tegelijk tonen zou van het huis een menu
   maken; dat is precies wat het niet moet zijn. */
.hs-naam{opacity:0;pointer-events:none;transition:opacity .15s ease}
.hs-raam:hover .hs-naam,.hs-raam:focus-visible .hs-naam{opacity:1}
/* Sinds 15-08 tonen ook de lantaarns hun naam bij aanwijzen; die hadden
   alleen een <title>, en dat is een tooltip die pas na een seconde
   stilhouden verschijnt en op een telefoon nooit (melding Jeroen). */
.hs-lantaarn:hover .hs-naam,.hs-lantaarn:focus-visible .hs-naam{opacity:1}
/* En wat altijd zichtbaar is: klein, grijs, en het staat niemand in de weg.
   Besluit Jeroen 15-08 — alles wat betekenis draagt zegt wat het is, behalve
   de twaalf kamernamen: die twaalf tegelijk maken er wél een menu van. */
.hs-vast{pointer-events:none}
/* Het raam zelf licht op: een echte sprong in helderheid, geen pixel. */
.hs-raam:hover rect:not(.hs-schijn):not([fill^="var(--card)"]),
.hs-raam:focus-visible rect:not(.hs-schijn):not([fill^="var(--card)"]){
  stroke:var(--accent);stroke-width:4}
.hs-raam:hover .hs-schijn,.hs-raam:focus-visible .hs-schijn{opacity:1}
/* En de rest van het huis doet mee, anders lijkt alleen het raam te leven. */
.hs-deur:hover rect,.hs-deur:focus-visible rect,
.hs-lantaarn:hover path,.hs-lantaarn:focus-visible path,
.hs-kist:hover rect,.hs-kist:focus-visible rect{stroke:var(--accent);
  stroke-width:4}
.hs-pad:hover path,.hs-pad:focus-visible path,
.hs-brug:hover path,.hs-brug:focus-visible path{stroke:var(--accent)}

/* A4 (15-08): de wachtkamer. Zacht ademend licht op één raam — de kamer waar
   de ander klaar is en jij nog niet. Geen felle knipper: dit is een
   uitnodiging, geen alarm. Onder prefers-reduced-motion blijft het licht
   staan zonder te bewegen, zodat de kamer nog steeds herkenbaar is. */
@keyframes hs-wacht-adem{0%,100%{opacity:.35}50%{opacity:.85}}
.hs-wacht rect:first-of-type{animation:hs-wacht-adem 3.4s ease-in-out infinite}
@media (prefers-reduced-motion:reduce){
  .hs-wacht rect:first-of-type{animation:none;opacity:.7}
}

/* ============ beweging uit, voor wie dat vraagt (5.10) ============
   Er stonden vijf losse prefers-reduced-motion-blokken in dit bestand, elk
   met de hand geschreven voor de animatie ernaast. Gemeten op 16-08: van de
   53 selectors met een animatie bleven er 17 over die niets uitzetten, plus
   zestien overgangen. Zo'n lijst loopt altijd achter op de laatste animatie
   die iemand toevoegt, dezelfde vorm als de emoji-zeef die deze nacht drie
   keer te smal bleek.

   Vandaar één afsluitende regel over alles. Bewust géén `animation:none`:
   veel animaties hier eindigen ergens (een licht dat aangaat, een kaart die
   inschuift), en met `none` blijft dat eindpunt weg. Een duur van vrijwel
   nul laat ze meteen op hun laatste beeld landen: het huis ziet er dus
   hetzelfde uit, het beweegt alleen niet meer.

   De losse blokken hierboven blijven staan: ze doen geen kwaad, en een paar
   zetten een expliciete eindwaarde die netter is dan wat de animatie zelf
   oplevert. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    animation-delay:0ms !important;
    transition-duration:.01ms !important;
    transition-delay:0ms !important;
    scroll-behavior:auto !important;
  }
}

/* De kamerlijst onder de doorsnee (D-1, 21-08). Alleen op smalle schermen:
   daarboven is de tekening ruim genoeg en zou de lijst hem herhalen. De
   tikdoelen zijn hier gewone regels, dus ruim boven de 44px die de rest van
   de site aanhoudt — dat is het hele punt van deze lijst. */
/* De vorm van zo'n regellijst staat apart van de vraag WANNEER hij zichtbaar
   is. Dat scheelde tot 10-09 een defect: `.kamerlijst` stond globaal op
   display:none en werd alleen onder 700px zichtbaar, en die klasse was op
   /waar-sta-ik hergebruikt voor twee heel andere lijsten. Op een DESKTOP zag
   je daar dus je eigen ingediende vragen niet, en ook niet de vier
   voorgestelde vragen die het wensformulier oplevert. Precies het omgekeerde
   van wat het huis nodig had, en niemand die het zag omdat de klasse voor
   het huis wél goed werkte (dagelijkse ronde 10-09, P1). */
.regellijst,.kamerlijst{list-style:none;padding:0;margin:14px 0 0}
.regellijst li,.kamerlijst li{margin:0}
.regellijst li + li,.kamerlijst li + li{border-top:1px solid var(--rule)}
.regellijst a,.kamerlijst a{display:flex;justify-content:space-between;
  align-items:center;gap:var(--sp-3);min-height:48px;padding:8px 4px;
  text-decoration:none;color:var(--ink)}
.regellijst a:hover,.regellijst a:focus-visible,
.kamerlijst a:hover,.kamerlijst a:focus-visible{color:var(--accent)}
.kl-naam{font-weight:600}
.kl-weer{font-size:var(--ts-3);color:var(--soft);text-align:right;
  overflow-wrap:anywhere}
/* Alleen de KAMERlijst is telefoonwerk: daar neemt hij de navigatie over van
   de tekening. `.regellijst` is altijd zichtbaar. */
.kamerlijst{display:none}
@media (max-width:700px){
  .kamerlijst{display:block}
}

/* Ons beeld (21-08): de zes groepen uit het beheerscherm, voor het paar
   zelf. Per regel de vraag en daaronder wat ieder antwoordde. Twee kolommen
   op een breed scherm, onder elkaar op een telefoon — de namen staan als
   label vóór het antwoord, zodat de regel ook zonder kolomkop leesbaar is. */
.ob-lijst{list-style:none;padding:0;margin:12px 0 0}
.ob-lijst li{padding:10px 0;border-top:1px solid var(--rule)}
.ob-lijst li:first-child{border-top:0}
.ob-vraag{display:block;margin-bottom:6px}
.ob-paar{display:flex;flex-wrap:wrap;gap:var(--sp-2) 20px}
.ob-kant{font-size:var(--ts-3);color:var(--soft)}
.ob-kant b{display:inline-block;min-width:0;margin-right:6px;
  font-weight:600;color:var(--ink)}

/* De gegevenslijst op de beheerkaart van een deelnemer (22-08).
   Twee kolommen die op een smal scherm onder elkaar vallen: een naam-waarde
   lijst hoort niet horizontaal te scrollen, en op 320 px past hij anders
   niet. De labels zijn zachter dan de waarden, zodat het oog de waarde
   vindt en niet het etiket. */
.kv{display:grid;grid-template-columns:auto 1fr;gap:var(--sp-1) 14px;
  margin:0 0 16px;font-size:var(--ts-4)}
/* `white-space:nowrap` klopt voor een kort etiket ("Geboortejaar"), maar op
   /eerstetwaalf staat de hele VRAAG in de dt -- de langste is 67 tekens en
   vraagt bij 13px zo'n 436 tot 479px, terwijl er binnen een kaart onder
   480px maar ~268px over is (zie de rekensom bij .grid2 hierboven). Vijf van
   de twaalf teksten pasten daar niet, en omdat body op `overflow-x:clip`
   staat kwam er geen scrollbalk: de tekst hield gewoon op. Dat is dezelfde
   stille afknipping als bij .grid2 op 06-08 (dagtaak 29-08, defect D-1).
   `min-width:0` erbij omdat een grid-item anders niet onder zijn
   inhoudsbreedte krimpt -- zonder die regel steekt de dt in de
   tweekoloms-stand alsnog buiten de kaart, precies zoals bij .grid2 en
   .axis .lab. */
.kv dt{color:var(--soft);white-space:normal;min-width:0;overflow-wrap:anywhere}
.kv dd{margin:0;color:var(--ink);overflow-wrap:anywhere}
@media (max-width:480px){
  .kv{grid-template-columns:1fr;gap:0 0}
  .kv dt{margin-top:var(--sp-2);font-size:var(--ts-3)}
}

/* Het lokvak van de botzeef (22-08). Buiten beeld, maar WEL in de pagina:
   display:none en visibility:hidden worden door een deel van de bots
   herkend en overgeslagen, en dan vangt de zeef niets meer. Zie
   botzeef.py en templates/botzeef.html. */
.botzeef {
  position: absolute;
  left: -9999px;
  top: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* ============ het aanmeldformulier in stappen (01-09) =====================
   Zonder javascript staat elke stap gewoon open en is dit blok inert: er is
   dan geen .wizard-klasse, dus niets wordt verborgen. Precies zoals het
   formulier er hiervoor uitzag. */

/* Het deelbare kaartje (01-09). Een vast lettertype zodat de zeven vakjes
   recht onder elkaar blijven staan, ook in de app waar iemand het plakt. */
.deelvak{width:100%;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:var(--ts-3);line-height:var(--rh-tekst);resize:vertical;overflow-wrap:anywhere}

/* Het web als stuurmiddel (01-09). Drie keuzes per as, naast elkaar op een
   scherm dat het aankan en onder elkaar op een telefoon. */
.wensrij{border:0;padding:0;margin:0 0 var(--sp-3);min-width:0}
.wenskeuze{display:grid;gap:var(--sp-2)}
@media (min-width:600px){.wenskeuze{grid-template-columns:repeat(3,1fr);gap:var(--sp-3)}}
.wenskeuze label{display:flex;gap:var(--sp-2);align-items:flex-start;cursor:pointer;
  font-size:var(--ts-3);min-height:44px}

/* Het licht in huis volgt de klok (01-09). Alleen een tint op de bovenste
   kaart, zacht genoeg om nooit met de leesbaarheid in de weg te zitten. In
   donkere modus schuift hij mee met de eigen achtergrond in plaats van er een
   lichte laag overheen te leggen. */
.huislicht{transition:background-color .6s ease}
.huislicht[data-dagdeel="ochtend"]{background-color:color-mix(in srgb,var(--card) 94%,#fff6e3)}
.huislicht[data-dagdeel="middag"]{background-color:var(--card)}
.huislicht[data-dagdeel="avond"]{background-color:color-mix(in srgb,var(--card) 92%,#f6e2cf)}
.huislicht[data-dagdeel="nacht"]{background-color:color-mix(in srgb,var(--card) 92%,#d9dcea)}
/* Het huis leeft (Vonken H1 en H3, 03-09). Het uur verfijnt het dagdeel: de
   vroege ochtend koeler, de late avond warmer, en 's nachts branden alleen de
   kaarsen. De iconen bewegen één keer, bij aanraking, en nooit in een lus;
   onder prefers-reduced-motion staat alles stil. */
.huislicht[data-uur="6"],.huislicht[data-uur="7"]{background-color:color-mix(in srgb,var(--card) 90%,#e6eef5)}
.huislicht[data-uur="21"],.huislicht[data-uur="22"],.huislicht[data-uur="23"]{background-color:color-mix(in srgb,var(--card) 88%,#e9d3bd)}
.huislicht[data-dagdeel="nacht"] .hs-raam:not(.brandt) rect{opacity:.7}
.huislicht[data-dagdeel="nacht"] .hs-kaars-vol .hs-vlam{filter:drop-shadow(0 0 6px var(--accent-2))}
@keyframes hs-flakker-eens{0%{transform:scale(1)}40%{transform:scale(1.6)}100%{transform:scale(1)}}
@keyframes hs-kier{0%{transform:translateX(0)}50%{transform:translateX(3px)}100%{transform:translateX(0)}}
@keyframes hs-scheur{0%{transform:rotate(0)}50%{transform:rotate(-6deg)}100%{transform:rotate(0)}}
.hs-raam:active .hs-vlam,.hs-raam:focus-visible .hs-vlam{animation:hs-flakker-eens .5s ease-out 1;transform-origin:center;transform-box:fill-box}
.kiesblok-knop:active .kiesblok-kop svg,.hs-deur:active svg{animation:hs-kier .3s ease-out 1}
/* Geen eigen reduced-motion-regel: het dekkende blok hierboven zet alle
   overgangen al stil met !important, en een blok daarna zou betekenen dat
   die dekkende regel niet meer de laatste is. */

/* De stille zondag (01-09): de kamerlijst een dag per week ingeklapt. */
.stillezondag>summary{cursor:pointer;padding:12px 0;min-height:44px;box-sizing:border-box;font-size:var(--ts-4)}

/* De muur van deze week (01-09, idee-orgel #6). Precies dezelfde gegevens als
   de balken erboven, maar als tegels: een balk toont een verhouding, een muur
   toont dat er mensen zijn. `aria-hidden` in het sjabloon, want de balken
   dragen de betekenis al voor wie luistert. */
.muur{display:flex;flex-wrap:wrap;gap:var(--sp-1);max-width:420px;margin-inline:auto}
.muur .tegel{width:12px;height:12px;border-radius:2px;background:var(--rule-sterk);
  opacity:.65}
.muur .tegel.ik{background:var(--accent);opacity:1}

/* Vragen op papier (01-09, idee-orgel #31, #32, #38). Op het scherm liggen de
   kaartjes in een raster; op papier verdwijnt alles wat geen kaartje is. */
.kj-vel{display:grid;gap:var(--sp-3);grid-template-columns:1fr;margin-top:var(--sp-3)}
@media (min-width:620px){.kj-vel{grid-template-columns:1fr 1fr}}
.kj-kaart,.kj-viltje,.kj-speelkaart{border:1px solid var(--rule-sterk);
  padding:var(--sp-4);display:flex;flex-direction:column;justify-content:space-between;
  min-height:150px;background:var(--card)}
.kj-viltje{border-radius:50%;aspect-ratio:1;text-align:center;
  align-items:center;justify-content:center;gap:var(--sp-3);padding:var(--sp-5)}
.kj-vraag{font-family:var(--display);font-size:var(--ts-6);line-height:1.3;margin:0}
.kj-vraag.klein{font-size:var(--ts-4)}
.kj-adres{margin:var(--sp-3) 0 0;letter-spacing:.08em;font-size:var(--ts-2);
  text-transform:uppercase;color:var(--soft)}
.kj-spel{grid-template-columns:1fr 1fr}
@media (min-width:620px){.kj-spel{grid-template-columns:repeat(3,1fr)}}
.kj-speelkaart{min-height:120px;position:relative}
.kj-nummer{position:absolute;top:6px;right:10px;font-size:var(--ts-2);
  color:var(--soft)}
@media print{
  /* Alles wat geen kaartje is, gaat er op papier af: navigatie, uitleg,
     knoppen. Wat overblijft is karton. */
  nav,footer,.kj-uitleg,.terug-glob,.banner,.opduik{display:none !important}
  .kj-vel{gap:0;grid-template-columns:1fr 1fr}
  .kj-kaart,.kj-viltje,.kj-speelkaart{break-inside:avoid;background:#fff;
    border-color:#8c8c8c}
  .kj-adres{color:#555}
}

/* Het kleine web boven een vraag (1a, 02-09). */
.miniweb{display:flex;align-items:center;gap:var(--sp-3);margin-top:var(--sp-2)}
.miniweb-svg{width:96px;height:96px;flex:none;color:var(--soft)}
.miniweb-svg .vorm{fill:var(--accent);fill-opacity:.18;stroke:var(--accent);stroke-width:2}
.miniweb-svg .groei{stroke:var(--card);stroke-width:3}

/* Leeskolom voor een kaart, in plaats van een inline max-width. */
.lees-kaart{max-width:var(--lees-kaart);margin-left:auto;margin-right:auto}
.lees-kaart.midden{text-align:center}

/* ============ de opbrengststrook (P0 Jeroen 18-09) ============
   Wat het gebruik van de tool oplevert, op elk scherm. Bewust smal en
   rustig: dit is een stand en geen reclame, en hij staat boven de inhoud
   zonder die weg te drukken.

   Het wikkelen gebeurt TUSSEN de items (flex-wrap) en niet BINNEN een item:
   `.op-getal` staat op `nowrap`, zodat "633 antwoorden" nooit over twee
   regels valt. Het commentaar hier beloofde eerst het omgekeerde, en dat
   klopte niet. Nagerekend op 320px: de strook heeft 256px werkruimte en het
   langste item van vandaag is het Duitse "633 Gespraechskarten" op ongeveer
   147px, dus er is ruim marge. Wordt een item ooit breder dan de strook, dan
   kapt `body{overflow-x:clip}` hem stil af; dat is het moment om `nowrap`
   hier te heroverwegen. */
.opbrengststrook{display:flex;flex-wrap:wrap;align-items:center;
  gap:var(--sp-1) var(--sp-3);margin:0 0 var(--sp-3);padding:8px 12px;
  border:1px solid var(--rule);border-radius:10px;background:var(--field);
  font-size:var(--ts-4);color:var(--bijschrift);overflow-wrap:anywhere}
.opbrengststrook .op-getal{white-space:nowrap}
.opbrengststrook .op-getal::before{content:"";display:inline-block;
  width:6px;height:6px;border-radius:50%;margin-right:6px;
  background:color-mix(in srgb,var(--accent) 70%,var(--ink));vertical-align:middle}
.opbrengststrook a{margin-left:auto;display:inline-block;
  padding:11px 4px;min-height:44px;line-height:22px;white-space:nowrap}
@media (max-width:700px){
  .opbrengststrook{font-size:var(--ts-3)}
  .opbrengststrook a{margin-left:0}
}

/* De opbrengstpagina zelf. Drie tegels met het getal groot, en daaronder de
   hele lijst. Een onderdeel waar nog niets staat, is niet doorgestreept en
   niet rood: het is gedimd en blijft aanklikbaar, want het is een deur en
   geen tekort. */
.opkop{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin-top:var(--sp-3)}
.opkop-tegel{flex:1 1 120px;min-width:0;padding:var(--sp-3);
  border:1px solid var(--rule);border-radius:12px;background:var(--field);
  text-align:center}
.opkop-n{font-size:var(--ts-9);line-height:1.1;
  color:color-mix(in srgb,var(--accent) 72%,var(--ink))}
.opkop-t{font-size:var(--ts-3);color:var(--bijschrift);margin-top:4px;
  overflow-wrap:anywhere}
.oplijst{list-style:none;padding:0;margin:var(--sp-4) 0 0}
.oplijst li{border-top:1px solid var(--rule)}
.oplijst li a{display:block;padding:14px 4px;min-height:44px;
  text-decoration:none;color:var(--ink);overflow-wrap:anywhere}
.oplijst li a:hover, .oplijst li a:focus-visible{text-decoration:underline}
.oplijst li.op-open a{color:var(--bijschrift)}

/* De wegwijzer op de tussenstand en op /opbrengst (P0 Jeroen 18-09): wat je
   antwoorden je nu te zien geven. Bewust een gewone lijst en geen tegels: dit
   staat onder een mijlpaal en mag die niet overstemmen. Wat nog dicht is,
   staat gedimd met de reden erachter en is geen link. */
.tezien{margin-top:var(--sp-4);text-align:left;max-width:var(--lees);
  margin-left:auto;margin-right:auto}
.tezien-lijst{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap;
  gap:var(--sp-1) var(--sp-3)}
.tezien-lijst li{overflow-wrap:anywhere}
.tezien-lijst a{display:inline-block;padding:11px 4px;min-height:44px;
  line-height:22px}
.tezien-lijst small{display:block;font-size:var(--ts-2)}

/* Het beheerscherm wijst de weg (19-09, tweede versie). Alles staat open;
   bovenaan elk tabblad staat een rij met de kaarten eronder, met een stip
   waar iets aandacht vraagt. Opvouwen kan nog, maar alleen als je er zelf om
   klikt: de kop is dan de knop. Zonder JavaScript bestaat die knop niet en
   staat, net als altijd, alles gewoon open. */
.kaartstrip{display:flex;flex-wrap:wrap;gap:var(--sp-2);margin:0 0 var(--sp-3)}
.kaartchip{display:inline-flex;align-items:center;gap:6px;
  padding:4px var(--sp-2);border-radius:999px;
  /* --rule-sterk en niet --rule: een chip is een besturing, en dan
     vraagt WCAG 3:1 op de omtrek (D-5, 30-08). */
  border:1px solid var(--rule-sterk);
  font-size:.82rem;color:var(--soft);text-decoration:none;background:var(--card)}
.kaartchip:hover,.kaartchip:focus-visible{color:var(--ink);
  border-color:var(--accent)}
.kaartchip.letop{color:var(--ink)}
.kaartstip{width:7px;height:7px;border-radius:50%;background:var(--amber);
  flex:none}
.kaartknop{display:flex;align-items:center;gap:var(--sp-2);width:100%;
  background:none;border:0;padding:0;margin:0;cursor:pointer;text-align:left;
  color:inherit;font:inherit}
.kaartknop h2{margin:0}
.kaartknop::after{content:"";margin-left:auto;width:9px;height:9px;
  border-right:2px solid var(--soft);border-bottom:2px solid var(--soft);
  transform:rotate(45deg);transition:transform .15s ease;flex:none}
.card.dicht .kaartknop::after{transform:rotate(-45deg)}
.kaartknop:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
.card.dicht > .kaartinhoud{display:none}

/* HET BEHEER MAG DE HELE BREEDTE (P0 Jeroen 19-09: "gebruik ook meer de
   ruimte op het scherm").

   .wrap staat op 880px, en dat is juist: dat is een leesregel, en de
   klantkant is tekst die gelezen wordt. Het beheer is geen leestekst maar
   een werkbank vol tabellen, en die stond op een derde van een breed scherm
   geperst terwijl er rechts een halve meter leeg bleef.

   Daarom alleen onder .theme-admin, en alleen boven 1200px: daaronder is er
   niets te winnen en zou het alleen maar smaller worden. Vanaf 1400px staan
   de kaarten in twee kolommen naast elkaar, zodat je meer in één oogopslag
   ziet in plaats van meer te scrollen. De wegwijzerrij bovenaan een tabblad
   loopt over beide kolommen, want dat is de inhoudsopgave van allebei.

   Kaarten breken nooit over een kolomgrens: een tabel die halverwege in de
   volgende kolom doorloopt is onleesbaar. */
@media (min-width:1200px){
  .theme-admin .wrap{max-width:min(1680px,calc(100% - 48px))}
}
@media (min-width:1200px){
  /* Wat wacht er, en waar wil je heen: twee vragen, naast elkaar. Onder
     elkaar vulden ze samen het halve eerste scherm. */
  .beheerkop{display:grid;grid-template-columns:1fr 1fr;
    gap:var(--sp-4);align-items:start}
  .beheerkop > .card{margin-top:0}
}
@media (min-width:1400px){
  .theme-admin [data-tab]{columns:2;column-gap:var(--sp-4)}
  .theme-admin [data-tab] > .card{break-inside:avoid;
    -webkit-column-break-inside:avoid;page-break-inside:avoid;
    margin-top:0;margin-bottom:var(--sp-4)}
  .theme-admin .kaartstrip{column-span:all}
}

/* ============ Chinees krijgt zijn eigen letter (D-23-09-7, 23-09) ============

   `--display` is in drie van de vier thema's een Latijnse serif-stapel
   ("Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif). Geen van
   die vijf namen dekt Chinese tekens, en er stond nergens in dit bestand een
   regel voor CJK: nul treffers op :lang(zh), cjk, noto, pingfang of simhei.
   De browser viel dus door alle vijf de namen heen naar de systeemstandaard.
   Gevolg: een Chinese bezoeker zag koppen in een compleet andere
   lettertypefamilie dan een Duitse, Franse, Spaanse of Engelse bezoeker, die
   de bedoelde serif wél kreeg. Op start_zh.html gaat dat over elf koppen.

   De stapel hieronder gaat van systeemletter naar webveilige terugval:
   Songti SC en PingFang SC staan op Apple, Noto Serif CJK SC en Source Han
   Serif op Linux en Android, Microsoft YaHei en SimSun op Windows. Eindigt op
   serif, zodat er altijd iets leesbaars overblijft.

   De regelhoogte gaat mee omhoog: Chinese tekens zijn vierkant en vullen de
   regel voller dan Latijnse letters, dus dezelfde line-height oogt er krapper.
   Gemeten tegen de bestaande 1,55 van de bodytekst. */
:lang(zh){
  --display:"Songti SC","Noto Serif CJK SC","Source Han Serif SC",
            "Microsoft YaHei","PingFang SC",SimSun,serif;
  line-height:1.75;
}
:lang(zh) h1,:lang(zh) h2,:lang(zh) h3,:lang(zh) h4{
  /* Iets ruimer dan de Latijnse koppen, om dezelfde reden. */
  line-height:1.45;
  /* Chinese koppen dragen geen kapitaalverschil, dus het gewicht doet het
     werk dat bij een serif de vorm doet. */
  letter-spacing:0.01em;
}

/* ============ vinkjes en rondjes in de huiskleur (D-23-09-9, 23-09) ========

   Elke andere bedieningskleur loopt via de themavariabelen: knoppen, randen,
   de focusring. Alleen `input[type=checkbox]` en `input[type=radio]` vielen
   erbuiten (nul treffers op accent-color in dit hele bestand), en kregen dus
   de standaardkleur van de browser. Dat is meestal een blauwtint die nergens
   in de pastels voorkomt, en hij staat onder andere op aanmelden.html, dus op
   het scherm waar iemand instemt met de voorwaarden.

   accent-color kleurt alleen het vinkje zelf; de rest van het veld blijft wat
   de browser ervan maakt, en dat is met opzet: een volledig nagebouwd vinkje
   verliest het gedrag dat mensen van hun eigen systeem kennen. */
input[type=checkbox],input[type=radio]{accent-color:var(--accent)}

/* ============ een tabel heeft een naam (D-23-09-6, 23-09) ================

   De captions die vanaf vandaag in de sjablonen staan zijn er voor wie de
   tabel niet visueel via de kop erboven leest. Voor wie dat wél doet zijn ze
   dubbel, dus ze staan er visueel verborgen bij, op dezelfde manier als de
   bestaande sr-only-klasse.

   Niet display:none en niet visibility:hidden: dan halen schermlezers hem ook
   weg, en dan staat er een caption die niemand heeft. */
table > caption.tabelnaam{
  position:absolute;width:1px;height:1px;
  padding:0;margin:-1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0;
}

/* ============ tekstvak op leesbreedte (D-23-09-8, 23-09) ================

   Dit stijlblad documenteert op de regels 62 tot 68 dat de kaartbreedte van
   640 px tweeenvijftig keer rauw in de CSS stond en is vervangen door
   --lees-kaart, omdat een pixelmaat niet meeschaalt met een grotere
   basisletter. Achttien voorkomens ontsnapten aan die opruiming omdat ze in
   HTML stonden en niet in CSS: twee plekken in templates/admin_accounts.html,
   in een lus. Hier is de klasse die ze vervangt. */
.leesvak{width:100%;max-width:var(--lees-kaart)}

/* ============ de tweede antwoordgroep (C-1, 23-09) =====================

   `prive` en `geenidee` staan sinds vandaag onder een zachte uitklap in
   plaats van achteraan de rij van acht. Het datasignaal: allebei nul keer
   gekozen in 652 echte antwoorden, en de code behandelt ze zelf al als
   informatieloos (ze tellen niet mee bij het vergelijken van twee mensen).

   Een `details` en geen knop met script: het vraagscherm moet het zonder
   JavaScript doen. De pijl van de browser gaat eraf, want die hoort bij een
   lijst die uitklapt en niet bij een antwoordkeuze. */
details.opts-anders{margin-top:var(--sp-2)}
details.opts-anders > summary{
  list-style:none;cursor:pointer;
  color:var(--soft);font-size:0.94em;
  /* Tikdoel van 44 px, net als de taalbollen (WCAG 2.2 AA). */
  min-height:44px;display:flex;align-items:center;
  padding:0 var(--sp-1);border-radius:var(--r-small);
}
details.opts-anders > summary::-webkit-details-marker{display:none}
details.opts-anders > summary:hover,
details.opts-anders > summary:focus-visible{color:var(--ink)}
details.opts-anders[open] > summary{margin-bottom:var(--sp-1)}
