/* ============================================================================
   shop.css — paginaspecifieke stijl voor home, collectie en product.
   EIGENDOM VAN DE SHOP-AGENT. Design-tokens komen uit stijl.css (fundament).
   ========================================================================== */

/* ----- Hero (home) --------------------------------------------------------
   Was: één grote foto als CSS-achtergrond met background-size: cover. Die
   sneed de lifestyle-foto (1024x1024) in een banier van 1200x400 voor twee
   derde weg, laadde het onverkleinde origineel van ~1,5 MB en kon geen
   fetchpriority krijgen. Nu: tekst links, de foto rechts in een beeldkader —
   volledig in beeld, met srcset en als enige eager geladen foto van de pagina. */
/* De hero staat op de sfeerfoto uit public/sfeer/. Die foto heeft het model
   rechts en open water links — precies de compositie voor tekst aan de
   linkerkant. background-position 70% houdt het model in beeld terwijl het
   vlak links rustig genoeg blijft om wit op te lezen.
   Drie maten, gekozen op schermbreedte: een telefoon haalt 89 kB in plaats van
   366 kB. De navy achtergrondkleur blijft eronder staan, zodat de tekst ook
   leesbaar is in het moment dat de foto nog laadt. */
.held {
  position: relative;
  background-color: var(--kleur-navy);
  background-image: url("/sfeer/hero-900.jpg");
  background-size: cover;
  background-position: 70% center;
  background-repeat: no-repeat;
  color: var(--kleur-wit);
  overflow: hidden;
}
@media (min-width: 700px) {
  .held { background-image: url("/sfeer/hero-1400.jpg"); }
}
@media (min-width: 1300px) {
  .held { background-image: url("/sfeer/hero-2000.jpg"); }
}
.held::before {
  content: "";
  position: absolute;
  inset: 0;
  /* Leesbaarheidssluier. Op smalle schermen staat de tekst ÓP de foto, dus
     daar dekt hij van onderaf flink af; vanaf tablet loopt hij van links naar
     rechts weg zodat het model vrij in beeld blijft staan. */
  background:
    linear-gradient(180deg, rgba(16, 36, 62, 0.55) 0%, rgba(16, 36, 62, 0.8) 100%);
}
@media (min-width: 700px) {
  .held::before {
    background:
      linear-gradient(90deg,
        rgba(16, 36, 62, 0.92) 0%,
        rgba(16, 36, 62, 0.78) 34%,
        rgba(16, 36, 62, 0.32) 62%,
        rgba(16, 36, 62, 0.06) 100%);
  }
}
.held__binnen {
  position: relative;
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.75rem;
  align-items: center;
  padding-block: clamp(2.5rem, 9vh, 4.5rem);
}
@media (min-width: 900px) {
  .held__binnen {
    /* Eén kolom tekst op de linkerhelft; de rechterhelft blijft leeg zodat het
       model op de achtergrondfoto vrij in beeld staat. */
    grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
    min-height: 26rem;
    gap: 3rem;
    padding-block: clamp(3.5rem, 11vh, 5.5rem);
  }
}
.held__tekst { max-width: 34rem; }
/* Het herokader: vierkant, want de lifestyle-foto's zijn 1024x1024. Staat er
   ooit een staande of liggende foto in, dan valt die gewoon binnen het kader
   in plaats van eruit. */
.held__beeld {
  max-width: 20rem;
  margin-inline: auto;
  padding: clamp(0.6rem, 2vw, 1rem);
  box-shadow: 0 14px 34px rgba(0, 0, 0, 0.28);
}
@media (min-width: 900px) {
  .held__beeld { max-width: 26rem; }
}
.held__tekst h1 {
  color: var(--kleur-wit);
  font-size: clamp(2rem, 5vw, 3.1rem);
}
.held__sub {
  font-size: 1.15rem;
  margin-bottom: 1rem;
}
/* Bezorgregel onder de hero-subtekst (DESIGN-SPEC §4.2). Voorraadgroen op de
   donkere hero is niet leesbaar, dus zetten we hem als pil op Zwembad-licht:
   #1E7B33 op #E4F6F9 haalt ruim AA. */
.held__bezorg {
  display: inline-block;
  background: var(--kleur-zwembad);
  color: var(--kleur-groen);
  font-weight: 700;
  font-size: 0.95rem;
  line-height: 1.35;
  padding: 0.35rem 0.9rem;
  border-radius: var(--radius-knop);
  margin-bottom: 1.5rem;
}
.held__knoppen {
  display: flex;
  gap: 0.75rem;
  flex-wrap: wrap;
}
.held .knop--secundair { border-color: var(--kleur-wit); color: var(--kleur-wit); }
.held .knop--secundair:hover { background: var(--kleur-wit); color: var(--kleur-navy); }

/* ----- Categorietegels (home) --------------------------------------------- */
.tegel-raster {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1rem;
  margin-top: 1rem;
}
@media (min-width: 700px) {
  .tegel-raster { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.25rem; }
}
@media (min-width: 980px) {
  /* Drie tegels breed, dus twee nette rijen van drie bij zes categorieën.
     Het waren er zes op een rij, en dan is een tegel zo smal dat "Waterhangmatten"
     er niet meer in past en de browser het woord middenin afbreekt. */
  .tegel-raster { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.5rem; }
}
/* Het beeldvak van een tegel zit strak in de kaart (dus zonder eigen radius)
   en toont de foto volledig — ook de liggende 3:2-foto van de waterballonnen. */
.tegel__beeld { padding: 0.4rem; }
.tegel__regel {
  font-size: 0.88rem;
  opacity: 0.8;
  margin: 0;
}

/* ----- Bestsellers (home) -------------------------------------------------
   Gelijke kaarthoogtes ondanks verschillende beeldverhoudingen: het raster
   rekt elke kaart tot dezelfde hoogte, de kaart is een flex-kolom en het
   beeldvak heeft een vaste vierkante verhouding (zie .pkaart__kader verderop
   in dit bestand). De foto staat daarbinnen CONTAIN, dus een liggende of
   staande foto verandert niets aan het raster. */
