/* Ace of Apertures — shared stylesheet
   Layout: full-bleed image bands alternating with gutter-set type.
   Gallery-white, single deliberate theme — the photographs carry all the color. */

:root{
  --paper:#FCFCFB;
  --ink:#141414;
  --ink-soft:#5E5C58;
  --rule:#E3E1DC;
  --frame:#EDEBE6;
  --frame-ink:#9C9890;

  --display:"Instrument Serif", "Times New Roman", Times, serif;
  --body:"EB Garamond", Georgia, "Times New Roman", serif;

  --gutter:max(16px, env(safe-area-inset-left, 0px));
  --gutter-r:max(16px, env(safe-area-inset-right, 0px));
  --max:1500px;

  color-scheme: light;
  padding-top:env(safe-area-inset-top, 0px);
  padding-bottom:env(safe-area-inset-bottom, 0px);
}

*{box-sizing:border-box}
body{
  margin:0;
  background:var(--paper);
  color:var(--ink);
  font-family:var(--body);
  font-size:1.0625rem;
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
}
img{display:block;max-width:100%}
a{color:inherit}
[hidden]{display:none!important}

.wrap{
  width:100%;
  max-width:var(--max);
  margin-inline:auto;
  padding-left:var(--gutter);
  padding-right:var(--gutter-r);
}

:where(a,button,input,textarea):focus-visible{
  outline:2px solid var(--ink);
  outline-offset:3px;
}

/* ---------- header ---------- */
.masthead{border-bottom:1px solid var(--rule)}
.masthead .wrap{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:1.25rem;
  padding-block:1.5rem;
  flex-wrap:wrap;
}
.wordmark{
  font-family:var(--display);
  font-size:clamp(1.15rem,2.4vw,1.5rem);
  letter-spacing:.09em;
  text-transform:uppercase;
  text-decoration:none;
  line-height:1;
}
nav{display:flex;align-items:center;gap:clamp(1.1rem,3vw,2.25rem)}
nav a{
  text-decoration:none;
  font-size:1.0625rem;
  letter-spacing:.015em;
  padding-bottom:2px;
  border-bottom:1px solid transparent;
  transition:border-color .2s ease;
}
nav a:hover,nav a:focus-visible{border-bottom-color:var(--ink)}
nav a[aria-current="page"]{border-bottom-color:var(--ink)}
nav .ig{display:flex;border:0}
nav .ig svg{width:21px;height:21px;display:block}

/* ---------- image frames (placeholder until the file exists) ---------- */
/* Base frame shows the photo whole, at its own proportions. A frame with a
   fixed aspect-ratio (the home page tiles) overrides this below and crops. */
.frame{
  position:relative;
  overflow:hidden;
  background:var(--frame);
}
.frame img{
  display:block;
  width:100%;
  height:auto;
  position:relative;
  z-index:1;
}
/* The slot label is scaffolding for an empty frame — drop it once a photo is in */
.frame:has(img) .slot{display:none}
.frame .slot{
  position:absolute;
  inset:0;
  display:grid;
  place-items:center;
  z-index:0;
  font-size:.8125rem;
  letter-spacing:.14em;
  text-transform:uppercase;
  color:var(--frame-ink);
  text-align:center;
  padding:1rem;
}

/* ---------- model credit tag ---------- */
/* Old-school Instagram photo tag: dark pill with a caret, revealed on hover
   (desktop) or tap (touch). Only appears on frames that carry one. */
.ig-tag{
  position:absolute;
  left:clamp(.75rem,2vw,1.25rem);
  bottom:clamp(.75rem,2vw,1.25rem);
  z-index:3;
  display:inline-block;
  padding:.44rem .72rem;
  background:rgba(14,14,14,.82);
  color:#fff;
  font-family:var(--body);
  font-size:.9375rem;
  letter-spacing:.015em;
  line-height:1;
  text-decoration:none;
  border-radius:4px;
  white-space:nowrap;
  opacity:0;
  transform:translateY(4px);
  transition:opacity .18s ease,transform .18s ease;
  pointer-events:none;
}
.ig-tag::before{
  content:"";
  position:absolute;
  top:-5px;
  left:12px;
  border-left:5px solid transparent;
  border-right:5px solid transparent;
  border-bottom:5px solid rgba(14,14,14,.82);
}
/* Two or more people in one frame: stack their tags */
.ig-tags{
  position:absolute;
  left:clamp(.75rem,2vw,1.25rem);
  bottom:clamp(.75rem,2vw,1.25rem);
  z-index:3;
  display:flex;
  flex-direction:column;
  align-items:flex-start;
  gap:.4rem;
}
.ig-tags .ig-tag{position:static;left:auto;bottom:auto}

