Blocos
FilterBar
Toolbar composicional com chips removíveis para filtros aplicados.
FilterBar é uma <div role="toolbar"> que hospeda livremente um Input de busca, um trigger de "adicionar filtro", a lista de chips ativos e um botão "Limpar tudo". Cada chip vem de FilterBar.Chip, com botão X e aria-label único.
- Status: Ativo
- Plano: Pro
- Região: BR
'use client';
import { FilterBar } from '@uranus-workspace/blocks';
import { Button, Input } from '@uranus-workspace/design-system';
import { Plus } from 'lucide-react';
import { useState } from 'react';
const initialChips = [
{ id: 'status', label: 'Status: Ativo' },
{ id: 'plan', label: 'Plano: Pro' },
{ id: 'region', label: 'Região: BR' },
];
export default function FilterBarDefault() {
const [chips, setChips] = useState(initialChips);
return (
<FilterBar className="w-full max-w-2xl">
<Input placeholder="Buscar…" className="w-44" />
<Button variant="outline" size="sm" type="button">
<Plus aria-hidden className="size-3" />
<span>Adicionar filtro</span>
</Button>
<FilterBar.Chips>
{chips.map((c) => (
<FilterBar.Chip
key={c.id}
id={c.id}
label={c.label}
onRemove={(id) => setChips((curr) => curr.filter((x) => x.id !== id))}
/>
))}
</FilterBar.Chips>
{chips.length > 0 ? (
<Button
variant="ghost"
size="sm"
type="button"
onClick={() => setChips([])}
className="ml-auto"
>
Limpar tudo
</Button>
) : null}
</FilterBar>
);
}
Uso
import { FilterBar } from '@uranus-workspace/blocks';
import { Button, Input } from '@uranus-workspace/design-system';
import { Plus } from 'lucide-react';
import { useState } from 'react';
const [chips, setChips] = useState([
{ id: 'status', label: 'Status: Ativo' },
]);
<FilterBar>
<Input placeholder="Buscar…" className="w-44" />
<Button variant="outline" size="sm">
<Plus aria-hidden className="size-3" />
<span>Adicionar filtro</span>
</Button>
<FilterBar.Chips>
{chips.map((c) => (
<FilterBar.Chip
key={c.id}
id={c.id}
label={c.label}
onRemove={(id) => setChips((curr) => curr.filter((x) => x.id !== id))}
/>
))}
</FilterBar.Chips>
{chips.length > 0 ? (
<Button variant="ghost" size="sm" className="ml-auto" onClick={() => setChips([])}>
Limpar tudo
</Button>
) : null}
</FilterBar>Subcomponentes
FilterBar.Chips—<ul>que hospeda os chips.FilterBar.Chip—<li>comBadgeremovível; recebeid,labeleonRemove.
Acessibilidade
A raiz aplica role="toolbar" com aria-label="Filtros" por padrão. Cada chip tem um <button> com aria-label "Remover filtro <label>". id deve ser estável entre renderizações para o React não recriar o nó.