/* ─── /assets/modules/variables.css ─── */
/*
 * variables.css — framework-level design tokens.
 *
 * Laad VOOR website.css zodat site-CSS de standaard tokens kan overschrijven.
 * Modules consumen deze tokens rechtstreeks via var(--color-*).
 *
 * Color-scheme heeft 3 modi:
 *   - default: volg `prefers-color-scheme` van het systeem
 *   - `<html data-color-scheme="light">`: forceer licht
 *   - `<html data-color-scheme="dark">`:  forceer donker
 *
 * De manual override wordt door de toggle-knop in de site-header gezet en
 * via `localStorage` gepersisteerd. Bij `auto` blijft het attribuut weg.
 *
 * Viewport-breekpunten — gebruik ALLEEN deze waarden in @media-regels:
 *   sm: 48rem  ( 768px) — telefoon / portrait tablet
 *   md: 64rem  (1024px) — tablet / laptop
 * Component-breedte-afhankelijke layouts → @container, niet @media.
 */

:root {
    color-scheme: light dark;

    /* Spacing — fluid via clamp om mobiel + desktop te dekken zonder media queries */
    --space-1: clamp(0.25rem, 0.5vw, 0.4rem);
    --space-2: clamp(0.5rem,  1vw,  0.75rem);
    --space-3: clamp(0.75rem, 1.5vw, 1rem);
    --space-4: clamp(1rem,    2vw,  1.5rem);
    --space-5: clamp(1.5rem,  3vw,  2.5rem);
    --space-6: clamp(2rem,    5vw,  4rem);
    --space-7: clamp(3rem,    7vw,  6rem);

    /* Layout */
    --content-max: 76rem;
    --gutter:      var(--space-4);

    /* Typography */
    --font-body:    system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
    --font-display: var(--font-body);
    --font-mono:    ui-monospace, "Cascadia Code", "Source Code Pro", Menlo, monospace;
    --line-base:    1.6;
    --line-tight:   1.2;

    --fs-body:    1rem;
    --fs-intro:   clamp(1.05rem, 1.2vw, 1.2rem);
    --fs-h1:      clamp(2rem,    4vw,   3.25rem);
    --fs-h2:      clamp(1.5rem,  3vw,   2.25rem);
    --fs-h3:      clamp(1.2rem,  2vw,   1.5rem);
    --fs-tagline: 0.9rem;

    /* Colors — light-dark() zodat één definitie beide schemes dekt (Safari 17.5+/Chrome 123+/FF 127+).
       Shadows werken NIET met light-dark() (komma's in box-shadow zijn ambigu);
       die staan apart in de @media- en [data-color-scheme]-blokken hieronder. */
    --color-fg:            light-dark(#1a1a1a, #ececec);
    --color-fg-muted:      light-dark(#555,    #9aa0a6);
    --color-bg:            light-dark(#fff,    #0f1115);
    --color-bg-soft:       light-dark(#f7f7f8, #161a20);
    --color-bg-elev:       light-dark(#fff,    #1e232b);
    --color-border:        light-dark(rgba(0,0,0,.12),   rgba(255,255,255,.12));
    --color-border-strong: light-dark(rgba(0,0,0,.22),   rgba(255,255,255,.22));

    /* Primary — neutrale standaard; sites overschrijven met hun brand-kleur */
    --color-primary:    #2563eb;
    --color-primary-fg: #fff;
    --color-primary-dk: color-mix(in srgb, var(--color-primary) 85%, black);

    /* Semantische status-kleuren */
    --color-danger:  light-dark(#c0392b, #f87171);
    --color-success: light-dark(#0a6e3a, #4ade80);

    --color-link: light-dark(#06f, #82b4ff);

    /* Radii */
    --radius-sm: 4px;
    --radius-md: 8px;
    --radius-lg: 14px;

    /* Shadows — light defaults; dark override in @media + [data-color-scheme] hieronder */
    --shadow-1: 0 1px 2px rgba(0,0,0,.04), 0 4px 12px rgba(0,0,0,.05);
    --shadow-2: 0 2px 4px rgba(0,0,0,.06), 0 12px 32px rgba(0,0,0,.08);

    /* Motion — global timing. Respecteer `prefers-reduced-motion`. */
    --ease-out:    cubic-bezier(.16, 1, .3, 1);
    --ease-in-out: cubic-bezier(.65, 0, .35, 1);
    --dur-fast:    120ms;
    --dur-med:     220ms;
    --dur-slow:    420ms;
}

/* Shadow-dark overrides — alleen shadows, kleur-tokens doen het via light-dark(). */
@media (prefers-color-scheme: dark) {
    :root {
        --shadow-1: 0 1px 2px rgba(0,0,0,.4), 0 4px 12px rgba(0,0,0,.5);
        --shadow-2: 0 2px 4px rgba(0,0,0,.5), 0 12px 32px rgba(0,0,0,.6);
    }
}

/* Manual overrides — winnen van system-preference.
   color-scheme forceren zodat UA scrollbar/input ook meedoet.
   Shadows apart omdat light-dark() niet werkt voor multi-value box-shadow. */
:root[data-color-scheme="light"] {
    color-scheme: light;
    --shadow-1: 0 1px 2px rgba(0,0,0,.04), 0 4px 12px rgba(0,0,0,.05);
    --shadow-2: 0 2px 4px rgba(0,0,0,.06), 0 12px 32px rgba(0,0,0,.08);
}
:root[data-color-scheme="dark"] {
    color-scheme: dark;
    --shadow-1: 0 1px 2px rgba(0,0,0,.4), 0 4px 12px rgba(0,0,0,.5);
    --shadow-2: 0 2px 4px rgba(0,0,0,.5), 0 12px 32px rgba(0,0,0,.6);
}

/* Motion-reduction — versoepelde variant. */
@media (prefers-reduced-motion: reduce) {
    :root {
        --dur-fast: 80ms;
        --dur-med:  120ms;
        --dur-slow: 160ms;
    }
    html { scroll-behavior: auto; }
}

/* Dunne, thema-meekleurende scrollbar. De log grijze UA-default kleurt niet mee met
   het thema; hier is de thumb een subtiele afgeleide van de voorgrondkleur, dus 'ie
   adapteert automatisch licht/donker (via `--color-fg`) en per-site brand (die kan
   `--color-fg` overschrijven). `scrollbar-width`/`scrollbar-color` zijn de standaard-
   props (Chrome 121+, Firefox, Safari 18.2+); overschrijfbaar per site via `--scrollbar-*`. */
html {
    scrollbar-width: var(--scrollbar-width, thin);
    scrollbar-color: var(--scrollbar-color, color-mix(in srgb, var(--color-fg) 32%, transparent) transparent);
}

/* Sticky footer (framework-basis): de pagina vult minstens de vensterhoogte en de
 * <main> groeit mee, zodat de paginavoet altijd onderaan blijft — ook op korte
 * pagina's. Alleen layout; kleuren/typografie blijven van de design-laag. */
body {
    min-height: 100dvh;
    display: flex;
    flex-direction: column;
}
body > main {
    flex: 1 0 auto;
}

/* ─── /css/variables/website.css ─── */
/* website.css — banuslodge.com brand-tokens (stijlgids Age, 2026-06).
 *
 * Overschrijft framework-defaults uit /modules/variables.css en voegt
 * site-eigen design-tokens toe. Laad NA variables.css.
 *
 * Stijlgids-palet: cream #F4EFEB · terra #9F643F · olive #8E8866 ·
 * olive-dark #5A5537 · brown #573B2D · sand #E1CC95 · ink #1D1D1B.
 * Dit bestand is de ENIGE plek met hex-waarden; site.css gebruikt
 * uitsluitend tokens (zie ook de CMS-theme-vars --theme-color-1..10).
 */

:root {
    /* ── Brand ─────────────────────────────────────────────────────────── */
    --color-primary:    #9f643f;   /* terra — knoppen, nav-accent, links */
    --color-primary-fg: #f4efeb;   /* cream op terra */
    --color-accent:     #9f643f;

    /* ── Vlakken — site staat vast op het lichte schema ────────────────── */
    --color-bg:         #f4efeb;   /* cream als paginabasis */
    --color-bg-soft:    #ede4dc;   /* dieper cream voor panels */
    --color-bg-elev:    #ffffff;   /* kaarten/pill-nav */
    --color-fg:         #1d1d1b;   /* ink */

    /* ── Site-eigen tokens (gebruikt door custom/site.css) ─────────────── */
    --bl-olive:      #8e8866;
    --bl-olive-dark: #5a5537;
    --bl-brown:      #573b2d;
    --bl-sand:       #e1cc95;
    --bl-radius:      18px;  /* één kaart-radius site-breed (galerij/kaarten/frosted) */
    --bl-band-radius: 34px;  /* grote banden/kaarten (terra-band, locatie, contact-info) */

    /* Content-breedte — design --max; overschrijft framework-default (76rem) */
    --content-max:   1240px;

    /* ── Tekst-tinten (design) ─────────────────────────────────────────── */
    --bl-body-text:  #5d534b;   /* paragrafen in lagen op licht */
    --bl-welcome:    #473d35;   /* welkom-sectie-tekst (warmer dan body) */
    --bl-signature:  #6f6359;   /* ondertekening (italic) */
    --bl-near-white: #fcfaf9;   /* basis van het welkom-verloop */
    /* cream met alpha — tekst op donkere banden (color-mix valt buiten de
       browser-baseline, daarom rgba) */
    --bl-cream-soft:    rgba(244, 239, 235, .7);   /* eyebrow op donker */
    --bl-cream-soft-72: rgba(244, 239, 235, .72);  /* lopende tekst op band */
    --bl-cream-90:      rgba(244, 239, 235, .9);   /* kaart-subtekst op foto */
    --bl-cream:         #f4efeb;                    /* hero-dot actief (pill) */
    --bl-cream-55:      rgba(244, 239, 235, .55);   /* hero-dot inactief */
    /* paginavoet (design .footer-*): cream-tinten op het bruine vlak */
    --bl-cream-soft-82: rgba(244, 239, 235, .82);   /* footer body/links */
    --bl-cream-soft-60: rgba(244, 239, 235, .6);    /* footer onderbalk */
    --bl-cream-12:      rgba(244, 239, 235, .12);   /* social-knop vlak */
    --bl-cream-25:      rgba(244, 239, 235, .25);   /* social-knop hover */
    --bl-cream-14:      rgba(244, 239, 235, .14);   /* footer-scheidingslijn */
    /* frosted-glass kaartjes op foto-banden (design .loc-card) */
    --bl-frost:         rgba(46, 52, 64, .24);
    --bl-frost-hover:   rgba(46, 52, 64, .32);
    --bl-frost-border:  rgba(255, 255, 255, .22);
    /* brand-getinte schaduwen (alpha-variant van brown; bewust rgba —
       color-mix valt buiten de browser-baseline) */
    --bl-shadow:     0 18px 50px rgba(87, 59, 45, .14);
    --bl-shadow-sm:  0 8px 24px rgba(87, 59, 45, .10);
    /* omhoog-werpende schaduw voor de sticky book-bar (rand naar boven) */
    --bl-shadow-up:  0 -10px 34px rgba(87, 59, 45, .12);

    /* ── On-image: tekst op donkere cover-foto/overlay ─────────────────── */
    --on-image-overlay:        rgba(29, 29, 27, .35);
    --on-image-overlay-strong: rgba(29, 29, 27, .5);
    --on-image-fg:             #fff;
    --on-image-fg-soft:        rgba(255, 255, 255, .85);
    --on-image-border:         rgba(255, 255, 255, .6);
    --on-image-bg-hover:       rgba(255, 255, 255, .12);
}

/* ─── /css/base.css ─── */
/* Reset + typografie. Bewust minimaal — geen normalize.css. */

*, *::before, *::after { box-sizing: border-box; }
html {
    -webkit-text-size-adjust: 100%;
    scrollbar-width: thin;
    scrollbar-color: color-mix(in srgb, var(--color-primary) 30%, transparent) transparent;
    scroll-behavior: smooth;
    scroll-padding-top: var(--site-header-height, 0px);
}

::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
    background: color-mix(in srgb, var(--color-primary) 30%, transparent);
    border-radius: 999px;
}
::-webkit-scrollbar-thumb:hover {
    background: color-mix(in srgb, var(--color-primary) 55%, transparent);
}

body {
    margin: 0;
    font-family: var(--font-body);
    font-size: var(--fs-body);
    line-height: var(--line-base);
    color: var(--color-fg);
    background: var(--color-bg);
    /* Sticky footer: body vult minstens de viewport en stapelt header/main/
       footer als kolom; main groeit (flex: 1) zodat de voet ook bij weinig
       content onderaan staat. 100vh = fallback voor browsers zonder dvh. */
    min-height: 100vh;
    min-height: 100dvh;
    display: flex;
    flex-direction: column;
}

body.is-scroll-locked {
    overflow: hidden;
}

main { display: block; flex: 1 0 auto; }

img, picture, video, svg { display: block; max-width: 100%; height: auto; }

a { color: var(--color-link); text-underline-offset: .2em; }

h1, h2, h3, h4, h5, h6 {
    margin: 0;
    line-height: var(--line-tight);
    font-family: var(--font-display);
}
/* Kale h1 in het 3e thema-font (Cormorant Garamond); de merk-/layer-titels
   (`.general__title` e.d.) worden in custom/site.css gestuurd. Gewone h2–h6
   blijven op --font-display (theme-font-2). */
h1 {
    font-family: var(--theme-font-3, var(--font-display));
}

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

/* Buttons — basis variant primary/secondary */
.button {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    padding: var(--space-2) var(--space-4);
    border-radius: var(--radius-md);
    text-decoration: none;
    font-weight: 600;
    line-height: 1.2;
    transition: transform .12s ease, background .12s ease;
    /* Reset native <button>-chrome (rand + UA-achtergrond/font) zodat een
       <button class="button"> identiek oogt aan een <a class="button">. */
    border: none;
    cursor: pointer;
    font-family: inherit;
    font-size: inherit;
    -webkit-appearance: none;
    appearance: none;
}
.button--primary {
    background: var(--color-primary);
    color: var(--color-primary-fg);
}
.button--secondary {
    background: transparent;
    color: var(--color-fg);
}
.button:hover { transform: translateY(-1px); }

/* Debug-block onderaan elke pagina — alleen tijdens dev */
.debug {
    margin: var(--space-6) auto;
    max-width: var(--content-max);
    padding: var(--space-3) var(--gutter);
    color: var(--color-fg-muted);
    font-size: .85rem;
}
.debug summary { cursor: pointer; }
.debug table { width: 100%; border-collapse: collapse; font-variant-numeric: tabular-nums; margin-top: var(--space-2); }
.debug th, .debug td { padding: .25rem .5rem; text-align: left; border-bottom: 1px solid var(--color-border); }
.debug code { background: var(--color-bg-soft); padding: .1em .35em; border-radius: var(--radius-sm); }

/* ── Cookie-consent-banner (framework CookieBanner; CMS-beheerd, gedrag in mm-consent.js) ── */
.mm-cookie { position: fixed; left: 50%; bottom: var(--space-3); transform: translateX(-50%); z-index: 9999; width: min(680px, calc(100% - 2rem)); background: var(--color-bg); color: var(--color-fg); box-shadow: var(--shadow-2); border-radius: var(--radius-md); padding: 1.1rem 1.3rem; font-size: .9rem; line-height: 1.45; }
.mm-cookie[hidden] { display: none; }
.mm-cookie__title { margin: 0 0 .35rem; font-size: 1.05rem; }
.mm-cookie__intro { margin: 0 0 .7rem; }
.mm-cookie__cats { display: flex; flex-wrap: wrap; gap: .4rem 1.2rem; margin: 0 0 .8rem; }
.mm-cookie__cat { display: flex; align-items: center; gap: .4rem; }
.mm-cookie__cat-desc { flex-basis: 100%; color: var(--color-fg-muted); font-size: .8rem; margin-inline-start: 1.4rem; }
.mm-cookie__actions { display: flex; flex-wrap: wrap; gap: .5rem; justify-content: flex-end; }
.mm-cookie__btn { cursor: pointer; border: 1px solid var(--color-border); background: transparent; color: inherit; border-radius: var(--radius-sm); padding: .5rem .9rem; font: inherit; }
.mm-cookie__btn--accept { background: var(--color-primary); border-color: transparent; color: var(--color-primary-fg); }
.mm-cookie__link { color: inherit; }

/* ─── /css/layers.css ─── */
/*
 * Layer-styles — generic patterns gedeeld over alle layer-types,
 * plus type-specifieke styling per .layer__xxx.
 *
 * Container queries op .layer voor module-flexibel responsive gedrag
 * (Safari 16+). Pagina-niveau media queries voor de outer layout.
 */

/* .layer staat nu op de sectie zelf (full-bleed, samen met .layer-section);
   breedte/centrering/container zijn verhuisd naar .layer__inner.
   Geneste lagen (een .layer binnen een andere laag, dus ZONDER sectie-wrapper)
   behouden hun eigen centrering/breedte. */
.layer:not(.layer-section) {
    container-type: inline-size;
    max-width: var(--content-max);
    margin-inline: auto;
    padding-inline: var(--gutter);
}

/* Universele sectie-wrapper — de orchestrator wrapt ELKE laag hierin:
   full-bleed achtergrond (.layer__bg) + gecentreerde inner (.layer__inner,
   bevat de bestaande .layer) + voorgrond-overlay (.layer__fg). Zonder
   design-velden zijn bg/fg leeg + transparant → geen visueel effect.
   Per-sectie design-CSS (`.s<hash>`) wordt in de <head> geïnjecteerd en zet
   o.a. background/aspect-ratio op .layer__bg en width/padding op .layer__inner. */
.layer-section {
    position: relative;
    /* Geen default verticale padding: spacing komt UITSLUITEND uit design_layer
       (op .s<hash>). Lagen zonder design hebben dus geen sectie-padding. */
}
.layer-section > .layer__bg {
    position: absolute;
    inset: 0;
    z-index: 0;
    overflow: hidden;
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
}
.layer-section > .layer__sc {
    position: relative;
    z-index: 1;
}
/* De inner is de content-box: gecentreerd, met gutter, EN de containment-
   context (container-type) waartegen álle `@container`-queries van de lagen
   meten (USP-grid, columns, text-layout, cards, …). Zonder deze regel matcht
   geen enkele @container → alles valt terug op de mobiele 1-koloms layout.
   De site-design-regel vult dit aan met width/max-width maar levert GEEN
   container-type/centrering, dus deze regel moet blijven bestaan. */
.layer-section > .layer__sc > .layer__inner {
    container-type: inline-size;
    max-width: var(--content-max);
    margin-inline: auto;
}
/* Full-bleed lagen (header, filling-text, separator, …): de inner over de
   volledige sectiebreedte. Bewust 0,4,0-specificity (.layer-section.layer--bleed)
   + expliciete width:100% zodat dit de site-brede design_general-breedte op
   `.layer-section > .layer__sc > .layer__inner{width:90%;max-width:1280px}`
   verslaat (die inline ná dit bestand wordt geïnjecteerd). */
.layer-section.layer--bleed > .layer__sc > .layer__inner {
    width: 100%;
    max-width: none;
    padding-inline: 0;
}
.layer-section > .layer__fg {
    position: absolute;
    inset: 0;
    z-index: 2;
    pointer-events: none;
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
}

/* ──────────────────────────────────────────────────────────────────────
   layer__text
   ────────────────────────────────────────────────────────────────────── */

.layer__text-layout {
    display: grid;
    gap: var(--space-5);
    grid-template-columns: 1fr;
}

/* Wanneer er een media-kolom is, twee kolommen vanaf wat container-breedte */
@container (min-width: 36rem) {
    .layer__text-layout[data-media-only="0"] {
        grid-template-columns: 1fr 1fr;
        align-items: center;
    }
}
@container (min-width: 48rem) {
    .layer__text-layout[data-media-only="0"] {
        grid-template-columns: calc(var(--left-ratio, .5) * (100% - var(--space-5))) calc((1 - var(--left-ratio, .5)) * (100% - var(--space-5)));
    }
    /* Tekst-only laag (geen media-kolom): de tekst neemt column_text_width% van de
       breedte via --left-ratio; geen ratio / 100% → volle breedte (default 1).
       Center-lagen uitgezonderd — die houden hun eigen gecentreerde layout. */
    .layer__text-layout:not([data-media-only]):not([data-align="center"]) {
        grid-template-columns: calc(var(--left-ratio, 1) * 100%);
    }
}

.layer__text-layout[data-rtl="1"] {
    direction: rtl;
}
.layer__text-layout[data-rtl="1"] > * { direction: ltr; }

.layer__text-layout[data-btt="1"] {
    flex-direction: column-reverse;
}

/* `text_centered` (LayerText subtype): single-column gecentreerde tekst.
   Het renderer-output bevat ook `data-layout="50-50"` (default-waarde),
   maar bij center-align willen we 1 kolom forceren — anders pakt de
   @container-rule de tekst in een halve kolom. */
.layer__text-layout[data-align="center"],
.layer__text-layout[data-align="center"][data-media-only="0"] {
    text-align: center;
    max-width: 50rem;
    margin-inline: auto;
    grid-template-columns: 1fr;
}

/* Header binnen text_centered: tagline + grote titel + intro stapelen
   gecentreerd, met iets ruimere typografie dan de standaard layer__text. */
.layer__text-layout[data-align="center"] .layer__text-tagline {
    text-align: center;
}
.layer__text-layout[data-align="center"] .layer__text-title {
    font-size: clamp(2rem, calc(1rem + 3vw), 3rem);
    line-height: var(--line-tight);
}
.layer__text-layout[data-align="center"] .layer__text-subtitle {
    color: var(--color-fg-muted);
    font-size: var(--fs-intro);
    font-weight: 400;
}

/* ── Filling (text_image) ──────────────────────────────────────────────
   De media-kolom bloedt edge-to-edge en vult de volle kolomhoogte; de tekst
   blijft uitgelijnd op de leesbare content-breedte. De inner gaat full-width
   (zie .layer--bleed) zodat de afbeelding tot de sectierand reikt; de grid
   verdeelt via --left-ratio (default .5 als de renderer niets meegeeft). */
.layer__text-layout[data-filling="1"] {
    gap: 0;
}
.layer__text-layout[data-filling="1"] > .layer__text-col--1 {
    padding-inline: var(--gutter);
    padding-block: var(--space-4);
}

@container (min-width: 36rem) {
    .layer__text-layout[data-filling="1"][data-media-only="0"] {
        grid-template-columns: calc(var(--left-ratio, .5) * 100%) calc((1 - var(--left-ratio, .5)) * 100%);
        align-items: stretch;
    }
    .layer__text-layout[data-filling="1"] > .layer__text-col--1 {
        display: flex;
        flex-direction: column;
        justify-content: center;
        padding-inline-start: max(var(--gutter), calc((100cqw - var(--content-max)) / 2));
        padding-inline-end: var(--space-5);
        padding-block: var(--space-5);
    }
    .layer__text-layout[data-filling="1"] > .layer__text-col--2 {
        min-width: 0;
    }
    .layer__text-layout[data-filling="1"] .layer__text-media {
        height: 100%;
        margin: 0;
        border-radius: 0;
        box-shadow: none;
    }
    /* #23-viewport: sinds de media-rework zit er een .media + .media__viewport
       tussen de figure en de <img>. In vul-modus moet die hele keten 100% hoog
       zijn (incl. een optionele <a>-link-wrapper) zodat de basis-<img> hieronder
       de kolomhoogte echt kan vullen i.p.v. op natuurlijke hoogte te blijven. */
    .layer__text-layout[data-filling="1"] .layer__text-media > a,
    .layer__text-layout[data-filling="1"] .layer__text-media-img,
    .layer__text-layout[data-filling="1"] .layer__text-media-img > .media__viewport {
        height: 100%;
    }
    /* Alleen de hoofdafbeelding vullen — overlay/hover (media-overlay /
       -hover) houden hun eigen object-fit/object-position (overlay_position). */
    .layer__text-layout[data-filling="1"] .layer__text-media img:not(.media-overlay):not(.media-hover) {
        height: 100%;
        object-fit: cover;
    }
}

.layer__text-content {
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}

.layer__text-tagline {
    font-size: var(--fs-tagline);
    text-transform: uppercase;
    letter-spacing: .08em;
    color: var(--color-fg-muted);
    font-weight: 600;
}

.layer__text-title    { font-size: var(--fs-h2); font-weight: 700; }
.layer__text-subtitle { font-size: var(--fs-h3); font-weight: 500; color: var(--color-fg-muted); }
.layer__text-intro    { font-size: var(--fs-intro); }

.layer__text-text :is(p:last-child) { margin-bottom: 0; }
.layer__text-text ul, .layer__text-text ol { padding-left: 1.25em; }

/* USP checkmark-list (textarea → één regel per li) */
.general-list {
    list-style: none;
    padding: 0;
    margin: var(--space-3) 0;
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
}
.general-list--checkmark li {
    display: flex;
    align-items: baseline;
    gap: .5em;
}
.general-list--checkmark li::before {
    content: '';
    flex: 0 0 1em;
    height: 1em;
    background: var(--color-primary) center / contain no-repeat;
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M13.5 3.5 6 11 2.5 7.5' stroke='currentColor' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M13.5 3.5 6 11 2.5 7.5' stroke='currentColor' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

/* Enumerations (child-items van type 'enumeration') */
.enumerations { margin: var(--space-3) 0; }
.enumerations > div {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
}
.enumeration {
    display: flex;
    align-items: center;
    gap: .5em;
}
.enumeration__media { display: flex; flex-shrink: 0; }
.enumeration__media-img { width: 100%; max-width: 100%; height: auto; }
.enumeration__title    { font-weight: 600; }
.enumeration__subtitle { color: var(--color-fg-muted); font-size: .9rem; }
.enumeration__text     { font-size: .9rem; margin-top: .25rem; }
.enumeration__link     { margin-top: .5rem; }
.enumeration-table     { width: 100%; border-collapse: collapse; }
.enumeration-table td  { padding: .4rem .5rem; vertical-align: top; border-bottom: 1px solid var(--color-border, #e2e8f0); }
.enumeration-table tr:last-child td { border-bottom: 0; }

.layer__text-buttons {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    margin-top: var(--space-2);
}

.layer__text-media {
    margin: 0;
    border-radius: var(--radius-md);
    overflow: hidden;
    box-shadow: var(--shadow-1);
}
.layer__text-media img { width: 100%; }
.layer__text-media-caption {
    padding: var(--space-2) var(--space-3);
    color: var(--color-fg-muted);
    font-size: .9rem;
    display: grid;
    gap: .15rem;
}

/* text_form-kolom — de wrapper om het CMS-form. Geen extra padding: het
   form zelf heeft via .form-field BEM al spacing. Een kader geeft context. */
.layer__text-form {
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
    padding: var(--space-4) var(--space-4) var(--space-5);
    border: 1px solid var(--color-border);
}

/* Succes-banner na formulier-inzending (?sent=1). */
.form-success {
    display: flex;
    align-items: flex-start;
    gap: var(--space-3);
    background: color-mix(in srgb, var(--color-primary) 10%, transparent);
    border: 1px solid color-mix(in srgb, var(--color-primary) 30%, transparent);
    border-radius: var(--radius-md);
    padding: var(--space-4);
    color: var(--color-fg);
}
.form-success p { margin: 0; font-weight: 500; }

/* ──────────────────────────────────────────────────────────────────────
   layer__header — hero / page-header
   ────────────────────────────────────────────────────────────────────── */

.layer__header {
    /*padding: 0;*/
    /*margin-bottom: var(--space-6);*/
}
/* Header strekt over de volledige viewport — full-bleed via .layer--bleed
   (de renderer zet die class; zie de regel bij .layer-section.layer--bleed).
   Alleen de payoff-tekst krijgt een max-width, zie .layer__header-overlay. */

.layer__header-body {
    position: relative;
    overflow: hidden;
    isolation: isolate;
    display: grid;
    /* aspect-ratio wordt inline gezet vanuit PHP (uit header_size) zodat
       de container exact de hoogte van de image krijgt — geen stretching,
       geen extra cropping bovenop object-fit. */
}

/* `full`-format: fullscreen viewport-vullend, geen aspect-ratio uit image */
.layer__header-body[data-format="full"] { min-height: 100dvh; }

/* Maximum-hoogte cap zodat ultra-wide banners op smal scherm niet absurd
   hoog worden. CSS `clamp()` voor smooth schalen. */
.layer__header-body[data-format="normal"],
.layer__header-body[data-format="small"],
.layer__header-body[data-format="original"] {
    max-height: 80dvh;
    width: 100%;
}

.layer__header-media-wrap {
    position: absolute;
    inset: 0;
    z-index: -1;
}
.layer__header-media-wrap .media,
.layer__header-media-wrap img,
.layer__header-media-wrap video {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.layer__header-overlays {
    position: absolute;
    inset: 0;
    z-index: 1;
    pointer-events: none;
    /* Overlay-kolom uitlijnen op dezelfde content-breedte als de andere lagen:
       gecentreerde max-width-kolom binnen de full-bleed header (left/right:0 +
       margin-inline:auto = centreren bij over-breedte). */
    max-width: var(--content-max);
    margin-inline: auto;
    /* Alle overlays in dezelfde cel — individueel positioneerbaar via
       align-self/justify-self zonder dat ze elkaars flow verstoren. */
    display: grid;
    grid-template: 1fr / 1fr;
}

.layer__header-overlay {
    grid-area: 1 / 1;
    pointer-events: auto;
    max-width: var(--content-max);
    width: 100%;
    /* Standaard: links-onderaan (klassieke payoff-positie) */
    align-self: end;
    justify-self: start;
    padding: var(--space-7) var(--gutter);
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
    color: #fff;
    text-shadow: 0 1px 3px rgba(0, 0, 0, .35);
}

/* Horizontale positionering */
.layer__header-overlay[data-position-horizontal="left"]   { justify-self: start; }
.layer__header-overlay[data-position-horizontal="center"] { justify-self: center; }
.layer__header-overlay[data-position-horizontal="right"]  { justify-self: end; }

/* Verticale positionering */
.layer__header-overlay[data-position-vertical="start"]  { align-self: start; }
.layer__header-overlay[data-position-vertical="center"] { align-self: center; }
.layer__header-overlay[data-position-vertical="end"]    { align-self: end; }

/* Gradient over de volledige header-body voor leesbaarheid op afbeeldingen.
   Op de body i.p.v. payoff::before zodat hij altijd 100% breed is, ongeacht
   de centered max-width van de payoff. */
.layer__header-body:has(.layer__header-media-wrap)::before {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(to top, rgba(0,0,0,.55), transparent 70%);
    pointer-events: none;
}

.layer__header-title {
    font-size: var(--fs-h1);
    font-weight: 300;
    line-height: var(--line-tight);
    max-width: 30ch;
}

.layer__header-subtitle {
    font-size: var(--fs-h3);
    font-weight: 500;
    max-width: 50ch;
    opacity: .95;
}

.layer__header-buttons {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    margin-top: var(--space-2);
}

/* Voor header zonder media → gewone achtergrond + tekst-kleur */
.layer__header-body:not(:has(.layer__header-media-wrap)) {
    background: var(--color-bg-soft);
}
.layer__header-body:not(:has(.layer__header-media-wrap)) .layer__header-overlay {
    color: var(--color-fg);
    text-shadow: none;
}
.layer__header-body:not(:has(.layer__header-media-wrap))::before {
    display: none;
}

/* ──────────────────────────────────────────────────────────────────────
   layer__cards — grid van banner-cards
   ────────────────────────────────────────────────────────────────────── */

.layer__cards-heading {
    margin-bottom: var(--space-4);
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
}
.layer__cards-title    { font-size: var(--fs-h2); font-weight: 700; }
.layer__cards-subtitle { font-size: var(--fs-h3); color: var(--color-fg-muted); }

.layer__cards-grid {
    display: grid;
    gap: var(--space-3);
    grid-template-columns: repeat(var(--cols-min, 1), 1fr);
}
.layer__cards-grid[data-cols-min="1"] { --cols-min: 1; }
.layer__cards-grid[data-cols-min="2"] { --cols-min: 2; }
.layer__cards-grid[data-cols-min="3"] { --cols-min: 3; }

/* Container-query: meer kolommen als er ruimte is */
@container (min-width: 30rem) {
    .layer__cards-grid[data-cols="2"] { grid-template-columns: repeat(2, 1fr); }
    .layer__cards-grid[data-cols="3"] { grid-template-columns: repeat(2, 1fr); }
    .layer__cards-grid[data-cols="4"] { grid-template-columns: repeat(2, 1fr); }
}
@container (min-width: 50rem) {
    .layer__cards-grid[data-cols="3"] { grid-template-columns: repeat(3, 1fr); }
    .layer__cards-grid[data-cols="4"] { grid-template-columns: repeat(3, 1fr); }
}
@container (min-width: 70rem) {
    .layer__cards-grid[data-cols="4"] { grid-template-columns: repeat(4, 1fr); }
}

.layer__cards-grid[data-title-align="center"] .card { text-align: center; }
.layer__cards-grid[data-title-align="right"]  .card { text-align: right; }

/* ── Card-shell (gedeeld door alle card-producers via CardCollectionRenderer) ──
   .card          = de cel/slide. Transparant; krijgt in een carousel de
                    slide-padding (carousel.css).
   .card__content = de zichtbare box + positioning-context. Een overlay in de
                    content (favoriet-heart, badge) lijnt uit op .card__content,
                    NIET op de gepadde slide → heart staat altijd goed.            */
.card {
    display: flex;
    height: 100%;
    color: inherit;
    text-decoration: none;
}
.card__content {
    position: relative;
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    border-radius: var(--radius-md);
    overflow: hidden;
    box-shadow: var(--shadow-1);
    transition: transform .15s ease, box-shadow .15s ease;
}
/* Generieke hover; de product-variant heeft een eigen hover (product-card.css).
   `:not(.card--product)` houdt de twee uit elkaar → geen specificiteit-strijd. */
.card:not(.card--product):hover .card__content { transform: translateY(-2px); box-shadow: var(--shadow-2); }

/* Klikbare/stapelende inner-content (banner: media + titel onder elkaar). */
.card__link {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    flex: 1;
    color: inherit;
    text-decoration: none;
}

/* .card__content is dé doos voor élke variant. De product-variant zet er z'n
   eigen tokens + hover op in product-card.css (`.card--product .card__content`);
   `.product-card` is daar enkel de layout/positioning-laag (geen eigen box). */

.card__media { width: 100%; }
.card__media img { width: 100%; height: auto; display: block; }
.card__title    { font-size: 1.05rem; font-weight: 600; padding: 0 var(--space-3); }
.card__subtitle { font-size: .9rem;   color: var(--color-fg-muted); padding: 0 var(--space-3) var(--space-3); }

/* Format-varianten (data-attribute op section) */
.layer__cards[data-subtype="postcard"] .card__content { border-radius: var(--radius-lg); }
.layer__cards[data-subtype="wave"]     .card__media img { border-radius: var(--radius-md); }

.layer__cards-empty {
    padding: var(--space-5);
    text-align: center;
    color: var(--color-fg-muted);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
}

.layer__cards-bottom {
    margin-top: var(--space-5);
    display: flex;
    justify-content: center;
}

/* ──────────────────────────────────────────────────────────────────────
   layer__postcard — carousel-stijl met bg-image + overlay + tiles
   ────────────────────────────────────────────────────────────────────── */

.layer__postcard {
    max-width: none;
    padding: 0;
    margin-bottom: var(--space-6);
}

.postcards {
    position: relative;
    isolation: isolate;
    min-height: clamp(20rem, 50vw, 32rem);
    color: #fff;
    overflow: hidden;
}

/* Achtergrond — fade-transition tussen frames */
.postcards__bg {
    position: absolute;
    inset: 0;
    z-index: -2;
}
.postcards__bg img,
.postcards__bg .media {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: opacity .35s ease;
}

/* Gradient onder de tekst zodat 'm leesbaar blijft op willekeurige bgs */
.postcards::before {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(to bottom, transparent 30%, rgba(0,0,0,.45) 75%, rgba(0,0,0,.7));
    z-index: -1;
    pointer-events: none;
}

.postcards__content {
    position: relative;
    max-width: var(--content-max);
    margin: 0 auto;
    padding: var(--space-7) var(--gutter) var(--space-5);
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
    align-items: flex-start;
    min-height: clamp(14rem, 30vw, 22rem);
    text-shadow: 0 1px 3px rgba(0,0,0,.35);
}
.postcards__title {
    font-size: var(--fs-h1);
    font-weight: 700;
    line-height: var(--line-tight);
    max-width: 24ch;
    margin: 0;
}
.postcards__desc {
    font-size: var(--fs-intro);
    max-width: 50ch;
    margin: 0;
    opacity: .95;
}
.postcards__cta {
    margin-top: var(--space-2);
}

/* Tiles wrapper — geen eigen scroll meer, de carousel doet dat zelf */
.postcards__tiles {
    position: relative;
    max-width: var(--content-max);
    margin: 0 auto;
    padding: var(--space-3) var(--gutter) var(--space-4);
}

.postcard {
    background: transparent;
    border: 0;
    padding: 0;
    cursor: pointer;
    text-align: left;
    border-radius: var(--radius-md);
    overflow: hidden;
    color: inherit;
    transition: transform .15s ease;
    opacity: .65;
    width: 100%;
}
.postcard:hover { transform: translateY(-2px); opacity: 1; }
.postcard--active { opacity: 1; outline: 2px solid #fff; outline-offset: -2px; }

.postcard img,
.postcard .media {
    width: 100%;
    aspect-ratio: 1;
    object-fit: cover;
    display: block;
}
.postcard__title {
    display: block;
    padding: var(--space-2);
    font-size: .85rem;
    font-weight: 600;
    background: rgba(0,0,0,.45);
}

/* ──────────────────────────────────────────────────────────────────────
   layer__usps — rij Unique Selling Points
   ────────────────────────────────────────────────────────────────────── */

/* USP-laag krijgt een achtergrond uit --color-bg-soft. Die schakelt zelf al
   light/dark:
   - Geen thema (home): framework-token light-dark(#f7f7f8, #161a20).
   - Met thema: ThemeCss emit light-dark(<theme-light>, <theme-dark>) zodra de
     dark_color*-velden in het CMS gevuld zijn (anders alleen de lichte tint). */
.layer__usps {
    background-color: var(--color-bg-soft);
    /* Verticale padding uit de fluid --space-schaal (clamp-based, mobiel→desktop).
       --space-5 = clamp(1.5rem, 3vw, 2.5rem). Per thema/site te overriden door
       --usp-padding-block te herdefiniëren (bv. var(--space-4) of --space-6). */
    --usp-padding-block: var(--space-5);
    padding-block: var(--usp-padding-block);
}

.layer__usps-title {
    font-size: var(--fs-h2);
    margin: 0 0 var(--space-4);
    text-align: center;
}

.layer__usps-image-wrap {
    margin-bottom: var(--space-4);
    border-radius: var(--radius-md);
    overflow: hidden;
}

.layer__usps-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: grid;
    gap: var(--space-3);
    grid-template-columns: 1fr;
}
@container (min-width: 32rem) {
    .layer__usps-list { grid-template-columns: repeat(2, 1fr); }
}
@container (min-width: 56rem) {
    .layer__usps-list { grid-template-columns: repeat(3, 1fr); }
}
.layer__usps[data-view="inline"] .layer__usps-list {
    grid-template-columns: 1fr;
}
@container (min-width: 48rem) {
    .layer__usps[data-view="inline"] .layer__usps-list {
        grid-template-columns: repeat(3, 1fr);
        gap: var(--space-5);
    }
}

.usp {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: var(--space-3);
    align-items: center;
}
.usp__icon {
    /* Maat per laag instelbaar via CMS (advanced_scale → --usp-icon-size op
       de sectie); zonder die instelling de vertrouwde 3rem-default. */
    width: var(--usp-icon-size, 3rem);
    height: var(--usp-icon-size-h, var(--usp-icon-size, 3rem));
    /* Inline-SVG (image_inline) volgt deze kleur via currentColor → kleurt mee
       met het thema. Zwart/wit (volgt voorgrond): bijna-zwart in licht, bijna-wit
       in donker. */
    color: var(--color-fg);
}
.usp__icon img { width: 100%; height: 100%; object-fit: contain; }
.usp__icon svg,
.enumeration__media svg { width: 100%; height: 100%; display: block; fill: currentColor; }
/* Harde fills/strokes naar themakleur forceren (mono-iconen); `none` en
   gradient-refs (url(/css/...)) blijven met rust zodat ze niet dichtlopen. */
.usp__icon svg [fill]:not([fill="none"]):not([fill^="url"]),
.enumeration__media svg [fill]:not([fill="none"]):not([fill^="url"])     { fill: currentColor; }
.usp__icon svg [stroke]:not([stroke="none"]):not([stroke^="url"]),
.enumeration__media svg [stroke]:not([stroke="none"]):not([stroke^="url"]) { stroke: currentColor; }

/* Container-color: erft naar de SVG's currentColor zodat ze meekleuren met
   het thema. Het icoon is een check, dus brand-primary past visueel beter
   dan body-fg — past zich aan wanneer de site --color-primary wijzigt.
   Width via CSS-var; legacy gebruikte een PHP-side `enumeration_media_max_width`-
   setting (zie library/App/Plugin/Layer/Column/Enumeration.php ~r95). Inline
   SVG schaalt responsive zodra de container krimpt onder de var-default. */
.enumeration__media {
    color: var(--color-primary);
    width: var(--enumeration-icon-size, 64px);
    max-width: 100%;
}
.enumeration__media svg {
    max-width: 100%;
    height: auto;
}
.usp__body { display: flex; flex-direction: column; gap: .15rem; }
.usp__tagline {
    font-size: var(--fs-tagline);
    text-transform: uppercase;
    letter-spacing: .08em;
    color: var(--color-fg);
    font-weight: 600;
}
.usp__title {
    font-weight: 600;
    line-height: 1.2;
    font-size: 1rem;
    color: var(--color-primary);
}
.usp__text  { color: var(--color-fg-muted); font-size: .9rem; }

.layer__usps-cta {
    margin-top: var(--space-5);
    display: flex;
    justify-content: center;
}

/* ──────────────────────────────────────────────────────────────────────
   layer__faq — accordion van veelgestelde vragen
   ────────────────────────────────────────────────────────────────────── */

/* Sectie krijgt de thema-tint via --color-bg-soft (zelfde patroon als
   .layer__usps): schakelt light/dark mee zodra een thema dark_color* heeft,
   en op de home via het framework-token. */
.layer__faq {
    background-color: #faf5ef;
}

.layer__faq-title {
    font-size: var(--fs-h2);
    margin: 0 0 var(--space-4);
}

.layer__faq-list { display: flex; flex-direction: column; gap: var(--space-2); }

/* De kaartjes zelf op --color-bg-elev (surface-token): contrasteert met de
   getinte sectie-achtergrond, ook in dark-mode. */
.faq {
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    padding: var(--space-1) var(--space-3);
    background: var(--color-bg-elev);
    transition: background .15s ease;
}
.faq[open] { background: var(--color-bg); }

.faq__question {
    font-weight: 600;
    cursor: pointer;
    list-style: none;
    padding: var(--space-1) 0;
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--space-3);
}
.faq__question::-webkit-details-marker { display: none; }
.faq__question::after {
    content: '';
    width: 1rem;
    height: 1rem;
    background-color: currentColor;
    mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>');
    mask-repeat: no-repeat;
    mask-position: center;
    mask-size: contain;
    transition: transform .15s ease;
    flex-shrink: 0;
}
.faq[open] .faq__question::after { transform: rotate(180deg); }

.faq__answer {
    padding: 0 0 var(--space-3);
    color: var(--color-fg-muted);
    line-height: 1.6;
}
.faq__answer p:last-child { margin-bottom: 0; }

.layer__faq-empty {
    padding: var(--space-4);
    text-align: center;
    color: var(--color-fg-muted);
}

/* ──────────────────────────────────────────────────────────────────────
   layer__inspiration — tegel-grid met inspiration_item_tile-children
   ────────────────────────────────────────────────────────────────────── */

/* Verticale witruimte rond de inspiration-/collecties-sectie (deze laag heeft
   geen eigen design_layer-spacing). */
.layer__inspiration {
    margin-block: var(--space-6);
}

.layer__inspiration-title {
    font-size: var(--fs-h2);
    margin: 0 0 var(--space-4);
}

/* Gelijkmatig raster: even grote tegels (4/3), zoveel kolommen als passen. */
.layer__inspiration-grid {
    display: grid;
    /* Gelijkmatig raster: even grote tegels, netjes uitgelijnd (geen masonry).
       auto-fit + minmax → zoveel kolommen als passen (bv. 4 op desktop). */
    grid-template-columns: repeat(auto-fit, minmax(min(15rem, 100%), 1fr));
    gap: var(--space-3);
}
/* Masonry-slot-spans neutraliseren → elke tegel even groot. */
.inspiration-tile--slot1,
.inspiration-tile--slot2,
.inspiration-tile--slot3,
.inspiration-tile--slot4,
.inspiration-tile--slot5 {
    grid-column: auto;
    grid-row: auto;
}

/* Mobile: stapel als 1-col grid, terug naar tile-eigen aspect-ratio. */
@media (max-width: 48rem) {
    .layer__inspiration-grid {
        grid-template-columns: 1fr;
        aspect-ratio: auto;
    }
    .inspiration-tile--slot1,
    .inspiration-tile--slot2,
    .inspiration-tile--slot3,
    .inspiration-tile--slot4,
    .inspiration-tile--slot5 {
        grid-column: auto;
        grid-row: auto;
        aspect-ratio: 4 / 3;
    }
}

/* Hero-style tiles — image vult de tile, content valt op een gradient
   bovenop. Hover-zoom op de image, micro-lift op de tile. */
.inspiration-tile {
    position: relative;
    display: block;
    color: #fff;
    text-decoration: none;
    border-radius: var(--radius-md);
    overflow: hidden;
    background: var(--color-bg-soft);
    box-shadow: var(--shadow-1);
    isolation: isolate;
    transition: transform var(--dur-med) var(--ease-out),
                box-shadow var(--dur-med) var(--ease-out);
    /* Elke tegel even hoog via een vaste aspect-ratio; het raster regelt de
       breedte. Geen min-height:100% meer (was nodig voor de masonry-rijen). */
    min-height: 0;
}
.inspiration-tile {
    aspect-ratio: 4 / 3;
}
.inspiration-tile:hover,
.inspiration-tile:focus-visible {
    transform: translateY(-3px);
    box-shadow: var(--shadow-2);
}


/* Image positioneren als full-bleed achtergrond. MediaRender plaatst een
   `<picture>` / `<img>` als child — vangt allebei via een directe child-
   selector. Zoom-on-hover via transform. */
.inspiration-tile > .media,
.inspiration-tile > picture,
.inspiration-tile > img {
    position: absolute;
    inset: 0;
    z-index: -1;
    width: 100%;
    height: 100%;
}
.inspiration-tile > .media img,
.inspiration-tile > picture img,
.inspiration-tile > img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform var(--dur-slow) var(--ease-out);
}
.inspiration-tile:hover > .media img,
.inspiration-tile:hover > picture img,
.inspiration-tile:hover > img {
    transform: scale(1.06);
}

/* Gradient overlay voor leesbaarheid van de witte tekst. */
.inspiration-tile::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(to top, rgba(0,0,0,.72) 0%, rgba(0,0,0,.35) 45%, transparent 70%);
    pointer-events: none;
    z-index: -1;
}

.inspiration-tile__content {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    padding: var(--space-4) var(--space-3) var(--space-3);
    display: flex;
    flex-direction: column;
    gap: .25rem;
    text-shadow: 0 1px 2px rgba(0,0,0,.45);
}
.inspiration-tile__tagline {
    align-self: flex-start;
    padding: 0.2rem 0.55rem;
    background: rgba(255,255,255,.18);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    border-radius: 999px;
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: .08em;
    font-weight: 600;
    color: #fff;
    margin-bottom: .35rem;
    text-shadow: none;
}
.inspiration-tile__title {
    font-size: 1.25rem;
    font-weight: 700;
    line-height: var(--line-tight);
    margin: 0;
    color: #fff;
}
.inspiration-tile__subtitle {
    font-size: .9rem;
    color: rgba(255,255,255,.85);
    margin: 0;
}

/* Wanneer er geen image is (zeldzaam), val terug op een nette tint. */
.inspiration-tile:not(:has(> .media, > picture, > img)) {
    background: linear-gradient(135deg, var(--color-primary) 0%, color-mix(in srgb, var(--color-primary), #000 30%) 100%);
}
.inspiration-tile:not(:has(> .media, > picture, > img))::after {
    background: linear-gradient(to top, rgba(0,0,0,.25), transparent 60%);
}

/* ──────────────────────────────────────────────────────────────────────
   layer__quick-buttons — rij snelkoppelingen
   ────────────────────────────────────────────────────────────────────── */

.layer__quick-buttons {
    /* Compacter dan een gewone layer — vaak strip-onder-hero */
    padding-block: var(--space-3);
}

.layer__quick-buttons-list {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2);
    justify-content: center;
}

.quick-button {
    display: inline-flex;
    align-items: center;
    padding: var(--space-2) var(--space-4);
    background: var(--color-bg-soft);
    color: var(--color-fg);
    border-radius: 999px;          /* pill shape */
    text-decoration: none;
    font-weight: 600;
    font-size: .95rem;
    border: 1px solid var(--color-border);
    transition: transform .12s ease, background .12s ease, color .12s ease;
}
.quick-button:hover {
    transform: translateY(-1px);
    background: var(--color-primary);
    color: var(--color-primary-fg);
    border-color: transparent;
}
.quick-button:focus-visible {
    outline: 2px solid var(--color-primary);
    outline-offset: 2px;
}

/* Theme-data — placeholder voor toekomstige CMS-theming.
   Zodra MODULE_WEBSITE_SETTINGS-themes worden ingelezen, kunnen we
   `.quick-button[data-theme="13"] { --color-primary: ...; }` zetten.
   Tot dan ziet elke quick-button er hetzelfde uit. */

/* ──────────────────────────────────────────────────────────────────────
   layer__placeholder — fallback voor nog niet geïmplementeerde types
   ────────────────────────────────────────────────────────────────────── */

.layer__placeholder {
    background: var(--color-bg-soft);
    border: 1px dashed var(--color-border);
    border-radius: var(--radius-md);
}
.layer__placeholder-header {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    align-items: baseline;
    color: var(--color-fg-muted);
    font-size: .9rem;
}
.layer__placeholder-header strong { color: var(--color-fg); }
.layer__placeholder-details { margin-top: var(--space-2); font-size: .85rem; }
.layer__placeholder-details summary { cursor: pointer; color: var(--color-link); }
.layer__placeholder-details dl {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: .25rem var(--space-4);
    margin: var(--space-2) 0 0;
}
.layer__placeholder-details dt { font-weight: 600; }

/* ─── reviews_layer ─────────────────────────────────────────────────────── */
.layer__reviews {
    padding-block: var(--space-8);
}
.layer__reviews-heading {
    text-align: center;
    margin-bottom: var(--space-4);
}
/* Kop-maat komt uit het thema (.general__title) — hier niet pinnen. */
.layer__reviews-heading h2 { margin: 0; }
.layer__reviews-heading p  { color: var(--color-fg-muted); margin: var(--space-1) 0 0; }

.reviews__banner-slide,
.reviews__item {
    /* --color-bg-elev is themable (light-dark): wit in light, donker in dark.
       Voorheen --color-surface (bestaat niet) → altijd #fff = spierwit in dark. */
    background: var(--color-bg-elev);
    border-radius: var(--radius-md);
    padding: var(--space-4);
    align-self: stretch;
    display: flex;
    flex-direction: column;
    box-shadow: 0 1px 3px rgba(0,0,0,.08);
}

/* Pijltjes net buiten de review-cards: carousel inset met ruimte voor
   knoppen aan beide zijden; viewport blijft de cards begrenzen, controls
   spannen het volle carousel-bereik (incl. de inset). */
.layer__reviews .carousel {
    padding-inline: calc(2.5rem + var(--space-3));
}
.layer__reviews .carousel__controls {
    padding: 0;
}

.reviews__banner {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: var(--space-3);
    align-items: start;
    background: var(--color-primary, #c1272d);
    color: #fff;
    border-radius: var(--radius-md);
    padding: var(--space-4);
    height: 100%;
}
.reviews__banner-score {
    font-size: 2.5rem;
    font-weight: 700;
    line-height: 1;
    padding: var(--space-2) var(--space-3);
    background: rgba(255,255,255,.15);
    border-radius: var(--radius-sm);
}
.reviews__banner-title    { font-size: 1.25rem; margin: 0; }
.reviews__banner-subtitle { margin: var(--space-1) 0 0; opacity: .9; }
.reviews__banner-meta     { margin: var(--space-1) 0 var(--space-3); font-size: .85rem; opacity: .8; }
.reviews__banner-cta a    { background: var(--color-bg-elev); color: var(--color-primary, #c1272d); }

/* Rating-indicator: 5 kaars-vlammetjes (mask-image), neutrale basis,
   gevuld in kaarsgoud op basis van rating (`reviews__item-stars-fill`-width).
   `--flame-empty` switcht per color-scheme (system prefers + `data-color-scheme`-toggle). */
.reviews__item-stars {
    --flame-empty: rgba(0, 0, 0, .12);
    --flame-color: var(--color-primary, #c8902a);
    --flame-size: 22px;
    --flame-gap: 4px;
    --flame-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M13.5.67s.74 2.65.74 4.8c0 2.06-1.35 3.73-3.41 3.73-2.07 0-3.63-1.67-3.63-3.73l.03-.36C5.21 7.51 4 10.62 4 14c0 4.42 3.58 8 8 8s8-3.58 8-8C20 8.61 17.41 3.8 13.5.67z'/></svg>");
    width: calc(5 * var(--flame-size) + 4 * var(--flame-gap));
    height: var(--flame-size);
    background-color: var(--flame-empty);
    -webkit-mask: var(--flame-mask) 0 0 / calc(var(--flame-size) + var(--flame-gap)) var(--flame-size) repeat-x;
            mask: var(--flame-mask) 0 0 / calc(var(--flame-size) + var(--flame-gap)) var(--flame-size) repeat-x;
    position: relative;
    margin-bottom: var(--space-2);
}
.reviews__item-stars-fill {
    position: absolute;
    inset: 0 auto 0 0;
    background-color: var(--flame-color);
    -webkit-mask: var(--flame-mask) 0 0 / calc(var(--flame-size) + var(--flame-gap)) var(--flame-size) repeat-x;
            mask: var(--flame-mask) 0 0 / calc(var(--flame-size) + var(--flame-gap)) var(--flame-size) repeat-x;
}
@media (prefers-color-scheme: dark) {
    .reviews__item-stars { --flame-empty: rgba(255, 255, 255, .18); }
}
[data-color-scheme="light"] .reviews__item-stars { --flame-empty: rgba(0, 0, 0, .12); }
[data-color-scheme="dark"]  .reviews__item-stars { --flame-empty: rgba(255, 255, 255, .18); }
/* Levende vlam: de gevulde vlammetjes ademen zacht (gloed rond de vlam-vorm).
   Subtiel, niet springerig. Uit bij reduced-motion. */
@media (prefers-reduced-motion: no-preference) {
    .reviews__item-stars-fill {
        animation: flame-breathe 3.2s var(--ease-in-out, ease-in-out) infinite;
    }
}
@keyframes flame-breathe {
    0%, 100% { filter: drop-shadow(0 0 1px transparent); }
    50%      { filter: drop-shadow(0 0 6px var(--flame-color)); }
}
.reviews__item-title {
    font-size: 1rem;
    margin: 0 0 var(--space-2);
}
.reviews__item-text {
    flex: 1 1 auto;
    margin: 0 0 var(--space-3);
    color: var(--color-fg);
    line-height: 1.5;
}
.reviews__item-foot {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: var(--space-2);
    font-size: .85rem;
    color: var(--color-fg-muted);
}
.reviews__item-author { font-weight: 600; }

/* ─── layer_breadcrumbs ─────────────────────────────────────────────────── */
.layer__breadcrumbs {
    padding: var(--space-3) var(--space-4);
    font-size: 0.875rem;
    color: var(--color-fg-muted);
}
.breadcrumb {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5em;
    list-style: none;
    margin: 0;
    padding: 0;
}
.breadcrumb__item + .breadcrumb__item::before {
    content: "›";
    margin-right: 0.5em;
    color: var(--color-fg-muted);
    opacity: 0.6;
}
.breadcrumb__item a {
    color: inherit;
    text-decoration: none;
}
.breadcrumb__item a:hover { text-decoration: underline; }
.breadcrumb__item--current { color: var(--color-fg); font-weight: 500; }

/* ─── layer_attraction_suggestions ─────────────────────────────────────── */
.layer__suggestions { padding-block: var(--space-6); }
.layer__suggestions-title { font-size: 1.5rem; margin: 0 0 var(--space-4); text-align: center; }
.layer__suggestions-grid {
    list-style: none; margin: 0; padding: 0;
    display: grid;
    gap: var(--space-3);
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
}
.suggestion-card { background: var(--color-surface, #fff); border-radius: var(--radius-md); overflow: hidden; }
.suggestion-card__link { display: block; color: inherit; text-decoration: none; }
.suggestion-card__image img { display: block; width: 100%; height: auto; }
.suggestion-card__title { display: block; padding: var(--space-2) var(--space-3); font-weight: 600; }
.suggestion-card:hover { transform: translateY(-2px); transition: transform .15s ease; }

/* ─── layer_attractions — alle attracties uit één category ─────────────── */
.layer__attractions { padding-block: var(--space-5); }
.layer__attractions-title {
    font-size: var(--fs-h2);
    font-weight: 700;
    margin: 0 0 var(--space-4);
}
.layer__attractions-grid {
    list-style: none; margin: 0; padding: 0;
    display: grid;
    gap: var(--space-3);
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
.attraction-card {
    background: var(--color-bg-elev);
    border-radius: var(--radius-md);
    overflow: hidden;
    transition: transform .15s ease, box-shadow .15s ease;
}
.attraction-card:hover {
    transform: translateY(-2px);
    box-shadow: 0 12px 24px -8px rgba(0,0,0,.18);
}
.attraction-card__link {
    display: grid;
    grid-template-rows: auto 1fr;
    height: 100%;
    color: inherit;
    text-decoration: none;
}
/* MediaRender wrapt de <img> in <div class="media"> — die moet de
   aspect-cell vullen anders krijgt de inner img height:100% van 0. */
.attraction-card__image,
.attraction-card .media {
    display: block;
    width: 100%;
    aspect-ratio: 4 / 3;
    overflow: hidden;
}
.attraction-card .media > img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.attraction-card__title {
    display: block;
    padding: var(--space-2) var(--space-3) var(--space-3);
    font-weight: 600;
    font-size: 1rem;
    line-height: 1.25;
}

/* ─── layer_arrangements — cards van vakantie-arrangementen ───────────── */
.layer__arrangements-title {
    font-size: var(--fs-h2);
    font-weight: 700;
    margin: 0 0 var(--space-4);
}
.layer__arrangements-grid {
    list-style: none; margin: 0; padding: 0;
    display: grid;
    gap: var(--space-3);
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
}
.arrangement-card {
    background: var(--color-bg-elev);
    border-radius: var(--radius-md);
    overflow: hidden;
    box-shadow: 0 1px 3px rgba(0,0,0,.06);
    transition: transform .15s ease, box-shadow .15s ease;
}
.arrangement-card:hover {
    transform: translateY(-2px);
    box-shadow: 0 12px 24px -8px rgba(0,0,0,.18);
}
.arrangement-card__link { display: block; color: inherit; text-decoration: none; }
/* MediaRender wrapt de <img> in .media — die moet de aspect-cell vullen,
   anders krijgt de inner <img> height:100% van 0. */
.arrangement-card__image,
.arrangement-card .media {
    display: block;
    width: 100%;
    aspect-ratio: 4 / 3;
    overflow: hidden;
}
.arrangement-card .media > img {
    display: block; width: 100%; height: 100%; object-fit: cover;
}
.arrangement-card__body {
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
    padding: var(--space-3);
}
.arrangement-card__title { margin: 0; font-size: 1.1rem; font-weight: 700; }
.arrangement-card__subtitle { margin: 0; color: var(--color-fg-muted); font-size: .9rem; }
.arrangement-card__intro { margin: var(--space-1) 0 0; font-size: .9rem; line-height: 1.45; }
.arrangement-card__price {
    margin-top: var(--space-2);
    font-weight: 700;
    color: var(--color-primary);
}

/* ─── layer_arrangement_detail — synthetic op arrangement-pages (DT 258) */
.layer__arrangement-detail { display: flex; flex-direction: column; gap: var(--space-5); }
.arrangement-detail__hero {
    display: grid;
    gap: var(--space-4);
    grid-template-columns: 1fr;
}
@container (min-width: 36rem) {
    .arrangement-detail__hero { grid-template-columns: 3fr 2fr; align-items: center; }
}
.arrangement-detail__image,
.arrangement-detail__hero .media {
    display: block;
    width: 100%;
    aspect-ratio: 16 / 9;
    border-radius: var(--radius-md);
    overflow: hidden;
}
.arrangement-detail__hero .media > img {
    display: block; width: 100%; height: 100%; object-fit: cover;
}
.arrangement-detail__hero-body { display: flex; flex-direction: column; gap: var(--space-2); }
.arrangement-detail__title { margin: 0; font-size: var(--fs-h1); font-weight: 700; }
.arrangement-detail__subtitle { margin: 0; color: var(--color-fg-muted); font-size: var(--fs-h3); }
.arrangement-detail__intro { margin: var(--space-2) 0 0; font-size: var(--fs-intro); }
.arrangement-detail__text :is(p:last-child) { margin-bottom: 0; }
.arrangement-detail__text ul, .arrangement-detail__text ol { padding-left: 1.25em; }
.arrangement-detail__price-block {
    display: flex; flex-direction: column; gap: var(--space-1);
    padding: var(--space-4);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
    max-width: 24rem;
}
.arrangement-detail__price { display: flex; align-items: baseline; gap: var(--space-2); }
.arrangement-detail__price-label {
    font-size: .85rem; text-transform: uppercase; letter-spacing: .06em;
    color: var(--color-fg-muted);
}
.arrangement-detail__price-value { font-size: var(--fs-h2); font-weight: 700; color: var(--color-primary); }
.arrangement-detail__price-line { color: var(--color-fg-muted); font-size: .95rem; }
.arrangement-detail__variants { display: flex; flex-direction: column; gap: var(--space-3); }
.arrangement-detail__variants-title { margin: 0; font-size: var(--fs-h3); font-weight: 600; }
.arrangement-detail__variant-list {
    list-style: none; margin: 0; padding: 0;
    display: grid; gap: var(--space-2);
}
.variant {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--space-1) var(--space-3);
    padding: var(--space-3);
    background: var(--color-bg-elev);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    align-items: baseline;
}
@container (min-width: 36rem) {
    .variant { grid-template-columns: 1fr auto auto auto; }
}
.variant__dates    { font-weight: 600; }
.variant__nights   { color: var(--color-fg-muted); font-size: .9rem; }
.variant__rentable { color: var(--color-fg-muted); font-size: .9rem; }
.variant__price    { font-weight: 700; color: var(--color-primary); justify-self: end; }

/* ─── view 1: by accommodation — banner-cards met ribbon & datums-lijst */
.arrangement-detail__by-acc {
    list-style: none; margin: 0; padding: 0;
    display: grid;
    gap: var(--space-4);
    grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
}
.acc-card {
    position: relative;
    display: flex;
    flex-direction: column;
    background: var(--color-bg-elev);
    border-radius: var(--radius-md);
    overflow: hidden;
    box-shadow: 0 1px 3px rgba(0,0,0,.08);
    transition: transform .2s ease, box-shadow .2s ease;
}
.acc-card:hover {
    transform: translateY(-3px);
    box-shadow: 0 16px 32px -10px rgba(0,0,0,.22);
}
.acc-card__banner {
    position: relative;
    overflow: hidden;
}
.acc-card__image,
.acc-card .media {
    display: block;
    width: 100%;
    aspect-ratio: 16 / 9;
}
.acc-card .media > img {
    display: block; width: 100%; height: 100%; object-fit: cover;
}
/* Ribbon: linksboven over de banner — primary color block met period
   uppercase boven en prijs eronder. Subtiele schaduw, kleine schuine
   "puntje" rechtsonder via clip-path geeft 't een tag-gevoel. */
.acc-card__ribbon {
    position: absolute;
    top: var(--space-3);
    left: 0;
    background: var(--color-primary);
    color: var(--color-primary-fg);
    padding: var(--space-2) var(--space-3) var(--space-2) var(--space-4);
    display: flex;
    flex-direction: column;
    line-height: 1.1;
    box-shadow: 0 6px 16px rgba(0,0,0,.25);
    clip-path: polygon(0 0, 100% 0, calc(100% - .6rem) 50%, 100% 100%, 0 100%);
    padding-right: calc(var(--space-3) + .6rem);
    transform: translateX(0);
    transition: transform .25s ease;
}
.acc-card:hover .acc-card__ribbon { transform: translateX(.2rem); }
.acc-card__ribbon-period {
    font-size: .65rem;
    text-transform: uppercase;
    letter-spacing: .08em;
    opacity: .85;
}
.acc-card__ribbon-price {
    font-size: 1.15rem;
    font-weight: 800;
    margin-top: 1px;
}
.acc-card__body {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    padding: var(--space-3);
}
.acc-card__title {
    margin: 0;
    font-size: 1.05rem;
    font-weight: 700;
}
.acc-card__dates {
    list-style: none; margin: 0; padding: 0;
    display: flex;
    flex-direction: column;
}
.acc-card__date {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    padding: var(--space-1) 0;
    border-top: 1px dashed var(--color-border);
    font-size: .9rem;
}
.acc-card__date:first-child { border-top: 0; }
.acc-card__date-range { color: var(--color-fg); }
.acc-card__date-price { color: var(--color-fg-muted); font-variant-numeric: tabular-nums; }


/* ─── layer_columns — module_column-kinderen naast elkaar ──────────────
   Na het hijsen is .layer__columns de .layer-section met alleen .layer__bg/
   sc/fg als directe kinderen; de kolommen zitten in .layer__inner. De flex-
   rij hoort dus op die inner, niet op .layer__columns zelf. */
.layer__columns > .layer__sc > .layer__inner {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-4);
    align-items: stretch;
}
.layer__columns > .layer__sc > .layer__inner > * {
    flex: 1 1 calc((100% - var(--space-4) * 2) / 3);
    min-width: 16rem;
    /* flex-item bepaalt zelf z'n breedte — reset de centrering/max-width/gutter
       van de generieke `.layer:not(.layer-section)`-regel op geneste lagen. */
    max-width: none;
    margin-inline: 0;
    padding-inline: 0;
}
/* `data-flow="nowrap"` → één rij, scrollt indien nodig. */
.layer__columns[data-flow="nowrap"] > .layer__sc > .layer__inner { flex-wrap: nowrap; overflow-x: auto; }
.layer__columns[data-max-width="800px"]  > .layer__sc > .layer__inner { max-width:  800px; }
.layer__columns[data-max-width="1040px"] > .layer__sc > .layer__inner { max-width: 1040px; }
.layer__columns[data-max-width="1280px"] > .layer__sc > .layer__inner { max-width: 1280px; }
.layer__columns[data-max-width="1920px"] > .layer__sc > .layer__inner { max-width: 1920px; }
.layer__columns[data-max-width="100%"]   > .layer__sc > .layer__inner { max-width: none; }

/* ─── layer_mapplic — embedded interactieve plattegrond (Mapplic-component)
   Volgt dev26's `_layer__mapplic.____scss`-recept: wrapper is full-bleed (breekt
   uit de `.layer { max-width }`), zwarte achtergrond, GEEN height/aspect-
   ratio insturen — Mapplic bepaalt zelf z'n container-hoogte (default 600px).
   Map is altijd zichtbaar, pre-klik via pointer-events:none non-interactief,
   met overlay-card (glas) erboven. `.is-open` faded overlay weg. ─────────── */
.layer__mapplic { padding-inline: 0; max-width: none; }
.layer__mapplic .mapplic-wrapper {
    position: relative;
    width: 100vw;
    margin-inline: calc(50% - 50vw);
    overflow: hidden;
    background: #000;
}
.layer__mapplic .mapplic-wrapper mapplic-map {
    display: block;
    width: 100%;
}
.layer__mapplic .mapplic-wrapper.is-locked mapplic-map {
    pointer-events: none;
}
.layer__mapplic .mapplic-overlay {
    position: absolute;
    inset: 0;
    z-index: 1;
    background: linear-gradient(180deg,
        rgba(0, 0, 0, .12)   0%,
        rgba(0, 0, 0, .22)  45%,
        rgba(0, 0, 0, .42) 100%);
    transition: opacity .35s ease, visibility .35s ease;
}
.layer__mapplic .mapplic-wrapper.is-open .mapplic-overlay {
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
}
.layer__mapplic .mapplic-overlay__inner {
    width: 100%;
    max-width: var(--content-max);
    height: 100%;
    margin: 0 auto;
    padding: var(--space-5) var(--gutter);
    box-sizing: border-box;
    display: flex;
    align-items: flex-end;
    justify-content: flex-start;
}
.layer__mapplic .mapplic-overlay__content {
    max-width: 28rem;
    color: #fff;
    background: rgba(0, 0, 0, .34);
    backdrop-filter: blur(8px);
    -webkit-backdrop-filter: blur(8px);
    padding: var(--space-4);
    border: 1px solid rgba(255, 255, 255, .14);
    border-radius: var(--radius-md);
    box-shadow: 0 18px 50px rgba(0, 0, 0, .24);
}
.layer__mapplic .mapplic-overlay__eyebrow {
    display: inline-block;
    margin: 0 0 var(--space-2);
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, .82);
}
.layer__mapplic .mapplic-overlay__title {
    margin: 0 0 var(--space-2);
    font-size: var(--fs-h3);
    font-weight: 600;
    color: #fff;
    text-shadow: 0 2px 20px rgba(0, 0, 0, .35);
}
.layer__mapplic .mapplic-overlay__text {
    margin: 0 0 var(--space-3);
    font-size: .95rem;
    line-height: 1.5;
    color: rgba(255, 255, 255, .9);
    max-width: 34ch;
}
.layer__mapplic .mapplic-overlay__actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2);
    align-items: center;
}

/* ─── layer_attraction_sensations ──────────────────────────────────────── */
.layer__sensations { padding-block: var(--space-4); }
.layer__sensations-list {
    list-style: none; margin: 0; padding: 0;
    display: flex; flex-wrap: wrap; gap: var(--space-4);
    justify-content: center;
}
.sensation {
    display: flex; flex-direction: column; align-items: center; gap: var(--space-1);
    min-width: 80px; text-align: center;
}
.sensation__icon { width: 64px; height: 64px; object-fit: contain; }
.sensation__title { font-size: 0.8rem; color: var(--color-fg-muted); }


/* ─── layer_colorpalette ───────────────────────────────────────────────── */
.layer__colorpalette { padding-block: var(--space-6); text-align: center; }

.layer__colorpalette-head {
    max-width: 42rem;
    margin-inline: auto;
    margin-bottom: var(--space-6);
}
.layer__colorpalette-tagline {
    text-transform: uppercase;
    letter-spacing: .25em;
    font-size: .75rem;
    color: var(--color-fg-muted);
    margin-bottom: var(--space-2);
}
.layer__colorpalette-title { margin: 0 0 var(--space-3); }
.layer__colorpalette-text { color: var(--color-fg-muted); }

.layer__colorpalette-list {
    list-style: none; margin: 0; padding: 0;
    display: flex; flex-wrap: wrap;
    justify-content: center;
    gap: var(--space-5);
}
.color-swatch {
    display: flex; flex-direction: column; align-items: center;
    gap: var(--space-2);
    min-width: 7rem;
}
.color-swatch__dot {
    width: 5rem; height: 5rem;
    border-radius: 50%;
    background: var(--swatch-color, transparent);
    box-shadow: 0 2px 8px rgb(0 0 0 / .12);
}
/* Ring alleen bij hover */
.color-swatch__dot {
    outline: 2px solid transparent;
    outline-offset: 4px;
    transition: outline-color .15s ease;
}
.color-swatch:hover .color-swatch__dot {
    outline-color: var(--swatch-color, var(--color-primary));
}
.color-swatch__body {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .1rem;
}
.color-swatch__title { font-size: .95rem; font-weight: 500; }
.color-swatch__subtitle { font-size: .8rem; color: var(--color-fg-muted); }

/* ─── /css/layer-booking.css ─── */
/* layer-booking.css — booking flow: verblijf-overzicht, stepper, extra's, gegevens, price-matrix. */

/* ─── layer_booking — step 1 (Verblijf-overzicht, preview-call) ──────── */
.booking-summary { display: flex; flex-direction: column; gap: var(--space-4); }
.booking-summary__hero {
    display: grid;
    gap: var(--space-4);
    grid-template-columns: 1fr;
}
@container (min-width: 36rem) {
    .booking-summary__hero { grid-template-columns: 3fr 4fr; align-items: center; }
}
.booking-summary__image,
.booking-summary__hero .media {
    display: block; width: 100%; aspect-ratio: 16 / 9;
    border-radius: var(--radius-md); overflow: hidden;
}
.booking-summary__hero .media > img {
    display: block; width: 100%; height: 100%; object-fit: cover;
}
.booking-summary__hero-body { display: flex; flex-direction: column; gap: var(--space-2); }
.booking-summary__step {
    font-size: .8rem; text-transform: uppercase; letter-spacing: .08em;
    color: var(--color-fg-muted); font-weight: 600;
}
.booking-summary__title    { margin: 0; font-size: var(--fs-h1); font-weight: 700; }
.booking-summary__subtitle { margin: 0; color: var(--color-fg-muted); font-size: var(--fs-h3); }
.booking-summary__facts {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: var(--space-2) var(--space-4);
    margin: 0;
    padding: var(--space-4);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
}
.booking-summary__facts dt {
    font-size: .8rem; text-transform: uppercase; letter-spacing: .06em;
    color: var(--color-fg-muted); font-weight: 600;
}
.booking-summary__facts dd { margin: 0; font-weight: 500; }
.booking-summary__section-title { margin: 0; font-size: var(--fs-h3); font-weight: 600; }
.booking-summary__items {
    list-style: none; margin: 0; padding: 0;
    display: flex; flex-direction: column;
}
.booking-summary__item {
    display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-3);
    padding: var(--space-2) 0;
    border-top: 1px dashed var(--color-border);
    font-size: .95rem;
}
.booking-summary__item:first-child { border-top: 0; }
.booking-summary__item-price {
    color: var(--color-fg-muted); font-variant-numeric: tabular-nums;
}
.booking-summary__total {
    display: flex; justify-content: space-between; align-items: baseline;
    padding: var(--space-4); background: var(--color-bg-elev);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
}
.booking-summary__total-label { font-size: var(--fs-h3); font-weight: 600; }
.booking-summary__total-value {
    font-size: var(--fs-h2); font-weight: 700; color: var(--color-primary);
    font-variant-numeric: tabular-nums;
}
.booking-summary__note { color: var(--color-fg-muted); font-style: italic; font-size: .9rem; }
.booking-error {
    display: flex; flex-direction: column; gap: var(--space-3);
    padding: var(--space-5);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
    text-align: center;
}
.booking-error__msg { margin: 0; font-size: 1.05rem; }
.booking-banner {
    padding: var(--space-3) var(--space-4);
    border-radius: var(--radius-md);
    margin-bottom: var(--space-4);
}
.booking-banner--error {
    background: #fdecec;
    border-left: 4px solid #c1272d;
    color: #6b1418;
}
.booking-banner__msg { margin: 0; font-size: .95rem; }

/* ─── booking-stepper — 4 nummered stappen bovenaan ──────────────────── */
.booking-stepper {
    list-style: none;
    margin: 0 0 var(--space-5);
    padding: 0;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: var(--space-2);
}
.booking-stepper__step {
    display: flex; flex-direction: column; align-items: center; gap: var(--space-1);
    text-align: center;
    color: var(--color-fg-muted);
    position: relative;
}
.booking-stepper__step + .booking-stepper__step::before {
    content: '';
    position: absolute;
    top: 1rem; right: 50%; left: -50%;
    height: 2px;
    background: var(--color-border);
    z-index: 0;
}
.booking-stepper__step.is-done + .booking-stepper__step::before,
.booking-stepper__step.is-current::before { background: var(--color-primary); }
.booking-stepper__num {
    width: 2rem; height: 2rem;
    display: grid; place-items: center;
    border-radius: 50%;
    background: var(--color-bg-elev);
    border: 2px solid var(--color-border);
    font-weight: 700;
    position: relative; z-index: 1;
    transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.booking-stepper__label { font-size: .85rem; }
.booking-stepper__step.is-done .booking-stepper__num {
    background: var(--color-primary); border-color: var(--color-primary);
    color: var(--color-primary-fg);
}
.booking-stepper__step.is-done .booking-stepper__label { color: var(--color-fg); }
.booking-stepper__step.is-current .booking-stepper__num {
    background: var(--color-bg-elev); border-color: var(--color-primary);
    color: var(--color-primary);
    box-shadow: 0 0 0 4px rgba(0,0,0,.04);
}
.booking-stepper__step.is-current .booking-stepper__label {
    color: var(--color-fg); font-weight: 600;
}

/* ─── booking-extras (step 2: Extra's) ────────────────────────────────── */
.booking-extras { display: flex; flex-direction: column; gap: var(--space-4); }
.booking-extras__header { display: flex; flex-direction: column; gap: var(--space-1); }
.booking-extras__step {
    font-size: 0.85rem;
    color: var(--color-fg-muted);
    text-transform: uppercase;
    letter-spacing: 0.06em;
    font-weight: 600;
}
.booking-extras__title { margin: 0; font-size: var(--fs-h2); font-weight: 700; }
.booking-extras__intro { margin: 0; color: var(--color-fg-muted); }

/* 2-kolom-layout: recap links (image, kassabon), form rechts. Stapelt op smal. */
.booking-extras__layout {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--space-4);
}
@media (min-width: 64rem) {
    .booking-extras__layout {
        grid-template-columns: minmax(18rem, 26rem) 1fr;
        align-items: start;
    }
}
.booking-extras__recap {
    background: var(--color-bg-soft);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    padding: var(--space-4);
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}
@media (min-width: 64rem) {
    .booking-extras__recap {
        position: sticky;
        top: calc(var(--site-header-height, 64px) + var(--space-3));
    }
}
.booking-extras__recap-image {
    width: 100%; height: auto;
    border-radius: var(--radius-sm);
    overflow: hidden;
}
.booking-extras__recap-title { margin: 0; font-size: var(--fs-h3); }
.booking-extras__recap-period { margin: 0; color: var(--color-fg-muted); font-size: 0.95rem; }
.booking-extras__receipt {
    list-style: none; margin: 0;
    padding: var(--space-2) 0 0;
    border-top: 1px solid var(--color-border);
    display: flex; flex-direction: column; gap: 0.35rem;
}
.booking-extras__receipt-line {
    display: flex; justify-content: space-between; align-items: baseline;
    gap: var(--space-2); font-size: 0.92rem;
}
.booking-extras__receipt-line--extra .booking-extras__receipt-name::before {
    content: '+ '; color: var(--color-primary); font-weight: 600;
}
.booking-extras__receipt-name { flex: 1; }
.booking-extras__receipt-price { color: var(--color-fg-muted); font-variant-numeric: tabular-nums; }
.booking-extras__total {
    margin-top: var(--space-2);
    padding-top: var(--space-2);
    border-top: 1px solid var(--color-border);
    display: flex; justify-content: space-between; align-items: baseline;
    font-weight: 700;
}
.booking-extras__total-value {
    color: var(--color-primary);
    font-size: 1.1rem;
    font-variant-numeric: tabular-nums;
}

.booking-extras__form { display: flex; flex-direction: column; gap: var(--space-4); }
.booking-extras__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.booking-extras__item {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: var(--space-3);
    align-items: center;
    padding: var(--space-3);
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
}
.booking-extras__item-body { display: flex; flex-direction: column; gap: 0.2rem; }
.booking-extras__item-name { font-weight: 600; font-size: 1rem; }
.booking-extras__item-description { margin: 0; color: var(--color-fg-muted); font-size: 0.9rem; }
.booking-extras__item-price {
    margin-top: 0.2rem;
    color: var(--color-primary);
    font-variant-numeric: tabular-nums;
    font-size: 0.95rem;
}
.booking-extras__item-control { display: flex; align-items: center; gap: var(--space-2); }
.booking-extras__item-checkbox { display: inline-flex; align-items: center; gap: 0.5rem; cursor: pointer; }
.booking-extras__item-checkbox input[type="checkbox"] { accent-color: var(--color-primary); }
/* Herbruikbare +/- stepper rond een <input type="number"> — geactiveerd door
   /modules/qty.js (click = bump, hold = auto-repeat). */
.qty {
    display: inline-flex;
    align-items: stretch;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    overflow: hidden;
    background: var(--color-bg);
}
.qty__btn {
    width: 2.1rem;
    padding: 0;
    border: 0;
    background: transparent;
    color: var(--color-fg);
    font: inherit;
    font-size: 1.1rem;
    line-height: 1;
    cursor: pointer;
    transition: background var(--dur-fast, .15s);
    user-select: none;
}
.qty__btn:hover { background: var(--color-bg-soft); }
.qty__btn:active { background: var(--color-border); }
.qty__input {
    width: 2.4rem;
    padding: 0.35rem 0;
    border: 0;
    border-left: 1px solid var(--color-border);
    border-right: 1px solid var(--color-border);
    text-align: center;
    font: inherit;
    font-variant-numeric: tabular-nums;
    -moz-appearance: textfield;
    appearance: textfield;
}
.qty__input::-webkit-outer-spin-button,
.qty__input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}
.booking-extras__item-required {
    color: var(--color-fg-muted);
    font-size: 0.85rem;
    font-style: italic;
}
.booking-extras__empty {
    padding: var(--space-4);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
    text-align: center;
    color: var(--color-fg-muted);
}
.booking-extras__actions {
    display: flex;
    justify-content: space-between;
    gap: var(--space-3);
}
.booking-extras__back { color: var(--color-fg-muted); }

/* ─── booking-form (step 3: Gegevens) ─────────────────────────────────── */
.booking-details { display: flex; flex-direction: column; gap: var(--space-4); }
.booking-details__recap {
    padding: var(--space-3) var(--space-4);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
    font-size: .95rem;
}
.booking-details__recap-price { color: var(--color-primary); font-weight: 700; }
.booking-form {
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}
/* Side-by-side velden binnen één rij. Kolom-aandelen komen via inline
   `--cols`-CSS-var (door BookingDetailsFormRenderer::fieldRow gezet); fallback
   is één kolom. Onder 36rem collapsen naar één kolom voor mobile-stack. */
.booking-form__row {
    display: grid;
    gap: var(--space-3);
    grid-template-columns: var(--cols, 1fr);
}
@container (max-width: 36rem) {
    .booking-form__row { grid-template-columns: 1fr; }
}
.form-field { display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; }
.form-label {
    font-size: .82rem; font-weight: 600;
    color: var(--color-fg-muted);
    /* Niet wrappen — anders verspringt de form-field-hoogte en duwt 'ie de
       hele rij omlaag. Bij ultra-smalle cellen hangt 't label rustig een paar
       pixels over z'n cell-grens; bij goede widths is dat zeldzaam. */
    white-space: nowrap;
}
.booking-form .form-field__control { display: block; width: 100%; position: relative; }
/* Sub-inputs van composite-fields (TelField, AddressField, ZipcodeField composite
   met distance) vullen hun grid-cell — anders blijft de browser-default ~20ch over. */
.tel input, .tel select,
.composite-input { width: 100%; min-width: 0; box-sizing: border-box; }
/* Match `.form-input`-look 1:1 (zelfde padding/border/bg/transition), zodat
   custom-select display, native select (pre-select-upgrade) en input zonder
   `.form-input`-class identiek ogen aan FormRenderer-inputs. `.form-input` wint
   sowieso qua specificity voor de inputs zelf — deze regel is effectief alleen
   nog voor selects, maar we houden de drie selectors voor robuustheid. */
.booking-form input,
.booking-form select,
.booking-form .select-display,
.booking-form .dropdown-date-trigger {
    width: 100%;            /* vul de cell-breedte ipv browser-default ~20ch */
    box-sizing: border-box;
    padding: 0.7rem 0.9rem;
    border: 1.5px solid var(--form-input-border);
    border-radius: var(--form-radius, var(--radius-sm));
    font: inherit;
    background: var(--form-input-bg);
    color: var(--color-fg);
    transition: border-color 0.15s, box-shadow 0.15s;
}
.booking-form select:focus,
.booking-form .select-display:focus-visible,
.booking-form .select-display[aria-expanded="true"],
.booking-form .dropdown-date-trigger:focus-visible,
.booking-form .dropdown-date-trigger.is-active {
    outline: none;
    border-color: var(--form-input-border-active);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 18%, transparent);
}

/* Composite tel-veld (Framework\Form\Field\TelField). Country-code-select
   links (smal, vlag + dial), national-input rechts (vol breed). De hidden
   E.164-input zit erin maar is `display: none` via attribute-selector. */
.tel {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: .4rem;
    align-items: stretch;
}
.tel > input[type="hidden"] { display: none; }
.tel select[data-tel-country] {
    min-width: 0;
    /* Custom-select-display ervangt 'm visueel — native select hidden via
       select-class na upgrade. Vóór upgrade is 'ie een klein select. */
}
/* Smalle trigger voor tel-country (toont alleen vlag + "+31"). De generieke
   `.select-display` is `width: 100%`; hier `auto` zodat 'ie shrink't naar
   de "+31 vlag"-content en de national-input rechts zoveel mogelijk ruimte
   houdt in de `max-content 1fr`-grid. */
.tel .select-display { width: auto; min-width: 0; }
.tel input[data-tel-national] {
    min-width: 0; /* anders eet 'ie de grid op */
}

/* Validatie-feedback (zie /modules/form-validate.js) — JS zet `data-touched`
   op een control nadat 'ie blur of submit-mark heeft gehad. Pas dan tonen we
   succes/fout-styling, zodat lege required-velden niet meteen rood worden. */
.form-field { position: relative; }
/* Inputs/selects zitten binnen `.form-field__control`-wrapper (door
   `BookingDetailsFormRenderer`). Descendant-selector dekt zowel die
   structuur als de default-FormRenderer (geen wrapper) — backwards-safe. */
.form-field input,
.form-field select {
    padding-right: 2.2rem; /* ruimte voor het vinkje */
}
/* Groene rand bij `:valid` na touched. */
.booking-form input[data-touched]:valid,
.booking-form select[data-touched]:valid {
    border-color: var(--color-primary);
}

/* Vinkje als `__control`-wrapper-`::after`. `is-valid` wordt door `form-validate.js`
   op de `.form-field`-wrapper gezet zodra een veld valid is ÉN er een waarde in
   staat (lege optional-fields krijgen geen vinkje). Position relative op de
   __control zorgt dat 't vinkje binnen de cell-breedte valt — in multi-col
   rows zou positioning op de form-field anders ver-rechts vallen. */
.form-field.is-valid .form-field__control::after {
    content: '';
    position: absolute;
    right: .75rem;
    top: 50%;
    transform: translateY(-50%);
    width: 1rem;
    height: 1rem;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230a6e3a' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><polyline points='5 13 10 18 19 7'/></svg>");
    background-repeat: no-repeat;
    background-size: contain;
    pointer-events: none;
}
/* Selects hebben een native chevron rechts — vinkje links daarvan. */
.form-field[data-control="select"].is-valid .form-field__control::after { right: 1.5rem; }
.form-field select { padding-right: 3rem; }

/* Dropdown-date heeft eigen grid van smalle selects — geen vinkje op de wrapper
   en geen ruime padding-right voor de native chevron. */
.form-field:has([data-dropdown-date]).is-valid .form-field__control::after { display: none; }
.form-field:has([data-dropdown-date]) select { padding-right: 0.35rem; }

/* Chrome/Safari/Edge autofill schildert een gele/blauwe background ondanks
   `background-color`. De WebKit-only oplossing: een dikke `inset` box-shadow
   in onze achtergrondkleur die de fill-yellow overschilderd, plus de tekst-
   kleur expliciet zetten zodat de "autofilled"-styling onze fg-kleur volgt.
   `transition` op een belachelijke duur voorkomt dat de fill-state alsnog
   terugkomt tussen pseudo-class-transitions door.

   Daarnaast: een 1ms keyframe-animation op de autofill-pseudo zodat
   form-validate.js via `animationstart` kan detecteren dat een veld is
   gevuld (autofill triggert geen blur/input events). */
.booking-form input:-webkit-autofill,
.booking-form input:-webkit-autofill:hover,
.booking-form input:-webkit-autofill:focus,
.booking-form input:-webkit-autofill:active {
    -webkit-box-shadow: 0 0 0 1000px var(--color-bg-elev) inset !important;
    -webkit-text-fill-color: var(--color-fg) !important;
    caret-color: var(--color-fg);
    transition: background-color 5000s ease-in-out 0s, color 5000s ease-in-out 0s;
    animation-name: mmAutofillStart;
    animation-duration: 1ms;
}
@keyframes mmAutofillStart {
    from { opacity: 0.99; }
    to   { opacity: 1; }
}
/* Rode invalid-styling: niet tijdens Chrome autofill-preview. In die state
   is `:-webkit-autofill` actief en de waarde is in de UI zichtbaar, maar
   `input.value` returnt nog `''` (anti-fingerprinting). De `:invalid`-pseudo
   triggert dan ten onrechte — visueel zou de field "fout" lijken terwijl
   'ie net mooi gevuld is. `:not(:-webkit-autofill)` exclude't die situatie. */
.booking-form input[data-touched]:invalid:not(:-webkit-autofill),
.booking-form select[data-touched]:invalid {
    border-color: #c0392b;
    background-color: rgba(192, 57, 43, .04);
}
/* Error-slot heeft altijd een vaste hoogte gereserveerd — voorkomt layout-
   shift wanneer een foutmelding verschijnt/verdwijnt. JS schrijft alleen de
   tekst; bij valid blijft het span leeg en houdt z'n ruimte vast. Verder
   trekken meerdere foutregels (langere `validationMessage`) de hoogte
   netjes uit zonder kettingreactie op andere rijen. */
.form-field__error {
    display: block;
    font-size: .78rem;
    line-height: 1.1;
    color: #c0392b;
}
/* Lege error-span (geen text) neemt geen verticale ruimte in. Form-validate.js
   schrijft alleen tekst bij invalid; daarvoor is de DOM-node er al, dus
   tonen-bij-content geeft een mini layout-shift (1 regel) wanneer een error
   verschijnt — acceptabel vs. 1rem permanent gereserveerd × 11 velden. */
.form-field__error:empty { display: none; }
/* Label-kleur bij invalid — `is-invalid` op de wrapper door form-validate.js. */
.form-field.is-invalid .form-label {
    color: #c0392b;
}
/* Terms-checkbox spant beide grid-kolommen in 2-col layout (zie @container). */
.form-field--checkbox {
    display: flex; align-items: flex-start; gap: var(--space-2);
    font-size: .95rem;
}
.form-field--checkbox input[type="checkbox"] { margin-top: .25rem; }
.form-actions {
    display: flex; justify-content: space-between; gap: var(--space-3);
    margin-top: var(--space-2);
}
.booking-summary__actions {
    display: flex; justify-content: flex-end;
    margin-top: var(--space-2);
}
.booking-summary__continue { padding: .9em 1.4em; font-weight: 700; }

/* ─── detail-page availability + entities overview ──────────────────── */
.accommodation-detail__availability {
    margin-top: var(--space-5);
    padding: var(--space-4);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
}
.accommodation-detail__availability-title {
    margin: 0 0 var(--space-3);
    font-size: var(--fs-h3); font-weight: 600;
}
.acc-availability { background: none; padding: 0; box-shadow: none; }

/* ─── price-matrix (2D: nachten-rows × datums-cols × prijs-cells) ──── */
/* Client-side gerendered door /js/search/matrix.js — fetcht /api/sab/matrix
   en lazy-loadt extra weken bij horizontaal scrollen via IntersectionObserver.
   Sticky thead-row (datum-headers) + sticky first-column (nachten-labels)
   houden context vast tijdens scroll in beide assen. */
.acc-matrix { margin-top: var(--space-4); display: flex; flex-direction: column; gap: var(--space-3); }
.acc-matrix__title { margin: 0; font-size: var(--fs-h3); font-weight: 600; }
.acc-matrix__placeholder {
    padding: var(--space-4);
    color: var(--color-fg-muted);
    font-style: italic;
    text-align: center;
}
.acc-matrix__status {
    font-size: .85rem;
    color: var(--color-fg-muted);
    min-height: 1.2em;
}
/* Div-grid-layout — geen <table>, zodat we de echte `__head` node
   `position: fixed` kunnen maken bij scroll-past zonder dat
   table-flow z'n column-widths breekt. `__head-placeholder` houdt
   de hoogte vast wanneer head uit flow gaat. */
.acc-matrix__shell { position: relative; }
.acc-matrix__scroll {
    overflow-x: auto;
    overflow-y: hidden;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    background: var(--color-bg-elev);
    /* `contain` voorkomt dat horizontaal scrollen naar het einde de
       page-scroll triggert (bounce/over-scroll-jump op trackpad). */
    overscroll-behavior-x: contain;
}
.acc-matrix__grid {
    width: max-content;
    min-width: 100%;
    font-variant-numeric: tabular-nums;
}
.acc-matrix__head-placeholder {
    height: 0;
    /* Geen transition op `height`! Bij toggle van `is-head-fixed` moet de
       placeholder INSTANT de hoogte van head overnemen — anders loopt de
       body-shift achter op de fixed-positionering, en zie je content over
       een paar frames op-en-neer kruipen. */
}
.acc-matrix__head       { display: flex; background: var(--color-bg-soft); }
.acc-matrix__head-dates { display: flex; }
.acc-matrix__row        { display: flex; }
.acc-matrix__cell {
    flex: 0 0 100px;
    /* `min-width: 0` overruled de flex-default (`auto` = min-content). Zonder
       dit groeien cells met langere content (bv. "€ 1.239") voorbij de
       flex-basis en wordt de grid-uitlijning kapot. */
    min-width: 0;
    max-width: 100px;
    padding: var(--space-2) var(--space-3);
    border-right: 1px solid var(--color-border);
    border-bottom: 1px solid var(--color-border);
    background: var(--color-bg-elev);
    text-align: center;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    box-sizing: border-box;
}
.acc-matrix__head .acc-matrix__cell {
    background: var(--color-bg-soft);
    font-weight: 600;
}
/* Sticky-left voor corner + nights tijdens horizontale scroll in
   normal-state. In fixed-state staat corner naast (niet in) head-dates,
   dus de translateX op dates raakt 'm niet — geen verschuiving nodig. */
.acc-matrix__cell--corner,
.acc-matrix__cell--nights {
    flex: 0 0 140px;
    max-width: 140px;
    position: sticky;
    left: 0;
    z-index: 2;
    background: var(--color-bg-soft);
}
.acc-matrix__cell--corner {
    color: var(--color-fg-muted);
    font-size: .75rem;
    text-transform: uppercase;
    letter-spacing: .06em;
    z-index: 3;
}
.acc-matrix__cell--nights {
    text-align: left;
    box-shadow: 1px 0 0 var(--color-border);
}
.acc-matrix__cell--date { font-size: .85rem; }
.acc-matrix__cell--price {
    overflow: visible;
    text-overflow: clip;
}
.acc-matrix__cell--price.acc-matrix__cell--empty {
    color: var(--color-fg-muted);
    opacity: .5;
}
.acc-matrix__cell--price:has(.acc-matrix__price-link):hover {
    background: color-mix(in srgb, var(--bl-sand, #e1cc95) 18%, var(--color-bg-elev));
}
.acc-matrix__price-link {
    appearance: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    max-width: 100%;
    min-width: 4.25rem;
    padding: .32rem .55rem;
    box-sizing: border-box;
    border: 1px solid color-mix(in srgb, var(--color-primary) 18%, transparent);
    border-radius: 999px;
    background: color-mix(in srgb, var(--bl-sand, #e1cc95) 46%, var(--color-bg-elev));
    color: var(--bl-brown, var(--color-primary));
    font: inherit;
    font-size: .86rem;
    font-weight: 700;
    line-height: 1.1;
    text-decoration: none;
    white-space: nowrap;
    cursor: pointer;
}
.acc-matrix__price-link:hover {
    border-color: color-mix(in srgb, var(--color-primary) 34%, transparent);
    background: color-mix(in srgb, var(--color-primary) 10%, var(--color-bg-elev));
    color: var(--color-primary);
    text-decoration: none;
}
.acc-matrix__price-link:focus-visible {
    outline: 2px solid var(--color-primary);
    outline-offset: 2px;
}

/* Fixed-state: de écht-bestaande head-node krijgt position: fixed
   (geen clone). JS levert top/left/width via CSS-vars; placeholder
   pakt de hoogte zodat de body niet verspringt. head-dates schuift
   horizontaal mee via translateX (`--matrix-head-shift = -scrollLeft`). */
.acc-matrix__shell.is-head-fixed .acc-matrix__head {
    position: fixed;
    top: var(--matrix-head-top, 0);
    left: var(--matrix-head-left, 0);
    width: var(--matrix-head-width, 100%);
    overflow: hidden;
    z-index: 50;
    box-shadow: 0 2px 4px rgba(0,0,0,.08);
    border-bottom: 1px solid var(--color-border);
}
.acc-matrix__shell.is-head-fixed .acc-matrix__head-dates {
    transform: translateX(var(--matrix-head-shift, 0));
    will-change: transform;
}
.acc-matrix__shell.is-head-fixed .acc-matrix__head-placeholder {
    height: var(--matrix-head-h, 0);
}

/* ─── /css/layer-search.css ─── */
/* layer-search.css — layer_search_and_book (sab) + layer_search_results. */

/* ─── layer_search_and_book ────────────────────────────────────────────── */
/* CMS-first: geen hardcoded witte kaart-default meer op elke sab-laag — dat gaf
   full-bleed wit óók op instances met een eigen CMS-band (bv. de zoek&boek-band
   171, olive op de .layer__inner). Search/overview-instances stylen zich nu via
   hun CMS design-slots (design_layer/design_layer_ic). Alleen de matrix-modus
   houdt de witte kaart als structurele type-default (data-type, geen id). */
.layer__search-and-book[data-type="matrix"] {
    padding: var(--space-6) var(--space-4);
    background: var(--color-surface, #fff);
}

/* ─── Matrix-modus (type=matrix) ──────────────────────────────────────── */
.layer__search-and-book[data-type="matrix"] .search-matrix__tabs {
    display: flex;
    gap: .25rem;
    border-bottom: 1px solid var(--color-border, #e2e8f0);
    /* Geen `margin-bottom` — die zou verloren gaan wanneer tabs sticky-
       fixed worden (placeholder houdt alleen de box-grootte vast, niet
       de externe margin). Spacing via padding-bottom (binnen de box) zit
       in `rect.height` en reist dus mee naar de stuck-state. */
    padding-bottom: 1rem;
    background: var(--color-surface, #fff);
}
.search-matrix__tab {
    padding: .6rem 1rem;
    text-decoration: none;
    color: var(--color-text);
    border-bottom: 3px solid transparent;
    font-weight: 500;
    transition: border-color 120ms, color 120ms;
}
.search-matrix__tab:hover { color: var(--color-primary); }
.search-matrix__tab.is-active {
    border-bottom-color: var(--color-primary);
    color: var(--color-primary);
}
.search-matrix__controls {
    display: flex;
    align-items: center;
    gap: 1rem;
    /* Spacing via padding (binnen de box) ipv margin — zelfde reden als tabs:
       margin verdwijnt bij sticky-fixed, padding niet. */
    padding-block: .5rem 1rem;
    background: var(--color-surface, #fff);
    flex-wrap: wrap;
}
.search-matrix__nights-label {
    display: inline-flex; align-items: center; gap: .5rem;
    font-size: .9rem;
}
.search-matrix__nights-label select {
    padding: .35rem .5rem;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    background: var(--color-bg-elev);
}
.search-matrix__nav {
    display: inline-flex; align-items: center; justify-content: center;
    width: 2rem; height: 2rem;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    text-decoration: none;
    color: var(--color-text);
}
.search-matrix__nav:hover { background: color-mix(in srgb, var(--color-primary) 10%, transparent); }
.search-matrix__nav--next { margin-left: auto; }

/* Geen CSS `position: sticky` op de head-row — site-header verbergt zich
   bij scroll waardoor een statische `top: var(--site-header-offset)`-offset
   niet meer klopt. Framework-module `sticky.js` doet 't JS-side met
   live header-tracking; styling-state via `[data-sticky-stuck="1"]`. */
.search-matrix__grid {
    display: grid;
    gap: 2px;
    overflow-x: auto;
}
.search-matrix__row {
    display: grid;
    grid-template-columns: minmax(13rem, 1fr) repeat(7, minmax(4.5rem, 1fr));
    gap: 2px;
    min-width: 44rem;
}
.search-matrix__row--head {
    background: var(--color-surface, #fff);
    padding-block: .35rem;
}
.search-matrix__row--head[data-sticky-stuck="1"] {
    box-shadow: 0 1px 0 var(--color-border, #e2e8f0);
}
.search-matrix__cell {
    padding: .5rem .35rem;
    background: var(--color-bg-elev, #f8fafc);
    border-radius: var(--radius-sm, 4px);
    font-size: .85rem;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
    min-height: 3rem;
}
.search-matrix__cell--corner { background: transparent; min-height: 0; }
.search-matrix__cell--date {
    background: transparent;
    flex-direction: column;
    gap: .1rem;
    color: var(--color-text-muted, #64748b);
    font-size: .75rem;
}
.search-matrix__date-day { text-transform: uppercase; }
.search-matrix__date-num { font-size: .95rem; font-weight: 600; color: var(--color-text); }
.search-matrix__cell--name {
    justify-content: flex-start;
    gap: .5rem;
    padding: .35rem;
    text-align: left;
}
.search-matrix__thumb {
    flex-shrink: 0;
    border-radius: var(--radius-sm);
    overflow: hidden;
    width: 3rem; height: 2.25rem;
    display: block;
}
.search-matrix__thumb img,
.search-matrix__thumb .media {
    width: 100%; height: 100%;
    object-fit: cover;
    display: block;
}
.search-matrix__name-text { display: flex; flex-direction: column; line-height: 1.2; }
.search-matrix__name-text strong { font-size: .9rem; }
.search-matrix__name-text small { color: var(--color-text-muted); font-size: .75rem; }
.search-matrix__cell--price {
    text-decoration: none;
    font-weight: 500;
    color: var(--color-primary);
    background: color-mix(in srgb, var(--color-primary) 8%, var(--color-bg-elev));
    transition: background-color 80ms;
    font-variant-numeric: tabular-nums;
}
.search-matrix__cell--price:hover {
    background: color-mix(in srgb, var(--color-primary) 18%, var(--color-bg-elev));
}
.search-matrix__cell--empty {
    color: var(--color-text-muted, #94a3b8);
    background: color-mix(in srgb, var(--color-text-muted) 8%, transparent);
}
.search-matrix__error,
.search-matrix__empty {
    padding: 1rem;
    color: var(--color-text-muted);
    text-align: center;
}

/* Loading-state tijdens fetch via search-matrix.js — subtle fade.
   loader (search-matrix.js via loader.js) centreert in de panel. */
.search-matrix__panel {
    position: relative;
    transition: opacity 120ms;
    --loader-color: var(--color-primary);
    --loader-track: var(--color-border);
    --loader-size: 1.5rem;
}
.search-matrix__panel[data-loading] { opacity: .6; pointer-events: none; }
.sab__heading { text-align: center; margin-bottom: var(--space-4); }
.sab__title { font-size: 1.5rem; margin: 0; }
.sab__subtitle { margin: var(--space-1) 0 0; color: var(--color-fg-muted); }
.sab__form {
    display: grid;
    gap: var(--space-3);
    grid-template-columns: 1fr;
    max-width: 60rem;
    margin: 0 auto;
    background: var(--color-bg-soft, #fff);
    padding: var(--space-4);
    border-radius: var(--radius-md);
    box-shadow: 0 1px 3px rgba(0,0,0,.08);
}
@media (min-width: 48rem) {
    .sab__form {
        grid-template-columns: 1fr 1fr 1fr auto;
        align-items: end;
    }
}
.sab__field { display: flex; flex-direction: column; gap: 0.25em; }
.sab__label { font-size: 0.85rem; font-weight: 600; color: var(--color-fg-muted); }
.sab__input {
    padding: 0.6em 0.8em;
    border: 1px solid var(--color-border, rgba(0,0,0,.15));
    border-radius: var(--radius-sm);
    font: inherit;
    background: #fff;
    color: var(--color-fg);
    min-height: 2.5rem;
}
.sab__input:focus {
    outline: 2px solid var(--color-primary, #c1272d);
    outline-offset: 1px;
}
.sab__submit {
    padding: 0 1.4em;
    background: var(--color-primary);
    color: var(--color-primary-fg);
    border: 0;
    border-radius: var(--radius-md);
    font-weight: 700;
    cursor: pointer;
    /* Matcht .sab__form .date-trigger / .sab__input--button — zelfde
       hoogte zodat de hele rij netjes uitgelijnd blijft in de grid. */
    min-height: 58px;
}
.sab__submit:hover { filter: brightness(1.1); }
.sab__submit-wrap {
    display: flex;
    flex-direction: row;
    align-items: center;
    gap: var(--space-3);
}
/* Zoeken blijft dominant; wissen zit links en neemt alleen zijn eigen breedte. */
.sab__submit-wrap .sab__submit { flex: 1 1 auto; }
.sab__reset {
    display: inline-flex;
    align-items: center;
    gap: 0.35em;
    flex: 0 0 auto;
    font-size: 0.85rem;
    color: var(--color-fg-muted);
    text-decoration: none;
    cursor: pointer;
    white-space: nowrap;
}
.sab__reset[hidden] { display: none; }
.sab__reset-x {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.4em;
    height: 1.4em;
    border-radius: 50%;
    border: 1px solid currentColor;
    font-size: 1.05em;
    line-height: 1;
}
.sab__reset-label { text-decoration: underline; }
.sab__reset:hover { color: var(--color-primary); }

/* Mobiel/tablet: form is 1 kolom, submit-wrap vult de breedte.
   Wissen links, Zoeken groeit mee zodat de knop prominent blijft. */
@media (max-width: 47.999rem) {
    .sab__submit-wrap { width: 100%; }
}

/* ─── sab — gedeelde trigger-styling (date + guests) ──────────────────────
   Light stijl met kleine uppercase `<small>`-label bovenin en de waarde
   eronder (`<span>`). Beide trigger-types (date + guests) hetzelfde.
   `.sab__form .date-trigger` heeft 2-class-specificity zodat 't wint
   van het framework-default in `/modules/date-picker.css` (1 class). */
.sab__form .date-trigger,
.sab__input--button {
    display: grid;
    gap: .15rem;
    min-height: 58px;
    padding: .55rem .85rem;
    background: var(--color-bg-elev);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    color: var(--color-fg);
    font: inherit;
    text-align: left;
    cursor: pointer;
}
.sab__form .date-trigger:focus-visible,
.sab__form .date-trigger.is-active,
.sab__input--button:focus-visible,
.sab__input--button.is-active {
    outline: 2px solid var(--color-primary);
    outline-offset: 1px;
    border-color: var(--color-primary);
    box-shadow: none;
}
.sab__form .date-trigger small,
.sab__input--button small {
    color: var(--color-fg-muted);
    font-size: .64rem;
    text-transform: uppercase;
    letter-spacing: .08em;
}
.sab__form .date-trigger span,
.sab__input--button span {
    display: block;
    font: 700 .92rem/1.2 system-ui;
    color: var(--color-fg);
}
.sab__form .date-trigger[data-empty="1"] span,
[data-guests][data-empty="1"] [data-guests-summary] {
    color: var(--color-fg-muted);
    font-weight: 500;
}

/* ─── sab — datepicker popup ───────────────────────────────────────────── */
.cal-popup {
    position: absolute;
    z-index: 100;
    margin-top: 0.25rem;
    background: #fff;
    color: var(--color-fg);
    border: 1px solid var(--color-border, rgba(0,0,0,.15));
    border-radius: var(--radius-md);
    padding: var(--space-3);
    box-shadow: 0 8px 24px rgba(0,0,0,.15);
    min-width: 280px;
}
.cal-popup__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: var(--space-2);
    font-weight: 600;
}
.cal-popup__nav {
    width: 2rem; height: 2rem;
    background: transparent; border: 0;
    font-size: 1.2rem; cursor: pointer; color: inherit;
    border-radius: var(--radius-sm);
}
.cal-popup__nav:hover { background: rgba(0,0,0,.05); }
.cal-popup__grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 2px;
}
.cal-popup__wd {
    text-align: center;
    font-size: 0.75rem;
    color: var(--color-fg-muted);
    text-transform: lowercase;
    padding: 0.25em 0;
}
.cal-popup__day,
.cal-popup__pad {
    aspect-ratio: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--radius-sm);
    font-size: 0.9rem;
    cursor: pointer;
    min-height: 36px;
}
.cal-popup__day:hover { background: var(--color-bg-soft, #f4f4f4); }
.cal-popup__day--unavailable {
    color: rgba(0,0,0,.25); cursor: not-allowed;
}
.cal-popup__day--unavailable:hover { background: transparent; }
.cal-popup__day:focus { outline: 2px solid var(--color-primary, #c1272d); outline-offset: 1px; }

.sab__field { position: relative; }

/* ── layer_search_results ─────────────────────────────────────────── */
.layer__search-results {
    padding: var(--space-6) var(--gutter);
    max-width: 1440px;
    margin: 0 auto;
}
.search-results__title {
    font-size: var(--fs-h1);
    margin: 0 0 var(--space-2);
}
.search-results__meta {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-3);
    color: var(--color-fg-muted);
    font-size: 0.95rem;
    margin-bottom: 0;
}
.search-results__meta-item--muted { font-style: italic; }

.search-results__summary {
    display: flex;
    align-items: flex-end;
    justify-content: space-between;
    gap: var(--space-4);
    margin-bottom: var(--space-4);
    padding-bottom: var(--space-4);
    border-bottom: 1px solid var(--color-border);
}
.layer__search-results .search-results__summary {
    padding-top: 0;
}

/* Filters-bar boven de grid: capacity-pill + category-select + apply/reset */
.search-results__filters {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-3);
    margin-bottom: var(--space-4);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
}
.search-results__filter-pill {
    padding: 0.3rem 0.7rem;
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    border-radius: 999px;
    font-size: 0.85rem;
    color: var(--color-fg-muted);
}
.search-results__filter-label {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    font-size: 0.9rem;
    color: var(--color-fg-muted);
}
.search-results__filter-select {
    padding: 0.35rem 0.6rem;
    background: var(--color-bg);
    color: var(--color-fg);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    font: inherit;
}
.search-results__filter-submit {
    margin-left: auto;
}
.search-results__filter-reset {
    color: var(--color-fg-muted);
    font-size: 0.85rem;
    text-decoration: underline;
}

.search-results__grid {
    list-style: none;
    padding: 0;
    margin: 0 0 var(--space-4);
    display: grid;
    grid-template-columns: 1fr;
    grid-auto-flow: dense;
    gap: var(--space-4);
}
@media (min-width: 48rem) {
    .search-results__grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}
@media (min-width: 64rem) {
    .search-results__grid {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}
.search-results__card {
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    overflow: hidden;
    display: flex;
    flex-direction: column;
    transition: transform 0.15s, box-shadow 0.15s;
}
.search-results__card[hidden] { display: none; }
.search-results__card:hover {
    transform: translateY(-2px);
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.07);
}
.search-results__card-image {
    aspect-ratio: 4 / 3;
    background: var(--color-bg-soft);
    display: grid;
    place-items: center;
    font-size: 3rem;
    overflow: hidden;
}
.search-results__card-image > .media,
.search-results__card-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform var(--dur-slow) var(--ease-out);
}
.search-results__card:hover .search-results__card-image img {
    transform: scale(1.04);
}
.search-results__card-subtitle {
    margin: 0;
    color: var(--color-fg-muted);
    font-size: 0.9rem;
}
.search-results__card-body {
    padding: var(--space-3);
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}
.search-results__card-title {
    font-size: 1.05rem;
    margin: 0;
}
.search-results__card-meta {
    margin: 0;
    color: var(--color-fg-muted);
    font-size: 0.9rem;
}
.search-results__card-price {
    margin: auto 0 0;
    padding-top: var(--space-2);
    color: var(--color-fg);
    font-size: 1rem;
    font-weight: 600;
}
/* Hele card is een klikbare link */
.search-results__card-link {
    display: flex;
    flex-direction: column;
    text-decoration: none;
    color: inherit;
    height: 100%;
}

/* Empty-state als geen types door de filters komen */
.search-results__empty {
    padding: var(--space-5);
    text-align: center;
    color: var(--color-fg-muted);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
    margin-bottom: var(--space-4);
}

/* Pager: prev / state / next */
.search-results__pager {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: var(--space-4);
    margin-top: var(--space-3);
    flex-wrap: wrap;
}
.search-results__pager-link {
    color: var(--color-fg);
    text-decoration: none;
    padding: 0.4rem 0.9rem;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    transition: background var(--dur-fast) var(--ease-out),
                border-color var(--dur-fast) var(--ease-out);
}
.search-results__pager-link:hover {
    background: var(--color-bg-soft);
    border-color: var(--color-border-strong);
}
.search-results__pager-state {
    color: var(--color-fg-muted);
    font-size: 0.9rem;
}

.search-results__footer {
    text-align: center;
    color: var(--color-fg-muted);
    font-size: 0.9rem;
}

/* Sort-bar boven de grid */
.search-results__sort {
    margin-bottom: var(--space-3);
}

/* Desktop: toolbar rechts, count links via order */
@media (min-width: 64rem) {
    .search-results__sort {
        display: flex;
        align-items: center;
        gap: var(--space-3);
    }
    .search-results__toolbar {
        display: flex;
        align-items: center;
        gap: var(--space-2);
        order: 2;
        margin-left: auto;
    }
    .search-results__sort-count {
        flex: 1;
        order: 1;
    }
}

.search-results__sort-count {
    font-size: 1rem;
    font-weight: 600;
    color: var(--color-fg);
    display: block;
}
.search-results__sort-label {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    font-size: 0.9rem;
    color: var(--color-fg-muted);
}
.search-results__sort-select {
    padding: 0.35rem 0.6rem;
    background: var(--color-bg);
    color: var(--color-fg);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    font: inherit;
}

/* Filter-toggle knop — alleen op mobiel zichtbaar */
.search-results__filter-toggle {
    display: none;
}
@media (max-width: 64rem) {
    .search-results__filter-toggle {
        display: inline-flex;
        align-items: center;
        gap: var(--space-2);
        padding: 0.45rem 0.9rem;
        background: var(--color-bg);
        color: var(--color-fg);
        border: 1px solid var(--color-border);
        border-radius: var(--radius-sm);
        font: inherit;
        font-size: 0.9rem;
        cursor: pointer;
        white-space: nowrap;
    }
    .search-results__filter-toggle:hover {
        background: var(--color-bg-soft);
        border-color: var(--color-border-strong);
    }

    /* Toolbar op mobiel altijd zichtbaar; sticky maakt hem fixed bij scrollen */
    .search-results__toolbar {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: var(--space-2);
        background: var(--color-bg);
        padding: var(--space-2) 0;
        margin-bottom: var(--space-2);
        transition: box-shadow .2s;
    }
    /* Wanneer sticky hem fixed zet: volle breedte met padding + schaduw */
    .search-results__toolbar[data-sticky-stuck="1"] {
        padding-left: var(--sticky-inset, var(--space-4));
        padding-right: var(--sticky-inset, var(--space-4));
        border-bottom: 1px solid var(--color-border);
        box-shadow: 0 2px 10px rgba(0,0,0,.09);
    }

    /* Count onder de toolbar */
    .search-results__sort-count {
        padding-bottom: var(--space-2);
    }
}

/* Sidebar-header (titel + sluit-knop) — alleen zichtbaar als overlay */
.search-results__sidebar-header {
    display: none;
}

/* Mobile sidebar-header + sluit-knop */
@media (max-width: 64rem) {
    .search-results__sidebar-header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding-bottom: var(--space-3);
        border-bottom: 1px solid var(--color-border);
        margin-bottom: 0;
    }
    .search-results__sidebar-header strong {
        font-size: 1rem;
        font-weight: 600;
    }
    .search-results__sidebar-close {
        background: none;
        border: none;
        font-size: 1.4rem;
        line-height: 1;
        cursor: pointer;
        color: var(--color-fg-muted);
        padding: 0.2rem 0.4rem;
    }
}

/* Collapsed-state: cards na de 6e zichtbare match zijn verborgen tot de
   show-more knop klikt. JS zet/verwijdert `.is-collapsed-hidden` per card. */
.search-results__card.is-collapsed-hidden { display: none; }
.search-results__show-more[hidden]        { display: none; }
.search-results__show-more {
    display: block;
    margin: var(--space-3) auto var(--space-4);
    padding: 0.55rem 1.1rem;
    background: var(--color-bg);
    color: var(--color-fg);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    font: inherit;
    cursor: pointer;
    transition: background var(--dur-fast) var(--ease-out),
                border-color var(--dur-fast) var(--ease-out);
}
.search-results__show-more:hover {
    background: var(--color-bg-soft);
    border-color: var(--color-border-strong);
}
.search-results__empty {
    text-align: center;
    padding: var(--space-5);
    color: var(--color-fg-muted);
}

/* Sidebar-layout — sidebar links, listing rechts. Op smal scherm stapelt
   het (sidebar boven listing). */
.search-results__layout {
    display: grid;
    gap: var(--space-4);
    grid-template-columns: 1fr;
}
@media (min-width: 64rem) {
    .search-results__layout {
        grid-template-columns: minmax(18rem, 20rem) minmax(0, 1fr);
        align-items: start;
        gap: var(--space-6);
    }
}
.search-results__main {
    min-width: 0; /* prevent grid overflow on long titles */
    display: flex;
    flex-direction: column;
    gap: var(--space-4);
}

/* Sidebar zelf: een form-element met groups (legend) en per-property lijst */
.search-results__sidebar {
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
    padding: var(--space-4);
    display: flex;
    flex-direction: column;
    gap: var(--space-4);
    border: 1px solid var(--color-border);
    box-shadow: 0 1px 2px rgba(0,0,0,.03);
}
@media (min-width: 64rem) {
    .search-results__sidebar {
        position: sticky;
        top: calc(var(--site-header-height, 64px) + var(--space-3));
    }
}
.search-filters__group {
    border: 0;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}
.search-filters__group-title {
    font-size: 1rem;
    font-weight: 600;
    color: var(--color-fg);
    margin-bottom: var(--space-2);
    padding: 0;
}
.search-filters__property {
    display: flex;
    flex-direction: column;
    gap: var(--space-1);
}
.search-filters__property-title {
    font-size: 0.78rem;
    color: var(--color-fg-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    margin-bottom: 0.2rem;
}
.search-filters__options {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
}
.search-filters__option-label {
    display: flex;
    align-items: center;
    gap: 0.55rem;
    cursor: pointer;
    padding: 0.2rem 0;
    font-size: 0.92rem;
    color: var(--color-fg);
    user-select: none;
}
.search-filters__option-label:hover .search-filters__option-text {
    color: var(--color-primary);
}
.search-filters__option-label input[type="checkbox"],
.search-filters__option-label input[type="radio"] {
    accent-color: var(--color-primary);
}
.search-filters__option-count {
    margin-left: auto;
    color: var(--color-fg-muted);
    font-size: 0.82rem;
    font-variant-numeric: tabular-nums;
}
/* Datum + gasten bovenaan de sidebar — checkin/checkout onder elkaar,
   gasten breed. Zelfde aanpak als .accommodation-detail__aside. */
.search-filters__date-guests {
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    padding-bottom: var(--space-3);
    border-bottom: 1px solid var(--color-border);
}
.search-filters__date-guests .sab__field,
.search-filters__date-guests .sab__field-inner,
.search-filters__date-guests .sab__input,
.search-filters__date-guests .sab__input--button {
    width: 100%;
    min-width: 0;
}
.search-filters__date-guests .date-trigger-row {
    min-width: 0;
    width: 100%;
    grid-template-columns: 1fr;
}
.search-filters__date-guests .date-trigger {
    min-width: 0;
}

.search-filters__actions {
    margin-top: var(--space-2);
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-3);
}
.search-filters__reset {
    color: var(--color-fg-muted);
    text-decoration: underline;
    font-size: 0.9rem;
}
.search-filters__reset:hover { color: var(--color-primary); }

/* Wanneer JS de live-filter heeft overgenomen vervalt de submit-knop —
   change-events activeren dan automatisch de fetch. */
.search-results__sidebar[data-live="1"] .search-filters__actions button[type="submit"] {
    display: none;
}

/* Sidebar: position:relative al gezet, plus loader context vars (lichte achtergrond). */
.search-results__sidebar {
    position: relative;
    --loader-color: var(--color-primary);
    --loader-track: var(--color-border);
    --loader-size: 2rem;
}
/* Mobile sidebar als bottom-sheet overlay — staat ná `position:relative` zodat
   de cascade klopt (beide hebben gelijke specificiteit). */
@media (max-width: 64rem) {
    .search-results__sidebar {
        position: fixed;
        inset: auto 0 0 0;
        z-index: 200;
        max-height: 85dvh;
        overflow-y: auto;
        border-radius: var(--radius-md) var(--radius-md) 0 0;
        box-shadow: 0 -4px 24px rgba(0,0,0,.18);
        transform: translateY(100%);
        transition: transform 0.28s var(--ease-out, ease-out);
    }
    .search-results__sidebar.is-open {
        transform: translateY(0);
    }
    body.search-sidebar-open::before {
        content: '';
        position: fixed;
        inset: 0;
        z-index: 199;
        background: rgba(0,0,0,.4);
    }
}

/* Main-grid vervaagt terwijl de sidebar een filter-fetch doet. */
.search-results__sidebar[data-loading] ~ .search-results__main {
    opacity: .55;
    pointer-events: none;
    transition: opacity .15s;
}

/* Ad-card: volledige breedte van de grid. Positie via inline `style.order`
   gezet door search-results-grid.js (na N-de zichtbare match). Default: end
   van de grid wanneer JS niet draait. */
.search-results__ad-card {
    grid-column: 1 / -1;
    order: 2;
    background: var(--color-bg-soft);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    overflow: hidden;
    list-style: none;
    transition: transform .15s, box-shadow .15s;
}
.search-results__ad-card:hover { transform: translateY(-1px); box-shadow: 0 4px 14px rgba(0,0,0,.06); }
.search-results__ad-link {
    display: grid;
    grid-template-columns: 1fr;
    align-items: stretch;
    color: inherit;
    text-decoration: none;
    min-height: 8rem;
}
@media (min-width: 48rem) {
    .search-results__ad-link {
        grid-template-columns: minmax(10rem, 28%) 1fr;
    }
}
.search-results__ad-image {
    width: 100%;
    height: 100%;
    object-fit: cover;
    background: var(--color-bg-soft);
}
.search-results__ad-body {
    padding: var(--space-3) var(--space-4);
    display: flex;
    flex-direction: column;
    gap: var(--space-2);
    justify-content: center;
}
.search-results__ad-label {
    font-size: 0.78rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--color-primary);
    font-weight: 600;
}
.search-results__ad-title {
    margin: 0;
    font-size: var(--fs-h3);
    font-weight: 600;
}

/* Filter-state micro-animaties — kaart-inkomst, count-flash, empty-state fade-in.
   Achter prefers-reduced-motion: animaties spelen alleen voor gebruikers die dat willen. */
@keyframes card-enter {
    from { opacity: 0; transform: translateY(8px) scale(.98); }
}
@keyframes count-flash {
    0% { color: var(--color-primary); }
}
@keyframes fade-up {
    from { opacity: 0; transform: translateY(6px); }
}

@media (prefers-reduced-motion: no-preference) {
    .search-results__card.is-filter-entering {
        animation: card-enter .22s ease forwards;
    }
    .search-results__count.is-count-updated {
        animation: count-flash .4s ease;
    }
    .search-results__empty:not([hidden]) {
        animation: fade-up .3s ease;
    }
}

/* ─── /css/layer-navigation.css ─── */
/* layer-navigation.css — site-header, menubuilder, editmode-overlay, megamenu. */

/* ── Site-header + menubuilder (DT 152) ─────────────────────────────── */
/* ── Editmode-overlay ──────────────────────────────────────────────
   `?editmode=mm` activeert. Elke section/item met `data-edit-link`
   krijgt een hover-outline + "Edit"-knop. Sub-items binnen lagen
   (USPs, banners, kaarten) ondersteunen dezelfde decorate-call. */
[data-edit-link] {
    position: relative;
}
/* Megamenu-items: dropdown ankert op `.site-header` — `mb__main-item`
   moet `position: static` blijven zodat het `top: 100%` van .mb__dropdown
   blijft refereren aan de site-header, niet aan de li-trigger. */
.mb__main-item[data-edit-link] {
    position: static;
}
/* Rode hover-lijn voor losse items (USP/kaart/…): die hebben geen overlay.
   Lagen krijgen de lijn via de `.layer__em`-overlay hieronder — `:has(> .layer__em)`
   sluit ze hier uit, anders zou de lijn dubbel komen. */
body.edit-mode:not(.edit-mode-paused) [data-edit-link]:hover:not(:has(> .layer__em)) {
    outline: none;
    box-shadow: inset 0 0 0 9999px rgba(237, 27, 45, 0.08);
    cursor: pointer;
}

/* Layer-edit-overlay: de orchestrator zet `.layer__em` als LAATSTE directe
   child van de sectie. Vol-dekkende overlay (`inset: 0`) die ZOWEL de rode lijn
   (border) ALS de edit-knop draagt — direct kind + absolute + hoge z-index, dus
   altijd zichtbaar en bovenop, en niet door de sectie-wrapping (.layer__sc >
   .layer__inner) naar binnen te verplaatsen (dát maakte de oude in-content-knop
   op lagen onzichtbaar). `pointer-events: none` houdt onderliggende
   per-item edit-links klikbaar; alleen de edit-knop pakt zelf events. */
.layer__em {
    position: absolute;
    inset: 0;
    z-index: 50;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.15s ease;
    /* Dambord-tint zodat de hele laag als "bewerkbaar vlak" leest. Twee
       diagonale gradients kruisen tot een dambord; lage alpha (primary-rood)
       houdt de content eronder goed leesbaar. */
    background-image:
        linear-gradient(45deg, rgba(237, 27, 45, 0.10) 25%, transparent 25%, transparent 75%, rgba(237, 27, 45, 0.10) 75%),
        linear-gradient(45deg, rgba(237, 27, 45, 0.10) 25%, transparent 25%, transparent 75%, rgba(237, 27, 45, 0.10) 75%);
    background-size: 18px 18px;
    background-position: 0 0, 9px 9px;
}
body.edit-mode:not(.edit-mode-paused) [data-edit-link]:hover > .layer__em {
    opacity: 1;
}
.layer__em > .layer__edit-cta,
.layer__edit-cta:visited {
    position: absolute;
    top: 0.4rem;
    right: 0.4rem;
    pointer-events: none;
}
body.edit-mode:not(.edit-mode-paused) [data-edit-link]:hover > .layer__em > .layer__edit-cta,
.layer__edit-cta:visited {
    pointer-events: auto;
}

/* De edit-knop (in `.layer__em` voor de laag, of per-item via decorate()). */
.layer__edit-cta,
.layer__edit-cta:visited {
    display: inline-block;
    padding: 0.3rem 0.6rem;
    background: var(--bl-brown, #573b2d) !important;
    color: #fff !important;
    font-size: 0.7rem;
    font-weight: 600;
    line-height: 1.2;
    border-radius: 0.25rem;
    text-decoration: none;
}

/* Per-item knop (USP/kaart/…): direct child van het item, eigen hover-reveal. */
.layer__edit-cta--item {
    position: absolute;
    top: 0.25rem;
    right: 0.25rem;
    z-index: 50;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.15s ease;
}
body.edit-mode:not(.edit-mode-paused) [data-edit-link]:hover > .layer__edit-cta--item {
    opacity: 1;
    pointer-events: auto;
}

body:not(.edit-mode) .layer__em,
body:not(.edit-mode) .layer__edit-cta--item {
    display: none;
}

/* Floating action button — pill links-onderin, lichte achtergrond.
   Layout: [×]  Bewerkingsmodus  [○ schuif]. X = cookie weg (permanent uit),
   schuif = JS body-class (tijdelijk pauzeren). Groen = aan, grijs = uit. */
.edit-fab {
    position: fixed;
    bottom: 1.25rem;
    left: 1.25rem;
    z-index: 9999;
    display: inline-flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.45rem 0.7rem 0.45rem 0.5rem;
    background: #ffffff;
    color: #1f2937;
    border: 1px solid rgba(0, 0, 0, 0.08);
    border-radius: 999px;
    font-size: 0.85rem;
    font-weight: 500;
    box-shadow: 0 6px 18px -6px rgba(0, 0, 0, 0.18);
    user-select: none;
}
.edit-fab__close {
    display: inline-flex;
    width: 1.5rem;
    height: 1.5rem;
    align-items: center;
    justify-content: center;
    background: #f3f4f6;
    color: #4b5563;
    border-radius: 50%;
    text-decoration: none;
    font-size: 1rem;
    line-height: 1;
    transition: background-color 0.15s ease, color 0.15s ease;
}
.edit-fab__close:hover {
    background: #e5e7eb;
    color: #111827;
}
.edit-fab__label { line-height: 1; }
.edit-fab__switch {
    appearance: none;
    background: none;
    border: 0;
    padding: 0;
    cursor: pointer;
    display: inline-flex;
}
.edit-fab__switch-track {
    display: inline-block;
    width: 2.2rem;
    height: 1.2rem;
    border-radius: 999px;
    background: #16a34a; /* groen = aan */
    position: relative;
    transition: background-color 0.15s ease;
}
.edit-fab__switch-thumb {
    position: absolute;
    top: 0.15rem;
    left: calc(100% - 1.05rem);
    width: 0.9rem;
    height: 0.9rem;
    border-radius: 50%;
    background: #fff;
    transition: left 0.15s ease;
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
}
.edit-fab__switch[aria-pressed="false"] .edit-fab__switch-track { background: #d1d5db; }
.edit-fab__switch[aria-pressed="false"] .edit-fab__switch-thumb { left: 0.15rem; }

/* Site-header = positioning-anker voor de megamenu-dropdown. Sticky +
   isolation creëert een stacking context zodat de dropdown boven page-
   content blijft maar onder fixed overlays kan blijven indien nodig. */
/* Skip-link — screenreader/keyboard-only, slides in on :focus. */
.skip-link {
    position: absolute;
    top: var(--space-3);
    left: var(--space-3);
    /* Volledig uit beeld (incl. schaduw) tot focus, ongeacht de inset. */
    transform: translateY(calc(-100% - var(--space-3) - 0.75rem));
    padding: 0.6rem 1rem;
    background: var(--color-primary);
    color: var(--color-primary-fg);
    text-decoration: none;
    font-weight: 600;
    z-index: 9999;
    border-radius: var(--radius-sm);
    box-shadow: var(--shadow-1);
    transition: transform var(--dur-fast) var(--ease-out);
}
.skip-link:focus-visible {
    transform: translateY(0);
    outline: 2px solid var(--color-fg);
    outline-offset: 0;
}

:root {
    /* Hoogte van de sticky site-header; nodig als `top:`-offset voor andere
       sticky-elementen die er onder moeten plakken (bv. matrix-thead). Deze
       defaults matchen de echte header PER BREAKPOINT (desktop 83, mobiel/tablet
       70) zodat de eerste render al klopt en er geen sprong is. /js/header-height.js
       meet 'm daarna exact en overschrijft de var (inline :root-style), o.a. bij
       resize. */
    --site-header-height: 83px;
    --site-header-offset: var(--site-header-height);
}
/* De mobiele/tablet-header (≤71.875rem = de nav-omslag naar het hamburger-menu)
   is lager. Gelijk gehouden aan de echte header-hoogte om sprongen te vermijden. */
@media (max-width: 71.875rem) {
    :root { --site-header-height: 70px; }
}
.site-header {
    background: var(--color-bg);
    border-bottom: 1px solid var(--color-border);
    position: sticky;
    top: 0;
    z-index: 100;
    isolation: isolate;
    /* Hide-on-scroll-down via JS: zodra `[data-header-hidden]` op <body>
       staat schuift de header weg met transform; bij scroll terug naar
       boven glijdt 'ie zacht in. SHOW gebruikt een ease-in-out-cubic
       voor symmetrische S-curve — zachte start (geen "hap"), versnelt
       in het midden, zachte landing. */
    transition: transform .65s cubic-bezier(.65, .05, .36, 1),
                box-shadow  .35s ease;
    will-change: transform;
}
body[data-header-hidden="true"] .site-header {
    transform: translateY(-100%);
    /* HIDE iets sneller en met meer "swoosh" — accelerating ipv lineair. */
    transition: transform .35s cubic-bezier(.55, .085, .68, .53),
                box-shadow  .35s ease;
}
/* Subtiele schaduw zodra de page voorbij `MIN_SCROLL_Y` is — geeft een
   lichte separatie tussen header en content. Class wordt door JS gezet. */
body[data-page-scrolled="true"] .site-header {
    box-shadow: 0 1px 8px rgba(0,0,0,.06);
}
.site-header__inner {
    max-width: var(--content-max);
    margin: 0 auto;
    padding: 0 var(--gutter);
    display: flex;
    align-items: center;
    gap: var(--space-4);
}
.site-header__nav {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
}
/* Hamburger — alleen op mobile zichtbaar, geplakt rechts via flex-order. */
.site-header__menu-toggle {
    display: none;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    padding: 0;
    background: transparent;
    border: 0;
    border-radius: 50%;
    color: var(--color-fg);
    cursor: pointer;
    order: 99; /* helemaal rechts */
    margin-left: auto;
    transition: background-color var(--dur-fast) var(--ease-out);
}
.site-header__menu-toggle:hover {
    background: var(--color-bg-soft);
}
.site-header__menu-toggle svg {
    transition: transform var(--dur-med) var(--ease-out);
}
body[data-menu-open="true"] .site-header__menu-toggle svg {
    transform: rotate(90deg);
}
.site-logo {
    display: flex;
    align-items: center;
    flex-shrink: 0;
}
.site-logo img {
    display: block;
    height: 2.5rem;
    width: auto;
}
/* Logo als mask → kleurt mee met het thema (zwart in licht, wit in dim).
   --logo (signed URL) wordt door renderLogo() inline gezet. */
.site-logo__mark {
    display: block;
    height: 2.5rem;
    aspect-ratio: 220 / 54;          /* logo-verhouding → breedte volgt hoogte */
    background: var(--color-fg);
    -webkit-mask: var(--logo) center / contain no-repeat;
            mask: var(--logo) center / contain no-repeat;
}

/* Twee echte logo-varianten (light + dark, ingesteld via `logo` + `logo_dark`):
   toon de juiste per color-scheme. Klasse staat op de .media-stack. */
.site-logo__img { display: block; }
.site-logo__img--dark { display: none; }                 /* default = light */
@media (prefers-color-scheme: dark) {
    .site-logo__img--light { display: none; }
    .site-logo__img--dark  { display: block; }
}
html[data-color-scheme="light"] .site-logo__img--light { display: block; }
html[data-color-scheme="light"] .site-logo__img--dark  { display: none; }
html[data-color-scheme="dark"]  .site-logo__img--light { display: none; }
html[data-color-scheme="dark"]  .site-logo__img--dark  { display: block; }

/* Color-scheme toggle — subtiele icoon-knop, geen rand. Iconen cross-faden
   met rotate+scale zodat de wissel zacht voelt. */
.color-scheme-toggle {
    flex-shrink: 0;
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 50%;
    background: transparent;
    border: 0;
    color: var(--color-fg-muted);
    cursor: pointer;
    padding: 0;
    transition: color var(--dur-fast) var(--ease-out),
                background-color var(--dur-fast) var(--ease-out);
}
.color-scheme-toggle:hover {
    color: var(--color-fg);
    background: var(--color-bg-soft);
}
.cs-icon {
    position: absolute;
    width: 1.15rem;
    height: 1.15rem;
    transition: opacity var(--dur-med) var(--ease-out),
                transform var(--dur-med) var(--ease-out);
}
/* Default (light): zon zichtbaar, maan onzichtbaar. */
.cs-icon--sun  { opacity: 1; transform: rotate(0)        scale(1);   }
.cs-icon--moon { opacity: 0; transform: rotate(-90deg)   scale(0.5); }
/* Dark forced via attribute */
:root[data-color-scheme="dark"] .cs-icon--sun  { opacity: 0; transform: rotate(90deg)  scale(0.5); }
:root[data-color-scheme="dark"] .cs-icon--moon { opacity: 1; transform: rotate(0)      scale(1);   }
/* Dark via system-preference (mits gebruiker niet handmatig light heeft gekozen) */
@media (prefers-color-scheme: dark) {
    :root:not([data-color-scheme="light"]) .cs-icon--sun  { opacity: 0; transform: rotate(90deg) scale(0.5); }
    :root:not([data-color-scheme="light"]) .cs-icon--moon { opacity: 1; transform: rotate(0)     scale(1);   }
}
.mb {
    flex: 1;
    min-width: 0;
    display: flex;
    align-items: center;
    gap: var(--space-3);
}
.mb__main, .mb__main-ctas {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    gap: var(--space-2);
}
.mb__main { flex: 1; }
/* Bewust géén `position: relative` — dropdown ankert op .site-header
   (de hele balk-breedte), niet op de individuele trigger. */
.mb__main-link {
    display: block;
    padding: 1rem 0.9rem;
    font-weight: 600;
    color: var(--color-fg);
    text-decoration: none;
    transition: color 0.15s;
}
.mb__main-link:hover { color: var(--color-primary); }

/* ── Megamenu — full-width dropdown ─────────────────────────────────── */
.mb__dropdown {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    background: var(--color-bg);
    border-top: 1px solid var(--color-border);
    border-bottom: 1px solid var(--color-border);
    box-shadow: 0 24px 48px -16px rgba(0, 0, 0, 0.12);
    padding: var(--space-5) var(--gutter);
    opacity: 0;
    visibility: hidden;
    transform: translateY(-6px);
    transition: opacity 0.18s ease, transform 0.18s ease, visibility 0s linear 0.18s;
    z-index: -1; /* onder de trigger zodat de hover-zone doorloopt */
}
.mb__main-item:hover > .mb__dropdown,
.mb__main-item:focus-within > .mb__dropdown {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
    transition: opacity 0.18s ease, transform 0.18s ease;
    z-index: 1;
}

.mb__columns {
    max-width: var(--content-max);
    margin: 0 auto;
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
    gap: var(--space-5);
}
.mb__col-header { margin-bottom: var(--space-2); }
.mb__col-title {
    font-weight: 700;
    font-size: 1rem;
    color: var(--color-fg);
    text-decoration: none;
}
.mb__col-title:hover { color: var(--color-primary); }
.mb__col-subtitle {
    display: block;
    font-size: 0.85rem;
    color: var(--color-fg-muted);
}
.mb__col-list { list-style: none; padding: 0; margin: 0; }
.mb__item-link {
    display: block;
    padding: 0.4rem 0;
    color: var(--color-fg);
    text-decoration: none;
}
.mb__item-link:hover { color: var(--color-primary); }
.mb__item-tagline {
    display: block;
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--color-fg-muted);
}
.mb__item-title { font-weight: 500; }
.mb__item-sub {
    display: block;
    font-size: 0.85rem;
    color: var(--color-fg-muted);
}

/* Banners zitten gegroepeerd in één banner-kolom (`.mb__col--banners`),
   die meedraait in de zelfde `.mb__columns`-grid als de inhouds-kolommen. */
.mb__col--banners {
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
}
/* Horizontale list-stijl: kleine vierkante thumb links, titel + subtitle rechts.
   Image is een vaste 4rem (64px) square; body krijgt de rest van de breedte. */
.mb__dropdown-cta {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-2);
    text-decoration: none;
    color: var(--color-fg);
    border-radius: 0.5rem;
    background: var(--color-bg-soft, #f6f5f0);
    transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.mb__dropdown-cta:hover,
.mb__dropdown-cta:focus-visible {
    transform: translateY(-2px);
    box-shadow: 0 12px 24px -8px rgba(0, 0, 0, 0.18);
}
.mb__cta-image {
    flex: 0 0 auto;
    display: block;
    width: 4rem;
    height: 4rem;
    border-radius: 0.375rem;
    overflow: hidden;
}
/* MediaRender wrapt de <img> in een <div class="media"> — die moet
   ook de volledige cel vullen, anders krijgt de inner img height:100% van 0. */
.mb__cta-image .media {
    display: block;
    width: 100%;
    height: 100%;
}
.mb__cta-image img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.mb__cta-body {
    /* min-width:0 zodat lange titles binnen flex kunnen ellipsen i.p.v. te
       overflowen — anders forceert intrinsic content de body breder dan beschikbaar. */
    flex: 1 1 auto;
    min-width: 0;
    display: block;
}
.mb__cta-title {
    display: block;
    font-weight: 700;
    font-size: 0.95rem;
    line-height: 1.25;
    color: var(--color-fg);
}
.mb__cta-subtitle {
    display: block;
    margin-top: 0.15rem;
    font-size: 0.8rem;
    color: var(--color-fg-muted);
}

/* ── Site-nav (NavigationMenuRenderer — Navigation-tabel) ───────────── */

.site-nav {
    display: flex;
    align-items: center;
    flex: 1;
    min-width: 0;
}

.site-nav__list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    gap: 0;
}

/* Top-level items — rechts uitgelijnd binnen de beschikbare nav-ruimte */
.site-nav__list--depth-0 { flex: 1; justify-content: flex-end; }

.site-nav__item { position: relative; }

.site-nav__link {
    display: block;
    padding-block: 1rem;
    padding-inline: clamp(0.35rem, 0.15rem + 0.4vw, 0.75rem);
    font-weight: 600;
    font-size: 0.95rem;
    color: var(--color-fg);
    text-decoration: none;
    white-space: nowrap;
    transition: color 0.15s ease;
}
.site-nav__link:hover { color: var(--color-primary); }
.site-nav__link--no-route { cursor: default; }

/* Dropdown — depth-1 */
.site-nav__list--depth-1 {
    position: absolute;
    top: 100%;
    left: 0;
    flex-direction: column;
    min-width: 13rem;
    background: var(--color-bg);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md, 0.5rem);
    box-shadow: 0 12px 32px -8px rgba(0,0,0,.14);
    padding: var(--space-1) 0;
    opacity: 0;
    visibility: hidden;
    transform: translateY(-4px);
    transition: opacity .15s ease, transform .15s ease, visibility 0s linear .15s;
    z-index: 10;
}
.site-nav__item:hover > .site-nav__list--depth-1,
.site-nav__item:focus-within > .site-nav__list--depth-1 {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
    transition: opacity .15s ease, transform .15s ease;
}

/* Dropdown links */
.site-nav__list--depth-1 .site-nav__link {
    padding: 0.5rem 1.1rem;
    font-weight: 400;
    font-size: 0.9rem;
}
.site-nav__list--depth-1 .site-nav__link:hover {
    background: color-mix(in srgb, var(--color-primary, #c1272d) 6%, transparent);
    color: var(--color-primary);
}

/* Chevron-indicator voor items met een submenu (desktop: op de link) */
.site-nav__item--has-children > .site-nav__link::after {
    content: '';
    display: inline-block;
    width: .45em;
    height: .45em;
    border-right: 1.5px solid currentColor;
    border-bottom: 1.5px solid currentColor;
    transform: rotate(45deg) translateY(-2px);
    margin-left: .4em;
    opacity: .6;
    vertical-align: middle;
    transition: transform .15s ease;
}
.site-nav__item--has-children:hover > .site-nav__link::after,
.site-nav__item--has-children:focus-within > .site-nav__link::after {
    transform: rotate(-135deg) translateY(-1px);
}

/* Toggle-knop — alleen zichtbaar op mobile; desktop gebruikt hover. */
.site-nav__toggle {
    display: none;
}

/* ── Navigatie CTA-knoppen ──────────────────────────────────────────────── */

.site-nav__ctas {
    display: flex;
    align-items: center;
    gap: var(--space-2);
    flex-shrink: 0;
}
.site-nav__ctas--mobile { display: none; }

/* Secundaire CTA in de header krijgt een subtiele vulling (i.p.v. transparant)
   zodat 'ie niet wegvalt tegen de header-achtergrond. Alleen in de header
   gescoped; elders blijft .button--secondary transparant. Themable. */
.site-header .button--secondary {
    background: var(--color-bg-soft);
}
.site-header .button--secondary:hover {
    background: color-mix(in srgb, var(--color-fg) 8%, var(--color-bg-soft));
}
.site-nav__cta {
    position: relative;
    display: inline-flex;
    align-items: center;
    gap: 0.4em;
    padding: 0.5rem 1rem;
    background: var(--color-primary);
    color: var(--color-primary-fg, #fff);
    font-size: 0.9rem;
    font-weight: 600;
    border-radius: var(--radius-sm, 0.25rem);
    text-decoration: none;
    white-space: nowrap;
    transition: background-color var(--dur-fast) var(--ease-out),
                transform var(--dur-fast) var(--ease-out);
}
.site-nav__cta:hover {
    background: color-mix(in srgb, var(--color-primary) 85%, #000);
    transform: translateY(-1px);
}
.site-nav__cta-icon {
    width: 1.1em;
    height: 1.1em;
    flex-shrink: 0;
}
.site-nav__cta-text { line-height: 1; }

/* Basket-badge: kleine rode stip met teller; verborgen als leeg */
.site-nav__cta-badge {
    display: none;
    position: absolute;
    top: -0.4rem;
    right: -0.4rem;
    min-width: 1.2rem;
    height: 1.2rem;
    padding: 0 0.25rem;
    background: #e53e3e;
    color: #fff;
    font-size: 0.65rem;
    font-weight: 700;
    line-height: 1.2rem;
    border-radius: 999px;
    text-align: center;
}
.site-nav__cta-badge:not(:empty) { display: block; }

/* Compacte icoon-only header-controls (desktop, --main), volgens voorbeeld:
   transparante knop, alleen het icoon + teller-badge. Het tekstlabel blijft in
   de DOM (toegankelijk voor screenreaders) maar wordt visueel verborgen. Het
   mobiele drawer-menu (--mobile) houdt de leesbare tekstknoppen. */
/* Header-iconen dichter tegen elkaar dan de standaard --space-2. */
.site-nav__ctas--main { gap: 0.1rem; }
.site-nav__ctas--main .site-nav__cta--icon {
    background: transparent;
    color: #fff;
    padding: 0.4rem;
    gap: 0;
    border-radius: 50%;
    font-weight: 500;
}
.site-nav__ctas--main .site-nav__cta--icon:hover {
    background: var(--on-image-bg-hover, rgba(255, 255, 255, .15));
    color: #fff;
    transform: none;
}
.site-nav__ctas--main .site-nav__cta--icon .site-nav__cta-icon {
    width: 1.5em;
    height: 1.5em;
}
.site-nav__ctas--main .site-nav__cta--icon .site-nav__cta-text {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
}

/* Mobile-state: hamburger zichtbaar, megamenu klapt drawer-style uit
   onder de header. Toggle wordt door /modules/site-header.js gezet. */
@media (max-width: 71.875rem) {
    .site-header__menu-toggle { display: inline-flex; }
    .site-header__nav {
        /* position: fixed werkt niet binnen will-change: transform ancestor.
           position: absolute + top: 100% ankert de drawer direct onder de header. */
        display: block;
        position: absolute;
        top: 100%;
        left: 0;
        right: 0;
        height: calc(100dvh - var(--site-header-height, 4rem));
        background: var(--color-bg);
        border-top: 1px solid var(--color-border);
        overflow-y: auto;
        padding: var(--space-3) var(--gutter);
        transform: translateY(-110%);
        transition: transform var(--dur-med) var(--ease-out);
        visibility: hidden;
    }
    body[data-menu-open="true"] .site-header__nav {
        transform: translateY(0);
        visibility: visible;
    }
    body[data-menu-open="true"] {
        overflow: hidden; /* lock background-scroll */
    }
    .mb { flex-direction: column; align-items: stretch; gap: 0; }
    .mb__main { flex-direction: column; width: 100%; gap: 0; }
    .mb__main-item { border-bottom: 1px solid var(--color-border); }
    .mb__main-link { padding: var(--space-3) 0; }
    .mb__dropdown {
        position: static;
        opacity: 1;
        visibility: visible;
        transform: none;
        padding: 0 0 var(--space-3);
        border: 0;
        box-shadow: none;
        display: none;
    }
    .mb__main-item--open > .mb__dropdown,
    .mb__main-item:focus-within > .mb__dropdown {
        display: block;
    }
    .mb__columns { grid-template-columns: 1fr; gap: var(--space-3); }
    .mb__col--banners { display: none; } /* banners alleen desktop */

    /* Desktop CTA's verbergen in drawer; mobile CTA's zijn al in de drawer */
    .site-nav__ctas--main   { display: none; }

    /* Lang-switch rechts van het logo naar rechts naast de hamburger schuiven.
       Zonder nav (flex:1) had margin-left:auto op de toggle al die ruimte opgeslokt
       en hing de vlag links. Nu krijgt de lang de auto-margin en volgt de hamburger er direct op. */
    .lang-switcher            { display: inline-flex; margin-left: auto; }
    .site-header__menu-toggle { margin-left: 0; }
    .site-nav__ctas--mobile { display: flex; padding: var(--space-3) 0 var(--space-2); border-top: 1px solid var(--color-border); margin-top: var(--space-2); }

    /* site-nav mobile — drawer-stijl in de .site-header__nav container */
    .site-nav { display: block; width: 100%; }
    .site-nav__list--depth-0 { flex-direction: column; justify-content: flex-start; }
    .site-nav__item { border-bottom: 1px solid var(--color-border); }
    .site-nav__link { padding: var(--space-3) 0; font-size: 1rem; }

    /* Items met submenu: link + toggle-knop naast elkaar, depth-1 wraps eronder */
    .site-nav__item--has-children {
        display: flex;
        flex-wrap: wrap;
        align-items: stretch;
    }
    .site-nav__item--has-children > .site-nav__link {
        flex: 1;
        min-width: 0;
    }
    /* Verberg desktop-chevron op de link; button neemt het over */
    .site-nav__item--has-children > .site-nav__link::after { display: none; }

    /* Toggle-knop */
    .site-nav__toggle {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        width: 2.75rem;
        flex-shrink: 0;
        background: transparent;
        border: 0;
        color: var(--color-fg-muted);
        cursor: pointer;
        padding: 0;
    }
    .site-nav__toggle::after {
        content: '';
        display: inline-block;
        width: .5em;
        height: .5em;
        border-right: 1.5px solid currentColor;
        border-bottom: 1.5px solid currentColor;
        transform: rotate(45deg);
        transition: transform .15s ease;
    }
    .site-nav__item.is-open > .site-nav__toggle::after {
        transform: rotate(-135deg);
    }

    /* Depth-1 dropdown: inline, niet absoluut; vult volle breedte */
    .site-nav__list--depth-1 {
        position: static;
        opacity: 1;
        visibility: visible;
        transform: none;
        box-shadow: none;
        border: 0;
        border-radius: 0;
        padding: 0 0 var(--space-2) var(--space-3);
        flex-basis: 100%;
        display: none;
    }
    .site-nav__item.is-open > .site-nav__list--depth-1 {
        display: flex;
    }
    .site-nav__list--depth-1 .site-nav__link {
        padding: 0.4rem 0;
        font-size: 0.9rem;
    }
    .site-nav__list--depth-1 .site-nav__link:hover { background: none; }
}

/* ─── /css/footer.css ─── */
/*
 * Site-footer (legacy "variation 4") — site-breed, gerenderd door
 * App\Footer\FooterRenderer en in page.phtml tussen </main> en </body> gezet.
 * Class-namen sluiten aan op de site-design `design_footer`-slots (SiteDesign).
 */

/* Géén achtergrond/kleur/spacing op `.site-footer` hier — die opmaak komt uit
   de CMS (`design_footer.layer` → SiteDesign). Dit bestand bevat alleen de
   structurele layout (grid/flex/kolommen). */

.site-footer__inner {
    max-width: var(--content-max);
    margin-inline: auto;
    padding-inline: var(--gutter);
    display: flex;
    flex-direction: column;
    gap: var(--space-5);
}

.site-footer__row {
    display: grid;
    gap: var(--space-4) var(--space-6);
}
.site-footer__row--top  { grid-template-columns: auto 1fr; align-items: center; }
.site-footer__row--main { grid-template-columns: minmax(12rem, 1fr) 2fr; align-items: start; }

@media (max-width: 48rem) {
    .site-footer__row { grid-template-columns: 1fr; }
}

.site-footer__media img,
.site-footer__logo { max-width: 240px; height: auto; display: block; }

.site-footer__slogan   { font-weight: 600; margin-bottom: var(--space-2); }
.site-footer__col-title { font-weight: 700; margin-bottom: var(--space-2); }

/* Socials */
.site-footer__socials {
    list-style: none; margin: 0; padding: 0;
    display: flex; flex-wrap: wrap; gap: var(--space-3);
}
.site-footer__socials a {
    display: inline-flex; align-items: center; gap: .4em;
    text-decoration: none; color: inherit;
}
.site-footer__social-icon { width: 24px; height: 24px; color: var(--color-primary); }
/* Inline-SVG (image_inline) vult de box + kleurt via currentColor mee met het thema. */
.site-footer__social-icon svg { display: block; width: 100%; height: 100%; }
.site-footer__social-icon img { width: 100%; height: 100%; object-fit: contain; }
.site-footer__socials a:hover { color: var(--color-primary); }

/* Link-kolommen */
.site-footer__links {
    display: grid; gap: var(--space-4) var(--space-5);
    grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
}
.site-footer__links-col ul {
    list-style: none; margin: 0; padding: 0;
    display: flex; flex-direction: column; gap: .35em;
}
.site-footer__links a { text-decoration: none; color: inherit; }
.site-footer__links a:hover { text-decoration: underline; }

/* type=text-kolom (bv. openingstijden): label | waarde */
.site-footer__links-table li {
    display: flex;
    justify-content: space-between;
    gap: var(--space-3);
}

/* Adres */
.site-footer__address :is(p) { margin: 0 0 .5em; }
.site-footer__address a { color: inherit; }

/* Credit-balk (copyright + Multiminded) */
.site-footer__credit {
    display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
    gap: var(--space-3);
    border-top: 1px solid var(--color-border);
    padding-top: var(--space-4);
    color: var(--color-fg-muted);
    font-size: .85rem;
}
.site-footer__credit a { color: inherit; text-decoration: none; }
.site-footer__credit a:hover { color: var(--color-primary); }

/* Onderbalk: juridische links + copyright links, icoon rechts. */
.site-footer__credit-left {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--space-2) var(--space-4);
}
.site-footer__legal {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2) var(--space-4);
    list-style: none;
    margin: 0;
    padding: 0;
}
.site-footer__legal a:hover { color: var(--color-primary); text-decoration: underline; }

/* Multiminded-icoon i.p.v. de naam, rechtsonder in de credit-balk. */
.site-footer__credit-link { display: inline-flex; align-items: center; }
.site-footer__credit-logo {
    opacity: .8;
    transition: opacity var(--dur-fast, .12s) var(--ease-out, ease);
}
/* Klein houden — begrens zowel het element met de class als een geneste
   <img> (mediaRender kan in een <picture>-wrapper renderen). */
.site-footer__credit-logo,
.site-footer__credit-logo img {
    height: 24px;
    width: auto;
    max-width: 160px;
    display: block;
}
.site-footer__credit-link:hover .site-footer__credit-logo { opacity: 1; }

/* ─── /css/layer-accommodation.css ─── */
/* layer-accommodation.css — accommodation detail pagina (/accommodaties/{id}). */

/* ── Accommodation detail (/accommodaties/{id}) ────────────────────── */
.layer__accommodation-detail {
    max-width: var(--content-max);
    margin: 0 auto;
    padding: var(--space-4) var(--gutter) var(--space-5);
}
/* 2-koloms layout — content links, sticky availability-preview rechts.
   `align-items: start` is cruciaal: anders rekt de aside-cell uit naar de
   hoogte van de main-cell en `position: sticky` heeft niks om binnen te
   stickyen. `min-width: 0` op main voorkomt dat brede children (matrix-
   tabel met scrollwidth) de grid-track laten oprekken voorbij 1fr. */
.accommodation-detail__layout {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 360px;
    gap: var(--space-6);
    align-items: start;
    margin-top: var(--space-5);
}
.accommodation-detail__main {
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: var(--space-5);
}
.accommodation-detail__aside {
    position: sticky;
    top: calc(var(--site-header-height, 64px) + var(--space-3));
    /* Aside kan zelf scrollen als ie té hoog wordt voor de viewport. */
    max-height: calc(100vh - var(--site-header-height, 64px) - var(--space-4));
    overflow-y: auto;
    background: var(--color-bg-elev);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-lg, 12px);
    padding: var(--space-4) var(--space-4) var(--space-5);
    /* Twee-laags shadow voor zachte diepte ipv harde 1-laag. */
    box-shadow: 0 1px 2px rgba(0, 0, 0, .04),
                0 8px 24px rgba(0, 0, 0, .06);
    /* Accent-rand bovenaan in primary — herhaalt de site-branding subtiel. */
    border-top: 3px solid var(--color-primary);
}
/* Scoped-scrollbar in aside — minder opvallend. */
.accommodation-detail__aside::-webkit-scrollbar { width: 6px; }
.accommodation-detail__aside::-webkit-scrollbar-thumb {
    background: var(--color-border);
    border-radius: 3px;
}
/* Binnen aside: kill de inner-box (anders dubbel-geboxed) en kop compacter. */
.accommodation-detail__aside .accommodation-detail__availability {
    margin: 0;
    padding: 0;
    background: none;
    border-radius: 0;
}
.accommodation-detail__aside .accommodation-detail__availability-title {
    margin: 0 0 var(--space-3);
    font-size: 1.05rem;
    font-weight: 700;
    letter-spacing: -0.01em;
    /* Subtiele scheidingslijn onder de titel. */
    padding-bottom: var(--space-2);
    border-bottom: 1px solid var(--color-border);
}
/* Reset alle .sab__form-defaults binnen aside: geen extra bg/padding/
   shadow (aside zelf is al de card), één kolom op alle viewports, en
   alle date-triggers stacken zodat ze binnen de smalle aside passen.
   `align-items: stretch` overrult de `align-items: end` die `.sab__form`
   in z'n desktop-media-block zet — anders worden alle fields rechts
   uitgelijnd ipv full-width. */
.accommodation-detail__aside .sab__form {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: var(--space-3);
    background: none;
    padding: 0;
    box-shadow: none;
    max-width: none;
    margin: 0;
    grid-template-columns: none;
}
.accommodation-detail__aside .sab__field {
    width: 100%;
    min-width: 0;
}
/* date-picker.css zet `min-width: 22rem` (352px) op de trigger-row —
   overflowed onze 310px-aside. Reset naar 1 kolom zodat checkin/checkout
   onder elkaar staan. */
.accommodation-detail__aside .date-trigger-row {
    min-width: 0;
    width: 100%;
    grid-template-columns: 1fr;
}
.accommodation-detail__aside .date-trigger {
    min-width: 0;        /* anders rekt content (datum-string) de trigger op */
}
.accommodation-detail__aside .sab__input--button {
    width: 100%;
}
.accommodation-detail__aside .sab__submit {
    width: 100%;
    padding: .85em 1em;
    font-weight: 600;
    font-size: .95rem;
}
/* "Vanaf €X"-eyecatcher boven de form — grote prijs voor instant
   value-perception; subtiele scheidingslijn onder. */
.acc-aside-preview {
    display: flex;
    flex-direction: column;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 0 var(--space-2);
    margin: 0 0 var(--space-4);
    padding-bottom: var(--space-3);
    border-bottom: 1px solid var(--color-border);
}
.acc-aside-preview__label {
    flex-basis: 100%;
    font-size: .75rem;
    text-transform: uppercase;
    letter-spacing: .08em;
    color: var(--color-fg-muted);
    font-weight: 600;
}
.acc-aside-preview__price {
    font-size: 1.85rem;
    font-weight: 700;
    color: var(--color-primary);
    letter-spacing: -0.02em;
    line-height: 1.1;
    font-variant-numeric: tabular-nums;
}
.acc-aside-preview__sub {
    font-size: .85rem;
    color: var(--color-fg-muted);
}

/* #129 — mobiele prijs-teaser (boven de gallery): alleen de functionele toggle.
   Default verborgen; op mobiel (<=767px) getoond en dan verbergt de aside-teaser.
   Visuele plaatsing/styling is site-maatwerk (banus#27). */
.acc-aside-preview--mobile { display: none; }
@media (max-width: 767px) {
    .accommodation-detail__aside .acc-aside-preview { display: none; }
    .acc-aside-preview--mobile { display: flex; }
}

.booking-preview-bar {
    display: none;
}
.booking-preview-inline {
    display: none;
    gap: .3rem;
    margin-top: var(--space-3);
    padding: var(--space-3);
    border: 1px solid color-mix(in srgb, var(--color-primary) 18%, var(--color-border));
    border-radius: var(--radius-md);
    background: color-mix(in srgb, var(--color-primary) 5%, var(--color-bg-elev));
}
.booking-preview-inline[data-visible="1"] {
    display: grid;
}
.booking-preview-inline[data-empty="1"] {
    opacity: .85;
}
.booking-preview-inline__title {
    font-size: 1rem;
    line-height: 1.2;
    font-weight: 700;
    color: var(--color-fg);
}
.booking-preview-inline__price {
    font-size: 1.2rem;
    font-weight: 800;
    color: var(--color-primary);
    font-variant-numeric: tabular-nums;
}
.booking-preview-inline__strip {
    height: .4rem;
    border-radius: 999px;
    overflow: hidden;
    background: color-mix(in srgb, var(--color-primary) 12%, var(--color-bg-soft));
}
.booking-preview-inline__strip-fill {
    display: block;
    width: 18%;
    height: 100%;
    border-radius: inherit;
    background: linear-gradient(90deg, var(--color-primary), color-mix(in srgb, var(--color-primary) 45%, #7c2d12));
    transition: width 180ms ease;
}
.booking-preview-inline[data-loading="1"] .booking-preview-inline__strip-fill {
    background: linear-gradient(90deg, color-mix(in srgb, var(--color-primary) 55%, #fff), var(--color-primary));
}
@media (max-width: 64rem) {
    .accommodation-detail__layout {
        grid-template-columns: 1fr;
        gap: var(--space-4);
    }
    .accommodation-detail__aside {
        position: static;
        max-height: none;
        overflow: visible;
    }
}
.accommodation-detail__empty {
    padding: var(--space-6) 0;
    text-align: center;
}
.accommodation-detail__empty h1 {
    margin-bottom: var(--space-3);
}
.accommodation-detail__head {
    margin-bottom: var(--space-4);
}
.accommodation-detail__back {
    color: var(--color-fg-muted);
    text-decoration: none;
    font-size: 0.9rem;
}
.accommodation-detail__back:hover {
    color: var(--color-fg);
    text-decoration: underline;
}
.accommodation-detail__title {
    font-size: var(--fs-h1);
    margin: var(--space-2) 0 var(--space-1);
}
.accommodation-detail__subtitle {
    font-size: var(--fs-h3);
    color: var(--color-fg-muted);
    margin: 0 0 var(--space-2);
}
.accommodation-detail__intro {
    color: var(--color-fg-muted);
    max-width: 60ch;
    margin: 0;
}
.accommodation-detail__specs {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr));
    gap: var(--space-3);
    padding: var(--space-4);
    margin: 0 0 var(--space-5);
    background: var(--color-bg-soft);
    border-radius: var(--radius-md);
}
.accommodation-detail__spec {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}
.accommodation-detail__spec dt {
    font-size: 0.8rem;
    color: var(--color-fg-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.accommodation-detail__spec dd {
    font-size: 1.25rem;
    font-weight: 600;
    margin: 0;
}
/* Checkbox-specs: het label ("Incl. privéterras") zegt het al — geen ✓-waarde
   tonen in deze band. Generieke, CMS-volgorde-onafhankelijke regel via de
   data-type-hook uit buildSpecs() (#11), i.p.v. route-specifieke nth-child. */
.accommodation-detail__spec[data-type="checkbox"] dd {
    display: none;
}
/* Gallery-trigger is een button — geen default-styling. */
.accommodation-detail__gallery-trigger {
    display: block;
    width: 100%;
    height: 100%;
    background: none;
    border: 0;
    padding: 0;
    cursor: zoom-in;
}
.accommodation-detail__gallery-trigger > .media,
.accommodation-detail__gallery-trigger img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

/* Gallery — airbnb-style 1 grote + 4 kleine tegels (desktop). Container
   aspect-ratio 3:1 zorgt dat alle tegels ~3:2 worden (tile = grid/2).
   Extra items blijven in DOM voor lightbox-navigatie, maar zijn visueel
   verborgen. Op de laatste-zichtbare tegel zit een "+N meer"-overlay. */
.accommodation-detail__gallery {
    list-style: none;
    margin: 0 0 var(--space-5);
    padding: 0;
    display: grid;
    grid-template-columns: 2fr 1fr 1fr;
    grid-template-rows: 1fr 1fr;
    gap: 4px;
    aspect-ratio: 3 / 1;
    border-radius: var(--radius-md);
    overflow: hidden;
}
.accommodation-detail__gallery-item {
    position: relative;
    overflow: hidden;
    background: var(--color-bg-soft);
    animation: gallery-item-in var(--dur-slow) var(--ease-out) both;
}
.accommodation-detail__gallery-item:nth-child(1) { animation-delay:   0ms; }
.accommodation-detail__gallery-item:nth-child(2) { animation-delay:  60ms; }
.accommodation-detail__gallery-item:nth-child(3) { animation-delay: 120ms; }
.accommodation-detail__gallery-item:nth-child(4) { animation-delay: 180ms; }
.accommodation-detail__gallery-item:nth-child(5) { animation-delay: 240ms; }
@keyframes gallery-item-in {
    from { opacity: 0; transform: scale(0.97); }
    to   { opacity: 1; transform: scale(1); }
}
.accommodation-detail__gallery-item:first-child {
    grid-row: 1 / span 2;
}
/* Tegels voorbij de 5e: in DOM blijven (voor lightbox-nav) maar verbergen. */
.accommodation-detail__gallery-item:nth-child(n+6) { display: none; }

.accommodation-detail__gallery-item > .media,
.accommodation-detail__gallery-item img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    transition: transform var(--dur-slow, .42s) var(--ease-out, ease),
                filter var(--dur-slow, .42s) var(--ease-out, ease);
}
.accommodation-detail__gallery-item:hover img,
.accommodation-detail__gallery-item:hover > .media img {
    transform: scale(1.06);
    filter: brightness(0.85);
}

/* "+N meer foto's"-overlay — pointer-events: none zodat de onderliggende
   trigger-button klikbaar blijft (opent lightbox, user navigeert). */
.accommodation-detail__gallery-more {
    position: absolute;
    inset: 0;
    display: none;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--space-1);
    background: rgba(0, 0, 0, .5);
    color: #fff;
    font-weight: 700;
    backdrop-filter: blur(2px);
    pointer-events: none;
}
.accommodation-detail__gallery-more-icon {
    width: 2.5rem;
    height: 2.5rem;
    border: 2px solid #fff;
    border-radius: 50%;
    background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M12 5v14M5 12h14' stroke='white' stroke-width='2.5' stroke-linecap='round'/></svg>");
    background-size: 55%;
    background-repeat: no-repeat;
    background-position: center;
}
.accommodation-detail__gallery-more-text {
    font-size: 1rem;
    letter-spacing: .02em;
}

/* Welke overlay zichtbaar is per breakpoint. */
@media (min-width: 48rem) {
    .accommodation-detail__gallery-more--desktop { display: flex; }
}
@media (max-width: 48rem) {
    /* Mobile: 1 grote + 2 kleine. */
    .accommodation-detail__gallery {
        grid-template-columns: 1fr 1fr;
        grid-template-rows: 2fr 1fr;
        aspect-ratio: 4 / 3;
    }
    .accommodation-detail__gallery-item:first-child {
        grid-column: 1 / span 2;
        grid-row: 1;
    }
    .accommodation-detail__gallery-item:nth-child(n+4) { display: none; }
    .accommodation-detail__gallery-more--mobile { display: flex; }
}

.accommodation-detail__content {
    margin: 0 0 var(--space-5);
    max-width: 65ch;
    line-height: var(--line-base);
}

/* Properties / voorzieningen — grid van name + value pairs */
.accommodation-detail__properties {
    margin: 0 0 var(--space-5);
}
.accommodation-detail__properties-title {
    font-size: var(--fs-h3);
    margin: 0 0 var(--space-3);
}
.accommodation-detail__properties-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: 1fr;
    gap: 0;
    border-top: 1px solid var(--color-border);
}
@container (min-width: 30rem) {
    .accommodation-detail__properties-list { grid-template-columns: 1fr 1fr; gap: 0 var(--space-3); }
}
@container (min-width: 50rem) {
    .accommodation-detail__properties-list { grid-template-columns: 1fr 1fr 1fr; }
}
.accommodation-detail__property {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: var(--space-3);
    padding: var(--space-2) 0;
    border-bottom: 1px solid var(--color-border);
}
.accommodation-detail__property-name {
    color: var(--color-fg-muted);
    font-size: 0.9rem;
}
.accommodation-detail__property-value {
    font-weight: 600;
    text-align: right;
}
.accommodation-detail__property.prop--checkbox .accommodation-detail__property-value {
    color: var(--color-primary);
    font-size: 1.1rem;
}

.accommodation-detail__content-block + .accommodation-detail__content-block {
    margin-top: var(--space-4);
}
.accommodation-detail__cta {
    display: flex;
    gap: var(--space-3);
    align-items: center;
    padding: var(--space-4) 0;
    border-top: 1px solid var(--color-border);
}
.accommodation-detail__cta-back {
    color: var(--color-fg-muted);
    text-decoration: none;
}
.accommodation-detail__cta-back:hover {
    color: var(--color-fg);
    text-decoration: underline;
}

/* ─── /css/layer-map.css ─── */
/* layer-map.css — locatiekaart (layer_map / LayerMap + /js/map.js).
   Baseline zodat Leaflet een meetbare container heeft; fijn-styling (Banus)
   gebeurt in custom/site.css. (#13) */

.layer__map-canvas {
    /* Leaflet heeft een expliciete hoogte nodig, anders rendert de kaart 0px. */
    height: clamp(360px, 44vw, 500px);
    border-radius: var(--bl-band-radius, 12px);
    overflow: hidden;
    background: var(--color-bg-soft, #eee);
    z-index: 0; /* onder eventuele overlappende site-chrome */
}

/* Leaflet-tiles/controls binnen de afgeronde hoeken houden. */
.layer__map-canvas .leaflet-container {
    height: 100%;
    border-radius: inherit;
    font: inherit;
}

.layer__map-actions {
    margin-top: var(--space-3, 1rem);
    display: flex;
    justify-content: flex-start;
}

/* ─── /css/carousel.css ─── */
/*
 * Carousel — gestyled voor `<div class="carousel">` zoals gegenereerd door
 * App\Carousel\CarouselRenderer. JS-laag (Embla wrapper) hangt klassen
 * dynamisch toe: `.carousel__slide--active`, `.carousel__dot--selected` etc.
 *
 * Werkt al als CSS-only scroll-snap voordat JS geladen is — geen lay-out
 * shift bij hydration.
 */

.carousel {
    position: relative;
    /* Container-queries op carousel-level voor slide-count breakpoints */
    container-type: inline-size;
    /* Voorkom 0-breedte in nested flex-parents */
    width: 100%;
    min-width: 0;
}

.carousel__viewport {
    overflow: hidden;
    width: 100%;
}

.carousel__container {
    display: flex;
    /* Spacing via slide-padding i.p.v. flex `gap`: Embla meet slide-breedtes en
       werkt niet betrouwbaar met `gap`. De negatieve margin compenseert de
       leading padding van de eerste slide zodat 'ie flush links staat. */
    margin-left: calc(var(--space-3) * -1);
    /* Vóór JS-init: scroll-snap maakt 't al een werkende carousel */
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
}
.carousel__container::-webkit-scrollbar { display: none; }

/* Default: één slide volle viewport breed.
   `data-layout-cols=N` (op container) splits naar N kolommen.
   `--layout-peek` (custom property): toon X% van de volgende slide. */
.carousel__slide {
    flex: 0 0 100%;
    box-sizing: border-box;
    padding-left: var(--space-3);   /* slide-spacing (binnen flex-basis via border-box) */
    scroll-snap-align: start;
    min-width: 0;
}
.carousel__container[data-layout-cols="2"] .carousel__slide { flex-basis: 50%;     }
.carousel__container[data-layout-cols="3"] .carousel__slide { flex-basis: 33.333%; }
.carousel__container[data-layout-cols="4"] .carousel__slide { flex-basis: 25%;     }
.carousel__container[data-layout-cols="5"] .carousel__slide { flex-basis: 20%;     }
.carousel__container[data-layout-cols="6"] .carousel__slide { flex-basis: 16.667%; }

/* Peek van volgende slide (default 0%) */
.carousel__container[style*="--layout-peek"] .carousel__slide {
    flex-basis: calc(100% - var(--layout-peek, 0%));
}

/* Smaller container: minder slides naast elkaar voor leesbaarheid */
@container (max-width: 60rem) {
    .carousel__container[data-layout-cols="5"] .carousel__slide,
    .carousel__container[data-layout-cols="6"] .carousel__slide { flex-basis: 33.333%; }
}
@container (max-width: 40rem) {
    .carousel__container[data-layout-cols] .carousel__slide { flex-basis: 50%; }
}
@container (max-width: 24rem) {
    .carousel__container[data-layout-cols] .carousel__slide { flex-basis: 80%; }
}

/* Arrows */
.carousel__controls {
    position: absolute;
    inset: 0;
    pointer-events: none;
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0 var(--space-2);
}
.carousel__buttons {
    display: contents;
}
.carousel__button {
    pointer-events: auto;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 50%;
    border: 0;
    /* Themable surface (light-dark): wit in light, donker in dark.
       Voorheen rgba(255,255,255,.9) = spierwit in dark-mode. */
    background: color-mix(in srgb, var(--color-bg-elev) 90%, transparent);
    color: var(--color-fg);
    cursor: pointer;
    display: grid;
    place-items: center;
    box-shadow: var(--shadow-1);
    transition: transform .15s ease, opacity .15s ease;
}
.carousel__button:hover { transform: scale(1.05); }
.carousel__button:disabled { opacity: .4; cursor: default; }

/* Chevron via mask + currentColor — geen extra SVG-files nodig */
.carousel__button::before {
    content: '';
    width: 1rem;
    height: 1rem;
    background-color: currentColor;
    mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9 6l6 6-6 6" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>');
    mask-repeat: no-repeat;
    mask-position: center;
    mask-size: contain;
}
.carousel__prev::before { transform: rotate(180deg); }

/* Dots */
.carousel__dots {
    display: flex;
    justify-content: center;
    gap: var(--space-2);
    padding: var(--space-3) 0 0;
}
.carousel__dot {
    width: .6rem;
    height: .6rem;
    border-radius: 50%;
    border: 0;
    background: var(--color-border);
    cursor: pointer;
    padding: 0;
    transition: transform .15s ease, background .15s ease;
}
.carousel__dot > span { position: absolute; left: -9999px; }
.carousel__dot:hover { transform: scale(1.2); }
.carousel__dot--selected {
    background: var(--color-primary);
    transform: scale(1.3);
}

/* Fade-effect: opacity-transition i.p.v. slide-translate (Embla fade plugin) */
.carousel--fade .carousel__container > .carousel__slide {
    position: relative;
}

/* Alles past in beeld (≤1 scroll-positie): niets te schuiven, dus geen
   navigatie tonen. De wrapper zet de class op basis van Embla's snap-lijst. */
.carousel--static .carousel__dots,
.carousel--static .carousel__buttons {
    display: none;
}

/* ── Marquee-variant (transitionTimingFunction: linear) ──────────────────────
   Doorlopende, vloeiende band i.p.v. Embla's discrete slides. De renderer
   dupliceert de items; de -50%-loop is daardoor naadloos. Duur via
   `--marquee-duration` (uit het CMS-veld "Snelheid"). Pauzeert bij hover en
   respecteert prefers-reduced-motion. */
.strip {
    overflow: hidden;
    width: 100%;
}
.strip__track {
    display: flex;
    width: max-content;
    will-change: transform;
    animation: strip-marquee var(--marquee-duration, 40s) linear infinite;
}
.strip__track > .carousel__slide {
    flex: 0 0 auto;
    /* Strakke, vaste box; de foto vult 'm vol (geen witte kaart-chrome). Uniforme
       rechter-marge zodat de -50%-loop naadloos blijft. */
    width: clamp(240px, 30vw, 360px);
    height: clamp(180px, 24vw, 260px);
    margin-right: var(--space-3, 16px);
}
/* Kaart-chrome (cream-achtergrond, shadow, radius) weg in de band: alleen de foto. */
.strip .card,
.strip .card__content,
.strip .card__link,
.strip .card__media {
    height: 100%;
    background: none;
    box-shadow: none;
    aspect-ratio: auto;
}
/* Ronde hoeken op de box die het beeld clipt (card__content heeft overflow:hidden). */
.strip .card__content {
    border-radius: var(--bl-radius, 12px);
    overflow: hidden;
}
.strip .card__media,
.strip .media__viewport { overflow: hidden; height: 100%; }
.strip .card__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    aspect-ratio: auto;
    border-radius: 0;
}
@keyframes strip-marquee {
    from { transform: translateX(0); }
    to   { transform: translateX(-50%); }
}
.strip:hover .strip__track {
    animation-play-state: paused;
}
@media (prefers-reduced-motion: reduce) {
    .strip__track { animation: none; }
}

/* In de doorlopende band geen kaart-hover (lift/shadow) — dat oogt raar terwijl
   de band scrollt. */
.strip .card--banner:hover,
.strip .card:not(.card--product):hover .card__content {
    transform: none;
    box-shadow: none;
}
