/* ==========================================================================
   CHÂTEAU DE BRAFFE — design system
   Extracted from: BRAFFE-Webdesign-V8-Feedbackaanpassingen-Klant.xd
   Design canvas: 1920 px wide · content column 1640 px (140 px side margins)
   XD grid: 12 columns · 16 px gutter

   HOW TO USE
   1. Paste this into Appearance ▸ Customize ▸ Additional CSS,
      or better: a child-theme style.css (Additional CSS has no media-query
      ordering problems, but a child theme is easier to version).
   2. Add the class names to the "Extra class name" field of any WPBakery
      element, or inline in a Text Block: <span class="br-blue">…</span>
   3. Every size is FLUID: it scales from the 1920 design value down to a
      readable mobile value between 480 px and 1920 px viewport.
      No media queries needed for typography.

   NAMING: everything is prefixed br- on purpose. Bare names like .big,
   .white, .small collide with theme and plugin CSS in WordPress more often
   than you'd think.
   ========================================================================== */


/* ==========================================================================
   FONTS
   --------------------------------------------------------------------------
   The design uses 5 families. Three of them are COMMERCIAL and are NOT
   free webfonts — you need a webfont licence before this site goes live:

     · Calluna          (serif)        — commercial, exljbris
     · Calluna Sans     (sans, body)   — commercial, exljbris
     · Dulcinea         (script/logo)  — commercial

   Two are free via Google Fonts:

     · Spectral         (serif headings)
     · Nanum Myeongjo   (used only for the decorative “ quote mark)
   ========================================================================== */


/* ==========================================================================
   TOKENS
   ========================================================================== */
:root{

  /* ---- Families ------------------------------------------------------- */
  --br-sans:    calluna-sans, sans-serif;
  --br-serif:   "calluna", serif;
  --br-display: spectral, sans-serif;
  --br-script:  "dulcinea", sans-serif;
  --br-quote:   "Nanum Myeongjo", serif;

  /* ---- Colours (every colour actually present in the XD) -------------- */
  --br-ink:      #272727;  /* body text, dark UI — the real "black" */
  --br-white:    #FFFFFF;
  --br-blue:     #648CA7;  /* the accent. Buttons, quote marks, the wide band */
  --br-brown:    #361F0B;  /* logo / crest / ornament vectors only            */
  --br-cream:    #F5F4EE;  /* the main alternating section background          */
  --br-offwhite: #FAF7F4;  /* text on the dark CTA band                       */
  --br-grey:     #6E6E6E;  /* "FORMULE 1" style labels                        */

  /* Two near-duplicates of the blue slipped into the file (#658CA8, #638DA7).
     They are rounding noise from the designer — use --br-blue everywhere. */

  /* ---- Layout --------------------------------------------------------- */
  --br-content: 1640px;    /* 1920 canvas − 2×140 margin */
  --br-gutter:  16px;      /* XD grid gutter */
  --br-side:    clamp(20px, 7.29vw, 140px);

  /* ---- Fluid type scale -----------------------------------------------
     Formula: clamp(MIN, MIN + (MAX−MIN)·(100vw−480px)/1440, MAX)
     MAX = the literal px value from the XD file at 1920.
     MIN = a hand-picked mobile value (headings compress harder than body).
     --------------------------------------------------------------------- */
  --br-fs-13:  clamp(11px,  calc(11px +  2 * ((100vw - 480px) / 1440)),  13px);
  --br-fs-16:  clamp(14px,  calc(14px +  2 * ((100vw - 480px) / 1440)),  16px);
  --br-fs-18:  clamp(15px,  calc(15px +  3 * ((100vw - 480px) / 1440)),  18px);
  --br-fs-20:  clamp(16px,  calc(16px +  4 * ((100vw - 480px) / 1440)),  20px);
  --br-fs-22:  clamp(17px,  calc(17px +  5 * ((100vw - 480px) / 1440)),  22px);
  --br-fs-25:  clamp(19px,  calc(19px +  6 * ((100vw - 480px) / 1440)),  25px);
  --br-fs-28:  clamp(21px,  calc(21px +  7 * ((100vw - 480px) / 1440)),  28px);
  --br-fs-35:  clamp(25px,  calc(25px + 10 * ((100vw - 480px) / 1440)),  35px);
  --br-fs-40:  clamp(27px,  calc(27px + 13 * ((100vw - 480px) / 1440)),  40px);
  --br-fs-45:  clamp(29px,  calc(29px + 16 * ((100vw - 480px) / 1440)),  45px);
  --br-fs-50:  clamp(31px,  calc(31px + 19 * ((100vw - 480px) / 1440)),  50px);
  --br-fs-60:  clamp(35px,  calc(35px + 25 * ((100vw - 480px) / 1440)),  60px);
  --br-fs-64:  clamp(37px,  calc(37px + 27 * ((100vw - 480px) / 1440)),  64px);
  --br-fs-76:  clamp(42px,  calc(42px + 34 * ((100vw - 480px) / 1440)),  76px);
  --br-fs-100: clamp(56px,  calc(56px + 44 * ((100vw - 480px) / 1440)), 100px);
  --br-fs-115: clamp(60px,  calc(60px + 55 * ((100vw - 480px) / 1440)), 115px);

  /* ---- Letter-spacing (XD stores 1/1000 em) --------------------------- */
  --br-ls-tight:  -0.02em;  /* XD −20 */
  --br-ls-normal:  0;
  --br-ls-wide:    0.02em;  /* XD  20 */
  --br-ls-wider:   0.03em;  /* XD  30 — used on every button label          */
  --br-ls-widest:  0.036em; /* XD  36 — the small distances strip in hero   */
}


/* ==========================================================================
   BASE — body copy default
   Apply .br to a page wrapper, or drop the selector list into your theme.
   ========================================================================== */
.br,
.br-default{
  font-family: var(--br-sans);
  font-weight: 400;
  font-size:   var(--br-fs-22);
  line-height: 1.27;               /* 28/22 — the dominant body setting */
  letter-spacing: var(--br-ls-wide);
  color: var(--br-ink);
}


/* ==========================================================================
   TYPE SCALE — size only (combine freely with family + colour classes)
   ========================================================================== */
.br-fs-13 { font-size: var(--br-fs-13); }
.br-fs-16 { font-size: var(--br-fs-16); }
.br-fs-18 { font-size: var(--br-fs-18); }
.br-fs-20 { font-size: var(--br-fs-20); }
.br-fs-22 { font-size: var(--br-fs-22); }
.br-fs-25 { font-size: var(--br-fs-25); }
.br-fs-28 { font-size: var(--br-fs-28); }
.br-fs-35 { font-size: var(--br-fs-35); }
.br-fs-40 { font-size: var(--br-fs-40); }
.br-fs-45 { font-size: var(--br-fs-45); }
.br-fs-50 { font-size: var(--br-fs-50); }
.br-fs-60 { font-size: var(--br-fs-60); }
.br-fs-64 { font-size: var(--br-fs-64); }
.br-fs-76 { font-size: var(--br-fs-76); }
.br-fs-100{ font-size: var(--br-fs-100); }
.br-fs-115{ font-size: var(--br-fs-115); }

.w-50 {width: 50%;}
.w-80 {width: 80%;}
.w-90 {width: 90%;}

/* Friendly aliases for the four you'll type most */
.br-small { font-size: var(--br-fs-18); line-height: 1.39; }
.br-body  { font-size: var(--br-fs-22); line-height: 1.27; }
.br-lead  { font-size: var(--br-fs-28); line-height: 1.5;  }
.br-big   { font-size: var(--br-fs-40); line-height: 1.33; }


/* ==========================================================================
   FAMILIES & WEIGHTS
   ========================================================================== */
.br-sans    { font-family: var(--br-sans);}
.br-serif   { font-family: var(--br-serif);}
.br-display { font-family: var(--br-display);}
.br-script  { font-family: var(--br-script);}

.br-light    { font-weight: 300; }
.br-regular  { font-weight: 400; }
.br-semibold { font-weight: 600; }
.br-bold     { font-weight: 700; }
.br-italic   { font-style: italic; }


/* ==========================================================================
    COLOUR
   ========================================================================== */
.br-white    { color: var(--br-white)    !important; }
.br-ink      { color: var(--br-ink)      !important; }
.br-blue     { color: var(--br-blue)     !important; }
.br-brown    { color: var(--br-brown)    !important; }
.br-grey     { color: var(--br-grey)     !important; }
.br-offwhite { color: var(--br-offwhite) !important; }

