/* ════════════════════════════════════════════════════════════════════════
   NAGUIB — THE WORKSHOP
   A bench under a warm lamp. Charcoal ground, burnt clay, bone type, and a
   plaster tooth over everything.

   The story is the design, not a section of it: he began on walls in Giza
   with a brush and ended up sculpting for film in Marseille, so the site is
   a workshop rather than an interface — objects sit on a bench in their own
   pool of shade, the light comes from one place, and the type is cut rather
   than set.

   Everything that moves here moves on transform or opacity, gated by an
   IntersectionObserver. There is no library.
   ════════════════════════════════════════════════════════════════════════ */

:root{
  /* ── the bench ── */
  --ground:#17140F;      /* warm charcoal, the wall behind the bench       */
  --ground-2:#12100B;    /* deeper, for wells and the lightbox             */
  --panel:#221D16;       /* a surface laid on the bench                    */
  --panel-2:#2A231A;     /* raised                                         */
  --line:#3A3025;        /* a scored line                                  */
  --line-soft:#2B2419;

  /* ── the light ── */
  --clay:#C8794A;        /* burnt clay: the accent, used sparingly         */
  --clay-lit:#E0925F;    /* the same clay with the lamp on it              */
  --clay-deep:#8A5233;
  --sand:#D8C4A8;        /* warm highlight                                 */

  /* ── the ink ── */
  --ink:#EDE6DA;         /* bone                                           */
  --ink-2:#B4A895;
  --ink-3:#7D7263;
  --ink-4:#544C41;

  --fd:'Fraunces',Georgia,'IBM Plex Sans Arabic',serif;      /* cut       */
  --fs:'Inter','IBM Plex Sans Arabic',system-ui,sans-serif;   /* set       */
  --fa:'IBM Plex Sans Arabic',sans-serif;

  --ease:cubic-bezier(.22,1,.36,1);
  --ease-soft:cubic-bezier(.4,0,.2,1);
  --pad:clamp(20px,5vw,84px);
  --max:1560px;
}

*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%;overflow-y:scroll;scroll-behavior:auto}
body{
  background:var(--ground);color:var(--ink);
  font-family:var(--fs);font-size:16px;line-height:1.65;
  font-feature-settings:'kern' 1,'liga' 1;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit;background:none;border:0}
::selection{background:var(--clay);color:#14110C}

/* ── THE PLASTER TOOTH ────────────────────────────────────────────────
   One fixed layer of fractal noise over the whole page. It is a static SVG
   in a data URI — it paints once and never repaints, so it costs nothing
   after the first frame, and it is the single thing that stops a flat dark
   background from looking like a flat dark background. */
body::before{
  content:'';position:fixed;inset:0;z-index:9998;pointer-events:none;
  opacity:.5;mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)' opacity='.42'/%3E%3C/svg%3E");
}
/* and one warm lamp, up and to the left, on the page itself */
body::after{
  content:'';position:fixed;inset:0;z-index:-1;pointer-events:none;
  background:radial-gradient(120% 85% at 12% -10%,rgba(200,121,74,.10),transparent 62%);
}

/* ═══ TYPE ══════════════════════════════════════════════════════════════
   Fraunces is a variable serif with a SOFT axis — it is literally a face
   that can be modelled, which is the whole reason it is here. It carries
   every name and every heading. Inter carries everything you read rather
   than look at. Nothing is set in a monospace: a workshop is not a
   terminal.                                                             */
.d1,.d2,.d3{
  font-family:var(--fd);font-weight:300;line-height:.96;
  letter-spacing:-.022em;font-variation-settings:'SOFT' 40,'WONK' 1,'opsz' 144;
}
.d1{font-size:clamp(46px,7.6vw,132px)}
.d2{font-size:clamp(38px,5.6vw,86px)}
.d3{font-size:clamp(26px,3vw,44px)}
.d1 em,.d2 em,.d3 em{font-style:italic;color:var(--clay-lit);font-weight:300}

/* the small capital label that marks every section and field */
.lbl{
  font-size:11px;font-weight:500;letter-spacing:.22em;text-transform:uppercase;
  color:var(--ink-3);display:flex;align-items:center;gap:10px;
}
.lbl::before{content:'';width:22px;height:1px;background:var(--clay);flex:none}
.lbl.plain::before{display:none}
.num{font-family:var(--fd);font-variant-numeric:tabular-nums;color:var(--clay);
  font-size:13px;letter-spacing:.1em;font-weight:400}
p{max-width:66ch;color:var(--ink-2)}
p strong{color:var(--ink);font-weight:600}
.ar{font-family:var(--fa);direction:rtl}

/* ═══ MOTION ════════════════════════════════════════════════════════════
   Three primitives, and the whole site is built from them. Each is a
   transform or an opacity, each waits for an IntersectionObserver, and
   each takes its delay from a custom property so a group can be staggered
   without a line of JavaScript per child.

     .rv      rises and fades in
     .rv-cut  is uncovered from below, the way a form comes out of a block
     .rv-w    grows from nothing along its own width — for rules
                                                                        */