.sectie--aqua .kaart { background: var(--kleur-wit); }
.kaart-raster > .kaart { height: 100%; }
.bestsellers__meer { margin-top: 1.75rem; }
.kaart-raster { margin-top: 1rem; }

/* ----- Verhaal-sectie (home) ---------------------------------------------- */
.verhaal {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.75rem;
  align-items: center;
}
@media (min-width: 820px) {
  .verhaal { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 3rem; }
}
/* Verhaalbeeld: beeldkader met wat lucht eromheen, foto volledig in beeld. */
.verhaal__foto {
  box-shadow: var(--schaduw-kaart);
  max-width: 32rem;
  margin-inline: auto;
}
.verhaal__tekst p { max-width: 32rem; }

/* ----- Reviews (home) ----------------------------------------------------- */
.review-raster {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
  margin-top: 1rem;
}
@media (min-width: 700px) {
  .review-raster { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (min-width: 980px) {
  .review-raster { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}
.review {
  background: var(--kleur-zwembad);
  border-radius: var(--radius-kaart);
  padding: 1.1rem 1.15rem 1.25rem;
  display: flex;
  flex-direction: column;
}
.review__sterren {
  font-size: 1.05rem;
  letter-spacing: 0.1em;
  margin-bottom: 0.5rem;
  line-height: 1;
}
.ster { color: rgba(16, 36, 62, 0.2); }
.ster--vol {
  color: var(--kleur-geel);
  text-shadow: 0 0 1px rgba(16, 36, 62, 0.35);
}
.review__tekst {
  margin: 0 0 0.75rem;
  font-size: 0.95rem;
}
.review__naam {
  margin-top: auto;
  font-weight: 700;
  font-size: 0.88rem;
  opacity: 0.85;
}

/* ----- FAQ-accordeon (home) ----------------------------------------------- */
.faq-lijst { display: grid; gap: 0.75rem; margin-top: 1rem; }
.faq {
  background: var(--kleur-wit);
  border-radius: var(--radius-kaart);
  box-shadow: var(--schaduw-kaart);
  padding: 0;
  overflow: hidden;
}
.faq summary {
  cursor: pointer;
  font-family: var(--font-kop);
  font-weight: 600;
  padding: 0.9rem 1.15rem;
  list-style: none;
  position: relative;
  padding-right: 2.5rem;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary:focus-visible {
  outline: 3px solid var(--kleur-aqua);
  outline-offset: -3px;
  border-radius: var(--radius-kaart);
}
.faq summary::after {
  content: "+";
  position: absolute;
  right: 1.1rem;
  top: 50%;
  transform: translateY(-50%);
  font-size: 1.3rem;
  color: var(--kleur-aqua);
  transition: transform 120ms ease;
}
.faq[open] summary::after { content: "–"; }
.faq p { margin: 0; padding: 0 1.15rem 1rem; }

/* ----- Slot-CTA (home) ---------------------------------------------------- */
.slot-cta { padding-block: 4rem; }
.slot-cta h2 { color: var(--kleur-wit); }
.slot-cta__knop { margin: 1.25rem 0 0; }
/* De belofte onder de knop: op navy wordt Voorraadgroen onleesbaar, dus wit
   met wat rust eromheen. De voorwaarde staat in dezelfde regel. */
.slot-cta__regel {
  margin: 0.85rem 0 0;
  font-size: 0.95rem;
  color: var(--kleur-wit);
  opacity: 0.9;
}

/* ----- Collectiepagina ---------------------------------------------------- */
.collectie-kop { padding-bottom: 0.5rem; }
.collectie-kop__beschrijving {
  max-width: 40rem;
  margin-bottom: 0.4rem;
}
.collectie-kop__bezorg { margin-bottom: 0; font-size: 0.95rem; }
.collectie { padding-bottom: var(--sectie-ruimte); }
.collectie__balk {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.75rem 1rem;
  margin-bottom: 1.25rem;
}
.kleur-filter {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}
.kleur-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.35rem 0.85rem;
  border: 2px solid rgba(16, 36, 62, 0.2);
  border-radius: var(--radius-knop);
  color: var(--kleur-navy);
  text-decoration: none;
  font-weight: 700;
  font-size: 0.85rem;
  background: var(--kleur-wit);
}
.kleur-chip:hover { border-color: var(--kleur-aqua); }
.kleur-chip--actief {
  border-color: var(--kleur-aqua);
  background: var(--kleur-aqua);
  color: var(--kleur-wit);
}
.kleur-chip__bol {
  width: 0.85rem;
  height: 0.85rem;
  border-radius: 50%;
  border: 1px solid rgba(16, 36, 62, 0.3);
  flex: none;
}
.sorteer {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin-left: auto;
}
.sorteer__label { font-weight: 700; font-size: 0.9rem; }
.sorteer__select {
  /* 0,45 alfa: de rand van een keuzelijst moet 3:1 halen (WCAG 1.4.11).
     Met 0,25 was hij nauwelijks te zien. */
  padding: 0.45rem 0.7rem;
  border: 2px solid rgba(16, 36, 62, 0.45);
  border-radius: var(--radius-veld);
  background: var(--kleur-wit);
  color: var(--kleur-navy);
}
/* Sorteren gebeurt met het toetsenbord net zo vaak als met de muis; zonder
   deze regel bleef het bij de standaard browserring. */
.sorteer__select:focus-visible {
  outline: none;
  border-color: var(--kleur-aqua);
  box-shadow: 0 0 0 3px rgba(14, 124, 138, 0.2);
}
.collectie__leeg { padding-block: 2rem; }

/* ----- DE productkaart (.pkaart) ------------------------------------------
   Eén kaart voor de hele winkel: home, /alles, elke collectie, de
   zoekresultaten en de twee suggestieblokken onder een productpagina. De
   markup staat in views/partials/shop-productkaart.ejs; deze stijl hoort in
   shop.css omdat al die pagina's dit bestand laden.
   Vast vierkant kader met de foto CONTAIN erin: het raster blijft strak en er
   verdwijnt geen stukje foto — ook niet bij de staande foto's (1024x1536). */
.pkaart { position: relative; }
.pkaart__kader {
  position: relative;
  /* ÉÉN rastercel waarin beide foto's op elkaar liggen — hetzelfde patroon als
     .beeldkader in stijl.css. Zie de uitleg bij .pkaart__foto--hover: dit is
     precies waarom de hoverfoto niet meer kán verspringen. */
  display: grid;
  aspect-ratio: 1 / 1;
  /* DEZE DRIE REGELS HOREN BIJ ELKAAR — aspect-ratio alleen maakt het kader
     níét vierkant. Twee dingen kunnen het vierkant kapotmaken, en ze vragen
     allebei hun eigen regel:

     1. overflow: hidden. Bij `height: auto` mag de inhoud een box altijd hoger
        duwen dan zijn verhouding voorschrijft; die ondergrens vervalt pas als
        overflow niet meer `visible` is. Zonder deze regel rekte één staande
        foto (1024x1280) het "vierkant" op tot 200x245. En omdat de HOVERFOTO
        net zo goed in deze cel staat, kon een staande tweede foto een kaart met
        een keurig vierkante eerste foto alsnog scheeftrekken — gemeten op
        /alles: 12 van de 32 kaarten stonden zo te hoog. Dat zijn de ongelijke
        kaarten waar de eigenaar over viel.

     2. grid-template-rows: minmax(0, 1fr). Met alleen regel 1 wordt het kader
        wel vierkant, maar de RIJ blijft zich naar de hoogste foto voegen (226px
        in een vak van 180,8px), en dan snijdt overflow: hidden de foto's boven
        en onder af — precies wat object-fit: contain moest voorkomen.
        `minmax(0, 1fr)` haalt de max-content-ondergrens van de rij weg en laat
        hem exact de beschikbare hoogte vullen. De foto's krijgen daarmee het
        hele vak en geen pixel meer.

     Meet je hier iets aan, meet dan met een STAANDE eerste foto én met een
     staande tweede foto: alleen die twee gevallen laten het verschil zien. */
  overflow: hidden;
  grid-template-rows: minmax(0, 1fr);
  /* Rustige achtergrond uit de tokens + ademruimte, zodat een staande foto
     midden in het kader hangt in plaats van tot aan de randen te worden
     opgerekt of afgesneden. */
  background: var(--kleur-wit);
  padding: 0.6rem;
}
/* Basisfoto én hoverfoto delen dezelfde cel en dus exact hetzelfde vierkant:
   de contentbox van het kader (kader - 2x 0,6rem binnenmarge). */
.pkaart__foto {
  grid-area: 1 / 1;
  width: 100%;
  height: 100%;
  /* KAARTEN vullen hun vierkant (cover) zodat het raster strak is: geen kaart
     met witte balken naast een kaart die vol staat. Dat is een bewuste
     uitzondering op de rest van de site — de PRODUCTPAGINA en de
     vergrootweergave houden contain, want daar mag niets wegvallen. */
  object-fit: cover;
  object-position: center;
  /* De cross-fade: basis- en hoverfoto regelen allebei hun eigen opacity. */
  transition: opacity 160ms ease;
}
/* Staande foto's (sfeerbeelden met een model) hebben hun onderwerp zelden
   onderin. Het venster iets omhoog schuiven houdt hoofden in beeld in plaats
   van ze eraf te snijden; liggend en vierkant blijven gewoon gecentreerd. */
.pkaart__foto--staand { object-position: center 38%; }
/* WAAROM DIT MET GRID GAAT EN NIET MEER MET position: absolute.
   Hier stond eerder `position: absolute; inset: 0.6rem; width: auto; height: auto`.
   Voor een absoluut gepositioneerd VERVANGEN element — en een <img> is dat —
   betekent `width: auto` niet "rek tot de tegenoverliggende inset" maar "neem
   je INTRINSIEKE breedte". De rechter- en onder-inset werden dus genegeerd en
   de hoverfoto rende op zijn eigen formaat (tot 1536 px) buiten het vierkante
   kader: hoverfoto's waren onderling niet gelijk, versprongen bij het zweven
   en vielen over de buurkaart heen.
   Als rastercel erft deze foto dezelfde breedte, hoogte, object-fit en
   object-position als .pkaart__foto hierboven — pixel op pixel, of de foto nu
   staand (1024x1536), liggend (1536x1024) of vierkant is. Er valt niets meer
   handmatig gelijk te houden. Alleen de opacity verschilt. */
.pkaart__foto--hover { opacity: 0; }
/* ECHT wisselen, niet stapelen. Hier ging het eerder mis: de hoverfoto kwam
   erbij, maar de basisfoto bleef staan. Omdat een sfeerfoto het vierkant niet
   volledig hoeft te vullen, schemerde de productfoto eromheen doorheen — bij
   uitverkochte kaarten nog het duidelijkst, want daar stond de basisfoto bij
   hover expliciet op 0,9. Nu faden ze tegen elkaar in: precies één foto in
   beeld, op elk moment. */
.pkaart:hover .pkaart__foto--hover,
.pkaart:focus-visible .pkaart__foto--hover { opacity: 1; }
.pkaart:hover .pkaart__foto--basis,
.pkaart:focus-visible .pkaart__foto--basis { opacity: 0; }
.pkaart__badge {
  position: absolute;
  top: 0.6rem;
  left: 0.6rem;
  z-index: 1;
}
/* Uitverkocht: ingetogen gedempt beeld, tekst en prijs blijven op volle
   sterkte leesbaar. De badge zegt het al met zoveel woorden.
   :not() houdt de hover-foto erbuiten: die stuurt zijn eigen opacity.
   De demping loopt via FILTER, niet via opacity: opacity is hier al bezet voor
   de cross-fade tussen basis- en hoverfoto. Zouden we die twee door elkaar
   gebruiken, dan wint de demping van de fade en staan beide foto's weer
   tegelijk in beeld — precies de dubbele belichting die hierboven is opgelost. */
.pkaart--uit .pkaart__kader { background: var(--kleur-zwembad); }
.pkaart--uit .pkaart__foto { filter: saturate(0.55) opacity(0.75); }
.pkaart--uit:hover .pkaart__foto { filter: saturate(0.8) opacity(0.92); }

/* ----- Uitrekbare link + winkelwagenknop op de kaart -----------------------
   De kaart is een <article> en niet één grote <a>, want er zit een formulier
   in en een link mag geen formulier bevatten. Deze link rekt zich met een
   onzichtbare ::after over de hele kaart uit, zodat je nog steeds overal kunt
   klikken om naar het product te gaan. */
.pkaart__link { display: block; }
.pkaart__link::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 1;
}
/* De knop ligt bovenop die laag en vangt dus zijn eigen klik af. */
.pkaart__wagen { position: relative; z-index: 2; margin-top: 0.75rem; }
.pkaart__knop { width: 100%; }

/* Een rustigere knop dan de oranje hoofdknop: op een lijst met twaalf kaarten
   zou twaalf keer oranje het scherm laten schreeuwen en zou de bezoeker niet
   meer zien waar hij heen moet. Deze is navy en vult zich pas bij aanwijzen. */
.knop--wagen {
  padding: 0.55rem 0.9rem;
  font-size: 0.95rem;
  background: transparent;
  color: var(--kleur-navy);
  border: 2px solid var(--kleur-navy);
}
.knop--wagen:hover,
.knop--wagen:focus-visible {
  background: var(--kleur-navy);
  color: var(--kleur-wit);
}
/* Even bezig: de knop blijft even breed zodat de kaart niet verspringt. */
.pkaart__knop[aria-busy="true"] { opacity: 0.6; cursor: progress; }
.pkaart__knop.is-gelukt {
  background: var(--kleur-groen);
  border-color: var(--kleur-groen);
  color: var(--kleur-wit);
}

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

/* ----- Tussenkop boven de uitverkochte kaarten ---------------------------- */
/* Zelfde maatvoering als .zoek-groepkop op de zoekpagina: de bezoeker ziet op
   beide plekken dezelfde streep met dezelfde kop, dus dezelfde belofte
   ("wat klaarligt staat boven, wat op is staat eronder"). Wijzig je hier iets,
   wijzig het dan ook daar. */
.raster__tussenkop {
  grid-column: 1 / -1;
  font-family: var(--font-kop);
  font-size: 1.15rem;
  font-weight: 600;
  margin: 1.5rem 0 0;
  padding-top: 1.25rem;
  border-top: 1px solid rgba(16, 36, 62, 0.12);
  color: var(--kleur-navy);
}
.raster__tussenkop-uitleg {
  grid-column: 1 / -1;
  margin: 0.15rem 0 0.25rem;
  font-size: 0.9rem;
  opacity: 0.75;
}

/* ----- Chips: actieve filters ---------------------------------------------
   Staan op de collectiepagina én op de zoekpagina (daar naast de zoekterm),
   dus ook deze horen in het gedeelde bestand. */
.chips { margin-bottom: 1rem; }
.chips__lijst {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.5rem;
}
.chip {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.3rem 0.75rem;
  border: 2px solid var(--kleur-aqua);
  border-radius: var(--radius-knop);
  background: var(--kleur-wit);
  color: var(--kleur-navy);
  text-decoration: none;
  font-weight: 700;
  font-size: 0.85rem;
}
.chip:hover { background: var(--kleur-zwembad); }
.chip:focus-visible { outline: 3px solid var(--kleur-aqua); outline-offset: 2px; }
.chip__bol {
  width: 0.8rem;
  height: 0.8rem;
  border-radius: 50%;
  border: 1px solid rgba(16, 36, 62, 0.3);
  flex: none;
}
.chip__kruis { font-size: 1.05rem; line-height: 1; opacity: 0.65; }
.chip:hover .chip__kruis { opacity: 1; }
.chips__wis { font-size: 0.85rem; font-weight: 700; }

/* ----- Productpagina ------------------------------------------------------ */
.product__boven {
  display: grid;
  grid-template-columns: 1fr;
  gap: 2rem;
}
@media (min-width: 900px) {
  .product__boven { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 3rem; }
}

/* Galerij ------------------------------------------------------------------
   VERHOUDING VAN HET HOOFDKADER: 1 / 1. Bewust gekozen, want:
   - 29 van de 32 producten hebben een vierkante hoofdfoto (1024x1024); die
     vult dit kader exact, zonder loze randen.
   - een staande 2:3-foto en een liggende 3:2-foto verliezen in een vierkant
     kader allebei precies evenveel: ze pakken 66,7% van de kaderbreedte
     respectievelijk -hoogte. Het kader bevoordeelt dus geen van beide, en dat
     is precies wat je wilt in een galerij waar 79 staande en 34 liggende
     foto's door elkaar staan.
   - de plek in de tweekolomsindeling blijft gelijk voor élk product, dus geen
     springende pagina bij het wisselen van foto.
   De foto staat er CONTAIN in, op een rustig zwembad-aqua vlak met binnenmarge:
   er wordt niets meer afgesneden. */
.galerij__kader {
  box-shadow: var(--schaduw-kaart);
  padding: clamp(0.75rem, 2.5vw, 1.5rem);
}
.galerij__thumbs {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-top: 0.75rem;
}
/* Thumbnail: klein vierkant kader, foto contain, actieve rand in aqua. */
.galerij__thumb {
  display: grid;
  width: 4.5rem;
  height: 4.5rem;
  padding: 0.25rem;
  border: 2px solid rgba(16, 36, 62, 0.15);
  border-radius: 10px;
  overflow: hidden;
  background: var(--kleur-wit);
  cursor: pointer;
}
.galerij__thumb img {
  grid-area: 1 / 1;
  width: 100%;
  height: 100%;
  object-fit: contain;
}
.galerij__thumb:hover { border-color: rgba(14, 124, 138, 0.5); }
.galerij__thumb--actief,
.galerij__thumb[aria-current="true"] {
  border-color: var(--kleur-aqua);
  box-shadow: 0 0 0 1px var(--kleur-aqua);
}
.galerij__thumb:focus-visible { outline: 3px solid var(--kleur-aqua); outline-offset: 1px; }

/* De hoofdfoto is een echte link naar de zwaarste variant (zie product.ejs):
   zonder JavaScript opent die de foto op ware grootte, mét JavaScript vangt
   public/js/vergrootglas.js de klik af. De link is het rastercel-item van
   .beeldkader, dus hij moet zelf de hele cel vullen — anders zou de foto
   binnenin krimpen. */
.galerij__vergroot {
  grid-area: 1 / 1;
  display: block;
  position: relative;
  width: 100%;
  height: 100%;
  cursor: zoom-in;
  border-radius: calc(var(--radius-kaart) - 0.5rem);
}
.galerij__vergroot:focus-visible { outline: 3px solid var(--kleur-aqua); outline-offset: 2px; }
/* Het loepje: alleen een hint dat er meer te zien is. Rustig aanwezig, en pas
   bij zweven of toetsenbordfocus helemaal vol. */
.galerij__loep {
  position: absolute;
  right: 0;
  bottom: 0;
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  padding: 0.35rem 0.8rem;
  border-radius: var(--radius-knop);
  background: rgba(255, 255, 255, 0.92);
  color: var(--kleur-navy);
  font-size: 0.82rem;
  font-weight: 700;
  line-height: 1;
  box-shadow: var(--schaduw-kaart);
  opacity: 0.85;
  transition: opacity 140ms ease;
}
.galerij__vergroot:hover .galerij__loep,
.galerij__vergroot:focus-visible .galerij__loep { opacity: 1; }
/* Op smalle schermen is het icoon genoeg; het woord kost daar te veel ruimte. */
@media (max-width: 419px) {
  .galerij__loep-tekst { display: none; }
  .galerij__loep { padding: 0.4rem; }
}

/* ----- Vergrote weergave van de galerij (public/js/vergrootglas.js) --------
   De dialoog wordt pas bij de eerste klik opgebouwd en daarna hergebruikt.
   [hidden] moet hier expliciet staan: .vergroot zet display op flex en zou het
   browserstandaard `display: none` van het hidden-attribuut anders overrulen. */
.vergroot {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(0.5rem, 2vw, 1.25rem);
  /* Gedempt navy: de foto is het onderwerp, de pagina eronder verdwijnt. */
  background: rgba(16, 36, 62, 0.94);
  animation: vergroot-in 140ms ease;
}
.vergroot[hidden] { display: none; }
@keyframes vergroot-in {
  from { opacity: 0; }
  to { opacity: 1; }
}
.vergroot:focus { outline: none; }
.vergroot__paneel {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
  width: 100%;
  max-width: 1200px;
  height: 100%;
  /* min-height: 0 laat het fotovak in een flexkolom écht krimpen; zonder deze
     regel duwt een grote foto de thumbnailrij van het scherm af. */
  min-height: 0;
}
.vergroot__balk {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  flex: none;
  min-height: 44px;
}
.vergroot__teller {
  margin: 0;
  color: var(--kleur-wit);
  font-weight: 700;
  font-size: 0.95rem;
  font-variant-numeric: tabular-nums;   /* "3 van 8" springt niet bij "10 van 12" */
}
.vergroot__vak {
  position: relative;
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  align-items: center;
  justify-content: center;
}
/* Volledig in beeld, nooit bijgesneden: de foto past zich aan het vak aan en
   houdt zijn eigen verhouding. De zwembad-ondergrond is dezelfde als in de
   galerij, zodat een uitgeknipte productfoto (transparante PNG) er hier net zo
   uitziet als op de pagina eronder. */
.vergroot__foto {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  padding: clamp(0.5rem, 1.5vw, 1rem);
  background: var(--kleur-zwembad);
  border-radius: var(--radius-kaart);
}
.vergroot__knop {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  flex: none;
  padding: 0;
  border: 2px solid transparent;
  border-radius: var(--radius-knop);   /* pil, net als elke knop in de winkel */
  background: rgba(255, 255, 255, 0.94);
  color: var(--kleur-navy);
  font-size: 1.5rem;
  line-height: 1;
  cursor: pointer;
  transition: background 140ms ease, transform 140ms ease;
}
.vergroot__knop:hover { background: var(--kleur-wit); transform: scale(1.06); }
/* Focusring in wit: Diep Aqua haalt op dit navy vlak geen 3:1. */
.vergroot__knop:focus-visible { outline: 3px solid var(--kleur-wit); outline-offset: 3px; }
.vergroot__knop--vorige,
.vergroot__knop--volgende {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}
.vergroot__knop--vorige:hover,
.vergroot__knop--volgende:hover { transform: translateY(-50%) scale(1.06); }
.vergroot__knop--vorige { left: 0; }
.vergroot__knop--volgende { right: 0; }
.vergroot__thumbs {
  display: flex;
  flex: none;
  gap: 0.4rem;
  justify-content: center;
  flex-wrap: nowrap;
  overflow-x: auto;
  padding-bottom: 0.25rem;
}
.vergroot__thumb {
  display: grid;
  width: 3.25rem;
  height: 3.25rem;
  flex: none;
  padding: 0.2rem;
  border: 2px solid rgba(255, 255, 255, 0.35);
  border-radius: 10px;
  background: var(--kleur-wit);
  cursor: pointer;
}
.vergroot__thumb img { grid-area: 1 / 1; width: 100%; height: 100%; object-fit: contain; }
.vergroot__thumb:hover { border-color: rgba(255, 255, 255, 0.7); }
.vergroot__thumb--actief { border-color: var(--kleur-wit); box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.35); }
.vergroot__thumb:focus-visible { outline: 3px solid var(--kleur-wit); outline-offset: 2px; }
/* Is er geen hoogte over, dan gaat de thumbnailrij weg: de foto zelf is
   belangrijker. vergrootglas.js haalt hem dan ook uit de focusvolgorde. */
@media (max-height: 560px) {
  .vergroot__thumbs { display: none; }
}
/* Deze staat bewust ná de regels hierboven: een gelijk-specifieke regel later
   in het bestand wint, dus alleen zó zetten we de beweging echt uit. */
@media (prefers-reduced-motion: reduce) {
  .vergroot { animation: none; }
  .vergroot__knop { transition: none; }
  .vergroot__knop:hover { transform: none; }
  .vergroot__knop--vorige:hover,
  .vergroot__knop--volgende:hover { transform: translateY(-50%); }
  .galerij__loep { transition: none; }
}

/* Info-kolom */
.product__naam { margin-bottom: 0.5rem; }
.product__prijs {
  display: flex;
  align-items: baseline;
  gap: 0.5rem;
  margin-bottom: 0.15rem;
}
.prijs--groot { font-size: 1.6rem; }
.product__microtekst {
  font-size: 0.9rem;
  opacity: 0.8;
  margin-bottom: 0.35rem;
}
.product__microtekst--prijs { opacity: 1; font-weight: 700; }
.voorraadstatus {
  color: var(--kleur-groen);
  font-weight: 700;
  margin: 0.75rem 0 0.1rem;
}
.voorraadstatus--uit { color: var(--kleur-navy); opacity: 0.7; }
/* De 23:59-lijn werkt zichzelf elke 20 seconden bij en wisselt om 15:00 van
   zin. Om te voorkomen dat de pagina daarbij springt:
   - twee regelhoogtes staan altijd gereserveerd, ook als de tekst er nu maar
     één vult (langere/kortere teksten duwen dus niets omlaag);
   - de cijfers krijgen dezelfde breedte, zodat "3 u 9 min" en "3 u 8 min"
     exact evenveel ruimte innemen. */
#bezorg-countdown {
  margin-bottom: 0.6rem;
  min-height: calc(2 * 1.6em);
  font-variant-numeric: tabular-nums;
}

