search: return all matches (not just 100) + add typeahead autocomplete

- searchLegacyArticles() default limit: 50 → 5000. /search page
    explicitly passes 5000 too. ilike on title/excerpt/author is fast
    enough on the 29k-row archive that returning everything is fine.

  - New API route /api/search/suggest?q=...&limit=8 returns the top
    matching article titles + category + slug, with a 30-second CDN
    cache + 60-second stale-while-revalidate.

  - The search input in the Browse bar now debounces (150ms) and
    fires that API per keystroke once 2+ chars are typed. Matches
    appear in a styled dropdown below the input — click to navigate
    directly to /news/<slug>, or press Enter to fall through to the
    full /search page. "See all results for …" link in the dropdown
    footer.

  - Keyboard: Escape closes the dropdown; aria-autocomplete + role
    listbox/option for accessibility.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ryan Salazar
2026-05-20 06:00:10 +00:00
parent e8552794fe
commit cb00f7f343
5 changed files with 237 additions and 29 deletions

View File

@@ -23,7 +23,7 @@ interface SearchPageProps {
export default async function SearchPage({ searchParams }: SearchPageProps) {
const { q } = await searchParams;
const query = (q ?? "").trim();
const results = query ? await searchLegacyArticles(query, 100) : [];
const results = query ? await searchLegacyArticles(query, 5000) : [];
return (
<div className="min-h-screen bg-background">