/* =========================================================
   TSCB UTILITY-SYSTEEM — pagina-decoratie
   Onderdeel van het tscb-systeem, zie basis/kleur.css voor
   de kleur-bridge en het versie-/hergebruikbeleid.
   Un-layered laten, dan wint dit van de Bricks-defaults.
   ========================================================= */

/* ---------------------------------------------------------
   0. DE SCROLLBALK STAAT ER ALTIJD

   Waarom de pagina verspringt bij het openen van het menu: Bricks
   zet dan .no-scroll op <body>, met overflow: hidden. Zolang <html>
   op overflow: visible staat, neemt het viewport die waarde over
   (dat heet overflow-propagatie) en verdwijnt de scrollbalk. Het
   venster wordt een balkbreedte breder en alles schuift op.

   Deze regel doorbreekt precies die propagatie. Het viewport neemt
   de waarde van <body> alléén over als <html> op visible staat;
   zet je <html> expliciet op scroll, dan gebruikt het viewport
   díe waarde en blijft de balk staan. De overflow: hidden van
   <body> geldt dan gewoon voor <body> zelf en raakt de balk niet
   meer. De breedte verandert dus nooit — niet bij het openen, niet
   bij het sluiten.

   Waarom dit beter is dan scrollbar-gutter: stable, wat hier eerder
   stond: die reserveert wel ruimte maar laat hem LEEG, en dan zie
   je een witte reep zodra de balk weggaat. Met overflow-y: scroll
   staat er een echte balk in — op een pagina die niet scrollt een
   leeg spoor zonder duim, wat er precies uitziet als een balk die
   even niet meedoet.

   Bijvangst: ook tussen een korte en een lange pagina verspringt
   er niets meer, want de balk is er altijd.

   Wat je ervoor terugkrijgt: de pagina scrollt door achter het open
   menu, want de scrollvergrendeling van Bricks werkt hierdoor niet
   meer. Dat is hetzelfde gedrag als het Offcanvas-element van
   Bricks standaard heeft — en dus als de andere sites.

   Kost niets op macOS, iOS en Android: daar zijn scrollbalken
   overlays zonder breedte. Het speelt alleen op Windows en Linux.
   --------------------------------------------------------- */
html {
  overflow-y: scroll;
}

/* ---------------------------------------------------------
   0b. PAGINAKLEUR
   Op body en niet op html: zolang html geen eigen achtergrond
   heeft, neemt het scherm die van body over en wordt de kleur
   dus over de volle hoogte geschilderd — ook onder een korte
   pagina. Zet je hem op html, dan is die overname er niet meer
   en zou een achtergrond op body ineens tot z'n eigen doos
   beperkt zijn.
   --------------------------------------------------------- */
body {
  background-color: var(--tscb_paginakleur);
}

/* ---------------------------------------------------------
   1. ACHTERGRONDGOLF
   Eén grote, heel lichte veeg achter de pagina, afgeleid van
   de schuine veeg over de bovenkant van het logo.

   LET OP — dit pad is een BENADERING, geen uitsnede uit het
   logo. Die veeg in IPM_LOGO_RGB.svg is namelijk geen enkele
   vorm: het zijn twaalf losse penseelstreken, elk op 10,9%
   dekking door een eigen masker. Daar valt geen schone curve
   uit te lichten. Knip je 'm zelf uit in een vectorprogramma,
   vervang dan alleen --tscb_golf hieronder; de rest blijft
   werken.

   Het is een MASK en geen background-image, zodat de kleur uit
   het palet komt en niet in het bestand gebakken zit. Jouw
   uitsnede hoeft dus geen kleur te hebben — alleen een vorm.
   preserveAspectRatio='none' laat 'm meerekken met het scherm,
   anders zou de golf op breedbeeld ineens klein middenin staan.

   position: fixed betekent dat de golf blijft staan terwijl de
   pagina eroverheen schuift. Wil je 'm laten meescrollen: zet
   'm op absolute (en dan hoort er ook een position op body).
   --------------------------------------------------------- */
body::before {
  --tscb_golf: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201440%20600'%20preserveAspectRatio='none'%3E%3Cpath%20fill='black'%20d='M0%20392%20C246%20448%20470%20340%20720%20288%20C968%20236%201206%20148%201440%20118%20L1440%20600%20L0%20600%20Z'/%3E%3C/svg%3E");
  --tscb_golf_kleur:   var(--tscb_primary_2);
  --tscb_golf_opacity: .1;
  --tscb_golf_breedte: 150%;
  --tscb_golf_positie: 50% 45%;

  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;   /* mag nooit klikken opvangen */

  background-color: var(--tscb_golf_kleur);
  opacity: var(--tscb_golf_opacity);

  -webkit-mask: var(--tscb_golf) var(--tscb_golf_positie) /
                var(--tscb_golf_breedte) auto no-repeat;
          mask: var(--tscb_golf) var(--tscb_golf_positie) /
                var(--tscb_golf_breedte) auto no-repeat;
}

/* ---------------------------------------------------------
   2. ACHTERGRONDLAGEN — de penseelstreken uit het logo.
   Markup: parts/achtergrond-lagen.php (vijf <g>'s, elk één
   streek). Waar de golf hierboven een BENADERING is, zijn dit
   de echte vormen uit IPM_LOGO_RGB.svg.

   De lagen zijn in het logo al een paar pixels t.o.v. elkaar
   verschoven; hier krijgt elke laag daar een eigen trage drift
   overheen. Ze lopen dus nooit synchroon en het beeld staat
   nooit helemaal stil — maar de uitslag is klein genoeg dat je
   het eerder voelt dan ziet.

   Alleen translate en rotate worden geanimeerd; dat zijn de
   twee dingen die de compositor zonder herteken kan doen.
   Nooit de mask/paint zelf animeren (zelfde afspraak als in
   animatie/ts3d-motion.css, sectie 10).

   fill staat op de container en niet per pad: zo erft elke
   laag dezelfde kleur uit het palet en is er één knop.
   --------------------------------------------------------- */
.tscb_lagen {
  --tscb_lagen_kleur:   var(--tscb_primary_2);
  --tscb_lagen_opacity: .07;   /* per laag; vijf lagen stapelen op */

  /* Het grote middenvlak onder de streken — in het logo de
     massieve cyaan schijf. Eigen kleur en dekking, zodat je 'm
     los van de streken kunt zetten (of op 0 kunt draaien). */
  --tscb_lagen_schijf_kleur:   var(--tscb_primary_1);
  --tscb_lagen_schijf_opacity: .05;
  --tscb_lagen_drift:   2.8%;  /* uitslag van de beweging */
  --tscb_lagen_tilt:    1.9deg;
  --tscb_lagen_duur:    58s;   /* laag 1; de rest schaalt hiervan af */

  /* Kadrering — zie de tabel onderaan deze sectie. Deze zijn de
     standaard voor een pagina zonder eigen regel. */
  --tscb_lagen_zoom:          .85;
  --tscb_lagen_verschuiving:  0vw;

  /* Bovenin de tekening zit loze ruimte: de bovenste penseelstreek
     begint pas op ~9% van de viewBox. Die schuift hier weg, anders
     start de vorm pas onder de header. Percentages in `translate`
     rekenen over de eigen hoogte van het element, dus dit blijft
     kloppen op elk scherm.
     Verzet je dit, verzet dan ook de deler in de svg-hoogte
     hieronder: die staat op 1 min deze waarde. */
  --tscb_lagen_kop:           9%;
  --tscb_lagen_y:             calc(var(--tscb_lagen_kop) * -1);

  /* Let op de EENHEID bij die twee nullen. Een kale 0 is een geldige
     lengte in translate, maar de parallax hieronder rekent ermee in
     een calc(), en daar is `0 + 14vh` getal-plus-lengte en dus
     ongeldig. Zo'n calc valt in stilte weg: de hele keyframe wordt
     genegeerd en de animatie doet niets, zonder foutmelding. */

  /* Hoeveel de vorm achterblijft bij het scrollen. Zie sectie 2b. */
  --tscb_lagen_parallax: 45vh;

  /* Vertaling naar wat de browser nodig heeft. Niet aankomen —
     draai aan zoom en verschuiving hierboven.

     breedte: hoe breed de <svg> wordt. Past 37% van de vorm in het
     scherm, dan is de vorm 100/.37 = 270vw. In vw en niet in %,
     zodat breedte en hoogte met dezelfde eenheid rekenen.

     verschuiving: opzij vanaf de LINKERRAND. 0 zet de vorm tegen de
     linkerkant van het scherm, positief duwt hem naar rechts.

     Vanaf links, en hieronder ook vanaf BOVEN ("start start"). Dat
     tweede is geen detail: een grid-item dat groter is dan z'n kader
     valt bij `center` terug op start, en zolang de vorm uit z'n kader
     stak zag je het verschil dus niet. Nu het kader de hele pagina
     hoog is past hij er wél in, en dan centreert `center` echt — de
     tekening begon daardoor een paar honderd pixels onder de
     paginatop, precies de hoogte van de header. */
  --tscb_lagen_breedte: calc(100vw / var(--tscb_lagen_zoom));
  --tscb_lagen_x: var(--tscb_lagen_verschuiving);

  /* absolute en geen fixed: de vorm hoort bij de bovenkant van de
     pagina en schuift met de tekst mee weg. Bij fixed bleef hij
     achter alles hangen, waardoor hij stilstond terwijl de tekst
     eroverheen gleed.
     De body krijgt hieronder position: relative, anders zou dit
     zich aan het viewport ophangen en alsnog blijven staan. */
  position: absolute;
  inset: 0 0 auto 0;

  /* Precies de pagina, niet meer en niet minder. Korter en de vorm houdt
     halverwege op met een zichtbare snijlijn dwars over de pagina; langer
     en hij rekt de scrollhoogte op, want een absoluut gepositioneerd
     element telt daarvoor mee. De enige plek waar hij dus wegvalt is de
     onderkant van de footer. */
  height: 100%;
  z-index: -1;
  pointer-events: none;   /* mag nooit klikken opvangen */
  overflow: clip;

  display: grid;
  place-items: start start;
}

