Slider
Barra deslizante para escolher um valor numérico ou um intervalo dentro de uma faixa.
'use client';
import { Slider } from '@/components/ui/slider';
export default function SliderDemo() {
return (
<Slider
label="Raio de entrega"
showOutput
defaultValue={5}
minValue={1}
maxValue={20}
formatOptions={{ style: 'unit', unit: 'kilometer' }}
className="max-w-sm"
/>
);
}Instalação
npx shadcn@latest add @lenstech/sliderUso
import { Slider } from "@/components/ui/slider"<Slider label="Raio de entrega" showOutput defaultValue={5} minValue={1} maxValue={20} />Número ou array
Passe um número em defaultValue/value para um valor único, ou um array ([50, 250]) para um intervalo com
dois polegares. onChange recebe o mesmo formato (número ou array), não o evento. Use onChangeEnd para
reagir só quando o usuário soltar.
Exemplos
Intervalo
Em intervalos, dê um nome a cada polegar com thumbLabels (lido pelos leitores de tela).
'use client';
import { Slider } from '@/components/ui/slider';
export default function SliderRange() {
return (
<Slider
label="Faixa de preço"
showOutput
defaultValue={[50, 250]}
minValue={0}
maxValue={500}
step={10}
thumbLabels={['Preço mínimo', 'Preço máximo']}
formatOptions={{ style: 'currency', currency: 'BRL', maximumFractionDigits: 0 }}
className="max-w-sm"
/>
);
}Formatação
formatOptions usa Intl.NumberFormat: moeda, porcentagem ou unidades (kilometer, minute, gigabyte…),
no idioma da página.
'use client';
import { Slider } from '@/components/ui/slider';
export default function SliderFormat() {
return (
<div className="flex w-full max-w-sm flex-col gap-8">
<Slider
label="Desconto à vista"
showOutput
defaultValue={0.15}
minValue={0}
maxValue={0.5}
step={0.05}
formatOptions={{ style: 'percent' }}
/>
<Slider
label="Duração da consulta"
showOutput
defaultValue={45}
minValue={15}
maxValue={120}
step={15}
formatOptions={{ style: 'unit', unit: 'minute' }}
/>
</div>
);
}Controlado
6x de R$ 600,00 sem juros
'use client';
import { useState } from 'react';
import { Slider } from '@/components/ui/slider';
const brl = new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' });
export default function SliderControlled() {
const [parcelas, setParcelas] = useState(6);
const total = 3600;
return (
<div className="flex w-full max-w-sm flex-col gap-3">
<Slider label="Parcelas" showOutput minValue={1} maxValue={12} value={parcelas} onChange={setParcelas} />
<p className="text-sm text-muted-foreground">
{parcelas}x de <span className="font-medium text-foreground">{brl.format(total / parcelas)}</span> sem juros
</p>
</div>
);
}Vertical
'use client';
import { Slider } from '@/components/ui/slider';
export default function SliderVertical() {
return <Slider label="Volume" orientation="vertical" showOutput defaultValue={60} />;
}Desabilitado
'use client';
import { Slider } from '@/components/ui/slider';
export default function SliderDisabled() {
return (
<Slider label="Armazenamento" showOutput defaultValue={40} isDisabled formatOptions={{ style: 'unit', unit: 'gigabyte' }} className="max-w-sm" />
);
}Quando usar
- Use para valores aproximados em uma faixa: preço, distância, duração.
- Não use quando o valor precisa ser exato (CPF, quantidade, preço de venda) — use
NumberField. - Não use para poucas opções nomeadas (pequeno/médio/grande) — use
Radio Group.
API
Slider
Aceita todas as props do Slider do React Aria, mais:
Prop
Type
SliderThumb
Polegar arrastável, exportado para composição manual. Aceita as props do SliderThumb do React Aria.