vaiperui

componentes / slider

Slider

Escolha um número ou um intervalo arrastando o botão ou usando o teclado.

Como usar

O valor é sempre um array, um número por botão: `[40]` para um valor, `[20, 80]` para um intervalo com a trilha preenchida entre os botões. O Slider não exibe o número escolhido, então mostre-o ao lado do controle. Dê nome com `aria-label` (obrigatório) e, no intervalo, a cada botão com `thumbLabels`.

preview
Volume: 40%
Preço: $200 – $800
Slider.tsx
import { Slider } from "vaiperui";
const [volume, setVolume] = useState([40]);
const [price, setPrice] = useState([200, 800]);
<p>Volume: {volume[0]}%</p>
<Slider aria-label="Volume" value={volume} onValueChange={setVolume} />
<Slider
aria-label="Preço"
thumbLabels={["Preço mínimo", "Preço máximo"]}
value={price}
onValueChange={setPrice}
min={0}
max={1000}
step={10}
/>

Cores

preview
primary
success
warning
danger
cores.tsx
<Slider aria-label="primary" variantColor="primary" defaultValue={[50]} />
<Slider aria-label="success" variantColor="success" defaultValue={[50]} />
<Slider aria-label="warning" variantColor="warning" defaultValue={[50]} />
<Slider aria-label="danger" variantColor="danger" defaultValue={[50]} />

Tamanhos

preview
sm
md
lg
tamanhos.tsx
<Slider aria-label="sm" size="sm" defaultValue={[50]} />
<Slider aria-label="md" size="md" defaultValue={[50]} />
<Slider aria-label="lg" size="lg" defaultValue={[50]} />

Intervalo

Dois valores dão dois botões, com a trilha preenchida entre eles. `minStepsBetweenThumbs` mantém uma distância mínima.

preview
[20, 80]
minStepsBetweenThumbs 10
intervalo.tsx
<Slider aria-label="..." defaultValue={[20, 80]} />
<Slider aria-label="..." defaultValue={[30, 70]} minStepsBetweenThumbs={10} />

Passos

preview
step 25
passos.tsx
<Slider aria-label="..." step={25} defaultValue={[50]} />

Desabilitado

preview
desabilitado
estados.tsx
<Slider aria-label="..." defaultValue={[30]} disabled />

Cor personalizada

preview
Laranja
cor-personalizada.tsx
<Slider aria-label="..." customColor="#ff6600" defaultValue={[40]} />

Props

PropValoresPadrãoDescrição
value / defaultValuenumber[][min]Valores, controlados ou iniciais: um número por botão
onValueChange(value: number[]) => voidnenhumChamado enquanto o botão se move
onValueCommit(value: number[]) => voidnenhumChamado quando o botão é solto ou uma tecla termina. Use para buscar dados só no final
min / maxnumber0 / 100Limites do intervalo
stepnumber1Passo entre os valores
minStepsBetweenThumbsnumber0No intervalo, a distância mínima entre os botões, em passos
disabledbooleanfalseBloqueia o uso
namestringnenhumNome do campo no formulário; cada botão envia seu valor com ele
aria-labelstringobrigatórioNome acessível. Com vários botões, um número é acrescentado
thumbLabelsstring[]nenhumNome acessível de cada botão, no lugar do aria-label numerado
variantColorprimary | success | warning | dangerprimaryCor do estado marcado e do anel de foco
customColorstring | { light, dark }nenhumQualquer cor CSS (ou um par por tema). Substitui o variantColor
sizesm | md | lgmdTamanho do controle e do texto
animationnone | smooth | fast | bouncesmoothTransição ao alternar

Acessibilidade

  • Cada thumb é um `<div role="slider">` (não um input nativo) com `aria-valuemin`, `aria-valuemax`, `aria-valuenow` e `aria-orientation="horizontal"`.
  • `aria-label` é obrigatório. Com vários thumbs um número é acrescentado ("Preço 1", "Preço 2"), ou use `thumbLabels` para nomes próprios.
  • Cada thumb é uma parada de Tab (`tabIndex=0`); um thumb nunca cruza o vizinho, e `minStepsBetweenThumbs` mantém uma distância entre eles.
  • Com `disabled`, os thumbs recebem `aria-disabled="true"` e `tabIndex=-1`, e o controle ignora ponteiro e teclado.
  • Clicar na trilha foca o thumb mais próximo; `name` adiciona um input hidden por thumb para envio em formulários.

Teclado

TeclaAção
Arrow Right / UpAumentam um `step`.
Arrow Left / DownDiminuem um `step`.
Page Up / Page DownMudam 10 steps.
Home / EndVão para `min` / `max` (limitado pelos thumbs vizinhos).

Tenha em mente

  • `aria-valuetext` não é definido, então leitores de tela anunciam o número bruto; se precisar de unidade, ponha no `aria-label`.
  • Arrastar é só por ponteiro; usuários de teclado dependem das teclas acima. Não há suporte a `aria-labelledby`, apenas `aria-label`.