// Devleaps website — Sections shared across all theme variants.

const Hero = ({ variant = "default" }) => {
  return (
    <section id="top" className="dl-section" style={{ paddingTop: 64, paddingBottom: 80, position: "relative", overflow: "hidden" }}>
      <div className="dl-grid-bg" style={{ position: "absolute", inset: 0, opacity: .8, pointerEvents: "none" }} />
      <div className="dl-container" style={{ position: "relative" }}>
        <div style={{ display: "flex", alignItems: "center", gap: 12, marginBottom: 24 }}>
          <span className="dl-pulse" />
          <span className="dl-mono" style={{ color: "var(--fg-muted)" }}>// 2026 · accepting Q3 engagements</span>
        </div>

        <h1 className="dl-display" style={{ maxWidth: "16ch" }}>
          We lead<br />
          engineering teams<br />
          that <span style={{ color: "var(--accent)" }}>ship.</span>
        </h1>

        <div style={{ display: "grid", gridTemplateColumns: "1.4fr 1fr", gap: 64, marginTop: 56, alignItems: "end" }}>
          <p className="dl-body-lg" style={{ maxWidth: "52ch", color: "var(--fg)", fontWeight: 400, fontSize: 22, lineHeight: 1.45 }}>
            Devleaps is a Netherlands-based engineering studio. We build platforms, lead transformations, and embed senior leaders in the orgs that need them. Boutique depth, enterprise rigour. Gone when you no longer need us.
          </p>
          <div style={{ display: "flex", flexDirection: "column", gap: 14, alignItems: "flex-start" }}>
            <a href="#contact" className="dl-btn dl-btn-primary" onClick={(e) => {e.preventDefault();const el = document.getElementById("contact");el && window.scrollTo({ top: el.offsetTop - 64, behavior: "smooth" });}}>
              Start a transformation <Icon name="arrow-right" size={18} />
            </a>
            <a href="#work" className="dl-btn dl-btn-link" onClick={(e) => {e.preventDefault();const el = document.getElementById("work");el && window.scrollTo({ top: el.offsetTop - 64, behavior: "smooth" });}}>
              See recent work
            </a>
          </div>
        </div>

        <div style={{ marginTop: 80, display: "grid", gridTemplateColumns: "repeat(4, 1fr)", gap: 0, borderTop: "1px solid var(--line-strong)", borderBottom: "1px solid var(--line-strong)" }}>
          {[
          ["75+", "engineers in network"],
          ["12", "disciplines · one network"],
          ["4", "hubs · NL · PL · SR · ID"],
          ["Q+1", "average exit horizon"]].
          map(([n, l], i) =>
          <div key={i} style={{ padding: "24px 24px 24px 0", borderRight: i < 3 ? "1px solid var(--line)" : "none", paddingLeft: i > 0 ? 24 : 0 }}>
              <div style={{ fontFamily: "var(--font-display)", fontSize: 48, fontWeight: 700, letterSpacing: "-0.025em", lineHeight: 1, color: "var(--fg)" }}>{n}</div>
              <div className="dl-mono" style={{ marginTop: 8, fontSize: 12, letterSpacing: "0.08em", textTransform: "uppercase" }}>// {l}</div>
            </div>
          )}
        </div>
      </div>
    </section>);

};

const ClientStrip = () =>
<section className="dl-paper" style={{ padding: "32px 0", borderBottom: "1px solid var(--line)" }}>
    <div className="dl-container" style={{ display: "grid", gridTemplateColumns: "200px 1fr", gap: 40, alignItems: "center" }}>
      <Eyebrow>recent clients</Eyebrow>
      <div style={{ display: "flex", gap: 40, flexWrap: "wrap", alignItems: "center", justifyContent: "space-between" }}>
        {CLIENTS.map((n) => <ClientMark key={n} name={n} />)}
      </div>
    </div>
  </section>;


const Services = () => {
  const foundation = SERVICES.find((s) => s.href === "transformation.html") || SERVICES[0];
  const disciplines = SERVICES.filter((s) => s !== foundation);
  return (
    <section id="services" className="dl-section">
      <div className="dl-container">
        <div style={{ marginBottom: 64 }}>
          <Eyebrow>what we do</Eyebrow>
          <h2 className="dl-h1" style={{ marginTop: 16, maxWidth: "16ch" }}>Four disciplines.<br />One connective layer.</h2>
        </div>

        <div style={{ border: "1px solid var(--line-strong)" }}>
          <FoundationTile s={foundation} />
          <div style={{ display: "grid", gridTemplateColumns: "repeat(2, 1fr)", gap: 0, borderTop: "1px solid var(--line-strong)" }}>
            {disciplines.map((s, i) =>
              <ServiceTile key={s.n} s={s} idx={i} total={disciplines.length} />
            )}
          </div>
          <div style={{ padding: 32, borderTop: "1px solid var(--line-strong)", display: "flex", justifyContent: "space-between", alignItems: "center", background: "var(--bg-inset)", flexWrap: "wrap", gap: 16 }}>
            <div className="dl-mono">// don't see your use case? we're always open to new challenges.</div>
            <a className="dl-btn dl-btn-link" href="#contact" onClick={(e) => {e.preventDefault();const el = document.getElementById("contact");el && window.scrollTo({ top: el.offsetTop - 64, behavior: "smooth" });}}>
              Talk to us →
            </a>
          </div>
        </div>
      </div>
    </section>);

};

const FoundationTile = ({ s }) => {
  const [hover, setHover] = React.useState(false);
  return (
    <a
      href={s.href || "#"}
      onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}
      style={{
        display: "grid",
        gridTemplateColumns: "minmax(220px, 320px) 1fr 40px",
        gap: 40,
        alignItems: "center",
        padding: "32px 40px 32px 56px",
        background: hover ? "var(--bg-elev)" : "var(--bg)",
        position: "relative",
        textDecoration: "none",
        color: "inherit",
        transition: "background var(--dur-2) var(--ease-out)",
      }}>
      <div style={{ position: "absolute", left: 0, top: 0, bottom: 0, width: 6, background: "var(--accent)" }} />
      <div>
        <div className="dl-mono" style={{ color: hover ? "var(--accent)" : "var(--fg-muted)", fontSize: 12, letterSpacing: "0.14em", textTransform: "uppercase", marginBottom: 10, transition: "color var(--dur-2)" }}>
          // {s.n} · the connective layer
        </div>
        <h3 style={{
          fontFamily: "var(--font-display)",
          fontSize: 32,
          fontWeight: 700,
          letterSpacing: "-0.02em",
          textTransform: "uppercase",
          lineHeight: 1.0,
          margin: 0,
          color: "var(--fg)",
          maxWidth: "16ch",
        }}>{s.title}</h3>
      </div>
      <p className="dl-body" style={{ margin: 0, maxWidth: "62ch" }}>{s.body}</p>
      <div style={{
        color: hover ? "var(--accent)" : "var(--fg-muted)",
        transform: hover ? "translate(2px,-2px)" : "none",
        transition: "all var(--dur-2)",
        display: "flex", alignItems: "center", justifyContent: "center",
      }}>
        <Icon name="arrow-up-right" size={24} />
      </div>
    </a>);

};