.rv,.rv-cut,.rv-w{--d:0ms}
.rv{opacity:0;transform:translate3d(0,26px,0);
  transition:opacity .9s var(--ease) var(--d),transform .9s var(--ease) var(--d)}
.rv.in{opacity:1;transform:none}
/* The uncovered state used to end on inset(0 0 -4% 0). A negative inset is
   not a value Chrome accepts, so the whole declaration was dropped and the
   heading simply stayed clipped — every section title on the site was
   invisible. It ends on a real inset(0) now, and the padding/negative-margin
   pair gives the box room for the descenders that a .96 line-height pushes
   past it, without moving anything. */
.rv-cut{clip-path:inset(0 0 102% 0);transform:translate3d(0,14px,0);
  padding-bottom:.16em;margin-bottom:-.16em;
  transition:clip-path 1.05s var(--ease) var(--d),transform 1.05s var(--ease) var(--d)}
.rv-cut.in{clip-path:inset(0);transform:none}
.rv-w{transform:scaleX(0);transform-origin:left;
  transition:transform 1.1s var(--ease) var(--d)}
.rv-w.in{transform:scaleX(1)}

@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;
    transition-duration:.001ms!important;scroll-behavior:auto!important}
  .rv,.rv-cut,.rv-w{opacity:1;transform:none;clip-path:none}
}

/* ═══ THE CURSOR ════════════════════════════════════════════════════════
   A warm point that opens into a ring over anything that can be looked at
   more closely. Desktop only, and it follows on transform alone. */
body.pointer{cursor:none}
#cur{position:fixed;top:0;left:0;z-index:9990;pointer-events:none;
  width:9px;height:9px;margin:-4.5px 0 0 -4.5px;border-radius:50%;
  background:var(--clay-lit);mix-blend-mode:screen;
  transition:width .3s var(--ease),height .3s var(--ease),margin .3s var(--ease),
             background .3s,opacity .3s;will-change:transform}
#cur.big{width:76px;height:76px;margin:-38px 0 0 -38px;background:rgba(200,121,74,.14);
  border:1px solid var(--clay-lit);mix-blend-mode:normal;
  backdrop-filter:blur(1px)}
#cur.big::after{content:attr(data-t);position:absolute;inset:0;display:grid;place-items:center;
  font-size:9.5px;letter-spacing:.2em;color:var(--ink);text-transform:uppercase}
#cur.hide{opacity:0}
body:not(.pointer) #cur{display:none}

/* ═══ THE LOADER ════════════════════════════════════════════════════════
   A turntable. The mark turns once while the fonts decode and the first
   plate arrives, the name is cut in beneath it, and the screen lifts. It
   waits for real milestones, not a timer. */
#ldr{position:fixed;inset:0;z-index:9999;background:var(--ground);
  display:grid;place-items:center;transition:opacity .7s var(--ease),visibility .7s}
#ldr.out{opacity:0;visibility:hidden}
.ld-in{display:flex;flex-direction:column;align-items:center;gap:26px}
.ld-mark{width:66px;height:66px;position:relative}
.ld-mark svg{width:100%;height:100%;overflow:visible}
.ld-ring{fill:none;stroke:var(--line);stroke-width:1.5}
.ld-arc{fill:none;stroke:var(--clay);stroke-width:1.5;stroke-linecap:round;
  stroke-dasharray:0 999;transition:stroke-dasharray .5s var(--ease-soft);
  transform-origin:50% 50%;transform:rotate(-90deg)}
.ld-dot{fill:var(--clay);transform-origin:50% 50%;animation:ldSpin 2.6s linear infinite}
@keyframes ldSpin{to{transform:rotate(360deg)}}
.ld-name{font-family:var(--fd);font-weight:300;font-size:26px;letter-spacing:.16em;
  color:var(--ink);text-transform:uppercase;opacity:0;animation:ldIn .9s var(--ease) .25s forwards}
.ld-name b{font-weight:300;color:var(--clay)}
@keyframes ldIn{to{opacity:1}}
.ld-say{font-size:10px;letter-spacing:.22em;text-transform:uppercase;color:var(--ink-4)}

/* ═══ NAV ═══════════════════════════════════════════════════════════════
   Scoped to the id, not to the element. A bare `nav {position:fixed}` also
   claimed the prev/next block on a project page — which is a <nav>, and was
   duly pinned across the top of the window on top of the real one. */
#nav{position:fixed;top:0;left:0;right:0;z-index:900;
  display:flex;align-items:center;justify-content:space-between;gap:20px;
  padding:18px var(--pad);
  transition:background .45s var(--ease-soft),border-color .45s,padding .45s var(--ease-soft);
  border-bottom:1px solid transparent}
#nav.stuck{background:rgba(20,17,12,.82);backdrop-filter:blur(14px) saturate(1.2);
  border-bottom-color:var(--line-soft);padding-top:12px;padding-bottom:12px}
.n-logo{display:flex;align-items:center;gap:12px;flex:none}
.n-mark{width:26px;height:26px;flex:none}
.n-mark circle.r{fill:none;stroke:var(--clay);stroke-width:1.4}
.n-mark circle.d{fill:var(--clay);transition:transform .7s var(--ease)}
.n-logo:hover .n-mark circle.d{transform:translateY(-2px)}
.n-name{font-family:var(--fd);font-weight:300;font-size:17px;letter-spacing:.1em;
  text-transform:uppercase;white-space:nowrap}
