/*
Theme Name: Manoir du Boscau
Template: astra
Description: Child theme van Astra voor boscau.com. Layout en content blijven in Elementor; hier alleen globale stijl en kleine functionele aanvullingen.
Version: 1.0.0
Text Domain: manoir-du-boscau
*/

/* Alleen wat Elementor niet kan (globale kleuren/fonts staan in de Elementor
   Kit "Château du Boscau", zie tools/kit-setup.php en tasks/notes-bouw.md
   ## Taak 2). Gebruik de Elementor-kleur-variabelen (--e-global-color-<id>),
   nooit hardgecodeerde hex, zodat de eigenaren kleuren in de Kit kunnen
   aanpassen. Bron: mockup/css/style.css en mockup/NOTES.md. */

/* Sticky header: ruimte boven een anker zodat het niet onder de header valt.
   --header-h wordt in taak 3 (Theme Builder-header) niet opnieuw
   gedefinieerd, alleen hier — dezelfde waarden als de mockup. */
:root{ --header-h:96px; }
html{ scroll-behavior:smooth; scroll-padding-top:calc(var(--header-h) + 16px); }
@media(max-width:1024px){ :root{ --header-h:84px; } }
@media(max-width:767px){ :root{ --header-h:76px; } }

/* Cijfers in een kop (afstanden, jaartallen, aantallen): Source Sans 3 600 in
   plaats van Marcellus, anders vallen twee opeenvolgende 1'en bijna samen met
   twee kleine letters l. Zet deze klasse om het cijfer (en een vaste eenheid
   erna) in elke kop die een getal bevat. Grootte en kleur volgen de kop. */
.num{ font-family:"Source Sans 3", sans-serif; font-weight:600; white-space:nowrap; }

/* Hero-achtige secties (bovenaan een pagina): trek de sectie onder de
   transparante sticky header, net als mockup/css/style.css se
   "body.has-hero .hero/.page-hero/.stay-hero". Wij hoeven geen aparte
   body-klasse te schakelen (dat was nodig omdat de mockup één statisch
   stylesheet voor alle pagina's deelt): zet deze klasse gewoon direct op de
   hero-container zelf, in Elementor bewerkbaar via "CSS Classes"
   (Checkpoint A — verbeteringen). */
.hero-under-header{ margin-top:calc(-1 * var(--header-h)); }

/* Zichtbare focusring: Nachtgroen op licht, Messing op een donkere sectie.
   Astra se eigen a:focus-visible (element+pseudo-class, specificiteit 0,1,1)
   won het anders van een kale ":focus-visible" (0,1,0) op elke link op de
   site — vandaar hier ook expliciet "a:focus-visible" (én button, voor de
   Elementor-menu-toggle en dergelijke div[role=button]-knoppen die geen <a>
   zijn maar wel .elementor-menu-toggle:focus-visible in Astra se CSS staan). */
:focus-visible,a:focus-visible,button:focus-visible,[role="button"]:focus-visible{ outline:3px solid var(--e-global-color-primary); outline-offset:3px; }
.on-dark :focus-visible,.surface-dark :focus-visible{ outline-color:var(--e-global-color-accent); }

/* Donkere secties: h1-h6 en lopende tekst automatisch Perkament in plaats van
   het Kit-standaard Nachtgroen — nooit een losse inline "color" per pagina.
   .on-dark = alleen de tekstkleur (eigen achtergrond, bijv. een foto);
   .surface-dark = achtergrond Nachtgroen + tekstkleur. Zet de klasse via
   Elementor's "CSS Classes" (Advanced-tab) op de Container.
   !important is hier bewust: elke pagina krijgt een eigen post-<id>.css met
   een ongescopete regel als ".elementor-widget-heading .elementor-heading-title
   {color:var(--e-global-color-primary)}" (2 klassen) — daar zonder !important
   consequent overheen komen zou een specificiteitswedloop tegen door
   Elementor gegenereerde, wisselende klassenamen worden. */
.on-dark,.surface-dark{ color:var(--e-global-color-perkament); }
/* Letterlijke kleur i.p.v. "inherit": widget-wrappers (bv.
   .elementor-widget-text-editor) krijgen elders hun eigen directe
   kleurregel (Kit-tekstkleur), dus "inherit" zou van díe wrapper erven, niet
   van .surface-dark twee niveaus hoger. */
.on-dark h1,.on-dark h2,.on-dark h3,.on-dark h4,.on-dark h5,.on-dark h6,.on-dark p,
.surface-dark h1,.surface-dark h2,.surface-dark h3,.surface-dark h4,.surface-dark h5,.surface-dark h6,.surface-dark p{ color:var(--e-global-color-perkament) !important; }
.surface-dark{ background:var(--e-global-color-primary); }

/* Placeholder-blok (open inhoud die op Ester, Bob of Joost wacht) — eigen
   Kalk-licht vlak met gestippeld kader, altijd leesbaar, ook op een donkere
   sectie. Nooit cijfers of citaten verzinnen. */
.placeholder{ max-width:640px; background:var(--e-global-color-kalk-licht); border:2px dashed var(--e-global-color-olijf); color:var(--e-global-color-text); padding:24px 28px; font-size:15px; }
.placeholder strong{ display:block; color:var(--e-global-color-olijf); font-weight:600; margin-bottom:6px; }
.placeholder p{ max-width:none; color:inherit; margin:0; }

/* Placeholder-stijl van formuliervelden (Elementor Pro Form-widget kan de
   ::placeholder-pseudo-class zelf niet stylen). */
::placeholder{ color:var(--e-global-color-text); opacity:.82; }

/* Visueel verborgen, wel voor schermlezers (bv. "Vaste lijn: " voor een
   telefoonnummer). Bron: mockup/css/style.css. */
.sr-only{ position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }

/* --- Taak 3: header/footer (Theme Builder) ---------------------------------
   Alleen wat Elementor's eigen controls niet dekken: de vloeiende zijmarge
   (clamp, zoals de mockup) en de kolombreedtes van de footer-grid (per-child
   flex-basis heeft geen eigen Elementor-control zonder in de layout-CSS van
   elk kind te duiken). De rest (kleuren, flex-richting/-gap, sticky) staat in
   elementor/header.json en elementor/footer.json zelf. */
/* Checkpoint A — verbeteringen: de zijmarge hoort maar op ÉÉN niveau te staan
   (de buitenste header/footer-container, zoals mockup/css/style.css se
   ".site-header"/".site-footer" met padding-inline eenmalig). ".site-footer-grid"
   en ".site-footer-base" kregen 'm eerst óók, wat optelde bovenop hun eigen
   "max-width:1280px;margin-inline:auto" — de kolommen stonden daardoor verder
   naar binnen dan de mockup (x≈176/605/965 i.p.v. 86/571/982 op 1440px). */
.site-header-container,.site-footer-container{ padding-inline:clamp(20px,6vw,96px); }
.site-header-container{
	min-height:var(--header-h);
	z-index:50;
	background:var(--e-global-color-primary);
	/* Elementor's eigen ".e-con{transition:background .3s,...}" (frontend.min.css)
	   geeft ALLE containers al een background-transition — ook zonder onze
	   eigen (hierboven verwijderde) transition-regel liep de achtergrond hier
	   dus alsnog vast, zie de toelichting bij ".elementor-sticky" hieronder.
	   !important is nodig omdat Elementor's regel exact dezelfde specificiteit
	   heeft (0,1,0: ".e-con") en de volgorde in de HTML-head niet gegarandeerd
	   is. */
	transition:none !important;
}
/* Het woordmerk mag nooit afbreken naar 2 regels (bv. bij een smalle
   tablet-breedte met alle 5 menu-items nog naast elkaar, vóór de
   mobiel-drempel van de Nav Menu-widget op 767px): flex-shrink:0 zodat de
   krapte bij het menu ernaast terechtkomt, niet bij de merknaam. */
.site-header-container .wordmark{ flex-shrink:0; }
/* Logo en woordmerk linksboven (feedback 2026-10, punt 1): één link (de container
   .header-brand, html_tag "a" in elementor/header.json) naar de home van de taal. De
   afbeelding heeft vaste afmetingen (breedte en hoogte in de widget): geen
   layoutverschuiving; het woordmerk is voor schermlezers verborgen (de alt van het
   logo noemt de naam al) en verdwijnt op mobiel (geen ruimte naast taalkeuze en
   hamburger). De container krimpt niet: de krapte komt bij het menu terecht. */
.site-header-container .header-brand.e-con{ --width:auto; flex-shrink:0; }
.site-header-container .header-brand .elementor-widget-image{ line-height:0; }
/* Ruimtebudget van de header (inhoudsbreedte = viewport min 2x zijmarge): logo met
   woordmerk, menu, taalkeuze met vlaggen, Instagram en de Reserveren-knop passen
   samen vanaf 1440px. Daaronder verdwijnt het woordmerk (het logo blijft; de naam
   staat in de alt en in de pagina zelf), en tussen 1025 en 1179px krimpt ook de
   zijmarge, zodat het menu nooit naar twee regels breekt. Onder 1025px neemt de
   hamburger het menu over (Elementor-instelling "dropdown: tablet"). */
@media(min-width:1025px) and (max-width:1439px){
	.site-header-container .wordmark{ display:none; }
}
@media(min-width:1025px) and (max-width:1179px){
	.site-header-container{ padding-inline:clamp(20px,3vw,96px); }
}
@media(min-width:1025px) and (max-width:1099px){
	.site-header-container .header-right.e-con{ --column-gap:12px; }
}
/* Tussen 1025 en 1279px past het menu in DE/FR (langere woorden) niet op één regel
   naast vlag+code: daar alleen de vlag. De vlag-<img> houdt de taalnaam als alt,
   dus de link blijft een toegankelijke naam houden. */
@media(min-width:1025px) and (max-width:1279px){
	.site-header-container .cpel-switcher__code{ display:none; }
}
/* Elementor's Sticky-motion-effect (header-container: Sticky=Top, Effects
   offset=80) zet deze twee klassen zelf via JS (modules/sticky/assets/js
   /frontend/handlers/sticky.js): ".elementor-sticky" meteen bij init — de
   header is sticky vanaf y=0 (offset 0), dus dit geldt vrijwel altijd zodra
   JS draait — en ".elementor-sticky--effects" pas voorbij de effects-offset
   (80px scroll). Zonder JS blijft alleen de basisregel hierboven gelden:
   solide Nachtgroen, de toegestane fallback. Volgorde in dit bestand bepaalt
   welke wint bij gelijke specificiteit (2 klassen): --effects moet ná
   .elementor-sticky blijven staan.
   Checkpoint A — verbeteringen, root cause gevonden: de eerdere versie had
   hier ook "transition:background .25s ease" op de basisregel staan. Elementor
   herschrijft op de ECHTE (niet de .elementor-sticky__spacer-kloon)
   stickyelement continu inline style="top/width/margin-top" (elke
   scroll/resize-tick, ook in rust via een ResizeObserver). Elke zo'n
   style-herberekening onderbrak de CSS-transition van "background" halverwege
   en liet 'm herstarten vanaf de ALLEREERSTE (solide) waarde — het element
   kwam z'n transparante/verlopende achtergrond dus nooit voorbij, ook niet na
   seconden wachten (geverifieerd met getComputedStyle: bij een gefronte tab
   bleef backgroundColor exact rgb(28,38,33) hangen, en zette transition:none
   het meteen recht). Elementor zet daarom zelf ook transition:none op de
   spacer-kloon — bewust geen transition hier, dus een instant kleurwissel bij
   scrollen, in plaats van een animatie die op dit element structureel
   vastloopt. */
.site-header-container.elementor-sticky{
	background:linear-gradient(180deg,rgba(16,21,18,.82) 0%,rgba(16,21,18,.58) 100%);
}
.site-header-container.elementor-sticky--effects{
	background:var(--e-global-color-primary);
	box-shadow:0 1px 0 rgba(0,0,0,.12);
}
/* Hero-achtige secties trekken zichzelf onder de header, zie ".hero-under-header"
   hierboven bij "Basis/reset". */

.site-footer-container{ background:var(--e-global-color-diep-woud); padding-top:72px; padding-bottom:26px; }
.site-footer-grid{ max-width:1280px; margin-inline:auto; }
/* flex-basis 0 (i.p.v. een vaste px-basis) + flex-grow-verhouding 1.2:1:1 is
   de flexbox-vertaling van mockup se "grid-template-columns:1.2fr 1fr 1fr" —
   met een vaste px-basis (240/280) groeiden alle 3 kolommen daarna evenveel
   (flex-grow:1 voor allemaal), niet in de 1.2:1:1-verhouding, en dat schoof de
   kolomkoppen "Verblijven"/"Contact" iets te ver naar binnen. */
.site-footer-grid .footer-col{ flex:1 0 0; }
.site-footer-grid .footer-col-brand{ flex:1.2 0 0; }
/* flex-basis:0 heeft geen eigen minimumbreedte (in tegenstelling tot de vorige
   "flex:1 1 240px"), dus zonder onderstaande regel bleven de 3 kolommen op
   mobiel naast elkaar oneindig doorkrimpen (elke kolom ±53px breed, tekst als
   "info@boscau.com" liep daardoor over de paginarand). Ga onder 767px terug
   naar volle breedte per kolom, zodat footer-grid se flex-wrap ze alsnog
   onder elkaar zet. */