const ServiceTile = ({ s, idx, total = 4 }) => {
  const [hover, setHover] = React.useState(false);
  const cols = 2;
  const isRightCol = idx % cols === cols - 1;
  const isLastRow = idx >= total - cols;
  return (
    <a
      href={s.href || "#"}
      onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}
      style={{
        padding: 40, position: "relative", display: "block",
        borderRight: !isRightCol ? "1px solid var(--line-strong)" : "none",
        borderBottom: !isLastRow ? "1px solid var(--line-strong)" : "none",
        background: hover ? "var(--bg-elev)" : "var(--bg)",
        transition: "background var(--dur-2) var(--ease-out)",
        cursor: "pointer", minHeight: 280,
        textDecoration: "none", color: "inherit"
      }}>
      <div style={{ display: "flex", justifyContent: "space-between", alignItems: "flex-start", marginBottom: 24 }}>
        <span className="dl-mono" style={{ color: hover ? "var(--accent)" : "var(--fg-muted)", fontSize: 14 }}>// {s.n}</span>
        <Icon name={s.icon} size={28} style={{ color: hover ? "var(--accent)" : "var(--fg)" }} />
      </div>
      <h3 className="dl-h3" style={{ marginBottom: 16, color: "var(--fg)" }}>{s.title}</h3>
      <p className="dl-body" style={{ maxWidth: "44ch" }}>{s.body}</p>
      <div style={{ position: "absolute", right: 24, bottom: 24, opacity: hover ? 1 : 0, transform: hover ? "translateX(0)" : "translateX(-6px)", transition: "all var(--dur-2)" }}>
        <Icon name="arrow-up-right" size={22} style={{ color: "var(--accent)" }} />
      </div>
    </a>);

};

// What we hear — the recurring pressures, voiced from the customer's seat.
// Two anonymised composites; between them they cover all four: reliability &
// compliance, cost & efficiency, time-to-value, and scaling innovation + teams.
const QUOTES = [
  {
    who: "CFO",
    sector: "Retail",
    quote: "Our cloud bill climbs every year, and I can't see what it's actually getting us. The yearly audits eat up months. I want fewer surprises, more value for the money, and to know our systems are safe before I put my name on them.",
  },
  {
    who: "Engineering manager",
    sector: "Energy",
    quote: "Buying the tools was the easy part. Getting them live, and getting the team to actually use them, is the hard part. Other companies are racing ahead with AI while we're still waiting days just to ship a small change.",
  },
];

// How we answer: the five principles that make us different and let us deliver.
const ANSWERS = [
  { n: "01", k: "Integrated, not isolated",  short: "One connected network, with the right specialist for each layer. No finger-pointing." },
  { n: "02", k: "End to end",               short: "From first sketch to production to a clean handover. We don't build and leave." },
  { n: "03", k: "Engineering excellence",   short: "We grow your team's skills, not a dependency on us. Best people, best practices." },
  { n: "04", k: "Boutique meets enterprise", short: "Small-team depth with big-company rigour. Local hubs, one network." },
  { n: "05", k: "We've lived it",           short: "We've built these platforms, scaled them, and fixed them in production with our teams for our clients." },
];

const QuoteCard = ({ q }) => (
  <figure className="dl-quote-card">
    <span className="dl-quote-mark" aria-hidden="true">"</span>
    <blockquote className="dl-quote-text">{q.quote}</blockquote>
    <figcaption className="dl-quote-cite">
      <span className="dl-quote-who">{q.who}</span>
      <span className="dl-quote-sector">// {q.sector}</span>
    </figcaption>
  </figure>
);

const DisciplineTile = ({ a, idx, total }) => {
  const [hover, setHover] = React.useState(false);
  return (
    <div
      onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}
      style={{
        display: "flex", flexDirection: "column", gap: 14,
        padding: "26px 22px 22px",
        color: "inherit",
        background: hover ? "rgba(255,255,255,.045)" : "rgba(255,255,255,.02)",
        borderRight: idx < total - 1 ? "1px solid rgba(255,255,255,.10)" : "none",
        transition: "background var(--dur-2) var(--ease-out)",
        position: "relative", minWidth: 0,
      }}>
      <div style={{
        position: "absolute", left: 0, top: 0, height: 3, width: "100%",
        background: "var(--accent)",
        transform: hover ? "scaleX(1)" : "scaleX(0)", transformOrigin: "left",
        transition: "transform var(--dur-2) var(--ease-out)",
      }}/>
      <div style={{ display: "flex", alignItems: "center" }}>
        <span style={{
          fontFamily: "var(--font-mono)", fontSize: 13, fontWeight: 600,
          letterSpacing: "0.16em", color: "var(--accent)",
          display: "inline-flex", alignItems: "center", gap: 8,
        }}>
          <span style={{ display: "inline-block", width: 7, height: 7, background: "var(--accent)" }}/>
          {a.n}
        </span>
      </div>
      <h4 style={{
        margin: 0, fontFamily: "var(--font-display)", fontSize: 17, fontWeight: 700,
        textTransform: "uppercase", letterSpacing: "-0.01em", lineHeight: 1.12,
        color: "var(--fg-on-dark)", minHeight: 38,
      }}>{a.k}</h4>
      <p style={{
        margin: 0, fontSize: 13, lineHeight: 1.5, color: "rgba(255,255,255,.7)",
      }}>{a.short}</p>
    </div>
  );
};

const ManifestoBridge = () => (
  <div style={{
    display: "flex", alignItems: "center", gap: 18, margin: "40px 0 32px", overflow: "hidden",
  }}>
    <span className="dl-mono" style={{
      fontSize: 11, letterSpacing: "0.16em", textTransform: "uppercase",
      color: "rgba(255,255,255,.6)", whiteSpace: "nowrap", flexShrink: 0,
    }}>// we hear this everywhere</span>
    <div style={{ position: "relative", height: 1, flex: "1 1 20px", minWidth: 0 }}>
      <div style={{
        position: "absolute", inset: 0,
        background: "repeating-linear-gradient(90deg, rgba(255,255,255,.22) 0 6px, transparent 6px 12px)",
      }}/>
    </div>
    <span style={{
      display: "inline-flex", alignItems: "center", gap: 8, flexShrink: 0,
      fontFamily: "var(--font-mono)", fontSize: 11, letterSpacing: "0.14em",
      textTransform: "uppercase", color: "var(--accent)",
      padding: "7px 13px", border: "1px solid var(--accent)", whiteSpace: "nowrap",
    }}>↓ how we answer</span>
  </div>
);

