:root {
  --color-background: #f4f1ea;
  --color-surface: #fffdf8;
  --color-card: #ffffff;
  --color-text: #20231f;
  --color-muted: #696d66;
  --color-accent: #42594a;
  --color-accent-dark: #304237;
  --color-wood: #8a5a34;
  --color-wood-light: #d9b98f;
  --color-border: #d9d5cb;
  --color-dark: #202721;
  --color-white: #ffffff;
  --color-header-bg: rgba(244, 241, 234, 0.94);
  --color-header-border: rgba(217, 213, 203, 0.8);

  --font-main: 'Manrope', Arial, Helvetica, sans-serif;
  --container-width: 960px;
  --radius-small: 6px;
  --radius-medium: 14px;
  --shadow-soft: 0 18px 50px rgba(32, 35, 31, 0.08);
  --header-offset: 96px;
  --header-height: 79px;
  --hero-height: 70vh;
}

/* DONKER THEMA
   Wordt geactiveerd met data-theme="dark" op <html> (zie het kleine
   <script> vroeg in <head> van elke pagina, en de knop-logica in
   assets/js/shared.js). Secties die altijd al donker waren (.hero,
   .site-footer, .section-dark, de lightbox) blijven ongewijzigd — die
   zijn met opzet al donker, in beide thema's.
   Bewust duidelijk verschil tussen achtergrond/vlak/kaart (i.p.v. 3
   tinten die nauwelijks van elkaar te onderscheiden waren) — kaarten
   en knoppen mogen best goed "loskomen" van de achtergrond, anders
   verdwijnt alle diepte en oogt alles plat. --shadow-soft krijgt hier
   ook een eigen, veel donkerdere versie: de lichte schaduw van het
   lichte thema is op een toch al donkere achtergrond gewoon onzichtbaar. */
:root[data-theme="dark"] {
  --color-background: #14160f;
  --color-surface: #1e2117;
  --color-card: #2b2f22;
  --color-text: #f2f0e6;
  --color-muted: #aab0a0;
  --color-accent: #8bbb98;
  --color-accent-dark: #aed6b8;
  --color-wood: #dfab6d;
  --color-wood-light: #efd7ac;
  --color-border: #454b3a;
  --color-header-bg: rgba(20, 22, 15, 0.92);
  --color-header-border: rgba(69, 75, 58, 0.8);
  --shadow-soft: 0 18px 50px rgba(0, 0, 0, 0.55);
}

* {
  box-sizing: border-box;
}

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
}

/* Publieke site: geen horizontale overflow; admin (.admin-page) scrollt apart. */
html:not(.admin-page) {
  overflow-x: clip;
  max-width: 100%;
  overscroll-behavior-y: none;
}

/* De header is sticky en overlapt anders de bovenkant van elke sectie
   waar je naartoe scrollt (via menu, "terug naar boven" of het archief).
   scroll-margin-top zorgt dat er altijd ruimte voor de header vrijblijft. */
[id] {
  scroll-margin-top: var(--header-offset);
}

body {
  margin: 0;
  font-family: var(--font-main);
  color: var(--color-text);
  background: var(--color-background);
  line-height: 1.65;
}

body:not(.admin-body) {
  overflow-x: clip;
  max-width: 100%;
  overscroll-behavior-y: none;
}

/* DESKTOP SCROLLBAR — thema-matched, zichtbare thumb op pagina-niveau.
   Op mobiel volledig verborgen, zie @media 820px. */
@media (min-width: 821px) {
  html:not(.admin-page),
  body:not(.admin-body) {
    scrollbar-width: thin;
    scrollbar-color: #42594a #ddd8cc;
  }

  html:not(.admin-page)::-webkit-scrollbar,
  body:not(.admin-body)::-webkit-scrollbar {
    width: 12px;
  }

  html:not(.admin-page)::-webkit-scrollbar-track,
  body:not(.admin-body)::-webkit-scrollbar-track {
    background: #ddd8cc;
  }

  html:not(.admin-page)::-webkit-scrollbar-thumb,
  body:not(.admin-body)::-webkit-scrollbar-thumb {
    background-color: #42594a;
    border-radius: 6px;
    border: 2px solid transparent;
    background-clip: padding-box;
    min-height: 48px;
  }

  html:not(.admin-page)::-webkit-scrollbar-thumb:hover,
  body:not(.admin-body)::-webkit-scrollbar-thumb:hover {
    background-color: #304237;
  }

  html:not(.admin-page)[data-theme="dark"],
  body:not(.admin-body)[data-theme="dark"] {
    scrollbar-color: #aab0a0 #1e2117;
  }

  html:not(.admin-page)[data-theme="dark"]::-webkit-scrollbar-track,
  body:not(.admin-body)[data-theme="dark"]::-webkit-scrollbar-track,
  html[data-theme="dark"]:not(.admin-page) body:not(.admin-body)::-webkit-scrollbar-track {
    background: #1e2117;
  }

  html:not(.admin-page)[data-theme="dark"]::-webkit-scrollbar-thumb,
  body:not(.admin-body)[data-theme="dark"]::-webkit-scrollbar-thumb,
  html[data-theme="dark"]:not(.admin-page) body:not(.admin-body)::-webkit-scrollbar-thumb {
    background-color: #aab0a0;
    border-color: transparent;
  }

  html:not(.admin-page)[data-theme="dark"]::-webkit-scrollbar-thumb:hover,
  body:not(.admin-body)[data-theme="dark"]::-webkit-scrollbar-thumb:hover,
  html[data-theme="dark"]:not(.admin-page) body:not(.admin-body)::-webkit-scrollbar-thumb:hover {
    background-color: #c5cabb;
  }
}

/* De rest van de pagina schuift, met een ondoorzichtige achtergrond
   en een hogere z-index, over de vast-staande hero (.hero) heen. De
   margin-top houdt bij het laden precies de ruimte vrij die de vaste
   header + hero innemen. */
main {
  position: relative;
  z-index: 1;
  margin-top: var(--hero-height);
  background: var(--color-background);
}

img {
  display: block;
  width: 100%;
  max-width: 100%;
  height: auto;
}

a {
  color: inherit;
  text-decoration: none;
}

button,
input,
textarea {
  font: inherit;
}

.container {
  width: min(calc(100% - 40px), var(--container-width));
  margin: 0 auto;
}

.section {
  padding: 72px 0;
}

.section-light {
  background: var(--color-surface);
}

.section-dark {
  color: var(--color-white);
  background: var(--color-dark);
}

.eyebrow {
  margin: 0 0 14px;
  color: var(--color-wood);
  font-size: 0.82rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

.section-dark .eyebrow,
.hero .eyebrow {
  color: var(--color-wood-light);
}

h1,
h2,
h3,
p {
  margin-top: 0;
}

h1 {
  max-width: 700px;
  margin-bottom: 18px;
  font-size: clamp(2rem, 4.5vw, 3.4rem);
  line-height: 1.05;
  letter-spacing: -0.04em;
}

h2 {
  margin-bottom: 18px;
  font-size: clamp(1.6rem, 2.8vw, 2.3rem);
  line-height: 1.15;
  letter-spacing: -0.03em;
}

h3 {
  margin-bottom: 8px;
  font-size: 1.2rem;
  line-height: 1.25;
}

.button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 50px;
  padding: 13px 22px;
  border: 0;
  border-radius: var(--radius-small);
  cursor: pointer;
  font-weight: 700;
  transition: transform 160ms ease, background 160ms ease;
}

.button:hover {
  transform: translateY(-2px);
}

.button-primary {
  color: var(--color-white);
  background: var(--color-accent);
}

.button-primary:hover {
  background: var(--color-accent-dark);
}

/* Alleen op mobiel zichtbaar (zie @media 560px) — op desktop staat
   "Archief" toch al gewoon in de navigatie. */
.projects-archive-link {
  display: none;
}

/* SCROLL-ANIMATIE: elementen met de klasse "reveal" beginnen onzichtbaar
   en iets lager, en schuiven/faden in zodra ze in beeld scrollen (zie
   IntersectionObserver in shared.js). Geen plugins nodig. */
.reveal {
  opacity: 0;
  transform: translateY(22px);
  transition: opacity 650ms ease, transform 650ms ease;
}

.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .reveal {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* HEADER */
.site-header {
  position: sticky;
  top: 0;
  z-index: 1000;
  border-bottom: 1px solid var(--color-header-border);
  background: var(--color-header-bg);
  backdrop-filter: blur(14px);
}

.header-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 78px;
  gap: 30px;
}

.logo {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  height: 48px;
}

.logo img {
  width: auto;
  height: 100%;
}

.logo-text {
  display: flex;
  flex-direction: column;
  justify-content: center;
  line-height: 1.2;
  color: var(--color-text);
  font-weight: 700;
}

.logo-text span {
  display: block;
}

.logo-text .logo-text-small {
  font-size: 0.68rem;
  font-weight: 400;
  letter-spacing: 0.04em;
  color: var(--color-muted);
  text-transform: uppercase;
}

.logo-text .logo-text-large {
  font-size: 0.92rem;
}

.header-right {
  display: flex;
  align-items: center;
  gap: 18px;
}

.main-navigation {
  display: flex;
  align-items: center;
  gap: 28px;
}

.main-navigation a {
  color: var(--color-muted);
  font-size: 0.95rem;
  font-weight: 700;
}

.main-navigation a:hover {
  color: var(--color-text);
}

