*,*::before,*::after { margin: 0; padding: 0; box-sizing: border-box; }

:root {
  --bg: #F8F5ED;
  --bg-2: #EFEBE0;
  --bg-3: #E5E0D2;
  --ink: #1A1A1A;
  --ink-2: #5C5A52;
  /* 4,61:1 op het creme. Was #8E8B81 en dat haalde met 3,13:1 de norm niet. */
  --ink-3: #726F67;
  --accent: #2D4A3E;
  --accent-hover: #1F3528;
  --accent-light: #3D5F4E;
  --line: rgba(26,26,26,0.10);
  --line-2: rgba(26,26,26,0.18);
  /* NIET -apple-system: San Francisco is 6 tot 8 procent smaller dan Geist, waardoor de
     hele pagina herschikt zodra Geist binnenkomt (gemeten CLS 0,0251 op /gevelreiniging/).
     Helvetica Neue zit binnen 2,5 procent van Geist. */
  --sans: 'Geist', 'Helvetica Neue', Arial, sans-serif;
  --serif: 'Source Serif 4', Georgia, serif;
}

html { scroll-behavior: smooth; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
body {
  font-family: var(--sans);
  background: var(--bg);
  color: var(--ink);
  font-weight: 400;
  font-size: 16px;
  line-height: 1.6;
  overflow-x: hidden;
}
::selection { background: var(--accent); color: var(--bg); }
a { color: inherit; text-decoration: none; }
img { max-width: 100%; display: block; }

.container { max-width: 1320px; margin: 0 auto; padding: 0 32px; }
.container-narrow { max-width: 980px; margin: 0 auto; padding: 0 32px; }

.eyebrow { font-size: 11px; font-weight: 500; letter-spacing: 0.2em; text-transform: uppercase; color: var(--accent); }
.h-display { font-weight: 600; letter-spacing: -0.035em; line-height: 1.0; }
.h1 { font-size: clamp(44px, 7vw, 88px); }
.h2 { font-size: clamp(32px, 4.8vw, 60px); }
.h3 { font-size: clamp(22px, 3vw, 32px); }
.italic { font-family: var(--serif); font-style: italic; font-weight: 400; letter-spacing: -0.015em; }
.lede { font-size: 17px; line-height: 1.6; color: var(--ink-2); font-weight: 400; max-width: 540px; }

nav {
  position: fixed; top: 0; left: 0; right: 0; z-index: 100;
  padding: 18px 32px;
  display: flex; align-items: center; justify-content: space-between;
  transition: background 0.4s ease, padding 0.3s ease, border-color 0.4s ease;
  border-bottom: 0.5px solid transparent;
  background: rgba(248, 245, 237, 0.6);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
}
nav.scrolled {
  background: rgba(248, 245, 237, 0.94);
  padding: 12px 32px;
  border-bottom-color: var(--line);
}
.brand { font-size: 24px; letter-spacing: -0.04em; font-weight: 600; display: flex; align-items: center; gap: 2px; }
.brand-dot { color: var(--accent); }
.nav-links { display: flex; gap: 28px; align-items: center; }
.nav-links a { font-size: 14px; font-weight: 400; color: var(--ink); transition: opacity 0.2s; letter-spacing: -0.005em; }
.nav-links a:hover { opacity: 0.6; }
.nav-links a.active { color: var(--accent); font-weight: 500; }
.nav-cta {
  background: var(--accent); color: #FFFFFF !important;
  padding: 11px 20px; font-size: 13px; font-weight: 500;
  transition: background 0.25s ease;
}
.nav-cta:hover { background: var(--accent-hover); opacity: 1 !important; }
.menu-toggle { display: none; background: none; border: none; cursor: pointer; padding: 8px; z-index: 102; }
.menu-toggle svg { width: 22px; height: 22px; stroke: var(--ink); }
.mobile-menu {
  position: fixed; top: 0; right: -100%; width: 100%; max-width: 380px;
  height: 100vh; background: var(--bg); z-index: 101;
  padding: 80px 32px 32px; transition: right 0.35s ease;
  display: flex; flex-direction: column; gap: 4px;
  box-shadow: -20px 0 40px rgba(0,0,0,0.05);
}
.mobile-menu.open { right: 0; }
.mobile-menu a {
  padding: 18px 0; font-size: 22px; font-weight: 500;
  border-bottom: 0.5px solid var(--line); letter-spacing: -0.015em;
}
.mobile-menu .nav-cta { margin-top: 24px; text-align: center; border-bottom: none !important; padding: 18px 24px !important; }

.btn {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 16px 28px; font-size: 14px; font-weight: 500;
  letter-spacing: -0.005em; cursor: pointer; border: none;
  font-family: var(--sans); transition: all 0.25s ease;
}
.btn-primary { background: var(--accent); color: #FFFFFF; }
.btn-primary:hover { background: var(--accent-hover); transform: translateY(-1px); }
.btn-primary .arrow { transition: transform 0.25s ease; display: inline-block; }
.btn-primary:hover .arrow { transform: translateX(4px); }
.btn-ghost { background: transparent; color: var(--ink); border: 0.5px solid var(--line-2); }
.btn-ghost:hover { background: var(--ink); color: var(--bg); border-color: var(--ink); }

.hero {
  padding: 160px 0 80px;
  background: var(--bg);
  position: relative;
}
.hero-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 80px;
  align-items: center;
}
.hero-text { max-width: 580px; }
.hero-text .eyebrow { display: inline-block; padding: 8px 14px; background: rgba(45,74,62,0.08); border-radius: 999px; margin-bottom: 24px; }
.hero-title { margin-bottom: 28px; }
.hero-title .line { display: block; }
.hero-sub { font-size: 18px; line-height: 1.55; color: var(--ink-2); margin-bottom: 36px; max-width: 540px; }
.hero-actions { display: flex; gap: 14px; flex-wrap: wrap; }

.trust-strip {
  margin-top: 64px;
  display: flex; gap: 56px; flex-wrap: wrap;
  padding-top: 32px; border-top: 0.5px solid var(--line);
}
.trust-item { display: flex; flex-direction: column; gap: 2px; }
.trust-item .num { font-size: 30px; letter-spacing: -0.04em; font-weight: 600; display: flex; align-items: baseline; gap: 6px; }
.trust-item .num small { font-size: 15px; color: var(--ink-2); font-weight: 400; }
.trust-item .label { font-size: 12px; color: var(--ink-2); letter-spacing: 0.04em; }
.trust-stars { display: flex; gap: 2px; margin-top: 4px; }
.trust-stars span {
  width: 13px; height: 13px; background: var(--accent);
  clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
}

/* VOOR/NA SLIDER */
.ba {
  position: relative;
  overflow: hidden;
  user-select: none;
  -webkit-user-select: none;
  touch-action: pan-y;
  cursor: ew-resize;
  --pos: 50%;
  background: var(--bg-3);
  width: 100%;
}
.ba-square { aspect-ratio: 1 / 1; }
.ba-portrait { aspect-ratio: 3 / 4; }
.ba-landscape { aspect-ratio: 3 / 2; }
.ba-wide { aspect-ratio: 16 / 10; }
.ba img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  pointer-events: none;
}
.ba .ba-before {
  position: absolute;
  inset: 0;
  clip-path: inset(0 calc(100% - var(--pos)) 0 0);
  -webkit-clip-path: inset(0 calc(100% - var(--pos)) 0 0);
}
.ba-handle {
  position: absolute;
  top: 0;
  bottom: 0;
  left: var(--pos);
  width: 3px;
  background: #FFFFFF;
  transform: translateX(-50%);
  pointer-events: none;
  box-shadow: 0 0 12px rgba(0,0,0,0.35);
  z-index: 3;
}
.ba-handle::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 48px;
  height: 48px;
  background: #FFFFFF;
  border-radius: 50%;
  transform: translate(-50%, -50%);
  box-shadow: 0 4px 14px rgba(0,0,0,0.25);
}
.ba-handle::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 18px;
  height: 10px;
  background: var(--ink);
  transform: translate(-50%, -50%);
  -webkit-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 20 10' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 5 L5 0 L5 4 L15 4 L15 0 L20 5 L15 10 L15 6 L5 6 L5 10 Z' fill='black'/%3E%3C/svg%3E") center/contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 20 10' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 5 L5 0 L5 4 L15 4 L15 0 L20 5 L15 10 L15 6 L5 6 L5 10 Z' fill='black'/%3E%3C/svg%3E") center/contain no-repeat;
}
.ba-tag {
  position: absolute;
  top: 16px;
  padding: 6px 12px;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  background: rgba(26,26,26,0.85);
  backdrop-filter: blur(8px);
  color: var(--bg);
  z-index: 2;
}
.ba-tag-before { left: 16px; }
.ba-tag-after { right: 16px; background: rgba(45,74,62,0.92); }
.ba-caption {
  margin-top: 14px;
  display: flex;
  justify-content: space-between;
  font-size: 13px;
  color: var(--ink-2);
}
.ba-caption strong { color: var(--ink); font-weight: 500; }

.marquee {
  border-top: 0.5px solid var(--line); border-bottom: 0.5px solid var(--line);
  overflow: hidden; padding: 22px 0; background: var(--bg);
}
.marquee-track { display: flex; gap: 60px; white-space: nowrap; animation: scroll 45s linear infinite; width: max-content; }
.marquee-item { font-size: 22px; letter-spacing: -0.025em; font-weight: 500; display: flex; align-items: center; gap: 60px; }
.marquee-item .dot { width: 6px; height: 6px; background: var(--accent); border-radius: 50%; flex-shrink: 0; }
@keyframes scroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }

.section { padding: 100px 0; }
.section-tight { padding: 70px 0; }
.section-head {
  display: grid; grid-template-columns: 1.1fr 0.9fr;
  gap: 60px; margin-bottom: 56px; align-items: end;
}

.seo-content { background: var(--bg); }
.seo-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 80px;
  align-items: start;
}
.seo-text h2 { margin-bottom: 28px; }
.seo-text h3 { font-size: 22px; font-weight: 500; letter-spacing: -0.025em; margin: 32px 0 14px; color: var(--ink); }
.seo-text p { font-size: 16px; line-height: 1.75; margin-bottom: 18px; color: var(--ink-2); }
.seo-text p strong { color: var(--ink); font-weight: 500; }
.seo-text ul { margin: 18px 0; padding-left: 0; list-style: none; }
.seo-text ul li {
  font-size: 16px; line-height: 1.6; padding: 6px 0 6px 26px;
  position: relative; color: var(--ink-2);
}
.seo-text ul li::before {
  content: ''; position: absolute; left: 0; top: 15px;
  width: 14px; height: 1px; background: var(--accent);
}
.seo-readmore-btn { display: none; color: #FFFFFF !important; background: var(--accent) !important; -webkit-appearance: none; }
.seo-aside {
  background: var(--bg-2); padding: 36px;
  position: sticky; top: 100px;
  border-left: 2px solid var(--accent);
}
.seo-aside h5 { font-size: 12px; letter-spacing: 0.15em; text-transform: uppercase; font-weight: 500; margin-bottom: 22px; color: var(--accent); }
.stat-row { display: flex; justify-content: space-between; align-items: baseline; padding: 14px 0; border-bottom: 0.5px solid var(--line); font-size: 14px; gap: 16px; }
.stat-row:last-child { border-bottom: none; }
.stat-row span:first-child { color: var(--ink-2); }
.stat-row span:last-child { font-weight: 500; letter-spacing: -0.02em; text-align: right; }

.showcase { background: var(--bg-2); }
.showcase-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 32px;
  margin-top: 56px;
}
.showcase-card { background: var(--bg); padding: 24px; }
.showcase-card h4 { font-size: 22px; font-weight: 500; letter-spacing: -0.02em; margin-bottom: 6px; }
.showcase-card .meta { font-size: 13px; color: var(--ink-2); margin-bottom: 18px; }

.svc-grid { display: grid; grid-template-columns: 1.5fr 1fr 1fr; gap: 16px; }
.svc { position: relative; background: var(--bg-2); overflow: hidden; min-height: 440px; cursor: pointer; transition: transform 0.4s ease; display: block; }
.svc img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; transition: transform 0.6s ease; }
.svc::after { content: ''; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(26,26,26,0) 30%, rgba(26,26,26,0.85) 100%); }
.svc-content { position: absolute; inset: 0; padding: 32px; display: flex; flex-direction: column; justify-content: space-between; z-index: 2; }
.svc-tag {
  align-self: flex-start;
  font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase;
  padding: 6px 12px; background: rgba(248,245,237,0.85);
  color: var(--accent); backdrop-filter: blur(8px); font-weight: 500;
}
.svc-bottom { color: #FFFFFF; }
.svc-num { font-size: 13px; opacity: 0.7; margin-bottom: 8px; }
.svc-title { font-size: 32px; letter-spacing: -0.035em; font-weight: 600; line-height: 1; margin-bottom: 8px; }
.svc.featured .svc-title { font-size: 44px; }
.svc-desc { font-size: 14px; opacity: 0.85; line-height: 1.5; max-width: 320px; }
.svc-cta { margin-top: 16px; font-size: 12px; letter-spacing: 0.05em; font-weight: 500; display: inline-flex; align-items: center; gap: 8px; transition: gap 0.3s ease; }
.svc:hover img { transform: scale(1.04); }
.svc:hover .svc-cta { gap: 14px; }

.step-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; margin-top: 48px; border-top: 0.5px solid var(--line); }
.step { padding: 32px 22px 32px 0; border-right: 0.5px solid var(--line); display: flex; flex-direction: column; gap: 12px; }
.step:last-child { border-right: none; }
.step:not(:first-child) { padding-left: 26px; }
.step-num { font-size: 12px; color: var(--accent); letter-spacing: 0.06em; font-weight: 500; }
.step h4 { font-size: 22px; font-weight: 500; letter-spacing: -0.025em; line-height: 1.2; }
.step p { font-size: 14px; line-height: 1.55; color: var(--ink-2); }

.realisaties-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 32px;
  margin-top: 48px;
}
.realisatie-card h4 { font-size: 20px; font-weight: 500; letter-spacing: -0.02em; margin: 16px 0 4px; }
.realisatie-card .tag { display: inline-block; font-size: 10px; letter-spacing: 0.15em; text-transform: uppercase; color: var(--accent); font-weight: 500; }
.realisatie-card .loc { font-size: 13px; color: var(--ink-2); margin-top: 4px; }

.faq { background: var(--bg); }
.faq-grid { margin-top: 48px; max-width: 880px; }
.faq-item { border-bottom: 0.5px solid var(--line); padding: 24px 0; }
.faq-item summary { display: flex; justify-content: space-between; align-items: center; font-size: 18px; font-weight: 500; letter-spacing: -0.015em; cursor: pointer; list-style: none; gap: 20px; }
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after { content: '+'; font-size: 24px; font-weight: 300; color: var(--accent); transition: transform 0.25s ease; flex-shrink: 0; }
.faq-item[open] summary::after { transform: rotate(45deg); }
.faq-item p { margin-top: 14px; color: var(--ink-2); line-height: 1.75; max-width: 720px; font-size: 15px; }

.reviews { padding: 100px 0; background: var(--bg-2); }
.review-stat { display: flex; align-items: center; gap: 20px; padding: 20px 24px; background: var(--bg); }
.review-stat .num { font-size: 36px; letter-spacing: -0.04em; font-weight: 600; }
.review-stat .meta { font-size: 12px; line-height: 1.5; color: var(--ink-2); }
.review-stars { display: flex; gap: 3px; margin-bottom: 4px; }
.review-stars span {
  width: 14px; height: 14px; background: var(--accent);
  clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
}
.review-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.review { background: var(--bg); border: 0.5px solid var(--line); padding: 30px 26px; display: flex; flex-direction: column; gap: 22px; transition: border-color 0.3s ease, transform 0.3s ease; }
.review:hover { border-color: var(--accent); transform: translateY(-3px); }
.review .review-stars span { background: var(--accent); }
.review-text { font-size: 16px; line-height: 1.55; color: var(--ink); letter-spacing: -0.01em; font-weight: 400; }
.review-author { display: flex; flex-direction: column; gap: 2px; padding-top: 16px; border-top: 0.5px solid var(--line); margin-top: auto; }
.review-author strong { font-weight: 500; font-size: 14px; }
.review-author span { font-size: 12px; color: var(--ink-2); }
.review-source { font-size: 11px; color: var(--ink-3); letter-spacing: 0.06em; text-transform: uppercase; }

.cta-section { background: var(--ink); color: var(--bg); padding: 110px 0; position: relative; overflow: hidden; }
.cta-section::before {
  content: ''; position: absolute;
  top: -200px; right: -200px; width: 600px; height: 600px;
  background: var(--accent); border-radius: 50%;
  filter: blur(100px); opacity: 0.4; z-index: 0;
}
.cta-grid { display: grid; grid-template-columns: 1.2fr 1fr; gap: 80px; align-items: start; position: relative; z-index: 1; }
.cta-section h2 { color: var(--bg); margin-bottom: 24px; }
.cta-section .italic { color: rgba(248,245,237,0.85); }
.cta-section .lede { color: rgba(248,245,237,0.7); margin-bottom: 36px; }

.contact-card { background: rgba(248,245,237,0.05); border: 0.5px solid rgba(248,245,237,0.15); padding: 32px; backdrop-filter: blur(10px); margin-bottom: 20px; }
.contact-card h4 { font-size: 13px; letter-spacing: 0.15em; text-transform: uppercase; color: rgba(248,245,237,0.6); margin-bottom: 22px; font-weight: 500; }
.contact-row { display: flex; justify-content: space-between; align-items: center; padding: 16px 0; border-bottom: 0.5px solid rgba(248,245,237,0.12); transition: padding-left 0.25s ease; }
.contact-row:last-child { border-bottom: none; }
.contact-row:hover { padding-left: 8px; }
.contact-row .label { font-size: 12px; color: rgba(248,245,237,0.55); letter-spacing: 0.04em; }
.contact-row .value { font-size: 16px; font-weight: 500; letter-spacing: -0.01em; }

.hubspot-form-wrap {
  background: var(--bg);
  padding: 32px 28px;
  color: var(--ink);
}
.hubspot-form-wrap h4 {
  font-size: 13px;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 22px;
  font-weight: 500;
}
.hubspot-form-wrap input,
.hubspot-form-wrap textarea,
.hubspot-form-wrap select {
  width: 100%;
  padding: 12px 14px;
  /* 16px is de ondergrens: onder 16px zoomt iOS Safari automatisch in op een
     veld en zoomt niet terug uit. Desktop krijgt 14px terug, zie hieronder. */
  font-size: 16px;
  font-family: var(--sans);
  border: 0.5px solid var(--line-2);
  background: var(--bg-2);
  color: var(--ink);
  margin-bottom: 12px;
}
@media (min-width: 861px) {
  .hubspot-form-wrap input,
  .hubspot-form-wrap textarea,
  .hubspot-form-wrap select { font-size: 14px; }
}
/* Vaste nav is ~58px hoog; zonder deze marge verdwijnt de kop van elke
   ankersectie eronder na een #-sprong. */
#contact, #offerte, [id]:target { scroll-margin-top: 84px; }
.hubspot-form-wrap label {
  font-size: 12px;
  font-weight: 500;
  color: var(--ink-2);
  display: block;
  margin-bottom: 4px;
}
.hubspot-form-wrap .hs-button,
.hubspot-form-wrap input[type=submit] {
  background: var(--accent) !important;
  color: #FFFFFF !important;
  border: none !important;
  padding: 14px 24px !important;
  font-weight: 500 !important;
  cursor: pointer !important;
  width: auto !important;
  margin-top: 8px !important;
}
.hubspot-form-wrap .hs-error-msg { color: #c44; font-size: 12px; }

footer { background: var(--ink); color: var(--bg); padding: 56px 0 28px; border-top: 0.5px solid rgba(248,245,237,0.08); }
.foot-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1.4fr; gap: 56px; margin-bottom: 48px; }
.foot-brand { font-size: 30px; letter-spacing: -0.04em; font-weight: 600; }
.foot-brand .brand-dot { color: var(--accent-light); }
.foot-tagline { font-size: 14px; color: rgba(248,245,237,0.55); margin-top: 14px; max-width: 320px; line-height: 1.6; }
.foot-col h5 { font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: rgba(248,245,237,0.48); font-weight: 500; margin-bottom: 18px; }
.foot-col ul { list-style: none; display: flex; flex-direction: column; gap: 10px; }
.foot-col a { font-size: 14px; color: rgba(248,245,237,0.78); transition: color 0.2s; }
.foot-col a:hover { color: var(--bg); }
/* .foot-col ul zet flex-direction:column, en die erfde hierheen door: de steden
   wikkelden in een KOLOM, dus twaalf steden op twaalf regels (373px hoog op mobiel). */
.foot-cities ul { display: flex; flex-direction: row; flex-wrap: wrap; gap: 6px 12px; }
.foot-cities a { font-size: 12px; color: rgba(248,245,237,0.55); }
.foot-cities a::after { content: ' ·'; color: rgba(248,245,237,0.25); margin-left: 8px; }
.foot-cities li:last-child a::after { content: ''; }
.foot-bottom { border-top: 0.5px solid rgba(248,245,237,0.10); padding-top: 24px; display: flex; justify-content: space-between; align-items: center; font-size: 12px; color: rgba(248,245,237,0.48); flex-wrap: wrap; gap: 14px; }

.mobile-cta {
  /* right: 86px houdt de balk vrij van de zwevende bel-/WhatsApp-knoppen
     (#floatContact staat op right:16px en is 52px breed). */
  display: none; position: fixed; bottom: 16px; left: 16px; right: 86px;
  background: var(--accent); color: #fff;
  padding: 16px; text-align: center; font-size: 14px; font-weight: 500;
  z-index: 90; box-shadow: 0 10px 40px rgba(0,0,0,0.15);
  transition: transform 0.3s ease;
}
.mobile-cta.hidden { transform: translateY(120%); }

.js .reveal { opacity: 0; transform: translateY(20px); transition: opacity 0.9s cubic-bezier(0.16, 1, 0.3, 1), transform 0.9s cubic-bezier(0.16, 1, 0.3, 1); }
.js .reveal.visible { opacity: 1; transform: translateY(0); }

@media (max-width: 1100px) {
  .svc-grid { grid-template-columns: 1fr 1fr; }
  .svc.featured { grid-column: span 2; min-height: 380px; }
  .seo-grid { grid-template-columns: 1fr; gap: 40px; }
  .seo-aside { position: static; }
  .hero-split { grid-template-columns: 1fr; gap: 56px; }
  .showcase-grid { grid-template-columns: 1fr; gap: 24px; }
  .realisaties-grid { grid-template-columns: 1fr; gap: 32px; }
}

