/* ==========================================================================
   Floris Wamelink
   A full portfolio: landing, work index, eight case pages, film, about.
   The photographs carry it. Type stays quiet and gets out of the way.
   ========================================================================== */
:root{
  --paper:#FCFCFB; --ink:#0F0E0E; --ink2:#2A2A2A; --meta:#6B6B6B;
  --warm:#F2F1EE; --line:rgba(15,14,14,.12); --line2:rgba(15,14,14,.22);
  --nav:60px; --pad:clamp(18px,4.4vw,64px);
  --s:"Fraunces",ui-serif,Georgia,serif; --b:"Inter",system-ui,sans-serif;
  --e:cubic-bezier(.16,1,.3,1);
}
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--b);font-size:16px;line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden}
img{display:block;max-width:100%;height:auto}
a{color:inherit;text-decoration:none}
figure{margin:0}
h1,h2,h3{font-family:var(--s);font-weight:300;margin:0;line-height:1.02;letter-spacing:-.02em;text-wrap:balance}

/* film grain, the thing that stops flat white reading as a template */
.grain{position:fixed;inset:0;z-index:70;pointer-events:none;opacity:.30;mix-blend-mode:multiply;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='.42'/%3E%3C/svg%3E");
  background-size:160px}

.eyebrow{font-family:var(--b);font-size:11px;font-weight:500;letter-spacing:.16em;text-transform:uppercase;color:var(--meta);margin:0}

/* ---- nav --------------------------------------------------------------- */
.nav{position:fixed;top:0;left:0;right:0;height:var(--nav);z-index:80;display:flex;align-items:center;justify-content:space-between;
  padding:0 var(--pad);background:color-mix(in srgb,var(--paper) 86%,transparent);backdrop-filter:blur(12px);
  border-bottom:1px solid transparent;transition:border-color .4s var(--e)}
.nav.on{border-bottom-color:var(--line)}
.nav__mark{font-family:var(--s);font-size:17px;letter-spacing:-.01em}
.nav__links{display:flex;gap:clamp(14px,2.2vw,30px)}
.nav__links a{font-size:13.5px;color:var(--ink2);position:relative;padding:4px 0}
.nav__links a::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;background:currentColor;transform:scaleX(0);transform-origin:0 50%;transition:transform .4s var(--e)}
.nav__links a:hover::after{transform:scaleX(1)}
@media(max-width:560px){.nav__links a{font-size:12.5px}.nav__mark{font-size:15px}}

/* ---- hero -------------------------------------------------------------- */
.hero{padding:calc(var(--nav) + clamp(50px,11vh,120px)) var(--pad) clamp(24px,4vh,44px);max-width:1500px;margin:0 auto}
.hero__h{font-size:clamp(46px,9.4vw,140px);margin-top:16px;max-width:14ch}
.hero__sub{margin:clamp(18px,3vh,30px) 0 0;max-width:56ch;font-size:clamp(15px,1.5vw,18px);color:var(--ink2)}
.hero__plate{padding:0 var(--pad);max-width:1500px;margin:0 auto}
.hero__plate img{width:100%;height:clamp(300px,72vh,760px);object-fit:cover}

.strip{display:flex;flex-wrap:wrap;gap:8px 26px;padding:clamp(22px,4vh,40px) var(--pad);max-width:1500px;margin:0 auto;
  font-size:11px;font-weight:500;letter-spacing:.14em;text-transform:uppercase;color:var(--meta);border-bottom:1px solid var(--line)}

/* ---- landing feature cases --------------------------------------------- */
.feature{max-width:1500px;margin:0 auto;padding:clamp(40px,7vh,90px) var(--pad);display:grid;gap:clamp(46px,9vh,130px)}
.fcase{display:grid;gap:clamp(16px,3vw,44px);align-items:center}
@media(min-width:900px){
  .fcase{grid-template-columns:1.35fr 1fr}
  .fcase:nth-child(even) .fcase__img{order:2}
  .fcase:nth-child(even){grid-template-columns:1fr 1.35fr}
}
.fcase__img{overflow:hidden;background:var(--warm)}
.fcase__img img{width:100%;aspect-ratio:4/3;object-fit:cover;transition:transform 1.2s var(--e)}
.fcase:hover .fcase__img img{transform:scale(1.035)}
.fcase__body{display:flex;flex-direction:column;gap:9px}
.fcase__n{font-size:11px;letter-spacing:.16em;color:var(--meta)}
.fcase__t{font-family:var(--s);font-weight:300;font-size:clamp(28px,4.4vw,60px);line-height:1.02;letter-spacing:-.02em}
.fcase__m{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--meta)}
.fcase__d{margin:6px 0 0;color:var(--ink2);max-width:44ch}
.fcase__go{margin-top:10px;font-size:12px;letter-spacing:.1em;text-transform:uppercase;border-bottom:1px solid var(--line2);padding-bottom:3px;align-self:flex-start;transition:padding-right .4s var(--e)}
.fcase:hover .fcase__go{padding-right:16px}

