/* ─────────────────────────────────────────────────────────────────
   Duisterhof Ink — IJmuiden

   Fourth build, fourth palette, and this one is not a judgement call: the
   colours were measured off her own work. Twenty-seven photos, the top
   slice by saturation pulled out of each, k-means over what was left. It
   came back electric blue and hot red, with magenta and cyan behind them.
   That is the palette below. The magenta is her own — it is the R on her
   logo, sampled straight off it.

   So: near-black with a violet cast, because that is what she shoots
   against, and the ink colours turned up as light rather than as paint.
   Glow is used on exactly three things (the accent rule, the solid button,
   a tile on hover) and nowhere else. Neon reads as expensive when it is
   rare and as a casino when it is everywhere.

   Photos are NEVER filtered here. Her work is the most saturated in the
   whole client list and that is the product.
   ───────────────────────────────────────────────────────────────── */

:root{
  --bg:#0A0810;           /* near-black, warmed toward violet */
  --bg2:#120E1B;
  --card:#181221;
  --paper:#F3EFFA;
  --ink2:#9A90AE;
  --line:rgba(243,239,250,.12);

  --magenta:#FF2E86;      /* her R */
  --blue:#2F6BFF;         /* measured: the dominant ink in her colour work */
  --cyan:#19D8E8;
  --violet:#A55BFF;
  --accent:var(--magenta);

  --goth:"New Rocker",'Papyrus',fantasy;      /* only for display sizes */
  --sans:"Space Grotesk",system-ui,sans-serif;
  --mono:"DM Mono",ui-monospace,Menlo,monospace;

  --wrap:1180px;
  --ease:cubic-bezier(.16,1,.3,1);
  --glow:0 0 22px -4px var(--magenta);
}

*{box-sizing:border-box}
/* clip, never hidden: hidden on html kills position:sticky */
html{scroll-behavior:smooth;overflow-x:clip}
body{margin:0;background:var(--bg);color:var(--paper);
  font-family:var(--sans);font-size:17px;line-height:1.7;
  -webkit-font-smoothing:antialiased;overflow-x:clip}
body.nav-open{overflow:hidden}
img{display:block;max-width:100%}
a{color:inherit}
h1,h2,h3{margin:0;line-height:1.1}
h2,h3{font-family:var(--goth);font-weight:400;letter-spacing:.01em}
em.i{font-style:normal;color:var(--magenta)}

