/* Layout: one white gallery wall seen from across the room. All works hang in a line (or salon rows on narrow screens); clicking one walks the camera up to it. 1 world px = 1 cm. */
:root{
  --r:12px;
  --r-s:10px;
  --wall:#eae8e4;
  --ink:#171615;
  --muted:#75716b;
  --accent:#5e1527;
  --panel:#280a14;
  --panel-ink:#f2e6d4;
  --panel-muted:#b08f9a;
  --panel-dim:#80596a;
  --panel-line:#4d1f2e;
  --display:"Big Shoulders Display","Arial Narrow","Roboto Condensed",sans-serif;
  --text:"Instrument Sans",system-ui,-apple-system,"Segoe UI",sans-serif;
  color-scheme:light;
}
html{height:100%}
html,body{background:var(--wall);color:var(--ink)}
body{margin:0;padding:0;font-family:var(--text);font-size:15px;line-height:1.5;-webkit-font-smoothing:antialiased;overflow:hidden;height:100%}
img{max-width:100%}
[hidden]:not([hidden=until-found i]){display:none!important}
button{font:inherit;color:inherit}
:focus-visible{outline:2px solid var(--accent);outline-offset:3px}

/* ---------- wall, works ---------- */
/* overflow:clip (not hidden) so focusing an off-screen work can't scroll the wall out from under the camera.
   The plaster texture sits under a flat wash so it only reads as a faint grain; --ts/--tx/--ty follow the camera (set in exhibition.js). */
#hero{position:fixed;inset:0;overflow:hidden;overflow:clip;touch-action:pan-y;
  background-color:var(--wall);
  background-image:
    linear-gradient(to bottom,rgba(70,66,60,.34) 0%,rgba(70,66,60,.14) 14%,rgba(70,66,60,0) 40%),
    radial-gradient(130% 100% at 50% 60%,rgba(0,0,0,0) 55%,rgba(60,56,50,.14) 100%),
    linear-gradient(rgba(234,232,228,.9),rgba(234,232,228,.9)),
    url(../tex/plaster.jpg);
  background-size:100% 100%,100% 100%,100% 100%,var(--ts,520px) var(--ts,520px);
  background-position:0 0,0 0,0 0,var(--tx,0) var(--ty,0)}
#track{position:fixed;inset:0;overflow-x:auto;overflow-y:hidden;visibility:hidden;pointer-events:none;scrollbar-width:none}
#trackIn{height:1px}
#world{position:absolute;left:0;top:0;transform-origin:0 0}
/* spotlight wash on the wall above and around each work */
.pool{position:absolute;pointer-events:none;opacity:0;transition:opacity 1.2s ease;
  background:radial-gradient(ellipse 50% 50% at 50% 40%,rgba(255,255,255,.95),rgba(255,255,255,.55) 42%,rgba(255,255,255,0) 72%)}
