FindableSearch

A document search widget with debounced input, results list, and pagination.

Live Search Demo

Try searching for “fire”, “HVAC”, or “electrical”

Basic Usage

<FindableSearch buildingId="bld-789" />

Omit buildingId to search across all buildings:

<FindableSearch />

Props

PropTypeDefaultDescription
buildingIdstringScope results to a specific building. Omit to search all.
placeholderstring'Search documents...'Input placeholder text
maxResultsnumber10Results per page
debounceMsnumber300Debounce delay in milliseconds
classNamestringAdditional CSS class
onHitClick(hit: SearchHit) => voidCalled when a result row is clicked
renderHit(hit: SearchHit) => JSX.ElementCustom hit renderer for full UI control

Handling Clicks

<FindableSearch
  buildingId="bld-789"
  onHitClick={(hit) => {
    window.open(`/documents/${hit.id}`);
  }}
/>

Headless Hook: useSearch

import { useSearch } from '@findable-ai/react';

function CustomSearch() {
  const { results, totalHits, isLoading, query, search, loadMore, clear } =
    useSearch({ buildingId: 'bld-789', maxResults: 20 });

  return (
    <div>
      <input
        value={query}
        onChange={(e) => search(e.target.value)}
        placeholder="Search..."
      />
      {isLoading && <span>Loading...</span>}
      <ul>
        {results.map((hit) => (
          <li key={hit.id}>{hit.title || hit.filename}</li>
        ))}
      </ul>
      {results.length < totalHits && (
        <button onClick={loadMore}>Load more</button>
      )}
    </div>
  );
}

useSearch Return Value

PropTypeDefaultDescription
resultsSearchHit[]Current search results
totalHitsnumberTotal matching documents
isLoadingbooleanWhether a search is in progress
querystringCurrent search query
search(query: string) => voidTrigger a search (debounced)
loadMore() => voidLoad the next page of results
clear() => voidClear query and results