/* * Shared portfolio gallery — a clean, reliable responsive grid with tap-to-enlarge * lightbox. Replaces the old auto-scrolling marquees (which glitched on mobile * because cell widths weren't known until images loaded, breaking the loop). * Used by portraits, maternity, and headshots/branding pages (Boise + Las Vegas). */ function PortfolioGrid({ images, subhead, label, galleryAria }) { const GOLD = "#C9A84C"; const INK = "#1A1A1A"; const WHITE = "#FFFFFF"; const BEIGE = "#F6F2EE"; const GREY = "#5a5550"; const [lb, setLb] = React.useState(null); const closeLb = () => setLb(null); const prev = () => setLb((n) => (n === null ? n : (n - 1 + images.length) % images.length)); const next = () => setLb((n) => (n === null ? n : (n + 1) % images.length)); React.useEffect(() => { if (lb === null) return; document.body.style.overflow = "hidden"; const onKey = (e) => { if (e.key === "Escape") closeLb(); else if (e.key === "ArrowLeft") prev(); else if (e.key === "ArrowRight") next(); }; window.addEventListener("keydown", onKey); return () => { window.removeEventListener("keydown", onKey); document.body.style.overflow = ""; }; }, [lb]); const cellStyle = { border: `1px solid ${GOLD}`, overflow: "hidden", background: INK, cursor: "pointer", aspectRatio: "2 / 3", }; return (
The Work

A look at the studio's portfolio.

{subhead}

{images.map((img, i) => (
setLb(i)} onKeyDown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); setLb(i); } }} role="button" tabIndex={0} aria-label={`Enlarge: ${img.alt}`} itemProp="associatedMedia" itemScope itemType="https://schema.org/ImageObject" > {img.alt} { const el = e.currentTarget; if (!el.dataset.retried) { el.dataset.retried = "1"; el.src = img.src + (img.src.includes("?") ? "&" : "?") + "r=" + Date.now(); return; } el.style.display = "none"; }} style={{ display: "block", width: "100%", height: "100%", objectFit: "cover", objectPosition: "center" }} />
))}
{lb !== null && (
{images[lb].alt} e.stopPropagation()} style={{ maxWidth: "90vw", maxHeight: "84vh", objectFit: "contain", boxShadow: "0 24px 70px rgba(0,0,0,0.55)", }}/>
{lb + 1} / {images.length}
)}
); } Object.assign(window, { PortfolioGrid });