.main-navigation a[hidden] {
  display: none !important;
}

/* Rijtje met de thema-schuifknop, staat in de HTML altijd in het
   uitklapmenu maar is alleen zichtbaar zodra dat menu er ook echt
   uitziet als dropdown (zie @media 820px hierboven). Op desktop, waar
   de navigatie een gewone horizontale balk is, blijft dit verborgen —
   daar staat het losse ronde thema-knopje gewoon in de header. */
.nav-theme-row {
  display: none;
}

/* THEMA-SCHUIFKNOP (mobiel menu): zon links, maan rechts, het bolletje
   schuift ertussenin — hetzelfde thema wisselen als de ronde knop in
   de header, alleen als iOS-achtige schakelaar. */
.theme-switch {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: space-between;
  width: 52px;
  height: 28px;
  padding: 0 6px;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  background: var(--color-bg);
  color: var(--color-muted);
  cursor: pointer;
}

.theme-switch svg {
  position: relative;
  z-index: 1;
  width: 13px;
  height: 13px;
}

.theme-switch-knob {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--color-accent);
  box-shadow: var(--shadow-soft);
  transition: transform 200ms ease;
}

:root[data-theme="dark"] .theme-switch-knob {
  transform: translateX(24px);
}

.menu-button {
  display: none;
  place-items: center;
  width: 38px;
  height: 38px;
  padding: 0;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  background: transparent;
  color: var(--color-muted);
  cursor: pointer;
  transition: border-color 160ms ease, color 160ms ease;
}

.menu-button:hover {
  border-color: var(--color-accent);
  color: var(--color-accent);
}

.menu-button svg {
  width: 18px;
  height: 18px;
}

.menu-button-icon-close {
  display: none;
}

/* ZOEKBALK: vergrootglas-icoon dat een zoekveld laat uitschuiven.
   Zoekt live op plaatsnaam en toont een dropdown van resultaten. */
.site-search {
  position: relative;
  display: flex;
  align-items: center;
  gap: 6px;
}

/* Position: absolute, en ver naar links open klappend, zodat de rest
   van de header (menu, taal, thema) niet meeschuift zodra je zoekt —
   het veld "zweeft" gewoon los over wat er toevallig achter zit. */
.site-search-field {
  position: absolute;
  top: 50%;
  right: 46px;
  transform: translateY(-50%);
  z-index: 5;
  width: 0;
  overflow: hidden;
  transition: width 240ms ease;
}

.site-search.is-open .site-search-field {
  width: min(260px, 55vw);
}

.site-search-input {
  width: min(260px, 55vw);
  height: 38px;
  padding: 0 14px;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  background: var(--color-surface);
  color: var(--color-text);
  box-shadow: var(--shadow-soft);
  box-sizing: border-box;
}

.site-search-input:focus {
  outline: 2px solid rgba(66, 89, 74, 0.2);
  border-color: var(--color-accent);
}

/* De browser's eigen kruisje in een input[type=search] uitzetten — op
   mobiel hebben we al een eigen sluitknop (de menuknop wordt daar
   tijdelijk een kruisje, zie @media 820px). */
.site-search-input::-webkit-search-cancel-button {
  display: none;
}

.site-search-toggle {
  display: grid;
  flex: 0 0 auto;
  place-items: center;
  width: 38px;
  height: 38px;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  background: transparent;
  color: var(--color-muted);
  cursor: pointer;
  transition: border-color 160ms ease, color 160ms ease;
}

.site-search-toggle:hover,
.site-search.is-open .site-search-toggle {
  border-color: var(--color-accent);
  color: var(--color-accent);
}

/* Dit kruisje-icoon wordt niet meer gebruikt op desktop (daar blijft
   de knop gewoon een vergrootglas, zoals altijd) — alleen op mobiel
   dient de mènuknop tijdelijk als sluitknop (zie .menu-button-icon-close
   in de @media 820px hierboven). Simpelweg verborgen laten. */
.site-search-toggle .site-search-icon-close {
  display: none;
}

.site-search-results {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: 1001;
  width: min(300px, 80vw);
  max-height: 320px;
  overflow-y: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-small);
  background: var(--color-surface);
  box-shadow: var(--shadow-soft);
}

.site-search-results::-webkit-scrollbar {
  width: 0;
  height: 0;
  display: none;
}

.site-search-result {
  display: flex;
  width: 100%;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 11px 16px;
  border: 0;
  border-top: 1px solid var(--color-border);
  background: transparent;
  text-align: left;
  cursor: pointer;
}

.site-search-result:first-child {
  border-top: 0;
}

.site-search-result:hover {
  background: rgba(66, 89, 74, 0.08);
}

.site-search-result strong {
  color: var(--color-text);
}

.site-search-result span {
  color: var(--color-muted);
  font-size: 0.85rem;
  white-space: nowrap;
}

.site-search-empty {
  margin: 0;
  padding: 12px 16px;
  color: var(--color-muted);
  font-size: 0.9rem;
}

/* TAALKEUZE: vlaggetje dat uitklapt naar de taalopties */
.lang-switch {
  position: relative;
}

.lang-switch-toggle {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  padding: 0;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  background: transparent;
  cursor: pointer;
  overflow: hidden;
  transition: border-color 160ms ease;
}

.lang-switch-toggle:hover,
.lang-switch.is-open .lang-switch-toggle {
  border-color: var(--color-accent);
}

.lang-switch-toggle svg,
.lang-flag svg {
  display: block;
  width: 20px;
  height: 14px;
  border-radius: 2px;
}

/* Kruisje om de zoekbalk te sluiten — verborgen, alleen zichtbaar op
   mobiel zodra de zoekbalk openstaat (zie @media 820px). Extra
   ".lang-switch-toggle" ervoor nodig: anders wint de bredere
   ".lang-switch-toggle svg"-regel hierboven altijd (1 klasse + 1
   element telt zwaarder dan 1 kale klasse). */
.lang-switch-toggle .lang-switch-icon-close {
  display: none;
  width: 18px;
  height: 18px;
}

/* THEMA-KNOP: zonnetje bij licht thema, maantje bij donker thema.
   Welk icoon zichtbaar is, wordt bepaald door data-theme op <html>
   (zie assets/js/shared.js) — puur met CSS, geen icoon-wissel via JS. */
.theme-toggle {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  padding: 0;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  background: transparent;
  color: var(--color-muted);
  cursor: pointer;
  transition: border-color 160ms ease, color 160ms ease;
}

.theme-toggle:hover {
  border-color: var(--color-accent);
  color: var(--color-accent);
}

.theme-toggle svg {
  width: 18px;
  height: 18px;
}

/* ".theme-toggle svg" hierboven telt als 1 klasse + 1 element, dus dat
   wint anders altijd van ".theme-icon-moon" (1 klasse) — vandaar de
   extra ".theme-toggle" ervoor, net als eerder bij het taalmenu en de
   lightbox-pijltjes. */
.theme-toggle .theme-icon-moon {
  display: none;
}

.theme-toggle .theme-icon-sun {
  display: block;
}

:root[data-theme="dark"] .theme-toggle .theme-icon-sun {
  display: none;
}

:root[data-theme="dark"] .theme-toggle .theme-icon-moon {
  display: block;
}

.lang-switch-menu {
  position: absolute;
  top: calc(100% + 8px);
  right: 0;
  z-index: 1001;
  display: none;
  flex-direction: column;
  width: 160px;
  overflow: hidden;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-small);
  background: var(--color-surface);
  box-shadow: var(--shadow-soft);
}

/* "display: flex" hoort hier (niet in de regel hierboven), anders
   wint dat altijd van het "hidden"-attribuut en blijft het menu open */
.lang-switch.is-open .lang-switch-menu {
  display: flex;
}

.lang-switch-option {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 11px 14px;
  border: 0;
  border-top: 1px solid var(--color-border);
  background: transparent;
  color: var(--color-text);
  font-size: 0.9rem;
  text-align: left;
  cursor: pointer;
}

.lang-switch-option:first-child {
  border-top: 0;
}

.lang-switch-option:hover {
  background: rgba(66, 89, 74, 0.08);
}

.lang-switch-option.is-active {
  color: var(--color-accent);
  font-weight: 700;
}

/* HERO
   Blijft vast op zijn plek (position: fixed) terwijl de rest van de
   pagina eroverheen naar boven scrolt. <main> krijgt daarom bovenaan
   precies zoveel ruimte als de header + hero
   samen innemen, zodat er geen gat ontstaat en de pagina er bij het
   laden nog steeds normaal uitziet. */
/* Eén doorlopende, randvullende foto ("cover", zoals voorheen — geen
   donkere balken meer). De naam staat links, waar de foto via een
   duidelijke fade overloopt in het donker — geen harde knip. Rechts
   vervaagt de foto ook heel licht, als subtiel randje. */
.hero {
  position: fixed;
  top: var(--header-height);
  left: 0;
  z-index: 0;
  display: flex;
  align-items: center;
  width: 100%;
  height: var(--hero-height);
  overflow: hidden;
  color: var(--color-white);
}

/* X-RAY-EFFECT: de gewone foto (.hero-photo) ligt boven de röntgenfoto
   (.hero-xray). Beweeg je de muis over de hero, dan krijgt .hero-photo
   op die plek een zachte uitsparing (via mask-image) waardoor de
   röntgenfoto er rond de cursor doorheen schijnt. Bewust geen perfecte,
   strak uitgesneden cirkel: --hero-rx/--hero-ry "wobbelen" continu een
   beetje (zie het <script> onderaan), en de fade zelf is breed en met
   meerdere tussenstappen — dat oogt organischer dan een harde rand. */
