/*
 * P-CASH stylesheet — designfundament (US-120).
 *
 * Opbouw van dit bestand:
 *   1. Webfonts (lokaal, wwwroot/fonts — ADR-0084)
 *   2. Designtokens licht en donker (docs/design/README.md §Designtokens, ADR-0085)
 *   3. Basis: document, typografie, focus
 *   4. Layoutraamwerk: zijbalk, kopbalk, inhoud, mobiele tabbalk
 *   5. Componenten (knoppen, tabellen, statussen, formulieren, paneel, toast)
 *   6. Schermspecifieke aanvullingen die al bestonden
 *   7. Inlogscherm
 *   8. Desktop: alles boven 600px
 *
 * Mobiel eerst (AC-4.9). Alles buiten @media (min-width: …) moet op een scherm
 * van 360px passen; er staat daarom geen vaste breedte > 360px in de basis.
 * De zijbalk (264px) en het inschuifpaneel (520px) leven in het desktopblok
 * onderaan; onder 600px verdwijnt de zijbalk en komt de tabbalk ervoor in de
 * plaats (AC-120.5).
 *
 * Kleur is nooit de enige drager van betekenis (AC-4.13): bij- en afboekingen
 * krijgen naast de kleur ook een teken (+/−) én een verborgen tekst voor
 * schermlezers; elk statuslabel (.status) draagt altijd zichtbare tekst. De
 * huisstijlkleur #005a2d staat als --brand op titels, primaire knoppen, links
 * en de speltakbadge (AC-4.11); --huisstijl is de alias van dezelfde kleur voor
 * regels van vóór US-120.
 *
 * Contrast (AC-4.14) wordt in BEIDE thema's getoetst door
 * tests/PCash.Web.Tests/Toegankelijkheid/HuisstijlContrastTests.cs, met een
 * eigen WCAG-berekening en zonder externe tool.
 */

/* =====================================================================
   1. Webfonts — lokaal geserveerd, geen extern fontdomein (AC-120.3)
   ===================================================================== */

/* Instrument Sans en JetBrains Mono zijn variabele fonts (gewichtsas 400–700);
   één bestand per subset dekt daarmee 400, 500 én 600. Licentie: SIL Open Font
   License 1.1, zie wwwroot/fonts/LICENTIE.md. */
@font-face {
  font-family: "Instrument Sans";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("../fonts/instrument-sans-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
    U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
    U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "Instrument Sans";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("../fonts/instrument-sans-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
    U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020,
    U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "JetBrains Mono";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("../fonts/jetbrains-mono-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
    U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
    U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: "JetBrains Mono";
  font-style: normal;
  font-weight: 400 700;
  font-display: swap;
  src: url("../fonts/jetbrains-mono-latin-ext.woff2") format("woff2");
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
    U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020,
    U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* =====================================================================
   2. Designtokens
   ===================================================================== */

:root {
  /* -- vlakken en lijnen -- */
  --bg: #f2f4f1;
  --surf: #ffffff;
  --surf2: #f8faf8;
  --surf3: #eef1ee;
  --line: #e2e6e1;
  --line2: #d3dad4;
  /* -- tekst -- */
  --ink: #131a15;
  --ink2: #5a6a5f;
  --ink3: #667069;
  /* -- huisstijl -- */
  --brand: #005a2d;
  --brandink: #ffffff;
  --brandsoft: #e4efe8;
  --brandline: #c7ddd0;
  --brandtext: #005a2d;
  --nav: #00522a;
  --navink: #ffffff;
  --navink2: #d6e3dd;
  --navink3: #a8c4b7;
  /* Het doorschijnende vlak op de navigatiekleur: de chip in de mobiele kop en
     het initialenvlak in de zijbalk. Eén waarde voor beide thema's, en dat is
     hier juist: --nav is in licht én donker een donkere kleur, dus dezelfde
     doorschijnende witlaag geeft in beide hetzelfde resultaat. Hij staat als
     token omdat de storyblokken uitsluitend tokens mogen gebruiken (AC-4.11). */
  --navvlak: rgba(255, 255, 255, .16);
  /* -- bedragen -- */
  --credit: #00713a;
  --debit: #131a15;
  /* -- signalen -- */
  --warn: #8a5300;
  --warnsoft: #fdf3e3;
  --warnline: #e8d3a8;
  --danger: #a4232b;
  --dangersoft: #fbeceb;
  --dangerline: #eec9c7;
  --info: #1b4f7a;
  --infosoft: #e8f0f7;
  --infoline: #c4d8e8;
  --focus: #8f5b00;

  /* -- aliassen van vóór US-120: bestaande regels blijven werken -- */
  --huisstijl: var(--brand);
  --huisstijl-donker: var(--nav);
  --bijboeking: var(--credit);
  --afboeking: var(--debit);
  --rand: var(--line2);
  --vlak: var(--surf);
  --achtergrond: var(--bg);
  --gedempt: var(--ink2);

  /* -- schaduw en straal -- */
  --shadow: 0 1px 2px rgba(16, 32, 22, .06), 0 8px 24px -12px rgba(16, 32, 22, .18);
  --shadow2: 0 1px 2px rgba(16, 32, 22, .05), 0 2px 6px rgba(16, 32, 22, .05);
  --radius: 14px;
  --radius-knop: 10px;
  --radius-pil: 999px;

  /* -- spacing (README §Spacing) -- */
  --sp-1: 4px;
  --sp-2: 6px;
  --sp-3: 8px;
  --sp-4: 10px;
  --sp-5: 12px;
  --sp-6: 14px;
  --sp-7: 16px;
  --sp-8: 18px;
  --sp-9: 20px;
  --sp-10: 22px;
  --sp-11: 26px;
  --sp-12: 28px;

  /* -- typografieschaal (README §Typografie) -- */
  --fs-pagina: 25px;
  --fs-sectie: 20px;
  --fs-kaartkop: 14px;
  --fs-body: 14.5px;
  --fs-secundair: 13.5px;
  --fs-meta: 12.5px;
  --fs-micro: 11px;
  --font-ui: "Instrument Sans", system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  color-scheme: light;
}

/* Donker via de systeeminstelling, tenzij de gebruiker expliciet licht koos. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --bg: #0d110e;
    --surf: #151a16;
    --surf2: #1a201c;
    --surf3: #202722;
    --line: #28302a;
    --line2: #333d36;
    --ink: #eaf0ec;
    --ink2: #a0aea5;
    --ink3: #83948a;
    --brand: #3f9f6f;
    --brandink: #08170e;
    --brandsoft: #16291f;
    --brandline: #22422f;
    --brandtext: #6fc79a;
    --nav: #101a14;
    --navink: #ffffff;
    --navink2: #d9dad9;
    --navink3: #aeb1af;
    --credit: #4fc98a;
    --debit: #eaf0ec;
    --warn: #d8a353;
    --warnsoft: #2a2113;
    --warnline: #463a20;
    --danger: #e2757c;
    --dangersoft: #2c1618;
    --dangerline: #4a2529;
    --info: #7ab4de;
    --infosoft: #12222e;
    --infoline: #23394a;
    --focus: #e2b06a;
    --shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 12px 28px -14px rgba(0, 0, 0, .7);
    --shadow2: 0 1px 2px rgba(0, 0, 0, .35);
    color-scheme: dark;
  }
}

/* Donker omdat de gebruiker het zelf koos (wwwroot/js/thema.js zet data-theme). */
:root[data-theme="dark"] {
  --bg: #0d110e;
  --surf: #151a16;
  --surf2: #1a201c;
  --surf3: #202722;
  --line: #28302a;
  --line2: #333d36;
  --ink: #eaf0ec;
  --ink2: #a0aea5;
  --ink3: #83948a;
  --brand: #3f9f6f;
  --brandink: #08170e;
  --brandsoft: #16291f;
  --brandline: #22422f;
  --brandtext: #6fc79a;
  --nav: #101a14;
  --navink: #ffffff;
  --navink2: #d9dad9;
  --navink3: #aeb1af;
  --credit: #4fc98a;
  --debit: #eaf0ec;
  --warn: #d8a353;
  --warnsoft: #2a2113;
  --warnline: #463a20;
  --danger: #e2757c;
  --dangersoft: #2c1618;
  --dangerline: #4a2529;
  --info: #7ab4de;
  --infosoft: #12222e;
  --infoline: #23394a;
  --focus: #e2b06a;
  --shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 12px 28px -14px rgba(0, 0, 0, .7);
  --shadow2: 0 1px 2px rgba(0, 0, 0, .35);
  color-scheme: dark;
}

/* =====================================================================
   3. Basis
   ===================================================================== */

* { box-sizing: border-box; }
/* Android/iOS (2026-10-03): met viewport-fit=cover tekent de pagina door tot
   onder de systeemnavigatie (Chrome op Android 15+); de onderste vaste elementen
   schuiven dan de hoogte van die balk op.
   Op Android 10 (gemeten via de schermdiagnose op Profiel) kleurt Chrome de
   navigatiebalk van de geïnstalleerde app met de achtergrond van body, maar
   alleen zolang <html> zelf géén achtergrond heeft: met een eigen
   html-achtergrond werd de balk zwart. Geef html daarom geen achtergrond. */
:root { --onderrand: env(safe-area-inset-bottom, 0px); }

/* Subtiele scrollbalken overal (FB-025, Pascal 2026-10-01): smal, zonder pijltjes of spoor, een
   duim in de lijnkleur van het thema die bij aanwijzen de gedempte tekstkleur krijgt. Alleen
   tokens, dus licht en donker volgen vanzelf. Specifiekere regels gaan voor: het zijbalkmenu
   (op de navigatiekleur) en de tabbalk (zonder zichtbare balk). */
* {
  scrollbar-width: thin;
  scrollbar-color: var(--line2) transparent;
}
*:hover { scrollbar-color: var(--ink3) transparent; }
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
::-webkit-scrollbar-corner { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--line2); border-radius: 4px; }
:hover::-webkit-scrollbar-thumb { background: var(--ink3); }
/* Het hidden-attribuut wint altijd, ook van een eigen display:flex/grid op
   dezelfde klasse (fixcommit R-019 uit de designreview van 2026-09-09: het
   bonvoorbeeld van US-130 en de zoekoverlay van US-127 stonden open omdat
   hun klasse de browserregel [hidden]{display:none} versloeg). */
[hidden] { display: none !important; }

body {
  margin: 0;
  font-family: var(--font-ui);
  font-size: var(--fs-body);
  color: var(--ink);
  background: var(--bg);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}

a { color: var(--brandtext); }
a:hover { text-decoration: underline; }

a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible {
  outline: 3px solid var(--focus);
  outline-offset: 2px;
}

h1, h2, h3 { color: var(--brandtext); line-height: 1.2; letter-spacing: -.015em; }
h1 { font-size: var(--fs-pagina); font-weight: 600; margin: 0 0 var(--sp-5); }
h2 { font-size: var(--fs-sectie); font-weight: 600; }
h3 { font-size: 17px; font-weight: 600; }

/* Bedragen en datums altijd met tabelcijfers (README §Typografie). */
.bedrag, .getal, .saldo, .datum,
td.getal, th.getal,
.saldopaneel .waarde, .tegel .saldi dd, .transactie .bedrag, .volgnr {
  font-variant-numeric: tabular-nums;
}

/* Mono: volgnummers, IBAN's, codes. */
.mono, .kenmerk, code { font-family: var(--font-mono); }

/* Hoofdletters tonen terwijl je typt (US-146: de speltakafkorting AC-146.1);
   de server normaliseert zelf ook, dit is uitsluitend de weergave. */
.hoofdletters { text-transform: uppercase; }

/* Kleine kapitalen-label (README §Typografie). */
.microlabel {
  font-family: var(--font-mono);
  font-size: 10.5px;
  font-weight: 600;
  letter-spacing: .11em;
  text-transform: uppercase;
  color: var(--ink3);
}

/* Visueel verborgen, wel voor een schermlezer. Niet meer via left:-999px:
   binnen een gepositioneerde ouder (de kopbalkknop "Zoek in alles" na het
   sluiten van de zoeklaag, FB-044) kwam de tekst dan alsnog in beeld. */
.overslaan {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
.overslaan:focus {
  width: auto;
  height: auto;
  overflow: visible;
  clip-path: none;
  white-space: normal;
  left: 8px;
  top: 8px;
  background: var(--surf);
  color: var(--ink);
  padding: 8px 12px;
  z-index: 90;
  border: 2px solid var(--brand);
}

/* =====================================================================
   4. Layoutraamwerk (AC-120.4/120.5)
   ===================================================================== */

.app {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}

/* -- Zijbalk -------------------------------------------------------- */
/* Onder 600px bestaat de zijbalk niet; daar navigeert de tabbalk. */
.zijbalk { display: none; }

.zijbalk-logo { display: flex; align-items: center; margin: 0 var(--sp-2) var(--sp-6); }
.zijbalk-logo img { height: 54px; width: auto; filter: brightness(0) invert(1); }

.zijbalk-groep { display: flex; flex-direction: column; gap: var(--sp-1); margin-bottom: var(--sp-6); }
.zijbalk-kop {
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 500;
  letter-spacing: .13em;
  text-transform: uppercase;
  color: var(--navink3);
  padding: 0 var(--sp-4);
  margin-bottom: var(--sp-1);
}
.zijbalk a, .zijbalk .zijbalk-volgt {
  display: flex;
  align-items: center;
  gap: 11px;
  /* Compacte regel van 36px (US-194, ADR-0145): de zijbalk bestaat alleen op
     desktop, met muis; het tikdoel van 44px (AC-4.9) blijft gelden voor de
     tabbalk en de knoppen die wél op een telefoon staan. Een speltak met open
     subnavigatie past zo met de voet binnen de 900px uit het design. */
  min-height: 36px;
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--radius-knop);
  font-size: var(--fs-body);
  color: var(--navink2);
  text-decoration: none;
}
.zijbalk a:hover { background: rgba(255, 255, 255, .09); text-decoration: none; }
.zijbalk a[aria-current="page"] { background: rgba(255, 255, 255, .14); color: var(--navink); font-weight: 600; }
.zijbalk .zijbalk-volgt { color: var(--navink3); font-style: italic; }
.zijbalk-naam { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Teller-pil, wit op de navigatiekleur (AC-120.4). */
.zijbalk-teller {
  min-width: 20px;
  height: 20px;
  padding: 0 var(--sp-2);
  border-radius: var(--radius-pil);
  background: var(--navink);
  color: var(--nav);
  font-size: 11.5px;
  font-weight: 600;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-variant-numeric: tabular-nums;
}

/* Vierkant initialenvlak van 26px per speltak. */
.zijbalk-initialen {
  width: 26px;
  height: 26px;
  flex: none;
  border-radius: var(--sp-3);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-micro);
  font-weight: 600;
  /* Het doorschijnende vlak op --nav: token --navvlak, niet een eigen
     rgba-waarde (US-163, V-064). */
  background: var(--navvlak);
  color: var(--navink);
}
.zijbalk a[aria-current="page"] .zijbalk-initialen { background: var(--navink); color: var(--nav); }

/* Subnavigatie van de actieve speltak: ingesprongen met een verticale lijn. */
.zijbalk-sub {
  display: flex;
  flex-direction: column;
  gap: 1px;
  margin: var(--sp-1) 0 var(--sp-3) 13px;
  padding-left: var(--sp-5);
  /* Token --navvlak (US-163, V-064), niet een eigen rgba-waarde. */
  border-left: 1px solid var(--navvlak);
}
.zijbalk-sub a, .zijbalk-sub .zijbalk-volgt {
  /* 32px per subregel (US-194, ADR-0145): negen regels zijn dan 296px. */
  min-height: 32px;
  padding: var(--sp-1) var(--sp-4);
  font-size: var(--fs-secundair);
  color: var(--navink2);
  border-radius: var(--sp-3);
  /* Elke subregel draagt een icoon, net als in het prototype: 15px, gap 9px
     (bevinding R-012 uit de designreview van 2026-09-09). */
  gap: 9px;
}
/* Het icoon krimpt nooit; de naam vangt de resterende breedte op. */
.zijbalk a > svg, .zijbalk .zijbalk-volgt > svg { flex: none; }

/* Alleen het menu scrollt (bevinding R-003). Het logo bovenaan en de voet
   onderaan staan vast, zodat het profielblok op de maat uit het design
   (1440 x 900) altijd zichtbaar is. Sinds US-194 past een speltak met open
   subnavigatie er met regels van 36/32px binnen 900px; het scrollen blijft
   als vangnet voor wie meer speltakken of een kleiner venster heeft. */
.zijbalk-menu {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
}
/* FB-025 (Pascal 2026-10-01): de scrollbalk van het menu subtiel: smal, zonder pijltjes of
   spoor, een halfdoorzichtige duim op de navigatiekleur die pas bij aanwijzen duidelijker wordt. */
.zijbalk-menu {
  scrollbar-width: thin;
  scrollbar-color: var(--navvlak) transparent;
}
.zijbalk-menu:hover { scrollbar-color: rgba(255, 255, 255, .32) transparent; }
.zijbalk-menu::-webkit-scrollbar { width: 6px; }
.zijbalk-menu::-webkit-scrollbar-track { background: transparent; }
.zijbalk-menu::-webkit-scrollbar-button { display: none; height: 0; }
.zijbalk-menu::-webkit-scrollbar-thumb { background: var(--navvlak); border-radius: 3px; }
.zijbalk-menu:hover::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, .32); }

/* Profielblok onderaan: initialen, naam, rol — de ingang naar Mijn gegevens. */
.zijbalk-voet { flex: none; margin-top: auto; padding-top: var(--sp-6); border-top: 1px solid rgba(255, 255, 255, .12); }
.zijbalk-profiel {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  min-height: 44px;
  padding: var(--sp-4);
  border-radius: var(--radius-knop);
  background: rgba(255, 255, 255, .07);
  color: var(--navink);
  text-decoration: none;
}
.zijbalk-profiel .zijbalk-initialen {
  width: 30px;
  height: 30px;
  border-radius: var(--radius-pil);
  /* Token --navvlak (US-163, V-064), niet een eigen rgba-waarde. */
  background: var(--navvlak);
  font-size: var(--fs-meta);
}
.zijbalk-profiel .zijbalk-naam { display: flex; flex-direction: column; line-height: 1.25; white-space: normal; }
.zijbalk-profiel .naam { display: block; font-size: var(--fs-secundair); font-weight: 600; color: var(--navink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.zijbalk-profiel .rol { display: block; font-size: var(--fs-meta); color: var(--navink2); }

/* -- Kopbalk (64px) -------------------------------------------------- */
/* Mobiel eerst: op een telefoon liggen de schermnaam en de acties in twee
   rijen. Zonder flex-wrap op .kopbalk zelf kromp .kopbalk-links (flex:1,
   min-width:0) op 390px in tot 9px breed en 157px hoog, terwijl
   .kopbalk-acties 337px breed bleef en op x=37 begon — dus buiten de flexregel
   en over .kopbalk-links heen. Het zoekveld en de seizoenchip lagen op elkaar
   en de kopbalk was 174px hoog. Bevinding R-042 uit de designreview van
   2026-09-09, blokkerend. Boven 600px staat alles weer op één regel; dat zet §8
   terug. */
.kopbalk {
  flex: none;
  min-height: 64px;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-3) var(--sp-5);
  padding: var(--sp-3) var(--sp-7);
  background: var(--surf);
  border-bottom: 1px solid var(--line);
}
.kopbalk-links { display: flex; align-items: center; gap: var(--sp-5); flex: 1 1 100%; min-width: 0; flex-wrap: wrap; }
.kopbalk-scherm { font-size: 15px; font-weight: 600; color: var(--ink); }
/* De terugpijl van de mobiele kop (README §Mobiele schermen). Op desktop
   navigeert de zijbalk en is hij er niet; dat zet §8 terug. */
.kopbalk-terug {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 44px;
  height: 44px;
  margin-left: calc(var(--sp-4) * -1);
  border-radius: var(--radius-knop);
  color: inherit;
}
.kopbalk-acties { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; width: 100%; }

/* Speltakbadge: op elk scherm binnen een speltakcontext (AC-4.1). */
.speltakbadge {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  background: var(--brand);
  color: var(--brandink);
  font-weight: 600;
  padding: var(--sp-1) 11px;
  border-radius: var(--sp-3);
  font-size: 13px;
}
/* Het bolletje van het design is puur decoratie en staat daarom in de CSS en
   niet in de HTML: zo blijft de badge in de broncode letterlijk
   <span class="speltakbadge">Naam</span> (AC-4.1, de badgetests). */
.speltakbadge::before {
  content: "";
  width: 6px;
  height: 6px;
  flex: none;
  border-radius: var(--radius-pil);
  background: currentColor;
  opacity: .7;
}

/* -- Inhoud ---------------------------------------------------------- */
.inhoud {
  flex: 1;
  min-width: 0;
  padding: var(--sp-9) var(--sp-7) 110px;
}

/* -- Mobiele tabbalk (74px) + zwevende actieknop (58px) --------------- */
.mobieletabbalk {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 60;
  height: calc(74px + var(--onderrand));
  display: flex;
  align-items: flex-start;
  padding: var(--sp-4) var(--sp-3) var(--onderrand);
  background: var(--surf);
  border-top: 1px solid var(--line);
}
.mobieletabbalk a {
  flex: 1;
  min-height: 44px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--sp-1);
  font-size: var(--fs-micro);
  font-weight: 600;
  color: var(--ink3);
  text-decoration: none;
}
.mobieletabbalk a[aria-current="page"] { color: var(--brandtext); }
.mobieleactieknop {
  position: fixed;
  right: var(--sp-8);
  bottom: calc(88px + var(--onderrand));
  z-index: 61;
  width: 58px;
  height: 58px;
  border-radius: var(--sp-9);
  background: var(--brand);
  color: var(--brandink);
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow);
}

/* =====================================================================
   5. Componenten
   ===================================================================== */

.kruimel { font-size: var(--fs-secundair); margin: 0 0 var(--sp-7); }
.kruimel a { text-decoration: none; }

/* Submenu onder Instellingen (functioneel ontwerp 15.1) */
.submenu { display: flex; flex-wrap: wrap; gap: var(--sp-1); margin: 0 0 var(--sp-9); }
.submenu a {
    display: inline-flex; align-items: center; min-height: 44px; box-sizing: border-box;
    text-decoration: none; padding: var(--sp-2) var(--sp-5); border-radius: var(--radius-pil);
    border: 1px solid var(--line2); font-size: var(--fs-secundair); background: var(--surf);
}
.submenu a[aria-current="page"] { background: var(--brand); color: var(--brandink); border-color: transparent; }
/* Een nog niet gebouwd beheeronderdeel (US-072): geen link, duidelijk gedempt. */
.submenu-volgt {
  display: inline-block;
  padding: var(--sp-2) var(--sp-5);
  border-radius: var(--radius-pil);
  border: 1px dashed var(--line2);
  font-size: var(--fs-secundair);
  color: var(--ink3);
}
.submenu-volgt small { display: block; font-size: 0.8em; }

/* Tegels op het startscherm */
.tegels {
  list-style: none;
  padding: 0;
  margin: var(--sp-7) 0 0;
  display: grid;
  gap: var(--sp-8);
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
}
.tegel {
  display: block;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--sp-9);
  color: inherit;
  text-decoration: none;
  box-shadow: var(--shadow2);
}
a.tegel:hover { border-color: var(--brandline); text-decoration: none; }
.tegel h2 { margin: 0 0 var(--sp-1); font-size: 16.5px; color: var(--ink); }
.tegel .rol { color: var(--ink3); font-size: var(--fs-meta); margin: 0 0 var(--sp-5); }
.tegel .saldi { display: grid; grid-template-columns: auto auto; gap: var(--sp-2) var(--sp-5); margin: 0; }
.tegel .saldi dt { color: var(--ink2); font-size: var(--fs-body); }
.tegel .saldi dd { margin: 0; text-align: right; font-variant-numeric: tabular-nums; }
.tegel .totaal dt, .tegel .totaal dd { font-weight: 700; }
.tegel .ledenmelding { color: var(--ink3); font-size: var(--fs-meta); margin: var(--sp-4) 0 0; }

/* Saldopanelen op het dashboard */
.saldopanelen {
  display: grid;
  gap: var(--sp-6);
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  margin: var(--sp-7) 0;
  padding: 0;
  list-style: none;
}
.saldopaneel {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--sp-7);
  box-shadow: var(--shadow2);
}
.saldopaneel .label { color: var(--ink2); font-size: var(--fs-meta); margin: 0; }
.saldopaneel .waarde { font-size: 24px; font-weight: 600; margin: var(--sp-1) 0 0; font-variant-numeric: tabular-nums; letter-spacing: -.015em; }
.saldopaneel.totaal { border-left: 6px solid var(--brand); }

.knoppen { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin: var(--sp-7) 0; }
/* Tikdoel >= 44px (AC-4.9): inline-flex + min-height/min-width in plaats van
   alleen padding, zodat een korte knoptekst ("Opslaan") ook breed genoeg blijft. */
.knop {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  min-height: 44px;
  min-width: 44px;
  background: var(--brand);
  color: var(--brandink);
  border: 1px solid var(--brand);
  border-radius: var(--radius-knop);
  padding: var(--sp-4) var(--sp-7);
  font-family: inherit;
  font-size: var(--fs-body);
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
  box-sizing: border-box;
  box-shadow: var(--shadow2);
}
.knop:hover { text-decoration: none; filter: brightness(.97); }
:root[data-theme="dark"] .knop:hover { filter: brightness(1.25); }
.knop.secundair { background: var(--surf); color: var(--brandtext); border-color: var(--line2); }
.knop.gevaar { background: var(--dangersoft); color: var(--danger); border-color: var(--dangerline); }
.knop[disabled] { opacity: 0.55; cursor: not-allowed; }

/* Transactielijst, gegroepeerd per dag (AC-7.1) */
.dag { margin: var(--sp-9) 0 0; }
.dag-kop {
  position: sticky;
  top: 0;
  background: var(--surf2);
  border-bottom: 1px solid var(--line);
  color: var(--ink2);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 600;
  letter-spacing: .11em;
  text-transform: uppercase;
  margin: 0;
  padding: var(--sp-2) 0;
}
.transacties { list-style: none; margin: 0; padding: 0; }
.transactie {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 2px var(--sp-7);
  align-items: baseline;
  padding: var(--sp-5) var(--sp-1);
  border-bottom: 1px solid var(--line);
  color: inherit;
  text-decoration: none;
}
.transactie:hover { background: var(--surf2); text-decoration: none; }
.transactie .omschrijving { font-weight: 600; }
.transactie .meta { grid-column: 1; color: var(--ink3); font-size: var(--fs-meta); }
.transactie .bedrag {
  grid-row: 1 / span 2;
  grid-column: 2;
  align-self: center;
  font-size: 15.5px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
/* Bij- en afboeking: kleur PLUS teken als tweede signaal (AC-4.12/4.13/7.2).
   In donker is "afboekingen zwart" de primaire tekstkleur --debit; zie
   ADR-0085. */
.bedrag.bij { color: var(--credit); }
.bedrag.af { color: var(--debit); }
.volgnr {
  display: inline-block;
  min-width: 2.2em;
  color: var(--ink3);
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-variant-numeric: tabular-nums;
}

/* Zoek/filter */
.zoekbalk { margin: var(--sp-7) 0; display: flex; flex-wrap: wrap; gap: var(--sp-3); align-items: flex-end; }
.zoekbalk label { display: block; font-size: var(--fs-secundair); font-weight: 600; }
.zoekbalk input[type="search"] {
  padding: var(--sp-3);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf);
  color: var(--ink);
  min-width: 16rem;
  font-size: 1rem;
}
.teller { color: var(--ink2); font-size: var(--fs-secundair); margin: var(--sp-3) 0; }

/* Seizoenselectie */
.seizoenen { border: 1px solid var(--line); border-radius: var(--radius); background: var(--surf); margin: var(--sp-7) 0; box-shadow: var(--shadow2); }
.seizoenen summary { padding: var(--sp-5) var(--sp-7); cursor: pointer; font-weight: 600; color: var(--brandtext); min-height: 44px; display: flex; align-items: center; }
.seizoenen table { width: 100%; border-collapse: collapse; }
.seizoenen th, .seizoenen td { text-align: left; padding: var(--sp-2) var(--sp-7); border-top: 1px solid var(--line); font-size: var(--fs-secundair); }
.seizoenen td.getal { text-align: right; font-variant-numeric: tabular-nums; }
/* De mutatiekolommen staan tussen begin- en eindsaldo: beginsaldo + mutatie = eindsaldo (AC-35.6). */
.seizoenen td.mutatie { color: var(--ink2); }
.seizoenen p.teller { padding: var(--sp-2) var(--sp-7) var(--sp-5); margin: 0; }

/* Statuslabels: tekst, niet alleen kleur (AC-4.13) */
.status {
  display: inline-block;
  font-size: var(--fs-meta);
  padding: 2px var(--sp-4);
  border-radius: var(--radius-pil);
  border: 1px solid var(--line2);
  background: var(--surf3);
  color: var(--ink2);
}
.status.open { border-color: var(--brandline); background: var(--brandsoft); color: var(--brandtext); }
.status.definitief { background: var(--ink); color: var(--bg); border-color: var(--ink); }
/* Ingediend ter controle: eigen label, niet dezelfde kleur als definitief (US-074). */
.status.ingediend { background: var(--warnsoft); color: var(--warn); border-color: var(--warnline); }
/* US-319: de kolom Bon op het kascontrolescherm. Het woord staat er altijd bij
   (ja, nee, reden, n.v.t.); de kleur is het tweede signaal (AC-4.13). */
.status.bon-ja { border-color: var(--brandline); background: var(--brandsoft); color: var(--brandtext); }
.status.bon-nee { border-color: var(--dangerline); background: var(--dangersoft); color: var(--danger); font-weight: 600; }
.status.bon-reden { border-color: var(--warnline); background: var(--warnsoft); color: var(--warn); }
/* US-312: een uitgave op de groepsrekening zonder factuur, met reden (ADR-0228). */
.status.geenfactuur { background: var(--warnsoft); color: var(--warn); border-color: var(--warnline); }
/* Het actieve seizoen van de speltak (US-027, AC-27.7). */
.status.actief { background: var(--brand); color: var(--brandink); border-color: var(--brand); }

.melding {
  background: var(--warnsoft);
  border: 1px solid var(--warnline);
  border-left: 6px solid var(--warn);
  border-radius: var(--radius-knop);
  color: var(--ink);
  padding: var(--sp-5) var(--sp-7);
  margin: var(--sp-7) 0;
}
.melding.fout { background: var(--dangersoft); border-color: var(--dangerline); border-left-color: var(--danger); }
.melding.gelukt { background: var(--brandsoft); border-color: var(--brandline); border-left-color: var(--brand); }

/* US-324 (ADR-0241): de testmailknop onder de voorbeeldweergave van een
   e-mailtemplate, en het formuliertje van "Testmail versturen" in de kopbalk,
   dat zelf geen vak mag vormen tussen de andere kopacties. */
.testmail { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2) var(--sp-5); margin: var(--sp-5) 0; }
.testmail .veldhint { margin: 0; flex: 1 1 16rem; }
.kopactieformulier { display: contents; }

.definitielijst { display: grid; grid-template-columns: minmax(0, max-content) minmax(0, 1fr); gap: var(--sp-2) var(--sp-7); }
.definitielijst dt, .definitielijst dd { overflow-wrap: anywhere; }
.definitielijst dt { color: var(--ink2); }
.definitielijst dd { margin: 0; }

.overflow-x { overflow-x: auto; }

/* Beheer: speltaktabel en het invoerformulier (US-024/US-025, functioneel ontwerp 15.5) */
.beheertabel { width: 100%; border-collapse: collapse; background: var(--surf); }
.beheertabel th, .beheertabel td {
  text-align: left; padding: var(--sp-5) var(--sp-8); border-top: 1px solid var(--line); font-size: var(--fs-secundair);
}
.beheertabel thead th { border-top: none; background: var(--surf2); color: var(--ink2); }

.beheerform {
  max-width: 40rem; margin-top: var(--sp-3); display: grid; gap: var(--sp-7);
  background: var(--surf); border: 1px solid var(--line); border-radius: var(--radius); padding: var(--sp-9);
  box-shadow: var(--shadow2);
}
.beheerform .veld { display: grid; gap: var(--sp-2); }
.beheerform label { font-weight: 600; font-size: 13px; }
/* De veldopmaak (radius, border, padding, font) van input/select/textarea staat
   niet meer hier maar generiek aan het einde van dit bestand (US-199): zo krijgt
   ook een tekstachtig veld buiten een .beheerform-formulier hem. */
.beheerform fieldset { border: 1px solid var(--line); border-radius: var(--radius-knop); padding: var(--sp-5) var(--sp-7); }
.beheerform legend { font-weight: 600; padding: 0 var(--sp-2); }
.beheerform .vink { display: flex; align-items: center; gap: var(--sp-3); font-weight: 400; }
.beheerform .vink input { width: auto; }
.veldfout { color: var(--danger); font-size: var(--fs-meta); margin: 2px 0 0; font-weight: 600; }

/* Tikdoel >= 44px (AC-4.9) voor tekst-, datum- en zoekvelden en keuzelijsten;
   een aanraakbaar formulier is net zo hard een mobiele eis als een knop. */
input[type="text"],
input[type="date"],
input[type="search"],
input[type="password"],
input:not([type]),
select,
textarea {
  min-height: 44px;
  box-sizing: border-box;
  font-family: inherit;
  color: var(--ink);
  background: var(--surf);
}
/* Vinkje/radio: het label eromheen is het echte tikdoel, niet het 1em-inputje. */
.beheerform .vink { min-height: 44px; }

/* Themakeuze: licht, donker of systeem (AC-120.2). Zonder JavaScript doen de
   knoppen niets en volgt de app het systeemthema; de <noscript> zegt dat erbij. */
.themakeuze { display: flex; flex-wrap: wrap; gap: var(--sp-1); }
.themakeuze button {
  min-height: 44px;
  padding: 0 var(--sp-6);
  border: 1px solid var(--line2);
  border-radius: var(--radius-pil);
  background: var(--surf);
  color: var(--ink2);
  font: inherit;
  font-weight: 600;
  font-size: var(--fs-secundair);
  cursor: pointer;
}
.themakeuze button[aria-pressed="true"] { background: var(--brandsoft); color: var(--brandtext); border-color: var(--brandline); }
.zijbalk .themakeuze button { background: rgba(255, 255, 255, .09); border-color: rgba(255, 255, 255, .18); color: var(--navink2); }
.zijbalk .themakeuze button[aria-pressed="true"] { background: var(--navink); color: var(--nav); border-color: transparent; }

/* Inschuifpaneel (AC-4.2, AC-120.6). Op een telefoon vult het paneel het scherm;
   op desktop schuift het van rechts in over de onderliggende lijst. */
.paneelscherm { position: relative; }
.inschuifpaneel {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  display: flex;
  flex-direction: column;
}
.inschuifpaneel-kop {
  flex: none;
  display: flex;
  align-items: center;
  gap: var(--sp-5);
  padding: var(--sp-8) var(--sp-10);
  border-bottom: 1px solid var(--line);
}
.inschuifpaneel-titel { flex: 1; font-size: 17px; font-weight: 600; letter-spacing: -.01em; margin: 0; color: var(--ink); }
.inschuifpaneel-sluit {
  width: 44px;
  height: 44px;
  border-radius: var(--sp-3);
  border: 1px solid var(--line2);
  background: var(--surf);
  color: var(--ink2);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  text-decoration: none;
}
.inschuifpaneel-inhoud { flex: 1; overflow-y: auto; padding: var(--sp-10); display: flex; flex-direction: column; gap: var(--sp-8); }
.inschuifpaneel-voet {
  flex: none;
  display: flex;
  gap: var(--sp-4);
  justify-content: flex-end;
  padding: var(--sp-7) var(--sp-10) calc(var(--sp-7) + var(--onderrand));
  border-top: 1px solid var(--line);
  background: var(--surf2);
}

/* De blokkerende IBAN-dialoog (US-151, AC-5.7, AC-151.6). Anders dan het
   inschuifpaneel hierboven is dit een echte modale dialoog: een scrim over de
   volledige schermbreedte en -hoogte, met de dialoog gecentreerd erin. Zuivere
   CSS, dus dit werkt ook zonder JavaScript (ADR-0037) — wwwroot/js/rekeningnummer.js
   voegt alleen de focus-trap toe; er is bewust geen sluitkruis en geen
   Escape-afhandeling, want de enige wegen eruit zijn Opslaan en Later. */
.scrim {
  position: fixed;
  inset: 0;
  background: rgba(16, 32, 22, .55);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--sp-6);
  z-index: 200;
}
.scrim .dialoog {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  max-width: 440px;
  width: 100%;
  padding: var(--sp-10);
}
.scrim .dialoog h1 { margin-top: 0; font-size: 20px; }
@media (prefers-reduced-motion: reduce) {
  .scrim { animation: none; }
}

/* Toasts (AC-120.6): onderaan gecentreerd, 4,2 s, met sluitkruis. Zonder
   JavaScript blijft de melding een gewone .melding in de pagina staan. */
.toastbalk {
  position: fixed;
  left: var(--sp-6);
  right: var(--sp-6);
  bottom: calc(88px + var(--onderrand));
  z-index: 70;
  display: flex;
  flex-direction: column;
  gap: var(--sp-3);
  align-items: center;
  pointer-events: none;
}
.toast {
  pointer-events: auto;
  display: flex;
  align-items: flex-start;
  gap: 11px;
  max-width: 100%;
  padding: var(--sp-5) var(--sp-7);
  border-radius: var(--sp-5);
  background: var(--ink);
  color: var(--bg);
  box-shadow: var(--shadow);
  font-size: var(--fs-body);
  font-weight: 500;
  animation: pcash-toast .18s ease-out;
}
.toast button {
  min-height: 44px;
  min-width: 44px;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  cursor: pointer;
  opacity: .7;
}

@keyframes pcash-toast { from { transform: translateY(14px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
@keyframes pcash-paneel { from { transform: translateX(30px); opacity: 0; } to { transform: translateX(0); opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
  .toast, .inschuifpaneel { animation: none; }
}

/* =====================================================================
   6. Schermspecifieke aanvullingen (ongewijzigd overgezet op de tokens)
   ===================================================================== */

/* Beheer: categorieën en boekingsredenen (US-028, functioneel ontwerp 15.4) */
.beheertabel td.acties { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-5); }
.beheertabel td.acties form { margin: 0; }
.koppelknop {
  background: none; border: none; padding: 0; font: inherit; color: var(--brandtext);
  text-decoration: underline; cursor: pointer;
}
.beheertabel tr.bevestiging td { background: var(--surf2); }

/* Boekingen: inkomstformulier (US-032, functioneel ontwerp 9.1) */
.euroveld { display: flex; align-items: center; gap: var(--sp-1); }
.euroveld .euroteken {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 40px; min-height: 44px;
  background: var(--surf3); border: 1px solid var(--line2); border-radius: var(--radius-knop);
  font-weight: 600; color: var(--ink2); font-size: 1.1rem;
}
.euroveld input { flex: 1 1 auto; text-align: right; font-variant-numeric: tabular-nums; }
.beheerform .veld .teller { margin: 0; }

/* Bon fotograferen op mobiel (US-051, AC-4.10): het echte bestandsveld
   (<input data-bijlage-mobiel>, gedeeld door uitgave en declaratie) blijft
   functioneel en indienbaar, maar wordt door wwwroot/js/bijlage-camera.js
   visueel vervangen door twee knoppen. Zonder JavaScript blijft het gewone
   <input type="file"> zichtbaar en bruikbaar (ADR-0037). */
.bijlage-mobiel-verborgen {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.bijlage-knoppen { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin: var(--sp-2) 0; }
.bijlage-knoppen button {
  display: inline-flex; align-items: center; justify-content: center;
  min-height: 44px; box-sizing: border-box;
  background: var(--surf); color: var(--brandtext);
  border: 1px solid var(--line2); border-radius: var(--radius-knop);
  padding: var(--sp-4) var(--sp-7); font: inherit; font-weight: 600; cursor: pointer;
}
.bijlage-gekozen { margin: var(--sp-2) 0 0; }

/* Info-icoon (US-065/066, begrotingsregels). */
.infoicoon {
  color: var(--brandtext);
  font-size: 0.9em;
  cursor: help;
}

/* Uitvouwpaneel (US-106, uitgaveformulier): een gewone <details>, dus werkend
   zonder JavaScript (ADR-0037). */
.uitvouwpaneel {
  border: 1px solid var(--line);
  border-radius: var(--radius-knop);
  background: var(--surf);
  padding: 0 var(--sp-5);
  margin: var(--sp-5) 0;
}
.uitvouwpaneel > summary {
  min-height: 44px;
  display: flex;
  align-items: center;
  gap: var(--sp-1);
  cursor: pointer;
  font-weight: 600;
}
.uitvouwpaneel[open] > summary { margin-bottom: var(--sp-1); }

/* E-mailtemplates en verzendlog (US-069/070). */
.mailvoorbeeld {
  display: block;
  width: 100%;
  min-height: 16rem;
  box-sizing: border-box;
  background: var(--surf);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
}
.mailbron {
  max-width: 100%;
  overflow-x: auto;
  padding: var(--sp-5);
  background: var(--surf2);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  white-space: pre-wrap;
  word-break: break-word;
}
.tokentabel code { word-break: break-word; }

/* Uitbetalingen (US-102/103/104, functioneel ontwerp 27). */
.beheertabel td.getal, .beheertabel th.getal {
  text-align: right;
  font-variant-numeric: tabular-nums;
}
.paneel {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--sp-5) var(--sp-7);
  margin: var(--sp-7) 0;
  background: var(--surf);
  box-shadow: var(--shadow2);
}
.paneel > h2:first-child, .paneel > h3:first-child { margin-top: 0; }
.kenmerk {
  font-family: var(--font-mono);
  font-size: 1.15rem;
  font-weight: 600;
  letter-spacing: 0.04em;
}

/* Mutatierapportage (US-080/081, functioneel ontwerp 14.2). */
.mutatiegrid { font-size: var(--fs-meta); }
.mutatiegrid td, .mutatiegrid th { white-space: nowrap; }
/* Alleen de omschrijving mag afbreken: dat is de enige vrije tekst. */
.mutatiegrid td:nth-child(6) { white-space: normal; min-width: 12rem; }
.mutatiegrid caption { text-align: left; padding: 0 0 var(--sp-1); }
.mutatiegrid tfoot th, .mutatiegrid tfoot td {
  border-top: 2px solid var(--line2);
  font-weight: 600;
}

/* Werkbakje (US-063, functioneel ontwerp 12). */
.status.nieuw {
  background: var(--brand);
  color: var(--brandink);
  border-color: var(--brand);
}
.werkbakje tr.nieuw > th[scope="row"] {
  border-left: 4px solid var(--brand);
  padding-left: var(--sp-3);
}
.werkbakje .teller { display: block; margin: 0; }
.werkvoorraad {
  margin: var(--sp-1) 0 var(--sp-5);
  display: flex;
  align-items: center;
  gap: var(--sp-1);
  flex-wrap: wrap;
}

/* Kascontrole (US-075/076, functioneel ontwerp 17.1 en 17.4). */
.afwijking { color: var(--danger); font-variant-numeric: tabular-nums; }
.kenmerk.waarschuwing { color: var(--danger); font-weight: 600; }
.beheertabel tr.tecontroleren > th[scope="row"] {
  border-left: 4px solid var(--brand);
  padding-left: var(--sp-3);
}
.bladeraar { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin: var(--sp-7) 0; }
.bewijsstuk { margin: var(--sp-7) 0; }
.bewijsstuk img, .bewijsstuk object {
  display: block;
  width: 100%;
  max-width: 44rem;
  max-height: 70vh;
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf);
}
.bewijsstuk object { height: 70vh; }

/* De jaarrekening van vóór US-132 stond hier; sinds US-132 is zij een
   document met een eigen, themaonafhankelijke tokenset achteraan dit bestand
   (ADR-0090). */

/* Generieke tabelcomponent (US-107, AC-4.4, functioneel ontwerp 4.3, ADR-0075). */
.tabelblok { margin: var(--sp-7) 0; }
.tabelbediening { margin: 0; }
.tabelbediening .zoekbalk { align-items: flex-end; }
.tabelbediening .zoekveld { display: grid; gap: var(--sp-1); }
.tabelbediening .zoekveld label { font-size: var(--fs-secundair); color: var(--ink2); font-weight: 600; }
.tabelblok[aria-busy="true"] { opacity: 0.6; }

.sorteerlink { display: inline-flex; align-items: center; gap: var(--sp-1); color: var(--ink2); text-decoration: none; }
.sorteerlink:hover, .sorteerlink:focus { color: var(--brandtext); text-decoration: underline; }
.sorteerteken { font-size: 0.9em; }
th[aria-sort="ascending"] .sorteerlink, th[aria-sort="descending"] .sorteerlink {
  color: var(--brandtext);
  font-weight: 700;
}

.filterregel td { padding-top: var(--sp-1); padding-bottom: var(--sp-1); border-top: none; }
.kolomfilter {
  width: 100%;
  min-width: 0;
  padding: var(--sp-2) var(--sp-1);
  border: 1px solid var(--line2);
  border-radius: var(--sp-2);
  background: var(--surf);
  color: var(--ink);
  font-size: var(--fs-meta);
}

.bladeraar .huidigepagina { background: var(--brand); color: var(--brandink); border-color: var(--brand); }

/* --- Jaarlijkse archiefset (US-089) --- */
.archiefkandidaten { list-style: none; padding: 0; margin: 0 0 var(--sp-7); }
.archiefkandidaten li {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--sp-3);
  padding: var(--sp-2) 0;
  border-bottom: 1px solid var(--line);
}
.archiefstaat { font-size: var(--fs-meta); border-radius: var(--radius-pil); padding: 2px var(--sp-4); }
.archiefstaat.gedaan { background: var(--brand); color: var(--brandink); }
.archiefstaat.open { background: transparent; color: var(--ink2); border: 1px solid var(--line2); }
/* --- einde Jaarlijkse archiefset (US-089) --- */

/* --- US-097: gezondheid van de bankkoppeling ---
   De vier standen van een bewakingssignaal. Kleur is nooit het enige signaal
   (AC-4.13, AC-97.2): in de HTML staat naast deze klasse altijd het woord —
   "in orde", "let op", "storing", "onbekend" of "niet gekoppeld".

   De standen gebruiken sinds US-120 de signaaltokens: groen is de huisstijl
   (--brand), "let op" het warntoken en "storing" het dangertoken, elk met hun
   eigen zachte vlak en rand. Zo halen ze in licht én donker WCAG AA
   (getoetst in tests/PCash.Web.Tests/Monitoring). Onbekend krijgt bewust geen
   vlakkleur: "we weten het niet" hoort niet als een stand te ogen. */
.status.signaal.goed { background: var(--brand); color: var(--brandink); border-color: var(--brand); }
.status.signaal.letop { background: var(--warnsoft); color: var(--warn); border-color: var(--warnline); }
.status.signaal.storing { background: var(--dangersoft); color: var(--danger); border-color: var(--dangerline); }
.status.signaal.onbekend { background: transparent; color: var(--ink2); border-color: var(--line2); }
/* --- einde US-097 --- */

/* =====================================================================
   7. Inlogscherm (AC-120.7, README §1)
   ===================================================================== */

.inlog { display: grid; grid-template-columns: 1fr; min-height: 100vh; }
.inlog-beeld {
  position: relative;
  overflow: hidden;
  background: var(--nav);
  min-height: 180px;
  display: flex;
}
/* De achtergrondfoto vult de linkerhelft. Het kind-teken (>) is hier
   wezenlijk: met .inlog-beeld img raakte deze regel ook het logo, dat immers
   binnen .inlog-beeld staat. Met specificiteit (0,1,1) versloeg hij
   .inlog-logo (0,1,0) en werd het logo 720 x 900px, over de gradiënt heen; het
   logo ging uit de flow, waardoor de groepsnaam naar bóven schoof in plaats van
   naar onder. Bevinding R-008 uit de designreview van 2026-09-09, blokkerend.
   README §1: het logo is 72px hoog en staat linksboven, de groepsnaam
   linksonder, en de gradiënt is zichtbaar over de foto. */
.inlog-beeld > picture, .inlog-beeld > picture > img, .inlog-beeld > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.inlog-gradient {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0, 40, 20, .62) 0%, rgba(0, 30, 15, .22) 45%, rgba(0, 45, 22, .72) 100%);
}
.inlog-beeldtekst {
  position: relative;
  flex: 1;
  padding: var(--sp-11) var(--sp-10);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: var(--sp-9);
}
/* En het logo zegt het nog een keer zelf, zodat een toekomstige, ruimere
   achtergrondregel het niet opnieuw kan overnemen (R-008). */
.inlog-logo {
  position: static;
  inset: auto;
  height: 72px;
  width: auto;
  object-fit: contain;
  align-self: flex-start;
  filter: brightness(0) invert(1);
  opacity: .96;
}
.inlog-groep {
  display: flex;
  align-items: center;
  gap: 9px;
  font-size: var(--fs-secundair);
  font-weight: 600;
  color: rgba(255, 255, 255, .95);
  text-shadow: 0 1px 3px rgba(0, 0, 0, .4);
}
.inlog-bol { width: 7px; height: 7px; border-radius: var(--radius-pil); background: currentColor; }
.inlog-kolom { display: flex; align-items: center; justify-content: center; padding: var(--sp-12) var(--sp-10); }
.inlog-kaart { width: 100%; max-width: 360px; }
.inlog-kaart h1 { font-size: 24px; font-weight: 600; margin: 0 0 var(--sp-3); color: var(--ink); }
.inlog-welkom { font-size: var(--fs-body); color: var(--ink2); line-height: 1.55; margin: 0 0 var(--sp-11); }
.inlog-microsoft {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-4);
  width: 100%;
  min-height: 48px;
  border-radius: var(--sp-5);
  background: var(--brand);
  color: var(--brandink);
  border: 1px solid var(--brand);
  font-size: 15px;
  font-weight: 600;
  text-decoration: none;
  box-shadow: var(--shadow2);
}
.inlog-nood { margin-top: var(--sp-9); }
.inlog-nood > summary {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  min-height: 44px;
  cursor: pointer;
  font-size: var(--fs-secundair);
  font-weight: 600;
  color: var(--ink2);
  list-style: none;
}
.inlog-nood > summary::-webkit-details-marker { display: none; }
.inlog-noodblok { margin-top: var(--sp-7); padding-top: var(--sp-8); border-top: 1px solid var(--line); }
.inlog-uitleg { font-size: var(--fs-meta); color: var(--ink2); line-height: 1.5; margin: 0 0 var(--sp-6); }
.inlogformulier { display: flex; flex-direction: column; gap: var(--sp-4); }
.inlogformulier label { font-size: 13px; font-weight: 600; }
.inlogformulier input {
  width: 100%;
  padding: 0 13px;
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf);
  color: var(--ink);
  font: inherit;
}
.inlogformulier .veld { display: grid; gap: var(--sp-2); }

/* Randgevallen "zonder speltak" en "zonder IBAN" (README §1): één rustig,
   gecentreerd blok in dezelfde stijl. */
.centraalblok {
  max-width: 460px;
  margin: var(--sp-12) auto;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: 16px;
  box-shadow: var(--shadow);
  padding: var(--sp-11);
}
.centraalblok h1 { font-size: 22px; }

/* =====================================================================
   8. Desktop — alles wat breder mag zijn dan een telefoonscherm
   ===================================================================== */

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .app { flex-direction: row; }

  .zijbalk {
    display: flex;
    flex-direction: column;
    width: 264px;
    flex: none;
    background: var(--nav);
    color: var(--navink);
    padding: 16px 14px;
    overflow: hidden;
    height: 100vh;
    max-height: 100vh;
    position: sticky;
    top: 0;
  }

  .hoofd { flex: 1; min-width: 0; display: flex; flex-direction: column; min-height: 100vh; }

  /* README §Layoutraamwerk: "kopbalk 64px … Daaronder de inhoud met
     overflow-y:auto". De kopbalk blijft dus staan en alleen het inhoudsgebied
     scrollt; de zijbalk doet dat al met dezelfde techniek (bevinding R-002 uit
     de designreview van 2026-09-09). Sticky en niet fixed: de balk hoort binnen
     .hoofd te blijven, naast de zijbalk van 264px, en houdt zo zijn breedte
     zonder losse berekening. z-index 50 zet hem boven het seizoenpaneel (20) en
     de wachtrij (30) maar onder de tabbalk (60/61), de toasts (70) en de
     overslaanlink (90). Alleen op desktop: op een telefoon vult de gekleurde
     kop de bovenkant en scrollt die gewoon mee (README §Mobiele schermen). */
  .kopbalk {
    padding: 0 28px;
    position: sticky;
    top: 0;
    z-index: 50;
    /* Eén regel: de schermnaam links, de acties rechts (README §Layoutraamwerk).
       De twee rijen van R-042 zijn er alleen op een telefoon. */
    flex-wrap: nowrap;
  }
  .kopbalk-links { flex: 1 1 auto; }
  .kopbalk-acties { width: auto; }
  .kopbalk-terug { display: none; }

  .inhoud { padding: 28px; }

  /* De tabbalk en de zwevende actieknop zijn er alleen op een telefoon. */
  .mobieletabbalk, .mobieleactieknop { display: none; }

  .toastbalk { left: 0; right: 0; bottom: 26px; }
  .toast { max-width: 640px; }

  /* Het inschuifpaneel: 520px, van rechts, over de onderliggende lijst heen. */
  .paneelscherm .inschuifpaneel {
    width: 520px;
    max-width: 100%;
    margin-left: auto;
    border-radius: 0;
    border-right: 0;
    border-top: 0;
    border-bottom: 0;
    min-height: 100%;
    animation: pcash-paneel .2s ease-out;
  }

  .inlog { grid-template-columns: 1fr 1fr; }
  .inlog-beeld { min-height: 100vh; }
  .inlog-beeldtekst { padding: 48px; }
  .inlog-kolom { padding: 48px; }
}

@media (max-width: 480px) {
  /* Financiële tools en het Instellingen-submenu stapelen op een telefoonscherm
     in plaats van naast elkaar te verdringen (AC-4.9). */
  .knoppen { flex-direction: column; align-items: stretch; }
  .knoppen .knop { width: 100%; }
  .submenu { flex-direction: column; align-items: stretch; }
  .submenu a { justify-content: center; }
  /* Formuliervelden nemen de volle breedte (AC-4.9). */
  .zoekbalk input[type="search"] { min-width: 0; width: 100%; }
  .tabelbediening .zoekveld { width: 100%; }
}

/* =====================================================================
   US-131 — Begrotingen: kaartoverzicht, tabbladen, regeltabel en checklist
   (docs/design/README.md §10). Alleen tokens, geen letterlijke kleuren.
   ===================================================================== */

/* --- Het kaartraster van de tabelcomponent (ADR-0088) --- */
.kaartraster {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: var(--sp-7);
  margin: var(--sp-7) 0;
}
.kaartleeg {
  grid-column: 1 / -1;
  margin: 0;
  padding: var(--sp-11);
  text-align: center;
  color: var(--ink3);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
}
/* De sorteer- en filtervelden van een kaartoverzicht: geen kopcellen om ze
   onder te hangen, dus staan ze op één rij in het bedieningsformulier. */
.tabelbediening .kaartbediening { margin-top: var(--sp-4); }

/* --- Kaart per begroting (AC-131.1) --- */
.begrotingskaart {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-9);
}
.begrotingskaart-kop {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  margin-bottom: var(--sp-4);
}
.begrotingskaart-naam { font-size: 17px; margin: 0; }
.begrotingskaart-naam a { text-decoration: none; }
.begrotingskaart-naam a:hover { text-decoration: underline; }
.begrotingskaart-meta {
  margin: 0 0 var(--sp-7);
  font-size: var(--fs-meta);
  color: var(--ink3);
}
.begrotingskaart-cijfers {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--sp-3);
  margin: 0;
}
.begrotingskaart-cijfers dt {
  font-size: var(--fs-meta);
  color: var(--ink3);
  margin-bottom: 3px;
}
.begrotingskaart-cijfers dd {
  margin: 0;
  font-size: 15px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}

/* --- Tabbladen van het begrotingsdetail (AC-131.2, AC-131.12) --- */
.begrotingskop {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--sp-4);
}
.begrotingskop h1 { margin: 0; }

.tabstrip {
  display: flex;
  gap: var(--sp-1);
  margin: var(--sp-7) 0 0;
  border-bottom: 1px solid var(--line);
  /* Op een telefoon schuift de rij horizontaal in plaats van te verdringen
     (AC-4.9); de pagina zelf scrolt daardoor niet mee. */
  overflow-x: auto;
  scrollbar-width: thin;
}
.tabstrip a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 var(--sp-6);
  white-space: nowrap;
  font-weight: 600;
  color: var(--ink3);
  text-decoration: none;
  border: 1px solid transparent;
  border-radius: var(--radius-knop) var(--radius-knop) 0 0;
}
.tabstrip a[aria-current="page"] {
  background: var(--bg);
  color: var(--ink);
  border-color: var(--line);
  border-bottom-color: var(--bg);
  margin-bottom: -1px;
}
.tabstrip a:hover { color: var(--ink); }
.tabpaneel { margin-top: var(--sp-7); }
.tabpaneel:focus { outline: none; }

.tabkop {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--sp-7);
  flex-wrap: wrap;
  margin-bottom: var(--sp-5);
}
.tabkop .paginauitleg { margin: 0; max-width: 66ch; }
.paginauitleg { color: var(--ink2); }

/* --- Kaartvlak om een tabel of een blok heen --- */
.paneel {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-9);
  margin: var(--sp-7) 0;
}
.paneel > .overflow-x { margin: calc(-1 * var(--sp-9)); }
.paneel > .overflow-x:first-child { margin-top: calc(-1 * var(--sp-9)); }
.paneel h2:first-child { margin-top: 0; }

/* --- Regeltabel en matrixtabel (AC-131.5, AC-131.6) --- */
.regeltabel, .matrixtabel { width: 100%; border-collapse: collapse; background: var(--surf); }
.regeltabel th, .regeltabel td,
.matrixtabel th, .matrixtabel td {
  text-align: left;
  padding: var(--sp-5) var(--sp-8);
  border-top: 1px solid var(--line);
  font-size: var(--fs-secundair);
  vertical-align: top;
}
.regeltabel thead th, .matrixtabel thead th {
  border-top: none;
  background: var(--surf2);
  color: var(--ink2);
  font-size: var(--fs-meta);
}
.regeltabel .getal, .matrixtabel .getal { text-align: right; font-variant-numeric: tabular-nums; }
.regeltabel tfoot { background: var(--surf2); font-weight: 600; }
.matrixtabel .matrixtotaal th, .matrixtabel .matrixtotaal td {
  border-top: 2px solid var(--ink);
  font-weight: 600;
}
.regelnaam { display: block; font-weight: 600; color: var(--ink); }
.regelmeta { display: block; font-size: var(--fs-meta); color: var(--ink3); margin-top: 2px; }
/* Het label uit het design bij een automatisch berekende regel (AC-131.6). */
.regellabel {
  display: inline-block;
  margin-top: 2px;
  padding: 1px var(--sp-3);
  border-radius: var(--radius-pil);
  border: 1px solid var(--line2);
  background: var(--surf3);
  color: var(--ink2);
  font-size: var(--fs-micro);
  font-weight: 600;
}

/* --- Overzicht: gegevens links, checklist rechts (AC-131.3, AC-131.4) --- */
/* minmax(0, 1fr): zonder vaste kolom werd de enige kolom op een telefoon zo breed
   als de breedste inhoud (de matrix), en liep de kaart buiten beeld (2026-10-03). */
.begrotingsoverzicht { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-9); align-items: start; }

/* Bevinding R-016: het formulier in de kaart Gegevens droeg zijn eigen rand en
   schaduw en werd zo een kaart in een kaart. Het design zet de velden direct in
   de kaart (README §10). Zelfde ingreep als op het declaratiedetail. */
.begrotingsoverzicht .paneel .beheerform {
  max-width: none;
  margin-top: 0;
  padding: 0;
  border: none;
  border-radius: 0;
  background: none;
  box-shadow: none;
}
.checklijst { list-style: none; margin: 0; padding: 0; }
.checklijst li {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-5);
  padding: var(--sp-5) 0;
  border-top: 1px solid var(--line);
}
.checklijst li:first-child { border-top: none; }
.checkteken {
  flex: none;
  width: 20px;
  height: 20px;
  border-radius: var(--radius-pil);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-meta);
  font-weight: 700;
  border: 1px solid var(--brandline);
  background: var(--brandsoft);
  color: var(--brandtext);
}
.checklijst li.attentie .checkteken {
  border-color: var(--warnline);
  background: var(--warnsoft);
  color: var(--warn);
}
.checknaam { flex: 1; min-width: 0; }
.checknaam .teller { display: block; }
.checksoort { flex: none; font-size: var(--fs-meta); font-weight: 600; color: var(--ink3); }
.checklijst li.attentie .checksoort { color: var(--warn); }

/* --- Het formulier met de gegevens: twee kolommen op een breed scherm --- */
.velden-raster .knoppen { grid-column: 1 / -1; }

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  /* De checklist staat rechts naast het overzicht; op een telefoon (buiten dit
     blok) schuift zij eronder, want dan is .begrotingsoverzicht één kolom. */
  .begrotingsoverzicht { grid-template-columns: minmax(0, 1fr) 360px; }
  .velden-raster { display: grid; grid-template-columns: 1fr 1fr; gap: 0 var(--sp-7); }
}

@media (max-width: 480px) {
  .begrotingskaart-cijfers { grid-template-columns: 1fr; gap: var(--sp-2); }
  .tabkop .knop { width: 100%; }
  .paneel { padding: var(--sp-7); }
  .paneel > .overflow-x { margin: calc(-1 * var(--sp-7)); }
}
/* --- einde US-131 --- */

/* =====================================================================
   US-122 — Speltakdashboard: transacties centraal
   (docs/design/README.md §3, OPDRACHT.md §2)

   Alle kleuren komen uit de tokenset van US-120 (var(--…)), zodat licht en
   donker allebei kloppen. Alles hieronder geldt vanaf 360px; wat breder moet
   zijn dan een telefoonscherm — de tweekolomsindeling en het seizoenpaneel van
   580px — staat onderaan in het min-width-blok (AC-4.9).
   ===================================================================== */

/* -- Seizoenchip en -paneel (AC-122.1, AC-122.2) ---------------------- */
/* De seizoensadministratie is één keer per jaar werk en staat daarom niet meer
   als blok op de pagina, maar achter deze chip (OPDRACHT.md §2 punt 1). */
.seizoenkiezer { position: relative; }
/* Dicht is de chip neutraal, open draagt hij de brandkleur — letterlijk de
   twee standen uit het prototype (seizoenChipStyle: bij een dichtgeklapt paneel
   border --line2 / background --surf2 / color --ink2, bij een opengeklapt
   paneel border --brand / background --brandsoft / color --brandtext). Hij
   stond altijd op de open stand en was daarmee luider dan het design; bevinding
   R-011 uit de designreview van 2026-09-09. */
.seizoenkiezer > summary {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  min-height: 44px;
  padding: 0 11px;
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf2);
  color: var(--ink2);
  font-size: var(--fs-secundair);
  font-weight: 600;
  cursor: pointer;
  list-style: none;
}
.seizoenkiezer > summary::-webkit-details-marker { display: none; }
.seizoenkiezer[open] > summary {
  border-color: var(--brand);
  background: var(--brandsoft);
  color: var(--brandtext);
}
.seizoenkiezer[open] > summary .seizoenchip-chevron { transform: rotate(180deg); }

.seizoenpaneel {
  margin-top: var(--sp-1);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  overflow: hidden;
}
.seizoenpaneel-kop {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-5);
  flex-wrap: wrap;
  padding: 13px var(--sp-7);
  border-bottom: 1px solid var(--line);
}
.seizoenpaneel-titel { font-size: var(--fs-secundair); font-weight: 600; color: var(--ink); }
/* De ondertitel "Beginsaldo, mutatie en eindsaldo per potje" is met US-207 uit
   het paneel verdwenen, samen met de saldokolommen; de uitleg staat nu boven de
   seizoenspagina. */

.seizoentabel { width: 100%; border-collapse: collapse; }
.seizoentabel th,
.seizoentabel td {
  text-align: left;
  padding: var(--sp-5) var(--sp-7);
  border-top: 1px solid var(--line);
  font-size: var(--fs-meta);
  white-space: nowrap;
}
.seizoentabel thead th {
  border-top: none;
  background: var(--surf2);
  color: var(--ink2);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
}
.seizoentabel td.getal, .seizoentabel th.getal { text-align: right; font-variant-numeric: tabular-nums; }
/* De mutatiekolommen staan tussen begin- en eindsaldo: beginsaldo + mutatie =
   eindsaldo (AC-35.6, functioneel ontwerp 25.2). */
.seizoentabel td.mutatie { color: var(--ink2); }
.seizoentabel td.periode { color: var(--ink3); font-variant-numeric: tabular-nums; }
/* Het gekozen seizoen is aangevinkt én groen gemarkeerd (README §3). De
   markering hangt aan de rijkop, zodat de rij zelf een gewone <tr> blijft. */
.seizoentabel th.gekozen, .seizoentabel th.gekozen ~ td { background: var(--brandsoft); }
.seizoentabel .vinkje { color: var(--brandtext); vertical-align: middle; }

.seizoenpaneel-links {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-6);
  margin: 0;
  padding: var(--sp-5) var(--sp-7);
  border-top: 1px solid var(--line);
  font-size: var(--fs-meta);
}
.seizoenpaneel-linkskop { color: var(--ink3); }

/* De regel over de aansluiting (.seizoenpaneel-regel) stond hier tot US-207 en
   staat nu als lopende tekst boven de seizoenspagina. */
/* Eén vaste opbouw (US-227, FB-002): de toelichting boven, de knoppen
   daaronder op een eigen regel. Tot US-227 stonden tekst en knoppen samen in één
   afbrekende flexregel, zodat de ene knop naast de tekst belandde en de andere
   eronder — afhankelijk van hoe lang de tekst in die stand van het seizoen was. */
.seizoenpaneel-voet {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: var(--sp-5);
  flex-wrap: wrap;
  padding: var(--sp-6) var(--sp-7);
  background: var(--surf2);
  border-top: 1px solid var(--line);
}
.seizoenpaneel-gevolg { margin: 0; font-size: var(--fs-meta); color: var(--ink2); line-height: 1.45; }
.seizoenpaneel-voet .melding { margin: 0; }
/* Secundair links, primair rechts, samen rechts uitgelijnd. */
.seizoenpaneel-knoppen {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: var(--sp-4);
  flex-wrap: wrap;
}

/* Statussen krijgen naast de kleur een eigen vorm, zodat ze ook zonder kleur uit
   elkaar te houden zijn (AC-4.13, README §3): stippelrand bij klaargezet, een
   bolletje bij open en een gesloten vlak bij definitief. Het woord zelf staat
   er altijd bij; deze vorm is het derde signaal, geen vervanging. */
.status.open::before {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  margin-right: 6px;
  border-radius: var(--radius-pil);
  background: var(--credit);
}
.status.ingediend { border-style: dashed; }

/* -- Zoekveld in de kopbalk (AC-122.11) ------------------------------- */
.kopzoek {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-height: 44px;
  padding: 0 var(--sp-5);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf2);
  color: var(--ink3);
}
.kopzoek-icoon { display: flex; flex: none; }
.kopzoek input[type="search"] {
  flex: 1 1 auto;
  min-width: 0;
  border: 0;
  background: transparent;
  color: var(--ink);
  font: inherit;
  font-size: var(--fs-secundair);
  padding: 0;
  min-height: 44px;
}
.kopzoek input[type="search"]:focus-visible { outline: none; }
.kopzoek:focus-within { border-color: var(--brand); }

/* -- Saldokaarten (AC-122.3) ------------------------------------------ */
.saldopaneel { background: var(--surf2); padding: var(--sp-6) var(--sp-7); }
.saldopaneel .label { margin-bottom: var(--sp-2); }
.saldopaneel .waarde { display: flex; align-items: baseline; gap: var(--sp-3); flex-wrap: wrap; }
.saldopaneel .bijschrift { font-size: var(--fs-meta); font-weight: 400; color: var(--ink3); letter-spacing: 0; }
/* Het totaalsaldo in brandkleur, niet met een streep ernaast (README §3). */
.saldopaneel.totaal {
  background: var(--brandsoft);
  border-color: var(--brandline);
  border-left: 1px solid var(--brandline);
}
.saldopaneel.totaal .label, .saldopaneel.totaal .waarde { color: var(--brandtext); }
.saldopaneel.totaal .label { font-weight: 600; }

/* -- De twee kolommen (AC-122.4, AC-122.8) ---------------------------- */
.dashboardkolommen { display: flex; flex-direction: column; gap: var(--sp-8); }
.hoofdkolom { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-4); }
.zijkolom { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-8); }

.lijstkop { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-5); }
.lijstkop h1 { font-size: var(--fs-kaartkop); font-weight: 600; color: var(--ink); margin: 0; letter-spacing: 0; }
.lijstteller { font-size: var(--fs-meta); color: var(--ink3); font-variant-numeric: tabular-nums; }

.leesbanner {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-4);
  margin: 0;
  padding: var(--sp-5) var(--sp-7);
  border: 1px solid var(--warnline);
  border-radius: var(--radius-knop);
  background: var(--warnsoft);
  color: var(--warn);
  font-size: var(--fs-meta);
  line-height: 1.45;
}
.leesbanner svg { flex: none; margin-top: 2px; }
.leesbanner a { color: var(--warn); }

/* -- De transactielijst als kaart (AC-122.4, AC-122.6) ---------------- */
.transactiekaart {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  overflow: hidden;
}
.transactiekaart .dag { margin: 0; }
/* Dagkop in kleine kapitalen op --surf2 (README §3). */
.transactiekaart .dag-kop {
  position: static;
  padding: 9px var(--sp-8);
  background: var(--surf2);
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--ink2);
}
.transactiekaart .dag:first-child .dag-kop { border-top: 0; }

/* Een compacte regel: 13px verticaal en 18px horizontaal, binnen de 12–14px uit
   het design (OPDRACHT.md §2 punt 4, AC-122.6). Het raakvlak blijft ruim boven
   de 44px doordat het icoon van 36px plus die padding samen 62px hoog is
   (AC-4.9). */
.transactiekaart .transactie {
  display: flex;
  align-items: center;
  gap: var(--sp-6);
  padding: 13px var(--sp-8);
  border-bottom: 1px solid var(--line);
  min-height: 44px;
}
.transactiekaart .transacties li:last-child .transactie { border-bottom: 0; }
.transactie-icoon {
  width: 36px;
  height: 36px;
  flex: none;
  border-radius: 11px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--surf3);
  border: 1px solid var(--line2);
  color: var(--ink2);
}
/* Pijl omhoog voor een inkomst in brandsoft, omlaag voor een uitgave, dubbele
   pijl voor een kasboeking (README §3). */
.transactie-icoon.inkomst { background: var(--brandsoft); border-color: var(--brandline); color: var(--brandtext); }
.transactie-tekst { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.transactiekaart .transactie .omschrijving { font-size: var(--fs-body); font-weight: 600; color: var(--ink); }
.transactiekaart .transactie .meta { color: var(--ink3); font-size: var(--fs-meta); }
.transactiekaart .transactie .bedrag {
  flex: none;
  font-size: 15.5px;
  font-weight: 600;
  white-space: nowrap;
}

.meerladen { display: flex; align-items: center; gap: var(--sp-6); flex-wrap: wrap; margin: var(--sp-3) 0 0; }
.meerladen .alleslink { font-size: var(--fs-meta); }

/* -- Kaarten in de rechterkolom (AC-122.8) ---------------------------- */
.kaart {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  overflow: hidden;
}
.kaartkop {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  padding: var(--sp-6) var(--sp-7);
  border-bottom: 1px solid var(--line);
}
.kaartkop h2 { margin: 0; font-size: var(--fs-kaartkop); font-weight: 600; color: var(--ink); letter-spacing: 0; }
.takenpil {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  min-height: 22px;
  padding: 0 9px;
  border-radius: var(--radius-pil);
  background: var(--brand);
  color: var(--brandink);
  font-size: var(--fs-micro);
  font-weight: 600;
}
/* US-046: de mismatches met bunq op de tegel; kleur plus het woord (AC-17.2). */
.takenpil.bunqpil { background: var(--warnsoft); color: var(--warn); border: 1px solid var(--warnline); }
.kaartleeg, .kaartvoet { margin: 0; padding: var(--sp-5) var(--sp-7); font-size: var(--fs-meta); color: var(--ink2); }
.kaartvoet { border-top: 1px solid var(--line); }

.taakregel { margin: 0; border-bottom: 1px solid var(--line); }
.taakregel.nieuw { background: var(--brandsoft); }
.taakknop {
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  width: 100%;
  min-height: 44px;
  padding: 13px var(--sp-7);
  border: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.taakknop:hover { background: var(--surf2); }
.taakbron { display: flex; align-items: center; gap: var(--sp-3); font-size: var(--fs-meta); color: var(--ink2); }
.taaktitel { font-size: var(--fs-kaartkop); font-weight: 600; color: var(--ink); }
.taakvoet { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-5); }
.taakactie { font-size: var(--fs-secundair); color: var(--ink2); }
.taakvoet .bedrag { font-size: var(--fs-body); font-weight: 600; color: var(--ink); }

.tegels-vastleggen { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-2); padding: var(--sp-4); }
.tegel {
  display: flex;
  align-items: center;
  gap: 9px;
  min-height: 44px;
  padding: 11px var(--sp-5);
  border: 1px solid var(--line);
  border-radius: var(--radius-knop);
  background: var(--surf2);
  color: var(--ink);
  font: inherit;
  font-size: var(--fs-secundair);
  font-weight: 600;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
}
.tegel:hover { text-decoration: none; filter: brightness(.97); }
:root[data-theme="dark"] .tegel:hover { filter: brightness(1.25); }
.tegel[disabled] { opacity: .55; cursor: not-allowed; }
.tegelicoon { flex: none; display: flex; color: var(--brandtext); }
.tegelnaam { min-width: 0; }

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  /* Het seizoenpaneel hangt onder de chip in de kopbalk en is 580px breed
     (AC-122.1, README §3). Op een telefoon staat het gewoon in de stroom. */
  .seizoenkiezer .seizoenpaneel {
    position: absolute;
    top: 36px;
    left: 0;
    z-index: 20;
    width: 580px;
    max-width: 90vw;
  }

  /* Transacties zijn de hoofdkolom; de kaarten staan ernaast in 348px
     (OPDRACHT.md §2 punt 2, README §3). De takenkaart staat in de broncode vóór
     de lijst — dat is de mobiele volgorde (AC-122.12) — en wordt hier expliciet
     rechtsboven geplaatst. */
  .dashboardkolommen {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 348px;
    /* Drie rijen: de takenkaart, "Nieuw vastleggen", en een lege restrij die de
       overlengte van de transactielijst opvangt. De eerste twee zijn
       min-content, dus ze groeien niet mee met de lijst; zonder die restrij
       verdeelde de lijst (met vijftig regels 4436px hoog) zijn hoogte over
       rij 1 en rij 2 en begon rij 2 pas op y=2406 — ruim 2000px leegte tussen
       de twee kaarten. Bevinding R-010 uit de designreview van 2026-09-09.
       README §3: "Rechterkolom: kaart Taken … daaronder de kaart Nieuw
       vastleggen". De rijafstand is 18px, de eigen gap van de rechterkolom. */
    grid-template-rows: min-content min-content 1fr;
    column-gap: var(--sp-10);
    row-gap: var(--sp-8);
    align-items: start;
  }
  .takenplaats { grid-column: 2; grid-row: 1; }
  /* De lijst loopt over alle drie de rijen; de restrij vangt de overlengte op. */
  .hoofdkolom { grid-column: 1; grid-row: 1 / -1; }
  .zijkolom { grid-column: 2; grid-row: 2; align-content: start; }

  .kopzoek { width: 250px; }
}

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* De mobiele variant van het speltakdashboard (AC-122.12, README §Mobiele
     schermen en het artboard 1d van P-CASH Schermen.dc.html): een gekleurde
     kop in --nav met de terugpijl, de speltakchip en het seizoen, daaronder het
     totaalsaldo 34px/600 met bank en kas eronder, en daarna de takenkaart en
     dezelfde transactielijst.

     Tot 2026-09-09 stonden hier vier losse witte kaarten onder elkaar
     (Totaalsaldo, Banksaldo, Kassaldo, Openstaande declaraties) en liep de
     witte desktopkopbalk gewoon door — bevinding R-043 uit de designreview. De
     saldokaarten zijn nu één gekleurd kopblok; de <ul> is dezelfde, alleen de
     opmaak verschilt, zodat een schermlezer niets dubbel voorleest.

     Het blok hangt aan .speltakkop op de <ul> zelf, zodat ook de kopbalk erboven
     mee kan kleuren en de twee als één vlak lezen. */
  .hoofd:has(.speltakkop) .kopbalk {
    background: var(--nav);
    color: var(--navink);
    border-bottom: 0;
    padding-bottom: var(--sp-5);
  }
  /* "Transacties" staat er niet bij: de gekleurde kop draagt de speltak en het
     saldo, en het scherm is het transactiescherm van die speltak (artboard 1d
     heeft geen schermnaam in de kop). */
  .hoofd:has(.speltakkop) .kopbalk-scherm { display: none; }
  /* De speltakbadge ís de speltakchip uit het design: doorschijnend wit op de
     navigatiekleur. */
  .hoofd:has(.speltakkop) .speltakbadge {
    background: var(--navvlak);
    color: var(--navink);
  }
  /* En de seizoenchip staat op dezelfde ondergrond. Hij blijft de echte kiezer
     met zijn paneel; alleen zijn kleur volgt de kop. */
  .hoofd:has(.speltakkop) .seizoenkiezer > summary {
    background: var(--navvlak);
    border-color: transparent;
    color: var(--navink);
  }
  /* Het lijstzoekveld kleurde hier mee met de kop; sinds US-230 staat het niet
     meer in de kopbalk maar boven de lijst, op de gewone ondergrond (ADR-0160). */

  /* Het gekleurde saldoblok, van rand tot rand tegen de kopbalk aan. Dezelfde
     techniek als .startkop van US-135. */
  .speltakkop {
    margin: calc(var(--sp-9) * -1) calc(var(--sp-7) * -1) var(--sp-7);
    padding: var(--sp-2) var(--sp-8) var(--sp-9);
    background: var(--nav);
    color: var(--navink);
    display: grid;
    grid-template-columns: auto auto;
    justify-content: start;
    gap: var(--sp-1) var(--sp-8);
  }
  /* Geen kaarten meer: gewone regels op de gekleurde ondergrond. */
  .speltakkop .saldopaneel {
    background: none;
    border: 0;
    border-radius: 0;
    box-shadow: none;
    padding: 0;
  }
  .speltakkop .saldopaneel .label { color: var(--navink2); font-size: 13px; margin: 0; }
  .speltakkop .saldopaneel .waarde { color: var(--navink); margin: 0; }
  .speltakkop .saldopaneel .bijschrift { color: var(--navink2); }

  /* Het totaalsaldo bovenaan, over de volle breedte, 34px/600. */
  .speltakkop .saldopaneel.totaal {
    grid-column: 1 / -1;
    order: -1;
    margin-bottom: var(--sp-2);
  }
  .speltakkop .saldopaneel.totaal .label { color: var(--navink2); font-weight: 400; }
  .speltakkop .saldopaneel.totaal .waarde {
    font-size: 34px;
    font-weight: 600;
    letter-spacing: -.02em;
  }

  /* Bank en kas eronder, naast elkaar: label en bedrag op één regel. */
  .speltakkop .saldopaneel:not(.totaal) { display: flex; align-items: baseline; gap: var(--sp-2); }
  .speltakkop .saldopaneel:not(.totaal) .waarde { font-size: 13px; font-weight: 600; }
  /* De openstaande declaraties horen niet bij de potjes en kregen hier eigen
     regel onder bank en kas. Sinds US-154 (V-065, AC-154.2) verdwijnt die regel
     juist uit de gekleurde kop — het cijfer staat al in de takenkaart eronder —
     dus deze regel wordt in het US-154-blok achteraan dit bestand overschreven
     met display: none. De grid-column/margin-top hieronder blijven staan zodat
     de regel zichzelf nog steeds beschrijft áls hij ooit terugkomt. */
  .speltakkop .saldopaneel.declaraties { grid-column: 1 / -1; margin-top: var(--sp-2); }

  /* De acties liggen op een telefoon op hun eigen regel (R-042, §4). Het
     zoekveld vult die regel en mag krimpen; zonder min-width:0 duwt het
     invoerveld zijn eigen minimumbreedte door en loopt de rij over. */
  .kopzoek { flex: 1 1 auto; min-width: 0; }

  /* En de seizoenchip breekt niet af: op 390px stond hij over vier regels
     ("S / 2025- / 2026 · / open") en was hij deels onleesbaar (R-042). */
  .seizoenkiezer > summary { white-space: nowrap; }

  /* Compacter op een klein scherm, met het raakvlak onverkort op 44px. */
  .transactiekaart .transactie { gap: var(--sp-5); padding: 12px var(--sp-6); }
  .transactiekaart .dag-kop { padding: 8px var(--sp-6); }
  .tegels-vastleggen { grid-template-columns: 1fr; }
}

/* =====================================================================
   US-130 — Boekingspanelen volgens design
   (README §7 Invoerpaneel, FLOWS §6/§7/§8, functioneel ontwerp 8.2/9.1/10.1)

   Alles hieronder is opmaak. Geen enkele regel hier dwingt iets af: de
   verplichte bijlage, de boekingsreden onder de gekozen categorie, de
   betaalwijze en het kassaldo worden server-side beoordeeld (regel 9,
   E-6.11). Uitsluitend tokens uit §2, mobiel-eerst.
   ===================================================================== */

/* --- Het bijlage-dropvlak (AC-130.2, AC-4.6, AC-8.1) ------------------
   "Bon fotograferen of hier slepen": een gestippeld vlak met camerasymbool
   dat als eerste in het paneel staat. Het echte <input type="file"> ligt
   erin en blijft zonder JavaScript gewoon zichtbaar en indienbaar
   (ADR-0037); wwwroot/js/bijlage-dropvlak.js voegt slepen, het voorbeeld
   en de verwijderknop toe. */
.bondropvlak {
  display: grid;
  justify-items: center;
  gap: var(--sp-3);
  padding: var(--sp-9) var(--sp-7);
  border: 2px dashed var(--line2);
  border-radius: var(--radius);
  background: var(--surf2);
  text-align: center;
}
.bondropvlak.sleepover { border-color: var(--brand); background: var(--brandsoft); }
.bondropvlak-icoon { color: var(--brandtext); }
.bondropvlak-titel { margin: 0; font-weight: 600; font-size: var(--fs-body); color: var(--ink); }
.bondropvlak-regels { margin: 0; font-size: var(--fs-meta); color: var(--ink2); }
.bondropvlak input[type="file"] { max-width: 100%; }

/* Het voorbeeld na het kiezen van een bestand: miniatuur (of het woord PDF),
   de bestandsnaam en een verwijderknop. Dezelfde opmaak dient voor de al
   vastgelegde bijlage op het bewerkscherm. */
.bonvoorbeeld {
  display: flex;
  align-items: center;
  gap: var(--sp-5);
  padding: var(--sp-5);
  border: 1px solid var(--line);
  border-radius: var(--radius-knop);
  background: var(--surf);
  text-align: left;
}
.bonvoorbeeld-beeld {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  border-radius: var(--sp-3);
  border: 1px solid var(--line);
  background: var(--surf3);
  color: var(--ink2);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  overflow: hidden;
}
.bonvoorbeeld-beeld img { width: 100%; height: 100%; object-fit: cover; }
.bonvoorbeeld-tekst { flex: 1 1 auto; min-width: 0; display: grid; gap: 2px; }
.bonvoorbeeld-naam { font-weight: 600; font-size: var(--fs-secundair); overflow-wrap: anywhere; }
.bonvoorbeeld-meta { margin: 0; font-size: var(--fs-meta); color: var(--ink2); }
.bonvoorbeeld-verwijder {
  flex: none;
  min-height: 44px;
  min-width: 44px;
  border: 1px solid var(--dangerline);
  border-radius: var(--radius-knop);
  background: var(--dangersoft);
  color: var(--danger);
  font: inherit;
  font-size: var(--fs-secundair);
  font-weight: 600;
  cursor: pointer;
}

/* --- Segmented control Bank/Contant (AC-130.5, AC-8.6, AC-9.3) --------
   Twee echte radio's; de radio ligt onzichtbaar over zijn helft, de <span>
   ernaast is de zichtbare knop. Zonder CSS blijft het een gewone
   radiogroep, en de server beslist hoe dan ook (AC-8.6). */
.segment {
  display: flex;
  gap: var(--sp-1);
  padding: var(--sp-1);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf3);
}
.segment .segmentknop {
  position: relative;
  flex: 1 1 0;
  margin: 0;
  font-weight: 600;
}
.segment .segmentknop input {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}
.segment .segmentknop span {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  border-radius: var(--sp-3);
  color: var(--ink2);
  font-size: var(--fs-secundair);
}
.segment .segmentknop input:checked + span {
  background: var(--surf);
  color: var(--brandtext);
  box-shadow: var(--shadow2);
}
.segment .segmentknop input:focus-visible + span { outline: 2px solid var(--focus); outline-offset: 2px; }

/* --- Het bank<->kas-blok van de kasboeking (AC-130.6, AC-10.3, AC-10.5) */
.bankkas {
  display: grid;
  gap: var(--sp-4);
  padding: var(--sp-7);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surf2);
}
.bankkas-titel { margin: 0; font-weight: 600; font-size: var(--fs-secundair); color: var(--ink); }
.bankkas-regel { display: flex; align-items: center; gap: var(--sp-5); font-size: var(--fs-body); }
.bankkas-potje {
  flex: none;
  min-width: 56px;
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: .11em;
  text-transform: uppercase;
  color: var(--ink2);
}
/* Kleur is nooit de enige drager (AC-4.13): de pijl staat naast het woord
   "omhoog" of "omlaag". */
.bankkas-pijl { font-size: 18px; font-weight: 600; line-height: 1; }
.bankkas-regel.omhoog .bankkas-pijl { color: var(--credit); }
.bankkas-regel.omlaag .bankkas-pijl { color: var(--ink); }
.bankkas-regeltekst { margin: 0; font-size: var(--fs-meta); color: var(--ink2); }

/* --- Voorstelmarkering (AC-130.8) ------------------------------------
   Opmaak zonder gedrag. De bonherkenning bestaat pas in fase 5b
   (US-090/US-091); tot die tijd zet niets deze klassen of dit attribuut,
   en verschijnt de balk "Velden hieronder zijn een voorstel uit de bon"
   met "Alles verwerpen" dus nergens. De haak voor US-091 is bewust
   tweeledig: de klasse .voorstel op een .veld, of data-voorstel="true" op
   het veld — meer is er in de opmaak niet nodig. */
.voorstelbalk {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-5);
  padding: var(--sp-5) var(--sp-7);
  border: 1px solid var(--infoline);
  border-radius: var(--radius-knop);
  background: var(--infosoft);
  color: var(--info);
  font-size: var(--fs-secundair);
  font-weight: 600;
}
.voorstelbalk button { min-height: 44px; }
.veld.voorstel input,
.veld.voorstel select,
.veld.voorstel textarea,
.veld[data-voorstel="true"] input,
.veld[data-voorstel="true"] select,
.veld[data-voorstel="true"] textarea {
  border: 1px dashed var(--infoline);
  background: var(--infosoft);
}

/* --- Het paneel zelf ------------------------------------------------- */
/* Het formulier vult het paneel: geen tweede kaart binnen de kaart, geen
   eigen maximumbreedte. */
.inschuifpaneel-inhoud .beheerform {
  max-width: none;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  box-shadow: none;
  gap: var(--sp-8);
}
/* De verwijderknop van 44px staat links in de voet, los van Annuleren en
   de primaire knop (AC-130.7). */
/* US-306: een voet die in de inhoud staat (in het formulier, of los erna met
   form="…") hoort net als de voet uit de layout onderaan het paneel en over de
   volle breedte. De negatieve marges heffen de binnenruimte van de inhoud op;
   margin-top: auto duwt hem naar beneden bij een kort formulier, sticky houdt
   hem in beeld bij een lang formulier. */
.inschuifpaneel-inhoud .inschuifpaneel-voet {
  margin: auto calc(-1 * var(--sp-10)) calc(-1 * var(--sp-10));
  position: sticky;
  bottom: calc(-1 * var(--sp-10));
  z-index: 1;
}
.inschuifpaneel-inhoud > form:has(> .inschuifpaneel-voet) {
  flex: 1 0 auto;
  display: flex;
  flex-direction: column;
}
.inschuifpaneel-voet .verwijderknop { margin-right: auto; }
.inschuifpaneel-voet form { margin: 0; }
.inschuifpaneel-voet .knoppen { margin: 0; }
.paneelmelding { margin: 0; }

/* --- De categoriewissel zonder JavaScript (AC-130.3) ------------------
   Staat in een <noscript> en is dus alleen zichtbaar voor wie geen
   JavaScript heeft; dan is het een rijtje gewone links. */
.categoriewissel { display: grid; gap: var(--sp-3); }
.categoriewissel .knoppen { margin: 0; }
.categoriewissel a[aria-current="true"] {
  background: var(--brandsoft);
  border-color: var(--brandline);
}

/* --- Mobiel: velden 48px, knoppen 50px (AC-130.13, README §Mobiele schermen) */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .inschuifpaneel-inhoud input[type="text"],
  .inschuifpaneel-inhoud input[type="date"],
  .inschuifpaneel-inhoud input[type="file"],
  .inschuifpaneel-inhoud input:not([type]),
  .inschuifpaneel-inhoud select,
  .inschuifpaneel-inhoud textarea { min-height: 48px; }
  .inschuifpaneel-inhoud .euroveld .euroteken { min-height: 48px; }
  .inschuifpaneel-inhoud .segment .segmentknop span { min-height: 48px; }
  .inschuifpaneel-voet { flex-wrap: wrap; }
  .inschuifpaneel-voet .knop { min-height: 50px; }

  /* Op een paneelpagina neemt de paneelkop de plaats in van de witte kopbalk:
     die toont dezelfde speltakbadge en dezelfde titel, dus stonden ze op een
     telefoon twee keer boven elkaar ("SpeltakA · Declaratie indienen").
     Bevinding R-021 uit de designreview van 2026-09-09. De paneelkop blijft,
     want daar zit ook de sluitknop terug naar het onderliggende scherm; de
     kopbalk heeft op een paneelpagina geen eigen acties. Dezelfde techniek als
     het startscherm (US-135): browsers zonder :has() tonen ze allebei — dat is
     lelijker, niet stuk. */
  .hoofd:has(.paneelscherm) .kopbalk { display: none; }
}

/* =====================================================================
   US-133 — Seizoensproces en kascontrole
   (docs/design/README.md §15, FLOWS §10 en §11, functioneel ontwerp 17)

   Alleen opmaak. Geen regel hier dwingt iets af: wie mag goedkeuren,
   terugsturen of terugdraaien wordt server-side beoordeeld (regel 9,
   AC-27.4), en de verplichte toelichting bij terugsturen valt in de
   POST-handler (ADR-0072, E-6.11). Uitsluitend tokens uit §2,
   mobiel-eerst: alles hieronder geldt vanaf 360px, de tweekolomsindeling
   en de breedte van het wachtrijpaneel staan onderin in het
   min-width-blok (AC-4.9, AC-133.11).
   ===================================================================== */

/* -- De speltak- en seizoenkiezer in de kop (AC-133.3) ----------------
   Een gewone <details>, net als de seizoenchip van US-122: zonder
   JavaScript klapt de wachtrij gewoon open (ADR-0037). */
.wachtrijkiezer { position: relative; }
.wachtrijkiezer > summary {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  min-height: 44px;
  padding: 0 var(--sp-5);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf2);
  color: var(--ink);
  font-size: var(--fs-secundair);
  font-weight: 600;
  cursor: pointer;
  list-style: none;
}
.wachtrijkiezer > summary::-webkit-details-marker { display: none; }
.wachtrijkiezer[open] > summary {
  border-color: var(--brand);
  background: var(--brandsoft);
  color: var(--brandtext);
}
.wachtrijkiezer[open] > summary .wachtrijchip-chevron { transform: rotate(180deg); }

.wachtrijpaneel {
  margin-top: var(--sp-1);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  overflow: hidden;
}
.wachtrijpaneel-kop {
  margin: 0;
  padding: var(--sp-5) var(--sp-7);
  border-bottom: 1px solid var(--line);
  font-size: var(--fs-secundair);
  font-weight: 600;
  color: var(--ink2);
}
.wachtrijleeg { margin: 0; padding: var(--sp-5) var(--sp-7); font-size: var(--fs-meta); color: var(--ink2); }
.wachtrijlijst { list-style: none; margin: 0; padding: 0; }
.wachtrijlijst > li { border-bottom: 1px solid var(--line); }
.wachtrijlijst > li:last-child { border-bottom: 0; }
.wachtrijlijst > li.gekozen { background: var(--brandsoft); }

.wachtrijregel {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-5);
  min-height: 44px;
  padding: var(--sp-5) var(--sp-7);
  color: inherit;
  text-decoration: none;
}
a.wachtrijregel:hover { filter: brightness(.97); text-decoration: none; }
/* Niet te openen: geen link, geen knop, en zichtbaar rustiger (AC-133.3). */
.wachtrijregel.niettekiezen { color: var(--ink2); cursor: default; }
.wachtrijvink { flex: none; width: 16px; color: var(--brandtext); font-weight: 700; }
.wachtrijtekst { flex: 1; min-width: 0; display: grid; gap: 2px; }
.wachtrijnaam { font-size: var(--fs-body); font-weight: 600; color: var(--ink); }
.wachtrijmeta { font-size: var(--fs-meta); color: var(--ink3); font-variant-numeric: tabular-nums; }
.wachtrijmelding { font-size: var(--fs-meta); color: var(--warn); }
.wachtrijregel .status { flex: none; }

/* Het aantal seizoenen dat op controle wacht, rechts in de kopbalk. */
.wachtrijteller { font-size: var(--fs-secundair); color: var(--ink3); }

/* De indieningsdatum als chip naast de kiezer (README §15). */
.ingediendchip {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  min-height: 26px;
  padding: 0 var(--sp-4);
  border: 1px solid var(--warnline);
  border-radius: 7px;
  background: var(--warnsoft);
  color: var(--warn);
  font-size: var(--fs-meta);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}
.ingediendchip-stip { width: 6px; height: 6px; border-radius: var(--radius-pil); background: currentColor; }

/* -- Het werkblad: bladeraar links, controlepunten rechts -------------
   Mobiel stapelt het onder elkaar, met de bladeraar full-width
   (AC-133.11); de tweekolomsindeling staat onderin. */
.kascontrolewerkblad {
  display: grid;
  gap: var(--sp-10);
  align-items: start;
  margin-bottom: var(--sp-10);
}
.kascontrolezijkolom { display: grid; gap: var(--sp-7); align-content: start; }

/* -- De bijlagenbladeraar (AC-133.4) ---------------------------------
   "Bon 7 van 64" met pijlen vooruit en terug. De pijlen zijn gewone
   links met ?bon=n; aan de grens staat er een uitgeschakelde vorm in
   plaats van een link, zodat er niets te klikken valt (ADR-0037). */
.bonteller { font-size: var(--fs-secundair); color: var(--ink3); font-variant-numeric: tabular-nums; }
.bonleeg { margin: 0; padding: var(--sp-9) var(--sp-7); font-size: var(--fs-meta); color: var(--ink2); }
.bonvenster {
  /* US-319: een raster met vaste kolommen. Het kader van de bon heeft een
     vaste hoogte, dus de pijlen, de teller en de boekinggegevens staan bij
     elke bon op dezelfde plek, hoe groot of hoe gedraaid de bon ook is. Op
     een telefoon staan de pijlen onder het kader, zodat de bon de volle
     breedte krijgt. */
  display: grid;
  grid-template-columns: 44px 44px;
  grid-template-areas: "kader kader" "vorige volgende";
  justify-content: space-between;
  align-items: center;
  gap: var(--sp-5) var(--sp-7);
  padding: var(--sp-7) var(--sp-7) var(--sp-4);
}
.bonpijl { flex: none; }
.bonpijl.vorige { grid-area: vorige; }
.bonpijl.volgende { grid-area: volgende; }
.bonknop {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border: 1px solid var(--line2);
  border-radius: var(--radius-pil);
  background: var(--surf);
  color: var(--ink2);
}
a.bonknop:hover { filter: brightness(.97); text-decoration: none; }
a.bonknop:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.bonknop.uit { opacity: .35; cursor: not-allowed; }

/* Het vaste kader (US-319). Daarin staat de gedeelde bonweergave van de
   bekijkpagina (_Bonweergave, US-277/US-307); die vult het kader, en de bon
   schaalt erin met behoud van verhouding (object-fit: contain). */
.bonkader {
  grid-area: kader;
  position: relative;
  min-width: 0;
  height: min(60vh, 460px);
  min-height: 240px;
}
.bonkader .bonbekijker-beeld,
.bonkader .bonbekijker-beeld.zoombaar,
.bonkader .bonbekijker-pdf {
  box-sizing: border-box;
  width: 100%;
  height: 100%;
  min-height: 0;
}
.bonkader .bonbekijker-beeld { align-items: center; }
.bonkader .bonbekijker-beeld.bonbekijker-pdfbeeld.zoombaar { align-items: flex-start; }
.bonkader .bonbekijker-beeld img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
}
.bonkader .bonbekijker-pdf { justify-content: center; align-items: center; text-align: center; }

/* Onder het kader: de bestandsnaam op één regel en de link naar groot bekijken. */
.bonbijschrift {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  margin: 0;
  padding: 0 var(--sp-7) var(--sp-6);
  font-size: var(--fs-meta);
}
.bonbestandsnaam {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-family: var(--font-mono);
  font-weight: 500;
  color: var(--ink3);
}
.bonbijschrift a { flex: none; display: inline-flex; align-items: center; min-height: 44px; }
.bonhint { font-size: var(--fs-meta); color: var(--ink3); }
/* De transactietabel van de kascontrole (US-319): een bedrag breekt niet over twee regels. */
.kascontroletransacties td.getal { white-space: nowrap; }
/* De kerncijfers (US-319, gezien bij de schermcontrole): de tabel loopt tot de rand van
   de kaart, maar trekt de alinea's eronder niet meer over de laatste rij heen. */
.kerncijferspaneel > .overflow-x { margin-bottom: var(--sp-6); }

/* De gegevens van de boeking onder de bon: een bon zonder bedrag en
   omschrijving zegt niets (README §15). */
.bongegevens {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--sp-5);
  margin: 0;
  padding: 0 var(--sp-7) var(--sp-7);
}
.bongegevens-breed { grid-column: 1 / -1; }
.bongegevens-breed dd { overflow-wrap: anywhere; }
.bongegevens dt { font-size: var(--fs-meta); color: var(--ink3); margin-bottom: 3px; }
.bongegevens dd { margin: 0; font-size: var(--fs-secundair); color: var(--ink); }
.bongegevens dd.getal { font-variant-numeric: tabular-nums; font-weight: 600; }
.bongegevens dd.mono { font-family: var(--font-mono); font-weight: 500; }

/* -- De controlepunten (AC-133.5) ------------------------------------
   Elk punt draagt naast de kleur een teken én het woord bij de stand
   (AC-4.13); de kleur is nooit het enige signaal. */
.controlepuntenlijst { list-style: none; margin: 0; padding: var(--sp-8); display: grid; gap: var(--sp-6); }
.controlepuntenlijst > li { display: flex; align-items: flex-start; gap: var(--sp-4); }
.controlepuntteken {
  flex: none;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  margin-top: 2px;
  border-radius: var(--radius-pil);
  border: 1px solid var(--line2);
  font-size: var(--fs-meta);
  font-weight: 700;
}
.controlepuntteken.goed { background: var(--brandsoft); border-color: var(--brandline); color: var(--brandtext); }
.controlepuntteken.attentie { background: var(--warnsoft); border-color: var(--warnline); color: var(--warn); }
.controlepuntteken.onbekend { background: var(--surf3); border-color: var(--line2); color: var(--ink2); }
.controlepunttekst { display: grid; gap: 2px; min-width: 0; }
.controlepuntnaam { font-size: var(--fs-secundair); font-weight: 600; color: var(--ink); }
.controlepuntstand { font-size: var(--fs-micro); font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--ink2); }
.controlepuntuitleg { font-size: var(--fs-meta); color: var(--ink2); }

/* -- De uitkomst (AC-133.6, AC-133.7) --------------------------------- */
.uitkomstuitleg { margin: 0; padding: var(--sp-8) var(--sp-8) 0; font-size: var(--fs-meta); color: var(--ink2); }
.uitkomstknoppen { display: grid; gap: var(--sp-3); padding: var(--sp-6) var(--sp-8) var(--sp-8); }
.uitkomstknoppen .knop { justify-content: center; }
.uitkomstkaart .beheerform { margin: 0; padding: var(--sp-8); border: 0; background: none; box-shadow: none; max-width: none; }
.uitkomstkaart .melding { margin: var(--sp-8) var(--sp-8) 0; }
.verplicht { color: var(--danger); font-weight: 600; }

/* -- De bevestigingspagina van het indienen (AC-133.1) ---------------- */
.paneeluitleg { margin: 0 0 var(--sp-7); font-size: var(--fs-meta); color: var(--ink2); }

/* -- Seizoensstatus onder Instellingen (AC-133.10) -------------------- */
.statusuitleg p { margin: 0 0 var(--sp-5); font-size: var(--fs-secundair); color: var(--ink2); }
.statusuitleg p:last-child { margin-bottom: 0; }

@media (min-width: 900px) and (min-height: 501px), (min-width: 900px) and (pointer: fine), (min-width: 900px) and (pointer: none) {
  /* Links de bladeraar, rechts de controlepunten en de uitkomst
     (README §15: minmax(0,1fr) naast 360px). */
  .kascontrolewerkblad { grid-template-columns: minmax(0, 1fr) 360px; }
  .bongegevens { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  /* US-319: op een breed scherm staan de pijlen naast het vaste kader. */
  .bonvenster {
    grid-template-columns: 44px minmax(0, 1fr) 44px;
    grid-template-areas: "vorige kader volgende";
    justify-content: stretch;
  }
  .bonkader { height: min(70vh, 640px); }
}

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  /* Het wachtrijpaneel hangt onder de chip in de kopbalk en is 420px
     breed (README §15). Op een telefoon vult het de breedte. */
  .wachtrijpaneel { position: absolute; top: 42px; left: 0; z-index: 30; width: 420px; }
}

/* =====================================================================
   US-132 — Rapportage, jaarrekening en financiële tools
   (docs/design/README.md §11, §12, §16 en §17)

   Alles hieronder is opmaak. De kolommen van de mutatierapportage, de
   paragrafen van de jaarrekening, de verplichte reden bij een bewijsexport
   en elk recht worden server-side bepaald (regel 9, E-6.11); geen enkele
   regel hier dwingt iets af of verbergt iets als beveiliging.

   Eén uitzondering op de tokenregel, en die is bewust: het blok
   `.jaarrekening` definieert een eigen, VASTE set --jr-*-tokens. De
   jaarrekening is geen scherm maar een document dat naar het bestuur en de
   kascontrole gaat en op papier gedrukt wordt; het is daarom altijd licht,
   ook wanneer de gebruiker het donkere thema koos (AC-25.20, AC-132.4).
   Die tokens worden nergens in een themablok overschreven — dat is precies
   wat ze vast maakt — en staan daarom hier en niet in §2. Zie ADR-0090.
   ===================================================================== */

/* ---------------------------------------------------------------------
   1. Mutatierapportage (README §11, AC-132.1 t/m AC-132.3)
   --------------------------------------------------------------------- */

/* De brede tabel: twaalf kolommen die op geen enkel scherm in één keer
   passen. Zij schuift horizontaal binnen .overflow-x van de tabelcomponent;
   de pagina zelf schuift niet mee. De minimumbreedte van 1180px uit het
   design staat in het desktopblok onderaan dit bestand: op een telefoon zou
   zij de pagina laten overlopen (AC-4.9). */
.mutatiegrid { font-size: var(--fs-secundair); }
.mutatiegrid th, .mutatiegrid td { white-space: nowrap; }
/* Alleen de twee vrije-tekstkolommen mogen afbreken; de rest is kort. */
.mutatiegrid td.rapportagenaam, .mutatiegrid td.omschrijving { white-space: normal; min-width: 0; }
.mutatiegrid td.volgnr {
  font-family: var(--font-mono);
  font-weight: 500;
  color: var(--brandtext);
}
.mutatiegrid td.code { font-family: var(--font-mono); font-size: var(--fs-meta); }

/* De seizoensaanduiding naast de schermnaam in de kopbalk (README §11).
   Een aanduiding, geen kiezer: het seizoen komt uit de navigatiecontext
   (AC-14.7). */
.kopcontext-seizoen { font-size: var(--fs-secundair); color: var(--ink3); }

/* De uitleg onder de tabel: waarom er niets te filteren valt en wat de
   totaalregel betekent. */
.rapportageuitleg {
  margin: 0 0 var(--sp-7);
  max-width: 72ch;
  font-size: var(--fs-secundair);
  color: var(--ink2);
}

/* ---------------------------------------------------------------------
   2. Jaarrekening (README §12, AC-132.4 t/m AC-132.9)
   --------------------------------------------------------------------- */

/* Het bureaublad waarop de pagina's liggen. Grijs (--surf3 uit het lichte
   thema) zodat het witte papier eraf steekt; ook dat blijft in het donkere
   thema staan, want het document is één geheel. */
.jaarrekening {
  /* -- de vaste documenttokens; nooit overschreven in een themablok -- */
  --jr-papier: #ffffff;
  --jr-bureau: #eef1ee;
  --jr-vlak: #f8faf8;
  --jr-ink: #131a15;
  --jr-ink2: #5a6a5f;
  --jr-ink3: #667069;
  --jr-line: #e2e6e1;
  --jr-line2: #d3dad4;
  --jr-brand: #005a2d;
  --jr-brandsoft: #e4efe8;
  --jr-brandline: #c7ddd0;
  --jr-credit: #00713a;
  --jr-warn: #8a5300;
  --jr-warnsoft: #fdf3e3;
  --jr-danger: #a4232b;

  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--sp-12);
  padding: var(--sp-12) 0;
  margin: var(--sp-7) 0 0;
  background: var(--jr-bureau);
  color: var(--jr-ink);
}

/* Eén A4-pagina. Mobiel-eerst: hier past hij zich aan het scherm aan; de
   vaste 794px van het design staat in het desktopblok (AC-132.14). */
.jaarrekening-pagina {
  width: 100%;
  max-width: 100%;
  background: var(--jr-papier);
  color: var(--jr-ink);
  padding: var(--sp-11) var(--sp-9);
  box-shadow: 0 4px 24px -8px rgba(0, 0, 0, .25);
  border-radius: 2px;
}
/* Binnen het document is elke kleur een documenttoken; niets erft van het
   thema, ook links en koppen niet. */
.jaarrekening-pagina h2,
.jaarrekening-pagina h3 { color: var(--jr-brand); }
.jaarrekening-pagina a { color: var(--jr-brand); }

/* --- De kop van pagina 1 (AC-132.5) --- */
.jaarrekening-kop {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--sp-6);
  padding-bottom: var(--sp-9);
  border-bottom: 3px solid var(--jr-brand);
}
.jaarrekening-identiteit { display: flex; align-items: flex-start; gap: var(--sp-6); }
/* Het speltaklogo. Ontbreekt het, dan komt het initialenvlak eruit
   (AC-132.5, V-037 punt 11): hetzelfde vierkant als in de zijbalk. */
.jaarrekening-logo,
.jaarrekening-initialen {
  flex: none;
  width: 46px;
  height: 46px;
  border-radius: var(--sp-3);
  object-fit: contain;
}
.jaarrekening-initialen {
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--jr-brand);
  color: var(--jr-papier);
  font-weight: 600;
  font-size: 17px;
  letter-spacing: .02em;
}
.jaarrekening-groep {
  margin: 0;
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--jr-ink2);
}
.jaarrekening-titel {
  margin: var(--sp-3) 0 0;
  font-size: 24px;
  font-weight: 600;
  letter-spacing: -.015em;
  color: var(--jr-brand);
}
.jaarrekening-periode {
  margin: var(--sp-2) 0 0;
  font-size: var(--fs-secundair);
  color: var(--jr-ink2);
}

/* Het stempel (AC-132.6). Concept staat scheefgedraaid in --jr-warn,
   definitief rechtop in de huisstijlkleur. In beide gevallen draagt het
   stempel het woord zelf, dus is de kleur nooit de enige drager
   (AC-4.13). */
.jaarrekening-stempel {
  flex: none;
  align-self: flex-start;
  border: 2px solid var(--jr-warn);
  color: var(--jr-warn);
  background: var(--jr-warnsoft);
  border-radius: 6px;
  padding: var(--sp-2) var(--sp-5);
  font-size: var(--fs-secundair);
  font-weight: 600;
  letter-spacing: .04em;
  /* R-030 (designreview 2026-09-09): duidelijker scheef, zoals het design het
     tekent; de PDF draait met dezelfde hoek (Jaarrekeningpdf.Stempelhoek). */
  transform: rotate(-8deg);
}
.jaarrekening-stempel.definitief {
  border-color: var(--jr-brand);
  color: var(--jr-brand);
  background: var(--jr-brandsoft);
  transform: none;
}

/* --- Paragraafkoppen: kleine kapitalen, zoals in het design --- */
.jaarrekening-paragraaf { margin-top: var(--sp-11); }
.jaarrekening-paragraaf > h2,
.jaarrekening-paragraaf > h3 {
  margin: 0 0 var(--sp-4);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--jr-ink3);
}

/* --- Kerncijfers als vier vlakken, met het eindsaldo geaccentueerd --- */
.jaarrekening-kerncijfers {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: var(--sp-6);
  margin: 0;
}
.jaarrekening-kerncijfers > div {
  border: 1px solid var(--jr-line);
  border-radius: var(--sp-3);
  padding: var(--sp-5);
}
.jaarrekening-kerncijfers dt {
  margin: 0 0 var(--sp-1);
  font-size: var(--fs-meta);
  color: var(--jr-ink2);
}
.jaarrekening-kerncijfers dd {
  margin: 0;
  font-size: 17px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}
.jaarrekening-kerncijfers .eindsaldo {
  border-color: var(--jr-brandline);
  background: var(--jr-brandsoft);
}
.jaarrekening-kerncijfers .eindsaldo dt,
.jaarrekening-kerncijfers .eindsaldo dd { color: var(--jr-brand); font-weight: 600; }

/* De controleregel begin + in − uit = eind (AC-132.8). */
.jaarrekening-aansluiting {
  margin: var(--sp-6) 0 0;
  padding: var(--sp-5) var(--sp-6);
  border: 1px solid var(--jr-line);
  border-radius: var(--sp-3);
  background: var(--jr-vlak);
  font-size: var(--fs-secundair);
  font-variant-numeric: tabular-nums;
}
.jaarrekening-aansluiting .rekenregel { font-weight: 600; }
.jaarrekening-aansluiting .splitsing { color: var(--jr-ink2); }

/* --- De tabellen in het document --- */
.jaarrekeningtabel {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--fs-secundair);
}
.jaarrekeningtabel th, .jaarrekeningtabel td {
  padding: 7px 0;
  border-bottom: 1px solid var(--jr-line);
  text-align: left;
  font-weight: 400;
}
.jaarrekeningtabel thead th {
  font-size: var(--fs-meta);
  color: var(--jr-ink2);
  font-weight: 600;
}
.jaarrekeningtabel .getal { text-align: right; font-variant-numeric: tabular-nums; }
.jaarrekeningtabel tfoot th, .jaarrekeningtabel tfoot td {
  padding: 9px 0;
  border-top: 2px solid var(--jr-ink);
  border-bottom: 0;
  font-weight: 600;
}
.jaarrekeningtabel .code {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--jr-ink2);
}
.jaarrekeningtabel .aandeel { color: var(--jr-ink2); }
.jaarrekeningtabel .categorie th { font-weight: 600; color: var(--jr-brand); border-bottom: 0; }
.jaarrekeningtabel .reden td:first-child { padding-left: var(--sp-7); color: var(--jr-ink2); }
/* Een nadelig verschil draagt het minteken in het getal zelf; de kleur komt
   er alleen bij (AC-25.13, AC-4.13). */
.jaarrekeningtabel .nadelig { color: var(--jr-danger); }
.jaarrekeningtabel .voordelig { color: var(--jr-credit); }

/* --- Declaratiestatistiek en verantwoording naast elkaar --- */
.jaarrekening-tweeluik {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: var(--sp-10);
}
.jaarrekening-feiten { margin: 0; font-size: var(--fs-secundair); line-height: 1.7; }
.jaarrekening-feiten dt { color: var(--jr-ink2); }
.jaarrekening-feiten dd { margin: 0 0 var(--sp-3); font-variant-numeric: tabular-nums; }
.jaarrekening-toelichting {
  margin: var(--sp-4) 0 0;
  font-size: var(--fs-meta);
  color: var(--jr-ink2);
  line-height: 1.55;
}

/* --- Paragraaf 8, Ondertekening: twee kolommen om onder te tekenen (US-166,
   AC-25.21). Elke kolom is een .jaarrekening-ondertekeningblok en kan meer dan
   één handtekeningregel bevatten (AC-166.4, meerdere groepspenningmeesters). --- */
.jaarrekening-ondertekening {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: var(--sp-11);
  margin-top: var(--sp-6);
}
.jaarrekening-handtekening { border-top: 1px solid var(--jr-ink); padding-top: var(--sp-3); margin-top: 56px; }
.jaarrekening-handtekening .naam { font-size: var(--fs-secundair); font-weight: 600; min-height: 1.2em; }
.jaarrekening-handtekening .rol { font-size: var(--fs-meta); color: var(--jr-ink2); margin-top: 2px; }
/* Een tweede (of derde) handtekeningregel in hetzelfde blok krijgt evenveel
   ruimte om te tekenen als de eerste (AC-166.4). */
.jaarrekening-ondertekeningblok .jaarrekening-handtekening + .jaarrekening-handtekening { margin-top: 56px; }
.jaarrekening-meer { font-size: var(--fs-meta); color: var(--jr-ink2); margin: var(--sp-3) 0 0; }

/* --- De voettekst van elke pagina (AC-132.9) --- */
.jaarrekening-voet {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: var(--sp-3);
  margin-top: var(--sp-12);
  padding-top: var(--sp-6);
  border-top: 1px solid var(--jr-line);
  font-size: var(--fs-micro);
  color: var(--jr-ink3);
}

/* De kop van pagina 2: dezelfde identificatie, kleiner. */
.jaarrekening-vervolgkop {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--sp-4);
  padding-bottom: var(--sp-7);
  border-bottom: 1px solid var(--jr-line);
}
.jaarrekening-vervolgkop .titel { font-size: 15px; font-weight: 600; color: var(--jr-brand); }
.jaarrekening-vervolgkop .bijlage {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  color: var(--jr-ink3);
}

/* ---------------------------------------------------------------------
   3. Financiële tools: factcheck, bewijsexport en archiefset
   (README §16 en §17, AC-132.10 t/m AC-132.12)
   --------------------------------------------------------------------- */

/* Twee kolommen: het formulier links, de eerdere verzoeken rechts. Mobiel
   staan ze onder elkaar; het desktopblok zet de linkerkolom op 400px. */
.toolindeling {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--sp-11);
  align-items: start;
}
.toolkaart {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-9);
}
.toolkaart > h2 { margin: 0 0 var(--sp-7); font-size: var(--fs-kaartkop); }
.toolkaart .beheerform {
  max-width: none;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  box-shadow: none;
}
.toolkaart .knoppen { margin: var(--sp-7) 0 0; }
.toolkaart .knoppen .knop { width: 100%; justify-content: center; }
.toolvoetnoot {
  margin: var(--sp-6) 0 0;
  font-size: var(--fs-meta);
  color: var(--ink3);
  line-height: 1.5;
}
.toolsubkop { margin: var(--sp-9) 0 var(--sp-4); font-size: var(--fs-kaartkop); }
.toolkolom > h2 { margin: 0 0 var(--sp-5); font-size: var(--fs-kaartkop); }

/* De eerdere verzoeken staan als lijst in één kaart, niet als brede tabel: de
   kolommen zijn kort en de reden is de kop van de regel (README §17). De
   tabelcomponent tekent ze via haar kaartweergave (ADR-0088), zodat zoeken,
   filteren, sorteren en de paginering gewoon blijven werken (AC-4.4). */
.toolkolom .kaartraster {
  grid-template-columns: minmax(0, 1fr);
  gap: 0;
  margin: 0;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  overflow: hidden;
}
.verzoekregel {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-6);
  padding: var(--sp-6) var(--sp-8);
  border-bottom: 1px solid var(--line);
}
.toolkolom .kaartraster > .verzoekregel:last-child { border-bottom: 0; }
.verzoekregel-tekst { flex: 1 1 220px; min-width: 0; display: grid; gap: 2px; }
.verzoekregel-titel { font-size: var(--fs-body); font-weight: 600; overflow-wrap: anywhere; }
.verzoekregel-meta { font-size: var(--fs-meta); color: var(--ink3); overflow-wrap: anywhere; }

/* Het verplichte veld draagt een sterretje naast het label; de eis zelf
   staat server-side (AC-19.3). */
.verplicht { color: var(--danger); }

/* --- Factcheck: de bon naast de gegevens (AC-132.10) --- */
.factcheck-zoek {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--sp-4);
  margin: 0 0 var(--sp-10);
}
.factcheck-zoek .veld { flex: 1 1 200px; margin: 0; }
.factcheck-zoek input {
  width: 100%;
  min-height: 44px;
  font-family: var(--font-mono);
  /* Geen eigen font-size meer (US-199, M-003): #nummer had hier altijd al zijn
     eigen 15px, onder de 16px die iOS Safari nodig heeft om niet in te zoomen,
     en verschilde van elk ander veld. Nu erft het de generieke veldregel
     (font: inherit) net als elk ander tekstveld: 14,5px op desktop, 16px onder
     601px. Alleen het lettertype (monospace, voor een volgnummer) blijft eigen. */
}
.factcheck-zoek .knop { min-height: 44px; }
.factcheck-uitslag {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--sp-10);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-10);
}
.factcheck-bon { display: grid; gap: var(--sp-4); justify-items: start; }
.factcheck-bon img {
  width: 100%;
  max-width: 100%;
  height: auto;
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf3);
}
.factcheck-geenbon {
  display: grid;
  place-items: center;
  width: 100%;
  min-height: 120px;
  padding: var(--sp-7);
  border: 1px dashed var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf2);
  color: var(--ink3);
  font-size: var(--fs-meta);
  text-align: center;
}
.factcheck-gegevens {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: var(--sp-6) var(--sp-9);
  margin: 0;
}
.factcheck-gegevens dt { font-size: var(--fs-meta); color: var(--ink3); margin-bottom: 3px; }
.factcheck-gegevens dd { margin: 0; font-size: var(--fs-body); }
.factcheck-gegevens dd.sterk { font-weight: 600; }

/* ---------------------------------------------------------------------
   4. Desktop: de maten uit het design die op een telefoon niet passen
   --------------------------------------------------------------------- */
@media (min-width: 900px) and (min-height: 501px), (min-width: 900px) and (pointer: fine), (min-width: 900px) and (pointer: none) {
  /* README §11: de rapportagetabel is minimaal 1180px breed en schuift
     binnen haar eigen wrapper. */
  .mutatiegrid { min-width: 1180px; }

  /* README §12: A4 op 794px met 56px boven/onder en 60px links/rechts. */
  .jaarrekening-pagina { width: 794px; padding: 56px 60px; }

  /* README §17: het formulier links op 400px, de verzoeken rechts. */
  .toolindeling { grid-template-columns: 400px minmax(0, 1fr); gap: var(--sp-11); }

  /* README §16: de bon van 150px breed naast de gegevens. */
  .factcheck-uitslag { grid-template-columns: 150px minmax(0, 1fr); gap: var(--sp-10); }
}

/* --- einde US-132 --- */

/* =====================================================================
   US-135 — Startscherm, taken, mobiel en delen
   (docs/design/README.md §2, §4 en §Mobiele schermen; FLOWS §2/§3/§18)

   Alles hieronder is opmaak. Geen enkele regel hier bepaalt wat iemand mag
   zien: welke kaarten er staan, of er saldi bij mogen en of er een takenpil
   is, wordt server-side beslist (regel 9, AC-6.1..6.7, AC-135.14).

   Mobiel eerst: de basisregels gelden op 360px, het blok
   @media (min-width: 601px) onderaan maakt er de desktopweergave van.
   Uitsluitend tokens uit §2, geen letterlijke kleuren (AC-4.11).
   ===================================================================== */

/* --- Startscherm: de kop (AC-135.1, AC-135.9) --------------------------
   Op een telefoon is dit de gekleurde kop uit het design: logo, avatar,
   begroeting en de regel met het aantal taken, van rand tot rand. Boven
   600px vervalt de kleur en blijven begroeting en regel over. Eén blok in
   de HTML, twee verschijningsvormen: een tweede, verborgen kopie zou een
   schermlezer alles dubbel laten voorlezen. */
.startkop {
  margin: calc(var(--sp-9) * -1) calc(var(--sp-7) * -1) var(--sp-7);
  padding: var(--sp-5) var(--sp-8) var(--sp-9);
  background: var(--nav);
  color: var(--navink);
}
.startkop-balk {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--sp-6);
}
.startkop-logo { height: 38px; width: auto; filter: brightness(0) invert(1); }
.startkop-avatar {
  width: 32px;
  height: 32px;
  flex: none;
  border-radius: var(--radius-pil);
  background: rgba(255, 255, 255, .18);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-meta);
  font-weight: 600;
}
.startgroet {
  margin: 0;
  font-size: 22px;
  font-weight: 600;
  letter-spacing: -.015em;
  color: inherit;
}
.startregel { margin: var(--sp-1) 0 0; font-size: var(--fs-secundair); color: var(--navink2); }

/* --- Startscherm: de kaart per speltak (AC-135.1..135.5) --------------- */
.speltakkaarten {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  gap: var(--sp-5);
}
.speltakkaart {
  display: grid;
  gap: var(--sp-6);
  grid-template-columns: 1fr auto;
  align-items: center;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--sp-7);
  box-shadow: var(--shadow2);
  color: inherit;
  text-decoration: none;
}
.speltakkaart:hover { text-decoration: none; filter: brightness(.97); }
/* AC-135.4: de groepsrekening draagt een rand in --brandline. */
.speltakkaart.groepsrekening { border-color: var(--brandline); }
.speltakkaart-kop {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-5);
  min-width: 0;
}
/* Het initialenvlak van 42px, of het speltaklogo als dat is ingesteld
   (FO 3.1, V-037 punt 11). */
.speltakkaart-vlak {
  width: 42px;
  height: 42px;
  flex: none;
  border-radius: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-body);
  font-weight: 600;
  background: var(--brandsoft);
  border: 1px solid var(--brandline);
  color: var(--brandtext);
}
.speltakkaart-vlak.logo { object-fit: cover; border-radius: 12px; }
/* AC-135.4: de groepsrekening krijgt een gevuld brandvlak als icoon. */
.speltakkaart.groepsrekening .speltakkaart-vlak {
  background: var(--brand);
  border-color: var(--brand);
  color: var(--brandink);
}
/* US-329 (Pascal 2026-10-21, schermafbeelding van het welkom-filmpje): de pillen "9 taken ·
   2 nieuw" en "16 mismatches met bunq" stonden over de naam en de rol heen en de tweede stak
   buiten de kaart. De kop wrapt nu: de naam houdt minstens 140px en neemt de rest van de regel;
   past er dan geen pil meer naast, dan schuiven de pillen naar een eigen regel onder het vlak
   en de naam. Een lange naam of rol breekt af binnen zijn kolom, een pil krimpt tot de
   kaartbreedte en breekt zelf af in plaats van eruit te steken. */
.speltakkaart-naam { flex: 1 1 140px; min-width: 0; display: flex; flex-direction: column; }
.speltakkaart-naam .naam { font-size: 16px; font-weight: 600; color: var(--ink); overflow-wrap: anywhere; }
.speltakkaart-naam .rol { font-size: var(--fs-meta); color: var(--ink3); overflow-wrap: anywhere; }
.speltakkaart .takenpil { flex: 0 1 auto; min-width: 0; max-width: 100%; padding-block: 2px; overflow-wrap: anywhere; }

.speltakkaart-cijfers { min-width: 0; display: flex; flex-wrap: wrap; gap: var(--sp-1); }
.speltakkaart-cijfers .regel { display: flex; gap: var(--sp-1); font-size: var(--fs-meta); color: var(--ink3); }
/* US-329: een bedrag breekt nooit tussen het euroteken en het getal (bij 1024px stond "€" boven "0,00"). */
.speltakkaart-cijfers .regel .bedrag { font-variant-numeric: tabular-nums; white-space: nowrap; }
.speltakkaart-cijfers .regel.totaal { color: var(--ink); }
.speltakkaart-cijfers .regel.totaal .label { color: var(--ink3); }

/* Mobiel: bank en kas worden samen één subregel (AC-135.9) met een
   scheidingsteken ertussen, en het totaal staat er groot onder. Deze regels
   golden tot 2026-09-09 ook op desktop, waar ze niets te zoeken hebben
   (bevinding R-007 uit de designreview): daar staan de drie regels onder
   elkaar met het bedrag rechts. */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .speltakkaart-cijfers { align-items: baseline; }
  .speltakkaart-cijfers .regel.eerste::after,
  .speltakkaart-cijfers .regel.tweede::after { content: "·"; margin-left: var(--sp-1); color: var(--ink3); }
  .speltakkaart-cijfers .regel.totaal {
    flex-basis: 100%;
    align-items: baseline;
    gap: var(--sp-3);
    font-size: 23px;
    font-weight: 600;
    letter-spacing: -.015em;
  }
  .speltakkaart-cijfers .regel.totaal .label { font-size: var(--fs-meta); font-weight: 400; }
}
.speltakkaart-chevron { flex: none; color: var(--ink3); }
.speltakkaart-note {
  grid-column: 1 / -1;
  font-size: var(--fs-meta);
  color: var(--ink3);
  line-height: 1.45;
}
/* De ledenvariant houdt zijn eigen ingang naar het declaratieformulier: dat
   is de enige handeling die een lid op dit scherm heeft (FO 2.1). Buiten de
   kaartlink, want een link in een link bestaat niet. */
.speltakkaart-actie { margin: var(--sp-2) 0 0; font-size: var(--fs-secundair); }

/* --- Taken (AC-135.6..135.8, README §4) ------------------------------- */
.takenkop { margin: 0 0 var(--sp-2); }
.takenuitleg { margin: 0 0 var(--sp-7); font-size: var(--fs-body); color: var(--ink2); }
.takenbediening { margin: 0 0 var(--sp-7); font-size: var(--fs-secundair); color: var(--ink2); }
.takenbereik { font-size: var(--fs-secundair); color: var(--ink3); }
/* De lijst zelf hergebruikt .taakregel/.taakknop van de kaart Taken op het
   speltakdashboard (US-122): twee weergaven van hetzelfde bakje horen er
   hetzelfde uit te zien (AC-12.1). */
.takenlijst { display: flex; flex-direction: column; }
.takenlijst .taakregel:last-child { border-bottom: 0; }
.taakmeta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-1) var(--sp-4);
  font-size: var(--fs-meta);
  color: var(--ink3);
}
/* AC-16.8/AC-135.6: ontbrekend bewijs kleurt de actie in --warn. Het
   waarschuwingsteken staat in de tekst zelf, dus de kleur is nooit het enige
   signaal (AC-4.13). */
.taakactie.warn { color: var(--warn); font-weight: 600; }
.taakbron .volgnr { font-size: var(--fs-micro); }

/* --- Delen vanuit een andere app (AC-135.11, README §Mobiele schermen) - */
.deelbon {
  display: flex;
  align-items: center;
  gap: var(--sp-5);
  border: 1px solid var(--line);
  border-radius: 12px;
  background: var(--surf);
  box-shadow: var(--shadow2);
  padding: var(--sp-5);
  margin: 0 0 var(--sp-9);
}
.deelbon-beeld {
  width: 52px;
  height: 66px;
  flex: none;
  border-radius: var(--sp-3);
  border: 1px solid var(--line2);
  background: var(--surf3);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  font-size: var(--fs-micro);
  font-weight: 600;
  color: var(--ink2);
  text-transform: uppercase;
}
.deelbon-beeld img { width: 100%; height: 100%; object-fit: cover; }
.deelbon-tekst { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-1); }
.deelbon-naam { font-size: var(--fs-body); font-weight: 600; word-break: break-word; }
.deelbon-meta { font-size: var(--fs-meta); color: var(--ink3); }

.deelvraag { margin: 0 0 var(--sp-3); font-size: var(--fs-sectie); }
.deeluitleg { margin: 0 0 var(--sp-7); font-size: var(--fs-secundair); color: var(--ink2); }

.deelspeltakken { list-style: none; padding: 0; margin: 0 0 var(--sp-9); display: grid; gap: var(--sp-3); }
.deelspeltak {
  width: 100%;
  min-height: 44px;
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding: var(--sp-5);
  border: 1px solid var(--line);
  border-radius: 11px;
  background: var(--surf);
  color: var(--ink);
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.deelspeltak:hover { filter: brightness(.97); }
.deelspeltak[data-groepsrekening] { border-color: var(--brandline); }
.deelspeltak-vlak {
  width: 34px;
  height: 34px;
  flex: none;
  border-radius: var(--sp-4);
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--surf3);
  color: var(--ink2);
  font-size: var(--fs-meta);
  font-weight: 600;
}
.deelspeltak[data-groepsrekening] .deelspeltak-vlak { background: var(--brand); color: var(--brandink); }
.deelspeltak-naam { flex: 1; min-width: 0; font-size: var(--fs-body); font-weight: 600; }

.deelsoorten { display: flex; flex-wrap: wrap; gap: var(--sp-4); margin: 0 0 var(--sp-7); }
.deelsoort {
  flex: 1 1 45%;
  min-height: 50px;
  display: flex;
  flex-direction: column;
  gap: var(--sp-1);
  padding: var(--sp-7) var(--sp-5);
  border: 1px solid var(--line2);
  border-radius: 12px;
  background: var(--surf);
  color: var(--ink);
  font: inherit;
  text-align: center;
  cursor: pointer;
}
.deelsoort:hover { filter: brightness(.97); }
.deelsoort-naam { font-size: var(--fs-body); font-weight: 600; }
.deelsoort-uitleg { font-size: var(--fs-meta); color: var(--ink3); line-height: 1.4; }

/* --- Mijn declaraties: de twee kerncijfers (AC-135.12) ---------------- */
.lidkerncijfers { display: flex; flex-wrap: wrap; gap: var(--sp-6); margin: 0 0 var(--sp-9); }
.lidkerncijfer {
  flex: 1 1 40%;
  display: flex;
  flex-direction: column;
  gap: var(--sp-1);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: 12px;
  box-shadow: var(--shadow2);
  padding: var(--sp-7);
}
.lidkerncijfer .label { font-size: var(--fs-meta); color: var(--ink2); }
.lidkerncijfer .waarde {
  font-size: 24px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  letter-spacing: -.015em;
}
.lidkerncijfer .aantal { font-size: var(--fs-meta); color: var(--ink3); }

/* --- Declaratie indienen op mobiel (AC-135.10) ------------------------
   De velden van 48px en de knoppen van 50px staan al in het US-130-blok;
   hier komt het grote camerablok bij dat op een telefoon de eerste stap is
   (README §Mobiele schermen, FLOWS §2 stap 2). */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* De zwevende cameraknop bedekte de onderste inhoud: hij staat op
     bottom:88px en is 58px hoog, dus hij beslaat de onderste 146px van het
     scherm, terwijl .inhoud maar 110px padding-bottom had. Op het dashboard
     lag hij over de tekst van de takenkaart, in het declaratiepaneel over de
     knop "Verwijderen" (bevinding R-022 uit de designreview van 2026-09-09).
     146px = tabbalk 74 + tussenruimte 14 + knop 58, precies de hoogte die de
     twee vaste elementen samen innemen; de knop zelf blijft staan waar het
     design hem zet, boven de tabbalk (README §Mobiel). */
  .inhoud { padding-bottom: calc(146px + var(--onderrand)); }

  .inschuifpaneel-inhoud .bondropvlak { padding: 38px var(--sp-9); gap: var(--sp-5); }
  .inschuifpaneel-inhoud .bondropvlak-icoon {
    width: 56px;
    height: 56px;
    padding: 15px;
    box-sizing: border-box;
    border-radius: var(--sp-8);
    background: var(--brand);
    color: var(--brandink);
  }
  .inschuifpaneel-inhoud .bondropvlak-titel { font-size: 16px; }

  /* Op het startscherm neemt de gekleurde kop de plaats in van de witte
     kopbalk met de schermnaam: twee koppen boven elkaar is er één te veel
     (README §Mobiele schermen). Browsers zonder :has() tonen ze allebei —
     dat is lelijker, niet stuk. */
  .hoofd:has(.startkop) .kopbalk { display: none; }
}

/* --- Desktop ---------------------------------------------------------- */
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  /* De kop is hier geen gekleurd blok meer maar gewone tekst (README §2). */
  .startkop {
    margin: 0 0 var(--sp-11);
    padding: 0;
    background: none;
    color: inherit;
  }
  .startkop-balk { display: none; }
  .startgroet { font-size: 26px; }
  .startregel { font-size: 15px; color: var(--ink2); }

  /* AC-135.1: een raster van drie kolommen met een kaart per speltak. */
  .speltakkaarten { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-8); align-items: start; }
  .speltakkaart { grid-template-columns: 1fr; padding: var(--sp-9); gap: var(--sp-7); }
  .speltakkaart-chevron { display: none; }

  /* Bank, Kas en Totaal staan onder elkaar, met een streep vóór het totaal
     en het totaal op 20px/600 (README §2). Label links, bedrag rechts, over de
     volle kaartbreedte: daarvoor moet elke regel zich uitrekken. Met
     align-items:baseline op de kolom kromp een regel tot de breedte van zijn
     eigen inhoud (gemeten 100px) en deden justify-content:space-between en de
     hairline boven Totaal niets — bevinding R-007. stretch is de standaard,
     maar staat hier expliciet omdat de mobiele variant baseline zet. */
  .speltakkaart-cijfers { display: flex; flex-direction: column; align-items: stretch; gap: 9px; }
  .speltakkaart-cijfers .regel {
    justify-content: space-between;
    font-size: var(--fs-body);
    color: var(--ink2);
  }
  .speltakkaart-cijfers .regel .bedrag { color: var(--ink); }
  .speltakkaart-cijfers .regel.totaal {
    border-top: 1px solid var(--line);
    padding-top: 9px;
    font-size: var(--fs-body);
    font-weight: 600;
    letter-spacing: 0;
  }
  .speltakkaart-cijfers .regel.totaal .label { font-size: var(--fs-body); font-weight: 600; color: var(--ink); }
  .speltakkaart-cijfers .regel.totaal .bedrag {
    font-size: 20px;
    font-weight: 600;
    letter-spacing: -.01em;
  }

  .deelsoort { flex-basis: 0; }
}

/* =====================================================================
   US-129 — Declaraties en uitbetalingen
   (docs/design/README.md §5 Declaraties, §6 Declaratiedetail,
   §9 Uitbetalingen, §Mobiele schermen → Lid)

   Alle kleuren komen uit de tokenset van US-120 (var(--…)), zodat licht en
   donker allebei kloppen; er staat hier geen enkele letterlijke kleur.
   Alles hieronder geldt vanaf 360px. Wat breder moet zijn dan een
   telefoonscherm — de tweekolomsindeling van het detail en het
   uitbetalingsscherm — staat onderaan in het min-width-blok (AC-4.9,
   AC-129.13).
   ===================================================================== */

/* --- Filterchips boven het declaratieoverzicht (AC-129.1) ------------- */
/* Gewone links met ?filter=…: het filteren gebeurt serverzijdig, dus dit
   is opmaak en geen bediening (ADR-0037). */
.filterchips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-3);
  margin: var(--sp-7) 0;
}
.filterchip {
  display: inline-flex;
  align-items: center;
  min-height: 44px;                 /* raakvlak op een telefoon (AC-4.9) */
  padding: 0 13px;
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf);
  color: var(--ink2);
  font-size: var(--fs-secundair);
  font-weight: 600;
  text-decoration: none;
}
.filterchip:hover { filter: brightness(.97); text-decoration: none; }
/* De actieve chip draagt naast de kleur ook aria-current, zodat de keuze
   zonder kleur af te lezen is (AC-4.13). */
.filterchip.actief {
  background: var(--brand);
  border-color: var(--brand);
  color: var(--brandink);
}

/* --- De statuspillen van een declaratie (AC-129.2) -------------------- */
/* In behandeling info, goedgekeurd brandsoft, afgewezen danger, betaald
   gevuld brand — elk met een eigen vorm als tweede signaal naast de kleur
   en de tekst (AC-4.13, AC-4.14). */
.status.declbehandeling {
  background: var(--infosoft);
  border-color: var(--infoline);
  color: var(--info);
  border-style: dashed;
}
.status.declgoedgekeurd {
  background: var(--brandsoft);
  border-color: var(--brandline);
  color: var(--brandtext);
}
.status.declgoedgekeurd::before {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  margin-right: 6px;
  border-radius: var(--radius-pil);
  background: var(--credit);
}
.status.declafgewezen {
  background: var(--dangersoft);
  border-color: var(--dangerline);
  color: var(--danger);
}
.status.declafgewezen::before { content: "\00d7\00a0"; font-weight: 700; }
.status.declbetaald {
  background: var(--brand);
  border-color: var(--brand);
  color: var(--brandink);
}
.status.declbetaald::before { content: "\2713\00a0"; font-weight: 700; }

/* --- De statuspillen van een uitbetaling (AC-129.9) ------------------- */
.status.uitbetklaargezet {
  background: var(--warnsoft);
  border-color: var(--warnline);
  color: var(--warn);
  border-style: dashed;
}
.status.uitbetbetaald {
  background: var(--brand);
  border-color: var(--brand);
  color: var(--brandink);
}
.status.uitbetbetaald::before { content: "\2713\00a0"; font-weight: 700; }
.status.uitbetteruggedraaid {
  background: var(--surf3);
  border-color: var(--line2);
  color: var(--ink2);
}

/* --- De rijen van het declaratieoverzicht (AC-129.1) ------------------ */
.declnummer a {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-weight: 500;
  color: var(--brandtext);
  text-decoration: none;
}
.declnummer a:hover { text-decoration: underline; }
.declwie-naam { display: block; font-size: var(--fs-body); font-weight: 600; color: var(--ink); }
.declwie-regel {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 7px;
  margin-top: 2px;
}
.declwie-oms { font-size: var(--fs-meta); color: var(--ink3); }
/* Het uitbetalingsnummer als mono-label achter de omschrijving, met
   "· met 2 andere" erin (AC-129.1). */
.uitbetlabel {
  display: inline-flex;
  align-items: center;
  padding: 1px 7px;
  border: 1px solid var(--line2);
  border-radius: 5px;
  background: var(--surf3);
  color: var(--ink2);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 500;
  white-space: nowrap;
}

/* --- Kaarten op een detailscherm (AC-129.3) --------------------------- */
.infokaart {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-9);
  margin: 0 0 var(--sp-8);
}
.infokaart > h2 {
  margin: 0 0 var(--sp-7);
  font-size: var(--fs-kaartkop);
  font-weight: 600;
}
.infokaart > .melding { margin: var(--sp-5) 0 0; }
.infokaart .knoppen { margin-bottom: 0; }
.kaartkop {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-5);
}
.kaartkop > h2 { margin: 0 0 var(--sp-1); }
.kaartlabel { margin: var(--sp-5) 0 3px; font-size: var(--fs-meta); color: var(--ink3); }

/* De kop van het declaratiedetail: titel, nummer en statuspil. */
.declkop {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--sp-4);
  /* FB-036: ruimte tussen de kop en de eerste kaart, zoals onder de paginatitel elders. */
  margin: 0 0 var(--sp-8);
}
.declkop h1 { margin: 0; }
.declkop-nummer {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-weight: 500;
  color: var(--brandtext);
}

/* Het veldraster in een kaart: één kolom op een telefoon, twee zodra het
   scherm er breed genoeg voor is (zie het min-width-blok onderaan). */
.veldraster { display: grid; gap: var(--sp-7); margin: 0; }
.veldpaar > dt { font-size: var(--fs-meta); color: var(--ink3); margin-bottom: var(--sp-1); }
.veldpaar > dd { margin: 0; font-size: 15px; }
/* Het bedrag is het cijfer waar de lezer naar zoekt (README §6). */
/* Het bedrag is 19px/600 (README §6). De selector draagt bewust ook `.veldpaar
   > dd`: zonder dat wint de regel erboven op specificiteit (0,1,1 tegen 0,1,0)
   en werd het bedrag alsnog 15px — even groot als de bodytekst, waardoor het
   niet opviel (bevinding R-015). */
.bedraggroot,
.veldpaar > dd.bedraggroot { font-size: 19px; font-weight: 600; font-variant-numeric: tabular-nums; }

/* De dangerbalk met de afwijzingsreden (AC-129.3, AC-11.8). */
.dangerbalk { margin: 0 0 var(--sp-8); }

/* --- Kaart Declarant (AC-129.3) --------------------------------------- */
.declarantkop { display: flex; align-items: center; gap: var(--sp-5); }
.initialenvlak {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  border: 1px solid var(--line2);
  border-radius: var(--radius-pil);
  background: var(--surf3);
  color: var(--ink2);
  font-size: 13px;
  font-weight: 600;
}
.declarantnaam { min-width: 0; }
.declarantnaam-naam { display: block; font-size: 15px; font-weight: 600; }
.declarantnaam-mail { display: block; font-size: 13px; color: var(--brandtext); word-break: break-word; }
/* Een rekeningnummer lees je cijfer voor cijfer: mono, niet proportioneel.
   Sinds bevinding R-018 staat het gegroepeerd per vier tekens; het breekt dan
   op een spatie tussen twee groepen in plaats van middenin een groep, en dat is
   precies wat `break-all` verhinderde. */
.ibanwaarde {
  font-family: var(--font-mono);
  font-size: var(--fs-secundair);
  font-weight: 500;
  color: var(--ink2);
  margin: 0;
  word-break: normal;
}

/* --- Kaart Aankoopbewijs (AC-129.3) ----------------------------------- */
.bonvlak {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 220px;
  overflow: hidden;
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf3);
}
.bonvlak img { max-width: 100%; max-height: 220px; object-fit: contain; }
.bonvlak-etiket {
  padding: var(--sp-1) var(--sp-3);
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--surf);
  color: var(--ink3);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  word-break: break-all;
}
.bonknoppen { display: flex; gap: var(--sp-3); }
.bonknoppen .knop { flex: 1 1 0; justify-content: center; }

/* --- Kaart Uitbetaling op het declaratiedetail (AC-129.4) ------------- */
.uitbetlijst {
  list-style: none;
  margin: 0;
  padding: 0;
  border: 1px solid var(--line);
  border-radius: 11px;
  overflow: hidden;
}
.uitbetregel {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--sp-1) var(--sp-5);
  padding: 11px 13px;
  border-bottom: 1px solid var(--line);
  font-size: var(--fs-secundair);
}
.uitbetregel:last-child { border-bottom: none; }
/* De huidige declaratie is gemarkeerd; het woord "deze declaratie" is het
   tweede signaal naast de kleur (AC-4.13). */
.uitbetregel.huidig { background: var(--brandsoft); }
.uitbetregel-hier { color: var(--brandtext); font-weight: 600; }
.uitbetregel.totaal { background: var(--surf2); font-weight: 600; }
.uitbetregel-oms { flex: 1 1 8rem; min-width: 0; font-weight: 600; color: var(--ink); }
.uitbetregel-meta { font-family: var(--font-mono); font-size: var(--fs-micro); color: var(--ink3); }
.uitbetregel-bedrag { margin-left: auto; font-weight: 600; font-variant-numeric: tabular-nums; }

/* --- Verwijderen in de actiekaart (bevinding R-017) -------------------
   "Declaratie verwijderen" stond als paginabrede kaart onder de twee kolommen,
   ook bij een declaratie in behandeling. Het hoort in de actiekaart (README §6):
   een scheiding, een kleine kop en een tekstlink in de gevaarkleur. Het woord
   "verwijderen" draagt de betekenis; de kleur versterkt alleen (AC-4.13). */
.verwijderdeel {
  margin-top: var(--sp-7);
  padding-top: var(--sp-6);
  border-top: 1px solid var(--line);
}

/* Staat het deel als enige in zijn kaart (de zeldzame lezer met financieel
   inzicht die niet mag beoordelen), dan is die scheiding overbodig. */
.infokaart > .verwijderdeel:first-child {
  margin-top: 0;
  padding-top: 0;
  border-top: none;
}

.verwijderdeel > h3 {
  margin: 0 0 var(--sp-3);
  font-size: var(--fs-meta);
  font-weight: 600;
  color: var(--ink3);
}

.verwijderlink { margin: 0; font-size: var(--fs-secundair); }
.verwijderlink a { color: var(--danger); }

/* "Bedrag corrigeren" als tekstlink in plaats van een omrand kaartje in de kaart
   Algemeen (bevinding R-017). Het tikdoel van 44px uit .uitvouwpaneel > summary
   blijft staan (AC-4.9); alleen het frame vervalt. */
.infokaart .uitvouwpaneel.tekstuitvouw {
  margin: var(--sp-6) 0 0;
  padding: 0;
  border: none;
  background: none;
}

.uitvouwpaneel.tekstuitvouw > summary {
  color: var(--brandtext);
  font-weight: 500;
  text-decoration: underline;
}

/* --- Geen kaart in een kaart (bevinding R-016) ------------------------
   `.beheerform` draagt zijn eigen rand, achtergrond, schaduw en padding, omdat
   hij op een beheerscherm los op de pagina staat. Binnen een kaart levert dat
   een tweede frame om dezelfde velden op — zichtbaar in Registreren, Beoordelen
   en op de uitbetalingskaart. Het design zet de velden direct in de kaart
   (README §6 en §9). Alleen het frame vervalt; de rasterindeling blijft. */
.infokaart .beheerform,
.uitbetkaart .beheerform {
  max-width: none;
  margin-top: 0;
  padding: 0;
  border: none;
  border-radius: 0;
  background: none;
  box-shadow: none;
}

/* --- De actiekaart en de statuskaart van een lid (AC-129.5, AC-129.6) - */
.actiekaart-uitleg { margin: 0 0 var(--sp-7); font-size: 13px; color: var(--ink2); line-height: 1.5; }
.actiekaart .knoppen { display: flex; flex-wrap: wrap; gap: var(--sp-3); }
.actiekaart .knoppen .knop { flex: 1 1 8rem; justify-content: center; }
/* Goedkeuren en Afkeuren naast elkaar, elk de halve breedte (README §6). Ze
   stonden onder elkaar in twee losse formulieren; het zijn één formulier met
   twee submitknoppen geworden, met de afwijzingsreden erboven. Onder 601px
   houden ze het tikdoel van 44px uit .knop (AC-4.9): het design meet 40px op
   een muisscherm, en een kleiner tikdoel op een telefoon is geen verbetering. */
.beoordeelknoppen { display: flex; flex-wrap: nowrap; gap: var(--sp-4); }
.beoordeelknoppen .knop { flex: 1; justify-content: center; }

.actiekaart form { margin: 0 0 var(--sp-5); }
.actiekaart form:last-child { margin-bottom: 0; }
.lidstatustekst { margin: 0; font-size: var(--fs-secundair); color: var(--ink2); line-height: 1.55; }

/* --- Het uitbetalingsscherm (AC-129.8 t/m AC-129.10) ------------------ */
.uitbetraster { display: grid; gap: var(--sp-10); align-items: start; }
.uitbetkolom { min-width: 0; }
.kolomkop { margin: 0 0 var(--sp-1); font-size: var(--fs-kaartkop); font-weight: 600; }
.leegvlak {
  margin: var(--sp-7) 0;
  padding: var(--sp-12);
  text-align: center;
  color: var(--ink3);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
}

/* De goedgekeurde declaraties per persoon (AC-129.8). */
.uitbetgroep {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  overflow: hidden;
  margin: 0 0 var(--sp-6);
}
.uitbetgroep form { margin: 0; }
.uitbetgroep-kop {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-5);
  padding: var(--sp-6) var(--sp-7);
  border-bottom: 1px solid var(--line);
  background: var(--surf2);
}
.uitbetgroep-wie { flex: 1 1 8rem; min-width: 0; }
.uitbetgroep-naam { display: block; font-size: 15px; font-weight: 600; }
.uitbetgroep-totaal { font-size: 17px; font-weight: 600; font-variant-numeric: tabular-nums; }
.uitbetgroep .melding { margin: var(--sp-5) var(--sp-7); }
.uitbetgroep-regels { list-style: none; margin: 0; padding: 0; }
.uitbetgroep-regel {
  display: flex;
  align-items: center;
  gap: var(--sp-5);
  padding: var(--sp-5) var(--sp-7);
  border-bottom: 1px solid var(--line);
}
.uitbetgroep-regel:last-child { border-bottom: none; }
.uitbetgroep-regel input[type="checkbox"] { flex: none; width: 20px; height: 20px; }
.uitbetgroep-regel label { flex: 1 1 auto; min-width: 0; }
.uitbetgroep-oms { display: block; font-size: 14px; font-weight: 600; }
.uitbetgroep-meta { display: block; margin-top: 2px; font-size: var(--fs-meta); color: var(--ink3); }
.uitbetgroep-bedrag { flex: none; font-weight: 600; font-variant-numeric: tabular-nums; }

/* De uitbetalingskaarten rechts (AC-129.9); het kaartraster zelf komt uit
   de tabelcomponent (ADR-0088, US-131). */
.uitbetkaart {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-7);
}
.uitbetkaart-kop {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  margin-bottom: var(--sp-4);
}
.uitbetkaart-nummer {
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 500;
  color: var(--brandtext);
  text-decoration: none;
}
.uitbetkaart-nummer:hover { text-decoration: underline; }
.uitbetkaart-naam { margin: 0; font-size: 15px; font-weight: 600; }
.uitbetkaart-cijfers {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-5);
  margin-top: var(--sp-5);
  padding-top: var(--sp-5);
  border-top: 1px solid var(--line);
}
.uitbetkaart-aantal { font-size: 13px; color: var(--ink2); }
.uitbetkaart-bedrag { font-size: 19px; font-weight: 600; font-variant-numeric: tabular-nums; }

/* Het betaalkenmerk met de instructie (AC-27.4, AC-27.10, AC-129.9). */
.kenmerkblok {
  margin-top: var(--sp-5);
  padding-top: var(--sp-5);
  border-top: 1px solid var(--line);
}
.kenmerkblok-uitleg { margin: 0 0 var(--sp-3); font-size: var(--fs-meta); color: var(--ink2); line-height: 1.5; }
.kenmerkcode {
  margin: 0;
  padding: 9px 11px;
  border: 1px solid var(--line);
  border-radius: 9px;
  background: var(--surf3);
  font-family: var(--font-mono);
  font-size: 13px;
  font-weight: 500;
  word-break: break-all;
}

/* De samenstelling van een klaargezette uitbetaling (AC-129.10, AC-27.15). */
.uitbetkaart-declaraties { list-style: none; margin: 0 0 var(--sp-5); padding: 0; }
.uitbetkaart-declaratie {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--sp-1) var(--sp-5);
  padding: var(--sp-4) 0;
  border-bottom: 1px solid var(--line);
  font-size: var(--fs-secundair);
}
.uitbetkaart-declaratie:last-child { border-bottom: none; }
.uitbetkaart-declaratie form { margin: 0; }
.uitbetkaart-oms { flex: 1 1 8rem; min-width: 0; font-weight: 600; }
.uitbetkaart-meta { font-family: var(--font-mono); font-size: var(--fs-micro); color: var(--ink3); }
.uitbetkaart-regelbedrag { font-weight: 600; font-variant-numeric: tabular-nums; }

/* --- Mijn declaraties: openstaand en uitbetaald (AC-129.6) ------------ */
.kerncijfers { display: grid; gap: var(--sp-5); margin: var(--sp-7) 0; }
.kerncijfer {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-7);
}
.kerncijfer > dt { font-size: var(--fs-meta); color: var(--ink3); margin-bottom: var(--sp-2); }
.kerncijfer-bedrag { margin: 0; font-size: 23px; font-weight: 600; font-variant-numeric: tabular-nums; }
.kerncijfer-meta { margin: var(--sp-2) 0 0; font-size: var(--fs-meta); color: var(--ink2); }

/* --- Vanaf een scherm dat breder is dan een telefoon ------------------ */
@media (min-width: 901px) and (min-height: 501px), (min-width: 901px) and (pointer: fine), (min-width: 901px) and (pointer: none) {
  /* Het declaratiedetail in twee kolommen: links 1fr, rechts 380px
     (docs/design/README.md §6). */
  .detailraster {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 380px;
    gap: var(--sp-10);
    align-items: start;
  }
  /* Het uitbetalingsscherm, met dezelfde verdeling (§9). */
  .uitbetraster { grid-template-columns: minmax(0, 1fr) 380px; }
  /* De uitbetalingskaarten staan rechts onder elkaar, niet naast elkaar:
     de kolom is 380px breed. */
  .uitbetkolom .kaartraster { grid-template-columns: minmax(0, 1fr); }
  /* Twee velden naast elkaar in een kaart (§6). */
  .veldraster { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-7) var(--sp-11); }
  .veldpaar.breed { grid-column: 1 / -1; }
  /* README §6: de twee beoordeelknoppen zijn 40px hoog. Alleen hier, want op
     een telefoon blijft het tikdoel 44px (AC-4.9). */
  .beoordeelknoppen .knop { min-height: 40px; }
  .kerncijfers { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* =====================================================================
   US-123 — Uitgaven- en inkomstenlijst
   De twee lijstschermen uit docs/design/README.md §8. De tabel zelf, de
   bediening en de mobiele overflow-wrapper komen uit de generieke
   tabelcomponent (US-107, AC-4.4); hier staat alleen wat déze twee
   schermen eromheen zetten: de notitie, de totaalregel en de twee
   knoppen per rij.
   ===================================================================== */

/* De notitie boven de tabel (AC-123.1/123.2): leesbare regellengte, in de
   secundaire inkttint van .paginauitleg. */
.lijstnotitie { max-width: 78ch; margin-bottom: var(--sp-5); }

/* De totaalregel onder de notitie: het aantal regels en de optelsom, die
   aansluit op de saldokaarten van het dashboard (AC-123.3). */
.lijsttotaal {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--sp-2);
}
.lijsttotaal .bedrag { font-weight: 600; }

/* De omschrijving is waaraan je de regel herkent; het volgnummer staat
   ernaast in mono (README §Formattering). */
.beheertabel td.lijstoms { font-weight: 600; }
.beheertabel th[scope="row"] .volgnr { color: var(--brandtext); }

/* De bewerk- en verwijderknop per rij (AC-123.1). De hoogte van 44px komt
   uit .knop en blijft dus ook op een telefoon een duimvlak (AC-4.9/4.10);
   hier alleen de horizontale ruimte en het bij elkaar houden. */
.rijacties { white-space: nowrap; }
.rijacties .knop { padding-left: var(--sp-5); padding-right: var(--sp-5); }
.rijacties .knop + .knop { margin-left: var(--sp-3); }

/* De regel die zegt waarom er geen knoppen staan (AC-123.6/123.7). */
.lijstalleenlezen { max-width: 78ch; }

/* --- Telefoon --------------------------------------------------------- */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* Onder elkaar in de cel: naast elkaar zouden twee knoppen van 44px de
     kolom breder maken dan het scherm, en dan schuift de hele tabel. */
  .rijacties { white-space: normal; }
  .rijacties .knop { display: flex; justify-content: center; }
  .rijacties .knop + .knop { margin-left: 0; margin-top: var(--sp-2); }
}

/* =====================================================================
   US-124 — Begrotingstab Transacties
   Het vierde tabblad van het begrotingsdetail (docs/design/README.md §10,
   klikpad 9 in FLOWS.md). De boekingen staan in de generieke
   tabelcomponent (AC-4.4, ADR-0075), dus hier staat alleen wat dít
   tabblad eigen is. Alleen tokens, geen letterlijke kleuren.
   ===================================================================== */

/* De totaalregels onderaan de tabel (AC-124.3): dezelfde rustige nadruk als
   de totaalrij van de regeltabellen op Inkomsten en Uitgaven. */
#tabpaneel-transacties .beheertabel tfoot { background: var(--surf2); font-weight: 600; }
#tabpaneel-transacties .beheertabel tfoot .teller { display: block; font-weight: 400; }

/* Een volgnummer dat een link is, moet als link leesbaar blijven: .volgnr zet
   de grijze metatekstkleur, en die zou de link hier laten wegvallen. */
#tabpaneel-transacties a.volgnr { color: var(--brandtext); }

/* Teken en bedrag horen op één regel bij elkaar (AC-4.13). */
#tabpaneel-transacties .beheertabel td.bedrag { white-space: nowrap; }

/* =====================================================================
   US-134 — Instellingen en inrichting
   ---------------------------------------------------------------------
   docs/design/README.md §19 (Instellingen en inrichting) en §20
   (Beheerformulier als paneel van 540px).

   Mobiel eerst: hieronder staat geen enkele vaste breedte groter dan een
   telefoonscherm. Het menu is op een telefoon een rij chips boven de inhoud;
   de kolom van 230px en het paneel van 540px staan in het desktopblok
   helemaal onderaan dit blok (AC-134.13, AC-4.9).
   ===================================================================== */

/* --- Het scherm: menu en inhoud (AC-134.1) ---------------------------- */

.instellingen {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--sp-8);
  align-items: start;
}

.instellingen-inhoud { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-8); }
.instellingen-kop { display: flex; flex-direction: column; gap: var(--sp-2); }
.instellingen-kop h1 { margin: 0; }
.instellingen-uitleg { margin: 0; color: var(--ink2); font-size: var(--fs-secundair); max-width: 64ch; }

/* Een kop met een knop ernaast, boven een deeloverzicht. */
.instellingen-sectiekop {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-5);
}
.instellingen-sectiekop h2 { margin: 0; }

/* --- Het verticale menu (AC-134.2) ------------------------------------ */

.instellingenmenu {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-1);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--sp-3);
}

.instellingenmenu a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  box-sizing: border-box;
  padding: var(--sp-2) var(--sp-5);
  border-radius: var(--sp-3);
  text-decoration: none;
  font-size: var(--fs-secundair);
  font-weight: 600;
  line-height: 1.3;
  color: var(--ink2);
}
.instellingenmenu a[aria-current="page"] {
  background: var(--brandsoft);
  color: var(--brandtext);
}

/* Het kopje boven het tweede blok: kleine kapitalen, zoals in het design. */
.instellingenmenu-kop {
  flex-basis: 100%;
  margin: var(--sp-5) 0 var(--sp-1);
  padding: 0 var(--sp-5);
  font-family: var(--font-mono);
  font-size: 10.5px;
  font-weight: 600;
  letter-spacing: .11em;
  text-transform: uppercase;
  color: var(--ink3);
}

/* Een onderdeel dat nog gebouwd wordt (AC-134.12): geen dode link. */
.instellingenmenu-volgt {
  display: inline-flex;
  flex-direction: column;
  justify-content: center;
  min-height: 44px;
  box-sizing: border-box;
  padding: var(--sp-2) var(--sp-5);
  border-radius: var(--sp-3);
  border: 1px dashed var(--line2);
  font-size: var(--fs-secundair);
  color: var(--ink3);
}
.instellingenmenu-volgt small { display: block; font-size: 0.8em; }

/* --- Kaarten en lijsten in de inhoudkolom ----------------------------- */

.instellingenkaart {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-9);
  display: flex;
  flex-direction: column;
  gap: var(--sp-7);
}
.instellingenkaart h2 { margin: 0; }
.instellingenkaart .beheerform { margin: 0; }

.instellingenwegwijzer { margin: 0; display: flex; flex-direction: column; gap: var(--sp-2); }
.instellingenwegwijzer dt { font-weight: 600; }
.instellingenwegwijzer dd {
  margin: 0 0 var(--sp-5);
  color: var(--ink2);
  font-size: var(--fs-secundair);
  max-width: 64ch;
}

/* Een aankondiging in plaats van een link naar een scherm dat nog volgt. */
.volgtlabel { color: var(--ink3); font-size: var(--fs-secundair); }

/* De herkomst van een account (AC-134.12): "Lokaal account" in de
   waarschuwingskleur, met het woord er altijd bij (AC-4.13). */
.status.lokaal { background: var(--warnsoft); color: var(--warn); border-color: var(--warnline); }

/* --- Velden in een beheerformulier ------------------------------------ */

/* Het sterretje bij een verplicht veld (AC-134.4). Naast het teken staat er
   voor een schermlezer altijd het woord "(verplicht)" in de .overslaan-tekst
   van het label: kleur en teken zijn nooit de enige drager (AC-4.13). */
.verplicht { color: var(--danger); }

/* De hint onder een veld (AC-134.4). */
.veldhint {
  margin: var(--sp-2) 0 0;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--ink3);
}

/* --- De schakelaar van 44 x 26px (AC-134.4) --------------------------- */

.schakelaarveld { display: flex; flex-direction: column; }

.schakelaar {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  min-height: 44px;
  box-sizing: border-box;
  padding: 0 var(--sp-2) 0 var(--sp-6);
  border: 1px solid var(--line2);
  border-radius: var(--sp-3);
  background: var(--surf2);
  cursor: pointer;
}
.schakelaar-label { flex: 1; min-width: 0; font-size: 14px; font-weight: 600; color: var(--ink); }

/* Het bedieningselement is een echt aankruisvakje. Het blijft in de
   toetsenbordvolgorde staan en behoudt zijn rol voor een schermlezer; alleen
   de weergave wordt overgenomen door het schuifje ernaast. Nooit
   display:none of visibility:hidden — dan zou het niet meer focusbaar zijn. */
.schakelaar-vink {
  position: absolute;
  width: 44px;
  height: 26px;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}
.schakelaar-spoor {
  flex: none;
  width: 44px;
  height: 26px;
  box-sizing: border-box;
  padding: 3px;
  border-radius: var(--radius-pil);
  background: var(--line2);
  display: flex;
  justify-content: flex-start;
  transition: background .12s ease-out;
}
.schakelaar-knop {
  width: 20px;
  height: 20px;
  border-radius: var(--radius-pil);
  background: var(--surf);
  box-shadow: 0 1px 2px rgba(0, 0, 0, .25);
  transition: transform .12s ease-out;
}
.schakelaar-vink:checked ~ .schakelaar-spoor { background: var(--brand); }
.schakelaar-vink:checked ~ .schakelaar-spoor .schakelaar-knop { transform: translateX(18px); }
.schakelaar-vink:focus-visible ~ .schakelaar-spoor {
  outline: 3px solid var(--focus);
  outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
  .schakelaar-spoor, .schakelaar-knop { transition: none; }
}

/* --- Het beheerpaneel (AC-134.4, README §20) -------------------------- */

.beheerpaneel-titels { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.beheerpaneel-subtitel { font-size: 12.5px; color: var(--ink3); }

/* Het infoblok met de consequentie, onderaan het paneel. */
.paneelnotitie {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-5);
  margin: 0;
  padding: var(--sp-6) var(--sp-7);
  border-radius: var(--sp-4);
  background: var(--infosoft);
  border: 1px solid var(--infoline);
  color: var(--info);
  font-size: 13px;
  line-height: 1.5;
}

.tokenlijst { margin: var(--sp-4) 0 0; display: grid; gap: var(--sp-1); }
.tokenlijst dt { font-weight: 600; }
.tokenlijst dd { margin: 0 0 var(--sp-3); }
.tokenvoorbeeld { color: var(--ink3); }

/* --- Vanaf een scherm dat breder is dan een telefoon ------------------ */

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  /* Twee kolommen: menu van 230px links, inhoud rechts (AC-134.1). */
  .instellingen { grid-template-columns: 230px minmax(0, 1fr); gap: var(--sp-11); }

  /* Het menu is daar een echte verticale kolom in plaats van chips. */
  .instellingenmenu { flex-direction: column; flex-wrap: nowrap; align-items: stretch; }
  .instellingenmenu a, .instellingenmenu-volgt { justify-content: flex-start; }
  .instellingenmenu-kop { margin-top: var(--sp-7); }

  /* Het beheerformulier is 540px breed en schuift van rechts in (README §20);
     het erft de rest van .paneelscherm .inschuifpaneel. */
  .paneelscherm .beheerpaneel { width: 540px; }
}

/* ====================================================================== */
/* US-137 — Uitgave uit uitbetaling                                        */
/* ====================================================================== */

/* De verwijzing boven in het uitgavepaneel: deze boeking is ontstaan bij het
   betalen van een uitbetaling, dus bedrag, datum en declarant liggen vast
   (AC-137.1). Infoblauw, want het is uitleg en geen fout. */
.melding.uituitbetaling {
  background: var(--infosoft);
  border-color: var(--infoline);
  border-left-color: var(--info);
}

/* Een veld dat vastligt: leesbaar, maar zichtbaar niet in te vullen. De
   readonly-invoer blijft een invoer — hij gaat mee in de POST, zodat de server
   een afwijkende waarde kan weigeren in plaats van hem stil te missen. */
.vastveld input[readonly] {
  background: var(--surf3);
  color: var(--ink2);
  cursor: default;
}

.vastveld input[readonly]:focus {
  border-color: var(--line);
  box-shadow: none;
}

/* Een waarde die helemaal geen invoerveld is: de declarant, de betaalwijze en
   het bewijsstuk dat aan de declaratie hangt. */
.vastveld .vastlabel {
  display: block;
  margin-bottom: var(--sp-2);
  font-weight: 600;
}

.vastveld .vastwaarde {
  margin: 0;
  padding: var(--sp-4) var(--sp-5);
  border: 1px solid var(--line);
  border-radius: var(--sp-3);
  background: var(--surf3);
  color: var(--ink2);
}

/* Het label in de actiekolom van de uitgavenlijst, op de plek waar bij een
   handmatige boeking de verwijderknop staat (AC-137.3). Bewust géén .knop: er
   valt hier niets te verwijderen, alleen door te klikken naar de uitbetaling. */
.rijacties .uitbetalingslabel {
  display: inline-block;
  margin-left: var(--sp-3);
  padding: var(--sp-2) var(--sp-4);
  border: 1px dashed var(--line);
  border-radius: var(--sp-3);
  color: var(--ink2);
  font-size: var(--fs-micro);
  white-space: nowrap;
}

/* =====================================================================
   US-126 — Accountdetail
   ---------------------------------------------------------------------
   docs/design/README.md §19 (Accounts → accountdetail) en klikpad 17 in
   FLOWS.md: de rollen met groep en bereik, en de rechtenmatrix (dertien regels
   uit de designtabel, plus twee die US-156 toevoegde).

   Mobiel eerst: hieronder staat geen enkele vaste breedte. De rollen en de
   rechtenmatrix zijn lijsten van regels met label en waarde; op een telefoon
   staan die onder elkaar, vanaf 601px naast elkaar in kolommen. Alle kleuren
   komen uit de tokenset (AC-120.1), zodat licht en donker allebei kloppen.
   ===================================================================== */

/* --- De chevron per rij in het accountoverzicht (AC-126.1) ------------ */

.detailchevron {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  color: var(--ink3);
  text-decoration: none;
}
.detailchevron:hover, .detailchevron:focus-visible { color: var(--brandtext); }

/* --- Terug naar het overzicht ----------------------------------------- */

.accountterug { margin: 0 0 var(--sp-7); font-size: var(--fs-secundair); }
.accountterug a { display: inline-flex; align-items: center; gap: var(--sp-2); }

/* --- De drie blokken van het scherm ----------------------------------- */

.accountkop, .accountrollen, .accountrechten { margin: 0 0 var(--sp-11); }
.accountkop h2, .accountrollen h2, .accountrechten h2 {
  margin: 0 0 var(--sp-5);
  font-size: var(--fs-sectie);
}

/* --- De rollen met bereik en groeps-object-ID (AC-126.2) -------------- */

.rollenlijst { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--sp-3); }
.rollenregel {
  display: grid;
  gap: var(--sp-2);
  padding: var(--sp-6) var(--sp-7);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius-knop);
}
.rollenrol { font-weight: 600; }
.rollenbereik { color: var(--ink2); font-size: var(--fs-secundair); }
.rollengroep { display: flex; flex-wrap: wrap; gap: var(--sp-3); font-size: var(--fs-meta); color: var(--ink3); }
.rollengroep-label {
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 600;
  letter-spacing: .11em;
  text-transform: uppercase;
  color: var(--ink3);
}

/* Het infoblok onder de rollen: waarom er geen groepsnaam staat. */
.accountnotitie {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-5);
  margin: var(--sp-7) 0 0;
  padding: var(--sp-6) var(--sp-7);
  border-radius: var(--sp-4);
  background: var(--infosoft);
  border: 1px solid var(--infoline);
  color: var(--info);
  font-size: var(--fs-meta);
  line-height: 1.5;
}
.accountnotitie svg { flex: none; margin-top: 1px; }
.accountnotitie a { color: inherit; }

/* --- De rechtenmatrix (AC-126.3) -------------------------------------- */

.rechtenuitleg { margin: 0 0 var(--sp-6); color: var(--ink2); font-size: var(--fs-secundair); }

.rechtenmatrix {
  list-style: none;
  margin: 0;
  padding: 0;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
}

/* Op een telefoon is elke regel een blokje met label en waarde onder
   elkaar; de naam van het recht is het label. */
.rechtenregel {
  display: grid;
  gap: var(--sp-1);
  padding: var(--sp-5) var(--sp-7);
  border-top: 1px solid var(--line);
  font-size: var(--fs-secundair);
}
.rechtenregel:first-child { border-top: none; }
.rechtnaam { color: var(--ink); }
.rechtwaarde { display: inline-flex; align-items: center; }
.rechtenregel.mag .rechtwaarde { color: var(--brandtext); }
.rechtenregel.magniet .rechtwaarde, .rechtenregel.magniet .rechtnaam { color: var(--ink3); }

/* Het bereik is het tweede signaal naast het vinkje (AC-4.13): het staat er
   altijd als woord bij, ook zonder kleur en zonder icoon. */
.rechtbereik { color: var(--ink2); font-size: var(--fs-meta); }
.rechtenregel.magniet .rechtbereik { color: var(--ink3); }

/* --- Vanaf een scherm dat breder is dan een telefoon ------------------ */

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  /* Rol, bereik en groep naast elkaar in plaats van onder elkaar. */
  .rollenregel {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 2fr);
    align-items: baseline;
    gap: var(--sp-7);
  }

  /* De matrix als drie kolommen: recht, vinkje, bereik. */
  .rechtenregel {
    grid-template-columns: minmax(0, 1fr) 2.5rem minmax(0, 12rem);
    align-items: center;
    gap: var(--sp-7);
  }
  .rechtwaarde { justify-content: center; }
}

/* =====================================================================
   US-125 — Audit trail
   Het inzagescherm van de audit trail onder Instellingen
   (docs/design/README.md §19, FLOWS §17, AC-125.1 t/m AC-125.8).
   Alles hieronder is weergave: het scherm leest en schrijft nooit.
   ===================================================================== */

/* De regel voor de groepspenningmeester dat wijzigen bij de administrator
   hoort (AC-125.5). Informatief van toon, niet waarschuwend: er is niets mis. */
.auditnotitie {
  margin: 0 0 var(--sp-8);
  padding: var(--sp-5) var(--sp-7);
  border: 1px solid var(--infoline);
  border-left: 6px solid var(--info);
  border-radius: var(--radius-knop);
  background: var(--infosoft);
  color: var(--ink);
  font-size: var(--fs-secundair);
}

/* --- Periodekiezer en soortchips (AC-125.3, AC-125.4) ----------------- */
.auditfilters { margin: 0 0 var(--sp-8); display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-6); }
/* minmax(0, 1fr): zonder die ondergrens rekt de rij chips de grid op tot de
   volle breedte van de chips en schuift de hele pagina (US-270). */
.auditfilterrij { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-3); }
.auditfilterrij > .microlabel { margin: 0; }

/* Op een telefoon schuift de rij chips in haar eigen wrapper; de pagina zelf
   schuift nooit horizontaal (AC-4.9, AC-134.13). Daarom nowrap plus .overflow-x
   in de markup, en pas boven 600px wikkelen ze. */
.chiprij {
  /* position: de verborgen schermlezertekst (.overslaan, absoluut) in de
     chips blijft binnen deze schuifrij in plaats van de pagina te verbreden
     (US-270). */
  position: relative;
  display: flex;
  flex-wrap: nowrap;
  gap: var(--sp-3);
  padding-bottom: var(--sp-1);
}

.auditchip {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  min-height: 44px;
  padding: var(--sp-2) var(--sp-7);
  border: 1px solid var(--line2);
  border-radius: var(--radius-pil);
  background: var(--surf);
  color: var(--ink2);
  font-size: var(--fs-secundair);
  font-weight: 600;
  text-decoration: none;
  white-space: nowrap;
}

.auditchip:hover { border-color: var(--brandline); color: var(--ink); }

/* Een aanstaande chip verschilt niet alleen in kleur: hij draagt een vinkje en
   een zwaardere rand, en zijn tekst zegt voor een schermlezer dat hij aanstaat
   (AC-4.13). */
.auditchip.aan {
  background: var(--brandsoft);
  border-color: var(--brand);
  border-width: 2px;
  color: var(--brandtext);
}

.auditchip-teken { font-weight: 700; }
.auditchip.leeg { color: var(--ink3); font-weight: 400; }

/* --- De regels zelf (AC-125.1) ---------------------------------------- */

/* Het tijdstip in mono, zodat de kolom onder elkaar uitlijnt. */
.beheertabel th.audittijd {
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-weight: 500;
  white-space: nowrap;
  color: var(--ink2);
}

.beheertabel td.auditgebeurtenis { font-weight: 500; }

/* Het detail is de leesregel "veld: oud → nieuw", of bij aanmaken en
   verwijderen de bedrijfsmatige velden (R-035(b)). Dat is proza en geen code:
   Instrument Sans dus, niet JetBrains Mono — README §Typografie houdt mono voor
   volgnummers, IBAN's en codes. Er staat ook geen GUID meer in, dus hoeft er
   niets meer midden in een woord af te breken: de kolom krijgt ruimte
   (min-width) en breekt op woordgrenzen, waardoor een rij niet langer 100 tot
   150px hoog wordt. */
.beheertabel td.auditdetail {
  min-width: 22ch;
  font-size: var(--fs-meta);
  color: var(--ink2);
  overflow-wrap: break-word;
}

/* De uitklapper met de technische sleutels. Dicht is de normale toestand: het
   opschrift is één regel meta-tekst, de inhoud staat in mono omdat het écht
   codes zijn. */
.audittechniek { margin-top: var(--sp-2); }

.audittechniek > summary {
  cursor: pointer;
  color: var(--ink3);
  font-size: var(--fs-micro);
  font-weight: 600;
}

.audittechniek > summary:hover { color: var(--brandtext); }

.audittechniek .mono {
  display: block;
  margin-top: var(--sp-2);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  color: var(--ink3);
  overflow-wrap: anywhere;
}

.beheertabel td.auditwie { white-space: nowrap; }

/* Het soortlabel als pil met tekst; de kleur is de tweede laag, het woord de
   eerste (AC-4.13). */
.auditpil {
  display: inline-flex;
  align-items: center;
  padding: 1px var(--sp-4);
  border: 1px solid var(--line2);
  border-radius: var(--radius-pil);
  background: var(--surf3);
  color: var(--ink2);
  font-size: var(--fs-micro);
  font-weight: 600;
  white-space: nowrap;
}

.auditpil.soort-declaratie { background: var(--infosoft); border-color: var(--infoline); color: var(--info); }
.auditpil.soort-boeking { background: var(--brandsoft); border-color: var(--brandline); color: var(--brandtext); }
.auditpil.soort-uitbetaling { background: var(--warnsoft); border-color: var(--warnline); color: var(--warn); }

/* --- Vanaf een scherm dat breder is dan een telefoon ------------------ */

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  /* Daar is er ruimte genoeg: de chips wikkelen in plaats van te schuiven. */
  .chiprij { flex-wrap: wrap; }
}

/* --- US-090 — Bonherkenning: voorstellen ------------------------------
   De opmaak van AC-130.8 (.voorstelbalk en .veld[data-voorstel]) staat
   hierboven en verandert hier niet. Wat er bij komt is het gedrag eromheen:
   het vlak waarin de balk en de leesmelding staan, de kruisknop waarmee één
   voorstel met één handeling verworpen wordt (AC-18.3), en het verbergen
   zolang er niets voorgesteld is.

   Alleen designtokens; geen losse kleuren en geen eigen maten die niet uit de
   schaal komen. De knoppen halen hun tikdoel van 44px uit .knop (AC-4.9). */

.voorstelvlak {
  display: grid;
  gap: var(--sp-4);
}

/* [hidden] verliest het van display:flex/grid; de balk en de leesmelding
   beginnen verborgen en moeten dat ook werkelijk zijn. */
.voorstelvlak [hidden] { display: none !important; }

/* De balk is een <p>: hij staat in de leesvolgorde vóór de velden waar hij
   over gaat, en aria-live meldt hem aan een schermlezer (AC-4.13). */
.voorstelbalk { margin: 0; justify-content: space-between; }

/* Een compactere knop voor in de balk. Het tikdoel blijft 44px hoog; alleen de
   binnenruimte en de tekst worden kleiner, zodat "Alle voorstellen verwerpen"
   ook op een telefoon naast de tekst past. */
.knop.klein {
  padding: var(--sp-2) var(--sp-5);
  font-size: var(--fs-meta);
  box-shadow: none;
}

.voorstelbezig { margin: 0; }

/* De kruisknop per veld (AC-18.3): één handeling om dit ene voorstel te
   verwerpen. Staat onder het veld in de grid van .beheerform .veld, links
   uitgelijnd, en draagt het woord "Verwerpen" — kleur is nooit de enige
   drager (AC-4.13). Sinds US-237 is dit een kruisicoon rechts ín het veld;
   die opmaak staat in het US-237-blok achteraan en gaat voor deze. */
.voorstelverwerp {
  justify-self: start;
  min-height: 44px;
  padding: var(--sp-2) var(--sp-5);
  border: 1px solid var(--infoline);
  border-radius: var(--radius-knop);
  background: var(--surf);
  color: var(--info);
  font-family: inherit;
  font-size: var(--fs-meta);
  font-weight: 600;
  cursor: pointer;
}

.voorstelverwerp:hover { background: var(--infosoft); }

/* --- US-092 — Dubbeldetectie: de waarschuwingsbalk ---------------------
   De balk die zegt dat deze bon al eerder is ingediend (AC-18.8). Hij hoort
   op te vallen zonder te schreeuwen: dit is geen fout maar een opmerking, en
   opslaan blijft gewoon mogelijk. Daarom de warn-tokens en niet de
   danger-tokens — die zijn voor iets dat werkelijk misging.

   Kleur is nooit de enige drager (AC-4.13): de zin zelf zegt wat er aan de
   hand is en dat opslaan gewoon kan, en de balk draagt role="status".

   Alleen designtokens; geen losse kleuren en geen maten buiten de schaal. */

.voorstelwaarschuwing {
  padding: var(--sp-4) var(--sp-5);
  border: 1px solid var(--warnline);
  border-left: 6px solid var(--warn);
  border-radius: var(--radius);
  background: var(--warnsoft);
  color: var(--warn);
  font-size: var(--fs-meta);
}

.voorstelwaarschuwing p { margin: 0; font-weight: 600; }

/* De verwijzingen: nummer, datum en bedrag van wat erop lijkt. Geen bolletjes —
   het zijn drie korte regels onder een zin, geen opsomming van gelijkwaardige
   punten. */
.voorstelwaarschuwing ul {
  margin: var(--sp-2) 0 0;
  padding: 0;
  list-style: none;
  font-weight: 400;
  font-variant-numeric: tabular-nums;
}

.voorstelwaarschuwing ul:empty { display: none; }

.voorstelwaarschuwing li { margin-top: var(--sp-1); }

/* =====================================================================
   US-127 — Zoekoverlay
   (docs/design/README.md §18, FLOWS klikpad 15)

   Eén overlay voor de hele applicatie: 660px breed op een groot scherm,
   volledige breedte op een telefoon. Alle kleuren komen uit de tokenset van
   US-120 (var(--…)), zodat licht en donker allebei kloppen; er staat hier geen
   losse kleur en geen maat buiten de schaal.

   Mobiel eerst (AC-4.9, AC-127.8): alles hieronder past op 360px en raakvlakken
   zijn minstens 44px. De 660px van het design en het compacte esc-label van
   24px staan onderaan in het min-width-blok — dat zijn maten voor een muis, niet
   voor een duim. Het functioneel ontwerp gaat daarin vóór het design.
   ===================================================================== */

/* -- De ingang naast een zoekveld (AC-127.1, AC-127.6) ---------------- */
/* Een gewone link naar /zoeken; het script vangt de klik en opent de overlay.
   Zonder JavaScript is het dus een echte, werkende link (ADR-0037). */
.zoekalles {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  min-width: 44px;
  padding: 0 var(--sp-5);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf);
  color: var(--brandtext);
  font-size: var(--fs-secundair);
  font-weight: 600;
  text-decoration: none;
}

.zoekalles:hover { filter: brightness(.97); }

/* -- De overlay (AC-127.1) -------------------------------------------- */
.zoekoverlay {
  position: fixed;
  inset: 0;
  z-index: 56;
  display: flex;
  justify-content: center;
  align-items: flex-start;
  padding: 0;
}

/* Zolang de overlay openstaat, scrollt de pagina eronder niet mee. */
.zoekoverlay-open, .zoekoverlay-open body { overflow: hidden; }

/* De achtergrond: een klik ernaast sluit (AC-127.1). Het is een echte knop, dus
   dat werkt ook met het toetsenbord en met een schermlezer. */
.zoekoverlay-achtergrond {
  position: absolute;
  inset: 0;
  border: 0;
  padding: 0;
  background: rgba(10, 20, 14, .4);
  cursor: pointer;
}

.zoekoverlay-venster {
  position: relative;
  display: flex;
  flex-direction: column;
  width: 100%;
  max-width: 100%;
  max-height: 100%;
  overflow: hidden;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: 0;
  box-shadow: var(--shadow);
  animation: pcash-zoekoverlay .12s ease-out;
}

@keyframes pcash-zoekoverlay { from { opacity: 0; } to { opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
  .zoekoverlay-venster { animation: none; }
}

/* De kop: vergrootglas, het veld, en het esc-label rechtsboven (AC-127.1). */
.zoekoverlay-kop {
  flex: none;
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding: var(--sp-7) var(--sp-8);
  border-bottom: 1px solid var(--line);
}

.zoekoverlay-icoon { display: flex; flex: none; color: var(--ink3); }

.zoekoverlay-kop input[type="search"] {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 44px;
  border: 0;
  padding: 0;
  background: transparent;
  color: var(--ink);
  font: inherit;
  font-size: 16px;
}

.zoekoverlay-kop input[type="search"]:focus-visible { outline: none; }
.zoekoverlay-kop:focus-within .zoekoverlay-icoon { color: var(--brandtext); }

.zoekoverlay-esc {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  min-width: 44px;
  padding: 0 var(--sp-3);
  border: 1px solid var(--line2);
  border-radius: var(--sp-2);
  background: var(--surf);
  color: var(--ink3);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 500;
  cursor: pointer;
}

/* Telefoon: een sluitkruis in plaats van het esc-label (geen Escape-toets).
   Vanaf 601px weer het label; de knop blijft dezelfde (data-zoekoverlay-sluiten). */
.zoekoverlay-esc-tekst { display: none; }
.zoekoverlay-esc-kruis { display: block; }
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .zoekoverlay-esc { border-color: transparent; background: none; color: var(--ink2); }
}
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .zoekoverlay-esc-tekst { display: inline; }
  .zoekoverlay-esc-kruis { display: none; }
}

.zoekoverlay-uitslag { flex: 1 1 auto; overflow-y: auto; }

.zoekoverlay-voet,
.zoekvoet {
  flex: none;
  margin: 0;
  padding: var(--sp-5) var(--sp-8);
  background: var(--surf2);
  border-top: 1px solid var(--line);
  color: var(--ink2);
  font-size: var(--fs-meta);
  line-height: 1.5;
}

/* -- De groepen en de regels (AC-127.2) ------------------------------- */
/* De kop in kleine kapitalen op --surf2, zoals README §18 en de dagkop van de
   transactielijst. */
.zoekgroep-kop {
  margin: 0;
  padding: var(--sp-4) var(--sp-8);
  background: var(--surf2);
  border-bottom: 1px solid var(--line);
  color: var(--ink2);
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 600;
  letter-spacing: .11em;
  text-transform: uppercase;
}

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

/* Elke regel klikt door (AC-127.2) en is met een duim te raken (AC-127.8). */
.zoekregel {
  display: flex;
  align-items: center;
  gap: var(--sp-5);
  min-height: 44px;
  padding: var(--sp-5) var(--sp-8);
  border-bottom: 1px solid var(--line);
  color: var(--ink);
  text-decoration: none;
}

.zoekregel:hover { background: var(--surf2); }

/* Een vaste kolombreedte, zodat de titels onder elkaar uitlijnen ook al is
   T-1037 korter dan een code als UIT-MAT-KNUT (README §18: 64px). Een
   minimumbreedte en geen vaste: een langere code mag de kolom oprekken in
   plaats van eruit te lopen. */
.zoekregel-nummer {
  flex: none;
  min-width: 64px;
  font-family: var(--font-mono);
  font-size: var(--fs-meta);
  font-weight: 500;
  color: var(--brandtext);
}

.zoekregel-nummer.zacht { color: var(--ink3); }

.zoekregel-tekst { flex: 1 1 auto; min-width: 0; }

/* Krappere regelafstand dan de lopende tekst: twee regels per treffer, en de
   rij hoort in het prototype rond de 60px hoog te zijn — ruim boven de 44px die
   AC-4.9 vraagt, en compact genoeg om er tien te zien. */
.zoekregel-titel {
  display: block;
  font-size: var(--fs-kaartkop);
  font-weight: 600;
  line-height: 1.3;
  color: var(--ink);
}

.zoekregel-meta {
  display: block;
  margin-top: var(--sp-1);
  font-size: var(--fs-meta);
  line-height: 1.3;
  color: var(--ink3);
}

/* Het bedrag draagt naast de kleur ook een teken, dus kleur is nooit het enige
   signaal (AC-4.13); de verborgen tekst "bijboeking"/"afboeking" staat in de
   partial. */
.zoekregel-bedrag {
  flex: none;
  font-size: var(--fs-kaartkop);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--ink);
  white-space: nowrap;
}

.zoekregel-bedrag.bij { color: var(--credit); }
.zoekregel-bedrag.af { color: var(--debit); }

/* -- De gewone zoekpagina (AC-127.6) --------------------------------- */
.zoekpagina {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surf);
  box-shadow: var(--shadow2);
  overflow: hidden;
}

.zoekpagina .zoekbalk { margin: 0; padding: var(--sp-7) var(--sp-8); }

.zoekhint,
.zoekleeg {
  margin: 0;
  padding: var(--sp-8);
  color: var(--ink2);
  font-size: var(--fs-secundair);
}

/* -- Boven een telefoonscherm (README §18) ---------------------------- */
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  /* De 660px van het design, met een marge boven het venster zoals het
     prototype (70px). */
  .zoekoverlay { padding: var(--sp-12) var(--sp-7); }
  .zoekoverlay-venster {
    width: 660px;
    max-width: 100%;
    max-height: 600px;
    border-radius: 16px;
  }
  /* Het compacte esc-label van 24px is een muisdoel; op een telefoon blijft het
     44px (AC-127.8). */
  .zoekoverlay-esc { min-height: 24px; height: 24px; min-width: 0; }
}
/* --- einde US-127 --- */

/* =====================================================================
   US-128 — Inlogpagina-beheer
   ---------------------------------------------------------------------
   De seizoensanimatie op het inlogscherm (docs/design/README.md §1) en het
   beheerscherm dat de achtergrond en de animatie instelt (§19, onderdeel
   Inlogpagina; AC-128.1 t/m AC-128.10).

   Alleen designtokens; de enige losse kleuren staan in de keyframes en in de
   deeltjes zelf, en die zijn geen huisstijl maar natuur: sneeuw is wit,
   bloesem is roze, een blad is bruin. Ze staan bewust in
   wwwroot/js/seizoensanimatie.js — één plek voor de maatvoering van de
   deeltjes — en niet hier.

   De animatie beweegt niet bij prefers-reduced-motion: reduce. Dat is hier in
   twee lagen geregeld: het script maakt dan geen deeltjes, en de regel
   onderaan dit blok zet elke animatie in dit blok alsnog stil (AC-128.6,
   AC-4.9, AC-4.14).
   ===================================================================== */

/* --- De keyframes, letterlijk uit het prototype ------------------------
   Drie bewegingen voor vier seizoenen: een blad valt en tuimelt (lente en
   herfst), een vlok valt zonder te draaien (winter), en een lichtje zweeft
   omhoog en dooft aan de randen (zomer). Alles in translate3d en rotate, dus
   op de compositor: geen layout en geen paint per frame. */
@keyframes pc-blad {
  0% { transform: translate3d(0, -8vh, 0) rotate(0deg); }
  50% { transform: translate3d(3vw, 45vh, 0) rotate(180deg); }
  100% { transform: translate3d(-2vw, 105vh, 0) rotate(360deg); }
}
@keyframes pc-vlok {
  0% { transform: translate3d(0, -8vh, 0); }
  50% { transform: translate3d(2vw, 45vh, 0); }
  100% { transform: translate3d(-1vw, 105vh, 0); }
}
@keyframes pc-zweef {
  0% { transform: translate3d(0, 105vh, 0); opacity: 0; }
  12% { opacity: 1; }
  88% { opacity: 1; }
  100% { transform: translate3d(4vw, -8vh, 0); opacity: 0; }
}

/* Het vlak waarin de deeltjes vallen: over de foto, onder de tekst, en het
   vangt geen klikken op. Leeg zolang er geen JavaScript is (AC-128.10). */
.inlog-animatie {
  position: absolute;
  inset: 0;
  display: block;
  overflow: hidden;
  pointer-events: none;
}

/* Eén deeltje. Grootte, kleur, hoekradius, dekking, vervaging en de animatie
   met negatieve delay komen per deeltje uit het script; hier staat alleen wat
   voor alle deeltjes hetzelfde is. */
.inlog-deeltje {
  position: absolute;
  top: 0;
  display: block;
}

/* --- Het beheerscherm (README §19, onderdeel Inlogpagina) -------------- */

.inlogbeheer {
  display: grid;
  gap: var(--sp-8);
  max-width: 820px;
}

.inlogbeheer-kaart {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-9);
  display: grid;
  gap: var(--sp-6);
}

.inlogbeheer-kaartrand {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-6);
  flex-wrap: wrap;
}

.inlogbeheer-kaartkop {
  margin: 0;
  font-size: var(--fs-kaartkop);
  font-weight: 600;
  color: var(--ink);
}

/* Wat er nu actief is, rechtsboven de animatiekaart (AC-128.5). */
.inlogbeheer-nu {
  margin: 0;
  font-size: var(--fs-meta);
  color: var(--ink2);
}

/* Het voorbeeld van 200px hoog, met dezelfde gradiënt eroverheen als op het
   inlogscherm: het beheerscherm moet tonen wat de bezoeker ziet (AC-128.7). */
.inlogbeheer-voorbeeld {
  position: relative;
  height: 200px;
  border-radius: 12px;
  overflow: hidden;
  border: 1px solid var(--line2);
  background: var(--nav);
}

.inlogbeheer-voorbeeld img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.inlogbeheer-voorbeeldlaag {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0, 40, 20, .5) 0%, rgba(0, 30, 15, .15) 45%, rgba(0, 45, 22, .6) 100%);
}

/* Bestandsnaam, afmeting en omvang, in mono op een donker plaatje. */
.inlogbeheer-bestand {
  position: absolute;
  left: var(--sp-6);
  bottom: var(--sp-5);
  margin: 0;
  max-width: calc(100% - var(--sp-11));
  font-family: var(--font-mono);
  font-size: var(--fs-micro);
  font-weight: 500;
  /* Wit in licht en donker: --navink is de tekstkleur van de donkere zijbalk en
     is in beide thema's wit. Dit naamplaatje ligt over een foto met een donkere
     laag eronder, dus het moet in beide thema's wit blijven. */
  color: var(--navink);
  background: rgba(0, 0, 0, .45);
  padding: var(--sp-1) var(--sp-3);
  border-radius: var(--sp-2);
  overflow-wrap: anywhere;
}

/* De twee acties naast elkaar, zoals in het prototype: het bestandsveld met
   zijn knop, en daarnaast "Terug naar standaard". Ze groeien niet mee met de
   kaartbreedte — twee knoppen aan weerszijden van een lege ruimte lezen als
   twee losse dingen in plaats van twee manieren om hetzelfde te veranderen. */
.inlogbeheer-knoppen {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--sp-6);
}

.inlogbeheer-upload {
  display: grid;
  gap: var(--sp-4);
  flex: 1 1 24rem;
  min-width: 0;
}

/* De knoppenrij staat in het formulier en houdt de twee acties bij elkaar; de
   tweede is een link naar de bevestigingsstap en verstuurt niets. */
.inlogbeheer-upload .knoppen { align-items: center; }

.inlogbeheer-knoppen .knoppen { margin: 0; }

/* De formulieren in dit scherm zijn geen eigen kaart: ze staan al ín een kaart.
   Daarom niet .beheerform (dat is zelf een kaart met rand en schaduw), maar een
   eigen, kale variant. */
.inlogbeheer-form {
  display: grid;
  gap: var(--sp-6);
  margin: 0;
}

.inlogbeheer-form .knoppen { margin: 0; }

.inlogbeheer-upload .veld { display: grid; gap: var(--sp-2); }
.inlogbeheer-upload label { font-weight: 600; font-size: 13px; }
.inlogbeheer-upload input[type="file"] {
  min-height: 44px;
  padding: var(--sp-3);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf2);
  color: var(--ink);
  font-family: inherit;
  font-size: var(--fs-secundair);
  max-width: 100%;
}
.inlogbeheer-upload .teller { margin: 0; }

.inlogbeheer-hint {
  margin: 0;
  font-size: var(--fs-meta);
  color: var(--ink2);
  line-height: 1.5;
  max-width: 64ch;
}

/* AC-128.9: de achtergrond is publiek. Dat is geen fout maar wel een
   waarschuwing, dus de warn-tokens en niet de danger-tokens — en de zin zelf
   zegt het, kleur is nooit de enige drager (AC-4.13). */
.inlogbeheer-privacy {
  margin: 0;
  padding: var(--sp-5) var(--sp-7);
  border: 1px solid var(--warnline);
  border-left: 6px solid var(--warn);
  border-radius: var(--radius-knop);
  background: var(--warnsoft);
  color: var(--warn);
  font-size: var(--fs-meta);
  line-height: 1.55;
  max-width: 74ch;
}

/* De zes standen als lijst, zoals het prototype: één regel per keuze, de
   gekozen regel met het zachte brandvlak. Radioknoppen, dus het werkt zonder
   JavaScript en met het toetsenbord. */
.inlogbeheer-keuzes {
  border: 1px solid var(--line);
  border-radius: var(--radius-knop);
  padding: 0;
  margin: 0;
  overflow: hidden;
}

.inlogbeheer-legenda {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.inlogbeheer-keuze {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding: 0 var(--sp-6);
  border-bottom: 1px solid var(--line);
  min-height: 44px;
}

.inlogbeheer-keuze:last-child { border-bottom: 0; }

.inlogbeheer-keuze.gekozen {
  background: var(--brandsoft);
  color: var(--brandtext);
}

.inlogbeheer-keuze input { width: auto; flex: none; accent-color: var(--brand); }

.inlogbeheer-keuze label {
  flex: 1;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-4);
  min-height: 44px;
  padding: var(--sp-3) 0;
  font-size: var(--fs-secundair);
  font-weight: 600;
  cursor: pointer;
}

.inlogbeheer-keuze-sub {
  font-size: var(--fs-meta);
  font-weight: 400;
  color: var(--ink2);
  text-align: right;
}

.inlogbeheer-keuze.gekozen .inlogbeheer-keuze-sub { color: var(--brandtext); }

/* De bevestigingsstap van "Terug naar standaard" (functioneel ontwerp 4.4). */
.inlogbeheer .bevestiging {
  display: grid;
  gap: var(--sp-5);
  padding: var(--sp-6);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf2);
}

/* Minder beweging: de tweede laag onder het script (AC-128.6). Niets in dit
   blok beweegt dan nog, ook niet wanneer er langs een andere weg toch een
   deeltje in de DOM zou staan. */
@media (prefers-reduced-motion: reduce) {
  .inlog-deeltje {
    animation: none !important;
    display: none;
  }
}

/* =====================================================================
   US-136 — Speltaklogo
   ---------------------------------------------------------------------
   Per speltak een eigen logo, waar tot nu toe het initialenvlak stond
   (AC-136.3): op de startschermtegel (42px, README §2), in de zijbalk
   (26px, §Layoutraamwerk), in de speltakbadge in de kopbalk (§4.1) en in
   de kop van de jaarrekening (46px, §12). Zonder logo blijft het
   initialenvlak precies zoals het was (A-272) — er is voor die stand geen
   enkele regel in dit blok nodig.

   Plus het logoblok in het beheerpaneel van de speltak (§19/§20).

   Alleen designtokens. De maten 42/26/46 staan hierboven al in de blokken
   van US-135, US-120 en US-132; dit blok voegt er niets aan toe en stelt
   alleen de inpassing van een áfbeelding in dat vlak bij.
   ===================================================================== */

/* Een logo wordt ingepast, niet uitgesneden. Het vlak op de tegel stond op
   object-fit: cover — dat is goed voor een foto en fout voor een logo: bij
   een liggend logo (AC-136.2 staat dat toe) zouden de zijkanten eraf gaan.
   Het gekleurde vlak eronder blijft staan en dient als plaat achter een
   doorzichtige PNG. */
.speltakkaart-vlak.logo {
  object-fit: contain;
  padding: var(--sp-1);
}

/* Hetzelfde in de zijbalk: het logo neemt de plaats van het initialenvlak
   in en houdt diens maat, hoek en lichte plaat — zodat een donker logo op
   de donkere navigatiebalk niet wegvalt. */
.zijbalk-logo-speltak {
  object-fit: contain;
  padding: 3px;
}

/* De speltakbadge in de kopbalk (AC-4.1). Met een logo vervalt het
   decoratieve bolletje: twee merktekens naast elkaar in één pil is er één
   te veel. */
.speltakbadge.metlogo { padding-left: var(--sp-1); }
.speltakbadge.metlogo::before { content: none; }
.speltakbadge-logo {
  width: 18px;
  height: 18px;
  flex: none;
  border-radius: var(--radius-pil);
  object-fit: contain;
  background: var(--brandink);
  padding: 2px;
}

/* -- Het logoblok in het beheerpaneel (§19, §20) --------------------- */

.speltaklogo {
  display: grid;
  gap: var(--sp-5);
  margin-top: var(--sp-7);
  padding-top: var(--sp-7);
  border-top: 1px solid var(--line);
}

.speltaklogo-kop {
  margin: 0;
  font-size: var(--fs-body);
  font-weight: 600;
  color: var(--ink);
}

.speltaklogo-stand {
  display: flex;
  align-items: center;
  gap: var(--sp-6);
}

/* Het voorbeeld op ware grootte van de jaarrekeningkop: groot genoeg om te
   zien of het logo leesbaar blijft, klein genoeg om in een paneel van
   540px te passen. */
.speltaklogo-voorbeeld {
  width: 72px;
  height: 72px;
  flex: none;
  border-radius: var(--radius-knop);
  object-fit: contain;
  padding: var(--sp-1);
  background: var(--brandsoft);
  border: 1px solid var(--brandline);
}

.speltaklogo-voorbeeld.initialen {
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--fs-sectie);
  font-weight: 600;
  color: var(--brandtext);
}

.speltaklogo-bestand {
  margin: 0;
  font-size: var(--fs-meta);
  color: var(--ink2);
}

.speltaklogo-form { display: grid; gap: var(--sp-5); }

/* De bevestigingsstap van "Logo verwijderen" (functioneel ontwerp 4.4):
   dezelfde vorm als elke andere rem in P-CASH, en hij noemt het gevolg. */
.speltaklogo-bevestiging {
  display: grid;
  gap: var(--sp-5);
  padding: var(--sp-6);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf2);
}

.speltaklogo-bevestiging p {
  margin: 0;
  font-size: var(--fs-meta);
  color: var(--ink);
}
/* --- einde US-136 --- */

/* =====================================================================
   US-145 — Lijstschermen zonder tabelchroom (docs/design/README.md §5, §8,
   §9, §10, §11, §15; bevindingen R-004, R-025, R-029, R-041; ADR-0111).
   Alleen tokens, geen letterlijke kleuren of maten buiten de spacingtokens.
   ===================================================================== */

/* De compacte vorm: het zoekveld staat dicht op de chips erboven en op de
   rijteller eronder, zodat de inhoud vooraan blijft staan in plaats van een
   bedieningsbalk (R-004). */
.tabelbediening.compact .zoekbalk {
  margin: var(--sp-5) 0 var(--sp-3);
}

/* De kale vorm (Tabelchroom.Geen) heeft geen bediening en dus ook geen
   bovenmarge nodig: op het uitbetalingsscherm is dit de rechterkolom, waar de
   eerste kaart bovenaan hoort te beginnen (R-025), en op de rapportage sluit het
   grid direct op de uitleg aan (R-029). */
.tabelblok[data-chroom="geen"] {
  margin-top: 0;
}
.tabelblok[data-chroom="geen"] > .kaartraster {
  margin-top: 0;
}

/* R-041: een keuzefilter in de kopregel kromp mee met zijn kolom, zodat de
   Kas-filter alleen "a" van "alles" toonde en de Bunq-filter "all". Een
   keuzelijst moet haar waarde kwijt kunnen. Daarom sizet zij op haar eigen
   inhoud (width: auto — een select is dan zo breed als haar langste optie) in
   plaats van op de kolom, met een ondergrens in rem zodat hij meegroeit met de
   lettergrootte en op een telefoon van 360px past (AC-4.9). Een vast getal zou
   elke keuzekolom even breed maken en de tabel onnodig laten uitlopen; met
   width: auto groeit alleen de kolom die het nodig heeft, en schuift de tabel
   zo nodig zijwaarts in haar overflow-wrapper (ADR-0065). */
.filterregel select.kolomfilter {
  width: auto;
  min-width: 4rem;
  max-width: 100%;
}
/* =====================================================================
   Fixpakket B2 designreview
   Alle opmaakwijzigingen uit het tweede fixpakket op de designreview van
   2026-09-09 staan hier bij elkaar, per bevinding gemerkt. Eén blok
   achteraan, zodat een latere reviewer in één oogopslag ziet wat er ná de
   storyblokken nog is bijgesteld en waarom. Alleen designtokens.
   ===================================================================== */

/* --- R-023: compacte icoonknoppen op de rij --------------------------- */
/* README §8 en FLOWS §7 ("prullenbakje op de regel"): het prototype zet aan
   het einde van een rij twee vierkante knoppen van 32px. Twee volledig
   gelabelde knoppen namen samen ~200px en trokken het oog van de bedragkolom;
   in de inrichting stapelden ze over twee regels. De tekst verdwijnt niet: hij
   staat als .overslaan-tekst en als title in de knop (zie Pages/Rijknop.cs). */
.rijknop {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 32px;
  height: 32px;
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf);
  color: var(--ink2);
  text-decoration: none;
}
.rijknop:hover { background: var(--surf3); color: var(--ink); text-decoration: none; }
.rijknop:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.rijknop.gevaar {
  background: var(--dangersoft);
  border-color: var(--dangerline);
  color: var(--danger);
}
.rijknop.gevaar:hover { background: var(--dangersoft); color: var(--danger); }
.rijknop + .rijknop { margin-left: var(--sp-2); }
/* De actiekolom in de inrichting: op één regel, niet gestapeld. */
.beheertabel td.acties { flex-wrap: nowrap; gap: var(--sp-3); }
.beheertabel td.acties .koppelknop { white-space: nowrap; }
/* US-303: op Seizoensstatus kan een rij drie acties hebben; die lopen onder elkaar
   door in plaats van over de rand van de tabel. */
[id="seizoensstatus-tabel"] td.acties { flex-wrap: wrap; row-gap: var(--sp-2); }
[id="seizoensstatus-tabel"] td.acties :is(.koppelknop, .toelichting) { white-space: normal; text-align: left; }

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* Op een aanraakscherm blijft het raakvlak 44px (AC-4.10); het icoon zelf
     blijft even groot, alleen het vlak eromheen groeit. */
  .rijknop { width: 44px; height: 44px; }
}

/* --- R-026: het tikdoel van 44px (AC-4.9) geldt ook voor number/email/tel/url;
   de basislaag hierboven ("Tikdoel >= 44px") noemde deze vier typen niet. De
   veldopmaak zelf (radius, border, padding, font) is sinds US-199 niet meer aan
   .beheerform gekoppeld en staat generiek aan het einde van dit bestand. */
input[type="number"],
input[type="email"],
input[type="tel"],
input[type="url"] {
  min-height: 44px;
  box-sizing: border-box;
  font-family: inherit;
  color: var(--ink);
  background: var(--surf);
}
/* (b) Een veld in een tweekolomsraster rekte mee met de rijhoogte van zijn
   buur: een input van 44px werd 77px of 85px naast een veld met een lange
   hint, en leek daardoor een textarea. De inhoud van .veld staat nu bovenaan
   in plaats van uitgerekt over de hele rij. */
.beheerform .veld { align-content: start; }

/* --- R-030: de CONCEPT-stempel staat gedraaid, rechtsboven ------------- */
/* README §12 vraagt een scheefgedraaide stempel in de signaalkleur, naast de
   kop. De hoek zelf staat bij de regel in het US-132-blok (rotate(-8deg)),
   want daar stond hij al; hier alleen de plaatsing. margin-left:auto houdt de
   stempel tegen de rechterrand, ook wanneer de kop op een smalle pagina
   afbreekt en het stempel op een eigen regel komt. */
.jaarrekening-stempel { margin-left: auto; }

/* --- R-033: proza op de kascontrolewachtrij is geen mono -------------- */
/* README §Typografie beperkt JetBrains Mono tot volgnummers, IBAN's,
   groeps-ID's, codes en kleine-kapitalenlabels. Op /kascontrole stonden hele
   zinnen in .kenmerk — "bunq-vergelijking volgt (US-046)" brak over drie
   regels, "… heeft de administratie nog niet ingediend" over vijf. Die zinnen
   dragen nu .toelichting: dezelfde functie (een gedempte bijregel onder een
   waarde), maar in de gewone tekstletter. .kenmerk blijft wat het is en houdt
   de mono voor het betaalkenmerk en het volgnummer. */
.toelichting {
  display: block;
  /* Expliciet, niet geërfd: deze regel is precies wat R-033 vraagt en hoort
     niet stil te veranderen als een voorouder ooit mono krijgt. */
  font-family: var(--font-ui);
  font-size: var(--fs-meta);
  font-weight: 400;
  line-height: 1.35;
  color: var(--ink2);
}
.toelichting.waarschuwing { color: var(--danger); font-weight: 600; }
/* De kolom Actie is gewone tekst en hoeft niet op één regel te blijven. */
.beheertabel td .toelichting { white-space: normal; }

/* --- R-034: het zoekveld op /factcheck is compact --------------------- */
/* Het veld Volgnummer was 1030px breed (de volle inhoudsbreedte) voor een
   inhoud van maximaal zeven tekens; het design tekent een compact zoekveld.
   `flex: 1 1 200px` mag blijven groeien tot deze grens, en niet verder. */
.factcheck-zoek .veld { max-width: 250px; }

/* =====================================================================
   US-148 — Financiële tools onder één knop (ADR-0114, AC-148.5)
   De groepsbrede tools stonden als kopje met losse regels in het
   middendeel van de zijbalk; ze staan nu onder één uitklapper in de voet,
   direct boven "Naar de bank". Een gewone details/summary, dus zonder
   JavaScript (ADR-0037): alleen opmaak, geen gedrag. Uitsluitend
   designtokens, en de twee vaste maten die de zijbalk al gebruikt (de
   36px regelhoogte sinds US-194 en de 13px inspringing uit README §Layoutraamwerk).
   ===================================================================== */

.zijbalk-tools { margin-bottom: var(--sp-1); }

/* De knop draagt exact de regel van "Naar de bank" eronder: dezelfde
   minimumhoogte van 36px (US-194, ADR-0145), dezelfde padding, dezelfde kleur. Het
   driehoekje van de browser gaat weg (list-style plus de WebKit-variant);
   de chevron rechts vertelt de stand. */
.zijbalk-tools > summary {
  display: flex;
  align-items: center;
  gap: 11px;
  min-height: 36px;
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--radius-knop);
  font-size: var(--fs-body);
  color: var(--navink2);
  cursor: pointer;
  list-style: none;
}
.zijbalk-tools > summary::-webkit-details-marker { display: none; }
.zijbalk-tools > summary:hover { background: rgba(255, 255, 255, .09); }
.zijbalk-tools[open] > summary { color: var(--navink); }

/* De iconen krimpen niet weg; de naam vangt de resterende breedte op
   (dezelfde regel als .zijbalk a > svg, maar summary is geen a). */
.zijbalk-tools > summary > svg { flex: none; }
.zijbalk-toolschevron { transition: transform .15s ease; }
.zijbalk-tools[open] .zijbalk-toolschevron { transform: rotate(180deg); }

/* De uitgeklapte lijst krijgt de vorm van de subnavigatie van een speltak:
   ingesprongen 13px met dezelfde verticale lijn, iconen op 9px van de naam
   (README §Layoutraamwerk, bevinding R-012). */
.zijbalk-toolslijst {
  display: flex;
  flex-direction: column;
  gap: 1px;
  margin: var(--sp-1) 0 var(--sp-2) 13px;
  padding-left: var(--sp-5);
  /* Token --navvlak (US-163, V-064), niet een eigen rgba-waarde. */
  border-left: 1px solid var(--navvlak);
}
.zijbalk-toolslijst a, .zijbalk-toolslijst .zijbalk-volgt {
  min-height: 32px;
  padding: var(--sp-1) var(--sp-4);
  font-size: var(--fs-secundair);
  color: var(--navink2);
  border-radius: var(--sp-3);
  gap: 9px;
}

/* De chevron staat stil wanneer de bezoeker minder beweging vraagt. */
@media (prefers-reduced-motion: reduce) {
  .zijbalk-toolschevron { transition: none; }
}

/* =====================================================================
   US-153 — Zoekoverlay: datum, sneltoets en kopbalkingang
   (AC-7.3, ADR-0116, V-060/V-061/V-074)

   Drie uitbreidingen op de zoekoverlay van US-127. Twee ervan hebben geen
   eigen opmaak nodig: dat er ook op datum gezocht wordt
   (Zoeken/Zoekterm.cs) en de sneltoets Ctrl+K/Cmd+K
   (wwwroot/js/zoeksneltoets.js) roepen alleen de bestaande overlay aan. Dit
   blok is dus uitsluitend de kopbalkvariant van de ingang .zoekalles
   (US-127): "Zoek in alles" staat nu ook in de kopbalk van het
   layoutraamwerk (US-120), op elk scherm — ook rapportage, uitbetalingen en
   de beheerschermen, die geen eigen zoekveld hebben.

   Mobiel eerst (AC-4.9, AC-127.8): op een telefoon blijft alleen het icoon
   zichtbaar en blijft het raakvlak minstens 44×44px, dat de basisklasse
   .zoekalles al garandeert. Vanaf 601px komt de tekst erbij. Alle kleuren
   komen uit de tokenset van US-120.
   ===================================================================== */

.zoekalles-kopbalk { gap: var(--sp-2); padding: 0 var(--sp-4); }

.zoekalles-kopbalk-tekst { display: none; }

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .zoekalles-kopbalk-tekst { display: inline; }
  .zoekalles-kopbalk { padding: 0 var(--sp-5); }
}
/* --- einde US-153 --- */

/* US-169 - Bewaking: lijst met ontvangers van bewakingsmeldingen (geen datatabel) */
.ontvangerslijst { list-style: none; margin: 0; padding: 0; }
.ontvangerslijst li { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); padding: var(--sp-2) 0; border-bottom: 1px solid var(--rand); }
.ontvangerslijst li:last-child { border-bottom: 0; }
.ontvangeradres { font-family: var(--mono, monospace); overflow-wrap: anywhere; }

/* =====================================================================
   US-154 — Mobiele dashboardkop volgens design
   (docs/design/README.md §Mobiele schermen, artboard 1d "P-CASH
   Schermen.dc.html"; ADR-0116; besluit V-065)

   Drie punten, en op de mobiele speltakdashboardkop (≤ 600px) alleen; het
   desktopdashboard, de mobiele tabbalk en het startscherm blijven ongewijzigd
   (AC-154.7):

     a) de speltakchip (.speltakbadge, US-122 in _Speltakbadge.cshtml) krijgt
        een chevron en opent met JavaScript de speltakwisselaar hieronder
        (AC-154.1, AC-154.3); zonder JavaScript, of op een scherm breder dan
        600px, blijft de chip een gewone link naar het startscherm
        (wwwroot/js/speltakwisselaar.js, AC-154.4/154.7);
     b) de seizoenchip schuift naar de rechterkant van de kop, naast de
        speltakchip, zoals het artboard tekent (AC-154.1); past dat niet, dan
        breekt de regel gewoon af (getoetst tot 358px) in plaats van te
        overlappen;
     c) de regel "Openstaande declaraties" verdwijnt uit de gekleurde kop
        (AC-154.2). De <li> zelf blijft in de broncode — dezelfde <ul> bedient
        ook het desktopdashboard (AC-122.3) — en wordt hier alleen visueel
        verborgen; het aantal open taken staat al in de takenkaart eronder.

   Alle kleuren komen uit de tokenset van US-120 (var(--…)); geen losse
   kleurwaarden.
   ===================================================================== */

/* -- (a) Speltakchip: de <a> zelf oogt op elk scherm als de oude <span> —
   geen onderstreping, geen andere kleur — en de chevron is standaard
   verborgen. Zo verandert er niets aan het desktopdashboard totdat de
   mobiele media query hieronder de chevron laat zien (AC-154.7). -- */
.speltakchip { display: inline-flex; align-items: center; gap: var(--sp-2); color: inherit; text-decoration: none; }
.speltakchip-chevron { display: none; flex: none; transition: transform .15s ease-out; }

.speltakwisselaar { position: relative; }
/* Verborgen via het hidden-attribuut (niet via deze regels): zonder
   JavaScript bestaat deze lijst dus functioneel niet (AC-154.4). Deze opmaak
   geldt pas zodra wwwroot/js/speltakwisselaar.js het hidden-attribuut weghaalt,
   en dat gebeurt alleen onder de mobiele grens (AC-154.7). */
.speltakwisselaar-lijst {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 20;
  min-width: 220px;
  margin: var(--sp-2) 0 0;
  padding: var(--sp-2);
  list-style: none;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
}
.speltakwisselaar-lijst li { margin: 0; }
.speltakwisselaar-lijst a {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-height: 44px;
  padding: var(--sp-2) var(--sp-4);
  border-radius: var(--radius-knop);
  color: var(--ink);
  text-decoration: none;
}
.speltakwisselaar-lijst a:hover, .speltakwisselaar-lijst a:focus-visible { background: var(--surf2); }
.speltakwisselaar-lijst a.huidig { background: var(--brandsoft); color: var(--brandtext); font-weight: 600; }
.speltakwisselaar-naam { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.speltakwisselaar-logo { flex: none; border-radius: var(--radius-pil); object-fit: cover; }
.speltakwisselaar-initialen {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border-radius: var(--radius-pil);
  background: var(--surf3);
  color: var(--ink2);
  font-size: var(--fs-micro);
  font-weight: 600;
}
.speltakwisselaar-vinkje { flex: none; color: var(--brandtext); }

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* De chevron komt terug, in dezelfde kleur als de speltakchip op de
     gekleurde kop (--navink, hetzelfde token als .speltakbadge daar al
     draagt sinds US-122). */
  .hoofd:has(.speltakkop) .speltakchip-chevron { display: inline-flex; }
  .hoofd:has(.speltakkop) .speltakchip { color: var(--navink); }
  .speltakchip[aria-expanded="true"] .speltakchip-chevron { transform: rotate(180deg); }

  /* (b) De seizoenchip naar rechts. De basisregel .kopbalk-links (alle
     schermen) pakt haar kinderen van links; deze auto-marge duwt alleen de
     seizoenchip naar de rechterkant van zijn eigen regel. Past hij niet meer
     naast de speltakchip, dan breekt .kopbalk-links (flex-wrap: wrap, R-042)
     gewoon af naar een eigen regel in plaats van te overlappen. */
  .hoofd:has(.speltakkop) .seizoenkiezer { margin-left: auto; }

  /* (c) "Openstaande declaraties" weg uit de gekleurde kop (AC-154.2): de
     bron in Dashboard.cshtml is ongewijzigd (ook voor desktop, AC-122.3),
     alleen de mobiele weergave verbergt de regel. */
  .speltakkop .saldopaneel.declaraties { display: none; }
}

/* =====================================================================
   US-152 — Overlay-paneel (docs/design/README.md §7, §20; ADR-0116,
   aanvulling op ADR-0037)

   De huls (Pages/Shared/_Paneeloverlay.cshtml) staat één keer per pagina en
   toont met JavaScript exact dezelfde paneelpagina die zonder JavaScript een
   losse pagina is: .paneelscherm en .inschuifpaneel hierboven (het bestaande
   blok van US-120/US-130) worden ongewijzigd hergebruikt, inclusief hun
   breedte van 520px, de inschuifanimatie en het uitschakelen daarvan bij
   prefers-reduced-motion. Dit blok voegt alleen de overlay eromheen toe: het
   scrim en de positionering.

   Zonder JavaScript blijft de huls verborgen via het hidden-attribuut (de
   globale [hidden]-regel hierboven wint van display) en gebeurt er niets
   (AC-152.5, ADR-0037): een link met data-paneel is dan een gewone <a href>.
   ===================================================================== */

.paneeloverlay {
  position: fixed;
  inset: 0;
  z-index: 60;
}

/* Zolang de overlay openstaat, scrollt de pagina eronder niet mee. */
.paneeloverlay-open, .paneeloverlay-open body { overflow: hidden; }

/* De achtergrond: een klik ernaast sluit (AC-152.3). Een echte knop, dus dat
   werkt ook met het toetsenbord en met een schermlezer (net als de
   zoekoverlay van US-127). */
.paneeloverlay-achtergrond {
  position: absolute;
  inset: 0;
  border: 0;
  padding: 0;
  background: rgba(10, 20, 14, .4);
  cursor: pointer;
}

/* Het venster is de rechterkolom van het scrim en de plek waar
   wwwroot/js/paneeloverlay.js de opgehaalde paneelpagina in zet. Op een
   telefoon vult het de volledige overlay, precies zoals de losse pagina daar
   het hele scherm vult; boven 600px wordt het smaller zodat de bestaande
   520px van .inschuifpaneel zichtbaar rechts blijft staan. */
.paneeloverlay-venster {
  position: absolute;
  inset: 0;
  width: 100%;
  overflow: hidden;
}

.paneeloverlay-venster .paneelscherm,
.paneeloverlay-venster .inschuifpaneel {
  height: 100%;
}

/* US-306: een rustige, native aanvoelende beweging. Het venster schuift van
   rechts in met een afremmende curve, de verduistering vervaagt mee; bij
   sluiten andersom en iets sneller (wwwroot/js/paneeloverlay.js zet
   data-staat). Het paneel zelf animeert in de overlay niet nog eens. */
.paneeloverlay-venster .inschuifpaneel { animation: none; }
.paneeloverlay[data-staat="open"] .paneeloverlay-venster {
  animation: pcash-sheet-in .28s cubic-bezier(.22, .8, .24, 1);
}
.paneeloverlay[data-staat="open"] .paneeloverlay-achtergrond {
  animation: pcash-scrim-in .22s ease-out;
}
.paneeloverlay[data-staat="dicht"] .paneeloverlay-venster {
  animation: pcash-sheet-uit .2s cubic-bezier(.4, 0, 1, 1) forwards;
}
.paneeloverlay[data-staat="dicht"] .paneeloverlay-achtergrond {
  animation: pcash-scrim-uit .2s ease-in forwards;
}
@keyframes pcash-sheet-in { from { transform: translateX(100%); } to { transform: translateX(0); } }
@keyframes pcash-sheet-uit { from { transform: translateX(0); } to { transform: translateX(100%); } }
@keyframes pcash-scrim-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes pcash-scrim-uit { from { opacity: 1; } to { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
  .paneeloverlay[data-staat] .paneeloverlay-venster,
  .paneeloverlay[data-staat] .paneeloverlay-achtergrond { animation: none; }
}

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .paneeloverlay-venster { left: auto; width: 520px; }
}
/* --- einde US-152 --- */

/* =====================================================================
   US-195 — Seizoenpaneel op een telefoon
   (designreview mobiel 2026-09-21, bevindingen M-009 en M-010, beide
   blokkerend; FO AC-4.9 en AC-4.11, docs/design/README.md §3 en
   §Mobiele schermen, FLOWS §10 stap 1-2)

   Twee oorzaken, allebei in dit ene paneel:

   (a) M-009 — het paneel hangt in de kopbalk, en op een telefoon kleurt
       .hoofd:has(.speltakkop) .kopbalk die hele subboom wit (var(--navink)) om
       op de gekleurde --nav-kop te staan. Het paneel is zelf géén onderdeel van
       dat gekleurde vlak: het is een wit vlak (--surf) dat eroverheen valt. Het
       erfde dus wit op wit. Gemeten op 390px in het lichte thema: twintig
       tekstelementen op contrast 1,0 (op --surf) respectievelijk 1,24 (op de
       gemarkeerde rij, --brandsoft) — de drie seizoennamen, de twee streepjes
       en alle twaalf bedragen. Het paneel zet daarom zijn eigen tekstkleur en
       erft die van niemand meer.

   (b) M-010 — het geopende paneel was 1422px breed en maakte het document
       1438px breed bij een viewport van 390px; de knop "Administratie
       indienen" stond op x = 1228 en was zonder de pagina zijwaarts te
       schuiven onbereikbaar. Twee dingen samen: .seizoenkiezer is een flexitem
       van .kopbalk-links en had min-width: auto, dus het item mocht niet
       kleiner worden dan zijn inhoud, en die inhoud is een tabel van elf
       kolommen met white-space: nowrap (1420px). Onder 601px krimpt het item nu
       wel (min-width: 0) en stapelt de tabel tot een kaartje per seizoen, zoals
       het paneel in het prototype op een telefoon ook één regel per seizoen
       toont. Er verdwijnt geen gegeven: alle elf cellen blijven staan, met hun
       kolomkop ervoor (ADR-0147; de role-attributen die daarbij horen staan in
       Pages/Speltak/Dashboard.cshtml).
   ===================================================================== */

/* (a) Het paneel is een eigen kleurvlak. --ink is themagevoelig: in het donkere
   thema staat dezelfde regel voor lichte tekst op het donkere paneelvlak, waar
   het wit van --navink toevallig al goed uitpakte. */
.seizoenpaneel { color: var(--ink); }

/* De periode van het gemarkeerde seizoen stond in --ink3 op --brandsoft: 4,36:1
   en daarmee onder de AA-drempel van 4,5:1 (AC-4.11, AC-195.1) — in het lichte
   thema, op élke schermbreedte. --ink2 op --brandsoft is 4,86:1 en scheelt
   optisch niets: het zijn twee vrijwel gelijke grijstinten. Buiten de
   gemarkeerde rij blijft --ink3 staan; daar is het 5,14:1 op --surf. */
.seizoentabel th.gekozen ~ td.periode { color: var(--ink2); }

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* (b1) De seizoenchip mag krimpen. Zonder deze regel houdt de automatische
     minimumbreedte van het flexitem (min-width: auto) het paneel op de
     maximale breedte van de tabel eronder en duwt het het document open. */
  .seizoenkiezer { min-width: 0; }
  .seizoenpaneel { max-width: 100%; }

  /* (b2) De tabel stapelt: één kaartje per seizoen, met per cel de kolomkop
     ervoor. De kolomkoprij verdwijnt; de koppen staan als data-kop op de cellen
     zelf (Speltak/Dashboard.cshtml), en de role-attributen daar houden het voor
     een schermlezer een tabel met rijen, rijkoppen en cellen. */
  .seizoentabel,
  .seizoentabel tbody,
  .seizoentabel tr,
  .seizoentabel th,
  .seizoentabel td { display: block; }
  .seizoentabel thead { display: none; }

  .seizoentabel tbody tr {
    padding: var(--sp-5) var(--sp-7);
    border-top: 1px solid var(--line);
  }
  /* De markering van het gekozen seizoen verhuist van de cellen naar het hele
     kaartje; op losse blokcellen zou ze de tussenruimte openlaten. */
  .seizoentabel tbody tr:has(th.gekozen) { background: var(--brandsoft); }
  .seizoentabel th.gekozen,
  .seizoentabel th.gekozen ~ td { background: none; }

  /* De seizoennaam is de kop van het kaartje; de cellen eronder zijn
     kop-waardeparen. white-space keert terug naar normal: nowrap was er voor de
     kolomweergave en zou hier alleen maar kunnen uitsteken. */
  .seizoentabel tbody th[scope="row"] {
    padding: 0 0 var(--sp-3);
    border-top: 0;
    font-size: var(--fs-secundair);
    white-space: normal;
  }
  .seizoentabel tbody td {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--sp-5);
    padding: 2px 0;
    border-top: 0;
    white-space: normal;
  }
  .seizoentabel tbody td[data-kop]::before {
    content: attr(data-kop);
    flex: none;
    color: var(--ink2);
  }
  /* Het bedrag staat rechts van zijn kop; text-align doet in een flexregel
     niets meer, de verdeling van de regel doet het werk. */
  .seizoentabel tbody td.getal { text-align: left; }
}
/* --- einde US-195 --- */

/* =====================================================================
   US-207 — Seizoenspagina en een compact seizoenpaneel
   (besluit Pascal 2026-09-21; FO 7.4, docs/design/README.md §3)

   Het paneel onder de seizoenchip is weer een kiezer: naam, periode, status en
   actief. De saldi per potje, de aansluiting en de links per seizoen staan op
   /speltak/{id}/seizoenen, in één blok per seizoen. Die blokken zijn gewone
   .paneel-kaarten; hieronder staat alleen wat de kop van zo'n blok nodig heeft.
   De tabel in het blok is dezelfde .seizoentabel als in het paneel, dus ze
   stapelt onder 601px op dezelfde manier (US-195, ADR-0147).
   ===================================================================== */

.seizoenblok > .overflow-x { margin: 0 calc(-1 * var(--sp-9)); }

.seizoenblok-kop {
  display: flex;
  align-items: center;
  gap: var(--sp-3) var(--sp-5);
  flex-wrap: wrap;
  margin-bottom: var(--sp-6);
}
.seizoenblok-kop h2 { margin: 0; }
.seizoenblok-periode {
  font-size: var(--fs-meta);
  color: var(--ink2);
  font-variant-numeric: tabular-nums;
}
.seizoenblok .seizoenpaneel-links { padding: var(--sp-6) 0 0; border-top: 0; }
/* --- einde US-207 --- */

/* =====================================================================
   US-199 — Formuliervelden: één opmaak, één tikformaat, geen iOS-zoom
   (designreview 2026-09-21, M-002 en M-003; docs/design/README.md
   §Designtokens, §Typografie, §Mobiele schermen; FO AC-4.9, AC-4.11)

   M-003: de veldopmaak (radius, border, padding) hing aan .beheerform, in drie
   bijna-identieke regels (voorheen r.810, r.991 en de R-026-aanvulling) die
   samen ook nog eens textarea oversloegen. Alles wat geen .beheerform-veld was
   — het zoeknummer op /factcheck — kreeg de browserstandaard. M-002: onder
   601px stond elk veld op 14,5px (textarea 13,33px); iOS Safari zoomt vanaf
   het aantikken automatisch in zodra een veld onder de 16px komt. Alleen het
   zoekoverlayveld stond al bewust op 16px.

   Deze ene regel (AC-199.3) vervangt de drie .beheerform-regels en geldt voor
   elk tekstachtig veld, ook buiten een .beheerform-formulier: input, behalve
   de typen die geen tekstveld zijn (checkbox, radio, file, submit, button,
   range — knoppen en aankruisvakjes behouden hun eigen opmaak), plus select en
   textarea. Achtergrond en kleur staan al generiek in "Tikdoel >= 44px"
   hierboven; hier komen radius, border, padding en de geërfde tekstmaat bij.

   :where() om de :not()-clausules heen houdt de specificiteit van deze regel
   gelijk aan een kale elementselector (0 klassen/attributen, dus evenveel
   gewicht als "select" of "textarea" alleen). Zonder :where() telt elke
   :not()-clausule apart mee en was deze regel specifieker dan bijvoorbeeld
   .zoekoverlay-kop input[type="search"] (dat veld heeft bewust border: 0 en
   padding: 0, vlak naast het vergrootglas) — dan had de generieke regel dat
   veld een zichtbare rand en dichtgeslibde padding gegeven, en was het
   zoekoverlayveld kleiner geworden. Met :where() blijft elke bestaande,
   specifiekere regel (zoekoverlay, kopzoek, de losse zoekbalk, het
   inlogformulier) zelf de baas over haar eigen border/padding/achtergrond;
   alleen een veld zonder eigen regel — zoals het veld nummer op /factcheck — valt nu
   pas onder deze regel (vandaar ook het schrappen van .factcheck-zoek input
   { font-size: 15px } hierboven, dat blokkeerde anders dezelfde generieke
   regel).

   Breedte (width: 100%) hoort hier bewust niet bij: een generieke width:100%
   had het zoekoverlay- en kopzoekveld (flex: 1 1 auto in een balk, niet de
   volle breedte) kunnen laten springen. Binnen .beheerform is width: 100% al
   sinds jaar en dag het gedrag; die regel staat er apart onder, nu ook voor
   textarea (die kreeg hem nog nooit). */
input:where(:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="submit"]):not([type="button"]):not([type="range"])),
select,
textarea {
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  padding: var(--sp-4) 13px;
  font: inherit;
}

.beheerform input:where(:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="submit"]):not([type="button"]):not([type="range"])),
.beheerform select,
.beheerform textarea {
  width: 100%;
}

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* AC-199.1: onder de 16px zoomt iOS Safari automatisch in zodra een veld
     focus krijgt. Dezelfde, laag-specifieke selector als hierboven: op een
     veld met een eigen font-size (de losse zoekbalk staat al op 1rem = 16px)
     verandert dit niets. */
  input:where(:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="submit"]):not([type="button"]):not([type="range"])),
  select,
  textarea {
    font-size: 16px;
  }
  /* Twee velden hebben een eigen, specifiekere regel die de lettergrootte
     zelf zet en daarmee de generieke regel hierboven zou winnen: het
     transactiezoekveld in de speltakkop (font-size: var(--fs-secundair),
     13,5px) en het inlogformulier (font: inherit, dus 14,5px). Beide staan
     op een telefoon in beeld; ook zij krijgen onder 601px 16px. */
  .kopzoek input[type="search"],
  .inlogformulier input {
    font-size: 16px;
  }
}
/* --- einde US-199 --- */

/* =====================================================================
   US-197 — Tikdoelen van 44px in lijsten
   ---------------------------------------------------------------------
   Designreview 2026-09-21, M-001 en M-019: op elf van de tweeëntwintig
   mobiele schermen waren 197 zichtbare tikdoelen lager dan 44px. De twee
   grootste groepen (.rijknop, .sorteerlink) kregen hun maat pas echt toen
   b60c970 de commentaarfout vóór het Fixpakket B2-blok herstelde; hieronder
   staat wat daarna nog ontbrak: de minimummaten zelf, de losse
   celkoppelingen, de terugkruimel, de speltakchip en het aankruisvakje
   "Meenemen" op /uitbetalingen/samenstellen.

   V-105: de 44px gelden alleen onder 601px. Op desktop blijft de compacte
   rijknop van 32px staan (R-023, ADR-0145). Alleen het tikvlak groeit; geen
   icoon wordt groter. Invoervelden horen hier niet bij (US-199).

   Getoetst door Toegankelijkheid/TikdoelenTests: de berekende CSS op 390px
   van elke zichtbare a[href] en button op de gerenderde schermen.
   ===================================================================== */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* AC-197.1: de B2-regel zet width/height op 44px; de minimummaten erbij
     zorgen dat het vlak nooit kleiner wordt. De inhoud staat gecentreerd
     via de basisregel (inline-flex, align-items/justify-content center). */
  .rijknop { min-width: 44px; min-height: 44px; }

  /* AC-197.2: de tekst staat al verticaal gecentreerd (basisregel,
     inline-flex met align-items: center); alleen het vlak groeit. */
  .sorteerlink { min-height: 44px; }

  /* AC-197.3: losse koppelingen in een lijstrij of kaart, en de
     terugkruimel bovenaan de lijstschermen.
     - .declnummer a: het volgnummer op Declaraties (D-175);
     - .bekijklink: "Bekijk" op Mijn declaraties, Samenstellen, het
       uitbetalingsdetail en in het seizoenpaneel van het dashboard;
     - .rijacties a.uitbetalingslabel: "Uit uitbetaling U-nnnn" op Uitgaven;
     - .uitbetkaart-nummer, .uitbetkaart-oms: nummer en declaratie op de
       uitbetalingskaarten;
     - .alleslink, .kaartvoet a: de doorverwijzingen onder de kaarten van
       het dashboard;
     - .kruimel a: "← Terug naar …". */
  .declnummer a,
  .bekijklink,
  .rijacties a.uitbetalingslabel,
  .uitbetkaart-nummer,
  .uitbetkaart-oms,
  .alleslink,
  .kaartvoet a,
  .kruimel a {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }

  /* Het mailadres op het declaratiedetail blijft een eigen regel (de
     basisregel zet display: block), nu met een tikvlak van 44px. */
  a.declarantnaam-mail {
    display: flex;
    align-items: center;
    min-height: 44px;
  }

  /* De speltakchip in de gekleurde kop van het speltakdashboard (US-154):
     de badge zelf blijft even groot, de link eromheen wordt 44px hoog —
     net zo hoog als de seizoenchip ernaast. */
  .speltakchip { min-height: 44px; }

  /* AC-197.4: het label om het vakje "Meenemen" vult de cel. */
  .meenemenlabel {
    display: flex;
    align-items: center;
    width: 100%;
    min-height: 44px;
    box-sizing: border-box;
    cursor: pointer;
  }
}

/* AC-197.4 (M-019): het vakje zelf 20 × 20px in de merkkleur in plaats van
   het systeemblauw van accent-color: auto, op elke breedte — net als het al
   goed bemeten vakje op /uitbetalingen (.uitbetgroep-regel). */
.meenemenlabel input[type="checkbox"] {
  flex: none;
  width: 20px;
  height: 20px;
  margin: 0;
  accent-color: var(--brand);
}
.uitbetgroep-regel input[type="checkbox"] { accent-color: var(--brand); }
/* --- einde US-197 --- */

/* --- US-211 — de foutsamenvatting bovenaan het paneel (AC-211.3, AC-211.4,
   designreview D-010). Staat vóór de velden en krijgt de focus; op elke
   breedte zichtbaar, dus ook op 390px boven het bijlagevlak. scroll-margin
   houdt hem vrij van de plakkende kop wanneer paneel.js hem in beeld schuift. */
.foutsamenvatting {
  display: grid;
  gap: var(--sp-3);
  margin: 0 0 var(--sp-5);
  scroll-margin-top: 80px;
}
.foutsamenvatting p { margin: 0; }
.foutsamenvatting:focus { outline: 3px solid var(--focus); outline-offset: 2px; }
/* --- einde US-211 --- */

/* ================================================
   US-227 — Seizoenpaneel en seizoenenpagina opschonen
   (feedback Pascal 2026-10-01, FB-001, FB-002 en FB-003)

   FB-001: het paneel van 580px had een horizontale scrollbalk; de kolom
   "Bekijk" viel half buiten beeld. Die kolom is weg: de naam van het seizoen is
   nu de keuze, en een ::after over de rij maakt de hele rij aanklikbaar. De
   rij krijgt daarvoor position: relative; de link zelf blijft één gewone link
   per seizoen, voor het toetsenbord en zonder JavaScript (ADR-0037). De
   celpadding gaat een tik omlaag, zodat vier kolommen met nowrap ruim binnen
   580px passen.

   FB-003: de seizoenenpagina is één tabel met één <tbody> per seizoen in plaats
   van één kaart per seizoen. Zie Pages/Speltak/Seizoenen.cshtml.
   ===================================================================== */

.seizoenpaneel .seizoentabel th,
.seizoenpaneel .seizoentabel td { padding: var(--sp-4) var(--sp-6); }
.seizoenpaneel .seizoentabel thead th { padding-top: var(--sp-3); padding-bottom: var(--sp-3); }
.seizoenpaneel .seizoentabel tbody tr { position: relative; cursor: pointer; }
.seizoenkeuze { color: inherit; font-weight: 600; text-decoration: none; }
.seizoenkeuze::after { content: ""; position: absolute; inset: 0; }
.seizoenpaneel .seizoentabel tbody tr:hover .seizoenkeuze { text-decoration: underline; }
/* Op een telefoon is de seizoensnaam zelf ook een tikdoel van minstens 44px (AC-197.5);
   het ::after-vlak maakt de hele rij klikbaar, maar de link moet op eigen kracht voldoen. */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .seizoenkeuze { display: inline-flex; align-items: center; min-height: 44px; }
}

/* -- De seizoenenpagina -------------------------------------------------- */
.seizoenoverzicht-regel { margin: 0 0 var(--sp-2); color: var(--ink2); font-size: var(--fs-secundair); }
.seizoenoverzicht-uitleg { margin: 0 0 var(--sp-7); font-size: var(--fs-meta); color: var(--ink2); }
.seizoenoverzicht-uitleg > summary { cursor: pointer; color: var(--brandtext); width: fit-content; }
.seizoenoverzicht-uitleg > p { margin: var(--sp-2) 0 0; max-width: 72ch; line-height: 1.5; }

/* De tabel staat tegen de randen van de kaart, zoals elke lijst in een .paneel
   (.paneel > .overflow-x met negatieve marge); overflow houdt de hoeken rond. */
.paneel.seizoenoverzicht { overflow: hidden; }
/* Niet over de volle breedte uitsmeren: seizoen, potje en de drie bedragen staan
   dicht bij elkaar, de koppelingen ernaast nemen de rest van de regel. */
.seizoenoverzicht-tabel th.seizoenrij,
.seizoenoverzicht-tabel tbody th[scope="row"] { width: 1%; }
.seizoenoverzicht-tabel .getal { width: 7rem; }
.seizoenoverzicht-tabel th,
.seizoenoverzicht-tabel td { padding: var(--sp-3) var(--sp-7); vertical-align: middle; }
/* Bank en Kas van één seizoen horen bij elkaar: alleen tussen de seizoenen een
   lijn, binnen het seizoen niet. */
.seizoenoverzicht-tabel tbody + tbody > tr:first-child > * { border-top: 1px solid var(--line2); }
.seizoenoverzicht-tabel tbody > tr + tr > th[scope="row"],
.seizoenoverzicht-tabel tbody > tr + tr > td { border-top: 0; }
.seizoenoverzicht-tabel tbody > tr:first-child > * { padding-top: var(--sp-5); }
.seizoenoverzicht-tabel tbody > tr:last-child > * { padding-bottom: var(--sp-5); }
.seizoenoverzicht-tabel th.seizoenrij { vertical-align: top; font-weight: 400; }
.seizoenrij-kop { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: nowrap; }
.seizoenrij-naam { font-size: var(--fs-body); }
.seizoenrij-periode { display: block; margin-top: var(--sp-1); font-size: var(--fs-meta); font-variant-numeric: tabular-nums; }
.seizoentabel .seizoenrij-periode { color: var(--ink2); }
.seizoenoverzicht-tabel tbody th[scope="row"] { font-weight: 600; }
.seizoenoverzicht-tabel td.seizoenrij-links { vertical-align: top; font-size: var(--fs-meta); padding-left: var(--sp-7); white-space: normal; }
.seizoenrij-links a + a { margin-left: var(--sp-5); }
/* Het gekozen seizoen draagt over beide rijen dezelfde markering als in het
   paneel (README §3). */
.seizoenoverzicht-tabel tbody.gekozen > tr > * { background: var(--brandsoft); }

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* Het paneel: de knoppen onder elkaar over de volle breedte. */
  .seizoenpaneel-knoppen { flex-direction: column; align-items: stretch; }
  .seizoenpaneel-knoppen .knop { width: 100%; }

  /* De seizoenenpagina: een kaartje per seizoen. Bovenaan het seizoen, daaronder
     per potje de drie bedragen met hun kolomkop ervoor (US-195), en onderaan de
     koppelingen. In de broncode staan de koppelingen in de eerste rij (de rij
     van Bank, met rowspan over Kas); op het kaartje horen ze na Kas. De eerste
     rij doet daarom niet mee als blok (display: contents) en de volgorde komt
     uit order. De role-attributen in de broncode houden het voor een
     schermlezer een tabel (ADR-0147). */
  .seizoenoverzicht-tabel tbody {
    display: flex;
    flex-direction: column;
    padding: var(--sp-6) var(--sp-7);
    border-top: 1px solid var(--line2);
  }
  .seizoenoverzicht-tabel thead + tbody { border-top: 0; }
  .seizoenoverzicht-tabel tbody > tr:first-child { display: contents; }
  .seizoenoverzicht-tabel tbody > tr,
  .seizoenoverzicht-tabel tbody > tr > *,
  .seizoenoverzicht-tabel tbody > tr:first-child > *,
  .seizoenoverzicht-tabel tbody > tr:last-child > *,
  .seizoenoverzicht-tabel tbody + tbody > tr:first-child > * { padding: 0; border-top: 0; background: none; width: auto; }
  .seizoenoverzicht-tabel tbody.gekozen { background: var(--brandsoft); }
  .seizoenoverzicht-tabel th.seizoenrij { order: 1; margin-bottom: var(--sp-2); }
  .seizoenoverzicht-tabel tbody > tr:first-child > th[scope="row"],
  .seizoenoverzicht-tabel tbody > tr:first-child > td[data-kop] { order: 2; }
  .seizoenoverzicht-tabel tbody > tr + tr { order: 3; }
  .seizoenoverzicht-tabel td.seizoenrij-links { order: 4; }
  .seizoenoverzicht-tabel tbody > tr > th[scope="row"] { padding: var(--sp-3) 0 var(--sp-1); font-size: var(--fs-meta); }
  .seizoenoverzicht-tabel tbody > tr > td[data-kop] { padding: 2px 0 2px var(--sp-5); }
  .seizoenoverzicht-tabel td.seizoenrij-links {
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-2) var(--sp-5);
    width: auto;
    margin-top: var(--sp-4);
  }
  .seizoenrij-links a + a { margin-left: 0; }
  .seizoenrij-kop { flex-wrap: wrap; }
}
/* --- einde US-227 --- */


/* --- US-228 — ronde, grotere speltaklogo's en de declaratielink in de kaart
   (FB-005, FB-006; ADR-0158). Eén blok, zodat de regels samen te lezen zijn.

   AC-228.1: het logovlak is overal een cirkel. Op de kaartkop van het
   overzicht 56px (was 42px), in de zijbalk 26px en in de speltakbadge 18px,
   zoals de speltakwisselaar (20px) al was. Een afbeelding vult de cirkel
   (object-fit: cover, zonder binnenmarge of rand): daarmee vervalt de
   inpassing met contain uit het US-136-blok, die een rond logo in een
   afgerond vierkant met afstekende hoeken zette. De gekleurde plaat blijft
   eronder als achtergrond voor een doorzichtige PNG of SVG, maar is nu
   zelf rond en steekt dus nergens uit. */
.speltakkaart-vlak {
  width: 80px;
  height: 80px;
  border-radius: var(--radius-pil);
  font-size: var(--fs-sectie);
}
/* Specificiteit gelijk aan .speltakkaart.groepsrekening .speltakkaart-vlak en
   later in het bestand, zodat ook het logo van de groepsrekening geen rand
   krijgt. */
.speltakkaart .speltakkaart-vlak.logo {
  object-fit: cover;
  padding: 0;
  border: 0;
  border-radius: var(--radius-pil);
}
/* Alle initialenvlakken in de zijbalk rond; het profielvlak was dat al. */
.zijbalk-initialen { border-radius: var(--radius-pil); }
.zijbalk-logo-speltak {
  object-fit: cover;
  padding: 0;
  border-radius: var(--radius-pil);
}
.speltakbadge-logo {
  object-fit: cover;
  padding: 0;
  border-radius: var(--radius-pil);
}

/* AC-228.2: de kaart met een eigen handeling (de ledenvariant). Het <li> is
   dan de kaart: rand, plaat, schaduw en de rand in --brandline van de
   groepsrekening verhuizen van de kaartlink naar het kader, en de handeling
   staat er onderaan in als secundaire knop. Zo valt de link binnen de kaart
   zonder een link in een link. */
.speltakkaart-kader {
  display: flex;
  flex-direction: column;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  overflow: hidden;
}
.speltakkaart-kader.groepsrekening { border-color: var(--brandline); }
.speltakkaart-kader > .speltakkaart {
  border: 0;
  border-radius: 0;
  box-shadow: none;
  padding-bottom: var(--sp-5);
}
.speltakkaart-kader > .speltakkaart-actie {
  margin: 0;
  padding: 0 var(--sp-7) var(--sp-7);
}
/* FB-028 (Pascal 2026-10-01: "te heftig, maak het subtiel; de kaart moet even groot blijven als
   alle andere"): de handeling is een kleine tekstlink in de merkkleur in plaats van een knop, en
   alle kaarten in een rij zijn even hoog (de kaartlink rekt mee, de actie staat onderaan). */
.speltakkaart-kader > .speltakkaart { flex: 1 1 auto; }
.kaartactie {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  min-height: 44px;
  color: var(--brandtext);
  font-size: var(--fs-secundair);
  font-weight: 600;
  text-decoration: none;
}
.kaartactie:hover { text-decoration: underline; }
.kaartactie:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; border-radius: var(--radius-knop); }
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .speltakkaart-kader > .speltakkaart-actie { padding: 0 var(--sp-9) var(--sp-5); }
  .kaartactie { min-height: 32px; }
  .speltakkaarten { align-items: stretch; }
  .speltakkaarten > li > .speltakkaart { height: 100%; }
}
/* FB-022 (Pascal 2026-10-01: "nog groter, waar het kan minimaal 80px"): de kaartkop op het
   overzicht 80px (hierboven); in de zijbalk en de speltakbadge zo groot als de rijhoogte toelaat. */
.zijbalk a:not(.zijbalk-profiel) > .zijbalk-initialen,
.zijbalk-logo-speltak { width: 32px; height: 32px; }
.speltakbadge-logo { width: 24px; height: 24px; }
/* --- einde US-228 --- */


/* --- US-232 — helppaneel per pagina (AC-232.1, ADR-0161).
   De uitleg van een scherm staat niet meer boven de inhoud maar achter een
   kleine ronde "?"-knop naast de titel: een <details class="hulp"> uit de
   HulpTagHelper. Het paneel ligt over de inhoud heen (geen verspringende
   pagina) en is verankerd aan de titelrij, zodat het op 390px binnen de
   pagina blijft. Alleen tokens, dus licht en donker thema volgen vanzelf. */
.paginatitel {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-2) var(--sp-3);
  margin: 0 0 var(--sp-5);
}
.paginatitel > h1,
.paginatitel > h2 { margin: 0; }
/* In een tabbladkop staat de titelrij naast de primaire knop; hij neemt de
   rest van de breedte, zodat het paneel eronder ruimte heeft. */
.tabkop > .paginatitel { flex: 1 1 20rem; margin: 0; }
/* Op het takenscherm volgt de bedieningsregel direct onder de kop. */
.paginatitel.takentitel { margin-bottom: var(--sp-2); }
/* In Instellingen staat de "?" naast de titel van het onderdeel. */
.instellingen-kop .paginatitel { margin: 0; }
:where(div, header):has(> .hulp) { position: relative; }
.hulp { position: static; display: inline-block; }
.hulp-knop {
  list-style: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 1px solid var(--line2);
  background: var(--surf);
  color: var(--brandtext);
  font-size: var(--fs-secundair);
  font-weight: 600;
  line-height: 1;
  cursor: pointer;
  user-select: none;
}
.hulp-knop::-webkit-details-marker { display: none; }
.hulp-knop::marker { content: ""; }
.hulp-knop:hover { border-color: var(--brand); }
.hulp-knop:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; }
.hulp[open] > .hulp-knop {
  background: var(--brand);
  border-color: var(--brand);
  color: var(--brandink);
}
.hulp-paneel {
  position: absolute;
  top: calc(100% + var(--sp-2));
  left: 0;
  z-index: 30;
  box-sizing: border-box;
  width: min(66ch, 100%);
  padding: var(--sp-4) var(--sp-5);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surf);
  color: var(--ink2);
  box-shadow: var(--shadow2);
  font-size: var(--fs-secundair);
  font-weight: 400;
  letter-spacing: normal;
  text-align: left;
  white-space: normal;
}
.hulp-paneel > :first-child { margin-top: 0; }
.hulp-paneel > :last-child { margin-bottom: 0; }
.hulp-paneel p { margin: 0 0 var(--sp-3); max-width: none; color: var(--ink2); }
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* AC-4.10: een duimvlak van 44px. */
  .hulp-knop { width: 44px; height: 44px; }
  .hulp-paneel { width: 100%; }
}
/* --- einde US-232 --- */


/* =====================================================================
   US-229 — Mijn declaraties: één tabel met status (AC-229.1, AC-229.2,
   ADR-0159). De tabel draagt .mijndeclaraties naast .beheertabel; de
   speltak- en statuschips zijn de bestaande .filterchips van Declaraties.
   ===================================================================== */

/* Twee rijen chips onder elkaar: speltak en status. */
.filterchips + .filterchips { margin-top: calc(-1 * var(--sp-3)); }

/* De afwijzingsreden onder de statuschip (functioneel ontwerp 11.8). */
.mijndeclaraties .mijndecl-reden {
  display: block;
  margin-top: var(--sp-1);
  font-size: var(--fs-meta);
  color: var(--ink2);
  white-space: normal;
}

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* AC-229.2: op een telefoon stapelt de tabel tot één kaartje per declaratie,
     met per cel de kolomkop ervoor (data-kop), zoals de seizoentabel (US-195).
     De koprij verdwijnt; het nummer is de kop van het kaartje. */
  .mijndeclaraties,
  .mijndeclaraties tbody,
  .mijndeclaraties tr,
  .mijndeclaraties th,
  .mijndeclaraties td { display: block; }
  .mijndeclaraties thead { display: none; }

  .mijndeclaraties tbody tr {
    padding: var(--sp-5) var(--sp-7);
    border-top: 1px solid var(--line);
  }
  .mijndeclaraties tbody th[scope="row"] {
    padding: 0 0 var(--sp-3);
    border-top: 0;
    white-space: normal;
  }
  .mijndeclaraties tbody td {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--sp-2) var(--sp-5);
    padding: 2px 0;
    border-top: 0;
    white-space: normal;
  }
  .mijndeclaraties tbody td[data-kop]::before {
    content: attr(data-kop);
    flex: none;
    color: var(--ink2);
  }
  .mijndeclaraties tbody td.getal { text-align: left; }
  .mijndeclaraties .mijndecl-reden { flex-basis: 100%; text-align: right; }
}
/* --- einde US-229 --- */

/* =====================================================================
   US-230 — Lijstzoekveld boven de transactielijst (AC-230.1, AC-230.2,
   FB-008, ADR-0160)
   ---------------------------------------------------------------------
   Het veld "Zoek op naam, datum of bedrag" staat niet meer in de kopbalk
   maar in de kopregel van de lijst op het speltakdashboard. Mobiel eerst:
   titel en teller op de eerste regel, het veld over de volle breedte
   eronder, boven de lijst. Boven 600px staan titel, teller en veld op één
   regel, het veld rechts (250px uit het US-122-blok). */
.lijstkop-zoek {
  flex-wrap: wrap;
  align-items: center;
  row-gap: var(--sp-4);
}
.lijstkop-zoek .kopzoek {
  flex: 1 1 100%;
  width: 100%;
  min-width: 0;
}
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .lijstkop-zoek { flex-wrap: nowrap; }
  .lijstkop-zoek .lijstteller { margin-left: auto; }
  .lijstkop-zoek .kopzoek { flex: 0 1 250px; width: 250px; }
}
/* --- einde US-230 --- */

/* --- US-236 — mutatierapportage: de volgnummerkolom is een gewone tabelcel ---
   FB-017: door de volgnummerkolom liep een lichte verticale balk en de
   volgnummers stonden bovenaan hun cel. De oorzaak is de algemene regel
   .volgnr { display: inline-block; min-width: 2.2em } (bedoeld voor een
   volgnummer als <span> in lopende tekst), die hier ook de <td class="getal
   volgnr"> trof: een cel met display:inline-block is geen tabelcel meer. De
   browser zet er een anonieme cel omheen zonder rand en zonder eigen hoogte,
   dus de rijrand liep niet door en de inhoud stond bovenaan (ADR-0165).

   De kolom is niet vastgezet en krijgt dus geen eigen achtergrond, rand of
   schaduw: zij erft alles van de rij, in licht en in donker thema. Alle cellen
   van het grid zijn op dezelfde manier verticaal gecentreerd. */
.mutatiegrid td.volgnr {
  display: table-cell;
  min-width: 0;
  font-size: inherit;
}
.mutatiegrid th, .mutatiegrid td { vertical-align: middle; }
/* --- einde US-236 --- */

/* --- US-237 — Knoppen gelijk van hoogte, verwerpen als icoon in het veld ---
   AC-237.1: de tegels in "Nieuw vastleggen" zijn allemaal even hoog en hun
   tekst blijft op één regel. "Contant opnemen" brak over twee regels en werd
   daardoor hoger dan de rest (FB-019). Het raster krijgt rijen van gelijke
   hoogte (grid-auto-rows: 1fr) en de naam breekt niet; is een kolom te smal,
   dan krimpt de tekst met een beletselteken in plaats van te breken. Op
   mobiel (één kolom) blijven ze >= 44px.

   AC-237.2: het verwerpen van één voorstel is een klein kruisicoon rechts ín
   het invoerveld in plaats van een knop "Verwerpen" eronder (FB-020). Het
   icoon is een echte <button> (toetsenbord, aria-label per veld, tooltip) met
   een tikdoel van 44px over de volle veldhoogte. Het veld krijgt rechts ruimte
   zodat tekst, datumkiezer en keuzepijl niet onder het icoon vallen. Alleen
   designtokens. */
/* In de rechterkolom van 348px is een tegel 163px breed. Met iets minder
   binnenruimte (10px in plaats van 12px, icoonafstand 6px in plaats van 9px)
   past de langste naam, "Contant opnemen", erin zonder af te breken. */
.tegels-vastleggen { grid-auto-rows: 1fr; padding: var(--sp-3); gap: var(--sp-2); }
.tegels-vastleggen .tegel {
  height: 100%;
  min-width: 0;
  box-sizing: border-box;
  gap: var(--sp-2);
  padding: 11px var(--sp-4);
}
.tegels-vastleggen .tegelnaam {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.voorstelinvoer { position: relative; display: grid; min-width: 0; }
.euroveld > .voorstelinvoer { flex: 1 1 auto; }
.veld[data-voorstel="true"] .voorstelinvoer > input,
.veld[data-voorstel="true"] .voorstelinvoer > select { padding-right: 44px; }

.voorstelverwerp {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  min-height: 44px;
  padding: 0;
  border: 0;
  border-radius: var(--radius-knop);
  background: transparent;
  color: var(--info);
  cursor: pointer;
}
.voorstelverwerp:hover { background: transparent; color: var(--ink); }
.voorstelverwerp:focus-visible {
  outline: 2px solid var(--info);
  outline-offset: -4px;
}
/* --- einde US-237 --- */


/* --- US-238 — speltakbadge groter, opent de speltakwisselaar (AC-238.2, ADR-0167).
   FB-024 (Pascal 2026-10-01): "Logo groter". Het logo in de badge wordt 36px en
   rond; met 2px binnenruimte boven en onder is de badge 40px hoog, zo groot als
   de kopbalk (min. 64px) toelaat zonder dat die meegroeit. Een badge met logo
   wordt daarbij een pil, zodat de ronde vorm van het logo hem afsluit. De
   badge zonder logo (met het bolletje) blijft wat hij was. */
.speltakbadge.metlogo {
  padding: 2px 14px 2px 2px;
  gap: var(--sp-3);
  border-radius: var(--radius-pil);
  font-size: 14px;
}
.speltakbadge-logo { width: 36px; height: 36px; }
/* De chip (alleen met meer dan één speltak) is sinds US-238 op elke breedte
   een knop die de wisselaar opent: een hand en een lichte hover als teken. */
.speltakchip { cursor: pointer; border-radius: var(--radius-pil); }
.speltakchip:hover .speltakbadge { filter: brightness(1.08); }
.speltakchip:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
/* --- einde US-238 --- */

/* =====================================================================
   US-234 — Uitbetalingen als één werkstroom (AC-234.1 t/m AC-234.4,
   ADR-0164, FB-013). Eén kolom met drie stappen op volgorde, compacte
   rijen en het betaalformulier pas bij de handeling. Alleen tokens, geen
   letterlijke kleuren. De oude tweekolomsregels (.uitbetraster) blijven
   ongebruikt staan; deze regels gaan erboven door de cascade.
   ===================================================================== */
.werkstroom { display: grid; gap: var(--sp-9); max-width: 1100px; min-width: 0; }
.werkstap { min-width: 0; margin: 0; }
.werkstap-kop {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-3);
  margin: 0 0 var(--sp-3);
  font-size: var(--fs-sectie);
  font-weight: 600;
  color: var(--brandtext);
}
details.werkstap > summary.werkstap-kop {
  min-height: 44px;
  cursor: pointer;
  list-style: none;
}
details.werkstap > summary.werkstap-kop::-webkit-details-marker { display: none; }
details.werkstap > summary.werkstap-kop::after {
  content: "\25BE";
  margin-left: var(--sp-1);
  color: var(--ink3);
}
details.werkstap[open] > summary.werkstap-kop::after { content: "\25B4"; }
.werkstap-nr {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  background: var(--brandsoft);
  color: var(--brandtext);
  font-size: var(--fs-secundair);
  font-weight: 700;
}
.werkstap-teller {
  display: inline-flex;
  align-items: center;
  min-width: 26px;
  padding: 1px var(--sp-3);
  border-radius: 999px;
  background: var(--surf3);
  color: var(--ink);
  font-size: var(--fs-secundair);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  justify-content: center;
}
.werkstap-totaal { font-size: var(--fs-secundair); font-weight: 500; color: var(--ink2); }
.werkstap-hulp { margin: 0 0 var(--sp-3); font-size: var(--fs-secundair); color: var(--ink2); }
.werkstap-hulp a { display: inline-flex; align-items: center; min-height: 44px; }
/* AC-234.1: een lege stap is één regel, geen kaart. */
.werkstap-leeg,
.werkstroom .kaartleeg {
  margin: 0;
  padding: var(--sp-3) 0;
  text-align: left;
  color: var(--ink3);
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
}
.sr-tekst {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Stap 1: de groepen per persoon iets compacter dan op de oude linkerkolom. */
.werkstroom .uitbetgroep { margin: 0 0 var(--sp-5); }
.werkstroom .uitbetgroep-kop { padding: var(--sp-4) var(--sp-7); }
.werkstroom .uitbetgroep-regel { padding: var(--sp-3) var(--sp-7); }

/* Stap 2 en 3: één rij per uitbetaling onder elkaar, in één omlijst blok. */
.werkstroom .kaartraster {
  display: block;
  margin: 0;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  overflow: hidden;
}
.werkstroom .kaartraster:has(> .kaartleeg) {
  background: none;
  border: 0;
  box-shadow: none;
}
.werkstroom .uitbetkaart {
  padding: var(--sp-5) var(--sp-7);
  background: none;
  border: 0;
  border-bottom: 1px solid var(--line);
  border-radius: 0;
  box-shadow: none;
}
.werkstroom .uitbetkaart:last-child { border-bottom: 0; }
.werkrij {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-7);
}
.werkrij-wie {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-5);
  flex: 1 1 24rem;
  min-width: 0;
}
.werkrij-wie .uitbetkaart-naam { font-size: var(--fs-body); }
.werkrij-bedrag {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  margin-left: auto;
}
.werkrij-bedrag .uitbetkaart-bedrag { font-size: 17px; }
.kopieerbaar {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-3);
  min-width: 0;
}
.kopieerbaar .ibanwaarde { font-family: var(--font-mono); font-size: var(--fs-secundair); color: var(--ink2); }
.kopieerknop.knop.klein { min-height: 32px; padding: var(--sp-1) var(--sp-4); }
.werkrij-kenmerk { margin: var(--sp-2) 0 0; font-size: var(--fs-secundair); }
.werkrij-label { color: var(--ink3); }
.werkrij-kenmerk .kenmerkcode {
  display: inline-block;
  padding: 2px var(--sp-3);
  border-radius: 6px;
  word-break: break-all;
}
.werkrij-meta { margin: var(--sp-1) 0 0; font-size: var(--fs-secundair); color: var(--ink2); }
.werkstroom .werkrij-declaraties {
  margin: var(--sp-3) 0 0;
  padding: 0;
  border: 0;
  background: none;
}
.werkstroom .werkrij-declaraties > summary {
  display: inline-flex;
  min-height: 32px;
  font-weight: 500;
  font-size: var(--fs-secundair);
  color: var(--brandtext);
}
.werkrij-declaraties .uitbetkaart-declaraties { margin: var(--sp-1) 0 var(--sp-3); }
.werkrij-declaraties .beheerform { margin: 0 0 var(--sp-3); }
.werkrij-acties {
  display: flex;
  align-items: flex-start;
  flex-wrap: wrap;
  gap: var(--sp-3);
  margin-top: var(--sp-3);
}
.betaalpaneel > summary.knop { list-style: none; }
.betaalpaneel > summary.knop::-webkit-details-marker { display: none; }
/* AC-234.3: het formuliertje opent inline onder de rij, over de volle breedte. */
.betaalpaneel[open] { flex: 1 1 100%; }
.betaalpaneel[open] > summary.knop { background: var(--surf); color: var(--brandtext); border-color: var(--line2); }
/* Specificiteit gelijk aan .uitbetkaart .beheerform (R-016), en later: hier
   mag het formuliertje wél een eigen vlak hebben, want het klapt onder de rij
   open en moet als één handeling herkenbaar zijn. */
.uitbetkaart .betaalformulier {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
  gap: var(--sp-3) var(--sp-7);
  align-items: end;
  margin: var(--sp-3) 0 0;
  padding: var(--sp-5) var(--sp-7);
  background: var(--surf2);
  border: 1px solid var(--line);
  border-radius: var(--radius-knop);
}
.betaalformulier .veld { margin: 0; }
.betaalformulier .teller { margin: var(--sp-1) 0 0; font-size: var(--fs-meta); }
.betaalformulier .knoppen { margin: 0; }

/* AC-234.4: op een telefoon is elke rij een compacte kaart met de actie
   over de volle breedte. Geen horizontale scroll: alles mag afbreken. */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .werkstroom .kaartraster { background: none; border: 0; box-shadow: none; overflow: visible; }
  .werkstroom .uitbetkaart {
    margin: 0 0 var(--sp-5);
    padding: var(--sp-5);
    background: var(--surf);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    box-shadow: var(--shadow2);
  }
  .werkstroom .uitbetkaart:last-child { border-bottom: 1px solid var(--line); }
  .werkrij-bedrag { margin-left: 0; width: 100%; justify-content: space-between; }
  .kopieerknop.knop.klein { min-height: 44px; }
  .werkstroom .werkrij-declaraties > summary { min-height: 44px; }
  .werkrij-acties { flex-direction: column; align-items: stretch; }
  .werkrij-acties > .knop,
  .betaalpaneel,
  .betaalpaneel > summary.knop,
  .betaalformulier .knop { width: 100%; }
  .uitbetkaart .betaalformulier { grid-template-columns: minmax(0, 1fr); padding: var(--sp-5); }
}
/* --- einde US-234 --- */

/* --- US-235 — begrotingspagina opgeschoond (AC-235.1 t/m AC-235.7, ADR-0168).
   FB-014/015/016 (Pascal 2026-10-01): het tabblad Overzicht moest scrollen,
   naast de tabs stond een scrollbalk, de regeltabellen leken "een screenshot
   van een oude pagina" en het info-icoon gaf bij hover niets. Dit blok maakt de
   pagina compacter en zet de regeltabellen in de lijststijl van de rest van de
   app. Alleen designtokens, dus licht en donker thema volgen vanzelf; geen
   inline stijl (CSP). */

/* AC-235.3: de tabbalk zonder scrollbalk. De verticale balk kwam doordat de
   actieve tab met margin-bottom: -1px over de onderrand hing en overflow-x:
   auto de y-as op auto zette. De onderrand is nu een inset-schaduw onder de
   tabs (de actieve tab dekt hem met zijn eigen achtergrond af), en past de rij
   niet (telefoon), dan schuift zij zonder zichtbare balk, met een vervaging aan
   de kant waar nog tabs staan (scroll-schaduw, zonder JavaScript). */
.tabstrip {
  overflow-y: hidden;
  scrollbar-width: none;
  border-bottom: 0;
  box-shadow: inset 0 -1px 0 var(--line);
  background:
    linear-gradient(to right, var(--bg) 40%, transparent) left center / 32px 100% no-repeat local,
    linear-gradient(to left, var(--bg) 40%, transparent) right center / 32px 100% no-repeat local,
    linear-gradient(to right, var(--line2), transparent) left center / 14px 100% no-repeat scroll,
    linear-gradient(to left, var(--line2), transparent) right center / 14px 100% no-repeat scroll;
}
.tabstrip::-webkit-scrollbar { display: none; }
.tabstrip a[aria-current="page"] { margin-bottom: 0; }
.tabpaneel { margin-top: var(--sp-6); }

/* AC-235.1: Overzicht in één scherm — compactere kaarten, velden en matrix. */
.begrotingsoverzicht { gap: var(--sp-7); }
.begrotingsoverzicht > .paneel { margin: 0; padding: var(--sp-7) var(--sp-8); }
.begrotingsoverzicht .paginatitel { margin-bottom: var(--sp-4); }
.begrotingsoverzicht .beheerform { gap: var(--sp-4); }
.begrotingsoverzicht .beheerform .veld { gap: var(--sp-1); }
.begrotingsoverzicht .beheerform .knoppen { margin-top: var(--sp-2); }
.begrotingsoverzicht .financieelkop { margin: var(--sp-8) 0 var(--sp-3); }
.begrotingsoverzicht .gegevenspaneel > .overflow-x {
  margin: 0 calc(-1 * var(--sp-8)) calc(-1 * var(--sp-7));
}
.begrotingsoverzicht .matrixtabel th,
.begrotingsoverzicht .matrixtabel td { padding: var(--sp-3) var(--sp-8); }

.procentveld { display: flex; align-items: center; gap: var(--sp-1); }
.procentveld input { flex: 1 1 auto; text-align: right; font-variant-numeric: tabular-nums; }
.procentteken {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 40px; min-height: 44px; box-sizing: border-box;
  background: var(--surf3); border: 1px solid var(--line2); border-radius: var(--radius-knop);
  font-weight: 600; color: var(--ink2);
}

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  /* Drie kolommen waar dat past (naam, seizoen, locatie; type en aantallen;
     bedragen en percentage); in een smallere kaart (1280px) worden het er
     twee. De opmerkingen staan over de volle breedte. */
  .begrotingsoverzicht .velden-raster {
    grid-template-columns: repeat(auto-fill, minmax(max(13rem, 30%), 1fr));
    gap: var(--sp-4) var(--sp-6);
  }
  .velden-raster .veld.breed { grid-column: 1 / -1; }
  /* Op desktop een compacter veld; onder 601px blijft het tikdoel 44px
     (AC-4.9, V-105). */
  .begrotingsoverzicht .velden-raster input,
  .begrotingsoverzicht .velden-raster select {
    min-height: 38px;
    padding-top: 7px;
    padding-bottom: 7px;
  }
  .begrotingsoverzicht .velden-raster textarea { min-height: 38px; padding-top: 7px; padding-bottom: 7px; }
  .begrotingsoverzicht .euroveld .euroteken,
  .begrotingsoverzicht .procentteken { min-height: 38px; min-width: 34px; font-size: 1rem; }
}

/* AC-235.2: de checklist met één regel per punt; de toelichting klapt uit. */
.checklijst li { display: block; padding: 0; }
.checkpunt > summary {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  min-height: 36px;
  padding: var(--sp-2) 0;
  cursor: pointer;
  list-style: none;
}
.checkpunt > summary::-webkit-details-marker { display: none; }
.checkpunt > summary::marker { content: ""; }
.checkpunt > summary:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: var(--radius-knop); }
.checkpunt > summary:hover .checknaam { color: var(--ink); }
.checkchevron { flex: none; color: var(--ink3); }
.checkpunt[open] .checkchevron { transform: rotate(180deg); }
.checkuitleg { margin: 0 0 var(--sp-3) calc(20px + var(--sp-4)); }
.checklist .knoppen { margin-top: var(--sp-4); }
.checklist .verwijderdeel { margin-top: var(--sp-5); }

/* AC-235.6: "Overzicht realisatie" naast "Regel toevoegen" in de kop. */
.tabkop-acties { display: flex; flex-wrap: wrap; gap: var(--sp-3); }

/* AC-235.5: de regeltabellen in de lijststijl. */
.regellijst th, .regellijst td { padding: var(--sp-4) var(--sp-6); vertical-align: middle; }
.regellijst thead th.acties { text-align: right; }
.regellijst td.acties { text-align: right; white-space: nowrap; }
.regelkop { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2); }
.regelkop .regelnaam { display: inline; }
.regelkop .regellabel { margin-top: 0; }
.rijchevron {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 28px;
  height: 28px;
  margin-left: calc(-1 * var(--sp-2));
  border-radius: var(--radius-knop);
  color: var(--ink3);
}
.rijchevron:hover { background: var(--surf3); color: var(--ink); }
.rijchevron:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.rijchevron[aria-expanded="true"] svg { transform: rotate(90deg); }
.regelacties { display: inline-flex; align-items: center; justify-content: flex-end; gap: var(--sp-2); }
.regelacties .rijknop + .rijknop { margin-left: 0; }
.regelacties .knop.klein { min-height: 32px; box-sizing: border-box; }
button.rijknop { padding: 0; cursor: pointer; }
button.rijknop[disabled] { cursor: not-allowed; opacity: 0.45; }
.uitklaprij > td {
  background: var(--surf2);
  border-top: 0;
  padding: var(--sp-3) var(--sp-6) var(--sp-5) calc(var(--sp-6) + 28px);
}
.regeldetails {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
  gap: var(--sp-3) var(--sp-7);
  margin: 0;
}
.regeldetails > div { margin: 0; }
.regeldetails > .breed { grid-column: 1 / -1; }
.regeldetails dt { font-size: var(--fs-meta); font-weight: 600; color: var(--ink3); }
.regeldetails dd { margin: 0; color: var(--ink); }

/* .overslaan schuift tekst 999px naar links; binnen het gepositioneerde
   .tipvak en de overflowwrapper van de tabel bleef die dan zichtbaar. Hier
   de gangbare visueel-verborgen vorm, zodat de tekst voor een schermlezer
   blijft maar niet in beeld komt. */
.regellijst .overslaan {
  position: absolute;
  left: auto;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* De tooltip bij een info-icoon (en bij de uitgeschakelde bewerkknop): bij
   hover én bij focus (toetsenbord), Esc verbergt hem (begrotingstabs.js).
   Rechts van het icoon, zodat de overflowwrapper van de tabel hem boven de
   eerste of onder de laatste rij niet afsnijdt. */
.tipvak { position: relative; display: inline-flex; align-items: center; }
.tip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  padding: 0;
  border: 0;
  border-radius: var(--radius-pil);
  background: transparent;
  font: inherit;
}
.tip:hover { background: var(--surf3); }
.tip:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
.tip-tekst {
  display: none;
  position: absolute;
  top: 50%;
  left: 100%;
  transform: translateY(-50%);
  z-index: 40;
  width: max-content;
  max-width: 18rem;
  margin-left: var(--sp-2);
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--radius-knop);
  background: var(--ink);
  color: var(--surf);
  box-shadow: var(--shadow2);
  font-size: var(--fs-meta);
  font-weight: 400;
  line-height: 1.4;
  text-align: left;
  white-space: normal;
}
.tipvak.links > .tip-tekst { left: auto; right: 100%; margin-left: 0; margin-right: var(--sp-2); }
.tipvak:hover > .tip-tekst,
.tipvak:focus-within > .tip-tekst { display: block; }
.tipvak[data-tip-dicht] > .tip-tekst { display: none; }

/* US-306: in een inschuifpaneel (ook in de overlay, .paneeloverlay-venster met
   overflow: hidden) klapt de tooltip niet opzij buiten het paneel, waar hij
   werd afgesneden, maar onder de alinea met het icoon, over de breedte van
   die alinea. Het tipvak positioneert dan niet zelf; zijn ouder is het kader,
   zodat de tooltip binnen het paneel blijft en boven de velden eronder ligt. */
.inschuifpaneel :has(> .tipvak) { position: relative; }
.inschuifpaneel .tipvak { position: static; }
.inschuifpaneel .tipvak > .tip-tekst,
.inschuifpaneel .tipvak.links > .tip-tekst {
  top: 100%;
  left: 0;
  right: 0;
  transform: none;
  width: auto;
  max-width: none;
  margin: var(--sp-2) 0 0;
  z-index: 50;
}

/* AC-235.7: de samenvattingsregel op het tabblad Transacties. */
.begrotingstotaal { margin: 0 0 var(--sp-5); gap: var(--sp-2) var(--sp-3); }
.begrotingstotaal > span:first-child { font-weight: 600; color: var(--ink2); }
.tekortchip {
  display: inline-block;
  padding: 1px var(--sp-3);
  border: 1px solid var(--dangerline);
  border-radius: var(--radius-pil);
  background: var(--dangersoft);
  color: var(--danger);
  font-size: var(--fs-micro);
  font-weight: 600;
}

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* AC-197 / AC-4.10: een duimvlak van 44px voor alles wat op de rij tikbaar is. */
  .rijchevron { width: 44px; height: 44px; }
  .tip { width: 44px; height: 44px; }
  .regelacties .knop.klein { min-height: 44px; }
  .checkpunt > summary { min-height: 44px; }
  /* De omschrijving houdt op een telefoon genoeg breedte voor chevron en
     naam op één regel; de tabel schuift horizontaal (AC-4.9). */
  .regellijst th[scope="row"] { min-width: 12rem; }
  .tabkop-acties { width: 100%; }
  .tabkop-acties .knop { flex: 1 1 auto; }
}
/* --- einde US-235 --- */

/* --- FB-027 — keuzelijsten met een eigen pijltje (Pascal 2026-10-01: "die pijltjes van de
   dropdowns staan wel erg op de rand; fix het gelijk voor alle dropdowns"). Het pijltje van de
   browser verdwijnt; in de plaats komt een chevron uit twee verlopen in de gedempte tekstkleur,
   op 16px van de rand, met ruimte rechts zodat de tekst er niet onder loopt. Alleen tokens (licht
   en donker volgen vanzelf), geen afbeelding (CSP). Bewust achteraan en alleen background-image/
   -position/-size/-repeat: regels met de background-shorthand (zoals het AI-voorstel) wissen
   het pijltje zo niet. Lijsten met meerdere zichtbare regels houden hun eigen weergave. */
select:not([multiple]):not([size]) {
  -webkit-appearance: none;
  appearance: none;
  padding-right: 40px;
  background-image:
    linear-gradient(45deg, transparent 50%, var(--ink2) 50%),
    linear-gradient(135deg, var(--ink2) 50%, transparent 50%);
  background-position:
    calc(100% - 21px) 50%,
    calc(100% - 16px) 50%;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
}
select:not([multiple]):not([size]):disabled { opacity: .6; }
.veld[data-voorstel="true"] .voorstelinvoer > select:not([multiple]):not([size]) {
  padding-right: 68px;
  background-position: calc(100% - 49px) 50%, calc(100% - 44px) 50%;
}
/* --- einde FB-027 --- */

/* --- US-239 — Speltakdashboard: saldorij en rechterkolom blijven staan (FB-026, ADR-0169) ---
   Het document scrolt; de kopbalk is boven 600px al sticky (top 0, z-index 50).
   Alleen op een venster dat breed én hoog genoeg is: op een telefoon en in een
   laag venster scrolt alles mee (AC-239.3).

   1. De saldorij kleeft direct onder de kopbalk. Ze krijgt de paginakleur als
      dekkende ondergrond en schuift met een negatieve marge tot de randen van
      .inhoud (28px), zodat er links, rechts en boven niets van de lijst langs
      of door schijnt. De ruimte erboven en eronder was marge en is nu padding
      in dezelfde maat (--sp-7), dus in rust staat alles op dezelfde plek.
      z-index 10: boven de lijst (ook de dagkoppen, die in de transactiekaart
      niet sticky zijn), onder de kopbalk (50) en de panelen.
   2. De rechterkolom kleeft direct onder de saldorij. Takenplaats en
      zijkolom blijven twee losse rasterkinderen — de broncodevolgorde Taken →
      lijst → Nieuw vastleggen is de mobiele volgorde én de tabvolgorde
      (AC-122.12), en een omhullend element kan die volgorde niet bewaren.
      Daarom lopen beide over alle rijen (dan is hun stickygebied de volle
      hoogte van het raster) en schuift de zijkolom zelf onder de takenkaart.
      De hoogtes daarvoor meet dashboardkleven.js; zonder script staat
      data-kleven er niet en blijft de rechterkolom zoals hij was. */
@media (min-width: 601px) and (min-height: 700px) {
  .speltakkop {
    position: sticky;
    top: var(--kopbalk-hoogte, 64px);
    z-index: 10;
    margin: 0 -28px;
    padding: var(--sp-7) 28px;
    background: var(--bg);
  }

  /* Een anker of een toetsenbordfocus in de lijst valt niet onder de kopbalk
     en de saldorij (WCAG 2.4.11). */
  html:has(.speltakkop) {
    scroll-padding-top: calc(var(--kopbalk-hoogte, 64px) + var(--saldorij-hoogte, 124px) + var(--sp-3));
  }

  .dashboardkolommen[data-kleven] {
    --kleef-top: calc(var(--kopbalk-hoogte, 64px) + var(--saldorij-hoogte, 124px));
  }
  .dashboardkolommen[data-kleven] > .takenplaats,
  .dashboardkolommen[data-kleven] > .zijkolom {
    grid-row: 1 / -1;
    align-self: start;
    position: sticky;
  }
  /* Past de kolom niet in het venster, dan scrolt alleen de takenkaart binnen
     zichzelf (de scrollbalk is de subtiele van de hele app); "Nieuw
     vastleggen" blijft eronder in beeld. De 8px padding met negatieve marge
     laat de schaduw van de kaart (--shadow2) binnen het scrollvak. */
  .dashboardkolommen[data-kleven] > .takenplaats {
    top: var(--kleef-top);
    max-height: calc(100vh - var(--kleef-top) - var(--zijkolom-ruimte, 0px) - var(--sp-7));
    overflow-y: auto;
    padding: 0 8px 8px;
    margin: 0 -8px -8px;
  }
  .dashboardkolommen[data-kleven] > .zijkolom {
    top: calc(var(--kleef-top) + var(--taken-ruimte, 0px));
    margin-top: var(--taken-ruimte, 0px);
  }
}
/* --- einde US-239 --- */

/* =====================================================================
   US-241 — Paneel over de pagina erachter, met een lichte blur
   (FB-031; AC-241.1, AC-241.2; ADR-0171, aanvulling op ADR-0116)

   Achter elk geopend inschuifpaneel blijft de pagina zichtbaar onder een
   lichte verduistering met blur. Browsers zonder backdrop-filter houden
   alleen de verduistering van US-152 (die iets donkerder is, omdat er dan
   geen blur is die de achtergrond rustig maakt). De kleur en de sterkte
   zijn tokens, met eigen waarden voor het donkere thema.

   De klasse paneel-naar-achtergrond zet wwwroot/js/paneeloverlay.js op <html>
   op het moment dat een volledige paneelpagina naar zijn achtergrond
   doorverwijst: dan flitst het paneel niet nog even op een lege vlakte.
   ===================================================================== */
:root {
  --paneel-scrim: rgba(10, 20, 14, .28);
  --paneel-scrim-zonder-blur: rgba(10, 20, 14, .4);
  --paneel-blur: 2px;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --paneel-scrim: rgba(0, 0, 0, .4);
    --paneel-scrim-zonder-blur: rgba(0, 0, 0, .55);
  }
}

:root[data-theme="dark"] {
  --paneel-scrim: rgba(0, 0, 0, .4);
  --paneel-scrim-zonder-blur: rgba(0, 0, 0, .55);
}

.paneeloverlay .paneeloverlay-achtergrond {
  background: var(--paneel-scrim-zonder-blur);
}

@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
  .paneeloverlay .paneeloverlay-achtergrond {
    background: var(--paneel-scrim);
    -webkit-backdrop-filter: blur(var(--paneel-blur));
    backdrop-filter: blur(var(--paneel-blur));
  }
}

.paneel-naar-achtergrond .paneelscherm { visibility: hidden; }
/* --- einde US-241 --- */

/* --- US-242 — Uitbetalingsdetail volgens het prototype (AC-242.1 t/m
   AC-242.3, ADR-0173). FB-033 (Pascal 2026-10-01): "Te veel informatie direct
   zichtbaar." Het detail volgt nu het declaratiedetail (README §6: twee
   kolommen, rechts 380px via .detailraster) en de uitbetalingskaart (§9): de
   handeling rechts, op een telefoon bovenaan; de uitleg achter de "?"-knop.
   Alleen tokens, dus licht en donker volgen vanzelf. --- */
.uitbetdetailkop h1 { margin-right: var(--sp-2); }

/* "Over te maken": label boven de waarde, de waarde met kopieerknop ernaast. */
.overmaaklijst { display: grid; gap: var(--sp-5); margin: 0 0 var(--sp-7); }
.overmaakregel > dt { margin: 0 0 var(--sp-1); font-size: var(--fs-meta); color: var(--ink3); }
.overmaakregel > dd { margin: 0; }
.overmaakregel > dd.kopieerbaar { display: flex; justify-content: space-between; }
.overmaakregel .uitbetkaart-bedrag { font-size: 19px; }
.overmaakregel .kenmerkcode { flex: 1 1 8rem; }

/* De handeling: "Markeer als betaald" vult de breedte naast "Intrekken" en het
   betaalformulier klapt eronder open, over de volle kaartbreedte (AC-234.3). */
.uitbetdetail-actie .werkrij-acties { margin-top: 0; }
.uitbetdetail-actie .betaalpaneel { flex: 1 1 10rem; }
.uitbetdetail-actie .betaalpaneel > summary.knop { width: 100%; justify-content: center; }
.uitbetdetail-actie .betaalpaneel[open] { flex-basis: 100%; }
.uitbetdetail-actie .betaalformulier {
  display: grid;
  gap: var(--sp-5);
  margin: var(--sp-5) 0 0;
  padding: var(--sp-5) var(--sp-7);
  background: var(--surf2);
  border: 1px solid var(--line);
  border-radius: var(--radius-knop);
}
.uitbetdetail-actie .betaalformulier .knop { width: 100%; justify-content: center; }
.uitbetdetail-actie .knoppen .knop.gevaar { flex: 1 1 100%; }

/* De declaraties als lijst zoals de kaart Uitbetaling op het declaratiedetail:
   omschrijving en bedrag op de eerste regel, nummer, datum en registratie
   eronder, "Eruit halen" rechts over beide regels. */
.uitbetdetail-lijstkop {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-5);
  margin: 0 0 var(--sp-7);
}
.uitbetdetail-lijstkop > h2 { margin: 0; font-size: var(--fs-kaartkop); font-weight: 600; }
.uitbetdetail-aantal { font-size: var(--fs-meta); color: var(--ink3); }
.uitbetdetail .uitbetregel {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
  align-items: center;
  gap: var(--sp-1) var(--sp-5);
}
.uitbetdetail .uitbetregel-oms { grid-column: 1; }
.uitbetdetail .uitbetregel.totaal { grid-template-columns: minmax(0, 1fr) auto; }
.uitbetdetail .uitbetregel-bedrag { grid-column: 2; grid-row: 1; margin-left: 0; text-align: right; }
.uitbetdetail .uitbetregel-meta { grid-column: 1 / 3; }
.uitbetdetail .uitbetregel > .status { grid-column: 1 / 3; justify-self: start; }
.uitbetdetail .uitbetregel-actie { grid-column: 3; grid-row: 1 / span 2; margin: 0; }

/* Op een telefoon staat de handeling bovenaan, en elk tikdoel is 44px (AC-4.9). */
@media (max-width: 900px), (max-height: 500px) and (pointer: coarse) {
  .uitbetdetail { display: flex; flex-direction: column; }
  .uitbetdetail > .uitbetdetail-actie { order: -1; }
}
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .uitbetdetail .uitbetregel-oms { display: inline-flex; align-items: center; min-height: 44px; }
  .uitbetdetail .uitbetregel-actie .knop.klein { min-height: 44px; }
  .uitbetdetail-actie .werkrij-acties { flex-direction: column; align-items: stretch; }
  .uitbetdetail-actie .werkrij-acties > .knop { width: 100%; justify-content: center; }
  .uitbetdetail-actie .betaalformulier { padding: var(--sp-5); }
}
/* --- einde US-242 --- */

/* --- US-244 — declaratiedetail compact (FB-037, FB-038, ADR-0175).
   De handeling bij de status staat vooraan: in de DOM als eerste blok
   (.detailactie), op een breed scherm rechtsboven naast Algemeen, zodat
   Goedkeuren/Afkeuren en Naar de uitbetaling op 1920x911 zonder scrollen in
   beeld zijn. Op een telefoon staat zij direct onder de kop. Er is geen
   CSS-order: de tabvolgorde is de leesvolgorde. De uitleg staat achter de "?"
   (US-232); de gegevens staan dichter en de bon is een miniatuur. Alleen
   tokens, dus licht en donker volgen vanzelf. */
.actiekaart-kop { margin: 0 0 var(--sp-6); }
.actiekaart-kop > h2 { font-size: var(--fs-kaartkop); font-weight: 600; }

/* Algemeen: twee gegevens per rij op een telefoon, drie op een breed scherm. */
.declgegevens { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-5) var(--sp-7); }
.declgegevens .veldpaar { min-width: 0; }
.declgegevens .veldpaar.breed { grid-column: 1 / -1; }
.declgegevens .veldpaar > dt { margin-bottom: 2px; }
.declgegevens .veldpaar > dd:not(.bedraggroot) { font-size: 14.5px; overflow-wrap: anywhere; }

/* Declarant: IBAN dichter onder de naam. */
.detailrechts .declarantkop + .kaartlabel { margin-top: var(--sp-4); }

/* Aankoopbewijs als miniatuur; de miniatuur is zelf de link "vergroten". */
.bonmini { display: flex; align-items: flex-start; gap: var(--sp-6); }
.bonmini .bonvlak { flex: none; width: 96px; height: 120px; text-decoration: none; }
.bonmini .bonvlak img { max-height: 120px; }
.bonmini .bonvlak:hover { border-color: var(--brand); }
.bonmini .bonvlak:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; }
.bonmini-info { flex: 1 1 auto; min-width: 0; }
.bonmini-info .teller { margin: 0 0 var(--sp-4); overflow-wrap: anywhere; }
.bonmini .bonknoppen { flex-wrap: wrap; }
.bonmini .bonknoppen .knop { flex: 1 1 6.5rem; }

@media (min-width: 901px) and (min-height: 501px), (min-width: 901px) and (pointer: fine), (min-width: 901px) and (pointer: none) {
  .detailraster[data-declraster] { grid-template-rows: auto 1fr; row-gap: 0; }
  .detailraster[data-declraster] > .detailactie { grid-column: 2; grid-row: 1; }
  .detailraster[data-declraster] > .detaillinks { grid-column: 1; grid-row: 1 / span 2; }
  .detailraster[data-declraster] > .detailrechts { grid-column: 2; grid-row: 2; }
  .detailraster[data-declraster="zonder-actie"] > .detailrechts { grid-row: 1 / span 2; }
  .declgegevens { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-6) var(--sp-9); }
}
/* Op een telefoon staan de knoppen onder elkaar (.knoppen wordt een kolom);
   een flex-basis van 8rem of 6.5rem werd daar een hoogte van ruim 100px. Hier
   houden zij hun natuurlijke hoogte (tikdoel 44px, AC-4.9), en Goedkeuren en
   Afkeuren blijven naast elkaar zoals in het prototype. */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .detailraster[data-declraster] .knoppen .knop { flex: 0 0 auto; }
  .detailraster[data-declraster] .beoordeelknoppen { flex-direction: row; }
  .detailraster[data-declraster] .beoordeelknoppen .knop { flex: 1 1 0; }
}
/* --- einde US-244 --- */

/* --- US-243 — boekingsformulieren in het inschuifpaneel volgens het prototype
   (AC-243.1, AC-243.2, ADR-0174, FB-034). Geldt alleen binnen een
   form.boekingsform (uitgave, inkomst, declaratie, kasboeking; nieuw en
   bewerken) en de voet van het paneel waarin zo'n formulier staat, zodat
   andere panelen (beheer, uitbetaling, seizoen) onveranderd blijven.

   - Ritme: 18px tussen de velden, 7px tussen label en veld, labels 13px/600;
     een verplicht veld krijgt het rode sterretje achter zijn label (alleen
     visueel; het required-attribuut blijft de drager).
   - .veldrij zet twee velden naast elkaar (bedrag en datum, categorie en
     boekingsreden); onder 601px staan ze weer onder elkaar.
   - Het eurovak en het bedragveld vormen één veld; velden op --surf2.
   - De segmentkeuze Bank/Contant staat zonder fieldsetkader; de gekozen helft
     is de brandkleur. Het tikdoel van 44px blijft (AC-4.9).
   - Optionele onderdelen (begroting, declaratiedetails, toelichting) staan als
     één ingeklapte rij met een chevron.
   - Het bank<->kas-blok is één rij: bank, pijl, kas.
   - De voet: de verwijderknop als icoon van 44px links, Annuleren en de
     primaire knop delen de rest van de breedte.
   Alleen designtokens; licht en donker volgen vanzelf. */
.inschuifpaneel-inhoud .beheerform.boekingsform { gap: var(--sp-8); }
.boekingsform .veld { gap: 7px; }
.boekingsform .veld > label,
.boekingsform fieldset.veld > legend,
.boekingsform .vastlabel {
  font-size: 13px;
  font-weight: 600;
  color: var(--ink);
}
.boekingsform .veld:has([required]) > label::after {
  content: " *" / "";
  color: var(--danger);
}
.boekingsform .veld .teller { font-size: var(--fs-meta); line-height: 1.45; }

.boekingsform .veldrij {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--sp-8) var(--sp-7);
  align-items: start;
}

.boekingsform input:where([type="text"], [type="date"], :not([type])),
.boekingsform select,
.boekingsform textarea { background: var(--surf2); border-color: var(--line2); }

.boekingsform .euroveld { gap: 0; }
.boekingsform .euroveld .euroteken {
  min-width: 40px;
  border-right: 0;
  border-radius: var(--radius-knop) 0 0 var(--radius-knop);
  font-size: 15px;
  font-weight: 400;
}
.boekingsform .euroveld input,
.boekingsform .euroveld .voorstelinvoer > input {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
  text-align: left;
}

.boekingsform fieldset.veld {
  border: 0;
  padding: 0;
  margin: 0;
  min-width: 0;
}
.boekingsform fieldset.veld > legend { padding: 0; margin: 0 0 7px; }
.boekingsform .segment {
  gap: var(--sp-2);
  padding: var(--sp-1);
  border-color: var(--line2);
  background: var(--surf2);
}
.boekingsform .segment .segmentknop span { border-radius: 7px; font-size: var(--fs-secundair); }
.boekingsform .segment .segmentknop input:checked + span {
  background: var(--brand);
  color: var(--brandink);
  box-shadow: none;
}

.boekingsform .uitvouwpaneel {
  margin: 0;
  padding: 0 var(--sp-6);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf2);
}
.boekingsform .uitvouwpaneel > summary {
  min-height: 46px;
  list-style: none;
  font-size: 14px;
  color: var(--ink);
}
.boekingsform .uitvouwpaneel > summary::-webkit-details-marker { display: none; }
.boekingsform .uitvouwpaneel > summary .teller { font-weight: 400; color: var(--ink2); }
.boekingsform .uitvouwpaneel > summary::after {
  content: "";
  flex: none;
  width: 7px;
  height: 7px;
  margin: 0 var(--sp-1) 3px auto;
  border-right: 2px solid var(--ink2);
  border-bottom: 2px solid var(--ink2);
  transform: rotate(45deg);
}
.boekingsform .uitvouwpaneel[open] > summary::after { margin-bottom: -3px; transform: rotate(-135deg); }
.boekingsform .uitvouwpaneel[open] { padding-bottom: var(--sp-6); }
.boekingsform .uitvouwpaneel > summary + * { margin-top: var(--sp-3); }
.boekingsform .uitvouwpaneel > .veld + .veld { margin-top: var(--sp-7); }

.boekingsform .bankkas {
  gap: 0;
  padding: var(--sp-7);
  border-radius: 12px;
}
.boekingsform .bankkas-stroom { display: flex; align-items: center; gap: var(--sp-6); }
.boekingsform .bankkas-regel {
  flex: 1 1 0;
  display: grid;
  grid-template-columns: auto auto;
  justify-content: center;
  align-items: baseline;
  column-gap: var(--sp-2);
  row-gap: var(--sp-1);
  margin: 0;
  text-align: center;
  font-size: 16px;
  font-weight: 600;
}
.boekingsform .bankkas-potje {
  grid-column: 1 / -1;
  min-width: 0;
  font-family: inherit;
  font-size: var(--fs-meta);
  font-weight: 400;
  letter-spacing: normal;
  text-transform: none;
  color: var(--ink2);
}
.boekingsform .bankkas-regel.omhoog { color: var(--credit); }
.boekingsform .bankkas-regel.omlaag { color: var(--debit); }
.boekingsform .bankkas-regel .bankkas-pijl { color: inherit; font-size: 16px; }
.boekingsform .bankkas-tussen { flex: none; color: var(--ink2); }
.boekingsform .bankkas-regeltekst {
  margin: calc(-1 * var(--sp-3)) 0 0;
  font-size: var(--fs-meta);
  line-height: 1.5;
  color: var(--ink2);
}

/* Hangt er al een bon (bewerken), dan is het dropvlak alleen nog de weg naar
   een vervangende: compact, zonder het grote camerasymbool. */
.boekingsform .veld:has(> .bonvoorbeeld:not([hidden])) .bondropvlak { padding: var(--sp-5) var(--sp-7); gap: var(--sp-2); }
.boekingsform .veld:has(> .bonvoorbeeld:not([hidden])) .bondropvlak-icoon { display: none; }
.boekingsform .veld:has(> .bonvoorbeeld:not([hidden])) .bondropvlak-titel { font-size: var(--fs-secundair); }

.inschuifpaneel:has(.boekingsform) .inschuifpaneel-voet { gap: var(--sp-4); }
.inschuifpaneel:has(.boekingsform) .inschuifpaneel-voet > .knop:not(.verwijderknop) { flex: 1 1 0; }
.inschuifpaneel:has(.boekingsform) .inschuifpaneel-voet > .knop.gevaar.verwijderknop:has(svg) {
  flex: none;
  width: 44px;
  padding: 0;
  margin-right: 0;
}
.verwijderknop-tekst {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .boekingsform .veldrij { grid-template-columns: minmax(0, 1fr); }
  .inschuifpaneel:has(.boekingsform) .inschuifpaneel-voet { flex-wrap: nowrap; }
  .inschuifpaneel:has(.boekingsform) .inschuifpaneel-voet > .knop:not(.verwijderknop) { min-width: 0; padding: 0 var(--sp-4); }
}
/* --- einde US-243 --- */

/* --- US-246: uitloggen als POST-formulier in de zijbalk (ADR-0177) ---
   De knop neemt de opmaak over van de zijbalkregels (.zijbalk a): zelfde hoogte,
   ruimte, kleur en hover. De zijbalk bestaat alleen boven 600px; het tikdoel van
   44px op een telefoon (AC-4.9) is daar niet aan de orde. */
.zijbalk-uitloggen { margin: 0; }
.zijbalk-uitloggen button {
  display: flex;
  align-items: center;
  gap: 11px;
  width: 100%;
  min-height: 36px;
  padding: var(--sp-3) var(--sp-4);
  border: 0;
  border-radius: var(--radius-knop);
  background: transparent;
  font-family: inherit;
  font-size: var(--fs-body);
  color: var(--navink2);
  text-align: left;
  cursor: pointer;
}
.zijbalk-uitloggen button:hover { background: rgba(255, 255, 255, .09); }
.zijbalk-uitloggen button > svg { flex: none; }
/* --- einde US-246 --- */

/* US-247 — automatisch bundelen van declaraties in uitbetalingen (ADR-0178, FB-039):
   de uitzonderingslijst "Zonder rekeningnummer" en de regel "Bijgewerkt op". */
.uitbetgroep-wat { flex: 1 1 auto; min-width: 0; }
.uitbetgroep-wat .uitbetgroep-oms { color: inherit; }
.uitbet-bijgewerkt { color: var(--warn); }
/* --- einde US-247 --- */

/* --- US-249 — zoekbare keuzelijst (FB-041, ADR-0180) ---
   wwwroot/js/keuzelijst.js zet elke enkelvoudige keuzelijst met meer dan vijf
   opties om naar een invoerveld met een lijst eronder (WAI-ARIA combobox). De
   echte select blijft in het formulier, onzichtbaar onder het invoerveld: daar
   wijst ook een browsermelding van een leeg verplicht veld naar. Het invoerveld
   neemt de veldopmaak van de generieke regels over en krijgt hetzelfde pijltje
   als de keuzelijsten van FB-027. De lijst staat position: fixed (het script
   zet plek en maximale hoogte), zodat het inschuifpaneel hem niet afkapt.
   Alleen tokens: licht en donker volgen vanzelf. */
.keuzelijst { position: relative; display: grid; min-width: 0; }
.beheerform .keuzelijst { width: 100%; }
.keuzelijst > select.keuzelijst-bron {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  pointer-events: none;
}
.keuzelijst > input.keuzelijst-invoer {
  width: 100%;
  min-width: 0;
  text-overflow: ellipsis;
  cursor: pointer;
  padding-right: 40px;
  background-image:
    linear-gradient(45deg, transparent 50%, var(--ink2) 50%),
    linear-gradient(135deg, var(--ink2) 50%, transparent 50%);
  background-position:
    calc(100% - 21px) 50%,
    calc(100% - 16px) 50%;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
}
.keuzelijst > input.keuzelijst-invoer:focus { cursor: text; }
.keuzelijst > input.keuzelijst-invoer:disabled { opacity: .6; cursor: default; }
.keuzelijst > input.keuzelijst-invoer::placeholder { color: var(--ink2); opacity: 1; }
.veld[data-voorstel="true"] .keuzelijst > input.keuzelijst-invoer {
  padding-right: 68px;
  background-position: calc(100% - 49px) 50%, calc(100% - 44px) 50%;
}
.keuzelijst-lijst {
  position: fixed;
  z-index: 70;
  box-sizing: border-box;
  max-height: 320px;
  overflow-y: auto;
  overscroll-behavior: contain;
  margin: 0;
  padding: var(--sp-1);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf);
  color: var(--ink);
  box-shadow: var(--shadow);
  font-size: var(--fs-body);
}
.keuzelijst-lijst[hidden] { display: none; }
.keuzelijst-optie {
  display: flex;
  align-items: center;
  min-height: 36px;
  box-sizing: border-box;
  padding: var(--sp-2) var(--sp-4);
  border-radius: 6px;
  cursor: pointer;
  overflow-wrap: anywhere;
}
.keuzelijst-optie[aria-selected="true"] { font-weight: 600; color: var(--brandtext); }
.keuzelijst-optie.is-actief { background: var(--brandsoft); }
.keuzelijst-optie[aria-disabled="true"] { color: var(--ink3); cursor: default; }
.keuzelijst-optie mark { background: transparent; color: inherit; font-weight: 700; }
.keuzelijst-groep {
  padding: var(--sp-3) var(--sp-4) var(--sp-1);
  font-size: var(--fs-meta);
  font-weight: 600;
  color: var(--ink2);
}
.keuzelijst-leeg { padding: var(--sp-4); color: var(--ink2); font-style: italic; }

@media (hover: hover) {
  .keuzelijst-optie:not([aria-disabled="true"]):hover { background: var(--surf3); }
  .keuzelijst-optie.is-actief:hover { background: var(--brandsoft); }
}

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* Tikdoel van 44px op een telefoon (AC-4.9). */
  .keuzelijst-optie { min-height: 44px; }
}
/* --- einde US-249 --- */
/* --- US-248: live zoeken met een kruisje in het zoekveld (FB-040, ADR-0179) ---
   Met JavaScript (html[data-js], gezet door thema-vroeg.js vóór de eerste
   paint) zoekt een formulier met data-livezoek tijdens het typen en is de
   verstuurknop overbodig; zonder JavaScript blijft hij staan en verstuurt Enter
   het formulier (ADR-0037). Het kruisje staat rechts in het veld, alleen als er
   tekst staat ([hidden] anders). Het eigen wisknopje van de browser bij
   type="search" verdwijnt, anders staan er twee kruisjes. Tikdoel: zo hoog als
   het veld (44px, AC-4.9) en 40px breed. */
html[data-js] form[data-livezoek] .livezoek-verstuur { display: none; }
.zoekinvoer {
  position: relative;
  display: block;
}
.zoekinvoer > input {
  width: 100%;
  padding-right: 44px;
}
.zoekinvoer > input::-webkit-search-cancel-button {
  -webkit-appearance: none;
  appearance: none;
  display: none;
}
.zoekwis {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  min-height: 44px;
  color: var(--ink3);
  font-size: 1rem;
  line-height: 1;
  text-decoration: none;
}
/* Pascal 2-10: geen grijs blok over de volle veldhoogte bij hover, maar een klein
   rond knopje; het tikdoel blijft de volle 40x44px van de link. */
.zoekwis > span {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  transition: background-color .12s, color .12s;
}
.zoekwis:hover { color: var(--ink); text-decoration: none; }
.zoekwis:hover > span { background: var(--surf3); }
.zoekwis:focus-visible { outline: none; }
.zoekwis:focus-visible > span { outline: 2px solid var(--focus); outline-offset: 1px; }
.zoekwis[hidden] { display: none; }

/* FB-044: de geopende "Zoek in alles" tekende boven 600px over de kopbalk heen,
   dwars over de seizoenkiezer. Het venster begint nu onder de kopbalk
   (--zoekoverlay-boven, gemeten door zoekoverlay.js bij het openen; 64px als
   terugval) met dezelfde lucht als de rest van de pagina. De gedimde
   achtergrond bedekt de kopbalk nog wel, zodat duidelijk is dat de overlay
   open is. Op een telefoon blijft het venster een volle-breedte vlak bovenaan
   met een eigen achtergrond: dat bedekt de kopbalk geheel in plaats van half. */
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .zoekoverlay { padding-top: calc(var(--zoekoverlay-boven, 64px) + var(--sp-7)); }
}
/* Op een telefoon tekenden de tabbalk (60) en de cameraknop (61) over de
   geopende overlay (56) heen. Het is een modaal venster (aria-modal), dus het
   ligt boven die twee; onder de toast (70) en de scrim (200). */
.zoekoverlay { z-index: 62; }

/* FB-046: de filterchips (Declaraties, Mijn declaraties) waren zware knoppen
   van 44px met een volle groene actieve stand. Nu een rustige gesegmenteerde
   keuze: één omlijnd vak met kale opties erin, de actieve in brandsoft met
   brandtekst — zichtbaar, maar geen primaire knop. aria-current blijft het
   tweede signaal naast de kleur (AC-4.13). Meerdere filters staan in een
   .filterbalk naast elkaar op één regel waar dat past. Boven 600px is een
   optie 32px hoog (muisdoel, ≥ 24px); op een telefoon blijft het 44px
   (AC-4.9, Tikdoelen). */
.filterbalk {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-3) var(--sp-7);
  margin: var(--sp-7) 0 0;
}
.filterbalk > .filterchips { margin: 0; }
.filterchips {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 2px;
  padding: 2px;
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf);
}
.filterchip {
  min-height: 32px;
  padding: 0 var(--sp-5);
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--ink2);
  font-weight: 500;
}
.filterchip:hover { filter: none; background: var(--surf3); color: var(--ink); }
.filterchip.actief {
  background: var(--brandsoft);
  border-color: transparent;
  color: var(--brandtext);
  font-weight: 600;
}
.filterchip.actief:hover { background: var(--brandsoft); color: var(--brandtext); }
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .filterchip { min-height: 44px; }
}
/* --- einde US-248 --- */

/* --- US-250/US-251: speltakdashboard en Wie is actief (FB-042, FB-043, FB-045) ---
   a) De lege toestand in de kaart Taken (dashboard en /werkbakje) kreeg de
      algemene .kaartleeg-opmaak: een eigen rand, achtergrond en afgeronde
      hoeken, en stond zo als een doosje ín de kaart (FB-043). In de takenkaart
      is het gewoon een regel tekst, zoals de kaartvoet eronder.
   b) Een afgeleide declaratietaak (ADR-0181) is een link in plaats van een
      knop; hij krijgt dezelfde regelopmaak, zonder onderstreping.
   c) "Resultaat dit seizoen" (ADR-0181): het teken draagt de betekenis, de
      kleur versterkt alleen (AC-4.13). Op een telefoon staat het blok in de
      gekleurde kop en houdt het de kleur van die kop.
   d) Het label "groepsbreed" op Wie is actief (US-251, ADR-0182). */
.takenkaart .kaartleeg {
  text-align: left;
  background: none;
  border: 0;
  border-radius: 0;
  box-shadow: none;
}
a.taakknop { text-decoration: none; }
a.taakknop:focus-visible { outline: 2px solid var(--brand); outline-offset: -2px; }
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .saldopaneel.resultaat .waarde.bij { color: var(--credit); }
  .saldopaneel.resultaat .waarde.af { color: var(--debit); }
}
.rollabel {
  display: inline-block;
  margin-left: var(--sp-2);
  padding: 0 var(--sp-3);
  border: 1px solid var(--line);
  border-radius: var(--radius-pil);
  color: var(--ink2);
  font-size: var(--fs-micro);
  line-height: 18px;
}
/* --- einde US-250/US-251 --- */
/* --- US-252: interne overboeking op het uitgaveformulier van de groepsrekening
   (FB-047, functioneel ontwerp 8.5). Een fieldset met het vinkje bovenaan en de
   velden van de overboeking eronder, op dezelfde afstanden als de rest van het
   boekingsformulier. Het vinkje zelf krijgt geen verplicht-sterretje: alleen de
   velden eronder zijn (met het vinkje aan) verplicht. Alleen designtokens. --- */
.boekingsform .internoverboeking { gap: var(--sp-5); }
.boekingsform .internoverboeking > label.vink::after { content: none; }
.boekingsform .internoverboeking-velden {
  display: grid;
  gap: var(--sp-7);
  padding-left: var(--sp-7);
  border-left: 2px solid var(--line);
}
/* --- einde US-252 --- */

/* --- US-253: vaste lasten van de groepsrekening (FB-048, ADR-0184) ---
   De lijst, het paneel van een vaste last met zijn overeenkomsten en de
   dashboardkaart. Alleen eigen klassen (vastelast-…), zodat niets anders
   meebeweegt. Op een telefoon houden alle knoppen een tikdoel van 44px. */
.vastelast-beeindigd { color: var(--ink2); }
.vastelast-waarschuwing {
  display: block;
  font-size: var(--fs-meta);
  font-weight: 500;
  color: var(--warn);
}
.vastelast-kop { margin-top: 0; }
.vastelast-blok { margin-top: var(--sp-9); }
.vastelast-blok h2 { font-size: 1rem; margin: 0 0 var(--sp-3); }
.vastelast-blok h3 { font-size: 0.95rem; margin: 0 0 var(--sp-3); }
.vastelast-lijst {
  list-style: none;
  margin: 0 0 var(--sp-7);
  padding: 0;
  border-top: 1px solid var(--line2);
}
.vastelast-lijst li {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-3) var(--sp-5);
  padding: var(--sp-4) 0;
  border-bottom: 1px solid var(--line2);
}
.vastelast-regel {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-2) var(--sp-4);
  min-width: 0;
  overflow-wrap: anywhere;
}
.vastelast-lijst li > .vastelast-regel:first-child { flex: 1 1 100%; }
.vastelast-vervallen { color: var(--ink2); }
.vastelast-vervallen strong { text-decoration: line-through; }
.vastelast-vervalform { margin: 0 0 0 auto; }
.vastelast-vervalform .knop.klein { min-height: 32px; }
.vastelast-uploadform {
  margin-top: var(--sp-5);
  padding: var(--sp-7);
  border: 1px dashed var(--line2);
  border-radius: var(--radius-knop);
}
.vastelast-uploadform input[type="file"] { max-width: 100%; }
.vastelast-laatst { margin-top: 0; }
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .vastelast-vervalform { margin-left: 0; }
  .vastelast-vervalform .knop.klein,
  .rijacties .knop.klein { min-height: 44px; }
}
/* --- einde US-253 --- */

/* =====================================================================
   FB-049: een knop naast een rijknop in de kolom Acties (o.a. Vaste
   lasten: "Uitgave boeken" + potlood) staat op één lijn en even hoog.
   ===================================================================== */
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .rijacties .knop,
  .rijacties .rijknop { vertical-align: middle; }
  .rijacties .knop.klein { display: inline-flex; align-items: center; min-height: 32px; padding-block: 0; }
  .rijacties .knop + .rijknop { margin-left: var(--sp-2); }
}
/* --- FB-051: een vaste last als volle pagina (nazorg US-253, FB-050) ---
   De indeling van het declaratie- en uitbetalingsdetail (README §6,
   .detailraster): een kop met titel, status en "Uitgave boeken" rechts;
   rechts (380px) de kaart Gegevens, links Overeenkomsten en Geboekte
   uitgaven. De kaart Gegevens staat in de DOM eerst, zodat zij op een
   telefoon direct onder de kop staat; op een breed scherm zet het raster
   haar rechts. Alleen tokens, dus licht en donker volgen vanzelf. */
.paginatitel.vastelastkop { align-items: center; margin: 0 0 var(--sp-8); }
.vastelastkop-actie { margin-left: auto; }
/* Kerngegevens: twee per rij, ook op een breed scherm (de kolom is 380px). */
.vastelastdetail .vastelastgegevens { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-5) var(--sp-7); }
.vastelastdetail .vastelast-gegevensform { margin-top: var(--sp-5); }
.vastelastdetail .vastelast-gegevensform .knoppen { margin: 0; }
/* "Overeenkomst toevoegen" onder de lijst, gescheiden door een lijn zoals het
   verwijderdeel in een kaart; geen kaart in een kaart (R-016). */
.vastelastdetail .vastelast-uploadform {
  margin-top: var(--sp-7);
  padding: var(--sp-7) 0 0;
  border: none;
  border-top: 1px solid var(--line);
  border-radius: 0;
}
.vastelastdetail .vastelast-uploadform h3 { margin: 0; font-size: var(--fs-secundair); font-weight: 600; }
.vastelastdetail .vastelast-uploadform .veldrij { display: grid; gap: var(--sp-7); align-items: start; }
.vastelastdetail .vastelast-uploadform .knoppen { margin: 0; }
.vastelastdetail .vastelast-lijst { margin-bottom: 0; }
.vastelast-boekingen th,
.vastelast-boekingen td { white-space: nowrap; }
@media (min-width: 901px) and (min-height: 501px), (min-width: 901px) and (pointer: fine), (min-width: 901px) and (pointer: none) {
  .vastelastdetail > .detailrechts { grid-column: 2; grid-row: 1; }
  .vastelastdetail > .detaillinks { grid-column: 1; grid-row: 1; }
  .vastelastdetail .vastelast-uploadform .veldrij { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .vastelastkop-actie { flex: 1 1 100%; margin-left: 0; justify-content: center; box-sizing: border-box; }
  .vastelastdetail .vastelast-uploadform .knop { width: 100%; justify-content: center; }
  /* De tabel scrolt binnen de kaart (.overflow-x); smallere cellen houden
     periode, datum en bedrag in beeld. */
  .vastelast-boekingen th,
  .vastelast-boekingen td { padding-inline: var(--sp-4); }
}
/* --- einde FB-051 --- */

/* =====================================================================
   FB-054: de rechterkolom van het speltakdashboard (Taken, Nieuw
   vastleggen) is even breed als de meest rechtse saldokaart erboven. Het
   aantal kaarten hangt af van contant geld (4 met, 3 of 2 zonder), dus de
   breedte volgt het aantal <li> in .saldopanelen via :has(). De rechterranden
   vallen samen, dus bij gelijke breedte vallen ook de linkerranden samen.
   Pas vanaf 1400px: smaller wordt de kolom te krap voor de takenkaart en
   blijft de vaste 348px gelden.
   ===================================================================== */
@media (min-width: 1400px) {
  .saldopanelen.speltakkop { grid-template-columns: repeat(var(--saldokolommen, 3), minmax(0, 1fr)); }
  .saldopanelen.speltakkop:has(> li:nth-child(2):last-child) { --saldokolommen: 2; }
  .saldopanelen.speltakkop:has(> li:nth-child(4):last-child) { --saldokolommen: 4; }
  .saldopanelen.speltakkop ~ .dashboardkolommen {
    grid-template-columns: minmax(0, 1fr) calc((100% - (var(--saldokolommen, 3) - 1) * var(--sp-6)) / var(--saldokolommen, 3));
  }
  .saldopanelen.speltakkop:has(> li:nth-child(2):last-child) ~ .dashboardkolommen { --saldokolommen: 2; }
  .saldopanelen.speltakkop:has(> li:nth-child(4):last-child) ~ .dashboardkolommen { --saldokolommen: 4; }
}
/* Het bedrag in een taakregel breekt niet tussen het euroteken en het getal. */
.taakvoet .bedrag { white-space: nowrap; }
/* --- einde FB-050 --- */

/* =====================================================================
   US-255 (FB-053, ADR-0186): kopcel en cellen van een kolom lijnen gelijk
   uit, en een rij of kaart met een detail is in zijn geheel klikbaar.

   (a) Uitlijning. De kolomdefinitie is de enige bron (Tabelkolom.Getal):
       bedragen en aantallen rechts, al het andere links, ook datums en
       nummers zoals het prototype ze tekent. De component zet de posities
       van de rechtse kolommen in data-rechts op de tabel; deze regels lijnen
       kopcel en cellen van dezelfde positie met één selector uit, wat een
       rijsjabloon ook op een cel zet. Een rij met een cel over meer kolommen
       (een bevestigingsstap, een totaalregel) telt niet mee: daar klopt de
       positie niet. De posities lopen tot Tabelbediening.MaxKolommen (16).
   ===================================================================== */
.tabelblok table[data-rechts] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :is(th, td) {
  text-align: left;
}
.tabelblok table[data-rechts~="1"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(1),
.tabelblok table[data-rechts~="2"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(2),
.tabelblok table[data-rechts~="3"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(3),
.tabelblok table[data-rechts~="4"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(4),
.tabelblok table[data-rechts~="5"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(5),
.tabelblok table[data-rechts~="6"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(6),
.tabelblok table[data-rechts~="7"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(7),
.tabelblok table[data-rechts~="8"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(8),
.tabelblok table[data-rechts~="9"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(9),
.tabelblok table[data-rechts~="10"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(10),
.tabelblok table[data-rechts~="11"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(11),
.tabelblok table[data-rechts~="12"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(12),
.tabelblok table[data-rechts~="13"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(13),
.tabelblok table[data-rechts~="14"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(14),
.tabelblok table[data-rechts~="15"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(15),
.tabelblok table[data-rechts~="16"] > :is(thead, tbody, tfoot) > tr:not([data-breed]):not(:has(> [colspan])) > :nth-child(16) {
  text-align: right;
}
/* Het sorteerpijltje hangt in een rechtse kolom links vóór de kop, zodat de
   kop zelf precies boven de rechterrand van de bedragen eindigt. Absoluut
   geplaatst: zo blijft de kop op dezelfde grondlijn als de andere koppen. */
.tabelblok th.getal .sorteerlink { position: relative; }
.tabelblok th.getal .sorteerteken { position: absolute; right: 100%; margin-right: var(--sp-1); }

/* (b) De hele rij klikbaar (wwwroot/js/rijklik.js). Alleen een rij waarvan
       de hoofdlinkcel (data-rijlink) echt een link bevat; een kaart in een
       raster met data-kaartlink. De link zelf blijft de toegankelijke ingang;
       dit is alleen de muisaanwijzer en de hoverkleur. */
.tabelblok table[data-rijlink="1"] > tbody > tr:not([data-breed]):has(> :nth-child(1) a[href]),
.tabelblok table[data-rijlink="2"] > tbody > tr:not([data-breed]):has(> :nth-child(2) a[href]),
.tabelblok table[data-rijlink="3"] > tbody > tr:not([data-breed]):has(> :nth-child(3) a[href]),
.tabelblok table[data-rijlink="4"] > tbody > tr:not([data-breed]):has(> :nth-child(4) a[href]),
.tabelblok table[data-rijlink="5"] > tbody > tr:not([data-breed]):has(> :nth-child(5) a[href]),
.tabelblok table[data-rijlink="6"] > tbody > tr:not([data-breed]):has(> :nth-child(6) a[href]),
.tabelblok table[data-rijlink="7"] > tbody > tr:not([data-breed]):has(> :nth-child(7) a[href]),
.tabelblok table[data-rijlink="8"] > tbody > tr:not([data-breed]):has(> :nth-child(8) a[href]),
.tabelblok table[data-rijlink="9"] > tbody > tr:not([data-breed]):has(> :nth-child(9) a[href]),
.tabelblok table[data-rijlink="10"] > tbody > tr:not([data-breed]):has(> :nth-child(10) a[href]),
.tabelblok table[data-rijlink="11"] > tbody > tr:not([data-breed]):has(> :nth-child(11) a[href]),
.tabelblok table[data-rijlink="12"] > tbody > tr:not([data-breed]):has(> :nth-child(12) a[href]),
.tabelblok table[data-rijlink="13"] > tbody > tr:not([data-breed]):has(> :nth-child(13) a[href]),
.tabelblok table[data-rijlink="14"] > tbody > tr:not([data-breed]):has(> :nth-child(14) a[href]),
.tabelblok table[data-rijlink="15"] > tbody > tr:not([data-breed]):has(> :nth-child(15) a[href]),
.tabelblok table[data-rijlink="16"] > tbody > tr:not([data-breed]):has(> :nth-child(16) a[href]),
.kaartraster[data-kaartlink] > * {
  cursor: pointer;
}
.tabelblok table[data-rijlink="1"] > tbody > tr:not([data-breed]):has(> :nth-child(1) a[href]):hover > *,
.tabelblok table[data-rijlink="2"] > tbody > tr:not([data-breed]):has(> :nth-child(2) a[href]):hover > *,
.tabelblok table[data-rijlink="3"] > tbody > tr:not([data-breed]):has(> :nth-child(3) a[href]):hover > *,
.tabelblok table[data-rijlink="4"] > tbody > tr:not([data-breed]):has(> :nth-child(4) a[href]):hover > *,
.tabelblok table[data-rijlink="5"] > tbody > tr:not([data-breed]):has(> :nth-child(5) a[href]):hover > *,
.tabelblok table[data-rijlink="6"] > tbody > tr:not([data-breed]):has(> :nth-child(6) a[href]):hover > *,
.tabelblok table[data-rijlink="7"] > tbody > tr:not([data-breed]):has(> :nth-child(7) a[href]):hover > *,
.tabelblok table[data-rijlink="8"] > tbody > tr:not([data-breed]):has(> :nth-child(8) a[href]):hover > *,
.tabelblok table[data-rijlink="9"] > tbody > tr:not([data-breed]):has(> :nth-child(9) a[href]):hover > *,
.tabelblok table[data-rijlink="10"] > tbody > tr:not([data-breed]):has(> :nth-child(10) a[href]):hover > *,
.tabelblok table[data-rijlink="11"] > tbody > tr:not([data-breed]):has(> :nth-child(11) a[href]):hover > *,
.tabelblok table[data-rijlink="12"] > tbody > tr:not([data-breed]):has(> :nth-child(12) a[href]):hover > *,
.tabelblok table[data-rijlink="13"] > tbody > tr:not([data-breed]):has(> :nth-child(13) a[href]):hover > *,
.tabelblok table[data-rijlink="14"] > tbody > tr:not([data-breed]):has(> :nth-child(14) a[href]):hover > *,
.tabelblok table[data-rijlink="15"] > tbody > tr:not([data-breed]):has(> :nth-child(15) a[href]):hover > *,
.tabelblok table[data-rijlink="16"] > tbody > tr:not([data-breed]):has(> :nth-child(16) a[href]):hover > * {
  background: var(--surf2);
}
.kaartraster[data-kaartlink] > :hover { background: var(--surf2); }
/* Tekst blijft selecteerbaar en interactieve elementen houden hun eigen
   aanwijzer; het script volgt de rijlink niet bij een selectie of een klik
   op een knop, veld of link. */
.tabelblok table[data-rijlink] > tbody > tr :is(input, select, textarea) { cursor: auto; }
/* Tikdoelen (US-197): het volgnummer op Uitgaven en Inkomsten is sinds
   US-255 een link en krijgt op een telefoon dezelfde 44px als het
   declaratienummer. */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .tabelblok th[scope="row"] > a.volgnr {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }
}
/* --- einde US-255 --- */

/* =====================================================================
   US-256 (FB-056, ADR-0187): een actie rechts op de filterbalk.
   Een .filterbalk-actie schuift naar de rechterrand van de filterbalk, op
   de hoogte van de filters; op een telefoon staat hij over de volle
   breedte onder de filters. Eerste gebruiker: "Declaratie indienen" op
   Mijn declaraties, één knop of een details/summary-menu met per speltak
   een link. Alleen tokens.
   ===================================================================== */
.filterbalk > .filterbalk-actie { margin-left: auto; }
.indienmenu { position: relative; }
.indienmenu > summary { list-style: none; cursor: pointer; }
.indienmenu > summary::-webkit-details-marker { display: none; }
.indienmenu-lijst {
  position: absolute;
  right: 0;
  z-index: 20;
  min-width: 100%;
  margin: var(--sp-1) 0 0;
  padding: var(--sp-1) 0;
  list-style: none;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
}
.indienmenu-lijst a {
  display: flex;
  align-items: center;
  min-height: 44px;
  padding: 0 var(--sp-7);
  color: var(--ink);
  white-space: nowrap;
  text-decoration: none;
}
.indienmenu-lijst a:hover,
.indienmenu-lijst a:focus-visible { background: var(--surf2); color: var(--brandtext); }
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .filterbalk > .filterbalk-actie { flex-basis: 100%; margin-left: 0; }
  .filterbalk-actie > .knop,
  .indienmenu > summary.knop { width: 100%; justify-content: center; box-sizing: border-box; }
  .indienmenu-lijst { position: static; margin-top: var(--sp-2); }
}
/* --- einde US-256 --- */

/* =====================================================================
   FB-063: in de declaratielijst van een uitbetaling staan de bedragen op
   één lijn: verticaal midden naast "Los betalen", en de totaalregel in
   dezelfde bedragkolom als de regels (subgrid over de hele lijst).
   ===================================================================== */
.uitbetdetail .uitbetlijst {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto auto;
}
.uitbetdetail .uitbetlijst > .uitbetregel,
.uitbetdetail .uitbetlijst > .uitbetregel.totaal {
  grid-column: 1 / -1;
  grid-template-columns: subgrid;
}
.uitbetdetail .uitbetregel-bedrag { grid-row: 1 / span 2; align-self: center; }
.uitbetdetail .uitbetregel-meta,
.uitbetdetail .uitbetregel > .status { grid-column: 1; }

/* US-259 — uitbetalingen samenvoegen (ADR-0190, FB-064): een bescheiden voorstel
   in de regel, met per kandidaat een kleine secundaire knop. */
.uitbet-samenvoegen { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); }
.uitbet-samenvoegen form { margin: 0; }
/* --- einde US-259 --- */

/* =====================================================================
   FB-065: een verzendknop die eruitziet als een gewone tekstlink, voor
   bescheiden handelingen zoals "Samenvoegen met U-…". Het tikdoel blijft
   24px op desktop en 44px op een telefoon.
   ===================================================================== */
.linkknop {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
  padding: 0;
  border: 0;
  background: none;
  color: var(--brandtext);
  font: inherit;
  font-weight: 600;
  text-decoration: underline;
  text-underline-offset: 2px;
  cursor: pointer;
}
.linkknop:hover { color: var(--ink); }
.linkknop:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: 2px; }
.uitbet-samenvoegen { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-1) var(--sp-4); }
.uitbet-samenvoegen > form { margin: 0; }
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .linkknop { min-height: 44px; }
}

/* =====================================================================
   US-264 (ADR-0193): duidelijk zichtbaar dat de AI bezig is.
   Fase 1 "Bon lezen…" met een draaiend rondje; fase 2 een eigen regel met een
   fonkelicoon terwijl de AI de bon controleert (en een boekingsreden zoekt),
   en een rustige pulserende rand op de velden die de AI nog kan invullen.
   Alleen designtokens, dus vanzelf goed in licht en donker. De iconen zijn
   versiering: de tekst draagt de betekenis (AC-4.13). Bij
   prefers-reduced-motion beweegt er niets; de tekst en de statische
   markering blijven.
   ===================================================================== */
.voorstelbezig {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
}
.voorstelspinner {
  flex: none;
  display: inline-block;
  width: 14px;
  height: 14px;
  border: 2px solid var(--infoline);
  border-top-color: var(--info);
  border-radius: 50%;
  animation: pcash-draai .8s linear infinite;
}
.voorstelai {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  margin: 0;
  padding: var(--sp-3) var(--sp-5);
  border: 1px solid var(--infoline);
  border-radius: var(--radius-knop);
  background: var(--infosoft);
  color: var(--info);
  font-size: var(--fs-secundair);
  font-weight: 600;
}
.voorstelai-icoon {
  flex: none;
  animation: pcash-fonkel 1.4s ease-in-out infinite;
}
.voorstelai[data-klaar="true"] .voorstelai-icoon { animation: none; }
.veld[data-aibezig="true"] input,
.veld[data-aibezig="true"] select,
.veld[data-aibezig="true"] textarea {
  border-color: var(--info);
  animation: pcash-aipuls 1.6s ease-in-out infinite;
}
/* "Even wachten: de AI controleert de bon…" bij de verzendknop. */
.aiwacht {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  flex: 1 1 100%;
  margin: 0;
  color: var(--info);
  font-size: var(--fs-secundair);
  font-weight: 600;
}
.inschuifpaneel-voet:has(> .aiwacht) { flex-wrap: wrap; }
@keyframes pcash-draai { to { transform: rotate(360deg); } }
@keyframes pcash-fonkel {
  0%, 100% { transform: scale(.85) rotate(0deg); opacity: .6; }
  50% { transform: scale(1.1) rotate(20deg); opacity: 1; }
}
@keyframes pcash-aipuls {
  0%, 100% { box-shadow: 0 0 0 0 var(--infoline); }
  50% { box-shadow: 0 0 0 4px var(--infoline); }
}
@media (prefers-reduced-motion: reduce) {
  .voorstelspinner,
  .voorstelai-icoon,
  .veld[data-aibezig="true"] input,
  .veld[data-aibezig="true"] select,
  .veld[data-aibezig="true"] textarea { animation: none; }
  .veld[data-aibezig="true"] input,
  .veld[data-aibezig="true"] select,
  .veld[data-aibezig="true"] textarea { box-shadow: 0 0 0 2px var(--infoline); }
}
/* --- einde US-264 --- */

/* Schermdiagnose op de profielpagina (2026-10-03). */
.inline-kop { display: inline; font-size: inherit; margin: 0; }
.schermdiagnose { display: grid; grid-template-columns: auto 1fr; gap: var(--sp-2) var(--sp-5); margin: var(--sp-5) 0 0; font-size: var(--fs-meta); }
.schermdiagnose dt { color: var(--ink3); }
.schermdiagnose dd { margin: 0; font-family: var(--font-mono, monospace); overflow-wrap: anywhere; }

/* =====================================================================
   US-265 (ADR-0194): op een telefoon (a) tabbladen Transacties en Taken op
   het speltakdashboard en (b) een zwevende "+" die uitklapt tot alle
   toevoegacties. Boven 600px verandert er niets: de tabstrook blijft
   verborgen (hidden, dashboardtabs.js zet hem alleen onder 601px aan) en de
   lijst en het scrim van het menu bestaan daar niet.

   Alleen tokens (AC-4.11). Beweging is kort en rustig en verdwijnt bij
   prefers-reduced-motion.
   ===================================================================== */

/* --- (a) Tabbladen --------------------------------------------------- */
.dashboardtabs {
  position: relative;
  display: grid;
  grid-template-columns: 1fr 1fr;
  margin: 0 0 var(--sp-7);
  padding: var(--sp-1);
  border-radius: var(--radius-pil);
  background: var(--surf3);
  border: 1px solid var(--line);
}
.dashboardtabs[hidden] { display: none; }
/* De schuivende pil achter het gekozen tabblad: CSS alleen, op basis van
   data-actief op de strook (geen inline stijl, CSP). */
.dashboardtabs-pil {
  position: absolute;
  top: var(--sp-1);
  bottom: var(--sp-1);
  left: var(--sp-1);
  width: calc(50% - var(--sp-1));
  border-radius: var(--radius-pil);
  background: var(--surf);
  box-shadow: var(--shadow2);
  transition: transform .22s cubic-bezier(.2, .8, .2, 1);
}
.dashboardtabs[data-actief="taken"] .dashboardtabs-pil { transform: translateX(100%); }
.dashboardtab {
  position: relative;
  z-index: 1;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  border: 0;
  border-radius: var(--radius-pil);
  background: transparent;
  color: var(--ink2);
  font: inherit;
  font-size: var(--fs-body);
  font-weight: 600;
  cursor: pointer;
  transition: color .18s ease;
}
.dashboardtab[aria-selected="true"] { color: var(--brandtext); }
.dashboardtab:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.dashboardtab-teller {
  min-width: 20px;
  padding: 0 var(--sp-2);
  border-radius: var(--radius-pil);
  background: var(--brand);
  color: var(--brandink);
  font-size: var(--fs-micro);
  line-height: 20px;
  text-align: center;
}
/* Het zojuist getoonde tabpaneel komt rustig binnen. */
.tabpaneel-in { animation: tabpaneel-in .2s ease-out; }
@keyframes tabpaneel-in {
  from { opacity: 0; transform: translateY(6px); }
  to { opacity: 1; transform: none; }
}
/* Op het tabblad Taken hoort de kaart "Nieuw vastleggen" er niet onder. */
.dashboardkolommen[data-tabblad="taken"] > .zijkolom { display: none; }

/* --- (b) De zwevende "+" ------------------------------------------- */
.mobieleactieknop .snelmenu-plus { transition: transform .22s cubic-bezier(.2, .8, .2, 1); }
.snelmenu[data-open] .mobieleactieknop .snelmenu-plus { transform: rotate(45deg); }
.snelmenu-scrim {
  position: fixed;
  inset: 0;
  z-index: 61;
  background: var(--paneel-scrim-zonder-blur);
  opacity: 0;
  transition: opacity .2s ease;
}
@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
  .snelmenu-scrim {
    background: var(--paneel-scrim);
    -webkit-backdrop-filter: blur(var(--paneel-blur));
    backdrop-filter: blur(var(--paneel-blur));
  }
}
.snelmenu[data-open] .snelmenu-scrim { opacity: 1; }
.snelmenu-lijst {
  position: fixed;
  right: var(--sp-8);
  /* Boven de knop: 88px tabbalk-afstand + 58px knop + 14px lucht. */
  bottom: calc(160px + var(--onderrand));
  z-index: 61;
  margin: 0;
  padding: 0;
  list-style: none;
  display: flex;
  /* De eerste actie (Bon fotograferen) staat het dichtst bij de duim. */
  flex-direction: column-reverse;
  align-items: flex-end;
  gap: var(--sp-4);
}
.snelmenu-lijst[hidden] { display: none; }
.snelactie {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-5);
  min-height: 44px;
  /* De icoonbol (44px) staat gecentreerd onder de knop van 58px. */
  padding-right: 7px;
  color: var(--ink);
  text-decoration: none;
  opacity: 0;
  transform: translateY(10px) scale(.96);
  transition: opacity .18s ease-out, transform .2s cubic-bezier(.2, .8, .2, 1);
}
.snelmenu[data-open] .snelactie { opacity: 1; transform: none; }
.snelmenu-lijst li:nth-child(2) .snelactie { transition-delay: .03s; }
.snelmenu-lijst li:nth-child(3) .snelactie { transition-delay: .06s; }
.snelmenu-lijst li:nth-child(4) .snelactie { transition-delay: .09s; }
.snelmenu-lijst li:nth-child(5) .snelactie { transition-delay: .12s; }
.snelmenu-lijst li:nth-child(n+6) .snelactie { transition-delay: .15s; }
/* De speltak waarvoor het menu geldt, links naast het kruis (2026-10-03). */
.snelmenu-speltak {
  position: fixed;
  right: calc(var(--sp-8) + 58px + var(--sp-5));
  bottom: calc(88px + 7px + var(--onderrand));
  z-index: 61;
  display: inline-flex;
  align-items: center;
  gap: var(--sp-3);
  max-width: calc(100vw - 58px - var(--sp-8) - var(--sp-5) - var(--sp-8));
  height: 44px;
  padding: 0 var(--sp-6) 0 var(--sp-2);
  border-radius: var(--radius-pil);
  background: var(--brandsoft);
  color: var(--ink);
  box-shadow: var(--shadow);
  font-size: var(--fs-secundair);
  font-weight: 600;
  pointer-events: none;
  opacity: 0;
  transform: translateX(8px);
  transition: opacity .18s ease-out, transform .2s cubic-bezier(.2, .8, .2, 1);
}
.snelmenu[data-open] .snelmenu-speltak { opacity: 1; transform: none; }
.snelmenu-speltak-logo { flex: none; width: 28px; height: 28px; border-radius: 50%; object-fit: cover; }
.snelmenu-speltak-initialen { display: inline-flex; align-items: center; justify-content: center; background: var(--brand); color: var(--brandink); font-size: var(--fs-meta); }
.snelmenu-speltak-naam { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) { .snelmenu-speltak { display: none; } }
@media (prefers-reduced-motion: reduce) { .snelmenu-speltak { transition: none; transform: none; } }

.snelactie-label {
  padding: var(--sp-3) var(--sp-6);
  border-radius: var(--radius-pil);
  background: var(--surf);
  color: var(--ink);
  font-size: var(--fs-body);
  font-weight: 600;
  white-space: nowrap;
  box-shadow: var(--shadow);
}
.snelactie-icoon {
  width: 44px;
  height: 44px;
  flex: 0 0 44px;
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--brandsoft);
  color: var(--brandtext);
  border: 1px solid var(--brandline);
  box-shadow: var(--shadow);
}
.snelactie:focus-visible { outline: none; }
.snelactie:focus-visible .snelactie-label { outline: 2px solid var(--focus); outline-offset: 2px; }

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .snelmenu-lijst, .snelmenu-scrim { display: none; }
}

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* Met JavaScript staan de toevoegacties onder de "+"; de kaart "Nieuw
     vastleggen" onderaan het dashboard is dan dubbel. Bij de groepsrekening
     blijft hij staan: zijn tegel Vaste lasten is een lijst, geen toevoeging,
     en heeft op een telefoon geen andere ingang. Zonder JavaScript blijft de
     kaart: dan is de "+" alleen de declaratielink. */
  html[data-snelmenu] .vastleggenkaart:not(:has(.vastelastentegel)) { display: none; }

  /* --- (c) Een rustiger kop op het speltakdashboard -----------------
     Pascal 2026-10-03: "aan de bovenkant nog wat rommelig". Was: rij 1
     terugpijl en speltakchip, rij 2 een grote seizoenchip rechts, rij 3 een
     witte zoekknop. Nu: rij 1 terugpijl, speltakchip en rechts het
     zoekicoon; rij 2 een kleine seizoenchip links, vlak boven het
     totaalsaldo. Dezelfde elementen, dezelfde links en hetzelfde paneel;
     alleen de opmaak verschilt. */
  .hoofd:has(.speltakkop) .kopbalk {
    flex-wrap: nowrap;
    align-items: flex-start;
  }
  .hoofd:has(.speltakkop) .kopbalk-links {
    flex: 1 1 auto;
    row-gap: var(--sp-2);
  }
  .hoofd:has(.speltakkop) .kopbalk-acties {
    flex: none;
    width: auto;
    flex-wrap: nowrap;
  }
  /* Het zoekicoon: alleen het icoon, doorschijnend op de kop zoals de
     speltakchip; het raakvlak blijft 44×44px (.zoekalles). */
  .hoofd:has(.speltakkop) .zoekalles-kopbalk {
    padding: 0;
    width: 44px;
    border-color: transparent;
    border-radius: var(--radius-pil);
    background: var(--navvlak);
    color: var(--navink);
  }
  /* De seizoenchip klein en ingetogen op een eigen korte regel. De US-154-
     regel duwde hem met margin-left: auto naar rechts; hier staat hij links,
     boven het totaalsaldo. Zichtbaar 28px hoog, het raakvlak blijft 44px
     dankzij het onzichtbare ::after-vlak (AC-4.9/4.10). */
  .hoofd:has(.speltakkop) .seizoenkiezer {
    flex: 0 0 100%;
    margin-left: 0;
  }
  .hoofd:has(.speltakkop) .seizoenkiezer > summary {
    position: relative;
    min-height: 28px;
    padding: 0 var(--sp-4);
    gap: var(--sp-1);
    border-radius: var(--radius-pil);
    font-size: var(--fs-meta);
    font-weight: 500;
  }
  .hoofd:has(.speltakkop) .seizoenkiezer > summary::after {
    content: "";
    position: absolute;
    inset: -8px 0;
  }
  .hoofd:has(.speltakkop) .seizoenkiezer > summary .seizoenchip-chevron {
    width: 10px;
    height: 10px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .dashboardtabs-pil,
  .dashboardtab,
  .mobieleactieknop .snelmenu-plus,
  .snelmenu-scrim,
  .snelactie { transition: none; }
  .snelmenu-lijst li .snelactie { transition-delay: 0s; }
  .tabpaneel-in { animation: none; }
}
/* --- einde US-265 --- */

/* =====================================================================
   US-267 (ADR-0196): het tabblad Meer op het speltakdashboard, met de
   subnavigatie van de speltak (Speltaknavigatie, dezelfde bron als de
   zijbalk). Alleen op een telefoon; daarboven bestaat de zijbalk en is dit
   blok weg. Zonder JavaScript staat het op een telefoon onderaan de pagina.
   Alleen tokens (AC-4.11), beide thema's via de tokens.
   ===================================================================== */
/* Drie tabbladen: de strook in drieën, de pil schuift per positie. */
.dashboardtabs[data-aantal="3"] { grid-template-columns: repeat(3, 1fr); }
.dashboardtabs[data-aantal="3"] .dashboardtabs-pil { width: calc((100% - 2 * var(--sp-1)) / 3); }
.dashboardtabs[data-aantal="2"][data-actief="meer"] .dashboardtabs-pil { transform: translateX(100%); }
.dashboardtabs[data-aantal="3"][data-actief="meer"] .dashboardtabs-pil { transform: translateX(200%); }
/* Op het tabblad Meer hoort de kaart "Nieuw vastleggen" er niet onder. */
.dashboardkolommen[data-tabblad="meer"] > .zijkolom { display: none; }

.meerplaats { margin: var(--sp-8) 0 0; }
.meerplaats[role="tabpanel"] { margin-top: 0; }
.meerplaats:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: var(--radius); }
.meer-kop {
  margin: 0 0 var(--sp-4);
  padding: 0 var(--sp-2);
  font-size: var(--fs-meta);
  font-weight: 600;
  color: var(--ink3);
  letter-spacing: .02em;
  text-transform: uppercase;
}
.meerlijst {
  margin: 0;
  padding: 0;
  list-style: none;
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  overflow: hidden;
}
.meerlijst li + li { border-top: 1px solid var(--line); }
.meerregel {
  display: flex;
  align-items: center;
  gap: var(--sp-5);
  min-height: 48px;
  padding: 0 var(--sp-6) 0 var(--sp-5);
  color: var(--ink);
  text-decoration: none;
  font-size: var(--fs-body);
  font-weight: 500;
}
.meerregel:hover { background: var(--surf2); }
.meerregel:active { background: var(--surf3); }
.meerregel:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
.meerregel[aria-current="page"] { color: var(--brandtext); font-weight: 600; }
.meerregel-icoon {
  flex: none;
  width: 32px;
  height: 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-knop);
  background: var(--brandsoft);
  color: var(--brandtext);
}
.meerregel-label { flex: 1 1 auto; min-width: 0; }
.meerregel-teller {
  min-width: 20px;
  padding: 0 var(--sp-2);
  border-radius: var(--radius-pil);
  background: var(--brand);
  color: var(--brandink);
  font-size: var(--fs-micro);
  line-height: 20px;
  text-align: center;
}
.meerregel-chevron { flex: none; color: var(--ink3); }

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .meerplaats { display: none; }
}
/* --- einde US-267 --- */

/* =====================================================================
   US-269 — Eén mobiele kop voor elk speltakscherm (ADR-0198)

   Pascal 2026-10-03, bij een schermafdruk van Uitgaven op een telefoon: "In
   de topbar niet zoveel elementen: speltak selector en zoeken-ding. Plus knop
   altijd met die zwevende knop oplossen. Seizoen hoeft niet in topbar."

   Op een telefoon is de kopbalk van elk scherm binnen een speltak (de layout
   zet .kopbalk-speltak; het speltakdashboard heeft zijn eigen gekleurde kop en
   houdt die) één rij: terugpijl, speltakchip met wisselaar, zoekicoon. De
   schermnaam (de H1 staat eronder), de seizoensaanduiding (Kopcontext) en de
   schermacties (Kopacties) verdwijnen daar; toevoegen gaat via de zwevende
   "+", en wat geen toevoeging is (exporteren, PDF) staat op dat scherm in de
   inhoud (.mobielekopregel). Het kruimelpad is dan dubbel met de terugpijl.

   Boven de telefoongrens is de omhulling display: contents en is de chip met
   wisselaar er niet: daar verandert niets.
   ===================================================================== */
.kopbalk-context, .kopbalk-schermacties { display: contents; }

/* Waarom de tabbalk en de "+" op Uitgaven ontbraken: de visueel verborgen
   teksten in de kopcellen ("Sorteer oplopend op …", .overslaan) zijn
   position: absolute. Zonder gepositioneerde voorouder hoorden ze bij het
   hele document en niet bij het schuifvlak van de tabel, dus stonden ze (1px
   groot, onzichtbaar) rechts naast het scherm, op 591px. Een telefoon rekt
   het lay-outvenster dan op tot die breedte en evenredig in de hoogte: de
   fixed tabbalk en "+" stonden onder de rand van het beeld. Met het
   schuifvlak als bevattend blok blijven ze daarbinnen en schuiven ze mee. */
.overflow-x { position: relative; }

.mobielekopregel {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3) var(--sp-5);
  margin: 0 0 var(--sp-7);
}
.mobielekopregel .teller { margin: 0; }

@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .alleenmobiel { display: none; }
}

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .speltakbadge-breed { display: none; }

  .kopbalk-speltak { flex-wrap: nowrap; }
  .kopbalk-speltak .kopbalk-links {
    flex: 1 1 auto;
    flex-wrap: nowrap;
    gap: var(--sp-3);
  }
  .kopbalk-speltak .kopbalk-acties {
    flex: none;
    width: auto;
    flex-wrap: nowrap;
  }
  .kopbalk-speltak .kopbalk-scherm,
  .kopbalk-speltak .kopbalk-context,
  .kopbalk-speltak .kopbalk-schermacties { display: none; }

  /* De chip met chevron, zoals op het dashboard; op de witte kop in de
     gewone tekstkleur. Een lange speltaknaam kort af in plaats van het
     zoekicoon van de rij te duwen. */
  .kopbalk-speltak .speltakwisselaar { min-width: 0; }
  .kopbalk-speltak .speltakchip { max-width: 100%; }
  .kopbalk-speltak .speltakchip-chevron { display: inline-flex; }
  .kopbalk-speltak .speltakbadge { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  /* Het zoekicoon: alleen het icoon, raakvlak 44×44px (.zoekalles). */
  .kopbalk-speltak .zoekalles-kopbalk {
    padding: 0;
    width: 44px;
    justify-content: center;
    border-radius: var(--radius-pil);
  }

  /* "← Terug naar …" is op een telefoon de terugpijl in de kop. */
  .hoofd:has(.kopbalk-speltak .kopbalk-terug) .kruimel { display: none; }
}
/* --- einde US-269 --- */

/* =====================================================================
   US-270 (ADR-0199): op een telefoon is elke tabel van de tabelcomponent
   een lijst van kaarten; nergens horizontaal scrollen. De component zet op
   elke cel data-rol en data-label (Tabellen/Kaartcellen.cs); een eigen
   tabel die geen tabelcomponent is (de begrotingsregels) zet ze zelf in de
   markup. Deze regels plaatsen de cellen:

     [sleutel] [titel ...................] [bedrag]
               kop: waarde                 [status]
               kop: waarde
     [acties over de volle breedte]

   Een lege cel (data-leeg) vervalt. De kopregel met de sorteerlinks is weg;
   .mobielsorteren biedt dezelfde sortering als gewone links. Op een groot
   scherm doen de attributen niets en is .mobielsorteren uit beeld.
   ===================================================================== */
.mobielsorteren { display: none; }
/* Een lange bestandsnaam of padnaam in lopende tekst breekt af in plaats van
   over de rand te lopen. */
p code { overflow-wrap: anywhere; }

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .overflow-x:has(> table[data-kaarten]) { overflow-x: visible; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] { display: block; width: 100%; min-width: 0; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) { display: block; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > caption:not(.overslaan) { display: block; text-align: left; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > thead { display: block; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > thead > tr:not(.filterregel) { display: none; }

  /* De kolomfilters van de volledige vorm blijven bruikbaar, als losse
     velden met hun eigen label in plaats van onder een kopcel. */
  table:is(.beheertabel, .regeltabel)[data-kaarten] > thead > tr.filterregel {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
    gap: var(--sp-3) var(--sp-5);
    padding: var(--sp-5) var(--sp-7);
    background: var(--surf2);
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > thead > tr.filterregel > td { display: grid; gap: var(--sp-1); padding: 0; border: 0; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > thead > tr.filterregel > td:not(:has(input, select)) { display: none; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > thead > tr.filterregel label.overslaan {
    position: static;
    width: auto;
    height: auto;
    overflow: visible;
    clip-path: none;
    font-size: var(--fs-meta);
    color: var(--ink2);
    font-weight: 600;
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > thead > tr.filterregel :is(input, select) { width: 100%; min-width: 0; box-sizing: border-box; }

  /* Eén kaart per rij. */
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    grid-auto-flow: row dense;
    align-items: baseline;
    row-gap: var(--sp-1);
    padding: var(--sp-5) var(--sp-7);
    border-top: 1px solid var(--line);
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr:first-child { border-top: 0; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > tfoot > tr { background: var(--surf2); font-weight: 600; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > :is(td, th) {
    display: block;
    min-width: 0;
    padding: 0;
    border: 0;
    background: none;
    text-align: left;
    white-space: normal;
    overflow-wrap: anywhere;
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr[data-breed] { display: block; }
  /* Een dichtgeklapte regel (hidden, de uitklaprij van de begroting) blijft dicht. */
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr[hidden] { display: none; }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-leeg] { display: none; }

  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-rol="sleutel"] {
    grid-column: 1;
    grid-row: 1;
    margin-right: var(--sp-3);
    white-space: nowrap;
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-rol="titel"] {
    grid-column: 2;
    grid-row: 1;
    font-weight: 600;
    font-size: var(--fs-body);
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-rol="bedrag"] {
    grid-column: 3;
    justify-self: end;
    margin-left: var(--sp-5);
    text-align: right;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
  }
  /* Het eerste bedrag staat op de titelregel en valt op; een tweede bedrag
     (begroot naast werkelijk) eronder. */
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-rol="bedrag"]:not([data-rol="bedrag"] ~ [data-rol="bedrag"]) {
    grid-row: 1;
    font-weight: 600;
    font-size: var(--fs-body);
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-rol="status"] {
    grid-column: 3;
    justify-self: end;
    margin-left: var(--sp-5);
    text-align: right;
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-rol="meta"] {
    grid-column: 1 / 3;
    font-size: var(--fs-secundair);
  }
  /* Kop en waarde lopen als één zin door; een lange waarde breekt onder de kop door. */
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-rol="meta"][data-label]::before {
    content: attr(data-label) ":";
    margin-right: var(--sp-2);
    color: var(--ink2);
    font-family: var(--font-ui);
    font-weight: 400;
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-rol="acties"] {
    grid-column: 1 / -1;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--sp-3);
    margin-top: var(--sp-3);
  }
  table:is(.beheertabel, .regeltabel)[data-kaarten] > :is(tbody, tfoot) > tr > [data-rol="acties"] form { margin: 0; }

  /* De uitlijning per kolompositie van US-255 (data-rechts) geldt niet in een
     kaart: kop en waarde van een gegevensregel staan links. */
  table:is(.beheertabel, .regeltabel)[data-kaarten][data-rechts] > :is(tbody, tfoot) > tr:not([data-breed]) > :is([data-rol="meta"], [data-rol="titel"], [data-rol="sleutel"]):nth-child(n) {
    text-align: left;
  }

  /* De sorteerkeuze boven de kaarten. */
  .mobielsorteren { display: block; margin: 0 0 var(--sp-3); font-size: var(--fs-secundair); }
  .mobielsorteren > summary {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    color: var(--ink2);
    font-weight: 600;
    cursor: pointer;
  }
  .mobielsorteren > ul {
    list-style: none;
    margin: 0;
    padding: var(--sp-3) var(--sp-5);
    border: 1px solid var(--line);
    border-radius: var(--radius-knop);
    background: var(--surf);
  }
  .mobielsorteren li {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--sp-3);
    border-top: 1px solid var(--line);
  }
  .mobielsorteren li:first-child { border-top: 0; }
  .mobielsorteren-kop { flex: 1 1 8rem; min-width: 0; }
  .mobielsorteren li > a {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 0 var(--sp-3);
    color: var(--brandtext);
  }
  .mobielsorteren li > a[aria-current="true"] { font-weight: 700; text-decoration: none; }
}
/* --- einde US-270 --- */

/* =====================================================================
   US-274 — Het seizoenpaneel als compacte keuzelijst op een telefoon
   (Pascal 2026-10-10: "ziet er op mobiel wel heel lelijk uit")

   Het paneel is een kiezer (US-207). De gestapelde kaartjes van US-195, met
   "Periode", "Status" en "Actief seizoen" als kop voor elke waarde, maakten van
   drie seizoenen een scherm vol. Op een telefoon is elke rij nu één regel met
   de naam en de statuspillen rechts, en de periode klein eronder; de koppen
   vallen weg, want de pillen en de datums spreken voor zich. Een niet-actief
   seizoen toont geen streepje meer (de schermlezertekst "niet actief" blijft).
   Tussen de kolommen staat geen column-gap maar een marge op de cellen, zodat
   een lege actiefkolom geen gat rechts laat. De tabelrollen in de broncode blijven ongewijzigd (ADR-0147).
   ===================================================================== */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* US-278: het paneel zweeft onder de chip, zoals de speltakwisselaar, en
     duwt de kopbalk niet meer open. De chip staat rechts, dus het paneel lijnt
     rechts uit; breedte: het scherm min de zijmarges (niet de chipbreedte). */
  .seizoenkiezer .seizoenpaneel {
    position: absolute;
    top: 100%;
    right: 0;
    left: auto;
    z-index: 30;
    width: min(560px, calc(100vw - 32px));
    max-width: none;
    max-height: calc(100dvh - 180px);
    overflow-y: auto;
    margin-top: var(--sp-2);
  }
  .seizoenpaneel-kop { padding: var(--sp-4) var(--sp-6); }

  .seizoenpaneel .seizoentabel tbody tr {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto auto;
    grid-template-areas: "naam status actief" "periode status actief";
    align-items: center;
    column-gap: 0;
    padding: var(--sp-3) var(--sp-6);
  }
  .seizoenpaneel .seizoentabel tbody th[scope="row"] {
    grid-area: naam;
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    padding: 0;
  }
  .seizoenpaneel .seizoentabel tbody td {
    display: block;
    padding: 0;
    background: none;
  }
  .seizoenpaneel .seizoentabel tbody td[data-kop]::before { content: none; }
  .seizoenpaneel .seizoentabel tbody td.periode { grid-area: periode; font-size: var(--fs-micro); }
  .seizoenpaneel .seizoentabel tbody td[data-kop="Status"] { grid-area: status; margin-left: var(--sp-3); }
  .seizoenpaneel .seizoentabel tbody td[data-kop="Actief seizoen"] { grid-area: actief; margin-left: var(--sp-3); }
  .seizoenpaneel .seizoentabel tbody td[data-kop="Actief seizoen"]:not(:has(.status)) { display: none; }
}
/* --- einde US-274 --- */

/* =====================================================================
   US-275 — Bon bekijken met een kruisje terug
   (Pascal 2026-10-10: "een kruisje of terugknop om terug te gaan naar de
   declaratie. Geldt ook voor de uitgaven.")

   De bekijkpagina (Pages/Speltak/BijlageBekijken) toont de bon binnen P-CASH,
   met bovenaan een balk: kruisje terug (44px tikdoel), de bestandsnaam en
   Downloaden. Een afbeelding past in het scherm (object-fit: contain) en blijft
   met de vingers te zoomen: geen touch-action, de viewport staat zoomen toe.
   Een PDF krijgt geen iframe maar een knop "PDF openen". Alleen bestaande
   tokens, dus licht en donker volgen vanzelf (ADR-0202).
   ===================================================================== */
.bonbekijker { display: flex; flex-direction: column; gap: var(--sp-6); }
.bonbekijker-balk {
  position: sticky;
  top: 0;
  z-index: 2;
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding: var(--sp-3) var(--sp-4);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
}
.bonbekijker-sluit {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  border-radius: var(--sp-3);
  border: 1px solid var(--line2);
  background: var(--surf);
  color: var(--ink);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  text-decoration: none;
}
.bonbekijker-sluit:hover { background: var(--surf2); }
.bonbekijker-sluit:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.bonbekijker-naam {
  flex: 1 1 auto;
  min-width: 0;
  margin: 0;
  font-size: var(--fs-kaartkop);
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.bonbekijker-download { flex: 0 0 auto; min-height: 44px; }
.bonbekijker-beeld {
  display: flex;
  justify-content: center;
  align-items: flex-start;
  background: var(--surf2);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--sp-4);
}
.bonbekijker-beeld img {
  display: block;
  max-width: 100%;
  max-height: calc(100vh - 220px);
  max-height: calc(100dvh - 220px);
  width: auto;
  height: auto;
  object-fit: contain;
}
.bonbekijker-pdf {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--sp-4);
  padding: var(--sp-8);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
}
.bonbekijker-pdf .knoppen { margin: 0; }
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .bonbekijker-balk { padding: var(--sp-2) var(--sp-3); gap: var(--sp-3); }
  .bonbekijker-beeld { padding: var(--sp-2); }
  .bonbekijker-beeld img { max-height: calc(100dvh - 260px); }
}
/* --- einde US-275 --- */

/* =====================================================================
   US-277 — Alleen de bon zoomen, niet de hele pagina
   (Pascal 2026-10-10: "Nu zoomt heel de pagina in, kan je ook alleen die
   foto inzoomen?")

   Met JavaScript (wwwroot/js/bonzoom.js) krijgt het fotovlak de klasse
   .zoombaar: een vaste hoogte, overflow verborgen en touch-action: none, zodat
   knijpen en schuiven op de foto werken en de pagina met de balk en het kruisje
   stil blijft staan. Zonder JavaScript blijft de US-275-weergave met het gewone
   zoomen van de browser.
   ===================================================================== */
.bonbekijker-beeld.zoombaar {
  position: relative;
  height: calc(100vh - 200px);
  height: calc(100dvh - 200px);
  min-height: 240px;
  overflow: hidden;
  touch-action: none;
  align-items: center;
  cursor: zoom-in;
  -webkit-user-select: none;
  user-select: none;
}
.bonbekijker-beeld.zoombaar.ingezoomd { cursor: grab; }
.bonbekijker-beeld.zoombaar img {
  max-height: 100%;
  transform-origin: 0 0;
  will-change: transform;
  -webkit-user-drag: none;
  pointer-events: none;
}
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .bonbekijker-beeld.zoombaar { height: calc(100dvh - 230px); }
  .bonbekijker-beeld.zoombaar img { max-height: 100%; }
}
/* --- einde US-277 --- */

/* =====================================================================
   US-307 — Een PDF-bon in het scherm bekijken en zoomen
   (Pascal 2026-10-16: "ik wil dat ook voor pdf bestanden hebben")

   bonpdf.js tekent de pagina's met pdf.js als canvas onder elkaar in
   .bonbekijker-pdfpaginas en koppelt het vlak aan bonzoom.js. Het vlak is
   hetzelfde fotovlak als bij een afbeelding (.bonbekijker-beeld.zoombaar),
   maar zonder binnenrand en met de inhoud bovenaan: een PDF van meerdere
   pagina's is hoger dan het vlak en wordt geschoven, niet gecentreerd. Zonder
   JavaScript blijft het vlak verborgen ([hidden]) en staat de terugval er.
   ===================================================================== */
.bonbekijker-beeld.bonbekijker-pdfbeeld { padding: 0; }
.bonbekijker-beeld.bonbekijker-pdfbeeld.zoombaar { align-items: flex-start; }
.bonbekijker-beeld.zoombaar.verschuifbaar { cursor: grab; }
.bonbekijker-pdfpaginas {
  flex: 0 0 auto;
  width: 100%;
  max-width: 900px;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
  padding: var(--sp-4);
  transform-origin: 0 0;
  will-change: transform;
  pointer-events: none;
}
.bonbekijker-pdfpaginas canvas {
  display: block;
  width: 100%;
  height: auto;
  box-shadow: var(--shadow);
}
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .bonbekijker-pdfpaginas { padding: var(--sp-2); gap: var(--sp-2); }
}
/* --- einde US-307 --- */

/* --- US-279: de onbekende declarant (ADR-0203) ---------------------------
   Naam en IBAN onder de declarantkeuze, als licht omkaderd blok. Zonder
   JavaScript altijd zichtbaar; onbekende-declarant.js toont het alleen bij
   de keuze "Onbekende declarant". */
fieldset.onbekende-declarant {
  border: 1px solid var(--line);
  border-radius: var(--radius-knop);
  padding: var(--sp-3) var(--sp-5);
  margin: 0 0 var(--sp-5);
  min-width: 0;
}
fieldset.onbekende-declarant[hidden] { display: none; }
fieldset.onbekende-declarant > legend { padding: 0 4px; font-weight: 600; }
.declarantlabel-onbekend { color: var(--ink3); font-size: .85em; }
/* --- einde US-279 --- */

/* --- US-281: afhandelstappen van een declaratie (ADR-0204) ---------------
   De stappenbalk "Afhandelen" bovenaan het declaratiedetail, alleen voor wie
   mag beoordelen. Vier stappen naast elkaar met een verbindingslijn; de stand
   staat ook als teken (vinkje, kruisje, nummer) en als verborgen woord, dus
   kleur is nooit de enige drager (AC-4.13). Op een telefoon het nummer boven
   de titel, zonder lijn. Alleen tokens: licht en donker volgen vanzelf. */
.afhandelstappen {
  margin: 0 0 var(--sp-8);
  padding: var(--sp-6) var(--sp-8);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  min-width: 0;
}
.afhandelstappen-kop {
  margin: 0 0 var(--sp-4);
  font-size: var(--fs-micro);
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ink2);
}
.afhandelstappen-lijst {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--sp-3);
}
.afhandelstap {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-width: 0;
  font-size: var(--fs-secundair);
  color: var(--ink2);
}
.afhandelstap:not(:last-child)::after {
  content: "";
  flex: 1 1 auto;
  min-width: var(--sp-3);
  height: 2px;
  border-radius: var(--radius-pil);
  background: var(--line2);
}
.afhandelstap[data-stand="klaar"]::after { background: var(--brandline); }
.afhandelstap-nr {
  flex: none;
  display: inline-grid;
  place-items: center;
  width: 26px;
  height: 26px;
  box-sizing: border-box;
  border-radius: 50%;
  border: 1.5px solid var(--line2);
  background: var(--surf);
  font-size: var(--fs-meta);
  font-weight: 600;
  line-height: 1;
  color: var(--ink2);
}
.afhandelstap-titel { min-width: 0; overflow-wrap: anywhere; }
.afhandelstap[data-stand="klaar"] .afhandelstap-nr {
  background: var(--brandsoft);
  border-color: var(--brandline);
  color: var(--brandtext);
}
.afhandelstap[data-stand="nu"] { color: var(--ink); font-weight: 600; }
.afhandelstap[data-stand="nu"] .afhandelstap-nr {
  background: var(--brand);
  border-color: var(--brand);
  color: var(--brandink);
}
.afhandelstap[data-stand="afgewezen"] { color: var(--danger); font-weight: 600; }
.afhandelstap[data-stand="afgewezen"] .afhandelstap-nr {
  background: var(--dangersoft);
  border-color: var(--dangerline);
  color: var(--danger);
}
/* De huidige stap van een betaalde declaratie is klaar, maar wel "hier". */
.afhandelstap[aria-current="step"][data-stand="klaar"] { color: var(--ink); font-weight: 600; }
.afhandelstappen-nu {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-2) var(--sp-4);
  margin: var(--sp-5) 0 0;
  padding-top: var(--sp-5);
  border-top: 1px solid var(--line);
  font-size: var(--fs-secundair);
  color: var(--ink);
}
.afhandelstappen-link { font-weight: 600; }
.afhandelstappen-link::after { content: "\2192"; margin-left: var(--sp-1); }

/* Een verplicht veld dat nog leeg is: een woord in een pil, niet alleen kleur. */
.ontbreekt {
  display: inline-block;
  margin-left: var(--sp-2);
  padding: 1px var(--sp-3);
  border: 1px solid var(--warnline);
  border-radius: var(--radius-pil);
  background: var(--warnsoft);
  color: var(--warn);
  font-size: var(--fs-micro);
  font-weight: 600;
  line-height: 1.5;
  vertical-align: middle;
}
.veldhint > .ontbreekt { margin: 0 var(--sp-2) 0 0; }
.infokaart[data-ontbreekt] { border-left: 3px solid var(--warnline); }

/* De ankers van de stappenzin landen onder de vaste kopbalk, niet erachter. */
/* Attribuutselectoren in plaats van id-selectoren: de blokken vanaf US-145
   bevatten geen hekje (TabelchroomTests, alleen tokens). */
[id="registreren"], [id="beoordelen"], [id="declarant"], [id="terugzetten"], [id="herstellen"] {
  scroll-margin-top: calc(var(--kopbalk-hoogte, 64px) + var(--sp-5));
}

/* Telefoon (ook de geïnstalleerde PWA): een smalle balk. Klaar en nog te doen
   zijn alleen een rondje met verbindingslijn; alleen de huidige stap is
   uitgeschreven. De titels van de andere stappen blijven voor een
   schermlezer staan. De link en het info-icoon zijn tikdoelen van 44px. */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .afhandelstappen { padding: var(--sp-5) var(--sp-6); margin-bottom: var(--sp-7); }
  .afhandelstappen-lijst {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
  }
  .afhandelstap { flex: 0 0 auto; gap: var(--sp-2); }
  .afhandelstap:not(:last-child)::after { flex: 0 0 var(--sp-5); min-width: var(--sp-5); }
  .afhandelstap[aria-current="step"] { flex: 1 1 auto; }
  .afhandelstap[aria-current="step"]:not(:last-child)::after { flex: 1 1 var(--sp-5); }
  .afhandelstap:not([aria-current="step"]) .afhandelstap-titel {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }
  .afhandelstappen-nu { gap: 0 var(--sp-3); }
  .afhandelstappen-zin { flex: 1 1 100%; }
  .afhandelstappen-link {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }
  .afhandelstappen-nu .infoicoon { min-width: 44px; min-height: 44px; }
}
/* --- einde US-281 --- */

/* --- US-284: de eigen begroting van de groepsrekening (ADR-0208) ---------
   Rubrieken met regels per kant, de vergelijking met vorig seizoen en het
   algemene blad. Het verschil draagt altijd een pijl en een teken; de kleur
   (gunstig/ongunstig) is nooit de enige drager (AC-4.13). Op een telefoon
   wordt de tabel een lijst blokken met het kolomlabel voor elk getal. Alleen
   tokens: licht en donker volgen vanzelf. */
.groepsbegroting-kaarten {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr));
  gap: var(--sp-7);
  margin: 0 0 var(--sp-9);
}
.groepsbegroting-nieuw { margin-top: var(--sp-7); }
.groepsbegroting-nieuw h2 { margin-top: 0; }
.groepsbegroting-vergelijking { margin: var(--sp-5) 0; }

.groepsbegroting-totalen {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--sp-5);
  margin: 0 0 var(--sp-9);
}
.groepsbegroting-totaal {
  padding: var(--sp-6) var(--sp-8);
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  min-width: 0;
}
.groepsbegroting-totaal dt {
  font-size: var(--fs-micro);
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ink2);
}
.groepsbegroting-totaal dd { margin: var(--sp-1) 0 0; }
.groepsbegroting-totaal dd.bedrag { font-size: var(--fs-sectie); font-weight: 600; }
.groepsbegroting-totaal-meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-1) var(--sp-5);
  align-items: baseline;
}

.groepsbegroting-kant { margin: 0 0 var(--sp-9); min-width: 0; }
.groepsbegroting-kantkop {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3);
  /* US-302: lucht tussen de knop "Rubriek toevoegen" en de kolomkoppen. */
  margin: 0 0 var(--sp-11);
}
.groepsbegroting-kantkop h2 { margin: 0; }

.groepsbegroting-tabel {
  width: 100%;
  border-collapse: collapse;
  font-variant-numeric: tabular-nums;
  /* Vaste kolombreedtes, zodat inkomsten en uitgaven onder elkaar uitlijnen. */
  table-layout: fixed;
}
.groepsbegroting-tabel thead th:nth-child(n+2):nth-child(-n+4) { width: 17%; }
/* US-303: met de realisatie van vorig seizoen erbij zes getalkolommen. */
.groepsbegroting-tabel.met-realisatie thead th:nth-child(n+2):nth-child(-n+5) { width: 15%; }
/* Potlood plus "+ Regel" naast elkaar (US-302). */
.groepsbegroting-tabel thead th:last-child { width: 136px; }
.groepsbegroting-tabel thead th {
  font-size: var(--fs-meta);
  font-weight: 600;
  color: var(--ink2);
  text-align: left;
  padding: var(--sp-2) var(--sp-3);
  border-bottom: 1px solid var(--line2);
}
.groepsbegroting-tabel thead th.getal { text-align: right; }
.groepsbegroting-tabel td,
.groepsbegroting-tabel tbody th,
.groepsbegroting-tabel tfoot th {
  padding: var(--sp-3);
  border-bottom: 1px solid var(--line);
  /* US-302: midden, zodat tekst, bedragen, het verschil en de 32px-knoppen op
     één lijn staan. */
  vertical-align: middle;
  text-align: left;
  font-weight: 400;
  overflow-wrap: anywhere;
}
.groepsbegroting-tabel td.getal { text-align: right; white-space: nowrap; }
/* US-338: het informatie-icoon bij een post met een toelichting. De tooltip
   behoudt de regelafbrekingen van de tekst en blijft binnen een redelijke hoogte. */
.groepsbegroting-toelichting { margin-left: var(--sp-2); vertical-align: middle; }
.groepsbegroting-toelichting > .tip-tekst {
  white-space: pre-line;
  max-width: 24rem;
  max-height: 16rem;
  overflow-y: auto;
}
.groepsbegroting-rubriekrij > * {
  background: var(--surf2);
  font-weight: 600;
}
.groepsbegroting-tabel .groepsbegroting-rubriekrij th { font-weight: 600; color: var(--brandtext); }
/* US-302: de tabel loopt tot de rand van de kaart (.paneel > .overflow-x); de
   buitenste cellen springen even ver in als de kop "Inkomsten"/"Uitgaven". */
.groepsbegroting-tabel tr > :first-child { padding-left: var(--sp-9); }
.groepsbegroting-tabel tr > :last-child { padding-right: var(--sp-9); }
.groepsbegroting-tabel .groepsbegroting-regelrij > th,
.groepsbegroting-regelrij.leeg td { padding-left: calc(var(--sp-9) + var(--sp-7)); }

/* US-285: jaarrekening en mutatierapportage van de groepsrekening per rubriek en regel. */
.groepsrealisatie-regels .groepsrealisatie-rubriek > * {
  background: var(--surf2);
  font-weight: 600;
}
.groepsrealisatie-regels .groepsrealisatie-rubriek th { color: var(--brandtext); }
.groepsrealisatie-regels .groepsrealisatie-regel > th { padding-left: var(--sp-9); font-weight: 400; }
.groepsbegroting-tabel .groepsbegroting-totaalrij > * {
  border-top: 2px solid var(--line2);
  border-bottom: 0;
  font-weight: 600;
}
.groepsbegroting-tabel td.acties {
  white-space: nowrap;
  text-align: right;
  padding-top: var(--sp-2);
  padding-bottom: var(--sp-2);
}
.groepsbegroting-acties {
  display: inline-flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--sp-3);
}
.groepsbegroting-regelerbij {
  font-size: var(--fs-meta);
  white-space: nowrap;
}

/* US-304: het verschil is bijzaak naast de bedragen. Geen gekleurd vlak, gewone
   letter, kleine pijl; gunstig of ongunstig alleen als tint van de tekst. Pijl
   en teken blijven de dragers, nooit alleen de kleur (AC-4.13). */
.groepsbegroting-verschil {
  display: inline-flex;
  align-items: baseline;
  gap: 3px;
  font-size: var(--fs-meta);
  font-weight: 400;
  white-space: nowrap;
  color: var(--ink2);
}
.groepsbegroting-verschil > [aria-hidden="true"] { font-size: 0.75em; }
.groepsbegroting-verschil[data-oordeel="gunstig"] { color: var(--credit); }
.groepsbegroting-verschil[data-oordeel="ongunstig"] { color: var(--danger); }
.groepsbegroting-verschil[data-richting="nieuw"] { color: var(--ink3); font-style: italic; }

/* US-305: een klein pijltje naast een bedrag van vorig seizoen; het percentage
   als zwevend label bij hoveren of focussen, of altijd zichtbaar met de knop
   "Percentages tonen" (body[data-percentages="aan"]). */
.groepsbegroting-weergave { display: flex; justify-content: flex-end; margin: var(--sp-5) 0 0; }
.verschilpijl {
  position: relative;
  display: inline-flex;
  align-items: baseline;
  gap: 3px;
  margin-left: var(--sp-2);
  font-size: var(--fs-meta);
  color: var(--ink3);
  cursor: default;
  border-radius: var(--radius-knop);
}
.verschilpijl:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
.verschilpijl[data-oordeel="gunstig"] { color: var(--credit); }
.verschilpijl[data-oordeel="ongunstig"] { color: var(--danger); }
.verschilpijl-teken { font-size: 0.75em; }
.verschilpijl-tekst {
  position: absolute;
  bottom: calc(100% + 4px);
  right: 0;
  padding: 2px var(--sp-2);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf);
  box-shadow: var(--shadow2);
  white-space: nowrap;
  font-weight: 600;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.12s;
  z-index: 2;
}
.verschilpijl:hover .verschilpijl-tekst,
.verschilpijl:focus .verschilpijl-tekst { opacity: 1; }
body[data-percentages="aan"] .verschilpijl-tekst {
  position: static;
  opacity: 1;
  padding: 0;
  border: 0;
  background: none;
  box-shadow: none;
  font-weight: 400;
}
@media (prefers-reduced-motion: reduce) {
  .verschilpijl-tekst { transition: none; }
}

.groepsbegroting-boekingen,
.groepsbegroting-vervallen,
.groepsbegroting-status { margin: 0 0 var(--sp-9); }
.groepsbegroting-boekingenlijst {
  list-style: none;
  margin: 0 0 var(--sp-5);
  padding: 0;
  /* Eén raster over de hele lijst (subgrid), zodat nummer, datum, omschrijving en
     bedrag in elke rij onder elkaar staan. */
  display: grid;
  grid-template-columns: max-content max-content minmax(0, 1fr) max-content;
  column-gap: var(--sp-5);
}
.groepsbegroting-boekingenlijst li {
  display: grid;
  grid-column: 1 / -1;
  grid-template-columns: subgrid;
  align-items: baseline;
  padding: var(--sp-3) 0;
  border-bottom: 1px solid var(--line);
}
.groepsbegroting-boekingenlijst .bedrag { text-align: right; }
.groepsbegroting-boekingoms { overflow-wrap: anywhere; }
.groepsbegroting-boekingoms .teller { display: block; }
.groepsbegroting-vervallen > summary { cursor: pointer; font-weight: 600; }
.groepsbegroting-vervallen ul { margin: var(--sp-5) 0 0; padding-left: var(--sp-9); }
.groepsbegroting-vervallen li { margin: 0 0 var(--sp-2); }
.groepsbegroting-vervallen li .teller { display: block; }
.groepsbegroting-status h2 { margin-top: 0; }
.groepsbegroting-statusknoppen {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-5);
  align-items: flex-start;
}
.groepsbegroting-bevestig > summary { list-style: none; cursor: pointer; }
.groepsbegroting-bevestig > summary::-webkit-details-marker { display: none; }
.groepsbegroting-bevestig[open] form,
.groepsbegroting-verwijderen[open] form {
  margin-top: var(--sp-5);
  padding: var(--sp-6);
  background: var(--surf2);
  border: 1px solid var(--line);
  border-radius: var(--radius-knop);
}
.groepsbegroting-verwijderen { margin-top: var(--sp-9); }
.groepsbegroting-statusknoppen .groepsbegroting-verwijderen { margin-top: 0; }

/* US-301: de handmatige realisatie van een historische groepsbegroting. Per
   rubriek één veld voor de hele rubriek, met de regels ingesprongen eronder. */
.groepsbegroting-realisatiekant { border: 0; padding: 0; margin: 0 0 var(--sp-6); }
.groepsbegroting-realisatiekant legend { font-weight: 600; margin-bottom: var(--sp-3); }
.groepsbegroting-realisatierubriek { margin-bottom: var(--sp-5); }
.groepsbegroting-realisatieregel { margin-left: var(--sp-5); }
.groepsbegroting-historisch p:last-child { margin-bottom: 0; }
.groepsbegroting-verwijderen > summary { cursor: pointer; }

.groepsbegroting-algemeen {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--sp-7);
  align-items: start;
}
.groepsbegroting-algemeen .paneel { min-width: 0; }
.groepsbegroting-algemeen .paneel > .overflow-x { margin: 0; }
.melding.groepsbegroting-onvolledig {
  background: var(--warnsoft);
  border-color: var(--warnline);
  border-left-color: var(--warn);
}
.groepsbegroting-onvolledig ul { margin: var(--sp-2) 0 0; padding-left: var(--sp-9); }
.groepsbegroting-liquide { width: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; }
.groepsbegroting-liquide th,
.groepsbegroting-liquide td {
  padding: var(--sp-2) 0;
  border-bottom: 1px solid var(--line);
  text-align: left;
  font-weight: 400;
}
.groepsbegroting-liquide td.getal,
.groepsbegroting-liquide th.getal { text-align: right; }
.groepsbegroting-liquide tfoot > tr > * { font-weight: 600; border-bottom: 0; border-top: 2px solid var(--line2); }
.groepsbegroting-vermogen h2 { margin-top: 0; }
.groepsbegroting-som { margin: 0; font-variant-numeric: tabular-nums; }
.groepsbegroting-som > div {
  display: flex;
  justify-content: space-between;
  gap: var(--sp-5);
  padding: var(--sp-2) 0;
  border-bottom: 1px solid var(--line);
}
.groepsbegroting-som dd { margin: 0; white-space: nowrap; }
.groepsbegroting-som > .groepsbegroting-som-totaal {
  border-bottom: 0;
  border-top: 2px solid var(--line2);
  font-weight: 600;
  color: var(--brandtext);
}
.groepsbegroting-som-totaal dd { font-size: var(--fs-sectie); }

@media (max-width: 1100px) {
  .groepsbegroting-algemeen { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .groepsbegroting-vermogen { grid-column: 1 / -1; }
}

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .groepsbegroting-totalen { grid-template-columns: 1fr; gap: var(--sp-3); }
  .groepsbegroting-totaal { padding: var(--sp-5) var(--sp-6); }
  .groepsbegroting-algemeen { grid-template-columns: 1fr; }

  /* De tabel als blokken: rubriek of regel bovenaan, de getallen eronder
     met hun kolomlabel (data-label), twee naast elkaar. */
  .groepsbegroting-tabel thead { display: none; }
  .groepsbegroting-tabel,
  .groepsbegroting-tabel tbody,
  .groepsbegroting-tabel tfoot { display: block; }
  .groepsbegroting-tabel tr {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--sp-1) var(--sp-5);
    /* US-302: even ver ingesprongen als de kop, ook de totaalrij. */
    padding: var(--sp-4) var(--sp-7);
    border-bottom: 1px solid var(--line);
  }
  .groepsbegroting-tabel tr > *,
  .groepsbegroting-tabel tr > :first-child,
  .groepsbegroting-tabel tr > :last-child,
  .groepsbegroting-tabel td.acties,
  .groepsbegroting-tabel .groepsbegroting-regelrij.leeg td,
  .groepsbegroting-tabel .groepsbegroting-totaalrij > * { border: 0; padding: 0; background: transparent; }
  .groepsbegroting-tabel tr > th,
  .groepsbegroting-tabel .groepsbegroting-regelrij > th { grid-column: 1 / -1; padding-left: 0; }
  .groepsbegroting-tabel .groepsbegroting-rubriekrij {
    background: var(--surf2);
    border-radius: 0;
    padding: var(--sp-4) var(--sp-7);
  }
  .groepsbegroting-tabel .groepsbegroting-regelrij { padding-left: calc(var(--sp-7) + var(--sp-5)); }
  .groepsbegroting-tabel { table-layout: auto; }
  .groepsbegroting-tabel td.getal {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0;
    text-align: left;
    white-space: nowrap;
  }
  .groepsbegroting-tabel td.getal::before {
    content: attr(data-label);
    font-size: var(--fs-micro);
    font-weight: 400;
    color: var(--ink2);
  }
  .groepsbegroting-tabel td.acties {
    grid-column: 1 / -1;
    width: auto;
    text-align: left;
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-3);
    align-items: center;
  }
  .groepsbegroting-tabel td.acties:empty,
  .groepsbegroting-tabel .groepsbegroting-totaalrij > td:empty { display: none; }
  .groepsbegroting-tabel .groepsbegroting-regelrij.leeg td { grid-column: 1 / -1; padding-left: 0; }
  .groepsbegroting-tabel .groepsbegroting-totaalrij { border-top: 2px solid var(--line2); border-bottom: 0; }
  .groepsbegroting-regelerbij { min-height: 44px; display: inline-flex; align-items: center; }
  .groepsbegroting-boekingenlijst { grid-template-columns: max-content minmax(0, 1fr) max-content; }
  .groepsbegroting-boekingenlijst li > span:nth-child(2) { display: none; }
}
/* --- einde US-284 --- */

/* =====================================================================
   US-286 — Zijbalk wordt een icoonbalk als het venster smal is (ADR-0210)
   ---------------------------------------------------------------------
   Pascal 2026-10-11: op een laptopvenster van ongeveer 1150px nam de volle
   zijbalk van 264px een kwart van de breedte en werden de dashboardkolommen
   en tabellen geplet. Tussen de telefoongrens (601px) en 1280px is de
   zijbalk daarom een icoonbalk van 72px: het P-teken, en van elke regel
   alleen het icoon, het speltaklogo of de initialen.

   - De namen (.zijbalk-naam) blijven in de DOM: visueel verborgen met
     hetzelfde patroon als .overslaan, dus elke link en knop houdt zijn
     toegankelijke naam. Bij aanwijzen en bij toetsenbordfocus verschijnt de
     naam als tooltip naast de balk. Hij staat op position: fixed, zodat het
     scrollgebied .zijbalk-menu (overflow-y: auto) hem niet afknipt; zonder
     top krijgt hij zijn statische plek, verticaal gecentreerd op de regel.
   - Elke regel is hier een tikdoel van minstens 44 x 44px: in dit bereik
     vallen ook tablets, dus de compacte 36/32px van US-194 geldt hier niet.
   - De actieve pagina draagt naast de lichtere achtergrond een witte streep
     links (vorm, niet alleen kleur); de actieve speltak een ring om het logo.
   - De subnavigatie van de actieve speltak en de lijst Financiële tools
     staan als iconen in een eigen, licht getint vlak onder hun kop.
   - De focusring is in de balk wit en binnen de regel getekend: de gewone
     ring (--focus) valt weg op --nav, en buiten de regel zou het
     scrollgebied hem afknippen.
   - Alle regels hangen aan .zijbalk:not([data-uitgeklapt]). Zet zijbalk.js
     data-uitgeklapt (knop Menu uitklappen), dan gelden weer de gewone regels
     van de volle zijbalk en ligt die 264px breed over de inhoud heen
     (negatieve rechtermarge, dus de inhoud verspringt niet).

   Boven 1280px verandert er niets: de knop en het P-teken staan daar op
   display: none, net als onder 601px, waar de balk helemaal niet bestaat.
   De liggende telefoon (max-height: 500px en pointer: coarse) valt buiten
   deze voorwaarde en blijft mobiel. Alleen bestaande tokens en de witte
   doorschijnende waarden die de zijbalk al gebruikt; geen id-selectors.
   ===================================================================== */

/* Overal buiten de icoonbalk: geen P-teken en geen uitklapknop. */
.zijbalk-beeldmerk,
.zijbalk-uitklapknop { display: none; }

@media (min-width: 601px) and (max-width: 1279px) and (min-height: 501px), (min-width: 601px) and (max-width: 1279px) and (pointer: fine), (min-width: 601px) and (max-width: 1279px) and (pointer: none) {
  /* Boven de kopbalk (50), zodat een tooltip over de kopbalk heen valt en de
     uitgeklapte balk erover ligt; onder de zoekoverlay (56), het
     inschuifpaneel (60), de toasts (70) en de overslaanlink (90). */
  .zijbalk { z-index: 55; }

  .zijbalk:not([data-uitgeklapt]) {
    width: 72px;
    padding: var(--sp-6) var(--sp-4);
  }

  /* -- Het P-teken in plaats van het woordmerk -------------------------- */
  .zijbalk:not([data-uitgeklapt]) .zijbalk-logo {
    justify-content: center;
    margin: 0 0 var(--sp-5);
    padding: 0;
    min-height: 44px;
  }
  .zijbalk:not([data-uitgeklapt]) .zijbalk-woordmerk { display: none; }
  .zijbalk:not([data-uitgeklapt]) .zijbalk-logo .zijbalk-beeldmerk {
    display: block;
    width: 40px;
    height: 40px;
    filter: none;
    border-radius: var(--radius-knop);
  }

  /* -- Elke regel: alleen het icoon, gecentreerd, 44 x 44px ------------- */
  .zijbalk:not([data-uitgeklapt]) a,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-volgt,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-tools > summary,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-uitloggen button,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-uitklapknop {
    position: relative;
    justify-content: center;
    gap: 0;
    min-width: 44px;
    min-height: 44px;
    padding: 0;
    border-radius: var(--radius-knop);
  }
  .zijbalk:not([data-uitgeklapt]) .zijbalk-groep { gap: 2px; margin-bottom: var(--sp-4); }
  .zijbalk:not([data-uitgeklapt]) .zijbalk-groep + .zijbalk-groep {
    padding-top: var(--sp-4);
    border-top: 1px solid rgba(255, 255, 255, .12);
  }
  .zijbalk:not([data-uitgeklapt]) .zijbalk-voet { padding-top: var(--sp-4); }

  /* De namen en de kop Speltakken: visueel verborgen, voor een schermlezer
     gewoon aanwezig. De chevrons hebben zonder namen geen functie. */
  .zijbalk:not([data-uitgeklapt]) .zijbalk-kop,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-naam {
    position: fixed;
    left: 80px;
    width: 1px;
    height: 1px;
    margin: 0;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }
  .zijbalk:not([data-uitgeklapt]) .zijbalk-toolschevron,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-profiel > svg { display: none; }

  /* -- De naam als tooltip bij aanwijzen en bij focus ------------------- */
  .zijbalk:not([data-uitgeklapt]) a:hover > .zijbalk-naam,
  .zijbalk:not([data-uitgeklapt]) a:focus-visible > .zijbalk-naam,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-volgt:hover > .zijbalk-naam,
  .zijbalk:not([data-uitgeklapt]) summary:hover > .zijbalk-naam,
  .zijbalk:not([data-uitgeklapt]) summary:focus-visible > .zijbalk-naam,
  .zijbalk:not([data-uitgeklapt]) button:hover > .zijbalk-naam,
  .zijbalk:not([data-uitgeklapt]) button:focus-visible > .zijbalk-naam {
    width: max-content;
    height: auto;
    max-width: 18rem;
    overflow: visible;
    clip-path: none;
    padding: var(--sp-3) var(--sp-4);
    border-radius: var(--radius-knop);
    background: var(--ink);
    color: var(--surf);
    box-shadow: var(--shadow);
    font-size: var(--fs-meta);
    font-style: normal;
    font-weight: 500;
    line-height: 1.35;
    pointer-events: none;
  }
  /* Het profiel: naam en rol onder elkaar, allebei in de tooltipkleur. */
  .zijbalk:not([data-uitgeklapt]) .zijbalk-profiel:hover .naam,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-profiel:focus-visible .naam,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-profiel:hover .rol,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-profiel:focus-visible .rol { color: var(--surf); }

  /* -- Focus: wit en binnen de regel ------------------------------------ */
  .zijbalk a:focus-visible,
  .zijbalk summary:focus-visible,
  .zijbalk button:focus-visible {
    outline: 3px solid var(--navink);
    outline-offset: -3px;
  }

  /* -- Actief: lichter vlak plus een streep links (vorm, niet alleen kleur) */
  .zijbalk:not([data-uitgeklapt]) a[aria-current="page"] { box-shadow: inset 3px 0 0 var(--navink); }
  .zijbalk:not([data-uitgeklapt]) a[aria-current="page"] > .zijbalk-initialen {
    box-shadow: 0 0 0 2px var(--nav), 0 0 0 4px var(--navink);
  }

  /* -- Teller als bolletje rechtsboven op het icoon --------------------- */
  .zijbalk:not([data-uitgeklapt]) .zijbalk-teller {
    position: absolute;
    top: 2px;
    right: 2px;
    min-width: 18px;
    height: 18px;
    padding: 0 var(--sp-1);
    font-size: 10.5px;
    box-shadow: 0 0 0 2px var(--nav);
  }

  /* -- Subnavigatie en Financiële tools: iconen in een getint vlak ------ */
  .zijbalk:not([data-uitgeklapt]) .zijbalk-sub,
  .zijbalk:not([data-uitgeklapt]) .zijbalk-toolslijst {
    gap: 2px;
    margin: 2px 0 var(--sp-3);
    padding: 2px 0;
    border-left: 0;
    border-radius: var(--radius-knop);
    background: rgba(255, 255, 255, .07);
  }
  .zijbalk:not([data-uitgeklapt]) .zijbalk-tools[open] > summary { background: rgba(255, 255, 255, .09); }

  /* -- Profiel: alleen de initialen ------------------------------------- */
  .zijbalk:not([data-uitgeklapt]) .zijbalk-profiel { background: transparent; }

  /* -- De uitklapknop (alleen als zijbalk.js draait) -------------------- */
  .zijbalk[data-uitklapbaar] .zijbalk-uitklapknop {
    display: flex;
    align-items: center;
    width: 100%;
    min-height: 44px;
    margin: 0 0 var(--sp-4);
    border: 0;
    border-radius: var(--radius-knop);
    background: transparent;
    color: var(--navink2);
    font-family: inherit;
    font-size: var(--fs-body);
    cursor: pointer;
  }
  .zijbalk .zijbalk-uitklapknop:hover { background: rgba(255, 255, 255, .09); }
  .zijbalk .zijbalk-uitklapknop > svg { flex: none; transition: transform .15s ease; }

  /* Uitgeklapt: de gewone volle zijbalk, als lade over de inhoud. De
     negatieve marge houdt de plek in de flexrij op 72px. */
  .zijbalk[data-uitgeklapt] {
    width: 264px;
    margin-right: -192px;
    box-shadow: var(--shadow);
  }
  .zijbalk[data-uitgeklapt] .zijbalk-uitklapknop {
    justify-content: flex-start;
    gap: 11px;
    padding: var(--sp-3) var(--sp-4);
    text-align: left;
  }
  .zijbalk[data-uitgeklapt] .zijbalk-uitklapknop > svg { transform: rotate(180deg); }
}

@media (prefers-reduced-motion: reduce) {
  .zijbalk .zijbalk-uitklapknop > svg { transition: none; }
}
/* --- einde US-286 --- */

/* =====================================================================
   US-295 — Saldo en speltak blijven staan op een telefoon (ADR-0219)
   (Pascal 2026-10-13, schermafdruk van het speltakdashboard: "Als ik hier
   scrol naar beneden, zou je dan het saldo en de speltak sticky bovenaan
   kunnen laten staan?")

   Alleen het speltakdashboard heeft de gekleurde kop met het saldo
   (.saldopanelen.speltakkop); de andere speltakschermen hebben sinds US-269
   één rij zonder saldo en blijven ongewijzigd.

   Zodra de saldokop weggescrold is, zet wwwroot/js/kopcompact.js
   data-kopcompact op <html>. De kopbalk wordt dan een vaste balk van één rij:
   terugpijl, speltakchip (nog steeds de wisselaar), het saldo klein en het
   zoekicoon. De seizoenchip en "Resultaat dit seizoen" scrollen weg. Het
   script meet vlak daarvoor de hoogte van de kopbalk in rust
   (--kopbalk-rusthoogte); die ruimte blijft boven de inhoud vrij, dus er
   verspringt niets. Terug bovenaan gaat het attribuut eraf en staat de volle
   kop er weer.

   Zonder JavaScript is er geen data-kopcompact en scrolt de kop mee zoals
   vóór US-295. Boven de telefoongrens doet niets hiervan iets: alle regels
   staan in de mobiele mediaregel, en het saldo in de kop is daar
   display: none (desktop pixelgelijk). De dagkoppen in de transactiekaart zijn
   niet sticky (position: static, US-239/A-637) en schuiven dus onder de
   compacte balk door; een anker of toetsenbordfocus valt niet onder de balk
   (scroll-padding-top).
   ===================================================================== */
.kopbalk-saldo { display: none; }

@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  /* De plek van de kopbalk in rust blijft vrij: geen sprong. */
  html[data-kopcompact] .hoofd:has(.speltakkop) {
    padding-top: var(--kopbalk-rusthoogte, 0px);
  }

  /* De compacte balk: vast bovenaan, in dezelfde --nav als de statusbalk
     (meta theme-color) en de volle kop, met de veilige zone van een notch of
     Dynamic Island erbij (PWA in standalone, viewport-fit=cover). z-index 50
     zoals de desktopkopbalk: boven de inhoud, onder de tabbalk (60), de
     toasts (70) en de overlays. */
  html[data-kopcompact] .hoofd:has(.speltakkop) .kopbalk {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 50;
    min-height: 0;
    align-items: center;
    padding: calc(var(--sp-2) + env(safe-area-inset-top, 0px)) max(var(--sp-7), env(safe-area-inset-right, 0px)) var(--sp-2) max(var(--sp-7), env(safe-area-inset-left, 0px));
    box-shadow: 0 1px 0 rgba(0, 0, 0, .12), 0 6px 14px -10px rgba(0, 0, 0, .45);
    animation: pcash-kopcompact .18s ease-out;
  }
  html[data-kopcompact] .hoofd:has(.speltakkop) .kopbalk-links {
    flex-wrap: nowrap;
    min-width: 0;
  }

  /* De seizoenchip scrolt weg met de rest van de volle kop. */
  html[data-kopcompact] .hoofd:has(.speltakkop) .seizoenkiezer { display: none; }

  /* De speltakchip mag krimpen zodat het saldo altijd heel blijft; een lange
     naam eindigt dan op een beletselteken. Het raakvlak blijft de chip zelf. */
  html[data-kopcompact] .hoofd:has(.speltakkop) .speltakwisselaar,
  html[data-kopcompact] .hoofd:has(.speltakkop) .speltakchip { min-width: 0; max-width: 100%; }
  html[data-kopcompact] .hoofd:has(.speltakkop) .speltakbadge {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  /* Het saldo klein, rechts op de rij van de chip, vlak voor het zoekicoon. */
  html[data-kopcompact] .hoofd:has(.speltakkop) .kopbalk-saldo {
    display: flex;
    flex: none;
    flex-direction: column;
    align-items: flex-end;
    margin-left: auto;
    line-height: 1.2;
    white-space: nowrap;
  }
  .kopbalk-saldo-label { color: var(--navink2); font-size: var(--fs-micro); }
  .kopbalk-saldo-waarde {
    color: var(--navink);
    font-size: 15px;
    font-weight: 600;
    font-variant-numeric: tabular-nums;
  }

  /* Een anker of toetsenbordfocus valt niet onder de compacte balk
     (WCAG 2.4.11): 44px rij plus 2 x 6px binnenruimte plus de veilige zone. */
  html[data-kopcompact]:has(.speltakkop) {
    scroll-padding-top: calc(56px + env(safe-area-inset-top, 0px) + var(--sp-3));
  }
}

@keyframes pcash-kopcompact { from { transform: translateY(-100%); } to { transform: translateY(0); } }

@media (prefers-reduced-motion: reduce) {
  html[data-kopcompact] .hoofd:has(.speltakkop) .kopbalk { animation: none; }
}
/* --- einde US-295 --- */

/* --- US-311: verdeeld over meerdere begrotingsposten (ADR-0227) --- */
.verdeling .verdeling-rij { align-items: end; }
.verdeling .verdeling-weg { align-self: end; margin-bottom: var(--sp-2); }
.verdeling-lijst { margin: var(--sp-1) 0 0; padding-left: 1.2em; }
.verdeling-lijst .bedrag { margin-left: var(--sp-2); }
/* --- einde US-311 --- */

/* US-047 (ADR-0233): het koppelpaneel en de handelingen op het mismatchdetail. */
.keuzelijst-koppelen { border: 0; margin: var(--sp-5) 0 0; padding: 0; }
.keuzelijst-koppelen .keuze { display: flex; gap: var(--sp-3); align-items: flex-start; padding: var(--sp-3) 0; border-bottom: 1px solid var(--line); }
.keuzelijst-koppelen .keuze label { display: block; }
.keuzelijst-koppelen .toelichting { display: block; }
.kalelijst { margin: 0; padding: 0; list-style: none; }
.bunqacties { display: flex; flex-wrap: wrap; gap: var(--sp-2); align-items: center; }
.bunqacties form { margin: 0; }
/* De kaart "Aansluiting met bunq" onder de takenkaart op het speltakdashboard
   (US-046/317): de chip in de kaartkop draagt kleur én woord, de twee saldi staan
   als kerncijfers naast elkaar, het verschil eronder met teken en woord. Alleen
   tokens, zodat licht en donker vanzelf meegaan. */
.takenplaats > .bunqkaart { margin-top: var(--sp-8); }
.bunqcijfers {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--sp-4) var(--sp-7);
  margin: 0;
  padding: var(--sp-6) var(--sp-7) 0;
}
.bunqcijfers > div { min-width: 0; }
.bunqcijfers dt { font-size: var(--fs-meta); color: var(--ink2); }
.bunqcijfers dd {
  margin: 2px 0 0;
  font-size: var(--fs-body);
  font-weight: 600;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.bunqcijfers > div:nth-child(n+3) { grid-column: 1 / -1; }
.bunqcijfers .toelichting { display: inline; margin-left: var(--sp-2); }
.bunqmeta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-1) var(--sp-5);
  margin: 0;
  padding: var(--sp-5) var(--sp-7);
  font-size: var(--fs-meta);
  color: var(--ink2);
}
.bunqmeldingen { color: var(--warn); font-weight: 600; }
.bunqvoet { padding-top: 0; padding-bottom: 0; }
.bunqvoet a { display: inline-flex; align-items: center; min-height: 44px; font-weight: 600; }

/* =====================================================================
   Een tabel van de tabelcomponent in een kaart (Mismatches met bunq).
   De kop staat in .kaartkop, zoals de kaarten op het dashboard; zoekveld,
   tabelcellen en bladeraar springen even ver in als die kop, en de tabel
   loopt tot de rand van de kaart. Kaarten onder elkaar krijgen lucht.
   ===================================================================== */
.kaart:has(> .tabelblok) { margin: var(--sp-7) 0; }
.kaart > .tabelblok { margin: 0; }
.kaart > .tabelblok .tabelbediening .zoekbalk { margin: var(--sp-5) var(--sp-7); }
.kaart > .tabelblok .bladeraar { margin: 0; padding: var(--sp-5) var(--sp-7); border-top: 1px solid var(--line); }
.kaart > .tabelblok .mobielsorteren { margin-inline: var(--sp-7); }
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .kaart > .tabelblok table.beheertabel > :is(thead, tbody, tfoot) > tr > :first-child { padding-left: var(--sp-7); }
  .kaart > .tabelblok table.beheertabel > :is(thead, tbody, tfoot) > tr > :last-child { padding-right: var(--sp-7); }
}

/* De bunqtabellen: datum, nummer, bedrag, soort en actie zo smal als hun
   inhoud, de omschrijving neemt de ruimte. Rijen zijn verticaal gecentreerd
   en de knoppen compact (32px, zoals .rijacties); op een telefoon zijn de
   rijen kaarten en blijft het tikdoel 44px. */
.bunqtabel > tbody > tr > td { vertical-align: middle; }
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .bunqmismatches > :is(thead, tbody) > tr:not([data-breed]) > :is(:nth-child(1), :nth-child(2), :nth-child(5)),
  .bunqalleenpcash > :is(thead, tbody) > tr:not([data-breed]) > :is(:nth-child(1), :nth-child(2), :nth-child(4), :nth-child(5)),
  .bunqgekoppeld > :is(thead, tbody) > tr:not([data-breed]) > :is(:nth-child(1), :nth-child(2), :nth-child(6)) {
    width: 1%;
    white-space: nowrap;
  }
  /* In de mismatchtabel is de regel te vol voor twee knoppen naast elkaar:
     daar staan ze onder elkaar en blijft er ruimte voor omschrijving en reden. */
  .bunqmismatches > :is(thead, tbody) > tr:not([data-breed]) > :nth-child(8) { width: 1%; white-space: nowrap; }
  .bunqmismatches .bunqacties { flex-direction: column; align-items: stretch; }
  .bunqmismatches .bunqacties .knop { width: 100%; }
  .bunqgekoppeld .bunqacties { flex-wrap: nowrap; }
  .bunqtabel td > .toelichting:only-child { min-width: 14rem; }
  .bunqtabel .knop.klein { min-height: 32px; padding-block: 0; }
}

/* "Nu ophalen bij bunq": de knop naast de teller "Bankmutaties vanaf" (detail)
   en "Laatste ophaalronde" (/bunq). Op een smal scherm schuift hij eronder;
   het tikdoel blijft de 44px van .knop. */
.bunqophalen { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--sp-3); margin: var(--sp-3) 0; }
.bunqophalen > .teller, .bunqophalen > form { margin: 0; }
/* US-317: saldo bunq, saldo P-CASH en verschil breken niet midden in een bedrag. */
.bunqstatus td.saldo, .beheertabel.bunqstatus td.saldo .toelichting { white-space: nowrap; }
.bunqstatus td.saldo .toelichting { display: block; }
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .bunqophalen .knop.klein { min-height: 32px; padding-block: 0; }
}

/* =====================================================================
   US-323: zoeken binnen de speltak en het seizoen van het scherm (ADR-0238)

   De kopbalkingang heet op een speltakscherm "Zoek in Bevers · 2025-2026".
   Een lange naam kort af met een beletselteken in plaats van de schermeigen
   acties weg te duwen; de volledige naam staat in de title en voor een
   schermlezer in .overslaan. In de overlay en op de zoekpagina een balk die
   zegt waar er gezocht wordt, met de keuze "Zoek in alles". Tikdoelen 44px
   (AC-4.9). Alle kleuren uit de tokenset, dus ook goed in het donkere thema.
   ===================================================================== */
.zoekalles-kopbalk-tekst { max-width: 22rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.zoekoverlay-bereik,
.zoekbereik {
  flex: none;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-2) var(--sp-4);
  margin: 0;
  padding: var(--sp-2) var(--sp-8);
  background: var(--surf2);
  border-bottom: 1px solid var(--line);
  color: var(--ink2);
  font-size: var(--fs-meta);
}
.zoekoverlay-bereik strong,
.zoekbereik strong { color: var(--ink); font-weight: 600; }

.zoekoverlay-bereikknop,
.zoekbereik-wissel {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 var(--sp-3);
  border: 0;
  background: none;
  color: var(--brandtext);
  font: inherit;
  font-weight: 600;
  text-decoration: underline;
  cursor: pointer;
}
.zoekoverlay-bereikknop[hidden],
.zoekoverlay-bereik-tekst[hidden] { display: none; }
/* --- einde US-323 --- */
/* US-320 (ADR-0239): de rondleiding voor penningmeesters. Eén stap per scherm,
   een smalle leeskolom, stippen als voortgang (elk een link, 44px hoog), de
   sinds US-328 korte filmpjes (hieronder), en onderaan Vorige,
   Overslaan en Volgende. Mobiel eerst; alles past op 360px. */
.rondleiding { max-width: 1040px; }
.rondleiding .paginatitel { margin-bottom: var(--sp-3); }
.rondleiding-voortgang { margin: 0 0 var(--sp-7); }
.rondleiding-teller { margin: 0 0 var(--sp-1); font-size: var(--fs-meta); color: var(--ink2); }
.rondleiding-stippen { display: flex; gap: var(--sp-1); list-style: none; margin: 0; padding: 0; }
.rondleiding-stippen > li { flex: 1 1 0; min-width: 0; }
.rondleiding-stippen a { display: block; position: relative; min-height: 44px; }
.rondleiding-stippen a::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 19px;
  height: 6px;
  border-radius: var(--radius-pil);
  background: var(--line2);
}
.rondleiding-stippen .gedaan a::before { background: var(--brandline); }
.rondleiding-stippen .huidig a::before { background: var(--brand); }
.rondleiding-stippen a:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; border-radius: var(--radius-knop); }
.rondleiding-stap {
  background: var(--surf);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow2);
  padding: var(--sp-9) var(--sp-7);
}
.rondleiding-stap > h2 { margin: 0 0 var(--sp-5); font-size: var(--fs-sectie); color: var(--ink); }
.rondleiding-stap h3 { margin: 0 0 var(--sp-3); font-size: var(--fs-body); }
.rondleiding-stap p, .rondleiding-stap li { line-height: 1.55; }
.rondleiding-intro { margin: 0 0 var(--sp-7); }
.rondleiding-punten, .rondleiding-stappenlijst, .rondleiding-tijdlijn { margin: var(--sp-7) 0; padding-left: var(--sp-9); }
.rondleiding-punten > li, .rondleiding-stappenlijst > li, .rondleiding-tijdlijn > li { margin: 0 0 var(--sp-5); }
.rondleiding-let-op {
  margin: var(--sp-7) 0;
  padding: var(--sp-5) var(--sp-7);
  border: 1px solid var(--infoline);
  border-left: 6px solid var(--info);
  border-radius: var(--radius-knop);
  background: var(--infosoft);
  color: var(--ink);
}
.rondleiding-let-op p { margin: 0 0 var(--sp-3); }
.rondleiding-let-op p:last-child, .rondleiding-let-op ul:last-child { margin-bottom: 0; }
.rondleiding-let-op ul { margin: 0 0 var(--sp-3); padding-left: var(--sp-9); }
.rondleiding-klein { margin: var(--sp-7) 0 0; font-size: var(--fs-secundair); color: var(--ink2); }
/* US-328 (ADR-0244): de filmpjes. Een kader met de look van een browservenster
   (balk met drie stippen), afgeronde hoeken en een zachte schaduw; het filmpje
   vult de volle breedte van de stap. rondleidingfilm.js zet er een afspeel- en een
   vergrootknop op; bij prefers-reduced-motion staat het poster met een grote
   afspeelknop klaar. Op volledig scherm vult het filmpje het scherm op zwart. */
.rondleiding-film { margin: var(--sp-9) 0 var(--sp-11); }
.rondleiding-film-kader {
  position: relative;
  overflow: hidden;
  border: 1px solid var(--line2);
  border-radius: var(--radius);
  background: var(--surf3);
  box-shadow: 0 2px 4px rgba(16, 32, 22, .06), 0 24px 48px -20px rgba(0, 61, 30, .35);
}
.rondleiding-film-balk {
  display: flex;
  align-items: center;
  gap: 6px;
  height: 30px;
  padding: 0 var(--sp-5);
  border-bottom: 1px solid var(--line2);
  background: var(--surf2);
}
.rondleiding-film-stip { width: 10px; height: 10px; border-radius: 50%; background: var(--line2); }
.rondleiding-film-adres {
  flex: 0 1 260px;
  margin: 0 auto;
  padding: 2px var(--sp-5);
  border-radius: var(--radius-pil);
  background: var(--surf);
  color: var(--ink3);
  font-size: var(--fs-micro);
  text-align: center;
}
.rondleiding-film-video {
  display: block;
  width: 100%;
  height: auto;
  /* US-329: de opnamen zijn 1880x824 (was 1440x900); het kader volgt die verhouding op elke breedte. */
  aspect-ratio: 1880 / 824;
  object-fit: contain;
  background: var(--surf2);
}
.rondleiding-film.met-bediening .rondleiding-film-video { cursor: zoom-in; }
.rondleiding-film figcaption { margin-top: var(--sp-5); font-size: var(--fs-secundair); color: var(--ink2); }
.rondleiding-film-wat { display: block; }
.rondleiding-film-noot { display: block; margin-top: var(--sp-1); font-size: var(--fs-meta); color: var(--ink3); }
.rondleiding-film-bediening {
  position: absolute;
  right: var(--sp-5);
  bottom: var(--sp-5);
  display: flex;
  gap: var(--sp-3);
}
.rondleiding-film-knop, .rondleiding-film-start {
  display: inline-grid;
  place-items: center;
  border: 0;
  color: white;
  background: rgba(10, 24, 16, .72);
  cursor: pointer;
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
}
.rondleiding-film-knop { width: 44px; height: 44px; border-radius: 50%; opacity: .85; transition: opacity .15s, transform .15s; }
.rondleiding-film-knop:hover { opacity: 1; transform: scale(1.06); }
.rondleiding-film-knop::before, .rondleiding-film-start::before {
  content: "";
  width: 18px;
  height: 18px;
  background: currentColor;
  -webkit-mask: var(--rondleiding-icoon) center / contain no-repeat;
  mask: var(--rondleiding-icoon) center / contain no-repeat;
}
.rondleiding-film-speel { --rondleiding-icoon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 4h3.5v16H7zM13.5 4H17v16h-3.5z'/%3E%3C/svg%3E"); }
.rondleiding-film.is-gepauzeerd .rondleiding-film-speel,
.rondleiding-film-start { --rondleiding-icoon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7 4.5v15a1 1 0 0 0 1.5.86l12.5-7.5a1 1 0 0 0 0-1.72L8.5 3.64A1 1 0 0 0 7 4.5z'/%3E%3C/svg%3E"); }
.rondleiding-film-groot { --rondleiding-icoon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5'/%3E%3C/svg%3E"); }
.rondleiding-film-start {
  position: absolute;
  left: 50%;
  top: calc(50% + 15px);
  width: 76px;
  height: 76px;
  border-radius: 50%;
  background: var(--brand);
  color: white;
  box-shadow: 0 10px 30px -8px rgba(0, 61, 30, .6);
  transform: translate(-50%, -50%);
  opacity: 0;
  pointer-events: none;
  transition: opacity .2s, transform .2s;
}
.rondleiding-film-start::before { width: 30px; height: 30px; margin-left: 4px; }
.rondleiding-film.is-gepauzeerd .rondleiding-film-start { opacity: 1; pointer-events: auto; }
.rondleiding-film-start:hover { transform: translate(-50%, -50%) scale(1.06); }
.rondleiding-film-knop:focus-visible, .rondleiding-film-start:focus-visible {
  outline: 3px solid var(--focus);
  outline-offset: 2px;
  opacity: 1;
}
.rondleiding-film-kader:fullscreen {
  display: flex;
  flex-direction: column;
  justify-content: center;
  border: 0;
  border-radius: 0;
  background: black;
}
.rondleiding-film-kader:fullscreen .rondleiding-film-balk { display: none; }
.rondleiding-film-kader:fullscreen .rondleiding-film-video { max-height: 100vh; object-fit: contain; cursor: zoom-out; }
.rondleiding-film-kader:fullscreen .rondleiding-film-start { top: 50%; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .rondleiding-film-kader { box-shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 24px 48px -20px rgba(0, 0, 0, .8); }
}
:root[data-theme="dark"] .rondleiding-film-kader { box-shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 24px 48px -20px rgba(0, 0, 0, .8); }
/* De kernzin, het stapnummer en "Meer uitleg" (US-328). */
.rondleiding-stapnummer {
  margin: 0 0 var(--sp-2);
  color: var(--brandtext);
  font-size: var(--fs-meta);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
}
.rondleiding-kernzin {
  max-width: 34ch;
  margin: 0 0 var(--sp-3);
  color: var(--ink);
  font-size: clamp(20px, 1.2rem + 1vw, 27px);
  font-weight: 600;
  line-height: 1.3;
  letter-spacing: -.01em;
  text-wrap: balance;
}
.rondleiding-uitleg { max-width: 72ch; }
.rondleiding-meer { margin: var(--sp-7) 0 0; border-top: 1px solid var(--line); }
.rondleiding-meer > summary {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-height: 44px;
  padding: var(--sp-3) 0;
  color: var(--brandtext);
  font-weight: 600;
  cursor: pointer;
  list-style: none;
}
.rondleiding-meer > summary::-webkit-details-marker { display: none; }
.rondleiding-meer > summary::before {
  content: "";
  width: 8px;
  height: 8px;
  margin: 0 4px 3px 2px;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: rotate(-45deg);
  transition: transform .2s;
}
.rondleiding-meer[open] > summary::before { transform: rotate(45deg); margin-bottom: 6px; }
.rondleiding-meer > summary:hover { text-decoration: underline; }
.rondleiding-meer > summary:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; border-radius: var(--radius-knop); }
.rondleiding-meer[open] > :not(summary) { animation: rondleiding-in .25s ease-out both; }
/* De stap schuift zacht in beeld en het huidige stuk van de voortgangsbalk vult zich. */
@keyframes rondleiding-in {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: none; }
}
@keyframes rondleiding-vul {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}
.rondleiding-stap { animation: rondleiding-in .35s ease-out both; }
.rondleiding-stippen .huidig a::before { background: var(--brandline); }
.rondleiding-stippen .huidig a::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 19px;
  height: 6px;
  border-radius: var(--radius-pil);
  background: var(--brand);
  transform-origin: left center;
  animation: rondleiding-vul .6s cubic-bezier(.2, .7, .2, 1) .1s both;
}
.rondleiding-stippen .gedaan a::before { background: var(--brand); opacity: .55; }
.rondleiding-stippen a:hover::before { background: var(--brand); opacity: .8; }
@media (prefers-reduced-motion: reduce) {
  .rondleiding-stap,
  .rondleiding-meer[open] > :not(summary),
  .rondleiding-stippen .huidig a::after { animation: none; }
  .rondleiding-meer > summary::before,
  .rondleiding-film-knop,
  .rondleiding-film-start { transition: none; }
}
/* Het nagebouwde voorbeeld van een uitbetaling (stap Voorbeeld). */
.rondleiding-nabootsing {
  margin: var(--sp-7) 0;
  padding: var(--sp-5) var(--sp-7);
  border: 1px solid var(--line2);
  border-radius: var(--radius-knop);
  background: var(--surf2);
}
.rondleiding-nabootsing-kop { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3); }
.rondleiding-nabootsing-kop .mono { color: var(--brandtext); font-weight: 600; }
.rondleiding-nabootsing-bedrag { margin-left: auto; font-weight: 600; font-variant-numeric: tabular-nums; }
.rondleiding-nabootsing-regel { margin: var(--sp-3) 0; font-size: var(--fs-secundair); color: var(--ink2); }
.rondleiding-kenmerk { padding: 2px var(--sp-3); border-radius: var(--radius-pil); background: var(--surf3); color: var(--ink); }
.rondleiding-nabootsing-declaraties { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
.rondleiding-nabootsing-declaraties > li {
  display: flex;
  gap: var(--sp-3);
  padding: var(--sp-3) 0;
  border-bottom: 1px solid var(--line);
  font-size: var(--fs-secundair);
}
.rondleiding-nabootsing-declaraties > li > :last-child { margin-left: auto; font-variant-numeric: tabular-nums; }
.rondleiding-nabootsing-voet { margin: var(--sp-3) 0 0; font-size: var(--fs-meta); color: var(--ink3); }
.rondleiding-bekijk { margin: var(--sp-9) 0 0; }
.rondleiding-bediening { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3); margin: var(--sp-7) 0 var(--sp-3); }
.rondleiding-bediening > form { margin: 0; }
.rondleiding-bediening > :last-child { margin-left: auto; }
.rondleiding-bediening > [aria-disabled="true"] { opacity: .55; cursor: default; }
.rondleiding-toetsen { margin: 0; font-size: var(--fs-meta); color: var(--ink3); }
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .rondleiding-stap { padding: var(--sp-7) var(--sp-5); }
  .rondleiding-toetsen { display: none; }
  /* US-328: het filmpje loopt tot de rand van de kaart, zodat het zo groot mogelijk is. */
  .rondleiding-film { margin-left: calc(-1 * var(--sp-5) + 1px); margin-right: calc(-1 * var(--sp-5) + 1px); }
  .rondleiding-film figcaption { padding: 0 var(--sp-5); }
  .rondleiding-film-kader { border-radius: var(--radius-knop); }
  .rondleiding-film-balk { height: 22px; }
  .rondleiding-film-stip { width: 7px; height: 7px; }
  .rondleiding-film-adres { display: none; }
  .rondleiding-film-bediening { right: var(--sp-3); bottom: var(--sp-3); }
  .rondleiding-film-start { width: 60px; height: 60px; top: calc(50% + 11px); }
  .rondleiding-kernzin { font-size: 20px; }
}
/* De uitnodiging op het startscherm (AC-320.4) is sinds US-330 (ADR-0245) een
   voorstel bij de eerste keer: zonder JavaScript een sectie bovenaan, met
   JavaScript (rondleidingvoorstel.js) een modaal <dialog>. De vaste knop op het
   overzicht (AC-320.7) is weg; de ingang staat onder je naam / Profiel. */
.rondleiding-voorstel {
  display: grid;
  gap: var(--sp-7);
  margin: var(--sp-7) 0;
  padding: var(--sp-7);
  border: 1px solid var(--brandline);
  border-left: 6px solid var(--brand);
  border-radius: var(--radius-knop);
  background: var(--brandsoft);
  color: var(--ink);
}
.rondleiding-voorstel-beeld {
  display: block;
  width: 100%;
  max-width: 420px;
  height: auto;
  border: 1px solid var(--line);
  border-radius: var(--sp-3);
}
.rondleiding-voorstel h2 { margin: 0 0 var(--sp-2); font-size: var(--fs-body); }
.rondleiding-voorstel p { margin: 0 0 var(--sp-5); }
.rondleiding-voorstel-knoppen { display: flex; flex-wrap: wrap; gap: var(--sp-3); }
.rondleiding-voorstel-knoppen > form { margin: 0; }

.rondleiding-voorstel-dialoog {
  width: min(560px, calc(100vw - 32px));
  max-height: calc(100dvh - 32px);
  padding: 0;
  border: 0;
  border-radius: var(--radius);
  background: var(--surf);
  color: var(--ink);
  box-shadow: var(--shadow);
  overflow: auto;
}
.rondleiding-voorstel-dialoog::backdrop { background: rgba(10, 20, 14, .55); }
.rondleiding-voorstel.is-dialoog {
  margin: 0;
  padding: var(--sp-9);
  border: 0;
  border-radius: 0;
  background: transparent;
}
.rondleiding-voorstel.is-dialoog .rondleiding-voorstel-beeld { max-width: none; }
.rondleiding-voorstel.is-dialoog h2 { font-size: 20px; padding-right: 40px; }
.rondleiding-voorstel-sluit {
  position: absolute;
  top: var(--sp-3);
  right: var(--sp-3);
  z-index: 1;
  min-width: 44px;
  min-height: 44px;
  border: 0;
  border-radius: var(--radius-pil);
  background: var(--surf);
  color: var(--ink2);
  font: inherit;
  font-size: 18px;
  cursor: pointer;
}
.rondleiding-voorstel-sluit:hover { color: var(--ink); }
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .rondleiding-voorstel:not(.is-dialoog) { grid-template-columns: minmax(200px, 320px) 1fr; align-items: center; }
}

/* De aanwijzing na Nu niet, Overslaan of Klaar (US-330). Zonder JavaScript een
   regel bovenaan; met JavaScript zwevend bij de ingang (.is-zwevend). De tekst
   noemt de zijbalk boven 600px en de tabbalk eronder. */
.rondleiding-wijzer {
  margin: var(--sp-7) 0;
  padding: var(--sp-5) var(--sp-7);
  border-radius: var(--sp-5);
  background: var(--ink);
  color: var(--bg);
  font-weight: 500;
}
.rondleiding-wijzer p { margin: 0; }
.rondleiding-wijzer-breed { display: none; }
.rondleiding-wijzer.is-zwevend {
  position: fixed;
  left: var(--sp-6);
  right: var(--sp-6);
  bottom: calc(88px + var(--onderrand));
  z-index: 70;
  display: flex;
  align-items: center;
  gap: 11px;
  margin: 0;
  box-shadow: var(--shadow);
  animation: pcash-toast .18s ease-out;
}
.rondleiding-wijzer.is-zwevend p { flex: 1 1 auto; }
.rondleiding-wijzer.is-leeg { opacity: 0; }
.rondleiding-wijzer button {
  min-height: 44px;
  min-width: 44px;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  cursor: pointer;
  opacity: .7;
}
@media (min-width: 601px) and (min-height: 501px), (min-width: 601px) and (pointer: fine), (min-width: 601px) and (pointer: none) {
  .rondleiding-wijzer-breed { display: inline; }
  .rondleiding-wijzer-smal { display: none; }
  /* Rechts naast de zijbalk, op de hoogte van je naam linksonder. */
  .rondleiding-wijzer.is-zwevend { left: calc(264px + var(--sp-7)); right: auto; bottom: var(--sp-9); max-width: 520px; }
}

/* De ingang licht kort op: drie keer een zachte ring, daarna een blijvende rand
   zolang de pagina open is. Bij reduced motion alleen die rand. */
.zijbalk-profiel.is-wijzer,
.mobieletabbalk a.is-wijzer {
  outline: 3px solid var(--brandtext);
  outline-offset: 2px;
  animation: pcash-wijzer 1.1s ease-out 3;
}
.zijbalk-profiel.is-wijzer { outline-color: var(--navink); }
/* De tab Profiel staat tegen de rand van het scherm: de ring binnen de tab. */
.mobieletabbalk a.is-wijzer { outline-offset: -4px; border-radius: var(--radius-knop); }
@keyframes pcash-wijzer {
  0% { box-shadow: 0 0 0 0 rgba(111, 199, 154, .75); }
  100% { box-shadow: 0 0 0 14px rgba(111, 199, 154, 0); }
}
@media (prefers-reduced-motion: reduce) {
  .zijbalk-profiel.is-wijzer,
  .mobieletabbalk a.is-wijzer,
  .rondleiding-wijzer.is-zwevend { animation: none; }
}

/* =====================================================================
   US-325 — Het lijstzoekveld op het dashboard zoekt op het dashboard zelf
   ---------------------------------------------------------------------
   ADR-0242: het veld in de lijstkop (.kopzoek, US-230) is een livezoekformulier
   geworden met het kruisje van US-248. De invoer staat nu in een .zoekinvoer,
   die in de flexrij de ruimte van het veld neemt. De veldregel van .kopzoek
   (padding: 0) is specifieker dan die van .zoekinvoer, dus de ruimte voor het
   kruisje wordt hier opnieuw gezet, anders loopt de tekst eronder. */
.kopzoek .zoekinvoer {
  flex: 1 1 auto;
  min-width: 0;
}
.kopzoek .zoekinvoer > input[type="search"] {
  width: 100%;
  padding-right: 40px;
}
.kopzoek .zoekwis { right: calc(-1 * var(--sp-3)); }
/* Bij zoeken mag de teller "50 van 64 gevonden" niet onder het veld duwen. */
.lijstkop-zoek .lijstteller { white-space: nowrap; }
.lijstleeg-zoek > a { margin-left: var(--sp-2); }
/* --- einde US-325 --- */

/* -- US-326: de seizoenkiezer van Mijn declaraties op een telefoon ---------
   Dezelfde chip en hetzelfde paneel als op het dashboard (US-122, US-278).
   Daar staat de chip rechts en lijnt het paneel rechts uit; hier staat de chip
   direct naast de schermnaam, en een rechts uitgelijnd paneel van schermbreedte
   viel links buiten beeld. Het paneel hangt daarom aan de kopregel zelf en
   neemt diens volle breedte. */
@media (max-width: 600px), (max-height: 500px) and (pointer: coarse) {
  .kopbalk-links:has(> .mijnseizoenkiezer) { position: relative; }
  .mijnseizoenkiezer { position: static; }
  .mijnseizoenkiezer .seizoenpaneel {
    left: 0;
    right: 0;
    width: auto;
  }
}
