<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Abdishukri Haybe — Documentary Photographer</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,500;0,9..144,600;1,9..144,400;1,9..144,500&family=Source+Serif+4:ital,opsz,wght@0,8..60,400;0,8..60,500;1,8..60,400&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
:root{
  --ink:#0e0d0c;
  --ink-2:#161412;
  --paper:#ece6da;
  --paper-dim:#c9c2b3;
  --brass:#b8874a;
  --brass-bright:#d9a765;
  --press-red:#8c3a2e;
  --grey:#8a8378;
  --line: rgba(236,230,218,0.14);
  --line-strong: rgba(236,230,218,0.28);
}
*{box-sizing:border-box; margin:0; padding:0;}
html{scroll-behavior:smooth;}
body{
  background:var(--ink);
  color:var(--paper);
  font-family:'Source Serif 4', serif;
  font-size:16px;
  line-height:1.6;
  overflow-x:hidden;
}
@media (pointer:fine){ body{ cursor:none; } }
img{max-width:100%; display:block;}
a{color:inherit; text-decoration:none;}

/* ============ CURSOR / VIEWFINDER ============ */
#reticle{
  position:fixed; top:0; left:0; width:0; height:0;
  pointer-events:none; z-index:9999;
  will-change:transform;
}
#reticle .frame{
  position:absolute; width:38px; height:38px; left:-19px; top:-19px;
  transition:width .25s ease, height .25s ease, left .25s ease, top .25s ease, border-color .25s ease, opacity .2s ease;
}
#reticle .corner{
  position:absolute; width:8px; height:8px; border-color:var(--brass-bright);
  transition:border-color .25s ease;
}
#reticle .c-tl{ top:0; left:0; border-top:1.5px solid; border-left:1.5px solid; }
#reticle .c-tr{ top:0; right:0; border-top:1.5px solid; border-right:1.5px solid; }
#reticle .c-bl{ bottom:0; left:0; border-bottom:1.5px solid; border-left:1.5px solid; }
#reticle .c-br{ bottom:0; right:0; border-bottom:1.5px solid; border-right:1.5px solid; }
#reticle .dot{
  position:absolute; width:3px; height:3px; left:-1.5px; top:-1.5px;
  background:var(--brass-bright); border-radius:50%;
  transition:background .2s ease, width .2s ease, height .2s ease;
}
#reticle .tag{
  position:absolute; left:26px; top:-6px;
  font-family:'IBM Plex Mono', monospace; font-size:10px; letter-spacing:.08em;
  color:var(--brass-bright); white-space:nowrap; opacity:0; transition:opacity .2s ease;
}
#reticle.locked .frame{ width:52px; height:52px; left:-26px; top:-26px; }
#reticle.locked .corner{ border-color:var(--press-red); }
#reticle.locked .dot{ background:var(--press-red); width:4px; height:4px; }
#reticle.locked .tag{ opacity:1; color:var(--press-red); }

/* ============ NAVIGATION ============ */
nav.site-nav{
  position:fixed; top:0; left:0; right:0; z-index:500;
  display:flex; align-items:center; justify-content:space-between;
  padding:26px 48px; mix-blend-mode:difference;
}
nav.site-nav .brand{ font-family:'Fraunces', serif; font-size:19px; letter-spacing:.02em; }
nav.site-nav .links{ display:flex; gap:34px; }
nav.site-nav .links a{ font-family:'IBM Plex Mono', monospace; font-size:11px; letter-spacing:.14em; text-transform:uppercase; opacity:.85; position:relative; }
nav.site-nav .links a:hover{ opacity:1; }
nav.site-nav .links a.active{ opacity:1; }
nav.site-nav .links a.active::after{
  content:''; position:absolute; bottom:-4px; left:0; right:0;
  height:1px; background:var(--brass-bright);
}
@media (max-width:700px){ nav.site-nav .links{ display:none; } nav.site-nav{ padding:20px 22px; } }