/* Het ophangpunt voor de lagen hierboven. Zonder deze regel valt
   een absoluut gepositioneerd element terug op het viewport en
   blijft het alsnog staan bij het scrollen. */
body:has(.tscb_lagen) {
  position: relative;
}

.tscb_lagen__svg {
  /* De breedte komt uit de zoom; de hoogte is de zoomhoogte (vierkante
     viewBox, dus gelijk aan de breedte) OF de hele pagina — wat groter is.
     Anders houdt de tekening op waar de vorm ophoudt, ergens halverwege een
     lange pagina, in plaats van door te lopen tot onder de footer.
     De parallax gaat eraf: die schuift de tekening straks precies zoveel
     omlaag, en zonder die correctie zou hij aan het eind te ver doorsteken.
     De deler 0.91 is 1 min --tscb_lagen_kop: wat er bovenaan wegschuift
     moet er onderaan bij, anders houdt de vorm net voor de footer op.

     Uitrekken doet dit niet: de <svg> staat in de markup op
     preserveAspectRatio="xMidYMid slice", dus de tekening vult de doos
     en wat er niet in past wordt afgesneden. */
  width:  var(--tscb_lagen_breedte);
  height: max(var(--tscb_lagen_breedte),
              calc((100% - var(--tscb_lagen_parallax)) / 0.91));
  fill: var(--tscb_lagen_kleur);

  /* geen harde rand bij verschuiving; .tscb_lagen knipt af */
  overflow: visible;

  /* De losse translate-property, niet transform: die laatste is
     hier vrij, maar zo blijft 'ie vrij voor wie er later nog
     iets bij wil zetten zonder deze regel te moeten herschrijven. */
  translate: var(--tscb_lagen_x) var(--tscb_lagen_y);
}

/* De schijf staat bewust STIL: hij is het vlak waar de streken
   tegen aflezen, en die leesbaarheid gaat weg als de ondergrond
   met ze meebeweegt. Wil je 'm toch laten ademen, geef 'm dan
   tscb_lagen_drift_a met een duur van een paar keer
   --tscb_lagen_duur en dezelfde transform-box-regel als de lagen.

   Deze twee regels MOETEN er staan. Zonder de fill- en
   opacity-declaratie valt de schijf terug op de standaard: hij
   erft de volle merkkleur van de <svg> en komt op dekking 1 te
   staan — een dichte cyaan cirkel dwars over de pagina in plaats
   van een zweem eronder. */
.tscb_lagen__schijf {
  fill: var(--tscb_lagen_schijf_kleur);
  opacity: var(--tscb_lagen_schijf_opacity);
}

/* ---------------------------------------------------------
   2b. PARALLAX — de vorm blijft achter bij het scrollen.
   Scroll je omlaag, dan zakt de vorm langzamer weg dan de tekst
   en lijkt hij dus mee naar beneden te schuiven. Meer diepte dan
   dat wil je hier niet: het is een achtergrond, geen attractie.

   Een scroll-gedreven animatie en geen JavaScript: de browser
   koppelt de voortgang rechtstreeks aan de scrollpositie, wat
   betekent dat het op de compositor draait en er geen
   scroll-handler is die bij elke pixel meerekent.

   scroll(root) en niet view(): bij scroll() is 0% de bovenkant van
   de pagina, en dat is precies de stand waarin de vorm is
   ontworpen — hij begint achter de header en schuift van daaruit
   weg. Met view() loopt de tijdlijn van "element komt in beeld"
   tot "element is uit beeld", en omdat deze vorm bovenaan het
   document staat is hij bij het laden al een eind op dreef: dan
   staat hij meteen voorgeschoven en klopt de beginstand niet meer.
   Dat deze vorm alleen bovenaan zichtbaar is maakt scroll() hier
   ook goed bruikbaar — de pagina is nauwelijks langer dan het stuk
   waarover je hem ziet.

   DE ANIMATIE ZIT OP DE <svg> EN NIET OP DE CONTAINER. Dat is geen
   detail: een verschoven container steekt onder de pagina uit en telt
   daar mee voor de scrollhoogte — je kreeg er dus een lap leegte bij
   om doorheen te scrollen, precies zo hoog als de uitslag hieronder.
   De <svg> zit binnen `overflow: clip`, dus die kan bewegen zonder dat
   de pagina er iets van merkt.

   De prijs is dat er bovenin de clip een lege band vrijkomt zodra de
   tekening zakt. Die is in de praktijk niet te zien: hij groeit mee met
   de scrollvoortgang, en tegen de tijd dat er iets van te zien zou zijn
   ben je de bovenkant van de vorm allang voorbij gescrold. Alleen op een
   pagina die korter is dan de uitslag zelf zou het opvallen.

   In @supports, want niet elke browser kent dit al. Waar het
   ontbreekt gebeurt er simpelweg niets — de vorm staat dan stil,
   en dat is een prima achtergrond. (Chrome en Edge kennen het,
   Safari en Firefox in hun recente versies.)
   --------------------------------------------------------- */
@supports (animation-timeline: scroll(root block)) {
  .tscb_lagen__svg {
    animation: tscb_lagen_parallax linear both;
    animation-timeline: scroll(root block);
  }

  /* De kadrering (--tscb_lagen_x/y) staat in dezelfde translate en moet
     dus in allebei de keyframes mee, anders springt de vorm bij het
     starten van de animatie terug naar 0. */
  @keyframes tscb_lagen_parallax {
    from { translate: var(--tscb_lagen_x) var(--tscb_lagen_y); }
    to   { translate: var(--tscb_lagen_x)
                      calc(var(--tscb_lagen_y) + var(--tscb_lagen_parallax)); }
  }

  @media (prefers-reduced-motion: reduce) {
    .tscb_lagen__svg { animation: none; }
  }
}

/* transform-box: fill-box zet het draaipunt op het midden van
   de laag zelf. Zonder deze regel is de origin het midden van
   het hele SVG-canvas en zwaaien de lagen om een punt buiten
   zichzelf — dan is de rotatie ineens een baan i.p.v. een
   kanteling. */
.tscb_lagen__laag {
  opacity: var(--tscb_lagen_opacity);
  transform-box: fill-box;
  transform-origin: center;
  will-change: transform;
}

/* Twee bewegingen, tegen elkaar in. Welke laag welke krijgt is
   afwisselend, zodat naburige lagen altijd uit elkaar lopen. */
@keyframes tscb_lagen_drift_a {
  0%, 100% { transform: translate(0, 0) rotate(0deg); }
  50%      { transform: translate(var(--tscb_lagen_drift),
                                  calc(var(--tscb_lagen_drift) / -2))
                        rotate(var(--tscb_lagen_tilt)); }
}
@keyframes tscb_lagen_drift_b {
  0%, 100% { transform: translate(0, 0) rotate(0deg); }
  50%      { transform: translate(calc(var(--tscb_lagen_drift) * -0.8),
                                  calc(var(--tscb_lagen_drift) / 2))
                        rotate(calc(var(--tscb_lagen_tilt) * -1)); }
}

/* Duur en negatieve delay per laag. De duren zijn bewust geen
   veelvouden van elkaar (38 / 47 / 43 / 53 / 61): daardoor valt
   het patroon pas na uren samen en herhaalt het beeld zich
   praktisch nooit zichtbaar.
   De delays zijn negatief, zodat elke laag bij het laden al
   midden in z'n beweging zit en er geen gezamenlijke start is. */
.tscb_lagen__laag--1 { animation: tscb_lagen_drift_a calc(var(--tscb_lagen_duur) * 1.00) ease-in-out  -3s infinite; }
.tscb_lagen__laag--2 { animation: tscb_lagen_drift_b calc(var(--tscb_lagen_duur) * 1.24) ease-in-out -11s infinite; }
.tscb_lagen__laag--3 { animation: tscb_lagen_drift_a calc(var(--tscb_lagen_duur) * 1.13) ease-in-out -19s infinite; }
.tscb_lagen__laag--4 { animation: tscb_lagen_drift_b calc(var(--tscb_lagen_duur) * 1.39) ease-in-out -27s infinite; }
.tscb_lagen__laag--5 { animation: tscb_lagen_drift_a calc(var(--tscb_lagen_duur) * 1.61) ease-in-out -37s infinite; }

/* Wie beweging heeft uitgezet krijgt de lagen gewoon stil.
   De gestapelde vorm blijft, alleen het driften stopt. */
@media (prefers-reduced-motion: reduce) {
  .tscb_lagen__laag { animation: none; }
}

/* ---------------------------------------------------------
   3. INTRO — de inhoud fadet kort in bij het laden.
   Alleen de inhoud: de achtergrondlagen staan er meteen, zodat de
   pagina niet uit het niets opdoemt maar de tekst erop verschijnt.

   HET GAAT OM header/main/footer en niet om body: de lagen zijn een
   direct kind van body, dus zouden die anders meefaden.

   GEEN opacity: 0 IN DE BASISREGEL. Dat is het verschil tussen een
   veilige en een gevaarlijke intro-animatie. Zet je de start-
   toestand in de regel zelf, dan blijft de pagina onzichtbaar
   zodra er iets misgaat met de animatie — een oudere browser, een
   uitgeschakelde animatie, een fout verderop in het bestand. Met
   animation-fill-mode: backwards staat de nul alleen IN de
   keyframe: de browser past hem toe zolang de animatie loopt en
   valt daarbuiten terug op de normale waarde. Gaat de animatie
   niet door, dan is de inhoud gewoon zichtbaar.

   Kort houden is hier het hele punt. Een halve seconde voelt als
   "de pagina komt op gang"; alles daarboven voelt als wachten,
   en de lezer wacht al op het laden zelf.
   --------------------------------------------------------- */
