/* =========================================================================
   BADMINTON LIMBURG — DESIGN SYSTEM
   =========================================================================
   Dit bestand is het stijl-fundament van de site. Kleuren, typografie,
   spacing, radius en schaduwen zijn vastgelegd als CSS-variabelen in :root
   (zie hieronder). Alle secties zijn duidelijk gemarkeerd zodat andere
   agents/ontwikkelaars snel de juiste component vinden.

   Herkomst huisstijl (afgeleid uit assets/images/logo.jpg):
   - Primair: verdiept cyaan/turquoise (cirkel/cork van het logo)
   - Secundair: diep marineblauw/indigo (blauwe veer van de shuttle)
   - Accent: warme koraal/oranje (oranje/rode veer) — uitsluitend voor CTA's
     en kleine highlights, spaarzaam gebruiken.
   Gecontroleerde WCAG-contrastratio's (relatieve luminantie-formule):
   - Primair (#0e7c86) op wit:            4.94:1  (AA, normale tekst)
   - Wit op primair (#0e7c86):             4.94:1  (AA, normale tekst)
   - Wit op secundair (#1b2a63):          13.48:1  (AAA)
   - Accent (#c9440c) op wit / wit op accent: 4.87:1 (AA, normale tekst)
   - Accent (#c9440c) op secundair (#1b2a63): 2.77:1 (FAALT AA — daarom NOOIT
     de pure --color-accent gebruiken als tekstkleur op --color-secondary;
     gebruik --color-accent-tint hieronder in plaats daarvan)
   - Accent-tint (#dc8561) op secundair (#1b2a63): 5.02:1 (AA, normale tekst)

   === V3-RESTYLING (fundament, augustus 2026) =============================
   Twee met naam genoemde klachten van de opdrachtgever zijn hier opgelost:
   1. Het logo werd in een harde cirkel geknipt (border-radius:50% +
      object-fit:cover), waardoor de boogtekst "BADMINTON LIMBURG" rond het
      shuttle-embleem afgesneden werd. FIX: .brand-logo toont nu het volledige
      logo onvervormd (object-fit:contain) op een subtiele afgeronde
      vierkante witte "chip" (.brand-logo-chip, radius 12px, GEEN cirkel).
   2. De pluimkleuren (blauw/paars/rood/oranje/geel + cyaan cork) stonden
      enkel als dun streepje (--gradient-shuttle). FIX: hieronder staan ze
      ook als volwaardige, op zichzelf staande tokens (--feather-*) voor
      gebruik als SOLID achtergrondkleur (zie component .tile, sectie 8c),
      plus twee lichte tint-tokens (--section-tint-*) om witte secties mee
      af te wisselen (zie sectie 8c onderaan).
   === V3.2-CORRECTIE (kleuren correct gedecodeerd, augustus 2026) =========
   BELANGRIJK: de v3.1-meting hierboven bleek ONJUIST. Het brondocument
   (assets/images/logo.jpg, oorspronkelijk gedownload van
   badmintonlimburg.be/wp-content/uploads/2024/11/logo-badminton-limburg-
   Wh-Bg-640x640.jpg) is een CMYK-JPEG met een ingebed ICC-kleurprofiel.
   PHP GD (gebruikt voor de v3.1-meting) kan CMYK-JPEG's met kleurprofiel
   NIET correct naar RGB omzetten — het las de rauwe CMYK-samples alsof het
   RGB was, wat een veel te fel/verzadigd resultaat gaf (bv. blauw leek
   #3334ff, een soort neonblauw dat NERGENS in het echte logo voorkomt).
   Hermeten met sharp/libvips (dat CMYK+ICC-profielen wél correct naar sRGB
   omzet) en geverifieerd door het origineel gewoon in een browser
   (Chromium) te laten renderen — de daadwerkelijke, gedempte kleuren:
   - --feather-blue   #5f48ae  (gemeten, exact) → wit erop: 6.94:1 (AA) —
     enige kleur die geen verdieping nodig heeft.
   - --feather-purple #a35e8e  → wit erop: 4.62:1 (AA) — verdiept vanaf het
     gemeten, echte paars #bd6da4 (dat haalt zelf maar 3.57:1).
   - --feather-red    #cb4a2e  → wit erop: 4.61:1 (AA) — verdiept vanaf het
     gemeten #f15837 (dat haalt maar 3.39:1). Eigen token, los van
     --color-accent (dat blijft de bestaande koraal/oranje CTA-kleur).
   - --feather-orange #a4672c  → wit erop: 4.61:1 (AA) — verdiept vanaf het
     gemeten #fc9e44 (dat haalt maar 2.08:1).
   - --feather-yellow #81762c  → wit erop: 4.60:1 (AA) — verdiept vanaf het
     gemeten #fde656 (dat haalt maar 1.26:1) — wordt hierdoor een diep
     mosterdgeel i.p.v. het zachte pastelgeel van het origineel; dat is de
     prijs van AA-contrast met witte tekst. Gebruik het gemeten, zachtere
     #fde656 wel gerust nog PUUR DECORATIEF (svg-illustraties, dunne
     balkjes, orbit-bolletje) waar geen tekst overheen staat.
   - --feather-cyan   #007ea5  → wit erop: 4.64:1 (AA) — verdiept vanaf het
     gemeten #00a3d4 (dat haalt maar 2.92:1). Eigen token, los van
     --color-primary (#0e7c86, de bestaande UI-kleur voor links/knoppen).
   Alle verdiepte tinten zijn met een binary-search-script exact op ~4.60-
   4.65:1 gezet, met behoud van dezelfde HSV-tint/verzadiging als de
   gemeten bronkleur. assets/images/logo.jpg en logo-transparent.png zijn
   om dezelfde reden opnieuw gegenereerd (met sharp i.p.v. GD) zodat ook de
   afbeeldingen zelf de correcte, gedempte kleuren tonen i.p.v. de te felle
   GD-misinterpretatie.

   === V4-RESTYLING: "PREMIUM DARK-TECH" (fundament, augustus 2026) ========
   Opdracht van de klant: eigentijds, professioneel, met een futuristisch
   tintje — ingetogen/chic zoals moderne dark-mode SaaS-producten, GEEN
   neon-cyberpunk. Kleurenbasis = uitsluitend de pluimkleuren + cyaan cork
   van het logo (alles behalve wit), nu gebruikt op een diepe donkere
   canvas i.p.v. de vorige lichte/witte achtergrond.

   GEVERIFIEERDE BRONKLEUREN (aangeleverd, NIET zelf opnieuw uit de
   afbeelding gemeten — zie CMYK/ICC-valkuil hierboven):
     echt blauw   #5f48ae   echt paars  #bd6da4   echt rood  #f15837
     echt oranje  #fc9e44   echt geel   #fde656   echt cyaan #00a3d4

   Alle onderstaande contrastcijfers zijn NAGEREKEND met de officiële
   WCAG relatieve-luminantieformule via het script
   scripts/contrast-check-v4.mjs (node scripts/contrast-check-v4.mjs) —
   GEEN inschatting met het oog. Kernresultaten:

   1) DONKERE CANVAS (i.p.v. wit/lichtgrijs):
      --color-canvas #0d1128, --color-canvas-elevated #141a3d,
      --color-canvas-elevated-2 #1c2450 (elk net iets lichter, voor
      gelaagdheid — panelen "zweven" boven de canvas).

   2) BASISTEKST op de donkere canvas (normale tekst, min. 4.5:1):
      - wit 92% (--color-text)  op canvas: 15.78:1  OK
      - wit 68% (--color-muted) op canvas:  8.91:1  OK
      - wit 100% op glaskaart (6% wit over canvas): 16.19:1  OK

   3) ECHTE pluimkleuren als TEKST/ICOON-kleur op de donkere canvas
      (dit is precies waar de opdracht op wees: "op een donkere
      achtergrond werken de ECHTE pluimkleuren vaak al goed als
      tekstkleur" — nagerekend, klopt voor 5 van de 6):
      - --feather-purple #bd6da4 op canvas: 5.22:1  OK (normale tekst)
      - --feather-red    #f15837 op canvas: 5.49:1  OK (normale tekst)
      - --feather-orange #fc9e44 op canvas: 8.97:1  OK (normale tekst)
      - --feather-yellow #fde656 op canvas: 14.74:1 OK (normale tekst)
      - --feather-cyan   #00a3d4 op canvas: 6.37:1  OK (normale tekst)
      - --feather-blue   #5f48ae op canvas: 2.68:1  FAALT (te donker op een
        donkere achtergrond — blauw is de enige kleur die als TEKST een
        lichtere variant nodig heeft). Nieuw token --feather-blue-text
        #8876c6 (dezelfde tint/verzadiging, lichtheid opgevoerd via
        HSL-binary-search) haalt 4.84:1 op canvas — gebruik deze i.p.v.
        de pure --feather-blue overal waar blauw als TEKST/ICOON/gradient-
        stop dient (--feather-blue zelf blijft prima voor achtergronden/
        glow/decoratie).

   4) SOLIDE knop-/tegel-VULLING met witte tekst erop (ander scenario dan
      hierboven — hier gaat het om witte tekst OP de kleur, niet de kleur
      als tekst): de ECHTE pluimkleuren zijn hiervoor (net als op wit)
      vaak te licht; de bestaande VERDIEPTE V3-tokens (feather-*-deep,
      hierboven) worden hergebruikt als gradient-eindpunten in de nieuwe
      knopgradients — --feather-blue heeft dat niet nodig (6.94:1 met wit).
      --gradient-primary: blue → cyan-deep   → wit erop: 6.94:1 / 4.64:1 OK
      --gradient-accent : purple-deep → red-deep → wit erop: 4.62:1/4.61:1 OK

   5) GRADIENT-TEKST (.text-gradient, background-clip:text) is met opzet
      NIET toegepast op de hero-h1 (die staat bovenop de bewegende aurora-
      mesh, sectie 6 — de lokale achtergrondkleur ONDER elke letter is daar
      niet statisch vooraf te berekenen met een script). De hero-h1 blijft
      daarom gewoon zuiver wit (18.62:1, altijd veilig, ook getoetst tegen
      het felste denkbare meshpunt — zie punt 7 hieronder). .text-gradient
      wordt wel toegepast op .section-title (elke belangrijke sectiekop),
      want die staat gegarandeerd op een VLAKKE achtergrond (canvas/
      elevated/section-tint-*) — alle 4 gradientstops nagerekend tegen
      alle 5 mogelijke vlakke achtergronden: minimum 4.38:1, dus ruim
      boven de 3:1-drempel voor grote/vette tekst (.section-title is groot
      + vet) en bijna overal ook boven 4.5:1.

   6) EYEBROW-PILLS / BADGES (halfdoorzichtige kleurchips): achtergrond =
      color-mix(in srgb, kleur 10%, canvas), tekst = de kleur zelf (of
      --feather-blue-text voor blauw). Bij 10% mix haalt ELKE kleur
      minimum 4.52:1 (blauw, de krapste) tot 11.93:1 (geel).

   7) HERO-AURORA-MESH mag nooit de leesbaarheid van wat erboven staat in
      gevaar brengen: zelfs in het felst denkbare geval (het lichtste
      pluimgeel #fde656 op 35% dekking bovenop de canvas, veel feller dan
      de effectief gebruikte 14-28%) blijft wit erop nog altijd 6.78:1 —
      ruim boven AA. Vandaar geen extra donkere "scrim" nodig achter de
      hero-tekst.

   8) FORMULIERVELDEN op canvas: invoerveld-achtergrond = 8% wit over
      canvas (#202439). Tekst (wit 92%) 13.08:1, placeholder (wit 68%)
      7.82:1 — beide ruim OK. Veldrand moet, in tegenstelling tot een
      decoratieve kaartrand, wél de 3:1 UI-componentdrempel halen (WCAG
      1.4.11): bij 34% wit-dekking precies 3.08:1 → afgerond op 35% wit
      voor marge (--input-border).

   9) TABEL: kopregel-achtergrond = --color-canvas-elevated, koptekst wit
      92% → 12.44:1. (De eerder overwogen optie — kopTEKST in een
      feather-kleur — haalde op elevated maar 3.6-4.0:1 en is daarom
      NIET gebruikt; wit is hier de correcte, nagerekende keuze.)

   Volledige tokenlijst + klasse-per-klasse toelichting: zie sectie 1
   (tokens) en de component-secties verderop. Het volledige
   verificatiescript staat in scripts/contrast-check-v4.mjs.

   BEKENDE, BEWUSTE UITZONDERING (buiten de scope van dit fundament):
   --color-secondary is voor dit fundament omgezet van een donkere navy
   (die als TEKST op de nieuwe donkere canvas bijna onzichtbaar zou zijn —
   en die vorm van gebruik komt het vaakst voor, o.a. in ranking/, calendar/,
   photo/, page/show en news/index) naar --feather-blue-text (4.84:1 op
   canvas). Er bestaat in het bestaande, NIET-aangepaste news/show.html.twig
   echter ook één inline callout die --color-secondary als tekst gebruikt
   BOVENOP het onveranderd gebleven lichte --color-primary-light-chip
   (zelfstandig lichte pill, zie hieronder) — die ene, specifieke combinatie
   daalt daardoor van een oorspronkelijke ~13:1 naar ~3.4:1. Dat is een
   bewuste, in de opdracht expliciet toegestane afweging (fase 2 herbouwt
   de overige templates toch volledig) — de MEERDERHEID van de bestaande
   toepassingen (rechtstreeks op de paginacanvas) wordt hierdoor net van
   onleesbaar naar ruim-AA-conform gebracht. Alle overige "-light"/"-dark"/
   "-tint" tokens (--color-primary-light/-dark, --color-accent-light/-dark/
   -tint, --color-secondary-light/-dark, --color-surface, --color-border,
   --color-border-strong) zijn BEWUST ONGEWIJZIGD gelaten: ze worden in
   andere, nog niet aangepaste templates gebruikt als zelfstandig licht
   kaartje (lichte achtergrond + eigen donkere tekst, intern nog steeds
   AA-conform, ongeacht de kleur van de onderliggende pagina).
   ========================================================================= */