/* ============ HERO INTRO ============ */
.hero{
  min-height:45vh;
  display:flex;
  flex-direction:column;
  justify-content:flex-end;
  padding:140px 48px 60px;
  max-width:1400px;
  margin:0 auto;
}
.hero-eyebrow{
  font-family:'IBM Plex Mono', monospace;
  font-size:11px; letter-spacing:.4em;
  text-transform:uppercase; color:var(--brass-bright);
  margin-bottom:20px;
}
.hero h1{
  font-family:'Fraunces', serif;
  font-size:clamp(32px,5vw,52px);
  font-weight:400; line-height:1.1;
  max-width:700px;
}
.hero p{
  font-size:15px; color:var(--paper-dim);
  max-width:420px; margin-top:20px; line-height:1.7;
}

/* ============ GALLERY GRID ============ */
.gallery{
  padding:0 48px 100px;
  max-width:1400px;
  margin:0 auto;
}
.gallery-grid{
  display:grid;
  grid-template-columns:repeat(3, 1fr);
  gap:16px;
}
.gcell{
  position:relative;
  overflow:hidden;
  background:var(--ink-2);
  cursor:pointer;
  opacity:0;
  transform:translateY(30px);
  transition:opacity .8s ease, transform .8s cubic-bezier(.2,.7,.2,1);
}
.gcell.visible{ opacity:1; transform:translateY(0); }
.gcell:nth-child(1){ grid-row:span 2; }
.gcell:nth-child(4){ grid-row:span 2; }
.gcell:nth-child(5){ grid-column:span 2; }
.gcell img{
  width:100%; height:100%;
  object-fit:cover;
  filter:grayscale(35%);
  transition:transform 1.2s cubic-bezier(.2,.7,.2,1), filter .8s ease;
}
.gcell:hover img{ transform:scale(1.04); filter:grayscale(0%); }
.gcell .overlay{
  position:absolute; inset:0;
  background:linear-gradient(to top, rgba(14,13,12,.75) 0%, transparent 60%);
  opacity:0;
  transition:opacity .5s ease;
}
.gcell:hover .overlay{ opacity:1; }
.gcell .view-badge{
  position:absolute; top:50%; left:50%;
  transform:translate(-50%,-50%) scale(.9);
  width:56px; height:56px;
  border:1px solid rgba(236,230,218,.35);
  border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  opacity:0;
  transition:opacity .4s ease, transform .4s ease;
  pointer-events:none;
}
.gcell:hover .view-badge{ opacity:1; transform:translate(-50%,-50%) scale(1); }
.gcell .view-badge span{
  font-family:'IBM Plex Mono',monospace;
  font-size:9px; letter-spacing:.15em;
  text-transform:uppercase; color:rgba(236,230,218,.85);
}
.gcell .caption{
  position:absolute; bottom:0; left:0; right:0;
  padding:20px 16px 16px;
  transform:translateY(10px);
  opacity:0;
  transition:all .5s cubic-bezier(.2,.7,.2,1);
  pointer-events:none;
}
.gcell:hover .caption{ transform:translateY(0); opacity:1; }
.gcell .caption .title{
  font-family:'Fraunces',serif; font-size:16px; font-weight:400;
  margin-bottom:4px;
}
.gcell .caption .loc{
  font-family:'IBM Plex Mono',monospace; font-size:10px;
  letter-spacing:.08em; color:var(--brass-bright); text-transform:uppercase;
}

@media (max-width:1024px){
  .gallery-grid{ grid-template-columns:repeat(2, 1fr); }
  .gcell:nth-child(5){ grid-column:span 2; }
  .gcell:nth-child(1), .gcell:nth-child(4){ grid-row:span 1; }
}
@media (max-width:700px){
  .hero{ padding:100px 22px 40px; }
  .gallery{ padding:0 22px 60px; }
  .gallery-grid{ grid-template-columns:1fr; gap:12px; }
  .gcell:nth-child(n){ grid-row:auto; grid-column:auto; }
  .gcell .caption{ opacity:1; transform:translateY(0); padding:16px 12px 12px; }
  .gcell .overlay{ opacity:1; background:linear-gradient(to top, rgba(14,13,12,.6), transparent); }
}