/* De HEADER doet niet mee. Die is het vaste punt van de pagina —
   logo en menu horen er te staan zodra je aankomt, niet te
   verschijnen. Samen met de achtergrondlagen vormt hij het decor
   waarin de inhoud daarna binnenkomt. */
body > main > *,
body > footer {
  --tscb_intro_duur: .5s;
  --tscb_intro_stap: 90ms;   /* vertraging per blok, van boven naar beneden */

  /* Wachten voordat de trap begint. In die pauze is de pagina niet
     leeg: de achtergrondlagen doen niet mee aan de intro en staan
     er meteen. Je ziet dus eerst de vorm en daarna de tekst die
     erop verschijnt — dat is precies de volgorde die je wilt.
     Wel de grens bewaken: elke tiende seconde hierboven voelt de
     lezer als traagheid van de site zelf, niet als opzet. */
  --tscb_intro_wacht: 0s;

  animation: tscb_intro var(--tscb_intro_duur) ease-out backwards;
}

/* Wachten mag alleen waar de achtergrondvorm die pauze vult; op een
   kale pagina is een halve seconde leeg scherm gewoon traagheid. */
body:has(.tscb_lagen) > main > *,
body:has(.tscb_lagen) > footer {
  --tscb_intro_wacht: .5s;
}

@keyframes tscb_intro {
  from { opacity: 0; }
}

/* De trap. Op de SECTIES en niet op <main> als geheel: zou main
   zelf ook faden, dan vermenigvuldigt zijn dekking met die van de
   secties eronder en verdwijnt het trapje in een algemene waas.

   Vaste nth-child-regels en geen sibling-index(): die functie is
   nog te vers om er de hele intro op te laten rusten. Zes stappen
   is ruim genoeg — verder dan het tweede scherm ziet niemand de
   volgorde nog, dus alles vanaf de zevende sectie deelt de laatste
   vertraging. Zonder die afkap zou een lange pagina onderaan
   seconden staan wachten op iets wat toch al buiten beeld is.

   backwards is wat de trap mogelijk maakt: daardoor houdt een blok
   zijn begintoestand vast tijdens de vertraging, in plaats van
   zichtbaar te staan wachten tot het aan de beurt is. */
body > main > *:nth-child(1) { animation-delay: calc(var(--tscb_intro_wacht) + 0 * var(--tscb_intro_stap)); }
body > main > *:nth-child(2) { animation-delay: calc(var(--tscb_intro_wacht) + 1 * var(--tscb_intro_stap)); }
body > main > *:nth-child(3) { animation-delay: calc(var(--tscb_intro_wacht) + 2 * var(--tscb_intro_stap)); }
body > main > *:nth-child(4) { animation-delay: calc(var(--tscb_intro_wacht) + 3 * var(--tscb_intro_stap)); }
body > main > *:nth-child(5) { animation-delay: calc(var(--tscb_intro_wacht) + 4 * var(--tscb_intro_stap)); }
body > main > *:nth-child(n+6),
body > footer { animation-delay: calc(var(--tscb_intro_wacht) + 5 * var(--tscb_intro_stap)); }

/* Wie beweging heeft uitgezet krijgt de pagina meteen compleet. */
@media (prefers-reduced-motion: reduce) {
  body > main > *,
  body > footer {
    animation: none;
  }
}

/* =========================================================
   ZICHTBAAR OPPERVLAK PER PAGINA — hier stel je het beeld in.
   Alles op één plek; verder in dit bestand hoef je niet te zijn.

   Eén vorm die per pagina anders gekaderd staat: de site hangt
   samen, maar geen twee pagina's tonen hetzelfde plaatje.

   ZOOM = welk deel van de vorm in de schermbreedte past.
     1    = de hele vorm precies passend
      .85 = ruim beeld, randen net buiten
      .37 = flink ingezoomd, ruwweg een kwart van de vorm
      .20 = detail, één penseelstreek vult het scherm
     Lager = verder inzoomen. Boven de 1 komt de vorm los van de
     schermranden en zie je hem als geheel zweven.

   VERSCHUIVING = waar de linkerrand van de vorm begint, in vw vanaf
   de linkerkant van het scherm.
     0     = tegen de linkerrand
     34vw  = een derde van het scherm blijft links leeg
     -60vw = de vorm loopt links buiten beeld door
     Zoom en verschuiving staan los van elkaar: inzoomen verplaatst
     de vorm niet.

   De verticale stand staat los: --tscb_lagen_y (0 = midden,
   bv. -10vh duwt de vorm omhoog).

   NIEUWE PAGINA erbij: één regel hieronder, plus de slug in de
   tabel in functions.php. De klassenaam is de paginanaam, zodat
   dit blok leesbaar blijft zonder heen en weer te zoeken.
   ========================================================= */

/* Home — gecentreerd, en bewust GROTER dan het kader.

   Op zoom .85 paste de hele vorm in beeld, en dan zie je wat het
   is: een cirkel. Dat is precies wat je hier niet wilt — als
   achtergrond werkt deze vorm doordat je alleen doorlopende bogen
   ziet die aan alle kanten het beeld uit lopen. Zodra de cirkel
   sluit, wordt hij een figuur waar je naar kijkt in plaats van een
   ondergrond waar je overheen leest.

   Vandaar verder inzoomen dan strikt nodig: op .70 loopt de vorm
   links en rechts het beeld uit. Zet je de zoom terug omhoog, dan
   sluit de cirkel weer. */
.tscb_lagen--home {
  --tscb_lagen_zoom:         .70;
  --tscb_lagen_verschuiving: 0vw;
}

/* Tablet en kleiner: verder inzoomen. Dat doet in één knop twee dingen,
   want de vorm is vierkant — hij loopt rechts verder buiten beeld (op een
   smal scherm wil je juist géén sluitende cirkel zien) en wordt tegelijk
   twee keer zo hoog, dus hij loopt een veel groter deel van de pagina mee. */
@media (max-width: 59.99rem) {
  .tscb_lagen--home {
    --tscb_lagen_zoom: .35;
  }
}

/* Van home naar contact in vijf gelijke stappen. Verder inzoomen maakt
   de vorm groter, dus zie je minder bogen tegelijk — dat is wat het
   rustiger maakt. De parallax dooft in dezelfde reeks uit.

   Per breekpunt apart, want home en contact staan daar anders: op smal
   scherm gaat de vorm tegen de linkerrand (0vw), op breed naar LINKS
   (contact -20vw). Onderstaande waarden zijn de basis (smal scherm). */
.tscb_lagen--topics {
  --tscb_lagen_zoom:         0.354;
  --tscb_lagen_verschuiving: 0vw;
  --tscb_lagen_parallax:     36vh;
}

.tscb_lagen--services {
  --tscb_lagen_zoom:         0.358;
  --tscb_lagen_verschuiving: 0vw;
  --tscb_lagen_parallax:     27vh;
}

.tscb_lagen--projects {
  --tscb_lagen_zoom:         0.362;
  --tscb_lagen_verschuiving: 0vw;
  --tscb_lagen_parallax:     18vh;
}

.tscb_lagen--publications {
  --tscb_lagen_zoom:         0.366;
  --tscb_lagen_verschuiving: 0vw;
  --tscb_lagen_parallax:     9vh;
}

/* Breed scherm: eigen reeks, en hier telt --tscb_lagen_y mee omdat
   contact die alleen hier verzet. */
@media (min-width: 60rem) {
  .tscb_lagen--topics {
    --tscb_lagen_zoom:         0.634;
    --tscb_lagen_verschuiving: -4.0vw;
    --tscb_lagen_y:            -10.8%;
  }

  .tscb_lagen--services {
    --tscb_lagen_zoom:         0.568;
    --tscb_lagen_verschuiving: -8.0vw;
    --tscb_lagen_y:            -12.6%;
  }

  .tscb_lagen--projects {
    --tscb_lagen_zoom:         0.502;
    --tscb_lagen_verschuiving: -12.0vw;
    --tscb_lagen_y:            -14.4%;
  }

  .tscb_lagen--publications {
    --tscb_lagen_zoom:         0.436;
    --tscb_lagen_verschuiving: -16.0vw;
    --tscb_lagen_y:            -16.2%;
  }

}

/* Contact — ver ingezoomd op de linkerkant van de vorm. */
.tscb_lagen--contact {
  --tscb_lagen_zoom:         .37;
  --tscb_lagen_verschuiving: 0vw;

  /* Geen parallax hier. De contactpagina scrollt maar een paar
     honderd pixels, dus de vorm zou pas net op gang komen en dan
     al klaar zijn — een beweging die niet afmaakt leest als een
     hapering, niet als diepte.
     0px en niet een kale 0: de waarde komt in een translate en
     krijgt daar wel een eenheid nodig zodra er ooit mee gerekend
     wordt. */
  --tscb_lagen_parallax:     0px;
}

/* Vanaf tablet-breed zakt die uitsnede rechtsonder uit beeld: naar links
   en omhoog, zodat de boog weer langs de kop en het formulier loopt. */
@media (min-width: 60rem) {
  .tscb_lagen--contact {
    --tscb_lagen_verschuiving: -20vw;
    --tscb_lagen_y:            -18%;
  }
}

/* Golf en lagen tegelijk wordt troebel: staan de lagen op de
   pagina, dan gaat de golf uit. :has() is hier de nette weg —
   geen body-class nodig die iemand later moet onthouden. */