/* ---- index listing ----------------------------------------------------- */
.listing{max-width:1500px;margin:0 auto;padding:clamp(30px,6vh,70px) var(--pad) clamp(50px,9vh,110px)}
.listing__h{font-size:clamp(22px,2.6vw,34px);margin-bottom:16px}
.lrow{display:grid;grid-template-columns:1.6fr .5fr 1fr auto;gap:14px;align-items:baseline;padding:13px 0;border-top:1px solid var(--line);
  font-size:13.5px;transition:padding-left .45s var(--e)}
.lrow:last-of-type{border-bottom:1px solid var(--line)}
.lrow:hover{padding-left:12px}
.lrow span:nth-child(2),.lrow span:nth-child(3){color:var(--meta);font-size:12px;letter-spacing:.08em;text-transform:uppercase}
.lrow__go{justify-self:end;font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--meta)}
.lrow:hover .lrow__go{color:var(--ink)}
@media(max-width:700px){.lrow{grid-template-columns:1fr auto;row-gap:2px}.lrow span:nth-child(2),.lrow span:nth-child(3){grid-column:1}}

/* ---- page head (work index, about) ------------------------------------- */
.pagehead{padding:calc(var(--nav) + clamp(48px,10vh,110px)) var(--pad) clamp(26px,5vh,54px);max-width:1500px;margin:0 auto}
.pagehead__h{font-size:clamp(44px,8vw,116px);margin-top:14px}
.pagehead__sub{margin:18px 0 0;max-width:52ch;color:var(--ink2)}

/* ---- work grid --------------------------------------------------------- */
.grid{max-width:1500px;margin:0 auto;padding:0 var(--pad) clamp(50px,9vh,110px);display:grid;gap:clamp(14px,2.2vw,30px)}
@media(min-width:700px){.grid{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1200px){.grid{grid-template-columns:repeat(3,1fr)}.tile--wide{grid-column:span 2}}
.tile{display:block}
.tile__img{overflow:hidden;background:var(--warm)}
.tile__img img{width:100%;aspect-ratio:4/5;object-fit:cover;transition:transform 1.2s var(--e)}
.tile--wide .tile__img img{aspect-ratio:16/10}
.tile:hover .tile__img img{transform:scale(1.035)}
.tile__cap{display:flex;flex-direction:column;gap:2px;margin-top:11px}
.tile__t{font-family:var(--s);font-size:19px;font-weight:300;letter-spacing:-.01em}
.tile__m{font-size:11px;letter-spacing:.13em;text-transform:uppercase;color:var(--meta)}

/* ---- case page --------------------------------------------------------- */
.case{padding:calc(var(--nav) + clamp(48px,10vh,110px)) var(--pad) clamp(22px,4vh,40px);max-width:1500px;margin:0 auto}
.case__h{font-size:clamp(42px,8vw,116px);margin-top:14px}
.case__sub{margin:16px 0 0;max-width:46ch;font-size:clamp(16px,1.7vw,20px);color:var(--ink2);font-family:var(--s);font-style:italic;font-weight:300}
.case__hero{max-width:1500px;margin:0 auto;padding:0 var(--pad)}
.case__hero img{width:100%;height:clamp(300px,78vh,820px);object-fit:cover}
.case__brief{max-width:1500px;margin:0 auto;padding:clamp(40px,7vh,90px) var(--pad);display:grid;gap:clamp(24px,4vw,70px)}
@media(min-width:860px){.case__brief{grid-template-columns:1fr 1fr}}
.case__label{font-family:var(--b);font-size:11px;font-weight:500;letter-spacing:.16em;text-transform:uppercase;color:var(--meta);margin-bottom:12px}
.case__ask{font-family:var(--s);font-weight:300;font-size:clamp(19px,2.3vw,29px);line-height:1.24;letter-spacing:-.015em;margin:0;max-width:26ch}
.case__block p{margin:0 0 1em;color:var(--ink2);max-width:52ch}

/* ---- plates ------------------------------------------------------------ */
.plates{max-width:1500px;margin:0 auto;padding:0 var(--pad) clamp(40px,7vh,90px);display:grid;gap:clamp(12px,2vw,26px)}
.plate{overflow:hidden;background:var(--warm)}
.plate img{width:100%;height:auto;display:block}
.plate--wide img{max-height:86vh;object-fit:cover;width:100%}
.plate-pair{display:grid;gap:clamp(12px,2vw,26px)}
@media(min-width:760px){.plate-pair{grid-template-columns:1fr 1fr}}

/* ---- next project ------------------------------------------------------ */
.next{position:relative;display:block;max-width:1500px;margin:0 auto;padding:clamp(40px,8vh,100px) var(--pad);border-top:1px solid var(--line);overflow:hidden}
.next__k{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--meta);display:block}
.next__t{font-family:var(--s);font-weight:300;font-size:clamp(34px,6.4vw,88px);line-height:1.02;letter-spacing:-.02em;display:block;margin-top:8px}
.next__m{font-size:11px;letter-spacing:.13em;text-transform:uppercase;color:var(--meta);display:block;margin-top:10px}
.next__img{position:absolute;right:var(--pad);top:50%;transform:translateY(-50%) scale(.98);width:min(320px,32vw);aspect-ratio:4/5;object-fit:cover;
  opacity:0;transition:opacity .6s var(--e),transform .9s var(--e)}