/* Swatches (44px-rondjes, DESIGN-SPEC §5.5) -------------------------------
   Elke swatch draagt drie signalen, zodat niemand op kleur alléén hoeft af te
   gaan (WCAG 1.4.1):
     1. VORM   — een fijne diagonale streep over een uitverkochte kleur;
     2. RAND   — doorgetrokken bij leverbaar, stippellijn bij uitverkocht;
     3. TEKST  — visueel verborgen naam + status ("Roze — uitverkocht"), plus
                 dezelfde tekst als title-tooltip voor de muisgebruiker.
   De demping (minder verzadiging, iets doorzichtiger) is de vierde, subtiele
   laag — nooit de enige. */
.swatches { margin: 0.75rem 0 1rem; }
.swatches__kop { font-weight: 700; margin-bottom: 0.4rem; }
.swatches__lijst {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
}
.swatch {
  display: block;
  position: relative;
  width: 44px;
  height: 44px;
  padding: 2px;                 /* het witte ringetje tussen kleur en rand */
  border-radius: 50%;
  border: 2px solid rgba(16, 36, 62, 0.25);
  background: var(--kleur-wit);
}
.swatch__vlak {
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 50%;
}
a.swatch:hover { border-color: var(--kleur-aqua); }
/* Huidige kleur: donkere rand én een extra ring, zodat "dit is de kleur die je
   nu bekijkt" ook zonder kleurwaarneming te zien is. */