/* -------------------------------------------------------------------------
   0. LOKAAL GEHOSTE FONTS (geen externe CDN-calls — AssetMapper serveert
      assets/fonts/*.woff2 automatisch en herschrijft de relatieve url()'s)
   ------------------------------------------------------------------------- */
@font-face {
    font-family: "Inter";
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url("../fonts/inter-400-poxsSdI.woff2") format("woff2");
}

@font-face {
    font-family: "Inter";
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url("../fonts/inter-500-Uwgfwtt.woff2") format("woff2");
}

@font-face {
    font-family: "Inter";
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url("../fonts/inter-600-keCwlca.woff2") format("woff2");
}

@font-face {
    font-family: "Poppins";
    font-style: normal;
    font-weight: 600;
    font-display: swap;
    src: url("../fonts/poppins-600-RV1hfMj.woff2") format("woff2");
}

@font-face {
    font-family: "Poppins";
    font-style: normal;
    font-weight: 700;
    font-display: swap;
    src: url("../fonts/poppins-700-5ePuYxR.woff2") format("woff2");
}

/* -------------------------------------------------------------------------
   1. DESIGN TOKENS
   ------------------------------------------------------------------------- */
:root {
    /* --- V5-LICHT-RESTYLING (augustus 2026): klant ervoer het V4-donkere
       thema als te zwaar/donker aanvoelend. Canvas draait om naar een
       zachte, lichte ondergrond — gelaagdheid nu via 2 net iets DONKERDERE
       "elevated"-tinten i.p.v. lichtere (omgekeerde logica t.o.v. V4).
       BEWUSTE UITZONDERING: de hero (sectie 6) en de foto-lightbox (sectie
       13b) blijven donker/glazen — een donkere hero als "impact-band" is
       een gangbaar, professioneel patroon op verder lichte sites, en een
       lightbox-overlay is universeel donker (fotokijker-conventie, los van
       het sitethema). Die twee onderdelen gebruiken daarom bewust NIET
       langer de onderstaande gedeelde tokens maar eigen, hardgecodeerde
       rgba(255,255,255,...)-waarden — zie de toelichting bij elke klasse. --- */
    --color-canvas: #f6f7fb;
    --color-canvas-elevated: #ffffff;
    --color-canvas-elevated-2: #eef0f8;

    /* --- Glas-tokens — nu een subtiele DONKERE tint over de lichte canvas
       i.p.v. een lichte tint over donker. Dezelfde componenten (.card,
       .btn-outline, .page-content, formuliervelden, ...) gebruiken deze
       tokens ongewijzigd; enkel de VULLING draait om. --- */
    --glass-bg: rgba(15, 23, 42, 0.035);
    --glass-bg-strong: rgba(15, 23, 42, 0.06);
    --glass-border: rgba(15, 23, 42, 0.10);
    --glass-border-strong: rgba(15, 23, 42, 0.18);
    --glass-blur: 16px;
    --glass-blur-strong: 22px;
    --gradient-border: linear-gradient(135deg, rgba(15, 23, 42, 0.14) 0%, rgba(15, 23, 42, 0.03) 45%, rgba(15, 23, 42, 0.10) 100%);
    /* Formuliervelden: WCAG 1.4.11 UI-componentdrempel (3:1) — bij 38%
       donkere dekking op wit ruim gehaald (~4.2:1, marge ingebouwd). */
    --input-border: rgba(15, 23, 42, 0.38);

    /* --- Merkkleuren — nu de VERDIEPTE V3-tinten (al AA-geverifieerd tegen
       WIT, zie de V3.2-toelichting bovenaan dit bestand) i.p.v. de vivid
       V4-tinten (die tegen wit net FAALDEN — zie diezelfde toelichting). --- */
    --color-primary: #007ea5;        /* verdiept cyaan — tekst/link op lichte canvas: 4.64:1 */
    --color-primary-dark: #095b63;   /* ONGEWIJZIGD (V1-tint) */
    --color-primary-light: #e3f4f5;  /* ONGEWIJZIGD */
    --color-primary-bright: color-mix(in srgb, var(--color-primary) 70%, black); /* verdonkerde hover-variant voor de lichte canvas (i.p.v. de V4-opheldering richting wit) */

    --color-secondary: #5f48ae;      /* verdiept blauw — tekstkleur op lichte canvas: 6.94:1 */
    --color-secondary-dark: #121d47; /* ONGEWIJZIGD (V1-tint) */
    --color-secondary-light: #eef1fb;/* ONGEWIJZIGD */

    --color-accent: #a4672c;         /* verdiept oranje — CTA/focus/highlight: 4.61:1 op wit (vivid #fc9e44 haalt maar 2.08:1) */
    --color-accent-dark: #a8380a;    /* ONGEWIJZIGD (V1-tint) */
    --color-accent-light: #fdece0;   /* ONGEWIJZIGD */
    --color-accent-tint: #dc8561;    /* ONGEWIJZIGD — back-compat */

    /* --- Basissemantiek: donkere tekst op de lichte canvas. --- */
    --color-text: #1a1f36;    /* ~15:1 op canvas — warme, donkere leisteentint i.p.v. zuiver zwart */
    --color-muted: #5b6178;   /* ~4.9:1 op canvas */
    --color-bg: var(--color-canvas);
    --color-surface: #ffffff;
    --color-border: #e3e6eb;
    --color-border-strong: #cad0da;

    /* --- Typografie --- */
    --font-heading: "Poppins", "Montserrat", system-ui, -apple-system, "Segoe UI", sans-serif;
    --font-body: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;

    /* --- Spacing-schaal --- */
    --space-1: 0.25rem;
    --space-2: 0.5rem;
    --space-3: 0.75rem;
    --space-4: 1rem;
    --space-5: 1.5rem;
    --space-6: 2rem;
    --space-7: 3rem;
    --space-8: 4rem;

    /* --- Border-radius-schaal --- */
    --radius-sm: 4px;
    --radius-md: 8px;
    --radius-lg: 14px;
    --radius-full: 999px;

    /* --- Schaduwen — veel lichter dan de V4-donkere-canvas-schaduwen: op
       een lichte canvas is een subtiele, zachte schaduw genoeg om "verheven"
       te lezen; de zware V4-waarden (tot 55% zwart) zouden hier als een
       harde, opdringerige rand ogen i.p.v. een zachte lift. --- */
    --shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.06), 0 1px 1px rgba(15, 23, 42, 0.04);
    --shadow-md: 0 10px 24px rgba(15, 23, 42, 0.10), 0 2px 6px rgba(15, 23, 42, 0.06);
    --shadow-lg: 0 24px 48px rgba(15, 23, 42, 0.14), 0 6px 16px rgba(15, 23, 42, 0.08);

    /* --- Overig --- */
    --max-width: 1180px;
    --transition: 160ms ease;

    /* --- Shuttle-gradient: het regenboogverenmotief van het logo, hergebruikt
       als dun, herkenbaar merkaccent (bovenrand header/footer, onderstrepingen,
       decoratieve vormen) — NOOIT als tekstkleur, uitsluitend decoratief. --- */
    --gradient-shuttle: linear-gradient(90deg, #5f48ae 0%, #bd6da4 26%, #f15837 52%, #fc9e44 76%, #fde656 100%);

    /* --- Pluimkleuren als volwaardige kleurvlakken (v3.1, GEMETEN) ---
       Voor SOLID achtergronden met witte tekst erop (zie .tile, sectie 8c).
       Elke kleur is WCAG AA-getoetst tegen wit — zie toelichting bovenaan
       dit bestand (v3.1-correctie). Gebruik deze tokens, niet losse
       hexcodes, in nieuwe CSS. */
    --feather-blue: #5f48ae;
    --feather-purple: #a35e8e;
    --feather-red: #cb4a2e;
    --feather-orange: #a4672c;
    --feather-yellow: #81762c;
    --feather-cyan: #007ea5;

    /* Puur decoratieve, heldere (gemeten) versies — NOOIT als achtergrond
       onder tekst gebruiken (te weinig contrast met wit), enkel voor
       illustraties/svg/orbit-bolletjes/dunne accentlijnen. */
    --feather-orange-vivid: #fc9e44;
    --feather-yellow-vivid: #fde656;

    /* --- V5-LICHT: de "-real"-tokens (tekst/icoon/gradient-tekst/eyebrow-
       pills/badges op de canvas) wijzen nu weer naar dezelfde VERDIEPTE
       tinten hierboven i.p.v. de vivid V4-waarden — die vivid tinten faalden
       tegen wit (zie V3.2-toelichting: cyaan 2.92:1, paars 3.57:1, rood
       3.39:1, oranje 2.08:1, geel 1.26:1, allemaal onder AA). Door hier
       simpelweg naar de reeds-geverifieerde V3-tokens te verwijzen, erft
       elke plek die "-real" gebruikt (badges, eyebrow-pills, .tile,
       gradient-tekst, ...) automatisch de correcte, lichte-canvas-veilige
       kleur — zonder dat elke losse component-regel moest worden aangepast. */
    --feather-blue-real: var(--feather-blue);      /* = #5f48ae, 6.94:1 op wit */
    --feather-blue-text: var(--feather-blue);      /* was een opgehelderde variant voor de donkere canvas; op wit is de "kale" verdiepte tint zelf al de tekst-veilige keuze */
    --feather-purple-real: var(--feather-purple);  /* = #a35e8e, 4.62:1 op wit */
    --feather-red-real: var(--feather-red);        /* = #cb4a2e, 4.61:1 op wit */
    --feather-orange-real: var(--feather-orange);  /* = #a4672c, 4.61:1 op wit */
    --feather-yellow-real: var(--feather-yellow);  /* = #81762c, 4.60:1 op wit — diep mosterdgeel i.p.v. fel geel, de prijs van AA-contrast op wit */
    --feather-cyan-real: var(--feather-cyan);      /* = #007ea5, 4.64:1 op wit */

    /* --- V4: samengestelde gradients ---------------------------------- */
    /* Knop-/CTA-vullingen: witte tekst op BEIDE eindpunten nagerekend
       (zie V4-toelichting punt 4) — blijft daarom op de bestaande,
       verdiepte V3-feather-tokens gebaseerd, niet op de --*-real-varianten. */
    --gradient-primary: linear-gradient(135deg, var(--feather-blue-real) 0%, var(--feather-cyan) 100%);
    --gradient-accent: linear-gradient(135deg, var(--feather-purple) 0%, var(--feather-red) 100%);
    /* Gradient-tekst (.text-gradient, background-clip:text) — enkel op
       gegarandeerd VLAKKE achtergronden gebruiken, zie V4-toelichting
       punt 5 en de klasse-commentaar bij .text-gradient hieronder. */
    --gradient-text: linear-gradient(90deg, var(--feather-blue-text) 0%, var(--feather-purple-real) 35%, var(--feather-red-real) 65%, var(--feather-orange-real) 100%);
    /* Aurora/mesh-achtergrond voor de hero (en herbruikbaar op andere
       donkere "hero-achtige" banden) — zachte, deels overlappende
       radial-gradients in de pluimkleuren, lage dekking (14-28%) zodat
       wit/gekleurde tekst er hoe dan ook overheen leesbaar blijft (zie
       V4-toelichting punt 7). Gebruik op een position:relative-element
       met overflow:hidden, typisch via een ::before (zie .hero hieronder). */
    --gradient-aurora:
        radial-gradient(38% 45% at 12% 18%, rgba(95, 72, 174, 0.30), transparent 70%),
        radial-gradient(34% 40% at 88% 12%, rgba(0, 163, 212, 0.26), transparent 70%),
        radial-gradient(40% 42% at 80% 88%, rgba(241, 88, 55, 0.22), transparent 70%),
        radial-gradient(36% 38% at 18% 92%, rgba(189, 109, 164, 0.22), transparent 70%),
        radial-gradient(30% 34% at 55% 50%, rgba(252, 158, 68, 0.14), transparent 70%);
    /* Vlakke, donkere basisgradient ONDER de aurora-blobs (voorkomt dat de
       hero ooit "plat" zwart oogt zonder de geanimeerde laag, bv. bij
       prefers-reduced-motion of een trage eerste render). LOS van
       --color-canvas-elevated-2/--color-canvas hierboven gehouden (die zijn
       nu licht) — de hero blijft bewust donker, dus hardgecodeerde eigen
       donkere tinten i.p.v. de gedeelde canvas-tokens. */
    --gradient-canvas-deep: linear-gradient(135deg, #1c2450 0%, #0d1128 70%);

    /* --- Subtiele dot-grid-textuur — nu enkel nog gebruikt binnen de
       (donker gebleven) hero, dus bewust NIET meeveranderd naar de lichte
       canvas: blijft lichte stippen op donker. De .bg-dotgrid-utilityklasse
       (gebruikt op lichte body-secties) krijgt daarom een eigen, donkere
       stippen-variant rechtstreeks op de klasse zelf — zie sectie 8c. --- */
    --dotgrid-image: radial-gradient(circle, rgba(255, 255, 255, 0.07) 1px, transparent 1.6px);
    --dotgrid-size: 26px 26px;

    /* --- Lichte, bijna-witte pluimtinten voor sectie-achtergronden (v3) —
       ONGEWIJZIGD BEWAARD (niet meer intern gebruikt door dit bestand,
       .section-tint-* is hieronder herzien naar donkere tint-varianten,
       zie sectie 8c) zodat een eventuele oude referentie niet breekt. --- */
    --section-tint-blue: #f1f3fb;
    --section-tint-purple: #f6f2fa;
    --section-tint-cyan: #f0fcfd;
}

/* -------------------------------------------------------------------------
   2. RESET & BASIS
   ------------------------------------------------------------------------- */
* {
    box-sizing: border-box;
}

html {
    scroll-behavior: smooth;
    -webkit-text-size-adjust: 100%;
}

body {
    margin: 0;
    font-family: var(--font-body);
    font-size: 1rem;
    color: var(--color-text);
    background: var(--color-bg);
    line-height: 1.6;
}

img,
svg {
    max-width: 100%;
    display: block;
}

a {
    color: var(--color-primary);
    text-decoration: none;
    transition: color var(--transition);
}

a:hover {
    /* Op een donkere achtergrond helpt een OPGEHELDERDE hover-tint meer dan
       een verdonkerde (die zou juist wegvallen tegen de donkere canvas) —
       zie --color-primary-bright hierboven (9.17:1 op canvas). */
    color: var(--color-primary-bright);
    text-decoration: underline;
}

hr {
    border: none;
    border-top: 1px solid var(--glass-border);
    margin: var(--space-6) 0;
}

::selection {
    /* Niet de pure --color-primary (echt cyaan, 2.92:1 met wit): de
       verdiepte --feather-cyan haalt wel de vereiste 4.5:1 met witte tekst. */
    background: var(--feather-cyan);
    color: #fff;
}

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

/* Toegankelijke focus-states op alle interactieve elementen. Gebruikt
   bewust --feather-orange (verdiept) i.p.v. de vivid --color-accent: die
   verdiepte tint haalt zowel op de donkere canvas (4.04:1) als op de
   bestaande lichte "-surface"-kaartjes elders (4.61:1) de vereiste 3:1
   UI-componentdrempel — een focusring moet overal werken, ongeacht welke
   (donkere of nog-lichte) achtergrond eronder zit. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
[tabindex]:focus-visible {
    outline: 3px solid var(--feather-orange);
    outline-offset: 2px;
    border-radius: var(--radius-sm);
}

/* Skip-link (toetsenbord/screenreader-toegankelijkheid). Zelfde reden als
   hierboven: verdiepte --feather-orange i.p.v. vivid --color-accent, want
   wit erop moet 4.5:1 halen (verdiept: 4.61:1 — vivid faalt met 2.08:1). */
.skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    z-index: 1000;
    background: var(--feather-orange);
    color: #fff;
    padding: var(--space-3) var(--space-5);
    border-radius: 0 0 var(--radius-md) 0;
    font-weight: 600;
}