.n-name b{font-weight:300;color:var(--clay)}
.n-links{display:flex;gap:4px;list-style:none}
.n-links a{position:relative;display:block;padding:8px 13px;font-size:12.5px;
  letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3);
  transition:color .3s}
.n-links a::after{content:'';position:absolute;left:13px;right:13px;bottom:4px;height:1px;
  background:var(--clay);transform:scaleX(0);transform-origin:right;
  transition:transform .45s var(--ease)}
.n-links a:hover,.n-links a.on{color:var(--ink)}
.n-links a:hover::after,.n-links a.on::after{transform:scaleX(1);transform-origin:left}
.n-right{display:flex;align-items:center;gap:16px;flex:none}
.n-open{display:inline-flex;align-items:center;gap:8px;font-size:11px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--ink-3);white-space:nowrap}
.n-open i{width:6px;height:6px;border-radius:50%;background:var(--clay-lit);
  box-shadow:0 0 0 0 rgba(224,146,95,.5);animation:pulse 3s var(--ease-soft) infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(224,146,95,.45)}70%,100%{box-shadow:0 0 0 9px rgba(224,146,95,0)}}
.n-cta{position:relative;overflow:hidden;padding:9px 18px;border:1px solid var(--clay);
  color:var(--clay-lit);font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;
  transition:color .4s var(--ease)}
.n-cta::before{content:'';position:absolute;inset:0;background:var(--clay);
  transform:translateY(101%);transition:transform .5s var(--ease);z-index:-1}
.n-cta:hover{color:#17140F}
.n-cta:hover::before{transform:none}
.n-cta span{position:relative;z-index:1}
@media(max-width:1080px){.n-links,.n-open{display:none}}

/* the phone dock */
#dock{display:none}
@media(max-width:820px){
  #dock{display:grid;grid-template-columns:repeat(5,1fr);position:fixed;bottom:0;left:0;right:0;
    z-index:900;background:rgba(18,16,11,.94);backdrop-filter:blur(14px);
    border-top:1px solid var(--line-soft);padding-bottom:env(safe-area-inset-bottom)}
  #dock a{display:flex;flex-direction:column;align-items:center;gap:5px;padding:11px 4px 10px;
    font-size:8.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-4);
    transition:color .3s}
  #dock a.on{color:var(--clay-lit)}
  #dock svg{width:19px;height:19px}
}

/* ═══ ICONS ═════════════════════════════════════════════════════════════
   One set, drawn for this site: a chisel, a ball of clay, a cage of
   wireframe, an unfolded UV net, a brush, a lamp, calipers, a sketchbook.
   All are single-stroke line drawings on a 24 grid so they sit at the same
   optical weight as the type, and every one of them animates on hover from
   its own logic rather than by spinning.                                */
.ic{width:24px;height:24px;flex:none;fill:none;stroke:currentColor;
  stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round;overflow:visible}
.ic *{transition:transform .55s var(--ease),opacity .45s var(--ease),
       stroke-dashoffset .8s var(--ease)}
/* the moving parts each icon offers when its card is hovered */
.ic .spin{transform-origin:12px 12px}
:hover>.ic .spin,:hover .ic .spin{transform:rotate(45deg)}
.ic .lift{transform-origin:12px 12px}
:hover>.ic .lift,:hover .ic .lift{transform:translateY(-2.2px)}
.ic .draw{stroke-dasharray:60;stroke-dashoffset:60}
:hover>.ic .draw,:hover .ic .draw{stroke-dashoffset:0}
.ic .glow{opacity:.35}
:hover>.ic .glow,:hover .ic .glow{opacity:1}

/* ═══ SHELL ═════════════════════════════════════════════════════════════ */
section{position:relative}
.wrap{max-width:var(--max);margin:0 auto;padding:0 var(--pad)}
.sec{padding:clamp(90px,13vh,170px) 0}
.sec-head{display:flex;align-items:flex-end;justify-content:space-between;
  gap:32px;flex-wrap:wrap;margin-bottom:clamp(40px,6vw,76px)}
.sec-head .lbl{margin-bottom:20px}
.rule{height:1px;background:var(--line);width:100%}
.count{font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-4);
  text-align:right}
.count b{color:var(--clay);font-weight:500}

/* ═══ HERO ══════════════════════════════════════════════════════════════ */
#hero{min-height:100svh;display:flex;align-items:center;position:relative;overflow:hidden;
  padding:104px 0 44px}
/* the lamp on the wall behind the object */
.h-lamp{position:absolute;top:-22%;right:6%;width:min(58vw,760px);aspect-ratio:1;
  background:radial-gradient(circle at 50% 50%,rgba(200,121,74,.16),transparent 62%);
  pointer-events:none;animation:breathe 11s var(--ease-soft) infinite}