.hero-xray {
  position: absolute;
  inset: 0;
  z-index: 0;
  background-position: center;
  background-size: cover;
}

/* Op mobiel/tablet staat het x-ray-effect toch al uit (zie
   isMobileViewport() in shared.js) — de röntgenfoto daar dus ook
   helemaal niet laden. Dat voorkomt een kort "flitsje" van de
   röntgenfoto vlak na het laden: die is een stuk kleiner dan de nieuwe
   mobiele foto's en kon daardoor soms sneller binnen zijn, waardoor hij
   even zichtbaar was voordat de echte foto eroverheen kwam. */
@media (min-width: 821px) {
  .hero-xray {
    background-image: url("/assets/images/hero/woning-banner-xray.jpg");
  }
}

.hero-photo {
  position: absolute;
  inset: 0;
  z-index: 1;
  background-image: url("/assets/images/hero/woning-banner.jpg");
  background-position: center;
  background-size: cover;
  -webkit-mask-image: radial-gradient(
    ellipse var(--hero-rx, 130px) var(--hero-ry, 130px) at var(--hero-mx, -9999px) var(--hero-my, -9999px),
    transparent 0%,
    transparent 22%,
    rgba(0, 0, 0, 0.25) 45%,
    rgba(0, 0, 0, 0.6) 68%,
    rgba(0, 0, 0, 0.88) 86%,
    black 100%
  );
  mask-image: radial-gradient(
    ellipse var(--hero-rx, 130px) var(--hero-ry, 130px) at var(--hero-mx, -9999px) var(--hero-my, -9999px),
    transparent 0%,
    transparent 22%,
    rgba(0, 0, 0, 0.25) 45%,
    rgba(0, 0, 0, 0.6) 68%,
    rgba(0, 0, 0, 0.88) 86%,
    black 100%
  );
}

/* De donkere fade links (achter de tekst) zit al in de foto zelf
   gebakken (assets/images/hero/woning-banner.jpg). Hier alleen nog
   een heel lichte fade uiterst rechts, als subtiel randje. */
.hero-overlay {
  position: absolute;
  inset: 0;
  z-index: 2;
  background: linear-gradient(
    90deg,
    rgba(32, 39, 33, 0) 85%,
    rgba(32, 39, 33, 0.28) 100%
  );
}

.hero-content {
  position: relative;
  z-index: 3;
  max-width: 640px;
  padding-left: max(24px, calc((100vw - var(--container-width)) / 2));
  padding-right: 24px;
}

/* Los van de gecentreerde titel: staat onderin de foto, met wat
   ruimte tot de onderrand (niet letterlijk op de bodem). */
.hero-subtext {
  position: absolute;
  left: max(24px, calc((100vw - var(--container-width)) / 2));
  right: 24px;
  bottom: 48px;
  z-index: 3;
  max-width: 640px;
  margin: 0;
  color: var(--color-wood-light);
  font-size: 1.05rem;
  line-height: 1.6;
}

.hero-subtext span {
  display: block;
}

/* Titel in 2 vaste regels: "Timmer- en Onderhoudsbedrijf" klein
   erboven, "C. Venema" groot eronder — geen onhandige losse afbreking
   meer van lange woorden. */
.hero-title {
  display: flex;
  flex-direction: column;
  gap: 6px;
  max-width: none;
  margin-bottom: 18px;
}

.hero-title-line1 {
  font-size: clamp(1rem, 2.1vw, 1.5rem);
  font-weight: 700;
  letter-spacing: -0.01em;
  line-height: 1.2;
}

.hero-title-line2 {
  font-size: clamp(2.6rem, 6vw, 4.4rem);
  font-weight: 800;
  line-height: 1;
  letter-spacing: -0.04em;
}

/* PROJECTEN */
.section-heading {
  display: flex;
  justify-content: space-between;
  gap: 40px;
  margin-bottom: 48px;
}

.section-heading > p {
  max-width: 430px;
  color: var(--color-muted);
}

.projects-subheading {
  margin: 0 0 20px;
  font-size: 1.1rem;
}

.projects-subheading-spaced {
  margin-top: 44px;
}

.project-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 22px;
}

.project-grid:empty {
  display: none;
}

.project-card {
  display: block;
  overflow: hidden;
  border-radius: var(--radius-medium);
  background: var(--color-card);
  box-shadow: var(--shadow-soft);
  cursor: pointer;
  outline: 2px solid transparent;
  outline-offset: 3px;
  transition: outline-color 220ms ease, box-shadow 220ms ease;
}

.project-card:hover {
  outline-color: var(--color-accent);
  box-shadow: 0 22px 55px rgba(32, 35, 31, 0.16);
}

.project-card.is-archive-target {
  outline-color: var(--color-accent);
}

.project-card img,
.project-card video {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  transform: translate(var(--crop-x, 0px), var(--crop-y, 0px)) scale(var(--crop-s, 1));
  transition: transform 450ms ease;
}

.project-cover-slide img,
.project-cover-slide video {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  max-width: none;
  aspect-ratio: unset;
  object-fit: cover;
  object-position: center;
  transform: translate(var(--crop-x, 0px), var(--crop-y, 0px)) scale(var(--crop-s, 1));
  transform-origin: center center;
  transition: transform 450ms ease;
}

.project-card:hover img,
.project-card:hover video,
.project-card:hover .project-cover-slide img,
.project-card:hover .project-cover-slide video {
  transform: translate(var(--crop-x, 0px), var(--crop-y, 0px)) scale(calc(var(--crop-s, 1) * 1.06));
}

.project-card:hover .photo-blur-wrap img,
.project-card:hover .photo-blur-wrap video,
.project-card:hover .project-cover-slide .photo-blur-wrap img,
.project-card:hover .project-cover-slide .photo-blur-wrap video {
  transform: none;
}

.project-cover-slide .photo-blur-wrap {
  position: absolute;
  inset: 0;
  transform: translate(var(--crop-x, 0px), var(--crop-y, 0px)) scale(var(--crop-s, 1));
  transform-origin: center center;
  transition: transform 450ms ease;
}

.project-card > .photo-blur-wrap {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  transform: translate(var(--crop-x, 0px), var(--crop-y, 0px)) scale(var(--crop-s, 1));
  transform-origin: center center;
  transition: transform 450ms ease;
}

.photo-blur-wrap {
  position: relative;
  display: block;
  width: 100%;
  height: 100%;
  overflow: hidden;
  isolation: isolate;
}

.photo-blur-wrap > img,
.photo-blur-wrap > video {
  display: block;
  width: 100%;
  height: 100%;
  aspect-ratio: unset;
  object-fit: cover;
  transform: none;
  transition: none;
}

.project-card:hover .photo-blur-wrap {
  transform: translate(var(--crop-x, 0px), var(--crop-y, 0px)) scale(calc(var(--crop-s, 1) * 1.06));
}

.project-card:hover .project-cover-slide .photo-blur-wrap {
  transform: translate(var(--crop-x, 0px), var(--crop-y, 0px)) scale(calc(var(--crop-s, 1) * 1.06));
}

.photo-blur-layer {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 2;
}

.photo-blur-region {
  position: absolute;
  box-sizing: border-box;
  pointer-events: none;
  backdrop-filter: blur(var(--blur-amount, 12px));
  -webkit-backdrop-filter: blur(var(--blur-amount, 12px));
  background: rgba(255, 255, 255, 0.02);
}

.photo-blur-region.is-black {
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  background: rgba(0, 0, 0, var(--black-opacity, 0.85));
}

.photo-blur-circle {
  border-radius: 50%;
}

@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .photo-blur-region:not(.is-black) {
    background: rgba(235, 235, 235, 0.55);
  }
}

/* Foto-slider op projectkaarten (meerdere foto's): puntjes, geen pijltjes */
.project-cover-slider {
  position: relative;
  display: block;
  width: 100%;
  overflow: hidden;
}

.project-cover-viewport {
  overflow: hidden;
  width: 100%;
  aspect-ratio: 4 / 3;
  touch-action: pan-y;
  isolation: isolate;
}

.project-cover-track {
  display: flex;
  height: 100%;
  transition: transform 320ms ease;
  will-change: transform;
}

.project-cover-slide {
  flex: 0 0 100%;
  width: 100%;
  min-width: 100%;
  max-width: 100%;
  height: 100%;
  min-height: 0;
  overflow: hidden;
  position: relative;
  isolation: isolate;
}

.project-cover-slider .slider-arrow {
  display: none;
  position: absolute;
  top: 50%;
  z-index: 2;
  place-items: center;
  width: 40px;
  height: 40px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.88);
  color: var(--color-text);
  font-size: 1.45rem;
  line-height: 1;
  cursor: pointer;
  transform: translateY(-50%);
  box-shadow: 0 4px 18px rgba(20, 22, 20, 0.14);
  transition: background 160ms ease;
}

.project-cover-slider .slider-arrow:hover {
  background: var(--color-white);
}

.project-cover-slider .slider-arrow-prev {
  left: 10px;
}

.project-cover-slider .slider-arrow-next {
  right: 10px;
}

.project-cover-dots {
  position: absolute;
  left: 50%;
  bottom: 10px;
  z-index: 2;
  display: flex;
  gap: 8px;
  transform: translateX(-50%);
}

