Slider
Escolha um valor ou um intervalo arrastando, tocando na trilha ou usando as teclas, com saltos que deslizam e um balão de valor opcional.
pnpm dlx shadcn@latest add https://hextaui.com/r/slider.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @base-ui/react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/slider.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
<Slider /> desenha um thumb por valor, então um número ou um array de um item cria um slider simples e dois itens criam um intervalo. Filhos como <SliderLabel /> e <SliderValue /> ficam em uma linha acima da trilha.
Enquanto você arrasta, o thumb segue o ponteiro exatamente. Quando o valor salta, por um toque na trilha, uma tecla ou um novo valor controlado, o thumb e o preenchimento deslizam até lá em 180ms em vez de se teletransportar.
Tamanhos
sm, default e lg escalam o thumb e a trilha juntos.
Intervalo
Passe dois valores para um intervalo. Dê nome a cada thumb com getAriaLabel e mantenha-os afastados com minStepsBetweenValues. Com draggableRange, arraste em qualquer ponto entre os thumbs para mover os dois de uma vez; um toque ali ainda move o thumb mais próximo.
Balão de valor
showValue mostra o valor formatado acima do thumb enquanto é arrastado ou tem foco do teclado. Use no lugar de uma linha de rótulo, já que o balão sobe para o espaço acima da trilha.
Passos e formato
step ajusta o valor, largeStep define o salto de Page Up e Shift + seta, e format formata todo número que o slider mostra ou anuncia.
Controlado
onValueChange dispara a cada movimento e onValueCommitted uma vez ao soltar, que é o momento de salvar. Definir o valor de fora também desliza.
Vertical
Com orientation="vertical" o slider preenche a altura do pai, e Up aumenta o valor.
Com ícones
Coloque ícones ao lado do slider em uma linha flex. O slider ocupa a largura restante.
Desabilitado
O slider inteiro escurece e ignora a entrada de ponteiro e de teclado.
Rótulos longos
Rótulos longos quebram linha, e o valor fica no final.
Da direita para a esquerda
Dentro de um pai da direita para a esquerda, o preenchimento começa pela direita e as setas o acompanham. Passe locale para os dígitos do leitor.
| Tecla | Ação |
|---|---|
| Tab | Move o foco para o próximo thumb. |
| →↑ | Aumenta o valor em um passo. → diminui da direita para a esquerda. |
| ←↓ | Diminui o valor em um passo. ← aumenta da direita para a esquerda. |
| Shift + ArrowPage UpPage Down | Move por largeStep. |
| Home | Define o mínimo, ou o valor do thumb anterior em um intervalo. |
| End | Define o máximo, ou o valor do próximo thumb em um intervalo. |
- Cada thumb contém um
input type="range"nativo, então é umslidercom seu próprio valor, min e max. <SliderLabel />dá nome a cada thumb. Sem um, oaria-labelem<Slider />é passado aos thumbs, não ao wrapper, para o slider nunca ficar sem nome. Em um intervalo, usegetAriaLabelpara distinguir os thumbs.<SliderValue />e o balão de valor não são anunciados a cada mudança; o thumb já informa seu valor.- Pressionar um thumb não mostra anel de foco; as setas mostram. Com movimento reduzido, o thumb salta em vez de deslizar.
- Em telas touch, a área de toque cresce para pelo menos 44px sem alterar o layout.
Construído sobre o slider do Base UI. Cada parte aceita as props da primitiva que envolve.
| Prop | Tipo | Padrão |
|---|---|---|
valueO valor controlado. Um thumb por item. | number | number[] | – |
defaultValue | number | number[] | – |
onValueChangeDispara a cada mudança durante o arrasto. | (value, eventDetails) => void | – |
onValueCommittedDispara uma vez quando uma mudança termina. | (value, eventDetails) => void | – |
min | number | 0 |
max | number | 100 |
step | number | 1 |
largeStep | number | 10 |
minStepsBetweenValues | number | 0 |
size | "sm" | "default" | "lg" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
draggableRangeEm um intervalo, arrastar entre os thumbs os move juntos, mantendo a distância. | boolean | false |
showValueMostra o valor acima do thumb durante o arrasto ou com foco do teclado. | boolean | false |
thumbAlignmentedge mantém o thumb dentro da trilha em min e max. | "edge" | "center" | "edge-client-only" | "edge" |
thumbCollisionBehavior | "push" | "swap" | "none" | "push" |
format | Intl.NumberFormatOptions | – |
locale | Intl.LocalesArgument | "en-US" |
aria-labelDá nome aos thumbs. | string | – |
getAriaLabelDá nome a cada thumb de um intervalo. | (index: number) => string | – |
getAriaValueText | (formattedValue: string, value: number, index: number) => string | – |
name | string | – |
disabled | boolean | false |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="slider" | A raiz. |
data-size | sm, default ou lg. |
data-jump | Presente por 220ms enquanto o thumb desliza para um novo valor. |
data-range-dragging | Presente enquanto o intervalo inteiro está sendo arrastado. |
data-orientation | horizontal ou vertical. |
data-dragging | Presente enquanto um ponteiro está pressionado. |
data-disabled | Presente quando desabilitado. |
data-invalid | Presente quando inválido dentro de um Field. |
--slider-thumb | O diâmetro do thumb, definido por size. |
--slider-track | A espessura da trilha, definida por size. |
data-slot="slider-control" | A área pressionável em volta da trilha. |
data-slot="slider-track" | A trilha. |
data-slot="slider-range" | O preenchimento entre o início, ou o primeiro thumb, e o último thumb. |
data-slot="slider-thumb" | Cada thumb. data-index informa sua posição. |
data-active | No thumb que tem foco ou está sendo arrastado. |
data-slot="slider-thumb-value" | O balão de valor de showValue. |
Dá nome aos thumbs e cresce para preencher a linha. Renderiza um <div>.
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="slider-label" | O rótulo. |
Mostra os valores formatados, unidos por um travessão en em um intervalo. Renderiza um <output>.
| Prop | Tipo | Padrão |
|---|---|---|
childrenTexto personalizado. | (formattedValues: string[], values: number[]) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <output> |
| Atributo | Descrição |
|---|---|
data-slot="slider-value" | O valor. |
data-orientation | horizontal ou vertical. |
data-dragging | Presente enquanto um ponteiro está pressionado. |
data-disabled | Presente quando desabilitado. |
data-invalid | Presente quando inválido dentro de um Field. |
- CalendarUma grade de datas para seleção única, de intervalo e múltipla, com meses deslizantes, prévias de intervalo e dias com tamanho adequado ao toque.
- CheckboxUma caixa de seleção cujo check é desenhado na tela, com pais indeterminados, grupos e rótulos que compartilham seu hover.
- ComboboxUm select filtrável com chips, grupos e resultados assíncronos, em um popup que se redimensiona conforme você digita.
- Date pickerUm botão que abre um calendário em um popover, ou em um bottom sheet no celular, para datas únicas e intervalos.
- FieldRótulos, descrições e erros ligados ao seu controle, com estados de validação e layouts para formulários.
- InputUm campo de texto com três tamanhos, estados inválido e somente leitura, estilo de validação nativa e fonte de 16px no toque para que os celulares nunca façam zoom.
Usado em blocos
Blocos que se baseiam em Slider.
- AppearanceA seção Aparência das configurações de um produto de IA: tema, cor de destaque, tom do plano de fundo, densidade, fonte do chat, tamanhos de texto e opções de acessibilidade, tudo mantido como rascunho até que as pessoas salvem.
- BillingPlano e uso para um produto de IA, no estilo de Cursor, Claude e Vercel. Um medidor de uso dividido por modelo que projeta o fim do ciclo e avisa antes de os créditos acabarem, um gráfico diário que você pode percorrer, um limite de gastos com alertas que você pode pré-visualizar no medidor, mudanças de plano com proporcional exato, um formulário de cartão com validação real e faturas que baixam como PDF.
- ProfileA seção Perfil das configurações de um produto de IA. Recorte uma foto em um círculo, escolha um nome de usuário que é verificado enquanto você digita, confirme um novo e-mail com um código de 6 dígitos, adicione links que reconhecem o site e veja um card ao vivo de como os outros veem você.
- SettingsConfigurações para um produto de IA, organizadas como no Cursor e no Claude. Uma barra lateral preenchida com busca, grupos e links externos, cards de linhas com seletores discretos e opções aninhadas, uma ilha de salvar escura que só sobe quando algo muda, ⌘S para salvar, erros de campo vindos das suas verificações ou do seu servidor e estados de carregamento com o formato do conteúdo.