@keyframes breathe{0%,100%{transform:scale(1);opacity:.85}50%{transform:scale(1.07);opacity:1}}
.h-grid{position:absolute;inset:0;pointer-events:none;opacity:.5;
  background-image:linear-gradient(rgba(200,121,74,.055) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(200,121,74,.055) 1px,transparent 1px);
  background-size:78px 78px;
  mask-image:radial-gradient(ellipse 70% 60% at 50% 45%,#000,transparent 78%)}
.h-in{position:relative;z-index:3;width:100%;max-width:var(--max);margin:0 auto;
  padding:0 var(--pad);display:grid;grid-template-columns:minmax(0,1fr) minmax(0,.82fr);
  gap:clamp(24px,4vw,64px);align-items:center}
.h-kicker{display:flex;align-items:center;gap:14px;margin-bottom:26px;font-size:11.5px;
  letter-spacing:.2em;text-transform:uppercase;color:var(--ink-3)}
.h-kicker i{width:34px;height:1px;background:var(--clay);display:block;flex:none}
.h-h1{margin-bottom:30px}
.h-h1 span{display:block;overflow:hidden}
.h-h1 span>b{display:block;font-weight:300;transform:translateY(104%);
  animation:cut 1.15s var(--ease) forwards}
.h-h1 span:nth-child(1)>b{animation-delay:.15s}
.h-h1 span:nth-child(2)>b{animation-delay:.28s}
.h-h1 span:nth-child(3)>b{animation-delay:.41s}
@keyframes cut{to{transform:none}}
.h-sub{font-size:clamp(15px,1.15vw,17.5px);max-width:44ch;margin-bottom:36px;color:var(--ink-2)}
.h-sub b{color:var(--ink);font-weight:600}
.h-acts{display:flex;gap:14px;flex-wrap:wrap;margin-bottom:6px}
.h-art{position:relative;justify-self:end;width:100%;max-width:640px}
/* The cover art is a crop, so its lower edge is a straight cut. It is faded
   into the bench rather than left to stop dead on a line. */
.h-art img{width:100%;height:auto;opacity:0;transform:translateY(30px) scale(.98);
  -webkit-mask-image:linear-gradient(180deg,#000 84%,transparent 99%);
  mask-image:linear-gradient(180deg,#000 84%,transparent 99%);
  filter:drop-shadow(0 42px 46px rgba(0,0,0,.6));
  transition:opacity 1.5s var(--ease) .1s,transform 1.9s var(--ease) .1s}
.h-art img.rdy{opacity:1;transform:none;animation:float 13s var(--ease-soft) 2s infinite}
@keyframes float{0%,100%{translate:0 0}50%{translate:0 -13px}}
/* the plinth: the object stands on something */
.h-art::after{content:'';position:absolute;left:8%;right:8%;bottom:-2px;height:34px;
  background:radial-gradient(ellipse 50% 50% at 50% 50%,rgba(0,0,0,.72),transparent 72%);
  filter:blur(7px)}
@media(max-width:960px){
  #hero{min-height:auto;padding:132px 0 40px}
  .h-in{grid-template-columns:1fr}
  .h-art{grid-row:1;max-width:420px;justify-self:center;margin-bottom:8px}
  .h-art img{filter:drop-shadow(0 26px 30px rgba(0,0,0,.55))}
}

/* buttons */
.btn{position:relative;display:inline-flex;align-items:center;gap:11px;
  padding:15px 26px;font-size:12px;letter-spacing:.16em;text-transform:uppercase;
  overflow:hidden;isolation:isolate;transition:color .45s var(--ease)}
.btn::before{content:'';position:absolute;inset:0;z-index:-1;transition:transform .55s var(--ease)}
.btn .ic{width:17px;height:17px}
.btn-a{background:var(--clay);color:#17140F;font-weight:600}
.btn-a::before{background:var(--clay-lit);transform:translateY(101%)}
.btn-a:hover::before{transform:none}
.btn-b{border:1px solid var(--line);color:var(--ink-2)}
.btn-b::before{background:var(--panel-2);transform:translateY(101%)}
.btn-b:hover{color:var(--ink);border-color:var(--clay-deep)}
.btn-b:hover::before{transform:none}

/* the line of the life, under the hero — the story as a rule, not a section */
/* The rule has to finish inside the first screen — it is the one line that
   says the whole arc of him, and a visitor who never scrolls should still
   get it. */
.h-life{grid-column:1/-1;margin-top:clamp(26px,4vh,48px);position:relative;
  display:flex;align-items:center;gap:0;padding-top:22px}
.h-life-rule{position:absolute;top:0;left:0;right:0;height:1px;background:var(--line)}
.h-life-fill{position:absolute;top:0;left:0;height:1px;background:var(--clay);
  transform-origin:left;transform:scaleX(0);transition:transform 2.4s var(--ease) .9s}
.h-life.in .h-life-fill{transform:scaleX(1)}
.h-life-item{flex:1;min-width:0;position:relative;padding-right:18px}
.h-life-item::before{content:'';position:absolute;top:-27px;left:0;width:7px;height:7px;
  border-radius:50%;background:var(--ground);border:1px solid var(--clay)}
.h-life-item:last-child::before{background:var(--clay)}
.h-life-y{font-family:var(--fd);font-size:15px;color:var(--clay);letter-spacing:.06em}
.h-life-t{font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-4);
  margin-top:2px}
@media(max-width:720px){
  .h-life{flex-wrap:wrap;gap:20px 0}
  .h-life-item{flex:0 0 50%}
}

/* ═══ THE BENCH — the marquee of what he does ═══════════════════════════ */
.bench{border-block:1px solid var(--line-soft);overflow:hidden;
  background:linear-gradient(180deg,rgba(0,0,0,.18),transparent)}
.bench-t{display:flex;width:max-content;animation:slide 46s linear infinite}
.bench:hover .bench-t{animation-play-state:paused}
@keyframes slide{to{transform:translateX(-50%)}}
.bench-i{display:flex;align-items:center;gap:20px;padding:17px 26px;font-family:var(--fd);
  font-size:clamp(15px,1.5vw,21px);font-weight:300;color:var(--ink-3);white-space:nowrap;
  letter-spacing:.02em}
.bench-i i{width:5px;height:5px;background:var(--clay);border-radius:50%;flex:none;opacity:.8}

/* ═══ THE WORK — plates, one object at a time ══════════════════════════
   A grid of tiles is how you show a hundred thumbnails. He has fifteen
   pieces worth looking at, so each one gets a plate: the render at the
   size it was made to be seen, and beside it the few facts that matter.
   They alternate sides so the eye is walked down the page rather than
   scanning columns.                                                      */
/* The plate number rides above its frame, so the first one needs room under
   the section heading or it lands in the middle of it. */
.plates{display:flex;flex-direction:column;gap:clamp(80px,11vw,168px);
  margin-top:clamp(26px,3.5vw,54px)}
.plate{display:grid;grid-template-columns:minmax(0,1.28fr) minmax(0,.72fr);
  gap:clamp(26px,4vw,72px);align-items:center}
/* The columns swap with the sides. Reordering alone put the render in the
   narrow column on every other plate, so half the work was shown at half
   the size — the one thing a plate exists to prevent. */
.plate:nth-child(even){grid-template-columns:minmax(0,.72fr) minmax(0,1.28fr)}
.plate:nth-child(even) .plate-art{order:2}
.plate-art{position:relative;cursor:pointer}
.plate-fr{position:relative;overflow:hidden;background:var(--ground-2);
  border:1px solid var(--line-soft);aspect-ratio:16/9}
.plate-fr img{width:100%;height:100%;object-fit:cover;
  transform:scale(1.045);transition:transform 1.5s var(--ease),filter .8s var(--ease)}
.plate-art:hover .plate-fr img{transform:scale(1.005)}
/* the lamp sweeps across the frame as it arrives */
.plate-fr::after{content:'';position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(105deg,transparent 30%,rgba(224,146,95,.14) 48%,transparent 66%);
  transform:translateX(-120%);transition:transform 1.4s var(--ease)}
.plate.in .plate-fr::after{transform:translateX(120%)}
/* the corner marks: a workshop measures things */
.plate-art::before,.plate-art::after{content:'';position:absolute;width:16px;height:16px;
  border:1px solid var(--clay);opacity:0;transition:opacity .5s var(--ease),transform .5s var(--ease)}
.plate-art::before{top:-7px;left:-7px;border-right:0;border-bottom:0;transform:translate(6px,6px)}
.plate-art::after{bottom:-7px;right:-7px;border-left:0;border-top:0;transform:translate(-6px,-6px)}
.plate-art:hover::before,.plate-art:hover::after{opacity:1;transform:none}
.plate-n{position:absolute;top:-1.1em;left:0;font-family:var(--fd);font-weight:300;
  font-size:clamp(48px,6vw,96px);line-height:1;color:transparent;
  -webkit-text-stroke:1px var(--line);z-index:2;pointer-events:none;
  transition:-webkit-text-stroke-color .6s var(--ease)}
.plate-art:hover .plate-n{-webkit-text-stroke-color:var(--clay-deep)}
.plate-body{min-width:0}
.plate-cat{margin-bottom:16px}
.plate-t{font-family:var(--fd);font-weight:300;font-size:clamp(28px,3.3vw,52px);
  line-height:1.03;letter-spacing:-.02em;margin-bottom:18px}
.plate-t a{background-image:linear-gradient(var(--clay),var(--clay));
  background-size:0 1px;background-repeat:no-repeat;background-position:0 100%;
  transition:background-size .55s var(--ease),color .35s}
.plate-t a:hover{color:var(--clay-lit);background-size:100% 1px}
.plate-desc{font-size:15px;margin-bottom:26px}
.plate-facts{display:flex;flex-wrap:wrap;gap:0 34px;border-top:1px solid var(--line-soft);
  padding-top:18px}
.plate-fact{padding:6px 0}
.plate-fact dt{font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-4);
  margin-bottom:3px}
.plate-fact dd{font-size:13.5px;color:var(--ink-2)}
.plate-go{margin-top:26px;display:inline-flex;align-items:center;gap:10px;font-size:11.5px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--clay-lit)}
.plate-go i{display:block;width:26px;height:1px;background:var(--clay);
  transition:width .45s var(--ease)}
.plate-go:hover i{width:44px}
/* ── A LEAD PLATE ──────────────────────────────────────────────────────
   `hi` on a piece makes it lead: the frame runs the full width of the
   column at 21:9 and the facts sit under it in two columns. Three of the
   fifteen carry it, which is enough to break the left-right rhythm without
   flattening it. */
.plate.lead{grid-template-columns:1fr;gap:clamp(20px,2.4vw,34px)}
.plate.lead .plate-fr{aspect-ratio:21/9}
.plate.lead .plate-body{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);
  gap:clamp(20px,3vw,54px);align-items:start}
.plate.lead .plate-cat{grid-column:1/-1}
.plate.lead .plate-t{grid-column:1/-1;max-width:16ch}
.plate.lead .plate-facts{border-top:0;padding-top:0}
.plate.lead .plate-go{grid-column:1/-1;margin-top:8px}
@media(max-width:900px){
  .plate.lead .plate-body{grid-template-columns:1fr}
  .plate.lead .plate-fr{aspect-ratio:16/9}
}

@media(max-width:900px){
  .plate{grid-template-columns:1fr;gap:22px}
  .plate:nth-child(even) .plate-art{order:0}
  .plate-n{font-size:44px;top:-.9em}
}

/* ═══ THE INDEX — everything, as a list ════════════════════════════════
   The plates are the argument; this is the evidence. A typographic list of
   every piece on the site, with the render following the pointer as a
   floating preview — a contact sheet you read rather than scroll.       */
.idx{border-top:1px solid var(--line-soft)}
.idx-row{position:relative;display:grid;width:100%;text-align:left;
  grid-template-columns:56px minmax(0,1fr) minmax(0,.5fr) 120px 30px;
  gap:20px;align-items:center;padding:19px 4px;border-bottom:1px solid var(--line-soft);
  transition:padding-left .5s var(--ease),color .4s}
.idx-row::before{content:'';position:absolute;inset:0 -14px;background:var(--panel);
  opacity:0;transition:opacity .4s var(--ease);z-index:-1}
.idx-row:hover{padding-left:22px}
.idx-row:hover::before{opacity:1}
.idx-n{font-family:var(--fd);font-size:12.5px;color:var(--ink-4);letter-spacing:.08em}
.idx-t{font-family:var(--fd);font-weight:300;font-size:clamp(17px,1.7vw,25px);
  line-height:1.2;transition:color .4s}
.idx-row:hover .idx-t{color:var(--clay-lit)}
.idx-p,.idx-s{font-size:12px;color:var(--ink-4);letter-spacing:.04em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.idx-go{color:var(--ink-4);transition:transform .45s var(--ease),color .4s;justify-self:end}
.idx-row:hover .idx-go{transform:translateX(5px);color:var(--clay)}
.idx-row .ic{width:17px;height:17px}
@media(max-width:900px){
  .idx-row{grid-template-columns:38px minmax(0,1fr) 26px;gap:12px;padding:15px 2px}
  .idx-p,.idx-s{display:none}
}
/* the preview that follows the pointer */
#peek{position:fixed;top:0;left:0;z-index:880;width:290px;aspect-ratio:16/9;
  pointer-events:none;opacity:0;transform:translate3d(0,0,0) scale(.94);
  transition:opacity .35s var(--ease),transform .5s var(--ease);
  border:1px solid var(--line);background:var(--ground-2);overflow:hidden;
  box-shadow:0 26px 50px rgba(0,0,0,.55);will-change:transform}
#peek.on{opacity:1}
#peek img{width:100%;height:100%;object-fit:cover}
@media(max-width:900px){#peek{display:none}}

/* ═══ ABOUT ═════════════════════════════════════════════════════════════ */
.ab{display:grid;grid-template-columns:minmax(0,.85fr) minmax(0,1.15fr);
  gap:clamp(30px,5vw,86px);align-items:start}
.ab-portrait{position:relative;max-width:400px}
.ab-portrait img{width:100%;filter:drop-shadow(0 26px 34px rgba(0,0,0,.5))}
.ab-portrait::after{content:'';position:absolute;left:14%;right:14%;bottom:2%;height:22px;
  background:radial-gradient(ellipse 50% 50% at 50% 50%,rgba(0,0,0,.6),transparent 70%);
  filter:blur(6px)}
.ab-quote{font-family:var(--fd);font-weight:300;font-style:italic;
  font-size:clamp(19px,2vw,29px);line-height:1.34;color:var(--ink);margin:30px 0 0;
  padding-left:22px;border-left:1px solid var(--clay);max-width:26ch}
.ab-lead{font-size:clamp(16px,1.35vw,19.5px);line-height:1.7;margin-bottom:26px}
.ab-cols{display:grid;grid-template-columns:1fr 1fr;gap:34px;margin-top:44px}
.cv-h{margin-bottom:18px}
.cv-item{padding:16px 0;border-top:1px solid var(--line-soft)}
.cv-item:last-child{border-bottom:1px solid var(--line-soft)}
.cv-y{font-family:var(--fd);font-size:12.5px;color:var(--clay);letter-spacing:.08em;
  margin-bottom:5px}
.cv-t{font-size:14.5px;color:var(--ink);line-height:1.4}
.cv-w{font-size:12.5px;color:var(--ink-4);margin-top:3px}
@media(max-width:900px){.ab,.ab-cols{grid-template-columns:1fr}
  .ab-portrait{max-width:280px}}

/* ═══ SKILLS — the bench of tools ══════════════════════════════════════ */
.skills{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));
  border-top:1px solid var(--line-soft);border-left:1px solid var(--line-soft)}