body:has(.tscb_lagen)::before {
  /* Op deze pagina's neemt de foto hieronder de plek van de golf
     over; die twee tegelijk wordt troebel. Zonder een pagina-foto
     blijft het bij `none` en is er dus gewoon niets. */
  content: none;
}

/* ---------------------------------------------------------
   2c. PAGINAFOTO — een beeld achter de bewegende lagen.

   DE STAPELING is hier het hele punt, en die luistert nauw:

     paginakleur   de achtergrond van body — dat is de "canvas",
                   die ligt buiten de z-index-volgorde en dus
                   altijd onderop
     foto          z-index -2
     lagen         z-index -1  (de drijvende penseelstreken)
     inhoud        gewoon in de stroom, dus daarboven

   Een negatieve z-index klinkt alsof het element achter zijn eigen
   ouder verdwijnt, en dat gebeurt ook — maar niet achter diens
   ACHTERGROND: die van body wordt naar de canvas gepromoveerd en
   ligt onder alles. Precies daardoor past de foto ertussen.

   Op body::before en niet als een extra div: dit is decoratie
   zonder betekenis, en dan hoort het niet in de HTML. Een
   schermlezer krijgt er niets van mee, wat klopt — de betekenisvolle
   foto van Patries staat in de pagina zelf, mét alt-tekst.
   --------------------------------------------------------- */
body:has(.tscb_lagen--home)::before {
  --tscb_foto: url("/wp-content/uploads/2026/09/PatriesBoekholt.webp");

  /* De breedte stuurt, niet de hoogte. In vh gemeten werd de foto op een
     laag scherm smal en op een hoog scherm breed, terwijl hij zich juist
     tot de KOLOM ernaast moet verhouden. Boven 1650 px stopt het
     meegroeien: 50vw is daar 825 px en breder wordt het beeld topzwaar. */
  --tscb_foto_breedte: min(50vw, 825px);
  --tscb_foto_opacity: 1;
  --tscb_foto_parallax: 12vh;   /* hoever de foto onder z'n plek begint */

  content: "";

  /* absolute en geen fixed: de foto hoort bij het EIND van de pagina
     en komt daar één keer tevoorschijn, in plaats van de hele rit in
     de rechteronderhoek te blijven staan. Ophangpunt is body
     (position: relative, zie sectie 2). */
  position: absolute;
  inset: auto 0 0 auto;
  z-index: -2;
  pointer-events: none;

  /* De hoogte komt uit de breedte, zodat de onderkant op élk scherm
     precies op bottom: 0 uitkomt. Zet je een eigen hoogte, dan snijdt
     `background-size: 100% auto` de foto boven- of onderlangs af. */
  width: var(--tscb_foto_breedte);
  aspect-ratio: 1344 / 1008;   /* = de maat van PatriesBoekholt.webp */

  opacity: var(--tscb_foto_opacity);
  background: var(--tscb_foto) right bottom / 100% auto no-repeat;

  /* De golf in sectie 1 zit op ditzelfde ::before en zet daar een mask.
     Zonder deze reset knipt die golfvorm de foto schuin af. */
  -webkit-mask: none;
          mask: none;
}

/* Lichte parallax: de foto schuift omhoog terwijl je hem nadert en
   staat precies goed zodra je helemaal onderaan bent.

   background-position en geen translate: een verschoven element telt
   mee voor de scrollhoogte, dus dan zou de pagina langer worden juist
   terwijl je erdoorheen scrollt — de tijdlijn hieronder rekent zichzelf
   dan scheef.

   view() en niet scroll(root): de foto is alleen in het laatste scherm
   te zien, en dan wil je dat de beweging ook daar zit. `entry` loopt van
   "de foto raakt de onderrand van het scherm" tot "hij staat er helemaal
   in", en dat laatste is hier precies het einde van de pagina. */
@supports (animation-timeline: view()) {
  body:has(.tscb_lagen--home)::before {
    animation: tscb_foto_opkomst linear both;
    animation-timeline: view(block);
    animation-range: entry;
  }

  @keyframes tscb_foto_opkomst {
    from { background-position: right 0 bottom calc(var(--tscb_foto_parallax) * -1); }
    to   { background-position: right 0 bottom 0; }
  }

  @media (prefers-reduced-motion: reduce) {
    body:has(.tscb_lagen--home)::before { animation: none; }
  }
}

/* Tot en met tablet over de volle breedte: op 50vw is de foto daar te
   klein om nog iemand in te herkennen.
   100% en geen 100vw: die laatste telt de scrollbar mee en geeft dus een
   streep horizontale overflow. */
@media (max-width: 59.99rem) {
  body:has(.tscb_lagen--home)::before {
    --tscb_foto_breedte: 100%;
  }
}


/* =========================================================
   TEKSTPAGINA — gedeelde opmaak, scope-class .tscb_pagina.
   Stond in pages/page.css; hoort bij de algemene layout.
   Pagina-eigen beelden staan in pages/home.css.
   ========================================================= */

.tscb_pagina {
  --tscb_pagina_measure: 74ch;                  /* leesbreedte lopende tekst */
  --tscb_pagina_rule:    var(--tscb_tertiary_1);
  --tscb_pagina_accent:  var(--tscb_tertiary_2);
  --tscb_pagina_stil:    var(--tscb_grey_700);  /* rustiger dan de body-kleur */
}

/* Op de <p> en <ul> zelf en niet op een wrapper: dan houdt elke
   alinea z'n eigen maat, ook als er later iets tussen komt dat
   wél breed mag zijn. */
.tscb_pagina p,
.tscb_pagina ul {
  max-width: var(--tscb_pagina_measure);
}

/* ---------------------------------------------------------
   1. KOPPEN MET ICOON
   Een klein lijnicoontje bóven de kop, niet ernaast. Naast de
   kop zou het in de kop-inspringing uit layout/spacing.css
   moeten passen (16px op mobiel) en dat is te krap; bovendien
   verschuift het dan het streepje dat als ::after aan de kop
   hangt. Boven de kop is er geen gevecht: het icoon erft de
   inspringing en staat dus vanzelf op dezelfde lijn.

   Het is een MASK en geen background-image: zo komt de kleur
   uit het palet en zit die niet in de data-URI gebakken. Eén
   knop (--tscb_pagina_icon_kleur) verft ze allemaal.

   Bewust dun, klein en in de zachte tertiaire kleur: het is een
   wegwijzer, geen illustratie. Wie scant ziet vijf markeringen;
   wie leest merkt ze nauwelijks op.
   --------------------------------------------------------- */
.tscb_pagina__kop {
  --tscb_pagina_icon_maat:  3.5rem;
  --tscb_pagina_icon_kleur: var(--tscb_pagina_accent);
  --tscb_pagina_icon_gat:   0.5rem;
}

.tscb_pagina__kop::before {
  content: "";
  display: block;
  width:  var(--tscb_pagina_icon_maat);
  height: var(--tscb_pagina_icon_maat);
  margin-bottom: var(--tscb_pagina_icon_gat);

  background-color: var(--tscb_pagina_icon_kleur);
  -webkit-mask: var(--_tscb_pagina_icon) left center / contain no-repeat;
          mask: var(--_tscb_pagina_icon) left center / contain no-repeat;
}

/* ---------------------------------------------------------
   1a. SECTIE-LUCHT
   De openingssectie (tscb_section_3) houdt zijn ruimte; de overige
   secties (tscb_section_2) zaten daar met 40 px tegen 60 px vrij
   ver vandaan en krijgen er 10 px bij. Zo lopen de secties rustiger
   in elkaar over, terwijl de opening z'n voorrang houdt.

   Let op de eenheid: op deze site staat de HTML-fontgrootte op
   10 px, dus 1rem is hier 10px en niet 16. 5rem is dus 50 px.

   Via --_tscb_section en niet met een eigen padding-regel: die
   variabele is de override-haak die layout/spacing.css zelf
   aanbiedt (`padding-block: var(--_tscb_section, ...)`). Zo blijft
   het één plek die de sectiehoogte bepaalt, en blijft de
   clamp-vorm intact — alleen het plafond gaat omhoog, de
   meeschalende ondergrens op smalle schermen blijft staan.

   Alleen op deze pagina: de utility zelf ongemoeid laten, anders
   verschuift contact ook mee. */
.tscb_pagina.tscb_section_2 {
  --tscb_pagina_sectie: clamp(2.5rem, 6vw, 5rem);
  --_tscb_section: var(--tscb_pagina_sectie);
}

/* ---------------------------------------------------------
   1b. DE NAAM ONDER DE H1
   "Patries Boekholt" staat als eigen element náást de h1 (een
   broer in dezelfde container), niet erin: de h1 benoemt het
   vakgebied, de naam zegt van wie het is. Dat zijn twee dingen,
   en een schermlezer hoort ze zo ook als twee dingen.

   Visueel horen ze wél bij elkaar. Daarom hangt de naam strak
   onder de kop en deelt hij de kopkleur — het leest als één
   titelblok, met de rangorde in de grootte en het gewicht:
   de h1 groot en 600, de naam een maat kleiner en 400 (allebei
   echte sneden van Fraunces, dus geen synthetisch vet).
   --------------------------------------------------------- */
