/*
  base.css - the shared layer for the three /voorstel concepts (HANDOFF-13).

  This is the kanookzo.nl homepage's design system, not a new one. HANDOFF-13 §2
  ratifies that: the voorstel is the moment the seller steps forward, so it wears
  our clothes, not the client's. Every token below is copied verbatim from
  tracker/public/css/site.css:4 - if that file changes, this one is wrong.

  What lives here: tokens, fonts, ground, and the ATOMS every concept shares
  (band, buttons, kicker, exhibit frame, chips, tier card, belofte, form).
  What does NOT live here: section layout and choreography. Those are a.css /
  b.css / c.css, which is the whole point of having three.

  MOTION 7 (doc 05 ladder: "flagships and our own homepage only" - this page is
  our own). Safety contract, unchanged from demo-template/motion-runtime.js:
  every hidden start state sits behind `html.beweegt`, which only exists when JS
  ran AND reduced motion was not requested, and a dead-man timer in <head>
  removes it if the runtime never registers its observer. No JS, an old engine,
  or prefers-reduced-motion all land on the fully visible page.

  ANIMATION SHORTHAND, READ THIS. --m-lang and friends bundle a duration AND an
  easing. `animation: draw 1s var(--m-lang) .3s` expands to THREE <time> values,
  which is invalid, so CSS drops the whole declaration silently. That shipped
  three dead animations on the homepage, including the brand's own underline.
  Every animation here is written as longhands with an explicit
  animation-timing-function. Transitions may use the tokens; animations may not.
*/

@font-face{font-family:Fredoka;src:url("fonts/fredoka.woff2") format("woff2");font-weight:500 600;font-display:swap}
@font-face{font-family:Figtree;src:url("fonts/figtree.woff2") format("woff2");font-weight:400 600;font-display:swap}
@font-face{font-family:"Instrument Serif";src:url("fonts/instrument-serif-italic.woff2") format("woff2");font-weight:400;font-style:italic;font-display:swap}

:root{
  --papier:#FAF7F2; --inkt:#161310; --kobalt:#2244D8; --kobalt-l:#8FA4FF;
  --veld:#EEE6D8;   --slab:#14110D;
  --m-micro:.18s cubic-bezier(.445,.05,.55,.95);
  --m-move:.45s cubic-bezier(.165,.84,.44,1);
  --m-lang:.8s  cubic-bezier(.19,1,.22,1);
  --m-pop:.55s  cubic-bezier(.34,1.56,.64,1);
  /* The same curves as bare functions, for animation-timing-function, because
     the tokens above carry a duration with them. */
  --c-move:cubic-bezier(.165,.84,.44,1);
  --c-lang:cubic-bezier(.19,1,.22,1);
  --c-pop:cubic-bezier(.34,1.56,.64,1);
  --rand:max(1rem,calc((100vw - 1180px)/2));
}