.tagged{position:relative}
@media (hover:hover){
  .tagged:hover .ig-tag,
  .tagged:focus-within .ig-tag,
  .hero:hover .ig-tag{opacity:1;transform:none;pointer-events:auto}
}
/* Keep it up for a moment after the pointer leaves, so it can be reached */
.ig-tag{transition-delay:.25s}
.tagged:hover .ig-tag,
.hero:hover .ig-tag,
.tagged.tag-open .ig-tag{transition-delay:0s}
.tagged.tag-open .ig-tag{opacity:1;transform:none;pointer-events:auto}
.ig-tag:focus-visible{opacity:1;transform:none;pointer-events:auto}
/* The hero's headline sits bottom-left, so its tag goes to the other side */
.hero .ig-tag{left:auto;right:clamp(.75rem,2vw,1.25rem)}
.hero .ig-tag::before{left:auto;right:12px}

/* ---------- buttons ---------- */
.btn{
  display:inline-block;
  border:1px solid var(--ink);
  padding:.72rem 1.5rem;
  text-decoration:none;
  font-family:var(--body);
  font-size:.95rem;
  letter-spacing:.055em;
  background:transparent;
  color:var(--ink);
  cursor:pointer;
  transition:background .2s ease,color .2s ease;
}
.btn:hover,.btn:focus-visible{background:var(--ink);color:var(--paper)}

.link-arrow{
  display:inline-block;
  text-decoration:none;
  border-bottom:1px solid var(--ink);
  padding-bottom:3px;
  font-size:1.0625rem;
  letter-spacing:.015em;
}

/* ---------- page heading ---------- */
.page-head{padding-block:clamp(2.25rem,5vw,4rem) clamp(1.5rem,3vw,2.5rem)}
.page-head h1{
  margin:0;
  font-family:var(--display);
  font-weight:400;
  font-size:clamp(2.1rem,5.2vw,3.5rem);
  line-height:1;
  letter-spacing:-.01em;
}

/* ---------- hero (home) ---------- */
/* Full frame, no crop — the hero takes its height from the photograph */
.hero{
  position:relative;
  min-height:300px;
  background:var(--frame);
  display:grid;
}
.hero .frame{grid-area:1/1;aspect-ratio:auto}
.hero .frame img{height:auto}
.hero .scrim{
  grid-area:1/1;
  z-index:1;
  align-self:end;
  width:100%;
  height:55%;
  background:linear-gradient(180deg,rgba(10,10,10,0),rgba(10,10,10,.52));
  pointer-events:none;
}
.hero .hero-type{
  grid-area:1/1;
  z-index:2;
  align-self:end;
  width:100%;
  padding-block:clamp(1.75rem,4vw,3.25rem);
  pointer-events:none;   /* let hover reach the image underneath */
}
.hero h1{pointer-events:auto}
.hero h1{
  margin:0;
  font-family:var(--display);
  font-weight:400;
  font-size:clamp(2.1rem,6.4vw,4.75rem);
  line-height:1.02;
  letter-spacing:-.012em;
  color:#fff;
  text-wrap:balance;
  text-shadow:0 1px 28px rgba(0,0,0,.42);
}

/* ---------- gallery cards (home) ---------- */
.galleries{padding-block:clamp(3rem,7vw,6rem)}
.gal-grid{
  display:grid;
  grid-template-columns:repeat(2,1fr);
  gap:clamp(1.75rem,3.5vw,3rem) clamp(1.25rem,3vw,2.5rem);
}
.gal{min-width:0;display:flex;flex-direction:column}
/* Upright tiles: these selects are shot vertical, so a landscape tile would
   crop the subject. Each tile sets its own anchor in the markup — bottom for
   a full-length frame so the feet stay in, top for a close-up headshot. */
.gal .frame{aspect-ratio:3/4;max-width:100%}
.gal .frame img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.gal h2{
  margin:1.35rem 0 0;
  font-family:var(--display);
  font-weight:400;
  font-size:clamp(1.3rem,2.2vw,1.65rem);
}
.gal .btn{margin-top:1.1rem;align-self:start}

/* Editorial leads: full width above the other two */
.gal.lead{grid-column:1 / -1}
.gal.lead .frame{aspect-ratio:16/9}
.gal.lead h2{font-size:clamp(1.75rem,3.4vw,2.6rem);margin-top:1.5rem}