@media(max-width:767px){
	.site-footer-grid .footer-col,
	.site-footer-grid .footer-col-brand{ flex:1 1 100%; }
}
.site-footer-base{ max-width:1280px; margin:48px auto 0; padding-top:20px; border-top:1px solid #3a453d; font-size:13px; }

/* Footer-kolom "Verblijven": Nav Menu-widget zonder eigen padding/gap-instelling
   valt terug op Elementor Pro se ingebouwde item-padding (~20px links/rechts) —
   dat gaf een onbedoelde inspring t.o.v. de kolomkop. header.json/footer.json
   zetten nu zelf padding_horizontal_menu_item/padding_vertical_menu_item op 0
   en menu_space_between op de mockup-achtige regelafstand; deze regel is alleen
   een garantie tegen de kale <ul>/<li>-useragent-marge. */
.site-footer-grid .footer-col nav ul.elementor-nav-menu{ margin:0; padding:0; }
.site-footer-grid .footer-col nav ul.elementor-nav-menu li{ margin:0; padding:0; list-style:none; }
/* Merkkolom-tekst (beschrijving + adres) in de gedempte kleur, zoals mockup se
   ".footer-grid p{color:var(--e-global-color-mosgrijs)}" — moet !important
   omdat ".on-dark p{color:perkament!important}" hierboven anders wint. */
.site-footer-grid p{ color:var(--e-global-color-mosgrijs) !important; }

/* --- Taak 4: homepage (herbruikbaar voor latere paginataken) --------------
   Vloeiende zijmarge/sectiepadding (clamp): Elementor's dimension-controls
   kennen geen clamp() per breakpoint, dus net als .site-header-container/
   .site-footer-container (taak 3) hier twee gedeelde hulpklassen i.p.v. per
   sectie drie losse breakpoint-waarden. */
.section-pad-x{ padding-inline:clamp(20px,6vw,96px); }
.section-pad-y{ padding-block:clamp(72px,10vw,136px); }
/* Dunne lijn-kleuren (mockup/css/style.css "Tokens"), nodig op licht (tijdlijn,
   info-lijsten) resp. donker (amenities e.d., vanaf taak 5). */
:root{ --line-light:rgba(62,74,54,.3); --line-dark:var(--e-global-color-accent); }

/* Hero (en herbruikbaar voor page-hero/stay-hero, taak 5+): de foto is een
   los Image-widget, absoluut gepositioneerd als eerste kind (EISEN §5.1 —
   geen container-achtergrondafbeelding, dat blijft een <img> met
   fetchpriority/lazy-gedrag). Elementor's eigen "_position"-controls dekken
   dit niet volledig (geen losse width/height:100%-control erbij), vandaar
   deze twee kleine klassen i.p.v. per-widget uitproberen. */
.hero-section{ position:relative; overflow:hidden; isolation:isolate; }
.hero-media{ position:absolute; inset:0; width:100%; height:100%; object-fit:cover; z-index:-1; }
/* Als .hero-media op de Image-widget-wrapper staat, krijgt de <img> zijn hoogte uit Elementor (bv. 52vh) en kan die lager zijn dan de min-height van de hero (lage vensters): dan onderin een strook zonder foto. De img vult daarom altijd de hele hero. */
.hero-section .hero-media img{ width:100% !important; height:100% !important; object-fit:cover; }
/* Hero met achtergrondvideo (geschiedenispagina): de foto vervaagt pas als de
   video echt speelt (klasse via theme/functions.php, wp_footer). */
.hero-section .hero-media{ transition:opacity .8s ease; }
.hero-section.hero-video-speelt .hero-media{ opacity:0; }
/* Hero-titel: één Heading-tekst ("Château du Boscau", EISEN §2.1: precies één
   H1), met de kleine regel als eigen span-formaat — zie mockup/NOTES.md
   "Hero homepage". Kleur volgt gewoon .on-dark h1 (al globaal geregeld). */
.hero-title{ margin:0 0 22px; }
.hero-title-small{ display:block; font-size:clamp(26px,3vw,44px); line-height:1.2; }
.hero-title-big{ display:block; font-size:clamp(88px,13vw,200px); line-height:.9; }

/* Eyebrow (kleine regel boven een kop, bv. "Prudhomat, Lot, Frankrijk",
   "Theetuin"). */
.eyebrow{ display:block; font-size:15px; letter-spacing:.02em; color:var(--e-global-color-mosgrijs); margin:0 0 14px; }
.eyebrow--on-light{ color:var(--e-global-color-olijf); }

/* Tekstlink (onderstreepte link zonder knopvorm, bv. "Vergelijk de
   verblijven", kaart-CTA's). "a.text-link" erbij: de Kit-regel
   ".elementor-kit-1964 a{color:inherit;text-decoration:none}" (0,1,1) won van
   ".text-link" (0,1,0), waardoor elke <a class="text-link"> eruitzag als gewone
   tekst (gevonden 2026-10-11). Een <span class="text-link"> in een kaart-<a>
   had dat probleem niet. */
.text-link,a.text-link{ display:inline-block; color:var(--e-global-color-olijf); text-decoration-line:underline; text-decoration-color:var(--e-global-color-olijf); text-decoration-thickness:1px; text-underline-offset:4px; font-size:16px; }
.text-link:hover,a.text-link:hover{ color:var(--e-global-color-primary); text-decoration-color:var(--e-global-color-primary); }
.text-link--on-dark,a.text-link--on-dark{ color:var(--e-global-color-perkament); text-decoration-color:var(--e-global-color-accent); }
.text-link--on-dark:hover,a.text-link--on-dark:hover{ color:var(--e-global-color-accent); }

/* Tijdlijn-jaartal: Source Sans 3 600 (niet Marcellus, zie .num hierboven —
   zelfde reden), los grootteformaat, geen kop-element. */
.timeline-year{ display:block; font-size:clamp(34px,3.4vw,48px); line-height:1; color:var(--e-global-color-primary); margin-bottom:12px; font-family:"Source Sans 3", sans-serif; font-weight:600; }
.timeline-item{ border-top:1px solid var(--line-light); padding-top:18px; }

/* Taalkeuze in de header (taak 2.3): de Language switcher-widget van Connect
   Polylang for Elementor (widgetType "polylang-language-switcher", geen
   icon-list meer) rendert <nav class="cpel-switcher__nav"><ul
   class="cpel-switcher__list"><li class="cpel-switcher__lang(--active)">
   <a>—alleen taalcode, geen vlag/naam (widget-instellingen in header.json).
   Deze regels laten dat er weer uitzien als de oude platte-tekstlinks:
   lichte inactieve talen, volle dekking + onderstreping voor de actieve. */
.lang-switch .cpel-switcher__list{ gap:var(--cpel-switcher-space,10px); }
.lang-switch .cpel-switcher__lang{ margin:0; }
.lang-switch .cpel-switcher__lang a{ opacity:.75; text-decoration:none; }
.lang-switch .cpel-switcher__lang a:hover,
.lang-switch .cpel-switcher__lang a:focus-visible{ opacity:1; }
.lang-switch .cpel-switcher__lang--active a{ opacity:1; border-bottom:1px solid currentColor; }
/* Taak 2.3b/2.3c: de widget's eigen ".cpel-switcher__list" (plugin-CSS
   "flex-wrap:wrap", geen widgetinstelling om dat uit te zetten — het
   "Layout"-control (horizontal/vertical/dropdown) is niet responsive, zie
   includes/widgets/polylang-language-switcher.php) viel op smalle mobiel
   (390px) uiteen in een 2×2-raster (NL EN / FR DE) én op desktop (1440px,
   FR/DE) in NL EN FR op regel 1 met DE eronder — de vaste widgetbreedte was
   op geen enkele breedte krap genoeg voor 4 taalcodes. "nowrap" geldt daarom
   op alle breedtes (2.3b beperkte dit nog tot ≤767px). */
.lang-switch .cpel-switcher__list{ flex-wrap:nowrap; }

/* Header rechts: menu, taalkeuze en de Reserveren-knop samen, tegen de
   rechterrand — zie header.json ("header-right"-container). */
.header-right{ flex-shrink:0; }
/* Onder de dropdown-drempel van de Nav Menu-widget (tablet, ≤1024px, zie
   header.json "dropdown":"tablet") past naast het hamburgermenu en de
   Reserveren-knop geen taalkeuze meer zonder om te breken naar een lelijke,
   halfoverlappende tweede rij (header-right is een gewone flex-rij, geen
   eigen paneel — de taalkeuze en de knop zitten als losse widgets NAAST de
   Nav Menu-widget, niet er middenin zoals in de statische mockup, dus ze
   volgen Elementor's eigen hamburger-paneel niet automatisch mee). Nu de
   taalkeuze een echte, werkende widget is (taak 2.3, was een inerte
   placeholder) mag hij niet meer verdwijnen op mobiel/tablet — in plaats
   van hem te verbergen laten we header-right naar een nette tweede regel
   wrappen. */
@media(max-width:1024px){
	.header-right{ flex-wrap:wrap; row-gap:8px; justify-content:flex-end; }
}

/* Taak 5: verblijfhero — Image Carousel-widget vult de vaste hero-hoogte met
   cover-crop (de widget heeft zelf geen height/object-fit-control, zie
   tasks/notes-bouw.md taak 5). Herbruikbaar voor taak 7 (Louis IX, Jean
   Mouliérat): zelfde klassen, alleen de widget-inhoud (foto's) verschilt. */
.stay-hero{ position:relative; height:80svh; min-height:560px; max-height:920px; overflow:hidden; }
.stay-hero-carousel{ position:absolute; inset:0; }
.stay-hero-carousel .elementor-image-carousel-wrapper,
.stay-hero-carousel .swiper-wrapper,
.stay-hero-carousel .swiper-slide,
.stay-hero-carousel .swiper-slide-inner{ height:100%; }
.stay-hero-carousel .swiper-slide-image{ width:100%; height:100%; object-fit:cover; object-position:center center; }

/* Herotekst (H1/type/knop) linksonder over de carousel — bouwd op de
   Elementor-eigen "_position:absolute"-control (Advanced-tab), maar die
   control werkt hier niet: geen "elementor-absolute"-prefixklasse in de
   HTML en geen position-CSS in de gecompileerde post-CSS (geverifieerd op
   zowel deze pagina als de al gepubliceerde homepage, elementor/home.json
   se "a003herotext" — dezelfde instelling, dezelfde bug, zie
   tasks/notes-bouw.md taak 5). Container-elementen lijken deze
   common-control in Elementor 4.3.1 stil te negeren. Vaste klasse i.p.v.
   de kapotte control, zelfde aanpak als ".hero-under-header"/plan besluit 1.
   z-index nodig: Elementor's eigen carousel-CSS zet z-index:1 op
   ".elementor-image-carousel.swiper-wrapper" (position:relative, dus met
   een eigen stacking-context) — die "ontsnapt" boven een latere sibling
   zonder eigen z-index (auto), ook al staat hij eerder in de DOM.
   .hero-text-panel = hetzelfde voor de homepage-hero (a003herotext); daar
   staat geen carousel, dus z-index is er niet nodig maar ook onschadelijk. */
.stay-hero-text,.hero-text-panel{ position:absolute; left:0; bottom:0; max-width:760px; z-index:2; }

/* --- Taak 11: contact en praktische informatie -----------------------------
   Op /contact-opnemen/ moet de "Stuur ons een bericht"-sectie op tablet/mobiel
   het formulier tonen vóór de foto (bezoeker hoeft niet eerst langs een grote
   foto te scrollen om het formulier te vinden) — 1-op-1 uit de lokale
   <style> in mockup/contact-opnemen.html. De "Onze gegevens"-sectie heeft
   deze klassen niet nodig: daar staat de tekst al als eerste DOM-kind, dus
   die volgorde klopt op elke breedte zonder CSS. */
@media(max-width:1024px){
	.stack-text-first{ order:1; }
	.stack-photo-last{ order:2; }
}

/* Icon List-item met een inline <a class="text-link"> te midden van gewone
   tekst (bv. "Gilles del Bosc: huisdieren welkom, max. 2" op
   /praktische-informatie/) brak naar een eigen regel: Elementor's eigen
   ".elementor-widget .elementor-icon-list-item a{display:flex}" (bedoeld voor
   de hele-item-link-functie van dit widget) raakt ELK <a>-element binnen het
   item, dus ook eentje middenin de tekst. Hogere specificiteit (3 klassen +
   1 element i.p.v. Elementor's 2 klassen + 1 element) i.p.v. !important. */
.elementor-icon-list-item .elementor-icon-list-text a.text-link{ display:inline; }

/* --- Taak 10: theetuin en omgeving -----------------------------------------
   .hero-section/.hero-under-header/.hero-text-panel/.on-dark/.surface-dark/
   .placeholder/.text-link/.eyebrow/.num (allemaal hierboven) zijn zonder
   wijziging hergebruikt voor de paginahero's van deze twee pagina's — zie
   tasks/notes-bouw.md taak 10. Hieronder alleen wat nog niet bestond. */

/* Bijschrift bij een foto (Elementor Image-widget "Custom Caption"), bv. de
   fotocredit bij Carennac op /omgeving/. Vaste kleur i.p.v. verminderde
   dekking op de tekstkleur: anders haalt het bijschrift op Kalksteen net niet
   de WCAG AA-contrastgrens. Bron: mockup/css/style.css §1. */
figcaption{ font-size:15px; color:var(--e-global-color-olijf); margin-top:10px; }

/* Tegelraster (foto + titel + zin, of — op /omgeving/ — titel + zin zonder
   foto als inhoudsopgave met ankerlinks). Nieuw onderdeel, nog niet eerder
   gebouwd. Bron: mockup/css/style.css §18. */
.tile-grid{ display:grid; gap:28px; }
.tile-media{ display:block; aspect-ratio:4/3; overflow:hidden; margin-bottom:16px; }
.tile-media img{ height:100%; width:100%; transition:transform .6s ease; }
.tile:hover .tile-media img,.tile:focus-visible .tile-media img{ transform:scale(1.03); }
.tile-title{ font-size:20px; margin-bottom:8px; }
.tile p{ font-size:15px; color:var(--e-global-color-text); }
a.tile,.tile{ display:block; }
.tile:hover .tile-title,.tile:focus-visible .tile-title{ color:var(--e-global-color-primary); text-decoration:underline; }
/* /omgeving/ inhoudsopgave: geen foto per tegel, dus geeft elke titel in rust
   al een onderstreping (art-directorbevinding uit de mockup, zelfde als
   .text-link elders) zodat de tegel ook zonder hover als link herkenbaar is.
   min-height houdt de onderlijn op gelijke hoogte tussen 1- en 2-regelige
   titels in dezelfde rij van het mobiele 2-koloms raster. */
.tile-grid--toc .tile-title{ display:inline-block; border-bottom:1px solid var(--line-light); padding-bottom:2px; min-height:3.4em; }
.tile-grid--toc .tile:hover .tile-title,.tile-grid--toc .tile:focus-visible .tile-title{ text-decoration:none; border-color:var(--e-global-color-primary); }

/* Taak 9: foto tussen de alinea's in "Ester & Bob" op /boscau/ — zelfde
   afweging als mockup/boscau.html se eigen inline <style>: op desktop (2
   kolommen, align-items:start) maakt de foto de linkerkolom onnodig lang;
   pas zichtbaar zodra .text-photo-grid (hier: de Elementor-grid) naar 1
   kolom klapt. Los van .tile-media gehouden (dat is hier geen figuur-wrapper
   maar een gewone Elementor Image-widget met eigen height/object-fit). */
.ester-inline-photo{ display:none; }
@media(max-width:1024px){ .ester-inline-photo{ display:block; } }

/* --- Checkpoint C: hero-verloop (scrim) en tekstuitlijning zoals de mockup --
   2026-09-26 (Joost): verloop in Nachtgroen i.p.v. bijna-zwart en iets minder
   dekkend, zodat de foto's lichter blijven en het groen terugkomt.
   De mockup legt een verloop over de hele hero-foto (.hero-scrim,
   .page-hero-scrim, .stay-hero-scrim in mockup/css/style.css); zonder dat is
   de foto te licht voor witte tekst en valt het hamburger-icoon weg. Een
   pseudo-element, zodat de eigenaren in Elementor alleen de foto en de tekst
   zien. z-index 1: boven de foto (-1) en de carousel (1, eerder in de DOM),
   onder de tekst (2). Het tekstblok heeft geen eigen achtergrond meer en lijnt
   uit op de containerrand, zoals .hero-content in de mockup. */
:root{ --side-margin:clamp(20px, 6vw, 96px); --container-max:1280px; }
.hero-section::after,.stay-hero::after{ content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
	background:linear-gradient(0deg,rgba(34,51,43,.74) 0%,rgba(34,51,43,.38) 60%,rgba(34,51,43,.42) 100%); }
body.home .hero-section::after{
	background:linear-gradient(100deg,rgba(34,51,43,.70) 0%,rgba(34,51,43,.32) 42%,rgba(34,51,43,.08) 62%),linear-gradient(0deg,rgba(34,51,43,.62) 0%,rgba(34,51,43,0) 42%); }
.stay-hero::after{
	background:linear-gradient(0deg,rgba(34,51,43,.82) 0%,rgba(34,51,43,.45) 45%,rgba(34,51,43,.12) 70%,rgba(34,51,43,.34) 100%); }
.stay-hero .swiper-button-prev,.stay-hero .swiper-button-next,.stay-hero .elementor-swiper-button,.stay-hero .swiper-pagination{ z-index:3; }
.stay-hero-text,.hero-text-panel{ right:0; width:100%; max-width:none;
	padding:0 max(var(--side-margin), calc((100% - var(--container-max))/2 + var(--side-margin))) clamp(40px,6vw,72px); }
.stay-hero-text > *,.hero-text-panel > *{ max-width:760px; }
/* Het tekstpaneel ligt over de volle breedte en de onderste helft van de hero
   (z-index 2, boven de carrousel). Bij een lage vensterhoogte (laptop, ± 700-800
   px) viel het daardoor over de vorige/volgende-pijlen: een klik kwam op het
   (onzichtbare) paneel en de foto schoof niet door, alleen de bolletjes werkten
   (feedback Joost 2026-10-11; gemeten 210 van 420 klikken vast op 1024-1440 px
   breed, ≤ 800 px hoog). Het paneel laat klikken en vegen nu door naar de
   carrousel; alleen links en knoppen erin vangen ze zelf op. */
.stay-hero-text,.hero-text-panel{ pointer-events:none; }
.stay-hero-text a,.stay-hero-text button,.hero-text-panel a,.hero-text-panel button{ pointer-events:auto; }

/* --- Tijdlijn "De hele geschiedenis" (/boscau/), opnieuw opgezet na de feedback
   van de eigenaren (2026-10, punt 5: jaartallen rechts uitgelijnd en verschillend
   van breedte, kleine tekst, lijn en stippen sloten niet aan) ----------------
   Eén vaste jaartalkolom links (--tl-year, dezelfde waarde als de grid-kolom
   "140px 1fr" in elk .timeline-item in elementor/boscau.json) en één doorlopende
   lijn met per item een stip precies op de hoogte van het jaartal. Jaartal en
   tekst delen dezelfde regelhoogte (--tl-line = 30,6px, de regel van lopende
   tekst van 18px) en dezelfde bovenrand, daarom vallen jaartal, stip en eerste
   tekstregel op één lijn. Tabelcijfers (tnum) geven elk jaartal gelijke breedte.
   Lijnstuk (::before) en stip (::after) horen bij het item zelf en staan t.o.v.
   het item, niet t.o.v. de lijst: een item kopiëren in Elementor geeft vanzelf een
   nieuwe rij met stip en aansluitende lijn. Gescopet op .timeline-vertical: de
   korte, horizontale tijdlijn op de homepage (.timeline-item zonder
   .timeline-vertical) blijft ongemoeid. Mobiel: jaartal boven de tekst, lijn links. */
.timeline-vertical{ --tl-year:140px; --tl-gap:56px; --tl-pad:20px; --tl-line:30.6px; --tl-dot:11px;
	--tl-x:calc(var(--tl-year) + var(--tl-gap) / 2); --tl-dot-y:calc(var(--tl-pad) + var(--tl-line) / 2);
	max-width:900px; }
.timeline-vertical .timeline-item{ position:relative; border-top:none; padding-top:0; } /* de 20px boven/onder komt uit de Elementor-padding van het item */
.timeline-vertical .timeline-item::before{ /* lijnstuk van dit item; samen één doorlopende lijn van de eerste tot de laatste stip */
	content:""; position:absolute; left:var(--tl-x); top:0; bottom:0; width:1px; background:color-mix(in srgb, rgb(62 74 54) 30%, var(--e-global-color-kalk-licht)); } /* vlak (niet doorschijnend): aansluitende lijnstukken overlappen dan niet als donkerder streepje */
.timeline-vertical .timeline-item:first-child::before{ top:var(--tl-dot-y); }
.timeline-vertical .timeline-item:last-child::before{ bottom:auto; height:var(--tl-dot-y); }
.timeline-vertical .timeline-item::after{ /* stip op de lijn, op de hoogte van het jaartal */
	content:""; position:absolute; width:var(--tl-dot); height:var(--tl-dot); border-radius:50%; background:var(--e-global-color-primary);
	left:calc(var(--tl-x) - var(--tl-dot) / 2 + .5px); top:calc(var(--tl-dot-y) - var(--tl-dot) / 2); }
.timeline-vertical .text-link{ font-size:inherit; } /* een link in de tekst even groot als de tekst (was 16px in 18px) */
.timeline-vertical .timeline-year{
	margin:0; font-size:clamp(24px,2.2vw,30px); line-height:var(--tl-line); text-align:left; font-variant-numeric:tabular-nums; }
@media(max-width:767px){
	/* Mobiel klapt het item naar 1 kolom (grid_columns_grid_mobile): jaartal boven de tekst, lijn links. */
	.timeline-vertical{ --tl-x:5px; }
	.timeline-vertical .timeline-item{ padding-left:26px; }
}

/* --- Checkpoint C2: info-list regelafstand op mobiel (laag, /praktische-informatie/) --
   Icon List-widget heeft standaard geen padding tussen items
   (.elementor-icon-list-item{padding:0}, geverifieerd via getComputedStyle) —
   op mobiel oogt dat krapper dan mockup .info-list li{padding:14px 0}
   (mockup/css/style.css §21). Alleen mobiel en alleen via .info-list (nieuwe
   klasse op de 4 topic-lijsten in praktische-informatie.json), niet
   sitebreed: dezelfde widget-CSS-klasse wordt elders (header-taalkeuze,
   contactgegevens, footer) met eigen, bewust compacte tussenruimte gebruikt. */
@media(max-width:767px){
	.info-list .elementor-icon-list-item{ padding-block:12px; }
}

/* --- Checkpoint C2: mobiele header — Reserveren in het uitklappaneel i.p.v.
   de balk, zoals mockup/css/style.css (daar zit de knop zelf IN .site-nav,
   dus verdwijnt hij samen met de links achter het hamburgermenu en komt hij
   terug in het paneel; body.nav-open .site-nav .button{margin-top:10px}).
   Onze knop is een los Button-widget naast de nav-menu-widget (element
   4c72853 in elementor/header.json), geen menu-item — dus: knop verbergen in
   de balk vanaf de dropdown-breakpoint (tablet, zie taak 3), en een 6e
   "Reserveren"-item op Hoofdmenu (klasse reserveren-menu-item, WP-CLI menu
   item add-custom) als knop-achtige CTA binnen het paneel; op desktop blijft
   dat menu-item verborgen (de standaalone knop is daar al de CTA).
   !important nodig: Elementor Pro's eigen widget-CSS zet
   ".elementor-nav-menu--layout-horizontal .elementor-nav-menu>li{display:flex}"
   (2 klassen + element, specificiteit 0,2,1) en de gecompileerde
   per-instance-kleur/achtergrond op ".elementor-item" (post-1985.css, 4
   klassen + element) — beide hoger dan een simpele klasse-selector hier
   (geverifieerd via de CSSOM in de browser, anders leek de regel onschuldig
   niets te doen). */
@media(max-width:1024px){
	.elementor-element-4c72853{ display:none!important; }
	.reserveren-menu-item{ margin-top:10px; }
	.reserveren-menu-item .elementor-item{
		background:var(--e-global-color-accent)!important; color:var(--e-global-color-primary)!important;
		justify-content:center!important; text-align:center; min-height:44px; }
}
@media(min-width:1025px){
	.reserveren-menu-item{ display:none!important; }
}

/* --- Checkpoint C1: verblijfkaart (homepage "Hier slaap je" + "De andere
   verblijven" op de 3 verblijfpagina's) — foto vult de kaart, verloop erover,
   tekst onderaan over de foto, zoals mockup/css/style.css se .stay-card
   (§11). Kaart blijft één <a>-container (html_tag:"a"); de foto is een
   gewone Image-widget (blijft <img>, lazy) zonder eigen height-instelling
   meer — deze klasse regelt de opvulling. Zelfde stapelvolgorde/z-index-truc
   als .hero-section::after/.hero-text-panel hierboven: ::after (scrim) krijgt
   z-index:1, de tekst (stay-card-body) z-index:2, de foto blijft z-index:auto
   (dus onderaan) — zonder die twee z-index-waarden zou ::after, als laatste
   "kind" in de boomstructuur, over de tekst heen komen te liggen. */
.stay-card{ position:relative; display:block; aspect-ratio:4/5; overflow:hidden; isolation:isolate; color:var(--e-global-color-perkament); }
/* Niet ".stay-card img" direct: de Image-widget-wrapper (.elementor-widget-image)
   heeft zelf al position:relative (Elementor-default) en wordt dus de
   containing block voor een absolute <img> erin — de <img> zelf zou dan
   0-hoog blijven (zijn eigen wrapper heeft geen vaste hoogte). Maak in plaats
   daarvan de WRAPPER zelf de absolute, vullende laag; de <img> vult op zijn
   beurt gewoon 100% van die (nu wel bepaalde) wrapper-hoogte. */
.stay-card .elementor-widget-image{ position:absolute; inset:0; }
.stay-card img{ display:block; width:100%; height:100%; object-fit:cover; transition:transform .6s ease; }
.stay-card:hover img,.stay-card:focus-visible img{ transform:scale(1.03); }
.stay-card::after{ content:""; position:absolute; inset:0; z-index:1; pointer-events:none;
	background:linear-gradient(0deg,rgba(28,38,33,.95) 0%,rgba(28,38,33,.82) 28%,rgba(28,38,33,.62) 45%,rgba(28,38,33,0) 60%); }
.stay-card-body{ position:absolute; left:0; right:0; bottom:0; z-index:2; padding:26px 24px; }
@media(prefers-reduced-motion:reduce){
	.stay-card:hover img,.stay-card:focus-visible img{ transform:none; }
	/* Elementor-achtergrondvideo (bv. de drone-video bij "Bijna duizend jaar",
	   feedback 2026-10 punt 4) kent zelf geen reduced-motion: dan geen video, de
	   container toont zijn fallback-afbeelding (background_video_fallback). */
	.elementor-background-video-container{ display:none; }
	/* Ook geen geanimeerd scrollen (kiezen, 'Ander verblijf kiezen', ankerlinks): de JS geeft dan
	   behavior 'auto' mee, en 'auto' volgt deze regel (review 2026-10-11). */
	html{ scroll-behavior:auto; }
}

/* --- Checkpoint C1: "Goed om te weten" in 2 kolommen op /appartementen/,
   zoals mockup/css/style.css se .info-list--wide (§21) — alleen de losse
   items schikken in 2 kolommen vanaf 1025px, kop en link blijven vol-breed.
   Klasse op de Icon List-widget zelf (_css_classes, met underscore). */
.info-list--wide{ max-width:960px; }
@media(min-width:1025px){
	.info-list--wide .elementor-icon-list-items{ display:grid; grid-template-columns:1fr 1fr; column-gap:48px; }
}

/* Checkpoint C: mobiele header op één rij. Elementor geeft elke container op
   mobiel standaard --width:100% en --flex-wrap:wrap; daardoor viel de
   rechtergroep (hamburger) onder het woordmerk en werd de header 122px hoog. */
@media (max-width:767px){
	.site-header-container.e-con{ --flex-wrap:nowrap; }
	.site-header-container .header-right.e-con{ --width:auto; }
}

/* ==========================================================================
   WPBS-kalender: de kalender + het formulier ("Beschikbaarheid") in de stijl
   van de site, op de donkere sectie (.surface-dark). Alleen WPBS-klassen en
   de eigen wrapper .wpbs-cal-wrap (elementor/gilles-del-bosc.json, louis-ix,
   jean-moulierat, reserveren) — de WPBS-widget-instellingen zelf blijven
   ongewijzigd. Verwijdert het losse lichtgrijze/witte WPBS-vlak, dunne
   lijnen i.p.v. zware vakken, legenda/geselecteerde periode in de Kit-
   kleuren, velden en boekknop zoals de rest van de site.

   Specificiteit: WPBS geeft zijn eigen kleuren (legenda, selectie, vandaag)
   mee als een <style>-blok MET !important, ingevoegd in de pagina zelf (dus
   ná theme/style.css in de cascade) — bij gelijke specificiteit wint dat
   blok gewoon omdat het later staat. Daarom hier overal minstens één
   class extra dan WPBS zelf gebruikt (".wpbs-cal-wrap .wpbs-main-wrapper ..."
   i.p.v. alleen ".wpbs-main-wrapper ...") plus !important, zodat onze regel
   altijd hoger scoort, ongeacht de volgorde. Legenda-/selectiekleuren in
   wpbs_settings/pd0n_wpbs_legend_items (DB) blijven ongewijzigd; alleen het
   zichtbare resultaat verandert via CSS. */

/* Het losse lichtgrijze vlak (#BDC3C7) achter kalender+formulier komt niet
   van WPBS zelf maar van de Elementor-widget se eigen Style-tab-achtergrond
   (_background_color), woordelijk overgenomen uit de oude pagina (taak 6) —
   .elementor-widget-container is hier altijd de directe wrapper van de
   WPBS-widget zelf, dus dit blijft "alleen WPBS-klassen en de wrapper". */
.wpbs-cal-wrap .elementor-widget-container{ background:transparent !important; }

/* Geen los grijs/wit vlak meer: kalender, legenda en dagvakjes staan direct
   op de sectie-achtergrond. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendars .wpbs-calendar,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-legend{
	background:transparent !important;
	border:0 !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendars .wpbs-calendar-wrapper{ padding:0 !important; }
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendars .wpbs-calendar table td .wpbs-date.wpbs-gap{ background:transparent !important; }

/* Kalenderkop: maandtitel in Marcellus, dunne onderlijn i.p.v. grijs vlak. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header{
	background:transparent !important;
	padding:4px 8px 16px;
	border-bottom:1px solid rgba(184,149,90,.35);
	margin-bottom:8px;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation{
	font-family:"Marcellus", serif;
	font-size:18px;
	letter-spacing:.01em;
	color:var(--e-global-color-perkament);
	text-transform:capitalize;
}

/* Navigatiepijlen: dunne cirkel in Messing i.p.v. grijze vierkantjes; op
   mobiel 44px tikdoel. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation .wpbs-prev,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation .wpbs-next{
	background:transparent !important;
	border:1px solid rgba(184,149,90,.5) !important;
	border-radius:50% !important;
	width:32px !important;
	height:32px !important;
	margin:-16px 0 0 0 !important;
	transition:background .15s, border-color .15s;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation .wpbs-prev:hover,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation .wpbs-next:hover{
	background:rgba(184,149,90,.18) !important;
	border-color:var(--e-global-color-accent) !important;
	opacity:1 !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation .wpbs-prev .wpbs-arrow{
	border-color:transparent var(--e-global-color-accent) transparent transparent !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation .wpbs-next .wpbs-arrow{
	border-color:transparent transparent transparent var(--e-global-color-accent) !important;
}
@media(max-width:767px){
	.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation{ padding:0 44px; min-height:44px; }
	.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation .wpbs-prev,
	.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendar-header-navigation .wpbs-next{ width:44px !important; height:44px !important; margin-top:-22px !important; }
}

/* Maandkeuze-dropdown (andere weergaven). */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-select-container select{
	background:var(--e-global-color-kalk-licht) !important;
	color:var(--e-global-color-text) !important;
	border:1px solid rgba(184,149,90,.5) !important;
	border-radius:0 !important;
	font-family:"Source Sans 3", sans-serif !important;
}

/* Dagnummers: Source Sans 3, standaard perkament (normale dag op de donkere
   sectie). */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-calendars .wpbs-calendar table tr td .wpbs-date-inner .wpbs-date-number{
	font-family:"Source Sans 3", sans-serif;
	color:var(--e-global-color-perkament);
}

/* Legenda-kleuren (oud -> nieuw, alleen CSS; DB-waarden #ddffcc/#ffc0bd in
   pd0n_wpbs_legend_items blijven ongewijzigd staan): "Beschikbaar"
   (legend-item 5/9/13) van fel lichtgroen naar Kalk licht met donkere tekst
   (contrast 13,5:1); "Geboekt" (6/10/14) van fel roze naar een gedempt
   terracotta #7A4D3B met de standaard perkament-tekst (contrast 5,6:1) —
   beide ruim boven WCAG AA. "Wisseldag 1/2" (7-8/11-12/15-16, halve cel per
   kleur) hergebruiken dezelfde twee kleuren in de juiste helft. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-5 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-9 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-13 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-7 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-11 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-15 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-8 div:nth-of-type(2),
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-12 div:nth-of-type(2),
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-16 div:nth-of-type(2){
	background-color:var(--e-global-color-kalk-licht) !important;
}
/* Wisseldag (data-type="split"): de kleur komt niet van de div-achtergrond
   maar van een SVG-driehoek erin (fill), los van background-color — zonder
   deze regel bleven Wisseldag-cellen dus toch WPBS' eigen roze/groen tonen,
   ook al was de "gewone" Beschikbaar/Geboekt-kleur al goed. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-5 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-9 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-13 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-7 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-11 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-15 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-8 div:nth-of-type(2) svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-12 div:nth-of-type(2) svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-16 div:nth-of-type(2) svg{
	fill:var(--e-global-color-kalk-licht) !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-6 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-10 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-14 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-8 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-12 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-16 div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-7 div:nth-of-type(2),
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-11 div:nth-of-type(2),
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-15 div:nth-of-type(2){
	background-color:#7A4D3B !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-6 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-10 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-14 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-8 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-12 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-16 div:first-of-type svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-7 div:nth-of-type(2) svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-11 div:nth-of-type(2) svg,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-15 div:nth-of-type(2) svg{
	fill:#7A4D3B !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-date.wpbs-legend-item-5 .wpbs-date-number,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-date.wpbs-legend-item-9 .wpbs-date-number,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-date.wpbs-legend-item-13 .wpbs-date-number{
	color:var(--e-global-color-primary) !important;
}

/* Vandaag: dunne ring in Messing i.p.v. het felle blauw van de plugin-default. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-date-today:not(.wpbs-date-hover):not(.wpbs-date-selected) .wpbs-legend-item-icon{
	border:2px solid var(--e-global-color-accent) !important;
}

/* Dagen in het verleden: subtiel, niet dominant. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-legend-item-icon-0 div:first-of-type{
	background-color:rgba(154,163,148,.25) !important;
}

/* Geselecteerde periode + hover: in de accentkleur (Messing), donkere tekst
   voor voldoende contrast op het lichtere accentvlak. Bewust zonder de
   :not(.wpbs-selected-first):not(.wpbs-selected-last)-uitzonderingen die
   WPBS zelf gebruikt, zodat begin/eind/tussenliggende dagen van een
   meerdaagse periode allemaal dezelfde accentkleur krijgen. */
.wpbs-cal-wrap .wpbs-main-wrapper:not(.wpbs-main-wrapper-form-0) .wpbs-container .wpbs-date-selected .wpbs-legend-item-icon div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper:not(.wpbs-main-wrapper-form-0) .wpbs-container .wpbs-enable-hover .wpbs-is-bookable:hover .wpbs-legend-item-icon div:first-of-type,
.wpbs-cal-wrap .wpbs-main-wrapper:not(.wpbs-main-wrapper-form-0) .wpbs-container .wpbs-date-hover .wpbs-legend-item-icon div:first-of-type{
	background-color:var(--e-global-color-accent) !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-date-selected .wpbs-date-number,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-container .wpbs-date-hover .wpbs-date-number{
	color:var(--e-global-color-primary) !important;
}

/* Legenda-lijst (Beschikbaar/Geboekt onder de kalender): dunne rij i.p.v. wit vak. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-legend{ padding:12px 0 0; }
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-legend .wpbs-legend-item-name{
	font-family:"Source Sans 3", sans-serif;
	color:var(--e-global-color-perkament);
	font-size:14px;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-legend .wpbs-legend-item-icon{ border-radius:50%; overflow:hidden; }

/* Tooltip (prijs/info per dag bij hover). */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-tooltip{
	background:var(--e-global-color-kalk-licht) !important;
	color:var(--e-global-color-text) !important;
	border:1px solid rgba(184,149,90,.4) !important;
	box-shadow:0 4px 14px rgba(0,0,0,.18) !important;
	font-family:"Source Sans 3", sans-serif !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-tooltip-corner{
	border-color:transparent var(--e-global-color-kalk-licht) transparent transparent !important;
}

/* ---- Formulier: velden, boekknop en prijstabel zoals elders op de site --- */

/* WPBS zet zelf ".wpbs-main-wrapper .wpbs-form-container{color:#000}" (geen
   !important, form_styling-optie) — zonder override erft alle tekst die geen
   eigen kleurregel heeft (bv. "Selecteer eerst een datum.", vóór het kiezen
   van data) zwart op de donkere sectie, onleesbaar. Eén laag ancestor-klasse
   extra is hier al genoeg (geen !important-wedloop nodig, WPBS' eigen regel
   heeft er zelf ook geen op deze specifieke selector). */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container{ font-family:"Source Sans 3", sans-serif; color:var(--e-global-color-perkament); }

.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field label,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field .wpbs-form-field-label span{
	color:var(--e-global-color-perkament) !important;
	font-family:"Source Sans 3", sans-serif !important;
	font-size:15px !important;
}

.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field input[type="text"],
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field input[type="email"],
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field input[type="number"],
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field select,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field textarea,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field .iti input{
	background-color:var(--e-global-color-kalk-licht) !important;
	color:var(--e-global-color-text) !important;
	border:1px solid rgba(184,149,90,.4) !important;
	border-radius:0 !important;
	font-family:"Source Sans 3", sans-serif !important;
	min-height:44px !important;
}

.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-number-stylised-ui button{
	background:transparent !important;
	border:1px solid rgba(184,149,90,.4) !important;
	min-width:32px !important;
	min-height:32px !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-number-stylised-ui button:before,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-number-stylised-ui button:after{ background:var(--e-global-color-accent) !important; }
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-number-stylised-ui button:hover{ background:rgba(184,149,90,.18) !important; }
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-number-stylised-ui button:hover:before,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-number-stylised-ui button:hover:after{ background:var(--e-global-color-primary) !important; }

/* Betaalmethode (alleen Mollie actief): als een kaart i.p.v. een kale radio. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-field-payment_method .wpbs-form-field-input label{
	border:1px solid rgba(184,149,90,.4);
	padding:14px 16px;
	color:var(--e-global-color-perkament);
	min-height:44px;
	box-sizing:border-box;
	display:flex;
	align-items:center;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-payment-method-description{
	color:var(--e-global-color-mosgrijs) !important;
	font-size:14px;
}

/* Foutmeldingen / veldbeschrijvingen. */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-field-error small{ color:#e2a58a !important; }
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-field-description small{ color:var(--e-global-color-mosgrijs) !important; }

/* Geselecteerde data (start-/einddatum-samenvatting boven het formulier). */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-selected-date label{
	color:var(--e-global-color-mosgrijs) !important;
	font-family:"Source Sans 3", sans-serif !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-selected-date .wpbs-form-field-input{
	color:var(--e-global-color-perkament) !important;
	font-family:"Marcellus", serif !important;
	font-size:20px !important;
}

/* Prijstabel. */
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table{
	border-radius:0 !important;
	border-spacing:0 !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table thead th,
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table th,
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table td{
	background:transparent !important;
	border-bottom:1px solid rgba(184,149,90,.25) !important;
	color:var(--e-global-color-perkament) !important;
	font-family:"Source Sans 3", sans-serif !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table th:first-child,
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table td:first-child{ border-right:0 !important; }
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table tr.wpbs-line-item-total td,
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table tr.wpbs-line-item-subtotal td{
	background:transparent !important;
	color:var(--e-global-color-accent) !important;
	font-family:"Source Sans 3", sans-serif !important;
	font-weight:600 !important;
	font-size:19px !important;
	border-top:1px solid rgba(184,149,90,.4) !important;
}
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table tr td small.wpbs-line-item-description{ color:var(--e-global-color-mosgrijs) !important; }
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table tr td a.wpbs-show-price-breakdown-toggle{ color:var(--e-global-color-mosgrijs) !important; }
.wpbs-cal-wrap .wpbs-main-wrapper table.wpbs-pricing-table tr td a.wpbs-show-price-breakdown-toggle:after{ border-color:var(--e-global-color-mosgrijs) !important; }

/* Boekknop: dezelfde primaire knop als de rest van de site (Kit Theme Style
   Buttons, tasks/notes-bouw.md taak 2 — Messing-vlak, rechte hoeken). */
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-submit-button input[type="submit"],
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-submit-button button{
	background:var(--e-global-color-accent) !important;
	color:var(--e-global-color-primary) !important;
	border:1px solid var(--e-global-color-accent) !important;
	border-radius:0 !important;
	padding:16px 28px !important;
	font:600 15px/1 "Source Sans 3", sans-serif !important;
	letter-spacing:.02em;
	min-height:44px !important;
	width:100%;
	cursor:pointer;
}
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-submit-button input[type="submit"]:hover,
.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-submit-button button:hover{
	background:#c9a86e !important;
	border-color:#c9a86e !important;
}

@media(max-width:767px){
	/* 16px voorkomt auto-zoom in iOS Safari bij het focussen van een veld. */
	.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field input,
	.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field select,
	.wpbs-cal-wrap .wpbs-main-wrapper .wpbs-form-container .wpbs-form-field textarea{ font-size:16px !important; }
}

/* Groepenpagina (2026-09-25, verzoek Joost): opvallende acties (CTA's) als
   knop i.p.v. onderstreepte tekstlink. .text-link--btn is een modifier op
   .text-link: zelfde currentColor-truc als de secundaire (omlijnde)
   Button-widget-stijl uit de Kit (transparante achtergrond, 1px rand,
   rechte hoeken, 16px/28px padding — zie tasks/notes-bouw.md taak 2), maar
   dan op een gewone tekstlink/kaartlink. Nodig voor de .stay-card-kaarten:
   de kaart zelf is al één <a>-container (html_tag:"a"), dus een losse
   Button-widget ernaast zou een <a> in een <a> nesten — in plaats daarvan
   krijgt de bestaande "Bekijk …"-tekstlink dit knop-uiterlijk.
   Andere pagina's kunnen deze klasse hergebruiken voor een CTA die door een
   al-klikbare kaart/container heen moet. */
.text-link--btn,a.text-link--btn{ display:inline-block; text-decoration:none; border:1px solid currentColor; padding:16px 28px; font-weight:600; letter-spacing:.02em; }
.text-link--btn:hover,a.text-link--btn:hover{ text-decoration:none; }

/* ==========================================================================
   Datumkiezer (optie C, shortcode [boscau_kiezer], theme/js/boscau-kiezer.js)
   ==========================================================================
   Eigen luxe datumkiezer op de verblijfpagina's, in de plaats van de zichtbare
   WPBS-widget: twee maanden naast elkaar, ronde selectie, rustige typografie
   — zie mockup/kalender-opties/optie-c.html (goedgekeurd ontwerp) en
   scratchpad/notes-kiezer-c.md. De echte WPBS-kalender+formulier zit nog
   steeds in de DOM (".boscau-kiezer-source"), maar onzichtbaar: dat is de
   bron van waarheid voor beschikbaarheid/validatie/prijs (zie het script),
   deze CSS stijlt alleen de eigen kopie eromheen. */
.boscau-kiezer{ max-width:900px; margin-inline:auto; }
/* Verbeterronde /reserveren/ v2: op de verblijfpagina's blijft de kiezer een
   smalle, gecentreerde kaart (900px, ongewijzigd, al goedgekeurd) — maar in de
   stappen-wizard moet de kalender de volle containerbreedte gebruiken (dezelfde
   uitlijnlijn als de kop "Verblijf en data" en de drie kaarten, ±1100-1280px),
   anders proppen twee maanden in een veel te smal kaartje (was ±400px, dagen
   die tegen elkaar aan staan, maandtitel brak over 2 regels — gerapporteerd na
   de eerste ronde). */
.boscau-kiezer[data-stappen]{ max-width:none; margin-inline:0; }

/* Verbeterronde — "no-js"-terugval: STANDAARD (geen JavaScript, of nog niet
   geladen) is de eigen opmaak verborgen en de échte WPBS-kalender (en, op
   /reserveren/, het formulier) gewoon zichtbaar — precies zoals de rest van
   de site zonder JS al werkt. Zodra theme/functions.php's inline scriptje
   de klasse "js" op <html> zet (zie wp_head, prioriteit 1 — vóór deze CSS
   ooit kan renderen), schakelt alles hieronder om naar de eigen kiezer. */
.boscau-kiezer-legend,.boscau-kiezer-wrap,.boscau-kiezer-summary,.boscau-kiezer-note,.boscau-kiezer-hint{ display:none; }
.js .boscau-kiezer-legend{ display:flex; }
.js .boscau-kiezer-wrap{ display:block; }
.js .boscau-kiezer-summary{ display:flex; }
.js .boscau-kiezer-note{ display:block; }
.js .boscau-kiezer-hint{ display:block; }
/* /reserveren/ v2: de stap-2-balk (compacte samenvatting + "Wijzig") bestaat
   alleen zinvol met JS (zonder JS staat gewoon alles — kalender én formulier —
   van alle drie de verblijven na elkaar, zoals vóór deze taak); zie het blok
   "Stap-reserveren" verderop voor wanneer hij precies verschijnt. */
.boscau-kiezer-step2bar{ display:none; }

.js .boscau-kiezer-source{
	position:absolute;
	left:-99999px;
	top:0;
	width:640px;
	visibility:hidden;
	pointer-events:none;
}
/* /reserveren/ (tonen_formulier="1"): alléén de kalender verborgen, het
   échte WPBS-formulier (velden, prijstabel, boekknop) blijft zichtbaar en
   normaal bruikbaar/toegankelijk — daar wordt geboekt en betaald. */
.js .boscau-kiezer-source--met-formulier{ position:static; left:auto; top:auto; width:auto; visibility:visible; pointer-events:auto; }
.js .boscau-kiezer-source--met-formulier .wpbs-container{ position:absolute; left:-99999px; top:0; visibility:hidden; pointer-events:none; }
/* De verborgen WPBS-kalender ook uit de Tab-volgorde en de toegankelijkheidsboom: WPBS zet na het opbouwen
   zelf een inline visibility:visible op de container (resize-functie in script-front-end.js), en die won van de
   regels hierboven: 37 onzichtbare Tab-stops en een tweede kalender voor schermlezers (verificatie 2026-10-11).
   De kiezer stuurt hem met jQuery-triggers aan; die werken op een verborgen element gewoon. */
.js .boscau-kiezer-source .wpbs-container{ visibility:hidden !important; }

/* Laatste ronde: GEEN eigen kleur meer hier (was hardcoded perkament, dus
   onleesbaar toen de kiezer voor het eerst ook op een LICHTE /reserveren/-
   sectie ging staan, Louis IX — leeg getest, bijna onzichtbare tekst). Een
   <ul> erft nu gewoon de omringende tekstkleur: perkament op een donkere
   sectie (".on-dark,.surface-dark{color:perkament}" hierboven, gewoon via
   CSS-overerving, geen aparte regel nodig) en de normale donkere tekstkleur
   op een lichte sectie. Zelfde aanpak als .boscau-kiezer-hint hieronder. */
/* Geen "display:flex" hier (alleen de overige opmaak): dat hoort al bij de
   no-js-omschakeling helemaal bovenaan dit CSS-blok (".js .boscau-kiezer-
   legend{display:flex}") — stond hier per ongeluk óók, met gelijke
   specificiteit maar later in het bestand, dus won het altijd de tiebreak en
   bleef de legenda (en, hieronder, de samenvatting) zichtbaar zónder JS,
   boven op de gewone WPBS-kalender. Bug gevonden tijdens het no-js-testen
   van /reserveren/ v2 (stappen="1"); gefixt hier zodat het ook de
   verblijfpagina's (bestaande [boscau_kiezer]-gebruik) verbetert, niet alleen
   deze taak. */
.boscau-kiezer-legend{ flex-wrap:wrap; gap:10px 24px; list-style:none; margin:0 0 28px; padding:0; font-size:14px; }
.boscau-kiezer-legend li{ display:flex; align-items:center; gap:8px; }
.bk-swatch{ width:14px; height:14px; border-radius:3px; display:inline-block; flex-shrink:0; }
/* Rand nodig: een lichte kalk-licht-vulling is op een lichte sectie
   (Louis IX op /reserveren/) anders bijna onzichtbaar tegen de vergelijkbaar
   lichte achtergrond. */
.bk-swatch--available{ background:var(--e-global-color-kalk-licht); border:1px solid var(--e-global-color-olijf); }
/* Laatste ronde: geen apart wisseldag-legend-item meer (zie de toelichting bij
   .bk-day--unavailable hieronder) — de legenda toont nu alleen "Beschikbaar"
   en een doorgestreept cijfer-voorbeeld voor "Niet beschikbaar", exact dezelfde
   opmaak als een echte niet-beschikbare dagcel. */
.bk-legend-sample{ display:inline-flex; align-items:center; justify-content:center; width:20px; height:20px; font:14px/1 "Source Sans 3", sans-serif; color:var(--e-global-color-mosgrijs); text-decoration:line-through; flex-shrink:0; }

/* Laatste ronde: korte, stap-afhankelijke hulpregel boven de kalender
   ("Kies je aankomstdatum."/"Kies je vertrekdatum.", zie updateHint() in
   theme/js/boscau-kiezer.js). Staat, anders dan .boscau-kiezer-note/
   .boscau-kiezer-preselect-note, nog VÓÓR de lichte kaart (.boscau-kiezer-
   wrap) — dus direct op de sectie-achtergrond, die per verblijf donker
   (Gilles/Jean, .surface-dark) of licht (Louis IX) is. Geen eigen kleur
   opleggen: de bestaande ".surface-dark p{color:perkament!important}"-regel
   (bovenin dit bestand) regelt de donkere secties al correct, en op de
   lichte sectie geldt gewoon de normale, donkere tekstkleur. */
.boscau-kiezer .boscau-kiezer-hint{ max-width:900px; margin:0 auto 12px; font-size:15px; font-weight:600; }
.boscau-kiezer[data-stappen] .boscau-kiezer-hint{ max-width:none; margin-left:0; margin-right:0; }

.boscau-kiezer-wrap{ background:var(--e-global-color-kalk-licht); border:1px solid rgba(184,149,90,.4); }
.boscau-kiezer-nav-row{ display:flex; justify-content:space-between; align-items:center; padding:20px 20px 0; }
.boscau-kiezer-grid{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); }
/* Reserveren mobiel: directe feedback tijdens een maandwissel (theme/js/
   boscau-kiezer.js "navigate()" zet dit attribuut vanaf de klik tot de echte
   WPBS-AJAX-respons geland is — gemeten 400-1300ms, ruim voelbaar zonder
   feedback). "pointer-events:none" is de eigenlijke fix (voorkomt een
   dagklik op de nog-oude grid tijdens de wissel, zie tasks/notes-bouw.md
   "Reserveren mobiel"); de opacity is alleen het zichtbare signaal erbij. */
.boscau-kiezer-grid[aria-busy="true"]{ opacity:.5; pointer-events:none; }
.boscau-kiezer-month{ padding:12px 32px 36px; }
.boscau-kiezer-month+.boscau-kiezer-month{ border-left:1px solid rgba(184,149,90,.25); }
/* Verbeterronde: de maandtitel komt letterlijk van WPBS ("September 2026")
   en werd (a) bijna onleesbaar (de ".surface-dark h3{color:perkament
   !important}"-cascaderegel elders in dit bestand won van een gewone
   kleurdeclaratie — vandaar hier ook !important, en later in het bestand
   zodat de volgorde-tiebreak de juiste kant op valt) en (b) cijfers in
   Marcellus lezen als een hoofdletter O ("2O26") — vandaar Source Sans 3
   voor de hele titel i.p.v. alleen de cijfers. */
.boscau-kiezer-month h3{ font-family:"Source Sans 3", sans-serif; font-size:20px; font-weight:600; text-align:center; margin-bottom:24px; color:var(--e-global-color-primary) !important; text-transform:capitalize; }
/* Maandsprong (2026-10-11): de eerste maandtitel is een keuzelijst "Ga naar maand" (boscau-kiezer.js,
   renderKop). Beide koppen even hoog, zodat de dagen van de twee maanden gelijk blijven lopen. */
.boscau-kiezer .bk-maandkop{ display:flex; align-items:center; justify-content:center; min-height:44px; margin-bottom:18px; }
.boscau-kiezer .bk-maandkop h3{ margin:0; }
.boscau-kiezer .bk-maandkeuze{
	appearance:none; -webkit-appearance:none; max-width:100%; min-height:44px; margin:0; padding:6px 40px 6px 16px;
	font:600 20px/1.2 "Source Sans 3", sans-serif; color:var(--e-global-color-primary); text-transform:capitalize; cursor:pointer;
	border:1px solid var(--e-global-color-olijf); border-radius:0;
	background:transparent url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5l5 5 5-5' fill='none' stroke='%233E4A36' stroke-width='1.6'/%3E%3C/svg%3E") no-repeat right 14px center / 12px 8px;
}
.boscau-kiezer .bk-maandkeuze:hover{ background-color:rgba(62,74,54,.06); }
.bk-weekdays{ display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); text-align:center; font-size:12px; color:var(--e-global-color-olijf); text-transform:uppercase; letter-spacing:.05em; margin-bottom:8px; }
.bk-days{ display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); row-gap:4px; }

/* Specificiteit: de Kit se Theme-Style-knopregel is ".elementor-kit-1964
   button" (element+klasse, specificiteit 0-1-1) — hoger dan een kale
   ".bk-day"/".boscau-kiezer-nav" (0-1-0), dus die zou zonder de extra
   ".boscau-kiezer"-ankerklasse hier (0-2-0) gewoon verliezen: elke <button>
   kreeg zo de Kit se Messing-vlak-en-16/28px-padding-stijl overgeplakt,
   geverifieerd via de Browser-pane (dezelfde valkuil/oplossing als het
   bestaande WPBS-kalender-CSS-blok hierboven). */
.boscau-kiezer .boscau-kiezer-nav{ width:44px; height:44px; border-radius:50%; border:1px solid var(--e-global-color-olijf); background:transparent; color:var(--e-global-color-olijf); cursor:pointer; font-size:16px; padding:0; }
.boscau-kiezer .boscau-kiezer-nav:hover:not(:disabled){ background:var(--e-global-color-olijf); color:var(--e-global-color-kalk-licht); }
.boscau-kiezer .boscau-kiezer-nav:disabled{ opacity:.25; cursor:default; }
.boscau-kiezer .bk-day{
	position:relative;
	aspect-ratio:1;
	display:flex;
	align-items:center;
	justify-content:center;
	margin:0 auto;
	width:100%;
	min-width:44px;
	min-height:44px;
	padding:0;
	font:16px/1 "Source Sans 3", sans-serif;
	color:var(--e-global-color-text);
	background:transparent;
	border:0;
	border-radius:50%;
	cursor:pointer;
	transition:background .15s ease, color .15s ease;
}
.boscau-kiezer .bk-day--empty{ cursor:default; }
/* Laatste ronde: Joost vond de halve-cirkel-wisseldagvulling onduidelijk EN
   ze rendeerde zichtbaar kapot (leeg getest: een reproductie buiten de
   kalender om liet zien dat "border-radius:50%" niet correct clipt zodra
   hetzelfde element ook "aspect-ratio:1" én een gradient-achtergrond heeft —
   een Chromium-eigenaardigheid, geen CSS-typefout — waardoor de vulling als
   een scheve, los "blaadje" naast het cijfer viel i.p.v. een nette halve
   cirkel). Nieuwe, simpelere aanpak, geen wisseldag-specifieke opmaak meer:
   één "niet beschikbaar"-stijl (gedempt + doorgestreept) voor élke dag die in
   de HUIDIGE stap niet gekozen kan worden — verstreken, bezet, of (via
   annotateAvailability() in theme/js/boscau-kiezer.js) een wisseldag die in
   deze stap de verkeerde rol heeft, of een dag voorbij de eerste bezette
   nacht na de gekozen aankomst. Precies welke dagen dat zijn verandert dus
   per stap (aankomst kiezen vs. vertrek kiezen); de opmaak zelf niet. */
.boscau-kiezer button.bk-day--unavailable{ color:var(--e-global-color-mosgrijs); opacity:.55; cursor:not-allowed; text-decoration:line-through; text-decoration-color:rgba(38,48,42,.4); }
.boscau-kiezer button.bk-day--available:hover{ background:rgba(184,149,90,.28); }
.boscau-kiezer .bk-day--in-range{ background:rgba(184,149,90,.22); border-radius:0; }
.boscau-kiezer .bk-day--start, .boscau-kiezer .bk-day--end{ background:var(--e-global-color-primary) !important; color:var(--e-global-color-perkament) !important; }
.boscau-kiezer .bk-day--start{ border-radius:50% 0 0 50%; }
.boscau-kiezer .bk-day--end{ border-radius:0 50% 50%; }
.boscau-kiezer .bk-day--start.bk-day--end{ border-radius:50%; }
.boscau-kiezer .bk-day:focus-visible{ outline:2px solid var(--e-global-color-primary); outline-offset:2px; }
/* Prijs per nacht onder het dagnummer (feedback 2026-10, punt 12). De prijs
   komt van WPBS zelf (show_prices), theme/js/boscau-kiezer.js leest hem af. */
.boscau-kiezer .bk-day--met-prijs{ flex-direction:column; gap:3px; }
.boscau-kiezer .bk-day-prijs{ font-size:11px; line-height:1; color:var(--e-global-color-primary); opacity:.8; font-variant-numeric:tabular-nums; white-space:nowrap; }
.boscau-kiezer .bk-day--start .bk-day-prijs, .boscau-kiezer .bk-day--end .bk-day-prijs{ color:inherit; opacity:.9; }
/* Regels boven de kalender (minimaal aantal nachten, zaterdag-wissel in het
   hoogseizoen), opgebouwd uit de WPBS-instellingen (theme/functions.php). */
.boscau-kiezer .boscau-kiezer-regels{ max-width:900px; margin:0 auto 12px; font-size:15px; }
.boscau-kiezer[data-stappen] .boscau-kiezer-regels{ max-width:none; margin-left:0; margin-right:0; }
/* Mobiel (zelfde breakpoint als de rest van de site, 767px): één maand
   tegelijk i.p.v. twee naast elkaar, bladeren met dezelfde vorige/volgende-
   knoppen (die schuiven de kalender toch al één maand per keer op, zie
   theme/js/boscau-kiezer.js "navigate" — de tweede maand blijft in de DOM
   staan, alleen visueel verborgen, dus geen aparte mobiele bladerlogica
   nodig). */
@media(max-width:767px){
	.boscau-kiezer-grid{ grid-template-columns:minmax(0,1fr); }
	.boscau-kiezer-month[data-bk-month="1"]{ display:none; }
	.boscau-kiezer-month{ padding:12px 12px 24px; }
}

/* Zelfde bug/fix als ".boscau-kiezer-legend" hierboven: geen "display" hier,
   dat regelt ".js .boscau-kiezer-summary" al. */
.boscau-kiezer-summary{
	max-width:900px;
	margin:32px auto 0;
	background:var(--e-global-color-kalk-licht);
	border:1px solid rgba(184,149,90,.4);
	padding:28px 32px;
	align-items:center;
	gap:32px;
	flex-wrap:wrap;
}
.boscau-kiezer-summary-dates{ display:flex; gap:20px; flex:1; min-width:0; }
.boscau-kiezer-summary-dates div{ min-width:0; }
.boscau-kiezer-summary-dates div span{ display:block; font-size:12px; text-transform:uppercase; letter-spacing:.04em; color:var(--e-global-color-olijf); margin-bottom:4px; white-space:nowrap; }
/* Verbeterronde: datums/bedragen in Source Sans 3 (niet Marcellus — cijfers
   lezen daarin onduidelijk, zie de maandtitel hierboven) en een kortere
   notatie ("28 sep 2026" i.p.v. "28 september 2026", zie formatDateShortNL()
   in theme/js/boscau-kiezer.js) zodat het op één regel past. */
.boscau-kiezer-summary-dates div strong{ font-family:"Source Sans 3", sans-serif; font-size:18px; font-weight:600; color:var(--e-global-color-primary); white-space:nowrap; }
.boscau-kiezer-summary-total{ text-align:right; }
.boscau-kiezer-summary-total span{ display:block; font-size:12px; text-transform:uppercase; letter-spacing:.04em; color:var(--e-global-color-olijf); }
.boscau-kiezer-summary-total strong{ font-family:"Source Sans 3", sans-serif; font-size:24px; font-weight:600; color:var(--e-global-color-primary); white-space:nowrap; }
.boscau-kiezer-continue{ margin-left:auto; min-height:44px; flex-shrink:0; }
.boscau-kiezer-continue:disabled{ opacity:.5; cursor:not-allowed; }
.boscau-kiezer-note,.boscau-kiezer-preselect-note{ max-width:900px; margin:14px auto 0; font-size:14px; color:var(--e-global-color-olijf); min-height:1.4em; }
/* Weigering ("Kies minimaal 2 nachten", zaterdagregel in het hoogseizoen): groter en duidelijk (feedback Bob
   2026-10-19). Terracotta van de legenda ("Geboekt") op een lichte tint, contrast ±6:1; !important wint van
   ".on-dark p" (verblijfpagina's), anders licht op licht. */
.boscau-kiezer-note.is-fout{ font-size:17px; font-weight:600; line-height:1.4; color:#7A4D3B !important; background:#F6E9E2; border-left:4px solid #7A4D3B; border-radius:3px; padding:10px 14px; }
/* Mobiel: een simpele rij (Aankomst/Vertrek/Nachten) paste bij 390px niet
   meer zonder af te snijden ("NACHTEN" viel buiten beeld) — een 2-koloms
   raster (Aankomst+Vertrek boven, Nachten+Totaal eronder) heeft altijd
   genoeg ruimte, met de knop als volle-breedte rij eronder. */
@media(max-width:640px){
	/* ".js" nodig: zonder JS moet ".boscau-kiezer-summary" op display:none
	   blijven staan (zie de no-js-omschakeling bovenaan dit CSS-blok) — zonder
	   deze scoping had "display:grid" hier altijd voorrang (gelijke
	   specificiteit, later in het bestand), ook zonder JS. */
	.js .boscau-kiezer-summary{ display:grid; grid-template-columns:1fr 1fr; column-gap:16px; row-gap:16px; align-items:start; }
	.boscau-kiezer-summary-dates{ display:contents; }
	.boscau-kiezer-summary-total{ text-align:left; }
	.boscau-kiezer-continue{ grid-column:1 / -1; margin-left:0; width:100%; }
}

/* Laatste ronde: /reserveren/ per verblijf herbouwd van een 2-koloms grid
   (kiezer in een smal ±520px-kolommetje, foto ernaast fors uitvergroot/wazig
   — zie scratchpad/notes-kiezer-c.md "Laatste ronde") naar één volle-breedte
   kolom: sectiekop (naam + korte tekst, met een kleine 220×150-foto ernaast —
   nooit groter dan de bronresolutie, zie elementor/reserveren.json rv*img)
   → de kiezer op volle containerbreedte (zelfde ".boscau-kiezer{max-
   width:900px}" als op de verblijfpagina's, twee maanden naast elkaar) →
   samenvatting → het échte WPBS-formulier. De oude foto-hoogte-hack
   (.elementor-element-rv*img{height:100%}) is daarmee vervallen: er is geen
   lange rechterkolom meer om te vullen. */
.boscau-kiezer .boscau-kiezer-source--met-formulier{
	max-width:760px;
	margin:24px auto 0;
}
/* WPBS' eigen plugin-CSS zet zelf al ".wpbs-main-wrapper .wpbs-form-container
   {max-width:450px}" (style-front-end.min.css, bedoeld voor de oorspronkelijke
   smalle widget) — dat liet het échte formulier hierboven als een smal
   eilandje midden in de 760px-kolom staan i.p.v. 'm te vullen. Onze eigen
   selector is specifieker (0-3-0 tegen 0-2-0), dus geen !important nodig. */
.boscau-kiezer .boscau-kiezer-source--met-formulier .wpbs-form-container{ max-width:none; }

/* /reserveren/ v2 (stappen="1"): het échte WPBS-formulier zit hier altijd op
   een LICHTE sectie (het hele boekingsdeel is nu één lichte achtergrond, zie
   plan-reserveren.md #7) — het bestaande ".wpbs-form-container{color:
   perkament}"-blok hierboven (nodig op de donkere verblijfpagina's, Gilles/
   Jean) is op licht bijna onleesbaar (perkament-op-kalk-licht, contrast
   ±1,1:1 — leeg getest via getComputedStyle in de Browser-pane). Alleen in
   stappen-modus overschrijven, de verblijfpagina's (geen data-stappen)
   blijven ongewijzigd. */
.boscau-kiezer[data-stappen] .wpbs-form-container{ color:var(--e-global-color-text) !important; }
/* Specificiteit: het bestaande label-blok hierboven is óók !important met
   4 klassen + element (0-4-1) — bij twee !important-regels wint niet de
   laatste in het bestand maar de hoogste specificiteit, dus hier de volledige,
   echte DOM-keten (boscau-kiezer → boscau-kiezer-source--met-formulier →
   wpbs-form-container → wpbs-form-field) i.p.v. een kortere sluiproute, zodat
   dit ruim boven de (0-4-1)/(0-5-1) van het bestaande blok uitkomt. */
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier .wpbs-form-container .wpbs-form-field label,
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier .wpbs-form-container .wpbs-form-field .wpbs-form-field-label span{
	color:var(--e-global-color-text) !important;
}
/* Zelfde reden: de prijstabel-, omschrijvings- en foutkleuren hierboven zijn
   ook allemaal gekozen vóór een donkere achtergrond (perkament/accent/
   mosgrijs/koraal) — leeg gemeten in de Browser-pane, alle vier ruim onder
   4,5:1 op Kalk licht (perkament ±1,1:1, accent ±2,6:1, mosgrijs ±2,4:1,
   koraal ±1,9:1). Vervangen door bestaande, donkere paletkleuren die al elders
   op een lichte sectie bewezen zijn: tekst/olijf (net als deze pagina's eigen
   ".boscau-kiezer-note"/".boscau-kiezer-hint") en de terracotta uit de
   kalenderlegenda ("Geboekt", ±6,4:1 op Kalk licht) voor foutmeldingen. */
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier table.wpbs-pricing-table thead th,
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier table.wpbs-pricing-table th,
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier table.wpbs-pricing-table td{
	color:var(--e-global-color-text) !important;
}
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier table.wpbs-pricing-table tr.wpbs-line-item-total td,
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier table.wpbs-pricing-table tr.wpbs-line-item-subtotal td{
	color:var(--e-global-color-primary) !important;
}
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier table.wpbs-pricing-table tr td small.wpbs-line-item-description,
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier table.wpbs-pricing-table tr td a.wpbs-show-price-breakdown-toggle,
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier .wpbs-form-field-description small{
	color:var(--e-global-color-olijf) !important;
}
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier table.wpbs-pricing-table tr td a.wpbs-show-price-breakdown-toggle:after{
	border-color:var(--e-global-color-olijf) !important;
}
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier .wpbs-form-field-error small{ color:#7A4D3B !important; }

/* Feedback oktober 2026, punt 13 (aantalvelden maar 1x aan te klikken). WPBS zet bij
   elke prijsherberekening (elke wijziging van een getalveld) een ".wpbs-overlay"
   (position:absolute, 100% x 100%) IN het totaalveld. Dat veld is position:static, dus
   de overlay neemt het hele formulier als referentie en ligt zolang het verzoek loopt
   (op Strato ruim een halve seconde) over ALLE velden heen: elke volgende klik op het
   pijltje wordt opgeslokt en haalt bovendien de focus uit het veld. Het totaalveld zelf
   als referentie geven: spinner en dimmen blijven, maar alleen over het bedrag. */
.wpbs-main-wrapper .wpbs-form-container .wpbs-form-field-total{ position:relative; }

/* Punt 9 (vergeten verplichte velden): foutweergave bij een geweigerde verzending, zie
   theme/js/boscau-reserveren.js. WPBS zet zelf ".wpbs-form-field-has-error" op het veld
   en ".wpbs-form-field-error" in het veld; wij maken er een duidelijke rode rand, een
   leesbare melding en een samenvatting boven de knop van. #B3261E = ±5,7:1 op Kalk licht. */
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier .wpbs-form-container .wpbs-form-field.wpbs-form-field-has-error input,
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier .wpbs-form-container .wpbs-form-field.wpbs-form-field-has-error select,
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier .wpbs-form-container .wpbs-form-field.wpbs-form-field-has-error textarea{
	border-color:#B3261E !important;
	box-shadow:inset 0 0 0 1px #B3261E;
}
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier .wpbs-form-container .wpbs-form-field.wpbs-form-field-has-error .wpbs-form-field-error small{
	color:#B3261E !important;
	font-size:14px;
	font-weight:600;
}
.boscau-kiezer[data-stappen] .boscau-form-samenvatting,
.boscau-kiezer[data-stappen] .boscau-prijs-melding{
	margin:0 0 20px;
	padding:14px 18px;
	background:var(--e-global-color-kalk-licht);
	color:var(--e-global-color-text);
	font-size:15px;
	line-height:1.5;
}
.boscau-kiezer[data-stappen] .boscau-form-samenvatting{ border:1px solid #B3261E; border-left-width:4px; }
.boscau-kiezer[data-stappen] .boscau-form-samenvatting p{ margin:0; font-weight:600; color:#B3261E; }
.boscau-kiezer[data-stappen] .boscau-form-samenvatting ul{ margin:8px 0 0; padding-left:20px; }
.boscau-kiezer[data-stappen] .boscau-form-samenvatting a{ color:var(--e-global-color-text); text-decoration:underline; }
/* Punt 10: rustige melding (geen fout) dat de prijs door een wijziging in het formulier is bijgewerkt. */
.boscau-kiezer[data-stappen] .boscau-prijs-melding{ border:1px solid var(--e-global-color-accent); border-left-width:4px; }
.boscau-kiezer[data-stappen] .boscau-kiezer-source--met-formulier .wpbs-payment-method-description{ color:var(--e-global-color-olijf) !important; }
/* Contrastscript (Browser-pane): dezelfde mosgrijs-op-donker-keuze als
   hierboven, nu voor de EIGEN kiezer-UI (niet de WPBS-bron) — "niet
   beschikbaar"-dagen en het legenda-voorbeeldcijfer waren altijd al mosgrijs
   (prima op de donkere Gilles/Jean-secties), maar op deze pagina staat de
   kiezer nu altijd op Kalk licht. */
.boscau-kiezer[data-stappen] button.bk-day--unavailable{ color:var(--e-global-color-olijf) !important; }
.boscau-kiezer[data-stappen] .bk-legend-sample{ color:var(--e-global-color-olijf) !important; }

/* /reserveren/: korte melding bovenaan de kiezer van het verblijf waarnaar de
   URL-parameters (?verblijf=...&aankomst=...&vertrek=...) verwijzen — alleen
   gevuld/zichtbaar als die er zijn (zie theme/js/boscau-kiezer.js). Stond
   eerder bijna onleesbaar: dezelfde ".on-dark p{color:perkament!important}"
   -cascaderegel (elders in dit bestand, voor de donkere reserveren-secties)
   ving ook dit <p>-element, ondanks de eigen lichte kalk-licht-achtergrond
   — vandaar hier ook een expliciete, latere !important. */
.boscau-kiezer .boscau-kiezer-preselect-note{
	max-width:640px;
	margin:0 0 20px;
	padding:14px 18px;
	background:var(--e-global-color-kalk-licht);
	border:1px solid var(--e-global-color-accent);
	color:var(--e-global-color-text) !important;
	font-size:15px;
}

/* ==========================================================================
   Stap-reserveren (/reserveren/ v2, plan-reserveren.md, shortcode-attribuut
   stappen="1")
   ==========================================================================
   Eén lichte pagina, één kalender tegelijk: drie verblijfkaarten (radiogroep,
   .rv-card) + de kiezer van het gekozen verblijf (stap 1, sticky samenvatting
   naast/onder de kalender) of alleen het échte WPBS-formulier van dat verblijf
   (stap 2). Alle regels hieronder staan bewust onder ".js": zonder JavaScript
   (of vóórdat het geladen is) blijven gewoon alle drie de kalenders + hun
   volledige formulier zichtbaar, na elkaar — precies de bestaande no-js-
   terugval hierboven, ongewijzigd. theme/js/boscau-reserveren.js zet
   data-rv-selected/data-rv-step op .rv-wizard (en, voor de stappenindicator
   boven de kalender, data-rv-step op <body>). Drie verblijven hardgecodeerd
   (zelfde precedent als de legend-item-ID's server-side in
   theme/functions.php) — geen generieke n-verblijven-oplossing nodig. */

/* !important nodig: Elementor's eigen ".e-con.e-child"-basisregel
   (specificiteit 0-2-0, zie assets/css/frontend.min.css) zet zelf al
   "flex-grow/flex-shrink/width" per kind van een flex-container — gelijke of
   hogere specificiteit dan een kale ".rv-cards"/".rv-card"-klasse wint dan
   gewoon de cascade, ondanks dat deze regels ná Elementor's eigen CSS laden
   (zelfde soort tiebreak-valkuil als het bestaande WPBS-kalender-CSS-blok
   hierboven, nu met !important i.p.v. een extra ankerklasse omdat de
   ".e-con.e-child"-regel zelf ook al 2 klassen heeft). */
.rv-cards{ display:grid !important; grid-template-columns:repeat(3,minmax(0,1fr)); gap:24px; margin-bottom:0; }
/* Verblijfkeuze (Joost 2026-10-11, mockup/reserveren-2026-10/verblijfkeuze-aanbevolen.html): wit vlak met
   ronde hoeken en schaduw (zelfde taal als het reviewblok); het keuzevlak .rv-card__keuze is het
   keuzerondje (boscau-reserveren.js), "Foto's en details" staat eronder. Rijen lopen niet over de kaarten
   gelijk (geen subgrid door Elementors widget-omhulsels heen); wel vaste iconen in vaste volgorde. */
.rv-card{
	width:auto !important; position:relative;
	background:#fff; border-radius:16px; overflow:hidden; border:2px solid transparent;
	box-shadow:0 1px 3px rgba(34,51,43,.06), 0 22px 50px -24px rgba(34,51,43,.32);
	transition:box-shadow .2s, border-color .2s;
}
.rv-card__keuze{ position:relative; flex-grow:1 !important; }   /* !important: Elementor zet zelf flex-grow op .e-con.e-child */
.js .rv-card__keuze{ cursor:pointer; }
.rv-card__keuze:focus-visible{ outline:3px solid var(--e-global-color-primary); outline-offset:-5px; }
.rv-card__foto img{ display:block; width:100%; height:auto; aspect-ratio:16/10; object-fit:cover; }
.rv-card__type{ position:absolute; left:16px; top:16px; width:auto !important; }
.rv-card__type p{ margin:0; padding:5px 10px; border-radius:4px; background:rgba(34,51,43,.9); color:var(--e-global-color-perkament) !important; font-size:13px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; line-height:1.3; }
/* Vinkje op de foto van het gekozen verblijf */
.rv-card__keuze::after{
	content:""; position:absolute; right:14px; top:14px; width:40px; height:40px; border-radius:50%; border:3px solid #fff;
	background:var(--e-global-color-primary) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 12'%3E%3Cpath d='M1.5 6.5l4 4 9-9' fill='none' stroke='%23EAE3D2' stroke-width='2.2'/%3E%3C/svg%3E") no-repeat center / 16px 12px;
	opacity:0; transform:scale(.6); transition:opacity .15s, transform .15s; pointer-events:none;
}
.rv-card__keuze[aria-checked="true"]::after{ opacity:1; transform:none; }
.rv-card__naam{ padding:22px 26px 0; }
.rv-card__naam .elementor-heading-title{ font-size:clamp(26px,2.2vw,32px); line-height:1.15; }
.rv-card__sub{ padding:4px 26px 0; }
.rv-card__sub p{ margin:0; font-size:16px; color:var(--e-global-color-olijf) !important; }
.rv-card__feiten{ margin:16px 26px 0; padding-top:16px; border-top:1px solid rgba(62,74,54,.18); width:auto !important; }
.rv-card__feiten .elementor-icon-list-item{ font-size:16px; line-height:1.35; align-items:flex-start !important; }
.rv-card__feiten .elementor-icon-list-item + .elementor-icon-list-item{ margin-top:9px; }
.rv-card__feiten .elementor-icon-list-icon{ width:22px; padding-top:2px; justify-content:center; }
.rv-card__feiten .elementor-icon-list-icon svg{ width:15px; height:15px; }
.rv-card__feiten .elementor-icon-list-text{ align-self:flex-start !important; }   /* Elementor centreert de tekst verticaal */
.rv-card__regel{ padding:9px 26px 20px; }
.rv-regel{ display:grid; grid-template-columns:22px 1fr; column-gap:6px; align-items:start; margin:0; font-size:16px; line-height:1.35; }
.rv-regel__icoon{ display:flex; justify-content:center; padding-top:2px; }
.rv-regel__icoon svg{ width:14px; height:15px; fill:var(--e-global-color-olijf); }
/* Kiesknop: omlijnd over de volle breedte; gekozen = gevuld Nachtgroen met vinkje en "Gekozen" */
.rv-card__kies{ margin-top:auto !important; padding:0 26px; }
html:not(.js) .rv-card__kies, html:not(.js) .boscau-kiezer-ander{ display:none !important; }   /* zonder JS doen ze niets */   /* knop onderaan, ook op een kaart met minder tekst */
.rv-kies{ display:flex; align-items:center; justify-content:center; gap:10px; min-height:50px; margin:0; padding:10px 16px; border:1.5px solid var(--e-global-color-primary); color:var(--e-global-color-primary) !important; font-weight:600; font-size:16px; transition:background-color .15s, color .15s; }
.rv-kies::before{ content:""; width:17px; height:17px; border-radius:50%; border:1.5px solid currentColor; box-sizing:border-box; flex:none; }
.rv-kies-wel{ display:none; }
.js .rv-card__keuze:hover .rv-kies{ background:var(--e-global-color-kalk-licht); }
.rv-card__keuze[aria-checked="true"] .rv-kies{ background:var(--e-global-color-primary) !important; color:var(--e-global-color-perkament) !important; }
.rv-card__keuze[aria-checked="true"] .rv-kies::before{ border:0; background:var(--e-global-color-accent) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 12'%3E%3Cpath d='M2 6.5l4 4 8-8' fill='none' stroke='%2322332B' stroke-width='2.4'/%3E%3C/svg%3E") no-repeat center / 10px 8px; }
.rv-card__keuze[aria-checked="true"] .rv-kies-niet{ display:none; }
.rv-card__keuze[aria-checked="true"] .rv-kies-wel{ display:inline; }
.rv-card__meer{ padding:12px 26px 18px; text-align:center; }
.rv-card__meer p{ margin:0; }
.rv-card__meer a.text-link{ font-size:15px; }
/* Gekozen kaart: donkere rand; de andere twee vlak (geen schaduw), niet gedimd: ze zijn gewoon te kiezen. */
@media (hover:hover){ .js .rv-wizard:not([data-rv-selected]) .rv-card:hover{ border-color:rgba(62,74,54,.3); } }
.js .rv-wizard[data-rv-selected] .rv-card{ box-shadow:none; border-color:rgba(62,74,54,.18); }
.js .rv-wizard[data-rv-selected="gilles-del-bosc"] .rv-card--gilles-del-bosc,
.js .rv-wizard[data-rv-selected="louis-ix"] .rv-card--louis-ix,
.js .rv-wizard[data-rv-selected="jean-moulierat"] .rv-card--jean-moulierat{
	border-color:var(--e-global-color-primary); box-shadow:0 0 0 1px var(--e-global-color-primary), 0 24px 48px -20px rgba(34,51,43,.5);
}
/* Bij alle drie */
.rv-gedeeld{ margin-top:28px; padding:16px 0 !important; border-top:1px solid rgba(62,74,54,.3); border-bottom:1px solid rgba(62,74,54,.3); gap:8px 24px !important; }
.rv-gedeeld__label{ width:auto !important; }
.rv-gedeeld__label p{ margin:0; font-weight:600; font-size:15px; color:var(--e-global-color-primary) !important; }
.rv-gedeeld__lijst{ width:auto !important; flex:1 1 auto; }
.rv-gedeeld__lijst .elementor-icon-list-items{ gap:8px 24px; }
.rv-gedeeld__lijst .elementor-icon-list-item{ font-size:15px; margin:0 !important; }
/* Lege staat: alleen met JS en zolang er niets gekozen is (zonder JS staan alle kalenders er gewoon). */
.rv-leeg{ display:none; }
.js .rv-wizard:not([data-rv-selected]) .rv-leeg{ display:block; }
.rv-leeg p{ margin:0; padding:22px 26px 22px 64px; border:1px dashed rgba(62,74,54,.5); border-radius:12px; color:var(--e-global-color-olijf) !important; font-size:17px;
	background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 448 512'%3E%3Cpath fill='%233E4A36' d='M12 192h424c6.6 0 12 5.4 12 12v260c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V204c0-6.6 5.4-12 12-12zm436-44v-36c0-26.5-21.5-48-48-48h-48V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H160V12c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v52H48C21.5 64 0 85.5 0 112v36c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12z'/%3E%3C/svg%3E") no-repeat 26px center / 20px 22px; }
/* Kop boven de kalender na de keuze ("Beschikbaarheid Louis IX", functions.php) */
.boscau-kiezer-kopblok{ margin:40px 0 16px; }
.boscau-kiezer h2.boscau-kiezer-kop{ margin:0 0 6px; font-size:clamp(30px,3.2vw,42px); line-height:1.15; }   /* h2 erbij: de Kit-regel voor h2 wint anders */
.boscau-kiezer-kop:focus{ outline:none; }
.boscau-kiezer button.boscau-kiezer-ander{ background:none; border:0; padding:0; cursor:pointer; font:inherit; font-size:16px; color:var(--e-global-color-olijf); text-decoration-line:underline; text-decoration-thickness:1px; text-underline-offset:4px; }
.boscau-kiezer button.boscau-kiezer-ander:hover{ color:var(--e-global-color-primary); }
@media (max-width:1023px) and (min-width:768px){
	.rv-cards{ grid-template-columns:1fr; max-width:640px; }   /* drie kaarten naast elkaar waren te krap (iPad staand) */
}
/* Mobiel: korte kaarten (kleine foto naast de naam, kenmerken in 2x2), "Foto's en details" naast de knop */
@media (max-width:767px){
	.rv-cards{ grid-template-columns:1fr; gap:14px; }
	.rv-card{ border-radius:14px; }
	.rv-card__keuze{ display:grid !important; grid-template-columns:72px minmax(0,1fr); grid-template-areas:"foto naam" "foto sub" "feiten feiten" "regel regel" "kies kies"; column-gap:14px; padding:14px !important; }
	.rv-card__foto{ grid-area:foto; width:72px !important; }
	.rv-card__foto img{ width:72px; height:72px; aspect-ratio:auto; border-radius:8px; }
	.rv-card__type{ display:none; }
	.rv-card__keuze::after{ width:28px; height:28px; right:auto; left:56px; top:8px; border-width:2px; background-size:11px 8px; }
	.rv-card__naam{ grid-area:naam; padding:0; align-self:end; }
	.rv-card__naam .elementor-heading-title{ font-size:24px; }
	.rv-card__sub{ grid-area:sub; padding:2px 0 0; align-self:start; }
	.rv-card__sub p{ font-size:15px; line-height:1.35; }
	.rv-card__feiten{ grid-area:feiten; margin:10px 0 0; padding-top:10px; }
	.rv-card__feiten .elementor-icon-list-items{ display:grid !important; grid-template-columns:repeat(2,minmax(0,1fr)); gap:6px 12px; }
	.rv-card__feiten .elementor-icon-list-item{ font-size:14.5px; line-height:1.3; }
	.rv-card__feiten .elementor-icon-list-item + .elementor-icon-list-item{ margin-top:0; }
	/* personen staat al in de ondertitel: verborgen op het icoon, niet op de plek in de lijst, zodat
	   herschikken of weghalen in Elementor geen ander kenmerk laat verdwijnen (review 2026-10-11) */
	.rv-card__feiten .elementor-icon-list-item:has(.e-fas-user-friends){ display:none; }
	.rv-card__feiten .elementor-icon-list-icon{ width:16px; }
	.rv-card__regel{ grid-area:regel; padding:6px 0 0; }
	.rv-regel{ grid-template-columns:16px 1fr; font-size:14.5px; line-height:1.3; }
	.rv-card__kies{ grid-area:kies; padding:12px 96px 0 0; }
	.rv-kies{ min-height:48px; }
	.rv-card__meer{ position:absolute; right:14px; bottom:14px; width:84px; height:48px; padding:0; display:flex; align-items:center; justify-content:center; }
	.rv-card__meer a.text-link{ font-size:14px; line-height:1.25; }
	/* zonder JS geen kiesknop (doet dan niets), dus ook geen vrije plek rechtsonder: de link gewoon eronder */
	html:not(.js) .rv-card__meer{ position:static; width:auto; height:auto; padding:10px 14px 14px; justify-content:flex-start; }
	.rv-gedeeld__label{ width:100% !important; }
	.rv-gedeeld__lijst .elementor-icon-list-item{ font-size:14px; }
	.rv-leeg p{ padding:16px 18px 16px 52px; font-size:15px; background-position:18px center; background-size:18px 20px; }
	.boscau-kiezer-kopblok{ margin-top:28px; }
	.boscau-kiezer h2.boscau-kiezer-kop{ font-size:28px; }
}
.rv-step1-heading{ margin-bottom:20px; }

/* Stappenindicator (rvsteps): stap 3 (Betalen) is nooit "actief" — die stap
   gebeurt in de bestaande WPBS/Mollie-flow ná het echte formulier. */
.rv-steps{ display:flex; flex-wrap:wrap; gap:12px 28px; }
.rv-step-label{ margin:0; opacity:.5; }
.rv-step-label--1{ opacity:1; font-weight:700; }
body[data-rv-step="2"] .rv-step-label--1{ opacity:.5; font-weight:400; }
body[data-rv-step="2"] .rv-step-label--2{ opacity:1; font-weight:700; }

/* Precies één van de drie kiezer-instanties tonen, op basis van data-rv-selected
   op de wizard-wrapper. Verbeterronde: niet alleen ".boscau-kiezer" zelf
   verbergen, maar ook de omringende Elementor-container (".rv-calwrap--
   <slug>", eigen klasse per verblijf naast de bestaande "wpbs-cal-wrap") —
   anders bleven de twee NIET-gekozen containers als lege dozen staan (eigen
   Elementor-standaardpadding ±20px + de standaard flex-gap van ".rv-wizard"
   ertussen, ×2), samen goed voor het gerapporteerde lege vlak onder de
   kalender in stap 1. */
.js .rv-wizard .boscau-kiezer[data-stappen]{ display:none; }
.js .rv-wizard[data-rv-selected="gilles-del-bosc"] .boscau-kiezer[data-verblijf="gilles-del-bosc"],
.js .rv-wizard[data-rv-selected="louis-ix"] .boscau-kiezer[data-verblijf="louis-ix"],
.js .rv-wizard[data-rv-selected="jean-moulierat"] .boscau-kiezer[data-verblijf="jean-moulierat"]{ display:block; }

.js .rv-wizard .rv-calwrap--gilles-del-bosc,
.js .rv-wizard .rv-calwrap--louis-ix,
.js .rv-wizard .rv-calwrap--jean-moulierat{ display:none; }
.js .rv-wizard[data-rv-selected="gilles-del-bosc"] .rv-calwrap--gilles-del-bosc,
.js .rv-wizard[data-rv-selected="louis-ix"] .rv-calwrap--louis-ix,
.js .rv-wizard[data-rv-selected="jean-moulierat"] .rv-calwrap--jean-moulierat{ display:block; }


/* Stap 1 ↔ stap 2: in stap 2 alleen de compacte samenvatting + het échte
   formulier van het gekozen verblijf; in stap 1 geen spoor van het formulier
   (dat blijft in de DOM, klaar voor stap 2 — zie theme/functions.php). */
/* !important: deze stap-toggle moet altijd winnen, ook van de desktop-
   sticky-layoutregels verderop in dit bestand (@media min-width:900px) die
   ".boscau-kiezer-body" op gelijke specificiteit weer op display:flex zetten
   — zonder !important bleef de kalender van stap 1 zichtbaar in stap 2
   (leeg getest via de Browser-pane: gelijke specificiteit, latere regel in
   het bestand wint de tiebreak). */
.js .rv-wizard[data-rv-step="2"] .rv-cards,
.js .rv-wizard[data-rv-step="2"] .rv-step1-heading,
.js .rv-wizard[data-rv-step="2"] .rv-intro,
.js .rv-wizard[data-rv-step="2"] .rv-gedeeld,
.js .rv-wizard[data-rv-step="2"] .rv-leeg,
.js .rv-wizard[data-rv-step="2"] .boscau-kiezer-kopblok,
.js .rv-wizard[data-rv-step="2"] .boscau-kiezer-legend,
.js .rv-wizard[data-rv-step="2"] .boscau-kiezer-hint,
.js .rv-wizard[data-rv-step="2"] .boscau-kiezer-note,
.js .rv-wizard[data-rv-step="2"] .boscau-kiezer-body,
/* Ook de verblijfsregel en "Je koos …" (de balk noemt verblijf en data al), en het slotblok met knoppen naar
   de verblijfpagina's: een uitgang midden in het boeken (verkenning 2026-10-12, B3/B4; in stap 1 blijft het). */
.js .rv-wizard[data-rv-step="2"] .boscau-kiezer-regels,
.js .rv-wizard[data-rv-step="2"] .boscau-kiezer-preselect-note,
.js body[data-rv-step="2"] .elementor-element-rv5closing{ display:none !important; }

.js .rv-wizard[data-rv-step="1"] .boscau-kiezer-step2bar,
.js .rv-wizard[data-rv-step="1"] .boscau-kiezer-source--met-formulier{ display:none !important; }

.js .rv-wizard[data-rv-step="2"] .boscau-kiezer-step2bar{ display:block; }
/* Terug van de betaling: alleen WPBS' melding (verwerken, daarna de bevestiging), geen "Je gegevens"-balk. */
.js .rv-wizard[data-rv-bevestiging] .boscau-kiezer-step2bar{ display:none !important; }

.boscau-kiezer-step2bar{ max-width:760px; margin:0 auto 20px; }
.boscau-kiezer-step2-heading{ margin:0 0 8px; }
.boscau-kiezer-step2bar-text{ margin:0 0 14px; font-size:16px; }
/* Verbeterronde: ".boscau-kiezer-wijzig" alleen (0-1-0) verliest van de Kit se
   globale knopstijl (".elementor-kit-1964 button", 0-1-1 — element+klasse wint
   al bij de klassen-kolom, 1 tegen 1, en dan de extra elementselector) — zelfde
   valkuil/oplossing als ".boscau-kiezer .bk-day"/".boscau-kiezer .boscau-
   kiezer-nav" hierboven. Zonder de extra ".boscau-kiezer"-ankerklasse (0-2-0,
   wint al op de klassenkolom) rendert "Wijzig" ongewenst als de gouden
   primaire Kit-knop i.p.v. een bescheiden tekstlink. */
.boscau-kiezer .boscau-kiezer-wijzig{
	background:none !important;
	border:0 !important;
	padding:0 !important;
	font:inherit;
	font-weight:600;
	text-decoration:underline;
	cursor:pointer;
	color:var(--e-global-color-primary) !important;
	min-height:44px;
}

/* Stap 1, desktop: kalender en samenvatting naast elkaar, samenvatting sticky
   ("altijd zichtbare samenvatting", plan-reserveren.md #3). Alleen in
   stappen-modus (/reserveren/) — de verblijfpagina's houden hun bestaande,
   al-goedgekeurde gestapelde lay-out (zie het Datumkiezer-blok hierboven).
   Verbeterronde: drempel van 900px naar 1024px (gevraagd) — onder 1024px
   (tablet) staat de kalender op volle breedte met de samenvatting er gewoon
   onder (geen sticky/naast-elkaar, dat past pas vanaf een breder scherm). */
@media(min-width:1024px){
	.js .boscau-kiezer[data-stappen] .boscau-kiezer-body{ display:flex; align-items:flex-start; gap:32px; }
	.js .boscau-kiezer[data-stappen] .boscau-kiezer-wrap{ flex:2 1 0%; min-width:0; }
	.js .boscau-kiezer[data-stappen] .boscau-kiezer-summary{
		flex:1 1 0%;
		min-width:300px;
		margin:0;
		position:sticky;
		top:calc(var(--header-h) + 16px);
		display:flex;
		flex-direction:column;
		align-items:stretch;
		gap:16px;
	}
	.js .boscau-kiezer[data-stappen] .boscau-kiezer-summary-total{ text-align:left; }
	.js .boscau-kiezer[data-stappen] .boscau-kiezer-continue{ margin-left:0; width:100%; }
}

/* Stap 1, mobiel: vaste balk onderin met totaal + knop (plan-reserveren.md
   #3/#9) — ponytail: geen uitklapbare mini-samenvatting, de balk toont zelf
   al aankomst/vertrek/nachten/totaal (2×2-raster, zie hierboven); uitbreiden
   als "altijd zichtbaar + volledig dichtklapbaar" in gebruik gemist wordt. */
@media(max-width:767px){
	.js .boscau-kiezer[data-stappen] .boscau-kiezer-summary{
		position:fixed;
		left:0;
		right:0;
		bottom:0;
		z-index:40;
		margin:0;
		max-width:none;
		box-shadow:0 -4px 16px rgba(28,38,33,.18);
	}
	.js .rv-wizard[data-rv-step="1"]{ padding-bottom:190px; }
	/* Alleen zolang de kalender in beeld is (boscau-reserveren.js), anders dekt de balk de verblijfkaarten af. */
	.js .boscau-kiezer[data-stappen] .boscau-kiezer-summary{ transition:transform .2s ease, visibility .2s; }
	.js .boscau-kiezer[data-stappen]:not([data-kal-in-beeld]) .boscau-kiezer-summary{ transform:translateY(110%); visibility:hidden; }
	/* Stappenbalk: de labels staan in Elementors .e-con-inner, niet direct in
	   .rv-steps; drie gelijke kolommen zodat "3 Betalen" niet los afbreekt. */
	.rv-steps .e-con-inner{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; }
	.rv-step-label{ font-size:15px; line-height:1.3; }
	.js .rv-wizard[data-rv-step="2"]{ padding-top:32px; }
}

/* --- Taak G1: Google Maps click-to-load (/contact-opnemen/) ----------------
   Vóór een klik: alleen dit eigen vlak (Kalk licht + olijfrand + pin-icoon +
   knop), geen kaarttegels, geen verzoek naar Google (netwerkcontrole in
   tasks/plan-reviews-google.md). Na de klik (theme/js/gmap-click-load.js)
   vervangt het script de inhoud door een <iframe> die de volle .gmap-embed
   -maat vult. Zonder JS: alleen ".gmap-fallback-link" (gewone link naar
   Google Maps) — zelfde ".js"-klasse-patroon als de datumkiezer
   (theme/js/boscau-kiezer.js, theme/functions.php). */
.gmap-embed{ position:relative; width:100%; aspect-ratio:4/3; background:var(--e-global-color-kalk-licht); border:1px solid var(--e-global-color-olijf); }
.gmap-embed iframe{ display:block; width:100%; height:100%; border:0; }
.gmap-embed-icon{ width:36px; height:36px; color:var(--e-global-color-olijf); }
.gmap-fallback-link{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:10px; width:100%; height:100%; padding:24px; color:var(--e-global-color-olijf); font-weight:600; text-align:center; }
.gmap-embed-trigger{ display:none; }
.js .gmap-embed-trigger{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:12px; width:100%; height:100%; padding:24px; text-align:center; }
.js .gmap-fallback-link{ display:none; }
.gmap-embed-note{ margin:0; font-size:13px; color:var(--e-global-color-mosgrijs); max-width:32ch; }
/* Zelfde valkuil/oplossing als ".boscau-kiezer .boscau-kiezer-wijzig" hierboven:
   de Kit-knopstijl ".elementor-kit-<id> button" (0,1,1) wint anders van een
   kale ".gmap-embed-btn" (0,1,0) — de extra ".gmap-embed-trigger"-ankerklasse
   (0,2,0) wint al op de klassenkolom. */
.gmap-embed-trigger .gmap-embed-btn{ background:none; border:1px solid currentColor; color:var(--e-global-color-olijf); padding:16px 28px; font:inherit; font-weight:600; cursor:pointer; min-height:44px; }
.gmap-embed-trigger .gmap-embed-btn:hover{ background:var(--e-global-color-olijf); color:var(--e-global-color-kalk-licht); }


/* Taak R2/R3 (Reviews): reviewkaart (Loop Item-inhoud), zichtbare sterren
   (inline SVG i.p.v. Elementor Rating-widget — die rendert zelf
   schema.org/Rating-microdata, en Joost besliste expliciet "geen
   sterrenschema", EISEN §6.3), en de kaarten van het globale
   Reviewscores-sjabloon (R3). Geen hardgecodeerde hex: alleen
   var(--e-global-color-*), behalve het wit van het reviewblok.
   Reviewblok (Joost 2026-10-11): carrousel en scores samen in één wit vlak
   dat los van de pagina komt (.review-blok op de container in Elementor). Het
   houdt zijn eigen tekstkleuren, ook op een donkere sectie (Gilles del Bosc):
   zelfde !important als ".surface-dark p" hierboven, en wint omdat het later staat. */
.review-blok{ background:#fff; border-radius:16px; padding:clamp(24px,3.5vw,48px); color:var(--e-global-color-text);
	box-shadow:0 1px 3px rgba(34,51,43,.06), 0 22px 50px -20px rgba(34,51,43,.32); }
.review-blok h1,.review-blok h2,.review-blok h3,.review-blok h4,.review-blok h5,.review-blok h6{ color:var(--e-global-color-primary) !important; }
.review-blok p{ color:var(--e-global-color-text) !important; }
.review-blok p:last-child{ margin-bottom:0; }
.review-card{ display:flex; flex-direction:column; gap:14px; height:100%; }
.review-card__text::before{ content:"\201C"; display:block; height:.45em; font-family:var(--e-global-typography-primary-font-family),serif; font-size:72px; line-height:1; color:var(--e-global-color-accent); }
/* Scores als rijen (logo | score, sterren, tekst en links), met een lijn
   ertussen; de ruimte per rij staat in Elementor. */
.review-score-card{ border-top:1px solid var(--line-light); }
.review-stars{ display:inline-flex; gap:4px; }
.review-stars__star{ position:relative; display:inline-block; width:20px; height:20px; }
.review-stars__base,.review-stars__fill{ position:absolute; inset:0; overflow:hidden; }
.review-stars__base svg{ width:20px; height:20px; fill:rgba(62,74,54,.25); }
.review-stars__fill svg{ width:20px; height:20px; fill:var(--e-global-color-accent); }
.review-card__score{ display:flex; align-items:center; flex-wrap:wrap; gap:6px 12px; }
.review-card__score-label{ font-size:14px; color:var(--e-global-color-olijf); }
.review-card__text{ font-size:clamp(17px,1.4vw,19px); line-height:1.65; color:var(--e-global-color-text); }
.review-card__text p:last-child{ margin-bottom:0; }
.review-card__meta{ display:flex; flex-wrap:wrap; gap:4px 10px; font-size:14px; color:var(--e-global-color-olijf); margin-top:auto; }
.review-card__name{ font-weight:600; color:var(--e-global-color-primary); }
.review-card__platform{ display:flex; align-items:center; gap:10px; padding-top:14px; border-top:1px solid var(--line-light, rgba(62,74,54,.2)); }
.review-card__logo{ display:block; width:20px; height:20px; object-fit:contain; }
.review-card__own-label{ font-size:14px; color:var(--e-global-color-olijf); font-style:italic; }
/* Loop Carousel: autoplay staat per carrousel op "no"; de pijlen (onderaan,
   olijf) en de bolletjes staan in de Elementor-instellingen van de widget. */

/* Overzichtskalender op /groepen/ (feedback 2026-10, V42): WPBS' eigen grijze
   legendabalk past niet bij de site; de legenda staat rustig boven de tabel. De
   tabel zelf scrolt op mobiel binnen .wpbs-overview-inner (WPBS), de pagina niet. */
.groepen-overzicht .wpbs-legend{ background:transparent; padding-left:0; padding-right:0; }