const Manifesto = () =>
<section id="manifesto" className="dl-section" style={{ background: "var(--bg-dark)", color: "var(--fg-on-dark)" }}>
    <div className="dl-container">
      <div className="dl-2col-header" style={{ marginBottom: 132 }}>
        <div>
          <Eyebrow style={{ color: "var(--accent)" }}>the manifesto</Eyebrow>
          <h2 className="dl-h1" style={{ color: "var(--fg-on-dark)", marginTop: 16, maxWidth: "14ch" }}>
            What we hear.<br/><span style={{ fontStyle: "italic", color: "var(--accent)" }}>How we answer.</span>
          </h2>
        </div>
        <p className="dl-body-lg" style={{ color: "rgba(255,255,255,.75)", maxWidth: "46ch", margin: 0, paddingBottom: 6 }}>
          Different industries, different roles and yet familiar patterns keep showing up. Working side by side with our clients, we come back to five disciplines that consistently create momentum.
        </p>
      </div>

      {/* WHAT WE HEAR — two voices, side by side */}
      <div className="dl-mfest-header">
        <span className="dl-mono" style={{ opacity: .55 }}>// what we hear</span>
        <span className="dl-mono" style={{ opacity: .4 }}>different roles · same story</span>
      </div>
      <div className="dl-quote-row">
        {QUOTES.map((q) => <QuoteCard key={q.who + q.sector} q={q} />)}
      </div>

      {/* BRIDGE — the turn from problem to response */}
      <ManifestoBridge />

      {/* HOW WE ANSWER — the five disciplines, as a strip */}
      <div className="dl-mfest-header">
        <span className="dl-mono" style={{ opacity: .55 }}>// how we answer · what makes us different</span>
        <span className="dl-mono" style={{ opacity: .4 }}>one network</span>
      </div>
      <div className="dl-discipline-strip">
        {ANSWERS.map((a, i) => <DisciplineTile key={a.n} a={a} idx={i} total={ANSWERS.length} />)}
      </div>

      <style>{`
        .dl-quote-row {
          display: grid;
          grid-template-columns: 1fr 1fr;
          gap: 16px;
          margin-bottom: 4px;
        }
        .dl-discipline-strip {
          display: grid;
          grid-template-columns: repeat(5, 1fr);
          border: 1px solid rgba(255,255,255,.12);
          background: rgba(255,255,255,.01);
        }
        .dl-mfest-header {
          display: flex;
          justify-content: space-between;
          align-items: baseline;
          gap: 16px;
          margin-bottom: 16px;
          padding: 0 4px;
        }
        .dl-mfest-header span { white-space: nowrap; }
        .dl-mfest-card {
          background: rgba(255,255,255,.025);
          border: 1px solid rgba(255,255,255,.10);
          padding: 4px 0;
        }
        .dl-mfest-row {
          display: flex;
          align-items: center;
          gap: 22px;
          padding: 22px 26px;
        }
        .dl-mfest-num {
          font-family: var(--font-mono);
          font-size: 22px;
          font-weight: 700;
          color: var(--accent);
          min-width: 36px;
          letter-spacing: -0.02em;
        }
        .dl-mfest-pnum {
          font-family: var(--font-mono);
          font-size: 12px;
          color: rgba(255,255,255,.5);
          letter-spacing: .1em;
          padding-top: 4px;
          min-width: 32px;
        }
        .dl-mfest-h {
          margin: 0 0 4px;
          font-family: var(--font-display);
          font-size: 14px;
          font-weight: 700;
          color: #fff;
          text-transform: uppercase;
          letter-spacing: .06em;
        }
        .dl-mfest-p {
          margin: 0;
          font-size: 13px;
          color: rgba(255,255,255,.62);
          line-height: 1.5;
        }
        .dl-mfest-thread {
          margin-top: 18px;
          background: rgba(255,255,255,.025);
          border: 1px solid rgba(255,255,255,.10);
          border-left: 3px solid var(--accent);
          padding: 18px 22px;
        }
        .dl-quote-card {
          background: rgba(255,255,255,.025);
          border: 1px solid rgba(255,255,255,.10);
          border-left: 3px solid var(--accent);
          padding: 24px 28px 22px;
          margin: 0;
          transition: background .2s ease, transform .2s ease;
        }
        .dl-quote-card:hover {
          background: rgba(255,255,255,.045);
          transform: translateX(2px);
        }
        .dl-quote-mark {
          display: block;
          font-family: var(--font-display);
          font-size: 52px;
          line-height: .5;
          height: 26px;
          color: var(--accent);
        }
        .dl-quote-text {
          margin: 0 0 18px;
          font-size: 16px;
          line-height: 1.55;
          color: rgba(255,255,255,.9);
          font-weight: 400;
          text-wrap: pretty;
        }
        .dl-quote-cite {
          display: flex;
          align-items: baseline;
          gap: 12px;
          flex-wrap: wrap;
          padding-top: 14px;
          border-top: 1px dashed rgba(255,255,255,.14);
        }
        .dl-quote-who {
          font-family: var(--font-display);
          font-size: 14px;
          font-weight: 700;
          color: #fff;
          text-transform: uppercase;
          letter-spacing: .04em;
        }
        .dl-quote-sector {
          font-family: var(--font-mono);
          font-size: 11px;
          letter-spacing: .14em;
          text-transform: uppercase;
          color: var(--accent);
        }
        .dl-mfest-principle {
          background: rgba(255,255,255,.025);
          border: 1px solid rgba(255,255,255,.10);
          border-left: 3px solid var(--accent);
          padding: 20px 24px;
          display: flex;
          gap: 18px;
          align-items: flex-start;
          transition: background .2s ease, transform .2s ease;
        }
        .dl-mfest-principle:hover {
          background: rgba(255,255,255,.045);
          transform: translateX(2px);
        }
        @media (max-width: 960px) {
          .dl-quote-row { grid-template-columns: 1fr; }
          .dl-discipline-strip { grid-template-columns: 1fr 1fr; }
          .dl-discipline-strip > a { border-right: 1px solid rgba(255,255,255,.10); border-bottom: 1px solid rgba(255,255,255,.10); }
        }
        @media (max-width: 560px) {
          .dl-discipline-strip { grid-template-columns: 1fr; }
        }
      `}</style>
    </div>
  </section>;


const Work = () => {
  const [filter, setFilter] = React.useState("all");
  const tags = ["all", ...new Set(WORK.map((w) => w.tag))];
  const filtered = filter === "all" ? WORK : WORK.filter((w) => w.tag === filter);
  return (
    <section id="work" className="dl-section dl-paper">
      <div className="dl-container">
        <div style={{ display: "flex", justifyContent: "space-between", alignItems: "end", marginBottom: 48, gap: 32, flexWrap: "wrap" }}>
          <div>
            <Eyebrow>recent work</Eyebrow>
            <h2 className="dl-h1" style={{ marginTop: 16, maxWidth: "12ch" }}>Outcomes.<br />Not slides.</h2>
          </div>
          <div style={{ display: "flex", gap: 4, border: "1px solid var(--line-strong)" }}>
            {tags.map((t) =>
            <button key={t} onClick={() => setFilter(t)} style={{
              background: filter === t ? "var(--fg)" : "transparent",
              color: filter === t ? "var(--bg)" : "var(--fg-muted)",
              border: "none", padding: "8px 14px", cursor: "pointer",
              fontFamily: "var(--font-mono)", fontSize: 11, letterSpacing: "0.12em", textTransform: "uppercase",
              transition: "all var(--dur-2)"
            }}>{t}</button>
            )}
          </div>
        </div>

        <div style={{ display: "flex", flexDirection: "column" }}>
          {filtered.map((w, i) =>
          <WorkRow key={w.client + w.year} w={w} idx={i} />
          )}
        </div>
      </div>
    </section>);

};