.swatch--actief {
  border-color: var(--kleur-navy);
  box-shadow: 0 0 0 2px var(--kleur-navy);
}
/* Uitverkocht: stippellijn-rand in plaats van de gewone rand, een gedempt
   kleurvlak en een dunne diagonale streep erover. Ingetogen, geen rood. */
.swatch--uit {
  border-style: dashed;
  border-color: rgba(16, 36, 62, 0.45);
}
/* Gedempt, maar niet zó gedempt dat je de kleur niet meer herkent: donkerblauw
   moet donkerblauw blijven, anders help je niemand. */
.swatch--uit .swatch__vlak { filter: saturate(0.55) opacity(0.7); }
/* De streep is een navy haarlijn MET een lichte rand eromheen. Dat lichte
   randje is geen versiering: zonder dat verdween de navy streep volledig in de
   swatch "Donkerblauw" — precies de kleur waar de melding het hardst nodig is.
   Met de dubbele lijn is de streep zichtbaar op elk kleurvlak, ook in
   grijstinten en op een zwart-witprint. */
.swatch--uit::after {
  content: "";
  position: absolute;
  inset: -1px;
  border-radius: 50%;
  background: linear-gradient(
    45deg,
    transparent calc(50% - 3px),
    rgba(255, 255, 255, 0.9) calc(50% - 3px),
    rgba(255, 255, 255, 0.9) calc(50% - 1px),
    rgba(16, 36, 62, 0.85) calc(50% - 1px),
    rgba(16, 36, 62, 0.85) calc(50% + 1px),
    rgba(255, 255, 255, 0.9) calc(50% + 1px),
    rgba(255, 255, 255, 0.9) calc(50% + 3px),
    transparent calc(50% + 3px)
  );
}
.swatch--actief.swatch--uit { border-color: var(--kleur-navy); }
.swatch:focus-visible { outline: 3px solid var(--kleur-aqua); outline-offset: 2px; }