.wrap{width:min(100% - 2.6rem,var(--wrap));margin-inline:auto}
.t-xl{font-size:clamp(2.1rem,5.6vw,4rem)}
.t-lg{font-size:clamp(1.7rem,3.6vw,2.6rem)}
.lead{font-size:1.04rem;color:#CFC7DE;max-width:62ch}
.lbl{font-family:var(--mono);font-size:.6rem;letter-spacing:.26em;
  text-transform:uppercase;color:var(--ink2);display:block}
.sec{padding:clamp(3.4rem,8vh,6.4rem) 0}
.sec--alt{background:var(--bg2)}
.sec--first{padding-top:clamp(2.4rem,7vh,4.4rem)}
.sec__hd{margin-bottom:clamp(1.6rem,3vw,2.6rem)}
.sec__hd h2{margin-top:.7rem}

/* the one piece of pure decoration: a rule that is a spectrum of her inks */
.beam{height:2px;border:0;margin:0;
  background:linear-gradient(90deg,transparent,var(--blue),var(--cyan),
    var(--magenta),var(--violet),transparent);
  box-shadow:0 0 18px -6px var(--magenta)}

/* buttons ───────────────────────────────────────────────────────── */
.btn{display:inline-flex;align-items:center;gap:.5rem;padding:.8rem 1.5rem;
  border:1px solid var(--line);border-radius:999px;text-decoration:none;
  font-family:var(--mono);font-size:.72rem;letter-spacing:.16em;
  text-transform:uppercase;transition:.35s var(--ease);background:transparent}
.btn:hover{border-color:var(--paper)}
.btn--solid{background:var(--magenta);border-color:var(--magenta);color:#14020A;
  font-weight:500}
.btn--solid:hover{box-shadow:var(--glow);transform:translateY(-1px)}

/* topbar ────────────────────────────────────────────────────────── */
.topbar{position:sticky;top:0;z-index:60;background:rgba(10,8,16,.82);
  border-bottom:1px solid transparent;transition:.4s var(--ease)}
@supports (backdrop-filter:blur(8px)){.topbar{backdrop-filter:blur(12px)}}
.topbar.on{border-bottom-color:var(--line)}
.topbar__in{display:flex;align-items:center;justify-content:space-between;
  gap:1rem;padding:.6rem 0;width:min(100% - 2.6rem,var(--wrap));margin-inline:auto}
.topbar__mark{display:flex;align-items:center;gap:.6rem;text-decoration:none}
/* The topbar carries her R ALONE, not the whole lockup. The full lockup is
   two lines of spiky gothic caps: at 88px wide it stopped being readable and
   just looked like a smudge. The R is one shape, it is the distinctive half
   of her mark, and it survives being small. */
.topbar__mark img{width:auto;height:40px}
.topbar__nav{display:flex;gap:1.7rem;align-items:center}
.topbar__nav a{text-decoration:none;font-size:.86rem;color:#BDB3CE;
  transition:color .3s;position:relative}
.topbar__nav a:hover,.topbar__nav a[aria-current]{color:var(--paper)}
.topbar__nav a[aria-current]::after{content:"";position:absolute;left:0;right:0;
  bottom:-6px;height:1px;background:var(--magenta);box-shadow:var(--glow)}
.burg{display:none;background:none;border:0;padding:.4rem;cursor:pointer}
.burg i{display:block;width:22px;height:1px;background:var(--paper);margin:5px 0}

.sheet{position:fixed;inset:0;z-index:70;background:var(--bg);
  transform:translateY(-100%);transition:transform .5s var(--ease);
  display:flex;flex-direction:column;justify-content:center;padding:2rem}
.sheet.on{transform:none}
.sheet a{font-family:var(--goth);font-size:1.9rem;text-decoration:none;
  padding:.5rem 0;border-bottom:1px solid var(--line)}
.sheet__x{position:absolute;top:1.2rem;right:1.4rem;background:none;border:0;
  font-size:1.9rem;cursor:pointer;color:var(--paper);line-height:1}

/* hero ──────────────────────────────────────────────────────────── */
.hero{position:relative;overflow:hidden;min-height:calc(100svh - 54px);
  display:grid;grid-template-rows:1fr auto;align-items:center;
  padding:clamp(2rem,6vh,4rem) 0 clamp(1rem,3vh,2rem)}
/* her ink, as light behind the mark. Three blurred blobs, no images. */
.hero::before{content:"";position:absolute;inset:-20% -10% auto -10%;height:120%;
  background:
    radial-gradient(38% 42% at 22% 30%,rgba(47,107,255,.30),transparent 70%),
    radial-gradient(34% 40% at 78% 26%,rgba(255,46,134,.26),transparent 70%),
    radial-gradient(40% 44% at 50% 78%,rgba(25,216,232,.16),transparent 70%);
  filter:blur(18px);pointer-events:none}
.hero__in{position:relative;width:min(100% - 2.6rem,var(--wrap));
  margin-inline:auto;text-align:center}
.hero__mark{width:min(80vw,430px);margin:0 auto}
.hero h1{margin:1.3rem 0 0;font-family:var(--mono);font-weight:400;
  font-size:clamp(.72rem,1.7vw,.84rem);letter-spacing:.34em;
  text-transform:uppercase;color:var(--ink2)}
.hero__sub{margin:1rem auto 0;max-width:44ch;color:#CFC7DE}
.hero__cta{display:flex;gap:.7rem;justify-content:center;flex-wrap:wrap;margin-top:1.6rem}
.cue{position:relative;text-align:center;color:var(--ink2)}
.cue i{display:block;width:1px;height:26px;margin:.45rem auto 0;
  background:linear-gradient(var(--magenta),transparent)}

/* the status pill. Appointment-only, so it is a statement, not a clock. */
.stat{display:inline-flex;align-items:center;gap:.55rem;margin-top:1.1rem;
  font-family:var(--mono);font-size:.66rem;letter-spacing:.16em;
  text-transform:uppercase;color:var(--ink2)}
.stat::before{content:"";width:7px;height:7px;border-radius:50%;
  background:var(--magenta);box-shadow:0 0 0 4px rgba(255,46,134,.16)}

/* the mark. Word and INK in paper, her R in magenta, drawn on in that order */
.wm__word,.wm__sub{fill:var(--paper);opacity:0;
  animation:rise .7s var(--ease) forwards;
  animation-delay:calc(.15s + var(--i) * .045s)}
/* The R is a <g> carrying transform="translate(...) scale(...)" as an
   attribute, and a CSS transform REPLACES that attribute rather than adding
   to it. Animating `rise` here threw the R back to raw size at the origin —
   a magenta smear across the lockup. So the accent fades only; the letters,
   which are bare <path>s with no transform of their own, can still lift. */
.wm__accent{fill:var(--magenta);opacity:0;
  animation:fade .8s var(--ease) .85s forwards;
  filter:drop-shadow(0 0 14px rgba(255,46,134,.45))}
@keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){
  .wm__word,.wm__sub,.wm__accent{animation:none;opacity:1}
}

/* gallery ───────────────────────────────────────────────────────── */
.grid{display:grid;gap:clamp(.5rem,1.1vw,.9rem)}
.grid--four{grid-template-columns:repeat(4,minmax(0,1fr))}
.grid--all{grid-template-columns:repeat(4,minmax(0,1fr))}
.grid figure{margin:0;position:relative;overflow:hidden;border-radius:3px;
  background:var(--bg2);cursor:zoom-in;
  box-shadow:0 0 0 1px rgba(243,239,250,.06)}
.grid img{width:100%;height:100%;object-fit:cover;aspect-ratio:3/4;
  transition:transform .8s var(--ease)}
.grid figure:hover img{transform:scale(1.04)}
.grid figure::after{content:"";position:absolute;inset:0;border-radius:3px;
  box-shadow:inset 0 0 0 1px transparent;transition:.4s var(--ease);
  pointer-events:none}
.grid figure:hover::after{box-shadow:inset 0 0 0 1px var(--magenta),
  0 0 26px -10px var(--magenta)}

/* What is it? — the first question anyone has in front of a wall of tattoos.
   On a pointer it rises on hover; on a touch screen there is no hover, so it
   simply sits there. */
.grid figcaption{position:absolute;left:0;right:0;bottom:0;padding:1.6rem .9rem .7rem;
  font-family:var(--mono);font-size:.64rem;letter-spacing:.14em;text-transform:uppercase;
  color:var(--paper);pointer-events:none;
  background:linear-gradient(transparent,rgba(10,8,16,.86))}
@media (hover:hover) and (pointer:fine){
  .grid figcaption{opacity:0;transform:translateY(6px);transition:.35s var(--ease)}
  .grid figure:hover figcaption{opacity:1;transform:none}
}

.more{margin:clamp(1.2rem,2.6vw,1.8rem) 0 0}
.more a{font-family:var(--mono);font-size:.7rem;letter-spacing:.16em;
  text-transform:uppercase;text-decoration:none;
  border-bottom:1px solid var(--line);padding-bottom:.3rem;
  transition:.3s var(--ease)}
.more a:hover{border-bottom-color:var(--magenta)}
.more a span{display:inline-block;transition:transform .3s var(--ease)}
.more a:hover span{transform:translateX(4px)}

/* two-column blocks ─────────────────────────────────────────────── */
.split{display:grid;grid-template-columns:1fr minmax(0,44%);
  gap:clamp(1.8rem,4.5vw,4.2rem);align-items:start}
.split--flip{grid-template-columns:minmax(0,44%) 1fr}
.split__art img{width:100%;border-radius:3px}
.tilt{transform:rotate(-1.6deg);
  box-shadow:0 22px 50px -28px #000,0 0 30px -18px var(--magenta)}

.facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(112px,1fr));
  gap:1.3rem;margin-top:2.1rem;padding-top:1.6rem;border-top:1px solid var(--line)}