@media (max-width: 860px) {
  .container, .container-narrow { padding: 0 20px; }
  nav { padding: 14px 20px; }
  nav.scrolled { padding: 10px 20px; }
  .nav-links { display: none; }
  .menu-toggle { display: flex; align-items: center; }
  .hero { padding: 130px 0 60px; }
  .hero-text .eyebrow { margin-bottom: 22px; }
  .hero-sub { font-size: 16px; margin-bottom: 28px; }
  .trust-strip { gap: 28px; margin-top: 40px; padding-top: 24px; }
  .trust-item .num { font-size: 24px; }
  .section { padding: 60px 0; }
  .section-head { grid-template-columns: 1fr; gap: 20px; margin-bottom: 36px; }
  .marquee-item { font-size: 16px; gap: 36px; }
  .svc-grid { grid-template-columns: 1fr; }
  .svc.featured { grid-column: auto; min-height: 420px; }
  .svc { min-height: 340px; }
  .svc-title { font-size: 26px !important; }
  .step-grid { grid-template-columns: 1fr; }
  .step { border-right: none; border-bottom: 0.5px solid var(--line); padding: 26px 0; }
  .step:not(:first-child) { padding-left: 0; }
  .step:last-child { border-bottom: none; }
  .review-grid { grid-template-columns: 1fr; }
  .cta-grid { grid-template-columns: 1fr; gap: 36px; }
  .foot-grid { grid-template-columns: 1fr; gap: 36px; }
  .mobile-cta { display: block; }
  .reviews { padding: 60px 0; }
  .cta-section { padding: 70px 0; padding-bottom: 100px; }
  .ba-handle::before { width: 42px; height: 42px; }
  .ba-tag { font-size: 10px; top: 12px; padding: 5px 10px; }
  .ba-tag-before { left: 12px; } .ba-tag-after { right: 12px; }

  /* Mobile collapsible SEO content */
  .seo-readmore {
    max-height: 0;
    overflow: hidden;
    transition: max-height 0.5s ease;
    position: relative;
  }
  .seo-readmore.expanded { max-height: 20000px; }
  .seo-readmore-btn {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin-top: 8px;
    padding: 14px 24px;
    background: var(--accent) !important;
    color: #FFFFFF !important;
    border: none;
    font-family: var(--sans);
    font-weight: 500;
    font-size: 14px;
    cursor: pointer;
    transition: background 0.25s ease;
    -webkit-appearance: none;
  }
  .seo-readmore-btn:hover { background: var(--accent-hover); }
}

@media (max-width: 540px) {
  .hero-actions { flex-direction: column; align-items: stretch; }
  .btn { justify-content: center; width: 100%; }
  .nav-cta { padding: 9px 16px; font-size: 12px; }
  .brand { font-size: 21px; }
  .trust-strip { gap: 24px; }
}

/* Performance optimizations */
@font-face { font-display: swap; }
img { max-width: 100%; height: auto; }
video { max-width: 100%; }

/* Preload hints via CSS */
.hero { contain: layout style; }
.showcase-grid { contain: layout; }

/* ─── VIDEO ─────────────────────────────── */
.video-wrap { width: 100%; overflow: hidden; background: #000; }
.video-16x9 {
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
  display: block;
}
.video-4x3 {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  display: block;
}
/* Legacy class - map to 16x9 */
.outshine-video {
  width: 100%;
  aspect-ratio: 16 / 9 !important;
  object-fit: cover !important;
  display: block;
  max-height: 600px;
}
@media (max-width: 860px) {
  .outshine-video { max-height: 260px; }
  .video-16x9 { max-height: 260px; }
}


/* AI/entity clarity blocks */
.ai-entity-section {
  background: #fffdf7;
  border-top: 1px solid rgba(45,74,62,.10);
  border-bottom: 1px solid rgba(45,74,62,.10);
}
.ai-entity-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  gap: 14px;
  margin-top: 26px;
}
.ai-entity-card {
  background: #fff;
  border: 1px solid rgba(45,74,62,.14);
  border-radius: 16px;
  padding: 20px 22px;
  box-shadow: 0 12px 30px rgba(26,26,26,.04);
}
.ai-entity-card strong {
  display: block;
  color: #2D4A3E;
  margin-bottom: 8px;
}
.ai-entity-card p {
  margin: 0;
  color: #5C5A52;
  line-height: 1.65;
  font-size: 14px;
}
.ai-entity-note {
  margin-top: 22px;
  padding: 18px 22px;
  background: #F8F5ED;
  border: 1px solid rgba(45,74,62,.12);
  border-radius: 16px;
  color: #1A1A1A;
  line-height: 1.7;
  font-size: 15px;
}
.expert-box {
  background: #F8F5ED;
  border: 1px solid rgba(45,74,62,.14);
  border-radius: 16px;
  padding: 20px 24px;
  margin: 28px 0;
  color: #1A1A1A;
}
.expert-box strong {
  color: #2D4A3E;
}