/* De rustige regel onder de swatchrij: vertelt in woorden wat de streepjes
   laten zien, en beweegt mee met de kleur die je nu bekijkt. Staat er alleen
   als er ook echt iets uitverkocht is. */
.swatches__status {
  margin: 0.55rem 0 0;
  font-size: 0.9rem;
  line-height: 1.45;
  color: var(--kleur-navy);
  opacity: 0.85;
}
.swatches__status a { font-weight: 700; }

/* Aantalkeuze (6 of 12 stuks) --------------------------------------------
   Dezelfde rol als de swatchrij, maar met woorden in plaats van kleurvlakken:
   het aantal is het label en de prijs staat er meteen onder, want die verschilt
   per optie. Verder dezelfde drie signalen als bij een swatch: de huidige keuze
   heeft een navy rand plus ring, een uitverkocht aantal een stippellijn-rand,
   gedempte tekst én het woord "Uitverkocht" erbij. */
.stuks-keuze { margin: 0.75rem 0 1rem; }
.stuks-keuze__kop { font-weight: 700; margin-bottom: 0.4rem; }
.stuks-keuze__lijst {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
}
.stuks-optie {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.1rem;
  min-width: 6.5rem;
  padding: 0.55rem 1rem;
  border: 2px solid rgba(16, 36, 62, 0.25);
  border-radius: var(--radius-veld);
  background: var(--kleur-wit);
  color: var(--kleur-navy);
  text-decoration: none;
  line-height: 1.3;
}
.stuks-optie__aantal { font-weight: 700; }
.stuks-optie__prijs { font-size: 0.9rem; opacity: 0.8; }
a.stuks-optie:hover { border-color: var(--kleur-aqua); }
.stuks-optie:focus-visible { outline: 3px solid var(--kleur-aqua); outline-offset: 2px; }
.stuks-optie--actief {
  border-color: var(--kleur-navy);
  box-shadow: 0 0 0 2px var(--kleur-navy);
}
/* Uitverkocht: ingetogen, geen rood. De stippellijn is het vormsignaal, zodat
   je niet op de grijstint alleen hoeft af te gaan (WCAG 1.4.1). */