.br-bg-white    { background-color: var(--br-white); }
.br-bg-cream    { background-color: var(--br-cream); }
.br-bg-blue     { background-color: var(--br-blue);  color: var(--br-white); }
.br-bg-ink      { background-color: var(--br-ink);   color: var(--br-white); }
.br-bg-brown    { background-color: var(--br-brown); color: var(--br-offwhite); }

/* Hero image scrim — the XD uses a black→transparent gradient over photos */
.br-scrim{ position: relative; }
.br-scrim::after{
  content:""; position:absolute; inset:0; pointer-events:none;
  background: linear-gradient(180deg, rgba(0,0,0,.45) 0%, rgba(0,0,0,0) 45%,
                                      rgba(0,0,0,0) 60%, rgba(0,0,0,.55) 100%);
}
.br-scrim > *{ position: relative; z-index: 1; }


/* ==========================================================================
   THE ACTUAL STYLES FROM THE FILE
   These are ready-made combinations — one class instead of four.
   ========================================================================== */

/* --- Headings ---------------------------------------------------------- */

/* Section title. Spectral Light 45/52. The most-used heading in the design. */
.br-h2{
  font-family: var(--br-display);
  font-weight: 500;
  font-size: var(--br-fs-45);
  line-height: 1.16;
  letter-spacing: 0;
  color: var(--br-ink);
  margin: 0 0 .5em;
}

/* Hero title over a photo. Spectral ExtraLight 50, white. */
.br-h1-hero{
  font-family: var(--br-display);
  font-weight: 200;
  font-size: var(--br-fs-50);
  line-height: 1.1;
  color: var(--br-white);
  margin: 0;
}

/* Card / partner title. Spectral SemiBold 35. */
.br-h3{
  font-family: var(--br-display);
  font-weight: 600;
  font-size: var(--br-fs-35);
  line-height: 1.35;
  color: var(--br-ink);
  margin: 0 0 .4em;
}

/* CTA band headline. Spectral Regular 50 on the dark band. */
.br-h2-cta{
  font-family: var(--br-display);
  font-weight: 400;
  font-size: var(--br-fs-50);
  line-height: 1.2;
  color: var(--br-offwhite);
  margin: 0 0 .6em;
}

/* Timeline year heading (Historiek). Calluna Sans Regular 40/52. */
.br-h-year{
  font-family: var(--br-sans);
  font-weight: 400;
  font-size: var(--br-fs-40);
  line-height: 1.3;
  color: var(--br-ink);
  margin: 0 0 .3em;
}

/* Big pull statement. Calluna Sans 40/53, −0.02em. */
.br-statement{
  font-family: var(--br-sans);
  font-weight: 400;
  font-size: var(--br-fs-40);
  line-height: 1.33;
  letter-spacing: var(--br-ls-tight);
  color: var(--br-ink);
}

/* Script statement, e.g. "Maak uw evenement onvergetelijk." Dulcinea 76. */
.br-script-lg{
  font-family: var(--br-script);
  font-size: var(--br-fs-76);
  line-height: 1.05;
  color: var(--br-ink);
}

.br-overlay-bg-hero{
  --br-hero-band-top:    50%;
  --br-hero-band-bottom: 50%;
  --br-hero-overlay:     .64;
  position: relative;
  isolation: isolate;
  background-size: cover;
  background-position: center;
}

.br-overlay-bg-hero::before{
  content: "";
  display: block;
  position: absolute; inset: 0; z-index: 1;
  pointer-events: none;
  opacity: var(--br-hero-overlay);
  mix-blend-mode: multiply;
  background:
    linear-gradient(to top,
      rgba(0,0,0,0) -9.79%, rgba(96,83,71,.486) 76.97%, rgba(0,0,0,1) 103.55%)
      top / 100% var(--br-hero-band-top) no-repeat,
    linear-gradient(to bottom,
      rgba(0,0,0,0) -9.79%, rgba(96,83,71,.486) 76.97%, rgba(0,0,0,1) 103.55%)
      bottom / 100% var(--br-hero-band-bottom) no-repeat;
}

/* WPBakery hides both pseudo-elements on a flex row:
 *     .vc_row.vc_row-flex:after,.vc_row.vc_row-flex:before{display:none}
 * That is (0,2,1) and beats a single class, so on any row with "Equal
 * height" or a content-alignment option — both of which add vc_row-flex —
 * the overlay was computed correctly and then never painted.
 * The doubled class below is (0,2,1) as well, and this file loads after
 * js_composer_front, so it wins the tie: no !important, and no WPBakery
 * class name of theirs that we would then have to keep in step with. */
.br-overlay-bg-hero.br-overlay-bg-hero::before{ display: block; }

.br-overlay-bg-hero > *{ position: relative; z-index: 2; }


/* --- Body ------------------------------------------------------------- */

/* Intro paragraph under a section title. Calluna Sans 22/28, +0.02em. */
.br-intro{
  font-family: var(--br-sans);
  font-size: var(--br-fs-22);
  line-height: 1.27;
  letter-spacing: var(--br-ls-wide);
  color: var(--br-ink);
}

/* Soft body — the lighter answer text in the FAQ. Calluna Sans Light 22/27. */
.br-body-light{
  font-family: var(--br-sans);
  font-weight: 300;
  font-size: var(--br-fs-22);
  line-height: 1.23;
  color: var(--br-ink);
}

/* Feature label next to an icon. Calluna Sans Semibold 22. */
.br-label{
  font-family: var(--br-sans);
  font-weight: 600;
  font-size: var(--br-fs-22);
  line-height: 1.14;
  color: var(--br-ink);
}

/* "FORMULE 1" small caps-ish label. Calluna Sans Light 20, grey. */
.br-eyebrow{
  font-family: var(--br-sans);
  font-weight: 300;
  font-size: var(--br-fs-20);
  line-height: 1.25;
  color: var(--br-grey);
  margin: 0 0 .4em;
}

/* Hero kicker above the headline. Calluna Sans 22 white, with the 67 px
   rule from the XD. This style appears 8× in the design — also as
   "Gelegenheden", "Iets bijzonders in gedachten?", "Historisch domein".
   NOTE: not .br-eyebrow — that name is the grey "FORMULE 1" label above. */
.br-hero-eyebrow{
  font-family: var(--br-sans);
  font-weight: 400;
  font-size: var(--br-fs-22);
  line-height: 1.2;
  color: var(--br-white);
  margin: 0 0 clamp(12px, 1.1vw, 22px);   /* gap down to the h1 */
}
.br-hero-eyebrow::after{
  content: "";
  display: block;
  width: clamp(44px, 3.5vw, 67px);
  height: 1px;
  background: currentColor;
  margin-top: clamp(5px, .45vw, 9px);     /* rule tucked up under the text */
}

/* Footer / legal. Calluna Sans 18/25. */
.br-fineprint{
  font-family: var(--br-sans);
  font-size: var(--br-fs-18);
  line-height: 1.39;
  color: var(--br-ink);
}

/* "Reactie binnen 48u" note. Calluna Sans Italic 18/24. */
.br-note{
  font-family: var(--br-sans);
  font-style: italic;
  font-size: var(--br-fs-18);
  line-height: 1.34;
  color: var(--br-ink);
}

/* Language switcher NL | FR | EN. 16 px, +0.03em; active state is Bold. */
.br-lang      { font-family: var(--br-sans); font-size: var(--br-fs-16);
                letter-spacing: var(--br-ls-wider); line-height: 1.75; }
.br-lang.is-active { font-weight: 700; }

/* Hero distances strip: "30' van Lille • 40' van Kortrijk • …" */
.br-distances{
  font-family: var(--br-sans);
  font-size: var(--br-fs-13);
  letter-spacing: var(--br-ls-widest);
  line-height: 2.66;
  color: var(--br-white);
}


/* --- Logo lockup ------------------------------------------------------
   "Château" in Calluna, "de Braffe" in Dulcinea underneath.
   Three sizes exist in the file: header (20/64), footer (16/60), hero (35/115).
   ---------------------------------------------------------------------- */
.br-logo       { display:inline-block; text-align:center; line-height:1; }
.br-logo__top  { display:block; font-family: var(--br-serif);
                 font-size: var(--br-fs-20); letter-spacing: var(--br-ls-wider); }