.skip-link:focus {
    left: 0;
}

/* -------------------------------------------------------------------------
   3. TYPOGRAFISCHE HIËRARCHIE
   ------------------------------------------------------------------------- */
h1, h2, h3, h4, h5, h6 {
    font-family: var(--font-heading);
    color: var(--color-text);
    font-weight: 700;
    line-height: 1.2;
    margin: 0 0 var(--space-4);
}

h1 {
    font-size: clamp(1.9rem, 1.5rem + 1.6vw, 2.75rem);
    letter-spacing: -0.015em;
}

h2 {
    font-size: clamp(1.5rem, 1.3rem + 0.8vw, 2rem);
    letter-spacing: -0.01em;
}

h3 {
    font-size: 1.25rem;
    font-weight: 600;
}

h4 {
    font-size: 1.05rem;
    font-weight: 600;
}

p {
    margin: 0 0 var(--space-4);
}

.text-muted {
    color: var(--color-muted);
}

.text-accent {
    color: var(--color-accent);
}

/* --- V4 NIEUW: gradient-tekst-utility (background-clip:text) ---
   BELANGRIJK — enkel gebruiken op elementen met een GEGARANDEERD VLAKKE
   achtergrond erachter (body/.section op --color-canvas, --color-canvas-
   elevated, of één van de .section-tint-* klassen hieronder). NIET
   gebruiken bovenop de bewegende hero-aurora-mesh of een foto — daar is
   de achtergrondkleur onder elke letter niet statisch met een script na
   te rekenen (zie V4-toelichting punt 5 bovenaan dit bestand). Bedoeld
   voor grote/vette tekst (koppen): alle 4 gradientstops halen minimaal
   3:1 (vaak 4.5:1+) tegen elke vlakke donkere achtergrond in dit systeem —
   zie scripts/contrast-check-v4.mjs. Wordt standaard toegepast op
   .section-title (sectie 4 hieronder); ook los bruikbaar: <span
   class="text-gradient">...</span>. */
