Slider
Seletor de valor numérico único ou de faixa dentro de um intervalo, com suporte a orientação vertical, marcações e formulários nativos.
O mk-slider reimplementa a interação de um range slider do zero — sem <input type="range"> por baixo — como um controle form-associated que suporta valor único ou faixa de dois thumbs, orientação horizontal ou vertical, marcações de passo opcionais, tooltip de valor durante a interação, e botões de incremento/decremento. É a base recomendada para filtros de faixa (preço, distância), ajustes de configuração (volume, brilho) e qualquer contexto que hoje usaria um <input type="range"> cru.
Quando usar
Use quando:- O usuário precisa ajustar um valor numérico dentro de um intervalo conhecido de forma direta e visual.
- É necessário selecionar uma faixa de valores (ex.: preço mínimo e máximo) com dois limites independentes.
- O ajuste se beneficia de feedback contínuo em tempo real (arraste) e de um valor confirmado ao soltar.
- O usuário precisa digitar um valor exato com frequência — use
mk-input-number. - A escolha é entre poucas opções discretas sem relação de intervalo — use
mk-selectoumk-radio.
Padrão
import { MkSlider } from '@db1/makuco-ui-react';
<MkSlider label="Volume" value={40} /><mk-slider label="Volume" [value]="40"></mk-slider>Faixa (dois thumbs)
Quando value recebe um array de dois números, o componente entra em modo faixa: dois thumbs independentes, um para o valor mínimo e outro para o máximo. O thumb inferior nunca ultrapassa o superior, e vice-versa.
<MkSlider label="Faixa de preço" value={[20, 80]} /><mk-slider label="Faixa de preço" [value]="[20, 80]"></mk-slider>Orientação vertical
Em orientation="vertical", o consumidor deve definir a altura do host via CSS — diretamente ou pela custom property --mk-slider-block-size. Sem isso, o slider colapsa para altura zero.
<div style={{ blockSize: '200px' }}>
<MkSlider
label="Volume"
orientation="vertical"
value={40}
style={{ '--mk-slider-block-size': '200px' }}
/>
</div><div style="block-size: 200px">
<mk-slider
label="Volume"
orientation="vertical"
[value]="40"
style="--mk-slider-block-size: 200px"
></mk-slider>
</div>Marcações
marks exibe uma marcação em cada múltiplo de step; markLabels adiciona o valor numérico sob cada marcação (sem efeito se marks for false).
<MkSlider label="Nível" min={0} max={50} step={10} marks markLabels value={20} /><mk-slider
label="Nível"
[min]="0"
[max]="50"
[step]="10"
marks
mark-labels
[value]="20"
></mk-slider>Ícones de passo
icons exibe botões de decremento/incremento que ajustam em step o thumb ativo (o último focado, ou o inferior quando nenhum foi focado ainda).
<MkSlider label="Zoom" icons value={40} /><mk-slider label="Zoom" icons [value]="40"></mk-slider>Desabilitado
Em disabled, o tooltip de valor permanece sempre visível — é a única forma de comunicar o valor de um slider que não pode ser interagido.
<MkSlider label="Volume" disabled value={40} /><mk-slider label="Volume" [disabled]="true" [value]="40"></mk-slider>Formulários
O mk-slider é form-associated: em modo valor único, envia o número sob name; em modo faixa, envia os dois valores sob o mesmo name (equivalente a múltiplos campos com o mesmo nome).
<form onSubmit={handleSubmit}>
<MkSlider label="Faixa de preço" name="preco" value={[20, 80]} />
<MkButton type="submit">Enviar</MkButton>
</form><form (ngSubmit)="handleSubmit()">
<mk-slider label="Faixa de preço" name="preco" [value]="[20, 80]"></mk-slider>
<mk-button type="submit">Enviar</mk-button>
</form>Exemplo completo
Um único mk-slider combinando todas as props do componente — faixa de dois thumbs, cor success, tamanho sm, marcações com rótulos, ícones de passo, rótulos de limite, tooltip de valor e integração com formulário via name.
import { MkSlider } from '@db1/makuco-ui-react';
<MkSlider
label="Faixa de preço completa"
name="faixa-completa"
value={[30, 70]}
min={0}
max={100}
step={5}
color="success"
size="sm"
orientation="horizontal"
marks
markLabels
bounds
valueLabel
icons
disabled={false}
/><mk-slider
label="Faixa de preço completa"
name="faixa-completa"
[value]="[30, 70]"
[min]="0"
[max]="100"
[step]="5"
color="success"
size="sm"
orientation="horizontal"
marks
mark-labels
bounds
value-label
icons
[disabled]="false"
></mk-slider>Props
| Prop | Tipo | Padrão | Descrição |
|---|---|---|---|
value | number | [number, number] | min | Valor controlado. Um array de dois elementos ativa o modo faixa. |
min | number | 0 | Limite inferior do intervalo. |
max | number | 100 | Limite superior do intervalo. |
step | number | 1 | Incremento aplicado por teclado, pelos ícones de passo e usado para posicionar marks. |
color | 'brand' | 'success' | 'warning' | 'error' | 'brand' | Cor semântica do fill, do(s) thumb(s) e do focus-ring. |
size | 'md' | 'sm' | 'md' | Espessura da trilha e diâmetro do thumb. |
orientation | 'horizontal' | 'vertical' | 'horizontal' | Eixo do slider. Em vertical, defina a altura do host via CSS ou --mk-slider-block-size. |
marks | boolean | false | Exibe marcações visuais em cada múltiplo de step. |
markLabels | boolean | false | Exibe o valor numérico sob/ao lado de cada marcação. Sem efeito se marks for false. |
bounds | boolean | true | Exibe os rótulos de min/max nas extremidades da trilha. |
valueLabel | boolean | true | Habilita o tooltip com o valor atual durante hover/foco/arraste (sempre visível quando disabled). |
icons | boolean | false | Exibe botões de decremento/incremento nas extremidades. |
disabled | boolean | false | Desabilita toda interação (arraste, teclado, ícones). |
name | string | — | Nome do campo para submissão em <form>. |
label | string | — | Rótulo acessível; usado como aria-label quando não há aria-labelledby externo. |
Eventos
| Evento | Payload | Descrição |
|---|---|---|
mkInput | { value: number | [number, number] } | Emitido continuamente durante o arraste ou a cada tecla de ajuste — antes da confirmação. |
mkChange | { value: number | [number, number] } | Emitido ao soltar o thumb ou ao concluir um ajuste por teclado — valor confirmado. |
Acessibilidade
- Cada thumb é um elemento independente com
role="slider",aria-valuenow,aria-valuemin,aria-valuemax,aria-valuetextearia-orientation. - Em modo faixa, cada thumb expõe
aria-valuemin/aria-valuemaxrelativos ao thumb vizinho (nunca podem se cruzar) e umaria-labelque identifica a extremidade ("Valor mínimo" / "Valor máximo"). aria-disabled="true"é definido quandodisabled; o thumb sai da ordem de tabulação (tabindex="-1").- O tooltip de valor é puramente visual e leva
aria-hidden="true"— o valor já é anunciado viaaria-valuenow/aria-valuetextno próprio thumb. - O componente é form-associated via ElementInternals API.
| Tecla | Comportamento |
|---|---|
Tab | Move o foco para o próximo thumb (em modo faixa, cada thumb é uma parada independente). |
→ ↑ | Incrementa o thumb focado em step. |
← ↓ | Decrementa o thumb focado em step. |
Home | Move o thumb focado para min. |
End | Move o thumb focado para max. |
Page Up / Page Down | Incrementa/decrementa o thumb focado em step * 10. |