.facts dt{font-family:var(--mono);font-size:.57rem;letter-spacing:.22em;
  text-transform:uppercase;color:var(--ink2);margin-bottom:.35rem}
.facts dd{margin:0;font-family:var(--goth);font-size:1.3rem}

/* styles, as cards that each borrow one of her colours ───────────
   Text only. A version with one of her pieces on each card was tried and
   Raider preferred it without: the gallery above already carries the
   pictures, and repeating them here made the page feel padded. */
.styles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));
  gap:clamp(.7rem,1.6vw,1.1rem);list-style:none;margin:0;padding:0}
.styles li{background:var(--card);border:1px solid var(--line);border-radius:4px;
  padding:clamp(1.1rem,2.2vw,1.5rem);position:relative;overflow:hidden}
.styles li::before{content:"";position:absolute;inset:0 auto 0 0;width:2px;
  background:var(--c,var(--magenta));box-shadow:0 0 16px -2px var(--c,var(--magenta))}
.styles h3{font-size:1.15rem;margin-bottom:.4rem}
.styles p{margin:0;font-size:.92rem;color:#CFC7DE}

/* one full-bleed image band, to break the run of text blocks after the work.
   A ROW of portraits, not one stretched wide: every photo she has is
   upright, and one of those blown across a wide strip shows a sliver in the
   middle with black either side. */
.band{position:relative;height:clamp(200px,34vh,320px);overflow:hidden}
.band__row{display:flex;height:100%}
.band__row img{flex:1 1 0;min-width:0;height:100%;object-fit:cover;
  object-position:50% 40%}
.band::after{content:"";position:absolute;inset:0;
  background:linear-gradient(90deg,rgba(10,8,16,.95),rgba(10,8,16,.55) 52%,
    rgba(10,8,16,.8))}
.band__in{position:absolute;inset:0;z-index:2;display:grid;align-content:center;
  width:min(100% - 2.6rem,var(--wrap));margin-inline:auto}
.band__in p{margin:.5rem 0 0;font-family:var(--goth);
  font-size:clamp(1.5rem,3.6vw,2.4rem);max-width:16ch}

/* steps / faq / reviews ─────────────────────────────────────────── */
.steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:clamp(1rem,2.4vw,2rem);counter-reset:s;list-style:none;padding:0;margin:0}
.steps li{counter-increment:s}
.steps li::before{content:counter(s,decimal-leading-zero);display:block;
  font-family:var(--mono);font-size:.68rem;letter-spacing:.2em;
  color:var(--magenta);margin-bottom:.5rem}