/* ============ LIGHTBOX ============ */
.lightbox{
  position:fixed; inset:0; z-index:1000; background:rgba(14,13,12,.97);
  display:flex; align-items:center; justify-content:center;
  opacity:0; pointer-events:none;
  transition:opacity .4s ease;
  flex-direction:column;
}
.lightbox.open{ opacity:1; pointer-events:auto; }
.lightbox img{
  max-height:75vh; max-width:min(92vw,1100px);
  object-fit:contain; display:block;
}
.lightbox .lb-info{
  text-align:center; margin-top:24px; padding:0 24px;
}
.lightbox .lb-info .loc{
  font-family:'IBM Plex Mono',monospace; font-size:11px;
  letter-spacing:.1em; color:var(--brass-bright); text-transform:uppercase;
}
.lightbox .lb-info .title{
  font-family:'Fraunces',serif; font-size:22px; margin-top:8px;
}
.lightbox .lb-context{
  font-family:'Source Serif 4', serif; font-size:14px;
  color:var(--paper-dim); max-width:500px; margin:12px auto 0;
  line-height:1.6;
}
.lightbox .lb-close{
  position:absolute; top:28px; right:38px;
  font-family:'IBM Plex Mono',monospace; font-size:11px; letter-spacing:.1em;
  color:var(--paper-dim); cursor:pointer; padding:8px;
  transition:color .3s;
}
.lightbox .lb-close:hover{ color:var(--brass-bright); }
.lightbox .lb-nav{
  position:absolute; top:50%; transform:translateY(-50%);
  width:50px; height:50px;
  border:1px solid rgba(236,230,218,.15);
  display:flex; align-items:center; justify-content:center;
  cursor:pointer;
  transition:border-color .3s, color .3s;
  color:var(--paper-dim);
  font-family:'IBM Plex Mono',monospace; font-size:20px;
}
.lightbox .lb-nav:hover{
  border-color:var(--brass-bright); color:var(--brass-bright);
}
.lightbox .lb-prev{ left:30px; }
.lightbox .lb-next{ right:30px; }
.lightbox .lb-counter{
  position:absolute; bottom:28px; left:50%; transform:translateX(-50%);
  font-family:'IBM Plex Mono',monospace; font-size:11px;
  color:var(--grey); letter-spacing:.1em;
}

@media (max-width:700px){
  .lightbox .lb-nav{ display:none; }
  .lightbox img{ max-height:65vh; }
}

/* ============ FOOTER ============ */
footer{ padding:34px 0; border-top:1px solid var(--line); }
footer .wrap{
  max-width:1400px; margin:0 auto; padding:0 48px;
  display:flex; justify-content:space-between; align-items:center;
}
footer .mono{ font-size:10px; letter-spacing:.08em; color:var(--grey); }
.back-top{ font-family:'IBM Plex Mono',monospace; font-size:10px; letter-spacing:.1em; color:var(--paper-dim); }
.back-top:hover{ color:var(--brass-bright); }
@media (max-width:700px){ footer .wrap{ padding:0 22px; } }

@media (prefers-reduced-motion: reduce){
  html{ scroll-behavior:auto; }
}
</style>
</head>
<body>

<div id="reticle">
  <div class="frame">
    <div class="corner c-tl"></div><div class="corner c-tr"></div>
    <div class="corner c-bl"></div><div class="corner c-br"></div>
  </div>
  <div class="dot"></div>
  <div class="tag mono" id="reticleTag">FOCUS</div>
</div>

<nav class="site-nav">
  <a class="brand" href="index.html">Abdishukri Haybe</a>
  <div class="links">
    <a href="index.html" class="hoverable active">Work</a>
    <a href="essays.html" class="hoverable">Essays</a>
    <a href="about.html" class="hoverable">About</a>
    <a href="contact.html" class="hoverable">Contact</a>
    <a href="admin.html" class="hoverable" style="opacity:.5">Admin</a>
  </div>
</nav>

<section class="hero">
  <div class="hero-eyebrow">Documentary Photography</div>
  <h1>Witnessing the unseen stories</h1>
  <p>Fifteen years across conflict zones, environmental frontlines, and the quiet resilience of ordinary lives.</p>
</section>

<section class="gallery">
  <div class="gallery-grid" id="galleryGrid"></div>
</section>

<footer>
  <div class="wrap">
    <span class="mono">© 2026 ABDISHUKRI HAYBE · ALL FRAMES RESERVED</span>
    <a href="#top" class="back-top hoverable">BACK TO TOP ↑</a>
  </div>
</footer>