*{box-sizing:border-box}
html{scroll-behavior:smooth;overflow-x:clip}
body{margin:0;background:var(--papier);color:var(--inkt);font:400 1.06rem/1.62 Figtree,system-ui,sans-serif;overflow-x:clip}
/* Paper grain. Same fractalNoise the homepage uses, same opacity. */
body:after{content:"";position:fixed;inset:0;z-index:9999;pointer-events:none;opacity:.5;mix-blend-mode:multiply;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.022'/%3E%3C/svg%3E")}
::selection{background:var(--kobalt);color:#fff}
a{color:inherit}
button,input,textarea{font:inherit}
img{max-width:100%}
.skip{position:fixed;left:1rem;top:-5rem;z-index:100;display:flex;align-items:center;min-height:44px;background:var(--kobalt);color:#fff;padding:.7rem 1rem}
.skip:focus{top:1rem}

/* ---------------------------------------------------------- the demo banner
   Non-negotiable legal guardrail (doc 05 global constraints, doc 06 §1): every
   page of a demo carries it, this one included. Top band and footer, the same
   two places the current voorstel puts it. The link is kobalt-l on slab
   (7.02:1) and never inherits the body accent, which is the specificity bug
   this exact component already shipped once. */
.band{padding:.85rem 1.25rem;background:var(--slab);color:#EDE7DE;font-size:.86rem;line-height:1.45;text-align:center}
.band p{margin:0 auto;max-width:78ch}
.band a{color:var(--kobalt-l);font-weight:600;text-underline-offset:3px}
.band a,.voet a,.mailregel a{display:inline-flex;align-items:center;min-height:44px}
.voet{margin-top:0;padding:2.4rem 1.25rem;border-top:1px solid #d8cec1;color:#6b635a;font-size:.86rem;text-align:center}
.voet p{margin:0 auto .6rem;max-width:78ch}
.voet a{color:#1d3bb8;font-weight:600}

/* -------------------------------------------------------------- typography */
.sier{font-family:"Instrument Serif",Georgia,serif;font-weight:400;font-style:italic}
h1,h2,h3{letter-spacing:-.03em}
.kicker{display:flex;align-items:center;gap:.65rem;margin:0 0 1rem;color:var(--kobalt);font-size:1rem;font-weight:600;letter-spacing:.1em}
.kicker:before{content:"";width:26px;height:2px;background:currentColor;transform-origin:left}
.beweegt .kicker:before{transform:scaleX(0);transition:transform var(--m-lang) .2s}
.beweegt .kicker.is-zichtbaar:before,.beweegt .is-zichtbaar .kicker:before{transform:scaleX(1)}

/* The hand-drawn krabbel and krul. pathLength="1" normalises every path to a
   dasharray of 1, so one rule draws any of them. */
.krabbel path,.krul path{fill:none;stroke:var(--kobalt);stroke-width:4;stroke-linecap:round;stroke-dasharray:1;stroke-dashoffset:0}
.beweegt .krabbel path,.beweegt .krul path{stroke-dashoffset:1}
@keyframes teken{to{stroke-dashoffset:0}}

/* ------------------------------------------------------------------ knoppen */
.knop{display:inline-flex;align-items:center;justify-content:center;min-height:49px;padding:.7rem 1.35rem;border:2px solid var(--inkt);border-radius:999px;font-weight:600;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background var(--m-micro),color var(--m-micro),box-shadow var(--m-move),transform var(--m-move)}
.primair{background:var(--kobalt);border-color:var(--kobalt);color:#fff}
.primair:hover{box-shadow:0 14px 30px #2244d859;transform:translateY(-3px)}
.spook:hover{background:var(--inkt);color:var(--papier)}
.knop:active{transform:translateY(1px) scale(.98)}
.tekstlink{color:#1d3bb8;font-weight:600;text-underline-offset:5px}

/* ------------------------------------------------------- de handover-vitrine
   Their demo, framed, as the exhibit under discussion. The ONLY per-site visual
   on the page (HANDOFF-13 §4.1) - everything else is ours. It rests at a slight
   tilt and straightens as it enters, which is the homepage's `recht` entrance. */
.vitrine{overflow:hidden;border:1px solid #d4ccc1;border-radius:18px;background:#fff;box-shadow:0 26px 70px #493d2f26;transform:rotate(.6deg)}
.beweegt .vitrine{opacity:0;transform:translateY(40px) rotate(2.4deg);transition:opacity .8s var(--c-lang),transform .8s var(--c-lang)}
.beweegt .vitrine.is-zichtbaar{opacity:1;transform:rotate(.6deg)}
.browserbar{height:38px;display:flex;align-items:center;gap:6px;padding:0 12px;background:#eeeae5;border-bottom:1px solid #d6d0c8}
.browserbar i{width:9px;height:9px;border-radius:50%;background:#aaa29a}
.browserbar span{min-width:0;margin:auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.66rem;color:#69635d}
.vitrine img{display:block;width:100%;height:auto}
.vitrine-voet{display:flex;flex-wrap:wrap;gap:.6rem 1.2rem;align-items:center;justify-content:space-between;margin:1rem .2rem 0;font-size:.92rem}
.vitrine-voet .tekstlink{display:inline-flex;align-items:center;min-height:44px}

/* -------------------------------------------------------------- proof chips
   Count-ups. The label lives in its own element and NEVER inside the counting
   one: the counter writes textContent, so a label nested in it is erased on the
   first frame. */
.bewijsjes{display:grid;grid-template-columns:repeat(4,1fr);gap:1.6rem}
.bewijsje{display:grid;gap:.15rem}
.bewijsje strong{font:600 clamp(1.9rem,4.4vw,3rem)/1 Fredoka}
.bewijsje .label{font-size:.9rem;opacity:.78}

/* ------------------------------------------------------------ onthul-lijst
   Staggered rows, 70ms apart, each with a kobalt tick that draws itself. --n is
   set by the runtime so a row can be added without renumbering anything. */
.onthul-lijst{margin:0;padding:0;list-style:none}
.onthul-lijst li{position:relative;margin:0 0 .9rem;padding-left:2.1rem}
.onthul-lijst li svg{position:absolute;left:0;top:.34em;width:1.35rem;height:1.35rem;overflow:visible}
.onthul-lijst li path{fill:none;stroke:var(--kobalt);stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1;stroke-dashoffset:0}
.beweegt .onthul-lijst li{opacity:0;transform:translateY(14px);transition:opacity var(--m-lang),transform var(--m-lang);transition-delay:calc(var(--n,0) * 70ms)}
.beweegt .onthul-lijst.is-zichtbaar li{opacity:1;transform:none}
.beweegt .onthul-lijst li path{stroke-dashoffset:1;transition:stroke-dashoffset .5s var(--c-move);transition-delay:calc(var(--n,0) * 70ms + 180ms)}
.beweegt .onthul-lijst.is-zichtbaar li path{stroke-dashoffset:0}

/* ------------------------------------------------------------- de pakketten
   Three tiers, ruled three (HANDOFF-13 §5). No "meest gekozen", no countdown,
   no fake scarcity - the sticker says a person recommends it and then says why,
   which is a claim Lorenzo can stand behind. */
.pakket{position:relative;display:flex;flex-direction:column;overflow:visible;padding:2rem;border:1px solid #bdb3a7;border-radius:22px;background:var(--papier);transition:transform var(--m-move),box-shadow var(--m-move)}
.pakket:hover{transform:translateY(-7px) rotate(-.4deg);box-shadow:0 22px 48px #4f423128}
.pakket.aanbevolen{z-index:1;border:2px solid var(--kobalt);background:#E9EEFF}
.rubriek{font-size:.74rem;font-weight:600;letter-spacing:.12em}
.prijs{display:flex;align-items:baseline;gap:.15rem;margin:1.5rem 0 .3rem}
.prijs sup{font:600 1.3rem Fredoka;top:-.1em}
.prijs strong{font:600 clamp(2.4rem,5vw,2.9rem)/1 Fredoka}
.prijs .eenmalig{margin-left:.45rem;font-size:.82rem;font-weight:400;opacity:.72}
.maand{display:inline-block;align-self:flex-start;padding:.3rem .65rem;border-radius:999px;background:var(--inkt);color:var(--papier);font-size:.78rem}
.pakket p.wat{min-height:clamp(5rem,8vw,6.5rem);margin:1.4rem 0 0;font-size:1rem}
.pakket .waarom{margin-top:1.4rem;padding-top:1.4rem;border-top:1px solid #d8cec1;font-size:1rem;color:#4c453d}
.aanbevolen .waarom{color:#3a3a52}
.maatprijs{margin:1.5rem 0 .3rem;font:600 1.55rem/1.15 Fredoka}
.sticker{position:absolute;z-index:2;right:1rem;top:1rem;max-width:calc(100% - 2rem);padding:.45rem .75rem;background:var(--kobalt);color:#fff;font-size:.72rem;font-weight:600;letter-spacing:.04em;white-space:nowrap;transform:rotate(-3deg);transition:transform var(--m-pop)}
.aanbevolen:hover .sticker{transform:rotate(-5deg) scale(1.05)}
/* The one overshoot moment on the page. --m-pop is legal on a Lionsworth
   surface; the motion-library's no-overshoot rule governs demo sites. */
.beweegt .sticker{opacity:0;transform:rotate(3deg) scale(.72)}
.beweegt .is-zichtbaar .sticker{animation-name:stickerpop;animation-duration:.55s;animation-timing-function:var(--c-pop);animation-delay:.1s;animation-fill-mode:forwards}
@keyframes stickerpop{from{opacity:0;transform:rotate(5deg) scale(.72)}to{opacity:1;transform:rotate(-3deg) scale(1)}}
.pakketvoet{margin:2rem 0 0;font-size:1rem;color:#4c453d}

/* ------------------------------------------------------------- de belofte
   The guarantee, carried by type and one drawn flourish rather than by a tinted
   box with an accent border down its left edge - that border is the single most
   recognisable tell of a generated interface, and this page already spends its
   one framed treatment on the tiers. */
.belofte{display:grid;gap:clamp(2rem,8vw,8rem);grid-template-columns:minmax(0,1.15fr) minmax(180px,.65fr);align-items:center;min-height:clamp(300px,35vw,500px)}
.belofte-copy{max-width:44ch}
.belofte .rubriek{color:var(--kobalt)}
.belofte strong{display:block;margin:.7rem 0 1.2rem;font:600 clamp(2.2rem,5.4vw,4.8rem)/1.02 Fredoka;letter-spacing:-.03em}
.belofte p{margin:0;max-width:44ch;font-size:1.1rem}
.belofte .krul{justify-self:end;width:min(260px,100%);height:auto;margin:0;transform:rotate(-5deg)}
.beweegt .krul.is-zichtbaar path,.beweegt .is-zichtbaar .krul path{animation-name:teken;animation-duration:1.4s;animation-timing-function:var(--c-lang);animation-fill-mode:forwards}

/* ------------------------------------------------------------------ stappen */
.stappen{display:grid;gap:1.2rem;margin:0;padding:0;list-style:none;counter-reset:s}
.stap{display:grid;grid-template-columns:auto 1fr;gap:1.4rem;align-items:start;counter-increment:s}
.stap:before{content:counter(s);font:600 clamp(2.6rem,6vw,4rem)/.9 Fredoka;color:var(--kobalt)}
.stap strong{display:block;font:600 clamp(1.15rem,2.2vw,1.5rem)/1.2 Fredoka;margin-bottom:.25rem}
.stap p{margin:0}

/* ------------------------------------------------------------ korte vragen
   <details> so every answer is reachable with no JS at all. */
.vraag{border-top:1px solid #d8cec1}
.vraag:last-of-type{border-bottom:1px solid #d8cec1}
.vraag summary{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1.1rem 0;font:600 1.08rem/1.35 Figtree,system-ui,sans-serif;cursor:pointer;list-style:none}
.vraag summary::-webkit-details-marker{display:none}
.vraag summary:after{content:"+";flex:none;font:600 1.5rem/1 Fredoka;color:var(--kobalt);transition:transform var(--m-move)}
.vraag[open] summary:after{transform:rotate(45deg)}
.vraag p{margin:0 0 1.2rem;max-width:62ch;color:#4c453d}

/* ------------------------------------------------------------------ formulier */
.contactvak{display:grid;gap:1rem;padding:2rem;border-radius:22px;background:var(--papier);color:var(--inkt)}
label{display:grid;gap:.35rem;font-weight:600}
input,textarea{width:100%;padding:.8rem;border:2px solid #6a625a;border-radius:10px;background:#fff;color:var(--inkt)}
textarea{min-height:120px;resize:vertical}
input:focus,textarea:focus{outline:3px solid var(--kobalt);outline-offset:2px}
.val{position:absolute;left:-9999px}
.status{margin:0;font-weight:600;color:#0a7d5c}

/* -------------------------------------------------------------- het portret */
.afzender{display:flex;align-items:center;gap:clamp(1rem,2.2vw,1.5rem)}
.portret{flex:none;margin:0;padding:7px;border-radius:22px;background:var(--papier);box-shadow:0 16px 38px #493d2f2e;transform:rotate(-2.5deg);transition:transform var(--m-move)}
.afzender:hover .portret{transform:rotate(0)}
.portret img{display:block;width:clamp(76px,18vw,104px);height:clamp(76px,18vw,104px);border-radius:15px;object-fit:cover}
/* The signature, in ink on the paper ground - a real one is written in pen,
   not in the brand accent. It writes itself once the block is revealed, using
   the same pathLength/dashoffset mechanism as the krabbel and the krul. */
.handtekening{margin:0 0 .1rem}
.handtekening .sig{display:block;width:clamp(148px,20vw,186px);height:auto;overflow:visible}
.handtekening .sig path{fill:none;stroke:var(--inkt);stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1;stroke-dashoffset:0}
/* The <p> carries data-onthul so the runtime observes the signature ITSELF,
   rather than relying on an .onthul ancestor. A hits it inside a time-based
   `beat` hero and B puts it in a sticky rail - in both, an ancestor-scoped
   reveal would never fire and the signature would sit at dashoffset 1, i.e.
   invisible, permanently. Never hide a thing behind a reveal it does not own. */
.beweegt .handtekening .sig path{stroke-dashoffset:1}
.beweegt .handtekening.is-zichtbaar .sig path{animation-name:teken;animation-duration:1.5s;animation-timing-function:var(--c-lang);animation-fill-mode:forwards}
.afzender-regel{margin:.15rem 0 0;font-size:1rem;font-weight:600;letter-spacing:.1em;opacity:.66}

/* ------------------------------------------------------- cursor + voortgang */
.cursor{position:fixed;z-index:10000;left:0;top:0;width:12px;height:12px;border-radius:50%;background:var(--kobalt);pointer-events:none;mix-blend-mode:multiply;transform:translate3d(-30px,-30px,0);transition:width var(--m-micro),height var(--m-micro),opacity var(--m-micro)}
.cursor.groot{width:44px;height:44px;opacity:.25}
@media(hover:none){.cursor{display:none}}

/* --------------------------------------------------------- generic reveals */
.beweegt .onthul{opacity:0;transform:translateY(24px);transition:opacity var(--m-lang),transform var(--m-lang)}
.beweegt .onthul.is-zichtbaar{opacity:1;transform:none}

/* ------------------------------------------------------------ reduced motion
   Belt and braces: the `beweegt` class is never added when reduce is set, so
   none of the hidden start states above can apply. This block also neutralises
   the things that move WITHOUT the class - parallax transforms, the sticker,
   the portrait tilt - and is what the three-engine motion gate asserts. */
@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .cursor{display:none}
  *,*:before,*:after{animation:none!important;transition:none!important}
  .onthul,.onthul-lijst li,.vitrine,.sticker{opacity:1!important;transform:none!important}
  .vitrine{transform:rotate(.6deg)!important}
  .krabbel path,.krul path,.onthul-lijst li path{stroke-dashoffset:0!important}
  [data-parallax],.decorwoord{transform:none!important}
}

/* concept A layout */
/*
  a.css - CONCEPT A, "Het gesprek".

  The homepage's own rhythm, read top to bottom: full-bleed bands alternating
  papier / veld / slab, a hero that arrives in beats with the krabbel drawing
  itself under "zo.", and the exhibit straightening directly under it.

  Closest sibling to kanookzo.nl. The argument runs in one column and the
  reader is carried rather than steered.

  L3 (scroll-linked): the zolijn progress rail down the left edge.
  L4 (interactive): magnetic buttons, cursor stip, the <details> questions.

  Animations are longhands. See the note at the top of base.css.
*/

.sectie{padding:clamp(4.5rem,9vw,7.5rem) var(--rand)}
.sectie h2{max-width:20ch;margin:0 0 2.5rem;font:600 clamp(2rem,5vw,3.4rem)/1.05 Fredoka}

/* ------------------------------------------------------------------- hero
   Two columns: the argument on the left, the person making it on the right.
   Single-column left the whole top right of the fold empty while the only
   human thing on the page sat below the fold in a corner. The portrait is
   centred against the copy block, which lands it beside the headline. */
.hero{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:clamp(2rem,5vw,4.5rem);align-items:center;padding:clamp(3.5rem,8vw,6rem) var(--rand) clamp(2.5rem,5vw,4rem)}
.hero-copy{min-width:0}
.hero-afzender{justify-self:end}
.hero h1{margin:.4rem 0 0;font:600 clamp(3.2rem,9vw,6rem)/1.02 Fredoka;letter-spacing:-.02em}
.hero h1>span,.hero h1>em{display:inline-block}
.hero .zo{position:relative;color:var(--kobalt)}
.hero .zo .krabbel{position:absolute;left:0;top:88%;width:105%;height:auto;overflow:visible}
.hero .lead{max-width:54ch;margin:1.6rem 0 0;font-size:1.14rem}
.hero .afzender{margin-top:0}

/* The entrance beats. Delay is its OWN declaration: --m-pop bundles a duration
   and an easing, so putting a delay in the animation shorthand would make three
   <time> values and CSS would drop the rule silently. */
.beweegt .beat{opacity:0;transform:translateY(22px);animation-name:beat;animation-duration:.55s;animation-timing-function:var(--c-pop);animation-fill-mode:forwards}
@keyframes beat{to{opacity:1;transform:none}}
.beweegt .b1{animation-delay:.05s}
.beweegt .b2{animation-delay:.2s}
.beweegt .b3{animation-delay:.36s}
.beweegt .b4{animation-delay:.52s}
.beweegt .b5{animation-delay:.9s}
.beweegt .b6{animation-delay:1.05s}
/* The krabbel draws on the last beat. */
.beweegt .hero .zo .krabbel path{animation-name:teken;animation-duration:1s;animation-timing-function:var(--c-lang);animation-delay:1.15s;animation-fill-mode:forwards}

/* -------------------------------------------------------------- de vitrine */
.vitrinesectie{padding:0 var(--rand) clamp(4rem,8vw,6rem)}
.vitrinesectie .vitrine{max-width:940px}
.vitrine-voet{max-width:940px;color:#6b635a}

/* ---------------------------------------------------------------- wat u ziet
   The decorwoord from concept C. It is scroll-linked (data-parallax), sits at
   4% kobalt so it never competes with the text over it, and is aria-hidden -
   it is texture, not content. `overflow:hidden` on the section is what keeps a
   word wider than the viewport from creating a horizontal scrollbar. */
.ziet{position:relative;overflow:hidden;background:var(--veld)}
.zietbinnen{position:relative;z-index:1}
.decorwoord{position:absolute;top:14%;left:-3%;white-space:nowrap;color:#2244d80f;font:600 clamp(9rem,26vw,20rem)/1 Fredoka;pointer-events:none;will-change:transform}
.tweeluik{display:grid;grid-template-columns:1.25fr 1fr;gap:clamp(2rem,6vw,5rem);align-items:start}
.groot{font:500 clamp(1.2rem,2.4vw,1.6rem)/1.35 Fredoka;margin-top:0}
.ziet .bewijsjes{grid-template-columns:1fr 1fr;gap:1.8rem 1.2rem;padding:2rem;border:1px solid #d3c8b8;border-radius:22px;background:#faf7f2a6}

/* ---------------------------------------------------------------- toevoegt */
.toevoegt .onthul-lijst{max-width:60ch;font-size:1.08rem}

/* ---------------------------------------------------------------- prijzen
   Concept C's alternation, adopted: the DARK band is spent on the tiers, not
   on the belofte. The price is what the reader came for, so it gets the one
   ground that stops the scroll, and the sticker pop lands on a slab where it
   actually reads. Grounds now run papier → veld → papier → slab → veld →
   papier → veld → slab, with no two adjacent sections sharing one. */
.prijzen{background:var(--slab);color:var(--papier)}
.prijzen .kicker{color:var(--kobalt-l)}
.pakketten{display:grid;grid-template-columns:repeat(3,1fr);align-items:stretch;gap:1.2rem}
/* The cards are papier on a slab section and must take the ink back, or the
   section's `color:var(--papier)` inherits in and paints #FAF7F2 on #FAF7F2 -
   1:1 contrast, tier name and price invisible, while the two lines carrying an
   explicit colour still show so it reads as a style quirk. Measured on C
   before this was moved across; do not drop it. */
.prijzen .pakket{color:var(--inkt);border-color:#3a342c}
.prijzen .sticker{background:var(--kobalt)}
.prijzen .pakket.aanbevolen{transform:scale(1.03)}
.prijzen .pakket.aanbevolen:hover{transform:scale(1.03) translateY(-7px) rotate(-.4deg)}
.pakketvoet{max-width:70ch;margin-inline:auto;color:#c9c0b4;text-align:center}

/* ---------------------------------------------------------------- belofte
   Veld, between the slab tiers and the papier steps, so the guarantee still
   reads as its own moment without repeating the ground either neighbour has. */
.belofte-sectie{background:var(--veld)}
.belofte-sectie .belofte{max-width:none}

/* ----------------------------------------------------------------- stappen */
.verder .stappen{max-width:62ch}
.verder .stap{padding-bottom:1.4rem;border-bottom:1px solid #ded4c6}
.verder .stap:last-child{border-bottom:0}

/* ------------------------------------------------------------ korte vragen */
.vragen-sectie{background:var(--veld)}
.vragen-sectie>div{max-width:64ch}

/* ------------------------------------------------------------------ finale */
.finale{position:relative;display:grid;grid-template-columns:1fr 1fr;gap:clamp(2.5rem,7vw,6rem);align-items:start;overflow:hidden;background:var(--slab);color:var(--papier);padding-bottom:clamp(7rem,12vw,10rem)}
.finale>div{position:relative;z-index:1}
.finale h2{font:600 clamp(2.2rem,5vw,3.6rem)/1.05 Fredoka;margin:0 0 1rem;max-width:14ch}
.finale p{max-width:46ch}
.finale .mailregel{margin-top:1.6rem;font-size:.95rem;color:#c9c0b4}
.finale .tekstlink{color:var(--kobalt-l)}
/* SPECIFICITY, NOT ORDER. `.finale>div` is (0,1,1) and a bare `.ghost` is
   (0,1,0), so the ghost would lose `position:absolute` wherever the rule sat,
   become a grid item, and its nowrap wordmark would blow the first column out
   and crush the form. That is exactly what it did in concept C, and it is the
   same class voorstel.css already records twice. Qualified so it wins. */
.finale>.ghost{position:absolute;left:0;bottom:-.18em;z-index:0;color:#faf7f214;font:600 clamp(4rem,15vw,13rem)/1 Fredoka;white-space:nowrap;pointer-events:none}

/* ----------------------------------------------------- L3: de zolijn-rail */
.zolijn{position:fixed;z-index:50;top:0;bottom:0;left:max(14px,calc((100vw - 1180px)/2 - 30px));width:3px;pointer-events:none}
.zolijn i{display:block;width:100%;height:0;background:var(--kobalt)}
.zolijn i:after{content:"";position:absolute;left:50%;top:var(--p,0);width:12px;height:12px;border-radius:50%;background:var(--kobalt);translate:-50% -50%}

@media(max-width:900px){
  /* The portrait goes back under the copy: beside it, a column narrow enough
     to fit would shrink the headline more than the portrait is worth. */
  .hero,.tweeluik,.finale{grid-template-columns:1fr}
  .hero-afzender{justify-self:start;margin-top:2.2rem}
  .pakketten{grid-template-columns:1fr}
  .pakket p.wat{min-height:4.5rem}
  .prijzen .pakket.aanbevolen,.prijzen .pakket.aanbevolen:hover{transform:none}
  .zolijn{display:none}
  .ziet .bewijsjes{grid-template-columns:1fr 1fr}
  .belofte{grid-template-columns:1fr;min-height:0}
  .belofte .krul{justify-self:start;width:190px}
}
@media(max-width:560px){
  .hero h1{font-size:clamp(3.2rem,17vw,4.6rem)}
  .ziet .bewijsjes{padding:1.4rem}
  .decorwoord{top:6%}
}
