Skip to content
BigBang

Popular

    ↑↓Navigate↵OpenEscClose
    TR

    Components

    SearchInput

    A search field with a clear button, debounced search and a loading state.

    Storybook
    Storybook
    Source
    Source

    The example below loads live from Storybook; open it there to use the controls.

    Live example, StorybookOpen in Storybook

    The search icon sits at the start; once a value is typed, a clear button appears at the end.

    import { Provider, SearchInput } from '@bigbang/ui';
    export default function Default() {
    return (
    <Provider locale="en-GB">
    <SearchInput label="Search" placeholder="Search by name" className="max-w-sm" />
    </Provider>
    );
    }

    With a value, loading (a spinner in place of the icon) and disabled.

    Searching
    import { Provider, SearchInput } from '@bigbang/ui';
    export default function States() {
    return (
    <Provider locale="en-GB">
    <div className="flex max-w-sm flex-col gap-lg">
    <SearchInput label="Search" defaultValue="Item" />
    <SearchInput label="Search" defaultValue="Item" loading />
    <SearchInput label="Search" placeholder="Search by name" disabled />
    </div>
    </Provider>
    );
    }

    hideLabel hides the label visually; screen readers still read it. landmark wraps the field in a role="search" region.

    import { Provider, SearchInput } from '@bigbang/ui';
    export default function HiddenLabel() {
    return (
    <Provider locale="en-GB">
    <SearchInput label="Search" hideLabel placeholder="Search by name" landmark className="max-w-sm" />
    </Provider>
    );
    }

    onSearch runs after a 300 ms pause; show loading until results arrive.

    import { Provider, SearchInput } from '@bigbang/ui';
    import { useState } from 'react';
    export default function SearchAsYouType() {
    const [loading, setLoading] = useState(false);
    const [count, setCount] = useState<number | null>(null);
    return (
    <Provider locale="en-GB">
    <div className="flex max-w-sm flex-col gap-sm">
    <SearchInput
    label="Search"
    placeholder="Search by name"
    loading={loading}
    onSearch={(query) => {
    if (!query) return setCount(null);
    setLoading(true);
    setTimeout(() => {
    setLoading(false);
    setCount(query.length * 3);
    }, 700);
    }}
    />
    <p className="type-body-sm text-fg-subtle">{count === null ? '' : `${count} results`}</p>
    </div>
    </Provider>
    );
    }

    The icon and buttons use semantic tokens.

    Searching
    Searching
    import { Provider, SearchInput } from '@bigbang/ui';
    export default function States() {
    return (
    <Provider locale="en-GB">
    <div className="flex max-w-sm flex-col gap-lg">
    <SearchInput label="Search" defaultValue="Item" />
    <SearchInput label="Search" defaultValue="Item" loading />
    <SearchInput label="Search" placeholder="Search by name" disabled />
    </div>
    </Provider>
    );
    }