@media(max-width:820px){.next__img{display:none}}
.next:hover .next__img{opacity:1;transform:translateY(-50%) scale(1)}

/* ---- about ------------------------------------------------------------- */
.about{max-width:1500px;margin:0 auto;padding:0 var(--pad) clamp(40px,7vh,80px);display:grid;gap:clamp(26px,4vw,70px)}
@media(min-width:860px){.about{grid-template-columns:1.4fr 1fr}}
.about__body p{margin:0 0 1.2em;font-size:clamp(16px,1.7vw,19px);color:var(--ink2);max-width:56ch}
.about__body p:first-child{font-family:var(--s);font-weight:300;font-size:clamp(20px,2.4vw,30px);line-height:1.26;color:var(--ink);letter-spacing:-.015em}
.about__list{list-style:none;margin:0;padding:0}
.about__list li{padding:7px 0;border-bottom:1px solid var(--line);font-size:14px}

/* ---- footer ------------------------------------------------------------ */
.foot{border-top:1px solid var(--line);max-width:1500px;margin:0 auto;padding:clamp(34px,6vh,70px) var(--pad) clamp(24px,4vh,40px)}
.foot__big{font-family:var(--s);font-weight:300;font-size:clamp(38px,8vw,110px);line-height:1;letter-spacing:-.03em;display:inline-block;transition:opacity .3s}
.foot__big:hover{opacity:.55}
.foot__meta{display:flex;flex-wrap:wrap;gap:8px 28px;margin-top:clamp(26px,5vh,52px);font-size:12px;color:var(--meta)}

/* ---- reveal ------------------------------------------------------------ */
.js .reveal{opacity:0;transform:translateY(20px)}
.js .reveal.in{opacity:1;transform:none;transition:opacity .85s var(--e),transform .85s var(--e)}
@media(prefers-reduced-motion:reduce){
  .js .reveal,.js .reveal.in{opacity:1;transform:none;transition:none}
  *{transition:none!important;animation:none!important}
}
:focus-visible{outline:2px solid var(--ink);outline-offset:3px}

/* ---- practice intro on the landing -------------------------------------
   The site opens with a position rather than a grid. One lead paragraph set
   large, then the argument underneath it. */
.intro{max-width:1500px;margin:0 auto;padding:clamp(46px,9vh,120px) var(--pad);display:grid;gap:clamp(18px,3vw,60px);border-bottom:1px solid var(--line)}
@media(min-width:900px){.intro{grid-template-columns:.4fr 1.6fr}}
.intro__body p{margin:0 0 1.15em;max-width:64ch;color:var(--ink2);font-size:clamp(15px,1.6vw,18px)}
.intro__lead{font-family:var(--s)!important;font-weight:300;font-size:clamp(21px,2.9vw,38px)!important;line-height:1.2;letter-spacing:-.018em;color:var(--ink)!important;max-width:24ch!important}
.case__mat{margin-top:1.6em!important;padding-top:1.1em;border-top:1px solid var(--line);font-size:12.5px!important;letter-spacing:.05em;color:var(--meta)!important;max-width:40ch!important}

/* ==========================================================================
   FILM. One film per row, quiet. The previous page put a video, three stills
   and a metadata block on every entry, seven times over, which read as noise.
   Now: the film, then who and when. Nothing else.
   ========================================================================== */