.skill{position:relative;padding:32px 26px 30px;border-right:1px solid var(--line-soft);
  border-bottom:1px solid var(--line-soft);overflow:hidden;
  transition:background .5s var(--ease)}
.skill::before{content:'';position:absolute;inset:auto 0 0 0;height:1px;background:var(--clay);
  transform:scaleX(0);transform-origin:left;transition:transform .6s var(--ease)}
.skill:hover{background:var(--panel)}
.skill:hover::before{transform:scaleX(1)}
.skill .ic{width:30px;height:30px;color:var(--clay);margin-bottom:22px}
.skill-n{font-family:var(--fd);font-weight:300;font-size:19px;line-height:1.2;margin-bottom:8px}
.skill-d{font-size:13px;color:var(--ink-4);line-height:1.55}
.skill-i{position:absolute;top:20px;right:22px;font-family:var(--fd);font-size:11.5px;
  color:var(--ink-4);opacity:.6}

/* ═══ PROCESS — clay to render ═════════════════════════════════════════
   Nine steps down a single line. The line fills as the section is read, so
   the page performs the pipeline it is describing rather than illustrating
   it with a widget.                                                      */
.proc{position:relative;display:grid;grid-template-columns:repeat(3,1fr);
  gap:1px;background:var(--line-soft);border:1px solid var(--line-soft)}