body.lit .pool{opacity:1}
.work{position:absolute;padding:0;border:0;background:none;cursor:pointer}
#hero{cursor:grab;user-select:none;-webkit-user-select:none}
body.detail #hero{cursor:default}
body.dragging #hero,body.dragging .work{cursor:grabbing}
/* light falls from above, so shadows drop straight down */
.frame{position:absolute;inset:0;display:block;box-shadow:0 7px 12px rgba(30,26,20,.2),0 1.5px 2.5px rgba(30,26,20,.3)}
/* unframed deep canvas: it stands off the wall, so a longer shadow, a lit top edge and the shaded underside of the stretcher */
.frame.canvas{box-shadow:0 12px 18px rgba(30,26,20,.2),0 4px 5px rgba(30,26,20,.26),0 1px 1.5px rgba(30,26,20,.3)}
.frame.canvas::before{content:"";position:absolute;z-index:1;left:0;right:0;top:0;height:.5px;background:rgba(255,255,255,.4)}
.frame.canvas::after{content:"";position:absolute;left:0;right:0;top:100%;height:1.3px;background:linear-gradient(to bottom,#9d9992,#7f7b74)}
.frame.black{background:linear-gradient(to bottom,#2b2a29,#131212)}
.frame.oak{background:linear-gradient(to bottom,#d6b88f,#b99a70)}
.frame img{position:absolute;display:block;object-fit:cover}
.work,.pool{left:0;top:0}
.work .frame{transition:filter .6s ease,opacity .6s ease}
.work:hover .frame{filter:brightness(1.05)}
.work:focus-visible{outline:2px solid var(--accent);outline-offset:5px}


/* ---------- biography: the dark room past the right end of the wall; --bio runs 0 (wall) to 1 (arrived), set in exhibition.js ---------- */
#bio{--ink:var(--panel-ink);position:fixed;inset:0;pointer-events:none;color:var(--ink);display:grid;place-items:center;
  padding:calc(env(safe-area-inset-top,0px) + 84px) clamp(20px,6vw,96px) calc(env(safe-area-inset-bottom,0px) + 40px);box-sizing:border-box}
#bio::before{content:"";position:absolute;inset:0;background:radial-gradient(120% 100% at 50% 40%,#3a1220,var(--panel) 70%);opacity:var(--bio,0)}
#bio .in{position:relative;display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(28px,5vw,80px);align-items:center;width:100%;max-width:1120px;
  opacity:var(--bioc,0);transform:translateX(calc((1 - var(--bioc,0))*7vw))}
/* the portrait sits straight on the dark ground: no frame, border or shadow, and never cropped (a cut-out PNG works too) */
#bio .pic{aspect-ratio:4/5;max-height:64vh;justify-self:end;width:100%;max-width:420px;display:grid;place-items:center}
#bio .pic img{width:100%;height:100%;max-width:none;object-fit:contain;display:block}
#bio h1{font-family:var(--display);font-weight:900;text-transform:uppercase;font-size:clamp(48px,7.4vw,112px);line-height:.86;letter-spacing:.01em;margin:14px 0 18px;text-wrap:balance}
#bio .role{font-size:12px;letter-spacing:.16em;text-transform:uppercase;font-weight:600;color:#c29661;margin-bottom:22px}
#bio p{margin:0 0 14px;max-width:56ch;font-size:15px;line-height:1.6;color:#e2d2cb}
body.atbio .arrow{background:rgba(242,230,212,.08)}
body.atbio .arrow:hover{background:rgba(242,230,212,.18)}
body.atbio .arrow svg{stroke:var(--panel-ink)}

/* ---------- detail wall text (screen space, painted on the wall) ---------- */
#wtext{position:fixed;left:54vw;top:50%;translate:0 -50%;width:min(34vw,500px);opacity:0;transform:translateX(24px);transition:opacity .35s ease,transform .5s ease;pointer-events:none}
body.detail.settled #wtext{opacity:1;transform:none;pointer-events:auto}
body.detail .work:not(.here) .frame{opacity:.45}
#wtext h2{color:var(--accent);font-family:var(--display);font-weight:900;text-transform:uppercase;font-size:clamp(40px,4.6vw,76px);line-height:.86;margin:12px 0 14px;transform:rotate(-.6deg);transform-origin:left;text-wrap:balance}
#wtext .meta{font-size:12px;letter-spacing:.12em;text-transform:uppercase;font-weight:600;margin:0 0 14px}
#wtext p{margin:0 0 14px;font-size:15px;line-height:1.55;max-width:46ch;font-weight:500}
#wtext .cr{font-size:12px;color:var(--muted)}

#ui{position:fixed;inset:0;pointer-events:none}
.arrow{position:fixed;top:50%;width:48px;height:76px;margin-top:-38px;border:0;border-radius:var(--r);background:rgba(23,22,21,.06);cursor:pointer;display:grid;place-items:center;
  pointer-events:auto;transition:opacity .4s,background .2s}
.arrow:hover{background:rgba(23,22,21,.16)}
.arrow svg{width:22px;height:22px;stroke:var(--ink);fill:none;stroke-width:1.4}
.arrow[disabled]{opacity:0!important;pointer-events:none}
#prev{left:clamp(8px,1.2vw,16px)} #next{right:clamp(8px,1.2vw,16px)}
#back{position:fixed;left:clamp(16px,3vw,32px);top:calc(env(safe-area-inset-top,0px) + 18px);pointer-events:auto;opacity:0;visibility:hidden;transition:opacity .4s;
  border:1px solid rgba(23,22,21,.3);border-radius:var(--r-s);background:rgba(255,255,255,.55);padding:9px 16px;cursor:pointer;font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:600}
#back:hover{background:#fff}
body.detail #back{opacity:1;visibility:visible}
#count{position:fixed;right:clamp(16px,3vw,32px);top:calc(env(safe-area-inset-top,0px) + 26px);font-size:12px;letter-spacing:.16em;color:var(--muted);font-variant-numeric:tabular-nums;opacity:0;transition:opacity .4s}
body.detail #count{opacity:1}

/* ---------- below the wall: a dark room with photographs and films of the works, contact and the footer ---------- */
/* the wheel walks the wall, so going down is a deliberate step: #down slides this room up over the wall (body.below, see exhibition.js) */
#down{position:fixed;left:50%;bottom:calc(env(safe-area-inset-bottom,0px) + 22px);transform:translateX(-50%);pointer-events:auto;display:flex;align-items:center;gap:8px;
  border:1px solid rgba(23,22,21,.3);border-radius:var(--r-s);background:rgba(255,255,255,.55);padding:9px 12px 9px 16px;cursor:pointer;font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:600;
  transition:opacity .4s,visibility .4s,background .2s,color .4s,border-color .4s}
#down:hover{background:#fff}
#down svg{width:14px;height:14px;stroke:currentColor;fill:none;stroke-width:1.6;transition:transform .35s cubic-bezier(.2,.7,.2,1)}
#down:hover svg{transform:translateY(2px)}
body.detail #down{opacity:0;visibility:hidden}
body.atbio #down{color:var(--panel-ink);border-color:rgba(242,230,212,.3);background:rgba(242,230,212,.08)}
body.atbio #down:hover{background:rgba(242,230,212,.18)}
#hero,#bio{transition:transform .9s cubic-bezier(.7,0,.2,1)}
body.below #hero,body.below #bio{transform:translateY(-22vh)}
#below{--ink:var(--panel-ink);--accent:var(--panel-ink);position:fixed;inset:0;z-index:20;background:#121110;color:var(--ink);
  transform:translateY(100%);visibility:hidden;transition:transform .9s cubic-bezier(.7,0,.2,1),visibility 0s .9s}
body.below #below{transform:none;visibility:visible;transition-delay:0s}
#belowScroll{position:absolute;inset:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column}
#up{position:absolute;z-index:1;left:clamp(16px,3vw,32px);top:calc(env(safe-area-inset-top,0px) + 18px);
  border:1px solid rgba(242,230,212,.3);border-radius:var(--r-s);background:#121110;padding:9px 16px;cursor:pointer;font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:600;transition:border-color .25s ease}
#up:hover{border-color:var(--ink)}
#below .in{box-sizing:border-box;width:100%;max-width:1216px;margin:0 auto;padding:calc(env(safe-area-inset-top,0px) + 120px) clamp(20px,4vw,48px) clamp(64px,10vh,120px)}
#below h2{font-family:var(--display);font-weight:900;text-transform:uppercase;font-size:clamp(48px,7.4vw,112px);line-height:.86;letter-spacing:.01em;margin:0 0 18px}
#below header p{margin:0 0 clamp(32px,6vh,64px);max-width:56ch;color:#b9b2a8}
/* photographs and films mixed, each at its own proportions, packed into columns; a slot with no file yet is drawn at --ar */
#vids{--gap:clamp(12px,2vw,28px);columns:3;column-gap:var(--gap)}
.vid{margin:0 0 var(--gap);break-inside:avoid}
.vid img,.vid video,.vid .ph{display:block;width:100%;border-radius:var(--r);background:#1b1a18}
.vid img,.vid video{height:auto;max-width:none}
.vid .ph{aspect-ratio:var(--ar,4/5)}
.vid .ph{box-sizing:border-box;border:1px dashed rgba(242,230,212,.16);display:grid;place-items:center}
.vid .ph svg{width:28px;height:28px;fill:rgba(242,230,212,.22)}
.vid .ph svg.im{fill:none;stroke:rgba(242,230,212,.22);stroke-width:1.4}
.vid figcaption{display:flex;gap:12px;align-items:baseline;margin-top:10px;font-size:13px;color:#e2d2cb}
.vid figcaption span{font-variant-numeric:tabular-nums;font-size:11px;letter-spacing:.1em;color:#7d776f}
#contact{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(24px,5vw,80px);align-items:start;padding-top:0}
#contact h2{font-size:clamp(40px,5.4vw,84px);margin:0;text-wrap:balance}
#contact p{margin:0 0 14px;max-width:56ch;color:#e2d2cb}
#contact .mail{display:flex;gap:14px;align-items:center;flex-wrap:wrap;font-size:clamp(18px,2vw,24px)}
#contact .mail a{color:var(--ink);text-decoration:none;border-bottom:1px solid rgba(242,230,212,.3)}
#contact .mail a:hover{border-color:var(--ink)}
#copy{border:1px solid rgba(242,230,212,.3);border-radius:var(--r-s);background:none;padding:8px 14px;cursor:pointer;font-size:11px;letter-spacing:.16em;text-transform:uppercase;transition:border-color .25s ease}
#copy:hover{border-color:var(--ink)}
#contact .note{margin:22px 0 0;font-size:13px;color:#7d776f}
/* footer skyline: full width, cropped from the sides (and the sky) rather than squeezed */
#sky{display:block;flex:none;width:100%;height:clamp(220px,26.25vw,420px)}
#foot{margin-top:auto;border-top:1px solid rgba(242,230,212,.12);padding:clamp(36px,6vh,64px) clamp(20px,4vw,48px) calc(env(safe-area-inset-bottom,0px) + 24px)}
#foot .top,#foot .end{box-sizing:border-box;max-width:1120px;margin:0 auto}
#foot .top{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);gap:28px;align-items:start}
#foot .name{font-family:var(--display);font-weight:900;text-transform:uppercase;font-size:clamp(36px,4.6vw,64px);line-height:.9}
#foot .role{margin-top:12px;font-size:12px;letter-spacing:.16em;text-transform:uppercase;font-weight:600;color:#c29661}
#foot .col{font-size:13px;line-height:1.9;color:#b9b2a8}
#foot .col a{display:block;color:inherit;text-decoration:none}
#foot .col a:hover,#foot button:hover{color:var(--ink)}
#foot button{border:0;background:none;padding:0;cursor:pointer;color:inherit}
#fContact{margin-top:10px;color:var(--ink)!important}
#foot .end{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-top:clamp(36px,6vh,64px);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:#7d776f}
#foot .end button{letter-spacing:inherit;text-transform:inherit}

/* ---------- top nav: a small black bar that unfolds into the menu ---------- */
/* the nav stays dark; inside it --ink is the light panel ink */
#scrim{position:fixed;inset:0;z-index:28;background:rgba(18,17,16,.45);opacity:0;pointer-events:none;transition:opacity .5s ease}
body.menu #scrim{opacity:1;pointer-events:auto}
#nav{--ink:var(--panel-ink);--accent:var(--panel-ink)}
#nav{--open-w:min(340px,calc(100vw - 32px));position:fixed;z-index:30;left:50%;top:calc(env(safe-area-inset-top,0px) + 14px);transform:translateX(-50%);
  display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--ink);pointer-events:none}
#nav .shell{pointer-events:auto;box-sizing:border-box;width:232px;background:var(--panel);border:1px solid rgba(255,255,255,.1);border-radius:var(--r);overflow:hidden;
  box-shadow:0 10px 30px rgba(20,18,16,.22);transition:width .6s cubic-bezier(.7,0,.2,1)}
body.menu #nav .shell{width:var(--open-w)}
#menuBtn{display:grid;grid-template-columns:24px 1fr 24px;align-items:center;width:100%;height:42px;padding:0 12px;border:0;background:none;cursor:pointer;
  font-size:10px;letter-spacing:.26em;text-transform:uppercase;font-weight:600;transition:height .6s cubic-bezier(.7,0,.2,1),opacity .25s ease}