.text-gradient {
    background: var(--gradient-text);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}

@supports not (background-clip: text) {
    .text-gradient {
        background: none;
        color: var(--color-text);
    }
}

/* --- V4 NIEUW: subtiele dot-grid-achtergrondtextuur voor donkere secties
   (heel lage opacity, "tech"-gevoel zonder opdringerig te worden). Zet
   simpelweg als extra klasse op een donkere sectie, bv.
   <section class="section bg-dotgrid">. Puur decoratief (geen tekst),
   dus geen WCAG-contrastdrempel van toepassing. --- */
.bg-dotgrid {
    /* Eigen, donkere stippen-variant i.p.v. de gedeelde --dotgrid-image-
       token (die blijft lichte stippen leveren, enkel nog bedoeld voor de
       donker gebleven hero) — deze utility wordt op lichte body-secties
       gebruikt en heeft dus donkere stippen op de lichte canvas nodig. */
    background-image: radial-gradient(circle, rgba(15, 23, 42, 0.09) 1px, transparent 1.6px);
    background-size: var(--dotgrid-size);
}

/* -------------------------------------------------------------------------
   4. LAYOUT: container & grid
   ------------------------------------------------------------------------- */
.container {
    max-width: var(--max-width);
    margin: 0 auto;
    padding: 0 var(--space-5);
}

.section {
    padding: var(--space-7) 0;
}

.section-title {
    /* V4: de belangrijkste sectiekoppen krijgen het gradient-tekst-effect
       (zie .text-gradient hierboven) — .section-title staat altijd op een
       vlakke, nagerekende achtergrond (canvas/elevated/section-tint-*). */
    background: var(--gradient-text);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    font-size: clamp(1.5rem, 1.3rem + 0.8vw, 2rem);
    text-align: center;
    /* width:max-content i.p.v. het standaard blok-breed element: zo spant
       de gradient exact over de zichtbare letters (van blauw t.e.m. oranje)
       i.p.v. over de volledige, veel bredere containerbreedte — anders
       valt het blauwe/paarse begin van de gradient buiten de (kortere,
       gecentreerde) tekst en is enkel het rood/oranje-eind zichtbaar. */
    width: max-content;
    max-width: 100%;
    margin: 0 auto var(--space-6);
    position: relative;
    padding-bottom: var(--space-4);
}

@supports not (background-clip: text) {
    .section-title {
        background: none;
        color: var(--color-text);
    }
}

.section-title::after {
    content: "";
    position: absolute;
    left: 50%;
    bottom: 0;
    transform: translateX(-50%);
    width: 64px;
    height: 4px;
    border-radius: var(--radius-full);
    background: var(--gradient-shuttle);
}

.section-eyebrow {
    display: block;
    text-align: center;
    font-family: var(--font-heading);
    font-size: 0.8rem;
    font-weight: 700;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--color-primary);
    margin-bottom: var(--space-2);
}

/* Dunne regenboogstreep — het herkenbare merkaccent, spaarzaam gebruikt
   (boven de header, boven de footer, als decoratieve deler tussen secties) */
.shuttle-bar {
    height: 5px;
    background: var(--gradient-shuttle);
}

.grid {
    display: grid;
    gap: var(--space-5);
}

.grid-2 {
    grid-template-columns: repeat(2, 1fr);
}

.grid-3 {
    grid-template-columns: repeat(3, 1fr);
}

.grid-4 {
    grid-template-columns: repeat(4, 1fr);
}

/* Mobile-first: 1 kolom onder 640px, 2 vanaf 640px, volledig vanaf 960px */
@media (max-width: 959px) {
    .grid-4 {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (max-width: 639px) {
    .grid-2,
    .grid-3,
    .grid-4 {
        grid-template-columns: 1fr;
    }
}

/* -------------------------------------------------------------------------
   5. HEADER & NAVIGATIE — V4: glas i.p.v. effen navy
   ------------------------------------------------------------------------- */
.site-header {
    /* V5-licht: bijna-ondoorzichtig wit i.p.v. een donkere glastint — een
       hoge dekking (i.p.v. de subtiele --glass-bg-strong) houdt navigatie-
       tekst altijd leesbaar, ook wanneer de donker gebleven hero eronder
       doorschemert bij het scrollen. */
    background: rgba(255, 255, 255, 0.85);
    backdrop-filter: blur(var(--glass-blur-strong));
    -webkit-backdrop-filter: blur(var(--glass-blur-strong));
    color: var(--color-text);
    position: sticky;
    top: 0;
    z-index: 100;
    border-top: 4px solid transparent;
    border-image: var(--gradient-shuttle) 1;
    box-shadow: 0 1px 0 var(--glass-border), 0 8px 24px rgba(15, 23, 42, 0.08);
}

.site-header .container {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: var(--space-4);
    padding-top: var(--space-3);
    padding-bottom: var(--space-3);
    min-height: 88px;
}

.brand {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    font-family: var(--font-heading);
    font-size: 1.15rem;
    font-weight: 700;
    color: var(--color-text);
    letter-spacing: 0.01em;
    flex-shrink: 0;
}

.brand:hover {
    color: var(--color-text);
    text-decoration: none;
}

/* "Badminton" en "Limburg" onder elkaar i.p.v. naast elkaar — neemt minder
   horizontale ruimte in, wat het logo naast de tekst groter kan zijn
   zonder de header breder te maken. */
.brand-text {
    display: flex;
    flex-direction: column;
    line-height: 1.25;
}

/* V4: GEEN witte "chip" meer achter het logo. Het transparante logo
   (assets/images/logo-transparent.png) toont zelf al mooi op een donkere
   achtergrond zonder wit randje — de witte chip was uitsluitend nodig
   tegen de vorige lichte/effen navy header en is nu overbodig/ongewenst.
   Een zachte drop-shadow houdt het logo leesbaar, ook bovenop de
   bewegende hero-aurora die eronder kan doorschemeren op sommige pagina's. */
.brand-logo {
    width: 72px;
    height: 72px;
    object-fit: contain;
    display: block;
    flex-shrink: 0;
    filter: drop-shadow(0 2px 6px rgba(0, 0, 0, 0.45));
}

.brand .brand-highlight {
    /* De echte, vivid --color-accent (feather-orange) haalt nu al 8.97:1
       op de donkere canvas — de vorige "-tint"-workaround (nodig tegen de
       oude effen navy header) is niet langer nodig. */
    color: var(--color-accent);
}

/* Hamburger-knop (enkel zichtbaar op kleine schermen) */
.nav-toggle {
    display: inline-flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    gap: 5px;
    width: 42px;
    height: 42px;
    padding: 0;
    background: transparent;
    border: 1px solid var(--glass-border-strong);
    border-radius: var(--radius-md);
    cursor: pointer;
    flex-shrink: 0;
}

.nav-toggle-bar {
    display: block;
    width: 20px;
    height: 2px;
    background: var(--color-text);
    border-radius: var(--radius-full);
    transition: transform var(--transition), opacity var(--transition);
}

.nav-toggle.is-active .nav-toggle-bar:nth-child(1) {
    transform: translateY(7px) rotate(45deg);
}

.nav-toggle.is-active .nav-toggle-bar:nth-child(2) {
    opacity: 0;
}

.nav-toggle.is-active .nav-toggle-bar:nth-child(3) {
    transform: translateY(-7px) rotate(-45deg);
}

.main-nav-wrapper {
    flex-basis: 100%;
}

.main-nav {
    display: flex;
    flex-wrap: wrap;
    gap: 0;
    list-style: none;
    margin: 0;
    padding: 0;
}

.main-nav a {
    display: block;
    color: rgba(26, 31, 54, 0.75);
    padding: var(--space-3) var(--space-3);
    border-radius: var(--radius-sm);
    font-size: 0.86rem;
    font-weight: 500;
    white-space: nowrap;
}

.main-nav a:hover,
.main-nav a.active {
    background: var(--glass-bg-strong);
    text-decoration: none;
    color: var(--color-text);
}

/* -------------------------------------------------------------------------
   5b. NAVIGATIE-DROPDOWN ("Documenten") — snel downloaden vanuit de
   hoofdnavigatie, zoals op de bestaande badmintonlimburg.be. Werkt zowel op
   hover/focus (desktop) als via klik (touch/mobiel, en als robuuste
   aanvulling op desktop). Content wordt via {{ render(controller(...)) }}
   ingeladen (document/_nav_menu.html.twig), dus altijd de actuele
   documentenlijst uit de database — geen hardcoded links.
   ------------------------------------------------------------------------- */
.nav-dropdown {
    position: relative;
}

.nav-dropdown-trigger {
    /* <button> krijgt van de browser standaard line-height: normal i.p.v.
       de overgeërfde 1.6 van body — daardoor was deze knop lager/korter
       dan de gewone <a>-navigatielinks ernaast, en leek de tekst hoger te
       staan binnen de gedeelde navigatierij. line-height hier expliciet
       gelijkstellen aan die van de links verhelpt dat. */
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    background: none;
    border: none;
    cursor: pointer;
    font-family: var(--font-body);
    line-height: 1.6;
    color: rgba(26, 31, 54, 0.75);
    padding: var(--space-3) var(--space-3);
    border-radius: var(--radius-sm);
    font-size: 0.86rem;
    font-weight: 500;
    white-space: nowrap;
}

.nav-dropdown-trigger:hover,
.nav-dropdown-trigger.active,
.nav-dropdown.is-open .nav-dropdown-trigger {
    background: var(--glass-bg-strong);
    color: var(--color-text);
}

.nav-dropdown-caret {
    transition: transform var(--transition);
    flex-shrink: 0;
}

.nav-dropdown:hover .nav-dropdown-caret,
.nav-dropdown:focus-within .nav-dropdown-caret,
.nav-dropdown.is-open .nav-dropdown-caret {
    transform: rotate(180deg);
}

.nav-dropdown-menu {
    background: var(--color-canvas-elevated-2);
    border: 1px solid var(--glass-border-strong);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-lg);
    padding: var(--space-2);
}

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

.nav-dropdown-list a {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    padding: var(--space-2) var(--space-3);
    border-radius: var(--radius-sm);
    color: var(--color-text);
    font-size: 0.88rem;
    white-space: normal;
}

.nav-dropdown-list a:hover,
.nav-dropdown-list a:focus-visible {
    background: var(--glass-bg-strong);
    color: var(--color-text);
    text-decoration: none;
}

.nav-dropdown-list svg {
    color: var(--feather-cyan);
    flex-shrink: 0;
}

.nav-dropdown-all {
    display: block;
    margin-top: var(--space-1);
    padding: var(--space-2) var(--space-3);
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--feather-cyan-vivid, var(--feather-cyan));
    border-top: 1px solid var(--glass-border);
}