.step{position:relative;background:var(--ground);padding:34px 28px 32px;
  transition:background .55s var(--ease)}
.step:hover{background:var(--panel)}
.step-n{font-family:var(--fd);font-size:12px;color:var(--clay);letter-spacing:.12em;
  margin-bottom:20px;display:flex;align-items:center;gap:9px}
.step-n::after{content:'';flex:1;height:1px;background:var(--line-soft)}
.step .ic{width:27px;height:27px;color:var(--ink-3);margin-bottom:18px;
  transition:color .5s var(--ease)}
.step:hover .ic{color:var(--clay-lit)}
.step-t{font-family:var(--fd);font-weight:300;font-size:20px;margin-bottom:7px}
.step-d{font-size:12.5px;color:var(--ink-4);line-height:1.55}
/* the fill that follows the read */
.step::after{content:'';position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--clay);
  transform:scaleY(0);transform-origin:top;transition:transform .8s var(--ease)}
.step.lit::after{transform:scaleY(1)}
@media(max-width:900px){.proc{grid-template-columns:1fr 1fr}}
@media(max-width:560px){.proc{grid-template-columns:1fr}}

/* ═══ CONCEPT SHEETS ═══════════════════════════════════════════════════ */
.sheets{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
  gap:clamp(16px,2vw,30px)}