.steps h3{font-size:1.1rem;margin-bottom:.3rem}
.steps p{margin:0;color:#CFC7DE;font-size:.94rem}

.faq{border-top:1px solid var(--line)}
.faq details{border-bottom:1px solid var(--line)}
.faq summary{cursor:pointer;padding:1.05rem 0;font-family:var(--goth);
  font-size:1.15rem;list-style:none;display:flex;justify-content:space-between;
  gap:1rem;align-items:center}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{content:"+";font-family:var(--mono);color:var(--magenta);
  transition:transform .3s}
.faq details[open] summary::after{transform:rotate(45deg)}
.faq p{margin:0 0 1.1rem;color:#CFC7DE;max-width:66ch}

.revs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));
  gap:clamp(.8rem,2vw,1.4rem)}
.rev{background:var(--card);border:1px solid var(--line);border-radius:4px;
  padding:1.3rem}
.rev p{margin:.5rem 0 0;font-size:1rem}
.rev .stars{color:var(--magenta);letter-spacing:.14em;font-size:.82rem}
.rev .who{margin-top:.9rem;font-family:var(--mono);font-size:.62rem;
  letter-spacing:.16em;text-transform:uppercase;color:var(--ink2)}

/* visit ─────────────────────────────────────────────────────────── */
.form{display:grid;gap:.75rem}
.form label{display:grid;gap:.3rem;font-family:var(--mono);font-size:.6rem;
  letter-spacing:.2em;text-transform:uppercase;color:var(--ink2)}