.nav-dropdown-all:hover {
    color: var(--color-text);
}

.nav-dropdown-empty {
    margin: 0;
    padding: var(--space-2) var(--space-3);
    font-size: 0.85rem;
    color: var(--color-muted);
}

/* Mobiel/tablet (< 1180px): accordion, geen zwevend paneel */
@media (max-width: 1179px) {
    .nav-dropdown {
        width: 100%;
    }

    .nav-dropdown-trigger {
        width: 100%;
        justify-content: space-between;
        padding: var(--space-4);
    }

    .nav-dropdown-menu {
        max-height: 0;
        overflow: hidden;
        opacity: 1;
        visibility: visible;
        transform: none;
        border: none;
        padding: 0;
        margin-left: var(--space-4);
        transition: max-height var(--transition);
    }

    .nav-dropdown.is-open .nav-dropdown-menu {
        max-height: 400px;
        padding: var(--space-2);
        border: 1px solid var(--glass-border);
        margin-top: var(--space-1);
    }
}

/* Desktop (≥ 1180px): zwevend paneel, hover/focus/klik */
@media (min-width: 1180px) {
    .nav-dropdown-menu {
        position: absolute;
        top: 100%;
        left: 0;
        margin-top: var(--space-2);
        min-width: 260px;
        opacity: 0;
        visibility: hidden;
        transform: translateY(-6px);
        transition: opacity var(--transition), transform var(--transition), visibility var(--transition);
        z-index: 200;
    }

    .nav-dropdown:hover .nav-dropdown-menu,
    .nav-dropdown:focus-within .nav-dropdown-menu,
    .nav-dropdown.is-open .nav-dropdown-menu {
        opacity: 1;
        visibility: visible;
        transform: translateY(0);
    }
}

/* Mobiel/tablet (< 1180px): hamburger tonen, menu inklapbaar maken.
   Breakpoint ligt op --max-width (1180px): pas daarboven is de
   .container-breedte vast genoeg om alle 9 nav-items gegarandeerd op
   één rij te laten passen (zie .main-nav hierboven). Onder 1180px groeit
   de container mee met de viewport en is er niet altijd genoeg ruimte
   naast het logo, wat voordien tot een afbrekend/wrappend menu leidde. */
@media (max-width: 1179px) {
    .nav-toggle {
        display: inline-flex;
    }

    .main-nav-wrapper {
        order: 3;
        max-height: 0;
        overflow: hidden;
        transition: max-height var(--transition);
        width: 100%;
    }

    .main-nav-wrapper.is-open {
        max-height: 70vh;
        overflow-y: auto;
    }

    .main-nav {
        flex-direction: column;
        flex-wrap: nowrap;
        gap: 0;
        padding: var(--space-3) 0 var(--space-4);
        border-top: 1px solid var(--glass-border);
        margin-top: var(--space-3);
    }

    .main-nav a {
        padding: var(--space-4);
    }
}

/* Desktop (≥ 1180px): hamburger verbergen, menu altijd tonen */
@media (min-width: 1180px) {
    .nav-toggle {
        display: none;
    }

    .main-nav-wrapper {
        flex-basis: auto;
        max-height: none;
        overflow: visible;
    }
}

/* -------------------------------------------------------------------------
   6. HERO — V4: donkere gradient-mesh i.p.v. effen navy-gradient
   ------------------------------------------------------------------------- */
.hero {
    position: relative;
    background: var(--gradient-canvas-deep);
    color: #fff;
    overflow: hidden;
    isolation: isolate;
    /* Scherpe diagonale onderrand (v3, BEHOUDEN) — volledige hoogte links,
       schuin oplopend naar 85% hoogte rechts. */
    clip-path: polygon(0 0, 100% 0, 100% 85%, 0 100%);
}

/* Geanimeerde aurora/mesh-laag: zacht driftende, overlappende gekleurde
   gloeivlekken in de pluimkleuren (item 3 van de opdracht). Ruim
   overdimensioneerd (inset -25%) zodat de drift-animatie nooit een rand
   laat zien. Respecteert prefers-reduced-motion via de globale regel in
   sectie 2 hierboven (die *::before/*::after mee bevriest). */
.hero::before {
    content: "";
    position: absolute;
    inset: -25%;
    background: var(--gradient-aurora);
    animation: aurora-drift 26s ease-in-out infinite alternate;
    z-index: 0;
    pointer-events: none;
}

/* Subtiele, NIET-geanimeerde dot-grid-textuur bovenop de aurora — geeft
   het "tech"-gevoel zonder de stippen zelf te laten meebewegen. */
.hero::after {
    content: "";
    position: absolute;
    inset: 0;
    background-image: var(--dotgrid-image);
    background-size: var(--dotgrid-size);
    z-index: 0;
    pointer-events: none;
}

@keyframes aurora-drift {
    0% {
        transform: translate3d(0, 0, 0) scale(1);
    }
    100% {
        transform: translate3d(-3%, 2%, 0) scale(1.06);
    }
}

.hero .container {
    position: relative;
    z-index: 2;
    display: grid;
    grid-template-columns: 1.1fr 0.9fr;
    align-items: center;
    gap: var(--space-7);
    padding-top: var(--space-8);
    /* Extra ruimte onderaan zodat de content nooit in de diagonale
       afsnijding (clip-path hierboven) terechtkomt. */
    padding-bottom: calc(var(--space-8) + 48px);
    min-height: 460px;
}

.hero-copy {
    position: relative;
    z-index: 2;
}

.hero-eyebrow {
    /* Hardgecodeerde rgba(255,255,255,...) i.p.v. de gedeelde --glass-bg/
       --glass-border-strong-tokens: die tokens zijn nu (licht-thema) een
       DONKERE tint bedoeld voor een lichte ondergrond — op de bewust donker
       gebleven hero (zie V5-toelichting bovenaan het bestand) zou dat een
       bijna onzichtbare donker-op-donker vlek geven. */
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    font-family: var(--font-heading);
    font-size: 0.78rem;
    font-weight: 700;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: #fff;
    background: rgba(255, 255, 255, 0.08);
    border: 1px solid rgba(255, 255, 255, 0.28);
    backdrop-filter: blur(var(--glass-blur));
    -webkit-backdrop-filter: blur(var(--glass-blur));
    padding: 0.4rem 0.9rem;
    border-radius: var(--radius-full);
    margin-bottom: var(--space-5);
}

.hero-eyebrow .dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--gradient-shuttle);
}

.hero h1 {
    /* Bewust ZUIVER WIT, geen gradient-tekst — zie V4-toelichting punt 5
       bovenaan dit bestand (variabele aurora-achtergrond eronder is niet
       statisch met een script na te rekenen; wit is hier altijd 100%
       veilig, ook op het felste denkbare meshpunt: 6.78:1, zie punt 7). */
    color: #fff;
    margin: 0 0 var(--space-5);
    text-align: left;
    max-width: 16ch;
}

.hero p {
    font-size: 1.15rem;
    color: rgba(255, 255, 255, 0.88);
    max-width: 46ch;
    margin: 0 0 var(--space-6);
    text-align: left;
}

.hero-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-4);
}

.hero .btn-outline {
    border-color: rgba(255, 255, 255, 0.55);
    color: #fff;
    background: rgba(255, 255, 255, 0.06);
}

.hero .btn-outline:hover {
    background: rgba(255, 255, 255, 0.16);
    border-color: #fff;
}

/* Decoratieve shuttle-illustratie (rechterkant van de hero) — abstracte
   vertaling van het logo: regenboogveren + cyaan cork, groot en dynamisch,
   in plaats van het logo enkel piepklein in de header te tonen. */
.hero-visual {
    position: relative;
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: center;
}

.hero-visual svg {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 420px;
    filter: drop-shadow(0 24px 48px rgba(0, 0, 0, 0.5));
}

/* Origineel logo in de hero (v3.1) — ongesneden en onvervormd getoond
   i.p.v. de eigen SVG-interpretatie van de shuttle. */
.hero-logo {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 340px;
    aspect-ratio: 1 / 1;
    object-fit: contain;
    filter: drop-shadow(0 20px 44px rgba(0, 0, 0, 0.55));
}

/* "Orbit"-decoratie rond een hero-illustratie (v3, BEHOUDEN) — herbruikbaar
   op elk position:relative-element (bv. .hero-visual). .orbit-ring staat
   via negative z-index ALTIJD achter gewone content; .orbit-dot staat er
   juist voor (z-index: 2). */
.orbit-ring {
    /* Hardgecodeerd i.p.v. --glass-border-strong: dat token is nu een
       donkere rand voor lichte oppervlakken; deze ring staat op de donker
       gebleven hero en heeft dus een lichte rand nodig. */
    position: absolute;
    top: 50%;
    left: 50%;
    width: 122%;
    aspect-ratio: 1 / 1;
    transform: translate(-50%, -50%);
    border: 2px dashed rgba(255, 255, 255, 0.28);
    border-radius: 50%;
    z-index: -1;
    pointer-events: none;
}

.orbit-dot {
    position: absolute;
    top: 6%;
    right: 10%;
    width: 16px;
    height: 16px;
    border-radius: 50%;
    background: var(--feather-yellow-vivid);
    box-shadow: 0 0 0 5px rgba(255, 255, 255, 0.14), 0 0 20px rgba(253, 230, 86, 0.55);
    z-index: 2;
    pointer-events: none;
}