.sheet{position:relative;cursor:pointer}
.sheet-fr{position:relative;overflow:hidden;aspect-ratio:4/3;background:var(--ground-2);
  border:1px solid var(--line-soft)}
.sheet-fr img{width:100%;height:100%;object-fit:cover;transform:scale(1.03);
  transition:transform 1.2s var(--ease)}
.sheet:hover .sheet-fr img{transform:scale(1)}
.sheet-t{margin-top:14px;font-family:var(--fd);font-weight:300;font-size:16.5px;
  transition:color .4s}
.sheet:hover .sheet-t{color:var(--clay-lit)}
.sheet-n{font-size:10.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-4);
  margin-top:3px}

/* ═══ TOOLKIT ══════════════════════════════════════════════════════════ */
.tools{display:flex;flex-wrap:wrap;gap:10px}
.tool{display:inline-flex;align-items:center;gap:10px;padding:11px 17px;
  border:1px solid var(--line-soft);font-size:12.5px;color:var(--ink-2);
  transition:border-color .4s var(--ease),color .4s,transform .4s var(--ease)}
.tool:hover{border-color:var(--clay-deep);color:var(--ink);transform:translateY(-2px)}
.tool b{font-family:var(--fd);font-weight:400;font-size:11px;color:var(--clay);
  letter-spacing:.1em}

/* ═══ CONTACT ══════════════════════════════════════════════════════════ */
#contact{border-top:1px solid var(--line-soft);
  background:linear-gradient(180deg,rgba(200,121,74,.045),transparent 46%)}
.c-h{margin-bottom:44px}
.c-grid{display:grid;grid-template-columns:1fr 1fr;gap:clamp(24px,3vw,54px)}
.c-col-h{display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding-bottom:14px;border-bottom:1px solid var(--line-soft);margin-bottom:4px}
.c-row{display:flex;align-items:center;gap:18px;padding:20px 4px;
  border-bottom:1px solid var(--line-soft);position:relative;
  transition:padding-left .5s var(--ease)}
.c-row::before{content:'';position:absolute;inset:0 -14px;background:var(--panel);opacity:0;
  transition:opacity .4s;z-index:-1}
