// === Nav + Hero === const Nav = () => { const [slim, setSlim] = React.useState(false); React.useEffect(() => { const onScroll = () => setSlim(window.scrollY > 24); window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); return ( ); }; const Hero = () => { const [focused, setFocused] = React.useState(false); const [value, setValue] = React.useState(""); const sectionRef = React.useRef(null); React.useEffect(() => { const el = sectionRef.current; if (!el) return; const onMove = (e) => { const r = el.getBoundingClientRect(); el.style.setProperty("--spot-x", `${e.clientX - r.left}px`); el.style.setProperty("--spot-y", `${e.clientY - r.top}px`); }; el.addEventListener("pointermove", onMove); return () => el.removeEventListener("pointermove", onMove); }, []); return (
The living dictionary of Chinese internet culture

Decode what Chinese internet is really saying.

8,420+ slang entries. Updated daily by native speakers. From Weibo, Xiaohongshu, Bilibili, and the streets of Shanghai.

setValue(e.target.value)} onFocus={() => setFocused(true)} onBlur={() => setFocused(false)} aria-label="Search the dictionary" />
  entries
  contributors
  monthly readers
); }; // Rolling counter const Counter = ({ value, suffix = "" }) => { const [v, setV] = React.useState(0); const ref = React.useRef(null); React.useEffect(() => { const el = ref.current; if (!el) return; const obs = new IntersectionObserver((entries) => { entries.forEach((e) => { if (e.isIntersecting) { const start = performance.now(); const dur = 1600; const tick = (t) => { const p = Math.min(1, (t - start) / dur); const eased = 1 - Math.pow(1 - p, 3); setV(value * eased); if (p < 1) requestAnimationFrame(tick); }; requestAnimationFrame(tick); obs.disconnect(); } }); }, { threshold: 0.4 }); obs.observe(el); return () => obs.disconnect(); }, [value]); const display = value >= 100 ? Math.round(v).toLocaleString() : v.toFixed(1); return {display}{suffix}; }; Object.assign(window, { Nav, Hero, Counter });