/* ---------- craft video band (home) ---------- */
.craft{
  position:relative;
  display:grid;
  min-height:clamp(360px,54vh,620px);
  background:#1A1A1A;
  isolation:isolate;
}
.craft video,.craft .frame{grid-area:1/1;width:100%;height:100%;object-fit:cover}
.craft .veil{
  grid-area:1/1;
  background:linear-gradient(180deg,rgba(12,12,12,.52),rgba(12,12,12,.62));
  z-index:1;
}
.craft .craft-type{
  grid-area:1/1;
  z-index:2;
  align-self:center;
  width:100%;
  max-width:var(--max);
  margin-inline:auto;
  padding-left:var(--gutter);
  padding-right:var(--gutter-r);
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1.7fr);
  gap:clamp(1.5rem,5vw,4rem);
  align-items:center;
  padding-block:clamp(3rem,7vw,5rem);
  color:#fff;
}
.craft h2,.craft p{text-shadow:0 1px 24px rgba(0,0,0,.45)}
.craft h2{
  margin:0;
  font-family:var(--display);
  font-weight:400;
  font-size:clamp(2rem,5vw,3.6rem);
  line-height:1;
}
.craft p{
  margin:0;
  font-family:var(--display);
  font-size:clamp(1.4rem,3.4vw,2.6rem);
  line-height:1.2;
  text-wrap:balance;
  max-width:22ch;
}

/* ---------- closing strip (home) ---------- */
.closing{padding-block:clamp(3.5rem,8vw,7rem);text-align:center}
.closing h2{
  margin:0 0 clamp(2.5rem,6vw,4.5rem);
  font-family:var(--display);
  font-weight:400;
  font-size:clamp(1.9rem,4.6vw,3.25rem);
}
/* Uniform-height row: every tile is the same height, each photo keeps its own
   proportions and is never cropped, so widths vary with the frame. */
.strip{
  display:flex;
  flex-wrap:wrap;
  justify-content:center;
  align-items:flex-start;
  gap:clamp(1rem,2.6vw,2.25rem);
  margin-bottom:clamp(2.5rem,6vw,4rem);
}
.strip .frame{
  height:clamp(300px,30vw,440px);
  width:auto;
  flex:0 0 auto;
  max-width:100%;
}
/* An empty slot has no image to set its width, so give it a placeholder one */
.strip .frame:not(:has(img)){width:clamp(225px,22vw,330px)}
.strip .frame img{height:100%;width:auto;max-width:100%;object-fit:contain}

/* ---------- about ---------- */
.pullquote{
  padding-block:clamp(2.5rem,6vw,5rem) clamp(2rem,5vw,3.5rem);
}
.pullquote h1{
  margin:0;
  max-width:26ch;
  font-family:var(--display);
  font-weight:400;
  font-size:clamp(2rem,5.4vw,4rem);
  line-height:1.06;
  letter-spacing:-.014em;
  text-wrap:balance;
}
.pullquote .rule{
  margin-top:clamp(1.75rem,4vw,2.75rem);
  border:0;
  border-top:1px solid var(--rule);
}
/* Gallery pages center theirs above the grid */
.pullquote.center{text-align:center}
.pullquote.center h1{margin-inline:auto}

.about{padding-block:0 clamp(3.5rem,8vw,6rem)}
.about-grid{
  display:grid;
  grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);
  gap:clamp(2rem,5vw,4.5rem);
  align-items:start;
}
.about-copy{min-width:0;max-width:64ch}
.about-copy p{margin:0 0 1.35rem;font-size:1.1875rem;line-height:1.62}
.about-copy p:last-of-type{margin-bottom:2rem}
.about-copy strong{font-weight:600}
.about-copy .locale{color:var(--ink-soft);font-style:italic}
.about-copy .locale strong{font-style:italic;color:var(--ink)}
.about-portrait{position:sticky;top:1.5rem}
/* Full frame, no crop — never cut a subject's feet */
.about-portrait .frame{aspect-ratio:auto}
.about-portrait .frame img{height:auto}

/* ---------- contact ---------- */
.contact{padding-block:0 clamp(3.5rem,8vw,6rem)}
.contact-grid{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,.85fr);
  gap:clamp(2rem,5vw,4.5rem);
  align-items:start;
}
.contact-aside .frame{aspect-ratio:auto}
.contact-aside .frame img{height:auto}

/* Side by side, the photo scales down to match the form's height.
   Never cropped — the whole frame just gets smaller. */