.tscb_pagina__ondertitel {
  display: block;
  font-weight: 400;
  font-style: italic;   /* zet de naam apart van de kop erboven */

  /* Uit de schaal en niet met een eigen maat zoals de lead
     hieronder: _xl (17,5 - 22,5 px) valt precies tussen de h1
     (36 px) en de lead (16 - 18 px), dus hier hoeft de reeks
     niet omzeild te worden. */
  font-size: var(--tscb_text_xl);
  line-height: var(--tscb_leading_tight);

  /* Vertrekt bij de kleur van de h1 erboven en mengt daar grijs
     doorheen: dat maakt de naam in één stap lichter én minder
     kleurig, zodat hij naast die grote kop niet als een tweede
     paars vlak gaat lezen. Meer grijs = doffer; op ~50% kantelt
     hij naar gewoon grijs en is de familieband met de kop weg.

     Niet relatief aan currentColor: die stond op de geerfde
     tekstkleur en dreef weg van de koppen zodra die een eigen
     kleur kregen. */
  --tscb_pagina_naam_grijs: 38%;

  color: color-mix(in srgb,
    var(--tscb_kopkleur_licht) calc(100% - var(--tscb_pagina_naam_grijs)),
    var(--tscb_grey_700));

  /* Dezelfde inspringing als de h1. Die staat sinds kort op de
     tekstlijn (--tscb_text_indent, layout/spacing.css); de naam is een
     <div> en valt buiten zowel de kop-regel als de <p>-regel, dus
     zonder dit begint hij links van de titel en valt het titelblok
     uit elkaar. */
  padding-inline-start: var(--tscb_text_indent);
}

/* De h1 heeft standaard --tscb_h1_space_bottom onder zich (zie
   layout/spacing.css). Dat is de ruimte naar de VOLGENDE alinea,
   en die hoort hier niet: de naam is geen volgend blok maar het
   tweede deel van de titel. Weghalen laat alleen de gap van de
   container over, en dat is precies de strakke afstand die je
   binnen een titelblok wil.

   Via :has(+ ...) en niet met een negatieve marge op de naam:
   zo blijft het bij een knop die uitgaat, in plaats van twee
   waardes die elkaar moeten opheffen en gaan schuiven zodra
   iemand aan de spacing-schaal draait. Alleen waar de naam
   echt op de h1 volgt. */
h1:has(+ .tscb_pagina__ondertitel) {
  margin-block-end: 0;
}

/* De streep sluit het hele titelblok af, dus onder de naam (.tscb_streep)
   en niet tussen de kop en de naam in. */
h1:has(+ .tscb_pagina__ondertitel)::after {
  content: none;
}

/* ---------------------------------------------------------
   2. LEAD — de eerste alinea, groter dan de rest.
   De enige plek waar tekstgrootte betekenis draagt: het zegt
   "begin hier". Eén stap groter en niet twee — bij twee wordt
   het een subkop en verliest het z'n rol als lopende tekst.
   De regelafstand gaat juist iets omlaag: grotere letters
   hebben naar verhouding minder ruimte tussen de regels nodig.
   --------------------------------------------------------- */
.tscb_pagina__lead {
  /* Een eigen maat en niet --tscb_text_l. Die token komt op deze
     site namelijk uit op 15 px — precies de grootte van de gewone
     tekst, dus als "lead" deed hij niets.

     Dat is geen fout in de token maar een schaalprobleem: de reeks
     in basis/typography.css is uitgerekend voor een wortelgrootte
     van 16 px, en hier staat die op 10 (Bricks' HTML font-size).
     Daardoor vallen de onderste stappen onder de bodytekst en valt
     _l er precies op. Bruikbaar boven de bodytekst blijven alleen
     _xl (22,5 px) en hoger, en dat is voor een alinea meteen te
     veel — dan wordt het een subkop.

     Vandaar hier een tussenmaat, in dezelfde clamp-vorm als de
     reeks zelf zodat hij netjes meeschaalt: 16 px op smal scherm,
     18 px vanaf ongeveer 1400 px. */
  font-size: clamp(1.6rem, 1.45rem + 0.5vw, 1.8rem);

  /* Ruimer dan de gewone tekst (1.5). Een lead heeft een korte
     regellengte en grotere letters, en dan mag er meer lucht
     tussen de regels: het blok leest daardoor als een aparte,
     rustiger alinea in plaats van als de eerste van de reeks. */
  line-height: 1.8;

  /* Geen eigen kleur meer: met de kop, de naam en het streepje erboven
     werd het vierde tint in één blok. Grootte alleen is genoeg om te
     zeggen "begin hier". */

  /* De gap van de container is de afstand BINNEN het titelblok; onder
     het streepje mag het ruimer. */
  margin-block-start: var(--tscb_space_m);

  max-width: 64ch;   /* korter dan de rest: grotere letters, zelfde oogsprong */
}

/* ---------------------------------------------------------
   3. BAND — het enige blok met een achtergrond.
   Loopt van schermrand tot schermrand terwijl de inhoud in de
   contentkolom blijft staan. Dat kan hier zonder truc omdat de
   sectie al de volle breedte is; de container erbinnen doet de
   centrering.

   De kleur is doorzichtig en geen dichte tint: de drijvende
   logo-lagen uit layout/pagina.css liggen erachter en moeten
   er dwars doorheen blijven schemeren. Een dekkende band zou
   ze afsnijden en een harde rand door de pagina trekken.
   --------------------------------------------------------- */
.tscb_pagina__band {
  /* Losse hex met alpha (91 = 57%); het palet kan die niet uitdrukken. */
  --tscb_pagina_band_kleur: #91dcf291;
  --tscb_pagina_band_onder: 8%;    /* de onderkant, zoals hij was */
  --tscb_pagina_band_boven: 8%;    /* hier bovenop, alleen bovenaan */

  position: relative;   /* ophangpunt voor het verloop hieronder */

  background-color: color-mix(in srgb,
    var(--tscb_pagina_band_kleur) var(--tscb_pagina_band_onder), transparent);
}

/* Bovenaan een tikje meer blauw, naar onderen uitdovend tot niets — daar
   blijft de dekking hierboven over.

   Op een ::before en NIET als background-image op de sectie zelf: Bricks
   zet op elk nestable element .bricks-lazy-hidden, en die doet
   `background-image: none !important` tot zijn JS het element vrijgeeft.
   Dat is een !important in een cascade-laag, dus daar kom je niet
   overheen (zelfde verhaal als het headerverloop in layout/header.css).
   Een pseudo-element krijgt die class niet en is dus wél veilig.

   z-index: -1 houdt het verloop achter de tekst. Zonder die regel legt
   een absoluut gepositioneerde ::before zich óver de inhoud en kleurt hij
   de letters mee. De drijvende lagen uit layout/pagina.css staan op
   dezelfde -1 maar eerder in de DOM, dus die blijven eronder — precies
   zoals de achtergrondkleur hierboven ook al over ze heen ligt. */
.tscb_pagina__band::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;

  background-image: linear-gradient(to bottom,
    color-mix(in srgb,
      var(--tscb_pagina_band_kleur) var(--tscb_pagina_band_boven), transparent),
    transparent);
}

/* Kleurwissel kost je de padding van de buursectie → er een
   sectiestap bij, boven en onder. */
.tscb_pagina.tscb_pagina__band {
  --_tscb_section: calc(var(--tscb_pagina_sectie) + var(--tscb_space_xl));
}

/* De sectie die er weer uit komt: zelfde extra, alleen bovenaan. */
.tscb_pagina__band + .tscb_pagina {
  padding-block-start: calc(var(--tscb_pagina_sectie) + var(--tscb_space_xl));
}

/* ---- de drie punten ----
   Grid met auto-fit i.p.v. drie vaste kolommen: komt er een
   vierde punt bij, dan hoeft er niets aan de CSS te veranderen,
   en op smal scherm vallen ze onder elkaar zonder media query.
   minmax(15rem, 1fr) is de ondergrens waaronder een punt te
   smal wordt om te lezen.

   Bewust een <ul>: het zijn drie gelijkwaardige punten, en dat
   is precies wat een lijst betekent. De opsommingstekens gaan
   eraf — het beeldmerk en het streepje nemen die rol over. */
.tscb_pagina__punten {
  /* Het beeldmerk staat hieronder als ::before op elk punt en
     steekt met 80% van z'n hoogte boven het streepje uit. Die
     ruimte moet ergens vandaan komen, anders valt hij over de
     tekst erboven (bovenste rij) of over het punt erboven
     (gestapelde kolommen op smal scherm). Marge en rij-gap tellen
     hem er daarom bij op, uitgerekend uit dezelfde knop: verzet
     je de logogrootte, dan schuift de ruimte vanzelf mee.
     Root staat op 10 px, dus 3.5rem is hier 35 px. */
  --tscb_pagina_punt_logo:  3.5rem;

  /* Elk volgend beeldmerk een stap groter. --stappen is het aantal
     punten min één; de ruimte hierboven rekent met dat grootste. */
  --tscb_pagina_punt_groei:  1.05;   /* +5% per punt (was 10%) */
  --_tscb_pagina_punt_stappen: 2;
  --tscb_pagina_punt_grootste: calc(var(--tscb_pagina_punt_logo)
    * pow(var(--tscb_pagina_punt_groei), var(--_tscb_pagina_punt_stappen)));
  --tscb_pagina_punt_boven: calc(var(--tscb_pagina_punt_grootste) * 0.8);

  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  column-gap: var(--tscb_space_l);
  row-gap: calc(var(--tscb_space_l) + var(--tscb_pagina_punt_boven));

  list-style: none;
  padding-inline-start: var(--tscb_text_indent);  /* op de tekstlijn */
  margin-block: calc(var(--tscb_space_m) + var(--tscb_pagina_punt_boven)) 0;
}