const WorkRow = ({ w }) => {
  const [hover, setHover] = React.useState(false);
  const [logoErr, setLogoErr] = React.useState(false);
  const logo = typeof CLIENT_LOGOS !== "undefined" && CLIENT_LOGOS[w.client];
  return (
    <div
      onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}
      style={{
        display: "grid", gridTemplateColumns: "100px 1.5fr 1fr 2fr 40px", gap: 32, alignItems: "center",
        padding: "28px 8px", borderTop: "1px solid var(--line-strong)",
        background: hover ? "var(--bg-inset)" : "transparent",
        transition: "background var(--dur-2)",
        cursor: "pointer"
      }}>
      <span className="dl-mono" style={{ color: hover ? "var(--accent)" : "var(--fg-muted)" }}>// {w.year}</span>
      {logo && !logoErr ?
      <span style={{ display: "flex", alignItems: "center", height: 36 }}>
          <img
          src={logo} alt={w.client}
          onError={() => setLogoErr(true)}
          style={{
            height: 32, width: "auto", maxWidth: 180, objectFit: "contain",
            filter: hover ? "none" : "grayscale(1) contrast(1.05)",
            opacity: hover ? 1 : .78,
            transition: "filter var(--dur-2), opacity var(--dur-2)"
          }} />

        </span> :

      <span style={{ fontFamily: "var(--font-display)", fontWeight: 700, fontSize: 28, letterSpacing: "-0.02em", color: "var(--fg)", textTransform: "uppercase" }}>{w.client}</span>
      }
      <span className="dl-mono" style={{ color: "var(--fg-muted)", textTransform: "uppercase", letterSpacing: "0.08em", fontSize: 11 }}>{w.role}</span>
      <span style={{ color: "var(--fg)", fontSize: 16 }}>{w.outcome}</span>
      <Icon name="arrow-up-right" size={20} style={{ color: hover ? "var(--accent)" : "var(--fg-muted)", transform: hover ? "translate(2px,-2px)" : "none", transition: "all var(--dur-2)" }} />
    </div>);

};

const Team = () =>
<section id="team" className="dl-section dl-paper">
    <div className="dl-container">
      <div className="dl-2col-header" style={{ marginBottom: 56 }}>
        <div>
          <Eyebrow>the team</Eyebrow>
          <h2 className="dl-h1" style={{ marginTop: 16, maxWidth: "16ch" }}>Smart, human, a little geeky.</h2>
        </div>
        <p className="dl-body-lg" style={{ maxWidth: "46ch" }}>
          A core crew of fifteen, backed by 75+ engineers across our network. The ones who answer messages on Saturday because they genuinely care.
        </p>
      </div>
      <div className="dl-team-grid">
        {TEAM.map((m) => <TeamCard key={m.name} m={m} />)}
        <NetworkSlot />
      </div>
    </div>
  </section>;


const NetworkSlot = () => {
  const [hover, setHover] = React.useState(false);
  return (
    <div onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}
      style={{
        background: "var(--bg-dark)", color: "var(--fg-on-dark)",
        position: "relative", overflow: "hidden",
        aspectRatio: "4 / 5", display: "flex", flexDirection: "column",
      }}>
      <div className="dl-grid-bg" style={{ position: "absolute", inset: 0, opacity: .35, pointerEvents: "none" }} />

      {/* index label — matches TeamCard convention */}
      <div style={{
        position: "absolute", left: 14, top: 14,
        fontFamily: "var(--font-mono)", fontSize: 10, letterSpacing: "0.14em",
        color: "var(--accent)", background: "rgba(10,10,9,.78)",
        padding: "5px 9px", textTransform: "uppercase",
        backdropFilter: "blur(6px)"
      }}>// network</div>

      {/* online pulse — top right */}
      <div style={{
        position: "absolute", right: 14, top: 14,
        fontFamily: "var(--font-mono)", fontSize: 10, letterSpacing: "0.14em",
        color: "rgba(250,250,247,.7)", textTransform: "uppercase",
        display: "inline-flex", alignItems: "center", gap: 6,
        background: "rgba(10,10,9,.78)", padding: "5px 9px",
        backdropFilter: "blur(6px)"
      }}>
        <span className="dl-pulse" style={{ width: 6, height: 6 }} /> online
      </div>

      {/* 75+ figure — center-ish */}
      <div style={{
        position: "absolute", inset: 0, display: "flex",
        alignItems: "center", justifyContent: "center", paddingBottom: "30%"
      }}>
        <div style={{ display: "flex", alignItems: "baseline", gap: 4, transform: hover ? "scale(1.02)" : "scale(1)", transition: "transform var(--dur-2) var(--ease-out)" }}>
          <span style={{
            fontFamily: "var(--font-display)", fontWeight: 700,
            fontSize: "clamp(56px, 6.4vw, 104px)",
            lineHeight: 0.85, letterSpacing: "-0.045em", color: "#FAFAF7",
          }}>75</span>
          <span style={{
            fontFamily: "var(--font-display)", fontWeight: 700,
            fontSize: "clamp(40px, 4.6vw, 76px)",
            lineHeight: 0.85, letterSpacing: "-0.04em", color: "var(--accent)",
          }}>+</span>
        </div>
      </div>

      {/* bottom gradient + label */}
      <div style={{
        position: "absolute", inset: 0, pointerEvents: "none",
        background: "linear-gradient(180deg, transparent 45%, rgba(10,10,9,.92) 100%)",
      }} />
      <div style={{ position: "absolute", left: 18, right: 18, bottom: 16, color: "#FAFAF7" }}>
        <div style={{
          fontFamily: "var(--font-display)", fontWeight: 700, fontSize: 22,
          letterSpacing: "-0.015em", textTransform: "uppercase", lineHeight: 1
        }}>The network</div>
        <div className="dl-mono" style={{
          marginTop: 6, fontSize: 11, letterSpacing: "0.1em",
          color: "rgba(250,250,247,.78)", textTransform: "uppercase"
        }}>4 hubs · NL · PL · SR · ID</div>
      </div>
    </div>
  );
};