.project-cover-dot {
  width: 8px;
  height: 8px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.72);
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);
  cursor: pointer;
  transition: background 160ms ease, transform 160ms ease;
}

.project-cover-dot:hover {
  background: rgba(255, 255, 255, 0.82);
}

.project-cover-dot.is-active {
  background: var(--color-white);
  transform: scale(1.2);
}

.project-card-content {
  padding: 16px;
}

.project-card-content h3 {
  font-size: 1.02rem;
}

.project-card-content p {
  font-size: 0.92rem;
}

.project-card-content p {
  margin-bottom: 0;
  color: var(--color-muted);
}

.project-meta {
  display: flex;
  gap: 10px;
  margin-bottom: 16px;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}

/* Locatie in warme houttint, categorie (Keuken/Badkamer/Kozijn) in groen */
.project-meta span:first-child {
  color: var(--color-wood);
}

.project-meta span:last-child {
  color: var(--color-accent);
}

.project-meta span + span::before {
  content: "•";
  margin-right: 10px;
  color: var(--color-muted);
}

/* ARCHIEF */
.archive-browser {
  display: flex;
  flex-direction: column;
  gap: 24px;
}

/* Rij met jaren, horizontaal scrollbaar als "slider" bij veel jaren */
.archive-years {
  display: flex;
  gap: 10px;
  overflow-x: auto;
  padding-bottom: 4px;
}

.archive-year-button {
  flex: 0 0 auto;
  padding: 10px 22px;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  background: var(--color-surface);
  color: var(--color-muted);
  font-weight: 700;
  cursor: pointer;
  transition: background 160ms ease, color 160ms ease, border-color 160ms ease;
}

.archive-year-button.is-active {
  border-color: var(--color-accent);
  color: var(--color-white);
  background: var(--color-accent);
}

.archive-year-button:not(.is-active):hover {
  border-color: var(--color-accent);
  color: var(--color-text);
}

/* In Plaats-modus is de jaren-rij niet relevant (plaatsen worden over
   alle jaren heen getoond) — dan blijft alleen de schakelaar + het
   rooster met plaatsen staan. */
.archive-browser[data-mode="place"] .archive-years {
  display: none;
}

/* JAAR/PLAATSEN-SCHAKELAAR: hergebruikt op zowel Projectarchief als
   Tijdlijn. Simpel segmented-control-knopje van 2 opties. "align-self"
   is nodig bij Projectarchief: die staat in een kolom-flex (.archive-
   browser) die kinderen anders standaard breeduit trekt, met deze
   inline-flex balk (met eigen rand/achtergrond) als storend zichtbaar
   gevolg — bij de Tijdlijn (in een rij-flex) was dat toevallig nooit
   een probleem. */
.archive-mode-switch {
  display: inline-flex;
  align-self: flex-start;
  gap: 4px;
  padding: 4px;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  background: var(--color-surface);
}

.archive-mode-button {
  padding: 8px 18px;
  border: 0;
  border-radius: 999px;
  background: transparent;
  color: var(--color-muted);
  font-weight: 700;
  cursor: pointer;
  transition: background 160ms ease, color 160ms ease;
}

.archive-mode-button.is-active {
  background: var(--color-accent);
  color: var(--color-white);
}

.archive-mode-button:not(.is-active):hover {
  color: var(--color-text);
}

/* Rooster van 12 maanden: 4 kolommen x 3 rijen */
.archive-months {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 12px;
}

.archive-month-button {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 16px 14px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-small);
  background: var(--color-surface);
  color: var(--color-text);
  text-align: left;
  cursor: pointer;
  transition: border-color 160ms ease, background 160ms ease;
}

.archive-month-button:not(.is-empty):hover {
  border-color: var(--color-accent);
}

.archive-month-button.is-active {
  border-color: var(--color-accent);
  background: rgba(66, 89, 74, 0.08);
}

.archive-month-button.is-empty {
  cursor: default;
  color: var(--color-muted);
  opacity: 0.5;
}

.archive-month-name {
  font-weight: 700;
}

.archive-month-count {
  color: var(--color-accent);
  font-size: 0.78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
}

/* Wrapper om de kop + het projectenrooster van de gekozen maand/plaats.
   Bewust geen eigen paneel-look (achtergrond/rand) meer: bij een plaats
   met veel projecten (bijv. 8x Frieschepalen) werd dat 1 enorme
   aaneengesloten balk. Elk project hieronder heeft al een eigen kaartje
   — dat is genoeg afbakening. */
.archive-detail:empty {
  display: none;
}

/* Lijst van projecten binnen 1 maand/plaats: elk project is een eigen,
   duidelijk omlijnde kaart zodat foto's nooit door elkaar lopen. De
   max-breedte voorkomt dat een enkel project de hele breedte van het
   scherm vult, en laat op desktop tot 4 kaarten naast elkaar zien. */
.archive-project-list {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 225px));
  gap: 20px;
  margin-top: 20px;
}

/* TIJDLIJN */
.timeline-controls {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  margin-bottom: 28px;
}

.timeline-search {
  position: relative;
  width: min(260px, 60vw);
}

.timeline-search-input {
  width: 100%;
  padding: 9px 14px;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  background: var(--color-surface);
  color: var(--color-text);
}

.timeline-search-input:focus {
  outline: 2px solid rgba(66, 89, 74, 0.2);
  border-color: var(--color-accent);
}

.timeline-search-results {
  position: absolute;
  top: calc(100% + 8px);
  left: 0;
  right: 0;
  /* Moet boven de sticky jaren/plaatsen-balk uitkomen (die heeft
     z-index: 40) — anders vallen zoekresultaten er onzichtbaar achter. */
  z-index: 50;
  max-height: 260px;
  overflow-y: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-small);
  background: var(--color-surface);
  box-shadow: var(--shadow-soft);
}

.timeline-search-results::-webkit-scrollbar {
  width: 0;
  height: 0;
  display: none;
}

.timeline-search-result {
  display: flex;
  width: 100%;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 11px 16px;
  border: 0;
  border-top: 1px solid var(--color-border);
  background: transparent;
  text-align: left;
  cursor: pointer;
}

.timeline-search-result:first-child {
  border-top: 0;
}

.timeline-search-result:hover {
  background: rgba(66, 89, 74, 0.08);
}

.timeline-search-result strong {
  color: var(--color-text);
}

.timeline-search-result span {
  color: var(--color-muted);
  font-size: 0.78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.timeline-search-empty {
  margin: 0;
  padding: 12px 16px;
  color: var(--color-muted);
  font-size: 0.9rem;
}

.timeline-layout {
  display: grid;
  grid-template-columns: 230px 1fr;
  gap: 40px;
  align-items: start;
}

/* Blijft in beeld staan (sticky) terwijl je door de projecten-lijst
   rechts scrolt. Alleen op desktop/tablet — op mobiel gebruiken we in
   plaats daarvan de horizontale sticky balk hieronder (.timeline-picker-bar). */
.timeline-sidebar {
  position: sticky;
  top: calc(var(--header-offset) + 12px);
  height: min(60vh, 520px);
}

/* De "jaar-picker": een verticale lijst met alle jaren, waar het jaar
   in het midden groot/actief staat en de rest er kleiner boven en
   onder staat — zoals een wieltje. Scrollen op de pagina laat de lijst
   meedraaien; scrollen ÓP de picker zelf is een aparte preview (zie
   het <script> onderaan). De zachte fade boven/onder (via mask-image)
   laat jaren rustig in/uit beeld schuiven. */
.timeline-year-picker {
  position: relative;
  height: 100%;
  overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 22%, black 78%, transparent 100%);
  mask-image: linear-gradient(to bottom, transparent 0%, black 22%, black 78%, transparent 100%);
}

/* Dun lijntje op de middellijn, als anker voor "dit is het geselecteerde jaar". */
.timeline-year-picker::before {
  content: '';
  position: absolute;
  left: 0;
  top: 50%;
  width: 34px;
  height: 3px;
  border-radius: 999px;
  background: var(--color-accent);
  transform: translateY(-50%);
}

.timeline-year-picker-track {
  margin-left: 52px;
  /* Elke scroll-stap zet een nieuwe transform (zie het <script>
     onderaan) — deze transition laat de lijst daar telkens soepel
     naartoe glijden in plaats van er direct naartoe te springen. */
  transition: transform 320ms ease-out;
}

.timeline-year-item {
  display: flex;
  align-items: center;
  width: 100%;
  min-width: 0;
  height: 56px;
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--color-muted);
  font-family: inherit;
  font-size: 1.15rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  opacity: 0.5;
  cursor: pointer;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  transition: font-size 150ms ease, opacity 150ms ease, color 150ms ease;
}

/* Plaatsnamen kunnen lang zijn, dus in plaats-modus iets kleiner dan
   het (altijd maar 4 cijfers tellende) jaartal. */
.timeline-year-picker.mode-place .timeline-year-item.is-active {
  font-size: 1.3rem;
}

.timeline-year-picker.mode-place .timeline-year-item {
  font-size: 1.05rem;
}

.timeline-year-item.is-active {
  color: var(--color-accent);
  font-size: 2.1rem;
  letter-spacing: -0.02em;
  opacity: 1;
}

.timeline-year-item:hover:not(.is-active) {
  color: var(--color-text);
  opacity: 0.85;
}