/* De breedte van het blok, apart en met de <ul> in de selector.
   Dat laatste is nodig: de leesbreedte hierboven staat op
   `.tscb_pagina ul` en dat is specifieker dan een losse class, dus
   een max-width op .tscb_pagina__punten alleen verloor het gevecht
   en bleef het blok op de 64ch van lopende tekst hangen.
   Drie kolommen naast elkaar zijn geen lopende tekst: elke kolom
   heeft z'n eigen, korte regellengte, dus de leesbreedte van het
   geheel doet er niet toe.

   EN de <ul> moet iets hebben om z'n percentage over te rekenen.
   Bricks zet zijn containers op flex-kolom met align-items:
   flex-start, waardoor elk kind naar z'n eigen inhoud krimpt. Het
   tekstelement eromheen is dus precies zo breed als de lijst zelf,
   en 75% daarvan is 75% van niets in het bijzonder — de <ul> bleef
   op z'n inhoudsbreedte staan. Het tekstelement eerst op de volle
   breedte zetten geeft het percentage weer betekenis.
   :has() en niet een extra class in de builder: het gaat om de
   wrapper die Bricks zelf om de tekst zet, en daar kun je in de
   builder geen class op kwijt zonder de lijst eruit te halen. */
.tscb_pagina .brxe-text:has(> .tscb_pagina__punten) {
  width: 100%;
}

.tscb_pagina ul.tscb_pagina__punten {
  --tscb_pagina_punten_breedte: 70%;
  max-width: var(--tscb_pagina_punten_breedte);
}

/* Het streepje is een border-top en geen los ::before: zo is het
   altijd precies zo breed als het punt eronder, ook als de
   kolommen van maat veranderen. */
/* Variant voor langere items (vragen): twee brede kolommen i.p.v.
   zoveel smalle als er passen. 32rem = 320 px, want 1rem is hier 10. */
.tscb_pagina__punten--vragen {
  /* min(): op mobiel nooit breder dan de lijst zelf */
  grid-template-columns: repeat(auto-fit, minmax(min(32rem, 100%), 1fr));
}

.tscb_pagina__punt {
  position: relative;   /* anker voor het beeldmerk hieronder */
  border-top: 2px solid var(--tscb_pagina_rule);

  /* De onderste 20% van het beeldmerk hangt over het punt heen.
     Die overlap komt bovenop de normale kopruimte, zodat de
     tekst er niet achter verdwijnt. */
  /* Op het grootste beeldmerk en niet op dat van het punt zelf: anders
     zakt elk label een paar pixels dieper dan z'n buurman. */
  padding-top: calc(var(--tscb_space_s) + var(--tscb_pagina_punt_grootste) * 0.2);

  /* vaste lucht rechts, zoals het eerste punt op home */
  --tscb_pagina_punt_rechts: 3.5rem;
  padding-inline-end: var(--tscb_pagina_punt_rechts);
}

/* Het beeldmerk zit OP het streepje: 80% erboven, 20% eronder.
   Het heeft de rol van het nummer overgenomen dat hier eerst
   stond (een CSS-counter) — vandaar dat de counter-reset en
   counter-increment hierboven ook weg zijn.

   Absoluut gepositioneerd en niet in de tekststroom: alleen zo
   kan het over de rand heen hangen zonder de tekst te
   verschuiven. inset-block-start: 0 is de bovenrand van de
   padding-box, dus net onder het streepje; translateY(-80%)
   rekent over de eigen hoogte en tilt 'm dus voor 80% erboven.

   Als achtergrond op een leeg ::before en niet als <img> in de
   tekst: het is decoratie en hoort niet in de inhoud, en zo
   staat het vanzelf op ELK punt in plaats van alleen waar iemand
   het geplakt heeft. Zelfde patroon als europa.svg en boek.svg
   verderop in dit bestand. */
.tscb_pagina__punt::before {
  content: "";
  position: absolute;
  inset-block-start: 0;
  inset-inline-start: 0;
  transform: translateY(-80%);

  width: var(--_tscb_pagina_punt_maat);
  aspect-ratio: 1;   /* viewBox van img/ipm-schijf.svg is 99,9 x 99,6 */
  background: url("../../img/ipm-schijf.svg") center / contain no-repeat;
}

/* De trap loopt tot tien punten. Elk volgende beeldmerk is groei× het
   vorige, dus punt n is logo × groei^(n-1). */
.tscb_pagina__punt:nth-child(1) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 0)); }
.tscb_pagina__punt:nth-child(2) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 1)); }
.tscb_pagina__punt:nth-child(3) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 2)); }
.tscb_pagina__punt:nth-child(4) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 3)); }
.tscb_pagina__punt:nth-child(5) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 4)); }
.tscb_pagina__punt:nth-child(6) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 5)); }
.tscb_pagina__punt:nth-child(7) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 6)); }
.tscb_pagina__punt:nth-child(8) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 7)); }
.tscb_pagina__punt:nth-child(9) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 8)); }
.tscb_pagina__punt:nth-child(10) { --_tscb_pagina_punt_maat: calc(var(--tscb_pagina_punt_logo) * pow(var(--tscb_pagina_punt_groei), 9)); }

/* Hoeveel stappen deze lijst écht heeft — anders reserveert een lijst
   van drie de ruimte van tien. */
.tscb_pagina__punten:has(> :nth-child(4)) { --_tscb_pagina_punt_stappen: 3; }
.tscb_pagina__punten:has(> :nth-child(5)) { --_tscb_pagina_punt_stappen: 4; }
.tscb_pagina__punten:has(> :nth-child(6)) { --_tscb_pagina_punt_stappen: 5; }
.tscb_pagina__punten:has(> :nth-child(7)) { --_tscb_pagina_punt_stappen: 6; }
.tscb_pagina__punten:has(> :nth-child(8)) { --_tscb_pagina_punt_stappen: 7; }
.tscb_pagina__punten:has(> :nth-child(9)) { --_tscb_pagina_punt_stappen: 8; }
.tscb_pagina__punten:has(> :nth-child(10)) { --_tscb_pagina_punt_stappen: 9; }

/* De kop van een punt is geen <h4> maar gewoon vet: het zijn
   drie labels binnen één sectie, geen eigen niveaus in de
   documentstructuur. Een schermlezer die door de koppen springt
   heeft er niets aan. */
.tscb_pagina__punt b {
  display: block;
  color: var(--tscb_primary_3);
  margin-bottom: 0.25em;
}

/* ---------------------------------------------------------
   3c. DE BAND KOMT IN BEELD — eerst de kop, dan de punten één voor één.

   Eén gedeelde tijdlijn op de sectie (view-timeline: --tscb_band) en niet
   een `view()` per element: de entry-range van een element is precies zo
   lang als dat element zelf, dus een punt van 100 px hoog zou z'n hele fade
   binnen 100 px scrollen afwerken. Op de sectie is de rit lang genoeg om er
   iets van te zien, en delen alle vijf de elementen dezelfde klok.

   De stagger zit in de animation-range en niet in animation-delay: op een
   scroll-tijdlijn loopt er geen klok, alleen scrollafstand — een delay doet
   daar niets.

   Het is een SCRUB: scroll je terug omhoog, dan gaat de fade terug. Dat mag
   hier; het alternatief (één keer afspelen) vraagt een Bricks-interactie met
   JS, en dat is voor een fade van drie regels te veel machinerie.
   --------------------------------------------------------- */
.tscb_pagina__band {
  --tscb_pagina_opkomst: 2.5rem;   /* hoever ze van onderaf komen */

  view-timeline: --tscb_band block;
}

@keyframes tscb_pagina_opkomst {
  from { opacity: 0; translate: 0 var(--tscb_pagina_opkomst); }
  to   { opacity: 1; translate: 0 0; }
}

@supports (animation-timeline: view()) {
  /* Losse longhands en niet de `animation`-shorthand: die zet
     animation-range weer op `normal`, en dan verliest een range-regel
     met lagere specificity hieronder het gevecht — de kop bleef zo
     onzichtbaar in beeld hangen. */
  .tscb_pagina__band :is(h2, .tscb_pagina__punt) {
    animation-name: tscb_pagina_opkomst;
    animation-timing-function: var(--tscb_anim_ease_in);
    animation-fill-mode: both;
    animation-timeline: --tscb_band;
  }

  .tscb_pagina__band h2          { animation-range: entry 10% entry 45%; }
  /* Elk punt iets later; stap 5% zodat ook de tiende binnen de
     entry-fase afmaakt. */
  .tscb_pagina__punt:nth-child(1) { animation-range: entry 25% entry 53%; }
  .tscb_pagina__punt:nth-child(2) { animation-range: entry 30% entry 58%; }
  .tscb_pagina__punt:nth-child(3) { animation-range: entry 35% entry 63%; }
  .tscb_pagina__punt:nth-child(4) { animation-range: entry 40% entry 68%; }
  .tscb_pagina__punt:nth-child(5) { animation-range: entry 45% entry 73%; }
  .tscb_pagina__punt:nth-child(6) { animation-range: entry 50% entry 78%; }
  .tscb_pagina__punt:nth-child(7) { animation-range: entry 55% entry 83%; }
  .tscb_pagina__punt:nth-child(8) { animation-range: entry 60% entry 88%; }
  .tscb_pagina__punt:nth-child(9) { animation-range: entry 65% entry 93%; }
  .tscb_pagina__punt:nth-child(10) { animation-range: entry 70% entry 98%; }

  /* Zonder dit blijft alles op de from-keyframe staan (`both`), dus
     onzichtbaar, voor wie beweging heeft uitgezet. */
  @media (prefers-reduced-motion: reduce) {
    .tscb_pagina__band :is(h2, .tscb_pagina__punt) { animation: none; }
  }
}