const TeamCard = ({ m }) => {
  const [hover, setHover] = React.useState(false);
  const [imgErr, setImgErr] = React.useState(false);
  return (
    <div onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}
      style={{ background: "var(--bg-dark)", position: "relative", overflow: "hidden", display: "flex", flexDirection: "column", aspectRatio: "4 / 5" }}>
      {m.photo && !imgErr ? (
        <img src={m.photo} alt={m.name} onError={() => setImgErr(true)}
          style={{ position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover",
            filter: hover ? "none" : "grayscale(1) contrast(1.04)",
            transform: hover ? "scale(1.04)" : "scale(1)",
            transition: "filter var(--dur-2) var(--ease-out), transform var(--dur-3) var(--ease-out)" }} />
      ) : (
        <div style={{ position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center",
          fontFamily: "var(--font-display)", fontWeight: 700, fontSize: 96, color: "var(--accent)",
          background: "var(--bg-elev)" }}>{m.name[0]}</div>
      )}
      <div style={{ position: "absolute", left: 14, top: 14, fontFamily: "var(--font-mono)", fontSize: 10,
        letterSpacing: "0.14em", color: "var(--accent)", background: "rgba(10,10,9,.78)", padding: "5px 9px",
        textTransform: "uppercase", backdropFilter: "blur(6px)" }}>// {String(TEAM.indexOf(m) + 1).padStart(2, "0")}</div>
      <div style={{ position: "absolute", inset: 0, pointerEvents: "none",
        background: "linear-gradient(180deg, transparent 45%, rgba(10,10,9,.92) 100%)",
        opacity: hover ? 1 : 0.85, transition: "opacity var(--dur-2) var(--ease-out)" }} />
      <div style={{ position: "absolute", left: 18, right: 18, bottom: 16, color: "#FAFAF7" }}>
        <div style={{ fontFamily: "var(--font-display)", fontWeight: 700, fontSize: 24,
          letterSpacing: "-0.015em", textTransform: "uppercase", lineHeight: 1 }}>{m.name}</div>
        <div className="dl-mono" style={{ marginTop: 6, fontSize: 11, letterSpacing: "0.1em",
          color: "rgba(250,250,247,.78)", textTransform: "uppercase" }}>{m.role}</div>
        <div style={{
          marginTop: 10, fontFamily: "var(--font-body)", fontSize: 13, lineHeight: 1.5,
          color: "rgba(250,250,247,.82)",
          maxHeight: hover ? 80 : 0, opacity: hover ? 1 : 0, overflow: "hidden",
          transition: "all var(--dur-2) var(--ease-out)"
        }}>{m.hook}</div>
      </div>
    </div>);

};

const HumanQuote = ({ photo, name, role, quote, eyebrow = "// in our words", flip = false }) => {
  const [imgErr, setImgErr] = React.useState(false);
  const portrait = (
    <div style={{ position: "relative", aspectRatio: "4 / 5", background: "var(--bg-dark)", overflow: "hidden", minWidth: 0 }}>
      {photo && !imgErr ? (
        <img src={photo} alt={name} onError={() => setImgErr(true)}
          style={{ width: "100%", height: "100%", objectFit: "cover", filter: "grayscale(0.15) contrast(1.04)" }} />
      ) : (
        <div style={{ position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center",
          fontFamily: "var(--font-display)", fontWeight: 700, fontSize: 120, color: "var(--accent)" }}>{name[0]}</div>
      )}
      <div style={{ position: "absolute", left: 0, top: 0, padding: "8px 14px", fontFamily: "var(--font-mono)",
        fontSize: 10, letterSpacing: "0.16em", color: "var(--accent)", background: "rgba(10,10,9,.88)",
        textTransform: "uppercase" }}>{eyebrow}</div>
    </div>);

  const text = (
    <div style={{ minWidth: 0 }}>
      <div aria-hidden style={{ fontFamily: "var(--font-display)", fontWeight: 700, fontSize: 120, lineHeight: 0.7,
        color: "var(--accent)", marginBottom: 4, letterSpacing: "-0.04em" }}>"</div>
      <p style={{ fontFamily: "var(--font-display)", fontWeight: 600,
        fontSize: "clamp(26px, 3vw, 42px)", lineHeight: 1.18, letterSpacing: "-0.02em",
        margin: 0, textWrap: "balance", color: "var(--fg)", maxWidth: "26ch" }}>{quote}</p>
      <div style={{ marginTop: 32, display: "flex", alignItems: "center", gap: 16, flexWrap: "wrap" }}>
        <span style={{ width: 36, height: 1, background: "var(--accent)" }} />
        <span style={{ fontFamily: "var(--font-display)", fontWeight: 700, fontSize: 18, letterSpacing: "-0.01em", textTransform: "uppercase" }}>{name}</span>
        <span className="dl-mono" style={{ fontSize: 11, letterSpacing: "0.12em", color: "var(--fg-muted)", textTransform: "uppercase" }}>{role}</span>
      </div>
    </div>);

  return (
    <section className="dl-section dl-paper" style={{ borderTop: "1px solid var(--line)", borderBottom: "1px solid var(--line)", paddingBlock: "clamp(56px, 6vw, 88px)" }}>
      <style>{`
        .dl-human-quote-grid { display: grid; gap: 56px; align-items: center; }
        .dl-human-quote-grid.dl-flip { grid-template-columns: 1fr minmax(0, 260px); }
        .dl-human-quote-grid:not(.dl-flip) { grid-template-columns: minmax(0, 260px) 1fr; }
        @media (max-width: 900px) {
          .dl-human-quote-grid, .dl-human-quote-grid.dl-flip { grid-template-columns: 1fr !important; gap: 32px; }
        }
      `}</style>
      <div className="dl-container">
        <div className={`dl-human-quote-grid${flip ? " dl-flip" : ""}`}>
          {flip ? <>{text}{portrait}</> : <>{portrait}{text}</>}
        </div>
      </div>
    </section>);

};

const LocationsGrid = () => {
  const containerRef = React.useRef(null);
  const getCols = (w) => {
    if (w <= 560) return "1fr";
    if (w <= 1024) return "repeat(2, 1fr)";
    return "repeat(4, 1fr)";
  };
  const [cols, setCols] = React.useState("repeat(4, 1fr)");
  React.useEffect(() => {
    const el = containerRef.current;
    if (!el) return;
    const ro = new ResizeObserver((entries) => {
      const w = entries[0].contentRect.width;
      setCols(getCols(w));
    });
    ro.observe(el);
    setCols(getCols(el.getBoundingClientRect().width));
    return () => ro.disconnect();
  }, []);
  return (
    <div ref={containerRef} style={{ display: "grid", gridTemplateColumns: cols, gap: 16, marginTop: 32 }}>
      {LOCATIONS.map((loc) => (
        <div key={loc.city} className="dl-card" style={{ padding: 24 }}>
          <div style={{ display: "flex", justifyContent: "space-between", alignItems: "flex-start", marginBottom: 16 }}>
            <span style={{ fontFamily: "var(--font-mono)", fontSize: 14, color: "var(--accent)", letterSpacing: "0.1em", fontWeight: 600 }}>{loc.code}</span>
            <span style={{ fontFamily: "var(--font-mono)", fontSize: 10, padding: "3px 8px", border: "1px solid var(--line-strong)", color: loc.status === "active" ? "var(--accent)" : "var(--fg-muted)", letterSpacing: "0.08em", textTransform: "uppercase" }}>
              {loc.status === "active" ? "● active" : "○ opening"}
            </span>
          </div>
          <div style={{ fontFamily: "var(--font-display)", fontSize: 24, fontWeight: 700, color: "var(--fg)", letterSpacing: "-0.02em", marginBottom: 4, textTransform: "uppercase" }}>{loc.city}</div>
          <div className="dl-mono" style={{ fontSize: 12, color: "var(--fg-muted)", marginBottom: 12 }}>{loc.role}</div>
          <div style={{ fontSize: 13, color: "var(--fg-muted)", paddingTop: 12, borderTop: "1px solid var(--line)" }}>{loc.meta}</div>
        </div>
      ))}
    </div>
  );
};