#menuBtn svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.3}
#menuBtn .tg{justify-self:end}
#menuBtn .tg path{transition:transform .35s cubic-bezier(.2,.7,.2,1)}
#menuBtn:hover .tg path:first-child{transform:translateY(-1.5px)}
#menuBtn:hover .tg path:last-child{transform:translateY(1.5px)}
body.menu #menuBtn{height:0;opacity:0;pointer-events:none}
#nav .fold{display:grid;grid-template-rows:0fr;transition:grid-template-rows .6s cubic-bezier(.7,0,.2,1)}
body.menu #nav .fold{grid-template-rows:1fr}
#menu{min-height:0;overflow:hidden;visibility:hidden;transition:visibility 0s .6s}
body.menu #menu{visibility:visible;transition-delay:0s}
/* fixed at the open width so the content doesn't reflow while the shell grows around it */
#menu .in{box-sizing:border-box;width:calc(var(--open-w) - 2px);max-height:calc(100vh - 110px);overflow-y:auto;padding:18px 20px 20px}
/* hover: the label turns over about its horizontal axis, like a bar with the same word on its underside */
.roll{perspective:520px}
.roll .r{display:inline-block;position:relative;line-height:1.2;transform-style:preserve-3d;transform-origin:50% 50% -.6em;backface-visibility:hidden;
  transition:transform .55s cubic-bezier(.3,.7,.2,1)}
