02075fbd47
- Server: GET /api/gifs proxies GIPHY search/trending. The API key is read from the server env only (config.GIPHY_API_KEY, from the gitignored .env) and NEVER reaches the browser; the picker is hidden when it isn't configured. - Emoji picker gains a GIF tab (separated from the emoji categories) with a search box + a 2-col grid, "Powered by GIPHY" attribution. Clicking a GIF sends it immediately. - GIFs are HOTLINKED to GIPHY's CDN (their terms require this — no re-hosting): the message body is the GIF url, and a body that is a lone GIF url renders inline as the animated GIF (reusing the image/lightbox path). Sidebar previews + notifications show "🎞️ GIF", not the raw url. Key is NOT in git — set as GIPHY_API_KEY in the server .env. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>