.br-logo__main { display:block; font-family: var(--br-script);
                 font-size: var(--br-fs-64); }

.br-logo--hero   .br-logo__top { font-size: var(--br-fs-35); }
.br-logo--hero   .br-logo__main{ font-size: var(--br-fs-115); }
.br-logo--footer .br-logo__top { font-size: var(--br-fs-16); }
.br-logo--footer .br-logo__main{ font-size: var(--br-fs-60); }


/* --- Testimonial ------------------------------------------------------- */
.br-quotemark{
  font-family: var(--br-quote);
  font-size: var(--br-fs-100);
  line-height: .8;
  color: var(--br-blue);
  display: block;
}
.br-testimonial{
  font-family: var(--br-sans);
  font-size: var(--br-fs-28);
  line-height: 1.33;
  letter-spacing: var(--br-ls-tight);
  color: var(--br-ink);
}
.br-attribution{
  font-family: var(--br-serif);
  font-size: var(--br-fs-22);
  line-height: 1.45;
  letter-spacing: var(--br-ls-wider);
  color: var(--br-blue);
}


/* ==========================================================================
   BUTTONS
   From the XD: 56 px tall, SQUARE corners (no radius), label = Calluna Sans
   22 with +0.03em. Three variants exist.
   Tip: use a WPBakery Text Block with <a class="br-btn"> rather than the
   native "Button" element — vc_btn ships ~30 kB of CSS you then fight.
   ========================================================================== */
.hero-btns .wpb_wrapper {
	display: flex;
	gap: .7rem;
}

.br-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 56px;
  padding: 0 clamp(12px, 2vw, 28px);
  font-family: var(--br-sans);
  font-size: var(--br-fs-18);
  line-height: 1.27;
  letter-spacing: var(--br-ls-wider);
  text-align: center;
  text-decoration: none;
  border: 1px solid transparent;
  border-radius: 0;
  cursor: pointer;
  transition: background-color .25s ease, color .25s ease, border-color .25s ease;
}

.br-btn:hover {
	text-decoration: none;
}

/* Hero button */
.br-btn--hero {
	color: var(--br-ink);
	background-color: var(--br-white);
}

.br-btn--hero:hover {
	color: var(--br-white);
	background-color: var(--br-ink);
}

/* Primary — solid blue, white label */
.br-btn--primary{
  background: var(--br-blue);
  color: var(--br-white);
  border-color: var(--br-blue);
}
.br-btn--primary:hover,
.br-btn--primary:focus-visible{
  background: transparent;
  color: var(--br-blue);
}

/* Ghost on photo — 1 px white outline, transparent */
.br-btn--ghost{
  background: transparent;
  color: var(--br-white);
  border-color: var(--br-white);
}
.br-btn--ghost:hover,
.br-btn--ghost:focus-visible{
  background: var(--br-white);
  color: var(--br-ink);
}

/* Ghost on light — 1 px dark outline, 48 px tall in the design */
.br-btn--outline{
  min-height: 48px;
  background: transparent;
  color: var(--br-ink);
  border-color: var(--br-ink);
}
.br-btn--outline:hover,
.br-btn--outline:focus-visible{
  background: var(--br-ink);
  color: var(--br-white);
}

/* The one rounded element in the whole file: a 45 px pill, radius 28 */
.br-pill{
  display: inline-flex; align-items: center;
  min-height: 45px; padding: 0 22px;
  border-radius: 28px;
  background: var(--br-blue);
  color: var(--br-white);
  font-family: var(--br-sans);
  font-size: var(--br-fs-20);
  letter-spacing: var(--br-ls-wider);
}

.br-btn:focus-visible,
.br-pill:focus-visible{ outline: 2px solid var(--br-blue); outline-offset: 3px; }


/* ==========================================================================
   LAYOUT HELPERS + WPBAKERY GLUE
   ========================================================================== */
.br-center,
.br-center .wpb_wrapper{
	display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
}

/* Content column matching the 1640 px design width. Put this class on the
   ROW (Extra class name) when the row is set to "Stretch row". */
.br-container > .vc_column_container,
.br-container{
  max-width: var(--br-content);
  margin-inline: auto;
}
.br-container{ padding-inline: var(--br-side); }

/* Full-bleed row that still keeps its text on the 1640 grid */
.br-row-full{ width: 100vw; margin-left: calc(50% - 50vw); }

/* Section rhythm — the design breathes at roughly 120 px between sections */
.br-section    { padding-block: clamp(48px, 6.25vw, 120px); }
.br-section-sm { padding-block: clamp(32px, 3.65vw,  70px); }

/* WPBakery resets that save time */
.br .wpb_text_column p:last-child,
.br-text p:last-child{ margin-bottom: 0; }
.br-text p + p{ margin-top: 1em; }

/* WPBakery's default column gutter is 30–35 px; the XD grid uses 16 px */
.br-gutter-16 > .vc_row{ margin-left: -8px; margin-right: -8px; }
.br-gutter-16 > .vc_row > .vc_column_container{ padding-left: 8px; padding-right: 8px; }

/* Equal-height columns without a plugin */
.br-eq > .vc_row{ display: flex; flex-wrap: wrap; }
.br-eq > .vc_row > .vc_column_container{ display: flex; }
.br-eq > .vc_row > .vc_column_container > .vc_column-inner{ width: 100%; }

/* --------------------------------------------------------------------------
   COLUMN GRID  —  lay a column's own elements out in 2, 3 or 4 across
   --------------------------------------------------------------------------
   WPBakery gives you rows and columns, and an inner row cannot be nested
   inside another inner row — so a column holding text, a button and four
   icon blocks has no way to put just the icons side by side.

   Put br-cols-2 (or -3 / -4) on the COLUMN's Extra class name. Its direct
   children become grid cells, and anything that is NOT an icon block spans
   the full width — so the paragraph and the button stay full-width above,
   and only the .br-it blocks pair up.

   The selector stops at the column's own wrapper on purpose: every WPBakery
   element contains a nested .wpb_wrapper of its own, and a descendant
   selector would turn those into grids too.
   -------------------------------------------------------------------------- */
.br-cols-2 > .vc_column-inner > .wpb_wrapper,
.br-cols-3 > .vc_column-inner > .wpb_wrapper,
.br-cols-4 > .vc_column-inner > .wpb_wrapper{
  display: grid;
  column-gap: clamp(24px, 3vw, 56px);
  row-gap: clamp(20px, 2.2vw, 40px);
  align-items: start;
}

