Slider
Input numérico contínuo via thumb arrastável - único ou range, horizontal ou vertical, com uma extensão `thumbAriaLabel` para acessibilidade multi-thumb.
Visão geral
Slider envolve @radix-ui/react-slider. Thumb único por default; passe defaultValue={[low, high]} (ou value) para um slider de range. Respeita step, min, max e orientation="vertical".
Use o Slider quando a posição aproximada é mais útil que a precisão exata - volume, brilho, filtros de preço. Para valores exatos use um Input numérico. Para escolhas discretas, prefira RadioGroup ou Select. Sempre mostre o valor atual ao lado do slider; sliders silenciosos confundem os usuários.
Preview
'use client';import { Slider } from '@gremorie/rx-forms';export function SliderPreview() { return ( <div className="max-w-sm"> <Slider defaultValue={[40]} max={100} step={1} /> </div> );}Anatomia
Slider Root; wraps Radix Slider.Root
├─ Track track background
│ └─ Range filled portion of the track
└─ Thumb one draggable handle per valueInstalação
bash npx gremorie@latest add rx-slider bash pnpm dlx gremorie@latest add rx-slider bash yarn dlx gremorie@latest add rx-slider bash bunx --bun gremorie@latest add rx-slider Uso
import { Slider } from "@gremorie/rx-forms";
export function Example() {
return <Slider defaultValue={[40]} max={100} step={1} />;
}A edição Angular deste componente hoje é distribuída a partir do source (veja o side-by-side no workbench); sua entrada no registry vem a seguir.
API
<Slider>
| Prop | Type | Default | Description |
|---|---|---|---|
value | number[] | - | Valor(es) controlado(s). Um número para thumb único; dois para range. |
defaultValue | number[] | [min, max] | Valor(es) inicial(is) não controlado(s). |
onValueChange | (value: number[]) => void | - | Dispara a cada passo do arrasto. |
onValueCommit | (value: number[]) => void | - | Dispara quando o usuário solta o thumb (útil para commits de rede). |
min | number | 0 | Valor mínimo. |
max | number | 100 | Valor máximo. |
step | number | 1 | Incremento entre valores permitidos. |
orientation | "horizontal" | "vertical" | "horizontal" | Sliders verticais usam min-h-44 por default para terem algo por onde arrastar. |
disabled | boolean | false | Desabilita a interação. |
name | string | - | Nome do campo de formulário. |
thumbAriaLabel | string | string[] | - | Extensão Gremorie (não no default do shadcn). Nome acessível para cada thumb. Passe um array para sliders de range, ex.: ["Minimum price", "Maximum price"]. Obrigatório para WCAG 4.1.2 quando o slider não tem um <Label> adjacente. |
aria-label | string | - | Serve de fallback para os labels de thumb quando thumbAriaLabel não está definido. |
Encaminha para SliderPrimitive.Root. Renderiza SliderPrimitive.Track, SliderPrimitive.Range e um SliderPrimitive.Thumb por valor.
thumbAriaLabel é uma adição do Gremorie ao Slider padrão do shadcn. Sem
ele, sliders de range anunciam dois thumbs sem nome e falham no WCAG 4.1.2
(Name, Role, Value). Sempre defina-o para sliders de range / multi-thumb.
Composição
<Slider>é um primitivo folha que renderiza track + range + um thumb por valor.- Pareie com um
<Label>(associado viaaria-labelledbyse não existir alvo dehtmlFor) ou definaaria-labeldiretamente na raiz. - Mostre o valor atual ao lado do slider - os usuários esperam uma leitura numérica para confirmar onde estão.
- Para uso vinculado a formulário, envolva com
<FormField>+<FormControl>e converta o valor de array de volta para um número (ou array) para o schema do seu formulário.
Variações
Thumb único
O padrão canônico. Mostre o valor ao lado.
function Volume() {
const [value, setValue] = React.useState([40]);
return (
<div className="grid gap-2">
<div className="flex items-center justify-between">
<Label>Volume</Label>
<span className="text-sm tabular-nums text-muted-foreground">
{value[0]}%
</span>
</div>
<Slider
value={value}
onValueChange={setValue}
max={100}
step={1}
aria-label="Volume"
/>
</div>
);
}Slider de range
Passe dois valores para defaultValue (ou value). Sempre defina thumbAriaLabel como um array para que cada thumb tenha um nome único.
'use client';import { Slider } from '@gremorie/rx-forms';export function SliderRangePreview() { return ( <div className="w-full max-w-sm"> <Slider defaultValue={[25, 75]} min={0} max={100} thumbAriaLabel={['Minimum price', 'Maximum price']} /> </div> );}Slider com steps
Use um step maior para snapar em valores discretos como quantidade, rating ou tamanho de fonte.
'use client';import { Slider } from '@gremorie/rx-forms';export function SliderStepsPreview() { return ( <div className="w-full max-w-sm"> <Slider defaultValue={[50]} min={0} max={100} step={10} thumbAriaLabel="Quantity" /> </div> );}Disabled
disabled remove os thumbs da ordem de tab e cai a opacidade para 50%.
'use client';import { Slider } from '@gremorie/rx-forms';export function SliderDisabledPreview() { return ( <div className="w-full max-w-sm"> <Slider defaultValue={[40]} min={0} max={100} disabled thumbAriaLabel="Volume" /> </div> );}Orientação vertical
Útil para controles de mídia, color pickers ou qualquer UI onde o espaço horizontal é precioso.
<div className="h-44">
<Slider defaultValue={[60]} orientation="vertical" aria-label="Brightness" />
</div>Acessibilidade
- ARIA: cada thumb é um
role="slider"comaria-valuemin,aria-valuemax,aria-valuenowearia-orientationdefinidos pelo Radix. - Teclado:
ArrowLeft/ArrowDowndecrementam porstep.ArrowRight/ArrowUpincrementam porstep.PageDown/PageUpmudam por incrementos maiores (tipicamente 10x step).Homepula paramin;Endpula paramax.
- Multi-thumb: cada thumb é focável independentemente; o Radix impede os thumbs de se cruzarem.
thumbAriaLabel: defina-o para qualquer slider de range / multi-thumb para que cada thumb anuncie um nome específico. Sem ele, os leitores de tela caem para oaria-labelda raiz, e depois para um genérico "Slider thumb 1".- Disabled:
data-disabledremove os thumbs da ordem de tab e cai a opacidade para 50%. - Sempre mostre o valor: exiba visualmente o valor atual para que todos os usuários (não só os de leitor de tela) recebam o mesmo feedback.