/* jessemaddox.com — site styles, built on the Jess Design System tokens. */
@import url('/assets/ds/colors_and_type.css');

:root{
  --maxw:1080px; --pad:28px;
  /* A deeper design-system cyan keeps display text legible on light surfaces. */
  --accent-strong:var(--jds-blue-600);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
@media (prefers-reduced-motion: reduce){
  html{scroll-behavior:auto}
  *{transition:none !important}
}
body{background:var(--bg-alt);color:var(--fg)}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 var(--pad)}
a{color:inherit}
.accent{color:var(--accent-strong);display:inline-block}
:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px;border-radius:2px}
.skip{position:absolute;left:-9999px;top:0;background:var(--bg-ink);color:#fff;
  padding:10px 16px;z-index:20;border-radius:0 0 8px 0}
.skip:focus{left:0}

/* ---------- nav ---------- */
nav.site{position:sticky;top:0;z-index:10;background:rgba(248,248,248,.9);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  border-bottom:1px solid var(--border-hairline)}
nav.site .wrap{display:flex;align-items:center;justify-content:space-between;height:64px}
.mark{font-family:var(--font-display);font-weight:900;text-transform:uppercase;
  letter-spacing:-.02em;font-size:22px;text-decoration:none}
.navlinks{display:flex;gap:26px}
.navlinks a{font-family:var(--font-display);font-weight:700;text-transform:uppercase;
  letter-spacing:.06em;font-size:12px;color:var(--fg-muted);text-decoration:none;
  transition:color 120ms ease;display:inline-flex;align-items:center;min-height:44px}
.navlinks a:hover{color:var(--accent-ink)}

/* ---------- hero ---------- */
.hero{padding:76px 0 64px}
.hero-row{display:grid;grid-template-columns:1.4fr 1fr;gap:40px;align-items:center}
.hero h1{font-size:clamp(64px,11vw,128px)}
.hero-sub{max-width:560px;margin-top:26px;font-size:19px;color:var(--fg-muted)}
.hero-cta{margin-top:34px;display:flex;gap:12px;flex-wrap:wrap;align-items:center}
.verify{font-size:13px;color:var(--fg-muted)}
.verify a{color:var(--accent-ink);font-weight:700;text-decoration:none}
.verify a:hover{text-decoration:underline}
.headshot{border-radius:var(--radius-lg);overflow:hidden;background:var(--bg-secondary);
  aspect-ratio:4/5;object-fit:cover;width:100%;display:block}

/* ---------- credential strip ---------- */
.strip{background:var(--bg-ink);color:#fff;padding:16px 0}
.strip .wrap{display:flex;justify-content:center;text-align:center}
.strip-line{font-size:14px;color:var(--jds-navy-100);letter-spacing:.01em;font-weight:500}

/* ---------- generic block ---------- */
section.blk{padding:72px 0}
section.blk.white{background:var(--bg);border-top:1px solid var(--border-hairline);
  border-bottom:1px solid var(--border-hairline)}
.lead{max-width:640px;margin-top:20px;font-size:17px;color:var(--fg-muted)}

/* ---------- project cards ---------- */
.pgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;margin-top:36px}
.pcard{display:block;background:var(--bg);border:1px solid var(--border-hairline);
  border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-card);
  text-decoration:none;color:inherit;transition:transform 120ms ease,box-shadow 120ms ease}
.pcard:hover{transform:translateY(-2px);box-shadow:var(--shadow-pop)}
.pcard .thumb{aspect-ratio:16/9;background:var(--bg-secondary);display:flex;
  align-items:center;justify-content:center;font-size:44px}
.pcard .thumb img{width:100%;height:100%;object-fit:cover}
.pcard .pb{padding:20px}
.pcard h3{font-family:var(--font-display);font-weight:900;text-transform:uppercase;
  letter-spacing:-.02em;font-size:22px}
.pcard p{margin-top:8px;font-size:14px;color:var(--fg-muted)}
.badge{display:inline-block;margin-top:12px;font-size:11px;font-weight:700;
  text-transform:uppercase;letter-spacing:.06em;color:var(--accent-ink);
  background:var(--bg-secondary);padding:4px 10px;border-radius:var(--radius-pill)}

/* ---------- projects wing: rich inline entries ---------- */
.projlist{display:flex;flex-direction:column;gap:20px;margin-top:36px}
.project{background:var(--bg);border:1px solid var(--border-hairline);
  border-radius:var(--radius-lg);padding:28px 30px;box-shadow:var(--shadow-card)}