/* Horizontale, "sticky" balk met alle jaren/plaatsen — ALLEEN op
   mobiel (zie @media 820px verderop, waar .timeline-layout wordt
   verborgen en deze balk juist zichtbaar wordt). Blijft bovenaan de
   pagina (onder de header) hangen zodra je erlangs scrolt, zodat je
   altijd ziet in welk jaar/welke plaats je zit. Klikken op een item
   scrollt er meteen naartoe; scrollen door de projecten zelf markeert
   vanzelf het juiste item als actief (via IntersectionObserver, zie
   het <script> onderaan). */
.timeline-picker-bar {
  display: none;
  position: sticky;
  /* Precies op de onderrand van de header vastplakken (i.p.v. op
     --header-offset, die iets lager ligt) — anders bleef er een klein
     kiertje tussen header en balk open waar gescrolde foto's even
     doorheen te zien waren. De extra ruimte die dat kiertje bood, zit
     nu gewoon in de padding-top hieronder: zelfde zichtbare afstand,
     maar wel een ondoorzichtige achtergrond ertussen. 1px eerder
     beginnen (met 1px extra padding erbij) zodat de balk altijd net
     iets overlapt met de header, ook als het scrollen een fractie van
     een pixel afrondt — anders kan er tijdens het scrollen zelf soms
     nog héél even een piepklein kiertje ontstaan. */
  top: calc(var(--header-height) - 1px);
  z-index: 40;
  margin-bottom: 32px;
  /* Breekt uit ".container" (20px marge per kant) zodat de balk edge-
     to-edge loopt. Geen 50vw-truc: die maakt op iOS Safari de pagina
     breder dan het scherm (horizontale overflow / verkeerde zoom). */
  width: calc(100% + 40px);
  margin-left: -20px;
  margin-right: -20px;
  padding: 26px 20px 8px;
  background: var(--color-surface);
  /* Een zachte schaduw i.p.v. een harde lijn (border-bottom) of een
     vervagende gradient (die zag er als een waas over de foto uit) —
     dit geeft de balk gewoon een beetje "zweef"-diepte, netjes en
     scherp begrensd. */
  box-shadow: 0 6px 12px -6px rgba(32, 35, 31, 0.18);
}

.timeline-picker-track {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  scrollbar-width: none;
}

.timeline-picker-track::-webkit-scrollbar {
  display: none;
}

.timeline-pill {
  flex: 0 0 auto;
  padding: 8px 18px;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  background: transparent;
  color: var(--color-muted);
  font-family: inherit;
  font-size: 0.95rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  white-space: nowrap;
  cursor: pointer;
  transition: color 150ms ease, border-color 150ms ease, background 150ms ease;
}

.timeline-pill:hover:not(.is-active) {
  border-color: var(--color-accent);
  color: var(--color-text);
}

.timeline-pill.is-active {
  border-color: var(--color-accent);
  background: var(--color-accent);
  color: var(--color-white);
}

.timeline-groups {
  display: flex;
  flex-direction: column;
  gap: 64px;
}

.timeline-year-group {
  scroll-margin-top: var(--header-offset);
}

.timeline-year-heading {
  margin-bottom: 20px;
}

/* Compactere kaarten dan de standaard .project-grid: anders vult een
   jaar met maar 1 of 2 projecten de hele breedte met reuzegrote foto's.
   Met een vaste max-breedte blijven de kaarten altijd overzichtelijk
   klein, ook als er maar 1 project in een jaar staat. */
.timeline-year-group .project-grid {
  grid-template-columns: repeat(auto-fit, minmax(190px, 215px));
}

/* "NAAR BOVEN"-KNOP: alleen op mobiel (zie @media 820px verderop),
   rechtsonder in beeld, alleen zichtbaar zodra je een stuk naar
   beneden hebt gescrold (zie shared.js). Een klik scrollt weer
   helemaal naar boven. */
.scroll-top-button {
  display: none;
  position: fixed;
  right: 24px;
  bottom: 24px;
  z-index: 900;
  place-items: center;
  width: 48px;
  height: 48px;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  background: var(--color-surface);
  color: var(--color-muted);
  box-shadow: var(--shadow-soft);
  opacity: 0;
  transform: translateY(12px);
  pointer-events: none;
  transition: opacity 200ms ease, transform 200ms ease, border-color 160ms ease, color 160ms ease;
}

.scroll-top-button.is-visible {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

.scroll-top-button:hover {
  border-color: var(--color-accent);
  color: var(--color-accent);
}

/* OVER MIJ */
.about-grid {
  display: grid;
  grid-template-columns: 0.85fr 1.15fr;
  gap: 56px;
  align-items: center;
}

.about-photo {
  overflow: hidden;
  height: 400px;
  border: 1px solid rgba(255, 255, 255, 0.24);
  border-radius: var(--radius-medium);
}

.about-photo img {
  height: 100%;
  object-fit: cover;
}

.about-content p {
  max-width: 620px;
  color: rgba(255, 255, 255, 0.76);
  font-size: 1rem;
}

/* FOOTER
   Staat buiten <main> (zie index.html) zodat de vaste hero eronder kan
   blijven. Daardoor mist de footer dezelfde z-index als <main> — zonder
   position + z-index tekent iOS de fixed hero (.hero, z-index: 0) er
   tijdens overscroll doorheen (mobiele grasfoto achter footertekst). */
.site-footer {
  position: relative;
  z-index: 1;
  isolation: isolate;
  padding: 28px 0;
  padding-bottom: calc(28px + env(safe-area-inset-bottom, 0px));
  color: rgba(255, 255, 255, 0.7);
  background: #171c18;
}

.footer-inner {
  display: flex;
  justify-content: space-between;
  align-items: end;
  gap: 30px;
}

.footer-copy p {
  margin: 0;
}

.footer-note {
  margin-top: 8px !important;
  max-width: 42ch;
  color: rgba(255, 255, 255, 0.58);
  font-size: 0.88rem;
  line-height: 1.45;
}

.footer-links {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 18px;
}

.footer-inner a {
  color: var(--color-white);
  text-decoration: none;
}

.footer-inner a:hover,
.footer-inner a:focus,
.footer-inner a:active {
  color: var(--color-white);
  text-decoration: none;
  opacity: 0.8;
}

.legal-wrap {
  max-width: 720px;
  padding-bottom: 48px;
}

.legal-wrap h1 {
  margin: 0 0 12px;
}

.legal-lead {
  margin: 0 0 32px;
  color: var(--color-muted);
  font-size: 1.05rem;
}

.legal-wrap section {
  margin-bottom: 28px;
}

.legal-wrap h2 {
  margin: 0 0 8px;
  font-size: 1.15rem;
}

.legal-wrap p {
  margin: 0;
  line-height: 1.65;
}

.legal-wrap p + p {
  margin-top: 12px;
}

.legal-contact-link {
  display: inline;
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  color: #2563eb;
  font: inherit;
  font-weight: 700;
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 3px;
}

.legal-contact-link:hover {
  color: #1d4ed8;
}

:root[data-theme="dark"] .legal-contact-link {
  color: #7db3ff;
}

:root[data-theme="dark"] .legal-contact-link:hover {
  color: #a8ccff;
}

.contact-modal {
  position: fixed;
  inset: 0;
  z-index: 2100;
  display: grid;
  place-items: center;
  padding: 20px;
  background: rgba(32, 39, 33, 0.55);
}

.contact-modal[hidden] {
  display: none;
}

.contact-modal-card {
  position: relative;
  width: min(100%, 480px);
  max-height: calc(100vh - 40px);
  overflow: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
  overscroll-behavior: contain;
  background: var(--color-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-medium);
  box-shadow: var(--shadow-soft);
  padding: 24px 22px 20px;
}

.contact-modal-card::-webkit-scrollbar {
  width: 0;
  height: 0;
  display: none;
}

.contact-modal-card h2 {
  margin: 0 0 8px;
  font-size: 1.55rem;
}

.contact-modal-lead,
.contact-note {
  margin: 0 0 12px;
  color: var(--color-muted);
  font-size: 0.92rem;
  line-height: 1.5;
}

.contact-modal-close {
  position: absolute;
  top: 12px;
  right: 12px;
  width: 36px;
  height: 36px;
  border: 0;
  border-radius: 999px;
  background: transparent;
  color: var(--color-text);
  font-size: 1.6rem;
  line-height: 1;
  cursor: pointer;
}

.contact-modal-close:hover {
  background: var(--color-surface);
}

.contact-honeypot {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  opacity: 0;
}

.contact-field {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-bottom: 12px;
}

.contact-field > span {
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.02em;
}

.contact-field input,
.contact-field textarea {
  width: 100%;
  border: 1px solid var(--color-border);
  background: var(--color-surface);
  color: var(--color-text);
  border-radius: var(--radius-small);
  padding: 10px 12px;
}

.contact-field input:focus,
.contact-field textarea:focus {
  outline: 2px solid var(--color-accent);
  outline-offset: 1px;
}

.contact-field textarea {
  resize: vertical;
  min-height: 88px;
}

.contact-check {
  display: flex;
  gap: 10px;
  align-items: flex-start;
  margin: 4px 0 12px;
  font-size: 0.88rem;
  line-height: 1.45;
  cursor: pointer;
}

.contact-check input {
  margin-top: 3px;
  flex-shrink: 0;
}

.contact-error {
  margin: 0 0 12px;
  color: #b42318;
  font-size: 0.88rem;
}

.contact-error[hidden] {
  display: none;
}

#contact-thanks-view p {
  margin: 0 0 18px;
  color: var(--color-muted);
  line-height: 1.55;
}

