data/symbols_index.json (no backend), except
semantic search, which proxies to the backend vector index and falls back to local text
search if the backend is unreachable.
List libraries — GET /api/libraries
Filter by category id.
Capped at 100.
Each:
id, name, description, category, symbolCount, lastUpdated, contributor, source.Library detail — GET /api/libraries/[name]
Returns the library plus its full symbols[] array (with pins). 404 if not found.
Text search — GET /api/search
Query string.
Capped at 100.
{ symbols, total, page, limit, totalPages }. Scoring favors name matches, then
keywords, then library name, then description.
Semantic search — GET /api/search/semantic
Minimum 2 characters.
Capped at 50.
GET /api/v3/components/search?q=&limit=. Returns source: "vector" on success
or source: "text_fallback" when the backend is unreachable. Result items use the backend’s
snake_case (pin_count).
Suggestions — GET /api/search/suggest
Minimum 2 characters.
[{ id, name, library, pinCount }].
Categories — GET /api/categories
Computed from the index: [{ id, count }]. power_symbol, graphical, and mechanical
are merged into "other".
Thumbnails — GET /api/thumbnail?id=<symbolId>
Returns a pre-rendered image/svg+xml (cached 1 day, immutable) from
data/symbol_thumbnails.json. 404 when missing — the UI then renders a generic
MiniSchematic from pinCount. SVGs use currentColor, so they inherit hover color.