.project .head{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
.project h3{font-family:var(--font-display);font-weight:900;text-transform:uppercase;
  letter-spacing:-.02em;font-size:26px}
.project .desc{margin-top:12px;font-size:16px;color:var(--fg-muted);max-width:660px}
.project .cta-row{margin-top:18px;display:flex;gap:12px;align-items:center;flex-wrap:wrap}
/* pending / work-in-progress treatment */
.project.pending{border-left:4px solid var(--jds-amber-400)}
.project .soon{display:inline-block;margin-top:14px;font-size:11px;font-weight:700;
  text-transform:uppercase;letter-spacing:.06em;color:var(--jds-amber-800);
  background:var(--jds-amber-50);border:1px solid var(--jds-amber-200);
  padding:4px 10px;border-radius:var(--radius-pill)}
.shot-placeholder{margin-top:16px;border:1.5px dashed var(--jds-amber-400);
  border-radius:var(--radius-md);background:var(--jds-amber-50);color:var(--jds-amber-800);
  padding:22px;text-align:center;font-size:13px;font-weight:600;letter-spacing:.01em}

/* ---------- footer CTA ---------- */
.foot{background:var(--accent);color:var(--jds-blueberry);padding:64px 0;text-align:center}
.foot .btn-ghost-dark{margin-top:24px}

/* ---------- project detail ---------- */
.detail{padding:56px 0 72px}
.back{color:var(--accent-ink);text-decoration:none;font-weight:700;font-size:13px;
  text-transform:uppercase;letter-spacing:.06em;display:inline-flex;align-items:center;min-height:44px}
.back:hover{text-decoration:underline}
.detail .tagline{font-size:20px;color:var(--fg-muted);margin-top:14px;max-width:640px}
.detail .body{max-width:680px}
.detail .body p{margin-bottom:16px}
.detail .shots{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;margin:36px 0}
.detail .shots img{width:100%;border-radius:var(--radius-md);border:1px solid var(--border-hairline)}
.stack{display:flex;gap:8px;flex-wrap:wrap;margin-top:20px}
.stack .label{font-size:12px;background:var(--bg-alt);border:1px solid var(--border-hairline);
  padding:4px 10px;border-radius:var(--radius-pill);color:var(--fg-muted)}
.detail .cta-row{margin-top:28px}
.meta{font-size:12px;color:var(--fg-subtle);margin-left:8px}

/* ---------- responsive ---------- */
@media(max-width:760px){
  .hero-row,.pgrid{grid-template-columns:1fr}
  .hero-row{gap:24px}
  .headshot{max-width:280px;aspect-ratio:1/1;order:-1}   /* keep identity cue, cropped square, above text */
  .navlinks{gap:16px}
  .navlinks a{font-size:11px}
  .hero{padding:44px 0 40px}
  section.blk{padding:52px 0}
}
@media(max-width:560px){
  /* keep a compact 2-link nav so it never overflows the bar */
  .navlinks a:nth-child(2), .navlinks a:nth-child(4){display:none}
  .navlinks{gap:18px}
}

/* ============================================================
   QUIET LINES (homepage + /work spoke) — namespaced .ql-*
   A night-navy field. Left column carries lowercase sentence
   links; the rest of the viewport is deliberately calm, held
   for the future illustrated "little world" background.
   ============================================================ */
.ql-body{
  background:linear-gradient(160deg,var(--jds-navy-900) 0%,#031A42 55%,var(--jds-navy-800) 100%);
  color:var(--jds-milk);
  min-height:100vh;
  letter-spacing:0;
}
.ql-body ::selection{background:var(--jds-blue);color:var(--jds-blueberry)}

/* atmospheric layer: two soft glows + a winding dotted path.
   Pure decoration; sits behind everything, denser to the right,
   marking where the illustration will one day live. */
.ql-scene{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
.ql-scene::before,.ql-scene::after{content:"";position:absolute;border-radius:50%;filter:blur(70px)}
.ql-scene::before{width:44vw;height:44vw;right:-8vw;top:-12vw;background:rgba(43,58,96,0.55)}
.ql-scene::after{width:30vw;height:30vw;right:14vw;bottom:-10vw;background:rgba(1,117,147,0.28)}
.ql-scene svg{position:absolute;right:0;top:0;height:100%;width:72vw;opacity:.5}

.ql-stage{position:relative;z-index:1;max-width:1280px;margin:0 auto;
  padding:clamp(40px,7vh,88px) clamp(24px,5vw,72px);
  display:flex;flex-direction:column;min-height:100vh;box-sizing:border-box}
.ql-col{max-width:600px}

.ql-wordmark{font-family:var(--font-body);font-weight:650;font-size:26px;
  letter-spacing:-0.01em;color:var(--jds-white);margin:0}
.ql-wordmark sup{color:var(--jds-blue);font-size:15px;margin-left:1px}
.ql-eyebrow{font-family:var(--font-body);font-size:13px;letter-spacing:.13em;
  color:var(--jds-navy-200);margin:10px 0 0}
.ql-eyebrow span{margin:0 9px;color:var(--jds-navy-500)}
.ql-eyebrow span:first-child{margin-left:0}

.ql-lines{list-style:none;margin:clamp(36px,6vh,64px) 0 0;padding:0}
.ql-lines li{border-top:1px solid rgba(248,248,248,0.08)}
.ql-lines li:last-child{border-bottom:1px solid rgba(248,248,248,0.08)}
.ql-lines a,.ql-lines .ql-plain{display:flex;align-items:baseline;
  justify-content:space-between;gap:24px;text-decoration:none;
  color:rgba(248,248,248,0.92);padding:19px 2px;font-size:clamp(17px,1.6vw,21px);
  font-weight:400;line-height:1.5;text-transform:lowercase}
.ql-lines .txt{transition:transform 180ms ease,color 180ms ease}
.ql-lines .arrow{flex:0 0 auto;color:var(--jds-navy-400);opacity:0;
  transform:translateX(-4px);transition:opacity 180ms ease,transform 180ms ease,color 180ms ease}
.ql-lines a:hover .txt,.ql-lines a:focus-visible .txt{color:var(--jds-blue);transform:translateX(4px)}
.ql-lines a:hover .arrow,.ql-lines a:focus-visible .arrow{opacity:1;transform:translateX(0);color:var(--jds-blue)}
.ql-lines a:focus-visible{outline:2px solid var(--jds-blue);outline-offset:3px;border-radius:2px}
.ql-lines .ql-plain{color:rgba(248,248,248,0.66);cursor:default}

/* staggered arrival */
@keyframes ql-rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
.ql-rise{opacity:0;animation:ql-rise .6s ease-out forwards}
@media (prefers-reduced-motion: reduce){.ql-rise{animation:none;opacity:1}}

.ql-foot{margin-top:auto;padding-top:clamp(40px,7vh,72px);
  font-size:13px;color:var(--jds-navy-200)}
.ql-foot .ql-linkedin{display:inline-block;margin-bottom:10px;color:var(--jds-navy-100);
  text-decoration:none;border-bottom:1px solid rgba(248,248,248,0.18);padding-bottom:1px}
.ql-foot .ql-linkedin:hover{color:var(--jds-blue);border-bottom-color:var(--jds-blue)}
.ql-foot .ql-note{font-style:italic;color:var(--jds-navy-200);margin:0}
.ql-foot .ql-note b{color:var(--jds-blue);font-weight:400}

/* /work spoke: same field, prose column */
.ql-back{display:inline-block;font-size:13px;color:var(--jds-navy-100);
  text-decoration:none;margin-bottom:clamp(28px,5vh,52px);text-transform:lowercase}
.ql-back:hover{color:var(--jds-blue)}
.ql-h1{font-family:var(--font-body);font-weight:650;font-size:clamp(28px,3.4vw,40px);
  letter-spacing:-0.01em;text-transform:lowercase;color:var(--jds-white);margin:0 0 26px}
.ql-prose p{font-size:17px;line-height:1.75;color:rgba(248,248,248,0.88);
  margin:0 0 20px;max-width:56ch}
.ql-prose a{color:var(--jds-blue);text-decoration:none;border-bottom:1px solid rgba(1,186,231,0.4)}
.ql-prose a:hover{border-bottom-color:var(--jds-blue)}

@media(max-width:760px){
  .ql-scene svg{width:140vw;opacity:.32}
  .ql-scene::before{width:80vw;height:80vw;right:-30vw}
  .ql-stage{min-height:100svh}
}

/* ============================================================
   CONTACT FORM (footer CTA on /projects/)
   Replaces the old mailto button. Lives on the cyan .foot
   surface, so fields are white with navy ink and a navy border.
   Constrained + centered on desktop, full-width on mobile.
   ============================================================ */
.contact-form{max-width:440px;margin:28px auto 0;text-align:left;
  display:flex;flex-direction:column;gap:14px}
.contact-field{display:flex;flex-direction:column;gap:6px}
.contact-label{font-size:13px;font-weight:600;letter-spacing:.01em;
  color:var(--jds-blueberry)}
.contact-opt{font-weight:400;color:var(--jds-navy-600)}
.contact-input{width:100%;font-family:var(--font-body);font-size:15px;
  color:var(--jds-blueberry);background:var(--jds-white);
  border:1.5px solid var(--jds-blueberry);border-radius:var(--radius-sm);
  padding:12px 14px;transition:border-color 120ms ease,box-shadow 120ms ease}
.contact-input::placeholder{color:var(--jds-neutral-400)}
.contact-input:focus{outline:none;border-color:var(--jds-blueberry);
  box-shadow:0 0 0 3px rgba(2,23,56,0.18)}
.contact-textarea{resize:vertical;min-height:104px;line-height:1.4}
.contact-form .contact-submit{align-self:flex-start;margin-top:4px}
.contact-submit:disabled{opacity:.6;cursor:default}
.contact-status{margin:0;min-height:1.2em;font-size:14px;font-weight:600;
  color:var(--jds-blueberry)}
.contact-receipt{margin:12px 0;text-align:center;font-size:18px;font-weight:600;
  color:var(--jds-blueberry)}
/* Honeypot: pulled off-screen rather than display:none, which some bots skip. */
.contact-hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

@media(max-width:560px){
  .contact-form{max-width:100%}
  .contact-form .contact-submit{align-self:stretch}
}