/* ---------------------------------------------------------
   4. TWEELUIK — kop links, tekst rechts.
   De asymmetrie doet het werk: na de band komt de lezer weer
   in lopende tekst, maar niet in dezelfde vorm als daarvoor.

   Links de kaart, rechts de verdieping (de zijlijn). De kop en
   de hoofdtekst staan er BOVEN, over de volle breedte: die gaan
   over de hele sectie en niet alleen over wat links of rechts
   staat. Zo krijgt de kaart ook echt lucht om zich heen in plaats
   van dat er een kolom tekst tegenaan staat.

   De kolommen zijn ongelijk en niet half-om-half.
   Twee even brede kolommen lezen als een tabel — als iets dat
   je naast elkaar moet vergelijken. Ongelijk verdeeld blijft
   het één tekst met een kop ernaast.

   Onder de 60rem klapt het naar één kolom. Dat is een echte
   media query en geen auto-fit: de twee kolommen hebben hier
   verschillende rollen, dus ze mogen niet in willekeurige
   volgorde omvallen. */
.tscb_pagina__tweeluik {
  display: grid;
  gap: 0 var(--tscb_space_xl);

  /* Zelfde reden als bij de drie punten hierboven: als kind van een
     Bricks-container krimpt dit blok anders naar z'n inhoud, en dan
     bepaalt de langste tekstregel hoe breed de kaart wordt. */
  width: 100%;
}

@media (min-width: 60rem) {
  .tscb_pagina__tweeluik {
    /* De linkerkolom is smaller dan de rechter, en sinds de kaart
       erin staat iets smaller dan eerst (was 2fr 3fr): die vult nu
       de hele kolom, en op 40% van de contentbreedte werd het beeld
       zwaarder dan de tekst ernaast. */
    grid-template-columns: 2fr 3.4fr;
    align-items: start;
  }

  /* Hier stond een sticky-regel toen de kop nog in de linkerkolom
     stond. Nu staat daar alleen de kaart, en die is hoger dan het
     scherm: een sticky element dat niet in z'n geheel past blijft
     pas hangen als je z'n onderkant bereikt, dus je zou er niets
     van merken behalve een sprong. Weg dus. */
}

/* ---------------------------------------------------------
   5. ZIJLIJN — de H3 met z'n alinea, als inspringende verdieping.
   Een uitwerking van de sectie erboven, geen nieuw onderwerp.
   De lijn links maakt dat zichtbaar zonder kader, kleurvlak of
   kleinere letter: het blijft gewoon tekst, alleen ingesprongen.

   border-inline-start en niet border-left, zoals de rest van dit
   thema ook logische eigenschappen gebruikt — bij een RTL-
   vertaling zou de lijn anders aan de verkeerde kant staan.
   --------------------------------------------------------- */
.tscb_pagina__zijlijn {
  border-inline-start: 2px solid var(--tscb_pagina_rule);
  padding-inline-start: var(--tscb_space_l);
  margin-block-start: var(--tscb_space_l);
}

/* Gespiegeld: brede kolom links, smalle rechts. Gebruikt bij het
   slot, waar de tekst leidt en de foto ernaast staat — omgekeerd
   aan de Europa-sectie, zodat de twee beelden niet allebei aan
   dezelfde kant van de pagina hangen. */
@media (min-width: 60rem) {
  .tscb_pagina__tweeluik--omgekeerd {
    grid-template-columns: 3.4fr 2fr;
  }
}

/* Naast de kaart begint de zijlijn op dezelfde hoogte als het
   beeld, niet lager: twee blokken naast elkaar die allebei een
   andere bovenmarge hebben lezen als een fout.

   De tekst blijft daar korter dan de 74ch van de rest. Naast een
   beeld leest een kolom anders: je oog springt heen en weer
   tussen tekst en kaart, en dan is een kortere regel makkelijker
   terug te vinden. Bovendien is dit een terzijde en geen
   hoofdtekst — dat mag je ook aan de vorm zien. */
.tscb_pagina__tweeluik > .tscb_pagina__zijlijn {
  --tscb_pagina_zijlijn_measure: 54ch;

  margin-block-start: var(--tscb_space_m);

  /* Lucht boven de tekst, op elke schermmaat. Naast de kaart begint het
     terzijde daardoor niet op de bovenrand mee, en gestapeld is dit de
     ruimte tussen de kaart en de tekst eronder.
     Padding en geen margin: de lijn links loopt door de padding heen en
     begint dus bovenaan het blok. Met margin zou hij pas op de kop
     beginnen en verliest hij z'n rol als haak om het geheel. */
  padding-block-start: var(--tscb_space_xl);
}

.tscb_pagina__tweeluik > .tscb_pagina__zijlijn p {
  max-width: var(--tscb_pagina_zijlijn_measure);
}

/* Naast de kaart nog een maat smaller, kop en tekst allebei. Op het BLOK
   en niet op de <h3>: ch rekent over de letter van het element zelf, en op
   de grote kopletter is 48ch nog altijd breder dan de kop lang is — daar
   gebeurt dan niets. Op het blok telt de ch van de lopende tekst.
   De inspringing en de lijn tellen mee in max-width (border-box), dus die
   gaan er weer bij op; anders is de tekst zelf smaller dan de maat zegt. */
@media (min-width: 60rem) {
  .tscb_pagina__tweeluik > .tscb_pagina__zijlijn {
    --tscb_pagina_zijlijn_measure: 48ch;

    max-width: calc(var(--tscb_pagina_zijlijn_measure)
                    + var(--tscb_space_l) + 2px);
  }
}

/* De h3 heeft z'n eigen inspringing en streepje al uit
   layout/spacing.css; naast deze lijn wordt dat dubbelop en
   gaat de kop scheef staan t.o.v. z'n eigen alinea. */
.tscb_pagina__zijlijn h3 {
  padding-inline-start: 0;
  margin-block-start: 0;
}
.tscb_pagina__zijlijn h3::after {
  content: none;
}
.tscb_pagina__zijlijn p {
  padding-inline-start: 0;
}

/* ---------------------------------------------------------
   6. SLOT — de afsluiter mag zachter.
   Niet kleiner: dat zou zeggen "dit hoeft u niet te lezen".
   Alleen minder contrast, zodat de nadruk boven in de pagina
   blijft liggen.
   --------------------------------------------------------- */
.tscb_pagina__slot p {
  color: var(--tscb_pagina_stil);
}

/* Extra lucht onder het slot. De foto (layout/pagina.css, 2c) hangt met
   z'n onderkant aan het einde van het document en steekt van daaruit
   omhoog; deze ruimte houdt de laatste alinea daarbuiten. Dit is de knop
   om aan te draaien als de foto te hoog of te laag uitkomt.
   Twee classes, anders wint de padding van .tscb_section_2. */
.tscb_pagina.tscb_pagina__slot {
  --tscb_pagina_slot_ruimte: 14vh;

  padding-block-end: calc(
    var(--tscb_pagina_sectie) + var(--tscb_pagina_slot_ruimte));
}

/* Tot en met tablet staat de foto over de volle breedte en niet meer naast
   de tekst, dus moet de tekst er hélemaal boven blijven. De foto is daar
   75vw hoog (4:3 op de volle breedte); de footer vult de rest. */
@media (max-width: 59.99rem) {
  .tscb_pagina.tscb_pagina__slot {
    --tscb_pagina_slot_ruimte: 70vw;
  }
}

/* ---------------------------------------------------------
   7a. DE BEWEGENDE ICONEN — weegschaal en boek.

   Deze twee wijken af van de rest: het zijn background-images
   en geen masks. Dat MOET, want een mask wordt één keer
   gerasterd en animeert daarna niet meer — een bewegende
   weegschaal zou als stilstaand plaatje eindigen. Een SVG als
   achtergrondafbeelding houdt zijn eigen CSS-animatie wél.

   De prijs is dat de kleur in het bestand zit (--kleur bovenin
   img/weegschaal.svg) en niet uit het palet komt. Wijzig je de
   tertiaire kleur, pas 'm dan daar ook aan; de andere vier
   iconen volgen het palet wel vanzelf.

   De achtergrond-shorthand zet meteen background-color op
   transparant, wat hier nodig is: de basisregel hierboven zet
   daar de maskkleur in, en die zou als dicht vlak achter de
   tekening blijven staan.
   --------------------------------------------------------- */
.tscb_pagina__kop--weging::before {
  -webkit-mask: none;
          mask: none;
  background: url("../../img/weegschaal.svg") center / contain no-repeat;
}

/* Het boek slaat af en toe een blad om — zelfde verhaal als de
   weegschaal hierboven: een mask animeert niet, dus dit is een
   background-image en de kleur zit in het bestand. */
.tscb_pagina__kop--boek::before {
  -webkit-mask: none;
          mask: none;
  background: url("../../img/boek.svg") center / contain no-repeat;
}

/* ---------------------------------------------------------
   7b. DE OVERIGE ICONEN — één regel per kop.
   Vervangen doe je hier en nergens anders: de rest van de
   opmaak zit in .tscb_pagina__kop hierboven. Elk icoon is een
   lijntekening op 24×24 zonder vulling, want als mask telt
   alleen de vorm en niet de kleur.
   --------------------------------------------------------- */

/* ---------------------------------------------------------
   8. BLOKKEN — witte tegels met paarse tekst (services).
   Foto per blok via Bricks (Style → Background); verloop ligt erover.
   --------------------------------------------------------- */
.tscb_pagina__blokken {
  display: grid;
  gap: var(--tscb_space_m);
  width: 100%;
  margin-block-start: var(--tscb_space_m);
  padding-inline-start: var(--tscb_text_indent);  /* op de tekstlijn */
}

/* eerste blok (langste tekst) over twee kolommen */
@media (min-width: 40rem) {
  .tscb_pagina__blokken { grid-template-columns: repeat(2, 1fr); }
  .tscb_pagina__blok:first-child { grid-column: span 2; }
}

@media (min-width: 60rem) {
  .tscb_pagina__blokken { grid-template-columns: repeat(3, 1fr); }
}