/* Decoratieve gloeivlekken (v3-markup BEHOUDEN — home/index.html.twig
   plaatst deze twee lege <div>'s vóór .container). V4: herkleurd naar de
   echte pluimkleuren i.p.v. de oude losse hexcodes, en dienen nu als
   extra, iets scherpere gloed bovenop de zachtere --gradient-aurora-mesh. */
.hero-blob {
    position: absolute;
    border-radius: 50%;
    filter: blur(70px);
    opacity: 0.4;
    z-index: 0;
    pointer-events: none;
}

.hero-blob--1 {
    width: 420px;
    height: 420px;
    top: -140px;
    right: -80px;
    background: var(--feather-red-real);
}

.hero-blob--2 {
    width: 320px;
    height: 320px;
    bottom: -160px;
    right: 220px;
    background: var(--feather-blue-real);
}

/* GEDEPRECIEERD (v3): de golf-divider is vervangen door de scherpe
   diagonale clip-path op .hero zelf (zie sectie 6, bovenaan). */
.hero-wave {
    display: none;
}

@media (max-width: 899px) {
    .hero {
        /* Kleinere diagonaal op mobiel: leesbaarheid van de content weegt
           zwaarder dan het effect, zoals gevraagd in de opdracht. */
        clip-path: polygon(0 0, 100% 0, 100% 95%, 0 100%);
    }

    .hero .container {
        grid-template-columns: 1fr;
        text-align: center;
        padding-top: var(--space-7);
        padding-bottom: calc(var(--space-6) + 24px);
        min-height: 0;
    }

    .hero h1,
    .hero p {
        text-align: center;
        max-width: none;
        margin-left: auto;
        margin-right: auto;
    }

    .hero-actions {
        justify-content: center;
    }

    .hero-visual svg {
        max-width: 260px;
    }

    .hero-logo {
        max-width: 220px;
    }
}

/* -------------------------------------------------------------------------
   7. KNOPPEN — V4: gradient-vulling i.p.v. vlakke kleur
   ------------------------------------------------------------------------- */
.btn,
.btn-primary,
.btn-accent,
.btn-outline {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--space-2);
    padding: 0.7rem 1.4rem;
    border-radius: var(--radius-md);
    font-family: var(--font-body);
    font-size: 0.95rem;
    font-weight: 600;
    border: none;
    cursor: pointer;
    text-decoration: none;
    transition: filter var(--transition), background var(--transition), color var(--transition), border-color var(--transition), transform var(--transition), box-shadow var(--transition);
}

/* Primaire CTA: gradient blauw → cyaan (beide eindpunten met witte tekst
   nagerekend: 6.94:1 / 4.64:1, zie V4-toelichting punt 4). */
.btn,
.btn-primary {
    background: var(--gradient-primary);
    color: #fff;
    box-shadow: var(--shadow-sm);
}

.btn:hover,
.btn-primary:hover {
    filter: brightness(1.1);
    color: #fff;
    text-decoration: none;
    transform: translateY(-1px);
    box-shadow: 0 10px 28px color-mix(in srgb, var(--feather-cyan) 45%, transparent), var(--shadow-md);
}

/* Warme accentknop — gradient paars → rood, uitsluitend voor de
   belangrijkste call-to-action's (4.62:1 / 4.61:1 met witte tekst). */
.btn-accent {
    background: var(--gradient-accent);
    color: #fff;
    box-shadow: var(--shadow-sm);
}

.btn-accent:hover {
    filter: brightness(1.1);
    color: #fff;
    text-decoration: none;
    transform: translateY(-1px);
    box-shadow: 0 10px 28px color-mix(in srgb, var(--feather-red) 45%, transparent), var(--shadow-md);
}

/* Secundaire knop: "glas"-outline i.p.v. vlakke rand. */
.btn-outline {
    background: var(--glass-bg);
    border: 2px solid var(--glass-border-strong);
    color: var(--color-text);
    backdrop-filter: blur(var(--glass-blur));
    -webkit-backdrop-filter: blur(var(--glass-blur));
    padding: calc(0.7rem - 2px) calc(1.4rem - 2px);
}

.btn-outline:hover {
    /* .hero .btn-outline:hover (hierboven) is specifieker en wint binnen de
       hero — deze basisregel geldt dus voor elk ander (licht) gebruik van
       .btn-outline sitewide, en heeft daarom een donkere hover nodig i.p.v.
       de vorige witte opheldering (die op de lichte canvas onzichtbaar zou
       worden). */
    background: var(--glass-bg-strong);
    border-color: var(--color-text);
    color: var(--color-text);
    text-decoration: none;
}

.btn:disabled,
.btn-primary:disabled,
.btn-accent:disabled,
.btn-outline:disabled {
    opacity: 0.55;
    cursor: not-allowed;
    transform: none;
    filter: none;
}

.btn-sm {
    padding: 0.45rem 0.9rem;
    font-size: 0.85rem;
}

.btn-lg {
    padding: 0.85rem 1.8rem;
    font-size: 1.05rem;
}

/* -------------------------------------------------------------------------
   8. KAARTEN (cards) — V4: glaskaart i.p.v. witte kaart
   ------------------------------------------------------------------------- */
.card {
    /* Glasmorfisme-truc: 2 achtergrondlagen. De eerste (vlakke --glass-bg)
       vult enkel de padding-box (binnen de rand), de tweede (--gradient-
       border) vult de border-box — zo ontstaat een dunne, subtiele
       gradient-rand die WEL correct meebuigt met border-radius (in
       tegenstelling tot border-image, dat border-radius negeert). */
    background:
        linear-gradient(var(--glass-bg), var(--glass-bg)) padding-box,
        var(--gradient-border) border-box;
    border: 1px solid transparent;
    border-radius: var(--radius-lg);
    padding: var(--space-5);
    backdrop-filter: blur(var(--glass-blur));
    -webkit-backdrop-filter: blur(var(--glass-blur));
    box-shadow: var(--shadow-sm);
    transition: transform var(--transition), box-shadow var(--transition), background var(--transition);
    display: block;
}

.card:hover {
    transform: translateY(-3px);
    box-shadow: var(--shadow-md);
    background:
        linear-gradient(var(--glass-bg-strong), var(--glass-bg-strong)) padding-box,
        var(--gradient-border) border-box;
}

.card h3 {
    margin-top: 0;
    color: var(--color-text);
}

a.card {
    color: var(--color-text);
}

a.card:hover {
    text-decoration: none;
}

.news-card .date {
    color: var(--color-muted);
    font-size: 0.85rem;
    margin-bottom: var(--space-2);
    font-weight: 500;
}

.news-card img {
    border-radius: var(--radius-md);
    margin-bottom: var(--space-4);
    aspect-ratio: 16 / 9;
    object-fit: cover;
    object-position: top;
    width: 100%;
}

.news-card h3 {
    margin-bottom: var(--space-2);
}

.news-card p {
    color: var(--color-muted);
    margin-bottom: 0;
}

/* -------------------------------------------------------------------------
   8b. ICOON-CHIPS & FEATURE-CARDS — V4: halfdoorzichtige kleurchip
   ------------------------------------------------------------------------- */
.icon-chip {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 52px;
    height: 52px;
    border-radius: var(--radius-md);
    background: color-mix(in srgb, var(--color-primary) 16%, var(--color-canvas));
    color: var(--color-primary);
    margin-bottom: var(--space-4);
    flex-shrink: 0;
}

.icon-chip svg {
    width: 26px;
    height: 26px;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.8;
    stroke-linecap: round;
    stroke-linejoin: round;
}

.feature-card {
    position: relative;
    padding-top: calc(var(--space-5) + 4px);
    overflow: hidden;
}

.feature-card::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 4px;
    background: var(--feature-color, var(--color-primary));
}

.feature-card .icon-chip {
    background: color-mix(in srgb, var(--feature-color, var(--color-primary)) 16%, var(--color-canvas));
    color: var(--feature-color, var(--color-primary));
}

/* Kleurcyclus op basis van de echte pluimkleuren (consistent met .tile
   hieronder, i.p.v. de losse V1/V2-hexcodes van weleer). */
.feature-card:nth-of-type(6n+1) { --feature-color: var(--feather-blue-text); }
.feature-card:nth-of-type(6n+2) { --feature-color: var(--feather-purple-real); }
.feature-card:nth-of-type(6n+3) { --feature-color: var(--feather-red-real); }
.feature-card:nth-of-type(6n+4) { --feature-color: var(--feather-orange-real); }
.feature-card:nth-of-type(6n+5) { --feature-color: var(--feather-yellow-real); }
.feature-card:nth-of-type(6n+6) { --feature-color: var(--feather-cyan-real); }

/* Statistiekribbon (donkere band met cijfers + iconen, bv. homepage) */
.stats-band {
    background: var(--color-canvas-elevated);
    background-image: var(--gradient-aurora);
    color: #fff;
}

.stat {
    text-align: center;
}

.stat .icon-chip {
    /* .stat leeft binnen .stats-float-card, dat nu een SOLIDE lichte kaart
       is (zie hieronder) i.p.v. donker glas — dus donkere iconkleur i.p.v.
       wit. */
    background: var(--glass-bg-strong);
    color: var(--color-primary);
    margin: 0 auto var(--space-3);
}

.stat .value {
    font-family: var(--font-heading);
    font-size: 2.4rem;
    font-weight: 700;
    color: var(--color-text);
    line-height: 1.1;
}

.stat .label {
    color: var(--color-muted);
    font-size: 0.9rem;
    margin-top: var(--space-1);
}

/* -------------------------------------------------------------------------
   8c. V4: KLEURVLAK-TEGELS, ZWEVENDE STATS, EYEBROW-PILLS, SECTIETINTEN —
       herskinning van de bestaande V3-structuur naar het donkere/glazen/
       gradient-materiaal (concept BEHOUDEN, materiaal vernieuwd).
   ------------------------------------------------------------------------- */