.films{max-width:1500px;margin:0 auto;padding:0 var(--pad) clamp(50px,9vh,110px);display:grid;gap:clamp(58px,11vh,150px)}
.film{margin:0}
.film__stage{position:relative;overflow:hidden;background:var(--warm);margin-inline:auto;width:100%}
.film--wide .film__stage{aspect-ratio:16/9}
.film--fourthree .film__stage{aspect-ratio:4/3;max-width:min(1040px,100%)}
.film--vertical .film__stage{aspect-ratio:9/16;max-width:min(470px,80vw)}
.film__stage video{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;background:#000}
.film__poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:1;transition:opacity .5s var(--e)}
.film__stage.is-playing .film__poster{opacity:0;pointer-events:none}
.film__play{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2;width:70px;height:70px;border-radius:50%;
  border:0;padding:0;cursor:pointer;display:flex;align-items:center;justify-content:center;
  background:rgba(252,252,251,.94);color:var(--ink);box-shadow:0 8px 34px rgba(15,14,14,.2);
  transition:transform .4s var(--e),opacity .4s var(--e)}
.film__play:hover{transform:translate(-50%,-50%) scale(1.08)}
.film__play svg{width:21px;height:21px;transform:translateX(2px)}
.film__stage.is-playing .film__play{opacity:0;pointer-events:none}

.film__meta{display:grid;gap:10px 30px;margin-top:20px;align-items:start}
@media(min-width:820px){.film__meta{grid-template-columns:44px 1fr 200px}}
.film__n{font-size:11px;letter-spacing:.14em;color:var(--meta);font-variant-numeric:tabular-nums;padding-top:6px}
.film__t{font-family:var(--s);font-weight:300;font-size:clamp(23px,3.2vw,42px);line-height:1.04;letter-spacing:-.02em}
.film__sub{margin:4px 0 0;font-size:12px;letter-spacing:.12em;text-transform:uppercase;color:var(--meta)}
.film__note{margin:12px 0 0;color:var(--ink2);max-width:52ch;font-size:15px}
.film__side{display:flex;flex-direction:column;gap:5px;font-size:11.5px;letter-spacing:.06em;color:var(--meta)}
@media(max-width:819px){.film__side{flex-direction:row;flex-wrap:wrap;gap:6px 18px;margin-top:8px}}

/* ---- menu counts -------------------------------------------------------- */
.nav__links sup{font-size:9px;margin-left:3px;color:var(--meta);vertical-align:super;font-variant-numeric:tabular-nums}

/* ---- footer as a closing, not a link strip ----------------------------- */
.foot__top{padding-bottom:clamp(30px,5vh,60px)}
.foot__line{margin:14px 0 0;font-size:13px;color:var(--meta)}
.foot__cols{display:grid;gap:26px 40px;padding:clamp(26px,4vh,48px) 0;border-top:1px solid var(--line)}
@media(min-width:700px){.foot__cols{grid-template-columns:repeat(3,1fr)}}
.foot__cols div{display:flex;flex-direction:column;gap:6px}
.foot__k{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--meta);margin-bottom:5px}
.foot__cols a,.foot__cols span:not(.foot__k){font-size:13.5px;color:var(--ink2);transition:color .25s}
.foot__cols a:hover{color:var(--ink)}
.foot__meta{border-top:1px solid var(--line);padding-top:18px}

/* ==========================================================================
   MOTION, and it is part of the story rather than decoration.
   The work is about things being uncovered: cast, pressed, pulled apart. So
   images arrive by clip-path wipe, as if being revealed from under something,
   instead of fading in. Everything else stays still.
   ========================================================================== */
.js .plate img,.js .fcase__img img,.js .tile__img img,.js .hero__plate img,.js .case__hero img{
  clip-path:inset(0 0 100% 0);transform:scale(1.06);
}
.js .plate.in img,.js .fcase.in .fcase__img img,.js .tile.in .tile__img img,
.js .hero__plate.in img,.js .case__hero.in img{
  clip-path:inset(0 0 0 0);transform:scale(1);
  transition:clip-path 1.15s var(--e),transform 1.5s var(--e);
}
/* scroll progress: a single hairline, so you always know where you are in a case */
.prog{position:fixed;top:0;left:0;height:2px;width:100%;transform:scaleX(0);transform-origin:0 50%;
  background:var(--ink);z-index:90;pointer-events:none}
@media(prefers-reduced-motion:reduce){
  .js .plate img,.js .fcase__img img,.js .tile__img img,.js .hero__plate img,.js .case__hero img{
    clip-path:none;transform:none}
  .prog{display:none}
}