.answer-block{background:#f8f5ed;border:1px solid rgba(34,49,63,.12);border-radius:16px;padding:28px;margin:42px auto;max-width:1120px}
.answer-block .eyebrow{font-size:.78rem;letter-spacing:.08em;text-transform:uppercase;font-weight:700;color:#8a6a44;margin-bottom:10px}
.answer-block h2{font-size:clamp(1.7rem,3vw,2.45rem);line-height:1.08;margin:0 0 14px;color:#10233c}
.answer-block h3{font-size:1.15rem;margin:24px 0 8px;color:#10233c}
.answer-block p{font-size:1.04rem;line-height:1.65;color:#263241;margin:0 0 14px}
.answer-block ul{margin:12px 0 0 20px;padding:0;color:#263241;line-height:1.65}
.answer-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px;margin-top:22px}
.answer-card{background:#fff;border:1px solid rgba(34,49,63,.12);border-radius:16px;padding:20px;box-shadow:0 12px 30px rgba(16,35,60,.04)}
.answer-card strong{display:block;color:#10233c;font-size:1.04rem;margin-bottom:8px}.answer-card p{font-size:.96rem;margin:0 0 10px}.answer-card a{font-weight:700;color:#10233c;text-decoration:underline;text-underline-offset:3px}
.quick-links{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}.quick-links a{background:#10233c;color:#fff;padding:11px 14px;border-radius:999px;text-decoration:none;font-weight:700;font-size:.92rem}.quick-links a.secondary{background:#fff;color:#10233c;border:1px solid rgba(16,35,60,.18)}
.intent-table{width:100%;border-collapse:collapse;margin-top:18px;background:#fff;border-radius:16px;overflow:hidden}.intent-table th,.intent-table td{text-align:left;padding:14px 16px;border-bottom:1px solid rgba(34,49,63,.1);vertical-align:top}.intent-table th{background:#10233c;color:#fff;font-size:.9rem}.intent-table td{color:#263241}.intent-table tr:last-child td{border-bottom:0}
@media(max-width:860px){.answer-grid{grid-template-columns:1fr}.answer-block{padding:22px;margin:28px 0}.intent-table{font-size:.92rem}.intent-table th,.intent-table td{padding:12px}}

/* ===== v48.2 fix: ontbrekende klassen voor gegenereerde pagina's ===== */
.wa-float{position:fixed;bottom:24px;right:24px;z-index:999;display:flex;align-items:center;gap:12px;background:#25D366;color:#fff;padding:14px 20px;border-radius:999px;box-shadow:0 8px 32px rgba(37,211,102,.4);font-family:var(--sans);font-size:14px;font-weight:600;text-decoration:none;transition:all .3s;}
.wa-float:hover{transform:scale(1.05) translateY(-2px);box-shadow:0 12px 40px rgba(37,211,102,.55);}
.wa-float svg{width:22px;height:22px;fill:#fff;flex-shrink:0;}
@media(max-width:860px){.wa-float{bottom:80px;right:16px;border-radius:50%;width:56px;height:56px;padding:0;justify-content:center;}.wa-float .wa-text{display:none;}}

/* compacte hero voor info/lokale/money pagina's */
.hero.hero-compact{padding-top:140px;padding-bottom:60px;min-height:auto;}
.hero-compact .hero-sub{max-width:640px;}
@media(max-width:860px){.hero.hero-compact{padding-top:110px;padding-bottom:40px;}}

/* vergelijkingstabel */
.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:8px 0;}
.compare-table{width:100%;border-collapse:collapse;font-size:15px;background:var(--bg);border:0.5px solid var(--line-2);}
.compare-table th,.compare-table td{text-align:left;padding:14px 16px;border-bottom:0.5px solid var(--line);vertical-align:top;}
.compare-table thead th{background:var(--accent);color:var(--bg);font-weight:500;letter-spacing:-0.01em;font-size:14px;}
.compare-table tbody tr:nth-child(even){background:var(--bg-2);}
.compare-table td:first-child{font-weight:500;color:var(--ink);}

/* stappenplan (gescopet onder .steps zodat het bestaande .step niet botst) */
.steps{display:flex;flex-direction:column;gap:4px;margin:8px 0;}
.steps .step{display:flex;gap:20px;align-items:flex-start;padding:22px 0;border-bottom:0.5px solid var(--line);border-right:none;flex-direction:row;}
.steps .step:last-child{border-bottom:none;}
.steps .step-num{flex-shrink:0;width:40px;height:40px;border-radius:50%;background:var(--accent);color:var(--bg);display:flex;align-items:center;justify-content:center;font-weight:600;font-size:16px;}
.steps .step h4{font-size:18px;font-weight:600;letter-spacing:-0.015em;margin-bottom:6px;}
.steps .step p{color:var(--ink-2);line-height:1.7;font-size:15px;margin:0;}

/* AI-citeerbaar antwoordblok */
.ai-q{padding:22px 24px;background:var(--bg-2);border-left:3px solid var(--accent);margin-bottom:16px;border-radius:0 8px 8px 0;}
.ai-q h3{font-size:18px;font-weight:600;letter-spacing:-0.015em;margin-bottom:8px;color:var(--ink);}
.ai-q p{margin:0;color:var(--ink-2);line-height:1.7;font-size:15px;}

/* faq-lijst wrapper */
.faq-list{border-top:0.5px solid var(--line);}

/* check-list */
.check-list{list-style:none;padding:0;margin:8px 0;}
.check-list li{position:relative;padding-left:30px;margin-bottom:14px;line-height:1.65;color:var(--ink-2);font-size:15px;}
.check-list li::before{content:'✓';position:absolute;left:0;top:0;color:var(--accent);font-weight:700;}
.check-list li strong{color:var(--ink);font-weight:600;}
.check-list a{color:var(--accent);text-decoration:underline;text-underline-offset:2px;}

/* gerelateerde kaarten */
.rel-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;margin-top:8px;}
.rel-card{display:flex;flex-direction:column;gap:6px;padding:22px;background:var(--bg);border:0.5px solid var(--line-2);transition:all .25s ease;}
.rel-card:hover{border-color:var(--accent);transform:translateY(-2px);}
.rel-card strong{font-size:16px;font-weight:600;color:var(--ink);letter-spacing:-0.015em;}
.rel-card span{font-size:14px;color:var(--ink-3);}

/* inline cta-box */
.cta-inline{border:0.5px solid var(--line-2);}
.cta-inline a.btn{margin-top:4px;}

/* case meta */
.case-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:16px;margin:28px 0 8px;}
.case-meta>div{display:flex;flex-direction:column;gap:4px;padding:16px;background:var(--bg-2);border:0.5px solid var(--line);}
.meta-label{font-size:11px;letter-spacing:0.12em;text-transform:uppercase;color:var(--ink-3);font-weight:500;}
.case-meta strong{font-size:16px;font-weight:600;color:var(--ink);letter-spacing:-0.01em;}

/* bijschrift onder foto */
.img-caption{font-size:13px;color:var(--ink-3);}

/* contactkaart op donkere cta: leesbaarheid van span/strong rijen */
.cta-section .contact-card span{font-size:12px;color:rgba(248,245,237,0.55);letter-spacing:0.04em;}
.cta-section .contact-card strong{font-size:15px;font-weight:500;color:var(--bg);}

/* Crepi-reiniging: desktop hero cleanup (mobile blijft op bestaande layout) */
@media (min-width: 1101px) {
  .page-crepi-reiniging .hero {
    padding-top: 132px;
    padding-bottom: 64px;
  }
  /* align-items:center stond hier nog en woog zwaarder (0,2,0) dan de
     stretch verderop in dit bestand (0,1,0). Dat was de reden dat het
     beeld na de eerste ingreep alsnog verticaal gecentreerd bleef. */
  .page-crepi-reiniging .hero-split {
    grid-template-columns: minmax(420px, 0.86fr) minmax(520px, 1.14fr);
    gap: 72px;
  }
  .page-crepi-reiniging .hero-text {
    max-width: 560px;
  }
  .page-crepi-reiniging .hero-title {
    font-size: clamp(54px, 5vw, 76px);
    line-height: 0.98;
    letter-spacing: -0.045em;
    margin-bottom: 24px;
  }
  .page-crepi-reiniging .hero-sub {
    max-width: 510px;
    margin-bottom: 26px;
  }
  .page-crepi-reiniging .hero-actions {
    margin-bottom: 4px;
  }
  .page-crepi-reiniging .ba.ba-portrait {
    max-height: 760px;
  }
}

/* De tweede foto in de hero stond in een omkaderd vak van 595px breed met
   het bijschrift erin geperst, terwijl het beeld erbinnen 569px was: twee
   losse dingen onder elkaar. Het was bovendien exact dezelfde foto als die
   verderop in "Wat wij aan je gevel bekijken", dus stond ze twee keer op
   een pagina. Het vak is weg uit de HTML, deze regels zijn daarmee dood. */


body:not(.no-after-photo-tint) .ba:not(.no-after-tint) > img:not(.ba-before),
body:not(.no-after-photo-tint) img[src*="-na."]:not([src*="kbc-clean"]):not([src*="studentenkot-clean"]):not([src*="b2b-"]),
body:not(.no-after-photo-tint) img[src*="-na-"]:not([src*="kbc-clean"]):not([src*="studentenkot-clean"]):not([src*="b2b-"]),
body:not(.no-after-photo-tint) img[src*="-na_"]:not([src*="kbc-clean"]):not([src*="studentenkot-clean"]):not([src*="b2b-"]) {
  filter: brightness(0.88) saturate(0.92) contrast(0.97);
}

/* Dark/green overlay only where allowed. */
body:not(.no-after-photo-tint) .ba:not(.no-after-tint)::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background: rgba(20, 34, 28, 0.06);
  z-index: 3;
}

/* Explicit opt-outs */
.no-after-photo-tint .ba > img,
.no-after-photo-tint img,
.ba.no-after-tint > img,
img[src*="kbc-clean"],
img[src*="studentenkot-clean"],
img[src*="b2b-"] {
  filter: none !important;
}

.no-after-photo-tint .ba::after,
.ba.no-after-tint::after {
  content: none !important;
  display: none !important;
}

.ba-tag,
.ba-handle {
  z-index: 5;
}


img[src*="stg"],
img[src*="showroom"],
img[src*="appartement"],
img[src*="appartements"],
img[src*="studentenkot"],
img[src*="kbc"],
img[src*="certus"],
img[alt*="STG"],
img[alt*="showroom"],
img[alt*="Appartementsgebouw"],
img[alt*="appartementsgebouw"],
img[alt*="Syndicus"],
img[alt*="B2B"],
img[alt*="KBC"],
img[alt*="Studentenkot"] {
  filter: none !important;
}


.wa-float { display: none !important; }
.sticky-bottom-cta { background: var(--accent) !important; }
.exit-wa { background: var(--accent) !important; }


.wa-float { display:none!important; }
.old-contact-float-disabled { display:none!important; }
.sticky-bottom-cta { background: var(--accent)!important; }


.form-phone-boost {
  margin: 14px 0 18px;
  padding: 16px 18px;
  background: #fff;
  border: 1px solid var(--line);
}
.form-phone-boost strong {
  display: block;
  margin-bottom: 4px;
  color: var(--ink);
}
.form-phone-boost p {
  margin: 0 0 10px;
  color: var(--ink-2);
  font-size: 14px;
  line-height: 1.45;
}
.form-phone-boost a {
  color: var(--accent);
  font-weight: 700;
  text-decoration: none;
}
.form-phone-boost a:hover {
  text-decoration: underline;
}


.review-text.clampable{display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden}.review-text.clampable.expanded{display:block;-webkit-line-clamp:unset;overflow:visible}.review-toggle{display:inline-block;margin:6px 0 2px;padding:0;background:none;border:0;color:var(--accent);font:inherit;font-weight:600;cursor:pointer}


.result-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
.result-card{background:#fff;border:1px solid var(--line);padding:14px}
.result-card h4{font-size:18px;margin:14px 0 6px}
.result-card p{font-size:14px;line-height:1.5;color:var(--ink-2);margin:0}
.service-strip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}
.service-tile{background:#fff;border:1px solid var(--line);padding:22px}
.service-tile h4{font-size:17px;margin:0 0 8px}
.service-tile p{font-size:14px;line-height:1.5;color:var(--ink-2);margin:0}
.review-text.clampable{display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden}
.review-text.clampable.expanded{display:block;-webkit-line-clamp:unset;overflow:visible}
.review-toggle{display:inline-block;margin:6px 0 2px;padding:0;background:none;border:0;color:var(--accent);font:inherit;font-weight:600;cursor:pointer}
@media(max-width:900px){.result-grid,.service-strip{grid-template-columns:1fr}}


/* Mobile sticky CTA for the long realisaties gallery */
.mobile-sticky-offerte {
    display: none;
}

@media (max-width: 760px) {
    body.page-realisaties {
        padding-bottom: 96px;
    }

    body.page-realisaties .mobile-sticky-offerte {
        position: fixed;
        left: 16px;
        right: 16px;
        bottom: calc(14px + env(safe-area-inset-bottom));
        z-index: 9998;
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 14px;
        padding: 15px 18px;
        background: #2D4A3E;
        color: #F8F5ED;
        border: 1px solid rgba(248, 245, 237, 0.22);
        border-radius: 999px;
        box-shadow: 0 18px 50px rgba(16, 24, 20, 0.28);
        text-decoration: none;
        font-family: 'Geist', sans-serif;
        transform: translateZ(0);
    }

    body.page-realisaties .mobile-sticky-offerte span {
        font-size: 13px;
        line-height: 1.2;
        opacity: 0.78;
        white-space: nowrap;
    }

    body.page-realisaties .mobile-sticky-offerte strong {
        font-size: 15px;
        line-height: 1.2;
        font-weight: 700;
        white-space: nowrap;
    }

    body.page-realisaties .mobile-sticky-offerte strong::after {
        content: " →";
        font-weight: 700;
    }
}

/* Offer page explanation cards */
.wr-sec .wr-reasons{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:4px;}
.wr-sec .wr-card{background:var(--bg);border:1px solid var(--line);border-radius:16px;padding:30px 26px;position:relative;overflow:hidden;transition:transform .25s ease,box-shadow .25s ease;}
.wr-sec .wr-card::before{content:'';position:absolute;top:0;left:0;width:48px;height:3px;background:var(--accent);}
.wr-sec .wr-card:hover{transform:translateY(-3px);box-shadow:0 14px 30px rgba(26,26,26,.07);}
.wr-sec .wr-num{font-family:var(--sans);font-size:12px;font-weight:600;letter-spacing:.09em;color:var(--accent);text-transform:uppercase;}
.wr-sec .wr-card h3{font-size:20px;margin:14px 0 10px;line-height:1.25;color:var(--ink);}
.wr-sec .wr-card p{font-size:15px;line-height:1.65;color:var(--ink-2);margin:0;}
.wr-sec .wr-panel{margin-top:22px;background:var(--accent);border-radius:16px;padding:42px 44px;display:grid;grid-template-columns:.9fr 1.1fr;gap:36px;align-items:center;}
.wr-sec .wr-panel h3{color:#fff;font-size:26px;line-height:1.2;margin:0;font-family:var(--serif,'Source Serif 4',serif);}
.wr-sec .wr-panel .wr-lead{color:rgba(255,255,255,.82);font-size:15px;line-height:1.6;margin:14px 0 0;}
.wr-sec .wr-panel .check-list{margin:0;}
.wr-sec .wr-panel .check-list li{color:rgba(255,255,255,.92);font-size:15px;}
.wr-sec .wr-panel .check-list li::before{color:#fff;}
.wr-sec .wr-panel .check-list li strong{color:#fff;}
@media(max-width:860px){.wr-sec .wr-reasons{grid-template-columns:1fr;}.wr-sec .wr-panel{grid-template-columns:1fr;padding:28px 26px;gap:22px;}.wr-sec .wr-panel h3{font-size:23px;}}

/* Cookiebalk op mobiel naar boven: onderaan dekte hij de sticky offerte-knop
   en de bel-knop af, waardoor een tik op "Vraag een offerte" in werkelijkheid
   op "Weigeren" landde. Hogere specificiteit dan de inline-regels per pagina. */
@media (max-width: 600px) {
  html body .cookie-bar { bottom: auto !important; top: 0 !important; transform: translateY(-110%) !important; }
  html body .cookie-bar.show { transform: translateY(0) !important; }
}


/* ============================================================
   HERO V2 + CONVERSIEBLOK — prijs, telefoon en primaire actie
   binnen de eerste schermvulling op 390x664. Alles ov- geprefixt.
   ============================================================ */
/* ─── HERO V2 ─────────────────────────────────────────────── */
.ov-hero {
  background: var(--bg);
  padding: 128px 0 76px;
  /* --ov-cookie: hoogte van de cookiebalk zolang die bovenaan staat.
     Wordt door JS gezet, is 0 zodra er consent is (of geen balk). */
  padding-top: calc(128px + var(--ov-cookie, 0px));
  transition: padding-top .3s ease;
}
.ov-hero-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.02fr) minmax(0, 0.98fr);
  gap: 64px;
  align-items: center;
}
.ov-hero-col { max-width: 560px; }

.ov-eyebrow {
  display: inline-block;
  padding: 7px 13px;
  background: rgba(45,74,62,0.08);
  border-radius: 999px;
  margin-bottom: 22px;
}

.ov-h1 { margin-bottom: 16px; font-size: clamp(33px, 5.4vw, 68px); }
.ov-h1 .ov-line { display: block; }

.ov-sub {
  font-size: 16px;
  line-height: 1.55;
  color: var(--ink-2);
  max-width: 44ch;
  margin-bottom: 20px;
}

/* Prijsband — de kern van de eerste schermvulling */
.ov-price {
  border-top: 0.5px solid var(--line-2);
  border-bottom: 0.5px solid var(--line-2);
  padding: 15px 0 14px;
  margin-bottom: 20px;
}
.ov-price-head {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0 8px;
}
.ov-price-pre {
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.ov-price-num {
  font-size: 34px;
  font-weight: 600;
  letter-spacing: -0.04em;
  line-height: 1.1;
  font-variant-numeric: tabular-nums;   /* tnum via font-variant-numeric; font-feature-settings erbij is dubbelop */
}
.ov-price-unit { font-size: 14px; color: var(--ink-2); letter-spacing: -0.005em; }
.ov-price-list { list-style: none; margin: 7px 0 0; padding: 0; }
.ov-price-list li {
  font-size: 13.5px;
  line-height: 1.5;
  color: var(--ink-2);
  padding: 2px 0 2px 15px;
  position: relative;
  font-variant-numeric: tabular-nums;
}
.ov-price-list li::before {
  content: '';
  position: absolute;
  left: 0; top: 11px;
  width: 6px; height: 0.5px;
  background: var(--line-2);
}
.ov-price-list strong { color: var(--ink); font-weight: 500; }

/* Acties: één primaire actie + het telefoonnummer, allebei boven de vouw */
.ov-actions { display: flex; gap: 12px; flex-wrap: wrap; }
.ov-actions .btn { min-height: 52px; }
.ov-tel {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-variant-numeric: tabular-nums;
}
.ov-tel svg { width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 1.6; flex-shrink: 0; }

/* Bewijsregel — twee vaste regels, zodat er nooit een losse punt afbreekt */
.ov-proof { margin-top: 18px; font-size: 13px; line-height: 1.5; color: var(--ink-2); }
.ov-proof-row { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 9px; }
.ov-proof-row-2 { margin-top: 4px; }
.ov-proof strong { color: var(--ink); font-weight: 500; }
.ov-stars { display: flex; gap: 2px; }
.ov-stars span {
  width: 12px; height: 12px; background: var(--accent);
  clip-path: polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%);
}

/* Beeldpaneel rechts */
.ov-shot { position: relative; }
.ov-shot-main {
  position: relative;
  aspect-ratio: 4 / 5;
  /* De kolom is zo breed als het raster hem maakt; zonder plafond werd de
     herofoto 1250x1570 op desktop - twee schermen hoog. */
  max-height: min(72vh, 640px);
  max-width: calc(min(72vh, 640px) * 0.8);
  margin-left: auto;
  overflow: hidden;
  background: var(--bg-3);
}
.ov-shot-main img { width: 100%; height: 100%; object-fit: cover; }
.ov-shot-tag {
  position: absolute;
  top: 14px; right: 14px;
  background: rgba(26,26,26,0.72);
  color: var(--bg);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  padding: 6px 10px;
}
.ov-shot-inset {
  position: absolute;
  left: 18px; bottom: 18px;
  width: 33%;
  max-width: 150px;
  aspect-ratio: 3 / 4;
  overflow: hidden;
  border: 3px solid var(--bg);
  box-shadow: 0 12px 34px rgba(26,26,26,0.20);
  background: var(--bg-3);
}
.ov-shot-inset img { width: 100%; height: 100%; object-fit: cover; }
.ov-shot-inset .ov-shot-tag { top: 8px; right: 8px; padding: 4px 8px; font-size: 9px; }
.ov-shot-cap {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  margin-top: 12px;
  font-size: 12.5px;
  color: var(--ink-2);
}
.ov-shot-cap strong { color: var(--ink); font-weight: 500; }

/* ─── CONVERSIEBLOK ───────────────────────────────────────── */
.ov-conv {
  background: var(--bg-2);
  border-top: 0.5px solid var(--line);
  border-bottom: 0.5px solid var(--line);
  padding: 76px 0;
  scroll-margin-top: 92px;
}
.ov-conv-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 56px;
  align-items: start;
}
.ov-conv h2 { margin: 12px 0 14px; }
.ov-conv-lede { font-size: 16px; line-height: 1.6; color: var(--ink-2); max-width: 42ch; margin-bottom: 26px; }

/* De drie contactroutes */
.ov-routes { list-style: none; margin: 0; padding: 0; background: var(--bg); border: 0.5px solid var(--line); }
.ov-routes li + li { border-top: 0.5px solid var(--line); }
.ov-route {
  display: flex;
  align-items: center;
  gap: 16px;
  min-height: 68px;
  padding: 14px 20px;
  transition: background .2s ease;
}
.ov-route-txt { flex: 1; min-width: 0; }
.ov-route-txt b { display: block; font-size: 15.5px; font-weight: 500; letter-spacing: -0.01em; }
.ov-route-txt span { display: block; font-size: 13px; color: var(--ink-2); line-height: 1.45; margin-top: 2px; }
.ov-route-ico { width: 18px; height: 18px; stroke: var(--accent); fill: none; stroke-width: 1.5; flex-shrink: 0; }
.ov-route-arrow { font-size: 15px; color: var(--ink-2); transition: transform .2s ease; }
.ov-route:hover { background: rgba(45,74,62,0.045); }
.ov-route:hover .ov-route-arrow { transform: translateX(3px); }
.ov-route:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }

.ov-route-primary { background: var(--accent); color: #FFFFFF; }
.ov-route-primary .ov-route-txt span { color: rgba(255,255,255,0.72); }
.ov-route-primary .ov-route-ico { stroke: #FFFFFF; }
.ov-route-primary .ov-route-arrow { color: rgba(255,255,255,0.8); }
.ov-route-primary:hover { background: var(--accent-hover); }
.ov-routes li:first-child .ov-route-primary { border-top: none; }

.ov-fine { margin-top: 14px; font-size: 12.5px; line-height: 1.6; color: var(--ink-2); }

/* Bewijskolom */
.ov-ba { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.ov-ba figure { position: relative; margin: 0; aspect-ratio: 4 / 5; overflow: hidden; background: var(--bg-3); }
.ov-ba img { width: 100%; height: 100%; object-fit: cover; }
.ov-ba figcaption {
  position: absolute;
  left: 10px; top: 10px;
  background: rgba(26,26,26,0.72);
  color: var(--bg);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  padding: 5px 9px;
}
.ov-ba-note { margin-top: 10px; font-size: 12.5px; color: var(--ink-2); }
.ov-quote {
  margin: 20px 0 0;
  padding: 22px 24px;
  background: var(--bg);
  border: 0.5px solid var(--line);
}
.ov-quote-text {
  font-family: var(--serif);
  font-style: italic;
  font-size: 17px;
  line-height: 1.5;
  letter-spacing: -0.01em;
  color: var(--ink);
  margin: 10px 0 14px;
}
.ov-quote-meta { font-family: var(--sans); font-style: normal; font-size: 13px; color: var(--ink-2); }
.ov-quote-meta cite { display: block; color: var(--ink); font-weight: 500; font-size: 14px; font-style: normal; }

/* ─── Responsive ──────────────────────────────────────────── */
@media (max-width: 1000px) {
  .ov-hero-grid { grid-template-columns: 1fr; gap: 44px; }
  .ov-hero-col { max-width: 620px; }
  .ov-shot { max-width: 520px; }
  .ov-conv-grid { grid-template-columns: 1fr; gap: 40px; }
}

@media (max-width: 860px) {
  /* De cookiebalk staat op mobiel bovenaan en ligt ÓVER de nav (z-index 9999
     tegen 100). De hero moet dus onder de balk uitkomen, niet onder nav + balk
     opgeteld — vandaar max() en niet een optelling. */
  .ov-hero { padding: 84px 0 56px; padding-top: max(84px, calc(var(--ov-cookie, 0px) + 14px)); }
  /* De eyebrow kost een regel die we in de eerste schermvulling niet hebben.
     De locatie staat op mobiel in de bewijsregel onderaan de hero. */
  .ov-eyebrow { display: none; }
  .ov-h1 { margin-bottom: 14px; }
  .ov-sub { font-size: 15px; margin-bottom: 15px; }
  .ov-price { margin-bottom: 17px; padding: 13px 0 12px; }
  .ov-price-num { font-size: 30px; }
  .ov-price-list li { font-size: 13px; line-height: 1.45; padding: 1px 0 1px 14px; }
  .ov-price-list li::before { top: 10px; }
  .ov-actions { flex-direction: column; align-items: stretch; gap: 10px; }
  .ov-actions .btn { width: 100%; justify-content: center; }
  .ov-proof { margin-top: 16px; font-size: 12.5px; }
  .ov-conv { padding: 56px 0; }
  .ov-route { min-height: 64px; padding: 13px 16px; }
}

@media (max-width: 400px) {
  .ov-h1 { font-size: 32px; }
  .ov-price-num { font-size: 28px; }
}

/* Korte schermen: nog een tandje strakker zodat alles boven de vouw blijft */
@media (max-width: 860px) and (max-height: 700px) {
  .ov-hero { padding-top: max(76px, calc(var(--ov-cookie, 0px) + 12px)); }
  .ov-sub { margin-bottom: 14px; }
  .ov-price { margin-bottom: 16px; }
}

@media (prefers-reduced-motion: reduce) {
  .ov-hero, .ov-route, .ov-route-arrow { transition: none; }
}

/* ============================================================
   ROTERENDE REVIEWS + BEWEGING
   Eén blok CSS dat op alle 353 pagina's werkt.
   ============================================================ */

/* --- Reviewcarrousel --- */
.review-grid.ov-carousel{
  display:flex; gap:20px; overflow-x:auto; scroll-snap-type:x mandatory;
  scroll-behavior:smooth; -webkit-overflow-scrolling:touch;
  padding-bottom:6px; margin-bottom:18px;
  scrollbar-width:none;
}
.review-grid.ov-carousel::-webkit-scrollbar{display:none}
.review-grid.ov-carousel > .review{
  flex:0 0 calc((100% - 40px)/3); scroll-snap-align:start; min-width:0;
  transition:transform .45s cubic-bezier(.16,1,.3,1), box-shadow .45s cubic-bezier(.16,1,.3,1);
}
.review-grid.ov-carousel > .review:hover{transform:translateY(-4px); box-shadow:0 18px 44px rgba(26,26,26,.10)}
@media(max-width:900px){.review-grid.ov-carousel > .review{flex:0 0 calc((100% - 20px)/2)}}
/* 87 in plaats van 100: de volgende kaart piept 27px uit beeld, zodat zichtbaar is
   dat er meer staat en dat je kan slepen. Op 100 liep de kaart exact tot de rand. */
@media(max-width:620px){.review-grid.ov-carousel > .review{flex:0 0 87%}}

.ov-dots{display:flex; gap:8px; justify-content:center; align-items:center; margin-top:4px}
.ov-dot{
  width:7px;height:7px;border-radius:50%;border:0;padding:0;cursor:pointer;
  background:rgba(45,74,62,.22); transition:all .35s cubic-bezier(.16,1,.3,1);
}
.ov-dot.is-on{background:var(--accent,#2D4A3E); width:22px; border-radius:4px}

/* --- Reveal met trapsgewijze vertraging --- */
.js .reveal{will-change:opacity,transform}
.js .reveal.visible{transition-delay:var(--ov-delay,0ms)}

/* --- Kaarten die reageren --- */
.svc,.realisatie-card,.showcase-card,.trust-item{
  transition:transform .5s cubic-bezier(.16,1,.3,1), box-shadow .5s cubic-bezier(.16,1,.3,1);
}
.svc:hover,.realisatie-card:hover,.showcase-card:hover{
  transform:translateY(-5px); box-shadow:0 20px 48px rgba(26,26,26,.11);
}
.realisatie-card .ba img{transition:transform 1.1s cubic-bezier(.16,1,.3,1)}
.realisatie-card:hover .ba img{transform:scale(1.035)}

/* --- Knoppen --- */
.btn{transition:transform .28s cubic-bezier(.16,1,.3,1), background .28s ease, box-shadow .28s ease}
.btn:hover{transform:translateY(-2px)}
.btn-primary:hover{box-shadow:0 12px 28px rgba(45,74,62,.26)}
.btn .arrow,.btn span.arrow{display:inline-block; transition:transform .28s cubic-bezier(.16,1,.3,1)}
.btn:hover .arrow{transform:translateX(4px)}

/* --- Hero-beeld ademt mee bij het scrollen --- */
.js .ov-shot-main img{transform:translateY(var(--ov-par,0px)) scale(1.04); transition:transform .1s linear}

/* --- Links in de tekst --- */
.seo-text a,.review-text a{
  background-image:linear-gradient(currentColor,currentColor);
  background-size:0% 1px; background-position:0 100%; background-repeat:no-repeat;
  transition:background-size .35s cubic-bezier(.16,1,.3,1); text-decoration:none;
}
.seo-text a:hover,.review-text a:hover{background-size:100% 1px}

@media (prefers-reduced-motion: reduce){
  .review-grid.ov-carousel{scroll-behavior:auto}
  .svc,.realisatie-card,.showcase-card,.btn,.realisatie-card .ba img,.js .ov-shot-main img{transition:none}
  .svc:hover,.realisatie-card:hover,.showcase-card:hover,.btn:hover{transform:none}
}

/* ============================================================
   OFFERTEPAGINA: het formulier in het eerste scherm
   Op mobiel stapelt de tweekoloms-hero. Zonder ingreep zakt het
   formulier onder de tekst, en dan is een advertentieklik van
   €4,20 drie schermen ver van het enige wat telt.
   ============================================================ */
@media (max-width: 900px){
  .offer-grid{display:flex; flex-direction:column}
  .offer-grid .hero-text{display:contents}
  .offer-grid .offer-h1{order:1}
  .offer-grid #offerte-top{order:2; margin:18px 0 20px}
  .offer-grid .offer-sub{order:3}
  .offer-grid .hero-actions{order:4}
  .offer-grid .hero-text > div{order:5}
}
#offerte-top{scroll-margin-top:90px}


/* ============================================================
   LAAG 12 — AFWERKING
   Eén blok, achteraan, zodat het altijd wint van wat erboven
   staat. Werkt op alle 353 pagina's. Alles hieronder is CSS die
   bestaande markup opwaardeert: geen enkele regel verwacht een
   nieuwe class in de HTML.

   Inhoud
     12.1  Tokens
     12.2  Focus, selectie en toetsenbord
     12.3  Typografie en ritme
     12.4  Voor/na-schuif
     12.5  Beelden die nog laden
     12.6  Reviews: kaarten, carrousel, bolletjes
     12.7  Vertrouwen: score, keurmerken, fotorapport
     12.8  Dienstenkaarten
     12.9  Tabellen
     12.10 Kaarten, vlakken en vormtaal
     12.11 Navigatie en zwevende knoppen
     12.12 Beweging: reveals, knoppen, prefers-reduced-motion
   ============================================================ */

/* ─── 12.1 Tokens ─────────────────────────────────────────── */
:root {
  /* Eén curve voor alles wat binnenkomt, één voor alles wat
     reageert op een aanwijzer. Niet meer dan twee. */
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-io:  cubic-bezier(0.4, 0, 0.2, 1);

  --dur-1: 140ms;   /* kleur, opaciteit: bijna direct */
  --dur-2: 220ms;   /* knoppen, kaarten */
  --dur-3: 320ms;   /* panelen, popup */
  --dur-4: 560ms;   /* reveals, schuif die zichzelf verzet */

  /* Twee hoogtes. Meer heeft een vlakke, papieren site niet nodig. */
  --lift-1: 0 1px 2px rgba(26,26,26,0.04), 0 6px 16px rgba(26,26,26,0.05);
  --lift-2: 0 2px 4px rgba(26,26,26,0.05), 0 18px 40px rgba(26,26,26,0.10);

  --focus-ring: var(--accent);
  --focus-ring-light: #F8F5ED;

  /* Bewijskleuren voor tabellen. Groen is het merk, roest is de
     waarschuwing: allebei gedempt zodat het geen dashboard wordt. */
  --good: #2D4A3E;
  --good-bg: rgba(45,74,62,0.055);
  --bad: #9A4A2F;
  --bad-bg: rgba(154,74,47,0.05);
}

/* Hier stond @property --pos, zodat de browser tússen twee standen van
   de voor/na-schuif kon animeren. Dat werkte, maar een geregistreerde
   eigenschap met inherits:true krijgt een initiële waarde op de wortel
   en wordt dus als getypeerde waarde berekend en bewaard voor élk
   element op de pagina — ook op de driehonderd elementen die niets met
   een schuif te maken hebben. Gemeten op /crepi-reinigen-brugge/ liep de
   stijlberekening daardoor van 52 ms naar 141 ms.
   De overgang zit nu op clip-path en left zelf, één laag lager: zelfde
   beweging, en alleen de schuif betaalt ervoor. */

/* ─── 12.2 Focus, selectie en toetsenbord ─────────────────── */
/* Er stond één focus-regel in het hele bestand. Wie met het
   toetsenbord door een offerteformulier gaat, zag dus niet waar
   hij stond. :where() houdt de specificiteit op 0, zodat elke
   component hieronder dit nog kan overschrijven. */
:where(a, button, summary, [tabindex], input, select, textarea):focus-visible {
  outline: 2px solid var(--focus-ring);
  outline-offset: 3px;
}
/* Op de donkere vlakken is het groen niet zichtbaar. */
:where(footer, .cta-section, .svc, nav .nav-cta, .ov-route-primary, .mobile-cta,
       #floatContact, .mobile-sticky-offerte) :where(a, button, [tabindex]):focus-visible,
.nav-cta:focus-visible,
.ov-route-primary:focus-visible,
.mobile-cta:focus-visible,
.svc:focus-visible {
  outline: 2px solid var(--focus-ring-light);
  outline-offset: 3px;
}
/* Binnen een beeld of kaart past de ring beter net binnen de rand. */
.svc:focus-visible,
.realisatie-card a:focus-visible,
.ba:focus-visible { outline-offset: -3px; }

/* Muisklik mag geen ring geven, toetsenbord altijd wel. */
:where(a, button, summary):focus:not(:focus-visible) { outline: none; }

/* Overslaan-link die op sommige pagina's bestaat maar nergens
   zichtbaar werd gemaakt. */
a[href="#main"], a[href="#content"], .skip-link {
  position: absolute; left: 12px; top: -60px; z-index: 200;
  background: var(--accent); color: #fff; padding: 12px 18px;
  font-size: 14px; font-weight: 500; transition: top var(--dur-2) var(--ease-out);
}
a[href="#main"]:focus, a[href="#content"]:focus, .skip-link:focus { top: 12px; }

/* ─── 12.3 Typografie en ritme ────────────────────────────── */
/* Koppen die over meerdere regels lopen kregen een losse hangende
   staart ("per m²?" alleen op regel drie). balance verdeelt ze. */
h1, h2, h3, .h-display, .h1, .h2, .h3,
.svc-title, .step h4, .review-stat .num, .faq-item summary,
.showcase-card h4, .realisatie-card h4, .ai-q h3 {
  text-wrap: balance;
}
/* En bij korte tekst alleen de laatste regel, zodat er nooit één woord
   alleen achterblijft. Bewust niet op elke <p> en <li>: pretty laat de
   browser vooruitkijken over de laatste regels, en op een pagina met
   honderden alinea's kost dat gemeten zo'n 85 ms extra rekenwerk voor
   een verschil dat je in lopende tekst nauwelijks ziet. Hier staat het
   waar de regel kort is en één los woord meteen opvalt. */
figcaption, .lede, .hero-sub, .ov-sub, .svc-desc, .ov-price-list li,
.review-text, .step p, .ov-route-txt span, .trust-item .label,
.showcase-card .meta, .ba-caption, .ov-shot-cap, .ov-fine, .ov-ba-note {
  text-wrap: pretty;
}

/* Superscripten waren op de prijspagina bijna even groot als de
   kop: "per m²" brak de regel open. Dit zet ze terug op hun plaats
   zonder de regelhoogte te verstoren. */
sup, sub {
  font-size: 0.62em;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
  font-feature-settings: 'sups' 0;
}
sup { top: -0.48em; }
sub { bottom: -0.22em; }
/* In een display-kop mag hij nog een tik kleiner. */
.h-display sup, .h1 sup, .h2 sup, .h3 sup { font-size: 0.44em; top: -0.72em; }

/* Cijfers die onder elkaar staan moeten uitlijnen: prijzen,
   telefoonnummers, tabellen, scores. */
.compare-table, .intent-table, .stat-row, .ov-price-num, .ov-price-list,
.trust-item .num, .review-stat .num, .ov-tel, .contact-row .value,
.case-meta strong, .result-card h4 {
  font-variant-numeric: tabular-nums;
}

/* Twee secties op dezelfde achtergrond gaven 200 px leegte plus de
   eigen marge van de inhoud. Op de prijspagina viel daardoor een
   gat van bijna een half scherm tussen de tabel en de volgende kop. */
.section + .section { padding-top: 56px; }
.section + .section-tight, .section-tight + .section { padding-top: 48px; }
@media (max-width: 860px) {
  .section + .section { padding-top: 38px; }
  .section + .section-tight, .section-tight + .section { padding-top: 32px; }
}
/* De kop van een sectie mag dichter bij zijn eigen inhoud staan dan bij
   de sectie erboven. 56 px was overal hetzelfde, ook onder een kop van
   twee regels van 60 px. */
.section-head { margin-bottom: 48px; }
@media (max-width: 860px) { .section-head { margin-bottom: 32px; } }

/* De kop-en-tekst-verhouding in een section-head: de lede stond
   op de basislijn van een kop van 60 px en zweefde daardoor los. */
.section-head .lede { max-width: 46ch; }
.section-head > div > .eyebrow + h2,
.section-head > div > .eyebrow + .h-display { margin-top: 14px; }

/* Leestekst: 75 tekens is de bovengrens waarop het oog nog
   terugvindt waar de volgende regel begint. */
.seo-text p, .seo-text ul li, .ai-q p, .expert-box, .ai-entity-note { max-width: 72ch; }
.faq-item p { max-width: 70ch; }

/* ─── 12.4 Voor/na-schuif ─────────────────────────────────── */
/* Dit is het element dat het werk verkoopt en het stond het
   dichtst bij "goedkoop": geen focus, geen toetsenbord, geen
   overgang, en een greep die niet vertelde dat je hem vast kan
   pakken. */
.ba {
  cursor: grab;
  /* De schuif krijgt zijn eigen laag zodat clip-path en de greep
     samen op de GPU blijven en het scrollen niet raken. */
  will-change: auto;
  outline-offset: -3px;
}
.ba:active { cursor: grabbing; }

/* De positie animeert als de bezoeker klikt, met de pijltjes werkt of
   als de schuif zichzelf één keer voorstelt. Tijdens het slepen staat de
   overgang uit, want daar moet de greep exact onder de vinger blijven. */
.ba:not(.is-drag) .ba-before { transition: -webkit-clip-path 420ms var(--ease-out), clip-path 420ms var(--ease-out); }
.ba:not(.is-drag) .ba-handle { transition: left 420ms var(--ease-out), box-shadow var(--dur-2) var(--ease-io); }
.ba:not(.is-drag)::before { transition: left 420ms var(--ease-out), opacity var(--dur-3) var(--ease-io); }

/* Greep: een lijn, een schijf en twee chevrons. De schijf wordt
   groter zodra je hem aanraakt, zodat hij zich als knop aankondigt. */
.ba-handle::before {
  transition: transform var(--dur-2) var(--ease-out), box-shadow var(--dur-2) var(--ease-out);
  box-shadow: 0 4px 14px rgba(0,0,0,0.25), 0 0 0 0.5px rgba(26,26,26,0.06);
}
.ba:hover .ba-handle::before { transform: translate(-50%, -50%) scale(1.06); }
.ba.is-drag .ba-handle::before {
  transform: translate(-50%, -50%) scale(0.97);
  box-shadow: 0 2px 8px rgba(0,0,0,0.3), 0 0 0 0.5px rgba(26,26,26,0.08);
}
.ba:focus-visible .ba-handle::before {
  box-shadow: 0 4px 14px rgba(0,0,0,0.25), 0 0 0 3px var(--accent);
}
.ba-handle::after { transition: transform var(--dur-2) var(--ease-out); }
.ba.is-drag .ba-handle::after { transform: translate(-50%, -50%) scale(0.92); }

/* Zolang de bezoeker de schuif nog niet aangeraakt heeft staat er
   een fluistering onder de greep. Zodra hij sleept is die weg en
   komt hij niet terug. */
.ba::before {
  content: 'Sleep';
  position: absolute;
  left: var(--pos);
  top: calc(50% + 38px);
  transform: translateX(-50%);
  z-index: 6;
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: #FFFFFF;
  background: rgba(26,26,26,0.62);
  padding: 5px 9px;
  pointer-events: none;
  white-space: nowrap;
  opacity: 0;
  transition: opacity var(--dur-3) var(--ease-io);
}
.ba.is-ready::before { opacity: 1; }
.ba.is-touched::before { opacity: 0; }
@media (max-width: 860px) { .ba::before { top: calc(50% + 33px); } }

/* De labels VOOR en NA dragen het bewijs. Ze stonden op een
   halftransparant blokje dat over een lichte lucht wegviel. */
.ba-tag {
  border: 0.5px solid rgba(248,245,237,0.18);
  font-variant-numeric: tabular-nums;
}
/* Hier stond een opacity die met clamp() uit --pos werd gerekend, zodat
   een label vervaagde als je de schuif naar die kant duwde. Mooi, maar
   --pos is een geërfde eigenschap: elke wijziging maakte de stijl van de
   hele subboom ongeldig, elk frame, voor elke schuif op de pagina. Op
   /crepi-reinigen-brugge/ staan er dertien, op /realisaties/ eenentwintig.
   Gemeten tijdens het scrollen liep de stijlberekening daardoor op van
   48 ms naar 140 ms. Het label blijft nu gewoon staan. */

.ba-caption { align-items: baseline; gap: 20px; }

/* ─── 12.5 Beelden die nog laden ──────────────────────────── */
/* De lijsten met realisaties laden tientallen foto's lazy. Zonder iets
   ertussen klapt er een wit gat open en daarna ineens een beeld. De
   houder heeft al een vaste verhouding, dus geef hem de kleur van het
   papier: dan staat er een rustig vlak op precies de goede plek en
   verspringt er niets zodra de foto binnenkomt.

   Wat hier NIET meer staat: opacity:0 op lazy beelden met een fade
   eroverheen. Dat zag er beter uit, maar het beeld is dan pas zichtbaar
   nadat JS het heeft vrijgegeven — en op de stadspagina's is dat net het
   grootste beeld op het scherm. Gemeten: LCP ging van 280 ms naar 956 ms.
   Een fade van 300 ms is dat niet waard. */
.ba, .ov-shot-main, .ov-shot-inset, .ov-ba figure, .svc, .video-wrap,
.realisatie-card .ba, .showcase-card .ba {
  background-color: var(--bg-3);
}
/* Beelden zonder breedte/hoogte in de HTML mogen de pagina niet laten
   verspringen zodra ze binnenkomen. */
.realisatie-card .ba, .showcase-card .ba { contain: layout paint; }

/* ─── 12.6 Reviews ────────────────────────────────────────── */
.review {
  position: relative;
  padding: 30px 26px 26px;
  border-color: var(--line);
}
/* Een aanhalingsteken in de serif, ver weggezet. Het maakt van een
   kader met tekst een citaat. */
.review::before {
  content: '\201C';
  position: absolute;
  top: 10px; right: 18px;
  font-family: var(--serif);
  font-size: 64px;
  line-height: 1;
  color: var(--accent);
  opacity: 0.10;
  pointer-events: none;
}

.review-text { font-size: 15.5px; line-height: 1.6; }
.review-author { padding-top: 18px; gap: 3px; }
.review-author strong { font-size: 14.5px; letter-spacing: -0.01em; }

/* De bron stond er als "Google · ⭐⭐⭐⭐⭐": kleuremoji naast een
   rij sterren die de site zelf al tekent. Grijstinten halen de
   felle geel-oranje eruit; de tekst eromheen is toch al grijs. */
.review-source {
  font-size: 10.5px;
  letter-spacing: 0.08em;
}

.review-toggle {
  transition: opacity var(--dur-1) var(--ease-io);
  text-underline-offset: 3px;
  min-height: 32px;
}
.review-toggle:hover { text-decoration: underline; }

/* Sterren: de bestaande clip-path gaf een ster met een zichtbaar
   scheve onderpunt op sommige maten. Iets meer contrast en een
   vaste maat maakt de rij rustiger. */
.review-stars span, .trust-stars span, .ov-stars span {
  flex-shrink: 0;
}

/* Carrousel */
.review-grid.ov-carousel {
  /* Ademruimte links/rechts zodat de schaduw van een gelifte kaart
     niet wordt afgesneden door de scrollrand. */
  padding: 6px 2px 10px;
  margin-bottom: 14px;
  scroll-padding-left: 2px;
  overscroll-behavior-x: contain;
}
.review-grid.ov-carousel > .review:hover { box-shadow: var(--lift-2); }

/* Bolletjes: 7 px was een raakvlak van 7 px. Nu een raakvlak van
   44 px met een merkteken van 7 px erin — de norm voor een vinger. */
.ov-dots { gap: 2px; margin-top: 2px; }
.ov-dot {
  position: relative;
  width: 7px; height: 7px;
  margin: 0 5px;
  background: rgba(45,74,62,0.20);
  transition: background var(--dur-3) var(--ease-out),
              width var(--dur-3) var(--ease-out),
              border-radius var(--dur-3) var(--ease-out);
}
.ov-dot::after {
  content: '';
  position: absolute;
  top: 50%; left: 50%;
  width: 44px; height: 44px;
  transform: translate(-50%, -50%);
}
.ov-dot:hover { background: rgba(45,74,62,0.45); }
.ov-dot.is-on { background: var(--accent); width: 22px; border-radius: 4px; }
.ov-dot:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }

/* Een rand die vertelt dat er nog kaarten naast staan. */
.ov-carousel-wrap { position: relative; }

/* ─── 12.7 Vertrouwen ─────────────────────────────────────── */
/* De score stond als losse tekstregel onder de knoppen: vijf
   sterretjes, "5,0 op Google · 50 reviews", klaar. Het is een link
   naar het echte profiel, maar niets liet dat zien. Nu is het een
   kaartje met een rand dat je kan aanklikken. */
.ov-proof-row:not(.ov-proof-row-2) {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 8px 14px 8px 12px;
  background: var(--bg);
  border: 0.5px solid var(--line-2);
}

.ov-proof-row:not(.ov-proof-row-2) a { display: inline-flex; align-items: center; gap: 9px; }
.ov-proof-row:not(.ov-proof-row-2) strong {
  font-weight: 600;
  font-size: 14px;
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
}
/* Pijltje dat zegt: dit gaat ergens heen. */
.ov-proof-row:not(.ov-proof-row-2)::after {
  content: '↗';
  font-size: 11px;
  color: var(--ink-3);
  transition: transform var(--dur-2) var(--ease-out), color var(--dur-2) var(--ease-io);
}
.ov-proof-row:not(.ov-proof-row-2):hover::after { transform: translate(2px, -2px); color: var(--accent); }

/* "Verzekerd · actief sinds 2022 · West- en Oost-Vlaanderen" was
   de derde platte regel op rij. Een schildje ervoor en een lichte
   scheidingslijn maken er een keurmerkregel van. */
.ov-proof-row-2 {
  display: flex;
  align-items: center;
  /* .ov-proof-row zet flex-wrap:wrap. Zonder dit sprong het schildje op
     een eigen regel zodra de tekst niet meer paste, en stond er een los
     icoontje boven een zin. */
  flex-wrap: nowrap;
  gap: 8px;
  margin-top: 12px;
  padding-top: 12px;
  border-top: 0.5px solid var(--line);
  color: var(--ink-2);
  font-size: 12.5px;
  letter-spacing: 0.005em;
}
.ov-proof-row-2::before {
  content: '';
  width: 14px; height: 14px;
  flex-shrink: 0;
  background: var(--accent);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z'/%3E%3Cpath d='m9 12 2 2 4-4'/%3E%3C/svg%3E") center/contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z'/%3E%3Cpath d='m9 12 2 2 4-4'/%3E%3C/svg%3E") center/contain no-repeat;
}

/* Het scoreblok bij de reviewsectie: los getal naast losse sterren.
   Nu een kader dat als een keurmerk leest. */
.review-stat {
  border: 0.5px solid var(--line-2);
  padding: 18px 24px;
  align-items: center;
}

.review-stat .num { font-size: 40px; line-height: 1; font-variant-numeric: tabular-nums; }
.review-stat .meta { display: block; margin-top: 5px; letter-spacing: 0.02em; }
.review-stat .review-stars { margin-bottom: 0; }

/* Het fotorapport. Twee foto's naast elkaar is bewijs, maar het zag
   eruit als twee losse plaatjes. Eén kader eromheen, een haarlijn
   ertussen, en labels die op elkaar afgestemd staan: dan lees je
   het als één opname van hetzelfde standpunt. */
.ov-ba {
  gap: 0;
  border: 0.5px solid var(--line-2);
  background: var(--line-2);
  padding: 0.5px;
  column-gap: 0.5px;
}
.ov-ba figure { background: var(--bg-3); }
.ov-ba figcaption {
  border: 0.5px solid rgba(248,245,237,0.2);
  left: 12px; top: 12px;
}
.ov-ba-note {
  padding-left: 16px;
  position: relative;
  line-height: 1.55;
}
.ov-ba-note::before {
  content: '';
  position: absolute;
  left: 0; top: 8px;
  width: 8px; height: 0.5px;
  background: var(--accent);
}

/* Citaat in de conversiekolom */
.ov-quote { position: relative; }
.ov-quote:hover { border-color: rgba(45,74,62,0.3); }
.ov-quote-meta cite { letter-spacing: -0.01em; }

/* De cijferrij in de hero (werven, jaren, garantie) */
.trust-item .num { font-variant-numeric: tabular-nums; letter-spacing: -0.045em; }
.trust-item .label { letter-spacing: 0.06em; text-transform: uppercase; font-size: 11px; }

/* Werkgebied, garantie en verzekering in de contactkaart:
   waarden rechts uitlijnen leest als een specificatieblad. */
.contact-row .value { font-variant-numeric: tabular-nums; }

/* ─── 12.8 Dienstenkaarten ────────────────────────────────── */
/* Hier zat een echte fout. .svc-content staat op space-between.
   Kaart 1 heeft een label bovenaan én een tekstblok onderaan, dus
   die verdeelt netjes. Kaart 2 en 3 hebben géén label, dus schoof
   hun enige kind naar bóven — pal over een lichte lucht en een
   rode baksteenmuur. "Gevels" en "B2B" waren daardoor nauwelijks
   leesbaar, terwijl de zwarte verloop onderaan leeg bleef. */
.svc-content { justify-content: flex-end; }
.svc-tag { margin-bottom: auto; }

/* Het verloop liep pas vanaf 30% en haalde 0.85. Over een felle
   lucht is dat te weinig voor witte tekst van 14 px. */
.svc::after {
  background: linear-gradient(180deg,
              rgba(26,26,26,0) 34%,
              rgba(26,26,26,0.42) 62%,
              rgba(26,26,26,0.88) 100%);
  transition: opacity var(--dur-3) var(--ease-io);
}
.svc:hover::after { opacity: 0.94; }
.svc-desc { opacity: 0.9; }
.svc-title { text-shadow: 0 1px 20px rgba(26,26,26,0.35); }
.svc-num { letter-spacing: 0.1em; opacity: 0.75; }
/* De pijl van de kaart schuift mee in plaats van de ruimte ervoor
   te rekken: gap animeren dwingt een layout op elke frame. */
.svc-cta { gap: 8px; transition: none; }
.svc-cta::after { content: ''; }
.svc:hover .svc-cta { gap: 8px; }
.svc-cta { position: relative; }

/* ─── 12.9 Tabellen ───────────────────────────────────────── */
/* Drie pagina's zetten .compare-table zonder .table-wrap eromheen,
   waaronder /gevelreiniging-prijs/. Op 390 px duwde de tabel de pagina
   daar 4 px breder dan het scherm.

   Eerst geprobeerd: de tabel zelf de scroller maken met display:block.
   Dat haalde de overloop weg, maar een tabel op display:block krimpt tot
   zijn inhoud terwijl de rand op 100% blijft staan — op 768 px stond de
   helft van het kader leeg naast de rijen.

   table-layout:fixed lost het bij de wortel op: de kolommen verdelen de
   beschikbare breedte onder elkaar en de tabel kán niet breder worden dan
   zijn houder. De inhoud loopt door op een tweede regel in plaats van
   buiten beeld. Meteen ook beter voor de 62 pagina's die wél een
   .table-wrap hebben: daar moest je zijwaarts scrollen om de laatste
   kolom te zien. */
@media (max-width: 760px) {
  .compare-table, .intent-table { table-layout: fixed; width: 100%; }
  .compare-table th, .compare-table td,
  .intent-table th, .intent-table td {
    padding: 12px 10px;
    overflow-wrap: break-word;
    hyphens: auto;
  }
  .compare-table td:last-child:not(.good):not(.bad) { white-space: normal; }
}

.compare-table { border: 0.5px solid var(--line-2); }
.compare-table thead th {
  /* Geen position:sticky hier. De navigatiebalk staat vast bovenaan op
     z-index 100; een plakkende koprij zou daar onderdoor schuiven en
     half achter de balk blijven hangen. De tabellen op deze site zijn
     vier rijen lang, dus er valt ook niets aan te plakken. */
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-weight: 600;
  padding: 13px 16px;
}
.compare-table td { font-size: 14.5px; line-height: 1.55; color: var(--ink-2); }
.compare-table td:first-child { color: var(--ink); }
.compare-table tbody tr { transition: background var(--dur-1) var(--ease-io); }
.compare-table tbody tr:hover { background: rgba(45,74,62,0.04); }
.compare-table tbody tr:last-child td { border-bottom: none; }

/* .good en .bad stonden wél in de HTML van de vergelijkingstabellen
   maar nergens in de CSS. De rij "Crepi Care softwash" — precies de
   rij die het verschil moet maken — zag er identiek uit als
   "Agressieve hogedruk". */
.compare-table td.good, .compare-table .good { color: var(--good); }
.compare-table td.bad, .compare-table .bad { color: var(--bad); }
.compare-table td.good, .compare-table td.bad { padding-left: 34px; position: relative; }
.compare-table td.good::before, .compare-table td.bad::before {
  content: '';
  position: absolute;
  left: 15px; top: 19px;
  width: 12px; height: 12px;
  background: currentColor;
}
.compare-table td.good::before {
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 13 4 4L19 7'/%3E%3C/svg%3E") center/contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 13 4 4L19 7'/%3E%3C/svg%3E") center/contain no-repeat;
}
.compare-table td.bad::before {
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 6 6 18M6 6l12 12'/%3E%3C/svg%3E") center/contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 6 6 18M6 6l12 12'/%3E%3C/svg%3E") center/contain no-repeat;
}
/* De rij die wij zijn, krijgt gewicht. */
.compare-table tbody tr:has(.good) { background: var(--good-bg); }
.compare-table tbody tr:has(.good):hover { background: rgba(45,74,62,0.09); }
.compare-table tbody tr:has(.good) td:first-child strong { font-weight: 600; color: var(--good); }
.compare-table tbody tr:has(.bad) td.bad { background: var(--bad-bg); }

/* Prijskolommen rechts uitlijnen als er alleen bedragen in staan. */
.compare-table td:last-child:not(.good):not(.bad) { white-space: nowrap; }

/* In de prijstabellen staat het label en de toelichting aan elkaar
   geplakt: <strong>Dakreiniging</strong>mos en algen. Dat las als
   "Dakreinigingmos en algen". De toelichting krijgt een eigen regel —
   op de 210 cellen waar de strong de hele cel is, verandert er niets. */
.compare-table td:first-child strong {
  display: block;
  margin-bottom: 2px;
  font-weight: 600;
  letter-spacing: -0.01em;
}
.compare-table td:first-child { color: var(--ink-2); }
.compare-table td:first-child strong { color: var(--ink); }

/* Ook de tweede tabelsoort meenemen, die op de AI-blokken staat. */
.intent-table { border-radius: 0; }
.intent-table th { background: var(--accent); font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; font-size: 11px; }
.table-wrap { position: relative; }

/* ─── 12.10 Kaarten, vlakken en vormtaal ──────────────────── */
/* De site is scherphoekig: haarlijnen, rechte hoeken, geen ronding.
   Een aantal later toegevoegde blokken kwam uit een ander sjabloon
   en bracht 16 px ronding en een marineblauw/bruin palet mee dat
   nergens anders voorkomt. Dat leest als een ingeplakt blok. */
.ai-entity-card, .ai-entity-note, .expert-box, .answer-block, .answer-card,
.wr-sec .wr-card, .wr-sec .wr-panel, .ai-q, .intent-table {
  border-radius: 0;
}
.ai-q { border-radius: 0; }

.answer-block {
  background: var(--bg-2);
  border: 0.5px solid var(--line);
}
.answer-block .eyebrow {
  color: var(--accent);
  font-weight: 500;
  letter-spacing: 0.2em;
  font-size: 11px;
}
.answer-block h2 { color: var(--ink); letter-spacing: -0.035em; font-weight: 600; }
.answer-block h3 { color: var(--ink); letter-spacing: -0.02em; font-weight: 500; }
.answer-block p, .answer-block ul { color: var(--ink-2); }

/* Eén familie: elk vlak met een haarlijn eromheen reageert hetzelfde.
   Dit stond eerst als zeven losse regelparen door het bestand heen; dat
   zijn zeven keer zoveel selectoren om tegen elke node te matchen, voor
   precies dezelfde drie eigenschappen. */
.rel-card, .service-tile, .result-card, .case-meta > div,
.answer-card, .ai-entity-card, .review, .review-stat, .wr-sec .wr-card,
.ov-proof-row:not(.ov-proof-row-2), .ov-quote {
  transition: border-color var(--dur-2) var(--ease-io),
              transform var(--dur-2) var(--ease-out),
              box-shadow var(--dur-2) var(--ease-out);
}
.rel-card:hover, .service-tile:hover, .result-card:hover,
.answer-card:hover, .ai-entity-card:hover, .review:hover,
.review-stat:hover, .wr-sec .wr-card:hover,
.ov-proof-row:not(.ov-proof-row-2):hover {
  border-color: rgba(45,74,62,0.42);
  transform: translateY(-2px);
  box-shadow: var(--lift-1);
}
.answer-card { background: var(--bg); border: 0.5px solid var(--line); box-shadow: none; }
.ai-entity-card { border: 0.5px solid var(--line); box-shadow: none; }
.answer-card strong { color: var(--ink); }
.answer-card a { color: var(--accent); font-weight: 500; }
.quick-links a { background: var(--accent); border-radius: 0; font-weight: 500; padding: 12px 16px; }
.quick-links a.secondary { background: transparent; color: var(--ink); border: 0.5px solid var(--line-2); }
.quick-links a { transition: background var(--dur-2) var(--ease-io), transform var(--dur-2) var(--ease-out); }
.quick-links a:hover { transform: translateY(-1px); }


.ai-entity-note, .expert-box { border: 0.5px solid var(--line); }
.wr-sec .wr-card { border: 0.5px solid var(--line); }


/* Vinkjes in de check-list stonden als tekst-glyph ✓, die per
   lettertype anders valt. Een vaste vorm valt altijd hetzelfde. */
.check-list li::before {
  content: '';
  top: 6px;
  width: 12px; height: 12px;
  background: var(--accent);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 13 4 4L19 7'/%3E%3C/svg%3E") center/contain no-repeat;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 13 4 4L19 7'/%3E%3C/svg%3E") center/contain no-repeat;
}
.wr-sec .wr-panel .check-list li::before { background: #FFFFFF; }
.cta-section .check-list li::before { background: var(--bg); }


/* FAQ: het plusteken draaide wel, maar de rij eromheen gaf geen
   enkel teken dat je erop kon klikken. */
.faq-item { transition: border-color var(--dur-2) var(--ease-io); }
.faq-item summary { padding: 2px 0; transition: color var(--dur-1) var(--ease-io); }
.faq-item summary:hover { color: var(--accent); }
.faq-item summary::after { transition: transform var(--dur-3) var(--ease-out), color var(--dur-1) var(--ease-io); }
.faq-item summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
.faq-item[open] { border-bottom-color: var(--line-2); }
.faq-item[open] p { animation: ov-faq-in var(--dur-3) var(--ease-out) both; }
@keyframes ov-faq-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }

/* De aside met cijfers naast de SEO-tekst */
.seo-aside { border-left-width: 2px; }
.stat-row span:last-child { font-variant-numeric: tabular-nums; }

/* ─── 12.11 Navigatie en zwevende knoppen ─────────────────── */
/* backdrop-filter kost elke scrollframe een blur over de volle
   breedte. Zodra de balk 94% dekkend is, ziet niemand die blur nog;
   dan mag hij eraf. Scheelt werk op elke pagina, elke scroll. */
nav.scrolled { backdrop-filter: none; -webkit-backdrop-filter: none; }
nav { transition: background var(--dur-3) var(--ease-io), padding var(--dur-2) var(--ease-io), border-color var(--dur-3) var(--ease-io); }
.nav-links a { position: relative; transition: color var(--dur-1) var(--ease-io); }
.nav-links a:not(.nav-cta)::after {
  content: '';
  position: absolute;
  left: 0; right: 0; bottom: -5px;
  height: 1px;
  background: var(--accent);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--dur-2) var(--ease-out);
}
.nav-links a:not(.nav-cta):hover::after { transform: scaleX(1); }
.nav-links a:not(.nav-cta):hover { opacity: 1; color: var(--accent); }
.nav-links a.active::after { transform: scaleX(1); }
.nav-cta { transition: background var(--dur-2) var(--ease-io), transform var(--dur-2) var(--ease-out); }
.nav-cta:hover { transform: translateY(-1px); }

.menu-toggle { min-width: 44px; min-height: 44px; justify-content: center; }
.mobile-menu { transition: right var(--dur-3) var(--ease-out); }
.mobile-menu a { transition: padding-left var(--dur-2) var(--ease-out), color var(--dur-1) var(--ease-io); }
.mobile-menu a:hover, .mobile-menu a:focus-visible { padding-left: 6px; color: var(--accent); }
.mobile-menu .nav-cta:hover { padding-left: 24px !important; }

/* De zwevende bel- en WhatsApp-knoppen dekten op mobiel tekst af.
   Ze blijven staan, maar smaller en met een rand die ze van de
   pagina scheidt in plaats van eroverheen te liggen. */
#floatContact a {
  transition: transform var(--dur-2) var(--ease-out), box-shadow var(--dur-2) var(--ease-out);
  border: 1px solid rgba(255,255,255,0.16);
}
#floatContact a:hover { transform: translateY(-2px); }
#floatContact a:focus-visible { outline: 2px solid var(--focus-ring-light); outline-offset: 3px; }
/* Op desktop stonden er twee brede pillen permanent over de rechteronderhoek.
   Ze dekten daar het onderschrift van het hero-beeld af en het is de plek
   waar op elke pagina wél iets staat. Nu zijn het twee ronde knoppen die
   hun woord pas tonen als je erheen gaat: even bereikbaar, half zo groot. */
@media (min-width: 601px) {
  #floatContact a { padding: 0; width: 52px; justify-content: center; gap: 0; overflow: hidden;
                    transition: width var(--dur-3) var(--ease-out), gap var(--dur-3) var(--ease-out),
                                padding var(--dur-3) var(--ease-out), transform var(--dur-2) var(--ease-out),
                                box-shadow var(--dur-2) var(--ease-out); }
  #floatContact a .lbl { max-width: 0; opacity: 0; white-space: nowrap;
                         transition: max-width var(--dur-3) var(--ease-out), opacity var(--dur-2) var(--ease-io); }
  #floatContact a:hover, #floatContact a:focus-visible,
  #floatContact:hover a, #floatContact:focus-within a {
    width: auto; gap: 8px; padding: 0 20px 0 15px;
  }
  #floatContact:hover a .lbl, #floatContact:focus-within a .lbl { max-width: 120px; opacity: 1; }
}
@media (max-width: 600px) {
  #floatContact { right: 14px; bottom: 14px; gap: 8px; }
  #floatContact a { width: 48px !important; height: 48px; box-shadow: 0 6px 18px rgba(0,0,0,0.24); }
}
.mobile-cta { transition: transform var(--dur-3) var(--ease-out); min-height: 52px; }

/* Marquee: liep 45 s lineair rond en trok op zwakke toestellen een
   herschildering over de volle breedte. Op de GPU en met een
   duidelijke laag scheelt dat merkbaar. */
.marquee-track { will-change: transform; transform: translateZ(0); }
.marquee { contain: content; }

/* ─── 12.12 Beweging ──────────────────────────────────────── */
/* Reveals waren 900 ms. Dat is lang genoeg om te merken dat je op
   iets staat te wachten. 560 ms met een sterke uitloop leest als
   "het stond er al". */
.js .reveal {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity var(--dur-4) var(--ease-out), transform var(--dur-4) var(--ease-out);
}
.js .reveal.visible { opacity: 1; transform: none; }

/* Wat al bij het openen op het scherm staat, wordt niet eerst verstopt.
   Op de stadspagina's dragen de <h1> en de introzin een .reveal, dus de
   belangrijkste tekst van de pagina begon op opacity 0 en kwam pas
   tevoorschijn als het script eraan toe was. Een element met opacity 0
   telt voor de browser niet als getekend: de gemeten Largest Contentful
   Paint van /crepi-reinigen-brugge/ sloeg de h1 daardoor over en wees
   het logo aan. Wie op een advertentie klikt, kijkt intussen naar een
   lege bovenkant. Boven de vouw dus geen animatie — die hoort bij
   binnenscrollen, en daar valt niets binnen te scrollen. */
.js .reveal.is-direct { opacity: 1; transform: none; transition: none; }
/* De hero is op 350 van de 353 pagina's het enige <header> op de pagina,
   en staat per definitie boven de vouw. Dit hoeft dus niet gemeten te
   worden: het kan gewoon in de opmaak staan, en kost dan niets. */
.js header .reveal { opacity: 1; transform: none; transition: none; }
/* will-change stond permanent op élk reveal-element. Op de
   realisatiepagina zijn dat er tientallen, allemaal een eigen laag
   in het geheugen, ook lang nadat ze klaar waren. */
.js .reveal.visible { will-change: auto; }
.js .reveal:not(.visible) { will-change: opacity, transform; }

/* De hero-foto volgt het scrollen. Er stond een transition van
   100 ms op een transform die elke frame opnieuw wordt gezet: dat
   vecht met zichzelf en loopt zichtbaar achter. */
.js .ov-shot-main img {
  transform: translate3d(0, var(--ov-par, 0px), 0) scale(1.045);
  transition: none;
  will-change: transform;
}

/* Knoppen: één transitie, alleen transform, kleur en schaduw. */
.btn {
  transition: transform var(--dur-2) var(--ease-out),
              background var(--dur-2) var(--ease-io),
              color var(--dur-2) var(--ease-io),
              border-color var(--dur-2) var(--ease-io),
              box-shadow var(--dur-2) var(--ease-out);
  min-height: 48px;
}
.btn:active { transform: translateY(0) scale(0.988); }
.btn-ghost:hover { transform: translateY(-2px); }
.btn .arrow { transition: transform var(--dur-2) var(--ease-out); }

/* Iedereen die aangeeft geen beweging te willen, krijgt geen
   beweging. Ook geen carrousel die vanzelf doorklikt en geen
   parallax — die twee ontbraken. */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  .js .reveal { opacity: 1 !important; transform: none !important; }
  .js .ov-shot-main img { transform: scale(1.045) !important; }
  .ba { transition: none !important; }
  .ba::before { display: none; }
  .marquee-track { animation: none; }
}

/* Wie geen JS heeft (of bij wie het faalt) moet gewoon alles zien. */
@media (scripting: none) {
  .reveal { opacity: 1 !important; transform: none !important; }
}

/* De vaste offerteknop onderaan /realisaties/ loopt van rand tot rand
   (left:16px, right:16px), terwijl de zwevende bel- en WhatsApp-knoppen
   daar bovenop staan. Op 390 px viel "Vraag offerte aan" daardoor
   half achter de belknop. De balk op de andere pagina's houdt die ruimte
   al vrij (.mobile-cta staat op right:86px); deze deed dat niet. */
@media (max-width: 760px) {
  body.page-realisaties .mobile-sticky-offerte { right: 76px; }
}

/* Samenvattingsregel onder de dienstkeuze in de prijswidget */
.pw-sum{font:400 13px/1.6 var(--sans,system-ui);color:#5C5A52;margin:9px 0 0;min-height:1.6em}

/* Leesritme in de lange tekstblokken. Zonder dit lopen alinea's aan elkaar
   tot een muur en leest een pagina als een boek in plaats van als een uitleg. */
.container-narrow > p,
.container-narrow > ul,
.container-narrow > ol { max-width: 68ch; }
.container-narrow > p { font-size: 17px; line-height: 1.8; color: var(--ink-2); margin: 0 0 20px; }
.container-narrow > p:last-child { margin-bottom: 0; }
.container-narrow > h2 { margin-bottom: 22px; }
.container-narrow > h3 { font-size: 21px; line-height: 1.3; margin: 38px 0 14px; letter-spacing: -.01em; }
.container-narrow > h2 + p,
.container-narrow > h3 + p { margin-top: 0; }
.container-narrow > .check-list { margin: 8px 0 0; }
.container-narrow > .check-list li { margin-bottom: 14px; line-height: 1.75; }
.container-narrow > .faq-list { max-width: 100%; }
@media (max-width: 640px) {
  .container-narrow > p { font-size: 16px; line-height: 1.75; margin-bottom: 18px; }
  .container-narrow > h3 { font-size: 19px; margin: 30px 0 12px; }
}


/* De hero-foto stond geknepen in een kolom van 390px naast een titel van 60px.
   Beeld is hier het bewijs, dus het krijgt de bredere helft. */
.hero > .container { max-width: 1180px; }
.hero-split { grid-template-columns: minmax(0, 0.92fr) minmax(0, 1.08fr); gap: 64px; }
@media (max-width: 900px) {
  .hero > .container { max-width: 100%; }
  .hero-split { grid-template-columns: 1fr; gap: 40px; }
}

/* Foto's die tussen de tekst staan. */
.tekst-beeld { margin: 34px 0 6px; }
.tekst-beeld img { display: block; width: 100%; height: auto; }
.tekst-beeld figcaption {
  margin-top: 10px; font-size: 14px; line-height: 1.6; color: var(--ink-2);
}
.beeld-duo { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.beeld-duo figure { margin: 0; }
.beeld-duo .label {
  display: inline-block; margin-top: 8px; font-size: 12px; text-transform: uppercase;
  letter-spacing: .08em; color: var(--ink-2);
}
@media (max-width: 640px) { .beeld-duo { grid-template-columns: 1fr; gap: 18px; } }

/* De titel in een hero met beeld ernaast mag nooit breder worden dan zijn kolom.
   "Gevelreiniging" op 88px past niet in 500px en liep over de foto. */
.hero-split .hero-title { font-size: clamp(38px, 4.4vw, 62px); overflow-wrap: break-word; hyphens: auto; }
.hero-split .hero-text { min-width: 0; }
@media (max-width: 900px) {
  .hero-split .hero-title { font-size: clamp(36px, 8vw, 54px); }
}


/* ============================================================================
   VISUELE QA VAN 14-08-2026. Alles hieronder is gemeten op 390, 430, 768, 1280
   en 1600 breed, op tien pagina's.
   ============================================================================ */

/* De bolletjes onder de reviews activeerden de VERKEERDE review. Ze stonden 17px uit
   elkaar maar kregen elk een onzichtbaar raakvlak van 44px, dus de raakvlakken
   overlapten 27px en het laatste bolletje in de DOM won. Gemeten met elementFromPoint:
   vier van de zes raakten een ander bolletje. Nu is de knop zelf het raakvlak en tekent
   ::after de stip. */
.ov-dots { gap: 0; margin-top: 2px; }
.ov-dot {
  width: 24px; height: 44px;
  margin: 0; padding: 0; border: 0;
  background: none; border-radius: 0;
  display: grid; place-items: center;
}
.ov-dot::after {
  content: '';
  width: 7px; height: 7px;
  border-radius: 50%;
  background: rgba(45,74,62,0.20);
  transition: background var(--dur-3) var(--ease-out),
              width var(--dur-3) var(--ease-out),
              border-radius var(--dur-3) var(--ease-out);
}
.ov-dot:hover::after { background: rgba(45,74,62,0.45); }
.ov-dot.is-on { background: none; }
.ov-dot.is-on::after { background: var(--accent); width: 22px; border-radius: 4px; }

/* Raakvlakken op de norm van 44px. Alleen de hoogte, de vormtaal blijft.
   De cookieknoppen stonden op 35px en dat is de eerste tik die iemand doet. */
.cookie-accept, .cookie-decline { min-height: 44px; }
.cta-section .contact-row a.value { display: inline-flex; align-items: center; min-height: 44px; }
.review-toggle { min-height: 44px; }
.filter-bar .filter-btn { min-height: 44px; }
.foot-cities a { display: inline-block; padding: 6px 0; }

/* ============================================================================
   DE VRAGENSECTIE, 14-08-2026.
   Ze stond als een kale lijst over de volle breedte: een kop van 60px boven
   vragen van 18px, en 600px leegte tussen de vraag en het plusje. Nu draagt de
   kop de linkerkolom en staan de vragen rechts, zoals de rest van de site.
   ============================================================================ */
.section.faq > .container-narrow > .faq-list,
.section.faq > .container > .faq-list { margin-top: 8px; }

@media (min-width: 900px) {
  .section.faq > .container-narrow,
  .section.faq > .container.container-narrow {
    display: grid;
    grid-template-columns: minmax(0, 0.72fr) minmax(0, 1.28fr);
    column-gap: 72px;
    align-items: start;
  }
  .section.faq > .container-narrow > .eyebrow { grid-column: 1; grid-row: 1; margin: 0 0 14px; }
  .section.faq > .container-narrow > h2 { grid-column: 1; grid-row: 2; margin: 0 !important; font-size: clamp(28px, 2.6vw, 38px); line-height: 1.15; }
  .section.faq > .container-narrow > .faq-list { grid-column: 2; grid-row: 1 / span 4; margin-top: 0; }
}

/* De rij zelf: een vlak dat oplicht in plaats van een streepje met tekst erboven. */
.faq-item { border-bottom: 0.5px solid var(--line); padding: 0; }
.faq-item summary {
  padding: 20px 20px 20px 18px;
  font-size: 17px;
  border-radius: 0;
  transition: background var(--dur-2) var(--ease-io), color var(--dur-1) var(--ease-io);
}
.faq-item summary:hover { background: rgba(45,74,62,0.045); color: var(--accent); }
.faq-item[open] summary { background: rgba(45,74,62,0.045); color: var(--accent); }
.faq-item .faq-a { padding: 0 20px 22px 18px; background: rgba(45,74,62,0.045); }
.faq-item .faq-a p { margin-top: 0; }

/* Het plusje wordt een rond vlak dat zegt: hier kan je op duwen. */
.faq-item summary::after {
  content: '';
  width: 30px; height: 30px; flex-shrink: 0;
  border: 1px solid rgba(45,74,62,0.28);
  border-radius: 50%;
  background:
    linear-gradient(var(--accent), var(--accent)) center/11px 1.4px no-repeat,
    linear-gradient(var(--accent), var(--accent)) center/1.4px 11px no-repeat;
  transition: transform var(--dur-3) var(--ease-out), border-color var(--dur-1) var(--ease-io), background-color var(--dur-1) var(--ease-io);
}
.faq-item summary:hover::after { border-color: var(--accent); }
.faq-item[open] summary::after { transform: rotate(135deg); border-color: var(--accent); }

@media (max-width: 640px) {
  .faq-item summary { padding: 16px 12px 16px 12px; font-size: 16px; gap: 12px; }
  .faq-item .faq-a { padding: 0 12px 18px 12px; }
  .faq-item summary::after { width: 26px; height: 26px; }
}

/* De linkerkolom van de vragensectie stond leeg onder de kop. */
.faq-hulp {
  margin: 20px 0 0; font-size: 15px; line-height: 1.7; color: var(--ink-2); max-width: 30ch;
}
.faq-tel {
  display: inline-flex; align-items: center; min-height: 44px;
  margin-top: 10px; font-size: 17px; font-weight: 500;
  color: var(--accent); text-decoration: none;
  border-bottom: 1px solid rgba(45,74,62,.3);
}
.faq-tel:hover { border-bottom-color: var(--accent); }
@media (min-width: 900px) {
  .section.faq > .container-narrow > .faq-hulp { grid-column: 1; grid-row: 3; }
}


/* ============================================================================
   VORM EN RITME — 14-08-2026
   Gemeten met headless Chrome op 390, 768, 1280 en 1600 breed, op /,
   /crepi-reiniging/, /gevelreiniging/, /gevelreiniging-prijs/,
   /gevelreiniging-roeselare/ en /crepi-reinigen-met-bleekwater/.

   Alles hieronder hangt aan `body:has(header.hero)`. Reden: de artikelpagina's
   hebben een header.hero, de homepage een header.ov-hero. Zo raakt geen enkele
   regel hieronder de homepage. Een sibling-selector (.hero ~ section) kon niet:
   op /gevelreiniging-roeselare/ en /crepi-reinigen-met-bleekwater/ staan de
   secties in een <main> en op de andere drie niet.
   ============================================================================ */

/* ─── 1. EEN LINKERRAND PER PAGINA ─────────────────────────────────────────
   Gemeten op /crepi-reiniging/ bij 1280 breed: de hero begon op 82px, de
   lopende tekst op 182px en de showcase op 32px. Drie randen op een pagina.
   De hero-container (max 1180px) is nu de rand van alles wat eronder staat.
   De tekstkolom houdt exact haar breedte van 916px, maar wordt links
   verankerd in plaats van los gecentreerd. Het percentage in de marge rekent
   tegen de sectiebreedte en niet tegen 100vw, dus een schuifbalk verschuift
   de rand niet. Onder 1180px valt de max() terug op 0 en blijft de bestaande
   mobiele opvulling van 20px staan. */
body:has(header.hero) section > .container,
body:has(header.hero) footer > .container { max-width: 1180px; }
body:has(header.hero) section > .container-narrow {
  max-width: 980px;
  margin-left: max(0px, calc((100% - 1180px) / 2));
  margin-right: 0;
}

/* ─── 2. DE HERO: HET GAT VAN 350px BOVEN DE TITEL ─────────────────────────
   .hero-split stond op align-items:center. De rechterkolom was 1246px hoog
   (760px schuif + bijschrift + 434px tweede foto in een kader), de tekstkolom
   547px. (1246 − 547) / 2 = 350px leegte boven het woord "Crepi", en nog eens
   350px eronder. Gemeten, niet geschat.
   Nu bepaalt de tekst de hoogte van de hero en vult het beeld die hoogte.
   De ondergrens van 460px zorgt dat het beeld ook op een korte hero
   (Roeselare) een beeld blijft in plaats van een strook. */
@media (min-width: 901px) {
  .hero-split { align-items: stretch; }
  .hero-split > .hero-text { align-self: center; }
  .hero-split > *:not(.hero-text) {
    display: flex;
    flex-direction: column;
    min-width: 0;
  }
  /* flex-basis 0 én een expliciete min-height: anders valt min-height terug op
     auto, is de minimale hoogte van de schuif de natuurlijke hoogte van de foto
     (892px bij crepi-huis-14-na.webp op 595px breed) en bepaalt het beeld
     alsnog de hoogte van de rij. Gemeten: eerst 890px, nu 512px. */
  .hero-split > *:not(.hero-text) > .ba {
    flex: 1 1 0;
    aspect-ratio: auto;
    min-height: 460px;
    max-height: none;
  }
}

/* De hero stond op 80px onder en de eerste sectie op 100px boven: 180px leegte
   tussen de knoppen en de eerste kop, ook op de pagina's zonder beeld
   (/gevelreiniging-prijs/, /crepi-reinigen-met-bleekwater/). */
body:has(header.hero) .hero { padding-bottom: 64px; }
body:has(header.hero) .section:first-of-type,
body:has(header.hero) main > .section:first-of-type { padding-top: 64px; }

/* ─── 3. RITME: VERTICALE RUIMTE ───────────────────────────────────────────
   Elke sectie stond op 100px onder en 56px boven: 156px leegte tussen twee
   blokken met dezelfde achtergrond, twaalf keer na elkaar op een pagina van
   4000 woorden. Twee gewone secties zitten nu op 112px van elkaar. Een band
   houdt zijn eigen ademruimte, want daar is de leegte de rand van een vlak
   en niet een gat tussen twee alinea's. */
body:has(header.hero) .section { padding: 72px 0; }
body:has(header.hero) .section + .section { padding-top: 40px; }
body:has(header.hero) section.section[style*="fffdf7"] { padding: 84px 0; }

/* ─── 4. RITME: DE BAND ────────────────────────────────────────────────────
   Er stond al een afwisseling tussen #F8F5ED en #fffdf7. Dat verschil is negen
   punten op 255 in het rode kanaal en drie in het groene: op een scherm zie je
   dat niet, dus las de pagina als één ononderbroken vel. De band staat nu op
   --bg-2 (#EFEBE0), dezelfde tint als de showcase verderop dezelfde pagina.
   Geen nieuwe kleur, wel een zichtbare.
   Het is een !important omdat de kleur als style-attribuut in de HTML van ruim
   tweehonderd pagina's staat; zo volstaat één regel. */
body:has(header.hero) section[style*="fffdf7"] { background: var(--bg-2) !important; }
body:has(header.hero) section[style*="fffdf7"] .compare-table,
body:has(header.hero) section[style*="fffdf7"] .rel-card,
body:has(header.hero) section[style*="fffdf7"] .answer-card { background: var(--bg); }

/* De band krijgt ook een ander skelet: kop links, tekst rechts. Zo verschilt
   elke sectie van haar buur en leest scrollen als ritme in plaats van als
   herhaling. Het is hetzelfde patroon als de vragensectie, dus geen nieuwe
   vormtaal erbij. De kop blijft staan zolang zijn sectie in beeld is; dat is
   position:sticky en geen animatie, dus prefers-reduced-motion is hier niet
   van toepassing. .faq blijft er buiten, die heeft haar eigen raster. */
@media (min-width: 1000px) {
  body:has(header.hero) section[style*="fffdf7"]:not(.faq) > .container-narrow {
    max-width: 1180px;
    display: grid;
    grid-template-columns: minmax(0, 320px) minmax(0, 1fr);
    column-gap: 80px;
    align-items: start;
  }
  body:has(header.hero) section[style*="fffdf7"]:not(.faq) > .container-narrow > * {
    grid-column: 2;
  }
  body:has(header.hero) section[style*="fffdf7"]:not(.faq) > .container-narrow > h2 {
    grid-column: 1;
    grid-row: 1 / span 99;
    align-self: start;
    position: sticky;
    top: 104px;
    margin: 0;
    font-size: clamp(26px, 2.3vw, 33px);
    line-height: 1.14;
  }
  body:has(header.hero) section[style*="fffdf7"]:not(.faq) > .container-narrow > h2::before {
    content: '';
    display: block;
    width: 34px;
    height: 2px;
    background: var(--accent);
    margin-bottom: 20px;
  }
}

/* ─── 5. RITME: DE KOP EN DE AANLOOP ───────────────────────────────────────
   clamp(32px, 4.8vw, 60px) gaf 60px op 1280 breed: twaalf koppen na elkaar
   even groot als de titel van de pagina zelf. En elke sectie begon meteen met
   dezelfde muur van 17px grijs. De eerste alinea is nu een aanloop, zodat een
   sectie een ingang heeft. */
body:has(header.hero) .section > .container-narrow > h2 {
  font-size: clamp(32px, 3.4vw, 44px);
  line-height: 1.06;
}
body:has(header.hero) .section .container-narrow > h2 + p {
  font-size: 19px;
  line-height: 1.65;
  color: var(--ink);
  max-width: 62ch;
}

/* ─── 6. LINKS IN DE LOPENDE TEKST ─────────────────────────────────────────
   a { color: inherit; text-decoration: none } gold ook voor de links in de
   alinea's. Op /crepi-reiniging/ staan er zes en geen enkele was te zien. */
body:has(header.hero) .container-narrow > p a:not(.btn),
body:has(header.hero) .container-narrow > ul a:not(.btn),
body:has(header.hero) .container-narrow > ol a:not(.btn) {
  color: var(--accent);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  text-decoration-color: rgba(45,74,62,0.38);
  transition: text-decoration-color var(--dur-1) var(--ease-io),
              background-color var(--dur-1) var(--ease-io);
}
body:has(header.hero) .container-narrow > p a:not(.btn):hover,
body:has(header.hero) .container-narrow > ul a:not(.btn):hover,
body:has(header.hero) .container-narrow > ol a:not(.btn):hover {
  text-decoration-color: var(--accent);
  background: rgba(45,74,62,0.08);
}

/* ─── 7. HOMEPAGE: DE DRIE DIENSTKAARTEN ───────────────────────────────────
   De inhoud van een dienstkaart hangt aan de onderkant. Omdat "Gevels" een
   omschrijving van twee regels heeft en "Crepi Care" en "B2B" er drie, stond
   de titel "Gevels" 21px lager dan "B2B" (gemeten: 4018 tegen 3997). Twee
   verder identieke kaarten naast elkaar met hun kop op een andere lijn.
   Drie regels als ondergrens zet ze gelijk. */
.svc-desc { min-height: 4.5em; }

/* ─── 8. DE LOOPBAND BLEEF LOPEN BIJ REDUCED MOTION ────────────────────────
   .marquee-track draait een oneindige animatie van 45 seconden en stond niet
   in het blok van prefers-reduced-motion. Wie beweging uitzet in zijn
   systeem, kreeg toch een band die uit zichzelf schuift. Nu staat ze stil en
   kan je er zelf doorheen schuiven. */
@media (prefers-reduced-motion: reduce) {
  .marquee-track { animation: none; }
  .marquee { overflow-x: auto; scrollbar-width: none; }
  .marquee::-webkit-scrollbar { display: none; }
}

/* ─── 9. HET KRUIMELSPOOR STOND OVER HET LOGO ──────────────────────────────
   De hoofdnavigatie hangt aan een kale typeselector: nav { position: fixed;
   top: 0; left: 0; right: 0; padding: 18px 32px; background: … }. Het
   kruimelspoor in de hero is óók een <nav>, dus dat werd eveneens vastgezet
   linksboven en stond bovenop het woord "outshine". Zichtbaar op dertien
   pagina's, waaronder /gevelreiniging-prijs/. */
nav[aria-label="breadcrumb"] {
  position: static;
  display: block;
  padding: 0;
  background: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border-bottom: 0;
  z-index: auto;
}

/* ─── 10. BEELD IN DE TEKST ─────────────────────────────────────────────────
   Een voor/na-paar stond op twee verschillende hoogtes zodra de bronfoto's een
   andere verhouding hadden, waardoor de labels "Voor" en "Na" niet op dezelfde
   lijn stonden. De figuren rekken nu gelijk en de foto snijdt bij, in plaats
   van de rij scheef te trekken. */
.beeld-duo { align-items: stretch; }
.beeld-duo figure { display: flex; flex-direction: column; }
.beeld-duo figure img { flex: 1 1 auto; min-height: 0; object-fit: cover; }
.beeld-duo .label { margin-top: 10px; }

/* Een losse foto in de tekst nam de natuurlijke verhouding van het bestand over.
   crepi-reiniging-tijdens.webp is 1125x1500, dus op een kolom van 916px werd dat
   een beeld van 1221px hoog: anderhalf scherm voor één illustratie. Elke losse
   foto in de lopende tekst staat nu op dezelfde band van 16:10, zodat ze een
   illustratie blijft en de pagina niet uit elkaar trekt. */
.tekst-beeld:not(.beeld-duo) img {
  aspect-ratio: 16 / 10;
  width: 100%;
  height: auto;
  object-fit: cover;
}

/* Het bijschrift hoort bij de foto erboven en niet bij de alinea eronder.
   De onderkant van de figuur stond op 6px: het bijschrift plakte tegen de
   volgende alinea en las als de eerste regel daarvan. */
.tekst-beeld { margin-bottom: 26px; }
.tekst-beeld figcaption {
  margin-top: 12px;
  padding-left: 14px;
  border-left: 2px solid rgba(45,74,62,0.35);
  max-width: 62ch;
}

/* ============================================================================
   HET HUBSPOT-FORMULIER, 14-08-2026.
   De eigen opmaak van HubSpot won: lichtblauwe velden op creme, een knop met
   "Submit" erop en een Engelse bestandskiezer. Op de pagina die een lead moet
   binnenhalen zag dat eruit alsof het bij een andere firma hoorde.
   ============================================================================ */
.hubspot-form-wrap .hs-form-field { margin-bottom: 14px; }
.hubspot-form-wrap .hs-form-field > label,
.hubspot-form-wrap .hs-form-field > label span {
  font: 500 13px/1.4 var(--sans) !important;
  color: var(--ink) !important;
  letter-spacing: 0;
  text-transform: none;
}
.hubspot-form-wrap .hs-field-desc {
  font: 400 12.5px/1.5 var(--sans) !important;
  color: var(--ink-2) !important;
  margin: 4px 0 8px;
}
.hubspot-form-wrap input.hs-input,
.hubspot-form-wrap textarea.hs-input,
.hubspot-form-wrap select.hs-input {
  width: 100% !important;
  box-sizing: border-box;
  padding: 12px 14px !important;
  font: 400 16px/1.4 var(--sans) !important;
  border: 1px solid rgba(45,74,62,.22) !important;
  border-radius: 0 !important;
  background: #fff !important;
  color: var(--ink) !important;
  box-shadow: none !important;
  transition: border-color .18s ease, outline-color .18s ease;
}
.hubspot-form-wrap input.hs-input:hover,
.hubspot-form-wrap textarea.hs-input:hover { border-color: rgba(45,74,62,.4) !important; }
.hubspot-form-wrap input.hs-input:focus,
.hubspot-form-wrap textarea.hs-input:focus {
  outline: 2px solid var(--accent) !important;
  outline-offset: -2px;
  border-color: var(--accent) !important;
}
.hubspot-form-wrap textarea.hs-input { min-height: 96px; resize: vertical; }
.hubspot-form-wrap input[type="file"].hs-input {
  padding: 10px 12px !important;
  background: #fff !important;
  font-size: 14px !important;
}
.hubspot-form-wrap .hs-button,
.hubspot-form-wrap input[type="submit"] {
  width: 100%;
  min-height: 52px;
  padding: 15px !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: var(--accent) !important;
  color: #fff !important;
  font: 600 15px/1 var(--sans) !important;
  letter-spacing: 0 !important;
  text-transform: none !important;
  cursor: pointer;
  transition: background .22s ease, transform .22s cubic-bezier(.16,1,.3,1);
}
.hubspot-form-wrap .hs-button:hover { background: #243d33 !important; transform: translateY(-1px); }
.hubspot-form-wrap .hs-error-msg,
.hubspot-form-wrap .hs-error-msgs label {
  font: 400 13px/1.5 var(--sans) !important;
  color: #B3261E !important;
}
.hubspot-form-wrap .legal-consent-container,
.hubspot-form-wrap .hs-richtext { font: 400 12.5px/1.6 var(--sans) !important; color: var(--ink-2) !important; }


/* ============================================================================
   DRIE ONAFGEWERKTE PAGINA'S, 14-08-2026
   Gemeten met headless Chrome op 390, 768, 1280 en 1600 breed, via een
   meetpagina die de pagina in een iframe laadt op dezelfde origin.
   ============================================================================ */

/* ─── A. HOMEPAGE: HET KAARTENRASTER DAT GEEN CSS HAD ──────────────────────
   De sectie "Antwoorden rond crepi reinigen, gevelreiniging en softwash" is
   in de HTML een raster: .grid-3 met zes .service-card. Geen van beide
   klassen had ook maar een regel in dit bestand. Gemeten op /index.html bij
   1280 breed:

     .grid-3      display=block  bg=rgba(0,0,0,0)  border=0  padding=0
     .service-card (6x) display=inline, alle zes x=32 w=1201 h=56

   Zes ankers van 1201px breed onder elkaar op dezelfde x: een kale opsomming
   over de volle breedte met de rechterhelft leeg. Dezelfde twee klassen staan
   ook op /zelf-crepi-reinigen/ en waren daar even kaal.

   Het raster is nu een blok met haarlijnen als voegen (gap:1px op een
   lijnkleur), zoals .step-grid dat al deed. Scherpe hoeken, bestaande
   tokens, geen nieuwe kleur. */
.grid-3 {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1px;
  margin-top: 48px;
  background: var(--line);
  border: 0.5px solid var(--line);
}
.service-card {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 30px 28px 24px;
  background: var(--bg);
  color: var(--ink);
  transition: background var(--dur-2) var(--ease-io);
}
.service-card h3 {
  position: relative;
  font-size: 20px;
  font-weight: 500;
  letter-spacing: -0.025em;
  line-height: 1.25;
  padding-bottom: 14px;
}
/* De accentlijn onder de kop, dezelfde die de banden al dragen. */
.service-card h3::after {
  content: '';
  position: absolute; left: 0; bottom: 0;
  width: 26px; height: 2px;
  background: var(--accent);
  transition: width var(--dur-3) var(--ease-out);
}
.service-card p {
  font-size: 14.5px;
  line-height: 1.6;
  color: var(--ink-2);
  margin: 0;
}
/* De pijl hangt aan de onderkant, zodat kaarten met twee of drie regels
   tekst toch dezelfde onderlijn houden. Alleen op a.service-card: op
   /zelf-crepi-reinigen/ zijn het div.service-card zonder href, en daar zou
   een pijl een klik beloven die er niet is. */
a.service-card::after {
  content: '\2192';
  margin-top: auto;
  padding-top: 20px;
  font-size: 16px;
  line-height: 1;
  color: var(--accent);
  transition: transform var(--dur-2) var(--ease-out);
}
/* Ook de hover-tint alleen op de klikbare kaart. */
a.service-card:hover { background: var(--bg-2); }
a.service-card:hover h3::after { width: 46px; }
a.service-card:hover::after { transform: translateX(5px); }
.service-card:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }

@media (max-width: 1000px) { .grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px)  {
  .grid-3 { grid-template-columns: minmax(0, 1fr); margin-top: 32px; }
  .service-card { padding: 24px 20px 20px; }
  .service-card h3 { font-size: 18px; }
}

/* ─── B. /ABOUT-US/: DE PLOEG EN HET MATERIAAL WAREN NERGENS TE ZIEN ───────
   Gemeten op /about-us/ bij 1280 breed: img (0). Nul beelden op 4537px
   pagina. De tekstkolom is 641px breed (.seo-text p heeft max-width:72ch)
   op een viewport van 1265px, dus de rechterhelft was leeg over de volle
   hoogte. De kop belooft "een vaste ploeg met vast materiaal".

   De band hieronder staat direct onder de hero: het beeld links, de harde
   feiten rechts. Dat vult de rechterhelft en toont het materiaal. */
.ab-band { padding: 64px 0 0; }
.ab-band-grid { display: grid; gap: 28px; }
@media (min-width: 900px) {
  .ab-band-grid {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    column-gap: 56px;
    align-items: center;
  }
}
.ab-shot { margin: 0; }
.ab-shot img {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  background: var(--bg-2);
}
/* Gestapeld werd 4/5 een beeld van 713 bij 891 op een tablet: een scherm vol
   met een foto. Liggend gesneden houdt de borstel en het groene vlak, en
   scheelt 356px hoogte. */
@media (max-width: 899px) { .ab-shot img { aspect-ratio: 4 / 3; } }
.ab-cap {
  margin-top: 12px;
  font-size: 13.5px;
  line-height: 1.6;
  color: var(--ink-3);
  padding-left: 12px;
  border-left: 2px solid var(--accent);
}
.ab-band-text h2 { font-size: clamp(24px, 2.4vw, 34px); margin: 14px 0 16px; }
.ab-band-text > p { font-size: 16px; line-height: 1.75; color: var(--ink-2); max-width: 46ch; }

/* De feiten als een lijst met haarlijnen, niet als losse blokjes. */
.ab-facts { margin: 28px 0 0; border-top: 0.5px solid var(--line); }
.ab-facts > div {
  display: flex; flex-wrap: wrap; gap: 4px 20px;
  justify-content: space-between; align-items: baseline;
  padding: 13px 0;
  border-bottom: 0.5px solid var(--line);
}
.ab-facts dt { font-size: 13px; letter-spacing: 0.02em; color: var(--ink-3); }
.ab-facts dd { font-size: 15px; font-weight: 500; color: var(--ink); text-align: right; }

/* Twee beelden naast elkaar, breder dan de tekstkolom van 641px. */
.ab-pair { display: grid; gap: 20px; margin: 44px 0; }
@media (min-width: 700px) { .ab-pair { grid-template-columns: 1fr 1fr; } }
.ab-pair figure { margin: 0; }
.ab-pair img {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  background: var(--bg-2);
}
.ab-wide { margin: 44px 0; }
.ab-wide img {
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
  background: var(--bg-2);
}

/* ─── C. /FAQ/: 27 IDENTIEKE BALKEN ONDER ELKAAR ───────────────────────────
   Gemeten op /faq/ bij 1280 breed: 27 .faq-item van 800px breed op x=75, in
   een viewport van 1265px. Het rechterderde stond leeg over 1917px hoogte.
   De hero eindigde op y=573 en de eerste vraag begon op y=685: 112px gat,
   bovenop de 80px onderrand die al in de hero zelf zit. Samen 192px leegte
   tussen de intro en de eerste vraag.

   De 27 vragen staan nu in vier blokken (methode, prijs, praktisch,
   garantie) in exact dezelfde twee-koloms vormtaal als /crepi-reiniging/:
   de titel draagt links, de vragen staan rechts, met dezelfde ronde
   plusknop. Die knop staat al in dit bestand op .faq-item en wordt hier
   dus hergebruikt, niet overgedaan. */
/* Het gat tussen de intro en de eerste vraag was 163px gemeten: de hero-sub
   eindigde op y=474, de eerste blokkop begon op y=637. Dat is 64px onderrand
   in de hero plus 64px sectierand plus 36px marge onder de sub.
   Let op de selector: `body:has(header.hero) .hero { padding-bottom: 64px }`
   en `body:has(header.hero) .section:first-of-type { padding-top: 64px }`
   staan hierboven en wegen zwaarder dan een kale klasse. Daarom hangt dit
   aan dezelfde `body:has(...)`, anders doet het niets. */
body:has(header.hero) .faq-hero { padding-bottom: 48px; }
body:has(header.hero) .faq-page-body,
body:has(header.hero) .faq-page-body:first-of-type { padding-top: 40px; padding-bottom: 72px; }

.faq-block { padding: 52px 0; border-top: 0.5px solid var(--line); }
.faq-block:first-child { padding-top: 0; border-top: 0; }
.faq-block:last-child { padding-bottom: 8px; }

@media (min-width: 900px) {
  .faq-block {
    display: grid;
    grid-template-columns: minmax(240px, 320px) minmax(0, 1fr);
    column-gap: 80px;
    align-items: start;
  }
}
/* Het langste blok telt negen vragen en de titel maar drie regels, dus de
   linkerkolom liep leeg. De kop reist mee met haar eigen lijst. Sticky is
   geen animatie, dus prefers-reduced-motion raakt dit niet. */
@media (min-width: 900px) {
  .faq-block-head { position: sticky; top: 104px; }
}
.faq-block-head .eyebrow { display: block; }
.faq-block-head h2 {
  font-size: clamp(24px, 2.2vw, 32px);
  margin-top: 12px;
  letter-spacing: -0.03em;
  line-height: 1.14;
}
.faq-block-note {
  margin-top: 14px;
  font-size: 15px;
  line-height: 1.7;
  color: var(--ink-2);
  max-width: 32ch;
}
.faq-block .faq-list { max-width: 780px; }
@media (max-width: 899px) { .faq-block .faq-list { margin-top: 24px; } }

/* Het staartblok onder de vragen: dezelfde scherpe hoek als de rest. */
.faq-outro {
  margin-top: 48px;
  padding: 32px;
  background: var(--bg-2);
  border-left: 2px solid var(--accent);
}
.faq-outro h3 { font-size: 20px; font-weight: 500; margin-bottom: 10px; }
.faq-outro p { margin-bottom: 18px; color: var(--ink-2); }

/* De drie korte antwoorden onderaan /faq/ stonden op border-radius:16px,
   terwijl de hele site scherphoekig is. Rechtgezet, zelfde lijnkleur. */
/* Niet auto-fit: dat gaf een vierde spoor van 0px en dus een naadlijn tegen
   de rechterrand (gemeten cols=370.656px 370.672px 370.656px 0px). */
.faq-short { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1px; margin-top: 28px; background: var(--line); border: 0.5px solid var(--line); }
@media (max-width: 860px) { .faq-short { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .faq-short { grid-template-columns: minmax(0, 1fr); } }
.faq-short article { background: var(--bg); padding: 26px 24px; }
.faq-short h3 { font-size: 17px; font-weight: 500; letter-spacing: -0.02em; line-height: 1.3; margin: 0 0 10px; }
.faq-short p { font-size: 14.5px; line-height: 1.65; color: var(--ink-2); margin: 0; }

/* Wie beweging uitzet, krijgt hier geen beweging. */
@media (prefers-reduced-motion: reduce) {
  .service-card,
  .service-card h3::after,
  a.service-card::after { transition: none; }
  a.service-card:hover::after { transform: none; }
  a.service-card:hover h3::after { width: 26px; }
}

/* ============================================================================
   AFRONDING EN LEESRITME, 14-08-2026, op vraag van Keanu.
   Alle knoppen en alle beelden op 6px. De cursieve serif eruit: die wisselde
   midden in een zin van lettertype en las als twee stemmen door elkaar.
   ============================================================================ */

/* De cursieve accenten worden gewone tekst in dezelfde stem. De reviewtekst op
   de homepage droeg hem via een eigen regel en ontsnapte daaraan. */
.ov-quote-text { font-family: var(--sans) !important; font-style: normal !important; }
.italic {
  font-family: inherit !important;
  font-style: normal !important;
  font-weight: inherit !important;
  letter-spacing: inherit !important;
}

/* Zes pixels, overal waar iemand op duwt of naar kijkt. */
.btn, .pw-go, .pw-chip, .pw-fk, .nav-cta,
.cookie-accept, .cookie-decline, .review-toggle, .filter-btn,
.hubspot-form-wrap .hs-button,
.hubspot-form-wrap input[type="submit"],
.hubspot-form-wrap input.hs-input,
.hubspot-form-wrap textarea.hs-input,
.hubspot-form-wrap select.hs-input,
.pw-i, .pw-t { border-radius: 6px !important; }

img,
.ba, .ba img,
.tekst-beeld img,
.showcase-card img, .realisatie-card img,
.svc-card img, .service-card img,
.result-card img, .ov-shot img, .ov-shot-main,
figure img, video { border-radius: 6px; }

/* De schuifgreep en de labels volgen de vorm van hun beeld. */
.ba-tag { border-radius: 4px; }
.ba { overflow: hidden; }

/* Een beeld dat de volle breedte van een band draagt, hoort niet af te ronden
   tegen de rand van het scherm aan. */
@media (max-width: 640px) { .ba, .ba img, .tekst-beeld img { border-radius: 6px; } }

/* Het formulier staat nu in hetzelfde blok als de drie manieren om te antwoorden. */
.ov-form { margin-top: 32px; padding: 26px 24px; background: var(--bg); border: 0.5px solid var(--line); border-radius: 6px; }
.ov-form-titel { font-size: 17px; font-weight: 600; letter-spacing: -0.015em; margin: 0 0 6px; }
.ov-form-onder { font-size: 14px; line-height: 1.6; color: var(--ink-2); margin: 0 0 18px; }
@media (max-width: 640px) { .ov-form { padding: 20px 16px; } }

/* ============================================================================
   LEESRITME, 14-08-2026, op vraag van Keanu.
   "Er is nog te veel blok tekst" en "niets is immersive op de hele site".

   De inhoud is niet ingekort: die lengte is nodig om gevonden te worden. Wat
   hier staat zijn zeven vormen die de tekst dragen in plaats van hem te
   versieren. Een vorm mag alleen gebruikt worden als de alinea er al om vroeg:
   een reeks, een tegenstelling, een cijfer, iets om te onthouden.

   Regels waar dit blok zich aan houdt:
   - geen bibliotheek, geen framework, geen CDN
   - geen beweging die vanzelf begint, geen parallax, geen oplopende tellers
   - scherpe hoeken zoals de rest van de site; alleen knoppen en beelden staan
     op 6px, en dat regelt het blok hierboven al
   - alleen de vier kleuren: creme, tweede vlak, groen en inkt
   - alles van smal naar breed opgebouwd, want de eerste versie draaide de
     kolommen onder 640px terug met regels die het van de nth-child-regels
     erboven verloren, en dan staat elke tweede kaart op mobiel ingesprongen
   ============================================================================ */

/* ─── 1. DE UITGELICHTE ZIN ────────────────────────────────────────────────
   Een adempauze tussen twee blokken. De zin staat letterlijk al in de alinea
   ernaast; hij wordt hier alleen groot gezet en daar dus uit weggehaald, zodat
   niets twee keer op dezelfde pagina staat. Geen aanhalingstekens, want het is
   geen citaat van iemand anders. */
.lees-uit {
  margin: 54px 0;
  padding: 2px 0 2px 28px;
  border-left: 2px solid var(--accent);
}
.lees-uit p {
  margin: 0;
  max-width: 30ch;
  font-size: clamp(23px, 3.1vw, 34px);
  line-height: 1.22;
  letter-spacing: -0.03em;
  font-weight: 500;
  color: var(--ink);
}
.lees-uit-bron {
  display: block;
  margin-top: 16px;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.lees-uit.is-vlak {
  padding: 34px 32px 36px;
  background: var(--bg-2);
}
@media (max-width: 640px) {
  .lees-uit { margin: 40px 0; padding-left: 20px; }
  .lees-uit.is-vlak { padding: 26px 22px 28px; }
}

/* ─── 2. DE TWEEKOLOMSVERGELIJKING ────────────────────────────────────────
   Voor tekst die iets tegenover iets zet: softwash tegenover hogedruk, wat de
   beschermlaag wel doet tegenover wat ze niet doet, wat er in de prijs zit
   tegenover wat er niet in zit, zes procent tegenover eenentwintig. De kolom
   die onze kant van de vergelijking is, krijgt .is-onze. Creme op groen haalt
   9,0:1, dus daar mag de tekst gewoon licht op staan. */
.lees-duo {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  border: 1px solid var(--line-2);
  margin: 38px 0 10px;
}
.lees-duo-kant { padding: 24px 22px 26px; }
.lees-duo-kant + .lees-duo-kant { border-top: 1px solid var(--line-2); }
.lees-duo-kant.is-onze {
  background: var(--accent);
  color: var(--bg);
  border-top-color: var(--accent);
}
.lees-duo-kop {
  display: block;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.lees-duo-kant.is-onze .lees-duo-kop { color: rgba(248, 245, 237, 0.78); }
.lees-duo-getal {
  display: block;
  margin: 16px 0 0;
  /* Gemeten op 1280: in een sectie met de kop links is een vergelijkingskolom
     298px binnenwerks. "100 tot 200" viel daar op 50px over twee regels
     terwijl "max. 8" op één regel bleef, dus stonden de twee cijfers niet op
     dezelfde lijn. Op 40px past de langste van de twee. */
  font-size: clamp(30px, 3.2vw, 40px);
  font-weight: 600;
  letter-spacing: -0.045em;
  line-height: 1.02;
  color: var(--accent);
}
.lees-duo-kant.is-onze .lees-duo-getal { color: var(--bg); }
.lees-duo-getal .eenheid {
  font-size: 0.44em;
  font-weight: 500;
  letter-spacing: -0.01em;
  margin-left: 7px;
  color: var(--ink-2);
}
.lees-duo-kant.is-onze .lees-duo-getal .eenheid { color: rgba(248, 245, 237, 0.82); }
.lees-duo-titel {
  display: block;
  margin: 14px 0 0;
  font-size: 19px;
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.25;
  color: var(--ink);
}
.lees-duo-kant.is-onze .lees-duo-titel { color: var(--bg); }
.lees-duo-kant p {
  margin: 14px 0 0;
  font-size: 15px;
  line-height: 1.72;
  color: var(--ink-2);
}
.lees-duo-kant.is-onze p { color: rgba(248, 245, 237, 0.9); }
.lees-duo-kant a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
/* De check-list mag in een vergelijkingskolom staan: dat is de enige plaats
   waar "wat er in zit" en "wat er niet in zit" naast elkaar horen. */
.lees-duo-kant .check-list { margin: 16px 0 0; }
.lees-duo-kant .check-list li { font-size: 15px; line-height: 1.7; margin-bottom: 12px; }
.lees-duo-kant.is-onze .check-list li { color: rgba(248, 245, 237, 0.9); }
.lees-duo-kant.is-onze .check-list li strong { color: var(--bg); }
.lees-duo-kant.is-onze .check-list li::before { background: var(--bg); }
@media (min-width: 761px) {
  .lees-duo { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .lees-duo-kant { padding: 30px 30px 32px; }
  .lees-duo-kant + .lees-duo-kant { border-top: 0; border-left: 1px solid var(--line-2); }
  .lees-duo-kant.is-onze { border-left-color: var(--accent); }
}

/* ─── 3. HET KAARTRASTER ───────────────────────────────────────────────────
   Voor tekst die een aantal gelijkwaardige dingen naast elkaar zet: de vier
   soorten aanslag, de vijf ondergronden, de wijken van een stad, de zes dingen
   die de prijs bepalen. Haarlijnen in plaats van vlakken, zodat het raster op
   elke sectieachtergrond werkt zonder een eigen kleur mee te brengen. */
.lees-raster {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  border-top: 1px solid var(--line-2);
  margin: 32px 0 8px;
}
.lees-raster > article {
  padding: 22px 0 24px;
  border-bottom: 1px solid var(--line);
}
.lees-raster-label {
  display: block;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 12px;
}
.lees-raster h3 {
  font-size: 19px;
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.28;
  margin: 0 0 10px;
}
.lees-raster p {
  margin: 0;
  font-size: 15px;
  line-height: 1.72;
  color: var(--ink-2);
}
.lees-raster p + p { margin-top: 12px; }
.lees-raster strong { color: var(--ink); font-weight: 600; }
.lees-raster a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
/* .is-1 blijft één kolom: dat is de vorm voor een lijst met koppen, niet voor
   kaarten. Daar moet de regellengte wel begrensd worden, want de kolom is dan
   de volle tekstbreedte. */
.lees-raster.is-1 > article > h3 { max-width: 46ch; }
.lees-raster.is-1 > article > p { max-width: 68ch; }

@media (min-width: 641px) {
  .lees-raster:not(.is-1) { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .lees-raster:not(.is-1) > article { padding: 26px 30px 28px 0; }
  .lees-raster:not(.is-1) > article:nth-child(2n) {
    padding-right: 0;
    padding-left: 30px;
    border-left: 1px solid var(--line);
  }
  /* Een oneven laatste kaart neemt de volle breedte, anders staat er een lege
     cel met een haarlijn eromheen alsof er iets ontbreekt. */
  .lees-raster:not(.is-1) > article:last-child:nth-child(odd) {
    grid-column: 1 / -1;
    padding-right: 0;
    padding-left: 0;
    border-left: 0;
  }
}

@media (min-width: 861px) {
  .lees-raster.is-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .lees-raster.is-3 > article { padding: 26px 26px 28px 0; border-left: 0; }
  .lees-raster.is-3 > article:nth-child(3n-1),
  .lees-raster.is-3 > article:nth-child(3n) {
    padding-left: 26px;
    border-left: 1px solid var(--line);
  }
  .lees-raster.is-3 > article:nth-child(3n) { padding-right: 0; }
  .lees-raster.is-3 > article:last-child:nth-child(odd) { grid-column: auto; }
}

/* ─── 4. DE GENUMMERDE REEKS ──────────────────────────────────────────────
   Alleen waar de tekst een volgorde beschrijft: hoe zo'n dag verloopt, wat we
   nakijken voor er product op gaat, hoe je twee offertes naast elkaar legt.
   Niet voor een opsomming zonder volgorde: daar is het raster voor. */
.lees-stappen {
  list-style: none;
  margin: 34px 0 8px;
  padding: 0;
  counter-reset: leesstap;
}
/* Zonder deze regel ving een <ol> de bestaande .container-narrow > ol
   { max-width: 68ch } op en werd de reeks 721px breed terwijl het raster
   ernaast 916px was. Twee blokken onder elkaar met een andere rechterrand
   leest als een fout. De haarlijnen lopen nu over de volle kolombreedte en de
   tekst binnenin houdt haar leesbare regellengte. */
.container-narrow > ol.lees-stappen,
.container-narrow > ul.lees-stappen { max-width: none; }
.lees-stappen > li {
  display: flex;
  gap: 24px;
  align-items: flex-start;
  padding: 24px 0 26px;
  border-top: 1px solid var(--line);
}
.lees-stappen > li:last-child { border-bottom: 1px solid var(--line); }
.lees-stappen > li::before {
  counter-increment: leesstap;
  content: counter(leesstap, decimal-leading-zero);
  flex: 0 0 auto;
  min-width: 54px;
  font-size: clamp(26px, 3vw, 34px);
  font-weight: 600;
  letter-spacing: -0.045em;
  line-height: 1.05;
  color: var(--accent);
  font-variant-numeric: tabular-nums;
}
.lees-stappen > li > div { max-width: 68ch; }
.lees-stap-kop {
  display: block;
  font-size: 18px;
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.3;
  margin-bottom: 8px;
}
.lees-stappen p {
  margin: 0;
  font-size: 15px;
  line-height: 1.75;
  color: var(--ink-2);
}
.lees-stappen p + p { margin-top: 10px; }
.lees-stappen strong { color: var(--ink); font-weight: 600; }
.lees-stappen a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
@media (max-width: 640px) {
  .lees-stappen > li { gap: 16px; padding: 20px 0 22px; }
  .lees-stappen > li::before { min-width: 40px; font-size: 24px; }
}

/* ─── 5. HET KADERBLOK ────────────────────────────────────────────────────
   Kort, en alleen voor iets wat de bezoeker echt moet onthouden: zet je
   regenwater een week om, zeg het als je al javel gebruikt hebt. Wordt dit
   langer dan vier regels, dan hoort het gewoon in de lopende tekst. */
.lees-onthoud {
  margin: 36px 0 8px;
  padding: 24px 26px 26px;
  background: var(--bg-2);
  border-left: 3px solid var(--accent);
}
.lees-onthoud-kop {
  display: block;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 12px;
}
.lees-onthoud p {
  margin: 0;
  max-width: 62ch;
  font-size: 16px;
  line-height: 1.7;
  color: var(--ink);
}
.lees-onthoud p + p {
  margin-top: 10px;
  font-size: 15px;
  color: var(--ink-2);
}
.lees-onthoud a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }
@media (max-width: 640px) { .lees-onthoud { padding: 20px 20px 22px; } }

/* ─── 6. DE BEELDBAND ─────────────────────────────────────────────────────
   Beeld middenin een lang stuk in plaats van alleen aan het begin, en meteen
   het enige echt donkere vlak in de lopende tekst. Hoort buiten de smalle
   kolom te staan, in een gewone .container binnen dezelfde sectie, zodat hij
   breder is dan de tekst eromheen. Dat verschil in breedte is het hele effect:
   916px tekst, 1116px band, met dezelfde linkerrand. */
.lees-band {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  background: var(--accent);
  color: var(--bg);
  margin: 8px 0;
}
.lees-band-beeld { margin: 0; }
.lees-band-beeld img {
  width: 100%;
  height: auto;
  aspect-ratio: 16 / 10;
  object-fit: cover;
  display: block;
}
.lees-band-tekst { padding: 30px 24px 34px; }
.lees-band-kop {
  display: block;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: rgba(248, 245, 237, 0.7);
  margin-bottom: 18px;
}
.lees-band-zin {
  margin: 0;
  font-size: clamp(22px, 2.5vw, 31px);
  line-height: 1.24;
  letter-spacing: -0.03em;
  font-weight: 500;
}
.lees-band-onder {
  margin: 20px 0 0;
  font-size: 15px;
  line-height: 1.75;
  color: rgba(248, 245, 237, 0.88);
}
.lees-band-onder + .lees-band-onder { margin-top: 12px; }
.lees-band a { color: var(--bg); text-decoration: underline; text-underline-offset: 2px; }
@media (min-width: 861px) {
  .lees-band { grid-template-columns: 1.05fr 0.95fr; }
  /* De bronfoto's zijn grotendeels staand (900x1200). In een brede beeldcel
     snijdt dat het huis doormidden, dus krijgt een staande bron een smallere
     kolom: de uitsnede blijft dan dicht bij de oorspronkelijke verhouding. */
  .lees-band.is-staand { grid-template-columns: 0.72fr 1.28fr; }
  .lees-band-beeld { min-height: 380px; }
  .lees-band-beeld img {
    height: 100%;
    min-height: 380px;
    aspect-ratio: auto;
  }
  .lees-band-tekst {
    padding: 48px 52px 52px;
    display: flex;
    flex-direction: column;
    justify-content: center;
  }
}

/* ─── 7. DE FEITENSTROOK ──────────────────────────────────────────────────
   Vier cijfers die al ergens in de alinea eronder staan, naast elkaar. Ze
   staan er gewoon, ze lopen niet op: een teller die van nul naar vijftig
   klimt is een trucje en geen informatie. */
.lees-feiten {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  border-top: 1px solid var(--line-2);
  border-bottom: 1px solid var(--line);
  margin: 36px 0 8px;
}
.lees-feiten > div { padding: 22px 18px 24px 0; }
.lees-feiten > div:nth-child(2n) { padding-right: 0; padding-left: 18px; border-left: 1px solid var(--line); }
.lees-feiten > div:nth-child(n + 3) { border-top: 1px solid var(--line); }
.lees-feit-getal {
  display: block;
  /* "Sinds 2022" en "Vaste ploeg" vallen over twee regels, "5,0" en "2 jaar"
     niet. Zonder deze ondergrens beginnen de bijschriften in dezelfde strook
     op twee verschillende hoogtes. */
  min-height: 2.1em;
  font-size: clamp(26px, 3.2vw, 38px);
  font-weight: 600;
  letter-spacing: -0.045em;
  line-height: 1.05;
  color: var(--accent);
}
.lees-feit-label {
  display: block;
  margin-top: 12px;
  font-size: 14px;
  line-height: 1.55;
  color: var(--ink-2);
}
@media (min-width: 761px) {
  .lees-feiten { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .lees-feiten.is-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .lees-feiten > div { padding: 26px 22px 28px 0; border-top: 0; border-left: 0; }
  .lees-feiten > div + div { padding-left: 22px; border-left: 1px solid var(--line); }
  .lees-feiten > div:last-child { padding-right: 0; }
}

/* Wie beweging uitzet, krijgt hier geen beweging. Het blok bij "12.12 Beweging"
   zet elke overgang en animatie op de pagina al stil; dit staat er expliciet
   bij zodat een latere hand er niet per ongeluk iets in legt dat daarbuiten
   valt. Er zit hier geen enkele animatie in, ook niet standaard. */
@media (prefers-reduced-motion: reduce) {
  .lees-uit, .lees-duo, .lees-duo-kant,
  .lees-raster, .lees-raster > article,
  .lees-stappen, .lees-stappen > li,
  .lees-onthoud, .lees-band, .lees-feiten, .lees-feiten > div {
    transition: none !important;
    animation: none !important;
  }
}

/* ============================================================================
   DE VIER PAGINA'S MET EEN EIGEN SJABLOON, 14-08-2026.
   /zwarte-strepen-gevel/, /b2b-gevelreiniging/, /gevelreiniging-oost-vlaanderen/
   en /bedankt/ droegen een eigen stylesheet met andere hoeken, een andere balk
   en een gouden accentkleur die nergens anders op de site voorkomt.
   ============================================================================ */
body:not(:has(nav#nav)) .card,
body:not(:has(nav#nav)) .box,
body:not(:has(nav#nav)) .panel,
body:not(:has(nav#nav)) details,
body:not(:has(nav#nav)) .faq,
body:not(:has(nav#nav)) form,
body:not(:has(nav#nav)) input,
body:not(:has(nav#nav)) textarea,
body:not(:has(nav#nav)) select,
body:not(:has(nav#nav)) button,
body:not(:has(nav#nav)) .btn,
body:not(:has(nav#nav)) a[class*="btn"],
body:not(:has(nav#nav)) img { border-radius: 6px !important; }

/* De 6px die nog ontbrak op de formulier- en reviewblokken van de hele site. */
.hubspot-form-wrap, .ov-form,
.review, .review-card, .ov-quote,
.faq-item, .faq-list,
.result-card, .showcase-card, .realisatie-card,
.svc-card, .service-card, .step, .lees-onthoud,
.trust-strip, .cta-inline, .form-phone-boost { border-radius: 6px; }
.faq-list { overflow: hidden; }

/* De gouden accentkleur bestaat niet in deze huisstijl. */
body:not(:has(nav#nav)) [style*="C6A56A"] { color: var(--accent) !important; }

/* ============================== De Cleandak-les: geen twee secties dezelfde vorm.
   Elke sectie hieronder heeft een eigen compositie: split, spiegel, full-bleed band,
   losse galerij, smalle kolom, donkere asymmetrie. De foto is het layout-element,
   niet de kaart eromheen. Prefix ed- (editorial). */
.ed-split { display: grid; grid-template-columns: 3fr 2fr; gap: 56px; align-items: center; max-width: 1300px; margin: 0 auto; padding: 88px 24px; }
.ed-split.omgekeerd { grid-template-columns: 2fr 3fr; }
.ed-split img { width: 100%; height: auto; display: block; border-radius: 6px; }
.ed-split h2 { margin-bottom: 14px; }
.ed-split p { color: var(--ink-2); max-width: 42ch; }
.ed-split .ed-link { display: inline-block; margin-top: 18px; font-weight: 600; border-bottom: 2px solid var(--accent); padding-bottom: 2px; }
.ed-band { position: relative; width: 100%; overflow: hidden; }
.ed-band img { width: 100%; height: min(64vh, 560px); object-fit: cover; display: block; }
.ed-band-tekst { position: absolute; left: 0; right: 0; bottom: 0; padding: 96px 32px 36px; background: linear-gradient(transparent, rgba(20,24,22,.72)); color: var(--bg); }
.ed-band-tekst h2 { color: var(--bg); margin-bottom: 6px; }
.ed-band-tekst p { color: rgba(248,245,237,.85); max-width: 52ch; }
.ed-band-tekst a { color: var(--bg); font-weight: 600; border-bottom: 2px solid rgba(248,245,237,.5); }
.ed-galerij { max-width: 1200px; margin: 0 auto; padding: 88px 24px; }
.ed-galerij-grid { display: grid; grid-template-columns: repeat(3, 1fr); grid-auto-rows: 300px; gap: 18px; }
.ed-galerij-grid > figure { margin: 0; display: flex; flex-direction: column; }
.ed-galerij-grid img { width: 100%; flex: 1; min-height: 0; height: 100%; object-fit: cover; display: block; border-radius: 6px; }
.ed-galerij-grid .ba { flex: 1; min-height: 0; height: auto; border-radius: 6px; }
.ed-galerij figcaption { font-size: 14px; color: var(--ink-2); margin-top: 8px; flex: none; }
.ed-offerte { max-width: 800px; margin: 0 auto; padding: 88px 24px; text-align: center; }
.ed-offerte h2 { margin-bottom: 10px; }
.ed-offerte .ed-kanalen { margin-top: 22px; font-size: 15px; color: var(--ink-2); }
.ed-offerte .ed-kanalen a { font-weight: 600; color: var(--ink); }
.ed-video { background: var(--ink); color: var(--bg); }
.ed-video-grid { display: grid; grid-template-columns: 1fr 420px; gap: 64px; align-items: center; max-width: 1100px; margin: 0 auto; padding: 96px 24px; }
.ed-video-grid h2 { color: var(--bg); margin-bottom: 12px; }
.ed-video-grid p { color: rgba(248,245,237,.7); }
.ed-video-grid ul { margin: 20px 0 26px; padding: 0; list-style: none; color: rgba(248,245,237,.85); }
.ed-video-grid li { padding: 6px 0 6px 26px; position: relative; }
.ed-video-grid li::before { content: '✓'; position: absolute; left: 0; color: var(--accent-2, #7fb069); }
.ed-video-grid video { width: 100%; aspect-ratio: 9 / 16; object-fit: cover; border-radius: 8px; display: block; }
.ed-reviews { max-width: 1100px; margin: 0 auto; padding: 88px 24px; }
.ed-reviews-top { display: grid; grid-template-columns: 2fr 1fr; gap: 48px; align-items: start; margin-bottom: 40px; }
.ed-quote-groot { font-size: clamp(22px, 3vw, 30px); line-height: 1.35; font-weight: 500; }
.ed-rating { text-align: right; }
.ed-rating .num { font-size: 44px; font-weight: 700; display: block; }
.ed-reviews-klein { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; }
.ed-regio { max-width: 900px; margin: 0 auto; padding: 72px 24px; }
.ed-regio p { color: var(--ink-2); }
.ed-steden { font-size: 17px; line-height: 2; margin: 14px 0; }
.ed-lijst { max-width: 800px; margin: 0 auto; padding: 72px 24px 96px; }
.ed-lijst a { display: block; padding: 14px 0; border-bottom: 1px solid rgba(26,26,26,.12); font-weight: 500; }
.ed-lijst a::before { content: '→  '; color: var(--accent); }
.ed-chips { display: flex; flex-wrap: wrap; gap: 10px 22px; margin-top: 26px; font-size: 15px; color: var(--ink-2); }
.ed-chips b { color: var(--ink); }
@media (max-width: 900px) {
  .ed-split, .ed-split.omgekeerd { grid-template-columns: 1fr; gap: 28px; padding: 56px 20px; }
  .ed-split.omgekeerd > div:first-child { order: 2; }
  .ed-galerij-grid { grid-template-columns: 1fr 1fr; grid-auto-rows: 200px; }
  .ed-galerij-grid > figure:first-child { grid-column: span 2; }
  .ed-video-grid { grid-template-columns: 1fr; gap: 36px; padding: 64px 20px; }
  .ed-video-grid video { max-width: 420px; margin: 0 auto; }
  .ed-reviews-top, .ed-reviews-klein { grid-template-columns: 1fr; gap: 28px; }
  .ed-rating { text-align: left; }
}

/* ========================== Doortrekking van het versimpelde ontwerp, sitewide.
   Zelfde componenten, minder doos: geen witte kaders met schaduwen en borders
   meer, maar kale foto's, dunne lijnen en tekst. Eén plek, alle pagina's mee. */
.showcase-card { background: transparent; padding: 0; }
.showcase-card h4 { font-size: 18px; }
.showcase-card .meta { margin-bottom: 12px; }
.service-tile { background: transparent; border: none; border-left: 2px solid var(--accent); padding: 6px 0 6px 16px; }
.service-card { background: transparent; padding: 16px 0; border-bottom: 1px solid var(--line); border-radius: 0; }
.service-card:hover { background: transparent; }
.review { background: transparent; border: none; border-top: 2px solid var(--ink); padding: 22px 0 0; }
.review:hover { border-color: var(--ink); transform: none; }

/* De hero toont de echte werfvideo, verticaal, links van de tekst. */
.ov-hero-video video { height: min(72vh, 640px); width: auto; max-width: 100%; aspect-ratio: 9 / 16; object-fit: cover; border-radius: 8px; display: block; }
@media (max-width: 900px) { .ov-hero-video { order: 2; } .ov-hero-video video { margin: 0 auto; } }

/* ============ Care4Crepi: eigen identiteit bovenop de Outshine-basis. =========
   Diep petrolblauw in plaats van Outshine-groen: leest als specialist en
   onderscheidt de twee merken meteen. Ondergrond blijft warm wit (crepi-wit). */
:root {
  --accent: #14555B;
  --accent-hover: #0D4045;
  --accent-2: #14555B;
}
@media (min-width: 1280px) {
  .container { max-width: 1480px; }
  .ed-split, .ed-split.omgekeerd { max-width: 1480px; }
  .ed-galerij { max-width: 1440px; }
  .ed-reviews { max-width: 1280px; }
  .ed-offerte { max-width: 860px; }
}

/* ============ De bewijsbalk en de prijstabel ==================================
   Beide bestaan om ÉÉN reden: cijfers die de klant zelf kan natellen. Daarom
   staan ze bewust niet in kaartjes met schaduwen — een getal dat versierd wordt
   leest als een claim, een getal dat kaal staat leest als een feit. */
.bewijsbalk {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 26px 32px; max-width: 1100px; margin: 0 auto; padding: 40px 22px 8px;
  text-align: center;
}
.bewijsbalk .getal {
  display: block; font-size: clamp(28px, 4vw, 40px); font-weight: 600;
  letter-spacing: -.02em; color: var(--accent); line-height: 1.1;
}
.bewijsbalk .bij { display: block; margin-top: 6px; font-size: 14px; color: var(--ink-2); }
.bewijsbalk-voet {
  max-width: 1100px; margin: 10px auto 0; padding: 0 22px 40px;
  text-align: center; font-size: 13px; color: var(--ink-2);
}

/* De tabel scrolt in zijn eigen kader. Zonder dit duwt hij op een telefoon de
   hele pagina zijwaarts, en dan is de prijs juist het eerste dat wegvalt. */
.prijstabel-wrap { overflow-x: auto; margin: 8px 0 12px; }
.prijstabel { width: 100%; border-collapse: collapse; font-size: 15px; min-width: 640px; }
.prijstabel th, .prijstabel td { text-align: left; padding: 14px 16px; border-bottom: 1px solid rgba(25,27,24,.12); vertical-align: top; }
.prijstabel thead th { font-size: 13px; text-transform: uppercase; letter-spacing: .06em; color: var(--ink-2); font-weight: 500; border-bottom-width: 2px; }
.prijstabel tbody th { font-weight: 600; }
.prijstabel .werf-soort { display: block; font-weight: 400; font-size: 13px; color: var(--ink-2); margin-top: 2px; }
.prijstabel .bedrag { font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
.prijs-voorbehoud { font-size: 14px; color: var(--ink-2); max-width: 62ch; }
.prijs-kolommen { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 28px; margin-top: 18px; }
.prijs-kolommen h3 { font-size: 18px; margin: 0 0 8px; }
.prijs-kolommen p { margin: 0; }
.visueel-verborgen { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.prijs-inbegrepen { background: var(--bg-2,#efece3); padding: 56px 0; margin: 48px 0 56px; }
.prijs-inbegrepen h2 { margin: 0; }

/* ==============================================================================
   CARE4CREPI — DE COMPOSITIE (30-08-2026)
   ==============================================================================
   Waarom dit een eigen module is en niet nog wat ed-*-varianten: de vorige
   homepage was een STAPEL onderdelen — twee gespiegelde splits achter elkaar,
   zes identieke voor/na-tegels, een donkere balk met vinkjes. Elk onderdeel op
   zich netjes, samen voorspelbaar. Hier krijgt elke sectie een eigen ritme, en
   dat ritme zit in de breedte en de verhouding, niet in versiering.

   ÉÉN REGEL DIE ALLES STUURT: Care4Crepi verkoopt één oppervlak. Dus mag het
   materiaal groot in beeld — macro, textuur, hele gevelvlakken — en blijft de
   rest stil. Geen kaartjes met schaduw, geen tweede accentkleur. */

/* ---------------------------------------------------------------- de hero */
.c4hero { display: grid; grid-template-columns: 45fr 55fr; gap: 56px; align-items: center;
  max-width: 1480px; margin: 0 auto; padding: 56px 22px 72px; }
.c4hero h1 { font-size: clamp(38px, 5.2vw, 68px); line-height: 1.02; letter-spacing: -.035em;
  margin: 16px 0 18px; text-wrap: balance; }
.c4hero .sub { color: var(--ink-2); font-size: clamp(17px, 1.4vw, 19px); max-width: 44ch; }
.c4hero-knoppen { display: flex; gap: 12px; flex-wrap: wrap; margin: 28px 0 22px; }
/* De bewijsregel onder de knoppen: klein, één regel, geen kader. Ze hoort bij de
   belofte erboven en mag die niet overstemmen. */
.c4hero-bewijs { font-size: 14px; color: var(--ink-2); letter-spacing: .01em; }
.c4hero-bewijs b { color: var(--ink); font-weight: 600; }
.c4hero-beeld { margin: 0; }
.c4hero-beeld img { width: 100%; height: min(76vh, 660px); object-fit: cover; display: block; border-radius: 4px; }
@media (max-width: 980px) {
  .c4hero { grid-template-columns: 1fr; gap: 30px; padding-top: 28px; }
  .c4hero-beeld img { height: min(52vh, 420px); }
}

/* ------------------------------------------------- het ene grote bewijsstuk */
/* Bijna schermbreed, en met opzet ALLEEN. Zes sliders naast elkaar maken elk
   resultaat kleiner; één die je niet kan missen doet het omgekeerde. */
.c4bewijs { max-width: 1080px; margin: 0 auto; padding: 8px 22px 88px; }
.c4bewijs h2 { margin: 0 0 6px; }
.c4bewijs .aanwijzing { color: var(--ink-2); margin: 0 0 22px; font-size: 15px; }
.c4bewijs .ba { aspect-ratio: 1 / 1; border-radius: 4px; }
.c4bewijs figcaption { margin-top: 14px; font-size: 15px; color: var(--ink-2); }
.c4bewijs figcaption b { color: var(--ink); font-weight: 600; }
@media (max-width: 760px) { .c4bewijs .ba { aspect-ratio: 4 / 5; } }

/* ------------------------------------------------------------- de cijfers */
.c4cijfers { border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
  padding: 72px 22px; margin-bottom: 88px; }
.c4cijfers-binnen { max-width: 1320px; margin: 0 auto; }
.c4cijfers-kop { font-size: clamp(22px, 2.4vw, 30px); letter-spacing: -.02em; max-width: 24ch;
  margin: 0 0 44px; }
.c4cijfers-rij { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 44px 32px; }
.c4cijfers .getal { display: block; font-size: clamp(40px, 5.2vw, 66px); font-weight: 600;
  letter-spacing: -.04em; line-height: .95; color: var(--accent); font-variant-numeric: tabular-nums; }
.c4cijfers .bij { display: block; margin-top: 12px; font-size: 15px; color: var(--ink-2); max-width: 26ch; }
.c4cijfers-voet { margin: 40px 0 0; font-size: 13px; color: var(--ink-3); }

/* --------------------------------------------------- waarom een specialist */
.c4waarom { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center;
  max-width: 1480px; margin: 0 auto 96px; padding: 0 22px; }
.c4waarom img { width: 100%; height: min(78vh, 700px); object-fit: cover; display: block; border-radius: 4px; }
.c4waarom h2 { font-size: clamp(30px, 3.4vw, 44px); letter-spacing: -.03em; margin: 14px 0 32px; }
.c4waarom dl { margin: 0; display: grid; gap: 26px; }
.c4waarom dt { font-weight: 600; font-size: 18px; margin-bottom: 5px; }
.c4waarom dd { margin: 0; color: var(--ink-2); max-width: 44ch; }
@media (max-width: 980px) { .c4waarom { grid-template-columns: 1fr; gap: 28px; }
  .c4waarom img { height: min(50vh, 400px); } }

/* ------------------------------------------------------------- de prijzen */
/* De enige sectie die het merk hard onderbreekt, en dat is verdiend: dit is
   waar de concurrent "contacteer ons" schrijft en wij vier facturen tonen. */
.c4prijzen { background: #0D3438; color: var(--bg); padding: 92px 22px; margin-bottom: 96px; }
.c4prijzen-binnen { max-width: 1320px; margin: 0 auto; }
.c4prijzen h2 { color: var(--bg); font-size: clamp(30px, 3.6vw, 46px); letter-spacing: -.03em; margin: 0 0 12px; }
.c4prijzen .inleiding { color: rgba(248,245,237,.75); max-width: 54ch; margin: 0 0 48px; font-size: 17px; }
.c4prijzen-rij { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 40px 28px; }
.c4prijs .plaats { display: block; font-size: 14px; letter-spacing: .09em; text-transform: uppercase;
  color: rgba(248,245,237,.6); margin-bottom: 12px; }
.c4prijs .bedrag { display: block; font-size: clamp(34px, 4vw, 46px); font-weight: 600; letter-spacing: -.03em;
  line-height: 1; font-variant-numeric: tabular-nums; }
.c4prijs .btw { display: block; margin-top: 8px; font-size: 14px; color: rgba(248,245,237,.6); }
.c4prijs .detail { display: block; margin-top: 14px; font-size: 14px; color: rgba(248,245,237,.8); max-width: 24ch; }
.c4prijzen-voet { margin: 56px 0 0; display: flex; flex-wrap: wrap; gap: 12px 28px; align-items: baseline;
  justify-content: space-between; border-top: 1px solid rgba(248,245,237,.18); padding-top: 22px; }
.c4prijzen-voet p { margin: 0; color: rgba(248,245,237,.7); font-size: 14px; max-width: 60ch; }
.c4prijzen-voet a { color: var(--bg); font-weight: 600; border-bottom: 2px solid rgba(248,245,237,.45); }

/* ------------------------------------------------------------ de werkwijze */
/* Hier staat de verticale werfvideo, en niet in de hero: naast vier genummerde
   stappen heeft 9:16 een reden om 9:16 te zijn. */
.c4werk { max-width: 1320px; margin: 0 auto 96px; padding: 0 22px;
  display: grid; grid-template-columns: 1.1fr .9fr; gap: 64px; align-items: center; }
.c4werk h2 { font-size: clamp(30px, 3.4vw, 44px); letter-spacing: -.03em; margin: 0 0 34px; }
.c4stappen { list-style: none; margin: 0; padding: 0; display: grid; gap: 0; }
.c4stappen li { display: grid; grid-template-columns: 62px 1fr; gap: 18px; align-items: baseline;
  padding: 22px 0; border-top: 1px solid var(--line); }
.c4stappen li:last-child { border-bottom: 1px solid var(--line); }
.c4stappen .nr { font-size: 14px; color: var(--accent); font-weight: 600; letter-spacing: .08em;
  font-variant-numeric: tabular-nums; }
.c4stappen b { display: block; font-size: 18px; margin-bottom: 4px; }
.c4stappen p { margin: 0; color: var(--ink-2); font-size: 15px; max-width: 46ch; }
.c4werk-video { margin: 0; background: var(--ink); border-radius: 4px; padding: 22px; display: flex;
  justify-content: center; }
.c4werk-video video { height: min(70vh, 620px); width: auto; max-width: 100%; aspect-ratio: 9/16;
  object-fit: cover; display: block; border-radius: 2px; }
@media (max-width: 980px) { .c4werk { grid-template-columns: 1fr; gap: 32px; }
  .c4werk-video { order: 2; padding: 14px; } }

/* ----------------------------------------------------------- de realisaties */
/* Magazine in plaats van raster: elke rij heeft één beeld dat wint. */
.c4cases { max-width: 1480px; margin: 0 auto 96px; padding: 0 22px; }
.c4cases-kop { display: flex; flex-wrap: wrap; gap: 10px 24px; align-items: baseline;
  justify-content: space-between; margin-bottom: 28px; }
.c4cases-kop h2 { margin: 0; }
.c4cases-rij { display: grid; grid-template-columns: 1.62fr 1fr; gap: 22px; margin-bottom: 22px; align-items: stretch; }
.c4cases-rij.om { grid-template-columns: 1fr 1.62fr; }
.c4cases-rij.om .c4case-groot { order: 2; }
.c4cases-klein { display: grid; gap: 22px; }
.c4case { margin: 0; position: relative; overflow: hidden; border-radius: 4px; }
.c4case img { width: 100%; height: 100%; object-fit: cover; display: block; }
.c4case-groot img { height: min(66vh, 580px); }
.c4cases-klein .c4case img { height: min(31vh, 279px); }
.c4case figcaption { position: absolute; left: 0; right: 0; bottom: 0; padding: 76px 20px 18px;
  background: linear-gradient(rgba(13,52,56,0) 12%, rgba(13,52,56,.62) 55%, rgba(13,52,56,.9));
  color: var(--bg); }
.c4case .plaats { display: block; font-weight: 600; font-size: 18px; }
.c4case .feiten { display: block; margin-top: 4px; font-size: 14px; color: rgba(248,245,237,.85); }
@media (max-width: 900px) { .c4cases-rij, .c4cases-rij.om { grid-template-columns: 1fr; }
  .c4cases-rij.om .c4case-groot { order: 0; }
  .c4case-groot img, .c4cases-klein .c4case img { height: 260px; } }

/* -------------------------------------------------------------- de reviews */
.c4reviews { max-width: 1320px; margin: 0 auto 96px; padding: 0 22px;
  display: grid; grid-template-columns: 1.6fr 1fr; gap: 56px; align-items: center; }
.c4reviews blockquote { margin: 0; }
.c4reviews .quote { font-family: var(--serif, Georgia, serif); font-style: italic;
  font-size: clamp(23px, 2.7vw, 36px); line-height: 1.32; letter-spacing: -.02em; margin: 0; }
.c4reviews .wie { margin-top: 20px; color: var(--ink-2); font-size: 15px; }
.c4reviews .wie b { color: var(--ink); }
.c4score { border-left: 1px solid var(--line); padding-left: 40px; }
.c4score .cijfer { font-size: clamp(52px, 6vw, 76px); font-weight: 600; letter-spacing: -.04em; line-height: 1; }
.c4score .sterren { color: var(--accent); letter-spacing: .18em; font-size: 18px; margin: 10px 0 8px; }
.c4score p { margin: 0; color: var(--ink-2); font-size: 15px; }
@media (max-width: 900px) { .c4reviews { grid-template-columns: 1fr; gap: 30px; }
  .c4score { border-left: none; border-top: 1px solid var(--line); padding: 26px 0 0; } }

/* ------------------------------------------------------------- garantie/faq */
.c4garantie { max-width: 1320px; margin: 0 auto 88px; padding: 0 22px; }
.c4garantie-binnen { background: var(--bg-2); border-left: 4px solid var(--accent);
  padding: 30px 34px; border-radius: 0 4px 4px 0; max-width: 860px; }
.c4garantie h3 { margin: 0 0 8px; font-size: 21px; }
.c4garantie p { margin: 0; max-width: 62ch; }

.c4faq { max-width: 1320px; margin: 0 auto 96px; padding: 0 22px;
  display: grid; grid-template-columns: 1.5fr .8fr; gap: 64px; align-items: start; }
.c4faq h2 { margin: 0 0 18px; }
.c4hulp { position: sticky; top: 24px; background: var(--bg-2); border-radius: 4px; padding: 28px 30px; }
.c4hulp h3 { margin: 0 0 10px; font-size: 20px; }
.c4hulp p { margin: 0 0 18px; color: var(--ink-2); font-size: 15px; }
.c4hulp .tel { display: block; font-size: 24px; font-weight: 600; letter-spacing: -.02em; margin-bottom: 16px; color: var(--ink); }
@media (max-width: 900px) { .c4faq { grid-template-columns: 1fr; gap: 30px; } .c4hulp { position: static; } }

/* ----------------------------------------------------------------- het slot */
.c4slot { background: #0D3438; color: var(--bg); padding: 88px 22px; }
.c4slot-binnen { max-width: 1320px; margin: 0 auto; display: grid; grid-template-columns: 1fr 1fr;
  gap: 64px; align-items: center; }
.c4slot h2 { color: var(--bg); font-size: clamp(32px, 4vw, 52px); letter-spacing: -.03em; margin: 0 0 16px; }
.c4slot .sub { color: rgba(248,245,237,.8); max-width: 44ch; font-size: 17px; margin: 0 0 26px; }
.c4slot .btn-ghost { color: var(--bg); border-color: rgba(248,245,237,.45); }
.c4slot .btn-ghost:hover { background: var(--bg); color: var(--ink); border-color: var(--bg); }
.c4slot .voorwaarden { margin: 24px 0 0; font-size: 14px; color: rgba(248,245,237,.7); }
.c4slot .voorwaarden a { color: rgba(248,245,237,.9); }
/* Het formulier komt uit een HubSpot-iframe en is dus niet van binnenuit te
   stylen. Daarom staat het op zijn eigen lichte kaart in plaats van los op het
   donker — dat is de enige manier waarop het leesbaar blijft. */
.c4slot-kaart { background: var(--bg); color: var(--ink); border-radius: 4px; padding: 30px 32px; }
.c4slot-kaart h3 { margin: 0 0 4px; font-size: 20px; }
.c4slot-kaart .klein { margin: 0 0 16px; font-size: 14px; color: var(--ink-2); }
@media (max-width: 900px) { .c4slot-binnen { grid-template-columns: 1fr; gap: 32px; } }

/* Een getal dat eigenlijk een woord is ("1 werkdag") mag de rij niet uit elkaar
   trekken: kleiner en op één regel, zodat de vier bijschriften op dezelfde lijn
   blijven staan. */
.c4cijfers .getal.woord { font-size: clamp(30px, 3.4vw, 44px); white-space: nowrap; }

/* HET FORMULIER IS EEN IFRAME, en daarom staat het op een lichte kaart.
   Gemeten op de live pagina: HubSpot zet een <iframe class="hs-form-iframe"> van
   462px in de container. Wat daarin staat is van een andere oorsprong en dus
   NIET van hieruit te stylen — een poging daartoe stond hier even en deed
   niets. Vandaar de kaart: het is de enige manier om dat formulier leesbaar op
   een donkere sectie te krijgen. Wil je de velden zelf anders, dan gebeurt dat
   in HubSpot (Formulier > Stijl), niet in dit bestand. */
.c4slot-kaart .hs-form-iframe { border: none; }

/* ==============================================================================
   DE WERFKAARTEN — een prijs met een gevel erbij
   ==============================================================================
   Een bedrag zonder beeld is een bewering; een bedrag naast de gevel waarvoor
   het betaald is, is een bewijs. Vandaar dat het beeld hier even zwaar weegt als
   het cijfer en niet als illustratie achteraan hangt.

   WAT ER BEWUST NIET BIJ STAAT: vierkante meters, het type crepi, de soort
   vervuiling. Die gegevens zijn voor deze vijf werven niet bevestigd, en een
   tabel die er mooi uitziet is geen reden om ze in te vullen. */
.c4werven { max-width: 1480px; margin: 0 auto 40px; padding: 0 22px;
  display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 26px; }
.c4werf { margin: 0; }
.c4werf img { width: 100%; height: min(42vh, 340px); object-fit: cover; display: block; border-radius: 4px; }
.c4werf .plaats { display: block; margin-top: 16px; font-size: 13px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink-3); }
.c4werf .bedrag { display: block; margin-top: 8px; font-size: clamp(30px, 3.4vw, 40px); font-weight: 600;
  letter-spacing: -.03em; line-height: 1; font-variant-numeric: tabular-nums; color: var(--accent); }
.c4werf .btw { display: block; margin-top: 6px; font-size: 14px; color: var(--ink-2); }
.c4werf .wat { display: block; margin-top: 12px; font-size: 14.5px; color: var(--ink-2); max-width: 30ch;
  padding-top: 12px; border-top: 1px solid var(--line); }
/* De vijfde werf heeft geen publiek bedrag. Ze staat er toch bij, want ze weglaten
   zou de rij vier keer "particuliere woning" laten lijken op de hele praktijk. */
.c4werf.opmaat .bedrag { font-size: clamp(20px, 2.2vw, 26px); color: var(--ink-2); }

.c4uitleg { max-width: 1320px; margin: 0 auto 88px; padding: 0 22px; }
.c4uitleg-rij { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 30px; margin-top: 24px; }
.c4uitleg h3 { font-size: 19px; margin: 0 0 8px; }
.c4uitleg p { margin: 0; color: var(--ink-2); }

.c4factoren { max-width: 1480px; margin: 0 auto 96px; padding: 0 22px;
  display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }
.c4factoren img { width: 100%; height: min(70vh, 620px); object-fit: cover; display: block; border-radius: 4px; }
.c4factoren ol { margin: 22px 0 0; padding: 0; list-style: none; counter-reset: f; }
.c4factoren li { counter-increment: f; padding: 18px 0; border-top: 1px solid var(--line);
  display: grid; grid-template-columns: 42px 1fr; gap: 16px; }
.c4factoren li:last-child { border-bottom: 1px solid var(--line); }
.c4factoren li::before { content: counter(f, decimal-leading-zero); font-family: inherit; font-size: 13px;
  color: var(--accent); font-weight: 600; letter-spacing: .08em; }
.c4factoren b { display: block; margin-bottom: 3px; }
.c4factoren li p { margin: 0; color: var(--ink-2); font-size: 15px; }
@media (max-width: 980px) { .c4factoren { grid-template-columns: 1fr; gap: 28px; }
  .c4factoren img { height: min(46vh, 380px); } }
/* De vijfde werf heeft geen publiek bedrag en geen eigen foto. Ze krijgt daarom
   geen kaart in de rij van vier: een lege plek, of een willekeurige gevel erbij,
   zou suggereren dat we van dit project iets tonen wat we niet hebben. */
.c4opmaat { max-width: 1480px; margin: 0 auto 34px; padding: 26px 22px 0;
  display: grid; grid-template-columns: 1.4fr 1fr; gap: 40px; align-items: end;
  border-top: 1px solid var(--line); }
.c4opmaat .plaats { display: block; font-size: 13px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-3); }
.c4opmaat h3 { margin: 10px 0 8px; font-size: 22px; }
.c4opmaat p { margin: 0; color: var(--ink-2); max-width: 56ch; }
.c4opmaat .waarom { font-size: 14px; color: var(--ink-3); }
@media (max-width: 860px) { .c4opmaat { grid-template-columns: 1fr; gap: 16px; } }

/* ==============================================================================
   DE DIEPTE — waar de lange SEO-inhoud staat
   ==============================================================================
   Er verdwijnt hier geen onderwerp. Wat verdwijnt is de STREPING: de oude pagina
   wisselde per sectie van achtergrondkleur, en juist dat leest als een sjabloon
   in plaats van als een artikel. Wat ervoor in de plaats komt is een haarlijn en
   lucht — hetzelfde ritme als de rest van de site.

   De blokken hierbinnen zijn de bestaande secties, ongewijzigd van inhoud. Ze
   staan alleen in een andere volgorde en onder het conversiegedeelte, want wie
   wil bestellen is dan al bediend en wie wil begrijpen leest verder. */
.c4diepte { border-top: 1px solid var(--line); margin-top: 8px; }
.c4diepte > .section { padding: 56px 0; border-bottom: 1px solid var(--line); }
.c4diepte > .section:last-child { border-bottom: none; }
.c4diepte .container-narrow { max-width: 760px; }
.c4diepte h2 { font-size: clamp(24px, 2.6vw, 33px); letter-spacing: -.025em; }