.form input,.form textarea,.form select{
  font:inherit;font-size:.95rem;padding:.7rem .85rem;border:1px solid var(--line);
  border-radius:3px;background:var(--card);color:var(--paper);width:100%}
.form input:focus,.form textarea:focus,.form select:focus{
  outline:none;border-color:var(--magenta);box-shadow:0 0 0 3px rgba(255,46,134,.12)}
.form textarea{min-height:110px;resize:vertical}
.form button[type=submit]{justify-self:start}
.hp{position:absolute;left:-9999px}
.formmsg{font-size:.9rem;min-height:1.2em;color:#8FE3A4}
.formmsg[data-state="err"]{color:var(--magenta)}

.socials{display:flex;gap:.9rem;margin-top:1.2rem}
.socials a{width:40px;height:40px;border:1px solid var(--line);border-radius:50%;
  display:grid;place-items:center;transition:.3s var(--ease)}
.socials a:hover{border-color:var(--magenta);box-shadow:var(--glow)}
.socials svg{width:17px;height:17px}

.foot{border-top:1px solid var(--line);padding:1.8rem 0;font-size:.82rem;
  color:var(--ink2);display:flex;justify-content:space-between;gap:1rem;
  flex-wrap:wrap}

/* reveal ────────────────────────────────────────────────────────── */
.rv{opacity:0;transform:translateY(16px);
  transition:opacity .9s var(--ease),transform .9s var(--ease);
  transition-delay:var(--d,0s)}
.rv.on{opacity:1;transform:none}
.fade{opacity:0;animation:fade .9s var(--ease) forwards;animation-delay:var(--d,0s)}
@keyframes fade{to{opacity:1}}
@media (prefers-reduced-motion:reduce){
  .rv{opacity:1;transform:none}.fade{opacity:1;animation:none}
}

/* lightbox ──────────────────────────────────────────────────────── */
.lb{position:fixed;inset:0;z-index:120;background:rgba(6,4,10,.95);
  display:none;place-items:center}
.lb[data-open="1"]{display:grid}
.lb__stage{max-width:min(94vw,1000px);max-height:88vh;display:grid;place-items:center}
.lb__stage img{max-width:100%;max-height:88vh;width:auto;height:auto;
  object-fit:contain;border-radius:3px}
.lb__bar{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;
  justify-content:space-between;padding:1rem 1.2rem;z-index:2}
.lb__count{color:rgba(243,239,250,.7);font-family:var(--mono);font-size:.7rem;
  letter-spacing:.16em}
.lb__foot{position:absolute;bottom:1.1rem;left:0;right:0;text-align:center;
  color:rgba(243,239,250,.4);font-family:var(--mono);font-size:.62rem;
  letter-spacing:.14em}
.lb__x,.lb__nav{background:rgba(243,239,250,.08);border:0;color:var(--paper);
  cursor:pointer;border-radius:50%;display:grid;place-items:center;
  transition:background .3s}
.lb__x:hover,.lb__nav:hover{background:var(--magenta);color:#14020A}
.lb__x{position:static;width:44px;height:44px;font-size:1.3rem;line-height:1}
.lb__nav{position:absolute;top:50%;transform:translateY(-50%);width:48px;height:48px}
.lb__nav svg{width:20px;height:20px}
.lb__nav--prev{left:1rem}
.lb__nav--next{right:1rem}
@media (max-width:720px){.lb__foot{display:none}}

/* de aanvraagbalk ───────────────────────────────────────────────── */
.dock{--dk-bg:var(--card);--dk-ink:var(--paper);--dk-ink2:var(--ink2);
  --dk-line:var(--line);--dk-pill:var(--magenta);--dk-pill-ink:#14020A;
  position:fixed;right:1rem;bottom:1rem;z-index:100;font-family:var(--sans)}
.dock__btn{display:inline-flex;align-items:center;gap:.55rem;border:0;
  background:var(--dk-pill);color:var(--dk-pill-ink);cursor:pointer;
  padding:.85rem 1.3rem;border-radius:999px;font-family:var(--mono);
  font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;font-weight:500;
  box-shadow:0 12px 30px -12px #000,0 0 24px -8px var(--magenta);
  transition:.3s var(--ease)}
.dock__btn:hover{transform:translateY(-2px)}
.dock__panel[hidden]{display:block}
.dock__panel{position:absolute;right:0;bottom:calc(100% + .7rem);
  width:min(92vw,352px);background:var(--dk-bg);border:1px solid var(--dk-line);
  border-radius:6px;padding:1.1rem;box-shadow:0 26px 60px -26px #000;
  opacity:0;visibility:hidden;transform:translateY(10px);transition:.35s var(--ease)}
.dock[data-open="1"] .dock__panel{opacity:1;visibility:visible;transform:none}
.dock__hd{display:flex;justify-content:space-between;align-items:flex-start;
  gap:1rem;margin-bottom:.8rem}
.dock__hd h3{font-size:1.1rem}
.dock__hd p{margin:.15rem 0 0;font-size:.78rem;color:var(--dk-ink2)}
.dock__x{background:none;border:0;font-size:1.3rem;line-height:1;cursor:pointer;
  color:var(--dk-ink2)}
.dock__wa{display:flex;align-items:center;gap:.6rem;padding:.6rem .8rem;
  border:1px solid var(--dk-line);border-radius:3px;text-decoration:none;
  margin-bottom:.8rem;font-size:.9rem;transition:.3s var(--ease)}
.dock__wa:hover{border-color:#25D366}
.dock__wa svg{width:17px;height:17px;flex:none;color:#25D366}
.dock__wa small{display:block;font-family:var(--mono);font-size:.56rem;
  letter-spacing:.18em;text-transform:uppercase;color:var(--dk-ink2)}
.dock .form input,.dock .form textarea,.dock .form select{padding:.55rem .7rem;
  font-size:.88rem}
.dock .form textarea{min-height:72px}

/* mobile ────────────────────────────────────────────────────────── */
@media (max-width:1000px){
  .grid--four{grid-template-columns:repeat(2,minmax(0,1fr))}
  .grid--all{grid-template-columns:repeat(3,minmax(0,1fr))}
  .split,.split--flip{grid-template-columns:minmax(0,1fr)}
  .split__art{order:-1}
  .styles{grid-template-columns:repeat(2,minmax(0,1fr))}
  .band{height:clamp(180px,28vh,240px)}
  .band__row img:nth-child(n+4){display:none}
  .steps{grid-template-columns:minmax(0,1fr)}
  .revs{grid-template-columns:minmax(0,1fr)}
}
@media (max-width:720px){
  body{font-size:16px}
  .topbar__nav{display:none}
  .burg{display:block}
  .sec{padding:clamp(2.4rem,6vh,3.8rem) 0}
  .grid--all{grid-template-columns:repeat(2,minmax(0,1fr))}
  .styles{grid-template-columns:minmax(0,1fr)}
  .hero__mark{width:min(82vw,320px)}
  .facts{margin-top:1.5rem;padding-top:1.2rem;gap:1rem}
  .dock{right:.7rem;bottom:.7rem}
  .lb__nav{width:40px;height:40px}
  .lb__nav--prev{left:.4rem}
  .lb__nav--next{right:.4rem}
}
