Progress
Uma barra ou anel que mostra o quanto uma tarefa avançou, suaviza entre as atualizações e desliza enquanto o total é desconhecido.
pnpm dlx shadcn@latest add https://hextaui.com/r/progress.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/progress.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
<Progress /> desenha sua própria trilha e indicador depois dos filhos, então um rótulo e um valor ficam em uma linha acima da barra. Cada atualização suaviza o preenchimento a partir de onde está, então atualizações rápidas parecem um único movimento fluido em vez de degraus.
Tamanhos
xs, sm, default e lg mudam a espessura da barra. xs é a linha fina que o Attachment desenha na borda inferior.
Status
variant colore apenas o preenchimento ou o anel, então a trilha, o rótulo e o valor permanecem neutros.
Indeterminado
Passe value={null} enquanto o total é desconhecido. Um segmento desliza pela trilha e, quando chega um número, o preenchimento cresce a partir do início.
Círculo
<ProgressCircle /> desenha o mesmo valor como um anel, começando no topo. Os filhos ficam no meio, o que combina com <ProgressValue /> em lg e xl.
Círculo indeterminado
Um arco gira em volta do anel até chegar um valor.
Intervalo e formato personalizados
Defina min e max para qualquer intervalo, format para o número e um filho em função em <ProgressValue /> para o texto. Dê aos leitores de tela as mesmas palavras com getAriaValueText.
Valor animado
Renderize <NumberFlow /> dentro de <ProgressValue /> para que só os dígitos que mudam girem, em sincronia com o preenchimento.
Rótulos longos
Nomes longos quebram em suas próprias linhas e o valor fica no final. Os anéis funcionam como status compacto ao lado de cada linha.
Sem rótulo visível
Dê nome à barra com aria-label quando o contexto já diz o que está carregando.
Da direita para a esquerda
O preenchimento e o deslizamento indeterminado começam pela direita. Passe locale para formatar o valor com os dígitos do leitor.
- A raiz é uma
progressbarcomaria-valuenow,aria-valuemin,aria-valuemaxe umaria-valuetextformatado. Enquanto indeterminada, não tem valor atual. <ProgressLabel />dá nome à barra. Sem um, passearia-label.<ProgressValue />fica oculto dos leitores de tela, já que a progressbar já anuncia o valor.- Com movimento reduzido, o preenchimento salta para cada novo valor, e a barra e o anel indeterminados pulsam no lugar em vez de se mover.
- Os valores são formatados em
en-USa menos que você passelocale, para o servidor e o navegador renderizarem o mesmo texto.
Construído sobre o progress do Base UI. Cada parte aceita as props da primitiva que envolve.
| Prop | Tipo | Padrão |
|---|---|---|
valuenull torna a barra indeterminada. | number | null | – |
min | number | 0 |
max | number | 100 |
size | "xs" | "sm" | "default" | "lg" | "default" |
variant | "default" | "success" | "warning" | "destructive" | "default" |
formatFormata o valor. Sem isso, o valor aparece como porcentagem. | Intl.NumberFormatOptions | – |
locale | Intl.LocalesArgument | "en-US" |
getAriaValueText | (formattedValue: string, value: number | null) => string | – |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="progress" | A raiz. |
data-size | O tamanho: xs, sm, default ou lg. |
data-variant | A variante de status. |
data-progressing | Presente enquanto o valor está abaixo de max. |
data-complete | Presente quando o valor alcança max. |
data-indeterminate | Presente quando o valor é null ou não é um número finito. |
Dá nome à progressbar. Renderiza um <span> e recebe os mesmos atributos de estado que a raiz.
| Prop | Tipo | Padrão |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descrição |
|---|---|
data-slot="progress-label" | O rótulo. |
| Prop | Tipo | Padrão |
|---|---|---|
childrenTexto personalizado. Sem ele, mostra o valor formatado, ou nada enquanto indeterminado. | (formattedValue: string | null, value: number | null) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <span> |
| Atributo | Descrição |
|---|---|
data-slot="progress-value" | O valor. |
Renderizado por <Progress /> e dimensionado por seu size. Exportado para composições personalizadas.
| Atributo | Descrição |
|---|---|
data-slot="progress-track" | A trilha. |
--progress-dir | 1, ou -1 da direita para a esquerda, para o deslizamento indeterminado seguir a direção de leitura. |
O preenchimento. Sua largura é definida inline a partir do valor e suaviza entre atualizações.
| Atributo | Descrição |
|---|---|
data-slot="progress-indicator" | O preenchimento. |
| Prop | Tipo | Padrão |
|---|---|---|
valuenull gira um arco. | number | null | – |
min | number | 0 |
max | number | 100 |
size | "sm" | "default" | "lg" | "xl" | "default" |
variant | "default" | "success" | "warning" | "destructive" | "default" |
locale | Intl.LocalesArgument | "en-US" |
childrenExibido no meio do anel. | ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| Atributo | Descrição |
|---|---|
data-slot="progress-circle" | A raiz. |
data-size | O tamanho: sm, default, lg ou xl. |
data-variant | A variante de status. |
data-progressing | Presente enquanto o valor está abaixo de max. |
data-complete | Presente quando o valor alcança max. |
data-indeterminate | Presente quando o valor é null ou não é um número finito. |
--progress-circle-size | A largura e a altura do anel. |
--progress-stroke | A largura do traço do anel. |
- AlertMensagens inline para status e feedback, com uma superfície neutra, um ícone colorido e um botão de dispensar que recolhe suavemente.
- EmptyUm espaço reservado para telas que ainda não têm nada a mostrar, com ícone, mensagem e a próxima ação.
- SkeletonPlaceholders que esperam 150ms antes de aparecer, assumem o tamanho exato do conteúdo que envolvem e o fazem surgir com fade sem mover nada.
- SpinnerUm indicador de carregamento com tracinhos no estilo Apple ou um anel que "respira", que pode esperar antes de aparecer e permanecer o suficiente para não piscar.
- ToastMensagens breves que se empilham com ordem, expandem no hover, saem com deslize e transformam um estado de carregamento em sucesso ou erro no próprio lugar.
- AttachmentCards de arquivo e imagem para uploads, com progresso, estados, ações, um gatilho no card inteiro e nomes que mantêm a extensão.