/* op-tokens: de 67 open-props-variabelen die normalize gebruikt (2,2KB i.p.v. 29,6KB) */
:where(html){--blue-5:#339af0;--border-size-1:1px;--border-size-2:2px;--border-size-3:5px;--ease-2:cubic-bezier(.25,0,.4,1);--font-lineheight-1:1.25;--font-lineheight-3:1.5;--font-monospace-code:Dank Mono,Operator Mono,Inconsolata,Fira Mono,ui-monospace,SF Mono,Monaco,Droid Sans Mono,Source Code Pro,Cascadia Code,Menlo,Consolas,DejaVu Sans Mono,monospace;--font-size-0:.75rem;--font-size-1:1rem;--font-size-2:1.1rem;--font-size-3:1.25rem;--font-size-4:1.5rem;--font-size-5:2rem;--font-size-6:2.5rem;--font-size-8:3.5rem;--font-system-ui:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;--font-weight-7:700;--font-weight-9:900;--gray-0:#f8f9fa;--gray-1:#f1f3f5;--gray-12:#030507;--gray-2:#e9ecef;--gray-3:#dee2e6;--gray-4:#ced4da;--gray-6:#868e96;--gray-7:#495057;--gray-8:#343a40;--gray-9:#212529;--green-1:#d3f9d8;--green-9:#2b8a3e;--indigo-2:#bac8ff;--indigo-3:#91a7ff;--indigo-7:#4263eb;--purple-2:#eebefa;--purple-3:#e599f7;--purple-7:#ae3ec9;--radius-2:5px;--radius-3:1rem;--red-2:#ffc9c9;--red-3:#ffa8a8;--red-6:#fa5252;--red-9:#c92a2a;--shadow-6:0 -1px 2px 0 hsl(var(--shadow-color)/var(--shadow-strength-3)),0 3px 2px -2px hsl(var(--shadow-color)/var(--shadow-strength-4)),0 7px 5px -2px hsl(var(--shadow-color)/var(--shadow-strength-4)),0 12px 10px -2px hsl(var(--shadow-color)/var(--shadow-strength-5)),0 22px 18px -2px hsl(var(--shadow-color)/var(--shadow-strength-6)),0 41px 33px -2px hsl(var(--shadow-color)/var(--shadow-strength-7)),0 100px 80px -2px hsl(var(--shadow-color)/var(--shadow-strength-8));--shadow-color:220 3% 15%;--shadow-strength:1%;--shadow-strength-3:calc(var(--shadow-strength) + 2%);--shadow-strength-4:calc(var(--shadow-strength) + 3%);--shadow-strength-5:calc(var(--shadow-strength) + 4%);--shadow-strength-6:calc(var(--shadow-strength) + 5%);--shadow-strength-7:calc(var(--shadow-strength) + 6%);--shadow-strength-8:calc(var(--shadow-strength) + 7%);--size-1:.25rem;--size-10:5rem;--size-2:.5rem;--size-3:1rem;--size-4:1.25rem;--size-5:1.5rem;--size-8:3rem;--size-content-1:20ch;--size-content-2:45ch;--size-content-3:60ch;--size-fluid-5:max(4rem,min(5vw,5rem));--size-header-1:20ch;--size-header-2:25ch;--size-header-3:35ch;--size-relative-4:1.25ch;}

/* open-props normalize */
:where(html){--csstools-color-scheme--light:initial;--link:var(--indigo-7);--link-visited:var(--purple-7);--text-1:var(--gray-12);--text-2:var(--gray-7);--surface-1:var(--gray-0);--surface-2:var(--gray-2);--surface-3:var(--gray-3);--surface-4:var(--gray-4);--scrollthumb-color:var(--gray-7);-webkit-text-size-adjust:none;accent-color:var(--brand,var(--link));background-color:var(--surface-1);block-size:100%;caret-color:var(--brand,var(--link));color:var(--text-1);color-scheme:light;font-family:var(--font-system-ui);line-height:var(--font-lineheight-3);scrollbar-color:var(--scrollthumb-color) transparent}@media (dynamic-range:high) or (color-gamut:p3){@supports (color:color(display-p3 0 0 0)){:where(html){--link:color(display-p3 .1 .39 1);--link-visited:color(display-p3 .6 .2 1)}}}:where(html) :where(dialog){background-color:var(--surface-1)}:where(html) :where(button,.btn){--_highlight:var(--_highlight-light);--_bg:var(--_bg-light);--_ink-shadow:var(--_ink-shadow-light)}:where(html) :where(button,.btn) :where([type=reset]){--_text:var(--red-6);--_border:var(--red-3)}:where(html) [disabled]:where(button,input[type=button],.btn){--_text:var(--gray-6)}:where(html) [disabled]:where(button,input[type=submit],.btn){--_text:var(--gray-6)}:where(html) [disabled]:where(button,input[type=reset],.btn){--_text:var(--gray-6)}:where(html) :where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:var(--surface-2)}@media (prefers-color-scheme:dark){:where(html){--csstools-color-scheme--light: ;--link:var(--indigo-3);--link-visited:var(--purple-3);--text-1:var(--gray-1);--text-2:var(--gray-4);--surface-1:var(--gray-9);--surface-2:var(--gray-8);--surface-3:var(--gray-7);--surface-4:var(--gray-6);--scrollthumb-color:var(--gray-6);--shadow-strength:10%;--shadow-color:220 40% 2%;color-scheme:dark}}:where(a[href]){color:var(--brand,var(--link))}:where(a[href]):where(:visited){color:var(--link-visited)}:focus-visible{outline-color:var(--brand,var(--link))}*,:after,:before{box-sizing:border-box}:where(:not(dialog)){margin:0}:where(:not(fieldset,progress,meter)){background-origin:border-box;background-repeat:no-repeat;border-style:solid;border-width:0}@media (prefers-reduced-motion:no-preference){:where(html){scroll-behavior:smooth}}@media (prefers-reduced-motion:no-preference){:where(:focus-visible){transition:outline-offset 145ms var(--ease-2)}:where(:not(:active):focus-visible){transition-duration:.25s}}:where(:not(:active):focus-visible){outline-offset:5px}:where(body){min-block-size:100%}:where(h1,h2,h3,h4,h5,h6){text-wrap:balance;font-weight:var(--font-weight-9);line-height:var(--font-lineheight-1)}:where(h1){font-size:var(--font-size-8);max-inline-size:var(--size-header-1)}:where(h2){font-size:var(--font-size-6);max-inline-size:var(--size-header-2)}:where(h3){font-size:var(--font-size-5)}:where(h4){font-size:var(--font-size-4)}:where(h5){font-size:var(--font-size-3)}:where(h3,h4,h5,h6,dt){max-inline-size:var(--size-header-3)}:where(p,ul,ol,dl,h6){font-size:var(--font-size-2)}:where(a,u,ins,abbr){text-underline-offset:1px}@supports (-moz-appearance:none){:where(a,u,ins,abbr){text-underline-offset:2px}}:where(a[href],area,button,input:not([type=text],[type=email],[type=number],[type=password],[type=""],[type=tel],[type=url]),label[for],select,summary,[tabindex]:not([tabindex*="-"],pre)){cursor:pointer}:where(a[href],area,button,input,label[for],select,summary,textarea,[tabindex]:not([tabindex*="-"])){-webkit-tap-highlight-color:transparent;touch-action:manipulation}:where(a):where([href]){text-decoration-color:var(--indigo-2)}:where(a):where([href]):where(:visited){text-decoration-color:var(--purple-2)}:where(a):where(:not(:hover)){text-decoration:inherit}:where(img,svg,video,canvas,audio,iframe,embed,object){display:block}:where(img,svg,video){block-size:auto;max-inline-size:100%}:where(input,button,textarea,select),:where(input[type=file])::-webkit-file-upload-button{color:inherit;font:inherit;font-size:inherit;letter-spacing:inherit}::placeholder{color:var(--gray-7);opacity:.75}:where(input:not([type=range]),textarea){padding-block:var(--size-1);padding-inline:var(--size-2)}:where(select){field-sizing:content;padding-block:.75ch;padding-inline:var(--size-relative-4) 0}:where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:var(--surface-2);border-radius:var(--radius-2)}:where(textarea){field-sizing:content;min-block-size:2lh;min-inline-size:var(--size-content-1);resize:vertical}:where(input[type=checkbox],input[type=radio]){block-size:var(--size-3);inline-size:var(--size-3)}:where(svg:not([width])){inline-size:var(--size-10)}:where(code,kbd,samp,pre){font-family:var(--font-monospace-code),monospace}:where(:not(pre)>code,kbd){white-space:nowrap}:where(pre){direction:ltr;max-inline-size:max-content;min-inline-size:0;white-space:pre;writing-mode:lr}:where(:not(pre)>code){background:var(--surface-2);border-radius:var(--radius-2);padding:var(--size-1) var(--size-2);writing-mode:lr}:where(kbd,var){border-color:var(--surface-4);border-radius:var(--radius-2);border-width:var(--border-size-1);padding:var(--size-1) var(--size-2)}:where(mark){border-radius:var(--radius-2);padding-inline:var(--size-1)}:where(ol,ul){padding-inline-start:var(--size-8)}:where(li){padding-inline-start:var(--size-2)}:where(li,dd,figcaption){max-inline-size:var(--size-content-2)}:where(p){text-wrap:pretty;max-inline-size:var(--size-content-3)}:where(dt,summary){font-weight:var(--font-weight-7)}:where(dt:not(:first-of-type)){margin-block-start:var(--size-5)}:where(small){font-size:max(.5em,var(--font-size-0));max-inline-size:var(--size-content-1)}:where(hr){background-color:var(--surface-3);height:var(--border-size-2);margin-block:var(--size-fluid-5)}:where(figure){display:grid;gap:var(--size-2);place-items:center}:where(figure)>:where(figcaption){text-wrap:balance;font-size:var(--font-size-1)}:where(blockquote,:not(blockquote)>cite){border-inline-start-width:var(--border-size-3)}:where(blockquote){display:grid;gap:var(--size-3);max-inline-size:var(--size-content-2);padding-block:var(--size-3);padding-inline:var(--size-4)}:where(:not(blockquote)>cite){padding-inline-start:var(--size-2)}:where(summary){background:var(--surface-3);border-radius:var(--radius-2);margin:calc(var(--size-2)*-1) calc(var(--size-3)*-1);padding:var(--size-2) var(--size-3)}:where(details){background:var(--surface-2);border-radius:var(--radius-2);padding-block:var(--size-2);padding-inline:var(--size-3)}:where(details[open]>summary){border-end-end-radius:0;border-end-start-radius:0;margin-bottom:var(--size-2)}:where(fieldset){border:var(--border-size-1) solid var(--surface-4);border-radius:var(--radius-2)}:where(del){background:var(--red-9);color:var(--red-2)}:where(ins){background:var(--green-9);color:var(--green-1)}:where(abbr){text-decoration-color:var(--blue-5)}:where(dialog){background-color:var(--surface-1);border-radius:var(--radius-3);box-shadow:var(--shadow-6);color:inherit}:where(menu){display:flex;gap:var(--size-3);padding-inline-start:0}:where(sup){font-size:.5em}:where(table){--nice-inner-radius:calc(var(--radius-3) - 2px);background:var(--surface-2);border:1px solid var(--surface-2);border-radius:var(--radius-3);width:fit-content}:where(table:not(:has(tfoot)) tr:last-child td:first-child){border-end-start-radius:var(--nice-inner-radius)}:where(table:not(:has(tfoot)) tr:last-child td:last-child){border-end-end-radius:var(--nice-inner-radius)}:where(table thead tr:first-child th:first-child){border-start-start-radius:var(--nice-inner-radius)}:where(table thead tr:first-child th:last-child){border-start-end-radius:var(--nice-inner-radius)}:where(tfoot tr:last-child th:first-of-type){border-end-start-radius:var(--nice-inner-radius)}:where(tfoot tr:last-child td:first-of-type){border-end-start-radius:var(--nice-inner-radius)}:where(tfoot tr:last-child th:last-of-type){border-end-end-radius:var(--nice-inner-radius)}:where(tfoot tr:last-child td:last-of-type){border-end-end-radius:var(--nice-inner-radius)}:where(th){background-color:var(--surface-2);color:var(--text-1)}:where(table a:not(.does-not-exist):focus-visible){outline-offset:-2px}:where(table button:not(.does-not-exist):focus-visible){outline-offset:-2px}:where(table [contenteditable]:focus-visible){outline-offset:-2px}:where(td){text-wrap:pretty;background:var(--surface-1);max-inline-size:var(--size-content-2)}:where(td,th){padding:var(--size-2);text-align:left}:where(td:not([align])){text-align:center}:where(th:not([align])){text-align:center}:where(thead){border-collapse:collapse}:where(table tr:hover td),:where(tbody tr:nth-child(2n):hover td){background-color:var(--surface-3)}:where(table>caption){margin:var(--size-3)}:where(tfoot button){padding-block:var(--size-1);padding-inline:var(--size-3)}@media (prefers-color-scheme:dark){:where(textarea,select,input:not([type=button],[type=submit],[type=reset])){background-color:#171a1c}:where(dialog){background-color:var(--surface-2)}::placeholder{color:var(--gray-6)}}
/* ═══════════════════════════════════════════════════════════════════════
   FredFix — Stylesheet
   ═══════════════════════════════════════════════════════════════════════ */

/* ── Design Tokens ─────────────────────────────────────────────────── */
:root {
  /* Merk — beide kleuren gemeten uit de logobestanden (extract + spotsamples).
     Merkblauw is ALTIJD een vlak met wit erop: op de navy grond haalt het
     1,76:1 en is het dus onleesbaar als tekst. Wit op merkblauw = 10,1:1. */
  --primary: #013F8A;
  --accent: #013F8A;           /* het merk heeft twee kleuren: navy = grond, blauw = accent */

  /* Oppervlakken en tekst — donkere grond */
  --bg: #05192D;
  --surface: #0B2237;
  --text: #F2F6FA;
  --text-muted: #93A6B8;
  --border: #16324B;

  /* Bedieningselementen hebben een eigen, lichtere rand dan een decoratieve
     lijn: WCAG 1.4.11 vraagt 3:1 voor de begrenzing van een invoerveld.
     --border haalt 1,35:1 op de grond en is dus alleen bruikbaar als scheiding,
     niet als rand van een veld. Gemeten: 3,43:1 op de grond, 3,13:1 op --surface.
     De focusrand is merkblauw OPGELICHT — #013F8A zelf haalt 1,76:1 op deze
     grond en is daarom nergens een lijn of rand op donker. */
  --field-border: #51708F;
  --field-focus: #3B87E0;

  /* Licht register (registerwissel: storingen + werkgebied) */
  --light-bg: #E8EDF2;
  --light-surface: #FFFFFF;
  --light-text: #05192D;
  --light-muted: #47607A;
  --light-border: #C9D4DE;

  /* Donkere secties — deze site IS donker, dus gelijk aan de basis */
  --dark-bg: #05192D;
  --dark-text: #F2F6FA;
  --dark-text-muted: #93A6B8;

  /* Vorm en maat */
  --radius: 2px;
  --radius-lg: 2px;
  --max-width: 1160px;
  --nav-height: 108px;
  --section-padding: clamp(2.5rem, 5vw, 4rem);   /* ritme-preset Compact: dichtheid = competentie */
  /* Hoever de actieband onder de heronaad uitsteekt. Eén bron, want dit getal
     staat op twee plekken die exact gelijk moeten blijven: de negatieve marge
     van de band en de compenserende bovenpadding van de sectie eronder. Stonden
     die los, dan is de ruimte onder de band niet meer gelijk aan het normale
     sectieritme — hier was dat 16px teveel op telefoon en 24px op desktop. */
  --band-overhang: clamp(2.5rem, 5vw, 4rem);
  --transition: 0.28s cubic-bezier(0.32, 0.72, 0, 1);

  /* Typografie — zelf gehost, zie @font-face onderaan dit blok */
  --font: 'Mulish', 'Mulish Fallback', system-ui, sans-serif;
  --font-heading: 'Saira', 'Saira Fallback', system-ui, sans-serif;

  /* Typeschaal — ratio 1.200 (Compact). Display-stappen 4/5 lopen bewust
     verder door: dit is een type-gedreven hero zonder beeld. */
  --step--1: clamp(0.875rem, 0.85rem + 0.12vw, 0.95rem);
  --step-0:  clamp(1rem, 0.97rem + 0.15vw, 1.08rem);
  --step-1:  clamp(1.15rem, 1.09rem + 0.3vw, 1.33rem);
  --step-2:  clamp(1.38rem, 1.28rem + 0.5vw, 1.65rem);
  --step-3:  clamp(1.66rem, 1.48rem + 0.85vw, 2.1rem);
  --step-4:  clamp(2rem, 1.6rem + 1.9vw, 3rem);
  --step-5:  clamp(2.05rem, 1.35rem + 3.6vw, 4.9rem);

  /* Spacing-schaal — normaal werk komt hieruit; gedocumenteerde optische
     uitzonderingen mogen. Semantiek:
     1 inline/icoon-gap · 2 label→kop · 3 kop→body, binnen component
     4 component-padding · 5 component→component · 6 blok→blok binnen sectie
     7 sectiegroep · sectie-tot-sectie = var(--section-padding) */
  --space-1: 0.25rem;
  --space-2: 0.5rem;
  --space-3: 0.75rem;
  --space-4: 1rem;
  --space-5: 1.5rem;
  --space-6: 2.5rem;
  --space-7: 4rem;

  /* Z-index-schaal — nooit losse 999/9999 */
  --z-nav: 1000;
  --z-menu: 1100;      /* mobiel menu + overlay: boven de nav */
  --z-progress: 1200;
  --z-overlay: 1300;   /* preloader, lightbox-laag */

  /* Formulier-status (main.js verwacht deze namen) */
  --color-success: #2f7a43;
  --color-danger: #b3372f;
}

/* ── Base reset ────────────────────────────────────────────────────── */
* { box-sizing: border-box; }

/* open-props normalize indents the <li> via padding-inline-start (NOT the <ul>),
   which beats a shorthand `padding: 0` on the <ul>. Without this, footer/nav
   list links hang ~1ch right of sibling headings. Recurring demo trap — keep.
   Bulleted content lists: set their own ul { list-style: disc; padding-inline-start: 1.25rem }. */
ul { margin: 0; padding: 0; list-style: none; }
li { padding-inline-start: 0; margin-inline-start: 0; }

/* ── Typografie-basis (Baseline 2024-2026, geen fallback nodig) ──────
   text-box trimt de lege ruimte boven de kapitaalhoogte en onder de
   baseline weg: koppen en knoptekst zitten optisch exact in hun box.
   Geen font-size-adjust op body: die erft als één getal door naar elk
   font en schakelt de size-adjust van de fallback-faces uit, waardoor
   tekst bij de font-swap verspringt. */
/* open-props normalize zet `place-items: center` op :where(figure). Elk
   bijschrift dat smaller is dan zijn kolom wordt daardoor gecentreerd, en het
   is onzichtbaar zodra de tekst tot de volle breedte wrapt — dus het duikt
   willekeurig op bij precies de kortste caption, en nergens anders. Deze site
   lijnt links uit op één doorlopende lijn, dus dat resetten we één keer bij de
   bron in plaats van per component. Controle: figcaption.left moet gelijk zijn
   aan img.left, gemeten op een SMALLE viewport (breed verbergt het). */
figure { justify-items: start; }
h1, h2, h3 { text-wrap: balance; text-box: trim-both cap alphabetic; }
p, li, blockquote { text-wrap: pretty; }
/* Kop die je met SplitText splitst: text-wrap: initial op dat element,
   anders meet je de animatie halverwege een herbalancering. */

/* ── Button-contract (STRUCTUUR — personality komt per project) ──────
   Globaal vastgelegd: targets, alignment, focus, states, icoon-relatie.
   Personality hier: harde hoek (2px), zwaar gewicht, ruime horizontale
   padding omdat dit actieknoppen zijn (bellen, berichten), geen schaduw. */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-height: 48px;
  padding: 0.9rem 1.75rem;
  border: 1px solid transparent;
  border-radius: var(--radius);
  font-family: var(--font-heading);
  font-size: var(--step-0);
  font-weight: 600;
  letter-spacing: 0.02em;
  text-box: trim-both cap alphabetic;  /* tekst optisch gecentreerd in de knop */
  text-decoration: none;
  cursor: pointer;
  transition: background-color var(--transition), border-color var(--transition), color var(--transition);
}
.btn:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.btn[disabled], .btn[aria-disabled="true"] { opacity: 0.55; pointer-events: none; }
/* Varianten per project stylen: .btn-primary / .btn-outline / .btn-on-dark.
   Hover ALTIJD binnen @media (hover: hover); hover-tint via
   color-mix(in oklch, var(--primary), black 12%) — geen --primary-hover. */

/* ── Toegankelijkheid: twee media queries die op ELKE site horen ─────
   Open-props dekt alleen scroll-behavior.
   prefers-reduced-motion neutraliseert CSS-animatie; GSAP-motion zet je
   apart uit met gsap.matchMedia(), CSS bereikt die tweens niet.
   prefers-contrast is hier bewust minimaal: breid uit met de tokens die
   dit project echt gebruikt, verzin er geen. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

@media (prefers-contrast: more) {
  .btn { border-color: currentColor; }
  a:not(.btn) { text-decoration: underline; }
}

/* ── Zelf gehoste fonts ─────────────────────────────────────────────
   Extern laden kost twee origins, een render-blocking CSS-bestand en een
   font-swap na de eerste paint. Latin-subset, unicode-range zoals Google
   die zelf zet, zodat latin-ext alleen opgehaald wordt als het nodig is. */
/* size-adjust 98.04% = 0.50 / 0.51: Saira rendert op de x-hoogte van Mulish,
   de maat waarop alle koppen ontworpen zijn. */
@font-face {
  font-family: 'Saira'; font-style: normal; font-weight: 400 700; font-display: swap;
  size-adjust: 98.04%;
  src: url('/assets/fonts/saira-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: 'Saira'; font-style: italic; font-weight: 600 700; font-display: swap;
  size-adjust: 98.04%;
  src: url('/assets/fonts/saira-latin-italic.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: 'Mulish'; font-style: normal; font-weight: 400 700; font-display: swap;
  src: url('/assets/fonts/mulish-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: 'Mulish'; font-style: italic; font-weight: 400; font-display: swap;
  src: url('/assets/fonts/mulish-latin-italic.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;
}

/* Fallback-faces gemeten op de tekst van alle pagina's (breedte per gewicht,
   verticale maten gedeeld door size-adjust). */
@font-face { font-family: 'Mulish Fallback'; font-weight: 100 500;
  src: local('Arial'), local('ArialMT'), local('Liberation Sans'), local('Helvetica');
  size-adjust: 103.7%; ascent-override: 96.9%; descent-override: 24.1%; line-gap-override: 0%; }
@font-face { font-family: 'Saira Fallback'; font-weight: 100 500;
  src: local('Arial'), local('ArialMT'), local('Liberation Sans'), local('Helvetica');
  size-adjust: 101.4%; ascent-override: 109.8%; descent-override: 42.4%; line-gap-override: 0%; }
@font-face { font-family: 'Saira Fallback'; font-weight: 600 700;
  src: local('Arial Bold'), local('Arial-BoldMT'), local('Liberation Sans Bold'), local('Helvetica Bold'), local('Helvetica-Bold');
  size-adjust: 96.4%; ascent-override: 115.5%; descent-override: 44.6%; line-gap-override: 0%; }

/* ── Open-props normalize trap-fixes ────────────────────────────────
   Elke regel hier heeft een echte build gebroken; laten staan. */
:where(h1, h2, h3, h4, h5, h6) { max-inline-size: none; }
:where(ul[class], ol[class]) { padding-inline-start: 0; margin-block: 0; list-style: none; }
li { padding-inline-start: 0; text-indent: 0; max-inline-size: none; }
figure { margin: 0; display: block; align-items: initial; }
figcaption { max-inline-size: none; }
details { background: transparent; border-radius: 0; padding: 0; }
summary { background: transparent; border-radius: 0; margin: 0; padding: 0; }
[hidden] { display: none !important; }
svg { display: block; }
img { max-width: 100%; height: auto; }

:root { color-scheme: light; interpolate-size: allow-keywords; }
[id] { scroll-margin-top: calc(var(--nav-height) + 1rem); }
html, body { overflow-x: clip; }   /* nooit hidden: dat doodt position:sticky */

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font);
  font-size: var(--step-0);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4 {
  font-family: var(--font-heading);
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -0.02em;
  margin: 0;
}
p { margin: 0; }
a { color: inherit; }

.container { width: min(var(--max-width), 100% - 2.5rem); margin-inline: auto; }
.container--narrow { width: min(720px, 100% - 2.5rem); margin-inline: auto; }

.skip-link {
  position: absolute; left: -9999px; top: 0; z-index: var(--z-overlay);
  background: var(--primary); color: #fff; padding: 0.75rem 1.25rem;
  font-family: var(--font-heading); font-weight: 600;
}
.skip-link:focus { left: 0; }

:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }

/* Merkecho: de italic uit het wordmark, spaarzaam. Alleen op het
   telefoonnummer, de dagdeel-labels en de sectienummers. */
.echo { font-family: var(--font-heading); font-style: italic; font-weight: 700; letter-spacing: -0.01em; }

/* Sectienummer — structuurmiddel, geen eyebrow boven elke kop */
.sect-nr {
  font-family: var(--font-heading); font-style: italic; font-weight: 700;
  font-size: var(--step--1); letter-spacing: 0.06em;
  color: var(--text-muted); display: block; margin-bottom: var(--space-2);
}

/* ── Knopvarianten ──────────────────────────────────────────────── */
.btn-primary { background: var(--primary); color: #fff; }
.btn-line { background: transparent; color: var(--text); border-color: var(--border); }
.btn-on-blue { background: #fff; color: var(--primary); }
.btn-ghost-on-blue { background: transparent; color: #fff; border-color: rgb(255 255 255 / 0.5); }
@media (hover: hover) {
  .btn-primary:hover { background: color-mix(in oklch, var(--primary), black 14%); }
  .btn-line:hover { border-color: var(--text); background: rgb(255 255 255 / 0.06); }
  .btn-on-blue:hover { background: #E8EDF2; }
  .btn-ghost-on-blue:hover { background: rgb(255 255 255 / 0.12); border-color: #fff; }
}
.btn-primary:active { background: color-mix(in oklch, var(--primary), black 14%); }

/* ── Navbar ─────────────────────────────────────────────────────────
   Het logo is een vierkante lockup van vier lagen (sifon-mark, wordmark,
   tagline, nummer). Onder ~60px hoogte valt het wordmark weg, dus de balk
   krijgt hoogte in plaats van het logo een uitsnede. */
#site-navbar {
  position: sticky; top: 0; z-index: var(--z-nav); background: var(--bg);
  /* De navbar wordt geïnjecteerd; zonder gereserveerde hoogte is <header> 0px
     tot components.js draait en schuift de hele pagina daarna naar beneden.
     Gemeten CLS was 0,103 met main als bron. +1px: de rand onder .nav valt
     buiten --nav-height. */
  min-height: calc(var(--nav-height) + 1px);
}
.nav { border-bottom: 1px solid var(--border); }
.nav-container {
  width: min(var(--max-width), 100% - 2.5rem); margin-inline: auto;
  min-height: var(--nav-height);
  display: flex; align-items: center; gap: var(--space-5);
}
.nav-logo { display: flex; align-items: center; flex: none; }
.nav-logo img { width: auto; height: 84px; }

.nav-links { display: flex; align-items: center; gap: var(--space-5); margin-left: auto; }
.nav-link {
  font-family: var(--font-heading); font-weight: 600; font-size: var(--step--1);
  letter-spacing: 0.04em; text-transform: uppercase; text-decoration: none;
  color: var(--text-muted); padding-block: 0.5rem;
  transition: color var(--transition);
}
.nav-link.active { color: var(--text); }
@media (hover: hover) { .nav-link:hover { color: var(--text); } }

.nav-right { display: flex; align-items: center; gap: var(--space-4); }
.nav-phone {
  font-size: var(--step-1); color: var(--text); text-decoration: none;
  padding: 0.5rem 0; white-space: nowrap;
  transition: color var(--transition);
}
@media (hover: hover) { .nav-phone:hover { color: #fff; } }

/* Menuknop: gelabeld en visueel los van het logo (een kaal icoon tegen het
   logo wordt voor sierwerk aangezien). Mobiel is dit het enige item rechts. */
.hamburger {
  display: none; align-items: center; gap: 0.55rem; margin-left: auto;
  min-height: 44px; padding: 0.5rem 0.9rem;
  background: transparent; border: 1px solid var(--border); border-radius: var(--radius);
  color: var(--text); font-family: var(--font-heading); font-weight: 600;
  font-size: var(--step--1); letter-spacing: 0.08em; text-transform: uppercase;
  cursor: pointer;
}
.hamburger-bars { display: grid; gap: 4px; width: 18px; }
.hamburger-bars span { display: block; height: 2px; background: currentColor; transition: transform var(--transition), opacity 0.2s ease; }
.hamburger[aria-expanded="true"] .hamburger-bars span:nth-child(1) { transform: translateY(3px) rotate(45deg); }
.hamburger[aria-expanded="true"] .hamburger-bars span:nth-child(2) { transform: translateY(-3px) rotate(-45deg); }
/* Eén sluitknop: de x in het paneel. De menuknop zelf verdwijnt zodra het
   paneel open is; de focus staat dan al binnen het paneel. */
.hamburger[aria-expanded="true"] { opacity: 0; pointer-events: none; }

@media (max-width: 940px) {
  :root { --nav-height: 84px; }
  .nav-logo img { height: 64px; }
  .nav-links, .nav-right { display: none; }
  .hamburger { display: inline-flex; }
}

/* ── Mobiel menu: onder-lade ────────────────────────────────────────
   Schuift van onderen op zodat bellen en WhatsApp in de duimzone landen.
   Binaire toestand, dus CSS-transitie op transform. Nooit GSAP. */
.mobile-overlay {
  position: fixed; inset: 0; background: rgb(2 10 20 / 0.6);
  opacity: 0; visibility: hidden; z-index: calc(var(--z-menu) - 1);
  transition: opacity var(--transition), visibility 0s linear 0.28s;
}
.mobile-overlay.is-open { opacity: 1; visibility: visible; transition: opacity var(--transition), visibility 0s linear 0s; }

.mobile-menu {
  position: fixed; left: 0; right: 0; bottom: 0; max-height: 92svh;
  background: var(--primary); color: #fff; z-index: var(--z-menu);
  display: flex; flex-direction: column; gap: var(--space-5);
  padding: var(--space-5) 1.5rem calc(var(--space-6) + env(safe-area-inset-bottom));
  overflow-y: auto; overscroll-behavior: contain;
  transform: translate3d(0, 100%, 0); visibility: hidden;
  transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1), visibility 0s linear 0.3s;
}
@media (max-height: 700px) {
  /* Op 320x568 was de lade 621px hoog en scrollde ze 53px; 360x640 scrollde 18.
     Grens op 700 zodat beide maten erin vallen. */
  .mobile-menu { padding-block: var(--space-4) var(--space-5); gap: var(--space-4); }
  .mobile-nav-link { font-size: var(--step-2); padding-block: 0.4rem; }
  .mobile-menu-foot { padding-top: var(--space-4); gap: var(--space-3); }
  .mobile-menu-line { display: none; }
}
@media (max-height: 780px) {
  /* Anders blijft er een strook van de gesloten navbalk boven de lade staan.
     Grens op 780 en niet op 720: 360x740 is een verplichte testmaat en viel
     er precies buiten. */
  .mobile-menu { top: 0; max-height: 100svh; justify-content: center; }
}
.mobile-menu.is-open {
  transform: translate3d(0, 0, 0); visibility: visible;
  transition: transform 0.34s cubic-bezier(0.32, 0.72, 0, 1), visibility 0s linear 0s;
}
.mobile-menu-head { display: flex; align-items: center; justify-content: space-between; }
.mobile-menu-title {
  font-family: var(--font-heading); font-style: italic; font-weight: 700;
  font-size: var(--step--1); letter-spacing: 0.12em; text-transform: uppercase;
  color: rgb(255 255 255 / 0.75);
}
.mobile-close {
  background: transparent; border: 0; color: #fff; font-size: 2rem; line-height: 1;
  min-width: 44px; min-height: 44px; cursor: pointer; padding: 0;
}
.mobile-nav-links { display: grid; }
.mobile-nav-link {
  display: block; font-family: var(--font-heading); font-weight: 700;
  font-size: var(--step-3); letter-spacing: -0.02em; text-decoration: none;
  color: #fff; padding-block: 0.6rem; min-height: 44px;
}
.mobile-nav-link.active { color: #fff; position: relative; padding-left: 1.1rem; }
.mobile-nav-link.active::before {
  content: ''; position: absolute; left: 0; top: 50%; translate: 0 -50%;
  width: 5px; height: 1.1em; background: #fff;
}
.mobile-menu-foot { display: grid; gap: var(--space-4); border-top: 1px solid rgb(255 255 255 / 0.25); padding-top: var(--space-5); }
.mobile-menu-line { font-size: var(--step--1); color: rgb(255 255 255 / 0.8); }
.mobile-menu-acties { display: grid; gap: var(--space-3); }

@media (prefers-reduced-motion: no-preference) {
  .mobile-nav-links li { opacity: 0; transform: translate3d(0, 12px, 0);
    transition: opacity 0.26s ease-out, transform 0.26s ease-out; }
  .mobile-menu.is-open .mobile-nav-links li { opacity: 1; transform: translate3d(0, 0, 0); }
  .mobile-menu.is-open .mobile-nav-links li:nth-child(1) { transition-delay: 0.08s; }
  .mobile-menu.is-open .mobile-nav-links li:nth-child(2) { transition-delay: 0.12s; }
  .mobile-menu.is-open .mobile-nav-links li:nth-child(3) { transition-delay: 0.16s; }
  .mobile-menu.is-open .mobile-nav-links li:nth-child(4) { transition-delay: 0.20s; }
  .mobile-menu.is-open .mobile-nav-links li:nth-child(5) { transition-delay: 0.24s; }
  /* Sluiten is geen omgekeerde opening: de regels vertrekken mee met het paneel. */
  .mobile-menu:not(.is-open) .mobile-nav-links li { transition-delay: 0s; transition-duration: 0.12s; }
}

/* ── Hero — anatomie: typographic-no-image ──────────────────────────
   Er is geen hero-waardige foto in de set (gate: ARM), dus draagt het type
   alles. De merkblauwe actieband is het eerste van drie accent-vlakken en
   loopt door onder de heronaad: dat is amplitude 1 en tegelijk de reden dat
   de primaire actie op elk toestel boven de vouw staat. */
/* Flex-kolom zodat de volgorde per viewport kan wisselen: op een breed scherm
   leest kop > uitleg > actie, op een smal of laag scherm kop > actie > uitleg,
   want de primaire actie moet op elk toestel boven de vouw staan. */
.hero { padding-top: clamp(1.25rem, 4vw, 3.5rem); padding-bottom: 0; display: flex; flex-direction: column; }
.hero-kop { order: 1; }
.hero-uitleg { order: 2; }
.hero-band { order: 3; }

.hero h1 {
  font-size: var(--step-5);
  line-height: 1.02;
  letter-spacing: -0.03em;
  max-inline-size: none;
  text-wrap: initial;          /* eigen regelval via spans, geen balance-hersplitsing */
  /* Het belofteblok is een inline-block met eigen padding, dus zijn onderkant
     steekt onder de doos van de h1 uit — en die overhang groeit mee met de
     kopgrootte. Zonder deze padding raakt hij de lead: gemeten 0px speling op
     1440 en -2px vanaf 1512, waar het blauwe vlak dwars over de eerste
     tekstregel liep. In `em`, want dan schaalt hij exact mee met --step-5
     i.p.v. op één breedte toevallig te kloppen. */
  padding-bottom: 0.32em;
}
.hero h1 span { display: block; }
.hero h1 .mark {
  /* De belofte is geen tekstkleur maar een VLAK: merkblauw haalt op de navy
     grond maar 1,76:1 en is dus nooit tekst. Wit op merkblauw = 10,1:1. */
  display: inline-block;
  background: var(--primary);
  color: #fff;
  padding: 0.1em 0.3em 0.15em;
  margin-top: 0.14em;
  margin-left: -0.3em;
}
.hero-lead {
  /* Tweede uitlijnlijn: zonder deze kolom eindigt elke hero-regel op een
     andere breedte en leest het rechterdeel als leegte in plaats van ruimte
     (gemeten: 25% onbewoond op elke breedte, 47% in landschap). */
  margin-top: var(--space-5);
  margin-left: auto;
  max-inline-size: 46ch;
  font-size: var(--step-1);
  color: var(--text-muted);
}

/* Op schermen met ruimte mag de kop wat verder van de navbalk staan: 20px onder
   een balk van 85px leest als aangeplakt. Alleen boven 720px hoogte, want daar
   ligt de grens waaronder de hero-volgorde al omklapt om de belknop binnen de
   vouw te houden. */
@media (min-height: 721px) {
  .hero { padding-top: clamp(1.75rem, 4vw, 3.5rem); }
}

/* Desktop: de lead krijgt een ECHTE tweede kolom in plaats van een rechterrand.
   Met `margin-left:auto` + 46ch lag zijn linkerrand op 713px — een toevallig
   gevolg van de tekstlengte, dat met niets anders in de hero uitlijnde. Nu de
   halve container (740px), een lijn die blijft staan los van de copy. */
/* Lead onder de kop, op DEZELFDE linkerlijn — niet in een tweede kolom.
   Twee pogingen tot asymmetrie zijn hier stukgelopen en allebei om dezelfde
   reden: de breedte van het belofteblok volgt uit de tekstlengte bij een
   kopgrootte die met vw meeschaalt, terwijl een kolomlijn op een vast
   percentage staat. Die twee zijn onafhankelijk, dus er is altijd een
   vensterbreedte waarbij ze elkaar raken — op 1440 was de speling 11px en
   daarboven liep de lead dwars over het blauwe vlak. Leesmaat via
   max-inline-size, en de actieband eronder draagt de volle breedte. */
@media (min-width: 861px) {
  .hero-lead { margin-left: 0; max-inline-size: 52ch; }
}

/* De actieband: full-bleed merkblauw, steekt onder de heronaad uit en draagt
   de openingsregel van de sectie eronder. */
.hero-band {
  /* CONTAINED, niet full-bleed: de band zakt half in het lichte register
     eronder, zodat links en rechts van de band navy boven en licht onder
     zichtbaar blijft. Een ondoorzichtige band tussen twee vlakken van
     dezelfde kleur is geen naadbreuk. */
  margin-top: clamp(2.5rem, 5vw, 3.5rem);
  margin-bottom: calc(-1 * var(--band-overhang));
  position: relative;
  z-index: 2;
}
.hero-band-inner {
  width: min(var(--max-width), 100% - 2.5rem); margin-inline: auto;
  background: var(--primary);
  color: #fff;
  /* Asymmetrisch: de noot is het laatste element en stond met 26px tegen de
     onderrand van het blauwe vlak, terwijl er onder de band ruim wit volgde.
     Onder krijgt dus meer dan boven. Bewust HERVERDEELD en niet toegevoegd:
     op 320x568 heeft de hero maar 14px speling tot de vouw. */
  padding: clamp(1.35rem, 2.9vw, 2.5rem) clamp(1.25rem, 3vw, 2.5rem) clamp(2rem, 4.2vw, 3.4rem);
  display: grid; gap: var(--space-5);
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
}
.hero-band-nummer { display: block; text-decoration: none; color: #fff; }
.hero-band-label {
  display: block; font-family: var(--font-heading); font-weight: 600;
  font-size: var(--step--1); letter-spacing: 0.12em; text-transform: uppercase;
  color: rgb(255 255 255 / 0.78); margin-bottom: 0.35rem;
}
.hero-band-tel {
  display: block; font-size: clamp(1.9rem, 1.2rem + 3vw, 3.1rem);
  line-height: 1; white-space: nowrap;
}
.hero-band-acties { display: flex; gap: var(--space-3); flex-wrap: wrap; }
.hero-band-noot {
  grid-column: 1 / -1; margin: 0; font-size: var(--step--1);
  color: rgb(255 255 255 / 0.8);
}
@media (hover: hover) { .hero-band-nummer:hover .hero-band-tel { text-decoration: underline; text-underline-offset: 4px; } }

@media (max-width: 860px) {
  .hero-band-inner { grid-template-columns: 1fr; gap: var(--space-4); }
  .hero-band-acties { display: grid; grid-template-columns: 1fr 1fr; }
}
/* Onder ~560px passen twee knopteksten niet naast elkaar zonder te wrappen. */
@media (max-width: 560px) {
  .hero-band-acties { grid-template-columns: 1fr; }
}

/* Krap scherm: de actieband schuift boven de uitleg, anders valt de belknop
   onder de vouw. Bewust zo smal mogelijk gehouden: waar de lead wel voor de
   band past, blijft de band het laatste hero-element en snijdt hij door de
   heronaad. Gemeten per maat, niet geschat. */
@media (max-width: 384px), (max-height: 720px) {
  .hero-uitleg { order: 3; }
  /* Geen negatieve ondermarge zodra de lead ONDER de band staat: die marge
     bestaat om door de heronaad te zakken, en trekt hier de band over de tekst. */
  .hero-band { order: 2; margin-top: 2.75rem; margin-bottom: 0; }
  .hero-uitleg .hero-lead { margin-top: clamp(1.25rem, 4vw, 2rem); margin-left: 0; max-inline-size: none; }
  /* In deze volgorde is de LEAD het laatste hero-element, niet de band. Twee
     gevolgen die allebei recht moesten: de tekst liep tot 11px tegen de
     sectienaad (de hero had `padding-bottom: 0`, want normaal overbrugt de
     overhangende band die naad), en de sectie eronder compenseerde nog steeds
     voor een overhang die hier niet bestaat — 100px leeg boven de "01". */
  .hero { padding-bottom: var(--section-padding); }
}

/* Laptopvensters van ~780px: de hero paste net niet. Kop en ruimte een maat
   terug in plaats van de band platter te drukken. */
@media (min-width: 861px) and (max-height: 860px) {
  .hero { padding-top: clamp(1rem, 2.5vw, 2rem); }
  .hero h1 { font-size: clamp(2.4rem, 1.4rem + 3vw, 4.1rem); }
  .hero-lead { margin-top: var(--space-4); }
  .hero-band { margin-top: clamp(1.5rem, 3vw, 2.25rem); }
  .hero-band-inner { padding-block: clamp(1.1rem, 2vw, 1.7rem) clamp(1.5rem, 2.8vw, 2.4rem); }
}

/* Korte schermen: type en witruimte een maat terug, anders duwt de kop alleen
   al de band weg. */
@media (max-height: 700px) {
  .hero h1 { font-size: clamp(1.75rem, 1.3rem + 2.4vw, 2.6rem); }
  .hero-lead { font-size: var(--step-0); }
  .hero-band-inner { padding-block: 0.8rem 1.4rem; }
}
/* Telefoon in landschap: de hele hero moet in ~360px hoogte. */
@media (max-height: 460px) {
  .hero { padding-top: 0.75rem; }
  .hero h1 { font-size: clamp(1.6rem, 1.1rem + 2.2vw, 2.1rem); max-inline-size: 26ch; }
  .hero-band-inner { padding-block: 0.85rem; grid-template-columns: minmax(0, 1fr) auto; align-items: center; }
  .hero-band-acties { display: flex; }
  .hero-band-tel { font-size: 1.6rem; }
  .hero-band-noot { display: none; }
}

/* ── Footer — contactband ───────────────────────────────────────────
   Eén dominant contactblok met het logo erin, navigatie als twee smalle
   kolommen ernaast. Geen vierkolomsraster met het logo als losse kolom. */
.footer { background: var(--bg); border-top: 1px solid var(--border); padding-top: var(--space-7); }
.footer-grid {
  display: grid; gap: var(--space-6) var(--space-7);
  grid-template-columns: minmax(0, 1.5fr) minmax(0, 0.75fr) minmax(0, 0.75fr);
}
.footer-hoofd { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--space-5); align-items: start; }
.footer-logo img { width: auto; height: 96px; }
.footer-adres p { margin: 0 0 var(--space-3); color: var(--text-muted); font-size: var(--step-0); }
.footer-naam { font-family: var(--font-heading); font-weight: 700; color: var(--text) !important; font-size: var(--step-1); }
.footer-adres a { color: var(--text); text-decoration: none; }
.footer-tel { font-size: var(--step-2); }
.footer-bereik { max-inline-size: 34ch; }
/* Tikvlak 44px, logo 28px in het midden: -8px zet het logo op de linkerlijn van de tekst. */
.footer-social { display: flex; gap: var(--space-2); margin-top: var(--space-2); }
.footer-adres .footer-social a { width: 44px; height: 44px; display: grid; place-items: center; margin-left: -8px; }
@media (hover: hover) { .footer-adres a:hover { text-decoration: underline; text-underline-offset: 4px; } }
.footer-heading {
  font-family: var(--font-heading); font-size: var(--step--1); font-weight: 600;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-muted);
  margin: 0 0 var(--space-4);
}
.footer-links { display: grid; gap: var(--space-3); }
.footer-links a { color: var(--text); text-decoration: none; font-size: var(--step-0); }
@media (hover: hover) { .footer-links a:hover { text-decoration: underline; text-underline-offset: 4px; } }
.footer-cookie-btn {
  display: inline-flex; align-items: center; min-height: 44px; padding: 0; border: 0; background: none;
  font: inherit; font-size: var(--step-0); color: var(--text); text-align: left; cursor: pointer;
}
@media (hover: hover) { .footer-cookie-btn:hover { text-decoration: underline; text-underline-offset: 4px; } }

.footer-bottom { margin-top: var(--space-7); border-top: 1px solid var(--border); }
.footer-bottom-inner {
  width: min(var(--max-width), 100% - 2.5rem); margin-inline: auto;
  padding-block: var(--space-5);
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); flex-wrap: wrap;
}
/* muted-token, niet het dimste: op deze grond haalt #93A6B8 5,0:1 */
.footer-copy { color: var(--text-muted); font-size: var(--step--1); }
.footer-agency img { opacity: 1; }   /* nooit een filter of lagere dekking */

@media (max-width: 900px) {
  .footer-grid { grid-template-columns: 1fr 1fr; }
  .footer-hoofd { grid-column: 1 / -1; }
}
@media (max-width: 520px) {
  .footer-hoofd { grid-template-columns: 1fr; gap: var(--space-4); }
  .footer-logo img { height: 56px; }
  /* De contactband erboven draagt het commerciële slot al; de footer hoeft daar
     niet nog een volledig scherm bovenop te zetten. Alleen de omkadering krimpt —
     de bereikbaarheidszin blijft staan, want op /werk en /diensten is dit de enige
     plek waar avond + weekend in de zichtbare tekst voorkomt. Tikdoelen (44px) en
     regelafstand blijven ongemoeid. */
  .footer { padding-top: var(--space-6); }
  /* Menu en Beleid onder elkaar: twee smalle kolommen naast elkaar lezen op een telefoon krap.
     Rij-afstand 40px: de links zijn 44px hoog met de tekst in het midden, dus bij 24px viel de
     kop van de volgende groep op hetzelfde ritme als een volgende link. */
  .footer-grid { grid-template-columns: 1fr; gap: var(--space-6) var(--space-7); }
  .footer-bottom { margin-top: var(--space-6); }
  /* Agency-logo op zijn eigen regel onder de copyright. */
  .footer-bottom-inner { flex-direction: column; align-items: flex-start; gap: var(--space-4); }
}

/* ── Sectiebasis ────────────────────────────────────────────────── */
.sectie { padding-block: var(--section-padding); }
/* Vangt de overhangende actieband op: precies de overhang plus het gewone
   sectieritme, zodat de ruimte onder de band gelijk is aan elke andere
   sectiestart. Nooit een los getal hier — zie --band-overhang. */
#wanneer { padding-top: calc(var(--section-padding) + var(--band-overhang)); }
/* Zelfde breekpunt als de hero-volgordewissel: daar staat de LEAD onderaan en
   heeft de band geen negatieve marge, dus valt er niets te compenseren. Deze
   regel moet ná de regel hierboven staan — allebei even specifiek (#id), dus
   de volgorde in het bestand beslist. */
@media (max-width: 384px), (max-height: 720px) {
  #wanneer { padding-top: var(--section-padding); }
}
.sectie--licht { background: var(--light-bg); color: var(--light-text); }
.sectie--licht h2, .sectie--licht h3 { color: var(--light-text); }
.sectie--licht .sect-nr, .sectie--licht .week-label,
.sectie--licht .week-langs, .sectie--licht .week-noot { color: var(--light-muted); }
.sectie--licht .week-langs strong { color: var(--light-text); }
.sectie--licht .plaats-item p, .sectie--licht .plaats-beelden figcaption { color: var(--light-muted); }
.sectie-kop { max-inline-size: 42ch; }
.sectie-kop h2 { font-size: var(--step-3); }
.sectie-intro { margin-top: var(--space-3); color: var(--text-muted); max-inline-size: 62ch; }
.sectie--licht .sectie-intro { color: var(--light-muted); }

/* ── Weekstrook ─────────────────────────────────────────────────────
   De niet-overdraagbare module: zeven gevulde dagen, want hij is elke dag
   bereikbaar. Bewust GEEN raster met lege vakken meer — een leeg vak leest
   als "dan kan hij niet", ook zonder bijschrift, en de sectie ging daardoor
   over wat een ander niet doet in plaats van over wat hij wel doet. Wanneer
   hij langskomt staat er nu in woorden onder, positief geformuleerd.
   Eén rij i.p.v. een matrix maakt hem bovendien robuust op telefoon: geen
   rijlabels die tussen de dagkoppen en hun cellen vallen. */
.week { margin-top: var(--space-6); }
.week-label {
  font-family: var(--font-heading); font-weight: 600; font-size: var(--step--1);
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-muted);
  margin-bottom: var(--space-3);
}
.week-raster {
  display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px;
}
.week-dag {
  aspect-ratio: 1 / 0.9;
  display: flex; align-items: center; justify-content: center;
  background: var(--primary); color: #FFFFFF;
  font-family: var(--font-heading); font-weight: 700; font-size: var(--step-0);
  letter-spacing: 0.02em;
}
.week-langs {
  margin-top: var(--space-5); font-size: var(--step-1); color: var(--text);
  max-inline-size: 46ch;
}
.week-langs strong {
  font-family: var(--font-heading); font-style: italic; font-weight: 700;
  letter-spacing: -0.01em;
}
.week-noot { margin-top: var(--space-3); color: var(--text-muted); max-inline-size: 60ch; }

@media (max-width: 640px) {
  .week-dag { aspect-ratio: 1 / 1; font-size: var(--step--1); }
}
/* Op desktop liep de strook over de volle 1160px: zeven identieke vakken van
   162x146 die onderling nergens in verschillen, dus een groot accentvlak waar
   niets aan af te lezen valt. De informatie zit in de zin eronder, niet in de
   vakken. Strook dus terug naar leesmaat, zodat hij als weekaanduiding leest
   en niet als wand. */
@media (min-width: 861px) {
  .week-raster { max-width: 620px; }
}

/* ── 02 Storingen (licht register) ──────────────────────────────────
   De drie close-ups zijn geen sfeerbeeld: het zijn de onderdelen die Fred
   zelf uitgebouwd en gefotografeerd heeft. Ze staan op ware grootte naast
   elkaar, ongecropt, want het bewijs is de informatie. */
.oorzaak-rij {
  margin-top: var(--space-6);
  display: grid; gap: var(--space-5);
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
.oorzaak figure { display: grid; gap: var(--space-3); }
.oorzaak img {
  width: 100%; height: auto; display: block;
  /* De close-ups hebben lichte tegelvloeren; op het lichte register lopen ze
     zonder duidelijke rand over in de sectie-achtergrond. */
  border: 1px solid var(--border);
  background: var(--surface);
}
.oorzaak figcaption { font-size: var(--step--1); color: var(--text-muted); }
.oorzaak figcaption strong {
  display: block; color: var(--text);
  font-family: var(--font-heading); font-weight: 700; font-size: var(--step-0);
  margin-bottom: 0.15rem;
}

/* Storingslijst: naam links, uitleg rechts. Geen haarlijn per regel (dat maakt
   er een tabel van); scheiden gebeurt met witruimte en registerverschil. */
.storingen { margin-top: var(--space-7); display: grid; gap: var(--space-5); }
.storing {
  display: grid; gap: var(--space-2) var(--space-6);
  grid-template-columns: minmax(0, 20rem) minmax(0, 1fr);
  align-items: baseline;
}
.storing dt {
  font-family: var(--font-heading); font-weight: 700; font-size: var(--step-2);
  letter-spacing: -0.02em; color: var(--text);
}
.storing dd { margin: 0; color: var(--text-muted); max-inline-size: 58ch; }

@media (max-width: 780px) {
  /* Eén kolom, verticaal. Hier stond een horizontale swipe-strook om de pagina
     kort te houden, maar die gebaarrichting is op een telefoon onzichtbaar: de
     scrollbar is verborgen en het enige signaal is een derde kaartje dat half
     meekijkt. Wie dat niet oppikt, ziet één van de drie bewijsfoto's en denkt
     dat dat alles is. Verticaal scrollen is de enige beweging die elke bezoeker
     al doet, ongeacht leeftijd of handigheid met een telefoon.
     Bijkomend weggenomen risico: `overflow-x: auto` zet `overflow-y` stil óók
     op `auto`, waardoor zo'n strook een veeg omhóóg kan opvangen en de pagina
     lijkt vast te zitten.
     De foto's blijven op volle breedte en ongecropt — het zijn bewijsbeelden,
     en op een klein formaat is kalk op een klep niet meer te zien. */
  .oorzaak-rij {
    grid-template-columns: 1fr;
    gap: var(--space-6);
  }
  .storing { grid-template-columns: 1fr; gap: var(--space-2); }
  .storing dt { font-size: var(--step-1); }
}

/* ── 03 Leidingband — de enige full-bleed van de pagina ─────────────
   Grid-breuk: dit beeld staat buiten de container, van rand tot rand. */
.beeldband { position: relative; isolation: isolate; }
.beeldband picture { display: block; width: 100%; }
.beeldband img {
  width: 100%; height: clamp(280px, 58vh, 620px); object-fit: cover; display: block;
}
.beeldband figcaption {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: var(--space-6) 1.25rem var(--space-5);
  /* De scrim moet dekken waar de TEKST staat, niet alleen de onderrand. De tekst
     loopt van ~12% tot ~80% van de bandhoogte; een gradient die op 55% al halveert
     laat de bovenste regel over de lichtste delen van de foto lopen (gemeten
     2,05:1 op telefoon). Vandaar vol tot 80% en pas daarboven uitfaden. */
  background: linear-gradient(to top,
    rgb(5 25 45 / 0.86) 0%,
    rgb(5 25 45 / 0.76) 70%,
    rgb(5 25 45 / 0.32) 90%,
    transparent 100%);
  color: var(--text);
}
.beeldband figcaption span {
  display: block;
  /* Op de doorlopende linkerlijn van de container, niet gecentreerd: dit is het
     enige tekstblok dat buiten een .container staat en week daardoor af. */
  margin-inline-start: max(0px, calc((100% - var(--max-width)) / 2));
  margin-inline-end: auto;
  font-size: var(--step-1); max-inline-size: 46ch;
}

/* ── 04 Wat ik plaats ───────────────────────────────────────────────
   Asymmetrisch 5fr/7fr; het rechtse staande beeld steekt onder de sectienaad
   door in het lichte register eronder. Aan weerszijden blijft een ander vlak
   zichtbaar, dus het is een echte naadbreuk en geen band tussen twee gelijke
   kleuren. */
.plaats { position: relative; z-index: 1; padding-bottom: 0; }
.plaats-grid {
  margin-top: var(--space-6);
  display: grid; gap: var(--space-6);
  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  align-items: end;
}
.plaats-lijst { display: grid; gap: var(--space-5); align-content: start; }
.plaats-item h3 { font-size: var(--step-2); }
.plaats-item p { margin-top: var(--space-2); color: var(--text-muted); max-inline-size: 40ch; }
.plaats-beelden { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); align-items: end; }
.plaats-beelden figure { display: grid; gap: var(--space-3); }
.plaats-beelden picture { display: block; width: 100%; }
.plaats-beelden img { width: 100%; height: auto; display: block; }
.plaats-beelden figcaption { font-size: var(--step--1); color: var(--text-muted); }
/* De doorsnijder: dit beeld zakt in de sectie eronder. */
.plaats-beelden .doorsnijder {
  margin-bottom: calc(-1 * var(--section-padding) - 3.5rem);
  display: flex; flex-direction: column-reverse; gap: var(--space-3);
}

@media (max-width: 900px) {
  .plaats-grid { grid-template-columns: 1fr; gap: var(--space-6); }
  .plaats-beelden .doorsnijder { margin-bottom: calc(-1 * var(--section-padding) - 1.5rem); }
}
@media (max-width: 520px) {
  .plaats-beelden { grid-template-columns: 1fr; }
  .plaats-beelden .doorsnijder { margin-bottom: calc(-1 * var(--section-padding) - 1rem); }
  /* Gestapeld staan de twee bijschriften onvermijdelijk naast elkaar: de omkering
     op .doorsnijder moet blijven, want zonder haar kruist het BIJSCHRIFT de
     sectienaad in plaats van het beeld, en dan valt Amplitude 1 onder doel.
     De koppeling los je hier dus op met nabijheid, niet met volgorde: de afstand
     binnen een figuur (beeld↔eigen bijschrift) moet duidelijk kleiner zijn dan
     die tussen de twee figuren. Stond op 12px binnen tegen 16px tussen — vrijwel
     gelijk, en daarom hoorde geen bijschrift zichtbaar bij één beeld. */
  .plaats-beelden { gap: var(--space-6); }
  .plaats-beelden figure,
  .plaats-beelden .doorsnijder { gap: var(--space-2); }
}

/* ── 05 Werkgebied (licht, narrow) ─────────────────────────────────
   Ademt na de dichte secties ervoor: witruimte-release. */
.gebied { padding-top: calc(var(--section-padding) + 4.5rem); }
/* Vanaf 901px hangt het overstekende beeld in de rechterkolom, naast de kop:
   de extra bovenruimte is dan alleen een lege band links. */
@media (min-width: 901px) { .gebied { padding-top: var(--section-padding); } }
.gebied .container--narrow { width: min(var(--max-width), 100% - 2.5rem); }
.gebied h2 { font-size: var(--step-3); max-inline-size: 22ch; }
.gebied p { margin-top: var(--space-4); color: var(--text-muted); max-inline-size: 58ch; }
.gebied .gebied-plaats {
  margin-top: var(--space-5);
  font-family: var(--font-heading); font-style: italic; font-weight: 700;
  font-size: var(--step-2); color: var(--text); letter-spacing: -0.01em;
}

/* ── 06 Contactband (merkblauw) ────────────────────────────────────── */
.contactband { background: var(--primary); color: #fff; padding-block: var(--section-padding); }
.contactband h2 { font-size: var(--step-3); max-inline-size: 30ch; }
.contactband-rij {
  margin-top: var(--space-5);
  display: grid; gap: var(--space-5) var(--space-7);
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  align-items: start;
}
.contactband-rechts { display: grid; gap: var(--space-4); justify-items: start; }
.contactband-tel { text-decoration: none; color: #fff; display: block; }
.contactband-tel .label {
  display: block; font-family: var(--font-heading); font-weight: 600; font-size: var(--step--1);
  letter-spacing: 0.12em; text-transform: uppercase; color: rgb(255 255 255 / 0.78); margin-bottom: 0.35rem;
}
.contactband-tel .nr { display: block; font-size: clamp(2rem, 1.3rem + 3.2vw, 3.4rem); line-height: 1; white-space: nowrap; }
.contactband-acties { display: flex; gap: var(--space-3); flex-wrap: wrap; }
.contactband-noot { margin: 0; color: rgb(255 255 255 / 0.82); max-inline-size: 46ch; }
@media (hover: hover) { .contactband-tel:hover .nr { text-decoration: underline; text-underline-offset: 5px; } }
@media (max-width: 860px) { .contactband-rij { grid-template-columns: 1fr; gap: var(--space-5); } }
@media (max-width: 560px) {
  .contactband-acties { display: grid; grid-template-columns: 1fr; width: 100%; }
  .contactband-rechts { justify-items: stretch; }
}

/* De clip-wipe heeft een clippende wrapper nodig, anders loopt de counter-zoom
   buiten het kader. */
.wipe { overflow: hidden; }
/* Een <picture> is inline: als layout-wrapper heeft hij display:block EN
   width:100% nodig, anders krimpt hij naar de intrinsieke beeldbreedte. */
.wipe > picture, .werkrij picture, .oorzaak picture { display: block; width: 100%; }

/* ═══ SUB-PAGINA'S ═══════════════════════════════════════════════════
   Vier verschillende openers over de site, en maximaal één .page-banner.
   Zonder die variatie opent elke sub-pagina hetzelfde en voelt de site
   achter de homepage als een sjabloon. */

/* ── Opener: index-lijst (diensten) ────────────────────────────────── */
.opener-index { padding-block: clamp(2.5rem, 5vw, 4rem); }
.opener-index h1 { font-size: var(--step-4); max-inline-size: 18ch; }
.opener-index-lead { margin-top: var(--space-4); color: var(--text-muted); max-inline-size: 56ch; font-size: var(--step-1); }
.opener-index-list { margin-top: var(--space-6); display: grid; counter-reset: none; }
.opener-index-list li { border-top: 1px solid var(--border); }
.sectie--licht .opener-index-list li { border-color: var(--light-border); }
.sectie--licht .opener-index-list a { color: var(--light-text); }
.sectie--licht .opener-index-num, .sectie--licht .opener-index-note { color: var(--light-muted); }
.sectie--licht .opener-index-lead { color: var(--light-muted); }
@media (hover: hover) {
  .sectie--licht .opener-index-list a:hover { background: color-mix(in srgb, var(--light-text) 6%, transparent); }
  .sectie--licht .opener-index-list a:hover .opener-index-num { color: var(--light-text); }
}
.opener-index-list a {
  display: grid; grid-template-columns: 3.5rem minmax(0, 1fr) minmax(0, 1fr);
  gap: var(--space-4); align-items: baseline;
  padding-block: var(--space-4); text-decoration: none; color: var(--text);
  min-height: 44px;
  transition: background-color var(--transition), padding-left var(--transition);
}
.opener-index-num {
  font-family: var(--font-heading); font-style: italic; font-weight: 700;
  font-size: var(--step--1); color: var(--text-muted); letter-spacing: 0.06em;
}
.opener-index-name { font-family: var(--font-heading); font-weight: 700; font-size: var(--step-2); letter-spacing: -0.02em; }
.opener-index-note { color: var(--text-muted); font-size: var(--step-0); }
@media (hover: hover) {
  .opener-index-list a:hover { background: var(--surface); padding-left: var(--space-3); }
  .opener-index-list a:hover .opener-index-num { color: var(--text); }
}
@media (max-width: 700px) {
  .opener-index-list a { grid-template-columns: 2.5rem minmax(0, 1fr); gap: var(--space-2) var(--space-3); }
  .opener-index-note { grid-column: 2; }
}

/* ── Opener: photo-lead (werk) ─────────────────────────────────────── */
.opener-photo-media { margin: 0; }
.opener-photo-media img { width: 100%; height: clamp(200px, 34vh, 400px); object-fit: cover; display: block; }
.opener-photo-head { padding-top: clamp(2rem, 4vw, 3rem); }
.opener-photo-head h1 { font-size: var(--step-4); max-inline-size: 18ch; }
.opener-photo-lead { margin-top: var(--space-4); color: var(--text-muted); max-inline-size: 60ch; font-size: var(--step-1); }

/* ── Opener: direct-content (contact + legal) ──────────────────────── */
.opener-direct { padding-block: clamp(2.5rem, 5vw, 4.5rem) 0; }
.opener-direct h1 { font-size: var(--step-4); max-inline-size: 20ch; }
.opener-direct-lead { margin-top: var(--space-4); color: var(--text-muted); max-inline-size: 58ch; font-size: var(--step-1); }

/* ── Page-banner — MAXIMAAL ÉÉN PER SITE (werkwijze) ───────────────── */
.page-banner {
  background: var(--primary); color: #fff;
  padding-block: clamp(3rem, 7vw, 5.5rem);
}
.page-banner h1 { font-size: var(--step-4); max-inline-size: 24ch; }
.page-banner p { margin-top: var(--space-4); color: rgb(255 255 255 / 0.85); max-inline-size: 54ch; font-size: var(--step-1); }

/* ── Prose (legal) ─────────────────────────────────────────────────── */
.prose { max-inline-size: 70ch; }
.prose h2 { font-size: var(--step-2); margin-top: var(--space-6); }
.prose h2:first-child { margin-top: 0; }
.prose p, .prose li { color: var(--text-muted); margin-top: var(--space-3); }
.prose ul { list-style: disc; padding-inline-start: 1.25rem; margin-top: var(--space-3); }
.prose ul li { padding-inline-start: 0.25rem; }
/* Links in lopende tekst: een tweede kenmerk naast kleur (WCAG 1.4.1). */
.prose a {
  color: var(--text); text-decoration: underline; text-decoration-thickness: 1px;
  text-underline-offset: 0.2em; text-decoration-color: color-mix(in srgb, currentColor 45%, transparent);
}
@media (hover: hover) { .prose a:hover { text-decoration-color: currentColor; } }
.prose a[href^="tel:"], .nowrap { white-space: nowrap; }

/* ── Werk: beeldrijen ──────────────────────────────────────────────── */
.werkrij {
  display: grid; gap: var(--space-5) var(--space-6);
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  align-items: center;
  padding-block: var(--space-6);
  border-top: 1px solid var(--border);
}
.werkrij:first-of-type { border-top: 0; }
.werkrij img { width: 100%; height: auto; display: block; }
.werkrij h2 { font-size: var(--step-2); }
.werkrij p { margin-top: var(--space-3); color: var(--text-muted); max-inline-size: 50ch; }
.werkrij-meta {
  margin-top: var(--space-4); font-family: var(--font-heading); font-style: italic;
  font-weight: 700; font-size: var(--step--1); letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--text-muted);
}
.werkrij:nth-child(even) .werkrij-tekst { order: -1; }
@media (max-width: 780px) {
  .werkrij { grid-template-columns: 1fr; }
  .werkrij:nth-child(even) .werkrij-tekst { order: 0; }
}

/* ── Werkwijze: stappen ────────────────────────────────────────────── */
.stappen { display: grid; gap: 0; margin-top: var(--space-6); }
.stap {
  display: grid; grid-template-columns: 4.5rem minmax(0, 1fr);
  gap: var(--space-5); padding-block: var(--space-5);
}
.stap-nr {
  font-family: var(--font-heading); font-style: italic; font-weight: 700;
  font-size: var(--step-3); line-height: 1;
  /* Op de navy grond haalt merkblauw 1,76:1 en is het dus onleesbaar; dat is
     dezelfde constraint als voor lopende tekst. Merkblauw blijft het accent op
     het lichte register, waar het 10:1 haalt. */
  color: var(--text);
}
.sectie--licht .stap-nr { color: var(--primary); }
.stap :is(h2, h3) { font-size: var(--step-2); }
.stap p { margin-top: var(--space-2); color: var(--text-muted); max-inline-size: 58ch; }
.sectie--licht .stap p { color: var(--light-muted); }
@media (max-width: 620px) { .stap { grid-template-columns: 2.75rem minmax(0, 1fr); gap: var(--space-4); } }

/* ── Contact ───────────────────────────────────────────────────────── */
.contact-grid {
  margin-top: var(--space-6);
  display: grid; gap: var(--space-7);
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  align-items: start;
}
.contact-blok + .contact-blok { margin-top: var(--space-6); }
.contact-blok h2 { font-size: var(--step-2); }
.contact-blok p { margin-top: var(--space-3); color: var(--text-muted); }
.contact-blok a { color: var(--text); }
.contact-groot {
  display: block; margin-top: var(--space-3); text-decoration: none;
  font-size: var(--step-3); color: var(--text);
}
.kaart { margin-top: var(--space-6); border: 1px solid var(--border); }
.kaart iframe { display: block; width: 100%; height: clamp(260px, 40vh, 380px); border: 0; }
@media (max-width: 860px) { .contact-grid { grid-template-columns: 1fr; gap: var(--space-6); } }

/* ── Contactformulier ──────────────────────────────────────────────── */
.form-group { margin-bottom: var(--space-5); }
.form-group label {
  display: block; font-family: var(--font-heading); font-weight: 600;
  font-size: var(--step--1); letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--text-muted); margin-bottom: var(--space-2);
}
.form-optioneel { text-transform: none; letter-spacing: 0; font-weight: 400; }
.form-group input, .form-group textarea {
  width: 100%; padding: 0.85rem 1rem; min-height: 48px;
  /* Nooit laten erven van open-props normalize: die flipt met OS-donker. */
  background: var(--surface); color: var(--text);
  border: 1px solid var(--field-border); border-radius: var(--radius);
  font-family: var(--font); font-size: var(--step-0);
  transition: border-color var(--transition), box-shadow var(--transition);
}
.form-group textarea { min-height: 150px; resize: vertical; field-sizing: content; max-height: 340px; }
.form-group input:focus, .form-group textarea:focus {
  outline: none; border-color: var(--field-focus);
  box-shadow: 0 0 0 3px oklch(from var(--field-focus) l c h / 0.45);
}
.form-group input::placeholder, .form-group textarea::placeholder { color: var(--text-muted); opacity: 0.7; }
.form-status { margin-top: var(--space-4); padding: 0.85rem 1rem; border-radius: var(--radius); font-size: var(--step-0); }
/* Geen hidden-attribuut op dit element: main.js vult alleen innerHTML en haalt
   hidden nooit weg, dus [hidden]{display:none!important} maakte elke melding
   onzichtbaar. Leeg = geen ruimte, via :empty. */
.form-status:empty { display: none; padding: 0; margin: 0; }
/* De preview-melding is het enige wat een bezoeker terugkrijgt als hij het
   formulier test, dus ze krijgt dezelfde behandeling als de succes- en
   foutmelding: een gevuld vlak, geen losse regel tekst. Merkblauw als VLAK,
   nooit als lijn — daarom een tint met rand en geen accentbalk. */
.form-status .form-notice {
  background: color-mix(in srgb, var(--primary) 24%, transparent);
  border: 1px solid color-mix(in srgb, var(--primary) 55%, transparent);
  border-radius: var(--radius);
  padding: 0.85rem 1rem;
  color: var(--text);
  max-inline-size: 60ch;
}
.form-status p, .form-status div { margin: 0; }
.form-status.success { background: color-mix(in srgb, var(--color-success) 22%, transparent); color: #C9F0D5; border: 1px solid color-mix(in srgb, var(--color-success) 45%, transparent); }
.form-status.error { background: color-mix(in srgb, var(--color-danger) 22%, transparent); color: #FBD5D1; border: 1px solid color-mix(in srgb, var(--color-danger) 45%, transparent); }
.recaptcha-disclaimer { margin-top: var(--space-4); font-size: var(--step--1); color: var(--text-muted); }
.recaptcha-disclaimer a { color: var(--text); text-decoration: underline; text-underline-offset: 0.2em; }
/* Verbergen mag alleen met de vermelding van Google onder het formulier erbij. */
.grecaptcha-badge { visibility: hidden !important; }

/* ── Tikdoelen ──────────────────────────────────────────────────────
   Een <a> die in zijn eentje een <p> of <li> vult, is geen link in lopende
   tekst en valt dus niet onder de inZin-uitzondering op de 44px-eis. */
.footer-links a, .footer-adres a, .contact-blok > p > a, .nav-link {
  display: inline-flex; align-items: center; min-height: 44px;
}
.footer-adres p { margin-bottom: 0; }
.footer-adres p:not(:has(> a)) { margin-bottom: var(--space-3); }
.contact-blok .contact-groot { min-height: 44px; }
.footer-bottom-inner a { display: inline-flex; align-items: center; min-height: 44px; }

/* ── Terug naar boven ───────────────────────────────────────────────
   Bestaat pas vanaf 1288px: container 1160 + knop 48 + 2x16 marge. Daaronder
   zou hij over de inhoud liggen, en dat is precies de val waar een vaste
   overlay tekst bedekt zonder dat een gate het ziet. */
.back-to-top { display: none; }
@media (min-width: 1288px) {
  .back-to-top {
    display: grid; place-items: center;
    position: fixed; right: 1rem; bottom: 1rem; z-index: var(--z-progress);
    width: 48px; height: 48px; padding: 0;
    background: var(--primary); color: #fff;
    border: 1px solid color-mix(in srgb, #fff 25%, transparent);
    border-radius: var(--radius); cursor: pointer;
    opacity: 0; visibility: hidden; transform: translateY(8px);
    transition: opacity var(--transition), transform var(--transition), visibility 0s linear 0.28s;
  }
  .back-to-top.show {
    opacity: 1; visibility: visible; transform: translateY(0);
    transition: opacity var(--transition), transform var(--transition), visibility 0s linear 0s;
  }
  @media (hover: hover) { .back-to-top:hover { background: color-mix(in oklch, var(--primary), black 14%); } }
}

/* Op 320px knijpt de nummerkolom de tekst tot 25 tekens per regel; de
   ondergrens is ~26. Daar zet het nummer zich boven de tekst. */
@media (max-width: 340px) {
  .stap { grid-template-columns: 1fr; gap: var(--space-2); }
  .stap-nr { font-size: var(--step-2); }
}

/* ── Kort aanbod op de homepage ─────────────────────────────────────
   De uitgewerkte storingslijst staat op de dienstenpagina; hier alleen de
   namen. Zonder die inkorting herhaalde de homepage die pagina bijna
   volledig en werd ze 8200px hoog op een telefoon. */
.kort-aanbod { margin-top: var(--space-7); }
.kort-aanbod h3 { font-size: var(--step-2); }
/* Stond hier als lijst van acht items: exact dezelfde acht, in dezelfde
   volgorde, als de index op /diensten. Twee keer dezelfde opsomming binnen
   één klik van elkaar leest als vulling en kostte 410px op telefoon. Nu een
   brugzin die naar de uitgewerkte pagina wijst. */
.kort-brug { margin-top: var(--space-4); color: var(--text-muted); max-inline-size: 58ch; }
.kort-aanbod .btn { margin-top: var(--space-5); }

/* Belactie in de sub-pagina-openers: op mobiel toont de navbalk alleen logo en
   MENU, dus zonder deze knoppen ziet iemand die op een sub-pagina binnenkomt
   pas onderaan een telefoonnummer. */
.opener-actie { margin-top: var(--space-5); display: flex; gap: var(--space-3); flex-wrap: wrap; }
@media (max-width: 460px) { .opener-actie { display: grid; grid-template-columns: 1fr; } }

/* Op korte schermen duwt het opener-beeld de belactie onder de vouw. */
@media (max-height: 620px) {
  .opener-photo-media img { height: clamp(150px, 30vh, 220px); }
  .opener-photo-head { padding-top: var(--space-5); }
  .opener-photo-head h1 { font-size: var(--step-3); }
  .opener-photo-lead { font-size: var(--step-0); }
}

/* Telefoon in landschap (~360px hoog): openers moeten zo compact dat de
   belactie nog in beeld staat. */
@media (max-height: 460px) {
  .opener-index, .opener-direct { padding-block: 1rem 0; }
  .opener-index h1, .opener-direct h1, .opener-photo-head h1 { font-size: var(--step-2); }
  .opener-index-lead, .opener-direct-lead, .opener-photo-lead { margin-top: var(--space-3); font-size: var(--step-0); max-inline-size: 62ch; }
  .opener-actie { margin-top: var(--space-4); }
  .page-banner { padding-block: 1.25rem; }
  .page-banner h1 { font-size: var(--step-2); }
  .page-banner p { margin-top: var(--space-3); font-size: var(--step-0); }
  .opener-photo-media img { height: 130px; }
  .contact-blok h2 { font-size: var(--step-1); }
}

/* Telefoon in landschap: de navbalk van 84px is daar 24% van het scherm.
   Het logo wordt kleiner dan de leesbaarheidsgrens, maar in landschap telt de
   inhoud: de bezoeker draait terug naar portret om het merk te lezen. */
@media (max-height: 460px) {
  :root { --nav-height: 62px; }
  /* Actie vóór de uitleg, zoals in de hero: anders valt hij net buiten beeld. */
  .opener-photo-head, .opener-index .container, .opener-direct .container, .page-banner .container { display: flex; flex-direction: column; }
  .opener-photo-head h1, .opener-index h1, .opener-direct h1, .page-banner h1 { order: 1; }
  .opener-actie { order: 2; margin-top: var(--space-3); }
  .opener-photo-lead, .opener-index-lead, .opener-direct-lead, .page-banner p { order: 3; margin-top: var(--space-3); }
  .opener-index-list { order: 4; }
  .nav-logo img { height: 46px; }
  .opener-photo-media img { height: 104px; }
  .opener-photo-head { padding-top: var(--space-4); }
}

/* .btn-line is wit-op-donker; op het lichte register moet hij meekleuren,
   anders staat wit type op #E8EDF2 (1,08:1). */
.sectie--licht .btn-line, .opener-index.sectie--licht .btn-line {
  color: var(--light-text);
  border-color: color-mix(in srgb, var(--light-text) 35%, transparent);
}
@media (hover: hover) {
  .sectie--licht .btn-line:hover {
    border-color: var(--light-text);
    background: color-mix(in srgb, var(--light-text) 7%, transparent);
  }
}

/* Menu in landschap: gestapeld is de inhoud 482px op een venster van 360px.
   Twee kolommen links en de acties naast elkaar brengen dat terug tot binnen
   het scherm, zonder de tikdoelen te verkleinen. */
@media (max-height: 500px) {
  .mobile-menu { padding: var(--space-3) 1.5rem calc(var(--space-4) + env(safe-area-inset-bottom)); gap: var(--space-3); }
  .mobile-nav-links { grid-template-columns: 1fr 1fr; column-gap: var(--space-6); }
  .mobile-nav-link { font-size: var(--step-1); padding-block: 0.35rem; }
  .mobile-menu-foot { padding-top: var(--space-3); gap: var(--space-3); }
  .mobile-menu-acties { grid-template-columns: 1fr 1fr; }
  .mobile-menu-line { display: none; }
}
/* Op 320x568 bleef er 3px scroll over: inhoud 571 op een venster van 568. */
@media (max-width: 340px) and (max-height: 600px) {
  .mobile-nav-link { padding-block: 0.25rem; font-size: var(--step-1); }
  .mobile-menu { gap: var(--space-3); padding-block: var(--space-3) var(--space-4); }
  .mobile-menu-foot { padding-top: var(--space-3); }
}