const Process = () =>
<section id="process" className="dl-section">
    <style>{`
      .dl-process-phases { display: grid; grid-template-columns: repeat(4, 1fr); gap: 0; border: 1px solid var(--line-strong); }
      .dl-locations-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); gap: 16px; margin-top: 32px; }
      @media (max-width: 900px) {
        .dl-process-phases { grid-template-columns: repeat(2, 1fr); }
        .dl-process-phases > div { border-right: none !important; border-bottom: 1px solid var(--line-strong); }
      }
      @media (max-width: 560px) {
        .dl-process-phases { grid-template-columns: 1fr; }
      }
    `}</style>
    <div className="dl-container">
      <div className="dl-2col-header" style={{ marginBottom: 56 }}>
        <div>
          <Eyebrow>the process</Eyebrow>
          <h2 className="dl-h1" style={{ marginTop: 16, maxWidth: "14ch" }}>Land. Build.<br />Hand back.</h2>
        </div>
        <p className="dl-body-lg" style={{ maxWidth: "44ch" }}>
          Most engagements run 6–18 months. Some longer. None forever. The exit is in the contract on day one.
        </p>
      </div>

      <div className="dl-process-phases">
        {PROCESS.map((p, i) =>
      <div key={p.n} style={{ padding: 32, borderRight: i < 3 ? "1px solid var(--line-strong)" : "none", position: "relative", background: "var(--bg-elev)" }}>
            <div style={{ position: "absolute", top: 0, left: 0, right: 0, height: 3, background: i === 0 ? "var(--accent)" : "var(--line)" }} />
            <div className="dl-mono" style={{ color: "var(--accent)", fontSize: 12, letterSpacing: "0.1em", marginBottom: 24 }}>{p.phase}</div>
            <div style={{ fontFamily: "var(--font-display)", fontSize: 64, fontWeight: 700, color: "var(--fg)", letterSpacing: "-0.04em", lineHeight: 0.9, marginBottom: 16 }}>{p.n}</div>
            <h3 className="dl-h3" style={{ marginBottom: 12 }}>{p.t}</h3>
            <p className="dl-body" style={{ margin: 0 }}>{p.d}</p>
          </div>
      )}
      </div>

      <LocationsGrid />
    </div>
  </section>;


const Contact = () => {
  const contactLinks = [
    {
      href: "mailto:hello@devleaps.nl",
      label: "hello@devleaps.nl",
      hoverColor: "var(--accent)",
      icon: <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m2 7 10 7 10-7"/></svg>,
    },
    {
      href: "https://wa.me/31612264319",
      label: "WhatsApp",
      hoverColor: "#25D366",
      icon: <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>,
    },
    {
      href: "https://signal.me/#p/+31612264319",
      label: "Signal",
      hoverColor: "#3A76F0",
      icon: <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 0a12 12 0 1 0 0 24A12 12 0 0 0 12 0zm-.676 2.81a9.448 9.448 0 0 1 2.565.516l-.42.78a8.57 8.57 0 0 0-2.145-.42zm-1.404.587a9.39 9.39 0 0 1 .86-.208v.876a8.55 8.55 0 0 0-.648.167zm4.924.19a9.39 9.39 0 0 1 2.122 1.24l-.564.636a8.54 8.54 0 0 0-1.776-1.037zm-8.174.802A9.39 9.39 0 0 1 8.79 3.15l.564.636a8.54 8.54 0 0 0-1.776 1.037zM3.327 6.67a9.39 9.39 0 0 1 1.24-2.122l.636.564A8.54 8.54 0 0 0 4.166 6.89zm16.105-.552a9.39 9.39 0 0 1 .802 2.331l-.864.18a8.54 8.54 0 0 0-.671-1.947zM2.81 8.324A9.39 9.39 0 0 1 3.327 6l.839.348a8.54 8.54 0 0 0-.444 1.956zm18.38.348a9.39 9.39 0 0 1 .208.86l-.876.12a8.55 8.55 0 0 0-.167-.648zM2.618 10.4a9.448 9.448 0 0 1-.516-2.565l.876.072a8.57 8.57 0 0 0 .42 2.145zm18.88-.42.876-.072a9.448 9.448 0 0 1-.516 2.565l-.78-.42a8.57 8.57 0 0 0 .42-2.073zM8.25 12a3.75 3.75 0 1 1 7.5 0 3.75 3.75 0 0 1-7.5 0zm-5.632.324.864-.18a8.54 8.54 0 0 0 .671 1.947l-.839.348a9.39 9.39 0 0 1-.696-2.115zm19.002 2.115-.839-.348a8.54 8.54 0 0 0 .671-1.947l.864.18a9.39 9.39 0 0 1-.696 2.115zm-16.29 2.23a9.39 9.39 0 0 1-1.24-2.122l.839-.348a8.54 8.54 0 0 0 1.037 1.776zm14.34-2.122a9.39 9.39 0 0 1-1.24 2.122l-.636-.564a8.54 8.54 0 0 0 1.037-1.776zM5.67 18.33a9.39 9.39 0 0 1-2.122-1.24l.564-.636a8.54 8.54 0 0 0 1.776 1.037zm12.78-1.24a9.39 9.39 0 0 1-2.122 1.24l-.348-.839a8.54 8.54 0 0 0 1.776-1.037zM8.324 21.19a9.39 9.39 0 0 1-2.331-.802l.348-.839a8.54 8.54 0 0 0 1.947.671zm7.352-.802a9.39 9.39 0 0 1-2.331.802l-.18-.864a8.54 8.54 0 0 0 1.947-.671zm-4.352.996a9.448 9.448 0 0 1-1.648-.372l.42-.78a8.57 8.57 0 0 0 1.3.276zm1.352 0v-.876a8.55 8.55 0 0 0 1.3-.276l.42.78a9.448 9.448 0 0 1-1.72.372z"/></svg>,
    },
    {
      href: "https://www.linkedin.com/company/devleaps",
      label: "LinkedIn",
      hoverColor: "#0A66C2",
      icon: <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>,
    },
  ];

  return (
    <section id="contact" className="dl-section" style={{ background: "var(--bg-dark)", color: "var(--fg-on-dark)", position: "relative", overflow: "hidden" }}>
      <div className="dl-grid-bg" style={{ position: "absolute", inset: 0, opacity: .35 }} />
      <div className="dl-container" style={{ position: "relative" }}>
        <style>{`
          .dl-contact-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 96px; align-items: center; }
          @media (max-width: 768px) { .dl-contact-grid { grid-template-columns: 1fr; gap: 48px; } }
        `}</style>
        <div className="dl-contact-grid">
          <div>
            <Eyebrow style={{ color: "var(--accent)" }}>talk to us</Eyebrow>
            <h2 className="dl-display" style={{ color: "var(--fg-on-dark)", marginTop: 16, fontSize: "clamp(48px, 7vw, 112px)" }}>
              Got a vision?<br />Send the <span style={{ color: "var(--accent)" }}>outline.</span>
            </h2>
            <p style={{ color: "rgba(255,255,255,.72)", fontSize: 18, lineHeight: 1.55, marginTop: 32, maxWidth: "44ch" }}>
              We reply within one business day.
            </p>
          </div>

          <div style={{ display: "flex", flexDirection: "column", gap: 16 }}>
            {contactLinks.map(({ href, label, hoverColor, icon }) => (
              <ContactLink key={label} href={href} label={label} hoverColor={hoverColor} icon={icon} />
            ))}
            <div style={{ marginTop: 8, fontFamily: "var(--font-mono)", fontSize: 13, color: "rgba(255,255,255,.4)", paddingTop: 16, borderTop: "1px solid rgba(255,255,255,.1)" }}>
              Bijlmermeerstraat 18A · 2131 HG Hoofddorp · NL
            </div>
          </div>
        </div>
      </div>
    </section>
  );
};

