/* ============================================================
   OnDestination · cookiebanner v2 · toggles, twee lagen
   Voorbeeld-CSS bij patroon-cookiebanner-v2.html.
   In productie horen deze regels in de gedeelde stijl.
   Vereist: colors_and_type.css (tokens + fonts).
   ============================================================ */

/* ------------------------------------------------------------
   1 · DE TOGGLE · .od-toggle
   Echte input type="checkbox" met appearance:none. De knop is
   een background-image (radial-gradient) op de input zelf, geen
   kindelement, want ::before rendert niet op een input.
   ------------------------------------------------------------ */
.od-toggle{
  appearance:none;-webkit-appearance:none;margin:0;flex:none;
  width:38px;height:22px;min-width:38px;border-radius:999px;
  border:1.5px solid rgba(248,245,238,.34);
  background-color:rgba(255,255,255,.05);
  background-image:radial-gradient(circle at center,rgba(248,245,238,.72) 49%,transparent 50%);
  background-size:14px 14px;background-repeat:no-repeat;background-position:2.5px center;
  box-shadow:inset 0 1px 2px rgba(0,0,0,.4);
  cursor:pointer;
  transition:background-position 180ms cubic-bezier(.22,.61,.36,1),background-color 180ms cubic-bezier(.22,.61,.36,1),border-color 180ms cubic-bezier(.22,.61,.36,1),box-shadow 180ms cubic-bezier(.22,.61,.36,1);
}
.od-toggle:hover{border-color:rgba(248,245,238,.6);background-color:rgba(255,255,255,.09)}
.od-toggle:checked{
  background-color:var(--od-green,#6FE000);border-color:var(--od-green,#6FE000);
  background-image:radial-gradient(circle at center,#000 49%,transparent 50%);
  background-position:calc(100% - 2.5px) center;
  box-shadow:none;
}
.od-toggle:checked:hover{background-color:var(--od-green-bright,#8BFF1F);border-color:var(--od-green-bright,#8BFF1F)}
.od-toggle:focus-visible,.od-toggle.demo-focus{outline:none;border-color:var(--od-green,#6FE000);box-shadow:0 0 0 3px rgba(111,224,0,.26)}
.od-toggle:checked:focus-visible,.od-toggle:checked.demo-focus{box-shadow:0 0 0 3px rgba(111,224,0,.32)}
.od-toggle:user-invalid,.od-toggle.is-invalid{border-color:#E04848;background-color:rgba(224,72,72,.12);box-shadow:0 0 0 3px rgba(224,72,72,.18)}

/* Vast aan · geen tekstlabel, geen grijs. Verzadigd dieper groen met
   zwarte knop rechts: onmiskenbaar aan, en zichtbaar geen deelnemer
   aan de keuze. Nooit de :disabled-tint · die leest als kapot. */
.od-toggle.od-toggle--locked,
.od-toggle.od-toggle--locked:disabled,
.od-toggle.od-toggle--locked:disabled:checked{
  cursor:default;
  background-color:var(--od-green-deep,#3F8A00);
  border-color:var(--od-green-deep,#3F8A00);
  background-image:radial-gradient(circle at center,#000 49%,transparent 50%);
  background-position:calc(100% - 2.5px) center;
  box-shadow:none;
}
.od-toggle:disabled{cursor:not-allowed;border-color:rgba(248,245,238,.14);background-color:rgba(255,255,255,.02);box-shadow:none}

/* lichte ondergrond · voor beige en witte secties */
[data-od-surface="paper"] .od-toggle{border-color:rgba(0,0,0,.28);background-color:#fff;background-image:radial-gradient(circle at center,rgba(0,0,0,.4) 49%,transparent 50%);box-shadow:inset 0 1px 2px rgba(0,0,0,.09)}
[data-od-surface="paper"] .od-toggle:hover{border-color:rgba(0,0,0,.5)}
[data-od-surface="paper"] .od-toggle:checked{background-color:var(--od-green,#6FE000);border-color:var(--od-green-deep,#3F8A00);background-image:radial-gradient(circle at center,#000 49%,transparent 50%)}
[data-od-surface="paper"] .od-toggle.od-toggle--locked:disabled:checked{background-color:var(--od-green-deep,#3F8A00);border-color:var(--od-green-deep,#3F8A00)}

/* ------------------------------------------------------------
   2 · DE BANNER · .od-cb · stiller dan v1
   Smaller, lagere schaduw, kleinere kop, en in de eerste laag
   alleen kop, één alinea en drie knoppen.
   ------------------------------------------------------------ */
.od-cb,.od-cb *{box-sizing:border-box}
.od-cb{
  /* 524px = 466px voor de drie pillen naast elkaar (NL is de langste:
     141 + 156 + 149 + 2x10 gap) + 42px padding + 2px rand. Smaller en de
     rij breekt in tweeën, ook op 1440. */
  position:fixed;left:20px;right:20px;bottom:20px;z-index:9000;max-width:524px;
  background:#0E0E0E;border:1px solid rgba(255,255,255,.1);border-radius:13px;
  padding:19px 21px;box-shadow:0 10px 34px rgba(0,0,0,.42);
  color:var(--od-cream,#F8F5EE);font-family:'Luxe Uno',system-ui,sans-serif;
  animation:odCbIn .4s var(--od-ease,cubic-bezier(.22,.61,.36,1));
}
@keyframes odCbIn{from{opacity:0;transform:translateY(10px)}}
@media (prefers-reduced-motion:reduce){.od-cb{animation:none}}
/* ⚠️ `.od .od-cb-h` EN NIET `.od-cb-h` · SPECIFICITEITSREPARATIE, geen
   ontwerpwijziging: de voorgeschreven waarden stonden er al en werden alleen
   niet toegepast. `colors_and_type.css` r272 draagt `.od h2, .od .od-h2`
   (0,1,1) en die verslaat `.od-cb-h` (0,1,0), dus de kop rendeerde
   `--od-t-h2` = 40px met regelhoogte 1.15 en gewicht 400 in plaats van de
   voorgeschreven 14px/700, en marge `--od-s-3` = 12px in plaats van 7px.
   Gemeten op de LIVE site, op alle 316 pagina's · body draagt overal
   `class="od"`. Het klopt sluitend: 46 + 12 + 40 + 16 + 44 + 38 + 2 = 198,
   exact de gemeten bannerhoogte.
   `.od .od-cb-h` is (0,2,0) en wint dus, zonder `!important`.
   ⚠️ DE VORM IS GESPIEGELD, NIET BEDACHT: CLAUDE.md schrijft over de
   `.od p`-reparatie van 2026-07-28 dat de resterende componenten "wel de
   `.od`-prefix per component" vragen, en de kaartjes-fix van dezelfde dag
   deed "vier selectors met `.od` geprefixt". Die descendant-vorm staat
   vandaag in colors_and_type.css, gelegenheden.css en home.css.
   ⚠️ WAT HIJ NIET HERSTELT, en dat is bewust: `font-family` en
   `line-height` staan NIET in deze regel, dus die blijven van `.od h2`
   komen (de display-letter, regelhoogte 1.15). Ze toevoegen zou een
   ontwerpwijziging zijn en niet een reparatie. */
.od .od-cb-h{margin:0 0 7px;font-size:14px;font-weight:700;letter-spacing:-.01em;color:var(--od-cream,#F8F5EE)}
.od-cb-p{margin:0 0 15px;font-size:12.5px;line-height:1.6;color:rgba(248,245,238,.55)}
.od-cb-p a{color:var(--od-green,#6FE000);text-decoration:underline;text-underline-offset:2px}

/* ------------------------------------------------------------
   3 · KNOPRIJ + TWEEDE LAAG
   De <details> is het derde item in de knoprij: <summary> is de
   pil "Keuzes aanpassen". Open pakt hij de volle breedte, zodat
   het paneel eronder komt in plaats van naast de knoppen.
   GEEN order-eigenschappen: de bronvolgorde IS de beeldvolgorde,
   zodat Tab dezelfde weg loopt als het oog (WCAG 2.4.3).
   ------------------------------------------------------------ */
.od-cb-row{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-start}
.od-cb-row button{cursor:pointer;border-radius:999px;font-size:13px;font-weight:700;white-space:nowrap;padding:11px 20px;border:1px solid transparent;font-family:inherit;transition:filter 160ms,background 160ms}
.od-cb-row button:focus-visible{outline:2px solid var(--od-green,#6FE000);outline-offset:2px}
/* varianten zwaarder dan de basisregel: anders wint border:…transparent */
.od-cb-row button.od-cb-accept{background:var(--od-green,#6FE000);color:#000}
.od-cb-row button.od-cb-accept:hover{filter:brightness(1.08)}
.od-cb-row button.od-cb-min{background:transparent;color:var(--od-cream,#F8F5EE);border-color:rgba(255,255,255,.22)}
.od-cb-row button.od-cb-min:hover{background:rgba(255,255,255,.07)}
.od-cb-row button.od-cb-save{background:transparent;color:var(--od-cream,#F8F5EE);border-color:rgba(255,255,255,.22)}
.od-cb-row button.od-cb-save:hover{background:rgba(255,255,255,.07)}

.od-cb-more{flex:0 0 auto;display:flex;flex-direction:column;align-items:flex-start;min-width:0}
.od-cb-more[open]{flex:1 1 100%}
.od-cb-adjust{
  list-style:none;cursor:pointer;display:inline-block;
  border-radius:999px;font-size:13px;font-weight:700;white-space:nowrap;
  padding:11px 20px;border:1px solid rgba(255,255,255,.22);
  background:transparent;color:var(--od-cream,#F8F5EE);
  transition:background 160ms,border-color 160ms;
}
.od-cb-adjust::-webkit-details-marker{display:none}
.od-cb-adjust::marker{content:''}
.od-cb-adjust:hover{background:rgba(255,255,255,.07)}
.od-cb-adjust:focus-visible{outline:2px solid var(--od-green,#6FE000);outline-offset:2px}
.od-cb-more[open] .od-cb-adjust{background:rgba(255,255,255,.07);border-color:rgba(255,255,255,.34)}

.od-cb-panel{width:100%;margin:13px 0 0}
.od-cb-cats{display:flex;flex-direction:column;padding:0 14px;margin:0 0 14px;border:1px solid rgba(255,255,255,.09);border-radius:11px;background:rgba(255,255,255,.02)}
.od-cb-cat{display:grid;grid-template-columns:1fr 38px;column-gap:14px;row-gap:3px;align-items:center;padding:11px 0;min-height:44px;cursor:pointer}
.od-cb-cat+.od-cb-cat{border-top:1px solid rgba(255,255,255,.07)}
.od-cb-cat.is-locked{cursor:default}
.od-cb-cat-t{grid-column:1;grid-row:1;font-size:13px;font-weight:700;line-height:1.3;color:var(--od-cream,#F8F5EE)}
.od-cb-cat-d{grid-column:1;grid-row:2;font-size:12px;font-weight:400;line-height:1.5;color:rgba(248,245,238,.48)}
.od-cb-cat .od-toggle{grid-column:2;grid-row:1/span 2;justify-self:end;align-self:center}

@media (max-width:560px){.od-cb{left:12px;right:12px;bottom:12px;padding:17px;max-width:none;max-height:calc(100dvh - 24px);overflow-y:auto}}
@media (max-width:360px){.od-cb{left:10px;right:10px;bottom:10px;padding:15px 13px}.od-cb-cats{padding:0 12px}}

/* ------------------------------------------------------------
   3b · DE HAAK · een vast element trekt zich terug zolang de banner
   staat. `cookie-banner.js` zet `data-od-cb` op <html> op het moment
   dat hij de banner onthult, en haalt het weg op het moment dat hij
   hem uit de DOM verwijdert.

   ⚠️ DE SELECTOR IS EEN CONVENTIE EN GEEN LIJST. Elke <a> of <button>
   met "sticky" in zijn klassenaam gaat mee, zodat een DERDE vaste knop
   dit ERFT zonder dat hier een regel bij hoeft. Gemeten 2026-08-15:
   in de hele webroot dragen precies twee klassetokens dat woord
   (br-sticky-cta en sticky-offerte), in de js-bestanden nul, en de
   CSS kent er precies twee selectordelen mee. De conventie is dus
   vandaag exact en niet bij benadering.

   ⚠️ BEPERKT TOT <a> EN <button>, zodat een toekomstige
   `div.sticky-header` er per constructie buiten valt. Een kale
   [class*="sticky"] zou die meenemen en de koptekst laten verdwijnen.

   ⚠️ visibility EN NIET pointer-events. Alleen visibility haalt de knop
   ook uit de TABVOLGORDE. Een onzichtbare knop die je met Tab kunt
   bereiken is een val, geen knop.

   SPECIFICITEIT (0,2,2) verslaat `.br-sticky-cta.is-visible` (0,2,0)
   en `a.sticky-offerte.is-visible` (0,2,1), dus zonder !important.
   ------------------------------------------------------------ */
html[data-od-cb] a[class*="sticky"],
html[data-od-cb] button[class*="sticky"]{visibility:hidden}


/* ------------------------------------------------------------
   4 · /cookieverklaring · toggles meteen zichtbaar, geen details
   ------------------------------------------------------------ */
.ck-panel .od-cb-cats{margin-bottom:0}
.ck-panel .od-cb-cat-t{font-size:14px}
.ck-panel .od-cb-cat-d{font-size:13px}
.ck-state{font-size:12.5px;line-height:1.6;color:rgba(248,245,238,.42);margin:14px 0 18px}
.ck-state b{color:var(--od-cream,#F8F5EE);font-weight:600}

/* ------------------------------------------------------------
   5 · FORMULIERCONTEXT · zelfde toggle in contact / offerte / boeking
   ------------------------------------------------------------ */
.od-consent{display:flex;flex-direction:column;gap:2px;margin-top:20px}
.od-consent-row{display:grid;grid-template-columns:1fr 38px;column-gap:14px;align-items:center;padding:11px 0;min-height:44px;cursor:pointer}
.od-consent-text{font-size:14px;line-height:1.55;color:rgba(248,245,238,.72)}
.od-consent-text a{color:var(--od-green,#6FE000)}
.od-consent-err{display:none;font-size:12.5px;color:#F09A9A;margin:0 0 6px;line-height:1.45}
.od-consent-row.is-invalid+.od-consent-err,.od-consent-row:has(.od-toggle:user-invalid)+.od-consent-err{display:block}
.od-consent-row.is-invalid .od-consent-text{color:#F4C4C4}
[data-od-surface="paper"] .od-consent-text{color:#2A2A2A}
[data-od-surface="paper"] .od-consent-text a{color:var(--od-green-deep,#3F8A00)}

/* paginaskelet · alleen voor de voorbeeldpagina's */
.demo-page{margin:0;background:#000;height:100vh;overflow:hidden;font-family:'Luxe Uno',system-ui,sans-serif}
.skel-nav{position:absolute;top:0;left:0;right:0;height:58px;border-bottom:1px solid rgba(255,255,255,.07);display:flex;align-items:center;gap:26px;padding:0 clamp(16px,4vw,40px)}
.skel-logo{width:clamp(72px,16vw,104px);height:15px;border-radius:3px;background:rgba(111,224,0,.4);flex:0 0 auto}
.skel-nav i{width:56px;height:8px;border-radius:99px;background:rgba(255,255,255,.11);flex:0 0 auto}
.skel-body{position:absolute;left:clamp(16px,4vw,40px);top:112px;right:clamp(16px,4vw,40px);display:flex;flex-direction:column;gap:14px}
.skel-h{width:min(56%,520px);height:clamp(28px,5vw,44px);border-radius:6px;background:rgba(255,255,255,.13)}
.skel-h2{width:min(38%,340px);height:clamp(28px,5vw,44px);border-radius:6px;background:rgba(255,255,255,.09)}
.skel-p{width:min(44%,420px);height:9px;border-radius:99px;background:rgba(255,255,255,.07);margin-top:12px}
.skel-p2{width:min(36%,340px);height:9px;border-radius:99px;background:rgba(255,255,255,.07)}
.demo-dots{position:fixed;inset:0;background-image:radial-gradient(circle at 1px 1px,rgba(255,255,255,.055) 1px,transparent 0);background-size:18px 18px;pointer-events:none}

/* ============================================================
   E6 · DE OPSLAANKNOP BLIJFT IN BEELD OP EEN LAGE VIEWPORT
   ------------------------------------------------------------
   GEMETEN op de ECHT GEBAKKEN pagina, uitgeklapt, op 568px hoog.
   ⚠️ NIET op de demopagina uit de bouwset: daar is het vaste deel
   358 en hier 443, want de echte pagina laadt meer stylesheets. Een
   plafond dat op de demo is afgeleid laat de opslaanknop op de echte
   pagina alsnog buiten beeld vallen (gemeten y=587 tegen 558).
   het VASTE deel van de banner (alles behalve de categorielijst)
   is 311 tot 443px, afhankelijk van de taal en van hoeveel
   regels de knoprij nodig heeft. Het zwaarste geval is NL op
   320px breed: drie knoprijen, vast deel 443, natuurlijke
   hoogte 717 tegen een max-height van 544. Daar viel "Keuze
   opslaan" buiten het formulier (top 590, formulier tot 558) en
   was er geen enkele aanwijzing dat er te scrollen viel.

   DE VORM · alleen de categorielijst krijgt een plafond en
   scrolt. De opslaanknop staat eronder in de normale stroom en
   is daarmee altijd zichtbaar. Er gaat GEEN inhoud weg: alle
   drie de categorieen houden hun titel en hun hele beschrijving.

   HET GETAL · 382 = 24 (de bestaande calc(100dvh - 24px) van de
   banner zelf) + 443 (het zwaarste vaste deel). Daarmee past het
   geheel per constructie, ook in het zwaarste geval.

   ⚠️ GESCOPED OP HOOGTE EN NIET OP BREEDTE. Het gebrek is een
   lage viewport, geen smalle: op 390x844 past hij gewoon. En een
   breedte-breekpunt zou op het kantelpunt van de knoprij moeten
   liggen, en dat kantelpunt is gemeten TEKSTafhankelijk (NL 533,
   EN 451) · dus geen betrouwbare grens.

   ⚠️ BEWUST GEEN FLEXKETEN. Die is geprobeerd en werkt niet op
   320: de knoprij wikkelt daar naar drie regels, en een flexregel
   krimpt in de kruisas niet onder zijn inhoud. Gemeten bleef de
   lijst daar op 274px staan terwijl hij op 360 en 390 wel kromp.
   Een vorm die alleen werkt zolang de knoppen op twee regels
   passen, is geen vorm.
   ============================================================ */
@media (max-height: 700px) {
  .od-cb-cats {
    max-height: calc(100dvh - 467px);
    overflow-y: auto;
    /* SCROLL-AANWIJZING zonder JavaScript: de twee dekkers zitten
       vast aan de container (scroll) en de twee schaduwen aan de
       inhoud (local), dus de schaduw verdwijnt precies aan het
       begin en aan het eind van de lijst. */
    background-image:
      linear-gradient(to bottom, #121212, rgba(18,18,18,0)),
      linear-gradient(to top,    #121212, rgba(18,18,18,0)),
      linear-gradient(to bottom, rgba(0,0,0,.5), rgba(0,0,0,0)),
      linear-gradient(to top,    rgba(0,0,0,.5), rgba(0,0,0,0));
    background-position: 0 0, 0 100%, 0 0, 0 100%;
    background-repeat: no-repeat;
    background-size: 100% 10px, 100% 10px, 100% 12px, 100% 12px;
    background-attachment: scroll, scroll, local, local;
  }
}