@media (min-width:981px){
  .contact-grid{align-items:stretch}
  /* The photo is taken out of flow so the form alone sets the row height;
     it then scales to fill that height at its own proportions. */
  .contact-aside{position:relative}
  .contact-aside .frame{
    position:absolute;
    inset:0;
    display:flex;
    justify-content:flex-end;
    background:none;
    overflow:visible;
  }
  .contact-aside .frame img{height:100%;width:auto;max-width:100%;object-fit:contain}
}
form{min-width:0;display:flex;flex-direction:column;gap:1.75rem;max-width:36rem}
fieldset{border:0;margin:0;padding:0;display:flex;flex-direction:column;gap:1.25rem}
legend{
  padding:0;
  font-size:1.0625rem;
  margin-bottom:.35rem;
}
.name-row{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem}
.field{display:flex;flex-direction:column;gap:.4rem;min-width:0}
.field label{font-size:1.0625rem}
.field .req{color:var(--ink-soft);font-size:.9375rem;font-style:italic}
input,textarea{
  font-family:var(--body);
  font-size:1.0625rem;
  color:var(--ink);
  background:transparent;
  border:0;
  border-bottom:1px solid var(--rule);
  padding:.55rem 0;
  width:100%;
  border-radius:0;
  transition:border-color .2s ease;
}
input:focus,textarea:focus{border-bottom-color:var(--ink)}
textarea{min-height:9rem;resize:vertical;line-height:1.5}
::placeholder{color:var(--frame-ink);opacity:1}
.form-note{
  margin:0;
  font-size:1.0625rem;
  color:var(--ink-soft);
}
.form-note.ok{color:var(--ink)}
.direct{
  margin:2.25rem 0 0;
  padding-top:1.5rem;
  border-top:1px solid var(--rule);
  font-size:1.0625rem;
  color:var(--ink-soft);
}
.direct a{text-decoration:none;border-bottom:1px solid var(--rule);color:var(--ink)}

/* ---------- gallery pages ---------- */
.gallery-page{padding-block:0 clamp(3.5rem,8vw,6rem)}
.gallery-intro{
  max-width:52ch;
  margin:0 0 clamp(2rem,5vw,3.25rem);
  font-size:1.1875rem;
  color:var(--ink-soft);
}
/* Masonry: natural heights, no crop — the frames set their own proportions */
.plates{
  columns:4;
  column-gap:clamp(.75rem,1.8vw,1.5rem);
}
.plates figure{
  margin:0 0 clamp(.75rem,1.8vw,1.5rem);
  break-inside:avoid;
  page-break-inside:avoid;
  background:var(--frame);
}
.plates img{width:100%;height:auto;display:block}

.plates .frame{min-width:0}
.plates .frame.tall{aspect-ratio:3/4}
.plates .frame.wide{aspect-ratio:3/2;grid-column:span 2}

@media (max-width:1100px){ .plates{columns:3} }
@media (max-width:760px){ .plates{columns:2} }
@media (max-width:460px){ .plates{columns:1} }
.back{margin-top:clamp(2.5rem,6vw,4rem)}

/* ---------- footer ---------- */
footer{border-top:1px solid var(--rule)}
footer .wrap{
  padding-block:clamp(2rem,5vw,3.5rem);
  display:flex;
  flex-wrap:wrap;
  gap:1rem 2rem;
  align-items:center;
  justify-content:space-between;
  font-size:.95rem;
  color:var(--ink-soft);
}
footer nav a{font-size:.95rem}

/* ---------- narrow ---------- */
@media (max-width:980px){
  .about-grid,.contact-grid{grid-template-columns:1fr}
  .about-portrait{position:static;order:-1;max-width:26rem}
  .contact-aside{max-width:26rem}
}
@media (max-width:860px){
  .gal-grid{grid-template-columns:1fr;gap:2.75rem}
  .strip .frame{height:clamp(260px,42vw,340px)}
  .craft .craft-type{grid-template-columns:1fr;gap:1.1rem;align-items:start}
  .craft p{max-width:none}
  .masthead .wrap{padding-block:1.15rem}
  .plates .frame.wide{grid-column:span 1;aspect-ratio:3/4}
}
@media (max-width:560px){
  .name-row{grid-template-columns:1fr}
}
@media (max-width:460px){
  .masthead .wrap{flex-direction:column;align-items:flex-start;gap:.9rem}
  nav{gap:1.15rem}
}

@media (prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important;scroll-behavior:auto!important}
}