#contact-form-view[hidden],
#contact-thanks-view[hidden] {
  display: none;
}

/* LIGHTBOX: bijna-fullscreen fotoweergave, geopend vanuit een archief-slider */
.lightbox {
  position: fixed;
  inset: 0;
  z-index: 2000;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 40px;
  background: rgba(10, 12, 10, 0.92);
}

.lightbox[hidden] {
  display: none;
}

.lightbox-img,
.lightbox-video {
  width: auto;
  max-width: min(92vw, 1100px);
  max-height: 80vh;
  object-fit: contain;
  border-radius: var(--radius-small);
  opacity: 1;
  -webkit-user-drag: none;
  user-select: none;
  transition: opacity 180ms ease;
}

.lightbox-img {
  cursor: default;
}

.lightbox-media-wrap {
  position: relative;
  display: inline-block;
  max-width: min(92vw, 1100px);
  max-height: 80vh;
  line-height: 0;
}

.lightbox-media-wrap .lightbox-img {
  display: block;
  max-width: 100%;
  max-height: 80vh;
}

.lightbox-media-wrap .photo-blur-layer {
  border-radius: var(--radius-small);
}

.lightbox-video {
  background: #000;
}

.lightbox-img.is-switching,
.lightbox-video.is-switching {
  opacity: 0;
}

.lightbox-img[hidden],
.lightbox-video[hidden] {
  display: none;
}

.lightbox-caption {
  margin: 16px 0 0;
  color: rgba(255, 255, 255, 0.85);
  font-size: 0.95rem;
  text-align: center;
}

/* Puntjes onderin: 1 per foto, laten meteen zien hoeveel foto's er
   zijn en welke je nu bekijkt. */
.lightbox-dots {
  display: flex;
  gap: 10px;
  margin-top: 18px;
}

.lightbox-dot {
  width: 9px;
  height: 9px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.35);
  cursor: pointer;
  transition: background 180ms ease, transform 180ms ease;
}

.lightbox-dot:hover {
  background: rgba(255, 255, 255, 0.6);
}

.lightbox-dot.is-active {
  background: var(--color-white);
  transform: scale(1.25);
}

.lightbox-close,
.lightbox-prev,
.lightbox-next {
  position: absolute;
  display: grid;
  place-items: center;
  border: 0;
  color: var(--color-white);
  line-height: 1;
  cursor: pointer;
}

.lightbox-close {
  top: 20px;
  right: 20px;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.12);
  font-size: 1.6rem;
  transition: background 160ms ease;
}

.lightbox-close:hover {
  background: rgba(255, 255, 255, 0.24);
}

.lightbox-prev,
.lightbox-next {
  top: 50%;
  z-index: 2;
  width: 44px;
  height: 44px;
  border: 1px solid rgba(255, 255, 255, 0.55);
  border-radius: 50%;
  background: transparent;
  box-shadow: none;
  font-size: 1.5rem;
  opacity: 0.85;
  transform: translateY(-50%);
  transition: opacity 160ms ease;
}

.lightbox-prev {
  left: 20px;
}

.lightbox-next {
  right: 20px;
}

.lightbox-prev:hover,
.lightbox-next:hover {
  opacity: 1;
  background: transparent;
}

.lightbox-prev:focus-visible,
.lightbox-next:focus-visible {
  opacity: 1;
  background: transparent;
  outline: 2px solid rgba(255, 255, 255, 0.5);
  outline-offset: 2px;
}

/* "display: grid" hierboven wint anders altijd van het "hidden"-
   attribuut, waardoor de pijltjes ook bij maar 1 foto zichtbaar
   zouden blijven. */
.lightbox-prev[hidden],
.lightbox-next[hidden] {
  display: none;
}

/* TOOLS */
.tools-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: 22px;
}

.tool-card {
  display: flex;
  min-height: 200px;
  flex-direction: column;
  align-items: flex-start;
  padding: 24px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-medium);
  background: var(--color-card);
  color: var(--color-text);
  box-shadow: var(--shadow-soft);
  cursor: pointer;
  text-align: left;
  transition: transform 180ms ease, border-color 180ms ease, box-shadow 180ms ease;
}

.tool-card:hover,
.tool-card:focus-visible {
  transform: translateY(-4px);
  border-color: var(--color-accent);
  box-shadow: 0 22px 55px rgba(32, 35, 31, 0.14);
  outline: none;
}

.tool-card[hidden] {
  display: none;
}

.tool-card-number {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  margin-bottom: 18px;
  border-radius: 50%;
  color: var(--color-white);
  background: var(--color-accent);
  font-size: 0.82rem;
  font-weight: 800;
}

.tool-card h3 {
  margin-bottom: 10px;
}

.tool-card p {
  flex: 1;
  margin-bottom: 22px;
  color: var(--color-muted);
  font-size: 0.92rem;
}

.tool-card-link {
  color: var(--color-accent);
  font-weight: 800;
}

/* Modaal venster met de rekenmachine, geopend vanuit een tool-kaart */
.tool-dialog {
  position: fixed;
  inset: 0;
  z-index: 3000;
  display: grid;
  place-items: center;
  padding: 24px;
  background: rgba(23, 28, 24, 0.82);
}

.tool-dialog[hidden] {
  display: none;
}

.tool-dialog-panel {
  position: relative;
  width: min(760px, 100%);
  max-height: calc(100vh - 48px);
  overflow-y: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
  padding: 34px;
  border-radius: var(--radius-medium);
  background: var(--color-surface);
  box-shadow: 0 26px 80px rgba(0, 0, 0, 0.28);
}

.tool-dialog-panel::-webkit-scrollbar {
  width: 0;
  height: 0;
  display: none;
}

.tool-dialog-close {
  position: absolute;
  top: 16px;
  right: 16px;
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  background: var(--color-background);
  color: var(--color-text);
  cursor: pointer;
  font-size: 1.4rem;
}

.tool-dialog-close:hover {
  border-color: var(--color-accent);
  color: var(--color-accent);
}

.tool-dialog-description {
  max-width: 620px;
  color: var(--color-muted);
}

.tool-form-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 18px;
  margin-top: 26px;
}

.tool-field {
  display: flex;
  flex-direction: column;
  gap: 7px;
}

.tool-field-full {
  grid-column: 1 / -1;
}

.tool-field label {
  font-weight: 700;
}

.tool-field input,
.tool-field select {
  width: 100%;
  padding: 13px 14px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-small);
  background: var(--color-card);
  color: var(--color-text);
}

.tool-field input:focus,
.tool-field select:focus {
  outline: 2px solid rgba(66, 89, 74, 0.2);
  border-color: var(--color-accent);
}

.tool-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: 24px;
}

.tool-result {
  margin-top: 24px;
  padding: 20px;
  border: 1px solid var(--color-border);
  border-left: 5px solid var(--color-accent);
  border-radius: var(--radius-small);
  background: var(--color-background);
}

.tool-result:empty {
  display: none;
}

.tool-result h3 {
  margin-bottom: 10px;
}

.tool-result ul {
  margin-bottom: 0;
  padding-left: 20px;
}

.tool-error {
  color: #8a2f2f;
  font-weight: 700;
}

@media (max-width: 620px) {
  .tool-form-grid {
    grid-template-columns: 1fr;
  }

  .tool-field-full {
    grid-column: auto;
  }

  .tool-dialog {
    padding: 12px;
  }

  .tool-dialog-panel {
    max-height: calc(100vh - 24px);
    padding: 26px 20px;
  }
}