<div class="lightbox" id="lightbox">
  <span class="lb-close hoverable" id="lbClose">CLOSE ✕</span>
  <span class="lb-nav lb-prev hoverable" id="lbPrev">‹</span>
  <span class="lb-nav lb-next hoverable" id="lbNext">›</span>
  <img id="lbImg" src="" alt="">
  <div class="lb-info">
    <div class="loc mono" id="lbLoc"></div>
    <div class="title" id="lbTitle"></div>
    <div class="lb-context" id="lbContext"></div>
  </div>
  <div class="lb-counter" id="lbCounter"></div>
</div>

<script>
/* ---------- GALLERY DATA ---------- */
const photos = [
  {id:1043, loc:"Turkana, Kenya — 2024", title:"Salt of the Lake", context:"Along the shrinking shoreline of Lake Turkana, fishing families rebuild their livelihoods around a lake that no longer keeps its old promises."},
  {id:1016, loc:"Nairobi, Kenya — 2022", title:"Market before dawn", context:"The city wakes before sunrise. Vendors arrange produce by flashlight, the first buses idle at the stage, and the day begins in near-silence."},
  {id:1025, loc:"Kampala, Uganda — 2022", title:"Night Shift", context:"Inside a public hospital's overnight ward during a nationwide nurses' strike, where a skeleton crew holds the line until morning."},
  {id:1050, loc:"Addis Ababa, Ethiopia — 2020", title:"Transit", context:"The Merkato bus station at 5 a.m. — thousands of people, hundreds of routes, one shared understanding of urgency."},
  {id:1035, loc:"Juba, South Sudan — 2021", title:"The Long Walk", context:"A five-week journey alongside a family displaced by flooding, from a submerged village to a resettlement camp three districts away."},
  {id:1060, loc:"Lodwar, Kenya — 2024", title:"Drought lines", context:"The dry riverbeds of Turkana County tell the story of five consecutive failed rainy seasons. Communities walk farther each day for water."},
  {id:1041, loc:"Mombasa, Kenya — 2023", title:"Harbor economies", context:"The port never sleeps. Dockworkers move between ships and shore in shifts that blur day into night, loading the goods that feed a region."},
  {id:1069, loc:"Kisumu, Kenya — 2021", title:"Lakeside clinics", context:"Mobile health units reach fishing communities on Lake Victoria's islands, bringing vaccines and antenatal care where roads don't go."},
];

/* ---------- BUILD GALLERY ---------- */
const grid = document.getElementById('galleryGrid');
grid.innerHTML = photos.map((p, i) => `
  <div class="gcell hoverable" data-index="${i}" style="transition-delay:${i * 0.08}s">
    <img src="https://picsum.photos/id/${p.id}/800/1000" alt="${p.title}" loading="lazy">
    <div class="overlay"></div>
    <div class="view-badge"><span>View</span></div>
    <div class="caption">
      <div class="title">${p.title}</div>
      <div class="loc">${p.loc}</div>
    </div>
  </div>
`).join('');

/* ---------- SCROLL REVEAL ---------- */
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if(entry.isIntersecting){
      entry.target.classList.add('visible');
      observer.unobserve(entry.target);
    }
  });
}, {threshold: 0.1});
document.querySelectorAll('.gcell').forEach(cell => observer.observe(cell));

/* ---------- LIGHTBOX ---------- */
const lightbox = document.getElementById('lightbox');
const lbImg = document.getElementById('lbImg');
const lbLoc = document.getElementById('lbLoc');
const lbTitle = document.getElementById('lbTitle');
const lbContext = document.getElementById('lbContext');
const lbCounter = document.getElementById('lbCounter');
let currentIdx = 0;

function openLightbox(index){
  currentIdx = index;
  const p = photos[index];
  lbImg.src = `https://picsum.photos/id/${p.id}/1600/1200`;
  lbLoc.textContent = p.loc;
  lbTitle.textContent = p.title;
  lbContext.textContent = p.context;
  lbCounter.textContent = `${index + 1} / ${photos.length}`;
  lightbox.classList.add('open');
  document.body.style.overflow = 'hidden';
}
function closeLightbox(){ lightbox.classList.remove('open'); document.body.style.overflow = ''; }
function nextPhoto(){ currentIdx = (currentIdx + 1) % photos.length; openLightbox(currentIdx); }
function prevPhoto(){ currentIdx = (currentIdx - 1 + photos.length) % photos.length; openLightbox(currentIdx); }

