data/footprints_index.json (no backend), except
semantic search, which proxies to the backend vector index with a local text fallback.
Footprints are browsed by library, not category.
Search / list — GET /api/footprints
Case-insensitive match over name, description, tags, library.
Capped at 100.
/api/footprints is search/list only (q, page, limit). The footprint detail page
is a Server Component that reads the index directly via getFootprintById() — it does not
call this route.Browse by library
There is no library-list API route — libraries come from the index via the data layer:{ id, name, footprintCount } (libraries) or a paginated
FootprintSearchResult (footprints in a library).
Semantic search — GET /api/search/semantic
Minimum 2 characters.
Capped at 50.
GET /api/v3/components/search?q=&limit=&type=footprint. Returns
source: "vector" on success or source: "text_fallback" when the backend is unreachable.
Result items use the backend’s snake_case (pad_count).