.roll .r::after{content:attr(data-t);position:absolute;left:0;top:100%;white-space:nowrap;color:#d9b27c;transform-origin:50% 0;transform:rotateX(-90deg);backface-visibility:hidden}
.roll:hover .r,.roll:focus-visible .r,#menuBtn:hover .r,#menuBtn:focus-visible .r{transform:rotateX(90deg)}
#menu nav{display:flex;flex-direction:column;align-items:flex-start;margin:4px 0 26px}
.mi{border:0;background:none;cursor:pointer;padding:0;text-align:left;font-size:23px;line-height:1.2;font-weight:500;letter-spacing:-.01em;
  opacity:0;transform:translateY(8px);transition:opacity .25s ease,transform .25s ease,color .25s ease}
body.menu .mi{opacity:1;transform:none;transition:opacity .5s ease var(--d),transform .6s cubic-bezier(.2,.7,.2,1) var(--d),color .25s ease}
#menu nav:hover .mi:not(:hover){color:var(--panel-dim)}
#menu .search{display:flex;align-items:center;gap:10px;border-bottom:1px solid var(--panel-line);padding-bottom:9px}
#menu .search svg{width:14px;height:14px;stroke:var(--panel-muted);fill:none;stroke-width:1.6;flex:none}
#menu .search input{flex:1;min-width:0;background:none;border:0;color:var(--ink);font:inherit;font-size:13px;letter-spacing:.04em;outline:none}
#menu .search input::placeholder{color:var(--panel-dim)}
#results{list-style:none;margin:6px 0 0;padding:0;max-height:0;overflow:hidden;transition:max-height .45s ease}
#results.open{max-height:34vh;overflow-y:auto}
#results button{width:100%;text-align:left;border:0;background:none;cursor:pointer;display:flex;gap:12px;align-items:baseline;padding:6px 0;font-size:13px;color:#e2d2cb}
#results button span{font-variant-numeric:tabular-nums;font-size:11px;color:var(--panel-dim);letter-spacing:.1em;flex:none;width:22px}
#results button:hover{color:var(--ink)}
#results .none{font-size:13px;color:var(--panel-dim);padding:8px 0}
#menu .info{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:22px;font-size:11px;line-height:1.65;color:var(--panel-muted)}
#menu .info a{display:block;color:inherit;text-decoration:none}
#menu .info a:hover{color:var(--ink)}
#menu .info b{color:var(--ink);font-weight:600}
#menu .cta{display:flex;justify-content:center;align-items:center;gap:10px;width:100%;height:38px;margin-top:20px;border:1px solid var(--panel-line);border-radius:var(--r-s);background:none;cursor:pointer;
  font-size:10px;letter-spacing:.24em;text-transform:uppercase;font-weight:600;transition:border-color .25s ease}