.c-row:hover{padding-left:18px}
.c-row:hover::before{opacity:1}
.c-row .ic{width:21px;height:21px;color:var(--clay);flex:none}
.c-k{font-family:var(--fd);font-weight:300;font-size:20px;flex:1;min-width:0}
.c-v{font-size:13px;color:var(--ink-4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.c-go{color:var(--ink-4);transition:transform .45s var(--ease),color .4s}
.c-row:hover .c-go{transform:translate(4px,-4px);color:var(--clay)}
/* his clock, where it answers a question */
.c-clock{display:inline-flex;align-items:center;gap:9px;font-size:11px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ink-4);white-space:nowrap}
.c-clock .ic{width:15px;height:15px;color:var(--clay-deep)}
.c-time{font-family:var(--fd);font-size:14px;color:var(--ink-2);letter-spacing:.05em;
  font-variant-numeric:tabular-nums}
@media(max-width:820px){.c-grid{grid-template-columns:1fr}}

/* ═══ FOOTER ═══════════════════════════════════════════════════════════ */
footer{border-top:1px solid var(--line-soft);padding:clamp(50px,7vw,86px) 0 34px;
  text-align:center;position:relative;overflow:hidden}
.ft-mark{font-family:var(--fd);font-weight:300;font-size:clamp(58px,13vw,190px);line-height:.86;
  letter-spacing:-.03em;color:transparent;-webkit-text-stroke:1px var(--line);
  transition:-webkit-text-stroke-color 1s var(--ease)}
footer:hover .ft-mark{-webkit-text-stroke-color:var(--clay-deep)}
.ft-tag{margin-top:20px;font-size:11px;letter-spacing:.3em;text-transform:uppercase;
  color:var(--ink-4)}
.ft-meta{margin-top:30px;padding-top:24px;border-top:1px solid var(--line-soft);
  display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap;
  font-size:11.5px;color:var(--ink-4);letter-spacing:.06em}
.ft-meta i{width:3px;height:3px;border-radius:50%;background:var(--line);display:block}
@media(max-width:820px){footer{padding-bottom:96px}}

/* ═══ THE LIGHTBOX ═════════════════════════════════════════════════════ */
#box{position:fixed;inset:0;z-index:9500;display:grid;place-items:center;
  padding:clamp(16px,4vw,56px);background:rgba(12,10,7,.965);
  backdrop-filter:blur(18px) saturate(1.1);
  opacity:0;visibility:hidden;transition:opacity .45s var(--ease),visibility .45s}
#box.open{opacity:1;visibility:visible}
.box-in{position:relative;width:min(1240px,100%);display:flex;flex-direction:column;gap:18px}
.box-fr{position:relative;width:100%;aspect-ratio:16/9;background:var(--ground-2);
  border:1px solid var(--line-soft);overflow:hidden;
  transform:scale(.975);transition:transform .55s var(--ease)}
#box.open .box-fr{transform:none}
#box.sq .box-fr{aspect-ratio:4/3}
.box-fr .bg{position:absolute;inset:0;background-size:cover;background-position:center;
  filter:blur(14px);transform:scale(1.08);opacity:.6}
.box-fr img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;
  opacity:0;transition:opacity .5s var(--ease)}
.box-fr img.rdy{opacity:1}
.box-bar{display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap}
.box-t{font-family:var(--fd);font-weight:300;font-size:clamp(19px,2vw,28px)}
.box-m{font-size:11.5px;letter-spacing:.13em;text-transform:uppercase;color:var(--ink-4)}
.box-acts{display:flex;align-items:center;gap:10px}
.box-b{display:grid;place-items:center;width:42px;height:42px;border:1px solid var(--line);
  color:var(--ink-3);transition:border-color .4s,color .4s,background .4s}
.box-b:hover{border-color:var(--clay);color:var(--clay-lit);background:rgba(200,121,74,.09)}
.box-b .ic{width:17px;height:17px}
.box-page{display:inline-flex;align-items:center;gap:9px;padding:0 18px;height:42px;
  border:1px solid var(--clay-deep);color:var(--clay-lit);font-size:11px;
  letter-spacing:.16em;text-transform:uppercase;transition:background .4s,color .4s}
.box-page:hover{background:var(--clay);color:#17140F}
.box-x{position:absolute;top:-52px;right:0;display:inline-flex;align-items:center;gap:9px;
  font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-3);
  transition:color .35s}
.box-x:hover{color:var(--clay-lit)}
@media(max-width:820px){.box-x{top:-42px}}

/* ═══ PROGRESS ═════════════════════════════════════════════════════════ */
#prog{position:fixed;top:0;left:0;height:2px;background:var(--clay);z-index:950;
  transform:scaleX(0);transform-origin:left;width:100%;will-change:transform}

/* ═══ OFF-SCREEN WORK THE BROWSER SHOULD NOT DO ════════════════════════
   content-visibility:auto was here, and it was the wrong trade. A skipped
   section has no layout, so the reveal observer cannot see the elements
   inside it, and the animation it exists to drive fires late or never. The
   images already wait for the viewport, which is where the weight actually
   is; the layout of a few hundred nodes is not worth a broken entrance. */