/* RESPONSIVE */
@media (max-width: 820px) {
  /* Geen enkel zichtbaar scrollbalkje op mobiel — pagina en componenten
     blijven wel scrollbaar met touch. */
  html:not(.admin-page),
  body:not(.admin-body) {
    scrollbar-width: none;
    -ms-overflow-style: none;
  }

  html:not(.admin-page)::-webkit-scrollbar,
  body:not(.admin-body)::-webkit-scrollbar {
    display: none;
    width: 0;
    height: 0;
  }

  .site-search-results,
  .timeline-search-results,
  .timeline-picker-track,
  .contact-modal-card,
  .tool-dialog-panel,
  .archive-years,
  .archive-browser[data-mode="place"] .archive-months,
  .archive-browser[data-mode="place"] .archive-project-list {
    scrollbar-width: none;
    -ms-overflow-style: none;
  }

  .site-search-results::-webkit-scrollbar,
  .timeline-search-results::-webkit-scrollbar,
  .timeline-picker-track::-webkit-scrollbar,
  .contact-modal-card::-webkit-scrollbar,
  .tool-dialog-panel::-webkit-scrollbar,
  .archive-years::-webkit-scrollbar,
  .archive-browser[data-mode="place"] .archive-months::-webkit-scrollbar,
  .archive-browser[data-mode="place"] .archive-project-list::-webkit-scrollbar {
    display: none;
    width: 0;
    height: 0;
  }

  /* iOS rubber-band overscroll toont de html-achtergrond — die moet
     donker zijn (footer/hero), niet het lichte body-thema (#f4f1ea).
     Geen ::after onder de footer: position:absolute + height:100vh
     vergroot wél de scrollbare documenthoogte (lege pagina onder footer). */
  html:not(.admin-page) {
    background: #171c18;
  }

  body:not(.admin-body) {
    min-height: 100dvh;
  }

  /* Recente projecten: het nieuwste project (eerste kaart) krijgt de
     volle breedte bovenaan; de overige kaarten vullen de rij eronder. */
  #recent-projects-grid .project-card:first-child {
    grid-column: 1 / -1;
  }

  .section {
    padding: 56px 0;
  }

  .header-inner {
    gap: 12px;
    min-width: 0;
  }

  .logo {
    min-width: 0;
  }

  .logo-text {
    min-width: 0;
  }

  .header-right {
    flex-shrink: 0;
    gap: 10px;
  }

  .hero-content {
    max-width: 100%;
    padding-left: 24px;
  }

  .menu-button {
    display: grid;
  }

  /* Bovenaan clean voor mobiel: het losse thema-knopje verhuist naar
     een schuifknop onderin het uitklapmenu (zie .nav-theme-row). */
  .theme-toggle {
    display: none;
  }

  /* Zacht in-/uitfaden + een klein stukje meebewegen i.p.v. abrupt
     verschijnen/verdwijnen (display:none/flex) — dat laatste oogde
     nogal blokkerig, alsof het menu er zonder overgang "op geplakt"
     werd. "visibility" zorgt ervoor dat het dichte menu ook niet met
     toetsenbord/schermlezer te bereiken is. */
  .main-navigation {
    display: flex;
    position: absolute;
    top: 105px;
    right: 20px;
    width: 200px;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    overflow: hidden;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-medium);
    background: var(--color-surface);
    box-shadow: var(--shadow-soft);
    opacity: 0;
    visibility: hidden;
    transform: translateY(-6px);
    pointer-events: none;
    transition: opacity 180ms ease, transform 180ms ease, visibility 180ms;
  }

  .main-navigation.is-open {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
    pointer-events: auto;
  }

  /* Dunne lijntjes tussen de items (zelfde opzet als het taalmenu) en
     een zachte hover/tik-highlight — dat oogt als een echt uitgewerkt
     menu in plaats van een kaal blokje met tekst. */
  .main-navigation a {
    padding: 13px 16px;
    border-top: 1px solid var(--color-border);
    transition: background 150ms ease;
  }

  .main-navigation a:first-child {
    border-top: 0;
  }

  .main-navigation a:hover {
    background: rgba(66, 89, 74, 0.08);
  }

  /* Taalmenu op dezelfde hoogte laten opengaan als het hamburgermenu
     hierboven, en met hetzelfde zachte in-/uitfade-effectje i.p.v. het
     abrupte display:none/flex van daarvoor. Alleen hier (mobiel) — op
     desktop blijft het taalmenu gewoon zoals het was. */
  .lang-switch-menu {
    top: 85px;
    right: 6px;
    display: flex;
    opacity: 0;
    visibility: hidden;
    transform: translateY(-6px);
    pointer-events: none;
    transition: opacity 180ms ease, transform 180ms ease, visibility 180ms;
  }

  .lang-switch.is-open .lang-switch-menu {
    display: flex;
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
    pointer-events: auto;
  }

  /* Zodra de zoekbalk openstaat, eist hij op mobiel de ruimte tussen
     logo en taalknop op (geen gedoe meer met half buiten beeld vallen).
     De menuknop (hamburger) verdwijnt daarbij even helemaal mee — die
     zou er anders wat vreemd "tussenin" blijven hangen; de taalknop
     wordt de sluitknop (kruisje), zie hieronder en shared.js. Heel kort
     en snel "poefje" in plaats van een trage inschuif-animatie. De naam
     naast het logo verdwijnt ook even mee, zodat het veld daar ook
     overheen kan lopen (begint dus recht na het logo-icoontje). */
  .header-right.is-search-open {
    flex: 1 1 auto;
  }

  .header-right.is-search-open .menu-button {
    display: none;
  }

  .header-inner.is-search-open .logo-text {
    display: none;
  }

  .site-search-field {
    transition: width 90ms ease-out;
  }

  .site-search.is-open {
    flex: 1 1 auto;
  }

  .site-search.is-open .site-search-toggle {
    display: none;
  }

  .site-search.is-open .site-search-field {
    position: static;
    width: 100%;
    /* De transform hieronder was bedoeld om de oorspronkelijke,
       absoluut gepositioneerde versie verticaal te centreren — nu het
       veld gewoon in de normale rij meeloopt (position: static) moet
       die weer uitgezet worden, anders schuift het veld alsnog een
       stukje omhoog. */
    transform: none;
  }

  .site-search.is-open .site-search-input {
    width: 100%;
  }

  .site-search.is-open .site-search-results {
    left: 0;
    width: 100%;
  }

  /* De taalknop (nu de meest rechtse knop) wisselt naar een kruisje
     zodra de zoekbalk openstaat, en sluit 'm dan (zie shared.js) in
     plaats van het taalmenu te openen. De menuknop (hamburger) blijft
     gewoon staan als grens waar de zoekbalk tegenaan loopt. */
  .header-right.is-search-open #lang-switch-current-flag {
    display: none;
  }

  .header-right.is-search-open .lang-switch-icon-close {
    display: block;
  }

  /* Thema-schuifknop onderin het uitklapmenu: zon links, maan rechts,
     het bolletje schuift ertussenin. */
  .nav-theme-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 13px 16px;
    border-top: 1px solid var(--color-border);
  }

  .nav-theme-label {
    color: var(--color-muted);
    font-size: 0.95rem;
    font-weight: 700;
  }

  .about-grid {
    grid-template-columns: 1fr;
    gap: 48px;
  }

  .section-heading {
    display: block;
  }

  .archive-months {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }

  /* Op mobiel is er maar 1 kolom breedte te vullen — anders blijft een
     kaartje op z'n desktop max-breedte hangen met een leeg gat ernaast. */
  .archive-project-list {
    grid-template-columns: 1fr;
  }

  /* In Plaats-modus kan de lijst met plaatsen (i.t.t. maanden, max 12)
     flink langer worden — als grid moet je dan ver naar beneden
     scrollen om alles + het detailvak eronder te zien. Net als de
     jaren bovenaan wordt dit daarom 1 horizontaal scrollbare rij. */
  .archive-browser[data-mode="place"] .archive-months {
    display: flex;
    grid-template-columns: none;
    gap: 10px;
    overflow-x: auto;
    padding-bottom: 4px;
    scrollbar-width: none;
  }

  .archive-browser[data-mode="place"] .archive-months::-webkit-scrollbar {
    display: none;
  }

  .archive-browser[data-mode="place"] .archive-month-button {
    flex: 0 0 auto;
    width: 160px;
  }

  /* Een plaats als Frieschepalen kan makkelijk 8 projecten hebben — als
     die onder elkaar staan moet je heel ver naar beneden scrollen. Net
     als de plaatsen-rij hierboven wordt dit daarom 1 rij die je met
     een swipe doorbladert, elke kaart precies schermbreed. */
  .archive-browser[data-mode="place"] .archive-project-list {
    display: flex;
    gap: 20px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    padding-bottom: 4px;
    scrollbar-width: none;
  }

  .archive-browser[data-mode="place"] .archive-project-list::-webkit-scrollbar {
    display: none;
  }

  .archive-browser[data-mode="place"] .archive-project-list .project-card {
    flex: 0 0 100%;
    scroll-snap-align: start;
  }

  .about-photo {
    height: 320px;
  }

  /* Tijdlijn: op mobiel de horizontale sticky balk i.p.v. de verticale
     wieltjes-picker uit de zijkolom (die past niet lekker op een smal
     scherm) — desktop/tablet blijft de zijkolom gewoon houden. */
  .timeline-layout {
    display: block;
  }

  .timeline-sidebar {
    display: none;
  }

  .timeline-picker-bar {
    display: block;
  }

  /* De scroll-inanimatie (.reveal) zet een transform op dit element,
     en dat maakt het (ook als de transform zelf "0" is) een eigen
     stacking-context — waardoor de zoekresultaten-dropdown erin (met
     z-index: 50) alleen nog vergeleken werd met de sticky jaren/
     plaatsen-balk via het z-index van déze wrapper (die geen z-index
     had), niet via zijn eigen 50. Hierdoor viel de dropdown alsnog
     erachter. Met een eigen z-index hoger dan de balk (40) klopt het
     weer. Alleen hier nodig: op desktop bestaat de sticky balk niet. */
  .timeline-controls {
    position: relative;
    z-index: 60;
  }

  /* "Naar boven"-knop: alleen op mobiel, waar de tijdlijn lang genoeg
     is dat dit ook echt nodig is. */
  .scroll-top-button {
    display: grid;
  }

  /* Het jarenrijtje bovenin (Projectarchief) is op mobiel horizontaal
     scrollbaar — de browser's eigen scrollbalkje daaronder oogt op een
     telefoon al snel rommelig, dus verbergen. Puur cosmetisch, de rest
     van deze sectie blijft ongemoeid. */
  .archive-years {
    scrollbar-width: none;
  }

  .archive-years::-webkit-scrollbar {
    display: none;
  }

  /* Lightbox op mobiel: zelfde swipe-gedrag, geen pijltjes */
  .lightbox-prev,
  .lightbox-next {
    display: none;
  }
}