.tscb_pagina__blok {
  --tscb_blok_donker: var(--tscb_white);
  --tscb_blok_licht:  var(--tscb_white);
  --tscb_blok_hoogte: clamp(16rem, 20vw, 24rem);
  --tscb_blok_radius: 0.5rem;   /* = 5 px */

  position: relative;
  isolation: isolate;   /* ::before blijft onder de tekst, boven de foto */
  overflow: hidden;
  min-height: var(--tscb_blok_hoogte);
  padding: var(--tscb_space_l);
  border-radius: var(--tscb_blok_radius);
  color: var(--tscb_kopkleur_zacht);
}

/* links wit, rechtsonder doorzichtig (plek voor de foto) */
.tscb_pagina__blok::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background-image: radial-gradient(farthest-corner at 0% 30%,
    var(--tscb_blok_donker) 0%,
    color-mix(in srgb, var(--tscb_blok_donker) 90%, transparent) 30%,
    color-mix(in srgb, var(--tscb_blok_licht) 45%, transparent) 75%,
    color-mix(in srgb, var(--tscb_blok_licht) 8%, transparent) 100%);
}

.tscb_pagina__blok :is(h2, h3) {
  font-family: var(--tscb_font_body);   /* blokken: kop ook in Nunito Sans */
  max-width: 22ch;   /* tekst blijft in het dichte deel */
  margin: 0;
  padding-inline-start: 0;
  color: var(--tscb_kopkleur_zacht);
  font-size: var(--tscb_text_xl);
  line-height: var(--tscb_leading_tight);
}

.tscb_pagina__blok :is(h2, h3)::after {
  content: none;
}

/* breed blok, bredere tekst */
@media (min-width: 40rem) {
  .tscb_pagina__blok:first-child :is(h2, h3) { max-width: 40ch; }
}

/* ---------------------------------------------------------
   8b. BLOKKEN KOMEN IN BEELD — om de beurt, vanaf rechtsonder.
   js/blokken-opkomst.js zet .is_zichtbaar zodra een blok in beeld komt.
   zonder JS staan de blokken er gewoon.
   --------------------------------------------------------- */
.tscb_pagina__blokken {
  --tscb_blok_opkomst: 3rem;                          /* afstand vanaf rechtsonder */
  --tscb_blok_ease:    cubic-bezier(.65, 0, .35, 1);  /* ease-in-out */
  --tscb_blok_duur:    .9s;
  --tscb_blok_stap:    .12s;                          /* vertraging per blok */
  --tscb_blok_wacht:   .9s;                           /* bij laden: na de sectie-fade */
}

/* verborgen vanaf de eerste paint; zonder JS staan ze er gewoon */
@media (scripting: enabled) {
  .tscb_pagina__blok {
    transition:
      opacity   var(--tscb_blok_duur) var(--tscb_blok_ease),
      translate var(--tscb_blok_duur) var(--tscb_blok_ease);
    transition-delay: calc(var(--_tscb_blok_wacht, 0s) + var(--_tscb_blok_n, 0) * var(--tscb_blok_stap));
  }

  .tscb_pagina__blok:not(.is_zichtbaar) {
    opacity: 0;
    translate: var(--tscb_blok_opkomst) var(--tscb_blok_opkomst);
  }
}

/* al in beeld bij het laden: wachten tot de sectie ingefade is */
.tscb_pagina__blok.is_eerste {
  --_tscb_blok_wacht: var(--tscb_blok_wacht);
}

@media (prefers-reduced-motion: reduce) {
  .tscb_pagina__blok,
  .tscb_pagina__blok:not(.is_zichtbaar) {
    transition: none;
    opacity: 1;
    translate: none;
  }
}

/* opkomst vanaf rechts mag de pagina niet horizontaal laten scrollen */
.tscb_pagina:has(.tscb_pagina__blokken) {
  overflow-x: clip;
}

/* ---------------------------------------------------------
   8c. BLOKKEN MET TEKST — varianten voor langere inhoud (projects).
   --------------------------------------------------------- */
.tscb_pagina__blok p {
  padding-inline-start: 0;
}

.tscb_pagina__blok > .brxe-button {
  align-self: flex-start;
  margin-block-start: var(--tscb_space_xl);   /* lucht tussen tekst en knop */
}

/* halve breedte op desktop, daaronder één kolom */
.tscb_pagina__blokken--half {
  grid-template-columns: 1fr;
}

.tscb_pagina__blokken--half > .tscb_pagina__blok:first-child {
  grid-column: auto;
}

@media (min-width: 60rem) {
  .tscb_pagina__blokken--half { grid-template-columns: repeat(2, 1fr); }
}

.tscb_pagina__blokken--half .tscb_pagina__blok :is(h2, h3) {
  max-width: none;
}

/* tekstblokken: ruimere padding, lucht onder de kop */
.tscb_pagina__blokken--licht .tscb_pagina__blok {
  padding: var(--tscb_space_xl) var(--tscb_space_l);
}

.tscb_pagina__blokken--licht .tscb_pagina__blok :is(h2, h3) {
  margin-block-end: var(--tscb_space_m);
}

/* tekstblokken: streepje onder de kop, op de tekstlijn */
.tscb_pagina__blokken--licht .tscb_pagina__blok :is(h2, h3)::after {
  content: "";
  margin-inline-start: 0;
}

/* ---------------------------------------------------------
   8d. BLOKKEN OVER DE VOLLE BREEDTE — lijst (publications).
   --------------------------------------------------------- */
.tscb_pagina__blokken--vol {
  grid-template-columns: 1fr;
}

@media (min-width: 40rem) {
  .tscb_pagina__blokken--vol { grid-template-columns: 1fr; }
}

.tscb_pagina__blokken--vol > .tscb_pagina__blok:first-child {
  grid-column: auto;
}

.tscb_pagina__blokken--vol .tscb_pagina__blok {
  --tscb_blok_hoogte: auto;
  padding: var(--tscb_space_l);
}

.tscb_pagina__blokken--vol .tscb_pagina__blok :is(h2, h3) {
  max-width: none;
}

/* als <ul>: geen bullets, niet op leesbreedte */
.tscb_pagina ul.tscb_pagina__blokken {
  max-width: none;
  list-style: none;
  margin-block-end: 0;
}

/* publicatie: info, dan de schrijvers eronder */
.tscb_pagina__blok_info {
  margin: 0;
}

.tscb_pagina__blok_auteurs {
  margin-block-start: var(--tscb_space_s);
  color: var(--tscb_kopkleur_licht);
  font-size: 1.4rem;   /* = 14 px */
  font-style: italic;
}

/* laatste regel geen ondermarge: boven en onder even ruim */
.tscb_pagina__blok .tscb_pagina__blok_auteurs {
  margin-block-end: 0;
}

/* sectie die direct aansluit op de opening: geen extra lucht erboven */
.tscb_pagina.tscb_pagina--aansluitend {
  padding-block-start: 0;
}

.tscb_pagina--aansluitend .tscb_pagina__blokken {
  margin-block-start: 0;
}

/* ---------------------------------------------------------
   8e. PROEF — rand en schaduw van het formulier (contact) op de blokken.
   Weghalen = dit blok verwijderen. Radius blijft --tscb_blok_radius.
   --------------------------------------------------------- */
.tscb_pagina__blok {
  --tscb_blok_schaduw: var(--tscb_shadow_medium_1), var(--tscb_shadow_soft_3);   /* kort contact + brede zweef */
  box-shadow: var(--tscb_blok_schaduw);
}

/* randverloop als laag boven de kleur, onder de tekst; foto-plek blijft vrij */
.tscb_pagina__blok::after {
  --tscb_blok_rand: 90px;   /* = --tscb_form_edge */
  /* tinten van het offcanvas-menu (gradient.css), licht gehouden */
  --_tscb_blok_rand_stops: transparent 30%, rgb(169 123 115 / 6%) 60%, rgb(213 162 133 / 14%) 88%, rgb(131 84 56 / 15%) 99%;

  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  border-radius: inherit;

  background-image:
    linear-gradient(180deg, var(--_tscb_blok_rand_stops)),
    linear-gradient(0deg,   var(--_tscb_blok_rand_stops)),
    linear-gradient(90deg,  var(--_tscb_blok_rand_stops)),
    linear-gradient(270deg, var(--_tscb_blok_rand_stops));
  background-size:
    100% var(--tscb_blok_rand),
    100% var(--tscb_blok_rand),
    var(--tscb_blok_rand) 100%,
    var(--tscb_blok_rand) 100%;
  background-position: bottom, top, right, left;
  background-repeat: no-repeat;
}

/* cyaan: links zachte logokleur, rechtsonder wit/doorzichtig (publications) */
.tscb_pagina__blokken--cyaan .tscb_pagina__blok {
  --tscb_blok_donker: color-mix(in srgb, var(--tscb_primary_1) 55%, var(--tscb_paginakleur));
  --tscb_blok_licht:  #ffffff;
}

/* ---------------------------------------------------------
   8f. ACHTERGRONDEN EN HOOGTE — foto rechtsonder, rijen even hoog.
   --------------------------------------------------------- */
/* Bricks zet align-items: flex-start op .brxe-block; hier uitrekken per rij */
.tscb_pagina__blokken {
  align-items: stretch;
}

/* foto uit Bricks (alleen image ingesteld): vanuit rechtsonder vullen */
.tscb_pagina__blok {
  background-position: right bottom;
  background-size: cover;
  background-repeat: no-repeat;
}

/* projects: een derde extra ruimte onder, zodat de achtergrond vrijstaat */
.tscb_pagina__blokken--half .tscb_pagina__blok {
  --tscb_blok_ruimte_onder: 33%;   /* van de blokbreedte */
  padding-block-end: calc(var(--tscb_space_xl) + var(--tscb_blok_ruimte_onder));
}