#menu .cta:hover{border-color:var(--ink)}
#menuClose{width:36px;height:36px;border:1px solid rgba(255,255,255,.1);border-radius:var(--r-s);background:var(--panel);cursor:pointer;display:grid;place-items:center;
  opacity:0;visibility:hidden;transform:translateY(-8px);transition:opacity .25s ease,transform .3s ease,visibility 0s .3s}
#menuClose svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:1.5;transition:transform .4s ease}
#menuClose:hover svg{transform:rotate(90deg)}
body.menu #menuClose{opacity:1;visibility:visible;transform:none;pointer-events:auto;transition:opacity .35s ease .4s,transform .5s cubic-bezier(.2,.7,.2,1) .4s,visibility 0s}

@media (max-width:700px){
  #back{top:calc(env(safe-area-inset-top,0px) + 66px)}
  #nav .shell{width:184px}
  #wtext{left:18px;right:18px;width:auto;top:var(--wtop,50vh);translate:none;max-height:calc(100vh - var(--wtop,50vh) - 18px);overflow-y:auto}
  #wtext h2{font-size:38px;margin:8px 0 10px}
  #wtext p{font-size:14px}
  .arrow{top:30vh;height:56px;width:40px;margin-top:-28px}
  #up{top:calc(env(safe-area-inset-top,0px) + 66px)}
  #below .in{padding-top:calc(env(safe-area-inset-top,0px) + 132px)}
  #vids{columns:2}
  #contact{grid-template-columns:1fr}
  #foot .top{grid-template-columns:1fr 1fr}
  #foot .who{grid-column:1/-1}
  #bio{place-items:start center}
  #bio .in{grid-template-columns:1fr;gap:22px}
  #bio .pic{justify-self:start;max-height:32vh;width:auto;height:32vh}
  #bio p{font-size:14px}
  #bio p + p{display:none}
}