@media (max-width: 560px) {
  :root {
    --hero-height: 60vh;
  }

  /* Op de telefoon staat de hero in een smal, hoog vak — daar past de
     brede desktopfoto (woning-banner.jpg, 2000x667) niet goed in: je
     zou dan alleen een uitgezoomd streepje uit het midden zien. Daarom
     hier een apart, staand uitgesneden bestand (ca. 3:4, minimaal
     1300x1700px). */
  .hero-photo {
    background-image: url("/assets/images/hero/woning-banner-mobile.jpg");
  }

  /* Twee mobiele foto's om uit te proberen: welke van de twee je krijgt
     wordt willekeurig gekozen bij het laden (zie assets/js/shared.js).
     Bevalt er later 1 duidelijk beter, dan kan de andere gewoon weer
     weg. */
  .hero-photo.is-variant-b {
    background-image: url("/assets/images/hero/woning-banner-mobile-2.jpg");
  }

  .container {
    width: min(calc(100% - 28px), var(--container-width));
  }

  /* Op smallere telefoons heeft ".container" zelf ook een smallere
     marge (14px i.p.v. 20px) — hier meegeven zodat de jaartallen
     precies blijven uitlijnen met de rest van de pagina. */
  .timeline-picker-bar {
    width: calc(100% + 28px);
    margin-left: -14px;
    margin-right: -14px;
    padding-left: 14px;
    padding-right: 14px;
  }

  /* De staande mobiele foto laat het hele huis zien; verticaal
     gecentreerd (zoals op desktop) valt de titel dan midden op de
     drukke gevel/kap. Linksonder, boven het gras, oogt rustiger. */
  .hero {
    align-items: flex-end;
  }

  .hero-content {
    padding-bottom: 8px;
  }

  /* Bij de 2e mobiele foto (meer lucht, huis kleiner/verder weg) staat
     de titel juist mooier bovenaan en gecentreerd, in plaats van
     linksonder zoals bij de andere foto. */
  .hero-photo.is-variant-b ~ .hero-content {
    align-self: flex-start;
    width: 100%;
    padding-top: 28px;
    padding-bottom: 0;
    text-align: center;
  }

  /* Puur wit blijft de veiligste kleur tegen een wisselende lucht (van
     strakblauw tot felle wolken) — een zachte schaduw geeft net genoeg
     houvast zonder een kadertje of andere kleur die elders op de site
     niet voorkomt. */
  .hero-photo.is-variant-b ~ .hero-content .hero-title {
    text-shadow: 0 2px 14px rgba(0, 0, 0, 0.5);
  }

  .hero-photo.is-variant-b ~ .hero-content .hero-title {
    align-items: center;
  }

  /* "Timmer- en Onderhoudsbedrijf" op mobiel over 2 losse regeltjes,
     boven de grote "C. Venema" — op de brede desktopfoto past de hele
     zin prima op 1 regel, dus dit alleen hier. */
  .hero-title-word {
    display: block;
  }

  /* Op de mobiele foto komt de subtekst midden in het gras te staan en
     voegt daar niet veel toe — op de telefoon laten we het bij de
     titel, linksonder in beeld. */
  .hero-subtext {
    display: none;
  }

  /* Op smalle telefoons is er weinig ruimte naast zoek/taal/menu-
     knoppen — de naam blijft toch zichtbaar naast het logo, alleen dan
     flink kleiner geschaald. */
  .logo {
    gap: 8px;
  }

  .logo img {
    height: 34px;
    max-width: 48px;
    object-fit: contain;
  }

  .logo-text .logo-text-small {
    font-size: 0.5rem;
  }

  .logo-text .logo-text-large {
    font-size: 0.66rem;
  }

  .archive-months {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  /* Projecten op de homepage: 2 kleinere kaarten naast elkaar in
     plaats van 1 grote kolom eronder — anders is de pagina op mobiel
     een heel lang rijtje losse fotoblokken. Alleen hier (#projecten),
     niet bij het archief of de tijdlijn. */
  #projecten .project-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 12px;
  }

  #projecten .project-card-content {
    padding: 10px;
  }

  #projecten .project-card-content h3 {
    font-size: 0.82rem;
  }

  /* Beschrijving eronder ("Keuken geplaatst, juli 2026.") is bij deze
     kaartgrootte overbodig naast de titel — laat 'm op mobiel weg. */
  #projecten .project-card-content p {
    display: none;
  }

  #projecten .project-meta {
    gap: 6px;
    margin-bottom: 6px;
    font-size: 0.62rem;
  }

  /* Bij een oneven aantal kaarten blijft het laatste kaartje anders
     alleen over in de laatste rij. Laat 'm dan de hele rij vullen —
     behalve bij "Recente projecten", waar het nieuwste project al
     bovenaan de volle breedte krijgt. */
  #projecten .project-card:last-child:nth-child(odd) {
    grid-column: 1 / -1;
  }

  #recent-projects-grid .project-card:last-child:nth-child(odd) {
    grid-column: auto;
  }

  /* Snelle weg naar het volledige archief, onder de compacte
     projectgrids — alleen op mobiel (op desktop staat "Archief" toch
     al gewoon in het menu). */
  .projects-archive-link {
    display: flex;
    width: 100%;
    margin-top: 28px;
  }

  /* Tijdlijn: zelfde compacte 2-koloms kaartjes als de projecten op de
     homepage, i.p.v. 1 brede kolom eronder — veel overzichtelijker. */
  .timeline-year-group .project-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 12px;
  }

  .timeline-year-group .project-card-content {
    padding: 10px;
  }

  .timeline-year-group .project-card-content h3 {
    font-size: 0.82rem;
  }

  .timeline-year-group .project-card-content p {
    display: none;
  }

  .timeline-year-group .project-meta {
    gap: 6px;
    margin-bottom: 6px;
    font-size: 0.62rem;
  }

  /* Bij een oneven aantal projecten in een jaar/plaats blijft het
     laatste kaartje anders alleen over in de laatste rij. */
  .timeline-year-group .project-card:last-child:nth-child(odd) {
    grid-column: 1 / -1;
  }

  /* Iets ronder dan de standaard --radius-medium (14px), zodat kaarten
     beter aansluiten bij de helemaal ronde jaar/plaats-knopjes ernaast
     — die twee vormen stonden nu te ver uit elkaar qua rondingen. */
  .project-card {
    border-radius: 20px;
  }

  .footer-inner {
    flex-direction: column;
    gap: 10px;
  }
}

.editor-toolbar[hidden],
.editor-popover[hidden] {
  display: none !important;
}

.editor-toolbar {
  position: fixed;
  left: 12px;
  right: auto;
  bottom: 12px;
  z-index: 1100;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  width: max-content;
  max-width: calc(100vw - 24px);
  box-sizing: border-box;
  padding: 18px 12px 8px;
  border-radius: 14px;
  background: var(--color-card);
  border: 1px solid var(--color-border);
  box-shadow: var(--shadow-soft);
}

.editor-drag {
  position: absolute;
  top: 2px;
  left: 50%;
  transform: translateX(-50%);
  border: 0;
  background: transparent;
  padding: 4px 8px;
  color: var(--color-muted);
  cursor: grab;
  touch-action: none;
  user-select: none;
  line-height: 0;
}

.editor-toolbar.is-dragging .editor-drag,
.editor-popover.is-dragging .editor-drag {
  cursor: grabbing;
}

.editor-toolbar-label {
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--color-muted);
}

.editor-toolbar-btn,
.editor-toolbar-link {
  border: 1px solid var(--color-border);
  background: var(--color-surface);
  color: var(--color-text);
  border-radius: 999px;
  padding: 6px 12px;
  font: inherit;
  font-size: 0.85rem;
  text-decoration: none;
  cursor: pointer;
}

.editor-toolbar.on .editor-toolbar-btn {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: var(--color-white);
}

html.is-edit-mode {
  padding-bottom: 72px;
}

.editable-text {
  position: relative;
}

.editor-pencil {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.4rem;
  height: 1.4rem;
  margin-left: 0.3rem;
  vertical-align: middle;
  border-radius: 50%;
  border: 1px solid var(--color-border);
  background: var(--color-card);
  color: var(--color-text);
  cursor: pointer;
}

.editor-pencil svg {
  width: 0.8rem;
  height: 0.8rem;
}

.editor-popover {
  position: fixed;
  right: 12px;
  bottom: 76px;
  z-index: 1200;
  width: min(92vw, 380px);
  max-width: calc(100vw - 24px);
  box-sizing: border-box;
  padding: 22px 14px 14px;
  border-radius: 14px;
  background: var(--color-card);
  border: 1px solid var(--color-border);
  box-shadow: var(--shadow-soft);
}

.editor-popover-title {
  margin: 0 0 8px;
  font-weight: 800;
}

.editor-popover textarea {
  width: 100%;
  max-width: 100%;
  min-height: 120px;
  margin: 0 0 10px;
  padding: 8px;
  box-sizing: border-box;
  resize: vertical;
  border-radius: 10px;
  border: 1px solid var(--color-border);
  background: var(--color-surface);
  color: var(--color-text);
  font: inherit;
}

.editor-popover-error {
  margin: 0 0 8px;
  color: #b42318;
  font-size: 0.85rem;
}

.editor-popover-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.editor-btn {
  border: 1px solid var(--color-border);
  background: var(--color-surface);
  color: var(--color-text);
  border-radius: 999px;
  padding: 6px 12px;
  font: inherit;
  font-size: 0.85rem;
  cursor: pointer;
}

.editor-btn-ghost {
  background: transparent;
}

.editor-pencil:hover {
  border-color: var(--color-accent);
  color: var(--color-accent);
}