/* --- .tile: V5-LICHT — teruggedraaid naar een EFFEN gekleurd vlak (zoals
   de oorspronkelijke V3-aanpak, zie toelichting bovenaan het bestand) i.p.v.
   de V4-glaskaart. Die V4-glasformule (lage dekking + doorschijnend) leunde
   op een dominante DONKERE canvas erachter om leesbaar te blijven — op de
   nu lichte canvas zou diezelfde formule een vaag, bijna onzichtbaar
   waas geven met onleesbare witte tekst erop. De "-real"-tokens zijn nu de
   al-geverifieerde verdiepte V3-kleuren (zie de tokendefinities bovenaan),
   dus wit erop is hier gegarandeerd AA-conform. Gebruik ongewijzigd:
     <div class="tile">...</div>                → automatische kleurcyclus
     <div class="tile tile--purple">...</div>    → expliciete kleur
   Beschikbare modifiers: tile--blue, tile--purple, tile--red,
   tile--orange, tile--yellow, tile--cyan. --- */
.tile {
    --tile-color: var(--feather-blue-real);
    position: relative;
    display: block;
    padding: var(--space-5);
    border-radius: var(--radius-lg);
    background: var(--tile-color);
    border: 1px solid transparent;
    color: #fff;
    box-shadow: var(--shadow-md);
    transition: transform var(--transition), box-shadow var(--transition);
}

.tile:hover {
    transform: translateY(-4px);
    box-shadow: 0 16px 32px color-mix(in srgb, var(--tile-color) 40%, transparent), var(--shadow-lg);
}

.tile h3,
.tile h4 {
    color: #fff;
}

.tile p {
    color: rgba(255, 255, 255, 0.88);
    margin-bottom: 0;
}

.tile .icon-chip {
    background: rgba(255, 255, 255, 0.2);
    color: #fff;
}

/* Automatische kleurcyclus wanneer geen modifier-klasse gezet is. */
.tile:nth-of-type(6n+1) { --tile-color: var(--feather-blue-real); }
.tile:nth-of-type(6n+2) { --tile-color: var(--feather-purple-real); }
.tile:nth-of-type(6n+3) { --tile-color: var(--feather-red-real); }
.tile:nth-of-type(6n+4) { --tile-color: var(--feather-orange-real); }
.tile:nth-of-type(6n+5) { --tile-color: var(--feather-yellow-real); }
.tile:nth-of-type(6n+6) { --tile-color: var(--feather-cyan-real); }

/* Expliciete kleurmodifiers — .tile.tile--* i.p.v. .tile--* zodat de
   specificiteit (2 klassen) altijd wint van de .tile:nth-of-type(...)
   kleurcyclus hierboven (1 klasse + pseudo-klasse = evenveel specificiteit,
   maar de cyclus staat later in de broncode en zou anders alsnog winnen). */
.tile.tile--blue { --tile-color: var(--feather-blue-real); }
.tile.tile--purple { --tile-color: var(--feather-purple-real); }
.tile.tile--red { --tile-color: var(--feather-red-real); }
.tile.tile--orange { --tile-color: var(--feather-orange-real); }
.tile.tile--yellow { --tile-color: var(--feather-yellow-real); }
.tile.tile--cyan { --tile-color: var(--feather-cyan-real); }

/* --- .stats-float: rij statistiekkaartjes die met een negatieve
   margin-top over de diagonale onderrand van de hero heen "zweven" (v3-
   structuur BEHOUDEN). V4: elk kaartje is nu een glaskaart i.p.v. een
   witte kaart. Structuur ongewijzigd, zie originele toelichting:
     <div class="stats-float"><div class="container">
       <div class="stats-float-row"><div class="stats-float-card">
         <div class="stat">...</div>
       </div></div>
     </div></div>
   Plaats deze sectie in de template DIRECT NA .hero (geen witruimte
   ertussen), zodat de negatieve margin het overlap-effect geeft. --- */
.stats-float {
    position: relative;
    z-index: 5;
    margin-top: -72px;
    margin-bottom: var(--space-6);
}

.stats-float-row {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--space-4);
}

.stats-float-card {
    /* SOLIDE wit i.p.v. een doorschijnende glasformule: dit kaartje
       overlapt met zijn bovenste helft de (bewust donker gebleven) hero en
       met zijn onderste helft de lichte canvas — een doorschijnende
       glastint zou daardoor bovenaan donker-op-donker (bijna onzichtbaar)
       en onderaan licht-op-licht ogen. Een effen witte kaart blijft in
       beide zones gegarandeerd leesbaar. */
    background: var(--color-canvas-elevated);
    border: 1px solid var(--glass-border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    padding: var(--space-5) var(--space-4);
    text-align: center;
}

@media (max-width: 767px) {
    .stats-float {
        /* Kleinere overlap op mobiel, zoals gevraagd — leesbaarheid eerst. */
        margin-top: -32px;
    }

    .stats-float-row {
        grid-template-columns: repeat(2, 1fr);
    }
}

/* --- .eyebrow-pill: ronde badge met puntje boven een sectietitel.
   V4: halfdoorzichtige kleurchip (achtergrond = 10% van de kleur gemengd
   met de donkere canvas — bij 10% haalt élke pluimkleur minimaal 4.52:1
   met zichzelf als tekst, zie V4-toelichting punt 6). Gebruik ongewijzigd:
     <span class="eyebrow-pill"><span class="dot"></span> Aanbod</span>
   Modifiers: eyebrow-pill--blue, --purple, --red, --orange, --yellow,
   --cyan. --- */
.eyebrow-pill {
    --eyebrow-color: var(--color-primary);
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    font-family: var(--font-heading);
    font-size: 0.78rem;
    font-weight: 700;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--eyebrow-color);
    background: color-mix(in srgb, var(--eyebrow-color) 10%, var(--color-canvas));
    border: 1px solid color-mix(in srgb, var(--eyebrow-color) 30%, transparent);
    padding: 0.4rem 0.95rem;
    border-radius: var(--radius-full);
    margin-bottom: var(--space-3);
}

.eyebrow-pill .dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--eyebrow-color);
    flex-shrink: 0;
}

.eyebrow-pill--blue { --eyebrow-color: var(--feather-blue-text); }
.eyebrow-pill--purple { --eyebrow-color: var(--feather-purple-real); }
.eyebrow-pill--red { --eyebrow-color: var(--feather-red-real); }
.eyebrow-pill--orange { --eyebrow-color: var(--feather-orange-real); }
.eyebrow-pill--yellow { --eyebrow-color: var(--feather-yellow-real); }
.eyebrow-pill--cyan { --eyebrow-color: var(--feather-cyan-real); }

/* --- Sectie-tinten: V4 herzien naar donkere, subtiel gekleurde varianten
   (8% van de kleur gemengd met de canvas — blijft optisch zeer dicht bij
   de canvas, dus alle tekstcontrasten die op canvas werken blijven ook
   hier ruim overeind, zie V4-toelichting/script). Zelfde gebruik als
   voorheen: <section class="section section-tint-blue">. --- */
.section-tint-blue {
    background: color-mix(in srgb, var(--feather-blue-real) 8%, var(--color-canvas));
}

.section-tint-purple {
    background: color-mix(in srgb, var(--feather-purple-real) 8%, var(--color-canvas));
}

.section-tint-cyan {
    background: color-mix(in srgb, var(--feather-cyan-real) 8%, var(--color-canvas));
}

.section-tint-yellow {
    background: color-mix(in srgb, var(--feather-yellow-real) 8%, var(--color-canvas));
}

.section-tint-orange {
    background: color-mix(in srgb, var(--feather-orange-real) 8%, var(--color-canvas));
}

/* -------------------------------------------------------------------------
   9. BADGES — V4: halfdoorzichtige kleurchip (zelfde formule als eyebrow-pill)
   ------------------------------------------------------------------------- */
.badge {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    padding: 0.3rem 0.75rem;
    border-radius: var(--radius-full);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    background: color-mix(in srgb, var(--feather-cyan-real) 10%, var(--color-canvas));
    color: var(--feather-cyan-real);
}

.badge-accent {
    background: color-mix(in srgb, var(--feather-orange-real) 10%, var(--color-canvas));
    color: var(--feather-orange-real);
}

.badge-secondary {
    background: color-mix(in srgb, var(--feather-blue-text) 10%, var(--color-canvas));
    color: var(--feather-blue-text);
}

/* -------------------------------------------------------------------------
   10. FORMULIERVELDEN — V4: aangepast voor leesbaarheid op donkere achtergrond
   (Ook gebruikt door de login-pagina, die Bootstrap-achtige klassenamen
   gebruikt zonder dat Bootstrap geladen wordt — daarom worden die klassen
   hier ook expliciet ondersteund: .form-control, .form-label, .alert,
   .alert-danger, en de utility-klassen .mb-3 / .mb-4 / .py-5 / .w-100 / .h3)
   ------------------------------------------------------------------------- */
label,
.form-label {
    display: block;
    margin-bottom: var(--space-2);
    font-weight: 600;
    font-size: 0.9rem;
    color: var(--color-text);
}

input[type="text"],
input[type="email"],
input[type="password"],
input[type="search"],
input[type="tel"],
input[type="number"],
input[type="date"],
input[type="url"],
textarea,
select,
.form-control {
    display: block;
    width: 100%;
    padding: 0.65rem 0.9rem;
    font-family: var(--font-body);
    font-size: 0.95rem;
    color: var(--color-text);
    background: color-mix(in srgb, white 8%, var(--color-canvas));
    border: 1px solid var(--input-border);
    border-radius: var(--radius-md);
    transition: border-color var(--transition), box-shadow var(--transition);
}

input:focus,
textarea:focus,
select:focus,
.form-control:focus {
    outline: none;
    border-color: var(--color-primary);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 30%, transparent);
}

textarea {
    min-height: 130px;
    resize: vertical;
}

::placeholder {
    color: var(--color-muted);
    opacity: 1;
}

.form-group,
.mb-3 {
    margin-bottom: var(--space-4);
}

.mb-4 {
    margin-bottom: var(--space-5);
}

.py-5 {
    padding-top: var(--space-8);
    padding-bottom: var(--space-8);
}

.w-100 {
    width: 100%;
}

.h3,
h3.h3 {
    font-family: var(--font-heading);
    font-size: 1.25rem;
    font-weight: 600;
}

.alert {
    padding: var(--space-4) var(--space-5);
    border-radius: var(--radius-md);
    border: 1px solid transparent;
    font-size: 0.92rem;
    margin-bottom: var(--space-4);
}

.alert-danger {
    background: color-mix(in srgb, var(--feather-red-real) 14%, var(--color-canvas));
    color: var(--feather-red-real);
    border-color: color-mix(in srgb, var(--feather-red-real) 35%, transparent);
}

.alert-success {
    background: color-mix(in srgb, var(--feather-cyan-real) 14%, var(--color-canvas));
    color: var(--feather-cyan-real);
    border-color: color-mix(in srgb, var(--feather-cyan-real) 35%, transparent);
}