.stuks-optie--uit {
  border-style: dashed;
  border-color: rgba(16, 36, 62, 0.45);
  background: rgba(16, 36, 62, 0.04);
}
.stuks-optie--uit .stuks-optie__aantal,
.stuks-optie--uit .stuks-optie__prijs { opacity: 0.65; }
.stuks-optie__status {
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  opacity: 0.7;
}
/* De rekensom onder de rij: één rustige regel, geen badge en geen uitroepteken.
   De tekst komt kant-en-klaar uit routes/shop.js. */
.stuks-keuze__deal {
  margin: 0.55rem 0 0;
  padding: 0.5rem 0.9rem;
  border-radius: var(--radius-veld);
  background: var(--kleur-zwembad);
  font-size: 0.9rem;
  line-height: 1.45;
}

/* Koopkolom bij een uitverkocht product: geen belofte, wel een uitweg. */
.koop-uit { margin: 0.5rem 0 1rem; }
.koop-uit .koop-formulier { margin: 0 0 0.75rem; }
/* De uitverkocht-knop is géén call-to-action. Hij houdt dezelfde vorm en maat
   (de pagina springt dus niet), maar staat in rustige tinten in plaats van in
   signaal-oranje — een halfdoorzichtige oranje knop nodigt nog steeds uit. */