.br-cols-2 > .vc_column-inner > .wpb_wrapper{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
.br-cols-3 > .vc_column-inner > .wpb_wrapper{ grid-template-columns: repeat(3, minmax(0, 1fr)); }
.br-cols-4 > .vc_column-inner > .wpb_wrapper{ grid-template-columns: repeat(4, minmax(0, 1fr)); }

/* Text blocks, buttons, headings — anything that isn't an icon block —
   keep the full width and their normal stacking. */
.br-cols-2 > .vc_column-inner > .wpb_wrapper > *:not(.br-it),
.br-cols-3 > .vc_column-inner > .wpb_wrapper > *:not(.br-it),
.br-cols-4 > .vc_column-inner > .wpb_wrapper > *:not(.br-it){ grid-column: 1 / -1; }

/* WPBakery elements carry their own bottom margin; the grid's row-gap is
   doing that job now. */
.br-cols-2 > .vc_column-inner > .wpb_wrapper > .br-it,
.br-cols-3 > .vc_column-inner > .wpb_wrapper > .br-it,
.br-cols-4 > .vc_column-inner > .wpb_wrapper > .br-it{ margin-bottom: 0; }

@media (max-width: 782px){
  .br-cols-2 > .vc_column-inner > .wpb_wrapper,
  .br-cols-3 > .vc_column-inner > .wpb_wrapper,
  .br-cols-4 > .vc_column-inner > .wpb_wrapper{ grid-template-columns: 1fr; }
}

/* Alignment + spacing utilities */
.br-tl{text-align:left}   .br-tc{text-align:center}  .br-tr{text-align:right}
.br-mt-0{margin-top:0}    .br-mb-0{margin-bottom:0}
.br-mb-1{margin-bottom:8px}   .br-mb-2{margin-bottom:16px}
.br-mb-3{margin-bottom:24px}  .br-mb-4{margin-bottom:40px}
.br-mb-5{margin-bottom:64px}
.br-maxw-720{max-width:720px}  .br-maxw-880{max-width:880px}
.br-maxw-720.br-tc, .br-maxw-880.br-tc{ margin-inline:auto; }


/* ==========================================================================
   MOBILE CORRECTIONS  →  moved
   --------------------------------------------------------------------------
   The whole mobile pass now lives at the BOTTOM of this file. A media query
   does not raise specificity, so it has to come after the rules it
   overrides — and half of what it overrides (the contact form, the address
   block, the CUSTOM CSS section) is written below this point.
   ========================================================================== */

/* ==========================================================================
   CONTACT FORM  (Contact Form 7)
   ========================================================================== */

/*.br-form-availability input[type="text"],
.br-form-availability input[type="email"],
.br-form-availability input[type="tel"],
.br-form-availability textarea {
  width: 100%;
  display: block;
  box-sizing: border-box;
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--br-ink);
  border-radius: 0;
  padding: 0 0 8px;
  font-family: var(--br-sans);
  font-size: var(--br-fs-18);
  line-height: 1.25;
  color: var(--br-ink);
  -webkit-appearance: none;
  appearance: none;
  transition: border-color .2s ease;
}

.br-form-availability .form-label,
.br-form-availability .wpcf7-list-item-label {
	font-family: var(--br-sans);
  font-size: var(--br-fs-18);
  line-height: 1.25;
  color: var(--br-ink);
}

.br-form-availability input::placeholder,
.br-form-availability textarea::placeholder,
.br-form-availability .form-label {
  color: var(--br-grey);
  opacity: 1;
}


.br-form-availability input:focus,
.br-form-availability textarea:focus{
  outline: 0;
  border-bottom-color: var(--br-blue);
  border-bottom-width: 2px;
	padding-bottom: 7px;
}

.br-form-availability input:focus,
.br-form-availability textarea:focus{
  outline: 0;
  border-bottom-color: var(--br-blue) !important;
  border-bottom-width: 2px;
  padding-bottom: 7px;
	background-color: var(--br-white) !important;
}

.br-form-availability textarea{
  min-height: clamp(160px, 13.6vw, 261px);
  resize: vertical;
}

.br-form-availability  .wpcf7-not-valid-tip {
	font-family: var(--br-sans);
  font-size: var(--br-fs-13);
  line-height: 1.25;
}

.br-form-availability input[type="submit"] {
	display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 56px;
  padding: 0 clamp(12px, 2vw, 28px);
  font-family: var(--br-sans);
  font-size: var(--br-fs-18) !important;
  line-height: 1.27 !important;
  letter-spacing: var(--br-ls-wider);
  text-align: center;
  text-decoration: none;
  border: 1px solid transparent !important;
  border-radius: 0 !important;
  cursor: pointer;
  transition: background-color .25s ease, color .25s ease, border-color .25s ease;
	background: var(--br-blue);
  color: var(--br-white);
  border-color: var(--br-blue);

}*/

/* Kill the yellow Chrome autofill wash, which destroys the underline look */
/*.br-form-availability input:-webkit-autofill,
.br-form-availability input:-webkit-autofill:hover,
.br-form-availability input:-webkit-autofill:focus{
  -webkit-text-fill-color: var(--br-ink);
  -webkit-box-shadow: 0 0 0 1000px #fff inset;
  transition: background-color 5000s ease-in-out 0s;
}*/


/* --------------------------------------------------------------------------
   SELECT · DATE · NUMBER
   --------------------------------------------------------------------------
   These three arrive from CF7 with the browser's native chrome and Betheme's
   default form styling on top: a full 1 px blue box, a white fill, 10–14 px
   padding, and three different fonts (calluna for the select, -apple-system
   for the date, Arial for the number). Nothing like the underline the rest of
   the form uses.

   FROM THE XD (Contactpagina, form card at x 18826 / y −5816):

       card            812 × 714, #F5F4EE, 1 px #707070 border
       card inset      69.2 px each side  →  content 673.6
       field           315 wide  (46.76% of content)
       gutter          43.6      ( 6.47% of content)
       row pitch       77 px between underlines, uniform
       underline       1 px #272727 — the SAME line as the text fields
       Type evenement  FULL width (one line, 673.3 long)
       Datum / Aantal  half width, side by side
       chevron         at the right end of the select's underline — the same
                       25 × 14 glyph as the FAQ accordion (Path 834, rotated
                       90°, x 19568.5 = the select line's right end)
       checkbox        22 × 22, white, 1 px #272727

   Measured after these rules, at 1600: every field 31 px tall on a 1 px ink
   underline, pitch 77 / 78 / 77 (design 77), gutter 6.38% (design 6.47),
   field width 46.81% (design 46.76).
   -------------------------------------------------------------------------- */

.br-form-availability{
  /* The two labels CSS has to supply, and how far the value is pushed clear
     of each. All four in one place — on the FR page override them together,
     and check the insets still clear the translated labels. */
  --br-label-date:   "Datum -";
  --br-label-aantal: "Aantal personen";
  --br-inset-date:   4.6em;    /* label measures 3.86em; the rest is slack */
  --br-inset-aantal: 7.9em;    /* label measures 7.10em                    */
}
/*
.br-form-availability select,
.br-form-availability input[type="date"],
.br-form-availability input[type="number"]{
  width: 100%;
  display: block;
  box-sizing: border-box;
  background-color: transparent;
  border: 0;
  border-bottom: 1px solid var(--br-ink);
  border-radius: 0;
  /* Betheme AND a CF7 add-on both set these; min-height:48px on the date
     field is the one that keeps it 17 px taller than everything else. */
  /*min-height: 0;
  height: auto;
  padding: 0 0 8px;
  font-family: var(--br-sans);
  font-size: var(--br-fs-18);
  line-height: 1.25;
  color: var(--br-ink);
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  transition: border-color .2s ease;
}*/

/* Everything in this block is a tie on specificity with a CF7 add-on rule —
   .wpcf7 input[type="date"]{min-height:48px; padding:12px 14px; font-size:16px}
   — which loads AFTER us in the combined bundle and therefore wins. It is
   what left the date field 48 px tall and 17 px lower than the number beside
   it, and it is only reachable with !important.
   The height is expressed in the same terms as the other fields (one line
   plus 8 px of padding plus the 1 px rule) so it tracks the fluid type scale
   instead of pinning a number.
   max(16px, …) matters: below 767 the token drops to 15 px, and iOS Safari
   zooms the page in on any focused field under 16. This one declaration
   covers both ends and does not depend on the mobile block further down. */
/*.br-form-availability select,
.br-form-availability input[type="date"],
.br-form-availability input[type="number"]{
  border-bottom-color: var(--br-ink) !important;
  min-height:  calc(1.25em + 9px) !important;
  height:      calc(1.25em + 9px) !important;
  padding-top: 0 !important;
  padding-bottom: 8px !important;
  font-size:   max(16px, var(--br-fs-18)) !important;
  line-height: 1.25 !important;
}*/

/* --- The dropdown ------------------------------------------------------- */
/*.br-form-availability select{
  padding-right: 34px;
  cursor: pointer;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 25 14'%3E%3Cpath d='M1 1.5 L12.5 12.5 L24 1.5' fill='none' stroke='%23648CA7' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 1px bottom 11px;
  background-size: 22px 12px;
}*/

/* The first option is the prompt, so it reads as a placeholder until a real
   choice is made. CF7 does not add the HTML `required` attribute, so :invalid
   never fires — :has() on the checked empty option is the hook that works.
   Verified in the page: true while unselected, false once a value is picked. */
.br-form-availability select:has(option[value=""]:checked){ color: var(--br-grey); }
.br-form-availability select option{ color: var(--br-ink); }

/* --- The number --------------------------------------------------------- */
/*.br-form-availability input[type="number"]{ -moz-appearance: textfield; }
.br-form-availability input[type="number"]::-webkit-outer-spin-button,
.br-form-availability input[type="number"]::-webkit-inner-spin-button{
  -webkit-appearance: none;
  margin: 0;
}*/

/* --- The two labels CSS has to draw -------------------------------------
   A date input cannot take a placeholder — browsers ignore the attribute —
   and CF7 gave the number field none. Both get a PREFIX rather than an
   overlay: the label sits beside the value instead of behind it, so it needs
   no "is it empty" state, which is just as well because CF7 emits neither
   `required` nor `placeholder` and there is no CSS hook for an empty date.
   That is also exactly how the XD reads it: "Datum - dd/mm/jjjj".

   The number's prefix switches itself OFF the moment the field has a
   placeholder of its own — so adding  placeholder "Aantal personen"  to the
   CF7 tag (which type=number DOES support, verified) is a clean upgrade and
   needs no change here.

   The label is positioned ABSOLUTELY rather than laid out beside the field,
   and the input is stretched across the whole wrapper underneath it. That is
   the difference between a label and a dead zone: laid out as a flex sibling,
   the label occupied the left third of the field and clicking the words
   "Aantal personen" hit the wrapper span and focused nothing — which is
   exactly how it read to anyone using it. With the input underneath and
   pointer-events:none on the label, a click anywhere on the field lands on
   the input. Verified with elementFromPoint over the label text: INPUT. */
.br-form-availability .wpcf7-form-control-wrap[data-name="date"],
.br-form-availability .wpcf7-form-control-wrap[data-name="aantal"]:has(input:not([placeholder])){
  display: block;
  position: relative;
  border-bottom: 1px solid var(--br-ink);
}

.br-form-availability .wpcf7-form-control-wrap[data-name="date"]::before{ content: var(--br-label-date); }
.br-form-availability .wpcf7-form-control-wrap[data-name="aantal"]:has(input:not([placeholder]))::before{ content: var(--br-label-aantal); }

.br-form-availability .wpcf7-form-control-wrap[data-name="date"]::before,
.br-form-availability .wpcf7-form-control-wrap[data-name="aantal"]::before{
  position: absolute;
  left: 0;
  bottom: 8px;                 /* sits on the same baseline as the value */
  font-family: var(--br-sans);
  font-size: max(16px, var(--br-fs-18));
  line-height: 1.25;
  color: var(--br-grey);
  pointer-events: none;
}

/* The underline moved up to the wrapper so it spans label + field; the input
   fills the wrapper and its left padding clears the label. */
/*.br-form-availability .wpcf7-form-control-wrap[data-name="date"] input[type="date"]{
  width: 100%;
  border-bottom: 0;
  padding-left: var(--br-inset-date) !important;
}
.br-form-availability .wpcf7-form-control-wrap[data-name="aantal"]:has(input:not([placeholder])) input[type="number"]{
  width: 100%;
  border-bottom: 0;
  padding-left: var(--br-inset-aantal) !important;
}*/

/* The browser supplies the dd/mm/jjjj mask in the visitor's own locale —
   grey while it is a hint, ink once it is a date. */
   /*
.br-form-availability input[type="date"]::-webkit-datetime-edit{ color: var(--br-grey); padding: 0; }
.br-form-availability input[type="date"]:focus::-webkit-datetime-edit,
.br-form-availability input[type="date"]:valid::-webkit-datetime-edit{ color: var(--br-ink); }
*/
/* The XD draws no calendar icon, but removing it leaves no way to open the
   picker with a mouse. Kept, sized down and dimmed. */
/*.br-form-availability input[type="date"]::-webkit-calendar-picker-indicator{
  width: 16px;
  height: 16px;
  padding: 0;
  margin: 0;
  cursor: pointer;
  opacity: .55;
}
.br-form-availability input[type="date"]:hover::-webkit-calendar-picker-indicator{ opacity: 1; }

/* --- Focus, matching the text fields ------------------------------------ */
/*.br-form-availability select:focus,
.br-form-availability input[type="date"]:focus,
.br-form-availability input[type="number"]:focus,
.br-form-availability .wpcf7-form-control-wrap[data-name="date"]:focus-within,
.br-form-availability .wpcf7-form-control-wrap[data-name="aantal"]:focus-within{
  outline: 0;
  border-bottom-color: var(--br-blue) !important;
  border-bottom-width: 2px;
  padding-bottom: 7px;
}*/

/* 22 × 22 in the XD; it was rendering at 13 */
/*.br-form-availability .wpcf7-list-item input[type="checkbox"]{
  width: 22px;
  height: 22px;
  flex: 0 0 auto;
  accent-color: var(--br-ink);
}*/


/* --------------------------------------------------------------------------
   FORM GRID
   --------------------------------------------------------------------------
   Betheme lays the form out with .column floats and a flat 10 px of padding,
   which gives a 20 px gutter — less than half the design's 43.6 — and an
   uneven vertical rhythm (58 / 57 / 65 / 71 px between underlines against a
   uniform 77 in the XD).

   One flex container fixes both, and the percentages come straight off the
   artboard: field 46.76%, gutter 6.47%.

   The wrapper span CF7 puts around every control is inline-block, and the
   inline line box adds ~15 px of descender slack under each field — that is
   where the uneven rhythm came from. Blocking it is what makes the pitch
   land on 77. The two prefix wrappers above are excluded because they need
   to stay flex.
   -------------------------------------------------------------------------- */
/*.br-form-availability .wpcf7 form{
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  column-gap: 6.47%;
  row-gap: clamp(24px, 2.75vw, 44px);
}*/
/*
.br-form-availability .wpcf7 form > *{ width: 100%; }
.br-form-availability .wpcf7 form > p{ margin: 0; }
*/
/* The spam honeypot is a bare <p> sitting between the consent checkbox and
   the submit button. Its only child is a span that already clips itself to
   1 px, so it LOOKS empty — but the <p> still opens a 27 px line box, and as
   a flex item it also collects a row-gap on each side. Measured hole between
   the checkbox and the button: 44 + 27 + 44 = 115 px.

   display:contents does NOT fix it (still 88 px): the whitespace text nodes
   inside the <p> become anonymous flex items of their own. Taking the <p>
   out of flow does — measured 44 px, exactly one row-gap.

   Out of flow rather than display:none on purpose: the field stays in the
   DOM and still submits, which is the whole point of a honeypot, and some
   bots skip anything explicitly hidden. */
/*.br-form-availability .wpcf7 form > p:has(> [data-cf7apps-honeypot]),
.br-form-availability .wpcf7 form > p:has(> .cf7apps-honeypot-wrap){
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  margin: 0;
}*/
/*
.br-form-availability .wpcf7 .column{ padding: 0; margin: 0; }
.br-form-availability .wpcf7 .column > p{ margin: 0; }

.br-form-availability .wpcf7 .column.one-second{ width: calc((100% - 6.47%) / 2); }
*/
/*.br-form-availability .wpcf7 .column > p > .wpcf7-form-control-wrap:not([data-name="date"]):not([data-name="aantal"]){
  display: block;
}*/
/*
@media (max-width: 767px){
  .br-form-availability .wpcf7 .column.one-second{ width: 100%; }
}*/

/* ==========================================================================
   ADDRESS ON CONTACT PAGE
   ========================================================================== */

.br-address{
  display: flex;
  align-items: flex-start;                    /* pin beside the FIRST line */
  gap: clamp(14px, 1.3vw, 26px);
  margin: 0;
  font-family: var(--br-sans, sans-serif);
  font-style: normal;                         /* <address> italicises by default */
  font-size: var(--br-fs-22);
  line-height: 1.4;
  color: var(--br-ink, #272727);
}

.br-address__pin{
  flex: 0 0 auto;
  width: 1.6em;                               /* height follows the viewBox */
  height: auto;
  color: var(--br-blue, #648CA7);
  margin-top: -.12em;                         /* optical align to the cap line */
}

.br-address__lines{ display: block; }


/* ==========================================================================
   11. CUSTOM CSS
   ========================================================================== */
.header-logo-chateau {width: 530px; margin-left:-112px;}
h2.custom {font-size: 2.1rem; line-height:2.1rem;/* border-bottom: solid 1px #fff*/; padding-bottom: 2rem;}
div div.custom-001 {padding: 2rem 4rem;}
h2.custom-002 { padding-top: 35px; }
.ntm .vc_column-inner {padding-top:0 !important; }
.ntm .vc_column_container > .vc_column-inner { padding-left: 8px !important; padding-right: 8px !important;}
.ntm .wpb_wrapper > div {margin-bottom: 16px !important;}
.z-10 {z-index: 10;}
.custom-003 {overflow: visible !important;}
.br-height-fix .wpb_wrapper {min-height: 100% !important;}
.custom-004 h3 { font-weight: 600; font-size: var(--br-fs-28) !important;}
.custom-005 h3 {font-size: var(--br-fs-20) !important; font-family: var(--br-sans);}
.custom-005 .vc_column-inner {border-left: solid 1.4px var(--br-ink) !important; padding-left: 1.4rem !important;}


/* ==========================================================================
   MOBILE
   --------------------------------------------------------------------------
   This block replaces the four-line "MOBILE CORRECTIONS" that used to sit
   above the CONTACT FORM section. It lives at the END of the file on purpose:
   a media query does not raise specificity, so it has to come after the rules
   it overrides.

   FIRST, THE THING WORTH KNOWING: the XD has nine artboards and every one is
   1920 px wide. Atelier 64 never drew a mobile version. So this is not
   "rebuilding the design at 390" — it is a set of decisions about a layout
   that was never designed. The ▲ marks are the places where I decided rather
   than derived. Those are the ones to put in front of the client.

   Every number below was measured on the live site at 390 px, and the whole
   block was injected into all nine pages and re-measured before shipping.

   WHAT WAS ACTUALLY WRONG
   ┌────────────────────────────────────────────────────┬─────────┬─────────┐
   │                                                    │  before │  after  │
   ├────────────────────────────────────────────────────┼─────────┼─────────┤
   │ distinct left gutters on /gelegenheden/communies   │ 5       │ 1 (+1)  │
   │   (21, 36, 54, 71 and 116 px on one page)          │         │         │
   │ hero logo on /landingpage                          │ 530 px  │ 300 px  │
   │   rendered at −112 px: "eau de Braff"              │ clipped │ fits    │
   │ contact form width                                 │ 249 px  │ 315 px  │
   │ photo mosaic height                                │ 1643 px │  670 px │
   │ form-card overlap swallowing the heading below it  │ −240 px │ none    │
   │ input font-size (under 16 px = iOS zooms the page) │ 15 px   │ 16 px   │
   │ page height, /gelegenheden/trouwfeesten            │ 12087   │ 9624    │
   └────────────────────────────────────────────────────┴─────────┴─────────┘
   The "+1" is deliberate: a column with its own background keeps an inset,
   so its content sits 20 px further in than everything else. That reads as a
   card rather than as a misalignment.

   BREAKPOINTS — three, and each one is somebody else's, on purpose:

     1024   where the mosaic and the gelegenheden grid already turn
      767   where WPBakery stacks vc_col-sm-* and Betheme narrows its own
             wrapper. This is THE mobile band, so nothing lands half-stacked.
      480   small phones: type and spacing only, never layout

   Note 767, not the 782 that .br-cols-* uses — 782 is the WordPress admin-bar
   breakpoint and has nothing to do with this site. Between 768 and 782 the
   icon grid collapses one step early, which is harmless.

   ONE RULE OF THUMB FOR EDITING THIS: the gutter group runs first and
   everything else assumes it. If you change --br-side, change it there.
   ========================================================================== */


/* ==========================================================================
   ONE FIX THAT IS NOT A WIDTH QUESTION
   --------------------------------------------------------------------------
   Found while doing the mobile pass, but it is wrong at every width, so it
   sits outside the media queries.

   Betheme has  .content_wrapper img{ height: auto }  at (0,1,1), which beats
   .br-mosaic__img{ height:100% } at (0,1,0). An absolutely positioned image
   with top:0, bottom:0 AND a specified height ignores `bottom`, so every
   mosaic photo renders at its own aspect ratio inside a box sized by the
   grid — and the difference shows as a cream sliver under the photo. It is
   1–2 px on most of them and 16 px on the tall one at desktop; on mobile,
   where the boxes are a fixed 4:5, it was up to 100 px.

   Worth copying this line into vc-mosaic.css so the element is correct on
   its own, rather than depending on this file being loaded.
   ========================================================================== */
.br-mosaic .br-mosaic__img{ height: 100% !important; }


/* ==========================================================================
   TABLET  ≤ 1024 — the layout still works here, this is a nudge
   ========================================================================== */
@media (max-width: 1024px){

  /* Three formule cards get thin before they get stacked (212 px at 768).
     Buying back the inside padding keeps the list readable. */
  .br-formule{ padding-inline: clamp(16px, 2.2vw, 28px); }
}


/* ==========================================================================
   PARTNER CARDS  ≤ 900 — a Safari-only break, and why it was invisible here
   --------------------------------------------------------------------------
   On an iPhone the "Meer info" button hung out of the bottom of the bordered
   card and over the top of the next one. In Chrome, at the same width, it
   sat correctly 23 px inside the border. Same CSS, same markup.

   The card is a CSS grid, and .br-partner__media carries min-height: 100%.
   That percentage is measured against the item's grid area — whose size
   depends on the item. Chrome treats the circular case as auto; Safari
   resolves it against the container instead, which pins the container's
   height, which starves the second row. The body's border box then comes out
   SHORTER than its own content, and the last thing in it — the button —
   spills out the bottom.

   I reproduced it exactly by forcing the card 60 px short in Chrome: the
   button went from 23 px inside the border to 37 px below it. That is the
   iPhone symptom, and the amount of spill tracks how much text each partner
   has — which is why card 1 looked fine and card 2 did not.

   The fix is not to chase Safari. min-height: 100% on the photo only ever
   had a job in the TWO-column desktop card (make the photo as tall as the
   text beside it). Once the card stacks there is nothing to match, so the
   percentage goes — and the card stops being a grid at all, which means
   there is no row sizing left to get wrong in any engine.

   Verified: with these rules, forcing the card 60 px short leaves the button
   23 px inside the border. It cannot be starved any more.

   This belongs in braffe-cpt.css next to the rest of the partner CSS. It is
   here because that is the file you are already uploading; move it when
   convenient, and drop the doubled class when you do.
   ========================================================================== */
@media (max-width: 900px){

  .br-partner.br-partner{ display: block; }

  .br-partner.br-partner .br-partner__media{ min-height: 0; }

  .br-partner.br-partner .br-partner__body{ min-height: 0; height: auto; }

  /* margin-top:auto pins the button to the bottom of a card that has spare
     height. A stacked card never does, so give it a real gap instead. */
  .br-partner.br-partner .br-partner__address + .br-partner__btn{
    margin-top: clamp(18px, 4vw, 28px);
  }

  /* see RATIO BOXES below. aspect-ratio has to GO, not just be supplemented —
     the two mechanisms fight. 16/9 = 56.25%. */
  .br-partner .br-partner__media{ aspect-ratio: auto; }
  .br-partner .br-partner__media::before{ content: ""; display: block; padding-top: 56.25%; }
}


/* ==========================================================================
   RATIO BOXES — the systemic version of the partner bug
   --------------------------------------------------------------------------
   Reported as "the Gelegenheden cards are gone on my iPhone": the section
   rendered its intro text and button, then an empty cream band where four
   photo cards and the CTA panel should be.

   THE SHAPE OF THE BUG. Three blocks on this site are built the same way: a
   box with an aspect-ratio, whose children are ALL absolutely positioned —
   the photo, the scrim, the label, the CTA panel. Nothing is in normal flow,
   so the box has no content height at all, and its entire height comes from
   aspect-ratio. Proved it rather than assumed it: setting aspect-ratio:auto
   on a .br-gel__card in Chrome takes it from 343 px to 0.

   Chrome resolves the ratio when sizing an auto grid row. Safari, for a
   stretched grid item in an auto row, does not — the row comes out 0 and the
   whole block disappears. Same CSS, same width, different answer. Which is
   why every one of these looked fine in my browser:

     .br-gel__card / .br-gel__cta   the Gelegenheden grid — reported
     .br-mosaic__item               the photo mosaic on four pages
     .br-partner__media             the partner photos, which is ALSO why
                                    cards 2 and 3 had no image in the first
                                    iPhone screenshot — not lazy loading

   THE FIX is the technique aspect-ratio replaced: an empty ::before with a
   percentage padding-top. Percentage padding resolves against the element's
   own WIDTH, which is always definite here (it is the grid column), so there
   is no circular dependency for an engine to disagree about, and it works as
   a real in-flow box when the row is being sized.

   Ratios: 491/536 = 91.6045%, 16/9 = 56.25%, 4/5 = 125%, 16/10 = 62.5%.

   ── THE PART I GOT WRONG THE FIRST TIME ─────────────────────────────────
   Version one ADDED the spacer and LEFT aspect-ratio in place, on the
   reasoning that they compute the same height so they cannot conflict. They
   can. With both set, Safari took the definite height from the spacer and
   then used aspect-ratio to derive the WIDTH from it, instead of stretching
   the card to its grid column — so on Safari desktop the cards rendered at
   roughly 270×250 inside 659 px columns, two of them visible and the rest of
   the row gone. Worse than the original bug.

   One mechanism per axis. aspect-ratio is removed on every box that gets a
   spacer, here and in vc-mosaic.css, which was rewritten for the same
   reason.

   Verified in Chrome at 440, 900 and 1440, with aspect-ratio FORCED OFF
   globally to imitate the engine being defended against: gel cards
   343/343/343/343 and mosaic 707 px at 440, mosaic columns 781/781/781 at
   1440 — identical either way, at every width. Desktop partner media
   459×433 before and after.

   If you add another ratio box, give it a ::before AND no aspect-ratio.
   Never both.
   ========================================================================== */
.br-gel .br-gel__card,
.br-gel .br-gel__cta{ aspect-ratio: auto; }

.br-gel .br-gel__card::before,
.br-gel .br-gel__cta::before{ content: ""; display: block; padding-top: 91.6045%; }


/* ==========================================================================
   MOBILE  ≤ 767
   ========================================================================== */
@media (max-width: 767px){

  /* Same species as the partner card above: a percentage min-height against
     a parent with no definite height. It exists to equalise columns that sit
     side by side; once they stack there is nothing to equalise, and leaving
     it in is an invitation for the same engine disagreement. */
  .br-height-fix .wpb_wrapper{ min-height: 0 !important; }


  /* ------------------------------------------------------------------------
     1. ONE GUTTER

     Four padding layers stack up and nothing cancels them:

         Betheme .section_wrapper ............ 33 px
         WPBakery's JS-written section pad ... 21 px
         vc_column-gap-35 ....................️ 17.5 px
         .vc_column-inner default ............ 15 px  (theme forces it)

     …which is how one page ended up with content starting at five different
     x positions. Fix this group first: most of the "it looks cramped"
     symptoms are this and nothing else.
     ------------------------------------------------------------------------ */
  :root{ --br-side: 20px; }

  /* Betheme's content wrapper is ~98% wide, which puts 18 px on the left and
     25 on the right and throws off every full-bleed calculation downstream.
     Square it up before anything measures against it. */
  .the_content_wrapper{
    width: 100% !important;
    margin-left:  0 !important;
    margin-right: 0 !important;
  }

  /* Betheme's own wrapper drops to 33 px below 767. Take it over. */
  .content_wrapper .section_wrapper,
  .container{
    padding-left:  var(--br-side);
    padding-right: var(--br-side);
  }

  /* A "stretch row" section is placed by WPBakery's JAVASCRIPT, which writes
     an inline style — left:-21.23px; width:390px; padding-left:21.23px — to
     pull the section to the window edge and push its content back in.
     Inline styles beat any normal rule, so !important here is the correct
     tool rather than a shortcut.
     Only the padding is touched: let the JS keep doing the full-bleed part.
     Overriding left/width/margin as well was tried and made it WORSE — the
     JS measures the container, so fixing the container (above) is what makes
     its numbers come out right. */
  .vc_section{
    padding-left:  var(--br-side) !important;
    padding-right: var(--br-side) !important;
  }

  /* Column gutters separate columns that sit SIDE BY SIDE. From 767 down
     they are stacked, so the gutter is pure indent. */
  .vc_row[class*="vc_column-gap-"] > .wpb_column{
    padding-left:  0 !important;
    padding-right: 0 !important;
  }

  /* The row's −15 px margin and the column's 15 px padding are a matched
     pair in WPBakery. Betheme resets the margin on fluid rows but the theme
     ALSO re-forces the padding with
         .hero .vc_column-inner{ padding:15px !important }
     below 1240 px, so the 15 px survives and compounds at every nesting
     level. Both halves have to go, together. */
  .vc_row.wpb_row.vc_row-fluid,
  .vc_row.wpb_row.vc_inner,
  .vc_row.wpb_row[class*="vc_column-gap-"]{
    margin-left:  0 !important;
    margin-right: 0 !important;
  }

  .wpb_column:not(.vc_col-has-fill) > .vc_column-inner{
    padding-left:  0 !important;
    padding-right: 0 !important;
  }

  /* A column WITH a background is a card and still needs an inset — but not
     the 2rem/4rem that was typed for a 1640 px canvas. vc_col-has-fill is
     the class WPBakery puts on exactly those columns, so this splits
     "layout padding" from "card padding" without touching a single page. */
  .wpb_column.vc_col-has-fill > .vc_column-inner{
    padding-left:  clamp(16px, 5vw, 24px) !important;
    padding-right: clamp(16px, 5vw, 24px) !important;
  }

  /* From the CUSTOM CSS section at the top of this file — a 1920-canvas
     number: 4rem of side padding is 64 px on a 390 px screen. */
  div div.custom-001{ padding: 24px 0; }

  /* .custom-005 — the three "Architectuur" cards on /over-ons, each a left
     rule plus the padding that holds the text off it. The blanket kill above
     stripped that padding and left the rule sitting against the text.
     NOTE FOR WHOEVER EDITS THIS NEXT: .custom-005 is on the ROW, not on the
     column, which is why the obvious .custom-005.wpb_column selector matches
     nothing. Check where a custom class actually lives before writing the
     restore rule — I got this wrong the first time. */
  .custom-005 > .wpb_column > .vc_column-inner{ padding-left: 1.4rem !important; }

  /* THE GENERAL VERSION of that problem. The blanket kill cannot tell
     deliberate padding from builder default, so anything it strips by
     mistake has to be put back. Rather than a one-off rule every time, put
     br-keep-pad on the ROW or on the COLUMN and it keeps a sane inset. */
  .br-keep-pad.wpb_column > .vc_column-inner,
  .br-keep-pad > .wpb_column > .vc_column-inner{
    padding-left:  clamp(16px, 5vw, 24px) !important;
    padding-right: clamp(16px, 5vw, 24px) !important;
  }


  /* ------------------------------------------------------------------------
     1b. VERTICAL RHYTHM BETWEEN STACKED COLUMNS
     Columns only ever had a HORIZONTAL gutter — WPBakery gives them nothing
     vertical, because at 1920 they never stack. Below 767 every one of them
     does, and every multi-column row on the site was running together on a
     0 px seam: the three Architectuur cards read as one 700 px block of text.
     Measured on /over-ons before this rule: gap between stacked columns = 0.
     ------------------------------------------------------------------------ */
  .vc_row > .wpb_column + .wpb_column{ margin-top: clamp(20px, 5vw, 32px); }


  /* ------------------------------------------------------------------------
     2. NO OVERLAPS
     margin-top: −15rem pulls a card up over the photo above it. At 1920 that
     reads as depth. At 390 the card is full width, so it simply covers the
     heading it was meant to sit beside — "Controleer beschikbaarheid" was
     half-hidden on /contact and on every detail page.
     ▲ Decision: overlap is a desktop device. Off below 767.
     Escape hatch: put br-keep-offset in a column's Extra class name.
     ------------------------------------------------------------------------ */
  .wpb_column:not(.br-keep-offset) > .vc_column-inner{ margin-top: 0 !important; }


  /* ------------------------------------------------------------------------
     3. WIDTH UTILITIES
     .w-50 on a 390 px screen is a 159 px column — about four words a line.
     These are desktop measure controls; they have no job here.
     ------------------------------------------------------------------------ */
  .w-50,
  .w-80,
  .w-90{ width: 100%; }

  .br-maxw-720,
  .br-maxw-880{ max-width: none; }


  /* ------------------------------------------------------------------------
     4. HERO
     Heights were 450, 550 and 720 px on different pages — not a decision,
     just whatever was typed into each row. One height everywhere.
     svh, not vh: on a phone 1vh means "viewport with the URL bar hidden", so
     a vh-sized hero jumps ~60 px the first time the user scrolls.
     ------------------------------------------------------------------------ */
  .vc_row.br-overlay-bg-hero{ min-height: min(72svh, 540px) !important; }

  /* The two overlay bands are 50/50 at desktop. On a tall narrow crop that
     leaves the middle of the photo bare, and white hero text lands on it.
     Weight the bottom band, since that is where the text sits. */
  .br-overlay-bg-hero{
    --br-hero-band-top:    38%;
    --br-hero-band-bottom: 72%;
    --br-hero-overlay:     .72;
  }

  /* ▲ background-position is 50% 50% everywhere. On a portrait crop of a
     1920-wide photo that throws the subject away — the trouwfeesten hero
     becomes a close-up of a wrist. No CSS can know where the subject is:
     add one of these to the row, per page. */
  .br-hero-focus-top    { background-position: 50% 20% !important; }
  .br-hero-focus-bottom { background-position: 50% 85% !important; }
  .br-hero-focus-left   { background-position: 20% 50% !important; }
  .br-hero-focus-right  { background-position: 80% 50% !important; }

  /* The hero logo lockup — width:530px and margin-left:-112px in CUSTOM CSS
     above. It rendered from −76 px to 454 px on a 390 px screen. */
  .header-logo-chateau{
    width: 100%;
    max-width: 300px;
    margin-left: 0;
  }

  /* Two hero buttons side by side leave ~140 px each and both labels wrap */
  .hero-btns .wpb_wrapper{
    flex-direction: column;
    align-items: stretch;
  }

  .br-distances{ line-height: 1.8; }


  /* ------------------------------------------------------------------------
     5. TYPE
     The fluid clamp() scale already works — every .br-* heading measured at
     its mobile minimum. What is left is about MEASURE, not size: a line
     wants 45–75 characters and the big sizes give you five words.
     ------------------------------------------------------------------------ */

  /* ▲ 27 px of pull-quote in a 288 px column is six lines of four words */
  .br-testimonial,
  .br-statement{ font-size: var(--br-fs-25); line-height: 1.35; }

  .br-script-lg{ font-size: var(--br-fs-45); }

  /* Headings typed into WPBakery's own heading element carry a hard px size
     from the builder and do not scale AT ALL — the temporary homepage still
     renders 50 px and 35 px headings at 390. The real fix is to give them
     .br-h1-hero / .br-h2 instead; these two catch the ones on that page. */
  .vc_custom_heading{ line-height: 1.15; }
  .wpb_raw_html h1  { font-size: var(--br-fs-45); line-height: 1.1; }
  .nanum-quote p    { font-size: var(--br-fs-60); }

  /* "Bedrijfsevenementen" and e-mail addresses in a 350 px column */
  h1, h2, h3,
  .br-h1-hero, .br-h2, .br-h3, .br-h2-cta{ overflow-wrap: break-word; }


  /* ------------------------------------------------------------------------
     6. BUTTONS
     The pages use WPBakery's vc_btn3, not .br-btn — which is why none of the
     button CSS in this file was reaching them. Both are covered here.
     ------------------------------------------------------------------------ */
  .br-btn,
  .br-btn--outline,
  .vc_btn3-container .vc_btn3,
  .br-form-availability input[type="submit"]{ width: 100%; }

  .vc_btn3-container{ width: 100%; }

  /* vc_btn3 ships a hard 22 px label; the design system's is 18 fluid */
  .vc_btn3-container .vc_btn3{
    font-size: var(--br-fs-18);
    letter-spacing: var(--br-ls-wider);
  }

  .vc_btn3-container + .vc_btn3-container{ margin-top: 12px; }


  /* ------------------------------------------------------------------------
     7. FORMS
     The 16 px is not a style choice. iOS Safari zooms the whole page in when
     a focused field is under 16 px, and it does not zoom back out. Every
     field on this site was 15.
     ------------------------------------------------------------------------ */
  .br-form-availability input,
  .br-form-availability textarea,
  .br-form-availability select,
  .wpcf7 input,
  .wpcf7 textarea,
  .wpcf7 select{ font-size: 16px !important; }

  .br-form-availability textarea,
  .wpcf7 textarea{ min-height: 140px; }

  /* Checkbox and its label on one line, with a real tap target on the box */
  .wpcf7-list-item{ margin-left: 0; }
  .wpcf7-list-item label{ display: flex; align-items: flex-start; gap: 10px; }
  .wpcf7-list-item input[type="checkbox"]{ width: 20px; height: 20px; margin-top: 1px; }

  /* The contact map rendered 307 × 172. That is not a map. */
  .wpb_gmaps_widget .wpb_wrapper,
  .wpb_map_wraper iframe,
  .wpb_video_wrapper iframe{ width: 100%; min-height: 260px; }


  /* ------------------------------------------------------------------------
     8. PHOTO MOSAIC
     vc-mosaic.css drops to ONE column at 640, which turns the block into
     1643 px of scrolling — five full-width photos in a row, and the same
     five on four different pages. Two columns hold up fine at 354 px and the
     block lands at 670.
     ▲ The tall 991 photo goes full width as a landscape band rather than
     leaving a hole in the grid.
     The doubled class is specificity (0,2,0), so this wins whether
     vc-mosaic.css is enqueued before or after this file.
     ------------------------------------------------------------------------ */
  .br-mosaic.br-mosaic{
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 10px;
  }
  /* Heights come from the spacer only — see RATIO BOXES above. No
     aspect-ratio here or anywhere else on these boxes. 4:5 = 125%,
     16:10 = 62.5%. One class more specific than vc-mosaic.css, so these win
     regardless of enqueue order. */
  .br-mosaic .br-mosaic__item--617::before,
  .br-mosaic .br-mosaic__item--358::before,
  .br-mosaic .br-mosaic__item--381::before,
  .br-mosaic .br-mosaic__item--594::before{ padding-top: 125%; }

  .br-mosaic .br-mosaic__item--991::before{ padding-top: 62.5%; }

  .br-mosaic.br-mosaic .br-mosaic__item--991{ grid-column: 1 / -1; }


  /* ------------------------------------------------------------------------
     9. ICON BLOCKS  (br_icontext)
     Four of them one per row is 500 px of near-empty column. Two up reads as
     a set, which is what they are.
     :has() picks the wrapper that actually contains icon blocks, so no page
     needs editing. Safari 15.4+ / Chrome 105+ — if a browser does not
     support it the blocks simply stay one per row, which is the old
     behaviour, so there is nothing to fall back to.
     ------------------------------------------------------------------------ */
  .wpb_wrapper:has(> .br-it--column){
    display: grid !important;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: clamp(20px, 5vw, 32px) 12px;
    align-items: start;
  }
  .wpb_wrapper:has(> .br-it--column) > *:not(.br-it){ grid-column: 1 / -1; }

  /* Row-direction blocks (icon left of the text) stay one per row */
  .br-it--row{ gap: 14px; }


  /* ------------------------------------------------------------------------
     10. TESTIMONIAL SLIDER — the dots were 24 px; 44 is the smallest
     reliable tap target. The dot itself does not change size.
     ------------------------------------------------------------------------ */
  .br-testimonials [class*="__dot"]{
    padding: 10px;
    min-width: 44px;
    min-height: 44px;
  }


  /* ------------------------------------------------------------------------
     11. PARTNERS — once the photo and the bordered card stack, the gap
     between them makes two objects out of one card.
     ------------------------------------------------------------------------ */
  .br-partner{ gap: 0; }
  .br-partner__body{ padding: clamp(18px, 5vw, 26px); }


  /* ------------------------------------------------------------------------
     12. SECTION RHYTHM — 120 px between sections is a 1920 number
     ------------------------------------------------------------------------ */
  .br-section    { padding-block: 44px; }
  .br-section-sm { padding-block: 28px; }

  .br-eq > .vc_row{ display: block; }
}


/* ==========================================================================
   SMALL PHONES  ≤ 480 — type and spacing only, never layout
   ========================================================================== */
@media (max-width: 480px){

  :root{ --br-side: 18px; }

  .br-quotemark{ font-size: var(--br-fs-45); }

  .wpb_wrapper:has(> .br-it--column){ gap: 22px 10px; }

  .br-mosaic.br-mosaic{ gap: 8px; }
}


/* ==========================================================================
   TOUCH — a pointer question, not a width question. A 1024 px tablet gets
   these; a 700 px desktop window does not.
   ========================================================================== */
@media (hover: none){

  /* Hover transforms never fire on touch but do stick after a tap */
  a.br-gel__card:hover .br-gel__img,
  a.br-gel__card:hover .br-gel__arrow{ transform: none; }

  /* Height without visual weight on the footer and inline links */
  .br-fineprint a,
  #Footer a{ display: inline-block; padding-block: 6px; }
}


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