/* -------------------------------------------------------------------------
   11. TABELLEN — V4: leesbaar op donkere achtergrond
   ------------------------------------------------------------------------- */
table {
    width: 100%;
    min-width: 480px;
    border-collapse: collapse;
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    border-radius: var(--radius-md);
    overflow: hidden;
}

/* Horizontaal scrollbaar op smalle schermen zonder de template-structuur
   te moeten aanpassen (moderne :has()-selector, degradeert veilig). */
.container:has(> table) {
    overflow-x: auto;
}

table th,
table td {
    text-align: left;
    padding: var(--space-3) var(--space-4);
    border-bottom: 1px solid var(--glass-border);
}

table th {
    /* --color-text (donker) op --color-canvas-elevated-2 (effen grijstint):
       ruim boven AA — een kopTEKST in een feather-kleur haalt hier
       onvoldoende contrast, dus bewust neutrale donkere tekst, net als in
       het V4-donkere-thema al de correcte keuze was. */
    background: var(--color-canvas-elevated-2);
    color: var(--color-text);
    font-family: var(--font-heading);
    font-weight: 600;
    font-size: 0.85rem;
    letter-spacing: 0.02em;
    text-transform: uppercase;
}

table tbody tr:hover {
    background: var(--glass-bg);
}

table tbody tr:last-child td {
    border-bottom: none;
}

/* -------------------------------------------------------------------------
   12. SPONSORS
   ------------------------------------------------------------------------- */
.sponsors {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-6);
    align-items: center;
    justify-content: center;
}

/* Sponsorlogo's hebben doorgaans een ondoorzichtige witte achtergrond — op
   de lichte canvas smelt een puur witte "kaart" daar nu bijna in weg, dus
   een dunne rand + schaduw geven de logo's nog steeds een duidelijk
   afgebakend, premium plaatje i.p.v. los rondzwevende beeldjes. */
.sponsors a,
.sponsors > img {
    display: inline-flex;
    background: var(--color-canvas-elevated);
    border: 1px solid var(--glass-border);
    border-radius: var(--radius-md);
    padding: var(--space-3) var(--space-5);
    box-shadow: var(--shadow-sm);
    transition: box-shadow var(--transition), transform var(--transition);
}

.sponsors a:hover,
.sponsors > img:hover {
    box-shadow: var(--shadow-md);
    transform: translateY(-2px);
}

.sponsors img {
    max-height: 48px;
    width: auto;
    filter: none;
    opacity: 1;
}

/* -------------------------------------------------------------------------
   13. FOTOGALERIJ
   ------------------------------------------------------------------------- */
.photo-gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: var(--space-3);
}

.photo-gallery img {
    border-radius: var(--radius-md);
    aspect-ratio: 4 / 3;
    object-fit: cover;
    width: 100%;
    transition: transform var(--transition), box-shadow var(--transition);
    box-shadow: var(--shadow-sm);
}

.photo-gallery img:hover {
    transform: scale(1.02);
    box-shadow: var(--shadow-md);
}

/* -------------------------------------------------------------------------
   13b. LIGHTBOX — vergrote fotoweergave (assets/lightbox.js voegt deze
   overlay eenmalig toe aan <body>; werkt op elke pagina met .photo-trigger-
   knoppen, momenteel enkel de fotogalerij).
   ------------------------------------------------------------------------- */
.lightbox-overlay {
    position: fixed;
    inset: 0;
    background: rgba(5, 7, 20, 0.92);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--space-6);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--transition), visibility var(--transition);
    z-index: 2000;
}

.lightbox-overlay.is-open {
    opacity: 1;
    visibility: visible;
}

.lightbox-figure {
    margin: 0;
    max-width: min(1100px, 92vw);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: var(--space-3);
}

.lightbox-image {
    max-width: 100%;
    max-height: 78vh;
    width: auto;
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-lg);
}

.lightbox-caption {
    color: rgba(255, 255, 255, 0.85);
    font-size: 0.92rem;
    text-align: center;
}

.lightbox-close,
.lightbox-prev,
.lightbox-next {
    /* Hardgecodeerd (i.p.v. de gedeelde --glass-*-tokens, die nu
       licht-thema-tinten zijn): de lightbox-overlay blijft bewust een
       donkere volledig-scherm-achtergrond (universele fotokijker-conventie,
       los van het sitethema), dus deze knoppen hebben nog steeds een
       lichte glasrand/-vulling nodig. */
    position: absolute;
    background: rgba(255, 255, 255, 0.1);
    border: 1px solid rgba(255, 255, 255, 0.26);
    backdrop-filter: blur(var(--glass-blur));
    -webkit-backdrop-filter: blur(var(--glass-blur));
    color: #fff;
    border-radius: 50%;
    width: 44px;
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.5rem;
    line-height: 1;
    cursor: pointer;
    transition: background var(--transition);
}

.lightbox-close:hover,
.lightbox-prev:hover,
.lightbox-next:hover {
    background: rgba(255, 255, 255, 0.26);
}

.lightbox-close {
    top: var(--space-5);
    right: var(--space-5);
}

.lightbox-prev {
    left: var(--space-5);
    top: 50%;
    transform: translateY(-50%);
}

.lightbox-next {
    right: var(--space-5);
    top: 50%;
    transform: translateY(-50%);
}

@media (max-width: 640px) {
    .lightbox-close {
        top: var(--space-3);
        right: var(--space-3);
        width: 38px;
        height: 38px;
        font-size: 1.2rem;
    }

    .lightbox-prev {
        left: var(--space-2);
        width: 38px;
        height: 38px;
        font-size: 1.2rem;
    }

    .lightbox-next {
        right: var(--space-2);
        width: 38px;
        height: 38px;
        font-size: 1.2rem;
    }
}

/* -------------------------------------------------------------------------
   14. PAGINA-INHOUD (CMS-pagina's, nieuwsdetail, ...) — V4: glaskaart
   ------------------------------------------------------------------------- */
.page-content {
    background:
        linear-gradient(var(--glass-bg), var(--glass-bg)) padding-box,
        var(--gradient-border) border-box;
    border: 1px solid transparent;
    border-radius: var(--radius-lg);
    padding: var(--space-6);
    backdrop-filter: blur(var(--glass-blur));
    -webkit-backdrop-filter: blur(var(--glass-blur));
    box-shadow: var(--shadow-sm);
}

.page-content h1,
.page-content h2,
.page-content h3 {
    color: var(--color-text);
}

.page-content h2 {
    color: var(--feather-cyan-real);
}

.page-content > *:last-child {
    margin-bottom: 0;
}

.page-content .date {
    color: var(--color-muted);
    font-size: 0.85rem;
    font-weight: 500;
    margin-bottom: var(--space-2);
}

/* -------------------------------------------------------------------------
   15. BREADCRUMB
   ------------------------------------------------------------------------- */
.breadcrumb {
    color: var(--color-muted);
    font-size: 0.88rem;
    margin-bottom: var(--space-5);
}

.breadcrumb a {
    color: var(--color-muted);
}

.breadcrumb a:hover {
    color: var(--color-primary);
}

/* -------------------------------------------------------------------------
   16. FOOTER — V4: donker/elevated panel i.p.v. effen navy
   ------------------------------------------------------------------------- */
.site-footer {
    background: var(--color-canvas-elevated-2);
    color: var(--color-muted);
    padding: var(--space-8) 0 var(--space-5);
    margin-top: var(--space-7);
    border-top: 4px solid transparent;
    border-image: var(--gradient-shuttle) 1;
}

.footer-brand {
    max-width: 32rem;
}

.site-footer h4 {
    color: var(--color-text);
    margin: 0 0 var(--space-3);
    font-size: 1rem;
    letter-spacing: 0.02em;
}

.site-footer p {
    margin: 0 0 var(--space-2);
    font-size: 0.92rem;
    line-height: 1.6;
}

.site-footer a {
    color: var(--color-muted);
    font-size: 0.92rem;
}

.site-footer a:hover {
    /* De echte --color-accent (feather-orange) haalt nu al 8.97:1 op de
       donkere canvas — de vorige "-tint"-workaround is niet langer nodig. */
    color: var(--color-accent);
    text-decoration: none;
}

.footer-social {
    display: flex;
    gap: var(--space-3);
    margin-top: var(--space-2);
}

.footer-social a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    color: var(--color-text);
    transition: background var(--transition), color var(--transition), transform var(--transition), box-shadow var(--transition);
}

.footer-social a:hover {
    background: var(--gradient-primary);
    border-color: transparent;
    color: #fff;
    transform: translateY(-2px);
    box-shadow: 0 6px 18px color-mix(in srgb, var(--feather-cyan) 45%, transparent);
}

.footer-social svg {
    width: 18px;
    height: 18px;
    fill: currentColor;
}

.site-footer .copy {
    text-align: center;
    margin-top: var(--space-6);
    padding-top: var(--space-5);
    border-top: 1px solid var(--glass-border);
    color: var(--color-muted);
    font-size: 0.85rem;
}

/* Federatielogo's ("Onderdeel van") — ingesloten via SponsorController's
   footerFederations()-actie, dus op elke pagina zichtbaar, niet enkel op
   de Sponsors-pagina. Lichte tegels (logo's zijn gemaakt voor een lichte
   achtergrond), zelfde formule als de Sponsors-pagina. */
.footer-federations {
    margin-top: var(--space-6);
    padding-top: var(--space-6);
    border-top: 1px solid var(--glass-border);
}

.footer-federations-label {
    margin: 0 0 var(--space-4);
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--color-muted);
}

.footer-federations-grid {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
}

.footer-federation-logo {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 84px;
    height: 52px;
    padding: var(--space-2);
    border-radius: var(--radius-md);
    background: #fdfdfd;
}

.footer-federation-logo img {
    max-width: 100%;
    max-height: 100%;
    object-fit: contain;
}

/* -------------------------------------------------------------------------
   17. RESPONSIVE FEINSTELLUNGEN (extra controlepunten: 375 / 768 / 1200px)
   ------------------------------------------------------------------------- */
@media (max-width: 480px) {
    .section {
        padding: var(--space-6) 0;
    }

    .hero {
        padding: var(--space-7) 0;
    }

    .page-content,
    .card {
        padding: var(--space-4);
    }
}

@media (min-width: 1200px) {
    .container {
        padding: 0 var(--space-6);
    }
}