.koop-uit .knop.is-uit {
  background: rgba(16, 36, 62, 0.07);
  border-color: rgba(16, 36, 62, 0.22);
  color: var(--kleur-navy);
  opacity: 1;
}
.koop-uit__regel {
  margin: 0 0 0.5rem;
  font-weight: 700;
  font-size: 0.95rem;
}
/* De uitwegen bij een uitverkocht product: andere kleuren óf andere aantallen.
   Eén set klassen voor allebei, want het is dezelfde pil met dezelfde taak. Bij
   een kleur zit er een bolletje voor, bij een aantal een prijs erachter. */
.alternatieven {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}
.alternatief {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.35rem 0.9rem;
  border: 2px solid rgba(16, 36, 62, 0.18);
  border-radius: var(--radius-knop);
  background: var(--kleur-wit);
  color: var(--kleur-navy);
  text-decoration: none;
  font-weight: 700;
  font-size: 0.9rem;
}
/* Met bolletje ervoor mag de linkerkant krapper: het bolletje maakt zelf lucht. */
.alternatief:has(.alternatief__bol) { padding-left: 0.4rem; }
.alternatief:hover { border-color: var(--kleur-aqua); }
.alternatief:focus-visible { outline: 3px solid var(--kleur-aqua); outline-offset: 2px; }
.alternatief__bol {
  width: 1.4rem;
  height: 1.4rem;
  border-radius: 50%;
  border: 1px solid rgba(16, 36, 62, 0.25);
  flex: none;
}
.alternatief__prijs { font-weight: 400; opacity: 0.75; }

/* Wachtlijst "houd me op de hoogte" ---------------------------------------
   Staat onderaan het uitverkocht-blok, ná de uitwegen: wie meteen iets kan
   kopen hoeft niet eerst op een e-mailveld te stuiten. Bewust compact en in
   zwembadlicht in plaats van in navy: dit is een vriendelijk aanbod, geen
   tweede call-to-action die met de koopknop concurreert. */
.wachtlijst {
  margin-top: 1.1rem;
  padding: 0.9rem 1rem 1rem;
  border-radius: var(--radius-kaart);
  background: var(--kleur-zwembad);
}
.wachtlijst__kop {
  margin: 0;
  font-weight: 700;
  font-size: 0.95rem;
}
/* Het aantal wachtenden: een feit, geen kreet. Dus dezelfde maat als de
   microcopy eromheen en geen accentkleur. */
.wachtlijst__mee {
  margin: 0.3rem 0 0;
  font-size: 0.9rem;
  opacity: 0.85;
}
.wachtlijst__formulier {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-top: 0.7rem;
}
.wachtlijst__veld {
  flex: 1 1 12rem;
  min-width: 0;
  padding: 0.6rem 0.9rem;
  border: 1px solid rgba(16, 36, 62, 0.25);
  border-radius: var(--radius-veld);
  background: var(--kleur-wit);
  color: var(--kleur-navy);
  font: inherit;
}
.wachtlijst__veld:focus-visible {
  outline: 3px solid var(--kleur-aqua);
  outline-offset: 2px;
}
/* Bewust GEEN oranje knop. Oranje is op deze site het signaal "hier koop je",
   en boven dit blok staan de kleuren of aantallen die wél te koop zijn. Zou de
   wachtlijstknop oranje zijn, dan trekt hij de aandacht wég van de uitweg die
   je vandaag nog een pakketje oplevert. Navy op zwembadlicht haalt bovendien
   ruim 14:1 aan contrast, waar aqua op deze achtergrond net onder AA blijft. */
