// Projects — filterable grid + side drawer

function Projects(){
  const [cat, setCat] = React.useState("all");
  const [sel, setSel] = React.useState(null);
  const visible = cat === "all" ? PROJECTS : PROJECTS.filter(p => p.cat === cat);
  const ref = React.useRef(null);
  React.useEffect(()=>{ window.registerReveal && window.registerReveal(ref.current); },[]);

  // escape to close
  React.useEffect(()=>{
    const h = e => { if (e.key === "Escape") setSel(null); };
    window.addEventListener("keydown", h);
    return () => window.removeEventListener("keydown", h);
  }, []);

  return (
    <section id="work" ref={ref} className="reveal" data-screen-label="03 Work">
      <style>{`
        .work-head{display:flex;align-items:flex-end;justify-content:space-between;gap:24px;flex-wrap:wrap;margin-bottom:40px}
        .work-title{font-size:clamp(40px,6vw,72px);font-weight:700;letter-spacing:-.03em;line-height:1;margin-top:18px}
        .work-sub{color:var(--fg-mute);font-family:var(--font-mono);font-size:12px;letter-spacing:.08em;margin-top:14px}
        .filter-bar{display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding:6px;border:1px solid var(--line);border-radius:999px;background:rgba(255,255,255,.02)}
        .filter-btn{padding:8px 14px;border-radius:999px;font-family:var(--font-mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--fg-dim);transition:all .2s;display:inline-flex;align-items:center;gap:8px}
        .filter-btn:hover{color:var(--fg)}
        .filter-btn[data-on="1"]{background:var(--accent);color:#0a0a0a;font-weight:600}
        .filter-btn .n{font-size:10px;opacity:.6;font-weight:400}
        .filter-btn[data-on="1"] .n{opacity:.85}

        .grid{display:grid;grid-template-columns:repeat(12,1fr);gap:20px;margin-top:8px}
        @media (max-width:980px){.grid{grid-template-columns:repeat(6,1fr)}}
        @media (max-width:620px){.grid{grid-template-columns:repeat(2,1fr);gap:14px}}

        .card{
          grid-column:span 4;
          background:var(--bg-1);border:1px solid var(--line);border-radius:10px;
          padding:22px 22px 20px;cursor:pointer;position:relative;overflow:hidden;
          transition:border-color .25s, transform .25s, background .25s;
          display:flex;flex-direction:column;gap:14px;min-height:250px;
          text-align:left;
        }
        .card:hover{border-color:var(--line-2);background:var(--bg-2);transform:translateY(-2px)}
        .card::after{content:"";position:absolute;inset:0;pointer-events:none;opacity:0;transition:opacity .3s;background:radial-gradient(600px 200px at var(--mx,50%) 0%, rgba(217,119,6,.08), transparent 60%)}
        .card:hover::after{opacity:1}
        @media (max-width:980px){.card{grid-column:span 3}}
        @media (max-width:620px){.card{grid-column:span 2}}

        .card-row-1{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}
        .card-idx{font-family:var(--font-mono);font-size:10px;color:var(--fg-ghost);letter-spacing:.1em}
        .status{font-family:var(--font-mono);font-size:9px;letter-spacing:.14em;padding:3px 7px;border-radius:3px;font-weight:500}
        .status.LIVE{background:rgba(74,222,128,.12);color:var(--ok)}
        .status.SHIPPED{background:rgba(255,255,255,.06);color:var(--fg-dim)}
        .status.RESEARCH{background:rgba(217,119,6,.14);color:var(--accent)}
        .status.WIP{background:rgba(251,191,36,.12);color:var(--warn)}

        .card-title{font-size:22px;font-weight:600;letter-spacing:-.02em;line-height:1.15;margin-top:auto}
        .card-sub{font-family:var(--font-mono);font-size:11px;color:var(--fg-mute);letter-spacing:.04em;margin-top:2px}
        .card-tag{color:var(--fg-dim);font-size:14px;line-height:1.5;text-wrap:pretty;margin-top:6px}

        .card-foot{display:flex;justify-content:space-between;align-items:center;margin-top:14px;padding-top:14px;border-top:1px dashed var(--line)}
        .pills{display:flex;flex-wrap:wrap;gap:5px}
        .pill{font-family:var(--font-mono);font-size:10px;letter-spacing:.04em;padding:3px 8px;border:1px solid var(--line);border-radius:3px;color:var(--fg-dim)}
        .arrow{width:28px;height:28px;border-radius:50%;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;color:var(--fg-mute);transition:all .2s;flex-shrink:0}
        .card:hover .arrow{border-color:var(--accent);color:var(--accent);transform:rotate(-45deg)}
        .arrow svg{width:11px;height:11px}

        /* drawer */
        .drawer-back{position:fixed;inset:0;z-index:70;background:rgba(0,0,0,.6);backdrop-filter:blur(4px);opacity:0;pointer-events:none;transition:opacity .3s}
        .drawer-back.in{opacity:1;pointer-events:auto}
        .drawer{position:fixed;top:0;right:0;bottom:0;width:min(640px,92vw);z-index:71;background:var(--bg-1);border-left:1px solid var(--line);transform:translateX(100%);transition:transform .35s cubic-bezier(.2,.7,.2,1);overflow-y:auto;display:flex;flex-direction:column}
        .drawer.in{transform:none}
        .drawer-hd{display:flex;justify-content:space-between;align-items:center;padding:18px 28px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--bg-1);z-index:2;font-family:var(--font-mono);font-size:11px;letter-spacing:.08em;color:var(--fg-mute)}
        .drawer-x{width:32px;height:32px;border:1px solid var(--line);border-radius:50%;display:flex;align-items:center;justify-content:center;color:var(--fg-dim);transition:all .2s}
        .drawer-x:hover{border-color:var(--accent);color:var(--accent)}
        .drawer-body{padding:40px 28px 60px;display:flex;flex-direction:column;gap:32px}
        .drawer-title{font-size:clamp(32px,5vw,48px);font-weight:700;letter-spacing:-.03em;line-height:1.05}
        .drawer-sub{font-family:var(--font-mono);color:var(--accent);font-size:12px;letter-spacing:.08em;margin-top:8px}
        .drawer-tag{font-size:18px;color:var(--fg-dim);line-height:1.55;text-wrap:pretty}
        .drawer-metrics{display:grid;grid-template-columns:repeat(3,1fr);border:1px solid var(--line);border-radius:8px;overflow:hidden}
        @media (max-width:520px){.drawer-metrics{grid-template-columns:repeat(2,1fr)}}
        .dm{padding:18px 18px;border-right:1px solid var(--line);border-bottom:1px solid var(--line)}
        .dm:last-child{border-right:0}
        .dm .k{font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;color:var(--fg-mute);text-transform:uppercase}
        .dm .v{font-family:var(--font-mono);font-size:22px;margin-top:6px;color:var(--fg);letter-spacing:-.01em}
        .drawer-why{padding:20px;border-left:2px solid var(--accent);background:var(--accent-soft);border-radius:0 6px 6px 0;font-size:15px;line-height:1.55;color:var(--fg)}
        .drawer-why .k{font-family:var(--font-mono);font-size:10px;letter-spacing:.14em;color:var(--accent);text-transform:uppercase;display:block;margin-bottom:6px}
        .drawer-section-t{font-family:var(--font-mono);font-size:11px;letter-spacing:.1em;color:var(--fg-mute);text-transform:uppercase;margin-bottom:12px}

        .work-empty{
          margin-top:8px;border:1px dashed var(--line);border-radius:10px;
          padding:64px 32px;text-align:center;
          background:linear-gradient(180deg,rgba(255,255,255,.01),rgba(255,255,255,0));
        }
        .work-empty .we-mark{font-family:var(--font-mono);font-size:12px;color:var(--fg-mute);letter-spacing:.06em;margin-bottom:18px}
        .work-empty .we-accent{color:var(--accent)}
        .work-empty .we-msg{font-size:clamp(20px,2.4vw,28px);color:var(--fg);font-weight:500;letter-spacing:-.01em}
        .work-empty .we-cue{margin-top:16px;font-family:var(--font-mono);color:var(--accent);font-size:18px}
        .work-empty .we-blink{display:inline-block;animation:blink 1s step-end infinite}
      `}</style>

      <div className="wrap">
        <div className="work-head">
          <div>
            <div className="eyebrow">/ 02 · Selected Work</div>
            <h2 className="work-title">
              {PROJECTS.length === 0
                ? <>Building.<br/>Projects landing soon.</>
                : <>{PROJECTS.length} project{PROJECTS.length===1?"":"s"}.<br/>One recurring pattern.</>}
            </h2>
            <div className="work-sub">SHIP · BREAK · READ DOCS · SHIP AGAIN</div>
          </div>
          {CATEGORIES.length > 1 && (
            <div className="filter-bar" role="tablist">
              {CATEGORIES.map(c => (
                <button key={c.id} className="filter-btn" data-on={cat===c.id?"1":"0"} onClick={()=>setCat(c.id)}>
                  {c.label}<span className="n">{c.count}</span>
                </button>
              ))}
            </div>
          )}
        </div>

        {visible.length === 0 ? (
          <div className="work-empty">
            <div className="we-mark">~/<span className="we-accent">work</span> $ ls</div>
            <div className="we-msg">No artifacts yet — first drop incoming.</div>
            <div className="we-cue">
              <span className="we-blink">_</span>
            </div>
          </div>
        ) : (
          <div className="grid">
            {visible.map((p, i) => (
              <button
                key={p.id}
                className="card"
                onClick={()=>setSel(p)}
                onMouseMove={e=>{const r=e.currentTarget.getBoundingClientRect();e.currentTarget.style.setProperty("--mx",((e.clientX-r.left)/r.width*100)+"%")}}
              >
                <div className="card-row-1">
                  <span className="card-idx">{String(i+1).padStart(2,'0')} / {String(visible.length).padStart(2,'0')}</span>
                  <span className={"status " + p.status}>{p.status}</span>
                </div>
                <div>
                  <div className="card-title">{p.title}</div>
                  <div className="card-sub">{p.sub}</div>
                </div>
                <div className="card-tag">{p.tagline}</div>
                <div className="card-foot">
                  <div className="pills">
                    {p.stack.slice(0,3).map(s => <span key={s} className="pill">{s}</span>)}
                    {p.stack.length > 3 && <span className="pill">+{p.stack.length-3}</span>}
                  </div>
                  <span className="arrow">
                    <svg viewBox="0 0 16 16" fill="none"><path d="M3 13L13 3M6 3h7v7" stroke="currentColor" strokeWidth="1.5"/></svg>
                  </span>
                </div>
              </button>
            ))}
          </div>
        )}
      </div>

      {/* drawer */}
      <div className={"drawer-back " + (sel?"in":"")} onClick={()=>setSel(null)}></div>
      <aside className={"drawer " + (sel?"in":"")} aria-hidden={!sel}>
        {sel && (
          <>
            <div className="drawer-hd">
              <span>{sel.cat.toUpperCase()} · {sel.year}</span>
              <button className="drawer-x" onClick={()=>setSel(null)} aria-label="Close">
                <svg width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M1 1l10 10M11 1L1 11" stroke="currentColor" strokeWidth="1.5"/></svg>
              </button>
            </div>
            <div className="drawer-body">
              <div>
                <h3 className="drawer-title">{sel.title}</h3>
                <div className="drawer-sub">{sel.sub} · <span className={"status " + sel.status}>{sel.status}</span></div>
              </div>
              <p className="drawer-tag">{sel.tagline}</p>
              {sel.metrics && (
                <div>
                  <div className="drawer-section-t">Metrics</div>
                  <div className="drawer-metrics">
                    {sel.metrics.map((m,j) => (
                      <div className="dm" key={j}>
                        <div className="k">{m.k}</div>
                        <div className="v">{m.v}</div>
                      </div>
                    ))}
                  </div>
                </div>
              )}
              {sel.why && (
                <div className="drawer-why">
                  <span className="k">Why it matters</span>
                  {sel.why}
                </div>
              )}
              <div>
                <div className="drawer-section-t">Stack</div>
                <div className="pills">
                  {sel.stack.map(s => <span key={s} className="pill">{s}</span>)}
                </div>
              </div>
              {sel.link && (
                <a className="hero-cta primary" href={sel.link} target="_blank" rel="noopener" style={{alignSelf:'flex-start'}}>
                  Visit live
                  <svg viewBox="0 0 16 16" fill="none"><path d="M3 13L13 3M6 3h7v7" stroke="currentColor" strokeWidth="1.5"/></svg>
                </a>
              )}
            </div>
          </>
        )}
      </aside>
    </section>
  );
}

Object.assign(window, { Projects });