document.querySelectorAll('.gcell').forEach(cell => {
  cell.addEventListener('click', () => openLightbox(parseInt(cell.dataset.index)));
});
document.getElementById('lbClose').addEventListener('click', closeLightbox);
document.getElementById('lbNext').addEventListener('click', (e) => { e.stopPropagation(); nextPhoto(); });
document.getElementById('lbPrev').addEventListener('click', (e) => { e.stopPropagation(); prevPhoto(); });
lightbox.addEventListener('click', (e) => { if(e.target === lightbox) closeLightbox(); });
document.addEventListener('keydown', (e) => {
  if(!lightbox.classList.contains('open')) return;
  if(e.key === 'Escape') closeLightbox();
  if(e.key === 'ArrowRight') nextPhoto();
  if(e.key === 'ArrowLeft') prevPhoto();
});

/* ---------- SHUTTER SOUND ---------- */
let audioCtx = null;
function getAudioCtx(){
  if(!audioCtx) audioCtx = new (window.AudioContext || window.webkitAudioContext)();
  if(audioCtx.state === 'suspended') audioCtx.resume();
  return audioCtx;
}
function noiseBurst(ctx, t0, duration, freqLow, freqHigh, gainPeak){
  const bufferSize = Math.max(1, Math.floor(ctx.sampleRate * duration));
  const buffer = ctx.createBuffer(1, bufferSize, ctx.sampleRate);
  const data = buffer.getChannelData(0);
  for(let i=0;i<bufferSize;i++){ data[i] = (Math.random()*2 - 1); }
  const src = ctx.createBufferSource();
  src.buffer = buffer;
  const bandpass = ctx.createBiquadFilter();
  bandpass.type = 'bandpass';
  bandpass.frequency.value = (freqLow + freqHigh) / 2;
  bandpass.Q.value = 0.9;
  const gain = ctx.createGain();
  gain.gain.setValueAtTime(0.0001, t0);
  gain.gain.exponentialRampToValueAtTime(gainPeak, t0 + duration*0.15);
  gain.gain.exponentialRampToValueAtTime(0.0001, t0 + duration);
  src.connect(bandpass);
  bandpass.connect(gain);
  gain.connect(ctx.destination);
  src.start(t0);
  src.stop(t0 + duration + 0.02);
}
function playShutterSound(){
  try{
    const ctx = getAudioCtx();
    const now = ctx.currentTime;
    noiseBurst(ctx, now, 0.028, 900, 2200, 0.5);
    noiseBurst(ctx, now + 0.032, 0.02, 2500, 6000, 0.35);
    noiseBurst(ctx, now + 0.075, 0.018, 1800, 4500, 0.22);
  }catch(err){}
}
document.addEventListener('click', playShutterSound);

/* ---------- VIEWFINDER CURSOR ---------- */
const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
const fine = window.matchMedia('(pointer:fine)').matches;
if(fine){
  const reticle = document.getElementById('reticle');
  const reticleTag = document.getElementById('reticleTag');
  let mx = window.innerWidth/2, my = window.innerHeight/2;
  let rx = mx, ry = my;
  window.addEventListener('mousemove', (e) => {
    mx = e.clientX; my = e.clientY;
    const coordX = Math.round((e.clientX / window.innerWidth) * 9999).toString().padStart(4,'0');
    const coordY = Math.round((e.clientY / window.innerHeight) * 9999).toString().padStart(4,'0');
    reticleTag.textContent = e.target.closest('.hoverable') ? 'LOCKED · AF' : `${coordX} / ${coordY}`;
  });
  function raf(){
    const ease = reduceMotion ? 1 : 0.18;
    rx += (mx - rx) * ease;
    ry += (my - ry) * ease;
    reticle.style.transform = `translate(${rx}px, ${ry}px)`;
    requestAnimationFrame(raf);
  }
  raf();
  document.addEventListener('mouseover', (e) => { if(e.target.closest('.hoverable')) reticle.classList.add('locked'); });
  document.addEventListener('mouseout', (e) => { if(e.target.closest('.hoverable')) reticle.classList.remove('locked'); });
} else {
  document.getElementById('reticle').style.display = 'none';
}
</script>
</body>
</html>