const ContactLink = ({ href, label, hoverColor, icon }) => {
  const [hovered, setHovered] = React.useState(false);
  return (
    <a
      href={href}
      target={href.startsWith("mailto") ? undefined : "_blank"}
      rel={href.startsWith("mailto") ? undefined : "noopener noreferrer"}
      onMouseEnter={() => setHovered(true)}
      onMouseLeave={() => setHovered(false)}
      style={{
        display: "flex", alignItems: "center", gap: 16,
        padding: "20px 24px",
        background: hovered ? "rgba(255,255,255,.06)" : "rgba(255,255,255,.03)",
        border: `1px solid ${hovered ? hoverColor : "rgba(255,255,255,.1)"}`,
        color: hovered ? hoverColor : "rgba(255,255,255,.7)",
        textDecoration: "none",
        transition: "all var(--dur-2)",
        fontFamily: "var(--font-mono)", fontSize: 15,
      }}
    >
      {icon}
      <span>{label}</span>
      <svg style={{ marginLeft: "auto", opacity: hovered ? 1 : 0.3, transition: "opacity var(--dur-2)" }} width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true"><path d="M7 17 17 7M7 7h10v10"/></svg>
    </a>
  );
};



const TechStrip = () =>
<section className="dl-section-tight dl-paper" style={{ borderTop: "1px solid var(--line)", borderBottom: "1px solid var(--line)" }}>
    <div className="dl-container">
      <div style={{ display: "grid", gridTemplateColumns: "1fr 2.4fr", gap: 48, alignItems: "center" }}>
        <div>
          <Eyebrow>tech we love</Eyebrow>
          <h3 className="dl-h3" style={{ marginTop: 12, fontFamily: "var(--font-display)", textTransform: "uppercase", letterSpacing: "-0.02em" }}>The stack we bet on.</h3>
        </div>
        <div style={{ display: "flex", gap: 8, flexWrap: "wrap" }}>
          {TECH.map((t) =>
        <span key={t} style={{
          fontFamily: "var(--font-mono)", fontSize: 12,
          padding: "8px 14px",
          background: "var(--bg-elev)", border: "1px solid var(--line-strong)", color: "var(--fg)",
          display: "inline-flex", alignItems: "center", gap: 8
        }}>
              <span style={{ width: 6, height: 6, background: "var(--accent)" }} />
              {t}
            </span>
        )}
        </div>
      </div>
    </div>
  </section>;


const LIFE_PHOTOS = [
  { src: "assets/life/claude-compliance.jpg",       tag: "// hackathon",       cap: "Is My Claude Compliant? · all-hands hack" },
  { src: "assets/life/pingpong.jpg",                tag: "// office",          cap: "Defending the crown" },
  { src: "assets/life/hoodie-skyline.jpg",          tag: "// after hours",     cap: "Made it." },
  { src: "assets/life/whiteboard-architecture.jpg", tag: "// architecture",    cap: "Whiteboards over slides" },
  { src: "assets/life/hq-welcome.jpg",              tag: "// HQ hoofddorp",    cap: "Welcome to HQ" },
  { src: "assets/life/bbq-grill.jpg",               tag: "// monthly outing",  cap: "Sausages don't ship themselves" },
  { src: "assets/life/team-meeting.jpg",            tag: "// conferences",     cap: "Finding knowledge in the wild" },
  { src: "assets/life/laptop-stickers.jpg",         tag: "// demo day",        cap: "Demos start here" },
  { src: "assets/life/hackathon-presentation.jpg",  tag: "// launch day",      cap: "Gathered around the launch" },
];

// 12-col bento, varied spans, 3 rows of ~300px.
const LIFE_LAYOUT = [
  { col: "1 / 8",   row: "1" },     // claude-compliance — big landscape hero
  { col: "8 / 11",  row: "1" },     // pingpong
  { col: "11 / 13", row: "1 / 3" }, // hoodie-skyline — tall
  { col: "1 / 6",   row: "2" },     // whiteboard
  { col: "6 / 11",  row: "2" },     // hq-welcome
  { col: "1 / 4",   row: "3" },     // bbq-grill
  { col: "4 / 8",   row: "3" },     // team-meeting
  { col: "8 / 11",  row: "3" },     // hackathon-presentation
  { col: "11 / 13", row: "3" },     // hq-thumbs-up
];

const LifeTile = ({ p, layout }) => {
  const [hover, setHover] = React.useState(false);
  return (
    <div
      onMouseEnter={() => setHover(true)}
      onMouseLeave={() => setHover(false)}
      style={{
        position: "relative", overflow: "hidden", background: "var(--bg-dark)",
        gridColumn: layout.col, gridRow: layout.row,
        cursor: "default",
      }}>
      {/* Photo */}
      <img src={p.src} alt={p.cap} loading="lazy"
        style={{
          position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover",
          transform: hover ? "scale(1.04)" : "scale(1)",
          filter: hover ? "saturate(1.05) contrast(1.04)" : "saturate(0.78) contrast(1.06) brightness(0.92)",
          transition: "transform 700ms var(--ease-out), filter 320ms var(--ease-out)"
        }} />

      {/* Tonal wash — keeps the family of all tiles consistent */}
      <div style={{
        position: "absolute", inset: 0, pointerEvents: "none",
        background: "linear-gradient(180deg, rgba(10,10,9,.35) 0%, rgba(10,10,9,.05) 22%, rgba(10,10,9,.10) 55%, rgba(10,10,9,.92) 100%)",
        mixBlendMode: "multiply",
      }} />

      {/* Accent rule along the bottom, animates in on hover */}
      <div style={{
        position: "absolute", left: 0, bottom: 0, height: 2,
        background: "var(--accent)",
        width: hover ? "100%" : "28%",
        transition: "width 480ms var(--ease-out)",
        pointerEvents: "none",
      }} />

      {/* Pixel hash corner — Devleaps brand DNA */}
      <div aria-hidden style={{
        position: "absolute", right: 12, top: 12, display: "grid",
        gridTemplateColumns: "repeat(3, 4px)", gridTemplateRows: "repeat(2, 4px)",
        gap: 2, opacity: 0.85, pointerEvents: "none",
      }}>
        {[0,1,2,3,4,5].map(i => (
          <span key={i} style={{
            width: 4, height: 4,
            background: i % 2 === 0 ? "var(--accent)" : "rgba(250,250,247,.35)",
          }} />
        ))}
      </div>

      {/* Mono tag — top-left */}
      <div style={{
        position: "absolute", left: 12, top: 12,
        fontFamily: "var(--font-mono)", fontSize: 10, letterSpacing: "0.16em",
        color: "var(--accent)", background: "rgba(10,10,9,.78)", padding: "5px 9px",
        textTransform: "uppercase", backdropFilter: "blur(8px)",
        borderLeft: "2px solid var(--accent)",
      }}>{p.tag}</div>

      {/* Caption — always visible, sits on the dark gradient foot */}
      <div style={{
        position: "absolute", left: 14, right: 14, bottom: 14,
        fontFamily: "var(--font-display)", fontWeight: 600, fontSize: 15,
        letterSpacing: "-0.005em", color: "#FAFAF7",
        textShadow: "0 1px 12px rgba(0,0,0,.45)",
        transform: hover ? "translateY(-2px)" : "translateY(0)",
        transition: "transform 280ms var(--ease-out)",
      }}>{p.cap}</div>
    </div>);

};