.wachtlijst__knop {
  flex: 0 0 auto;
  background: transparent;
  border-color: var(--kleur-navy);
  color: var(--kleur-navy);
}
.wachtlijst__knop:hover {
  background: var(--kleur-navy);
  color: var(--kleur-wit);
  box-shadow: 0 6px 16px rgba(16, 36, 62, 0.25);
}
.wachtlijst__klein {
  margin: 0.55rem 0 0;
  font-size: 0.85rem;
  opacity: 0.75;
  line-height: 1.45;
}

/* Koopformulier */
.koop-formulier {
  display: flex;
  align-items: stretch;
  gap: 0.75rem;
  margin: 0.5rem 0 1rem;
}
.koop-formulier .aantal-invoer { flex: none; }
.koop-formulier__knop { flex: 1; max-width: 20rem; }

/* Trustrow */
.trustrow {
  list-style: none;
  padding: 0.9rem 0;
  margin: 0 0 1.25rem;
  border-top: 1px solid rgba(16, 36, 62, 0.12);
  border-bottom: 1px solid rgba(16, 36, 62, 0.12);
  display: grid;
  gap: 0.3rem;
  font-size: 0.95rem;
}

/* Beschrijving + tabs */
.product__beschrijving { margin-bottom: 1.25rem; }
.product__beschrijving ul { padding-left: 1.25rem; margin-bottom: 1rem; }
.product__tabs { border-top: 1px solid rgba(16, 36, 62, 0.12); }
.tab { border-bottom: 1px solid rgba(16, 36, 62, 0.12); }
.tab summary {
  cursor: pointer;
  font-family: var(--font-kop);
  font-weight: 600;
  padding: 0.85rem 2.25rem 0.85rem 0.1rem;
  list-style: none;
  position: relative;
}
.tab summary::-webkit-details-marker { display: none; }
.tab summary:focus-visible {
  outline: 3px solid var(--kleur-aqua);
  outline-offset: -3px;
  border-radius: var(--radius-veld);
}
.tab summary::after {
  content: "+";
  position: absolute;
  right: 0.5rem;
  top: 50%;
  transform: translateY(-50%);
  font-size: 1.25rem;
  color: var(--kleur-aqua);
}
.tab[open] summary::after { content: "–"; }
.tab__inhoud { padding: 0 0.1rem 1rem; }
.tab__inhoud p:last-child { margin-bottom: 0; }
.specs { border-collapse: collapse; width: 100%; max-width: 26rem; }
.specs th, .specs td {
  text-align: left;
  padding: 0.35rem 0.75rem 0.35rem 0;
  border-bottom: 1px solid rgba(16, 36, 62, 0.08);
  font-size: 0.95rem;
  vertical-align: top;
}
.specs th { font-weight: 700; white-space: nowrap; }

/* ----- Upsellrij onder de productpagina ------------------------------------
   Elk item is de gedeelde productkaart met één regel eronder die het VERSCHIL
   noemt. Die regel hoort bij de kaart, niet erin: de kaart is overal in de
   winkel dezelfde en dat houden we zo.

   Het raster heeft exact dezelfde kolommen en tussenruimtes als .kaart-raster
   in stijl.css. Dat is geen kopieerwerk om het kopiëren: de kaart vraagt zijn
   foto op met de sizes-preset IMG_SIZES.kaart, en die is uitgerekend op precies
   dit raster. Een eigen kolomindeling zou de browser dus de verkeerde
   fotovariant laten kiezen. Een <ul> in plaats van een <div> omdat er per kaart
   nog een regel bij hoort; daarom is dit een eigen klasse. */
.upsell-raster {
  list-style: none;
  padding: 0;
  margin: 1rem 0 0;
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1rem;
}
@media (min-width: 700px) {
  .upsell-raster { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.25rem; }
}
@media (min-width: 980px) {
  .upsell-raster { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1.5rem; }
}
/* De kaart rekt tot de hoogste van de rij, zodat de verschilregels op één lijn
   staan ook als de ene productnaam over twee regels loopt en de andere niet. */
.upsell-item { display: flex; flex-direction: column; gap: 0.6rem; }
.upsell-item > .kaart { flex: 1; }
.upsell-item__meer {
  margin: 0;
  padding: 0.5rem 0.9rem;
  border-radius: var(--radius-veld);
  background: var(--kleur-zwembad);
  font-size: 0.9rem;
  line-height: 1.4;
}
.upsell-item__meer strong { white-space: nowrap; }

/* ----- Nieuwsbrief met welkomstkorting (onder de slot-CTA) ---------------- */
.nieuwsbrief {
  margin: 2rem auto 0;
  max-width: 34rem;
  text-align: center;
}
.nieuwsbrief__kop { margin-bottom: 0.9rem; }
.nieuwsbrief__kop strong { color: var(--kleur-geel); }
.nieuwsbrief__rij {
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  justify-content: center;
}
/* Het label hoort erbij voor schermlezers, maar zou de rij visueel opbreken. */
.nieuwsbrief__label {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.nieuwsbrief__veld {
  flex: 1 1 15rem;
  min-width: 0;
  padding: 0.7rem 1rem;
  border: 1px solid rgba(255, 255, 255, 0.35);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.08);
  color: var(--kleur-wit);
  font: inherit;
}
.nieuwsbrief__veld::placeholder { color: rgba(255, 255, 255, 0.6); }
.nieuwsbrief__veld:focus-visible {
  outline: 3px solid var(--kleur-geel);
  outline-offset: 2px;
  background: rgba(255, 255, 255, 0.14);
}
.nieuwsbrief__knop { flex: 0 0 auto; }
.nieuwsbrief__klein {
  margin: 0.7rem 0 0;
  font-size: 0.85rem;
  opacity: 0.75;
}
/* Honeypot: uit beeld, maar niet display:none — sommige bots slaan verborgen
   velden over en juist die willen we vangen. */
.honeypot {
  position: absolute;
  left: -9999px;
  width: 1px; height: 1px;
  overflow: hidden;
}
.nieuwsbrief-bedankt__knop { margin-top: 1.5rem; }

/* De tweede kop binnen het suggestievlak krijgt lucht boven zich, zodat de
   twee rijen niet aan elkaar plakken nu ze dezelfde achtergrond delen. */
.suggesties__tweede-kop { margin-top: 2.5rem; }