const LifeGallery = () =>
  <section className="dl-section" style={{ background: "var(--bg)", borderTop: "1px solid var(--line)" }}>
    <div className="dl-container-wide">
      <div className="dl-2col-header" style={{ marginBottom: 56 }}>
        <div>
          <Eyebrow>life at devleaps</Eyebrow>
          <h2 className="dl-h1" style={{ marginTop: 16, maxWidth: "14ch" }}>
            A look behind the<br />
            <span style={{ color: "var(--accent)" }}>scenes</span>.
          </h2>
        </div>
        <p className="dl-body-lg" style={{ maxWidth: "52ch" }}>
          Hackathons. Whiteboards. Monthly outings. A ping-pong table that gets more use than it should.
          This is what showing up looks like when you actually like the people you work with.
        </p>
      </div>

      <div className="dl-life-gallery-grid">
        {LIFE_PHOTOS.map((p, i) => <LifeTile key={p.src} p={p} layout={LIFE_LAYOUT[i]} />)}
      </div>
    </div>
  </section>;


// =============================================================
// QUICK START — low-commitment on-ramps: hackathons, knowledge
// sessions, meetups. The fast way to start solving before the big bet.
// =============================================================
const QUICKSTART_FORMATS = [
  {
    icon: "zap",
    tag: "// 2-5 days",
    title: "Hackathons",
    body: "Your team and ours, one real problem, a hard deadline. Together we build something that runs, plus the momentum to keep going.",
    outcome: "a working prototype, not a slide deck",
  },
  {
    icon: "terminal",
    tag: "// half-day → series",
    title: "Knowledge sessions",
    body: "Hands-on deep dives with your engineers. We transfer the how, not just the what: patterns, tooling, and the reasoning behind them.",
    outcome: "your team levels up, in-house",
  },
  {
    icon: "users",
    tag: "// 1 session",
    title: "Meetups & workshops",
    body: "Discovery workshops and community sessions to surface the real opportunity, align the room, and shape the brief together.",
    outcome: "a sharp, shared starting point",
  },
];

const QuickStartCard = ({ f, idx, total }) => {
  const [hover, setHover] = React.useState(false);
  return (
    <div
      onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)}
      style={{
        padding: "32px 30px",
        background: hover ? "var(--bg-inset)" : "var(--bg-elev)",
        borderRight: idx < total - 1 ? "1px solid var(--line-strong)" : "none",
        display: "flex", flexDirection: "column", gap: 16,
        transition: "background var(--dur-2) var(--ease-out)",
        position: "relative",
      }}>
      <div style={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: 12 }}>
        <span style={{
          display: "inline-flex", alignItems: "center", justifyContent: "center",
          width: 44, height: 44, border: "1px solid var(--line-strong)",
          color: "var(--accent)",
          background: hover ? "var(--bg-elev)" : "transparent",
          transition: "background var(--dur-2)",
        }}>
          <Icon name={f.icon} size={22} />
        </span>
        <span className="dl-mono" style={{ fontSize: 11, letterSpacing: "0.12em", color: "var(--fg-muted)", textTransform: "uppercase" }}>{f.tag}</span>
      </div>

      <h3 style={{
        fontFamily: "var(--font-display)", fontSize: 24, fontWeight: 700,
        letterSpacing: "-0.02em", textTransform: "uppercase", lineHeight: 1.05,
        margin: 0, color: "var(--fg)",
      }}>{f.title}</h3>

      <p className="dl-body" style={{ margin: 0, fontSize: 15, lineHeight: 1.55, flex: 1 }}>{f.body}</p>

      <div className="dl-mono" style={{
        fontSize: 11.5, letterSpacing: "0.06em", color: "var(--accent)",
        paddingTop: 16, borderTop: "1px dashed var(--line-strong)",
        display: "flex", alignItems: "center", gap: 8,
      }}>
        <Icon name="arrow-down-right" size={14} /> {f.outcome}
      </div>
    </div>
  );
};

const QuickStart = () =>
  <section id="quick-start" className="dl-section dl-paper" style={{ borderTop: "1px solid var(--line)", borderBottom: "1px solid var(--line)" }}>
    <div className="dl-container">
      <div style={{ display: "grid", gridTemplateColumns: "1fr 1fr", gap: 64, alignItems: "end", marginBottom: 48 }}>
        <div>
          <Eyebrow>quick start</Eyebrow>
          <h2 className="dl-h1" style={{ marginTop: 16, maxWidth: "14ch" }}>
            Start in a week,<br /><span style={{ fontStyle: "italic", color: "var(--accent)" }}>not a quarter.</span>
          </h2>
        </div>
        <p className="dl-body-lg" style={{ maxWidth: "46ch", margin: 0, paddingBottom: 6 }}>
          Not every leap needs a six month program. Often the fastest way to reduce the risk of a decision is to build something real, together, in days. We run focused formats to kick start solving the problem, or pressure test the opportunity, before anyone commits to the big bet.
        </p>
      </div>

      <div style={{ border: "1px solid var(--line-strong)" }}>
        <div style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)" }}>
          {QUICKSTART_FORMATS.map((f, i) =>
            <QuickStartCard key={f.title} f={f} idx={i} total={QUICKSTART_FORMATS.length} />
          )}
        </div>
        <div style={{ padding: "24px 30px", borderTop: "1px solid var(--line-strong)", background: "var(--bg-inset)", display: "flex", justifyContent: "space-between", alignItems: "center", flexWrap: "wrap", gap: 16 }}>
          <div className="dl-mono" style={{ fontSize: 12.5 }}>// pick a format, or we'll design one around your problem.</div>
          <a className="dl-btn dl-btn-link" href="#contact" onClick={(e) => { e.preventDefault(); const el = document.getElementById("contact"); el && window.scrollTo({ top: el.offsetTop - 64, behavior: "smooth" }); }}>
            Kick something off <Icon name="arrow-right" size={16} />
          </a>
        </div>
      </div>

      <style>{`
        @media (max-width: 860px) {
          #quick-start .dl-container > div:first-child { grid-template-columns: 1fr !important; gap: 24px !important; }
          #quick-start [style*="repeat(3, 1fr)"] { grid-template-columns: 1fr !important; }
          #quick-start [style*="repeat(3, 1fr)"] > div { border-right: none !important; border-bottom: 1px solid var(--line-strong); }
          #quick-start [style*="repeat(3, 1fr)"] > div:last-child { border-bottom: none; }
        }
      `}</style>
    </div>
  </section>;


Object.assign(window, { Hero, ClientStrip, Services, Manifesto, QuickStart, Work, Team, Process, Contact, TechStrip, HumanQuote, LifeGallery });
